summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore8
-rw-r--r--.gitlab-ci.yml225
-rw-r--r--.gitmodules4
-rw-r--r--.mailmap10
-rw-r--r--.travis.yml28
-rw-r--r--AUTHORS59
-rw-r--r--CHANGELOG.md556
-rw-r--r--ChangeLog0
-rw-r--r--GNUmakefile25
-rw-r--r--Makefile.am31
-rw-r--r--NEWS285
-rw-r--r--README22
-rw-r--r--README.Windows.md31
-rwxr-xr-xautogen.sh2
-rwxr-xr-xbuild-aux/git-version-gen51
-rwxr-xr-xbuild-aux/gitlog-to-changelog191
-rwxr-xr-xbuild-aux/meson-dist37
-rw-r--r--build-aux/meson-win-wrapper.txt2
-rwxr-xr-xbuild-aux/meson/check-spice-common5
-rw-r--r--cfg.mk22
-rw-r--r--client/.gitignore13
-rw-r--r--client/Makefile.am249
-rw-r--r--client/application.cpp2685
-rw-r--r--client/application.h413
-rw-r--r--client/audio_channels.h107
-rw-r--r--client/audio_devices.h43
-rw-r--r--client/cache.hpp121
-rw-r--r--client/canvas.cpp186
-rw-r--r--client/canvas.h352
-rw-r--r--client/client_net_socket.cpp388
-rw-r--r--client/client_net_socket.h154
-rw-r--r--client/cmd_line_parser.cpp518
-rw-r--r--client/cmd_line_parser.h104
-rw-r--r--client/common.h92
-rw-r--r--client/controller.cpp448
-rw-r--r--client/controller.h119
-rw-r--r--client/cursor.cpp115
-rw-r--r--client/cursor.h72
-rw-r--r--client/cursor_channel.cpp670
-rw-r--r--client/cursor_channel.h93
-rw-r--r--client/debug.h92
-rw-r--r--client/display_channel.cpp1901
-rw-r--r--client/display_channel.h247
-rw-r--r--client/event_sources.h94
-rw-r--r--client/foreign_menu.cpp376
-rw-r--r--client/foreign_menu.h98
-rw-r--r--client/glz_decode_tmpl.c337
-rw-r--r--client/glz_decoded_image.h64
-rw-r--r--client/glz_decoder.cpp301
-rw-r--r--client/glz_decoder.h84
-rw-r--r--client/glz_decoder_config.h64
-rw-r--r--client/glz_decoder_window.cpp329
-rw-r--r--client/glz_decoder_window.h122
-rw-r--r--client/gui/Makefile.am20
-rw-r--r--client/gui/commonv2c.ttf.c2766
-rw-r--r--client/gui/commonwealth-10.font.c12
-rw-r--r--client/gui/dejavu_sans-10.font.c12
-rw-r--r--client/gui/dejavu_sans.ttf.c25487
-rw-r--r--client/gui/gui.cpp1418
-rw-r--r--client/gui/gui.h143
-rw-r--r--client/gui/resource_provider.cpp148
-rw-r--r--client/gui/resource_provider.h59
-rw-r--r--client/gui/softrenderer.cpp390
-rw-r--r--client/gui/softrenderer.h148
-rw-r--r--client/gui/softtexture.cpp139
-rw-r--r--client/gui/softtexture.h58
-rw-r--r--client/gui/taharez_look.imageset.c1238
-rw-r--r--client/gui/taharez_look.looknfeel.c15117
-rw-r--r--client/gui/taharez_look.scheme.c449
-rw-r--r--client/gui/taharez_look.tga.c16388
-rw-r--r--client/hot_keys.cpp147
-rw-r--r--client/hot_keys.h48
-rw-r--r--client/inputs_channel.cpp614
-rw-r--r--client/inputs_channel.h96
-rw-r--r--client/inputs_handler.h42
-rw-r--r--client/jpeg_decoder.cpp153
-rw-r--r--client/jpeg_decoder.h96
-rw-r--r--client/menu.cpp147
-rw-r--r--client/menu.h102
-rw-r--r--client/mjpeg_decoder.cpp277
-rw-r--r--client/mjpeg_decoder.h74
-rw-r--r--client/monitor.h57
-rw-r--r--client/pixels_source.h58
-rw-r--r--client/platform.h205
-rw-r--r--client/playback_channel.cpp364
-rw-r--r--client/process_loop.cpp406
-rw-r--r--client/process_loop.h244
-rw-r--r--client/read_write_mutex.h119
-rw-r--r--client/record_channel.cpp293
-rw-r--r--client/red_canvas_base.h26
-rw-r--r--client/red_channel.cpp887
-rw-r--r--client/red_channel.h353
-rw-r--r--client/red_client.cpp1410
-rw-r--r--client/red_client.h387
-rw-r--r--client/red_drawable.h122
-rw-r--r--client/red_gdi_canvas.cpp97
-rw-r--r--client/red_gdi_canvas.h53
-rw-r--r--client/red_gl_canvas.cpp123
-rw-r--r--client/red_gl_canvas.h66
-rw-r--r--client/red_key.h152
-rw-r--r--client/red_peer.cpp463
-rw-r--r--client/red_peer.h209
-rw-r--r--client/red_pixmap.h67
-rw-r--r--client/red_pixmap_gl.h49
-rw-r--r--client/red_pixmap_sw.h30
-rw-r--r--client/red_sw_canvas.cpp112
-rw-r--r--client/red_sw_canvas.h50
-rw-r--r--client/red_window.h200
-rw-r--r--client/screen.cpp944
-rw-r--r--client/screen.h211
-rw-r--r--client/screen_layer.cpp239
-rw-r--r--client/screen_layer.h87
-rw-r--r--client/shared_cache.hpp223
-rw-r--r--client/smartcard_channel.cpp553
-rw-r--r--client/smartcard_channel.h159
-rw-r--r--client/tests/.gitignore1
-rw-r--r--client/tests/controller_test/README.txt10
-rwxr-xr-xclient/tests/controller_test/build4
-rw-r--r--client/tests/controller_test/controller_test.cpp206
-rw-r--r--client/tests/controller_test/controller_test.sln20
-rw-r--r--client/tests/controller_test/controller_test.vcproj198
-rw-r--r--client/threads.cpp142
-rw-r--r--client/threads.h134
-rw-r--r--client/utils.h156
-rw-r--r--client/windows/event_sources_p.cpp211
-rw-r--r--client/windows/event_sources_p.h51
-rw-r--r--client/windows/generate.bat2
-rw-r--r--client/windows/generate1.bat2
-rw-r--r--client/windows/getopt.h56
-rw-r--r--client/windows/main.cpp110
-rw-r--r--client/windows/my_getopt.cpp281
-rw-r--r--client/windows/my_getopt.h72
-rw-r--r--client/windows/named_pipe.cpp232
-rw-r--r--client/windows/named_pipe.h94
-rw-r--r--client/windows/pixels_source.cpp110
-rw-r--r--client/windows/platform.cpp1213
-rw-r--r--client/windows/platform_utils.cpp150
-rw-r--r--client/windows/platform_utils.h100
-rw-r--r--client/windows/playback.cpp178
-rw-r--r--client/windows/playback.h54
-rw-r--r--client/windows/record.cpp195
-rw-r--r--client/windows/record.h57
-rw-r--r--client/windows/red_drawable.cpp153
-rw-r--r--client/windows/red_pixmap_gdi.cpp121
-rw-r--r--client/windows/red_pixmap_sw.cpp120
-rw-r--r--client/windows/red_window.cpp1106
-rw-r--r--client/windows/red_window_p.h71
-rw-r--r--client/windows/redc.rc137
-rw-r--r--client/windows/redc.sln26
-rw-r--r--client/windows/redc.vcproj1007
-rw-r--r--client/windows/resource.h18
-rw-r--r--client/windows/spice.icobin15086 -> 0 bytes
-rw-r--r--client/windows/spicec.exe.manifest10
-rw-r--r--client/windows/stdint.h393
-rw-r--r--client/windows/sticky_alt.bmpbin17550 -> 0 bytes
-rw-r--r--client/x11/.gitignore11
-rw-r--r--client/x11/atomic_count.h43
-rw-r--r--client/x11/event_sources_p.cpp229
-rw-r--r--client/x11/event_sources_p.h54
-rw-r--r--client/x11/images/alt_image.c735
-rw-r--r--client/x11/images/red_icon.c275
-rw-r--r--client/x11/main.cpp51
-rw-r--r--client/x11/named_pipe.cpp170
-rw-r--r--client/x11/named_pipe.h61
-rw-r--r--client/x11/pixels_source.cpp108
-rw-r--r--client/x11/pixels_source_p.h93
-rw-r--r--client/x11/platform.cpp3815
-rw-r--r--client/x11/platform_utils.cpp33
-rw-r--r--client/x11/platform_utils.h38
-rw-r--r--client/x11/playback.cpp221
-rw-r--r--client/x11/playback.h48
-rw-r--r--client/x11/record.cpp243
-rw-r--r--client/x11/record.h62
-rw-r--r--client/x11/red_drawable.cpp796
-rw-r--r--client/x11/red_pixmap.cpp44
-rw-r--r--client/x11/red_pixmap_gl.cpp314
-rw-r--r--client/x11/red_pixmap_sw.cpp93
-rw-r--r--client/x11/red_window.cpp2251
-rw-r--r--client/x11/red_window_p.h86
-rw-r--r--client/x11/res.cpp82
-rw-r--r--client/x11/x_icon.cpp175
-rw-r--r--client/x11/x_icon.h52
-rw-r--r--client/x11/x_platform.h56
-rw-r--r--client/zlib_decoder.cpp78
-rw-r--r--configure.ac546
-rw-r--r--docs/Makefile.am38
-rw-r--r--docs/Spice_for_newbies.odtbin40824 -> 0 bytes
-rw-r--r--docs/Spice_protocol.odtbin44052 -> 0 bytes
-rw-r--r--docs/Spice_style.odtbin19045 -> 0 bytes
-rw-r--r--docs/Vd_interfaces.odtbin21577 -> 0 bytes
-rw-r--r--docs/how_to_release.md39
-rw-r--r--docs/images/newbies/a_cmd_flow.pngbin0 -> 29215 bytes
-rw-r--r--docs/images/newbies/cli_bsc_stc.pngbin0 -> 79642 bytes
-rw-r--r--docs/images/newbies/g_cmd_flow.pngbin0 -> 36592 bytes
-rw-r--r--docs/images/newbies/g_sub.pngbin0 -> 41952 bytes
-rw-r--r--docs/images/newbies/srv_stc.pngbin0 -> 95891 bytes
-rw-r--r--docs/manual/Makefile.am3
-rw-r--r--docs/manual/images/spicec01.pngbin10244 -> 0 bytes
-rw-r--r--docs/manual/manual.txt412
-rw-r--r--docs/manual/meson.build18
-rw-r--r--docs/meson.build20
-rw-r--r--docs/spice_for_newbies.txt421
-rw-r--r--docs/spice_protocol.txt2730
-rw-r--r--docs/spice_style.txt465
-rw-r--r--docs/spice_threading_model.txt80
-rw-r--r--docs/vd_interfaces.txt643
-rw-r--r--doxygen.cfg2536
-rwxr-xr-xdoxygen.sh12
-rw-r--r--m4/ax_pthread.m4522
-rw-r--r--m4/ax_valgrind_check.m4235
-rw-r--r--m4/manywarnings.m442
-rw-r--r--m4/spice-compile-warnings.m490
-rw-r--r--maint.mk555
-rw-r--r--meson.build231
-rw-r--r--meson_options.txt53
-rw-r--r--server/.gitignore11
-rw-r--r--server/Makefile.am270
-rw-r--r--server/agent-msg-filter.c54
-rw-r--r--server/agent-msg-filter.h48
-rw-r--r--server/cache-item.h (renamed from client/red_types.h)30
-rw-r--r--server/cache-item.tmpl.cpp140
-rw-r--r--server/char-device.cpp965
-rw-r--r--server/char-device.h235
-rw-r--r--server/char_device.c980
-rw-r--r--server/char_device.h199
-rw-r--r--server/common-graphics-channel.cpp67
-rw-r--r--server/common-graphics-channel.h78
-rw-r--r--server/cursor-channel-client.cpp98
-rw-r--r--server/cursor-channel-client.h75
-rw-r--r--server/cursor-channel.cpp287
-rw-r--r--server/cursor-channel.h67
-rw-r--r--server/dcc-private.h74
-rw-r--r--server/dcc-send.cpp2405
-rw-r--r--server/dcc.cpp1215
-rw-r--r--server/dcc.h164
-rw-r--r--server/demarshallers.h26
-rw-r--r--server/dispatcher.c281
-rw-r--r--server/dispatcher.cpp325
-rw-r--r--server/dispatcher.h246
-rw-r--r--server/display-channel-private.h349
-rw-r--r--server/display-channel.cpp2522
-rw-r--r--server/display-channel.h153
-rw-r--r--server/display-limits.h (renamed from client/red_pixmap_gdi.h)24
-rw-r--r--server/event-loop.c426
-rw-r--r--server/glib-compat.h49
-rw-r--r--server/glz-encode-match.tmpl.c (renamed from server/glz_encode_match_tmpl.c)6
-rw-r--r--server/glz-encode.tmpl.c (renamed from server/glz_encode_tmpl.c)91
-rw-r--r--server/glz-encoder-dict.c (renamed from server/glz_encoder_dictionary.c)47
-rw-r--r--server/glz-encoder-dict.h (renamed from server/glz_encoder_dictionary.h)20
-rw-r--r--server/glz-encoder-priv.h (renamed from server/glz_encoder_dictionary_protected.h)29
-rw-r--r--server/glz-encoder.c (renamed from server/glz_encoder.c)45
-rw-r--r--server/glz-encoder.h (renamed from server/glz_encoder.h)38
-rw-r--r--server/glz_encoder_config.h61
-rw-r--r--server/gstreamer-encoder.c1732
-rw-r--r--server/image-cache.cpp216
-rw-r--r--server/image-cache.h67
-rw-r--r--server/image-encoders.cpp1392
-rw-r--r--server/image-encoders.h225
-rw-r--r--server/inputs-channel-client.cpp91
-rw-r--r--server/inputs-channel-client.h76
-rw-r--r--server/inputs-channel.cpp587
-rw-r--r--server/inputs-channel.h83
-rw-r--r--server/inputs_channel.c674
-rw-r--r--server/inputs_channel.h38
-rw-r--r--server/jpeg-encoder.c (renamed from server/jpeg_encoder.c)61
-rw-r--r--server/jpeg-encoder.h (renamed from server/jpeg_encoder.h)18
-rw-r--r--server/lz4-encoder.c122
-rw-r--r--server/lz4-encoder.h56
-rw-r--r--server/main-channel-client.cpp869
-rw-r--r--server/main-channel-client.h131
-rw-r--r--server/main-channel.cpp320
-rw-r--r--server/main-channel.h86
-rw-r--r--server/main-dispatcher.cpp204
-rw-r--r--server/main-dispatcher.h52
-rw-r--r--server/main_channel.c1366
-rw-r--r--server/main_channel.h98
-rw-r--r--server/main_dispatcher.c200
-rw-r--r--server/main_dispatcher.h19
-rw-r--r--server/memslot.c (renamed from server/red_memslots.c)115
-rw-r--r--server/memslot.h80
-rw-r--r--server/meson.build236
-rw-r--r--server/migration-protocol.h (renamed from server/migration_protocol.h)55
-rw-r--r--server/mjpeg-encoder.c (renamed from server/mjpeg_encoder.c)527
-rw-r--r--server/mjpeg_encoder.h114
-rw-r--r--server/net-utils.c194
-rw-r--r--server/net-utils.h (renamed from client/windows/atomic_count.h)33
-rw-r--r--server/pixmap-cache.cpp144
-rw-r--r--server/pixmap-cache.h76
-rw-r--r--server/pop-visibility.h (renamed from client/windows/pixels_source_p.h)16
-rw-r--r--server/push-visibility.h (renamed from client/x11/res.h)12
-rw-r--r--server/red-channel-capabilities.c44
-rw-r--r--server/red-channel-capabilities.h47
-rw-r--r--server/red-channel-client.cpp1668
-rw-r--r--server/red-channel-client.h220
-rw-r--r--server/red-channel.cpp587
-rw-r--r--server/red-channel.h207
-rw-r--r--server/red-client.cpp264
-rw-r--r--server/red-client.h96
-rw-r--r--server/red-common.h135
-rw-r--r--server/red-parse-qxl.cpp (renamed from server/red_parse_qxl.c)929
-rw-r--r--server/red-parse-qxl.h (renamed from server/red_parse_qxl.h)103
-rw-r--r--server/red-pipe-item.cpp (renamed from client/windows/red_pixmap.cpp)31
-rw-r--r--server/red-pipe-item.h83
-rw-r--r--server/red-qxl.cpp775
-rw-r--r--server/red-qxl.h66
-rw-r--r--server/red-record-qxl.cpp906
-rw-r--r--server/red-record-qxl.h52
-rw-r--r--server/red-replay-qxl.cpp1497
-rw-r--r--server/red-stream-device.cpp680
-rw-r--r--server/red-stream-device.h115
-rw-r--r--server/red-stream.cpp1219
-rw-r--r--server/red-stream.h114
-rw-r--r--server/red-worker.cpp1090
-rw-r--r--server/red-worker.h289
-rw-r--r--server/red_channel.c2435
-rw-r--r--server/red_channel.h631
-rw-r--r--server/red_client_cache.h139
-rw-r--r--server/red_client_shared_cache.h235
-rw-r--r--server/red_common.h68
-rw-r--r--server/red_dispatcher.c1197
-rw-r--r--server/red_dispatcher.h208
-rw-r--r--server/red_memslots.h72
-rw-r--r--server/red_time.h15
-rw-r--r--server/red_worker.c12077
-rw-r--r--server/red_worker.h152
-rw-r--r--server/reds-private.h212
-rw-r--r--server/reds.c3834
-rw-r--r--server/reds.cpp4516
-rw-r--r--server/reds.h166
-rw-r--r--server/reds_gl_canvas.c28
-rw-r--r--server/reds_gl_canvas.h27
-rw-r--r--server/reds_stream.c1060
-rw-r--r--server/reds_stream.h93
-rw-r--r--server/reds_sw_canvas.c28
-rw-r--r--server/reds_sw_canvas.h26
-rw-r--r--server/safe-list.hpp154
-rw-r--r--server/smartcard-channel-client.cpp308
-rw-r--r--server/smartcard-channel-client.h70
-rw-r--r--server/smartcard.c859
-rw-r--r--server/smartcard.cpp494
-rw-r--r--server/smartcard.h56
-rw-r--r--server/snd_worker.c1628
-rw-r--r--server/sound.cpp1309
-rw-r--r--server/sound.h (renamed from server/snd_worker.h)23
-rw-r--r--server/spice-audio.h100
-rw-r--r--server/spice-bitmap-utils.c310
-rw-r--r--server/spice-bitmap-utils.h97
-rw-r--r--server/spice-bitmap-utils.tmpl.c (renamed from server/red_bitmap_utils.h)57
-rw-r--r--server/spice-char.h92
-rw-r--r--server/spice-core.h111
-rw-r--r--server/spice-experimental.h40
-rw-r--r--server/spice-input.h95
-rw-r--r--server/spice-migration.h65
-rw-r--r--server/spice-qxl.h239
-rw-r--r--server/spice-replay.h42
-rw-r--r--server/spice-server-enums.c.tmpl40
-rw-r--r--server/spice-server-enums.h.tmpl16
-rw-r--r--server/spice-server.h177
-rw-r--r--server/spice-server.syms32
-rw-r--r--server/spice-version.h.in27
-rw-r--r--server/spice-wrapped.h (renamed from client/windows/win_platform.h)34
-rw-r--r--server/spice.h599
-rw-r--r--server/spice_bitmap_utils.c168
-rw-r--r--server/spice_bitmap_utils.h8
-rw-r--r--server/spice_image_cache.c135
-rw-r--r--server/spice_image_cache.h39
-rw-r--r--server/spice_server_utils.h23
-rw-r--r--server/spice_timer_queue.c268
-rw-r--r--server/spice_timer_queue.h43
-rw-r--r--server/spicevmc.c584
-rw-r--r--server/spicevmc.cpp681
-rw-r--r--server/stat-file.c238
-rw-r--r--server/stat-file.h45
-rw-r--r--server/stat.h189
-rw-r--r--server/stream-channel.cpp524
-rw-r--r--server/stream-channel.h98
-rw-r--r--server/sw-canvas.c (renamed from client/x11/resource.h)13
-rw-r--r--server/sys-socket.c285
-rw-r--r--server/sys-socket.h153
-rw-r--r--server/tests/.gitignore41
-rw-r--r--server/tests/Makefile.am210
-rw-r--r--server/tests/README20
-rwxr-xr-xserver/tests/autobahn-check-report18
-rw-r--r--server/tests/basic-event-loop.c126
-rw-r--r--server/tests/basic-event-loop.h (renamed from client/zlib_decoder.h)35
-rw-r--r--server/tests/basic_event_loop.c284
-rw-r--r--server/tests/basic_event_loop.h9
-rw-r--r--server/tests/fuzzingclient.json11
-rw-r--r--server/tests/meson.build112
-rw-r--r--server/tests/pki/ca-cert.pem20
-rw-r--r--server/tests/pki/dhparams.pem13
-rw-r--r--server/tests/pki/server-cert.pem18
-rw-r--r--server/tests/pki/server-key.pem27
-rwxr-xr-xserver/tests/regression-test.py (renamed from server/tests/regression_test.py)4
-rw-r--r--server/tests/replay.c487
-rw-r--r--server/tests/stat-test.c88
-rw-r--r--server/tests/test-agent-msg-filter.c149
-rw-r--r--server/tests/test-channel.cpp280
-rw-r--r--server/tests/test-codecs-parsing.c158
-rw-r--r--server/tests/test-dispatcher.cpp148
-rw-r--r--server/tests/test-display-base.cpp (renamed from server/tests/test_display_base.c)411
-rw-r--r--server/tests/test-display-base.h (renamed from server/tests/test_display_base.h)32
-rw-r--r--server/tests/test-display-no-ssl.c68
-rw-r--r--server/tests/test-display-resolution-changes.c83
-rw-r--r--server/tests/test-display-streaming.c (renamed from server/tests/test_display_streaming.c)41
-rw-r--r--server/tests/test-display-width-stride.c (renamed from server/tests/test_display_width_stride.c)54
-rw-r--r--server/tests/test-empty-success.c112
-rw-r--r--server/tests/test-fail-on-null-core-interface.c44
-rw-r--r--server/tests/test-glib-compat.h57
-rw-r--r--server/tests/test-gst.cpp1032
-rw-r--r--server/tests/test-leaks.c264
-rw-r--r--server/tests/test-listen.c365
-rw-r--r--server/tests/test-loop.c176
-rwxr-xr-xserver/tests/test-multiple.py (renamed from server/tests/test_multiple.py)2
-rw-r--r--server/tests/test-options.c56
-rw-r--r--server/tests/test-playback.c (renamed from server/tests/test_playback.c)66
-rw-r--r--server/tests/test-qxl-parsing.cpp322
-rw-r--r--server/tests/test-record.c123
-rw-r--r--server/tests/test-sasl.c665
-rw-r--r--server/tests/test-set-ticket.c (renamed from client/monitor.cpp)40
-rw-r--r--server/tests/test-smartcard.cpp397
-rw-r--r--server/tests/test-stat-file.c118
-rw-r--r--server/tests/test-stat.c (renamed from client/utils.cpp)46
-rw-r--r--server/tests/test-stream-device.cpp481
-rw-r--r--server/tests/test-stream.c156
-rw-r--r--server/tests/test-two-servers.c56
-rw-r--r--server/tests/test-vdagent.c172
-rwxr-xr-xserver/tests/test-video-encoders25
-rw-r--r--server/tests/test-websocket.c296
-rw-r--r--server/tests/test_display_no_ssl.c55
-rw-r--r--server/tests/test_display_resolution_changes.c69
-rw-r--r--server/tests/test_empty_success.c76
-rw-r--r--server/tests/test_fail_on_null_core_interface.c13
-rw-r--r--server/tests/test_just_sockets_no_ssl.c18
-rwxr-xr-xserver/tests/test_spice_version.sh42
-rw-r--r--server/tests/test_two_servers.c37
-rw-r--r--server/tests/test_util.h12
-rw-r--r--server/tests/test_vdagent.c58
-rw-r--r--server/tests/valgrind/glib.supp1100
-rw-r--r--server/tests/valgrind/spice.supp160
-rw-r--r--server/tests/vmc-emu.cpp124
-rw-r--r--server/tests/vmc-emu.h55
-rw-r--r--server/tests/win-alarm.c65
-rw-r--r--server/tests/win-alarm.h (renamed from client/icon.h)27
-rw-r--r--server/tree.cpp310
-rw-r--r--server/tree.h101
-rw-r--r--server/utils.c128
-rw-r--r--server/utils.h88
-rw-r--r--server/utils.hpp497
-rw-r--r--server/video-encoder.h222
-rw-r--r--server/video-stream.cpp992
-rw-r--r--server/video-stream.h144
-rw-r--r--server/websocket.c799
-rw-r--r--server/websocket.h57
-rw-r--r--server/zlib-encoder.c (renamed from server/zlib_encoder.c)15
-rw-r--r--server/zlib-encoder.h (renamed from server/zlib_encoder.h)15
m---------spice-common0
-rw-r--r--spice-server.pc.in3
m---------subprojects/spice-common0
-rwxr-xr-xtests/migrate.py218
-rw-r--r--tools/.gitignore1
-rw-r--r--tools/Makefile.am24
-rw-r--r--tools/meson.build6
-rw-r--r--tools/reds_stat.c104
464 files changed, 61913 insertions, 137989 deletions
diff --git a/.gitignore b/.gitignore
index 8e731623..965e2df7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
*~
+*.o
.*.sw?
*.tar.bz2
*.tar.gz
@@ -27,6 +28,13 @@ Makefile
Makefile.in
spice-server.pc
stamp-h1
+test-driver
INSTALL
.version
.tarball-version
+docs/manual/manual.chunked/
+docs/manual/manual.html
+docs/*.html
+.dirstamp
+.deps
+.libs
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 00000000..ee49506c
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,225 @@
+image: fedora:latest
+
+before_script:
+ - >
+ dnf install 'dnf-command(debuginfo-install)' git libtool make libasan orc-devel
+ python3 python3-six python3-pyparsing glib-networking
+ asciidoc bzip2 meson ninja-build file diffutils
+ glib2-devel pixman-devel alsa-lib-devel openssl-devel libjpeg-turbo-devel
+ libcacard-devel cyrus-sasl-devel lz4-devel opus-devel
+ gstreamer1-devel gstreamer1-plugins-base-devel
+ gcc-c++ autoconf-archive
+ -y
+ - &protocol >
+ git clone --depth=1 ${CI_REPOSITORY_URL/spice.git/spice-protocol.git} &&
+ meson setup --buildtype=release spice-protocol build-spice-protocol --prefix=/usr --werror &&
+ ninja -C build-spice-protocol install &&
+ rm -rf build-spice-protocol
+
+makecheck:
+ script:
+ # Also check out-of-tree build
+ - git clean -fdx # cleanup after previous builds
+ - git submodule foreach --recursive git clean -fdx
+ - mkdir builddir
+ - cd builddir
+ - >
+ CFLAGS='-O2 -pipe -g -fsanitize=address -fno-omit-frame-pointer -Wframe-larger-than=40920'
+ CXXFLAGS='-O2 -pipe -g -fsanitize=address -fno-omit-frame-pointer -Wframe-larger-than=40920'
+ LDFLAGS='-fsanitize=address -lasan'
+ ../autogen.sh --enable-werror
+ - make
+ - make -C server check || (cat server/tests/test-suite.log && exit 1)
+
+meson-makecheck:
+ script:
+ - git clean -fdx
+ - git submodule foreach --recursive git clean -fdx
+ - >
+ CFLAGS='-O2 -pipe -g -fsanitize=address -fno-omit-frame-pointer -Wframe-larger-than=40920'
+ CXXFLAGS='-O2 -pipe -g -fsanitize=address -fno-omit-frame-pointer -Wframe-larger-than=40920'
+ LDFLAGS='-fsanitize=address -lasan'
+ meson setup --buildtype=release --werror build || (cat build/meson-logs/meson-log.txt && exit 1)
+ - ninja -C build
+ - (cd build && meson test) || (cat build/meson-logs/testlog.txt && exit 1)
+
+# check non-standard options, currently
+# --enable-statistics compile statistic code
+# --without-sasl disable SASL
+options:
+ script:
+ - ./autogen.sh --enable-statistics --without-sasl --enable-werror
+ - make
+ - make -C server check || (cat server/tests/test-suite.log && exit 1)
+
+meson-options:
+ script:
+ - git clean -fdx
+ - git submodule foreach --recursive git clean -fdx
+ - meson setup --buildtype=release --werror -Dstatistics=true -Dsasl=false -Dlz4=false -Dtests=false build
+ - ninja -C build
+ - (cd build && meson test) || (cat build/meson-logs/testlog.txt && exit 1)
+
+check-valgrind:
+ script:
+ - dnf install https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm -y
+ - dnf debuginfo-install spice-server glib2 -y
+ - >
+ dnf install valgrind
+ gstreamer1-libav gstreamer1-plugins-ugly gstreamer1-plugins-good gstreamer1-plugins-bad-free
+ -y
+ - >
+ CFLAGS='-O2 -pipe -g -D_FORTIFY_SOURCE=0'
+ CXXFLAGS='-O2 -pipe -g -D_FORTIFY_SOURCE=0'
+ ./autogen.sh --enable-valgrind --enable-extra-checks
+ - make
+ - make check-valgrind || (cat server/tests/test-suite-memcheck.log && exit 1)
+
+syntax-check:
+ script:
+ - ./autogen.sh
+ - make syntax-check
+
+distcheck:
+ script:
+ - git clean -fdx
+ - git submodule foreach --recursive git clean -fdx
+ - ./autogen.sh --enable-manual --enable-werror
+ - make distcheck
+ - bz2=$( echo spice-*.bz2 )
+ - dir=${bz2%.tar.bz2}
+ - rm -rf "$dir"
+ - tar jxvf "$bz2"
+ - cd "$dir"
+ - meson setup --buildtype=release build
+ - ninja -C build
+
+# Same as makecheck job but use a Centos image
+makecheck-centos:
+ before_script:
+ - dnf install -y 'dnf-command(config-manager)'
+ - dnf config-manager --set-enabled crb
+ - >
+ dnf install git libasan orc-devel glib-networking
+ gcc glib2-devel diffutils
+ opus-devel pixman-devel openssl-devel libjpeg-devel
+ cyrus-sasl-devel lz4-devel
+ gstreamer1-devel gstreamer1-plugins-base-devel
+ git-core python3-pyparsing python3-six python3
+ meson gcc-c++
+ -y
+ - *protocol
+ image: quay.io/centos/centos:stream9
+ script:
+ - >
+ CFLAGS='-O2 -pipe -g -fsanitize=address -fno-omit-frame-pointer -Wframe-larger-than=40920'
+ CXXFLAGS='-O2 -pipe -g -fsanitize=address -fno-omit-frame-pointer -Wframe-larger-than=40920'
+ LDFLAGS='-fsanitize=address -lasan'
+ meson setup --buildtype=release --werror build || (cat build/meson-logs/meson-log.txt && exit 1)
+ - ninja -C build
+ - (cd build && meson test) || (cat build/meson-logs/testlog.txt && exit 1)
+
+# Same as meson-makecheck job but use a Debian i386 image,
+# this in order to test a 32 bit machine
+makecheck-debian32:
+ before_script:
+ - apt-get update -y
+ - >
+ apt-get install -y
+ debhelper
+ gstreamer1.0-libav gstreamer1.0-plugins-base gstreamer1.0-plugins-good
+ gstreamer1.0-plugins-ugly gstreamer1.0-tools
+ libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev
+ libcacard-dev libglib2.0-dev
+ libjpeg-dev liblz4-dev libopus-dev libpixman-1-dev libsasl2-dev
+ libspice-protocol-dev libssl-dev pkg-config
+ python3-six python3-pyparsing liborc-0.4-dev meson git
+ g++ autoconf-archive
+ - *protocol
+ image: i386/debian:latest
+ script:
+ - git clean -fdx
+ - git submodule foreach --recursive git clean -fdx
+ - >
+ CFLAGS='-O2 -pipe -g -fsanitize=address -fno-omit-frame-pointer -Wframe-larger-than=40920'
+ CXXFLAGS='-O2 -pipe -g -fsanitize=address -fno-omit-frame-pointer -Wframe-larger-than=40920'
+ LDFLAGS='-fsanitize=address -lasan'
+ meson setup --buildtype=release --werror build || (cat build/meson-logs/meson-log.txt && exit 1)
+ - ninja -C build
+ - (cd build && meson test) || (cat build/meson-logs/testlog.txt && exit 1)
+
+# Same as makecheck job but use Windows build
+makecheck-windows:
+ script:
+ - >
+ dnf install -y
+ wine mingw64-gcc-c++
+ mingw64-openssl mingw64-glib2 mingw64-glib-networking mingw64-libjpeg-turbo
+ mingw64-pixman mingw64-opus mingw64-winpthreads mingw64-zlib
+ mingw64-gstreamer1-plugins-base mingw64-gstreamer1-plugins-good mingw64-orc
+ - mkdir spice-protocol/build
+ - (cd spice-protocol/build && mingw64-meson --werror && ninja install)
+ - >
+ mingw64-meson --buildtype=release -Dlz4=false -Dsasl=false
+ --cross-file build-aux/meson-win-wrapper.txt build
+ - ninja -C build
+ - export G_TLS_GNUTLS_PRIORITY="NORMAL:%COMPAT"
+ - export WINEPATH='Z:\usr\x86_64-w64-mingw32\sys-root\mingw\bin'
+ - export LANG=en_US.UTF-8
+ # Remove configuration otherwise OpenSSL initialization will fail
+ - rm -f /usr/x86_64-w64-mingw32/sys-root/mingw/etc/pki/tls/openssl.cnf
+ - (cd build && exec meson test --suite spice -t 5) || (cat build/meson-logs/testlog.txt && exit 1)
+
+websocket-autobahn:
+ before_script:
+ - apt-get update -y
+ - >
+ apt-get install -y
+ debhelper
+ gstreamer1.0-libav gstreamer1.0-plugins-base gstreamer1.0-plugins-good
+ gstreamer1.0-plugins-ugly gstreamer1.0-tools
+ libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev
+ libcacard-dev libglib2.0-dev
+ libjpeg-dev liblz4-dev libopus-dev libpixman-1-dev libsasl2-dev
+ libssl-dev pkg-config
+ python3-six python3-pyparsing liborc-0.4-dev git
+ g++ autoconf-archive python-pip
+ python3 python3-pip python3-setuptools python3-wheel ninja-build
+ - pip3 install meson
+ - *protocol
+ image: ubuntu:bionic
+ script:
+ - pip2 install 'wsaccel==0.6.3'
+ - pip2 install autobahntestsuite
+ - wstest -a
+ - git clean -fdx
+ - git submodule foreach --recursive git clean -fdx
+ - >
+ meson setup --buildtype=release build || (cat build/meson-logs/meson-log.txt && exit 1)
+ - ninja -C build
+ - build/server/tests/test-websocket & pid=$!
+ - wstest -m fuzzingclient -s server/tests/fuzzingclient.json
+ - kill $pid
+ - server/tests/autobahn-check-report reports/servers/index.json
+ - rm -rf reports/servers
+ - build/server/tests/test-websocket -n & pid=$!
+ - wstest -m fuzzingclient -s server/tests/fuzzingclient.json
+ - kill $pid
+ - server/tests/autobahn-check-report reports/servers/index.json
+
+trigger-website-update:
+ image: ruby:latest
+ before_script:
+ - gem install asciidoctor
+ only:
+ variables:
+ - $TOKEN
+ changes:
+ - "docs/*.txt"
+ - "docs/images/*"
+ - "docs/manual/*.txt"
+ - "docs/manual/images/*"
+ script:
+ - asciidoctor -d book docs/*.txt docs/manual/*.txt > errors 2>&1
+ - if [ -n "$(cat errors)" ] ; then cat errors; exit 1 ; fi
+ - curl -X POST -F token=$TOKEN -F ref=master https://gitlab.freedesktop.org/api/v4/projects/spice%2Fspice-space/trigger/pipeline
diff --git a/.gitmodules b/.gitmodules
index 0c618ee1..53f2e3a2 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,3 +1,3 @@
[submodule "spice-common"]
- path = spice-common
- url = ../spice-common
+ path = subprojects/spice-common
+ url = ../spice-common.git
diff --git a/.mailmap b/.mailmap
index 4daed49f..d66229a2 100644
--- a/.mailmap
+++ b/.mailmap
@@ -1,5 +1,11 @@
<agilboa@redhat.com> <agilboa@agilboa.usersys.redhat.com>
-<cfergeau@redhat.com> <cfergeau@gmail.com>
-<yhalperi@redhat.com> <yhalperi@yhalperi.tlv.redhat.com>
+<alevy@redhat.com> <alon@pobox.com>
<alexl@redhat.com> <Larsson@.(none)>
+<cfergeau@redhat.com> <cfergeau@gmail.com>
+<david@gibson.dropbear.id.au> <dgibson@redhat.com>
+<fabiano@fidencio.org> <fidencio@redhat.com>
+<marcandre.lureau@redhat.com> <marcandre.lureau@gmail.com>
+<marcandre.lureau@redhat.com> <mlureau@redhat.com>
<nshalman@elys.com> <nshalman-github@elys.com>
+<yhalperi@redhat.com> <yhalperi@yhalperi.tlv.redhat.com>
+<victortoso@redhat.com> <me@victortoso.com>
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 00000000..9ffd2f4d
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,28 @@
+notifications:
+ email:
+ - spice-devel@lists.freedesktop.org
+ irc:
+ channels:
+ - "irc.gimp.net#spice"
+ on_success: change
+ on_failure: always
+sudo: required
+dist: trusty
+language: c
+compiler:
+ - clang
+ - gcc
+before_install:
+ - sudo apt-get update -qq
+ - sudo apt-get install -y automake autoconf pkg-config libglib2.0-dev libspice-protocol-dev libopus-dev libpixman-1-dev libasound2-dev libssl-dev libsasl2-dev libjpeg-dev libglib2.0-dev libnss3-dev asciidoc spice-client-gtk
+install:
+ - pip install --user six pyparsing
+ - which python && python -c 'import six'
+ - wget http://www.spice-space.org/download/libcacard/libcacard-LATEST.tar.xz
+ - tar xf libcacard-LATEST.tar.xz
+ - cd libcacard-* && ./configure --prefix=/usr && make && sudo make install && cd -
+ - wget http://www.spice-space.org/download/releases/spice-protocol-0.12.10.tar.bz2
+ - tar xf spice-protocol-0.12.10.tar.bz2
+ - cd spice-protocol-0.12.10 && ./configure --prefix=/usr && make && sudo make install && cd -
+script:
+ - ./autogen.sh --prefix=/usr && make all && make distcheck
diff --git a/AUTHORS b/AUTHORS
index a5164691..593ec572 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -3,43 +3,92 @@
The current active Spice maintainers are
- Alon Levy <alevy@redhat.com>
Christophe Fergeau <cfergeau@redhat.com>
- Gerd Hoffmann <kraxel@redhat.com>
- Marc-André Lureau <marcandre.lureau@redhat.com>
+ Frediano Ziglio <fziglio@redhat.com>
+ Jonathon Jongsma <jjongsma@redhat.com>
Uri Lublin <uril@redhat.com>
- Yonit Halperin <yhalperi@redhat.com>
Previous Spice maintainers were
+ Alon Levy <alevy@redhat.com>
+ Gerd Hoffmann <kraxel@redhat.com>
Izik Eidus <ieidus@redhat.com>
+ Marc-André Lureau <marcandre.lureau@redhat.com>
Yaniv Kamay <ykamay@redhat.com> (Original project author)
+ Yonit Halperin <yhalperi@redhat.com>
Patches also contributed by
Alexander Larsson <alexl@redhat.com>
+ Alexander Tsoy <alexander@tsoy.me>
Andrew Eikum <aeikum@codeweavers.com>
Aric Stewart <aric@codeweavers.com>
Arnon Gilboa <agilboa@redhat.com>
+ Axel Lin <axel.lin@ingics.com>
+ 소병철 <byungchul.so@samsung.com>
+ Cédric Bosdonnat <cbosdonnat@suse.com>
+ Changqing Li <changqing.li@windriver.com>
+ Christian Ruppert <idl0r@qasl.de>
+ Christophe de Dinechin <dinechin@redhat.com>
+ Cole Robinson <crobinso@redhat.com>
Daniel P. Berrange <berrange@redhat.com>
Dan Kenigsberg <danken@redhat.com>
Dan McGee <dpmcgee@gmail.com>
David Gibson <david@gibson.dropbear.id.au>
+ David Jaša <djasa@redhat.com>
+ Dunrong Huang <riegamaths@gmail.com>
+ Eduardo Lima (Etrunko) <etrunko@redhat.com>
Erlon Cruz <erlon.cruz@br.flextronics.com>
Fabiano Fidêncio <fabiano@fidencio.org>
- Jeremy White <jwhite@codeweavers.com>
+ Francois Gouget <fgouget@codeweavers.com>
Gal Hammer <ghammer@redhat.com>
+ Gilmar Santos Jr <jgasjr@gmail.com>
Hans de Goede <hdegoede@redhat.com>
+ Javier Celaya <javier.celaya@flexvm.es>
+ Jeremy White <jwhite@codeweavers.com>
+ Julien Ropé <jrope@redhat.com>
Jürg Billeter <j@bitron.ch>
+ Li Zhijian <lizhijian@cn.fujitsu.com>
Liang Guo <bluestonechina@gmail.com>
+ Lukáš Hrázký <lhrazky@redhat.com>
+ Lukas Venhoda <lvenhoda@redhat.com>
+ Michal Privoznik <mprivozn@redhat.com>
Michael Tokarev <mjt@tls.msk.ru>
Nahum Shalman <nshalman@elys.com>
Nikolay Orlyuk <virkony@gmail.com>
+ Pavel Grunt <pgrunt@redhat.com>
Peter Robinson <pbrobinson@gmail.com>
+ Sandy Stutsman <sstutsma@redhat.com>
+ Snir Sheriber <ssheribe@redhat.com>
+ Sunny Shin <sunny4s.git@gmail.com>
Søren Sandmann Pedersen <ssp@redhat.com>
Thomas Tyminski <thomast@cs.tu-berlin.de>
Tiziano Mueller <dev-zero@gentoo.org>
+ Victor Toso <victortoso@redhat.com>
+ Wang Qiang <wangqiang.hunan@gmail.com>
Yann E. MORIN <yann.morin.1998@free.fr>
Zeeshan Ali (Khattak) <zeeshanak@gnome.org>
+ Douglas Paul <doug@bogon.ca>
+ 谢 昆明 <kunming.xie@hotmail.com>
+ Benjamin Tissoires <benjamin.tissoires@redhat.com>
+ Olivier Fourdan <ofourdan@redhat.com>
+ worldofpeace <worldofpeace@protonmail.ch>
+ Thiago Mendes <tribeirom@gmail.com>
+ Christian Ehrhardt <christian.ehrhardt@canonical.com>
+ Kevin Pouget <kpouget@redhat.com>
+ Rosen Penev <rosenp@gmail.com>
+ James Le Cuirot <chewi@gentoo.org>
+ Frediano Ziglio <freddy77@gmail.com>
+ Stefan Weil <sw@weilnetz.de>
+ Roman Bogorodskiy <bogorodskiy@gmail.com>
+ Tomasz Kłoczko <kloczek@github.com>
+ Qiuhao Li <Qiuhao.Li@outlook.com>
+ Hunter Sezen <orbea@riseup.net>
+ Simon Chopin <simon.chopin@canonical.com>
+ Geoffrey McRae <geoff@hostfission.com>
+ Antonio Larrosa <antonio.larrosa@gmail.com>
+ Volker Rümelin <vr_qemu@t-online.de>
+ Biswapriyo Nath <nathbappai@gmail.com>
+ Vivek Kasireddy <vivek.kasireddy@intel.com>
....send patches to get your name here...
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 00000000..91cb7a33
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,556 @@
+Major Changes in 0.15.2:
+========================
+Really minor fix release, mainly to fix a distribution issue
+
+* Add missing file to distribution
+* Fix sound recording fix in case of buffer wrapping
+
+Major Changes in 0.15.1:
+========================
+
+* Fix some compatibility issues with FreeBSD
+* Fix some minor issue with build
+* Improve packaging with Meson
+* Lot of C++ improves (clang-tidy)
+* Fix some compatibility with no-Glibc libraries (like Musl)
+* Fix minor leaks shutting down library
+* Add Doxygen file to distribution
+* Fix a longstanding issue related to surface updates where wrong surfaces were possibly used
+* Fix compatibility with OpenSSL 3
+* Updates and fixes for CI
+* Use more random connection IDs to fix possible issues with proxies
+
+Major Changes in 0.15:
+======================
+
+This is the first release in the new 0.15.x stable series. This release should
+be ready for production use.
+
+* Minor updates to CI
+* Some compatibility with OpenSSL
+* Change the behavior of handle_dev_start ignoring multiple start requests
+* Ignore multiple calls to handle_dev_stop
+* Pick up newer spice-common to fix a buffer overflow issue
+
+Major Changes in 0.14.91:
+=========================
+
+**IMPORTANT**
+0.14.91 is the first release candidate for the stable 0.15.x series. While some
+bugs might still be present, it should be reasonably stable. If you are looking
+for stability for daily use, please keep using the latest 0.14.x release.
+
+* Support UNIX abstract sockets
+* Fix some potential thread race condition in RedClient
+* Many cleanups in the code
+* Improve migration test script
+* Update in protocol documentation
+* Improve Meson build
+* Removed CELT support
+* Update CI
+* Removed QXLWorker definition, it was deprecated 6 years ago
+* Fix some compatibility with MacOS
+* Fix some compatibility with Windows
+* Move the project to C++
+* Some fixes for SASL dealing with WebDAV
+* Fix minor Coverity reports
+* Add Doxygen support, manually built with "make doxy"
+* Support more mouse buttons (up to 16 buttons)
+* CVE-2020-14355 multiple buffer overflow vulnerabilities in QUIC decoding
+ code
+
+Major Changes in 0.14.3:
+========================
+
+Main changes are WebSocket and support for Windows.
+
+* Add support for WebSocket, this will allow to use spice-html5 without proxy
+* Support Windows, now Qemu Windows can be build enabling Spice
+* Fix some alignment problem
+* Converted some documentation to Asciidoc format to make easier to update,
+ updated some
+* Minor compatibility fix for PPC64EL and ARMHF
+* Minor fixes for big endian machines like MIPS
+* Avoid some crashes with some buggy guest drivers, simply ignore the invalid
+ request
+* Fix for old OpenSSL versions
+* Minor fix for Windows clients and brushes, fixed an issue with Photoshop
+ under Windows 7
+* Add ability to query video-codecs
+* Small use-after-free fix
+* Fix for debugging recording/replaying using QUIC images
+* Fix a regression where spice reported no monitors to the client
+* Fix DoS in spicevmc if WebDAV used
+* Updated and improved test migration script
+* Some minor fixes to smartcard support
+* Avoid possible disconnection using proxies using a in-flow keepalive
+ mechanism
+
+Major Changes in 0.14.2:
+========================
+
+Main changes are support for Meson build and graphic device info
+messages allowing to better support multi-monitor configurations.
+
+* CVE-2019-3813: fix off-by-one error in group/slot boundary check
+* support H265 in stream-channel
+* add support for building with meson/ninja
+* minor tests fixes improving CI
+* set char device state for smartcard, allowing Qemu optimization
+* improve red-parse-qxl.c interface making it more consistent
+* add some instrumentation for streaming device
+* QXL interface: add a function to identify monitors in the guest
+ (spice_qxl_set_device_info)
+* add support for GraphicsDeviceInfo messages
+* video-stream: prevent crash on stream reattach
+* make channel client callbacks virtual functions
+* bumped minimum required glib version to 2.38
+* attempt to have a reliable led state for keyboard modifiers
+
+Major Changes in 0.14.1:
+========================
+
+The main change in this release is the addition of a new protocol extension
+in order to support streaming the remote display as a video stream rather than
+going through the QXL protocol. Together with spice-streaming-agent, and/or with
+more work on the qemu/spice-server side, this should allow streaming of 3D
+accelerated VMs in the future. At this point, this part of spice-server is
+still a work in progress (multi-monitor support and various features are
+missing).
+
+* add new org.spice-space.stream.0 channel used for passing an encoded video
+ stream from the guest to the client
+* add support for TCP_CORK to reduce the amount of packets that we send
+* fix CVE-2018-10873
+* fix cursor related migration crash
+* fix regression causing sound recording to be muted after
+ client disconnection/reconnection (introduced in 0.13.90)
+* fix regression in corner cases where images could be sent uncompressed
+ when they used to be compressed with QUIC
+* disable TLS 1.0 support
+* CELT 0.5.1 support is now disabled by default. If celt051-devel is installed
+ at build-time, --enable-celt051/--disable-celt051 must be explicitly specified
+* drop support for unsupported OpenSSL version. OpenSSL 1.0.0 or newer is now
+ required
+* bumped minimum required glib version to 2.32
+* endianness fixes
+* (small) leak fixes
+* usual round of code cleanups
+* not directly related to this release, but the upstream git repository is now
+ hosted on gitlab.freedesktop.org
+
+Major Changes in 0.14.0:
+========================
+
+This is the first release in the new 0.14.x stable series. This release should
+be ready for production use.
+
+* fix client mouse with virgl
+* fix frozen display after seamless migration
+
+Major Changes in 0.13.91:
+=========================
+
+*** IMPORTANT ***
+0.13.91 is the first release candidate for the stable 0.14.x series. While some
+bugs might still be present, it should be stable.
+
+* set human-readable name on spice threads
+* leak fixes
+* robustness improvements (fix potential crashes in situation which should not
+ happen on normal use)
+* add sanity-checks for ORC library as it can abort spice-server when selinux
+ is in use
+* more code cleanups/improvements
+
+Major Changes in 0.13.90:
+=========================
+
+*** IMPORTANT ***
+0.13.90 is the first release candidate for the stable 0.14.x series. While some
+bugs might still be present, it should be reasonably stable. If you are looking
+for stability for daily use, please keep using the latest 0.12.x release.
+
+* Close TCP connection early when client did not send the correct SPICE magic
+ bytes: this allows VNC clients to gracefully fail when connecting to a SPICE
+ port
+* Fixes for CVE-2016-9577, CVE-2016-9578 and CVE-2017-7506
+* Fix client being disconnected after migration (bug introduced in 0.13.3)
+* Add a --enable-statistics configure option
+* GLIB 2.28 is now a required build time dependency (used to be 2.22)
+* Add VP9 encoding support when GStreamer is being used and misc
+ streaming/encoding improvements
+* more code refactoring/reorganization work
+
+Major Changes in 0.13.3:
+========================
+
+*** IMPORTANT ***
+The 0.13.x release series is an unstable release series, if you are looking for
+stability for daily use, please use the latest 0.12.x release. We are trying to
+keep the code as functional as 0.12, but regressions or bugs could still happen.
+
+* Ongoing work on separating/encapsulating the existing codebase. Main
+ highlight is that RedChannel/RedChannelClient have been converted to GObjects
+* Statistics code is now disabled by default, if you need it,
+ -DREDS_STATISTICS must be added to CPPFLAGS when building
+* Improvements to replay utility
+* Limit (deprecated/unusud) QXLMessage size to 100,000 characters for improved
+ safety
+* Build fixes on older distros (el6)
+* Improve image quality in low bitrate situation when using the
+ GStreamer backend
+
+Major Changes in 0.13.2:
+========================
+
+*** IMPORTANT ***
+The 0.13.x release series is an unstable release series, if you are looking for
+stability for daily use, please use the latest 0.12.x release. We are trying to
+keep the code as functional as 0.12, but regressions or bugs could still happen.
+
+* Fixes for various CVEs
+* Added GStreamer support to the video streaming code
+* Fix old migration bug causing migration to never end in some cases
+* Fix some vdagent-related regressions introduced in 0.13.1
+* Added lz4 compression to the spicevmc channel
+* Ongoing code cleanups
+
+Major changes in 0.13.1:
+========================
+
+*** IMPORTANT ***
+The 0.13.x release series is an unstable release series, if you are looking for
+stability for daily use, please use the latest 0.12.x release. We are trying to
+keep the code as functional as 0.12, but regressions or bugs could still happen.
+
+* add spice_qxl_gl_scanout() spice_qxl_gl_draw_async() for local virgl support
+* spice_server_set_keepalive_timeout() has been removed in favour of
+ unconditionally sending keepalive probes every 10 minutes
+* the rework started in 0.13.0 has moved forward. The global RedsState *reds
+ variable has now been removed, GLib mainloop is now used for the RedWorker thread
+ rather than an adhoc implementation, some core classes have been ported to
+ GObject, ...
+* some crash/leak fixes in corner cases
+
+Major changes in 0.13.0:
+========================
+
+* Start of a large code rework to attempt to make the codebase more
+ maintainable. With this first release, the huge red_worker.c file has been split
+ in multiple smaller files.
+
+* Added public spice_server_set_keepalive_timeout() to make it possible
+ to tweak keepalive on all SPICE connection. This can prevent unwanted
+ idle disconnections if proxies are used between the client and the host.
+* Fix important memory usage when the webdav channel is used
+* Do not disconnect when the client requests an unsupported compression type
+* Fix potential race condition when using multiple QXL devices
+* Fix display glitch when using XSpice
+* Improve help string for 'replay -s'
+* Fix crashes in corner cases (buggy spice-html5 + win10, vnc + SPICE port
+ configured, USB webcam redirection over a slow link)
+* Fix various compilation warning when building on 32 bit machines
+* Do not build static libraries by default, this can be reenabled with
+ --enable-static
+* Fix small leak in MJPEG code
+
+Major changes in 0.12.6:
+========================
+* Removed spicec client code, it has been superseded by remote-viewer and other
+ spice-gtk based clients
+* Unix socket support
+* LZ4 support
+* Let clients specify their preferred image compression format
+* Allow to record and replay a spice-server session
+* Fixes for CVE-2015-3247 CVE-2015-5260 and CVE-2015-5261
+* spice-protocol submodule has been removed,, spice-protocol must now be
+ installed when building spice-server
+* Remove write polling in chardevs to reduce wakeups
+* Various bugs, crashes fixes, code cleanups, ...
+
+Major changes in 0.12.5:
+========================
+* Added Opus support. Celt support will be obsoleted in a future release.
+* Addition of webdav channel
+* Force use of TLS 1.0 or newer for TLS connections
+* Reference manual
+* Some optimizations improving CPU use
+* Various bug fixes for race conditions, memory corruption, ... which could
+ be triggered on client disconnections, migration, ... and cause spice-server
+ to misbehave.
+* Portability fixes
+* Code cleanups
+
+Major changes in 0.12.4:
+========================
+* log actual address spice-server binds to
+* main_channel: fix double release of migration target data (rhbz#859027)
+* red_channel: replace an assert upon threads mismatch with a warning (rhbz#823472)
+* support for filtering out agent file-xfer msgs (rhbz#961848)
+** new library export spice_server_set_agent_file_xfer
+* mjpeg encoder statistics (mjpeg_encoder_get_stats)
+* improve stream stats readability and ease of parsing
+* fix for stuck display_channel over WAN (jpeg_enabled=true) (rhbz#977998)
+* Use RING_FOREACH_SAFE and other SAFE macros (rhbz#887775)
+* Some server/tests fixes.
+
+Major changes in 0.12.3:
+========================
+* monitor client bandwidth and latency.
+* dynamically adjust video stream quality based on client bandwidth & latency.
+** new SPICE_MSGC_DISPLAY_STREAM_REPORT
+** can also set SPICE_BIT_RATE environment variable to override.
+* support arbitrary latency of audio stream wrt video stream:
+** new SPICE_MSG_PLAYBACK_LATENCY
+* notify agent on client disconnection
+** new VD_AGENT_CLIENT_DISCONNECTED message
+* better support for switching from qxl to vga mode
+** new library export spice_qxl_driver_unload
+* multiple monitor support in single channel fixes.
+* stop streams before migration.
+* don't send empty volume messages.
+* Bugs fixed: rhbz#891326, rhbz#958276, rhbz#956345
+* fixes to inputs, chardev, build fixes.
+
+Major changes in 0.12.2:
+========================
+* Stable Release
+* Skipped 0.12.1, it existed in git but was never released
+* spice-server now requires glib2 (like qemu does)
+* More robust ssl error and certificate handling
+* Added support for websockets
+* Tons of seamless migration bugfixes
+* Also some none seamless migration bugfixes
+
+Major changes in 0.12.0:
+========================
+* Stable Release
+* support setting client monitor configuration via device
+ QXLInterface::client_monitors_config
+* support notifying guest of client capabilities
+ QXLInterface::set_client_capabilities
+* new capability for A8 Surface support
+* Enable build on armv6+
+* Option to quit server after first client disconnects
+ spice_server_set_exit_on_disconnect
+
+Major changes in 0.11.3:
+========================
+* !Development Release!
+* This entry contains all 0.11.0 .. 0.11.3 changes.
+* Support seamless migration: no loss of in transit messages. Still not
+ supported for agent, smartcard and usb.
+* Support a new rendering message, Composite, for much improved linux guest
+ performance.
+* Support arbitrary resolution & multiple monitors on a single display channel.
+* Improved keyboard handling under network latency with new
+ SPICE_MSGC_INPUTS_KEY_SCANCODE message.
+* New libspice-server.so symbols:
+ spice_server_set_seamless_migration
+ spice_server_vm_stop
+ spice_server_vm_start
+ spice_qxl_monitors_config_async
+* New capabilities:
+ SPICE_DISPLAY_CAP_COMPOSITE
+ SPICE_DISPLAY_CAP_MONITORS_CONFIG
+ SPICE_INPUTS_CAP_KEY_SCANCODE
+ SPICE_MAIN_CAP_AGENT_CONNECTED_TOKENS
+ SPICE_MAIN_CAP_SEAMLESS_MIGRATE
+* Misc:
+ * char-device.c: Introducing shared flow control code for char devices
+ * Enable build without client, cegui and slirp.
+
+Major changes in 0.11.0:
+========================
+* !Development Release!
+* 8817549..d905a1f
+* now using git submodules: spice-common and spice-protocol.
+* New spice protocol messages: (changes in spice-protocol, here for reference)
+ * SPICE_MSG_MAIN_NAME, SPICE_MSG_MAIN_UUID
+ * SPICE_MSG_DISPLAY_STREAM_DATA_SIZED
+* New corresponding caps: (changes in spice-protocol, here for reference)
+ * SPICE_MAIN_CAP_NAME_AND_UUID
+ * SPICE_DISPLAY_CAP_SIZED_STREAM.
+* Send name & uuid to capable clients
+* add support for frames of different sizes RHBZ #813826
+* server:
+ * support a pre-opened file descriptor
+ * Solaris support. Now using poll instead of epoll.
+ * Support IPV6 addresses in channel events RHBZ #788444
+ * other fixed RHBZ#: 787669, 787678, 819484
+* spicec
+ * alsa: use "default" instead of "hw:0,0"
+ * volume keys support RHBZ #552539
+ * other fixed RHBZ#: 78655, 804561, 641828
+* solaris, mingw & windows, 32 bit fixes.
+* enable server only build.
+* GNULIB manywarnings.m4 & warnings.m4 module added.
+* Many more bug fixes & code cleanups.
+* spice-protocol no longer external.
+* new server functions:
+ + spice_server_set_name
+ + spice_server_set_uuid
+ + spice_server_set_listen_socket_fd
+ + spice_server_is_server_mouse
+
+Major changes in 0.10.1:
+========================
+* Mini header support
+* Add server API for injecting a client connection socket
+* Add Xinerama support to spicec
+* Many bugfixes / code cleanups
+* Requires spice-protocol >= 0.10.1
+
+Major changes in 0.10.0:
+========================
+* 32 bit (little endian) server builds.
+* ABI compatible with 0.8.2.
+
+Major changes in 0.9.2:
+=======================
+* !Development Release!
+* server: semi-seamless migration support (RHBZ 738266)
+* client: semi-seamless migration support (RHBZ 725009, 738270)
+* Various bugfixes / cleanups
+* require spice-protocol >= 0.9.1
+
+Major changes in 0.9.1:
+=======================
+* !Development Release!
+* Multi-client support, disabled by default (experimental!) set the
+ environment variable SPICE_DEBUG_ALLOW_MC before starting qemu to enable
+* Add support for adding generic spicevmc chardev passthrough channels
+* Add USB redirection channel (using generic spicevmc chardev passthrough)
+* Various bugfixes / cleanups
+
+Major changes in 0.9.0:
+=======================
+* !Development Release!
+* volume synchronization between client and guest (client->guest only)
+* turbo-jpeg used to avoid expensive color conversion in mjpeg encoder.
+* Cleanups
+
+Major changes in 0.8.2:
+=======================
+* server: sasl support (fdo bz 34795)
+* server: support guest async io
+* server: support guest suspend and hibernate
+* server: add symbol versioning to libspice-server.so
+* server: prevent running an old spice-server with a newer qemu
+* server Bug fixes (RHBZ): 714801, 713474, 674532, 653545
+* client Bug fixes (RHBZ): 712938, 710461, 673973, 667689
+* require spice-protocol >= 0.8.1
+
+Major changes in 0.8.1:
+=======================
+* client: Fix handling of --smartcard-db option
+* client: Add --version option
+* spicec-x11: Work around a bug in xsel
+* spicec-x11: Don't crash on apps sending bad atoms as TARGETS
+* server: Make copy paste support configurable
+* server: Various fixes to agent <-> client data handling
+
+Major changes in 0.8.0:
+=======================
+* client: exit nicely for --controller with no SPICE_XPI_SOCKET (rhbz#644292)
+* client-x11: Use _exit rather then exit on X errors (rhbz#680763)
+* client-x11: Fix keyb modifiers not syncing from guest to client (rhbz#679467)
+* server: fix segfault on migration
+
+Major changes in 0.7.3:
+=======================
+* Suport building with (and requires) libcacard-0.1.2
+* Fixes for building with gcc-4.6
+* Server: Drop unnecessary X11 and alsa requires from spice-server.pc
+* Client: fix minor for old migration support
+* Client: Remove spice-client watermark (rhbz#662450)
+
+Major changes in 0.7.2:
+=======================
+* cmd-line-parser: fix wrong reporting of bad argument in --bla=val case
+* Server: do not depend on libcacard and CEGUI (when enabled for the client)
+* Server: send 1 instead of 4 as topdown flag "true" value
+* Client: accept 4 as top down flag value for compatibility with older servers
+* Client: stop blinking keyboard when out of focus
+* Client: log subject-host mismatch, and raise ssl warnings to errors
+
+Major changes in 0.7.1:
+=======================
+* Brown paper bag release
+* Update SPICE_SERVER_VERSION
+* Include server/tests/test_util.h in the make dist generated tarbals, so
+ that they actually compile
+
+Major changes in 0.7.0:
+=======================
+* Many small bugfixes to the spice client
+* Support for smartcards (CAC)
+
+Major changes in 0.6.3:
+=======================
+Major changes in this release:
+* Foreign menu and controller support for the client for XPI / ActiveX
+ browser plugin usage (same API as the 0.4 client)
+* Copy and paste support in the client
+* Image copy and paste support in the X client
+* Fix fullscreen mode of the X client under compiz and KDE
+* Various portability and bug fixes
+
+Major changes in 0.6.2:
+=======================
+0.6.2 was skipped because a small but nasty bug was found while preparing
+the release (and it was already tagged as 0.6.2 in git).
+
+Major changes in 0.6.1:
+=======================
+Major changes in this release:
+* New libspice API to handle backwards compatibility
+* Fix X crash in X client
+* Fix memory leaks and crashes
+* Portability fixes
+
+Major changes in 0.6.0:
+=======================
+Major changes in this releas:
+* Various bugfixes
+* Make build work on arm7
+* Fix build for python 2.5
+* Don't allow video streams on non-primary surface
+* Fix shared memory leaks in client
+* Add some new libspice-server APIs for configuration options
+* Convert SpiceVDIPort API to generic SpiceCharDevice API
+* Add capabilities negotiation to agent
+
+Major changes in 0.5.3:
+=======================
+
+Major changes in this release:
+* Various changes in the network protocol to make it more efficient.
+* New commandline arguments to enable/disable jpeg and zlib-over-glz.
+* Initial work on clipboard sharing added
+* Fix color channel order for mjpegs when connecting to older spice
+ server.
+
+Major changes in 0.5.2:
+=======================
+
+This is the first release of the unstable 0.5.x series leading up to 0.6.
+With this release the API of spice-server is considered stable, but
+the network protocol and QXL PCI ABI are still unstable.
+
+The major changes compared to the 0.4 series are:
+
+* New, more efficient network protocol
+* Support for offscreen surfaces in guest driver
+* New spice-server API
+* A marshalling/demarshalling system that isolates the network
+ protocol parsing from the internal types
+* A PCI parsing and validation layer making it easier to
+ get backwards compatibility, cleaning up the internals ans
+ makes security review easier.
+* WAN support, including lossy compression using jpeg and
+ zlib compression.
+* Easier to build. No more dependencies on forked versions
+ of pixman and cairo. Separate module spice-protocol containing
+ headers used when building drivers and qemu.
diff --git a/ChangeLog b/ChangeLog
deleted file mode 100644
index e69de29b..00000000
--- a/ChangeLog
+++ /dev/null
diff --git a/GNUmakefile b/GNUmakefile
index ca88b6b0..a869da5b 100644
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -1,11 +1,11 @@
-# Having a separate GNUmakefile lets me `include' the dynamically
+# Having a separate GNUmakefile lets me 'include' the dynamically
# generated rules created via cfg.mk (package-local configuration)
# as well as maint.mk (generic maintainer rules).
# This makefile is used only if you run GNU Make.
# It is necessary if you want to build targets usually of interest
# only to the maintainer.
-# Copyright (C) 2001, 2003, 2006-2011 Free Software Foundation, Inc.
+# Copyright (C) 2001, 2003, 2006-2016 Free Software Foundation, Inc.
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -20,20 +20,10 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-# Systems where /bin/sh is not the default shell need this. The $(shell)
-# command below won't work with e.g. stock DOS/Windows shells.
-ifeq ($(wildcard /bin/s[h]),/bin/sh)
-SHELL = /bin/sh
-else
-# will be used only with the next shell-test line, then overwritten
-# by a configured-in value
-SHELL = sh
-endif
-
# If the user runs GNU make but has not yet run ./configure,
# give them a diagnostic.
-_have-Makefile := $(shell test -f Makefile && echo yes)
-ifeq ($(_have-Makefile),yes)
+_gl-Makefile := $(wildcard [M]akefile)
+ifneq ($(_gl-Makefile),)
# Make tar archive easier to reproduce.
export TAR_OPTIONS = --owner=0 --group=0 --numeric-owner
@@ -101,6 +91,11 @@ srcdir = .
# The package can override .DEFAULT_GOAL to run actions like autoreconf.
-include ./cfg.mk
+
+# Allow cfg.mk to override these.
+_build-aux ?= build-aux
+_autoreconf ?= autoreconf -v
+
include ./maint.mk
ifeq ($(.DEFAULT_GOAL),abort-due-to-no-makefile)
@@ -109,7 +104,7 @@ endif
abort-due-to-no-makefile:
@echo There seems to be no Makefile in this directory. 1>&2
- @echo "You must run ./configure before running \`make'." 1>&2
+ @echo "You must run ./configure before running 'make'." 1>&2
@exit 1
endif
diff --git a/Makefile.am b/Makefile.am
index c7a0e92d..851c2d01 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,42 +1,41 @@
NULL =
ACLOCAL_AMFLAGS = -I m4
-SUBDIRS = spice-common server docs
+SUBDIRS = subprojects/spice-common server docs tools
-if SUPPORT_CLIENT
-SUBDIRS += client
+if ENABLE_TESTS
+check-valgrind:
+ $(MAKE) -C server check-valgrind
endif
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = spice-server.pc
DISTCHECK_CONFIGURE_FLAGS = \
- --enable-automated-tests \
- --enable-opengl \
--enable-smartcard \
--with-sasl \
--enable-manual \
$(NULL)
EXTRA_DIST = \
+ meson.build \
+ meson_options.txt \
build-aux/git-version-gen \
+ build-aux/meson-dist \
+ build-aux/meson/check-spice-common \
+ CHANGELOG.md \
+ doxygen.sh \
+ doxygen.cfg \
.version \
$(NULL)
-# Generate the ChangeLog file (with all entries since the switch to git)
-# and insert it into the directory we're about to use to create a tarball.
-.PHONY: gen-ChangeLog
-gen-ChangeLog:
- if test -d .git || test -d ../.git; then \
- $(top_srcdir)/build-aux/gitlog-to-changelog > $(distdir)/cl-t; \
- rm -f $(distdir)/ChangeLog; \
- mv $(distdir)/cl-t $(distdir)/ChangeLog; \
- fi
-
# see git-version-gen
-dist-hook: gen-ChangeLog
+dist-hook:
echo $(VERSION) > $(distdir)/.tarball-version
BUILT_SOURCES = $(top_srcdir)/.version
$(top_srcdir)/.version:
echo $(VERSION) > $@-t && mv $@-t $@
+
+doxy:
+ $(srcdir)/doxygen.sh
diff --git a/NEWS b/NEWS
deleted file mode 100644
index 2fbac0d9..00000000
--- a/NEWS
+++ /dev/null
@@ -1,285 +0,0 @@
-Major changes in 0.12.5:
-========================
-* Added Opus support. Celt support will be obsoleted in a future release.
-* Addition of webdav channel
-* Force use of TLS 1.0 or newer for TLS connections
-* Reference manual
-* Some optimizations improving CPU use
-* Various bug fixes for race conditions, memory corruption, ... which could
- be triggered on client disconnections, migration, ... and cause spice-server
- to misbehave.
-* Portability fixes
-* Code cleanups
-
-Major changes in 0.12.4:
-========================
-* log actual address spice-server binds to
-* main_channel: fix double release of migration target data (rhbz#859027)
-* red_channel: replace an assert upon threads mismatch with a warning (rhbz#823472)
-* support for filtering out agent file-xfer msgs (rhbz#961848)
-** new library export spice_server_set_agent_file_xfer
-* mjpeg encoder statistics (mjpeg_encoder_get_stats)
-* improve stream stats readability and ease of parsing
-* fix for stuck display_channel over WAN (jpeg_enabled=true) (rhbz#977998)
-* Use RING_FOREACH_SAFE and other SAFE macros (rhbz#887775)
-* Some server/tests fixes.
-
-Major changes in 0.12.3:
-========================
-* monitor client bandwidth and latency.
-* dynamically adjust video stream quality based on client bandwidth & latency.
-** new SPICE_MSGC_DISPLAY_STREAM_REPORT
-** can also set SPICE_BIT_RATE environment variable to override.
-* support arbitrary latency of audio stream wrt video stream:
-** new SPICE_MSG_PLAYBACK_LATENCY
-* notify agent on client disconnection
-** new VD_AGENT_CLIENT_DISCONNECTED message
-* better support for switching from qxl to vga mode
-** new library export spice_qxl_driver_unload
-* multiple monitor support in single channel fixes.
-* stop streams before migration.
-* don't send empty volume messages.
-* Bugs fixed: rhbz#891326, rhbz#958276, rhbz#956345
-* fixes to inputs, chardev, build fixes.
-
-Major changes in 0.12.2:
-========================
-* Stable Release
-* Skipped 0.12.1, it existed in git but was never released
-* spice-server now requires glib2 (like qemu does)
-* More robust ssl error and certificate handling
-* Added support for websockets
-* Tons of seamless migration bugfixes
-* Also some none seamless migration bugfixes
-
-Major changes in 0.12.0:
-========================
-* Stable Release
-* support setting client monitor configuration via device
- QXLInterface::client_monitors_config
-* support notifying guest of client capabilities
- QXLInterface::set_client_capabilities
-* new capability for A8 Surface support
-* Enable build on armv6+
-* Option to quit server after first client disconnects
- spice_server_set_exit_on_disconnect
-
-Major changes in 0.11.3:
-========================
-* !Development Release!
-* This entry contains all 0.11.0 .. 0.11.3 changes.
-* Support seamless migration: no loss of in transit messages. Still not
- supported for agent, smartcard and usb.
-* Support a new rendering message, Composite, for much improved linux guest
- performance.
-* Support arbitrary resolution & multiple monitors on a single display channel.
-* Improved keyboard handling under network latency with new
- SPICE_MSGC_INPUTS_KEY_SCANCODE message.
-* New libspice-server.so symbols:
- spice_server_set_seamless_migration
- spice_server_vm_stop
- spice_server_vm_start
- spice_qxl_monitors_config_async
-* New capabilities:
- SPICE_DISPLAY_CAP_COMPOSITE
- SPICE_DISPLAY_CAP_MONITORS_CONFIG
- SPICE_INPUTS_CAP_KEY_SCANCODE
- SPICE_MAIN_CAP_AGENT_CONNECTED_TOKENS
- SPICE_MAIN_CAP_SEAMLESS_MIGRATE
-* Misc:
- * char_device.c: Introducing shared flow control code for char devices
- * Enable build without client, cegui and slirp.
-
-Major changes in 0.11.0:
-========================
-* !Development Release!
-* 8817549..d905a1f
-* now using git submodules: spice-common and spice-protocol.
-* New spice protocol messages: (changes in spice-protocol, here for reference)
- * SPICE_MSG_MAIN_NAME, SPICE_MSG_MAIN_UUID
- * SPICE_MSG_DISPLAY_STREAM_DATA_SIZED
-* New corresponding caps: (changes in spice-protocol, here for reference)
- * SPICE_MAIN_CAP_NAME_AND_UUID
- * SPICE_DISPLAY_CAP_SIZED_STREAM.
-* Send name & uuid to capable clients
-* add support for frames of different sizes RHBZ #813826
-* server:
- * support a pre-opened file descriptor
- * Solaris support. Now using poll instead of epoll.
- * Support IPV6 addresses in channel events RHBZ #788444
- * other fixed RHBZ#: 787669, 787678, 819484
-* spicec
- * alsa: use "default" instead of "hw:0,0"
- * volume keys support RHBZ #552539
- * other fixed RHBZ#: 78655, 804561, 641828
-* solaris, mingw & windows, 32 bit fixes.
-* enable server only build.
-* GNULIB manywarnings.m4 & warnings.m4 module added.
-* Many more bug fixes & code cleanups.
-* spice-protocol no longer external.
-* new server functions:
- + spice_server_set_name
- + spice_server_set_uuid
- + spice_server_set_listen_socket_fd
- + spice_server_is_server_mouse
-
-Major changes in 0.10.1:
-========================
-* Mini header support
-* Add server API for injecting a client connection socket
-* Add Xinerama support to spicec
-* Many bugfixes / code cleanups
-* Requires spice-protocol >= 0.10.1
-
-Major changes in 0.10.0:
-========================
-* 32 bit (little endian) server builds.
-* ABI compatible with 0.8.2.
-
-Major changes in 0.9.2:
-=======================
-* !Development Release!
-* server: semi-seamless migration support (RHBZ 738266)
-* client: semi-seamless migration support (RHBZ 725009, 738270)
-* Various bugfixes / cleanups
-* require spice-protocol >= 0.9.1
-
-Major changes in 0.9.1:
-=======================
-* !Development Release!
-* Multi-client support, disabled by default (experimental!) set the
- environment variable SPICE_DEBUG_ALLOW_MC before starting qemu to enable
-* Add support for adding generic spicevmc chardev passthrough channels
-* Add USB redirection channel (using generic spicevmc chardev passthrough)
-* Various bugfixes / cleanups
-
-Major changes in 0.9.0:
-=======================
-* !Development Release!
-* volume synchronization between client and guest (client->guest only)
-* turbo-jpeg used to avoid expensive color conversion in mjpeg encoder.
-* Cleanups
-
-Major changes in 0.8.2:
-=======================
-* server: sasl support (fdo bz 34795)
-* server: support guest async io
-* server: support guest suspend and hibernate
-* server: add symbol versioning to libspice-server.so
-* server: prevent running an old spice-server with a newer qemu
-* server Bug fixes (RHBZ): 714801, 713474, 674532, 653545
-* client Bug fixes (RHBZ): 712938, 710461, 673973, 667689
-* require spice-protocol >= 0.8.1
-
-Major changes in 0.8.1:
-=======================
-* client: Fix handling of --smartcard-db option
-* client: Add --version option
-* spicec-x11: Work around a bug in xsel
-* spicec-x11: Don't crash on apps sending bad atoms as TARGETS
-* server: Make copy paste support configurable
-* server: Various fixes to agent <-> client data handling
-
-Major changes in 0.8.0:
-=======================
-* client: exit nicely for --controller with no SPICE_XPI_SOCKET (rhbz#644292)
-* client-x11: Use _exit rather then exit on X errors (rhbz#680763)
-* client-x11: Fix keyb modifiers not syncing from guest to client (rhbz#679467)
-* server: fix segfault on migration
-
-Major changes in 0.7.3:
-=======================
-* Suport building with (and requires) libcacard-0.1.2
-* Fixes for building with gcc-4.6
-* Server: Drop unnecessary X11 and alsa requires from spice-server.pc
-* Client: fix minor for old migration support
-* Client: Remove spice-client watermark (rhbz#662450)
-
-Major changes in 0.7.2:
-=======================
-* cmd-line-parser: fix wrong reporting of bad argument in --bla=val case
-* Server: do not depend on libcacard and CEGUI (when enabled for the client)
-* Server: send 1 instead of 4 as topdown flag "true" value
-* Client: accept 4 as top down flag value for compatibility with older servers
-* Client: stop blinking keyboard when out of focus
-* Client: log subject-host mismatch, and raise ssl warnings to errors
-
-Major changes in 0.7.1:
-=======================
-* Brown paper bag release
-* Update SPICE_SERVER_VERSION
-* Include server/tests/test_util.h in the make dist generated tarbals, so
- that they actually compile
-
-Major changes in 0.7.0:
-=======================
-* Many small bugfixes to the spice client
-* Support for smartcards (CAC)
-
-Major changes in 0.6.3:
-=======================
-Major changes in this release:
-* Foreign menu and controller support for the client for XPI / ActiveX
- browser plugin usage (same API as the 0.4 client)
-* Copy and paste support in the client
-* Image copy and paste support in the X client
-* Fix fullscreen mode of the X client under compiz and KDE
-* Various portability and bug fixes
-
-Major changes in 0.6.2:
-=======================
-0.6.2 was skipped because a small but nasty bug was found while preparing
-the release (and it was already tagged as 0.6.2 in git).
-
-Major changes in 0.6.1:
-=======================
-Major changes in this release:
-* New libspice API to handle backwards compatibility
-* Fix X crash in X client
-* Fix memory leaks and crashes
-* Portability fixes
-
-Major changes in 0.6.0:
-=======================
-Major changes in this releas:
-* Various bugfixes
-* Make build work on arm7
-* Fix build for python 2.5
-* Don't allow video streams on non-primary surface
-* Fix shared memory leaks in client
-* Add some new libspice-server APIs for configuration options
-* Convert SpiceVDIPort API to generic SpiceCharDevice API
-* Add capabilities negotiation to agent
-
-Major changes in 0.5.3:
-=======================
-
-Major changes in this release:
-* Various changes in the network protocol to make it more efficient.
-* New commandline arguments to enable/disable jpeg and zlib-over-glz.
-* Initial work on clipboard sharing added
-* Fix color channel order for mjpegs when connecting to older spice
- server.
-
-Major changes in 0.5.2:
-=======================
-
-This is the first release of the unstable 0.5.x series leading up to 0.6.
-With this release the API of spice-server is considered stable, but
-the network protocol and QXL PCI ABI are still unstable.
-
-The major changes compared to the 0.4 series are:
-
-* New, more efficient network protocol
-* Support for offscreen surfaces in guest driver
-* New spice-server API
-* A marshalling/demarshalling system that isolates the network
- protocol parsing from the internal types
-* A PCI parsing and validation layer making it easier to
- get backwards compatibility, cleaning up the internals ans
- makes security review easier.
-* WAN support, including lossy compression using jpeg and
- zlib compression.
-* Easier to build. No more dependencies on forked versions
- of pixman and cairo. Separate module spice-protocol containing
- headers used when building drivers and qemu.
diff --git a/README b/README
index dea43444..59d23672 100644
--- a/README
+++ b/README
@@ -24,25 +24,23 @@ Or to install into a private user specific location
make
make install
-The following mandatory dependancies are required in order to
+The following mandatory dependencies are required in order to
build SPICE
- Spice protocol >= 0.9.0
+ Spice protocol >= 0.14.0
Pixman >= 0.17.7
OpenSSL
libjpeg
zlib
- Cyrus-SASL
-The following optional dependancies increase the available
+The following optional dependencies increase the available
functionality
- GE Gui >= 0.6.0, < 0.7.0 (GUI app support)
- OpenGL (GUI app support)
- Alsa (Linux support)
- XRandR >= 1.2 (X11 support)
- Xinerama >= 1.0 (X11 support)
- libcacard >= 0.1.2 (Smartcard support)
+ Cyrus-SASL
+ libcacard >= 2.5.1 (Smartcard support)
+ Opus >= 1.0.0 (Opus audio encoding support)
+ LZ4 (LZ4 compression support)
+ GStreamer >= 1.0.0
Communication
-------------
@@ -58,14 +56,14 @@ There is also a mailing list for new release announcements:
To view known bugs, or report new bugs, in SPICE visit
- https://bugs.freedesktop.org/describecomponents.cgi?product=Spice
+ https://gitlab.freedesktop.org/spice/spice/issues/new?
Bugs found when using an OS distribution's binary packages should
be reported to the OS vendors' own bug tracker first.
The latest SPICE code can be found in GIT at:
- http://cgit.freedesktop.org/spice/
+ https://gitlab.freedesktop.org/spice/
Licensing
---------
diff --git a/README.Windows.md b/README.Windows.md
new file mode 100644
index 00000000..98add5fd
--- /dev/null
+++ b/README.Windows.md
@@ -0,0 +1,31 @@
+SPICE server Windows support
+============================
+
+SPICE server was ported from Unix/Linux to Windows.
+
+Most features are present, with some exceptions:
+
+ - Unix sockets;
+ - signal handling;
+ - CLOEXEC flag (completely different handling on Windows);
+ - IPTOS_LOWDELAY flag (Linux specific);
+ - TCP_CORK (Linux/*BSD specific).
+
+Some features could be ported but currently are not:
+
+ - statistics exported through mapped files. Disabled by default and mainly
+ used for development;
+ - filtering while recording (SPICE_WORKER_RECORD_FILTER environment).
+ Recording is used for debugging or development work;
+ - TCP_KEEPIDLE setting. Default is used.
+
+To compile and use with Qemu you can follow the guide at
+https://wiki.qemu.org/Hosts/W32, just pass `--enable-spice` during
+configuration.
+
+To test using a Linux cross compiler you can install Wine and run test
+with
+
+```
+make LOG_COMPILE=wine check
+```
diff --git a/autogen.sh b/autogen.sh
index b8f4f4a5..e9080fe8 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -15,5 +15,5 @@ autoreconf --verbose --force --install
cd "$olddir"
if [ -z "$NOCONFIGURE" ]; then
- "$srcdir"/configure --enable-maintainer-mode ${1+"$@"}
+ "$srcdir"/configure --enable-maintainer-mode --enable-python-checks ${1+"$@"}
fi
diff --git a/build-aux/git-version-gen b/build-aux/git-version-gen
index 34682473..da525aa5 100755
--- a/build-aux/git-version-gen
+++ b/build-aux/git-version-gen
@@ -1,8 +1,8 @@
#!/bin/sh
# Print a version string.
-scriptversion=2012-12-31.23; # UTC
+scriptversion=2019-10-13.15; # UTC
-# Copyright (C) 2007-2013 Free Software Foundation, Inc.
+# Copyright (C) 2007-2021 Free Software Foundation, Inc.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -15,9 +15,9 @@ scriptversion=2012-12-31.23; # UTC
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
-# This script is derived from GIT-VERSION-GEN from GIT: http://git.or.cz/.
+# This script is derived from GIT-VERSION-GEN from GIT: https://git-scm.com/.
# It may be run two ways:
# - from a git repository in which the "git describe" command below
# produces useful output (thus requiring at least one signed tag)
@@ -72,12 +72,13 @@ scriptversion=2012-12-31.23; # UTC
me=$0
+year=`expr "$scriptversion" : '\([^-]*\)'`
version="git-version-gen $scriptversion
-Copyright 2011 Free Software Foundation, Inc.
-There is NO warranty. You may redistribute this software
-under the terms of the GNU General Public License.
-For more information about these matters, see the files named COPYING."
+Copyright (C) ${year} Free Software Foundation, Inc.
+License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
+This is free software: you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law."
usage="\
Usage: $me [OPTION]... \$srcdir/.tarball-version [TAG-NORMALIZATION-SED-SCRIPT]
@@ -85,8 +86,9 @@ Print a version string.
Options:
- --prefix prefix of git tags (default 'v')
- --fallback fallback version to use if \"git --version\" fails
+ --prefix PREFIX prefix of git tags (default 'v')
+ --fallback VERSION
+ fallback version to use if \"git --version\" fails
--help display this help and exit
--version output version information and exit
@@ -100,8 +102,8 @@ while test $# -gt 0; do
case $1 in
--help) echo "$usage"; exit 0;;
--version) echo "$version"; exit 0;;
- --prefix) shift; prefix="$1";;
- --fallback) shift; fallback="$1";;
+ --prefix) shift; prefix=${1?};;
+ --fallback) shift; fallback=${1?};;
-*)
echo "$0: Unknown option '$1'." >&2
echo "$0: Try '--help' for more information." >&2
@@ -140,11 +142,9 @@ then
v=`cat $tarball_version_file` || v=
case $v in
*$nl*) v= ;; # reject multi-line output
- [0-9]*) ;;
- *) v= ;;
esac
test "x$v" = x \
- && echo "$0: WARNING: $tarball_version_file is missing or damaged" 1>&2
+ && echo "$0: WARNING: $tarball_version_file is damaged" 1>&2
fi
if test "x$v" != x
@@ -166,9 +166,10 @@ then
# tag or the previous older version that did not?
# Newer: v6.10-77-g0f8faeb
# Older: v6.10-g0f8faeb
- case $v in
- *-*-*) : git describe is okay three part flavor ;;
- *-*)
+ vprefix=`expr "X$v" : 'X\(.*\)-g[^-]*$'` || vprefix=$v
+ case $vprefix in
+ *-*) : git describe is probably okay three part flavor ;;
+ *)
: git describe is older two part flavor
# Recreate the number of commits and rewrite such that the
# result is the same as if we were using the newer version
@@ -183,9 +184,9 @@ then
;;
esac
- # Change the first '-' to a '.', so version-comparing tools work properly.
- # Remove the "g" in git describe's output string, to save a byte.
- v=`echo "$v" | sed 's/-/./;s/\(.*\)-g/\1-/'`;
+ # Change the penultimate "-" to ".", for version-comparing tools.
+ # Remove the "g" to save a byte.
+ v=`echo "$v" | sed 's/-\([^-]*\)-g\([^-]*\)$/.\1-\2/'`;
v_from_git=1
elif test "x$fallback" = x || git --version >/dev/null 2>&1; then
v=UNKNOWN
@@ -199,7 +200,7 @@ v=`echo "$v" |sed "s/^$prefix//"`
# string we're using came from git. I.e., skip the test if it's "UNKNOWN"
# or if it came from .tarball-version.
if test "x$v_from_git" != x; then
- # Don't declare a version "dirty" merely because a time stamp has changed.
+ # Don't declare a version "dirty" merely because a timestamp has changed.
git update-index --refresh > /dev/null 2>&1
dirty=`exec 2>/dev/null;git diff-index --name-only HEAD` || dirty=
@@ -214,12 +215,12 @@ if test "x$v_from_git" != x; then
fi
# Omit the trailing newline, so that m4_esyscmd can use the result directly.
-echo "$v" | tr -d "$nl"
+printf %s "$v"
# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
+# eval: (add-hook 'before-save-hook 'time-stamp)
# time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
+# time-stamp-time-zone: "UTC0"
# time-stamp-end: "; # UTC"
# End:
diff --git a/build-aux/gitlog-to-changelog b/build-aux/gitlog-to-changelog
deleted file mode 100755
index 45597041..00000000
--- a/build-aux/gitlog-to-changelog
+++ /dev/null
@@ -1,191 +0,0 @@
-eval '(exit $?0)' && eval 'exec perl -wS "$0" ${1+"$@"}'
- & eval 'exec perl -wS "$0" $argv:q'
- if 0;
-# Convert git log output to ChangeLog format.
-
-my $VERSION = '2009-10-30 13:46'; # UTC
-# The definition above must lie within the first 8 lines in order
-# for the Emacs time-stamp write hook (at end) to update it.
-# If you change this file with Emacs, please let the write hook
-# do its job. Otherwise, update this string manually.
-
-# Copyright (C) 2008-2011 Free Software Foundation, Inc.
-
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-# Written by Jim Meyering
-
-use strict;
-use warnings;
-use Getopt::Long;
-use POSIX qw(strftime);
-
-(my $ME = $0) =~ s|.*/||;
-
-# use File::Coda; # http://meyering.net/code/Coda/
-END {
- defined fileno STDOUT or return;
- close STDOUT and return;
- warn "$ME: failed to close standard output: $!\n";
- $? ||= 1;
-}
-
-sub usage ($)
-{
- my ($exit_code) = @_;
- my $STREAM = ($exit_code == 0 ? *STDOUT : *STDERR);
- if ($exit_code != 0)
- {
- print $STREAM "Try `$ME --help' for more information.\n";
- }
- else
- {
- print $STREAM <<EOF;
-Usage: $ME [OPTIONS] [ARGS]
-
-Convert git log output to ChangeLog format. If present, any ARGS
-are passed to "git log". To avoid ARGS being parsed as options to
-$ME, they may be preceded by '--'.
-
-OPTIONS:
-
- --since=DATE convert only the logs since DATE;
- the default is to convert all log entries.
- --format=FMT set format string for commit subject and body;
- see 'man git-log' for the list of format metacharacters;
- the default is '%s%n%b%n'
-
- --help display this help and exit
- --version output version information and exit
-
-EXAMPLE:
-
- $ME --since=2008-01-01 > ChangeLog
- $ME -- -n 5 foo > last-5-commits-to-branch-foo
-
-EOF
- }
- exit $exit_code;
-}
-
-# If the string $S is a well-behaved file name, simply return it.
-# If it contains white space, quotes, etc., quote it, and return the new string.
-sub shell_quote($)
-{
- my ($s) = @_;
- if ($s =~ m![^\w+/.,-]!)
- {
- # Convert each single quote to '\''
- $s =~ s/\'/\'\\\'\'/g;
- # Then single quote the string.
- $s = "'$s'";
- }
- return $s;
-}
-
-sub quoted_cmd(@)
-{
- return join (' ', map {shell_quote $_} @_);
-}
-
-{
- my $since_date = '1970-01-01 UTC';
- my $format_string = '%s%n%b%n';
- GetOptions
- (
- help => sub { usage 0 },
- version => sub { print "$ME version $VERSION\n"; exit },
- 'since=s' => \$since_date,
- 'format=s' => \$format_string,
- ) or usage 1;
-
- my @cmd = (qw (git log --log-size), "--since=$since_date",
- '--pretty=format:%ct %an <%ae>%n%n'.$format_string, @ARGV);
- open PIPE, '-|', @cmd
- or die ("$ME: failed to run `". quoted_cmd (@cmd) ."': $!\n"
- . "(Is your Git too old? Version 1.5.1 or later is required.)\n");
-
- my $prev_date_line = '';
- while (1)
- {
- defined (my $in = <PIPE>)
- or last;
- $in =~ /^log size (\d+)$/
- or die "$ME:$.: Invalid line (expected log size):\n$in";
- my $log_nbytes = $1;
-
- my $log;
- my $n_read = read PIPE, $log, $log_nbytes;
- $n_read == $log_nbytes
- or die "$ME:$.: unexpected EOF\n";
-
- my @line = split "\n", $log;
- my $author_line = shift @line;
- defined $author_line
- or die "$ME:$.: unexpected EOF\n";
- $author_line =~ /^(\d+) (.*>)$/
- or die "$ME:$.: Invalid line "
- . "(expected date/author/email):\n$author_line\n";
-
- my $date_line = sprintf "%s $2\n", strftime ("%F", localtime ($1));
- # If this line would be the same as the previous date/name/email
- # line, then arrange not to print it.
- if ($date_line ne $prev_date_line)
- {
- $prev_date_line eq ''
- or print "\n";
- print $date_line;
- }
- $prev_date_line = $date_line;
-
- # Omit "Signed-off-by..." lines.
- @line = grep !/^Signed-off-by: .*>$/, @line;
-
- # If there were any lines
- if (@line == 0)
- {
- warn "$ME: warning: empty commit message:\n $date_line\n";
- }
- else
- {
- # Remove leading and trailing blank lines.
- while ($line[0] =~ /^\s*$/) { shift @line; }
- while ($line[$#line] =~ /^\s*$/) { pop @line; }
-
- # Prefix each non-empty line with a TAB.
- @line = map { length $_ ? "\t$_" : '' } @line;
-
- print "\n", join ("\n", @line), "\n";
- }
-
- defined ($in = <PIPE>)
- or last;
- $in ne "\n"
- and die "$ME:$.: unexpected line:\n$in";
- }
-
- close PIPE
- or die "$ME: error closing pipe from " . quoted_cmd (@cmd) . "\n";
- # FIXME-someday: include $PROCESS_STATUS in the diagnostic
-}
-
-# Local Variables:
-# mode: perl
-# indent-tabs-mode: nil
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "my $VERSION = '"
-# time-stamp-format: "%:y-%02m-%02d %02H:%02M"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "'; # UTC"
-# End:
diff --git a/build-aux/meson-dist b/build-aux/meson-dist
new file mode 100755
index 00000000..8ed05eea
--- /dev/null
+++ b/build-aux/meson-dist
@@ -0,0 +1,37 @@
+#!/bin/bash
+
+set -e
+set -o pipefail
+
+if test "$1" = ""; then
+ echo "Version not provided" >&2
+ exit 1
+fi
+if ! test -d "$2"; then
+ echo "Source directory not provided" >&2
+ exit 1
+fi
+
+# generate tarball version
+echo "$1" > "$MESON_DIST_ROOT/.tarball-version"
+
+# remove useless files
+pushd "$MESON_DIST_ROOT"
+find . -name .gitignore -delete
+rm -rf \
+build-aux/useless-if-before-free \
+build-aux/vc-list-files \
+build-aux/meson-win-wrapper.txt \
+cfg.mk \
+docs/how_to_release.md \
+docs/manual/images/pepper.png \
+docs/Spice_user_manual.odt \
+GNUmakefile \
+.mailmap \
+maint.mk \
+README.Windows.md \
+server/tests/autobahn-check-report \
+server/tests/fuzzingclient.json \
+TODO.multiclient \
+.travis.yml \
+uncrustify_cfg
diff --git a/build-aux/meson-win-wrapper.txt b/build-aux/meson-win-wrapper.txt
new file mode 100644
index 00000000..976cf2ae
--- /dev/null
+++ b/build-aux/meson-win-wrapper.txt
@@ -0,0 +1,2 @@
+[binaries]
+exe_wrapper = 'wine'
diff --git a/build-aux/meson/check-spice-common b/build-aux/meson/check-spice-common
new file mode 100755
index 00000000..a0d03a60
--- /dev/null
+++ b/build-aux/meson/check-spice-common
@@ -0,0 +1,5 @@
+#!/bin/sh
+set -e
+if git ls-files --error-unmatch ${MESON_SOURCE_ROOT}/subprojects/spice-common > /dev/null 2>&1; then
+ git --git-dir="${MESON_SOURCE_ROOT}/.git" submodule update --init --recursive
+fi
diff --git a/cfg.mk b/cfg.mk
index 7cf1d58c..ee291c9e 100644
--- a/cfg.mk
+++ b/cfg.mk
@@ -130,23 +130,13 @@ sc_check_author_list:
# XXX some of these tools/ programs probably ought to bindtextdomain ?
-exclude_file_name_regexp--sc_bindtextdomain = ^server/tests|common/region.c|common/win/my_getopt-1.5/main.c|tools/(bitmap_to_c.c|icon_to_c.c|reds_stat.c)
+exclude_file_name_regexp--sc_bindtextdomain = ^server/tests|common/region.c|tools/(bitmap_to_c.c|icon_to_c.c|reds_stat.c)
-exclude_file_name_regexp--sc_preprocessor_indentation = ^*/*.[ch]
-
-exclude_file_name_regexp--sc_const_long_option = ^common/win/my_getopt-1.5/getopt.(3|txt)
-
-exclude_file_name_regexp--sc_prohibit_empty_lines_at_EOF = ^common/win/my_getopt-1.5/getopt.(3|txt)|client/windows/(spice.ico|sticky_alt.bmp)|client/tests/controller_test/build|docs/.*.odt|server/tests/base_test.ppm
-
-# XXX this should be removed & all cases fixde
-exclude_file_name_regexp--sc_prohibit_have_config_h = ^*/.*(c|cpp|h)
-
-exclude_file_name_regexp--sc_require_config_h = ^client/gui/.*\.(ttf|font)\.c|client/gui/taharez.*\.c|client/x11/images/(alt_image|red_icon)\.c|common/win/my_getopt-1.5
-
-exclude_file_name_regexp--sc_require_config_h_first = ^client/gui/.*\.(ttf|font)\.c|client/gui/taharez.*\.c|client/x11/images/(alt_image|red_icon)\.c|common/win/my_getopt-1.5
-
-exclude_file_name_regexp--sc_trailing_blank = ^common/win/my_getopt-1.5/getopt.3|docs/.*.odt
+exclude_file_name_regexp--sc_prohibit_empty_lines_at_EOF = docs/.*.odt|server/tests/base_test.ppm|docs/manual/images/.*.png|docs/images/newbies/.*.png
exclude_file_name_regexp--sc_unmarked_diagnostics = ^.*\.(c|py|h)
-exclude_file_name_regexp--sc_prohibit_path_max_allocation = server/tests/test_display_base.c
+exclude_file_name_regexp--sc_avoid_attribute_unused_in_header = server/stat.h
+
+# this contains a VALGRIND_CHECK_RULES occurrence wrapped in @ which is expected
+exclude_file_name_regexp--sc_makefile_at_at_check = server/tests/Makefile.am
diff --git a/client/.gitignore b/client/.gitignore
deleted file mode 100644
index 0561c05c..00000000
--- a/client/.gitignore
+++ /dev/null
@@ -1,13 +0,0 @@
-*.la
-*.lo
-*.loT
-*.o
-.deps
-.libs
-Makefile
-Makefile.in
-generated_demarshallers.cpp
-generated_demarshallers1.cpp
-generated_marshallers.cpp
-generated_marshallers1.cpp
-spicec
diff --git a/client/Makefile.am b/client/Makefile.am
deleted file mode 100644
index 97b56f6c..00000000
--- a/client/Makefile.am
+++ /dev/null
@@ -1,249 +0,0 @@
-NULL =
-
-bin_PROGRAMS = spicec
-
-spicec_SOURCES = \
- application.cpp \
- application.h \
- audio_channels.h \
- audio_devices.h \
- cache.hpp \
- canvas.cpp \
- canvas.h \
- client_net_socket.cpp \
- client_net_socket.h \
- cmd_line_parser.cpp \
- cmd_line_parser.h \
- common.h \
- controller.cpp \
- controller.h \
- cursor.cpp \
- cursor.h \
- cursor_channel.cpp \
- cursor_channel.h \
- debug.h \
- display_channel.cpp \
- display_channel.h \
- event_sources.h \
- foreign_menu.cpp \
- foreign_menu.h \
- glz_decoded_image.h \
- glz_decoder.cpp \
- glz_decoder.h \
- glz_decoder_config.h \
- glz_decoder_window.cpp \
- glz_decoder_window.h \
- hot_keys.cpp \
- hot_keys.h \
- icon.h \
- inputs_channel.cpp \
- inputs_channel.h \
- inputs_handler.h \
- jpeg_decoder.cpp \
- jpeg_decoder.h \
- menu.cpp \
- menu.h \
- mjpeg_decoder.cpp \
- mjpeg_decoder.h \
- monitor.cpp \
- monitor.h \
- pixels_source.h \
- platform.h \
- playback_channel.cpp \
- process_loop.cpp \
- process_loop.h \
- read_write_mutex.h \
- record_channel.cpp \
- red_canvas_base.h \
- red_channel.cpp \
- red_channel.h \
- red_client.cpp \
- red_client.h \
- red_drawable.h \
- red_key.h \
- red_peer.cpp \
- red_peer.h \
- red_pixmap.h \
- red_pixmap_sw.h \
- red_sw_canvas.cpp \
- red_sw_canvas.h \
- red_types.h \
- red_window.h \
- screen.cpp \
- screen.h \
- screen_layer.cpp \
- screen_layer.h \
- shared_cache.hpp \
- threads.cpp \
- threads.h \
- utils.cpp \
- utils.h \
- zlib_decoder.cpp \
- zlib_decoder.h \
- $(BUILT_SOURCES) \
- $(NULL)
-
-if OS_WIN32
-spicec_SOURCES += \
- red_gdi_canvas.cpp \
- red_gdi_canvas.h \
- red_pixmap_gdi.h \
- windows/atomic_count.h \
- windows/event_sources_p.cpp \
- windows/main.cpp \
- windows/my_getopt.cpp \
- windows/named_pipe.cpp \
- windows/named_pipe.h \
- windows/pixels_source.cpp \
- windows/pixels_source_p.h \
- windows/platform.cpp \
- windows/platform_utils.cpp \
- windows/platform_utils.h \
- windows/playback.cpp \
- windows/playback.h \
- windows/record.cpp \
- windows/record.h \
- windows/red_drawable.cpp \
- windows/red_pixmap.cpp \
- windows/red_pixmap_gdi.cpp \
- windows/red_pixmap_sw.cpp \
- windows/red_window.cpp \
- windows/red_window_p.h \
- windows/resource.h \
- windows/stdint.h \
- windows/win_platform.h \
- $(NULL)
-
-spicec_resource_LDADD = windows/redc.o
-
-windows/redc.o: windows/redc.rc
- $(WINDRES) $< -o $@
-else
-spicec_SOURCES += \
- x11/atomic_count.h \
- x11/event_sources_p.cpp \
- x11/event_sources_p.h \
- x11/main.cpp \
- x11/named_pipe.cpp \
- x11/named_pipe.h \
- x11/pixels_source.cpp \
- x11/pixels_source_p.h \
- x11/platform.cpp \
- x11/platform_utils.cpp \
- x11/platform_utils.h \
- x11/playback.cpp \
- x11/playback.h \
- x11/record.cpp \
- x11/record.h \
- x11/red_drawable.cpp \
- x11/red_pixmap.cpp \
- x11/red_pixmap_sw.cpp \
- x11/red_window.cpp \
- x11/red_window_p.h \
- x11/res.cpp \
- x11/res.h \
- x11/resource.h \
- x11/x_icon.cpp \
- x11/x_icon.h \
- x11/x_platform.h \
- $(NULL)
-endif
-
-if OS_WIN32
-PLATFORM_INCLUDES=-I$(top_srcdir)/client/windows
-else
-PLATFORM_INCLUDES=-I$(top_srcdir)/client/x11
-endif
-
-if SUPPORT_GUI
-spicec_SOURCES += \
- gui/gui.cpp \
- gui/gui.h \
- gui/resource_provider.cpp \
- gui/resource_provider.h \
- gui/softrenderer.cpp \
- gui/softrenderer.h \
- gui/softtexture.cpp \
- gui/softtexture.h \
- $(NULL)
-endif
-
-if SUPPORT_GL
-spicec_SOURCES += \
- red_gl_canvas.cpp \
- red_gl_canvas.h \
- red_pixmap_gl.h \
- $(NULL)
-
-if !OS_WIN32
-spicec_SOURCES += x11/red_pixmap_gl.cpp
-endif
-
-endif
-
-if SUPPORT_SMARTCARD
-spicec_SOURCES += \
- smartcard_channel.cpp \
- smartcard_channel.h \
- $(NULL)
-endif
-
-
-AM_CPPFLAGS = \
- -D__STDC_LIMIT_MACROS \
- $(PLATFORM_INCLUDES) \
- -I$(top_srcdir)/spice-common \
- $(ALSA_CFLAGS) \
- $(CEGUI_CFLAGS) \
- $(CEGUI06_CFLAGS) \
- $(CELT051_CFLAGS) \
- $(GL_CFLAGS) \
- $(MISC_X_CFLAGS) \
- $(PIXMAN_CFLAGS) \
- $(COMMON_CFLAGS) \
- $(SPICE_NONPKGCONFIG_CFLAGS) \
- $(SMARTCARD_CFLAGS) \
- $(SSL_CFLAGS) \
- $(XRANDR_CFLAGS) \
- $(XFIXES_CFLAGS) \
- $(WARN_CXXFLAGS) \
- $(XINERAMA_CFLAGS) \
- $(CXIMAGE_CFLAGS) \
- $(NULL)
-
-spicec_LDFLAGS = $(SPICEC_STATIC_LINKAGE_BSTATIC)
-
-spicec_LDADD = \
- $(top_builddir)/spice-common/common/libspice-common.la \
- $(top_builddir)/spice-common/common/libspice-common-client.la \
- $(ALSA_LIBS) \
- $(CEGUI_LIBS) \
- $(CEGUI06_LIBS) \
- $(CELT051_LIBS) \
- $(GL_LIBS) \
- $(JPEG_LIBS) \
- $(MISC_X_LIBS) \
- $(PIXMAN_LIBS) \
- $(SMARTCARD_LIBS) \
- $(SPICE_NONPKGCONFIG_LIBS) \
- $(SSL_LIBS) \
- $(XFIXES_LIBS) \
- $(XRANDR_LIBS) \
- $(Z_LIBS) \
- $(XINERAMA_LIBS) \
- $(spicec_resource_LDADD) \
- $(NULL)
-
-EXTRA_DIST = \
- glz_decode_tmpl.c \
- x11/images/red_icon.c \
- x11/images/alt_image.c \
- gui/commonv2c.ttf.c \
- gui/commonwealth-10.font.c \
- gui/dejavu_sans-10.font.c \
- gui/dejavu_sans.ttf.c \
- gui/taharez_look.imageset.c \
- gui/taharez_look.looknfeel.c \
- gui/taharez_look.scheme.c \
- gui/taharez_look.tga.c \
- $(NULL)
diff --git a/client/application.cpp b/client/application.cpp
deleted file mode 100644
index cdce86d7..00000000
--- a/client/application.cpp
+++ /dev/null
@@ -1,2685 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-#ifdef WIN32
-#include <io.h>
-#endif
-
-#include "common/quic.h"
-#include "common/mutex.h"
-#include "common/rect.h"
-
-#include "application.h"
-#include "screen.h"
-#include "utils.h"
-#include "debug.h"
-#include "screen_layer.h"
-#include "monitor.h"
-#include "resource.h"
-#ifdef WIN32
-#include "red_gdi_canvas.h"
-#endif
-#include "platform.h"
-#include "red_sw_canvas.h"
-#ifdef USE_OPENGL
-#include "red_gl_canvas.h"
-#endif
-#include "cmd_line_parser.h"
-#ifdef USE_GUI
-#include "gui/gui.h"
-#endif
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-
-#ifdef USE_SMARTCARD
-#include <smartcard_channel.h>
-#endif
-
-#define STICKY_KEY_PIXMAP ALT_IMAGE_RES_ID
-#define STICKY_KEY_TIMEOUT 750
-
-#define CA_FILE_NAME "spice_truststore.pem"
-
-static const char* app_name = "spicec";
-
-void ConnectedEvent::response(AbstractProcessLoop& events_loop)
-{
- static_cast<Application*>(events_loop.get_owner())->on_connected();
-}
-
-void DisconnectedEvent::response(AbstractProcessLoop& events_loop)
-{
- Application* app = static_cast<Application*>(events_loop.get_owner());
- app->on_disconnected(_error_code);
-}
-
-void VisibilityEvent::response(AbstractProcessLoop& events_loop)
-{
- Application* app = static_cast<Application*>(events_loop.get_owner());
- app->on_visibility_start(_screen_id);
-}
-
-void MonitorsQuery::do_response(AbstractProcessLoop& events_loop)
-{
- Monitor* mon;
- int i = 0;
-
- while ((mon = (static_cast<Application*>(events_loop.get_owner()))->find_monitor(i++))) {
- MonitorInfo info;
- info.size = mon->get_size();
- info.depth = 32;
- info.position = mon->get_position();
- _monitors.push_back(info);
- }
-}
-
-SwitchHostEvent::SwitchHostEvent(const char* host, int port, int sport, const char* cert_subject)
-{
- _host = host;
- _port = port;
- _sport = sport;
- if (cert_subject) {
- _cert_subject = cert_subject;
- }
-}
-
-void SwitchHostEvent::response(AbstractProcessLoop& events_loop)
-{
- Application* app = static_cast<Application*>(events_loop.get_owner());
- app->switch_host(_host, _port, _sport, _cert_subject);
-}
-
-#ifdef USE_GUI
-//todo: add inactive visual appearance
-class GUIBarrier: public ScreenLayer {
-public:
- GUIBarrier(int id)
- : ScreenLayer(SCREEN_LAYER_GUI_BARIER, true)
- , _id (id)
- , _cursor (Platform::create_inactive_cursor())
- {
- }
-
- ~GUIBarrier()
- {
- detach();
- }
-
- int get_id() { return _id;}
-
- void attach(RedScreen& in_screen)
- {
- if (screen()) {
- ASSERT(&in_screen == screen())
- return;
- }
- in_screen.attach_layer(*this);
- }
-
- void detach()
- {
- if (!screen()) {
- return;
- }
- screen()->detach_layer(*this);
- }
-
- virtual bool pointer_test(int x, int y) { return true;}
- virtual void on_pointer_enter(int x, int y, unsigned int buttons_state)
- {
- AutoRef<LocalCursor> cursor(Platform::create_inactive_cursor());
- screen()->set_cursor(*cursor);
- return;
- }
-
-private:
- int _id;
- AutoRef<LocalCursor> _cursor;
-};
-
-class GUITimer: public Timer {
-public:
- GUITimer(GUI& gui)
- : _gui (gui)
- {
- }
-
- virtual void response(AbstractProcessLoop& events_loop)
- {
- _gui.idle();
- }
-
-private:
- GUI& _gui;
-};
-
-
-#ifdef GUI_DEMO
-class TestTimer: public Timer {
-public:
- TestTimer(Application& app)
- : _app (app)
- {
- }
-
- virtual void response(AbstractProcessLoop& events_loop)
- {
- _app.message_box_test();
- }
-
-private:
- Application& _app;
-};
-#endif
-
-#endif // USE_GUI
-
-class InfoLayer: public ScreenLayer {
-public:
- InfoLayer();
-
- virtual void copy_pixels(const QRegion& dest_region, RedDrawable& dest_dc);
-
- void set_info_mode();
- void set_sticky(bool is_on);
- virtual void on_size_changed();
-
-private:
- void draw_info(const QRegion& dest_region, RedDrawable& dest);
- void update_sticky_rect();
-
-private:
- AlphaImageFromRes _sticky_pixmap;
- SpicePoint _sticky_pos;
- SpiceRect _sticky_rect;
- bool _sticky_on;
- RecurciveMutex _update_lock;
-};
-
-InfoLayer::InfoLayer()
- : ScreenLayer(SCREEN_LAYER_INFO, false)
- , _sticky_pixmap (STICKY_KEY_PIXMAP)
- , _sticky_on (false)
-{
-}
-
-void InfoLayer::draw_info(const QRegion& dest_region, RedDrawable& dest)
-{
- pixman_box32_t *rects;
- int num_rects;
-
- rects = pixman_region32_rectangles((pixman_region32_t *)&dest_region, &num_rects);
- for (int i = 0; i < num_rects; i++) {
- SpiceRect r;
-
- r.left = rects[i].x1;
- r.top = rects[i].y1;
- r.right = rects[i].x2;
- r.bottom = rects[i].y2;
-
- /* is rect inside sticky region ? */
- if (_sticky_on && rect_intersects(r, _sticky_rect)) {
- dest.blend_pixels(_sticky_pixmap, r.left - _sticky_pos.x, r.top - _sticky_pos.y, r);
- }
- }
-}
-
-void InfoLayer::copy_pixels(const QRegion& dest_region, RedDrawable& dest_dc)
-{
- RecurciveLock lock(_update_lock);
- draw_info(dest_region, dest_dc);
-}
-
-void InfoLayer::set_info_mode()
-{
- ASSERT(screen());
-
- clear_area();
- update_sticky_rect();
- set_sticky(_sticky_on);
-}
-
-void InfoLayer::update_sticky_rect()
-{
- SpicePoint size = _sticky_pixmap.get_size();
- SpicePoint screen_size = screen()->get_size();
-
- _sticky_pos.x = (screen_size.x - size.x) / 2;
- _sticky_pos.y = screen_size.y * 2 / 3;
- _sticky_rect.left = _sticky_pos.x;
- _sticky_rect.top = _sticky_pos.y;
- _sticky_rect.right = _sticky_rect.left + size.x;
- _sticky_rect.bottom = _sticky_rect.top + size.y;
-}
-
-void InfoLayer::set_sticky(bool is_on)
-{
- RecurciveLock lock(_update_lock);
- if (!_sticky_on && !is_on) {
- return;
- }
-
- _sticky_on = is_on;
-
- if (_sticky_on) {
- add_rect_area(_sticky_rect);
- invalidate(_sticky_rect);
- } else {
- remove_rect_area(_sticky_rect);
- }
-}
-
-void InfoLayer::on_size_changed()
-{
- set_info_mode();
-}
-
-void StickyKeyTimer::response(AbstractProcessLoop& events_loop)
-{
- Application* app = (Application*)events_loop.get_owner();
- StickyInfo* sticky_info = &app->_sticky_info;
- ASSERT(app->is_sticky_trace_key(sticky_info->key));
- ASSERT(app->_keyboard_state[sticky_info->key]);
- ASSERT(sticky_info->key_first_down);
- ASSERT(sticky_info->key_down);
- sticky_info->sticky_mode = true;
- DBG(0, "ON sticky");
- app->_info_layer->set_sticky(true);
- app->deactivate_interval_timer(this);
-}
-
-static MouseHandler default_mouse_handler;
-static KeyHandler default_key_handler;
-
-enum AppCommands {
- APP_CMD_INVALID,
- APP_CMD_SEND_CTL_ALT_DEL,
- APP_CMD_TOGGLE_FULL_SCREEN,
- APP_CMD_RELEASE_CAPTURE,
- APP_CMD_SEND_TOGGLE_KEYS,
- APP_CMD_SEND_RELEASE_KEYS,
- APP_CMD_SEND_CTL_ALT_END,
-#ifdef RED_DEBUG
- APP_CMD_CONNECT,
- APP_CMD_DISCONNECT,
-#endif
-#ifdef USE_GUI
- APP_CMD_SHOW_GUI,
-#endif // USE_GUI
-#ifdef USE_SMARTCARD
- APP_CMD_SMARTCARD_INSERT,
- APP_CMD_SMARTCARD_REMOVE,
-#endif
- APP_CMD_EXTERNAL_BEGIN = 0x400,
- APP_CMD_EXTERNAL_END = 0x800,
-};
-
-Application::Application()
- : ProcessLoop (this)
- , _client (*this)
- , _con_ciphers ("DEFAULT")
- , _enabled_channels (SPICE_END_CHANNEL, true)
- , _main_screen (NULL)
- , _active (false)
- , _full_screen (false)
- , _changing_screens (false)
- , _out_of_sync (false)
- , _exit_code (0)
- , _active_screen (NULL)
- , _num_keys_pressed (0)
- , _info_layer (new InfoLayer())
- , _key_handler (&default_key_handler)
- , _mouse_handler (&default_mouse_handler)
- , _monitors (NULL)
- , _title ("SPICEc:%d")
- , _sys_key_intercept_mode (false)
- , _enable_controller (false)
-#ifdef USE_GUI
- , _gui_mode (GUI_MODE_FULL)
-#endif // USE_GUI
- , _during_host_switch(false)
- , _state (DISCONNECTED)
-#ifdef USE_SMARTCARD
- , _smartcard_options(new SmartcardOptions())
-#endif
-{
- DBG(0, "");
-
- _commands_map["toggle-fullscreen"] = APP_CMD_TOGGLE_FULL_SCREEN;
- _commands_map["release-cursor"] = APP_CMD_RELEASE_CAPTURE;
-#ifdef RED_DEBUG
- _commands_map["connect"] = APP_CMD_CONNECT;
- _commands_map["disconnect"] = APP_CMD_DISCONNECT;
-#endif
-#ifdef USE_GUI
- _commands_map["show-gui"] = APP_CMD_SHOW_GUI;
-#endif // USE_GUI
-#ifdef USE_SMARTCARD
- _commands_map["smartcard-insert"] = APP_CMD_SMARTCARD_INSERT;
- _commands_map["smartcard-remove"] = APP_CMD_SMARTCARD_REMOVE;
-#endif
-
- _canvas_types.resize(1);
-#ifdef WIN32
- _canvas_types[0] = CANVAS_OPTION_GDI;
-#else
- _canvas_types[0] = CANVAS_OPTION_SW;
-#endif
-
- _host_auth_opt.type_flags = SPICE_SSL_VERIFY_OP_HOSTNAME;
-
- Platform::get_app_data_dir(_host_auth_opt.CA_file, app_name);
- Platform::path_append(_host_auth_opt.CA_file, CA_FILE_NAME);
-
- this->set_default_hotkeys();
-
- _sticky_info.trace_is_on = false;
- _sticky_info.sticky_mode = false;
- _sticky_info.key_first_down = false;
- _sticky_info.key_down = false;
- _sticky_info.key = REDKEY_INVALID;
- _sticky_info.timer.reset(new StickyKeyTimer());
-
- for (int i = SPICE_CHANNEL_MAIN; i < SPICE_END_CHANNEL; i++) {
- _peer_con_opt[i] = RedPeer::ConnectionOptions::CON_OP_BOTH;
- }
- memset(_keyboard_state, 0, sizeof(_keyboard_state));
-}
-
-Application::~Application()
-{
-#ifdef USE_GUI
- if (*_gui_timer != NULL) {
- deactivate_interval_timer(*_gui_timer);
- }
-#ifdef GUI_DEMO
- if (*_gui_test_timer != NULL) {
- deactivate_interval_timer(*_gui_test_timer);
- }
-#endif
- destroyed_gui_barriers();
- if (_gui.get() != NULL) {
- _gui->set_screen(NULL);
- }
-#endif // USE_GUI
-
- if (_info_layer->screen()) {
- _main_screen->detach_layer(*_info_layer);
- }
-
- if (_main_screen != NULL) {
- _main_screen->unref();
- destroy_monitors();
- }
-#ifdef USE_SMARTCARD
- delete _smartcard_options;
-#endif
-}
-
-void Application::init_menu()
-{
- //fixme: menu items name need to be dynamically updated by hot keys configuration.
- AutoRef<Menu> root_menu(new Menu(*this, ""));
- (*root_menu)->add_command("Send Ctrl+Alt+Del\tCtrl+Alt+End", APP_CMD_SEND_CTL_ALT_DEL);
- (*root_menu)->add_command("Toggle full screen\tShift+F11", APP_CMD_TOGGLE_FULL_SCREEN);
- AutoRef<Menu> key_menu(new Menu(*this, "Special keys"));
- (*key_menu)->add_command("Send Shift+F11", APP_CMD_SEND_TOGGLE_KEYS);
- (*key_menu)->add_command("Send Shift+F12", APP_CMD_SEND_RELEASE_KEYS);
- (*key_menu)->add_command("Send Ctrl+Alt+End", APP_CMD_SEND_CTL_ALT_END);
- (*root_menu)->add_sub(key_menu.release());
- _app_menu.reset(root_menu.release());
-}
-
-void Application::__remove_key_handler(KeyHandler& handler)
-{
- KeyHandlersStack::iterator iter = _key_handlers.begin();
-
- for (; iter != _key_handlers.end(); iter++) {
- if (*iter == &handler) {
- _key_handlers.erase(iter);
- return;
- }
- }
-}
-
-void Application::set_key_handler(KeyHandler& handler)
-{
- if (&handler == _key_handler) {
- return;
- }
-
- __remove_key_handler(handler);
- if (!_key_handler->permit_focus_loss()) {
- _key_handlers.push_front(&handler);
- return;
- }
-
- unpress_all();
- if (_active) {
- _key_handler->on_focus_out();
- }
-
- _key_handlers.push_front(_key_handler);
- _key_handler = &handler;
- if (_active) {
- _key_handler->on_focus_in();
- }
-}
-
-void Application::remove_key_handler(KeyHandler& handler)
-{
- bool is_current = (&handler == _key_handler);
-
- if (!is_current) {
- __remove_key_handler(handler);
- return;
- }
-
- KeyHandler damy_handler;
- _key_handler = &damy_handler;
- set_key_handler(**_key_handlers.begin());
- __remove_key_handler(damy_handler);
-}
-
-void Application::set_mouse_handler(MouseHandler& handler)
-{
- _mouse_handler = &handler;
-}
-
-void Application::remove_mouse_handler(MouseHandler& handler)
-{
- if (_mouse_handler != &handler) {
- return;
- }
- _mouse_handler = &default_mouse_handler;
-}
-
-void Application::capture_mouse()
-{
- if (!_active_screen
-#ifdef USE_GUI
- || _gui->screen()
-#endif // USE_GUI
- ) {
- return;
- }
- _active_screen->capture_mouse();
-}
-
-void Application::release_mouse_capture()
-{
- if (!_active_screen || !_active_screen->is_mouse_captured()) {
- return;
- }
- _active_screen->relase_mouse();
-}
-
-void Application::abort()
-{
- Platform::set_event_listener(NULL);
- Platform::set_display_mode_listner(NULL);
- unpress_all();
- while (!_client.abort()) {
- ProcessLoop::process_events_queue();
- Platform::msleep(100);
- }
-}
-
-class AutoAbort {
-public:
- AutoAbort(Application& app) : _app(app) {}
- ~AutoAbort() { _app.abort();}
-
-private:
- Application& _app;
-};
-
-void Application::connect()
-{
- ASSERT(_state == DISCONNECTED);
- set_state(CONNECTING);
- _client.connect();
-}
-
-void Application::switch_host(const std::string& host, int port, int sport,
- const std::string& cert_subject)
-{
- LOG_INFO("host=%s port=%d sport=%d", host.c_str(), port, sport);
- _during_host_switch = true;
- // we will try to connect to the new host when DiconnectedEvent occurs
- do_disconnect();
- _client.set_target(host.c_str(), port, sport);
-
- if (!cert_subject.empty()) {
- set_host_cert_subject(cert_subject.c_str(), "spicec");
- }
-}
-
-int Application::run()
-{
- _exit_code = ProcessLoop::run();
- return _exit_code;
-}
-
-void Application::on_start_running()
-{
- _foreign_menu.reset(new ForeignMenu(this, _active));
- if (_enable_controller) {
- _controller.reset(new Controller(this));
- return;
- }
- //FIXME: _client.connect() or use the following instead?
-#ifdef USE_GUI
- if (_gui_mode == GUI_MODE_FULL) {
- show_gui();
- return;
- }
-#endif // HAVE_GUI
- connect();
-}
-
-RedScreen* Application::find_screen(int id)
-{
- if ((int)_screens.size() < id + 1) {
- return NULL;
- }
- return _screens[id];
-}
-
-bool Application::release_capture()
-{
- unpress_all();
- if (!_active_screen || !_active_screen->is_mouse_captured()) {
- return false;
- }
- _active_screen->relase_mouse();
- return true;
-}
-
-bool Application::do_connect()
-{
- _client.connect();
- return true;
-}
-
-bool Application::do_disconnect()
-{
- on_disconnecting();
- _client.disconnect();
- return true;
-}
-
-#define SCREEN_INIT_WIDTH 800
-#define SCREEN_INIT_HEIGHT 600
-
-RedScreen* Application::get_screen(int id)
-{
- RedScreen *screen;
-
- if ((int)_screens.size() < id + 1) {
- _screens.resize(id + 1);
- }
-
- if (!(screen = _screens[id])) {
- Monitor* mon = find_monitor(id);
- SpicePoint size = {SCREEN_INIT_WIDTH, SCREEN_INIT_HEIGHT};
-
- if (_full_screen && mon) {
- size = mon->get_size();
- }
- screen = _screens[id] = new RedScreen(*this, id, _title, size.x, size.y);
-#ifdef USE_GUI
- create_gui_barrier(*screen, id);
-#endif // USE_GUI
-
- if (id != 0) {
- if (_full_screen) {
- mon = get_monitor(id);
- screen->set_monitor(mon);
- rearrange_monitors(false, true, screen);
- } else {
- screen->show(false, _main_screen);
- }
- }
- } else {
- screen = screen->ref();
- }
-
- return screen;
-}
-
-#ifdef USE_GUI
-void Application::attach_gui_barriers()
-{
- GUIBarriers::iterator iter = _gui_barriers.begin();
-
- for (; iter != _gui_barriers.end(); iter++) {
- GUIBarrier* barrier = *iter;
- ASSERT((int)_screens.size() > barrier->get_id() && _screens[barrier->get_id()]);
- barrier->attach(*_screens[barrier->get_id()]);
- }
-}
-
-void Application::detach_gui_barriers()
-{
- GUIBarriers::iterator iter = _gui_barriers.begin();
-
- for (; iter != _gui_barriers.end(); iter++) {
- GUIBarrier* barrier = *iter;
- barrier->detach();
- }
-}
-
-void Application::create_gui_barrier(RedScreen& screen, int id)
-{
- GUIBarrier* barrier = new GUIBarrier(id);
- _gui_barriers.push_front(barrier);
- if (_gui.get() && _gui->screen()) {
- barrier->attach(screen);
- }
-}
-
-void Application::destroyed_gui_barriers()
-{
- while (_gui_barriers.begin() != _gui_barriers.end()) {
- GUIBarrier* barrier = *_gui_barriers.begin();
- _gui_barriers.erase(_gui_barriers.begin());
- delete barrier;
- }
-}
-
-void Application::destroyed_gui_barrier(int id)
-{
- GUIBarriers::iterator iter = _gui_barriers.begin();
-
- for (; iter != _gui_barriers.end(); iter++) {
- GUIBarrier* barrier = *iter;
- if (barrier->get_id() == id) {
- _gui_barriers.erase(iter);
- delete barrier;
- return;
- }
- }
-}
-#endif // USE_GUI
-
-void Application::on_screen_destroyed(int id, bool was_captured)
-{
- bool reposition = false;
-
-#ifdef USE_GUI
- destroyed_gui_barrier(id);
-#endif // USE_GUI
-
- if ((int)_screens.size() < id + 1 || !_screens[id]) {
- THROW("no screen");
- }
- if (_active_screen == _screens[id]) {
- _active_screen = NULL;
- }
-
- if (_full_screen && _screens[id]->has_monitor()) {
- _screens[id]->get_monitor()->restore();
- reposition = true;
- }
- _screens[id] = NULL;
- if (reposition) {
- rearrange_monitors(was_captured, false);
- }
-}
-
-void Application::on_mouse_motion(int dx, int dy, int buttons_state)
-{
- _mouse_handler->on_mouse_motion(dx, dy, buttons_state);
-}
-
-void Application::on_mouse_down(int button, int buttons_state)
-{
- _mouse_handler->on_mouse_down(button, buttons_state);
-}
-
-void Application::on_mouse_up(int button, int buttons_state)
-{
- _mouse_handler->on_mouse_up(button, buttons_state);
-}
-
-void Application::unpress_all()
-{
- reset_sticky();
- for (int i = 0; i < REDKEY_NUM_KEYS; i++) {
- if (_keyboard_state[i]) {
- _key_handler->on_key_up((RedKey)i);
- unpress_key((RedKey)i);
- }
- }
-}
-
-void Application::set_state(State state)
-{
- if (state == _state) {
- return;
- }
- _state = state;
-#ifdef USE_GUI
- _gui->set_state(_state);
- if (_gui->screen() && !_gui->is_visible()) {
- hide_gui();
- }
-#endif // USE_GUI
- reset_sticky();
-}
-
-void Application::on_connected()
-{
- _during_host_switch = false;
-
- set_state(CONNECTED);
-}
-
-void Application::on_disconnected(int error_code)
-{
- bool host_switch = _during_host_switch && (error_code == SPICEC_ERROR_CODE_SUCCESS);
- if (
-#ifdef USE_GUI
- _gui_mode != GUI_MODE_FULL &&
-#endif // USE_GUI
- !host_switch) {
- _during_host_switch = false;
- ProcessLoop::quit(error_code);
- return;
- }
-
- // todo: display special notification for host switch (during migration)
- set_state(DISCONNECTED);
-#ifdef USE_GUI
- show_gui();
-#endif
- if (host_switch) {
- _client.connect(true);
- }
-}
-
-void Application::on_visibility_start(int screen_id)
-{
- if (screen_id) {
- return;
- }
- set_state(VISIBILITY);
-#ifdef USE_GUI
- hide_gui();
-#endif
- show_info_layer();
-}
-
-void Application::on_disconnecting()
-{
- release_capture();
-}
-
-Menu* Application::get_app_menu()
-{
- if (!*_app_menu) {
- return NULL;
- }
- return (*_app_menu)->ref();
-}
-
-void Application::show_info_layer()
-{
- if (_info_layer->screen() || _state != VISIBILITY) {
- return;
- }
-
- _main_screen->attach_layer(*_info_layer);
- _info_layer->set_info_mode();
- reset_sticky();
-}
-
-void Application::hide_info_layer()
-{
- if (!_info_layer->screen()) {
- return;
- }
-
- _main_screen->detach_layer(*_info_layer);
- reset_sticky();
-}
-
-#ifdef GUI_DEMO
-
-class TestResponce: public GUI::BoxResponse {
-public:
- virtual void response(int response)
- {
- DBG(0, "%d", response);
- }
-
- virtual void aborted()
- {
- DBG(0, "");
- }
-};
-
-
-TestResponce response_test;
-
-void Application::message_box_test()
-{
- GUI::ButtonsList list(3);
- list[0].id = 101;
- list[0].text = "Yes";
- list[1].id = 102;
- list[1].text = "No";
- list[2].id = 103;
- list[2].text = "Don't Know";
-
-
- if (!_gui->message_box(GUI::QUESTION, "My question", list, &response_test)) {
- DBG(0, "busy");
- } else {
- show_gui();
- }
-}
-
-#endif
-
-#ifdef USE_GUI
-void Application::show_gui()
-{
- if (_gui->screen() || !_gui->prepare_dialog()) {
- return;
- }
-
- hide_info_layer();
- release_capture();
- _gui->set_screen(_main_screen);
- attach_gui_barriers();
-}
-
-void Application::hide_gui()
-{
- if (!_gui->screen()) {
- return;
- }
-
- _gui->set_screen(NULL);
- detach_gui_barriers();
- show_info_layer();
-}
-#endif // USE_GUI
-
-void Application::do_command(int command)
-{
- switch (command) {
- case APP_CMD_SEND_CTL_ALT_DEL:
- send_alt_ctl_del();
- break;
- case APP_CMD_TOGGLE_FULL_SCREEN:
- toggle_full_screen();
- break;
- case APP_CMD_SEND_TOGGLE_KEYS:
- send_command_hotkey(APP_CMD_SEND_TOGGLE_KEYS);
- break;
- case APP_CMD_SEND_RELEASE_KEYS:
- send_command_hotkey(APP_CMD_SEND_RELEASE_KEYS);
- break;
- case APP_CMD_SEND_CTL_ALT_END:
- send_ctrl_alt_end();
- break;
- case APP_CMD_RELEASE_CAPTURE:
- release_capture();
- break;
-#ifdef RED_DEBUG
- case APP_CMD_CONNECT:
- do_connect();
- break;
- case APP_CMD_DISCONNECT:
- do_disconnect();
- break;
-#endif
-#ifdef USE_GUI
- case APP_CMD_SHOW_GUI:
- show_gui();
- break;
-#endif // USE_GUI
-#ifdef USE_SMARTCARD
- case APP_CMD_SMARTCARD_INSERT:
- virtual_card_insert();
- break;
- case APP_CMD_SMARTCARD_REMOVE:
- virtual_card_remove();
- break;
-#endif
- default:
- AppMenuItemMap::iterator iter = _app_menu_items.find(command);
- ASSERT(iter != _app_menu_items.end());
- AppMenuItem* item = &(*iter).second;
- if (item->type == APP_MENU_ITEM_TYPE_FOREIGN) {
- ASSERT(*_foreign_menu);
- (*_foreign_menu)->on_command(item->conn_ref, item->ext_id);
- } else if (item->type == APP_MENU_ITEM_TYPE_CONTROLLER) {
- ASSERT(*_controller);
- (*_controller)->on_command(item->conn_ref, item->ext_id);
- }
- }
-}
-
-#ifdef REDKEY_DEBUG
-
-static void show_red_key(RedKey key)
-{
-
-#define KEYCASE(red_key) \
- case red_key: \
- DBG(0, #red_key); \
- return;
-
- switch (key) {
- KEYCASE(REDKEY_INVALID);
- KEYCASE(REDKEY_ESCAPE);
- KEYCASE(REDKEY_1);
- KEYCASE(REDKEY_2);
- KEYCASE(REDKEY_3);
- KEYCASE(REDKEY_4);
- KEYCASE(REDKEY_5);
- KEYCASE(REDKEY_6);
- KEYCASE(REDKEY_7);
- KEYCASE(REDKEY_8);
- KEYCASE(REDKEY_9);
- KEYCASE(REDKEY_0);
- KEYCASE(REDKEY_MINUS);
- KEYCASE(REDKEY_EQUALS);
- KEYCASE(REDKEY_BACKSPACE);
- KEYCASE(REDKEY_TAB);
- KEYCASE(REDKEY_Q);
- KEYCASE(REDKEY_W);
- KEYCASE(REDKEY_E);
- KEYCASE(REDKEY_R);
- KEYCASE(REDKEY_T);
- KEYCASE(REDKEY_Y);
- KEYCASE(REDKEY_U);
- KEYCASE(REDKEY_I);
- KEYCASE(REDKEY_O);
- KEYCASE(REDKEY_P);
- KEYCASE(REDKEY_ENTER);
- KEYCASE(REDKEY_L_BRACKET);
- KEYCASE(REDKEY_R_BRACKET);
- KEYCASE(REDKEY_L_CTRL);
- KEYCASE(REDKEY_A);
- KEYCASE(REDKEY_S);
- KEYCASE(REDKEY_D);
- KEYCASE(REDKEY_F);
- KEYCASE(REDKEY_G);
- KEYCASE(REDKEY_H);
- KEYCASE(REDKEY_J);
- KEYCASE(REDKEY_K);
- KEYCASE(REDKEY_L);
- KEYCASE(REDKEY_SEMICOLON);
- KEYCASE(REDKEY_QUOTE);
- KEYCASE(REDKEY_BACK_QUOTE);
- KEYCASE(REDKEY_L_SHIFT);
- KEYCASE(REDKEY_BACK_SLASH);
- KEYCASE(REDKEY_Z);
- KEYCASE(REDKEY_X);
- KEYCASE(REDKEY_C);
- KEYCASE(REDKEY_V);
- KEYCASE(REDKEY_B);
- KEYCASE(REDKEY_N);
- KEYCASE(REDKEY_M);
- KEYCASE(REDKEY_COMMA);
- KEYCASE(REDKEY_PERIOD);
- KEYCASE(REDKEY_SLASH);
- KEYCASE(REDKEY_R_SHIFT);
- KEYCASE(REDKEY_PAD_MULTIPLY);
- KEYCASE(REDKEY_L_ALT);
- KEYCASE(REDKEY_SPACE);
- KEYCASE(REDKEY_CAPS_LOCK);
- KEYCASE(REDKEY_F1);
- KEYCASE(REDKEY_F2);
- KEYCASE(REDKEY_F3);
- KEYCASE(REDKEY_F4);
- KEYCASE(REDKEY_F5);
- KEYCASE(REDKEY_F6);
- KEYCASE(REDKEY_F7);
- KEYCASE(REDKEY_F8);
- KEYCASE(REDKEY_F9);
- KEYCASE(REDKEY_F10);
- KEYCASE(REDKEY_NUM_LOCK);
- KEYCASE(REDKEY_SCROLL_LOCK);
- KEYCASE(REDKEY_PAD_7);
- KEYCASE(REDKEY_PAD_8);
- KEYCASE(REDKEY_PAD_9);
- KEYCASE(REDKEY_PAD_MINUS);
- KEYCASE(REDKEY_PAD_4);
- KEYCASE(REDKEY_PAD_5);
- KEYCASE(REDKEY_PAD_6);
- KEYCASE(REDKEY_PAD_PLUS);
- KEYCASE(REDKEY_PAD_1);
- KEYCASE(REDKEY_PAD_2);
- KEYCASE(REDKEY_PAD_3);
- KEYCASE(REDKEY_PAD_0);
- KEYCASE(REDKEY_PAD_POINT);
- KEYCASE(REDKEY_F11);
- KEYCASE(REDKEY_F12);
- KEYCASE(REDKEY_PAD_ENTER);
- KEYCASE(REDKEY_R_CTRL);
- KEYCASE(REDKEY_FAKE_L_SHIFT);
- KEYCASE(REDKEY_PAD_DIVIDE);
- KEYCASE(REDKEY_FAKE_R_SHIFT);
- KEYCASE(REDKEY_CTRL_PRINT_SCREEN);
- KEYCASE(REDKEY_R_ALT);
- KEYCASE(REDKEY_CTRL_BREAK);
- KEYCASE(REDKEY_HOME);
- KEYCASE(REDKEY_UP);
- KEYCASE(REDKEY_PAGEUP);
- KEYCASE(REDKEY_LEFT);
- KEYCASE(REDKEY_RIGHT);
- KEYCASE(REDKEY_END);
- KEYCASE(REDKEY_DOWN);
- KEYCASE(REDKEY_PAGEDOWN);
- KEYCASE(REDKEY_INSERT);
- KEYCASE(REDKEY_DELETE);
- KEYCASE(REDKEY_LEFT_CMD);
- KEYCASE(REDKEY_RIGHT_CMD);
- KEYCASE(REDKEY_MENU);
- default:
- DBG(0, "???");
- }
-}
-
-#endif
-
-bool Application::press_key(RedKey key)
-{
- if (_keyboard_state[key]) {
- return true;
- } else {
- _keyboard_state[key] = true;
- _num_keys_pressed++;
- return false;
- }
-}
-
-bool Application::unpress_key(RedKey key)
-{
- ASSERT(!_sticky_info.key_down || !is_sticky_trace_key(key));
-
- if (_keyboard_state[key]) {
- _keyboard_state[key] = false;
- _num_keys_pressed--;
- ASSERT(_num_keys_pressed >= 0);
- return true;
- } else {
- return false;
- }
-}
-
-inline bool Application::is_sticky_trace_key(RedKey key)
-{
- return ((key == REDKEY_L_ALT) || (key == REDKEY_R_ALT));
-}
-
-void Application::reset_sticky()
-{
- _sticky_info.trace_is_on = (_state == VISIBILITY) && _sys_key_intercept_mode;
- _sticky_info.key_first_down = false;
- deactivate_interval_timer(*_sticky_info.timer);
- if (_sticky_info.sticky_mode) {
- ASSERT(_keyboard_state[_sticky_info.key]);
- // if it is physically down, we shouldn't unpress it
- if (!_sticky_info.key_down) {
- do_on_key_up(_sticky_info.key);
- }
- _sticky_info.sticky_mode = false;
- DBG(0, "OFF sticky");
- _info_layer->set_sticky(false);
- }
- _sticky_info.key_down = false;
-
- _sticky_info.key = REDKEY_INVALID;
-}
-
-struct ModifierKey {
- int modifier;
- RedKey key;
-};
-
-ModifierKey modifier_keys[] = {
- {Platform::L_SHIFT_MODIFIER, REDKEY_L_SHIFT},
- {Platform::R_SHIFT_MODIFIER, REDKEY_R_SHIFT},
- {Platform::L_CTRL_MODIFIER, REDKEY_L_CTRL},
- {Platform::R_CTRL_MODIFIER, REDKEY_R_CTRL},
- {Platform::L_ALT_MODIFIER, REDKEY_L_ALT},
- {Platform::R_ALT_MODIFIER, REDKEY_R_ALT},
-};
-
-void Application::sync_keyboard_modifiers()
-{
- uint32_t modifiers = Platform::get_keyboard_modifiers();
- for (size_t i = 0; i < sizeof(modifier_keys) / sizeof(modifier_keys[0]); i++) {
- if (modifiers & modifier_keys[i].modifier) {
- on_key_down(modifier_keys[i].key);
- } else {
- on_key_up(modifier_keys[i].key);
- }
- }
-}
-
-void Application::on_key_down(RedKey key)
-{
- if (key <= 0 || key >= REDKEY_NUM_KEYS) {
- return;
- }
-
- bool was_pressed = press_key(key);
- if (_sticky_info.trace_is_on) {
- if (key == _sticky_info.key) {
- _sticky_info.key_down = true;
- }
-
- if (!_sticky_info.sticky_mode) {
- // during tracing (traced key was pressed and no keyboard event has occurred till now)
- if (_sticky_info.key_first_down) {
- ASSERT(_sticky_info.key != REDKEY_INVALID);
- if (key != _sticky_info.key) {
- reset_sticky();
- }
- } else if (is_sticky_trace_key(key) && (_num_keys_pressed == 1) && !was_pressed) {
- ASSERT(_sticky_info.key == REDKEY_INVALID);
- // start tracing
- _sticky_info.key = key;
- _sticky_info.key_first_down = true;
- _sticky_info.key_down = true;
- activate_interval_timer(*_sticky_info.timer, STICKY_KEY_TIMEOUT);
- }
- }
- }
-
- if (!_sticky_info.sticky_mode) {
- int command = get_hotkeys_command();
- if (command != APP_CMD_INVALID) {
- do_command(command);
- return;
- }
- }
-
-#ifdef WIN32
- if (!_active_screen->intercepts_sys_key() &&
- (key == REDKEY_LEFT_CMD || key == REDKEY_RIGHT_CMD ||
- key == REDKEY_MENU || _keyboard_state[REDKEY_L_ALT])) {
- unpress_key(key);
- return;
- }
- if (!_sticky_info.sticky_mode &&
- ((_keyboard_state[REDKEY_L_CTRL] || _keyboard_state[REDKEY_R_CTRL]) &&
- (_keyboard_state[REDKEY_L_ALT] || _keyboard_state[REDKEY_R_ALT]))) {
- if (key == REDKEY_END || key == REDKEY_PAD_1) {
- unpress_key(key);
- _key_handler->on_key_down(REDKEY_DELETE);
- _key_handler->on_key_up(REDKEY_DELETE);
- } else if (key == REDKEY_DELETE || key == REDKEY_PAD_POINT) {
- unpress_key(key);
- return;
- }
- }
-#endif
-
- _key_handler->on_key_down(key);
-}
-
-void Application::do_on_key_up(RedKey key)
-{
- unpress_key(key);
- _key_handler->on_key_up(key);
-}
-
-void Application::on_key_up(RedKey key)
-{
- if(key < 0 || key >= REDKEY_NUM_KEYS || !_keyboard_state[key]) {
- return;
- }
-
- if (_sticky_info.trace_is_on) {
- ASSERT(_sticky_info.sticky_mode || (key == _sticky_info.key) ||
- (_sticky_info.key == REDKEY_INVALID));
- if (key == _sticky_info.key) {
- _sticky_info.key_down = false;
- if (_sticky_info.key_first_down) {
- _sticky_info.key_first_down = false;
- if (!_sticky_info.sticky_mode) {
- reset_sticky();
- } else {
- return; // ignore the sticky-key first release
- }
- }
- }
-
- if (_sticky_info.sticky_mode) {
- RedKey old_sticky_key = _sticky_info.key;
- reset_sticky();
- if (key == old_sticky_key) {
- return; // no need to send key_up twice
- }
- }
- }
-
- do_on_key_up(key);
-}
-
-void Application::on_char(uint32_t ch)
-{
- _key_handler->on_char(ch);
-}
-
-void Application::on_deactivate_screen(RedScreen* screen)
-{
- if (_active_screen == screen) {
- _sys_key_intercept_mode = false;
- release_capture();
- _active_screen = NULL;
- }
-}
-
-void Application::on_activate_screen(RedScreen* screen)
-{
- ASSERT(!_active_screen || (_active_screen == screen));
- _active_screen = screen;
- sync_keyboard_modifiers();
-}
-
-void Application::on_start_screen_key_interception(RedScreen* screen)
-{
- ASSERT(screen == _active_screen);
-
- _sys_key_intercept_mode = true;
- reset_sticky();
-}
-
-void Application::on_stop_screen_key_interception(RedScreen* screen)
-{
- ASSERT(screen == _active_screen);
-
- _sys_key_intercept_mode = false;
- reset_sticky();
-}
-
-void Application::on_app_activated()
-{
- _active = true;
- _key_handler->on_focus_in();
- if (*_foreign_menu) {
- (*_foreign_menu)->on_activate();
- }
-}
-
-void Application::on_app_deactivated()
-{
- _active = false;
- _key_handler->on_focus_out();
- if (*_foreign_menu) {
- (*_foreign_menu)->on_deactivate();
- }
-#ifdef WIN32
- if (!_changing_screens) {
- exit_full_screen();
- }
-#endif
-}
-
-void Application::on_screen_unlocked(RedScreen& screen)
-{
- if (_full_screen) {
- return;
- }
-
- screen.resize(SCREEN_INIT_WIDTH, SCREEN_INIT_HEIGHT);
-}
-
-void Application::rearrange_monitors(bool force_capture,
- bool enter_full_screen,
- RedScreen* screen,
- std::vector<SpicePoint> *sizes)
-{
- bool capture;
- bool toggle_full_screen;
-
- if (!_full_screen && !enter_full_screen) {
- return;
- }
-
- toggle_full_screen = enter_full_screen && !screen;
- capture = release_capture();
-#ifndef WIN32
- if (toggle_full_screen) {
- /* performing hide during resolution changes resulted in
- missing WM_KEYUP events */
- hide();
- }
-#endif
- prepare_monitors(sizes);
- position_screens();
- if (enter_full_screen) {
- // toggling to full screen
- if (toggle_full_screen) {
- show_full_screen();
- _main_screen->activate();
-
- } else { // already in full screen mode and a new screen is displayed
- screen->show_full_screen();
- if (screen->is_out_of_sync()) {
- _out_of_sync = true;
- /* If the client monitor cannot handle the guest resolution
- drop back to windowed mode */
- exit_full_screen();
- }
- }
- }
-
- if (force_capture || capture) {
- if (!toggle_full_screen) {
- _main_screen->activate();
- }
- _main_screen->capture_mouse();
- }
-}
-
-Monitor* Application::find_monitor(int id)
-{
- ASSERT(_monitors);
- std::list<Monitor*>::const_iterator iter = _monitors->begin();
- for (; iter != _monitors->end(); iter++) {
- Monitor *mon = *iter;
- if (mon->get_id() == id) {
- return mon;
- }
- }
- return NULL;
-}
-
-Monitor* Application::get_monitor(int id)
-{
- Monitor *mon = find_monitor(id);
- if ((mon = find_monitor(id))) {
- mon->set_used();
- }
- return mon;
-}
-
-void Application::assign_monitors()
-{
- for (int i = 0; i < (int)_screens.size(); i++) {
- if (_screens[i]) {
- ASSERT(!_screens[i]->has_monitor());
- _screens[i]->set_monitor(get_monitor(i));
- }
- }
-}
-
-void Application::prepare_monitors(std::vector<SpicePoint> *sizes)
-{
- //todo: test match of monitors size/position against real world size/position
- for (int i = 0; i < (int)_screens.size(); i++) {
- Monitor* mon;
- if (_screens[i] && (mon = _screens[i]->get_monitor())) {
- if (_screens[i]->is_size_locked()) {
- if (sizes) {
- mon->set_mode((*sizes)[i].x, (*sizes)[i].y);
- } else {
- SpicePoint size = _screens[i]->get_size();
- mon->set_mode(size.x, size.y);
- }
- } else {
- SpicePoint size = mon->get_size();
- _screens[i]->resize(size.x, size.y);
- }
- }
- }
-}
-
-void Application::restore_monitors()
-{
- //todo: renew monitors (destroy + init)
- std::list<Monitor*>::const_iterator iter = _monitors->begin();
- for (; iter != _monitors->end(); iter++) {
- (*iter)->restore();
- }
-}
-
-void Application::position_screens()
-{
- for (int i = 0; i < (int)_screens.size(); i++) {
- Monitor* mon;
- if (_screens[i] && (mon = _screens[i]->get_monitor())) {
- _screens[i]->position_full_screen(mon->get_position());
- }
- }
-}
-
-void Application::hide()
-{
- for (int i = 0; i < (int)_screens.size(); i++) {
- if (_screens[i]) {
- _screens[i]->hide();
- }
- }
-}
-
-void Application::show()
-{
- for (int i = 0; i < (int)_screens.size(); i++) {
- if (_screens[i]) {
- _screens[i]->show();
- }
- }
-}
-
-void Application::external_show()
-{
- DBG(0, "Entry, _screens.size()=%lu", _screens.size());
- for (size_t i = 0; i < _screens.size(); ++i) {
- DBG(0, "%lu", i);
- if (_screens[i]) {
- _screens[i]->external_show();
- }
- }
-}
-
-void Application::show_full_screen()
-{
- for (int i = 0; i < (int)_screens.size(); i++) {
- if (_screens[i]) {
- _screens[i]->show_full_screen();
- if (_screens[i]->is_out_of_sync()) {
- _out_of_sync = true;
- }
- }
- }
-}
-
-void Application::enter_full_screen()
-{
- LOG_INFO("");
- _changing_screens = true;
- assign_monitors();
- rearrange_monitors(false, true);
- _changing_screens = false;
- _full_screen = true;
- /* If the client monitor cannot handle the guest resolution drop back
- to windowed mode */
- if (_out_of_sync) {
- exit_full_screen();
- }
-}
-
-void Application::restore_screens_size()
-{
- for (int i = 0; i < (int)_screens.size(); i++) {
- if (!_screens[i] || _screens[i]->is_size_locked()) {
- continue;
- }
- _screens[i]->resize(SCREEN_INIT_WIDTH, SCREEN_INIT_HEIGHT);
- }
-}
-
-void Application::exit_full_screen()
-{
- if (!_full_screen) {
- return;
- }
- if (_out_of_sync) {
- LOG_WARN("Falling back to windowed mode (guest resolution too large for client?)");
- }
- LOG_INFO("");
- _changing_screens = true;
- release_capture();
- restore_monitors();
- for (int i = 0; i < (int)_screens.size(); i++) {
- if (_screens[i]) {
- Monitor* mon;
- _screens[i]->exit_full_screen();
- if ((mon = _screens[i]->get_monitor())) {
- _screens[i]->set_monitor(NULL);
- mon->set_free();
- }
- }
- }
- _full_screen = false;
- _out_of_sync = false;
- restore_screens_size();
- show();
- _main_screen->activate();
- _changing_screens = false;
-}
-
-bool Application::toggle_full_screen()
-{
- if (_full_screen) {
- exit_full_screen();
- } else {
- enter_full_screen();
- }
- return _full_screen;
-}
-
-void Application::resize_screen(RedScreen *screen, int width, int height)
-{
- std::vector<SpicePoint> sizes;
- std::vector<SpicePoint> *p_sizes = NULL;
- bool capture = false;
-
- if (_full_screen) {
- capture = (_main_screen == screen) && _active_screen &&
- _active_screen->is_mouse_captured();
- sizes.resize(_screens.size());
- for (int i = 0; i < (int)_screens.size(); i++) {
- if (_screens[i]) {
- if (_screens[i] == screen) {
- sizes[i].x = width;
- sizes[i].y = height;
- } else {
- sizes[i] = _screens[i]->get_size();
- }
- }
- }
- p_sizes = &sizes;
- }
- rearrange_monitors(false, false, NULL, p_sizes);
- screen->resize(width, height);
- if (capture) {
- screen->capture_mouse();
- }
- if (screen->is_out_of_sync()) {
- _out_of_sync = true;
- /* If the client monitor cannot handle the guest resolution
- drop back to windowed mode */
- exit_full_screen();
- }
-}
-
-void Application::minimize()
-{
- for (int i = 0; i < (int)_screens.size(); i++) {
- if (_screens[i]) {
- _screens[i]->minimize();
- }
- }
-}
-
-void Application::destroy_monitors()
-{
- for (int i = 0; i < (int)_screens.size(); i++) {
- if (_screens[i]) {
- _screens[i]->set_monitor(NULL);
- }
- }
- Platform::destroy_monitors();
- _monitors = NULL;
-}
-
-void Application::init_monitors()
-{
- exit_full_screen();
- destroy_monitors();
- _monitors = &Platform::init_monitors();
-}
-
-void Application::on_monitors_change()
-{
- if (Monitor::is_self_change()) {
- return;
- }
- exit_full_screen();
- init_monitors();
-}
-
-void Application::on_display_mode_change()
-{
- _client.on_display_mode_change();
-}
-
-uint32_t Application::get_mouse_mode()
-{
- return _client.get_mouse_mode();
-}
-
-void Application::set_title(const std::string& title)
-{
- _title = title;
-
- for (size_t i = 0; i < _screens.size(); ++i) {
- if (_screens[i]) {
- _screens[i]->set_name(_title);
- }
- }
-}
-
-#ifdef USE_SMARTCARD
-void Application::enable_smartcard(bool enable)
-{
- _smartcard_options->enable = enable;
-}
-#endif
-
-bool Application::is_key_set_pressed(const HotkeySet& key_set)
-{
- HotkeySet::const_iterator iter = key_set.begin();
-
- while (iter != key_set.end()) {
- if (!(_keyboard_state[iter->main] || _keyboard_state[iter->alter])) {
- break;
- }
- ++iter;
- }
-
- return iter == key_set.end();
-}
-
-int Application::get_hotkeys_command()
-{
- HotKeys::const_iterator iter = _hot_keys.begin();
-
- while (iter != _hot_keys.end()) {
- if (is_key_set_pressed(iter->second)) {
- break;
- }
- ++iter;
- }
-
- return (iter != _hot_keys.end()) ? iter->first : APP_CMD_INVALID;
-}
-
-void Application::send_key_down(RedKey key)
-{
- _key_handler->on_key_down(key);
-}
-
-void Application::send_key_up(RedKey key)
-{
- _key_handler->on_key_up(key);
-}
-
-void Application::send_alt_ctl_del()
-{
- send_key_down(REDKEY_L_CTRL);
- send_key_down(REDKEY_L_ALT);
- send_key_down(REDKEY_DELETE);
-
- send_key_up(REDKEY_DELETE);
- send_key_up(REDKEY_L_ALT);
- send_key_up(REDKEY_L_CTRL);
-}
-
-void Application::send_ctrl_alt_end()
-{
- send_key_down(REDKEY_L_CTRL);
- send_key_down(REDKEY_L_ALT);
- send_key_down(REDKEY_END);
-
- send_key_up(REDKEY_L_CTRL);
- send_key_up(REDKEY_L_ALT);
- send_key_up(REDKEY_END);
-}
-
-void Application::send_command_hotkey(int action)
-{
- HotKeys::const_iterator iter = _hot_keys.find(action);
- if (iter != _hot_keys.end()) {
- send_hotkey_key_set(iter->second);
- }
-}
-
-void Application::send_hotkey_key_set(const HotkeySet& key_set)
-{
- HotkeySet::const_iterator iter;
-
- for (iter = key_set.begin(); iter != key_set.end(); ++iter) {
- send_key_down(iter->main);
- }
-
- for (iter = key_set.begin(); iter != key_set.end(); ++iter) {
- send_key_up(iter->main);
- }
-}
-
-int Application::get_menu_item_id(AppMenuItemType type, int32_t conn_ref, uint32_t ext_id)
-{
- int free_id = APP_CMD_EXTERNAL_BEGIN;
- AppMenuItem item = {type, conn_ref, ext_id};
- AppMenuItemMap::iterator iter = _app_menu_items.begin();
- for (; iter != _app_menu_items.end(); iter++) {
- if (!memcmp(&(*iter).second, &item, sizeof(item))) {
- return (*iter).first;
- } else if (free_id == (*iter).first && ++free_id > APP_CMD_EXTERNAL_END) {
- return APP_CMD_INVALID;
- }
- }
- _app_menu_items[free_id] = item;
- return free_id;
-}
-
-void Application::clear_menu_items(int32_t opaque_conn_ref)
-{
- AppMenuItemMap::iterator iter = _app_menu_items.begin();
- AppMenuItemMap::iterator curr;
-
- while (iter != _app_menu_items.end()) {
- curr = iter++;
- if (((*curr).second).conn_ref == opaque_conn_ref) {
- _app_menu_items.erase(curr);
- }
- }
-}
-
-void Application::remove_menu_item(int item_id)
-{
- _app_menu_items.erase(item_id);
-}
-
-int Application::get_foreign_menu_item_id(int32_t opaque_conn_ref, uint32_t msg_id)
-{
- return get_menu_item_id(APP_MENU_ITEM_TYPE_FOREIGN, opaque_conn_ref, msg_id);
-}
-
-void Application::update_menu()
-{
- for (size_t i = 0; i < _screens.size(); ++i) {
- if (_screens[i]) {
- _screens[i]->update_menu();
- }
- }
-}
-
-//controller interface begin
-
-void Application::set_auto_display_res(bool auto_display_res)
-{
- _client.set_auto_display_res(auto_display_res);
-}
-
-bool Application::connect(const std::string& host, int port, int sport, const std::string& password)
-{
- if (_state != DISCONNECTED) {
- return false;
- }
- _client.set_target(host, port, sport);
- _client.set_password(password);
- if (!set_channels_security(port, sport)) {
- return false;
- }
- register_channels();
- connect();
- return true;
-}
-
-void Application::disconnect()
-{
- do_disconnect();
-}
-
-void Application::quit()
-{
- ProcessLoop::quit(SPICEC_ERROR_CODE_SUCCESS);
-}
-
-void Application::show_me(bool full_screen)
-{
- if (full_screen) {
- enter_full_screen();
- } else {
- _main_screen->show(true, NULL);
- }
-}
-
-void Application::hide_me()
-{
- if (_full_screen) {
- exit_full_screen();
- }
- hide();
-}
-
-void Application::set_default_hotkeys(void)
-{
- const std::string default_hotkeys = "toggle-fullscreen=shift+f11"
- ",release-cursor=shift+f12"
-#ifdef RED_DEBUG
- ",connect=shift+f5"
- ",disconnect=shift+f6"
-#endif
-#ifdef USE_GUI
- ",show-gui=shift+f7"
-#endif // USE_GUI
-#ifdef USE_SMARTCARD
- ",smartcard-insert=shift+f8"
- ",smartcard-remove=shift+f9"
-#endif
- "";
-
- this->set_hotkeys(default_hotkeys);
-}
-
-void Application::set_hotkeys(const std::string& hotkeys)
-{
-
- try {
- std::auto_ptr<HotKeysParser> parser(new HotKeysParser(hotkeys, _commands_map));
- _hot_keys = parser->get();
- } catch (Exception &e) {
- LOG_WARN("%s", e.what());
- this->set_default_hotkeys();
- }
-}
-
-int Application::get_controller_menu_item_id(int32_t opaque_conn_ref, uint32_t msg_id)
-{
- return get_menu_item_id(APP_MENU_ITEM_TYPE_CONTROLLER, opaque_conn_ref, msg_id);
-}
-
-void Application::set_menu(Menu* menu)
-{
- if (menu) {
- _app_menu.reset(menu->ref());
- } else {
- init_menu();
- }
- if (*_foreign_menu) {
- (*_foreign_menu)->add_sub_menus();
- }
- update_menu();
-}
-
-void Application::delete_menu()
-{
- set_menu(NULL);
-}
-
-#ifdef USE_GUI
-bool Application::is_disconnect_allowed()
-{
- return _gui_mode == GUI_MODE_FULL;
-}
-#endif // USE_GUI
-
-const std::string& Application::get_host()
-{
- return _client.get_host();
-}
-
-int Application::get_port()
-{
- return _client.get_port();
-}
-
-int Application::get_sport()
-{
- return _client.get_sport();
-}
-
-const std::string& Application::get_password()
-{
- return _client.get_password();
-}
-
-//controller interface end
-
-bool Application::set_channels_security(CmdLineParser& parser, bool on, char *val,
- const char* arg0)
-{
- RedPeer::ConnectionOptions::Type option;
- option = (on) ? RedPeer::ConnectionOptions::CON_OP_SECURE :
- RedPeer::ConnectionOptions::CON_OP_UNSECURE;
-
- typedef std::map< std::string, int> ChannelsNamesMap;
- ChannelsNamesMap channels_names;
- channels_names["main"] = SPICE_CHANNEL_MAIN;
- channels_names["display"] = SPICE_CHANNEL_DISPLAY;
- channels_names["inputs"] = SPICE_CHANNEL_INPUTS;
- channels_names["cursor"] = SPICE_CHANNEL_CURSOR;
- channels_names["playback"] = SPICE_CHANNEL_PLAYBACK;
- channels_names["record"] = SPICE_CHANNEL_RECORD;
-#ifdef USE_SMARTCARD
- channels_names["smartcard"] = SPICE_CHANNEL_SMARTCARD;
-#endif
-
- if (!strcmp(val, "all")) {
- if ((val = parser.next_argument())) {
- Platform::term_printf("%s: \"all\" is exclusive in secure-channels\n", arg0);
- _exit_code = SPICEC_ERROR_CODE_INVALID_ARG;
- return false;
- }
- PeerConnectionOptMap::iterator iter = _peer_con_opt.begin();
- for (; iter != _peer_con_opt.end(); iter++) {
- (*iter).second = option;
- }
- return true;
- }
-
- do {
- ChannelsNamesMap::iterator iter = channels_names.find(val);
- if (iter == channels_names.end()) {
- Platform::term_printf("%s: bad channel name \"%s\" in secure-channels\n", arg0, val);
- _exit_code = SPICEC_ERROR_CODE_INVALID_ARG;
- return false;
- }
- _peer_con_opt[(*iter).second] = option;
- } while ((val = parser.next_argument()));
- return true;
-}
-
-bool Application::set_channels_security(int port, int sport)
-{
- PeerConnectionOptMap::iterator iter = _peer_con_opt.begin();
-
- for (; iter != _peer_con_opt.end(); iter++) {
- if ((*iter).second == RedPeer::ConnectionOptions::CON_OP_SECURE) {
- continue;
- }
-
- if ((*iter).second == RedPeer::ConnectionOptions::CON_OP_UNSECURE) {
- continue;
- }
-
- if (port != -1 && sport != -1) {
- (*iter).second = RedPeer::ConnectionOptions::CON_OP_BOTH;
- continue;
- }
-
- if (port != -1) {
- (*iter).second = RedPeer::ConnectionOptions::CON_OP_UNSECURE;
- continue;
- }
-
- if (sport != -1) {
- (*iter).second = RedPeer::ConnectionOptions::CON_OP_SECURE;
- continue;
- }
-
- _exit_code = SPICEC_ERROR_CODE_CMD_LINE_ERROR;
- return false;
- }
- return true;
-}
-
-bool Application::set_connection_ciphers(const char* ciphers, const char* arg0)
-{
- _con_ciphers = ciphers;
- return true;
-}
-
-bool Application::set_ca_file(const char* ca_file, const char* arg0)
-{
- _host_auth_opt.CA_file = ca_file;
- return true;
-}
-
-bool Application::set_host_cert_subject(const char* subject, const char* arg0)
-{
- std::string subject_str(subject);
- std::string::const_iterator iter = subject_str.begin();
- std::string entry;
- _host_auth_opt.type_flags = SPICE_SSL_VERIFY_OP_SUBJECT;
- _host_auth_opt.host_subject = subject;
-
- /* the follow is only checking code, subject is parsed later
- ssl_verify.c. We keep simply because of better error message... */
- while (true) {
- if ((iter == subject_str.end()) || (*iter == ',')) {
- RedPeer::HostAuthOptions::CertFieldValuePair entry_pair;
- size_t value_pos = entry.find_first_of('=');
- if ((value_pos == std::string::npos) || (value_pos == (entry.length() - 1))) {
- Platform::term_printf("%s: host_subject bad format: assignment for %s is missing\n",
- arg0, entry.c_str());
- _exit_code = SPICEC_ERROR_CODE_INVALID_ARG;
- return false;
- }
- size_t start_pos = entry.find_first_not_of(' ');
- if ((start_pos == std::string::npos) || (start_pos == value_pos)) {
- Platform::term_printf("%s: host_subject bad format: first part of assignment must be non empty in %s\n",
- arg0, entry.c_str());
- _exit_code = SPICEC_ERROR_CODE_INVALID_ARG;
- return false;
- }
- entry_pair.first = entry.substr(start_pos, value_pos - start_pos);
- entry_pair.second = entry.substr(value_pos + 1);
- DBG(0, "subject entry: %s=%s", entry_pair.first.c_str(), entry_pair.second.c_str());
- if (iter == subject_str.end()) {
- break;
- }
- entry.clear();
- } else if (*iter == '\\') {
- iter++;
- if (iter == subject_str.end()) {
- LOG_WARN("single \\ in host subject");
- entry.append(1, '\\');
- continue;
- } else if ((*iter == '\\') || (*iter == ',')) {
- entry.append(1, *iter);
- } else {
- LOG_WARN("single \\ in host subject");
- entry.append(1, '\\');
- continue;
- }
- } else {
- entry.append(1, *iter);
- }
- iter++;
- }
-
- return true;
-}
-
-bool Application::set_canvas_option(CmdLineParser& parser, char *val, const char* arg0)
-{
- typedef std::map< std::string, CanvasOption> CanvasNamesMap;
- CanvasNamesMap canvas_types;
-
- canvas_types["sw"] = CANVAS_OPTION_SW;
-#ifdef WIN32
- canvas_types["gdi"] = CANVAS_OPTION_GDI;
-#endif
-#ifdef USE_OPENGL
- canvas_types["gl_fbo"] = CANVAS_OPTION_OGL_FBO;
- canvas_types["gl_pbuff"] = CANVAS_OPTION_OGL_PBUFF;
-#endif
- _canvas_types.clear();
-
- do {
- CanvasNamesMap::iterator iter = canvas_types.find(val);
- if (iter == canvas_types.end()) {
- Platform::term_printf("%s: bad canvas type \"%s\"\n", arg0, val);
- _exit_code = SPICEC_ERROR_CODE_INVALID_ARG;
- return false;
- }
- _canvas_types.resize(_canvas_types.size() + 1);
- _canvas_types[_canvas_types.size() - 1] = (*iter).second;
- } while ((val = parser.next_argument()));
-
- return true;
-}
-
-bool Application::set_enable_channels(CmdLineParser& parser, bool enable, char *val,
- const char* arg0)
-{
- typedef std::map< std::string, int> ChannelsNamesMap;
- ChannelsNamesMap channels_names;
- channels_names["display"] = SPICE_CHANNEL_DISPLAY;
- channels_names["inputs"] = SPICE_CHANNEL_INPUTS;
- channels_names["cursor"] = SPICE_CHANNEL_CURSOR;
- channels_names["playback"] = SPICE_CHANNEL_PLAYBACK;
- channels_names["record"] = SPICE_CHANNEL_RECORD;
-#ifdef USE_SMARTCARD
- channels_names["smartcard"] = SPICE_CHANNEL_SMARTCARD;
-#endif
-
- if (!strcmp(val, "all")) {
- if ((val = parser.next_argument())) {
- Platform::term_printf("%s: \"all\" is exclusive\n", arg0);
- _exit_code = SPICEC_ERROR_CODE_INVALID_ARG;
- return false;
- }
- for (unsigned int i = 0; i < _enabled_channels.size(); i++) {
- _enabled_channels[i] = enable;
- }
- return true;
- }
-
- do {
- ChannelsNamesMap::iterator iter = channels_names.find(val);
- if (iter == channels_names.end()) {
- Platform::term_printf("%s: bad channel name \"%s\"\n", arg0, val);
- _exit_code = SPICEC_ERROR_CODE_INVALID_ARG;
- return false;
- }
- _enabled_channels[(*iter).second] = enable;
- } while ((val = parser.next_argument()));
- return true;
-}
-
-bool Application::set_disabled_display_effects(CmdLineParser& parser, char *val, const char* arg0,
- DisplaySetting& disp_setting)
-{
- if (!strcmp(val, "all")) {
- if ((val = parser.next_argument())) {
- Platform::term_printf("%s: \"all\" is exclusive\n", arg0);
- _exit_code = SPICEC_ERROR_CODE_INVALID_ARG;
- return false;
- }
- disp_setting._disable_wallpaper = true;
- disp_setting._disable_font_smooth = true;
- disp_setting._disable_animation = true;
- return true;
- }
-
- do {
- if (!strcmp(val, "wallpaper")) {
- disp_setting._disable_wallpaper = true;
- } else if (!strcmp(val, "font-smooth")) {
- disp_setting._disable_font_smooth = true;
- } else if (!strcmp(val, "animation")) {
- disp_setting._disable_animation = true;
- } else {
- Platform::term_printf("%s: bad display effect type \"%s\"\n", arg0, val);
- _exit_code = SPICEC_ERROR_CODE_INVALID_ARG;
- return false;
- }
- } while ((val = parser.next_argument()));
-
- return true;
-}
-
-void Application::on_cmd_line_invalid_arg(const char* arg0, const char* what, const char* val)
-{
- Platform::term_printf("%s: invalid %s value %s\n", arg0, what, val);
- _exit_code = SPICEC_ERROR_CODE_INVALID_ARG;
-}
-
-void Application::register_channels()
-{
- if (_enabled_channels[SPICE_CHANNEL_DISPLAY]) {
- _client.register_channel_factory(DisplayChannel::Factory());
- }
-
- if (_enabled_channels[SPICE_CHANNEL_CURSOR]) {
- _client.register_channel_factory(CursorChannel::Factory());
- }
-
- if (_enabled_channels[SPICE_CHANNEL_INPUTS]) {
- _client.register_channel_factory(InputsChannel::Factory());
- }
-
- if (_enabled_channels[SPICE_CHANNEL_PLAYBACK]) {
- _client.register_channel_factory(PlaybackChannel::Factory());
- }
-
- if (_enabled_channels[SPICE_CHANNEL_RECORD]) {
- _client.register_channel_factory(RecordChannel::Factory());
- }
-
-#ifdef USE_SMARTCARD
- if (_enabled_channels[SPICE_CHANNEL_SMARTCARD] && _smartcard_options->enable) {
- smartcard_init(_smartcard_options); // throws Exception
- _client.register_channel_factory(SmartCardChannel::Factory());
- }
-#endif
-}
-
-bool Application::process_cmd_line(int argc, char** argv, bool &full_screen)
-{
- std::string host = "";
- int sport = -1;
- int port = -1;
- bool auto_display_res = false;
- std::string password;
- DisplaySetting display_setting;
-
- enum {
- SPICE_OPT_VERSION = CmdLineParser::OPTION_FIRST_AVAILABLE,
- SPICE_OPT_HOST,
- SPICE_OPT_PORT,
- SPICE_OPT_SPORT,
- SPICE_OPT_PASSWORD,
- SPICE_OPT_FULL_SCREEN,
- SPICE_OPT_SECURE_CHANNELS,
- SPICE_OPT_UNSECURE_CHANNELS,
- SPICE_OPT_TLS_CIPHERS,
- SPICE_OPT_CA_FILE,
- SPICE_OPT_HOST_SUBJECT,
- SPICE_OPT_ENABLE_CHANNELS,
- SPICE_OPT_DISABLE_CHANNELS,
- SPICE_OPT_CANVAS_TYPE,
- SPICE_OPT_DISPLAY_COLOR_DEPTH,
- SPICE_OPT_DISABLE_DISPLAY_EFFECTS,
- SPICE_OPT_CONTROLLER,
- SPICE_OPT_TITLE,
- SPICE_OPT_HOTKEYS,
-#ifdef USE_SMARTCARD
- SPICE_OPT_SMARTCARD,
- SPICE_OPT_NOSMARTCARD,
- SPICE_OPT_SMARTCARD_CERT,
- SPICE_OPT_SMARTCARD_DB,
-#endif
- };
-
- full_screen = false;
-
-#ifdef USE_GUI
- if (argc == 1) {
- _gui_mode = GUI_MODE_FULL;
- register_channels();
- return true;
- }
-#endif // USE_GUI
-
-#ifdef USE_GUI
- _gui_mode = GUI_MODE_ACTIVE_SESSION;
-#endif // USE_GUI
-
- CmdLineParser parser("Spice client", false);
-
- parser.add(SPICE_OPT_VERSION, "version", "spice client version", false);
- parser.add(SPICE_OPT_HOST, "host", "spice server address", "host", true, 'h');
- parser.add(SPICE_OPT_PORT, "port", "spice server port", "port", true, 'p');
- parser.add(SPICE_OPT_SPORT, "secure-port", "spice server secure port", "port", true, 's');
- parser.add(SPICE_OPT_SECURE_CHANNELS, "secure-channels",
- "force secure connection on the specified channels", "channel",
- true);
- parser.set_multi(SPICE_OPT_SECURE_CHANNELS, ',');
- parser.add(SPICE_OPT_UNSECURE_CHANNELS, "unsecure-channels",
- "force unsecure connection on the specified channels", "channel",
- true);
- parser.set_multi(SPICE_OPT_UNSECURE_CHANNELS, ',');
- parser.add(SPICE_OPT_TLS_CIPHERS, "tls-ciphers", "ciphers for secure connections",
- "ciphers", true);
- parser.add(SPICE_OPT_CA_FILE, "ca-file", "truststore file for secure connections",
- "ca-file", true);
- parser.add(SPICE_OPT_HOST_SUBJECT, "host-subject",
- "subject of the host certificate. Format: field=value pairs separated"
- " by commas. Commas and backslashes within values must be preceded by"
- " a backslash", "host-subject", true);
- parser.add(SPICE_OPT_PASSWORD, "password", "server password", "password", true, 'w');
- parser.add(SPICE_OPT_FULL_SCREEN, "full-screen", "open in full screen mode", "auto-conf",
- false, 'f');
-
- parser.add(SPICE_OPT_ENABLE_CHANNELS, "enable-channels", "enable channels", "channel", true);
- parser.set_multi(SPICE_OPT_ENABLE_CHANNELS, ',');
-
- parser.add(SPICE_OPT_DISABLE_CHANNELS, "disable-channels", "disable channels", "channel", true);
- parser.set_multi(SPICE_OPT_DISABLE_CHANNELS, ',');
-
- parser.add(SPICE_OPT_CANVAS_TYPE, "canvas-type", "set rendering canvas", "canvas_type", true);
- parser.set_multi(SPICE_OPT_CANVAS_TYPE, ',');
-
- parser.add(SPICE_OPT_DISPLAY_COLOR_DEPTH, "color-depth",
- "guest display color depth (if supported by the guest vdagent)",
- "16/32", true);
-
- parser.add(SPICE_OPT_DISABLE_DISPLAY_EFFECTS, "disable-effects",
- "disable guest display effects " \
- "(if supported by the guest vdagent)",
- "wallpaper/font-smooth/animation/all", true);
- parser.set_multi(SPICE_OPT_DISABLE_DISPLAY_EFFECTS, ',');
-
- parser.add(SPICE_OPT_CONTROLLER, "controller", "enable external controller");
-
- parser.add(SPICE_OPT_TITLE, "title", "set window title", "title", true, 't');
- parser.add(SPICE_OPT_HOTKEYS, "hotkeys", "Set hotkey keybindings",
- "toggle-fullscreen=shift+f11,release-cursor=shift+f12,etc.",
- true);
-
-#ifdef USE_SMARTCARD
- parser.add(SPICE_OPT_SMARTCARD, "smartcard", "enable smartcard channel");
- parser.add(SPICE_OPT_NOSMARTCARD, "nosmartcard", "disable smartcard channel");
- parser.add(SPICE_OPT_SMARTCARD_CERT, "smartcard-cert",
- "Use virtual reader+card with given cert(s)",
- "smartcard-cert", true);
- parser.set_multi(SPICE_OPT_SMARTCARD_CERT, ',');
- parser.add(SPICE_OPT_SMARTCARD_DB, "smartcard-db", "Use given db for smartcard certs", "smartcard-db", true);
-#endif
-
- for (int i = SPICE_CHANNEL_MAIN; i < SPICE_END_CHANNEL; i++) {
- _peer_con_opt[i] = RedPeer::ConnectionOptions::CON_OP_INVALID;
- }
-
- parser.begin(argc, argv);
-
- char* val;
- int op;
- while ((op = parser.get_option(&val)) != CmdLineParser::OPTION_DONE) {
- switch (op) {
- case SPICE_OPT_VERSION: {
- std::ostringstream os;
- os << argv[0] << " "<< PACKAGE_VERSION << std::endl;
- Platform::term_printf("%s", os.str().c_str());
- return false;
- }
- case SPICE_OPT_HOST:
- host = val;
- break;
- case SPICE_OPT_PORT: {
- if ((port = str_to_port(val)) == -1) {
- on_cmd_line_invalid_arg(argv[0], "port", val);
- return false;
- }
- break;
- }
- case SPICE_OPT_SPORT: {
- if ((sport = str_to_port(val)) == -1) {
- on_cmd_line_invalid_arg(argv[0], "secure port", val);
- return false;
- }
- break;
- }
- case SPICE_OPT_FULL_SCREEN:
- if (val) {
- if (strcmp(val, "auto-conf")) {
- on_cmd_line_invalid_arg(argv[0], "full screen mode", val);
- return false;
- }
- auto_display_res = true;
- }
- full_screen = true;
- break;
- case SPICE_OPT_PASSWORD:
- password = val;
- break;
- case SPICE_OPT_SECURE_CHANNELS:
- if (!set_channels_security(parser, true, val, argv[0])) {
- return false;
- }
- break;
- case SPICE_OPT_UNSECURE_CHANNELS:
- if (!set_channels_security(parser, false, val, argv[0])) {
- return false;
- }
- break;
- case SPICE_OPT_TLS_CIPHERS:
- if (!set_connection_ciphers(val, argv[0])) {
- return false;
- }
- break;
- case SPICE_OPT_CA_FILE:
- if (!set_ca_file(val, argv[0])) {
- return false;
- }
- break;
- case SPICE_OPT_HOST_SUBJECT:
- if (!set_host_cert_subject(val, argv[0])) {
- return false;
- }
- break;
- case SPICE_OPT_ENABLE_CHANNELS:
- if (!set_enable_channels(parser, true, val, argv[0])) {
- return false;
- }
- break;
- case SPICE_OPT_DISABLE_CHANNELS:
- if (!set_enable_channels(parser, false, val, argv[0])) {
- return false;
- }
- break;
- case SPICE_OPT_CANVAS_TYPE:
- if (!set_canvas_option(parser, val, argv[0])) {
- return false;
- }
- break;
- case SPICE_OPT_DISPLAY_COLOR_DEPTH:
- display_setting._set_color_depth = true;
- if (!strcmp(val, "16")) {
- display_setting._color_depth = 16;
- } else if (!strcmp(val, "32")) {
- display_setting._color_depth = 32;
- } else {
- on_cmd_line_invalid_arg(argv[0], "color depth", val);
- return false;
- }
- break;
- case SPICE_OPT_DISABLE_DISPLAY_EFFECTS:
- if (!set_disabled_display_effects(parser, val, argv[0], display_setting)) {
- return false;
- }
- break;
- case SPICE_OPT_CONTROLLER:
- if (argc > 2) {
- Platform::term_printf("%s: controller cannot be combined with other options\n",
- argv[0]);
- _exit_code = SPICEC_ERROR_CODE_INVALID_ARG;
- return false;
- }
- _enable_controller = true;
- return true;
- case SPICE_OPT_TITLE:
- set_title(val);
- break;
- case SPICE_OPT_HOTKEYS:
- set_hotkeys(val);
- break;
-#ifdef USE_SMARTCARD
- case SPICE_OPT_SMARTCARD:
- _smartcard_options->enable= true;
- break;
- case SPICE_OPT_NOSMARTCARD:
- _smartcard_options->enable= false; // default
- break;
- case SPICE_OPT_SMARTCARD_CERT:
- do {
- _smartcard_options->certs.insert(
- _smartcard_options->certs.end(), std::string(val));
- } while ((val=parser.next_argument()));
- break;
- case SPICE_OPT_SMARTCARD_DB:
- _smartcard_options->dbname = val;
- break;
-#endif
- case CmdLineParser::OPTION_HELP:
- parser.show_help();
- return false;
- case CmdLineParser::OPTION_ERROR:
- _exit_code = SPICEC_ERROR_CODE_CMD_LINE_ERROR;
- return false;
- default:
- throw Exception("cmd line error", SPICEC_ERROR_CODE_CMD_LINE_ERROR);
- }
- }
-
- if (host.empty()) {
- Platform::term_printf("%s: missing --host\n", argv[0]);
- _exit_code = SPICEC_ERROR_CODE_CMD_LINE_ERROR;
- return false;
- }
-
- if (parser.is_set(SPICE_OPT_SECURE_CHANNELS) && !parser.is_set(SPICE_OPT_SPORT)) {
- Platform::term_printf("%s: missing --secure-port\n", argv[0]);
- _exit_code = SPICEC_ERROR_CODE_CMD_LINE_ERROR;
- return false;
- }
-
- if (!set_channels_security(port, sport)) {
- Platform::term_printf("%s: missing --port or --sport\n", argv[0]);
- return false;
- }
- register_channels();
-
- _client.set_target(host, port, sport);
- _client.set_password(password);
- _client.set_auto_display_res(auto_display_res);
- _client.set_display_setting(display_setting);
-
- return true;
-}
-
-#ifdef RED_DEBUG
-static unsigned int log_level = LOG_DEBUG;
-#else
-static unsigned int log_level = LOG_INFO;
-#endif
-
-static FILE *log_file = NULL;
-
-void spice_log_cleanup(void)
-{
- if (log_file) {
- fclose(log_file);
- log_file = NULL;
- }
-}
-
-static inline std::string function_to_func_name(const std::string& f_name)
-{
-#ifdef __GNUC__
- std::string name(f_name);
- std::string::size_type end_pos = f_name.find('(');
- if (end_pos == std::string::npos) {
- return f_name;
- }
- std::string::size_type start = f_name.rfind(' ', end_pos);
- if (start == std::string::npos) {
- return name.substr(0, end_pos);
- }
- end_pos -= ++start;
- return name.substr(start, end_pos);
-#else
- return f_name;
-#endif
-}
-
-void spice_log(unsigned int type, const char *function, const char *format, ...)
-{
- std::string formated_message;
- va_list ap;
- const char *type_as_char[] = { "DEBUG", "INFO", "WARN", "ERROR", "FATAL" };
- const char *type_as_nice_char[] = { "Debug", "Info", "Warning", "Error", "Fatal error" };
-
- if (type < log_level) {
- return;
- }
-
- ASSERT(type <= LOG_FATAL);
-
- va_start(ap, format);
- string_vprintf(formated_message, format, ap);
- va_end(ap);
-
- if (type >= log_level && log_file != NULL) {
- fprintf(log_file,"%ld %s [%" PRIu64 ":%" PRIu64 "] %s: %s\n",
- (long)time(NULL), type_as_char[type],
- Platform::get_process_id(),
- Platform::get_thread_id(),
- function_to_func_name(function).c_str(),
- formated_message.c_str());
- fflush(log_file);
- }
-
- if (type >= LOG_WARN) {
- fprintf(stderr, "%s: %s\n", type_as_nice_char[type], formated_message.c_str());
- }
-}
-
-void Application::init_logger()
-{
- std::string log_file_name;
-
- Platform::get_app_data_dir(log_file_name, app_name);
- Platform::path_append(log_file_name, "spicec.log");
-
- log_file = ::fopen(log_file_name.c_str(), "a");
-
- if (log_file == NULL) {
- fprintf(stderr, "Failed to open log file %s\n", log_file_name.c_str());
- return;
- }
-}
-
-void Application::init_globals()
-{
- init_logger();
- srand((unsigned)time(NULL));
-
- SSL_library_init();
- SSL_load_error_strings();
-
- sw_canvas_init();
-#ifdef USE_OPENGL
- gl_canvas_init();
-#endif
- quic_init();
-#ifdef WIN32
- gdi_canvas_init();
-#endif
-}
-
-/* seperated from init_globals to allow --help to work
- * faster and not require X on linux. */
-void Application::init_platform_globals()
-{
- Platform::init();
- RedWindow::init();
-}
-
-void Application::init_remainder()
-{
- Platform::set_process_loop(*this);
- init_monitors();
- init_menu();
- _main_screen = get_screen(0);
-
- Platform::set_event_listener(this);
- Platform::set_display_mode_listner(this);
-
-#ifdef USE_GUI
- _gui.reset(new GUI(*this, DISCONNECTED));
- _gui_timer.reset(new GUITimer(*_gui.get()));
- activate_interval_timer(*_gui_timer, 1000 / 30);
-#ifdef GUI_DEMO
- _gui_test_timer.reset(new TestTimer(*this));
- activate_interval_timer(*_gui_test_timer, 1000 * 30);
-#endif
-#endif // USE_GUI
-}
-
-void Application::cleanup_platform_globals()
-{
- RedWindow::cleanup();
-}
-
-void Application::cleanup_globals()
-{
-}
-
-int Application::main(int argc, char** argv, const char* version_str)
-{
- int ret;
- bool full_screen;
- char *log_level_str;
-
- log_level_str = getenv("SPICEC_LOG_LEVEL");
- if (log_level_str) {
- log_level = atoi(log_level_str);
- }
-
- init_globals();
- LOG_INFO("starting %s", version_str);
- std::string command_line = argv[0];
- for (int i = 1 ; i < argc ; ++i) {
- command_line += " ";
- command_line += argv[i];
- }
- LOG_INFO("command line: %s", command_line.c_str());
-
- std::auto_ptr<Application> app(new Application());
- AutoAbort auto_abort(*app.get());
- if (app->process_cmd_line(argc, argv, full_screen)) {
- init_platform_globals();
- app->init_remainder();
- if (full_screen) {
- app->enter_full_screen();
- } else {
- app->_main_screen->show(true, NULL);
- }
- ret = app->run();
- cleanup_platform_globals();
- } else {
- ret = app->_exit_code;
- }
- cleanup_globals();
- return ret;
-}
diff --git a/client/application.h b/client/application.h
deleted file mode 100644
index 3f9940d3..00000000
--- a/client/application.h
+++ /dev/null
@@ -1,413 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_APPLICATION
-#define _H_APPLICATION
-
-#include "common.h"
-#include "threads.h"
-#include "red_client.h"
-#include "red_key.h"
-#include "platform.h"
-#include "menu.h"
-#include "hot_keys.h"
-#include "process_loop.h"
-#include "foreign_menu.h"
-#include "controller.h"
-
-#ifdef USE_SMARTCARD
-struct SmartcardOptions;
-#endif
-class RedScreen;
-class Application;
-class ScreenLayer;
-class InfoLayer;
-class InputsHandler;
-class Monitor;
-class CmdLineParser;
-class Menu;
-
-#ifdef USE_GUI
-class GUI;
-class GUITimer;
-class GUIBarrier;
-
-#ifdef GUI_DEMO
-class TestTimer;
-#endif
-#endif // USE_GUI
-
-
-class ConnectedEvent: public Event {
-public:
- virtual void response(AbstractProcessLoop& events_loop);
-};
-
-class DisconnectedEvent: public Event {
-public:
- DisconnectedEvent() : _error_code (SPICEC_ERROR_CODE_SUCCESS) {}
- DisconnectedEvent(int error_code) : _error_code (error_code) {}
- virtual void response(AbstractProcessLoop& events_loop);
-
-private:
- int _error_code;
-};
-
-class VisibilityEvent: public Event {
-public:
- VisibilityEvent(int screen_id) : _screen_id (screen_id) {}
-
- virtual void response(AbstractProcessLoop& events_loop);
-
-private:
- int _screen_id;
-};
-
-struct MonitorInfo {
- int depth;
- SpicePoint size;
- SpicePoint position;
-};
-
-class MonitorsQuery: public SyncEvent {
-public:
- MonitorsQuery() {}
-
- virtual void do_response(AbstractProcessLoop& events_loop);
- std::vector<MonitorInfo>& get_monitors() {return _monitors;}
-
-private:
- std::vector<MonitorInfo> _monitors;
-};
-
-class SwitchHostEvent: public Event {
-public:
- SwitchHostEvent(const char* host, int port, int sport, const char* cert_subject);
- virtual void response(AbstractProcessLoop& events_loop);
-
-private:
- std::string _host;
- int _port;
- int _sport;
- std::string _cert_subject;
-};
-
-enum CanvasOption {
- CANVAS_OPTION_INVALID,
- CANVAS_OPTION_SW,
-#ifdef WIN32
- CANVAS_OPTION_GDI,
-#endif
-#ifdef USE_OPENGL
- CANVAS_OPTION_OGL_FBO,
- CANVAS_OPTION_OGL_PBUFF,
-#endif
-};
-
-class StickyKeyTimer: public Timer {
-public:
- virtual void response(AbstractProcessLoop& events_loop);
-};
-
-typedef struct StickyInfo {
- bool trace_is_on;
- bool sticky_mode;
- bool key_first_down; // True when (1) a potential sticky key is pressed,
- // and none of the other keys are pressed and (2) in the moment
- // of pressing, _sticky_mode is false. When the key is up
- // for the first time, it is set to false.
- bool key_down; // The physical state of the sticky key. Valid only till
- // stickiness is removed.
- RedKey key; // the key that is currently being traced, or,
- // if _sticky mode is on, the sticky key
- AutoRef<StickyKeyTimer> timer;
-} StickyInfo;
-
-
-typedef std::list<KeyHandler*> KeyHandlersStack;
-#ifdef USE_GUI
-typedef std::list<GUIBarrier*> GUIBarriers;
-#endif // USE_GUI
-
-enum AppMenuItemType {
- APP_MENU_ITEM_TYPE_INVALID,
- APP_MENU_ITEM_TYPE_FOREIGN,
- APP_MENU_ITEM_TYPE_CONTROLLER,
-};
-
-typedef struct AppMenuItem {
- AppMenuItemType type;
- int32_t conn_ref;
- uint32_t ext_id;
-} AppMenuItem;
-
-typedef std::map<int, AppMenuItem> AppMenuItemMap;
-
-class Application : public ProcessLoop,
- public Platform::EventListener,
- public Platform::DisplayModeListener,
- public ForeignMenuInterface,
- public ControllerInterface {
-public:
-
- enum State {
- DISCONNECTED,
- CONNECTING,
- CONNECTED,
- VISIBILITY,
- DISCONECTING,
- };
-
-#ifdef USE_GUI
- enum GuiMode {
- GUI_MODE_FULL,
- GUI_MODE_ACTIVE_SESSION,
- GUI_MODE_MINIMAL,
- };
-#endif // USE_GUI
-
- Application();
- virtual ~Application();
-
- int run();
-
- void set_key_handler(KeyHandler& handler);
- void remove_key_handler(KeyHandler& handler);
- void set_mouse_handler(MouseHandler& handler);
- void remove_mouse_handler(MouseHandler& handler);
- void capture_mouse();
- void release_mouse_capture();
- RedScreen* find_screen(int id);
- RedScreen* get_screen(int id);
-
- void on_screen_unlocked(RedScreen& screen);
- void on_screen_destroyed(int id, bool was_captured);
- void on_mouse_motion(int dx, int dy, int buttons_state);
- void on_mouse_down(int button, int buttons_state);
- void on_mouse_up(int button, int buttons_state);
- void on_key_down(RedKey key);
- void on_key_up(RedKey key);
- void on_char(uint32_t ch);
- void on_deactivate_screen(RedScreen* screen);
- void on_activate_screen(RedScreen* screen);
- void on_start_screen_key_interception(RedScreen* screen);
- void on_stop_screen_key_interception(RedScreen* screen);
- virtual void on_start_running();
- virtual void on_app_activated();
- virtual void on_app_deactivated();
- virtual void on_monitors_change();
- virtual void on_display_mode_change();
- void on_connected();
- void on_disconnected(int spice_error_code);
- void on_disconnecting();
- void on_visibility_start(int screen_id);
-
- void enter_full_screen();
- void exit_full_screen();
- bool toggle_full_screen();
- void resize_screen(RedScreen *screen, int width, int height);
- void minimize();
- void set_title(const std::string& title);
- void hide();
- void show();
- void external_show();
- void connect();
- void switch_host(const std::string& host, int port, int sport, const std::string& cert_subject);
-#ifdef USE_SMARTCARD
- void enable_smartcard(bool enable);
-#endif
-
- const PeerConnectionOptMap& get_con_opt_map() {return _peer_con_opt;}
- const RedPeer::HostAuthOptions& get_host_auth_opt() { return _host_auth_opt;}
- const std::string& get_connection_ciphers() { return _con_ciphers;}
- uint32_t get_mouse_mode();
- const std::vector<int>& get_canvas_types() { return _canvas_types;}
-
- Menu* get_app_menu();
- virtual void do_command(int command);
-
- int get_foreign_menu_item_id(int32_t opaque_conn_ref, uint32_t msg_id);
- void clear_menu_items(int32_t opaque_conn_ref);
- void remove_menu_item(int item_id);
- void update_menu();
-
- //controller interface begin
- void set_auto_display_res(bool auto_display_res);
- bool connect(const std::string& host, int port, int sport, const std::string& password);
- void disconnect();
- void quit();
- void show_me(bool full_screen);
- void hide_me();
- void set_hotkeys(const std::string& hotkeys);
- void set_default_hotkeys(void);
- int get_controller_menu_item_id(int32_t opaque_conn_ref, uint32_t msg_id);
- void set_menu(Menu* menu);
- void delete_menu();
- void beep();
-
-#ifdef USE_GUI
- bool is_disconnect_allowed();
- void hide_gui();
-#endif
-
- const std::string& get_host();
- int get_port();
- int get_sport();
- const std::string& get_password();
- //controller interface end
-
-#ifdef GUI_DEMO
- void message_box_test();
-#endif
-
-#ifdef USE_SMARTCARD
- const SmartcardOptions* get_smartcard_options() const {
- return _smartcard_options;
- }
-#endif
-
- static int main(int argc, char** argv, const char* version_str);
-
-private:
- bool set_channels_security(CmdLineParser& parser, bool on, char *val, const char* arg0);
- bool set_channels_security(int port, int sport);
- bool set_connection_ciphers(const char* ciphers, const char* arg0);
- bool set_ca_file(const char* ca_file, const char* arg0);
- bool set_host_cert_subject(const char* subject, const char* arg0);
- bool set_enable_channels(CmdLineParser& parser, bool enable, char *val, const char* arg0);
- bool set_canvas_option(CmdLineParser& parser, char *val, const char* arg0);
- bool set_disabled_display_effects(CmdLineParser& parser, char *val, const char* arg0,
- DisplaySetting& disp_setting);
- void on_cmd_line_invalid_arg(const char* arg0, const char* what, const char* val);
- bool process_cmd_line(int argc, char** argv, bool& full_screen);
- void register_channels();
- void abort();
- void init_menu();
- void unpress_all();
- bool release_capture();
- bool do_connect();
- bool do_disconnect();
- void set_state(State);
-
- void restore_screens_size();
- Monitor* find_monitor(int id);
- Monitor* get_monitor(int id);
- void init_monitors();
- void destroy_monitors();
- void assign_monitors();
- void restore_monitors();
- void prepare_monitors(std::vector<SpicePoint> *sizes);
- void rearrange_monitors(bool force_capture,
- bool enter_full_screen,
- RedScreen* screen = NULL,
- std::vector<SpicePoint> *sizes = NULL);
- void position_screens();
- void show_full_screen();
- void send_key_down(RedKey key);
- void send_key_up(RedKey key);
- void send_alt_ctl_del();
- void send_ctrl_alt_end();
- void send_command_hotkey(int command);
- void send_hotkey_key_set(const HotkeySet& key_set);
- void menu_item_callback(unsigned int item_id);
- int get_menu_item_id(AppMenuItemType type, int32_t conn_ref, uint32_t ext_id);
- int get_hotkeys_command();
- bool is_key_set_pressed(const HotkeySet& key_set);
- void do_on_key_up(RedKey key);
- void __remove_key_handler(KeyHandler& handler);
-
- void show_info_layer();
- void hide_info_layer();
-#ifdef USE_GUI
- void attach_gui_barriers();
- void detach_gui_barriers();
- void show_gui();
- void create_gui_barrier(RedScreen& screen, int id);
- void destroyed_gui_barrier(int id);
- void destroyed_gui_barriers();
-#endif // USE_GUI
-
- // returns the press value before operation (i.e., if it was already pressed)
- bool press_key(RedKey key);
- bool unpress_key(RedKey key);
- void reset_sticky();
- static bool is_sticky_trace_key(RedKey key);
- void sync_keyboard_modifiers();
-
- static void init_logger();
- static void init_globals();
- static void init_platform_globals();
- static void cleanup_platform_globals();
- static void cleanup_globals();
- void init_remainder();
-
- friend class DisconnectedEvent;
- friend class ConnectionErrorEvent;
- friend class MonitorsQuery;
- friend class AutoAbort;
- friend class StickyKeyTimer;
-
-private:
- RedClient _client;
- PeerConnectionOptMap _peer_con_opt;
- RedPeer::HostAuthOptions _host_auth_opt;
- std::string _con_ciphers;
- std::vector<bool> _enabled_channels;
- std::vector<RedScreen*> _screens;
- RedScreen* _main_screen;
- bool _active;
- bool _full_screen;
- bool _changing_screens;
- bool _out_of_sync;
- int _exit_code;
- RedScreen* _active_screen;
- bool _keyboard_state[REDKEY_NUM_KEYS];
- int _num_keys_pressed;
- HotKeys _hot_keys;
- CommandsMap _commands_map;
- std::auto_ptr<InfoLayer> _info_layer;
- KeyHandler* _key_handler;
- KeyHandlersStack _key_handlers;
- MouseHandler* _mouse_handler;
- const MonitorsList* _monitors;
- std::string _title;
- bool _sys_key_intercept_mode;
- StickyInfo _sticky_info;
- std::vector<int> _canvas_types;
- AutoRef<Menu> _app_menu;
- AutoRef<ForeignMenu> _foreign_menu;
- bool _enable_controller;
- AutoRef<Controller> _controller;
- AppMenuItemMap _app_menu_items;
-#ifdef USE_GUI
- std::auto_ptr<GUI> _gui;
- AutoRef<GUITimer> _gui_timer;
- GUIBarriers _gui_barriers;
- GuiMode _gui_mode;
-#ifdef GUI_DEMO
- AutoRef<TestTimer> _gui_test_timer;
-#endif
-#endif // USE_GUI
- bool _during_host_switch;
-
- State _state;
-#ifdef USE_SMARTCARD
- SmartcardOptions* _smartcard_options;
-#endif
-};
-
-#endif
diff --git a/client/audio_channels.h b/client/audio_channels.h
deleted file mode 100644
index fdb4dc93..00000000
--- a/client/audio_channels.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_AUDIO_CHANNELS
-#define _H_AUDIO_CHANNELS
-
-#include "common/snd_codec.h"
-
-#include "red_channel.h"
-#include "debug.h"
-
-class ChannelFactory;
-
-class WavePlaybackAbstract;
-class WaveRecordAbstract;
-class RecordSamplesMessage;
-
-class PlaybackChannel: public RedChannel {
-public:
- PlaybackChannel(RedClient& client, uint32_t id);
- ~PlaybackChannel(void);
- bool abort(void);
-
- static ChannelFactory& Factory();
-
-protected:
- virtual void on_disconnect();
-
-private:
- void handle_mode(RedPeer::InMessage* message);
- void handle_start(RedPeer::InMessage* message);
- void handle_stop(RedPeer::InMessage* message);
- void handle_raw_data(RedPeer::InMessage* message);
- void handle_compressed_data(RedPeer::InMessage* message);
- void null_handler(RedPeer::InMessage* message);
- void disable();
-
- void set_data_handler();
-
- void clear();
-
-private:
- WavePlaybackAbstract* _wave_player;
- uint32_t _mode;
- uint32_t _frame_bytes;
- SndCodec _codec;
- bool _playing;
- uint32_t _frame_count;
-};
-
-class RecordChannel: public RedChannel, private Platform::RecordClient {
-public:
- RecordChannel(RedClient& client, uint32_t id);
- ~RecordChannel(void);
-
- bool abort(void);
-
- static ChannelFactory& Factory();
-
-protected:
- virtual void on_disconnect();
-
-private:
- void handle_start(RedPeer::InMessage* message);
- void handle_stop(RedPeer::InMessage* message);
-
- virtual void add_event_source(EventSources::File& event_source);
- virtual void remove_event_source(EventSources::File& event_source);
- virtual void add_event_source(EventSources::Trigger& event_source);
- virtual void remove_event_source(EventSources::Trigger& event_source);
- virtual void push_frame(uint8_t *frame);
-
- void set_desired_mode(int frequency);
- void send_record_mode();
- void send_start_mark();
- void release_message(RecordSamplesMessage *message);
- RecordSamplesMessage * get_message();
- void clear();
-
-private:
- WaveRecordAbstract* _wave_recorder;
- Mutex _messages_lock;
- std::list<RecordSamplesMessage *> _messages;
- int _mode;
- SndCodec _codec;
- uint32_t _frame_bytes;
-
- uint8_t compressed_buf[SND_CODEC_MAX_COMPRESSED_BYTES];
-
- friend class RecordSamplesMessage;
-};
-
-#endif
diff --git a/client/audio_devices.h b/client/audio_devices.h
deleted file mode 100644
index 111c3667..00000000
--- a/client/audio_devices.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_AUDIO_DEVICES
-#define _H_AUDIO_DEVICES
-
-class WavePlaybackAbstract {
-public:
- WavePlaybackAbstract() {}
- virtual ~WavePlaybackAbstract() {}
-
- virtual bool write(uint8_t* frame) = 0;
- virtual bool abort() = 0;
- virtual void stop() = 0;
- virtual uint32_t get_delay_ms() = 0;
-};
-
-class WaveRecordAbstract {
-public:
- WaveRecordAbstract() {}
- virtual ~WaveRecordAbstract() {}
-
-
- virtual void start() = 0;
- virtual void stop() = 0;
- virtual bool abort() = 0;
-};
-
-#endif
diff --git a/client/cache.hpp b/client/cache.hpp
deleted file mode 100644
index 7dce6715..00000000
--- a/client/cache.hpp
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_CACHE
-#define _H_CACHE
-
-#include "utils.h"
-
-/*class Cache::Treat {
- T* get(T*);
- void release(T*);
- const char* name();
-};*/
-
-template <class T, class Treat, int HASH_SIZE, class Base = EmptyBase>
-class Cache : public Base {
-public:
- Cache()
- {
- memset(_hash, 0, sizeof(_hash));
- }
-
- ~Cache()
- {
- clear();
- }
-
- void add(uint64_t id, T* data)
- {
- Item** item = &_hash[key(id)];
-
- while (*item) {
- if ((*item)->id == id) {
- spice_printerr("%s id %" PRIu64 ", double insert", Treat::name(), id);
- return;
- }
- item = &(*item)->next;
- }
- *item = new Item(id, data);
- }
-
- T* get(uint64_t id)
- {
- Item* item = _hash[key(id)];
-
- while (item && item->id != id) {
- item = item->next;
- }
-
- if (!item) {
- THROW("%s id %" PRIu64 ", not found", Treat::name(), id);
- }
- return Treat::get(item->data);
- }
-
- void remove(uint64_t id)
- {
- Item** item = &_hash[key(id)];
-
- while (*item) {
- if ((*item)->id == id) {
- Item *rm_item = *item;
- *item = rm_item->next;
- delete rm_item;
- return;
- }
- item = &(*item)->next;
- }
- THROW("%s id %" PRIu64 ", not found", Treat::name(), id);
- }
-
- void clear()
- {
- for (int i = 0; i < HASH_SIZE; i++) {
- while (_hash[i]) {
- Item *item = _hash[i];
- _hash[i] = item->next;
- delete item;
- }
- }
- }
-
-private:
- inline uint32_t key(uint64_t id) {return uint32_t(id) % HASH_SIZE;}
-
-private:
- class Item {
- public:
- Item(uint64_t in_id, T* data)
- : id (in_id)
- , next (NULL)
- , data (Treat::get(data)) {}
-
- ~Item()
- {
- Treat::release(data);
- }
-
- uint64_t id;
- Item* next;
- T* data;
- };
-
- Item* _hash[HASH_SIZE];
-};
-
-#endif
diff --git a/client/canvas.cpp b/client/canvas.cpp
deleted file mode 100644
index f132186a..00000000
--- a/client/canvas.cpp
+++ /dev/null
@@ -1,186 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-#include "canvas.h"
-#include "utils.h"
-#include "debug.h"
-
-static SpiceCanvas* surfaces_cache_op_get(SpiceImageSurfaces *surfaces, uint32_t surface_id)
-{
- SurfacesCache* surfaces_cache = static_cast<SurfacesCache*>(surfaces);
- if (!surfaces_cache->exist(surface_id)) {
- return NULL;
- }
- return (*surfaces_cache)[surface_id]->get_internal_canvas();
-}
-
-SurfacesCache::SurfacesCache()
-{
- static SpiceImageSurfacesOps surfaces_ops = {
- surfaces_cache_op_get,
- };
- ops = &surfaces_ops;
-}
-
-bool SurfacesCache::exist(uint32_t surface_id)
-{
- return (this->count(surface_id) != 0);
-}
-
-Canvas::Canvas(PixmapCache& pixmap_cache, PaletteCache& palette_cache,
- GlzDecoderWindow &glz_decoder_window, SurfacesCache &csurfaces)
- : _canvas (NULL)
- , _pixmap_cache (pixmap_cache)
- , _palette_cache (palette_cache)
- , _glz_decoder(glz_decoder_window, _glz_handler, _glz_debug)
- , _surfaces_cache(csurfaces)
-{
-}
-
-Canvas::~Canvas()
-{
- /* _canvas is both set and destroyed by derived class */
-}
-
-void Canvas::clear()
-{
- if (_canvas) {
- _canvas->ops->clear(_canvas);
- }
-}
-
-void Canvas::begin_draw(SpiceMsgDisplayBase& base, int size, size_t min_size)
-{
-}
-
-void Canvas::draw_fill(SpiceMsgDisplayDrawFill& fill, int size)
-{
- begin_draw(fill.base, size, sizeof(SpiceMsgDisplayDrawFill));
- _canvas->ops->draw_fill(_canvas, &fill.base.box, &fill.base.clip, &fill.data);
- touched_bbox(&fill.base.box);
-}
-
-void Canvas::draw_text(SpiceMsgDisplayDrawText& text, int size)
-{
- begin_draw(text.base, size, sizeof(SpiceMsgDisplayDrawText));
- _canvas->ops->draw_text(_canvas, &text.base.box, &text.base.clip, &text.data);
- touched_bbox(&text.base.box);
-}
-
-void Canvas::draw_opaque(SpiceMsgDisplayDrawOpaque& opaque, int size)
-{
- begin_draw(opaque.base, size, sizeof(SpiceMsgDisplayDrawOpaque));
- _canvas->ops->draw_opaque(_canvas, &opaque.base.box, &opaque.base.clip, &opaque.data);
- touched_bbox(&opaque.base.box);
-}
-
-void Canvas::draw_copy(SpiceMsgDisplayDrawCopy& copy, int size)
-{
- begin_draw(copy.base, size, sizeof(SpiceMsgDisplayDrawCopy));
- _canvas->ops->draw_copy(_canvas, &copy.base.box, &copy.base.clip, &copy.data);
- touched_bbox(&copy.base.box);
-}
-
-void Canvas::draw_transparent(SpiceMsgDisplayDrawTransparent& transparent, int size)
-{
- begin_draw(transparent.base, size, sizeof(SpiceMsgDisplayDrawTransparent));
- _canvas->ops->draw_transparent(_canvas, &transparent.base.box, &transparent.base.clip, &transparent.data);
- touched_bbox(&transparent.base.box);
-}
-
-void Canvas::draw_alpha_blend(SpiceMsgDisplayDrawAlphaBlend& alpha_blend, int size)
-{
- begin_draw(alpha_blend.base, size, sizeof(SpiceMsgDisplayDrawAlphaBlend));
- _canvas->ops->draw_alpha_blend(_canvas, &alpha_blend.base.box, &alpha_blend.base.clip, &alpha_blend.data);
- touched_bbox(&alpha_blend.base.box);
-}
-
-void Canvas::draw_composite(SpiceMsgDisplayDrawComposite& composite, int size)
-{
- begin_draw(composite.base, size, sizeof(SpiceMsgDisplayDrawComposite));
- _canvas->ops->draw_composite(_canvas, &composite.base.box, &composite.base.clip, &composite.data);
- touched_bbox(&composite.base.box);
-}
-
-void Canvas::copy_bits(SpiceMsgDisplayCopyBits& copy, int size)
-{
- begin_draw(copy.base, size, sizeof(SpiceMsgDisplayCopyBits));
- _canvas->ops->copy_bits(_canvas, &copy.base.box, &copy.base.clip, &copy.src_pos);
- touched_bbox(&copy.base.box);
-}
-
-void Canvas::draw_blend(SpiceMsgDisplayDrawBlend& blend, int size)
-{
- begin_draw(blend.base, size, sizeof(SpiceMsgDisplayDrawBlend));
- _canvas->ops->draw_blend(_canvas, &blend.base.box, &blend.base.clip, &blend.data);
- touched_bbox(&blend.base.box);
-}
-
-void Canvas::draw_blackness(SpiceMsgDisplayDrawBlackness& blackness, int size)
-{
- begin_draw(blackness.base, size, sizeof(SpiceMsgDisplayDrawBlackness));
- _canvas->ops->draw_blackness(_canvas, &blackness.base.box, &blackness.base.clip, &blackness.data);
- touched_bbox(&blackness.base.box);
-}
-
-void Canvas::draw_whiteness(SpiceMsgDisplayDrawWhiteness& whiteness, int size)
-{
- begin_draw(whiteness.base, size, sizeof(SpiceMsgDisplayDrawWhiteness));
- _canvas->ops->draw_whiteness(_canvas, &whiteness.base.box, &whiteness.base.clip, &whiteness.data);
- touched_bbox(&whiteness.base.box);
-}
-
-void Canvas::draw_invers(SpiceMsgDisplayDrawInvers& invers, int size)
-{
- begin_draw(invers.base, size, sizeof(SpiceMsgDisplayDrawInvers));
- _canvas->ops->draw_invers(_canvas, &invers.base.box, &invers.base.clip, &invers.data);
- touched_bbox(&invers.base.box);
-}
-
-void Canvas::draw_rop3(SpiceMsgDisplayDrawRop3& rop3, int size)
-{
- begin_draw(rop3.base, size, sizeof(SpiceMsgDisplayDrawRop3));
- _canvas->ops->draw_rop3(_canvas, &rop3.base.box, &rop3.base.clip, &rop3.data);
- touched_bbox(&rop3.base.box);
-}
-
-void Canvas::draw_stroke(SpiceMsgDisplayDrawStroke& stroke, int size)
-{
- begin_draw(stroke.base, size, sizeof(SpiceMsgDisplayDrawStroke));
- _canvas->ops->draw_stroke(_canvas, &stroke.base.box, &stroke.base.clip, &stroke.data);
- touched_bbox(&stroke.base.box);
-}
-
-void Canvas::put_image(
-#ifdef WIN32
- HDC dc,
-#endif
- const PixmapHeader& image, const SpiceRect& dest, const QRegion* clip)
-{
- _canvas->ops->put_image(_canvas,
-#ifdef WIN32
- dc,
-#endif
- &dest, image.data, image.width, image.height, image.stride,
- clip);
- touched_bbox(&dest);
-}
diff --git a/client/canvas.h b/client/canvas.h
deleted file mode 100644
index 213a7538..00000000
--- a/client/canvas.h
+++ /dev/null
@@ -1,352 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_CANVAS
-#define _H_CANVAS
-
-#include <map>
-
-#include "common/region.h"
-#include "common/messages.h"
-#include "common/canvas_utils.h"
-
-#include "common.h"
-#include "debug.h"
-#include "cache.hpp"
-#include "shared_cache.hpp"
-#include "glz_decoded_image.h"
-#include "glz_decoder.h"
-#include "jpeg_decoder.h"
-#include "zlib_decoder.h"
-
-enum CanvasType {
- CANVAS_TYPE_INVALID,
- CANVAS_TYPE_SW,
- CANVAS_TYPE_GL,
- CANVAS_TYPE_GDI,
-};
-
-class PixmapCacheTreat {
-public:
- static inline pixman_image_t *get(pixman_image_t *surf)
- {
- return pixman_image_ref(surf);
- }
-
- static inline void release(pixman_image_t *surf)
- {
- pixman_image_unref(surf);
- }
-
- static const char* name() { return "pixmap";}
-};
-
-class SpiceImageCacheBase;
-
-typedef SharedCache<pixman_image_t, PixmapCacheTreat, 1024, SpiceImageCacheBase> PixmapCache;
-
-class SpiceImageCacheBase {
-public:
- SpiceImageCache base;
-
- static void op_put(SpiceImageCache *c, uint64_t id, pixman_image_t *surface)
- {
- PixmapCache* cache = reinterpret_cast<PixmapCache*>(c);
- cache->add(id, surface);
- }
-
- static void op_put_lossy(SpiceImageCache *c, uint64_t id, pixman_image_t *surface)
- {
- PixmapCache* cache = reinterpret_cast<PixmapCache*>(c);
- cache->add(id, surface, TRUE);
- }
-
- static void op_replace_lossy(SpiceImageCache *c, uint64_t id, pixman_image_t *surface)
- {
- PixmapCache* cache = reinterpret_cast<PixmapCache*>(c);
- cache->replace(id, surface);
- }
-
- static pixman_image_t* op_get(SpiceImageCache *c, uint64_t id)
- {
- PixmapCache* cache = reinterpret_cast<PixmapCache*>(c);
- return cache->get(id);
- }
-
- static pixman_image_t* op_get_lossless(SpiceImageCache *c, uint64_t id)
- {
- PixmapCache* cache = reinterpret_cast<PixmapCache*>(c);
- return cache->get_lossless(id);
- }
-
- SpiceImageCacheBase()
- {
- static SpiceImageCacheOps cache_ops = {
- op_put,
- op_get,
- op_put_lossy,
- op_replace_lossy,
- op_get_lossless
- };
- base.ops = &cache_ops;
- }
-};
-
-
-class CachedPalette {
-public:
- CachedPalette(SpicePalette* palette)
- : _refs(1)
- {
- int size = sizeof(SpicePalette) + palette->num_ents * sizeof(uint32_t);
- CachedPalette **ptr = (CachedPalette **)new uint8_t[size + sizeof(CachedPalette *)];
- *ptr = this;
- _palette = (SpicePalette*)(ptr + 1);
- memcpy(_palette, palette, size);
- }
-
- CachedPalette* ref()
- {
- _refs++;
- return this;
- }
-
- void unref()
- {
- if (--_refs == 0) {
- delete this;
- }
- }
-
- static void unref(SpicePalette *pal)
- {
- CachedPalette **ptr = (CachedPalette **)pal;
- (*(ptr - 1))->unref();
- }
-
- SpicePalette* palette() { return _palette;}
-
-private:
- ~CachedPalette()
- {
- delete[] (uint8_t *)((CachedPalette **)_palette - 1);
- }
-
-private:
- int _refs;
- SpicePalette* _palette;
-};
-
-class PaletteCacheTreat {
-public:
- static inline CachedPalette* get(CachedPalette* palette)
- {
- return palette->ref();
- }
-
- static inline void release(CachedPalette* palette)
- {
- palette->unref();
- }
-
- static const char* name() { return "palette";}
-};
-
-class SpicePaletteCacheBase;
-typedef Cache<CachedPalette, PaletteCacheTreat, 1024, SpicePaletteCacheBase> PaletteCache;
-
-class SpicePaletteCacheBase {
-public:
- SpicePaletteCache base;
-
- static void op_put(SpicePaletteCache *c, SpicePalette *palette)
- {
- PaletteCache* cache = reinterpret_cast<PaletteCache*>(c);
- AutoRef<CachedPalette> cached_palette(new CachedPalette(palette));
- cache->add(palette->unique, *cached_palette);
- }
-
- static SpicePalette* op_get(SpicePaletteCache *c, uint64_t id)
- {
- PaletteCache* cache = reinterpret_cast<PaletteCache*>(c);
- return cache->get(id)->palette();
- }
-
- static void op_release (SpicePaletteCache *c,
- SpicePalette *palette)
- {
- CachedPalette::unref(palette);
- }
-
- SpicePaletteCacheBase()
- {
- static SpicePaletteCacheOps cache_ops = {
- op_put,
- op_get,
- op_release
- };
- base.ops = &cache_ops;
- }
-};
-
-
-/* Lz decoder related classes */
-
-class GlzDecodedSurface: public GlzDecodedImage {
-public:
- GlzDecodedSurface(uint64_t id, uint64_t win_head_id, uint8_t *data, int size,
- int bytes_per_pixel, pixman_image_t *surface)
- : GlzDecodedImage(id, win_head_id, data, size, bytes_per_pixel)
- , _surface (surface)
- {
- pixman_image_ref(_surface);
- }
-
- virtual ~GlzDecodedSurface()
- {
- pixman_image_unref(_surface);
- }
-
-private:
- pixman_image_t *_surface;
-};
-
-class GlzDecodeSurfaceHandler: public GlzDecodeHandler {
-public:
- virtual GlzDecodedImage *alloc_image(void *opaque_usr_info, uint64_t image_id,
- uint64_t image_win_head_id, LzImageType type,
- int width, int height, int gross_pixels,
- int n_bytes_per_pixel, bool top_down)
- {
- ASSERT(type == LZ_IMAGE_TYPE_RGB32 || type == LZ_IMAGE_TYPE_RGBA);
-
- pixman_image_t *surface =
- alloc_lz_image_surface((LzDecodeUsrData *)opaque_usr_info,
- type == LZ_IMAGE_TYPE_RGBA ? PIXMAN_a8r8g8b8 : PIXMAN_x8r8g8b8,
- width, height, gross_pixels, top_down);
- uint8_t *data = (uint8_t *)pixman_image_get_data(surface);
- if (!top_down) {
- data = data - (gross_pixels / height) * n_bytes_per_pixel * (height - 1);
- }
-
- return (new GlzDecodedSurface(image_id, image_win_head_id, data,
- gross_pixels, n_bytes_per_pixel, surface));
- }
-};
-
-/* TODO: unite with the window debug callbacks? */
-class GlzDecoderCanvasDebug: public GlzDecoderDebug {
-public:
- virtual SPICE_GNUC_NORETURN void error(const std::string& str)
- {
- throw Exception(str);
- }
-
- virtual void warn(const std::string& str)
- {
- LOG_WARN("%s", str.c_str());
- }
-
- virtual void info(const std::string& str)
- {
- LOG_INFO("%s", str.c_str());
- }
-};
-
-class Canvas;
-
-typedef std::map<uint32_t, Canvas*> SurfacesCanvasesMap;
-
-class SurfacesCache: public SpiceImageSurfaces, public SurfacesCanvasesMap {
-public:
- SurfacesCache();
- bool exist(uint32_t surface_id);
-};
-
-class Canvas {
-public:
- Canvas(PixmapCache& bits_cache, PaletteCache& palette_cache,
- GlzDecoderWindow &glz_decoder_window, SurfacesCache& csurfaces);
- virtual ~Canvas();
-
- virtual void copy_pixels(const QRegion& region, RedDrawable* dc,
- const PixmapHeader* pixmap) = 0;
- virtual void copy_pixels(const QRegion& region, RedDrawable& dc) = 0;
- virtual void thread_touch() = 0;
-
- void clear();
-
- void draw_fill(SpiceMsgDisplayDrawFill& fill, int size);
- void draw_text(SpiceMsgDisplayDrawText& text, int size);
- void draw_opaque(SpiceMsgDisplayDrawOpaque& opaque, int size);
- void draw_copy(SpiceMsgDisplayDrawCopy& copy, int size);
- void draw_transparent(SpiceMsgDisplayDrawTransparent& transparent, int size);
- void draw_alpha_blend(SpiceMsgDisplayDrawAlphaBlend& alpha_blend, int size);
- void copy_bits(SpiceMsgDisplayCopyBits& copy_bits, int size);
- void draw_blend(SpiceMsgDisplayDrawBlend& blend, int size);
- void draw_blackness(SpiceMsgDisplayDrawBlackness& blackness, int size);
- void draw_whiteness(SpiceMsgDisplayDrawWhiteness& whiteness, int size);
- void draw_invers(SpiceMsgDisplayDrawInvers& invers, int size);
- void draw_rop3(SpiceMsgDisplayDrawRop3& rop3, int size);
- void draw_stroke(SpiceMsgDisplayDrawStroke& stroke, int size);
- void draw_composite(SpiceMsgDisplayDrawComposite& composite, int size);
-
- void put_image(
-#ifdef WIN32
- HDC dc,
-#endif
- const PixmapHeader& image,
- const SpiceRect& dest, const QRegion* clip);
-
- virtual CanvasType get_pixmap_type() { return CANVAS_TYPE_INVALID; }
-
- virtual SpiceCanvas *get_internal_canvas() { return _canvas; }
-
-protected:
- virtual void touched_bbox(const SpiceRect *bbox) {};
-
- PixmapCache& pixmap_cache() { return _pixmap_cache;}
- PaletteCache& palette_cache() { return _palette_cache;}
- SurfacesCache& surfaces_cache() { return _surfaces_cache;}
-
- GlzDecoder& glz_decoder() {return _glz_decoder;}
- JpegDecoder& jpeg_decoder() { return _jpeg_decoder;}
- ZlibDecoder& zlib_decoder() { return _zlib_decoder;}
-
-private:
- void begin_draw(SpiceMsgDisplayBase& base, int size, size_t min_size);
-
-protected:
- SpiceCanvas* _canvas;
-
-private:
- PixmapCache& _pixmap_cache;
- PaletteCache& _palette_cache;
-
- GlzDecodeSurfaceHandler _glz_handler;
- GlzDecoderCanvasDebug _glz_debug;
- GlzDecoder _glz_decoder;
-
- JpegDecoder _jpeg_decoder;
- ZlibDecoder _zlib_decoder;
-
- SurfacesCache& _surfaces_cache;
-};
-
-
-#endif
diff --git a/client/client_net_socket.cpp b/client/client_net_socket.cpp
deleted file mode 100644
index 9df68014..00000000
--- a/client/client_net_socket.cpp
+++ /dev/null
@@ -1,388 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-
-
- Author:
- yhalperi@redhat.com
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-#include "client_net_socket.h"
-#include "debug.h"
-#include <spice/error_codes.h>
-#include "utils.h"
-
-ClientNetSocket::ClientNetSocket(uint16_t id, const struct in_addr& dst_addr, uint16_t dst_port,
- ProcessLoop& process_loop, EventHandler& event_handler)
- : _id (id)
- , _local_addr (dst_addr)
- , _local_port (dst_port)
- , _peer (INVALID_SOCKET)
- , _process_loop (process_loop)
- , _event_handler (event_handler)
- , _num_recv_tokens (0)
- , _send_message (NULL)
- , _send_pos (0)
- , _status (SOCKET_STATUS_CLOSED)
- , _fin_pending (false)
- , _close_pending (false)
-{
-}
-
-ClientNetSocket::~ClientNetSocket()
-{
- close();
-}
-
-bool ClientNetSocket::connect(uint32_t recv_tokens)
-{
- struct sockaddr_in addr;
- int no_delay;
-
-
- ASSERT(_peer == INVALID_SOCKET && _status == SOCKET_STATUS_CLOSED);
-
- addr.sin_port = _local_port;
- addr.sin_addr.s_addr = _local_addr.s_addr;
- addr.sin_family = AF_INET;
-
- if ((_peer = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) {
- int err = sock_error();
- THROW("%s: failed to create socket: %s", __FUNCTION__, sock_err_message(err));
- }
-
- no_delay = 1;
- if (setsockopt(_peer, IPPROTO_TCP, TCP_NODELAY,
- (const char*)&no_delay, sizeof(no_delay)) == SOCKET_ERROR) {
- LOG_WARN("set TCP_NODELAY failed");
- }
-
- LOG_INFO("connect to ip=%s port=%d (connection_id=%d)",
- inet_ntoa(addr.sin_addr), ntohs(addr.sin_port), _id);
-
- if (::connect(_peer, (struct sockaddr*)&addr, sizeof(sockaddr_in)) == SOCKET_ERROR) {
- int err = sock_error();
- closesocket(_peer);
- _peer = INVALID_SOCKET;
- LOG_INFO("connect to ip=%s port=%d failed %s (connection_id=%d)",
- inet_ntoa(addr.sin_addr), ntohs(addr.sin_port), sock_err_message(err), _id);
- return false;
- }
-
- _process_loop.add_socket(*this);
- _status = SOCKET_STATUS_OPEN;
- _num_recv_tokens = recv_tokens;
- return true;
-}
-
-void ClientNetSocket::push_disconnect()
-{
- if ((_status == SOCKET_STATUS_CLOSED) || _close_pending) {
- THROW("%s: disconnect attempt for disconnected socket %s %d", __FUNCTION__,
- inet_ntoa(_local_addr), ntohs(_local_port));
- }
-
- _close_pending = true;
-
- if (!during_send()) {
- close_and_tell();
- }
-}
-
-void ClientNetSocket::push_fin()
-{
- if ((_status == SOCKET_STATUS_OPEN) || (_status == SOCKET_STATUS_RECEIVED_FIN)) {
- _fin_pending = true;
- if (!during_send()) {
- try {
- apply_guest_fin();
- } catch (ClientNetSocket::ShutdownExcpetion&) {
- close_and_tell();
- }
- }
- } else {
- THROW("%s: unexpected fin connection_id=%d (status=%d)", __FUNCTION__,
- _id, _status);
- }
-}
-
-void ClientNetSocket::add_recv_tokens(uint32_t num_tokens)
-{
- if ((_status == SOCKET_STATUS_CLOSED) || _close_pending) {
- THROW("%s: ack attempt for disconnected socket connection_id=%d", __FUNCTION__,
- _id);
- }
-
- _num_recv_tokens += num_tokens;
-
- // recv might have not been called because tokens weren't available
- if (_num_recv_tokens && (_num_recv_tokens == num_tokens)) {
- if (can_receive()) {
- receive();
- }
- }
-}
-
-void ClientNetSocket::push_send(SendBuffer& buf)
-{
- if (!can_send()) {
- THROW("%s: unexpected send attempt for connection_id=%d (status = %d)",
- __FUNCTION__, _id, _status);
- }
-
- if (_fin_pending || _close_pending) {
- THROW("%s: unexpected send attempt for connection_id=%d - shutdown send pending",
- __FUNCTION__, _id);
- }
-
- _send_messages.push_back(buf.ref());
- send();
-}
-
-void ClientNetSocket::on_event()
-{
- if (can_send()) {
- send();
- }
-
- if (!during_send()) {
- if (_close_pending) {
- close_and_tell();
- } else if (_fin_pending) {
- apply_guest_fin();
- }
- }
-
- if (can_receive()) {
- receive();
- }
-}
-
-void ClientNetSocket::apply_guest_fin()
-{
- if (_status == SOCKET_STATUS_OPEN) {
- if (shutdown(_peer, SHUT_WR) == SOCKET_ERROR) {
- int err = sock_error();
- LOG_INFO("shutdown in connection_id=%d failed %s", _id, sock_err_message(err));
- throw ClientNetSocket::ShutdownExcpetion();
- }
-
- _fin_pending = false;
- _status = SOCKET_STATUS_SENT_FIN;
- } else if (_status == SOCKET_STATUS_RECEIVED_FIN) {
- close_and_tell();
- }
-}
-
-void ClientNetSocket::handle_client_fin()
-{
- if (_status == SOCKET_STATUS_OPEN) {
- _status = SOCKET_STATUS_RECEIVED_FIN;
- _event_handler.on_socket_fin_recv(*this);
- } else if (_status == SOCKET_STATUS_SENT_FIN) {
- close_and_tell();
- }
-}
-
-inline bool ClientNetSocket::during_send()
-{
- return ((!_send_messages.empty()) || _send_message);
-}
-
-inline bool ClientNetSocket::can_send()
-{
- return ((_status == SOCKET_STATUS_OPEN) || (_status == SOCKET_STATUS_RECEIVED_FIN));
-}
-
-inline bool ClientNetSocket::can_receive()
-{
- return ((_status == SOCKET_STATUS_OPEN) || (_status == SOCKET_STATUS_SENT_FIN));
-}
-
-void ClientNetSocket::send_message_done()
-{
- _send_message->unref();
- _send_message = NULL;
- _send_pos = 0;
- _event_handler.on_socket_message_send_done(*this);
-}
-
-void ClientNetSocket::send()
-{
- ASSERT(_peer != INVALID_SOCKET);
- try {
- if (_send_message) {
- _send_pos += send_buf(_send_message->data() + _send_pos,
- _send_message->size() - _send_pos);
-
- if (_send_pos != _send_message->size()) {
- return;
- } else {
- send_message_done();
- }
- }
-
- while (!_send_messages.empty()) {
- _send_message = _send_messages.front();
- _send_messages.pop_front();
- _send_pos = send_buf(_send_message->data(), _send_message->size());
- if (_send_pos != _send_message->size()) {
- return;
- } else {
- send_message_done();
- }
- }
- } catch (ClientNetSocket::SendException&) {
- close_and_tell();
- }
-}
-
-uint32_t ClientNetSocket::send_buf(const uint8_t* buf, uint32_t size)
-{
- const uint8_t* pos = buf;
- ASSERT(_peer != INVALID_SOCKET);
- while (size) {
- int now;
- if ((now = ::send(_peer, (char*)pos, size, MSG_NOSIGNAL)) == SOCKET_ERROR) {
- int err = sock_error();
- if (err == WOULDBLOCK_ERR) {
- break;
- }
-
- if (err == INTERRUPTED_ERR) {
- continue;
- }
-
- LOG_INFO("send in connection_id=%d failed %s", _id, sock_err_message(err));
- throw ClientNetSocket::SendException();
- }
- size -= now;
- pos += now;
- }
- return pos - buf;
-}
-
-void ClientNetSocket::receive()
-{
- ASSERT(_peer != INVALID_SOCKET);
- bool shutdown;
- while (_num_recv_tokens) {
- ReceiveBuffer& rcv_buf = alloc_receive_buffer();
- uint32_t size;
-
- try {
- size = receive_buf(rcv_buf.buf(), rcv_buf.buf_max_size(), shutdown);
- } catch (ClientNetSocket::ReceiveException&) {
- rcv_buf.release_buf();
- close_and_tell();
- return;
- }
-
- if (size) {
- rcv_buf.set_buf_size(size);
- _num_recv_tokens--;
- _event_handler.on_socket_message_recv_done(*this, rcv_buf);
- } else {
- rcv_buf.release_buf();
- }
-
- if (shutdown) {
- handle_client_fin();
- return;
- }
-
- if (size < rcv_buf.buf_max_size()) {
- return;
- }
- }
-}
-
-uint32_t ClientNetSocket::receive_buf(uint8_t* buf, uint32_t max_size, bool& shutdown)
-{
- uint8_t* pos = buf;
- ASSERT(_peer != INVALID_SOCKET);
-
- shutdown = false;
-
- while (max_size) {
- int now;
- if ((now = ::recv(_peer, (char*)pos, max_size, 0)) <= 0) {
- if (now == 0) {
- shutdown = true;
- break; // a case where fin is received, but before that, there is a msg
- }
-
- int err = sock_error();
-
- if (err == WOULDBLOCK_ERR) {
- break;
- }
-
- if (err == INTERRUPTED_ERR) {
- continue;
- }
-
- LOG_INFO("receive in connection_id=%d failed errno=%s", _id, sock_err_message(err));
- throw ClientNetSocket::ReceiveException();
- }
- max_size -= now;
- pos += now;
- }
-
- return (pos - buf);
-}
-
-void ClientNetSocket::release_wait_send_messages()
-{
- if (_send_message) {
- _send_message->unref();
- _send_message = NULL;
- _send_pos = 0;
- }
-
- while (!_send_messages.empty()) {
- _send_messages.front()->unref();
- _send_messages.pop_front();
- }
-}
-
-void ClientNetSocket::close()
-{
- release_wait_send_messages();
- apply_disconnect();
-}
-
-void ClientNetSocket::close_and_tell()
-{
- close();
- _event_handler.on_socket_disconnect(*this);
-}
-
-void ClientNetSocket::apply_disconnect()
-{
- if (_peer != INVALID_SOCKET) {
- _process_loop.remove_socket(*this);
- closesocket(_peer);
- _peer = INVALID_SOCKET;
- LOG_INFO("closing connection_id=%d", _id);
- }
- _status = SOCKET_STATUS_CLOSED;
- _close_pending = false;
- _fin_pending = false;
-}
diff --git a/client/client_net_socket.h b/client/client_net_socket.h
deleted file mode 100644
index bc9bdd15..00000000
--- a/client/client_net_socket.h
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-
- Author:
- yhalperi@redhat.com
-*/
-
-#ifndef _H_CLIENT_NET_SOCKET
-#define _H_CLIENT_NET_SOCKET
-
-#include "platform_utils.h"
-#include "common.h"
-#include "process_loop.h"
-
-/* interface for connections inside client LAN */
-
-typedef enum {
- SOCKET_STATUS_OPEN,
- SOCKET_STATUS_SENT_FIN,
- SOCKET_STATUS_RECEIVED_FIN,
- SOCKET_STATUS_CLOSED,
-} SocketStatus;
-
-class ClientNetSocket: public EventSources::Socket {
-public:
- class ReceiveBuffer;
- class SendBuffer;
-
- class EventHandler;
-
- class SendException {};
- class ReceiveException {};
- class ShutdownExcpetion {};
-
- ClientNetSocket(uint16_t id, const struct in_addr& dst_addr, uint16_t dst_port,
- ProcessLoop& process_loop, ClientNetSocket::EventHandler& event_handler);
- virtual ~ClientNetSocket();
-
- bool connect(uint32_t recv_tokens);
- void push_disconnect();
- void push_fin();
- void push_send(SendBuffer& buf);
- void add_recv_tokens(uint32_t num_tokens);
-
- bool is_connected() {return _status != SOCKET_STATUS_CLOSED;}
-
- inline uint16_t id() {return _id;}
- inline const struct in_addr& local_addr() {return _local_addr;}
- inline uint16_t local_port() {return _local_port;}
-
- /* EventSources::Socket interface */
- void on_event();
- int get_socket() {return _peer;}
-
-protected:
- virtual ReceiveBuffer& alloc_receive_buffer() = 0;
-
-private:
- void send();
- void receive();
-
- uint32_t send_buf(const uint8_t* buf, uint32_t size);
- uint32_t receive_buf(uint8_t* buf, uint32_t max_size, bool& shutdown);
-
- bool can_receive();
- bool can_send();
-
- void apply_disconnect();
- void apply_guest_fin();
-
- void close();
- void close_and_tell();
-
- void handle_client_fin();
-
- bool during_send();
- void release_wait_send_messages();
- void clear();
- void send_message_done();
-
-private:
- uint16_t _id;
- struct in_addr _local_addr;
- uint16_t _local_port;
-
- SOCKET _peer;
-
- ProcessLoop& _process_loop;
-
- EventHandler& _event_handler;
-
- uint32_t _num_recv_tokens;
-
- std::list<SendBuffer*> _send_messages;
- SendBuffer* _send_message;
- uint32_t _send_pos;
-
- SocketStatus _status;
- bool _fin_pending;
- bool _close_pending;
-};
-
-class ClientNetSocket::ReceiveBuffer {
-public:
- ReceiveBuffer() {}
-
- virtual uint8_t* buf() = 0;
- virtual uint32_t buf_max_size() = 0;
- virtual void set_buf_size(uint32_t size) = 0;
- virtual void release_buf() = 0;
-
-protected:
- virtual ~ReceiveBuffer() {}
-};
-
-class ClientNetSocket::SendBuffer {
-public:
- SendBuffer() {};
-
- virtual const uint8_t* data() = 0;
- virtual uint32_t size() = 0;
- virtual ClientNetSocket::SendBuffer* ref() = 0;
- virtual void unref() = 0;
-
-protected:
- virtual ~SendBuffer() {}
-};
-
-class ClientNetSocket::EventHandler {
-public:
- EventHandler() {}
- virtual ~EventHandler() {}
- virtual void on_socket_message_recv_done(ClientNetSocket& sckt, ReceiveBuffer& buf) = 0;
- virtual void on_socket_message_send_done(ClientNetSocket& sckt) = 0;
- virtual void on_socket_disconnect(ClientNetSocket& sckt) = 0;
- virtual void on_socket_fin_recv(ClientNetSocket& sckt) = 0;
-};
-
-
-
-#endif
diff --git a/client/cmd_line_parser.cpp b/client/cmd_line_parser.cpp
deleted file mode 100644
index 12d5945b..00000000
--- a/client/cmd_line_parser.cpp
+++ /dev/null
@@ -1,518 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-
-#include <getopt.h>
-#include <iostream>
-
-#include "cmd_line_parser.h"
-#include "utils.h"
-#include "debug.h"
-
-#define DISABLE_ABBREVIATE
-
-
-CmdLineParser::Option::Option(int in_id, const std::string& in_name, char in_short_name,
- OptionType in_type, const std::string& in_help,
- const std::string& in_arg_name)
- : id (in_id)
- , name (in_name)
- , arg_name (in_arg_name)
- , type (in_type)
- , short_name (in_short_name)
- , help (in_help)
- , optional (true)
- , is_set (false)
- , separator (0)
-{
-}
-
-CmdLineParser::CmdLineParser(std::string description, bool allow_positional_args)
- : _description (description)
- , _short_options ("+")
- , _argc (0)
- , _argv (NULL)
- , _multi_args (NULL)
- , _multi_next (NULL)
- , _multi_separator (0)
- , _positional_args (allow_positional_args)
- , _done (false)
-{
- //Enables multiple instantiations. One at a time, not thread-safe.
- optind = 1;
- opterr = 1;
- optopt = 0;
- optarg = 0;
-}
-
-CmdLineParser::~CmdLineParser()
-{
- Options::iterator iter = _options.begin();
- for (; iter != _options.end(); ++iter) {
- delete *iter;
- }
- delete[] _multi_args;
-}
-
-void CmdLineParser::add_private(int id, const std::string& name, char short_name,
- OptionType type, const std::string& help,
- const std::string& arg_name)
-{
- if (_argv) {
- THROW("unexpected");
- }
-
- if (find(id)) {
- THROW("exist");
- }
-
- if (name.size() == 0) {
- THROW("invalid name");
- }
-
- if (find(name)) {
- THROW("name exist");
- }
-
- if (short_name != 0) {
- if (!isalnum(short_name) || short_name == 'W') {
- THROW("invalid short name");
- }
-
- if (find(short_name)) {
- THROW("short name exist");
- }
- }
-
- if (help.size() == 0) {
- THROW("invalid help string");
- }
-
- if (help.find_first_of('\t') != std::string::npos) {
- THROW("tab is not allow in help string");
- }
-
- _options.push_back(new Option(id, name, short_name, type, help, arg_name));
-}
-
-void CmdLineParser::add(int id, const std::string& name, const std::string& help, char short_name)
-{
- if (id < OPTION_FIRST_AVAILABLE) {
- THROW("invalid id");
- }
- add_private(id, name, short_name, NO_ARGUMENT, help, "");
-}
-
-void CmdLineParser::add(int id, const std::string& name, const std::string& help,
- const std::string& arg_name, bool required_arg, char short_name)
-{
- if (id < OPTION_FIRST_AVAILABLE) {
- THROW("invalid id");
- }
-
- if (arg_name.size() == 0) {
- THROW("invalid arg name");
- }
-
- add_private(id, name, short_name, required_arg ? REQUIRED_ARGUMENT : OPTIONAL_ARGUMENT, help,
- arg_name);
-}
-
-void CmdLineParser::set_multi(int id, char separator)
-{
- if (_argv) {
- THROW("unexpected");
- }
-
- if (!ispunct(separator)) {
- THROW("invalid separator");
- }
-
- Option* opt = find(id);
-
- if (!opt) {
- THROW("not found");
- }
-
- if (opt->type == NO_ARGUMENT) {
- THROW("can't set multi for option without argument");
- }
-
- opt->separator = separator;
-}
-
-void CmdLineParser::set_required(int id)
-{
- if (_argv) {
- THROW("unexpected");
- }
-
- Option* opt = find(id);
-
- if (!opt) {
- THROW("not found");
- }
-
- opt->optional = false;
-}
-
-CmdLineParser::Option* CmdLineParser::find(int id)
-{
- Options::iterator iter = _options.begin();
- for (; iter != _options.end(); ++iter) {
- if ((*iter)->id == id) {
- return *iter;
- }
- }
- return NULL;
-}
-
-bool CmdLineParser::is_set(int id)
-{
- Option *opt = find(id);
-
- if (!opt) {
- THROW("not found");
- }
- return opt->is_set;
-}
-
-CmdLineParser::Option* CmdLineParser::find(const std::string& name)
-{
- Options::iterator iter = _options.begin();
- for (; iter != _options.end(); ++iter) {
- if ((*iter)->name == name) {
- return *iter;
- }
- }
- return NULL;
-}
-
-CmdLineParser::Option* CmdLineParser::find(char short_name)
-{
- if (short_name == 0) {
- return NULL;
- }
-
- Options::iterator iter = _options.begin();
- for (; iter != _options.end(); ++iter) {
- if ((*iter)->short_name == short_name) {
- return *iter;
- }
- }
- return NULL;
-}
-
-CmdLineParser::Option* CmdLineParser::find_missing_opt()
-{
- Options::iterator iter = _options.begin();
- for (; iter != _options.end(); ++iter) {
- CmdLineParser::Option* opt = *iter;
- if (!opt->optional && !opt->is_set) {
- return opt;
- }
- }
- return NULL;
-}
-
-void CmdLineParser::build()
-{
- Options::iterator iter = _options.begin();
- _long_options.resize(_options.size() + 1);
- for (int i = 0; iter != _options.end(); ++iter, i++) {
- CmdLineParser::Option* opt = *iter;
- struct option& long_option = _long_options[i];
- long_option.name = opt->name.c_str();
- switch (opt->type) {
- case NO_ARGUMENT:
- long_option.has_arg = no_argument;
- break;
- case OPTIONAL_ARGUMENT:
- long_option.has_arg = optional_argument;
- break;
- case REQUIRED_ARGUMENT:
- long_option.has_arg = required_argument;
- break;
- }
- long_option.flag = &long_option.val;
- long_option.val = opt->id;
- if (opt->short_name != 0) {
- _short_options += opt->short_name;
- switch (opt->type) {
- case OPTIONAL_ARGUMENT:
- _short_options += "::";
- break;
- case REQUIRED_ARGUMENT:
- _short_options += ":";
- break;
- case NO_ARGUMENT:
- break;
- }
- }
- }
- struct option& long_option = _long_options[_long_options.size() - 1];
- long_option.flag = 0;
- long_option.has_arg = 0;
- long_option.name = NULL;
- long_option.val = 0;
-}
-
-void CmdLineParser::begin(int argc, char** argv)
-{
- if (_argv) {
- THROW("unexpected");
- }
-
- if (!argv || argc < 1) {
- THROW("invalid args");
- }
-
- add_private(CmdLineParser::OPTION_HELP, "help", 0, NO_ARGUMENT, "show command help", "");
- opterr = 0;
- _argv = argv;
- _argc = argc;
- build();
-}
-
-char* CmdLineParser::start_multi(char *optarg, char separator)
-{
- if (!optarg) {
- return NULL;
- }
- _multi_args = new char[strlen(optarg) + 1];
- _multi_separator = separator;
- strcpy(_multi_args, optarg);
- if ((_multi_next = strchr(_multi_args, _multi_separator))) {
- *(_multi_next++) = 0;
- }
- return _multi_args;
-}
-
-char* CmdLineParser::next_multi()
-{
- if (!_multi_next) {
- _multi_separator = 0;
- delete[] _multi_args;
- _multi_args = NULL;
- return NULL;
- }
- char* ret = _multi_next;
- if ((_multi_next = strchr(_multi_next, _multi_separator))) {
- *(_multi_next++) = 0;
- }
-
- return ret;
-}
-
-int CmdLineParser::get_option(char** val)
-{
- CmdLineParser::Option* opt_obj;
-
- if (!_argv) {
- THROW("unexpected");
- }
-
- if (_multi_args) {
- THROW("in multi args mode");
- }
-
- if (_done) {
- THROW("is done");
- }
-
- int long_index;
-
- int opt = getopt_long(_argc, _argv, _short_options.c_str(), &_long_options[0], &long_index);
-
- switch (opt) {
- case 0: {
- if (!(opt_obj = find(_long_options[long_index].val))) {
- THROW("long option no found");
- }
-
-#ifdef DISABLE_ABBREVIATE
- int name_pos =
- (opt_obj->type == REQUIRED_ARGUMENT && optarg[-1] != '=')
- ? optind - 2
- : optind - 1;
- std::string cmd_name(_argv[name_pos] + 2);
- if (cmd_name.find(opt_obj->name) != 0) {
- Platform::term_printf("%s: invalid abbreviated option '--%s'\n", _argv[0], cmd_name.c_str());
- return OPTION_ERROR;
- }
-#endif
-
- if (opt_obj->separator) {
- *val = start_multi(optarg, opt_obj->separator);
- } else {
- *val = optarg;
- }
- opt_obj->is_set = true;
- return opt_obj->id;
- }
- case -1: {
- *val = NULL;
- if (!_positional_args && optind != _argc) {
- Platform::term_printf("%s: unexpected positional arguments\n", _argv[0]);
- return OPTION_ERROR;
- }
- if ((opt_obj = find_missing_opt())) {
- Platform::term_printf("%s: option --%s is required\n", _argv[0], opt_obj->name.c_str());
- return OPTION_ERROR;
- }
- _done = true;
- return OPTION_DONE;
- }
- case '?':
- if (optopt >= 255) {
- opt_obj = find(optopt);
- ASSERT(opt_obj);
-
-#ifdef DISABLE_ABBREVIATE
- std::string cmd_name(_argv[optind - 1] + 2);
- if (cmd_name.find(opt_obj->name) != 0) {
- Platform::term_printf("%s: invalid option '--%s'\n", _argv[0], cmd_name.c_str());
- return OPTION_ERROR;
- }
-#endif
- Platform::term_printf("%s: option --%s requires an argument\n",
- _argv[0], opt_obj->name.c_str());
- } else if (optopt == 0) {
- Platform::term_printf("%s: invalid option '%s'\n", _argv[0], _argv[optind - 1]);
- } else if ((opt_obj = find((char)optopt))) {
- Platform::term_printf("%s: option '-%c' requires an argument\n",
- _argv[0], opt_obj->short_name);
- } else {
- Platform::term_printf("%s: invalid option '-%c'\n", _argv[0], char(optopt));
- }
- return OPTION_ERROR;
- default:
- if (opt > 255 || !(opt_obj = find((char)opt))) {
- *val = NULL;
- return OPTION_ERROR;
- }
- if (opt_obj->separator) {
- *val = start_multi(optarg, opt_obj->separator);
- } else {
- *val = optarg;
- }
- opt_obj->is_set = true;
- return opt_obj->id;
- }
-}
-
-char* CmdLineParser::next_argument()
-{
- if (!_argv) {
- THROW("unexpected");
- }
-
- if (_multi_args) {
- return next_multi();
- }
-
- if (!_done) {
- THROW("not done");
- }
-
- if (optind == _argc) {
- return NULL;
- }
- return _argv[optind++];
-}
-
-void CmdLineParser::show_help()
-{
- static const int HELP_START_POS = 30;
- static const unsigned HELP_WIDTH = 80 - HELP_START_POS;
- std::ostringstream os;
-
- os << _argv[0] << " - " << _description.c_str() << "\n\noptions:\n\n";
-
- Options::iterator iter = _options.begin();
- for (; iter != _options.end(); ++iter) {
- CmdLineParser::Option* opt = *iter;
-
- if (opt->short_name) {
- os << " -" << opt->short_name << ", ";
- } else {
- os << " ";
- }
-
- os << "--" << opt->name;
-
- if (opt->type == OPTIONAL_ARGUMENT) {
- os << "[=";
- } else if (opt->type == REQUIRED_ARGUMENT) {
- os << " <";
- }
-
- if (opt->type == OPTIONAL_ARGUMENT || opt->type == REQUIRED_ARGUMENT) {
- if (opt->separator) {
- os << opt->arg_name << opt->separator << opt->arg_name << "...";
- } else {
- os << opt->arg_name;
- }
- }
-
- if (opt->type == OPTIONAL_ARGUMENT) {
- os << "]";
- } else if (opt->type == REQUIRED_ARGUMENT) {
- os << ">";
- }
-
- int skip = HELP_START_POS - os.str().size();
- if (skip < 2) {
- os << "\n ";
- } else {
- while (skip--) {
- os << " ";
- }
- }
-
- int line_count = 0;
- std::istringstream is(opt->help);
- std::string line;
- std::getline(is, line);
- do {
- if (line_count++) {
- os << " ";
- }
- if (line.size() > HELP_WIDTH) {
- size_t last_space, now = HELP_WIDTH;
- std::string sub;
- sub.append(line, 0, now);
- if ((last_space = sub.find_last_of(' ')) != std::string::npos) {
- now = last_space;
- sub.resize(now++);
- }
- os << sub << "\n";
- line = line.substr(now, line.size() - now);
- } else {
- os << line << "\n";
- line.clear();
- }
- } while (line.size() || std::getline(is, line));
- }
-
- os << "\n";
- Platform::term_printf("%s", os.str().c_str());
-}
diff --git a/client/cmd_line_parser.h b/client/cmd_line_parser.h
deleted file mode 100644
index 1ce1807d..00000000
--- a/client/cmd_line_parser.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_CMD_LINE_PARSER
-#define _H_CMD_LINE_PARSER
-
-class CmdLineParser {
-public:
-
- enum {
- OPTION_ERROR = -1,
- OPTION_DONE = 0,
- OPTION_HELP = 256,
- OPTION_FIRST_AVAILABLE,
- };
-
- CmdLineParser(std::string description, bool allow_positional_args);
- virtual ~CmdLineParser();
-
- void add(int id, const std::string& name, const std::string& help,
- char short_name = 0);
-
- void add(int id, const std::string& name, const std::string& help,
- const std::string& arg_name, bool required_arg, char short_name = 0);
- void set_multi(int id, char separator);
- void set_required(int id);
-
- void begin(int argc, char** argv);
- int get_option(char** val);
- char* next_argument();
- bool is_set(int id);
-
- void show_help();
-
-private:
- class Option;
-
- enum OptionType {
- NO_ARGUMENT,
- OPTIONAL_ARGUMENT,
- REQUIRED_ARGUMENT,
- };
-
- void add_private(int id, const std::string& name, char short_name, OptionType type,
- const std::string& help, const std::string& arg_name);
- Option* find(char short_name);
- Option* find(int id);
- Option* find(const std::string& name);
- Option* find_missing_opt();
-
- void build();
-
- char* start_multi(char *optarg, char separator);
- char* next_multi();
-
-private:
-
- class Option {
- public:
- Option(int in_id, const std::string& in_name, char in_short_name, OptionType in_type,
- const std::string& in_help, const std::string& arg_name);
-
- public:
- int id;
- std::string name;
- std::string arg_name;
- OptionType type;
- char short_name;
- std::string help;
- bool optional;
- bool is_set;
- char separator;
- };
-
- std::string _description;
- std::vector<struct option> _long_options;
- std::string _short_options;
-
- typedef std::list<Option*> Options;
- Options _options;
- int _argc;
- char** _argv;
- char* _multi_args;
- char* _multi_next;
- char _multi_separator;
- bool _positional_args;
- bool _done;
-};
-
-#endif
diff --git a/client/common.h b/client/common.h
deleted file mode 100644
index 13ef1c7a..00000000
--- a/client/common.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_COMMON
-#define _H_COMMON
-
-#ifndef WIN32
-#include "config.h"
-#endif
-
-#ifndef _WIN32_WCE
-#include <errno.h>
-#endif
-
-#ifndef _WIN32
-#include <inttypes.h>
-#endif
-
-#include <stdio.h>
-#include <stdarg.h>
-#include <string>
-#include <vector>
-#include <map>
-#include <memory>
-#include <exception>
-#include <list>
-#include <string.h>
-
-#ifdef WIN32
-#ifdef __GNUC__
-#define UNICODE 1
-#define _UNICODE 1
-#if !defined __MINGW32__
-#define WINVER 0x0501
-#define swprintf_s(_str, _len, _fmt, ...) \
- swprintf(_str, _fmt, ## __VA_ARGS__)
-#define vsnprintf_s(_str, _len1, _len2, _fmt, _valist) \
- vsnprintf(_str, _len2, _fmt, _valist)
-#define _ftime_s(_t) _ftime(_t)
-#endif
-#endif
-#include <winsock2.h>
-#include <windows.h>
-
-#ifndef __GNUC__
-#pragma warning(disable:4355)
-#pragma warning(disable:4996)
-#pragma warning(disable:4200)
-
-extern const char* PACKAGE_VERSION;
-#endif
-
-#define strcasecmp stricmp
-
-#else
-#include <unistd.h>
-#include <X11/X.h>
-#ifdef USE_OPENGL
-#include <GL/glx.h>
-#endif
-#endif
-
-#ifdef __GNUC__
- #if __SIZEOF_POINTER__ == 8
- #define RED64
- #endif
-#elif defined(_WIN64)
-#define RED64
-#endif
-
-#if defined(_WIN32) && !defined(PRIu64)
-#define PRIu64 "I64u"
-#endif
-
-#include <spice/types.h>
-#include "red_types.h"
-
-#endif
diff --git a/client/controller.cpp b/client/controller.cpp
deleted file mode 100644
index 63082c49..00000000
--- a/client/controller.cpp
+++ /dev/null
@@ -1,448 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-#include "controller.h"
-#include <spice/controller_prot.h>
-#include "cmd_line_parser.h"
-#include "menu.h"
-#include "utils.h"
-#include "debug.h"
-#include "platform.h"
-
-
-#ifdef WIN32
-#define PIPE_NAME_MAX_LEN 50
-#define PIPE_NAME "SpiceController-%lu"
-#endif
-
-Controller::Controller(ControllerInterface *handler)
- : _handler (handler)
- , _exclusive (false)
- , _refs (1)
-{
- ASSERT(_handler);
-#ifdef WIN32
- char pipe_name[PIPE_NAME_MAX_LEN];
- snprintf(pipe_name, PIPE_NAME_MAX_LEN, PIPE_NAME, Platform::get_process_id());
-#else
- const char *pipe_name = getenv("SPICE_XPI_SOCKET");
- if (!pipe_name) {
- LOG_ERROR("Failed to get a controller connection (SPICE_XPI_SOCKET)");
- throw Exception("Failed to get a controller connection (SPICE_XPI_SOCKET)");
- }
-#endif
- LOG_INFO("Creating a controller connection %s", pipe_name);
- _pipe = NamedPipe::create(pipe_name, *this);
- if (!_pipe) {
- LOG_ERROR("Failed to create a controller connection");
- }
-}
-
-Controller::~Controller()
-{
- std::map<NamedPipe::ConnectionRef, ControllerConnection*>::const_iterator conn;
- for (conn = _connections.begin(); conn != _connections.end(); ++conn) {
- conn->second->reset_handler();
- delete conn->second;
- }
- if (_pipe) {
- NamedPipe::destroy(_pipe);
- }
-}
-
-NamedPipe::ConnectionInterface& Controller::create()
-{
- ControllerConnection *conn = new ControllerConnection(_handler, *this);
-
- if (conn == NULL) {
- throw Exception("Error allocating a new controller connection");
- }
- return *conn;
-}
-
-bool Controller::set_exclusive(bool exclusive)
-{
- if (_exclusive) {
- LOG_ERROR("Cannot init controller, an exclusive controller already connected");
- return false;
- }
- if (exclusive && _connections.size() > 1) {
- LOG_ERROR("Cannot init exclusive controller, other controllers already connected");
- return false;
- }
- _exclusive = exclusive;
- return true;
-}
-
-void Controller::add_connection(NamedPipe::ConnectionRef conn_ref, ControllerConnection *conn)
-{
- _connections[conn_ref] = conn;
- conn->on_data();
-}
-
-void Controller::remove_connection(NamedPipe::ConnectionRef conn_ref)
-{
- ControllerConnection *conn = _connections[conn_ref];
- _connections.erase(conn_ref);
- _exclusive = false;
- delete conn;
-}
-
-void Controller::on_command(NamedPipe::ConnectionRef conn_ref, int32_t id)
-{
- ControllerConnection *conn = _connections[conn_ref];
- ControllerValue msg;
-
- ASSERT(conn);
- msg.base.id = CONTROLLER_MENU_ITEM_CLICK;
- msg.base.size = sizeof(msg);
- msg.value = id;
- conn->write_msg(&msg.base, msg.base.size);
-}
-
-ControllerConnection::ControllerConnection(ControllerInterface *handler, Controller& parent)
- : _handler (handler)
- , _parent (parent)
- , _initialized (false)
- , _write_pending (0)
- , _write_pos (_write_buf)
- , _read_pos (_read_buf)
- , _port (-1)
- , _sport (-1)
- , _full_screen (false)
- , _auto_display_res (false)
-{
-}
-
-ControllerConnection::~ControllerConnection()
-{
- if (_opaque != NamedPipe::INVALID_CONNECTION) {
- NamedPipe::destroy_connection(_opaque);
- }
- if (_handler) {
- _handler->clear_menu_items(_opaque);
- _handler->delete_menu();
- }
-}
-
-void ControllerConnection::bind(NamedPipe::ConnectionRef conn_ref)
-{
- _opaque = conn_ref;
- _parent.add_connection(conn_ref, this);
-}
-
-void ControllerConnection::on_data()
-{
- if (_write_pending) {
- LOG_INFO("Resume pending write %d", _write_pending);
- if (!write_msg(_write_pos, _write_pending)) {
- return;
- }
- }
- while (read_msgs());
-}
-
-bool ControllerConnection::read_msgs()
-{
- uint8_t *pos = _read_buf;
- size_t nread = _read_pos - _read_buf;
- int32_t size;
-
- ASSERT(_handler);
- ASSERT(_opaque != NamedPipe::INVALID_CONNECTION);
- size = NamedPipe::read(_opaque, (uint8_t*)_read_pos, sizeof(_read_buf) - nread);
- if (size == 0) {
- return false;
- } else if (size < 0) {
- LOG_ERROR("Error reading from named pipe %d", size);
- _parent.remove_connection(_opaque);
- return false;
- }
- nread += size;
- while (nread > 0) {
- if (!_initialized && nread >= sizeof(ControllerInitHeader)) {
- ControllerInitHeader *init = (ControllerInitHeader *)pos;
- if (init->magic != CONTROLLER_MAGIC || init->version != CONTROLLER_VERSION) {
- LOG_ERROR("Bad controller init, magic=0x%x version=%u", init->magic,
- init->version);
- _parent.remove_connection(_opaque);
- return false;
- }
- if (nread < init->size) {
- break;
- }
- if (!handle_init((ControllerInit*)init)) {
- _parent.remove_connection(_opaque);
- return false;
- }
- nread -= init->size;
- pos += init->size;
- _initialized = true;
- }
- if (!_initialized || nread < sizeof(ControllerMsg)) {
- break;
- }
- ControllerMsg *hdr = (ControllerMsg *)pos;
- if (hdr->size < sizeof(ControllerMsg)) {
- LOG_ERROR("Bad controller message, size=%u", hdr->size);
- _parent.remove_connection(_opaque);
- return false;
- }
- if (nread < hdr->size) {
- break;
- }
- handle_message(hdr);
- nread -= hdr->size;
- pos += hdr->size;
- }
- if (nread > 0 && pos != _read_buf) {
- memmove(_read_buf, pos, nread);
- }
- _read_pos = _read_buf + nread;
- return true;
-}
-
-bool ControllerConnection::write_msg(const void *buf, int len)
-{
- RecurciveLock lock(_write_lock);
- uint8_t *pos;
- int32_t written = 0;
-
- ASSERT(_opaque != NamedPipe::INVALID_CONNECTION);
- if (_write_pending && buf != _write_pos) {
- if ((_write_pos + _write_pending + len > _write_buf + sizeof(_write_buf)) &&
- !write_msg(_write_pos, _write_pending)) {
- return false;
- }
- if (_write_pending) {
- if (_write_pos + _write_pending + len > _write_buf + sizeof(_write_buf)) {
- DBG(0, "Dropping message, due to insufficient space in write buffer");
- return true;
- }
- memcpy(_write_pos + _write_pending, buf, len);
- _write_pending += len;
- }
- }
- pos = (uint8_t*)buf;
- while (len && (written = NamedPipe::write(_opaque, pos, len)) > 0) {
- pos += written;
- len -= written;
- }
- if (len && written == 0) {
- if (_write_pending) {
- _write_pos = pos;
- } else {
- _write_pos = _write_buf;
- memcpy(_write_buf, pos, len);
- }
- _write_pending = len;
- } else if (written < 0) {
- LOG_ERROR("Error writing to named pipe %d", written);
- _parent.remove_connection(_opaque);
- return false;
- } else {
- _write_pending = 0;
- }
- return true;
-}
-
-bool ControllerConnection::handle_init(ControllerInit *init)
-{
- ASSERT(_handler);
- if (init->credentials != 0) {
- LOG_ERROR("Controller menu has wrong credentials 0x%x", init->credentials);
- return false;
- }
- if (!_parent.set_exclusive(init->flags & CONTROLLER_FLAG_EXCLUSIVE)) {
- return false;
- }
- return true;
-}
-
-bool ControllerConnection::handle_message(ControllerMsg *hdr)
-{
- uint32_t value = ((ControllerValue*)hdr)->value;
- char *data = (char*)((ControllerData*)hdr)->data;
-
- ASSERT(_handler);
- switch (hdr->id) {
- case CONTROLLER_HOST:
- _host.assign(data);
- break;
- case CONTROLLER_PORT:
- _port = value;
- break;
- case CONTROLLER_SPORT:
- _sport = value;
- break;
- case CONTROLLER_PASSWORD:
- _password.assign(data);
- break;
- case CONTROLLER_SECURE_CHANNELS:
- case CONTROLLER_DISABLE_CHANNELS:
- return set_multi_val(hdr->id, data);
- case CONTROLLER_TLS_CIPHERS:
- return _handler->set_connection_ciphers(data, "Controller");
- case CONTROLLER_CA_FILE:
- return _handler->set_ca_file(data, "Controller");
- case CONTROLLER_HOST_SUBJECT:
- return _handler->set_host_cert_subject(data, "Controller");
- case CONTROLLER_FULL_SCREEN:
- _full_screen = !!(value & CONTROLLER_SET_FULL_SCREEN);
- _handler->set_auto_display_res(!!(value & CONTROLLER_AUTO_DISPLAY_RES));
- break;
- case CONTROLLER_SET_TITLE: {
- std::string str;
- string_printf(str, "%s", data);
- _handler->set_title(str);
- break;
- }
- case CONTROLLER_HOTKEYS:
- _handler->set_hotkeys(data);
- break;
- case CONTROLLER_CONNECT:
- _handler->connect(_host, _port, _sport, _password);
- break;
- case CONTROLLER_SHOW:
- _handler->show_me(_full_screen);
- break;
- case CONTROLLER_HIDE:
- _handler->hide_me();
- break;
- case CONTROLLER_CREATE_MENU:
- return create_menu((char*)data);
- case CONTROLLER_DELETE_MENU:
- _handler->delete_menu();
- break;
-#if USE_SMARTCARD
- case CONTROLLER_ENABLE_SMARTCARD:
- _handler->enable_smartcard(value);
- break;
-#endif
- case CONTROLLER_SEND_CAD:
- default:
- LOG_ERROR("Ignoring an unknown/SEND_CAD controller message %u", hdr->id);
- return false;
- }
- return true;
-}
-
-#ifdef WIN32
-#define next_tok(str, delim, state) strtok(str, delim)
-#else
-#define next_tok(str, delim, state) strtok_r(str, delim, state)
-#endif
-
-bool ControllerConnection::create_menu(char* resource)
-{
- bool ret = true;
-#ifndef WIN32
- char* item_state = 0;
-#endif
- char* next_item;
- const char* param;
- const char* text;
- int parent_id;
- int flags;
- int state;
- int id;
-
- ASSERT(_handler);
- AutoRef<Menu> app_menu(_handler->get_app_menu());
- AutoRef<Menu> menu(new Menu((*app_menu)->get_target(), ""));
- char* item = next_tok(resource, CONTROLLER_MENU_ITEM_DELIMITER, &item_state);
- while (item != NULL) {
- next_item = item + strlen(item) + 1;
- ret = ret && (param = next_tok(item, CONTROLLER_MENU_PARAM_DELIMITER, &item_state)) &&
- sscanf(param, "%d", &parent_id);
- ret = ret && (param = next_tok(NULL, CONTROLLER_MENU_PARAM_DELIMITER, &item_state)) &&
- sscanf(param, "%d", &id);
- ret = ret && (text = next_tok(NULL, CONTROLLER_MENU_PARAM_DELIMITER, &item_state));
- ret = ret && (param = next_tok(NULL, CONTROLLER_MENU_PARAM_DELIMITER, &item_state)) &&
- sscanf(param, "%d", &flags);
-
- if (!ret) {
- DBG(0, "item parsing failed %s", item);
- break;
- }
- DBG(0, "parent_id=%d, id=%d, text=%s, flags=%d", parent_id, id, text, flags);
-
- AutoRef<Menu> sub_menu((*menu)->find_sub(parent_id));
- if (!(ret = !!*sub_menu)) {
- DBG(0, "submenu not found %s", item);
- break;
- }
-
- if (flags & CONTROLLER_MENU_FLAGS_SEPARATOR) {
- (*sub_menu)->add_separator();
- } else if (flags & CONTROLLER_MENU_FLAGS_POPUP) {
- AutoRef<Menu> sub(new Menu((*app_menu)->get_target(), text, id));
- (*sub_menu)->add_sub(sub.release());
- } else {
- state = 0;
- if (flags & (CONTROLLER_MENU_FLAGS_DISABLED | CONTROLLER_MENU_FLAGS_GRAYED)) {
- state |= Menu::MENU_ITEM_STATE_DIM;
- }
- if (flags & CONTROLLER_MENU_FLAGS_CHECKED) {
- state |= Menu::MENU_ITEM_STATE_CHECKED;
- }
- if (id >= SPICE_MENU_INTERNAL_ID_BASE) {
- id = ((id - SPICE_MENU_INTERNAL_ID_BASE) >> SPICE_MENU_INTERNAL_ID_SHIFT) + 1;
- } else {
- id = _handler->get_controller_menu_item_id(_opaque, id);
- }
- (*sub_menu)->add_command(text, id, state);
- }
- item = next_tok(next_item, CONTROLLER_MENU_ITEM_DELIMITER, &item_state);
- }
- if (ret) {
- _handler->set_menu(*menu);
- }
- return ret;
-}
-
-bool ControllerConnection::set_multi_val(uint32_t op, char* multi_val)
-{
- CmdLineParser parser("", false);
- int id = CmdLineParser::OPTION_FIRST_AVAILABLE;
- char* argv[] = {NULL, (char*)"--set", multi_val};
- char* val;
-
- ASSERT(_handler);
- parser.add(id, "set", "none", "none", true);
- parser.set_multi(id, ',');
- parser.begin(3, argv);
- if (parser.get_option(&val) != id) {
- return false;
- }
- switch (op) {
- case CONTROLLER_SECURE_CHANNELS:
- _handler->set_channels_security(parser, true, val, "Controller");
- break;
- case CONTROLLER_DISABLE_CHANNELS:
- _handler->set_enable_channels(parser, false, val, "Controller");
- break;
- default:
- DBG(0, "unsupported op %u", op);
- return false;
- }
- return true;
-}
diff --git a/client/controller.h b/client/controller.h
deleted file mode 100644
index a59d333d..00000000
--- a/client/controller.h
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_CONTROLLER_MENU
-#define _H_CONTROLLER_MENU
-
-#include "named_pipe.h"
-#include "threads.h"
-
-class ControllerConnection;
-struct ControllerInit;
-struct ControllerMsg;
-class CmdLineParser;
-class Menu;
-
-class ControllerInterface {
-public:
- virtual ~ControllerInterface() {}
-
- virtual bool connect(const std::string& host, int port, int sport,
- const std::string& password) = 0;
- virtual void set_title(const std::string& title) = 0;
- virtual void set_auto_display_res(bool auto_display_res) = 0;
- virtual void show_me(bool full_screen) = 0;
- virtual void hide_me() = 0;
- virtual bool set_channels_security(CmdLineParser& parser, bool on, char *val,
- const char* arg0) = 0;
- virtual bool set_enable_channels(CmdLineParser& parser, bool enable, char *val,
- const char* arg0) = 0;
- virtual bool set_connection_ciphers(const char* ciphers, const char* arg0) = 0;
- virtual bool set_ca_file(const char* ca_file, const char* arg0) = 0;
- virtual bool set_host_cert_subject(const char* subject, const char* arg0) = 0;
- virtual void set_hotkeys(const std::string& hotkeys) = 0;
- virtual int get_controller_menu_item_id(int32_t opaque_conn_ref, uint32_t id) = 0;
- virtual void clear_menu_items(int32_t opaque_conn_ref) = 0;
- virtual Menu* get_app_menu() = 0;
- virtual void set_menu(Menu* menu) = 0;
- virtual void delete_menu() = 0;
-#ifdef USE_SMARTCARD
- virtual void enable_smartcard(bool enable) = 0;
-#endif
-};
-
-class Controller : public NamedPipe::ListenerInterface {
-public:
- Controller(ControllerInterface *handler);
- virtual ~Controller();
-
- Controller* ref() { _refs++; return this;}
- void unref() { if (!--_refs) delete this;}
-
- virtual NamedPipe::ConnectionInterface &create();
- bool set_exclusive(bool exclusive);
- void add_connection(NamedPipe::ConnectionRef conn_ref, ControllerConnection *conn);
- void remove_connection(NamedPipe::ConnectionRef conn_ref);
- void on_command(NamedPipe::ConnectionRef conn_ref, int32_t id);
-
-private:
- ControllerInterface *_handler;
- std::map<NamedPipe::ConnectionRef, ControllerConnection*> _connections;
- NamedPipe::ListenerRef _pipe;
- bool _exclusive;
- int _refs;
-};
-
-#define CONTROLLER_BUF_SIZE 4096
-
-class ControllerConnection : public NamedPipe::ConnectionInterface {
-public:
- ControllerConnection(ControllerInterface *handler, Controller& parent);
- virtual ~ControllerConnection();
-
- virtual void bind(NamedPipe::ConnectionRef conn_ref);
- virtual void on_data();
- bool write_msg(const void *buf, int len);
- void reset_handler() { _handler = NULL;}
-
-private:
- bool read_msgs();
- bool handle_init(ControllerInit *init);
- bool handle_message(ControllerMsg *hdr);
- bool create_menu(char* resource);
- bool set_multi_val(uint32_t op, char* multi_val);
-
-private:
- ControllerInterface *_handler;
- Controller& _parent;
- bool _initialized;
-
- int _write_pending;
- uint8_t *_write_pos;
- uint8_t *_read_pos;
- uint8_t _write_buf[CONTROLLER_BUF_SIZE];
- uint8_t _read_buf[CONTROLLER_BUF_SIZE];
- RecurciveMutex _write_lock;
-
- std::string _host;
- std::string _password;
- int _port;
- int _sport;
- bool _full_screen;
- bool _auto_display_res;
-};
-
-#endif
diff --git a/client/cursor.cpp b/client/cursor.cpp
deleted file mode 100644
index 0fbf3668..00000000
--- a/client/cursor.cpp
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-#include "cursor.h"
-#include "utils.h"
-#include "debug.h"
-
-CursorData::CursorData(SpiceCursor& cursor, int data_size)
- : _atomic (1)
- , _header (cursor.header)
- , _data (NULL)
- , _opaque (NULL)
- , _local_cursor (NULL)
-{
- int expected_size = 0;
-
- switch (cursor.header.type) {
- case SPICE_CURSOR_TYPE_ALPHA:
- expected_size = (_header.width << 2) * _header.height;
- break;
- case SPICE_CURSOR_TYPE_MONO:
- expected_size = (SPICE_ALIGN(_header.width, 8) >> 2) * _header.height;
- break;
- case SPICE_CURSOR_TYPE_COLOR4:
- expected_size = (SPICE_ALIGN(_header.width, 2) >> 1) * _header.height;
- expected_size += (SPICE_ALIGN(_header.width, 8) >> 3) * _header.height;
- expected_size += 16 * sizeof(uint32_t);
- break;
- case SPICE_CURSOR_TYPE_COLOR8:
- expected_size = _header.width * _header.height;
- expected_size += (SPICE_ALIGN(_header.width, 8) >> 3) * _header.height;
- expected_size += 256 * sizeof(uint32_t);
- break;
- case SPICE_CURSOR_TYPE_COLOR16:
- expected_size = (_header.width << 1) * _header.height;
- expected_size += (SPICE_ALIGN(_header.width, 8) >> 3) * _header.height;
- break;
- case SPICE_CURSOR_TYPE_COLOR24:
- expected_size = (_header.width * 3) * _header.height;
- expected_size += (SPICE_ALIGN(_header.width, 8) >> 3) * _header.height;
- break;
- case SPICE_CURSOR_TYPE_COLOR32:
- expected_size = (_header.width << 2) * _header.height;
- expected_size += (SPICE_ALIGN(_header.width, 8) >> 3) * _header.height;
- break;
- }
-
- if (data_size < expected_size) {
- THROW("access violation 0x%" PRIuPTR " %u", (uintptr_t)cursor.data, expected_size);
- }
- _data = new uint8_t[expected_size];
- memcpy(_data, cursor.data, expected_size);
-}
-
-void CursorData::set_local(LocalCursor* local_cursor)
-{
- ASSERT(!_local_cursor);
- if (local_cursor) {
- _local_cursor = local_cursor->ref();
- }
-}
-
-CursorData::~CursorData()
-{
- if (_local_cursor) {
- _local_cursor->unref();
- }
- delete _opaque;
- delete[] _data;
-}
-
-int LocalCursor::get_size_bits(const SpiceCursorHeader& header, int& size)
-{
- switch (header.type) {
- case SPICE_CURSOR_TYPE_ALPHA:
- case SPICE_CURSOR_TYPE_COLOR32:
- size = (header.width << 2) * header.height;
- return 32;
- case SPICE_CURSOR_TYPE_MONO:
- size = (SPICE_ALIGN(header.width, 8) >> 3) * header.height;
- return 1;
- case SPICE_CURSOR_TYPE_COLOR4:
- size = (SPICE_ALIGN(header.width, 2) >> 1) * header.height;
- return 4;
- case SPICE_CURSOR_TYPE_COLOR8:
- size = header.width * header.height;
- return 8;
- case SPICE_CURSOR_TYPE_COLOR16:
- size = (header.width << 1) * header.height;
- return 16;
- case SPICE_CURSOR_TYPE_COLOR24:
- size = (header.width * 3) * header.height;
- return 24;
- default:
- return 0;
- }
-}
diff --git a/client/cursor.h b/client/cursor.h
deleted file mode 100644
index 3210f1e9..00000000
--- a/client/cursor.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_CURSOR_
-#define _H_CURSOR_
-
-#include "common/messages.h"
-#include "threads.h"
-#include "red_window_p.h"
-
-class CursorOpaque {
-public:
- CursorOpaque() {}
- virtual ~CursorOpaque() {}
-};
-
-class LocalCursor;
-
-class CursorData {
-public:
- CursorData(SpiceCursor& cursor, int data_size);
-
- CursorData *ref() { ++_atomic; return this;}
- void unref() {if (--_atomic == 0) delete this;}
- void set_opaque(CursorOpaque* opaque) { delete _opaque; _opaque = opaque;}
- CursorOpaque* get_opaque() { return _opaque;}
- void set_local(LocalCursor* local_cursor);
- LocalCursor* get_local() { return _local_cursor;}
- const SpiceCursorHeader& header() const { return _header;}
- const uint8_t* data() const { return _data;}
-
-private:
- ~CursorData();
-
-private:
- AtomicCount _atomic;
- SpiceCursorHeader _header;
- uint8_t* _data;
- CursorOpaque* _opaque;
- LocalCursor* _local_cursor;
-};
-
-class LocalCursor {
-public:
- LocalCursor(): _atomic (1) {}
- virtual ~LocalCursor() {}
- virtual void set(Window window) {}
- LocalCursor* ref() { ++_atomic; return this;}
- void unref() { if (--_atomic == 0) delete this;}
-
-protected:
- static int get_size_bits(const SpiceCursorHeader& header, int &size);
-
-private:
- AtomicCount _atomic;
-};
-
-#endif
diff --git a/client/cursor_channel.cpp b/client/cursor_channel.cpp
deleted file mode 100644
index 48786e38..00000000
--- a/client/cursor_channel.cpp
+++ /dev/null
@@ -1,670 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common/rect.h"
-
-#include "common.h"
-#include "cursor_channel.h"
-#include "display_channel.h"
-#include "cursor.h"
-#include "red_client.h"
-#include "application.h"
-#include "debug.h"
-#include "utils.h"
-#include "screen.h"
-#include "red_pixmap_sw.h"
-
-static inline uint8_t revers_bits(uint8_t byte)
-{
- uint8_t ret = 0;
- int i;
-
- for (i = 0; i < 4; i++) {
- int shift = 7 - i * 2;
- ret |= (byte & (1 << i)) << shift;
- ret |= (byte & (0x80 >> i)) >> shift;
- }
- return ret;
-}
-
-class NaitivCursor: public CursorOpaque {
-public:
- virtual void draw(RedDrawable& dest, int x, int y, const SpiceRect& area) = 0;
-};
-
-class AlphaCursor: public NaitivCursor {
-public:
- AlphaCursor(const SpiceCursorHeader& header, const uint8_t* data);
-
- virtual void draw(RedDrawable& dest, int x, int y, const SpiceRect& area);
-
-private:
- std::auto_ptr<RedPixmap> _pixmap;
-};
-
-class MonoCursor: public NaitivCursor {
-public:
- MonoCursor(const SpiceCursorHeader& header, const uint8_t* data);
-
- virtual void draw(RedDrawable& dest, int x, int y, const SpiceRect& area);
-
-private:
- std::auto_ptr<RedPixmap> _pixmap;
- int _height;
-};
-
-class UnsupportedCursor: public NaitivCursor {
-public:
- UnsupportedCursor(const SpiceCursorHeader& header);
- virtual void draw(RedDrawable& dest, int x, int y, const SpiceRect& area);
-
-private:
- int _hot_x;
- int _hot_y;
-};
-
-UnsupportedCursor::UnsupportedCursor(const SpiceCursorHeader& header)
- : _hot_x (header.hot_spot_x)
- , _hot_y (header.hot_spot_y)
-{
- LOG_WARN("Unsupported cursor %hu", header.type);
-}
-
-void UnsupportedCursor::draw(RedDrawable& dest, int x, int y, const SpiceRect& area)
-{
- SpiceRect dest_area;
- SpiceRect rect;
-
- dest_area.left = area.left;
- dest_area.right = area.right;
- dest_area.top = area.top;
- dest_area.bottom = area.bottom;
-
- rect.left = x + _hot_x - 2;
- rect.right = rect.left + 8;
- rect.top = y + _hot_y - 2;
- rect.bottom = rect.top + 8;
- rect_sect(rect, dest_area);
-
- dest.fill_rect(rect, rgb32_make(0xf8, 0xf1, 0xb8));
-
- rect.left = x + _hot_x - 1;
- rect.right = rect.left + 6;
- rect.top = y + _hot_y - 1;
- rect.bottom = rect.top + 6;
- rect_sect(rect, dest_area);
-
- dest.frame_rect(rect, rgb32_make(0, 0, 0));
-}
-
-AlphaCursor::AlphaCursor(const SpiceCursorHeader& header, const uint8_t* data)
- : _pixmap (new RedPixmapSw(header.width, header.height,
- RedDrawable::ARGB32, true, NULL))
-{
- int stride = _pixmap->get_stride();
- uint8_t* dest = _pixmap->get_data();
- int line_size = header.width * sizeof(uint32_t);
- for (int i = 0; i < header.height; i++, data += line_size, dest += stride) {
- memcpy(dest, data, line_size);
- }
-}
-
-void AlphaCursor::draw(RedDrawable& dest, int x, int y, const SpiceRect& area)
-{
- dest.blend_pixels(*_pixmap, area.left - x, area.top - y, area);
-}
-
-MonoCursor::MonoCursor(const SpiceCursorHeader& header, const uint8_t* data)
- : _pixmap (NULL)
- , _height (header.height)
-{
- _pixmap.reset(new RedPixmapSw(header.width, _height * 2, RedDrawable::A1,
- true, NULL));
-
- int dest_stride = _pixmap->get_stride();
- uint8_t *dest_line = _pixmap->get_data();
- int src_stride = SPICE_ALIGN(header.width, 8) >> 3;
- const uint8_t* src_line = data;
- const uint8_t* end_line = src_line + _pixmap->get_height() * src_stride;
-
- if (_pixmap->is_big_endian_bits()) {
- for (; src_line < end_line; src_line += src_stride, dest_line += dest_stride) {
- memcpy(dest_line, src_line, src_stride);
- }
- } else {
- for (; src_line < end_line; src_line += src_stride, dest_line += dest_stride) {
- for (int i = 0; i < src_stride; i++) {
- dest_line[i] = revers_bits(src_line[i]);
- }
- }
- }
-}
-
-void MonoCursor::draw(RedDrawable& dest, int x, int y, const SpiceRect& area)
-{
- dest.combine_pixels(*_pixmap, area.left - x, area.top - y, area, RedDrawable::OP_AND);
- dest.combine_pixels(*_pixmap, area.left - x, area.top - y + _height, area, RedDrawable::OP_XOR);
-}
-
-class ColorCursor: public NaitivCursor {
-public:
- ColorCursor(const SpiceCursorHeader& header);
-
- virtual void draw(RedDrawable& dest, int x, int y, const SpiceRect& area);
-
-protected:
- void init_pixels(const SpiceCursorHeader& header, const uint8_t* _pixels, const uint8_t *and_mask);
- virtual uint32_t get_pixel_color(const uint8_t *data, int row, int col) = 0;
-
-private:
- std::auto_ptr<RedPixmap> _pixmap;
- std::auto_ptr<RedPixmap> _invers;
-};
-
-ColorCursor::ColorCursor(const SpiceCursorHeader& header)
- : _pixmap (new RedPixmapSw(header.width, header.height,
- RedDrawable::ARGB32, true, NULL))
- , _invers (NULL)
-{
- _invers.reset(new RedPixmapSw(header.width, header.height, RedDrawable::A1,
- true, NULL));
-}
-
-void ColorCursor::init_pixels(const SpiceCursorHeader& header, const uint8_t* pixels,
- const uint8_t *and_mask)
-{
- int mask_stride = SPICE_ALIGN(header.width, 8) / 8;
- int invers_stride = _invers->get_stride();
- int pixmap_stride = _pixmap->get_stride();
- uint8_t *_pixmap_line = _pixmap->get_data();
- uint8_t* invers_line = _invers->get_data();
- bool be_bits = _invers->is_big_endian_bits();
- memset(invers_line, 0, header.height * invers_stride);
- for (int i = 0; i < header.height; i++, and_mask += mask_stride, invers_line += invers_stride,
- _pixmap_line += pixmap_stride) {
- uint32_t *line_32 = (uint32_t *)_pixmap_line;
- for (int j = 0; j < header.width; j++) {
- uint32_t pixel_val = get_pixel_color(pixels, i, j);
- int and_val = test_bit_be(and_mask, j);
- if ((pixel_val & 0x00ffffff) == 0 && and_val) {
- line_32[j] = 0;
- } else if ((pixel_val & 0x00ffffff) == 0x00ffffff && and_val) {
- line_32[j] = 0;
- if (be_bits) {
- set_bit_be(invers_line, j);
- } else {
- set_bit(invers_line, j);
- }
- } else {
- line_32[j] = pixel_val | 0xff000000;
- }
- }
- }
-}
-
-void ColorCursor::draw(RedDrawable& dest, int x, int y, const SpiceRect& area)
-{
- dest.blend_pixels(*_pixmap, area.left - x, area.top - y, area);
- dest.combine_pixels(*_invers, area.left - x, area.top - y, area, RedDrawable::OP_XOR);
-}
-
-class ColorCursor32: public ColorCursor {
-public:
- ColorCursor32(const SpiceCursorHeader& header, const uint8_t* data)
- : ColorCursor(header)
- , _src_stride (header.width * sizeof(uint32_t))
- {
- init_pixels(header, data, data + _src_stride * header.height);
- }
-
-private:
- uint32_t get_pixel_color(const uint8_t *data, int row, int col)
- {
- return *((uint32_t *)(data + row * _src_stride) + col);
- }
-
-private:
- int _src_stride;
-};
-
-class ColorCursor16: public ColorCursor {
-public:
- ColorCursor16(const SpiceCursorHeader& header, const uint8_t* data)
- : ColorCursor(header)
- , _src_stride (header.width * sizeof(uint16_t))
- {
- init_pixels(header, data, data + _src_stride * header.height);
- }
-
-private:
- uint32_t get_pixel_color(const uint8_t *data, int row, int col)
- {
- uint32_t pix = *((uint16_t*)(data + row * _src_stride) + col);
- return ((pix & 0x1f) << 3) | ((pix & 0x3e0) << 6) | ((pix & 0x7c00) << 9);
- }
-
-private:
- int _src_stride;
-};
-
-class ColorCursor4: public ColorCursor {
-public:
- ColorCursor4(const SpiceCursorHeader& header, const uint8_t* data)
- : ColorCursor(header)
- , _src_stride (SPICE_ALIGN(header.width, 2) >> 1)
- , _palette ((uint32_t*)(data + _src_stride * header.height))
- {
- init_pixels(header, data, (uint8_t*)(_palette + 16));
- }
-
-private:
- uint32_t get_pixel_color(const uint8_t *data, int row, int col)
- {
- data += _src_stride * row + (col >> 1);
- return (col & 1) ? _palette[*data & 0x0f] : _palette[*data >> 4];
- }
-
-private:
- int _src_stride;
- uint32_t* _palette;
-};
-
-class AttachDispayEvent: public Event {
-public:
- AttachDispayEvent(CursorChannel& channel)
- : _channel (channel)
- {
- }
-
- class UpdateDisplayChannel: public ForEachChannelFunc {
- public:
- UpdateDisplayChannel(CursorChannel& channel)
- : _channel (channel)
- {
- }
-
- virtual bool operator() (RedChannel& channel)
- {
- if (channel.get_type() != SPICE_CHANNEL_DISPLAY ||
- channel.get_id() != _channel.get_id()) {
- return true;
- }
-
- _channel.attach_display(&static_cast<DisplayChannel&>(channel));
- return false;
- }
-
- private:
- CursorChannel& _channel;
- };
-
- virtual void response(AbstractProcessLoop& events_loop)
- {
- UpdateDisplayChannel func(_channel);
- _channel.get_client().for_each_channel(func);
- }
-
-private:
- CursorChannel& _channel;
-};
-
-class CursorUpdateEvent: public Event {
-public:
- CursorUpdateEvent(CursorChannel& channel)
- : _channel (channel)
- {
- }
-
- virtual void response(AbstractProcessLoop& events_loop)
- {
- DisplayChannel* display_channel = _channel._display_channel;
- if (!display_channel) {
- return;
- }
-
- Lock lock(_channel._update_lock);
- if (_channel._cursor_visible) {
- display_channel->set_cursor(_channel._cursor);
- return;
- }
-
- display_channel->hide_cursor();
- }
-
-private:
- CursorChannel& _channel;
-};
-
-class CursorHandler: public MessageHandlerImp<CursorChannel, SPICE_CHANNEL_CURSOR> {
-public:
- CursorHandler(CursorChannel& channel)
- : MessageHandlerImp<CursorChannel, SPICE_CHANNEL_CURSOR>(channel) {}
-};
-
-CursorChannel::CursorChannel(RedClient& client, uint32_t id)
- : RedChannel(client, SPICE_CHANNEL_CURSOR, id, new CursorHandler(*this))
- , ScreenLayer(SCREEN_LAYER_CURSOR, false)
- , _cursor (NULL)
- , _cursor_visible (false)
- , _display_channel (NULL)
-{
- CursorHandler* handler = static_cast<CursorHandler*>(get_message_handler());
-
- handler->set_handler(SPICE_MSG_MIGRATE, &CursorChannel::handle_migrate);
- handler->set_handler(SPICE_MSG_SET_ACK, &CursorChannel::handle_set_ack);
- handler->set_handler(SPICE_MSG_PING, &CursorChannel::handle_ping);
- handler->set_handler(SPICE_MSG_WAIT_FOR_CHANNELS, &CursorChannel::handle_wait_for_channels);
- handler->set_handler(SPICE_MSG_DISCONNECTING, &CursorChannel::handle_disconnect);
- handler->set_handler(SPICE_MSG_NOTIFY, &CursorChannel::handle_notify);
-
- handler->set_handler(SPICE_MSG_CURSOR_INIT, &CursorChannel::handle_init);
- handler->set_handler(SPICE_MSG_CURSOR_RESET, &CursorChannel::handle_reset);
- handler->set_handler(SPICE_MSG_CURSOR_SET, &CursorChannel::handle_cursor_set);
- handler->set_handler(SPICE_MSG_CURSOR_MOVE, &CursorChannel::handle_cursor_move);
- handler->set_handler(SPICE_MSG_CURSOR_HIDE, &CursorChannel::handle_cursor_hide);
- handler->set_handler(SPICE_MSG_CURSOR_TRAIL, &CursorChannel::handle_cursor_trail);
- handler->set_handler(SPICE_MSG_CURSOR_INVAL_ONE, &CursorChannel::handle_inval_one);
- handler->set_handler(SPICE_MSG_CURSOR_INVAL_ALL, &CursorChannel::handle_inval_all);
-}
-
-CursorChannel::~CursorChannel()
-{
- ASSERT(!_cursor);
-}
-
-void CursorChannel::on_connect()
-{
- AutoRef<AttachDispayEvent> attach_event(new AttachDispayEvent(*this));
- get_client().push_event(*attach_event);
-}
-
-void CursorChannel::on_disconnect()
-{
- remove_cursor();
- _cursor_cache.clear();
- AutoRef<SyncEvent> sync_event(new SyncEvent());
- get_client().push_event(*sync_event);
- (*sync_event)->wait();
- detach_from_screen(get_client().get_application());
-}
-
-void CursorChannel::update_display_cursor()
-{
- if (!_display_channel) {
- return;
- }
-
- AutoRef<CursorUpdateEvent> update_event(new CursorUpdateEvent(*this));
- get_client().push_event(*update_event);
-}
-
-void CursorChannel::remove_cursor()
-{
- Lock lock(_update_lock);
- _cursor_visible = false;
- if (_cursor) {
- _cursor->unref();
- _cursor = NULL;
- }
- lock.unlock();
- clear_area();
- update_display_cursor();
-}
-
-void CursorChannel::copy_pixels(const QRegion& dest_region, RedDrawable& dest_dc)
-{
- pixman_box32_t *rects;
- int num_rects;
-
- Lock lock(_update_lock);
-
- if (!_cursor_visible) {
- return;
- }
-
- rects = pixman_region32_rectangles((pixman_region32_t *)&dest_region, &num_rects);
- for (int i = 0; i < num_rects; i++) {
- SpiceRect r;
-
- r.left = rects[i].x1;
- r.top = rects[i].y1;
- r.right = rects[i].x2;
- r.bottom = rects[i].y2;
- ASSERT(_cursor && _cursor->get_opaque());
- ((NaitivCursor*)_cursor->get_opaque())->draw(dest_dc, _cursor_rect.left, _cursor_rect.top,
- r);
- }
-}
-
-void CursorChannel::create_native_cursor(CursorData* cursor)
-{
- CursorOpaque* native_cursor = cursor->get_opaque();
-
- if (native_cursor) {
- return;
- }
-
- switch (cursor->header().type) {
- case SPICE_CURSOR_TYPE_ALPHA:
- native_cursor = new AlphaCursor(cursor->header(), cursor->data());
- break;
- case SPICE_CURSOR_TYPE_COLOR32:
- native_cursor = new ColorCursor32(cursor->header(), cursor->data());
- break;
- case SPICE_CURSOR_TYPE_MONO:
- native_cursor = new MonoCursor(cursor->header(), cursor->data());
- break;
- case SPICE_CURSOR_TYPE_COLOR4:
- native_cursor = new ColorCursor4(cursor->header(), cursor->data());
- break;
- case SPICE_CURSOR_TYPE_COLOR8:
- native_cursor = new UnsupportedCursor(cursor->header());
- break;
- case SPICE_CURSOR_TYPE_COLOR16:
- native_cursor = new ColorCursor16(cursor->header(), cursor->data());
- break;
- case SPICE_CURSOR_TYPE_COLOR24:
- native_cursor = new UnsupportedCursor(cursor->header());
- break;
- default:
- THROW("invalid cursor type");
- }
- cursor->set_opaque(native_cursor);
-}
-
-void CursorChannel::set_cursor(SpiceCursor& red_cursor, int x, int y, bool visible)
-{
- CursorData *cursor;
-
- if (red_cursor.flags & SPICE_CURSOR_FLAGS_NONE) {
- remove_cursor();
- return;
- }
-
- if (red_cursor.flags & SPICE_CURSOR_FLAGS_FROM_CACHE) {
- cursor = _cursor_cache.get(red_cursor.header.unique);
- } else {
- cursor = new CursorData(red_cursor, red_cursor.data_size);
- if (red_cursor.flags & SPICE_CURSOR_FLAGS_CACHE_ME) {
- ASSERT(red_cursor.header.unique);
- _cursor_cache.add(red_cursor.header.unique, cursor);
- }
- }
-
- AutoRef<CursorData> cursor_ref(cursor);
- create_native_cursor(cursor);
-
- Lock lock(_update_lock);
- _hot_pos.x = x;
- _hot_pos.y = y;
- _cursor_visible = visible;
- _cursor_rect.left = x - cursor->header().hot_spot_x;
- _cursor_rect.right = _cursor_rect.left + cursor->header().width;
- _cursor_rect.top = y - cursor->header().hot_spot_y;
- _cursor_rect.bottom = _cursor_rect.top + cursor->header().height;
-
- if (_cursor) {
- _cursor->unref();
- }
- _cursor = cursor->ref();
- lock.unlock();
-
- update_display_cursor();
-
- if (get_client().get_mouse_mode() == SPICE_MOUSE_MODE_SERVER) {
- if (_cursor_visible) {
- set_rect_area(_cursor_rect);
- } else {
- clear_area();
- }
- }
-}
-
-void CursorChannel::attach_display(DisplayChannel* channel)
-{
- if (_display_channel) {
- return;
- }
-
- _display_channel = channel;
-
- Lock lock(_update_lock);
- if (!_cursor_visible) {
- return;
- }
-
- _display_channel->set_cursor(_cursor);
-}
-
-void CursorChannel::detach_display()
-{
- _display_channel = NULL;
-}
-
-void CursorChannel::handle_init(RedPeer::InMessage *message)
-{
- SpiceMsgCursorInit *init = (SpiceMsgCursorInit*)message->data();
- attach_to_screen(get_client().get_application(), get_id());
- remove_cursor();
- _cursor_cache.clear();
- set_cursor(init->cursor, init->position.x,
- init->position.y, init->visible != 0);
-}
-
-void CursorChannel::handle_reset(RedPeer::InMessage *message)
-{
- remove_cursor();
- detach_from_screen(get_client().get_application());
- _cursor_cache.clear();
-}
-
-void CursorChannel::handle_cursor_set(RedPeer::InMessage* message)
-{
- SpiceMsgCursorSet* set = (SpiceMsgCursorSet*)message->data();
- set_cursor(set->cursor, set->position.x,
- set->position.y, set->visible != 0);
-}
-
-void CursorChannel::handle_cursor_move(RedPeer::InMessage* message)
-{
- SpiceMsgCursorMove* move = (SpiceMsgCursorMove*)message->data();
-
- if (!_cursor) {
- return;
- }
-
- Lock lock(_update_lock);
- _cursor_visible = true;
- int dx = move->position.x - _hot_pos.x;
- int dy = move->position.y - _hot_pos.y;
- _hot_pos.x += dx;
- _hot_pos.y += dy;
- _cursor_rect.left += dx;
- _cursor_rect.right += dx;
- _cursor_rect.top += dy;
- _cursor_rect.bottom += dy;
- lock.unlock();
-
- if (get_client().get_mouse_mode() == SPICE_MOUSE_MODE_SERVER) {
- set_rect_area(_cursor_rect);
- return;
- }
-
- update_display_cursor();
-}
-
-void CursorChannel::handle_cursor_hide(RedPeer::InMessage* message)
-{
- Lock lock(_update_lock);
-
- _cursor_visible = false;
- update_display_cursor();
-
- if (get_client().get_mouse_mode() == SPICE_MOUSE_MODE_SERVER) {
- clear_area();
- }
-}
-
-void CursorChannel::handle_cursor_trail(RedPeer::InMessage* message)
-{
- SpiceMsgCursorTrail* trail = (SpiceMsgCursorTrail*)message->data();
- DBG(0, "length %u frequency %u", trail->length, trail->frequency)
-}
-
-void CursorChannel::handle_inval_one(RedPeer::InMessage* message)
-{
- SpiceMsgDisplayInvalOne* inval = (SpiceMsgDisplayInvalOne*)message->data();
- _cursor_cache.remove(inval->id);
-}
-
-void CursorChannel::handle_inval_all(RedPeer::InMessage* message)
-{
- _cursor_cache.clear();
-}
-
-void CursorChannel::on_mouse_mode_change()
-{
- Lock lock(_update_lock);
-
- if (get_client().get_mouse_mode() == SPICE_MOUSE_MODE_CLIENT) {
- clear_area();
- return;
- }
-
- if (_cursor_visible) {
- set_rect_area(_cursor_rect);
- }
-}
-
-class CursorFactory: public ChannelFactory {
-public:
- CursorFactory() : ChannelFactory(SPICE_CHANNEL_CURSOR) {}
- virtual RedChannel* construct(RedClient& client, uint32_t id)
- {
- return new CursorChannel(client, id);
- }
-};
-
-static CursorFactory factory;
-
-ChannelFactory& CursorChannel::Factory()
-{
- return factory;
-}
diff --git a/client/cursor_channel.h b/client/cursor_channel.h
deleted file mode 100644
index 3458c5f4..00000000
--- a/client/cursor_channel.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_CURSOR_CHANNEL
-#define _H_CURSOR_CHANNEL
-
-#include "red_channel.h"
-#include "cache.hpp"
-#include "cursor.h"
-#include "screen_layer.h"
-
-class ChannelFactory;
-class CursorChannel;
-class DisplayChannel;
-
-class CursorCacheTreat {
-public:
- static inline CursorData* get(CursorData* cursor)
- {
- return cursor->ref();
- }
-
- static inline void release(CursorData* cursor)
- {
- cursor->unref();
- }
-
- static const char* name() { return "cursor";}
-};
-
-typedef Cache<CursorData, CursorCacheTreat, 1024> CursorCache;
-
-class CursorChannel: public RedChannel, public ScreenLayer {
-public:
- CursorChannel(RedClient& client, uint32_t id);
- virtual ~CursorChannel();
-
- static ChannelFactory& Factory();
- void on_mouse_mode_change();
-
- void attach_display(DisplayChannel* channel);
- void detach_display();
-
-protected:
- virtual void on_connect();
- virtual void on_disconnect();
-
-private:
- static void create_native_cursor(CursorData* cursor);
-
- void update_display_cursor();
- void set_cursor(SpiceCursor& red_cursor, int x, int y, bool visible);
- void remove_cursor();
-
- virtual void copy_pixels(const QRegion& dest_region, RedDrawable& dest_dc);
-
- void handle_init(RedPeer::InMessage* message);
- void handle_reset(RedPeer::InMessage* message);
- void handle_cursor_set(RedPeer::InMessage* message);
- void handle_cursor_move(RedPeer::InMessage* message);
- void handle_cursor_hide(RedPeer::InMessage* message);
- void handle_cursor_trail(RedPeer::InMessage* message);
- void handle_inval_one(RedPeer::InMessage* message);
- void handle_inval_all(RedPeer::InMessage* message);
-
- friend class AttachDispayEvent;
- friend class CursorUpdateEvent;
-
-private:
- CursorCache _cursor_cache;
- CursorData* _cursor;
- SpicePoint _hot_pos;
- SpiceRect _cursor_rect;
- Mutex _update_lock;
- bool _cursor_visible;
- DisplayChannel* _display_channel;
-};
-
-#endif
diff --git a/client/debug.h b/client/debug.h
deleted file mode 100644
index f2cc2990..00000000
--- a/client/debug.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_DEBUG
-#define _H_DEBUG
-
-#include <stdlib.h>
-#include <sstream>
-
-#include "platform.h"
-
-#ifdef WIN32
-#define snprintf _snprintf
-#endif
-
-#define ON_PANIC() ::abort()
-
-#ifdef RED_DEBUG
-
-#ifdef WIN32
-#define ASSERTBREAK DebugBreak()
-#else
-#define ASSERTBREAK ::abort()
-#endif
-
-#define ASSERT(x) if (!(x)) { \
- printf("%s: ASSERT %s failed\n", __FUNCTION__, #x); \
- ASSERTBREAK; \
-}
-
-#else
-
-#define ASSERT(cond)
-
-#endif
-
-enum {
- LOG_DEBUG,
- LOG_INFO,
- LOG_WARN,
- LOG_ERROR,
- LOG_FATAL
-};
-
-void spice_log(unsigned int type, const char *function, const char *format, ...);
-void spice_log_cleanup(void);
-
-#ifdef __GNUC__
-#define SPICE_FUNC_NAME __PRETTY_FUNCTION__
-#else
-#define SPICE_FUNC_NAME __FUNCTION__
-#endif
-
-#define LOG(type, format, ...) spice_log(type, SPICE_FUNC_NAME, format, ## __VA_ARGS__)
-
-#define LOG_INFO(format, ...) LOG(LOG_INFO, format, ## __VA_ARGS__)
-#define LOG_WARN(format, ...) LOG(LOG_WARN, format, ## __VA_ARGS__)
-#define LOG_ERROR(format, ...) LOG(LOG_ERROR, format, ## __VA_ARGS__)
-
-#define PANIC(format, ...) { \
- LOG(LOG_FATAL, format, ## __VA_ARGS__); \
- ON_PANIC(); \
-}
-
-#define PANIC_ON(x) if ((x)) { \
- LOG(LOG_FATAL, "%s panic %s\n", __FUNCTION__, #x); \
- ON_PANIC(); \
-}
-
-#define DBGLEVEL 1000
-
-#define DBG(level, format, ...) { \
- if (level <= DBGLEVEL) { \
- LOG(LOG_DEBUG, format, ## __VA_ARGS__); \
- } \
-}
-
-#endif // _H_DEBUG
diff --git a/client/display_channel.cpp b/client/display_channel.cpp
deleted file mode 100644
index 47076ad9..00000000
--- a/client/display_channel.cpp
+++ /dev/null
@@ -1,1901 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-#include "red_pixmap.h"
-#ifdef USE_OPENGL
-#include "red_pixmap_gl.h"
-#endif
-#include "debug.h"
-#include "utils.h"
-#include "common.h"
-#include "display_channel.h"
-#include "application.h"
-#include "screen.h"
-#ifdef USE_OPENGL
-#include "red_gl_canvas.h"
-#endif
-#include "red_sw_canvas.h"
-#include "red_client.h"
-#include "utils.h"
-#include "debug.h"
-#ifdef WIN32
-#include "red_gdi_canvas.h"
-#endif
-#include "platform_utils.h"
-#include "inputs_channel.h"
-#include "cursor_channel.h"
-#include "mjpeg_decoder.h"
-
-class CreatePrimarySurfaceEvent: public SyncEvent {
-public:
- CreatePrimarySurfaceEvent(DisplayChannel& channel, int width, int height, uint32_t format)
- : _channel (channel)
- , _width (width)
- , _height (height)
- , _format (format)
- {
- }
-
- virtual void do_response(AbstractProcessLoop& events_loop)
- {
- Application* app = (Application*)events_loop.get_owner();
- _channel.screen()->lock_size();
- app->resize_screen(_channel.screen(), _width, _height);
- _channel.create_canvas(0, app->get_canvas_types(), _width, _height, _format);
- }
-
-private:
- DisplayChannel& _channel;
- int _width;
- int _height;
- uint32_t _format;
-};
-
-class DestroyPrimarySurfaceEvent: public SyncEvent {
-public:
- DestroyPrimarySurfaceEvent(DisplayChannel& channel)
- : _channel (channel)
- {
- }
-
- virtual void do_response(AbstractProcessLoop& events_loop)
- {
- _channel.destroy_canvas(0);
- }
-
-private:
- DisplayChannel& _channel;
-};
-
-class DestroyAllSurfacesEvent: public SyncEvent {
-public:
- DestroyAllSurfacesEvent(DisplayChannel& channel, bool include_primary = true)
- : _channel(channel)
- , _include_primary(include_primary)
- {
- }
-
- virtual void do_response(AbstractProcessLoop& events_loop)
- {
- if (_include_primary) {
- _channel.do_destroy_all_surfaces();
- } else {
- _channel.do_destroy_off_screen_surfaces();
- }
- }
-
-private:
- DisplayChannel& _channel;
- bool _include_primary;
-};
-
-class CreateSurfaceEvent: public SyncEvent {
-public:
- CreateSurfaceEvent(DisplayChannel& channel, int surface_id, int width, int height,
- uint32_t format)
- : _channel (channel)
- , _surface_id (surface_id)
- , _width (width)
- , _height (height)
- , _format (format)
- {
- }
-
- virtual void do_response(AbstractProcessLoop& events_loop)
- {
- Application* app = (Application*)events_loop.get_owner();
- _channel.create_canvas(_surface_id, app->get_canvas_types(), _width, _height, _format);
- }
-
-private:
- DisplayChannel& _channel;
- int _surface_id;
- int _width;
- int _height;
- uint32_t _format;
-};
-
-class DestroySurfaceEvent: public SyncEvent {
-public:
- DestroySurfaceEvent(DisplayChannel& channel, int surface_id)
- : _channel (channel)
- , _surface_id (surface_id)
- {
- }
-
- virtual void do_response(AbstractProcessLoop& events_loop)
- {
- _channel.destroy_canvas(_surface_id);
- }
-
-private:
- DisplayChannel& _channel;
- int _surface_id;
-};
-
-class UnlockScreenEvent: public Event {
-public:
- UnlockScreenEvent(RedScreen* screen)
- : _screen (screen->ref())
- {
- }
-
- virtual void response(AbstractProcessLoop& events_loop)
- {
- (*_screen)->unlock_size();
- }
-
-private:
- AutoRef<RedScreen> _screen;
-};
-
-
-#define MAX_VIDEO_FRAMES 30
-#define MAX_OVER 15
-#define MAX_UNDER -15
-
-
-class VideoStream {
-public:
- VideoStream(RedClient& client, Canvas& canvas, DisplayChannel& channel,
- uint32_t codec_type, bool top_down, uint32_t stream_width,
- uint32_t stream_height, uint32_t src_width, uint32_t src_height,
- SpiceRect* dest, int clip_type, uint32_t num_clip_rects, SpiceRect* clip_rects);
- ~VideoStream();
-
- void push_data(uint32_t mm_time, uint32_t length, uint8_t* data);
- void set_clip(int type, uint32_t num_clip_rects, SpiceRect* clip_rects);
- const SpiceRect& get_dest() {return _dest;}
- void handle_update_mark(uint64_t update_mark);
- uint32_t handle_timer_update(uint32_t now);
-
-private:
- void free_frame(uint32_t frame_index);
- void release_all_bufs();
- void remove_dead_frames(uint32_t mm_time);
- uint32_t alloc_frame_slot();
- void maintenance();
- void drop_one_frame();
- uint32_t frame_slot(uint32_t frame_index) { return frame_index % MAX_VIDEO_FRAMES;}
- static bool is_time_to_display(uint32_t now, uint32_t frame_time);
-
-private:
- RedClient& _client;
- Canvas& _canvas;
- DisplayChannel& _channel;
- MJpegDecoder *_mjpeg_decoder;
- int _stream_width;
- int _stream_height;
- int _stride;
- bool _top_down;
- SpiceRect _dest;
- QRegion _clip_region;
- QRegion* _clip;
-
- struct VideoFrame {
- uint32_t mm_time;
- uint32_t compressed_data_size;
- uint8_t* compressed_data;
- };
-
- uint32_t _frames_head;
- uint32_t _frames_tail;
- uint32_t _kill_mark;
- VideoFrame _frames[MAX_VIDEO_FRAMES];
-
-#ifdef WIN32
- HBITMAP _prev_bitmap;
- HDC _dc;
-#endif
- uint8_t *_uncompressed_data;
- PixmapHeader _pixmap;
- uint64_t _update_mark;
- uint32_t _update_time;
-
-public:
- VideoStream* next;
-};
-
-#ifdef WIN32
-static int create_bitmap(HDC *dc, HBITMAP *prev_bitmap,
- uint8_t **data, int *nstride,
- int width, int height, bool top_down)
-{
- HBITMAP bitmap;
- struct {
- BITMAPINFO inf;
- RGBQUAD palette[255];
- } bitmap_info;
-
- memset(&bitmap_info, 0, sizeof(bitmap_info));
- bitmap_info.inf.bmiHeader.biSize = sizeof(bitmap_info.inf.bmiHeader);
- bitmap_info.inf.bmiHeader.biWidth = width;
- bitmap_info.inf.bmiHeader.biHeight = top_down ? -height : height;
-
- bitmap_info.inf.bmiHeader.biPlanes = 1;
- bitmap_info.inf.bmiHeader.biBitCount = 32;
- bitmap_info.inf.bmiHeader.biCompression = BI_RGB;
- *nstride = width * 4;
-
- *dc = create_compatible_dc();
- if (!*dc) {
- return 0;
- }
-
- bitmap = CreateDIBSection(*dc, &bitmap_info.inf, 0, (void **)data, NULL, 0);
- if (!bitmap) {
- DeleteObject(*dc);
- return 0;
- }
-
- *prev_bitmap = (HBITMAP)SelectObject(*dc, bitmap);
- return 1;
-}
-
-#endif
-
-VideoStream::VideoStream(RedClient& client, Canvas& canvas, DisplayChannel& channel,
- uint32_t codec_type, bool top_down, uint32_t stream_width,
- uint32_t stream_height, uint32_t src_width, uint32_t src_height,
- SpiceRect* dest, int clip_type, uint32_t num_clip_rects,
- SpiceRect* clip_rects)
- : _client (client)
- , _canvas (canvas)
- , _channel (channel)
- , _mjpeg_decoder (NULL)
- , _stream_width (stream_width)
- , _stream_height (stream_height)
- , _stride (stream_width * sizeof(uint32_t))
- , _top_down (top_down)
- , _dest (*dest)
- , _clip (NULL)
- , _frames_head (0)
- , _frames_tail (0)
- , _kill_mark (0)
- , _uncompressed_data (NULL)
- , _update_mark (0)
- , _update_time (0)
- , next (NULL)
-{
- memset(_frames, 0, sizeof(_frames));
- region_init(&_clip_region);
- if (codec_type != SPICE_VIDEO_CODEC_TYPE_MJPEG) {
- THROW("invalid video codec type %u", codec_type);
- }
-
- try {
-#ifdef WIN32
- if (!create_bitmap(&_dc, &_prev_bitmap, &_uncompressed_data, &_stride,
- stream_width, stream_height, _top_down)) {
- THROW("create_bitmap failed");
- }
-#else
- _uncompressed_data = new uint8_t[_stride * stream_height];
-#endif
- _pixmap.width = src_width;
- _pixmap.height = src_height;
-
- _mjpeg_decoder = new MJpegDecoder(stream_width, stream_height, _stride, _uncompressed_data, channel.get_peer_major() == 1);
-
-#ifdef WIN32
- SetViewportOrgEx(_dc, 0, stream_height - src_height, NULL);
-#endif
-
- // this doesn't have effect when using gdi_canvas. The sign of BITMAPINFO's biHeight
- // determines the orientation (see create_bitmap).
- if (_top_down) {
- _pixmap.data = _uncompressed_data;
- _pixmap.stride = _stride;
- } else {
- _pixmap.data = _uncompressed_data + _stride * (src_height - 1);
- _pixmap.stride = -_stride;
- }
-
- set_clip(clip_type, num_clip_rects, clip_rects);
-
- } catch (...) {
- if (_mjpeg_decoder) {
- delete _mjpeg_decoder;
- _mjpeg_decoder = NULL;
- }
- release_all_bufs();
- throw;
- }
-}
-
-VideoStream::~VideoStream()
-{
- if (_mjpeg_decoder) {
- delete _mjpeg_decoder;
- _mjpeg_decoder = NULL;
- }
- release_all_bufs();
- region_destroy(&_clip_region);
-}
-
-void VideoStream::release_all_bufs()
-{
- for (int i = 0; i < MAX_VIDEO_FRAMES; i++) {
- delete[] _frames[i].compressed_data;
- }
-#ifdef WIN32
- if (_dc) {
- HBITMAP bitmap = (HBITMAP)SelectObject(_dc, _prev_bitmap);
- DeleteObject(bitmap);
- DeleteObject(_dc);
- }
-#else
- delete[] _uncompressed_data;
-#endif
-}
-
-void VideoStream::free_frame(uint32_t frame_index)
-{
- int slot = frame_slot(frame_index);
- delete[] _frames[slot].compressed_data;
- _frames[slot].compressed_data = NULL;
-}
-
-void VideoStream::remove_dead_frames(uint32_t mm_time)
-{
- while (_frames_head != _frames_tail) {
- if (int(_frames[frame_slot(_frames_tail)].mm_time - mm_time) >= MAX_UNDER) {
- return;
- }
- free_frame(_frames_tail);
- _frames_tail++;
- }
-}
-
-void VideoStream::drop_one_frame()
-{
- ASSERT(MAX_VIDEO_FRAMES > 2 && (_frames_head - _frames_tail) == MAX_VIDEO_FRAMES);
- unsigned frame_index = _frames_head - _kill_mark++ % (MAX_VIDEO_FRAMES - 2) - 2;
-
- free_frame(frame_index);
-
- while (frame_index != _frames_tail) {
- --frame_index;
- _frames[frame_slot(frame_index + 1)] = _frames[frame_slot(frame_index)];
- }
- _frames_tail++;
-}
-
-bool VideoStream::is_time_to_display(uint32_t now, uint32_t frame_time)
-{
- int delta = frame_time - now;
- return delta <= MAX_OVER && delta >= MAX_UNDER;
-}
-
-void VideoStream::maintenance()
-{
- uint32_t mm_time = _client.get_mm_time();
-
- remove_dead_frames(mm_time);
- if (!_update_mark && !_update_time && _frames_head != _frames_tail) {
- VideoFrame* tail = &_frames[frame_slot(_frames_tail)];
-
- ASSERT(tail->compressed_data);
- uint8_t* data = tail->compressed_data;
- uint32_t length = tail->compressed_data_size;
- int got_picture = 0;
-
- got_picture =_mjpeg_decoder->decode_data(data, length);
- if (got_picture) {
-#ifdef WIN32
- _canvas.put_image(_dc, _pixmap, _dest, _clip);
-#else
- _canvas.put_image(_pixmap, _dest, _clip);
-#endif
- if (is_time_to_display(mm_time, tail->mm_time)) {
- _update_mark = _channel.invalidate(_dest, true);
- Platform::yield();
- } else {
- _update_time = tail->mm_time;
- _channel.stream_update_request(_update_time);
- }
- }
- free_frame(_frames_tail++);
- }
-}
-
-uint32_t VideoStream::handle_timer_update(uint32_t now)
-{
- if (!_update_time) {
- return 0;
- }
-
- if (is_time_to_display(now, _update_time)) {
- _update_time = 0;
- _update_mark = _channel.invalidate(_dest, true);
- } else if ((int)(_update_time - now) < 0) {
- DBG(0, "to late");
- _update_time = 0;
- }
- return _update_time;
-}
-
-void VideoStream::handle_update_mark(uint64_t update_mark)
-{
- if (!_update_mark || update_mark < _update_mark) {
- return;
- }
- _update_mark = 0;
- maintenance();
-}
-
-uint32_t VideoStream::alloc_frame_slot()
-{
- if ((_frames_head - _frames_tail) == MAX_VIDEO_FRAMES) {
- drop_one_frame();
- }
- return frame_slot(_frames_head++);
-}
-
-void VideoStream::push_data(uint32_t mm_time, uint32_t length, uint8_t* data)
-{
- maintenance();
- uint32_t frame_slot = alloc_frame_slot();
- _frames[frame_slot].compressed_data = new uint8_t[length];
- memcpy(_frames[frame_slot].compressed_data, data, length);
- _frames[frame_slot].compressed_data_size = length;
- _frames[frame_slot].mm_time = mm_time ? mm_time : 1;
- maintenance();
-}
-
-void VideoStream::set_clip(int type, uint32_t num_clip_rects, SpiceRect* clip_rects)
-{
- if (type == SPICE_CLIP_TYPE_NONE) {
- _clip = NULL;
- return;
- }
-
- ASSERT(type == SPICE_CLIP_TYPE_RECTS)
- region_clear(&_clip_region);
-
- for (unsigned int i = 0; i < num_clip_rects; i++) {
- region_add(&_clip_region, &clip_rects[i]);
- }
- _clip = &_clip_region;
-}
-
-StreamsTrigger::StreamsTrigger(DisplayChannel& channel)
- : _channel (channel)
-{
-}
-
-void StreamsTrigger::on_event()
-{
- _channel.on_streams_trigger();
-}
-
-#ifdef USE_OPENGL
-
-GLInterruptRecreate::GLInterruptRecreate(DisplayChannel& channel)
- : _channel (channel)
-{
-}
-
-void GLInterruptRecreate::trigger()
-{
- Lock lock(_lock);
- EventSources::Trigger::trigger();
- _cond.wait(lock);
-}
-
-void GLInterruptRecreate::on_event()
-{
- Lock lock(_lock);
- _channel.recreate_ogl_context_interrupt();
- _cond.notify_one();
-}
-
-#endif
-
-void InterruptUpdate::on_event()
-{
- _channel.update_interrupt();
-}
-
-InterruptUpdate::InterruptUpdate(DisplayChannel& channel)
- : _channel (channel)
-{
-}
-
-StreamsTimer::StreamsTimer(DisplayChannel& channel)
- : _channel (channel)
-{
-}
-
-void StreamsTimer::response(AbstractProcessLoop& events_loop)
-{
- _channel.streams_time();
-}
-
-#define RESET_TIMEOUT (1000 * 5)
-
-class ResetTimer: public Timer {
-public:
- ResetTimer(RedScreen* screen, RedClient& client) : _screen(screen), _client(client) {}
- virtual void response(AbstractProcessLoop& events_loop);
-private:
- RedScreen* _screen;
- RedClient& _client;
-};
-
-void ResetTimer::response(AbstractProcessLoop& events_loop)
-{
- _screen->unref();
- _client.deactivate_interval_timer(this);
-}
-
-#define MIGRATION_PRIMARY_SURFACE_TIMEOUT (1000 * 5)
-
-class MigPrimarySurfaceTimer: public Timer {
-public:
- virtual void response(AbstractProcessLoop& events_loop)
- {
- DisplayChannel *channel = static_cast<DisplayChannel*>(events_loop.get_owner());
- if (channel->_mig_wait_primary) {
- channel->destroy_primary_surface();
- channel->_mig_wait_primary = false;
- }
- channel->get_process_loop().deactivate_interval_timer(this);
- }
-};
-
-class DisplayHandler: public MessageHandlerImp<DisplayChannel, SPICE_CHANNEL_DISPLAY> {
-public:
- DisplayHandler(DisplayChannel& channel)
- : MessageHandlerImp<DisplayChannel, SPICE_CHANNEL_DISPLAY>(channel) {}
-};
-
-DisplayChannel::DisplayChannel(RedClient& client, uint32_t id,
- PixmapCache& pixmap_cache, GlzDecoderWindow& glz_window)
- : RedChannel(client, SPICE_CHANNEL_DISPLAY, id, new DisplayHandler(*this),
- Platform::PRIORITY_LOW)
- , ScreenLayer (SCREEN_LAYER_DISPLAY, true)
- , _pixmap_cache (pixmap_cache)
- , _glz_window (glz_window)
- , _mark (false)
- , _update_mark (0)
- , _streams_timer (new StreamsTimer(*this))
- , _next_timer_time (0)
- , _cursor_visibal (false)
- , _active_pointer (false)
- , _capture_mouse_mode (false)
- , _inputs_channel (NULL)
- , _active_streams (NULL)
- , _streams_trigger (*this)
-#ifdef USE_OPENGL
- , _gl_interrupt_recreate (*this)
-#endif
- , _interrupt_update (*this)
- , _mig_wait_primary (false)
- , _check_diff (getenv("CHECKDIFF") != NULL)
-{
- DisplayHandler* handler = static_cast<DisplayHandler*>(get_message_handler());
-
- handler->set_handler(SPICE_MSG_MIGRATE, &DisplayChannel::handle_migrate);
- handler->set_handler(SPICE_MSG_SET_ACK, &DisplayChannel::handle_set_ack);
- handler->set_handler(SPICE_MSG_PING, &DisplayChannel::handle_ping);
- handler->set_handler(SPICE_MSG_WAIT_FOR_CHANNELS, &DisplayChannel::handle_wait_for_channels);
- handler->set_handler(SPICE_MSG_DISCONNECTING, &DisplayChannel::handle_disconnect);
- handler->set_handler(SPICE_MSG_NOTIFY, &DisplayChannel::handle_notify);
-
- handler->set_handler(SPICE_MSG_DISPLAY_MODE, &DisplayChannel::handle_mode);
- handler->set_handler(SPICE_MSG_DISPLAY_MARK, &DisplayChannel::handle_mark);
- handler->set_handler(SPICE_MSG_DISPLAY_RESET, &DisplayChannel::handle_reset);
-
- handler->set_handler(SPICE_MSG_DISPLAY_INVAL_LIST,
- &DisplayChannel::handle_inval_list);
- handler->set_handler(SPICE_MSG_DISPLAY_INVAL_ALL_PIXMAPS,
- &DisplayChannel::handle_inval_all_pixmaps);
- handler->set_handler(SPICE_MSG_DISPLAY_INVAL_PALETTE,
- &DisplayChannel::handle_inval_palette);
- handler->set_handler(SPICE_MSG_DISPLAY_INVAL_ALL_PALETTES,
- &DisplayChannel::handle_inval_all_palettes);
-
- handler->set_handler(SPICE_MSG_DISPLAY_STREAM_CREATE, &DisplayChannel::handle_stream_create);
- handler->set_handler(SPICE_MSG_DISPLAY_STREAM_CLIP, &DisplayChannel::handle_stream_clip);
- handler->set_handler(SPICE_MSG_DISPLAY_STREAM_DESTROY, &DisplayChannel::handle_stream_destroy);
- handler->set_handler(SPICE_MSG_DISPLAY_STREAM_DESTROY_ALL,
- &DisplayChannel::handle_stream_destroy_all);
-
- handler->set_handler(SPICE_MSG_DISPLAY_SURFACE_CREATE, &DisplayChannel::handle_surface_create);
- handler->set_handler(SPICE_MSG_DISPLAY_SURFACE_DESTROY, &DisplayChannel::handle_surface_destroy);
-
- get_process_loop().add_trigger(_streams_trigger);
-#ifdef USE_OPENGL
- get_process_loop().add_trigger(_gl_interrupt_recreate);
-#endif
- get_process_loop().add_trigger(_interrupt_update);
-
- set_draw_handlers();
-
- set_capability(SPICE_DISPLAY_CAP_COMPOSITE);
- set_capability(SPICE_DISPLAY_CAP_A8_SURFACE);
-}
-
-DisplayChannel::~DisplayChannel()
-{
- if (screen()) {
- screen()->set_update_interrupt_trigger(NULL);
- }
-
- destroy_streams();
- do_destroy_all_surfaces();
-}
-
-void DisplayChannel::destroy_streams()
-{
- Lock lock(_streams_lock);
- for (unsigned int i = 0; i < _streams.size(); i++) {
- delete _streams[i];
- _streams[i] = NULL;
- }
- _active_streams = NULL;
-}
-
-void DisplayChannel::set_draw_handlers()
-{
- DisplayHandler* handler = static_cast<DisplayHandler*>(get_message_handler());
-
- handler->set_handler(SPICE_MSG_DISPLAY_COPY_BITS, &DisplayChannel::handle_copy_bits);
-
- handler->set_handler(SPICE_MSG_DISPLAY_DRAW_FILL, &DisplayChannel::handle_draw_fill);
- handler->set_handler(SPICE_MSG_DISPLAY_DRAW_OPAQUE, &DisplayChannel::handle_draw_opaque);
- handler->set_handler(SPICE_MSG_DISPLAY_DRAW_COPY, &DisplayChannel::handle_draw_copy);
- handler->set_handler(SPICE_MSG_DISPLAY_DRAW_BLEND, &DisplayChannel::handle_draw_blend);
- handler->set_handler(SPICE_MSG_DISPLAY_DRAW_BLACKNESS, &DisplayChannel::handle_draw_blackness);
- handler->set_handler(SPICE_MSG_DISPLAY_DRAW_WHITENESS, &DisplayChannel::handle_draw_whiteness);
- handler->set_handler(SPICE_MSG_DISPLAY_DRAW_INVERS, &DisplayChannel::handle_draw_invers);
- handler->set_handler(SPICE_MSG_DISPLAY_DRAW_ROP3, &DisplayChannel::handle_draw_rop3);
- handler->set_handler(SPICE_MSG_DISPLAY_DRAW_STROKE, &DisplayChannel::handle_draw_stroke);
- handler->set_handler(SPICE_MSG_DISPLAY_DRAW_TEXT, &DisplayChannel::handle_draw_text);
- handler->set_handler(SPICE_MSG_DISPLAY_DRAW_TRANSPARENT,
- &DisplayChannel::handle_draw_transparent);
- handler->set_handler(SPICE_MSG_DISPLAY_DRAW_ALPHA_BLEND,
- &DisplayChannel::handle_draw_alpha_blend);
- handler->set_handler(SPICE_MSG_DISPLAY_DRAW_COMPOSITE,
- &DisplayChannel::handle_draw_composite);
- handler->set_handler(SPICE_MSG_DISPLAY_STREAM_DATA, &DisplayChannel::handle_stream_data);
-}
-
-void DisplayChannel::clear_draw_handlers()
-{
- DisplayHandler* handler = static_cast<DisplayHandler*>(get_message_handler());
-
- handler->set_handler(SPICE_MSG_DISPLAY_COPY_BITS, NULL);
- handler->set_handler(SPICE_MSG_DISPLAY_DRAW_FILL, NULL);
- handler->set_handler(SPICE_MSG_DISPLAY_DRAW_OPAQUE, NULL);
- handler->set_handler(SPICE_MSG_DISPLAY_DRAW_COPY, NULL);
- handler->set_handler(SPICE_MSG_DISPLAY_DRAW_BLEND, NULL);
- handler->set_handler(SPICE_MSG_DISPLAY_DRAW_BLACKNESS, NULL);
- handler->set_handler(SPICE_MSG_DISPLAY_DRAW_WHITENESS, NULL);
- handler->set_handler(SPICE_MSG_DISPLAY_DRAW_INVERS, NULL);
- handler->set_handler(SPICE_MSG_DISPLAY_DRAW_ROP3, NULL);
- handler->set_handler(SPICE_MSG_DISPLAY_DRAW_STROKE, NULL);
- handler->set_handler(SPICE_MSG_DISPLAY_DRAW_TEXT, NULL);
- handler->set_handler(SPICE_MSG_DISPLAY_DRAW_TRANSPARENT, NULL);
- handler->set_handler(SPICE_MSG_DISPLAY_DRAW_ALPHA_BLEND, NULL);
- handler->set_handler(SPICE_MSG_DISPLAY_DRAW_COMPOSITE, NULL);
- handler->set_handler(SPICE_MSG_DISPLAY_STREAM_DATA, NULL);
-}
-
-void DisplayChannel::copy_pixels(const QRegion& dest_region,
- const PixmapHeader &dest_pixmap)
-{
- Canvas *canvas;
-
- if (!_surfaces_cache.exist(0)) {
- return;
- }
-
- canvas = _surfaces_cache[0];
- canvas->copy_pixels(dest_region, NULL, &dest_pixmap);
-}
-
-#ifdef USE_OPENGL
-void DisplayChannel::recreate_ogl_context_interrupt()
-{
- Canvas* canvas;
-
- if (_surfaces_cache.exist(0)) { //fix me to all surfaces
- canvas = _surfaces_cache[0];
- ((GCanvas *)(canvas))->touch_context();
- ((GCanvas *)canvas)->textures_lost();
- delete canvas;
- }
-
- if (!create_ogl_canvas(0, _x_res, _y_res, _format, 0, _rendertype)) {
- THROW("create_ogl_canvas failed");
- }
-
- canvas = _surfaces_cache[0];
- ((GCanvas *)(canvas))->touch_context();
-}
-
-void DisplayChannel::recreate_ogl_context()
-{
- if (_surfaces_cache.exist(0) && _surfaces_cache[0]->get_pixmap_type() ==
- CANVAS_TYPE_GL) {
- if (!screen()->need_recreate_context_gl()) {
- _gl_interrupt_recreate.trigger();
- }
- }
-}
-
-#endif
-
-void DisplayChannel::update_cursor()
-{
- if (!screen() || !_active_pointer) {
- return;
- }
-
- if (_capture_mouse_mode) {
- //todo: use special cursor for capture mode
- AutoRef<LocalCursor> default_cursor(Platform::create_default_cursor());
- screen()->set_cursor(*default_cursor);
- return;
- }
-
- if (!_cursor_visibal || !*_cursor) {
- screen()->hide_cursor();
- return;
- }
-
-
- if (!(*_cursor)->get_local()) {
- AutoRef<LocalCursor> local_cursor(Platform::create_local_cursor(*_cursor));
- if (*local_cursor == NULL) {
- THROW("create local cursor failed");
- }
- (*_cursor)->set_local(*local_cursor);
- }
- screen()->set_cursor((*_cursor)->get_local());
-}
-
-void DisplayChannel::set_cursor(CursorData* cursor)
-{
- ASSERT(cursor);
- _cursor.reset(cursor->ref());
- _cursor_visibal = true;
- update_cursor();
-}
-
-void DisplayChannel::hide_cursor()
-{
- _cursor_visibal = false;
- update_cursor();
-}
-
-void DisplayChannel::attach_inputs(InputsChannel* inputs_channel)
-{
- if (_inputs_channel) {
- return;
- }
-
- _inputs_channel = inputs_channel;
- if (_active_pointer && !_capture_mouse_mode) {
- _inputs_channel->on_mouse_position(_pointer_pos.x, _pointer_pos.y,
- _buttons_state, get_id());
- }
-}
-
-void DisplayChannel::detach_inputs()
-{
- _inputs_channel = NULL;
-}
-
-bool DisplayChannel::pointer_test(int x, int y)
-{
- return contains_point(x, y);
-}
-
-void DisplayChannel::on_pointer_enter(int x, int y, unsigned int buttons_state)
-{
- _active_pointer = true;
- update_cursor();
- on_pointer_motion(x, y, buttons_state);
-}
-
-void DisplayChannel::on_pointer_motion(int x, int y, unsigned int buttons_state)
-{
- _pointer_pos.x = x;
- _pointer_pos.y = y;
- _buttons_state = buttons_state;
- if (!_capture_mouse_mode && _inputs_channel) {
- _inputs_channel->on_mouse_position(x, y, buttons_state, get_id());
- }
-}
-
-void DisplayChannel::on_pointer_leave()
-{
- _active_pointer = false;
-}
-
-void DisplayChannel::on_mouse_button_press(int button, int buttons_state)
-{
- _buttons_state = buttons_state;
- if (!_capture_mouse_mode && _inputs_channel) {
- _inputs_channel->on_mouse_down(button, buttons_state);
- }
-}
-
-void DisplayChannel::on_mouse_button_release(int button, int buttons_state)
-{
- _buttons_state = buttons_state;
- if (_capture_mouse_mode) {
- if (button == SPICE_MOUSE_BUTTON_LEFT) {
- get_client().on_mouse_capture_trigger(*screen());
- }
- return;
- }
-
- if (_inputs_channel) {
- _inputs_channel->on_mouse_up(button, buttons_state);
- }
-}
-
-void DisplayChannel::set_capture_mode(bool on)
-{
- if (_capture_mouse_mode == on) {
- return;
- }
- _capture_mouse_mode = on;
- update_cursor();
- if (_inputs_channel && !_capture_mouse_mode && _active_pointer) {
- _inputs_channel->on_mouse_position(_pointer_pos.x, _pointer_pos.y, _buttons_state,
- get_id());
- }
-}
-
-void DisplayChannel::update_interrupt()
-{
-#ifdef USE_OPENGL
- Canvas *canvas;
-#endif
-
- if (!_surfaces_cache.exist(0) || !screen()) {
- return;
- }
-
-#ifdef USE_OPENGL
- canvas = _surfaces_cache[0];
- if (canvas->get_pixmap_type() == CANVAS_TYPE_GL) {
- ((GCanvas *)(canvas))->pre_gl_copy();
- }
-#endif
-
- screen()->update();
-
-#ifdef USE_OPENGL
- if (canvas->get_pixmap_type() == CANVAS_TYPE_GL) {
- ((GCanvas *)(canvas))->post_gl_copy();
- }
-#endif
-}
-
-#ifdef USE_OPENGL
-
-void DisplayChannel::pre_migrate()
-{
-}
-
-void DisplayChannel::post_migrate()
-{
-#ifdef USE_OPENGL
- if (_surfaces_cache.exist(0) && _surfaces_cache[0]->get_pixmap_type() == CANVAS_TYPE_GL) {
- _gl_interrupt_recreate.trigger();
- }
-#endif
-}
-
-#endif
-
-void DisplayChannel::copy_pixels(const QRegion& dest_region,
- RedDrawable& dest_dc)
-{
- if (!_surfaces_cache.exist(0)) {
- return;
- }
-
- _surfaces_cache[0]->copy_pixels(dest_region, dest_dc);
-}
-
-class ActivateTimerEvent: public Event {
-public:
- ActivateTimerEvent(DisplayChannel& channel)
- : _channel (channel)
- {
- }
-
- virtual void response(AbstractProcessLoop& events_loop)
- {
- _channel.activate_streams_timer();
- }
-
-private:
- DisplayChannel& _channel;
-};
-
-class AttachChannelsEvent : public Event {
-public:
- AttachChannelsEvent(DisplayChannel& channel) : Event(), _channel (channel) {}
-
- class AttachChannels: public ForEachChannelFunc {
- public:
- AttachChannels(DisplayChannel& channel)
- : _channel (channel)
- {
- }
-
- virtual bool operator() (RedChannel& channel)
- {
- if (channel.get_type() == SPICE_CHANNEL_CURSOR && channel.get_id() == _channel.get_id()) {
- static_cast<CursorChannel&>(channel).attach_display(&_channel);
- } else if (channel.get_type() == SPICE_CHANNEL_INPUTS) {
- _channel.attach_inputs(&static_cast<InputsChannel&>(channel));
- }
- return false;
- }
-
- private:
- DisplayChannel& _channel;
- };
-
- virtual void response(AbstractProcessLoop& events_loop)
- {
- uint32_t mouse_mode = _channel.get_client().get_mouse_mode();
- _channel._capture_mouse_mode = (mouse_mode == SPICE_MOUSE_MODE_SERVER);
- AttachChannels for_each_func(_channel);
- _channel.get_client().for_each_channel(for_each_func);
- }
-
-private:
- DisplayChannel& _channel;
-};
-
-class DetachChannelsEvent : public Event {
-public:
- DetachChannelsEvent(DisplayChannel& channel) : Event(), _channel (channel) {}
-
- class DetatchChannels: public ForEachChannelFunc {
- public:
- DetatchChannels(DisplayChannel& channel)
- : _channel (channel)
- {
- }
-
- virtual bool operator() (RedChannel& channel)
- {
- if (channel.get_type() == SPICE_CHANNEL_CURSOR && channel.get_id() == _channel.get_id()) {
- static_cast<CursorChannel&>(channel).detach_display();
- return true;
- }
- return false;
- }
-
- private:
- DisplayChannel& _channel;
- };
-
- virtual void response(AbstractProcessLoop& events_loop)
- {
- DetatchChannels for_each_func(_channel);
- _channel.get_client().for_each_channel(for_each_func);
- }
-
-private:
- DisplayChannel& _channel;
-};
-
-void DisplayChannel::on_connect()
-{
- Message* message = new Message(SPICE_MSGC_DISPLAY_INIT);
- SpiceMsgcDisplayInit init;
- init.pixmap_cache_id = 1;
- init.pixmap_cache_size = get_client().get_pixmap_cache_size();
- init.glz_dictionary_id = 1;
- init.glz_dictionary_window_size = get_client().get_glz_window_size();
- _marshallers->msgc_display_init(message->marshaller(), &init);
- post_message(message);
- AutoRef<AttachChannelsEvent> attach_channels(new AttachChannelsEvent(*this));
- get_client().push_event(*attach_channels);
-}
-
-void DisplayChannel::on_disconnect()
-{
- if (_surfaces_cache.exist(0)) {
- _surfaces_cache[0]->clear();
- }
-
- clear();
-
- AutoRef<DetachChannelsEvent> detach_channels(new DetachChannelsEvent(*this));
- get_client().push_event(*detach_channels);
- if (screen()) {
- AutoRef<UnlockScreenEvent> unlock_event(new UnlockScreenEvent(screen()));
- get_client().push_event(*unlock_event);
- detach_from_screen(get_client().get_application());
- }
- AutoRef<SyncEvent> sync_event(new SyncEvent());
- get_client().push_event(*sync_event);
- (*sync_event)->wait();
-}
-
-void DisplayChannel::do_destroy_all_surfaces()
-{
- SurfacesCache::iterator s_iter;
-
- for (s_iter = _surfaces_cache.begin(); s_iter != _surfaces_cache.end(); s_iter++) {
- delete (*s_iter).second;
- }
- _surfaces_cache.clear();
-}
-
-void DisplayChannel::do_destroy_off_screen_surfaces()
-{
- SurfacesCache::iterator s_iter;
- Canvas *primary_canvas = NULL;
-
- for (s_iter = _surfaces_cache.begin(); s_iter != _surfaces_cache.end(); s_iter++) {
- if (s_iter->first == 0) {
- primary_canvas = s_iter->second;
- } else {
- delete s_iter->second;
- }
- }
- _surfaces_cache.clear();
- if (primary_canvas) {
- _surfaces_cache[0] = primary_canvas;
- }
-}
-
-void DisplayChannel::destroy_all_surfaces()
-{
- AutoRef<DestroyAllSurfacesEvent> destroy_event(new DestroyAllSurfacesEvent(*this));
-
- get_client().push_event(*destroy_event);
- (*destroy_event)->wait();
- if (!(*destroy_event)->success()) {
- THROW("destroy all surfaces failed");
- }
-}
-
-void DisplayChannel::destroy_off_screen_surfaces()
-{
- AutoRef<DestroyAllSurfacesEvent> destroy_event(new DestroyAllSurfacesEvent(*this, false));
-
- get_client().push_event(*destroy_event);
- (*destroy_event)->wait();
- if (!(*destroy_event)->success()) {
- THROW("destroy all surfaces failed");
- }
-}
-
-void DisplayChannel::clear(bool destroy_primary)
-{
- _palette_cache.clear();
- destroy_streams();
- if (screen()) {
- screen()->set_update_interrupt_trigger(NULL);
- }
- _update_mark = 0;
- _next_timer_time = 0;
- get_client().deactivate_interval_timer(*_streams_timer);
- if (destroy_primary) {
- destroy_all_surfaces();
- } else {
- destroy_off_screen_surfaces();
- }
-}
-
-void DisplayChannel::on_disconnect_mig_src()
-{
- clear(false);
- // Not clrearing the primary surface till we receive a new one (or a timeout).
- if (_surfaces_cache.exist(0)) {
- AutoRef<MigPrimarySurfaceTimer> mig_timer(new MigPrimarySurfaceTimer());
- get_process_loop().activate_interval_timer(*mig_timer, MIGRATION_PRIMARY_SURFACE_TIMEOUT);
- _mig_wait_primary = true;
- }
-}
-
-bool DisplayChannel::create_sw_canvas(int surface_id, int width, int height, uint32_t format)
-{
- try {
- SCanvas *canvas = new SCanvas(surface_id == 0, width, height, format,
- screen()->get_window(),
- _pixmap_cache, _palette_cache, _glz_window,
- _surfaces_cache);
- _surfaces_cache[surface_id] = canvas;
- if (surface_id == 0) {
- LOG_INFO("display %d: using sw", get_id());
- }
- } catch (...) {
- return false;
- }
- return true;
-}
-
-#ifdef USE_OPENGL
-bool DisplayChannel::create_ogl_canvas(int surface_id, int width, int height, uint32_t format,
- bool recreate, RenderType rendertype)
-{
- try {
- RedWindow *win;
-
- win = screen()->get_window();
- GCanvas *canvas = new GCanvas(width, height, format, win, rendertype,
- _pixmap_cache,
- _palette_cache,
- _glz_window,
- _surfaces_cache);
-
- screen()->untouch_context();
-
- _surfaces_cache[surface_id] = canvas;
- _rendertype = rendertype;
- if (surface_id == 0) {
- LOG_INFO("display %d: using ogl", get_id());
- }
- } catch (...) {
- return false;
- }
- return true;
-}
-
-#endif
-
-#ifdef WIN32
-bool DisplayChannel::create_gdi_canvas(int surface_id, int width, int height, uint32_t format)
-{
- try {
- GDICanvas *canvas = new GDICanvas(width, height, format,
- _pixmap_cache, _palette_cache, _glz_window,
- _surfaces_cache);
- _surfaces_cache[surface_id] = canvas;
- if (surface_id == 0) {
- LOG_INFO("display %d: using gdi", get_id());
- }
- } catch (...) {
- return false;
- }
- return true;
-}
-
-#endif
-
-void DisplayChannel::destroy_canvas(int surface_id)
-{
- Canvas *canvas;
-
- if (!_surfaces_cache.exist(surface_id)) {
- LOG_INFO("surface does not exist: %d", surface_id);
- return;
- }
-
- canvas = _surfaces_cache[surface_id];
- _surfaces_cache.erase(surface_id);
-
-#ifdef USE_OPENGL
- if (canvas->get_pixmap_type() == CANVAS_TYPE_GL) {
- ((GCanvas *)(canvas))->touch_context();
- }
-#endif
-
- delete canvas;
-}
-
-void DisplayChannel::create_canvas(int surface_id, const std::vector<int>& canvas_types, int width,
- int height, uint32_t format)
-{
-#ifdef USE_OPENGL
- bool recreate = true;
-#endif
- unsigned int i;
-
- if (screen()) {
-#ifdef USE_OPENGL
- if (screen()->need_recreate_context_gl()) {
- recreate = false;
- }
-#endif
- screen()->set_update_interrupt_trigger(NULL);
- }
-
- if (_surfaces_cache.exist(surface_id)) {
- LOG_WARN("surface already exists: %d", surface_id);
- }
-
- for (i = 0; i < canvas_types.size(); i++) {
-
- if (canvas_types[i] == CANVAS_OPTION_SW && create_sw_canvas(surface_id, width, height, format)) {
- break;
- }
-#ifdef USE_OPENGL
- if (canvas_types[i] == CANVAS_OPTION_OGL_FBO && create_ogl_canvas(surface_id, width, height, format,
- recreate,
- RENDER_TYPE_FBO)) {
- break;
- }
- if (canvas_types[i] == CANVAS_OPTION_OGL_PBUFF && create_ogl_canvas(surface_id, width, height, format,
- recreate,
- RENDER_TYPE_PBUFF)) {
- break;
- }
-#endif
-#ifdef WIN32
- if (canvas_types[i] == CANVAS_OPTION_GDI && create_gdi_canvas(surface_id, width, height, format)) {
- break;
- }
-#endif
- }
-
- if (i == canvas_types.size()) {
- THROW("create canvas failed");
- }
-
- // make sure to refresh the whole display
- SpiceRect rect = { 0, 0, width, height };
- invalidate(rect, true);
-
- try {
- if (!_check_diff)
- return;
-
- SCanvas *canvas = new SCanvas(surface_id == 0, width, height, format,
- screen()->get_window(),
- _pixmap_cache, _palette_cache, _glz_window,
- _surfaces_cache);
- _swsurfaces_cache[surface_id] = canvas;
- if (surface_id == 0) {
- LOG_INFO("display %d: check sw", get_id());
- }
- } catch (...) {
- spice_warn_if_reached();
- }
-}
-
-void DisplayChannel::handle_mode(RedPeer::InMessage* message)
-{
- SpiceMsgDisplayMode *mode = (SpiceMsgDisplayMode *)message->data();
-
- if (_surfaces_cache.exist(0)) {
- destroy_primary_surface();
- }
- create_primary_surface(mode->x_res, mode->y_res,
- mode->bits == 32 ? SPICE_SURFACE_FMT_32_xRGB : SPICE_SURFACE_FMT_16_555);
-}
-
-void DisplayChannel::handle_mark(RedPeer::InMessage *message)
-{
- _mark = true;
- SpiceRect area;
- area.top = area.left = 0;
- area.right = _x_res;
- area.bottom = _y_res;
-
- AutoRef<VisibilityEvent> event(new VisibilityEvent(get_id()));
- get_client().push_event(*event);
- set_rect_area(area);
-}
-
-void DisplayChannel::reset_screen()
-{
- AutoRef<UnlockScreenEvent> unlock_event(new UnlockScreenEvent(screen()));
- get_client().push_event(*unlock_event);
-
- screen()->set_update_interrupt_trigger(NULL);
- AutoRef<ResetTimer> reset_timer(new ResetTimer(screen()->ref(), get_client()));
-
- detach_from_screen(get_client().get_application());
-
- get_client().activate_interval_timer(*reset_timer, RESET_TIMEOUT);
-}
-
-
-void DisplayChannel::handle_reset(RedPeer::InMessage *message)
-{
- if (_surfaces_cache.exist(0)) {
- _surfaces_cache[0]->clear();
- }
-
- _palette_cache.clear();
-
- reset_screen();
-}
-
-void DisplayChannel::handle_inval_list(RedPeer::InMessage* message)
-{
- SpiceResourceList *inval_list = (SpiceResourceList *)message->data();
-
- if (message->size() <
- sizeof(*inval_list) + inval_list->count * sizeof(inval_list->resources[0])) {
- THROW("access violation");
- }
-
- for (int i = 0; i < inval_list->count; i++) {
- if (inval_list->resources[i].type != SPICE_RES_TYPE_PIXMAP) {
- THROW("invalid res type");
- }
-
- _pixmap_cache.remove(inval_list->resources[i].id);
- }
-}
-
-void DisplayChannel::handle_inval_all_pixmaps(RedPeer::InMessage* message)
-{
- SpiceMsgWaitForChannels *wait = (SpiceMsgWaitForChannels *)message->data();
- if (message->size() < sizeof(*wait) + wait->wait_count * sizeof(wait->wait_list[0])) {
- THROW("access violation");
- }
- get_client().wait_for_channels(wait->wait_count, wait->wait_list);
- _pixmap_cache.clear();
-}
-
-void DisplayChannel::handle_inval_palette(RedPeer::InMessage* message)
-{
- SpiceMsgDisplayInvalOne* inval = (SpiceMsgDisplayInvalOne*)message->data();
- _palette_cache.remove(inval->id);
-}
-
-void DisplayChannel::handle_inval_all_palettes(RedPeer::InMessage* message)
-{
- _palette_cache.clear();
-}
-
-void DisplayChannel::set_clip_rects(const SpiceClip& clip, uint32_t& num_clip_rects,
- SpiceRect*& clip_rects)
-{
- switch (clip.type) {
- case SPICE_CLIP_TYPE_RECTS: {
- num_clip_rects = clip.rects->num_rects;
- clip_rects = clip.rects->rects;
- break;
- }
- case SPICE_CLIP_TYPE_NONE:
- num_clip_rects = 0;
- clip_rects = NULL;
- break;
- default:
- THROW("unexpected clip type");
- }
-}
-
-void DisplayChannel::handle_stream_create(RedPeer::InMessage* message)
-{
- SpiceMsgDisplayStreamCreate* stream_create = (SpiceMsgDisplayStreamCreate*)message->data();
- int surface_id = stream_create->surface_id;
-
- Lock lock(_streams_lock);
- if (_streams.size() <= stream_create->id) {
- _streams.resize(stream_create->id + 1);
- }
-
- if (_streams[stream_create->id]) {
- THROW("stream exist");
- }
-
- if (!_surfaces_cache.exist(surface_id)) {
- THROW("surface does not exist: %d", surface_id);
- }
-
- uint32_t num_clip_rects;
- SpiceRect* clip_rects;
- set_clip_rects(stream_create->clip, num_clip_rects, clip_rects);
- _streams[stream_create->id] = new VideoStream(get_client(), *_surfaces_cache[surface_id],
- *this, stream_create->codec_type,
- !!(stream_create->flags & SPICE_STREAM_FLAGS_TOP_DOWN),
- stream_create->stream_width,
- stream_create->stream_height,
- stream_create->src_width,
- stream_create->src_height,
- &stream_create->dest,
- stream_create->clip.type,
- num_clip_rects,
- clip_rects);
- _streams[stream_create->id]->next = _active_streams;
- _active_streams = _streams[stream_create->id];
-}
-
-void DisplayChannel::handle_stream_data(RedPeer::InMessage* message)
-{
- SpiceMsgDisplayStreamData* stream_data = (SpiceMsgDisplayStreamData*)message->data();
- VideoStream* stream;
-
- if (stream_data->base.id >= _streams.size() || !(stream = _streams[stream_data->base.id])) {
- THROW("invalid stream");
- }
-
- if (message->size() < sizeof(SpiceMsgDisplayStreamData) + stream_data->data_size) {
- THROW("access violation");
- }
-
- stream->push_data(stream_data->base.multi_media_time,
- stream_data->data_size,
- stream_data->data);
-}
-
-void DisplayChannel::handle_stream_clip(RedPeer::InMessage* message)
-{
- SpiceMsgDisplayStreamClip* clip_data = (SpiceMsgDisplayStreamClip*)message->data();
- VideoStream* stream;
- uint32_t num_clip_rects;
- SpiceRect* clip_rects;
-
- if (clip_data->id >= _streams.size() || !(stream = _streams[clip_data->id])) {
- THROW("invalid stream");
- }
-
- if (message->size() < sizeof(SpiceMsgDisplayStreamClip)) {
- THROW("access violation");
- }
- set_clip_rects(clip_data->clip, num_clip_rects, clip_rects);
- Lock lock(_streams_lock);
- stream->set_clip(clip_data->clip.type, num_clip_rects, clip_rects);
-}
-
-void DisplayChannel::handle_stream_destroy(RedPeer::InMessage* message)
-{
- SpiceMsgDisplayStreamDestroy* stream_destroy = (SpiceMsgDisplayStreamDestroy*)message->data();
-
- if (stream_destroy->id >= _streams.size() || !_streams[stream_destroy->id]) {
- THROW("invalid stream");
- }
- Lock lock(_streams_lock);
-
- VideoStream **active_stream = &_active_streams;
- for (;;) {
- if (!*active_stream) {
- THROW("not in active streams");
- }
-
- if (*active_stream == _streams[stream_destroy->id]) {
- *active_stream = _streams[stream_destroy->id]->next;
- break;
- }
- active_stream = &(*active_stream)->next;
- }
-
- delete _streams[stream_destroy->id];
- _streams[stream_destroy->id] = NULL;
-}
-
-void DisplayChannel::handle_stream_destroy_all(RedPeer::InMessage* message)
-{
- destroy_streams();
-}
-
-void DisplayChannel::create_primary_surface(int width, int height, uint32_t format)
-{
- bool do_create_primary = true;
-#ifdef USE_OPENGL
- Canvas *canvas;
-#endif
- _mark = false;
-
- /*
- * trying to avoid artifacts when the display hasn't changed much
- * between the disconnection from the migration src and the
- * connection to the target.
- */
- if (_mig_wait_primary) {
- ASSERT(_surfaces_cache.exist(0));
- if (_x_res != width || _y_res != height || format != format) {
- LOG_INFO("destroy the primary surface of the mig src session");
- destroy_primary_surface();
- } else {
- LOG_INFO("keep the primary surface of the mig src session");
- _surfaces_cache[0]->clear();
- clear_area();
- do_create_primary = false;
- }
- }
-
- if (do_create_primary) {
- LOG_INFO("");
- attach_to_screen(get_client().get_application(), get_id());
- clear_area();
- AutoRef<CreatePrimarySurfaceEvent> event(new CreatePrimarySurfaceEvent(*this, width, height,
- format));
- get_client().push_event(*event);
- (*event)->wait();
- if (!(*event)->success()) {
- THROW("Create primary surface failed");
- }
- }
-
- _mig_wait_primary = false;
-
- _x_res = width;
- _y_res = height;
- _format = format;
-
-#ifdef USE_OPENGL
- canvas = _surfaces_cache[0];
-
- if (canvas->get_pixmap_type() == CANVAS_TYPE_GL) {
- ((GCanvas *)(canvas))->touch_context();
- screen()->set_update_interrupt_trigger(&_interrupt_update);
- screen()->set_type_gl();
- }
-#endif
-}
-
-void DisplayChannel::create_surface(int surface_id, int width, int height, uint32_t format)
-{
- AutoRef<CreateSurfaceEvent> event(new CreateSurfaceEvent(*this, surface_id, width, height,
- format));
- get_client().push_event(*event);
- (*event)->wait();
- if (!(*event)->success()) {
- THROW("Create surface failed");
- }
-
-#ifdef USE_OPENGL
- Canvas *canvas;
-
- canvas = _surfaces_cache[surface_id];
-
- if (canvas->get_pixmap_type() == CANVAS_TYPE_GL) {
- ((GCanvas *)(canvas))->touch_context();
- }
-#endif
-}
-
-void DisplayChannel::destroy_primary_surface()
-{
- if (screen()) {
-#ifdef USE_OPENGL
- if (_surfaces_cache.exist(0)) {
- if (_surfaces_cache[0]->get_pixmap_type() == CANVAS_TYPE_GL) {
- screen()->unset_type_gl();
- screen()->untouch_context();
- }
- }
-#endif
-
- reset_screen();
- }
-
- AutoRef<DestroyPrimarySurfaceEvent> event(new DestroyPrimarySurfaceEvent(*this));
- get_client().push_event(*event);
- (*event)->wait();
- if (!(*event)->success()) {
- THROW("Destroying primary surface failed");
- }
-}
-
-void DisplayChannel::destroy_surface(int surface_id)
-{
- AutoRef<DestroySurfaceEvent> event(new DestroySurfaceEvent(*this, surface_id));
- get_client().push_event(*event);
- (*event)->wait();
- if (!(*event)->success()) {
- THROW("Destroying surface failed");
- }
-}
-
-void DisplayChannel::handle_surface_create(RedPeer::InMessage* message)
-{
- SpiceMsgSurfaceCreate* surface_create = (SpiceMsgSurfaceCreate*)message->data();
- if (surface_create->flags == SPICE_SURFACE_FLAGS_PRIMARY) {
- create_primary_surface(surface_create->width, surface_create->height,
- surface_create->format);
- } else {
- create_surface(surface_create->surface_id, surface_create->width, surface_create->height,
- surface_create->format);
- }
-}
-
-void DisplayChannel::handle_surface_destroy(RedPeer::InMessage* message)
-{
- SpiceMsgSurfaceDestroy* surface_destroy = (SpiceMsgSurfaceDestroy*)message->data();
- if (surface_destroy->surface_id == 0) { //fixme
- destroy_primary_surface();
- } else {
- destroy_surface(surface_destroy->surface_id);
- }
-}
-
-#define DRAW(type, can_diff) { \
- canvas->draw_##type(*type, message->size()); \
- if (type->base.surface_id == 0) { \
- invalidate(type->base.box, false); \
- } \
- if ((can_diff) && _check_diff) { \
- Canvas *swcanvas = _swsurfaces_cache[type->base.surface_id]; \
- swcanvas->draw_##type(*type, message->size()); \
- check_diff(swcanvas, canvas, type->base.box); \
- } \
-}
-
-#include "red_pixmap_sw.h"
-
-void check_diff(Canvas *a, Canvas *b, const SpiceRect& rect)
-{
- QRegion region;
- RedPixmapSw *ap = new RedPixmapSw(rect.right, rect.bottom, RedDrawable::RGB32, true, 0);
- RedPixmapSw *bp = new RedPixmapSw(rect.right, rect.bottom, RedDrawable::RGB32, true, 0);
-
- region_init(&region);
- region_add(&region, &rect);
- a->copy_pixels(region, *ap);
- b->copy_pixels(region, *bp);
- ap->equal(*bp, rect);
-
- delete ap;
- delete bp;
-}
-
-void DisplayChannel::handle_copy_bits(RedPeer::InMessage* message)
-{
- Canvas *canvas;
- SpiceMsgDisplayCopyBits* copy_bits = (SpiceMsgDisplayCopyBits*)message->data();
- canvas = _surfaces_cache[copy_bits->base.surface_id];
- Canvas *swcanvas = _swsurfaces_cache[copy_bits->base.surface_id];
-
- canvas->copy_bits(*copy_bits, message->size());
- if (copy_bits->base.surface_id == 0) {
- invalidate(copy_bits->base.box, false);
- }
-
- if (_check_diff) {
- swcanvas->copy_bits(*copy_bits, message->size());
- check_diff(swcanvas, canvas, copy_bits->base.box);
- }
-}
-
-void DisplayChannel::handle_draw_fill(RedPeer::InMessage* message)
-{
- Canvas *canvas;
- SpiceMsgDisplayDrawFill* fill = (SpiceMsgDisplayDrawFill*)message->data();
- canvas = _surfaces_cache[fill->base.surface_id];
- DRAW(fill, FALSE);
-}
-
-void DisplayChannel::handle_draw_opaque(RedPeer::InMessage* message)
-{
- Canvas *canvas;
- SpiceMsgDisplayDrawOpaque* opaque = (SpiceMsgDisplayDrawOpaque*)message->data();
- canvas = _surfaces_cache[opaque->base.surface_id];
- DRAW(opaque, TRUE);
-}
-
-void DisplayChannel::handle_draw_copy(RedPeer::InMessage* message)
-{
- Canvas *canvas;
- SpiceMsgDisplayDrawCopy* copy = (SpiceMsgDisplayDrawCopy*)message->data();
- canvas = _surfaces_cache[copy->base.surface_id];
- DRAW(copy, TRUE);
-}
-
-void DisplayChannel::handle_draw_blend(RedPeer::InMessage* message)
-{
- Canvas *canvas;
- SpiceMsgDisplayDrawBlend* blend = (SpiceMsgDisplayDrawBlend*)message->data();
- canvas = _surfaces_cache[blend->base.surface_id];
- DRAW(blend, TRUE);
-}
-
-void DisplayChannel::handle_draw_blackness(RedPeer::InMessage* message)
-{
- Canvas *canvas;
- SpiceMsgDisplayDrawBlackness* blackness = (SpiceMsgDisplayDrawBlackness*)message->data();
- canvas = _surfaces_cache[blackness->base.surface_id];
- DRAW(blackness, TRUE);
-}
-
-void DisplayChannel::handle_draw_whiteness(RedPeer::InMessage* message)
-{
- Canvas *canvas;
- SpiceMsgDisplayDrawWhiteness* whiteness = (SpiceMsgDisplayDrawWhiteness*)message->data();
- canvas = _surfaces_cache[whiteness->base.surface_id];
- DRAW(whiteness, TRUE);
-}
-
-void DisplayChannel::handle_draw_invers(RedPeer::InMessage* message)
-{
- Canvas *canvas;
- SpiceMsgDisplayDrawInvers* invers = (SpiceMsgDisplayDrawInvers*)message->data();
- canvas = _surfaces_cache[invers->base.surface_id];
- DRAW(invers, TRUE);
-}
-
-void DisplayChannel::handle_draw_rop3(RedPeer::InMessage* message)
-{
- Canvas *canvas;
- SpiceMsgDisplayDrawRop3* rop3 = (SpiceMsgDisplayDrawRop3*)message->data();
- canvas = _surfaces_cache[rop3->base.surface_id];
- DRAW(rop3, TRUE);
-}
-
-void DisplayChannel::handle_draw_stroke(RedPeer::InMessage* message)
-{
- Canvas *canvas;
- SpiceMsgDisplayDrawStroke* stroke = (SpiceMsgDisplayDrawStroke*)message->data();
- canvas = _surfaces_cache[stroke->base.surface_id];
- DRAW(stroke, TRUE);
-}
-
-void DisplayChannel::handle_draw_text(RedPeer::InMessage* message)
-{
- Canvas *canvas;
- SpiceMsgDisplayDrawText* text = (SpiceMsgDisplayDrawText*)message->data();
- canvas = _surfaces_cache[text->base.surface_id];
- DRAW(text, FALSE);
-}
-
-void DisplayChannel::handle_draw_transparent(RedPeer::InMessage* message)
-{
- Canvas *canvas;
- SpiceMsgDisplayDrawTransparent* transparent = (SpiceMsgDisplayDrawTransparent*)message->data();
- canvas = _surfaces_cache[transparent->base.surface_id];
- DRAW(transparent, TRUE);
-}
-
-void DisplayChannel::handle_draw_alpha_blend(RedPeer::InMessage* message)
-{
- Canvas *canvas;
- SpiceMsgDisplayDrawAlphaBlend* alpha_blend = (SpiceMsgDisplayDrawAlphaBlend*)message->data();
- canvas = _surfaces_cache[alpha_blend->base.surface_id];
- DRAW(alpha_blend, FALSE);
-}
-
-void DisplayChannel::handle_draw_composite(RedPeer::InMessage* message)
-{
- Canvas *canvas;
- SpiceMsgDisplayDrawComposite* composite = (SpiceMsgDisplayDrawComposite*)message->data();
- canvas = _surfaces_cache[composite->base.surface_id];
- DRAW(composite, TRUE);
-}
-
-void DisplayChannel::streams_time()
-{
- _next_timer_time = 0;
- Lock lock(_streams_lock);
- uint32_t mm_time = get_client().get_mm_time();
- uint32_t next_time = 0;
- VideoStream* stream = _active_streams;
- while (stream) {
- uint32_t next_frame_time;
- if ((next_frame_time = stream->handle_timer_update(mm_time))) {
- if (!next_time || int(next_frame_time - next_time) < 0) {
- next_time = next_frame_time;
- }
- }
- stream = stream->next;
- }
- Lock timer_lock(_timer_lock);
- mm_time = get_client().get_mm_time();
- next_time = mm_time + 15;
- if (next_time && (!_next_timer_time || int(next_time - _next_timer_time) < 0)) {
- get_client().activate_interval_timer(*_streams_timer, MAX(int(next_time - mm_time), 0));
- _next_timer_time = next_time;
- } else if (!_next_timer_time) {
- get_client().deactivate_interval_timer(*_streams_timer);
- }
- timer_lock.unlock();
- lock.unlock();
- Platform::yield();
-}
-
-void DisplayChannel::activate_streams_timer()
-{
- uint32_t next_time = _next_timer_time;
- if (!next_time) {
- return;
- }
-
- int delta = next_time - get_client().get_mm_time();
- if (delta <= 0) {
- streams_time();
- } else {
- Lock timer_lock(_timer_lock);
- if (!_next_timer_time) {
- return;
- }
- delta = _next_timer_time - get_client().get_mm_time();
- get_client().activate_interval_timer(*_streams_timer, delta);
- }
-}
-
-void DisplayChannel::stream_update_request(uint32_t mm_time)
-{
- Lock lock(_timer_lock);
- if (_next_timer_time && int(mm_time - _next_timer_time) > 0) {
- return;
- }
- _next_timer_time = mm_time;
- lock.unlock();
- AutoRef<ActivateTimerEvent> event(new ActivateTimerEvent(*this));
- get_client().push_event(*event);
-}
-
-void DisplayChannel::on_update_completion(uint64_t mark)
-{
-#ifndef RED64
- Lock lock(_mark_lock);
-#endif
- _update_mark = mark;
-#ifndef RED64
- lock.unlock();
-#endif
- _streams_trigger.trigger();
-}
-
-void DisplayChannel::on_streams_trigger()
-{
-#ifndef RED64
- Lock lock(_mark_lock);
-#endif
- uint64_t update_mark = _update_mark;
-#ifndef RED64
- lock.unlock();
-#endif
- VideoStream* stream = _active_streams;
- while (stream) {
- stream->handle_update_mark(update_mark);
- stream = stream->next;
- }
-}
-
-class DisplayFactory: public ChannelFactory {
-public:
- DisplayFactory() : ChannelFactory(SPICE_CHANNEL_DISPLAY) {}
- virtual RedChannel* construct(RedClient& client, uint32_t id)
- {
- return new DisplayChannel(client, id,
- client.get_pixmap_cache(), client.get_glz_window());
- }
-};
-
-static DisplayFactory factory;
-
-ChannelFactory& DisplayChannel::Factory()
-{
- return factory;
-}
diff --git a/client/display_channel.h b/client/display_channel.h
deleted file mode 100644
index 8a302896..00000000
--- a/client/display_channel.h
+++ /dev/null
@@ -1,247 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_DISPLAY_CHANNEL
-#define _H_DISPLAY_CHANNEL
-
-#include "common/region.h"
-
-#include "common.h"
-#include "canvas.h"
-#include "red_channel.h"
-#include "cache.hpp"
-#include "screen_layer.h"
-#include "process_loop.h"
-#ifdef USE_OPENGL
-#include "red_pixmap_gl.h"
-#endif
-#include "glz_decoder_window.h"
-
-class RedScreen;
-class ChannelFactory;
-class VideoStream;
-class DisplayChannel;
-class CursorData;
-class InputsChannel;
-
-class StreamsTrigger: public EventSources::Trigger {
-public:
- StreamsTrigger(DisplayChannel& channel);
-
- virtual void on_event();
-
-private:
- DisplayChannel& _channel;
-};
-
-#ifdef USE_OPENGL
-class GLInterruptRecreate: public EventSources::Trigger {
-public:
- GLInterruptRecreate(DisplayChannel& channel);
- virtual void trigger();
- virtual void on_event();
-
-private:
- DisplayChannel& _channel;
- Mutex _lock;
- Condition _cond;
-};
-#endif
-
-class InterruptUpdate: public EventSources::Trigger {
-public:
- InterruptUpdate(DisplayChannel& channel);
-
- virtual void on_event();
-
-private:
- DisplayChannel& _channel;
-};
-
-class StreamsTimer: public Timer {
-public:
- StreamsTimer(DisplayChannel& channel);
- virtual void response(AbstractProcessLoop& events_loop);
-private:
- DisplayChannel& _channel;
-};
-
-class DisplayChannel: public RedChannel, public ScreenLayer {
-public:
- DisplayChannel(RedClient& client, uint32_t id,
- PixmapCache& pixmap_cache, GlzDecoderWindow& glz_window);
- virtual ~DisplayChannel();
-
- virtual void copy_pixels(const QRegion& dest_region, RedDrawable& dest_dc);
- virtual void copy_pixels(const QRegion& dest_region, const PixmapHeader &dest);
-#ifdef USE_OPENGL
- virtual void recreate_ogl_context();
- virtual void recreate_ogl_context_interrupt();
- virtual void pre_migrate();
- virtual void post_migrate();
-#endif
- virtual void update_interrupt();
- void set_cursor(CursorData* cursor);
- void hide_cursor();
- void set_capture_mode(bool on);
-
- virtual bool pointer_test(int x, int y);
- virtual void on_pointer_enter(int x, int y, unsigned int buttons_state);
- virtual void on_pointer_motion(int x, int y, unsigned int buttons_state);
- virtual void on_pointer_leave();
- virtual void on_mouse_button_press(int button, int buttons_state);
- virtual void on_mouse_button_release(int button, int buttons_state);
-
- void attach_inputs(InputsChannel* inputs_channel);
- void detach_inputs();
-
- static ChannelFactory& Factory();
-
-protected:
- virtual void on_connect();
- virtual void on_disconnect();
- virtual void on_disconnect_mig_src();
-
-private:
- void set_draw_handlers();
- void clear_draw_handlers();
- bool create_sw_canvas(int surface_id, int width, int height, uint32_t format);
-#ifdef USE_OPENGL
- bool create_ogl_canvas(int surface_id, int width, int height, uint32_t format, bool recreate,
- RenderType rendertype);
-#endif
-#ifdef WIN32
- bool create_gdi_canvas(int surface_id, int width, int height, uint32_t format);
-#endif
- void destroy_canvas(int surface_id);
- void create_canvas(int surface_id, const std::vector<int>& canvas_type, int width, int height,
- uint32_t format);
- void destroy_streams();
- void update_cursor();
-
- void create_primary_surface(int width, int height, uint32_t format);
- void create_surface(int surface_id, int width, int height, uint32_t format);
- void destroy_primary_surface();
- void destroy_surface(int surface_id);
- void destroy_all_surfaces();
- void do_destroy_all_surfaces();
- void destroy_off_screen_surfaces();
- void do_destroy_off_screen_surfaces();
-
- void handle_mode(RedPeer::InMessage* message);
- void handle_mark(RedPeer::InMessage* message);
- void handle_reset(RedPeer::InMessage* message);
-
- void handle_inval_list(RedPeer::InMessage* message);
- void handle_inval_all_pixmaps(RedPeer::InMessage* message);
- void handle_inval_palette(RedPeer::InMessage* message);
- void handle_inval_all_palettes(RedPeer::InMessage* message);
- void handle_copy_bits(RedPeer::InMessage* message);
- void handle_stream_create(RedPeer::InMessage* message);
- void handle_stream_data(RedPeer::InMessage* message);
- void handle_stream_clip(RedPeer::InMessage* message);
- void handle_stream_destroy(RedPeer::InMessage* message);
- void handle_stream_destroy_all(RedPeer::InMessage* message);
-
- void handle_surface_create(RedPeer::InMessage* message);
- void handle_surface_destroy(RedPeer::InMessage* message);
-
- void handle_draw_fill(RedPeer::InMessage* message);
- void handle_draw_opaque(RedPeer::InMessage* message);
- void handle_draw_copy(RedPeer::InMessage* message);
- void handle_draw_blend(RedPeer::InMessage* message);
- void handle_draw_blackness(RedPeer::InMessage* message);
- void handle_draw_whiteness(RedPeer::InMessage* message);
- void handle_draw_invers(RedPeer::InMessage* message);
- void handle_draw_rop3(RedPeer::InMessage* message);
- void handle_draw_stroke(RedPeer::InMessage* message);
- void handle_draw_text(RedPeer::InMessage* message);
- void handle_draw_transparent(RedPeer::InMessage* message);
- void handle_draw_alpha_blend(RedPeer::InMessage* message);
- void handle_draw_composite(RedPeer::InMessage* message);
-
- void on_streams_trigger();
- virtual void on_update_completion(uint64_t mark);
- void streams_time();
- void activate_streams_timer();
- void stream_update_request(uint32_t update_time);
- void reset_screen();
- void clear(bool destroy_primary = true);
-
- static void set_clip_rects(const SpiceClip& clip, uint32_t& num_clip_rects, SpiceRect*& clip_rects);
-
-private:
- SurfacesCache _surfaces_cache;
- SurfacesCache _swsurfaces_cache;
- PixmapCache& _pixmap_cache;
- PaletteCache _palette_cache;
- GlzDecoderWindow& _glz_window;
- bool _mark;
- int _x_res;
- int _y_res;
- uint32_t _format;
-#ifdef USE_OPENGL
- RenderType _rendertype;
-#endif
-
-#ifndef RED64
- Mutex _mark_lock;
-#endif
- uint64_t _update_mark;
- Mutex _streams_lock;
-
- Mutex _timer_lock;
- AutoRef<StreamsTimer> _streams_timer;
- uint32_t _next_timer_time;
-
- AutoRef<CursorData> _cursor;
- bool _cursor_visibal;
- bool _active_pointer;
- bool _capture_mouse_mode;
- InputsChannel* _inputs_channel;
-
- SpicePoint _pointer_pos;
- int _buttons_state;
-
- std::vector<VideoStream*> _streams;
- VideoStream* _active_streams;
- StreamsTrigger _streams_trigger;
-#ifdef USE_OPENGL
- GLInterruptRecreate _gl_interrupt_recreate;
-#endif
- InterruptUpdate _interrupt_update;
-
- bool _mig_wait_primary;
- bool _check_diff;
- friend class SetModeEvent;
- friend class CreatePrimarySurfaceEvent;
- friend class DestroyPrimarySurfaceEvent;
- friend class CreateSurfaceEvent;
- friend class DestroySurfaceEvent;
- friend class DestroyAllSurfacesEvent;
- friend class ActivateTimerEvent;
- friend class VideoStream;
- friend class StreamsTrigger;
- friend class GLInterupt;
- friend class StreamsTimer;
- friend class AttachChannelsEvent;
- friend class DetachChannelsEvent;
- friend class MigPrimarySurfaceTimer;
-};
-
-#endif
diff --git a/client/event_sources.h b/client/event_sources.h
deleted file mode 100644
index 0db8ce6f..00000000
--- a/client/event_sources.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_EVENT_SOURCES
-#define _H_EVENT_SOURCES
-
-#include "common.h"
-#include "event_sources_p.h"
-
-class EventSource;
-
-// TODO: the class is not thread safe
-class EventSources: public EventSources_p {
-public:
- class Trigger;
- class Socket;
- class File;
- class Handle;
-
- EventSources();
- virtual ~EventSources();
-
- void add_trigger(Trigger& trigger);
- void remove_trigger(Trigger& trigger);
- void add_socket(Socket& socket);
- void remove_socket(Socket& socket);
- void add_file(File& file);
- void remove_file(File& file);
- void add_handle(Handle& handle);
- void remove_handle(Handle& handle);
-
- /* return true if the events loop should quit */
- bool wait_events(int timeout_ms = INFINITE);
-};
-
-class EventSource {
-public:
- virtual ~EventSource() {}
- virtual void on_event() = 0;
-
-private:
- virtual void action() {on_event();}
-
- friend class EventSources;
-};
-
-class EventSources::Trigger: public EventSource, private Trigger_p {
-public:
- Trigger();
- virtual ~Trigger();
- virtual void trigger();
- virtual void reset();
-
-private:
- virtual void action();
-
- friend class EventSources;
-};
-
-class EventSources::Socket: public EventSource {
-protected:
- virtual int get_socket() = 0;
-
- friend class EventSources;
-};
-
-
-class EventSources::File: public EventSource {
-protected:
- virtual int get_fd() = 0;
-
- friend class EventSources;
-};
-
-class EventSources::Handle: public EventSource, public Handle_p {
-
- friend class EventSources;
-};
-
-#endif
diff --git a/client/foreign_menu.cpp b/client/foreign_menu.cpp
deleted file mode 100644
index 70b6dc23..00000000
--- a/client/foreign_menu.cpp
+++ /dev/null
@@ -1,376 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-#include "foreign_menu.h"
-#include <spice/foreign_menu_prot.h>
-#include "menu.h"
-#include "utils.h"
-#include "debug.h"
-#include "platform.h"
-
-#define PIPE_NAME_MAX_LEN 50
-
-#ifdef WIN32
-#define PIPE_NAME "SpiceForeignMenu-%lu"
-#elif defined(__i386__) || __SIZEOF_LONG__ == 4
-#define PIPE_NAME "/tmp/SpiceForeignMenu-%llu.uds"
-#else
-#define PIPE_NAME "/tmp/SpiceForeignMenu-%lu.uds"
-#endif
-
-ForeignMenu::ForeignMenu(ForeignMenuInterface *handler, bool active)
- : _handler (handler)
- , _active (active)
- , _refs (1)
-{
- char pipe_name[PIPE_NAME_MAX_LEN];
-
- ASSERT(_handler != NULL);
-#ifndef WIN32
- const char *p_socket = getenv("SPICE_FOREIGN_MENU_SOCKET");
- if (p_socket) {
- LOG_INFO("Creating a foreign menu connection %s", p_socket);
- _foreign_menu = NamedPipe::create(p_socket, *this);
- } else
-#endif
- {
- snprintf(pipe_name, PIPE_NAME_MAX_LEN, PIPE_NAME, Platform::get_process_id());
- LOG_INFO("Creating a foreign menu connection %s", pipe_name);
- _foreign_menu = NamedPipe::create(pipe_name, *this);
- }
- if (!_foreign_menu) {
- LOG_ERROR("Failed to create a foreign menu connection");
- }
-}
-
-ForeignMenu::~ForeignMenu()
-{
- std::map<NamedPipe::ConnectionRef, ForeignMenuConnection*>::const_iterator conn;
- for (conn = _connections.begin(); conn != _connections.end(); ++conn) {
- conn->second->reset_handler();
- delete conn->second;
- }
- if (_foreign_menu) {
- NamedPipe::destroy(_foreign_menu);
- }
-}
-
-NamedPipe::ConnectionInterface& ForeignMenu::create()
-{
- ForeignMenuConnection *conn = new ForeignMenuConnection(_handler, *this);
-
- if (conn == NULL) {
- throw Exception("Error allocating a new foreign menu connection");
- }
- return *conn;
-}
-
-void ForeignMenu::add_connection(NamedPipe::ConnectionRef conn_ref, ForeignMenuConnection *conn)
-{
- _connections[conn_ref] = conn;
- if (_active) {
- send_active_state(conn, FOREIGN_MENU_APP_ACTIVATED);
- }
- conn->on_data();
-}
-
-void ForeignMenu::remove_connection(NamedPipe::ConnectionRef conn_ref)
-{
- ForeignMenuConnection *conn = _connections[conn_ref];
- _connections.erase(conn_ref);
- delete conn;
-}
-
-void ForeignMenu::add_sub_menus()
-{
- std::map<NamedPipe::ConnectionRef, ForeignMenuConnection*>::const_iterator conn;
- for (conn = _connections.begin(); conn != _connections.end(); ++conn) {
- conn->second->add_sub_menu();
- }
-}
-
-void ForeignMenu::on_command(NamedPipe::ConnectionRef conn_ref, int32_t id)
-{
- ForeignMenuConnection *conn = _connections[conn_ref];
- FrgMenuEvent msg;
-
- ASSERT(conn);
- msg.base.id = FOREIGN_MENU_ITEM_EVENT;
- msg.base.size = sizeof(FrgMenuEvent);
- msg.id = id;
- msg.action = FOREIGN_MENU_EVENT_CLICK;
- conn->write_msg(&msg.base, msg.base.size);
-}
-
-void ForeignMenu::on_activate()
-{
- std::map<NamedPipe::ConnectionRef, ForeignMenuConnection*>::const_iterator conn;
- _active = true;
- for (conn = _connections.begin(); conn != _connections.end(); ++conn) {
- send_active_state(conn->second, FOREIGN_MENU_APP_ACTIVATED);
- }
-}
-
-void ForeignMenu::on_deactivate()
-{
- std::map<NamedPipe::ConnectionRef, ForeignMenuConnection*>::const_iterator conn;
- _active = false;
- for (conn = _connections.begin(); conn != _connections.end(); ++conn) {
- send_active_state(conn->second, FOREIGN_MENU_APP_DEACTIVATED);
- }
-}
-
-void ForeignMenu::send_active_state(ForeignMenuConnection *conn, int32_t cmd)
-{
- FrgMenuMsg msg;
-
- ASSERT(conn != NULL);
- msg.id = cmd;
- msg.size = sizeof(FrgMenuMsg);
- conn->write_msg(&msg, msg.size);
-}
-
-ForeignMenuConnection::ForeignMenuConnection(ForeignMenuInterface *handler, ForeignMenu& parent)
- : _handler (handler)
- , _parent (parent)
- , _sub_menu (NULL)
- , _initialized (false)
- , _write_pending (0)
- , _write_pos (_write_buf)
- , _read_pos (_read_buf)
-{
-}
-
-ForeignMenuConnection::~ForeignMenuConnection()
-{
- if (_opaque != NamedPipe::INVALID_CONNECTION) {
- NamedPipe::destroy_connection(_opaque);
- }
- if (_handler) {
- AutoRef<Menu> app_menu(_handler->get_app_menu());
- (*app_menu)->remove_sub(_sub_menu);
- _handler->update_menu();
- _handler->clear_menu_items(_opaque);
- }
- if (_sub_menu) {
- _sub_menu->unref();
- }
-}
-
-void ForeignMenuConnection::bind(NamedPipe::ConnectionRef conn_ref)
-{
- _opaque = conn_ref;
- _parent.add_connection(conn_ref, this);
-}
-
-void ForeignMenuConnection::on_data()
-{
- if (_write_pending) {
- LOG_INFO("Resume pending write %d", _write_pending);
- if (!write_msg(_write_pos, _write_pending)) {
- return;
- }
- }
- while (read_msgs());
-}
-
-bool ForeignMenuConnection::read_msgs()
-{
- uint8_t *pos = _read_buf;
- size_t nread = _read_pos - _read_buf;
- int32_t size;
-
- ASSERT(_handler);
- ASSERT(_opaque != NamedPipe::INVALID_CONNECTION);
- size = NamedPipe::read(_opaque, (uint8_t*)_read_pos, sizeof(_read_buf) - nread);
- if (size == 0) {
- return false;
- } else if (size < 0) {
- LOG_ERROR("Error reading from named pipe %d", size);
- _parent.remove_connection(_opaque);
- return false;
- }
- nread += size;
- while (nread > 0) {
- if (!_initialized && nread >= sizeof(FrgMenuInitHeader)) {
- FrgMenuInitHeader *init = (FrgMenuInitHeader *)pos;
- if (init->magic != FOREIGN_MENU_MAGIC || init->version != FOREIGN_MENU_VERSION) {
- LOG_ERROR("Bad foreign menu init, magic=0x%x version=%u", init->magic,
- init->version);
- _parent.remove_connection(_opaque);
- return false;
- }
- if (nread < init->size) {
- break;
- }
- if (!handle_init((FrgMenuInit*)init)) {
- _parent.remove_connection(_opaque);
- return false;
- }
- nread -= init->size;
- pos += init->size;
- _initialized = true;
- }
- if (!_initialized || nread < sizeof(FrgMenuMsg)) {
- break;
- }
- FrgMenuMsg *hdr = (FrgMenuMsg *)pos;
- if (hdr->size < sizeof(FrgMenuMsg)) {
- LOG_ERROR("Bad foreign menu message, size=%u", hdr->size);
- _parent.remove_connection(_opaque);
- return false;
- }
- if (nread < hdr->size) {
- break;
- }
- handle_message(hdr);
- nread -= hdr->size;
- pos += hdr->size;
- }
- if (nread > 0 && pos != _read_buf) {
- memmove(_read_buf, pos, nread);
- }
- _read_pos = _read_buf + nread;
- return true;
-}
-
-bool ForeignMenuConnection::write_msg(const void *buf, int len)
-{
- RecurciveLock lock(_write_lock);
- uint8_t *pos;
- int32_t written = 0;
-
- ASSERT(_opaque != NamedPipe::INVALID_CONNECTION);
- if (_write_pending && buf != _write_pos) {
- if ((_write_pos + _write_pending + len > _write_buf + sizeof(_write_buf)) &&
- !write_msg(_write_pos, _write_pending)) {
- return false;
- }
- if (_write_pending) {
- if (_write_pos + _write_pending + len > _write_buf + sizeof(_write_buf)) {
- DBG(0, "Dropping message, due to insufficient space in write buffer");
- return true;
- }
- memcpy(_write_pos + _write_pending, buf, len);
- _write_pending += len;
- }
- }
- pos = (uint8_t*)buf;
- while (len && (written = NamedPipe::write(_opaque, pos, len)) > 0) {
- pos += written;
- len -= written;
- }
- if (len && written == 0) {
- if (_write_pending) {
- _write_pos = pos;
- } else {
- _write_pos = _write_buf;
- memcpy(_write_buf, pos, len);
- }
- _write_pending = len;
- } else if (written < 0) {
- LOG_ERROR("Error writing to named pipe %d", written);
- _parent.remove_connection(_opaque);
- return false;
- } else {
- _write_pending = 0;
- }
- return true;
-}
-
-bool ForeignMenuConnection::handle_init(FrgMenuInit *init)
-{
- std::string title = "Untitled";
-
- ASSERT(_handler);
- if (_sub_menu) {
- LOG_ERROR("Foreign menu already initialized");
- return false;
- }
- if (init->credentials != 0) {
- LOG_ERROR("Foreign menu has wrong credentials 0x%x", init->credentials);
- return false;
- }
- if (init->base.size > offsetof(FrgMenuInit, title)) {
- ((char*)init)[init->base.size - 1] = '\0';
- title = (char*)init->title;
- }
- _sub_menu = new Menu((CommandTarget&)*_handler, title);
- add_sub_menu();
- _handler->update_menu();
- return true;
-}
-
-void ForeignMenuConnection::add_sub_menu()
-{
- if (_sub_menu) {
- AutoRef<Menu> app_menu(_handler->get_app_menu());
- (*app_menu)->add_sub(_sub_menu);
- }
-}
-
-bool ForeignMenuConnection::handle_message(FrgMenuMsg *hdr)
-{
- ASSERT(_sub_menu);
- ASSERT(_handler);
- switch (hdr->id) {
- case FOREIGN_MENU_SET_TITLE:
- ((char*)hdr)[hdr->size - 1] = '\0';
- _sub_menu->set_name((char*)((FrgMenuSetTitle*)hdr)->string);
- break;
- case FOREIGN_MENU_ADD_ITEM: {
- FrgMenuAddItem *msg = (FrgMenuAddItem*)hdr;
- ((char*)hdr)[hdr->size - 1] = '\0';
- int id = _handler->get_foreign_menu_item_id(_opaque, msg->id);
- _sub_menu->add_command((char*)msg->string, id, get_item_state(msg->type));
- break;
- }
- case FOREIGN_MENU_REMOVE_ITEM: {
- int id = _handler->get_foreign_menu_item_id(_opaque, ((FrgMenuRmItem*)hdr)->id);
- _sub_menu->remove_command(id);
- _handler->remove_menu_item(id);
- break;
- }
- case FOREIGN_MENU_CLEAR:
- _sub_menu->clear();
- _handler->clear_menu_items(_opaque);
- break;
- case FOREIGN_MENU_MODIFY_ITEM:
- default:
- LOG_ERROR("Ignoring an unknown foreign menu identifier %u", hdr->id);
- return false;
- }
- _handler->update_menu();
- return true;
-}
-
-int ForeignMenuConnection::get_item_state(int item_type)
-{
- int state = 0;
-
- if (item_type & FOREIGN_MENU_ITEM_TYPE_CHECKED) {
- state |= Menu::MENU_ITEM_STATE_CHECKED;
- }
- if (item_type & FOREIGN_MENU_ITEM_TYPE_DIM) {
- state |= Menu::MENU_ITEM_STATE_DIM;
- }
- return state;
-}
diff --git a/client/foreign_menu.h b/client/foreign_menu.h
deleted file mode 100644
index 6138087a..00000000
--- a/client/foreign_menu.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_FOREIGN_MENU
-#define _H_FOREIGN_MENU
-
-#include "named_pipe.h"
-#include "menu.h"
-
-class ForeignMenuConnection;
-struct FrgMenuInit;
-struct FrgMenuMsg;
-
-class ForeignMenuInterface : public CommandTarget {
-public:
- virtual ~ForeignMenuInterface() {}
-
- virtual int get_foreign_menu_item_id(int32_t opaque_conn_ref, uint32_t msg_id) = 0;
- virtual void clear_menu_items(int32_t opaque_conn_ref) = 0;
- virtual void remove_menu_item(int item_id) = 0;
- virtual Menu* get_app_menu() = 0;
- virtual void update_menu() = 0;
-};
-
-class ForeignMenu : public NamedPipe::ListenerInterface {
-public:
- ForeignMenu(ForeignMenuInterface *handler, bool active = false);
- virtual ~ForeignMenu();
-
- ForeignMenu* ref() { _refs++; return this;}
- void unref() { if (!--_refs) delete this;}
-
- virtual NamedPipe::ConnectionInterface &create();
- void add_connection(NamedPipe::ConnectionRef conn_ref, ForeignMenuConnection *conn);
- void remove_connection(NamedPipe::ConnectionRef conn_ref);
- void add_sub_menus();
- void on_command(NamedPipe::ConnectionRef conn_ref, int32_t id);
- void on_activate();
- void on_deactivate();
-
-private:
- void send_active_state(ForeignMenuConnection *conn, int32_t cmd);
-
-private:
- ForeignMenuInterface *_handler;
- std::map<NamedPipe::ConnectionRef, ForeignMenuConnection*> _connections;
- NamedPipe::ListenerRef _foreign_menu;
- bool _active;
- int _refs;
-};
-
-#define FOREIGN_MENU_BUF_SIZE 4096
-
-class ForeignMenuConnection : public NamedPipe::ConnectionInterface {
-public:
- ForeignMenuConnection(ForeignMenuInterface *handler, ForeignMenu& parent);
- virtual ~ForeignMenuConnection();
-
- virtual void bind(NamedPipe::ConnectionRef conn_ref);
- virtual void on_data();
- bool write_msg(const void *buf, int len);
- void reset_handler() { _handler = NULL;}
- void add_sub_menu();
-
-private:
- bool read_msgs();
- bool handle_init(FrgMenuInit *init);
- bool handle_message(FrgMenuMsg *hdr);
- int get_item_state(int item_type);
-
-private:
- ForeignMenuInterface *_handler;
- ForeignMenu& _parent;
- Menu* _sub_menu;
- bool _initialized;
- int _write_pending;
- uint8_t *_write_pos;
- uint8_t *_read_pos;
- uint8_t _write_buf[FOREIGN_MENU_BUF_SIZE];
- uint8_t _read_buf[FOREIGN_MENU_BUF_SIZE];
- RecurciveMutex _write_lock;
-};
-
-#endif
diff --git a/client/glz_decode_tmpl.c b/client/glz_decode_tmpl.c
deleted file mode 100644
index ad78cd71..00000000
--- a/client/glz_decode_tmpl.c
+++ /dev/null
@@ -1,337 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-// External defines: PLT, RGBX/PLTXX/ALPHA, TO_RGB32.
-// If PLT4/1 and TO_RGB32 are defined, we need CAST_PLT_DISTANCE (
-// because then the number of pixels differ from the units used in the compression)
-
-/*
- For each output pixel type the following macros are defined:
- OUT_PIXEL - the output pixel type
- COPY_PIXEL(p, out) - assigns the pixel to the place pointed by out and
- increases out. Used in RLE.
- Need special handling because in alpha we copy only
- the pad byte.
- COPY_REF_PIXEL(ref, out) - copies the pixel pointed by ref to the pixel pointed by out.
- Increases ref and out.
- COPY_COMP_PIXEL(encoder, out) - copies pixel from the compressed buffer to the decompressed
- buffer. Increases out.
-*/
-
-#if !defined(LZ_RGB_ALPHA)
-#define COPY_PIXEL(p, out) (*(out++) = p)
-#define COPY_REF_PIXEL(ref, out) (*(out++) = *(ref++))
-#endif
-
-// decompressing plt to plt
-#ifdef LZ_PLT
-#ifndef TO_RGB32
-#define OUT_PIXEL one_byte_pixel_t
-#define FNAME(name) glz_plt_##name
-#define COPY_COMP_PIXEL(in, out) {(out)->a = *(in++); out++;}
-#else // TO_RGB32
-#define OUT_PIXEL rgb32_pixel_t
-#define COPY_PLT_ENTRY(ent, out) {\
- (out)->b = ent; (out)->g = (ent >> 8); (out)->r = (ent >> 16); (out)->pad = 0;}
-#ifdef PLT8
-#define FNAME(name) glz_plt8_to_rgb32_##name
-#define COPY_COMP_PIXEL(in, out, palette) { \
- uint32_t rgb = palette->ents[*(in++)]; \
- COPY_PLT_ENTRY(rgb, out); \
- out++; \
-}
-#elif defined(PLT4_BE)
-#define FNAME(name) glz_plt4_be_to_rgb32_##name
-#define COPY_COMP_PIXEL(in, out, palette){ \
- uint8_t byte = *(in++); \
- uint32_t rgb = palette->ents[((byte >> 4) & 0x0f) % (palette->num_ents)]; \
- COPY_PLT_ENTRY(rgb, out); \
- out++; \
- rgb = palette->ents[(byte & 0x0f) % (palette->num_ents)]; \
- COPY_PLT_ENTRY(rgb, out); \
- out++; \
-}
-#define CAST_PLT_DISTANCE(dist) (dist*2)
-#elif defined(PLT4_LE)
-#define FNAME(name) glz_plt4_le_to_rgb32_##name
-#define COPY_COMP_PIXEL(in, out, palette){ \
- uint8_t byte = *(in++); \
- uint32_t rgb = palette->ents[(byte & 0x0f) % (palette->num_ents)]; \
- COPY_PLT_ENTRY(rgb, out); \
- out++; \
- rgb = palette->ents[((byte >> 4) & 0x0f) % (palette->num_ents)]; \
- COPY_PLT_ENTRY(rgb, out); \
- out++; \
-}
-#define CAST_PLT_DISTANCE(dist) (dist*2)
-#elif defined(PLT1_BE) // TODO store palette entries for direct access
-#define FNAME(name) glz_plt1_be_to_rgb32_##name
-#define COPY_COMP_PIXEL(in, out, palette){ \
- uint8_t byte = *(in++); \
- int i; \
- uint32_t fore = palette->ents[1]; \
- uint32_t back = palette->ents[0]; \
- for (i = 7; i >= 0; i--) \
- { \
- if ((byte >> i) & 1) { \
- COPY_PLT_ENTRY(fore, out); \
- } else { \
- COPY_PLT_ENTRY(back, out); \
- } \
- out++; \
- } \
-}
-#define CAST_PLT_DISTANCE(dist) (dist*8)
-#elif defined(PLT1_LE)
-#define FNAME(name) glz_plt1_le_to_rgb32_##name
-#define COPY_COMP_PIXEL(in, out, palette){ \
- uint8_t byte = *(in++); \
- int i; \
- uint32_t fore = palette->ents[1]; \
- uint32_t back = palette->ents[0]; \
- for (i = 0; i < 8; i++) \
- { \
- if ((byte >> i) & 1) { \
- COPY_PLT_ENTRY(fore, out); \
- } else { \
- COPY_PLT_ENTRY(back, out); \
- } \
- out++; \
- } \
-}
-#define CAST_PLT_DISTANCE(dist) (dist*8)
-#endif // PLT Type
-#endif // TO_RGB32
-#endif
-
-#ifdef LZ_RGB16
-#ifndef TO_RGB32
-#define OUT_PIXEL rgb16_pixel_t
-#define FNAME(name) glz_rgb16_##name
-#define COPY_COMP_PIXEL(in, out) {*out = (*(in++)) << 8; *out |= *(in++); out++;}
-#else
-#define OUT_PIXEL rgb32_pixel_t
-#define FNAME(name) glz_rgb16_to_rgb32_##name
-#define COPY_COMP_PIXEL(in, out) {out->r = *(in++); out->b= *(in++); \
- out->g = (((out->r) << 6) | ((out->b) >> 2)) & ~0x07; \
- out->g |= (out->g >> 5); \
- out->r = ((out->r << 1) & ~0x07) | ((out->r >> 4) & 0x07) ; \
- out->b = (out->b << 3) | ((out->b >> 2) & 0x07); \
- out->pad = 0; \
- out++; \
-}
-#endif
-#endif
-
-#ifdef LZ_RGB24
-#define OUT_PIXEL rgb24_pixel_t
-#define FNAME(name) glz_rgb24_##name
-#define COPY_COMP_PIXEL(in, out) { \
- out->b = *(in++); \
- out->g = *(in++); \
- out->r = *(in++); \
- out++; \
-}
-#endif
-
-#ifdef LZ_RGB32
-#define OUT_PIXEL rgb32_pixel_t
-#define FNAME(name) glz_rgb32_##name
-#define COPY_COMP_PIXEL(in, out) { \
- out->b = *(in++); \
- out->g = *(in++); \
- out->r = *(in++); \
- out->pad = 0; \
- out++; \
-}
-#endif
-
-#ifdef LZ_RGB_ALPHA
-#define OUT_PIXEL rgb32_pixel_t
-#define FNAME(name) glz_rgb_alpha_##name
-#define COPY_PIXEL(p, out) {out->pad = p.pad; out++;}
-#define COPY_REF_PIXEL(ref, out) {out->pad = ref->pad; out++; ref++;}
-#define COPY_COMP_PIXEL(in, out) {out->pad = *(in++); out++;}
-#endif
-
-// TODO: separate into routines that decode to dist,len. and to a routine that
-// actually copies the data.
-
-/* returns num of bytes read from in buf.
- size should be in PIXEL */
-static size_t FNAME(decode)(GlzDecoderWindow &window, uint8_t* in_buf,
- uint8_t *out_buf, int size,
- DecodedImageWinId image_win_id, SpicePalette *plt,
- GlzDecoderDebug &debug_calls)
-{
- uint8_t *ip = in_buf;
- OUT_PIXEL *out_pix_buf = (OUT_PIXEL *)out_buf;
- OUT_PIXEL *op = out_pix_buf;
- OUT_PIXEL *op_limit = out_pix_buf + size;
-
- uint32_t ctrl = *(ip++);
- int loop = true;
-
- do {
- if (ctrl >= MAX_COPY) { // reference (dictionary/RLE)
- OUT_PIXEL *ref = op;
- uint32_t len = ctrl >> 5;
- uint8_t pixel_flag = (ctrl >> 4) & 0x01;
- uint32_t pixel_ofs = (ctrl & 0x0f);
- uint8_t image_flag;
- uint32_t image_dist;
-
- /* retrieving the referenced images, the offset of the first pixel,
- and the match length */
-
- uint8_t code;
- //len--; // TODO: why do we do this?
-
- if (len == 7) { // match length is bigger than 7
- do {
- code = *(ip++);
- len += code;
- } while (code == 255); // remaining of len
- }
- code = *(ip++);
- pixel_ofs += (code << 4);
-
- code = *(ip++);
- image_flag = (code >> 6) & 0x03;
- if (!pixel_flag) { // short pixel offset
- image_dist = code & 0x3f;
- for (int i = 0; i < image_flag; i++) {
- code = *(ip++);
- image_dist += (code << (6 + (8 * i)));
- }
- } else {
- pixel_flag = (code >> 5) & 0x01;
- pixel_ofs += (code & 0x1f) << 12;
- image_dist = 0;
- for (int i = 0; i < image_flag; i++) {
- code = *(ip++);
- image_dist += (code << 8 * i);
- }
-
-
- if (pixel_flag) { // very long pixel offset
- code = *(ip++);
- pixel_ofs += code << 17;
- }
- }
-
-#if defined(LZ_PLT) || defined(LZ_RGB_ALPHA)
- len += 2; // length is biased by 2 (fixing bias)
-#elif defined(LZ_RGB16)
- len += 1; // length is biased by 1 (fixing bias)
-#endif
- if (!image_dist) {
- pixel_ofs += 1; // offset is biased by 1 (fixing bias)
- }
-
-#if defined(TO_RGB32)
-#if defined(PLT4_BE) || defined(PLT4_LE) || defined(PLT1_BE) || defined(PLT1_LE)
- pixel_ofs = CAST_PLT_DISTANCE(pixel_ofs);
- len = CAST_PLT_DISTANCE(len);
-#endif
-#endif
-
- if (!image_dist) { // reference is inside the same image
- ref -= pixel_ofs;
- GLZ_ASSERT(debug_calls, ref + len <= op_limit);
- GLZ_ASSERT(debug_calls, ref >= out_pix_buf);
- } else {
- ref = (OUT_PIXEL *)window.get_ref_pixel(image_win_id, image_dist,
- pixel_ofs);
- }
-
- GLZ_ASSERT(debug_calls, op + len <= op_limit);
-
- /* copying the match*/
-
- if (ref == (op - 1)) { // run (this will never be called in PLT4/1_TO_RGB because the
- // number of pixel copied is larger then one...
- /* optimize copy for a run */
- OUT_PIXEL b = *ref;
- for (; len; --len) {
- COPY_PIXEL(b, op);
- GLZ_ASSERT(debug_calls, op <= op_limit);
- }
- } else {
- for (; len; --len) {
- COPY_REF_PIXEL(ref, op);
- GLZ_ASSERT(debug_calls, op <= op_limit);
- }
- }
- } else { // copy
- ctrl++; // copy count is biased by 1
-#if defined(TO_RGB32) && (defined(PLT4_BE) || defined(PLT4_LE) || defined(PLT1_BE) || \
- defined(PLT1_LE))
- GLZ_ASSERT(debug_calls, op + CAST_PLT_DISTANCE(ctrl) <= op_limit);
-#else
- GLZ_ASSERT(debug_calls, op + ctrl <= op_limit);
-#endif
-
-#if defined(TO_RGB32) && defined(LZ_PLT)
- GLZ_ASSERT(debug_calls, plt);
- COPY_COMP_PIXEL(ip, op, plt);
-#else
- COPY_COMP_PIXEL(ip, op);
-#endif
- GLZ_ASSERT(debug_calls, op <= op_limit);
-
- for (--ctrl; ctrl; ctrl--) {
-#if defined(TO_RGB32) && defined(LZ_PLT)
- GLZ_ASSERT(debug_calls, plt);
- COPY_COMP_PIXEL(ip, op, plt);
-#else
- COPY_COMP_PIXEL(ip, op);
-#endif
- GLZ_ASSERT(debug_calls, op <= op_limit);
- }
- } // END REF/COPY
-
- if (LZ_EXPECT_CONDITIONAL(op < op_limit)) {
- ctrl = *(ip++);
- } else {
- loop = false;
- }
- } while (LZ_EXPECT_CONDITIONAL(loop));
-
- return (ip - in_buf);
-}
-#undef LZ_PLT
-#undef PLT8
-#undef PLT4_BE
-#undef PLT4_LE
-#undef PLT1_BE
-#undef PLT1_LE
-#undef LZ_RGB16
-#undef LZ_RGB24
-#undef LZ_RGB32
-#undef LZ_RGB_ALPHA
-#undef TO_RGB32
-#undef OUT_PIXEL
-#undef FNAME
-#undef COPY_PIXEL
-#undef COPY_REF_PIXEL
-#undef COPY_COMP_PIXEL
-#undef COPY_PLT_ENTRY
-#undef CAST_PLT_DISTANCE
diff --git a/client/glz_decoded_image.h b/client/glz_decoded_image.h
deleted file mode 100644
index 2e607f81..00000000
--- a/client/glz_decoded_image.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_GLZ_DECODED_IMAGE
-#define _H_GLZ_DECODED_IMAGE
-
-#include "common.h"
-#include "glz_decoder_config.h"
-
-/*
- This class represents an image the lz window holds. It is created after the decoding of the
- image is completed, and destroyed when it exits the window.
-*/
-
-class GlzDecodedImage {
-public:
-
- GlzDecodedImage(uint64_t id, uint64_t win_head_id, uint8_t *data, int size,
- int bytes_per_pixel)
- : _id (id)
- , _win_head_id (win_head_id)
- , _data (data)
- , _bytes_per_pixel (bytes_per_pixel)
- , _size (size) {}
-
- virtual ~GlzDecodedImage() {}
- uint8_t *get_data() {return _data;}
- uint8_t *get_pixel_ref(int offset); // palette pix_id = byte count
- uint64_t get_id() {return _id;}
- uint64_t get_window_head_id() {return _win_head_id;}
- int get_size() {return _size;}
-
-protected:
- uint64_t _id;
- uint64_t _win_head_id;
- uint8_t *_data;
- int _bytes_per_pixel; // if image is with palette pixel=byte
- int _size; // number of pixels
-};
-
-inline uint8_t* GlzDecodedImage::get_pixel_ref(int offset)
-{
- if (!_data) {
- return NULL;
- } else {
- return (_data + (offset * _bytes_per_pixel));
- }
-}
-
-#endif
diff --git a/client/glz_decoder.cpp b/client/glz_decoder.cpp
deleted file mode 100644
index d6880517..00000000
--- a/client/glz_decoder.cpp
+++ /dev/null
@@ -1,301 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-#include "glz_decoder_config.h"
-#include "glz_decoder.h"
-
-static void op_decode (SpiceGlzDecoder *decoder,
- uint8_t *data,
- SpicePalette *plt,
- void *usr_data)
-{
- GlzDecoder* _decoder = static_cast<GlzDecoder*>(decoder);
- _decoder->decode(data, plt, usr_data);
-}
-
-GlzDecoder::GlzDecoder(GlzDecoderWindow &images_window,
- GlzDecodeHandler &usr_handler, GlzDecoderDebug &debug_calls)
- : _images_window (images_window)
- , _usr_handler (usr_handler)
- , _debug_calls (debug_calls)
-{
- static SpiceGlzDecoderOps decoder_ops = {
- op_decode,
- };
- ops = &decoder_ops;
-}
-
-GlzDecoder::~GlzDecoder()
-{
-}
-
-void GlzDecoder::decode_header()
-{
- uint32_t magic;
- int version;
- uint8_t tmp;
- int stride;
-
- magic = decode_32();
- if (magic != LZ_MAGIC) {
- _debug_calls.warn(std::string("bad magic\n"));
- }
-
- version = decode_32();
- if (version != LZ_VERSION) {
- _debug_calls.warn(std::string("bad version\n"));
- }
-
- tmp = *(_in_now++);
-
- _image.type = (LzImageType)(tmp & LZ_IMAGE_TYPE_MASK);
- _image.top_down = (tmp >> LZ_IMAGE_TYPE_LOG) ? true : false;
- _image.width = decode_32();
- _image.height = decode_32();
- stride = decode_32();
-
- if (IS_IMAGE_TYPE_PLT[_image.type]) {
- _image.gross_pixels = stride * PLT_PIXELS_PER_BYTE[_image.type] * _image.height;
- } else {
- _image.gross_pixels = _image.width * _image.height;
- }
-
- _image.id = decode_64();
- _image.win_head_dist = decode_32();
-}
-
-inline uint32_t GlzDecoder::decode_32()
-{
- uint32_t word = 0;
- word |= *(_in_now++);
- word <<= 8;
- word |= *(_in_now++);
- word <<= 8;
- word |= *(_in_now++);
- word <<= 8;
- word |= *(_in_now++);
- return word;
-}
-
-inline uint64_t GlzDecoder::decode_64()
-{
- uint64_t long_word = decode_32();
- long_word <<= 32;
- long_word |= decode_32();
- return long_word;
-}
-
-// TODO: the code is historically c based. Consider transforming to c++ and use templates
-// - but be sure it won't make it slower!
-
-/*
- * Give hints to the compiler for branch prediction optimization.
- */
-#if defined(__GNUC__) && (__GNUC__ > 2)
-#define LZ_EXPECT_CONDITIONAL(c) (__builtin_expect((c), 1))
-#define LZ_UNEXPECT_CONDITIONAL(c) (__builtin_expect((c), 0))
-#else
-#define LZ_EXPECT_CONDITIONAL(c) (c)
-#define LZ_UNEXPECT_CONDITIONAL(c) (c)
-#endif
-
-
-#ifdef __GNUC__
-#define ATTR_PACKED __attribute__ ((__packed__))
-#else
-#define ATTR_PACKED
-#pragma pack(push)
-#pragma pack(1)
-#endif
-
-
-/* the palette images will be treated as one byte pixels. Their width should be transformed
- accordingly.
-*/
-typedef struct ATTR_PACKED one_byte_pixel_t {
- uint8_t a;
-} one_byte_pixel_t;
-
-typedef struct ATTR_PACKED rgb32_pixel_t {
- uint8_t b;
- uint8_t g;
- uint8_t r;
- uint8_t pad;
-} rgb32_pixel_t;
-
-typedef struct ATTR_PACKED rgb24_pixel_t {
- uint8_t b;
- uint8_t g;
- uint8_t r;
-} rgb24_pixel_t;
-
-typedef uint16_t rgb16_pixel_t;
-
-#ifndef __GNUC__
-#pragma pack(pop)
-#endif
-
-#undef ATTR_PACKED
-
-#define LZ_PLT
-#include "glz_decode_tmpl.c"
-
-#define LZ_PLT
-#define PLT8
-#define TO_RGB32
-#include "glz_decode_tmpl.c"
-
-#define LZ_PLT
-#define PLT4_BE
-#define TO_RGB32
-#include "glz_decode_tmpl.c"
-
-#define LZ_PLT
-#define PLT4_LE
-#define TO_RGB32
-#include "glz_decode_tmpl.c"
-
-#define LZ_PLT
-#define PLT1_BE
-#define TO_RGB32
-#include "glz_decode_tmpl.c"
-
-#define LZ_PLT
-#define PLT1_LE
-#define TO_RGB32
-#include "glz_decode_tmpl.c"
-
-
-#define LZ_RGB16
-#include "glz_decode_tmpl.c"
-#define LZ_RGB16
-#define TO_RGB32
-#include "glz_decode_tmpl.c"
-
-#define LZ_RGB24
-#include "glz_decode_tmpl.c"
-
-#define LZ_RGB32
-#include "glz_decode_tmpl.c"
-
-#define LZ_RGB_ALPHA
-#include "glz_decode_tmpl.c"
-
-#undef LZ_UNEXPECT_CONDITIONAL
-#undef LZ_EXPECT_CONDITIONAL
-
-typedef size_t (*decode_function)(GlzDecoderWindow &window, uint8_t* in_buf,
- uint8_t *out_buf, int size,
- DecodedImageWinId image_win_id, SpicePalette *plt,
- GlzDecoderDebug &debug_calls);
-
-// ordered according to LZ_IMAGE_TYPE
-const decode_function DECODE_TO_RGB32[] = {
- NULL,
- glz_plt1_le_to_rgb32_decode,
- glz_plt1_be_to_rgb32_decode,
- glz_plt4_le_to_rgb32_decode,
- glz_plt4_be_to_rgb32_decode,
- glz_plt8_to_rgb32_decode,
- glz_rgb16_to_rgb32_decode,
- glz_rgb32_decode,
- glz_rgb32_decode,
- glz_rgb32_decode
-};
-
-const decode_function DECODE_TO_SAME[] = {
- NULL,
- glz_plt_decode,
- glz_plt_decode,
- glz_plt_decode,
- glz_plt_decode,
- glz_plt_decode,
- glz_rgb16_decode,
- glz_rgb24_decode,
- glz_rgb32_decode,
- glz_rgb32_decode
-};
-
-void GlzDecoder::decode(uint8_t *data, SpicePalette *palette, void *opaque_usr_info)
-{
- DecodedImageWinId image_window_id;
- GlzDecodedImage *decoded_image;
- size_t n_in_bytes_decoded;
- int bytes_per_pixel;
- LzImageType decoded_type;
-
- _in_start = data;
- _in_now = data;
-
- decode_header();
-
-#ifdef GLZ_DECODE_TO_RGB32
- bytes_per_pixel = 4;
-
- if (_image.type == LZ_IMAGE_TYPE_RGBA) {
- decoded_type = LZ_IMAGE_TYPE_RGBA;
- } else {
- decoded_type = LZ_IMAGE_TYPE_RGB32;
- }
-
-#else
- if (IS_IMAGE_TYPE_PLT[_image.type]) {
- GLZ_ASSERT(_debug_calls, !(_image.gross_pixels % PLT_PIXELS_PER_BYTE[_image.type]));
- }
- bytes_per_pixel = RGB_BYTES_PER_PIXEL[_image.type];
- decoded_type = _image.type;
-#endif
-
-
- image_window_id = _images_window.pre_decode(_image.id, _image.id - _image.win_head_dist);
-
- decoded_image = _usr_handler.alloc_image(opaque_usr_info, _image.id,
- _image.id - _image.win_head_dist,
- decoded_type, _image.width, _image.height,
- _image.gross_pixels, bytes_per_pixel,
- _image.top_down);
-
- _image.data = decoded_image->get_data();
-
- // decode_by_type
-#ifdef GLZ_DECODE_TO_RGB32
- n_in_bytes_decoded = DECODE_TO_RGB32[_image.type](_images_window, _in_now, _image.data,
- _image.gross_pixels, image_window_id,
- palette, _debug_calls);
-#else
- n_in_bytes_decoded = DECODE_TO_SAME[_image.type](_images_window, _in_now, _image.data,
- IS_IMAGE_TYPE_PLT[_image.type] ?
- _image.gross_pixels /
- PLT_PIXELS_PER_BYTE[_image.type] :
- _image.gross_pixels,
- image_window_id, palette, _debug_calls);
-#endif
-
- _in_now += n_in_bytes_decoded;
-
- if (_image.type == LZ_IMAGE_TYPE_RGBA) {
- glz_rgb_alpha_decode(_images_window, _in_now, _image.data,
- _image.gross_pixels, image_window_id, palette, _debug_calls);
- }
-
- _images_window.post_decode(decoded_image);
-}
diff --git a/client/glz_decoder.h b/client/glz_decoder.h
deleted file mode 100644
index 0d505fdb..00000000
--- a/client/glz_decoder.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_GLZ_DECODER
-#define _H_GLZ_DECODER
-
-#include "common/lz_common.h"
-#include "glz_decoder_config.h"
-#include "glz_decoder_window.h"
-#include "red_canvas_base.h"
-
-class GlzDecodeHandler {
-public:
- GlzDecodeHandler() {}
- virtual ~GlzDecodeHandler() {}
-
- /* Called by the decoder before the image decoding is starts. The
- user of the decoder should create GlzDecodedImage instance.
- If resources should be released when the image exits the Glz window,
- it should be handled in the instance dtor.
-
- opaque_usr_info: the data sent when GlzDecoder::decode was called
- gross_pixels : number of pixels when considering the whole stride*/
- virtual GlzDecodedImage *alloc_image(void *opaque_usr_info, uint64_t image_id,
- uint64_t image_win_head_id, LzImageType type,
- int width, int height, int gross_pixels,
- int n_bytes_per_pixel, bool top_down) = 0;
-};
-
-/*
- This class implements the lz decoding algorithm
-*/
-
-class GlzDecoder : public SpiceGlzDecoder
-{
-public:
- GlzDecoder(GlzDecoderWindow &images_window, GlzDecodeHandler &usr_handler,
- GlzDecoderDebug &debug_calls);
- virtual ~GlzDecoder();
-
- /* Decodes the data and afterwards calls GlzDecodeHandler::handle_decoded_image */
- void decode(uint8_t *data, SpicePalette *palette, void *opaque_usr_info);
-
-private:
- void decode_header();
- uint32_t decode_32();
- uint64_t decode_64();
-
-private:
- GlzDecoderWindow &_images_window;
- GlzDecodeHandler &_usr_handler;
- GlzDecoderDebug &_debug_calls;
-
- uint8_t *_in_now;
- uint8_t *_in_start;
-
- struct {
- uint64_t id;
- LzImageType type;
- int width;
- int height;
- int gross_pixels;
- bool top_down;
- int win_head_dist;
- uint8_t *data;
- } _image;
-};
-
-#endif // _H_GLZ_DECODER
diff --git a/client/glz_decoder_config.h b/client/glz_decoder_config.h
deleted file mode 100644
index c15f012b..00000000
--- a/client/glz_decoder_config.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_GLZ_DECODER_CONFIG
-#define _H_GLZ_DECODER_CONFIG
-
-#include <exception>
-#include <sstream>
-#include <stdio.h>
-
-#include <spice/types.h>
-#include <spice/macros.h>
-#include "common/lz_common.h"
-
-class GlzException: public std::exception {
-public:
- GlzException(const std::string& str) : _mess (str) {}
- virtual ~GlzException() throw () {}
- virtual const char* what() const throw () {return _mess.c_str();}
-
-private:
- std::string _mess;
-};
-
-class GlzDecoderDebug {
-public:
- virtual ~GlzDecoderDebug() {}
- virtual void error(const std::string& str) = 0;
- virtual void warn(const std::string& str) = 0;
- virtual void info(const std::string& str) = 0;
-};
-
-#ifdef RED_DEBUG
-
-#define GLZ_ASSERT(debug, x) { \
- if (!(x)) { \
- std::ostringstream os; \
- os << __FUNCTION__ << ": ASSERT " << #x << " failed\n"; \
- (debug).error(os.str()); \
- } \
-}
-#else
-
-#define GLZ_ASSERT(debug, x)
-
-#endif
-
-#define GLZ_DECODE_TO_RGB32
-
-#endif //_H_GLZ_DECODER_CONFIG
diff --git a/client/glz_decoder_window.cpp b/client/glz_decoder_window.cpp
deleted file mode 100644
index 51d44abc..00000000
--- a/client/glz_decoder_window.cpp
+++ /dev/null
@@ -1,329 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-
-#include "glz_decoder_window.h"
-#include "utils.h"
-
-#define INIT_IMAGES_CAPACITY 100
-#define WIN_REALLOC_FACTOR 1.5
-
-GlzDecoderWindow::GlzDecoderWindow(GlzDecoderDebug &debug_calls)
- : _aborting (false)
- , _debug_calls (debug_calls)
-{
- _images_capacity = INIT_IMAGES_CAPACITY;
- _images = new GlzDecodedImage*[_images_capacity];
- if (!_images) {
- _debug_calls.error(std::string("failed allocating images\n"));
- }
-
- memset(_images, 0, sizeof(GlzDecodedImage*) * _images_capacity);
-
- init();
-}
-
-GlzDecoderWindow::~GlzDecoderWindow()
-{
- clear();
- delete[] _images;
-}
-
-DecodedImageWinId GlzDecoderWindow::pre_decode(uint64_t image_id, uint64_t relative_head_id)
-{
- DecodedImageWinId image_win_id = pre_decode_update_window(image_id, relative_head_id);
- pre_decode_finalize();
- return image_win_id;
-}
-
-void GlzDecoderWindow::post_decode(GlzDecodedImage *image)
-{
- post_decode_intialize();
- post_decode_update_window(image);
-}
-
-/* index: the physical index in the images array. Note that it can't change between waits since
- the realloc mutex should be read locked.
- No starvation for the realloc mutex can occur, since the image we wait for is located before us,
- hence, when it arrives - no realloc is needed. */
-void GlzDecoderWindow::wait_for_image(int index)
-{
- Lock lock(_new_image_mutex);
- GlzDecodedImage *image = _images[index]; // can be performed without locking the _win_mutex,
- // since it is called after pre and the rw mutex is // locked, hence, physical changes to the window are
- // not allowed. In addition the reading of the image ptr
- // is atomic, thus, even if the value changes we are
- // not affected.
-
- while (!image) {
- if (_aborting) {
- THROW("aborting");
- }
- _new_image_cond.wait(lock);
- image = _images[index];
- }
-}
-
-void GlzDecoderWindow::abort()
-{
- Lock lock1(_win_modifiers_mutex);
- Lock lock2(_new_image_mutex);
- _aborting = true;
- _new_image_cond.notify_all();
- _release_image_cond.notify_all();
- _win_alloc_cond.notify_all();
-}
-
-void GlzDecoderWindow::clear()
-{
- Lock lock(_win_modifiers_mutex);
- release_images();
- init();
-}
-
-void GlzDecoderWindow::init()
-{
- _missing_list.clear();
- // The window is never empty: the head is in the missing list or in the window.
- // The first missing image is 0.
- _missing_list.push_front(0);
- _head_idx = 0;
- _tail_image_id = 0;
- _n_images = 1;
-}
-
-void GlzDecoderWindow::release_images()
-{
- for (int i = 0; i < _n_images; i++) {
- int idx = (_head_idx + i) % _images_capacity;
- if (_images[idx]) {
- delete _images[idx];
- _images[idx] = NULL;
- }
- }
-}
-
-inline bool GlzDecoderWindow::is_empty()
-{
- return (!_n_images);
-}
-
-inline bool GlzDecoderWindow::will_overflow(uint64_t image_id, uint64_t relative_head_id)
-{
- if (image_id <= _tail_image_id) {
- return false;
- }
-
- if (!_missing_list.empty() && (_missing_list.front() < relative_head_id)) {
- // two non overlapping windows
- return true;
- }
-
- return false;
-}
-
-DecodedImageWinId GlzDecoderWindow::pre_decode_update_window(uint64_t image_id,
- uint64_t relative_head_id)
-{
- Lock lock(_win_modifiers_mutex);
- int realloc_size;
-
- while (will_overflow(image_id, relative_head_id)) {
- if (_aborting) {
- THROW("aborting");
- }
- _release_image_cond.wait(lock);
- }
-
- // The following conditions prevent starvation in case thread (1) should realloc,
- // thread (2) is during decode and waits for a previous image and
- /// thread (3) should decode this the previous image and needs to enter pre decode although
- // (1) is in there.
- // We must give priority to older images in the window.
- // The condition should be checked over again in case a later image entered the window
- // and the realocation was already performed
- while ((realloc_size = calc_realloc_size(image_id))) {
- if (_aborting) {
- THROW("aborting");
- }
-
- if (_win_alloc_rw_mutex.try_write_lock()) {
- realloc(realloc_size);
- _win_alloc_rw_mutex.write_unlock();
- break;
- } else {
- _win_alloc_cond.wait(lock);
- }
- }
-
- if (image_id > _tail_image_id) { // not in missing list
- add_pre_decoded_image(image_id);
- }
-
- return calc_image_win_idx(image_id);
-}
-
-void GlzDecoderWindow::add_pre_decoded_image(uint64_t image_id)
-{
- GLZ_ASSERT(_debug_calls, image_id > _tail_image_id);
- GLZ_ASSERT(_debug_calls, image_id - _tail_image_id + _n_images < _images_capacity);
-
- for (uint64_t miss_id = _tail_image_id + 1; miss_id <= image_id; miss_id++) {
- _missing_list.push_back(miss_id);
- _n_images++;
- }
- _tail_image_id = image_id;
-}
-
-inline int GlzDecoderWindow::calc_realloc_size(uint64_t new_tail_image_id)
-{
- if (new_tail_image_id <= _tail_image_id) {
- return 0;
- }
-
- int min_capacity = (int)(_n_images + new_tail_image_id - _tail_image_id);
-
- if ((min_capacity * WIN_REALLOC_FACTOR) > _images_capacity) {
- return (int)MAX(min_capacity * WIN_REALLOC_FACTOR, WIN_REALLOC_FACTOR * _images_capacity);
- } else {
- return 0;
- }
-}
-
-void GlzDecoderWindow::realloc(int size)
-{
- GlzDecodedImage **new_images = new GlzDecodedImage*[size];
-
- if (!new_images) {
- _debug_calls.error(std::string("failed allocating images array"));
- }
- memset(new_images, 0, sizeof(GlzDecodedImage*) * size);
-
- for (int i = 0; i < _n_images; i++) {
- new_images[i] = _images[(i + _head_idx) % _images_capacity];
- }
- delete[] _images;
-
- _images = new_images;
- _head_idx = 0;
- _images_capacity = size;
-}
-
-void GlzDecoderWindow::pre_decode_finalize()
-{
- _win_alloc_rw_mutex.read_lock();
-}
-
-void GlzDecoderWindow::post_decode_intialize()
-{
- _win_alloc_rw_mutex.read_unlock();
-}
-
-void GlzDecoderWindow::post_decode_update_window(GlzDecodedImage *image)
-{
- Lock lock(_win_modifiers_mutex);
- add_decoded_image(image);
- narrow_window(image);
- _win_alloc_cond.notify_all();
-}
-
-void GlzDecoderWindow::add_decoded_image(GlzDecodedImage *image)
-{
- Lock lock(_new_image_mutex);
- GLZ_ASSERT(_debug_calls, image->get_id() <= _tail_image_id);
- _images[calc_image_win_idx(image->get_id())] = image;
- _new_image_cond.notify_all();
-}
-
-/* Important observations:
- 1) When an image is added, if it is not the first missing image, it is not removed
- immediately from the missing list (in order not to store another pointer to
- the missing list inside the window ,or otherwise, to go over the missing list
- and look for the image).
- 2) images that weren't removed from the missing list in their addition time, will be removed when
- preliminary images will be added.
- 3) The first item in the missing list is always really missing.
- 4) The missing list is always ordered by image id (see add_pre_decoded_image)
-*/
-void GlzDecoderWindow::narrow_window(GlzDecodedImage *last_added)
-{
- uint64_t new_head_image_id;
-
- GLZ_ASSERT(_debug_calls, !_missing_list.empty());
-
- if (_missing_list.front() != last_added->get_id()) {
- return;
- }
-
- _missing_list.pop_front(); // removing the last added image from the missing list
-
- /* maintaining the missing list: removing front images that already arrived */
- while (!_missing_list.empty()) {
- int front_win_idx = calc_image_win_idx(_missing_list.front());
- if (_images[front_win_idx] == NULL) { // still missing
- break;
- } else {
- _missing_list.pop_front();
- }
- }
-
- /* removing unnecessary image from the window's head*/
- if (_missing_list.empty()) {
- new_head_image_id = _images[
- calc_image_win_idx(_tail_image_id)]->get_window_head_id();
- } else {
- // there must be at least one image in the window since narrow_window is called
- // from post decode
- GLZ_ASSERT(_debug_calls, _images[calc_image_win_idx(_missing_list.front() - 1)]);
- new_head_image_id = _images[
- calc_image_win_idx(_missing_list.front() - 1)]->get_window_head_id();
- }
-
- remove_head(new_head_image_id);
-}
-
-inline void GlzDecoderWindow::remove_head(uint64_t new_head_image_id)
-{
- GLZ_ASSERT(_debug_calls, _images[_head_idx]);
-
- int n_images_remove = (int)(new_head_image_id - _images[_head_idx]->get_id());
-
- if (!n_images_remove) {
- return;
- }
-
- for (int i = 0; i < n_images_remove; i++) {
- int index = (_head_idx + i) % _images_capacity;
- delete _images[index];
- _images[index] = NULL;
- }
-
- _n_images -= n_images_remove;
- _head_idx = (_head_idx + n_images_remove) % _images_capacity;
-
- _release_image_cond.notify_all();
-}
-
-/* NOTE: can only be used when the window is locked. (i.e, not inside get_ref_pixel) */
-inline int GlzDecoderWindow::calc_image_win_idx(uint64_t image_id)
-{
- return (int)((_head_idx + _n_images - 1 - (_tail_image_id - image_id)) % _images_capacity);
-}
diff --git a/client/glz_decoder_window.h b/client/glz_decoder_window.h
deleted file mode 100644
index f89d18f0..00000000
--- a/client/glz_decoder_window.h
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_GLZ_DECODER_WINDOW
-#define _H_GLZ_DECODER_WINDOW
-
-#include "glz_decoder_config.h"
-#include "glz_decoded_image.h"
-
-#include <list>
-
-#include "read_write_mutex.h"
-
-typedef int DecodedImageWinId;
-
-/*
- The class represents the lz window of images, which is shared among the glz decoders
-*/
-
-class GlzDecoderWindow {
-public:
- GlzDecoderWindow(GlzDecoderDebug &debug_calls);
- virtual ~GlzDecoderWindow();
-
- DecodedImageWinId pre_decode(uint64_t image_id, uint64_t relative_head_id);
-
- void post_decode(GlzDecodedImage *image);
-
- /* NOTE - get_ref_pixel should be called only after pre_decode was called and
- before post decode was called */
- uint8_t *get_ref_pixel(DecodedImageWinId decoded_image_win_id, int dist_from_ref_image,
- int pixel_offset);
-
- void abort();
-
- /* NOTE - clear mustn't be called if the window is currently used by a decoder*/
- void clear();
-
-private:
- void wait_for_image(int index);
- void add_image(GlzDecodedImage *image);
- uint8_t* get_pixel_after_image_entered(int image_index, int pixel_offset);
-
- bool will_overflow(uint64_t image_id, uint64_t relative_head_id);
- bool is_empty();
-
- DecodedImageWinId pre_decode_update_window(uint64_t image_id, uint64_t relative_head_id);
- void pre_decode_finalize();
- void post_decode_intialize();
- void post_decode_update_window(GlzDecodedImage *image);
- void add_pre_decoded_image(uint64_t image_id);
- void add_decoded_image(GlzDecodedImage *image);
- void narrow_window(GlzDecodedImage *last_added);
- void remove_head(uint64_t new_head_image_id);
- int calc_image_win_idx(uint64_t image_id);
- int calc_realloc_size(uint64_t new_tail_image_id);
- void realloc(int size);
- void init();
- void release_images();
-
-private:
- GlzDecodedImage **_images; // cyclic window
- int _head_idx; // index in images array (not image id)
- uint64_t _tail_image_id;
- int _images_capacity;
- int _n_images; // _n_images counts all the images in
- // the window, including the missing ones
-
- std::list<uint64_t> _missing_list;
-
- Mutex _win_modifiers_mutex;
- ReadWriteMutex _win_alloc_rw_mutex;
- Mutex _new_image_mutex;
-
- Condition _new_image_cond; // when get_pixel_ref waits for an image
- Condition _release_image_cond; // when waiting for the window to narrow.
- Condition _win_alloc_cond;
-
- bool _aborting;
-
- GlzDecoderDebug &_debug_calls;
-};
-
-inline uint8_t* GlzDecoderWindow::get_pixel_after_image_entered(int image_index,
- int pixel_offset)
-{
- return _images[image_index]->get_pixel_ref(pixel_offset);
-}
-
-/* should be called only between pre and post (when realloc mutex is write-locked).
- Note that it can't use calc_image_win_idx, since the window is not locked for changes
- (that are not reallocation) during decoding.*/
-inline uint8_t *GlzDecoderWindow::get_ref_pixel(DecodedImageWinId decoded_image_win_id,
- int dist_from_ref_image, int pixel_offset)
-{
- int ref_image_index = (dist_from_ref_image <= decoded_image_win_id) ?
- (decoded_image_win_id - dist_from_ref_image) :
- _images_capacity + (decoded_image_win_id - dist_from_ref_image);
-
- if (_images[ref_image_index] == NULL) { // reading image is atomic
- wait_for_image(ref_image_index);
- }
-
- // after image entered - it won't leave the window till no decoder needs it
- return get_pixel_after_image_entered(ref_image_index, pixel_offset);
-}
-
-#endif // _H_GLZ_DECODER_WINDOW
diff --git a/client/gui/Makefile.am b/client/gui/Makefile.am
deleted file mode 100644
index 81e4f88e..00000000
--- a/client/gui/Makefile.am
+++ /dev/null
@@ -1,20 +0,0 @@
-NULL =
-
-EXTRA_DIST = \
- commonv2c.ttf.c \
- commonwealth-10.font.c \
- dejavu_sans-10.font.c \
- dejavu_sans.ttf.c \
- gui.cpp \
- gui.h \
- resource_provider.cpp \
- resource_provider.h \
- softrenderer.cpp \
- softrenderer.h \
- softtexture.cpp \
- softtexture.h \
- taharez_look.imageset.c \
- taharez_look.looknfeel.c \
- taharez_look.scheme.c \
- taharez_look.tga.c \
- $(NULL)
diff --git a/client/gui/commonv2c.ttf.c b/client/gui/commonv2c.ttf.c
deleted file mode 100644
index 6e708e7a..00000000
--- a/client/gui/commonv2c.ttf.c
+++ /dev/null
@@ -1,2766 +0,0 @@
-const unsigned char commonv2c_ttf[] = {
-0x00,0x01,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x04,0x00,0x00,0x4c,0x54,0x53,0x48,
-0xb2,0xf1,0xf2,0xb4,0x00,0x00,0x01,0x0c,0x00,0x00,0x00,0xe4,0x4f,0x53,0x2f,0x32,
-0x64,0x78,0xf1,0xc6,0x00,0x00,0x01,0xf0,0x00,0x00,0x00,0x4e,0x56,0x44,0x4d,0x58,
-0x70,0x65,0x77,0xd2,0x00,0x00,0x02,0x40,0x00,0x00,0x05,0xe0,0x63,0x6d,0x61,0x70,
-0xa8,0xef,0x1a,0xd8,0x00,0x00,0x08,0x20,0x00,0x00,0x01,0xec,0x63,0x76,0x74,0x20,
-0x2b,0x1b,0x08,0xba,0x00,0x00,0x0a,0x0c,0x00,0x00,0x00,0xe0,0x66,0x70,0x67,0x6d,
-0x31,0xcc,0x9b,0x64,0x00,0x00,0x0a,0xec,0x00,0x00,0x04,0x0d,0x67,0x6c,0x79,0x66,
-0x6c,0xf9,0xe0,0x47,0x00,0x00,0x0e,0xfc,0x00,0x00,0x77,0x92,0x68,0x64,0x6d,0x78,
-0xd6,0xdb,0x79,0x43,0x00,0x00,0x86,0x90,0x00,0x00,0x18,0x14,0x68,0x65,0x61,0x64,
-0xda,0xc5,0xa2,0x07,0x00,0x00,0x9e,0xa4,0x00,0x00,0x00,0x36,0x68,0x68,0x65,0x61,
-0x09,0x57,0x03,0xf7,0x00,0x00,0x9e,0xdc,0x00,0x00,0x00,0x24,0x68,0x6d,0x74,0x78,
-0xc3,0xd9,0x00,0x2c,0x00,0x00,0x9f,0x00,0x00,0x00,0x03,0x80,0x6c,0x6f,0x63,0x61,
-0x57,0x12,0x38,0xe5,0x00,0x00,0xa2,0x80,0x00,0x00,0x01,0xc2,0x6d,0x61,0x78,0x70,
-0x03,0x1e,0x05,0x21,0x00,0x00,0xa4,0x44,0x00,0x00,0x00,0x20,0x6e,0x61,0x6d,0x65,
-0xee,0xfc,0x5a,0xb4,0x00,0x00,0xa4,0x64,0x00,0x00,0x02,0x3d,0x70,0x6f,0x73,0x74,
-0x02,0xb3,0x85,0x75,0x00,0x00,0xa6,0xa4,0x00,0x00,0x05,0xcf,0x70,0x72,0x65,0x70,
-0xf6,0xa3,0xf5,0x0b,0x00,0x00,0xac,0x74,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0xe0,
-0x64,0x01,0x01,0x01,0x64,0x64,0x64,0x64,0x5d,0x64,0x64,0x64,0x61,0x64,0x64,0x64,
-0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,
-0x64,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x61,0x64,0x64,
-0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,
-0x61,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,
-0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x64,0x64,0x64,0x64,0x64,
-0x64,0x64,0x64,0x64,0x64,0x64,0x61,0x64,0x64,0x64,0x5d,0x64,0x64,0x64,0x64,0x64,
-0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x2f,0x64,0x64,0x61,0x64,0x5d,0x01,0x64,0x64,
-0x64,0x5d,0x64,0x64,0x5d,0x64,0x61,0x64,0x64,0x54,0x64,0x54,0x64,0x64,0x64,0x64,
-0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x65,0x65,0x65,0x64,0x64,0x64,0x64,
-0x64,0x65,0x5d,0x64,0x64,0x64,0x64,0x64,0x65,0x64,0x64,0x64,0x65,0x64,0x64,0x64,
-0x64,0x64,0x64,0x65,0x64,0x64,0x64,0x64,0x64,0x65,0x64,0x64,0x64,0x64,0x64,0x64,
-0x64,0x61,0x5d,0x64,0x64,0x64,0x64,0x64,0x61,0x64,0x64,0x64,0x65,0x64,0x64,0x64,
-0x64,0x64,0x64,0x61,0x64,0x64,0x64,0x64,0x64,0x61,0x64,0x64,0x5d,0x64,0x01,0x01,
-0x00,0x00,0x02,0x04,0x01,0x90,0x00,0x03,0x00,0x01,0x02,0xe9,0x02,0xb3,0x00,0x00,
-0x00,0x98,0x02,0xe9,0x02,0xb3,0x00,0x00,0x01,0xe2,0x00,0x35,0x01,0x13,0x00,0x00,
-0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x07,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x4c,0x54,0x53,0x00,0x00,
-0x00,0x20,0x21,0x22,0x03,0x1e,0xfe,0xf6,0x01,0x0a,0x04,0x54,0x01,0x51,0x00,0x00,
-0x00,0x00,0x00,0x01,0x00,0x01,0x01,0x01,0x01,0x01,0x00,0x0c,0x00,0xf8,0x08,0xff,
-0x00,0x08,0x00,0x09,0xff,0xfd,0x00,0x09,0x00,0x0a,0xff,0xfd,0x00,0x0a,0x00,0x0b,
-0xff,0xfc,0x00,0x0b,0x00,0x0c,0xff,0xfc,0x00,0x0c,0x00,0x0d,0xff,0xfc,0x00,0x0d,
-0x00,0x0e,0xff,0xfb,0x00,0x0e,0x00,0x0f,0xff,0xfb,0x00,0x0f,0x00,0x10,0xff,0xfb,
-0x00,0x10,0x00,0x11,0xff,0xfa,0x00,0x11,0x00,0x12,0xff,0xfa,0x00,0x12,0x00,0x13,
-0xff,0xfa,0x00,0x13,0x00,0x14,0xff,0xf9,0x00,0x14,0x00,0x15,0xff,0xf9,0x00,0x15,
-0x00,0x16,0xff,0xf9,0x00,0x16,0x00,0x17,0xff,0xf9,0x00,0x17,0x00,0x18,0xff,0xf8,
-0x00,0x18,0x00,0x19,0xff,0xf8,0x00,0x19,0x00,0x1b,0xff,0xf8,0x00,0x1a,0x00,0x1c,
-0xff,0xf7,0x00,0x1b,0x00,0x1d,0xff,0xf7,0x00,0x1c,0x00,0x1e,0xff,0xf7,0x00,0x1d,
-0x00,0x1f,0xff,0xf6,0x00,0x1e,0x00,0x20,0xff,0xf6,0x00,0x1f,0x00,0x21,0xff,0xf6,
-0x00,0x20,0x00,0x22,0xff,0xf5,0x00,0x21,0x00,0x23,0xff,0xf5,0x00,0x22,0x00,0x24,
-0xff,0xf5,0x00,0x23,0x00,0x25,0xff,0xf4,0x00,0x24,0x00,0x26,0xff,0xf4,0x00,0x25,
-0x00,0x27,0xff,0xf4,0x00,0x26,0x00,0x28,0xff,0xf3,0x00,0x27,0x00,0x29,0xff,0xf3,
-0x00,0x28,0x00,0x2a,0xff,0xf3,0x00,0x29,0x00,0x2b,0xff,0xf3,0x00,0x2a,0x00,0x2c,
-0xff,0xf2,0x00,0x2b,0x00,0x2d,0xff,0xf2,0x00,0x2c,0x00,0x2e,0xff,0xf2,0x00,0x2d,
-0x00,0x2f,0xff,0xf1,0x00,0x2e,0x00,0x30,0xff,0xf1,0x00,0x2f,0x00,0x31,0xff,0xf1,
-0x00,0x30,0x00,0x32,0xff,0xf0,0x00,0x31,0x00,0x34,0xff,0xf0,0x00,0x32,0x00,0x35,
-0xff,0xf0,0x00,0x33,0x00,0x36,0xff,0xef,0x00,0x34,0x00,0x37,0xff,0xef,0x00,0x35,
-0x00,0x38,0xff,0xef,0x00,0x36,0x00,0x39,0xff,0xee,0x00,0x37,0x00,0x3a,0xff,0xee,
-0x00,0x38,0x00,0x3b,0xff,0xee,0x00,0x39,0x00,0x3c,0xff,0xed,0x00,0x3a,0x00,0x3d,
-0xff,0xed,0x00,0x3b,0x00,0x3e,0xff,0xed,0x00,0x3c,0x00,0x3f,0xff,0xec,0x00,0x3d,
-0x00,0x40,0xff,0xec,0x00,0x3e,0x00,0x41,0xff,0xec,0x00,0x3f,0x00,0x42,0xff,0xec,
-0x00,0x40,0x00,0x43,0xff,0xeb,0x00,0x41,0x00,0x44,0xff,0xeb,0x00,0x42,0x00,0x45,
-0xff,0xeb,0x00,0x43,0x00,0x46,0xff,0xea,0x00,0x44,0x00,0x47,0xff,0xea,0x00,0x45,
-0x00,0x48,0xff,0xea,0x00,0x46,0x00,0x49,0xff,0xe9,0x00,0x47,0x00,0x4a,0xff,0xe9,
-0x00,0x48,0x00,0x4b,0xff,0xe9,0x00,0x49,0x00,0x4d,0xff,0xe8,0x00,0x4a,0x00,0x4e,
-0xff,0xe8,0x00,0x4b,0x00,0x4f,0xff,0xe8,0x00,0x4c,0x00,0x50,0xff,0xe7,0x00,0x4d,
-0x00,0x51,0xff,0xe7,0x00,0x4e,0x00,0x52,0xff,0xe7,0x00,0x4f,0x00,0x53,0xff,0xe6,
-0x00,0x50,0x00,0x54,0xff,0xe6,0x00,0x51,0x00,0x55,0xff,0xe6,0x00,0x52,0x00,0x56,
-0xff,0xe6,0x00,0x53,0x00,0x57,0xff,0xe5,0x00,0x54,0x00,0x58,0xff,0xe5,0x00,0x55,
-0x00,0x59,0xff,0xe5,0x00,0x56,0x00,0x5a,0xff,0xe4,0x00,0x57,0x00,0x5b,0xff,0xe4,
-0x00,0x58,0x00,0x5c,0xff,0xe4,0x00,0x59,0x00,0x5d,0xff,0xe3,0x00,0x5a,0x00,0x5e,
-0xff,0xe3,0x00,0x5b,0x00,0x5f,0xff,0xe3,0x00,0x5c,0x00,0x60,0xff,0xe2,0x00,0x5d,
-0x00,0x61,0xff,0xe2,0x00,0x5e,0x00,0x62,0xff,0xe2,0x00,0x5f,0x00,0x63,0xff,0xe1,
-0x00,0x60,0x00,0x64,0xff,0xe1,0x00,0x61,0x00,0x66,0xff,0xe1,0x00,0x62,0x00,0x67,
-0xff,0xe0,0x00,0x63,0x00,0x68,0xff,0xe0,0x00,0x64,0x00,0x69,0xff,0xe0,0x00,0x65,
-0x00,0x6a,0xff,0xe0,0x00,0x66,0x00,0x6b,0xff,0xdf,0x00,0x67,0x00,0x6c,0xff,0xdf,
-0x00,0x68,0x00,0x6d,0xff,0xdf,0x00,0x69,0x00,0x6e,0xff,0xde,0x00,0x6a,0x00,0x6f,
-0xff,0xde,0x00,0x6b,0x00,0x70,0xff,0xde,0x00,0x6c,0x00,0x71,0xff,0xdd,0x00,0x6d,
-0x00,0x72,0xff,0xdd,0x00,0x6e,0x00,0x73,0xff,0xdd,0x00,0x6f,0x00,0x74,0xff,0xdc,
-0x00,0x70,0x00,0x75,0xff,0xdc,0x00,0x71,0x00,0x76,0xff,0xdc,0x00,0x72,0x00,0x77,
-0xff,0xdb,0x00,0x73,0x00,0x78,0xff,0xdb,0x00,0x74,0x00,0x79,0xff,0xdb,0x00,0x75,
-0x00,0x7a,0xff,0xda,0x00,0x76,0x00,0x7b,0xff,0xda,0x00,0x77,0x00,0x7c,0xff,0xda,
-0x00,0x78,0x00,0x7d,0xff,0xd9,0x00,0x79,0x00,0x7f,0xff,0xd9,0x00,0x7a,0x00,0x80,
-0xff,0xd9,0x00,0x7b,0x00,0x81,0xff,0xd9,0x00,0x7c,0x00,0x82,0xff,0xd8,0x00,0x7d,
-0x00,0x83,0xff,0xd8,0x00,0x7e,0x00,0x84,0xff,0xd8,0x00,0x7f,0x00,0x85,0xff,0xd7,
-0x00,0x80,0x00,0x86,0xff,0xd7,0x00,0x81,0x00,0x87,0xff,0xd7,0x00,0x82,0x00,0x88,
-0xff,0xd6,0x00,0x83,0x00,0x89,0xff,0xd6,0x00,0x84,0x00,0x8a,0xff,0xd6,0x00,0x85,
-0x00,0x8b,0xff,0xd5,0x00,0x86,0x00,0x8c,0xff,0xd5,0x00,0x87,0x00,0x8d,0xff,0xd5,
-0x00,0x88,0x00,0x8e,0xff,0xd4,0x00,0x89,0x00,0x8f,0xff,0xd4,0x00,0x8a,0x00,0x90,
-0xff,0xd4,0x00,0x8b,0x00,0x91,0xff,0xd3,0x00,0x8c,0x00,0x92,0xff,0xd3,0x00,0x8d,
-0x00,0x93,0xff,0xd3,0x00,0x8e,0x00,0x94,0xff,0xd3,0x00,0x8f,0x00,0x95,0xff,0xd2,
-0x00,0x90,0x00,0x96,0xff,0xd2,0x00,0x91,0x00,0x97,0xff,0xd2,0x00,0x92,0x00,0x99,
-0xff,0xd1,0x00,0x93,0x00,0x9a,0xff,0xd1,0x00,0x94,0x00,0x9b,0xff,0xd1,0x00,0x95,
-0x00,0x9c,0xff,0xd0,0x00,0x96,0x00,0x9d,0xff,0xd0,0x00,0x97,0x00,0x9e,0xff,0xd0,
-0x00,0x98,0x00,0x9f,0xff,0xcf,0x00,0x99,0x00,0xa0,0xff,0xcf,0x00,0x9a,0x00,0xa1,
-0xff,0xcf,0x00,0x9b,0x00,0xa2,0xff,0xce,0x00,0x9c,0x00,0xa3,0xff,0xce,0x00,0x9d,
-0x00,0xa4,0xff,0xce,0x00,0x9e,0x00,0xa5,0xff,0xcd,0x00,0x9f,0x00,0xa6,0xff,0xcd,
-0x00,0xa0,0x00,0xa7,0xff,0xcd,0x00,0xa1,0x00,0xa8,0xff,0xcd,0x00,0xa2,0x00,0xa9,
-0xff,0xcc,0x00,0xa3,0x00,0xaa,0xff,0xcc,0x00,0xa4,0x00,0xab,0xff,0xcc,0x00,0xa5,
-0x00,0xac,0xff,0xcb,0x00,0xa6,0x00,0xad,0xff,0xcb,0x00,0xa7,0x00,0xae,0xff,0xcb,
-0x00,0xa8,0x00,0xaf,0xff,0xca,0x00,0xa9,0x00,0xb0,0xff,0xca,0x00,0xaa,0x00,0xb2,
-0xff,0xca,0x00,0xab,0x00,0xb3,0xff,0xc9,0x00,0xac,0x00,0xb4,0xff,0xc9,0x00,0xad,
-0x00,0xb5,0xff,0xc9,0x00,0xae,0x00,0xb6,0xff,0xc8,0x00,0xaf,0x00,0xb7,0xff,0xc8,
-0x00,0xb0,0x00,0xb8,0xff,0xc8,0x00,0xb1,0x00,0xb9,0xff,0xc7,0x00,0xb2,0x00,0xba,
-0xff,0xc7,0x00,0xb3,0x00,0xbb,0xff,0xc7,0x00,0xb4,0x00,0xbc,0xff,0xc6,0x00,0xb5,
-0x00,0xbd,0xff,0xc6,0x00,0xb6,0x00,0xbe,0xff,0xc6,0x00,0xb7,0x00,0xbf,0xff,0xc6,
-0x00,0xb8,0x00,0xc0,0xff,0xc5,0x00,0xb9,0x00,0xc1,0xff,0xc5,0x00,0xba,0x00,0xc2,
-0xff,0xc5,0x00,0xbb,0x00,0xc3,0xff,0xc4,0x00,0xbc,0x00,0xc4,0xff,0xc4,0x00,0xbd,
-0x00,0xc5,0xff,0xc4,0x00,0xbe,0x00,0xc6,0xff,0xc3,0x00,0xbf,0x00,0xc7,0xff,0xc3,
-0x00,0xc0,0x00,0xc8,0xff,0xc3,0x00,0xc1,0x00,0xc9,0xff,0xc2,0x00,0xc2,0x00,0xcb,
-0xff,0xc2,0x00,0xc3,0x00,0xcc,0xff,0xc2,0x00,0xc4,0x00,0xcd,0xff,0xc1,0x00,0xc5,
-0x00,0xce,0xff,0xc1,0x00,0xc6,0x00,0xcf,0xff,0xc1,0x00,0xc7,0x00,0xd0,0xff,0xc0,
-0x00,0xc8,0x00,0xd1,0xff,0xc0,0x00,0xc9,0x00,0xd2,0xff,0xc0,0x00,0xca,0x00,0xd3,
-0xff,0xc0,0x00,0xcb,0x00,0xd4,0xff,0xbf,0x00,0xcc,0x00,0xd5,0xff,0xbf,0x00,0xcd,
-0x00,0xd6,0xff,0xbf,0x00,0xce,0x00,0xd7,0xff,0xbe,0x00,0xcf,0x00,0xd8,0xff,0xbe,
-0x00,0xd0,0x00,0xd9,0xff,0xbe,0x00,0xd1,0x00,0xda,0xff,0xbd,0x00,0xd2,0x00,0xdb,
-0xff,0xbd,0x00,0xd3,0x00,0xdc,0xff,0xbd,0x00,0xd4,0x00,0xdd,0xff,0xbc,0x00,0xd5,
-0x00,0xde,0xff,0xbc,0x00,0xd6,0x00,0xdf,0xff,0xbc,0x00,0xd7,0x00,0xe0,0xff,0xbb,
-0x00,0xd8,0x00,0xe1,0xff,0xbb,0x00,0xd9,0x00,0xe2,0xff,0xbb,0x00,0xda,0x00,0xe4,
-0xff,0xba,0x00,0xdb,0x00,0xe5,0xff,0xba,0x00,0xdc,0x00,0xe6,0xff,0xba,0x00,0xdd,
-0x00,0xe7,0xff,0xba,0x00,0xde,0x00,0xe8,0xff,0xb9,0x00,0xdf,0x00,0xe9,0xff,0xb9,
-0x00,0xe0,0x00,0xea,0xff,0xb9,0x00,0xe1,0x00,0xeb,0xff,0xb8,0x00,0xe2,0x00,0xec,
-0xff,0xb8,0x00,0xe3,0x00,0xed,0xff,0xb8,0x00,0xe4,0x00,0xee,0xff,0xb7,0x00,0xe5,
-0x00,0xef,0xff,0xb7,0x00,0xe6,0x00,0xf0,0xff,0xb7,0x00,0xe7,0x00,0xf1,0xff,0xb6,
-0x00,0xe8,0x00,0xf2,0xff,0xb6,0x00,0xe9,0x00,0xf3,0xff,0xb6,0x00,0xea,0x00,0xf4,
-0xff,0xb5,0x00,0xeb,0x00,0xf5,0xff,0xb5,0x00,0xec,0x00,0xf6,0xff,0xb5,0x00,0xed,
-0x00,0xf7,0xff,0xb4,0x00,0xee,0x00,0xf8,0xff,0xb4,0x00,0xef,0x00,0xf9,0xff,0xb4,
-0x00,0xf0,0x00,0xfa,0xff,0xb3,0x00,0xf1,0x00,0xfb,0xff,0xb3,0x00,0xf2,0x00,0xfd,
-0xff,0xb3,0x00,0xf3,0x00,0xfe,0xff,0xb3,0x00,0xf4,0x00,0xff,0xff,0xb2,0x00,0xf5,
-0x01,0x00,0xff,0xb2,0x00,0xf6,0x01,0x01,0xff,0xb2,0x00,0xf7,0x01,0x02,0xff,0xb1,
-0x00,0xf8,0x01,0x03,0xff,0xb1,0x00,0xf9,0x01,0x04,0xff,0xb1,0x00,0xfa,0x01,0x05,
-0xff,0xb0,0x00,0xfb,0x01,0x06,0xff,0xb0,0x00,0xfc,0x01,0x07,0xff,0xb0,0x00,0xfd,
-0x01,0x08,0xff,0xaf,0x00,0xfe,0x01,0x09,0xff,0xaf,0x00,0xff,0x01,0x0a,0xff,0xaf,
-0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x03,0x00,0x01,
-0x00,0x00,0x01,0x1a,0x00,0x00,0x01,0x06,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x03,0x04,0x05,0x06,0x07,0x08,
-0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,
-0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,
-0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,
-0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,
-0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,
-0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x61,0x00,0xa1,0xa2,0xa4,0xa6,0xae,0xb3,
-0xb9,0xbe,0xbd,0xbf,0xc1,0xc0,0xc2,0xc4,0xc6,0xc5,0xc7,0xc8,0xca,0xc9,0xcb,0xcc,
-0xce,0xd0,0xcf,0xd1,0xd3,0xd2,0xd7,0xd6,0xd8,0xd9,0x67,0x8d,0x7f,0x80,0x84,0x73,
-0x93,0xbc,0x8b,0x86,0x77,0x91,0x85,0x00,0xa3,0xb5,0x00,0x8e,0x00,0x00,0x82,0x92,
-0x00,0x00,0x00,0x00,0x00,0x87,0x97,0x00,0xc3,0xd5,0x9c,0x7e,0x89,0x00,0x64,0x00,
-0x00,0x88,0x98,0x66,0x03,0x9d,0xa0,0xb2,0x6d,0x7a,0x74,0x75,0x71,0x72,0x6f,0x70,
-0xd4,0x00,0xdc,0x7c,0x00,0x81,0x6c,0x79,0x00,0x00,0x68,0x94,0x63,0x65,0x6a,0x9f,
-0xa7,0x9e,0xa8,0xa5,0xaa,0xab,0xac,0xa9,0xb0,0xb1,0x00,0xaf,0xb7,0xb8,0xb6,0x00,
-0x69,0x76,0x8c,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x00,0x04,0x00,0xd2,0x00,0x00,
-0x00,0x28,0x00,0x20,0x00,0x04,0x00,0x08,0x00,0x7e,0x00,0xff,0x01,0x53,0x01,0x61,
-0x01,0x78,0x01,0x7e,0x01,0x92,0x02,0xc6,0x02,0xdc,0x20,0x10,0x20,0x14,0x20,0x1a,
-0x20,0x1e,0x20,0x22,0x20,0x26,0x20,0x30,0x20,0x3a,0x20,0xac,0x21,0x22,0xff,0xff,
-0x00,0x00,0x00,0x20,0x00,0xa0,0x01,0x52,0x01,0x60,0x01,0x78,0x01,0x7d,0x01,0x92,
-0x02,0xc6,0x02,0xdc,0x20,0x10,0x20,0x13,0x20,0x18,0x20,0x1c,0x20,0x20,0x20,0x26,
-0x20,0x30,0x20,0x39,0x20,0xac,0x21,0x22,0xff,0xff,0xff,0xe3,0xff,0xdd,0x00,0x00,
-0x00,0x00,0xff,0x04,0x00,0x00,0xfe,0xd2,0xfd,0xa3,0xfd,0x9a,0xe0,0xcd,0xe0,0x61,
-0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x40,0xe0,0x3a,0x00,0x00,0xdf,0xb6,0xdf,0x55,
-0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x24,0x00,0x26,0x00,0x00,0x00,0x26,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x22,0x00,0x26,0x00,0x00,
-0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x00,0x7a,0x00,0x6b,
-0x00,0x78,0x00,0x6e,0x00,0x7b,0x00,0x6f,0x00,0x70,0x00,0x63,0x00,0x71,0x00,0x72,
-0x00,0x65,0x00,0x67,0x00,0x68,0x00,0x73,0x00,0x6c,0x00,0x79,0xfe,0xf6,0xff,0xff,
-0x02,0x12,0x03,0x1e,0x01,0x0a,0x00,0x85,0x00,0x85,0x01,0x0a,0x02,0x14,0x01,0x8f,
-0x01,0x90,0x5b,0xe2,0x18,0x8d,0xef,0x28,0x7d,0xa3,0xe5,0x5b,0x9d,0xbb,0xf4,0x8a,
-0x3f,0xd5,0x78,0x05,0x21,0x30,0xbb,0xd3,0x1c,0x62,0x38,0x05,0xa3,0xad,0x4d,0x2d,
-0x8d,0x2d,0xb5,0x1d,0xf5,0x6f,0xc6,0xb6,0x18,0xe8,0x7d,0xa6,0x1f,0x5b,0xba,0x99,
-0x64,0x84,0x10,0x5c,0xb3,0x80,0x02,0xa4,0xe4,0x47,0x8e,0xee,0x6e,0xd5,0x20,0x67,
-0xd9,0xbd,0x05,0xe1,0x60,0xa7,0x04,0x49,0xae,0xaf,0x6e,0x82,0x0e,0x7f,0xa2,0x10,
-0x2f,0x8b,0xd4,0x3a,0x75,0x9c,0x33,0xb3,0xd2,0x3f,0x45,0xd8,0xe8,0x47,0x7c,0xef,
-0x19,0x9d,0xc2,0x55,0x2c,0xa4,0x7a,0xe6,0x38,0x87,0xd3,0x20,0x4a,0xc2,0xe2,0x68,
-0x99,0xac,0x44,0xe2,0xe9,0x8e,0x9f,0x0d,0x3a,0xeb,0xe5,0x48,0x8a,0x3e,0x2d,0xcc,
-0xa7,0x57,0x5f,0xe3,0x80,0xa2,0xf1,0x8d,0xc8,0xd5,0x0b,0x7c,0x3e,0x14,0xa9,0xc8,
-0x6b,0x6c,0x0a,0x0f,0xa4,0xa6,0x35,0x38,0x1d,0x7b,0x74,0x4a,0xbf,0x95,0x87,0xc5,
-0xa1,0x70,0x3b,0x13,0x9b,0xa2,0xb8,0x45,0x23,0xed,0xca,0xed,0x0c,0xed,0x44,0x8c,
-0x25,0x3e,0xbc,0x9e,0x4a,0xac,0xd2,0x39,0x78,0xca,0xa1,0x58,0xce,0x80,0x69,0xaf,
-0xff,0x01,0x00,0x04,0x00,0x62,0x00,0x16,0x00,0x16,0x00,0x16,0x40,0x01,0x00,0x2c,
-0x76,0x45,0x20,0xb0,0x03,0x25,0x45,0x23,0x61,0x68,0x18,0x23,0x68,0x60,0x44,0x2d,
-0xb8,0x00,0x0a,0x2c,0x4b,0xb8,0x00,0x09,0x50,0x58,0xb1,0x01,0x01,0x8e,0x59,0xb8,
-0x01,0xff,0x85,0xb8,0x00,0x44,0x1d,0xb9,0x00,0x09,0x00,0x03,0x5f,0x5e,0x2d,0xb8,
-0x00,0x0b,0x2c,0x20,0x20,0x45,0x69,0x44,0xb0,0x01,0x60,0x2d,0xb8,0x00,0x0c,0x2c,
-0xb8,0x00,0x0b,0x2a,0x21,0x2d,0xb8,0x00,0x0d,0x2c,0x20,0x46,0xb0,0x03,0x25,0x46,
-0x52,0x58,0x23,0x59,0x20,0x8a,0x20,0x8a,0x49,0x64,0x8a,0x20,0x46,0x20,0x68,0x61,
-0x64,0xb0,0x04,0x25,0x46,0x20,0x68,0x61,0x64,0x52,0x58,0x23,0x65,0x8a,0x59,0x2f,
-0x20,0xb0,0x00,0x53,0x58,0x69,0x20,0xb0,0x00,0x54,0x58,0x21,0xb0,0x40,0x59,0x1b,
-0x69,0x20,0xb0,0x00,0x54,0x58,0x21,0xb0,0x40,0x65,0x59,0x59,0x3a,0x2d,0xb8,0x00,
-0x0e,0x2c,0x20,0x46,0xb0,0x04,0x25,0x46,0x52,0x58,0x23,0x8a,0x59,0x20,0x46,0x20,
-0x6a,0x61,0x64,0xb0,0x04,0x25,0x46,0x20,0x6a,0x61,0x64,0x52,0x58,0x23,0x8a,0x59,
-0x2f,0xfd,0x2d,0xb8,0x00,0x0f,0x2c,0x4b,0x20,0xb0,0x03,0x26,0x50,0x58,0x51,0x58,
-0xb0,0x80,0x44,0x1b,0xb0,0x40,0x44,0x59,0x1b,0x21,0x21,0x20,0x45,0xb0,0xc0,0x50,
-0x58,0xb0,0xc0,0x44,0x1b,0x21,0x59,0x59,0x2d,0xb8,0x00,0x10,0x2c,0x20,0x20,0x45,
-0x69,0x44,0xb0,0x01,0x60,0x20,0x20,0x45,0x7d,0x69,0x18,0x44,0xb0,0x01,0x60,0x2d,
-0xb8,0x00,0x11,0x2c,0xb8,0x00,0x10,0x2a,0x2d,0xb8,0x00,0x12,0x2c,0x4b,0x20,0xb0,
-0x03,0x26,0x53,0x58,0xb0,0x80,0x1b,0xb0,0x40,0x59,0x8a,0x8a,0x20,0xb0,0x03,0x26,
-0x53,0x58,0xb0,0x02,0x26,0x21,0xb0,0xc0,0x8a,0x8a,0x1b,0x8a,0x23,0x59,0x20,0xb0,
-0x03,0x26,0x53,0x58,0x23,0x21,0xb8,0x01,0x00,0x8a,0x8a,0x1b,0x8a,0x23,0x59,0x20,
-0xb8,0x00,0x03,0x26,0x53,0x58,0xb0,0x03,0x25,0x45,0xb8,0x01,0x40,0x50,0x58,0x23,
-0x21,0xb8,0x01,0x40,0x23,0x21,0x1b,0xb0,0x03,0x25,0x45,0x23,0x21,0x23,0x21,0x59,
-0x1b,0x21,0x59,0x44,0x2d,0xb8,0x00,0x13,0x2c,0x4b,0x53,0x58,0x45,0x44,0x1b,0x21,
-0x21,0x59,0x2d,0xb8,0x00,0x14,0x2c,0x4b,0xb8,0x00,0x09,0x50,0x58,0xb1,0x01,0x01,
-0x8e,0x59,0xb8,0x01,0xff,0x85,0xb8,0x00,0x44,0x1d,0xb9,0x00,0x09,0x00,0x03,0x5f,
-0x5e,0x2d,0xb8,0x00,0x15,0x2c,0x20,0x20,0x45,0x69,0x44,0xb0,0x01,0x60,0x2d,0xb8,
-0x00,0x16,0x2c,0xb8,0x00,0x15,0x2a,0x21,0x2d,0xb8,0x00,0x17,0x2c,0x20,0x46,0xb0,
-0x03,0x25,0x46,0x52,0x58,0x23,0x59,0x20,0x8a,0x20,0x8a,0x49,0x64,0x8a,0x20,0x46,
-0x20,0x68,0x61,0x64,0xb0,0x04,0x25,0x46,0x20,0x68,0x61,0x64,0x52,0x58,0x23,0x65,
-0x8a,0x59,0x2f,0x20,0xb0,0x00,0x53,0x58,0x69,0x20,0xb0,0x00,0x54,0x58,0x21,0xb0,
-0x40,0x59,0x1b,0x69,0x20,0xb0,0x00,0x54,0x58,0x21,0xb0,0x40,0x65,0x59,0x59,0x3a,
-0x2d,0xb8,0x00,0x18,0x2c,0x20,0x46,0xb0,0x04,0x25,0x46,0x52,0x58,0x23,0x8a,0x59,
-0x20,0x46,0x20,0x6a,0x61,0x64,0xb0,0x04,0x25,0x46,0x20,0x6a,0x61,0x64,0x52,0x58,
-0x23,0x8a,0x59,0x2f,0xfd,0x2d,0xb8,0x00,0x19,0x2c,0x4b,0x20,0xb0,0x03,0x26,0x50,
-0x58,0x51,0x58,0xb0,0x80,0x44,0x1b,0xb0,0x40,0x44,0x59,0x1b,0x21,0x21,0x20,0x45,
-0xb0,0xc0,0x50,0x58,0xb0,0xc0,0x44,0x1b,0x21,0x59,0x59,0x2d,0xb8,0x00,0x1a,0x2c,
-0x20,0x20,0x45,0x69,0x44,0xb0,0x01,0x60,0x20,0x20,0x45,0x7d,0x69,0x18,0x44,0xb0,
-0x01,0x60,0x2d,0xb8,0x00,0x1b,0x2c,0xb8,0x00,0x1a,0x2a,0x2d,0xb8,0x00,0x1c,0x2c,
-0x4b,0x20,0xb0,0x03,0x26,0x53,0x58,0xb0,0x80,0x1b,0xb0,0x40,0x59,0x8a,0x8a,0x20,
-0xb0,0x03,0x26,0x53,0x58,0xb0,0x02,0x26,0x21,0xb0,0xc0,0x8a,0x8a,0x1b,0x8a,0x23,
-0x59,0x20,0xb0,0x03,0x26,0x53,0x58,0x23,0x21,0xb8,0x01,0x00,0x8a,0x8a,0x1b,0x8a,
-0x23,0x59,0x20,0xb8,0x00,0x03,0x26,0x53,0x58,0xb0,0x03,0x25,0x45,0xb8,0x01,0x40,
-0x50,0x58,0x23,0x21,0xb8,0x01,0x40,0x23,0x21,0x1b,0xb0,0x03,0x25,0x45,0x23,0x21,
-0x23,0x21,0x59,0x1b,0x21,0x59,0x44,0x2d,0xb8,0x00,0x1d,0x2c,0x4b,0x53,0x58,0x45,
-0x44,0x1b,0x21,0x21,0x59,0x2d,0xb8,0x00,0x1e,0x2c,0x4b,0xb8,0x00,0x09,0x50,0x58,
-0xb1,0x01,0x01,0x8e,0x59,0xb8,0x01,0xff,0x85,0xb8,0x00,0x44,0x1d,0xb9,0x00,0x09,
-0x00,0x03,0x5f,0x5e,0x2d,0xb8,0x00,0x1f,0x2c,0x20,0x20,0x45,0x69,0x44,0xb0,0x01,
-0x60,0x2d,0xb8,0x00,0x20,0x2c,0xb8,0x00,0x1f,0x2a,0x21,0x2d,0xb8,0x00,0x21,0x2c,
-0x20,0x46,0xb0,0x03,0x25,0x46,0x52,0x58,0x23,0x59,0x20,0x8a,0x20,0x8a,0x49,0x64,
-0x8a,0x20,0x46,0x20,0x68,0x61,0x64,0xb0,0x04,0x25,0x46,0x20,0x68,0x61,0x64,0x52,
-0x58,0x23,0x65,0x8a,0x59,0x2f,0x20,0xb0,0x00,0x53,0x58,0x69,0x20,0xb0,0x00,0x54,
-0x58,0x21,0xb0,0x40,0x59,0x1b,0x69,0x20,0xb0,0x00,0x54,0x58,0x21,0xb0,0x40,0x65,
-0x59,0x59,0x3a,0x2d,0xb8,0x00,0x22,0x2c,0x20,0x46,0xb0,0x04,0x25,0x46,0x52,0x58,
-0x23,0x8a,0x59,0x20,0x46,0x20,0x6a,0x61,0x64,0xb0,0x04,0x25,0x46,0x20,0x6a,0x61,
-0x64,0x52,0x58,0x23,0x8a,0x59,0x2f,0xfd,0x2d,0xb8,0x00,0x23,0x2c,0x4b,0x20,0xb0,
-0x03,0x26,0x50,0x58,0x51,0x58,0xb0,0x80,0x44,0x1b,0xb0,0x40,0x44,0x59,0x1b,0x21,
-0x21,0x20,0x45,0xb0,0xc0,0x50,0x58,0xb0,0xc0,0x44,0x1b,0x21,0x59,0x59,0x2d,0xb8,
-0x00,0x24,0x2c,0x20,0x20,0x45,0x69,0x44,0xb0,0x01,0x60,0x20,0x20,0x45,0x7d,0x69,
-0x18,0x44,0xb0,0x01,0x60,0x2d,0xb8,0x00,0x25,0x2c,0xb8,0x00,0x24,0x2a,0x2d,0xb8,
-0x00,0x26,0x2c,0x4b,0x20,0xb0,0x03,0x26,0x53,0x58,0xb0,0x80,0x1b,0xb0,0x40,0x59,
-0x8a,0x8a,0x20,0xb0,0x03,0x26,0x53,0x58,0xb0,0x02,0x26,0x21,0xb0,0xc0,0x8a,0x8a,
-0x1b,0x8a,0x23,0x59,0x20,0xb0,0x03,0x26,0x53,0x58,0x23,0x21,0xb8,0x01,0x00,0x8a,
-0x8a,0x1b,0x8a,0x23,0x59,0x20,0xb8,0x00,0x03,0x26,0x53,0x58,0xb0,0x03,0x25,0x45,
-0xb8,0x01,0x40,0x50,0x58,0x23,0x21,0xb8,0x01,0x40,0x23,0x21,0x1b,0xb0,0x03,0x25,
-0x45,0x23,0x21,0x23,0x21,0x59,0x1b,0x21,0x59,0x44,0x2d,0xb8,0x00,0x27,0x2c,0x4b,
-0x53,0x58,0x45,0x44,0x1b,0x21,0x21,0x59,0x2d,0x00,0x00,0x00,0x00,0x02,0x00,0x43,
-0x00,0x00,0x01,0xd2,0x03,0x1e,0x00,0x03,0x00,0x07,0x00,0x57,0x40,0x21,0x01,0x08,
-0x08,0x40,0x09,0x02,0x07,0x04,0x05,0x01,0x00,0x06,0x05,0x05,0x03,0x02,0x05,0x04,
-0x06,0x00,0x07,0x06,0x06,0x01,0x02,0x01,0x03,0x03,0x00,0x01,0x01,0x00,0x46,0x76,
-0x2f,0x37,0x18,0x00,0x3f,0x3c,0x3f,0x3c,0x10,0xfd,0x3c,0x10,0xfd,0x3c,0x01,0x2f,
-0x3c,0xfd,0x3c,0x2f,0x3c,0xfd,0x3c,0x00,0x31,0x30,0x01,0x49,0x68,0xb9,0x00,0x00,
-0x00,0x08,0x49,0x68,0x61,0xb0,0x40,0x52,0x58,0x38,0x11,0x37,0xb9,0x00,0x08,0xff,
-0xc0,0x38,0x59,0x33,0x11,0x21,0x11,0x25,0x21,0x11,0x21,0x43,0x01,0x8f,0xfe,0xb3,
-0x01,0x0a,0xfe,0xf6,0x03,0x1e,0xfc,0xe2,0x43,0x02,0x99,0x00,0x00,0x02,0x00,0x00,
-0x00,0x00,0x00,0xc4,0x03,0x0e,0x00,0x03,0x00,0x07,0x00,0x33,0xb8,0x00,0x1e,0x2b,
-0xba,0x00,0x03,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x03,0x10,0xb8,0x00,0x00,0x10,
-0xb8,0x00,0x04,0xd0,0xb8,0x00,0x03,0x10,0xb8,0x00,0x06,0xd0,0x00,0xb8,0x00,0x00,
-0x2f,0xba,0x00,0x04,0x00,0x05,0x00,0x21,0x2b,0xb8,0x00,0x04,0x10,0x30,0x31,0x19,
-0x01,0x33,0x11,0x03,0x15,0x33,0x35,0xc4,0xc4,0xc4,0x03,0x0e,0xfd,0xf5,0x02,0x0b,
-0xfd,0x73,0x81,0x81,0x00,0x02,0x00,0x00,0x01,0x03,0x01,0xe8,0x03,0x0e,0x00,0x07,
-0x00,0x0f,0x00,0x67,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x07,0x00,0x00,0x00,0x21,0x2b,
-0xb8,0x00,0x07,0x10,0xba,0x00,0x0f,0x00,0x08,0x00,0x21,0x2b,0xb8,0x00,0x0f,0x10,
-0xba,0x00,0x02,0x00,0x00,0x00,0x07,0x11,0x12,0x39,0xb8,0x00,0x00,0x10,0xb8,0x00,
-0x03,0xd0,0xba,0x00,0x0a,0x00,0x08,0x00,0x0f,0x11,0x12,0x39,0xb8,0x00,0x08,0x10,
-0xb8,0x00,0x0b,0xd0,0x00,0xb8,0x00,0x04,0x2f,0xb8,0x00,0x0c,0x2f,0xb8,0x00,0x00,
-0x2f,0xb8,0x00,0x08,0x2f,0xba,0x00,0x02,0x00,0x04,0x00,0x00,0x11,0x12,0x39,0xba,
-0x00,0x0a,0x00,0x04,0x00,0x00,0x11,0x12,0x39,0x30,0x31,0x19,0x01,0x33,0x07,0x15,
-0x33,0x37,0x11,0x33,0x11,0x33,0x07,0x15,0x33,0x37,0x11,0x61,0x61,0x61,0x63,0x61,
-0x61,0x61,0x61,0x62,0x03,0x0e,0xfe,0xf9,0x82,0x82,0x82,0x01,0x89,0xfe,0xf9,0x82,
-0x82,0x82,0x01,0x89,0x00,0x02,0x00,0x00,0x00,0x83,0x01,0xe8,0x03,0x0f,0x00,0x1b,
-0x00,0x1f,0x00,0xc7,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x1c,0x00,0x02,0x00,0x21,0x2b,
-0xb8,0x00,0x1c,0x10,0xba,0x00,0x0d,0x00,0x0a,0x00,0x21,0x2b,0xb8,0x00,0x0d,0x10,
-0xb8,0x00,0x02,0x10,0xb8,0x00,0x06,0xd0,0xb8,0x00,0x1c,0x10,0xb8,0x00,0x08,0xd0,
-0xb8,0x00,0x0d,0x10,0xb8,0x00,0x10,0xd0,0xb8,0x00,0x0d,0x10,0xb8,0x00,0x14,0xd0,
-0xb8,0x00,0x0a,0x10,0xb8,0x00,0x16,0xd0,0xb8,0x00,0x1c,0x10,0xb8,0x00,0x18,0xd0,
-0xb8,0x00,0x02,0x10,0xb8,0x00,0x1a,0xd0,0xb8,0x00,0x0a,0x10,0xb8,0x00,0x1d,0xd0,
-0x00,0xb8,0x00,0x15,0x2f,0xb8,0x00,0x19,0x2f,0xb8,0x00,0x07,0x2f,0xb8,0x00,0x0b,
-0x2f,0xba,0x00,0x04,0x00,0x05,0x00,0x21,0x2b,0xb8,0x00,0x04,0x10,0xba,0x00,0x00,
-0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x00,0x10,0xb8,0x00,0x05,0x10,0xb8,0x00,0x09,
-0xd0,0xb8,0x00,0x05,0x10,0xb8,0x00,0x0d,0xd0,0xb8,0x00,0x04,0x10,0xb8,0x00,0x0f,
-0xd0,0xb8,0x00,0x01,0x10,0xb8,0x00,0x11,0xd0,0xb8,0x00,0x00,0x10,0xb8,0x00,0x13,
-0xd0,0xb8,0x00,0x00,0x10,0xb8,0x00,0x17,0xd0,0xb8,0x00,0x01,0x10,0xb8,0x00,0x1c,
-0xd0,0xb8,0x00,0x04,0x10,0xb8,0x00,0x1e,0xd0,0x30,0x31,0x11,0x15,0x33,0x15,0x23,
-0x15,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x23,
-0x35,0x23,0x15,0x23,0x35,0x23,0x15,0x17,0x33,0x15,0x23,0x61,0x61,0x61,0x63,0x61,
-0x61,0x62,0x62,0x62,0x62,0x61,0x61,0x63,0x63,0x61,0x61,0x02,0x8b,0x83,0x82,0x82,
-0x81,0x81,0x81,0x81,0x82,0x82,0x83,0x84,0x84,0x84,0x84,0x83,0x82,0x00,0x00,0x01,
-0x00,0x00,0xff,0x7c,0x01,0xe8,0x03,0x0e,0x00,0x17,0x00,0x8b,0xb8,0x00,0x1e,0x2b,
-0xba,0x00,0x13,0x00,0x03,0x00,0x21,0x2b,0xb8,0x00,0x13,0x10,0xba,0x00,0x10,0x00,
-0x06,0x00,0x21,0x2b,0xb8,0x00,0x10,0x10,0xb8,0x00,0x13,0x10,0xb8,0x00,0x00,0xd0,
-0xb8,0x00,0x13,0x10,0xb8,0x00,0x0a,0xd0,0xb8,0x00,0x06,0x10,0xb8,0x00,0x0c,0xd0,
-0xb8,0x00,0x06,0x10,0xb8,0x00,0x16,0xd0,0x00,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x0b,
-0x2f,0xba,0x00,0x08,0x00,0x09,0x00,0x21,0x2b,0xb8,0x00,0x08,0x10,0xba,0x00,0x02,
-0x00,0x03,0x00,0x21,0x2b,0xb8,0x00,0x02,0x10,0xba,0x00,0x04,0x00,0x05,0x00,0x21,
-0x2b,0xb8,0x00,0x04,0x10,0xb8,0x00,0x09,0x10,0xb8,0x00,0x0d,0xd0,0xb8,0x00,0x04,
-0x10,0xb8,0x00,0x11,0xd0,0xb8,0x00,0x03,0x10,0xb8,0x00,0x13,0xd0,0xb8,0x00,0x02,
-0x10,0xb8,0x00,0x15,0xd0,0x30,0x31,0x13,0x15,0x23,0x07,0x15,0x17,0x33,0x15,0x23,
-0x15,0x33,0x15,0x33,0x35,0x33,0x37,0x35,0x27,0x23,0x35,0x33,0x35,0x23,0x35,0xc4,
-0x63,0x61,0x61,0xc4,0xc4,0x63,0x61,0x61,0x62,0x62,0xc2,0xc2,0x61,0x03,0x0e,0x83,
-0x84,0x82,0x82,0x82,0x81,0x84,0x84,0x81,0x82,0x82,0x82,0x84,0x83,0x00,0x00,0x05,
-0x00,0x00,0x00,0x00,0x02,0x68,0x03,0x0f,0x00,0x03,0x00,0x0b,0x00,0x0f,0x00,0x17,
-0x00,0x1b,0x00,0x4b,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x0c,0x00,0x04,0x00,0x21,0x2b,
-0xb8,0x00,0x0c,0x10,0xba,0x00,0x09,0x00,0x0d,0x00,0x21,0x2b,0xb8,0x00,0x09,0x10,
-0xba,0x00,0x18,0x00,0x10,0x00,0x21,0x2b,0xb8,0x00,0x18,0x10,0xba,0x00,0x15,0x00,
-0x19,0x00,0x21,0x2b,0xb8,0x00,0x15,0x10,0xb8,0x00,0x1d,0xdc,0x00,0xb8,0x00,0x00,
-0x2f,0xb8,0x00,0x0a,0x2f,0xb8,0x00,0x01,0x2f,0xb8,0x00,0x12,0x2f,0x30,0x31,0x01,
-0x03,0x33,0x13,0x05,0x15,0x17,0x33,0x37,0x35,0x27,0x23,0x17,0x33,0x15,0x23,0x05,
-0x15,0x17,0x33,0x37,0x35,0x27,0x23,0x17,0x33,0x15,0x23,0x01,0x63,0xc2,0x60,0xc4,
-0xfe,0x3b,0x31,0x93,0x30,0x30,0x93,0x30,0x31,0x31,0x01,0x12,0x31,0x93,0x31,0x31,
-0x93,0x32,0x30,0x30,0x03,0x0e,0xfc,0xf2,0x03,0x0e,0x60,0xc1,0x61,0x61,0xc1,0x61,
-0x66,0xa4,0xe4,0xc1,0x60,0x60,0xc1,0x62,0x66,0xa4,0x00,0x02,0x00,0x00,0x00,0x00,
-0x01,0xe8,0x03,0x0e,0x00,0x0d,0x00,0x11,0x00,0x79,0xb8,0x00,0x1e,0x2b,0xba,0x00,
-0x0c,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x0c,0x10,0xba,0x00,0x0a,0x00,0x0f,0x00,
-0x21,0x2b,0xb8,0x00,0x0a,0x10,0xba,0x00,0x04,0x00,0x02,0x00,0x0c,0x11,0x12,0x39,
-0xb8,0x00,0x02,0x10,0xb8,0x00,0x05,0xd0,0xb8,0x00,0x0c,0x10,0xb8,0x00,0x0e,0xd0,
-0x00,0xba,0x00,0x06,0x00,0x07,0x00,0x21,0x2b,0xb8,0x00,0x06,0x10,0xba,0x00,0x01,
-0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x01,0x10,0xba,0x00,0x03,0x00,0x05,0x00,0x21,
-0x2b,0xb8,0x00,0x03,0x10,0xb8,0x00,0x0a,0xd0,0xb8,0x00,0x02,0x10,0xb8,0x00,0x0c,
-0xd0,0xb8,0x00,0x05,0x10,0xb8,0x00,0x0e,0xd0,0xb8,0x00,0x06,0x10,0xb8,0x00,0x10,
-0xd0,0x30,0x31,0x01,0x21,0x07,0x15,0x17,0x23,0x11,0x17,0x21,0x37,0x11,0x21,0x35,
-0x33,0x03,0x33,0x11,0x23,0x01,0x86,0xfe,0xdb,0x61,0x61,0x61,0x61,0x01,0x25,0x62,
-0xfe,0xdc,0xc2,0xc2,0x61,0x61,0x03,0x0e,0x83,0x84,0x82,0xfe,0xfc,0x81,0x81,0x01,
-0x86,0x84,0xfe,0xfa,0xfe,0xfc,0x00,0x01,0x00,0x00,0x01,0x03,0x00,0xc4,0x03,0x0e,
-0x00,0x07,0x00,0x37,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x07,0x00,0x00,0x00,0x21,0x2b,
-0xb8,0x00,0x07,0x10,0xba,0x00,0x02,0x00,0x00,0x00,0x07,0x11,0x12,0x39,0xb8,0x00,
-0x00,0x10,0xb8,0x00,0x03,0xd0,0x00,0xb8,0x00,0x04,0x2f,0xb8,0x00,0x00,0x2f,0xba,
-0x00,0x02,0x00,0x04,0x00,0x00,0x11,0x12,0x39,0x30,0x31,0x19,0x01,0x33,0x07,0x15,
-0x33,0x37,0x11,0x61,0x61,0x61,0x63,0x03,0x0e,0xfe,0xf9,0x82,0x82,0x82,0x01,0x89,
-0x00,0x01,0x00,0x00,0xff,0x7c,0x01,0x25,0x03,0x0e,0x00,0x09,0x00,0x3b,0xb8,0x00,
-0x1e,0x2b,0xba,0x00,0x08,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x08,0x10,0x00,0xba,
-0x00,0x03,0x00,0x04,0x00,0x21,0x2b,0xb8,0x00,0x03,0x10,0xba,0x00,0x01,0x00,0x02,
-0x00,0x21,0x2b,0xb8,0x00,0x01,0x10,0xb8,0x00,0x03,0x10,0xb8,0x00,0x06,0xd0,0xb8,
-0x00,0x02,0x10,0xb8,0x00,0x08,0xd0,0x30,0x31,0x01,0x23,0x07,0x11,0x17,0x33,0x35,
-0x23,0x11,0x33,0x01,0x25,0xc4,0x61,0x61,0xc4,0x61,0x61,0x03,0x0e,0x83,0xfd,0x75,
-0x84,0x84,0x02,0x8b,0x00,0x01,0x00,0x00,0xff,0x7c,0x01,0x25,0x03,0x0e,0x00,0x09,
-0x00,0x2f,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x08,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,
-0x08,0x10,0xb8,0x00,0x0b,0xdc,0x00,0xba,0x00,0x04,0x00,0x05,0x00,0x21,0x2b,0xb8,
-0x00,0x04,0x10,0xba,0x00,0x00,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x00,0x10,0x30,
-0x31,0x11,0x15,0x33,0x11,0x23,0x15,0x33,0x37,0x11,0x27,0x61,0x61,0xc4,0x61,0x61,
-0x03,0x0e,0x83,0xfd,0x75,0x84,0x84,0x02,0x8b,0x83,0x00,0x01,0x00,0x00,0x01,0x91,
-0x01,0x25,0x03,0x1b,0x00,0x13,0x00,0xa3,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x13,0x00,
-0x00,0x00,0x21,0x2b,0xb8,0x00,0x13,0x10,0xb8,0x00,0x02,0xd0,0xb8,0x00,0x00,0x10,
-0xb8,0x00,0x04,0xd0,0xb8,0x00,0x13,0x10,0xb8,0x00,0x06,0xd0,0xb8,0x00,0x02,0x10,
-0xb8,0x00,0x07,0xd0,0xb8,0x00,0x13,0x10,0xb8,0x00,0x0d,0xdc,0xb8,0x00,0x08,0xd0,
-0xb8,0x00,0x0c,0x10,0xb8,0x00,0x09,0xd0,0xb8,0x00,0x0d,0x10,0xb8,0x00,0x0b,0xdc,
-0xb8,0x00,0x0e,0xd0,0xb8,0x00,0x0d,0x10,0xb8,0x00,0x10,0xd0,0xb8,0x00,0x0c,0x10,
-0xb8,0x00,0x11,0xd0,0x00,0xba,0x00,0x04,0x00,0x05,0x00,0x21,0x2b,0xb8,0x00,0x04,
-0x10,0xba,0x00,0x12,0x00,0x07,0x00,0x21,0x2b,0xb8,0x00,0x12,0x10,0xba,0x00,0x00,
-0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x00,0x10,0xb8,0x00,0x05,0x10,0xb8,0x00,0x09,
-0xd0,0xb8,0x00,0x04,0x10,0xb8,0x00,0x0b,0xd0,0xb8,0x00,0x01,0x10,0xb8,0x00,0x0d,
-0xd0,0xb8,0x00,0x00,0x10,0xb8,0x00,0x0f,0xd0,0x30,0x31,0x11,0x15,0x33,0x15,0x23,
-0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x23,0x35,0x33,0x35,0x23,0x15,0x23,0x35,0x61,
-0x61,0x61,0x60,0x64,0x64,0x64,0x64,0x60,0x03,0x1b,0x85,0x82,0x83,0x62,0x62,0x83,
-0x82,0x85,0x59,0x59,0x00,0x01,0x00,0x00,0x00,0x81,0x01,0x25,0x02,0x07,0x00,0x0b,
-0x00,0x43,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x05,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,
-0x05,0x10,0xb8,0x00,0x08,0xd0,0xb8,0x00,0x02,0x10,0xb8,0x00,0x0a,0xd0,0x00,0xb8,
-0x00,0x09,0x2f,0xb8,0x00,0x03,0x2f,0xba,0x00,0x00,0x00,0x01,0x00,0x21,0x2b,0xb8,
-0x00,0x00,0x10,0xb8,0x00,0x01,0x10,0xb8,0x00,0x05,0xd0,0xb8,0x00,0x00,0x10,0xb8,
-0x00,0x07,0xd0,0x30,0x31,0x11,0x15,0x33,0x15,0x33,0x35,0x33,0x35,0x23,0x35,0x23,
-0x15,0x61,0x63,0x61,0x61,0x63,0x01,0x85,0x82,0x82,0x82,0x82,0x82,0x82,0x00,0x01,
-0x00,0x00,0xfe,0xfb,0x00,0xc4,0x01,0x03,0x00,0x07,0x00,0x37,0xb8,0x00,0x1e,0x2b,
-0xba,0x00,0x07,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x07,0x10,0xba,0x00,0x02,0x00,
-0x00,0x00,0x07,0x11,0x12,0x39,0xb8,0x00,0x00,0x10,0xb8,0x00,0x03,0xd0,0x00,0xb8,
-0x00,0x04,0x2f,0xb8,0x00,0x00,0x2f,0xba,0x00,0x02,0x00,0x04,0x00,0x00,0x11,0x12,
-0x39,0x30,0x31,0x19,0x01,0x33,0x07,0x15,0x33,0x37,0x11,0x61,0x61,0x61,0x63,0x01,
-0x03,0xfe,0xfd,0x84,0x81,0x81,0x01,0x87,0x00,0x01,0x00,0x00,0x01,0x03,0x01,0x25,
-0x01,0x85,0x00,0x03,0x00,0x0f,0xb8,0x00,0x1e,0x2b,0x00,0xba,0x00,0x00,0x00,0x01,
-0x00,0x21,0x2b,0x30,0x31,0x11,0x15,0x21,0x35,0x01,0x25,0x01,0x85,0x82,0x82,0x00,
-0x00,0x01,0x00,0x00,0x00,0x00,0x00,0xc4,0x01,0x03,0x00,0x03,0x00,0x1b,0xb8,0x00,
-0x1e,0x2b,0xba,0x00,0x03,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x03,0x10,0x00,0xb8,
-0x00,0x00,0x2f,0xb8,0x00,0x01,0x2f,0x30,0x31,0x19,0x01,0x33,0x11,0xc4,0x01,0x03,
-0xfe,0xfd,0x01,0x03,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x25,0x03,0x0e,0x00,0x05,
-0x00,0x0f,0xb8,0x00,0x1e,0x2b,0x00,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x02,0x2f,0x30,
-0x31,0x13,0x03,0x11,0x33,0x13,0x11,0xc4,0xc4,0x61,0xc4,0x03,0x0e,0xfd,0xf5,0xfe,
-0xfd,0x02,0x07,0x01,0x07,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x01,0xe8,0x03,0x06,
-0x00,0x07,0x00,0x0b,0x00,0x2f,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x08,0x00,0x00,0x00,
-0x21,0x2b,0xb8,0x00,0x08,0x10,0xba,0x00,0x05,0x00,0x09,0x00,0x21,0x2b,0xb8,0x00,
-0x05,0x10,0x00,0xb8,0x00,0x02,0x2f,0xba,0x00,0x07,0x00,0x08,0x00,0x21,0x2b,0xb8,
-0x00,0x07,0x10,0x30,0x31,0x19,0x01,0x17,0x21,0x37,0x11,0x27,0x21,0x17,0x33,0x11,
-0x23,0x61,0x01,0x25,0x62,0x62,0xfe,0xdb,0x63,0x61,0x61,0x02,0x44,0xfe,0x7c,0xc0,
-0xc0,0x01,0x84,0xc2,0xcd,0xfe,0xb9,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x86,
-0x03,0x0f,0x00,0x0a,0x00,0x27,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x08,0x00,0x03,0x00,
-0x21,0x2b,0xb8,0x00,0x08,0x10,0x00,0xb8,0x00,0x09,0x2f,0xba,0x00,0x04,0x00,0x05,
-0x00,0x21,0x2b,0xb8,0x00,0x04,0x10,0xb8,0x00,0x07,0xd0,0x30,0x31,0x11,0x15,0x33,
-0x15,0x23,0x15,0x21,0x35,0x23,0x11,0x23,0x61,0x61,0x01,0x86,0x61,0xc4,0x02,0x4a,
-0xc4,0xc4,0xc2,0xc2,0x02,0x4d,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0xe8,0x03,0x0b,
-0x00,0x0f,0x00,0x69,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x04,0x00,0x05,0x00,0x21,0x2b,
-0xb8,0x00,0x04,0x10,0xba,0x00,0x0b,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x0b,0x10,
-0xb8,0x00,0x04,0x10,0xb8,0x00,0x00,0xd0,0xb8,0x00,0x0b,0x10,0xb8,0x00,0x07,0xd0,
-0xba,0x00,0x09,0x00,0x02,0x00,0x0b,0x11,0x12,0x39,0xb8,0x00,0x05,0x10,0xb8,0x00,
-0x0e,0xd0,0x00,0xba,0x00,0x05,0x00,0x06,0x00,0x21,0x2b,0xb8,0x00,0x05,0x10,0xba,
-0x00,0x0d,0x00,0x0e,0x00,0x21,0x2b,0xb8,0x00,0x0d,0x10,0xb8,0x00,0x0e,0x10,0xb8,
-0x00,0x01,0xd0,0xb8,0x00,0x05,0x10,0xb8,0x00,0x08,0xd0,0x30,0x31,0x13,0x35,0x33,
-0x15,0x07,0x23,0x15,0x21,0x35,0x23,0x37,0x35,0x27,0x21,0x07,0x15,0xc4,0x61,0x61,
-0xc4,0x01,0xe8,0x62,0x62,0x62,0xfe,0xdb,0x61,0x01,0x84,0xc3,0xc3,0xc3,0xc1,0xc1,
-0xc3,0xc3,0xc4,0xc4,0xc3,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0xe8,0x03,0x0e,
-0x00,0x15,0x00,0x71,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x08,0x00,0x09,0x00,0x21,0x2b,
-0xb8,0x00,0x08,0x10,0xba,0x00,0x11,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x11,0x10,
-0xb8,0x00,0x08,0x10,0xb8,0x00,0x00,0xd0,0xb8,0x00,0x08,0x10,0xb8,0x00,0x04,0xd0,
-0xb8,0x00,0x02,0x10,0xb8,0x00,0x05,0xd0,0xb8,0x00,0x11,0x10,0xb8,0x00,0x0d,0xd0,
-0xba,0x00,0x0f,0x00,0x02,0x00,0x11,0x11,0x12,0x39,0xb8,0x00,0x09,0x10,0xb8,0x00,
-0x14,0xd0,0x00,0xba,0x00,0x07,0x00,0x0b,0x00,0x21,0x2b,0xb8,0x00,0x07,0x10,0xba,
-0x00,0x13,0x00,0x14,0x00,0x21,0x2b,0xb8,0x00,0x13,0x10,0xb8,0x00,0x14,0x10,0xb8,
-0x00,0x01,0xd0,0x30,0x31,0x13,0x35,0x33,0x15,0x07,0x33,0x11,0x23,0x35,0x23,0x15,
-0x17,0x21,0x37,0x11,0x23,0x37,0x35,0x27,0x21,0x07,0x15,0xc4,0x61,0x61,0x61,0x61,
-0xc4,0x64,0x01,0x1f,0x65,0x62,0x62,0x62,0xfe,0xdb,0x61,0x02,0x09,0x82,0x82,0x83,
-0xfe,0xfc,0x85,0x85,0x82,0x82,0x01,0x04,0x83,0x82,0x83,0x83,0x82,0x00,0x00,0x01,
-0x00,0x00,0xff,0xfe,0x01,0xe8,0x03,0x0a,0x00,0x0d,0x00,0x4b,0xb8,0x00,0x1e,0x2b,
-0xba,0x00,0x00,0x00,0x01,0x00,0x21,0x2b,0xba,0x00,0x06,0x00,0x03,0x00,0x21,0x2b,
-0xb8,0x00,0x06,0x10,0xb8,0x00,0x09,0xd0,0xb8,0x00,0x03,0x10,0xb8,0x00,0x0b,0xd0,
-0x00,0xb8,0x00,0x0a,0x2f,0xb8,0x00,0x04,0x2f,0xba,0x00,0x0d,0x00,0x02,0x00,0x21,
-0x2b,0xb8,0x00,0x0d,0x10,0xb8,0x00,0x02,0x10,0xb8,0x00,0x06,0xd0,0xb8,0x00,0x0d,
-0x10,0xb8,0x00,0x08,0xd0,0x30,0x31,0x13,0x23,0x11,0x33,0x15,0x33,0x35,0x33,0x35,
-0x23,0x11,0x23,0x11,0x23,0x61,0x61,0xc4,0xc2,0x62,0x62,0xc2,0x63,0x02,0x05,0xfe,
-0x7a,0x81,0x81,0x84,0x02,0x07,0xfd,0xf9,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0xe8,
-0x03,0x0e,0x00,0x10,0x00,0x5b,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x0e,0x00,0x00,0x00,
-0x21,0x2b,0xb8,0x00,0x0e,0x10,0xba,0x00,0x0b,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,
-0x0b,0x10,0xb8,0x00,0x0e,0x10,0xb8,0x00,0x04,0xd0,0xb8,0x00,0x00,0x10,0xb8,0x00,
-0x06,0xd0,0xb8,0x00,0x0b,0x10,0xb8,0x00,0x0f,0xd0,0x00,0xba,0x00,0x04,0x00,0x08,
-0x00,0x21,0x2b,0xb8,0x00,0x04,0x10,0xba,0x00,0x00,0x00,0x0e,0x00,0x21,0x2b,0xb8,
-0x00,0x00,0x10,0xba,0x00,0x0d,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x0d,0x10,0x30,
-0x31,0x19,0x01,0x21,0x11,0x23,0x35,0x23,0x15,0x17,0x21,0x37,0x11,0x27,0x23,0x35,
-0x21,0x35,0x01,0x25,0x61,0xc4,0x64,0x01,0x1f,0x65,0x62,0xc2,0x01,0x24,0x03,0x0e,
-0xfe,0x78,0xfe,0xfc,0x85,0x85,0x82,0x82,0x01,0x04,0x83,0x82,0x83,0x00,0x00,0x02,
-0x00,0x00,0x00,0x00,0x01,0xe8,0x03,0x0e,0x00,0x0b,0x00,0x0f,0x00,0x63,0xb8,0x00,
-0x1e,0x2b,0xba,0x00,0x0a,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x0a,0x10,0xba,0x00,
-0x07,0x00,0x0d,0x00,0x21,0x2b,0xb8,0x00,0x07,0x10,0xb8,0x00,0x0a,0x10,0xb8,0x00,
-0x0c,0xd0,0x00,0xba,0x00,0x03,0x00,0x04,0x00,0x21,0x2b,0xb8,0x00,0x03,0x10,0xba,
-0x00,0x01,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x01,0x10,0xba,0x00,0x08,0x00,0x07,
-0x00,0x21,0x2b,0xb8,0x00,0x08,0x10,0xb8,0x00,0x02,0x10,0xb8,0x00,0x0a,0xd0,0xb8,
-0x00,0x07,0x10,0xb8,0x00,0x0c,0xd0,0xb8,0x00,0x03,0x10,0xb8,0x00,0x0e,0xd0,0x30,
-0x31,0x01,0x21,0x07,0x11,0x17,0x21,0x37,0x11,0x27,0x23,0x35,0x33,0x03,0x33,0x11,
-0x23,0x01,0x86,0xfe,0xdb,0x61,0x61,0x01,0x25,0x62,0x62,0xc2,0xc2,0xc2,0x61,0x61,
-0x03,0x0e,0x83,0xfd,0xf6,0x81,0x81,0x01,0x04,0x82,0x84,0xfe,0xfa,0xfe,0xfc,0x00,
-0x00,0x01,0x00,0x00,0xff,0xfe,0x01,0xe8,0x03,0x0a,0x00,0x0d,0x00,0x45,0xb8,0x00,
-0x1e,0x2b,0xba,0x00,0x03,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x03,0x10,0xba,0x00,
-0x07,0x00,0x00,0x00,0x03,0x11,0x12,0x39,0xb8,0x00,0x07,0x2f,0xb8,0x00,0x0a,0xdc,
-0xb8,0x00,0x04,0xd0,0xb8,0x00,0x09,0xd0,0xb8,0x00,0x0a,0x10,0xb8,0x00,0x0d,0xdc,
-0x00,0xb8,0x00,0x08,0x2f,0xba,0x00,0x00,0x00,0x03,0x00,0x21,0x2b,0xb8,0x00,0x00,
-0x10,0x30,0x31,0x19,0x01,0x33,0x35,0x33,0x11,0x23,0x07,0x11,0x33,0x11,0x33,0x37,
-0x11,0xc4,0x61,0x61,0x63,0xc4,0x61,0x62,0x03,0x0a,0xfe,0xfb,0x83,0xfe,0xfb,0x80,
-0xfe,0xfb,0x01,0x05,0x80,0x01,0x87,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x01,0xe8,
-0x03,0x0e,0x00,0x0d,0x00,0x11,0x00,0x15,0x00,0x9f,0xb8,0x00,0x1e,0x2b,0xba,0x00,
-0x0e,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x0e,0x10,0xba,0x00,0x0c,0x00,0x0f,0x00,
-0x21,0x2b,0xb8,0x00,0x0c,0x10,0xba,0x00,0x03,0x00,0x01,0x00,0x0e,0x11,0x12,0x39,
-0xb8,0x00,0x01,0x10,0xb8,0x00,0x04,0xd0,0xb8,0x00,0x0c,0x10,0xb8,0x00,0x08,0xd0,
-0xba,0x00,0x0a,0x00,0x0f,0x00,0x0c,0x11,0x12,0x39,0xb8,0x00,0x0e,0x10,0xb8,0x00,
-0x12,0xd0,0xb8,0x00,0x0f,0x10,0xb8,0x00,0x13,0xd0,0x00,0xba,0x00,0x05,0x00,0x06,
-0x00,0x21,0x2b,0xb8,0x00,0x05,0x10,0xba,0x00,0x00,0x00,0x01,0x00,0x21,0x2b,0xb8,
-0x00,0x00,0x10,0xba,0x00,0x02,0x00,0x04,0x00,0x21,0x2b,0xb8,0x00,0x02,0x10,0xb8,
-0x00,0x04,0x10,0xb8,0x00,0x09,0xd0,0xb8,0x00,0x01,0x10,0xb8,0x00,0x0e,0xd0,0xb8,
-0x00,0x02,0x10,0xb8,0x00,0x10,0xd0,0xb8,0x00,0x04,0x10,0xb8,0x00,0x12,0xd0,0xb8,
-0x00,0x05,0x10,0xb8,0x00,0x14,0xd0,0x30,0x31,0x13,0x07,0x15,0x17,0x23,0x11,0x17,
-0x21,0x37,0x11,0x23,0x37,0x35,0x27,0x07,0x33,0x15,0x23,0x15,0x33,0x11,0x23,0x61,
-0x61,0x61,0x61,0x61,0x01,0x25,0x62,0x62,0x62,0x62,0xc2,0x61,0x61,0x61,0x61,0x03,
-0x0e,0x83,0x84,0x82,0xfe,0xfc,0x81,0x81,0x01,0x04,0x82,0x84,0x83,0x83,0x84,0x82,
-0xfe,0xfc,0x00,0x02,0x00,0x00,0xff,0xfe,0x01,0xe8,0x03,0x0a,0x00,0x0b,0x00,0x0f,
-0x00,0x4b,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x0c,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,
-0x0c,0x10,0xba,0x00,0x09,0x00,0x05,0x00,0x21,0x2b,0xb8,0x00,0x09,0x10,0xb8,0x00,
-0x05,0x10,0xb8,0x00,0x0d,0xd0,0x00,0xba,0x00,0x06,0x00,0x07,0x00,0x21,0x2b,0xb8,
-0x00,0x06,0x10,0xba,0x00,0x00,0x00,0x0c,0x00,0x21,0x2b,0xb8,0x00,0x00,0x10,0xba,
-0x00,0x0f,0x00,0x04,0x00,0x21,0x2b,0xb8,0x00,0x0f,0x10,0x30,0x31,0x13,0x07,0x11,
-0x17,0x33,0x15,0x23,0x15,0x21,0x37,0x11,0x27,0x07,0x33,0x11,0x23,0x61,0x61,0x61,
-0xc4,0xc4,0x01,0x25,0x62,0x62,0xc2,0x61,0x61,0x03,0x0a,0x82,0xfe,0xfb,0x80,0x84,
-0x81,0x81,0x02,0x09,0x82,0x7b,0xfe,0xfc,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0xc4,
-0x02,0x8b,0x00,0x03,0x00,0x07,0x00,0x2b,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x03,0x00,
-0x00,0x00,0x21,0x2b,0xb8,0x00,0x03,0x10,0xb8,0x00,0x00,0x10,0xb8,0x00,0x04,0xd0,
-0xb8,0x00,0x03,0x10,0xb8,0x00,0x06,0xd0,0x00,0xb8,0x00,0x05,0x2f,0xb8,0x00,0x00,
-0x2f,0x30,0x31,0x19,0x01,0x33,0x11,0x03,0x11,0x33,0x11,0xc4,0xc4,0xc4,0x02,0x8b,
-0xfe,0xfa,0x01,0x06,0xfe,0x78,0xfe,0xfd,0x01,0x03,0x00,0x02,0x00,0x00,0xfe,0xfb,
-0x00,0xc4,0x02,0x8b,0x00,0x03,0x00,0x0b,0x00,0x47,0xb8,0x00,0x1e,0x2b,0xba,0x00,
-0x03,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x03,0x10,0xb8,0x00,0x00,0x10,0xb8,0x00,
-0x04,0xd0,0xba,0x00,0x06,0x00,0x00,0x00,0x03,0x11,0x12,0x39,0xb8,0x00,0x00,0x10,
-0xb8,0x00,0x07,0xd0,0xb8,0x00,0x03,0x10,0xb8,0x00,0x0a,0xd0,0x00,0xb8,0x00,0x00,
-0x2f,0xb8,0x00,0x08,0x2f,0xba,0x00,0x06,0x00,0x08,0x00,0x00,0x11,0x12,0x39,0x30,
-0x31,0x19,0x01,0x33,0x11,0x03,0x11,0x33,0x07,0x15,0x33,0x37,0x11,0xc4,0xc4,0x61,
-0x61,0x61,0x63,0x02,0x8b,0xfe,0xfa,0x01,0x06,0xfe,0x78,0xfe,0xfd,0x84,0x81,0x81,
-0x01,0x87,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x86,0x02,0x8b,0x00,0x0f,0x00,0x3f,
-0xb8,0x00,0x1e,0x2b,0xba,0x00,0x0d,0x00,0x04,0x00,0x21,0x2b,0xb8,0x00,0x0d,0x10,
-0xb8,0x00,0x03,0xdc,0xb8,0x00,0x06,0xd0,0x00,0xba,0x00,0x0b,0x00,0x08,0x00,0x21,
-0x2b,0xb8,0x00,0x0b,0x10,0xba,0x00,0x01,0x00,0x0e,0x00,0x21,0x2b,0xb8,0x00,0x01,
-0x10,0xba,0x00,0x04,0x00,0x05,0x00,0x21,0x2b,0xb8,0x00,0x04,0x10,0x30,0x31,0x01,
-0x23,0x07,0x15,0x23,0x15,0x33,0x15,0x17,0x33,0x35,0x23,0x27,0x35,0x37,0x33,0x01,
-0x86,0xc2,0x63,0x61,0x61,0x63,0xc2,0x61,0x54,0x54,0x61,0x02,0x8b,0x84,0x82,0x82,
-0x82,0x81,0x81,0x7d,0x8e,0x7b,0x00,0x02,0x00,0x00,0x00,0x81,0x01,0x25,0x02,0x07,
-0x00,0x03,0x00,0x07,0x00,0x1f,0xb8,0x00,0x1e,0x2b,0x00,0xba,0x00,0x04,0x00,0x05,
-0x00,0x21,0x2b,0xb8,0x00,0x04,0x10,0xba,0x00,0x00,0x00,0x01,0x00,0x21,0x2b,0xb8,
-0x00,0x00,0x10,0x30,0x31,0x11,0x15,0x21,0x35,0x01,0x15,0x21,0x35,0x01,0x25,0xfe,
-0xdb,0x01,0x25,0x02,0x07,0x82,0x82,0xfe,0xfc,0x82,0x82,0x00,0x00,0x01,0x00,0x00,
-0x00,0x00,0x01,0x86,0x02,0x8b,0x00,0x0f,0x00,0x5b,0xb8,0x00,0x1e,0x2b,0xba,0x00,
-0x05,0x00,0x0c,0x00,0x21,0x2b,0xb8,0x00,0x05,0x10,0xb8,0x00,0x0c,0x10,0xb8,0x00,
-0x06,0xdc,0xb8,0x00,0x02,0xd0,0xb8,0x00,0x05,0x10,0xb8,0x00,0x11,0xdc,0x00,0xba,
-0x00,0x07,0x00,0x08,0x00,0x21,0x2b,0xb8,0x00,0x07,0x10,0xba,0x00,0x01,0x00,0x02,
-0x00,0x21,0x2b,0xb8,0x00,0x01,0x10,0xba,0x00,0x04,0x00,0x05,0x00,0x21,0x2b,0xb8,
-0x00,0x04,0x10,0xb8,0x00,0x07,0x10,0xb8,0x00,0x0a,0xd0,0xb8,0x00,0x02,0x10,0xb8,
-0x00,0x0e,0xd0,0x30,0x31,0x11,0x33,0x17,0x15,0x33,0x15,0x23,0x15,0x07,0x23,0x35,
-0x33,0x37,0x35,0x27,0x23,0xc4,0x61,0x61,0x61,0x61,0xc4,0x61,0x56,0x56,0x61,0x02,
-0x8b,0x84,0x82,0x82,0x82,0x81,0x81,0x7d,0x8e,0x7b,0x00,0x02,0x00,0x00,0x00,0x00,
-0x01,0xe8,0x03,0x0e,0x00,0x0a,0x00,0x0e,0x00,0x5b,0xb8,0x00,0x1e,0x2b,0xba,0x00,
-0x03,0x00,0x05,0x00,0x21,0x2b,0xb8,0x00,0x03,0x10,0xba,0x00,0x09,0x00,0x02,0x00,
-0x21,0x2b,0xb8,0x00,0x09,0x10,0xb8,0x00,0x03,0x10,0xb8,0x00,0x07,0xd0,0xb8,0x00,
-0x05,0x10,0xb8,0x00,0x0b,0xd0,0xb8,0x00,0x03,0x10,0xb8,0x00,0x0d,0xd0,0x00,0xba,
-0x00,0x0b,0x00,0x0c,0x00,0x21,0x2b,0xb8,0x00,0x0b,0x10,0xba,0x00,0x00,0x00,0x01,
-0x00,0x21,0x2b,0xb8,0x00,0x00,0x10,0xba,0x00,0x05,0x00,0x06,0x00,0x21,0x2b,0xb8,
-0x00,0x05,0x10,0x30,0x31,0x11,0x15,0x21,0x15,0x07,0x23,0x15,0x33,0x13,0x35,0x27,
-0x01,0x15,0x33,0x35,0x01,0x25,0x61,0x63,0xc4,0xc3,0x62,0xfe,0xdb,0xc4,0x03,0x0e,
-0x83,0x84,0x82,0x82,0x01,0x04,0x84,0x83,0xfd,0x73,0x81,0x81,0x00,0x01,0x00,0x00,
-0x00,0x00,0x01,0xe8,0x03,0x0e,0x00,0x0e,0x00,0x37,0xb8,0x00,0x1e,0x2b,0xba,0x00,
-0x02,0x00,0x0b,0x00,0x21,0x2b,0xb8,0x00,0x02,0x10,0xba,0x00,0x08,0x00,0x03,0x00,
-0x21,0x2b,0xb8,0x00,0x08,0x10,0x00,0xba,0x00,0x01,0x00,0x0d,0x00,0x21,0x2b,0xb8,
-0x00,0x01,0x10,0xba,0x00,0x0a,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x0a,0x10,0x30,
-0x31,0x25,0x21,0x11,0x21,0x15,0x23,0x11,0x21,0x11,0x27,0x21,0x07,0x11,0x17,0x21,
-0x01,0x8a,0xfe,0xe4,0x01,0x0c,0xbd,0x01,0x2b,0x63,0xfe,0xde,0x63,0x63,0x01,0x27,
-0x91,0x01,0xea,0x6c,0xfe,0xed,0x01,0x8d,0x85,0x85,0xfd,0xfa,0x83,0x00,0x00,0x02,
-0x00,0x00,0x00,0x00,0x01,0xe8,0x03,0x0e,0x00,0x09,0x00,0x0d,0x00,0x57,0xb8,0x00,
-0x1e,0x2b,0xba,0x00,0x0b,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x0b,0x10,0xba,0x00,
-0x07,0x00,0x06,0x00,0x21,0x2b,0xb8,0x00,0x07,0x10,0xb8,0x00,0x0b,0x10,0xb8,0x00,
-0x03,0xd0,0xb8,0x00,0x06,0x10,0xb8,0x00,0x0c,0xd0,0x00,0xb8,0x00,0x02,0x2f,0xb8,
-0x00,0x06,0x2f,0xba,0x00,0x00,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x00,0x10,0xba,
-0x00,0x0a,0x00,0x04,0x00,0x21,0x2b,0xb8,0x00,0x0a,0x10,0xb8,0x00,0x01,0x10,0xb8,
-0x00,0x0b,0xd0,0x30,0x31,0x13,0x07,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x27,0x03,
-0x11,0x33,0x11,0x61,0x61,0xc4,0x61,0xc3,0x62,0xc2,0x61,0x03,0x0e,0x83,0xfd,0x75,
-0x01,0x03,0xfe,0xfd,0x02,0x8b,0x83,0xfe,0x77,0x01,0x06,0xfe,0xfa,0x00,0x00,0x03,
-0x00,0x00,0x00,0x00,0x01,0xe8,0x03,0x0e,0x00,0x08,0x00,0x0c,0x00,0x10,0x00,0x79,
-0xb8,0x00,0x1e,0x2b,0xba,0x00,0x09,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x09,0x10,
-0xba,0x00,0x07,0x00,0x0a,0x00,0x21,0x2b,0xb8,0x00,0x07,0x10,0xb8,0x00,0x03,0xd0,
-0xba,0x00,0x05,0x00,0x0a,0x00,0x07,0x11,0x12,0x39,0xb8,0x00,0x09,0x10,0xb8,0x00,
-0x0d,0xd0,0xb8,0x00,0x0a,0x10,0xb8,0x00,0x0e,0xd0,0x00,0xba,0x00,0x10,0x00,0x02,
-0x00,0x21,0x2b,0xb8,0x00,0x10,0x10,0xba,0x00,0x08,0x00,0x07,0x00,0x21,0x2b,0xb8,
-0x00,0x08,0x10,0xba,0x00,0x06,0x00,0x04,0x00,0x21,0x2b,0xb8,0x00,0x06,0x10,0xb8,
-0x00,0x07,0x10,0xb8,0x00,0x09,0xd0,0xb8,0x00,0x06,0x10,0xb8,0x00,0x0b,0xd0,0xb8,
-0x00,0x04,0x10,0xb8,0x00,0x0d,0xd0,0x30,0x31,0x19,0x01,0x21,0x37,0x11,0x23,0x37,
-0x35,0x27,0x07,0x33,0x15,0x23,0x15,0x33,0x11,0x23,0x01,0x86,0x62,0x62,0x62,0x62,
-0xc2,0x61,0x61,0x61,0x61,0x03,0x0e,0xfc,0xf2,0x81,0x01,0x04,0x82,0x84,0x83,0x83,
-0x84,0x82,0xfe,0xfc,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0xe8,0x03,0x0e,0x00,0x0b,
-0x00,0x4b,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x07,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,
-0x07,0x10,0xba,0x00,0x0b,0x00,0x08,0x00,0x21,0x2b,0xb8,0x00,0x0b,0x10,0xb8,0x00,
-0x04,0xd0,0x00,0xba,0x00,0x02,0x00,0x03,0x00,0x21,0x2b,0xb8,0x00,0x02,0x10,0xba,
-0x00,0x00,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x00,0x10,0xb8,0x00,0x02,0x10,0xb8,
-0x00,0x05,0xd0,0xb8,0x00,0x01,0x10,0xb8,0x00,0x07,0xd0,0x30,0x31,0x13,0x07,0x11,
-0x17,0x21,0x35,0x21,0x11,0x33,0x15,0x33,0x11,0x61,0x61,0x61,0x01,0x87,0xfe,0xdc,
-0x61,0xc3,0x03,0x0e,0x83,0xfd,0xf6,0x81,0x81,0x02,0x0a,0x84,0x01,0x07,0x00,0x02,
-0x00,0x00,0x00,0x00,0x01,0xe8,0x03,0x0e,0x00,0x05,0x00,0x09,0x00,0x3f,0xb8,0x00,
-0x1e,0x2b,0xba,0x00,0x06,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x06,0x10,0xba,0x00,
-0x04,0x00,0x07,0x00,0x21,0x2b,0xb8,0x00,0x04,0x10,0x00,0xba,0x00,0x09,0x00,0x02,
-0x00,0x21,0x2b,0xb8,0x00,0x09,0x10,0xba,0x00,0x05,0x00,0x04,0x00,0x21,0x2b,0xb8,
-0x00,0x05,0x10,0xb8,0x00,0x04,0x10,0xb8,0x00,0x06,0xd0,0x30,0x31,0x19,0x01,0x21,
-0x37,0x11,0x27,0x07,0x33,0x11,0x23,0x01,0x86,0x62,0x62,0xc2,0x61,0x61,0x03,0x0e,
-0xfc,0xf2,0x81,0x02,0x0a,0x83,0x83,0xfd,0xf6,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
-0x01,0xe8,0x03,0x0e,0x00,0x0d,0x00,0x4b,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x0c,0x00,
-0x02,0x00,0x21,0x2b,0xb8,0x00,0x0c,0x10,0xb8,0x00,0x07,0xd0,0x00,0xba,0x00,0x03,
-0x00,0x04,0x00,0x21,0x2b,0xb8,0x00,0x03,0x10,0xba,0x00,0x01,0x00,0x02,0x00,0x21,
-0x2b,0xb8,0x00,0x01,0x10,0xba,0x00,0x0b,0x00,0x08,0x00,0x21,0x2b,0xb8,0x00,0x0b,
-0x10,0xb8,0x00,0x03,0x10,0xb8,0x00,0x06,0xd0,0xb8,0x00,0x02,0x10,0xb8,0x00,0x0c,
-0xd0,0x30,0x31,0x01,0x21,0x07,0x11,0x17,0x21,0x35,0x21,0x11,0x33,0x35,0x23,0x35,
-0x21,0x01,0xe8,0xfe,0x79,0x61,0x61,0x01,0x87,0xfe,0xdc,0xc2,0xc2,0x01,0x24,0x03,
-0x0e,0x83,0xfd,0xf6,0x81,0x81,0x01,0x04,0x82,0x84,0x00,0x01,0x00,0x00,0x00,0x00,
-0x01,0xe8,0x03,0x0e,0x00,0x0a,0x00,0x3f,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x05,0x00,
-0x02,0x00,0x21,0x2b,0xb8,0x00,0x05,0x10,0xb8,0x00,0x08,0xd0,0xb8,0x00,0x08,0x2f,
-0x00,0xb8,0x00,0x03,0x2f,0xba,0x00,0x01,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x01,
-0x10,0xba,0x00,0x08,0x00,0x05,0x00,0x21,0x2b,0xb8,0x00,0x08,0x10,0xb8,0x00,0x02,
-0x10,0xb8,0x00,0x09,0xd0,0x30,0x31,0x01,0x21,0x07,0x11,0x33,0x11,0x33,0x35,0x23,
-0x35,0x21,0x01,0xe8,0xfe,0x79,0x61,0xc2,0xc4,0xc2,0x01,0x24,0x03,0x0e,0x83,0xfd,
-0x75,0x01,0x85,0x82,0x84,0x00,0x00,0x01,0x00,0x00,0xfe,0xfb,0x01,0xe8,0x03,0x0e,
-0x00,0x12,0x00,0x6b,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x10,0x00,0x03,0x00,0x21,0x2b,
-0xb8,0x00,0x10,0x10,0xba,0x00,0x0b,0x00,0x07,0x00,0x21,0x2b,0xb8,0x00,0x0b,0x10,
-0xb8,0x00,0x00,0xd0,0xb8,0x00,0x10,0x10,0xb8,0x00,0x08,0xd0,0xb8,0x00,0x07,0x10,
-0xb8,0x00,0x0d,0xd0,0xb8,0x00,0x07,0x10,0xb8,0x00,0x11,0xd0,0x00,0xba,0x00,0x08,
-0x00,0x09,0x00,0x21,0x2b,0xb8,0x00,0x08,0x10,0xba,0x00,0x02,0x00,0x03,0x00,0x21,
-0x2b,0xb8,0x00,0x02,0x10,0xba,0x00,0x04,0x00,0x05,0x00,0x21,0x2b,0xb8,0x00,0x04,
-0x10,0xb8,0x00,0x0e,0xd0,0xb8,0x00,0x03,0x10,0xb8,0x00,0x10,0xd0,0x30,0x31,0x01,
-0x11,0x21,0x07,0x11,0x17,0x33,0x15,0x23,0x15,0x33,0x37,0x11,0x23,0x11,0x23,0x11,
-0x33,0x15,0x01,0xe8,0xfe,0x79,0x61,0x61,0xc4,0x61,0xc2,0x62,0xc3,0x61,0x61,0x02,
-0x07,0x01,0x07,0x83,0xfd,0xf6,0x81,0x84,0x81,0x81,0x02,0x09,0xfe,0xfc,0x02,0x0a,
-0x84,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0xe8,0x03,0x0e,0x00,0x0b,0x00,0x4b,
-0xb8,0x00,0x1e,0x2b,0xba,0x00,0x0b,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x0b,0x10,
-0xba,0x00,0x06,0x00,0x05,0x00,0x21,0x2b,0xb8,0x00,0x06,0x10,0xb8,0x00,0x0b,0x10,
-0xb8,0x00,0x02,0xd0,0xb8,0x00,0x05,0x10,0xb8,0x00,0x08,0xd0,0x00,0xb8,0x00,0x00,
-0x2f,0xb8,0x00,0x07,0x2f,0xb8,0x00,0x01,0x2f,0xb8,0x00,0x05,0x2f,0xba,0x00,0x0a,
-0x00,0x03,0x00,0x21,0x2b,0xb8,0x00,0x0a,0x10,0x30,0x31,0x19,0x01,0x33,0x11,0x33,
-0x11,0x33,0x11,0x23,0x11,0x23,0x11,0xc4,0x61,0xc3,0xc3,0x61,0x03,0x0e,0xfc,0xf2,
-0x01,0x85,0xfe,0x7b,0x03,0x0e,0xfe,0xf9,0x01,0x07,0x00,0x01,0x00,0x00,0x00,0x00,
-0x01,0x86,0x03,0x0e,0x00,0x0b,0x00,0x3b,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x09,0x00,
-0x02,0x00,0x21,0x2b,0xb8,0x00,0x09,0x10,0x00,0xba,0x00,0x04,0x00,0x05,0x00,0x21,
-0x2b,0xb8,0x00,0x04,0x10,0xba,0x00,0x00,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x00,
-0x10,0xb8,0x00,0x04,0x10,0xb8,0x00,0x07,0xd0,0xb8,0x00,0x01,0x10,0xb8,0x00,0x09,
-0xd0,0x30,0x31,0x11,0x15,0x33,0x11,0x23,0x15,0x21,0x35,0x23,0x11,0x33,0x35,0x61,
-0x61,0x01,0x86,0x61,0x61,0x03,0x0e,0x83,0xfd,0xf6,0x81,0x81,0x02,0x0a,0x83,0x00,
-0x00,0x01,0x00,0x00,0xfe,0xfb,0x01,0x25,0x03,0x0e,0x00,0x08,0x00,0x2f,0xb8,0x00,
-0x1e,0x2b,0xba,0x00,0x08,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x08,0x10,0xb8,0x00,
-0x0a,0xdc,0x00,0xba,0x00,0x04,0x00,0x05,0x00,0x21,0x2b,0xb8,0x00,0x04,0x10,0xba,
-0x00,0x00,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x00,0x10,0x30,0x31,0x11,0x15,0x33,
-0x11,0x23,0x15,0x33,0x37,0x11,0x61,0x61,0xc4,0x61,0x03,0x0e,0x83,0xfc,0xf1,0x81,
-0x81,0x03,0x92,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0xe8,0x03,0x0e,0x00,0x0e,
-0x00,0x5d,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x0e,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,
-0x0e,0x10,0xba,0x00,0x07,0x00,0x04,0x00,0x21,0x2b,0xb8,0x00,0x07,0x10,0xb8,0x00,
-0x0e,0x10,0xb8,0x00,0x02,0xd0,0xb8,0x00,0x07,0x10,0xb8,0x00,0x09,0xd0,0xb8,0x00,
-0x04,0x10,0xb8,0x00,0x0b,0xd0,0x00,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x0a,0x2f,0xb8,
-0x00,0x01,0x2f,0xb8,0x00,0x05,0x2f,0xba,0x00,0x0d,0x00,0x03,0x00,0x21,0x2b,0xb8,
-0x00,0x0d,0x10,0xba,0x00,0x08,0x00,0x03,0x00,0x0d,0x11,0x12,0x39,0x30,0x31,0x19,
-0x01,0x33,0x11,0x33,0x11,0x33,0x11,0x27,0x37,0x35,0x23,0x11,0x23,0x11,0xc4,0x61,
-0xc3,0x7b,0x7b,0xc3,0x61,0x03,0x0e,0xfc,0xf2,0x01,0x85,0xfe,0x7b,0x01,0x6d,0x55,
-0x6a,0xe2,0xfe,0xf9,0x01,0x07,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0xe8,0x03,0x0e,
-0x00,0x05,0x00,0x23,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x05,0x00,0x00,0x00,0x21,0x2b,
-0xb8,0x00,0x05,0x10,0x00,0xb8,0x00,0x00,0x2f,0xba,0x00,0x04,0x00,0x01,0x00,0x21,
-0x2b,0xb8,0x00,0x04,0x10,0x30,0x31,0x19,0x01,0x21,0x35,0x21,0x11,0x01,0xe8,0xfe,
-0xdc,0x03,0x0e,0xfc,0xf2,0x81,0x02,0x8d,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0xac,
-0x03,0x0e,0x00,0x0b,0x00,0x3f,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x0b,0x00,0x00,0x00,
-0x21,0x2b,0xb8,0x00,0x0b,0x10,0xba,0x00,0x05,0x00,0x06,0x00,0x21,0x2b,0xb8,0x00,
-0x05,0x10,0x00,0xb8,0x00,0x02,0x2f,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x05,0x2f,0xba,
-0x00,0x07,0x00,0x00,0x00,0x02,0x11,0x12,0x39,0xba,0x00,0x0a,0x00,0x00,0x00,0x02,
-0x11,0x12,0x39,0x30,0x31,0x31,0x11,0x37,0x21,0x17,0x11,0x23,0x11,0x03,0x23,0x03,
-0x11,0x61,0x01,0xe9,0x62,0xc4,0x62,0x61,0x61,0x02,0x8d,0x81,0x81,0xfd,0x73,0x02,
-0x8d,0xfe,0xf9,0x01,0x07,0xfd,0x73,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0xe8,
-0x03,0x10,0x00,0x0b,0x00,0x4f,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x03,0x00,0x01,0x00,
-0x21,0x2b,0xb8,0x00,0x03,0x10,0xba,0x00,0x06,0x00,0x08,0x00,0x21,0x2b,0xb8,0x00,
-0x06,0x10,0xb8,0x00,0x08,0x10,0xb8,0x00,0x04,0xd0,0xb8,0x00,0x04,0x2f,0x00,0xb8,
-0x00,0x07,0x2f,0xb8,0x00,0x0a,0x2f,0xb8,0x00,0x01,0x2f,0xb8,0x00,0x04,0x2f,0xba,
-0x00,0x03,0x00,0x01,0x00,0x07,0x11,0x12,0x39,0xba,0x00,0x09,0x00,0x01,0x00,0x07,
-0x11,0x12,0x39,0x30,0x31,0x19,0x01,0x33,0x11,0x13,0x33,0x11,0x27,0x23,0x11,0x03,
-0x23,0xc2,0x67,0xbf,0x44,0x7f,0x74,0x7c,0x02,0xba,0xfd,0x46,0x01,0x51,0xfe,0xaf,
-0x02,0xae,0x62,0xfe,0xdb,0x01,0x25,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x01,0xe8,
-0x03,0x0e,0x00,0x07,0x00,0x0b,0x00,0x47,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x08,0x00,
-0x00,0x00,0x21,0x2b,0xb8,0x00,0x08,0x10,0xba,0x00,0x05,0x00,0x09,0x00,0x21,0x2b,
-0xb8,0x00,0x05,0x10,0x00,0xba,0x00,0x01,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x01,
-0x10,0xba,0x00,0x07,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x07,0x10,0xb8,0x00,0x00,
-0x10,0xb8,0x00,0x08,0xd0,0xb8,0x00,0x01,0x10,0xb8,0x00,0x0a,0xd0,0x30,0x31,0x19,
-0x01,0x17,0x21,0x37,0x11,0x27,0x21,0x17,0x33,0x11,0x23,0x61,0x01,0x25,0x62,0x62,
-0xfe,0xdb,0x63,0x61,0x61,0x02,0x8b,0xfd,0xf6,0x81,0x81,0x02,0x0a,0x83,0x83,0xfd,
-0xf6,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x01,0xe8,0x03,0x0e,0x00,0x07,0x00,0x0b,
-0x00,0x4b,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x08,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,
-0x08,0x10,0xba,0x00,0x06,0x00,0x09,0x00,0x21,0x2b,0xb8,0x00,0x06,0x10,0xb8,0x00,
-0x08,0x10,0xb8,0x00,0x02,0xd0,0x00,0xb8,0x00,0x01,0x2f,0xba,0x00,0x07,0x00,0x06,
-0x00,0x21,0x2b,0xb8,0x00,0x07,0x10,0xba,0x00,0x0b,0x00,0x03,0x00,0x21,0x2b,0xb8,
-0x00,0x0b,0x10,0xb8,0x00,0x06,0x10,0xb8,0x00,0x08,0xd0,0x30,0x31,0x19,0x01,0x33,
-0x11,0x33,0x37,0x11,0x27,0x07,0x33,0x11,0x23,0xc4,0xc2,0x62,0x62,0xc2,0x61,0x61,
-0x03,0x0e,0xfc,0xf2,0x01,0x03,0x82,0x01,0x06,0x83,0x83,0xfe,0xfa,0x00,0x00,0x02,
-0x00,0x00,0xff,0x7c,0x01,0xe8,0x03,0x0e,0x00,0x0b,0x00,0x0f,0x00,0x6b,0xb8,0x00,
-0x1e,0x2b,0xba,0x00,0x0c,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x0c,0x10,0xba,0x00,
-0x06,0x00,0x03,0x00,0x21,0x2b,0xb8,0x00,0x06,0x10,0xb8,0x00,0x08,0xd0,0xb8,0x00,
-0x03,0x10,0xb8,0x00,0x0d,0xd0,0x00,0xba,0x00,0x03,0x00,0x04,0x00,0x21,0x2b,0xb8,
-0x00,0x03,0x10,0xba,0x00,0x0b,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x0b,0x10,0xb8,
-0x00,0x03,0x10,0xb8,0x00,0x01,0xdc,0xb8,0x00,0x03,0x10,0xb8,0x00,0x06,0xd0,0xb8,
-0x00,0x02,0x10,0xb8,0x00,0x07,0xd0,0xb8,0x00,0x00,0x10,0xb8,0x00,0x0c,0xd0,0xb8,
-0x00,0x01,0x10,0xb8,0x00,0x0e,0xd0,0x30,0x31,0x19,0x01,0x17,0x33,0x15,0x33,0x35,
-0x23,0x37,0x11,0x27,0x21,0x17,0x33,0x11,0x23,0x61,0xc4,0xc3,0x62,0x62,0x62,0xfe,
-0xdb,0x63,0x61,0x61,0x02,0x8b,0xfd,0xf6,0x81,0x84,0x84,0x81,0x02,0x0a,0x83,0x83,
-0xfd,0xf6,0x00,0x02,0x00,0x00,0x00,0x00,0x01,0xe8,0x03,0x0e,0x00,0x0b,0x00,0x0f,
-0x00,0x67,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x0c,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,
-0x0c,0x10,0xba,0x00,0x07,0x00,0x04,0x00,0x21,0x2b,0xb8,0x00,0x07,0x10,0xb8,0x00,
-0x0c,0x10,0xb8,0x00,0x02,0xd0,0xb8,0x00,0x07,0x10,0xb8,0x00,0x09,0xd0,0xb8,0x00,
-0x04,0x10,0xb8,0x00,0x0d,0xd0,0x00,0xb8,0x00,0x01,0x2f,0xb8,0x00,0x05,0x2f,0xba,
-0x00,0x0b,0x00,0x0a,0x00,0x21,0x2b,0xb8,0x00,0x0b,0x10,0xba,0x00,0x0f,0x00,0x03,
-0x00,0x21,0x2b,0xb8,0x00,0x0f,0x10,0xb8,0x00,0x03,0x10,0xb8,0x00,0x07,0xd0,0xb8,
-0x00,0x0a,0x10,0xb8,0x00,0x0c,0xd0,0x30,0x31,0x19,0x01,0x33,0x11,0x33,0x11,0x33,
-0x11,0x23,0x37,0x11,0x27,0x07,0x33,0x11,0x23,0xc4,0x61,0xc3,0x62,0x62,0x62,0xc2,
-0x61,0x61,0x03,0x0e,0xfc,0xf2,0x01,0x03,0xfe,0xfd,0x01,0x03,0x82,0x01,0x06,0x83,
-0x83,0xfe,0xfa,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0xe8,0x03,0x0e,0x00,0x12,
-0x00,0x79,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x0a,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,
-0x0a,0x10,0xba,0x00,0x09,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x09,0x10,0xb8,0x00,
-0x0a,0x10,0xb8,0x00,0x03,0xd0,0xb8,0x00,0x03,0x2f,0xb8,0x00,0x00,0x10,0xb8,0x00,
-0x05,0xd0,0xb8,0x00,0x0a,0x10,0xb8,0x00,0x0c,0xd0,0xb8,0x00,0x0c,0x2f,0xb8,0x00,
-0x01,0x10,0xb8,0x00,0x0d,0xd0,0xb8,0x00,0x09,0x10,0xb8,0x00,0x0f,0xd0,0x00,0xba,
-0x00,0x03,0x00,0x07,0x00,0x21,0x2b,0xb8,0x00,0x03,0x10,0xba,0x00,0x11,0x00,0x12,
-0x00,0x21,0x2b,0xb8,0x00,0x11,0x10,0xba,0x00,0x0b,0x00,0x12,0x00,0x11,0x11,0x12,
-0x39,0xb8,0x00,0x12,0x10,0xb8,0x00,0x0c,0xd0,0x30,0x31,0x11,0x01,0x15,0x23,0x35,
-0x23,0x11,0x21,0x37,0x35,0x01,0x35,0x17,0x33,0x15,0x33,0x11,0x21,0x07,0x01,0x25,
-0x61,0xc4,0x01,0x86,0x62,0xfe,0xda,0x02,0x61,0xc3,0xfe,0x79,0x61,0x02,0x0e,0xfe,
-0xf5,0x82,0x82,0xfe,0xfd,0x81,0x82,0x01,0x0b,0x85,0x08,0x82,0x01,0x05,0x83,0x00,
-0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x86,0x03,0x0e,0x00,0x07,0x00,0x2b,0xb8,0x00,
-0x1e,0x2b,0xba,0x00,0x05,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x05,0x10,0x00,0xb8,
-0x00,0x03,0x2f,0xba,0x00,0x00,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x00,0x10,0xb8,
-0x00,0x01,0x10,0xb8,0x00,0x05,0xd0,0x30,0x31,0x11,0x15,0x33,0x11,0x33,0x11,0x33,
-0x35,0x61,0xc4,0x61,0x03,0x0e,0x83,0xfd,0x75,0x02,0x8b,0x83,0x00,0x01,0x00,0x00,
-0x00,0x00,0x01,0xe8,0x03,0x0e,0x00,0x09,0x00,0x37,0xb8,0x00,0x1e,0x2b,0xba,0x00,
-0x09,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x09,0x10,0xba,0x00,0x05,0x00,0x06,0x00,
-0x21,0x2b,0xb8,0x00,0x05,0x10,0x00,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x05,0x2f,0xba,
-0x00,0x01,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x01,0x10,0xb8,0x00,0x07,0xd0,0x30,
-0x31,0x19,0x01,0x17,0x21,0x37,0x11,0x23,0x11,0x23,0x11,0x61,0x01,0x25,0x62,0xc3,
-0x61,0x03,0x0e,0xfd,0x73,0x81,0x81,0x02,0x8d,0xfd,0x73,0x02,0x8d,0x00,0x00,0x01,
-0x00,0x00,0xff,0xfe,0x01,0xe8,0x03,0x0e,0x00,0x09,0x00,0x3f,0xb8,0x00,0x1e,0x2b,
-0xba,0x00,0x09,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x09,0x10,0xba,0x00,0x04,0x00,
-0x07,0x00,0x21,0x2b,0xb8,0x00,0x04,0x10,0xb8,0x00,0x09,0x10,0xb8,0x00,0x02,0xd0,
-0xb8,0x00,0x02,0x2f,0x00,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x05,0x2f,0xba,0x00,0x08,
-0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x08,0x10,0x30,0x31,0x19,0x01,0x13,0x33,0x13,
-0x11,0x23,0x11,0x23,0x11,0xbd,0x68,0xc3,0xc3,0x61,0x03,0x0e,0xfd,0xf2,0xfe,0xfe,
-0x01,0x05,0x02,0x0b,0xfd,0x73,0x02,0x8d,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0xac,
-0x03,0x0e,0x00,0x0b,0x00,0x3f,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x0b,0x00,0x00,0x00,
-0x21,0x2b,0xb8,0x00,0x0b,0x10,0xba,0x00,0x05,0x00,0x06,0x00,0x21,0x2b,0xb8,0x00,
-0x05,0x10,0x00,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x05,0x2f,0xb8,0x00,0x02,0x2f,0xba,
-0x00,0x07,0x00,0x02,0x00,0x00,0x11,0x12,0x39,0xba,0x00,0x0a,0x00,0x02,0x00,0x00,
-0x11,0x12,0x39,0x30,0x31,0x19,0x01,0x17,0x21,0x37,0x11,0x23,0x11,0x03,0x23,0x03,
-0x11,0x61,0x01,0xe9,0x62,0xc4,0x62,0x61,0x61,0x03,0x0e,0xfd,0x73,0x81,0x81,0x02,
-0x8d,0xfd,0x73,0x01,0x05,0xfe,0xfb,0x02,0x8d,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
-0x01,0xe8,0x03,0x0e,0x00,0x11,0x00,0x6b,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x11,0x00,
-0x00,0x00,0x21,0x2b,0xb8,0x00,0x11,0x10,0xba,0x00,0x0a,0x00,0x07,0x00,0x21,0x2b,
-0xb8,0x00,0x0a,0x10,0xb8,0x00,0x00,0x10,0xb8,0x00,0x03,0xd0,0xb8,0x00,0x11,0x10,
-0xb8,0x00,0x05,0xd0,0xb8,0x00,0x0a,0x10,0xb8,0x00,0x0c,0xd0,0xb8,0x00,0x07,0x10,
-0xb8,0x00,0x0e,0xd0,0x00,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x0d,0x2f,0xb8,0x00,0x04,
-0x2f,0xb8,0x00,0x08,0x2f,0xba,0x00,0x01,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x01,
-0x10,0xb8,0x00,0x02,0x10,0xb8,0x00,0x06,0xd0,0xb8,0x00,0x01,0x10,0xb8,0x00,0x0f,
-0xd0,0x30,0x31,0x19,0x01,0x17,0x07,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x27,0x37,
-0x11,0x23,0x11,0x23,0x11,0x61,0x61,0xc4,0x61,0xc3,0x62,0x62,0xc3,0x61,0x03,0x0e,
-0xfe,0xf9,0x82,0x5b,0xfe,0xd6,0x01,0x85,0xfe,0x7b,0x01,0x31,0x54,0x82,0x01,0x07,
-0xfe,0xf9,0x01,0x07,0x00,0x01,0x00,0x00,0xfe,0xfb,0x01,0xe8,0x03,0x0e,0x00,0x0d,
-0x00,0x53,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x0d,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,
-0x0d,0x10,0xba,0x00,0x08,0x00,0x04,0x00,0x21,0x2b,0xb8,0x00,0x08,0x10,0xb8,0x00,
-0x0d,0x10,0xb8,0x00,0x05,0xd0,0xb8,0x00,0x04,0x10,0xb8,0x00,0x0a,0xd0,0x00,0xb8,
-0x00,0x00,0x2f,0xb8,0x00,0x09,0x2f,0xba,0x00,0x05,0x00,0x06,0x00,0x21,0x2b,0xb8,
-0x00,0x05,0x10,0xba,0x00,0x01,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x01,0x10,0xb8,
-0x00,0x0b,0xd0,0x30,0x31,0x19,0x01,0x17,0x33,0x15,0x23,0x15,0x33,0x37,0x11,0x23,
-0x11,0x23,0x11,0x61,0xc4,0x61,0xc2,0x62,0xc3,0x61,0x03,0x0e,0xfd,0x73,0x81,0x84,
-0x81,0x81,0x03,0x92,0xfd,0x73,0x02,0x8d,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0xe8,
-0x03,0x0e,0x00,0x0a,0x00,0x33,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x08,0x00,0x03,0x00,
-0x21,0x2b,0xb8,0x00,0x08,0x10,0xb8,0x00,0x03,0x10,0xb8,0x00,0x00,0xd0,0x00,0xba,
-0x00,0x07,0x00,0x04,0x00,0x21,0x2b,0xb8,0x00,0x07,0x10,0xba,0x00,0x00,0x00,0x01,
-0x00,0x21,0x2b,0xb8,0x00,0x00,0x10,0x30,0x31,0x11,0x15,0x21,0x01,0x11,0x21,0x35,
-0x21,0x35,0x01,0x35,0x01,0x25,0xfe,0xdb,0x01,0xe8,0xfe,0xdc,0x01,0x24,0x03,0x0e,
-0x83,0xfe,0x78,0xfe,0xfd,0x81,0x82,0x01,0x90,0x7b,0x00,0x01,0x00,0x00,0xff,0x7c,
-0x01,0x25,0x03,0x0e,0x00,0x07,0x00,0x2b,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x06,0x00,
-0x01,0x00,0x21,0x2b,0xb8,0x00,0x06,0x10,0x00,0xba,0x00,0x05,0x00,0x03,0x00,0x21,
-0x2b,0xb8,0x00,0x05,0x10,0xba,0x00,0x00,0x00,0x07,0x00,0x21,0x2b,0xb8,0x00,0x00,
-0x10,0x30,0x31,0x01,0x21,0x11,0x21,0x35,0x23,0x11,0x33,0x01,0x25,0xfe,0xdb,0x01,
-0x25,0x61,0x61,0x03,0x0e,0xfc,0x6e,0x84,0x02,0x8b,0x00,0x01,0x00,0x00,0x00,0x00,
-0x01,0x25,0x03,0x0e,0x00,0x05,0x00,0x0f,0xb8,0x00,0x1e,0x2b,0x00,0xb8,0x00,0x00,
-0x2f,0xb8,0x00,0x02,0x2f,0x30,0x31,0x1b,0x01,0x11,0x23,0x03,0x11,0x61,0xc4,0x61,
-0xc4,0x03,0x0e,0xfd,0xf5,0xfe,0xfd,0x02,0x07,0x01,0x07,0x00,0x00,0x01,0x00,0x00,
-0xff,0x7c,0x01,0x25,0x03,0x0e,0x00,0x07,0x00,0x2f,0xb8,0x00,0x1e,0x2b,0xba,0x00,
-0x07,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x07,0x10,0xb8,0x00,0x09,0xdc,0x00,0xba,
-0x00,0x04,0x00,0x05,0x00,0x21,0x2b,0xb8,0x00,0x04,0x10,0xba,0x00,0x00,0x00,0x01,
-0x00,0x21,0x2b,0xb8,0x00,0x00,0x10,0x30,0x31,0x11,0x15,0x33,0x11,0x23,0x15,0x21,
-0x11,0x61,0x61,0x01,0x25,0x03,0x0e,0x83,0xfd,0x75,0x84,0x03,0x92,0x00,0x00,0x01,
-0x00,0x00,0x02,0x07,0x01,0x25,0x03,0x0e,0x00,0x08,0x00,0x1d,0xb8,0x00,0x1e,0x2b,
-0x00,0xb8,0x00,0x07,0x2f,0xb8,0x00,0x01,0x2f,0xb8,0x00,0x04,0x2f,0xba,0x00,0x03,
-0x00,0x01,0x00,0x07,0x11,0x12,0x39,0x30,0x31,0x11,0x15,0x33,0x37,0x17,0x33,0x35,
-0x27,0x23,0x61,0x31,0x32,0x61,0x61,0x63,0x02,0x8b,0x84,0x8c,0x8c,0x84,0x83,0x00,
-0x00,0x01,0xff,0xfb,0xff,0x23,0x02,0x45,0xff,0xa3,0x00,0x03,0x00,0x0f,0xb8,0x00,
-0x1e,0x2b,0x00,0xba,0x00,0x00,0x00,0x01,0x00,0x21,0x2b,0x30,0x31,0x07,0x15,0x21,
-0x35,0x05,0x02,0x4a,0x5d,0x80,0x80,0x00,0x00,0x01,0x00,0x00,0x02,0x07,0x01,0x25,
-0x03,0x0e,0x00,0x05,0x00,0x0f,0xb8,0x00,0x1e,0x2b,0x00,0xb8,0x00,0x00,0x2f,0xb8,
-0x00,0x02,0x2f,0x30,0x31,0x11,0x15,0x17,0x33,0x35,0x27,0x61,0xc4,0x61,0x03,0x0e,
-0x83,0x84,0x84,0x83,0x00,0x02,0x00,0x00,0x00,0x00,0x01,0xe8,0x02,0x07,0x00,0x05,
-0x00,0x09,0x00,0x47,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x06,0x00,0x01,0x00,0x21,0x2b,
-0xb8,0x00,0x06,0x10,0xba,0x00,0x05,0x00,0x07,0x00,0x21,0x2b,0xb8,0x00,0x05,0x10,
-0x00,0xba,0x00,0x02,0x00,0x03,0x00,0x21,0x2b,0xb8,0x00,0x02,0x10,0xba,0x00,0x00,
-0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x00,0x10,0xb8,0x00,0x01,0x10,0xb8,0x00,0x06,
-0xd0,0xb8,0x00,0x02,0x10,0xb8,0x00,0x08,0xd0,0x30,0x31,0x13,0x07,0x11,0x17,0x21,
-0x11,0x05,0x33,0x11,0x23,0x61,0x61,0x61,0x01,0x87,0xfe,0xdc,0x61,0x61,0x02,0x07,
-0x82,0xfe,0xfc,0x81,0x02,0x07,0x82,0xfe,0xfc,0x00,0x00,0x02,0x00,0x00,0x00,0x00,
-0x01,0xe8,0x03,0x0e,0x00,0x08,0x00,0x0c,0x00,0x4b,0xb8,0x00,0x1e,0x2b,0xba,0x00,
-0x08,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x08,0x10,0xba,0x00,0x05,0x00,0x0a,0x00,
-0x21,0x2b,0xb8,0x00,0x05,0x10,0xb8,0x00,0x08,0x10,0xb8,0x00,0x09,0xd0,0x00,0xb8,
-0x00,0x00,0x2f,0xba,0x00,0x01,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x01,0x10,0xba,
-0x00,0x06,0x00,0x0a,0x00,0x21,0x2b,0xb8,0x00,0x06,0x10,0xb8,0x00,0x01,0x10,0xb8,
-0x00,0x0b,0xd0,0x30,0x31,0x19,0x01,0x17,0x21,0x37,0x11,0x27,0x23,0x19,0x01,0x33,
-0x11,0x23,0x61,0x01,0x25,0x62,0x65,0xbf,0x61,0x61,0x03,0x0e,0xfd,0x73,0x81,0x81,
-0x01,0x04,0x84,0x01,0x05,0xfe,0x77,0xfe,0xfc,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
-0x01,0xe8,0x02,0x07,0x00,0x0b,0x00,0x43,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x06,0x00,
-0x00,0x00,0x21,0x2b,0xb8,0x00,0x06,0x10,0xba,0x00,0x0a,0x00,0x07,0x00,0x21,0x2b,
-0xb8,0x00,0x0a,0x10,0xb8,0x00,0x03,0xd0,0x00,0xba,0x00,0x05,0x00,0x02,0x00,0x21,
-0x2b,0xb8,0x00,0x05,0x10,0xba,0x00,0x0b,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x0b,
-0x10,0xb8,0x00,0x00,0x10,0xb8,0x00,0x06,0xd0,0x30,0x31,0x19,0x01,0x17,0x21,0x35,
-0x21,0x11,0x33,0x15,0x33,0x11,0x21,0x61,0x01,0x87,0xfe,0xdc,0x61,0xc3,0xfe,0x79,
-0x01,0x85,0xfe,0xfc,0x81,0x82,0x01,0x03,0x82,0x01,0x04,0x00,0x00,0x02,0x00,0x00,
-0x00,0x00,0x01,0xe8,0x03,0x0e,0x00,0x07,0x00,0x0b,0x00,0x53,0xb8,0x00,0x1e,0x2b,
-0xba,0x00,0x08,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x08,0x10,0xba,0x00,0x04,0x00,
-0x05,0x00,0x21,0x2b,0xb8,0x00,0x04,0x10,0xb8,0x00,0x05,0x10,0xb8,0x00,0x09,0xd0,
-0x00,0xb8,0x00,0x04,0x2f,0xba,0x00,0x01,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x01,
-0x10,0xba,0x00,0x07,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x07,0x10,0xb8,0x00,0x00,
-0x10,0xb8,0x00,0x08,0xd0,0xb8,0x00,0x01,0x10,0xb8,0x00,0x0a,0xd0,0x30,0x31,0x19,
-0x01,0x17,0x21,0x11,0x23,0x11,0x23,0x17,0x33,0x11,0x23,0x61,0x01,0x87,0xc3,0xc4,
-0x63,0x61,0x61,0x01,0x85,0xfe,0xfc,0x81,0x03,0x0e,0xfe,0xf9,0x82,0xfe,0xfc,0x00,
-0x00,0x02,0x00,0x00,0x00,0x00,0x01,0xeb,0x02,0x09,0x00,0x08,0x00,0x0c,0x00,0x53,
-0xb8,0x00,0x1e,0x2b,0xba,0x00,0x09,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x09,0x10,
-0xba,0x00,0x06,0x00,0x0a,0x00,0x21,0x2b,0xb8,0x00,0x06,0x10,0xb8,0x00,0x03,0xd0,
-0xb8,0x00,0x03,0x2f,0x00,0xba,0x00,0x05,0x00,0x03,0x00,0x21,0x2b,0xb8,0x00,0x05,
-0x10,0xba,0x00,0x08,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x08,0x10,0xb8,0x00,0x00,
-0x10,0xb8,0x00,0x09,0xd0,0xb8,0x00,0x05,0x10,0xb8,0x00,0x0b,0xd0,0xb8,0x00,0x0b,
-0x2f,0x30,0x31,0x19,0x01,0x17,0x21,0x35,0x23,0x37,0x35,0x21,0x17,0x33,0x11,0x23,
-0x61,0x01,0x8a,0x6b,0x68,0xfe,0x79,0x63,0x61,0x61,0x01,0x85,0xfe,0xfc,0x81,0x82,
-0x8c,0xfb,0x84,0xfe,0xfc,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0xe8,0x03,0x0e,
-0x00,0x0e,0x00,0x53,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x0e,0x00,0x0b,0x00,0x21,0x2b,
-0xb8,0x00,0x0e,0x10,0xb8,0x00,0x02,0xd0,0xb8,0x00,0x02,0x2f,0xb8,0x00,0x0b,0x10,
-0xb8,0x00,0x07,0xd0,0x00,0xb8,0x00,0x0c,0x2f,0xba,0x00,0x06,0x00,0x03,0x00,0x21,
-0x2b,0xb8,0x00,0x06,0x10,0xba,0x00,0x01,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x01,
-0x10,0xb8,0x00,0x08,0xd0,0xb8,0x00,0x08,0x2f,0xb8,0x00,0x00,0x10,0xb8,0x00,0x0a,
-0xd0,0xb8,0x00,0x0a,0x2f,0x30,0x31,0x01,0x35,0x23,0x35,0x33,0x35,0x23,0x07,0x15,
-0x23,0x15,0x33,0x11,0x33,0x11,0x01,0xe8,0xc3,0x61,0xc2,0x63,0x61,0x61,0xbf,0x01,
-0x88,0x81,0x82,0x83,0x83,0x84,0x82,0xfe,0x7b,0x01,0x88,0x00,0x00,0x02,0x00,0x00,
-0xfe,0xfd,0x01,0xe8,0x02,0x07,0x00,0x03,0x00,0x0e,0x00,0x67,0xb8,0x00,0x1e,0x2b,
-0xba,0x00,0x00,0x00,0x09,0x00,0x21,0x2b,0xba,0x00,0x07,0x00,0x01,0x00,0x21,0x2b,
-0xb8,0x00,0x07,0x10,0xb8,0x00,0x00,0x10,0xb8,0x00,0x04,0xd0,0xb8,0x00,0x04,0x2f,
-0xb8,0x00,0x01,0x10,0xb8,0x00,0x0c,0xd0,0xb8,0x00,0x0c,0x2f,0x00,0xba,0x00,0x0e,
-0x00,0x04,0x00,0x21,0x2b,0xb8,0x00,0x0e,0x10,0xba,0x00,0x08,0x00,0x09,0x00,0x21,
-0x2b,0xb8,0x00,0x08,0x10,0xba,0x00,0x0a,0x00,0x0b,0x00,0x21,0x2b,0xb8,0x00,0x0a,
-0x10,0xb8,0x00,0x09,0x10,0xb8,0x00,0x00,0xd0,0xb8,0x00,0x0a,0x10,0xb8,0x00,0x02,
-0xd0,0x30,0x31,0x13,0x33,0x11,0x23,0x03,0x33,0x37,0x11,0x21,0x07,0x11,0x17,0x33,
-0x15,0x23,0xc4,0x61,0x61,0x02,0xc4,0x62,0xfe,0x79,0x61,0x5e,0xc2,0x5e,0x01,0x85,
-0xfe,0xfc,0xfe,0x7c,0x7f,0x02,0x8b,0x82,0xfe,0xfc,0x81,0x76,0x00,0x01,0x00,0x00,
-0x00,0x00,0x01,0xe8,0x03,0x0e,0x00,0x09,0x00,0x43,0xb8,0x00,0x1e,0x2b,0xba,0x00,
-0x03,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x03,0x10,0xba,0x00,0x07,0x00,0x04,0x00,
-0x21,0x2b,0xb8,0x00,0x07,0x10,0xb8,0x00,0x03,0x10,0xb8,0x00,0x08,0xd0,0xb8,0x00,
-0x08,0x2f,0x00,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x01,0x2f,0xb8,0x00,0x05,0x2f,0xba,
-0x00,0x08,0x00,0x03,0x00,0x21,0x2b,0xb8,0x00,0x08,0x10,0x30,0x31,0x19,0x01,0x33,
-0x11,0x33,0x11,0x33,0x11,0x21,0x11,0xc4,0x60,0xc4,0xfe,0xda,0x03,0x0e,0xfc,0xf2,
-0x01,0x6d,0xfe,0x93,0x02,0x0e,0x01,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0xc4,
-0x03,0x0e,0x00,0x03,0x00,0x08,0x00,0x37,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x08,0x00,
-0x04,0x00,0x21,0x2b,0xb8,0x00,0x08,0x10,0xb8,0x00,0x04,0x10,0xb8,0x00,0x00,0xd0,
-0xb8,0x00,0x08,0x10,0xb8,0x00,0x02,0xd0,0xb8,0x00,0x02,0x2f,0x00,0xb8,0x00,0x06,
-0x2f,0xba,0x00,0x00,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x00,0x10,0x30,0x31,0x11,
-0x15,0x33,0x35,0x03,0x11,0x17,0x33,0x11,0xc4,0xc4,0x61,0x61,0x03,0x0e,0x83,0x83,
-0xfe,0xf9,0xfe,0x7a,0x81,0x02,0x07,0x00,0x00,0x02,0xff,0xa1,0xfe,0xff,0x00,0xc8,
-0x03,0x0d,0x00,0x06,0x00,0x0a,0x00,0x3f,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x03,0x00,
-0x04,0x00,0x21,0x2b,0xb8,0x00,0x03,0x10,0xb8,0x00,0x04,0x10,0xb8,0x00,0x07,0xd0,
-0xb8,0x00,0x03,0x10,0xb8,0x00,0x09,0xd0,0xb8,0x00,0x09,0x2f,0x00,0xba,0x00,0x06,
-0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x06,0x10,0xba,0x00,0x07,0x00,0x08,0x00,0x21,
-0x2b,0xb8,0x00,0x07,0x10,0x30,0x31,0x03,0x33,0x37,0x11,0x23,0x11,0x23,0x13,0x15,
-0x33,0x35,0x5f,0xc6,0x61,0xc8,0x5f,0x5f,0xc4,0xfe,0xff,0x7e,0x02,0x8c,0xfd,0x82,
-0x03,0x82,0x83,0x83,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0xe8,0x03,0x0e,0x00,0x0c,
-0x00,0x37,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x0c,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,
-0x0c,0x10,0xb8,0x00,0x02,0xd0,0x00,0xb8,0x00,0x00,0x2f,0xba,0x00,0x03,0x00,0x02,
-0x00,0x21,0x2b,0xb8,0x00,0x03,0x10,0xb8,0x00,0x02,0x10,0xb8,0x00,0x05,0xd0,0xb8,
-0x00,0x03,0x10,0xb8,0x00,0x06,0xd0,0x30,0x31,0x19,0x01,0x33,0x35,0x17,0x33,0x35,
-0x23,0x27,0x37,0x23,0x07,0x11,0xc4,0x61,0xc0,0x5f,0x5b,0xbd,0xc3,0x61,0x03,0x0e,
-0xfc,0xf2,0x81,0x81,0x81,0x8a,0xfc,0x82,0x01,0x89,0x00,0x01,0x00,0x00,0x00,0x00,
-0x01,0x25,0x03,0x0e,0x00,0x06,0x00,0x27,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x06,0x00,
-0x00,0x00,0x21,0x2b,0xb8,0x00,0x06,0x10,0x00,0xb8,0x00,0x00,0x2f,0xba,0x00,0x01,
-0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x01,0x10,0xb8,0x00,0x04,0xd0,0x30,0x31,0x19,
-0x01,0x17,0x33,0x35,0x23,0x11,0x61,0xc4,0x61,0x03,0x0e,0xfd,0x73,0x81,0x81,0x02,
-0x8d,0x00,0x00,0x01,0xff,0xff,0x00,0x00,0x03,0x0e,0x02,0x09,0x00,0x0d,0x00,0x57,
-0xb8,0x00,0x1e,0x2b,0xba,0x00,0x0d,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x0d,0x10,
-0xba,0x00,0x09,0x00,0x0a,0x00,0x21,0x2b,0xb8,0x00,0x09,0x10,0xba,0x00,0x05,0x00,
-0x06,0x00,0x21,0x2b,0xb8,0x00,0x05,0x10,0xb8,0x00,0x0f,0xdc,0x00,0xb8,0x00,0x00,
-0x2f,0xb8,0x00,0x05,0x2f,0xb8,0x00,0x09,0x2f,0xba,0x00,0x02,0x00,0x01,0x00,0x21,
-0x2b,0xb8,0x00,0x02,0x10,0xb8,0x00,0x01,0x10,0xb8,0x00,0x07,0xd0,0xb8,0x00,0x01,
-0x10,0xb8,0x00,0x0b,0xd0,0x30,0x31,0x23,0x11,0x37,0x21,0x17,0x11,0x23,0x11,0x23,
-0x11,0x23,0x11,0x23,0x11,0x01,0x62,0x02,0x4b,0x62,0xc4,0x62,0xc3,0x61,0x01,0x89,
-0x80,0x80,0xfe,0x77,0x01,0x89,0xfe,0x77,0x01,0x89,0xfe,0x77,0x00,0x01,0xff,0xff,
-0x00,0x00,0x01,0xe7,0x02,0x0a,0x00,0x08,0x00,0x33,0xb8,0x00,0x1e,0x2b,0xba,0x00,
-0x02,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x02,0x10,0xba,0x00,0x07,0x00,0x04,0x00,
-0x21,0x2b,0xb8,0x00,0x07,0x10,0x00,0xb8,0x00,0x01,0x2f,0xb8,0x00,0x05,0x2f,0xba,
-0x00,0x08,0x00,0x04,0x00,0x21,0x2b,0xb8,0x00,0x08,0x10,0x30,0x31,0x03,0x13,0x33,
-0x11,0x33,0x11,0x33,0x11,0x27,0x01,0x01,0xc1,0x63,0xc3,0x67,0x02,0x0a,0xfd,0xf6,
-0x01,0x74,0xfe,0x8c,0x01,0x88,0x82,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x01,0xe8,
-0x02,0x09,0x00,0x07,0x00,0x0b,0x00,0x47,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x08,0x00,
-0x01,0x00,0x21,0x2b,0xb8,0x00,0x08,0x10,0xba,0x00,0x06,0x00,0x09,0x00,0x21,0x2b,
-0xb8,0x00,0x06,0x10,0x00,0xba,0x00,0x02,0x00,0x03,0x00,0x21,0x2b,0xb8,0x00,0x02,
-0x10,0xba,0x00,0x00,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x00,0x10,0xb8,0x00,0x01,
-0x10,0xb8,0x00,0x08,0xd0,0xb8,0x00,0x02,0x10,0xb8,0x00,0x0a,0xd0,0x30,0x31,0x13,
-0x07,0x11,0x17,0x21,0x37,0x11,0x27,0x07,0x33,0x11,0x23,0x61,0x61,0x61,0x01,0x25,
-0x62,0x65,0xbf,0x61,0x61,0x02,0x09,0x84,0xfe,0xfc,0x81,0x81,0x01,0x03,0x85,0x84,
-0xfe,0xfc,0x00,0x02,0x00,0x00,0xfe,0xfb,0x01,0xe8,0x02,0x07,0x00,0x07,0x00,0x0b,
-0x00,0x43,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x08,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,
-0x08,0x10,0xba,0x00,0x06,0x00,0x09,0x00,0x21,0x2b,0xb8,0x00,0x06,0x10,0xb8,0x00,
-0x08,0x10,0xb8,0x00,0x02,0xd0,0x00,0xb8,0x00,0x01,0x2f,0xba,0x00,0x07,0x00,0x09,
-0x00,0x21,0x2b,0xb8,0x00,0x07,0x10,0xba,0x00,0x0b,0x00,0x03,0x00,0x21,0x2b,0xb8,
-0x00,0x0b,0x10,0x30,0x31,0x19,0x01,0x33,0x11,0x33,0x37,0x11,0x27,0x07,0x33,0x11,
-0x23,0xc4,0xc6,0x5e,0x65,0xbf,0x61,0x61,0x02,0x07,0xfc,0xf4,0x01,0x05,0x81,0x01,
-0x12,0x74,0x82,0xfe,0xfc,0x00,0x00,0x02,0x00,0x00,0xfe,0xfb,0x01,0xe8,0x02,0x07,
-0x00,0x07,0x00,0x0b,0x00,0x53,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x08,0x00,0x00,0x00,
-0x21,0x2b,0xb8,0x00,0x08,0x10,0xba,0x00,0x05,0x00,0x04,0x00,0x21,0x2b,0xb8,0x00,
-0x05,0x10,0xb8,0x00,0x04,0x10,0xb8,0x00,0x09,0xd0,0x00,0xb8,0x00,0x04,0x2f,0xba,
-0x00,0x07,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x07,0x10,0xba,0x00,0x01,0x00,0x02,
-0x00,0x21,0x2b,0xb8,0x00,0x01,0x10,0xb8,0x00,0x00,0x10,0xb8,0x00,0x08,0xd0,0xb8,
-0x00,0x01,0x10,0xb8,0x00,0x0a,0xd0,0x30,0x31,0x19,0x01,0x17,0x33,0x11,0x33,0x11,
-0x21,0x17,0x33,0x11,0x23,0x61,0xc4,0xc3,0xfe,0x79,0x63,0x61,0x61,0x01,0x85,0xfe,
-0xfc,0x81,0xfe,0xfb,0x03,0x0c,0x82,0xfe,0xfc,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
-0x01,0xe8,0x02,0x07,0x00,0x06,0x00,0x23,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x04,0x00,
-0x01,0x00,0x21,0x2b,0xb8,0x00,0x04,0x10,0x00,0xb8,0x00,0x02,0x2f,0xba,0x00,0x00,
-0x00,0x04,0x00,0x21,0x2b,0xb8,0x00,0x00,0x10,0x30,0x31,0x13,0x07,0x11,0x33,0x11,
-0x21,0x27,0x61,0x61,0xc2,0x01,0x26,0x65,0x02,0x07,0x82,0xfe,0x7b,0x01,0x84,0x83,
-0x00,0x01,0x00,0x00,0x00,0x00,0x01,0xdd,0x02,0x05,0x00,0x0f,0x00,0x47,0xb8,0x00,
-0x1e,0x2b,0xba,0x00,0x0e,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x0e,0x10,0xba,0x00,
-0x0b,0x00,0x05,0x00,0x21,0x2b,0xb8,0x00,0x0b,0x10,0x00,0xba,0x00,0x07,0x00,0x08,
-0x00,0x21,0x2b,0xb8,0x00,0x07,0x10,0xba,0x00,0x01,0x00,0x0e,0x00,0x21,0x2b,0xb8,
-0x00,0x01,0x10,0xba,0x00,0x03,0x00,0x04,0x00,0x21,0x2b,0xb8,0x00,0x03,0x10,0xb8,
-0x00,0x0c,0xd0,0x30,0x31,0x01,0x21,0x07,0x15,0x17,0x33,0x15,0x23,0x15,0x21,0x37,
-0x35,0x27,0x23,0x35,0x33,0x01,0x86,0xfe,0xdb,0x61,0x61,0xc4,0xc4,0x01,0x25,0x57,
-0x57,0xc4,0xc4,0x02,0x05,0x67,0x67,0x6a,0x57,0x76,0x66,0x76,0x5b,0x51,0x00,0x01,
-0x00,0x00,0x00,0x00,0x01,0x86,0x03,0x10,0x00,0x0e,0x00,0x4b,0xb8,0x00,0x1e,0x2b,
-0xba,0x00,0x08,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x08,0x10,0xb8,0x00,0x0b,0xd0,
-0xb8,0x00,0x02,0x10,0xb8,0x00,0x0d,0xd0,0x00,0xb8,0x00,0x0c,0x2f,0xba,0x00,0x07,
-0x00,0x04,0x00,0x21,0x2b,0xb8,0x00,0x07,0x10,0xba,0x00,0x00,0x00,0x01,0x00,0x21,
-0x2b,0xb8,0x00,0x00,0x10,0xb8,0x00,0x01,0x10,0xb8,0x00,0x08,0xd0,0xb8,0x00,0x00,
-0x10,0xb8,0x00,0x0a,0xd0,0x30,0x31,0x11,0x15,0x33,0x11,0x17,0x33,0x35,0x23,0x11,
-0x33,0x35,0x23,0x11,0x23,0x11,0x61,0x63,0xc2,0x61,0x61,0x61,0xc4,0x02,0x07,0x82,
-0xfe,0xfc,0x81,0x81,0x01,0x04,0x82,0x01,0x09,0xfe,0xf7,0x00,0x00,0x01,0x00,0x00,
-0x00,0x00,0x01,0xe8,0x02,0x07,0x00,0x08,0x00,0x37,0xb8,0x00,0x1e,0x2b,0xba,0x00,
-0x08,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x08,0x10,0xba,0x00,0x04,0x00,0x05,0x00,
-0x21,0x2b,0xb8,0x00,0x04,0x10,0x00,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x04,0x2f,0xba,
-0x00,0x01,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x01,0x10,0xb8,0x00,0x06,0xd0,0x30,
-0x31,0x19,0x01,0x17,0x21,0x11,0x23,0x11,0x23,0x11,0x61,0x01,0x87,0xc3,0x61,0x02,
-0x07,0xfe,0x7a,0x81,0x02,0x07,0xfe,0x7a,0x01,0x86,0x00,0x01,0x00,0x00,0x00,0x00,
-0x01,0xe8,0x02,0x07,0x00,0x06,0x00,0x29,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x06,0x00,
-0x00,0x00,0x21,0x2b,0xb8,0x00,0x06,0x10,0x00,0xb8,0x00,0x01,0x2f,0xb8,0x00,0x00,
-0x2f,0xb8,0x00,0x03,0x2f,0xba,0x00,0x05,0x00,0x01,0x00,0x00,0x11,0x12,0x39,0x30,
-0x31,0x19,0x01,0x21,0x13,0x23,0x03,0x11,0x01,0x43,0xa5,0xc3,0x61,0x02,0x07,0xfd,
-0xf9,0x02,0x07,0xfe,0x7a,0x01,0x86,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x03,0x0e,
-0x02,0x09,0x00,0x0d,0x00,0x53,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x0d,0x00,0x00,0x00,
-0x21,0x2b,0xb8,0x00,0x0d,0x10,0xba,0x00,0x09,0x00,0x0a,0x00,0x21,0x2b,0xb8,0x00,
-0x09,0x10,0xba,0x00,0x05,0x00,0x06,0x00,0x21,0x2b,0xb8,0x00,0x05,0x10,0xb8,0x00,
-0x0f,0xdc,0x00,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x05,0x2f,0xb8,0x00,0x09,0x2f,0xba,
-0x00,0x01,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x01,0x10,0xb8,0x00,0x07,0xd0,0xb8,
-0x00,0x01,0x10,0xb8,0x00,0x0b,0xd0,0x30,0x31,0x19,0x01,0x17,0x21,0x37,0x11,0x23,
-0x11,0x23,0x11,0x23,0x11,0x23,0x11,0x61,0x02,0x4b,0x62,0xc4,0x62,0xc3,0x61,0x02,
-0x07,0xfe,0x7a,0x81,0x81,0x01,0x88,0xfe,0x78,0x01,0x86,0xfe,0x7a,0x01,0x86,0x00,
-0x00,0x01,0x00,0x00,0x00,0x00,0x01,0xeb,0x02,0x0a,0x00,0x13,0x00,0x47,0xb8,0x00,
-0x1e,0x2b,0x00,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x10,0x2f,0xba,0x00,0x05,0x00,0x06,
-0x00,0x21,0x2b,0xb8,0x00,0x05,0x10,0xb8,0x00,0x10,0x10,0xb8,0x00,0x0f,0xdc,0xb8,
-0x00,0x01,0xd0,0xb8,0x00,0x01,0x2f,0xb8,0x00,0x06,0x10,0xb8,0x00,0x09,0xd0,0xb8,
-0x00,0x05,0x10,0xb8,0x00,0x0b,0xd0,0xb8,0x00,0x10,0x10,0xb8,0x00,0x13,0xd0,0xb8,
-0x00,0x13,0x2f,0x30,0x31,0x11,0x15,0x33,0x17,0x07,0x23,0x15,0x33,0x37,0x17,0x33,
-0x35,0x23,0x27,0x37,0x33,0x35,0x23,0x07,0x27,0x41,0x2c,0x2c,0x41,0xb3,0x38,0x3b,
-0xc5,0x45,0x3c,0x3a,0x44,0xc2,0x36,0x34,0x02,0x0a,0x8a,0x75,0x89,0x82,0xac,0xac,
-0x82,0x81,0x81,0x83,0xae,0xb1,0x00,0x01,0x00,0x00,0xfe,0xfd,0x01,0xe8,0x02,0x09,
-0x00,0x0d,0x00,0x4b,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x03,0x00,0x04,0x00,0x21,0x2b,
-0xb8,0x00,0x03,0x10,0xba,0x00,0x0d,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x0d,0x10,
-0xb8,0x00,0x00,0x10,0xb8,0x00,0x07,0xd0,0xb8,0x00,0x07,0x2f,0x00,0xb8,0x00,0x00,
-0x2f,0xb8,0x00,0x03,0x2f,0xba,0x00,0x09,0x00,0x0a,0x00,0x21,0x2b,0xb8,0x00,0x09,
-0x10,0xba,0x00,0x02,0x00,0x07,0x00,0x21,0x2b,0xb8,0x00,0x02,0x10,0x30,0x31,0x01,
-0x11,0x23,0x11,0x23,0x11,0x17,0x33,0x15,0x23,0x15,0x21,0x37,0x11,0x01,0x24,0x62,
-0xc2,0x5e,0xc2,0xbf,0x01,0x25,0x62,0x02,0x09,0xfe,0x79,0x01,0x87,0xfe,0x78,0x81,
-0x76,0x8d,0x7f,0x02,0x8d,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0xeb,0x02,0x07,
-0x00,0x09,0x00,0x27,0xb8,0x00,0x1e,0x2b,0x00,0xba,0x00,0x03,0x00,0x04,0x00,0x21,
-0x2b,0xb8,0x00,0x03,0x10,0xba,0x00,0x00,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x00,
-0x10,0xb8,0x00,0x03,0x10,0xb8,0x00,0x06,0xd0,0x30,0x31,0x11,0x15,0x21,0x01,0x15,
-0x21,0x35,0x23,0x37,0x35,0x01,0x25,0xfe,0xdb,0x01,0xeb,0xc6,0xc3,0x02,0x07,0x82,
-0xfe,0xfd,0x82,0x82,0xb0,0xd5,0x00,0x01,0x00,0x00,0xff,0x7c,0x01,0x86,0x03,0x0e,
-0x00,0x10,0x00,0x35,0xb8,0x00,0x1e,0x2b,0x00,0xba,0x00,0x0b,0x00,0x08,0x00,0x21,
-0x2b,0xb8,0x00,0x0b,0x10,0xba,0x00,0x01,0x00,0x0f,0x00,0x21,0x2b,0xb8,0x00,0x01,
-0x10,0xba,0x00,0x04,0x00,0x05,0x00,0x21,0x2b,0xb8,0x00,0x04,0x10,0xba,0x00,0x0d,
-0x00,0x05,0x00,0x04,0x11,0x12,0x39,0x30,0x31,0x01,0x23,0x07,0x11,0x23,0x15,0x33,
-0x11,0x17,0x33,0x35,0x23,0x11,0x27,0x37,0x11,0x33,0x01,0x86,0xc2,0x63,0x61,0x61,
-0x63,0xc2,0x61,0x73,0x73,0x61,0x03,0x0e,0x83,0xfe,0xfa,0x82,0xfe,0xfd,0x84,0x84,
-0x01,0x03,0x43,0x3f,0x01,0x06,0x00,0x01,0x00,0x00,0xfe,0xfb,0x00,0x61,0x03,0x0e,
-0x00,0x03,0x00,0x1b,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x03,0x00,0x00,0x00,0x21,0x2b,
-0xb8,0x00,0x03,0x10,0x00,0xb8,0x00,0x01,0x2f,0xb8,0x00,0x00,0x2f,0x30,0x31,0x19,
-0x01,0x33,0x11,0x61,0x03,0x0e,0xfb,0xed,0x04,0x13,0x00,0x01,0x00,0x00,0xff,0x7c,
-0x01,0x86,0x03,0x0e,0x00,0x10,0x00,0x45,0xb8,0x00,0x1e,0x2b,0x00,0xba,0x00,0x07,
-0x00,0x08,0x00,0x21,0x2b,0xb8,0x00,0x07,0x10,0xba,0x00,0x01,0x00,0x02,0x00,0x21,
-0x2b,0xb8,0x00,0x01,0x10,0xba,0x00,0x04,0x00,0x05,0x00,0x21,0x2b,0xb8,0x00,0x04,
-0x10,0xb8,0x00,0x07,0x10,0xb8,0x00,0x0a,0xd0,0xba,0x00,0x0d,0x00,0x05,0x00,0x04,
-0x11,0x12,0x39,0xb8,0x00,0x02,0x10,0xb8,0x00,0x0f,0xd0,0x30,0x31,0x11,0x33,0x17,
-0x11,0x33,0x15,0x23,0x11,0x07,0x23,0x35,0x33,0x11,0x37,0x27,0x11,0x23,0xc4,0x61,
-0x61,0x61,0x61,0xc4,0x61,0x74,0x74,0x61,0x03,0x0e,0x83,0xfe,0xfa,0x82,0xfe,0xfd,
-0x84,0x84,0x01,0x03,0x43,0x3f,0x01,0x06,0x00,0x01,0x00,0x02,0x01,0x04,0x01,0x8a,
-0x02,0x0b,0x00,0x0b,0x00,0x2b,0xb8,0x00,0x1e,0x2b,0x00,0xb8,0x00,0x06,0x2f,0xb8,
-0x00,0x09,0x2f,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x03,0x2f,0xba,0x00,0x02,0x00,0x00,
-0x00,0x06,0x11,0x12,0x39,0xba,0x00,0x08,0x00,0x00,0x00,0x06,0x11,0x12,0x39,0x30,
-0x31,0x13,0x33,0x37,0x15,0x33,0x37,0x35,0x23,0x07,0x35,0x23,0x07,0x02,0x62,0x61,
-0x62,0x63,0x63,0x61,0x62,0x62,0x01,0x04,0x6b,0x6b,0x85,0x82,0x7f,0x7f,0x7f,0x00,
-0x00,0x01,0xff,0xff,0xff,0xfe,0x01,0xe8,0x03,0x0e,0x00,0x05,0x00,0x0f,0xb8,0x00,
-0x1e,0x2b,0x00,0xb8,0x00,0x02,0x2f,0xb8,0x00,0x00,0x2f,0x30,0x31,0x05,0x11,0x03,
-0x23,0x03,0x11,0x01,0xe8,0xbe,0x67,0xc4,0x02,0x02,0x0d,0x01,0x03,0xfe,0xfb,0xfd,
-0xf5,0x00,0x00,0x01,0x00,0x00,0xfe,0xfb,0x00,0xc4,0x01,0x03,0x00,0x07,0x00,0x37,
-0xb8,0x00,0x1e,0x2b,0xba,0x00,0x07,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x07,0x10,
-0xba,0x00,0x02,0x00,0x00,0x00,0x07,0x11,0x12,0x39,0xb8,0x00,0x00,0x10,0xb8,0x00,
-0x03,0xd0,0x00,0xb8,0x00,0x04,0x2f,0xb8,0x00,0x00,0x2f,0xba,0x00,0x02,0x00,0x04,
-0x00,0x00,0x11,0x12,0x39,0x30,0x31,0x19,0x01,0x33,0x07,0x15,0x33,0x37,0x11,0x61,
-0x61,0x61,0x63,0x01,0x03,0xfe,0xfd,0x84,0x81,0x81,0x01,0x87,0x00,0x01,0x00,0x01,
-0xfe,0xfc,0x01,0xe8,0x02,0x0a,0x00,0x0e,0x00,0x53,0xb8,0x00,0x1e,0x2b,0xba,0x00,
-0x0e,0x00,0x0b,0x00,0x21,0x2b,0xb8,0x00,0x0e,0x10,0xb8,0x00,0x02,0xd0,0xb8,0x00,
-0x02,0x2f,0xb8,0x00,0x0b,0x10,0xb8,0x00,0x07,0xd0,0x00,0xb8,0x00,0x0c,0x2f,0xba,
-0x00,0x05,0x00,0x04,0x00,0x21,0x2b,0xb8,0x00,0x05,0x10,0xba,0x00,0x01,0x00,0x00,
-0x00,0x21,0x2b,0xb8,0x00,0x01,0x10,0xb8,0x00,0x08,0xd0,0xb8,0x00,0x08,0x2f,0xb8,
-0x00,0x00,0x10,0xb8,0x00,0x0a,0xd0,0xb8,0x00,0x0a,0x2f,0x30,0x31,0x25,0x35,0x23,
-0x35,0x33,0x35,0x23,0x07,0x15,0x23,0x15,0x33,0x11,0x33,0x11,0x01,0xe8,0xc2,0x62,
-0xc4,0x62,0x61,0x61,0xbe,0x84,0x82,0x82,0x82,0x82,0x84,0x82,0xfe,0x7a,0x01,0x88,
-0x00,0x02,0x00,0x00,0xfe,0xfb,0x01,0xe8,0x01,0x07,0x00,0x07,0x00,0x0f,0x00,0x67,
-0xb8,0x00,0x1e,0x2b,0xba,0x00,0x07,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x07,0x10,
-0xba,0x00,0x0f,0x00,0x08,0x00,0x21,0x2b,0xb8,0x00,0x0f,0x10,0xba,0x00,0x02,0x00,
-0x00,0x00,0x07,0x11,0x12,0x39,0xb8,0x00,0x00,0x10,0xb8,0x00,0x03,0xd0,0xba,0x00,
-0x0a,0x00,0x08,0x00,0x0f,0x11,0x12,0x39,0xb8,0x00,0x08,0x10,0xb8,0x00,0x0b,0xd0,
-0x00,0xb8,0x00,0x04,0x2f,0xb8,0x00,0x0c,0x2f,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x08,
-0x2f,0xba,0x00,0x02,0x00,0x04,0x00,0x00,0x11,0x12,0x39,0xba,0x00,0x0a,0x00,0x04,
-0x00,0x00,0x11,0x12,0x39,0x30,0x31,0x19,0x01,0x33,0x07,0x15,0x33,0x37,0x11,0x33,
-0x11,0x33,0x07,0x15,0x33,0x37,0x11,0x61,0x61,0x61,0x63,0x61,0x61,0x61,0x61,0x62,
-0x01,0x07,0xfe,0xf9,0x83,0x82,0x82,0x01,0x8a,0xfe,0xf9,0x83,0x82,0x82,0x01,0x8a,
-0x00,0x03,0x00,0x00,0x00,0x00,0x02,0xcc,0x01,0x07,0x00,0x03,0x00,0x07,0x00,0x0b,
-0x00,0x47,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x03,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,
-0x03,0x10,0xba,0x00,0x07,0x00,0x04,0x00,0x21,0x2b,0xb8,0x00,0x07,0x10,0xba,0x00,
-0x0b,0x00,0x08,0x00,0x21,0x2b,0xb8,0x00,0x0b,0x10,0xb8,0x00,0x0d,0xdc,0x00,0xb8,
-0x00,0x00,0x2f,0xb8,0x00,0x04,0x2f,0xb8,0x00,0x08,0x2f,0xb8,0x00,0x01,0x2f,0xb8,
-0x00,0x05,0x2f,0xb8,0x00,0x09,0x2f,0x30,0x31,0x19,0x01,0x33,0x11,0x33,0x11,0x33,
-0x11,0x33,0x11,0x33,0x11,0xc4,0x3f,0xc3,0x43,0xc3,0x01,0x07,0xfe,0xf9,0x01,0x07,
-0xfe,0xf9,0x01,0x07,0xfe,0xf9,0x01,0x07,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x86,
-0x03,0x10,0x00,0x0b,0x00,0x43,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x05,0x00,0x02,0x00,
-0x21,0x2b,0xb8,0x00,0x05,0x10,0xb8,0x00,0x08,0xd0,0xb8,0x00,0x02,0x10,0xb8,0x00,
-0x0a,0xd0,0x00,0xb8,0x00,0x09,0x2f,0xb8,0x00,0x03,0x2f,0xba,0x00,0x00,0x00,0x01,
-0x00,0x21,0x2b,0xb8,0x00,0x00,0x10,0xb8,0x00,0x01,0x10,0xb8,0x00,0x05,0xd0,0xb8,
-0x00,0x00,0x10,0xb8,0x00,0x07,0xd0,0x30,0x31,0x11,0x15,0x33,0x11,0x33,0x11,0x33,
-0x35,0x23,0x11,0x23,0x11,0x61,0xc4,0x61,0x61,0xc4,0x02,0x07,0x82,0xfe,0x7b,0x01,
-0x85,0x82,0x01,0x09,0xfe,0xf7,0x00,0x01,0xff,0xff,0x00,0x00,0x01,0x86,0x03,0x10,
-0x00,0x13,0x00,0x7b,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x08,0x00,0x05,0x00,0x21,0x2b,
-0xb8,0x00,0x08,0x10,0xb8,0x00,0x05,0x10,0xb8,0x00,0x01,0xd0,0xb8,0x00,0x01,0x2f,
-0xb8,0x00,0x08,0x10,0xb8,0x00,0x0b,0xd0,0xb8,0x00,0x08,0x10,0xb8,0x00,0x0f,0xd0,
-0xb8,0x00,0x05,0x10,0xb8,0x00,0x11,0xd0,0xb8,0x00,0x11,0x2f,0x00,0xb8,0x00,0x06,
-0x2f,0xb8,0x00,0x10,0x2f,0xba,0x00,0x0d,0x00,0x0e,0x00,0x21,0x2b,0xb8,0x00,0x0d,
-0x10,0xba,0x00,0x05,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x05,0x10,0xb8,0x00,0x0d,
-0x10,0xb8,0x00,0x00,0xd0,0xb8,0x00,0x05,0x10,0xb8,0x00,0x08,0xd0,0xb8,0x00,0x02,
-0x10,0xb8,0x00,0x0a,0xd0,0xb8,0x00,0x0e,0x10,0xb8,0x00,0x12,0xd0,0x30,0x31,0x03,
-0x33,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x33,0x15,0x23,0x15,
-0x23,0x35,0x23,0x01,0x61,0x61,0x62,0xc4,0x61,0x61,0x5f,0x5f,0xc5,0x61,0x01,0x5a,
-0x42,0x83,0xf1,0xf1,0x83,0x42,0x82,0xd8,0xd8,0x00,0x00,0x01,0x00,0x00,0x03,0x4d,
-0x01,0x25,0x04,0x54,0x00,0x08,0x00,0x1d,0xb8,0x00,0x1e,0x2b,0x00,0xb8,0x00,0x07,
-0x2f,0xb8,0x00,0x01,0x2f,0xb8,0x00,0x04,0x2f,0xba,0x00,0x03,0x00,0x01,0x00,0x07,
-0x11,0x12,0x39,0x30,0x31,0x11,0x15,0x33,0x37,0x17,0x33,0x35,0x27,0x23,0x61,0x31,
-0x32,0x61,0x61,0x63,0x03,0xd1,0x84,0x8b,0x8b,0x84,0x83,0x00,0x00,0x07,0x00,0x00,
-0x00,0x00,0x03,0x8d,0x03,0x0f,0x00,0x03,0x00,0x0b,0x00,0x0f,0x00,0x17,0x00,0x1b,
-0x00,0x23,0x00,0x27,0x00,0x9b,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x0c,0x00,0x04,0x00,
-0x21,0x2b,0xb8,0x00,0x0c,0x10,0xba,0x00,0x09,0x00,0x0d,0x00,0x21,0x2b,0xb8,0x00,
-0x09,0x10,0xba,0x00,0x18,0x00,0x10,0x00,0x21,0x2b,0xb8,0x00,0x18,0x10,0xba,0x00,
-0x15,0x00,0x19,0x00,0x21,0x2b,0xb8,0x00,0x15,0x10,0xba,0x00,0x24,0x00,0x1c,0x00,
-0x21,0x2b,0xb8,0x00,0x24,0x10,0xba,0x00,0x21,0x00,0x25,0x00,0x21,0x2b,0xb8,0x00,
-0x21,0x10,0xb8,0x00,0x29,0xdc,0x00,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x0a,0x2f,0xba,
-0x00,0x1b,0x00,0x12,0x00,0x21,0x2b,0xb8,0x00,0x1b,0x10,0xba,0x00,0x17,0x00,0x18,
-0x00,0x21,0x2b,0xb8,0x00,0x17,0x10,0xb8,0x00,0x12,0x10,0xb8,0x00,0x01,0xd0,0xb8,
-0x00,0x12,0x10,0xb8,0x00,0x1e,0xd0,0xb8,0x00,0x17,0x10,0xb8,0x00,0x22,0xd0,0xb8,
-0x00,0x18,0x10,0xb8,0x00,0x24,0xd0,0xb8,0x00,0x1b,0x10,0xb8,0x00,0x26,0xd0,0x30,
-0x31,0x01,0x03,0x33,0x13,0x05,0x15,0x17,0x33,0x37,0x35,0x27,0x23,0x17,0x33,0x15,
-0x23,0x05,0x15,0x17,0x33,0x37,0x35,0x27,0x23,0x17,0x33,0x15,0x23,0x37,0x15,0x17,
-0x33,0x37,0x35,0x27,0x23,0x17,0x33,0x15,0x23,0x01,0x63,0xc2,0x60,0xc4,0xfe,0x3b,
-0x31,0x93,0x30,0x30,0x93,0x30,0x31,0x31,0x01,0x12,0x31,0x93,0x31,0x31,0x93,0x32,
-0x30,0x30,0xc3,0x30,0x93,0x31,0x31,0x93,0x31,0x31,0x31,0x03,0x0e,0xfc,0xf2,0x03,
-0x0e,0x60,0xc1,0x61,0x61,0xc1,0x61,0x66,0xa4,0xe4,0xc1,0x60,0x60,0xc1,0x62,0x66,
-0xa4,0xa8,0xc1,0x60,0x60,0xc1,0x62,0x66,0xa4,0x00,0x00,0x02,0x00,0x00,0x00,0x00,
-0x01,0xe8,0x04,0x54,0x00,0x12,0x00,0x1b,0x00,0xb1,0xb8,0x00,0x1e,0x2b,0xba,0x00,
-0x0a,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x0a,0x10,0xba,0x00,0x09,0x00,0x01,0x00,
-0x21,0x2b,0xb8,0x00,0x09,0x10,0xb8,0x00,0x0a,0x10,0xb8,0x00,0x03,0xd0,0xb8,0x00,
-0x03,0x2f,0xb8,0x00,0x00,0x10,0xb8,0x00,0x05,0xd0,0xb8,0x00,0x0a,0x10,0xb8,0x00,
-0x0c,0xd0,0xb8,0x00,0x0c,0x2f,0xb8,0x00,0x01,0x10,0xb8,0x00,0x0d,0xd0,0xb8,0x00,
-0x09,0x10,0xb8,0x00,0x0f,0xd0,0xb8,0x00,0x01,0x10,0xb8,0x00,0x15,0xd0,0xb8,0x00,
-0x15,0x2f,0xb8,0x00,0x0a,0x10,0xb8,0x00,0x17,0xd0,0xb8,0x00,0x17,0x2f,0xb8,0x00,
-0x0a,0x10,0xb8,0x00,0x1a,0xd0,0xb8,0x00,0x1a,0x2f,0xb8,0x00,0x01,0x10,0xb8,0x00,
-0x1b,0xd0,0xb8,0x00,0x1b,0x2f,0x00,0xb8,0x00,0x14,0x2f,0xb8,0x00,0x17,0x2f,0xba,
-0x00,0x03,0x00,0x07,0x00,0x21,0x2b,0xb8,0x00,0x03,0x10,0xba,0x00,0x11,0x00,0x12,
-0x00,0x21,0x2b,0xb8,0x00,0x11,0x10,0xba,0x00,0x0b,0x00,0x12,0x00,0x11,0x11,0x12,
-0x39,0xb8,0x00,0x12,0x10,0xb8,0x00,0x0c,0xd0,0x30,0x31,0x11,0x01,0x15,0x23,0x35,
-0x23,0x11,0x21,0x37,0x35,0x01,0x35,0x17,0x33,0x15,0x33,0x11,0x21,0x07,0x01,0x35,
-0x23,0x07,0x27,0x23,0x15,0x17,0x33,0x01,0x25,0x61,0xc4,0x01,0x86,0x62,0xfe,0xda,
-0x02,0x61,0xc3,0xfe,0x79,0x61,0x01,0x8a,0x63,0x30,0x31,0x62,0x62,0x61,0x02,0x0e,
-0xfe,0xf5,0x82,0x82,0xfe,0xfd,0x81,0x82,0x01,0x0b,0x85,0x08,0x82,0x01,0x05,0x83,
-0x01,0x44,0x85,0x8c,0x8c,0x85,0x82,0x00,0x00,0x01,0x00,0x04,0x00,0x82,0x00,0xca,
-0x02,0x09,0x00,0x08,0x00,0x19,0xb8,0x00,0x1e,0x2b,0x00,0xb8,0x00,0x00,0x2f,0xb8,
-0x00,0x05,0x2f,0xba,0x00,0x03,0x00,0x05,0x00,0x00,0x11,0x12,0x39,0x30,0x31,0x13,
-0x33,0x15,0x07,0x17,0x15,0x23,0x27,0x35,0x66,0x64,0x69,0x69,0x64,0x62,0x02,0x09,
-0x83,0x3f,0x42,0x83,0x83,0x81,0x00,0x02,0x00,0x00,0x00,0x00,0x03,0x64,0x03,0x0e,
-0x00,0x0d,0x00,0x13,0x00,0x5b,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x12,0x00,0x0b,0x00,
-0x21,0x2b,0xb8,0x00,0x12,0x10,0xba,0x00,0x03,0x00,0x0e,0x00,0x21,0x2b,0xb8,0x00,
-0x03,0x10,0xb8,0x00,0x06,0xd0,0x00,0xba,0x00,0x08,0x00,0x09,0x00,0x21,0x2b,0xb8,
-0x00,0x08,0x10,0xba,0x00,0x00,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x00,0x10,0xba,
-0x00,0x04,0x00,0x05,0x00,0x21,0x2b,0xb8,0x00,0x04,0x10,0xb8,0x00,0x0e,0xd0,0xb8,
-0x00,0x01,0x10,0xb8,0x00,0x10,0xd0,0xb8,0x00,0x08,0x10,0xb8,0x00,0x12,0xd0,0x30,
-0x31,0x01,0x15,0x21,0x15,0x33,0x15,0x23,0x11,0x21,0x15,0x21,0x27,0x11,0x37,0x01,
-0x23,0x35,0x23,0x11,0x33,0x03,0x64,0xfe,0xdb,0xc3,0xc3,0x01,0x25,0xfc,0xfd,0x61,
-0x61,0x01,0x1a,0x56,0x61,0xb7,0x03,0x0e,0x83,0x84,0x82,0xfe,0xfc,0x81,0x81,0x02,
-0x0a,0x83,0xfe,0xf9,0x84,0xfd,0xf6,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x01,0xe8,
-0x04,0x54,0x00,0x0a,0x00,0x13,0x00,0x3b,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x08,0x00,
-0x03,0x00,0x21,0x2b,0xb8,0x00,0x08,0x10,0xb8,0x00,0x03,0x10,0xb8,0x00,0x00,0xd0,
-0x00,0xb8,0x00,0x0c,0x2f,0xb8,0x00,0x0f,0x2f,0xba,0x00,0x07,0x00,0x04,0x00,0x21,
-0x2b,0xb8,0x00,0x07,0x10,0xba,0x00,0x00,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x00,
-0x10,0x30,0x31,0x11,0x15,0x21,0x01,0x11,0x21,0x35,0x21,0x35,0x01,0x35,0x27,0x35,
-0x23,0x07,0x27,0x23,0x15,0x17,0x33,0x01,0x25,0xfe,0xdb,0x01,0xe8,0xfe,0xdc,0x01,
-0x24,0x62,0x61,0x31,0x31,0x62,0x62,0x62,0x03,0x0e,0x83,0xfe,0x78,0xfe,0xfd,0x81,
-0x82,0x01,0x90,0x7b,0xc1,0x85,0x8c,0x8c,0x85,0x82,0x00,0x01,0x00,0x00,0x01,0x03,
-0x00,0xc4,0x03,0x0e,0x00,0x07,0x00,0x29,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x06,0x00,
-0x01,0x00,0x21,0x2b,0xb8,0x00,0x06,0x10,0xb8,0x00,0x03,0xd0,0x00,0xb8,0x00,0x02,
-0x2f,0xb8,0x00,0x00,0x2f,0xba,0x00,0x05,0x00,0x02,0x00,0x00,0x11,0x12,0x39,0x30,
-0x31,0x13,0x07,0x11,0x33,0x11,0x23,0x37,0x35,0x61,0x61,0xc4,0x63,0x63,0x03,0x0e,
-0x83,0xfe,0x78,0x01,0x04,0x84,0x83,0x00,0x00,0x01,0x00,0x00,0x01,0x03,0x00,0xc4,
-0x03,0x0e,0x00,0x07,0x00,0x37,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x07,0x00,0x00,0x00,
-0x21,0x2b,0xb8,0x00,0x07,0x10,0xba,0x00,0x02,0x00,0x00,0x00,0x07,0x11,0x12,0x39,
-0xb8,0x00,0x00,0x10,0xb8,0x00,0x03,0xd0,0x00,0xb8,0x00,0x04,0x2f,0xb8,0x00,0x00,
-0x2f,0xba,0x00,0x02,0x00,0x04,0x00,0x00,0x11,0x12,0x39,0x30,0x31,0x19,0x01,0x33,
-0x07,0x15,0x33,0x37,0x11,0x61,0x61,0x61,0x63,0x03,0x0e,0xfe,0xf9,0x82,0x82,0x82,
-0x01,0x89,0x00,0x02,0x00,0x00,0x01,0x03,0x01,0xe8,0x03,0x0e,0x00,0x07,0x00,0x0f,
-0x00,0x53,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x06,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,
-0x06,0x10,0xba,0x00,0x0e,0x00,0x09,0x00,0x21,0x2b,0xb8,0x00,0x0e,0x10,0xb8,0x00,
-0x06,0x10,0xb8,0x00,0x03,0xd0,0xb8,0x00,0x0e,0x10,0xb8,0x00,0x0b,0xd0,0x00,0xb8,
-0x00,0x02,0x2f,0xb8,0x00,0x0a,0x2f,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x08,0x2f,0xba,
-0x00,0x05,0x00,0x02,0x00,0x00,0x11,0x12,0x39,0xba,0x00,0x0d,0x00,0x02,0x00,0x00,
-0x11,0x12,0x39,0x30,0x31,0x13,0x07,0x11,0x33,0x11,0x23,0x37,0x35,0x33,0x07,0x11,
-0x33,0x11,0x23,0x37,0x35,0x61,0x61,0xc4,0x63,0x63,0xc2,0x61,0xc3,0x62,0x62,0x03,
-0x0e,0x83,0xfe,0x78,0x01,0x04,0x84,0x83,0x83,0xfe,0x78,0x01,0x04,0x84,0x83,0x00,
-0x00,0x02,0x00,0x00,0x01,0x03,0x01,0xe8,0x03,0x0e,0x00,0x07,0x00,0x0f,0x00,0x67,
-0xb8,0x00,0x1e,0x2b,0xba,0x00,0x07,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x07,0x10,
-0xba,0x00,0x0f,0x00,0x08,0x00,0x21,0x2b,0xb8,0x00,0x0f,0x10,0xba,0x00,0x02,0x00,
-0x00,0x00,0x07,0x11,0x12,0x39,0xb8,0x00,0x00,0x10,0xb8,0x00,0x03,0xd0,0xba,0x00,
-0x0a,0x00,0x08,0x00,0x0f,0x11,0x12,0x39,0xb8,0x00,0x08,0x10,0xb8,0x00,0x0b,0xd0,
-0x00,0xb8,0x00,0x04,0x2f,0xb8,0x00,0x0c,0x2f,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x08,
-0x2f,0xba,0x00,0x02,0x00,0x04,0x00,0x00,0x11,0x12,0x39,0xba,0x00,0x0a,0x00,0x04,
-0x00,0x00,0x11,0x12,0x39,0x30,0x31,0x19,0x01,0x33,0x07,0x15,0x33,0x37,0x11,0x33,
-0x11,0x33,0x07,0x15,0x33,0x37,0x11,0x61,0x61,0x61,0x63,0x61,0x61,0x61,0x61,0x62,
-0x03,0x0e,0xfe,0xf9,0x82,0x82,0x82,0x01,0x89,0xfe,0xf9,0x82,0x82,0x82,0x01,0x89,
-0x00,0x01,0x00,0x00,0x00,0x00,0x01,0xe8,0x03,0x0e,0x00,0x07,0x00,0x0f,0xb8,0x00,
-0x1e,0x2b,0x00,0xb8,0x00,0x06,0x2f,0xb8,0x00,0x02,0x2f,0x30,0x31,0x19,0x01,0x17,
-0x21,0x37,0x11,0x27,0x21,0x61,0x01,0x25,0x62,0x62,0xfe,0xdb,0x02,0x8b,0xfd,0xf6,
-0x81,0x81,0x02,0x0a,0x83,0x00,0x00,0x01,0x00,0x00,0x01,0x03,0x01,0x25,0x01,0x85,
-0x00,0x03,0x00,0x0f,0xb8,0x00,0x1e,0x2b,0x00,0xba,0x00,0x00,0x00,0x01,0x00,0x21,
-0x2b,0x30,0x31,0x11,0x15,0x21,0x35,0x01,0x25,0x01,0x85,0x82,0x82,0x00,0x00,0x01,
-0x00,0x00,0x01,0x01,0x01,0x80,0x01,0x85,0x00,0x03,0x00,0x17,0xb8,0x00,0x1e,0x2b,
-0x00,0xb8,0x00,0x03,0x2f,0xba,0x00,0x00,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x00,
-0x10,0x30,0x31,0x11,0x15,0x21,0x35,0x01,0x80,0x01,0x84,0x83,0x84,0x00,0x00,0x01,
-0x00,0x01,0x03,0x4a,0x01,0x89,0x04,0x51,0x00,0x0b,0x00,0x2b,0xb8,0x00,0x1e,0x2b,
-0x00,0xb8,0x00,0x06,0x2f,0xb8,0x00,0x09,0x2f,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x03,
-0x2f,0xba,0x00,0x02,0x00,0x00,0x00,0x06,0x11,0x12,0x39,0xba,0x00,0x08,0x00,0x00,
-0x00,0x06,0x11,0x12,0x39,0x30,0x31,0x13,0x33,0x37,0x15,0x33,0x37,0x35,0x23,0x07,
-0x35,0x23,0x07,0x01,0x62,0x61,0x63,0x62,0x62,0x62,0x62,0x62,0x03,0x4a,0x6b,0x6b,
-0x85,0x82,0x7f,0x7f,0x7f,0x00,0x00,0x02,0x00,0x03,0x01,0x89,0x02,0x36,0x03,0x10,
-0x00,0x07,0x00,0x13,0x00,0x6b,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x05,0x00,0x02,0x00,
-0x21,0x2b,0xb8,0x00,0x05,0x10,0xba,0x00,0x0b,0x00,0x08,0x00,0x21,0x2b,0xb8,0x00,
-0x0b,0x10,0xba,0x00,0x11,0x00,0x0e,0x00,0x21,0x2b,0xb8,0x00,0x11,0x10,0xb8,0x00,
-0x15,0xdc,0x00,0xb8,0x00,0x03,0x2f,0xb8,0x00,0x09,0x2f,0xb8,0x00,0x0f,0x2f,0xba,
-0x00,0x00,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x00,0x10,0xb8,0x00,0x01,0x10,0xb8,
-0x00,0x05,0xd0,0xba,0x00,0x0b,0x00,0x01,0x00,0x00,0x11,0x12,0x39,0xba,0x00,0x0e,
-0x00,0x01,0x00,0x00,0x11,0x12,0x39,0xb8,0x00,0x00,0x10,0xb8,0x00,0x12,0xd0,0x30,
-0x31,0x13,0x15,0x33,0x11,0x33,0x11,0x33,0x35,0x17,0x11,0x33,0x11,0x17,0x33,0x37,
-0x11,0x33,0x11,0x27,0x23,0x03,0x31,0x61,0x32,0x18,0x62,0x31,0x31,0x30,0x63,0x31,
-0xf5,0x03,0x10,0x42,0xfe,0xbb,0x01,0x45,0x42,0x41,0xfe,0xba,0x01,0x46,0x83,0x83,
-0xfe,0xba,0x01,0x46,0x41,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x01,0xdd,0x03,0x51,
-0x00,0x0f,0x00,0x18,0x00,0x83,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x0e,0x00,0x02,0x00,
-0x21,0x2b,0xb8,0x00,0x0e,0x10,0xba,0x00,0x0b,0x00,0x05,0x00,0x21,0x2b,0xb8,0x00,
-0x0b,0x10,0xb8,0x00,0x05,0x10,0xb8,0x00,0x12,0xd0,0xb8,0x00,0x12,0x2f,0xb8,0x00,
-0x0e,0x10,0xb8,0x00,0x14,0xd0,0xb8,0x00,0x14,0x2f,0xb8,0x00,0x0e,0x10,0xb8,0x00,
-0x17,0xd0,0xb8,0x00,0x17,0x2f,0xb8,0x00,0x05,0x10,0xb8,0x00,0x18,0xd0,0xb8,0x00,
-0x18,0x2f,0x00,0xb8,0x00,0x11,0x2f,0xb8,0x00,0x14,0x2f,0xba,0x00,0x07,0x00,0x08,
-0x00,0x21,0x2b,0xb8,0x00,0x07,0x10,0xba,0x00,0x03,0x00,0x04,0x00,0x21,0x2b,0xb8,
-0x00,0x03,0x10,0xba,0x00,0x01,0x00,0x0e,0x00,0x21,0x2b,0xb8,0x00,0x01,0x10,0xb8,
-0x00,0x03,0x10,0xb8,0x00,0x0c,0xd0,0x30,0x31,0x01,0x21,0x07,0x15,0x17,0x33,0x15,
-0x23,0x15,0x21,0x37,0x35,0x27,0x23,0x35,0x33,0x13,0x35,0x23,0x07,0x27,0x23,0x15,
-0x17,0x33,0x01,0x86,0xfe,0xdb,0x61,0x61,0xc4,0xc4,0x01,0x25,0x57,0x57,0xc4,0xc4,
-0x04,0x63,0x30,0x31,0x62,0x62,0x61,0x02,0x05,0x67,0x67,0x6a,0x57,0x76,0x66,0x76,
-0x5b,0x51,0x01,0x44,0x85,0x8c,0x8c,0x85,0x82,0x00,0x00,0x01,0x00,0x04,0x00,0x82,
-0x00,0xca,0x02,0x09,0x00,0x08,0x00,0x19,0xb8,0x00,0x1e,0x2b,0x00,0xb8,0x00,0x05,
-0x2f,0xb8,0x00,0x00,0x2f,0xba,0x00,0x03,0x00,0x05,0x00,0x00,0x11,0x12,0x39,0x30,
-0x31,0x13,0x23,0x15,0x17,0x07,0x15,0x33,0x37,0x35,0x67,0x63,0x69,0x69,0x63,0x63,
-0x02,0x09,0x83,0x3f,0x42,0x83,0x83,0x81,0x00,0x03,0x00,0x00,0x00,0x00,0x03,0x6a,
-0x02,0x06,0x00,0x08,0x00,0x0e,0x00,0x12,0x00,0x6f,0xb8,0x00,0x1e,0x2b,0xba,0x00,
-0x0d,0x00,0x06,0x00,0x21,0x2b,0xb8,0x00,0x0d,0x10,0xba,0x00,0x10,0x00,0x0e,0x00,
-0x21,0x2b,0xb8,0x00,0x10,0x10,0xba,0x00,0x01,0x00,0x12,0x00,0x21,0x2b,0xb8,0x00,
-0x01,0x10,0xb8,0x00,0x03,0xd0,0xb8,0x00,0x03,0x2f,0xb8,0x00,0x01,0x10,0xb8,0x00,
-0x14,0xdc,0x00,0xba,0x00,0x03,0x00,0x04,0x00,0x21,0x2b,0xb8,0x00,0x03,0x10,0xba,
-0x00,0x08,0x00,0x0c,0x00,0x21,0x2b,0xb8,0x00,0x08,0x10,0xb8,0x00,0x03,0x10,0xb8,
-0x00,0x0d,0xd0,0xb8,0x00,0x0c,0x10,0xb8,0x00,0x0f,0xd0,0xb8,0x00,0x03,0x10,0xb8,
-0x00,0x10,0xd0,0xb8,0x00,0x10,0x2f,0x30,0x31,0x01,0x0f,0x01,0x33,0x15,0x21,0x27,
-0x11,0x37,0x01,0x23,0x35,0x23,0x11,0x33,0x13,0x11,0x33,0x11,0x03,0x68,0x02,0x68,
-0x6c,0xfc,0xf7,0x61,0x63,0x01,0x1b,0x59,0x61,0xba,0xc4,0x62,0x02,0x06,0xf8,0x8c,
-0x82,0x81,0x01,0x04,0x81,0xfe,0xfd,0x82,0xfe,0xfd,0x01,0x03,0xfe,0xfc,0x01,0x04,
-0x00,0x02,0x00,0x00,0x00,0x00,0x01,0xeb,0x03,0x51,0x00,0x09,0x00,0x12,0x00,0x2f,
-0xb8,0x00,0x1e,0x2b,0x00,0xb8,0x00,0x0b,0x2f,0xb8,0x00,0x0e,0x2f,0xba,0x00,0x03,
-0x00,0x04,0x00,0x21,0x2b,0xb8,0x00,0x03,0x10,0xba,0x00,0x00,0x00,0x01,0x00,0x21,
-0x2b,0xb8,0x00,0x00,0x10,0xb8,0x00,0x03,0x10,0xb8,0x00,0x06,0xd0,0x30,0x31,0x11,
-0x15,0x21,0x01,0x15,0x21,0x35,0x23,0x37,0x35,0x27,0x35,0x23,0x07,0x27,0x23,0x15,
-0x17,0x33,0x01,0x25,0xfe,0xdb,0x01,0xeb,0xc6,0xc3,0x65,0x62,0x31,0x30,0x62,0x62,
-0x61,0x02,0x07,0x82,0xfe,0xfd,0x82,0x82,0xb0,0xd5,0xc5,0x85,0x8c,0x8c,0x85,0x82,
-0x00,0x03,0x00,0x00,0xfe,0xfb,0x01,0xe8,0x04,0x53,0x00,0x0d,0x00,0x11,0x00,0x15,
-0x00,0x7f,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x0d,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,
-0x0d,0x10,0xba,0x00,0x08,0x00,0x04,0x00,0x21,0x2b,0xb8,0x00,0x08,0x10,0xb8,0x00,
-0x0d,0x10,0xb8,0x00,0x05,0xd0,0xb8,0x00,0x04,0x10,0xb8,0x00,0x0a,0xd0,0xba,0x00,
-0x0e,0x00,0x00,0x00,0x0d,0x11,0x12,0x39,0xb8,0x00,0x0e,0x2f,0xb8,0x00,0x11,0xdc,
-0xba,0x00,0x15,0x00,0x04,0x00,0x08,0x11,0x12,0x39,0xb8,0x00,0x15,0x2f,0xb8,0x00,
-0x12,0xdc,0xb8,0x00,0x08,0x10,0xb8,0x00,0x17,0xdc,0x00,0xb8,0x00,0x0e,0x2f,0xb8,
-0x00,0x12,0x2f,0xba,0x00,0x05,0x00,0x06,0x00,0x21,0x2b,0xb8,0x00,0x05,0x10,0xba,
-0x00,0x01,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x01,0x10,0xb8,0x00,0x0b,0xd0,0x30,
-0x31,0x19,0x01,0x17,0x33,0x15,0x23,0x15,0x33,0x37,0x11,0x23,0x11,0x23,0x11,0x03,
-0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x61,0xc4,0x61,0xc2,0x62,0xc3,0x61,0xb0,0xc3,
-0x40,0xc4,0x03,0x0e,0xfd,0x73,0x81,0x84,0x81,0x81,0x03,0x92,0xfd,0x73,0x02,0x8d,
-0x01,0x45,0xfe,0xf9,0x01,0x07,0xfe,0xf9,0x01,0x07,0x00,0x02,0x00,0x00,0x00,0x00,
-0x00,0xc4,0x03,0x0e,0x00,0x03,0x00,0x07,0x00,0x2f,0xb8,0x00,0x1e,0x2b,0xba,0x00,
-0x01,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x01,0x10,0xb8,0x00,0x04,0xd0,0xb8,0x00,
-0x02,0x10,0xb8,0x00,0x06,0xd0,0x00,0xb8,0x00,0x00,0x2f,0xba,0x00,0x05,0x00,0x04,
-0x00,0x21,0x2b,0xb8,0x00,0x05,0x10,0x30,0x31,0x33,0x11,0x23,0x11,0x13,0x35,0x23,
-0x15,0xc4,0xc4,0xc4,0xc4,0x02,0x0b,0xfd,0xf5,0x02,0x8d,0x81,0x81,0x00,0x00,0x02,
-0x00,0x00,0xff,0x7c,0x01,0xe8,0x03,0x0e,0x00,0x11,0x00,0x15,0x00,0x7b,0xb8,0x00,
-0x1e,0x2b,0xba,0x00,0x14,0x00,0x0e,0x00,0x21,0x2b,0xb8,0x00,0x14,0x10,0xba,0x00,
-0x01,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x01,0x10,0xb8,0x00,0x05,0xd0,0xb8,0x00,
-0x01,0x10,0xb8,0x00,0x09,0xd0,0xb8,0x00,0x00,0x10,0xb8,0x00,0x0b,0xd0,0xb8,0x00,
-0x00,0x10,0xb8,0x00,0x12,0xd0,0x00,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x0a,0x2f,0xba,
-0x00,0x07,0x00,0x08,0x00,0x21,0x2b,0xb8,0x00,0x07,0x10,0xba,0x00,0x03,0x00,0x04,
-0x00,0x21,0x2b,0xb8,0x00,0x03,0x10,0xb8,0x00,0x08,0x10,0xb8,0x00,0x0c,0xd0,0xb8,
-0x00,0x03,0x10,0xb8,0x00,0x10,0xd0,0xb8,0x00,0x04,0x10,0xb8,0x00,0x12,0xd0,0xb8,
-0x00,0x07,0x10,0xb8,0x00,0x14,0xd0,0x30,0x31,0x01,0x33,0x15,0x33,0x15,0x23,0x11,
-0x33,0x15,0x23,0x15,0x23,0x35,0x23,0x27,0x11,0x37,0x33,0x15,0x23,0x11,0x33,0x01,
-0x1c,0x61,0x6b,0x6b,0x6b,0x6b,0x61,0xbb,0x61,0x61,0xbb,0x58,0x58,0x03,0x0e,0xb5,
-0x7e,0xfe,0xf9,0x82,0xd6,0xd6,0x81,0x01,0x04,0x82,0x7e,0xfe,0xf9,0x00,0x00,0x01,
-0x00,0x00,0x00,0x00,0x02,0x36,0x03,0x0e,0x00,0x19,0x00,0x7b,0xb8,0x00,0x1e,0x2b,
-0xba,0x00,0x07,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x07,0x10,0xb8,0x00,0x0a,0xd0,
-0xb8,0x00,0x07,0x10,0xb8,0x00,0x0e,0xd0,0xb8,0x00,0x01,0x10,0xb8,0x00,0x13,0xd0,
-0xb8,0x00,0x01,0x10,0xb8,0x00,0x17,0xd0,0x00,0xba,0x00,0x10,0x00,0x11,0x00,0x21,
-0x2b,0xb8,0x00,0x10,0x10,0xba,0x00,0x04,0x00,0x05,0x00,0x21,0x2b,0xb8,0x00,0x04,
-0x10,0xba,0x00,0x0c,0x00,0x0d,0x00,0x21,0x2b,0xb8,0x00,0x0c,0x10,0xba,0x00,0x08,
-0x00,0x09,0x00,0x21,0x2b,0xb8,0x00,0x08,0x10,0xb8,0x00,0x00,0xd0,0xb8,0x00,0x0d,
-0x10,0xb8,0x00,0x14,0xd0,0xb8,0x00,0x0c,0x10,0xb8,0x00,0x16,0xd0,0xb8,0x00,0x09,
-0x10,0xb8,0x00,0x18,0xd0,0x30,0x31,0x11,0x33,0x35,0x37,0x21,0x15,0x21,0x15,0x33,
-0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x21,0x15,0x21,0x27,0x35,0x23,0x35,0x33,0x35,
-0x23,0x4d,0x61,0x01,0x88,0xfe,0xda,0xa5,0xa5,0xa3,0xa3,0x01,0x26,0xfe,0x78,0x61,
-0x4d,0x4d,0x4d,0x02,0x32,0x59,0x83,0x80,0x5c,0x82,0x52,0x82,0x5b,0x81,0x81,0x5b,
-0x82,0x52,0x00,0x02,0x00,0x00,0x00,0x00,0x01,0xe8,0x03,0x0e,0x00,0x13,0x00,0x1b,
-0x00,0x93,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x01,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,
-0x01,0x10,0xba,0x00,0x05,0x00,0x04,0x00,0x21,0x2b,0xb8,0x00,0x05,0x10,0xba,0x00,
-0x14,0x00,0x04,0x00,0x05,0x11,0x12,0x39,0xb8,0x00,0x14,0x2f,0xb8,0x00,0x07,0xdc,
-0xb8,0x00,0x05,0x10,0xb8,0x00,0x09,0xd0,0xb8,0x00,0x04,0x10,0xb8,0x00,0x0b,0xd0,
-0xb8,0x00,0x01,0x10,0xb8,0x00,0x0d,0xd0,0xb8,0x00,0x00,0x10,0xb8,0x00,0x0f,0xd0,
-0xba,0x00,0x11,0x00,0x00,0x00,0x01,0x11,0x12,0x39,0xb8,0x00,0x11,0x2f,0xb8,0x00,
-0x18,0xdc,0xb8,0x00,0x05,0x10,0xb8,0x00,0x1d,0xdc,0x00,0xb8,0x00,0x00,0x2f,0xb8,
-0x00,0x04,0x2f,0xb8,0x00,0x0a,0x2f,0xb8,0x00,0x0e,0x2f,0xba,0x00,0x1a,0x00,0x0c,
-0x00,0x21,0x2b,0xb8,0x00,0x1a,0x10,0xba,0x00,0x03,0x00,0x15,0x00,0x21,0x2b,0xb8,
-0x00,0x03,0x10,0x30,0x31,0x11,0x33,0x15,0x33,0x35,0x33,0x11,0x07,0x15,0x17,0x11,
-0x23,0x35,0x23,0x15,0x23,0x11,0x37,0x35,0x27,0x05,0x27,0x23,0x07,0x15,0x17,0x33,
-0x37,0xc4,0x61,0xc3,0x3e,0x3e,0xc3,0x61,0xc4,0x3c,0x3c,0x01,0x57,0x35,0x61,0x33,
-0x33,0x61,0x35,0x03,0x0e,0x7a,0x7a,0xfe,0xf9,0x53,0x4d,0x36,0xfe,0xcf,0x8c,0x8c,
-0x01,0x2a,0x37,0x56,0x50,0x16,0x37,0x37,0xb9,0x3c,0x3c,0x00,0x00,0x01,0x00,0x00,
-0xfe,0xfb,0x02,0x58,0x03,0x0e,0x00,0x15,0x00,0x7b,0xb8,0x00,0x1e,0x2b,0xba,0x00,
-0x01,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x01,0x10,0xba,0x00,0x0d,0x00,0x03,0x00,
-0x21,0x2b,0xb8,0x00,0x0d,0x10,0xb8,0x00,0x05,0xd0,0xb8,0x00,0x0d,0x10,0xb8,0x00,
-0x09,0xd0,0xb8,0x00,0x01,0x10,0xb8,0x00,0x10,0xd0,0xb8,0x00,0x03,0x10,0xb8,0x00,
-0x12,0xd0,0x00,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x04,0x2f,0xba,0x00,0x0e,0x00,0x0f,
-0x00,0x21,0x2b,0xb8,0x00,0x0e,0x10,0xba,0x00,0x03,0x00,0x13,0x00,0x21,0x2b,0xb8,
-0x00,0x03,0x10,0xba,0x00,0x07,0x00,0x08,0x00,0x21,0x2b,0xb8,0x00,0x07,0x10,0xba,
-0x00,0x0b,0x00,0x0c,0x00,0x21,0x2b,0xb8,0x00,0x0b,0x10,0xb8,0x00,0x0e,0x10,0xb8,
-0x00,0x11,0xd0,0x30,0x31,0x11,0x33,0x11,0x33,0x11,0x33,0x15,0x33,0x15,0x23,0x15,
-0x33,0x15,0x23,0x11,0x07,0x23,0x35,0x33,0x35,0x23,0x27,0xc4,0x61,0xc3,0x70,0x70,
-0x70,0x70,0x62,0xc2,0x61,0xc4,0x61,0x03,0x0e,0xfd,0x73,0x02,0x8d,0xc1,0x82,0x99,
-0x81,0xfe,0xcb,0x81,0x81,0x84,0x81,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0xc2,
-0x03,0x0e,0x00,0x03,0x00,0x1b,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x03,0x00,0x00,0x00,
-0x21,0x2b,0xb8,0x00,0x03,0x10,0x00,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x01,0x2f,0x30,
-0x31,0x19,0x01,0x33,0x11,0xc2,0x03,0x0e,0xfc,0xf2,0x03,0x0e,0x00,0x04,0x00,0x00,
-0x00,0x00,0x01,0xe8,0x03,0x0e,0x00,0x11,0x00,0x16,0x00,0x1a,0x00,0x22,0x00,0xe3,
-0xb8,0x00,0x1e,0x2b,0xba,0x00,0x12,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x12,0x10,
-0xba,0x00,0x04,0x00,0x22,0x00,0x21,0x2b,0xb8,0x00,0x04,0x10,0xba,0x00,0x20,0x00,
-0x22,0x00,0x04,0x11,0x12,0x39,0xb8,0x00,0x20,0x2f,0xb8,0x00,0x07,0xdc,0xb8,0x00,
-0x04,0x10,0xb8,0x00,0x09,0xd0,0xb8,0x00,0x00,0x10,0xb8,0x00,0x0c,0xd0,0xba,0x00,
-0x0e,0x00,0x00,0x00,0x12,0x11,0x12,0x39,0xba,0x00,0x0f,0x00,0x00,0x00,0x12,0x11,
-0x12,0x39,0xb8,0x00,0x0f,0x2f,0xb8,0x00,0x22,0x10,0xb8,0x00,0x13,0xd0,0xb8,0x00,
-0x12,0x10,0xb8,0x00,0x17,0xd0,0xb8,0x00,0x17,0x2f,0xb8,0x00,0x22,0x10,0xb8,0x00,
-0x19,0xd0,0xb8,0x00,0x0f,0x10,0xb8,0x00,0x1d,0xdc,0xb8,0x00,0x04,0x10,0xb8,0x00,
-0x24,0xdc,0x00,0xba,0x00,0x0a,0x00,0x0b,0x00,0x21,0x2b,0xb8,0x00,0x0a,0x10,0xba,
-0x00,0x02,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x02,0x10,0xba,0x00,0x1e,0x00,0x17,
-0x00,0x21,0x2b,0xb8,0x00,0x1e,0x10,0xba,0x00,0x12,0x00,0x1b,0x00,0x21,0x2b,0xb8,
-0x00,0x12,0x10,0xba,0x00,0x05,0x00,0x1b,0x00,0x12,0x11,0x12,0x39,0xba,0x00,0x0e,
-0x00,0x17,0x00,0x1e,0x11,0x12,0x39,0xb8,0x00,0x01,0x10,0xb8,0x00,0x14,0xd0,0xba,
-0x00,0x16,0x00,0x01,0x00,0x02,0x11,0x12,0x39,0xb8,0x00,0x0a,0x10,0xb8,0x00,0x18,
-0xd0,0x30,0x31,0x11,0x35,0x37,0x21,0x11,0x23,0x17,0x15,0x07,0x17,0x15,0x07,0x21,
-0x11,0x33,0x27,0x35,0x3f,0x01,0x33,0x35,0x23,0x27,0x13,0x15,0x33,0x35,0x03,0x07,
-0x15,0x17,0x33,0x37,0x35,0x27,0x61,0x01,0x87,0x62,0x37,0x0b,0x36,0x62,0xfe,0x7a,
-0x61,0x2e,0x0c,0x83,0x63,0x61,0x02,0x02,0x61,0x62,0x32,0x32,0x62,0x32,0x32,0x02,
-0x0e,0x7d,0x83,0xfe,0xfb,0x47,0x81,0x0e,0x30,0x82,0x81,0x01,0x03,0x3d,0x82,0x12,
-0x73,0x44,0x08,0xfe,0x2e,0x40,0x40,0x01,0x22,0x34,0x68,0x2a,0x31,0x65,0x30,0x00,
-0x00,0x02,0x00,0x00,0x03,0x4c,0x01,0xc6,0x04,0x53,0x00,0x03,0x00,0x07,0x00,0x2f,
-0xb8,0x00,0x1e,0x2b,0xba,0x00,0x03,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x03,0x10,
-0xba,0x00,0x07,0x00,0x04,0x00,0x21,0x2b,0xb8,0x00,0x07,0x10,0x00,0xb8,0x00,0x00,
-0x2f,0xb8,0x00,0x04,0x2f,0xb8,0x00,0x01,0x2f,0xb8,0x00,0x05,0x2f,0x30,0x31,0x19,
-0x01,0x33,0x11,0x33,0x11,0x33,0x11,0xc4,0x3f,0xc3,0x04,0x53,0xfe,0xf9,0x01,0x07,
-0xfe,0xf9,0x01,0x07,0x00,0x03,0x00,0x01,0x01,0x07,0x01,0xe9,0x03,0x10,0x00,0x07,
-0x00,0x0b,0x00,0x15,0x00,0x5f,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x08,0x00,0x01,0x00,
-0x21,0x2b,0xb8,0x00,0x08,0x10,0xba,0x00,0x12,0x00,0x0c,0x00,0x21,0x2b,0xb8,0x00,
-0x12,0x10,0xba,0x00,0x06,0x00,0x09,0x00,0x21,0x2b,0xb8,0x00,0x06,0x10,0xb8,0x00,
-0x17,0xdc,0x00,0xba,0x00,0x0b,0x00,0x03,0x00,0x21,0x2b,0xb8,0x00,0x0b,0x10,0xba,
-0x00,0x07,0x00,0x09,0x00,0x21,0x2b,0xb8,0x00,0x07,0x10,0xba,0x00,0x11,0x00,0x0e,
-0x00,0x21,0x2b,0xb8,0x00,0x11,0x10,0xba,0x00,0x15,0x00,0x12,0x00,0x21,0x2b,0xb8,
-0x00,0x15,0x10,0x30,0x31,0x13,0x07,0x11,0x17,0x21,0x37,0x11,0x27,0x05,0x17,0x11,
-0x23,0x37,0x15,0x17,0x33,0x35,0x23,0x35,0x33,0x35,0x23,0x61,0x60,0x61,0x01,0x26,
-0x61,0x65,0xfe,0xee,0xf8,0xf8,0x13,0x30,0x92,0x70,0x70,0x92,0x03,0x10,0x85,0xfe,
-0xfb,0x7f,0x7f,0x01,0x05,0x85,0x70,0x01,0xfe,0xcd,0xcf,0x6b,0x40,0x3f,0x6c,0x42,
-0x00,0x02,0x00,0x01,0x01,0x89,0x00,0xf5,0x03,0x10,0x00,0x09,0x00,0x0d,0x00,0x3b,
-0xb8,0x00,0x1e,0x2b,0xba,0x00,0x0b,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x0b,0x10,
-0xba,0x00,0x07,0x00,0x06,0x00,0x21,0x2b,0xb8,0x00,0x07,0x10,0xb8,0x00,0x0b,0x10,
-0xb8,0x00,0x03,0xd0,0xb8,0x00,0x06,0x10,0xb8,0x00,0x0c,0xd0,0x00,0xb8,0x00,0x02,
-0x2f,0xb8,0x00,0x06,0x2f,0xb8,0x00,0x00,0x2f,0x30,0x31,0x13,0x07,0x11,0x33,0x35,
-0x33,0x15,0x33,0x11,0x27,0x07,0x35,0x33,0x15,0x31,0x30,0x61,0x31,0x62,0x31,0x62,
-0x31,0x03,0x10,0x42,0xfe,0xbb,0x81,0x81,0x01,0x45,0x42,0xc5,0x83,0x83,0x00,0x02,
-0x00,0x04,0x00,0x82,0x01,0xbe,0x02,0x09,0x00,0x08,0x00,0x11,0x00,0x2b,0xb8,0x00,
-0x1e,0x2b,0x00,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x09,0x2f,0xb8,0x00,0x05,0x2f,0xb8,
-0x00,0x0e,0x2f,0xba,0x00,0x03,0x00,0x05,0x00,0x00,0x11,0x12,0x39,0xba,0x00,0x0c,
-0x00,0x05,0x00,0x00,0x11,0x12,0x39,0x30,0x31,0x13,0x33,0x15,0x07,0x17,0x15,0x23,
-0x27,0x35,0x25,0x33,0x15,0x07,0x17,0x15,0x23,0x27,0x35,0x66,0x64,0x69,0x69,0x64,
-0x62,0x01,0x56,0x64,0x68,0x68,0x64,0x61,0x02,0x09,0x83,0x3f,0x42,0x83,0x83,0x81,
-0x83,0x83,0x3f,0x42,0x83,0x83,0x81,0x00,0x00,0x01,0x00,0x00,0x00,0x82,0x01,0x25,
-0x01,0x85,0x00,0x05,0x00,0x27,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x04,0x00,0x03,0x00,
-0x21,0x2b,0xb8,0x00,0x04,0x10,0xb8,0x00,0x07,0xdc,0x00,0xb8,0x00,0x03,0x2f,0xba,
-0x00,0x00,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x00,0x10,0x30,0x31,0x11,0x15,0x33,
-0x15,0x33,0x11,0xc2,0x63,0x01,0x85,0x82,0x81,0x01,0x03,0x00,0x00,0x01,0x00,0x00,
-0x01,0x01,0x00,0xd3,0x01,0x86,0x00,0x03,0x00,0x23,0xb8,0x00,0x1e,0x2b,0xba,0x00,
-0x03,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x03,0x10,0x00,0xb8,0x00,0x00,0x2f,0xba,
-0x00,0x03,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x03,0x10,0x30,0x31,0x11,0x15,0x33,
-0x35,0xd3,0x01,0x86,0x85,0x84,0x00,0x0d,0x00,0x0a,0x00,0x00,0x04,0x55,0x03,0x09,
-0x00,0x3f,0x00,0x6b,0x00,0x6f,0x00,0x73,0x00,0x7c,0x00,0x8b,0x00,0x8f,0x00,0x98,
-0x00,0xa6,0x00,0xbc,0x00,0xc0,0x00,0xc3,0x00,0xd1,0x02,0xe1,0xb8,0x00,0x1e,0x2b,
-0xba,0x00,0x74,0x00,0x48,0x00,0x21,0x2b,0xb8,0x00,0x74,0x10,0xba,0x00,0x7a,0x00,
-0x49,0x00,0x21,0x2b,0xb8,0x00,0x7a,0x10,0xba,0x00,0x7d,0x00,0x86,0x00,0x21,0x2b,
-0xb8,0x00,0x7d,0x10,0xba,0x00,0x91,0x00,0x61,0x00,0x21,0x2b,0xb8,0x00,0x91,0x10,
-0xba,0x00,0x97,0x00,0x94,0x00,0x21,0x2b,0xb8,0x00,0x97,0x10,0xba,0x00,0x99,0x00,
-0xa0,0x00,0x21,0x2b,0xb8,0x00,0x99,0x10,0xb8,0x00,0x7d,0x10,0xb8,0x00,0x0c,0xd0,
-0xb8,0x00,0x0c,0x2f,0xb8,0x00,0x91,0x10,0xb8,0x00,0x11,0xd0,0xb8,0x00,0x11,0x2f,
-0xba,0x00,0x4b,0x00,0x61,0x00,0x91,0x11,0x12,0x39,0x41,0x1b,0x00,0x06,0x00,0x99,
-0x00,0x16,0x00,0x99,0x00,0x26,0x00,0x99,0x00,0x36,0x00,0x99,0x00,0x46,0x00,0x99,
-0x00,0x56,0x00,0x99,0x00,0x66,0x00,0x99,0x00,0x76,0x00,0x99,0x00,0x86,0x00,0x99,
-0x00,0x96,0x00,0x99,0x00,0xa6,0x00,0x99,0x00,0xb6,0x00,0x99,0x00,0xc6,0x00,0x99,
-0x00,0x0d,0x5d,0x41,0x05,0x00,0xd5,0x00,0x99,0x00,0xe5,0x00,0x99,0x00,0x02,0x5d,
-0xba,0x00,0x4e,0x00,0xa0,0x00,0x99,0x11,0x12,0x39,0xba,0x00,0x4f,0x00,0xa0,0x00,
-0x99,0x11,0x12,0x39,0xba,0x00,0x63,0x00,0x86,0x00,0x7d,0x11,0x12,0x39,0xba,0x00,
-0x66,0x00,0x48,0x00,0x74,0x11,0x12,0x39,0xb8,0x00,0x48,0x10,0xb8,0x00,0x76,0xd0,
-0xb8,0x00,0x76,0x2f,0xb8,0x00,0x49,0x10,0xb8,0x00,0x78,0xd0,0xb8,0x00,0x78,0x2f,
-0xba,0x00,0x8c,0x00,0xa0,0x00,0x74,0x11,0x12,0x39,0xba,0x00,0x8e,0x00,0xa0,0x00,
-0x74,0x11,0x12,0x39,0xb8,0x00,0x61,0x10,0xb8,0x00,0x93,0xd0,0xba,0x00,0xc2,0x00,
-0x86,0x00,0x7d,0x11,0x12,0x39,0xba,0x00,0xc3,0x00,0x86,0x00,0x7d,0x11,0x12,0x39,
-0xb8,0x00,0x74,0x10,0xb8,0x00,0xd3,0xdc,0x00,0xb8,0x00,0x12,0x2f,0xb8,0x00,0x2c,
-0x2f,0xba,0x00,0x0c,0x00,0x64,0x00,0x21,0x2b,0xb8,0x00,0x0c,0x10,0xba,0x00,0x02,
-0x00,0x2c,0x00,0x12,0x11,0x12,0x39,0xba,0x00,0x08,0x00,0x2c,0x00,0x12,0x11,0x12,
-0x39,0xba,0x00,0x1d,0x00,0x2c,0x00,0x12,0x11,0x12,0x39,0xba,0x00,0x24,0x00,0x2c,
-0x00,0x12,0x11,0x12,0x39,0xba,0x00,0x3d,0x00,0x2c,0x00,0x12,0x11,0x12,0x39,0xba,
-0x00,0x40,0x00,0x2c,0x00,0x12,0x11,0x12,0x39,0xba,0x00,0x41,0x00,0x2c,0x00,0x12,
-0x11,0x12,0x39,0xba,0x00,0x47,0x00,0x2c,0x00,0x12,0x11,0x12,0x39,0xba,0x00,0x4b,
-0x00,0x2c,0x00,0x12,0x11,0x12,0x39,0xba,0x00,0x4e,0x00,0x2c,0x00,0x12,0x11,0x12,
-0x39,0xba,0x00,0x4f,0x00,0x2c,0x00,0x12,0x11,0x12,0x39,0xba,0x00,0x50,0x00,0x2c,
-0x00,0x12,0x11,0x12,0x39,0xba,0x00,0x51,0x00,0x2c,0x00,0x12,0x11,0x12,0x39,0xba,
-0x00,0x52,0x00,0x2c,0x00,0x12,0x11,0x12,0x39,0xba,0x00,0x53,0x00,0x2c,0x00,0x12,
-0x11,0x12,0x39,0xba,0x00,0x54,0x00,0x2c,0x00,0x12,0x11,0x12,0x39,0xba,0x00,0x55,
-0x00,0x2c,0x00,0x12,0x11,0x12,0x39,0xba,0x00,0x57,0x00,0x2c,0x00,0x12,0x11,0x12,
-0x39,0xba,0x00,0x59,0x00,0x2c,0x00,0x12,0x11,0x12,0x39,0xb8,0x00,0x62,0xd0,0xba,
-0x00,0x66,0x00,0x2c,0x00,0x12,0x11,0x12,0x39,0xba,0x00,0x6a,0x00,0x2c,0x00,0x12,
-0x11,0x12,0x39,0xba,0x00,0x6d,0x00,0x2c,0x00,0x12,0x11,0x12,0x39,0xba,0x00,0x73,
-0x00,0x2c,0x00,0x12,0x11,0x12,0x39,0xba,0x00,0x76,0x00,0x2c,0x00,0x12,0x11,0x12,
-0x39,0xba,0x00,0x77,0x00,0x2c,0x00,0x12,0x11,0x12,0x39,0xba,0x00,0x78,0x00,0x2c,
-0x00,0x12,0x11,0x12,0x39,0xba,0x00,0x79,0x00,0x2c,0x00,0x12,0x11,0x12,0x39,0xba,
-0x00,0x7b,0x00,0x2c,0x00,0x12,0x11,0x12,0x39,0xba,0x00,0x7d,0x00,0x2c,0x00,0x12,
-0x11,0x12,0x39,0xba,0x00,0x8c,0x00,0x2c,0x00,0x12,0x11,0x12,0x39,0xba,0x00,0x8e,
-0x00,0x2c,0x00,0x12,0x11,0x12,0x39,0xba,0x00,0x92,0x00,0x2c,0x00,0x12,0x11,0x12,
-0x39,0xba,0x00,0x93,0x00,0x2c,0x00,0x12,0x11,0x12,0x39,0xba,0x00,0x94,0x00,0x2c,
-0x00,0x12,0x11,0x12,0x39,0xba,0x00,0x97,0x00,0x2c,0x00,0x12,0x11,0x12,0x39,0xba,
-0x00,0xb2,0x00,0x2c,0x00,0x12,0x11,0x12,0x39,0xba,0x00,0xbc,0x00,0x2c,0x00,0x12,
-0x11,0x12,0x39,0xba,0x00,0xbd,0x00,0x2c,0x00,0x12,0x11,0x12,0x39,0xba,0x00,0xbf,
-0x00,0x2c,0x00,0x12,0x11,0x12,0x39,0xba,0x00,0xc2,0x00,0x2c,0x00,0x12,0x11,0x12,
-0x39,0xba,0x00,0xc3,0x00,0x2c,0x00,0x12,0x11,0x12,0x39,0x30,0x31,0x01,0x34,0x27,
-0x36,0x35,0x34,0x26,0x35,0x27,0x36,0x35,0x27,0x23,0x37,0x27,0x07,0x27,0x37,0x27,
-0x07,0x27,0x06,0x07,0x27,0x23,0x22,0x15,0x27,0x07,0x17,0x07,0x1f,0x01,0x07,0x14,
-0x33,0x17,0x07,0x15,0x17,0x07,0x17,0x37,0x15,0x17,0x37,0x17,0x3f,0x01,0x1e,0x01,
-0x33,0x32,0x3f,0x01,0x17,0x36,0x35,0x34,0x26,0x35,0x27,0x33,0x37,0x0f,0x01,0x16,
-0x15,0x14,0x07,0x27,0x07,0x27,0x07,0x27,0x07,0x37,0x27,0x07,0x37,0x27,0x37,0x27,
-0x37,0x27,0x37,0x2f,0x01,0x17,0x37,0x16,0x33,0x32,0x3f,0x01,0x17,0x37,0x1f,0x01,
-0x37,0x07,0x33,0x07,0x1f,0x01,0x23,0x07,0x17,0x2f,0x01,0x07,0x1f,0x01,0x27,0x07,
-0x17,0x27,0x35,0x27,0x07,0x27,0x17,0x37,0x35,0x16,0x2f,0x01,0x26,0x23,0x22,0x06,
-0x07,0x0e,0x01,0x07,0x33,0x36,0x33,0x32,0x17,0x27,0x0f,0x01,0x37,0x07,0x35,0x27,
-0x07,0x27,0x17,0x37,0x35,0x16,0x27,0x26,0x2b,0x01,0x22,0x07,0x06,0x15,0x16,0x33,
-0x32,0x36,0x33,0x32,0x27,0x06,0x15,0x14,0x16,0x15,0x16,0x33,0x32,0x36,0x37,0x27,
-0x06,0x23,0x22,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x27,0x0f,0x01,0x37,0x25,0x23,
-0x37,0x05,0x14,0x07,0x06,0x23,0x22,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x16,0x04,
-0x55,0x60,0x35,0x02,0x93,0x1e,0x0e,0xae,0x06,0x33,0x91,0x06,0x06,0x1c,0x83,0x43,
-0x22,0x35,0x4f,0x04,0x22,0x55,0x08,0x29,0x4d,0x07,0x50,0x2b,0x14,0x76,0x19,0xc0,
-0x09,0x16,0xb7,0x16,0x89,0x2d,0x25,0x46,0x19,0x23,0x0f,0x12,0x0b,0x08,0x46,0x1a,
-0x01,0x2e,0x42,0x10,0x17,0x5e,0x3b,0x03,0x5d,0x08,0x5e,0x49,0x42,0x91,0x08,0x16,
-0xb7,0x17,0xcb,0x39,0xaf,0x51,0x7d,0x60,0x34,0x08,0x60,0x0f,0x2a,0x1e,0x02,0x0c,
-0x50,0x3a,0x83,0x0f,0x08,0xbd,0x0f,0xc5,0x3c,0xa9,0x07,0x07,0x49,0x74,0x87,0x1d,
-0x06,0x14,0x05,0x13,0x11,0x0e,0x21,0x15,0x06,0x4b,0x04,0x13,0x30,0x5d,0x02,0x06,
-0x19,0x04,0x07,0x07,0x18,0x19,0x04,0x1a,0x11,0x12,0x0e,0x10,0x69,0x18,0x0e,0x20,
-0x37,0x18,0x04,0x4a,0x03,0x14,0x30,0x56,0x09,0x2c,0x06,0x05,0x01,0x32,0x09,0x24,
-0x05,0x09,0x08,0x25,0x72,0x5d,0x02,0x0b,0x27,0x06,0x0e,0x06,0x02,0x0a,0x0e,0x1d,
-0x14,0x0e,0x15,0x04,0x0a,0x68,0x18,0x0c,0x1d,0x01,0xfd,0x27,0x19,0xfe,0xe6,0x09,
-0x15,0x0e,0x16,0x02,0x0c,0x18,0x11,0x08,0x03,0x01,0x9d,0x17,0x32,0x09,0x2c,0x04,
-0x07,0x02,0x31,0x0b,0x30,0x15,0x38,0x0b,0x27,0x08,0x1f,0x1d,0x59,0x3c,0x13,0x63,
-0x27,0x87,0x09,0x39,0x44,0x14,0x30,0x33,0x30,0x24,0x20,0x1d,0x26,0x14,0x30,0x13,
-0x27,0x3b,0x09,0x60,0x39,0x09,0x6a,0x12,0x14,0x13,0x74,0x14,0x09,0x23,0x03,0x06,
-0x05,0x50,0x28,0x0b,0x09,0x58,0x1e,0x05,0x03,0x14,0x8b,0x27,0x73,0x38,0x5f,0x27,
-0x27,0x2f,0x40,0x0b,0x3b,0x31,0x2e,0x5a,0x0a,0x56,0x26,0x09,0x8a,0x2d,0x04,0x74,
-0x39,0x58,0x0b,0x38,0x24,0x44,0x37,0x33,0x14,0x1c,0x4d,0x2f,0x0c,0x84,0x07,0x33,
-0x0c,0x13,0x14,0x24,0xa9,0x0c,0x76,0x6a,0xac,0x06,0x53,0x56,0x03,0x80,0x35,0x03,
-0x02,0x2d,0x50,0x2d,0x28,0x28,0xac,0x09,0xaf,0x0e,0x12,0xac,0x07,0x76,0x6c,0xab,
-0x02,0x57,0x57,0x78,0x3b,0x03,0x26,0x6c,0x20,0x02,0xb6,0x13,0x50,0x03,0x0e,0x05,
-0x48,0x02,0x03,0x1f,0x07,0x23,0x28,0x1b,0x1a,0x03,0x24,0x05,0xb0,0x0c,0x53,0x38,
-0x35,0x11,0x20,0x11,0x2b,0x0b,0x03,0x35,0x18,0x06,0x00,0x01,0xff,0xf1,0x03,0x22,
-0x02,0x3c,0x03,0xa2,0x00,0x03,0x00,0x0f,0xb8,0x00,0x1e,0x2b,0x00,0xba,0x00,0x00,
-0x00,0x01,0x00,0x21,0x2b,0x30,0x31,0x03,0x15,0x21,0x35,0x0f,0x02,0x4b,0x03,0xa2,
-0x80,0x80,0x00,0x02,0x00,0x04,0x01,0x8d,0x00,0xf9,0x03,0x10,0x00,0x07,0x00,0x0b,
-0x00,0x27,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x08,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,
-0x08,0x10,0xba,0x00,0x05,0x00,0x09,0x00,0x21,0x2b,0xb8,0x00,0x05,0x10,0x00,0xb8,
-0x00,0x06,0x2f,0xb8,0x00,0x02,0x2f,0x30,0x31,0x13,0x15,0x17,0x33,0x37,0x35,0x27,
-0x23,0x17,0x33,0x15,0x23,0x04,0x31,0x93,0x31,0x31,0x93,0x31,0x31,0x31,0x02,0xaf,
-0xc1,0x61,0x61,0xc1,0x61,0x66,0xa4,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x01,0x25,
-0x02,0x07,0x00,0x0b,0x00,0x0f,0x00,0x4b,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x05,0x00,
-0x02,0x00,0x21,0x2b,0xb8,0x00,0x05,0x10,0xb8,0x00,0x08,0xd0,0xb8,0x00,0x02,0x10,
-0xb8,0x00,0x0a,0xd0,0x00,0xb8,0x00,0x09,0x2f,0xba,0x00,0x0c,0x00,0x0d,0x00,0x21,
-0x2b,0xb8,0x00,0x0c,0x10,0xba,0x00,0x00,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x00,
-0x10,0xb8,0x00,0x01,0x10,0xb8,0x00,0x05,0xd0,0xb8,0x00,0x00,0x10,0xb8,0x00,0x07,
-0xd0,0x30,0x31,0x11,0x15,0x33,0x15,0x33,0x35,0x33,0x35,0x23,0x35,0x23,0x15,0x03,
-0x15,0x21,0x35,0x61,0x63,0x61,0x61,0x63,0x61,0x01,0x25,0x01,0x91,0x75,0x77,0x77,
-0x75,0x76,0x76,0xfe,0xe3,0x74,0x74,0x00,0x00,0x01,0x00,0x01,0x01,0x8a,0x00,0xf6,
-0x03,0x0f,0x00,0x0f,0x00,0x61,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x04,0x00,0x05,0x00,
-0x21,0x2b,0xb8,0x00,0x04,0x10,0xba,0x00,0x0b,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,
-0x0b,0x10,0xb8,0x00,0x04,0x10,0xb8,0x00,0x00,0xd0,0xb8,0x00,0x0b,0x10,0xb8,0x00,
-0x07,0xd0,0xba,0x00,0x09,0x00,0x02,0x00,0x0b,0x11,0x12,0x39,0xb8,0x00,0x05,0x10,
-0xb8,0x00,0x0e,0xd0,0x00,0xba,0x00,0x05,0x00,0x06,0x00,0x21,0x2b,0xb8,0x00,0x05,
-0x10,0xba,0x00,0x0d,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x0d,0x10,0xb8,0x00,0x05,
-0x10,0xb8,0x00,0x08,0xd0,0x30,0x31,0x13,0x35,0x33,0x15,0x07,0x23,0x15,0x33,0x35,
-0x23,0x37,0x35,0x27,0x23,0x07,0x15,0x63,0x31,0x31,0x62,0xf5,0x31,0x31,0x31,0x93,
-0x31,0x02,0x4c,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x62,0x62,0x61,0x00,0x00,0x01,
-0xff,0xff,0x01,0x89,0x00,0xf4,0x03,0x10,0x00,0x15,0x00,0x69,0xb8,0x00,0x1e,0x2b,
-0xba,0x00,0x08,0x00,0x09,0x00,0x21,0x2b,0xb8,0x00,0x08,0x10,0xba,0x00,0x11,0x00,
-0x02,0x00,0x21,0x2b,0xb8,0x00,0x11,0x10,0xb8,0x00,0x08,0x10,0xb8,0x00,0x00,0xd0,
-0xb8,0x00,0x08,0x10,0xb8,0x00,0x04,0xd0,0xb8,0x00,0x02,0x10,0xb8,0x00,0x05,0xd0,
-0xb8,0x00,0x11,0x10,0xb8,0x00,0x0d,0xd0,0xba,0x00,0x0f,0x00,0x02,0x00,0x11,0x11,
-0x12,0x39,0xb8,0x00,0x09,0x10,0xb8,0x00,0x14,0xd0,0x00,0xba,0x00,0x08,0x00,0x0b,
-0x00,0x21,0x2b,0xb8,0x00,0x08,0x10,0xba,0x00,0x13,0x00,0x00,0x00,0x21,0x2b,0xb8,
-0x00,0x13,0x10,0x30,0x31,0x13,0x35,0x33,0x15,0x07,0x33,0x15,0x23,0x35,0x23,0x15,
-0x17,0x33,0x37,0x35,0x23,0x37,0x35,0x27,0x23,0x07,0x15,0x61,0x30,0x30,0x30,0x30,
-0x62,0x32,0x90,0x33,0x31,0x31,0x31,0x93,0x31,0x02,0x8d,0x41,0x41,0x41,0x82,0x43,
-0x43,0x41,0x41,0x82,0x41,0x41,0x42,0x42,0x41,0x00,0x00,0x01,0xff,0xff,0x02,0x07,
-0x01,0x25,0x03,0x0e,0x00,0x05,0x00,0x0f,0xb8,0x00,0x1e,0x2b,0x00,0xb8,0x00,0x00,
-0x2f,0xb8,0x00,0x02,0x2f,0x30,0x31,0x01,0x15,0x07,0x23,0x35,0x37,0x01,0x25,0x62,
-0xc4,0x62,0x03,0x0e,0x83,0x84,0x84,0x83,0x00,0x01,0x00,0x01,0xfe,0xfd,0x01,0xe8,
-0x02,0x09,0x00,0x0b,0x00,0x43,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x01,0x00,0x0a,0x00,
-0x21,0x2b,0xb8,0x00,0x01,0x10,0xba,0x00,0x05,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,
-0x05,0x10,0xb8,0x00,0x01,0x10,0xb8,0x00,0x07,0xd0,0xb8,0x00,0x07,0x2f,0x00,0xb8,
-0x00,0x00,0x2f,0xb8,0x00,0x03,0x2f,0xb8,0x00,0x08,0x2f,0xba,0x00,0x02,0x00,0x07,
-0x00,0x21,0x2b,0xb8,0x00,0x02,0x10,0x30,0x31,0x13,0x11,0x33,0x11,0x33,0x11,0x07,
-0x23,0x11,0x23,0x27,0x11,0xc6,0x61,0xc1,0x5d,0xc3,0x67,0x60,0x02,0x09,0xfe,0x79,
-0x01,0x87,0xfe,0x78,0x81,0xfe,0xfd,0x7f,0x02,0x8d,0x00,0x01,0x00,0x00,0x00,0x00,
-0x01,0xe8,0x03,0x0e,0x00,0x0b,0x00,0x45,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x05,0x00,
-0x06,0x00,0x21,0x2b,0xb8,0x00,0x05,0x10,0xba,0x00,0x01,0x00,0x02,0x00,0x21,0x2b,
-0xb8,0x00,0x01,0x10,0xba,0x00,0x08,0x00,0x06,0x00,0x05,0x11,0x12,0x39,0xb8,0x00,
-0x06,0x10,0xb8,0x00,0x09,0xd0,0x00,0xb8,0x00,0x01,0x2f,0xb8,0x00,0x05,0x2f,0xba,
-0x00,0x00,0x00,0x03,0x00,0x21,0x2b,0xb8,0x00,0x00,0x10,0x30,0x31,0x01,0x11,0x23,
-0x11,0x23,0x11,0x23,0x11,0x33,0x27,0x11,0x37,0x01,0xe8,0xc3,0x61,0xc4,0x61,0x61,
-0x61,0x03,0x0e,0xfc,0xf2,0x02,0x8b,0xfd,0x75,0x01,0x03,0x82,0x01,0x06,0x83,0x00,
-0x00,0x01,0x00,0x00,0x00,0xff,0x00,0xc4,0x02,0x06,0x00,0x03,0x00,0x1b,0xb8,0x00,
-0x1e,0x2b,0xba,0x00,0x03,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x03,0x10,0x00,0xb8,
-0x00,0x00,0x2f,0xb8,0x00,0x01,0x2f,0x30,0x31,0x19,0x01,0x33,0x11,0xc4,0x02,0x06,
-0xfe,0xf9,0x01,0x07,0x00,0x01,0xff,0xce,0xfe,0xaf,0x00,0xc2,0x00,0x14,0x00,0x06,
-0x00,0x17,0xb8,0x00,0x1e,0x2b,0x00,0xb8,0x00,0x03,0x2f,0xba,0x00,0x06,0x00,0x00,
-0x00,0x21,0x2b,0xb8,0x00,0x06,0x10,0x30,0x31,0x03,0x33,0x35,0x27,0x23,0x17,0x23,
-0x32,0xf4,0x36,0x86,0x4c,0x84,0xfe,0xaf,0xf3,0x72,0xb5,0x00,0x00,0x01,0x00,0x04,
-0x01,0x89,0x00,0xc7,0x03,0x10,0x00,0x0a,0x00,0x3b,0xb8,0x00,0x1e,0x2b,0xba,0x00,
-0x09,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x09,0x10,0xb8,0x00,0x03,0xdc,0xb8,0x00,
-0x00,0x10,0xb8,0x00,0x04,0xd0,0xb8,0x00,0x00,0x10,0xb8,0x00,0x07,0xdc,0x00,0xb8,
-0x00,0x09,0x2f,0xba,0x00,0x04,0x00,0x05,0x00,0x21,0x2b,0xb8,0x00,0x04,0x10,0xb8,
-0x00,0x07,0xd0,0x30,0x31,0x13,0x15,0x33,0x15,0x23,0x15,0x33,0x35,0x23,0x11,0x23,
-0x04,0x30,0x30,0xc3,0x31,0x62,0x02,0xae,0x62,0x61,0x62,0x62,0x01,0x25,0x00,0x02,
-0x00,0x04,0x01,0x8d,0x00,0xf9,0x03,0x10,0x00,0x07,0x00,0x0b,0x00,0x27,0xb8,0x00,
-0x1e,0x2b,0xba,0x00,0x08,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x08,0x10,0xba,0x00,
-0x05,0x00,0x09,0x00,0x21,0x2b,0xb8,0x00,0x05,0x10,0x00,0xb8,0x00,0x06,0x2f,0xb8,
-0x00,0x02,0x2f,0x30,0x31,0x13,0x15,0x17,0x33,0x37,0x35,0x27,0x23,0x17,0x33,0x15,
-0x23,0x04,0x31,0x93,0x31,0x31,0x93,0x31,0x31,0x31,0x02,0xaf,0xc1,0x61,0x61,0xc1,
-0x61,0x66,0xa4,0x00,0x00,0x02,0x00,0x04,0x00,0x82,0x01,0xbe,0x02,0x09,0x00,0x08,
-0x00,0x11,0x00,0x2b,0xb8,0x00,0x1e,0x2b,0x00,0xb8,0x00,0x05,0x2f,0xb8,0x00,0x0e,
-0x2f,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x09,0x2f,0xba,0x00,0x03,0x00,0x05,0x00,0x00,
-0x11,0x12,0x39,0xba,0x00,0x0c,0x00,0x05,0x00,0x00,0x11,0x12,0x39,0x30,0x31,0x01,
-0x23,0x15,0x17,0x07,0x15,0x33,0x37,0x35,0x25,0x23,0x15,0x17,0x07,0x15,0x33,0x37,
-0x35,0x01,0x5c,0x63,0x67,0x67,0x63,0x62,0xfe,0xa9,0x63,0x69,0x69,0x63,0x63,0x02,
-0x09,0x83,0x3f,0x42,0x83,0x83,0x81,0x83,0x83,0x3f,0x42,0x83,0x83,0x81,0x00,0x03,
-0x00,0x00,0x00,0x00,0x02,0x5d,0x03,0x0f,0x00,0x03,0x00,0x0e,0x00,0x1c,0x00,0xa3,
-0xb8,0x00,0x1e,0x2b,0xba,0x00,0x0d,0x00,0x04,0x00,0x21,0x2b,0xb8,0x00,0x0d,0x10,
-0xba,0x00,0x0f,0x00,0x10,0x00,0x21,0x2b,0xb8,0x00,0x0f,0x10,0xba,0x00,0x15,0x00,
-0x12,0x00,0x21,0x2b,0xb8,0x00,0x15,0x10,0xb8,0x00,0x0d,0x10,0xb8,0x00,0x07,0xdc,
-0xb8,0x00,0x04,0x10,0xb8,0x00,0x08,0xd0,0xb8,0x00,0x04,0x10,0xb8,0x00,0x0b,0xdc,
-0xb8,0x00,0x15,0x10,0xb8,0x00,0x18,0xd0,0xb8,0x00,0x12,0x10,0xb8,0x00,0x1a,0xd0,
-0xb8,0x00,0x15,0x10,0xb8,0x00,0x1e,0xdc,0x00,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x0d,
-0x2f,0xb8,0x00,0x01,0x2f,0xb8,0x00,0x13,0x2f,0xba,0x00,0x1c,0x00,0x11,0x00,0x21,
-0x2b,0xb8,0x00,0x1c,0x10,0xba,0x00,0x08,0x00,0x09,0x00,0x21,0x2b,0xb8,0x00,0x08,
-0x10,0xb8,0x00,0x0b,0xd0,0xb8,0x00,0x11,0x10,0xb8,0x00,0x15,0xd0,0xb8,0x00,0x1c,
-0x10,0xb8,0x00,0x17,0xd0,0xb8,0x00,0x09,0x10,0xb8,0x00,0x19,0xd0,0xb8,0x00,0x19,
-0x2f,0x30,0x31,0x01,0x03,0x33,0x13,0x05,0x15,0x33,0x15,0x23,0x15,0x33,0x35,0x23,
-0x11,0x23,0x01,0x23,0x15,0x33,0x15,0x33,0x35,0x33,0x35,0x23,0x11,0x23,0x11,0x23,
-0x01,0x4d,0xc4,0x62,0xc4,0xfe,0x51,0x31,0x31,0xc4,0x32,0x61,0x01,0x69,0x30,0x61,
-0x61,0x31,0x31,0x61,0x31,0x03,0x0e,0xfc,0xf2,0x03,0x0e,0x61,0x62,0x62,0x61,0x61,
-0x01,0x26,0xfd,0xf5,0xc4,0x40,0x40,0x42,0x01,0x04,0xfe,0xfc,0x00,0x03,0x00,0x00,
-0x00,0x00,0x02,0x5b,0x03,0x0f,0x00,0x03,0x00,0x0e,0x00,0x1e,0x00,0xb1,0xb8,0x00,
-0x1e,0x2b,0xba,0x00,0x0d,0x00,0x04,0x00,0x21,0x2b,0xb8,0x00,0x0d,0x10,0xba,0x00,
-0x13,0x00,0x14,0x00,0x21,0x2b,0xb8,0x00,0x13,0x10,0xba,0x00,0x1a,0x00,0x11,0x00,
-0x21,0x2b,0xb8,0x00,0x1a,0x10,0xb8,0x00,0x0d,0x10,0xb8,0x00,0x07,0xdc,0xb8,0x00,
-0x04,0x10,0xb8,0x00,0x08,0xd0,0xb8,0x00,0x04,0x10,0xb8,0x00,0x0b,0xdc,0xb8,0x00,
-0x13,0x10,0xb8,0x00,0x0f,0xd0,0xb8,0x00,0x1a,0x10,0xb8,0x00,0x16,0xd0,0xba,0x00,
-0x18,0x00,0x11,0x00,0x1a,0x11,0x12,0x39,0xb8,0x00,0x14,0x10,0xb8,0x00,0x1d,0xd0,
-0xb8,0x00,0x1a,0x10,0xb8,0x00,0x20,0xdc,0x00,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x0d,
-0x2f,0xba,0x00,0x14,0x00,0x15,0x00,0x21,0x2b,0xb8,0x00,0x14,0x10,0xba,0x00,0x1c,
-0x00,0x0f,0x00,0x21,0x2b,0xb8,0x00,0x1c,0x10,0xb8,0x00,0x15,0x10,0xb8,0x00,0x01,
-0xd0,0xb8,0x00,0x1c,0x10,0xb8,0x00,0x09,0xd0,0xb8,0x00,0x09,0x2f,0xb8,0x00,0x08,
-0xdc,0xb8,0x00,0x0b,0xd0,0xb8,0x00,0x14,0x10,0xb8,0x00,0x17,0xd0,0x30,0x31,0x01,
-0x03,0x33,0x13,0x05,0x15,0x33,0x15,0x23,0x15,0x33,0x35,0x23,0x11,0x23,0x01,0x35,
-0x33,0x15,0x07,0x23,0x15,0x33,0x35,0x23,0x37,0x35,0x27,0x23,0x07,0x15,0x01,0x4d,
-0xc4,0x62,0xc4,0xfe,0x51,0x31,0x31,0xc4,0x32,0x61,0x01,0x97,0x31,0x31,0x61,0xf4,
-0x31,0x31,0x31,0x92,0x31,0x03,0x0e,0xfc,0xf2,0x03,0x0e,0x61,0x62,0x62,0x61,0x61,
-0x01,0x26,0xfd,0xb3,0x60,0x60,0x62,0x60,0x60,0x62,0x60,0x63,0x63,0x60,0x00,0x03,
-0x00,0x00,0x00,0x00,0x02,0x87,0x03,0x10,0x00,0x03,0x00,0x11,0x00,0x27,0x00,0xd3,
-0xb8,0x00,0x1e,0x2b,0xba,0x00,0x1a,0x00,0x1b,0x00,0x21,0x2b,0xb8,0x00,0x1a,0x10,
-0xba,0x00,0x23,0x00,0x14,0x00,0x21,0x2b,0xb8,0x00,0x23,0x10,0xba,0x00,0x04,0x00,
-0x05,0x00,0x21,0x2b,0xb8,0x00,0x04,0x10,0xba,0x00,0x0a,0x00,0x07,0x00,0x21,0x2b,
-0xb8,0x00,0x0a,0x10,0xb8,0x00,0x0d,0xd0,0xb8,0x00,0x07,0x10,0xb8,0x00,0x0f,0xd0,
-0xb8,0x00,0x1a,0x10,0xb8,0x00,0x12,0xd0,0xba,0x00,0x16,0x00,0x1b,0x00,0x0a,0x11,
-0x12,0x39,0xb8,0x00,0x14,0x10,0xb8,0x00,0x17,0xd0,0xb8,0x00,0x23,0x10,0xb8,0x00,
-0x1f,0xd0,0xba,0x00,0x21,0x00,0x14,0x00,0x23,0x11,0x12,0x39,0xb8,0x00,0x1b,0x10,
-0xb8,0x00,0x26,0xd0,0xb8,0x00,0x0a,0x10,0xb8,0x00,0x29,0xdc,0x00,0xb8,0x00,0x01,
-0x2f,0xb8,0x00,0x08,0x2f,0xba,0x00,0x11,0x00,0x06,0x00,0x21,0x2b,0xb8,0x00,0x11,
-0x10,0xba,0x00,0x25,0x00,0x12,0x00,0x21,0x2b,0xb8,0x00,0x25,0x10,0xba,0x00,0x1a,
-0x00,0x1d,0x00,0x21,0x2b,0xb8,0x00,0x1a,0x10,0xb8,0x00,0x25,0x10,0xb8,0x00,0x00,
-0xd0,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x06,0x10,0xb8,0x00,0x0a,0xd0,0xb8,0x00,0x11,
-0x10,0xb8,0x00,0x0c,0xd0,0xb8,0x00,0x1d,0x10,0xb8,0x00,0x0e,0xd0,0xb8,0x00,0x0e,
-0x2f,0x30,0x31,0x01,0x03,0x33,0x13,0x03,0x23,0x15,0x33,0x15,0x33,0x35,0x33,0x35,
-0x23,0x11,0x23,0x11,0x23,0x01,0x35,0x33,0x15,0x07,0x33,0x15,0x23,0x35,0x23,0x15,
-0x17,0x33,0x37,0x35,0x23,0x37,0x35,0x27,0x23,0x07,0x15,0x01,0x77,0xc3,0x62,0xc3,
-0x16,0x30,0x62,0x62,0x30,0x30,0x62,0x32,0xfe,0x9e,0x31,0x31,0x31,0x31,0x61,0x32,
-0x90,0x32,0x30,0x30,0x30,0x93,0x31,0x03,0x0e,0xfc,0xf2,0x03,0x0e,0xfd,0xf6,0xc4,
-0x40,0x40,0x42,0x01,0x04,0xfe,0xfc,0x02,0x0b,0x41,0x41,0x41,0x82,0x43,0x43,0x41,
-0x41,0x82,0x41,0x41,0x42,0x42,0x41,0x00,0x00,0x02,0xff,0xff,0x00,0x00,0x01,0xe8,
-0x03,0x0e,0x00,0x0a,0x00,0x0e,0x00,0x5b,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x03,0x00,
-0x08,0x00,0x21,0x2b,0xb8,0x00,0x03,0x10,0xba,0x00,0x05,0x00,0x03,0x00,0x21,0x2b,
-0xb8,0x00,0x05,0x10,0xb8,0x00,0x03,0x10,0xb8,0x00,0x07,0xd0,0xb8,0x00,0x05,0x10,
-0xb8,0x00,0x0b,0xd0,0xb8,0x00,0x03,0x10,0xb8,0x00,0x0d,0xd0,0x00,0xba,0x00,0x01,
-0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x01,0x10,0xba,0x00,0x0c,0x00,0x0b,0x00,0x21,
-0x2b,0xb8,0x00,0x0c,0x10,0xba,0x00,0x06,0x00,0x05,0x00,0x21,0x2b,0xb8,0x00,0x06,
-0x10,0x30,0x31,0x21,0x35,0x21,0x35,0x37,0x33,0x35,0x23,0x03,0x15,0x17,0x01,0x35,
-0x23,0x15,0x01,0xe8,0xfe,0xdb,0x62,0x61,0xc3,0xc4,0x62,0x01,0x25,0xc3,0x82,0x85,
-0x82,0x82,0xfe,0xfc,0x85,0x82,0x02,0x8d,0x81,0x81,0x00,0x03,0x00,0x00,0x00,0x00,
-0x01,0xe8,0x04,0x51,0x00,0x09,0x00,0x0d,0x00,0x13,0x00,0x5b,0xb8,0x00,0x1e,0x2b,
-0xba,0x00,0x0b,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x0b,0x10,0xba,0x00,0x07,0x00,
-0x06,0x00,0x21,0x2b,0xb8,0x00,0x07,0x10,0xb8,0x00,0x0b,0x10,0xb8,0x00,0x03,0xd0,
-0xb8,0x00,0x06,0x10,0xb8,0x00,0x0c,0xd0,0x00,0xb8,0x00,0x0f,0x2f,0xb8,0x00,0x02,
-0x2f,0xb8,0x00,0x06,0x2f,0xba,0x00,0x0a,0x00,0x04,0x00,0x21,0x2b,0xb8,0x00,0x0a,
-0x10,0xba,0x00,0x00,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x00,0x10,0xb8,0x00,0x01,
-0x10,0xb8,0x00,0x0b,0xd0,0x30,0x31,0x13,0x07,0x11,0x33,0x11,0x33,0x11,0x33,0x11,
-0x27,0x03,0x11,0x33,0x11,0x13,0x27,0x23,0x15,0x17,0x33,0x61,0x61,0xc4,0x61,0xc3,
-0x62,0xc2,0x61,0x32,0x63,0x62,0x62,0x63,0x03,0x0e,0x83,0xfd,0x75,0x01,0x03,0xfe,
-0xfd,0x02,0x8b,0x83,0xfe,0x77,0x01,0x06,0xfe,0xfa,0x02,0x4d,0x7f,0x82,0x85,0x00,
-0x00,0x03,0x00,0x00,0x00,0x00,0x01,0xe8,0x04,0x51,0x00,0x09,0x00,0x0d,0x00,0x13,
-0x00,0x5b,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x0b,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,
-0x0b,0x10,0xba,0x00,0x07,0x00,0x06,0x00,0x21,0x2b,0xb8,0x00,0x07,0x10,0xb8,0x00,
-0x0b,0x10,0xb8,0x00,0x03,0xd0,0xb8,0x00,0x06,0x10,0xb8,0x00,0x0c,0xd0,0x00,0xb8,
-0x00,0x12,0x2f,0xb8,0x00,0x02,0x2f,0xb8,0x00,0x06,0x2f,0xba,0x00,0x0a,0x00,0x04,
-0x00,0x21,0x2b,0xb8,0x00,0x0a,0x10,0xba,0x00,0x00,0x00,0x01,0x00,0x21,0x2b,0xb8,
-0x00,0x00,0x10,0xb8,0x00,0x01,0x10,0xb8,0x00,0x0b,0xd0,0x30,0x31,0x13,0x07,0x11,
-0x33,0x11,0x33,0x11,0x33,0x11,0x27,0x03,0x11,0x33,0x11,0x03,0x07,0x33,0x37,0x35,
-0x23,0x61,0x61,0xc4,0x61,0xc3,0x62,0xc2,0x61,0x85,0x03,0x63,0x62,0x62,0x03,0x0e,
-0x83,0xfd,0x75,0x01,0x03,0xfe,0xfd,0x02,0x8b,0x83,0xfe,0x77,0x01,0x06,0xfe,0xfa,
-0x02,0x47,0x82,0x85,0x82,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x01,0xe8,0x04,0x54,
-0x00,0x09,0x00,0x0d,0x00,0x16,0x00,0x9f,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x0b,0x00,
-0x01,0x00,0x21,0x2b,0xb8,0x00,0x0b,0x10,0xba,0x00,0x07,0x00,0x06,0x00,0x21,0x2b,
-0xb8,0x00,0x07,0x10,0xb8,0x00,0x0b,0x10,0xb8,0x00,0x03,0xd0,0xb8,0x00,0x06,0x10,
-0xb8,0x00,0x0c,0xd0,0xb8,0x00,0x0b,0x10,0xb8,0x00,0x10,0xd0,0xb8,0x00,0x10,0x2f,
-0xba,0x00,0x11,0x00,0x01,0x00,0x07,0x11,0x12,0x39,0xb8,0x00,0x06,0x10,0xb8,0x00,
-0x12,0xd0,0xb8,0x00,0x12,0x2f,0xb8,0x00,0x06,0x10,0xb8,0x00,0x15,0xd0,0xb8,0x00,
-0x15,0x2f,0xb8,0x00,0x0b,0x10,0xb8,0x00,0x16,0xd0,0xb8,0x00,0x16,0x2f,0x00,0xb8,
-0x00,0x15,0x2f,0xb8,0x00,0x02,0x2f,0xb8,0x00,0x06,0x2f,0xba,0x00,0x0a,0x00,0x04,
-0x00,0x21,0x2b,0xb8,0x00,0x0a,0x10,0xba,0x00,0x00,0x00,0x01,0x00,0x21,0x2b,0xb8,
-0x00,0x00,0x10,0xb8,0x00,0x01,0x10,0xb8,0x00,0x0b,0xd0,0xba,0x00,0x11,0x00,0x02,
-0x00,0x15,0x11,0x12,0x39,0x30,0x31,0x13,0x07,0x11,0x33,0x11,0x33,0x11,0x33,0x11,
-0x27,0x03,0x11,0x33,0x11,0x03,0x15,0x33,0x37,0x17,0x33,0x35,0x27,0x23,0x61,0x61,
-0xc4,0x61,0xc3,0x62,0xc2,0x61,0xc1,0x62,0x31,0x30,0x63,0x63,0x61,0x03,0x0e,0x83,
-0xfd,0x75,0x01,0x03,0xfe,0xfd,0x02,0x8b,0x83,0xfe,0x77,0x01,0x06,0xfe,0xfa,0x02,
-0x4c,0x84,0x8b,0x8b,0x84,0x83,0x00,0x03,0x00,0x00,0x00,0x00,0x01,0xe8,0x04,0x51,
-0x00,0x09,0x00,0x0d,0x00,0x19,0x00,0x87,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x0b,0x00,
-0x01,0x00,0x21,0x2b,0xb8,0x00,0x0b,0x10,0xba,0x00,0x07,0x00,0x06,0x00,0x21,0x2b,
-0xb8,0x00,0x07,0x10,0xb8,0x00,0x0b,0x10,0xb8,0x00,0x03,0xd0,0xb8,0x00,0x06,0x10,
-0xb8,0x00,0x0c,0xd0,0xba,0x00,0x10,0x00,0x01,0x00,0x07,0x11,0x12,0x39,0xba,0x00,
-0x16,0x00,0x01,0x00,0x07,0x11,0x12,0x39,0x00,0xb8,0x00,0x14,0x2f,0xb8,0x00,0x17,
-0x2f,0xb8,0x00,0x02,0x2f,0xb8,0x00,0x06,0x2f,0xba,0x00,0x0a,0x00,0x04,0x00,0x21,
-0x2b,0xb8,0x00,0x0a,0x10,0xba,0x00,0x00,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x00,
-0x10,0xb8,0x00,0x01,0x10,0xb8,0x00,0x0b,0xd0,0xba,0x00,0x10,0x00,0x02,0x00,0x14,
-0x11,0x12,0x39,0xba,0x00,0x16,0x00,0x02,0x00,0x14,0x11,0x12,0x39,0x30,0x31,0x13,
-0x07,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x27,0x03,0x11,0x33,0x11,0x03,0x33,0x37,
-0x15,0x33,0x37,0x35,0x23,0x07,0x35,0x23,0x07,0x61,0x61,0xc4,0x61,0xc3,0x62,0xc2,
-0x61,0xee,0x61,0x62,0x62,0x62,0x62,0x62,0x62,0x61,0x03,0x0e,0x83,0xfd,0x75,0x01,
-0x03,0xfe,0xfd,0x02,0x8b,0x83,0xfe,0x77,0x01,0x06,0xfe,0xfa,0x01,0xc5,0x6b,0x6b,
-0x85,0x82,0x7f,0x7f,0x7f,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x01,0xe8,0x04,0x53,
-0x00,0x09,0x00,0x0d,0x00,0x11,0x00,0x15,0x00,0x8b,0xb8,0x00,0x1e,0x2b,0xba,0x00,
-0x0b,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x0b,0x10,0xba,0x00,0x15,0x00,0x12,0x00,
-0x21,0x2b,0xb8,0x00,0x15,0x10,0xb8,0x00,0x0b,0x10,0xb8,0x00,0x03,0xd0,0xba,0x00,
-0x06,0x00,0x12,0x00,0x15,0x11,0x12,0x39,0xb8,0x00,0x06,0x2f,0xb8,0x00,0x07,0xdc,
-0xb8,0x00,0x06,0x10,0xb8,0x00,0x0c,0xd0,0xba,0x00,0x0e,0x00,0x01,0x00,0x0b,0x11,
-0x12,0x39,0xb8,0x00,0x0e,0x2f,0xb8,0x00,0x11,0xdc,0xb8,0x00,0x07,0x10,0xb8,0x00,
-0x17,0xdc,0x00,0xb8,0x00,0x0e,0x2f,0xb8,0x00,0x12,0x2f,0xb8,0x00,0x02,0x2f,0xb8,
-0x00,0x06,0x2f,0xba,0x00,0x0a,0x00,0x04,0x00,0x21,0x2b,0xb8,0x00,0x0a,0x10,0xba,
-0x00,0x00,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x00,0x10,0xb8,0x00,0x01,0x10,0xb8,
-0x00,0x0b,0xd0,0x30,0x31,0x13,0x07,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x27,0x03,
-0x11,0x33,0x11,0x01,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x61,0x61,0xc4,0x61,0xc3,
-0x62,0xc2,0x61,0xfe,0xef,0xc3,0x40,0xc4,0x03,0x0e,0x83,0xfd,0x75,0x01,0x03,0xfe,
-0xfd,0x02,0x8b,0x83,0xfe,0x77,0x01,0x06,0xfe,0xfa,0x02,0xce,0xfe,0xf9,0x01,0x07,
-0xfe,0xf9,0x01,0x07,0x00,0x03,0x00,0x00,0x00,0x00,0x01,0xe8,0x04,0x53,0x00,0x09,
-0x00,0x0d,0x00,0x11,0x00,0x75,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x0b,0x00,0x01,0x00,
-0x21,0x2b,0xb8,0x00,0x0b,0x10,0xba,0x00,0x07,0x00,0x06,0x00,0x21,0x2b,0xb8,0x00,
-0x07,0x10,0xb8,0x00,0x0b,0x10,0xb8,0x00,0x03,0xd0,0xb8,0x00,0x06,0x10,0xb8,0x00,
-0x0c,0xd0,0xba,0x00,0x0e,0x00,0x01,0x00,0x0b,0x11,0x12,0x39,0xb8,0x00,0x0e,0x2f,
-0xb8,0x00,0x11,0xdc,0xb8,0x00,0x07,0x10,0xb8,0x00,0x13,0xdc,0x00,0xb8,0x00,0x0e,
-0x2f,0xb8,0x00,0x02,0x2f,0xb8,0x00,0x06,0x2f,0xba,0x00,0x0a,0x00,0x04,0x00,0x21,
-0x2b,0xb8,0x00,0x0a,0x10,0xba,0x00,0x00,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x00,
-0x10,0xb8,0x00,0x01,0x10,0xb8,0x00,0x0b,0xd0,0x30,0x31,0x13,0x07,0x11,0x33,0x11,
-0x33,0x11,0x33,0x11,0x27,0x03,0x11,0x33,0x11,0x03,0x11,0x33,0x11,0x61,0x61,0xc4,
-0x61,0xc3,0x62,0xc2,0x61,0x92,0xc4,0x03,0x0e,0x83,0xfd,0x75,0x01,0x03,0xfe,0xfd,
-0x02,0x8b,0x83,0xfe,0x77,0x01,0x06,0xfe,0xfa,0x02,0xce,0xfe,0xf9,0x01,0x07,0x00,
-0x00,0x02,0x00,0x00,0x00,0x00,0x03,0x14,0x03,0x0e,0x00,0x10,0x00,0x14,0x00,0x6f,
-0xb8,0x00,0x1e,0x2b,0xba,0x00,0x0d,0x00,0x0e,0x00,0x21,0x2b,0xb8,0x00,0x0d,0x10,
-0xba,0x00,0x07,0x00,0x0a,0x00,0x21,0x2b,0xb8,0x00,0x07,0x10,0xb8,0x00,0x02,0xd0,
-0xb8,0x00,0x0d,0x10,0xb8,0x00,0x11,0xd0,0xb8,0x00,0x0a,0x10,0xb8,0x00,0x12,0xd0,
-0x00,0xba,0x00,0x08,0x00,0x09,0x00,0x21,0x2b,0xb8,0x00,0x08,0x10,0xba,0x00,0x00,
-0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x00,0x10,0xba,0x00,0x12,0x00,0x0b,0x00,0x21,
-0x2b,0xb8,0x00,0x12,0x10,0xb8,0x00,0x05,0xd0,0xb8,0x00,0x04,0xdc,0xb8,0x00,0x09,
-0x10,0xb8,0x00,0x0d,0xd0,0xb8,0x00,0x01,0x10,0xb8,0x00,0x13,0xd0,0x30,0x31,0x01,
-0x15,0x21,0x15,0x33,0x15,0x23,0x11,0x21,0x15,0x21,0x11,0x23,0x11,0x23,0x11,0x37,
-0x13,0x33,0x11,0x23,0x03,0x14,0xfe,0xdb,0xc4,0xc4,0x01,0x25,0xfe,0x11,0x61,0xc4,
-0x61,0x63,0x61,0x61,0x03,0x0e,0x83,0x84,0x82,0xfe,0xfc,0x81,0x01,0x03,0xfe,0xfd,
-0x02,0x8b,0x83,0xfe,0x77,0x01,0x06,0x00,0x00,0x01,0x00,0x00,0xfe,0xaf,0x01,0xe8,
-0x03,0x0e,0x00,0x12,0x00,0x71,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x0d,0x00,0x05,0x00,
-0x21,0x2b,0xb8,0x00,0x0d,0x10,0xba,0x00,0x09,0x00,0x0a,0x00,0x21,0x2b,0xb8,0x00,
-0x09,0x10,0xb8,0x00,0x0a,0x10,0xb8,0x00,0x02,0xd0,0xb8,0x00,0x02,0x2f,0xb8,0x00,
-0x09,0x10,0xb8,0x00,0x0e,0xd0,0xba,0x00,0x10,0x00,0x0a,0x00,0x09,0x11,0x12,0x39,
-0x00,0xba,0x00,0x01,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x01,0x10,0xba,0x00,0x07,
-0x00,0x06,0x00,0x21,0x2b,0xb8,0x00,0x07,0x10,0xba,0x00,0x0d,0x00,0x03,0x00,0x21,
-0x2b,0xb8,0x00,0x0d,0x10,0xb8,0x00,0x06,0x10,0xb8,0x00,0x0b,0xd0,0xb8,0x00,0x03,
-0x10,0xb8,0x00,0x0f,0xd0,0x30,0x31,0x13,0x35,0x33,0x27,0x23,0x27,0x11,0x37,0x21,
-0x11,0x23,0x35,0x23,0x11,0x21,0x15,0x23,0x17,0x15,0x9b,0x89,0x48,0x7b,0x61,0x61,
-0x01,0x87,0xc3,0x61,0x01,0x24,0x86,0x2e,0xfe,0xaf,0xb0,0xa1,0x81,0x02,0x0a,0x83,
-0xfe,0xf9,0x84,0xfd,0xf6,0x81,0x5e,0xf3,0x00,0x02,0x00,0x00,0x00,0x00,0x01,0xe8,
-0x04,0x51,0x00,0x0d,0x00,0x13,0x00,0x4f,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x0c,0x00,
-0x02,0x00,0x21,0x2b,0xb8,0x00,0x0c,0x10,0xb8,0x00,0x07,0xd0,0x00,0xb8,0x00,0x0f,
-0x2f,0xba,0x00,0x03,0x00,0x04,0x00,0x21,0x2b,0xb8,0x00,0x03,0x10,0xba,0x00,0x0b,
-0x00,0x08,0x00,0x21,0x2b,0xb8,0x00,0x0b,0x10,0xba,0x00,0x01,0x00,0x02,0x00,0x21,
-0x2b,0xb8,0x00,0x01,0x10,0xb8,0x00,0x03,0x10,0xb8,0x00,0x06,0xd0,0xb8,0x00,0x02,
-0x10,0xb8,0x00,0x0c,0xd0,0x30,0x31,0x01,0x21,0x07,0x11,0x17,0x21,0x35,0x21,0x11,
-0x33,0x35,0x23,0x35,0x21,0x03,0x27,0x23,0x15,0x17,0x33,0x01,0xe8,0xfe,0x79,0x61,
-0x61,0x01,0x87,0xfe,0xdc,0xc2,0xc2,0x01,0x24,0x91,0x63,0x62,0x62,0x63,0x03,0x0e,
-0x83,0xfd,0xf6,0x81,0x81,0x01,0x04,0x82,0x84,0x01,0x47,0x7f,0x82,0x85,0x00,0x02,
-0x00,0x00,0x00,0x00,0x01,0xe8,0x04,0x51,0x00,0x0d,0x00,0x13,0x00,0x4f,0xb8,0x00,
-0x1e,0x2b,0xba,0x00,0x0c,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x0c,0x10,0xb8,0x00,
-0x07,0xd0,0x00,0xb8,0x00,0x12,0x2f,0xba,0x00,0x03,0x00,0x04,0x00,0x21,0x2b,0xb8,
-0x00,0x03,0x10,0xba,0x00,0x0b,0x00,0x08,0x00,0x21,0x2b,0xb8,0x00,0x0b,0x10,0xba,
-0x00,0x01,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x01,0x10,0xb8,0x00,0x03,0x10,0xb8,
-0x00,0x06,0xd0,0xb8,0x00,0x02,0x10,0xb8,0x00,0x0c,0xd0,0x30,0x31,0x01,0x21,0x07,
-0x11,0x17,0x21,0x35,0x21,0x11,0x33,0x35,0x23,0x35,0x21,0x01,0x07,0x33,0x37,0x35,
-0x23,0x01,0xe8,0xfe,0x79,0x61,0x61,0x01,0x87,0xfe,0xdc,0xc2,0xc2,0x01,0x24,0xfe,
-0xb5,0x01,0x64,0x62,0x62,0x03,0x0e,0x83,0xfd,0xf6,0x81,0x81,0x01,0x04,0x82,0x84,
-0x01,0x47,0x88,0x85,0x82,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x01,0xe8,0x04,0x54,
-0x00,0x0d,0x00,0x16,0x00,0x4f,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x0c,0x00,0x02,0x00,
-0x21,0x2b,0xb8,0x00,0x0c,0x10,0xb8,0x00,0x07,0xd0,0x00,0xb8,0x00,0x15,0x2f,0xba,
-0x00,0x03,0x00,0x04,0x00,0x21,0x2b,0xb8,0x00,0x03,0x10,0xba,0x00,0x0b,0x00,0x08,
-0x00,0x21,0x2b,0xb8,0x00,0x0b,0x10,0xba,0x00,0x01,0x00,0x02,0x00,0x21,0x2b,0xb8,
-0x00,0x01,0x10,0xb8,0x00,0x03,0x10,0xb8,0x00,0x06,0xd0,0xb8,0x00,0x02,0x10,0xb8,
-0x00,0x0c,0xd0,0x30,0x31,0x01,0x21,0x07,0x11,0x17,0x21,0x35,0x21,0x11,0x33,0x35,
-0x23,0x35,0x21,0x01,0x15,0x33,0x37,0x17,0x33,0x35,0x27,0x23,0x01,0xe8,0xfe,0x79,
-0x61,0x61,0x01,0x87,0xfe,0xdc,0xc2,0xc2,0x01,0x24,0xfe,0x7c,0x62,0x31,0x30,0x63,
-0x63,0x61,0x03,0x0e,0x83,0xfd,0xf6,0x81,0x81,0x01,0x04,0x82,0x84,0x01,0x46,0x84,
-0x8b,0x8b,0x84,0x83,0x00,0x03,0x00,0x00,0x00,0x00,0x01,0xe8,0x04,0x53,0x00,0x0d,
-0x00,0x11,0x00,0x15,0x00,0x7d,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x0c,0x00,0x02,0x00,
-0x21,0x2b,0xb8,0x00,0x0c,0x10,0xba,0x00,0x15,0x00,0x12,0x00,0x21,0x2b,0xb8,0x00,
-0x15,0x10,0xb8,0x00,0x0c,0x10,0xb8,0x00,0x07,0xd0,0xba,0x00,0x0e,0x00,0x02,0x00,
-0x0c,0x11,0x12,0x39,0xb8,0x00,0x0e,0x2f,0xb8,0x00,0x11,0xdc,0xb8,0x00,0x15,0x10,
-0xb8,0x00,0x17,0xdc,0x00,0xb8,0x00,0x0e,0x2f,0xb8,0x00,0x12,0x2f,0xba,0x00,0x03,
-0x00,0x04,0x00,0x21,0x2b,0xb8,0x00,0x03,0x10,0xba,0x00,0x0b,0x00,0x08,0x00,0x21,
-0x2b,0xb8,0x00,0x0b,0x10,0xba,0x00,0x01,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x01,
-0x10,0xb8,0x00,0x03,0x10,0xb8,0x00,0x06,0xd0,0xb8,0x00,0x02,0x10,0xb8,0x00,0x0c,
-0xd0,0x30,0x31,0x01,0x21,0x07,0x11,0x17,0x21,0x35,0x21,0x11,0x33,0x35,0x23,0x35,
-0x21,0x01,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x01,0xe8,0xfe,0x79,0x61,0x61,0x01,
-0x87,0xfe,0xdc,0xc2,0xc2,0x01,0x24,0xfe,0x2c,0xc3,0x40,0xc4,0x03,0x0e,0x83,0xfd,
-0xf6,0x81,0x81,0x01,0x04,0x82,0x84,0x01,0xc8,0xfe,0xf9,0x01,0x07,0xfe,0xf9,0x01,
-0x07,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x01,0x86,0x04,0x51,0x00,0x0b,0x00,0x11,
-0x00,0x53,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x09,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,
-0x09,0x10,0xb8,0x00,0x0c,0xd0,0xb8,0x00,0x0c,0x2f,0xb8,0x00,0x02,0x10,0xb8,0x00,
-0x0e,0xd0,0xb8,0x00,0x0e,0x2f,0x00,0xb8,0x00,0x0d,0x2f,0xba,0x00,0x04,0x00,0x05,
-0x00,0x21,0x2b,0xb8,0x00,0x04,0x10,0xba,0x00,0x00,0x00,0x01,0x00,0x21,0x2b,0xb8,
-0x00,0x00,0x10,0xb8,0x00,0x04,0x10,0xb8,0x00,0x07,0xd0,0xb8,0x00,0x01,0x10,0xb8,
-0x00,0x09,0xd0,0x30,0x31,0x11,0x15,0x33,0x11,0x23,0x15,0x21,0x35,0x23,0x11,0x33,
-0x35,0x2f,0x01,0x23,0x15,0x17,0x33,0x61,0x61,0x01,0x86,0x61,0x61,0x5e,0x63,0x62,
-0x62,0x63,0x03,0x0e,0x83,0xfd,0xf6,0x81,0x81,0x02,0x0a,0x83,0xc4,0x7f,0x82,0x85,
-0x00,0x02,0x00,0x00,0x00,0x00,0x01,0x86,0x04,0x51,0x00,0x0b,0x00,0x11,0x00,0x53,
-0xb8,0x00,0x1e,0x2b,0xba,0x00,0x09,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x09,0x10,
-0xb8,0x00,0x02,0x10,0xb8,0x00,0x0c,0xd0,0xb8,0x00,0x09,0x10,0xb8,0x00,0x0f,0xd0,
-0xb8,0x00,0x0f,0x2f,0x00,0xb8,0x00,0x10,0x2f,0xba,0x00,0x04,0x00,0x05,0x00,0x21,
-0x2b,0xb8,0x00,0x04,0x10,0xba,0x00,0x00,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x00,
-0x10,0xb8,0x00,0x04,0x10,0xb8,0x00,0x07,0xd0,0xb8,0x00,0x01,0x10,0xb8,0x00,0x09,
-0xd0,0x30,0x31,0x11,0x15,0x33,0x11,0x23,0x15,0x21,0x35,0x23,0x11,0x33,0x35,0x25,
-0x15,0x33,0x37,0x35,0x23,0x61,0x61,0x01,0x86,0x61,0x61,0xfe,0xdb,0x64,0x62,0x62,
-0x03,0x0e,0x83,0xfd,0xf6,0x81,0x81,0x02,0x0a,0x83,0xc4,0x88,0x85,0x82,0x00,0x02,
-0x00,0x00,0x00,0x00,0x01,0x86,0x04,0x54,0x00,0x0b,0x00,0x14,0x00,0x49,0xb8,0x00,
-0x1e,0x2b,0xba,0x00,0x09,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x09,0x10,0xba,0x00,
-0x0f,0x00,0x02,0x00,0x09,0x11,0x12,0x39,0x00,0xb8,0x00,0x13,0x2f,0xba,0x00,0x04,
-0x00,0x05,0x00,0x21,0x2b,0xb8,0x00,0x04,0x10,0xba,0x00,0x00,0x00,0x01,0x00,0x21,
-0x2b,0xb8,0x00,0x00,0x10,0xb8,0x00,0x04,0x10,0xb8,0x00,0x07,0xd0,0xb8,0x00,0x01,
-0x10,0xb8,0x00,0x09,0xd0,0x30,0x31,0x11,0x15,0x33,0x11,0x23,0x15,0x21,0x35,0x23,
-0x11,0x33,0x35,0x25,0x15,0x33,0x37,0x17,0x33,0x35,0x27,0x23,0x61,0x61,0x01,0x86,
-0x61,0x61,0xfe,0xac,0x62,0x30,0x32,0x61,0x61,0x62,0x03,0x0e,0x83,0xfd,0xf6,0x81,
-0x81,0x02,0x0a,0x83,0xc3,0x84,0x8b,0x8b,0x84,0x83,0x00,0x03,0xff,0xe0,0x00,0x00,
-0x01,0xa5,0x04,0x53,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x69,0xb8,0x00,0x1e,0x2b,
-0xba,0x00,0x0f,0x00,0x0c,0x00,0x21,0x2b,0xb8,0x00,0x0f,0x10,0xb8,0x00,0x02,0xdc,
-0x41,0x03,0x00,0xff,0x00,0x02,0x00,0x01,0x5d,0xb8,0x00,0x09,0xdc,0xb8,0x00,0x10,
-0xdc,0x41,0x03,0x00,0xff,0x00,0x10,0x00,0x01,0x5d,0xb8,0x00,0x11,0xdc,0xb8,0x00,
-0x15,0xdc,0x00,0xb8,0x00,0x0c,0x2f,0xb8,0x00,0x12,0x2f,0xba,0x00,0x04,0x00,0x05,
-0x00,0x21,0x2b,0xb8,0x00,0x04,0x10,0xba,0x00,0x00,0x00,0x01,0x00,0x21,0x2b,0xb8,
-0x00,0x00,0x10,0xb8,0x00,0x04,0x10,0xb8,0x00,0x07,0xd0,0xb8,0x00,0x01,0x10,0xb8,
-0x00,0x09,0xd0,0x30,0x31,0x11,0x15,0x33,0x11,0x23,0x15,0x21,0x35,0x23,0x11,0x33,
-0x35,0x01,0x11,0x33,0x11,0x13,0x17,0x11,0x23,0x61,0x61,0x01,0x86,0x61,0x61,0xfe,
-0x5a,0xc4,0x3e,0xc3,0xc3,0x03,0x0e,0x83,0xfd,0xf6,0x81,0x81,0x02,0x0a,0x83,0x01,
-0x45,0xfe,0xfc,0x01,0x04,0xfe,0xfc,0x03,0x01,0x07,0x00,0x02,0x00,0x00,0x00,0x00,
-0x02,0x30,0x03,0x0e,0x00,0x09,0x00,0x11,0x00,0x5f,0xb8,0x00,0x1e,0x2b,0xba,0x00,
-0x0b,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x0b,0x10,0xba,0x00,0x05,0x00,0x10,0x00,
-0x21,0x2b,0xb8,0x00,0x05,0x10,0xb8,0x00,0x01,0x10,0xb8,0x00,0x07,0xd0,0xb8,0x00,
-0x0b,0x10,0xb8,0x00,0x0e,0xd0,0x00,0xba,0x00,0x10,0x00,0x06,0x00,0x21,0x2b,0xb8,
-0x00,0x10,0x10,0xba,0x00,0x03,0x00,0x11,0x00,0x21,0x2b,0xb8,0x00,0x03,0x10,0xba,
-0x00,0x01,0x00,0x08,0x00,0x21,0x2b,0xb8,0x00,0x01,0x10,0xb8,0x00,0x0b,0xd0,0xb8,
-0x00,0x08,0x10,0xb8,0x00,0x0d,0xd0,0x30,0x31,0x11,0x33,0x11,0x21,0x17,0x11,0x07,
-0x21,0x11,0x23,0x01,0x15,0x33,0x15,0x23,0x15,0x33,0x11,0x46,0x01,0x87,0x63,0x63,
-0xfe,0x79,0x46,0x01,0x0a,0x2c,0x2c,0x62,0x01,0xcc,0x01,0x42,0x83,0xfd,0xf6,0x81,
-0x01,0x4a,0x01,0x41,0xbf,0x82,0xc9,0x02,0x0a,0x00,0x00,0x02,0x00,0x00,0x00,0x00,
-0x01,0xe8,0x04,0x51,0x00,0x0b,0x00,0x17,0x00,0x77,0xb8,0x00,0x1e,0x2b,0xba,0x00,
-0x03,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x03,0x10,0xba,0x00,0x06,0x00,0x08,0x00,
-0x21,0x2b,0xb8,0x00,0x06,0x10,0xb8,0x00,0x08,0x10,0xb8,0x00,0x04,0xd0,0xb8,0x00,
-0x04,0x2f,0xba,0x00,0x0e,0x00,0x01,0x00,0x06,0x11,0x12,0x39,0xba,0x00,0x14,0x00,
-0x01,0x00,0x06,0x11,0x12,0x39,0x00,0xb8,0x00,0x12,0x2f,0xb8,0x00,0x15,0x2f,0xb8,
-0x00,0x01,0x2f,0xb8,0x00,0x04,0x2f,0xba,0x00,0x03,0x00,0x01,0x00,0x12,0x11,0x12,
-0x39,0xba,0x00,0x09,0x00,0x01,0x00,0x12,0x11,0x12,0x39,0xba,0x00,0x0e,0x00,0x01,
-0x00,0x12,0x11,0x12,0x39,0xba,0x00,0x14,0x00,0x01,0x00,0x12,0x11,0x12,0x39,0x30,
-0x31,0x19,0x01,0x33,0x11,0x13,0x33,0x11,0x27,0x23,0x11,0x03,0x23,0x37,0x33,0x37,
-0x15,0x33,0x37,0x35,0x23,0x07,0x35,0x23,0x07,0xc2,0x67,0xbf,0x44,0x7f,0x74,0x7c,
-0x04,0x61,0x62,0x62,0x62,0x62,0x61,0x63,0x61,0x02,0xba,0xfd,0x46,0x01,0x51,0xfe,
-0xaf,0x02,0xae,0x62,0xfe,0xdb,0x01,0x25,0x3a,0x63,0x63,0x85,0x82,0x7f,0x7f,0x7f,
-0x00,0x03,0x00,0x00,0x00,0x00,0x01,0xe8,0x04,0x51,0x00,0x07,0x00,0x0b,0x00,0x11,
-0x00,0x4b,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x08,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,
-0x08,0x10,0xba,0x00,0x05,0x00,0x09,0x00,0x21,0x2b,0xb8,0x00,0x05,0x10,0x00,0xb8,
-0x00,0x0d,0x2f,0xba,0x00,0x01,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x01,0x10,0xba,
-0x00,0x07,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x07,0x10,0xb8,0x00,0x00,0x10,0xb8,
-0x00,0x08,0xd0,0xb8,0x00,0x01,0x10,0xb8,0x00,0x0a,0xd0,0x30,0x31,0x19,0x01,0x17,
-0x21,0x37,0x11,0x27,0x21,0x17,0x33,0x11,0x23,0x13,0x27,0x23,0x15,0x17,0x33,0x61,
-0x01,0x25,0x62,0x62,0xfe,0xdb,0x63,0x61,0x61,0x93,0x63,0x62,0x62,0x63,0x02,0x8b,
-0xfd,0xf6,0x81,0x81,0x02,0x0a,0x83,0x83,0xfd,0xf6,0x03,0x51,0x7f,0x82,0x85,0x00,
-0x00,0x03,0x00,0x00,0x00,0x00,0x01,0xe8,0x04,0x51,0x00,0x07,0x00,0x0b,0x00,0x11,
-0x00,0x4b,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x08,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,
-0x08,0x10,0xba,0x00,0x05,0x00,0x09,0x00,0x21,0x2b,0xb8,0x00,0x05,0x10,0x00,0xb8,
-0x00,0x10,0x2f,0xba,0x00,0x01,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x01,0x10,0xba,
-0x00,0x07,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x07,0x10,0xb8,0x00,0x00,0x10,0xb8,
-0x00,0x08,0xd0,0xb8,0x00,0x01,0x10,0xb8,0x00,0x0a,0xd0,0x30,0x31,0x19,0x01,0x17,
-0x21,0x37,0x11,0x27,0x21,0x17,0x33,0x11,0x23,0x03,0x07,0x33,0x37,0x35,0x23,0x61,
-0x01,0x25,0x62,0x62,0xfe,0xdb,0x63,0x61,0x61,0x27,0x02,0x65,0x62,0x62,0x02,0x8b,
-0xfd,0xf6,0x81,0x81,0x02,0x0a,0x83,0x83,0xfd,0xf6,0x03,0x51,0x88,0x85,0x82,0x00,
-0x00,0x03,0x00,0x00,0x00,0x00,0x01,0xe8,0x04,0x54,0x00,0x07,0x00,0x0b,0x00,0x14,
-0x00,0x85,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x08,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,
-0x08,0x10,0xba,0x00,0x05,0x00,0x09,0x00,0x21,0x2b,0xb8,0x00,0x05,0x10,0xb8,0x00,
-0x08,0x10,0xb8,0x00,0x0e,0xd0,0xb8,0x00,0x0e,0x2f,0xba,0x00,0x0f,0x00,0x00,0x00,
-0x05,0x11,0x12,0x39,0xb8,0x00,0x09,0x10,0xb8,0x00,0x10,0xd0,0xb8,0x00,0x10,0x2f,
-0xb8,0x00,0x09,0x10,0xb8,0x00,0x13,0xd0,0xb8,0x00,0x13,0x2f,0xb8,0x00,0x08,0x10,
-0xb8,0x00,0x14,0xd0,0xb8,0x00,0x14,0x2f,0x00,0xb8,0x00,0x13,0x2f,0xba,0x00,0x01,
-0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x01,0x10,0xba,0x00,0x07,0x00,0x00,0x00,0x21,
-0x2b,0xb8,0x00,0x07,0x10,0xb8,0x00,0x00,0x10,0xb8,0x00,0x08,0xd0,0xb8,0x00,0x01,
-0x10,0xb8,0x00,0x0a,0xd0,0x30,0x31,0x19,0x01,0x17,0x21,0x37,0x11,0x27,0x21,0x17,
-0x33,0x11,0x23,0x03,0x15,0x33,0x37,0x17,0x33,0x35,0x27,0x23,0x61,0x01,0x25,0x62,
-0x62,0xfe,0xdb,0x63,0x61,0x61,0x60,0x62,0x31,0x30,0x63,0x63,0x61,0x02,0x8b,0xfd,
-0xf6,0x81,0x81,0x02,0x0a,0x83,0x83,0xfd,0xf6,0x03,0x50,0x84,0x8b,0x8b,0x84,0x83,
-0x00,0x03,0x00,0x00,0x00,0x00,0x01,0xe8,0x04,0x51,0x00,0x07,0x00,0x0b,0x00,0x17,
-0x00,0x63,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x08,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,
-0x08,0x10,0xba,0x00,0x05,0x00,0x09,0x00,0x21,0x2b,0xb8,0x00,0x05,0x10,0xba,0x00,
-0x0e,0x00,0x00,0x00,0x05,0x11,0x12,0x39,0xba,0x00,0x14,0x00,0x00,0x00,0x05,0x11,
-0x12,0x39,0x00,0xb8,0x00,0x12,0x2f,0xb8,0x00,0x15,0x2f,0xba,0x00,0x01,0x00,0x02,
-0x00,0x21,0x2b,0xb8,0x00,0x01,0x10,0xba,0x00,0x07,0x00,0x00,0x00,0x21,0x2b,0xb8,
-0x00,0x07,0x10,0xb8,0x00,0x00,0x10,0xb8,0x00,0x08,0xd0,0xb8,0x00,0x01,0x10,0xb8,
-0x00,0x0a,0xd0,0x30,0x31,0x19,0x01,0x17,0x21,0x37,0x11,0x27,0x21,0x17,0x33,0x11,
-0x23,0x03,0x33,0x37,0x15,0x33,0x37,0x35,0x23,0x07,0x35,0x23,0x07,0x61,0x01,0x25,
-0x62,0x62,0xfe,0xdb,0x63,0x61,0x61,0x8d,0x61,0x62,0x62,0x62,0x62,0x62,0x62,0x61,
-0x02,0x8b,0xfd,0xf6,0x81,0x81,0x02,0x0a,0x83,0x83,0xfd,0xf6,0x02,0xc9,0x6b,0x6b,
-0x85,0x82,0x7f,0x7f,0x7f,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x01,0xe8,0x04,0x53,
-0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x7b,0xb8,0x00,0x1e,0x2b,0xba,0x00,
-0x08,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x08,0x10,0xba,0x00,0x13,0x00,0x10,0x00,
-0x21,0x2b,0xb8,0x00,0x13,0x10,0xba,0x00,0x09,0x00,0x10,0x00,0x13,0x11,0x12,0x39,
-0xb8,0x00,0x09,0x2f,0xb8,0x00,0x05,0xdc,0xba,0x00,0x0c,0x00,0x00,0x00,0x08,0x11,
-0x12,0x39,0xb8,0x00,0x0c,0x2f,0xb8,0x00,0x0f,0xdc,0xb8,0x00,0x05,0x10,0xb8,0x00,
-0x15,0xdc,0x00,0xb8,0x00,0x0c,0x2f,0xb8,0x00,0x10,0x2f,0xba,0x00,0x01,0x00,0x02,
-0x00,0x21,0x2b,0xb8,0x00,0x01,0x10,0xba,0x00,0x07,0x00,0x00,0x00,0x21,0x2b,0xb8,
-0x00,0x07,0x10,0xb8,0x00,0x00,0x10,0xb8,0x00,0x08,0xd0,0xb8,0x00,0x01,0x10,0xb8,
-0x00,0x0a,0xd0,0x30,0x31,0x19,0x01,0x17,0x21,0x37,0x11,0x27,0x21,0x17,0x33,0x11,
-0x23,0x03,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x61,0x01,0x25,0x62,0x62,0xfe,0xdb,
-0x63,0x61,0x61,0xb0,0xc3,0x40,0xc4,0x02,0x8b,0xfd,0xf6,0x81,0x81,0x02,0x0a,0x83,
-0x83,0xfd,0xf6,0x03,0xd2,0xfe,0xf9,0x01,0x07,0xfe,0xf9,0x01,0x07,0x00,0x00,0x01,
-0x00,0x00,0x00,0x35,0x01,0x89,0x01,0xd5,0x00,0x13,0x00,0x47,0xb8,0x00,0x1e,0x2b,
-0x00,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x10,0x2f,0xba,0x00,0x05,0x00,0x06,0x00,0x21,
-0x2b,0xb8,0x00,0x05,0x10,0xb8,0x00,0x10,0x10,0xb8,0x00,0x0f,0xdc,0xb8,0x00,0x01,
-0xd0,0xb8,0x00,0x01,0x2f,0xb8,0x00,0x06,0x10,0xb8,0x00,0x09,0xd0,0xb8,0x00,0x05,
-0x10,0xb8,0x00,0x0b,0xd0,0xb8,0x00,0x10,0x10,0xb8,0x00,0x13,0xd0,0xb8,0x00,0x13,
-0x2f,0x30,0x31,0x11,0x15,0x33,0x17,0x07,0x23,0x15,0x33,0x37,0x17,0x33,0x35,0x23,
-0x27,0x37,0x33,0x35,0x23,0x07,0x27,0x34,0x23,0x23,0x34,0x8f,0x2d,0x2f,0x9e,0x37,
-0x31,0x2f,0x36,0x9b,0x2a,0x2a,0x01,0xd5,0x6d,0x5d,0x6f,0x67,0x89,0x89,0x67,0x68,
-0x68,0x68,0x8a,0x8b,0x00,0x03,0x00,0x00,0x00,0x00,0x01,0xe8,0x03,0x10,0x00,0x08,
-0x00,0x0b,0x00,0x0e,0x00,0x3b,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x0a,0x00,0x08,0x00,
-0x21,0x2b,0xb8,0x00,0x0a,0x10,0xba,0x00,0x04,0x00,0x0e,0x00,0x21,0x2b,0xb8,0x00,
-0x04,0x10,0x00,0xb8,0x00,0x01,0x2f,0xb8,0x00,0x05,0x2f,0xba,0x00,0x0a,0x00,0x05,
-0x00,0x01,0x11,0x12,0x39,0xba,0x00,0x0c,0x00,0x05,0x00,0x01,0x11,0x12,0x39,0x30,
-0x31,0x13,0x25,0x07,0x17,0x11,0x07,0x21,0x27,0x11,0x33,0x11,0x1b,0x01,0x03,0x33,
-0x61,0x01,0x27,0x02,0x62,0x62,0xfe,0xdb,0x61,0xc4,0x41,0x20,0x41,0x41,0x03,0x0e,
-0x02,0x03,0x82,0xfd,0xf6,0x81,0x81,0x02,0x0a,0xfe,0xfb,0x01,0x05,0xfe,0xfa,0xfe,
-0xfc,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x01,0xe8,0x04,0x51,0x00,0x09,0x00,0x0f,
-0x00,0x33,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x09,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,
-0x09,0x10,0xba,0x00,0x05,0x00,0x06,0x00,0x21,0x2b,0xb8,0x00,0x05,0x10,0x00,0xb8,
-0x00,0x0b,0x2f,0xba,0x00,0x01,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x01,0x10,0xb8,
-0x00,0x07,0xd0,0x30,0x31,0x19,0x01,0x17,0x21,0x37,0x11,0x23,0x11,0x23,0x11,0x37,
-0x27,0x23,0x15,0x17,0x33,0x61,0x01,0x25,0x62,0xc3,0x61,0x93,0x63,0x62,0x62,0x63,
-0x03,0x0e,0xfd,0x73,0x81,0x81,0x02,0x8d,0xfd,0x73,0x02,0x8d,0xc4,0x7f,0x82,0x85,
-0x00,0x02,0x00,0x00,0x00,0x00,0x01,0xe8,0x04,0x51,0x00,0x09,0x00,0x0f,0x00,0x33,
-0xb8,0x00,0x1e,0x2b,0xba,0x00,0x09,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x09,0x10,
-0xba,0x00,0x05,0x00,0x06,0x00,0x21,0x2b,0xb8,0x00,0x05,0x10,0x00,0xb8,0x00,0x0e,
-0x2f,0xba,0x00,0x01,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x01,0x10,0xb8,0x00,0x07,
-0xd0,0x30,0x31,0x19,0x01,0x17,0x21,0x37,0x11,0x23,0x11,0x23,0x11,0x27,0x15,0x33,
-0x37,0x35,0x23,0x61,0x01,0x25,0x62,0xc3,0x61,0x27,0x63,0x62,0x62,0x03,0x0e,0xfd,
-0x73,0x81,0x81,0x02,0x8d,0xfd,0x73,0x02,0x8d,0xc4,0x88,0x85,0x82,0x00,0x00,0x02,
-0x00,0x00,0x00,0x00,0x01,0xe8,0x04,0x54,0x00,0x09,0x00,0x12,0x00,0x6d,0xb8,0x00,
-0x1e,0x2b,0xba,0x00,0x09,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x09,0x10,0xba,0x00,
-0x05,0x00,0x06,0x00,0x21,0x2b,0xb8,0x00,0x05,0x10,0xb8,0x00,0x09,0x10,0xb8,0x00,
-0x0c,0xd0,0xb8,0x00,0x0c,0x2f,0xba,0x00,0x0d,0x00,0x00,0x00,0x05,0x11,0x12,0x39,
-0xb8,0x00,0x06,0x10,0xb8,0x00,0x0e,0xd0,0xb8,0x00,0x0e,0x2f,0xb8,0x00,0x06,0x10,
-0xb8,0x00,0x11,0xd0,0xb8,0x00,0x11,0x2f,0xb8,0x00,0x09,0x10,0xb8,0x00,0x12,0xd0,
-0xb8,0x00,0x12,0x2f,0x00,0xb8,0x00,0x11,0x2f,0xba,0x00,0x01,0x00,0x02,0x00,0x21,
-0x2b,0xb8,0x00,0x01,0x10,0xb8,0x00,0x07,0xd0,0x30,0x31,0x19,0x01,0x17,0x21,0x37,
-0x11,0x23,0x11,0x23,0x11,0x27,0x15,0x33,0x37,0x17,0x33,0x35,0x27,0x23,0x61,0x01,
-0x25,0x62,0xc3,0x61,0x60,0x62,0x31,0x30,0x63,0x63,0x61,0x03,0x0e,0xfd,0x73,0x81,
-0x81,0x02,0x8d,0xfd,0x73,0x02,0x8d,0xc3,0x84,0x8b,0x8b,0x84,0x83,0x00,0x00,0x03,
-0x00,0x00,0x00,0x00,0x01,0xe8,0x04,0x53,0x00,0x09,0x00,0x0d,0x00,0x11,0x00,0x63,
-0xb8,0x00,0x1e,0x2b,0xba,0x00,0x09,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x09,0x10,
-0xba,0x00,0x11,0x00,0x0e,0x00,0x21,0x2b,0xb8,0x00,0x11,0x10,0xba,0x00,0x06,0x00,
-0x0e,0x00,0x11,0x11,0x12,0x39,0xb8,0x00,0x06,0x2f,0xb8,0x00,0x05,0xdc,0xba,0x00,
-0x0a,0x00,0x00,0x00,0x09,0x11,0x12,0x39,0xb8,0x00,0x0a,0x2f,0xb8,0x00,0x0d,0xdc,
-0xb8,0x00,0x05,0x10,0xb8,0x00,0x13,0xdc,0x00,0xb8,0x00,0x0a,0x2f,0xb8,0x00,0x0e,
-0x2f,0xba,0x00,0x01,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x01,0x10,0xb8,0x00,0x07,
-0xd0,0x30,0x31,0x19,0x01,0x17,0x21,0x37,0x11,0x23,0x11,0x23,0x11,0x03,0x11,0x33,
-0x11,0x33,0x11,0x33,0x11,0x61,0x01,0x25,0x62,0xc3,0x61,0xb0,0xc3,0x40,0xc4,0x03,
-0x0e,0xfd,0x73,0x81,0x81,0x02,0x8d,0xfd,0x73,0x02,0x8d,0x01,0x45,0xfe,0xf9,0x01,
-0x07,0xfe,0xf9,0x01,0x07,0x00,0x00,0x02,0x00,0x00,0xfe,0xfb,0x01,0xe8,0x04,0x51,
-0x00,0x0d,0x00,0x13,0x00,0x4f,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x0d,0x00,0x00,0x00,
-0x21,0x2b,0xb8,0x00,0x0d,0x10,0xba,0x00,0x08,0x00,0x04,0x00,0x21,0x2b,0xb8,0x00,
-0x08,0x10,0xb8,0x00,0x0d,0x10,0xb8,0x00,0x05,0xd0,0xb8,0x00,0x04,0x10,0xb8,0x00,
-0x0a,0xd0,0x00,0xb8,0x00,0x12,0x2f,0xba,0x00,0x05,0x00,0x06,0x00,0x21,0x2b,0xb8,
-0x00,0x05,0x10,0xba,0x00,0x01,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x01,0x10,0xb8,
-0x00,0x0b,0xd0,0x30,0x31,0x19,0x01,0x17,0x33,0x15,0x23,0x15,0x33,0x37,0x11,0x23,
-0x11,0x23,0x11,0x27,0x07,0x33,0x37,0x35,0x23,0x61,0xc4,0x61,0xc2,0x62,0xc3,0x61,
-0x27,0x01,0x64,0x62,0x62,0x03,0x0e,0xfd,0x73,0x81,0x84,0x81,0x81,0x03,0x92,0xfd,
-0x73,0x02,0x8d,0xc4,0x88,0x85,0x82,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x01,0xe9,
-0x03,0x10,0x00,0x09,0x00,0x0d,0x00,0x57,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x09,0x00,
-0x00,0x00,0x21,0x2b,0xb8,0x00,0x09,0x10,0xba,0x00,0x06,0x00,0x0b,0x00,0x21,0x2b,
-0xb8,0x00,0x06,0x10,0xb8,0x00,0x09,0x10,0xb8,0x00,0x02,0xd0,0xb8,0x00,0x09,0x10,
-0xb8,0x00,0x0a,0xd0,0x00,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x01,0x2f,0xba,0x00,0x0d,
-0x00,0x03,0x00,0x21,0x2b,0xb8,0x00,0x0d,0x10,0xba,0x00,0x07,0x00,0x06,0x00,0x21,
-0x2b,0xb8,0x00,0x07,0x10,0xb8,0x00,0x06,0x10,0xb8,0x00,0x0a,0xd0,0x30,0x31,0x19,
-0x01,0x33,0x35,0x33,0x37,0x11,0x27,0x23,0x35,0x11,0x33,0x11,0x23,0xc4,0xc4,0x61,
-0x61,0xc4,0x62,0x62,0x03,0x10,0xfc,0xf0,0x82,0x83,0x01,0x06,0x85,0x80,0xfe,0xfb,
-0xfe,0xfa,0x00,0x01,0x00,0x00,0xff,0x64,0x01,0xe8,0x03,0x10,0x00,0x13,0x00,0x49,
-0xb8,0x00,0x1e,0x2b,0xba,0x00,0x01,0x00,0x12,0x00,0x21,0x2b,0xb8,0x00,0x01,0x10,
-0xba,0x00,0x0f,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x0f,0x10,0xb8,0x00,0x02,0x10,
-0xb8,0x00,0x06,0xd0,0xb8,0x00,0x0f,0x10,0xb8,0x00,0x0b,0xd0,0xba,0x00,0x0d,0x00,
-0x02,0x00,0x0f,0x11,0x12,0x39,0x00,0xb8,0x00,0x00,0x2f,0xba,0x00,0x11,0x00,0x01,
-0x00,0x21,0x2b,0xb8,0x00,0x11,0x10,0x30,0x31,0x17,0x13,0x33,0x15,0x27,0x15,0x17,
-0x11,0x23,0x15,0x33,0x37,0x11,0x23,0x37,0x35,0x27,0x21,0x07,0x11,0xc2,0x02,0x61,
-0x22,0x22,0x22,0x83,0x62,0x62,0x62,0x62,0xfe,0xe1,0x67,0x9c,0x03,0x27,0x84,0x02,
-0x81,0x03,0xfe,0xfd,0x82,0x81,0x01,0x04,0x82,0x84,0x85,0xb0,0xfd,0x04,0x00,0x03,
-0x00,0x00,0x00,0x00,0x01,0xe8,0x03,0x53,0x00,0x05,0x00,0x09,0x00,0x0f,0x00,0x4b,
-0xb8,0x00,0x1e,0x2b,0xba,0x00,0x06,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x06,0x10,
-0xba,0x00,0x05,0x00,0x07,0x00,0x21,0x2b,0xb8,0x00,0x05,0x10,0x00,0xb8,0x00,0x0b,
-0x2f,0xba,0x00,0x02,0x00,0x03,0x00,0x21,0x2b,0xb8,0x00,0x02,0x10,0xba,0x00,0x00,
-0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x00,0x10,0xb8,0x00,0x01,0x10,0xb8,0x00,0x06,
-0xd0,0xb8,0x00,0x02,0x10,0xb8,0x00,0x08,0xd0,0x30,0x31,0x13,0x07,0x11,0x17,0x21,
-0x11,0x05,0x33,0x11,0x23,0x13,0x27,0x23,0x15,0x17,0x33,0x61,0x61,0x61,0x01,0x87,
-0xfe,0xdc,0x61,0x61,0x8f,0x63,0x62,0x62,0x63,0x02,0x07,0x82,0xfe,0xfc,0x81,0x02,
-0x07,0x82,0xfe,0xfc,0x02,0x53,0x7f,0x83,0x85,0x00,0x00,0x03,0x00,0x00,0x00,0x00,
-0x01,0xe8,0x03,0x53,0x00,0x05,0x00,0x09,0x00,0x0f,0x00,0x4b,0xb8,0x00,0x1e,0x2b,
-0xba,0x00,0x06,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x06,0x10,0xba,0x00,0x05,0x00,
-0x07,0x00,0x21,0x2b,0xb8,0x00,0x05,0x10,0x00,0xb8,0x00,0x0e,0x2f,0xba,0x00,0x02,
-0x00,0x03,0x00,0x21,0x2b,0xb8,0x00,0x02,0x10,0xba,0x00,0x00,0x00,0x01,0x00,0x21,
-0x2b,0xb8,0x00,0x00,0x10,0xb8,0x00,0x01,0x10,0xb8,0x00,0x06,0xd0,0xb8,0x00,0x02,
-0x10,0xb8,0x00,0x08,0xd0,0x30,0x31,0x13,0x07,0x11,0x17,0x21,0x11,0x05,0x33,0x11,
-0x23,0x03,0x17,0x33,0x37,0x35,0x23,0x61,0x61,0x61,0x01,0x87,0xfe,0xdc,0x61,0x61,
-0x30,0x01,0x63,0x62,0x62,0x02,0x07,0x82,0xfe,0xfc,0x81,0x02,0x07,0x82,0xfe,0xfc,
-0x02,0x53,0x89,0x85,0x83,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x01,0xe8,0x03,0x51,
-0x00,0x05,0x00,0x09,0x00,0x12,0x00,0x85,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x06,0x00,
-0x01,0x00,0x21,0x2b,0xb8,0x00,0x06,0x10,0xba,0x00,0x05,0x00,0x07,0x00,0x21,0x2b,
-0xb8,0x00,0x05,0x10,0xb8,0x00,0x06,0x10,0xb8,0x00,0x0c,0xd0,0xb8,0x00,0x0c,0x2f,
-0xba,0x00,0x0d,0x00,0x01,0x00,0x05,0x11,0x12,0x39,0xb8,0x00,0x07,0x10,0xb8,0x00,
-0x0e,0xd0,0xb8,0x00,0x0e,0x2f,0xb8,0x00,0x07,0x10,0xb8,0x00,0x11,0xd0,0xb8,0x00,
-0x11,0x2f,0xb8,0x00,0x06,0x10,0xb8,0x00,0x12,0xd0,0xb8,0x00,0x12,0x2f,0x00,0xb8,
-0x00,0x11,0x2f,0xba,0x00,0x02,0x00,0x03,0x00,0x21,0x2b,0xb8,0x00,0x02,0x10,0xba,
-0x00,0x00,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x00,0x10,0xb8,0x00,0x01,0x10,0xb8,
-0x00,0x06,0xd0,0xb8,0x00,0x02,0x10,0xb8,0x00,0x08,0xd0,0x30,0x31,0x13,0x07,0x11,
-0x17,0x21,0x11,0x05,0x33,0x11,0x23,0x03,0x15,0x33,0x37,0x17,0x33,0x35,0x27,0x23,
-0x61,0x61,0x61,0x01,0x87,0xfe,0xdc,0x61,0x61,0x60,0x62,0x31,0x30,0x63,0x63,0x61,
-0x02,0x07,0x82,0xfe,0xfc,0x81,0x02,0x07,0x82,0xfe,0xfc,0x02,0x4d,0x84,0x8b,0x8b,
-0x84,0x83,0x00,0x03,0x00,0x00,0x00,0x00,0x01,0xe8,0x03,0x53,0x00,0x05,0x00,0x09,
-0x00,0x15,0x00,0x63,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x06,0x00,0x01,0x00,0x21,0x2b,
-0xb8,0x00,0x06,0x10,0xba,0x00,0x05,0x00,0x07,0x00,0x21,0x2b,0xb8,0x00,0x05,0x10,
-0xba,0x00,0x0c,0x00,0x01,0x00,0x05,0x11,0x12,0x39,0xba,0x00,0x12,0x00,0x01,0x00,
-0x05,0x11,0x12,0x39,0x00,0xb8,0x00,0x10,0x2f,0xb8,0x00,0x13,0x2f,0xba,0x00,0x02,
-0x00,0x03,0x00,0x21,0x2b,0xb8,0x00,0x02,0x10,0xba,0x00,0x00,0x00,0x01,0x00,0x21,
-0x2b,0xb8,0x00,0x00,0x10,0xb8,0x00,0x01,0x10,0xb8,0x00,0x06,0xd0,0xb8,0x00,0x02,
-0x10,0xb8,0x00,0x08,0xd0,0x30,0x31,0x13,0x07,0x11,0x17,0x21,0x11,0x05,0x33,0x11,
-0x23,0x03,0x33,0x37,0x15,0x33,0x37,0x35,0x23,0x07,0x35,0x23,0x07,0x61,0x61,0x61,
-0x01,0x87,0xfe,0xdc,0x61,0x61,0x90,0x61,0x62,0x62,0x62,0x62,0x62,0x62,0x61,0x02,
-0x07,0x82,0xfe,0xfc,0x81,0x02,0x07,0x82,0xfe,0xfc,0x01,0xca,0x6b,0x6b,0x85,0x83,
-0x7f,0x7f,0x7f,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x01,0xe8,0x03,0x50,0x00,0x05,
-0x00,0x09,0x00,0x0d,0x00,0x11,0x00,0x7b,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x06,0x00,
-0x01,0x00,0x21,0x2b,0xb8,0x00,0x06,0x10,0xba,0x00,0x0f,0x00,0x0e,0x00,0x21,0x2b,
-0xb8,0x00,0x0f,0x10,0xba,0x00,0x07,0x00,0x0e,0x00,0x0f,0x11,0x12,0x39,0xb8,0x00,
-0x07,0x2f,0xb8,0x00,0x05,0xdc,0xba,0x00,0x0a,0x00,0x01,0x00,0x06,0x11,0x12,0x39,
-0xb8,0x00,0x0a,0x2f,0xb8,0x00,0x0d,0xdc,0xb8,0x00,0x05,0x10,0xb8,0x00,0x13,0xdc,
-0x00,0xb8,0x00,0x0a,0x2f,0xb8,0x00,0x10,0x2f,0xba,0x00,0x02,0x00,0x03,0x00,0x21,
-0x2b,0xb8,0x00,0x02,0x10,0xba,0x00,0x00,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x00,
-0x10,0xb8,0x00,0x01,0x10,0xb8,0x00,0x06,0xd0,0xb8,0x00,0x02,0x10,0xb8,0x00,0x08,
-0xd0,0x30,0x31,0x13,0x07,0x11,0x17,0x21,0x11,0x05,0x33,0x11,0x23,0x03,0x11,0x33,
-0x11,0x13,0x17,0x11,0x23,0x61,0x61,0x61,0x01,0x87,0xfe,0xdc,0x61,0x61,0xb2,0xc4,
-0x3e,0xc3,0xc3,0x02,0x07,0x82,0xfe,0xfc,0x81,0x02,0x07,0x82,0xfe,0xfc,0x02,0xcf,
-0xfe,0xfc,0x01,0x04,0xfe,0xfc,0x03,0x01,0x07,0x00,0x00,0x03,0x00,0x00,0x00,0x00,
-0x01,0xe8,0x03,0x50,0x00,0x05,0x00,0x09,0x00,0x0d,0x00,0x65,0xb8,0x00,0x1e,0x2b,
-0xba,0x00,0x06,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x06,0x10,0xba,0x00,0x05,0x00,
-0x07,0x00,0x21,0x2b,0xb8,0x00,0x05,0x10,0xba,0x00,0x0a,0x00,0x01,0x00,0x06,0x11,
-0x12,0x39,0xb8,0x00,0x0a,0x2f,0xb8,0x00,0x0b,0xdc,0xb8,0x00,0x05,0x10,0xb8,0x00,
-0x0f,0xdc,0x00,0xb8,0x00,0x0c,0x2f,0xba,0x00,0x02,0x00,0x03,0x00,0x21,0x2b,0xb8,
-0x00,0x02,0x10,0xba,0x00,0x00,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x00,0x10,0xb8,
-0x00,0x01,0x10,0xb8,0x00,0x06,0xd0,0xb8,0x00,0x02,0x10,0xb8,0x00,0x08,0xd0,0x30,
-0x31,0x13,0x07,0x11,0x17,0x21,0x11,0x05,0x33,0x11,0x23,0x03,0x17,0x11,0x23,0x61,
-0x61,0x61,0x01,0x87,0xfe,0xdc,0x61,0x61,0x31,0xc4,0xc4,0x02,0x07,0x82,0xfe,0xfc,
-0x81,0x02,0x07,0x82,0xfe,0xfc,0x01,0xcb,0x03,0x01,0x07,0x00,0x00,0x03,0x00,0x00,
-0x00,0x00,0x03,0x57,0x02,0x06,0x00,0x08,0x00,0x0c,0x00,0x10,0x00,0x63,0xb8,0x00,
-0x1e,0x2b,0xba,0x00,0x0e,0x00,0x06,0x00,0x21,0x2b,0xb8,0x00,0x0e,0x10,0xba,0x00,
-0x01,0x00,0x0c,0x00,0x21,0x2b,0xb8,0x00,0x01,0x10,0xb8,0x00,0x03,0xd0,0xb8,0x00,
-0x03,0x2f,0x00,0xba,0x00,0x0b,0x00,0x04,0x00,0x21,0x2b,0xb8,0x00,0x0b,0x10,0xba,
-0x00,0x08,0x00,0x07,0x00,0x21,0x2b,0xb8,0x00,0x08,0x10,0xb8,0x00,0x0b,0x10,0xb8,
-0x00,0x02,0xd0,0xb8,0x00,0x02,0x2f,0xb8,0x00,0x07,0x10,0xb8,0x00,0x09,0xd0,0xb8,
-0x00,0x07,0x10,0xb8,0x00,0x0d,0xd0,0xb8,0x00,0x0b,0x10,0xb8,0x00,0x0e,0xd0,0x30,
-0x31,0x01,0x17,0x07,0x33,0x15,0x21,0x27,0x11,0x37,0x05,0x11,0x33,0x11,0x21,0x11,
-0x33,0x11,0x03,0x52,0x02,0x67,0x6a,0xfd,0x0a,0x61,0x61,0x01,0xcf,0x62,0xfe,0x32,
-0x61,0x02,0x06,0xf8,0x8c,0x82,0x81,0x01,0x04,0x81,0x81,0xfe,0xfc,0x01,0x04,0xfe,
-0xfc,0x01,0x04,0x00,0x00,0x01,0x00,0x00,0xfe,0xaf,0x01,0xe8,0x02,0x07,0x00,0x12,
-0x00,0x71,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x0d,0x00,0x05,0x00,0x21,0x2b,0xb8,0x00,
-0x0d,0x10,0xba,0x00,0x09,0x00,0x0a,0x00,0x21,0x2b,0xb8,0x00,0x09,0x10,0xb8,0x00,
-0x0a,0x10,0xb8,0x00,0x02,0xd0,0xb8,0x00,0x02,0x2f,0xb8,0x00,0x09,0x10,0xb8,0x00,
-0x0e,0xd0,0xba,0x00,0x10,0x00,0x0a,0x00,0x09,0x11,0x12,0x39,0x00,0xba,0x00,0x01,
-0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x01,0x10,0xba,0x00,0x07,0x00,0x06,0x00,0x21,
-0x2b,0xb8,0x00,0x07,0x10,0xba,0x00,0x0d,0x00,0x03,0x00,0x21,0x2b,0xb8,0x00,0x0d,
-0x10,0xb8,0x00,0x06,0x10,0xb8,0x00,0x0b,0xd0,0xb8,0x00,0x03,0x10,0xb8,0x00,0x0f,
-0xd0,0x30,0x31,0x13,0x35,0x33,0x27,0x23,0x27,0x11,0x37,0x21,0x11,0x23,0x35,0x23,
-0x11,0x21,0x15,0x23,0x17,0x15,0x9b,0x89,0x48,0x7b,0x61,0x61,0x01,0x87,0xc3,0x61,
-0x01,0x24,0x86,0x2e,0xfe,0xaf,0xb0,0xa1,0x81,0x01,0x04,0x82,0xfe,0xfc,0x82,0xfe,
-0xfd,0x82,0x5e,0xf3,0x00,0x03,0x00,0x00,0x00,0x00,0x01,0xeb,0x03,0x53,0x00,0x08,
-0x00,0x0c,0x00,0x12,0x00,0x57,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x09,0x00,0x00,0x00,
-0x21,0x2b,0xb8,0x00,0x09,0x10,0xba,0x00,0x06,0x00,0x0a,0x00,0x21,0x2b,0xb8,0x00,
-0x06,0x10,0xb8,0x00,0x03,0xd0,0xb8,0x00,0x03,0x2f,0x00,0xb8,0x00,0x0e,0x2f,0xba,
-0x00,0x05,0x00,0x03,0x00,0x21,0x2b,0xb8,0x00,0x05,0x10,0xba,0x00,0x08,0x00,0x00,
-0x00,0x21,0x2b,0xb8,0x00,0x08,0x10,0xb8,0x00,0x00,0x10,0xb8,0x00,0x09,0xd0,0xb8,
-0x00,0x05,0x10,0xb8,0x00,0x0b,0xd0,0xb8,0x00,0x0b,0x2f,0x30,0x31,0x19,0x01,0x17,
-0x21,0x35,0x23,0x37,0x35,0x21,0x17,0x33,0x11,0x23,0x13,0x27,0x23,0x15,0x17,0x33,
-0x61,0x01,0x8a,0x6b,0x68,0xfe,0x79,0x63,0x61,0x61,0x8f,0x63,0x62,0x62,0x63,0x01,
-0x85,0xfe,0xfc,0x81,0x82,0x8c,0xfb,0x84,0xfe,0xfc,0x02,0x53,0x7f,0x83,0x85,0x00,
-0x00,0x03,0x00,0x00,0x00,0x00,0x01,0xeb,0x03,0x53,0x00,0x08,0x00,0x0c,0x00,0x12,
-0x00,0x57,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x09,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,
-0x09,0x10,0xba,0x00,0x06,0x00,0x0a,0x00,0x21,0x2b,0xb8,0x00,0x06,0x10,0xb8,0x00,
-0x03,0xd0,0xb8,0x00,0x03,0x2f,0x00,0xb8,0x00,0x11,0x2f,0xba,0x00,0x05,0x00,0x03,
-0x00,0x21,0x2b,0xb8,0x00,0x05,0x10,0xba,0x00,0x08,0x00,0x00,0x00,0x21,0x2b,0xb8,
-0x00,0x08,0x10,0xb8,0x00,0x00,0x10,0xb8,0x00,0x09,0xd0,0xb8,0x00,0x05,0x10,0xb8,
-0x00,0x0b,0xd0,0xb8,0x00,0x0b,0x2f,0x30,0x31,0x19,0x01,0x17,0x21,0x35,0x23,0x37,
-0x35,0x21,0x17,0x33,0x11,0x23,0x03,0x15,0x33,0x37,0x35,0x23,0x61,0x01,0x8a,0x6b,
-0x68,0xfe,0x79,0x63,0x61,0x61,0x30,0x64,0x62,0x62,0x01,0x85,0xfe,0xfc,0x81,0x82,
-0x8c,0xfb,0x84,0xfe,0xfc,0x02,0x53,0x89,0x85,0x83,0x00,0x03,0x00,0x00,0x00,0x00,
-0x01,0xeb,0x03,0x51,0x00,0x08,0x00,0x0c,0x00,0x15,0x00,0x91,0xb8,0x00,0x1e,0x2b,
-0xba,0x00,0x09,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x09,0x10,0xba,0x00,0x06,0x00,
-0x0a,0x00,0x21,0x2b,0xb8,0x00,0x06,0x10,0xb8,0x00,0x03,0xd0,0xb8,0x00,0x03,0x2f,
-0xb8,0x00,0x09,0x10,0xb8,0x00,0x0f,0xd0,0xb8,0x00,0x0f,0x2f,0xba,0x00,0x10,0x00,
-0x00,0x00,0x03,0x11,0x12,0x39,0xb8,0x00,0x0a,0x10,0xb8,0x00,0x11,0xd0,0xb8,0x00,
-0x11,0x2f,0xb8,0x00,0x0a,0x10,0xb8,0x00,0x14,0xd0,0xb8,0x00,0x14,0x2f,0xb8,0x00,
-0x09,0x10,0xb8,0x00,0x15,0xd0,0xb8,0x00,0x15,0x2f,0x00,0xb8,0x00,0x14,0x2f,0xba,
-0x00,0x05,0x00,0x03,0x00,0x21,0x2b,0xb8,0x00,0x05,0x10,0xba,0x00,0x08,0x00,0x00,
-0x00,0x21,0x2b,0xb8,0x00,0x08,0x10,0xb8,0x00,0x00,0x10,0xb8,0x00,0x09,0xd0,0xb8,
-0x00,0x05,0x10,0xb8,0x00,0x0b,0xd0,0xb8,0x00,0x0b,0x2f,0x30,0x31,0x19,0x01,0x17,
-0x21,0x35,0x23,0x37,0x35,0x21,0x17,0x33,0x11,0x23,0x03,0x15,0x33,0x37,0x17,0x33,
-0x35,0x27,0x23,0x61,0x01,0x8a,0x6b,0x68,0xfe,0x79,0x63,0x61,0x61,0x60,0x62,0x31,
-0x30,0x63,0x63,0x61,0x01,0x85,0xfe,0xfc,0x81,0x82,0x8c,0xfb,0x84,0xfe,0xfc,0x02,
-0x4d,0x84,0x8b,0x8b,0x84,0x83,0x00,0x04,0x00,0x00,0x00,0x00,0x01,0xeb,0x03,0x50,
-0x00,0x08,0x00,0x0c,0x00,0x10,0x00,0x14,0x00,0x91,0xb8,0x00,0x1e,0x2b,0xba,0x00,
-0x09,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x09,0x10,0xba,0x00,0x12,0x00,0x11,0x00,
-0x21,0x2b,0xb8,0x00,0x12,0x10,0xba,0x00,0x0a,0x00,0x11,0x00,0x12,0x11,0x12,0x39,
-0xb8,0x00,0x0a,0x2f,0xb8,0x00,0x06,0xdc,0xb8,0x00,0x03,0xd0,0xb8,0x00,0x03,0x2f,
-0xba,0x00,0x05,0x00,0x11,0x00,0x12,0x11,0x12,0x39,0xba,0x00,0x0d,0x00,0x00,0x00,
-0x09,0x11,0x12,0x39,0xb8,0x00,0x0d,0x2f,0xb8,0x00,0x10,0xdc,0xb8,0x00,0x06,0x10,
-0xb8,0x00,0x16,0xdc,0x00,0xb8,0x00,0x0d,0x2f,0xb8,0x00,0x13,0x2f,0xba,0x00,0x05,
-0x00,0x03,0x00,0x21,0x2b,0xb8,0x00,0x05,0x10,0xba,0x00,0x08,0x00,0x00,0x00,0x21,
-0x2b,0xb8,0x00,0x08,0x10,0xb8,0x00,0x00,0x10,0xb8,0x00,0x09,0xd0,0xb8,0x00,0x05,
-0x10,0xb8,0x00,0x0b,0xd0,0xb8,0x00,0x0b,0x2f,0x30,0x31,0x19,0x01,0x17,0x21,0x35,
-0x23,0x37,0x35,0x21,0x17,0x33,0x11,0x23,0x03,0x11,0x33,0x11,0x13,0x17,0x11,0x23,
-0x61,0x01,0x8a,0x6b,0x68,0xfe,0x79,0x63,0x61,0x61,0xb2,0xc4,0x3e,0xc3,0xc3,0x01,
-0x85,0xfe,0xfc,0x81,0x82,0x8c,0xfb,0x84,0xfe,0xfc,0x02,0xcf,0xfe,0xfc,0x01,0x04,
-0xfe,0xfc,0x03,0x01,0x07,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0xc5,0x03,0x53,
-0x00,0x04,0x00,0x0a,0x00,0x2b,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x04,0x00,0x00,0x00,
-0x21,0x2b,0xb8,0x00,0x04,0x10,0xb8,0x00,0x05,0xd0,0xb8,0x00,0x05,0x2f,0xb8,0x00,
-0x00,0x10,0xb8,0x00,0x07,0xd0,0x00,0xb8,0x00,0x06,0x2f,0xb8,0x00,0x02,0x2f,0x30,
-0x31,0x19,0x01,0x17,0x33,0x11,0x37,0x27,0x23,0x15,0x17,0x33,0x61,0x61,0x03,0x64,
-0x61,0x61,0x64,0x02,0x07,0xfe,0x7a,0x81,0x02,0x07,0xcd,0x7f,0x83,0x84,0x00,0x02,
-0x00,0x00,0x00,0x00,0x00,0xc5,0x03,0x53,0x00,0x04,0x00,0x0a,0x00,0x2f,0xb8,0x00,
-0x1e,0x2b,0xba,0x00,0x04,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x04,0x10,0xb8,0x00,
-0x00,0x10,0xb8,0x00,0x05,0xd0,0xb8,0x00,0x04,0x10,0xb8,0x00,0x08,0xd0,0xb8,0x00,
-0x08,0x2f,0x00,0xb8,0x00,0x09,0x2f,0xb8,0x00,0x02,0x2f,0x30,0x31,0x19,0x01,0x17,
-0x33,0x11,0x27,0x15,0x33,0x37,0x35,0x23,0x61,0x61,0xc2,0x63,0x62,0x62,0x02,0x07,
-0xfe,0x7a,0x81,0x02,0x07,0xcd,0x89,0x85,0x83,0x00,0x00,0x02,0x00,0x00,0x00,0x00,
-0x01,0x25,0x03,0x51,0x00,0x04,0x00,0x0d,0x00,0x2f,0xb8,0x00,0x1e,0x2b,0xba,0x00,
-0x04,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x04,0x10,0xba,0x00,0x08,0x00,0x00,0x00,
-0x04,0x11,0x12,0x39,0x00,0xb8,0x00,0x0c,0x2f,0xb8,0x00,0x02,0x2f,0xba,0x00,0x08,
-0x00,0x02,0x00,0x0c,0x11,0x12,0x39,0x30,0x31,0x13,0x11,0x17,0x33,0x11,0x27,0x15,
-0x33,0x37,0x17,0x33,0x35,0x27,0x23,0x2f,0x62,0x5f,0xf0,0x61,0x31,0x32,0x61,0x61,
-0x63,0x02,0x07,0xfe,0x7a,0x81,0x02,0x07,0xc7,0x84,0x8b,0x8b,0x84,0x83,0x00,0x03,
-0x00,0x00,0x00,0x00,0x01,0xc6,0x03,0x50,0x00,0x04,0x00,0x08,0x00,0x0c,0x00,0x45,
-0xb8,0x00,0x1e,0x2b,0xba,0x00,0x0a,0x00,0x0b,0x00,0x21,0x2b,0xb8,0x00,0x0a,0x10,
-0xba,0x00,0x06,0x00,0x05,0x00,0x21,0x2b,0xb8,0x00,0x06,0x10,0xba,0x00,0x00,0x00,
-0x0b,0x00,0x0a,0x11,0x12,0x39,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x04,0xdc,0xb8,0x00,
-0x06,0x10,0xb8,0x00,0x0e,0xdc,0x00,0xb8,0x00,0x07,0x2f,0xb8,0x00,0x0a,0x2f,0xb8,
-0x00,0x02,0x2f,0x30,0x31,0x13,0x11,0x17,0x33,0x11,0x27,0x33,0x11,0x23,0x03,0x11,
-0x23,0x11,0x81,0x62,0x60,0x40,0xc3,0xc3,0x3f,0xc4,0x02,0x07,0xfe,0x7a,0x81,0x02,
-0x07,0x45,0x01,0x04,0xfe,0xfc,0x01,0x04,0xfe,0xfc,0x00,0x02,0xff,0xff,0x00,0x00,
-0x01,0xe8,0x03,0x0e,0x00,0x0b,0x00,0x0f,0x00,0x63,0xb8,0x00,0x1e,0x2b,0xba,0x00,
-0x0e,0x00,0x06,0x00,0x21,0x2b,0xb8,0x00,0x0e,0x10,0xba,0x00,0x02,0x00,0x0a,0x00,
-0x21,0x2b,0xb8,0x00,0x02,0x10,0xb8,0x00,0x0a,0x10,0xb8,0x00,0x0c,0xd0,0x00,0xba,
-0x00,0x03,0x00,0x04,0x00,0x21,0x2b,0xb8,0x00,0x03,0x10,0xba,0x00,0x01,0x00,0x02,
-0x00,0x21,0x2b,0xb8,0x00,0x01,0x10,0xba,0x00,0x08,0x00,0x07,0x00,0x21,0x2b,0xb8,
-0x00,0x08,0x10,0xb8,0x00,0x02,0x10,0xb8,0x00,0x0a,0xd0,0xb8,0x00,0x07,0x10,0xb8,
-0x00,0x0c,0xd0,0xb8,0x00,0x03,0x10,0xb8,0x00,0x0e,0xd0,0x30,0x31,0x13,0x21,0x17,
-0x11,0x07,0x21,0x27,0x11,0x37,0x33,0x35,0x23,0x13,0x23,0x11,0x33,0x61,0x01,0x25,
-0x62,0x62,0xfe,0xdb,0x62,0x62,0xc4,0xc4,0xc4,0x62,0x62,0x03,0x0e,0x83,0xfd,0xf6,
-0x81,0x81,0x01,0x04,0x82,0x84,0xfe,0xfa,0xfe,0xfc,0x00,0x02,0x00,0x00,0x00,0x00,
-0x01,0xe7,0x03,0x53,0x00,0x08,0x00,0x14,0x00,0x63,0xb8,0x00,0x1e,0x2b,0xba,0x00,
-0x03,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x03,0x10,0xba,0x00,0x07,0x00,0x04,0x00,
-0x21,0x2b,0xb8,0x00,0x07,0x10,0xba,0x00,0x0b,0x00,0x00,0x00,0x07,0x11,0x12,0x39,
-0xba,0x00,0x11,0x00,0x00,0x00,0x07,0x11,0x12,0x39,0x00,0xb8,0x00,0x01,0x2f,0xb8,
-0x00,0x05,0x2f,0xb8,0x00,0x0f,0x2f,0xb8,0x00,0x12,0x2f,0xba,0x00,0x08,0x00,0x04,
-0x00,0x21,0x2b,0xb8,0x00,0x08,0x10,0xba,0x00,0x0b,0x00,0x01,0x00,0x0f,0x11,0x12,
-0x39,0xba,0x00,0x11,0x00,0x01,0x00,0x0f,0x11,0x12,0x39,0x30,0x31,0x19,0x01,0x33,
-0x11,0x33,0x11,0x33,0x11,0x27,0x25,0x33,0x37,0x15,0x33,0x37,0x35,0x23,0x07,0x35,
-0x23,0x07,0xc1,0x63,0xc3,0x67,0xfe,0xb4,0x61,0x62,0x62,0x62,0x62,0x62,0x62,0x61,
-0x02,0x07,0xfd,0xf9,0x01,0x74,0xfe,0x8c,0x01,0x88,0x7f,0x44,0x6b,0x6b,0x85,0x83,
-0x7f,0x7f,0x7f,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x01,0xe8,0x03,0x53,0x00,0x07,
-0x00,0x0b,0x00,0x11,0x00,0x4b,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x08,0x00,0x01,0x00,
-0x21,0x2b,0xb8,0x00,0x08,0x10,0xba,0x00,0x06,0x00,0x09,0x00,0x21,0x2b,0xb8,0x00,
-0x06,0x10,0x00,0xb8,0x00,0x0d,0x2f,0xba,0x00,0x02,0x00,0x03,0x00,0x21,0x2b,0xb8,
-0x00,0x02,0x10,0xba,0x00,0x00,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x00,0x10,0xb8,
-0x00,0x01,0x10,0xb8,0x00,0x08,0xd0,0xb8,0x00,0x02,0x10,0xb8,0x00,0x0a,0xd0,0x30,
-0x31,0x13,0x07,0x11,0x17,0x21,0x37,0x11,0x27,0x07,0x33,0x11,0x23,0x13,0x27,0x23,
-0x15,0x17,0x33,0x61,0x61,0x61,0x01,0x25,0x62,0x65,0xbf,0x61,0x61,0x8f,0x63,0x62,
-0x62,0x63,0x02,0x09,0x84,0xfe,0xfc,0x81,0x81,0x01,0x03,0x85,0x84,0xfe,0xfc,0x02,
-0x53,0x7f,0x83,0x85,0x00,0x03,0x00,0x00,0x00,0x00,0x01,0xe8,0x03,0x53,0x00,0x07,
-0x00,0x0b,0x00,0x11,0x00,0x4b,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x08,0x00,0x01,0x00,
-0x21,0x2b,0xb8,0x00,0x08,0x10,0xba,0x00,0x06,0x00,0x09,0x00,0x21,0x2b,0xb8,0x00,
-0x06,0x10,0x00,0xb8,0x00,0x10,0x2f,0xba,0x00,0x02,0x00,0x03,0x00,0x21,0x2b,0xb8,
-0x00,0x02,0x10,0xba,0x00,0x00,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x00,0x10,0xb8,
-0x00,0x01,0x10,0xb8,0x00,0x08,0xd0,0xb8,0x00,0x02,0x10,0xb8,0x00,0x0a,0xd0,0x30,
-0x31,0x13,0x07,0x11,0x17,0x21,0x37,0x11,0x27,0x07,0x33,0x11,0x23,0x03,0x15,0x33,
-0x37,0x35,0x23,0x61,0x61,0x61,0x01,0x25,0x62,0x65,0xbf,0x61,0x61,0x30,0x64,0x62,
-0x62,0x02,0x09,0x84,0xfe,0xfc,0x81,0x81,0x01,0x03,0x85,0x84,0xfe,0xfc,0x02,0x53,
-0x89,0x85,0x83,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x01,0xe8,0x03,0x51,0x00,0x07,
-0x00,0x0b,0x00,0x14,0x00,0x85,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x08,0x00,0x01,0x00,
-0x21,0x2b,0xb8,0x00,0x08,0x10,0xba,0x00,0x06,0x00,0x09,0x00,0x21,0x2b,0xb8,0x00,
-0x06,0x10,0xb8,0x00,0x08,0x10,0xb8,0x00,0x0e,0xd0,0xb8,0x00,0x0e,0x2f,0xba,0x00,
-0x0f,0x00,0x01,0x00,0x06,0x11,0x12,0x39,0xb8,0x00,0x09,0x10,0xb8,0x00,0x10,0xd0,
-0xb8,0x00,0x10,0x2f,0xb8,0x00,0x09,0x10,0xb8,0x00,0x13,0xd0,0xb8,0x00,0x13,0x2f,
-0xb8,0x00,0x08,0x10,0xb8,0x00,0x14,0xd0,0xb8,0x00,0x14,0x2f,0x00,0xb8,0x00,0x13,
-0x2f,0xba,0x00,0x02,0x00,0x03,0x00,0x21,0x2b,0xb8,0x00,0x02,0x10,0xba,0x00,0x00,
-0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x00,0x10,0xb8,0x00,0x01,0x10,0xb8,0x00,0x08,
-0xd0,0xb8,0x00,0x02,0x10,0xb8,0x00,0x0a,0xd0,0x30,0x31,0x13,0x07,0x11,0x17,0x21,
-0x37,0x11,0x27,0x07,0x33,0x11,0x23,0x03,0x15,0x33,0x37,0x17,0x33,0x35,0x27,0x23,
-0x61,0x61,0x61,0x01,0x25,0x62,0x65,0xbf,0x61,0x61,0x60,0x62,0x31,0x30,0x63,0x63,
-0x61,0x02,0x09,0x84,0xfe,0xfc,0x81,0x81,0x01,0x03,0x85,0x84,0xfe,0xfc,0x02,0x4d,
-0x84,0x8b,0x8b,0x84,0x83,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x01,0xe8,0x03,0x53,
-0x00,0x07,0x00,0x0b,0x00,0x17,0x00,0x63,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x08,0x00,
-0x01,0x00,0x21,0x2b,0xb8,0x00,0x08,0x10,0xba,0x00,0x06,0x00,0x09,0x00,0x21,0x2b,
-0xb8,0x00,0x06,0x10,0xba,0x00,0x0e,0x00,0x01,0x00,0x06,0x11,0x12,0x39,0xba,0x00,
-0x14,0x00,0x01,0x00,0x06,0x11,0x12,0x39,0x00,0xb8,0x00,0x12,0x2f,0xb8,0x00,0x15,
-0x2f,0xba,0x00,0x02,0x00,0x03,0x00,0x21,0x2b,0xb8,0x00,0x02,0x10,0xba,0x00,0x00,
-0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x00,0x10,0xb8,0x00,0x01,0x10,0xb8,0x00,0x08,
-0xd0,0xb8,0x00,0x02,0x10,0xb8,0x00,0x0a,0xd0,0x30,0x31,0x13,0x07,0x11,0x17,0x21,
-0x37,0x11,0x27,0x07,0x33,0x11,0x23,0x03,0x33,0x37,0x15,0x33,0x37,0x35,0x23,0x07,
-0x35,0x23,0x07,0x61,0x61,0x61,0x01,0x25,0x62,0x65,0xbf,0x61,0x61,0x90,0x61,0x62,
-0x62,0x62,0x62,0x62,0x62,0x61,0x02,0x09,0x84,0xfe,0xfc,0x81,0x81,0x01,0x03,0x85,
-0x84,0xfe,0xfc,0x01,0xca,0x6b,0x6b,0x85,0x83,0x7f,0x7f,0x7f,0x00,0x04,0x00,0x00,
-0x00,0x00,0x01,0xe8,0x03,0x50,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x7b,
-0xb8,0x00,0x1e,0x2b,0xba,0x00,0x08,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x08,0x10,
-0xba,0x00,0x11,0x00,0x10,0x00,0x21,0x2b,0xb8,0x00,0x11,0x10,0xba,0x00,0x09,0x00,
-0x10,0x00,0x11,0x11,0x12,0x39,0xb8,0x00,0x09,0x2f,0xb8,0x00,0x06,0xdc,0xba,0x00,
-0x0c,0x00,0x01,0x00,0x08,0x11,0x12,0x39,0xb8,0x00,0x0c,0x2f,0xb8,0x00,0x0f,0xdc,
-0xb8,0x00,0x06,0x10,0xb8,0x00,0x15,0xdc,0x00,0xb8,0x00,0x0c,0x2f,0xb8,0x00,0x12,
-0x2f,0xba,0x00,0x02,0x00,0x03,0x00,0x21,0x2b,0xb8,0x00,0x02,0x10,0xba,0x00,0x00,
-0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x00,0x10,0xb8,0x00,0x01,0x10,0xb8,0x00,0x08,
-0xd0,0xb8,0x00,0x02,0x10,0xb8,0x00,0x0a,0xd0,0x30,0x31,0x13,0x07,0x11,0x17,0x21,
-0x37,0x11,0x27,0x07,0x33,0x11,0x23,0x03,0x11,0x33,0x11,0x13,0x37,0x11,0x23,0x61,
-0x61,0x61,0x01,0x25,0x62,0x65,0xbf,0x61,0x61,0xb2,0xc4,0x3e,0xc3,0xc3,0x02,0x09,
-0x84,0xfe,0xfc,0x81,0x81,0x01,0x03,0x85,0x84,0xfe,0xfc,0x02,0xcf,0xfe,0xfc,0x01,
-0x04,0xfe,0xfc,0x03,0x01,0x01,0x00,0x03,0x00,0x00,0x00,0x00,0x01,0x85,0x02,0x68,
-0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x47,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x07,0x00,
-0x04,0x00,0x21,0x2b,0xb8,0x00,0x07,0x10,0xb8,0x00,0x04,0x10,0xb8,0x00,0x08,0xd0,
-0xb8,0x00,0x07,0x10,0xb8,0x00,0x09,0xd0,0x00,0xba,0x00,0x04,0x00,0x05,0x00,0x21,
-0x2b,0xb8,0x00,0x04,0x10,0xba,0x00,0x0b,0x00,0x08,0x00,0x21,0x2b,0xb8,0x00,0x0b,
-0x10,0xba,0x00,0x00,0x00,0x01,0x00,0x21,0x2b,0xb8,0x00,0x00,0x10,0x30,0x31,0x11,
-0x15,0x21,0x35,0x05,0x15,0x33,0x35,0x03,0x33,0x35,0x23,0x01,0x85,0xfe,0xf9,0x89,
-0x89,0x89,0x89,0x01,0x7a,0x83,0x83,0xce,0xac,0xac,0x01,0x10,0xac,0x00,0x00,0x03,
-0x00,0x00,0x00,0x00,0x01,0xe8,0x02,0x09,0x00,0x07,0x00,0x0a,0x00,0x0d,0x00,0x4f,
-0xb8,0x00,0x1e,0x2b,0xba,0x00,0x09,0x00,0x06,0x00,0x21,0x2b,0xb8,0x00,0x09,0x10,
-0xba,0x00,0x02,0x00,0x0b,0x00,0x21,0x2b,0xb8,0x00,0x02,0x10,0x00,0xb8,0x00,0x00,
-0x2f,0xb8,0x00,0x04,0x2f,0xba,0x00,0x09,0x00,0x04,0x00,0x00,0x11,0x12,0x39,0xba,
-0x00,0x0a,0x00,0x04,0x00,0x00,0x11,0x12,0x39,0xba,0x00,0x0b,0x00,0x04,0x00,0x00,
-0x11,0x12,0x39,0xba,0x00,0x0c,0x00,0x04,0x00,0x00,0x11,0x12,0x39,0x30,0x31,0x13,
-0x21,0x17,0x11,0x07,0x21,0x27,0x11,0x33,0x15,0x37,0x17,0x07,0x33,0x61,0x01,0x22,
-0x65,0x62,0xfe,0xdb,0x61,0xc4,0x46,0x1b,0x3f,0x3f,0x02,0x09,0x85,0xfe,0xfd,0x81,
-0x81,0x01,0x04,0xa1,0xa1,0x6e,0x96,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x01,0xe8,
-0x03,0x53,0x00,0x08,0x00,0x0e,0x00,0x33,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x08,0x00,
-0x00,0x00,0x21,0x2b,0xb8,0x00,0x08,0x10,0xba,0x00,0x04,0x00,0x05,0x00,0x21,0x2b,
-0xb8,0x00,0x04,0x10,0x00,0xb8,0x00,0x0a,0x2f,0xba,0x00,0x01,0x00,0x02,0x00,0x21,
-0x2b,0xb8,0x00,0x01,0x10,0xb8,0x00,0x06,0xd0,0x30,0x31,0x19,0x01,0x17,0x21,0x11,
-0x23,0x11,0x23,0x11,0x37,0x27,0x23,0x15,0x17,0x33,0x61,0x01,0x87,0xc3,0x61,0x8f,
-0x63,0x62,0x62,0x63,0x02,0x07,0xfe,0x7a,0x81,0x02,0x07,0xfe,0x7a,0x01,0x86,0xcd,
-0x7f,0x83,0x85,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x01,0xe8,0x03,0x53,0x00,0x08,
-0x00,0x0e,0x00,0x33,0xb8,0x00,0x1e,0x2b,0xba,0x00,0x08,0x00,0x00,0x00,0x21,0x2b,
-0xb8,0x00,0x08,0x10,0xba,0x00,0x04,0x00,0x05,0x00,0x21,0x2b,0xb8,0x00,0x04,0x10,
-0x00,0xb8,0x00,0x0d,0x2f,0xba,0x00,0x01,0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x01,
-0x10,0xb8,0x00,0x06,0xd0,0x30,0x31,0x19,0x01,0x17,0x21,0x11,0x23,0x11,0x23,0x11,
-0x27,0x15,0x33,0x37,0x35,0x23,0x61,0x01,0x87,0xc3,0x61,0x30,0x64,0x62,0x62,0x02,
-0x07,0xfe,0x7a,0x81,0x02,0x07,0xfe,0x7a,0x01,0x86,0xcd,0x89,0x85,0x83,0x00,0x02,
-0x00,0x00,0x00,0x00,0x01,0xe8,0x03,0x51,0x00,0x08,0x00,0x11,0x00,0x6d,0xb8,0x00,
-0x1e,0x2b,0xba,0x00,0x08,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x08,0x10,0xba,0x00,
-0x04,0x00,0x05,0x00,0x21,0x2b,0xb8,0x00,0x04,0x10,0xb8,0x00,0x08,0x10,0xb8,0x00,
-0x0b,0xd0,0xb8,0x00,0x0b,0x2f,0xba,0x00,0x0c,0x00,0x00,0x00,0x04,0x11,0x12,0x39,
-0xb8,0x00,0x05,0x10,0xb8,0x00,0x0d,0xd0,0xb8,0x00,0x0d,0x2f,0xb8,0x00,0x05,0x10,
-0xb8,0x00,0x10,0xd0,0xb8,0x00,0x10,0x2f,0xb8,0x00,0x08,0x10,0xb8,0x00,0x11,0xd0,
-0xb8,0x00,0x11,0x2f,0x00,0xb8,0x00,0x10,0x2f,0xba,0x00,0x01,0x00,0x02,0x00,0x21,
-0x2b,0xb8,0x00,0x01,0x10,0xb8,0x00,0x06,0xd0,0x30,0x31,0x19,0x01,0x17,0x21,0x11,
-0x23,0x11,0x23,0x11,0x27,0x15,0x33,0x37,0x17,0x33,0x35,0x27,0x23,0x61,0x01,0x87,
-0xc3,0x61,0x60,0x62,0x31,0x30,0x63,0x63,0x61,0x02,0x07,0xfe,0x7a,0x81,0x02,0x07,
-0xfe,0x7a,0x01,0x86,0xc7,0x84,0x8b,0x8b,0x84,0x83,0x00,0x03,0x00,0x00,0x00,0x00,
-0x01,0xe8,0x03,0x50,0x00,0x08,0x00,0x0c,0x00,0x10,0x00,0x63,0xb8,0x00,0x1e,0x2b,
-0xba,0x00,0x08,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x08,0x10,0xba,0x00,0x0e,0x00,
-0x0d,0x00,0x21,0x2b,0xb8,0x00,0x0e,0x10,0xba,0x00,0x05,0x00,0x0d,0x00,0x0e,0x11,
-0x12,0x39,0xb8,0x00,0x05,0x2f,0xb8,0x00,0x04,0xdc,0xba,0x00,0x09,0x00,0x00,0x00,
-0x08,0x11,0x12,0x39,0xb8,0x00,0x09,0x2f,0xb8,0x00,0x0c,0xdc,0xb8,0x00,0x04,0x10,
-0xb8,0x00,0x12,0xdc,0x00,0xb8,0x00,0x09,0x2f,0xb8,0x00,0x0f,0x2f,0xba,0x00,0x01,
-0x00,0x02,0x00,0x21,0x2b,0xb8,0x00,0x01,0x10,0xb8,0x00,0x06,0xd0,0x30,0x31,0x19,
-0x01,0x17,0x21,0x11,0x23,0x11,0x23,0x11,0x03,0x11,0x33,0x11,0x13,0x17,0x11,0x23,
-0x61,0x01,0x87,0xc3,0x61,0xb2,0xc4,0x3e,0xc3,0xc3,0x02,0x07,0xfe,0x7a,0x81,0x02,
-0x07,0xfe,0x7a,0x01,0x86,0x01,0x49,0xfe,0xfc,0x01,0x04,0xfe,0xfc,0x03,0x01,0x07,
-0x00,0x02,0x00,0x00,0xfe,0xfd,0x01,0xe8,0x03,0x53,0x00,0x0d,0x00,0x13,0x00,0x47,
-0xb8,0x00,0x1e,0x2b,0xba,0x00,0x03,0x00,0x04,0x00,0x21,0x2b,0xb8,0x00,0x03,0x10,
-0xba,0x00,0x0d,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x0d,0x10,0xb8,0x00,0x00,0x10,
-0xb8,0x00,0x07,0xd0,0xb8,0x00,0x07,0x2f,0x00,0xb8,0x00,0x12,0x2f,0xba,0x00,0x09,
-0x00,0x0a,0x00,0x21,0x2b,0xb8,0x00,0x09,0x10,0xba,0x00,0x02,0x00,0x07,0x00,0x21,
-0x2b,0xb8,0x00,0x02,0x10,0x30,0x31,0x01,0x11,0x23,0x11,0x23,0x11,0x17,0x33,0x15,
-0x23,0x15,0x21,0x37,0x11,0x25,0x15,0x33,0x37,0x35,0x23,0x01,0x24,0x62,0xc2,0x5e,
-0xc2,0xbf,0x01,0x25,0x62,0xfe,0xac,0x64,0x62,0x62,0x02,0x09,0xfe,0x79,0x01,0x87,
-0xfe,0x78,0x81,0x76,0x8d,0x7f,0x02,0x8d,0xcb,0x89,0x85,0x83,0x00,0x02,0x00,0x00,
-0xfe,0xfb,0x01,0xe9,0x02,0x06,0x00,0x09,0x00,0x0d,0x00,0x4f,0xb8,0x00,0x1e,0x2b,
-0xba,0x00,0x09,0x00,0x00,0x00,0x21,0x2b,0xb8,0x00,0x09,0x10,0xba,0x00,0x06,0x00,
-0x0b,0x00,0x21,0x2b,0xb8,0x00,0x06,0x10,0xb8,0x00,0x09,0x10,0xb8,0x00,0x02,0xd0,
-0xb8,0x00,0x09,0x10,0xb8,0x00,0x0a,0xd0,0x00,0xb8,0x00,0x01,0x2f,0xb8,0x00,0x00,
-0x2f,0xba,0x00,0x0d,0x00,0x03,0x00,0x21,0x2b,0xb8,0x00,0x0d,0x10,0xba,0x00,0x08,
-0x00,0x0a,0x00,0x21,0x2b,0xb8,0x00,0x08,0x10,0x30,0x31,0x19,0x01,0x33,0x35,0x33,
-0x37,0x11,0x27,0x23,0x35,0x11,0x33,0x11,0x23,0xc4,0xc7,0x5e,0x65,0xc0,0x62,0x62,
-0x02,0x06,0xfc,0xf5,0x84,0x81,0x01,0x14,0x72,0x80,0xfe,0xff,0xfe,0xfb,0x00,0x03,
-0x00,0x00,0xfe,0xfd,0x01,0xe8,0x03,0x50,0x00,0x0d,0x00,0x11,0x00,0x15,0x00,0x77,
-0xb8,0x00,0x1e,0x2b,0xba,0x00,0x03,0x00,0x04,0x00,0x21,0x2b,0xb8,0x00,0x03,0x10,
-0xba,0x00,0x13,0x00,0x12,0x00,0x21,0x2b,0xb8,0x00,0x13,0x10,0xba,0x00,0x00,0x00,
-0x12,0x00,0x13,0x11,0x12,0x39,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x07,0xd0,0xb8,0x00,
-0x07,0x2f,0xb8,0x00,0x00,0x10,0xb8,0x00,0x0d,0xdc,0xba,0x00,0x0e,0x00,0x04,0x00,
-0x03,0x11,0x12,0x39,0xb8,0x00,0x0e,0x2f,0xb8,0x00,0x11,0xdc,0xb8,0x00,0x0d,0x10,
-0xb8,0x00,0x17,0xdc,0x00,0xb8,0x00,0x0e,0x2f,0xb8,0x00,0x14,0x2f,0xba,0x00,0x09,
-0x00,0x0a,0x00,0x21,0x2b,0xb8,0x00,0x09,0x10,0xba,0x00,0x02,0x00,0x07,0x00,0x21,
-0x2b,0xb8,0x00,0x02,0x10,0x30,0x31,0x01,0x11,0x23,0x11,0x23,0x11,0x17,0x33,0x15,
-0x23,0x15,0x21,0x37,0x11,0x01,0x11,0x33,0x11,0x13,0x17,0x11,0x23,0x01,0x24,0x62,
-0xc2,0x5e,0xc2,0xbf,0x01,0x25,0x62,0xfe,0x2a,0xc4,0x3e,0xc3,0xc3,0x02,0x09,0xfe,
-0x79,0x01,0x87,0xfe,0x78,0x81,0x76,0x8d,0x7f,0x02,0x8d,0x01,0x47,0xfe,0xfc,0x01,
-0x04,0xfe,0xfc,0x03,0x01,0x07,0x00,0x01,0x00,0x85,0x01,0x08,0x02,0x14,0x01,0x8d,
-0x00,0x03,0x00,0x0f,0xb8,0x00,0x0a,0x2b,0x00,0xba,0x00,0x00,0x00,0x01,0x00,0x0d,
-0x2b,0x30,0x31,0x13,0x15,0x21,0x35,0x85,0x01,0x8f,0x01,0x8d,0x85,0x85,0x00,0x00,
-0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0xe4,0x09,0x0a,0x05,0x00,0x09,0x03,0x02,0x05,
-0x05,0x05,0x06,0x05,0x02,0x03,0x04,0x03,0x03,0x02,0x03,0x02,0x03,0x05,0x04,0x05,
-0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x02,0x02,0x04,0x03,0x04,0x05,0x05,0x05,0x05,
-0x05,0x05,0x05,0x05,0x05,0x05,0x04,0x04,0x05,0x05,0x06,0x05,0x05,0x05,0x05,0x05,
-0x05,0x04,0x05,0x05,0x06,0x05,0x05,0x05,0x03,0x03,0x04,0x03,0x05,0x03,0x05,0x05,
-0x05,0x05,0x05,0x05,0x05,0x05,0x02,0x02,0x05,0x03,0x08,0x05,0x05,0x05,0x05,0x05,
-0x05,0x04,0x05,0x05,0x08,0x05,0x05,0x05,0x04,0x01,0x04,0x04,0x05,0x02,0x05,0x05,
-0x07,0x04,0x04,0x03,0x09,0x05,0x02,0x08,0x05,0x02,0x02,0x05,0x05,0x05,0x03,0x04,
-0x04,0x06,0x05,0x02,0x09,0x05,0x05,0x03,0x02,0x05,0x05,0x05,0x06,0x02,0x05,0x04,
-0x05,0x03,0x04,0x04,0x02,0x0a,0x05,0x03,0x03,0x03,0x03,0x03,0x05,0x05,0x02,0x02,
-0x02,0x03,0x04,0x06,0x06,0x06,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x05,0x05,
-0x05,0x05,0x05,0x04,0x04,0x04,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x04,0x05,
-0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x08,0x05,0x05,
-0x05,0x05,0x05,0x02,0x02,0x03,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x04,0x05,
-0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x06,0x09,0x00,0x00,0x00,0x0a,0x0b,0x05,0x00,
-0x0a,0x03,0x03,0x05,0x05,0x05,0x07,0x05,0x03,0x03,0x04,0x03,0x03,0x03,0x03,0x03,
-0x03,0x05,0x04,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x03,0x03,0x04,0x03,0x05,
-0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x04,0x04,0x05,0x05,0x07,0x05,
-0x05,0x05,0x05,0x05,0x05,0x04,0x05,0x05,0x07,0x05,0x05,0x05,0x03,0x03,0x04,0x03,
-0x05,0x03,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x03,0x03,0x05,0x03,0x08,0x05,
-0x05,0x05,0x05,0x05,0x05,0x04,0x05,0x05,0x08,0x05,0x05,0x05,0x04,0x02,0x04,0x04,
-0x05,0x03,0x05,0x05,0x08,0x04,0x04,0x03,0x0a,0x05,0x03,0x09,0x05,0x03,0x03,0x05,
-0x05,0x05,0x03,0x04,0x04,0x06,0x05,0x03,0x09,0x05,0x06,0x03,0x03,0x05,0x06,0x06,
-0x06,0x03,0x06,0x05,0x05,0x03,0x05,0x04,0x03,0x0b,0x05,0x03,0x03,0x03,0x03,0x03,
-0x05,0x05,0x03,0x02,0x02,0x03,0x05,0x06,0x07,0x07,0x05,0x05,0x05,0x05,0x05,0x06,
-0x06,0x08,0x05,0x05,0x05,0x05,0x06,0x04,0x04,0x04,0x05,0x06,0x05,0x05,0x05,0x05,
-0x05,0x06,0x04,0x05,0x05,0x05,0x05,0x06,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x06,
-0x06,0x09,0x05,0x05,0x05,0x05,0x06,0x03,0x03,0x03,0x05,0x05,0x05,0x05,0x05,0x05,
-0x05,0x06,0x04,0x05,0x05,0x05,0x05,0x06,0x05,0x05,0x06,0x06,0x0a,0x00,0x00,0x00,
-0x0b,0x0c,0x06,0x00,0x0b,0x03,0x03,0x06,0x06,0x06,0x07,0x06,0x03,0x04,0x04,0x04,
-0x04,0x03,0x04,0x03,0x04,0x06,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x03,
-0x03,0x05,0x04,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x04,
-0x06,0x06,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x06,0x06,0x08,0x06,0x06,0x06,
-0x04,0x04,0x04,0x04,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x03,0x03,
-0x06,0x04,0x09,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x06,0x06,0x09,0x06,0x06,0x06,
-0x05,0x02,0x05,0x05,0x06,0x03,0x06,0x06,0x08,0x05,0x05,0x04,0x0a,0x06,0x03,0x0a,
-0x06,0x03,0x03,0x06,0x06,0x06,0x04,0x05,0x05,0x07,0x06,0x03,0x0a,0x06,0x06,0x03,
-0x03,0x06,0x07,0x06,0x07,0x03,0x06,0x05,0x06,0x03,0x05,0x04,0x03,0x0c,0x06,0x03,
-0x04,0x03,0x03,0x04,0x06,0x06,0x03,0x02,0x03,0x03,0x05,0x07,0x07,0x07,0x06,0x06,
-0x06,0x06,0x06,0x06,0x06,0x09,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x05,0x05,0x07,
-0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,
-0x06,0x06,0x06,0x06,0x06,0x09,0x06,0x06,0x06,0x06,0x06,0x03,0x03,0x04,0x06,0x06,
-0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x07,
-0x0b,0x00,0x00,0x00,0x0c,0x0d,0x06,0x00,0x0c,0x04,0x03,0x06,0x06,0x06,0x08,0x06,
-0x03,0x04,0x04,0x04,0x04,0x03,0x04,0x03,0x04,0x06,0x05,0x06,0x06,0x06,0x06,0x06,
-0x06,0x06,0x06,0x03,0x03,0x05,0x04,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,
-0x06,0x06,0x05,0x04,0x06,0x06,0x09,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x06,0x06,
-0x09,0x06,0x06,0x06,0x04,0x04,0x04,0x04,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x06,
-0x06,0x06,0x03,0x03,0x06,0x04,0x0a,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x06,0x06,
-0x0a,0x06,0x06,0x06,0x05,0x02,0x05,0x05,0x06,0x03,0x06,0x06,0x09,0x05,0x05,0x04,
-0x0b,0x06,0x03,0x0b,0x06,0x03,0x03,0x06,0x06,0x06,0x04,0x05,0x05,0x07,0x06,0x03,
-0x0b,0x06,0x06,0x04,0x03,0x06,0x07,0x06,0x08,0x03,0x06,0x06,0x06,0x03,0x06,0x04,
-0x03,0x0d,0x06,0x03,0x04,0x03,0x03,0x04,0x06,0x06,0x03,0x02,0x03,0x03,0x06,0x07,
-0x08,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0a,0x06,0x06,0x06,0x06,0x06,0x05,
-0x05,0x05,0x05,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x06,0x06,0x06,0x06,0x06,
-0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0a,0x06,0x06,0x06,0x06,0x06,0x03,
-0x03,0x04,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x06,0x06,0x06,0x06,0x06,
-0x06,0x06,0x06,0x08,0x0c,0x00,0x00,0x00,0x0d,0x0e,0x07,0x00,0x0d,0x04,0x03,0x07,
-0x07,0x07,0x08,0x07,0x03,0x04,0x04,0x04,0x04,0x03,0x04,0x03,0x04,0x07,0x06,0x07,
-0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x03,0x06,0x04,0x06,0x07,0x07,0x07,0x07,
-0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x04,0x07,0x07,0x09,0x07,0x07,0x07,0x07,0x07,
-0x07,0x06,0x07,0x07,0x09,0x07,0x07,0x07,0x04,0x04,0x04,0x04,0x07,0x04,0x07,0x07,
-0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x03,0x07,0x04,0x0a,0x07,0x07,0x07,0x07,0x07,
-0x07,0x06,0x07,0x07,0x0a,0x07,0x07,0x07,0x06,0x02,0x06,0x06,0x07,0x03,0x07,0x07,
-0x0a,0x06,0x06,0x04,0x0c,0x07,0x03,0x0c,0x07,0x03,0x03,0x07,0x07,0x07,0x04,0x06,
-0x06,0x08,0x07,0x03,0x0b,0x07,0x07,0x04,0x03,0x07,0x08,0x07,0x08,0x03,0x07,0x06,
-0x07,0x04,0x06,0x04,0x03,0x0e,0x07,0x04,0x04,0x04,0x04,0x04,0x07,0x07,0x03,0x03,
-0x03,0x04,0x06,0x08,0x08,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x07,0x07,
-0x07,0x07,0x07,0x06,0x06,0x06,0x05,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x07,
-0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0b,0x07,0x07,
-0x07,0x07,0x07,0x03,0x03,0x04,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x07,
-0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x0d,0x00,0x00,0x00,0x0f,0x11,0x08,0x00,
-0x0f,0x05,0x04,0x08,0x08,0x08,0x09,0x08,0x04,0x05,0x05,0x05,0x05,0x04,0x05,0x04,
-0x05,0x08,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x04,0x04,0x07,0x05,0x07,
-0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x05,0x08,0x08,0x0b,0x08,
-0x08,0x08,0x08,0x08,0x08,0x07,0x08,0x08,0x0b,0x08,0x08,0x08,0x05,0x05,0x05,0x05,
-0x08,0x05,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x04,0x04,0x08,0x05,0x0c,0x08,
-0x08,0x08,0x08,0x08,0x08,0x07,0x08,0x08,0x0c,0x08,0x08,0x08,0x07,0x02,0x07,0x07,
-0x08,0x04,0x08,0x08,0x0b,0x07,0x07,0x05,0x0e,0x08,0x04,0x0d,0x08,0x04,0x04,0x08,
-0x08,0x08,0x05,0x06,0x07,0x09,0x08,0x04,0x0d,0x08,0x08,0x05,0x04,0x08,0x09,0x08,
-0x09,0x04,0x08,0x07,0x08,0x04,0x07,0x05,0x04,0x11,0x08,0x04,0x05,0x04,0x04,0x05,
-0x08,0x08,0x04,0x03,0x04,0x04,0x07,0x0a,0x09,0x0a,0x08,0x08,0x08,0x08,0x08,0x08,
-0x08,0x0c,0x08,0x08,0x08,0x08,0x08,0x07,0x07,0x07,0x07,0x09,0x08,0x08,0x08,0x08,
-0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,
-0x08,0x0d,0x08,0x08,0x08,0x08,0x08,0x04,0x04,0x05,0x08,0x08,0x08,0x08,0x08,0x08,
-0x08,0x08,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0a,0x0f,0x00,0x00,0x00,
-0x10,0x12,0x08,0x00,0x10,0x05,0x04,0x08,0x08,0x08,0x0a,0x08,0x04,0x05,0x05,0x05,
-0x05,0x04,0x05,0x04,0x05,0x08,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x04,
-0x04,0x07,0x05,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x05,
-0x08,0x08,0x0b,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x08,0x08,0x0b,0x08,0x08,0x08,
-0x05,0x05,0x05,0x05,0x09,0x05,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x04,0x04,
-0x08,0x05,0x0d,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x08,0x08,0x0d,0x08,0x08,0x08,
-0x07,0x03,0x07,0x07,0x08,0x04,0x08,0x08,0x0c,0x07,0x07,0x05,0x0e,0x08,0x04,0x0e,
-0x08,0x04,0x04,0x08,0x08,0x08,0x05,0x07,0x07,0x09,0x08,0x04,0x0e,0x08,0x08,0x05,
-0x04,0x08,0x0a,0x08,0x0a,0x04,0x08,0x08,0x08,0x05,0x08,0x06,0x04,0x12,0x09,0x05,
-0x05,0x05,0x05,0x05,0x08,0x08,0x04,0x03,0x04,0x05,0x08,0x0a,0x0a,0x0b,0x08,0x08,
-0x08,0x08,0x08,0x08,0x08,0x0d,0x08,0x08,0x08,0x08,0x08,0x07,0x07,0x07,0x07,0x09,
-0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,
-0x08,0x08,0x08,0x08,0x08,0x0e,0x08,0x08,0x08,0x08,0x08,0x04,0x04,0x05,0x08,0x08,
-0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0a,
-0x10,0x00,0x00,0x00,0x11,0x12,0x09,0x00,0x11,0x05,0x04,0x09,0x09,0x09,0x0b,0x09,
-0x04,0x06,0x06,0x06,0x06,0x04,0x06,0x04,0x06,0x09,0x07,0x09,0x09,0x09,0x09,0x09,
-0x09,0x09,0x09,0x04,0x04,0x07,0x06,0x07,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,
-0x09,0x09,0x07,0x06,0x09,0x09,0x0c,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,
-0x0c,0x09,0x09,0x09,0x06,0x06,0x06,0x06,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x09,
-0x09,0x09,0x04,0x04,0x09,0x06,0x0d,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,
-0x0d,0x09,0x09,0x09,0x07,0x03,0x07,0x07,0x09,0x04,0x09,0x09,0x0c,0x07,0x07,0x06,
-0x10,0x09,0x04,0x0f,0x09,0x04,0x04,0x09,0x09,0x09,0x06,0x07,0x07,0x0a,0x09,0x04,
-0x0f,0x09,0x09,0x05,0x04,0x09,0x0a,0x09,0x0b,0x04,0x09,0x08,0x09,0x05,0x08,0x06,
-0x05,0x12,0x09,0x05,0x06,0x05,0x05,0x06,0x09,0x09,0x04,0x03,0x04,0x05,0x08,0x0b,
-0x0b,0x0c,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0e,0x09,0x09,0x09,0x09,0x09,0x07,
-0x07,0x07,0x08,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,
-0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x09,0x0f,0x09,0x09,0x09,0x09,0x08,0x04,
-0x04,0x06,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x07,0x09,0x09,0x09,0x09,0x08,
-0x09,0x09,0x08,0x0b,0x11,0x00,0x00,0x00,0x13,0x15,0x0a,0x00,0x13,0x06,0x05,0x0a,
-0x0a,0x0a,0x0c,0x0a,0x05,0x07,0x06,0x07,0x07,0x05,0x07,0x05,0x06,0x0a,0x08,0x0a,
-0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x05,0x05,0x08,0x07,0x08,0x0a,0x0a,0x0a,0x0a,
-0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x08,0x06,0x0a,0x0a,0x0e,0x0a,0x0a,0x0a,0x0a,0x0a,
-0x0a,0x08,0x0a,0x0a,0x0e,0x0a,0x0a,0x0a,0x07,0x07,0x06,0x07,0x0a,0x07,0x0a,0x0a,
-0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x05,0x05,0x0a,0x07,0x0f,0x0a,0x0a,0x0a,0x0a,0x0a,
-0x0a,0x08,0x0a,0x0a,0x0f,0x0a,0x0a,0x0a,0x08,0x03,0x08,0x08,0x0a,0x05,0x0a,0x0a,
-0x0f,0x08,0x08,0x06,0x11,0x0a,0x05,0x11,0x0a,0x05,0x05,0x0a,0x0a,0x0a,0x07,0x08,
-0x08,0x0b,0x0a,0x05,0x10,0x0a,0x0a,0x06,0x05,0x0a,0x0b,0x0a,0x0c,0x05,0x0a,0x09,
-0x0a,0x05,0x09,0x06,0x05,0x15,0x0a,0x05,0x07,0x05,0x05,0x07,0x0a,0x0a,0x05,0x04,
-0x05,0x05,0x09,0x0c,0x0c,0x0d,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0f,0x0a,0x0a,
-0x0a,0x0a,0x0a,0x08,0x08,0x08,0x09,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x08,0x0a,
-0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x10,0x0a,0x0a,
-0x0a,0x0a,0x0a,0x05,0x05,0x07,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x08,0x0a,
-0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0c,0x13,0x00,0x00,0x00,0x15,0x17,0x0b,0x00,
-0x15,0x06,0x05,0x0b,0x0b,0x0b,0x0d,0x0b,0x05,0x07,0x07,0x07,0x07,0x05,0x07,0x05,
-0x07,0x0b,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x05,0x05,0x09,0x07,0x09,
-0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x09,0x07,0x0b,0x0b,0x0f,0x0b,
-0x0b,0x0b,0x0b,0x0b,0x0b,0x09,0x0b,0x0b,0x0f,0x0b,0x0b,0x0b,0x07,0x07,0x07,0x07,
-0x0b,0x07,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x05,0x05,0x0b,0x07,0x11,0x0b,
-0x0b,0x0b,0x0b,0x0b,0x0b,0x09,0x0b,0x0b,0x11,0x0b,0x0b,0x0b,0x09,0x03,0x09,0x09,
-0x0b,0x05,0x0b,0x0b,0x10,0x09,0x09,0x07,0x13,0x0b,0x05,0x13,0x0b,0x05,0x05,0x0b,
-0x0b,0x0b,0x07,0x09,0x09,0x0c,0x0b,0x05,0x13,0x0b,0x0b,0x06,0x05,0x0b,0x0d,0x0b,
-0x0d,0x05,0x0b,0x0a,0x0b,0x06,0x0a,0x07,0x06,0x17,0x0b,0x06,0x07,0x06,0x06,0x07,
-0x0b,0x0b,0x05,0x04,0x05,0x06,0x0a,0x0d,0x0d,0x0e,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,
-0x0b,0x11,0x0b,0x0b,0x0b,0x0b,0x0b,0x09,0x09,0x09,0x0a,0x0c,0x0b,0x0b,0x0b,0x0b,
-0x0b,0x0a,0x09,0x0b,0x0b,0x0b,0x0b,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,
-0x0b,0x12,0x0b,0x0b,0x0b,0x0b,0x0a,0x05,0x05,0x07,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,
-0x0b,0x0a,0x09,0x0b,0x0b,0x0b,0x0b,0x0a,0x0b,0x0b,0x0a,0x0e,0x15,0x00,0x00,0x00,
-0x18,0x1a,0x0c,0x00,0x18,0x07,0x06,0x0d,0x0d,0x0d,0x0f,0x0d,0x06,0x08,0x08,0x08,
-0x08,0x06,0x08,0x06,0x08,0x0d,0x0a,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x06,
-0x06,0x0a,0x08,0x0b,0x0d,0x0c,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0a,0x08,
-0x0d,0x0d,0x11,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0a,0x0d,0x0d,0x11,0x0d,0x0d,0x0d,
-0x08,0x08,0x08,0x08,0x0d,0x08,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x06,0x06,
-0x0d,0x08,0x13,0x0d,0x0d,0x0d,0x0d,0x0d,0x0c,0x0a,0x0d,0x0d,0x13,0x0d,0x0d,0x0d,
-0x0a,0x04,0x0a,0x0a,0x0d,0x06,0x0d,0x0d,0x12,0x0a,0x0a,0x08,0x15,0x0d,0x06,0x15,
-0x0d,0x06,0x06,0x0d,0x0d,0x0d,0x08,0x0a,0x0a,0x0e,0x0c,0x06,0x15,0x0d,0x0d,0x07,
-0x06,0x0d,0x0e,0x0d,0x0f,0x06,0x0d,0x0c,0x0d,0x07,0x0c,0x08,0x06,0x1a,0x0d,0x07,
-0x08,0x07,0x07,0x08,0x0d,0x0d,0x06,0x05,0x06,0x07,0x0c,0x0e,0x10,0x0f,0x0d,0x0d,
-0x0d,0x0d,0x0d,0x0c,0x0d,0x13,0x0d,0x0d,0x0d,0x0d,0x0c,0x0a,0x0a,0x0a,0x0a,0x0e,
-0x0d,0x0d,0x0d,0x0d,0x0d,0x0c,0x0a,0x0d,0x0d,0x0d,0x0d,0x0c,0x0d,0x0d,0x0d,0x0d,
-0x0d,0x0d,0x0d,0x0c,0x0d,0x15,0x0d,0x0d,0x0d,0x0d,0x0c,0x06,0x06,0x08,0x0c,0x0d,
-0x0d,0x0d,0x0d,0x0d,0x0d,0x0c,0x0a,0x0d,0x0d,0x0d,0x0d,0x0c,0x0d,0x0d,0x0c,0x0f,
-0x18,0x00,0x00,0x00,0x1b,0x1d,0x0e,0x00,0x1b,0x08,0x07,0x0e,0x0e,0x0e,0x11,0x0e,
-0x07,0x09,0x09,0x09,0x09,0x07,0x09,0x07,0x09,0x0e,0x0c,0x0e,0x0e,0x0e,0x0e,0x0e,
-0x0e,0x0e,0x0e,0x07,0x07,0x0c,0x09,0x0c,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,
-0x0e,0x0e,0x0c,0x09,0x0e,0x0e,0x13,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x0e,0x0e,
-0x13,0x0e,0x0e,0x0e,0x09,0x09,0x09,0x09,0x0e,0x09,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,
-0x0e,0x0e,0x07,0x07,0x0e,0x09,0x16,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x0e,0x0e,
-0x16,0x0e,0x0e,0x0e,0x0c,0x04,0x0c,0x0c,0x0e,0x07,0x0e,0x0e,0x14,0x0c,0x0c,0x09,
-0x19,0x0e,0x07,0x18,0x0e,0x07,0x07,0x0e,0x0e,0x0e,0x09,0x0c,0x0c,0x10,0x0e,0x07,
-0x18,0x0e,0x0e,0x08,0x07,0x0e,0x10,0x0e,0x11,0x07,0x0e,0x0d,0x0e,0x08,0x0d,0x0a,
-0x07,0x1d,0x0e,0x08,0x09,0x08,0x08,0x09,0x0e,0x0e,0x07,0x05,0x06,0x08,0x0d,0x11,
-0x11,0x12,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x16,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,
-0x0c,0x0c,0x0b,0x10,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0b,0x0e,0x0e,0x0e,0x0e,0x0e,
-0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x17,0x0e,0x0e,0x0e,0x0e,0x0e,0x07,
-0x07,0x09,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x0e,0x0e,0x0e,0x0e,0x0e,
-0x0e,0x0e,0x0e,0x11,0x1b,0x00,0x00,0x00,0x1d,0x1f,0x0f,0x00,0x1d,0x09,0x07,0x0f,
-0x0f,0x0f,0x13,0x0f,0x07,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x07,0x0a,0x0f,0x0d,0x0f,
-0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x07,0x07,0x0d,0x0a,0x0d,0x0f,0x0f,0x0f,0x0f,
-0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0d,0x0a,0x0f,0x0f,0x15,0x0f,0x0f,0x0f,0x0f,0x0f,
-0x0f,0x0d,0x0f,0x0f,0x15,0x0f,0x0f,0x0f,0x0a,0x0a,0x0a,0x0a,0x0f,0x0a,0x0f,0x0f,
-0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x07,0x07,0x0f,0x0a,0x17,0x0f,0x0f,0x0f,0x0f,0x0f,
-0x0f,0x0d,0x0f,0x0f,0x17,0x0f,0x0f,0x0f,0x0d,0x05,0x0d,0x0d,0x0f,0x07,0x0f,0x0f,
-0x15,0x0d,0x0d,0x0a,0x1b,0x0f,0x07,0x1a,0x0f,0x07,0x07,0x0f,0x0f,0x0f,0x0a,0x0c,
-0x0d,0x11,0x0f,0x07,0x1a,0x0f,0x0f,0x09,0x07,0x0f,0x11,0x0f,0x12,0x07,0x0f,0x0e,
-0x0f,0x08,0x0e,0x0a,0x08,0x1f,0x0f,0x08,0x0a,0x08,0x08,0x0a,0x0f,0x0f,0x07,0x06,
-0x07,0x08,0x0e,0x12,0x13,0x13,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x17,0x0f,0x0f,
-0x0f,0x0f,0x0f,0x0d,0x0d,0x0d,0x0b,0x11,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0c,0x0f,
-0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x19,0x0f,0x0f,
-0x0f,0x0f,0x0f,0x07,0x07,0x0a,0x0e,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0d,0x0f,
-0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x13,0x1d,0x00,0x00,0x00,0x20,0x23,0x10,0x00,
-0x20,0x0a,0x08,0x11,0x11,0x11,0x15,0x11,0x08,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x08,
-0x0b,0x11,0x0e,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x08,0x08,0x0e,0x0b,0x0e,
-0x11,0x10,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0e,0x0b,0x11,0x11,0x17,0x11,
-0x11,0x11,0x11,0x11,0x11,0x0e,0x11,0x11,0x17,0x11,0x11,0x11,0x0b,0x0b,0x0b,0x0b,
-0x11,0x0b,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x08,0x08,0x11,0x0b,0x1a,0x11,
-0x11,0x11,0x11,0x11,0x10,0x0e,0x11,0x11,0x1a,0x11,0x11,0x11,0x0e,0x05,0x0e,0x0e,
-0x11,0x08,0x11,0x11,0x19,0x0e,0x0e,0x0b,0x1d,0x11,0x08,0x1c,0x11,0x08,0x08,0x11,
-0x11,0x11,0x0b,0x0e,0x0e,0x12,0x10,0x08,0x1c,0x11,0x11,0x0a,0x08,0x11,0x13,0x11,
-0x14,0x08,0x11,0x0f,0x11,0x09,0x0f,0x0b,0x08,0x23,0x11,0x09,0x0b,0x09,0x09,0x0b,
-0x11,0x11,0x08,0x06,0x08,0x09,0x0f,0x14,0x14,0x15,0x11,0x11,0x11,0x11,0x11,0x10,
-0x11,0x1a,0x11,0x11,0x11,0x11,0x11,0x0e,0x0e,0x0e,0x0e,0x13,0x11,0x11,0x11,0x11,
-0x11,0x10,0x0e,0x11,0x11,0x11,0x11,0x10,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
-0x11,0x1c,0x11,0x11,0x11,0x11,0x11,0x08,0x08,0x0b,0x10,0x11,0x11,0x11,0x11,0x11,
-0x11,0x11,0x0e,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x15,0x20,0x00,0x00,0x00,
-0x21,0x23,0x11,0x00,0x21,0x0a,0x08,0x11,0x11,0x11,0x15,0x11,0x08,0x0b,0x0b,0x0b,
-0x0b,0x08,0x0b,0x08,0x0b,0x11,0x0e,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x08,
-0x08,0x0e,0x0b,0x0e,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0e,0x0b,
-0x11,0x11,0x17,0x11,0x11,0x11,0x11,0x11,0x11,0x0e,0x11,0x11,0x17,0x11,0x11,0x11,
-0x0b,0x0b,0x0b,0x0b,0x12,0x0b,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x08,0x08,
-0x11,0x0b,0x1a,0x11,0x11,0x11,0x11,0x11,0x11,0x0e,0x11,0x11,0x1a,0x11,0x11,0x11,
-0x0e,0x05,0x0e,0x0e,0x11,0x08,0x11,0x11,0x19,0x0e,0x0e,0x0b,0x1e,0x11,0x08,0x1d,
-0x11,0x08,0x08,0x11,0x11,0x11,0x0b,0x0e,0x0e,0x14,0x11,0x08,0x1d,0x11,0x11,0x0a,
-0x08,0x11,0x14,0x11,0x15,0x08,0x11,0x10,0x11,0x09,0x10,0x0b,0x09,0x23,0x12,0x09,
-0x0b,0x09,0x09,0x0b,0x11,0x11,0x08,0x07,0x08,0x09,0x10,0x14,0x15,0x16,0x11,0x11,
-0x11,0x11,0x11,0x11,0x11,0x1a,0x11,0x11,0x11,0x11,0x12,0x0e,0x0e,0x0e,0x0e,0x14,
-0x11,0x11,0x11,0x11,0x11,0x11,0x0e,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
-0x11,0x11,0x11,0x12,0x11,0x1c,0x11,0x11,0x11,0x11,0x12,0x08,0x08,0x0b,0x10,0x11,
-0x11,0x11,0x11,0x11,0x11,0x12,0x0e,0x11,0x11,0x11,0x11,0x12,0x11,0x11,0x12,0x15,
-0x21,0x00,0x00,0x00,0x25,0x28,0x13,0x00,0x25,0x0b,0x09,0x14,0x14,0x14,0x17,0x14,
-0x09,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x09,0x0c,0x14,0x10,0x14,0x14,0x14,0x14,0x14,
-0x14,0x14,0x14,0x09,0x09,0x10,0x0d,0x10,0x14,0x13,0x14,0x14,0x14,0x14,0x14,0x14,
-0x14,0x14,0x10,0x0d,0x14,0x14,0x1a,0x14,0x14,0x14,0x14,0x14,0x14,0x10,0x14,0x14,
-0x1a,0x14,0x14,0x14,0x0d,0x0d,0x0d,0x0d,0x14,0x0d,0x14,0x14,0x14,0x14,0x14,0x13,
-0x14,0x14,0x09,0x09,0x14,0x0d,0x1d,0x13,0x14,0x14,0x14,0x13,0x13,0x10,0x14,0x13,
-0x1d,0x14,0x14,0x14,0x10,0x06,0x10,0x10,0x14,0x09,0x13,0x14,0x1c,0x10,0x10,0x0c,
-0x21,0x14,0x09,0x21,0x14,0x09,0x09,0x14,0x14,0x14,0x0d,0x10,0x10,0x15,0x13,0x09,
-0x21,0x14,0x14,0x0b,0x09,0x14,0x16,0x14,0x17,0x09,0x14,0x12,0x13,0x0a,0x12,0x0d,
-0x0a,0x28,0x14,0x0b,0x0d,0x0b,0x0b,0x0d,0x14,0x14,0x09,0x07,0x09,0x0b,0x12,0x17,
-0x17,0x19,0x14,0x14,0x14,0x14,0x14,0x15,0x14,0x1e,0x14,0x14,0x14,0x14,0x14,0x10,
-0x10,0x10,0x11,0x16,0x14,0x14,0x14,0x14,0x14,0x15,0x10,0x14,0x14,0x14,0x14,0x15,
-0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x20,0x14,0x14,0x14,0x14,0x14,0x09,
-0x09,0x0d,0x13,0x14,0x13,0x14,0x14,0x14,0x14,0x14,0x10,0x14,0x14,0x14,0x14,0x14,
-0x14,0x14,0x14,0x18,0x25,0x00,0x00,0x00,0x2a,0x2d,0x15,0x00,0x2a,0x0d,0x0b,0x16,
-0x16,0x16,0x1a,0x16,0x0b,0x0e,0x0f,0x0e,0x0e,0x0b,0x0e,0x0b,0x0e,0x16,0x12,0x16,
-0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x0b,0x0b,0x12,0x0e,0x12,0x16,0x15,0x16,0x16,
-0x16,0x16,0x16,0x16,0x16,0x16,0x12,0x0f,0x16,0x16,0x1e,0x16,0x16,0x16,0x16,0x16,
-0x16,0x12,0x16,0x16,0x1e,0x16,0x16,0x16,0x0e,0x0e,0x0f,0x0e,0x16,0x0e,0x16,0x16,
-0x16,0x16,0x16,0x16,0x16,0x16,0x0b,0x0b,0x16,0x0e,0x22,0x16,0x16,0x16,0x16,0x16,
-0x16,0x12,0x16,0x16,0x22,0x16,0x16,0x16,0x12,0x07,0x12,0x12,0x16,0x0b,0x16,0x16,
-0x1f,0x12,0x12,0x0e,0x26,0x16,0x0b,0x25,0x16,0x0b,0x0b,0x16,0x16,0x16,0x0e,0x12,
-0x12,0x18,0x16,0x0b,0x26,0x16,0x16,0x0d,0x0b,0x16,0x19,0x16,0x1a,0x0b,0x16,0x14,
-0x16,0x0c,0x14,0x0f,0x0b,0x2d,0x16,0x0c,0x0e,0x0c,0x0c,0x0e,0x16,0x16,0x0b,0x08,
-0x0a,0x0c,0x14,0x1a,0x1b,0x1c,0x16,0x16,0x16,0x16,0x16,0x17,0x16,0x22,0x16,0x16,
-0x16,0x16,0x16,0x12,0x12,0x12,0x13,0x19,0x16,0x16,0x16,0x16,0x16,0x17,0x12,0x16,
-0x16,0x16,0x16,0x17,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x17,0x16,0x24,0x16,0x16,
-0x16,0x16,0x17,0x0b,0x0b,0x0e,0x15,0x16,0x16,0x16,0x16,0x16,0x16,0x17,0x12,0x16,
-0x16,0x16,0x16,0x17,0x16,0x16,0x17,0x1b,0x2a,0x00,0x00,0x00,0x2e,0x31,0x17,0x00,
-0x2e,0x0e,0x0c,0x18,0x18,0x18,0x1e,0x18,0x0c,0x10,0x0f,0x10,0x10,0x0c,0x10,0x0c,
-0x0f,0x18,0x14,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x0c,0x0c,0x14,0x10,0x14,
-0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x0f,0x18,0x18,0x21,0x18,
-0x18,0x18,0x18,0x18,0x18,0x14,0x18,0x18,0x21,0x18,0x18,0x18,0x10,0x10,0x0f,0x10,
-0x19,0x10,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x0c,0x0c,0x18,0x10,0x25,0x18,
-0x18,0x18,0x18,0x18,0x18,0x14,0x18,0x18,0x25,0x18,0x18,0x18,0x14,0x07,0x14,0x14,
-0x18,0x0c,0x18,0x18,0x23,0x14,0x14,0x0f,0x2a,0x18,0x0c,0x29,0x18,0x0c,0x0c,0x18,
-0x18,0x18,0x10,0x14,0x14,0x1a,0x18,0x0c,0x28,0x18,0x18,0x0e,0x0c,0x18,0x1c,0x18,
-0x1d,0x0c,0x18,0x16,0x18,0x0d,0x16,0x10,0x0c,0x31,0x19,0x0d,0x10,0x0d,0x0d,0x10,
-0x18,0x18,0x0c,0x09,0x0b,0x0d,0x16,0x1d,0x1d,0x1f,0x18,0x18,0x18,0x18,0x18,0x18,
-0x18,0x25,0x18,0x18,0x18,0x18,0x18,0x14,0x14,0x14,0x13,0x1b,0x18,0x18,0x18,0x18,
-0x18,0x18,0x13,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
-0x18,0x28,0x18,0x18,0x18,0x18,0x18,0x0c,0x0c,0x10,0x16,0x18,0x18,0x18,0x18,0x18,
-0x18,0x18,0x14,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x19,0x1e,0x2e,0x00,0x00,0x00,
-0x32,0x35,0x19,0x00,0x32,0x0f,0x0d,0x1a,0x1a,0x1a,0x20,0x1a,0x0d,0x11,0x11,0x11,
-0x11,0x0d,0x11,0x0d,0x11,0x1a,0x16,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x0d,
-0x0d,0x16,0x11,0x15,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x16,0x11,
-0x1a,0x1a,0x24,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x16,0x1a,0x1a,0x24,0x1a,0x1a,0x1a,
-0x11,0x11,0x11,0x11,0x1b,0x11,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x0d,0x0d,
-0x1a,0x11,0x28,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x16,0x1a,0x1a,0x28,0x1a,0x1a,0x1a,
-0x16,0x08,0x16,0x16,0x1a,0x0d,0x1a,0x1a,0x26,0x16,0x16,0x11,0x2e,0x1a,0x0d,0x2c,
-0x1a,0x0d,0x0d,0x1a,0x1a,0x1a,0x11,0x15,0x16,0x1d,0x1a,0x0d,0x2d,0x1a,0x1a,0x0f,
-0x0d,0x1a,0x1e,0x1a,0x1f,0x0d,0x1a,0x18,0x1a,0x0e,0x18,0x11,0x0d,0x35,0x1b,0x0e,
-0x11,0x0e,0x0e,0x11,0x1a,0x1a,0x0d,0x0a,0x0c,0x0e,0x18,0x1f,0x20,0x21,0x1a,0x1a,
-0x1a,0x1a,0x1a,0x1a,0x1a,0x28,0x1a,0x1a,0x1a,0x1a,0x1a,0x16,0x16,0x16,0x16,0x1e,
-0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x15,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,
-0x1a,0x1a,0x1a,0x1a,0x1a,0x2b,0x1a,0x1a,0x1a,0x1a,0x1b,0x0d,0x0d,0x11,0x18,0x1a,
-0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x16,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x20,
-0x32,0x00,0x00,0x00,0x36,0x39,0x1b,0x00,0x36,0x10,0x0e,0x1c,0x1c,0x1c,0x22,0x1c,
-0x0e,0x13,0x13,0x13,0x13,0x0e,0x13,0x0e,0x12,0x1c,0x18,0x1c,0x1c,0x1c,0x1c,0x1c,
-0x1c,0x1c,0x1c,0x0e,0x0e,0x18,0x13,0x18,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,
-0x1c,0x1c,0x18,0x13,0x1c,0x1c,0x26,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x18,0x1c,0x1c,
-0x26,0x1c,0x1c,0x1c,0x13,0x13,0x13,0x13,0x1d,0x13,0x1c,0x1c,0x1c,0x1c,0x1d,0x1c,
-0x1c,0x1c,0x0e,0x0e,0x1c,0x13,0x2c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x18,0x1c,0x1c,
-0x2c,0x1d,0x1c,0x1d,0x18,0x09,0x18,0x17,0x1c,0x0e,0x1c,0x1c,0x28,0x18,0x18,0x12,
-0x31,0x1c,0x0e,0x30,0x1c,0x0e,0x0e,0x1c,0x1c,0x1c,0x13,0x17,0x17,0x1f,0x1c,0x0e,
-0x30,0x1d,0x1d,0x10,0x0e,0x1c,0x20,0x1d,0x22,0x0e,0x1d,0x1a,0x1d,0x0f,0x1a,0x13,
-0x0e,0x39,0x1d,0x0f,0x13,0x10,0x0f,0x13,0x1c,0x1c,0x0e,0x0b,0x0d,0x0f,0x1a,0x22,
-0x23,0x24,0x1c,0x1c,0x1c,0x1c,0x1c,0x1d,0x1d,0x2b,0x1c,0x1c,0x1c,0x1c,0x1c,0x18,
-0x18,0x18,0x18,0x20,0x1c,0x1c,0x1c,0x1c,0x1c,0x1d,0x17,0x1c,0x1c,0x1c,0x1c,0x1d,
-0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1d,0x1d,0x2f,0x1c,0x1d,0x1d,0x1d,0x1d,0x0e,
-0x0e,0x13,0x1b,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1d,0x17,0x1c,0x1c,0x1c,0x1c,0x1d,
-0x1c,0x1c,0x1d,0x23,0x36,0x00,0x00,0x00,0x3a,0x3e,0x1d,0x00,0x3a,0x11,0x0f,0x1f,
-0x1f,0x1f,0x24,0x1f,0x0f,0x14,0x14,0x14,0x14,0x0f,0x14,0x0f,0x13,0x1f,0x19,0x1f,
-0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x0f,0x0f,0x19,0x14,0x19,0x1f,0x1e,0x1f,0x1f,
-0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x19,0x14,0x1f,0x1f,0x29,0x1f,0x1f,0x1f,0x1f,0x1f,
-0x1f,0x19,0x1f,0x1f,0x29,0x1f,0x1f,0x1f,0x14,0x14,0x14,0x14,0x1f,0x14,0x1f,0x1f,
-0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x0f,0x0f,0x1f,0x14,0x2f,0x1f,0x1f,0x1f,0x1f,0x1f,
-0x1e,0x19,0x1f,0x1f,0x2f,0x1f,0x1f,0x1f,0x19,0x09,0x19,0x19,0x1f,0x0f,0x1f,0x1f,
-0x2c,0x19,0x19,0x14,0x34,0x1f,0x0f,0x34,0x1f,0x0f,0x0f,0x1f,0x1f,0x1f,0x14,0x19,
-0x19,0x22,0x1e,0x0f,0x34,0x1f,0x1f,0x11,0x0f,0x1f,0x23,0x1f,0x24,0x0f,0x1f,0x1c,
-0x1f,0x10,0x1c,0x14,0x0f,0x3e,0x1f,0x11,0x14,0x11,0x11,0x14,0x1f,0x1f,0x0f,0x0c,
-0x0e,0x11,0x1c,0x24,0x25,0x26,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x2f,0x1f,0x1f,
-0x1f,0x1f,0x1f,0x19,0x19,0x19,0x19,0x22,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x19,0x1f,
-0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x32,0x1f,0x1f,
-0x1f,0x1f,0x1f,0x0f,0x0f,0x14,0x1d,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x19,0x1f,
-0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x25,0x3a,0x00,0x00,0x00,0x43,0x49,0x22,0x00,
-0x43,0x14,0x11,0x23,0x23,0x23,0x2b,0x23,0x11,0x17,0x17,0x17,0x17,0x11,0x17,0x11,
-0x16,0x23,0x1d,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x11,0x11,0x1d,0x17,0x1e,
-0x23,0x22,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x1d,0x17,0x23,0x23,0x30,0x23,
-0x23,0x23,0x23,0x23,0x23,0x1d,0x23,0x23,0x30,0x23,0x23,0x23,0x17,0x17,0x17,0x17,
-0x24,0x17,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x11,0x11,0x23,0x17,0x35,0x23,
-0x23,0x23,0x23,0x23,0x23,0x1d,0x23,0x23,0x35,0x23,0x23,0x23,0x1d,0x0b,0x1d,0x1d,
-0x23,0x11,0x23,0x23,0x32,0x1d,0x1d,0x17,0x3d,0x23,0x11,0x3c,0x23,0x11,0x11,0x23,
-0x23,0x23,0x17,0x1d,0x1d,0x27,0x23,0x11,0x3c,0x23,0x24,0x14,0x11,0x23,0x28,0x24,
-0x2a,0x11,0x24,0x20,0x24,0x13,0x20,0x17,0x12,0x49,0x24,0x13,0x17,0x13,0x13,0x17,
-0x23,0x23,0x11,0x0e,0x10,0x13,0x20,0x2a,0x2a,0x2d,0x23,0x23,0x23,0x23,0x23,0x24,
-0x24,0x36,0x23,0x23,0x23,0x23,0x23,0x1d,0x1d,0x1d,0x1d,0x28,0x23,0x23,0x23,0x23,
-0x23,0x24,0x1c,0x23,0x23,0x23,0x23,0x24,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x24,
-0x24,0x3a,0x23,0x23,0x23,0x23,0x24,0x11,0x11,0x17,0x21,0x23,0x23,0x23,0x23,0x23,
-0x23,0x24,0x1d,0x23,0x23,0x23,0x23,0x24,0x23,0x23,0x24,0x2b,0x43,0x00,0x00,0x00,
-0x4b,0x51,0x26,0x00,0x4b,0x17,0x13,0x28,0x28,0x28,0x2f,0x28,0x13,0x1a,0x1a,0x1a,
-0x1a,0x13,0x1a,0x13,0x19,0x28,0x21,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x13,
-0x13,0x21,0x1a,0x21,0x28,0x26,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x21,0x1a,
-0x28,0x28,0x35,0x28,0x28,0x28,0x28,0x28,0x28,0x21,0x28,0x28,0x35,0x28,0x28,0x28,
-0x1a,0x1a,0x1a,0x1a,0x28,0x1a,0x28,0x28,0x28,0x28,0x28,0x27,0x28,0x28,0x13,0x13,
-0x28,0x1a,0x3c,0x27,0x28,0x28,0x28,0x27,0x27,0x21,0x28,0x27,0x3c,0x28,0x28,0x28,
-0x21,0x0c,0x21,0x21,0x28,0x13,0x27,0x28,0x39,0x21,0x21,0x19,0x44,0x28,0x13,0x43,
-0x28,0x13,0x13,0x28,0x28,0x28,0x1a,0x20,0x21,0x2b,0x27,0x13,0x42,0x28,0x28,0x17,
-0x13,0x28,0x2d,0x28,0x2f,0x13,0x28,0x24,0x28,0x15,0x24,0x1a,0x14,0x51,0x28,0x16,
-0x1a,0x16,0x15,0x1a,0x28,0x28,0x13,0x0f,0x12,0x16,0x24,0x2f,0x30,0x32,0x28,0x28,
-0x28,0x28,0x28,0x28,0x28,0x3c,0x28,0x28,0x28,0x28,0x28,0x21,0x21,0x21,0x21,0x2c,
-0x28,0x28,0x28,0x28,0x28,0x28,0x20,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,
-0x28,0x28,0x28,0x27,0x28,0x41,0x28,0x28,0x28,0x28,0x27,0x13,0x13,0x1a,0x25,0x28,
-0x27,0x28,0x28,0x28,0x28,0x27,0x21,0x28,0x28,0x28,0x28,0x27,0x28,0x28,0x27,0x30,
-0x4b,0x00,0x00,0x00,0x53,0x5a,0x2a,0x00,0x53,0x19,0x15,0x2c,0x2c,0x2c,0x35,0x2c,
-0x15,0x1c,0x1d,0x1c,0x1c,0x15,0x1c,0x15,0x1c,0x2c,0x24,0x2c,0x2c,0x2c,0x2c,0x2c,
-0x2c,0x2c,0x2c,0x15,0x15,0x24,0x1c,0x24,0x2c,0x2a,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,
-0x2c,0x2c,0x24,0x1d,0x2c,0x2c,0x3b,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x24,0x2c,0x2c,
-0x3b,0x2c,0x2c,0x2c,0x1c,0x1c,0x1d,0x1c,0x2c,0x1c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,
-0x2c,0x2c,0x15,0x15,0x2c,0x1c,0x43,0x2c,0x2c,0x2c,0x2c,0x2c,0x2b,0x24,0x2c,0x2c,
-0x43,0x2c,0x2c,0x2c,0x24,0x0d,0x24,0x24,0x2c,0x15,0x2c,0x2c,0x3f,0x24,0x24,0x1c,
-0x4c,0x2c,0x15,0x4a,0x2c,0x15,0x15,0x2c,0x2c,0x2c,0x1c,0x24,0x24,0x30,0x2b,0x15,
-0x4a,0x2c,0x2c,0x19,0x15,0x2c,0x32,0x2c,0x34,0x15,0x2c,0x28,0x2c,0x17,0x28,0x1d,
-0x16,0x5a,0x2c,0x18,0x1c,0x18,0x18,0x1c,0x2c,0x2c,0x15,0x11,0x14,0x18,0x28,0x34,
-0x34,0x37,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x43,0x2c,0x2c,0x2c,0x2c,0x2c,0x24,
-0x24,0x24,0x24,0x31,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x23,0x2c,0x2c,0x2c,0x2c,0x2c,
-0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x48,0x2c,0x2c,0x2c,0x2c,0x2c,0x15,
-0x15,0x1c,0x29,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x24,0x2c,0x2c,0x2c,0x2c,0x2c,
-0x2c,0x2c,0x2c,0x36,0x53,0x00,0x00,0x00,0x5c,0x63,0x2e,0x00,0x5c,0x1c,0x17,0x31,
-0x31,0x31,0x3a,0x31,0x17,0x20,0x1f,0x20,0x20,0x17,0x20,0x17,0x1f,0x31,0x28,0x31,
-0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x17,0x17,0x28,0x20,0x28,0x31,0x2f,0x31,0x31,
-0x31,0x31,0x31,0x31,0x31,0x31,0x28,0x1f,0x31,0x31,0x41,0x31,0x31,0x31,0x31,0x31,
-0x31,0x28,0x31,0x31,0x41,0x31,0x31,0x31,0x20,0x20,0x1f,0x20,0x31,0x20,0x31,0x31,
-0x31,0x31,0x31,0x30,0x31,0x31,0x17,0x17,0x31,0x20,0x4a,0x30,0x31,0x31,0x31,0x30,
-0x2f,0x28,0x31,0x30,0x4a,0x31,0x31,0x31,0x28,0x0f,0x28,0x28,0x31,0x17,0x30,0x31,
-0x45,0x28,0x28,0x1f,0x53,0x31,0x17,0x52,0x31,0x17,0x17,0x31,0x31,0x31,0x20,0x27,
-0x28,0x35,0x2f,0x17,0x52,0x31,0x30,0x1c,0x17,0x31,0x37,0x30,0x3a,0x17,0x30,0x2c,
-0x30,0x1a,0x2c,0x20,0x18,0x63,0x31,0x1a,0x20,0x1a,0x1a,0x20,0x31,0x31,0x17,0x13,
-0x16,0x1a,0x2c,0x39,0x3a,0x3d,0x31,0x31,0x31,0x31,0x31,0x30,0x30,0x4a,0x31,0x31,
-0x31,0x31,0x30,0x28,0x28,0x28,0x28,0x37,0x31,0x31,0x31,0x31,0x31,0x30,0x27,0x31,
-0x31,0x31,0x31,0x30,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x30,0x30,0x4f,0x31,0x31,
-0x31,0x31,0x30,0x17,0x17,0x20,0x2d,0x31,0x30,0x31,0x31,0x31,0x31,0x30,0x28,0x31,
-0x31,0x31,0x31,0x30,0x31,0x31,0x30,0x3b,0x5c,0x00,0x00,0x00,0x60,0x67,0x30,0x00,
-0x60,0x1d,0x18,0x33,0x33,0x33,0x3d,0x33,0x18,0x21,0x22,0x21,0x21,0x18,0x21,0x18,
-0x20,0x33,0x2a,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x18,0x18,0x2a,0x21,0x2a,
-0x33,0x31,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x2a,0x22,0x33,0x33,0x44,0x33,
-0x33,0x33,0x33,0x33,0x33,0x2a,0x33,0x33,0x44,0x33,0x33,0x33,0x21,0x21,0x22,0x21,
-0x33,0x21,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x18,0x18,0x33,0x21,0x4d,0x33,
-0x33,0x33,0x33,0x33,0x31,0x2a,0x33,0x33,0x4d,0x33,0x33,0x33,0x2a,0x0f,0x2a,0x2a,
-0x33,0x18,0x33,0x33,0x49,0x2a,0x2a,0x20,0x57,0x33,0x18,0x55,0x33,0x18,0x18,0x33,
-0x33,0x33,0x21,0x29,0x2a,0x37,0x31,0x18,0x56,0x33,0x33,0x1d,0x18,0x33,0x39,0x33,
-0x3c,0x18,0x33,0x2e,0x32,0x1b,0x2e,0x21,0x19,0x67,0x33,0x1c,0x21,0x1c,0x1b,0x21,
-0x33,0x33,0x18,0x13,0x17,0x1c,0x2e,0x3c,0x3d,0x40,0x33,0x33,0x33,0x33,0x33,0x33,
-0x33,0x4d,0x33,0x33,0x33,0x33,0x33,0x2a,0x2a,0x2a,0x2b,0x39,0x33,0x33,0x33,0x33,
-0x33,0x33,0x29,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x34,
-0x33,0x53,0x33,0x33,0x33,0x33,0x34,0x18,0x18,0x21,0x30,0x33,0x33,0x33,0x33,0x33,
-0x33,0x34,0x2a,0x33,0x33,0x33,0x33,0x34,0x33,0x33,0x33,0x3e,0x60,0x00,0x00,0x00,
-0x64,0x6b,0x32,0x00,0x64,0x1e,0x19,0x35,0x35,0x35,0x40,0x35,0x19,0x22,0x22,0x22,
-0x22,0x19,0x22,0x19,0x21,0x35,0x2c,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x19,
-0x19,0x2c,0x22,0x2c,0x35,0x33,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x2c,0x22,
-0x35,0x35,0x47,0x35,0x35,0x35,0x35,0x35,0x35,0x2c,0x35,0x35,0x47,0x35,0x35,0x35,
-0x22,0x22,0x22,0x22,0x35,0x22,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x19,0x19,
-0x35,0x22,0x50,0x35,0x35,0x35,0x35,0x35,0x34,0x2c,0x35,0x35,0x50,0x35,0x35,0x35,
-0x2c,0x10,0x2c,0x2b,0x35,0x19,0x35,0x35,0x4b,0x2c,0x2c,0x22,0x5b,0x35,0x19,0x59,
-0x35,0x19,0x19,0x35,0x35,0x35,0x22,0x2b,0x2b,0x3a,0x34,0x19,0x59,0x35,0x35,0x1e,
-0x19,0x35,0x3c,0x35,0x3f,0x19,0x35,0x30,0x35,0x1c,0x30,0x22,0x1b,0x6b,0x35,0x1d,
-0x22,0x1d,0x1d,0x22,0x35,0x35,0x19,0x14,0x18,0x1d,0x30,0x3e,0x40,0x42,0x35,0x35,
-0x35,0x35,0x35,0x34,0x35,0x50,0x35,0x35,0x35,0x35,0x34,0x2c,0x2c,0x2c,0x2b,0x3b,
-0x35,0x35,0x35,0x35,0x35,0x34,0x2a,0x35,0x35,0x35,0x35,0x34,0x35,0x35,0x35,0x35,
-0x35,0x35,0x35,0x35,0x35,0x56,0x35,0x35,0x35,0x35,0x35,0x19,0x19,0x22,0x31,0x35,
-0x35,0x35,0x35,0x35,0x35,0x35,0x2b,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x40,
-0x64,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0xe8,0x48,0x83,0x0e,
-0x5f,0x0f,0x3c,0xf5,0x00,0x10,0x04,0x28,0x00,0x00,0x00,0x00,0xbb,0xd1,0xec,0xef,
-0x00,0x00,0x00,0x00,0xbb,0xd8,0x70,0xf5,0xff,0xa1,0xfe,0xaf,0x04,0x55,0x04,0x54,
-0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,
-0x04,0x54,0xfe,0xaf,0x01,0x0a,0x04,0x75,0xff,0xa1,0xff,0xf2,0x04,0x55,0x00,0x01,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,
-0x02,0x14,0x00,0x43,0x00,0x00,0x00,0x00,0x04,0x28,0x00,0x00,0x01,0x40,0x00,0x00,
-0x01,0x0b,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,
-0x02,0xa5,0x00,0x00,0x02,0x31,0x00,0x00,0x01,0x0b,0x00,0x00,0x01,0x6d,0x00,0x00,
-0x01,0x6d,0x00,0x00,0x01,0x6d,0x00,0x00,0x01,0x6d,0x00,0x00,0x01,0x0b,0x00,0x00,
-0x01,0x6d,0x00,0x00,0x01,0x0b,0x00,0x00,0x01,0x64,0x00,0x00,0x02,0x31,0x00,0x00,
-0x01,0xcf,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,
-0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,
-0x02,0x31,0x00,0x00,0x01,0x0b,0x00,0x00,0x01,0x0b,0x00,0x00,0x01,0xcf,0x00,0x00,
-0x01,0x6d,0x00,0x00,0x01,0xcf,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x20,0x00,0x00,
-0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,
-0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,
-0x01,0xcf,0x00,0x00,0x01,0x6d,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,
-0x02,0xf5,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,
-0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,0x01,0xcf,0x00,0x00,
-0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0xf5,0x00,0x00,0x02,0x31,0x00,0x00,
-0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,0x01,0x6d,0x00,0x00,0x01,0x6d,0x00,0x00,
-0x01,0x6d,0x00,0x00,0x01,0x6d,0x00,0x00,0x02,0x37,0xff,0xfb,0x01,0x6d,0x00,0x00,
-0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,
-0x02,0x33,0x00,0x00,0x02,0x30,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,
-0x01,0x0b,0x00,0x00,0x01,0x0d,0xff,0xa1,0x02,0x31,0x00,0x00,0x01,0x6d,0x00,0x00,
-0x03,0x55,0xff,0xff,0x02,0x30,0xff,0xff,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,
-0x02,0x31,0x00,0x00,0x02,0x30,0x00,0x00,0x02,0x24,0x00,0x00,0x01,0xcf,0x00,0x00,
-0x02,0x31,0x00,0x00,0x02,0x30,0x00,0x00,0x03,0x55,0x00,0x00,0x02,0x33,0x00,0x00,
-0x02,0x31,0x00,0x00,0x02,0x33,0x00,0x00,0x01,0xcf,0x00,0x00,0x00,0xaa,0x00,0x00,
-0x01,0xcf,0x00,0x00,0x01,0xcd,0x00,0x02,0x02,0x31,0xff,0xff,0x01,0x0b,0x00,0x00,
-0x02,0x30,0x00,0x01,0x02,0x31,0x00,0x00,0x03,0x21,0x00,0x00,0x01,0xcf,0x00,0x00,
-0x01,0xcf,0xff,0xff,0x01,0x66,0x00,0x00,0x03,0xc8,0x00,0x00,0x02,0x31,0x00,0x00,
-0x01,0x0d,0x00,0x04,0x03,0xb2,0x00,0x00,0x02,0x31,0x00,0x00,0x01,0x0b,0x00,0x00,
-0x01,0x0b,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,
-0x01,0x6d,0x00,0x00,0x01,0xc8,0x00,0x00,0x01,0xcd,0x00,0x01,0x02,0x67,0x00,0x03,
-0x02,0x24,0x00,0x00,0x01,0x0d,0x00,0x04,0x03,0xb2,0x00,0x00,0x02,0x33,0x00,0x00,
-0x02,0x31,0x00,0x00,0x01,0x40,0x00,0x00,0x01,0x0b,0x00,0x00,0x02,0x31,0x00,0x00,
-0x02,0x7d,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x9d,0x00,0x00,0x01,0x0b,0x00,0x00,
-0x02,0x31,0x00,0x00,0x02,0x02,0x00,0x00,0x02,0x31,0x00,0x01,0x01,0x2c,0x00,0x01,
-0x02,0x02,0x00,0x04,0x01,0x6d,0x00,0x00,0x01,0x1a,0x00,0x00,0x04,0x75,0x00,0x0a,
-0x02,0x37,0xff,0xf1,0x01,0x31,0x00,0x04,0x01,0x6d,0x00,0x00,0x01,0x32,0x00,0x01,
-0x01,0x30,0xff,0xff,0x01,0x6d,0xff,0xff,0x02,0x31,0x00,0x01,0x02,0x31,0x00,0x00,
-0x01,0x0b,0x00,0x00,0x00,0xd7,0xff,0xce,0x00,0xff,0x00,0x04,0x01,0x31,0x00,0x04,
-0x02,0x02,0x00,0x04,0x02,0x99,0x00,0x00,0x02,0xa2,0x00,0x00,0x02,0xc4,0x00,0x00,
-0x02,0x31,0xff,0xff,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,
-0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,0x03,0x56,0x00,0x00,
-0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,
-0x02,0x31,0x00,0x00,0x01,0xcf,0x00,0x00,0x01,0xcf,0x00,0x00,0x01,0xcf,0x00,0x00,
-0x01,0xcf,0xff,0xe0,0x02,0x77,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,
-0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,
-0x01,0xc2,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,
-0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,
-0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,
-0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,0x03,0x95,0x00,0x00,
-0x02,0x31,0x00,0x00,0x02,0x33,0x00,0x00,0x02,0x33,0x00,0x00,0x02,0x33,0x00,0x00,
-0x02,0x33,0x00,0x00,0x01,0x0b,0x00,0x00,0x01,0x0b,0x00,0x00,0x01,0x6d,0x00,0x00,
-0x02,0x0f,0x00,0x00,0x02,0x31,0xff,0xff,0x02,0x30,0x00,0x00,0x02,0x31,0x00,0x00,
-0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,
-0x01,0xce,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,
-0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x31,0x00,0x00,
-0x02,0x31,0x00,0x00,0x02,0xae,0x00,0x85,0x04,0x28,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x6c,0x00,0xbc,0x01,0x49,
-0x01,0xb1,0x02,0x07,0x02,0x65,0x02,0x92,0x02,0xc4,0x02,0xef,0x03,0x5c,0x03,0x91,
-0x03,0xbe,0x03,0xd2,0x03,0xec,0x04,0x05,0x04,0x36,0x04,0x5d,0x04,0xad,0x05,0x09,
-0x05,0x46,0x05,0x91,0x05,0xe2,0x06,0x1e,0x06,0x93,0x06,0xd6,0x06,0xff,0x07,0x3b,
-0x07,0x75,0x07,0x98,0x07,0xdf,0x08,0x28,0x08,0x61,0x08,0xa9,0x09,0x04,0x09,0x41,
-0x09,0x77,0x09,0xb7,0x09,0xed,0x0a,0x43,0x0a,0x7f,0x0a,0xb2,0x0a,0xdc,0x0b,0x25,
-0x0b,0x46,0x0b,0x7e,0x0b,0xbe,0x0b,0xfb,0x0c,0x39,0x0c,0x8b,0x0c,0xdc,0x0d,0x3a,
-0x0d,0x60,0x0d,0x91,0x0d,0xc6,0x0d,0xff,0x0e,0x54,0x0e,0x96,0x0e,0xc7,0x0e,0xef,
-0x0f,0x08,0x0f,0x31,0x0f,0x52,0x0f,0x66,0x0f,0x7c,0x0f,0xb7,0x0f,0xf7,0x10,0x30,
-0x10,0x72,0x10,0xb5,0x10,0xf8,0x11,0x48,0x11,0x7e,0x11,0xae,0x11,0xe4,0x12,0x17,
-0x12,0x3b,0x12,0x80,0x12,0xae,0x12,0xeb,0x13,0x25,0x13,0x67,0x13,0x8a,0x13,0xc9,
-0x14,0x08,0x14,0x37,0x14,0x5e,0x14,0xa2,0x14,0xe5,0x15,0x25,0x15,0x4d,0x15,0x85,
-0x15,0x9f,0x15,0xde,0x16,0x0a,0x16,0x23,0x16,0x50,0x16,0x92,0x16,0xe2,0x17,0x1e,
-0x17,0x55,0x17,0xaf,0x17,0xd0,0x18,0x5f,0x18,0xe6,0x19,0x05,0x19,0x56,0x19,0x97,
-0x19,0xbe,0x19,0xeb,0x1a,0x32,0x1a,0x82,0x1a,0x9d,0x1a,0xb1,0x1a,0xc9,0x1a,0xf5,
-0x1b,0x4d,0x1b,0xb7,0x1b,0xd6,0x1c,0x32,0x1c,0x6a,0x1c,0xcf,0x1c,0xcf,0x1c,0xf9,
-0x1d,0x59,0x1d,0xbb,0x1e,0x30,0x1e,0x8e,0x1e,0xa8,0x1f,0x52,0x1f,0x7c,0x1f,0xd2,
-0x20,0x09,0x20,0x3e,0x20,0x60,0x20,0x7d,0x23,0x1f,0x23,0x33,0x23,0x5e,0x23,0x9e,
-0x23,0xe9,0x24,0x3f,0x24,0x56,0x24,0x8f,0x24,0xca,0x24,0xe4,0x25,0x00,0x25,0x31,
-0x25,0x5c,0x25,0x91,0x26,0x10,0x26,0x99,0x27,0x3e,0x27,0x87,0x27,0xda,0x28,0x2d,
-0x28,0xa5,0x29,0x15,0x29,0x84,0x29,0xe2,0x2a,0x3e,0x2a,0x96,0x2a,0xe1,0x2b,0x2d,
-0x2b,0x7c,0x2b,0xe3,0x2c,0x2a,0x2c,0x71,0x2c,0xb7,0x2d,0x0f,0x2d,0x5f,0x2d,0xc2,
-0x2e,0x0a,0x2e,0x52,0x2e,0xba,0x2f,0x15,0x2f,0x79,0x2f,0xbc,0x2f,0xfb,0x30,0x32,
-0x30,0x69,0x30,0xc1,0x31,0x15,0x31,0x5e,0x31,0xa3,0x31,0xe9,0x32,0x2f,0x32,0x75,
-0x32,0xdb,0x33,0x34,0x33,0x97,0x33,0xe8,0x34,0x3c,0x34,0x94,0x34,0xe2,0x35,0x2f,
-0x35,0x9d,0x36,0x0d,0x36,0x39,0x36,0x67,0x36,0x99,0x36,0xd7,0x37,0x27,0x37,0x7c,
-0x37,0xc4,0x38,0x0c,0x38,0x75,0x38,0xd0,0x39,0x35,0x39,0x71,0x39,0xb6,0x39,0xec,
-0x3a,0x21,0x3a,0x77,0x3a,0xca,0x3b,0x10,0x3b,0x51,0x3b,0xb5,0x3b,0xc9,0x3b,0xc9,
-0x3b,0xc9,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xe0,0x00,0xd2,0x00,0x0d,0x00,0x00,
-0x00,0x00,0x00,0x02,0x00,0x08,0x00,0x40,0x00,0x28,0x00,0x00,0x02,0x00,0x04,0x0d,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0xae,0x00,0x01,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x16,
-0x00,0x24,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x00,0x3a,0x00,0x01,
-0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x16,0x00,0x43,0x00,0x01,0x00,0x00,0x00,0x00,
-0x00,0x04,0x00,0x16,0x00,0x59,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x01,
-0x00,0x6f,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x15,0x00,0x70,0x00,0x03,
-0x00,0x01,0x04,0x09,0x00,0x00,0x00,0x48,0x00,0x85,0x00,0x03,0x00,0x01,0x04,0x09,
-0x00,0x01,0x00,0x2c,0x00,0xcd,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x02,0x00,0x12,
-0x00,0xf9,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x03,0x00,0x2c,0x01,0x0b,0x00,0x03,
-0x00,0x01,0x04,0x09,0x00,0x04,0x00,0x2c,0x01,0x37,0x00,0x03,0x00,0x01,0x04,0x09,
-0x00,0x05,0x00,0x02,0x01,0x63,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x06,0x00,0x2a,
-0x01,0x65,0x32,0x30,0x30,0x33,0x20,0x49,0x63,0x6f,0x6e,0x69,0x61,0x6e,0x20,0x46,
-0x6f,0x6e,0x74,0x73,0x20,0x2d,0x20,0x77,0x77,0x77,0x2e,0x69,0x63,0x6f,0x6e,0x69,
-0x61,0x6e,0x2e,0x63,0x6f,0x6d,0x43,0x6f,0x6d,0x6d,0x6f,0x6e,0x77,0x65,0x61,0x6c,
-0x74,0x68,0x20,0x43,0x6f,0x6e,0x64,0x65,0x6e,0x73,0x65,0x64,0x43,0x6f,0x6e,0x64,
-0x65,0x6e,0x73,0x65,0x64,0x43,0x6f,0x6d,0x6d,0x6f,0x6e,0x77,0x65,0x61,0x6c,0x74,
-0x68,0x20,0x43,0x6f,0x6e,0x64,0x65,0x6e,0x73,0x65,0x64,0x43,0x6f,0x6d,0x6d,0x6f,
-0x6e,0x77,0x65,0x61,0x6c,0x74,0x68,0x20,0x43,0x6f,0x6e,0x64,0x65,0x6e,0x73,0x65,
-0x64,0x32,0x43,0x6f,0x6d,0x6d,0x6f,0x6e,0x77,0x65,0x61,0x6c,0x74,0x68,0x43,0x6f,
-0x6e,0x64,0x65,0x6e,0x73,0x65,0x64,0x00,0x32,0x00,0x30,0x00,0x30,0x00,0x33,0x00,
-0x20,0x00,0x49,0x00,0x63,0x00,0x6f,0x00,0x6e,0x00,0x69,0x00,0x61,0x00,0x6e,0x00,
-0x20,0x00,0x46,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x73,0x00,0x20,0x00,0x2d,0x00,
-0x20,0x00,0x77,0x00,0x77,0x00,0x77,0x00,0x2e,0x00,0x69,0x00,0x63,0x00,0x6f,0x00,
-0x6e,0x00,0x69,0x00,0x61,0x00,0x6e,0x00,0x2e,0x00,0x63,0x00,0x6f,0x00,0x6d,0x00,
-0x43,0x00,0x6f,0x00,0x6d,0x00,0x6d,0x00,0x6f,0x00,0x6e,0x00,0x77,0x00,0x65,0x00,
-0x61,0x00,0x6c,0x00,0x74,0x00,0x68,0x00,0x20,0x00,0x43,0x00,0x6f,0x00,0x6e,0x00,
-0x64,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x64,0x00,0x43,0x00,0x6f,0x00,
-0x6e,0x00,0x64,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x64,0x00,0x43,0x00,
-0x6f,0x00,0x6d,0x00,0x6d,0x00,0x6f,0x00,0x6e,0x00,0x77,0x00,0x65,0x00,0x61,0x00,
-0x6c,0x00,0x74,0x00,0x68,0x00,0x20,0x00,0x43,0x00,0x6f,0x00,0x6e,0x00,0x64,0x00,
-0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x64,0x00,0x43,0x00,0x6f,0x00,0x6d,0x00,
-0x6d,0x00,0x6f,0x00,0x6e,0x00,0x77,0x00,0x65,0x00,0x61,0x00,0x6c,0x00,0x74,0x00,
-0x68,0x00,0x20,0x00,0x43,0x00,0x6f,0x00,0x6e,0x00,0x64,0x00,0x65,0x00,0x6e,0x00,
-0x73,0x00,0x65,0x00,0x64,0x00,0x32,0x00,0x43,0x00,0x6f,0x00,0x6d,0x00,0x6d,0x00,
-0x6f,0x00,0x6e,0x00,0x77,0x00,0x65,0x00,0x61,0x00,0x6c,0x00,0x74,0x00,0x68,0x00,
-0x43,0x00,0x6f,0x00,0x6e,0x00,0x64,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,
-0x64,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x7b,0x00,0x14,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x01,0x02,0x00,0x02,0x00,0x03,0x00,0x04,
-0x01,0x03,0x00,0x06,0x00,0x07,0x01,0x04,0x00,0x09,0x01,0x05,0x00,0x0b,0x00,0x0c,
-0x00,0x0d,0x00,0x0e,0x00,0x0f,0x01,0x06,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,
-0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,0x00,0x1b,0x00,0x1c,
-0x00,0x1d,0x00,0x1e,0x00,0x1f,0x00,0x20,0x00,0x21,0x00,0x22,0x00,0x23,0x00,0x24,
-0x00,0x25,0x00,0x26,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x2a,0x00,0x2b,0x00,0x2c,
-0x00,0x2d,0x00,0x2e,0x00,0x2f,0x00,0x30,0x00,0x31,0x00,0x32,0x00,0x33,0x00,0x34,
-0x00,0x35,0x00,0x36,0x00,0x37,0x00,0x38,0x00,0x39,0x00,0x3a,0x00,0x3b,0x00,0x3c,
-0x00,0x3d,0x00,0x3e,0x00,0x3f,0x00,0x40,0x00,0x41,0x00,0x42,0x00,0x43,0x00,0x44,
-0x00,0x45,0x00,0x46,0x00,0x47,0x00,0x48,0x00,0x49,0x00,0x4a,0x00,0x4b,0x00,0x4c,
-0x01,0x07,0x00,0x4e,0x00,0x4f,0x00,0x50,0x00,0x51,0x01,0x08,0x00,0x53,0x00,0x54,
-0x00,0x55,0x00,0x56,0x00,0x57,0x00,0x58,0x01,0x09,0x00,0x5a,0x00,0x5b,0x01,0x0a,
-0x00,0x5d,0x00,0x5e,0x00,0x5f,0x00,0x60,0x01,0x0b,0x01,0x0c,0x01,0x0d,0x01,0x0e,
-0x01,0x0f,0x01,0x10,0x01,0x11,0x01,0x12,0x01,0x13,0x01,0x14,0x01,0x15,0x01,0x16,
-0x01,0x17,0x01,0x18,0x00,0xb6,0x00,0xb7,0x00,0xb4,0x00,0xb5,0x01,0x19,0x01,0x1a,
-0x01,0x1b,0x01,0x1c,0x01,0x1d,0x01,0x1e,0x01,0x1f,0x01,0x20,0x01,0x21,0x01,0x22,
-0x01,0x23,0x01,0x24,0x01,0x25,0x00,0x05,0x01,0x26,0x01,0x27,0x01,0x28,0x01,0x29,
-0x01,0x2a,0x01,0x2b,0x01,0x2c,0x01,0x2d,0x01,0x2e,0x01,0x2f,0x01,0x30,0x01,0x31,
-0x01,0x32,0x01,0x33,0x01,0x34,0x01,0x35,0x01,0x36,0x01,0x37,0x01,0x38,0x01,0x39,
-0x01,0x3a,0x01,0x3b,0x01,0x3c,0x01,0x3d,0x01,0x3e,0x01,0x3f,0x01,0x40,0x01,0x41,
-0x01,0x42,0x01,0x43,0x01,0x44,0x01,0x45,0x01,0x46,0x01,0x47,0x01,0x48,0x01,0x49,
-0x01,0x4a,0x01,0x4b,0x01,0x4c,0x01,0x4d,0x01,0x4e,0x01,0x4f,0x01,0x50,0x01,0x51,
-0x01,0x52,0x01,0x53,0x01,0x54,0x01,0x55,0x01,0x56,0x01,0x57,0x01,0x58,0x01,0x59,
-0x01,0x5a,0x01,0x5b,0x01,0x5c,0x01,0x5d,0x01,0x5e,0x01,0x5f,0x01,0x60,0x01,0x61,
-0x01,0x62,0x01,0x63,0x01,0x64,0x01,0x65,0x01,0x66,0x01,0x67,0x01,0x68,0x01,0x69,
-0x01,0x6a,0x01,0x6b,0x01,0x6c,0x01,0x6d,0x01,0x6e,0x01,0x6f,0x01,0x70,0x01,0x71,
-0x01,0x72,0x01,0x73,0x00,0x52,0x01,0x74,0x01,0x75,0x01,0x76,0x01,0x77,0x01,0x78,
-0x01,0x79,0x01,0x7a,0x01,0x7b,0x01,0x7c,0x01,0x7d,0x00,0x5c,0x01,0x7e,0x01,0x7f,
-0x00,0x10,0x00,0x00,0x00,0x01,0x05,0x2e,0x6e,0x75,0x6c,0x6c,0x07,0x46,0x4c,0x30,
-0x30,0x32,0x32,0x68,0x07,0x46,0x4c,0x30,0x30,0x32,0x35,0x68,0x07,0x46,0x4c,0x30,
-0x30,0x32,0x37,0x68,0x0b,0x68,0x79,0x70,0x68,0x65,0x6e,0x6d,0x69,0x6e,0x75,0x73,
-0x07,0x46,0x4c,0x30,0x30,0x36,0x41,0x68,0x07,0x46,0x4c,0x30,0x30,0x36,0x46,0x68,
-0x02,0x56,0x76,0x07,0x46,0x4c,0x30,0x30,0x37,0x39,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x37,0x45,0x68,0x07,0x46,0x4c,0x32,0x30,0x41,0x43,0x68,0x07,0x46,0x4c,0x32,0x30,
-0x31,0x41,0x68,0x07,0x46,0x4c,0x30,0x31,0x39,0x32,0x68,0x07,0x46,0x4c,0x32,0x30,
-0x31,0x45,0x68,0x07,0x46,0x4c,0x32,0x30,0x32,0x36,0x68,0x07,0x46,0x4c,0x32,0x30,
-0x32,0x30,0x68,0x07,0x46,0x4c,0x32,0x30,0x32,0x31,0x68,0x07,0x46,0x4c,0x30,0x32,
-0x43,0x36,0x68,0x07,0x46,0x4c,0x32,0x30,0x33,0x30,0x68,0x07,0x46,0x4c,0x30,0x31,
-0x36,0x30,0x68,0x07,0x46,0x4c,0x32,0x30,0x33,0x39,0x68,0x07,0x46,0x4c,0x30,0x31,
-0x35,0x32,0x68,0x07,0x46,0x4c,0x30,0x31,0x37,0x44,0x68,0x07,0x46,0x4c,0x32,0x30,
-0x32,0x32,0x68,0x07,0x46,0x4c,0x32,0x30,0x31,0x33,0x68,0x07,0x46,0x4c,0x32,0x30,
-0x31,0x34,0x68,0x07,0x46,0x4c,0x30,0x32,0x44,0x43,0x68,0x07,0x46,0x4c,0x32,0x31,
-0x32,0x32,0x68,0x07,0x46,0x4c,0x30,0x31,0x36,0x31,0x68,0x07,0x46,0x4c,0x32,0x30,
-0x33,0x41,0x68,0x07,0x46,0x4c,0x30,0x31,0x35,0x33,0x68,0x07,0x46,0x4c,0x30,0x31,
-0x37,0x45,0x68,0x07,0x46,0x4c,0x30,0x31,0x37,0x38,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x41,0x30,0x68,0x07,0x46,0x4c,0x30,0x30,0x41,0x31,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x41,0x32,0x68,0x07,0x46,0x4c,0x30,0x30,0x41,0x34,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x41,0x35,0x68,0x07,0x46,0x4c,0x30,0x30,0x41,0x36,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x41,0x37,0x68,0x07,0x46,0x4c,0x30,0x30,0x41,0x38,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x41,0x39,0x68,0x07,0x46,0x4c,0x30,0x30,0x41,0x41,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x41,0x42,0x68,0x07,0x46,0x4c,0x30,0x30,0x41,0x43,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x41,0x44,0x68,0x07,0x46,0x4c,0x30,0x30,0x41,0x45,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x41,0x46,0x68,0x07,0x46,0x4c,0x30,0x30,0x42,0x30,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x42,0x31,0x68,0x07,0x46,0x4c,0x30,0x30,0x42,0x32,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x42,0x33,0x68,0x07,0x46,0x4c,0x30,0x30,0x42,0x34,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x42,0x35,0x68,0x07,0x46,0x4c,0x30,0x30,0x42,0x36,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x42,0x37,0x68,0x07,0x46,0x4c,0x30,0x30,0x42,0x38,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x42,0x39,0x68,0x07,0x46,0x4c,0x30,0x30,0x42,0x41,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x42,0x42,0x68,0x07,0x46,0x4c,0x30,0x30,0x42,0x43,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x42,0x44,0x68,0x07,0x46,0x4c,0x30,0x30,0x42,0x45,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x42,0x46,0x68,0x07,0x46,0x4c,0x30,0x30,0x43,0x30,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x43,0x31,0x68,0x07,0x46,0x4c,0x30,0x30,0x43,0x32,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x43,0x33,0x68,0x07,0x46,0x4c,0x30,0x30,0x43,0x34,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x43,0x35,0x68,0x07,0x46,0x4c,0x30,0x30,0x43,0x36,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x43,0x37,0x68,0x07,0x46,0x4c,0x30,0x30,0x43,0x38,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x43,0x39,0x68,0x07,0x46,0x4c,0x30,0x30,0x43,0x41,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x43,0x42,0x68,0x07,0x46,0x4c,0x30,0x30,0x43,0x43,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x43,0x44,0x68,0x07,0x46,0x4c,0x30,0x30,0x43,0x45,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x43,0x46,0x68,0x07,0x46,0x4c,0x30,0x30,0x44,0x30,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x44,0x31,0x68,0x07,0x46,0x4c,0x30,0x30,0x44,0x32,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x44,0x33,0x68,0x07,0x46,0x4c,0x30,0x30,0x44,0x34,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x44,0x35,0x68,0x07,0x46,0x4c,0x30,0x30,0x44,0x36,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x44,0x37,0x68,0x07,0x46,0x4c,0x30,0x30,0x44,0x38,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x44,0x39,0x68,0x07,0x46,0x4c,0x30,0x30,0x44,0x41,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x44,0x42,0x68,0x07,0x46,0x4c,0x30,0x30,0x44,0x43,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x44,0x44,0x68,0x07,0x46,0x4c,0x30,0x30,0x44,0x45,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x44,0x46,0x68,0x07,0x46,0x4c,0x30,0x30,0x45,0x30,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x45,0x31,0x68,0x07,0x46,0x4c,0x30,0x30,0x45,0x32,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x45,0x33,0x68,0x07,0x46,0x4c,0x30,0x30,0x45,0x34,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x45,0x35,0x68,0x07,0x46,0x4c,0x30,0x30,0x45,0x36,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x45,0x37,0x68,0x07,0x46,0x4c,0x30,0x30,0x45,0x38,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x45,0x39,0x68,0x07,0x46,0x4c,0x30,0x30,0x45,0x41,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x45,0x42,0x68,0x07,0x46,0x4c,0x30,0x30,0x45,0x43,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x45,0x44,0x68,0x07,0x46,0x4c,0x30,0x30,0x45,0x45,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x45,0x46,0x68,0x07,0x46,0x4c,0x30,0x30,0x46,0x30,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x46,0x31,0x68,0x07,0x46,0x4c,0x30,0x30,0x46,0x33,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x46,0x34,0x68,0x07,0x46,0x4c,0x30,0x30,0x46,0x35,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x46,0x36,0x68,0x07,0x46,0x4c,0x30,0x30,0x46,0x37,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x46,0x38,0x68,0x07,0x46,0x4c,0x30,0x30,0x46,0x39,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x46,0x41,0x68,0x07,0x46,0x4c,0x30,0x30,0x46,0x42,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x46,0x43,0x68,0x07,0x46,0x4c,0x30,0x30,0x46,0x45,0x68,0x07,0x46,0x4c,0x30,0x30,
-0x46,0x46,0x68,0x00,0xb8,0x00,0x1e,0x2b,0xb8,0x00,0x14,0x2b,0xb8,0x00,0x0a,0x2b,
-0x40,0x0f,0x0a,0x0a,0x09,0x09,0x08,0x08,0x03,0x03,0x02,0x02,0x01,0x01,0x00,0x00,
-0x01,0x8d,0xb8,0x01,0xff,0x85,0x45,0x68,0x44,0x45,0x68,0x44,0x45,0x68,0x44,0x45,
-0x68,0x44,0x45,0x68,0x44,0x45,0x68,0x44,0x45,0x68,0x44,0xb3,0x05,0x04,0x46,0x00,
-0x2b,0xb3,0x07,0x06,0x46,0x00,0x2b,0xb1,0x04,0x04,0x45,0x68,0x44,0xb1,0x06,0x06,
-0x45,0x68,0x44,0x00};
diff --git a/client/gui/commonwealth-10.font.c b/client/gui/commonwealth-10.font.c
deleted file mode 100644
index ee05ab82..00000000
--- a/client/gui/commonwealth-10.font.c
+++ /dev/null
@@ -1,12 +0,0 @@
-const unsigned char commonwealth_10_font[] = {
-0x3c,0x3f,0x78,0x6d,0x6c,0x20,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x31,
-0x2e,0x30,0x22,0x20,0x3f,0x3e,0x0a,0x3c,0x46,0x6f,0x6e,0x74,0x20,0x4e,0x61,0x6d,
-0x65,0x3d,0x22,0x43,0x6f,0x6d,0x6d,0x6f,0x6e,0x77,0x65,0x61,0x6c,0x74,0x68,0x2d,
-0x31,0x30,0x22,0x20,0x46,0x69,0x6c,0x65,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x43,0x6f,
-0x6d,0x6d,0x6f,0x6e,0x76,0x32,0x63,0x2e,0x74,0x74,0x66,0x22,0x20,0x54,0x79,0x70,
-0x65,0x3d,0x22,0x46,0x72,0x65,0x65,0x54,0x79,0x70,0x65,0x22,0x20,0x53,0x69,0x7a,
-0x65,0x3d,0x22,0x31,0x30,0x22,0x20,0x4e,0x61,0x74,0x69,0x76,0x65,0x48,0x6f,0x72,
-0x7a,0x52,0x65,0x73,0x3d,0x22,0x38,0x30,0x30,0x22,0x20,0x4e,0x61,0x74,0x69,0x76,
-0x65,0x56,0x65,0x72,0x74,0x52,0x65,0x73,0x3d,0x22,0x36,0x30,0x30,0x22,0x20,0x41,
-0x75,0x74,0x6f,0x53,0x63,0x61,0x6c,0x65,0x64,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,
-0x2f,0x3e,0x0a};
diff --git a/client/gui/dejavu_sans-10.font.c b/client/gui/dejavu_sans-10.font.c
deleted file mode 100644
index 76939bb5..00000000
--- a/client/gui/dejavu_sans-10.font.c
+++ /dev/null
@@ -1,12 +0,0 @@
-const unsigned char dejavu_sans_10_font[] = {
-0x3c,0x3f,0x78,0x6d,0x6c,0x20,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x31,
-0x2e,0x30,0x22,0x20,0x3f,0x3e,0x0a,0x3c,0x46,0x6f,0x6e,0x74,0x20,0x4e,0x61,0x6d,
-0x65,0x3d,0x22,0x44,0x65,0x6a,0x61,0x56,0x75,0x53,0x61,0x6e,0x73,0x2d,0x31,0x30,
-0x22,0x20,0x46,0x69,0x6c,0x65,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x65,0x6a,0x61,
-0x56,0x75,0x53,0x61,0x6e,0x73,0x2e,0x74,0x74,0x66,0x22,0x20,0x54,0x79,0x70,0x65,
-0x3d,0x22,0x46,0x72,0x65,0x65,0x54,0x79,0x70,0x65,0x22,0x20,0x53,0x69,0x7a,0x65,
-0x3d,0x22,0x31,0x30,0x22,0x20,0x4e,0x61,0x74,0x69,0x76,0x65,0x48,0x6f,0x72,0x7a,
-0x52,0x65,0x73,0x3d,0x22,0x38,0x30,0x30,0x22,0x20,0x4e,0x61,0x74,0x69,0x76,0x65,
-0x56,0x65,0x72,0x74,0x52,0x65,0x73,0x3d,0x22,0x36,0x30,0x30,0x22,0x20,0x41,0x75,
-0x74,0x6f,0x53,0x63,0x61,0x6c,0x65,0x64,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x2f,
-0x3e,0x0a};
diff --git a/client/gui/dejavu_sans.ttf.c b/client/gui/dejavu_sans.ttf.c
deleted file mode 100644
index ae3b59a8..00000000
--- a/client/gui/dejavu_sans.ttf.c
+++ /dev/null
@@ -1,25487 +0,0 @@
-const unsigned char dejavu_sans_ttf[] = {
-0x00,0x01,0x00,0x00,0x00,0x15,0x01,0x00,0x00,0x04,0x00,0x50,0x47,0x44,0x45,0x46,
-0xdf,0x70,0xe7,0x23,0x00,0x00,0x01,0x5c,0x00,0x00,0x03,0x12,0x47,0x50,0x4f,0x53,
-0x27,0x66,0xd7,0x63,0x00,0x00,0x04,0x70,0x00,0x00,0x5c,0x90,0x47,0x53,0x55,0x42,
-0xfd,0xcf,0xee,0xf4,0x00,0x00,0x61,0x00,0x00,0x00,0x0f,0x8e,0x4f,0x53,0x2f,0x32,
-0x87,0xcb,0x3e,0xe7,0x00,0x00,0x70,0x90,0x00,0x00,0x00,0x56,0x63,0x6d,0x61,0x70,
-0x76,0xa3,0x4c,0xbd,0x00,0x00,0x70,0xe8,0x00,0x00,0x06,0x12,0x63,0x76,0x74,0x20,
-0xff,0xd3,0x1d,0x39,0x00,0x00,0x76,0xfc,0x00,0x00,0x01,0xfc,0x66,0x65,0x61,0x74,
-0x80,0x1d,0x0b,0x53,0x00,0x00,0x78,0xf8,0x00,0x00,0x00,0x54,0x66,0x70,0x67,0x6d,
-0x71,0x34,0x76,0x6a,0x00,0x00,0x79,0x4c,0x00,0x00,0x00,0xab,0x67,0x61,0x73,0x70,
-0x00,0x07,0x00,0x07,0x00,0x00,0x79,0xf8,0x00,0x00,0x00,0x0c,0x67,0x6c,0x79,0x66,
-0x5f,0x04,0x73,0x7d,0x00,0x00,0x7a,0x04,0x00,0x04,0x47,0x30,0x68,0x65,0x61,0x64,
-0xe5,0x5d,0xbe,0xbe,0x00,0x04,0xc1,0x34,0x00,0x00,0x00,0x36,0x68,0x68,0x65,0x61,
-0x0c,0xb8,0x14,0x9e,0x00,0x04,0xc1,0x6c,0x00,0x00,0x00,0x24,0x68,0x6d,0x74,0x78,
-0x6d,0xa1,0x6d,0x94,0x00,0x04,0xc1,0x90,0x00,0x00,0x30,0xc4,0x6b,0x65,0x72,0x6e,
-0x44,0xe1,0xd8,0xaf,0x00,0x04,0xf2,0x54,0x00,0x00,0x3c,0x06,0x6c,0x6f,0x63,0x61,
-0x16,0xd8,0x21,0x54,0x00,0x05,0x2e,0x5c,0x00,0x00,0x30,0xc8,0x6d,0x61,0x78,0x70,
-0x10,0x9a,0x09,0xa8,0x00,0x05,0x5f,0x24,0x00,0x00,0x00,0x20,0x6d,0x6f,0x72,0x78,
-0x9f,0x1f,0x5d,0x4b,0x00,0x05,0x5f,0x44,0x00,0x00,0x35,0xd4,0x6e,0x61,0x6d,0x65,
-0xb9,0x95,0x22,0x55,0x00,0x05,0x95,0x18,0x00,0x00,0x25,0xcb,0x70,0x6f,0x73,0x74,
-0xfb,0x29,0x8a,0xe3,0x00,0x05,0xba,0xe4,0x00,0x00,0x75,0xb2,0x70,0x72,0x65,0x70,
-0x3b,0x07,0xf1,0x00,0x00,0x06,0x30,0x98,0x00,0x00,0x05,0x68,0x70,0x72,0x6f,0x70,
-0x0d,0xd5,0x62,0x62,0x00,0x06,0x36,0x00,0x00,0x00,0x02,0xd8,0x00,0x01,0x00,0x00,
-0x00,0x0c,0x00,0x00,0x03,0x0a,0x00,0x00,0x00,0x02,0x00,0x7f,0x00,0x03,0x00,0x69,
-0x00,0x01,0x00,0x6a,0x00,0x6a,0x00,0x02,0x00,0x6b,0x00,0x70,0x00,0x01,0x00,0x71,
-0x00,0x71,0x00,0x02,0x00,0x72,0x00,0x75,0x00,0x01,0x00,0x76,0x00,0x76,0x00,0x02,
-0x00,0x77,0x00,0x79,0x00,0x01,0x00,0x7a,0x00,0x7a,0x00,0x02,0x00,0x7b,0x00,0x7d,
-0x00,0x01,0x00,0x7e,0x00,0x80,0x00,0x02,0x00,0x81,0x00,0x81,0x00,0x01,0x00,0x82,
-0x00,0x87,0x00,0x02,0x00,0x88,0x00,0x88,0x00,0x01,0x00,0x89,0x00,0x91,0x00,0x02,
-0x00,0x92,0x00,0x92,0x00,0x01,0x00,0x93,0x00,0x98,0x00,0x02,0x00,0x99,0x00,0x9a,
-0x00,0x01,0x00,0x9b,0x00,0x9f,0x00,0x02,0x00,0xa0,0x00,0xa1,0x00,0x01,0x00,0xa2,
-0x00,0xa7,0x00,0x02,0x00,0xa8,0x00,0xa8,0x00,0x01,0x00,0xa9,0x00,0xa9,0x00,0x02,
-0x00,0xaa,0x00,0xad,0x00,0x01,0x00,0xae,0x00,0xb1,0x00,0x02,0x00,0xb2,0x00,0xb2,
-0x00,0x01,0x00,0xb3,0x00,0xb8,0x00,0x02,0x00,0xb9,0x00,0xba,0x00,0x01,0x00,0xbb,
-0x00,0xbf,0x00,0x02,0x00,0xc0,0x00,0xc0,0x00,0x01,0x00,0xc1,0x00,0xc1,0x00,0x02,
-0x00,0xc2,0x00,0xc7,0x00,0x01,0x00,0xc8,0x00,0xc9,0x00,0x02,0x00,0xca,0x00,0xcd,
-0x00,0x01,0x00,0xce,0x00,0xd1,0x00,0x02,0x00,0xd2,0x00,0xdb,0x00,0x01,0x00,0xdc,
-0x00,0xdd,0x00,0x02,0x00,0xde,0x00,0xdf,0x00,0x01,0x00,0xe0,0x00,0xe1,0x00,0x02,
-0x00,0xe2,0x00,0xf1,0x00,0x01,0x00,0xf2,0x00,0xf2,0x00,0x02,0x00,0xf3,0x00,0xfa,
-0x00,0x01,0x00,0xfb,0x00,0xfc,0x00,0x02,0x00,0xfd,0x00,0xfe,0x00,0x01,0x00,0xff,
-0x01,0x02,0x00,0x02,0x01,0x03,0x01,0x08,0x00,0x01,0x01,0x09,0x01,0x0b,0x00,0x02,
-0x01,0x0c,0x01,0x15,0x00,0x01,0x01,0x16,0x01,0x17,0x00,0x02,0x01,0x18,0x01,0x19,
-0x00,0x01,0x01,0x1a,0x01,0x1b,0x00,0x02,0x01,0x1c,0x01,0x1f,0x00,0x01,0x01,0x20,
-0x01,0x23,0x00,0x02,0x01,0x24,0x01,0x25,0x00,0x01,0x01,0x26,0x01,0x27,0x00,0x02,
-0x01,0x28,0x01,0x2f,0x00,0x01,0x01,0x30,0x01,0x31,0x00,0x02,0x01,0x32,0x01,0x39,
-0x00,0x01,0x01,0x3a,0x01,0x3a,0x00,0x02,0x01,0x3b,0x01,0x3e,0x00,0x01,0x01,0x3f,
-0x01,0x40,0x00,0x02,0x01,0x41,0x01,0x8e,0x00,0x01,0x01,0x8f,0x01,0x96,0x00,0x02,
-0x01,0x97,0x02,0x8b,0x00,0x01,0x02,0x8c,0x02,0x91,0x00,0x02,0x02,0x92,0x02,0xa2,
-0x00,0x01,0x02,0xa3,0x02,0xb7,0x00,0x03,0x02,0xb8,0x02,0xb8,0x00,0x01,0x02,0xb9,
-0x02,0xbc,0x00,0x03,0x02,0xbd,0x02,0xbe,0x00,0x01,0x02,0xbf,0x02,0xc3,0x00,0x03,
-0x02,0xc4,0x02,0xc5,0x00,0x01,0x02,0xc6,0x02,0xc9,0x00,0x03,0x02,0xca,0x02,0xcb,
-0x00,0x01,0x02,0xcc,0x02,0xd6,0x00,0x03,0x02,0xd7,0x02,0xdb,0x00,0x01,0x02,0xdc,
-0x02,0xe5,0x00,0x03,0x02,0xe6,0x02,0xe6,0x00,0x01,0x02,0xe7,0x02,0xe7,0x00,0x03,
-0x02,0xe8,0x02,0xe8,0x00,0x01,0x02,0xe9,0x02,0xf5,0x00,0x03,0x02,0xf6,0x04,0xd2,
-0x00,0x01,0x04,0xd3,0x04,0xd3,0x00,0x02,0x04,0xd4,0x04,0xd6,0x00,0x01,0x04,0xd7,
-0x04,0xd7,0x00,0x03,0x04,0xd8,0x04,0xda,0x00,0x01,0x04,0xdb,0x04,0xdf,0x00,0x02,
-0x04,0xe0,0x04,0xfe,0x00,0x01,0x04,0xff,0x05,0x09,0x00,0x03,0x05,0x0a,0x06,0x20,
-0x00,0x01,0x06,0x21,0x06,0x21,0x00,0x02,0x06,0x22,0x07,0x86,0x00,0x01,0x07,0x87,
-0x07,0x87,0x00,0x02,0x07,0x88,0x07,0x8b,0x00,0x01,0x07,0x8c,0x07,0x8d,0x00,0x02,
-0x07,0x8e,0x07,0x8e,0x00,0x01,0x07,0x8f,0x07,0x90,0x00,0x02,0x07,0x91,0x07,0x94,
-0x00,0x01,0x07,0x95,0x07,0x95,0x00,0x02,0x07,0x96,0x07,0x9f,0x00,0x01,0x07,0xa0,
-0x07,0xa2,0x00,0x02,0x07,0xa3,0x07,0xdc,0x00,0x01,0x07,0xdd,0x07,0xdd,0x00,0x02,
-0x07,0xde,0x07,0xe7,0x00,0x01,0x07,0xe8,0x07,0xe8,0x00,0x02,0x07,0xe9,0x07,0xea,
-0x00,0x01,0x07,0xeb,0x07,0xed,0x00,0x02,0x07,0xee,0x07,0xf7,0x00,0x01,0x07,0xf8,
-0x07,0xf9,0x00,0x02,0x07,0xfa,0x08,0x02,0x00,0x01,0x08,0x03,0x08,0x03,0x00,0x02,
-0x08,0x04,0x08,0x04,0x00,0x01,0x08,0x05,0x08,0x11,0x00,0x02,0x08,0x12,0x08,0xc7,
-0x00,0x01,0x08,0xc8,0x08,0xc8,0x00,0x02,0x08,0xc9,0x09,0x10,0x00,0x01,0x09,0x11,
-0x09,0x1a,0x00,0x02,0x09,0x1b,0x0b,0x09,0x00,0x01,0x0b,0x0a,0x0b,0x15,0x00,0x02,
-0x0b,0x16,0x0b,0x59,0x00,0x01,0x0b,0x5a,0x0b,0x5c,0x00,0x02,0x0b,0x5d,0x0b,0x5d,
-0x00,0x01,0x0b,0x5e,0x0b,0x68,0x00,0x02,0x0b,0x69,0x0b,0xdd,0x00,0x01,0x0b,0xde,
-0x0b,0xe5,0x00,0x02,0x0b,0xe6,0x0b,0xe8,0x00,0x01,0x0b,0xe9,0x0b,0xf3,0x00,0x03,
-0x0b,0xf4,0x0c,0x30,0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,
-0x00,0x01,0x00,0x00,0x00,0x0a,0x00,0x7e,0x00,0xc2,0x00,0x06,0x44,0x46,0x4c,0x54,
-0x00,0x26,0x61,0x72,0x61,0x62,0x00,0x30,0x61,0x72,0x6d,0x6e,0x00,0x3e,0x63,0x79,
-0x72,0x6c,0x00,0x48,0x67,0x72,0x65,0x6b,0x00,0x56,0x6c,0x61,0x74,0x6e,0x00,0x64,
-0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,
-0xff,0xff,0x00,0x02,0x00,0x01,0x00,0x03,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,
-0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x02,0x00,0x02,0x00,0x04,
-0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x04,
-0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x05,
-0x6b,0x65,0x72,0x6e,0x00,0x20,0x6d,0x61,0x72,0x6b,0x00,0x26,0x6d,0x61,0x72,0x6b,
-0x00,0x2e,0x6d,0x6b,0x6d,0x6b,0x00,0x36,0x6d,0x6b,0x6d,0x6b,0x00,0x3c,0x00,0x00,
-0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x02,
-0x00,0x03,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x05,0x00,0x00,0x00,0x02,0x00,0x06,
-0x00,0x07,0x00,0x08,0x00,0x12,0x00,0x1a,0x00,0x24,0x00,0x2e,0x00,0x36,0x00,0x40,
-0x00,0x4a,0x00,0x52,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x48,0x00,0x05,0x00,0x01,
-0x00,0x02,0x53,0xe2,0x49,0x38,0x00,0x04,0x00,0x01,0x00,0x02,0x4a,0x10,0x3f,0xae,
-0x00,0x05,0x00,0x00,0x00,0x01,0x3d,0xfa,0x00,0x04,0x00,0x00,0x00,0x02,0x36,0xbe,
-0x2a,0x5e,0x00,0x06,0x00,0x01,0x00,0x02,0x5b,0x34,0x5a,0x56,0x00,0x06,0x00,0x00,
-0x00,0x01,0x56,0xd8,0x00,0x04,0x00,0x00,0x00,0x01,0x54,0xd4,0x00,0x01,0x29,0x7a,
-0x00,0x04,0x00,0x00,0x00,0x5e,0x00,0xc6,0x01,0x60,0x03,0x06,0x03,0xbc,0x03,0xe2,
-0x04,0x38,0x05,0x7a,0x05,0xa4,0x05,0xb6,0x05,0xe8,0x06,0xda,0x07,0xa0,0x07,0xea,
-0x08,0xb4,0x08,0xc6,0x09,0x9c,0x09,0xb6,0x0a,0xa4,0x0a,0xae,0x0b,0x6c,0x0c,0x22,
-0x0c,0x80,0x0d,0x4a,0x0d,0x5c,0x0d,0x62,0x0d,0x98,0x0e,0x0a,0x0e,0x18,0x0e,0x32,
-0x0e,0xc4,0x0e,0xe2,0x0e,0xf8,0x0f,0x3a,0x0f,0x54,0x0f,0xb2,0x10,0x38,0x11,0xaa,
-0x13,0x20,0x14,0x96,0x16,0x08,0x17,0x7e,0x17,0x8c,0x17,0xa6,0x17,0xfc,0x18,0x46,
-0x18,0x90,0x18,0xda,0x19,0x24,0x19,0x6e,0x19,0x78,0x19,0x82,0x19,0x8c,0x19,0x96,
-0x1a,0x60,0x1a,0x72,0x1a,0x84,0x1a,0x8a,0x1a,0x90,0x1a,0x96,0x1a,0x9c,0x1a,0xaa,
-0x1a,0xb8,0x1a,0xd2,0x1a,0xec,0x1b,0x06,0x1b,0x20,0x1b,0x3a,0x1b,0x54,0x1b,0x6e,
-0x1c,0xd8,0x1e,0x42,0x1f,0x94,0x1f,0xae,0x1f,0xc8,0x20,0x1e,0x20,0x5c,0x20,0x62,
-0x20,0x8c,0x21,0x52,0x22,0x18,0x22,0x1e,0x22,0x2c,0x23,0x02,0x23,0x94,0x24,0x6a,
-0x24,0xfc,0x25,0x16,0x25,0x30,0x26,0x1e,0x26,0x28,0x26,0xf2,0x27,0x04,0x27,0x92,
-0x28,0x7c,0x00,0x26,0x00,0x24,0xff,0xd3,0x00,0x25,0xff,0xb7,0x00,0x2a,0x00,0x4b,
-0x00,0x2d,0x00,0x72,0x00,0x32,0x00,0x39,0x00,0x34,0x00,0x4b,0x00,0x37,0xff,0x44,
-0x00,0x39,0xff,0x88,0x00,0x3a,0xff,0xad,0x00,0x3b,0xff,0x9a,0x00,0x3c,0xff,0x0d,
-0x00,0x52,0x00,0x26,0x00,0x59,0xff,0xc9,0x00,0x5c,0xff,0xdc,0x00,0x82,0xff,0xd3,
-0x00,0x83,0xff,0xd3,0x00,0x84,0xff,0xd3,0x00,0x85,0xff,0xd3,0x00,0x86,0xff,0xd3,
-0x00,0x94,0x00,0x39,0x00,0x95,0x00,0x39,0x00,0x96,0x00,0x39,0x00,0x97,0x00,0x39,
-0x00,0x98,0x00,0x39,0x00,0x9f,0xff,0x0d,0x00,0xb4,0x00,0x26,0x00,0xb5,0x00,0x26,
-0x00,0xb6,0x00,0x26,0x00,0xb7,0x00,0x26,0x00,0xb8,0x00,0x26,0x00,0xbf,0xff,0xdc,
-0x00,0xc1,0xff,0xdc,0x00,0xc2,0xff,0xd3,0x00,0xc4,0xff,0xd3,0x00,0xc6,0xff,0xd3,
-0x00,0xe0,0x00,0x4b,0x01,0x26,0xff,0x44,0x01,0x3a,0xff,0x0d,0x00,0x69,0x00,0x10,
-0xff,0xd3,0x00,0x11,0xff,0xdc,0x00,0x1d,0xff,0xdc,0x00,0x24,0x00,0x39,0x00,0x26,
-0xff,0xdc,0x00,0x2a,0xff,0xdc,0x00,0x32,0xff,0xdc,0x00,0x34,0xff,0xdc,0x00,0x37,
-0xff,0x61,0x00,0x39,0xff,0x7d,0x00,0x3a,0xff,0x90,0x00,0x3c,0xff,0x61,0x00,0x46,
-0xff,0xdc,0x00,0x47,0xff,0xdc,0x00,0x48,0xff,0xdc,0x00,0x49,0xff,0xb7,0x00,0x52,
-0xff,0xdc,0x00,0x54,0xff,0xdc,0x00,0x57,0xff,0xdc,0x00,0x59,0xff,0x88,0x00,0x5a,
-0xff,0xad,0x00,0x5c,0xff,0x75,0x00,0x6d,0xff,0xb7,0x00,0x82,0x00,0x39,0x00,0x83,
-0x00,0x39,0x00,0x84,0x00,0x39,0x00,0x85,0x00,0x39,0x00,0x86,0x00,0x39,0x00,0x89,
-0xff,0xdc,0x00,0x94,0xff,0xdc,0x00,0x95,0xff,0xdc,0x00,0x96,0xff,0xdc,0x00,0x97,
-0xff,0xdc,0x00,0x98,0xff,0xdc,0x00,0x9f,0xff,0x61,0x00,0xa9,0xff,0xdc,0x00,0xaa,
-0xff,0xdc,0x00,0xab,0xff,0xdc,0x00,0xac,0xff,0xdc,0x00,0xad,0xff,0xdc,0x00,0xb4,
-0xff,0xdc,0x00,0xb5,0xff,0xdc,0x00,0xb6,0xff,0xdc,0x00,0xb7,0xff,0xdc,0x00,0xb8,
-0xff,0xdc,0x00,0xbf,0xff,0x75,0x00,0xc1,0xff,0x75,0x00,0xc2,0x00,0x39,0x00,0xc4,
-0x00,0x39,0x00,0xc6,0x00,0x39,0x00,0xc8,0xff,0xdc,0x00,0xc9,0xff,0xdc,0x00,0xca,
-0xff,0xdc,0x00,0xcb,0xff,0xdc,0x00,0xcc,0xff,0xdc,0x00,0xcd,0xff,0xdc,0x00,0xce,
-0xff,0xdc,0x00,0xcf,0xff,0xdc,0x00,0xd1,0xff,0xdc,0x00,0xd3,0xff,0xdc,0x00,0xd5,
-0xff,0xdc,0x00,0xd7,0xff,0xdc,0x00,0xd9,0xff,0xdc,0x00,0xdb,0xff,0xdc,0x00,0xdd,
-0xff,0xdc,0x00,0xde,0xff,0xdc,0x00,0xe0,0xff,0xdc,0x00,0xe2,0xff,0xdc,0x01,0x0e,
-0xff,0xdc,0x01,0x0f,0xff,0xdc,0x01,0x10,0xff,0xdc,0x01,0x11,0xff,0xdc,0x01,0x12,
-0xff,0xdc,0x01,0x13,0xff,0xdc,0x01,0x24,0xff,0x61,0x01,0x25,0xff,0xdc,0x01,0x26,
-0xff,0x61,0x01,0x27,0xff,0xdc,0x01,0x36,0xff,0x90,0x01,0x37,0xff,0xad,0x01,0x38,
-0xff,0x61,0x01,0x39,0xff,0x75,0x01,0x3a,0xff,0x61,0x01,0x88,0xff,0xdc,0x01,0xac,
-0xff,0xdc,0x01,0xad,0xff,0xdc,0x01,0xae,0xff,0xdc,0x01,0xaf,0xff,0xdc,0x01,0xdc,
-0xff,0x61,0x01,0xdd,0xff,0xdc,0x01,0xf0,0xff,0xdc,0x01,0xf3,0xff,0xdc,0x01,0xf4,
-0xff,0x61,0x01,0xf5,0xff,0x75,0x06,0x07,0xff,0x90,0x06,0x08,0xff,0xad,0x06,0x09,
-0xff,0x90,0x06,0x0a,0xff,0xad,0x06,0x0b,0xff,0x90,0x06,0x0c,0xff,0xad,0x06,0x75,
-0xff,0x61,0x06,0x76,0xff,0x75,0x07,0x7d,0xfe,0xf8,0x07,0x7e,0xff,0x03,0x07,0x7f,
-0x00,0x2f,0x00,0x2d,0x00,0x26,0xff,0xdc,0x00,0x2a,0xff,0xdc,0x00,0x32,0xff,0xdc,
-0x00,0x36,0xff,0xdc,0x00,0x39,0xff,0xc1,0x00,0x3a,0xff,0xb7,0x00,0x3c,0xff,0x90,
-0x00,0x6d,0xff,0xc1,0x00,0x7d,0xff,0xdc,0x00,0x89,0xff,0xdc,0x00,0x94,0xff,0xdc,
-0x00,0x95,0xff,0xdc,0x00,0x96,0xff,0xdc,0x00,0x97,0xff,0xdc,0x00,0x98,0xff,0xdc,
-0x00,0x9f,0xff,0x90,0x00,0xc8,0xff,0xdc,0x00,0xca,0xff,0xdc,0x00,0xcc,0xff,0xdc,
-0x00,0xce,0xff,0xdc,0x00,0xde,0xff,0xdc,0x00,0xe0,0xff,0xdc,0x00,0xe2,0xff,0xdc,
-0x00,0xe4,0xff,0xdc,0x01,0x0e,0xff,0xdc,0x01,0x10,0xff,0xdc,0x01,0x12,0xff,0xdc,
-0x01,0x1c,0xff,0xdc,0x01,0x1e,0xff,0xdc,0x01,0x20,0xff,0xdc,0x01,0x22,0xff,0xdc,
-0x01,0x36,0xff,0xb7,0x01,0x38,0xff,0x90,0x01,0x3a,0xff,0x90,0x01,0xac,0xff,0xdc,
-0x01,0xae,0xff,0xdc,0x01,0xda,0xff,0xdc,0x01,0xf0,0xff,0xdc,0x06,0x07,0xff,0xb7,
-0x06,0x09,0xff,0xb7,0x06,0x0b,0xff,0xb7,0x06,0x75,0xff,0x90,0x07,0x7d,0xff,0x90,
-0x07,0x7e,0xff,0x90,0x07,0x7f,0xff,0xad,0x00,0x09,0x00,0x3c,0xff,0xdc,0x00,0x6d,
-0xff,0xdc,0x00,0x7d,0xff,0xdc,0x00,0x9f,0xff,0xdc,0x01,0x38,0xff,0xdc,0x01,0x3a,
-0xff,0xdc,0x01,0xf4,0xff,0xdc,0x06,0x75,0xff,0xdc,0x07,0x7e,0x00,0x26,0x00,0x15,
-0x00,0x24,0xff,0xdc,0x00,0x39,0xff,0xdc,0x00,0x3c,0xff,0x90,0x00,0x6d,0xff,0xdc,
-0x00,0x7d,0xff,0xdc,0x00,0x82,0xff,0xdc,0x00,0x83,0xff,0xdc,0x00,0x84,0xff,0xdc,
-0x00,0x85,0xff,0xdc,0x00,0x86,0xff,0xdc,0x00,0x9f,0xff,0x90,0x00,0xc2,0xff,0xdc,
-0x00,0xc4,0xff,0xdc,0x00,0xc6,0xff,0xdc,0x01,0x38,0xff,0x90,0x01,0x3a,0xff,0x90,
-0x01,0xf4,0xff,0x90,0x06,0x75,0xff,0x90,0x07,0x7d,0xff,0xd3,0x07,0x7e,0xff,0xc9,
-0x07,0x7f,0xff,0x44,0x00,0x50,0x00,0x11,0xfe,0xb7,0x00,0x1d,0xff,0x61,0x00,0x24,
-0xff,0x44,0x00,0x36,0xff,0xdc,0x00,0x37,0xff,0xdc,0x00,0x44,0xff,0x44,0x00,0x48,
-0xff,0x90,0x00,0x4c,0xff,0x6b,0x00,0x52,0xff,0xb7,0x00,0x55,0xff,0x6b,0x00,0x58,
-0xff,0x90,0x00,0x5c,0xff,0x44,0x00,0x82,0xff,0x44,0x00,0x83,0xff,0x44,0x00,0x84,
-0xff,0x44,0x00,0x85,0xff,0x44,0x00,0x86,0xff,0x44,0x00,0xa2,0xff,0x44,0x00,0xa3,
-0xff,0x44,0x00,0xa4,0xff,0x44,0x00,0xa5,0xff,0x44,0x00,0xa6,0xff,0x44,0x00,0xa7,
-0xff,0x44,0x00,0xaa,0xff,0x90,0x00,0xab,0xff,0x90,0x00,0xac,0xff,0x90,0x00,0xad,
-0xff,0x90,0x00,0xb4,0xff,0xb7,0x00,0xb5,0xff,0xb7,0x00,0xb6,0xff,0xb7,0x00,0xb7,
-0xff,0xb7,0x00,0xb8,0xff,0xb7,0x00,0xbb,0xff,0x90,0x00,0xbc,0xff,0x90,0x00,0xbd,
-0xff,0x90,0x00,0xbe,0xff,0x90,0x00,0xbf,0xff,0x44,0x00,0xc1,0xff,0x44,0x00,0xc2,
-0xff,0x44,0x00,0xc3,0xff,0x44,0x00,0xc4,0xff,0x44,0x00,0xc5,0xff,0x44,0x00,0xc6,
-0xff,0x44,0x00,0xc7,0xff,0x44,0x00,0xd5,0xff,0x90,0x00,0xd7,0xff,0x90,0x00,0xd9,
-0xff,0x90,0x00,0xdb,0xff,0x90,0x00,0xdd,0xff,0x90,0x00,0xf1,0xff,0x6b,0x00,0xf5,
-0xff,0x6b,0x01,0x0f,0xff,0xb7,0x01,0x11,0xff,0xb7,0x01,0x13,0xff,0xb7,0x01,0x17,
-0xff,0x6b,0x01,0x19,0xff,0x6b,0x01,0x1b,0xff,0x6b,0x01,0x1c,0xff,0xdc,0x01,0x1e,
-0xff,0xdc,0x01,0x20,0xff,0xdc,0x01,0x22,0xff,0xdc,0x01,0x24,0xff,0xdc,0x01,0x26,
-0xff,0xdc,0x01,0x28,0xff,0xdc,0x01,0x2b,0xff,0x90,0x01,0x2d,0xff,0x90,0x01,0x2f,
-0xff,0x90,0x01,0x31,0xff,0x90,0x01,0x33,0xff,0x90,0x01,0x35,0xff,0x90,0x01,0x39,
-0xff,0x44,0x01,0xad,0xff,0xb7,0x01,0xaf,0xff,0xb7,0x01,0xda,0xff,0xdc,0x01,0xdc,
-0xff,0xdc,0x01,0xf1,0xff,0xb7,0x01,0xf5,0xff,0x44,0x06,0x76,0xff,0x44,0x07,0x7d,
-0xff,0xd3,0x07,0x7f,0xfe,0x88,0x00,0x0a,0x00,0x37,0xff,0xb7,0x00,0x3c,0xff,0x9a,
-0x00,0x6d,0xff,0xdc,0x00,0x7d,0xff,0xdc,0x00,0x9f,0xff,0x9a,0x01,0x26,0xff,0xb7,
-0x01,0x3a,0xff,0x9a,0x07,0x7d,0xff,0xd3,0x07,0x7e,0xff,0xd3,0x07,0x7f,0xff,0xc9,
-0x00,0x04,0x00,0x11,0xff,0xdc,0x07,0x7d,0xff,0xb7,0x07,0x7e,0xff,0xc1,0x07,0x7f,
-0xff,0xb7,0x00,0x0c,0x00,0x10,0xff,0xb7,0x00,0x24,0xff,0xdc,0x00,0x6d,0xff,0xdc,
-0x00,0x7d,0xff,0xdc,0x00,0x82,0xff,0xdc,0x00,0x83,0xff,0xdc,0x00,0x84,0xff,0xdc,
-0x00,0x85,0xff,0xdc,0x00,0x86,0xff,0xdc,0x07,0x7d,0xff,0xb7,0x07,0x7e,0xff,0xc1,
-0x07,0x7f,0xff,0x90,0x00,0x3c,0x00,0x10,0xff,0x29,0x00,0x24,0xff,0xdc,0x00,0x26,
-0xff,0x90,0x00,0x32,0xff,0x90,0x00,0x37,0xff,0x61,0x00,0x38,0xff,0xc9,0x00,0x3a,
-0xff,0xb7,0x00,0x3c,0xff,0xb7,0x00,0x44,0xff,0xdc,0x00,0x48,0xff,0x9a,0x00,0x52,
-0xff,0x9a,0x00,0x58,0xff,0x9a,0x00,0x5c,0xff,0x6b,0x00,0x6d,0xff,0x7d,0x00,0x82,
-0xff,0xdc,0x00,0x83,0xff,0xdc,0x00,0x84,0xff,0xdc,0x00,0x85,0xff,0xdc,0x00,0x86,
-0xff,0xdc,0x00,0x89,0xff,0x90,0x00,0x94,0xff,0x90,0x00,0x95,0xff,0x90,0x00,0x96,
-0xff,0x90,0x00,0x97,0xff,0x90,0x00,0x98,0xff,0x90,0x00,0x9b,0xff,0xc9,0x00,0x9c,
-0xff,0xc9,0x00,0x9d,0xff,0xc9,0x00,0x9e,0xff,0xc9,0x00,0x9f,0xff,0xb7,0x00,0xa2,
-0xff,0xdc,0x00,0xa3,0xff,0xdc,0x00,0xa4,0xff,0xdc,0x00,0xa5,0xff,0xdc,0x00,0xa6,
-0xff,0xdc,0x00,0xa7,0xff,0xdc,0x00,0xaa,0xff,0x9a,0x00,0xab,0xff,0x9a,0x00,0xac,
-0xff,0x9a,0x00,0xad,0xff,0x9a,0x00,0xb4,0xff,0x9a,0x00,0xb5,0xff,0x9a,0x00,0xb6,
-0xff,0x9a,0x00,0xb7,0xff,0x9a,0x00,0xb8,0xff,0x9a,0x00,0xbb,0xff,0x9a,0x00,0xbc,
-0xff,0x9a,0x00,0xbd,0xff,0x9a,0x00,0xbe,0xff,0x9a,0x00,0xbf,0xff,0x6b,0x00,0xc1,
-0xff,0x6b,0x00,0xc8,0xff,0x90,0x00,0xce,0xff,0x90,0x00,0xdd,0xff,0x9a,0x01,0x26,
-0xff,0x61,0x01,0x30,0xff,0xc9,0x01,0x31,0xff,0x9a,0x01,0x3a,0xff,0xb7,0x07,0x7d,
-0xff,0xc1,0x07,0x7e,0xff,0xc1,0x00,0x31,0x00,0x10,0xff,0xdc,0x00,0x24,0x00,0x2f,
-0x00,0x32,0xff,0xb7,0x00,0x37,0xfe,0xe6,0x00,0x38,0xff,0x9a,0x00,0x39,0xff,0x1f,
-0x00,0x3a,0xff,0x44,0x00,0x3c,0xfe,0xf0,0x00,0x48,0xff,0xdc,0x00,0x52,0xff,0xdc,
-0x00,0x58,0xff,0xdc,0x00,0x5c,0xff,0x44,0x00,0x82,0x00,0x2f,0x00,0x83,0x00,0x2f,
-0x00,0x84,0x00,0x2f,0x00,0x85,0x00,0x2f,0x00,0x86,0x00,0x2f,0x00,0x94,0xff,0xb7,
-0x00,0x95,0xff,0xb7,0x00,0x96,0xff,0xb7,0x00,0x97,0xff,0xb7,0x00,0x98,0xff,0xb7,
-0x00,0x9b,0xff,0x9a,0x00,0x9c,0xff,0x9a,0x00,0x9d,0xff,0x9a,0x00,0x9e,0xff,0x9a,
-0x00,0x9f,0xfe,0xf0,0x00,0xaa,0xff,0xdc,0x00,0xab,0xff,0xdc,0x00,0xac,0xff,0xdc,
-0x00,0xad,0xff,0xdc,0x00,0xb4,0xff,0xdc,0x00,0xb5,0xff,0xdc,0x00,0xb6,0xff,0xdc,
-0x00,0xb7,0xff,0xdc,0x00,0xb8,0xff,0xdc,0x00,0xbb,0xff,0xdc,0x00,0xbc,0xff,0xdc,
-0x00,0xbd,0xff,0xdc,0x00,0xbe,0xff,0xdc,0x00,0xbf,0xff,0x44,0x00,0xc1,0xff,0x44,
-0x00,0xdd,0xff,0xdc,0x01,0x26,0xfe,0xe6,0x01,0x30,0xff,0x9a,0x01,0x31,0xff,0xdc,
-0x01,0x3a,0xfe,0xf0,0x07,0x7d,0xfe,0x61,0x07,0x7e,0xfd,0xe6,0x00,0x12,0x00,0x10,
-0x00,0x39,0x00,0x11,0xff,0xad,0x00,0x1d,0xff,0xdc,0x00,0x24,0xff,0xdc,0x00,0x39,
-0xff,0xdc,0x00,0x3b,0xff,0x7d,0x00,0x3c,0xff,0x90,0x00,0x6d,0xff,0xdc,0x00,0x82,
-0xff,0xdc,0x00,0x83,0xff,0xdc,0x00,0x84,0xff,0xdc,0x00,0x85,0xff,0xdc,0x00,0x86,
-0xff,0xdc,0x00,0x9f,0xff,0x90,0x01,0x3a,0xff,0x90,0x07,0x7d,0xff,0xd3,0x07,0x7e,
-0xff,0xdc,0x07,0x7f,0xff,0x44,0x00,0x32,0x00,0x10,0xff,0xd3,0x00,0x11,0xfe,0xc1,
-0x00,0x24,0xff,0x7d,0x00,0x3c,0xff,0xd3,0x00,0x44,0xff,0xa4,0x00,0x48,0xff,0xb7,
-0x00,0x4c,0xff,0xd3,0x00,0x51,0xff,0xdc,0x00,0x52,0xff,0xb7,0x00,0x55,0xff,0xdc,
-0x00,0x56,0xff,0xdc,0x00,0x58,0xff,0xdc,0x00,0x6d,0xff,0xdc,0x00,0x82,0xff,0x7d,
-0x00,0x83,0xff,0x7d,0x00,0x84,0xff,0x7d,0x00,0x85,0xff,0x7d,0x00,0x86,0xff,0x7d,
-0x00,0x9f,0xff,0xd3,0x00,0xa2,0xff,0xa4,0x00,0xa3,0xff,0xa4,0x00,0xa4,0xff,0xa4,
-0x00,0xa5,0xff,0xa4,0x00,0xa6,0xff,0xa4,0x00,0xa7,0xff,0xa4,0x00,0xaa,0xff,0xb7,
-0x00,0xab,0xff,0xb7,0x00,0xac,0xff,0xb7,0x00,0xad,0xff,0xb7,0x00,0xb3,0xff,0xdc,
-0x00,0xb4,0xff,0xb7,0x00,0xb5,0xff,0xb7,0x00,0xb6,0xff,0xb7,0x00,0xb7,0xff,0xb7,
-0x00,0xb8,0xff,0xb7,0x00,0xbb,0xff,0xdc,0x00,0xbc,0xff,0xdc,0x00,0xbd,0xff,0xdc,
-0x00,0xbe,0xff,0xdc,0x00,0xdd,0xff,0xb7,0x01,0x0a,0xff,0xdc,0x01,0x17,0xff,0xdc,
-0x01,0x1b,0xff,0xdc,0x01,0x21,0xff,0xdc,0x01,0x23,0xff,0xdc,0x01,0x31,0xff,0xdc,
-0x01,0x3a,0xff,0xd3,0x07,0x7d,0x00,0x26,0x07,0x7e,0x00,0x26,0x07,0x7f,0xfe,0xb7,
-0x00,0x04,0x00,0x10,0x00,0x39,0x07,0x7d,0xff,0xd3,0x07,0x7e,0xff,0xdc,0x07,0x7f,
-0xff,0x7d,0x00,0x35,0x00,0x10,0xff,0xad,0x00,0x11,0xff,0xb7,0x00,0x1d,0xff,0xc1,
-0x00,0x24,0xff,0xad,0x00,0x26,0xff,0x9a,0x00,0x37,0xff,0x6b,0x00,0x39,0xff,0x90,
-0x00,0x3a,0xff,0xad,0x00,0x3c,0xff,0x7d,0x00,0x44,0xff,0xd3,0x00,0x48,0xff,0xa4,
-0x00,0x52,0xff,0xa4,0x00,0x58,0xff,0xa4,0x00,0x5c,0xff,0x90,0x00,0x6d,0xff,0x90,
-0x00,0x7d,0xff,0xdc,0x00,0x82,0xff,0xad,0x00,0x83,0xff,0xad,0x00,0x84,0xff,0xad,
-0x00,0x85,0xff,0xad,0x00,0x86,0xff,0xad,0x00,0x89,0xff,0x9a,0x00,0x9f,0xff,0x7d,
-0x00,0xa2,0xff,0xd3,0x00,0xa3,0xff,0xd3,0x00,0xa4,0xff,0xd3,0x00,0xa5,0xff,0xd3,
-0x00,0xa6,0xff,0xd3,0x00,0xa7,0xff,0xd3,0x00,0xaa,0xff,0xa4,0x00,0xab,0xff,0xa4,
-0x00,0xac,0xff,0xa4,0x00,0xad,0xff,0xa4,0x00,0xb4,0xff,0xa4,0x00,0xb5,0xff,0xa4,
-0x00,0xb6,0xff,0xa4,0x00,0xb7,0xff,0xa4,0x00,0xb8,0xff,0xa4,0x00,0xbb,0xff,0xa4,
-0x00,0xbc,0xff,0xa4,0x00,0xbd,0xff,0xa4,0x00,0xbe,0xff,0xa4,0x00,0xbf,0xff,0x90,
-0x00,0xc1,0xff,0x90,0x00,0xc8,0xff,0x9a,0x00,0xce,0xff,0x9a,0x00,0xdd,0xff,0xa4,
-0x01,0x26,0xff,0x6b,0x01,0x31,0xff,0xa4,0x01,0x3a,0xff,0x7d,0x07,0x7d,0xff,0x6b,
-0x07,0x7e,0xff,0x7d,0x07,0x7f,0xff,0xdc,0x00,0x06,0x00,0x24,0x00,0x26,0x00,0x82,
-0x00,0x26,0x00,0x83,0x00,0x26,0x00,0x84,0x00,0x26,0x00,0x85,0x00,0x26,0x00,0x86,
-0x00,0x26,0x00,0x3b,0x00,0x10,0xff,0x44,0x00,0x11,0xff,0x0d,0x00,0x1d,0xff,0x1f,
-0x00,0x24,0xff,0x61,0x00,0x26,0xff,0x88,0x00,0x37,0xff,0xdc,0x00,0x44,0xfe,0xad,
-0x00,0x46,0xfe,0xa4,0x00,0x48,0xfe,0xa4,0x00,0x4c,0xff,0xc1,0x00,0x52,0xfe,0xa4,
-0x00,0x55,0xfe,0xd3,0x00,0x56,0xfe,0xad,0x00,0x58,0xfe,0xc9,0x00,0x5a,0xfe,0xad,
-0x00,0x5c,0xfe,0xc1,0x00,0x6d,0xff,0x44,0x00,0x7d,0xff,0x90,0x00,0x82,0xff,0x61,
-0x00,0x83,0xff,0x61,0x00,0x84,0xff,0x61,0x00,0x85,0xff,0x61,0x00,0x86,0xff,0x61,
-0x00,0x89,0xff,0x88,0x00,0xa2,0xfe,0xad,0x00,0xa3,0xfe,0xad,0x00,0xa4,0xfe,0xad,
-0x00,0xa5,0xfe,0xad,0x00,0xa6,0xfe,0xad,0x00,0xa7,0xfe,0xad,0x00,0xa9,0xfe,0xa4,
-0x00,0xaa,0xfe,0xa4,0x00,0xab,0xfe,0xa4,0x00,0xac,0xfe,0xa4,0x00,0xad,0xfe,0xa4,
-0x00,0xb4,0xfe,0xa4,0x00,0xb5,0xfe,0xa4,0x00,0xb6,0xfe,0xa4,0x00,0xb7,0xfe,0xa4,
-0x00,0xb8,0xfe,0xa4,0x00,0xbb,0xfe,0xc9,0x00,0xbc,0xfe,0xc9,0x00,0xbd,0xfe,0xc9,
-0x00,0xbe,0xfe,0xc9,0x00,0xbf,0xfe,0xc1,0x00,0xc1,0xfe,0xc1,0x00,0xc8,0xff,0x88,
-0x00,0xc9,0xfe,0xa4,0x00,0xce,0xff,0x88,0x00,0xcf,0xfe,0xa4,0x00,0xdd,0xfe,0xa4,
-0x01,0x17,0xfe,0xd3,0x01,0x1b,0xfe,0xd3,0x01,0x21,0xfe,0xad,0x01,0x23,0xfe,0xad,
-0x01,0x26,0xff,0xdc,0x01,0x31,0xfe,0xc9,0x07,0x7e,0xff,0xd3,0x07,0x7f,0xfe,0xf8,
-0x00,0x02,0x00,0x3d,0xff,0xdc,0x01,0x3f,0xff,0xdc,0x00,0x2f,0x00,0x10,0xff,0x88,
-0x00,0x11,0xfe,0xf8,0x00,0x1d,0xff,0x59,0x00,0x24,0xff,0x7d,0x00,0x32,0xff,0xdc,
-0x00,0x44,0xff,0x61,0x00,0x48,0xff,0x61,0x00,0x4c,0xff,0xd3,0x00,0x52,0xff,0x61,
-0x00,0x58,0xff,0x75,0x00,0x5c,0xff,0xc9,0x00,0x6d,0xff,0x4e,0x00,0x7d,0xff,0x90,
-0x00,0x82,0xff,0x7d,0x00,0x83,0xff,0x7d,0x00,0x84,0xff,0x7d,0x00,0x85,0xff,0x7d,
-0x00,0x86,0xff,0x7d,0x00,0x94,0xff,0xdc,0x00,0x95,0xff,0xdc,0x00,0x96,0xff,0xdc,
-0x00,0x97,0xff,0xdc,0x00,0x98,0xff,0xdc,0x00,0xa2,0xff,0x61,0x00,0xa3,0xff,0x61,
-0x00,0xa4,0xff,0x61,0x00,0xa5,0xff,0x61,0x00,0xa6,0xff,0x61,0x00,0xa7,0xff,0x61,
-0x00,0xaa,0xff,0x61,0x00,0xab,0xff,0x61,0x00,0xac,0xff,0x61,0x00,0xad,0xff,0x61,
-0x00,0xb4,0xff,0x61,0x00,0xb5,0xff,0x61,0x00,0xb6,0xff,0x61,0x00,0xb7,0xff,0x61,
-0x00,0xb8,0xff,0x61,0x00,0xbb,0xff,0x75,0x00,0xbc,0xff,0x75,0x00,0xbd,0xff,0x75,
-0x00,0xbe,0xff,0x75,0x00,0xbf,0xff,0xc9,0x00,0xc1,0xff,0xc9,0x00,0xdd,0xff,0x61,
-0x01,0x31,0xff,0x75,0x07,0x7f,0xfe,0xe6,0x00,0x2d,0x00,0x10,0xff,0xad,0x00,0x11,
-0xff,0x15,0x00,0x1d,0xff,0x88,0x00,0x24,0xff,0x90,0x00,0x44,0xff,0x7d,0x00,0x48,
-0xff,0x88,0x00,0x4c,0xff,0xd3,0x00,0x52,0xff,0x88,0x00,0x55,0xff,0xa4,0x00,0x58,
-0xff,0xb7,0x00,0x5c,0xff,0xdc,0x00,0x6d,0xff,0x90,0x00,0x7d,0xff,0xdc,0x00,0x82,
-0xff,0x90,0x00,0x83,0xff,0x90,0x00,0x84,0xff,0x90,0x00,0x85,0xff,0x90,0x00,0x86,
-0xff,0x90,0x00,0xa2,0xff,0x7d,0x00,0xa3,0xff,0x7d,0x00,0xa4,0xff,0x7d,0x00,0xa5,
-0xff,0x7d,0x00,0xa6,0xff,0x7d,0x00,0xa7,0xff,0x7d,0x00,0xaa,0xff,0x88,0x00,0xab,
-0xff,0x88,0x00,0xac,0xff,0x88,0x00,0xad,0xff,0x88,0x00,0xb4,0xff,0x88,0x00,0xb5,
-0xff,0x88,0x00,0xb6,0xff,0x88,0x00,0xb7,0xff,0x88,0x00,0xb8,0xff,0x88,0x00,0xbb,
-0xff,0xb7,0x00,0xbc,0xff,0xb7,0x00,0xbd,0xff,0xb7,0x00,0xbe,0xff,0xb7,0x00,0xbf,
-0xff,0xdc,0x00,0xc1,0xff,0xdc,0x00,0xdd,0xff,0x88,0x01,0x17,0xff,0xa4,0x01,0x1b,
-0xff,0xa4,0x01,0x31,0xff,0xb7,0x07,0x7d,0xff,0xdc,0x07,0x7f,0xfe,0xf8,0x00,0x17,
-0x00,0x10,0xff,0x9a,0x00,0x26,0xff,0x6b,0x00,0x32,0xff,0x7d,0x00,0x37,0xff,0xdc,
-0x00,0x48,0xff,0xa4,0x00,0x6d,0xff,0x90,0x00,0x89,0xff,0x6b,0x00,0x94,0xff,0x7d,
-0x00,0x95,0xff,0x7d,0x00,0x96,0xff,0x7d,0x00,0x97,0xff,0x7d,0x00,0x98,0xff,0x7d,
-0x00,0xaa,0xff,0xa4,0x00,0xab,0xff,0xa4,0x00,0xac,0xff,0xa4,0x00,0xad,0xff,0xa4,
-0x00,0xc8,0xff,0x6b,0x00,0xce,0xff,0x6b,0x00,0xdd,0xff,0xa4,0x01,0x26,0xff,0xdc,
-0x07,0x7d,0xff,0x61,0x07,0x7e,0xff,0xad,0x07,0x7f,0xff,0xd3,0x00,0x32,0x00,0x10,
-0xff,0x0d,0x00,0x11,0xfe,0x61,0x00,0x1d,0xfe,0xf0,0x00,0x24,0xff,0x61,0x00,0x26,
-0xff,0x90,0x00,0x32,0xff,0x90,0x00,0x44,0xfe,0xe6,0x00,0x48,0xfe,0xf0,0x00,0x4c,
-0xff,0xb7,0x00,0x52,0xfe,0xf0,0x00,0x58,0xff,0x15,0x00,0x6d,0xff,0x1f,0x00,0x7d,
-0xff,0x6b,0x00,0x82,0xff,0x61,0x00,0x83,0xff,0x61,0x00,0x84,0xff,0x61,0x00,0x85,
-0xff,0x61,0x00,0x86,0xff,0x61,0x00,0x89,0xff,0x90,0x00,0x94,0xff,0x90,0x00,0x95,
-0xff,0x90,0x00,0x96,0xff,0x90,0x00,0x97,0xff,0x90,0x00,0x98,0xff,0x90,0x00,0xa2,
-0xfe,0xe6,0x00,0xa3,0xfe,0xe6,0x00,0xa4,0xfe,0xe6,0x00,0xa5,0xfe,0xe6,0x00,0xa6,
-0xfe,0xe6,0x00,0xa7,0xfe,0xe6,0x00,0xaa,0xfe,0xf0,0x00,0xab,0xfe,0xf0,0x00,0xac,
-0xfe,0xf0,0x00,0xad,0xfe,0xf0,0x00,0xb4,0xfe,0xf0,0x00,0xb5,0xfe,0xf0,0x00,0xb6,
-0xfe,0xf0,0x00,0xb7,0xfe,0xf0,0x00,0xb8,0xfe,0xf0,0x00,0xbb,0xff,0x15,0x00,0xbc,
-0xff,0x15,0x00,0xbd,0xff,0x15,0x00,0xbe,0xff,0x15,0x00,0xc8,0xff,0x90,0x00,0xce,
-0xff,0x90,0x00,0xdd,0xfe,0xf0,0x01,0x31,0xff,0x15,0x07,0x7d,0xff,0x90,0x07,0x7e,
-0xff,0xdc,0x07,0x7f,0xfe,0xf8,0x00,0x04,0x00,0x10,0xff,0xdc,0x07,0x7d,0xff,0xdc,
-0x07,0x7e,0xff,0xdc,0x07,0x7f,0xff,0xdc,0x00,0x01,0x00,0x5b,0xff,0xdc,0x00,0x0d,
-0x00,0x10,0xff,0x90,0x00,0x11,0xff,0x6b,0x00,0x1d,0xff,0xb7,0x00,0x57,0xff,0xdc,
-0x00,0x5a,0xff,0xdc,0x00,0x5c,0xff,0xdc,0x00,0x6d,0xff,0xb7,0x00,0x7d,0xff,0xdc,
-0x00,0xbf,0xff,0xdc,0x00,0xc1,0xff,0xdc,0x01,0x27,0xff,0xdc,0x07,0x7d,0x00,0x41,
-0x07,0x7f,0xff,0x15,0x00,0x1c,0x00,0x44,0xff,0xdc,0x00,0x48,0xff,0xb7,0x00,0x52,
-0xff,0xb7,0x00,0x58,0xff,0xc1,0x00,0x5c,0xff,0xb7,0x00,0xa2,0xff,0xdc,0x00,0xa3,
-0xff,0xdc,0x00,0xa4,0xff,0xdc,0x00,0xa5,0xff,0xdc,0x00,0xa6,0xff,0xdc,0x00,0xa7,
-0xff,0xdc,0x00,0xaa,0xff,0xb7,0x00,0xab,0xff,0xb7,0x00,0xac,0xff,0xb7,0x00,0xad,
-0xff,0xb7,0x00,0xb4,0xff,0xb7,0x00,0xb5,0xff,0xb7,0x00,0xb6,0xff,0xb7,0x00,0xb7,
-0xff,0xb7,0x00,0xb8,0xff,0xb7,0x00,0xbb,0xff,0xc1,0x00,0xbc,0xff,0xc1,0x00,0xbd,
-0xff,0xc1,0x00,0xbe,0xff,0xc1,0x00,0xbf,0xff,0xb7,0x00,0xc1,0xff,0xb7,0x00,0xdd,
-0xff,0xb7,0x01,0x31,0xff,0xc1,0x00,0x03,0x07,0x7d,0xff,0x6b,0x07,0x7e,0xff,0x90,
-0x07,0x7f,0xff,0xa4,0x00,0x06,0x00,0x10,0x00,0x26,0x00,0x11,0xff,0xdc,0x00,0x5b,
-0xff,0xc1,0x07,0x7d,0xff,0x6b,0x07,0x7e,0xff,0xb7,0x07,0x7f,0xff,0x7d,0x00,0x24,
-0x00,0x10,0xff,0x7d,0x00,0x11,0xff,0x44,0x00,0x1d,0xff,0xdc,0x00,0x46,0xff,0xd3,
-0x00,0x47,0xff,0xdc,0x00,0x48,0xff,0xd3,0x00,0x4a,0xff,0xdc,0x00,0x4b,0xff,0xdc,
-0x00,0x50,0xff,0xdc,0x00,0x51,0xff,0xdc,0x00,0x52,0xff,0xd3,0x00,0x54,0xff,0xdc,
-0x00,0x55,0xff,0xdc,0x00,0x5b,0xff,0xc9,0x00,0x6d,0xff,0xb7,0x00,0xa9,0xff,0xd3,
-0x00,0xaa,0xff,0xd3,0x00,0xab,0xff,0xd3,0x00,0xac,0xff,0xd3,0x00,0xad,0xff,0xd3,
-0x00,0xb3,0xff,0xdc,0x00,0xb4,0xff,0xd3,0x00,0xb5,0xff,0xd3,0x00,0xb6,0xff,0xd3,
-0x00,0xb7,0xff,0xd3,0x00,0xb8,0xff,0xd3,0x00,0xc9,0xff,0xd3,0x00,0xcf,0xff,0xd3,
-0x00,0xd1,0x00,0x48,0x00,0xdd,0xff,0xd3,0x00,0xe1,0xff,0xdc,0x01,0x0a,0xff,0xdc,
-0x01,0x17,0xff,0xdc,0x01,0x1b,0xff,0xdc,0x07,0x7e,0x00,0x56,0x07,0x7f,0xfe,0xc9,
-0x00,0x07,0x00,0x10,0xff,0xc9,0x00,0x11,0xff,0x61,0x00,0x1d,0xff,0x90,0x00,0x6d,
-0xff,0xdc,0x00,0x7d,0xff,0xdc,0x07,0x7e,0xff,0xdc,0x07,0x7f,0xfe,0xf0,0x00,0x05,
-0x00,0x11,0xff,0x44,0x00,0x1d,0xff,0x90,0x00,0x6d,0xff,0xdc,0x00,0x7d,0xff,0xdc,
-0x07,0x7f,0xff,0x29,0x00,0x10,0x00,0x46,0xff,0xdc,0x00,0x48,0xff,0xc1,0x00,0x52,
-0xff,0xc1,0x00,0xa9,0xff,0xdc,0x00,0xaa,0xff,0xc1,0x00,0xab,0xff,0xc1,0x00,0xac,
-0xff,0xc1,0x00,0xad,0xff,0xc1,0x00,0xb4,0xff,0xc1,0x00,0xb5,0xff,0xc1,0x00,0xb6,
-0xff,0xc1,0x00,0xb7,0xff,0xc1,0x00,0xb8,0xff,0xc1,0x00,0xc9,0xff,0xdc,0x00,0xcf,
-0xff,0xdc,0x00,0xdd,0xff,0xc1,0x00,0x06,0x00,0x10,0xff,0xdc,0x00,0x11,0xfe,0xdc,
-0x00,0x1d,0xff,0x6b,0x00,0x6d,0xff,0xdc,0x00,0x7d,0xff,0xdc,0x07,0x7f,0xfe,0xd3,
-0x00,0x17,0x00,0x25,0xff,0xdc,0x00,0x26,0xff,0xdc,0x00,0x27,0xff,0xdc,0x00,0x2a,
-0xff,0xdc,0x00,0x2d,0xff,0xdc,0x00,0x37,0xff,0x90,0x00,0x39,0xff,0x90,0x00,0x3a,
-0xff,0xdc,0x00,0x3c,0xff,0x6b,0x00,0x59,0xff,0xdc,0x00,0x5a,0xff,0xdc,0x00,0x5c,
-0xff,0xdc,0x00,0x88,0x00,0x97,0x00,0x89,0xff,0xdc,0x00,0x9f,0xff,0x6b,0x00,0xbf,
-0xff,0xdc,0x00,0xc1,0xff,0xdc,0x00,0xc8,0xff,0xdc,0x00,0xce,0xff,0xdc,0x00,0xd0,
-0xff,0xdc,0x00,0xe0,0xff,0xdc,0x01,0x26,0xff,0x90,0x01,0x3a,0xff,0x6b,0x00,0x21,
-0x00,0x24,0xff,0xb7,0x00,0x25,0xff,0xb7,0x00,0x26,0xff,0xdc,0x00,0x27,0xff,0xdc,
-0x00,0x2d,0xff,0xdc,0x00,0x32,0xff,0xdc,0x00,0x37,0xff,0x44,0x00,0x39,0xff,0x4e,
-0x00,0x3a,0xff,0x90,0x00,0x3b,0xff,0x90,0x00,0x3c,0xff,0x1f,0x00,0x59,0xff,0xdc,
-0x00,0x5a,0xff,0xdc,0x00,0x5c,0xff,0xdc,0x00,0x82,0xff,0xb7,0x00,0x83,0xff,0xb7,
-0x00,0x84,0xff,0xb7,0x00,0x85,0xff,0xb7,0x00,0x86,0xff,0xb7,0x00,0x89,0xff,0xdc,
-0x00,0x94,0xff,0xdc,0x00,0x95,0xff,0xdc,0x00,0x96,0xff,0xdc,0x00,0x97,0xff,0xdc,
-0x00,0x98,0xff,0xdc,0x00,0x9f,0xff,0x1f,0x00,0xbf,0xff,0xdc,0x00,0xc1,0xff,0xdc,
-0x00,0xc8,0xff,0xdc,0x00,0xce,0xff,0xdc,0x00,0xd0,0xff,0xdc,0x01,0x26,0xff,0x44,
-0x01,0x3a,0xff,0x1f,0x00,0x5c,0x00,0x10,0xff,0xd3,0x00,0x11,0xff,0xdc,0x00,0x1d,
-0xff,0xdc,0x00,0x24,0x00,0x39,0x00,0x26,0xff,0xdc,0x00,0x2a,0xff,0xdc,0x00,0x32,
-0xff,0xdc,0x00,0x34,0xff,0xdc,0x00,0x37,0xff,0x61,0x00,0x39,0xff,0x7d,0x00,0x3a,
-0xff,0x90,0x00,0x3c,0xff,0x61,0x00,0x46,0xff,0xdc,0x00,0x47,0xff,0xdc,0x00,0x48,
-0xff,0xdc,0x00,0x49,0xff,0xb7,0x00,0x52,0xff,0xdc,0x00,0x54,0xff,0xdc,0x00,0x57,
-0xff,0xdc,0x00,0x59,0xff,0x88,0x00,0x5a,0xff,0xad,0x00,0x5c,0xff,0x75,0x00,0x6d,
-0xff,0xb7,0x00,0x82,0x00,0x39,0x00,0x83,0x00,0x39,0x00,0x84,0x00,0x39,0x00,0x85,
-0x00,0x39,0x00,0x86,0x00,0x39,0x00,0x89,0xff,0xdc,0x00,0x94,0xff,0xdc,0x00,0x95,
-0xff,0xdc,0x00,0x96,0xff,0xdc,0x00,0x97,0xff,0xdc,0x00,0x98,0xff,0xdc,0x00,0x9f,
-0xff,0x61,0x00,0xa9,0xff,0xdc,0x00,0xaa,0xff,0xdc,0x00,0xab,0xff,0xdc,0x00,0xac,
-0xff,0xdc,0x00,0xad,0xff,0xdc,0x00,0xb4,0xff,0xdc,0x00,0xb5,0xff,0xdc,0x00,0xb6,
-0xff,0xdc,0x00,0xb7,0xff,0xdc,0x00,0xb8,0xff,0xdc,0x00,0xbf,0xff,0x75,0x00,0xc1,
-0xff,0x75,0x00,0xc2,0x00,0x39,0x00,0xc4,0x00,0x39,0x00,0xc6,0x00,0x39,0x00,0xc8,
-0xff,0xdc,0x00,0xc9,0xff,0xdc,0x00,0xca,0xff,0xdc,0x00,0xcc,0xff,0xdc,0x00,0xcd,
-0xff,0xdc,0x00,0xce,0xff,0xdc,0x00,0xcf,0xff,0xdc,0x00,0xd1,0xff,0xdc,0x00,0xd5,
-0xff,0xdc,0x00,0xd7,0xff,0xdc,0x00,0xd9,0xff,0xdc,0x00,0xdb,0xff,0xdc,0x00,0xdd,
-0xff,0xdc,0x00,0xde,0xff,0xdc,0x00,0xe0,0xff,0xdc,0x00,0xe2,0xff,0xdc,0x01,0x0e,
-0xff,0xdc,0x01,0x0f,0xff,0xdc,0x01,0x10,0xff,0xdc,0x01,0x11,0xff,0xdc,0x01,0x12,
-0xff,0xdc,0x01,0x13,0xff,0xdc,0x01,0x24,0xff,0x61,0x01,0x25,0xff,0xdc,0x01,0x26,
-0xff,0x61,0x01,0x27,0xff,0xdc,0x01,0x36,0xff,0x90,0x01,0x37,0xff,0xad,0x01,0x38,
-0xff,0x61,0x01,0x39,0xff,0x75,0x01,0x3a,0xff,0x61,0x01,0xf0,0xff,0xdc,0x01,0xf1,
-0xff,0xdc,0x06,0x07,0xff,0x90,0x06,0x0a,0xff,0xad,0x06,0x0b,0xff,0x90,0x06,0x0c,
-0xff,0xad,0x06,0x75,0xff,0x61,0x06,0x76,0xff,0x75,0x07,0x7d,0xfe,0xf8,0x07,0x7e,
-0xff,0x03,0x07,0x7f,0x00,0x2f,0x00,0x5d,0x00,0x10,0xff,0xd3,0x00,0x11,0xff,0xdc,
-0x00,0x1d,0xff,0xdc,0x00,0x24,0x00,0x39,0x00,0x26,0xff,0xdc,0x00,0x2a,0xff,0xdc,
-0x00,0x32,0xff,0xdc,0x00,0x34,0xff,0xdc,0x00,0x37,0xff,0x61,0x00,0x39,0xff,0x7d,
-0x00,0x3a,0xff,0x90,0x00,0x3c,0xff,0x61,0x00,0x46,0xff,0xdc,0x00,0x47,0xff,0xdc,
-0x00,0x48,0xff,0xdc,0x00,0x49,0xff,0xb7,0x00,0x52,0xff,0xdc,0x00,0x54,0xff,0xdc,
-0x00,0x57,0xff,0xdc,0x00,0x59,0xff,0x88,0x00,0x5a,0xff,0xad,0x00,0x5c,0xff,0x75,
-0x00,0x6d,0xff,0xb7,0x00,0x82,0x00,0x39,0x00,0x83,0x00,0x39,0x00,0x84,0x00,0x39,
-0x00,0x85,0x00,0x39,0x00,0x86,0x00,0x39,0x00,0x89,0xff,0xdc,0x00,0x94,0xff,0xdc,
-0x00,0x95,0xff,0xdc,0x00,0x96,0xff,0xdc,0x00,0x97,0xff,0xdc,0x00,0x98,0xff,0xdc,
-0x00,0x9f,0xff,0x61,0x00,0xa9,0xff,0xdc,0x00,0xaa,0xff,0xdc,0x00,0xab,0xff,0xdc,
-0x00,0xac,0xff,0xdc,0x00,0xad,0xff,0xdc,0x00,0xb4,0xff,0xdc,0x00,0xb5,0xff,0xdc,
-0x00,0xb6,0xff,0xdc,0x00,0xb7,0xff,0xdc,0x00,0xb8,0xff,0xdc,0x00,0xbf,0xff,0x75,
-0x00,0xc1,0xff,0x75,0x00,0xc2,0x00,0x39,0x00,0xc4,0x00,0x39,0x00,0xc6,0x00,0x39,
-0x00,0xc8,0xff,0xdc,0x00,0xc9,0xff,0xdc,0x00,0xca,0xff,0xdc,0x00,0xcc,0xff,0xdc,
-0x00,0xcd,0xff,0xdc,0x00,0xce,0xff,0xdc,0x00,0xcf,0xff,0xdc,0x00,0xd1,0xff,0xdc,
-0x00,0xd5,0xff,0xdc,0x00,0xd7,0xff,0xdc,0x00,0xd9,0xff,0xdc,0x00,0xdb,0xff,0xdc,
-0x00,0xdd,0xff,0xdc,0x00,0xde,0xff,0xdc,0x00,0xe0,0xff,0xdc,0x00,0xe2,0xff,0xdc,
-0x01,0x0e,0xff,0xdc,0x01,0x0f,0xff,0xdc,0x01,0x10,0xff,0xdc,0x01,0x11,0xff,0xdc,
-0x01,0x12,0xff,0xdc,0x01,0x13,0xff,0xdc,0x01,0x24,0xff,0x61,0x01,0x25,0xff,0xdc,
-0x01,0x26,0xff,0x61,0x01,0x27,0xff,0xdc,0x01,0x36,0xff,0x90,0x01,0x37,0xff,0xad,
-0x01,0x38,0xff,0x61,0x01,0x39,0xff,0x75,0x01,0x3a,0xff,0x61,0x01,0xf0,0xff,0xdc,
-0x01,0xf1,0xff,0xdc,0x06,0x07,0xff,0x90,0x06,0x09,0xff,0x90,0x06,0x0a,0xff,0xad,
-0x06,0x0b,0xff,0x90,0x06,0x0c,0xff,0xad,0x06,0x75,0xff,0x61,0x06,0x76,0xff,0x75,
-0x07,0x7d,0xfe,0xf8,0x07,0x7e,0xff,0x03,0x07,0x7f,0x00,0x2f,0x00,0x5d,0x00,0x10,
-0xff,0xd3,0x00,0x11,0xff,0xdc,0x00,0x1d,0xff,0xdc,0x00,0x24,0x00,0x39,0x00,0x26,
-0xff,0xdc,0x00,0x2a,0xff,0xdc,0x00,0x32,0xff,0xdc,0x00,0x34,0xff,0xdc,0x00,0x37,
-0xff,0x61,0x00,0x39,0xff,0x7d,0x00,0x3a,0xff,0x90,0x00,0x3c,0xff,0x61,0x00,0x46,
-0xff,0xdc,0x00,0x47,0xff,0xdc,0x00,0x48,0xff,0xdc,0x00,0x49,0xff,0xb7,0x00,0x52,
-0xff,0xdc,0x00,0x54,0xff,0xdc,0x00,0x57,0xff,0xdc,0x00,0x59,0xff,0x88,0x00,0x5a,
-0xff,0xad,0x00,0x5c,0xff,0x75,0x00,0x6d,0xff,0xb7,0x00,0x82,0x00,0x39,0x00,0x83,
-0x00,0x39,0x00,0x84,0x00,0x39,0x00,0x85,0x00,0x39,0x00,0x86,0x00,0x39,0x00,0x89,
-0xff,0xdc,0x00,0x94,0xff,0xdc,0x00,0x95,0xff,0xdc,0x00,0x96,0xff,0xdc,0x00,0x97,
-0xff,0xdc,0x00,0x98,0xff,0xdc,0x00,0x9f,0xff,0x61,0x00,0xa9,0xff,0xdc,0x00,0xaa,
-0xff,0xdc,0x00,0xab,0xff,0xdc,0x00,0xac,0xff,0xdc,0x00,0xad,0xff,0xdc,0x00,0xb4,
-0xff,0xdc,0x00,0xb5,0xff,0xdc,0x00,0xb6,0xff,0xdc,0x00,0xb7,0xff,0xdc,0x00,0xb8,
-0xff,0xdc,0x00,0xbf,0xff,0x75,0x00,0xc1,0xff,0x75,0x00,0xc2,0x00,0x39,0x00,0xc4,
-0x00,0x39,0x00,0xc6,0x00,0x39,0x00,0xc8,0xff,0xdc,0x00,0xc9,0xff,0xdc,0x00,0xca,
-0xff,0xdc,0x00,0xcc,0xff,0xdc,0x00,0xcd,0xff,0xdc,0x00,0xce,0xff,0xdc,0x00,0xcf,
-0xff,0xdc,0x00,0xd1,0xff,0xdc,0x00,0xd5,0xff,0xdc,0x00,0xd7,0xff,0xdc,0x00,0xd9,
-0xff,0xdc,0x00,0xdb,0xff,0xdc,0x00,0xdd,0xff,0xdc,0x00,0xde,0xff,0xdc,0x00,0xe0,
-0xff,0xdc,0x00,0xe2,0xff,0xdc,0x01,0x0e,0xff,0xdc,0x01,0x0f,0xff,0xdc,0x01,0x10,
-0xff,0xdc,0x01,0x11,0xff,0xdc,0x01,0x12,0xff,0xdc,0x01,0x13,0xff,0xdc,0x01,0x24,
-0xff,0x61,0x01,0x25,0xff,0xdc,0x01,0x26,0xff,0x61,0x01,0x27,0xff,0xdc,0x01,0x36,
-0xff,0x90,0x01,0x37,0xff,0xad,0x01,0x38,0xff,0x61,0x01,0x39,0xff,0x75,0x01,0x3a,
-0xff,0x61,0x01,0xf0,0xff,0xdc,0x01,0xf1,0xff,0xdc,0x06,0x07,0xff,0x90,0x06,0x09,
-0xff,0x90,0x06,0x0a,0xff,0xad,0x06,0x0b,0xff,0x90,0x06,0x0c,0xff,0xad,0x06,0x75,
-0xff,0x61,0x06,0x76,0xff,0x75,0x07,0x7d,0xfe,0xf8,0x07,0x7e,0xff,0x03,0x07,0x7f,
-0x00,0x2f,0x00,0x5c,0x00,0x10,0xff,0xd3,0x00,0x11,0xff,0xdc,0x00,0x1d,0xff,0xdc,
-0x00,0x24,0x00,0x39,0x00,0x26,0xff,0xdc,0x00,0x2a,0xff,0xdc,0x00,0x32,0xff,0xdc,
-0x00,0x34,0xff,0xdc,0x00,0x37,0xff,0x61,0x00,0x39,0xff,0x7d,0x00,0x3a,0xff,0x90,
-0x00,0x3c,0xff,0x61,0x00,0x46,0xff,0xdc,0x00,0x47,0xff,0xdc,0x00,0x48,0xff,0xdc,
-0x00,0x49,0xff,0xb7,0x00,0x52,0xff,0xdc,0x00,0x54,0xff,0xdc,0x00,0x57,0xff,0xdc,
-0x00,0x59,0xff,0x88,0x00,0x5a,0xff,0xad,0x00,0x5c,0xff,0x75,0x00,0x6d,0xff,0xb7,
-0x00,0x82,0x00,0x39,0x00,0x83,0x00,0x39,0x00,0x84,0x00,0x39,0x00,0x85,0x00,0x39,
-0x00,0x86,0x00,0x39,0x00,0x89,0xff,0xdc,0x00,0x94,0xff,0xdc,0x00,0x95,0xff,0xdc,
-0x00,0x96,0xff,0xdc,0x00,0x97,0xff,0xdc,0x00,0x98,0xff,0xdc,0x00,0x9f,0xff,0x61,
-0x00,0xa9,0xff,0xdc,0x00,0xaa,0xff,0xdc,0x00,0xab,0xff,0xdc,0x00,0xac,0xff,0xdc,
-0x00,0xad,0xff,0xdc,0x00,0xb4,0xff,0xdc,0x00,0xb5,0xff,0xdc,0x00,0xb6,0xff,0xdc,
-0x00,0xb7,0xff,0xdc,0x00,0xb8,0xff,0xdc,0x00,0xbf,0xff,0x75,0x00,0xc1,0xff,0x75,
-0x00,0xc2,0x00,0x39,0x00,0xc4,0x00,0x39,0x00,0xc6,0x00,0x39,0x00,0xc8,0xff,0xdc,
-0x00,0xc9,0xff,0xdc,0x00,0xca,0xff,0xdc,0x00,0xcc,0xff,0xdc,0x00,0xcd,0xff,0xdc,
-0x00,0xce,0xff,0xdc,0x00,0xcf,0xff,0xdc,0x00,0xd1,0xff,0xdc,0x00,0xd5,0xff,0xdc,
-0x00,0xd7,0xff,0xdc,0x00,0xd9,0xff,0xdc,0x00,0xdb,0xff,0xdc,0x00,0xdd,0xff,0xdc,
-0x00,0xde,0xff,0xdc,0x00,0xe0,0xff,0xdc,0x00,0xe2,0xff,0xdc,0x01,0x0e,0xff,0xdc,
-0x01,0x0f,0xff,0xdc,0x01,0x10,0xff,0xdc,0x01,0x11,0xff,0xdc,0x01,0x12,0xff,0xdc,
-0x01,0x13,0xff,0xdc,0x01,0x24,0xff,0x61,0x01,0x25,0xff,0xdc,0x01,0x26,0xff,0x61,
-0x01,0x27,0xff,0xdc,0x01,0x36,0xff,0x90,0x01,0x37,0xff,0xad,0x01,0x38,0xff,0x61,
-0x01,0x39,0xff,0x75,0x01,0x3a,0xff,0x61,0x01,0xf0,0xff,0xdc,0x06,0x07,0xff,0x90,
-0x06,0x09,0xff,0x90,0x06,0x0a,0xff,0xad,0x06,0x0b,0xff,0x90,0x06,0x0c,0xff,0xad,
-0x06,0x75,0xff,0x61,0x06,0x76,0xff,0x75,0x07,0x7d,0xfe,0xf8,0x07,0x7e,0xff,0x03,
-0x07,0x7f,0x00,0x2f,0x00,0x5d,0x00,0x10,0xff,0xd3,0x00,0x11,0xff,0xdc,0x00,0x1d,
-0xff,0xdc,0x00,0x24,0x00,0x39,0x00,0x26,0xff,0xdc,0x00,0x2a,0xff,0xdc,0x00,0x32,
-0xff,0xdc,0x00,0x34,0xff,0xdc,0x00,0x37,0xff,0x61,0x00,0x39,0xff,0x7d,0x00,0x3a,
-0xff,0x90,0x00,0x3c,0xff,0x61,0x00,0x46,0xff,0xdc,0x00,0x47,0xff,0xdc,0x00,0x48,
-0xff,0xdc,0x00,0x49,0xff,0xb7,0x00,0x52,0xff,0xdc,0x00,0x54,0xff,0xdc,0x00,0x57,
-0xff,0xdc,0x00,0x59,0xff,0x88,0x00,0x5a,0xff,0xad,0x00,0x5c,0xff,0x75,0x00,0x6d,
-0xff,0xb7,0x00,0x82,0x00,0x39,0x00,0x83,0x00,0x39,0x00,0x84,0x00,0x39,0x00,0x85,
-0x00,0x39,0x00,0x86,0x00,0x39,0x00,0x89,0xff,0xdc,0x00,0x94,0xff,0xdc,0x00,0x95,
-0xff,0xdc,0x00,0x96,0xff,0xdc,0x00,0x97,0xff,0xdc,0x00,0x98,0xff,0xdc,0x00,0x9f,
-0xff,0x61,0x00,0xa9,0xff,0xdc,0x00,0xaa,0xff,0xdc,0x00,0xab,0xff,0xdc,0x00,0xac,
-0xff,0xdc,0x00,0xad,0xff,0xdc,0x00,0xb4,0xff,0xdc,0x00,0xb5,0xff,0xdc,0x00,0xb6,
-0xff,0xdc,0x00,0xb7,0xff,0xdc,0x00,0xb8,0xff,0xdc,0x00,0xbf,0xff,0x75,0x00,0xc1,
-0xff,0x75,0x00,0xc2,0x00,0x39,0x00,0xc4,0x00,0x39,0x00,0xc6,0x00,0x39,0x00,0xc8,
-0xff,0xdc,0x00,0xc9,0xff,0xdc,0x00,0xca,0xff,0xdc,0x00,0xcc,0xff,0xdc,0x00,0xcd,
-0xff,0xdc,0x00,0xce,0xff,0xdc,0x00,0xcf,0xff,0xdc,0x00,0xd1,0xff,0xdc,0x00,0xd5,
-0xff,0xdc,0x00,0xd7,0xff,0xdc,0x00,0xd9,0xff,0xdc,0x00,0xdb,0xff,0xdc,0x00,0xdd,
-0xff,0xdc,0x00,0xde,0xff,0xdc,0x00,0xe0,0xff,0xdc,0x00,0xe2,0xff,0xdc,0x01,0x0e,
-0xff,0xdc,0x01,0x0f,0xff,0xdc,0x01,0x10,0xff,0xdc,0x01,0x11,0xff,0xdc,0x01,0x12,
-0xff,0xdc,0x01,0x13,0xff,0xdc,0x01,0x24,0xff,0x61,0x01,0x25,0xff,0xdc,0x01,0x26,
-0xff,0x61,0x01,0x27,0xff,0xdc,0x01,0x36,0xff,0x90,0x01,0x37,0xff,0xad,0x01,0x38,
-0xff,0x61,0x01,0x39,0xff,0x75,0x01,0x3a,0xff,0x61,0x01,0xf0,0xff,0xdc,0x01,0xf1,
-0xff,0xdc,0x06,0x07,0xff,0x90,0x06,0x09,0xff,0x90,0x06,0x0a,0xff,0xad,0x06,0x0b,
-0xff,0x90,0x06,0x0c,0xff,0xad,0x06,0x75,0xff,0x61,0x06,0x76,0xff,0x75,0x07,0x7d,
-0xfe,0xf8,0x07,0x7e,0xff,0x03,0x07,0x7f,0x00,0x2f,0x00,0x03,0x07,0x7d,0xff,0xad,
-0x07,0x7e,0xff,0xa4,0x07,0x7f,0xff,0x90,0x00,0x06,0x00,0x3c,0xff,0xdc,0x00,0x6d,
-0xff,0xdc,0x00,0x7d,0xff,0xdc,0x00,0x9f,0xff,0xdc,0x01,0x3a,0xff,0xdc,0x07,0x7e,
-0x00,0x26,0x00,0x15,0x00,0x24,0xff,0xdc,0x00,0x39,0xff,0xdc,0x00,0x3c,0xff,0x90,
-0x00,0x6d,0xff,0xdc,0x00,0x7d,0xff,0xdc,0x00,0x82,0xff,0xdc,0x00,0x83,0xff,0xdc,
-0x00,0x84,0xff,0xdc,0x00,0x85,0xff,0xdc,0x00,0x86,0xff,0xdc,0x00,0x9f,0xff,0x90,
-0x00,0xc2,0xff,0xdc,0x00,0xc4,0xff,0xdc,0x00,0xc6,0xff,0xdc,0x01,0x38,0xff,0x90,
-0x01,0x3a,0xff,0x90,0x01,0xf4,0xff,0x90,0x06,0x75,0xff,0x90,0x07,0x7d,0xff,0xd3,
-0x07,0x7e,0xff,0xc9,0x07,0x7f,0xff,0x44,0x00,0x12,0x00,0x10,0x00,0x39,0x00,0x11,
-0xff,0xad,0x00,0x1d,0xff,0xdc,0x00,0x24,0xff,0xdc,0x00,0x39,0xff,0xdc,0x00,0x3b,
-0xff,0x7d,0x00,0x3c,0xff,0x90,0x00,0x6d,0xff,0xdc,0x00,0x82,0xff,0xdc,0x00,0x83,
-0xff,0xdc,0x00,0x84,0xff,0xdc,0x00,0x85,0xff,0xdc,0x00,0x86,0xff,0xdc,0x00,0x9f,
-0xff,0x90,0x01,0x3a,0xff,0x90,0x07,0x7d,0xff,0xd3,0x07,0x7e,0xff,0xdc,0x07,0x7f,
-0xff,0x44,0x00,0x12,0x00,0x10,0x00,0x39,0x00,0x11,0xff,0xad,0x00,0x1d,0xff,0xdc,
-0x00,0x24,0xff,0xdc,0x00,0x39,0xff,0xdc,0x00,0x3b,0xff,0x7d,0x00,0x3c,0xff,0x90,
-0x00,0x6d,0xff,0xdc,0x00,0x82,0xff,0xdc,0x00,0x83,0xff,0xdc,0x00,0x84,0xff,0xdc,
-0x00,0x85,0xff,0xdc,0x00,0x86,0xff,0xdc,0x00,0x9f,0xff,0x90,0x01,0x3a,0xff,0x90,
-0x07,0x7d,0xff,0xd3,0x07,0x7e,0xff,0xdc,0x07,0x7f,0xff,0x44,0x00,0x12,0x00,0x10,
-0x00,0x39,0x00,0x11,0xff,0xad,0x00,0x1d,0xff,0xdc,0x00,0x24,0xff,0xdc,0x00,0x39,
-0xff,0xdc,0x00,0x3b,0xff,0x7d,0x00,0x3c,0xff,0x90,0x00,0x6d,0xff,0xdc,0x00,0x82,
-0xff,0xdc,0x00,0x83,0xff,0xdc,0x00,0x84,0xff,0xdc,0x00,0x85,0xff,0xdc,0x00,0x86,
-0xff,0xdc,0x00,0x9f,0xff,0x90,0x01,0x3a,0xff,0x90,0x07,0x7d,0xff,0xd3,0x07,0x7e,
-0xff,0xdc,0x07,0x7f,0xff,0x44,0x00,0x12,0x00,0x10,0x00,0x39,0x00,0x11,0xff,0xad,
-0x00,0x1d,0xff,0xdc,0x00,0x24,0xff,0xdc,0x00,0x39,0xff,0xdc,0x00,0x3b,0xff,0x7d,
-0x00,0x3c,0xff,0x90,0x00,0x6d,0xff,0xdc,0x00,0x82,0xff,0xdc,0x00,0x83,0xff,0xdc,
-0x00,0x84,0xff,0xdc,0x00,0x85,0xff,0xdc,0x00,0x86,0xff,0xdc,0x00,0x9f,0xff,0x90,
-0x01,0x3a,0xff,0x90,0x07,0x7d,0xff,0xd3,0x07,0x7e,0xff,0xdc,0x07,0x7f,0xff,0x44,
-0x00,0x12,0x00,0x10,0x00,0x39,0x00,0x11,0xff,0xad,0x00,0x1d,0xff,0xdc,0x00,0x24,
-0xff,0xdc,0x00,0x39,0xff,0xdc,0x00,0x3b,0xff,0x7d,0x00,0x3c,0xff,0x90,0x00,0x6d,
-0xff,0xdc,0x00,0x82,0xff,0xdc,0x00,0x83,0xff,0xdc,0x00,0x84,0xff,0xdc,0x00,0x85,
-0xff,0xdc,0x00,0x86,0xff,0xdc,0x00,0x9f,0xff,0x90,0x01,0x3a,0xff,0x90,0x07,0x7d,
-0xff,0xd3,0x07,0x7e,0xff,0xdc,0x07,0x7f,0xff,0x44,0x00,0x02,0x00,0x3d,0xff,0xdc,
-0x01,0x3f,0xff,0xdc,0x00,0x02,0x00,0x3d,0xff,0xdc,0x01,0x3f,0xff,0xdc,0x00,0x02,
-0x00,0x3d,0xff,0xdc,0x01,0x3f,0xff,0xdc,0x00,0x02,0x00,0x3d,0xff,0xdc,0x01,0x3f,
-0xff,0xdc,0x00,0x32,0x00,0x10,0xff,0x0d,0x00,0x11,0xfe,0x61,0x00,0x1d,0xfe,0xf0,
-0x00,0x24,0xff,0x61,0x00,0x26,0xff,0x90,0x00,0x32,0xff,0x90,0x00,0x44,0xfe,0xe6,
-0x00,0x48,0xfe,0xf0,0x00,0x4c,0xff,0xb7,0x00,0x52,0xfe,0xf0,0x00,0x58,0xff,0x15,
-0x00,0x6d,0xff,0x1f,0x00,0x7d,0xff,0x6b,0x00,0x82,0xff,0x61,0x00,0x83,0xff,0x61,
-0x00,0x84,0xff,0x61,0x00,0x85,0xff,0x61,0x00,0x86,0xff,0x61,0x00,0x89,0xff,0x90,
-0x00,0x94,0xff,0x90,0x00,0x95,0xff,0x90,0x00,0x96,0xff,0x90,0x00,0x97,0xff,0x90,
-0x00,0x98,0xff,0x90,0x00,0xa2,0xfe,0xe6,0x00,0xa3,0xfe,0xe6,0x00,0xa4,0xfe,0xe6,
-0x00,0xa5,0xfe,0xe6,0x00,0xa6,0xfe,0xe6,0x00,0xa7,0xfe,0xe6,0x00,0xaa,0xfe,0xf0,
-0x00,0xab,0xfe,0xf0,0x00,0xac,0xfe,0xf0,0x00,0xad,0xfe,0xf0,0x00,0xb4,0xfe,0xf0,
-0x00,0xb5,0xfe,0xf0,0x00,0xb6,0xfe,0xf0,0x00,0xb7,0xfe,0xf0,0x00,0xb8,0xfe,0xf0,
-0x00,0xbb,0xff,0x15,0x00,0xbc,0xff,0x15,0x00,0xbd,0xff,0x15,0x00,0xbe,0xff,0x15,
-0x00,0xc8,0xff,0x90,0x00,0xce,0xff,0x90,0x00,0xdd,0xfe,0xf0,0x01,0x31,0xff,0x15,
-0x07,0x7d,0xff,0x90,0x07,0x7e,0xff,0xdc,0x07,0x7f,0xfe,0xf8,0x00,0x04,0x00,0x11,
-0xff,0x6b,0x00,0x1d,0xff,0xb7,0x07,0x7d,0xff,0xdc,0x07,0x7f,0xff,0x44,0x00,0x04,
-0x00,0x10,0x00,0x26,0x07,0x7d,0xff,0x90,0x07,0x7e,0xff,0x90,0x07,0x7f,0xff,0xad,
-0x00,0x01,0x00,0x5b,0xff,0xdc,0x00,0x01,0x00,0x5b,0xff,0xdc,0x00,0x01,0x00,0x5b,
-0xff,0xdc,0x00,0x01,0x00,0x5b,0xff,0xdc,0x00,0x03,0x07,0x7d,0xff,0xa4,0x07,0x7e,
-0xff,0x90,0x07,0x7f,0xff,0xb7,0x00,0x03,0x07,0x7d,0xff,0x6b,0x07,0x7e,0xff,0x90,
-0x07,0x7f,0xff,0xa4,0x00,0x06,0x00,0x10,0x00,0x26,0x00,0x11,0xff,0xdc,0x00,0x5b,
-0xff,0xc1,0x07,0x7d,0xff,0x6b,0x07,0x7e,0xff,0xb7,0x07,0x7f,0xff,0x7d,0x00,0x06,
-0x00,0x10,0x00,0x26,0x00,0x11,0xff,0xdc,0x00,0x5b,0xff,0xc1,0x07,0x7d,0xff,0x6b,
-0x07,0x7e,0xff,0xb7,0x07,0x7f,0xff,0x7d,0x00,0x06,0x00,0x10,0x00,0x26,0x00,0x11,
-0xff,0xdc,0x00,0x5b,0xff,0xc1,0x07,0x7d,0xff,0x6b,0x07,0x7e,0xff,0xb7,0x07,0x7f,
-0xff,0x7d,0x00,0x06,0x00,0x10,0x00,0x26,0x00,0x11,0xff,0xdc,0x00,0x5b,0xff,0xc1,
-0x07,0x7d,0xff,0x6b,0x07,0x7e,0xff,0xb7,0x07,0x7f,0xff,0x7d,0x00,0x06,0x00,0x10,
-0x00,0x26,0x00,0x11,0xff,0xdc,0x00,0x5b,0xff,0xc1,0x07,0x7d,0xff,0x6b,0x07,0x7e,
-0xff,0xb7,0x07,0x7f,0xff,0x7d,0x00,0x06,0x00,0x10,0xff,0xdc,0x00,0x11,0xfe,0xdc,
-0x00,0x1d,0xff,0x6b,0x00,0x6d,0xff,0xdc,0x00,0x7d,0xff,0xdc,0x07,0x7f,0xfe,0xd3,
-0x00,0x06,0x00,0x10,0xff,0xdc,0x00,0x11,0xfe,0xdc,0x00,0x1d,0xff,0x6b,0x00,0x6d,
-0xff,0xdc,0x00,0x7d,0xff,0xdc,0x07,0x7f,0xfe,0xd3,0x00,0x5a,0x00,0x10,0xff,0xd3,
-0x00,0x11,0xff,0xdc,0x00,0x1d,0xff,0xdc,0x00,0x24,0x00,0x39,0x00,0x26,0xff,0xdc,
-0x00,0x2a,0xff,0xdc,0x00,0x32,0xff,0xdc,0x00,0x34,0xff,0xdc,0x00,0x37,0xff,0x61,
-0x00,0x39,0xff,0x7d,0x00,0x3a,0xff,0x90,0x00,0x3c,0xff,0x61,0x00,0x46,0xff,0xdc,
-0x00,0x47,0xff,0xdc,0x00,0x48,0xff,0xdc,0x00,0x49,0xff,0xb7,0x00,0x52,0xff,0xdc,
-0x00,0x54,0xff,0xdc,0x00,0x57,0xff,0xdc,0x00,0x59,0xff,0x88,0x00,0x5a,0xff,0xad,
-0x00,0x5c,0xff,0x75,0x00,0x6d,0xff,0xb7,0x00,0x82,0x00,0x39,0x00,0x83,0x00,0x39,
-0x00,0x84,0x00,0x39,0x00,0x85,0x00,0x39,0x00,0x86,0x00,0x39,0x00,0x94,0xff,0xdc,
-0x00,0x95,0xff,0xdc,0x00,0x96,0xff,0xdc,0x00,0x97,0xff,0xdc,0x00,0x98,0xff,0xdc,
-0x00,0x9f,0xff,0x61,0x00,0xa9,0xff,0xdc,0x00,0xaa,0xff,0xdc,0x00,0xab,0xff,0xdc,
-0x00,0xac,0xff,0xdc,0x00,0xad,0xff,0xdc,0x00,0xb4,0xff,0xdc,0x00,0xb5,0xff,0xdc,
-0x00,0xb6,0xff,0xdc,0x00,0xb7,0xff,0xdc,0x00,0xb8,0xff,0xdc,0x00,0xbf,0xff,0x75,
-0x00,0xc1,0xff,0x75,0x00,0xc2,0x00,0x39,0x00,0xc4,0x00,0x39,0x00,0xc6,0x00,0x39,
-0x00,0xc8,0xff,0xdc,0x00,0xca,0xff,0xdc,0x00,0xcc,0xff,0xdc,0x00,0xcd,0xff,0xdc,
-0x00,0xce,0xff,0xdc,0x00,0xd1,0xff,0xdc,0x00,0xd3,0xff,0xdc,0x00,0xd5,0xff,0xdc,
-0x00,0xd7,0xff,0xdc,0x00,0xd9,0xff,0xdc,0x00,0xdb,0xff,0xdc,0x00,0xdd,0xff,0xdc,
-0x00,0xde,0xff,0xdc,0x00,0xe2,0xff,0xdc,0x01,0x0e,0xff,0xdc,0x01,0x0f,0xff,0xdc,
-0x01,0x10,0xff,0xdc,0x01,0x11,0xff,0xdc,0x01,0x12,0xff,0xdc,0x01,0x13,0xff,0xdc,
-0x01,0x24,0xff,0x61,0x01,0x25,0xff,0xdc,0x01,0x26,0xff,0x61,0x01,0x27,0xff,0xdc,
-0x01,0x36,0xff,0x90,0x01,0x37,0xff,0xad,0x01,0x38,0xff,0x61,0x01,0x39,0xff,0x75,
-0x01,0x3a,0xff,0x61,0x01,0xf0,0xff,0xdc,0x01,0xf1,0xff,0xdc,0x06,0x07,0xff,0x90,
-0x06,0x09,0xff,0x90,0x06,0x0a,0xff,0xad,0x06,0x0b,0xff,0x90,0x06,0x0c,0xff,0xad,
-0x06,0x75,0xff,0x61,0x06,0x76,0xff,0x75,0x07,0x7d,0xfe,0xf8,0x07,0x7e,0xff,0x02,
-0x07,0x7f,0x00,0x2f,0x00,0x5a,0x00,0x10,0xff,0xd3,0x00,0x11,0xff,0xdc,0x00,0x1d,
-0xff,0xdc,0x00,0x24,0x00,0x39,0x00,0x26,0xff,0xdc,0x00,0x2a,0xff,0xdc,0x00,0x32,
-0xff,0xdc,0x00,0x34,0xff,0xdc,0x00,0x37,0xff,0x61,0x00,0x39,0xff,0x7d,0x00,0x3a,
-0xff,0x90,0x00,0x3c,0xff,0x61,0x00,0x46,0xff,0xdc,0x00,0x47,0xff,0xdc,0x00,0x48,
-0xff,0xdc,0x00,0x49,0xff,0xb7,0x00,0x52,0xff,0xdc,0x00,0x54,0xff,0xdc,0x00,0x57,
-0xff,0xdc,0x00,0x59,0xff,0x88,0x00,0x5a,0xff,0xad,0x00,0x5c,0xff,0x75,0x00,0x6d,
-0xff,0xb7,0x00,0x82,0x00,0x39,0x00,0x83,0x00,0x39,0x00,0x84,0x00,0x39,0x00,0x85,
-0x00,0x39,0x00,0x86,0x00,0x39,0x00,0x94,0xff,0xdc,0x00,0x95,0xff,0xdc,0x00,0x96,
-0xff,0xdc,0x00,0x97,0xff,0xdc,0x00,0x98,0xff,0xdc,0x00,0x9f,0xff,0x61,0x00,0xa9,
-0xff,0xdc,0x00,0xaa,0xff,0xdc,0x00,0xab,0xff,0xdc,0x00,0xac,0xff,0xdc,0x00,0xad,
-0xff,0xdc,0x00,0xb4,0xff,0xdc,0x00,0xb5,0xff,0xdc,0x00,0xb6,0xff,0xdc,0x00,0xb7,
-0xff,0xdc,0x00,0xb8,0xff,0xdc,0x00,0xbf,0xff,0x75,0x00,0xc1,0xff,0x75,0x00,0xc2,
-0x00,0x39,0x00,0xc4,0x00,0x39,0x00,0xc6,0x00,0x39,0x00,0xc8,0xff,0xdc,0x00,0xca,
-0xff,0xdc,0x00,0xcc,0xff,0xdc,0x00,0xcd,0xff,0xdc,0x00,0xce,0xff,0xdc,0x00,0xd1,
-0xff,0xdc,0x00,0xd3,0xff,0xdc,0x00,0xd5,0xff,0xdc,0x00,0xd7,0xff,0xdc,0x00,0xd9,
-0xff,0xdc,0x00,0xdb,0xff,0xdc,0x00,0xdd,0xff,0xdc,0x00,0xde,0xff,0xdc,0x00,0xe2,
-0xff,0xdc,0x01,0x0e,0xff,0xdc,0x01,0x0f,0xff,0xdc,0x01,0x10,0xff,0xdc,0x01,0x11,
-0xff,0xdc,0x01,0x12,0xff,0xdc,0x01,0x13,0xff,0xdc,0x01,0x24,0xff,0x61,0x01,0x25,
-0xff,0xdc,0x01,0x26,0xff,0x61,0x01,0x27,0xff,0xdc,0x01,0x36,0xff,0x90,0x01,0x37,
-0xff,0xad,0x01,0x38,0xff,0x61,0x01,0x39,0xff,0x75,0x01,0x3a,0xff,0x61,0x01,0xf0,
-0xff,0xdc,0x01,0xf1,0xff,0xdc,0x06,0x07,0xff,0x90,0x06,0x09,0xff,0x90,0x06,0x0a,
-0xff,0xad,0x06,0x0b,0xff,0x90,0x06,0x0c,0xff,0xad,0x06,0x75,0xff,0x61,0x06,0x76,
-0xff,0x75,0x07,0x7d,0xfe,0xf8,0x07,0x7e,0xff,0x02,0x07,0x7f,0x00,0x2f,0x00,0x54,
-0x00,0x10,0xff,0xd3,0x00,0x11,0xff,0xdc,0x00,0x1d,0xff,0xdc,0x00,0x24,0x00,0x39,
-0x00,0x26,0xff,0xdc,0x00,0x2a,0xff,0xdc,0x00,0x32,0xff,0xdc,0x00,0x34,0xff,0xdc,
-0x00,0x37,0xff,0x61,0x00,0x39,0xff,0x7d,0x00,0x3a,0xff,0x90,0x00,0x3c,0xff,0x61,
-0x00,0x46,0xff,0xdc,0x00,0x47,0xff,0xdc,0x00,0x48,0xff,0xdc,0x00,0x49,0xff,0xb7,
-0x00,0x52,0xff,0xdc,0x00,0x54,0xff,0xdc,0x00,0x57,0xff,0xdc,0x00,0x59,0xff,0x88,
-0x00,0x5a,0xff,0xad,0x00,0x6d,0xff,0xb7,0x00,0x82,0x00,0x39,0x00,0x83,0x00,0x39,
-0x00,0x84,0x00,0x39,0x00,0x85,0x00,0x39,0x00,0x86,0x00,0x39,0x00,0x94,0xff,0xdc,
-0x00,0x95,0xff,0xdc,0x00,0x96,0xff,0xdc,0x00,0x97,0xff,0xdc,0x00,0x98,0xff,0xdc,
-0x00,0x9f,0xff,0x61,0x00,0xa9,0xff,0xdc,0x00,0xaa,0xff,0xdc,0x00,0xab,0xff,0xdc,
-0x00,0xac,0xff,0xdc,0x00,0xad,0xff,0xdc,0x00,0xb4,0xff,0xdc,0x00,0xb5,0xff,0xdc,
-0x00,0xb6,0xff,0xdc,0x00,0xb7,0xff,0xdc,0x00,0xb8,0xff,0xdc,0x00,0xc2,0x00,0x39,
-0x00,0xc4,0x00,0x39,0x00,0xc6,0x00,0x39,0x00,0xc8,0xff,0xdc,0x00,0xca,0xff,0xdc,
-0x00,0xcc,0xff,0xdc,0x00,0xcd,0xff,0xdc,0x00,0xce,0xff,0xdc,0x00,0xd1,0xff,0xdc,
-0x00,0xd3,0xff,0xdc,0x00,0xd5,0xff,0xdc,0x00,0xd7,0xff,0xdc,0x00,0xd9,0xff,0xdc,
-0x00,0xdb,0xff,0xdc,0x00,0xdd,0xff,0xdc,0x00,0xde,0xff,0xdc,0x00,0xe2,0xff,0xdc,
-0x01,0x0e,0xff,0xdc,0x01,0x0f,0xff,0xdc,0x01,0x10,0xff,0xdc,0x01,0x11,0xff,0xdc,
-0x01,0x13,0xff,0xdc,0x01,0x24,0xff,0x61,0x01,0x25,0xff,0xdc,0x01,0x26,0xff,0x61,
-0x01,0x27,0xff,0xdc,0x01,0x36,0xff,0x90,0x01,0x37,0xff,0xad,0x01,0x38,0xff,0x61,
-0x01,0x3a,0xff,0x61,0x01,0xf0,0xff,0xdc,0x01,0xf1,0xff,0xdc,0x06,0x07,0xff,0x90,
-0x06,0x09,0xff,0x90,0x06,0x0a,0xff,0xad,0x06,0x0b,0xff,0x90,0x06,0x0c,0xff,0xad,
-0x06,0x75,0xff,0x61,0x07,0x7d,0xfe,0xf8,0x07,0x7e,0xff,0x02,0x07,0x7f,0x00,0x2f,
-0x00,0x06,0x00,0x3c,0xff,0xdc,0x00,0x6d,0xff,0xdc,0x00,0x7d,0xff,0xdc,0x00,0x9f,
-0xff,0xdc,0x01,0x3a,0xff,0xdc,0x07,0x7e,0x00,0x26,0x00,0x06,0x00,0x3c,0xff,0xdc,
-0x00,0x6d,0xff,0xdc,0x00,0x7d,0xff,0xdc,0x00,0x9f,0xff,0xdc,0x01,0x3a,0xff,0xdc,
-0x07,0x7e,0x00,0x26,0x00,0x15,0x00,0x24,0xff,0xdc,0x00,0x39,0xff,0xdc,0x00,0x3c,
-0xff,0x90,0x00,0x6d,0xff,0xdc,0x00,0x7d,0xff,0xdc,0x00,0x82,0xff,0xdc,0x00,0x83,
-0xff,0xdc,0x00,0x84,0xff,0xdc,0x00,0x85,0xff,0xdc,0x00,0x86,0xff,0xdc,0x00,0x9f,
-0xff,0x90,0x00,0xc2,0xff,0xdc,0x00,0xc4,0xff,0xdc,0x00,0xc6,0xff,0xdc,0x01,0x38,
-0xff,0x90,0x01,0x3a,0xff,0x90,0x01,0xf4,0xff,0x90,0x06,0x75,0xff,0x90,0x07,0x7d,
-0xff,0xd3,0x07,0x7e,0xff,0xc9,0x07,0x7f,0xff,0x44,0x00,0x0f,0x00,0x24,0xff,0xdc,
-0x00,0x39,0xff,0xdc,0x00,0x3c,0xff,0x90,0x00,0x6d,0xff,0xdc,0x00,0x7d,0xff,0xdc,
-0x00,0x82,0xff,0xdc,0x00,0x83,0xff,0xdc,0x00,0x84,0xff,0xdc,0x00,0x85,0xff,0xdc,
-0x00,0x86,0xff,0xdc,0x00,0x9f,0xff,0x90,0x01,0x3a,0xff,0x90,0x07,0x7d,0xff,0xd3,
-0x07,0x7e,0xff,0xc9,0x07,0x7f,0xff,0x44,0x00,0x01,0x00,0x5b,0xff,0xdc,0x00,0x0a,
-0x00,0x37,0xff,0xb7,0x00,0x3c,0xff,0x9a,0x00,0x6d,0xff,0xdc,0x00,0x7d,0xff,0xdc,
-0x00,0x9f,0xff,0x9a,0x01,0x26,0xff,0xb7,0x01,0x3a,0xff,0x9a,0x07,0x7d,0xff,0xd3,
-0x07,0x7e,0xff,0xd3,0x07,0x7f,0xff,0xc9,0x00,0x31,0x00,0x10,0xff,0xdc,0x00,0x24,
-0x00,0x2f,0x00,0x32,0xff,0xb7,0x00,0x37,0xfe,0xe6,0x00,0x38,0xff,0x9a,0x00,0x39,
-0xff,0x1f,0x00,0x3a,0xff,0x44,0x00,0x3c,0xfe,0xf0,0x00,0x48,0xff,0xdc,0x00,0x52,
-0xff,0xdc,0x00,0x58,0xff,0xdc,0x00,0x5c,0xff,0x44,0x00,0x82,0x00,0x2f,0x00,0x83,
-0x00,0x2f,0x00,0x84,0x00,0x2f,0x00,0x85,0x00,0x2f,0x00,0x86,0x00,0x2f,0x00,0x94,
-0xff,0xb7,0x00,0x95,0xff,0xb7,0x00,0x96,0xff,0xb7,0x00,0x97,0xff,0xb7,0x00,0x98,
-0xff,0xb7,0x00,0x9b,0xff,0x9a,0x00,0x9c,0xff,0x9a,0x00,0x9d,0xff,0x9a,0x00,0x9e,
-0xff,0x9a,0x00,0x9f,0xfe,0xf0,0x00,0xaa,0xff,0xdc,0x00,0xab,0xff,0xdc,0x00,0xac,
-0xff,0xdc,0x00,0xad,0xff,0xdc,0x00,0xb4,0xff,0xdc,0x00,0xb5,0xff,0xdc,0x00,0xb6,
-0xff,0xdc,0x00,0xb7,0xff,0xdc,0x00,0xb8,0xff,0xdc,0x00,0xbb,0xff,0xdc,0x00,0xbc,
-0xff,0xdc,0x00,0xbd,0xff,0xdc,0x00,0xbe,0xff,0xdc,0x00,0xbf,0xff,0x44,0x00,0xc1,
-0xff,0x44,0x00,0xdd,0xff,0xdc,0x01,0x26,0xfe,0xe6,0x01,0x30,0xff,0x9a,0x01,0x31,
-0xff,0xdc,0x01,0x3a,0xfe,0xf0,0x07,0x7d,0xfe,0x61,0x07,0x7e,0xfd,0xe6,0x00,0x31,
-0x00,0x10,0xff,0xdc,0x00,0x24,0x00,0x2f,0x00,0x32,0xff,0xb7,0x00,0x37,0xfe,0xe6,
-0x00,0x38,0xff,0x9a,0x00,0x39,0xff,0x1f,0x00,0x3a,0xff,0x44,0x00,0x3c,0xfe,0xf0,
-0x00,0x48,0xff,0xdc,0x00,0x52,0xff,0xdc,0x00,0x58,0xff,0xdc,0x00,0x5c,0xff,0x44,
-0x00,0x82,0x00,0x2f,0x00,0x83,0x00,0x2f,0x00,0x84,0x00,0x2f,0x00,0x85,0x00,0x2f,
-0x00,0x86,0x00,0x2f,0x00,0x94,0xff,0xb7,0x00,0x95,0xff,0xb7,0x00,0x96,0xff,0xb7,
-0x00,0x97,0xff,0xb7,0x00,0x98,0xff,0xb7,0x00,0x9b,0xff,0x9a,0x00,0x9c,0xff,0x9a,
-0x00,0x9d,0xff,0x9a,0x00,0x9e,0xff,0x9a,0x00,0x9f,0xfe,0xf0,0x00,0xaa,0xff,0xdc,
-0x00,0xab,0xff,0xdc,0x00,0xac,0xff,0xdc,0x00,0xad,0xff,0xdc,0x00,0xb4,0xff,0xdc,
-0x00,0xb5,0xff,0xdc,0x00,0xb6,0xff,0xdc,0x00,0xb7,0xff,0xdc,0x00,0xb8,0xff,0xdc,
-0x00,0xbb,0xff,0xdc,0x00,0xbc,0xff,0xdc,0x00,0xbd,0xff,0xdc,0x00,0xbe,0xff,0xdc,
-0x00,0xbf,0xff,0x44,0x00,0xc1,0xff,0x44,0x00,0xdd,0xff,0xdc,0x01,0x26,0xfe,0xe6,
-0x01,0x30,0xff,0x9a,0x01,0x31,0xff,0xdc,0x01,0x3a,0xfe,0xf0,0x07,0x7d,0xfe,0x61,
-0x07,0x7e,0xfd,0xe6,0x00,0x01,0x00,0x4f,0xff,0x3f,0x00,0x03,0x07,0x7d,0xff,0x6b,
-0x07,0x7e,0xff,0x90,0x07,0x7f,0xff,0xa4,0x00,0x35,0x00,0x10,0xff,0xad,0x00,0x11,
-0xff,0xb7,0x00,0x1d,0xff,0xc1,0x00,0x24,0xff,0xad,0x00,0x26,0xff,0x9a,0x00,0x37,
-0xff,0x6b,0x00,0x39,0xff,0x90,0x00,0x3a,0xff,0xad,0x00,0x3c,0xff,0x7d,0x00,0x44,
-0xff,0xd3,0x00,0x48,0xff,0xa4,0x00,0x52,0xff,0xa4,0x00,0x58,0xff,0xa4,0x00,0x5c,
-0xff,0x90,0x00,0x6d,0xff,0x90,0x00,0x7d,0xff,0xdc,0x00,0x82,0xff,0xad,0x00,0x83,
-0xff,0xad,0x00,0x84,0xff,0xad,0x00,0x85,0xff,0xad,0x00,0x86,0xff,0xad,0x00,0x89,
-0xff,0x9a,0x00,0x9f,0xff,0x7d,0x00,0xa2,0xff,0xd3,0x00,0xa3,0xff,0xd3,0x00,0xa4,
-0xff,0xd3,0x00,0xa5,0xff,0xd3,0x00,0xa6,0xff,0xd3,0x00,0xa7,0xff,0xd3,0x00,0xaa,
-0xff,0xa4,0x00,0xab,0xff,0xa4,0x00,0xac,0xff,0xa4,0x00,0xad,0xff,0xa4,0x00,0xb4,
-0xff,0xa4,0x00,0xb5,0xff,0xa4,0x00,0xb6,0xff,0xa4,0x00,0xb7,0xff,0xa4,0x00,0xb8,
-0xff,0xa4,0x00,0xbb,0xff,0xa4,0x00,0xbc,0xff,0xa4,0x00,0xbd,0xff,0xa4,0x00,0xbe,
-0xff,0xa4,0x00,0xbf,0xff,0x90,0x00,0xc1,0xff,0x90,0x00,0xc8,0xff,0x9a,0x00,0xce,
-0xff,0x9a,0x00,0xdd,0xff,0xa4,0x01,0x26,0xff,0x6b,0x01,0x31,0xff,0xa4,0x01,0x3a,
-0xff,0x7d,0x07,0x7d,0xff,0x6b,0x07,0x7e,0xff,0x7d,0x07,0x7f,0xff,0xdc,0x00,0x24,
-0x00,0x10,0xff,0x7d,0x00,0x11,0xff,0x44,0x00,0x1d,0xff,0xdc,0x00,0x46,0xff,0xd3,
-0x00,0x47,0xff,0xdc,0x00,0x48,0xff,0xd3,0x00,0x4a,0xff,0xdc,0x00,0x4b,0xff,0xdc,
-0x00,0x50,0xff,0xdc,0x00,0x51,0xff,0xdc,0x00,0x52,0xff,0xd3,0x00,0x54,0xff,0xdc,
-0x00,0x55,0xff,0xdc,0x00,0x5b,0xff,0xc9,0x00,0x6d,0xff,0xb7,0x00,0xa9,0xff,0xd3,
-0x00,0xaa,0xff,0xd3,0x00,0xab,0xff,0xd3,0x00,0xac,0xff,0xd3,0x00,0xad,0xff,0xd3,
-0x00,0xb3,0xff,0xdc,0x00,0xb4,0xff,0xd3,0x00,0xb5,0xff,0xd3,0x00,0xb6,0xff,0xd3,
-0x00,0xb7,0xff,0xd3,0x00,0xb8,0xff,0xd3,0x00,0xc9,0xff,0xd3,0x00,0xcf,0xff,0xd3,
-0x00,0xd1,0x00,0x48,0x00,0xdd,0xff,0xd3,0x00,0xe1,0xff,0xdc,0x01,0x0a,0xff,0xdc,
-0x01,0x17,0xff,0xdc,0x01,0x1b,0xff,0xdc,0x07,0x7e,0x00,0x56,0x07,0x7f,0xfe,0xc9,
-0x00,0x35,0x00,0x10,0xff,0xad,0x00,0x11,0xff,0xb7,0x00,0x1d,0xff,0xc1,0x00,0x24,
-0xff,0xad,0x00,0x26,0xff,0x9a,0x00,0x37,0xff,0x6b,0x00,0x39,0xff,0x90,0x00,0x3a,
-0xff,0xad,0x00,0x3c,0xff,0x7d,0x00,0x44,0xff,0xd3,0x00,0x48,0xff,0xa4,0x00,0x52,
-0xff,0xa4,0x00,0x58,0xff,0xa4,0x00,0x5c,0xff,0x90,0x00,0x6d,0xff,0x90,0x00,0x7d,
-0xff,0xdc,0x00,0x82,0xff,0xad,0x00,0x83,0xff,0xad,0x00,0x84,0xff,0xad,0x00,0x85,
-0xff,0xad,0x00,0x86,0xff,0xad,0x00,0x89,0xff,0x9a,0x00,0x9f,0xff,0x7d,0x00,0xa2,
-0xff,0xd3,0x00,0xa3,0xff,0xd3,0x00,0xa4,0xff,0xd3,0x00,0xa5,0xff,0xd3,0x00,0xa6,
-0xff,0xd3,0x00,0xa7,0xff,0xd3,0x00,0xaa,0xff,0xa4,0x00,0xab,0xff,0xa4,0x00,0xac,
-0xff,0xa4,0x00,0xad,0xff,0xa4,0x00,0xb4,0xff,0xa4,0x00,0xb5,0xff,0xa4,0x00,0xb6,
-0xff,0xa4,0x00,0xb7,0xff,0xa4,0x00,0xb8,0xff,0xa4,0x00,0xbb,0xff,0xa4,0x00,0xbc,
-0xff,0xa4,0x00,0xbd,0xff,0xa4,0x00,0xbe,0xff,0xa4,0x00,0xbf,0xff,0x90,0x00,0xc1,
-0xff,0x90,0x00,0xc8,0xff,0x9a,0x00,0xce,0xff,0x9a,0x00,0xdd,0xff,0xa4,0x01,0x26,
-0xff,0x6b,0x01,0x31,0xff,0xa4,0x01,0x3a,0xff,0x7d,0x07,0x7d,0xff,0x6b,0x07,0x7e,
-0xff,0x7d,0x07,0x7f,0xff,0xdc,0x00,0x24,0x00,0x10,0xff,0x7d,0x00,0x11,0xff,0x44,
-0x00,0x1d,0xff,0xdc,0x00,0x46,0xff,0xd3,0x00,0x47,0xff,0xdc,0x00,0x48,0xff,0xd3,
-0x00,0x4a,0xff,0xdc,0x00,0x4b,0xff,0xdc,0x00,0x50,0xff,0xdc,0x00,0x51,0xff,0xdc,
-0x00,0x52,0xff,0xd3,0x00,0x54,0xff,0xdc,0x00,0x55,0xff,0xdc,0x00,0x5b,0xff,0xc9,
-0x00,0x6d,0xff,0xb7,0x00,0xa9,0xff,0xd3,0x00,0xaa,0xff,0xd3,0x00,0xab,0xff,0xd3,
-0x00,0xac,0xff,0xd3,0x00,0xad,0xff,0xd3,0x00,0xb3,0xff,0xdc,0x00,0xb4,0xff,0xd3,
-0x00,0xb5,0xff,0xd3,0x00,0xb6,0xff,0xd3,0x00,0xb7,0xff,0xd3,0x00,0xb8,0xff,0xd3,
-0x00,0xc9,0xff,0xd3,0x00,0xcf,0xff,0xd3,0x00,0xd1,0xff,0xdc,0x00,0xdd,0xff,0xd3,
-0x00,0xe1,0xff,0xdc,0x01,0x0a,0xff,0xdc,0x01,0x17,0xff,0xdc,0x01,0x1b,0xff,0xdc,
-0x07,0x7e,0x00,0x56,0x07,0x7f,0xfe,0xc9,0x00,0x06,0x00,0x24,0x00,0x26,0x00,0x82,
-0x00,0x26,0x00,0x83,0x00,0x26,0x00,0x84,0x00,0x26,0x00,0x85,0x00,0x26,0x00,0x86,
-0x00,0x26,0x00,0x06,0x00,0x24,0x00,0x26,0x00,0x82,0x00,0x26,0x00,0x83,0x00,0x26,
-0x00,0x84,0x00,0x26,0x00,0x85,0x00,0x26,0x00,0x86,0x00,0x26,0x00,0x3b,0x00,0x10,
-0xff,0x44,0x00,0x11,0xff,0x0d,0x00,0x1d,0xff,0x1f,0x00,0x24,0xff,0x61,0x00,0x26,
-0xff,0x88,0x00,0x37,0xff,0xdc,0x00,0x44,0xfe,0xad,0x00,0x46,0xfe,0xa4,0x00,0x48,
-0xfe,0xa4,0x00,0x4c,0xff,0xc1,0x00,0x52,0xfe,0xa4,0x00,0x55,0xfe,0xd3,0x00,0x56,
-0xfe,0xad,0x00,0x58,0xfe,0xc9,0x00,0x5a,0xfe,0xad,0x00,0x5c,0xfe,0xc1,0x00,0x6d,
-0xff,0x44,0x00,0x7d,0xff,0x90,0x00,0x82,0xff,0x61,0x00,0x83,0xff,0x61,0x00,0x84,
-0xff,0x61,0x00,0x85,0xff,0x61,0x00,0x86,0xff,0x61,0x00,0x89,0xff,0x88,0x00,0xa2,
-0xfe,0xad,0x00,0xa3,0xfe,0xad,0x00,0xa4,0xfe,0xad,0x00,0xa5,0xfe,0xad,0x00,0xa6,
-0xfe,0xad,0x00,0xa7,0xfe,0xad,0x00,0xa9,0xfe,0xa4,0x00,0xaa,0xfe,0xa4,0x00,0xab,
-0xfe,0xa4,0x00,0xac,0xfe,0xa4,0x00,0xad,0xfe,0xa4,0x00,0xb4,0xfe,0xa4,0x00,0xb5,
-0xfe,0xa4,0x00,0xb6,0xfe,0xa4,0x00,0xb7,0xfe,0xa4,0x00,0xb8,0xfe,0xa4,0x00,0xbb,
-0xfe,0xc9,0x00,0xbc,0xfe,0xc9,0x00,0xbd,0xfe,0xc9,0x00,0xbe,0xfe,0xc9,0x00,0xbf,
-0xfe,0xc1,0x00,0xc1,0xfe,0xc1,0x00,0xc8,0xff,0x88,0x00,0xc9,0xfe,0xa4,0x00,0xce,
-0xff,0x88,0x00,0xcf,0xfe,0xa4,0x00,0xdd,0xfe,0xa4,0x01,0x17,0xfe,0xd3,0x01,0x1b,
-0xfe,0xd3,0x01,0x21,0xfe,0xad,0x01,0x23,0xfe,0xad,0x01,0x26,0xff,0xdc,0x01,0x31,
-0xfe,0xc9,0x07,0x7e,0xff,0xd3,0x07,0x7f,0xfe,0xf8,0x00,0x02,0x00,0x3d,0xff,0xdc,
-0x01,0x3f,0xff,0xdc,0x00,0x32,0x00,0x10,0xff,0x0d,0x00,0x11,0xfe,0x61,0x00,0x1d,
-0xfe,0xf0,0x00,0x24,0xff,0x61,0x00,0x26,0xff,0x90,0x00,0x32,0xff,0x90,0x00,0x44,
-0xfe,0xe6,0x00,0x48,0xfe,0xf0,0x00,0x4c,0xff,0xb7,0x00,0x52,0xfe,0xf0,0x00,0x58,
-0xff,0x15,0x00,0x6d,0xff,0x1f,0x00,0x7d,0xff,0x6b,0x00,0x82,0xff,0x61,0x00,0x83,
-0xff,0x61,0x00,0x84,0xff,0x61,0x00,0x85,0xff,0x61,0x00,0x86,0xff,0x61,0x00,0x89,
-0xff,0x90,0x00,0x94,0xff,0x90,0x00,0x95,0xff,0x90,0x00,0x96,0xff,0x90,0x00,0x97,
-0xff,0x90,0x00,0x98,0xff,0x90,0x00,0xa2,0xfe,0xe6,0x00,0xa3,0xfe,0xe6,0x00,0xa4,
-0xfe,0xe6,0x00,0xa5,0xfe,0xe6,0x00,0xa6,0xfe,0xe6,0x00,0xa7,0xfe,0xe6,0x00,0xaa,
-0xfe,0xf0,0x00,0xab,0xfe,0xf0,0x00,0xac,0xfe,0xf0,0x00,0xad,0xfe,0xf0,0x00,0xb4,
-0xfe,0xf0,0x00,0xb5,0xfe,0xf0,0x00,0xb6,0xfe,0xf0,0x00,0xb7,0xfe,0xf0,0x00,0xb8,
-0xfe,0xf0,0x00,0xbb,0xff,0x15,0x00,0xbc,0xff,0x15,0x00,0xbd,0xff,0x15,0x00,0xbe,
-0xff,0x15,0x00,0xc8,0xff,0x90,0x00,0xce,0xff,0x90,0x00,0xdd,0xfe,0xf0,0x01,0x31,
-0xff,0x15,0x07,0x7d,0xff,0x90,0x07,0x7e,0xff,0xdc,0x07,0x7f,0xfe,0xf8,0x00,0x04,
-0x00,0x10,0xff,0xdc,0x07,0x7d,0xff,0xdc,0x07,0x7e,0xff,0xdc,0x07,0x7f,0xff,0xdc,
-0x00,0x23,0x00,0x24,0xff,0xd3,0x00,0x25,0xff,0xb7,0x00,0x2a,0x00,0x4b,0x00,0x2d,
-0x00,0x72,0x00,0x32,0x00,0x39,0x00,0x34,0x00,0x4b,0x00,0x37,0xff,0x44,0x00,0x39,
-0xff,0x88,0x00,0x3a,0xff,0xad,0x00,0x3b,0xff,0x9a,0x00,0x3c,0xff,0x0d,0x00,0x52,
-0x00,0x26,0x00,0x59,0xff,0xc9,0x00,0x5c,0xff,0xdc,0x00,0x82,0xff,0xd3,0x00,0x83,
-0xff,0xd3,0x00,0x84,0xff,0xd3,0x00,0x85,0xff,0xd3,0x00,0x86,0xff,0xd3,0x00,0x94,
-0x00,0x39,0x00,0x95,0x00,0x39,0x00,0x96,0x00,0x39,0x00,0x97,0x00,0x39,0x00,0x98,
-0x00,0x39,0x00,0x9f,0xff,0x0d,0x00,0xb4,0x00,0x26,0x00,0xb5,0x00,0x26,0x00,0xb6,
-0x00,0x26,0x00,0xb7,0x00,0x26,0x00,0xb8,0x00,0x26,0x00,0xbf,0xff,0xdc,0x00,0xc1,
-0xff,0xdc,0x00,0xe0,0x00,0x4b,0x01,0x26,0xff,0x44,0x01,0x3a,0xff,0x0d,0x00,0x3a,
-0x00,0x24,0xfe,0xf8,0x00,0x25,0xff,0xc1,0x00,0x26,0xff,0xb7,0x00,0x27,0xff,0xc1,
-0x00,0x29,0xff,0xc1,0x00,0x2a,0xff,0xb7,0x00,0x2b,0xff,0xc1,0x00,0x2d,0xff,0xc1,
-0x00,0x2e,0xff,0xc1,0x00,0x2f,0xff,0xc1,0x00,0x32,0xff,0xb7,0x00,0x33,0xff,0xc1,
-0x00,0x34,0xff,0xb7,0x00,0x35,0xff,0xc1,0x00,0x3b,0xff,0x88,0x00,0x3d,0xff,0xdc,
-0x00,0x49,0xff,0xb7,0x00,0x51,0xff,0x90,0x00,0x52,0xff,0x6b,0x00,0x55,0xff,0x90,
-0x00,0x59,0xff,0xb7,0x00,0x5a,0xff,0xb7,0x00,0x5c,0xff,0xb7,0x00,0x82,0xfe,0xf8,
-0x00,0x83,0xfe,0xf8,0x00,0x84,0xfe,0xf8,0x00,0x85,0xfe,0xf8,0x00,0x86,0xfe,0xf8,
-0x00,0x88,0xfe,0x7d,0x00,0x89,0xff,0xb7,0x00,0x94,0xff,0xb7,0x00,0x95,0xff,0xb7,
-0x00,0x96,0xff,0xb7,0x00,0x97,0xff,0xb7,0x00,0x98,0xff,0xb7,0x00,0xa0,0xff,0xc1,
-0x00,0xa1,0xff,0xc1,0x00,0xb2,0xff,0xb7,0x00,0xb3,0xff,0x90,0x00,0xb4,0xff,0x6b,
-0x00,0xb5,0xff,0x6b,0x00,0xb6,0xff,0x6b,0x00,0xb7,0xff,0x6b,0x00,0xb8,0xff,0x6b,
-0x00,0xbf,0xff,0xb7,0x00,0xc1,0xff,0xb7,0x00,0xc8,0xff,0xb7,0x00,0xce,0xff,0xb7,
-0x00,0xd0,0xff,0xc1,0x00,0xe0,0xff,0xb7,0x00,0xfb,0xff,0xc1,0x00,0xff,0xff,0xc1,
-0x01,0x0a,0xff,0x90,0x01,0x16,0xff,0xc1,0x01,0x17,0xff,0x90,0x01,0x1a,0xff,0xc1,
-0x01,0x1b,0xff,0x90,0x01,0x3f,0xff,0xdc,0x00,0x3f,0x00,0x24,0x00,0x26,0x00,0x25,
-0xff,0xb7,0x00,0x26,0xff,0x90,0x00,0x27,0xff,0xb7,0x00,0x29,0xff,0xb7,0x00,0x2a,
-0xff,0xb7,0x00,0x2b,0xff,0xb7,0x00,0x2d,0x00,0x2f,0x00,0x2e,0xff,0xb7,0x00,0x2f,
-0xff,0xb7,0x00,0x32,0xff,0x90,0x00,0x33,0xff,0xb7,0x00,0x34,0xff,0x90,0x00,0x35,
-0xff,0xb7,0x00,0x37,0xfe,0xe6,0x00,0x39,0xfe,0x88,0x00,0x3a,0xff,0x03,0x00,0x3b,
-0xff,0xb7,0x00,0x3c,0xfe,0x88,0x00,0x49,0xff,0xdc,0x00,0x51,0xff,0xb7,0x00,0x52,
-0xff,0xb7,0x00,0x55,0xff,0xb7,0x00,0x59,0xff,0x15,0x00,0x5a,0xff,0x3c,0x00,0x5c,
-0xff,0x90,0x00,0x82,0x00,0x26,0x00,0x83,0x00,0x26,0x00,0x84,0x00,0x26,0x00,0x85,
-0x00,0x26,0x00,0x86,0x00,0x26,0x00,0x88,0x00,0x26,0x00,0x89,0xff,0x90,0x00,0x94,
-0xff,0x90,0x00,0x95,0xff,0x90,0x00,0x96,0xff,0x90,0x00,0x97,0xff,0x90,0x00,0x98,
-0xff,0x90,0x00,0x9f,0xfe,0x88,0x00,0xa0,0xff,0xb7,0x00,0xa1,0xff,0xb7,0x00,0xb2,
-0xff,0xb7,0x00,0xb3,0xff,0xb7,0x00,0xb4,0xff,0xb7,0x00,0xb5,0xff,0xb7,0x00,0xb6,
-0xff,0xb7,0x00,0xb7,0xff,0xb7,0x00,0xb8,0xff,0xb7,0x00,0xbf,0xff,0x90,0x00,0xc1,
-0xff,0x90,0x00,0xc8,0xff,0x90,0x00,0xce,0xff,0x90,0x00,0xd0,0xff,0xb7,0x00,0xe0,
-0xff,0xb7,0x00,0xfb,0xff,0xb7,0x00,0xff,0xff,0xb7,0x01,0x0a,0xff,0xb7,0x01,0x16,
-0xff,0xb7,0x01,0x17,0xff,0xb7,0x01,0x1a,0xff,0xb7,0x01,0x1b,0xff,0xb7,0x01,0x26,
-0xfe,0xe6,0x01,0x3a,0xfe,0x88,0x00,0x01,0x00,0x5e,0x00,0x10,0x00,0x24,0x00,0x25,
-0x00,0x26,0x00,0x27,0x00,0x29,0x00,0x2a,0x00,0x2b,0x00,0x2d,0x00,0x2e,0x00,0x2f,
-0x00,0x32,0x00,0x33,0x00,0x34,0x00,0x35,0x00,0x36,0x00,0x37,0x00,0x38,0x00,0x39,
-0x00,0x3a,0x00,0x3b,0x00,0x3c,0x00,0x3d,0x00,0x48,0x00,0x49,0x00,0x4e,0x00,0x51,
-0x00,0x52,0x00,0x55,0x00,0x59,0x00,0x5a,0x00,0x5b,0x00,0x5c,0x00,0x6d,0x00,0x7d,
-0x00,0x82,0x00,0x83,0x00,0x84,0x00,0x85,0x00,0x86,0x00,0x88,0x00,0x89,0x00,0x92,
-0x00,0x94,0x00,0x95,0x00,0x96,0x00,0x97,0x00,0x98,0x00,0x9b,0x00,0x9c,0x00,0x9d,
-0x00,0x9e,0x00,0x9f,0x00,0xa0,0x00,0xa1,0x00,0xaa,0x00,0xab,0x00,0xac,0x00,0xad,
-0x00,0xb2,0x00,0xb3,0x00,0xb4,0x00,0xb5,0x00,0xb6,0x00,0xb7,0x00,0xb8,0x00,0xbf,
-0x00,0xc1,0x00,0xc2,0x00,0xc4,0x00,0xc6,0x00,0xc8,0x00,0xce,0x00,0xd0,0x00,0xd2,
-0x00,0xdd,0x00,0xe0,0x00,0xfb,0x00,0xff,0x01,0x02,0x01,0x0a,0x01,0x16,0x01,0x17,
-0x01,0x1a,0x01,0x1b,0x01,0x20,0x01,0x22,0x01,0x26,0x01,0x30,0x01,0x3a,0x01,0x3f,
-0x07,0x71,0x07,0x7d,0x07,0x7f,0x00,0x01,0x0a,0x5e,0x08,0xfe,0x00,0x01,0x0a,0x92,
-0x00,0x0c,0x01,0x1e,0x02,0x3e,0x02,0x44,0x02,0x4a,0x02,0x50,0x02,0x56,0x02,0x5c,
-0x02,0x62,0x02,0x68,0x02,0x6e,0x02,0x74,0x02,0x7a,0x02,0x80,0x02,0x86,0x02,0x8c,
-0x02,0x92,0x02,0x98,0x02,0x9e,0x02,0xa4,0x02,0xaa,0x02,0xb0,0x02,0xb6,0x02,0xbc,
-0x02,0xc2,0x02,0xc8,0x02,0xce,0x02,0xd4,0x02,0xda,0x02,0xe0,0x02,0xe6,0x02,0xec,
-0x02,0xf2,0x02,0xf8,0x02,0xfe,0x03,0x04,0x03,0x0a,0x03,0x10,0x03,0x16,0x03,0x1c,
-0x03,0x22,0x03,0x28,0x03,0x2e,0x03,0x34,0x03,0x3a,0x03,0x40,0x03,0x46,0x03,0x4c,
-0x03,0x52,0x03,0x58,0x03,0x5e,0x03,0x64,0x03,0x6a,0x03,0x70,0x03,0x76,0x03,0x7c,
-0x03,0x82,0x03,0x88,0x03,0x8e,0x03,0x94,0x03,0x9a,0x03,0xa0,0x03,0xa6,0x03,0xac,
-0x03,0xb2,0x03,0xb8,0x03,0xbe,0x03,0xc4,0x03,0xca,0x03,0xd0,0x03,0xd6,0x03,0xdc,
-0x03,0xe2,0x03,0xe8,0x03,0xee,0x03,0xf4,0x03,0xfa,0x04,0x00,0x04,0x06,0x04,0x0c,
-0x04,0x12,0x04,0x18,0x04,0x1e,0x04,0x24,0x04,0x2a,0x04,0x30,0x04,0x36,0x04,0x3c,
-0x04,0x42,0x04,0x48,0x04,0x4e,0x04,0x54,0x04,0x5a,0x04,0x60,0x04,0x66,0x04,0x6c,
-0x04,0x72,0x04,0x78,0x04,0x7e,0x04,0x84,0x04,0x8a,0x04,0x90,0x04,0x96,0x04,0x9c,
-0x04,0xa2,0x04,0xa8,0x04,0xae,0x04,0xb4,0x04,0xba,0x04,0xc0,0x04,0xc6,0x04,0xcc,
-0x04,0xd2,0x04,0xd8,0x04,0xde,0x04,0xe4,0x04,0xea,0x04,0xf0,0x04,0xf6,0x04,0xfc,
-0x05,0x02,0x05,0x08,0x05,0x0e,0x05,0x14,0x05,0x1a,0x05,0x20,0x05,0x26,0x05,0x2c,
-0x05,0x32,0x05,0x38,0x05,0x3e,0x05,0x44,0x05,0x4a,0x05,0x50,0x05,0x56,0x05,0x5c,
-0x05,0x62,0x05,0x68,0x05,0x6e,0x05,0x74,0x05,0x7a,0x05,0x80,0x05,0x86,0x05,0x8c,
-0x05,0x92,0x05,0x98,0x05,0x9e,0x05,0xa4,0x05,0xaa,0x05,0xb0,0x05,0xb6,0x05,0xbc,
-0x05,0xc2,0x05,0xc8,0x05,0xce,0x05,0xd4,0x05,0xda,0x05,0xe0,0x05,0xe6,0x05,0xec,
-0x05,0xf2,0x05,0xf8,0x05,0xfe,0x06,0x04,0x06,0x0a,0x06,0x10,0x06,0x16,0x06,0x1c,
-0x06,0x22,0x06,0x28,0x06,0x2e,0x06,0x34,0x06,0x3a,0x06,0x40,0x06,0x46,0x06,0x4c,
-0x06,0x52,0x06,0x58,0x06,0x5e,0x06,0x64,0x06,0x6a,0x06,0x70,0x06,0x76,0x06,0x7c,
-0x06,0x82,0x06,0x88,0x06,0x8e,0x06,0x94,0x06,0x9a,0x06,0xa0,0x06,0xa6,0x06,0xac,
-0x06,0xb2,0x06,0xb8,0x06,0xbe,0x06,0xc4,0x06,0xca,0x06,0xd0,0x06,0xd6,0x06,0xdc,
-0x06,0xe2,0x06,0xe8,0x06,0xee,0x06,0xf4,0x06,0xfa,0x07,0x00,0x07,0x06,0x07,0x0c,
-0x07,0x12,0x07,0x18,0x07,0x1e,0x07,0x24,0x07,0x2a,0x07,0x30,0x07,0x36,0x07,0x3c,
-0x07,0x42,0x07,0x48,0x07,0x4e,0x07,0x54,0x07,0x5a,0x07,0x60,0x07,0x66,0x07,0x6c,
-0x07,0x72,0x07,0x78,0x07,0x7e,0x07,0x84,0x07,0x8a,0x07,0x90,0x07,0x96,0x07,0x9c,
-0x07,0xa2,0x07,0xa8,0x07,0xae,0x07,0xb4,0x07,0xba,0x07,0xc0,0x07,0xc6,0x07,0xcc,
-0x07,0xd2,0x07,0xd8,0x07,0xde,0x07,0xe4,0x07,0xea,0x07,0xf0,0x07,0xf6,0x07,0xfc,
-0x08,0x02,0x08,0x08,0x08,0x0e,0x08,0x14,0x08,0x1a,0x08,0x20,0x08,0x26,0x08,0x2c,
-0x08,0x32,0x08,0x38,0x08,0x3e,0x08,0x44,0x08,0x4a,0x08,0x50,0x08,0x56,0x08,0x5c,
-0x08,0x62,0x08,0x68,0x08,0x6e,0x08,0x74,0x08,0x7a,0x08,0x80,0x08,0x86,0x08,0x8c,
-0x08,0x92,0x08,0x98,0x08,0x9e,0x08,0xa4,0x08,0xaa,0x08,0xb0,0x08,0xb6,0x08,0xbc,
-0x08,0xc2,0x08,0xc8,0x08,0xce,0x08,0xd4,0x08,0xda,0x08,0xe0,0x08,0xe6,0x08,0xec,
-0x00,0x01,0x02,0xbc,0x05,0xf0,0x00,0x01,0x02,0xbc,0x05,0xf0,0x00,0x01,0x03,0x4c,
-0x05,0xf0,0x00,0x01,0x02,0xec,0x06,0x04,0x00,0x01,0x02,0x9e,0x05,0xf0,0x00,0x01,
-0x02,0x9e,0x05,0xf0,0x00,0x01,0x03,0x5c,0x05,0xf0,0x00,0x01,0x03,0x02,0x05,0xf0,
-0x00,0x01,0x01,0x2f,0x05,0xf0,0x00,0x01,0x01,0x2e,0x05,0xf0,0x00,0x01,0x02,0x9e,
-0x05,0xf0,0x00,0x01,0x01,0x2a,0x05,0xf0,0x00,0x01,0x03,0x73,0x05,0xf0,0x00,0x01,
-0x02,0xf5,0x05,0xe2,0x00,0x01,0x03,0x27,0x05,0xf0,0x00,0x01,0x02,0x9e,0x05,0xf0,
-0x00,0x01,0x03,0x27,0x05,0xf0,0x00,0x01,0x02,0x7d,0x05,0xe2,0x00,0x01,0x02,0x93,
-0x05,0xf0,0x00,0x01,0x02,0x73,0x05,0xe2,0x00,0x01,0x02,0xee,0x05,0xf0,0x00,0x01,
-0x02,0xbc,0x05,0xf0,0x00,0x01,0x03,0xf5,0x05,0xf7,0x00,0x01,0x02,0xcd,0x05,0xf0,
-0x00,0x01,0x02,0x72,0x05,0xf7,0x00,0x01,0x02,0xbe,0x05,0xf0,0x00,0x01,0x02,0x54,
-0x04,0x7b,0x00,0x01,0x01,0x16,0x05,0xf0,0x00,0x01,0x02,0xa6,0x04,0x7b,0x00,0x01,
-0x03,0xfe,0x05,0xf0,0x00,0x01,0x02,0x8d,0x04,0x7b,0x00,0x01,0x01,0x3b,0x05,0xf0,
-0x00,0x01,0x02,0x6a,0x04,0x7b,0x00,0x01,0x01,0x16,0x05,0xf0,0x00,0x01,0x01,0x1f,
-0x06,0x2f,0x00,0x01,0x01,0x1f,0x06,0x2f,0x00,0x01,0x01,0x16,0x05,0xf0,0x00,0x01,
-0x01,0x16,0x05,0xf0,0x00,0x01,0x03,0xe9,0x04,0x7b,0x00,0x01,0x02,0x89,0x04,0x7b,
-0x00,0x01,0x02,0x7d,0x04,0x7b,0x00,0x01,0x02,0xa6,0x04,0x7b,0x00,0x01,0x02,0x6f,
-0x04,0x7b,0x00,0x01,0x02,0x17,0x04,0x7b,0x00,0x01,0x02,0x27,0x04,0x7b,0x00,0x01,
-0x01,0x1a,0x05,0xf0,0x00,0x01,0x02,0x7d,0x04,0x7b,0x00,0x01,0x02,0x5e,0x04,0x7b,
-0x00,0x01,0x03,0x47,0x04,0x82,0x00,0x01,0x02,0x62,0x04,0x7b,0x00,0x01,0x02,0x60,
-0x04,0x82,0x00,0x01,0x02,0x17,0x04,0x7b,0x00,0x01,0x03,0x27,0x05,0xf0,0x00,0x01,
-0x03,0xe3,0x04,0x7b,0x00,0x01,0x02,0xa6,0x04,0x7b,0x00,0x01,0x02,0x7d,0x05,0xf0,
-0x00,0x01,0x02,0x7d,0x04,0x7b,0x00,0x01,0x01,0x16,0x05,0xf0,0x00,0x01,0x03,0xaa,
-0x05,0xf0,0x00,0x01,0x01,0x51,0x05,0xf0,0x00,0x01,0x01,0x1f,0x04,0x7b,0x00,0x01,
-0x02,0xf5,0x05,0xe2,0x00,0x01,0x02,0x89,0x04,0x7b,0x00,0x01,0x04,0x14,0x04,0x7b,
-0x00,0x01,0x02,0x7d,0x04,0x7b,0x00,0x01,0x01,0x16,0x05,0xf0,0x00,0x01,0x02,0x5c,
-0x05,0xf0,0x00,0x01,0x03,0x4c,0x05,0xf0,0x00,0x01,0x02,0x9e,0x05,0xf0,0x00,0x01,
-0x02,0xbc,0x05,0xf0,0x00,0x01,0x02,0x9e,0x05,0xf0,0x00,0x01,0x01,0x3b,0x05,0xf0,
-0x00,0x01,0x03,0x5c,0x05,0xf0,0x00,0x01,0x01,0x2f,0x05,0xf0,0x00,0x01,0x01,0x2f,
-0x05,0xf0,0x00,0x01,0x02,0x9e,0x05,0xf0,0x00,0x01,0x01,0x16,0x06,0x89,0x00,0x01,
-0x01,0x16,0x05,0xf0,0x00,0x01,0x02,0x82,0x05,0xf0,0x00,0x01,0x02,0xf5,0x05,0xe2,
-0x00,0x01,0x03,0x02,0x05,0xf0,0x00,0x01,0x02,0x93,0x05,0xf0,0x00,0x01,0x02,0x27,
-0x04,0x7b,0x00,0x01,0x01,0x16,0x06,0x18,0x00,0x01,0x01,0x1a,0x05,0xf0,0x00,0x01,
-0x02,0x73,0x05,0xe2,0x00,0x01,0x01,0x1a,0x06,0x89,0x00,0x01,0x02,0x73,0x05,0xe2,
-0x00,0x01,0x02,0xa7,0x05,0xf0,0x00,0x01,0x02,0x72,0x05,0xf7,0x00,0x01,0x02,0x60,
-0x04,0x82,0x00,0x01,0x02,0xbe,0x05,0xf0,0x00,0x01,0x02,0x17,0x04,0x7b,0x00,0x01,
-0x02,0x8d,0x04,0x77,0x00,0x01,0x03,0x27,0x05,0xf0,0x00,0x01,0x01,0x0f,0x05,0xea,
-0x00,0x01,0x02,0x89,0x04,0x7b,0x00,0x01,0x01,0x1a,0x05,0xf0,0x00,0x01,0x01,0x1f,
-0x04,0x7b,0x00,0x01,0x02,0x54,0x04,0x7b,0x00,0x01,0x02,0x54,0x04,0x7b,0x00,0x01,
-0x02,0x8d,0x04,0x7b,0x00,0x01,0x01,0x16,0x05,0xf0,0x00,0x01,0x01,0xb1,0x04,0x79,
-0x00,0x01,0x02,0xa6,0x04,0x7b,0x00,0x01,0x03,0xfe,0x05,0xf0,0x00,0x01,0x03,0xfe,
-0x05,0xf0,0x00,0x01,0x02,0x63,0x04,0x7b,0x00,0x01,0x02,0x52,0x04,0x7b,0x00,0x01,
-0x02,0x5e,0x04,0x7b,0x00,0x01,0x02,0x40,0x04,0x7b,0x00,0x01,0x02,0x40,0x04,0x7b,
-0x00,0x01,0x02,0x22,0x04,0x7b,0x00,0x01,0x02,0xfc,0x04,0x7b,0x00,0x01,0x01,0x1f,
-0x04,0x7b,0x00,0x01,0x02,0x6a,0x05,0xf0,0x00,0x01,0x02,0x6a,0x04,0x7b,0x00,0x01,
-0x02,0xa6,0x04,0x7b,0x00,0x01,0x02,0xd6,0x04,0x7b,0x00,0x01,0x02,0x62,0x04,0x7b,
-0x00,0x01,0x02,0x7d,0x04,0x7b,0x00,0x01,0x01,0x16,0x05,0xf0,0x00,0x01,0x01,0x16,
-0x05,0xf0,0x00,0x01,0x01,0x7f,0x06,0x2f,0x00,0x01,0x01,0x1f,0x04,0x7b,0x00,0x01,
-0x01,0x80,0x04,0x7b,0x00,0x01,0x01,0xfe,0x05,0xf0,0x00,0x01,0x01,0xfe,0x05,0xf0,
-0x00,0x01,0x01,0x16,0x05,0xf0,0x00,0x01,0x01,0x16,0x05,0xf0,0x00,0x01,0x03,0xe9,
-0x04,0x7b,0x00,0x01,0x03,0xe9,0x04,0x7b,0x00,0x01,0x03,0xe9,0x04,0x7b,0x00,0x01,
-0x02,0x89,0x04,0x7b,0x00,0x01,0x02,0x89,0x04,0x7b,0x00,0x01,0x02,0x89,0x04,0x7b,
-0x00,0x01,0x02,0x7d,0x04,0x7b,0x00,0x01,0x04,0x8d,0x04,0x7b,0x00,0x01,0x02,0xe9,
-0x04,0x7b,0x00,0x01,0x02,0x70,0x05,0xf0,0x00,0x01,0x02,0xa4,0x04,0x7b,0x00,0x01,
-0x02,0xa4,0x05,0xf0,0x00,0x01,0x02,0xa4,0x04,0x7b,0x00,0x01,0x02,0x17,0x04,0x7b,
-0x00,0x01,0x02,0x17,0x04,0x7b,0x00,0x01,0x02,0x70,0x04,0x7b,0x00,0x01,0x01,0x82,
-0x04,0x7b,0x00,0x01,0x01,0xb3,0x04,0x7b,0x00,0x01,0x01,0xc9,0x04,0x7b,0x00,0x01,
-0x02,0x27,0x04,0x7b,0x00,0x01,0x01,0x16,0x05,0xf0,0x00,0x01,0x01,0x74,0x05,0xf0,
-0x00,0x01,0x01,0xf1,0x04,0x7b,0x00,0x01,0x01,0x16,0x05,0xf0,0x00,0x01,0x02,0x0e,
-0x04,0x7b,0x00,0x01,0x01,0x1a,0x05,0xf0,0x00,0x01,0x02,0x7d,0x04,0x7b,0x00,0x01,
-0x02,0x7d,0x04,0x7b,0x00,0x01,0x02,0x7d,0x04,0x7b,0x00,0x01,0x02,0x5e,0x04,0x7b,
-0x00,0x01,0x03,0x47,0x04,0x82,0x00,0x01,0x02,0x5e,0x05,0xf0,0x00,0x01,0x02,0x64,
-0x04,0x82,0x00,0x01,0x02,0x17,0x04,0x7b,0x00,0x01,0x02,0x17,0x04,0x7b,0x00,0x01,
-0x02,0x17,0x04,0x7b,0x00,0x01,0x02,0x17,0x04,0x7b,0x00,0x01,0x01,0xb0,0x05,0xf0,
-0x00,0x01,0x02,0x3a,0x05,0xf0,0x00,0x01,0x01,0xb0,0x05,0xf0,0x00,0x01,0x02,0x3a,
-0x05,0xf0,0x00,0x01,0x02,0x6b,0x04,0x7b,0x00,0x01,0x02,0x61,0x04,0x7b,0x00,0x01,
-0x02,0x89,0x04,0x7b,0x00,0x01,0x02,0xa6,0x05,0xf0,0x00,0x01,0x02,0xa3,0x04,0x71,
-0x00,0x01,0x01,0x1f,0x06,0x2f,0x00,0x01,0x02,0xab,0x04,0x7b,0x00,0x01,0x01,0x18,
-0x04,0x7b,0x00,0x01,0x02,0x6a,0x05,0xf0,0x00,0x01,0x01,0xb0,0x05,0xf0,0x00,0x01,
-0x02,0x3a,0x05,0xf0,0x00,0x01,0x03,0xfe,0x05,0xf0,0x00,0x01,0x03,0xfe,0x05,0xf0,
-0x00,0x01,0x03,0xfe,0x05,0xf0,0x00,0x01,0x04,0xa3,0x04,0x7b,0x00,0x01,0x03,0x47,
-0x05,0xf0,0x00,0x01,0x04,0x8e,0x04,0x7b,0x00,0x01,0x03,0x20,0x05,0xf0,0x00,0x01,
-0x01,0x16,0x05,0xf0,0x00,0x01,0x01,0x16,0x05,0xf0,0x00,0x01,0x02,0x4a,0x04,0x7b,
-0x00,0x01,0x02,0x7e,0x05,0xf0,0x00,0x01,0x02,0x5e,0x04,0x82,0x00,0x01,0x02,0x7d,
-0x05,0xf0,0x00,0x01,0x02,0x40,0x04,0x7b,0x00,0x01,0x02,0x45,0x05,0xf0,0x00,0x01,
-0x02,0x89,0x04,0x7b,0x00,0x01,0x02,0x7d,0x05,0xf0,0x00,0x01,0x01,0x10,0x04,0x7b,
-0x00,0x01,0x02,0xa3,0x04,0x7b,0x00,0x01,0x02,0x82,0x05,0xf0,0x00,0x01,0x02,0x87,
-0x04,0x7b,0x00,0x01,0x02,0x16,0x04,0x7b,0x00,0x01,0x02,0x45,0x05,0xf0,0x00,0x01,
-0x02,0x7d,0x04,0x7b,0x00,0x01,0x02,0x70,0x04,0x7b,0x00,0x01,0x02,0xa6,0x04,0x7b,
-0x00,0x01,0x02,0x74,0x04,0x7b,0x00,0x01,0x02,0x7d,0x04,0x7b,0x00,0x01,0x02,0x6a,
-0x04,0x7b,0x00,0x01,0x02,0x1a,0x04,0x7b,0x00,0x01,0x02,0xaa,0x04,0x7b,0x00,0x01,
-0x02,0x62,0x04,0x7b,0x00,0x01,0x02,0xa4,0x04,0x7b,0x00,0x01,0x03,0x5e,0x04,0x7b,
-0x00,0x01,0x02,0x7e,0x05,0xf0,0x00,0x01,0x02,0x7e,0x05,0xf0,0x00,0x01,0x02,0xa0,
-0x05,0xf0,0x00,0x01,0x02,0xed,0x04,0x82,0x00,0x01,0x02,0x7d,0x04,0x7b,0x00,0x01,
-0x02,0x74,0x04,0x7b,0x00,0x01,0x03,0x5e,0x04,0x7b,0x00,0x01,0x02,0xee,0x04,0x82,
-0x00,0x01,0x02,0xa6,0x04,0x7b,0x00,0x01,0x02,0xa6,0x04,0x7b,0x00,0x01,0x01,0x1f,
-0x06,0x2f,0x00,0x01,0x02,0xa6,0x04,0x7b,0x00,0x01,0x01,0xf2,0x04,0x7b,0x00,0x01,
-0x01,0x16,0x05,0xf0,0x00,0x01,0x02,0xa6,0x04,0x7b,0x00,0x01,0x02,0x54,0x04,0x7b,
-0x00,0x01,0x02,0x7d,0x05,0xf0,0x00,0x01,0x02,0x61,0x04,0x7b,0x00,0x01,0x02,0x45,
-0x04,0x7b,0x00,0x01,0x02,0xe2,0x04,0x7b,0x00,0x01,0x02,0x8d,0x04,0x7b,0x00,0x01,
-0x02,0xf2,0x04,0x7b,0x00,0x01,0x02,0x40,0x04,0x7b,0x00,0x01,0x02,0x89,0x04,0x7b,
-0x00,0x01,0x02,0xa3,0x04,0x7b,0x00,0x01,0x02,0xf8,0x04,0x7b,0x00,0x01,0x03,0x05,
-0x04,0x7b,0x00,0x01,0x02,0x89,0x04,0x7b,0x00,0x01,0x02,0x7d,0x04,0x7b,0x00,0x01,
-0x02,0xa4,0x04,0x7b,0x00,0x01,0x02,0xa6,0x04,0x7b,0x00,0x01,0x02,0xa6,0x04,0x7b,
-0x00,0x01,0x02,0x16,0x04,0x7b,0x00,0x01,0x02,0x60,0x04,0x82,0x00,0x01,0x03,0xaa,
-0x05,0xf0,0x00,0x01,0x02,0x62,0x04,0x7b,0x00,0x01,0x02,0xa4,0x04,0x7b,0x00,0x01,
-0x02,0x4b,0x04,0x7b,0x00,0x01,0x03,0x73,0x04,0x7b,0x00,0x01,0x03,0x73,0x04,0x7b,
-0x00,0x01,0x02,0x06,0x04,0x7b,0x00,0x01,0x03,0x1d,0x04,0x7b,0x00,0x01,0x01,0x1d,
-0x04,0x7b,0x00,0x01,0x04,0x11,0x04,0x7b,0x00,0x01,0x02,0x75,0x04,0x7b,0x00,0x01,
-0x02,0x27,0x04,0x7b,0x00,0x01,0x01,0x1f,0x06,0x2f,0x00,0x01,0x01,0x1f,0x06,0x2f,
-0x00,0x01,0x03,0xfa,0x04,0x7b,0x00,0x01,0x03,0xfa,0x04,0x7b,0x00,0x01,0x01,0x16,
-0x05,0xf0,0x00,0x01,0x02,0xa4,0x04,0x7b,0x00,0x01,0x02,0x9e,0x05,0xf0,0x00,0x01,
-0x02,0xa6,0x04,0x7b,0x00,0x01,0x02,0xa3,0x04,0x7b,0x00,0x01,0x01,0x16,0x05,0xf0,
-0x00,0x01,0x02,0x73,0x05,0xe2,0x00,0x01,0x02,0x4b,0x04,0x7b,0x00,0x01,0x02,0xa3,
-0x04,0x7b,0x00,0x01,0x02,0x89,0x04,0x7b,0x00,0x01,0x03,0x05,0x04,0x7b,0x00,0x01,
-0x02,0x45,0x04,0x7b,0x00,0x01,0x04,0x14,0x04,0x7b,0x00,0x01,0x02,0x40,0x04,0x7b,
-0x00,0x01,0x04,0x14,0x04,0x7b,0x00,0x01,0x02,0x62,0x04,0x7b,0x00,0x01,0x01,0xc6,
-0x05,0xf0,0x00,0x01,0x01,0x16,0x05,0xf0,0x00,0x01,0x01,0x7f,0x04,0x7b,0x00,0x01,
-0x01,0x1f,0x04,0x7b,0x00,0x02,0x00,0x3a,0x00,0x24,0x00,0x3d,0x00,0x00,0x00,0x44,
-0x00,0x5d,0x00,0x1a,0x00,0x9a,0x00,0x9a,0x00,0x34,0x00,0xa8,0x00,0xa9,0x00,0x35,
-0x00,0xb2,0x00,0xb2,0x00,0x37,0x00,0xba,0x00,0xba,0x00,0x38,0x00,0xc0,0x00,0xc0,
-0x00,0x39,0x00,0xe8,0x00,0xe9,0x00,0x3a,0x00,0xf3,0x00,0xf3,0x00,0x3c,0x01,0x0c,
-0x01,0x0d,0x00,0x3d,0x01,0x15,0x01,0x15,0x00,0x3f,0x01,0x35,0x01,0x35,0x00,0x40,
-0x01,0x42,0x01,0x42,0x00,0x41,0x01,0x48,0x01,0x49,0x00,0x42,0x01,0x50,0x01,0x50,
-0x00,0x44,0x01,0x52,0x01,0x55,0x00,0x45,0x01,0x58,0x01,0x5d,0x00,0x49,0x01,0x5f,
-0x01,0x5f,0x00,0x4f,0x01,0x66,0x01,0x66,0x00,0x50,0x01,0x69,0x01,0x6a,0x00,0x51,
-0x01,0x6c,0x01,0x70,0x00,0x53,0x01,0x74,0x01,0x78,0x00,0x58,0x01,0x7b,0x01,0x7b,
-0x00,0x5d,0x01,0xac,0x01,0xac,0x00,0x5e,0x01,0xf6,0x01,0xf9,0x00,0x5f,0x02,0x04,
-0x02,0x5f,0x00,0x63,0x03,0x2a,0x03,0x42,0x00,0xbf,0x03,0x48,0x03,0x49,0x00,0xd8,
-0x03,0x4d,0x03,0x4d,0x00,0xda,0x03,0x4f,0x03,0x4f,0x00,0xdb,0x03,0x51,0x03,0x51,
-0x00,0xdc,0x03,0x53,0x03,0x53,0x00,0xdd,0x03,0x5b,0x03,0x5b,0x00,0xde,0x03,0x68,
-0x03,0x6b,0x00,0xdf,0x03,0x6d,0x03,0x6e,0x00,0xe3,0x03,0x70,0x03,0x70,0x00,0xe5,
-0x03,0x74,0x03,0x74,0x00,0xe6,0x03,0xa8,0x03,0xb0,0x00,0xe7,0x03,0xb2,0x03,0xc4,
-0x00,0xf0,0x03,0xc6,0x03,0xc7,0x01,0x03,0x03,0xcd,0x03,0xce,0x01,0x05,0x03,0xd0,
-0x03,0xd3,0x01,0x07,0x03,0xd7,0x03,0xd7,0x01,0x0b,0x04,0x05,0x04,0x06,0x01,0x0c,
-0x04,0x14,0x04,0x14,0x01,0x0e,0x04,0x16,0x04,0x16,0x01,0x0f,0x04,0x23,0x04,0x23,
-0x01,0x10,0x04,0x30,0x04,0x30,0x01,0x11,0x04,0x3b,0x04,0x3b,0x01,0x12,0x04,0x41,
-0x04,0x41,0x01,0x13,0x04,0x45,0x04,0x45,0x01,0x14,0x04,0x6d,0x04,0x6d,0x01,0x15,
-0x05,0x3e,0x05,0x3f,0x01,0x16,0x05,0x41,0x05,0x41,0x01,0x18,0x05,0x46,0x05,0x46,
-0x01,0x19,0x07,0xee,0x07,0xee,0x01,0x1a,0x09,0x0f,0x09,0x0f,0x01,0x1b,0x0c,0x1a,
-0x0c,0x1b,0x01,0x1c,0x00,0x02,0x00,0x08,0x02,0xa3,0x02,0xb7,0x00,0x00,0x02,0xe0,
-0x02,0xe5,0x00,0x15,0x02,0xe7,0x02,0xe7,0x00,0x1b,0x02,0xe9,0x02,0xe9,0x00,0x1c,
-0x02,0xed,0x02,0xef,0x00,0x1d,0x02,0xf2,0x02,0xf3,0x00,0x20,0x02,0xf5,0x02,0xf5,
-0x00,0x22,0x0b,0xe9,0x0b,0xf3,0x00,0x23,0x00,0x2e,0x00,0x00,0x00,0xba,0x00,0x00,
-0x00,0xc0,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0xd2,0x00,0x00,
-0x00,0xd8,0x00,0x00,0x00,0xde,0x00,0x00,0x00,0xe4,0x00,0x00,0x00,0xea,0x00,0x00,
-0x00,0xf0,0x00,0x00,0x00,0xf6,0x00,0x00,0x00,0xfc,0x00,0x00,0x01,0x02,0x00,0x00,
-0x01,0x08,0x00,0x00,0x01,0x0e,0x00,0x00,0x01,0x14,0x00,0x00,0x01,0x1a,0x00,0x00,
-0x01,0x20,0x00,0x00,0x01,0x26,0x00,0x00,0x01,0x2c,0x00,0x00,0x01,0x32,0x00,0x00,
-0x01,0x38,0x00,0x00,0x01,0x3e,0x00,0x00,0x01,0x44,0x00,0x00,0x01,0x4a,0x00,0x00,
-0x01,0x50,0x00,0x00,0x01,0x56,0x00,0x00,0x01,0x5c,0x00,0x00,0x01,0x62,0x00,0x00,
-0x01,0x68,0x00,0x00,0x01,0x6e,0x00,0x00,0x01,0x74,0x00,0x00,0x01,0x7a,0x00,0x00,
-0x01,0x80,0x00,0x00,0x01,0x86,0x00,0x00,0x01,0x8c,0x00,0x00,0x01,0x92,0x00,0x00,
-0x01,0x98,0x00,0x00,0x01,0x9e,0x00,0x00,0x01,0xa4,0x00,0x00,0x01,0xaa,0x00,0x00,
-0x01,0xb0,0x00,0x00,0x01,0xb6,0x00,0x00,0x01,0xbc,0x00,0x00,0x01,0xc2,0x00,0x00,
-0x01,0xc8,0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,
-0xfe,0x00,0x04,0x7b,0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,0xfe,0x00,0x04,0x7b,
-0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,0xfe,0x00,
-0x04,0x7b,0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,
-0xfe,0x00,0x04,0x7b,0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,0xfe,0x00,0x04,0x7b,
-0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,0xfe,0x00,
-0x04,0x7b,0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,
-0xfe,0x8a,0x03,0x6f,0x00,0x01,0xfe,0x00,0x04,0x72,0x00,0x01,0xfe,0x00,0x04,0x72,
-0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,0xfe,0x8a,0x04,0x72,0x00,0x01,0xfe,0x00,
-0x04,0x7b,0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,
-0xfe,0x00,0x04,0x7b,0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,0xfe,0x00,0x04,0x7b,
-0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,0xfe,0x00,
-0x04,0x7b,0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,
-0xfe,0x00,0x04,0x7b,0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,0xfe,0x00,0x04,0x7b,
-0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,0xfe,0x00,
-0x04,0x7b,0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,
-0xfe,0x00,0x04,0x7b,0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,0xfe,0x00,0x04,0x7b,
-0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,0x05,0xaa,0x05,0x2e,0x00,0x01,0x05,0xde,
-0x00,0x0c,0x00,0xa4,0x01,0x4a,0x01,0x50,0x01,0x56,0x01,0x5c,0x01,0x62,0x01,0x68,
-0x01,0x6e,0x01,0x74,0x01,0x7a,0x01,0x80,0x01,0x86,0x01,0x8c,0x01,0x92,0x01,0x98,
-0x01,0x9e,0x01,0xa4,0x01,0xaa,0x01,0xb0,0x01,0xb6,0x01,0xbc,0x01,0xc2,0x01,0xc8,
-0x01,0xce,0x01,0xd4,0x01,0xda,0x01,0xe0,0x01,0xe6,0x01,0xec,0x01,0xf2,0x01,0xf8,
-0x01,0xfe,0x02,0x04,0x02,0x0a,0x02,0x10,0x02,0x16,0x02,0x1c,0x02,0x22,0x02,0x28,
-0x02,0x2e,0x02,0x34,0x02,0x3a,0x02,0x40,0x02,0x46,0x02,0x4c,0x02,0x52,0x02,0x58,
-0x02,0x5e,0x02,0x64,0x02,0x6a,0x02,0x70,0x02,0x76,0x02,0x7c,0x02,0x82,0x02,0x88,
-0x02,0x8e,0x02,0x94,0x02,0x9a,0x02,0xa0,0x02,0xa6,0x02,0xac,0x02,0xb2,0x02,0xb8,
-0x02,0xbe,0x02,0xc4,0x02,0xca,0x02,0xd0,0x02,0xd6,0x02,0xdc,0x02,0xe2,0x02,0xe8,
-0x02,0xee,0x02,0xf4,0x02,0xfa,0x03,0x00,0x03,0x06,0x03,0x0c,0x03,0x12,0x03,0x18,
-0x03,0x1e,0x03,0x24,0x03,0x2a,0x03,0x30,0x03,0x36,0x03,0x3c,0x03,0x42,0x03,0x48,
-0x03,0x4e,0x03,0x54,0x03,0x5a,0x03,0x60,0x03,0x66,0x03,0x6c,0x03,0x72,0x03,0x78,
-0x03,0x7e,0x03,0x84,0x03,0x8a,0x03,0x90,0x03,0x96,0x03,0x9c,0x03,0xa2,0x03,0xa8,
-0x03,0xae,0x03,0xb4,0x03,0xba,0x03,0xc0,0x03,0xc6,0x03,0xcc,0x03,0xd2,0x03,0xd8,
-0x03,0xde,0x03,0xe4,0x03,0xea,0x03,0xf0,0x03,0xf6,0x03,0xfc,0x04,0x02,0x04,0x08,
-0x04,0x0e,0x04,0x14,0x04,0x1a,0x04,0x20,0x04,0x26,0x04,0x2c,0x04,0x32,0x04,0x38,
-0x04,0x3e,0x04,0x44,0x04,0x4a,0x04,0x50,0x04,0x56,0x04,0x5c,0x04,0x62,0x04,0x68,
-0x04,0x6e,0x04,0x74,0x04,0x7a,0x04,0x80,0x04,0x86,0x04,0x8c,0x04,0x92,0x04,0x98,
-0x04,0x9e,0x04,0xa4,0x04,0xaa,0x04,0xb0,0x04,0xb6,0x04,0xbc,0x04,0xc2,0x04,0xc8,
-0x04,0xce,0x04,0xd4,0x04,0xda,0x04,0xe0,0x04,0xe6,0x04,0xec,0x04,0xf2,0x04,0xf8,
-0x04,0xfe,0x05,0x04,0x05,0x0a,0x05,0x10,0x05,0x16,0x05,0x1c,0x00,0x01,0x02,0xbc,
-0x00,0x00,0x00,0x01,0x02,0xbc,0x00,0x00,0x00,0x01,0x03,0x4c,0x00,0x00,0x00,0x01,
-0x02,0xec,0x00,0x00,0x00,0x01,0x02,0x9e,0x00,0x00,0x00,0x01,0x02,0x9e,0x00,0x00,
-0x00,0x01,0x03,0x5c,0x00,0x00,0x00,0x01,0x03,0x02,0x00,0x00,0x00,0x01,0x01,0x2f,
-0x00,0x00,0x00,0x01,0x01,0x2e,0xfe,0x52,0x00,0x01,0x02,0x9e,0x00,0x00,0x00,0x01,
-0x02,0x99,0x00,0x00,0x00,0x01,0x03,0x73,0x00,0x00,0x00,0x01,0x02,0xf5,0x00,0x00,
-0x00,0x01,0x03,0x27,0x00,0x00,0x00,0x01,0x02,0x9e,0x00,0x00,0x00,0x01,0x03,0x27,
-0x00,0x00,0x00,0x01,0x02,0x7d,0x00,0x00,0x00,0x01,0x02,0x93,0x00,0x00,0x00,0x01,
-0x02,0x73,0x00,0x00,0x00,0x01,0x02,0xee,0x00,0x00,0x00,0x01,0x02,0xbc,0x00,0x00,
-0x00,0x01,0x03,0xf5,0x00,0x00,0x00,0x01,0x02,0xcd,0x00,0x00,0x00,0x01,0x02,0x72,
-0x00,0x00,0x00,0x01,0x02,0xbe,0x00,0x00,0x00,0x01,0x02,0x54,0x00,0x00,0x00,0x01,
-0x02,0xb7,0x00,0x00,0x00,0x01,0x02,0xa6,0x00,0x00,0x00,0x01,0x02,0x66,0x00,0x00,
-0x00,0x01,0x02,0x94,0x00,0x00,0x00,0x01,0x01,0x3b,0x00,0x00,0x00,0x01,0x02,0xa6,
-0xfe,0x52,0x00,0x01,0x02,0xa6,0x00,0x00,0x00,0x01,0x01,0x1f,0x00,0x00,0x00,0x01,
-0x01,0x1f,0xfe,0x52,0x00,0x01,0x02,0xa6,0x00,0x00,0x00,0x01,0x01,0x16,0x00,0x00,
-0x00,0x01,0x03,0xe9,0x00,0x00,0x00,0x01,0x02,0xa6,0x00,0x00,0x00,0x01,0x02,0x7d,
-0x00,0x00,0x00,0x01,0x02,0xa6,0xfe,0x52,0x00,0x01,0x02,0x88,0xfe,0x52,0x00,0x01,
-0x02,0x17,0x00,0x00,0x00,0x01,0x02,0x27,0x00,0x00,0x00,0x01,0x01,0xf4,0x00,0x00,
-0x00,0x01,0x02,0xa6,0x00,0x00,0x00,0x01,0x02,0x5e,0x00,0x00,0x00,0x01,0x03,0x47,
-0x00,0x00,0x00,0x01,0x02,0x62,0x00,0x00,0x00,0x01,0x02,0x60,0xfe,0x52,0x00,0x01,
-0x02,0x17,0x00,0x00,0x00,0x01,0x03,0xe3,0x00,0x00,0x00,0x01,0x02,0x7d,0x00,0x00,
-0x00,0x01,0x02,0x7d,0x00,0x00,0x00,0x01,0x02,0xd0,0x00,0x00,0x00,0x01,0x02,0x89,
-0xfe,0x52,0x00,0x01,0x01,0x37,0xfe,0x52,0x00,0x01,0x01,0x16,0xfe,0x7a,0x00,0x01,
-0x02,0x60,0xfe,0x52,0x00,0x01,0x02,0xdb,0xfe,0x52,0x00,0x01,0x01,0x0f,0xff,0xfa,
-0x00,0x01,0x02,0xa6,0x00,0x00,0x00,0x01,0x01,0xf4,0x00,0x00,0x00,0x01,0x02,0x54,
-0x00,0x00,0x00,0x01,0x02,0x54,0x00,0x00,0x00,0x01,0x02,0x8d,0x00,0x00,0x00,0x01,
-0x02,0x8d,0x00,0x00,0x00,0x01,0x01,0xb1,0x00,0x00,0x00,0x01,0x02,0xa6,0x00,0x00,
-0x00,0x01,0x02,0x54,0xfe,0x52,0x00,0x01,0x02,0x54,0x00,0x00,0x00,0x01,0x02,0x63,
-0x00,0x00,0x00,0x01,0x02,0x52,0x00,0x00,0x00,0x01,0x02,0x5e,0x00,0x00,0x00,0x01,
-0x02,0x40,0x00,0x00,0x00,0x01,0x02,0x40,0x00,0x00,0x00,0x01,0x02,0x22,0x00,0x00,
-0x00,0x01,0x02,0xfc,0x00,0x00,0x00,0x01,0x01,0x1f,0xfe,0x52,0x00,0x01,0x02,0x6a,
-0xfe,0x52,0x00,0x01,0x02,0x6a,0xfe,0x52,0x00,0x01,0x02,0xa6,0x00,0x00,0x00,0x01,
-0x02,0xd6,0xfe,0x52,0x00,0x01,0x02,0x62,0x00,0x00,0x00,0x01,0x02,0x7d,0xfe,0x52,
-0x00,0x01,0x02,0xa6,0x00,0x00,0x00,0x01,0x02,0xa6,0xfe,0x52,0x00,0x01,0x01,0x7f,
-0x00,0x00,0x00,0x01,0x01,0x1f,0x00,0x00,0x00,0x01,0x01,0x80,0x00,0x00,0x00,0x01,
-0x01,0xfe,0x00,0x00,0x00,0x01,0x01,0xfe,0x00,0x00,0x00,0x01,0x01,0x16,0xfe,0x52,
-0x00,0x01,0x02,0xee,0xfe,0x52,0x00,0x01,0x03,0xe9,0x00,0x00,0x00,0x01,0x03,0xe9,
-0xfe,0x52,0x00,0x01,0x03,0xe9,0xfe,0x52,0x00,0x01,0x02,0x89,0xfe,0x52,0x00,0x01,
-0x02,0x89,0xfe,0x52,0x00,0x01,0x02,0x89,0x00,0x00,0x00,0x01,0x02,0x7d,0x00,0x00,
-0x00,0x01,0x04,0x8d,0x00,0x00,0x00,0x01,0x02,0xe9,0x00,0x00,0x00,0x01,0x02,0x70,
-0xfe,0x52,0x00,0x01,0x02,0xa6,0x00,0x00,0x00,0x01,0x02,0xa6,0x00,0x00,0x00,0x01,
-0x02,0xa6,0xfe,0x52,0x00,0x01,0x00,0xd5,0xfe,0x52,0x00,0x01,0x02,0x17,0xfe,0x52,
-0x00,0x01,0x01,0x83,0x00,0x00,0x00,0x01,0x02,0x74,0x00,0x00,0x00,0x01,0x01,0xb3,
-0x00,0x00,0x00,0x01,0x01,0xc9,0x00,0x00,0x00,0x01,0x02,0x27,0xfe,0x52,0x00,0x01,
-0x01,0x16,0xfe,0x52,0x00,0x01,0x01,0x74,0xfe,0x52,0x00,0x01,0x01,0xf1,0xfe,0x52,
-0x00,0x01,0x01,0x16,0xfe,0x52,0x00,0x01,0x02,0x0e,0xfe,0x52,0x00,0x01,0x01,0xf4,
-0xfe,0x52,0x00,0x01,0x02,0x7d,0x00,0x00,0x00,0x01,0x02,0x7d,0x00,0x00,0x00,0x01,
-0x02,0x7d,0x00,0x00,0x00,0x01,0x02,0x5e,0x00,0x00,0x00,0x01,0x03,0x47,0x00,0x00,
-0x00,0x01,0x02,0x5e,0x00,0x00,0x00,0x01,0x02,0x64,0x00,0x00,0x00,0x01,0x02,0x17,
-0xfe,0x52,0x00,0x01,0x02,0x17,0x00,0x00,0x00,0x01,0x02,0x17,0xfe,0x52,0x00,0x01,
-0x02,0x17,0xfe,0x52,0x00,0x01,0x01,0xb0,0x00,0x00,0x00,0x01,0x02,0x3a,0x00,0x00,
-0x00,0x01,0x01,0xb0,0x00,0x00,0x00,0x01,0x02,0x3a,0xfe,0x52,0x00,0x01,0x02,0x6b,
-0x00,0x00,0x00,0x01,0x02,0x61,0x00,0x00,0x00,0x01,0x02,0x89,0x00,0x00,0x00,0x01,
-0x02,0xa6,0x00,0x00,0x00,0x01,0x02,0xa3,0xff,0xf6,0x00,0x01,0x01,0x1f,0xfe,0x52,
-0x00,0x01,0x02,0xab,0xfe,0x52,0x00,0x01,0x02,0x58,0x00,0x00,0x00,0x01,0x02,0x88,
-0xfe,0x52,0x00,0x01,0x01,0xb0,0x00,0x00,0x00,0x01,0x02,0x3a,0x00,0x00,0x00,0x01,
-0x03,0xfe,0x00,0x00,0x00,0x01,0x03,0xfe,0xfe,0x52,0x00,0x01,0x03,0xfe,0x00,0x00,
-0x00,0x01,0x04,0xa3,0x00,0x00,0x00,0x01,0x03,0x47,0xfe,0x52,0x00,0x01,0x04,0x8e,
-0x00,0x00,0x00,0x01,0x03,0x20,0xfe,0x52,0x00,0x01,0x01,0x16,0x00,0x00,0x00,0x01,
-0x01,0x16,0x00,0x00,0x00,0x01,0x02,0x7e,0xfe,0x52,0x00,0x01,0x02,0x7d,0x00,0x00,
-0x00,0x01,0x02,0x9e,0x00,0x00,0x00,0x01,0x02,0xa6,0x00,0x00,0x00,0x01,0x02,0x0e,
-0x00,0x00,0x00,0x01,0x02,0xb7,0x00,0x00,0x00,0x01,0x01,0x7f,0x00,0x00,0x00,0x01,
-0x01,0x1f,0xfe,0x52,0x00,0x02,0x00,0x14,0x00,0x24,0x00,0x3d,0x00,0x00,0x00,0x44,
-0x00,0x5d,0x00,0x1a,0x00,0xa8,0x00,0xa8,0x00,0x34,0x00,0xb2,0x00,0xb2,0x00,0x35,
-0x00,0xba,0x00,0xba,0x00,0x36,0x00,0xe9,0x00,0xe9,0x00,0x37,0x01,0x0d,0x01,0x0d,
-0x00,0x38,0x01,0x54,0x01,0x54,0x00,0x39,0x01,0x6c,0x01,0x6c,0x00,0x3a,0x01,0x76,
-0x01,0x76,0x00,0x3b,0x01,0x7b,0x01,0x7b,0x00,0x3c,0x01,0xf6,0x01,0xf8,0x00,0x3d,
-0x02,0x04,0x02,0x5f,0x00,0x40,0x03,0x2b,0x03,0x2b,0x00,0x9c,0x03,0x31,0x03,0x31,
-0x00,0x9d,0x04,0x05,0x04,0x05,0x00,0x9e,0x04,0x16,0x04,0x16,0x00,0x9f,0x07,0xee,
-0x07,0xee,0x00,0xa0,0x09,0x0f,0x09,0x0f,0x00,0xa1,0x0c,0x1a,0x0c,0x1b,0x00,0xa2,
-0x00,0x02,0x00,0x08,0x02,0xb9,0x02,0xbc,0x00,0x00,0x02,0xbf,0x02,0xc3,0x00,0x04,
-0x02,0xc6,0x02,0xc9,0x00,0x09,0x02,0xcc,0x02,0xd6,0x00,0x0d,0x02,0xdc,0x02,0xdf,
-0x00,0x18,0x02,0xea,0x02,0xec,0x00,0x1c,0x02,0xf0,0x02,0xf1,0x00,0x1f,0x02,0xf4,
-0x02,0xf4,0x00,0x21,0x00,0x22,0x00,0x00,0x00,0x8a,0x00,0x00,0x00,0x90,0x00,0x00,
-0x00,0x96,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0xa8,0x00,0x00,
-0x00,0xae,0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0xba,0x00,0x00,0x00,0xc0,0x00,0x00,
-0x00,0xc6,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0xd8,0x00,0x00,
-0x00,0xde,0x00,0x00,0x00,0xe4,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0xf0,0x00,0x00,
-0x00,0xf6,0x00,0x00,0x00,0xfc,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x08,0x00,0x00,
-0x01,0x0e,0x00,0x00,0x01,0x14,0x00,0x00,0x01,0x1a,0x00,0x00,0x01,0x20,0x00,0x00,
-0x01,0x26,0x00,0x00,0x01,0x2c,0x00,0x00,0x01,0x32,0x00,0x00,0x01,0x38,0x00,0x00,
-0x01,0x3e,0x00,0x00,0x01,0x44,0x00,0x00,0x01,0x4a,0x00,0x00,0x01,0x50,0x00,0x01,
-0xfe,0x00,0xff,0xff,0x00,0x01,0xfe,0x00,0xff,0xff,0x00,0x01,0xfe,0x00,0x00,0x00,
-0x00,0x01,0xfe,0x00,0x00,0x00,0x00,0x01,0xfe,0x00,0xff,0xfe,0x00,0x01,0xfe,0x00,
-0xff,0xff,0x00,0x01,0xfe,0x00,0xff,0xff,0x00,0x01,0xfe,0x00,0xff,0xff,0x00,0x01,
-0xfe,0x00,0xff,0xff,0x00,0x01,0xfe,0x00,0xff,0xff,0x00,0x01,0xfe,0x00,0xff,0xff,
-0x00,0x01,0xfe,0x00,0xff,0xff,0x00,0x01,0xfe,0x00,0xff,0xff,0x00,0x01,0xfe,0x00,
-0xff,0xff,0x00,0x01,0xfe,0x00,0xff,0xff,0x00,0x01,0xfe,0x00,0xff,0xff,0x00,0x01,
-0xfe,0x00,0xff,0xff,0x00,0x01,0xfe,0x00,0xff,0xff,0x00,0x01,0xfe,0x00,0xff,0xff,
-0x00,0x01,0xfe,0x00,0xff,0xff,0x00,0x01,0xfe,0x00,0xff,0xff,0x00,0x01,0xfe,0x00,
-0xff,0xff,0x00,0x01,0xfe,0x00,0xff,0xff,0x00,0x01,0xfe,0x00,0xff,0xff,0x00,0x01,
-0xfe,0x00,0xff,0xfb,0x00,0x01,0xfe,0x00,0xff,0xff,0x00,0x01,0xfe,0x00,0xff,0xff,
-0x00,0x01,0xfe,0x00,0xff,0xff,0x00,0x01,0xfe,0x00,0xff,0xff,0x00,0x01,0xfe,0x00,
-0xff,0xff,0x00,0x01,0xfe,0x00,0xff,0xff,0x00,0x01,0xfe,0x00,0xff,0xff,0x00,0x01,
-0xfe,0x00,0xff,0xff,0x00,0x01,0xfe,0x00,0xff,0xff,0x00,0x01,0x00,0x20,0x00,0x1a,
-0x00,0x01,0x00,0x54,0x00,0x0c,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x04,0x00,0x01,
-0x02,0xa6,0xfe,0x52,0x00,0x01,0x00,0x01,0x00,0xa9,0x00,0x02,0x00,0x08,0x02,0xb9,
-0x02,0xbc,0x00,0x00,0x02,0xbf,0x02,0xc3,0x00,0x04,0x02,0xc6,0x02,0xc9,0x00,0x09,
-0x02,0xcc,0x02,0xd6,0x00,0x0d,0x02,0xdc,0x02,0xdf,0x00,0x18,0x02,0xea,0x02,0xec,
-0x00,0x1c,0x02,0xf0,0x02,0xf1,0x00,0x1f,0x02,0xf4,0x02,0xf4,0x00,0x21,0x00,0x22,
-0x00,0x00,0x00,0x8a,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x9c,
-0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0xb4,
-0x00,0x00,0x00,0xba,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0xcc,
-0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0xd8,0x00,0x00,0x00,0xde,0x00,0x00,0x00,0xe4,
-0x00,0x00,0x00,0xea,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0xf6,0x00,0x00,0x00,0xfc,
-0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x08,0x00,0x00,0x01,0x0e,0x00,0x00,0x01,0x14,
-0x00,0x00,0x01,0x1a,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x26,0x00,0x00,0x01,0x2c,
-0x00,0x00,0x01,0x32,0x00,0x00,0x01,0x38,0x00,0x00,0x01,0x3e,0x00,0x00,0x01,0x44,
-0x00,0x00,0x01,0x4a,0x00,0x00,0x01,0x50,0x00,0x01,0xfe,0x00,0xff,0xff,0x00,0x01,
-0xfe,0x00,0xff,0xff,0x00,0x01,0xfe,0x00,0x00,0x00,0x00,0x01,0xfe,0x00,0x00,0x00,
-0x00,0x01,0xfe,0x00,0xff,0xfe,0x00,0x01,0xfe,0x00,0xff,0xff,0x00,0x01,0xfe,0x00,
-0xff,0xff,0x00,0x01,0xfe,0x00,0xff,0xff,0x00,0x01,0xfe,0x00,0xff,0xff,0x00,0x01,
-0xfe,0x00,0xff,0xff,0x00,0x01,0xfe,0x00,0xff,0xff,0x00,0x01,0xfe,0x00,0xff,0xff,
-0x00,0x01,0xfe,0x00,0xff,0xff,0x00,0x01,0xfe,0x00,0xff,0xff,0x00,0x01,0xfe,0x00,
-0xff,0xff,0x00,0x01,0xfe,0x00,0xff,0xff,0x00,0x01,0xfe,0x00,0xff,0xff,0x00,0x01,
-0xfe,0x00,0xff,0xff,0x00,0x01,0xfe,0x00,0xff,0xff,0x00,0x01,0xfe,0x00,0xff,0xff,
-0x00,0x01,0xfe,0x00,0xff,0xff,0x00,0x01,0xfe,0x00,0xff,0xff,0x00,0x01,0xfe,0x00,
-0xff,0xff,0x00,0x01,0xfe,0x00,0xff,0xff,0x00,0x01,0xfe,0x00,0xff,0xfb,0x00,0x01,
-0xfe,0x00,0xff,0xff,0x00,0x01,0xfe,0x00,0xff,0xff,0x00,0x01,0xfe,0x00,0xff,0xff,
-0x00,0x01,0xfe,0x00,0xff,0xff,0x00,0x01,0xfe,0x00,0xff,0xff,0x00,0x01,0xfe,0x00,
-0xff,0xff,0x00,0x01,0xfe,0x00,0xff,0xff,0x00,0x01,0xfe,0x00,0xff,0xff,0x00,0x01,
-0xfe,0x00,0xff,0xff,0x00,0x01,0x09,0x56,0x09,0x2e,0x00,0x01,0x09,0x60,0x00,0x0c,
-0x01,0x24,0x02,0x4a,0x02,0x50,0x02,0x56,0x02,0x5c,0x02,0x62,0x02,0x68,0x02,0x6e,
-0x02,0x74,0x02,0x7a,0x02,0x80,0x02,0x86,0x02,0x8c,0x02,0x92,0x02,0x98,0x02,0x9e,
-0x02,0xa4,0x02,0xaa,0x02,0xb0,0x02,0xb6,0x02,0xbc,0x02,0xc2,0x02,0xc8,0x02,0xce,
-0x02,0xd4,0x02,0xda,0x02,0xe0,0x02,0xe6,0x02,0xec,0x02,0xf2,0x02,0xf8,0x02,0xfe,
-0x03,0x04,0x03,0x0a,0x03,0x10,0x03,0x16,0x03,0x1c,0x03,0x22,0x03,0x28,0x03,0x2e,
-0x03,0x34,0x03,0x3a,0x03,0x40,0x03,0x46,0x03,0x4c,0x03,0x52,0x03,0x58,0x03,0x5e,
-0x03,0x64,0x03,0x6a,0x03,0x70,0x03,0x76,0x03,0x7c,0x03,0x82,0x03,0x88,0x03,0x8e,
-0x03,0x94,0x03,0x9a,0x03,0xa0,0x03,0xa6,0x03,0xac,0x03,0xb2,0x03,0xb8,0x03,0xbe,
-0x03,0xc4,0x03,0xca,0x03,0xd0,0x03,0xd6,0x03,0xdc,0x03,0xe2,0x03,0xe8,0x03,0xee,
-0x03,0xf4,0x03,0xfa,0x04,0x00,0x04,0x06,0x04,0x0c,0x04,0x12,0x04,0x18,0x04,0x1e,
-0x04,0x24,0x04,0x2a,0x04,0x30,0x04,0x36,0x04,0x3c,0x04,0x42,0x04,0x48,0x04,0x4e,
-0x04,0x54,0x04,0x5a,0x04,0x60,0x04,0x66,0x04,0x6c,0x04,0x72,0x04,0x78,0x04,0x7e,
-0x04,0x84,0x04,0x8a,0x04,0x90,0x04,0x96,0x04,0x9c,0x04,0xa2,0x04,0xa8,0x04,0xae,
-0x04,0xb4,0x04,0xba,0x04,0xc0,0x04,0xc6,0x04,0xcc,0x04,0xd2,0x04,0xd8,0x04,0xde,
-0x04,0xe4,0x04,0xea,0x04,0xf0,0x04,0xf6,0x04,0xfc,0x05,0x02,0x05,0x08,0x05,0x0e,
-0x05,0x14,0x05,0x1a,0x05,0x20,0x05,0x26,0x05,0x2c,0x05,0x32,0x05,0x38,0x05,0x3e,
-0x05,0x44,0x05,0x4a,0x05,0x50,0x05,0x56,0x05,0x5c,0x05,0x62,0x05,0x68,0x05,0x6e,
-0x05,0x74,0x05,0x7a,0x05,0x80,0x05,0x86,0x05,0x8c,0x05,0x92,0x05,0x98,0x05,0x9e,
-0x05,0xa4,0x05,0xaa,0x05,0xb0,0x05,0xb6,0x05,0xbc,0x05,0xc2,0x05,0xc8,0x05,0xce,
-0x05,0xd4,0x05,0xda,0x05,0xe0,0x05,0xe6,0x05,0xec,0x05,0xf2,0x05,0xf8,0x05,0xfe,
-0x06,0x04,0x06,0x0a,0x06,0x10,0x06,0x16,0x06,0x1c,0x06,0x22,0x06,0x28,0x06,0x2e,
-0x06,0x34,0x06,0x3a,0x06,0x40,0x06,0x46,0x06,0x4c,0x06,0x52,0x06,0x58,0x06,0x5e,
-0x06,0x64,0x06,0x6a,0x06,0x70,0x06,0x76,0x06,0x7c,0x06,0x82,0x06,0x88,0x06,0x8e,
-0x06,0x94,0x06,0x9a,0x06,0xa0,0x06,0xa6,0x06,0xac,0x06,0xb2,0x06,0xb8,0x06,0xbe,
-0x06,0xc4,0x06,0xca,0x06,0xd0,0x06,0xd6,0x06,0xdc,0x06,0xe2,0x06,0xe8,0x06,0xee,
-0x06,0xf4,0x06,0xfa,0x07,0x00,0x07,0x06,0x07,0x0c,0x07,0x12,0x07,0x18,0x07,0x1e,
-0x07,0x24,0x07,0x2a,0x07,0x30,0x07,0x36,0x07,0x3c,0x07,0x42,0x07,0x48,0x07,0x4e,
-0x07,0x54,0x07,0x5a,0x07,0x60,0x07,0x66,0x07,0x6c,0x07,0x72,0x07,0x78,0x07,0x7e,
-0x07,0x84,0x07,0x8a,0x07,0x90,0x07,0x96,0x07,0x9c,0x07,0xa2,0x07,0xa8,0x07,0xae,
-0x07,0xb4,0x07,0xba,0x07,0xc0,0x07,0xc6,0x07,0xcc,0x07,0xd2,0x07,0xd8,0x07,0xde,
-0x07,0xe4,0x07,0xea,0x07,0xf0,0x07,0xf6,0x07,0xfc,0x08,0x02,0x08,0x08,0x08,0x0e,
-0x08,0x14,0x08,0x1a,0x08,0x20,0x08,0x26,0x08,0x2c,0x08,0x32,0x08,0x38,0x08,0x3e,
-0x08,0x44,0x08,0x4a,0x08,0x50,0x08,0x56,0x08,0x5c,0x08,0x62,0x08,0x68,0x08,0x6e,
-0x08,0x74,0x08,0x7a,0x08,0x80,0x08,0x86,0x08,0x8c,0x08,0x92,0x08,0x98,0x08,0x9e,
-0x08,0xa4,0x08,0xaa,0x08,0xb0,0x08,0xb6,0x08,0xbc,0x08,0xc2,0x08,0xc8,0x08,0xce,
-0x08,0xd4,0x08,0xda,0x08,0xe0,0x08,0xe6,0x08,0xec,0x08,0xf2,0x08,0xf8,0x08,0xfe,
-0x09,0x04,0x09,0x0a,0x09,0x10,0x09,0x16,0x09,0x1c,0x00,0x01,0x01,0x1d,0xff,0x9c,
-0x00,0x01,0x01,0x1d,0xff,0x9c,0x00,0x01,0x01,0xf4,0xfe,0x3e,0x00,0x01,0x01,0x1d,
-0xfd,0xda,0x00,0x01,0x02,0xbc,0xfe,0x70,0x00,0x01,0x01,0x1d,0xff,0x9c,0x00,0x01,
-0x03,0x84,0xfe,0x70,0x00,0x01,0x01,0xf4,0xff,0x6a,0x00,0x01,0x03,0x84,0xff,0x6a,
-0x00,0x01,0x03,0x84,0xff,0x6a,0x00,0x01,0x03,0x2c,0xfd,0x76,0x00,0x01,0x03,0x2c,
-0xfd,0xa8,0x00,0x01,0x03,0x2c,0xfd,0x76,0x00,0x01,0x01,0xc2,0xff,0x6a,0x00,0x01,
-0x01,0xc2,0xff,0x6a,0x00,0x01,0x01,0xf4,0xfe,0x0c,0x00,0x01,0x01,0xf4,0xfe,0x0c,
-0x00,0x01,0x02,0x58,0xfd,0xa8,0x00,0x01,0x02,0x58,0xfd,0xa8,0x00,0x01,0x02,0x58,
-0xfd,0xa8,0x00,0x01,0x02,0x58,0xfd,0x44,0x00,0x01,0x02,0x5b,0xff,0x6a,0x00,0x01,
-0x02,0x5b,0xff,0x6a,0x00,0x01,0x02,0xd7,0xfd,0xa8,0x00,0x01,0x02,0xd7,0xfd,0xa8,
-0x00,0x01,0x01,0x2c,0xff,0x9c,0x00,0x01,0x03,0x20,0xff,0x38,0x00,0x01,0x02,0xbc,
-0xfd,0xda,0x00,0x01,0x03,0x20,0xff,0x38,0x00,0x01,0x02,0xbc,0xfe,0x3e,0x00,0x01,
-0x00,0xf0,0xfd,0xa8,0x00,0x01,0x02,0xee,0xfe,0x3e,0x00,0x01,0x01,0xf4,0xff,0x6a,
-0x00,0x01,0x01,0xf4,0xfe,0x3e,0x00,0x01,0x02,0xbc,0xfe,0x70,0x00,0x01,0x02,0xbc,
-0xfd,0xda,0x00,0x01,0x03,0x84,0xff,0x6a,0x00,0x01,0x02,0xbc,0xfd,0xda,0x00,0x01,
-0x03,0x84,0xff,0x6a,0x00,0x01,0x03,0x84,0xff,0x6a,0x00,0x01,0x03,0x84,0xfd,0xa8,
-0x00,0x01,0x03,0x84,0xfe,0x5e,0x00,0x01,0x03,0x84,0xff,0x6a,0x00,0x01,0x03,0x84,
-0xfd,0xa8,0x00,0x01,0x03,0x84,0xff,0x6a,0x00,0x01,0x03,0x84,0xfd,0xa8,0x00,0x01,
-0x03,0x2c,0xfd,0xa8,0x00,0x01,0x03,0x2c,0xfd,0xa8,0x00,0x01,0x03,0x2c,0xfd,0xa8,
-0x00,0x01,0x03,0x2c,0xfd,0xa8,0x00,0x01,0x03,0x2c,0xfd,0xa8,0x00,0x01,0x03,0x2c,
-0xfd,0xa8,0x00,0x01,0x03,0x2c,0xfd,0xa8,0x00,0x01,0x01,0xf4,0xfe,0x0c,0x00,0x01,
-0x01,0xf4,0xfe,0x0c,0x00,0x01,0x03,0x20,0xff,0x38,0x00,0x01,0x03,0x20,0xff,0x38,
-0x00,0x01,0x03,0x20,0xff,0x38,0x00,0x01,0x03,0x20,0xff,0x6a,0x00,0x01,0x03,0x20,
-0xff,0x6a,0x00,0x01,0x02,0xee,0xfe,0x3e,0x00,0x01,0x03,0x2c,0xfd,0xa8,0x00,0x01,
-0x02,0xbc,0xfe,0x70,0x00,0x01,0x03,0x84,0xfd,0xa8,0x00,0x01,0x03,0x84,0xfd,0xa8,
-0x00,0x01,0x01,0x2b,0xfd,0xda,0x00,0x01,0x01,0x2b,0xfd,0xda,0x00,0x01,0x03,0x84,
-0xfd,0xa8,0x00,0x01,0x03,0x84,0xfd,0xa8,0x00,0x01,0x01,0x2b,0xfd,0xda,0x00,0x01,
-0x01,0x2b,0xfd,0xda,0x00,0x01,0x03,0x84,0xfd,0xa8,0x00,0x01,0x03,0x84,0xfd,0xa8,
-0x00,0x01,0x01,0x2b,0xfd,0xda,0x00,0x01,0x01,0x2b,0xfd,0xda,0x00,0x01,0x03,0x84,
-0xff,0x6a,0x00,0x01,0x03,0x84,0xff,0x6a,0x00,0x01,0x01,0x2b,0xff,0x9c,0x00,0x01,
-0x01,0x2b,0xff,0x9c,0x00,0x01,0x03,0x84,0xff,0x6a,0x00,0x01,0x03,0x84,0xff,0x6a,
-0x00,0x01,0x01,0x2b,0xff,0x9c,0x00,0x01,0x01,0x2b,0xff,0x9c,0x00,0x01,0x03,0x84,
-0xff,0x6a,0x00,0x01,0x03,0x84,0xff,0x6a,0x00,0x01,0x01,0x2b,0xff,0x9c,0x00,0x01,
-0x01,0x2b,0xff,0x9c,0x00,0x01,0x03,0x20,0xff,0x38,0x00,0x01,0x03,0x20,0xff,0x38,
-0x00,0x01,0x01,0xf4,0xff,0x6a,0x00,0x01,0x02,0x06,0xff,0x6a,0x00,0x01,0x03,0x20,
-0xff,0x38,0x00,0x01,0x03,0x20,0xff,0x38,0x00,0x01,0x01,0xf4,0xff,0x6a,0x00,0x01,
-0x02,0x06,0xff,0x6a,0x00,0x01,0x03,0x2c,0xfd,0xa8,0x00,0x01,0x03,0x2c,0xfd,0xa8,
-0x00,0x01,0x02,0x58,0xfe,0x0c,0x00,0x01,0x02,0x58,0xfe,0x0c,0x00,0x01,0x03,0x2c,
-0xfd,0xa8,0x00,0x01,0x03,0x2c,0xfd,0xa8,0x00,0x01,0x02,0x58,0xff,0x06,0x00,0x01,
-0x02,0x58,0xff,0x06,0x00,0x01,0x03,0x2c,0xfd,0xa8,0x00,0x01,0x03,0x2c,0xfd,0xa8,
-0x00,0x01,0x02,0x58,0xfe,0x0c,0x00,0x01,0x02,0x58,0xfe,0x0c,0x00,0x01,0x03,0x2c,
-0xfd,0xa8,0x00,0x01,0x03,0x2c,0xfd,0xa8,0x00,0x01,0x02,0x58,0xfe,0x0c,0x00,0x01,
-0x02,0x58,0xfe,0x0c,0x00,0x01,0x01,0xf4,0xfe,0x0c,0x00,0x01,0x01,0xf4,0xfe,0x0c,
-0x00,0x01,0x01,0xf4,0xfe,0x0c,0x00,0x01,0x01,0xf4,0xfe,0x0c,0x00,0x01,0x03,0x20,
-0xff,0x6a,0x00,0x01,0x03,0x20,0xff,0x6a,0x00,0x01,0x01,0x2c,0xff,0x6a,0x00,0x01,
-0x01,0x2c,0xff,0x6a,0x00,0x01,0x03,0x20,0xff,0x6a,0x00,0x01,0x03,0x20,0xff,0x6a,
-0x00,0x01,0x01,0x2c,0xff,0x6a,0x00,0x01,0x01,0x2c,0xff,0x6a,0x00,0x01,0x02,0xee,
-0xfe,0x3e,0x00,0x01,0x02,0xee,0xfd,0xa8,0x00,0x01,0x01,0x2b,0xff,0x9c,0x00,0x01,
-0x01,0x2b,0xff,0x9c,0x00,0x01,0x02,0xbc,0xfe,0x70,0x00,0x01,0x02,0xbc,0xfe,0x70,
-0x00,0x01,0x01,0x2b,0xfe,0xa2,0x00,0x01,0x01,0x2b,0xfe,0xa2,0x00,0x01,0x01,0x2c,
-0xff,0x9c,0x00,0x01,0x01,0x2c,0xff,0x9c,0x00,0x01,0x01,0x2c,0xff,0x9c,0x00,0x01,
-0x00,0xc5,0xff,0x9c,0x00,0x01,0x01,0x2c,0xfe,0x0c,0x00,0x01,0x01,0x2c,0xff,0x9c,
-0x00,0x01,0x01,0x2c,0xff,0x9c,0x00,0x01,0x01,0x2c,0xff,0x9c,0x00,0x01,0x01,0x2c,
-0xff,0x9c,0x00,0x01,0x01,0x2c,0xfe,0xd4,0x00,0x01,0x01,0x2c,0xfe,0xd4,0x00,0x01,
-0x01,0x2c,0xff,0x9c,0x00,0x01,0x01,0x2c,0xff,0x9c,0x00,0x01,0x01,0x2c,0xff,0x9c,
-0x00,0x01,0x01,0x2c,0xff,0x9c,0x00,0x01,0x01,0xf4,0x00,0x32,0x00,0x01,0x01,0x1d,
-0xff,0x9c,0x00,0x01,0x01,0x1d,0xff,0x9c,0x00,0x01,0x01,0x1d,0xff,0x9c,0x00,0x01,
-0x01,0x1d,0xff,0x9c,0x00,0x01,0x01,0xf4,0xfe,0x3e,0x00,0x01,0x01,0xf4,0xfe,0x0c,
-0x00,0x01,0x01,0x1d,0xfd,0xa8,0x00,0x01,0x01,0x1d,0xfd,0xa8,0x00,0x01,0x02,0xbc,
-0xfe,0x70,0x00,0x01,0x02,0xbc,0xfe,0x70,0x00,0x01,0x01,0x2b,0xff,0x9c,0x00,0x01,
-0x01,0x2b,0xff,0x9c,0x00,0x01,0x01,0x1d,0xff,0x9c,0x00,0x01,0x01,0x1d,0xff,0x9c,
-0x00,0x01,0x03,0x84,0xfe,0x70,0x00,0x01,0x03,0x84,0xfe,0x70,0x00,0x01,0x01,0x2b,
-0xfe,0xa2,0x00,0x01,0x01,0x2b,0xfe,0xa2,0x00,0x01,0x01,0xf4,0xff,0x6a,0x00,0x01,
-0x01,0xf4,0xff,0x6a,0x00,0x01,0x03,0x84,0xff,0x6a,0x00,0x01,0x03,0x84,0xff,0x6a,
-0x00,0x01,0x01,0x2b,0xff,0x9c,0x00,0x01,0x01,0x2b,0xff,0x9c,0x00,0x01,0x03,0x84,
-0xff,0x6a,0x00,0x01,0x03,0x84,0xff,0x6a,0x00,0x01,0x01,0x2b,0xff,0x9c,0x00,0x01,
-0x01,0x2b,0xff,0x9c,0x00,0x01,0x03,0x2c,0xfd,0xa8,0x00,0x01,0x03,0x2c,0xfd,0xa8,
-0x00,0x01,0x02,0x58,0xfe,0xa2,0x00,0x01,0x02,0x58,0xfe,0xa2,0x00,0x01,0x03,0x2c,
-0xfd,0xa8,0x00,0x01,0x03,0x2c,0xfd,0xa8,0x00,0x01,0x02,0x58,0xff,0x9c,0x00,0x01,
-0x02,0x58,0xff,0x9c,0x00,0x01,0x03,0x2c,0xfd,0xa8,0x00,0x01,0x03,0x2c,0xfd,0xa8,
-0x00,0x01,0x02,0x58,0xff,0x9c,0x00,0x01,0x02,0x58,0xff,0x9c,0x00,0x01,0x01,0xc2,
-0xff,0x6a,0x00,0x01,0x01,0xc2,0xff,0x6a,0x00,0x01,0x01,0xc2,0xff,0x6a,0x00,0x01,
-0x01,0xc2,0xff,0x6a,0x00,0x01,0x01,0xf4,0xfe,0x0c,0x00,0x01,0x01,0xf4,0xfe,0x0c,
-0x00,0x01,0x01,0xf4,0xfe,0x0c,0x00,0x01,0x01,0xf4,0xfe,0x0c,0x00,0x01,0x02,0x58,
-0xfd,0xa8,0x00,0x01,0x02,0x58,0xfd,0xa8,0x00,0x01,0x02,0x8a,0xff,0x6a,0x00,0x01,
-0x02,0x8a,0xff,0x6a,0x00,0x01,0x02,0x58,0xfd,0xa8,0x00,0x01,0x02,0x58,0xfd,0xa8,
-0x00,0x01,0x02,0x8a,0xff,0x6a,0x00,0x01,0x02,0x8a,0xff,0x6a,0x00,0x01,0x02,0x58,
-0xfd,0xa8,0x00,0x01,0x02,0x58,0xfd,0xa8,0x00,0x01,0x02,0x26,0xff,0x6a,0x00,0x01,
-0x02,0x26,0xff,0x6a,0x00,0x01,0x02,0x58,0xfd,0xa8,0x00,0x01,0x02,0x58,0xfd,0xa8,
-0x00,0x01,0x02,0x26,0xff,0x6a,0x00,0x01,0x02,0x26,0xff,0x6a,0x00,0x01,0x02,0x5b,
-0xff,0x6a,0x00,0x01,0x02,0x5b,0xff,0x6a,0x00,0x01,0x01,0x53,0xff,0x6a,0x00,0x01,
-0x01,0x53,0xff,0x6a,0x00,0x01,0x02,0x5b,0xff,0x6a,0x00,0x01,0x02,0x5b,0xff,0x6a,
-0x00,0x01,0x01,0x53,0xff,0x6a,0x00,0x01,0x01,0x53,0xff,0x6a,0x00,0x01,0x02,0x8a,
-0xfd,0xa8,0x00,0x01,0x02,0xd7,0xfd,0xa8,0x00,0x01,0x02,0x58,0xff,0x9c,0x00,0x01,
-0x01,0xee,0xff,0x9c,0x00,0x01,0x02,0x8a,0xfd,0xa8,0x00,0x01,0x02,0xd7,0xfd,0xa8,
-0x00,0x01,0x02,0x58,0xff,0x9c,0x00,0x01,0x01,0xee,0xff,0x9c,0x00,0x01,0x03,0x20,
-0xff,0x38,0x00,0x01,0x03,0x20,0xff,0x38,0x00,0x01,0x01,0xf4,0xff,0x6a,0x00,0x01,
-0x02,0x06,0xff,0x6a,0x00,0x01,0x02,0xbc,0xfd,0xda,0x00,0x01,0x02,0xbc,0xfd,0xa8,
-0x00,0x01,0x01,0xf4,0xff,0x6a,0x00,0x01,0x02,0x06,0xff,0x6a,0x00,0x01,0x03,0x20,
-0xff,0x38,0x00,0x01,0x03,0x20,0xff,0x38,0x00,0x01,0x01,0x2c,0xff,0x6a,0x00,0x01,
-0x01,0x2c,0xff,0x6a,0x00,0x01,0x02,0xbc,0xfe,0x3e,0x00,0x01,0x02,0xbc,0xfe,0x3e,
-0x00,0x01,0x01,0x53,0xff,0x9c,0x00,0x01,0x01,0x53,0xff,0x9c,0x00,0x01,0x00,0xf0,
-0xfd,0xa8,0x00,0x01,0x00,0xf0,0xfd,0xa8,0x00,0x01,0x02,0x26,0xff,0x6a,0x00,0x01,
-0x02,0x26,0xff,0x6a,0x00,0x01,0x02,0xee,0xfe,0x3e,0x00,0x01,0x02,0xee,0xfd,0xa8,
-0x00,0x01,0x01,0x2b,0xff,0x9c,0x00,0x01,0x01,0x2b,0xff,0x9c,0x00,0x01,0x01,0xf4,
-0xff,0x6a,0x00,0x01,0x01,0xf4,0xff,0x6a,0x00,0x01,0x01,0xc2,0xff,0x6a,0x00,0x01,
-0x01,0xf4,0xfd,0xa8,0x00,0x01,0x01,0xf4,0xfe,0x3e,0x00,0x01,0x01,0xf4,0xfe,0x0c,
-0x00,0x01,0x02,0xbc,0xfe,0x70,0x00,0x01,0x02,0xbc,0xfe,0x70,0x00,0x01,0x02,0xbc,
-0xfd,0xda,0x00,0x01,0x02,0xbc,0xfd,0xda,0x00,0x01,0x01,0x2b,0xfe,0xa2,0x00,0x01,
-0x01,0x2b,0xfe,0xa2,0x00,0x01,0x03,0x84,0xff,0x6a,0x00,0x01,0x01,0x2b,0xff,0x9c,
-0x00,0x01,0x01,0x2b,0xff,0x9c,0x00,0x01,0x03,0x20,0xff,0x38,0x00,0x01,0x01,0xf4,
-0xff,0x6a,0x00,0x01,0x02,0x06,0xff,0x6a,0x00,0x01,0x02,0xbc,0xfd,0x99,0x00,0x01,
-0x01,0xf4,0xff,0x6a,0x00,0x01,0x02,0x06,0xff,0x6a,0x00,0x01,0x01,0x2b,0xff,0x9c,
-0x00,0x01,0x01,0x2b,0xff,0x9c,0x00,0x01,0x03,0x84,0xfe,0x5e,0x00,0x01,0x01,0x2b,
-0xfe,0xc2,0x00,0x01,0x01,0x2b,0xfe,0xc2,0x00,0x01,0x03,0x84,0xff,0x6a,0x00,0x01,
-0x01,0x2b,0xff,0x9c,0x00,0x01,0x01,0x2b,0xff,0x9c,0x00,0x01,0x03,0x2c,0xfd,0xa8,
-0x00,0x01,0x02,0x58,0xff,0x9c,0x00,0x01,0x02,0x58,0xff,0x9c,0x00,0x01,0x03,0x2c,
-0xfd,0xa8,0x00,0x01,0x02,0x58,0xff,0x9c,0x00,0x01,0x02,0x58,0xff,0x9c,0x00,0x01,
-0x03,0x2c,0xfd,0xa8,0x00,0x01,0x02,0x58,0xff,0x9c,0x00,0x01,0x02,0x58,0xff,0x9c,
-0x00,0x01,0x03,0x2c,0xfd,0xa8,0x00,0x01,0x02,0x58,0xfe,0x0c,0x00,0x01,0x02,0x58,
-0xfe,0x0c,0x00,0x02,0x00,0x06,0x04,0xdb,0x04,0xfe,0x00,0x00,0x05,0x18,0x05,0x19,
-0x00,0x24,0x05,0x1b,0x05,0x33,0x00,0x26,0x0b,0x16,0x0b,0xdd,0x00,0x3f,0x0b,0xfa,
-0x0c,0x04,0x01,0x07,0x0c,0x06,0x0c,0x17,0x01,0x12,0x00,0x01,0x00,0x03,0x05,0x01,
-0x05,0x04,0x05,0x09,0x00,0x03,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x14,0x00,0x00,
-0x00,0x1a,0x00,0x01,0x02,0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x00,0x01,
-0x02,0x00,0x00,0x00,0x00,0x01,0x00,0xb8,0x00,0xae,0x00,0x01,0x00,0xc2,0x00,0x0c,
-0x00,0x08,0x00,0x12,0x00,0x24,0x00,0x36,0x00,0x48,0x00,0x5a,0x00,0x6c,0x00,0x7e,
-0x00,0x90,0x00,0x02,0x00,0x06,0x00,0x0c,0x00,0x01,0x03,0x63,0xff,0x9c,0x00,0x01,
-0x00,0xc8,0xff,0x6a,0x00,0x02,0x00,0x06,0x00,0x0c,0x00,0x01,0x03,0x63,0xff,0x9c,
-0x00,0x01,0x00,0xc8,0xff,0x6a,0x00,0x02,0x00,0x06,0x00,0x0c,0x00,0x01,0x03,0x63,
-0xff,0x9c,0x00,0x01,0x00,0xc8,0xff,0x6a,0x00,0x02,0x00,0x06,0x00,0x0c,0x00,0x01,
-0x03,0x63,0xff,0x9c,0x00,0x01,0x00,0xc8,0xff,0x6a,0x00,0x02,0x00,0x06,0x00,0x0c,
-0x00,0x01,0x03,0x63,0xff,0x9c,0x00,0x01,0x00,0xc8,0xfd,0xda,0x00,0x02,0x00,0x06,
-0x00,0x0c,0x00,0x01,0x03,0x63,0xff,0x9c,0x00,0x01,0x00,0xc8,0xfd,0xda,0x00,0x02,
-0x00,0x06,0x00,0x0c,0x00,0x01,0x03,0x63,0xff,0x9c,0x00,0x01,0x00,0xc8,0xff,0x6a,
-0x00,0x02,0x00,0x06,0x00,0x0c,0x00,0x01,0x03,0x63,0xff,0x9c,0x00,0x01,0x00,0xc8,
-0xff,0x6a,0x00,0x02,0x00,0x01,0x0b,0xde,0x0b,0xe5,0x00,0x00,0x00,0x01,0x00,0x03,
-0x05,0x01,0x05,0x04,0x05,0x09,0x00,0x03,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x14,
-0x00,0x00,0x00,0x1a,0x00,0x01,0x02,0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x00,
-0x00,0x01,0x02,0x00,0x00,0x00,0x00,0x01,0x09,0x56,0x09,0x2e,0x00,0x01,0x09,0x6c,
-0x00,0x0c,0x01,0x24,0x02,0x4a,0x02,0x50,0x02,0x56,0x02,0x5c,0x02,0x62,0x02,0x68,
-0x02,0x6e,0x02,0x74,0x02,0x7a,0x02,0x80,0x02,0x86,0x02,0x8c,0x02,0x92,0x02,0x98,
-0x02,0x9e,0x02,0xa4,0x02,0xaa,0x02,0xb0,0x02,0xb6,0x02,0xbc,0x02,0xc2,0x02,0xc8,
-0x02,0xce,0x02,0xd4,0x02,0xda,0x02,0xe0,0x02,0xe6,0x02,0xec,0x02,0xf2,0x02,0xf8,
-0x02,0xfe,0x03,0x04,0x03,0x0a,0x03,0x10,0x03,0x16,0x03,0x1c,0x03,0x22,0x03,0x28,
-0x03,0x2e,0x03,0x34,0x03,0x3a,0x03,0x40,0x03,0x46,0x03,0x4c,0x03,0x52,0x03,0x58,
-0x03,0x5e,0x03,0x64,0x03,0x6a,0x03,0x70,0x03,0x76,0x03,0x7c,0x03,0x82,0x03,0x88,
-0x03,0x8e,0x03,0x94,0x03,0x9a,0x03,0xa0,0x03,0xa6,0x03,0xac,0x03,0xb2,0x03,0xb8,
-0x03,0xbe,0x03,0xc4,0x03,0xca,0x03,0xd0,0x03,0xd6,0x03,0xdc,0x03,0xe2,0x03,0xe8,
-0x03,0xee,0x03,0xf4,0x03,0xfa,0x04,0x00,0x04,0x06,0x04,0x0c,0x04,0x12,0x04,0x18,
-0x04,0x1e,0x04,0x24,0x04,0x2a,0x04,0x30,0x04,0x36,0x04,0x3c,0x04,0x42,0x04,0x48,
-0x04,0x4e,0x04,0x54,0x04,0x5a,0x04,0x60,0x04,0x66,0x04,0x6c,0x04,0x72,0x04,0x78,
-0x04,0x7e,0x04,0x84,0x04,0x8a,0x04,0x90,0x04,0x96,0x04,0x9c,0x04,0xa2,0x04,0xa8,
-0x04,0xae,0x04,0xb4,0x04,0xba,0x04,0xc0,0x04,0xc6,0x04,0xcc,0x04,0xd2,0x04,0xd8,
-0x04,0xde,0x04,0xe4,0x04,0xea,0x04,0xf0,0x04,0xf6,0x04,0xfc,0x05,0x02,0x05,0x08,
-0x05,0x0e,0x05,0x14,0x05,0x1a,0x05,0x20,0x05,0x26,0x05,0x2c,0x05,0x32,0x05,0x38,
-0x05,0x3e,0x05,0x44,0x05,0x4a,0x05,0x50,0x05,0x56,0x05,0x5c,0x05,0x62,0x05,0x68,
-0x05,0x6e,0x05,0x74,0x05,0x7a,0x05,0x80,0x05,0x86,0x05,0x8c,0x05,0x92,0x05,0x98,
-0x05,0x9e,0x05,0xa4,0x05,0xaa,0x05,0xb0,0x05,0xb6,0x05,0xbc,0x05,0xc2,0x05,0xc8,
-0x05,0xce,0x05,0xd4,0x05,0xda,0x05,0xe0,0x05,0xe6,0x05,0xec,0x05,0xf2,0x05,0xf8,
-0x05,0xfe,0x06,0x04,0x06,0x0a,0x06,0x10,0x06,0x16,0x06,0x1c,0x06,0x22,0x06,0x28,
-0x06,0x2e,0x06,0x34,0x06,0x3a,0x06,0x40,0x06,0x46,0x06,0x4c,0x06,0x52,0x06,0x58,
-0x06,0x5e,0x06,0x64,0x06,0x6a,0x06,0x70,0x06,0x76,0x06,0x7c,0x06,0x82,0x06,0x88,
-0x06,0x8e,0x06,0x94,0x06,0x9a,0x06,0xa0,0x06,0xa6,0x06,0xac,0x06,0xb2,0x06,0xb8,
-0x06,0xbe,0x06,0xc4,0x06,0xca,0x06,0xd0,0x06,0xd6,0x06,0xdc,0x06,0xe2,0x06,0xe8,
-0x06,0xee,0x06,0xf4,0x06,0xfa,0x07,0x00,0x07,0x06,0x07,0x0c,0x07,0x12,0x07,0x18,
-0x07,0x1e,0x07,0x24,0x07,0x2a,0x07,0x30,0x07,0x36,0x07,0x3c,0x07,0x42,0x07,0x48,
-0x07,0x4e,0x07,0x54,0x07,0x5a,0x07,0x60,0x07,0x66,0x07,0x6c,0x07,0x72,0x07,0x78,
-0x07,0x7e,0x07,0x84,0x07,0x8a,0x07,0x90,0x07,0x96,0x07,0x9c,0x07,0xa2,0x07,0xa8,
-0x07,0xae,0x07,0xb4,0x07,0xba,0x07,0xc0,0x07,0xc6,0x07,0xcc,0x07,0xd2,0x07,0xd8,
-0x07,0xde,0x07,0xe4,0x07,0xea,0x07,0xf0,0x07,0xf6,0x07,0xfc,0x08,0x02,0x08,0x08,
-0x08,0x0e,0x08,0x14,0x08,0x1a,0x08,0x20,0x08,0x26,0x08,0x2c,0x08,0x32,0x08,0x38,
-0x08,0x3e,0x08,0x44,0x08,0x4a,0x08,0x50,0x08,0x56,0x08,0x5c,0x08,0x62,0x08,0x68,
-0x08,0x6e,0x08,0x74,0x08,0x7a,0x08,0x80,0x08,0x86,0x08,0x8c,0x08,0x92,0x08,0x98,
-0x08,0x9e,0x08,0xa4,0x08,0xaa,0x08,0xb0,0x08,0xb6,0x08,0xbc,0x08,0xc2,0x08,0xc8,
-0x08,0xce,0x08,0xd4,0x08,0xda,0x08,0xe0,0x08,0xe6,0x08,0xec,0x08,0xf2,0x08,0xf8,
-0x08,0xfe,0x09,0x04,0x09,0x0a,0x09,0x10,0x09,0x16,0x09,0x1c,0x00,0x01,0x01,0x1d,
-0x07,0x9e,0x00,0x01,0x01,0x1d,0x08,0x34,0x00,0x01,0x01,0xc2,0x06,0x72,0x00,0x01,
-0x01,0x1d,0x06,0x72,0x00,0x01,0x01,0xf4,0x05,0x14,0x00,0x01,0x01,0x1d,0x06,0x72,
-0x00,0x01,0x03,0x84,0x03,0xe8,0x00,0x01,0x01,0xc2,0x04,0x4c,0x00,0x01,0x03,0x84,
-0x03,0x52,0x00,0x01,0x03,0x84,0x04,0x4c,0x00,0x01,0x02,0x8a,0x03,0xe8,0x00,0x01,
-0x02,0x8a,0x03,0xe8,0x00,0x01,0x02,0x8a,0x04,0xe2,0x00,0x01,0x01,0x90,0x03,0xe8,
-0x00,0x01,0x01,0x90,0x04,0xe2,0x00,0x01,0x02,0xbc,0x02,0xee,0x00,0x01,0x02,0xbc,
-0x03,0xe8,0x00,0x01,0x02,0x58,0x03,0x20,0x00,0x01,0x02,0x58,0x03,0x20,0x00,0x01,
-0x02,0x58,0x03,0x20,0x00,0x01,0x02,0x58,0x03,0x20,0x00,0x01,0x02,0x5b,0x06,0x72,
-0x00,0x01,0x02,0x5b,0x06,0x72,0x00,0x01,0x01,0xc2,0x04,0x7e,0x00,0x01,0x01,0xc2,
-0x05,0x78,0x00,0x01,0x01,0x2c,0x04,0xb0,0x00,0x01,0x02,0xbc,0x04,0x4c,0x00,0x01,
-0x01,0xf4,0x04,0x4c,0x00,0x01,0x02,0xbc,0x05,0xdc,0x00,0x01,0x02,0x8a,0x05,0x14,
-0x00,0x01,0x02,0x8a,0x03,0xb6,0x00,0x01,0x02,0x8a,0x03,0xe8,0x00,0x01,0x01,0xc2,
-0x03,0x52,0x00,0x01,0x01,0xf4,0x04,0x4c,0x00,0x01,0x01,0xf4,0x02,0xee,0x00,0x01,
-0x01,0xf4,0x02,0xee,0x00,0x01,0x03,0x84,0x03,0xe8,0x00,0x01,0x01,0xf4,0x04,0x4c,
-0x00,0x01,0x03,0x84,0x04,0xe2,0x00,0x01,0x03,0x84,0x04,0x4c,0x00,0x01,0x03,0x84,
-0x03,0xe8,0x00,0x01,0x03,0x84,0x03,0x52,0x00,0x01,0x03,0x84,0x03,0xe8,0x00,0x01,
-0x03,0x84,0x03,0xe8,0x00,0x01,0x03,0x84,0x04,0x4c,0x00,0x01,0x03,0x84,0x03,0xe8,
-0x00,0x01,0x02,0x8a,0x06,0x0e,0x00,0x01,0x02,0x8a,0x05,0xdc,0x00,0x01,0x02,0x8a,
-0x03,0xe8,0x00,0x01,0x02,0x8a,0x03,0xe8,0x00,0x01,0x02,0x8a,0x05,0xdc,0x00,0x01,
-0x02,0x8a,0x03,0xe8,0x00,0x01,0x02,0x8a,0x03,0xe8,0x00,0x01,0x02,0xbc,0x05,0x78,
-0x00,0x01,0x02,0xbc,0x04,0xe2,0x00,0x01,0x02,0xbc,0x04,0x4c,0x00,0x01,0x02,0xbc,
-0x04,0x4c,0x00,0x01,0x02,0xbc,0x04,0x4c,0x00,0x01,0x01,0xf4,0x05,0x78,0x00,0x01,
-0x01,0xf4,0x05,0x78,0x00,0x01,0x02,0x8a,0x02,0xee,0x00,0x01,0x02,0x8a,0x04,0xe2,
-0x00,0x01,0x01,0xf4,0x02,0xee,0x00,0x01,0x03,0x84,0x03,0xe8,0x00,0x01,0x03,0x84,
-0x03,0xe8,0x00,0x01,0x01,0x2b,0x03,0xe8,0x00,0x01,0x01,0x2b,0x03,0xe8,0x00,0x01,
-0x03,0x84,0x03,0xe8,0x00,0x01,0x03,0x84,0x03,0xe8,0x00,0x01,0x01,0x2b,0x03,0xe8,
-0x00,0x01,0x01,0x2b,0x03,0xe8,0x00,0x01,0x03,0x84,0x03,0xe8,0x00,0x01,0x03,0x84,
-0x03,0xe8,0x00,0x01,0x01,0x2b,0x03,0xe8,0x00,0x01,0x01,0x2b,0x03,0xe8,0x00,0x01,
-0x03,0x84,0x04,0x4c,0x00,0x01,0x03,0x84,0x04,0x4c,0x00,0x01,0x01,0x2b,0x05,0x14,
-0x00,0x01,0x01,0x2b,0x05,0x14,0x00,0x01,0x03,0x84,0x04,0x4c,0x00,0x01,0x03,0x84,
-0x04,0x4c,0x00,0x01,0x01,0x2b,0x05,0x14,0x00,0x01,0x01,0x2b,0x05,0x14,0x00,0x01,
-0x03,0x84,0x04,0xe2,0x00,0x01,0x03,0x84,0x04,0xe2,0x00,0x01,0x01,0x2b,0x05,0xaa,
-0x00,0x01,0x01,0x2b,0x05,0xaa,0x00,0x01,0x02,0xbc,0x04,0x4c,0x00,0x01,0x02,0xbc,
-0x04,0x4c,0x00,0x01,0x01,0xf4,0x06,0x40,0x00,0x01,0x02,0x06,0x05,0xaa,0x00,0x01,
-0x02,0xbc,0x04,0x4c,0x00,0x01,0x02,0xbc,0x04,0x4c,0x00,0x01,0x01,0xf4,0x06,0x40,
-0x00,0x01,0x02,0x06,0x05,0xaa,0x00,0x01,0x02,0x8a,0x03,0xe8,0x00,0x01,0x02,0x8a,
-0x03,0xe8,0x00,0x01,0x02,0x58,0x03,0xe8,0x00,0x01,0x02,0x58,0x03,0xe8,0x00,0x01,
-0x02,0x8a,0x03,0xe8,0x00,0x01,0x02,0x8a,0x03,0xe8,0x00,0x01,0x02,0x58,0x03,0xe8,
-0x00,0x01,0x02,0x58,0x03,0xe8,0x00,0x01,0x02,0x8a,0x03,0xe8,0x00,0x01,0x02,0x8a,
-0x03,0xe8,0x00,0x01,0x02,0x58,0x03,0xe8,0x00,0x01,0x02,0x58,0x03,0xe8,0x00,0x01,
-0x02,0x8a,0x03,0xe8,0x00,0x01,0x02,0x8a,0x03,0xe8,0x00,0x01,0x02,0x58,0x03,0xe8,
-0x00,0x01,0x02,0x58,0x03,0xe8,0x00,0x01,0x02,0xbc,0x04,0xe2,0x00,0x01,0x02,0xbc,
-0x04,0xe2,0x00,0x01,0x02,0xbc,0x05,0x78,0x00,0x01,0x02,0xbc,0x05,0x78,0x00,0x01,
-0x01,0xf4,0x05,0x78,0x00,0x01,0x01,0xf4,0x05,0x78,0x00,0x01,0x00,0xfa,0x06,0x0e,
-0x00,0x01,0x00,0xfa,0x06,0x0e,0x00,0x01,0x01,0xf4,0x05,0x78,0x00,0x01,0x01,0xf4,
-0x05,0x78,0x00,0x01,0x00,0xfa,0x06,0xa4,0x00,0x01,0x00,0xfa,0x06,0xa4,0x00,0x01,
-0x02,0x8a,0x02,0xee,0x00,0x01,0x02,0x8a,0x02,0x8a,0x00,0x01,0x01,0x2b,0x03,0xe8,
-0x00,0x01,0x01,0x2b,0x03,0xe8,0x00,0x01,0x01,0xf4,0x02,0xee,0x00,0x01,0x02,0x58,
-0x02,0x56,0x00,0x01,0x01,0x2b,0x03,0xe8,0x00,0x01,0x01,0x2b,0x03,0xe8,0x00,0x01,
-0x01,0x2c,0x06,0xa4,0x00,0x01,0x01,0x2c,0x06,0xa4,0x00,0x01,0x01,0x2c,0x07,0x3a,
-0x00,0x01,0x00,0xc5,0x04,0xb0,0x00,0x01,0x01,0x2c,0x04,0xb0,0x00,0x01,0x01,0x2c,
-0x05,0xdc,0x00,0x01,0x01,0x2c,0x05,0xdc,0x00,0x01,0x01,0x2c,0x07,0x3a,0x00,0x01,
-0x01,0x2c,0x07,0x3a,0x00,0x01,0x01,0x2c,0x04,0xb0,0x00,0x01,0x01,0x2c,0x04,0xb0,
-0x00,0x01,0x01,0x2c,0x07,0x08,0x00,0x01,0x01,0x2c,0x07,0x08,0x00,0x01,0x01,0x2c,
-0x07,0x3a,0x00,0x01,0x01,0x2c,0x07,0x3a,0x00,0x01,0x01,0xc2,0x04,0x4c,0x00,0x01,
-0x01,0x1d,0x07,0xd0,0x00,0x01,0x01,0x1d,0x07,0xd0,0x00,0x01,0x01,0x1d,0x08,0x98,
-0x00,0x01,0x01,0x1d,0x08,0x98,0x00,0x01,0x01,0xc2,0x06,0x72,0x00,0x01,0x01,0xc2,
-0x04,0xe2,0x00,0x01,0x01,0x1d,0x06,0x72,0x00,0x01,0x01,0x1d,0x06,0x72,0x00,0x01,
-0x01,0xf4,0x05,0x14,0x00,0x01,0x02,0x58,0x04,0x1a,0x00,0x01,0x01,0x2b,0x05,0x46,
-0x00,0x01,0x01,0x2b,0x05,0x46,0x00,0x01,0x01,0x1d,0x06,0x72,0x00,0x01,0x01,0x1d,
-0x06,0x72,0x00,0x01,0x03,0x84,0x03,0xe8,0x00,0x01,0x03,0x84,0x03,0xe8,0x00,0x01,
-0x01,0x2b,0x03,0xe8,0x00,0x01,0x01,0x2b,0x03,0xe8,0x00,0x01,0x01,0xc2,0x04,0x4c,
-0x00,0x01,0x02,0x26,0x04,0x4c,0x00,0x01,0x03,0x84,0x03,0x52,0x00,0x01,0x03,0x84,
-0x03,0x52,0x00,0x01,0x01,0x2b,0x04,0x1a,0x00,0x01,0x01,0x2b,0x04,0x1a,0x00,0x01,
-0x03,0x84,0x04,0x4c,0x00,0x01,0x03,0x84,0x04,0x4c,0x00,0x01,0x01,0x2b,0x05,0x14,
-0x00,0x01,0x01,0x2b,0x05,0x14,0x00,0x01,0x02,0x8a,0x03,0xe8,0x00,0x01,0x02,0x8a,
-0x03,0xe8,0x00,0x01,0x02,0x58,0x03,0xe8,0x00,0x01,0x02,0x58,0x03,0xe8,0x00,0x01,
-0x02,0x8a,0x03,0xe8,0x00,0x01,0x02,0x8a,0x03,0xe8,0x00,0x01,0x02,0x58,0x03,0xe8,
-0x00,0x01,0x02,0x58,0x03,0xe8,0x00,0x01,0x02,0x8a,0x04,0xe2,0x00,0x01,0x02,0x8a,
-0x04,0xe2,0x00,0x01,0x02,0x58,0x04,0x7e,0x00,0x01,0x02,0x58,0x04,0x7e,0x00,0x01,
-0x01,0x90,0x03,0xe8,0x00,0x01,0x01,0x90,0x03,0xe8,0x00,0x01,0x01,0x90,0x04,0xe2,
-0x00,0x01,0x01,0x90,0x04,0xe2,0x00,0x01,0x02,0xbc,0x02,0xee,0x00,0x01,0x02,0xbc,
-0x02,0xee,0x00,0x01,0x02,0xbc,0x03,0xe8,0x00,0x01,0x02,0xbc,0x03,0xe8,0x00,0x01,
-0x02,0x58,0x03,0x20,0x00,0x01,0x02,0x58,0x03,0x20,0x00,0x01,0x02,0x8a,0x03,0x84,
-0x00,0x01,0x02,0x8a,0x03,0x84,0x00,0x01,0x02,0x58,0x03,0x20,0x00,0x01,0x02,0x58,
-0x03,0x20,0x00,0x01,0x03,0x52,0x04,0xe2,0x00,0x01,0x03,0x52,0x04,0xe2,0x00,0x01,
-0x02,0x58,0x03,0x20,0x00,0x01,0x02,0x58,0x03,0x20,0x00,0x01,0x02,0x26,0x03,0x20,
-0x00,0x01,0x02,0x26,0x03,0x20,0x00,0x01,0x02,0x58,0x03,0x20,0x00,0x01,0x02,0x58,
-0x03,0x20,0x00,0x01,0x02,0x26,0x03,0xe8,0x00,0x01,0x02,0x26,0x03,0xe8,0x00,0x01,
-0x02,0x5b,0x06,0x72,0x00,0x01,0x02,0x5b,0x06,0x72,0x00,0x01,0x01,0x53,0x06,0x72,
-0x00,0x01,0x01,0x53,0x06,0x72,0x00,0x01,0x02,0x5b,0x06,0x72,0x00,0x01,0x02,0x5b,
-0x06,0x72,0x00,0x01,0x01,0x53,0x06,0x72,0x00,0x01,0x01,0x53,0x06,0x72,0x00,0x01,
-0x01,0xc2,0x04,0x7e,0x00,0x01,0x01,0xf4,0x03,0xe8,0x00,0x01,0x01,0xc2,0x04,0x7e,
-0x00,0x01,0x01,0xee,0x03,0xe8,0x00,0x01,0x01,0xc2,0x05,0x78,0x00,0x01,0x01,0xf4,
-0x04,0x7e,0x00,0x01,0x01,0xc2,0x05,0x78,0x00,0x01,0x01,0xee,0x04,0x7e,0x00,0x01,
-0x02,0xbc,0x04,0x4c,0x00,0x01,0x02,0xbc,0x04,0x4c,0x00,0x01,0x01,0xf4,0x05,0x46,
-0x00,0x01,0x02,0x06,0x04,0xb0,0x00,0x01,0x01,0xf4,0x04,0x4c,0x00,0x01,0x01,0xf4,
-0x03,0x52,0x00,0x01,0x01,0xf4,0x05,0x46,0x00,0x01,0x02,0x06,0x04,0xb0,0x00,0x01,
-0x02,0xbc,0x05,0xdc,0x00,0x01,0x02,0xbc,0x05,0xdc,0x00,0x01,0x00,0xfa,0x06,0x0e,
-0x00,0x01,0x00,0xfa,0x06,0x0e,0x00,0x01,0x02,0x8a,0x05,0x14,0x00,0x01,0x02,0x8a,
-0x05,0x14,0x00,0x01,0x01,0x53,0x06,0x72,0x00,0x01,0x01,0x53,0x06,0x72,0x00,0x01,
-0x02,0x8a,0x03,0xb6,0x00,0x01,0x02,0x8a,0x03,0x52,0x00,0x01,0x02,0x26,0x03,0x52,
-0x00,0x01,0x02,0x26,0x03,0x52,0x00,0x01,0x02,0x8a,0x03,0xe8,0x00,0x01,0x02,0x8a,
-0x02,0xee,0x00,0x01,0x01,0x2b,0x04,0x1a,0x00,0x01,0x01,0x2b,0x04,0x1a,0x00,0x01,
-0x01,0xc2,0x03,0x52,0x00,0x01,0x02,0x26,0x03,0x52,0x00,0x01,0x01,0xf4,0x04,0x4c,
-0x00,0x01,0x01,0xf4,0x03,0x20,0x00,0x01,0x01,0xf4,0x04,0x4c,0x00,0x01,0x01,0xf4,
-0x02,0xee,0x00,0x01,0x01,0xf4,0x02,0xee,0x00,0x01,0x02,0x58,0x02,0x56,0x00,0x01,
-0x01,0xf4,0x02,0xee,0x00,0x01,0x02,0x58,0x02,0xee,0x00,0x01,0x01,0x2b,0x03,0xe8,
-0x00,0x01,0x01,0x2b,0x03,0xe8,0x00,0x01,0x03,0x84,0x03,0xe8,0x00,0x01,0x01,0x2b,
-0x03,0xe8,0x00,0x01,0x01,0x2b,0x03,0xe8,0x00,0x01,0x02,0xbc,0x04,0x4c,0x00,0x01,
-0x01,0xf4,0x04,0x4c,0x00,0x01,0x02,0x06,0x03,0xb6,0x00,0x01,0x01,0xf4,0x03,0x52,
-0x00,0x01,0x01,0xf4,0x04,0x4c,0x00,0x01,0x02,0x06,0x03,0xb6,0x00,0x01,0x01,0x2b,
-0x04,0x1a,0x00,0x01,0x01,0x2b,0x04,0x1a,0x00,0x01,0x03,0x84,0x03,0x52,0x00,0x01,
-0x01,0x2b,0x04,0x1a,0x00,0x01,0x01,0x2b,0x04,0x1a,0x00,0x01,0x03,0x84,0x03,0xe8,
-0x00,0x01,0x01,0x2b,0x05,0x14,0x00,0x01,0x01,0x2b,0x05,0x14,0x00,0x01,0x02,0x8a,
-0x06,0x0e,0x00,0x01,0x02,0x58,0x05,0xaa,0x00,0x01,0x02,0x58,0x05,0xaa,0x00,0x01,
-0x02,0x8a,0x05,0xdc,0x00,0x01,0x02,0x58,0x05,0x78,0x00,0x01,0x02,0x58,0x05,0x78,
-0x00,0x01,0x02,0x8a,0x05,0xdc,0x00,0x01,0x02,0x58,0x05,0x78,0x00,0x01,0x02,0x58,
-0x05,0x78,0x00,0x01,0x02,0x8a,0x04,0xe2,0x00,0x01,0x02,0x58,0x04,0x7e,0x00,0x01,
-0x02,0x58,0x04,0x7e,0x00,0x02,0x00,0x06,0x04,0xdb,0x04,0xfe,0x00,0x00,0x05,0x18,
-0x05,0x19,0x00,0x24,0x05,0x1b,0x05,0x33,0x00,0x26,0x0b,0x16,0x0b,0xdd,0x00,0x3f,
-0x0b,0xfa,0x0c,0x04,0x01,0x07,0x0c,0x06,0x0c,0x17,0x01,0x12,0x00,0x01,0x00,0x09,
-0x04,0xd7,0x04,0xff,0x05,0x00,0x05,0x02,0x05,0x03,0x05,0x05,0x05,0x06,0x05,0x07,
-0x05,0x08,0x00,0x09,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x32,
-0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x4a,
-0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x56,0x00,0x01,0x02,0x00,0x04,0xb0,0x00,0x01,
-0x02,0x00,0x04,0xb0,0x00,0x01,0x02,0x00,0x04,0xb0,0x00,0x01,0x02,0x00,0x04,0xb0,
-0x00,0x01,0x02,0x00,0x04,0xb0,0x00,0x01,0x02,0x00,0x04,0xb0,0x00,0x01,0x02,0x00,
-0x04,0xb0,0x00,0x01,0x02,0x00,0x04,0xb0,0x00,0x01,0x02,0x00,0x04,0xb0,0x00,0x01,
-0x00,0xb8,0x00,0xae,0x00,0x01,0x00,0xce,0x00,0x0c,0x00,0x08,0x00,0x12,0x00,0x24,
-0x00,0x36,0x00,0x48,0x00,0x5a,0x00,0x6c,0x00,0x7e,0x00,0x90,0x00,0x02,0x00,0x06,
-0x00,0x0c,0x00,0x01,0x03,0x63,0x06,0x72,0x00,0x01,0x00,0x96,0x07,0x08,0x00,0x02,
-0x00,0x06,0x00,0x0c,0x00,0x01,0x03,0x63,0x06,0x72,0x00,0x01,0x00,0x96,0x07,0x08,
-0x00,0x02,0x00,0x06,0x00,0x0c,0x00,0x01,0x03,0x63,0x06,0x72,0x00,0x01,0x00,0x96,
-0x07,0xe4,0x00,0x02,0x00,0x06,0x00,0x0c,0x00,0x01,0x03,0x63,0x06,0x72,0x00,0x01,
-0x00,0x96,0x07,0xe4,0x00,0x02,0x00,0x06,0x00,0x0c,0x00,0x01,0x03,0x63,0x06,0x72,
-0x00,0x01,0x00,0x96,0x05,0xdc,0x00,0x02,0x00,0x06,0x00,0x0c,0x00,0x01,0x03,0x63,
-0x06,0x72,0x00,0x01,0x00,0x96,0x05,0xdc,0x00,0x02,0x00,0x06,0x00,0x0c,0x00,0x01,
-0x03,0x63,0x06,0x72,0x00,0x01,0x00,0x96,0x05,0xdc,0x00,0x02,0x00,0x06,0x00,0x0c,
-0x00,0x01,0x03,0x63,0x06,0x72,0x00,0x01,0x00,0x96,0x05,0xdc,0x00,0x02,0x00,0x01,
-0x0b,0xde,0x0b,0xe5,0x00,0x00,0x00,0x01,0x00,0x09,0x04,0xd7,0x04,0xff,0x05,0x00,
-0x05,0x02,0x05,0x03,0x05,0x05,0x05,0x06,0x05,0x07,0x05,0x08,0x00,0x09,0x00,0x00,
-0x00,0x26,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x38,0x00,0x00,
-0x00,0x3e,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x50,0x00,0x00,
-0x00,0x56,0x00,0x01,0x02,0x00,0x04,0xb0,0x00,0x01,0x02,0x00,0x04,0xb0,0x00,0x01,
-0x02,0x00,0x04,0xb0,0x00,0x01,0x02,0x00,0x04,0xb0,0x00,0x01,0x02,0x00,0x04,0xb0,
-0x00,0x01,0x02,0x00,0x04,0xb0,0x00,0x01,0x02,0x00,0x04,0xb0,0x00,0x01,0x02,0x00,
-0x04,0xb0,0x00,0x01,0x02,0x00,0x04,0xb0,0x00,0x01,0x00,0x1c,0x00,0x16,0x00,0x01,
-0x00,0x56,0x00,0x0c,0x00,0x01,0x00,0x04,0x00,0x01,0x03,0x5e,0x04,0x7b,0x00,0x01,
-0x00,0x01,0x03,0x4e,0x00,0x02,0x00,0x09,0x02,0xa3,0x02,0xb4,0x00,0x00,0x02,0xe0,
-0x02,0xe0,0x00,0x12,0x02,0xe2,0x02,0xe5,0x00,0x13,0x02,0xe7,0x02,0xe7,0x00,0x17,
-0x02,0xe9,0x02,0xe9,0x00,0x18,0x02,0xed,0x02,0xef,0x00,0x19,0x02,0xf2,0x02,0xf3,
-0x00,0x1c,0x02,0xf5,0x02,0xf5,0x00,0x1e,0x0b,0xe9,0x0b,0xf3,0x00,0x1f,0x00,0x2a,
-0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0xbc,
-0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0xd4,
-0x00,0x00,0x00,0xda,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0xe6,0x00,0x00,0x00,0xec,
-0x00,0x00,0x00,0xf2,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0xfe,0x00,0x00,0x01,0x04,
-0x00,0x00,0x01,0x0a,0x00,0x00,0x01,0x10,0x00,0x00,0x01,0x16,0x00,0x00,0x01,0x1c,
-0x00,0x00,0x01,0x22,0x00,0x00,0x01,0x28,0x00,0x00,0x01,0x2e,0x00,0x00,0x01,0x34,
-0x00,0x00,0x01,0x3a,0x00,0x00,0x01,0x40,0x00,0x00,0x01,0x46,0x00,0x00,0x01,0x4c,
-0x00,0x00,0x01,0x52,0x00,0x00,0x01,0x58,0x00,0x00,0x01,0x5e,0x00,0x00,0x01,0x64,
-0x00,0x00,0x01,0x6a,0x00,0x00,0x01,0x70,0x00,0x00,0x01,0x76,0x00,0x00,0x01,0x7c,
-0x00,0x00,0x01,0x82,0x00,0x00,0x01,0x88,0x00,0x00,0x01,0x8e,0x00,0x00,0x01,0x94,
-0x00,0x00,0x01,0x9a,0x00,0x00,0x01,0xa0,0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,
-0xfe,0x00,0x04,0x7b,0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,0xfe,0x00,0x04,0xb0,
-0x00,0x01,0xfe,0x00,0x05,0x02,0x00,0x01,0xfe,0x00,0x05,0x02,0x00,0x01,0xfe,0x00,
-0x05,0x02,0x00,0x01,0xfe,0x00,0x05,0x02,0x00,0x01,0xfe,0x00,0x05,0x02,0x00,0x01,
-0xfe,0x00,0x06,0xc5,0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,0xfe,0x00,0x04,0x7b,
-0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,0xfe,0x00,
-0x04,0x7b,0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,0xfe,0x00,0x05,0x02,0x00,0x01,
-0xfe,0x00,0x05,0x02,0x00,0x01,0xfe,0x00,0x05,0x02,0x00,0x01,0xfe,0x00,0x05,0x02,
-0x00,0x01,0xfe,0x00,0x06,0x68,0x00,0x01,0xfe,0x00,0x06,0x68,0x00,0x01,0xfe,0x00,
-0x04,0xb0,0x00,0x01,0xfe,0x00,0x07,0xd0,0x00,0x01,0xfe,0x00,0x06,0x44,0x00,0x01,
-0xfe,0x00,0x05,0x02,0x00,0x01,0xfe,0x00,0x07,0x04,0x00,0x01,0xfe,0x00,0x07,0x04,
-0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,0xfe,0x00,0x06,0xda,0x00,0x01,0xfe,0x00,
-0x04,0x7b,0x00,0x01,0xfe,0x00,0x05,0xf8,0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,
-0xfe,0x00,0x05,0xf8,0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,0xfe,0x00,0x05,0xf8,
-0x00,0x01,0xfe,0x00,0x05,0xf8,0x00,0x01,0xfe,0x00,0x05,0xf8,0x00,0x01,0xfe,0x00,
-0x05,0xf8,0x00,0x01,0xfe,0x00,0x05,0xf8,0x00,0x01,0xfe,0x00,0x05,0xf8,0x00,0x01,
-0xfe,0x00,0x05,0xf8,0x00,0x01,0x01,0x94,0x01,0x4e,0x00,0x01,0x01,0xce,0x00,0x0c,
-0x00,0x28,0x00,0x52,0x00,0x58,0x00,0x5e,0x00,0x64,0x00,0x6a,0x00,0x70,0x00,0x76,
-0x00,0x7c,0x00,0x82,0x00,0x88,0x00,0x8e,0x00,0x94,0x00,0x9a,0x00,0xa0,0x00,0xa6,
-0x00,0xac,0x00,0xb2,0x00,0xb8,0x00,0xbe,0x00,0xc4,0x00,0xca,0x00,0xd0,0x00,0xd6,
-0x00,0xdc,0x00,0xe2,0x00,0xe8,0x00,0xee,0x00,0xf4,0x00,0xfa,0x01,0x00,0x01,0x06,
-0x01,0x0c,0x01,0x12,0x01,0x18,0x01,0x1e,0x01,0x24,0x01,0x2a,0x01,0x30,0x01,0x36,
-0x01,0x3c,0x00,0x01,0xfe,0x00,0x06,0x68,0x00,0x01,0xfe,0x00,0x06,0x68,0x00,0x01,
-0xfe,0x00,0x06,0x68,0x00,0x01,0xfe,0x00,0x06,0x3d,0x00,0x01,0xfe,0x00,0x06,0x14,
-0x00,0x01,0xfe,0x00,0x06,0x14,0x00,0x01,0xfe,0x00,0x06,0x44,0x00,0x01,0xfe,0x00,
-0x06,0x14,0x00,0x01,0xfe,0x00,0x06,0x14,0x00,0x01,0xfe,0x00,0x06,0xc5,0x00,0x01,
-0xfe,0x00,0x07,0x04,0x00,0x01,0xfe,0x00,0x06,0x68,0x00,0x01,0xfe,0x00,0x06,0x68,
-0x00,0x01,0xfe,0x00,0x06,0xa8,0x00,0x01,0xfe,0x00,0x06,0xa8,0x00,0x01,0xfe,0x00,
-0x06,0x68,0x00,0x01,0xfe,0x00,0x06,0xda,0x00,0x01,0xfe,0x00,0x06,0x44,0x00,0x01,
-0xfe,0x00,0x06,0x93,0x00,0x01,0xfe,0x00,0x06,0x14,0x00,0x01,0xfe,0x00,0x06,0x68,
-0x00,0x01,0xfe,0x00,0x06,0x68,0x00,0x01,0xfe,0x00,0x06,0x3d,0x00,0x01,0xfe,0x00,
-0x07,0xd0,0x00,0x01,0xfe,0x00,0x06,0x44,0x00,0x01,0xfe,0x00,0x06,0x44,0x00,0x01,
-0xfe,0x00,0x07,0x04,0x00,0x01,0xfe,0x00,0x07,0x04,0x00,0x01,0xfe,0x00,0x07,0x04,
-0x00,0x01,0xfe,0x00,0x06,0xda,0x00,0x01,0xfe,0x00,0x07,0x04,0x00,0x01,0xfe,0x00,
-0x05,0xf8,0x00,0x01,0xfe,0x00,0x05,0xf8,0x00,0x01,0xfe,0x00,0x05,0xf8,0x00,0x01,
-0xfe,0x00,0x05,0xf8,0x00,0x01,0xfe,0x00,0x05,0xf8,0x00,0x01,0xfe,0x00,0x05,0xf8,
-0x00,0x01,0xfe,0x00,0x05,0xf8,0x00,0x01,0xfe,0x00,0x05,0xf8,0x00,0x01,0xfe,0x00,
-0x05,0xf8,0x00,0x02,0x00,0x0b,0x02,0xa3,0x02,0xb4,0x00,0x00,0x02,0xe0,0x02,0xe0,
-0x00,0x12,0x02,0xe2,0x02,0xe5,0x00,0x13,0x02,0xe7,0x02,0xe7,0x00,0x17,0x02,0xe9,
-0x02,0xe9,0x00,0x18,0x02,0xed,0x02,0xef,0x00,0x19,0x02,0xf2,0x02,0xf3,0x00,0x1c,
-0x02,0xf5,0x02,0xf5,0x00,0x1e,0x0b,0xe9,0x0b,0xe9,0x00,0x1f,0x0b,0xeb,0x0b,0xeb,
-0x00,0x20,0x0b,0xed,0x0b,0xf3,0x00,0x21,0x00,0x02,0x00,0x09,0x02,0xa3,0x02,0xb4,
-0x00,0x00,0x02,0xe0,0x02,0xe0,0x00,0x12,0x02,0xe2,0x02,0xe5,0x00,0x13,0x02,0xe7,
-0x02,0xe7,0x00,0x17,0x02,0xe9,0x02,0xe9,0x00,0x18,0x02,0xed,0x02,0xef,0x00,0x19,
-0x02,0xf2,0x02,0xf3,0x00,0x1c,0x02,0xf5,0x02,0xf5,0x00,0x1e,0x0b,0xe9,0x0b,0xf3,
-0x00,0x1f,0x00,0x2a,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0xb6,
-0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0xce,
-0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0xda,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0xe6,
-0x00,0x00,0x00,0xec,0x00,0x00,0x00,0xf2,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0xfe,
-0x00,0x00,0x01,0x04,0x00,0x00,0x01,0x0a,0x00,0x00,0x01,0x10,0x00,0x00,0x01,0x16,
-0x00,0x00,0x01,0x1c,0x00,0x00,0x01,0x22,0x00,0x00,0x01,0x28,0x00,0x00,0x01,0x2e,
-0x00,0x00,0x01,0x34,0x00,0x00,0x01,0x3a,0x00,0x00,0x01,0x40,0x00,0x00,0x01,0x46,
-0x00,0x00,0x01,0x4c,0x00,0x00,0x01,0x52,0x00,0x00,0x01,0x58,0x00,0x00,0x01,0x5e,
-0x00,0x00,0x01,0x64,0x00,0x00,0x01,0x6a,0x00,0x00,0x01,0x70,0x00,0x00,0x01,0x76,
-0x00,0x00,0x01,0x7c,0x00,0x00,0x01,0x82,0x00,0x00,0x01,0x88,0x00,0x00,0x01,0x8e,
-0x00,0x00,0x01,0x94,0x00,0x00,0x01,0x9a,0x00,0x00,0x01,0xa0,0x00,0x01,0xfe,0x00,
-0x04,0x7b,0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,
-0xfe,0x00,0x04,0xb0,0x00,0x01,0xfe,0x00,0x05,0x02,0x00,0x01,0xfe,0x00,0x05,0x02,
-0x00,0x01,0xfe,0x00,0x05,0x02,0x00,0x01,0xfe,0x00,0x05,0x02,0x00,0x01,0xfe,0x00,
-0x05,0x02,0x00,0x01,0xfe,0x00,0x06,0xc5,0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,
-0xfe,0x00,0x04,0x7b,0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,0xfe,0x00,0x04,0x7b,
-0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,0xfe,0x00,
-0x05,0x02,0x00,0x01,0xfe,0x00,0x05,0x02,0x00,0x01,0xfe,0x00,0x05,0x02,0x00,0x01,
-0xfe,0x00,0x05,0x02,0x00,0x01,0xfe,0x00,0x06,0x68,0x00,0x01,0xfe,0x00,0x06,0x68,
-0x00,0x01,0xfe,0x00,0x04,0xb0,0x00,0x01,0xfe,0x00,0x07,0xd0,0x00,0x01,0xfe,0x00,
-0x06,0x44,0x00,0x01,0xfe,0x00,0x05,0x02,0x00,0x01,0xfe,0x00,0x07,0x04,0x00,0x01,
-0xfe,0x00,0x07,0x04,0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,0xfe,0x00,0x06,0xda,
-0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,0xfe,0x00,0x05,0xf8,0x00,0x01,0xfe,0x00,
-0x04,0x7b,0x00,0x01,0xfe,0x00,0x05,0xf8,0x00,0x01,0xfe,0x00,0x04,0x7b,0x00,0x01,
-0xfe,0x00,0x05,0xf8,0x00,0x01,0xfe,0x00,0x05,0xf8,0x00,0x01,0xfe,0x00,0x05,0xf8,
-0x00,0x01,0xfe,0x00,0x05,0xf8,0x00,0x01,0xfe,0x00,0x05,0xf8,0x00,0x01,0xfe,0x00,
-0x05,0xf8,0x00,0x01,0xfe,0x00,0x05,0xf8,0x00,0x01,0x00,0x6c,0x00,0x56,0x00,0x01,
-0x00,0x82,0x00,0x0c,0x00,0x09,0x00,0x14,0x00,0x1a,0x00,0x20,0x00,0x26,0x00,0x2c,
-0x00,0x32,0x00,0x38,0x00,0x3e,0x00,0x44,0x00,0x01,0x02,0x00,0x07,0x3a,0x00,0x01,
-0x02,0x00,0x06,0xa4,0x00,0x01,0x02,0x00,0x07,0x3a,0x00,0x01,0x02,0x00,0x05,0xdc,
-0x00,0x01,0x02,0x00,0x07,0x3a,0x00,0x01,0x02,0x00,0x07,0x08,0x00,0x01,0x02,0x00,
-0x07,0x3a,0x00,0x01,0x02,0x00,0x05,0xdc,0x00,0x01,0x02,0x00,0x06,0xa4,0x00,0x01,
-0x00,0x09,0x04,0xd7,0x04,0xff,0x05,0x00,0x05,0x02,0x05,0x03,0x05,0x05,0x05,0x06,
-0x05,0x07,0x05,0x08,0x00,0x01,0x00,0x09,0x04,0xd7,0x04,0xff,0x05,0x00,0x05,0x02,
-0x05,0x03,0x05,0x05,0x05,0x06,0x05,0x07,0x05,0x08,0x00,0x09,0x00,0x00,0x00,0x26,
-0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x3e,
-0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x56,
-0x00,0x01,0x02,0x00,0x04,0xb0,0x00,0x01,0x02,0x00,0x04,0xb0,0x00,0x01,0x02,0x00,
-0x04,0xb0,0x00,0x01,0x02,0x00,0x04,0xb0,0x00,0x01,0x02,0x00,0x04,0xb0,0x00,0x01,
-0x02,0x00,0x04,0xb0,0x00,0x01,0x02,0x00,0x04,0xb0,0x00,0x01,0x02,0x00,0x04,0xb0,
-0x00,0x01,0x02,0x00,0x04,0xb0,0x00,0x01,0x00,0x30,0x00,0x26,0x00,0x01,0x00,0x3a,
-0x00,0x0c,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x00,0x01,0x02,0x00,0xfe,0x0c,
-0x00,0x01,0x02,0x00,0xfe,0xd4,0x00,0x01,0x02,0x00,0xfd,0xf3,0x00,0x01,0x00,0x03,
-0x05,0x01,0x05,0x04,0x05,0x09,0x00,0x01,0x00,0x03,0x05,0x01,0x05,0x04,0x05,0x09,
-0x00,0x03,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x1a,0x00,0x01,
-0x02,0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x00,
-0x00,0x01,0x00,0x00,0x00,0x0a,0x00,0xa6,0x01,0x82,0x00,0x06,0x44,0x46,0x4c,0x54,
-0x00,0x26,0x61,0x72,0x61,0x62,0x00,0x34,0x61,0x72,0x6d,0x6e,0x00,0x48,0x63,0x79,
-0x72,0x6c,0x00,0x54,0x67,0x72,0x65,0x6b,0x00,0x64,0x6c,0x61,0x74,0x6e,0x00,0x78,
-0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x02,0x00,0x06,0x00,0x09,0x00,0x04,
-0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x05,0x00,0x05,0x00,0x08,0x00,0x0a,0x00,0x0e,
-0x00,0x0f,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x0b,0x00,0x04,
-0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x03,0x00,0x02,0x00,0x04,0x00,0x0c,0x00,0x04,
-0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x05,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x0c,
-0x00,0x10,0x00,0x0a,0x00,0x01,0x44,0x4e,0x4b,0x20,0x00,0x1c,0x00,0x00,0xff,0xff,
-0x00,0x06,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x07,0x00,0x0c,0x00,0x11,0x00,0x00,
-0xff,0xff,0x00,0x01,0x00,0x0d,0x00,0x12,0x61,0x61,0x6c,0x74,0x00,0x6e,0x61,0x61,
-0x6c,0x74,0x00,0x74,0x63,0x63,0x6d,0x70,0x00,0x7a,0x64,0x6c,0x69,0x67,0x00,0x80,
-0x64,0x6c,0x69,0x67,0x00,0x88,0x66,0x69,0x6e,0x61,0x00,0x8e,0x66,0x72,0x61,0x63,
-0x00,0x94,0x68,0x6c,0x69,0x67,0x00,0x9a,0x69,0x6e,0x69,0x74,0x00,0xa0,0x6c,0x69,
-0x67,0x61,0x00,0xa6,0x6c,0x69,0x67,0x61,0x00,0xac,0x6c,0x69,0x67,0x61,0x00,0xb2,
-0x6c,0x69,0x67,0x61,0x00,0xb8,0x6c,0x6f,0x63,0x6c,0x00,0xbe,0x6d,0x65,0x64,0x69,
-0x00,0xc4,0x72,0x6c,0x69,0x67,0x00,0xca,0x73,0x61,0x6c,0x74,0x00,0xd0,0x73,0x61,
-0x6c,0x74,0x00,0xd6,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x03,
-0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x05,0x00,0x06,0x00,0x00,
-0x00,0x01,0x00,0x06,0x00,0x00,0x00,0x01,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,
-0x00,0x00,0x00,0x01,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x00,0x00,0x01,
-0x00,0x0b,0x00,0x00,0x00,0x01,0x00,0x0c,0x00,0x00,0x00,0x01,0x00,0x0d,0x00,0x00,
-0x00,0x01,0x00,0x0e,0x00,0x00,0x00,0x01,0x00,0x0f,0x00,0x00,0x00,0x01,0x00,0x10,
-0x00,0x00,0x00,0x01,0x00,0x11,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x00,0x00,0x01,
-0x00,0x13,0x00,0x14,0x00,0x2a,0x00,0x32,0x00,0x3a,0x00,0x42,0x00,0x4a,0x00,0x52,
-0x00,0x5a,0x00,0x62,0x00,0x6a,0x00,0x72,0x00,0x7a,0x00,0x82,0x00,0x8a,0x00,0x92,
-0x00,0x9a,0x00,0xa2,0x00,0xaa,0x00,0xb2,0x00,0xba,0x00,0xc2,0x00,0x01,0x00,0x00,
-0x00,0x01,0x0d,0x92,0x00,0x01,0x00,0x00,0x00,0x01,0x0d,0xa4,0x00,0x01,0x00,0x00,
-0x00,0x01,0x0d,0x5c,0x00,0x01,0x00,0x00,0x00,0x01,0x0d,0x0a,0x00,0x06,0x00,0x00,
-0x00,0x01,0x00,0x80,0x00,0x04,0x00,0x00,0x00,0x01,0x0b,0x56,0x00,0x04,0x00,0x00,
-0x00,0x01,0x0b,0x16,0x00,0x01,0x00,0x09,0x00,0x01,0x02,0xc4,0x00,0x04,0x00,0x00,
-0x00,0x01,0x0b,0x78,0x00,0x04,0x00,0x00,0x00,0x01,0x0b,0x1e,0x00,0x01,0x00,0x09,
-0x00,0x01,0x03,0xec,0x00,0x04,0x00,0x00,0x00,0x01,0x09,0xa0,0x00,0x04,0x00,0x01,
-0x00,0x01,0x08,0x9c,0x00,0x04,0x00,0x00,0x00,0x01,0x08,0x48,0x00,0x04,0x00,0x00,
-0x00,0x01,0x04,0x94,0x00,0x01,0x00,0x00,0x00,0x01,0x02,0x78,0x00,0x01,0x00,0x09,
-0x00,0x01,0x03,0x1a,0x00,0x04,0x00,0x01,0x00,0x01,0x04,0x56,0x00,0x01,0x00,0x00,
-0x00,0x01,0x0c,0xb6,0x00,0x01,0x00,0x00,0x00,0x01,0x0c,0x9c,0x00,0x02,0x00,0x14,
-0x00,0x3c,0x00,0x3c,0x00,0x3c,0x00,0x04,0x00,0x00,0x02,0x2c,0x02,0x3e,0x00,0x00,
-0x00,0x02,0x00,0x06,0x00,0x4c,0x00,0x4d,0x00,0x00,0x02,0x1c,0x02,0x1c,0x00,0x02,
-0x02,0x51,0x02,0x51,0x00,0x03,0x02,0xa3,0x02,0xab,0x00,0x04,0x02,0xad,0x02,0xb7,
-0x00,0x0d,0x02,0xe0,0x02,0xe1,0x00,0x18,0x00,0x02,0x00,0x52,0x00,0x24,0x00,0x3d,
-0x00,0x03,0x00,0x49,0x00,0x49,0x00,0x03,0x00,0x4b,0x00,0x4b,0x00,0x03,0x00,0x4c,
-0x00,0x4d,0x00,0x01,0x00,0x4f,0x00,0x4f,0x00,0x03,0x00,0x82,0x00,0x98,0x00,0x03,
-0x00,0x9a,0x00,0xa1,0x00,0x03,0x00,0xc2,0x00,0xc2,0x00,0x03,0x00,0xc4,0x00,0xc4,
-0x00,0x03,0x00,0xc6,0x00,0xc6,0x00,0x03,0x00,0xc8,0x00,0xc8,0x00,0x03,0x00,0xca,
-0x00,0xca,0x00,0x03,0x00,0xcc,0x00,0xcc,0x00,0x03,0x00,0xce,0x00,0xce,0x00,0x03,
-0x00,0xd0,0x00,0xd0,0x00,0x03,0x00,0xd2,0x00,0xd2,0x00,0x03,0x00,0xd4,0x00,0xd4,
-0x00,0x03,0x00,0xd6,0x00,0xd6,0x00,0x03,0x00,0xd8,0x00,0xd8,0x00,0x03,0x00,0xda,
-0x00,0xda,0x00,0x03,0x00,0xdc,0x00,0xdc,0x00,0x03,0x00,0xde,0x00,0xde,0x00,0x03,
-0x00,0xe0,0x00,0xe0,0x00,0x03,0x00,0xe2,0x00,0xe2,0x00,0x03,0x00,0xe4,0x00,0xe4,
-0x00,0x03,0x00,0xe6,0x00,0xea,0x00,0x03,0x00,0xec,0x00,0xec,0x00,0x03,0x00,0xee,
-0x00,0xee,0x00,0x03,0x00,0xf0,0x00,0xf0,0x00,0x03,0x00,0xf2,0x00,0xf2,0x00,0x03,
-0x00,0xf4,0x00,0xf4,0x00,0x03,0x00,0xf6,0x00,0xf6,0x00,0x03,0x00,0xf8,0x00,0xf8,
-0x00,0x03,0x00,0xfb,0x01,0x05,0x00,0x03,0x01,0x07,0x01,0x07,0x00,0x03,0x01,0x09,
-0x01,0x09,0x00,0x03,0x01,0x0c,0x01,0x0c,0x00,0x03,0x01,0x0e,0x01,0x0e,0x00,0x03,
-0x01,0x10,0x01,0x10,0x00,0x03,0x01,0x12,0x01,0x12,0x00,0x03,0x01,0x14,0x01,0x14,
-0x00,0x03,0x01,0x16,0x01,0x16,0x00,0x03,0x01,0x18,0x01,0x18,0x00,0x03,0x01,0x1a,
-0x01,0x1a,0x00,0x03,0x01,0x1c,0x01,0x1c,0x00,0x03,0x01,0x1e,0x01,0x1e,0x00,0x03,
-0x01,0x20,0x01,0x20,0x00,0x03,0x01,0x22,0x01,0x22,0x00,0x03,0x01,0x24,0x01,0x24,
-0x00,0x03,0x01,0x26,0x01,0x26,0x00,0x03,0x01,0x28,0x01,0x28,0x00,0x03,0x01,0x2a,
-0x01,0x2a,0x00,0x03,0x01,0x2c,0x01,0x2c,0x00,0x03,0x01,0x2e,0x01,0x2e,0x00,0x03,
-0x01,0x30,0x01,0x30,0x00,0x03,0x01,0x32,0x01,0x32,0x00,0x03,0x01,0x34,0x01,0x34,
-0x00,0x03,0x01,0x36,0x01,0x36,0x00,0x03,0x01,0x38,0x01,0x38,0x00,0x03,0x01,0x3a,
-0x01,0x3b,0x00,0x03,0x01,0x3d,0x01,0x3d,0x00,0x03,0x01,0x3f,0x01,0x3f,0x00,0x03,
-0x01,0x41,0x01,0x41,0x00,0x03,0x01,0x48,0x01,0x48,0x00,0x03,0x01,0x52,0x01,0x52,
-0x00,0x03,0x01,0x54,0x01,0x54,0x00,0x03,0x01,0x56,0x01,0x56,0x00,0x03,0x01,0x8f,
-0x01,0x8f,0x00,0x03,0x01,0x91,0x01,0x93,0x00,0x03,0x01,0x95,0x01,0x95,0x00,0x03,
-0x01,0xa4,0x01,0xa4,0x00,0x03,0x01,0xac,0x01,0xac,0x00,0x03,0x01,0xae,0x01,0xae,
-0x00,0x03,0x01,0xda,0x01,0xda,0x00,0x03,0x01,0xdc,0x01,0xdc,0x00,0x03,0x01,0xf0,
-0x01,0xf0,0x00,0x03,0x01,0xf4,0x01,0xf4,0x00,0x03,0x02,0x1c,0x02,0x1c,0x00,0x01,
-0x02,0x51,0x02,0x51,0x00,0x01,0x02,0xa3,0x02,0xab,0x00,0x02,0x02,0xad,0x02,0xb7,
-0x00,0x02,0x02,0xe0,0x02,0xe1,0x00,0x02,0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x01,
-0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x01,
-0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x06,
-0x0b,0x0d,0x00,0x01,0x00,0x01,0x01,0x0c,0x00,0x02,0x00,0x82,0x00,0x3e,0x0b,0x6b,
-0x0b,0x6d,0x0b,0x6f,0x0b,0x71,0x0b,0x73,0x0b,0x77,0x0b,0x79,0x0b,0x7d,0x0b,0x7f,
-0x0b,0x83,0x0b,0x87,0x0b,0x8b,0x0b,0x8f,0x0b,0x93,0x0b,0x95,0x0b,0x97,0x0b,0x99,
-0x0b,0x9b,0x0b,0x9f,0x0b,0xa3,0x0b,0xa7,0x0b,0xab,0x0b,0xaf,0x0b,0xb3,0x0b,0xb7,
-0x0b,0xbb,0x0b,0xbf,0x0b,0xc3,0x0b,0xc7,0x0b,0xcb,0x0b,0xcf,0x0b,0xd3,0x0b,0xd7,
-0x0b,0xd9,0x0b,0xdb,0x0b,0xfa,0x0c,0x00,0x0b,0x2b,0x0b,0x23,0x0b,0x17,0x0c,0x06,
-0x0c,0x09,0x0b,0x1b,0x0b,0x27,0x0b,0x1f,0x0c,0x0c,0x0c,0x0f,0x0b,0x3b,0x0b,0x37,
-0x0c,0x12,0x0b,0x3f,0x0b,0x43,0x0b,0x49,0x0b,0x47,0x0b,0xfd,0x0b,0x2f,0x0b,0x33,
-0x0b,0x4b,0x0b,0x4f,0x0b,0x53,0x0c,0x15,0x0b,0x57,0x00,0x02,0x00,0x04,0x04,0xdb,
-0x04,0xf3,0x00,0x00,0x04,0xf5,0x04,0xfe,0x00,0x19,0x05,0x18,0x05,0x19,0x00,0x23,
-0x05,0x1b,0x05,0x33,0x00,0x25,0x00,0x02,0x00,0x68,0x00,0x31,0x0b,0x75,0x0b,0x7b,
-0x0b,0x81,0x0b,0x85,0x0b,0x89,0x0b,0x8d,0x0b,0x91,0x0b,0x9d,0x0b,0xa1,0x0b,0xa5,
-0x0b,0xa9,0x0b,0xad,0x0b,0xb1,0x0b,0xb5,0x0b,0xb9,0x0b,0xbd,0x0b,0xc1,0x0b,0xc5,
-0x0b,0xc9,0x0b,0xcd,0x0b,0xd1,0x0b,0xd5,0x0b,0x55,0x0b,0xdd,0x0b,0xfc,0x0c,0x02,
-0x0b,0x2d,0x0b,0x25,0x0b,0x19,0x0c,0x08,0x0c,0x0b,0x0b,0x1d,0x0b,0x29,0x0b,0x21,
-0x0c,0x0e,0x0c,0x11,0x0b,0x3d,0x0b,0x39,0x0c,0x14,0x0b,0x41,0x0b,0x45,0x0b,0xff,
-0x0b,0x31,0x0b,0x35,0x0b,0x4d,0x0b,0x51,0x0c,0x04,0x0c,0x17,0x0b,0x59,0x00,0x02,
-0x00,0x09,0x04,0xdf,0x04,0xdf,0x00,0x00,0x04,0xe1,0x04,0xe1,0x00,0x01,0x04,0xe3,
-0x04,0xe7,0x00,0x02,0x04,0xec,0x04,0xf3,0x00,0x07,0x04,0xf5,0x04,0xfb,0x00,0x0f,
-0x04,0xfd,0x04,0xfe,0x00,0x16,0x05,0x18,0x05,0x19,0x00,0x18,0x05,0x1b,0x05,0x29,
-0x00,0x1a,0x05,0x2c,0x05,0x33,0x00,0x29,0x00,0x02,0x00,0x68,0x00,0x31,0x0b,0x74,
-0x0b,0x7a,0x0b,0x80,0x0b,0x84,0x0b,0x88,0x0b,0x8c,0x0b,0x90,0x0b,0x9c,0x0b,0xa0,
-0x0b,0xa4,0x0b,0xa8,0x0b,0xac,0x0b,0xb0,0x0b,0xb4,0x0b,0xb8,0x0b,0xbc,0x0b,0xc0,
-0x0b,0xc4,0x0b,0xc8,0x0b,0xcc,0x0b,0xd0,0x0b,0xd4,0x0b,0x54,0x0b,0xdc,0x0b,0xfb,
-0x0c,0x01,0x0b,0x2c,0x0b,0x24,0x0b,0x18,0x0c,0x07,0x0c,0x0a,0x0b,0x1c,0x0b,0x28,
-0x0b,0x20,0x0c,0x0d,0x0c,0x10,0x0b,0x3c,0x0b,0x38,0x0c,0x13,0x0b,0x40,0x0b,0x44,
-0x0b,0xfe,0x0b,0x30,0x0b,0x34,0x0b,0x4c,0x0b,0x50,0x0c,0x03,0x0c,0x16,0x0b,0x58,
-0x00,0x02,0x00,0x09,0x04,0xdf,0x04,0xdf,0x00,0x00,0x04,0xe1,0x04,0xe1,0x00,0x01,
-0x04,0xe3,0x04,0xe7,0x00,0x02,0x04,0xec,0x04,0xf3,0x00,0x07,0x04,0xf5,0x04,0xfb,
-0x00,0x0f,0x04,0xfd,0x04,0xfe,0x00,0x16,0x05,0x18,0x05,0x19,0x00,0x18,0x05,0x1b,
-0x05,0x29,0x00,0x1a,0x05,0x2c,0x05,0x33,0x00,0x29,0x00,0x01,0x00,0x1e,0x00,0x02,
-0x00,0x0a,0x00,0x14,0x00,0x01,0x00,0x04,0x0b,0xe4,0x00,0x02,0x0b,0x77,0x00,0x01,
-0x00,0x04,0x0b,0xe5,0x00,0x02,0x0b,0x77,0x00,0x01,0x00,0x02,0x0b,0xc8,0x0b,0xc9,
-0x00,0x01,0x03,0x6a,0x00,0x1f,0x00,0x44,0x00,0x7e,0x00,0x98,0x00,0xa2,0x00,0xcc,
-0x00,0xd6,0x01,0x08,0x01,0x22,0x01,0x34,0x01,0x66,0x01,0x78,0x01,0x8a,0x01,0x94,
-0x01,0xc6,0x01,0xd8,0x01,0xe2,0x02,0x24,0x02,0x3e,0x02,0x48,0x02,0x52,0x02,0x5c,
-0x02,0x86,0x02,0xa0,0x02,0xb2,0x02,0xe4,0x02,0xf6,0x03,0x08,0x03,0x12,0x03,0x44,
-0x03,0x56,0x03,0x60,0x00,0x07,0x00,0x10,0x00,0x16,0x00,0x1c,0x00,0x22,0x00,0x28,
-0x00,0x2e,0x00,0x34,0x01,0x8f,0x00,0x02,0x02,0xaf,0x00,0x87,0x00,0x02,0x02,0xad,
-0x00,0x86,0x00,0x02,0x02,0xab,0x00,0x85,0x00,0x02,0x02,0xa6,0x00,0x84,0x00,0x02,
-0x02,0xa5,0x00,0x83,0x00,0x02,0x02,0xa4,0x00,0x82,0x00,0x02,0x02,0xa3,0x00,0x03,
-0x00,0x08,0x00,0x0e,0x00,0x14,0x00,0xce,0x00,0x02,0x02,0xaf,0x00,0xc8,0x00,0x02,
-0x02,0xa4,0x00,0x89,0x00,0x02,0x02,0xca,0x00,0x01,0x00,0x04,0x00,0xd0,0x00,0x02,
-0x02,0xaf,0x00,0x05,0x00,0x0c,0x00,0x12,0x00,0x18,0x00,0x1e,0x00,0x24,0x00,0xdc,
-0x00,0x02,0x02,0xaf,0x00,0x8d,0x00,0x02,0x02,0xab,0x00,0x8c,0x00,0x02,0x02,0xa5,
-0x00,0x8b,0x00,0x02,0x02,0xa4,0x00,0x8a,0x00,0x02,0x02,0xa3,0x00,0x01,0x00,0x04,
-0x00,0xe0,0x00,0x02,0x02,0xa9,0x00,0x06,0x00,0x0e,0x00,0x14,0x00,0x1a,0x00,0x20,
-0x00,0x26,0x00,0x2c,0x01,0x91,0x00,0x02,0x02,0xaf,0x00,0xf2,0x00,0x02,0x02,0xaa,
-0x00,0x91,0x00,0x02,0x02,0xab,0x00,0x90,0x00,0x02,0x02,0xa5,0x00,0x8f,0x00,0x02,
-0x02,0xa4,0x00,0x8e,0x00,0x02,0x02,0xa3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,
-0x01,0x01,0x00,0x02,0x00,0x79,0x00,0xff,0x00,0x02,0x02,0xaf,0x00,0xfb,0x00,0x02,
-0x02,0xa4,0x00,0x02,0x00,0x06,0x00,0x0c,0x01,0x09,0x00,0x02,0x02,0xaf,0x00,0x93,
-0x00,0x02,0x02,0xa6,0x00,0x06,0x00,0x0e,0x00,0x14,0x00,0x1a,0x00,0x20,0x00,0x26,
-0x00,0x2c,0x01,0x93,0x00,0x02,0x02,0xaf,0x00,0x98,0x00,0x02,0x02,0xab,0x00,0x97,
-0x00,0x02,0x02,0xa6,0x00,0x96,0x00,0x02,0x02,0xa5,0x00,0x95,0x00,0x02,0x02,0xa4,
-0x00,0x94,0x00,0x02,0x02,0xa3,0x00,0x02,0x00,0x06,0x00,0x0c,0x01,0x1a,0x00,0x02,
-0x02,0xaf,0x01,0x16,0x00,0x02,0x02,0xa4,0x00,0x02,0x00,0x06,0x00,0x0c,0x01,0x22,
-0x00,0x02,0x02,0xaf,0x01,0x20,0x00,0x02,0x02,0xca,0x00,0x01,0x00,0x04,0x01,0x26,
-0x00,0x02,0x02,0xaf,0x00,0x06,0x00,0x0e,0x00,0x14,0x00,0x1a,0x00,0x20,0x00,0x26,
-0x00,0x2c,0x01,0x95,0x00,0x02,0x02,0xaf,0x01,0x30,0x00,0x02,0x02,0xad,0x00,0x9e,
-0x00,0x02,0x02,0xab,0x00,0x9d,0x00,0x02,0x02,0xa5,0x00,0x9c,0x00,0x02,0x02,0xa4,
-0x00,0x9b,0x00,0x02,0x02,0xa3,0x00,0x02,0x00,0x06,0x00,0x0c,0x01,0x3a,0x00,0x02,
-0x02,0xab,0x00,0x9f,0x00,0x02,0x02,0xa4,0x00,0x01,0x00,0x04,0x01,0x3f,0x00,0x02,
-0x02,0xaf,0x00,0x08,0x00,0x12,0x00,0x18,0x00,0x1e,0x00,0x24,0x00,0x2a,0x00,0x30,
-0x00,0x36,0x00,0x3c,0x06,0x21,0x00,0x02,0x02,0x72,0x01,0x90,0x00,0x02,0x02,0xaf,
-0x00,0xa7,0x00,0x02,0x02,0xad,0x00,0xa6,0x00,0x02,0x02,0xab,0x00,0xa5,0x00,0x02,
-0x02,0xa6,0x00,0xa4,0x00,0x02,0x02,0xa5,0x00,0xa3,0x00,0x02,0x02,0xa4,0x00,0xa2,
-0x00,0x02,0x02,0xa3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x00,0xcf,0x00,0x02,
-0x02,0xaf,0x00,0xc9,0x00,0x02,0x02,0xa4,0x00,0xa9,0x00,0x02,0x02,0xca,0x00,0x01,
-0x00,0x04,0x00,0xd1,0x00,0x02,0x02,0xaf,0x00,0x01,0x00,0x04,0x00,0xdd,0x00,0x02,
-0x02,0xaf,0x00,0x01,0x00,0x04,0x00,0xe1,0x00,0x02,0x02,0xa9,0x00,0x05,0x00,0x0c,
-0x00,0x12,0x00,0x18,0x00,0x1e,0x00,0x24,0x01,0x92,0x00,0x02,0x02,0xaf,0x00,0xb1,
-0x00,0x02,0x02,0xab,0x00,0xb0,0x00,0x02,0x02,0xa5,0x00,0xaf,0x00,0x02,0x02,0xa4,
-0x00,0xae,0x00,0x02,0x02,0xa3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x01,0x02,
-0x00,0x02,0x00,0x79,0x01,0x00,0x00,0x02,0x02,0xaf,0x00,0xfc,0x00,0x02,0x02,0xa4,
-0x00,0x02,0x00,0x06,0x00,0x0c,0x01,0x0a,0x00,0x02,0x02,0xaf,0x00,0xb3,0x00,0x02,
-0x02,0xa6,0x00,0x06,0x00,0x0e,0x00,0x14,0x00,0x1a,0x00,0x20,0x00,0x26,0x00,0x2c,
-0x01,0x94,0x00,0x02,0x02,0xaf,0x00,0xb8,0x00,0x02,0x02,0xab,0x00,0xb7,0x00,0x02,
-0x02,0xa6,0x00,0xb6,0x00,0x02,0x02,0xa5,0x00,0xb5,0x00,0x02,0x02,0xa4,0x00,0xb4,
-0x00,0x02,0x02,0xa3,0x00,0x02,0x00,0x06,0x00,0x0c,0x01,0x1b,0x00,0x02,0x02,0xaf,
-0x01,0x17,0x00,0x02,0x02,0xa4,0x00,0x02,0x00,0x06,0x00,0x0c,0x01,0x23,0x00,0x02,
-0x02,0xaf,0x01,0x21,0x00,0x02,0x02,0xca,0x00,0x01,0x00,0x04,0x01,0x27,0x00,0x02,
-0x02,0xaf,0x00,0x06,0x00,0x0e,0x00,0x14,0x00,0x1a,0x00,0x20,0x00,0x26,0x00,0x2c,
-0x01,0x96,0x00,0x02,0x02,0xaf,0x01,0x31,0x00,0x02,0x02,0xad,0x00,0xbe,0x00,0x02,
-0x02,0xab,0x00,0xbd,0x00,0x02,0x02,0xa5,0x00,0xbc,0x00,0x02,0x02,0xa4,0x00,0xbb,
-0x00,0x02,0x02,0xa3,0x00,0x02,0x00,0x06,0x00,0x0c,0x00,0xc1,0x00,0x02,0x02,0xab,
-0x00,0xbf,0x00,0x02,0x02,0xa4,0x00,0x01,0x00,0x04,0x01,0x40,0x00,0x02,0x02,0xaf,
-0x00,0x01,0x00,0x04,0x01,0x0b,0x00,0x02,0x00,0x51,0x00,0x01,0x00,0x1f,0x00,0x24,
-0x00,0x26,0x00,0x27,0x00,0x28,0x00,0x2a,0x00,0x2c,0x00,0x2f,0x00,0x31,0x00,0x32,
-0x00,0x35,0x00,0x36,0x00,0x37,0x00,0x38,0x00,0x3c,0x00,0x3d,0x00,0x44,0x00,0x46,
-0x00,0x47,0x00,0x48,0x00,0x4a,0x00,0x4c,0x00,0x4f,0x00,0x51,0x00,0x52,0x00,0x55,
-0x00,0x56,0x00,0x57,0x00,0x58,0x00,0x5c,0x00,0x5d,0x02,0x70,0x00,0x01,0x00,0x42,
-0x00,0x03,0x00,0x0c,0x00,0x16,0x00,0x38,0x00,0x01,0x00,0x04,0x04,0xd3,0x00,0x02,
-0x04,0xce,0x00,0x04,0x00,0x0a,0x00,0x10,0x00,0x16,0x00,0x1c,0x0b,0x15,0x00,0x02,
-0x04,0xb9,0x0b,0x13,0x00,0x02,0x04,0xb7,0x0b,0x12,0x00,0x02,0x04,0xb1,0x0b,0x11,
-0x00,0x02,0x04,0xc2,0x00,0x01,0x00,0x04,0x0b,0x14,0x00,0x02,0x04,0xc2,0x00,0x01,
-0x00,0x03,0x04,0xb1,0x04,0xc0,0x04,0xca,0x00,0x01,0x00,0xea,0x00,0x07,0x00,0x14,
-0x00,0x56,0x00,0x70,0x00,0xa2,0x00,0xac,0x00,0xb6,0x00,0xd0,0x00,0x08,0x00,0x12,
-0x00,0x18,0x00,0x1e,0x00,0x24,0x00,0x2a,0x00,0x30,0x00,0x36,0x00,0x3c,0x0b,0x67,
-0x00,0x02,0x05,0x06,0x0b,0x65,0x00,0x02,0x05,0x05,0x0b,0x63,0x00,0x02,0x05,0x04,
-0x0b,0x61,0x00,0x02,0x05,0x03,0x0b,0x5f,0x00,0x02,0x05,0x02,0x0b,0x5e,0x00,0x02,
-0x05,0x01,0x0b,0x5c,0x00,0x02,0x05,0x00,0x0b,0x5a,0x00,0x02,0x04,0xff,0x00,0x03,
-0x00,0x08,0x00,0x0e,0x00,0x14,0x04,0xde,0x00,0x02,0x05,0x09,0x04,0xdc,0x00,0x02,
-0x05,0x08,0x04,0xdb,0x00,0x02,0x05,0x07,0x00,0x06,0x00,0x0e,0x00,0x14,0x00,0x1a,
-0x00,0x20,0x00,0x26,0x00,0x2c,0x0b,0x68,0x00,0x02,0x05,0x06,0x0b,0x66,0x00,0x02,
-0x05,0x05,0x0b,0x64,0x00,0x02,0x05,0x04,0x0b,0x62,0x00,0x02,0x05,0x03,0x0b,0x60,
-0x00,0x02,0x05,0x02,0x0b,0x5b,0x00,0x02,0x04,0xff,0x00,0x01,0x00,0x04,0x04,0xdd,
-0x00,0x02,0x05,0x08,0x00,0x01,0x00,0x04,0x04,0xdf,0x00,0x02,0x05,0x08,0x00,0x03,
-0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xe2,0x00,0x02,0x0b,0x71,0x0b,0xe0,0x00,0x02,
-0x0b,0x6d,0x0b,0xde,0x00,0x02,0x0b,0x6b,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,
-0x0b,0xe3,0x00,0x02,0x0b,0x71,0x0b,0xe1,0x00,0x02,0x0b,0x6d,0x0b,0xdf,0x00,0x02,
-0x0b,0x6b,0x00,0x01,0x00,0x07,0x00,0x03,0x04,0xe0,0x04,0xf4,0x04,0xfc,0x04,0xfe,
-0x0b,0xc8,0x0b,0xc9,0x00,0x01,0x01,0x2e,0x00,0x0e,0x00,0x22,0x00,0x74,0x00,0x86,
-0x00,0x92,0x00,0x9c,0x00,0xae,0x00,0xba,0x00,0xc4,0x00,0xce,0x00,0xda,0x00,0xe6,
-0x00,0xfc,0x01,0x06,0x01,0x1a,0x00,0x0a,0x00,0x16,0x00,0x1c,0x00,0x22,0x00,0x28,
-0x00,0x2e,0x00,0x34,0x00,0x3a,0x00,0x40,0x00,0x46,0x00,0x4c,0x02,0x91,0x00,0x02,
-0x02,0xae,0x02,0x90,0x00,0x02,0x02,0xa6,0x02,0x8f,0x00,0x02,0x02,0xcb,0x02,0x8e,
-0x00,0x02,0x02,0xad,0x02,0x8d,0x00,0x02,0x02,0xaa,0x02,0x8c,0x00,0x02,0x02,0xa9,
-0x00,0x7a,0x00,0x02,0x02,0xca,0x00,0x76,0x00,0x02,0x02,0xa4,0x00,0x71,0x00,0x02,
-0x02,0xa7,0x00,0x6a,0x00,0x02,0x02,0xab,0x00,0x02,0x00,0x06,0x00,0x0c,0x07,0xa2,
-0x00,0x02,0x00,0x22,0x07,0x95,0x00,0x02,0x00,0x04,0x00,0x01,0x00,0x04,0x07,0x87,
-0x00,0x03,0x00,0x11,0x00,0x11,0x00,0x01,0x00,0x04,0x08,0xc8,0x00,0x02,0x02,0xdb,
-0x00,0x02,0x00,0x06,0x00,0x0c,0x07,0xa1,0x00,0x02,0x00,0x04,0x07,0xa0,0x00,0x02,
-0x00,0x22,0x00,0x01,0x00,0x04,0x08,0x03,0x00,0x03,0x00,0x24,0x00,0x3b,0x00,0x01,
-0x00,0x04,0x07,0xdd,0x00,0x02,0x00,0x56,0x00,0x01,0x00,0x04,0x07,0xf8,0x00,0x02,
-0x00,0x30,0x00,0x01,0x00,0x04,0x07,0xf9,0x00,0x03,0x00,0x28,0x00,0x2f,0x00,0x01,
-0x00,0x04,0x07,0xe8,0x00,0x03,0x00,0x12,0x00,0x46,0x00,0x02,0x00,0x06,0x00,0x0e,
-0x07,0xec,0x00,0x03,0x00,0x12,0x00,0x58,0x07,0xeb,0x00,0x03,0x00,0x12,0x00,0x52,
-0x00,0x01,0x00,0x04,0x07,0xed,0x00,0x02,0x00,0x29,0x00,0x02,0x00,0x06,0x00,0x0e,
-0x07,0x8d,0x00,0x03,0x07,0x8b,0x07,0x8b,0x07,0x8c,0x00,0x02,0x07,0x8b,0x00,0x02,
-0x00,0x06,0x00,0x0e,0x07,0x90,0x00,0x03,0x07,0x8e,0x07,0x8e,0x07,0x8f,0x00,0x02,
-0x07,0x8e,0x00,0x01,0x00,0x0e,0x00,0x03,0x00,0x04,0x00,0x11,0x00,0x20,0x00,0x22,
-0x00,0x29,0x00,0x35,0x00,0x36,0x00,0x37,0x00,0x44,0x00,0x46,0x00,0x72,0x07,0x8b,
-0x07,0x8e,0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x08,0x00,0x02,0x00,0x06,0x00,0x0c,
-0x0b,0x0c,0x00,0x02,0x00,0x4f,0x0b,0x0b,0x00,0x02,0x00,0x4c,0x00,0x01,0x00,0x01,
-0x00,0x49,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x0b,0x0f,
-0x00,0x02,0x00,0x57,0x00,0x01,0x00,0x01,0x01,0x41,0x00,0x01,0x00,0x32,0x00,0x02,
-0x00,0x0a,0x00,0x28,0x00,0x03,0x00,0x08,0x00,0x10,0x00,0x18,0x0b,0x0e,0x00,0x03,
-0x00,0x49,0x00,0x4f,0x0b,0x0d,0x00,0x03,0x00,0x49,0x00,0x4c,0x0b,0x0a,0x00,0x02,
-0x00,0x49,0x00,0x01,0x00,0x04,0x0b,0x10,0x00,0x02,0x00,0x57,0x00,0x01,0x00,0x02,
-0x00,0x49,0x00,0x56,0x00,0x01,0x01,0x5a,0x00,0x06,0x00,0x12,0x00,0x9c,0x00,0xc6,
-0x01,0x04,0x01,0x1a,0x01,0x44,0x00,0x0e,0x00,0x1e,0x00,0x26,0x00,0x2e,0x00,0x36,
-0x00,0x3e,0x00,0x46,0x00,0x4e,0x00,0x56,0x00,0x5e,0x00,0x66,0x00,0x6e,0x00,0x76,
-0x00,0x7e,0x00,0x84,0x08,0x0d,0x00,0x03,0x07,0x9d,0x00,0x1b,0x08,0x0d,0x00,0x03,
-0x00,0x12,0x00,0x1b,0x08,0x0b,0x00,0x03,0x07,0x9d,0x00,0x19,0x08,0x0b,0x00,0x03,
-0x00,0x12,0x00,0x19,0x08,0x07,0x00,0x03,0x07,0x9d,0x00,0x18,0x08,0x07,0x00,0x03,
-0x00,0x12,0x00,0x18,0x08,0x05,0x00,0x03,0x07,0x9d,0x00,0x16,0x08,0x05,0x00,0x03,
-0x00,0x12,0x00,0x16,0x00,0x7f,0x00,0x03,0x07,0x9d,0x00,0x15,0x00,0x7f,0x00,0x03,
-0x00,0x12,0x00,0x15,0x00,0x7e,0x00,0x03,0x07,0x9d,0x00,0x17,0x00,0x7e,0x00,0x03,
-0x00,0x12,0x00,0x17,0x08,0x11,0x00,0x02,0x07,0x9d,0x08,0x11,0x00,0x02,0x00,0x12,
-0x00,0x04,0x00,0x0a,0x00,0x12,0x00,0x1a,0x00,0x22,0x08,0x08,0x00,0x03,0x07,0x9d,
-0x00,0x18,0x08,0x08,0x00,0x03,0x00,0x12,0x00,0x18,0x08,0x06,0x00,0x03,0x07,0x9d,
-0x00,0x16,0x08,0x06,0x00,0x03,0x00,0x12,0x00,0x16,0x00,0x06,0x00,0x0e,0x00,0x16,
-0x00,0x1e,0x00,0x26,0x00,0x2e,0x00,0x36,0x08,0x0e,0x00,0x03,0x07,0x9d,0x00,0x1b,
-0x08,0x0e,0x00,0x03,0x00,0x12,0x00,0x1b,0x08,0x09,0x00,0x03,0x07,0x9d,0x00,0x18,
-0x08,0x09,0x00,0x03,0x00,0x12,0x00,0x18,0x00,0x80,0x00,0x03,0x07,0x9d,0x00,0x17,
-0x00,0x80,0x00,0x03,0x00,0x12,0x00,0x17,0x00,0x02,0x00,0x06,0x00,0x0e,0x08,0x0a,
-0x00,0x03,0x07,0x9d,0x00,0x18,0x08,0x0a,0x00,0x03,0x00,0x12,0x00,0x18,0x00,0x04,
-0x00,0x0a,0x00,0x12,0x00,0x1a,0x00,0x22,0x08,0x0f,0x00,0x03,0x07,0x9d,0x00,0x1b,
-0x08,0x0f,0x00,0x03,0x00,0x12,0x00,0x1b,0x08,0x0c,0x00,0x03,0x07,0x9d,0x00,0x19,
-0x08,0x0c,0x00,0x03,0x00,0x12,0x00,0x19,0x00,0x02,0x00,0x06,0x00,0x0e,0x08,0x10,
-0x00,0x03,0x07,0x9d,0x00,0x1b,0x08,0x10,0x00,0x03,0x00,0x12,0x00,0x1b,0x00,0x01,
-0x00,0x06,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x1a,0x00,0x02,
-0x00,0x0a,0x00,0x02,0x02,0x05,0x0c,0x19,0x00,0x01,0x00,0x02,0x00,0x44,0x01,0x0c,
-0x00,0x02,0x00,0x0a,0x00,0x02,0x02,0x05,0x0c,0x19,0x00,0x01,0x00,0x02,0x00,0x44,
-0x01,0x0c,0x00,0x02,0x00,0x14,0x00,0x07,0x03,0x4b,0x03,0x4a,0x03,0x4c,0x03,0x48,
-0x03,0x49,0x03,0x4e,0x03,0x4d,0x00,0x01,0x00,0x07,0x03,0x08,0x03,0x1e,0x03,0x24,
-0x03,0x2b,0x03,0x31,0x03,0x39,0x03,0x3f,0x00,0x02,0x00,0x14,0x00,0x07,0x03,0x4b,
-0x03,0x4a,0x03,0x4c,0x03,0x48,0x03,0x49,0x03,0x4e,0x03,0x4d,0x00,0x01,0x00,0x07,
-0x03,0x08,0x03,0x1e,0x03,0x24,0x03,0x2b,0x03,0x31,0x03,0x39,0x03,0x3f,0x00,0x02,
-0x00,0x0e,0x00,0x04,0x00,0xf3,0x01,0xf9,0x0c,0x1a,0x0c,0x1b,0x00,0x01,0x00,0x04,
-0x00,0x4c,0x00,0x4d,0x02,0x1c,0x02,0x51,0x00,0x02,0x00,0x1c,0x00,0x0b,0x0b,0xec,
-0x0b,0xea,0x0b,0xed,0x0b,0xeb,0x0b,0xf0,0x0b,0xf1,0x0b,0xe9,0x0b,0xf2,0x0b,0xee,
-0x0b,0xf3,0x0b,0xef,0x00,0x01,0x00,0x0b,0x02,0xa3,0x02,0xa4,0x02,0xa5,0x02,0xa6,
-0x02,0xa9,0x02,0xaa,0x02,0xab,0x02,0xae,0x02,0xaf,0x02,0xb2,0x02,0xb4,0x00,0x00,
-0x00,0x01,0x04,0x0e,0x01,0x90,0x00,0x05,0x00,0x00,0x05,0x33,0x05,0x99,0x00,0x00,
-0x03,0xd7,0x05,0x33,0x05,0x99,0x00,0x00,0x00,0x00,0x00,0x66,0x02,0x12,0x00,0x00,
-0x02,0x0b,0x06,0x03,0x03,0x08,0x04,0x02,0x02,0x04,0xe0,0x00,0x26,0xff,0xd0,0x00,
-0xf5,0xfb,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x00,0x50,0x66,0x45,0x64,0x00,0x40,
-0x00,0x0d,0xff,0xfd,0x06,0x14,0xfe,0x14,0x01,0x9a,0x07,0x6d,0x01,0xe3,0x60,0x00,
-0x01,0xdf,0xbf,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,
-0x00,0x00,0x00,0x1c,0x00,0x01,0x00,0x00,0x00,0x00,0x05,0x0c,0x00,0x03,0x00,0x01,
-0x00,0x00,0x00,0x1c,0x00,0x04,0x04,0xf0,0x00,0x00,0x01,0x38,0x01,0x00,0x00,0x07,
-0x00,0x38,0x00,0x00,0x00,0x7e,0x02,0x41,0x02,0xe9,0x02,0xee,0x02,0xf3,0x02,0xf7,
-0x03,0x4e,0x03,0x53,0x03,0x58,0x03,0x5d,0x03,0x62,0x03,0x75,0x03,0x7a,0x03,0x7e,
-0x03,0x8a,0x03,0x8c,0x03,0xa1,0x03,0xce,0x04,0x86,0x04,0xce,0x04,0xf9,0x05,0x0f,
-0x05,0x56,0x05,0x5f,0x05,0x87,0x05,0x8a,0x06,0x0c,0x06,0x15,0x06,0x1b,0x06,0x1f,
-0x06,0x3a,0x06,0x55,0x06,0x6f,0x06,0x74,0x06,0x87,0x06,0x91,0x06,0x98,0x06,0xa1,
-0x06,0xa4,0x06,0xa6,0x06,0xa9,0x06,0xaf,0x06,0xba,0x06,0xbf,0x06,0xcc,0x06,0xf9,
-0x1d,0x02,0x1d,0x09,0x1d,0x14,0x1d,0x17,0x1d,0x1f,0x1d,0x5b,0x1d,0x77,0x1d,0x7b,
-0x1d,0x85,0x1d,0xb7,0x1d,0xbf,0x1e,0x9b,0x1e,0xf9,0x1f,0x15,0x1f,0x1d,0x1f,0x45,
-0x1f,0x4d,0x1f,0x57,0x1f,0x59,0x1f,0x5b,0x1f,0x5d,0x1f,0x7d,0x1f,0xb4,0x1f,0xc4,
-0x1f,0xd3,0x1f,0xdb,0x1f,0xef,0x1f,0xf4,0x1f,0xfe,0x20,0x0a,0x20,0x27,0x20,0x5e,
-0x20,0x71,0x20,0x8e,0x20,0xaf,0x20,0xb1,0x20,0xb5,0x21,0x00,0x21,0x06,0x21,0x09,
-0x21,0x0f,0x21,0x11,0x21,0x13,0x21,0x18,0x21,0x1e,0x21,0x22,0x21,0x27,0x21,0x2b,
-0x21,0x2e,0x21,0x32,0x21,0x35,0x21,0x3b,0x21,0x4b,0x21,0x83,0x21,0xa8,0x21,0xcc,
-0x21,0xd4,0x22,0x2d,0x22,0x3d,0x22,0x6b,0x22,0x8b,0x22,0x98,0x22,0xa5,0x22,0xc6,
-0x23,0x02,0x23,0x06,0x23,0x0b,0x23,0x11,0x23,0x19,0x23,0x21,0x23,0x25,0x23,0x2a,
-0x23,0x7d,0x23,0xae,0x23,0xcf,0x24,0x23,0x24,0x69,0x26,0x9c,0x26,0xa1,0x26,0xb1,
-0x27,0x04,0x27,0x09,0x27,0x27,0x27,0x4b,0x27,0x4d,0x27,0x52,0x27,0x56,0x27,0x5e,
-0x27,0x94,0x27,0xaf,0x27,0xbe,0x27,0xe0,0x27,0xeb,0x29,0xeb,0x2a,0x0e,0x2b,0x13,
-0xe0,0x14,0xfb,0x06,0xfb,0x17,0xfb,0x81,0xfb,0x95,0xfb,0x9f,0xfb,0xe9,0xfb,0xff,
-0xfe,0x74,0xfe,0xfc,0xfe,0xff,0xff,0xfd,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x20,
-0x00,0xa0,0x02,0x50,0x02,0xec,0x02,0xf3,0x02,0xf7,0x03,0x00,0x03,0x51,0x03,0x57,
-0x03,0x5c,0x03,0x60,0x03,0x74,0x03,0x7a,0x03,0x7e,0x03,0x84,0x03,0x8c,0x03,0x8e,
-0x03,0xa3,0x03,0xd0,0x04,0x88,0x04,0xd0,0x05,0x00,0x05,0x31,0x05,0x59,0x05,0x61,
-0x05,0x89,0x06,0x0c,0x06,0x15,0x06,0x1b,0x06,0x1f,0x06,0x21,0x06,0x40,0x06,0x60,
-0x06,0x74,0x06,0x79,0x06,0x91,0x06,0x98,0x06,0xa1,0x06,0xa4,0x06,0xa6,0x06,0xa9,
-0x06,0xaf,0x06,0xba,0x06,0xbf,0x06,0xcc,0x06,0xf0,0x1d,0x02,0x1d,0x08,0x1d,0x14,
-0x1d,0x16,0x1d,0x1d,0x1d,0x43,0x1d,0x77,0x1d,0x7b,0x1d,0x85,0x1d,0x9b,0x1d,0xb9,
-0x1e,0x00,0x1e,0xa0,0x1f,0x00,0x1f,0x18,0x1f,0x20,0x1f,0x48,0x1f,0x50,0x1f,0x59,
-0x1f,0x5b,0x1f,0x5d,0x1f,0x5f,0x1f,0x80,0x1f,0xb6,0x1f,0xc6,0x1f,0xd6,0x1f,0xdd,
-0x1f,0xf2,0x1f,0xf6,0x20,0x00,0x20,0x10,0x20,0x30,0x20,0x70,0x20,0x74,0x20,0xa0,
-0x20,0xb1,0x20,0xb4,0x21,0x00,0x21,0x03,0x21,0x09,0x21,0x0e,0x21,0x11,0x21,0x13,
-0x21,0x16,0x21,0x1c,0x21,0x20,0x21,0x26,0x21,0x2a,0x21,0x2e,0x21,0x32,0x21,0x34,
-0x21,0x3b,0x21,0x4b,0x21,0x53,0x21,0x90,0x21,0xb0,0x21,0xd0,0x22,0x00,0x22,0x34,
-0x22,0x41,0x22,0x6d,0x22,0x95,0x22,0xa4,0x22,0xc4,0x23,0x02,0x23,0x06,0x23,0x08,
-0x23,0x10,0x23,0x18,0x23,0x20,0x23,0x25,0x23,0x28,0x23,0x7d,0x23,0xae,0x23,0xcf,
-0x24,0x22,0x24,0x60,0x25,0x80,0x26,0xa0,0x26,0xb0,0x27,0x01,0x27,0x06,0x27,0x0c,
-0x27,0x29,0x27,0x4d,0x27,0x4f,0x27,0x56,0x27,0x58,0x27,0x61,0x27,0x98,0x27,0xb1,
-0x27,0xe0,0x27,0xe8,0x29,0xeb,0x2a,0x0c,0x2b,0x12,0xe0,0x00,0xfb,0x00,0xfb,0x13,
-0xfb,0x52,0xfb,0x8a,0xfb,0x9e,0xfb,0xe8,0xfb,0xfc,0xfe,0x70,0xfe,0x76,0xfe,0xff,
-0xff,0xfd,0xff,0xff,0x00,0x00,0xff,0xe3,0xff,0xc2,0xff,0xb4,0xff,0xb2,0xff,0xae,
-0xff,0xab,0xff,0xa3,0xff,0xa1,0xff,0x9e,0xff,0x9b,0xff,0x99,0xff,0x88,0xff,0x84,
-0xff,0x81,0xff,0x7c,0xff,0x7b,0xff,0x7a,0xff,0x79,0xff,0x78,0xff,0x77,0xff,0x76,
-0xff,0x70,0xff,0x4f,0xff,0x4d,0xff,0x4c,0xff,0x4b,0xfe,0xca,0xfe,0xc2,0xfe,0xbd,
-0xfe,0xba,0xfe,0xb9,0xfe,0xb4,0xfe,0xaa,0xfe,0xa6,0xfe,0xa2,0xfe,0x99,0xfe,0x93,
-0xfe,0x8b,0xfe,0x89,0xfe,0x88,0xfe,0x86,0xfe,0x81,0xfe,0x77,0xfe,0x73,0xfe,0x67,
-0xfe,0x44,0xe8,0x3c,0xe8,0x37,0xe8,0x2d,0xe8,0x2c,0xe8,0x27,0xe8,0x04,0xe7,0xe9,
-0xe7,0xe6,0xe7,0xdd,0xe7,0xc8,0xe7,0xc7,0xe7,0x87,0xe7,0x83,0xe7,0x7d,0xe7,0x7b,
-0xe7,0x79,0xe7,0x77,0xe7,0x75,0xe7,0x74,0xe7,0x73,0xe7,0x72,0xe7,0x71,0xe7,0x6f,
-0xe7,0x6e,0xe7,0x6d,0xe7,0x6b,0xe7,0x6a,0xe7,0x68,0xe7,0x67,0xe7,0x66,0xe7,0x61,
-0xe7,0x59,0xe7,0x48,0xe7,0x46,0xe7,0x35,0xe7,0x34,0xe7,0x32,0xe6,0xe8,0xe6,0xe6,
-0xe6,0xe4,0xe6,0xe0,0xe6,0xdf,0xe6,0xde,0xe6,0xdc,0xe6,0xd9,0xe6,0xd8,0xe6,0xd5,
-0xe6,0xd3,0xe6,0xd1,0xe6,0xce,0xe6,0xcd,0xe6,0xc8,0xe6,0xb9,0xe6,0xb2,0xe6,0xa6,
-0xe6,0x9f,0xe6,0x9c,0xe6,0x71,0xe6,0x6b,0xe6,0x68,0xe6,0x67,0xe6,0x5e,0xe6,0x53,
-0xe6,0x35,0xe5,0xfa,0xe5,0xf7,0xe5,0xf6,0xe5,0xf2,0xe5,0xec,0xe5,0xe6,0xe5,0xe3,
-0xe5,0xe1,0xe5,0x8f,0xe5,0x5f,0xe5,0x3f,0xe4,0xed,0xe4,0xb1,0xe3,0x9b,0xe3,0x98,
-0xe3,0x8a,0xe3,0x3b,0xe3,0x3a,0xe3,0x38,0xe3,0x37,0xe3,0x36,0xe3,0x35,0xe3,0x32,
-0xe3,0x31,0xe3,0x2f,0xe3,0x2c,0xe3,0x2b,0xe3,0x0a,0xe3,0x03,0xe1,0x04,0xe0,0xe4,
-0xdf,0xe1,0x2a,0xf5,0x10,0x0a,0x0f,0xfe,0x0f,0xc4,0x0f,0xbc,0x0f,0xb4,0x0f,0x6c,
-0x0f,0x5a,0x0c,0xea,0x0c,0xe9,0x0c,0xe7,0x0b,0xea,0x00,0x01,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x00,0x00,0x01,0x92,0xb2,0x00,0x00,0x00,
-0x00,0x9f,0xbf,0x02,0x00,0xa0,0xc0,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,
-0x7e,0x7b,0x80,0x75,0x74,0x68,0x6f,0x99,0x00,0x00,0x03,0x04,0x05,0x06,0x07,0x08,
-0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,
-0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,
-0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,
-0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,
-0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,
-0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x61,0x00,0x86,0x87,0x89,0x8b,0x93,0x98,
-0x9e,0xa3,0xa2,0xa4,0xa6,0xa5,0xa7,0xa9,0xab,0xaa,0xac,0xad,0xaf,0xae,0xb0,0xb1,
-0xb3,0xb5,0xb4,0xb6,0xb8,0xb7,0xbc,0xbb,0xbd,0xbe,0x00,0x72,0x64,0x65,0x69,0x00,
-0x78,0xa1,0x70,0x6b,0x00,0x76,0x6a,0x00,0x88,0x9a,0x00,0x73,0x00,0x00,0x67,0x77,
-0x00,0x00,0x00,0x00,0x00,0x6c,0x7c,0x00,0xa8,0xba,0x81,0x63,0x6e,0x00,0x00,0x00,
-0x00,0x6d,0x7d,0x00,0x62,0x82,0x85,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0xb9,0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x84,
-0x8c,0x83,0x8d,0x8a,0x8f,0x90,0x91,0x8e,0x95,0x96,0x00,0x94,0x9c,0x9d,0x9b,0x00,
-0x00,0x00,0x71,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x01,0x35,0x00,0xb8,
-0x00,0xcb,0x00,0xcb,0x00,0xc1,0x00,0xaa,0x00,0x9c,0x01,0xa6,0x00,0xb8,0x00,0x66,
-0x00,0x00,0x00,0x71,0x00,0xcb,0x00,0xa0,0x02,0xb2,0x00,0x85,0x00,0x75,0x00,0xb8,
-0x00,0xc3,0x01,0xcb,0x01,0x89,0x02,0x2d,0x00,0xcb,0x00,0xa6,0x00,0xf0,0x00,0xd3,
-0x00,0xaa,0x00,0x87,0x00,0xcb,0x03,0xaa,0x04,0x00,0x01,0x4a,0x00,0x33,0x00,0xcb,
-0x00,0x00,0x00,0xd9,0x05,0x02,0x00,0xf4,0x01,0x54,0x00,0xb4,0x00,0x9c,0x01,0x39,
-0x01,0x14,0x01,0x39,0x07,0x06,0x04,0x00,0x04,0x4e,0x04,0xb4,0x04,0x52,0x04,0xb8,
-0x04,0xe7,0x04,0xcd,0x00,0x37,0x04,0x73,0x04,0xcd,0x04,0x60,0x04,0x73,0x01,0x33,
-0x03,0xa2,0x05,0x56,0x05,0xa6,0x05,0x56,0x05,0x39,0x03,0xc5,0x02,0x12,0x00,0xc9,
-0x00,0x1f,0x00,0xb8,0x01,0xdf,0x00,0x73,0x00,0xba,0x03,0xe9,0x03,0x33,0x03,0xbc,
-0x04,0x44,0x04,0x0e,0x00,0xdf,0x03,0xcd,0x03,0xaa,0x00,0xe5,0x03,0xaa,0x04,0x04,
-0x00,0x00,0x00,0xcb,0x00,0x8f,0x00,0xa4,0x00,0x7b,0x00,0xb8,0x00,0x14,0x01,0x6f,
-0x00,0x7f,0x02,0x7b,0x02,0x52,0x00,0x8f,0x00,0xc7,0x05,0xcd,0x00,0x9a,0x00,0x9a,
-0x00,0x6f,0x00,0xcb,0x00,0xcd,0x01,0x9e,0x01,0xd3,0x00,0xf0,0x00,0xba,0x01,0x83,
-0x00,0xd5,0x00,0x98,0x03,0x04,0x02,0x48,0x00,0x9e,0x01,0xd5,0x00,0xc1,0x00,0xcb,
-0x00,0xf6,0x00,0x83,0x03,0x54,0x02,0x7f,0x00,0x00,0x03,0x33,0x02,0x66,0x00,0xd3,
-0x00,0xc7,0x00,0xa4,0x00,0xcd,0x00,0x8f,0x00,0x9a,0x00,0x73,0x04,0x00,0x05,0xd5,
-0x01,0x0a,0x00,0xfe,0x02,0x2b,0x00,0xa4,0x00,0xb4,0x00,0x9c,0x00,0x00,0x00,0x62,
-0x00,0x9c,0x00,0x00,0x00,0x1d,0x03,0x2d,0x05,0xd5,0x05,0xd5,0x05,0xd5,0x05,0xf0,
-0x00,0x7f,0x00,0x7b,0x00,0x54,0x00,0xa4,0x06,0xb8,0x06,0x14,0x07,0x23,0x01,0xd3,
-0x00,0xb8,0x00,0xcb,0x00,0xa6,0x01,0xc3,0x01,0xec,0x06,0x93,0x00,0xa0,0x00,0xd3,
-0x03,0x5c,0x03,0x71,0x03,0xdb,0x01,0x85,0x04,0x23,0x04,0xa8,0x04,0x48,0x00,0x8f,
-0x01,0x39,0x01,0x14,0x01,0x39,0x03,0x60,0x00,0x8f,0x05,0xd5,0x01,0x9a,0x06,0x14,
-0x07,0x23,0x06,0x66,0x01,0x79,0x04,0x60,0x04,0x60,0x04,0x60,0x04,0x7b,0x00,0x9c,
-0x00,0x00,0x02,0x77,0x04,0x60,0x01,0xaa,0x00,0xe9,0x04,0x60,0x07,0x62,0x00,0x7b,
-0x00,0xc5,0x00,0x7f,0x02,0x7b,0x00,0x00,0x00,0xb4,0x02,0x52,0x05,0xcd,0x00,0x66,
-0x00,0xbc,0x00,0x66,0x00,0x77,0x06,0x10,0x00,0xcd,0x01,0x3b,0x01,0x85,0x03,0x89,
-0x00,0x8f,0x00,0x7b,0x00,0x00,0x00,0x1d,0x00,0xcd,0x07,0x4a,0x04,0x2f,0x00,0x9c,
-0x00,0x9c,0x00,0x00,0x07,0x7d,0x00,0x6f,0x00,0x00,0x00,0x6f,0x03,0x35,0x00,0x6a,
-0x00,0x6f,0x00,0x7b,0x00,0xae,0x00,0xb2,0x00,0x2d,0x03,0x96,0x00,0x8f,0x02,0x7b,
-0x00,0xf6,0x00,0x83,0x03,0x54,0x06,0x37,0x05,0xf6,0x00,0x8f,0x00,0x9c,0x04,0xe1,
-0x02,0x66,0x00,0x8f,0x01,0x8d,0x02,0xf6,0x00,0xcd,0x03,0x44,0x00,0x29,0x00,0x66,
-0x04,0xee,0x00,0x73,0x00,0x00,0x14,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x00,0x00,0x3c,0x00,0x00,0x01,0x00,
-0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x48,0xc0,0x00,0x01,0x01,0x00,0x0b,0x00,0x01,
-0x00,0x00,0x00,0x4c,0xc0,0x00,0x01,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x50,
-0x00,0x00,0x01,0x03,0x00,0x00,0x01,0x04,0x00,0x02,0x01,0x05,0x00,0x04,0x01,0x06,
-0x00,0x02,0x01,0x07,0x00,0x02,0x01,0x08,0x00,0x00,0x01,0x09,0xb7,0x07,0x06,0x05,
-0x04,0x03,0x02,0x01,0x00,0x2c,0x20,0x10,0xb0,0x02,0x25,0x49,0x64,0xb0,0x40,0x51,
-0x58,0x20,0xc8,0x59,0x21,0x2d,0x2c,0xb0,0x02,0x25,0x49,0x64,0xb0,0x40,0x51,0x58,
-0x20,0xc8,0x59,0x21,0x2d,0x2c,0x20,0x10,0x07,0x20,0xb0,0x00,0x50,0xb0,0x0d,0x79,
-0x20,0xb8,0xff,0xff,0x50,0x58,0x04,0x1b,0x05,0x59,0xb0,0x05,0x1c,0xb0,0x03,0x25,
-0x08,0xb0,0x04,0x25,0x23,0xe1,0x20,0xb0,0x00,0x50,0xb0,0x0d,0x79,0x20,0xb8,0xff,
-0xff,0x50,0x58,0x04,0x1b,0x05,0x59,0xb0,0x05,0x1c,0xb0,0x03,0x25,0x08,0xe1,0x2d,
-0x2c,0x4b,0x50,0x58,0x20,0xb0,0xfd,0x45,0x44,0x59,0x21,0x2d,0x2c,0xb0,0x02,0x25,
-0x45,0x60,0x44,0x2d,0x2c,0x4b,0x53,0x58,0xb0,0x02,0x25,0xb0,0x02,0x25,0x45,0x44,
-0x59,0x21,0x21,0x2d,0x2c,0x45,0x44,0x2d,0x2c,0xb0,0x02,0x25,0xb0,0x02,0x25,0x49,
-0xb0,0x05,0x25,0xb0,0x05,0x25,0x49,0x60,0xb0,0x20,0x63,0x68,0x20,0x8a,0x10,0x8a,
-0x23,0x3a,0x8a,0x10,0x65,0x3a,0x2d,0x00,0x00,0x00,0x00,0x02,0x00,0x08,0x00,0x02,
-0xff,0xff,0x00,0x03,0x00,0x02,0x00,0x66,0xfe,0x96,0x04,0x66,0x05,0xa4,0x00,0x03,
-0x00,0x07,0x00,0x1a,0x40,0x0c,0x04,0xfb,0x00,0x06,0xfb,0x01,0x08,0x05,0x7f,0x02,
-0x04,0x00,0x2f,0xc4,0xd4,0xec,0x31,0x00,0x10,0xd4,0xec,0xd4,0xec,0x30,0x13,0x11,
-0x21,0x11,0x25,0x21,0x11,0x21,0x66,0x04,0x00,0xfc,0x73,0x03,0x1b,0xfc,0xe5,0xfe,
-0x96,0x07,0x0e,0xf8,0xf2,0x72,0x06,0x29,0x00,0x02,0x01,0x35,0x00,0x00,0x02,0x00,
-0x05,0xd5,0x00,0x03,0x00,0x09,0x00,0x35,0x40,0x0f,0x07,0x00,0x83,0x04,0x81,0x02,
-0x08,0x07,0x05,0x01,0x03,0x04,0x00,0x00,0x0a,0x10,0xfc,0x4b,0xb0,0x0b,0x54,0x58,
-0xb9,0x00,0x00,0xff,0xc0,0x38,0x59,0x3c,0xec,0x32,0x39,0x39,0x31,0x00,0x2f,0xe4,
-0xfc,0xcc,0x30,0x01,0xb6,0x00,0x0b,0x20,0x0b,0x50,0x0b,0x03,0x5d,0x25,0x33,0x15,
-0x23,0x11,0x33,0x11,0x03,0x23,0x03,0x01,0x35,0xcb,0xcb,0xcb,0x14,0xa2,0x15,0xfe,
-0xfe,0x05,0xd5,0xfd,0x71,0xfe,0x9b,0x01,0x65,0x00,0x00,0x02,0x00,0xc5,0x03,0xaa,
-0x02,0xe9,0x05,0xd5,0x00,0x03,0x00,0x07,0x00,0x42,0x40,0x0f,0x05,0x01,0x84,0x04,
-0x00,0x81,0x08,0x04,0x05,0x06,0x00,0x05,0x02,0x04,0x08,0x10,0xfc,0x4b,0xb0,0x12,
-0x54,0x4b,0xb0,0x13,0x54,0x5b,0x58,0xb9,0x00,0x02,0xff,0xc0,0x38,0x59,0xfc,0xdc,
-0xec,0x31,0x00,0x10,0xf4,0x3c,0xec,0x32,0x30,0x01,0x40,0x0f,0x30,0x09,0x40,0x09,
-0x50,0x09,0x60,0x09,0x70,0x09,0xa0,0x09,0xbf,0x09,0x07,0x5d,0x01,0x11,0x23,0x11,
-0x21,0x11,0x23,0x11,0x01,0x6f,0xaa,0x02,0x24,0xaa,0x05,0xd5,0xfd,0xd5,0x02,0x2b,
-0xfd,0xd5,0x02,0x2b,0x00,0x02,0x00,0x9e,0x00,0x00,0x06,0x17,0x05,0xbe,0x00,0x03,
-0x00,0x1f,0x00,0x60,0x40,0x31,0x1b,0x0b,0x00,0x87,0x07,0x04,0x1d,0x09,0x05,0x19,
-0x0d,0x02,0x87,0x17,0x13,0x0f,0x15,0x11,0x1f,0x1e,0x1c,0x1b,0x1a,0x17,0x16,0x15,
-0x14,0x13,0x12,0x11,0x10,0x0e,0x0d,0x0c,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,
-0x01,0x00,0x1a,0x0a,0x18,0x06,0x20,0x10,0xfc,0xcc,0x17,0x39,0x31,0x00,0x2f,0x3c,
-0xd4,0x3c,0x3c,0xfc,0x3c,0x3c,0xd4,0x3c,0x3c,0xc4,0x32,0xec,0x32,0x32,0x30,0x40,
-0x11,0x0b,0x01,0x0b,0x02,0x0b,0x0c,0x0b,0x0d,0x14,0x04,0x1a,0x11,0x1a,0x12,0x14,
-0x1f,0x08,0x01,0x5d,0x01,0x21,0x03,0x21,0x0b,0x01,0x21,0x13,0x33,0x03,0x21,0x15,
-0x21,0x03,0x21,0x15,0x21,0x03,0x23,0x13,0x21,0x03,0x23,0x13,0x21,0x35,0x21,0x13,
-0x21,0x35,0x21,0x13,0x04,0x17,0xfe,0xdd,0x54,0x01,0x25,0x44,0x68,0x01,0x24,0x69,
-0xa0,0x67,0x01,0x38,0xfe,0xa1,0x52,0x01,0x3e,0xfe,0x9b,0x68,0xa0,0x67,0xfe,0xdb,
-0x67,0xa1,0x68,0xfe,0xc5,0x01,0x60,0x54,0xfe,0xbe,0x01,0x69,0x66,0x03,0x85,0xfe,
-0xb2,0x03,0x87,0xfe,0x61,0x01,0x9f,0xfe,0x61,0x9a,0xfe,0xb2,0x99,0xfe,0x62,0x01,
-0x9e,0xfe,0x62,0x01,0x9e,0x99,0x01,0x4e,0x9a,0x01,0x9f,0x00,0x00,0x03,0x00,0xaa,
-0xfe,0xd3,0x04,0x6d,0x06,0x14,0x00,0x21,0x00,0x28,0x00,0x2f,0x00,0xbd,0x40,0x55,
-0x22,0x02,0x0a,0x0b,0x0a,0x27,0x01,0x26,0x28,0x02,0x0b,0x0b,0x0a,0x1d,0x01,0x1e,
-0x1c,0x02,0x2f,0x29,0x2f,0x1b,0x02,0x29,0x29,0x2f,0x42,0x13,0x11,0x10,0x22,0x0a,
-0x1b,0x29,0x04,0x17,0x06,0x09,0x2a,0x21,0x05,0x02,0x17,0x86,0x16,0x06,0x86,0x05,
-0x11,0x23,0x1a,0x8a,0x16,0x89,0x10,0x00,0x2a,0x8a,0x05,0x89,0x02,0x2d,0x08,0x16,
-0x0a,0x1e,0x07,0x29,0x1a,0x12,0x03,0x00,0x09,0x22,0x10,0x09,0x03,0x01,0x07,0x26,
-0x08,0x0d,0x05,0x06,0x30,0x10,0xfc,0x4b,0xb0,0x09,0x54,0x58,0xb9,0x00,0x05,0xff,
-0xc0,0x38,0x59,0x4b,0xb0,0x0c,0x54,0x4b,0xb0,0x10,0x54,0x5b,0x4b,0xb0,0x0f,0x54,
-0x5b,0x58,0xb9,0x00,0x05,0x00,0x40,0x38,0x59,0x3c,0xec,0xf4,0x17,0x3c,0xfc,0x17,
-0x3c,0xf4,0xe4,0xec,0x31,0x00,0x2f,0xe4,0xec,0xc4,0xd4,0xe4,0xec,0x32,0xc4,0x10,
-0xee,0x10,0xee,0x11,0x12,0x39,0x11,0x39,0x11,0x12,0x17,0x39,0x11,0x12,0x39,0x30,
-0x4b,0x53,0x58,0x07,0x10,0x04,0xed,0x07,0x10,0x0e,0xed,0x11,0x17,0x39,0x07,0x10,
-0x0e,0xed,0x11,0x17,0x39,0x07,0x10,0x04,0xed,0x59,0x22,0x01,0x23,0x03,0x2e,0x01,
-0x27,0x35,0x1e,0x01,0x17,0x11,0x2e,0x01,0x35,0x34,0x36,0x37,0x35,0x33,0x15,0x1e,
-0x01,0x17,0x15,0x2e,0x01,0x27,0x11,0x1e,0x01,0x15,0x14,0x06,0x07,0x03,0x11,0x0e,
-0x01,0x15,0x14,0x16,0x17,0x11,0x3e,0x01,0x35,0x34,0x26,0x02,0xb4,0x64,0x01,0x69,
-0xd2,0x6a,0x66,0xd1,0x6f,0xdd,0xc9,0xda,0xcc,0x64,0x5d,0xae,0x53,0x53,0xaf,0x5c,
-0xe3,0xd6,0xe3,0xd6,0x64,0x74,0x7a,0x71,0xe1,0x7f,0x81,0x7b,0xfe,0xd3,0x01,0x2d,
-0x02,0x2d,0x2d,0xb4,0x40,0x41,0x01,0x01,0xc8,0x24,0xac,0x96,0xa3,0xbc,0x0e,0xeb,
-0xe8,0x04,0x1f,0x1b,0xaf,0x2a,0x2e,0x04,0xfe,0x55,0x23,0xb4,0x9c,0xa9,0xc3,0x0f,
-0x03,0x00,0x01,0x9a,0x0d,0x6a,0x58,0x56,0x60,0xd5,0xfe,0x4f,0x11,0x6e,0x5a,0x58,
-0x68,0x00,0x00,0x05,0x00,0x71,0xff,0xe3,0x07,0x29,0x05,0xf0,0x00,0x0b,0x00,0x17,
-0x00,0x23,0x00,0x27,0x00,0x33,0x00,0x89,0x40,0x36,0x24,0x0f,0x25,0x26,0x25,0x26,
-0x0f,0x27,0x24,0x27,0x42,0x00,0x92,0x0c,0x1e,0x92,0x2e,0x8d,0x18,0x92,0x24,0x06,
-0x92,0x0c,0x8d,0x26,0x12,0x8c,0x28,0x24,0x91,0x34,0x27,0x21,0x1b,0x25,0x09,0x03,
-0x0d,0x15,0x0e,0x09,0x0d,0x0f,0x21,0x0d,0x2b,0x0e,0x1b,0x0d,0x0f,0x31,0x0b,0x34,
-0x10,0xfc,0x4b,0xb0,0x09,0x54,0x4b,0xb0,0x0b,0x54,0x5b,0x4b,0xb0,0x0c,0x54,0x5b,
-0x4b,0xb0,0x14,0x54,0x5b,0x4b,0xb0,0x0e,0x54,0x5b,0x4b,0xb0,0x0d,0x54,0x5b,0x58,
-0xb9,0x00,0x31,0xff,0xc0,0x38,0x59,0xc4,0xec,0xf4,0xec,0x10,0xee,0xf6,0xee,0x11,
-0x39,0x11,0x12,0x39,0x31,0x00,0x10,0xe4,0x32,0xf4,0x3c,0xe4,0xec,0x10,0xee,0xf6,
-0xee,0x10,0xee,0x30,0x4b,0x53,0x58,0x07,0x10,0x05,0xed,0x07,0x10,0x05,0xed,0x59,
-0x22,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x32,0x16,
-0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x01,0x22,0x06,0x15,0x14,0x16,0x33,
-0x32,0x36,0x35,0x34,0x26,0x25,0x33,0x01,0x23,0x13,0x32,0x16,0x15,0x14,0x06,0x23,
-0x22,0x26,0x35,0x34,0x36,0x05,0xd1,0x57,0x63,0x63,0x57,0x55,0x63,0x63,0x55,0x9e,
-0xba,0xbb,0x9d,0xa0,0xba,0xbb,0xfc,0x97,0x56,0x63,0x62,0x57,0x57,0x63,0x64,0x03,
-0x31,0xa0,0xfc,0x5a,0xa0,0x1f,0x9e,0xbc,0xbb,0x9f,0x9f,0xb9,0xba,0x02,0x91,0x94,
-0x84,0x82,0x95,0x95,0x82,0x83,0x95,0x7f,0xdc,0xbb,0xbb,0xdb,0xdb,0xbb,0xbc,0xdb,
-0x02,0x61,0x95,0x82,0x84,0x94,0x94,0x84,0x81,0x96,0x7f,0xf9,0xf3,0x06,0x0d,0xdb,
-0xbb,0xbd,0xda,0xdb,0xbc,0xba,0xdc,0x00,0x00,0x02,0x00,0x81,0xff,0xe3,0x05,0xfe,
-0x05,0xf0,0x00,0x09,0x00,0x30,0x01,0xcd,0x40,0x96,0x0d,0x01,0x0e,0x0c,0x86,0x11,
-0x12,0x11,0x0b,0x86,0x0a,0x0b,0x12,0x12,0x11,0x09,0x86,0x00,0x09,0x15,0x16,0x15,
-0x07,0x01,0x06,0x08,0x86,0x16,0x16,0x15,0x02,0x01,0x03,0x01,0x86,0x1d,0x1e,0x1d,
-0x00,0x86,0x09,0x00,0x1e,0x1e,0x1d,0x20,0x1f,0x02,0x21,0x1e,0x11,0x0a,0x13,0x0a,
-0x17,0x16,0x15,0x03,0x18,0x14,0x11,0x13,0x0a,0x07,0x08,0x02,0x06,0x09,0x11,0x13,
-0x13,0x0a,0x02,0x01,0x02,0x03,0x00,0x11,0x0a,0x13,0x0a,0x17,0x16,0x02,0x18,0x15,
-0x11,0x13,0x0a,0x14,0x11,0x13,0x13,0x0a,0x42,0x12,0x0b,0x09,0x03,0x06,0x00,0x0a,
-0x1e,0x03,0x28,0x15,0x0e,0x06,0x28,0x27,0x06,0x95,0x18,0x2b,0x95,0x27,0x94,0x24,
-0x91,0x18,0x8c,0x0e,0x13,0x0a,0x2e,0x0b,0x0e,0x09,0x00,0x2e,0x12,0x15,0x27,0x0e,
-0x1e,0x03,0x2e,0x12,0x27,0x21,0x0e,0x11,0x0f,0x13,0x21,0x03,0x12,0x1b,0x10,0x31,
-0x10,0xfc,0xec,0xc4,0xd4,0xd4,0xec,0x10,0xc6,0xee,0x11,0x39,0x11,0x12,0x39,0x39,
-0x11,0x39,0x39,0x11,0x39,0x11,0x39,0x31,0x00,0x2f,0xc6,0xe4,0xf6,0xe6,0xee,0x10,
-0xee,0x10,0xc6,0x11,0x12,0x39,0x11,0x17,0x39,0x11,0x17,0x39,0x30,0x4b,0x53,0x58,
-0x07,0x10,0x05,0xed,0x07,0x05,0xed,0x11,0x17,0x39,0x07,0x10,0x05,0xed,0x11,0x17,
-0x39,0x07,0x10,0x05,0xed,0x11,0x17,0x39,0x07,0x05,0xed,0x11,0x17,0x39,0x07,0x10,
-0x05,0xed,0x11,0x17,0x39,0x07,0x10,0x08,0xed,0x07,0x10,0x0e,0xed,0x11,0x17,0x39,
-0x07,0x10,0x0e,0xed,0x11,0x17,0x39,0x07,0x10,0x08,0xed,0x07,0x10,0x08,0xed,0x07,
-0x10,0x0e,0xed,0x11,0x17,0x39,0x59,0x22,0xb2,0x0f,0x32,0x01,0x01,0x5d,0x40,0xb2,
-0x07,0x0b,0x05,0x22,0x09,0x29,0x1c,0x00,0x1c,0x01,0x1f,0x02,0x17,0x0b,0x2a,0x00,
-0x2a,0x01,0x26,0x12,0x3a,0x00,0x34,0x12,0x44,0x0b,0x5e,0x00,0x59,0x01,0x5a,0x0a,
-0x55,0x12,0x5a,0x1a,0x5a,0x1f,0x59,0x30,0x67,0x1e,0x7b,0x00,0x9b,0x00,0x9a,0x01,
-0x99,0x02,0x97,0x08,0x95,0x0b,0x93,0x15,0x95,0x16,0x95,0x22,0x99,0x2d,0x1f,0x09,
-0x0b,0x09,0x0c,0x08,0x11,0x0c,0x27,0x0c,0x28,0x18,0x02,0x1b,0x09,0x19,0x0b,0x19,
-0x0c,0x19,0x11,0x1c,0x14,0x1c,0x15,0x16,0x1d,0x1f,0x32,0x27,0x00,0x27,0x01,0x29,
-0x09,0x23,0x12,0x2a,0x13,0x2a,0x14,0x28,0x15,0x2f,0x32,0x3b,0x09,0x34,0x12,0x39,
-0x13,0x3f,0x32,0x4a,0x09,0x4c,0x14,0x4b,0x15,0x46,0x19,0x4f,0x32,0x56,0x01,0x5a,
-0x09,0x59,0x0c,0x55,0x12,0x59,0x13,0x5c,0x1f,0x5f,0x32,0x6a,0x0c,0x69,0x11,0x60,
-0x32,0x75,0x01,0x79,0x0c,0x7a,0x11,0x93,0x00,0x93,0x01,0x97,0x02,0x95,0x05,0x9c,
-0x07,0x9c,0x08,0x9f,0x08,0x9a,0x09,0x9b,0x0b,0x9a,0x0c,0x90,0x32,0xa0,0x32,0xb0,
-0x32,0x39,0x5d,0x00,0x5d,0x01,0x0e,0x01,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x09,
-0x01,0x3e,0x01,0x37,0x33,0x06,0x02,0x07,0x01,0x23,0x27,0x0e,0x01,0x23,0x22,0x00,
-0x35,0x34,0x36,0x37,0x2e,0x01,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x15,0x2e,0x01,
-0x23,0x22,0x06,0x15,0x14,0x16,0x01,0xf2,0x5b,0x55,0xd4,0xa0,0x5f,0xa6,0x49,0xfe,
-0x7b,0x01,0xfc,0x3b,0x42,0x06,0xba,0x0c,0x68,0x5d,0x01,0x17,0xfc,0x8f,0x68,0xe4,
-0x83,0xf1,0xfe,0xce,0x86,0x86,0x30,0x32,0xde,0xb8,0x53,0xa5,0x55,0x57,0x9e,0x44,
-0x69,0x83,0x3b,0x03,0x23,0x51,0xa1,0x58,0x92,0xc2,0x3f,0x40,0x02,0x8f,0xfd,0xf8,
-0x59,0xcb,0x72,0x84,0xfe,0xfe,0x7e,0xfe,0xe3,0x93,0x59,0x57,0x01,0x13,0xd7,0x80,
-0xe1,0x63,0x3f,0x7d,0x3c,0xa2,0xc5,0x24,0x24,0xb6,0x2f,0x31,0x6f,0x58,0x33,0x67,
-0x00,0x01,0x00,0xc5,0x03,0xaa,0x01,0x6f,0x05,0xd5,0x00,0x03,0x00,0x37,0x40,0x0a,
-0x01,0x84,0x00,0x81,0x04,0x00,0x05,0x02,0x04,0x04,0x10,0xfc,0x4b,0xb0,0x12,0x54,
-0x4b,0xb0,0x13,0x54,0x5b,0x58,0xb9,0x00,0x02,0xff,0xc0,0x38,0x59,0xec,0x31,0x00,
-0x10,0xf4,0xec,0x30,0x01,0x40,0x0d,0x40,0x05,0x50,0x05,0x60,0x05,0x70,0x05,0x90,
-0x05,0xa0,0x05,0x06,0x5d,0x01,0x11,0x23,0x11,0x01,0x6f,0xaa,0x05,0xd5,0xfd,0xd5,
-0x02,0x2b,0x00,0x01,0x00,0xb0,0xfe,0xf2,0x02,0x7b,0x06,0x12,0x00,0x0d,0x00,0x37,
-0x40,0x0f,0x06,0x98,0x00,0x97,0x0e,0x0d,0x07,0x00,0x03,0x12,0x06,0x00,0x13,0x0a,
-0x0e,0x10,0xdc,0x4b,0xb0,0x13,0x54,0x58,0xb9,0x00,0x0a,0xff,0xc0,0x38,0x59,0x4b,
-0xb0,0x0f,0x54,0x58,0xb9,0x00,0x0a,0x00,0x40,0x38,0x59,0xe4,0x32,0xec,0x11,0x39,
-0x39,0x31,0x00,0x10,0xfc,0xec,0x30,0x01,0x06,0x02,0x15,0x14,0x12,0x17,0x23,0x26,
-0x02,0x35,0x34,0x12,0x37,0x02,0x7b,0x86,0x82,0x83,0x85,0xa0,0x96,0x95,0x94,0x97,
-0x06,0x12,0xe6,0xfe,0x3e,0xe7,0xe7,0xfe,0x3b,0xe5,0xeb,0x01,0xc6,0xe0,0xdf,0x01,
-0xc4,0xec,0x00,0x01,0x00,0xa4,0xfe,0xf2,0x02,0x6f,0x06,0x12,0x00,0x0d,0x00,0x1f,
-0x40,0x0f,0x07,0x98,0x00,0x97,0x0e,0x07,0x01,0x00,0x0b,0x12,0x04,0x13,0x08,0x00,
-0x0e,0x10,0xdc,0x3c,0xf4,0xec,0x11,0x39,0x39,0x31,0x00,0x10,0xfc,0xec,0x30,0x13,
-0x33,0x16,0x12,0x15,0x14,0x02,0x07,0x23,0x36,0x12,0x35,0x34,0x02,0xa4,0xa0,0x96,
-0x95,0x95,0x96,0xa0,0x85,0x83,0x83,0x06,0x12,0xec,0xfe,0x3c,0xdf,0xe0,0xfe,0x3a,
-0xeb,0xe5,0x01,0xc5,0xe7,0xe7,0x01,0xc2,0x00,0x01,0x00,0x3d,0x02,0x4a,0x03,0xc3,
-0x05,0xf0,0x00,0x11,0x00,0x4e,0x40,0x2c,0x10,0x0d,0x0b,0x00,0x04,0x0c,0x09,0x07,
-0x04,0x02,0x04,0x08,0x03,0x99,0x05,0x11,0x0c,0x99,0x0a,0x01,0x0e,0x91,0x12,0x08,
-0x0c,0x0a,0x03,0x09,0x06,0x11,0x03,0x01,0x03,0x02,0x00,0x14,0x0f,0x04,0x0b,0x09,
-0x14,0x0d,0x06,0x12,0x10,0xd4,0x3c,0xe4,0x32,0xdc,0x3c,0xe4,0x32,0x17,0x39,0x11,
-0x12,0x17,0x39,0x31,0x00,0x10,0xf4,0xd4,0x3c,0xec,0x32,0xc4,0xec,0x32,0x17,0x39,
-0x12,0x17,0x39,0x30,0x01,0x0d,0x01,0x07,0x25,0x11,0x23,0x11,0x05,0x27,0x2d,0x01,
-0x37,0x05,0x11,0x33,0x11,0x25,0x03,0xc3,0xfe,0x99,0x01,0x67,0x3a,0xfe,0xb0,0x72,
-0xfe,0xb0,0x3a,0x01,0x67,0xfe,0x99,0x3a,0x01,0x50,0x72,0x01,0x50,0x04,0xdf,0xc2,
-0xc3,0x62,0xcb,0xfe,0x87,0x01,0x79,0xcb,0x62,0xc3,0xc2,0x63,0xcb,0x01,0x79,0xfe,
-0x87,0xcb,0x00,0x01,0x00,0xd9,0x00,0x00,0x05,0xdb,0x05,0x04,0x00,0x0b,0x00,0x23,
-0x40,0x11,0x00,0x09,0x01,0x9c,0x07,0x03,0x05,0x02,0x15,0x04,0x00,0x17,0x0a,0x06,
-0x15,0x08,0x0c,0x10,0xdc,0xfc,0x3c,0xfc,0x3c,0xec,0x31,0x00,0x2f,0xd4,0x3c,0xfc,
-0x3c,0xc4,0x30,0x01,0x11,0x21,0x15,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x11,0x03,
-0xae,0x02,0x2d,0xfd,0xd3,0xa8,0xfd,0xd3,0x02,0x2d,0x05,0x04,0xfd,0xd3,0xaa,0xfd,
-0xd3,0x02,0x2d,0xaa,0x02,0x2d,0x00,0x01,0x00,0x9e,0xff,0x12,0x01,0xc3,0x00,0xfe,
-0x00,0x05,0x00,0x19,0x40,0x0c,0x03,0x9e,0x00,0x83,0x06,0x03,0x04,0x01,0x19,0x00,
-0x18,0x06,0x10,0xfc,0xec,0xd4,0xcc,0x31,0x00,0x10,0xfc,0xec,0x30,0x37,0x33,0x15,
-0x03,0x23,0x13,0xf0,0xd3,0xa4,0x81,0x52,0xfe,0xac,0xfe,0xc0,0x01,0x40,0x00,0x01,
-0x00,0x64,0x01,0xdf,0x02,0x7f,0x02,0x83,0x00,0x03,0x00,0x11,0xb6,0x00,0x9c,0x02,
-0x04,0x01,0x00,0x04,0x10,0xdc,0xcc,0x31,0x00,0x10,0xd4,0xec,0x30,0x13,0x21,0x15,
-0x21,0x64,0x02,0x1b,0xfd,0xe5,0x02,0x83,0xa4,0x00,0x00,0x01,0x00,0xdb,0x00,0x00,
-0x01,0xae,0x00,0xfe,0x00,0x03,0x00,0x11,0xb7,0x00,0x83,0x02,0x01,0x19,0x00,0x18,
-0x04,0x10,0xfc,0xec,0x31,0x00,0x2f,0xec,0x30,0x37,0x33,0x15,0x23,0xdb,0xd3,0xd3,
-0xfe,0xfe,0x00,0x01,0x00,0x00,0xff,0x42,0x02,0xb2,0x05,0xd5,0x00,0x03,0x00,0x2d,
-0x40,0x14,0x00,0x1a,0x01,0x02,0x01,0x02,0x1a,0x03,0x00,0x03,0x42,0x02,0x9f,0x00,
-0x81,0x04,0x02,0x00,0x01,0x03,0x2f,0xc4,0x39,0x39,0x31,0x00,0x10,0xf4,0xec,0x30,
-0x4b,0x53,0x58,0x07,0x10,0x05,0xed,0x07,0x10,0x05,0xed,0x59,0x22,0x01,0x33,0x01,
-0x23,0x02,0x08,0xaa,0xfd,0xf8,0xaa,0x05,0xd5,0xf9,0x6d,0x00,0x00,0x02,0x00,0x87,
-0xff,0xe3,0x04,0x8f,0x05,0xf0,0x00,0x0b,0x00,0x17,0x00,0x23,0x40,0x13,0x06,0xa0,
-0x12,0x00,0xa0,0x0c,0x91,0x12,0x8c,0x18,0x09,0x1c,0x0f,0x1e,0x03,0x1c,0x15,0x1b,
-0x18,0x10,0xfc,0xec,0xf4,0xec,0x31,0x00,0x10,0xe4,0xf4,0xec,0x10,0xee,0x30,0x01,
-0x22,0x02,0x11,0x10,0x12,0x33,0x32,0x12,0x11,0x10,0x02,0x27,0x32,0x00,0x11,0x10,
-0x00,0x23,0x22,0x00,0x11,0x10,0x00,0x02,0x8b,0x9c,0x9d,0x9d,0x9c,0x9d,0x9d,0x9d,
-0x9d,0xfb,0x01,0x09,0xfe,0xf7,0xfb,0xfb,0xfe,0xf7,0x01,0x09,0x05,0x50,0xfe,0xcd,
-0xfe,0xcc,0xfe,0xcd,0xfe,0xcd,0x01,0x33,0x01,0x33,0x01,0x34,0x01,0x33,0xa0,0xfe,
-0x73,0xfe,0x86,0xfe,0x87,0xfe,0x73,0x01,0x8d,0x01,0x79,0x01,0x7a,0x01,0x8d,0x00,
-0x00,0x01,0x00,0xe1,0x00,0x00,0x04,0x5a,0x05,0xd5,0x00,0x0a,0x00,0x40,0x40,0x15,
-0x42,0x03,0xa0,0x04,0x02,0xa0,0x05,0x81,0x07,0x00,0xa0,0x09,0x08,0x1f,0x06,0x1c,
-0x03,0x00,0x1f,0x01,0x0b,0x10,0xd4,0x4b,0xb0,0x0f,0x54,0x58,0xb9,0x00,0x01,0x00,
-0x40,0x38,0x59,0xec,0xc4,0xfc,0xec,0x31,0x00,0x2f,0xec,0x32,0xf4,0xec,0xd4,0xec,
-0x30,0x4b,0x53,0x58,0x59,0x22,0x01,0xb4,0x0f,0x03,0x0f,0x04,0x02,0x5d,0x37,0x21,
-0x11,0x05,0x35,0x25,0x33,0x11,0x21,0x15,0x21,0xfe,0x01,0x4a,0xfe,0x99,0x01,0x65,
-0xca,0x01,0x4a,0xfc,0xa4,0xaa,0x04,0x73,0x48,0xb8,0x48,0xfa,0xd5,0xaa,0x00,0x01,
-0x00,0x96,0x00,0x00,0x04,0x4a,0x05,0xf0,0x00,0x1c,0x00,0x9a,0x40,0x27,0x19,0x1a,
-0x1b,0x03,0x18,0x1c,0x11,0x05,0x04,0x00,0x11,0x05,0x05,0x04,0x42,0x10,0xa1,0x11,
-0x94,0x0d,0xa0,0x14,0x91,0x04,0x00,0xa0,0x02,0x00,0x10,0x0a,0x02,0x01,0x0a,0x1c,
-0x17,0x10,0x03,0x06,0x1d,0x10,0xfc,0x4b,0xb0,0x15,0x54,0x4b,0xb0,0x16,0x54,0x5b,
-0x4b,0xb0,0x14,0x54,0x5b,0x58,0xb9,0x00,0x03,0xff,0xc0,0x38,0x59,0xc4,0xd4,0xec,
-0xc0,0xc0,0x11,0x12,0x39,0x31,0x00,0x2f,0xec,0x32,0xf4,0xec,0xf4,0xec,0x30,0x4b,
-0x53,0x58,0x07,0x10,0x05,0xed,0x07,0x05,0xed,0x11,0x17,0x39,0x59,0x22,0x01,0x40,
-0x32,0x55,0x04,0x56,0x05,0x56,0x07,0x7a,0x04,0x7a,0x05,0x76,0x1b,0x87,0x19,0x07,
-0x04,0x00,0x04,0x19,0x04,0x1a,0x04,0x1b,0x05,0x1c,0x74,0x00,0x76,0x06,0x75,0x1a,
-0x73,0x1b,0x74,0x1c,0x82,0x00,0x86,0x19,0x82,0x1a,0x82,0x1b,0x82,0x1c,0xa8,0x00,
-0xa8,0x1b,0x11,0x5d,0x00,0x5d,0x25,0x21,0x15,0x21,0x35,0x36,0x00,0x37,0x3e,0x01,
-0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x35,0x3e,0x01,0x33,0x32,0x04,0x15,0x14,0x06,
-0x07,0x06,0x00,0x01,0x89,0x02,0xc1,0xfc,0x4c,0x73,0x01,0x8d,0x33,0x61,0x4d,0xa7,
-0x86,0x5f,0xd3,0x78,0x7a,0xd4,0x58,0xe8,0x01,0x14,0x45,0x5b,0x19,0xfe,0xf4,0xaa,
-0xaa,0xaa,0x77,0x01,0x91,0x3a,0x6d,0x97,0x49,0x77,0x96,0x42,0x43,0xcc,0x31,0x32,
-0xe8,0xc2,0x5c,0xa5,0x70,0x1d,0xfe,0xeb,0x00,0x01,0x00,0x9c,0xff,0xe3,0x04,0x73,
-0x05,0xf0,0x00,0x28,0x00,0x70,0x40,0x2e,0x00,0x15,0x13,0x0a,0x86,0x09,0x1f,0x86,
-0x20,0x13,0xa0,0x15,0x0d,0xa0,0x09,0x93,0x06,0x1c,0xa0,0x20,0x93,0x23,0x91,0x06,
-0x8c,0x15,0xa3,0x29,0x16,0x1c,0x13,0x00,0x03,0x14,0x19,0x1c,0x26,0x20,0x10,0x1c,
-0x03,0x14,0x1f,0x09,0x06,0x29,0x10,0xfc,0x4b,0xb0,0x16,0x54,0x4b,0xb0,0x14,0x54,
-0x5b,0x58,0xb9,0x00,0x09,0xff,0xc0,0x38,0x59,0xc4,0xc4,0xd4,0xec,0xf4,0xec,0x11,
-0x17,0x39,0x39,0x31,0x00,0x10,0xec,0xe4,0xf4,0xe4,0xec,0x10,0xe6,0xee,0x10,0xee,
-0x10,0xee,0x10,0xee,0x11,0x12,0x39,0x30,0x01,0x40,0x09,0x64,0x1e,0x61,0x1f,0x61,
-0x20,0x64,0x21,0x04,0x00,0x5d,0x01,0x1e,0x01,0x15,0x14,0x04,0x21,0x22,0x26,0x27,
-0x35,0x1e,0x01,0x33,0x32,0x36,0x35,0x34,0x26,0x2b,0x01,0x35,0x33,0x32,0x36,0x35,
-0x34,0x26,0x23,0x22,0x06,0x07,0x35,0x3e,0x01,0x33,0x32,0x04,0x15,0x14,0x06,0x03,
-0x3f,0x91,0xa3,0xfe,0xd0,0xfe,0xe8,0x5e,0xc7,0x6a,0x54,0xc8,0x6d,0xbe,0xc7,0xb9,
-0xa5,0xae,0xb6,0x95,0x9e,0xa3,0x98,0x53,0xbe,0x72,0x73,0xc9,0x59,0xe6,0x01,0x0c,
-0x8e,0x03,0x25,0x1f,0xc4,0x90,0xdd,0xf2,0x25,0x25,0xc3,0x31,0x32,0x96,0x8f,0x84,
-0x95,0xa6,0x77,0x70,0x73,0x7b,0x24,0x26,0xb4,0x20,0x20,0xd1,0xb2,0x7c,0xab,0x00,
-0x00,0x02,0x00,0x64,0x00,0x00,0x04,0xa4,0x05,0xd5,0x00,0x02,0x00,0x0d,0x00,0x81,
-0x40,0x1d,0x01,0x0d,0x03,0x0d,0x00,0x03,0x03,0x0d,0x42,0x00,0x03,0x0b,0x07,0xa0,
-0x05,0x01,0x03,0x81,0x09,0x01,0x0c,0x0a,0x00,0x1c,0x06,0x08,0x04,0x0c,0x0e,0x10,
-0xdc,0x4b,0xb0,0x0b,0x54,0x4b,0xb0,0x0d,0x54,0x5b,0x58,0xb9,0x00,0x0c,0xff,0xc0,
-0x38,0x59,0xd4,0x3c,0xc4,0xec,0x32,0x11,0x39,0x31,0x00,0x2f,0xe4,0xd4,0x3c,0xec,
-0x32,0x12,0x39,0x30,0x4b,0x53,0x58,0x07,0x10,0x04,0xc9,0x07,0x10,0x05,0xc9,0x59,
-0x22,0x01,0x40,0x2a,0x0b,0x00,0x2a,0x00,0x48,0x00,0x59,0x00,0x69,0x00,0x77,0x00,
-0x8a,0x00,0x07,0x16,0x01,0x2b,0x00,0x26,0x01,0x2b,0x03,0x36,0x01,0x4e,0x01,0x4f,
-0x0c,0x4f,0x0d,0x56,0x01,0x66,0x01,0x75,0x01,0x7a,0x03,0x85,0x01,0x0d,0x5d,0x00,
-0x5d,0x09,0x01,0x21,0x03,0x33,0x11,0x33,0x15,0x23,0x11,0x23,0x11,0x21,0x35,0x03,
-0x06,0xfe,0x02,0x01,0xfe,0x35,0xfe,0xd5,0xd5,0xc9,0xfd,0x5e,0x05,0x25,0xfc,0xe3,
-0x03,0xcd,0xfc,0x33,0xa8,0xfe,0xa0,0x01,0x60,0xc3,0x00,0x01,0x00,0x9e,0xff,0xe3,
-0x04,0x64,0x05,0xd5,0x00,0x1d,0x00,0x5e,0x40,0x23,0x04,0x1a,0x07,0x11,0x86,0x10,
-0x1d,0x1a,0xa0,0x07,0x14,0xa0,0x10,0x89,0x0d,0x02,0xa0,0x00,0x81,0x0d,0x8c,0x07,
-0xa4,0x1e,0x17,0x1c,0x01,0x0a,0x03,0x1c,0x00,0x0a,0x10,0x06,0x1e,0x10,0xfc,0x01,
-0x4b,0xb0,0x16,0x54,0x4b,0xb0,0x14,0x54,0x5b,0x58,0xb9,0x00,0x10,0xff,0xc0,0x38,
-0x59,0x4b,0xb0,0x0f,0x54,0x58,0xb9,0x00,0x10,0x00,0x40,0x38,0x59,0xc4,0xd4,0xec,
-0x10,0xc4,0xee,0x31,0x00,0x10,0xe4,0xe4,0xf4,0xec,0x10,0xe6,0xee,0x10,0xfe,0xc4,
-0x10,0xee,0x11,0x12,0x39,0x30,0x13,0x21,0x15,0x21,0x11,0x3e,0x01,0x33,0x32,0x00,
-0x15,0x14,0x00,0x21,0x22,0x26,0x27,0x35,0x1e,0x01,0x33,0x32,0x36,0x35,0x34,0x26,
-0x23,0x22,0x06,0x07,0xdd,0x03,0x19,0xfd,0xa0,0x2c,0x58,0x2c,0xfa,0x01,0x24,0xfe,
-0xd4,0xfe,0xef,0x5e,0xc3,0x68,0x5a,0xc0,0x6b,0xad,0xca,0xca,0xad,0x51,0xa1,0x54,
-0x05,0xd5,0xaa,0xfe,0x92,0x0f,0x0f,0xfe,0xee,0xea,0xf1,0xfe,0xf5,0x20,0x20,0xcb,
-0x31,0x30,0xb6,0x9c,0x9c,0xb6,0x24,0x26,0x00,0x02,0x00,0x8f,0xff,0xe3,0x04,0x96,
-0x05,0xf0,0x00,0x0b,0x00,0x24,0x00,0x58,0x40,0x24,0x13,0x06,0x00,0x0d,0x86,0x0c,
-0x00,0xa0,0x16,0x06,0xa0,0x1c,0x16,0xa5,0x10,0xa0,0x0c,0x89,0x22,0x91,0x1c,0x8c,
-0x25,0x0c,0x22,0x09,0x1c,0x19,0x1e,0x13,0x1c,0x03,0x21,0x1f,0x1b,0x25,0x10,0xfc,
-0xec,0xec,0xf4,0xec,0xe4,0x31,0x00,0x10,0xe4,0xf4,0xe4,0xfc,0xe4,0x10,0xee,0x10,
-0xee,0x10,0xee,0x11,0x12,0x39,0x30,0x40,0x14,0xcb,0x00,0xcb,0x01,0xcd,0x02,0xcd,
-0x03,0xcd,0x04,0xcb,0x05,0xcb,0x06,0x07,0xa4,0x1e,0xb2,0x1e,0x02,0x5d,0x01,0x5d,
-0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x15,0x2e,0x01,
-0x23,0x22,0x02,0x03,0x3e,0x01,0x33,0x32,0x00,0x15,0x14,0x00,0x23,0x20,0x00,0x11,
-0x10,0x00,0x21,0x32,0x16,0x02,0xa4,0x88,0x9f,0x9f,0x88,0x88,0x9f,0x9f,0x01,0x09,
-0x4c,0x9b,0x4c,0xc8,0xd3,0x0f,0x3b,0xb2,0x6b,0xe1,0x01,0x05,0xfe,0xf0,0xe2,0xfe,
-0xfd,0xfe,0xee,0x01,0x50,0x01,0x1b,0x4c,0x9b,0x03,0x3b,0xba,0xa2,0xa1,0xbb,0xbb,
-0xa1,0xa2,0xba,0x02,0x79,0xb8,0x24,0x26,0xfe,0xf2,0xfe,0xef,0x57,0x5d,0xfe,0xef,
-0xeb,0xe6,0xfe,0xea,0x01,0x8d,0x01,0x79,0x01,0x62,0x01,0xa5,0x1e,0x00,0x00,0x01,
-0x00,0xa8,0x00,0x00,0x04,0x68,0x05,0xd5,0x00,0x06,0x00,0x63,0x40,0x18,0x05,0x11,
-0x02,0x03,0x02,0x03,0x11,0x04,0x05,0x04,0x42,0x05,0xa0,0x00,0x81,0x03,0x05,0x03,
-0x01,0x04,0x01,0x00,0x06,0x07,0x10,0xfc,0xcc,0xc4,0x11,0x39,0x39,0x31,0x00,0x2f,
-0xf4,0xec,0x30,0x4b,0x53,0x58,0x07,0x10,0x05,0xed,0x07,0x10,0x05,0xed,0x59,0x22,
-0x01,0x4b,0xb0,0x16,0x54,0x58,0xbd,0x00,0x07,0x00,0x40,0x00,0x01,0x00,0x07,0x00,
-0x07,0xff,0xc0,0x38,0x11,0x37,0x38,0x59,0x40,0x12,0x58,0x02,0x01,0x06,0x03,0x1a,
-0x05,0x39,0x05,0x48,0x05,0x67,0x03,0xb0,0x00,0xb0,0x06,0x07,0x5d,0x00,0x5d,0x13,
-0x21,0x15,0x01,0x23,0x01,0x21,0xa8,0x03,0xc0,0xfd,0xe2,0xd3,0x01,0xfe,0xfd,0x33,
-0x05,0xd5,0x56,0xfa,0x81,0x05,0x2b,0x00,0x00,0x03,0x00,0x8b,0xff,0xe3,0x04,0x8b,
-0x05,0xf0,0x00,0x0b,0x00,0x23,0x00,0x2f,0x00,0x43,0x40,0x25,0x18,0x0c,0x00,0xa0,
-0x27,0x06,0xa0,0x1e,0x2d,0xa0,0x12,0x91,0x1e,0x8c,0x27,0xa3,0x30,0x18,0x0c,0x24,
-0x2a,0x1c,0x15,0x24,0x1c,0x0f,0x09,0x1c,0x15,0x1b,0x1e,0x03,0x1c,0x0f,0x21,0x1b,
-0x30,0x10,0xfc,0xc4,0xec,0xf4,0xc4,0xec,0x10,0xee,0x10,0xee,0x11,0x39,0x39,0x31,
-0x00,0x10,0xec,0xe4,0xf4,0xec,0x10,0xee,0x10,0xee,0x39,0x39,0x30,0x01,0x22,0x06,
-0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x25,0x2e,0x01,0x35,0x34,0x24,0x33,
-0x32,0x16,0x15,0x14,0x06,0x07,0x1e,0x01,0x15,0x14,0x04,0x23,0x22,0x24,0x35,0x34,
-0x36,0x13,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x02,0x8b,0x90,
-0xa5,0xa5,0x90,0x90,0xa6,0xa5,0xfe,0xa5,0x82,0x91,0x00,0xff,0xde,0xdf,0xfe,0x91,
-0x81,0x92,0xa3,0xfe,0xf7,0xf7,0xf7,0xfe,0xf7,0xa4,0x48,0x91,0x83,0x82,0x93,0x93,
-0x82,0x83,0x91,0x02,0xc5,0x9a,0x87,0x87,0x9a,0x9b,0x86,0x87,0x9a,0x56,0x20,0xb2,
-0x80,0xb3,0xd0,0xd0,0xb3,0x80,0xb2,0x20,0x22,0xc6,0x8f,0xd9,0xe8,0xe8,0xd9,0x8f,
-0xc6,0x01,0x61,0x74,0x82,0x82,0x74,0x74,0x82,0x82,0x00,0x02,0x00,0x81,0xff,0xe3,
-0x04,0x87,0x05,0xf0,0x00,0x18,0x00,0x24,0x00,0x58,0x40,0x23,0x07,0x1f,0x19,0x01,
-0x86,0x00,0x19,0xa0,0x0a,0xa5,0x04,0xa0,0x00,0x89,0x16,0x1f,0xa0,0x10,0x91,0x16,
-0x8c,0x25,0x07,0x1c,0x1c,0x21,0x13,0x1e,0x00,0x22,0x22,0x1c,0x0d,0x1b,0x25,0x10,
-0xfc,0xec,0xe4,0xf4,0xec,0xec,0x31,0x00,0x10,0xe4,0xf4,0xec,0x10,0xe6,0xfe,0xf5,
-0xee,0x10,0xee,0x11,0x12,0x39,0x30,0x40,0x16,0xc4,0x19,0xc2,0x1a,0xc0,0x1b,0xc0,
-0x1c,0xc0,0x1d,0xc2,0x1e,0xc4,0x1f,0x07,0xaa,0x12,0xbc,0x12,0xe9,0x12,0x03,0x5d,
-0x01,0x5d,0x37,0x35,0x1e,0x01,0x33,0x32,0x12,0x13,0x0e,0x01,0x23,0x22,0x00,0x35,
-0x34,0x00,0x33,0x20,0x00,0x11,0x10,0x00,0x21,0x22,0x26,0x01,0x32,0x36,0x35,0x34,
-0x26,0x23,0x22,0x06,0x15,0x14,0x16,0xe1,0x4c,0x9c,0x4b,0xc8,0xd3,0x0f,0x3a,0xb2,
-0x6c,0xe0,0xfe,0xfb,0x01,0x10,0xe2,0x01,0x03,0x01,0x11,0xfe,0xb1,0xfe,0xe5,0x4c,
-0x9c,0x01,0x3e,0x88,0x9f,0x9f,0x88,0x88,0x9f,0x9f,0x1f,0xb8,0x24,0x26,0x01,0x0d,
-0x01,0x12,0x56,0x5c,0x01,0x0f,0xeb,0xe6,0x01,0x16,0xfe,0x73,0xfe,0x86,0xfe,0x9f,
-0xfe,0x5b,0x1e,0x02,0x97,0xba,0xa2,0xa1,0xbb,0xbb,0xa1,0xa2,0xba,0x00,0x00,0x02,
-0x00,0xf0,0x00,0x00,0x01,0xc3,0x04,0x23,0x00,0x03,0x00,0x07,0x00,0x1c,0x40,0x0e,
-0x06,0x83,0x04,0xa6,0x00,0x83,0x02,0x05,0x01,0x03,0x04,0x00,0x18,0x08,0x10,0xfc,
-0x3c,0xec,0x32,0x31,0x00,0x2f,0xec,0xf4,0xec,0x30,0x37,0x33,0x15,0x23,0x11,0x33,
-0x15,0x23,0xf0,0xd3,0xd3,0xd3,0xd3,0xfe,0xfe,0x04,0x23,0xfe,0x00,0x02,0x00,0x9e,
-0xff,0x12,0x01,0xc3,0x04,0x23,0x00,0x03,0x00,0x09,0x00,0x25,0x40,0x13,0x02,0x83,
-0x00,0x07,0x9e,0x04,0x83,0x00,0xa6,0x0a,0x07,0x08,0x05,0x01,0x19,0x04,0x00,0x18,
-0x0a,0x10,0xfc,0x3c,0xec,0x32,0xd4,0xcc,0x31,0x00,0x10,0xe4,0xfc,0xec,0x10,0xee,
-0x30,0x13,0x33,0x15,0x23,0x11,0x33,0x15,0x03,0x23,0x13,0xf0,0xd3,0xd3,0xd3,0xa4,
-0x81,0x52,0x04,0x23,0xfe,0xfd,0xd9,0xac,0xfe,0xc0,0x01,0x40,0x00,0x01,0x00,0xd9,
-0x00,0x5e,0x05,0xdb,0x04,0xa6,0x00,0x06,0x00,0x4d,0x40,0x2a,0x02,0x9c,0x03,0x04,
-0x03,0x01,0x9c,0x00,0x01,0x04,0x04,0x03,0x01,0x9c,0x02,0x01,0x05,0x06,0x05,0x00,
-0x9c,0x06,0x05,0x42,0x05,0x04,0x02,0x01,0x00,0x05,0x03,0xa8,0x06,0xa7,0x07,0x01,
-0x02,0x00,0x24,0x04,0x23,0x07,0x10,0xfc,0xec,0x32,0x39,0x31,0x00,0x10,0xf4,0xec,
-0x17,0x39,0x30,0x4b,0x53,0x58,0x07,0x04,0xed,0x07,0x10,0x08,0xed,0x07,0x10,0x08,
-0xed,0x07,0x10,0x04,0xed,0x59,0x22,0x09,0x02,0x15,0x01,0x35,0x01,0x05,0xdb,0xfb,
-0xf8,0x04,0x08,0xfa,0xfe,0x05,0x02,0x03,0xf0,0xfe,0x91,0xfe,0x93,0xb6,0x01,0xd1,
-0xa6,0x01,0xd1,0x00,0x00,0x02,0x00,0xd9,0x01,0x60,0x05,0xdb,0x03,0xa2,0x00,0x03,
-0x00,0x07,0x00,0x1c,0x40,0x0d,0x00,0x9c,0x02,0x06,0x9c,0x04,0x08,0x05,0x01,0x04,
-0x00,0x23,0x08,0x10,0xfc,0x3c,0xc4,0x32,0x31,0x00,0x10,0xd4,0xec,0xd4,0xec,0x30,
-0x13,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0xd9,0x05,0x02,0xfa,0xfe,0x05,0x02,0xfa,
-0xfe,0x03,0xa2,0xa8,0xf0,0xaa,0x00,0x01,0x00,0xd9,0x00,0x5e,0x05,0xdb,0x04,0xa6,
-0x00,0x06,0x00,0x4f,0x40,0x2b,0x06,0x9c,0x00,0x06,0x03,0x04,0x03,0x05,0x9c,0x04,
-0x04,0x03,0x00,0x9c,0x01,0x02,0x01,0x06,0x9c,0x05,0x06,0x02,0x02,0x01,0x42,0x06,
-0x05,0x03,0x02,0x00,0x05,0x04,0xa8,0x01,0xa7,0x07,0x06,0x02,0x24,0x04,0x00,0x23,
-0x07,0x10,0xfc,0x3c,0xec,0x39,0x31,0x00,0x10,0xf4,0xec,0x17,0x39,0x30,0x4b,0x53,
-0x58,0x07,0x10,0x08,0xed,0x07,0x10,0x04,0xed,0x07,0x10,0x04,0xed,0x07,0x10,0x08,
-0xed,0x59,0x22,0x13,0x35,0x01,0x15,0x01,0x35,0x01,0xd9,0x05,0x02,0xfa,0xfe,0x04,
-0x06,0x03,0xf0,0xb6,0xfe,0x2f,0xa6,0xfe,0x2f,0xb6,0x01,0x6d,0x00,0x02,0x00,0x93,
-0x00,0x00,0x03,0xb0,0x05,0xf0,0x00,0x03,0x00,0x24,0x00,0x65,0x40,0x2b,0x24,0x1e,
-0x09,0x06,0x04,0x0a,0x1d,0x13,0x04,0x00,0x14,0x86,0x13,0x88,0x10,0x95,0x17,0x91,
-0x00,0x83,0x02,0x1d,0x1a,0x0d,0x09,0x05,0x04,0x0a,0x1e,0x01,0x0d,0x1c,0x1a,0x04,
-0x1c,0x05,0x01,0x03,0x00,0x26,0x1a,0x13,0x25,0x10,0xdc,0x4b,0xb0,0x0c,0x54,0x58,
-0xb9,0x00,0x13,0xff,0xc0,0x38,0x59,0xc4,0xfc,0xec,0xd4,0xec,0x10,0xee,0x11,0x39,
-0x39,0x11,0x12,0x39,0x11,0x12,0x39,0x31,0x00,0x2f,0xee,0xf6,0xfe,0xf4,0xee,0x10,
-0xcd,0x11,0x39,0x39,0x17,0x39,0x30,0x01,0xb6,0x79,0x09,0x7a,0x0a,0x7a,0x20,0x03,
-0x5d,0x25,0x33,0x15,0x23,0x13,0x23,0x35,0x34,0x36,0x3f,0x01,0x3e,0x01,0x35,0x34,
-0x26,0x23,0x22,0x06,0x07,0x35,0x3e,0x01,0x33,0x32,0x16,0x15,0x14,0x06,0x0f,0x01,
-0x0e,0x01,0x07,0x0e,0x01,0x15,0x01,0x87,0xcb,0xcb,0xc5,0xbf,0x38,0x5a,0x5a,0x39,
-0x33,0x83,0x6c,0x4f,0xb3,0x61,0x5e,0xc1,0x67,0xb8,0xdf,0x48,0x5a,0x58,0x2f,0x27,
-0x08,0x06,0x06,0xfe,0xfe,0x01,0x91,0x9a,0x65,0x82,0x56,0x59,0x35,0x5e,0x31,0x59,
-0x6e,0x46,0x43,0xbc,0x39,0x38,0xc2,0x9f,0x4c,0x89,0x56,0x56,0x2f,0x35,0x19,0x15,
-0x3c,0x34,0x00,0x02,0x00,0x87,0xfe,0x9c,0x07,0x71,0x05,0xa2,0x00,0x0b,0x00,0x4c,
-0x00,0x95,0x40,0x32,0x18,0x0c,0x03,0x09,0xa9,0x19,0x15,0x1b,0x03,0xa9,0x4c,0x0f,
-0x34,0x33,0x0f,0xac,0x30,0xa9,0x37,0x15,0xac,0x24,0xa9,0x37,0x43,0x4d,0x33,0x34,
-0x1e,0x1a,0x00,0x28,0x12,0x06,0x18,0x0c,0x28,0x1a,0x2b,0x1e,0x28,0x49,0x12,0x2b,
-0x2a,0x28,0x49,0x2c,0x3d,0x4d,0x10,0xdc,0xec,0xfc,0xec,0x10,0xfe,0xfd,0xfe,0x3c,
-0xc6,0x10,0xee,0x11,0x12,0x39,0x39,0x31,0x00,0x10,0xd4,0xc4,0xfc,0xec,0x10,0xfe,
-0xed,0xd4,0xc6,0x10,0xc5,0xee,0x32,0x10,0xc4,0xee,0x11,0x39,0x39,0x30,0x00,0x4b,
-0xb0,0x09,0x54,0x4b,0xb0,0x0c,0x54,0x5b,0x4b,0xb0,0x10,0x54,0x5b,0x4b,0xb0,0x13,
-0x54,0x5b,0x4b,0xb0,0x14,0x54,0x5b,0x58,0xbd,0x00,0x4d,0xff,0xc0,0x00,0x01,0x00,
-0x4d,0x00,0x4d,0x00,0x40,0x38,0x11,0x37,0x38,0x59,0x40,0x09,0x0f,0x4e,0x1f,0x4e,
-0x2f,0x4e,0x3f,0x4e,0x04,0x01,0x5d,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,
-0x23,0x22,0x06,0x01,0x0e,0x01,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,
-0x35,0x33,0x11,0x3e,0x01,0x35,0x34,0x26,0x27,0x26,0x24,0x23,0x22,0x06,0x07,0x06,
-0x02,0x15,0x14,0x12,0x17,0x16,0x04,0x33,0x32,0x36,0x37,0x17,0x06,0x04,0x23,0x22,
-0x24,0x27,0x26,0x02,0x35,0x34,0x12,0x37,0x36,0x24,0x33,0x32,0x04,0x17,0x1e,0x01,
-0x15,0x10,0x00,0x05,0x02,0xfa,0x8e,0x7c,0x7b,0x8d,0x90,0x7a,0x79,0x8f,0x02,0x21,
-0x3c,0x9b,0x67,0xac,0xd7,0xd8,0xab,0x67,0x9c,0x3b,0x8f,0x92,0xa5,0x3f,0x40,0x68,
-0xfe,0xd5,0xb0,0x7b,0xe2,0x60,0x9d,0xb1,0x73,0x6d,0x69,0x01,0x14,0x9d,0x81,0xf9,
-0x68,0x5a,0x7d,0xfe,0xd9,0x98,0xb9,0xfe,0xb8,0x80,0x80,0x86,0x88,0x7e,0x81,0x01,
-0x52,0xbd,0xd4,0x01,0x6b,0x7b,0x4b,0x4f,0xfe,0xc2,0xfe,0xe8,0x02,0x19,0x8f,0xa3,
-0xa4,0x8e,0x8c,0xa5,0xa4,0xfe,0x48,0x4d,0x49,0xf9,0xc8,0xc8,0xfa,0x4b,0x4c,0x83,
-0xfd,0x20,0x16,0xdf,0xb1,0x6b,0xbc,0x50,0x83,0x8b,0x41,0x40,0x66,0xfe,0xb5,0xc1,
-0x9f,0xfe,0xea,0x6a,0x68,0x6d,0x57,0x51,0x6f,0x61,0x67,0x83,0x7d,0x7d,0x01,0x49,
-0xbd,0xb6,0x01,0x4a,0x7d,0x7f,0x87,0xae,0xa0,0x62,0xe6,0x7b,0xfe,0xf9,0xfe,0xd0,
-0x06,0x00,0x00,0x02,0x00,0x10,0x00,0x00,0x05,0x68,0x05,0xd5,0x00,0x02,0x00,0x0a,
-0x00,0xba,0x40,0x41,0x00,0x11,0x01,0x00,0x04,0x05,0x04,0x02,0x11,0x05,0x05,0x04,
-0x01,0x11,0x0a,0x03,0x0a,0x00,0x11,0x02,0x00,0x03,0x03,0x0a,0x07,0x11,0x05,0x04,
-0x06,0x11,0x05,0x05,0x04,0x09,0x11,0x03,0x0a,0x08,0x11,0x0a,0x03,0x0a,0x42,0x00,
-0x03,0x07,0x95,0x01,0x03,0x81,0x09,0x05,0x09,0x08,0x07,0x06,0x04,0x03,0x02,0x01,
-0x00,0x09,0x05,0x0a,0x0b,0x10,0xd4,0xc4,0x17,0x39,0x31,0x00,0x2f,0x3c,0xe4,0xd4,
-0xec,0x12,0x39,0x30,0x4b,0x53,0x58,0x07,0x10,0x05,0xed,0x07,0x05,0xed,0x07,0x10,
-0x05,0xed,0x07,0x05,0xed,0x07,0x10,0x08,0xed,0x07,0x10,0x05,0xed,0x07,0x10,0x05,
-0xed,0x07,0x10,0x08,0xed,0x59,0x22,0xb2,0x20,0x0c,0x01,0x01,0x5d,0x40,0x3a,0x0f,
-0x00,0x58,0x00,0x76,0x00,0x70,0x00,0x8c,0x00,0x05,0x07,0x01,0x08,0x02,0x06,0x03,
-0x09,0x04,0x16,0x01,0x19,0x02,0x56,0x01,0x58,0x02,0x50,0x0c,0x67,0x01,0x68,0x02,
-0x78,0x01,0x76,0x02,0x7c,0x03,0x72,0x04,0x77,0x07,0x78,0x08,0x87,0x01,0x88,0x02,
-0x80,0x0c,0x98,0x02,0x99,0x03,0x96,0x04,0x17,0x5d,0x00,0x5d,0x09,0x01,0x21,0x01,
-0x33,0x01,0x23,0x03,0x21,0x03,0x23,0x02,0xbc,0xfe,0xee,0x02,0x25,0xfe,0x7b,0xe5,
-0x02,0x39,0xd2,0x88,0xfd,0x5f,0x88,0xd5,0x05,0x0e,0xfd,0x19,0x03,0xae,0xfa,0x2b,
-0x01,0x7f,0xfe,0x81,0x00,0x03,0x00,0xc9,0x00,0x00,0x04,0xec,0x05,0xd5,0x00,0x08,
-0x00,0x11,0x00,0x20,0x00,0x43,0x40,0x23,0x19,0x00,0x95,0x0a,0x09,0x95,0x12,0x81,
-0x01,0x95,0x0a,0xad,0x1f,0x11,0x0b,0x08,0x02,0x13,0x19,0x1f,0x05,0x00,0x0e,0x1c,
-0x16,0x05,0x19,0x1c,0x2e,0x09,0x00,0x1c,0x12,0x04,0x21,0x10,0xfc,0xec,0x32,0xfc,
-0xec,0xd4,0xec,0x11,0x17,0x39,0x39,0x39,0x31,0x00,0x2f,0xec,0xec,0xf4,0xec,0x10,
-0xee,0x39,0x30,0xb2,0x0f,0x22,0x01,0x01,0x5d,0x01,0x11,0x21,0x32,0x36,0x35,0x34,
-0x26,0x23,0x01,0x11,0x21,0x32,0x36,0x35,0x34,0x26,0x23,0x25,0x21,0x32,0x16,0x15,
-0x14,0x06,0x07,0x1e,0x01,0x15,0x14,0x04,0x23,0x21,0x01,0x93,0x01,0x44,0xa3,0x9d,
-0x9d,0xa3,0xfe,0xbc,0x01,0x2b,0x94,0x91,0x91,0x94,0xfe,0x0b,0x02,0x04,0xe7,0xfa,
-0x80,0x7c,0x95,0xa5,0xfe,0xf0,0xfb,0xfd,0xe8,0x02,0xc9,0xfd,0xdd,0x87,0x8b,0x8c,
-0x85,0x02,0x66,0xfe,0x3e,0x6f,0x72,0x71,0x70,0xa6,0xc0,0xb1,0x89,0xa2,0x14,0x20,
-0xcb,0x98,0xc8,0xda,0x00,0x01,0x00,0x73,0xff,0xe3,0x05,0x27,0x05,0xf0,0x00,0x19,
-0x00,0x36,0x40,0x1a,0x0d,0xa1,0x0e,0xae,0x0a,0x95,0x11,0x01,0xa1,0x00,0xae,0x04,
-0x95,0x17,0x91,0x11,0x8c,0x1a,0x07,0x19,0x0d,0x00,0x30,0x14,0x10,0x1a,0x10,0xfc,
-0xec,0x32,0xec,0x31,0x00,0x10,0xe4,0xf4,0xec,0xf4,0xec,0x10,0xee,0xf6,0xee,0x30,
-0xb4,0x0f,0x1b,0x1f,0x1b,0x02,0x01,0x5d,0x01,0x15,0x2e,0x01,0x23,0x20,0x00,0x11,
-0x10,0x00,0x21,0x32,0x36,0x37,0x15,0x0e,0x01,0x23,0x20,0x00,0x11,0x10,0x00,0x21,
-0x32,0x16,0x05,0x27,0x66,0xe7,0x82,0xff,0x00,0xfe,0xf0,0x01,0x10,0x01,0x00,0x82,
-0xe7,0x66,0x6a,0xed,0x84,0xfe,0xad,0xfe,0x7a,0x01,0x86,0x01,0x53,0x86,0xed,0x05,
-0x62,0xd5,0x5f,0x5e,0xfe,0xc7,0xfe,0xd8,0xfe,0xd9,0xfe,0xc7,0x5e,0x5f,0xd3,0x48,
-0x48,0x01,0x9f,0x01,0x67,0x01,0x68,0x01,0x9f,0x47,0x00,0x02,0x00,0xc9,0x00,0x00,
-0x05,0xb0,0x05,0xd5,0x00,0x08,0x00,0x11,0x00,0x2e,0x40,0x15,0x00,0x95,0x09,0x81,
-0x01,0x95,0x10,0x08,0x02,0x10,0x0a,0x00,0x05,0x19,0x0d,0x32,0x00,0x1c,0x09,0x04,
-0x12,0x10,0xfc,0xec,0xf4,0xec,0x11,0x39,0x39,0x39,0x39,0x31,0x00,0x2f,0xec,0xf4,
-0xec,0x30,0xb2,0x60,0x13,0x01,0x01,0x5d,0x01,0x11,0x33,0x20,0x00,0x11,0x10,0x00,
-0x21,0x25,0x21,0x20,0x00,0x11,0x10,0x00,0x29,0x01,0x01,0x93,0xf4,0x01,0x35,0x01,
-0x1f,0xfe,0xe1,0xfe,0xcb,0xfe,0x42,0x01,0x9f,0x01,0xb2,0x01,0x96,0xfe,0x68,0xfe,
-0x50,0xfe,0x61,0x05,0x2f,0xfb,0x77,0x01,0x18,0x01,0x2e,0x01,0x2c,0x01,0x17,0xa6,
-0xfe,0x97,0xfe,0x80,0xfe,0x7e,0xfe,0x96,0x00,0x01,0x00,0xc9,0x00,0x00,0x04,0x8b,
-0x05,0xd5,0x00,0x0b,0x00,0x2e,0x40,0x15,0x06,0x95,0x04,0x02,0x95,0x00,0x81,0x08,
-0x95,0x04,0xad,0x0a,0x05,0x01,0x09,0x07,0x03,0x1c,0x00,0x04,0x0c,0x10,0xfc,0xec,
-0x32,0xd4,0xc4,0xc4,0x31,0x00,0x2f,0xec,0xec,0xf4,0xec,0x10,0xee,0x30,0xb2,0x1f,
-0x0d,0x01,0x01,0x5d,0x13,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x21,
-0xc9,0x03,0xb0,0xfd,0x1a,0x02,0xc7,0xfd,0x39,0x02,0xf8,0xfc,0x3e,0x05,0xd5,0xaa,
-0xfe,0x46,0xaa,0xfd,0xe3,0xaa,0x00,0x01,0x00,0xc9,0x00,0x00,0x04,0x23,0x05,0xd5,
-0x00,0x09,0x00,0x29,0x40,0x12,0x06,0x95,0x04,0x02,0x95,0x00,0x81,0x04,0xad,0x08,
-0x05,0x01,0x07,0x03,0x1c,0x00,0x04,0x0a,0x10,0xfc,0xec,0x32,0xd4,0xc4,0x31,0x00,
-0x2f,0xec,0xf4,0xec,0x10,0xee,0x30,0xb2,0x0f,0x0b,0x01,0x01,0x5d,0x13,0x21,0x15,
-0x21,0x11,0x21,0x15,0x21,0x11,0x23,0xc9,0x03,0x5a,0xfd,0x70,0x02,0x50,0xfd,0xb0,
-0xca,0x05,0xd5,0xaa,0xfe,0x48,0xaa,0xfd,0x37,0x00,0x00,0x01,0x00,0x73,0xff,0xe3,
-0x05,0x8b,0x05,0xf0,0x00,0x1d,0x00,0x39,0x40,0x20,0x00,0x05,0x1b,0x01,0x95,0x03,
-0x1b,0x95,0x08,0x12,0xa1,0x11,0xae,0x15,0x95,0x0e,0x91,0x08,0x8c,0x1e,0x02,0x00,
-0x1c,0x11,0x34,0x04,0x33,0x18,0x19,0x0b,0x10,0x1e,0x10,0xfc,0xec,0xfc,0xe4,0xfc,
-0xc4,0x31,0x00,0x10,0xe4,0xf4,0xec,0xf4,0xec,0x10,0xfe,0xd4,0xee,0x11,0x39,0x39,
-0x30,0x25,0x11,0x21,0x35,0x21,0x11,0x06,0x04,0x23,0x20,0x00,0x11,0x10,0x00,0x21,
-0x32,0x04,0x17,0x15,0x2e,0x01,0x23,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x36,0x04,
-0xc3,0xfe,0xb6,0x02,0x12,0x75,0xfe,0xe6,0xa0,0xfe,0xa2,0xfe,0x75,0x01,0x8b,0x01,
-0x5e,0x92,0x01,0x07,0x6f,0x70,0xfc,0x8b,0xfe,0xee,0xfe,0xed,0x01,0x13,0x01,0x12,
-0x6b,0xa8,0xd5,0x01,0x91,0xa6,0xfd,0x7f,0x53,0x55,0x01,0x99,0x01,0x6d,0x01,0x6e,
-0x01,0x99,0x48,0x46,0xd7,0x5f,0x60,0xfe,0xce,0xfe,0xd1,0xfe,0xd2,0xfe,0xce,0x25,
-0x00,0x01,0x00,0xc9,0x00,0x00,0x05,0x3b,0x05,0xd5,0x00,0x0b,0x00,0x2c,0x40,0x14,
-0x08,0x95,0x02,0xad,0x04,0x00,0x81,0x0a,0x06,0x07,0x03,0x1c,0x05,0x38,0x09,0x01,
-0x1c,0x00,0x04,0x0c,0x10,0xfc,0xec,0x32,0xfc,0xec,0x32,0x31,0x00,0x2f,0x3c,0xe4,
-0x32,0xfc,0xec,0x30,0xb2,0x50,0x0d,0x01,0x01,0x5d,0x13,0x33,0x11,0x21,0x11,0x33,
-0x11,0x23,0x11,0x21,0x11,0x23,0xc9,0xca,0x02,0xde,0xca,0xca,0xfd,0x22,0xca,0x05,
-0xd5,0xfd,0x9c,0x02,0x64,0xfa,0x2b,0x02,0xc7,0xfd,0x39,0x00,0x00,0x01,0x00,0xc9,
-0x00,0x00,0x01,0x93,0x05,0xd5,0x00,0x03,0x00,0x2e,0xb7,0x00,0xaf,0x02,0x01,0x1c,
-0x00,0x04,0x04,0x10,0xfc,0x4b,0xb0,0x10,0x54,0x58,0xb9,0x00,0x00,0x00,0x40,0x38,
-0x59,0xec,0x31,0x00,0x2f,0xec,0x30,0x01,0x40,0x0d,0x30,0x05,0x40,0x05,0x50,0x05,
-0x60,0x05,0x8f,0x05,0x9f,0x05,0x06,0x5d,0x13,0x33,0x11,0x23,0xc9,0xca,0xca,0x05,
-0xd5,0xfa,0x2b,0x00,0x00,0x01,0xff,0x96,0xfe,0x66,0x01,0x93,0x05,0xd5,0x00,0x0b,
-0x00,0x42,0x40,0x13,0x0b,0x02,0x00,0x07,0x95,0x05,0xb0,0x00,0x81,0x0c,0x05,0x08,
-0x06,0x39,0x01,0x1c,0x00,0x04,0x0c,0x10,0xfc,0x4b,0xb0,0x10,0x54,0x58,0xb9,0x00,
-0x00,0x00,0x40,0x38,0x59,0xec,0xe4,0x39,0x39,0x31,0x00,0x10,0xe4,0xfc,0xec,0x11,
-0x39,0x39,0x30,0x01,0x40,0x0d,0x30,0x0d,0x40,0x0d,0x50,0x0d,0x60,0x0d,0x8f,0x0d,
-0x9f,0x0d,0x06,0x5d,0x13,0x33,0x11,0x10,0x06,0x2b,0x01,0x35,0x33,0x32,0x36,0x35,
-0xc9,0xca,0xcd,0xe3,0x4d,0x3f,0x86,0x6e,0x05,0xd5,0xfa,0x93,0xfe,0xf2,0xf4,0xaa,
-0x96,0xc2,0x00,0x01,0x00,0xc9,0x00,0x00,0x05,0x6a,0x05,0xd5,0x00,0x0a,0x00,0xef,
-0x40,0x28,0x08,0x11,0x05,0x06,0x05,0x07,0x11,0x06,0x06,0x05,0x03,0x11,0x04,0x05,
-0x04,0x02,0x11,0x05,0x05,0x04,0x42,0x08,0x05,0x02,0x03,0x03,0x00,0xaf,0x09,0x06,
-0x05,0x01,0x04,0x06,0x08,0x01,0x1c,0x00,0x04,0x0b,0x10,0xfc,0xec,0x32,0xd4,0xc4,
-0x11,0x39,0x31,0x00,0x2f,0x3c,0xec,0x32,0x17,0x39,0x30,0x4b,0x53,0x58,0x07,0x10,
-0x04,0xed,0x07,0x10,0x05,0xed,0x07,0x10,0x05,0xed,0x07,0x10,0x04,0xed,0x59,0x22,
-0xb2,0x08,0x03,0x01,0x01,0x5d,0x40,0x92,0x14,0x02,0x01,0x04,0x02,0x09,0x08,0x16,
-0x02,0x28,0x05,0x28,0x08,0x37,0x02,0x36,0x05,0x34,0x08,0x47,0x02,0x46,0x05,0x43,
-0x08,0x55,0x02,0x67,0x02,0x76,0x02,0x77,0x05,0x83,0x02,0x88,0x05,0x8f,0x08,0x94,
-0x02,0x9b,0x08,0xe7,0x02,0x15,0x06,0x03,0x09,0x05,0x09,0x06,0x1b,0x03,0x19,0x07,
-0x05,0x0a,0x03,0x0a,0x07,0x18,0x03,0x28,0x05,0x2b,0x06,0x2a,0x07,0x36,0x04,0x36,
-0x05,0x36,0x06,0x35,0x07,0x30,0x0c,0x41,0x03,0x40,0x04,0x45,0x05,0x40,0x06,0x40,
-0x07,0x40,0x0c,0x62,0x03,0x60,0x04,0x68,0x05,0x67,0x07,0x77,0x05,0x70,0x0c,0x8b,
-0x03,0x8b,0x05,0x8e,0x06,0x8f,0x07,0x8f,0x0c,0x9a,0x03,0x9d,0x06,0x9d,0x07,0xb6,
-0x03,0xb5,0x07,0xc5,0x03,0xc5,0x07,0xd7,0x03,0xd6,0x07,0xe8,0x03,0xe9,0x04,0xe8,
-0x05,0xea,0x06,0xf7,0x03,0xf8,0x05,0xf9,0x06,0x2c,0x5d,0x71,0x00,0x5d,0x71,0x13,
-0x33,0x11,0x01,0x21,0x09,0x01,0x21,0x01,0x11,0x23,0xc9,0xca,0x02,0x9e,0x01,0x04,
-0xfd,0x1b,0x03,0x1a,0xfe,0xf6,0xfd,0x33,0xca,0x05,0xd5,0xfd,0x89,0x02,0x77,0xfd,
-0x48,0xfc,0xe3,0x02,0xcf,0xfd,0x31,0x00,0x00,0x01,0x00,0xc9,0x00,0x00,0x04,0x6a,
-0x05,0xd5,0x00,0x05,0x00,0x25,0x40,0x0c,0x02,0x95,0x00,0x81,0x04,0x01,0x1c,0x03,
-0x3a,0x00,0x04,0x06,0x10,0xfc,0xec,0xec,0x31,0x00,0x2f,0xe4,0xec,0x30,0x40,0x09,
-0x30,0x07,0x50,0x07,0x80,0x03,0x80,0x04,0x04,0x01,0x5d,0x13,0x33,0x11,0x21,0x15,
-0x21,0xc9,0xca,0x02,0xd7,0xfc,0x5f,0x05,0xd5,0xfa,0xd5,0xaa,0x00,0x01,0x00,0xc9,
-0x00,0x00,0x06,0x1f,0x05,0xd5,0x00,0x0c,0x00,0xbf,0x40,0x34,0x03,0x11,0x07,0x08,
-0x07,0x02,0x11,0x01,0x02,0x08,0x08,0x07,0x02,0x11,0x03,0x02,0x09,0x0a,0x09,0x01,
-0x11,0x0a,0x0a,0x09,0x42,0x0a,0x07,0x02,0x03,0x08,0x03,0x00,0xaf,0x08,0x0b,0x05,
-0x09,0x08,0x03,0x02,0x01,0x05,0x0a,0x06,0x1c,0x04,0x3e,0x0a,0x1c,0x00,0x04,0x0d,
-0x10,0xfc,0xec,0xfc,0xec,0x11,0x17,0x39,0x31,0x00,0x2f,0x3c,0xc4,0xec,0x32,0x11,
-0x17,0x39,0x30,0x4b,0x53,0x58,0x07,0x10,0x05,0xed,0x07,0x10,0x08,0xed,0x07,0x10,
-0x08,0xed,0x07,0x10,0x05,0xed,0x59,0x22,0xb2,0x70,0x0e,0x01,0x01,0x5d,0x40,0x56,
-0x03,0x07,0x0f,0x08,0x0f,0x09,0x02,0x0a,0x15,0x02,0x14,0x07,0x13,0x0a,0x26,0x02,
-0x26,0x07,0x20,0x07,0x26,0x0a,0x20,0x0a,0x34,0x07,0x35,0x0a,0x69,0x02,0x7c,0x02,
-0x7b,0x07,0x79,0x0a,0x80,0x02,0x82,0x07,0x82,0x0a,0x90,0x02,0x16,0x04,0x01,0x0b,
-0x03,0x13,0x01,0x1b,0x03,0x23,0x01,0x2c,0x03,0x27,0x08,0x28,0x09,0x34,0x01,0x3c,
-0x03,0x56,0x08,0x59,0x09,0x65,0x08,0x6a,0x09,0x76,0x08,0x79,0x09,0x81,0x01,0x8d,
-0x03,0x95,0x01,0x9b,0x03,0x14,0x5d,0x00,0x5d,0x13,0x21,0x09,0x01,0x21,0x11,0x23,
-0x11,0x01,0x23,0x01,0x11,0x23,0xc9,0x01,0x2d,0x01,0x7d,0x01,0x7f,0x01,0x2d,0xc5,
-0xfe,0x7f,0xcb,0xfe,0x7f,0xc4,0x05,0xd5,0xfc,0x08,0x03,0xf8,0xfa,0x2b,0x05,0x1f,
-0xfc,0x00,0x04,0x00,0xfa,0xe1,0x00,0x01,0x00,0xc9,0x00,0x00,0x05,0x33,0x05,0xd5,
-0x00,0x09,0x00,0x79,0x40,0x1e,0x07,0x11,0x01,0x02,0x01,0x02,0x11,0x06,0x07,0x06,
-0x42,0x07,0x02,0x03,0x00,0xaf,0x08,0x05,0x06,0x01,0x07,0x02,0x1c,0x04,0x36,0x07,
-0x1c,0x00,0x04,0x0a,0x10,0xfc,0xec,0xfc,0xec,0x11,0x39,0x39,0x31,0x00,0x2f,0x3c,
-0xec,0x32,0x39,0x39,0x30,0x4b,0x53,0x58,0x07,0x10,0x04,0xed,0x07,0x10,0x04,0xed,
-0x59,0x22,0xb2,0x1f,0x0b,0x01,0x01,0x5d,0x40,0x30,0x36,0x02,0x38,0x07,0x48,0x02,
-0x47,0x07,0x69,0x02,0x66,0x07,0x80,0x02,0x07,0x06,0x01,0x09,0x06,0x15,0x01,0x1a,
-0x06,0x46,0x01,0x49,0x06,0x57,0x01,0x58,0x06,0x65,0x01,0x69,0x06,0x79,0x06,0x85,
-0x01,0x8a,0x06,0x95,0x01,0x9a,0x06,0x9f,0x0b,0x10,0x5d,0x00,0x5d,0x13,0x21,0x01,
-0x11,0x33,0x11,0x21,0x01,0x11,0x23,0xc9,0x01,0x10,0x02,0x96,0xc4,0xfe,0xf0,0xfd,
-0x6a,0xc4,0x05,0xd5,0xfb,0x1f,0x04,0xe1,0xfa,0x2b,0x04,0xe1,0xfb,0x1f,0x00,0x02,
-0x00,0x73,0xff,0xe3,0x05,0xd9,0x05,0xf0,0x00,0x0b,0x00,0x17,0x00,0x23,0x40,0x13,
-0x06,0x95,0x12,0x00,0x95,0x0c,0x91,0x12,0x8c,0x18,0x09,0x19,0x0f,0x33,0x03,0x19,
-0x15,0x10,0x18,0x10,0xfc,0xec,0xfc,0xec,0x31,0x00,0x10,0xe4,0xf4,0xec,0x10,0xee,
-0x30,0x01,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x00,0x11,0x10,0x00,0x27,0x20,0x00,
-0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x03,0x27,0xdc,0xfe,0xfd,0x01,0x03,
-0xdc,0xdc,0x01,0x01,0xfe,0xff,0xdc,0x01,0x3a,0x01,0x78,0xfe,0x88,0xfe,0xc6,0xfe,
-0xc5,0xfe,0x87,0x01,0x79,0x05,0x4c,0xfe,0xb8,0xfe,0xe5,0xfe,0xe6,0xfe,0xb8,0x01,
-0x48,0x01,0x1a,0x01,0x1b,0x01,0x48,0xa4,0xfe,0x5b,0xfe,0x9e,0xfe,0x9f,0xfe,0x5b,
-0x01,0xa4,0x01,0x62,0x01,0x62,0x01,0xa5,0x00,0x02,0x00,0xc9,0x00,0x00,0x04,0x8d,
-0x05,0xd5,0x00,0x08,0x00,0x13,0x00,0x3a,0x40,0x18,0x01,0x95,0x10,0x00,0x95,0x09,
-0x81,0x12,0x10,0x0a,0x08,0x02,0x04,0x00,0x05,0x19,0x0d,0x3f,0x11,0x00,0x1c,0x09,
-0x04,0x14,0x10,0xfc,0xec,0x32,0xfc,0xec,0x11,0x17,0x39,0x31,0x00,0x2f,0xf4,0xec,
-0xd4,0xec,0x30,0x40,0x0b,0x0f,0x15,0x1f,0x15,0x3f,0x15,0x5f,0x15,0xaf,0x15,0x05,
-0x01,0x5d,0x01,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x25,0x21,0x32,0x04,0x15,
-0x14,0x04,0x2b,0x01,0x11,0x23,0x01,0x93,0xfe,0x8d,0x9a,0x9a,0x8d,0xfe,0x38,0x01,
-0xc8,0xfb,0x01,0x01,0xfe,0xff,0xfb,0xfe,0xca,0x05,0x2f,0xfd,0xcf,0x92,0x87,0x86,
-0x92,0xa6,0xe3,0xdb,0xdd,0xe2,0xfd,0xa8,0x00,0x02,0x00,0x73,0xfe,0xf8,0x05,0xd9,
-0x05,0xf0,0x00,0x0b,0x00,0x1d,0x00,0x52,0x40,0x2a,0x11,0x10,0x02,0x0f,0x01,0x0c,
-0x0d,0x0c,0x0e,0x01,0x0d,0x0d,0x0c,0x42,0x0f,0x1e,0x0c,0x06,0x95,0x12,0x00,0x95,
-0x18,0x91,0x12,0x8c,0x0d,0x1e,0x0d,0x1b,0x0f,0x0c,0x03,0x09,0x19,0x1b,0x33,0x03,
-0x19,0x15,0x10,0x1e,0x10,0xfc,0xec,0xfc,0xec,0x11,0x39,0x39,0x11,0x39,0x31,0x00,
-0x10,0xc4,0xe4,0xf4,0xec,0x10,0xee,0x39,0x12,0x39,0x30,0x4b,0x53,0x58,0x07,0x10,
-0x05,0xed,0x07,0x10,0x05,0xed,0x17,0x39,0x59,0x22,0x01,0x22,0x00,0x11,0x10,0x00,
-0x33,0x32,0x00,0x11,0x10,0x00,0x13,0x01,0x23,0x27,0x0e,0x01,0x23,0x20,0x00,0x11,
-0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x02,0x03,0x27,0xdc,0xfe,0xfd,0x01,0x03,0xdc,
-0xdc,0x01,0x01,0xfe,0xff,0x3f,0x01,0x0a,0xf4,0xdd,0x21,0x23,0x10,0xfe,0xc5,0xfe,
-0x87,0x01,0x79,0x01,0x3b,0x01,0x3a,0x01,0x78,0xd1,0x05,0x4c,0xfe,0xb8,0xfe,0xe5,
-0xfe,0xe6,0xfe,0xb8,0x01,0x48,0x01,0x1a,0x01,0x1b,0x01,0x48,0xfa,0xcf,0xfe,0xdd,
-0xef,0x02,0x02,0x01,0xa5,0x01,0x61,0x01,0x62,0x01,0xa5,0xfe,0x5b,0xfe,0x9e,0xfe,
-0xfc,0xfe,0x8e,0x00,0x00,0x02,0x00,0xc9,0x00,0x00,0x05,0x54,0x05,0xd5,0x00,0x13,
-0x00,0x1c,0x00,0xb1,0x40,0x35,0x09,0x08,0x07,0x03,0x0a,0x06,0x11,0x03,0x04,0x03,
-0x05,0x11,0x04,0x04,0x03,0x42,0x06,0x04,0x00,0x15,0x03,0x04,0x15,0x95,0x09,0x14,
-0x95,0x0d,0x81,0x0b,0x04,0x05,0x06,0x03,0x11,0x09,0x00,0x1c,0x16,0x0e,0x05,0x0a,
-0x19,0x19,0x04,0x11,0x3f,0x14,0x0a,0x1c,0x0c,0x04,0x1d,0x10,0xfc,0xec,0x32,0xfc,
-0xc4,0xec,0x11,0x17,0x39,0x11,0x39,0x39,0x39,0x31,0x00,0x2f,0x3c,0xf4,0xec,0xd4,
-0xec,0x12,0x39,0x12,0x39,0x12,0x39,0x30,0x4b,0x53,0x58,0x07,0x10,0x05,0xed,0x07,
-0x10,0x05,0xed,0x11,0x17,0x39,0x59,0x22,0xb2,0x40,0x1e,0x01,0x01,0x5d,0x40,0x42,
-0x7a,0x13,0x01,0x05,0x00,0x05,0x01,0x05,0x02,0x06,0x03,0x07,0x04,0x15,0x00,0x15,
-0x01,0x14,0x02,0x16,0x03,0x17,0x04,0x25,0x00,0x25,0x01,0x25,0x02,0x26,0x03,0x27,
-0x06,0x26,0x07,0x26,0x08,0x26,0x09,0x20,0x1e,0x36,0x01,0x36,0x02,0x46,0x01,0x46,
-0x02,0x68,0x05,0x75,0x04,0x75,0x05,0x77,0x13,0x88,0x06,0x88,0x07,0x98,0x06,0x98,
-0x07,0x1f,0x5d,0x00,0x5d,0x01,0x1e,0x01,0x17,0x13,0x23,0x03,0x2e,0x01,0x2b,0x01,
-0x11,0x23,0x11,0x21,0x20,0x16,0x15,0x14,0x06,0x01,0x11,0x33,0x32,0x36,0x35,0x34,
-0x26,0x23,0x03,0x8d,0x41,0x7b,0x3e,0xcd,0xd9,0xbf,0x4a,0x8b,0x78,0xdc,0xca,0x01,
-0xc8,0x01,0x00,0xfc,0x83,0xfd,0x89,0xfe,0x92,0x95,0x95,0x92,0x02,0xbc,0x16,0x90,
-0x7e,0xfe,0x68,0x01,0x7f,0x96,0x62,0xfd,0x89,0x05,0xd5,0xd6,0xd8,0x8d,0xba,0x02,
-0x4f,0xfd,0xee,0x87,0x83,0x83,0x85,0x00,0x00,0x01,0x00,0x87,0xff,0xe3,0x04,0xa2,
-0x05,0xf0,0x00,0x27,0x00,0x7e,0x40,0x3c,0x0d,0x0c,0x02,0x0e,0x0b,0x02,0x1e,0x1f,
-0x1e,0x08,0x09,0x02,0x07,0x0a,0x02,0x1f,0x1f,0x1e,0x42,0x0a,0x0b,0x1e,0x1f,0x04,
-0x15,0x01,0x00,0x15,0xa1,0x14,0x94,0x18,0x95,0x11,0x04,0x95,0x00,0x94,0x25,0x91,
-0x11,0x8c,0x28,0x1e,0x0a,0x0b,0x1f,0x1b,0x07,0x00,0x22,0x1b,0x19,0x0e,0x2d,0x07,
-0x19,0x14,0x22,0x28,0x10,0xdc,0xc4,0xec,0xfc,0xec,0xe4,0x11,0x12,0x39,0x39,0x39,
-0x39,0x31,0x00,0x10,0xe4,0xf4,0xe4,0xec,0x10,0xee,0xf6,0xee,0x10,0xc6,0x11,0x17,
-0x39,0x30,0x4b,0x53,0x58,0x07,0x10,0x0e,0xed,0x11,0x17,0x39,0x07,0x10,0x0e,0xed,
-0x11,0x17,0x39,0x59,0x22,0xb2,0x0f,0x29,0x01,0x01,0x5d,0xb6,0x1f,0x29,0x2f,0x29,
-0x4f,0x29,0x03,0x5d,0x01,0x15,0x2e,0x01,0x23,0x22,0x06,0x15,0x14,0x16,0x1f,0x01,
-0x1e,0x01,0x15,0x14,0x04,0x21,0x22,0x26,0x27,0x35,0x1e,0x01,0x33,0x32,0x36,0x35,
-0x34,0x26,0x2f,0x01,0x2e,0x01,0x35,0x34,0x24,0x33,0x32,0x16,0x04,0x48,0x73,0xcc,
-0x5f,0xa5,0xb3,0x77,0xa6,0x7a,0xe2,0xd7,0xfe,0xdd,0xfe,0xe7,0x6a,0xef,0x80,0x7b,
-0xec,0x72,0xad,0xbc,0x87,0x9a,0x7b,0xe2,0xca,0x01,0x17,0xf5,0x69,0xda,0x05,0xa4,
-0xc5,0x37,0x36,0x80,0x76,0x63,0x65,0x1f,0x19,0x2b,0xd9,0xb6,0xd9,0xe0,0x30,0x2f,
-0xd0,0x45,0x46,0x88,0x7e,0x6e,0x7c,0x1f,0x18,0x2d,0xc0,0xab,0xc6,0xe4,0x26,0x00,
-0x00,0x01,0xff,0xfa,0x00,0x00,0x04,0xe9,0x05,0xd5,0x00,0x07,0x00,0x4a,0x40,0x0e,
-0x06,0x02,0x95,0x00,0x81,0x04,0x01,0x40,0x03,0x1c,0x00,0x40,0x05,0x08,0x10,0xd4,
-0xe4,0xfc,0xe4,0x31,0x00,0x2f,0xf4,0xec,0x32,0x30,0x01,0x4b,0xb0,0x0a,0x54,0x58,
-0xbd,0x00,0x08,0x00,0x40,0x00,0x01,0x00,0x08,0x00,0x08,0xff,0xc0,0x38,0x11,0x37,
-0x38,0x59,0x40,0x13,0x00,0x09,0x1f,0x00,0x10,0x01,0x10,0x02,0x1f,0x07,0x10,0x09,
-0x40,0x09,0x70,0x09,0x9f,0x09,0x09,0x5d,0x03,0x21,0x15,0x21,0x11,0x23,0x11,0x21,
-0x06,0x04,0xef,0xfd,0xee,0xcb,0xfd,0xee,0x05,0xd5,0xaa,0xfa,0xd5,0x05,0x2b,0x00,
-0x00,0x01,0x00,0xb2,0xff,0xe3,0x05,0x29,0x05,0xd5,0x00,0x11,0x00,0x40,0x40,0x16,
-0x08,0x02,0x11,0x0b,0x00,0x05,0x95,0x0e,0x8c,0x09,0x00,0x81,0x12,0x08,0x1c,0x0a,
-0x38,0x01,0x1c,0x00,0x41,0x12,0x10,0xfc,0x4b,0xb0,0x10,0x54,0x58,0xb9,0x00,0x00,
-0xff,0xc0,0x38,0x59,0xec,0xfc,0xec,0x31,0x00,0x10,0xe4,0x32,0xf4,0xec,0x11,0x39,
-0x39,0x39,0x39,0x30,0x01,0xb6,0x1f,0x13,0x8f,0x13,0x9f,0x13,0x03,0x5d,0x13,0x33,
-0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x10,0x00,0x21,0x20,0x00,0x11,
-0xb2,0xcb,0xae,0xc3,0xc2,0xae,0xcb,0xfe,0xdf,0xfe,0xe6,0xfe,0xe5,0xfe,0xdf,0x05,
-0xd5,0xfc,0x75,0xf0,0xd3,0xd3,0xf0,0x03,0x8b,0xfc,0x5c,0xfe,0xdc,0xfe,0xd6,0x01,
-0x2a,0x01,0x24,0x00,0x00,0x01,0x00,0x10,0x00,0x00,0x05,0x68,0x05,0xd5,0x00,0x06,
-0x00,0xb7,0x40,0x27,0x04,0x11,0x05,0x06,0x05,0x03,0x11,0x02,0x03,0x06,0x06,0x05,
-0x03,0x11,0x04,0x03,0x00,0x01,0x00,0x02,0x11,0x01,0x01,0x00,0x42,0x03,0x04,0x01,
-0xaf,0x00,0x06,0x04,0x03,0x02,0x00,0x05,0x05,0x01,0x07,0x10,0xd4,0xc4,0x17,0x39,
-0x31,0x00,0x2f,0xec,0x32,0x39,0x30,0x4b,0x53,0x58,0x07,0x10,0x05,0xed,0x07,0x10,
-0x08,0xed,0x07,0x10,0x08,0xed,0x07,0x10,0x05,0xed,0x59,0x22,0xb2,0x50,0x08,0x01,
-0x01,0x5d,0x40,0x62,0x00,0x03,0x2a,0x03,0x47,0x04,0x47,0x05,0x5a,0x03,0x7d,0x03,
-0x83,0x03,0x07,0x06,0x00,0x07,0x02,0x08,0x04,0x09,0x06,0x15,0x01,0x14,0x02,0x1a,
-0x04,0x1a,0x05,0x2a,0x00,0x26,0x01,0x26,0x02,0x29,0x04,0x29,0x05,0x25,0x06,0x20,
-0x08,0x38,0x00,0x33,0x01,0x33,0x02,0x3c,0x04,0x3c,0x05,0x37,0x06,0x48,0x00,0x45,
-0x01,0x45,0x02,0x49,0x04,0x49,0x05,0x47,0x06,0x59,0x00,0x56,0x06,0x66,0x02,0x69,
-0x04,0x69,0x05,0x7a,0x00,0x76,0x01,0x76,0x02,0x79,0x04,0x79,0x05,0x75,0x06,0x80,
-0x08,0x98,0x00,0x97,0x06,0x29,0x5d,0x00,0x5d,0x21,0x01,0x33,0x09,0x01,0x33,0x01,
-0x02,0x4a,0xfd,0xc6,0xd3,0x01,0xd9,0x01,0xda,0xd2,0xfd,0xc7,0x05,0xd5,0xfb,0x17,
-0x04,0xe9,0xfa,0x2b,0x00,0x01,0x00,0x44,0x00,0x00,0x07,0xa6,0x05,0xd5,0x00,0x0c,
-0x01,0x7b,0x40,0x49,0x05,0x1a,0x06,0x05,0x09,0x0a,0x09,0x04,0x1a,0x0a,0x09,0x03,
-0x1a,0x0a,0x0b,0x0a,0x02,0x1a,0x01,0x02,0x0b,0x0b,0x0a,0x06,0x11,0x07,0x08,0x07,
-0x05,0x11,0x04,0x05,0x08,0x08,0x07,0x02,0x11,0x03,0x02,0x0c,0x00,0x0c,0x01,0x11,
-0x00,0x00,0x0c,0x42,0x0a,0x05,0x02,0x03,0x06,0x03,0x00,0xaf,0x0b,0x08,0x0c,0x0b,
-0x0a,0x09,0x08,0x06,0x05,0x04,0x03,0x02,0x01,0x0b,0x07,0x00,0x0d,0x10,0xd4,0xcc,
-0x17,0x39,0x31,0x00,0x2f,0x3c,0xec,0x32,0x32,0x17,0x39,0x30,0x4b,0x53,0x58,0x07,
-0x10,0x05,0xed,0x07,0x10,0x08,0xed,0x07,0x10,0x08,0xed,0x07,0x10,0x05,0xed,0x07,
-0x10,0x08,0xed,0x07,0x10,0x05,0xed,0x07,0x05,0xed,0x07,0x10,0x08,0xed,0x59,0x22,
-0xb2,0x00,0x0e,0x01,0x01,0x5d,0x40,0xf2,0x06,0x02,0x06,0x05,0x02,0x0a,0x00,0x0a,
-0x00,0x0a,0x12,0x0a,0x28,0x05,0x24,0x0a,0x20,0x0a,0x3e,0x02,0x3e,0x05,0x34,0x0a,
-0x30,0x0a,0x4c,0x02,0x4d,0x05,0x42,0x0a,0x40,0x0a,0x59,0x02,0x6a,0x02,0x6b,0x05,
-0x67,0x0a,0x60,0x0a,0x7b,0x02,0x7f,0x02,0x7c,0x05,0x7f,0x05,0x80,0x0a,0x96,0x02,
-0x95,0x05,0x1d,0x07,0x00,0x09,0x02,0x08,0x03,0x00,0x04,0x06,0x05,0x00,0x05,0x00,
-0x06,0x01,0x07,0x04,0x08,0x00,0x08,0x07,0x09,0x00,0x09,0x04,0x0a,0x0a,0x0c,0x00,
-0x0e,0x1a,0x03,0x15,0x04,0x15,0x08,0x19,0x0c,0x10,0x0e,0x20,0x04,0x21,0x05,0x20,
-0x06,0x20,0x07,0x20,0x08,0x23,0x09,0x24,0x0a,0x25,0x0b,0x20,0x0e,0x20,0x0e,0x3c,
-0x02,0x3a,0x03,0x35,0x04,0x33,0x05,0x30,0x08,0x36,0x09,0x39,0x0b,0x3f,0x0c,0x30,
-0x0e,0x46,0x00,0x46,0x01,0x4a,0x02,0x40,0x04,0x45,0x05,0x40,0x05,0x42,0x06,0x42,
-0x07,0x42,0x08,0x40,0x08,0x40,0x09,0x44,0x0a,0x4d,0x0c,0x40,0x0e,0x40,0x0e,0x58,
-0x02,0x56,0x08,0x59,0x0c,0x50,0x0e,0x66,0x02,0x67,0x03,0x61,0x04,0x62,0x05,0x60,
-0x06,0x60,0x07,0x60,0x08,0x64,0x09,0x64,0x0a,0x64,0x0b,0x77,0x00,0x76,0x01,0x7b,
-0x02,0x78,0x03,0x77,0x04,0x74,0x05,0x79,0x06,0x79,0x07,0x77,0x08,0x70,0x08,0x78,
-0x0c,0x7f,0x0c,0x7f,0x0e,0x86,0x02,0x87,0x03,0x88,0x04,0x89,0x05,0x85,0x09,0x8a,
-0x0b,0x8f,0x0e,0x97,0x04,0x9f,0x0e,0xaf,0x0e,0x5b,0x5d,0x00,0x5d,0x13,0x33,0x09,
-0x01,0x33,0x09,0x01,0x33,0x01,0x23,0x09,0x01,0x23,0x44,0xcc,0x01,0x3a,0x01,0x39,
-0xe3,0x01,0x3a,0x01,0x39,0xcd,0xfe,0x89,0xfe,0xfe,0xc5,0xfe,0xc2,0xfe,0x05,0xd5,
-0xfb,0x12,0x04,0xee,0xfb,0x12,0x04,0xee,0xfa,0x2b,0x05,0x10,0xfa,0xf0,0x00,0x01,
-0x00,0x3d,0x00,0x00,0x05,0x3b,0x05,0xd5,0x00,0x0b,0x00,0x66,0x40,0x06,0x0d,0x04,
-0x06,0x00,0x0a,0x0c,0x10,0xd4,0xc4,0xdc,0xc4,0xc4,0x31,0xb4,0x80,0x00,0x7f,0x0a,
-0x02,0x5d,0x00,0x40,0x05,0x03,0x00,0xaf,0x09,0x06,0x2f,0x3c,0xec,0x32,0x30,0x4b,
-0xb0,0x42,0x50,0x58,0x40,0x14,0x07,0x11,0x06,0x06,0x05,0x09,0x11,0x0a,0x0b,0x0a,
-0x03,0x11,0x04,0x05,0x04,0x01,0x11,0x00,0x0b,0x00,0x05,0x07,0x10,0xec,0x07,0x10,
-0xec,0x07,0x10,0xec,0x07,0x10,0xec,0x40,0x14,0x0b,0x0a,0x03,0x07,0x00,0x08,0x09,
-0x04,0x07,0x00,0x05,0x09,0x04,0x06,0x01,0x02,0x0a,0x03,0x06,0x01,0x0f,0x0f,0x0f,
-0x0f,0x59,0x13,0x33,0x09,0x01,0x33,0x09,0x01,0x23,0x09,0x01,0x23,0x01,0x81,0xd9,
-0x01,0x73,0x01,0x75,0xd9,0xfe,0x20,0x02,0x00,0xd9,0xfe,0x5c,0xfe,0x59,0xda,0x02,
-0x15,0x05,0xd5,0xfd,0xd5,0x02,0x2b,0xfd,0x33,0xfc,0xf8,0x02,0x7b,0xfd,0x85,0x03,
-0x1d,0x00,0x00,0x01,0xff,0xfc,0x00,0x00,0x04,0xe7,0x05,0xd5,0x00,0x08,0x00,0x94,
-0x40,0x28,0x03,0x11,0x04,0x05,0x04,0x02,0x11,0x01,0x02,0x05,0x05,0x04,0x02,0x11,
-0x03,0x02,0x08,0x00,0x08,0x01,0x11,0x00,0x00,0x08,0x42,0x02,0x03,0x00,0xaf,0x06,
-0x02,0x07,0x04,0x40,0x05,0x1c,0x00,0x40,0x07,0x09,0x10,0xd4,0xe4,0xfc,0xe4,0x12,
-0x39,0x31,0x00,0x2f,0xec,0x32,0x39,0x30,0x4b,0x53,0x58,0x07,0x10,0x05,0xed,0x07,
-0x10,0x08,0xed,0x07,0x10,0x08,0xed,0x07,0x10,0x05,0xed,0x59,0x22,0xb2,0x00,0x0a,
-0x01,0x01,0x5d,0x40,0x3c,0x05,0x02,0x14,0x02,0x35,0x02,0x30,0x02,0x30,0x05,0x30,
-0x08,0x46,0x02,0x40,0x02,0x40,0x05,0x40,0x08,0x51,0x02,0x51,0x05,0x51,0x08,0x65,
-0x02,0x84,0x02,0x93,0x02,0x10,0x16,0x01,0x1a,0x03,0x1f,0x0a,0x26,0x01,0x29,0x03,
-0x37,0x01,0x38,0x03,0x40,0x0a,0x67,0x01,0x68,0x03,0x78,0x03,0x70,0x0a,0x9f,0x0a,
-0x0d,0x5d,0x00,0x5d,0x03,0x33,0x09,0x01,0x33,0x01,0x11,0x23,0x11,0x04,0xd9,0x01,
-0x9e,0x01,0x9b,0xd9,0xfd,0xf0,0xcb,0x05,0xd5,0xfd,0x9a,0x02,0x66,0xfc,0xf2,0xfd,
-0x39,0x02,0xc7,0x00,0x00,0x01,0x00,0x5c,0x00,0x00,0x05,0x1f,0x05,0xd5,0x00,0x09,
-0x00,0x90,0x40,0x1b,0x03,0x11,0x07,0x08,0x07,0x08,0x11,0x02,0x03,0x02,0x42,0x08,
-0x95,0x00,0x81,0x03,0x95,0x05,0x08,0x03,0x00,0x01,0x42,0x04,0x00,0x06,0x0a,0x10,
-0xdc,0x4b,0xb0,0x09,0x54,0x4b,0xb0,0x0a,0x54,0x5b,0x58,0xb9,0x00,0x06,0xff,0xc0,
-0x38,0x59,0xc4,0xd4,0xe4,0x11,0x39,0x39,0x31,0x00,0x2f,0xec,0xf4,0xec,0x30,0x4b,
-0x53,0x58,0x07,0x10,0x05,0xed,0x07,0x10,0x05,0xed,0x59,0x22,0x01,0x40,0x40,0x05,
-0x02,0x0a,0x07,0x18,0x07,0x29,0x02,0x26,0x07,0x38,0x07,0x48,0x02,0x47,0x07,0x48,
-0x08,0x09,0x05,0x03,0x0b,0x08,0x00,0x0b,0x16,0x03,0x1a,0x08,0x10,0x0b,0x2f,0x0b,
-0x35,0x03,0x39,0x08,0x3f,0x0b,0x47,0x03,0x4a,0x08,0x4f,0x0b,0x55,0x03,0x59,0x08,
-0x66,0x03,0x69,0x08,0x6f,0x0b,0x77,0x03,0x78,0x08,0x7f,0x0b,0x9f,0x0b,0x16,0x5d,
-0x00,0x5d,0x13,0x21,0x15,0x01,0x21,0x15,0x21,0x35,0x01,0x21,0x73,0x04,0x95,0xfc,
-0x50,0x03,0xc7,0xfb,0x3d,0x03,0xb0,0xfc,0x67,0x05,0xd5,0x9a,0xfb,0x6f,0xaa,0x9a,
-0x04,0x91,0x00,0x01,0x00,0xb0,0xfe,0xf2,0x02,0x58,0x06,0x14,0x00,0x07,0x00,0x3b,
-0x40,0x0f,0x04,0xa9,0x06,0xb2,0x02,0xa9,0x00,0xb1,0x08,0x05,0x01,0x03,0x43,0x00,
-0x08,0x10,0xdc,0x4b,0xb0,0x0c,0x54,0x58,0xb9,0x00,0x00,0x00,0x40,0x38,0x59,0x4b,
-0xb0,0x12,0x54,0x4b,0xb0,0x13,0x54,0x5b,0x58,0xb9,0x00,0x00,0xff,0xc0,0x38,0x59,
-0xfc,0xcc,0x32,0x31,0x00,0x10,0xfc,0xec,0xf4,0xec,0x30,0x13,0x21,0x15,0x23,0x11,
-0x33,0x15,0x21,0xb0,0x01,0xa8,0xf0,0xf0,0xfe,0x58,0x06,0x14,0x8f,0xf9,0xfc,0x8f,
-0x00,0x01,0x00,0x00,0xff,0x42,0x02,0xb2,0x05,0xd5,0x00,0x03,0x00,0x2d,0x40,0x14,
-0x02,0x1a,0x01,0x01,0x00,0x00,0x1a,0x03,0x03,0x02,0x42,0x01,0x9f,0x00,0x81,0x04,
-0x02,0x00,0x01,0x03,0x2f,0xc4,0x39,0x39,0x31,0x00,0x10,0xf4,0xec,0x30,0x4b,0x53,
-0x58,0x07,0x10,0x05,0xed,0x07,0x10,0x05,0xed,0x59,0x22,0x13,0x01,0x23,0x01,0xaa,
-0x02,0x08,0xaa,0xfd,0xf8,0x05,0xd5,0xf9,0x6d,0x06,0x93,0x00,0x00,0x01,0x00,0xc7,
-0xfe,0xf2,0x02,0x6f,0x06,0x14,0x00,0x07,0x00,0x30,0x40,0x10,0x03,0xa9,0x01,0xb2,
-0x05,0xa9,0x00,0xb1,0x08,0x00,0x43,0x04,0x06,0x02,0x04,0x08,0x10,0xfc,0x4b,0xb0,
-0x0f,0x54,0x4b,0xb0,0x10,0x54,0x5b,0x58,0xb9,0x00,0x02,0x00,0x40,0x38,0x59,0x3c,
-0xdc,0xec,0x31,0x00,0x10,0xfc,0xec,0xf4,0xec,0x30,0x01,0x11,0x21,0x35,0x33,0x11,
-0x23,0x35,0x02,0x6f,0xfe,0x58,0xef,0xef,0x06,0x14,0xf8,0xde,0x8f,0x06,0x04,0x8f,
-0x00,0x01,0x00,0xd9,0x03,0xa8,0x05,0xdb,0x05,0xd5,0x00,0x06,0x00,0x18,0x40,0x0a,
-0x03,0x04,0x01,0x00,0x81,0x07,0x03,0x01,0x05,0x07,0x10,0xdc,0xcc,0x39,0x31,0x00,
-0x10,0xf4,0xcc,0x32,0x39,0x30,0x09,0x01,0x23,0x09,0x01,0x23,0x01,0x03,0xbc,0x02,
-0x1f,0xc9,0xfe,0x48,0xfe,0x48,0xc9,0x02,0x1f,0x05,0xd5,0xfd,0xd3,0x01,0x8b,0xfe,
-0x75,0x02,0x2d,0x00,0x00,0x01,0xff,0xec,0xfe,0x1d,0x04,0x14,0xfe,0xac,0x00,0x03,
-0x00,0x0f,0xb5,0x00,0xa9,0x01,0x00,0x02,0x04,0x10,0xc4,0xc4,0x31,0x00,0xd4,0xec,
-0x30,0x01,0x15,0x21,0x35,0x04,0x14,0xfb,0xd8,0xfe,0xac,0x8f,0x8f,0x00,0x00,0x01,
-0x00,0xaa,0x04,0xf0,0x02,0x89,0x06,0x66,0x00,0x03,0x00,0x31,0x40,0x09,0x01,0xb4,
-0x00,0xb3,0x04,0x03,0x44,0x01,0x04,0x10,0xdc,0xec,0x31,0x00,0x10,0xf4,0xec,0x30,
-0x00,0x4b,0xb0,0x09,0x54,0x4b,0xb0,0x0e,0x54,0x5b,0x58,0xbd,0x00,0x04,0xff,0xc0,
-0x00,0x01,0x00,0x04,0x00,0x04,0x00,0x40,0x38,0x11,0x37,0x38,0x59,0x09,0x01,0x23,
-0x01,0x01,0x6f,0x01,0x1a,0x99,0xfe,0xba,0x06,0x66,0xfe,0x8a,0x01,0x76,0x00,0x02,
-0x00,0x7b,0xff,0xe3,0x04,0x2d,0x04,0x7b,0x00,0x0a,0x00,0x25,0x00,0xbc,0x40,0x27,
-0x19,0x1f,0x0b,0x17,0x09,0x0e,0x00,0xa9,0x17,0x06,0xb9,0x0e,0x11,0x20,0x86,0x1f,
-0xba,0x1c,0xb9,0x23,0xb8,0x11,0x8c,0x17,0x0c,0x00,0x17,0x03,0x18,0x0d,0x09,0x08,
-0x0b,0x1f,0x03,0x08,0x14,0x45,0x26,0x10,0xfc,0xec,0xcc,0xd4,0xec,0x32,0x32,0x11,
-0x39,0x39,0x31,0x00,0x2f,0xc4,0xe4,0xf4,0xfc,0xf4,0xec,0x10,0xc6,0xee,0x10,0xee,
-0x11,0x39,0x11,0x39,0x12,0x39,0x30,0x40,0x6e,0x30,0x1d,0x30,0x1e,0x30,0x1f,0x30,
-0x20,0x30,0x21,0x30,0x22,0x3f,0x27,0x40,0x1d,0x40,0x1e,0x40,0x1f,0x40,0x20,0x40,
-0x21,0x40,0x22,0x50,0x1d,0x50,0x1e,0x50,0x1f,0x50,0x20,0x50,0x21,0x50,0x22,0x50,
-0x27,0x70,0x27,0x85,0x1d,0x87,0x1e,0x87,0x1f,0x87,0x20,0x87,0x21,0x85,0x22,0x90,
-0x27,0xa0,0x27,0xf0,0x27,0x1e,0x30,0x1e,0x30,0x1f,0x30,0x20,0x30,0x21,0x40,0x1e,
-0x40,0x1f,0x40,0x20,0x40,0x21,0x50,0x1e,0x50,0x1f,0x50,0x20,0x50,0x21,0x60,0x1e,
-0x60,0x1f,0x60,0x20,0x60,0x21,0x70,0x1e,0x70,0x1f,0x70,0x20,0x70,0x21,0x80,0x1e,
-0x80,0x1f,0x80,0x20,0x80,0x21,0x18,0x5d,0x01,0x5d,0x01,0x22,0x06,0x15,0x14,0x16,
-0x33,0x32,0x36,0x3d,0x01,0x37,0x11,0x23,0x35,0x0e,0x01,0x23,0x22,0x26,0x35,0x34,
-0x36,0x33,0x21,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x35,0x3e,0x01,0x33,0x32,0x16,
-0x02,0xbe,0xdf,0xac,0x81,0x6f,0x99,0xb9,0xb8,0xb8,0x3f,0xbc,0x88,0xac,0xcb,0xfd,
-0xfb,0x01,0x02,0xa7,0x97,0x60,0xb6,0x54,0x65,0xbe,0x5a,0xf3,0xf0,0x02,0x33,0x66,
-0x7b,0x62,0x73,0xd9,0xb4,0x29,0x4c,0xfd,0x81,0xaa,0x66,0x61,0xc1,0xa2,0xbd,0xc0,
-0x12,0x7f,0x8b,0x2e,0x2e,0xaa,0x27,0x27,0xfc,0x00,0x00,0x02,0x00,0xba,0xff,0xe3,
-0x04,0xa4,0x06,0x14,0x00,0x0b,0x00,0x1c,0x00,0x38,0x40,0x19,0x03,0xb9,0x0c,0x0f,
-0x09,0xb9,0x18,0x15,0x8c,0x0f,0xb8,0x1b,0x97,0x19,0x00,0x12,0x12,0x47,0x18,0x0c,
-0x06,0x08,0x1a,0x46,0x1d,0x10,0xfc,0xec,0x32,0x32,0xf4,0xec,0x31,0x00,0x2f,0xec,
-0xe4,0xf4,0xc4,0xec,0x10,0xc6,0xee,0x30,0xb6,0x60,0x1e,0x80,0x1e,0xa0,0x1e,0x03,
-0x01,0x5d,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x3e,
-0x01,0x33,0x32,0x00,0x11,0x10,0x02,0x23,0x22,0x26,0x27,0x15,0x23,0x11,0x33,0x03,
-0xe5,0xa7,0x92,0x92,0xa7,0xa7,0x92,0x92,0xa7,0xfd,0x8e,0x3a,0xb1,0x7b,0xcc,0x00,
-0xff,0xff,0xcc,0x7b,0xb1,0x3a,0xb9,0xb9,0x02,0x2f,0xcb,0xe7,0xe7,0xcb,0xcb,0xe7,
-0xe7,0x02,0x52,0x64,0x61,0xfe,0xbc,0xfe,0xf8,0xfe,0xf8,0xfe,0xbc,0x61,0x64,0xa8,
-0x06,0x14,0x00,0x01,0x00,0x71,0xff,0xe3,0x03,0xe7,0x04,0x7b,0x00,0x19,0x00,0x3f,
-0x40,0x1b,0x00,0x86,0x01,0x88,0x04,0x0e,0x86,0x0d,0x88,0x0a,0xb9,0x11,0x04,0xb9,
-0x17,0xb8,0x11,0x8c,0x1a,0x07,0x12,0x0d,0x00,0x48,0x14,0x45,0x1a,0x10,0xfc,0xe4,
-0x32,0xec,0x31,0x00,0x10,0xe4,0xf4,0xec,0x10,0xfe,0xf4,0xee,0x10,0xf5,0xee,0x30,
-0x40,0x0b,0x0f,0x1b,0x10,0x1b,0x80,0x1b,0x90,0x1b,0xa0,0x1b,0x05,0x01,0x5d,0x01,
-0x15,0x2e,0x01,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x15,0x0e,0x01,
-0x23,0x22,0x00,0x11,0x10,0x00,0x21,0x32,0x16,0x03,0xe7,0x4e,0x9d,0x50,0xb3,0xc6,
-0xc6,0xb3,0x50,0x9d,0x4e,0x4d,0xa5,0x5d,0xfd,0xfe,0xd6,0x01,0x2d,0x01,0x06,0x55,
-0xa2,0x04,0x35,0xac,0x2b,0x2b,0xe3,0xcd,0xcd,0xe3,0x2b,0x2b,0xaa,0x24,0x24,0x01,
-0x3e,0x01,0x0e,0x01,0x12,0x01,0x3a,0x23,0x00,0x02,0x00,0x71,0xff,0xe3,0x04,0x5a,
-0x06,0x14,0x00,0x10,0x00,0x1c,0x00,0x38,0x40,0x19,0x1a,0xb9,0x00,0x0e,0x14,0xb9,
-0x05,0x08,0x8c,0x0e,0xb8,0x01,0x97,0x03,0x17,0x04,0x00,0x08,0x02,0x47,0x11,0x12,
-0x0b,0x45,0x1d,0x10,0xfc,0xec,0xf4,0xec,0x32,0x32,0x31,0x00,0x2f,0xec,0xe4,0xf4,
-0xc4,0xec,0x10,0xc4,0xee,0x30,0xb6,0x60,0x1e,0x80,0x1e,0xa0,0x1e,0x03,0x01,0x5d,
-0x01,0x11,0x33,0x11,0x23,0x35,0x0e,0x01,0x23,0x22,0x02,0x11,0x10,0x00,0x33,0x32,
-0x16,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x03,0xa2,0xb8,
-0xb8,0x3a,0xb1,0x7c,0xcb,0xff,0x00,0xff,0xcb,0x7c,0xb1,0xfd,0xc7,0xa7,0x92,0x92,
-0xa8,0xa8,0x92,0x92,0xa7,0x03,0xb6,0x02,0x5e,0xf9,0xec,0xa8,0x64,0x61,0x01,0x44,
-0x01,0x08,0x01,0x08,0x01,0x44,0x61,0xfe,0x15,0xcb,0xe7,0xe7,0xcb,0xcb,0xe7,0xe7,
-0x00,0x02,0x00,0x71,0xff,0xe3,0x04,0x7f,0x04,0x7b,0x00,0x14,0x00,0x1b,0x00,0x70,
-0x40,0x24,0x00,0x15,0x01,0x09,0x86,0x08,0x88,0x05,0x15,0xa9,0x01,0x05,0xb9,0x0c,
-0x01,0xbb,0x18,0xb9,0x12,0xb8,0x0c,0x8c,0x1c,0x1b,0x15,0x02,0x08,0x15,0x08,0x00,
-0x4b,0x02,0x12,0x0f,0x45,0x1c,0x10,0xfc,0xec,0xf4,0xec,0xc4,0x11,0x12,0x39,0x31,
-0x00,0x10,0xe4,0xf4,0xec,0xe4,0x10,0xee,0x10,0xee,0x10,0xf4,0xee,0x11,0x12,0x39,
-0x30,0x40,0x29,0x3f,0x1d,0x70,0x1d,0xa0,0x1d,0xd0,0x1d,0xf0,0x1d,0x05,0x3f,0x00,
-0x3f,0x01,0x3f,0x02,0x3f,0x15,0x3f,0x1b,0x05,0x2c,0x07,0x2f,0x08,0x2f,0x09,0x2c,
-0x0a,0x6f,0x00,0x6f,0x01,0x6f,0x02,0x6f,0x15,0x6f,0x1b,0x09,0x5d,0x71,0x01,0x5d,
-0x01,0x15,0x21,0x1e,0x01,0x33,0x32,0x36,0x37,0x15,0x0e,0x01,0x23,0x20,0x00,0x11,
-0x10,0x00,0x33,0x32,0x00,0x07,0x2e,0x01,0x23,0x22,0x06,0x07,0x04,0x7f,0xfc,0xb2,
-0x0c,0xcd,0xb7,0x6a,0xc7,0x62,0x63,0xd0,0x6b,0xfe,0xf4,0xfe,0xc7,0x01,0x29,0xfc,
-0xe2,0x01,0x07,0xb8,0x02,0xa5,0x88,0x9a,0xb9,0x0e,0x02,0x5e,0x5a,0xbe,0xc7,0x34,
-0x34,0xae,0x2a,0x2c,0x01,0x38,0x01,0x0a,0x01,0x13,0x01,0x43,0xfe,0xdd,0xc4,0x97,
-0xb4,0xae,0x9e,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x02,0xf8,0x06,0x14,0x00,0x13,
-0x00,0x59,0x40,0x1c,0x05,0x10,0x01,0x0c,0x08,0xa9,0x06,0x01,0x87,0x00,0x97,0x0e,
-0x06,0xbc,0x0a,0x02,0x13,0x07,0x00,0x07,0x09,0x05,0x08,0x0d,0x0f,0x0b,0x4c,0x14,
-0x10,0xfc,0x4b,0xb0,0x0a,0x54,0x58,0xb9,0x00,0x0b,0x00,0x40,0x38,0x59,0x4b,0xb0,
-0x0e,0x54,0x58,0xb9,0x00,0x0b,0xff,0xc0,0x38,0x59,0x3c,0xc4,0xfc,0x3c,0xc4,0xc4,
-0x12,0x39,0x39,0x31,0x00,0x2f,0xe4,0x32,0xfc,0xec,0x10,0xee,0x32,0x12,0x39,0x39,
-0x30,0x01,0xb6,0x40,0x15,0x50,0x15,0xa0,0x15,0x03,0x5d,0x01,0x15,0x23,0x22,0x06,
-0x1d,0x01,0x21,0x15,0x21,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x02,
-0xf8,0xb0,0x63,0x4d,0x01,0x2f,0xfe,0xd1,0xb9,0xb0,0xb0,0xae,0xbd,0x06,0x14,0x99,
-0x50,0x68,0x63,0x8f,0xfc,0x2f,0x03,0xd1,0x8f,0x4e,0xbb,0xab,0x00,0x02,0x00,0x71,
-0xfe,0x56,0x04,0x5a,0x04,0x7b,0x00,0x0b,0x00,0x28,0x00,0x4a,0x40,0x23,0x19,0x0c,
-0x1d,0x09,0x12,0x86,0x13,0x16,0xb9,0x0f,0x03,0xb9,0x26,0x23,0xb8,0x27,0xbc,0x09,
-0xb9,0x0f,0xbd,0x1a,0x1d,0x26,0x19,0x00,0x08,0x0c,0x47,0x06,0x12,0x12,0x20,0x45,
-0x29,0x10,0xfc,0xc4,0xec,0xf4,0xec,0x32,0x32,0x31,0x00,0x2f,0xc4,0xe4,0xec,0xe4,
-0xf4,0xc4,0xec,0x10,0xfe,0xd5,0xee,0x11,0x12,0x39,0x39,0x30,0xb6,0x60,0x2a,0x80,
-0x2a,0xa0,0x2a,0x03,0x01,0x5d,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,
-0x32,0x36,0x17,0x10,0x02,0x21,0x22,0x26,0x27,0x35,0x1e,0x01,0x33,0x32,0x36,0x3d,
-0x01,0x0e,0x01,0x23,0x22,0x02,0x11,0x10,0x12,0x33,0x32,0x16,0x17,0x35,0x33,0x03,
-0xa2,0xa5,0x95,0x94,0xa5,0xa5,0x94,0x95,0xa5,0xb8,0xfe,0xfe,0xfa,0x61,0xac,0x51,
-0x51,0x9e,0x52,0xb5,0xb4,0x39,0xb2,0x7c,0xce,0xfc,0xfc,0xce,0x7c,0xb2,0x39,0xb8,
-0x02,0x3d,0xc8,0xdc,0xdc,0xc8,0xc7,0xdc,0xdc,0xeb,0xfe,0xe2,0xfe,0xe9,0x1d,0x1e,
-0xb3,0x2c,0x2a,0xbd,0xbf,0x5b,0x63,0x62,0x01,0x3a,0x01,0x03,0x01,0x04,0x01,0x3a,
-0x62,0x63,0xaa,0x00,0x00,0x01,0x00,0xba,0x00,0x00,0x04,0x64,0x06,0x14,0x00,0x13,
-0x00,0x34,0x40,0x19,0x03,0x09,0x00,0x03,0x0e,0x01,0x06,0x87,0x0e,0x11,0xb8,0x0c,
-0x97,0x0a,0x01,0x02,0x08,0x00,0x4e,0x0d,0x09,0x08,0x0b,0x46,0x14,0x10,0xfc,0xec,
-0x32,0xf4,0xec,0x31,0x00,0x2f,0x3c,0xec,0xf4,0xc4,0xec,0x11,0x12,0x17,0x39,0x30,
-0xb2,0x60,0x15,0x01,0x01,0x5d,0x01,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,
-0x11,0x23,0x11,0x33,0x11,0x3e,0x01,0x33,0x32,0x16,0x04,0x64,0xb8,0x7c,0x7c,0x95,
-0xac,0xb9,0xb9,0x42,0xb3,0x75,0xc1,0xc6,0x02,0xa4,0xfd,0x5c,0x02,0x9e,0x9f,0x9e,
-0xbe,0xa4,0xfd,0x87,0x06,0x14,0xfd,0x9e,0x65,0x64,0xef,0x00,0x00,0x02,0x00,0xc1,
-0x00,0x00,0x01,0x79,0x06,0x14,0x00,0x03,0x00,0x07,0x00,0x2b,0x40,0x0e,0x06,0xbe,
-0x04,0xb1,0x00,0xbc,0x02,0x05,0x01,0x08,0x04,0x00,0x46,0x08,0x10,0xfc,0x3c,0xec,
-0x32,0x31,0x00,0x2f,0xe4,0xfc,0xec,0x30,0x40,0x0b,0x10,0x09,0x40,0x09,0x50,0x09,
-0x60,0x09,0x70,0x09,0x05,0x01,0x5d,0x13,0x33,0x11,0x23,0x11,0x33,0x15,0x23,0xc1,
-0xb8,0xb8,0xb8,0xb8,0x04,0x60,0xfb,0xa0,0x06,0x14,0xe9,0x00,0x00,0x02,0xff,0xdb,
-0xfe,0x56,0x01,0x79,0x06,0x14,0x00,0x0b,0x00,0x0f,0x00,0x44,0x40,0x1c,0x0b,0x02,
-0x07,0x00,0x0e,0xbe,0x0c,0x07,0x87,0x05,0xbd,0x00,0xbc,0x0c,0xb1,0x10,0x08,0x10,
-0x05,0x06,0x4f,0x0d,0x01,0x08,0x0c,0x00,0x46,0x10,0x10,0xfc,0x3c,0xec,0x32,0xe4,
-0x39,0x12,0x39,0x31,0x00,0x10,0xec,0xe4,0xf4,0xec,0x10,0xee,0x11,0x12,0x39,0x39,
-0x30,0x40,0x0b,0x10,0x11,0x40,0x11,0x50,0x11,0x60,0x11,0x70,0x11,0x05,0x01,0x5d,
-0x13,0x33,0x11,0x14,0x06,0x2b,0x01,0x35,0x33,0x32,0x36,0x35,0x11,0x33,0x15,0x23,
-0xc1,0xb8,0xa3,0xb5,0x46,0x31,0x69,0x4c,0xb8,0xb8,0x04,0x60,0xfb,0x8c,0xd6,0xc0,
-0x9c,0x61,0x99,0x06,0x28,0xe9,0x00,0x01,0x00,0xba,0x00,0x00,0x04,0x9c,0x06,0x14,
-0x00,0x0a,0x00,0xbc,0x40,0x29,0x08,0x11,0x05,0x06,0x05,0x07,0x11,0x06,0x06,0x05,
-0x03,0x11,0x04,0x05,0x04,0x02,0x11,0x05,0x05,0x04,0x42,0x08,0x05,0x02,0x03,0x03,
-0xbc,0x00,0x97,0x09,0x06,0x05,0x01,0x04,0x06,0x08,0x01,0x08,0x00,0x46,0x0b,0x10,
-0xfc,0xec,0x32,0xd4,0xc4,0x11,0x39,0x31,0x00,0x2f,0x3c,0xec,0xe4,0x17,0x39,0x30,
-0x4b,0x53,0x58,0x07,0x10,0x04,0xed,0x07,0x10,0x05,0xed,0x07,0x10,0x05,0xed,0x07,
-0x10,0x04,0xed,0x59,0x22,0xb2,0x10,0x0c,0x01,0x01,0x5d,0x40,0x5f,0x04,0x02,0x0a,
-0x08,0x16,0x02,0x27,0x02,0x29,0x05,0x2b,0x08,0x56,0x02,0x66,0x02,0x67,0x08,0x73,
-0x02,0x77,0x05,0x82,0x02,0x89,0x05,0x8e,0x08,0x93,0x02,0x96,0x05,0x97,0x08,0xa3,
-0x02,0x12,0x09,0x05,0x09,0x06,0x02,0x0b,0x03,0x0a,0x07,0x28,0x03,0x27,0x04,0x28,
-0x05,0x2b,0x06,0x2b,0x07,0x40,0x0c,0x68,0x03,0x60,0x0c,0x89,0x03,0x85,0x04,0x89,
-0x05,0x8d,0x06,0x8f,0x07,0x9a,0x03,0x97,0x07,0xaa,0x03,0xa7,0x05,0xb6,0x07,0xc5,
-0x07,0xd6,0x07,0xf7,0x03,0xf0,0x03,0xf7,0x04,0xf0,0x04,0x1a,0x5d,0x71,0x00,0x5d,
-0x13,0x33,0x11,0x01,0x33,0x09,0x01,0x23,0x01,0x11,0x23,0xba,0xb9,0x02,0x25,0xeb,
-0xfd,0xae,0x02,0x6b,0xf0,0xfd,0xc7,0xb9,0x06,0x14,0xfc,0x69,0x01,0xe3,0xfd,0xf4,
-0xfd,0xac,0x02,0x23,0xfd,0xdd,0x00,0x01,0x00,0xc1,0x00,0x00,0x01,0x79,0x06,0x14,
-0x00,0x03,0x00,0x22,0xb7,0x00,0x97,0x02,0x01,0x08,0x00,0x46,0x04,0x10,0xfc,0xec,
-0x31,0x00,0x2f,0xec,0x30,0x40,0x0d,0x10,0x05,0x40,0x05,0x50,0x05,0x60,0x05,0x70,
-0x05,0xf0,0x05,0x06,0x01,0x5d,0x13,0x33,0x11,0x23,0xc1,0xb8,0xb8,0x06,0x14,0xf9,
-0xec,0x00,0x00,0x01,0x00,0xba,0x00,0x00,0x07,0x1d,0x04,0x7b,0x00,0x22,0x00,0x5a,
-0x40,0x26,0x06,0x12,0x09,0x18,0x0f,0x00,0x06,0x1d,0x07,0x15,0x0c,0x87,0x1d,0x20,
-0x03,0xb8,0x1b,0xbc,0x19,0x10,0x07,0x00,0x11,0x0f,0x08,0x08,0x06,0x50,0x11,0x08,
-0x0f,0x50,0x1c,0x18,0x08,0x1a,0x46,0x23,0x10,0xfc,0xec,0x32,0xfc,0xfc,0xfc,0xec,
-0x11,0x12,0x39,0x31,0x00,0x2f,0x3c,0x3c,0xe4,0xf4,0x3c,0xc4,0xec,0x32,0x11,0x12,
-0x17,0x39,0x30,0x40,0x13,0x30,0x24,0x50,0x24,0x70,0x24,0x90,0x24,0xa0,0x24,0xa0,
-0x24,0xbf,0x24,0xdf,0x24,0xff,0x24,0x09,0x01,0x5d,0x01,0x3e,0x01,0x33,0x32,0x16,
-0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x26,0x23,
-0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x3e,0x01,0x33,0x32,0x16,0x04,0x29,0x45,
-0xc0,0x82,0xaf,0xbe,0xb9,0x72,0x75,0x8f,0xa6,0xb9,0x72,0x77,0x8d,0xa6,0xb9,0xb9,
-0x3f,0xb0,0x79,0x7a,0xab,0x03,0x89,0x7c,0x76,0xf5,0xe2,0xfd,0x5c,0x02,0x9e,0xa1,
-0x9c,0xbe,0xa4,0xfd,0x87,0x02,0x9e,0xa2,0x9b,0xbf,0xa3,0xfd,0x87,0x04,0x60,0xae,
-0x67,0x62,0x7c,0x00,0x00,0x01,0x00,0xba,0x00,0x00,0x04,0x64,0x04,0x7b,0x00,0x13,
-0x00,0x36,0x40,0x19,0x03,0x09,0x00,0x03,0x0e,0x01,0x06,0x87,0x0e,0x11,0xb8,0x0c,
-0xbc,0x0a,0x01,0x02,0x08,0x00,0x4e,0x0d,0x09,0x08,0x0b,0x46,0x14,0x10,0xfc,0xec,
-0x32,0xf4,0xec,0x31,0x00,0x2f,0x3c,0xe4,0xf4,0xc4,0xec,0x11,0x12,0x17,0x39,0x30,
-0xb4,0x60,0x15,0xcf,0x15,0x02,0x01,0x5d,0x01,0x11,0x23,0x11,0x34,0x26,0x23,0x22,
-0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x3e,0x01,0x33,0x32,0x16,0x04,0x64,0xb8,0x7c,
-0x7c,0x95,0xac,0xb9,0xb9,0x42,0xb3,0x75,0xc1,0xc6,0x02,0xa4,0xfd,0x5c,0x02,0x9e,
-0x9f,0x9e,0xbe,0xa4,0xfd,0x87,0x04,0x60,0xae,0x65,0x64,0xef,0x00,0x02,0x00,0x71,
-0xff,0xe3,0x04,0x75,0x04,0x7b,0x00,0x0b,0x00,0x17,0x00,0x4a,0x40,0x13,0x06,0xb9,
-0x12,0x00,0xb9,0x0c,0xb8,0x12,0x8c,0x18,0x09,0x12,0x0f,0x51,0x03,0x12,0x15,0x45,
-0x18,0x10,0xfc,0xec,0xf4,0xec,0x31,0x00,0x10,0xe4,0xf4,0xec,0x10,0xee,0x30,0x40,
-0x23,0x3f,0x19,0x7b,0x00,0x7b,0x06,0x7f,0x07,0x7f,0x08,0x7f,0x09,0x7f,0x0a,0x7f,
-0x0b,0x7b,0x0c,0x7f,0x0d,0x7f,0x0e,0x7f,0x0f,0x7f,0x10,0x7f,0x11,0x7b,0x12,0xa0,
-0x19,0xf0,0x19,0x11,0x01,0x5d,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,
-0x34,0x26,0x27,0x32,0x00,0x11,0x10,0x00,0x23,0x22,0x00,0x11,0x10,0x00,0x02,0x73,
-0x94,0xac,0xab,0x95,0x93,0xac,0xac,0x93,0xf0,0x01,0x12,0xfe,0xee,0xf0,0xf1,0xfe,
-0xef,0x01,0x11,0x03,0xdf,0xe7,0xc9,0xc9,0xe7,0xe8,0xc8,0xc7,0xe9,0x9c,0xfe,0xc8,
-0xfe,0xec,0xfe,0xed,0xfe,0xc7,0x01,0x39,0x01,0x13,0x01,0x14,0x01,0x38,0x00,0x02,
-0x00,0xba,0xfe,0x56,0x04,0xa4,0x04,0x7b,0x00,0x10,0x00,0x1c,0x00,0x3e,0x40,0x1b,
-0x1a,0xb9,0x00,0x0e,0x14,0xb9,0x05,0x08,0xb8,0x0e,0x8c,0x01,0xbd,0x03,0xbc,0x1d,
-0x11,0x12,0x0b,0x47,0x17,0x04,0x00,0x08,0x02,0x46,0x1d,0x10,0xfc,0xec,0x32,0x32,
-0xf4,0xec,0x31,0x00,0x10,0xe4,0xe4,0xe4,0xf4,0xc4,0xec,0x10,0xc4,0xee,0x30,0x40,
-0x09,0x60,0x1e,0x80,0x1e,0xa0,0x1e,0xe0,0x1e,0x04,0x01,0x5d,0x25,0x11,0x23,0x11,
-0x33,0x15,0x3e,0x01,0x33,0x32,0x00,0x11,0x10,0x02,0x23,0x22,0x26,0x01,0x34,0x26,
-0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x73,0xb9,0xb9,0x3a,0xb1,0x7b,
-0xcc,0x00,0xff,0xff,0xcc,0x7b,0xb1,0x02,0x38,0xa7,0x92,0x92,0xa7,0xa7,0x92,0x92,
-0xa7,0xa8,0xfd,0xae,0x06,0x0a,0xaa,0x64,0x61,0xfe,0xbc,0xfe,0xf8,0xfe,0xf8,0xfe,
-0xbc,0x61,0x01,0xeb,0xcb,0xe7,0xe7,0xcb,0xcb,0xe7,0xe7,0x00,0x00,0x02,0x00,0x71,
-0xfe,0x56,0x04,0x5a,0x04,0x7b,0x00,0x0b,0x00,0x1c,0x00,0x3e,0x40,0x1b,0x03,0xb9,
-0x0c,0x0f,0x09,0xb9,0x18,0x15,0xb8,0x0f,0x8c,0x1b,0xbd,0x19,0xbc,0x1d,0x18,0x0c,
-0x06,0x08,0x1a,0x47,0x00,0x12,0x12,0x45,0x1d,0x10,0xfc,0xec,0xf4,0xec,0x32,0x32,
-0x31,0x00,0x10,0xe4,0xe4,0xe4,0xf4,0xc4,0xec,0x10,0xc6,0xee,0x30,0x40,0x09,0x60,
-0x1e,0x80,0x1e,0xa0,0x1e,0xe0,0x1e,0x04,0x01,0x5d,0x01,0x14,0x16,0x33,0x32,0x36,
-0x35,0x34,0x26,0x23,0x22,0x06,0x01,0x0e,0x01,0x23,0x22,0x02,0x11,0x10,0x00,0x33,
-0x32,0x16,0x17,0x35,0x33,0x11,0x23,0x01,0x2f,0xa7,0x92,0x92,0xa8,0xa8,0x92,0x92,
-0xa7,0x02,0x73,0x3a,0xb1,0x7c,0xcb,0xff,0x00,0xff,0xcb,0x7c,0xb1,0x3a,0xb8,0xb8,
-0x02,0x2f,0xcb,0xe7,0xe7,0xcb,0xcb,0xe7,0xe7,0xfd,0xae,0x64,0x61,0x01,0x44,0x01,
-0x08,0x01,0x08,0x01,0x44,0x61,0x64,0xaa,0xf9,0xf6,0x00,0x01,0x00,0xba,0x00,0x00,
-0x03,0x4a,0x04,0x7b,0x00,0x11,0x00,0x30,0x40,0x14,0x06,0x0b,0x07,0x00,0x11,0x0b,
-0x03,0x87,0x0e,0xb8,0x09,0xbc,0x07,0x0a,0x06,0x08,0x00,0x08,0x46,0x12,0x10,0xfc,
-0xc4,0xec,0x32,0x31,0x00,0x2f,0xe4,0xf4,0xec,0xc4,0xd4,0xcc,0x11,0x12,0x39,0x30,
-0xb4,0x50,0x13,0x9f,0x13,0x02,0x01,0x5d,0x01,0x2e,0x01,0x23,0x22,0x06,0x15,0x11,
-0x23,0x11,0x33,0x15,0x3e,0x01,0x33,0x32,0x16,0x17,0x03,0x4a,0x1f,0x49,0x2c,0x9c,
-0xa7,0xb9,0xb9,0x3a,0xba,0x85,0x13,0x2e,0x1c,0x03,0xb4,0x12,0x11,0xcb,0xbe,0xfd,
-0xb2,0x04,0x60,0xae,0x66,0x63,0x05,0x05,0x00,0x01,0x00,0x6f,0xff,0xe3,0x03,0xc7,
-0x04,0x7b,0x00,0x27,0x00,0xe7,0x40,0x3c,0x0d,0x0c,0x02,0x0e,0x0b,0x53,0x1f,0x1e,
-0x08,0x09,0x02,0x07,0x0a,0x53,0x1e,0x1f,0x1e,0x42,0x0a,0x0b,0x1e,0x1f,0x04,0x15,
-0x00,0x86,0x01,0x89,0x04,0x14,0x86,0x15,0x89,0x18,0xb9,0x11,0x04,0xb9,0x25,0xb8,
-0x11,0x8c,0x28,0x1e,0x0a,0x0b,0x1f,0x1b,0x07,0x00,0x52,0x1b,0x08,0x0e,0x07,0x08,
-0x14,0x22,0x45,0x28,0x10,0xfc,0xc4,0xec,0xd4,0xec,0xe4,0x11,0x12,0x39,0x39,0x39,
-0x39,0x31,0x00,0x10,0xe4,0xf4,0xec,0x10,0xfe,0xf5,0xee,0x10,0xf5,0xee,0x12,0x17,
-0x39,0x30,0x4b,0x53,0x58,0x07,0x10,0x0e,0xed,0x11,0x17,0x39,0x07,0x0e,0xed,0x11,
-0x17,0x39,0x59,0x22,0xb2,0x00,0x27,0x01,0x01,0x5d,0x40,0x6d,0x1c,0x0a,0x1c,0x0b,
-0x1c,0x0c,0x2e,0x09,0x2c,0x0a,0x2c,0x0b,0x2c,0x0c,0x3b,0x09,0x3b,0x0a,0x3b,0x0b,
-0x3b,0x0c,0x0b,0x20,0x00,0x20,0x01,0x24,0x02,0x28,0x0a,0x28,0x0b,0x2a,0x13,0x2f,
-0x14,0x2f,0x15,0x2a,0x16,0x28,0x1e,0x28,0x1f,0x29,0x20,0x29,0x21,0x24,0x27,0x86,
-0x0a,0x86,0x0b,0x86,0x0c,0x86,0x0d,0x12,0x00,0x00,0x00,0x01,0x02,0x02,0x06,0x0a,
-0x06,0x0b,0x03,0x0c,0x03,0x0d,0x03,0x0e,0x03,0x0f,0x03,0x10,0x03,0x19,0x03,0x1a,
-0x03,0x1b,0x03,0x1c,0x04,0x1d,0x09,0x27,0x2f,0x29,0x3f,0x29,0x5f,0x29,0x7f,0x29,
-0x80,0x29,0x90,0x29,0xa0,0x29,0xf0,0x29,0x18,0x5d,0x00,0x5d,0x71,0x01,0x15,0x2e,
-0x01,0x23,0x22,0x06,0x15,0x14,0x16,0x1f,0x01,0x1e,0x01,0x15,0x14,0x06,0x23,0x22,
-0x26,0x27,0x35,0x1e,0x01,0x33,0x32,0x36,0x35,0x34,0x26,0x2f,0x01,0x2e,0x01,0x35,
-0x34,0x36,0x33,0x32,0x16,0x03,0x8b,0x4e,0xa8,0x5a,0x89,0x89,0x62,0x94,0x3f,0xc4,
-0xa5,0xf7,0xd8,0x5a,0xc3,0x6c,0x66,0xc6,0x61,0x82,0x8c,0x65,0xab,0x40,0xab,0x98,
-0xe0,0xce,0x66,0xb4,0x04,0x3f,0xae,0x28,0x28,0x54,0x54,0x40,0x49,0x21,0x0e,0x2a,
-0x99,0x89,0x9c,0xb6,0x23,0x23,0xbe,0x35,0x35,0x59,0x51,0x4b,0x50,0x25,0x0f,0x24,
-0x95,0x82,0x9e,0xac,0x1e,0x00,0x00,0x01,0x00,0x37,0x00,0x00,0x02,0xf2,0x05,0x9e,
-0x00,0x13,0x00,0x38,0x40,0x19,0x0e,0x05,0x08,0x0f,0x03,0xa9,0x00,0x11,0x01,0xbc,
-0x08,0x87,0x0a,0x0b,0x08,0x09,0x02,0x04,0x00,0x08,0x10,0x12,0x0e,0x46,0x14,0x10,
-0xfc,0x3c,0xc4,0xfc,0x3c,0xc4,0x32,0x39,0x39,0x31,0x00,0x2f,0xec,0xf4,0x3c,0xc4,
-0xec,0x32,0x11,0x39,0x39,0x30,0xb2,0xaf,0x15,0x01,0x01,0x5d,0x01,0x11,0x21,0x15,
-0x21,0x11,0x14,0x16,0x3b,0x01,0x15,0x23,0x22,0x26,0x35,0x11,0x23,0x35,0x33,0x11,
-0x01,0x77,0x01,0x7b,0xfe,0x85,0x4b,0x73,0xbd,0xbd,0xd5,0xa2,0x87,0x87,0x05,0x9e,
-0xfe,0xc2,0x8f,0xfd,0xa0,0x89,0x4e,0x9a,0x9f,0xd2,0x02,0x60,0x8f,0x01,0x3e,0x00,
-0x00,0x01,0x00,0xae,0xff,0xe3,0x04,0x58,0x04,0x60,0x00,0x13,0x00,0x36,0x40,0x19,
-0x03,0x09,0x00,0x03,0x0e,0x01,0x06,0x87,0x0e,0x11,0x8c,0x0a,0x01,0xbc,0x0c,0x0d,
-0x09,0x08,0x0b,0x4e,0x02,0x08,0x00,0x46,0x14,0x10,0xfc,0xec,0xf4,0xec,0x32,0x31,
-0x00,0x2f,0xe4,0x32,0xf4,0xc4,0xec,0x11,0x12,0x17,0x39,0x30,0xb4,0x60,0x15,0xcf,
-0x15,0x02,0x01,0x5d,0x13,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,
-0x11,0x23,0x35,0x0e,0x01,0x23,0x22,0x26,0xae,0xb8,0x7c,0x7c,0x95,0xad,0xb8,0xb8,
-0x43,0xb1,0x75,0xc1,0xc8,0x01,0xba,0x02,0xa6,0xfd,0x61,0x9f,0x9f,0xbe,0xa4,0x02,
-0x7b,0xfb,0xa0,0xac,0x66,0x63,0xf0,0x00,0x00,0x01,0x00,0x3d,0x00,0x00,0x04,0x7f,
-0x04,0x60,0x00,0x06,0x00,0xfb,0x40,0x27,0x03,0x11,0x04,0x05,0x04,0x02,0x11,0x01,
-0x02,0x05,0x05,0x04,0x02,0x11,0x03,0x02,0x06,0x00,0x06,0x01,0x11,0x00,0x00,0x06,
-0x42,0x02,0x03,0x00,0xbf,0x05,0x06,0x05,0x03,0x02,0x01,0x05,0x04,0x00,0x07,0x10,
-0xd4,0x4b,0xb0,0x0a,0x54,0x58,0xb9,0x00,0x00,0x00,0x40,0x38,0x59,0x4b,0xb0,0x14,
-0x54,0x4b,0xb0,0x15,0x54,0x5b,0x58,0xb9,0x00,0x00,0xff,0xc0,0x38,0x59,0xc4,0x17,
-0x39,0x31,0x00,0x2f,0xec,0x32,0x39,0x30,0x4b,0x53,0x58,0x07,0x10,0x05,0xed,0x07,
-0x10,0x08,0xed,0x07,0x10,0x08,0xed,0x07,0x10,0x05,0xed,0x59,0x22,0x01,0x40,0x8e,
-0x48,0x02,0x6a,0x02,0x7b,0x02,0x7f,0x02,0x86,0x02,0x80,0x02,0x91,0x02,0xa4,0x02,
-0x08,0x06,0x00,0x06,0x01,0x09,0x03,0x09,0x04,0x15,0x00,0x15,0x01,0x1a,0x03,0x1a,
-0x04,0x26,0x00,0x26,0x01,0x29,0x03,0x29,0x04,0x20,0x08,0x35,0x00,0x35,0x01,0x3a,
-0x03,0x3a,0x04,0x30,0x08,0x46,0x00,0x46,0x01,0x49,0x03,0x49,0x04,0x46,0x05,0x48,
-0x06,0x40,0x08,0x56,0x00,0x56,0x01,0x59,0x03,0x59,0x04,0x50,0x08,0x66,0x00,0x66,
-0x01,0x69,0x03,0x69,0x04,0x67,0x05,0x68,0x06,0x60,0x08,0x75,0x00,0x74,0x01,0x7b,
-0x03,0x7b,0x04,0x75,0x05,0x7a,0x06,0x85,0x00,0x85,0x01,0x89,0x03,0x89,0x04,0x89,
-0x05,0x86,0x06,0x96,0x00,0x96,0x01,0x97,0x02,0x9a,0x03,0x98,0x04,0x98,0x05,0x97,
-0x06,0xa8,0x05,0xa7,0x06,0xb0,0x08,0xc0,0x08,0xdf,0x08,0xff,0x08,0x3e,0x5d,0x00,
-0x5d,0x13,0x33,0x09,0x01,0x33,0x01,0x23,0x3d,0xc3,0x01,0x5e,0x01,0x5e,0xc3,0xfe,
-0x5c,0xfa,0x04,0x60,0xfc,0x54,0x03,0xac,0xfb,0xa0,0x00,0x01,0x00,0x56,0x00,0x00,
-0x06,0x35,0x04,0x60,0x00,0x0c,0x01,0xeb,0x40,0x49,0x05,0x55,0x06,0x05,0x09,0x0a,
-0x09,0x04,0x55,0x0a,0x09,0x03,0x55,0x0a,0x0b,0x0a,0x02,0x55,0x01,0x02,0x0b,0x0b,
-0x0a,0x06,0x11,0x07,0x08,0x07,0x05,0x11,0x04,0x05,0x08,0x08,0x07,0x02,0x11,0x03,
-0x02,0x0c,0x00,0x0c,0x01,0x11,0x00,0x00,0x0c,0x42,0x0a,0x05,0x02,0x03,0x06,0x03,
-0x00,0xbf,0x0b,0x08,0x0c,0x0b,0x0a,0x09,0x08,0x06,0x05,0x04,0x03,0x02,0x01,0x0b,
-0x07,0x00,0x0d,0x10,0xd4,0x4b,0xb0,0x0a,0x54,0x4b,0xb0,0x11,0x54,0x5b,0x4b,0xb0,
-0x12,0x54,0x5b,0x4b,0xb0,0x13,0x54,0x5b,0x4b,0xb0,0x0b,0x54,0x5b,0x58,0xb9,0x00,
-0x00,0x00,0x40,0x38,0x59,0x01,0x4b,0xb0,0x0c,0x54,0x4b,0xb0,0x0d,0x54,0x5b,0x4b,
-0xb0,0x10,0x54,0x5b,0x58,0xb9,0x00,0x00,0xff,0xc0,0x38,0x59,0xcc,0x17,0x39,0x31,
-0x00,0x2f,0x3c,0xec,0x32,0x32,0x17,0x39,0x30,0x4b,0x53,0x58,0x07,0x10,0x05,0xed,
-0x07,0x10,0x08,0xed,0x07,0x10,0x08,0xed,0x07,0x10,0x05,0xed,0x07,0x10,0x08,0xed,
-0x07,0x10,0x05,0xed,0x07,0x05,0xed,0x07,0x10,0x08,0xed,0x59,0x22,0x01,0x40,0xff,
-0x05,0x02,0x16,0x02,0x16,0x05,0x22,0x0a,0x35,0x0a,0x49,0x02,0x49,0x05,0x46,0x0a,
-0x40,0x0a,0x5b,0x02,0x5b,0x05,0x55,0x0a,0x50,0x0a,0x6e,0x02,0x6e,0x05,0x66,0x0a,
-0x79,0x02,0x7f,0x02,0x79,0x05,0x7f,0x05,0x87,0x02,0x99,0x02,0x98,0x05,0x94,0x0a,
-0xbc,0x02,0xbc,0x05,0xce,0x02,0xc7,0x03,0xcf,0x05,0x1d,0x05,0x02,0x09,0x03,0x06,
-0x04,0x0b,0x05,0x0a,0x08,0x0b,0x09,0x04,0x0b,0x05,0x0c,0x15,0x02,0x19,0x03,0x16,
-0x04,0x1a,0x05,0x1b,0x08,0x1b,0x09,0x14,0x0b,0x15,0x0c,0x25,0x00,0x25,0x01,0x23,
-0x02,0x27,0x03,0x21,0x04,0x25,0x05,0x22,0x06,0x22,0x07,0x25,0x08,0x27,0x09,0x24,
-0x0a,0x21,0x0b,0x23,0x0c,0x39,0x03,0x36,0x04,0x36,0x08,0x39,0x0c,0x30,0x0e,0x46,
-0x02,0x48,0x03,0x46,0x04,0x40,0x04,0x42,0x05,0x40,0x06,0x40,0x07,0x40,0x08,0x44,
-0x09,0x44,0x0a,0x44,0x0b,0x40,0x0e,0x40,0x0e,0x56,0x00,0x56,0x01,0x56,0x02,0x50,
-0x04,0x51,0x05,0x52,0x06,0x52,0x07,0x50,0x08,0x53,0x09,0x54,0x0a,0x55,0x0b,0x63,
-0x00,0x64,0x01,0x65,0x02,0x6a,0x03,0x65,0x04,0x6a,0x05,0x6a,0x06,0x6a,0x07,0x6e,
-0x09,0x61,0x0b,0x67,0x0c,0x6f,0x0e,0x75,0x00,0x75,0x01,0x79,0x02,0x7d,0x03,0x78,
-0x04,0x7d,0x05,0x7a,0x06,0x7f,0x06,0x7a,0x07,0x7f,0x07,0x78,0x08,0x79,0x09,0x7f,
-0x09,0x7b,0x0a,0x76,0x0b,0x7d,0x0c,0x87,0x02,0x88,0x05,0x8f,0x0e,0x97,0x00,0x97,
-0x01,0x94,0x02,0x93,0x03,0x9c,0x04,0x9b,0x05,0x98,0x06,0x98,0x07,0x99,0x08,0x40,
-0x2f,0x96,0x0c,0x9f,0x0e,0xa6,0x00,0xa6,0x01,0xa4,0x02,0xa4,0x03,0xab,0x04,0xab,
-0x05,0xa9,0x06,0xa9,0x07,0xab,0x08,0xa4,0x0c,0xaf,0x0e,0xb5,0x02,0xb1,0x03,0xbd,
-0x04,0xbb,0x05,0xb8,0x09,0xbf,0x0e,0xc4,0x02,0xc3,0x03,0xcc,0x04,0xca,0x05,0x79,
-0x5d,0x00,0x5d,0x13,0x33,0x1b,0x01,0x33,0x1b,0x01,0x33,0x01,0x23,0x0b,0x01,0x23,
-0x56,0xb8,0xe6,0xe5,0xd9,0xe6,0xe5,0xb8,0xfe,0xdb,0xd9,0xf1,0xf2,0xd9,0x04,0x60,
-0xfc,0x96,0x03,0x6a,0xfc,0x96,0x03,0x6a,0xfb,0xa0,0x03,0x96,0xfc,0x6a,0x00,0x01,
-0x00,0x3b,0x00,0x00,0x04,0x79,0x04,0x60,0x00,0x0b,0x01,0x43,0x40,0x46,0x05,0x11,
-0x06,0x07,0x06,0x04,0x11,0x03,0x04,0x07,0x07,0x06,0x04,0x11,0x05,0x04,0x01,0x02,
-0x01,0x03,0x11,0x02,0x02,0x01,0x0b,0x11,0x00,0x01,0x00,0x0a,0x11,0x09,0x0a,0x01,
-0x01,0x00,0x0a,0x11,0x0b,0x0a,0x07,0x08,0x07,0x09,0x11,0x08,0x08,0x07,0x42,0x0a,
-0x07,0x04,0x01,0x04,0x08,0x00,0xbf,0x05,0x02,0x0a,0x07,0x04,0x01,0x04,0x08,0x00,
-0x02,0x08,0x06,0x0c,0x10,0xd4,0x4b,0xb0,0x0a,0x54,0x4b,0xb0,0x0f,0x54,0x5b,0x4b,
-0xb0,0x10,0x54,0x5b,0x4b,0xb0,0x11,0x54,0x5b,0x58,0xb9,0x00,0x06,0x00,0x40,0x38,
-0x59,0x4b,0xb0,0x14,0x54,0x58,0xb9,0x00,0x06,0xff,0xc0,0x38,0x59,0xc4,0xd4,0xc4,
-0x11,0x17,0x39,0x31,0x00,0x2f,0x3c,0xec,0x32,0x17,0x39,0x30,0x4b,0x53,0x58,0x07,
-0x10,0x05,0xed,0x07,0x10,0x08,0xed,0x07,0x10,0x08,0xed,0x07,0x10,0x05,0xed,0x07,
-0x10,0x05,0xed,0x07,0x10,0x08,0xed,0x07,0x10,0x08,0xed,0x07,0x10,0x05,0xed,0x59,
-0x22,0x01,0x40,0x98,0x0a,0x04,0x04,0x0a,0x1a,0x04,0x15,0x0a,0x26,0x0a,0x3d,0x04,
-0x31,0x0a,0x55,0x04,0x57,0x07,0x58,0x0a,0x66,0x0a,0x76,0x01,0x7a,0x04,0x76,0x07,
-0x74,0x0a,0x8d,0x04,0x82,0x0a,0x99,0x04,0x9f,0x04,0x97,0x07,0x92,0x0a,0x90,0x0a,
-0xa6,0x01,0xa9,0x04,0xaf,0x04,0xa5,0x07,0xa3,0x0a,0xa0,0x0a,0x1c,0x0a,0x03,0x04,
-0x05,0x05,0x09,0x0a,0x0b,0x1a,0x03,0x15,0x05,0x15,0x09,0x1a,0x0b,0x29,0x03,0x26,
-0x05,0x25,0x09,0x2a,0x0b,0x20,0x0d,0x3a,0x01,0x39,0x03,0x37,0x05,0x34,0x07,0x36,
-0x09,0x39,0x0b,0x30,0x0d,0x49,0x03,0x46,0x05,0x45,0x09,0x4a,0x0b,0x40,0x0d,0x59,
-0x00,0x56,0x01,0x59,0x02,0x59,0x03,0x57,0x05,0x56,0x06,0x59,0x07,0x56,0x08,0x56,
-0x09,0x59,0x0b,0x50,0x0d,0x6f,0x0d,0x78,0x01,0x7f,0x0d,0x9b,0x01,0x94,0x07,0xab,
-0x01,0xa4,0x07,0xb0,0x0d,0xcf,0x0d,0xdf,0x0d,0xff,0x0d,0x2f,0x5d,0x00,0x5d,0x09,
-0x02,0x23,0x09,0x01,0x23,0x09,0x01,0x33,0x09,0x01,0x04,0x64,0xfe,0x6b,0x01,0xaa,
-0xd9,0xfe,0xba,0xfe,0xba,0xd9,0x01,0xb3,0xfe,0x72,0xd9,0x01,0x29,0x01,0x29,0x04,
-0x60,0xfd,0xdf,0xfd,0xc1,0x01,0xb8,0xfe,0x48,0x02,0x4a,0x02,0x16,0xfe,0x71,0x01,
-0x8f,0x00,0x00,0x01,0x00,0x3d,0xfe,0x56,0x04,0x7f,0x04,0x60,0x00,0x0f,0x01,0x8b,
-0x40,0x43,0x07,0x08,0x02,0x09,0x11,0x00,0x0f,0x0a,0x11,0x0b,0x0a,0x00,0x00,0x0f,
-0x0e,0x11,0x0f,0x00,0x0f,0x0d,0x11,0x0c,0x0d,0x00,0x00,0x0f,0x0d,0x11,0x0e,0x0d,
-0x0a,0x0b,0x0a,0x0c,0x11,0x0b,0x0b,0x0a,0x42,0x0d,0x0b,0x09,0x10,0x00,0x0b,0x05,
-0x87,0x03,0xbd,0x0e,0x0b,0xbc,0x10,0x0e,0x0d,0x0c,0x0a,0x09,0x06,0x03,0x00,0x08,
-0x0f,0x04,0x0f,0x0b,0x10,0x10,0xd4,0x4b,0xb0,0x0a,0x54,0x4b,0xb0,0x08,0x54,0x5b,
-0x58,0xb9,0x00,0x0b,0x00,0x40,0x38,0x59,0x4b,0xb0,0x14,0x54,0x58,0xb9,0x00,0x0b,
-0xff,0xc0,0x38,0x59,0xc4,0xc4,0x11,0x17,0x39,0x31,0x00,0x10,0xe4,0x32,0xf4,0xec,
-0x11,0x39,0x11,0x39,0x12,0x39,0x30,0x4b,0x53,0x58,0x07,0x10,0x05,0xed,0x07,0x10,
-0x08,0xed,0x07,0x10,0x08,0xed,0x07,0x10,0x05,0xed,0x07,0x10,0x08,0xed,0x07,0x05,
-0xed,0x17,0x32,0x59,0x22,0x01,0x40,0xf0,0x06,0x00,0x05,0x08,0x06,0x09,0x03,0x0d,
-0x16,0x0a,0x17,0x0d,0x10,0x0d,0x23,0x0d,0x35,0x0d,0x49,0x0a,0x4f,0x0a,0x4e,0x0d,
-0x5a,0x09,0x5a,0x0a,0x6a,0x0a,0x87,0x0d,0x80,0x0d,0x93,0x0d,0x12,0x0a,0x00,0x0a,
-0x09,0x06,0x0b,0x05,0x0c,0x0b,0x0e,0x0b,0x0f,0x17,0x01,0x15,0x02,0x10,0x04,0x10,
-0x05,0x17,0x0a,0x14,0x0b,0x14,0x0c,0x1a,0x0e,0x1a,0x0f,0x27,0x00,0x24,0x01,0x24,
-0x02,0x20,0x04,0x20,0x05,0x29,0x08,0x28,0x09,0x25,0x0a,0x24,0x0b,0x24,0x0c,0x27,
-0x0d,0x2a,0x0e,0x2a,0x0f,0x20,0x11,0x37,0x00,0x35,0x01,0x35,0x02,0x30,0x04,0x30,
-0x05,0x38,0x0a,0x36,0x0b,0x36,0x0c,0x38,0x0d,0x39,0x0e,0x39,0x0f,0x30,0x11,0x41,
-0x00,0x40,0x01,0x40,0x02,0x40,0x03,0x40,0x04,0x40,0x05,0x40,0x06,0x40,0x07,0x40,
-0x08,0x42,0x09,0x45,0x0a,0x47,0x0d,0x49,0x0e,0x49,0x0f,0x40,0x11,0x54,0x00,0x51,
-0x01,0x51,0x02,0x55,0x03,0x50,0x04,0x50,0x05,0x56,0x06,0x55,0x07,0x56,0x08,0x57,
-0x09,0x57,0x0a,0x55,0x0b,0x55,0x0c,0x59,0x0e,0x59,0x0f,0x50,0x11,0x66,0x01,0x66,
-0x02,0x68,0x0a,0x69,0x0e,0x69,0x0f,0x60,0x11,0x7b,0x08,0x78,0x0e,0x78,0x0f,0x89,
-0x00,0x8a,0x09,0x85,0x0b,0x85,0x0c,0x89,0x0d,0x89,0x0e,0x89,0x0f,0x99,0x09,0x95,
-0x0b,0x95,0x0c,0x9a,0x0e,0x9a,0x0f,0xa4,0x0b,0xa4,0x0c,0xab,0x0e,0xab,0x0f,0xb0,
-0x11,0xcf,0x11,0xdf,0x11,0xff,0x11,0x65,0x5d,0x00,0x5d,0x05,0x0e,0x01,0x2b,0x01,
-0x35,0x33,0x32,0x36,0x3f,0x01,0x01,0x33,0x09,0x01,0x33,0x02,0x93,0x4e,0x94,0x7c,
-0x93,0x6c,0x4c,0x54,0x33,0x21,0xfe,0x3b,0xc3,0x01,0x5e,0x01,0x5e,0xc3,0x68,0xc8,
-0x7a,0x9a,0x48,0x86,0x54,0x04,0x4e,0xfc,0x94,0x03,0x6c,0x00,0x00,0x01,0x00,0x58,
-0x00,0x00,0x03,0xdb,0x04,0x60,0x00,0x09,0x00,0x9d,0x40,0x1a,0x08,0x11,0x02,0x03,
-0x02,0x03,0x11,0x07,0x08,0x07,0x42,0x08,0xa9,0x00,0xbc,0x03,0xa9,0x05,0x08,0x03,
-0x01,0x00,0x04,0x01,0x06,0x0a,0x10,0xdc,0x4b,0xb0,0x0b,0x54,0x4b,0xb0,0x0c,0x54,
-0x5b,0x58,0xb9,0x00,0x06,0xff,0xc0,0x38,0x59,0x4b,0xb0,0x13,0x54,0x58,0xb9,0x00,
-0x06,0x00,0x40,0x38,0x59,0xc4,0x32,0xc4,0x11,0x39,0x39,0x31,0x00,0x2f,0xec,0xf4,
-0xec,0x30,0x4b,0x53,0x58,0x07,0x10,0x05,0xed,0x07,0x10,0x05,0xed,0x59,0x22,0x01,
-0x40,0x42,0x05,0x02,0x16,0x02,0x26,0x02,0x47,0x02,0x49,0x07,0x05,0x0b,0x08,0x0f,
-0x0b,0x18,0x03,0x1b,0x08,0x2b,0x08,0x20,0x0b,0x36,0x03,0x39,0x08,0x30,0x0b,0x40,
-0x01,0x40,0x02,0x45,0x03,0x40,0x04,0x40,0x05,0x43,0x08,0x57,0x03,0x59,0x08,0x5f,
-0x0b,0x60,0x01,0x60,0x02,0x66,0x03,0x60,0x04,0x60,0x05,0x62,0x08,0x7f,0x0b,0x80,
-0x0b,0xaf,0x0b,0x1b,0x5d,0x00,0x5d,0x13,0x21,0x15,0x01,0x21,0x15,0x21,0x35,0x01,
-0x21,0x71,0x03,0x6a,0xfd,0x4c,0x02,0xb4,0xfc,0x7d,0x02,0xb4,0xfd,0x65,0x04,0x60,
-0xa8,0xfc,0xdb,0x93,0xa8,0x03,0x25,0x00,0x00,0x01,0x01,0x00,0xfe,0xb2,0x04,0x17,
-0x06,0x14,0x00,0x24,0x00,0x77,0x40,0x34,0x19,0x0f,0x15,0x0b,0x06,0x25,0x09,0x1a,
-0x10,0x15,0x1d,0x0b,0x05,0x20,0x21,0x03,0x00,0x0b,0xa9,0x09,0x00,0xa9,0x01,0xc0,
-0x09,0x15,0xa9,0x13,0xb1,0x25,0x0c,0x09,0x0a,0x05,0x24,0x16,0x19,0x00,0x1d,0x0a,
-0x05,0x13,0x02,0x14,0x00,0x20,0x19,0x43,0x0a,0x0f,0x05,0x25,0x10,0xd4,0x4b,0xb0,
-0x0c,0x54,0x58,0xb9,0x00,0x05,0x00,0x40,0x38,0x59,0x3c,0xc4,0xfc,0x3c,0xc4,0x32,
-0x39,0x39,0x11,0x12,0x39,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x31,0x00,0x10,
-0xfc,0xec,0xc4,0xf4,0xec,0x10,0xee,0x12,0x17,0x39,0x12,0x39,0x11,0x39,0x39,0x11,
-0x12,0x39,0x11,0x12,0x39,0x39,0x30,0x01,0xb2,0x00,0x26,0x01,0x5d,0x05,0x15,0x23,
-0x22,0x26,0x3d,0x01,0x34,0x26,0x2b,0x01,0x35,0x33,0x32,0x36,0x3d,0x01,0x34,0x36,
-0x3b,0x01,0x15,0x23,0x22,0x06,0x1d,0x01,0x14,0x06,0x07,0x1e,0x01,0x1d,0x01,0x14,
-0x16,0x33,0x04,0x17,0x3e,0xf9,0xa9,0x6c,0x8e,0x3d,0x3d,0x8f,0x6b,0xa9,0xf9,0x3e,
-0x44,0x8d,0x56,0x5b,0x6e,0x6f,0x5a,0x56,0x8d,0xbe,0x90,0x94,0xdd,0xef,0x97,0x74,
-0x8f,0x73,0x95,0xf0,0xdd,0x93,0x8f,0x58,0x8d,0xf8,0x9d,0x8e,0x19,0x1b,0x8e,0x9c,
-0xf8,0x8d,0x58,0x00,0x00,0x01,0x01,0x04,0xfe,0x1d,0x01,0xae,0x06,0x1d,0x00,0x03,
-0x00,0x12,0xb7,0x01,0x00,0xb1,0x04,0x00,0x05,0x02,0x04,0x10,0xd4,0xec,0x31,0x00,
-0x10,0xfc,0xcc,0x30,0x01,0x11,0x23,0x11,0x01,0xae,0xaa,0x06,0x1d,0xf8,0x00,0x08,
-0x00,0x00,0x00,0x01,0x01,0x00,0xfe,0xb2,0x04,0x17,0x06,0x14,0x00,0x24,0x00,0x87,
-0x40,0x36,0x1f,0x25,0x1b,0x16,0x0c,0x0f,0x08,0x1b,0x0b,0x15,0x19,0x0f,0x04,0x05,
-0x20,0x03,0x00,0x19,0xa9,0x1b,0x00,0xa9,0x23,0xc0,0x1b,0x0f,0xa9,0x11,0xb1,0x25,
-0x1c,0x19,0x1a,0x15,0x0f,0x01,0x04,0x00,0x08,0x1a,0x15,0x23,0x12,0x04,0x00,0x1a,
-0x1f,0x15,0x43,0x10,0x00,0x0b,0x04,0x25,0x10,0xd4,0x4b,0xb0,0x0a,0x54,0x58,0xb9,
-0x00,0x04,0xff,0xc0,0x38,0x59,0x4b,0xb0,0x0e,0x54,0x58,0xb9,0x00,0x04,0x00,0x40,
-0x38,0x59,0x3c,0xc4,0x32,0xfc,0x3c,0xc4,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x11,
-0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x31,0x00,0x10,0xfc,0xec,0xc4,0xf4,0xec,0x10,
-0xee,0x12,0x17,0x39,0x11,0x12,0x39,0x39,0x11,0x39,0x11,0x39,0x39,0x11,0x12,0x39,
-0x30,0x01,0xb2,0x00,0x26,0x01,0x5d,0x05,0x33,0x32,0x36,0x3d,0x01,0x34,0x36,0x37,
-0x2e,0x01,0x3d,0x01,0x34,0x26,0x2b,0x01,0x35,0x33,0x32,0x16,0x1d,0x01,0x14,0x16,
-0x3b,0x01,0x15,0x23,0x22,0x06,0x1d,0x01,0x14,0x06,0x2b,0x01,0x01,0x00,0x46,0x8c,
-0x55,0x5a,0x6f,0x6f,0x5a,0x55,0x8c,0x46,0x3f,0xf9,0xa7,0x6c,0x8e,0x3e,0x3e,0x8e,
-0x6c,0xa7,0xf9,0x3f,0xbe,0x56,0x8f,0xf8,0x9c,0x8e,0x1b,0x19,0x8e,0x9d,0xf8,0x8e,
-0x57,0x8f,0x93,0xdd,0xf0,0x95,0x73,0x8f,0x74,0x97,0xef,0xdd,0x94,0x00,0x00,0x01,
-0x00,0xd9,0x01,0xd3,0x05,0xdb,0x03,0x31,0x00,0x1d,0x00,0x23,0x40,0x10,0x01,0x10,
-0x1b,0x0c,0x00,0x13,0x04,0x9c,0x1b,0x13,0x9c,0x0c,0x1e,0x00,0x0f,0x1e,0x10,0xd4,
-0xc4,0x31,0x00,0x10,0xd4,0xfc,0xd4,0xec,0x10,0xc0,0x11,0x12,0x39,0x39,0x30,0x01,
-0x15,0x0e,0x01,0x23,0x22,0x27,0x26,0x27,0x26,0x27,0x26,0x23,0x22,0x06,0x07,0x35,
-0x3e,0x01,0x33,0x32,0x17,0x16,0x17,0x16,0x17,0x16,0x33,0x32,0x36,0x05,0xdb,0x69,
-0xb3,0x61,0x6e,0x92,0x0b,0x05,0x07,0x0f,0x9b,0x5e,0x58,0xac,0x62,0x69,0xb3,0x61,
-0x6e,0x93,0x0a,0x05,0x08,0x0e,0x9b,0x5e,0x56,0xa9,0x03,0x31,0xb2,0x4f,0x44,0x3b,
-0x04,0x02,0x03,0x05,0x3e,0x4d,0x53,0xb2,0x4f,0x45,0x3c,0x04,0x02,0x03,0x05,0x3e,
-0x4c,0x00,0x00,0x02,0x01,0x35,0x00,0x00,0x02,0x00,0x05,0xd5,0x00,0x03,0x00,0x09,
-0x00,0x62,0x40,0x0f,0x07,0x00,0x83,0x02,0x81,0x04,0x08,0x07,0x04,0x00,0x03,0x05,
-0x01,0x00,0x0a,0x10,0xfc,0x3c,0xec,0x32,0x39,0x39,0x31,0x00,0x2f,0xf4,0xfc,0xcc,
-0x30,0x01,0x4b,0xb0,0x0b,0x54,0x58,0xbd,0x00,0x0a,0x00,0x40,0x00,0x01,0x00,0x0a,
-0x00,0x0a,0xff,0xc0,0x38,0x11,0x37,0x38,0x59,0x01,0x4b,0xb0,0x0f,0x54,0x4b,0xb0,
-0x10,0x54,0x5b,0x4b,0xb0,0x13,0x54,0x5b,0x58,0xbd,0x00,0x0a,0xff,0xc0,0x00,0x01,
-0x00,0x0a,0x00,0x0a,0x00,0x40,0x38,0x11,0x37,0x38,0x59,0xb6,0x00,0x0b,0x20,0x0b,
-0x50,0x0b,0x03,0x5d,0x01,0x23,0x35,0x33,0x11,0x23,0x11,0x13,0x33,0x13,0x02,0x00,
-0xcb,0xcb,0xcb,0x15,0xa2,0x14,0x04,0xd7,0xfe,0xfa,0x2b,0x02,0x8f,0x01,0x65,0xfe,
-0x9b,0x00,0x00,0x02,0x00,0xac,0xfe,0xc7,0x04,0x23,0x05,0x98,0x00,0x06,0x00,0x21,
-0x00,0x51,0x40,0x2b,0x13,0x16,0x14,0x00,0x0f,0x0c,0x01,0x0b,0x07,0x86,0x08,0x88,
-0x0b,0x10,0x86,0x0f,0x88,0x0c,0xb9,0x14,0x16,0x0b,0xb9,0x1d,0x1f,0x1c,0xb8,0x16,
-0x8c,0x22,0x1c,0x15,0x00,0x09,0x1e,0x13,0x0b,0x0f,0x07,0x04,0x12,0x19,0x22,0x10,
-0xdc,0xec,0xd4,0x3c,0xd4,0x3c,0x3c,0xec,0x32,0x32,0x31,0x00,0x10,0xe4,0xf4,0x3c,
-0xc4,0xec,0x10,0xc4,0xfe,0xf4,0xee,0x10,0xf5,0xee,0x12,0x39,0x11,0x12,0x39,0x11,
-0x12,0x39,0x30,0x25,0x11,0x0e,0x01,0x15,0x14,0x16,0x01,0x15,0x2e,0x01,0x27,0x03,
-0x3e,0x01,0x37,0x15,0x0e,0x01,0x07,0x11,0x23,0x11,0x26,0x00,0x11,0x10,0x00,0x37,
-0x11,0x33,0x13,0x1e,0x01,0x02,0xa6,0x93,0xa4,0xa4,0x02,0x10,0x4a,0x88,0x44,0x01,
-0x46,0x89,0x48,0x41,0x89,0x4d,0x66,0xf1,0xfe,0xf7,0x01,0x09,0xf1,0x66,0x01,0x49,
-0x89,0x83,0x03,0x58,0x12,0xe2,0xb8,0xb9,0xe2,0x03,0xa1,0xac,0x29,0x2a,0x03,0xfc,
-0xa0,0x05,0x2a,0x27,0xaa,0x1e,0x23,0x07,0xfe,0xe4,0x01,0x20,0x14,0x01,0x33,0x01,
-0x01,0x01,0x02,0x01,0x32,0x16,0x01,0x1f,0xfe,0xe1,0x04,0x21,0x00,0x01,0x00,0x81,
-0x00,0x00,0x04,0x62,0x05,0xf0,0x00,0x1b,0x00,0x60,0x40,0x21,0x07,0x16,0x08,0x01,
-0x86,0x00,0x12,0x0a,0xa9,0x14,0x08,0x0c,0x04,0xa0,0x00,0x94,0x19,0x91,0x10,0x0c,
-0xa0,0x0e,0x00,0x0d,0x09,0x0b,0x07,0x1c,0x13,0x0f,0x15,0x11,0x1c,0x10,0xdc,0x3c,
-0xcc,0xcc,0xfc,0x3c,0xc4,0xd4,0xc4,0x31,0x00,0x2f,0xec,0x32,0xf4,0xe4,0xec,0x10,
-0xd4,0x3c,0xee,0x32,0x10,0xee,0x11,0x39,0x39,0x30,0x01,0x4b,0xb0,0x0c,0x54,0x58,
-0xbd,0x00,0x1c,0xff,0xc0,0x00,0x01,0x00,0x1c,0x00,0x1c,0x00,0x40,0x38,0x11,0x37,
-0x38,0x59,0xb4,0x36,0x01,0x36,0x02,0x02,0x00,0x5d,0x01,0x15,0x2e,0x01,0x23,0x22,
-0x06,0x1d,0x01,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x35,0x33,0x11,0x23,0x35,0x33,
-0x35,0x10,0x36,0x33,0x32,0x16,0x04,0x4e,0x4c,0x88,0x3d,0x94,0x74,0x01,0x87,0xfe,
-0x79,0x02,0x2d,0xfc,0x1f,0xec,0xc7,0xc7,0xd6,0xe8,0x3d,0x97,0x05,0xb4,0xb6,0x29,
-0x29,0x9b,0xd4,0xd7,0x8f,0xfe,0x2f,0xaa,0xaa,0x01,0xd1,0x8f,0xee,0x01,0x05,0xf3,
-0x1f,0x00,0x00,0x02,0x00,0x5e,0x00,0x52,0x04,0xbc,0x04,0xb2,0x00,0x23,0x00,0x2f,
-0x00,0x83,0x40,0x49,0x03,0x09,0x1b,0x15,0x04,0x2d,0x1e,0x00,0x27,0x1c,0x02,0x21,
-0x1d,0x0c,0x12,0x2d,0x14,0x0b,0x0a,0x03,0x13,0x0f,0x01,0x1d,0x2d,0xb9,0x13,0xeb,
-0x0f,0xec,0x27,0xb9,0x1d,0xeb,0x21,0x30,0x1e,0x0c,0x00,0x12,0x04,0x2a,0x24,0x14,
-0x30,0x1c,0x15,0x1b,0x2a,0x1d,0x13,0x1c,0x18,0x09,0x03,0x24,0x0b,0x0a,0x01,0x03,
-0x02,0x24,0x28,0x02,0x73,0x06,0x74,0x2a,0x28,0x1c,0x73,0x18,0x30,0x10,0xdc,0xe4,
-0xec,0xf4,0xe4,0xec,0x12,0x17,0x39,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x12,0x39,
-0x39,0x11,0x12,0x39,0x11,0x12,0x17,0x39,0x31,0x00,0x10,0xd4,0xe4,0xec,0xf4,0xe4,
-0xec,0x10,0xc0,0x11,0x12,0x17,0x39,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x11,0x39,
-0x39,0x12,0x17,0x39,0x30,0x01,0x37,0x17,0x07,0x1e,0x01,0x15,0x14,0x06,0x07,0x17,
-0x07,0x27,0x0e,0x01,0x23,0x22,0x26,0x27,0x07,0x27,0x37,0x2e,0x01,0x35,0x34,0x36,
-0x37,0x27,0x37,0x17,0x3e,0x01,0x33,0x32,0x16,0x13,0x34,0x26,0x23,0x22,0x06,0x15,
-0x14,0x16,0x33,0x32,0x36,0x03,0x7b,0xcf,0x72,0xce,0x25,0x24,0x26,0x28,0xd1,0x72,
-0xcf,0x3b,0x74,0x3d,0x3a,0x78,0x3d,0xcf,0x71,0xcf,0x25,0x25,0x26,0x26,0xcf,0x73,
-0xcf,0x37,0x74,0x40,0x3c,0x75,0x5c,0x9b,0x72,0x70,0x9e,0x9d,0x71,0x71,0x9c,0x03,
-0xe1,0xd1,0x73,0xce,0x3b,0x77,0x3e,0x3f,0x73,0x39,0xcf,0x71,0xcf,0x28,0x26,0x25,
-0x25,0xcf,0x73,0xce,0x3e,0x76,0x3a,0x40,0x74,0x38,0xce,0x73,0xcf,0x27,0x25,0x24,
-0xfe,0x7c,0x70,0x9a,0x9a,0x70,0x72,0x9c,0x9d,0x00,0x00,0x01,0x00,0x52,0x00,0x00,
-0x04,0xc3,0x05,0xd5,0x00,0x18,0x00,0xc6,0x40,0x46,0x10,0x02,0x11,0x16,0x11,0x0f,
-0x02,0x0e,0x0f,0x16,0x16,0x11,0x0f,0x02,0x10,0x0f,0x08,0x0d,0x08,0x0e,0x02,0x0d,
-0x0d,0x08,0x42,0x0f,0x0b,0x09,0x04,0x00,0xd3,0x17,0x06,0x12,0x0b,0xd3,0x14,0x09,
-0x10,0x0d,0x81,0x02,0x0c,0x09,0x0e,0x03,0x05,0x16,0x0f,0x03,0x15,0x12,0x10,0x03,
-0x00,0x11,0x66,0x13,0x00,0x65,0x01,0x1c,0x0d,0x66,0x0a,0x05,0x65,0x07,0x03,0x19,
-0x10,0xd4,0x3c,0xec,0x32,0xec,0xfc,0xec,0x32,0xec,0x12,0x17,0x39,0x12,0x39,0x39,
-0x11,0x17,0x39,0x31,0x00,0x2f,0xe4,0x32,0xd4,0x3c,0xec,0x32,0xd4,0x3c,0xec,0x32,
-0x11,0x12,0x39,0x30,0x4b,0x53,0x58,0x07,0x10,0x05,0xed,0x07,0x10,0x08,0xed,0x07,
-0x10,0x08,0xed,0x07,0x10,0x05,0xed,0x59,0x22,0x01,0x4b,0xb0,0x0c,0x54,0x58,0xbd,
-0x00,0x19,0xff,0xc0,0x00,0x01,0x00,0x19,0x00,0x19,0x00,0x40,0x38,0x11,0x37,0x38,
-0x59,0x40,0x28,0x86,0x0f,0x90,0x0f,0xa6,0x0f,0xa0,0x0f,0xb5,0x0f,0x05,0x27,0x0c,
-0x27,0x0d,0x27,0x0e,0x29,0x10,0x28,0x11,0x28,0x12,0x37,0x0e,0x39,0x10,0x87,0x0c,
-0x88,0x12,0xa6,0x0d,0xa5,0x0e,0xaa,0x10,0xa9,0x11,0x0e,0x5d,0x00,0x5d,0x01,0x21,
-0x11,0x23,0x11,0x21,0x35,0x21,0x35,0x27,0x21,0x35,0x21,0x01,0x33,0x09,0x01,0x33,
-0x01,0x21,0x15,0x21,0x07,0x15,0x21,0x04,0x8d,0xfe,0x63,0xc9,0xfe,0x60,0x01,0xa0,
-0x54,0xfe,0xb4,0x01,0x08,0xfe,0xc3,0xbe,0x01,0x7b,0x01,0x79,0xbf,0xfe,0xc2,0x01,
-0x08,0xfe,0xb5,0x54,0x01,0x9f,0x01,0xc7,0xfe,0x39,0x01,0xc7,0x7b,0x33,0x9b,0x7b,
-0x02,0x4a,0xfd,0x44,0x02,0xbc,0xfd,0xb6,0x7b,0x9b,0x33,0x00,0x00,0x02,0x01,0x04,
-0xfe,0xa2,0x01,0xae,0x05,0x98,0x00,0x03,0x00,0x07,0x00,0x1c,0x40,0x0d,0x01,0xf5,
-0x00,0x04,0xf5,0x05,0x08,0x04,0x00,0x05,0x06,0x02,0x08,0x10,0xdc,0x3c,0xec,0x32,
-0x31,0x00,0x10,0xd4,0xec,0xd4,0xec,0x30,0x01,0x11,0x23,0x11,0x13,0x11,0x23,0x11,
-0x01,0xae,0xaa,0xaa,0xaa,0x01,0x98,0xfd,0x0a,0x02,0xf6,0x04,0x00,0xfd,0x0a,0x02,
-0xf6,0x00,0x00,0x02,0x00,0x5c,0xff,0x3d,0x03,0xa2,0x05,0xf0,0x00,0x0b,0x00,0x3e,
-0x00,0x91,0x40,0x3c,0x2f,0x30,0x2a,0x06,0x00,0x17,0x1d,0x30,0x36,0x04,0x0d,0x27,
-0x8a,0x26,0x0d,0x8a,0x0c,0x2a,0xc6,0x26,0xc5,0x23,0x10,0xc6,0x0c,0xc5,0x3c,0x91,
-0x23,0x3f,0x2f,0x06,0x00,0x17,0x30,0x04,0x13,0x1d,0x2d,0x09,0x36,0x03,0x13,0x57,
-0x39,0x2d,0x57,0x20,0x09,0x57,0x0c,0x22,0x1a,0x39,0x26,0x22,0x03,0x57,0x33,0x3f,
-0x10,0xdc,0xec,0xe4,0xc4,0xd4,0xe4,0xec,0xd4,0xec,0x10,0xee,0x11,0x39,0x11,0x12,
-0x39,0x11,0x17,0x39,0x39,0x31,0x00,0x10,0xc4,0xf4,0xe4,0xec,0x10,0xe6,0xee,0x10,
-0xee,0x10,0xee,0x11,0x17,0x39,0x39,0x39,0x11,0x12,0x39,0x30,0x01,0x4b,0xb0,0x0a,
-0x54,0x4b,0xb0,0x0b,0x54,0x5b,0x4b,0xb0,0x0c,0x54,0x5b,0x4b,0xb0,0x0e,0x54,0x5b,
-0x58,0xbd,0x00,0x3f,0x00,0x40,0x00,0x01,0x00,0x3f,0x00,0x3f,0xff,0xc0,0x38,0x11,
-0x37,0x38,0x59,0x01,0x0e,0x01,0x15,0x14,0x16,0x17,0x3e,0x01,0x35,0x34,0x26,0x13,
-0x15,0x2e,0x01,0x23,0x22,0x06,0x15,0x14,0x17,0x16,0x17,0x1e,0x01,0x15,0x14,0x06,
-0x07,0x1e,0x01,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x35,0x1e,0x01,0x33,0x32,0x36,
-0x35,0x34,0x2f,0x01,0x2e,0x01,0x35,0x34,0x36,0x37,0x2e,0x01,0x35,0x34,0x36,0x33,
-0x32,0x16,0x01,0x7b,0x3f,0x3e,0x8b,0xfa,0x3f,0x3e,0x8f,0xcc,0x53,0x8f,0x38,0x61,
-0x6c,0xce,0x1a,0x0e,0xd3,0x83,0x5c,0x5d,0x3e,0x39,0xcc,0xad,0x49,0x9a,0x58,0x57,
-0x94,0x3a,0x66,0x71,0xdd,0x19,0xd6,0x80,0x5d,0x5b,0x3b,0x3b,0xc8,0xa6,0x49,0x99,
-0x03,0xa8,0x2e,0x5a,0x2e,0x4c,0x85,0x87,0x2d,0x5b,0x2e,0x4b,0x88,0x02,0x93,0xa4,
-0x27,0x27,0x50,0x47,0x5a,0x73,0x0f,0x08,0x77,0x9a,0x65,0x5a,0x8c,0x35,0x34,0x6d,
-0x40,0x8e,0xa8,0x1d,0x1d,0xa4,0x27,0x27,0x54,0x4c,0x66,0x7b,0x0e,0x78,0x99,0x66,
-0x5b,0x8f,0x31,0x2c,0x70,0x45,0x82,0x9f,0x1d,0x00,0x00,0x02,0x00,0xd7,0x05,0x46,
-0x03,0x29,0x06,0x10,0x00,0x03,0x00,0x07,0x00,0x92,0x40,0x0e,0x06,0x02,0xce,0x04,
-0x00,0xcd,0x08,0x01,0x64,0x00,0x05,0x64,0x04,0x08,0x10,0xdc,0xfc,0xd4,0xec,0x31,
-0x00,0x10,0xfc,0x3c,0xec,0x32,0x30,0x00,0x4b,0xb0,0x0a,0x54,0x4b,0xb0,0x0d,0x54,
-0x5b,0x58,0xbd,0x00,0x08,0x00,0x40,0x00,0x01,0x00,0x08,0x00,0x08,0xff,0xc0,0x38,
-0x11,0x37,0x38,0x59,0x01,0x4b,0xb0,0x0c,0x54,0x4b,0xb0,0x0d,0x54,0x5b,0x4b,0xb0,
-0x0e,0x54,0x5b,0x4b,0xb0,0x17,0x54,0x5b,0x58,0xbd,0x00,0x08,0xff,0xc0,0x00,0x01,
-0x00,0x08,0x00,0x08,0x00,0x40,0x38,0x11,0x37,0x38,0x59,0x01,0x4b,0xb0,0x0f,0x54,
-0x4b,0xb0,0x19,0x54,0x5b,0x58,0xbd,0x00,0x08,0x00,0x40,0x00,0x01,0x00,0x08,0x00,
-0x08,0xff,0xc0,0x38,0x11,0x37,0x38,0x59,0x40,0x11,0x60,0x01,0x60,0x02,0x60,0x05,
-0x60,0x06,0x70,0x01,0x70,0x02,0x70,0x05,0x70,0x06,0x08,0x5d,0x01,0x33,0x15,0x23,
-0x25,0x33,0x15,0x23,0x02,0x5e,0xcb,0xcb,0xfe,0x79,0xcb,0xcb,0x06,0x10,0xca,0xca,
-0xca,0x00,0x00,0x03,0x01,0x1b,0x00,0x00,0x06,0xe5,0x05,0xcd,0x00,0x17,0x00,0x2f,
-0x00,0x49,0x00,0x43,0x40,0x26,0x3d,0xcb,0x3e,0x3a,0xcc,0x41,0xca,0x24,0x31,0xcb,
-0x30,0x34,0xcc,0x47,0xca,0x18,0xc9,0x00,0xc8,0x24,0xc9,0x0c,0x37,0x61,0x44,0x3d,
-0x30,0x5e,0x2a,0x09,0x06,0x44,0x5e,0x1e,0x09,0x06,0x12,0x4a,0x10,0xdc,0xcc,0xfc,
-0xec,0x10,0xfe,0xed,0x32,0x10,0xee,0x31,0x00,0x2f,0xee,0xf6,0xfe,0xfd,0xee,0xd6,
-0xee,0x10,0xfd,0xee,0xd6,0xee,0x30,0x01,0x32,0x04,0x17,0x16,0x12,0x15,0x14,0x02,
-0x07,0x06,0x04,0x23,0x22,0x24,0x27,0x26,0x02,0x35,0x34,0x12,0x37,0x36,0x24,0x17,
-0x22,0x06,0x07,0x0e,0x01,0x15,0x14,0x16,0x17,0x1e,0x01,0x33,0x32,0x36,0x37,0x3e,
-0x01,0x35,0x34,0x26,0x27,0x2e,0x01,0x17,0x15,0x2e,0x01,0x23,0x22,0x06,0x15,0x14,
-0x16,0x33,0x32,0x36,0x37,0x15,0x0e,0x01,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,
-0x16,0x04,0x00,0x98,0x01,0x07,0x6d,0x6d,0x6c,0x6c,0x6d,0x6d,0xfe,0xf9,0x98,0x98,
-0xfe,0xf9,0x6d,0x6d,0x6c,0x6c,0x6d,0x6d,0x01,0x07,0x98,0x83,0xe2,0x5e,0x5e,0x60,
-0x60,0x5e,0x5e,0xe2,0x83,0x84,0xe3,0x5e,0x5d,0x5d,0x5e,0x5c,0x5e,0xe3,0xa7,0x42,
-0x82,0x42,0x95,0xa7,0xab,0x9b,0x40,0x7a,0x42,0x43,0x89,0x46,0xd8,0xfb,0xfb,0xd8,
-0x49,0x88,0x05,0xcd,0x6e,0x6d,0x6d,0xfe,0xfa,0x9a,0x98,0xfe,0xfb,0x6d,0x6d,0x6e,
-0x6e,0x6d,0x6d,0x01,0x05,0x98,0x9a,0x01,0x06,0x6d,0x6d,0x6e,0x67,0x5e,0x5e,0x5e,
-0xe5,0x82,0x81,0xe3,0x5e,0x5e,0x5f,0x5f,0x5e,0x5d,0xe2,0x83,0x85,0xe3,0x5d,0x5e,
-0x5e,0xf5,0x81,0x21,0x20,0xaf,0x9d,0x9f,0xae,0x1f,0x22,0x7f,0x1d,0x1c,0xf4,0xd0,
-0xd1,0xf2,0x1c,0x00,0x00,0x03,0x00,0x73,0x01,0xd5,0x03,0x3b,0x05,0xf0,0x00,0x03,
-0x00,0x1e,0x00,0x29,0x00,0x5f,0x40,0x33,0x28,0x07,0x25,0x04,0x1f,0x12,0x18,0x10,
-0x02,0xe3,0x00,0x1f,0xdd,0x10,0x00,0xe1,0x25,0xdd,0x05,0x0a,0x19,0xdf,0x18,0xde,
-0x15,0xdd,0x0a,0xe0,0x1c,0x91,0x2a,0x00,0x18,0x0d,0x1f,0x10,0x22,0x06,0x02,0x01,
-0x28,0x11,0x06,0x6b,0x04,0x6c,0x18,0x22,0x6b,0x0d,0x2a,0x10,0xdc,0xec,0xcc,0xfc,
-0xec,0x32,0x32,0xc0,0xc0,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x31,0x00,0x10,0xf4,
-0xe4,0xfc,0xf4,0xec,0x10,0xc4,0xee,0xed,0xd6,0xee,0x10,0xee,0x11,0x12,0x39,0x12,
-0x39,0x11,0x39,0x39,0x30,0x13,0x21,0x15,0x21,0x01,0x11,0x23,0x35,0x0e,0x01,0x23,
-0x22,0x26,0x35,0x34,0x36,0x3b,0x01,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x35,0x3e,
-0x01,0x33,0x32,0x16,0x05,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x3d,0x01,0x8b,
-0x02,0xb0,0xfd,0x50,0x02,0xae,0x95,0x2c,0x90,0x5d,0x80,0x98,0xbf,0xbc,0xb6,0x75,
-0x75,0x3e,0x88,0x44,0x49,0x91,0x45,0xb7,0xb3,0xfe,0xec,0xa1,0x7e,0x62,0x52,0x68,
-0x82,0x02,0x50,0x7b,0x02,0xb8,0xfe,0x40,0x70,0x3f,0x44,0x87,0x71,0x87,0x8a,0x04,
-0x5b,0x5b,0x22,0x22,0x7f,0x1c,0x1c,0xb0,0xf0,0x43,0x4f,0x40,0x4d,0x90,0x72,0x1d,
-0x00,0x02,0x00,0x9e,0x00,0x8d,0x04,0x25,0x04,0x23,0x00,0x06,0x00,0x0d,0x00,0x86,
-0x40,0x49,0x03,0xe8,0x04,0x05,0x04,0x02,0xe8,0x01,0x02,0x05,0x05,0x04,0x02,0xe8,
-0x03,0x02,0x06,0x00,0x06,0x01,0xe8,0x00,0x00,0x06,0x0a,0xe8,0x0b,0x0c,0x0b,0x09,
-0xe8,0x08,0x09,0x0c,0x0c,0x0b,0x09,0xe8,0x0a,0x09,0x0d,0x07,0x0d,0x08,0xe8,0x07,
-0x07,0x0d,0x42,0x09,0x02,0x0b,0x04,0xe7,0x07,0x00,0xa6,0x0e,0x09,0x0c,0x05,0x02,
-0x07,0x03,0x00,0x6f,0x05,0x0a,0x07,0x6f,0x0c,0x6e,0x0e,0x10,0xfc,0xfc,0x3c,0xd4,
-0xec,0x32,0x11,0x39,0x11,0x12,0x39,0x31,0x00,0x10,0xf4,0x3c,0xec,0x32,0x39,0x39,
-0x30,0x4b,0x53,0x58,0x07,0x10,0x04,0xed,0x07,0x10,0x08,0xed,0x07,0x10,0x08,0xed,
-0x07,0x10,0x04,0xed,0x07,0x10,0x04,0xed,0x07,0x10,0x08,0xed,0x07,0x10,0x08,0xed,
-0x07,0x10,0x04,0xed,0x59,0x22,0x01,0x15,0x09,0x01,0x15,0x01,0x35,0x13,0x15,0x09,
-0x01,0x15,0x01,0x35,0x04,0x25,0xfe,0xd3,0x01,0x2d,0xfe,0x2b,0x23,0xfe,0xd3,0x01,
-0x2d,0xfe,0x2b,0x04,0x23,0xbf,0xfe,0xf4,0xfe,0xf4,0xbf,0x01,0xa2,0x52,0x01,0xa2,
-0xbf,0xfe,0xf4,0xfe,0xf4,0xbf,0x01,0xa2,0x52,0x00,0x00,0x01,0x00,0xd9,0x01,0x1f,
-0x05,0xdb,0x03,0x5e,0x00,0x05,0x00,0x17,0x40,0x0a,0x04,0x9c,0x02,0x00,0x06,0x03,
-0x17,0x01,0x00,0x06,0x10,0xdc,0xd4,0xec,0x31,0x00,0x10,0xd4,0xc4,0xec,0x30,0x13,
-0x21,0x11,0x23,0x11,0x21,0xd9,0x05,0x02,0xa8,0xfb,0xa6,0x03,0x5e,0xfd,0xc1,0x01,
-0x95,0x00,0x00,0x01,0x00,0x64,0x01,0xdf,0x02,0x7f,0x02,0x83,0x00,0x03,0x00,0x11,
-0xb6,0x00,0x9c,0x02,0x04,0x01,0x00,0x04,0x10,0xdc,0xcc,0x31,0x00,0x10,0xd4,0xec,
-0x30,0x13,0x21,0x15,0x21,0x64,0x02,0x1b,0xfd,0xe5,0x02,0x83,0xa4,0x00,0x00,0x04,
-0x01,0x1b,0x00,0x00,0x06,0xe5,0x05,0xcd,0x00,0x17,0x00,0x2f,0x00,0x38,0x00,0x4c,
-0x00,0x60,0x40,0x36,0x45,0x42,0x43,0x3f,0x32,0xc9,0x48,0x30,0xc9,0x39,0x4a,0x43,
-0xca,0x0c,0x39,0xca,0x00,0xc9,0x18,0xc8,0x0c,0xc9,0x24,0x48,0x45,0x33,0x30,0x04,
-0x31,0x42,0x3c,0x3f,0x39,0x36,0x49,0x31,0x60,0x4b,0x36,0x60,0x43,0x3c,0x5e,0x12,
-0x09,0x1e,0x4b,0x5e,0x06,0x09,0x1e,0x5f,0x2a,0x4d,0x10,0xdc,0xe4,0xfc,0xec,0x10,
-0xfe,0xfd,0xc4,0xee,0x10,0xee,0x32,0x11,0x39,0x39,0x12,0x39,0x12,0x17,0x39,0x31,
-0x00,0x2f,0xee,0xf6,0xfe,0xed,0x10,0xed,0x32,0x10,0xee,0xd6,0xee,0x39,0x12,0x39,
-0x39,0x30,0x01,0x22,0x06,0x07,0x0e,0x01,0x15,0x14,0x16,0x17,0x1e,0x01,0x33,0x32,
-0x36,0x37,0x3e,0x01,0x35,0x34,0x26,0x27,0x2e,0x01,0x27,0x32,0x04,0x17,0x16,0x12,
-0x15,0x14,0x02,0x07,0x06,0x04,0x23,0x22,0x24,0x27,0x26,0x02,0x35,0x34,0x12,0x37,
-0x36,0x24,0x13,0x23,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x32,0x16,0x15,0x14,
-0x06,0x07,0x1e,0x01,0x1f,0x01,0x23,0x27,0x2e,0x01,0x2b,0x01,0x11,0x23,0x11,0x04,
-0x00,0x83,0xe2,0x5e,0x5e,0x60,0x60,0x5e,0x5e,0xe2,0x83,0x84,0xe3,0x5e,0x5d,0x5d,
-0x5e,0x5c,0x5e,0xe3,0x84,0x98,0x01,0x07,0x6d,0x6d,0x6c,0x6c,0x6d,0x6d,0xfe,0xf9,
-0x98,0x98,0xfe,0xf9,0x6d,0x6d,0x6c,0x6c,0x6d,0x6d,0x01,0x07,0x7d,0x7b,0x7b,0x6e,
-0x57,0x58,0x66,0xb0,0xae,0x69,0x60,0x18,0x43,0x2e,0x89,0xac,0x81,0x3b,0x49,0x36,
-0x42,0x9b,0x05,0x66,0x5e,0x5e,0x5e,0xe5,0x82,0x81,0xe3,0x5e,0x5e,0x5f,0x5f,0x5e,
-0x5d,0xe2,0x83,0x85,0xe3,0x5d,0x5e,0x5e,0x67,0x6e,0x6d,0x6d,0xfe,0xfa,0x9a,0x98,
-0xfe,0xfb,0x6d,0x6d,0x6e,0x6e,0x6d,0x6d,0x01,0x05,0x98,0x9a,0x01,0x06,0x6d,0x6d,
-0x6e,0xfe,0x62,0xfe,0xec,0x3e,0x4b,0x4c,0x3f,0x67,0x77,0x79,0x56,0x70,0x11,0x08,
-0x4d,0x49,0xdf,0xd1,0x60,0x33,0xfe,0x9c,0x03,0x44,0x00,0x01,0x00,0xd5,0x05,0x62,
-0x03,0x2b,0x05,0xf6,0x00,0x03,0x00,0x2f,0xb7,0x02,0xef,0x00,0xee,0x04,0x01,0x00,
-0x04,0x10,0xd4,0xcc,0x31,0x00,0x10,0xfc,0xec,0x30,0x00,0x4b,0xb0,0x09,0x54,0x4b,
-0xb0,0x0e,0x54,0x5b,0x58,0xbd,0x00,0x04,0xff,0xc0,0x00,0x01,0x00,0x04,0x00,0x04,
-0x00,0x40,0x38,0x11,0x37,0x38,0x59,0x13,0x21,0x15,0x21,0xd5,0x02,0x56,0xfd,0xaa,
-0x05,0xf6,0x94,0x00,0x00,0x02,0x00,0xc3,0x03,0x75,0x03,0x3d,0x05,0xf0,0x00,0x0b,
-0x00,0x1a,0x00,0x20,0x40,0x11,0x06,0xc3,0x15,0xc4,0x00,0xc3,0x0c,0x91,0x1b,0x09,
-0x5a,0x12,0x5b,0x03,0x5a,0x18,0x1b,0x10,0xdc,0xec,0xfc,0xec,0x31,0x00,0x10,0xf4,
-0xec,0xfc,0xec,0x30,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,
-0x27,0x32,0x16,0x17,0x1e,0x01,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x02,
-0x00,0x50,0x6e,0x6e,0x50,0x50,0x6e,0x6f,0x4f,0x40,0x76,0x2b,0x2e,0x2e,0xb9,0x86,
-0x87,0xb4,0xb8,0x05,0x6f,0x6f,0x50,0x4f,0x6d,0x6d,0x4f,0x4f,0x70,0x81,0x31,0x2e,
-0x2d,0x72,0x42,0x84,0xb7,0xb4,0x87,0x86,0xba,0x00,0x00,0x02,0x00,0xd9,0x00,0x00,
-0x05,0xdb,0x05,0x04,0x00,0x0b,0x00,0x0f,0x00,0x2e,0x40,0x18,0x05,0xd0,0x07,0x03,
-0x9c,0x00,0xd0,0x09,0x01,0x0c,0x9c,0x0e,0x0d,0x02,0x15,0x04,0x00,0x17,0x0c,0x08,
-0x15,0x0a,0x06,0x10,0x10,0xd4,0x3c,0xec,0x32,0xfc,0x3c,0xec,0x32,0x31,0x00,0x2f,
-0xec,0xd4,0x3c,0xec,0xfc,0x3c,0xec,0x30,0x01,0x11,0x21,0x15,0x21,0x11,0x23,0x11,
-0x21,0x35,0x21,0x11,0x01,0x21,0x15,0x21,0x03,0xae,0x02,0x2d,0xfd,0xd3,0xa8,0xfd,
-0xd3,0x02,0x2d,0xfd,0xd3,0x05,0x02,0xfa,0xfe,0x05,0x04,0xfe,0x7d,0xaa,0xfe,0x7d,
-0x01,0x83,0xaa,0x01,0x83,0xfb,0xa6,0xaa,0x00,0x01,0x00,0x5e,0x02,0x9c,0x02,0xb4,
-0x05,0xf0,0x00,0x18,0x00,0x4a,0x40,0x24,0x00,0x7d,0x06,0x04,0x00,0x17,0x7d,0x06,
-0x06,0x04,0x42,0x04,0x02,0x00,0x0e,0xdd,0x0f,0x00,0xdd,0x02,0xf7,0x0b,0xdd,0x0f,
-0x12,0x91,0x19,0x00,0x0e,0x08,0x7e,0x01,0x15,0x0e,0x03,0x19,0x10,0xdc,0xc4,0xd4,
-0xc4,0xec,0x11,0x39,0x31,0x00,0x10,0xf4,0xc4,0xec,0xfc,0xec,0x10,0xee,0x11,0x12,
-0x39,0x30,0x4b,0x53,0x58,0x07,0x10,0x05,0xed,0x17,0x32,0x07,0x05,0xed,0x59,0x22,
-0x01,0x21,0x15,0x21,0x35,0x36,0x37,0x00,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x35,
-0x3e,0x01,0x33,0x32,0x16,0x15,0x14,0x01,0x06,0x01,0x0c,0x01,0xa8,0xfd,0xaa,0x22,
-0x3f,0x01,0x58,0x68,0x55,0x34,0x7a,0x48,0x4d,0x85,0x39,0x91,0xae,0xfe,0xb5,0x38,
-0x03,0x0e,0x72,0x6e,0x1f,0x38,0x01,0x31,0x5e,0x42,0x51,0x23,0x23,0x7b,0x1c,0x1c,
-0x84,0x6c,0x8b,0xfe,0xe4,0x30,0x00,0x01,0x00,0x62,0x02,0x8d,0x02,0xcd,0x05,0xf0,
-0x00,0x28,0x00,0x48,0x40,0x27,0x00,0x15,0x13,0x0a,0xdd,0x09,0x1f,0xdd,0x20,0x13,
-0xdd,0x15,0x0d,0xdd,0x09,0xf8,0x06,0xf7,0x1c,0xdd,0x20,0xf8,0x23,0x91,0x29,0x16,
-0x13,0x00,0x14,0x19,0x7e,0x26,0x10,0x7e,0x03,0x14,0x1f,0x09,0x29,0x10,0xdc,0xc4,
-0xc4,0xd4,0xec,0xd4,0xec,0x11,0x39,0x39,0x39,0x31,0x00,0x10,0xf4,0xe4,0xec,0xfc,
-0xe4,0xec,0xd4,0xec,0x10,0xee,0x10,0xee,0x11,0x12,0x39,0x30,0x01,0x1e,0x01,0x15,
-0x14,0x06,0x23,0x22,0x26,0x27,0x35,0x1e,0x01,0x33,0x32,0x36,0x35,0x34,0x26,0x2b,
-0x01,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x35,0x3e,0x01,0x33,
-0x32,0x16,0x15,0x14,0x06,0x02,0x0c,0x5c,0x65,0xbe,0xb1,0x39,0x7d,0x46,0x34,0x77,
-0x43,0x6d,0x78,0x6f,0x6c,0x56,0x5e,0x5e,0x61,0x64,0x5f,0x28,0x66,0x51,0x49,0x80,
-0x37,0x90,0xa9,0x5a,0x04,0x60,0x12,0x6d,0x52,0x7c,0x86,0x15,0x14,0x79,0x1b,0x1a,
-0x4f,0x46,0x4a,0x4c,0x6c,0x3f,0x3c,0x3a,0x3d,0x12,0x17,0x73,0x11,0x12,0x76,0x63,
-0x45,0x60,0x00,0x01,0x01,0x73,0x04,0xee,0x03,0x52,0x06,0x66,0x00,0x03,0x00,0x31,
-0x40,0x09,0x02,0xb4,0x00,0xb3,0x04,0x03,0x44,0x01,0x04,0x10,0xd4,0xec,0x31,0x00,
-0x10,0xf4,0xec,0x30,0x00,0x4b,0xb0,0x09,0x54,0x4b,0xb0,0x0e,0x54,0x5b,0x58,0xbd,
-0x00,0x04,0xff,0xc0,0x00,0x01,0x00,0x04,0x00,0x04,0x00,0x40,0x38,0x11,0x37,0x38,
-0x59,0x01,0x33,0x01,0x23,0x02,0x8b,0xc7,0xfe,0xba,0x99,0x06,0x66,0xfe,0x88,0x00,
-0x00,0x01,0x00,0xae,0xfe,0x56,0x04,0xe5,0x04,0x60,0x00,0x20,0x00,0x4d,0x40,0x25,
-0x13,0x19,0x1f,0x03,0x16,0x06,0x03,0x09,0x0c,0x03,0x01,0x12,0x0f,0x06,0x87,0x1c,
-0x16,0x8c,0x0a,0x01,0xbc,0x00,0xbd,0x21,0x19,0x09,0x12,0x09,0x08,0x0b,0x4e,0x1f,
-0x02,0x08,0x00,0x46,0x21,0x10,0xfc,0xec,0x32,0xf4,0xec,0xc4,0x12,0x39,0x31,0x00,
-0x10,0xe4,0xe4,0x32,0xf4,0x3c,0xec,0xdc,0xc4,0x11,0x17,0x39,0x11,0x12,0x17,0x39,
-0x30,0xb6,0x1f,0x22,0x60,0x22,0xcf,0x22,0x03,0x01,0x5d,0x13,0x11,0x33,0x11,0x14,
-0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x37,0x15,0x0e,
-0x01,0x23,0x22,0x26,0x27,0x0e,0x01,0x23,0x22,0x26,0x27,0x11,0xae,0xb8,0x8a,0x87,
-0x94,0x95,0xb8,0x23,0x25,0x09,0x20,0x1c,0x29,0x49,0x23,0x45,0x52,0x0f,0x32,0x91,
-0x62,0x66,0x8f,0x2a,0xfe,0x56,0x06,0x0a,0xfd,0x48,0x91,0x94,0xa8,0xa8,0x02,0x8d,
-0xfc,0xa2,0x3c,0x39,0x0b,0x0c,0x94,0x17,0x16,0x4e,0x50,0x4f,0x4f,0x4e,0x4e,0xfd,
-0xd7,0x00,0x00,0x01,0x00,0x9e,0xff,0x3b,0x04,0x39,0x05,0xd5,0x00,0x0d,0x00,0x25,
-0x40,0x12,0x08,0x02,0x04,0xc1,0x00,0x81,0x06,0x02,0x0e,0x00,0x07,0x5d,0x05,0x03,
-0x5d,0x01,0x0b,0x0e,0x10,0xd4,0xd4,0xfc,0xdc,0xec,0x39,0x31,0x00,0x10,0xc4,0x32,
-0xf4,0xec,0x11,0x39,0x30,0x01,0x21,0x11,0x23,0x11,0x23,0x11,0x23,0x11,0x2e,0x01,
-0x35,0x34,0x24,0x02,0x79,0x01,0xc0,0x8d,0xbe,0x8e,0xd7,0xeb,0x01,0x04,0x05,0xd5,
-0xf9,0x66,0x06,0x1f,0xf9,0xe1,0x03,0x4e,0x11,0xdd,0xb8,0xbe,0xe8,0x00,0x00,0x01,
-0x00,0xdb,0x02,0x48,0x01,0xae,0x03,0x46,0x00,0x03,0x00,0x12,0xb7,0x02,0x83,0x00,
-0x04,0x01,0x19,0x00,0x04,0x10,0xd4,0xec,0x31,0x00,0x10,0xd4,0xec,0x30,0x13,0x33,
-0x15,0x23,0xdb,0xd3,0xd3,0x03,0x46,0xfe,0x00,0x01,0x01,0x23,0xfe,0x75,0x02,0xc1,
-0x00,0x00,0x00,0x13,0x00,0x1f,0x40,0x0e,0x09,0x06,0x0a,0x0d,0xf3,0x06,0x00,0x13,
-0x00,0x10,0x27,0x03,0x09,0x14,0x10,0xdc,0xd4,0xec,0xd4,0xcc,0x31,0x00,0x2f,0xd4,
-0xfc,0xc4,0x12,0x39,0x30,0x21,0x1e,0x01,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x35,
-0x1e,0x01,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x02,0x54,0x37,0x36,0x78,0x76,0x2e,
-0x57,0x2b,0x22,0x4a,0x2f,0x3b,0x3c,0x2b,0x2d,0x3e,0x69,0x30,0x59,0x5b,0x0c,0x0c,
-0x83,0x11,0x0f,0x30,0x2e,0x1e,0x57,0x3d,0x00,0x01,0x00,0x89,0x02,0x9c,0x02,0xc5,
-0x05,0xdf,0x00,0x0a,0x00,0x2c,0x40,0x18,0x07,0x00,0xdd,0x09,0x03,0xdd,0x04,0x02,
-0xdd,0x09,0xf7,0x05,0x91,0x0b,0x08,0x7c,0x06,0x5d,0x03,0x7c,0x01,0x7c,0x00,0x0b,
-0x10,0xdc,0xf4,0xe4,0xfc,0xe4,0x31,0x00,0x10,0xf4,0xec,0xec,0xd4,0xec,0x10,0xee,
-0x32,0x30,0x13,0x33,0x11,0x07,0x35,0x37,0x33,0x11,0x33,0x15,0x21,0x9c,0xcc,0xdf,
-0xe6,0x89,0xcd,0xfd,0xd7,0x03,0x0a,0x02,0x63,0x29,0x74,0x27,0xfd,0x2b,0x6e,0x00,
-0x00,0x03,0x00,0x60,0x01,0xd5,0x03,0x64,0x05,0xf0,0x00,0x03,0x00,0x0f,0x00,0x1b,
-0x00,0x2e,0x40,0x19,0x02,0xe3,0x00,0xe1,0x16,0xdd,0x0a,0xe0,0x10,0xdd,0x04,0x91,
-0x1c,0x00,0x13,0x0d,0x01,0x19,0x6b,0x07,0x6c,0x13,0x6b,0x0d,0x1c,0x10,0xdc,0xec,
-0xfc,0xec,0x39,0x11,0x12,0x39,0x31,0x00,0x10,0xf4,0xec,0xf4,0xec,0xfc,0xec,0x30,
-0x13,0x21,0x15,0x21,0x01,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,
-0x17,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x8b,0x02,0xb0,0xfd,
-0x50,0x01,0x58,0xb3,0xce,0xce,0xb3,0xb3,0xd0,0xd0,0xb3,0x69,0x7e,0x7f,0x68,0x69,
-0x7d,0x7c,0x02,0x50,0x7b,0x04,0x1b,0xdd,0xbf,0xbf,0xdb,0xdc,0xbe,0xbf,0xdd,0x73,
-0xa1,0x88,0x85,0xa0,0xa0,0x85,0x89,0xa0,0x00,0x02,0x00,0xc1,0x00,0x8d,0x04,0x48,
-0x04,0x23,0x00,0x06,0x00,0x0d,0x00,0x86,0x40,0x49,0x0c,0xe8,0x0d,0x0c,0x09,0x0a,
-0x09,0x0b,0xe8,0x0a,0x0a,0x09,0x0d,0xe8,0x07,0x08,0x07,0x0c,0xe8,0x0b,0x0c,0x08,
-0x08,0x07,0x05,0xe8,0x06,0x05,0x02,0x03,0x02,0x04,0xe8,0x03,0x03,0x02,0x06,0xe8,
-0x00,0x01,0x00,0x05,0xe8,0x04,0x05,0x01,0x01,0x00,0x42,0x0c,0x05,0x0a,0x03,0xe7,
-0x07,0x00,0xa6,0x0e,0x0c,0x08,0x01,0x05,0x00,0x08,0x6f,0x0a,0x07,0x01,0x6f,0x03,
-0x00,0x70,0x0e,0x10,0xfc,0x3c,0xfc,0xd4,0x3c,0xec,0x12,0x39,0x11,0x12,0x39,0x31,
-0x00,0x10,0xf4,0x3c,0xec,0x32,0x39,0x39,0x30,0x4b,0x53,0x58,0x07,0x10,0x08,0xed,
-0x07,0x10,0x04,0xed,0x07,0x10,0x04,0xed,0x07,0x10,0x08,0xed,0x07,0x10,0x08,0xed,
-0x07,0x10,0x04,0xed,0x07,0x10,0x04,0xed,0x07,0x10,0x08,0xed,0x59,0x22,0x13,0x01,
-0x15,0x01,0x35,0x09,0x01,0x25,0x01,0x15,0x01,0x35,0x09,0x01,0xc1,0x01,0xd5,0xfe,
-0x2b,0x01,0x2d,0xfe,0xd3,0x01,0xb2,0x01,0xd5,0xfe,0x2b,0x01,0x2d,0xfe,0xd3,0x04,
-0x23,0xfe,0x5e,0x52,0xfe,0x5e,0xbf,0x01,0x0c,0x01,0x0c,0xbf,0xfe,0x5e,0x52,0xfe,
-0x5e,0xbf,0x01,0x0c,0x01,0x0c,0xff,0xff,0x00,0x89,0xff,0xe3,0x07,0x7f,0x05,0xf0,
-0x10,0x27,0x07,0xba,0x04,0x8b,0xfd,0x64,0x10,0x26,0x00,0x7b,0x00,0x00,0x10,0x07,
-0x08,0x86,0x03,0x35,0x00,0x00,0xff,0xff,0x00,0x89,0xff,0xe3,0x07,0x3f,0x05,0xf0,
-0x10,0x26,0x00,0x7b,0x00,0x00,0x10,0x27,0x08,0x86,0x03,0x35,0x00,0x00,0x10,0x07,
-0x00,0x74,0x04,0x8b,0xfd,0x64,0xff,0xff,0x00,0x62,0xff,0xe3,0x07,0x7f,0x05,0xf0,
-0x10,0x27,0x07,0xba,0x04,0x8b,0xfd,0x64,0x10,0x26,0x00,0x75,0x00,0x00,0x10,0x07,
-0x08,0x86,0x03,0x35,0x00,0x00,0x00,0x02,0x00,0x8f,0xff,0xe3,0x03,0xac,0x05,0xd5,
-0x00,0x20,0x00,0x24,0x00,0x86,0x40,0x2f,0x20,0x1a,0x05,0x02,0x04,0x06,0x19,0x00,
-0x10,0x86,0x0f,0x88,0x0c,0x00,0x21,0x83,0x23,0x0c,0x95,0x13,0x8c,0x23,0x81,0x25,
-0x06,0x22,0x19,0x16,0x09,0x05,0x01,0x00,0x1a,0x22,0x09,0x00,0x1c,0x01,0x22,0x1c,
-0x21,0x26,0x0f,0x09,0x1c,0x16,0x25,0x10,0xdc,0xec,0xd4,0xfc,0xec,0xd4,0xec,0x11,
-0x12,0x39,0x11,0x12,0x39,0x11,0x12,0x39,0x12,0x39,0x31,0x00,0x10,0xe4,0xf4,0xec,
-0x10,0xfe,0xcd,0x10,0xf4,0xee,0x12,0x39,0x39,0x17,0x39,0x30,0x01,0x4b,0xb0,0x10,
-0x54,0x4b,0xb0,0x12,0x54,0x5b,0x4b,0xb0,0x13,0x54,0x5b,0x58,0xbd,0x00,0x25,0xff,
-0xc0,0x00,0x01,0x00,0x25,0x00,0x25,0x00,0x40,0x38,0x11,0x37,0x38,0x59,0x40,0x0b,
-0x74,0x04,0x74,0x05,0x74,0x06,0x74,0x07,0x76,0x1c,0x05,0x5d,0x01,0x33,0x15,0x14,
-0x06,0x0f,0x01,0x0e,0x01,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x15,0x0e,0x01,0x23,
-0x22,0x26,0x35,0x34,0x36,0x3f,0x01,0x3e,0x01,0x37,0x3e,0x01,0x35,0x13,0x23,0x35,
-0x33,0x01,0xf4,0xbe,0x37,0x5a,0x5a,0x3a,0x33,0x83,0x6d,0x4e,0xb4,0x60,0x5e,0xc0,
-0x67,0xb8,0xe0,0x49,0x59,0x58,0x30,0x26,0x08,0x07,0x06,0xc4,0xca,0xca,0x04,0x44,
-0x9c,0x65,0x82,0x57,0x58,0x35,0x5e,0x31,0x59,0x6e,0x46,0x43,0xbc,0x39,0x38,0xc2,
-0x9f,0x4c,0x89,0x56,0x56,0x2f,0x35,0x19,0x15,0x3c,0x36,0x01,0x0e,0xfe,0xff,0xff,
-0x00,0x10,0x00,0x00,0x05,0x68,0x07,0x6b,0x12,0x26,0x00,0x24,0x00,0x00,0x10,0x07,
-0x0b,0xec,0x04,0xbc,0x01,0x75,0xff,0xff,0x00,0x10,0x00,0x00,0x05,0x68,0x07,0x6b,
-0x12,0x26,0x00,0x24,0x00,0x00,0x10,0x07,0x0b,0xea,0x04,0xbc,0x01,0x75,0xff,0xff,
-0x00,0x10,0x00,0x00,0x05,0x68,0x07,0x6d,0x12,0x26,0x00,0x24,0x00,0x00,0x11,0x07,
-0x0b,0xed,0x04,0xbc,0x01,0x75,0x00,0x10,0xb4,0x05,0x0d,0x11,0x0a,0x07,0x2b,0x40,
-0x05,0x0f,0x0d,0x00,0x11,0x02,0x5d,0x31,0xff,0xff,0x00,0x10,0x00,0x00,0x05,0x68,
-0x07,0x5e,0x12,0x26,0x00,0x24,0x00,0x00,0x11,0x07,0x0b,0xeb,0x04,0xbc,0x01,0x75,
-0x00,0x14,0xb4,0x0a,0x14,0x23,0x05,0x07,0x2b,0x40,0x09,0x40,0x14,0x4f,0x23,0x20,
-0x14,0x2f,0x23,0x04,0x5d,0x31,0xff,0xff,0x00,0x10,0x00,0x00,0x05,0x68,0x07,0x4e,
-0x12,0x26,0x00,0x24,0x00,0x00,0x11,0x07,0x0b,0xe9,0x04,0xbc,0x01,0x75,0x00,0x14,
-0xb4,0x0a,0x12,0x0d,0x05,0x07,0x2b,0x40,0x09,0x30,0x12,0x3f,0x0d,0x00,0x12,0x0f,
-0x0d,0x04,0x5d,0x31,0x00,0x03,0x00,0x10,0x00,0x00,0x05,0x68,0x07,0x6d,0x00,0x0b,
-0x00,0x0e,0x00,0x21,0x00,0xcb,0x40,0x54,0x0c,0x11,0x0d,0x0c,0x1b,0x1c,0x1b,0x0e,
-0x11,0x1c,0x1b,0x1e,0x11,0x1c,0x1b,0x1d,0x11,0x1c,0x1c,0x1b,0x0d,0x11,0x21,0x0f,
-0x21,0x0c,0x11,0x0e,0x0c,0x0f,0x0f,0x21,0x20,0x11,0x0f,0x21,0x1f,0x11,0x21,0x0f,
-0x21,0x42,0x0c,0x1b,0x0f,0x0d,0x09,0x03,0xc1,0x15,0x09,0x1e,0x95,0x0d,0x09,0x8e,
-0x20,0x1c,0x1e,0x1d,0x1c,0x18,0x20,0x1f,0x21,0x0d,0x12,0x06,0x0e,0x18,0x0c,0x06,
-0x1b,0x00,0x56,0x18,0x1c,0x0f,0x06,0x56,0x12,0x1c,0x21,0x22,0x10,0xd4,0xc4,0xd4,
-0xec,0x32,0x10,0xd4,0xee,0x32,0x11,0x39,0x11,0x39,0x11,0x12,0x39,0x11,0x39,0x39,
-0x11,0x12,0x39,0x39,0x31,0x00,0x2f,0x3c,0xe6,0xd6,0xee,0x10,0xd4,0xee,0x11,0x12,
-0x39,0x39,0x39,0x30,0x4b,0x53,0x58,0x07,0x10,0x05,0xed,0x07,0x05,0xed,0x07,0x10,
-0x08,0xed,0x07,0x10,0x05,0xed,0x07,0x10,0x05,0xed,0x07,0x05,0xed,0x07,0x05,0xed,
-0x07,0x10,0x08,0xed,0x59,0x22,0xb2,0x20,0x23,0x01,0x01,0x5d,0x40,0x20,0x1a,0x0c,
-0x73,0x0c,0x9b,0x0c,0x03,0x07,0x0f,0x08,0x1b,0x50,0x23,0x66,0x0d,0x69,0x0e,0x75,
-0x0d,0x7b,0x0e,0x79,0x1c,0x79,0x1d,0x76,0x20,0x76,0x21,0x80,0x23,0x0c,0x5d,0x00,
-0x5d,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x03,0x01,0x21,
-0x01,0x2e,0x01,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x01,0x23,0x03,
-0x21,0x03,0x23,0x03,0x54,0x59,0x3f,0x40,0x57,0x58,0x3f,0x3f,0x59,0x98,0xfe,0xf0,
-0x02,0x21,0xfe,0x58,0x3d,0x3e,0x9f,0x73,0x72,0xa1,0x3f,0x3c,0x02,0x14,0xd2,0x88,
-0xfd,0x5f,0x88,0xd5,0x06,0x5a,0x3f,0x59,0x57,0x41,0x3f,0x58,0x58,0xfe,0xf3,0xfd,
-0x19,0x03,0x4e,0x29,0x73,0x49,0x73,0xa0,0xa1,0x72,0x46,0x76,0x29,0xfa,0x8b,0x01,
-0x7f,0xfe,0x81,0x00,0x00,0x02,0x00,0x08,0x00,0x00,0x07,0x48,0x05,0xd5,0x00,0x0f,
-0x00,0x13,0x00,0x87,0x40,0x39,0x11,0x11,0x0e,0x0f,0x0e,0x10,0x11,0x0f,0x0f,0x0e,
-0x0d,0x11,0x0f,0x0e,0x0c,0x11,0x0e,0x0f,0x0e,0x42,0x05,0x95,0x03,0x0b,0x95,0x11,
-0x01,0x95,0x10,0x95,0x00,0x81,0x11,0x07,0x95,0x03,0xad,0x0d,0x09,0x11,0x10,0x0f,
-0x0d,0x0c,0x05,0x0e,0x0a,0x00,0x04,0x08,0x06,0x02,0x1c,0x12,0x0a,0x0e,0x14,0x10,
-0xd4,0xd4,0x3c,0xec,0x32,0xd4,0xc4,0xc4,0x11,0x12,0x17,0x39,0x31,0x00,0x2f,0x3c,
-0xec,0xec,0xc4,0xf4,0xec,0xec,0x10,0xee,0x10,0xee,0x30,0x4b,0x53,0x58,0x07,0x10,
-0x05,0xed,0x07,0x05,0xed,0x07,0x10,0x05,0xed,0x07,0x10,0x05,0xed,0x59,0x22,0xb2,
-0x80,0x15,0x01,0x01,0x5d,0x40,0x13,0x67,0x11,0x77,0x10,0x77,0x11,0x86,0x0c,0x85,
-0x10,0x96,0x11,0x90,0x15,0xa0,0x15,0xbf,0x15,0x09,0x5d,0x01,0x15,0x21,0x11,0x21,
-0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x03,0x23,0x01,0x17,0x01,0x21,0x11,0x07,
-0x35,0xfd,0x1b,0x02,0xc7,0xfd,0x39,0x02,0xf8,0xfc,0x3d,0xfd,0xf0,0xa0,0xcd,0x02,
-0x71,0x8b,0xfe,0xb6,0x01,0xcb,0x05,0xd5,0xaa,0xfe,0x46,0xaa,0xfd,0xe3,0xaa,0x01,
-0x7f,0xfe,0x81,0x05,0xd5,0x9e,0xfc,0xf0,0x03,0x10,0xff,0xff,0x00,0x73,0xfe,0x75,
-0x05,0x27,0x05,0xf0,0x12,0x26,0x00,0x26,0x00,0x00,0x10,0x07,0x00,0x7a,0x01,0x2d,
-0x00,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,0x04,0x8b,0x07,0x6b,0x12,0x26,0x00,0x28,
-0x00,0x00,0x10,0x07,0x0b,0xec,0x04,0x9e,0x01,0x75,0xff,0xff,0x00,0xc9,0x00,0x00,
-0x04,0x8b,0x07,0x6b,0x12,0x26,0x00,0x28,0x00,0x00,0x10,0x07,0x0b,0xea,0x04,0x9e,
-0x01,0x75,0xff,0xff,0x00,0xc9,0x00,0x00,0x04,0x8b,0x07,0x6d,0x12,0x26,0x00,0x28,
-0x00,0x00,0x11,0x07,0x0b,0xed,0x04,0x9e,0x01,0x75,0x00,0x07,0x40,0x03,0x40,0x0c,
-0x01,0x5d,0x31,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,0x04,0x8b,0x07,0x4e,0x12,0x26,
-0x00,0x28,0x00,0x00,0x11,0x07,0x0b,0xe9,0x04,0x9e,0x01,0x75,0x00,0x09,0x40,0x05,
-0x40,0x0c,0x40,0x10,0x02,0x5d,0x31,0x00,0xff,0xff,0x00,0x3b,0x00,0x00,0x01,0xba,
-0x07,0x6b,0x12,0x26,0x00,0x2c,0x00,0x00,0x10,0x07,0x0b,0xec,0x03,0x2f,0x01,0x75,
-0xff,0xff,0x00,0xa2,0x00,0x00,0x02,0x1f,0x07,0x6b,0x12,0x26,0x00,0x2c,0x00,0x00,
-0x10,0x07,0x0b,0xea,0x03,0x2f,0x01,0x75,0xff,0xff,0xff,0xfe,0x00,0x00,0x02,0x60,
-0x07,0x6d,0x12,0x26,0x00,0x2c,0x00,0x00,0x11,0x07,0x0b,0xed,0x03,0x2f,0x01,0x75,
-0x00,0x08,0xb4,0x01,0x06,0x0a,0x00,0x07,0x2b,0x31,0xff,0xff,0x00,0x06,0x00,0x00,
-0x02,0x58,0x07,0x4e,0x12,0x26,0x00,0x2c,0x00,0x00,0x11,0x07,0x0b,0xe9,0x03,0x2f,
-0x01,0x75,0x00,0x08,0xb4,0x00,0x0a,0x07,0x01,0x07,0x2b,0x31,0x00,0x02,0x00,0x0a,
-0x00,0x00,0x05,0xba,0x05,0xd5,0x00,0x0c,0x00,0x19,0x00,0x67,0x40,0x20,0x10,0x09,
-0xa9,0x0b,0x0d,0x95,0x00,0x81,0x12,0x95,0x0e,0x0b,0x07,0x07,0x01,0x19,0x13,0x04,
-0x0f,0x0d,0x16,0x19,0x04,0x32,0x0a,0x11,0x0d,0x1c,0x08,0x00,0x79,0x1a,0x10,0xf4,
-0x3c,0xec,0x32,0xc4,0xf4,0xec,0x10,0xc4,0x17,0x39,0x31,0x00,0x2f,0xc6,0x32,0xee,
-0xf6,0xee,0x10,0xee,0x32,0x30,0x40,0x28,0x20,0x1b,0x7f,0x1b,0xb0,0x1b,0x03,0x9f,
-0x09,0x9f,0x0a,0x9f,0x0b,0x9f,0x0c,0x9f,0x0e,0x9f,0x0f,0x9f,0x10,0x9f,0x11,0xbf,
-0x09,0xbf,0x0a,0xbf,0x0b,0xbf,0x0c,0xbf,0x0e,0xbf,0x0f,0xbf,0x10,0xbf,0x11,0x10,
-0x5d,0x01,0x5d,0x13,0x21,0x20,0x00,0x11,0x10,0x00,0x29,0x01,0x11,0x23,0x35,0x33,
-0x13,0x11,0x21,0x15,0x21,0x11,0x33,0x20,0x00,0x11,0x10,0x00,0x21,0xd3,0x01,0xa0,
-0x01,0xb1,0x01,0x96,0xfe,0x69,0xfe,0x50,0xfe,0x60,0xc9,0xc9,0xcb,0x01,0x50,0xfe,
-0xb0,0xf3,0x01,0x35,0x01,0x1f,0xfe,0xe1,0xfe,0xcb,0x05,0xd5,0xfe,0x97,0xfe,0x80,
-0xfe,0x7e,0xfe,0x96,0x02,0xbc,0x90,0x01,0xe3,0xfe,0x1d,0x90,0xfd,0xea,0x01,0x18,
-0x01,0x2e,0x01,0x2c,0x01,0x17,0xff,0xff,0x00,0xc9,0x00,0x00,0x05,0x33,0x07,0x5e,
-0x12,0x26,0x00,0x31,0x00,0x00,0x11,0x07,0x0b,0xeb,0x04,0xfe,0x01,0x75,0x00,0x14,
-0xb4,0x00,0x13,0x22,0x04,0x07,0x2b,0x40,0x09,0x30,0x13,0x3f,0x22,0x10,0x13,0x1f,
-0x22,0x04,0x5d,0x31,0xff,0xff,0x00,0x73,0xff,0xe3,0x05,0xd9,0x07,0x6b,0x12,0x26,
-0x00,0x32,0x00,0x00,0x10,0x07,0x0b,0xec,0x05,0x27,0x01,0x75,0xff,0xff,0x00,0x73,
-0xff,0xe3,0x05,0xd9,0x07,0x6b,0x12,0x26,0x00,0x32,0x00,0x00,0x10,0x07,0x0b,0xea,
-0x05,0x27,0x01,0x75,0xff,0xff,0x00,0x73,0xff,0xe3,0x05,0xd9,0x07,0x6d,0x12,0x26,
-0x00,0x32,0x00,0x00,0x11,0x07,0x0b,0xed,0x05,0x27,0x01,0x75,0x00,0x10,0xb4,0x0f,
-0x1a,0x1e,0x15,0x07,0x2b,0x40,0x05,0x1f,0x1a,0x10,0x1e,0x02,0x5d,0x31,0xff,0xff,
-0x00,0x73,0xff,0xe3,0x05,0xd9,0x07,0x5e,0x12,0x26,0x00,0x32,0x00,0x00,0x11,0x07,
-0x0b,0xeb,0x05,0x27,0x01,0x75,0x00,0x18,0xb4,0x03,0x21,0x30,0x09,0x07,0x2b,0x40,
-0x0d,0x30,0x21,0x3f,0x30,0x20,0x21,0x2f,0x30,0x10,0x21,0x1f,0x30,0x06,0x5d,0x31,
-0xff,0xff,0x00,0x73,0xff,0xe3,0x05,0xd9,0x07,0x4e,0x12,0x26,0x00,0x32,0x00,0x00,
-0x11,0x07,0x0b,0xe9,0x05,0x27,0x01,0x75,0x00,0x14,0xb4,0x03,0x1f,0x1a,0x09,0x07,
-0x2b,0x40,0x09,0x40,0x1f,0x4f,0x1a,0x10,0x1f,0x1f,0x1a,0x04,0x5d,0x31,0x00,0x01,
-0x01,0x19,0x00,0x3f,0x05,0x9c,0x04,0xc5,0x00,0x0b,0x00,0x85,0x40,0x4d,0x0a,0x9c,
-0x0b,0x0a,0x07,0x08,0x07,0x09,0x9c,0x08,0x08,0x07,0x04,0x9c,0x03,0x04,0x07,0x07,
-0x06,0x05,0x9c,0x06,0x07,0x06,0x04,0x9c,0x05,0x04,0x01,0x02,0x01,0x03,0x9c,0x02,
-0x02,0x01,0x0b,0x9c,0x00,0x01,0x00,0x0a,0x9c,0x09,0x0a,0x01,0x01,0x00,0x42,0x0a,
-0x08,0x07,0x06,0x04,0x02,0x01,0x00,0x08,0x05,0x03,0x0b,0x09,0x0c,0x0b,0x0a,0x09,
-0x07,0x05,0x04,0x03,0x01,0x08,0x02,0x00,0x08,0x06,0x0c,0x10,0xd4,0x3c,0xcc,0x32,
-0x17,0x39,0x31,0x00,0x10,0xd4,0x3c,0xcc,0x32,0x17,0x39,0x30,0x4b,0x53,0x58,0x07,
-0x10,0x08,0xed,0x07,0x10,0x05,0xed,0x07,0x10,0x05,0xed,0x07,0x10,0x08,0xed,0x07,
-0x10,0x05,0xed,0x07,0x10,0x08,0xed,0x07,0x10,0x05,0xed,0x07,0x10,0x08,0xed,0x59,
-0x22,0x09,0x02,0x07,0x09,0x01,0x27,0x09,0x01,0x37,0x09,0x01,0x05,0x9c,0xfe,0x37,
-0x01,0xc9,0x77,0xfe,0x35,0xfe,0x35,0x76,0x01,0xc8,0xfe,0x38,0x76,0x01,0xcb,0x01,
-0xcb,0x04,0x4c,0xfe,0x35,0xfe,0x37,0x79,0x01,0xcb,0xfe,0x35,0x79,0x01,0xc9,0x01,
-0xcb,0x79,0xfe,0x35,0x01,0xcb,0x00,0x03,0x00,0x66,0xff,0xba,0x05,0xe5,0x06,0x17,
-0x00,0x09,0x00,0x13,0x00,0x2b,0x00,0x9e,0x40,0x3c,0x1d,0x1f,0x1a,0x0d,0x2b,0x2c,
-0x13,0x0a,0x01,0x00,0x04,0x0d,0x29,0x26,0x20,0x14,0x0d,0x04,0x2a,0x26,0x1e,0x1a,
-0x04,0x95,0x26,0x0d,0x95,0x1a,0x91,0x26,0x8c,0x2c,0x2b,0x2c,0x2a,0x14,0x17,0x10,
-0x20,0x1e,0x23,0x13,0x0a,0x01,0x00,0x04,0x1d,0x29,0x10,0x07,0x1f,0x07,0x19,0x23,
-0x33,0x10,0x19,0x17,0x10,0x2c,0x10,0xfc,0xec,0xfc,0xec,0xc0,0x11,0x12,0x39,0x39,
-0x17,0x39,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x11,0x39,0x31,0x00,0x10,0xe4,0xf4,
-0xec,0x10,0xee,0x10,0xc0,0x10,0xc0,0x11,0x12,0x39,0x39,0x12,0x39,0x12,0x17,0x39,
-0x12,0x39,0x11,0x12,0x39,0x39,0x30,0x40,0x2a,0x57,0x00,0x5a,0x15,0x57,0x19,0x55,
-0x21,0x6a,0x15,0x65,0x21,0x7b,0x15,0x76,0x1c,0x75,0x21,0x09,0x46,0x13,0x59,0x00,
-0x56,0x13,0x6a,0x00,0x64,0x13,0x64,0x1c,0x6a,0x28,0x7c,0x00,0x73,0x13,0x76,0x1c,
-0x7a,0x28,0x0b,0x5d,0x01,0x5d,0x09,0x01,0x1e,0x01,0x33,0x32,0x00,0x11,0x34,0x26,
-0x27,0x2e,0x01,0x23,0x22,0x00,0x11,0x14,0x16,0x17,0x07,0x26,0x02,0x35,0x10,0x00,
-0x21,0x32,0x16,0x17,0x37,0x17,0x07,0x16,0x12,0x15,0x10,0x00,0x21,0x22,0x26,0x27,
-0x07,0x27,0x04,0xb6,0xfd,0x33,0x3e,0xa1,0x5f,0xdc,0x01,0x01,0x27,0x79,0x3d,0xa1,
-0x5f,0xdc,0xfe,0xfd,0x27,0x27,0x86,0x4e,0x4f,0x01,0x79,0x01,0x3b,0x82,0xdd,0x57,
-0xa2,0x66,0xaa,0x4e,0x50,0xfe,0x88,0xfe,0xc6,0x80,0xdd,0x5b,0xa2,0x67,0x04,0x58,
-0xfc,0xb2,0x40,0x43,0x01,0x48,0x01,0x1a,0x70,0xb8,0xb8,0x40,0x43,0xfe,0xb8,0xfe,
-0xe5,0x70,0xbc,0x44,0x9e,0x66,0x01,0x08,0xa0,0x01,0x62,0x01,0xa5,0x4d,0x4b,0xbf,
-0x59,0xc6,0x67,0xfe,0xf6,0x9e,0xfe,0x9f,0xfe,0x5b,0x4b,0x4b,0xbf,0x58,0xff,0xff,
-0x00,0xb2,0xff,0xe3,0x05,0x29,0x07,0x6b,0x12,0x26,0x00,0x38,0x00,0x00,0x10,0x07,
-0x0b,0xec,0x04,0xee,0x01,0x75,0xff,0xff,0x00,0xb2,0xff,0xe3,0x05,0x29,0x07,0x6b,
-0x12,0x26,0x00,0x38,0x00,0x00,0x10,0x07,0x0b,0xea,0x04,0xee,0x01,0x75,0xff,0xff,
-0x00,0xb2,0xff,0xe3,0x05,0x29,0x07,0x6d,0x12,0x26,0x00,0x38,0x00,0x00,0x11,0x07,
-0x0b,0xed,0x04,0xee,0x01,0x75,0x00,0x14,0xb4,0x0a,0x14,0x18,0x00,0x07,0x2b,0x40,
-0x09,0x2f,0x14,0x20,0x18,0x1f,0x14,0x10,0x18,0x04,0x5d,0x31,0xff,0xff,0x00,0xb2,
-0xff,0xe3,0x05,0x29,0x07,0x4e,0x12,0x26,0x00,0x38,0x00,0x00,0x11,0x07,0x0b,0xe9,
-0x04,0xee,0x01,0x75,0x00,0x1c,0xb4,0x01,0x19,0x14,0x09,0x07,0x2b,0x40,0x11,0x50,
-0x19,0x5f,0x14,0x40,0x19,0x4f,0x14,0x20,0x19,0x2f,0x14,0x10,0x19,0x1f,0x14,0x08,
-0x5d,0x31,0xff,0xff,0xff,0xfc,0x00,0x00,0x04,0xe7,0x07,0x6b,0x12,0x26,0x00,0x3c,
-0x00,0x00,0x10,0x07,0x0b,0xea,0x04,0x73,0x01,0x75,0x00,0x02,0x00,0xc9,0x00,0x00,
-0x04,0x8d,0x05,0xd5,0x00,0x0c,0x00,0x15,0x00,0x3d,0x40,0x1b,0x0e,0x95,0x09,0x0d,
-0x95,0x02,0xf6,0x00,0x81,0x0b,0x15,0x0f,0x09,0x03,0x04,0x01,0x12,0x19,0x06,0x3f,
-0x0d,0x0a,0x01,0x1c,0x00,0x04,0x16,0x10,0xfc,0xec,0x32,0x32,0xfc,0xec,0x11,0x17,
-0x39,0x31,0x00,0x2f,0xf4,0xfc,0xec,0xd4,0xec,0x30,0x40,0x09,0x0f,0x17,0x1f,0x17,
-0x3f,0x17,0x5f,0x17,0x04,0x01,0x5d,0x13,0x33,0x11,0x33,0x32,0x04,0x15,0x14,0x04,
-0x2b,0x01,0x11,0x23,0x13,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0xc9,0xca,0xfe,
-0xfb,0x01,0x01,0xfe,0xff,0xfb,0xfe,0xca,0xca,0xfe,0x8d,0x9a,0x99,0x8e,0x05,0xd5,
-0xfe,0xf8,0xe1,0xdc,0xdc,0xe2,0xfe,0xae,0x04,0x27,0xfd,0xd1,0x92,0x86,0x86,0x91,
-0x00,0x01,0x00,0xba,0xff,0xe3,0x04,0xac,0x06,0x14,0x00,0x2f,0x00,0x9a,0x40,0x30,
-0x2d,0x27,0x21,0x0c,0x04,0x06,0x0d,0x20,0x00,0x04,0x2a,0x16,0x86,0x17,0x1a,0xb9,
-0x13,0x2a,0xb9,0x03,0x97,0x13,0x8c,0x2e,0x0c,0x09,0x0d,0x1d,0x20,0x21,0x27,0x09,
-0x08,0x24,0x27,0x08,0x06,0x1d,0x08,0x24,0x10,0x16,0x2d,0x08,0x10,0x00,0x46,0x30,
-0x10,0xfc,0xc4,0xfc,0xcc,0x10,0xc6,0xee,0xd4,0xee,0x10,0xee,0x11,0x39,0x39,0x12,
-0x39,0x12,0x39,0x31,0x00,0x2f,0xe4,0xfe,0xee,0x10,0xfe,0xd5,0xee,0x12,0x17,0x39,
-0x17,0x39,0x30,0x40,0x40,0x0f,0x05,0x0f,0x06,0x0f,0x07,0x0f,0x27,0x0f,0x28,0x8a,
-0x0c,0x8a,0x0d,0x07,0x0a,0x06,0x0a,0x07,0x0a,0x0b,0x0a,0x0c,0x0a,0x0d,0x0a,0x1f,
-0x0d,0x20,0x0a,0x21,0x0c,0x22,0x04,0x26,0x19,0x0d,0x19,0x1f,0x19,0x20,0x3a,0x20,
-0x3a,0x21,0x4d,0x1f,0x4d,0x20,0x49,0x21,0x49,0x22,0x6a,0x1f,0x6a,0x20,0xa5,0x06,
-0xa5,0x07,0xa6,0x20,0x18,0x5d,0x01,0x5d,0x13,0x34,0x36,0x33,0x32,0x16,0x17,0x0e,
-0x01,0x15,0x14,0x16,0x1f,0x01,0x1e,0x01,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x35,
-0x1e,0x01,0x33,0x32,0x36,0x35,0x34,0x26,0x2f,0x01,0x2e,0x01,0x35,0x34,0x36,0x37,
-0x2e,0x01,0x23,0x22,0x06,0x15,0x11,0x23,0xba,0xef,0xda,0xd0,0xdb,0x03,0x97,0xa8,
-0x3a,0x41,0x39,0xa6,0x60,0xe1,0xd3,0x40,0x88,0x49,0x50,0x8c,0x41,0x74,0x78,0x3b,
-0x65,0x5c,0x60,0x57,0xa7,0x97,0x08,0x83,0x71,0x82,0x88,0xbb,0x04,0x71,0xc8,0xdb,
-0xe8,0xe0,0x08,0x73,0x60,0x2f,0x51,0x2a,0x25,0x6a,0x8e,0x64,0xac,0xb7,0x19,0x18,
-0xa4,0x1e,0x1d,0x5f,0x5b,0x3f,0x54,0x3e,0x37,0x3b,0x87,0x5b,0x7f,0xac,0x1d,0x67,
-0x70,0x8b,0x83,0xfb,0x93,0x00,0xff,0xff,0x00,0x7b,0xff,0xe3,0x04,0x2d,0x06,0x66,
-0x12,0x26,0x00,0x44,0x00,0x00,0x11,0x06,0x00,0x43,0x52,0x00,0x00,0x0b,0x40,0x07,
-0x3f,0x26,0x2f,0x26,0x1f,0x26,0x03,0x5d,0x31,0x00,0xff,0xff,0x00,0x7b,0xff,0xe3,
-0x04,0x2d,0x06,0x66,0x12,0x26,0x00,0x44,0x00,0x00,0x11,0x06,0x00,0x76,0x52,0x00,
-0x00,0x0b,0x40,0x07,0x3f,0x26,0x2f,0x26,0x1f,0x26,0x03,0x5d,0x31,0x00,0xff,0xff,
-0x00,0x7b,0xff,0xe3,0x04,0x2d,0x06,0x66,0x12,0x26,0x00,0x44,0x00,0x00,0x11,0x06,
-0x02,0x7a,0x52,0x00,0x00,0x08,0xb4,0x0b,0x28,0x2c,0x14,0x07,0x2b,0x31,0xff,0xff,
-0x00,0x7b,0xff,0xe3,0x04,0x2d,0x06,0x37,0x12,0x26,0x00,0x44,0x00,0x00,0x11,0x06,
-0x02,0x90,0x52,0x00,0x00,0x14,0xb4,0x14,0x2e,0x3c,0x0b,0x07,0x2b,0x40,0x09,0x20,
-0x2e,0x2f,0x3c,0x10,0x2e,0x1f,0x3c,0x04,0x5d,0x31,0xff,0xff,0x00,0x7b,0xff,0xe3,
-0x04,0x2d,0x06,0x10,0x12,0x26,0x00,0x44,0x00,0x00,0x11,0x06,0x00,0x6a,0x52,0x00,
-0x00,0x20,0xb4,0x14,0x2d,0x28,0x0b,0x07,0x2b,0x40,0x15,0x7f,0x28,0x6f,0x28,0x50,
-0x2d,0x5f,0x28,0x40,0x2d,0x4f,0x28,0x30,0x2d,0x3f,0x28,0x00,0x2d,0x0f,0x28,0x0a,
-0x5d,0x31,0xff,0xff,0x00,0x7b,0xff,0xe3,0x04,0x2d,0x07,0x06,0x12,0x26,0x00,0x44,
-0x00,0x00,0x11,0x06,0x02,0x8e,0x52,0x00,0x00,0x25,0x40,0x0e,0x26,0x2c,0x14,0x2c,
-0x26,0x0b,0x07,0x32,0x38,0x14,0x38,0x32,0x0b,0x07,0x2b,0x10,0xc4,0x2b,0x10,0xc4,
-0x31,0x00,0x40,0x09,0x3f,0x35,0x3f,0x2f,0x0f,0x35,0x0f,0x2f,0x04,0x5d,0x30,0x00,
-0x00,0x03,0x00,0x7b,0xff,0xe3,0x07,0x6f,0x04,0x7b,0x00,0x06,0x00,0x33,0x00,0x3e,
-0x01,0x03,0x40,0x43,0x27,0x2d,0x25,0x3d,0x0e,0x0d,0x00,0x34,0xa9,0x25,0x16,0x86,
-0x15,0x88,0x12,0x00,0xa9,0x0e,0x3a,0x12,0xb9,0x1c,0x19,0x2e,0x86,0x2d,0xba,0x2a,
-0x03,0xb9,0x0e,0xbb,0x07,0x31,0x0a,0xb8,0x1f,0x19,0x8c,0x25,0x3f,0x34,0x37,0x26,
-0x06,0x0f,0x00,0x25,0x37,0x1c,0x07,0x26,0x0f,0x15,0x00,0x08,0x0d,0x3d,0x26,0x08,
-0x0f,0x2d,0x37,0x08,0x22,0x45,0x3f,0x10,0xfc,0xec,0xcc,0xd4,0xfc,0x3c,0xd4,0xec,
-0xc4,0x11,0x12,0x39,0x39,0x11,0x39,0x11,0x12,0x39,0x11,0x12,0x39,0x31,0x00,0x10,
-0xc4,0xe4,0x32,0xf4,0x3c,0xc4,0xe4,0xfc,0x3c,0xf4,0xec,0x10,0xc4,0xee,0x32,0x10,
-0xee,0x10,0xf4,0xee,0x10,0xee,0x11,0x39,0x11,0x39,0x11,0x12,0x39,0x30,0x40,0x81,
-0x30,0x2b,0x30,0x2c,0x30,0x2d,0x30,0x2e,0x30,0x2f,0x30,0x30,0x40,0x2b,0x40,0x2c,
-0x40,0x2d,0x40,0x2e,0x40,0x2f,0x40,0x30,0x50,0x2b,0x50,0x2c,0x50,0x2d,0x50,0x2e,
-0x50,0x2f,0x50,0x30,0x85,0x2b,0x85,0x30,0x80,0x40,0x90,0x40,0xa0,0x40,0xb0,0x40,
-0xc0,0x40,0xd0,0x40,0xe0,0x40,0xe0,0x40,0xf0,0x40,0x1d,0x3f,0x00,0x3f,0x06,0x3f,
-0x0d,0x3f,0x0e,0x3f,0x0f,0x05,0x30,0x2c,0x30,0x2d,0x30,0x2e,0x30,0x2f,0x40,0x2c,
-0x40,0x2d,0x40,0x2e,0x40,0x2f,0x50,0x2c,0x50,0x2d,0x50,0x2e,0x50,0x2f,0x6f,0x00,
-0x6f,0x06,0x6f,0x0d,0x6f,0x0e,0x6f,0x0f,0x60,0x2c,0x60,0x2d,0x60,0x2e,0x60,0x2f,
-0x70,0x2c,0x70,0x2d,0x70,0x2e,0x70,0x2f,0x80,0x2c,0x80,0x2d,0x80,0x2e,0x80,0x2f,
-0x1d,0x5d,0x71,0x01,0x5d,0x01,0x2e,0x01,0x23,0x22,0x06,0x07,0x03,0x3e,0x01,0x33,
-0x32,0x00,0x1d,0x01,0x21,0x1e,0x01,0x33,0x32,0x36,0x37,0x15,0x0e,0x01,0x23,0x22,
-0x26,0x27,0x0e,0x01,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x35,0x34,0x26,0x23,
-0x22,0x06,0x07,0x35,0x3e,0x01,0x33,0x32,0x16,0x03,0x22,0x06,0x15,0x14,0x16,0x33,
-0x32,0x36,0x3d,0x01,0x06,0xb6,0x01,0xa5,0x89,0x99,0xb9,0x0e,0x44,0x4a,0xd4,0x84,
-0xe2,0x01,0x08,0xfc,0xb2,0x0c,0xcc,0xb7,0x68,0xc8,0x64,0x64,0xd0,0x6a,0xa7,0xf8,
-0x4d,0x49,0xd8,0x8f,0xbd,0xd2,0xfd,0xfb,0x01,0x02,0xa7,0x97,0x60,0xb6,0x54,0x65,
-0xbe,0x5a,0x8e,0xd5,0xef,0xdf,0xac,0x81,0x6f,0x99,0xb9,0x02,0x94,0x97,0xb4,0xae,
-0x9e,0x01,0x30,0x5a,0x5e,0xfe,0xdd,0xfa,0x5a,0xbf,0xc8,0x35,0x35,0xae,0x2a,0x2c,
-0x79,0x77,0x78,0x78,0xbb,0xa8,0xbd,0xc0,0x12,0x7f,0x8b,0x2e,0x2e,0xaa,0x27,0x27,
-0x60,0xfe,0x18,0x66,0x7b,0x62,0x73,0xd9,0xb4,0x29,0xff,0xff,0x00,0x71,0xfe,0x75,
-0x03,0xe7,0x04,0x7b,0x12,0x26,0x00,0x46,0x00,0x00,0x10,0x07,0x00,0x7a,0x00,0x8f,
-0x00,0x00,0xff,0xff,0x00,0x71,0xff,0xe3,0x04,0x7f,0x06,0x66,0x12,0x26,0x00,0x48,
-0x00,0x00,0x10,0x07,0x00,0x43,0x00,0x8b,0x00,0x00,0xff,0xff,0x00,0x71,0xff,0xe3,
-0x04,0x7f,0x06,0x66,0x12,0x26,0x00,0x48,0x00,0x00,0x10,0x07,0x00,0x76,0x00,0x8b,
-0x00,0x00,0xff,0xff,0x00,0x71,0xff,0xe3,0x04,0x7f,0x06,0x66,0x12,0x26,0x00,0x48,
-0x00,0x00,0x11,0x07,0x02,0x7a,0x00,0x8b,0x00,0x00,0x00,0x08,0xb4,0x15,0x1e,0x22,
-0x1b,0x07,0x2b,0x31,0xff,0xff,0x00,0x71,0xff,0xe3,0x04,0x7f,0x06,0x10,0x12,0x26,
-0x00,0x48,0x00,0x00,0x11,0x07,0x00,0x6a,0x00,0x8b,0x00,0x00,0x00,0x07,0x40,0x03,
-0x40,0x20,0x01,0x5d,0x31,0x00,0xff,0xff,0xff,0xc7,0x00,0x00,0x01,0xa6,0x06,0x66,
-0x12,0x26,0x00,0xf3,0x00,0x00,0x10,0x07,0x00,0x43,0xff,0x1d,0x00,0x00,0xff,0xff,
-0x00,0x90,0x00,0x00,0x02,0x6f,0x06,0x66,0x12,0x26,0x00,0xf3,0x00,0x00,0x10,0x07,
-0x00,0x76,0xff,0x1d,0x00,0x00,0xff,0xff,0xff,0xde,0x00,0x00,0x02,0x5c,0x06,0x66,
-0x12,0x26,0x00,0xf3,0x00,0x00,0x11,0x07,0x02,0x7a,0xff,0x1d,0x00,0x00,0x00,0x08,
-0xb4,0x01,0x06,0x0a,0x00,0x07,0x2b,0x31,0xff,0xff,0xff,0xf4,0x00,0x00,0x02,0x46,
-0x06,0x10,0x12,0x26,0x00,0xf3,0x00,0x00,0x11,0x07,0x00,0x6a,0xff,0x1d,0x00,0x00,
-0x00,0x08,0xb4,0x00,0x0a,0x07,0x01,0x07,0x2b,0x31,0x00,0x02,0x00,0x71,0xff,0xe3,
-0x04,0x75,0x06,0x14,0x00,0x0e,0x00,0x28,0x01,0x27,0x40,0x5e,0x25,0x7b,0x26,0x25,
-0x1e,0x23,0x1e,0x24,0x7b,0x23,0x23,0x1e,0x0f,0x7b,0x23,0x1e,0x28,0x7b,0x27,0x28,
-0x1e,0x23,0x1e,0x26,0x27,0x28,0x27,0x25,0x24,0x25,0x28,0x28,0x27,0x22,0x23,0x22,
-0x1f,0x20,0x1f,0x21,0x20,0x20,0x1f,0x42,0x28,0x27,0x26,0x25,0x22,0x21,0x20,0x1f,
-0x08,0x23,0x1e,0x03,0x0f,0x23,0x03,0xb9,0x1b,0x09,0xb9,0x15,0x8c,0x1b,0x23,0xb1,
-0x29,0x26,0x27,0x12,0x0c,0x21,0x20,0x18,0x28,0x25,0x23,0x22,0x1f,0x05,0x1e,0x0f,
-0x06,0x0c,0x12,0x12,0x51,0x06,0x12,0x18,0x45,0x29,0x10,0xfc,0xec,0xf4,0xec,0x11,
-0x39,0x39,0x17,0x39,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x31,0x00,0x10,0xec,0xc4,
-0xf4,0xec,0x10,0xee,0x12,0x39,0x12,0x39,0x12,0x17,0x39,0x30,0x4b,0x53,0x58,0x07,
-0x10,0x0e,0xc9,0x07,0x10,0x08,0xc9,0x07,0x10,0x08,0xc9,0x07,0x10,0x0e,0xc9,0x07,
-0x10,0x08,0xed,0x07,0x0e,0xed,0x07,0x10,0x05,0xed,0x07,0x10,0x08,0xed,0x59,0x22,
-0xb2,0x3f,0x2a,0x01,0x01,0x5d,0x40,0x76,0x16,0x25,0x2b,0x1f,0x28,0x22,0x2f,0x23,
-0x2f,0x24,0x29,0x25,0x2d,0x26,0x2d,0x27,0x2a,0x28,0x36,0x25,0x46,0x25,0x58,0x20,
-0x58,0x21,0x60,0x20,0x60,0x21,0x66,0x22,0x75,0x20,0x75,0x21,0x75,0x22,0x13,0x25,
-0x23,0x25,0x24,0x26,0x26,0x26,0x27,0x27,0x28,0x36,0x24,0x36,0x25,0x46,0x24,0x45,
-0x25,0x5a,0x20,0x5a,0x21,0x62,0x20,0x62,0x21,0x7f,0x00,0x7f,0x01,0x7f,0x02,0x7a,
-0x03,0x7b,0x09,0x7f,0x0a,0x7f,0x0b,0x7f,0x0c,0x7f,0x0d,0x7f,0x0e,0x7f,0x0f,0x7f,
-0x10,0x7f,0x11,0x7f,0x12,0x7f,0x13,0x7f,0x14,0x7b,0x15,0x7a,0x1b,0x7a,0x1c,0x7f,
-0x1d,0x7f,0x1e,0x76,0x20,0x76,0x21,0x78,0x22,0xa0,0x2a,0xf0,0x2a,0x27,0x5d,0x00,
-0x5d,0x01,0x2e,0x01,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,
-0x13,0x16,0x12,0x15,0x14,0x00,0x23,0x22,0x00,0x11,0x34,0x00,0x33,0x32,0x16,0x17,
-0x27,0x05,0x27,0x25,0x27,0x33,0x17,0x25,0x17,0x05,0x03,0x46,0x32,0x58,0x29,0xa7,
-0xb9,0xae,0x92,0x91,0xae,0x36,0x09,0x7e,0x72,0xfe,0xe4,0xe6,0xe7,0xfe,0xe5,0x01,
-0x14,0xdd,0x12,0x34,0x2a,0x9f,0xfe,0xc1,0x21,0x01,0x19,0xb5,0xe4,0x7f,0x01,0x4d,
-0x21,0xfe,0xd9,0x03,0x93,0x11,0x10,0xd8,0xc3,0xbc,0xde,0xde,0xbc,0x7a,0xbc,0x01,
-0x26,0x8f,0xfe,0xe0,0xad,0xff,0xfe,0xc9,0x01,0x37,0x00,0xff,0xfa,0x01,0x37,0x05,
-0x05,0xb4,0x6b,0x63,0x5c,0xcc,0x91,0x6f,0x61,0x62,0xff,0xff,0x00,0xba,0x00,0x00,
-0x04,0x64,0x06,0x37,0x12,0x26,0x00,0x51,0x00,0x00,0x10,0x07,0x02,0x90,0x00,0x98,
-0x00,0x00,0xff,0xff,0x00,0x71,0xff,0xe3,0x04,0x75,0x06,0x66,0x12,0x26,0x00,0x52,
-0x00,0x00,0x10,0x06,0x00,0x43,0x73,0x00,0xff,0xff,0x00,0x71,0xff,0xe3,0x04,0x75,
-0x06,0x66,0x12,0x26,0x00,0x52,0x00,0x00,0x10,0x06,0x00,0x76,0x73,0x00,0xff,0xff,
-0x00,0x71,0xff,0xe3,0x04,0x75,0x06,0x66,0x12,0x26,0x00,0x52,0x00,0x00,0x11,0x06,
-0x02,0x7a,0x73,0x00,0x00,0x08,0xb4,0x0f,0x1a,0x1e,0x15,0x07,0x2b,0x31,0xff,0xff,
-0x00,0x71,0xff,0xe3,0x04,0x75,0x06,0x37,0x12,0x26,0x00,0x52,0x00,0x00,0x11,0x06,
-0x02,0x90,0x73,0x00,0x00,0x14,0xb4,0x15,0x20,0x2e,0x0f,0x07,0x2b,0x40,0x09,0x20,
-0x20,0x2f,0x2e,0x10,0x20,0x1f,0x2e,0x04,0x5d,0x31,0xff,0xff,0x00,0x71,0xff,0xe3,
-0x04,0x75,0x06,0x10,0x12,0x26,0x00,0x52,0x00,0x00,0x11,0x06,0x00,0x6a,0x73,0x00,
-0x00,0x14,0xb4,0x03,0x1f,0x1a,0x09,0x07,0x2b,0x40,0x09,0x40,0x1f,0x4f,0x1a,0x30,
-0x1f,0x3f,0x1a,0x04,0x5d,0x31,0x00,0x03,0x00,0xd9,0x00,0x96,0x05,0xdb,0x04,0x6f,
-0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x29,0x40,0x14,0x00,0xea,0x02,0x06,0xea,0x04,
-0x02,0x08,0x9c,0x04,0x0a,0x0c,0x09,0x05,0x01,0x72,0x04,0x00,0x08,0x0c,0x10,0xdc,
-0xd4,0x3c,0xfc,0x3c,0xc4,0x31,0x00,0x10,0xd4,0xc4,0xfc,0xc4,0x10,0xee,0x10,0xee,
-0x30,0x01,0x33,0x15,0x23,0x11,0x33,0x15,0x23,0x01,0x21,0x15,0x21,0x02,0xdf,0xf6,
-0xf6,0xf6,0xf6,0xfd,0xfa,0x05,0x02,0xfa,0xfe,0x04,0x6f,0xf6,0xfe,0x12,0xf5,0x02,
-0x41,0xaa,0x00,0x03,0x00,0x48,0xff,0xa2,0x04,0x9c,0x04,0xbc,0x00,0x09,0x00,0x13,
-0x00,0x2b,0x00,0xe4,0x40,0x3c,0x2b,0x2c,0x26,0x1f,0x1d,0x1a,0x13,0x0a,0x01,0x00,
-0x04,0x0d,0x29,0x26,0x20,0x14,0x0d,0x04,0x2a,0x26,0x1e,0x1a,0x04,0xb9,0x26,0x0d,
-0xb9,0x1a,0xb8,0x26,0x8c,0x2c,0x2b,0x2c,0x2a,0x14,0x17,0x10,0x20,0x1e,0x23,0x13,
-0x0a,0x01,0x00,0x04,0x10,0x07,0x1f,0x1d,0x07,0x12,0x23,0x51,0x29,0x10,0x12,0x17,
-0x45,0x2c,0x10,0xfc,0xec,0x32,0xf4,0xec,0x32,0xc0,0x11,0x12,0x17,0x39,0x12,0x39,
-0x39,0x11,0x12,0x39,0x39,0x11,0x39,0x31,0x00,0x10,0xe4,0xf4,0xec,0x10,0xee,0x10,
-0xc0,0x10,0xc0,0x11,0x12,0x39,0x39,0x12,0x39,0x12,0x17,0x39,0x11,0x39,0x39,0x11,
-0x12,0x39,0x30,0x40,0x70,0x28,0x01,0x3f,0x2d,0x59,0x14,0x56,0x1c,0x55,0x1d,0x56,
-0x20,0x6a,0x15,0x66,0x21,0x7f,0x00,0x7b,0x04,0x7f,0x05,0x7f,0x06,0x7f,0x07,0x7f,
-0x08,0x7f,0x09,0x7f,0x0a,0x7f,0x0b,0x7f,0x0c,0x7b,0x0d,0x7a,0x15,0x7b,0x1a,0x7f,
-0x1b,0x7f,0x1c,0x7f,0x1d,0x7f,0x1e,0x7f,0x1f,0x7f,0x20,0x7b,0x21,0x7f,0x22,0x7f,
-0x23,0x7f,0x24,0x7f,0x25,0x7b,0x26,0x9b,0x19,0x95,0x25,0xa8,0x19,0xa0,0x2d,0xf0,
-0x2d,0x26,0x59,0x00,0x56,0x13,0x55,0x1d,0x5a,0x28,0x69,0x00,0x66,0x13,0x65,0x1c,
-0x6a,0x28,0x7a,0x00,0x74,0x13,0x76,0x1c,0x7a,0x28,0x89,0x1e,0x95,0x18,0x9a,0x24,
-0xa2,0x18,0xad,0x24,0x11,0x5d,0x01,0x5d,0x09,0x01,0x1e,0x01,0x33,0x32,0x36,0x35,
-0x34,0x26,0x27,0x2e,0x01,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x07,0x2e,0x01,0x35,
-0x10,0x00,0x33,0x32,0x16,0x17,0x37,0x17,0x07,0x1e,0x01,0x15,0x10,0x00,0x23,0x22,
-0x26,0x27,0x07,0x27,0x03,0x89,0xfe,0x19,0x29,0x67,0x41,0x93,0xac,0x14,0x5c,0x2a,
-0x67,0x3e,0x97,0xa9,0x13,0x14,0x7d,0x36,0x36,0x01,0x11,0xf1,0x5d,0x9f,0x43,0x8b,
-0x5f,0x92,0x35,0x36,0xfe,0xee,0xf0,0x60,0xa1,0x3f,0x8b,0x60,0x03,0x21,0xfd,0xb0,
-0x2a,0x28,0xe8,0xc8,0x4f,0x75,0x9a,0x29,0x29,0xeb,0xd3,0x48,0x6e,0x2e,0x97,0x4d,
-0xc5,0x77,0x01,0x14,0x01,0x38,0x33,0x34,0xa8,0x4f,0xb3,0x4d,0xc6,0x78,0xfe,0xed,
-0xfe,0xc7,0x34,0x33,0xa8,0x4e,0xff,0xff,0x00,0xae,0xff,0xe3,0x04,0x58,0x06,0x66,
-0x12,0x26,0x00,0x58,0x00,0x00,0x10,0x06,0x00,0x43,0x7b,0x00,0xff,0xff,0x00,0xae,
-0xff,0xe3,0x04,0x58,0x06,0x66,0x12,0x26,0x00,0x58,0x00,0x00,0x10,0x06,0x00,0x76,
-0x7b,0x00,0xff,0xff,0x00,0xae,0xff,0xe3,0x04,0x58,0x06,0x66,0x12,0x26,0x00,0x58,
-0x00,0x00,0x11,0x06,0x02,0x7a,0x7b,0x00,0x00,0x08,0xb4,0x0b,0x16,0x1a,0x01,0x07,
-0x2b,0x31,0xff,0xff,0x00,0xae,0xff,0xe3,0x04,0x58,0x06,0x10,0x12,0x26,0x00,0x58,
-0x00,0x00,0x11,0x06,0x00,0x6a,0x7b,0x00,0x00,0x18,0xb4,0x02,0x1a,0x17,0x0a,0x07,
-0x2b,0x40,0x0d,0x40,0x1a,0x4f,0x17,0x30,0x1a,0x3f,0x17,0x00,0x1a,0x0f,0x17,0x06,
-0x5d,0x31,0xff,0xff,0x00,0x3d,0xfe,0x56,0x04,0x7f,0x06,0x66,0x12,0x26,0x00,0x5c,
-0x00,0x00,0x10,0x06,0x00,0x76,0x5e,0x00,0x00,0x02,0x00,0xba,0xfe,0x56,0x04,0xa4,
-0x06,0x14,0x00,0x10,0x00,0x1c,0x00,0x3e,0x40,0x1b,0x14,0xb9,0x05,0x08,0x1a,0xb9,
-0x00,0x0e,0x8c,0x08,0xb8,0x01,0xbd,0x03,0x97,0x1d,0x11,0x12,0x0b,0x47,0x17,0x04,
-0x00,0x08,0x02,0x46,0x1d,0x10,0xfc,0xec,0x32,0x32,0xf4,0xec,0x31,0x00,0x10,0xec,
-0xe4,0xe4,0xf4,0xc4,0xec,0x10,0xc6,0xee,0x30,0x40,0x09,0x60,0x1e,0x80,0x1e,0xa0,
-0x1e,0xe0,0x1e,0x04,0x01,0x5d,0x25,0x11,0x23,0x11,0x33,0x11,0x3e,0x01,0x33,0x32,
-0x00,0x11,0x10,0x02,0x23,0x22,0x26,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,
-0x33,0x32,0x36,0x01,0x73,0xb9,0xb9,0x3a,0xb1,0x7b,0xcc,0x00,0xff,0xff,0xcc,0x7b,
-0xb1,0x02,0x38,0xa7,0x92,0x92,0xa7,0xa7,0x92,0x92,0xa7,0xa8,0xfd,0xae,0x07,0xbe,
-0xfd,0xa2,0x64,0x61,0xfe,0xbc,0xfe,0xf8,0xfe,0xf8,0xfe,0xbc,0x61,0x01,0xeb,0xcb,
-0xe7,0xe7,0xcb,0xcb,0xe7,0xe7,0xff,0xff,0x00,0x3d,0xfe,0x56,0x04,0x7f,0x06,0x10,
-0x12,0x26,0x00,0x5c,0x00,0x00,0x11,0x06,0x00,0x6a,0x5e,0x00,0x00,0x16,0xb4,0x18,
-0x17,0x12,0x19,0x07,0x2b,0x40,0x0b,0x30,0x17,0x3f,0x12,0x20,0x17,0x2f,0x12,0x1f,
-0x12,0x05,0x5d,0x31,0xff,0xff,0x00,0x10,0x00,0x00,0x05,0x68,0x07,0x31,0x10,0x27,
-0x00,0x71,0x00,0xbc,0x01,0x3b,0x13,0x06,0x00,0x24,0x00,0x00,0x00,0x10,0xb4,0x0e,
-0x03,0x02,0x09,0x07,0x2b,0x40,0x05,0x40,0x03,0x4f,0x02,0x02,0x5d,0x31,0xff,0xff,
-0x00,0x7b,0xff,0xe3,0x04,0x2d,0x05,0xf6,0x10,0x26,0x00,0x71,0x4a,0x00,0x13,0x06,
-0x00,0x44,0x00,0x00,0x00,0x10,0xb4,0x18,0x03,0x02,0x0f,0x07,0x2b,0x40,0x05,0x6f,
-0x02,0x7f,0x03,0x02,0x5d,0x31,0xff,0xff,0x00,0x10,0x00,0x00,0x05,0x68,0x07,0x92,
-0x10,0x27,0x02,0x8c,0x00,0xce,0x01,0x4a,0x13,0x06,0x00,0x24,0x00,0x00,0x00,0x12,
-0xb4,0x18,0x00,0x08,0x13,0x07,0x2b,0x31,0x00,0x40,0x05,0x6f,0x00,0x6f,0x08,0x02,
-0x5d,0x30,0xff,0xff,0x00,0x7b,0xff,0xe3,0x04,0x2d,0x06,0x1f,0x10,0x26,0x02,0x8c,
-0x4f,0xd7,0x13,0x06,0x00,0x44,0x00,0x00,0x00,0x08,0xb4,0x22,0x00,0x08,0x19,0x07,
-0x2b,0x31,0xff,0xff,0x00,0x10,0xfe,0x75,0x05,0xa5,0x05,0xd5,0x10,0x27,0x02,0x8f,
-0x02,0xe4,0x00,0x00,0x12,0x06,0x00,0x24,0x00,0x00,0xff,0xff,0x00,0x7b,0xfe,0x75,
-0x04,0x80,0x04,0x7b,0x10,0x27,0x02,0x8f,0x01,0xbf,0x00,0x00,0x12,0x06,0x00,0x44,
-0x00,0x00,0xff,0xff,0x00,0x73,0xff,0xe3,0x05,0x27,0x07,0x6b,0x12,0x26,0x00,0x26,
-0x00,0x00,0x10,0x07,0x0b,0xea,0x05,0x2d,0x01,0x75,0xff,0xff,0x00,0x71,0xff,0xe3,
-0x03,0xe7,0x06,0x66,0x12,0x26,0x00,0x46,0x00,0x00,0x10,0x07,0x00,0x76,0x00,0x89,
-0x00,0x00,0xff,0xff,0x00,0x73,0xff,0xe3,0x05,0x27,0x07,0x6d,0x10,0x27,0x0b,0xed,
-0x05,0x4c,0x01,0x75,0x13,0x06,0x00,0x26,0x00,0x00,0x00,0x09,0xb2,0x04,0x04,0x1e,
-0x10,0x3c,0x3d,0x2f,0x31,0x00,0xff,0xff,0x00,0x71,0xff,0xe3,0x03,0xe7,0x06,0x66,
-0x10,0x27,0x02,0x7a,0x00,0xa4,0x00,0x00,0x12,0x06,0x00,0x46,0x00,0x00,0xff,0xff,
-0x00,0x73,0xff,0xe3,0x05,0x27,0x07,0x50,0x10,0x27,0x0b,0xf1,0x05,0x4c,0x01,0x75,
-0x12,0x06,0x00,0x26,0x00,0x00,0xff,0xff,0x00,0x71,0xff,0xe3,0x03,0xe7,0x06,0x10,
-0x10,0x27,0x02,0x8d,0x00,0xa4,0x00,0x00,0x12,0x06,0x00,0x46,0x00,0x00,0xff,0xff,
-0x00,0x73,0xff,0xe3,0x05,0x27,0x07,0x6d,0x12,0x26,0x00,0x26,0x00,0x00,0x11,0x07,
-0x0b,0xee,0x05,0x2d,0x01,0x75,0x00,0x07,0x40,0x03,0x1f,0x1d,0x01,0x5d,0x31,0x00,
-0xff,0xff,0x00,0x71,0xff,0xe3,0x03,0xe7,0x06,0x66,0x12,0x26,0x00,0x46,0x00,0x00,
-0x10,0x07,0x02,0x7b,0x00,0x89,0x00,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,0x05,0xb0,
-0x07,0x81,0x10,0x26,0x00,0x27,0x00,0x00,0x10,0x07,0x0b,0xee,0x04,0xec,0x01,0x89,
-0xff,0xff,0x00,0x71,0xff,0xe3,0x05,0xdb,0x06,0x14,0x12,0x26,0x00,0x47,0x00,0x00,
-0x11,0x07,0x0b,0xe8,0x05,0x14,0x00,0x00,0x00,0x0b,0x40,0x07,0x5f,0x1d,0x3f,0x1d,
-0x1f,0x1d,0x03,0x5d,0x31,0x00,0x00,0x02,0x00,0x0a,0x00,0x00,0x05,0xba,0x05,0xd5,
-0x00,0x0c,0x00,0x19,0x00,0x67,0x40,0x20,0x10,0x09,0xa9,0x0b,0x0d,0x95,0x00,0x81,
-0x12,0x95,0x0e,0x0b,0x07,0x07,0x01,0x19,0x13,0x04,0x0f,0x0d,0x16,0x19,0x04,0x32,
-0x0a,0x11,0x0d,0x1c,0x08,0x00,0x79,0x1a,0x10,0xf4,0x3c,0xec,0x32,0xc4,0xf4,0xec,
-0x10,0xc4,0x17,0x39,0x31,0x00,0x2f,0xc6,0x32,0xee,0xf6,0xee,0x10,0xee,0x32,0x30,
-0x40,0x28,0x20,0x1b,0x7f,0x1b,0xb0,0x1b,0x03,0x9f,0x09,0x9f,0x0a,0x9f,0x0b,0x9f,
-0x0c,0x9f,0x0e,0x9f,0x0f,0x9f,0x10,0x9f,0x11,0xbf,0x09,0xbf,0x0a,0xbf,0x0b,0xbf,
-0x0c,0xbf,0x0e,0xbf,0x0f,0xbf,0x10,0xbf,0x11,0x10,0x5d,0x01,0x5d,0x13,0x21,0x20,
-0x00,0x11,0x10,0x00,0x29,0x01,0x11,0x23,0x35,0x33,0x13,0x11,0x21,0x15,0x21,0x11,
-0x33,0x20,0x00,0x11,0x10,0x00,0x21,0xd3,0x01,0xa0,0x01,0xb1,0x01,0x96,0xfe,0x69,
-0xfe,0x50,0xfe,0x60,0xc9,0xc9,0xcb,0x01,0x50,0xfe,0xb0,0xf3,0x01,0x35,0x01,0x1f,
-0xfe,0xe1,0xfe,0xcb,0x05,0xd5,0xfe,0x97,0xfe,0x80,0xfe,0x7e,0xfe,0x96,0x02,0xbc,
-0x90,0x01,0xe3,0xfe,0x1d,0x90,0xfd,0xea,0x01,0x18,0x01,0x2e,0x01,0x2c,0x01,0x17,
-0x00,0x02,0x00,0x71,0xff,0xe3,0x04,0xf4,0x06,0x14,0x00,0x18,0x00,0x24,0x00,0x4a,
-0x40,0x24,0x07,0x03,0xd3,0x09,0x01,0xf9,0x22,0xb9,0x00,0x16,0x1c,0xb9,0x0d,0x10,
-0x8c,0x16,0xb8,0x05,0x97,0x0b,0x02,0x1f,0x0c,0x04,0x03,0x00,0x08,0x08,0x0a,0x06,
-0x47,0x19,0x12,0x13,0x45,0x25,0x10,0xfc,0xec,0xf4,0x3c,0xc4,0xfc,0x17,0x3c,0xc4,
-0x31,0x00,0x2f,0xec,0xe4,0xf4,0xc4,0xec,0x10,0xc4,0xee,0xfd,0x3c,0xee,0x32,0x30,
-0xb6,0x60,0x26,0x80,0x26,0xa0,0x26,0x03,0x01,0x5d,0x01,0x11,0x21,0x35,0x21,0x35,
-0x33,0x15,0x33,0x15,0x23,0x11,0x23,0x35,0x0e,0x01,0x23,0x22,0x02,0x11,0x10,0x00,
-0x33,0x32,0x16,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x03,
-0xa2,0xfe,0xba,0x01,0x46,0xb8,0x9a,0x9a,0xb8,0x3a,0xb1,0x7c,0xcb,0xff,0x00,0xff,
-0xcb,0x7c,0xb1,0xfd,0xc7,0xa7,0x92,0x92,0xa8,0xa8,0x92,0x92,0xa7,0x03,0xb6,0x01,
-0x4e,0x7d,0x93,0x93,0x7d,0xfa,0xfc,0xa8,0x64,0x61,0x01,0x44,0x01,0x08,0x01,0x08,
-0x01,0x44,0x61,0xfe,0x15,0xcb,0xe7,0xe7,0xcb,0xcb,0xe7,0xe7,0xff,0xff,0x00,0xc9,
-0x00,0x00,0x04,0x8b,0x07,0x33,0x10,0x27,0x00,0x71,0x00,0xa1,0x01,0x3d,0x12,0x06,
-0x00,0x28,0x00,0x00,0xff,0xff,0x00,0x71,0xff,0xe3,0x04,0x7f,0x05,0xf6,0x10,0x27,
-0x00,0x71,0x00,0x96,0x00,0x00,0x13,0x06,0x00,0x48,0x00,0x00,0x00,0x07,0x40,0x03,
-0x70,0x00,0x01,0x5d,0x31,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,0x04,0x8b,0x07,0x6d,
-0x10,0x27,0x0b,0xf0,0x04,0xa1,0x01,0x75,0x13,0x06,0x00,0x28,0x00,0x00,0x00,0x07,
-0x40,0x03,0x40,0x00,0x01,0x5d,0x31,0x00,0xff,0xff,0x00,0x71,0xff,0xe3,0x04,0x7f,
-0x06,0x48,0x10,0x27,0x02,0x8c,0x00,0x96,0x00,0x00,0x13,0x06,0x00,0x48,0x00,0x00,
-0x00,0x07,0x40,0x03,0x70,0x00,0x01,0x5d,0x31,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,
-0x04,0x8b,0x07,0x50,0x10,0x27,0x0b,0xf1,0x04,0xa1,0x01,0x75,0x12,0x06,0x00,0x28,
-0x00,0x00,0xff,0xff,0x00,0x71,0xff,0xe3,0x04,0x7f,0x06,0x10,0x10,0x27,0x02,0x8d,
-0x00,0x96,0x00,0x00,0x12,0x06,0x00,0x48,0x00,0x00,0xff,0xff,0x00,0xc9,0xfe,0x75,
-0x04,0x8d,0x05,0xd5,0x10,0x27,0x02,0x8f,0x01,0xcc,0x00,0x00,0x12,0x06,0x00,0x28,
-0x00,0x00,0xff,0xff,0x00,0x71,0xfe,0x75,0x04,0x7f,0x04,0x7b,0x10,0x27,0x02,0x8f,
-0x01,0x78,0x00,0x00,0x12,0x06,0x00,0x48,0x00,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,
-0x04,0x8b,0x07,0x67,0x12,0x26,0x00,0x28,0x00,0x00,0x11,0x07,0x0b,0xee,0x04,0xa6,
-0x01,0x6f,0x00,0x07,0x40,0x03,0x40,0x0c,0x01,0x5d,0x31,0x00,0xff,0xff,0x00,0x71,
-0xff,0xe3,0x04,0x7f,0x06,0x61,0x12,0x26,0x00,0x48,0x00,0x00,0x10,0x07,0x02,0x7b,
-0x00,0x94,0xff,0xfb,0xff,0xff,0x00,0x73,0xff,0xe3,0x05,0x8b,0x07,0x6d,0x10,0x27,
-0x0b,0xed,0x05,0x5c,0x01,0x75,0x13,0x06,0x00,0x2a,0x00,0x00,0x00,0x09,0xb2,0x04,
-0x04,0x15,0x10,0x3c,0x3d,0x2f,0x31,0x00,0xff,0xff,0x00,0x71,0xfe,0x56,0x04,0x5a,
-0x06,0x66,0x10,0x26,0x02,0x7a,0x68,0x00,0x13,0x06,0x00,0x4a,0x00,0x00,0x00,0x09,
-0xb2,0x04,0x04,0x0a,0x10,0x3c,0x3d,0x2f,0x31,0x00,0xff,0xff,0x00,0x73,0xff,0xe3,
-0x05,0x8b,0x07,0x6d,0x12,0x26,0x00,0x2a,0x00,0x00,0x10,0x07,0x0b,0xf0,0x05,0x1b,
-0x01,0x75,0xff,0xff,0x00,0x71,0xfe,0x56,0x04,0x5a,0x06,0x48,0x12,0x26,0x00,0x4a,
-0x00,0x00,0x10,0x07,0x02,0x8c,0x00,0x8b,0x00,0x00,0xff,0xff,0x00,0x73,0xff,0xe3,
-0x05,0x8b,0x07,0x50,0x10,0x27,0x0b,0xf1,0x05,0x5c,0x01,0x75,0x13,0x06,0x00,0x2a,
-0x00,0x00,0x00,0x08,0x00,0x40,0x03,0x3f,0x00,0x01,0x5d,0x30,0xff,0xff,0x00,0x71,
-0xfe,0x56,0x04,0x5a,0x06,0x10,0x10,0x26,0x02,0x8d,0x68,0x00,0x12,0x06,0x00,0x4a,
-0x00,0x00,0xff,0xff,0x00,0x73,0xfe,0x01,0x05,0x8b,0x05,0xf0,0x10,0x27,0x02,0xc9,
-0x05,0x5e,0xff,0xed,0x12,0x06,0x00,0x2a,0x00,0x00,0xff,0xff,0x00,0x71,0xfe,0x56,
-0x04,0x5a,0x06,0x34,0x10,0x27,0x02,0xb5,0x03,0xe0,0x01,0x0c,0x12,0x06,0x00,0x4a,
-0x00,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,0x05,0x3b,0x07,0x6d,0x10,0x27,0x0b,0xed,
-0x05,0x02,0x01,0x75,0x13,0x06,0x00,0x2b,0x00,0x00,0x00,0x14,0xb4,0x0c,0x02,0x06,
-0x07,0x07,0x2b,0x40,0x09,0x2f,0x02,0x20,0x06,0x1f,0x02,0x10,0x06,0x04,0x5d,0x31,
-0xff,0xff,0xff,0xe5,0x00,0x00,0x04,0x64,0x07,0x6d,0x10,0x27,0x0b,0xed,0x03,0x16,
-0x01,0x75,0x13,0x06,0x00,0x4b,0x00,0x00,0x00,0x2a,0xb4,0x14,0x02,0x06,0x13,0x07,
-0x2b,0x31,0x00,0x4b,0xb0,0x0e,0x51,0x58,0xbb,0x00,0x14,0xff,0xc0,0x00,0x13,0xff,
-0xc0,0x38,0x38,0x59,0x40,0x0d,0x90,0x14,0x90,0x13,0x80,0x14,0x80,0x13,0x40,0x14,
-0x40,0x13,0x06,0x5d,0x00,0x02,0x00,0xc9,0x00,0x00,0x06,0x8b,0x05,0xd5,0x00,0x13,
-0x00,0x17,0x00,0x3a,0x40,0x1e,0x06,0x02,0x12,0x95,0x09,0x14,0x11,0x0c,0x95,0x15,
-0xad,0x04,0x00,0x81,0x0e,0x0a,0x07,0x0c,0x17,0x04,0x1c,0x05,0x38,0x12,0x0d,0x14,
-0x01,0x1c,0x00,0x18,0x10,0xdc,0xec,0x32,0x32,0xcc,0xfc,0xec,0x32,0x32,0xcc,0x31,
-0x00,0x2f,0x3c,0xe4,0x32,0xfc,0xec,0xdc,0x32,0x32,0xec,0x32,0x32,0x30,0x01,0x33,
-0x15,0x21,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x23,
-0x35,0x33,0x17,0x15,0x21,0x35,0x01,0x71,0xca,0x02,0xde,0xca,0xa8,0xa8,0xca,0xfd,
-0x22,0xca,0xa8,0xa8,0xca,0x02,0xde,0x05,0xd5,0xe0,0xe0,0xe0,0xa4,0xfb,0xaf,0x02,
-0xc7,0xfd,0x39,0x04,0x51,0xa4,0xa4,0xe0,0xe0,0x00,0x00,0x01,0x00,0x78,0x00,0x00,
-0x04,0x9f,0x06,0x14,0x00,0x1b,0x00,0x3e,0x40,0x21,0x03,0x09,0x00,0x03,0x16,0x01,
-0x0e,0x12,0x87,0x0d,0x15,0x06,0x87,0x16,0x19,0xb8,0x10,0x97,0x0a,0x01,0x02,0x08,
-0x00,0x4e,0x13,0x0e,0x11,0x15,0x09,0x08,0x10,0x0b,0x1c,0x10,0xdc,0x32,0xec,0x32,
-0x32,0xcc,0xcc,0xf4,0xec,0x31,0x00,0x2f,0x3c,0xec,0xf4,0xc4,0xec,0xdc,0x32,0xec,
-0x32,0x11,0x12,0x17,0x39,0x30,0x01,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,
-0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x21,0x15,0x21,0x11,0x3e,0x01,0x33,
-0x32,0x16,0x04,0x9f,0xb8,0x7c,0x7c,0x95,0xac,0xb9,0x7d,0x7d,0xb9,0x01,0x60,0xfe,
-0xa0,0x42,0xb3,0x75,0xc1,0xc6,0x02,0xa4,0xfd,0x5c,0x02,0x9e,0x9f,0x9e,0xbe,0xa4,
-0xfd,0x87,0x04,0xf6,0xa4,0x7a,0x7a,0xa4,0xfe,0xbc,0x65,0x64,0xef,0x00,0xff,0xff,
-0xff,0xe4,0x00,0x00,0x02,0x78,0x07,0x5e,0x10,0x27,0x0b,0xeb,0x03,0x2e,0x01,0x75,
-0x13,0x06,0x00,0x2c,0x00,0x00,0x00,0x08,0xb4,0x1e,0x09,0x18,0x1f,0x07,0x2b,0x31,
-0xff,0xff,0xff,0xd3,0x00,0x00,0x02,0x67,0x06,0x37,0x10,0x27,0x02,0x90,0xff,0x1d,
-0x00,0x00,0x13,0x06,0x00,0xf3,0x00,0x00,0x00,0x08,0xb4,0x1c,0x08,0x16,0x1d,0x07,
-0x2b,0x31,0xff,0xff,0x00,0x03,0x00,0x00,0x02,0x59,0x07,0x31,0x10,0x27,0x00,0x71,
-0xff,0x2e,0x01,0x3b,0x13,0x06,0x00,0x2c,0x00,0x00,0x00,0x08,0xb4,0x04,0x03,0x02,
-0x05,0x07,0x2b,0x31,0xff,0xff,0xff,0xf2,0x00,0x00,0x02,0x48,0x05,0xf5,0x10,0x27,
-0x00,0x71,0xff,0x1d,0xff,0xff,0x13,0x06,0x00,0xf3,0x00,0x00,0x00,0x08,0xb4,0x04,
-0x03,0x02,0x05,0x07,0x2b,0x31,0xff,0xff,0xff,0xf5,0x00,0x00,0x02,0x67,0x07,0x6d,
-0x10,0x27,0x0b,0xf0,0x03,0x2e,0x01,0x75,0x13,0x06,0x00,0x2c,0x00,0x00,0x00,0x08,
-0xb4,0x0e,0x00,0x08,0x0f,0x07,0x2b,0x31,0xff,0xff,0xff,0xe4,0x00,0x00,0x02,0x56,
-0x06,0x48,0x10,0x27,0x02,0x8c,0xff,0x1d,0x00,0x00,0x13,0x06,0x00,0xf3,0x00,0x00,
-0x00,0x08,0xb4,0x0e,0x00,0x08,0x0f,0x07,0x2b,0x31,0xff,0xff,0x00,0xb0,0xfe,0x75,
-0x02,0x25,0x05,0xd5,0x10,0x27,0x02,0x8f,0xff,0x64,0x00,0x00,0x12,0x06,0x00,0x2c,
-0x00,0x00,0xff,0xff,0x00,0x96,0xfe,0x75,0x02,0x0b,0x06,0x14,0x10,0x27,0x02,0x8f,
-0xff,0x4a,0x00,0x00,0x12,0x06,0x00,0x4c,0x00,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,
-0x01,0x95,0x07,0x50,0x12,0x26,0x00,0x2c,0x00,0x00,0x11,0x07,0x0b,0xf1,0x03,0x2f,
-0x01,0x75,0x00,0x13,0xb3,0x06,0x01,0x07,0x00,0x10,0x3c,0x10,0x3c,0x31,0x00,0xb4,
-0x3f,0x07,0x3f,0x06,0x02,0x5d,0x30,0x00,0x00,0x01,0x00,0xc1,0x00,0x00,0x01,0x79,
-0x04,0x60,0x00,0x03,0x00,0x20,0xb7,0x00,0xbf,0x02,0x01,0x08,0x00,0x46,0x04,0x10,
-0xfc,0xec,0x31,0x00,0x2f,0xec,0x30,0x40,0x0b,0x10,0x05,0x40,0x05,0x50,0x05,0x60,
-0x05,0x70,0x05,0x05,0x01,0x5d,0x13,0x33,0x11,0x23,0xc1,0xb8,0xb8,0x04,0x60,0xfb,
-0xa0,0x00,0xff,0xff,0x00,0xc9,0xfe,0x66,0x03,0xef,0x05,0xd5,0x10,0x27,0x00,0x2d,
-0x02,0x5c,0x00,0x00,0x11,0x06,0x00,0x2c,0x00,0x00,0x00,0x08,0x40,0x03,0x11,0x04,
-0x01,0x10,0xec,0x31,0xff,0xff,0x00,0xc1,0xfe,0x56,0x03,0xb1,0x06,0x14,0x10,0x27,
-0x00,0x4d,0x02,0x38,0x00,0x00,0x11,0x06,0x00,0x4c,0x00,0x00,0x00,0x08,0x40,0x03,
-0x19,0x46,0x01,0x10,0xec,0x31,0xff,0xff,0xff,0x96,0xfe,0x66,0x02,0x5f,0x07,0x6d,
-0x10,0x27,0x0b,0xed,0x03,0x2e,0x01,0x75,0x13,0x06,0x00,0x2d,0x00,0x00,0x00,0x08,
-0xb4,0x08,0x02,0x06,0x07,0x07,0x2b,0x31,0xff,0xff,0xff,0xdb,0xfe,0x56,0x02,0x5c,
-0x06,0x66,0x10,0x27,0x02,0x7a,0xff,0x1d,0x00,0x00,0x13,0x06,0x01,0xf9,0x00,0x00,
-0x00,0x08,0xb4,0x08,0x02,0x06,0x07,0x07,0x2b,0x31,0xff,0xff,0x00,0xc9,0xfe,0x1e,
-0x05,0x6a,0x05,0xd5,0x10,0x27,0x02,0xc9,0x05,0x1b,0x00,0x0a,0x12,0x06,0x00,0x2e,
-0x00,0x00,0xff,0xff,0x00,0xba,0xfe,0x1e,0x04,0x9c,0x06,0x14,0x10,0x27,0x02,0xc9,
-0x04,0xac,0x00,0x0a,0x12,0x06,0x00,0x4e,0x00,0x00,0x00,0x01,0x00,0xba,0x00,0x00,
-0x04,0x9c,0x04,0x60,0x00,0x0a,0x00,0xbb,0x40,0x28,0x08,0x11,0x05,0x06,0x05,0x07,
-0x11,0x06,0x06,0x05,0x03,0x11,0x04,0x05,0x04,0x02,0x11,0x05,0x05,0x04,0x42,0x08,
-0x05,0x02,0x03,0x03,0x00,0xbc,0x09,0x06,0x05,0x01,0x04,0x06,0x08,0x01,0x08,0x00,
-0x46,0x0b,0x10,0xfc,0xec,0x32,0xd4,0xc4,0x11,0x39,0x31,0x00,0x2f,0x3c,0xec,0x32,
-0x17,0x39,0x30,0x4b,0x53,0x58,0x07,0x10,0x04,0xed,0x07,0x10,0x05,0xed,0x07,0x10,
-0x05,0xed,0x07,0x10,0x04,0xed,0x59,0x22,0xb2,0x10,0x0c,0x01,0x01,0x5d,0x40,0x5f,
-0x04,0x02,0x0a,0x08,0x16,0x02,0x27,0x02,0x29,0x05,0x2b,0x08,0x56,0x02,0x66,0x02,
-0x67,0x08,0x73,0x02,0x77,0x05,0x82,0x02,0x89,0x05,0x8e,0x08,0x93,0x02,0x96,0x05,
-0x97,0x08,0xa3,0x02,0x12,0x09,0x05,0x09,0x06,0x02,0x0b,0x03,0x0a,0x07,0x28,0x03,
-0x27,0x04,0x28,0x05,0x2b,0x06,0x2b,0x07,0x40,0x0c,0x68,0x03,0x60,0x0c,0x89,0x03,
-0x85,0x04,0x89,0x05,0x8d,0x06,0x8f,0x07,0x9a,0x03,0x97,0x07,0xaa,0x03,0xa7,0x05,
-0xb6,0x07,0xc5,0x07,0xd6,0x07,0xf7,0x03,0xf0,0x03,0xf7,0x04,0xf0,0x04,0x1a,0x5d,
-0x71,0x00,0x5d,0x13,0x33,0x11,0x01,0x33,0x09,0x01,0x23,0x01,0x11,0x23,0xba,0xb9,
-0x02,0x25,0xeb,0xfd,0xae,0x02,0x6b,0xf0,0xfd,0xc7,0xb9,0x04,0x60,0xfe,0x1b,0x01,
-0xe5,0xfd,0xf2,0xfd,0xae,0x02,0x21,0xfd,0xdf,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,
-0x04,0x6a,0x07,0x6c,0x10,0x27,0x0b,0xea,0x03,0x6e,0x01,0x76,0x12,0x06,0x00,0x2f,
-0x00,0x00,0xff,0xff,0x00,0xc1,0x00,0x00,0x02,0x4a,0x07,0x6c,0x10,0x27,0x0b,0xea,
-0x03,0x5a,0x01,0x76,0x13,0x06,0x00,0x4f,0x00,0x00,0x00,0x1e,0xb1,0x03,0x04,0x10,
-0x3c,0x31,0x00,0x4b,0xb0,0x0e,0x51,0x58,0xb9,0x00,0x00,0x00,0x40,0x38,0x59,0x40,
-0x07,0x9f,0x00,0x8f,0x00,0x4f,0x00,0x03,0x5d,0x30,0xff,0xff,0x00,0xc9,0xfe,0x1e,
-0x04,0x6a,0x05,0xd5,0x10,0x27,0x02,0xc9,0x04,0x9b,0x00,0x0a,0x12,0x06,0x00,0x2f,
-0x00,0x00,0xff,0xff,0x00,0x88,0xfe,0x1e,0x01,0xae,0x06,0x14,0x10,0x27,0x02,0xc9,
-0x03,0x1e,0x00,0x0a,0x13,0x06,0x00,0x4f,0x00,0x00,0x00,0x07,0x40,0x03,0x40,0x00,
-0x01,0x5d,0x31,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,0x04,0x6a,0x05,0xd5,0x10,0x27,
-0x0b,0xe8,0x02,0x9f,0xff,0xc3,0x12,0x06,0x00,0x2f,0x00,0x00,0xff,0xff,0x00,0xc1,
-0x00,0x00,0x03,0x00,0x06,0x14,0x10,0x27,0x0b,0xe8,0x02,0x39,0x00,0x02,0x11,0x06,
-0x00,0x4f,0x00,0x00,0x00,0x09,0x40,0x05,0x8f,0x00,0x1f,0x00,0x02,0x5d,0x31,0x00,
-0xff,0xff,0x00,0xc9,0x00,0x00,0x04,0x6a,0x05,0xd5,0x10,0x27,0x00,0x79,0x02,0x31,
-0x00,0x77,0x12,0x06,0x00,0x2f,0x00,0x00,0xff,0xff,0x00,0xc1,0x00,0x00,0x02,0x84,
-0x06,0x14,0x10,0x27,0x00,0x79,0x00,0xd6,0x00,0x73,0x11,0x06,0x00,0x4f,0x00,0x00,
-0x00,0x17,0x4b,0xb0,0x0d,0x51,0x4b,0xb0,0x11,0x53,0x4b,0xb0,0x18,0x51,0x5a,0x5b,
-0x58,0xb9,0x00,0x00,0x00,0x40,0x38,0x59,0x31,0x00,0x00,0x01,0xff,0xf2,0x00,0x00,
-0x04,0x75,0x05,0xd5,0x00,0x0d,0x00,0x3f,0x40,0x1e,0x0c,0x0b,0x0a,0x04,0x03,0x02,
-0x06,0x00,0x06,0x95,0x00,0x81,0x08,0x03,0x04,0x01,0x0b,0x0e,0x00,0x04,0x05,0x01,
-0x1c,0x0c,0x07,0x3a,0x09,0x00,0x79,0x0e,0x10,0xf4,0x3c,0xec,0xc4,0xfc,0x3c,0xc4,
-0x11,0x12,0x39,0x11,0x12,0x39,0x31,0x00,0x2f,0xe4,0xec,0x11,0x17,0x39,0x30,0xb4,
-0x30,0x0f,0x50,0x0f,0x02,0x01,0x5d,0x13,0x33,0x11,0x25,0x17,0x01,0x11,0x21,0x15,
-0x21,0x11,0x07,0x27,0x37,0xd3,0xcb,0x01,0x39,0x50,0xfe,0x77,0x02,0xd7,0xfc,0x5e,
-0x94,0x4d,0xe1,0x05,0xd5,0xfd,0x98,0xdb,0x6f,0xfe,0xee,0xfd,0xe3,0xaa,0x02,0x3b,
-0x6a,0x6e,0x9e,0x00,0x00,0x01,0x00,0x02,0x00,0x00,0x02,0x48,0x06,0x14,0x00,0x0b,
-0x00,0x5e,0x40,0x1a,0x0a,0x09,0x08,0x04,0x03,0x02,0x06,0x00,0x97,0x06,0x03,0x04,
-0x01,0x09,0x0a,0x00,0x04,0x7a,0x05,0x01,0x08,0x0a,0x7a,0x07,0x00,0x0c,0x10,0xd4,
-0x3c,0xe4,0xfc,0x3c,0xe4,0x11,0x12,0x39,0x11,0x12,0x39,0x31,0x00,0x2f,0xec,0x17,
-0x39,0x30,0x01,0x4b,0xb0,0x10,0x54,0x58,0xbd,0x00,0x0c,0x00,0x40,0x00,0x01,0x00,
-0x0c,0x00,0x0c,0xff,0xc0,0x38,0x11,0x37,0x38,0x59,0x40,0x13,0x10,0x0d,0x40,0x0d,
-0x50,0x0d,0x60,0x0d,0x73,0x04,0x7a,0x0a,0x70,0x0d,0xe0,0x0d,0xf0,0x0d,0x09,0x5d,
-0x13,0x33,0x11,0x37,0x17,0x07,0x11,0x23,0x11,0x07,0x27,0x37,0xc7,0xb8,0x7d,0x4c,
-0xc9,0xb8,0x7b,0x4a,0xc5,0x06,0x14,0xfd,0xa6,0x5a,0x6a,0x8d,0xfc,0xe3,0x02,0x9a,
-0x58,0x6a,0x8d,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,0x05,0x33,0x07,0x6c,0x10,0x27,
-0x0b,0xea,0x04,0xc5,0x01,0x76,0x13,0x06,0x00,0x31,0x00,0x00,0x00,0x07,0x40,0x03,
-0x4f,0x00,0x01,0x5d,0x31,0x00,0xff,0xff,0x00,0xba,0x00,0x00,0x04,0x64,0x06,0x6d,
-0x10,0x26,0x00,0x76,0x42,0x07,0x13,0x06,0x00,0x51,0x00,0x00,0x00,0x09,0x40,0x05,
-0x3f,0x00,0x4f,0x00,0x02,0x5d,0x31,0x00,0xff,0xff,0x00,0xc9,0xfe,0x1e,0x05,0x33,
-0x05,0xd5,0x10,0x27,0x02,0xc9,0x05,0x00,0x00,0x0a,0x12,0x06,0x00,0x31,0x00,0x00,
-0xff,0xff,0x00,0xba,0xfe,0x1e,0x04,0x64,0x04,0x7b,0x10,0x27,0x02,0xc9,0x04,0x90,
-0x00,0x0a,0x12,0x06,0x00,0x51,0x00,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,0x05,0x33,
-0x07,0x5f,0x12,0x26,0x00,0x31,0x00,0x00,0x11,0x07,0x0b,0xee,0x04,0xf5,0x01,0x67,
-0x00,0x14,0xb4,0x04,0x0f,0x0b,0x00,0x07,0x2b,0x40,0x09,0x2f,0x0f,0x20,0x0b,0x1f,
-0x0f,0x10,0x0b,0x04,0x5d,0x31,0xff,0xff,0x00,0xba,0x00,0x00,0x04,0x64,0x06,0x66,
-0x12,0x26,0x00,0x51,0x00,0x00,0x11,0x07,0x02,0x7b,0x00,0x8d,0x00,0x00,0x00,0x10,
-0xb4,0x00,0x19,0x15,0x0c,0x07,0x2b,0x40,0x05,0x0f,0x19,0x00,0x15,0x02,0x5d,0x31,
-0xff,0xff,0x00,0xcd,0x00,0x00,0x05,0xb9,0x05,0xd5,0x10,0x27,0x00,0x51,0x01,0x55,
-0x00,0x00,0x10,0x06,0x02,0x70,0x1b,0x00,0x00,0x01,0x00,0xd5,0xfe,0x56,0x05,0x27,
-0x05,0xd5,0x00,0x13,0x00,0x4a,0x40,0x21,0x11,0x11,0x01,0x02,0x01,0x02,0x11,0x10,
-0x11,0x10,0x42,0x0b,0x95,0x0a,0x11,0x02,0x03,0x00,0xaf,0x10,0x13,0x0b,0x10,0x01,
-0x11,0x02,0x1c,0x04,0x36,0x11,0x1c,0x00,0x14,0x10,0xdc,0xec,0xfc,0xec,0x11,0x39,
-0x39,0xcc,0x31,0x00,0x2f,0x3c,0xec,0x32,0x39,0x39,0xdc,0xec,0x30,0x4b,0x53,0x58,
-0x07,0x10,0x04,0xed,0x07,0x10,0x04,0xed,0x59,0x22,0xb2,0x1f,0x15,0x01,0x01,0x5d,
-0x13,0x33,0x01,0x11,0x33,0x11,0x14,0x07,0x06,0x2b,0x01,0x35,0x33,0x32,0x37,0x36,
-0x35,0x01,0x11,0x23,0xd5,0xb8,0x02,0xe2,0xb8,0x52,0x51,0xb5,0xfe,0xe9,0x69,0x26,
-0x26,0xfd,0x1e,0xb8,0x05,0xd5,0xfb,0x83,0x04,0x7d,0xfa,0x17,0xd6,0x60,0x60,0x9c,
-0x30,0x31,0xad,0x04,0x7d,0xfb,0x83,0x00,0x00,0x01,0x00,0xba,0xfe,0x56,0x04,0x64,
-0x04,0x7b,0x00,0x1f,0x00,0x3b,0x40,0x1c,0x0d,0x13,0x00,0x03,0x18,0x15,0x07,0x87,
-0x06,0x10,0x87,0x18,0x1c,0xb8,0x16,0xbc,0x15,0x07,0x0d,0x08,0x00,0x4e,0x13,0x17,
-0x08,0x16,0x46,0x20,0x10,0xfc,0xec,0x32,0xf4,0xec,0xc4,0x31,0x00,0x2f,0xe4,0xf4,
-0xc4,0xec,0xd4,0xec,0x11,0x12,0x17,0x39,0x30,0xb4,0x60,0x21,0xcf,0x21,0x02,0x01,
-0x5d,0x01,0x11,0x14,0x07,0x06,0x2b,0x01,0x35,0x33,0x32,0x37,0x36,0x35,0x11,0x34,
-0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x36,0x37,0x36,0x33,0x32,0x17,
-0x16,0x04,0x64,0x52,0x51,0xb5,0xfe,0xe9,0x69,0x26,0x26,0x7c,0x7c,0x95,0xac,0xb9,
-0xb9,0x42,0x59,0x5a,0x75,0xc1,0x63,0x63,0x02,0xa4,0xfd,0x48,0xd6,0x60,0x60,0x9c,
-0x30,0x31,0x99,0x02,0xb2,0x9f,0x9e,0xbe,0xa4,0xfd,0x87,0x04,0x60,0xae,0x65,0x32,
-0x32,0x77,0x78,0x00,0xff,0xff,0x00,0x73,0xff,0xe3,0x05,0xd9,0x07,0x31,0x10,0x27,
-0x00,0x71,0x01,0x27,0x01,0x3b,0x13,0x06,0x00,0x32,0x00,0x00,0x00,0x10,0xb4,0x0d,
-0x02,0x03,0x07,0x07,0x2b,0x40,0x05,0x1f,0x02,0x10,0x03,0x02,0x5d,0x31,0xff,0xff,
-0x00,0x71,0xff,0xe3,0x04,0x75,0x05,0xf5,0x10,0x26,0x00,0x71,0x73,0xff,0x13,0x06,
-0x00,0x52,0x00,0x00,0x00,0x08,0xb4,0x13,0x02,0x03,0x19,0x07,0x2b,0x31,0xff,0xff,
-0x00,0x73,0xff,0xe3,0x05,0xd9,0x07,0x6d,0x10,0x27,0x0b,0xf0,0x05,0x27,0x01,0x75,
-0x13,0x06,0x00,0x32,0x00,0x00,0x00,0x10,0xb4,0x11,0x00,0x08,0x17,0x07,0x2b,0x40,
-0x05,0x10,0x00,0x1f,0x08,0x02,0x5d,0x31,0xff,0xff,0x00,0x71,0xff,0xe3,0x04,0x75,
-0x06,0x48,0x10,0x26,0x02,0x8c,0x73,0x00,0x13,0x06,0x00,0x52,0x00,0x00,0x00,0x08,
-0xb4,0x1d,0x08,0x00,0x23,0x07,0x2b,0x31,0xff,0xff,0x00,0x73,0xff,0xe3,0x05,0xd9,
-0x07,0x6b,0x10,0x27,0x0b,0xf2,0x05,0x27,0x01,0x75,0x12,0x06,0x00,0x32,0x00,0x00,
-0xff,0xff,0x00,0x71,0xff,0xe3,0x04,0x75,0x06,0x66,0x10,0x27,0x02,0x91,0x00,0xa0,
-0x00,0x00,0x12,0x06,0x00,0x52,0x00,0x00,0x00,0x02,0x00,0x73,0x00,0x00,0x08,0x0c,
-0x05,0xd5,0x00,0x10,0x00,0x19,0x00,0x3b,0x40,0x1f,0x05,0x95,0x03,0x11,0x01,0x95,
-0x00,0x81,0x18,0x07,0x95,0x03,0xad,0x09,0x18,0x12,0x10,0x0a,0x15,0x06,0x02,0x1c,
-0x11,0x00,0x04,0x08,0x15,0x19,0x0d,0x10,0x1a,0x10,0xfc,0xec,0xd4,0xc4,0xc4,0xd4,
-0xec,0x32,0x12,0x39,0x39,0x39,0x39,0x31,0x00,0x2f,0xec,0xec,0x32,0xf4,0xec,0x32,
-0x10,0xee,0x30,0x01,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x20,0x00,
-0x11,0x10,0x00,0x21,0x17,0x23,0x20,0x00,0x11,0x10,0x00,0x21,0x33,0x07,0xfa,0xfd,
-0x1a,0x02,0xc7,0xfd,0x39,0x02,0xf8,0xfb,0xd7,0xfe,0x4f,0xfe,0x41,0x01,0xbf,0x01,
-0xb1,0x67,0x81,0xfe,0xbf,0xfe,0xc0,0x01,0x40,0x01,0x41,0x81,0x05,0xd5,0xaa,0xfe,
-0x46,0xaa,0xfd,0xe3,0xaa,0x01,0x7c,0x01,0x70,0x01,0x6d,0x01,0x7c,0xaa,0xfe,0xe1,
-0xfe,0xe0,0xfe,0xdf,0xfe,0xdf,0x00,0x03,0x00,0x71,0xff,0xe3,0x07,0xc3,0x04,0x7b,
-0x00,0x06,0x00,0x27,0x00,0x33,0x00,0x84,0x40,0x31,0x07,0x08,0x00,0x10,0x86,0x0f,
-0x88,0x0c,0x00,0xa9,0x08,0x2e,0x0c,0xb9,0x16,0x13,0x28,0x03,0xb9,0x08,0xbb,0x22,
-0x25,0x1f,0xb8,0x19,0x13,0x8c,0x34,0x06,0x00,0x16,0x22,0x31,0x09,0x0f,0x00,0x08,
-0x07,0x4b,0x31,0x12,0x09,0x51,0x2b,0x12,0x1c,0x45,0x34,0x10,0xfc,0xec,0xf4,0xfc,
-0xf4,0xec,0xc4,0x11,0x12,0x39,0x39,0x12,0x39,0x31,0x00,0x10,0xe4,0x32,0xf4,0x3c,
-0xc4,0xe4,0xec,0x32,0x10,0xc4,0xee,0x32,0x10,0xee,0x10,0xf4,0xee,0x11,0x12,0x39,
-0x30,0x40,0x25,0x3f,0x35,0x5f,0x35,0x70,0x35,0x9f,0x35,0xcf,0x35,0xd0,0x35,0xf0,
-0x35,0x07,0x3f,0x00,0x3f,0x06,0x3f,0x07,0x3f,0x08,0x3f,0x09,0x05,0x6f,0x00,0x6f,
-0x06,0x6f,0x07,0x6f,0x08,0x6f,0x09,0x05,0x5d,0x71,0x01,0x5d,0x01,0x2e,0x01,0x23,
-0x22,0x06,0x07,0x05,0x15,0x21,0x1e,0x01,0x33,0x32,0x36,0x37,0x15,0x0e,0x01,0x23,
-0x22,0x26,0x27,0x0e,0x01,0x23,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x16,0x17,0x3e,
-0x01,0x33,0x32,0x00,0x25,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,
-0x07,0x0a,0x02,0xa4,0x89,0x99,0xb9,0x0e,0x03,0x48,0xfc,0xb2,0x0c,0xcc,0xb7,0x6a,
-0xc8,0x62,0x64,0xd0,0x6a,0xa0,0xf2,0x51,0x47,0xd1,0x8c,0xf1,0xfe,0xef,0x01,0x11,
-0xf1,0x8c,0xd3,0x42,0x4e,0xe8,0x8f,0xe2,0x01,0x08,0xfa,0xb0,0x94,0xac,0xab,0x95,
-0x93,0xac,0xac,0x02,0x94,0x98,0xb3,0xae,0x9e,0x35,0x5a,0xbe,0xc7,0x34,0x34,0xae,
-0x2a,0x2c,0x6e,0x6d,0x6e,0x6d,0x01,0x39,0x01,0x13,0x01,0x14,0x01,0x38,0x6f,0x6c,
-0x6b,0x70,0xfe,0xdd,0x87,0xe7,0xc9,0xc9,0xe7,0xe8,0xc8,0xc7,0xe9,0x00,0xff,0xff,
-0x00,0xc9,0x00,0x00,0x05,0x54,0x07,0x6c,0x10,0x27,0x0b,0xea,0x04,0x95,0x01,0x76,
-0x12,0x06,0x00,0x35,0x00,0x00,0xff,0xff,0x00,0xba,0x00,0x00,0x03,0x95,0x06,0x6d,
-0x10,0x26,0x00,0x76,0x42,0x07,0x12,0x06,0x00,0x55,0x00,0x00,0xff,0xff,0x00,0xc9,
-0xfe,0x1e,0x05,0x54,0x05,0xd5,0x10,0x27,0x02,0xc9,0x05,0x10,0x00,0x0a,0x12,0x06,
-0x00,0x35,0x00,0x00,0xff,0xff,0x00,0x82,0xfe,0x1e,0x03,0x4a,0x04,0x7b,0x10,0x27,
-0x02,0xc9,0x03,0x18,0x00,0x0a,0x12,0x06,0x00,0x55,0x00,0x00,0xff,0xff,0x00,0xc9,
-0x00,0x00,0x05,0x54,0x07,0x5f,0x12,0x26,0x00,0x35,0x00,0x00,0x11,0x07,0x0b,0xee,
-0x04,0x7d,0x01,0x67,0x00,0x08,0x00,0x40,0x03,0x5f,0x1d,0x01,0x5d,0x30,0xff,0xff,
-0x00,0xba,0x00,0x00,0x03,0x5a,0x06,0x66,0x12,0x26,0x00,0x55,0x00,0x00,0x10,0x06,
-0x02,0x7b,0x1b,0x00,0xff,0xff,0x00,0x87,0xff,0xe3,0x04,0xa2,0x07,0x6c,0x10,0x27,
-0x0b,0xea,0x04,0x95,0x01,0x76,0x12,0x06,0x00,0x36,0x00,0x00,0xff,0xff,0x00,0x6f,
-0xff,0xe3,0x03,0xc7,0x06,0x6d,0x10,0x26,0x00,0x76,0x42,0x07,0x12,0x06,0x00,0x56,
-0x00,0x00,0xff,0xff,0x00,0x87,0xff,0xe3,0x04,0xa2,0x07,0x6d,0x10,0x27,0x0b,0xed,
-0x04,0x93,0x01,0x75,0x13,0x06,0x00,0x36,0x00,0x00,0x00,0x0b,0xb4,0x04,0x20,0x15,
-0x29,0x29,0x10,0x49,0x63,0x3a,0x31,0x00,0xff,0xff,0x00,0x6f,0xff,0xe3,0x03,0xc7,
-0x06,0x66,0x10,0x26,0x02,0x7a,0x25,0x00,0x13,0x06,0x00,0x56,0x00,0x00,0x00,0x0b,
-0xb4,0x04,0x20,0x15,0x29,0x29,0x10,0x49,0x63,0x3a,0x31,0x00,0xff,0xff,0x00,0x87,
-0xfe,0x75,0x04,0xa2,0x05,0xf0,0x12,0x26,0x00,0x36,0x00,0x00,0x10,0x07,0x00,0x7a,
-0x00,0x8b,0x00,0x00,0xff,0xff,0x00,0x6f,0xfe,0x75,0x03,0xc7,0x04,0x7b,0x12,0x26,
-0x00,0x56,0x00,0x00,0x10,0x06,0x00,0x7a,0x17,0x00,0xff,0xff,0x00,0x87,0xff,0xe3,
-0x04,0xa2,0x07,0x6d,0x12,0x26,0x00,0x36,0x00,0x00,0x11,0x07,0x0b,0xee,0x04,0x8b,
-0x01,0x75,0x00,0x0b,0xb4,0x2b,0x20,0x0e,0x22,0x22,0x10,0x49,0x63,0x3a,0x31,0x00,
-0xff,0xff,0x00,0x6f,0xff,0xe3,0x03,0xc7,0x06,0x66,0x12,0x26,0x00,0x56,0x00,0x00,
-0x11,0x06,0x02,0x7b,0x17,0x00,0x00,0x0b,0xb4,0x2b,0x20,0x0e,0x22,0x22,0x10,0x49,
-0x63,0x3a,0x31,0x00,0xff,0xff,0xff,0xfa,0xfe,0x75,0x04,0xe9,0x05,0xd5,0x10,0x26,
-0x00,0x7a,0x50,0x00,0x12,0x06,0x00,0x37,0x00,0x00,0xff,0xff,0x00,0x37,0xfe,0x75,
-0x02,0xf2,0x05,0x9e,0x10,0x26,0x00,0x7a,0xe1,0x00,0x12,0x06,0x00,0x57,0x00,0x00,
-0xff,0xff,0xff,0xfa,0x00,0x00,0x04,0xe9,0x07,0x5f,0x12,0x26,0x00,0x37,0x00,0x00,
-0x11,0x07,0x0b,0xee,0x04,0x73,0x01,0x67,0x00,0x10,0xb4,0x01,0x0d,0x09,0x00,0x07,
-0x2b,0x31,0x00,0x40,0x03,0x5f,0x08,0x01,0x5d,0x30,0xff,0xff,0x00,0x37,0x00,0x00,
-0x02,0xfe,0x06,0x82,0x12,0x26,0x00,0x57,0x00,0x00,0x11,0x07,0x0b,0xe8,0x02,0x37,
-0x00,0x70,0x00,0x07,0x40,0x03,0x8f,0x14,0x01,0x5d,0x31,0x00,0x00,0x01,0xff,0xfa,
-0x00,0x00,0x04,0xe9,0x05,0xd5,0x00,0x0f,0x00,0x46,0x40,0x18,0x07,0x0b,0x95,0x04,
-0x0c,0x09,0x03,0x0f,0x95,0x00,0x81,0x09,0x05,0x01,0x40,0x07,0x03,0x1c,0x0c,0x00,
-0x40,0x0a,0x0e,0x10,0x10,0xd4,0x3c,0xe4,0xcc,0xfc,0x3c,0xe4,0xcc,0x31,0x00,0x2f,
-0xf4,0xec,0x32,0x10,0xd4,0x3c,0xec,0x32,0x30,0x01,0x40,0x13,0x00,0x11,0x1f,0x00,
-0x10,0x01,0x10,0x02,0x1f,0x0f,0x10,0x11,0x40,0x11,0x70,0x11,0x9f,0x11,0x09,0x5d,
-0x03,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x11,0x21,
-0x06,0x04,0xef,0xfd,0xee,0x01,0x09,0xfe,0xf7,0xcb,0xfe,0xf7,0x01,0x09,0xfd,0xee,
-0x05,0xd5,0xaa,0xfd,0xc0,0xaa,0xfd,0xbf,0x02,0x41,0xaa,0x02,0x40,0x00,0x00,0x01,
-0x00,0x37,0x00,0x00,0x02,0xf2,0x05,0x9e,0x00,0x1d,0x00,0x43,0x40,0x1f,0x08,0x16,
-0xa9,0x05,0x17,0x04,0x1a,0xa9,0x00,0x01,0x1b,0xbc,0x0d,0x87,0x10,0x10,0x0d,0x0e,
-0x02,0x06,0x08,0x04,0x00,0x08,0x17,0x1b,0x15,0x19,0x1d,0x46,0x1e,0x10,0xfc,0x3c,
-0x3c,0xc4,0x32,0xfc,0x3c,0x3c,0xc4,0xc4,0x32,0x39,0x39,0x31,0x00,0x2f,0xec,0xf4,
-0x3c,0xc4,0xfc,0x3c,0xdc,0x3c,0xec,0x32,0x30,0xb2,0xaf,0x1f,0x01,0x01,0x5d,0x01,
-0x11,0x21,0x15,0x21,0x15,0x33,0x15,0x23,0x15,0x14,0x17,0x16,0x3b,0x01,0x15,0x23,
-0x22,0x27,0x26,0x3d,0x01,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x11,0x01,0x77,0x01,
-0x7b,0xfe,0x85,0xbe,0xbe,0x25,0x26,0x73,0xbd,0xbd,0xd5,0x51,0x51,0x87,0x87,0x87,
-0x87,0x05,0x9e,0xfe,0xc2,0x8f,0xe9,0x8e,0xe9,0x89,0x27,0x27,0x9a,0x50,0x4f,0xd2,
-0xe9,0x8e,0xe9,0x8f,0x01,0x3e,0xff,0xff,0x00,0xb2,0xff,0xe3,0x05,0x29,0x07,0x5e,
-0x10,0x27,0x0b,0xeb,0x04,0xee,0x01,0x75,0x13,0x06,0x00,0x38,0x00,0x00,0x00,0x10,
-0xb4,0x1f,0x09,0x18,0x27,0x07,0x2b,0x40,0x05,0x10,0x09,0x1f,0x18,0x02,0x5d,0x31,
-0xff,0xff,0x00,0xae,0xff,0xe3,0x04,0x58,0x06,0x37,0x10,0x27,0x02,0x90,0x00,0x83,
-0x00,0x00,0x13,0x06,0x00,0x58,0x00,0x00,0x00,0x08,0xb4,0x1e,0x08,0x16,0x26,0x07,
-0x2b,0x31,0xff,0xff,0x00,0xb2,0xff,0xe3,0x05,0x29,0x07,0x31,0x10,0x27,0x00,0x71,
-0x00,0xee,0x01,0x3b,0x13,0x06,0x00,0x38,0x00,0x00,0x00,0x14,0xb4,0x05,0x03,0x02,
-0x0d,0x07,0x2b,0x40,0x09,0x2f,0x02,0x20,0x03,0x1f,0x02,0x10,0x03,0x04,0x5d,0x31,
-0xff,0xff,0x00,0xae,0xff,0xe3,0x04,0x58,0x05,0xf5,0x10,0x27,0x00,0x71,0x00,0x83,
-0xff,0xff,0x13,0x06,0x00,0x58,0x00,0x00,0x00,0x08,0xb4,0x06,0x03,0x02,0x0e,0x07,
-0x2b,0x31,0xff,0xff,0x00,0xb2,0xff,0xe3,0x05,0x29,0x07,0x6d,0x10,0x27,0x0b,0xf0,
-0x04,0xee,0x01,0x75,0x13,0x06,0x00,0x38,0x00,0x00,0x00,0x10,0xb4,0x0f,0x00,0x08,
-0x17,0x07,0x2b,0x40,0x05,0x10,0x00,0x1f,0x08,0x02,0x5d,0x31,0xff,0xff,0x00,0xae,
-0xff,0xe3,0x04,0x58,0x06,0x48,0x10,0x27,0x02,0x8c,0x00,0x83,0x00,0x00,0x13,0x06,
-0x00,0x58,0x00,0x00,0x00,0x08,0xb4,0x10,0x00,0x08,0x18,0x07,0x2b,0x31,0xff,0xff,
-0x00,0xb2,0xff,0xe3,0x05,0x29,0x08,0x4b,0x12,0x26,0x00,0x38,0x00,0x00,0x11,0x07,
-0x02,0x8e,0x00,0xf0,0x01,0x45,0x00,0x09,0x40,0x05,0x40,0x1e,0x40,0x12,0x02,0x5d,
-0x31,0x00,0xff,0xff,0x00,0xae,0xff,0xe3,0x04,0x58,0x06,0xca,0x12,0x26,0x00,0x58,
-0x00,0x00,0x11,0x06,0x02,0x8e,0x7c,0xc4,0x00,0x09,0x40,0x05,0x40,0x14,0x40,0x20,
-0x02,0x5d,0x31,0x00,0xff,0xff,0x00,0xb2,0xff,0xe3,0x05,0x29,0x07,0x6b,0x10,0x27,
-0x0b,0xf2,0x04,0xee,0x01,0x75,0x12,0x06,0x00,0x38,0x00,0x00,0xff,0xff,0x00,0xae,
-0xff,0xe3,0x04,0x5e,0x06,0x66,0x10,0x27,0x02,0x91,0x00,0xb0,0x00,0x00,0x12,0x06,
-0x00,0x58,0x00,0x00,0xff,0xff,0x00,0xb2,0xfe,0x65,0x05,0x29,0x05,0xd5,0x12,0x26,
-0x00,0x38,0x00,0x00,0x10,0x07,0x02,0x8f,0x00,0xfa,0xff,0xf0,0xff,0xff,0x00,0xae,
-0xfe,0x75,0x04,0xe8,0x04,0x60,0x12,0x26,0x00,0x58,0x00,0x00,0x10,0x07,0x02,0x8f,
-0x02,0x27,0x00,0x00,0xff,0xff,0x00,0x44,0x00,0x00,0x07,0xa6,0x07,0x74,0x10,0x27,
-0x0b,0xed,0x05,0xf5,0x01,0x7c,0x13,0x06,0x00,0x3a,0x00,0x00,0x00,0x08,0xb4,0x15,
-0x02,0x06,0x14,0x07,0x2b,0x31,0xff,0xff,0x00,0x56,0x00,0x00,0x06,0x35,0x06,0x6d,
-0x10,0x27,0x02,0x7a,0x01,0x45,0x00,0x07,0x13,0x06,0x00,0x5a,0x00,0x00,0x00,0x08,
-0xb4,0x15,0x02,0x06,0x14,0x07,0x2b,0x31,0xff,0xff,0xff,0xfc,0x00,0x00,0x04,0xe7,
-0x07,0x74,0x10,0x27,0x0b,0xed,0x04,0x72,0x01,0x7c,0x13,0x06,0x00,0x3c,0x00,0x00,
-0x00,0x08,0xb4,0x0b,0x02,0x06,0x07,0x07,0x2b,0x31,0xff,0xff,0x00,0x3d,0xfe,0x56,
-0x04,0x7f,0x06,0x6d,0x10,0x26,0x02,0x7a,0x5e,0x07,0x13,0x06,0x00,0x5c,0x00,0x00,
-0x00,0x08,0xb4,0x18,0x02,0x06,0x17,0x07,0x2b,0x31,0xff,0xff,0xff,0xfc,0x00,0x00,
-0x04,0xe7,0x07,0x4e,0x12,0x26,0x00,0x3c,0x00,0x00,0x11,0x07,0x0b,0xe9,0x04,0x73,
-0x01,0x75,0x00,0x08,0xb4,0x00,0x10,0x0b,0x04,0x07,0x2b,0x31,0xff,0xff,0x00,0x5c,
-0x00,0x00,0x05,0x1f,0x07,0x6c,0x10,0x27,0x0b,0xea,0x04,0x95,0x01,0x76,0x12,0x06,
-0x00,0x3d,0x00,0x00,0xff,0xff,0x00,0x58,0x00,0x00,0x03,0xdb,0x06,0x6d,0x10,0x26,
-0x00,0x76,0x42,0x07,0x12,0x06,0x00,0x5d,0x00,0x00,0xff,0xff,0x00,0x5c,0x00,0x00,
-0x05,0x1f,0x07,0x3d,0x10,0x27,0x0b,0xf1,0x04,0xa8,0x01,0x62,0x12,0x06,0x00,0x3d,
-0x00,0x00,0xff,0xff,0x00,0x58,0x00,0x00,0x03,0xdb,0x06,0x10,0x10,0x26,0x02,0x8d,
-0x00,0x00,0x12,0x06,0x00,0x5d,0x00,0x00,0xff,0xff,0x00,0x5c,0x00,0x00,0x05,0x1f,
-0x07,0x6d,0x12,0x26,0x00,0x3d,0x00,0x00,0x10,0x07,0x0b,0xee,0x04,0xbe,0x01,0x75,
-0xff,0xff,0x00,0x58,0x00,0x00,0x03,0xdb,0x06,0x66,0x12,0x26,0x00,0x5d,0x00,0x00,
-0x10,0x06,0x02,0x7b,0x1b,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x02,0xf8,0x06,0x14,
-0x00,0x10,0x00,0x23,0x40,0x12,0x0b,0x87,0x0a,0x97,0x01,0x02,0xa9,0x05,0xbc,0x01,
-0x0a,0x10,0x08,0x04,0x06,0x02,0x4c,0x11,0x10,0xfc,0x3c,0xcc,0xfc,0xcc,0x31,0x00,
-0x2f,0xf4,0xec,0x10,0xf4,0xec,0x30,0x21,0x23,0x11,0x23,0x35,0x33,0x35,0x34,0x36,
-0x3b,0x01,0x15,0x23,0x22,0x07,0x06,0x15,0x01,0x98,0xb9,0xb0,0xb0,0xae,0xbd,0xae,
-0xb0,0x63,0x27,0x26,0x03,0xd1,0x8f,0x4e,0xbb,0xab,0x99,0x28,0x29,0x67,0x00,0x02,
-0x00,0x20,0xff,0xe3,0x04,0xa4,0x06,0x14,0x00,0x0f,0x00,0x2c,0x00,0x44,0x40,0x25,
-0x04,0xb9,0x10,0x14,0x0c,0xb9,0x20,0x1c,0x8c,0x14,0xb8,0x22,0x29,0x25,0xa9,0x2c,
-0x24,0x27,0x97,0x22,0x2e,0x45,0x00,0x12,0x18,0x47,0x2a,0x20,0x06,0x2c,0x28,0x08,
-0x25,0x23,0x27,0x46,0x2d,0x10,0xfc,0x3c,0xcc,0xec,0x32,0x32,0x32,0xcc,0xf4,0xec,
-0xec,0x31,0x00,0x2f,0xf4,0xdc,0x3c,0xec,0x32,0x10,0xe4,0xf4,0xc4,0xec,0x10,0xc6,
-0xee,0x30,0x01,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x32,
-0x37,0x36,0x01,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x11,0x10,0x07,0x06,0x23,0x22,
-0x27,0x26,0x27,0x15,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x21,0x15,0x21,0x03,
-0xe5,0x53,0x54,0x92,0x92,0x54,0x53,0x53,0x54,0x92,0x92,0x54,0x53,0xfd,0x8e,0x3a,
-0x59,0x58,0x7b,0xcc,0x7f,0x80,0x80,0x7f,0xcc,0x7b,0x58,0x59,0x3a,0xb9,0x9a,0x9a,
-0xb9,0x01,0x45,0xfe,0xbb,0x02,0x2f,0xcb,0x74,0x73,0x73,0x74,0xcb,0xcb,0x74,0x73,
-0x73,0x74,0x02,0x52,0x64,0x30,0x31,0xa2,0xa2,0xfe,0xf8,0xfe,0xf8,0xa2,0xa2,0x31,
-0x30,0x64,0xa8,0x05,0x04,0x7d,0x93,0x93,0x7d,0x00,0x00,0x03,0xff,0x97,0x00,0x00,
-0x05,0x50,0x05,0xd5,0x00,0x08,0x00,0x21,0x00,0x2a,0x00,0x00,0x01,0x11,0x21,0x32,
-0x36,0x35,0x34,0x26,0x23,0x03,0x32,0x16,0x15,0x14,0x06,0x07,0x1e,0x01,0x15,0x14,
-0x04,0x23,0x21,0x11,0x22,0x07,0x06,0x1d,0x01,0x23,0x35,0x34,0x36,0x33,0x17,0x11,
-0x21,0x32,0x36,0x35,0x34,0x26,0x23,0x01,0xf7,0x01,0x44,0xa3,0x9d,0x9d,0xa3,0x0a,
-0xe7,0xfa,0x80,0x7c,0x95,0xa5,0xfe,0xf0,0xfb,0xfd,0xe8,0x8e,0x3b,0x31,0x9c,0xc0,
-0xd6,0xca,0x01,0x2b,0x94,0x91,0x91,0x94,0x02,0xc9,0xfd,0xdd,0x87,0x8b,0x8c,0x85,
-0x03,0x0c,0xc0,0xb1,0x89,0xa2,0x14,0x20,0xcb,0x98,0xc8,0xda,0x05,0x2f,0x2f,0x26,
-0x72,0x31,0x46,0xb5,0xa3,0xa6,0xfe,0x3e,0x6f,0x72,0x71,0x70,0xff,0xff,0x00,0xc9,
-0x00,0x00,0x04,0xec,0x05,0xd5,0x10,0x06,0x03,0x89,0x00,0x00,0x00,0x02,0x00,0xba,
-0xff,0xe3,0x04,0xa4,0x06,0x14,0x00,0x16,0x00,0x26,0x00,0x38,0x40,0x1f,0x1b,0xb9,
-0x00,0x04,0x23,0xb9,0x10,0x0c,0x8c,0x04,0xb8,0x12,0x16,0xa9,0x13,0x97,0x12,0x28,
-0x45,0x14,0x17,0x12,0x08,0x47,0x10,0x1f,0x16,0x08,0x13,0x46,0x27,0x10,0xfc,0xec,
-0x32,0x32,0xf4,0xec,0xc4,0xec,0x31,0x00,0x2f,0xf4,0xec,0x10,0xe4,0xf4,0xc4,0xec,
-0x10,0xc6,0xee,0x30,0x01,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x11,0x10,0x07,0x06,
-0x23,0x22,0x27,0x26,0x27,0x15,0x23,0x11,0x21,0x15,0x25,0x01,0x34,0x27,0x26,0x23,
-0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x01,0x73,0x3a,0x59,0x58,
-0x7b,0xcc,0x7f,0x80,0x80,0x7f,0xcc,0x7b,0x58,0x59,0x3a,0xb9,0x03,0x4e,0xfd,0x6b,
-0x02,0x72,0x53,0x54,0x92,0x92,0x54,0x53,0x53,0x54,0x92,0x92,0x54,0x53,0x03,0xb6,
-0x64,0x30,0x31,0xa2,0xa2,0xfe,0xf8,0xfe,0xf8,0xa2,0xa2,0x31,0x30,0x64,0xa8,0x06,
-0x14,0xa6,0x01,0xfc,0xc0,0xcb,0x74,0x73,0x73,0x74,0xcb,0xcb,0x74,0x73,0x73,0x74,
-0x00,0x02,0x00,0x00,0x00,0x00,0x04,0xec,0x05,0xd5,0x00,0x0a,0x00,0x16,0x00,0x00,
-0x01,0x34,0x27,0x26,0x23,0x21,0x11,0x21,0x32,0x37,0x36,0x01,0x11,0x21,0x32,0x04,
-0x15,0x14,0x04,0x23,0x21,0x11,0x23,0x04,0x17,0x4f,0x4e,0xa3,0xfe,0xbc,0x01,0x44,
-0xa3,0x4e,0x4f,0xfd,0x7c,0x01,0x4e,0xfb,0x01,0x10,0xfe,0xf0,0xfb,0xfd,0xe8,0xc9,
-0x01,0xb7,0x8b,0x44,0x43,0xfd,0xdd,0x44,0x43,0x04,0xa8,0xfd,0x9a,0xda,0xde,0xdd,
-0xda,0x04,0x44,0x00,0x00,0x02,0x00,0x00,0xff,0xe3,0x04,0xa4,0x06,0x15,0x00,0x10,
-0x00,0x18,0x00,0x00,0x01,0x3e,0x01,0x33,0x32,0x00,0x10,0x02,0x23,0x22,0x26,0x27,
-0x15,0x23,0x11,0x23,0x01,0x00,0x10,0x26,0x20,0x06,0x10,0x16,0x20,0x01,0x73,0x3a,
-0xb1,0x7b,0xcc,0x00,0xff,0xff,0xcc,0x7b,0xb1,0x3a,0xb9,0xba,0x01,0x73,0x02,0x72,
-0xa7,0xfe,0xdc,0xa7,0xa7,0x01,0x24,0x03,0xb6,0x64,0x61,0xfe,0xbc,0xfd,0xf0,0xfe,
-0xbc,0x61,0x64,0xa8,0x04,0x44,0x01,0xd1,0xfb,0x4f,0x01,0x96,0xe7,0xe7,0xfe,0x6a,
-0xe7,0x00,0x00,0x01,0x00,0x73,0xff,0xe3,0x05,0x27,0x05,0xf0,0x00,0x19,0x00,0x30,
-0x40,0x1b,0x19,0x86,0x00,0x88,0x16,0x95,0x03,0x91,0x1a,0x0d,0x86,0x0c,0x88,0x10,
-0x95,0x09,0x8c,0x1a,0x1b,0x10,0x13,0x19,0x06,0x30,0x0d,0x00,0x1a,0x10,0xdc,0x3c,
-0xf4,0xec,0xec,0x31,0x00,0x10,0xf4,0xec,0xf4,0xec,0x10,0xf4,0xec,0xf4,0xec,0x30,
-0x13,0x3e,0x01,0x33,0x20,0x00,0x11,0x10,0x00,0x21,0x22,0x26,0x27,0x35,0x1e,0x01,
-0x33,0x20,0x00,0x11,0x10,0x00,0x21,0x22,0x06,0x07,0x73,0x68,0xed,0x86,0x01,0x53,
-0x01,0x86,0xfe,0x7a,0xfe,0xad,0x84,0xed,0x6a,0x66,0xe7,0x82,0x01,0x00,0x01,0x10,
-0xfe,0xf0,0xff,0x00,0x82,0xe7,0x66,0x05,0x62,0x47,0x47,0xfe,0x61,0xfe,0x98,0xfe,
-0x99,0xfe,0x61,0x48,0x48,0xd3,0x5f,0x5e,0x01,0x39,0x01,0x27,0x01,0x28,0x01,0x39,
-0x5e,0x5f,0x00,0x01,0x00,0x73,0xff,0xe3,0x06,0x5a,0x07,0x64,0x00,0x24,0x00,0x00,
-0x01,0x36,0x37,0x36,0x3b,0x01,0x15,0x23,0x22,0x06,0x1d,0x01,0x2e,0x01,0x23,0x20,
-0x00,0x11,0x10,0x00,0x21,0x32,0x36,0x37,0x15,0x0e,0x01,0x23,0x20,0x00,0x11,0x10,
-0x00,0x21,0x32,0x17,0x16,0x04,0x61,0x10,0x53,0x66,0xe3,0x4d,0x3f,0x86,0x6e,0x66,
-0xe7,0x82,0xff,0x00,0xfe,0xf0,0x01,0x10,0x01,0x00,0x82,0xe7,0x66,0x6a,0xed,0x84,
-0xfe,0xad,0xfe,0x7a,0x01,0x86,0x01,0x53,0x86,0x76,0x0d,0x05,0xc5,0xc3,0x62,0x7a,
-0xaa,0x96,0xc2,0xd5,0x5f,0x5e,0xfe,0xc7,0xfe,0xd8,0xfe,0xd9,0xfe,0xc7,0x5e,0x5f,
-0xd3,0x48,0x48,0x01,0x9f,0x01,0x67,0x01,0x68,0x01,0x9f,0x24,0x03,0x00,0x00,0x01,
-0x00,0x71,0xff,0xe3,0x04,0xcd,0x05,0xcb,0x00,0x21,0x00,0x00,0x01,0x36,0x37,0x36,
-0x3b,0x01,0x15,0x23,0x22,0x06,0x1d,0x01,0x2e,0x01,0x23,0x22,0x06,0x10,0x16,0x33,
-0x32,0x36,0x37,0x15,0x0e,0x01,0x23,0x22,0x00,0x11,0x10,0x00,0x21,0x32,0x03,0x31,
-0x09,0x46,0x52,0xb5,0x46,0x31,0x69,0x4c,0x4e,0x9d,0x50,0xb3,0xc6,0xc6,0xb3,0x50,
-0x9d,0x4e,0x4d,0xa5,0x5d,0xfd,0xfe,0xd6,0x01,0x2d,0x01,0x06,0x48,0x04,0x6f,0xa9,
-0x53,0x60,0x9c,0x61,0x99,0xac,0x2b,0x2b,0xe3,0xfe,0x66,0xe3,0x2b,0x2b,0xaa,0x24,
-0x24,0x01,0x3e,0x01,0x0e,0x01,0x12,0x01,0x3a,0x00,0xff,0xff,0x00,0x0a,0x00,0x00,
-0x05,0xba,0x05,0xd5,0x10,0x06,0x00,0x92,0x00,0x00,0x00,0x02,0xff,0x97,0x00,0x00,
-0x06,0x14,0x05,0xd5,0x00,0x08,0x00,0x1b,0x00,0x00,0x01,0x11,0x33,0x20,0x00,0x11,
-0x10,0x00,0x21,0x27,0x20,0x00,0x11,0x10,0x00,0x29,0x01,0x11,0x22,0x07,0x06,0x1d,
-0x01,0x23,0x35,0x34,0x36,0x33,0x01,0xf7,0xf4,0x01,0x35,0x01,0x1f,0xfe,0xe1,0xfe,
-0xcb,0x1f,0x01,0xb2,0x01,0x96,0xfe,0x68,0xfe,0x50,0xfe,0x61,0x8e,0x3b,0x31,0x9c,
-0xc0,0xd6,0x05,0x2f,0xfb,0x77,0x01,0x18,0x01,0x2e,0x01,0x2c,0x01,0x17,0xa6,0xfe,
-0x97,0xfe,0x80,0xfe,0x7e,0xfe,0x96,0x05,0x2f,0x2f,0x26,0x72,0x31,0x46,0xb5,0xa3,
-0x00,0x02,0x00,0xc9,0x00,0x00,0x04,0xec,0x05,0xd5,0x00,0x0a,0x00,0x17,0x00,0x00,
-0x01,0x14,0x17,0x16,0x33,0x21,0x11,0x21,0x22,0x07,0x06,0x11,0x21,0x11,0x21,0x22,
-0x24,0x35,0x34,0x24,0x33,0x21,0x11,0x21,0x01,0x9e,0x4f,0x4e,0xa3,0x01,0x44,0xfe,
-0xbc,0xa3,0x4e,0x4f,0x03,0x4e,0xfd,0xe8,0xfb,0xfe,0xf0,0x01,0x10,0xfb,0x01,0x4e,
-0xfd,0x7c,0x01,0xb7,0x8a,0x43,0x44,0x02,0x23,0x43,0x44,0x03,0x93,0xfa,0x2b,0xda,
-0xdd,0xde,0xda,0x01,0xc0,0x00,0x00,0x02,0x00,0x71,0xff,0xe3,0x04,0x5a,0x06,0x14,
-0x00,0x11,0x00,0x19,0x00,0x00,0x01,0x11,0x05,0x35,0x21,0x11,0x23,0x35,0x0e,0x01,
-0x23,0x22,0x02,0x10,0x00,0x33,0x32,0x16,0x00,0x10,0x16,0x20,0x36,0x10,0x26,0x20,
-0x03,0xa2,0xfd,0x6b,0x03,0x4d,0xb8,0x3a,0xb1,0x7b,0xcc,0xff,0x00,0xff,0xcc,0x7b,
-0xb1,0xfd,0xc8,0xa7,0x01,0x24,0xa7,0xa7,0xfe,0xdc,0x03,0xb6,0x01,0xb9,0x01,0xa6,
-0xf9,0xec,0xa8,0x64,0x61,0x01,0x44,0x02,0x10,0x01,0x44,0x61,0xfe,0xe0,0xfe,0x6a,
-0xe7,0xe7,0x01,0x96,0xe7,0x00,0x00,0x02,0x00,0x71,0xfe,0x56,0x04,0x75,0x04,0x63,
-0x00,0x1c,0x00,0x2d,0x00,0x00,0x17,0x16,0x33,0x32,0x35,0x34,0x25,0x26,0x27,0x26,
-0x11,0x10,0x37,0x36,0x33,0x32,0x17,0x16,0x11,0x14,0x07,0x06,0x07,0x16,0x15,0x10,
-0x21,0x22,0x27,0x01,0x36,0x37,0x36,0x35,0x34,0x27,0x26,0x23,0x22,0x06,0x15,0x14,
-0x17,0x16,0x17,0x16,0xfa,0x66,0xef,0xfd,0xfe,0xf8,0xd0,0x75,0x8e,0x89,0x89,0xf0,
-0xef,0x8a,0x89,0x89,0x35,0x4b,0x9c,0xfe,0x47,0xdd,0x78,0x01,0xe8,0x44,0x37,0x56,
-0x55,0x56,0x95,0x93,0xac,0x5b,0x61,0x7e,0x40,0xcb,0x46,0x75,0x5c,0x30,0x25,0x70,
-0x87,0x01,0x15,0x01,0x09,0x9c,0x9d,0x9d,0x9c,0xfe,0xed,0xcc,0xa5,0x40,0x24,0x4f,
-0x8d,0xfe,0xf0,0x46,0x01,0xd8,0x1d,0x49,0x71,0xcc,0xcb,0x72,0x73,0xe8,0xbe,0xc7,
-0x60,0x67,0x0b,0x06,0x00,0x01,0x00,0xc9,0x00,0x00,0x04,0x8b,0x05,0xd5,0x00,0x0b,
-0x00,0x00,0x01,0x11,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x11,0x21,0x35,0x04,0x8b,
-0xfc,0x3e,0x02,0xf8,0xfd,0x39,0x02,0xc7,0xfd,0x1a,0x05,0xd5,0xfa,0x2b,0xaa,0x02,
-0x1d,0xaa,0x01,0xba,0xaa,0x00,0x00,0x02,0x00,0x73,0xff,0xe3,0x05,0xd9,0x05,0xf0,
-0x00,0x14,0x00,0x1c,0x00,0x00,0x01,0x21,0x12,0x17,0x16,0x21,0x20,0x00,0x11,0x10,
-0x00,0x21,0x22,0x04,0x07,0x15,0x3e,0x01,0x33,0x20,0x00,0x03,0x06,0x07,0x06,0x20,
-0x27,0x26,0x27,0x05,0x04,0xfb,0x6f,0x01,0xbc,0xb5,0x01,0x42,0x01,0x3a,0x01,0x78,
-0xfe,0x75,0xfe,0xa2,0x92,0xfe,0xf9,0x6f,0x70,0xfc,0x8b,0x01,0x12,0x01,0x13,0x08,
-0x17,0x61,0x81,0xfe,0x48,0x81,0x62,0x18,0x03,0x0c,0xfe,0x84,0xdb,0xd2,0x01,0xa5,
-0x01,0x61,0x01,0x6e,0x01,0x99,0x48,0x46,0xd7,0x5f,0x60,0xfe,0xce,0xfe,0x4e,0xbf,
-0x7c,0xa4,0xa4,0x7c,0xbf,0x00,0x00,0x01,0x00,0x9c,0xff,0xe3,0x04,0x73,0x05,0xf0,
-0x00,0x28,0x00,0x40,0x40,0x24,0x0a,0x86,0x09,0x88,0x0d,0x95,0x06,0x91,0x29,0x00,
-0x16,0x95,0x13,0xad,0x29,0x1f,0x86,0x20,0x88,0x1c,0x95,0x23,0x8c,0x29,0x2a,0x14,
-0x09,0x1f,0x10,0x19,0x03,0x19,0x19,0x26,0x10,0x29,0x10,0xfc,0xec,0xd4,0xec,0xd4,
-0xc4,0xc4,0xcc,0x31,0x00,0x10,0xf4,0xec,0xf4,0xec,0x10,0xf4,0xec,0x39,0x10,0xf4,
-0xec,0xf4,0xec,0x30,0x01,0x2e,0x01,0x35,0x34,0x24,0x33,0x32,0x16,0x17,0x15,0x2e,
-0x01,0x23,0x22,0x06,0x15,0x14,0x16,0x3b,0x01,0x15,0x23,0x22,0x06,0x15,0x14,0x16,
-0x33,0x32,0x36,0x37,0x15,0x0e,0x01,0x23,0x20,0x24,0x35,0x34,0x36,0x01,0xd0,0x83,
-0x8e,0x01,0x0c,0xe6,0x59,0xc9,0x73,0x72,0xbe,0x53,0x98,0xa3,0x9e,0x95,0xb6,0xae,
-0xa5,0xb9,0xc7,0xbe,0x6d,0xc8,0x54,0x6a,0xc7,0x5e,0xfe,0xe8,0xfe,0xd0,0xa3,0x03,
-0x25,0x21,0xab,0x7c,0xb2,0xd1,0x20,0x20,0xb4,0x26,0x24,0x7b,0x73,0x70,0x77,0xa6,
-0x95,0x84,0x8f,0x96,0x32,0x31,0xc3,0x25,0x25,0xf2,0xdd,0x90,0xc4,0x00,0x00,0x01,
-0xff,0x96,0xfe,0x66,0x04,0x23,0x05,0xd5,0x00,0x11,0x00,0x00,0x13,0x21,0x15,0x21,
-0x11,0x21,0x15,0x21,0x11,0x10,0x06,0x2b,0x01,0x35,0x33,0x32,0x36,0x35,0xc9,0x03,
-0x5a,0xfd,0x70,0x02,0x50,0xfd,0xb0,0xcd,0xe3,0x4d,0x3f,0x86,0x6e,0x05,0xd5,0xaa,
-0xfe,0x48,0xaa,0xfd,0x9f,0xfe,0xf2,0xf4,0xaa,0x96,0xc2,0x00,0x00,0x01,0xff,0x7f,
-0xfe,0x56,0x02,0xf8,0x06,0x14,0x00,0x1b,0x00,0x00,0x01,0x15,0x23,0x22,0x06,0x1d,
-0x01,0x21,0x15,0x21,0x11,0x14,0x06,0x2b,0x01,0x35,0x33,0x32,0x36,0x35,0x11,0x23,
-0x35,0x33,0x35,0x34,0x36,0x33,0x02,0xf8,0xb0,0x63,0x4d,0x01,0x2f,0xfe,0xd1,0xae,
-0xbd,0xae,0xb0,0x63,0x4d,0xb0,0xb0,0xae,0xbd,0x06,0x14,0x99,0x50,0x68,0x63,0x8f,
-0xfb,0xeb,0xbb,0xab,0x99,0x50,0x68,0x04,0x2a,0x8f,0x4e,0xbb,0xab,0x00,0x00,0x01,
-0x00,0x73,0xff,0xe3,0x06,0x97,0x07,0x64,0x00,0x28,0x00,0x00,0x25,0x11,0x21,0x35,
-0x21,0x11,0x06,0x04,0x23,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x16,0x17,0x36,
-0x37,0x36,0x3b,0x01,0x15,0x23,0x22,0x06,0x1d,0x01,0x2e,0x01,0x23,0x20,0x00,0x11,
-0x10,0x00,0x21,0x32,0x36,0x04,0xc3,0xfe,0xb6,0x02,0x12,0x75,0xfe,0xe6,0xa0,0xfe,
-0xa2,0xfe,0x75,0x01,0x8b,0x01,0x5e,0x92,0x84,0x16,0x15,0x10,0x53,0x67,0xe3,0x4d,
-0x3f,0x86,0x6e,0x70,0xfc,0x8b,0xfe,0xee,0xfe,0xed,0x01,0x13,0x01,0x12,0x6b,0xa8,
-0xd5,0x01,0x91,0xa6,0xfd,0x7f,0x53,0x55,0x01,0x99,0x01,0x6d,0x01,0x6e,0x01,0x99,
-0x24,0x06,0x07,0xc7,0x64,0x7a,0xaa,0x96,0xc2,0xd7,0x5f,0x60,0xfe,0xce,0xfe,0xd1,
-0xfe,0xd2,0xfe,0xce,0x25,0x00,0x00,0x02,0x00,0x81,0xfe,0x52,0x05,0x1b,0x05,0x49,
-0x00,0x0d,0x00,0x15,0x00,0x00,0x01,0x00,0x03,0x06,0x21,0x20,0x27,0x02,0x09,0x01,
-0x33,0x09,0x01,0x33,0x01,0x02,0x13,0x16,0x33,0x32,0x27,0x02,0x03,0x40,0x01,0x47,
-0x03,0x03,0xfe,0x63,0xfe,0x68,0x20,0x31,0x01,0x57,0xfe,0x2f,0xd9,0x01,0x73,0x01,
-0x75,0xd9,0xfd,0xa3,0xce,0x07,0x03,0xd5,0xcd,0x01,0x03,0x02,0x8a,0xfe,0x3f,0xfe,
-0x75,0xec,0xec,0x01,0x6e,0x01,0xe5,0x02,0xb8,0xfd,0xd5,0x02,0x2b,0xfc,0xa6,0xfe,
-0xd3,0xfe,0xbc,0x8a,0x8a,0x01,0x4a,0x00,0x00,0x01,0x00,0xba,0x00,0x00,0x07,0x47,
-0x06,0x14,0x00,0x43,0x00,0x00,0x01,0x34,0x26,0x23,0x22,0x06,0x07,0x11,0x23,0x11,
-0x33,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x17,0x16,0x3b,0x01,0x32,0x3f,
-0x01,0x35,0x33,0x3f,0x02,0x35,0x33,0x37,0x35,0x33,0x35,0x37,0x33,0x35,0x3f,0x02,
-0x36,0x35,0x34,0x27,0x26,0x27,0x21,0x16,0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,
-0x07,0x06,0x23,0x07,0x06,0x27,0x26,0x35,0x04,0x64,0xc6,0xc1,0x75,0xb3,0x42,0xb9,
-0xb9,0xac,0x95,0x7c,0x7c,0x51,0x52,0xb5,0x46,0xe1,0x8e,0x01,0x01,0x01,0x01,0x01,
-0x01,0x01,0x01,0x01,0x01,0x01,0x23,0x1e,0x42,0x36,0x38,0x72,0xfe,0xbe,0x2e,0x4c,
-0x4d,0x37,0x0f,0x18,0x42,0x58,0x58,0x90,0x33,0x67,0x28,0x26,0x02,0xa4,0xe8,0xef,
-0x64,0x65,0x02,0x62,0xf9,0xec,0x02,0x79,0xa4,0xbe,0x9e,0x9c,0xfe,0xf5,0xd6,0x60,
-0x60,0x92,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2a,0x2f,
-0x77,0xa1,0x88,0x6e,0x71,0x64,0x0c,0x2c,0x2d,0x48,0x15,0x24,0x64,0x92,0x9e,0x62,
-0x61,0x01,0x02,0x32,0x31,0x99,0x00,0x01,0x00,0xc9,0x00,0x00,0x02,0xc6,0x05,0xd5,
-0x00,0x0b,0x00,0x00,0x13,0x11,0x33,0x11,0x14,0x16,0x3b,0x01,0x15,0x23,0x22,0x26,
-0xc9,0xca,0x6e,0x86,0x3f,0x4d,0xe3,0xcd,0x02,0x02,0x03,0xd3,0xfc,0x2d,0xc2,0x96,
-0xaa,0xf4,0x00,0x01,0x00,0x0a,0x00,0x00,0x02,0x52,0x05,0xd5,0x00,0x0b,0x00,0x00,
-0x13,0x33,0x11,0x33,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0xc9,0xca,0xbf,0xbf,
-0xca,0xbf,0xbf,0x05,0xd5,0xfd,0x77,0x90,0xfd,0x44,0x02,0xbc,0x90,0x00,0x00,0x01,
-0x00,0xc9,0x00,0x00,0x05,0xdd,0x05,0xde,0x00,0x12,0x00,0x00,0x01,0x36,0x1f,0x01,
-0x37,0x27,0x26,0x07,0x06,0x07,0x01,0x11,0x23,0x11,0x33,0x11,0x01,0x21,0x01,0x04,
-0x50,0x3e,0x3a,0xac,0x69,0xed,0x60,0x4c,0x35,0x47,0xfd,0xcb,0xca,0xca,0x02,0xcd,
-0x01,0x0a,0xfc,0xe6,0x04,0xfe,0x3b,0x21,0x8d,0x74,0xb0,0x48,0x27,0x1b,0x43,0xfd,
-0xec,0x02,0x77,0xfa,0x2b,0x02,0xcf,0xfd,0x31,0x03,0x1d,0x00,0x00,0x01,0x00,0xb9,
-0x00,0x00,0x04,0x9c,0x06,0x14,0x00,0x13,0x00,0x00,0x13,0x26,0x37,0x36,0x3b,0x01,
-0x15,0x23,0x22,0x06,0x15,0x03,0x01,0x33,0x09,0x01,0x23,0x01,0x11,0x23,0xba,0x01,
-0x59,0x56,0xbe,0xae,0xb0,0x64,0x4c,0x01,0x02,0x25,0xeb,0xfd,0xae,0x02,0x6b,0xf0,
-0xfd,0xc7,0xb9,0x04,0xae,0xba,0x56,0x56,0x99,0x50,0x68,0xfd,0xba,0x01,0xe3,0xfd,
-0xf4,0xfd,0xac,0x02,0x23,0xfd,0xdd,0x00,0x00,0x01,0x00,0x0a,0x00,0x00,0x02,0x2a,
-0x06,0x14,0x00,0x0b,0x00,0x00,0x13,0x33,0x11,0x33,0x15,0x23,0x11,0x23,0x11,0x23,
-0x35,0x33,0xc1,0xb8,0xb1,0xb1,0xb8,0xb7,0xb7,0x06,0x14,0xfd,0x38,0x90,0xfd,0x44,
-0x02,0xbc,0x90,0x00,0x00,0x01,0x00,0x3d,0x00,0x00,0x04,0x7f,0x06,0x14,0x00,0x0f,
-0x00,0x00,0x33,0x01,0x27,0x05,0x27,0x25,0x27,0x33,0x17,0x25,0x17,0x05,0x01,0x23,
-0x09,0x01,0x3d,0x01,0xeb,0x47,0xfe,0xd4,0x21,0x01,0x29,0x4b,0xc8,0x34,0x01,0x3a,
-0x21,0xfe,0xc9,0x01,0xed,0xc3,0xfe,0xc6,0xfe,0x7e,0x04,0x32,0xbc,0x65,0x63,0x63,
-0xc5,0x8a,0x68,0x61,0x68,0xfa,0xd7,0x03,0x3c,0xfc,0xc4,0x00,0x00,0x01,0x00,0xb2,
-0xff,0xe3,0x07,0x27,0x05,0xd5,0x00,0x23,0x00,0x00,0x25,0x0e,0x01,0x23,0x22,0x26,
-0x35,0x11,0x33,0x11,0x14,0x17,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x16,
-0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x23,0x35,0x0e,0x01,0x23,0x22,0x26,0x03,0xa6,
-0x45,0xc0,0x82,0xaf,0xbe,0xcb,0x27,0x39,0x75,0x8f,0xa6,0xcb,0x72,0x77,0x7b,0xa6,
-0xcb,0xcb,0x3f,0xb0,0x79,0x7a,0xab,0xd5,0x7c,0x76,0xf5,0xe2,0x04,0x1b,0xfb,0xef,
-0xba,0x35,0x4e,0xbe,0xa4,0x03,0xec,0xfb,0xef,0xa2,0x9b,0xbf,0xa3,0x03,0xec,0xfa,
-0x29,0xae,0x67,0x62,0x7c,0x00,0x00,0x01,0xff,0x96,0xfe,0x66,0x05,0x33,0x05,0xd5,
-0x00,0x12,0x00,0x00,0x13,0x21,0x01,0x11,0x33,0x11,0x21,0x01,0x11,0x10,0x07,0x06,
-0x2b,0x01,0x35,0x33,0x32,0x36,0x35,0xc9,0x01,0x10,0x02,0x96,0xc4,0xfe,0xf0,0xfd,
-0x6a,0x61,0x69,0xe0,0x4d,0x3f,0x86,0x6e,0x05,0xd5,0xfb,0x1f,0x04,0xe1,0xfa,0x2b,
-0x04,0xe1,0xfb,0x87,0xfe,0xee,0x74,0x7c,0xaa,0x96,0xc2,0x00,0xff,0xff,0x00,0xba,
-0xfe,0x56,0x04,0x64,0x04,0x7b,0x10,0x06,0x03,0x30,0x00,0x00,0x00,0x03,0x00,0x73,
-0xff,0xe3,0x05,0xd9,0x05,0xf0,0x00,0x0a,0x00,0x12,0x00,0x1a,0x00,0x00,0x01,0x20,
-0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x10,0x00,0x04,0x20,0x07,0x06,0x03,0x21,0x02,
-0x27,0x01,0x16,0x17,0x16,0x20,0x37,0x36,0x37,0x03,0x27,0x01,0x3a,0x01,0x78,0xfe,
-0x88,0xfe,0xc6,0xfe,0xc5,0xfe,0x87,0x01,0x79,0x02,0x17,0xfe,0x48,0x81,0x7a,0x07,
-0x03,0xbb,0x08,0x78,0xfc,0xcc,0x18,0x62,0x81,0x01,0xb8,0x81,0x61,0x17,0x05,0xf0,
-0xfe,0x5b,0xfe,0x9e,0xfe,0x9f,0xfe,0x5b,0x01,0xa4,0x02,0xc4,0x01,0xa5,0xa4,0xa4,
-0x9a,0xfe,0xfe,0x01,0x02,0x9a,0xfd,0xbe,0xbf,0x7c,0xa4,0xa4,0x7c,0xbf,0xff,0xff,
-0x00,0x67,0xff,0xe3,0x06,0xdb,0x05,0xf0,0x10,0x27,0x02,0xbe,0x06,0x4c,0x00,0x00,
-0x10,0x06,0x00,0x32,0xf4,0x00,0xff,0xff,0x00,0x76,0xff,0xe3,0x05,0x74,0x04,0x7b,
-0x10,0x27,0x02,0xbe,0x04,0xe5,0x00,0x00,0x10,0x06,0x00,0x52,0x05,0x00,0x00,0x02,
-0x00,0x73,0xff,0xe3,0x06,0xcf,0x05,0xf0,0x00,0x0a,0x00,0x1e,0x00,0x00,0x01,0x22,
-0x00,0x11,0x10,0x00,0x33,0x32,0x37,0x11,0x26,0x01,0x11,0x34,0x26,0x23,0x11,0x06,
-0x21,0x20,0x00,0x10,0x00,0x21,0x32,0x17,0x21,0x32,0x16,0x19,0x01,0x03,0x27,0xdc,
-0xfe,0xfd,0x01,0x03,0xdc,0xaf,0x80,0x8a,0x02,0x39,0x6e,0x7a,0xbc,0xfe,0xc6,0xfe,
-0xc5,0xfe,0x87,0x01,0x79,0x01,0x3b,0x70,0x61,0x01,0x27,0xe3,0xcd,0x05,0x4c,0xfe,
-0xb8,0xfe,0xe5,0xfe,0xe6,0xfe,0xb8,0xa4,0x03,0x7d,0xa4,0xfa,0xb4,0x03,0xd3,0xc2,
-0x96,0xfb,0x8b,0xd3,0x01,0xa4,0x02,0xc4,0x01,0xa5,0x1b,0xf4,0xfe,0xf2,0xfc,0x2d,
-0x00,0x02,0x00,0x71,0xfe,0x56,0x05,0x59,0x04,0x7b,0x00,0x09,0x00,0x1e,0x00,0x00,
-0x01,0x26,0x07,0x06,0x10,0x16,0x20,0x37,0x11,0x26,0x01,0x11,0x34,0x26,0x23,0x11,
-0x06,0x23,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x17,0x33,0x32,0x16,0x15,0x11,0x02,
-0x73,0x93,0x57,0x56,0xab,0x01,0x2a,0x2c,0x2c,0x01,0x99,0x4c,0x69,0x89,0xf0,0xf1,
-0xfe,0xef,0x01,0x11,0xf1,0x64,0x52,0xd8,0xb5,0xa3,0x03,0xdf,0x02,0x75,0x74,0xfe,
-0x6e,0xe7,0x59,0x02,0xa8,0x5f,0xfa,0x77,0x04,0x74,0x99,0x61,0xfc,0xbc,0x9d,0x01,
-0x39,0x01,0x13,0x01,0x14,0x01,0x38,0x1b,0xc0,0xd6,0xfb,0x8c,0x00,0x02,0xff,0x97,
-0x00,0x00,0x04,0xf1,0x05,0xd5,0x00,0x08,0x00,0x1d,0x00,0x00,0x01,0x11,0x33,0x32,
-0x36,0x35,0x34,0x26,0x23,0x35,0x32,0x04,0x15,0x14,0x04,0x2b,0x01,0x11,0x23,0x11,
-0x22,0x07,0x06,0x1d,0x01,0x23,0x35,0x34,0x36,0x33,0x01,0xf7,0xfe,0x8d,0x9a,0x9a,
-0x8d,0xfb,0x01,0x01,0xfe,0xff,0xfb,0xfe,0xca,0x80,0x49,0x31,0x9c,0xc0,0xd6,0x05,
-0x2f,0xfd,0xcf,0x92,0x87,0x86,0x92,0xa6,0xe3,0xdb,0xdd,0xe2,0xfd,0xa8,0x05,0x2f,
-0x38,0x26,0x69,0x31,0x46,0xb5,0xa3,0x00,0x00,0x02,0x00,0xb9,0xfe,0x56,0x04,0xa4,
-0x06,0x14,0x00,0x07,0x00,0x21,0x00,0x00,0x00,0x10,0x26,0x20,0x06,0x10,0x16,0x20,
-0x01,0x30,0x11,0x3e,0x01,0x33,0x32,0x00,0x10,0x02,0x23,0x22,0x26,0x27,0x11,0x23,
-0x11,0x34,0x37,0x36,0x3b,0x01,0x15,0x23,0x22,0x06,0x03,0xe5,0xa7,0xfe,0xdc,0xa7,
-0xa7,0x01,0x24,0xfe,0x35,0x3a,0xb1,0x7b,0xcc,0x00,0xff,0xff,0xcc,0x7b,0xb1,0x3a,
-0xb9,0x57,0x57,0xbd,0xae,0xb0,0x63,0x4d,0x01,0x64,0x01,0x96,0xe7,0xe7,0xfe,0x6a,
-0xe7,0x04,0x46,0xfe,0xf3,0x64,0x61,0xfe,0xbc,0xfd,0xf0,0xfe,0xbc,0x61,0x64,0xfd,
-0xae,0x06,0x58,0xbb,0x55,0x56,0x99,0x50,0x00,0x02,0x00,0xc9,0xfe,0x56,0x04,0xa6,
-0x05,0xd5,0x00,0x1d,0x00,0x26,0x00,0x00,0x13,0x33,0x11,0x33,0x32,0x04,0x10,0x07,
-0x06,0x07,0x16,0x17,0x13,0x16,0x17,0x16,0x3b,0x01,0x15,0x23,0x22,0x27,0x26,0x27,
-0x03,0x26,0x2b,0x01,0x11,0x23,0x01,0x33,0x32,0x36,0x10,0x26,0x2b,0x01,0x11,0xc9,
-0xca,0xfe,0xfb,0x01,0x01,0x81,0x65,0xb2,0x0a,0x09,0x90,0x36,0x27,0x2a,0x4c,0x3b,
-0x62,0x7f,0x47,0x4a,0x4e,0x99,0x15,0x2e,0x77,0xca,0x01,0x02,0xc6,0x8d,0x9a,0x99,
-0x8e,0xfe,0x05,0xd5,0xfe,0xf8,0xe1,0xfe,0x48,0x71,0x59,0x13,0x14,0x17,0xfe,0x92,
-0x88,0x22,0x24,0x9a,0x3d,0x3f,0xc6,0x01,0x85,0x35,0xfe,0xae,0x01,0xf8,0x92,0x01,
-0x0c,0x91,0xfd,0xd1,0x00,0x01,0x00,0x45,0xff,0xe3,0x04,0x60,0x05,0xf0,0x00,0x27,
-0x00,0x00,0x13,0x3e,0x01,0x33,0x32,0x04,0x15,0x14,0x06,0x0f,0x01,0x0e,0x01,0x15,
-0x14,0x16,0x33,0x32,0x36,0x37,0x15,0x0e,0x01,0x23,0x20,0x24,0x35,0x34,0x36,0x3f,
-0x01,0x3e,0x01,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x9f,0x72,0xda,0x69,0xf5,0x01,
-0x17,0xca,0xe2,0x7b,0x9a,0x87,0xbc,0xad,0x72,0xec,0x7b,0x80,0xef,0x6a,0xfe,0xe7,
-0xfe,0xdd,0xd7,0xe2,0x7a,0xa6,0x77,0xb3,0xa5,0x5f,0xcc,0x73,0x05,0xa4,0x26,0x26,
-0xe4,0xc6,0xab,0xc0,0x2d,0x18,0x1f,0x7c,0x6e,0x7e,0x88,0x46,0x45,0xd0,0x2f,0x30,
-0xe0,0xd9,0xb6,0xd9,0x2b,0x19,0x1f,0x65,0x63,0x76,0x80,0x36,0x37,0x00,0x00,0x01,
-0x00,0x47,0xff,0xe3,0x03,0x9f,0x04,0x7b,0x00,0x27,0x00,0x00,0x13,0x3e,0x01,0x33,
-0x32,0x16,0x15,0x14,0x06,0x0f,0x01,0x0e,0x01,0x15,0x14,0x16,0x33,0x32,0x36,0x37,
-0x15,0x0e,0x01,0x23,0x22,0x26,0x35,0x34,0x36,0x3f,0x01,0x3e,0x01,0x35,0x34,0x26,
-0x23,0x22,0x06,0x07,0x83,0x4c,0xb4,0x66,0xce,0xe0,0x98,0xab,0x40,0xab,0x65,0x8c,
-0x82,0x61,0xc6,0x66,0x6c,0xc3,0x5a,0xd8,0xf7,0xa5,0xc4,0x3f,0x94,0x62,0x89,0x89,
-0x5a,0xa8,0x4e,0x04,0x3f,0x1e,0x1e,0xac,0x9e,0x82,0x95,0x24,0x0f,0x25,0x50,0x4b,
-0x51,0x59,0x35,0x35,0xbe,0x23,0x23,0xb6,0x9c,0x89,0x99,0x2a,0x0e,0x21,0x49,0x40,
-0x54,0x54,0x28,0x28,0xff,0xff,0x00,0xc9,0x00,0x00,0x04,0x8b,0x05,0xd5,0x10,0x06,
-0x03,0x1c,0x00,0x00,0x00,0x02,0xfe,0xf2,0xfe,0x56,0x02,0xd7,0x06,0x14,0x00,0x08,
-0x00,0x21,0x00,0x00,0x13,0x26,0x27,0x26,0x23,0x22,0x07,0x06,0x33,0x05,0x03,0x14,
-0x17,0x16,0x3b,0x01,0x15,0x23,0x22,0x27,0x26,0x35,0x11,0x23,0x20,0x35,0x34,0x21,
-0x32,0x17,0x16,0x17,0x33,0x15,0xb4,0x07,0x12,0x21,0x6e,0x7c,0x03,0x03,0x77,0x01,
-0x78,0x02,0x27,0x25,0x64,0xb0,0xae,0xc3,0x51,0x57,0xbe,0xfe,0xf2,0x01,0x2f,0xb5,
-0x52,0x35,0x12,0xbf,0x05,0x04,0x2d,0x17,0x30,0x41,0x33,0x9a,0xfb,0x3d,0x67,0x29,
-0x28,0x99,0x56,0x5c,0xb4,0x04,0xae,0xd2,0xd8,0x60,0x40,0x6f,0x9b,0x00,0x00,0x01,
-0x00,0x37,0xfe,0x56,0x02,0xf2,0x05,0x9e,0x00,0x1d,0x00,0x00,0x01,0x11,0x21,0x15,
-0x21,0x11,0x14,0x16,0x3b,0x01,0x15,0x14,0x06,0x2b,0x01,0x35,0x33,0x32,0x36,0x3d,
-0x01,0x23,0x22,0x26,0x35,0x11,0x23,0x35,0x33,0x11,0x01,0x77,0x01,0x7b,0xfe,0x85,
-0x4b,0x73,0xbd,0xa4,0xb4,0x46,0x30,0x6a,0x4c,0x05,0xd5,0xa2,0x87,0x87,0x05,0x9e,
-0xfe,0xc2,0x8f,0xfd,0xa0,0x89,0x4e,0xae,0xd6,0xc0,0x9c,0x61,0x99,0x14,0x9f,0xd2,
-0x02,0x60,0x8f,0x01,0x3e,0x00,0x00,0x01,0x00,0x18,0x00,0x00,0x04,0xe9,0x05,0xd5,
-0x00,0x10,0x00,0x00,0x01,0x33,0x11,0x33,0x11,0x21,0x35,0x21,0x22,0x06,0x1d,0x01,
-0x33,0x35,0x34,0x37,0x36,0x01,0xae,0x5e,0xcb,0x02,0x12,0xfc,0xc5,0xd6,0xc0,0x9c,
-0x30,0x45,0x05,0x2b,0xfa,0xd5,0x05,0x2b,0xaa,0xa3,0xb5,0x46,0x31,0x69,0x26,0x34,
-0x00,0x01,0x00,0x37,0x00,0x00,0x02,0xf2,0x06,0x14,0x00,0x1c,0x00,0x00,0x13,0x34,
-0x36,0x3b,0x01,0x15,0x23,0x22,0x07,0x06,0x1d,0x01,0x21,0x15,0x21,0x11,0x14,0x16,
-0x3b,0x01,0x15,0x23,0x22,0x26,0x35,0x11,0x23,0x35,0x33,0xbe,0xae,0xbd,0xae,0xb0,
-0x63,0x26,0x27,0x01,0x7b,0xfe,0x85,0x4b,0x73,0xbd,0xbd,0xd5,0xa2,0x87,0x87,0x04,
-0xae,0xbb,0xab,0x99,0x28,0x29,0x67,0x63,0x8f,0xfd,0xa0,0x89,0x4e,0x9a,0x9f,0xd2,
-0x02,0x60,0x8f,0x00,0x00,0x01,0xff,0xfa,0xfe,0x66,0x04,0xe9,0x05,0xd5,0x00,0x10,
-0x00,0x00,0x01,0x21,0x35,0x21,0x15,0x21,0x11,0x14,0x17,0x16,0x3b,0x01,0x15,0x23,
-0x22,0x26,0x11,0x02,0x0c,0xfd,0xee,0x04,0xef,0xfd,0xee,0x36,0x37,0x86,0x3f,0x4d,
-0xe3,0xcd,0x05,0x2b,0xaa,0xaa,0xfb,0x3d,0xc3,0x4a,0x4b,0xaa,0xf4,0x01,0x0e,0x00,
-0xff,0xff,0x00,0xad,0xff,0xf7,0x06,0x6a,0x05,0xe9,0x10,0x27,0x02,0xbe,0x05,0xdb,
-0x00,0x00,0x10,0x06,0x00,0x38,0xfb,0x14,0xff,0xff,0x00,0xb0,0xff,0xe3,0x05,0xa1,
-0x04,0x71,0x10,0x27,0x02,0xbe,0x05,0x12,0x00,0x00,0x10,0x06,0x00,0x58,0x02,0x00,
-0x00,0x01,0x00,0x4e,0xff,0xe3,0x05,0xcf,0x05,0xca,0x00,0x1e,0x00,0x00,0x01,0x35,
-0x21,0x15,0x16,0x12,0x15,0x14,0x00,0x20,0x00,0x35,0x34,0x12,0x37,0x35,0x21,0x15,
-0x21,0x06,0x02,0x15,0x10,0x00,0x21,0x20,0x00,0x11,0x34,0x02,0x27,0x05,0xcf,0xfd,
-0xa8,0xb1,0xc6,0xfe,0xf8,0xfe,0x50,0xfe,0xf7,0xc7,0xb2,0xfd,0xa8,0x01,0x3f,0x9e,
-0x91,0x01,0x7f,0x01,0x31,0x01,0x2f,0x01,0x81,0x8e,0xa1,0x05,0x18,0xb2,0xb2,0x61,
-0xfe,0xb4,0xca,0xf0,0xfe,0xde,0x01,0x23,0xef,0xca,0x01,0x4c,0x61,0xb2,0xb2,0x8b,
-0xfe,0xd6,0xb8,0xfe,0xc2,0xfe,0x76,0x01,0x89,0x01,0x35,0xc2,0x01,0x28,0x8d,0x00,
-0x00,0x01,0x00,0xc9,0xff,0xfe,0x05,0x76,0x05,0xd5,0x00,0x1a,0x00,0x00,0x25,0x23,
-0x22,0x26,0x35,0x11,0x23,0x11,0x10,0x17,0x16,0x1f,0x01,0x20,0x00,0x11,0x34,0x02,
-0x2f,0x01,0x15,0x16,0x17,0x16,0x15,0x14,0x00,0x02,0xc6,0x3f,0x86,0x6e,0xca,0x67,
-0x61,0xe8,0x4d,0x01,0x2f,0x01,0x81,0x8e,0xa1,0xb3,0x6e,0x41,0x63,0xfe,0xf8,0xaa,
-0x96,0xc2,0x03,0xd3,0xfc,0x2d,0xfe,0xf2,0x7a,0x74,0x06,0x02,0x01,0x89,0x01,0x35,
-0xc2,0x01,0x28,0x8d,0x01,0x44,0x57,0x6d,0xa6,0xca,0xf0,0xfe,0xde,0x00,0x00,0x01,
-0xff,0xfc,0x00,0x00,0x05,0xdc,0x05,0xed,0x00,0x10,0x00,0x00,0x09,0x01,0x36,0x37,
-0x36,0x17,0x05,0x07,0x27,0x06,0x07,0x01,0x11,0x23,0x11,0x01,0x33,0x02,0x73,0x01,
-0x48,0x34,0x31,0x42,0x6d,0x01,0x0d,0x4e,0xc6,0x55,0x26,0xfe,0x8a,0xcb,0xfd,0xf0,
-0xd9,0x03,0x6f,0x01,0xeb,0x4e,0x28,0x36,0x31,0x7a,0x87,0x65,0x06,0x39,0xfd,0xcd,
-0xfd,0x39,0x02,0xc7,0x03,0x0e,0x00,0x01,0x00,0x3d,0xfe,0x56,0x05,0x96,0x04,0x70,
-0x00,0x17,0x00,0x00,0x05,0x0e,0x01,0x2b,0x01,0x35,0x33,0x32,0x36,0x3f,0x01,0x01,
-0x33,0x09,0x01,0x36,0x37,0x36,0x1f,0x01,0x07,0x27,0x26,0x07,0x02,0x93,0x4e,0x94,
-0x7c,0x93,0x6c,0x4c,0x54,0x33,0x21,0xfe,0x3b,0xc3,0x01,0x5e,0x01,0x17,0x32,0x51,
-0x61,0x65,0xd7,0x35,0xc3,0x51,0x1c,0x68,0xc8,0x7a,0x9a,0x48,0x86,0x54,0x04,0x4e,
-0xfc,0x94,0x02,0xbb,0x7e,0x29,0x32,0x30,0x65,0x93,0x5e,0x27,0x45,0x00,0x00,0x01,
-0x00,0x5c,0x00,0x00,0x05,0x1f,0x05,0xd5,0x00,0x11,0x00,0x00,0x13,0x21,0x15,0x01,
-0x21,0x15,0x21,0x01,0x21,0x15,0x21,0x35,0x01,0x21,0x35,0x21,0x01,0x21,0x73,0x04,
-0x95,0xfe,0x70,0x01,0x19,0xfe,0x73,0xfe,0x54,0x03,0xc7,0xfb,0x3d,0x01,0xb9,0xfe,
-0xd5,0x01,0x9f,0x01,0x83,0xfc,0x67,0x05,0xd5,0x9a,0xfe,0x11,0x90,0xfd,0xee,0xaa,
-0x9a,0x02,0x22,0x90,0x01,0xdf,0x00,0x01,0x00,0x58,0x00,0x00,0x03,0xdb,0x04,0x60,
-0x00,0x11,0x00,0x00,0x13,0x21,0x15,0x03,0x33,0x15,0x21,0x01,0x21,0x15,0x21,0x35,
-0x01,0x23,0x35,0x21,0x01,0x21,0x71,0x03,0x6a,0xfb,0xc2,0xfe,0xc2,0xfe,0xc3,0x02,
-0xb4,0xfc,0x7d,0x01,0x2b,0xd4,0x01,0x50,0x01,0x0d,0xfd,0x65,0x04,0x60,0xa8,0xfe,
-0xdc,0x90,0xfe,0x8f,0x93,0xa8,0x01,0x5c,0x90,0x01,0x39,0x00,0x00,0x01,0x00,0xa0,
-0xff,0xc1,0x04,0xf8,0x05,0xd5,0x00,0x25,0x00,0x00,0x25,0x32,0x37,0x36,0x35,0x34,
-0x27,0x26,0x2b,0x01,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x32,0x17,0x16,0x17,0x16,
-0x15,0x14,0x0f,0x01,0x06,0x07,0x06,0x21,0x22,0x27,0x26,0x27,0x35,0x16,0x17,0x16,
-0x02,0xa8,0xc0,0x63,0x64,0x5c,0x5d,0xa5,0xae,0x01,0x81,0xfc,0xfc,0x04,0x00,0xfe,
-0x65,0x6a,0x80,0x62,0x56,0x51,0x3b,0x1c,0x14,0x2d,0x98,0xfe,0xe8,0x77,0x7d,0x7e,
-0x86,0x6a,0x7f,0x7e,0x6b,0x4b,0x4b,0x8f,0x86,0x49,0x4a,0xa6,0x01,0xdc,0xaa,0xa8,
-0xfe,0x24,0x38,0x2a,0x6d,0x68,0x8a,0x97,0x55,0x29,0x1d,0x24,0x79,0x13,0x12,0x25,
-0xc3,0x31,0x19,0x19,0x00,0x01,0x00,0x5c,0xff,0xc1,0x04,0xb4,0x05,0xd5,0x00,0x25,
-0x00,0x00,0x25,0x32,0x37,0x36,0x37,0x15,0x06,0x07,0x06,0x23,0x20,0x27,0x26,0x2f,
-0x01,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x33,0x01,0x35,0x21,0x15,0x21,0x01,0x15,
-0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x02,0xac,0x89,0x7e,0x7f,0x6a,0x86,0x7e,
-0x7d,0x77,0xfe,0xe8,0x98,0x2d,0x14,0x1c,0x3b,0x51,0x56,0x62,0x80,0x6a,0xfe,0x65,
-0x04,0x00,0xfc,0xfc,0x01,0x81,0xae,0xa5,0x5d,0x5c,0x64,0x63,0x6b,0x19,0x19,0x31,
-0xc3,0x25,0x12,0x13,0x79,0x24,0x1d,0x29,0x55,0x97,0x8a,0x68,0x6d,0x2a,0x38,0x01,
-0xdc,0xa8,0xaa,0xfe,0x24,0xa6,0x4a,0x49,0x86,0x8f,0x4b,0x4b,0x00,0x01,0x00,0x68,
-0xfe,0x4c,0x04,0x3f,0x04,0x60,0x00,0x24,0x00,0x00,0x01,0x22,0x07,0x06,0x07,0x06,
-0x15,0x14,0x1f,0x01,0x16,0x17,0x16,0x21,0x32,0x37,0x36,0x37,0x35,0x0e,0x01,0x23,
-0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x3b,0x01,0x35,0x01,0x21,0x35,0x21,0x15,0x02,
-0x5b,0x6a,0x80,0x62,0x56,0x51,0x3b,0x1c,0x1c,0x25,0x98,0x01,0x18,0x5e,0x63,0x64,
-0x6a,0x54,0xc8,0x6d,0xbe,0x63,0x64,0x5c,0x5d,0xa5,0xae,0xfe,0x52,0x02,0x9b,0xfc,
-0x96,0x01,0xdc,0x38,0x2a,0x6d,0x68,0x8a,0x8a,0x62,0x29,0x24,0x1d,0x79,0x12,0x13,
-0x25,0xc3,0x31,0x32,0x4b,0x4b,0x8f,0x84,0x4b,0x4a,0xa6,0x01,0xf3,0x93,0xa8,0x00,
-0x00,0x01,0x00,0x71,0xfe,0x56,0x03,0xe8,0x04,0x60,0x00,0x1f,0x00,0x00,0x01,0x32,
-0x37,0x36,0x37,0x15,0x06,0x07,0x06,0x23,0x20,0x11,0x34,0x25,0x24,0x35,0x34,0x23,
-0x21,0x01,0x21,0x35,0x21,0x15,0x01,0x20,0x15,0x10,0x05,0x06,0x15,0x14,0x02,0x7f,
-0x54,0x4d,0x4f,0x51,0x57,0x50,0x56,0x61,0xfe,0x20,0x01,0x96,0x01,0x1c,0xeb,0xfe,
-0xde,0x01,0xe5,0xfd,0x65,0x03,0x6a,0xfe,0x9e,0x01,0x6f,0xfe,0x30,0xe2,0xfe,0xee,
-0x15,0x15,0x2c,0xb3,0x20,0x0d,0x0e,0x01,0x19,0xee,0x35,0x25,0x62,0x7c,0x02,0x38,
-0x93,0xa8,0xfe,0x64,0xe5,0xfe,0xec,0x31,0x18,0x61,0x8b,0x00,0x00,0x01,0x00,0x96,
-0x00,0x00,0x04,0x4a,0x05,0xf0,0x00,0x22,0x00,0x00,0x25,0x21,0x15,0x21,0x35,0x01,
-0x37,0x21,0x35,0x21,0x36,0x37,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x35,0x3e,
-0x01,0x33,0x32,0x04,0x15,0x14,0x07,0x06,0x07,0x33,0x15,0x23,0x07,0x01,0x89,0x02,
-0xc1,0xfc,0x4c,0x01,0x3a,0x73,0xfe,0xa7,0x01,0xe2,0x5f,0x25,0x27,0xa7,0x86,0x5f,
-0xd3,0x78,0x7a,0xd4,0x58,0xe8,0x01,0x14,0x22,0x1f,0x4a,0x68,0xec,0x30,0xaa,0xaa,
-0xaa,0x01,0x40,0x75,0x90,0x6d,0x48,0x4c,0x49,0x77,0x96,0x42,0x43,0xcc,0x31,0x32,
-0xe8,0xc2,0x5c,0x52,0x49,0x60,0x90,0x31,0x00,0x01,0x00,0x5d,0xff,0xc1,0x04,0xf9,
-0x05,0xd5,0x00,0x28,0x00,0x00,0x01,0x32,0x17,0x16,0x17,0x16,0x15,0x14,0x0f,0x01,
-0x06,0x07,0x06,0x21,0x20,0x27,0x26,0x2f,0x01,0x26,0x35,0x33,0x14,0x17,0x16,0x20,
-0x37,0x36,0x35,0x34,0x27,0x26,0x23,0x21,0x15,0x23,0x11,0x21,0x15,0x21,0x11,0x03,
-0x06,0x68,0x82,0x63,0x55,0x51,0x3b,0x1c,0x14,0x2d,0x98,0xfe,0xe8,0xfe,0xdc,0x98,
-0x2d,0x14,0x1c,0x3b,0xc9,0x64,0x63,0x01,0x7c,0x63,0x64,0x5c,0x5d,0xa5,0xfe,0xc1,
-0xca,0x03,0xa1,0xfd,0x29,0x03,0x51,0x38,0x2b,0x6c,0x68,0x8a,0x97,0x55,0x29,0x1d,
-0x24,0x79,0x79,0x24,0x1d,0x29,0x55,0x97,0x8f,0x4b,0x4b,0x4b,0x4b,0x8f,0x86,0x49,
-0x4a,0x01,0x03,0x2d,0xaa,0xfe,0x25,0x00,0x00,0x01,0x00,0x68,0xfe,0x4c,0x04,0x3f,
-0x04,0x60,0x00,0x25,0x00,0x00,0x01,0x32,0x17,0x16,0x17,0x16,0x15,0x14,0x0f,0x01,
-0x06,0x07,0x06,0x21,0x22,0x27,0x26,0x27,0x35,0x1e,0x01,0x33,0x32,0x37,0x36,0x35,
-0x34,0x27,0x26,0x23,0x21,0x35,0x33,0x13,0x21,0x15,0x21,0x03,0x02,0x4c,0x69,0x81,
-0x63,0x55,0x51,0x3b,0x1c,0x14,0x2d,0x98,0xfe,0xe8,0x5e,0x63,0x64,0x6a,0x54,0xc8,
-0x6d,0xbe,0x63,0x64,0x5c,0x5d,0xa5,0xfe,0x9e,0x01,0x03,0x03,0x16,0xfd,0xa2,0x03,
-0x01,0xdc,0x38,0x2b,0x6c,0x68,0x8a,0x97,0x55,0x29,0x1d,0x24,0x79,0x12,0x13,0x25,
-0xc3,0x31,0x32,0x4b,0x4b,0x8f,0x86,0x49,0x4a,0xa8,0x02,0x84,0xaa,0xfe,0x26,0x00,
-0x00,0x01,0x00,0x58,0xff,0xe3,0x03,0xa5,0x05,0x9e,0x00,0x24,0x00,0x00,0x01,0x07,
-0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x21,0x22,0x27,0x26,0x27,0x35,0x16,0x17,0x16,
-0x33,0x32,0x37,0x36,0x37,0x34,0x27,0x26,0x2b,0x01,0x13,0x23,0x35,0x33,0x11,0x33,
-0x11,0x33,0x15,0x02,0x21,0x02,0xaa,0x70,0x6c,0x6e,0x89,0xfe,0xed,0x55,0x51,0x51,
-0x4c,0x49,0x54,0x4e,0x50,0xb3,0x63,0x39,0x01,0x3a,0x56,0xc0,0x3e,0x02,0xe5,0xe5,
-0xca,0xe7,0x03,0xe6,0x7d,0x1e,0x77,0x73,0xaa,0xba,0x7d,0x9d,0x12,0x11,0x23,0xac,
-0x28,0x18,0x16,0x72,0x41,0x85,0x62,0x4c,0x72,0x01,0x0f,0xa4,0x01,0x14,0xfe,0xec,
-0xa4,0x00,0x00,0x02,0x00,0xba,0xfe,0x56,0x04,0xa4,0x04,0x7b,0x00,0x0e,0x00,0x17,
-0x00,0x00,0x05,0x11,0x23,0x11,0x33,0x15,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x15,
-0x10,0x01,0x00,0x35,0x34,0x27,0x26,0x23,0x22,0x07,0x01,0x73,0xb9,0xb9,0x34,0x87,
-0x51,0xd2,0xb8,0x4d,0x4e,0xfc,0xcf,0x02,0x72,0x39,0x38,0x78,0xdc,0xad,0x7a,0xfe,
-0xd0,0x06,0x0a,0xaa,0x42,0x52,0x31,0x70,0x71,0x99,0xfe,0x57,0xfe,0xe4,0x01,0x90,
-0xf9,0x85,0x42,0x41,0xef,0x00,0x00,0x01,0x00,0xc9,0xfe,0x56,0x01,0x93,0x05,0xd5,
-0x00,0x03,0x00,0x00,0x13,0x33,0x11,0x23,0xc9,0xca,0xca,0x05,0xd5,0xf8,0x81,0x00,
-0xff,0xff,0x00,0xc9,0xfe,0x56,0x03,0x27,0x05,0xd5,0x10,0x27,0x01,0x82,0x01,0x94,
-0x00,0x00,0x10,0x06,0x01,0x82,0x00,0x00,0x00,0x01,0x00,0x14,0xfe,0x56,0x03,0x9c,
-0x05,0xd5,0x00,0x13,0x00,0x00,0x01,0x33,0x11,0x21,0x15,0x21,0x15,0x21,0x15,0x21,
-0x11,0x23,0x11,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x01,0x73,0xca,0x01,0x5f,0xfe,
-0xa1,0x01,0x5f,0xfe,0xa1,0xca,0xfe,0xa1,0x01,0x5f,0xfe,0xa1,0x01,0x5f,0x05,0xd5,
-0xfd,0x97,0xa8,0xf0,0xaa,0xfd,0x2c,0x02,0xd4,0xaa,0xf0,0xa8,0xff,0xff,0x00,0xc9,
-0x00,0x00,0x01,0x94,0x05,0xd5,0x10,0x06,0x00,0x04,0x94,0x00,0xff,0xff,0x00,0xc9,
-0x00,0x00,0x0a,0xd0,0x07,0x6d,0x10,0x27,0x01,0x3f,0x05,0xb1,0x00,0x00,0x10,0x06,
-0x00,0x27,0x00,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,0x09,0xb0,0x06,0x66,0x10,0x27,
-0x01,0x40,0x05,0xd5,0x00,0x00,0x10,0x06,0x00,0x27,0x00,0x00,0xff,0xff,0x00,0x71,
-0xff,0xe3,0x08,0x91,0x06,0x66,0x10,0x27,0x01,0x40,0x04,0xb6,0x00,0x00,0x10,0x06,
-0x00,0x47,0x00,0x00,0xff,0xff,0x00,0xc9,0xfe,0x66,0x06,0x24,0x05,0xd5,0x10,0x27,
-0x00,0x2d,0x04,0x91,0x00,0x00,0x10,0x06,0x00,0x2f,0x00,0x00,0xff,0xff,0x00,0xc9,
-0xfe,0x56,0x05,0xde,0x06,0x14,0x10,0x27,0x00,0x4d,0x04,0x65,0x00,0x00,0x10,0x06,
-0x00,0x2f,0x00,0x00,0xff,0xff,0x00,0xc1,0xfe,0x56,0x02,0xef,0x06,0x14,0x10,0x27,
-0x00,0x4d,0x01,0x76,0x00,0x00,0x10,0x06,0x00,0x4f,0x00,0x00,0xff,0xff,0x00,0xc9,
-0xfe,0x66,0x06,0xf2,0x05,0xd5,0x10,0x27,0x00,0x2d,0x05,0x5f,0x00,0x00,0x10,0x06,
-0x00,0x31,0x00,0x00,0xff,0xff,0x00,0xc9,0xfe,0x56,0x06,0xb7,0x06,0x14,0x10,0x27,
-0x00,0x4d,0x05,0x3e,0x00,0x00,0x10,0x06,0x00,0x31,0x00,0x00,0xff,0xff,0x00,0xba,
-0xfe,0x56,0x05,0xde,0x06,0x14,0x10,0x27,0x00,0x4d,0x04,0x65,0x00,0x00,0x10,0x06,
-0x00,0x51,0x00,0x00,0xff,0xff,0x00,0x10,0x00,0x00,0x05,0x68,0x07,0x6d,0x12,0x26,
-0x00,0x24,0x00,0x00,0x11,0x07,0x0b,0xee,0x04,0xbe,0x01,0x75,0x00,0x06,0xb1,0x0e,
-0x00,0x10,0x3c,0x31,0xff,0xff,0x00,0x7b,0xff,0xe3,0x04,0x2d,0x06,0x66,0x12,0x26,
-0x00,0x44,0x00,0x00,0x10,0x06,0x02,0x7b,0x5a,0x00,0xff,0xff,0xff,0xfe,0x00,0x00,
-0x02,0x60,0x07,0x6d,0x12,0x26,0x00,0x2c,0x00,0x00,0x11,0x07,0x0b,0xee,0x03,0x2f,
-0x01,0x75,0x00,0x0b,0xb4,0x07,0x20,0x01,0x00,0x00,0x10,0x49,0x63,0x3a,0x31,0x00,
-0xff,0xff,0xff,0xe0,0x00,0x00,0x02,0x5e,0x06,0x66,0x12,0x26,0x00,0xf3,0x00,0x00,
-0x11,0x07,0x02,0x7b,0xff,0x1f,0x00,0x00,0x00,0x0b,0xb4,0x07,0x20,0x01,0x00,0x00,
-0x10,0x49,0x63,0x3a,0x31,0x00,0xff,0xff,0x00,0x73,0xff,0xe3,0x05,0xd9,0x07,0x6d,
-0x12,0x26,0x00,0x32,0x00,0x00,0x10,0x07,0x0b,0xee,0x05,0x27,0x01,0x75,0xff,0xff,
-0x00,0x71,0xff,0xe3,0x04,0x75,0x06,0x66,0x12,0x26,0x00,0x52,0x00,0x00,0x11,0x06,
-0x02,0x7b,0x76,0x00,0x00,0x06,0xb1,0x1b,0x0c,0x10,0x3c,0x31,0xff,0xff,0x00,0xb2,
-0xff,0xe3,0x05,0x29,0x07,0x6d,0x12,0x26,0x00,0x38,0x00,0x00,0x11,0x07,0x0b,0xee,
-0x04,0xf6,0x01,0x75,0x00,0x06,0xb1,0x15,0x05,0x10,0x3c,0x31,0xff,0xff,0x00,0xae,
-0xff,0xe3,0x04,0x58,0x06,0x66,0x12,0x26,0x00,0x58,0x00,0x00,0x11,0x06,0x02,0x7b,
-0x76,0x00,0x00,0x0b,0xb4,0x17,0x20,0x0b,0x01,0x01,0x10,0x49,0x63,0x3a,0x31,0x00,
-0xff,0xff,0x00,0xb2,0xff,0xe3,0x05,0x29,0x08,0x34,0x12,0x22,0x00,0x38,0x00,0x00,
-0x10,0x02,0x0a,0xf5,0x32,0x00,0xff,0xff,0x00,0xae,0xff,0xe3,0x04,0x58,0x07,0x31,
-0x10,0x27,0x00,0x71,0x00,0x7b,0x01,0x3b,0x12,0x06,0x00,0xbe,0x00,0x00,0xff,0xff,
-0x00,0xb2,0xff,0xe3,0x05,0x29,0x08,0xe7,0x10,0x27,0x0b,0xea,0x04,0xee,0x02,0xf1,
-0x10,0x06,0x00,0x9e,0x00,0x00,0xff,0xff,0x00,0xae,0xff,0xe3,0x04,0x58,0x07,0xff,
-0x10,0x27,0x02,0xa4,0x04,0x7d,0x01,0x99,0x10,0x06,0x00,0xbe,0x00,0x00,0xff,0xff,
-0x00,0xb2,0xff,0xe3,0x05,0x29,0x08,0xe9,0x10,0x27,0x0b,0xee,0x04,0xee,0x02,0xf1,
-0x10,0x06,0x00,0x9e,0x00,0x00,0xff,0xff,0x00,0xae,0xff,0xe3,0x04,0x58,0x07,0xff,
-0x10,0x27,0x02,0xaf,0x04,0x7d,0x01,0x99,0x10,0x06,0x00,0xbe,0x00,0x00,0xff,0xff,
-0x00,0xb2,0xff,0xe3,0x05,0x29,0x08,0xe7,0x10,0x27,0x0b,0xec,0x04,0xee,0x02,0xf1,
-0x10,0x06,0x00,0x9e,0x00,0x00,0xff,0xff,0x00,0xae,0xff,0xe3,0x04,0x58,0x07,0xff,
-0x10,0x27,0x02,0xa3,0x04,0x7d,0x01,0x99,0x10,0x06,0x00,0xbe,0x00,0x00,0xff,0xff,
-0x00,0x71,0xff,0xe3,0x04,0x7f,0x04,0x7b,0x10,0x06,0x02,0x0d,0x00,0x00,0xff,0xff,
-0x00,0x10,0x00,0x00,0x05,0x68,0x08,0x34,0x12,0x22,0x00,0x24,0x00,0x00,0x10,0x02,
-0x0a,0xf5,0x00,0x00,0xff,0xff,0x00,0x7b,0xff,0xe3,0x04,0x2d,0x07,0x31,0x10,0x27,
-0x00,0x71,0x00,0x52,0x01,0x3b,0x12,0x06,0x00,0xa6,0x00,0x00,0xff,0xff,0x00,0x10,
-0x00,0x00,0x05,0x68,0x08,0x34,0x12,0x22,0x00,0x24,0x00,0x00,0x10,0x02,0x0a,0xf7,
-0x00,0x00,0xff,0xff,0x00,0x7b,0xff,0xe3,0x04,0x2d,0x06,0xf0,0x12,0x22,0x00,0x44,
-0x00,0x00,0x10,0x03,0x0a,0xf7,0xff,0x92,0xfe,0xbc,0xff,0xff,0x00,0x08,0x00,0x00,
-0x07,0x48,0x07,0x34,0x10,0x27,0x00,0x71,0x02,0xd7,0x01,0x3e,0x12,0x06,0x00,0x88,
-0x00,0x00,0xff,0xff,0x00,0x7b,0xff,0xe3,0x07,0x6f,0x05,0xf2,0x10,0x27,0x00,0x71,
-0x01,0xe8,0xff,0xfc,0x12,0x06,0x00,0xa8,0x00,0x00,0x00,0x01,0x00,0x73,0xff,0xe3,
-0x06,0x04,0x05,0xf0,0x00,0x25,0x00,0x00,0x01,0x15,0x06,0x04,0x23,0x20,0x00,0x11,
-0x10,0x00,0x21,0x32,0x04,0x17,0x15,0x2e,0x01,0x23,0x20,0x00,0x11,0x10,0x00,0x21,
-0x32,0x36,0x37,0x35,0x23,0x35,0x33,0x35,0x21,0x35,0x21,0x11,0x33,0x15,0x05,0x8b,
-0x75,0xfe,0xe6,0xa0,0xfe,0xa2,0xfe,0x75,0x01,0x8b,0x01,0x5e,0x92,0x01,0x07,0x6f,
-0x70,0xfc,0x8b,0xfe,0xee,0xfe,0xed,0x01,0x13,0x01,0x12,0x6b,0xa8,0x43,0xfd,0xfd,
-0xfe,0xb6,0x02,0x12,0x79,0x01,0x8a,0xff,0x53,0x55,0x01,0x99,0x01,0x6d,0x01,0x6e,
-0x01,0x99,0x48,0x46,0xd7,0x5f,0x60,0xfe,0xce,0xfe,0xd1,0xfe,0xd2,0xfe,0xce,0x25,
-0x27,0xb5,0x58,0x84,0xa6,0xfe,0xd6,0x58,0x00,0x02,0x00,0x71,0xfe,0x56,0x04,0xfa,
-0x04,0x7b,0x00,0x0b,0x00,0x34,0x00,0x00,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,
-0x16,0x33,0x32,0x36,0x03,0x36,0x3d,0x01,0x0e,0x01,0x23,0x22,0x02,0x11,0x10,0x12,
-0x33,0x32,0x16,0x17,0x35,0x33,0x11,0x14,0x07,0x33,0x15,0x23,0x06,0x07,0x06,0x21,
-0x22,0x26,0x27,0x35,0x1e,0x01,0x33,0x32,0x37,0x36,0x37,0x05,0x35,0x03,0xa2,0xa5,
-0x95,0x94,0xa5,0xa5,0x94,0x95,0xa5,0x16,0x16,0x39,0xb2,0x7c,0xce,0xfc,0xfc,0xce,
-0x7c,0xb2,0x39,0xb8,0x13,0xb3,0xc6,0x1f,0x3a,0x7f,0xfe,0xfa,0x61,0xac,0x51,0x51,
-0x9e,0x52,0xb5,0x5a,0x15,0x11,0xfd,0x84,0x02,0x3d,0xc8,0xdc,0xdc,0xc8,0xc7,0xdc,
-0xdc,0xfe,0x4f,0x47,0x5e,0x5b,0x63,0x62,0x01,0x3a,0x01,0x03,0x01,0x04,0x01,0x3a,
-0x62,0x63,0xaa,0xfc,0x2b,0x6e,0x58,0x46,0x5d,0x40,0x8c,0x1d,0x1e,0xb3,0x2c,0x2a,
-0x5f,0x17,0x1c,0x01,0x46,0x00,0xff,0xff,0x00,0x73,0xff,0xe3,0x05,0x8b,0x07,0x6d,
-0x12,0x22,0x00,0x2a,0x00,0x00,0x10,0x07,0x0b,0xee,0x05,0x4a,0x01,0x75,0xff,0xff,
-0x00,0x71,0xfe,0x56,0x04,0x5a,0x06,0x63,0x10,0x22,0x02,0x7b,0x4a,0xfd,0x12,0x02,
-0x00,0x4a,0x00,0x00,0xff,0xff,0x00,0x07,0x00,0x00,0x05,0x6a,0x07,0x6d,0x12,0x22,
-0x00,0x2e,0x00,0x00,0x10,0x07,0x0b,0xee,0x03,0x38,0x01,0x75,0xff,0xff,0xff,0xe9,
-0x00,0x00,0x04,0x9c,0x07,0x6d,0x12,0x22,0x00,0x4e,0x00,0x00,0x10,0x07,0x0b,0xee,
-0x03,0x1a,0x01,0x75,0xff,0xff,0x00,0x73,0xfe,0x65,0x05,0xd9,0x05,0xf0,0x10,0x27,
-0x02,0x8f,0x01,0x34,0xff,0xf0,0x12,0x06,0x00,0x32,0x00,0x00,0xff,0xff,0x00,0x71,
-0xfe,0x65,0x04,0x75,0x04,0x7b,0x10,0x27,0x02,0x8f,0x00,0x80,0xff,0xf0,0x12,0x06,
-0x00,0x52,0x00,0x00,0xff,0xff,0x00,0x73,0xfe,0x65,0x05,0xd9,0x07,0x31,0x10,0x27,
-0x00,0x71,0x01,0x27,0x01,0x3b,0x12,0x06,0x01,0xac,0x00,0x00,0xff,0xff,0x00,0x71,
-0xfe,0x65,0x04,0x75,0x05,0xf5,0x10,0x26,0x00,0x71,0x73,0xff,0x12,0x06,0x01,0xad,
-0x00,0x00,0xff,0xff,0x00,0xa0,0xff,0xc1,0x04,0xf8,0x07,0x6d,0x10,0x27,0x0b,0xee,
-0x04,0xbe,0x01,0x75,0x12,0x02,0x01,0x79,0x00,0x00,0xff,0xff,0x00,0x58,0xfe,0x4c,
-0x04,0x2f,0x06,0x66,0x10,0x26,0x02,0x7b,0x1b,0x00,0x10,0x06,0x02,0x46,0x00,0x00,
-0x00,0x02,0xff,0xdb,0xfe,0x56,0x02,0x64,0x06,0x66,0x00,0x0b,0x00,0x12,0x00,0x00,
-0x13,0x33,0x11,0x14,0x06,0x2b,0x01,0x35,0x33,0x32,0x36,0x35,0x13,0x03,0x33,0x17,
-0x37,0x33,0x03,0xc1,0xb8,0xa3,0xb5,0x46,0x31,0x69,0x4c,0x1a,0xf5,0x8b,0xb4,0xb4,
-0x8b,0xf5,0x04,0x60,0xfb,0x8c,0xd6,0xc0,0x9c,0x61,0x99,0x05,0x02,0x01,0x78,0xf5,
-0xf5,0xfe,0x88,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,0x0a,0xd0,0x05,0xd5,0x10,0x27,
-0x00,0x3d,0x05,0xb1,0x00,0x00,0x10,0x06,0x00,0x27,0x00,0x00,0xff,0xff,0x00,0xc9,
-0x00,0x00,0x09,0xb0,0x05,0xd5,0x10,0x27,0x00,0x5d,0x05,0xd5,0x00,0x00,0x10,0x06,
-0x00,0x27,0x00,0x00,0xff,0xff,0x00,0x71,0xff,0xe3,0x08,0x91,0x06,0x14,0x10,0x27,
-0x00,0x5d,0x04,0xb6,0x00,0x00,0x10,0x06,0x00,0x47,0x00,0x00,0xff,0xff,0x00,0x73,
-0xff,0xe3,0x05,0x8b,0x07,0x6b,0x12,0x22,0x00,0x2a,0x00,0x00,0x10,0x43,0x00,0x76,
-0x01,0x16,0x02,0xf0,0x40,0x00,0x2c,0xcc,0xff,0xff,0x00,0x71,0xfe,0x56,0x04,0x5a,
-0x06,0x63,0x12,0x22,0x00,0x4a,0x00,0x00,0x10,0x02,0x00,0x76,0x1b,0xfd,0x00,0x01,
-0x00,0xc9,0xff,0xe3,0x08,0x2d,0x05,0xd5,0x00,0x1d,0x00,0x00,0x01,0x11,0x14,0x07,
-0x06,0x21,0x20,0x27,0x26,0x35,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,
-0x11,0x14,0x17,0x16,0x17,0x32,0x37,0x36,0x35,0x11,0x08,0x2d,0x64,0x60,0xfe,0xe6,
-0xfe,0xed,0x67,0x64,0xfd,0x22,0xca,0xca,0x02,0xde,0xca,0x3e,0x3d,0x99,0x94,0x42,
-0x3e,0x04,0x60,0xfd,0x5a,0xdf,0x80,0x78,0x78,0x76,0xe9,0x01,0x0d,0xfd,0x39,0x05,
-0xd5,0xfd,0x9c,0x02,0x64,0xfb,0xec,0x9f,0x50,0x4e,0x01,0x4f,0x4b,0xa4,0x02,0x9f,
-0x00,0x02,0x00,0xc9,0xfe,0x56,0x05,0x02,0x05,0xf0,0x00,0x0e,0x00,0x17,0x00,0x00,
-0x25,0x11,0x23,0x11,0x33,0x15,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x10,0x01,
-0x00,0x11,0x34,0x27,0x26,0x23,0x22,0x03,0x01,0x93,0xca,0xca,0x38,0x91,0x57,0xe2,
-0xc6,0x53,0x54,0xfc,0x91,0x02,0xa1,0x3d,0x3c,0x81,0xed,0xba,0x9c,0xfd,0xba,0x07,
-0x7f,0xb9,0x48,0x57,0x35,0x78,0x7a,0xa4,0xfe,0x37,0xfe,0xce,0x01,0xae,0x01,0x0c,
-0x8f,0x47,0x46,0xfe,0xff,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,0x05,0x33,0x07,0x69,
-0x12,0x22,0x00,0x31,0x00,0x00,0x10,0x43,0x00,0x43,0x01,0x6e,0x02,0xee,0x40,0x00,
-0x2c,0xcc,0xff,0xff,0x00,0xba,0x00,0x00,0x04,0x64,0x06,0x64,0x12,0x22,0x00,0x51,
-0x00,0x00,0x10,0x03,0x00,0x43,0x01,0x18,0xff,0xfe,0xff,0xff,0x00,0x10,0x00,0x00,
-0x05,0x68,0x07,0xff,0x10,0x27,0x0b,0xea,0x06,0x5c,0x02,0x09,0x10,0x02,0x00,0x87,
-0x00,0x00,0xff,0xff,0x00,0x7b,0xff,0xe3,0x05,0x2a,0x08,0x35,0x10,0x22,0x00,0xa7,
-0x00,0x00,0x10,0x03,0x00,0x76,0x01,0xd8,0x01,0xcf,0xff,0xff,0x00,0x08,0x00,0x00,
-0x07,0x48,0x07,0x6c,0x10,0x27,0x0b,0xea,0x06,0x5c,0x01,0x76,0x12,0x02,0x00,0x88,
-0x00,0x00,0xff,0xff,0x00,0x7b,0xff,0xe3,0x07,0x6f,0x06,0x63,0x12,0x22,0x00,0xa8,
-0x00,0x00,0x10,0x03,0x00,0x76,0x01,0x65,0xff,0xfd,0xff,0xff,0x00,0x66,0xff,0xba,
-0x05,0xe5,0x07,0x6c,0x10,0x27,0x0b,0xea,0x04,0xfe,0x01,0x76,0x12,0x02,0x00,0x9a,
-0x00,0x00,0xff,0xff,0x00,0x48,0xff,0xa2,0x04,0x9c,0x06,0x63,0x12,0x22,0x00,0xba,
-0x00,0x00,0x10,0x02,0x00,0x76,0x1c,0xfd,0xff,0xff,0x00,0x10,0x00,0x00,0x05,0x68,
-0x07,0x70,0x12,0x22,0x00,0x24,0x00,0x00,0x10,0x07,0x0b,0xf3,0x04,0xe5,0x01,0x7a,
-0xff,0xff,0x00,0x7b,0xff,0xe3,0x04,0x2d,0x06,0x64,0x10,0x23,0x02,0xb2,0x04,0x98,
-0xff,0xfe,0x12,0x02,0x00,0x44,0x00,0x00,0xff,0xff,0x00,0x10,0x00,0x00,0x05,0x68,
-0x07,0x36,0x12,0x22,0x00,0x24,0x00,0x00,0x10,0x07,0x0b,0xef,0x04,0xbc,0x01,0x3e,
-0xff,0xff,0x00,0x7b,0xff,0xe3,0x04,0x2d,0x06,0x48,0x10,0x23,0x02,0xb4,0x04,0x65,
-0x00,0x00,0x12,0x06,0x00,0x44,0x00,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,0x04,0x8b,
-0x07,0x70,0x12,0x22,0x00,0x28,0x00,0x00,0x10,0x07,0x0b,0xf3,0x04,0xa5,0x01,0x7a,
-0xff,0xff,0x00,0x71,0xff,0xe3,0x04,0x7f,0x06,0x63,0x10,0x23,0x02,0xb2,0x04,0xba,
-0xff,0xfd,0x12,0x02,0x00,0x48,0x00,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,0x04,0x8b,
-0x07,0x36,0x12,0x22,0x00,0x28,0x00,0x00,0x10,0x07,0x0b,0xef,0x04,0xa6,0x01,0x3e,
-0xff,0xff,0x00,0x71,0xff,0xe3,0x04,0x7f,0x06,0x48,0x10,0x23,0x02,0xb4,0x04,0xa9,
-0x00,0x00,0x12,0x02,0x00,0x48,0x00,0x00,0xff,0xff,0xff,0xa7,0x00,0x00,0x02,0x73,
-0x07,0x70,0x12,0x22,0x00,0x2c,0x00,0x00,0x10,0x07,0x0b,0xf3,0x03,0x59,0x01,0x7a,
-0xff,0xff,0xff,0xc3,0x00,0x00,0x02,0x81,0x06,0x63,0x10,0x23,0x02,0xb2,0x03,0x66,
-0xff,0xfd,0x12,0x02,0x00,0xf3,0x00,0x00,0xff,0xff,0x00,0x05,0x00,0x00,0x02,0x77,
-0x07,0x36,0x12,0x22,0x00,0x2c,0x00,0x00,0x10,0x07,0x0b,0xef,0x03,0x3e,0x01,0x3e,
-0xff,0xff,0xff,0xe3,0x00,0x00,0x02,0x56,0x06,0x48,0x10,0x23,0x02,0xb4,0x03,0x24,
-0x00,0x00,0x12,0x02,0x00,0xf3,0x00,0x00,0xff,0xff,0x00,0x73,0xff,0xe3,0x05,0xd9,
-0x07,0x70,0x12,0x22,0x00,0x32,0x00,0x00,0x10,0x07,0x0b,0xf3,0x05,0x41,0x01,0x7a,
-0xff,0xff,0x00,0x71,0xff,0xe3,0x04,0x75,0x06,0x64,0x10,0x23,0x02,0xb2,0x04,0x9f,
-0xff,0xfe,0x12,0x02,0x00,0x52,0x00,0x00,0xff,0xff,0x00,0x73,0xff,0xe3,0x05,0xd9,
-0x07,0x36,0x12,0x22,0x00,0x32,0x00,0x00,0x10,0x07,0x0b,0xef,0x05,0x1c,0x01,0x3e,
-0xff,0xff,0x00,0x71,0xff,0xe3,0x04,0x75,0x06,0x48,0x10,0x23,0x02,0xb4,0x04,0x98,
-0x00,0x00,0x12,0x02,0x00,0x52,0x00,0x00,0xff,0xff,0x00,0xc7,0x00,0x00,0x05,0x54,
-0x07,0x70,0x12,0x22,0x00,0x35,0x00,0x00,0x10,0x07,0x0b,0xf3,0x04,0x79,0x01,0x7a,
-0xff,0xff,0x00,0x82,0x00,0x00,0x03,0x4a,0x06,0x63,0x10,0x23,0x02,0xb2,0x04,0x25,
-0xff,0xfd,0x12,0x02,0x00,0x55,0x00,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,0x05,0x54,
-0x07,0x36,0x12,0x22,0x00,0x35,0x00,0x00,0x10,0x07,0x0b,0xef,0x04,0x80,0x01,0x3e,
-0xff,0xff,0x00,0xba,0x00,0x00,0x03,0x5e,0x06,0x48,0x10,0x23,0x02,0xb4,0x04,0x2d,
-0x00,0x00,0x12,0x02,0x00,0x55,0x00,0x00,0xff,0xff,0x00,0xb2,0xff,0xe3,0x05,0x29,
-0x07,0x70,0x12,0x22,0x00,0x38,0x00,0x00,0x10,0x07,0x0b,0xf3,0x05,0x15,0x01,0x7a,
-0xff,0xff,0x00,0xae,0xff,0xe3,0x04,0x58,0x06,0x64,0x10,0x23,0x02,0xb2,0x04,0xd4,
-0xff,0xfe,0x12,0x02,0x00,0x58,0x00,0x00,0xff,0xff,0x00,0xb2,0xff,0xe3,0x05,0x29,
-0x07,0x36,0x12,0x22,0x00,0x38,0x00,0x00,0x10,0x07,0x0b,0xef,0x04,0xec,0x01,0x3e,
-0xff,0xff,0x00,0xae,0xff,0xe3,0x04,0x58,0x06,0x48,0x10,0x23,0x02,0xb4,0x04,0xab,
-0x00,0x00,0x12,0x02,0x00,0x58,0x00,0x00,0xff,0xff,0x00,0x87,0xfe,0x14,0x04,0xa2,
-0x05,0xf0,0x10,0x27,0x02,0xc9,0x04,0x76,0x00,0x00,0x12,0x06,0x00,0x36,0x00,0x00,
-0xff,0xff,0x00,0x6f,0xfe,0x14,0x03,0xc7,0x04,0x7b,0x10,0x27,0x02,0xc9,0x04,0x2c,
-0x00,0x00,0x12,0x06,0x00,0x56,0x00,0x00,0xff,0xff,0xff,0xfa,0xfe,0x14,0x04,0xe9,
-0x05,0xd5,0x10,0x27,0x02,0xc9,0x04,0x53,0x00,0x00,0x12,0x06,0x00,0x37,0x00,0x00,
-0xff,0xff,0x00,0x37,0xfe,0x14,0x02,0xf2,0x05,0x9e,0x10,0x27,0x02,0xc9,0x04,0x00,
-0x00,0x00,0x12,0x06,0x00,0x57,0x00,0x00,0x00,0x01,0x00,0x9c,0xfe,0x52,0x04,0x73,
-0x05,0xf0,0x00,0x31,0x00,0x00,0x13,0x36,0x37,0x36,0x37,0x36,0x35,0x34,0x26,0x23,
-0x22,0x0f,0x01,0x35,0x37,0x36,0x37,0x36,0x35,0x34,0x27,0x26,0x07,0x22,0x07,0x06,
-0x07,0x35,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x16,0x17,
-0x16,0x15,0x14,0x07,0x06,0x05,0x06,0x07,0x9c,0xc7,0xc2,0xa5,0x7e,0x62,0x92,0x5b,
-0x3f,0x46,0xf0,0xf8,0x8e,0x6a,0x4f,0x51,0x5f,0x63,0x69,0x71,0x59,0x78,0x77,0x60,
-0x81,0x65,0xc0,0x84,0x86,0x47,0x52,0x78,0x8a,0x51,0x59,0x96,0x82,0xfe,0xd0,0xda,
-0xb5,0xfe,0xf2,0x40,0x58,0x4b,0x79,0x5e,0x8e,0x71,0x86,0x1f,0x6a,0xab,0x6a,0x3d,
-0x76,0x58,0x90,0x7b,0x35,0x3f,0x01,0x3a,0x2e,0x50,0xbe,0x42,0x2a,0x38,0x68,0x69,
-0xb2,0xaa,0x63,0x71,0x4d,0x13,0x6d,0x77,0x71,0xda,0x8e,0x7b,0x81,0x5c,0x28,0x00,
-0x00,0x01,0x00,0x47,0xfe,0x4f,0x03,0xbc,0x04,0x7b,0x00,0x32,0x00,0x00,0x13,0x36,
-0x37,0x36,0x37,0x36,0x35,0x34,0x27,0x26,0x23,0x22,0x0f,0x01,0x35,0x37,0x36,0x37,
-0x36,0x35,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x07,0x35,0x36,0x37,0x36,0x33,0x32,
-0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x05,0x06,
-0x07,0x47,0xb2,0xb0,0x94,0x72,0x58,0x42,0x41,0x52,0x39,0x3f,0xd8,0xdf,0x7c,0x63,
-0x47,0x49,0x4e,0x60,0x5c,0x68,0x4f,0x6d,0x60,0x62,0x73,0x5b,0xab,0x79,0x78,0x40,
-0x49,0x6c,0x7c,0x49,0x50,0x87,0x78,0xfe,0xf1,0xc4,0xa3,0xfe,0xd1,0x33,0x48,0x3c,
-0x63,0x4c,0x73,0x5b,0x37,0x36,0x19,0x56,0x8b,0x55,0x2f,0x63,0x47,0x74,0x60,0x2f,
-0x32,0x2f,0x23,0x43,0x9a,0x30,0x27,0x2e,0x55,0x55,0x90,0x89,0x51,0x5b,0x3f,0x0f,
-0x58,0x61,0x5b,0xb1,0x73,0x66,0x66,0x4a,0x21,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,
-0x05,0x3b,0x07,0x6d,0x10,0x27,0x0b,0xee,0x05,0x04,0x01,0x75,0x12,0x02,0x00,0x2b,
-0x00,0x00,0xff,0xff,0xff,0xf0,0x00,0x00,0x04,0x64,0x07,0x6d,0x10,0x27,0x0b,0xee,
-0x03,0x21,0x01,0x75,0x12,0x02,0x00,0x4b,0x00,0x00,0x00,0x01,0x00,0xc9,0xfe,0x56,
-0x05,0x19,0x05,0xf0,0x00,0x17,0x00,0x00,0x01,0x11,0x23,0x11,0x34,0x27,0x26,0x23,
-0x22,0x07,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x36,0x37,0x36,0x33,0x32,0x17,0x16,
-0x05,0x19,0xc9,0x4e,0x4c,0x99,0xb3,0x6d,0x6a,0xca,0xca,0x4e,0x69,0x69,0x9a,0xe3,
-0x74,0x75,0x03,0x7d,0xfa,0xd9,0x05,0x29,0xd4,0x6d,0x6b,0x81,0x7e,0xde,0xfc,0xb2,
-0x05,0xd5,0xf1,0x87,0x42,0x43,0x9f,0x9f,0x00,0x03,0x00,0x71,0xff,0x70,0x06,0x44,
-0x06,0x14,0x00,0x07,0x00,0x28,0x00,0x34,0x00,0x00,0x25,0x16,0x33,0x32,0x35,0x34,
-0x27,0x22,0x07,0x36,0x33,0x32,0x15,0x10,0x21,0x22,0x27,0x06,0x07,0x23,0x36,0x37,
-0x26,0x35,0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x10,0x37,0x36,0x33,0x32,0x17,0x16,
-0x17,0x11,0x33,0x00,0x10,0x17,0x16,0x20,0x37,0x36,0x10,0x27,0x26,0x20,0x07,0x04,
-0xb6,0x11,0x25,0xa0,0x34,0x34,0xca,0x6e,0x88,0xf4,0xfe,0xaa,0x49,0x35,0x22,0x18,
-0xc4,0x1d,0x43,0x30,0x3a,0x58,0x59,0x7c,0xcb,0x80,0x7f,0x7f,0x80,0xcb,0x7c,0x59,
-0x58,0x3a,0xb8,0xfc,0xd5,0x53,0x54,0x01,0x24,0x54,0x54,0x54,0x54,0xfe,0xdc,0x54,
-0x82,0x05,0xaf,0x2d,0x01,0x20,0xb8,0xce,0xfe,0xbf,0x0f,0x48,0x3a,0x45,0x93,0x3c,
-0x24,0x64,0x30,0x31,0xa2,0xa2,0x02,0x10,0xa2,0xa2,0x31,0x30,0x64,0x02,0x5e,0xfc,
-0xe6,0xfe,0x6a,0x74,0x73,0x73,0x74,0x01,0x96,0x74,0x73,0x73,0x00,0x02,0x00,0x71,
-0xff,0xe3,0x05,0x25,0x05,0xf0,0x00,0x0c,0x00,0x3b,0x00,0x00,0x01,0x22,0x07,0x06,
-0x10,0x17,0x16,0x20,0x37,0x36,0x35,0x34,0x26,0x03,0x0e,0x01,0x15,0x14,0x17,0x16,
-0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x27,0x35,0x32,0x17,0x16,0x15,0x14,0x06,
-0x07,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x20,0x27,0x26,0x35,0x34,0x37,0x36,0x37,
-0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x21,0x02,0xcb,0xb8,0x6a,0x6b,0x6b,0x6a,0x01,
-0x70,0x6b,0x6b,0xd4,0xf4,0x82,0xaa,0x5f,0x3b,0xcc,0xa8,0x5f,0x60,0x4c,0x6d,0x82,
-0xe4,0x96,0x8b,0xaa,0x98,0xac,0x5f,0x60,0x9c,0x9b,0xfd,0xba,0x9b,0x9c,0x60,0x61,
-0xab,0xab,0x43,0x55,0x82,0x74,0x01,0x01,0x02,0xc5,0x4d,0x4d,0xfe,0xf2,0x4d,0x4d,
-0x4d,0x4e,0x86,0x87,0x9a,0x02,0x27,0x03,0x7c,0x4f,0x45,0x48,0x2d,0x41,0x41,0x88,
-0x9e,0x2b,0x4d,0x08,0x64,0x68,0x61,0xba,0x80,0xb2,0x20,0x22,0x63,0x63,0x8f,0xd9,
-0x74,0x74,0x74,0x74,0xd9,0x8f,0x63,0x63,0x22,0x1f,0x46,0x59,0x58,0x82,0x53,0x4a,
-0x00,0x02,0x00,0x71,0xff,0xe3,0x04,0x71,0x05,0x2f,0x00,0x0d,0x00,0x34,0x00,0x00,
-0x01,0x22,0x07,0x06,0x10,0x17,0x16,0x20,0x37,0x36,0x35,0x34,0x27,0x26,0x13,0x16,
-0x15,0x14,0x07,0x06,0x07,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x20,0x27,0x26,0x35,
-0x34,0x36,0x37,0x26,0x27,0x26,0x35,0x34,0x37,0x17,0x06,0x14,0x17,0x16,0x33,0x32,
-0x37,0x36,0x35,0x34,0x27,0x02,0x71,0x90,0x53,0x52,0x52,0x53,0x01,0x20,0x53,0x53,
-0x53,0x52,0xfe,0x3a,0x34,0x49,0x81,0x92,0x52,0x51,0x85,0x84,0xfe,0x12,0x84,0x85,
-0xa4,0x92,0x8e,0x3d,0x34,0x3f,0xa1,0x2b,0x49,0x48,0x83,0x82,0x49,0x4a,0x2c,0x02,
-0xc5,0x4d,0x4d,0xfe,0xf2,0x4d,0x4d,0x4d,0x4e,0x86,0x87,0x4d,0x4d,0x02,0x6a,0x52,
-0x70,0x99,0x40,0x59,0x20,0x22,0x63,0x63,0x8f,0xd9,0x74,0x74,0x74,0x74,0xd9,0x8f,
-0xc6,0x22,0x23,0x56,0x4b,0x8e,0x6a,0x58,0x20,0x41,0xe8,0x41,0x41,0x41,0x41,0x74,
-0x77,0x3e,0x00,0x01,0x00,0x5c,0xfe,0x56,0x05,0x1f,0x05,0xd5,0x00,0x15,0x00,0x00,
-0x05,0x10,0x07,0x06,0x2b,0x01,0x35,0x33,0x32,0x37,0x36,0x3d,0x01,0x21,0x35,0x01,
-0x21,0x35,0x21,0x15,0x01,0x21,0x05,0x1f,0x9e,0x48,0x72,0xfe,0xe9,0x69,0x26,0x26,
-0xfb,0xf5,0x03,0xb0,0xfc,0x67,0x04,0x95,0xfc,0x50,0x03,0xc7,0x14,0xfe,0xdf,0x50,
-0x25,0x9c,0x30,0x31,0x99,0x14,0x9a,0x04,0x91,0xaa,0x9a,0xfb,0x6f,0x00,0x00,0x01,
-0x00,0x58,0xfe,0x56,0x03,0xdb,0x04,0x60,0x00,0x15,0x00,0x00,0x05,0x10,0x07,0x06,
-0x2b,0x01,0x35,0x33,0x32,0x37,0x36,0x3d,0x01,0x21,0x35,0x01,0x21,0x35,0x21,0x15,
-0x01,0x21,0x03,0xdb,0x9e,0x48,0x72,0xfe,0xe9,0x69,0x26,0x26,0xfd,0x35,0x02,0xb4,
-0xfd,0x65,0x03,0x6a,0xfd,0x4c,0x02,0xb4,0x14,0xfe,0xdf,0x50,0x25,0x9c,0x30,0x31,
-0x99,0x14,0xa8,0x03,0x25,0x93,0xa8,0xfc,0xdb,0x00,0xff,0xff,0x00,0x10,0x00,0x00,
-0x05,0x68,0x07,0x50,0x12,0x22,0x00,0x24,0x00,0x00,0x10,0x03,0x02,0x8d,0x00,0xc4,
-0x01,0x40,0xff,0xff,0x00,0x7b,0xff,0xe3,0x04,0x2d,0x06,0x12,0x12,0x22,0x00,0x44,
-0x00,0x00,0x10,0x02,0x02,0x8d,0x5f,0x02,0xff,0xff,0x00,0xc9,0xfe,0x75,0x04,0x8b,
-0x05,0xd5,0x12,0x22,0x00,0x28,0x00,0x00,0x10,0x03,0x00,0x7a,0x00,0xa2,0x00,0x00,
-0xff,0xff,0x00,0x71,0xfe,0x75,0x04,0x7f,0x04,0x7b,0x12,0x22,0x00,0x48,0x00,0x00,
-0x10,0x02,0x00,0x7a,0x7b,0x00,0xff,0xff,0x00,0x73,0xff,0xe3,0x05,0xd9,0x08,0x34,
-0x12,0x22,0x00,0x32,0x00,0x00,0x10,0x02,0x0a,0xf5,0x6a,0x00,0xff,0xff,0x00,0x71,
-0xff,0xe3,0x04,0x75,0x07,0x31,0x10,0x27,0x00,0x71,0x00,0x73,0x01,0x3b,0x12,0x06,
-0x00,0xb8,0x00,0x00,0xff,0xff,0x00,0x73,0xff,0xe3,0x05,0xd9,0x08,0x34,0x12,0x22,
-0x00,0x32,0x00,0x00,0x10,0x02,0x0a,0xfd,0x6a,0x00,0xff,0xff,0x00,0x71,0xff,0xe3,
-0x04,0x75,0x07,0x31,0x10,0x27,0x00,0x71,0x00,0x72,0x01,0x3b,0x12,0x06,0x00,0xb7,
-0x00,0x00,0xff,0xff,0x00,0x73,0xff,0xe3,0x05,0xd9,0x07,0x4f,0x10,0x27,0x0b,0xf1,
-0x05,0x27,0x01,0x74,0x12,0x06,0x00,0x32,0x00,0x00,0xff,0xff,0x00,0x71,0xff,0xe3,
-0x04,0x75,0x06,0x10,0x10,0x26,0x02,0x8d,0x73,0x00,0x12,0x06,0x00,0x52,0x00,0x00,
-0xff,0xff,0x00,0x73,0xff,0xe3,0x05,0xd9,0x08,0x34,0x12,0x22,0x00,0x32,0x00,0x00,
-0x10,0x02,0x0a,0xf7,0x6a,0x00,0xff,0xff,0x00,0x71,0xff,0xe3,0x04,0x75,0x07,0x31,
-0x10,0x27,0x00,0x71,0x00,0x73,0x01,0x3b,0x12,0x06,0x01,0xf1,0x00,0x00,0xff,0xff,
-0xff,0xfc,0x00,0x00,0x04,0xe7,0x07,0x31,0x10,0x27,0x00,0x71,0x00,0x72,0x01,0x3b,
-0x12,0x06,0x00,0x3c,0x00,0x00,0xff,0xff,0x00,0x3d,0xfe,0x56,0x04,0x7f,0x05,0xf5,
-0x10,0x26,0x00,0x71,0x5e,0xff,0x12,0x06,0x00,0x5c,0x00,0x00,0x00,0x02,0x00,0x8a,
-0xff,0x70,0x03,0x5c,0x06,0x0e,0x00,0x07,0x00,0x19,0x00,0x00,0x25,0x16,0x33,0x32,
-0x35,0x34,0x27,0x22,0x07,0x36,0x33,0x32,0x15,0x10,0x21,0x22,0x27,0x06,0x07,0x23,
-0x36,0x37,0x26,0x37,0x11,0x33,0x01,0xce,0x11,0x25,0xa0,0x34,0x34,0xca,0x6e,0x88,
-0xf4,0xfe,0xaa,0x49,0x35,0x22,0x18,0xc4,0x1d,0x43,0x31,0x01,0xb8,0x82,0x05,0xaf,
-0x2d,0x01,0x20,0xb8,0xce,0xfe,0xbf,0x0f,0x48,0x3a,0x45,0x93,0x3c,0x5a,0x05,0x30,
-0x00,0x02,0x00,0xba,0xff,0x70,0x06,0x4e,0x04,0x7b,0x00,0x07,0x00,0x2b,0x00,0x00,
-0x25,0x16,0x33,0x32,0x35,0x34,0x27,0x22,0x07,0x36,0x33,0x32,0x15,0x10,0x21,0x22,
-0x27,0x06,0x07,0x23,0x36,0x37,0x26,0x37,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,
-0x23,0x11,0x33,0x15,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x04,0xc0,0x11,0x25,
-0xa0,0x34,0x34,0xca,0x6e,0x88,0xf4,0xfe,0xaa,0x49,0x35,0x22,0x18,0xc4,0x1d,0x43,
-0x31,0x01,0x7c,0x7c,0x95,0xac,0xb9,0xb9,0x42,0x59,0x5a,0x75,0xc1,0x63,0x63,0x82,
-0x05,0xaf,0x2d,0x01,0x20,0xb8,0xce,0xfe,0xbf,0x0f,0x48,0x3a,0x45,0x93,0x3c,0x5a,
-0x01,0xc0,0x9f,0x9e,0xbe,0xa4,0xfd,0x87,0x04,0x60,0xae,0x65,0x32,0x32,0x77,0x78,
-0xe8,0x00,0x00,0x02,0x00,0x37,0xff,0x70,0x03,0x61,0x05,0x9e,0x00,0x07,0x00,0x21,
-0x00,0x00,0x25,0x16,0x33,0x32,0x35,0x34,0x27,0x22,0x07,0x36,0x33,0x32,0x15,0x10,
-0x21,0x22,0x27,0x06,0x07,0x23,0x36,0x37,0x26,0x35,0x11,0x23,0x35,0x33,0x11,0x33,
-0x11,0x21,0x15,0x21,0x01,0xd3,0x11,0x25,0xa0,0x34,0x34,0xca,0x6e,0x88,0xf4,0xfe,
-0xaa,0x49,0x36,0x21,0x18,0xc4,0x1d,0x43,0x31,0x87,0x87,0xb9,0x01,0x7b,0xfe,0x85,
-0x82,0x05,0xaf,0x2d,0x01,0x20,0xb8,0xce,0xfe,0xbf,0x0f,0x48,0x3a,0x45,0x93,0x3c,
-0x5a,0x02,0xf3,0x8f,0x01,0x3e,0xfe,0xc2,0x8f,0x00,0x00,0x01,0xff,0xdb,0xfe,0x56,
-0x01,0x79,0x04,0x60,0x00,0x0b,0x00,0x38,0x40,0x15,0x0b,0x02,0x07,0x00,0x07,0x87,
-0x05,0xbd,0x00,0xbc,0x0c,0x08,0x0c,0x05,0x06,0x4f,0x01,0x08,0x00,0x46,0x0c,0x10,
-0xfc,0xec,0xe4,0x39,0x12,0x39,0x31,0x00,0x10,0xe4,0xf4,0xec,0x11,0x12,0x39,0x39,
-0x30,0x40,0x0b,0x10,0x0d,0x40,0x0d,0x50,0x0d,0x60,0x0d,0x70,0x0d,0x05,0x01,0x5d,
-0x13,0x33,0x11,0x14,0x06,0x2b,0x01,0x35,0x33,0x32,0x36,0x35,0xc1,0xb8,0xa3,0xb5,
-0x46,0x31,0x69,0x4c,0x04,0x60,0xfb,0x8c,0xd6,0xc0,0x9c,0x61,0x99,0x00,0x00,0x03,
-0x00,0x71,0xff,0xe3,0x07,0x8c,0x06,0x14,0x00,0x07,0x00,0x25,0x00,0x2d,0x00,0x00,
-0x00,0x10,0x16,0x20,0x36,0x10,0x26,0x20,0x05,0x3e,0x01,0x33,0x32,0x00,0x10,0x02,
-0x23,0x22,0x26,0x27,0x15,0x2b,0x01,0x35,0x0e,0x01,0x23,0x22,0x02,0x10,0x00,0x33,
-0x32,0x16,0x17,0x11,0x3b,0x01,0x00,0x10,0x26,0x20,0x06,0x10,0x16,0x20,0x01,0x2f,
-0xa7,0x01,0x24,0xa8,0xa8,0xfe,0xdc,0x02,0x85,0x3a,0xb1,0x7b,0xcc,0x00,0xff,0xff,
-0xcc,0x7b,0xb1,0x3a,0x01,0xb8,0x3a,0xb1,0x7c,0xcb,0xff,0x00,0xff,0xcb,0x7c,0xb1,
-0x3a,0xb8,0x01,0x02,0x72,0xa7,0xfe,0xdc,0xa7,0xa7,0x01,0x24,0x02,0xfa,0xfe,0x6a,
-0xe7,0xe7,0x01,0x96,0xe7,0x2b,0x64,0x61,0xfe,0xbc,0xfd,0xf0,0xfe,0xbc,0x61,0x64,
-0xa8,0xa8,0x64,0x61,0x01,0x44,0x02,0x10,0x01,0x44,0x61,0x64,0x02,0x5e,0xfb,0x50,
-0x01,0x96,0xe7,0xe7,0xfe,0x6a,0xe7,0x00,0x00,0x03,0x00,0x71,0xfe,0x56,0x07,0x8c,
-0x04,0x7b,0x00,0x07,0x00,0x25,0x00,0x2d,0x00,0x00,0x00,0x10,0x26,0x20,0x06,0x10,
-0x16,0x20,0x25,0x11,0x2b,0x01,0x11,0x0e,0x01,0x23,0x22,0x02,0x10,0x00,0x33,0x32,
-0x16,0x17,0x35,0x3b,0x01,0x15,0x3e,0x01,0x33,0x32,0x00,0x10,0x02,0x23,0x22,0x26,
-0x00,0x10,0x16,0x20,0x36,0x10,0x26,0x20,0x06,0xcd,0xa7,0xfe,0xdc,0xa7,0xa7,0x01,
-0x24,0xfe,0x35,0x01,0xb8,0x3a,0xb1,0x7c,0xcb,0xff,0x00,0xff,0xcb,0x7c,0xb1,0x3a,
-0xb8,0x01,0x3a,0xb1,0x7b,0xcc,0x00,0xff,0xff,0xcc,0x7b,0xb1,0xfc,0x9a,0xa7,0x01,
-0x24,0xa8,0xa8,0xfe,0xdc,0x01,0x64,0x01,0x96,0xe7,0xe7,0xfe,0x6a,0xe7,0x2b,0xfd,
-0xae,0x02,0x52,0x64,0x61,0x01,0x44,0x02,0x10,0x01,0x44,0x61,0x64,0xaa,0xaa,0x64,
-0x61,0xfe,0xbc,0xfd,0xf0,0xfe,0xbc,0x61,0x02,0xb6,0xfe,0x6a,0xe7,0xe7,0x01,0x96,
-0xe7,0x00,0x00,0x03,0xff,0xfd,0xff,0xba,0x05,0x7c,0x06,0x17,0x00,0x12,0x00,0x16,
-0x00,0x19,0x00,0x00,0x01,0x33,0x13,0x01,0x17,0x09,0x01,0x23,0x03,0x21,0x0f,0x01,
-0x23,0x07,0x27,0x23,0x37,0x27,0x37,0x09,0x01,0x33,0x01,0x03,0x21,0x03,0x02,0x4a,
-0xe5,0x86,0x01,0x61,0x66,0xfe,0x70,0x01,0x7c,0xd2,0x88,0xfd,0xd6,0xcd,0x32,0x46,
-0x3b,0x52,0x02,0x01,0x14,0x2f,0x02,0x90,0xfe,0xee,0x16,0x01,0x6f,0xbd,0x01,0x5d,
-0x6a,0x05,0xd5,0xfe,0xa1,0x01,0xa1,0x59,0xfe,0x27,0xfc,0x1b,0x01,0x7f,0xf1,0x8e,
-0x46,0x46,0x01,0x11,0x38,0x04,0xc4,0xfd,0x19,0x01,0xb1,0xfe,0x4f,0x01,0x1f,0x00,
-0x00,0x02,0x00,0x0b,0xff,0xba,0x05,0x8b,0x06,0x17,0x00,0x1f,0x00,0x28,0x00,0x00,
-0x17,0x27,0x13,0x26,0x11,0x10,0x00,0x21,0x32,0x17,0x16,0x17,0x37,0x17,0x07,0x15,
-0x26,0x27,0x01,0x16,0x17,0x16,0x21,0x32,0x36,0x37,0x15,0x0e,0x01,0x23,0x20,0x27,
-0x13,0x01,0x23,0x26,0x23,0x20,0x00,0x11,0x14,0x72,0x66,0xdc,0x75,0x01,0x86,0x01,
-0x53,0x86,0x76,0x3d,0x3a,0x65,0x66,0x63,0x2e,0x31,0xfc,0xf4,0x09,0x0b,0x88,0x01,
-0x00,0x82,0xe7,0x66,0x6a,0xed,0x84,0xfe,0xb4,0xc2,0x39,0x02,0xd8,0x01,0x74,0x82,
-0xff,0x00,0xfe,0xf0,0x46,0x58,0x01,0x05,0xbb,0x01,0x17,0x01,0x68,0x01,0x9f,0x24,
-0x12,0x1b,0x78,0x59,0x76,0xbb,0x2b,0x21,0xfc,0x66,0x0d,0x0c,0x9d,0x5e,0x5f,0xd3,
-0x48,0x48,0xc7,0x01,0x15,0x03,0x5c,0x2f,0xfe,0xc7,0xfe,0xd8,0xad,0x00,0x00,0x02,
-0x00,0x09,0xff,0xa2,0x04,0x5d,0x04,0xbc,0x00,0x1f,0x00,0x27,0x00,0x00,0x17,0x27,
-0x37,0x26,0x35,0x10,0x00,0x21,0x32,0x17,0x16,0x17,0x37,0x17,0x07,0x15,0x26,0x27,
-0x01,0x16,0x17,0x16,0x33,0x32,0x36,0x37,0x15,0x0e,0x01,0x23,0x22,0x27,0x13,0x01,
-0x26,0x23,0x22,0x06,0x15,0x14,0x69,0x60,0xbd,0x55,0x01,0x2d,0x01,0x06,0x55,0x51,
-0x2e,0x2d,0x59,0x5f,0x76,0x19,0x18,0xfd,0xd3,0x07,0x06,0x63,0xb3,0x50,0x9d,0x4e,
-0x4d,0xa5,0x5d,0xf0,0x93,0x37,0x01,0xee,0x47,0x47,0xb3,0xc6,0x5e,0x4e,0xe6,0x8d,
-0xcc,0x01,0x12,0x01,0x3a,0x11,0x0a,0x10,0x6c,0x4f,0x8f,0x55,0x0e,0x0b,0xfd,0x5e,
-0x08,0x08,0x71,0x2b,0x2b,0xaa,0x24,0x24,0x90,0x01,0x05,0x02,0x56,0x11,0xe3,0xcd,
-0x67,0x00,0x00,0x01,0x00,0x0a,0x00,0x00,0x04,0x6a,0x05,0xd5,0x00,0x0d,0x00,0x00,
-0x13,0x33,0x11,0x33,0x15,0x23,0x11,0x21,0x15,0x21,0x11,0x23,0x35,0x33,0xc9,0xca,
-0xbf,0xbf,0x02,0xd7,0xfc,0x5f,0xbf,0xbf,0x05,0xd5,0xfd,0x77,0x90,0xfd,0xee,0xaa,
-0x02,0xbc,0x90,0x00,0x00,0x02,0xff,0xb2,0xff,0xba,0x05,0x31,0x06,0x17,0x00,0x0f,
-0x00,0x12,0x00,0x00,0x03,0x27,0x37,0x17,0x21,0x15,0x21,0x11,0x01,0x07,0x01,0x11,
-0x23,0x11,0x01,0x23,0x01,0x11,0x21,0x06,0x48,0x66,0x38,0x04,0x99,0xfd,0xee,0x02,
-0x5a,0x67,0xfe,0x0d,0xcb,0xfe,0x22,0x34,0x02,0x12,0xfe,0xd4,0x05,0x69,0x55,0x59,
-0x42,0xaa,0xfd,0xae,0xfd,0x39,0x58,0x02,0x4d,0xfd,0xf9,0x02,0xf7,0x02,0x34,0xfe,
-0x9e,0x01,0x62,0x00,0x00,0x01,0x00,0x6f,0xfe,0x10,0x04,0x19,0x04,0x7b,0x00,0x3a,
-0x00,0x00,0x01,0x15,0x2e,0x01,0x23,0x22,0x06,0x15,0x14,0x16,0x1f,0x01,0x16,0x17,
-0x16,0x15,0x14,0x07,0x06,0x07,0x1f,0x01,0x16,0x33,0x15,0x23,0x22,0x27,0x26,0x2f,
-0x01,0x26,0x27,0x26,0x27,0x26,0x27,0x35,0x16,0x17,0x16,0x17,0x16,0x33,0x32,0x36,
-0x35,0x34,0x26,0x2f,0x01,0x2e,0x01,0x35,0x34,0x36,0x33,0x32,0x16,0x03,0x8b,0x4e,
-0xa8,0x5a,0x89,0x89,0x62,0x94,0x3f,0xc6,0x50,0x53,0x7b,0x57,0x84,0x9f,0x93,0x2a,
-0x4c,0x27,0x54,0x72,0x47,0x59,0xed,0x1e,0x24,0x10,0x11,0x61,0x6c,0x5e,0x5b,0x60,
-0x3f,0x1b,0x1a,0x82,0x8c,0x65,0xab,0x40,0xab,0x98,0xe0,0xce,0x66,0xb4,0x04,0x3f,
-0xae,0x28,0x28,0x54,0x54,0x40,0x49,0x21,0x0e,0x2c,0x4b,0x4c,0x89,0x9c,0x5b,0x40,
-0x13,0x9f,0x7e,0x24,0x9a,0x3d,0x26,0x5b,0xf3,0x1e,0x10,0x03,0x02,0x12,0x23,0xbe,
-0x31,0x1a,0x02,0x1b,0x02,0x59,0x51,0x4b,0x50,0x25,0x0f,0x24,0x95,0x82,0x9e,0xac,
-0x1e,0x00,0x00,0x01,0x00,0x58,0xfe,0x10,0x04,0x33,0x04,0x60,0x00,0x18,0x00,0x00,
-0x13,0x21,0x15,0x01,0x16,0x17,0x01,0x17,0x16,0x3b,0x01,0x15,0x23,0x22,0x27,0x26,
-0x2f,0x01,0x26,0x2b,0x01,0x3d,0x01,0x01,0x21,0x71,0x03,0x6a,0xfd,0x4e,0x5c,0x31,
-0x01,0x08,0x93,0x2a,0x4c,0x6c,0x93,0x54,0x72,0x47,0x59,0xed,0x3d,0x5a,0x5e,0x02,
-0xb4,0xfd,0x65,0x04,0x60,0xa8,0xfc,0xdd,0x10,0x31,0xfe,0xf8,0x7e,0x24,0x9a,0x3d,
-0x26,0x5b,0xf3,0x3f,0x9c,0x0c,0x03,0x25,0x00,0x01,0x00,0x50,0x00,0x00,0x04,0x8d,
-0x05,0xd5,0x00,0x19,0x00,0x00,0x01,0x33,0x32,0x36,0x10,0x26,0x2b,0x01,0x22,0x07,
-0x06,0x07,0x35,0x36,0x37,0x36,0x3b,0x01,0x32,0x04,0x10,0x04,0x2b,0x01,0x11,0x23,
-0x01,0xa0,0xf1,0x8d,0x9a,0x99,0x8e,0xfe,0x45,0x5a,0x56,0x4e,0x4c,0x51,0x51,0x55,
-0xfe,0xfb,0x01,0x01,0xfe,0xff,0xfb,0x27,0xca,0x03,0x00,0x92,0x01,0x0c,0x91,0x16,
-0x15,0x2b,0xb6,0x23,0x11,0x12,0xe1,0xfe,0x48,0xe2,0xfd,0xa6,0x00,0x02,0x00,0x7b,
-0xff,0xe3,0x04,0x2d,0x04,0x7b,0x00,0x0c,0x00,0x2c,0x00,0x00,0x01,0x32,0x36,0x35,
-0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x1d,0x01,0x07,0x11,0x33,0x15,0x36,0x37,0x36,
-0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x23,0x21,0x15,0x14,0x17,0x16,0x33,0x32,
-0x36,0x37,0x15,0x06,0x07,0x06,0x23,0x22,0x26,0x01,0xea,0xdf,0xac,0x41,0x40,0x6f,
-0x99,0x5c,0x5d,0xb8,0xb8,0x3f,0x5e,0x5e,0x88,0xac,0x66,0x65,0x7f,0x7e,0xfb,0xfe,
-0xfe,0x53,0x54,0x97,0x60,0xb6,0x54,0x65,0x5f,0x5f,0x5a,0xf3,0xf0,0x02,0x2b,0x66,
-0x7b,0x62,0x3a,0x39,0x6d,0x6c,0xb4,0x29,0x4c,0x02,0x7f,0xaa,0x66,0x30,0x31,0x61,
-0x60,0xa2,0xbd,0x60,0x60,0x12,0x7f,0x46,0x45,0x2e,0x2e,0xaa,0x27,0x14,0x13,0xfc,
-0x00,0x02,0x00,0x71,0xff,0xe3,0x04,0x5a,0x04,0x7b,0x00,0x13,0x00,0x1f,0x00,0x00,
-0x01,0x35,0x33,0x11,0x23,0x35,0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x10,0x37,0x36,
-0x33,0x32,0x17,0x16,0x00,0x10,0x17,0x16,0x20,0x37,0x36,0x10,0x27,0x26,0x20,0x07,
-0x03,0xa2,0xb8,0xb8,0x3a,0x58,0x59,0x7c,0xcb,0x80,0x7f,0x7f,0x80,0xcb,0x7c,0x59,
-0x58,0xfd,0xc7,0x53,0x54,0x01,0x24,0x54,0x54,0x54,0x54,0xfe,0xdc,0x54,0x03,0xb6,
-0xaa,0xfb,0xa0,0xa8,0x64,0x30,0x31,0xa2,0xa2,0x02,0x10,0xa2,0xa2,0x31,0x30,0xfe,
-0xe0,0xfe,0x6a,0x74,0x73,0x73,0x74,0x01,0x96,0x74,0x73,0x73,0x00,0x02,0x00,0x71,
-0xff,0xe3,0x04,0x5a,0x04,0x7b,0x00,0x13,0x00,0x1f,0x00,0x00,0x25,0x15,0x23,0x11,
-0x33,0x15,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x10,0x07,0x06,0x23,0x22,0x27,0x26,
-0x00,0x10,0x27,0x26,0x20,0x07,0x06,0x10,0x17,0x16,0x20,0x37,0x01,0x29,0xb8,0xb8,
-0x3a,0x59,0x58,0x7c,0xcb,0x7f,0x80,0x80,0x7f,0xcb,0x7c,0x58,0x59,0x02,0x39,0x54,
-0x53,0xfe,0xdc,0x54,0x54,0x54,0x54,0x01,0x24,0x53,0xa8,0xaa,0x04,0x60,0xa8,0x64,
-0x30,0x31,0xa2,0xa2,0xfd,0xf0,0xa2,0xa2,0x31,0x30,0x01,0x20,0x01,0x96,0x74,0x73,
-0x73,0x74,0xfe,0x6a,0x74,0x73,0x73,0x00,0x00,0x02,0x00,0xba,0xff,0xe3,0x04,0xa4,
-0x06,0x14,0x00,0x0b,0x00,0x2b,0x00,0x00,0x00,0x10,0x27,0x26,0x20,0x07,0x06,0x10,
-0x17,0x16,0x20,0x37,0x01,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x10,0x07,0x06,0x23,
-0x22,0x27,0x26,0x27,0x15,0x23,0x11,0x35,0x34,0x37,0x36,0x3b,0x01,0x15,0x23,0x22,
-0x07,0x06,0x1d,0x01,0x03,0xe5,0x53,0x54,0xfe,0xdc,0x54,0x53,0x53,0x54,0x01,0x24,
-0x54,0xfd,0xe0,0x3a,0x5a,0x58,0x7b,0xcc,0x7f,0x80,0x80,0x7f,0xcc,0x7b,0x58,0x59,
-0x3a,0xb9,0x52,0x51,0xb5,0xfe,0xe9,0x6d,0x22,0x26,0x01,0x64,0x01,0x96,0x74,0x73,
-0x73,0x74,0xfe,0x6a,0x74,0x73,0x73,0x02,0xc6,0x64,0x30,0x31,0xa2,0xa2,0xfd,0xf0,
-0xa2,0xa2,0x31,0x30,0x64,0xa8,0x03,0xea,0x94,0xd6,0x60,0x60,0x9c,0x30,0x34,0x96,
-0x94,0x00,0x00,0x01,0x00,0x71,0xff,0xe3,0x03,0xe7,0x04,0x7b,0x00,0x20,0x00,0x30,
-0x40,0x1b,0x20,0x86,0x00,0x88,0x1c,0xb9,0x04,0xb8,0x21,0x10,0x86,0x0f,0x88,0x14,
-0xb9,0x0b,0x8c,0x21,0x22,0x45,0x18,0x12,0x08,0x48,0x10,0x00,0x21,0x10,0xdc,0x3c,
-0xf4,0xec,0xec,0x31,0x00,0x10,0xf4,0xec,0xf4,0xec,0x10,0xf4,0xec,0xf4,0xec,0x30,
-0x13,0x36,0x37,0x36,0x33,0x20,0x17,0x16,0x11,0x10,0x00,0x23,0x22,0x27,0x26,0x27,
-0x35,0x16,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x23,0x22,0x07,0x06,
-0x07,0x71,0x4c,0x51,0x51,0x55,0x01,0x06,0x96,0x97,0xfe,0xd6,0xfd,0x5d,0x53,0x52,
-0x4d,0x4e,0x4f,0x4e,0x50,0xb3,0x63,0x63,0x63,0x63,0xb3,0x50,0x4e,0x4f,0x4e,0x04,
-0x35,0x23,0x12,0x11,0x9d,0x9d,0xfe,0xee,0xfe,0xf2,0xfe,0xc2,0x12,0x12,0x24,0xaa,
-0x2b,0x16,0x15,0x71,0x72,0xcd,0xcd,0x72,0x71,0x15,0x16,0x2b,0x00,0x02,0x00,0x71,
-0xff,0x70,0x03,0xe8,0x04,0x7b,0x00,0x07,0x00,0x2c,0x00,0x00,0x25,0x16,0x33,0x32,
-0x35,0x26,0x23,0x22,0x03,0x06,0x15,0x07,0x34,0x37,0x26,0x27,0x26,0x11,0x10,0x37,
-0x36,0x21,0x32,0x17,0x16,0x17,0x15,0x26,0x27,0x26,0x23,0x22,0x07,0x06,0x10,0x17,
-0x16,0x17,0x36,0x33,0x20,0x17,0x16,0x21,0x22,0x02,0x25,0x3a,0x4d,0x92,0x02,0x82,
-0x65,0x54,0x06,0x99,0x0c,0x39,0x2f,0x95,0x97,0x96,0x01,0x06,0x53,0x53,0x4e,0x4f,
-0x4b,0x52,0x4e,0x50,0xb3,0x63,0x63,0x63,0x04,0x09,0x54,0xc4,0x01,0x2b,0x01,0x01,
-0xfe,0xb2,0x50,0x92,0x13,0x39,0x4b,0xfe,0xed,0x39,0x44,0x03,0x68,0x54,0x23,0x33,
-0xa1,0x01,0x0c,0x01,0x12,0x9d,0x9d,0x11,0x11,0x24,0xac,0x2a,0x17,0x15,0x71,0x72,
-0xfe,0x66,0x72,0x05,0x09,0xb0,0xf6,0xbd,0x00,0x02,0x00,0x71,0xfe,0x56,0x05,0x40,
-0x06,0x14,0x00,0x0b,0x00,0x2a,0x00,0x00,0x00,0x10,0x17,0x16,0x20,0x37,0x36,0x10,
-0x27,0x26,0x20,0x07,0x25,0x11,0x33,0x11,0x14,0x17,0x16,0x3b,0x01,0x15,0x23,0x22,
-0x27,0x26,0x3d,0x02,0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x10,0x37,0x36,0x33,0x32,
-0x17,0x16,0x01,0x2f,0x53,0x54,0x01,0x24,0x54,0x54,0x54,0x54,0xfe,0xdc,0x54,0x02,
-0x20,0xb8,0x26,0x26,0x69,0x31,0x46,0xb5,0x51,0x52,0x3a,0x58,0x59,0x7c,0xcb,0x80,
-0x7f,0x7f,0x80,0xcb,0x7c,0x59,0x58,0x02,0xfa,0xfe,0x6a,0x74,0x73,0x73,0x74,0x01,
-0x96,0x74,0x73,0x73,0x48,0x02,0x5e,0xf9,0xd8,0x99,0x31,0x30,0x9c,0x60,0x60,0xd6,
-0x94,0x28,0x64,0x30,0x31,0xa2,0xa2,0x02,0x10,0xa2,0xa2,0x31,0x30,0x00,0x00,0x02,
-0x00,0x71,0xff,0xe3,0x05,0xf8,0x06,0x14,0x00,0x1f,0x00,0x2b,0x00,0x00,0x01,0x11,
-0x23,0x35,0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x10,0x37,0x36,0x33,0x32,0x17,0x16,
-0x17,0x3d,0x01,0x34,0x37,0x36,0x3b,0x01,0x15,0x23,0x22,0x07,0x06,0x15,0x00,0x10,
-0x17,0x16,0x20,0x37,0x36,0x10,0x27,0x26,0x20,0x07,0x04,0x5a,0xb8,0x3a,0x58,0x59,
-0x7c,0xcb,0x80,0x7f,0x7f,0x80,0xcb,0x7c,0x59,0x58,0x3a,0x52,0x51,0xb5,0xfe,0xe9,
-0x6d,0x22,0x26,0xfc,0xd5,0x53,0x54,0x01,0x24,0x54,0x54,0x54,0x54,0xfe,0xdc,0x54,
-0x03,0xea,0xfc,0x16,0xa8,0x64,0x30,0x31,0xa2,0xa2,0x02,0x10,0xa2,0xa2,0x31,0x30,
-0x64,0x34,0x94,0xd6,0x60,0x60,0x9c,0x30,0x34,0x96,0xfe,0x7c,0xfe,0x6a,0x74,0x73,
-0x73,0x74,0x01,0x96,0x74,0x73,0x73,0x00,0x00,0x02,0x00,0x71,0xff,0xe3,0x04,0x7f,
-0x04,0x7b,0x00,0x19,0x00,0x22,0x00,0x00,0x13,0x34,0x37,0x36,0x33,0x32,0x17,0x16,
-0x11,0x10,0x07,0x06,0x21,0x22,0x26,0x27,0x35,0x16,0x17,0x16,0x33,0x32,0x37,0x36,
-0x37,0x21,0x37,0x05,0x26,0x27,0x26,0x23,0x22,0x07,0x06,0x71,0x83,0x84,0xe2,0xfc,
-0x94,0x95,0x9d,0x9c,0xfe,0xf4,0x6b,0xd0,0x63,0x62,0x64,0x63,0x6a,0xb7,0x66,0x67,
-0x0c,0xfc,0xb2,0xb8,0x02,0x90,0x0e,0x5d,0x5c,0x9a,0x88,0x52,0x53,0x02,0x5e,0xfa,
-0x92,0x91,0xa1,0xa2,0xfe,0xed,0xfe,0xf6,0x9c,0x9c,0x2c,0x2a,0xae,0x34,0x1a,0x1a,
-0x63,0x64,0xbe,0x90,0x01,0x9e,0x57,0x57,0x5a,0x5a,0x00,0x02,0x00,0x71,0xff,0xe3,
-0x04,0x7f,0x04,0x7b,0x00,0x19,0x00,0x22,0x00,0x00,0x13,0x35,0x21,0x26,0x27,0x26,
-0x23,0x22,0x07,0x06,0x07,0x35,0x3e,0x01,0x33,0x20,0x17,0x16,0x11,0x10,0x07,0x06,
-0x23,0x22,0x27,0x26,0x37,0x16,0x17,0x16,0x33,0x32,0x37,0x36,0x37,0x71,0x03,0x4e,
-0x0c,0x67,0x66,0xb7,0x6a,0x63,0x64,0x62,0x63,0xd0,0x6b,0x01,0x0c,0x9c,0x9d,0x95,
-0x94,0xfc,0xe2,0x84,0x83,0xb8,0x02,0x53,0x52,0x88,0x9a,0x5c,0x5d,0x0e,0x02,0x00,
-0x5a,0xbe,0x64,0x63,0x1a,0x1a,0x34,0xae,0x2a,0x2c,0x9c,0x9c,0xfe,0xf6,0xfe,0xed,
-0xa2,0xa1,0x91,0x92,0xc4,0x97,0x5a,0x5a,0x57,0x57,0x9e,0x00,0x00,0x02,0x00,0x7c,
-0xff,0xe3,0x06,0x84,0x04,0x7b,0x00,0x0a,0x00,0x34,0x00,0x00,0x25,0x36,0x27,0x36,
-0x27,0x01,0x16,0x17,0x16,0x33,0x32,0x01,0x16,0x15,0x10,0x07,0x06,0x23,0x22,0x27,
-0x26,0x27,0x01,0x26,0x27,0x26,0x07,0x06,0x07,0x06,0x07,0x35,0x3e,0x01,0x33,0x20,
-0x17,0x16,0x17,0x37,0x33,0x15,0x14,0x17,0x16,0x3b,0x01,0x15,0x23,0x22,0x27,0x26,
-0x35,0x03,0x4e,0x66,0x02,0x01,0x0a,0xfd,0x97,0x1e,0x20,0x52,0x88,0xa8,0x01,0x60,
-0x1f,0x95,0x94,0xfc,0xe4,0x82,0x5c,0x1c,0x02,0xfe,0x13,0x1b,0x4c,0xd1,0x6c,0x61,
-0x64,0x62,0x63,0xd0,0x6b,0x01,0x0c,0x9c,0x24,0x1b,0xcb,0xb8,0x26,0x26,0x69,0x2b,
-0x40,0xaf,0x57,0x52,0xd6,0x8a,0xcf,0x3e,0x38,0xfe,0x9c,0x45,0x23,0x5a,0x02,0x90,
-0x60,0x76,0xfe,0xed,0xa2,0xa1,0x91,0x67,0x9c,0x01,0xbb,0x27,0x23,0x64,0x01,0x01,
-0x19,0x1a,0x34,0xae,0x2a,0x2c,0x9c,0x23,0x29,0x75,0x94,0x99,0x31,0x30,0x9c,0x60,
-0x5a,0xc8,0xff,0xff,0x00,0x85,0xff,0xe3,0x03,0xc8,0x04,0x7c,0x10,0x06,0x03,0x2e,
-0x00,0x00,0xff,0xff,0x00,0x85,0xff,0xe3,0x03,0xc8,0x04,0x7c,0x10,0x06,0x03,0xaf,
-0x00,0x00,0x00,0x01,0x00,0x71,0xff,0xea,0x06,0x46,0x04,0x7b,0x00,0x42,0x00,0x00,
-0x01,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x23,0x22,0x26,0x27,0x35,0x16,0x17,0x16,
-0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x2b,0x01,0x35,0x33,0x32,0x37,0x36,0x35,
-0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x07,0x35,0x36,0x37,0x36,0x33,0x32,0x17,0x16,
-0x17,0x37,0x33,0x15,0x14,0x17,0x16,0x3b,0x01,0x15,0x23,0x22,0x27,0x26,0x35,0x05,
-0x27,0x07,0x06,0x02,0xd7,0x84,0x4a,0x4b,0x8b,0x8a,0xff,0x55,0xb6,0x60,0x4c,0x5b,
-0x5b,0x64,0xad,0x5a,0x5b,0x55,0x54,0x96,0x9e,0xa5,0x88,0x48,0x48,0x4a,0x4b,0x8a,
-0x4b,0x57,0x56,0x68,0x69,0x5b,0x5c,0x50,0xd2,0x7a,0x64,0x12,0xe2,0xb8,0x26,0x26,
-0x69,0x2b,0x40,0xaf,0x57,0x52,0xfe,0xe8,0x01,0x06,0x41,0x02,0x5f,0x17,0x4a,0x4a,
-0x6d,0xa6,0x5c,0x5b,0x1c,0x1c,0xad,0x22,0x11,0x12,0x34,0x35,0x62,0x51,0x37,0x37,
-0x90,0x2c,0x2b,0x3d,0x4a,0x2b,0x2b,0x0c,0x0d,0x1b,0xa7,0x18,0x0c,0x0c,0x4f,0x41,
-0x66,0x83,0x94,0x99,0x31,0x30,0x9c,0x60,0x5a,0xc8,0xa2,0x01,0x06,0x41,0x00,0x02,
-0x00,0x71,0xff,0xd5,0x05,0x09,0x04,0x79,0x00,0x15,0x00,0x2b,0x00,0x00,0x01,0x20,
-0x03,0x10,0x05,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x2b,0x01,0x35,0x33,0x32,0x37,
-0x36,0x34,0x27,0x26,0x25,0x36,0x37,0x32,0x17,0x16,0x15,0x14,0x06,0x07,0x1e,0x01,
-0x15,0x14,0x07,0x06,0x23,0x06,0x27,0x24,0x11,0x10,0x03,0x05,0xfe,0x3c,0x01,0x01,
-0xc5,0x9d,0x49,0x55,0x4f,0x2b,0xb9,0xb6,0xb6,0xb9,0x2b,0x4f,0x55,0x4c,0xfe,0x41,
-0x70,0xc7,0xe6,0x86,0x86,0x8e,0x83,0x83,0x8e,0x86,0x86,0xe6,0xc4,0x73,0xfe,0x91,
-0x03,0xd8,0xfe,0x5e,0xfe,0x42,0x01,0x36,0x40,0x4a,0x4e,0x36,0x1e,0x9d,0x1e,0x37,
-0x9a,0x3d,0x36,0x73,0x2d,0x01,0x56,0x57,0x94,0x67,0x8e,0x1b,0x1c,0x8e,0x67,0x94,
-0x56,0x57,0x02,0x3e,0xc2,0x01,0x58,0x01,0x8d,0x00,0x00,0x01,0xff,0xdb,0xfe,0x56,
-0x02,0x1c,0x04,0x60,0x00,0x13,0x00,0x00,0x13,0x33,0x11,0x33,0x15,0x23,0x11,0x14,
-0x06,0x2b,0x01,0x35,0x33,0x32,0x36,0x35,0x11,0x23,0x35,0x33,0xc1,0xb8,0xa3,0xa3,
-0xa3,0xb5,0x46,0x31,0x69,0x4c,0xb5,0xb5,0x04,0x60,0xfe,0x08,0xa4,0xfe,0x28,0xd6,
-0xc0,0x9c,0x61,0x99,0x01,0xd8,0xa4,0x00,0x00,0x02,0x00,0x71,0xfe,0x56,0x05,0x40,
-0x06,0x14,0x00,0x0d,0x00,0x37,0x00,0x00,0x01,0x11,0x21,0x22,0x07,0x06,0x15,0x14,
-0x17,0x16,0x33,0x32,0x37,0x36,0x11,0x35,0x34,0x37,0x36,0x3b,0x01,0x15,0x23,0x22,
-0x07,0x06,0x1d,0x02,0x11,0x10,0x07,0x06,0x21,0x22,0x27,0x26,0x27,0x35,0x1e,0x01,
-0x33,0x32,0x37,0x36,0x3d,0x01,0x0e,0x01,0x23,0x22,0x02,0x11,0x34,0x12,0x33,0x03,
-0xa2,0xfe,0xc6,0x94,0x52,0x53,0x53,0x52,0x94,0x95,0x53,0x52,0x52,0x51,0xb5,0x46,
-0x31,0x69,0x26,0x26,0x7f,0x7f,0xfe,0xfa,0x61,0x56,0x56,0x51,0x51,0x9e,0x52,0xb5,
-0x5a,0x5a,0x39,0xb2,0x7c,0xce,0xfc,0xfc,0xce,0x02,0x3d,0x01,0xa4,0x6e,0x6e,0xc8,
-0xc7,0x6e,0x6e,0x6e,0x6e,0x02,0xea,0x1e,0xd6,0x60,0x60,0x9c,0x30,0x31,0x99,0x1e,
-0x2b,0xfc,0x56,0xfe,0xe2,0x8b,0x8c,0x0e,0x0f,0x1e,0xb3,0x2c,0x2a,0x5e,0x5f,0xbf,
-0x5b,0x63,0x62,0x01,0x3a,0x01,0x03,0xe9,0x01,0x3a,0x00,0x02,0x00,0x71,0xfe,0x56,
-0x04,0x5a,0x04,0x60,0x00,0x0d,0x00,0x29,0x00,0x00,0x01,0x11,0x21,0x22,0x07,0x06,
-0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x13,0x11,0x10,0x07,0x06,0x21,0x22,0x27,
-0x26,0x27,0x35,0x1e,0x01,0x33,0x32,0x37,0x36,0x3d,0x01,0x0e,0x01,0x23,0x22,0x02,
-0x11,0x34,0x12,0x33,0x03,0xa2,0xfe,0xc6,0x94,0x52,0x53,0x53,0x52,0x94,0x95,0x53,
-0x52,0xb8,0x7f,0x7f,0xfe,0xfa,0x61,0x56,0x56,0x51,0x51,0x9e,0x52,0xb5,0x5a,0x5a,
-0x39,0xb2,0x7c,0xce,0xfc,0xfc,0xce,0x02,0x3d,0x01,0xa4,0x6e,0x6e,0xc8,0xc7,0x6e,
-0x6e,0x6e,0x6e,0x02,0xea,0xfc,0x2b,0xfe,0xe2,0x8b,0x8c,0x0e,0x0f,0x1e,0xb3,0x2c,
-0x2a,0x5e,0x5f,0xbf,0x5b,0x63,0x62,0x01,0x3a,0x01,0x03,0xe9,0x01,0x3a,0x00,0x01,
-0x00,0x71,0x00,0x00,0x04,0x4f,0x04,0x98,0x00,0x21,0x00,0x00,0x25,0x11,0x23,0x35,
-0x21,0x11,0x06,0x07,0x06,0x23,0x22,0x00,0x11,0x10,0x37,0x36,0x21,0x32,0x17,0x16,
-0x17,0x15,0x26,0x27,0x26,0x23,0x22,0x07,0x06,0x10,0x17,0x16,0x33,0x32,0x03,0xa9,
-0x9b,0x01,0x41,0x48,0x57,0x4e,0xca,0xfd,0xfe,0xd6,0x97,0x96,0x01,0x06,0x3e,0x68,
-0x68,0x7f,0x78,0x6f,0x57,0x47,0xb3,0x63,0x63,0x63,0x63,0xb3,0xad,0xb2,0x01,0x1a,
-0x8c,0xfd,0xf0,0x22,0x14,0x12,0x01,0x3e,0x01,0x0e,0x01,0x12,0x9d,0x9d,0x12,0x11,
-0x4b,0xac,0x4d,0x1b,0x16,0x72,0x71,0xfe,0x66,0x71,0x72,0x00,0x00,0x02,0x00,0xce,
-0xfe,0x51,0x04,0xd2,0x04,0x60,0x00,0x0d,0x00,0x15,0x00,0x00,0x01,0x00,0x11,0x14,
-0x05,0x04,0x27,0x02,0x09,0x01,0x33,0x09,0x01,0x33,0x01,0x02,0x13,0x16,0x33,0x32,
-0x37,0x36,0x03,0x49,0x01,0x1b,0xfe,0x80,0xfe,0x59,0x01,0x02,0x01,0x21,0xfe,0x73,
-0xd9,0x01,0x2f,0x01,0x23,0xd9,0xfd,0xfe,0xdc,0x03,0x02,0xd6,0xcb,0x01,0x01,0x02,
-0x3c,0xfe,0x42,0xfe,0xc0,0xe8,0x04,0x05,0xf1,0x01,0x56,0x01,0xaf,0x02,0x1d,0xfe,
-0x70,0x01,0x90,0xfd,0x64,0xfe,0xcc,0xfe,0xee,0x8a,0x8a,0xfa,0x00,0x02,0x00,0x60,
-0x00,0x00,0x04,0x64,0x04,0x60,0x00,0x0d,0x00,0x15,0x00,0x00,0x09,0x01,0x33,0x09,
-0x01,0x33,0x01,0x16,0x15,0x16,0x21,0x20,0x35,0x34,0x25,0x06,0x15,0x14,0x33,0x32,
-0x35,0x34,0x01,0xee,0xfe,0x72,0xd9,0x01,0x29,0x01,0x29,0xd9,0xfe,0x6b,0xb3,0x01,
-0xfe,0xe1,0xfe,0xd2,0x01,0x24,0x76,0x7b,0x72,0x02,0x4a,0x02,0x16,0xfe,0x71,0x01,
-0x8f,0xfd,0xdf,0xf1,0xa7,0xa7,0xa7,0xb1,0x60,0x9e,0x3b,0x68,0x68,0x3f,0x00,0x01,
-0x00,0xae,0xfe,0x56,0x04,0x58,0x04,0x60,0x00,0x16,0x00,0x00,0x13,0x11,0x33,0x11,
-0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x11,0x33,0x11,0x23,0x11,0x06,0x07,0x06,
-0x23,0x22,0x26,0xae,0xb8,0x3e,0x3e,0x7c,0x95,0x57,0x56,0xb8,0xb8,0x43,0x59,0x58,
-0x75,0xc1,0xc8,0x01,0xba,0x02,0xa6,0xfd,0x61,0x9f,0x50,0x4f,0x5f,0x5f,0xa4,0x02,
-0x7b,0xf9,0xf6,0x02,0x56,0x66,0x32,0x31,0xf0,0x00,0x00,0x01,0x00,0xba,0x00,0x00,
-0x04,0x64,0x06,0x14,0x00,0x21,0x00,0x00,0x01,0x33,0x36,0x37,0x36,0x33,0x32,0x17,
-0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x35,0x34,
-0x37,0x36,0x3b,0x01,0x15,0x23,0x22,0x07,0x06,0x15,0x01,0x72,0x01,0x42,0x59,0x5a,
-0x75,0xc1,0x63,0x63,0xb8,0x7c,0x7c,0x95,0xac,0xb9,0x52,0x51,0xb5,0xfe,0xe9,0x69,
-0x26,0x26,0x03,0xb2,0x65,0x32,0x32,0x77,0x78,0xe8,0xfd,0x5c,0x02,0x9e,0x9f,0x9e,
-0xbe,0xa4,0xfd,0x87,0x03,0xea,0x94,0xd6,0x60,0x60,0x9c,0x30,0x31,0x99,0x00,0x01,
-0x00,0xba,0xfe,0x56,0x04,0x64,0x06,0x14,0x00,0x2b,0x00,0x00,0x01,0x33,0x36,0x37,
-0x36,0x33,0x32,0x17,0x16,0x15,0x11,0x14,0x07,0x06,0x2b,0x01,0x35,0x33,0x32,0x37,
-0x36,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x35,0x34,0x37,0x36,
-0x3b,0x01,0x15,0x23,0x22,0x07,0x06,0x15,0x01,0x72,0x01,0x42,0x59,0x5a,0x75,0xc1,
-0x63,0x63,0x52,0x51,0xb5,0xfe,0xe9,0x69,0x26,0x26,0x7c,0x7c,0x95,0xac,0xb9,0x52,
-0x51,0xb5,0xfe,0xe9,0x69,0x26,0x26,0x03,0xb2,0x65,0x32,0x32,0x77,0x78,0xe8,0xfd,
-0x48,0xd6,0x60,0x60,0x9c,0x30,0x31,0x99,0x02,0xb2,0x9f,0x9e,0xbe,0xa4,0xfd,0x87,
-0x03,0xea,0x94,0xd6,0x60,0x60,0x9c,0x30,0x31,0x99,0x00,0x02,0x00,0x74,0x00,0x00,
-0x02,0x85,0x06,0x14,0x00,0x0b,0x00,0x0f,0x00,0x00,0x13,0x35,0x33,0x11,0x33,0x11,
-0x33,0x15,0x23,0x11,0x23,0x19,0x01,0x33,0x15,0x23,0x74,0xb4,0xb8,0xa4,0xa4,0xb8,
-0xb8,0xb8,0x01,0xc4,0xa4,0x01,0xf8,0xfe,0x08,0xa4,0xfe,0x3c,0x01,0xc4,0x04,0x50,
-0xe9,0x00,0x00,0x01,0x00,0xc1,0x00,0x00,0x02,0x5f,0x04,0x60,0x00,0x0d,0x00,0x00,
-0x01,0x11,0x14,0x17,0x16,0x3b,0x01,0x15,0x23,0x22,0x27,0x26,0x35,0x11,0x01,0x79,
-0x26,0x26,0x69,0x31,0x46,0xb5,0x52,0x51,0x04,0x60,0xfd,0x36,0x99,0x31,0x30,0x9c,
-0x60,0x60,0xd6,0x02,0xca,0x00,0x00,0x01,0x00,0x74,0x00,0x00,0x02,0x84,0x04,0x60,
-0x00,0x0b,0x00,0x00,0x13,0x35,0x21,0x15,0x23,0x11,0x33,0x15,0x21,0x35,0x33,0x11,
-0x74,0x02,0x10,0xa8,0xa8,0xfd,0xf0,0xb0,0x03,0xbc,0xa4,0xa4,0xfc,0xe8,0xa4,0xa4,
-0x03,0x18,0x00,0x01,0x00,0xb0,0x00,0x00,0x03,0x44,0x06,0x14,0x00,0x23,0x00,0x00,
-0x01,0x33,0x11,0x16,0x17,0x16,0x33,0x32,0x37,0x36,0x37,0x33,0x06,0x07,0x06,0x23,
-0x22,0x27,0x11,0x23,0x11,0x26,0x27,0x26,0x23,0x22,0x07,0x06,0x07,0x23,0x36,0x37,
-0x36,0x33,0x32,0x17,0x01,0xa2,0xb8,0x02,0x01,0x11,0x0d,0x26,0x12,0x12,0x02,0x7d,
-0x02,0x33,0x33,0x5b,0x14,0x13,0xb8,0x06,0x05,0x11,0x0d,0x26,0x12,0x12,0x02,0x7d,
-0x02,0x33,0x33,0x5b,0x19,0x16,0x06,0x14,0xfc,0xed,0x01,0x01,0x09,0x25,0x24,0x52,
-0x87,0x49,0x4a,0x04,0xfd,0x85,0x03,0x02,0x04,0x03,0x09,0x25,0x24,0x52,0x87,0x49,
-0x4a,0x06,0x00,0x02,0x00,0x4c,0x00,0x00,0x03,0x54,0x06,0x14,0x00,0x11,0x00,0x18,
-0x00,0x00,0x01,0x33,0x11,0x33,0x15,0x23,0x11,0x23,0x11,0x34,0x27,0x23,0x20,0x37,
-0x36,0x33,0x32,0x17,0x07,0x26,0x23,0x22,0x07,0x14,0x33,0x01,0xa2,0xb8,0xfa,0xfa,
-0xb8,0x01,0x3d,0xfe,0xe8,0x01,0x01,0xf5,0x35,0x2a,0x10,0x17,0x37,0x4d,0x01,0x5c,
-0x06,0x14,0xfc,0xfe,0xa0,0xfd,0x8e,0x02,0x54,0x0f,0x0f,0xbd,0xf6,0x19,0xfa,0x84,
-0x4b,0x39,0x00,0x01,0x00,0xc1,0xfe,0x56,0x02,0x5f,0x06,0x14,0x00,0x0f,0x00,0x00,
-0x37,0x11,0x33,0x11,0x15,0x14,0x17,0x16,0x3b,0x01,0x15,0x23,0x22,0x27,0x26,0x35,
-0xc1,0xb8,0x26,0x26,0x69,0x31,0x46,0xb5,0x51,0x52,0x80,0x05,0x94,0xfa,0x6c,0x94,
-0x99,0x31,0x30,0x9c,0x60,0x60,0xd6,0x00,0x00,0x01,0x00,0xc1,0xfe,0x4c,0x05,0x36,
-0x06,0x14,0x00,0x24,0x00,0x00,0x01,0x32,0x17,0x16,0x17,0x16,0x15,0x14,0x04,0x21,
-0x22,0x27,0x26,0x27,0x35,0x1e,0x01,0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x2b,
-0x01,0x35,0x01,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x15,0x03,0x43,0x69,0x81,0x63,
-0x55,0x51,0xfe,0xd0,0xfe,0xe8,0x5e,0x63,0x64,0x6a,0x54,0xc8,0x6d,0xbe,0x63,0x64,
-0x5c,0x5b,0xa7,0xae,0x01,0xae,0xfd,0x6a,0xb8,0xb8,0x03,0x65,0x01,0xdc,0x38,0x2b,
-0x6c,0x68,0x8a,0xdd,0xf2,0x12,0x13,0x25,0xc3,0x31,0x32,0x4b,0x4b,0x8f,0x84,0x4b,
-0x4a,0xa6,0x01,0xf3,0xfc,0x33,0x06,0x14,0xfe,0x4c,0xa8,0x00,0x00,0x01,0x00,0xba,
-0xff,0xe6,0x07,0x1d,0x04,0x62,0x00,0x26,0x00,0x00,0x25,0x06,0x07,0x06,0x23,0x22,
-0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x37,0x36,0x35,0x11,0x33,0x11,0x14,
-0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x23,0x35,0x06,0x07,0x06,0x23,0x22,0x27,
-0x26,0x03,0xae,0x45,0x60,0x60,0x82,0xaf,0xbe,0xb9,0x72,0x75,0x8f,0x53,0x53,0xb9,
-0x72,0x77,0x8d,0xa6,0xb9,0xb9,0x3f,0x58,0x58,0x79,0x7a,0x56,0x55,0xd8,0x7c,0x3a,
-0x3c,0xf6,0xe2,0x02,0xa4,0xfd,0x62,0xa2,0x9c,0x60,0x5e,0xa4,0x02,0x7a,0xfd,0x62,
-0xa2,0x9c,0xc0,0xa2,0x02,0x7a,0xfb,0xa0,0xae,0x68,0x30,0x32,0x3e,0x3e,0x00,0x01,
-0x00,0xba,0xfe,0x56,0x07,0x1d,0x04,0x61,0x00,0x26,0x00,0x00,0x25,0x0e,0x01,0x23,
-0x22,0x27,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,
-0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x11,0x33,0x11,0x23,0x11,0x0e,0x01,0x23,
-0x22,0x27,0x26,0x03,0xae,0x45,0xc0,0x82,0xaf,0x5f,0x5f,0xb9,0x72,0x75,0x8f,0xa6,
-0xb9,0x39,0x39,0x77,0x8d,0x53,0x53,0xb9,0xb9,0x3f,0xb0,0x79,0x7a,0x56,0x55,0xd8,
-0x7c,0x76,0x7a,0x7b,0xe2,0x02,0xa4,0xfd,0x62,0xa1,0x9c,0xbe,0xa4,0x02,0x79,0xfd,
-0x62,0xa2,0x4d,0x4e,0x60,0x5f,0xa3,0x02,0x79,0xf9,0xf5,0x02,0x59,0x67,0x62,0x3e,
-0x3e,0x00,0x00,0x01,0x00,0xba,0xfe,0x56,0x07,0x1d,0x04,0x7b,0x00,0x33,0x00,0x00,
-0x01,0x3e,0x01,0x33,0x32,0x17,0x16,0x15,0x11,0x14,0x07,0x06,0x2b,0x01,0x35,0x33,
-0x32,0x37,0x36,0x35,0x26,0x13,0x34,0x27,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,
-0x11,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x3e,0x01,
-0x33,0x32,0x17,0x16,0x04,0x29,0x45,0xc0,0x82,0xaf,0x5f,0x5f,0x52,0x51,0xb5,0xfe,
-0xe9,0x69,0x26,0x26,0x02,0x02,0x01,0x72,0x75,0x8f,0xa6,0xb9,0x39,0x39,0x77,0x8d,
-0x53,0x53,0xb9,0xb9,0x3f,0xb0,0x79,0x7a,0x55,0x56,0x03,0x89,0x7c,0x76,0x7b,0x7a,
-0xe2,0xfd,0x48,0xd6,0x60,0x60,0x9c,0x30,0x31,0x99,0x56,0x01,0x9e,0x6e,0x50,0xa1,
-0x9c,0xbe,0xa4,0xfd,0x87,0x02,0x9e,0xa2,0x4e,0x4d,0x5f,0x60,0xa3,0xfd,0x87,0x04,
-0x60,0xae,0x67,0x62,0x3e,0x3e,0x00,0x01,0xff,0xdb,0xfe,0x56,0x04,0x6b,0x04,0x7b,
-0x00,0x1f,0x00,0x00,0x05,0x14,0x07,0x06,0x2b,0x01,0x35,0x33,0x32,0x37,0x36,0x35,
-0x11,0x33,0x15,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x11,0x23,0x11,0x34,0x26,
-0x23,0x22,0x06,0x15,0x01,0x79,0x51,0x52,0xb5,0x46,0x31,0x69,0x26,0x26,0xb9,0x42,
-0x5a,0x59,0x75,0xc1,0x63,0x63,0xb8,0x7c,0x7c,0x95,0xac,0x14,0xd6,0x60,0x60,0x9c,
-0x30,0x31,0x99,0x04,0x74,0xae,0x65,0x32,0x32,0x77,0x78,0xe8,0xfd,0x5c,0x02,0x9e,
-0x9f,0x9e,0xbe,0xa4,0x00,0x01,0x00,0xba,0xfe,0x56,0x05,0x4a,0x04,0x7b,0x00,0x1f,
-0x00,0x00,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x36,0x37,
-0x36,0x33,0x32,0x17,0x16,0x15,0x11,0x14,0x17,0x16,0x3b,0x01,0x15,0x23,0x22,0x27,
-0x26,0x35,0x03,0xac,0x7c,0x7c,0x95,0xac,0xb9,0xb9,0x42,0x59,0x5a,0x75,0xc1,0x63,
-0x63,0x26,0x26,0x69,0x31,0x46,0xb5,0x51,0x52,0x02,0x9e,0x9f,0x9e,0xbe,0xa4,0xfd,
-0x87,0x04,0x60,0xae,0x65,0x32,0x32,0x77,0x78,0xe8,0xfd,0x48,0x99,0x31,0x30,0x9c,
-0x60,0x60,0xd6,0x00,0x00,0x01,0x00,0xb3,0x00,0x00,0x04,0x64,0x04,0x60,0x00,0x09,
-0x00,0x00,0x13,0x21,0x01,0x11,0x33,0x11,0x21,0x01,0x11,0x23,0xb3,0x01,0x10,0x01,
-0xdd,0xc4,0xfe,0xf0,0xfe,0x23,0xc4,0x04,0x60,0xfc,0x79,0x03,0x87,0xfb,0xa0,0x03,
-0x6c,0xfc,0x94,0x00,0x00,0x03,0x00,0x71,0xff,0xe3,0x04,0x75,0x04,0x7b,0x00,0x0e,
-0x00,0x17,0x00,0x20,0x00,0x00,0x01,0x32,0x00,0x11,0x10,0x07,0x06,0x23,0x22,0x27,
-0x26,0x11,0x10,0x37,0x36,0x17,0x22,0x07,0x06,0x07,0x21,0x26,0x27,0x26,0x13,0x21,
-0x16,0x17,0x16,0x33,0x32,0x37,0x36,0x02,0x73,0xf0,0x01,0x12,0x89,0x89,0xf0,0xf1,
-0x88,0x89,0x89,0x88,0xf1,0x94,0x56,0x4b,0x09,0x02,0x7b,0x0a,0x4a,0x56,0xa4,0xfd,
-0x91,0x11,0x3c,0x56,0x95,0x93,0x56,0x3c,0x04,0x7b,0xfe,0xc8,0xfe,0xec,0xfe,0xed,
-0x9c,0x9d,0x9d,0x9c,0x01,0x13,0x01,0x14,0x9c,0x9c,0x9c,0x73,0x65,0xa4,0xa3,0x64,
-0x75,0xfd,0xe0,0x7b,0x52,0x73,0x74,0x51,0x00,0x02,0x00,0x71,0x00,0x00,0x06,0x24,
-0x04,0x60,0x00,0x12,0x00,0x1d,0x00,0x00,0x01,0x15,0x21,0x11,0x21,0x15,0x21,0x11,
-0x21,0x15,0x21,0x20,0x27,0x26,0x11,0x10,0x37,0x36,0x21,0x17,0x23,0x22,0x07,0x06,
-0x15,0x14,0x17,0x16,0x3b,0x01,0x06,0x16,0xfd,0xd4,0x02,0x15,0xfd,0xeb,0x02,0x3a,
-0xfc,0xe1,0xfe,0xbb,0xa7,0xa8,0xa8,0xa7,0x01,0x45,0x2a,0x25,0xf0,0x78,0x78,0x78,
-0x78,0xf0,0x25,0x04,0x60,0x9a,0xfe,0xdd,0x9b,0xfe,0x94,0x9c,0x8e,0x8f,0x01,0x14,
-0x01,0x12,0x8e,0x8f,0x82,0x6c,0x6b,0xd8,0xd9,0x6c,0x6d,0x00,0x00,0x02,0x00,0x99,
-0xff,0xe2,0x05,0x3e,0x04,0x7c,0x00,0x1e,0x00,0x37,0x00,0x00,0x01,0x06,0x07,0x06,
-0x17,0x16,0x17,0x16,0x33,0x32,0x37,0x36,0x3d,0x01,0x33,0x15,0x14,0x17,0x16,0x33,
-0x32,0x37,0x36,0x37,0x26,0x27,0x26,0x27,0x26,0x23,0x22,0x05,0x12,0x05,0x04,0x13,
-0x16,0x17,0x16,0x15,0x14,0x02,0x23,0x22,0x26,0x27,0x0e,0x01,0x23,0x22,0x27,0x26,
-0x37,0x36,0x37,0x36,0x01,0x8e,0x3b,0x03,0x18,0x04,0x09,0x2d,0x3c,0x4e,0x4d,0x37,
-0x1e,0x9c,0x1e,0x37,0x4d,0x4b,0x3f,0x24,0x12,0x05,0x0f,0x03,0x3c,0x69,0xfe,0xf2,
-0xfe,0xdd,0x5f,0x01,0xc0,0x01,0xa4,0x76,0x26,0x04,0x0e,0xae,0x93,0x67,0x8e,0x1c,
-0x1c,0x8e,0x67,0x93,0x57,0x61,0x0a,0x03,0x0b,0x16,0x03,0x0c,0x60,0x14,0x70,0x42,
-0xa7,0x3f,0x55,0x4f,0x2b,0xb9,0xb6,0xb6,0xb9,0x2b,0x4f,0x55,0x30,0xb6,0x4b,0x67,
-0x17,0x5d,0xa0,0xa0,0x01,0x70,0x01,0x02,0xfe,0x93,0x78,0x02,0x65,0x59,0xe6,0xfe,
-0xf4,0x8e,0x83,0x83,0x8e,0x86,0x95,0xd7,0x13,0xab,0x42,0x00,0x00,0x03,0x00,0x71,
-0xfe,0x57,0x04,0x75,0x06,0x13,0x00,0x1d,0x00,0x26,0x00,0x2e,0x00,0x00,0x01,0x23,
-0x35,0x21,0x15,0x23,0x15,0x16,0x17,0x16,0x11,0x10,0x07,0x06,0x07,0x15,0x33,0x15,
-0x21,0x35,0x33,0x35,0x26,0x27,0x26,0x11,0x10,0x37,0x36,0x37,0x17,0x11,0x36,0x37,
-0x36,0x35,0x34,0x27,0x26,0x01,0x11,0x06,0x07,0x06,0x10,0x17,0x16,0x02,0x14,0xf0,
-0x02,0x98,0xf0,0xb2,0x6e,0x89,0x89,0x6e,0xb2,0xf0,0xfd,0x68,0xf0,0xae,0x6c,0x89,
-0x89,0x6c,0xae,0xb8,0x56,0x3a,0x56,0x56,0x3a,0xfe,0xf2,0x53,0x38,0x56,0x55,0x38,
-0x05,0x6f,0xa4,0xa4,0xfa,0x18,0x7e,0x9c,0xfe,0xec,0xfe,0xed,0x9c,0x7f,0x18,0xee,
-0xa4,0xa4,0xef,0x19,0x7d,0x9c,0x01,0x13,0x01,0x14,0x9c,0x7c,0x19,0xa1,0xfc,0xb8,
-0x1a,0x4e,0x74,0xc8,0xc7,0x74,0x4f,0xfc,0xd4,0x03,0x44,0x1a,0x4b,0x74,0xfe,0x6e,
-0x74,0x4b,0x00,0x01,0x00,0x71,0xff,0xe5,0x03,0x01,0x04,0x60,0x00,0x15,0x00,0x00,
-0x37,0x16,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x11,0x33,0x11,0x23,0x35,0x06,0x07,
-0x06,0x23,0x22,0x27,0x26,0x27,0x71,0x1f,0x24,0x25,0x2c,0x9c,0x53,0x54,0xb9,0xb9,
-0x3a,0x5d,0x5d,0x85,0x13,0x17,0x17,0x1c,0xac,0x12,0x08,0x09,0x65,0x66,0xbe,0x02,
-0x4e,0xfb,0xa0,0xae,0x66,0x32,0x31,0x03,0x02,0x05,0x00,0x01,0x00,0x71,0xff,0xe5,
-0x03,0x01,0x06,0x0a,0x00,0x15,0x00,0x00,0x37,0x16,0x17,0x16,0x33,0x32,0x37,0x36,
-0x35,0x11,0x33,0x11,0x23,0x35,0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x71,0x1f,
-0x24,0x25,0x2c,0x9f,0x50,0x54,0xb9,0xb9,0x3a,0x5d,0x5d,0x85,0x13,0x17,0x17,0x1c,
-0xac,0x12,0x08,0x09,0x65,0x69,0xbb,0x03,0xf8,0xf9,0xf6,0xae,0x66,0x32,0x31,0x03,
-0x02,0x05,0x00,0x01,0x00,0x71,0xfe,0x56,0x03,0xe7,0x04,0x60,0x00,0x1f,0x00,0x00,
-0x37,0x16,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x11,0x33,0x11,0x14,0x17,0x16,0x3b,
-0x01,0x15,0x23,0x22,0x27,0x26,0x35,0x27,0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x27,
-0x71,0x1f,0x24,0x25,0x2c,0x9c,0x53,0x54,0xb9,0x26,0x26,0x69,0x31,0x46,0xb5,0x51,
-0x52,0x01,0x3a,0x5d,0x5d,0x85,0x13,0x17,0x17,0x1c,0xac,0x12,0x08,0x09,0x65,0x66,
-0xbe,0x02,0x4e,0xfb,0x8c,0x99,0x31,0x30,0x9c,0x60,0x60,0xd6,0xc2,0x66,0x32,0x31,
-0x03,0x02,0x05,0x00,0x00,0x01,0x00,0x71,0xfe,0x56,0x03,0x01,0x04,0x7b,0x00,0x15,
-0x00,0x00,0x01,0x26,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x11,0x23,0x11,0x33,0x15,
-0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x03,0x01,0x1f,0x24,0x25,0x2c,0x9c,0x53,
-0x54,0xb9,0xb9,0x3a,0x5d,0x5d,0x85,0x13,0x17,0x17,0x1c,0x03,0xb4,0x12,0x08,0x09,
-0x65,0x66,0xbe,0xfc,0x08,0x06,0x0a,0xae,0x66,0x32,0x31,0x03,0x02,0x05,0x00,0x01,
-0x00,0x70,0xfe,0x56,0x03,0x01,0x04,0x7b,0x00,0x21,0x00,0x00,0x01,0x26,0x27,0x26,
-0x23,0x22,0x07,0x06,0x15,0x11,0x23,0x15,0x14,0x17,0x16,0x3b,0x01,0x15,0x23,0x22,
-0x27,0x26,0x35,0x11,0x33,0x15,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x03,0x01,
-0x1f,0x24,0x25,0x2c,0x9c,0x53,0x54,0x02,0x26,0x26,0x69,0xe9,0xfe,0xb5,0x51,0x52,
-0xba,0x3a,0x5d,0x5d,0x85,0x13,0x17,0x17,0x1c,0x03,0xb4,0x12,0x08,0x09,0x65,0x65,
-0xbf,0xfd,0xb2,0x14,0x99,0x31,0x30,0x9c,0x60,0x60,0xd6,0x04,0x74,0xae,0x66,0x32,
-0x31,0x03,0x02,0x05,0x00,0x01,0x00,0x74,0x00,0x00,0x03,0x7e,0x04,0x7b,0x00,0x12,
-0x00,0x00,0x01,0x10,0x37,0x36,0x3b,0x01,0x15,0x23,0x22,0x07,0x06,0x1f,0x01,0x11,
-0x33,0x15,0x21,0x35,0x33,0x01,0x28,0x9e,0x48,0x72,0xfe,0xe9,0x69,0x26,0x27,0x01,
-0x01,0xa3,0xfd,0xf0,0xb4,0x02,0xe5,0x01,0x21,0x50,0x25,0x9c,0x30,0x32,0x98,0x97,
-0xfe,0x56,0xa4,0xa4,0x00,0x01,0x00,0x74,0x00,0x00,0x03,0x7e,0x04,0x7b,0x00,0x12,
-0x00,0x00,0x01,0x11,0x33,0x15,0x21,0x35,0x33,0x11,0x37,0x36,0x27,0x26,0x2b,0x01,
-0x35,0x33,0x32,0x17,0x16,0x02,0xca,0xb4,0xfd,0xf0,0xa3,0x01,0x01,0x27,0x26,0x69,
-0xe9,0xfe,0x72,0x48,0x9e,0x02,0xe5,0xfd,0xbf,0xa4,0xa4,0x01,0xaa,0x97,0x98,0x32,
-0x30,0x9c,0x25,0x50,0x00,0x02,0x00,0x32,0x00,0x00,0x04,0x0f,0x04,0x60,0x00,0x16,
-0x00,0x21,0x00,0x00,0x01,0x16,0x17,0x16,0x17,0x13,0x23,0x03,0x26,0x27,0x26,0x2b,
-0x01,0x11,0x23,0x11,0x21,0x32,0x17,0x16,0x15,0x14,0x06,0x01,0x11,0x33,0x32,0x37,
-0x36,0x35,0x34,0x27,0x26,0x23,0x02,0x8c,0x37,0x35,0x34,0x35,0xae,0xc3,0xa2,0x3f,
-0x3b,0x3b,0x61,0xa9,0xb9,0x01,0x84,0xd9,0x6c,0x6b,0x70,0xfd,0xf5,0xc6,0x77,0x3f,
-0x40,0x40,0x3f,0x77,0x02,0x0d,0x11,0x36,0x36,0x5e,0xfe,0xce,0x01,0x1f,0x71,0x24,
-0x25,0xfe,0x27,0x04,0x60,0x50,0x51,0xa2,0x69,0x8c,0x01,0x9d,0xfe,0xaf,0x2b,0x2b,
-0x53,0x54,0x2a,0x2a,0x00,0x02,0x00,0x32,0x00,0x00,0x04,0x0f,0x04,0x60,0x00,0x16,
-0x00,0x21,0x00,0x00,0x01,0x1e,0x01,0x15,0x14,0x07,0x06,0x23,0x21,0x11,0x33,0x11,
-0x33,0x32,0x37,0x36,0x37,0x13,0x33,0x03,0x06,0x07,0x06,0x01,0x33,0x32,0x37,0x36,
-0x35,0x34,0x27,0x26,0x2b,0x01,0x02,0x8c,0x6a,0x70,0x6b,0x6c,0xd9,0xfe,0x7c,0xb9,
-0xa9,0x61,0x3b,0x3b,0x3f,0xa2,0xc3,0xae,0x35,0x34,0x35,0xfe,0x28,0xc6,0x77,0x3f,
-0x40,0x40,0x3f,0x77,0xc6,0x02,0x53,0x1b,0x8c,0x69,0xa2,0x51,0x50,0x04,0x60,0xfe,
-0x27,0x25,0x24,0x71,0x01,0x1f,0xfe,0xce,0x5e,0x36,0x36,0xfe,0x37,0x2a,0x2a,0x54,
-0x53,0x2b,0x2b,0x00,0x00,0x01,0x00,0x6f,0xfe,0x56,0x03,0xc7,0x04,0x7b,0x00,0x3c,
-0x00,0x00,0x01,0x15,0x2e,0x01,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x1f,0x01,
-0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x23,0x22,0x2f,0x01,0x15,0x14,0x17,0x16,0x3b,
-0x01,0x15,0x23,0x22,0x27,0x26,0x3d,0x02,0x16,0x17,0x16,0x33,0x32,0x37,0x36,0x35,
-0x34,0x27,0x26,0x2f,0x01,0x26,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x03,0x8b,
-0x4e,0xa8,0x5a,0x89,0x44,0x45,0x31,0x31,0x94,0x3f,0xc4,0x52,0x53,0x7b,0x7c,0xd8,
-0x5a,0x62,0x15,0x26,0x26,0x69,0xe9,0xfe,0xb5,0x51,0x52,0x66,0x63,0x63,0x61,0x82,
-0x46,0x46,0x32,0x33,0xab,0x40,0xab,0x4c,0x4c,0xe0,0xce,0x66,0xb4,0x04,0x3f,0xae,
-0x28,0x28,0x2a,0x2a,0x54,0x40,0x25,0x24,0x21,0x0e,0x2a,0x4d,0x4c,0x89,0x9c,0x5b,
-0x5b,0x11,0x04,0x0c,0x99,0x31,0x30,0x9c,0x60,0x60,0xd6,0x3d,0xbe,0x35,0x1a,0x1b,
-0x2d,0x2c,0x51,0x4b,0x28,0x28,0x25,0x0f,0x24,0x4a,0x4b,0x82,0x9e,0xac,0x1e,0x00,
-0x00,0x01,0xff,0xdb,0xfe,0x56,0x02,0xd7,0x06,0x14,0x00,0x18,0x00,0x00,0x17,0x02,
-0x03,0x34,0x37,0x36,0x3b,0x01,0x15,0x23,0x22,0x07,0x06,0x15,0x13,0x14,0x07,0x06,
-0x2b,0x01,0x35,0x33,0x32,0x37,0x36,0xc1,0x01,0x02,0x57,0x51,0xc3,0xae,0xb0,0x63,
-0x26,0x27,0x02,0x51,0x52,0xb5,0x46,0x31,0x69,0x26,0x26,0x14,0x02,0x70,0x02,0x52,
-0xb5,0x5b,0x56,0x99,0x28,0x28,0x68,0xfb,0x29,0xd6,0x60,0x60,0x9c,0x30,0x31,0x00,
-0x00,0x01,0x00,0x37,0xfe,0x56,0x03,0x36,0x06,0x14,0x00,0x22,0x00,0x00,0x01,0x03,
-0x14,0x06,0x2b,0x01,0x35,0x33,0x32,0x3f,0x01,0x36,0x35,0x11,0x23,0x35,0x33,0x11,
-0x23,0x35,0x33,0x35,0x34,0x36,0x3b,0x01,0x15,0x23,0x22,0x07,0x06,0x15,0x11,0x33,
-0x15,0x01,0xd6,0x01,0xa3,0xb5,0x46,0x31,0x69,0x26,0x0e,0x18,0xb5,0xb5,0xb0,0xb0,
-0xae,0xbd,0xae,0xb0,0x63,0x27,0x26,0xa2,0x01,0xc4,0xfe,0x28,0xd6,0xc0,0x9c,0x30,
-0x18,0x38,0x7a,0x01,0xd8,0xa4,0x01,0x69,0x8f,0x4e,0xbb,0xab,0x99,0x28,0x29,0x67,
-0xfd,0xa5,0xa4,0x00,0x00,0x01,0x00,0x37,0xfe,0x56,0x03,0x33,0x04,0x65,0x00,0x18,
-0x00,0x00,0x05,0x14,0x17,0x16,0x3b,0x01,0x15,0x23,0x22,0x27,0x26,0x37,0x13,0x34,
-0x27,0x26,0x2b,0x01,0x35,0x33,0x32,0x17,0x16,0x07,0x06,0x02,0x4d,0x26,0x26,0x69,
-0x31,0x46,0xb5,0x52,0x52,0x01,0x02,0x27,0x26,0x63,0xb0,0xae,0xc3,0x51,0x5d,0x06,
-0x03,0x14,0x99,0x31,0x30,0x9c,0x60,0x61,0xd5,0x03,0x28,0x68,0x28,0x28,0x99,0x56,
-0x61,0xaf,0x59,0x00,0x00,0x02,0xfe,0xf2,0xfe,0x56,0x02,0xd7,0x06,0x14,0x00,0x08,
-0x00,0x21,0x00,0x00,0x17,0x23,0x22,0x17,0x16,0x33,0x32,0x37,0x36,0x37,0x33,0x15,
-0x23,0x06,0x07,0x06,0x23,0x20,0x35,0x34,0x21,0x33,0x11,0x34,0x37,0x36,0x3b,0x01,
-0x15,0x23,0x22,0x07,0x06,0x15,0xb4,0xb3,0x77,0x03,0x03,0x7c,0x6e,0x21,0x12,0xcc,
-0xb5,0xbf,0x12,0x35,0x52,0xb5,0xfe,0xd1,0x01,0x0e,0xbe,0x57,0x51,0xc3,0xae,0xb0,
-0x64,0x25,0x27,0x9a,0x33,0x41,0x30,0x17,0xc7,0x9b,0x6f,0x40,0x60,0xd8,0xd2,0x04,
-0xae,0xb4,0x5c,0x56,0x99,0x28,0x29,0x67,0x00,0x01,0x00,0x37,0xfe,0xc2,0x02,0xf2,
-0x04,0x60,0x00,0x15,0x00,0x00,0x01,0x11,0x21,0x35,0x21,0x11,0x34,0x27,0x26,0x2b,
-0x01,0x35,0x33,0x32,0x17,0x16,0x15,0x11,0x33,0x15,0x23,0x11,0x01,0xb2,0xfe,0x85,
-0x01,0x7b,0x26,0x25,0x73,0xbd,0xbd,0xd5,0x51,0x51,0x87,0x87,0xfe,0xc2,0x01,0x3e,
-0x8f,0x02,0x60,0x89,0x27,0x27,0x9a,0x50,0x4f,0xd2,0xfd,0xa0,0x8f,0xfe,0xc2,0x00,
-0x00,0x01,0x00,0x37,0xfe,0x57,0x02,0xf2,0x05,0x9e,0x00,0x14,0x00,0x00,0x01,0x11,
-0x21,0x15,0x21,0x11,0x14,0x17,0x16,0x3b,0x01,0x15,0x23,0x22,0x26,0x35,0x11,0x23,
-0x35,0x33,0x11,0x01,0x77,0x01,0x7b,0xfe,0x85,0x25,0x26,0x73,0xbd,0xbd,0xd5,0xa2,
-0x87,0x87,0x05,0x9e,0xfe,0xc2,0x8f,0xfb,0xf7,0x89,0x27,0x27,0x9a,0x9e,0xd3,0x04,
-0x09,0x8f,0x01,0x3e,0x00,0x02,0x00,0x00,0xff,0xe3,0x05,0x12,0x04,0x60,0x00,0x17,
-0x00,0x21,0x00,0x00,0x11,0x35,0x33,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x15,
-0x23,0x11,0x23,0x35,0x06,0x07,0x06,0x23,0x22,0x26,0x3d,0x01,0x29,0x01,0x15,0x14,
-0x17,0x16,0x33,0x32,0x37,0x36,0xae,0xb8,0x02,0x3a,0xb8,0xba,0xba,0xb8,0x43,0x59,
-0x58,0x75,0xc1,0xc8,0x02,0xf1,0xfd,0xc7,0x3e,0x3e,0x7c,0x95,0x57,0x4d,0x01,0xc4,
-0xa4,0x01,0xf8,0xfe,0x08,0x01,0xf8,0xfe,0x08,0xa4,0xfe,0x3c,0xac,0x66,0x32,0x31,
-0xf0,0xe7,0x0a,0x03,0x9f,0x50,0x4f,0x5f,0x55,0x00,0x00,0x01,0x00,0x71,0xff,0xe2,
-0x04,0x84,0x04,0x60,0x00,0x23,0x00,0x00,0x13,0x35,0x21,0x15,0x06,0x07,0x06,0x15,
-0x14,0x16,0x20,0x37,0x36,0x35,0x34,0x27,0x26,0x27,0x35,0x21,0x15,0x23,0x16,0x17,
-0x16,0x15,0x14,0x00,0x20,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x71,0x01,0xba,0x6d,
-0x3f,0x42,0xb0,0x01,0x20,0x58,0x58,0x42,0x47,0x64,0x01,0xb4,0xec,0x72,0x38,0x36,
-0xfe,0xe4,0xfe,0x3e,0x8e,0x8e,0x34,0x35,0x77,0x03,0xbc,0xa4,0xdc,0x45,0x69,0x6f,
-0x87,0x9f,0xc2,0x61,0x62,0x9e,0x92,0x64,0x6f,0x3f,0xdc,0xa4,0x64,0x71,0x6e,0x88,
-0xeb,0xfe,0xdc,0x91,0x92,0xe4,0x93,0x6b,0x6d,0x68,0x00,0x01,0x00,0xc1,0x00,0x00,
-0x04,0x5c,0x04,0x60,0x00,0x1f,0x00,0x00,0x01,0x21,0x31,0x16,0x17,0x16,0x15,0x14,
-0x00,0x2b,0x01,0x22,0x27,0x26,0x35,0x11,0x33,0x11,0x14,0x17,0x16,0x3f,0x01,0x32,
-0x37,0x36,0x35,0x34,0x27,0x26,0x27,0x26,0x02,0x3a,0x01,0x42,0x72,0x38,0x36,0xfe,
-0xe4,0xe1,0x46,0xb5,0x52,0x51,0xb8,0x26,0x28,0x67,0x33,0x90,0x58,0x58,0x42,0x4f,
-0x5c,0x4c,0x03,0xda,0x64,0x71,0x6e,0x88,0xeb,0xfe,0xdc,0x60,0x60,0xd6,0x02,0xca,
-0xfd,0x36,0x99,0x31,0x32,0x02,0x01,0x61,0x62,0x9e,0x92,0x64,0x77,0x37,0x2c,0x00,
-0x00,0x01,0x00,0x3d,0x00,0x00,0x04,0x7f,0x04,0x60,0x00,0x06,0x00,0x00,0x21,0x23,
-0x09,0x01,0x23,0x01,0x33,0x04,0x7f,0xc3,0xfe,0xa2,0xfe,0xa2,0xc3,0x01,0xa4,0xfa,
-0x03,0xac,0xfc,0x54,0x04,0x60,0x00,0x01,0x00,0x56,0x00,0x00,0x06,0x35,0x04,0x60,
-0x00,0x0c,0x00,0x00,0x21,0x23,0x0b,0x01,0x23,0x0b,0x01,0x23,0x01,0x33,0x1b,0x01,
-0x33,0x06,0x35,0xb8,0xe6,0xe5,0xd9,0xe6,0xe5,0xb8,0x01,0x25,0xd9,0xf1,0xf2,0xd9,
-0x03,0x6a,0xfc,0x96,0x03,0x6a,0xfc,0x96,0x04,0x60,0xfc,0x6a,0x03,0x96,0x00,0x01,
-0x00,0x3d,0x00,0x00,0x04,0x7f,0x06,0x0a,0x00,0x0f,0x00,0x00,0x01,0x3e,0x01,0x3b,
-0x01,0x15,0x23,0x22,0x06,0x0f,0x01,0x01,0x23,0x09,0x01,0x23,0x02,0x29,0x4e,0x94,
-0x7c,0x93,0x6c,0x4c,0x54,0x33,0x21,0x01,0xc5,0xc3,0xfe,0xa2,0xfe,0xa2,0xc3,0x04,
-0xc8,0xc8,0x7a,0x9a,0x48,0x86,0x54,0xfb,0xb2,0x03,0x6c,0xfc,0x94,0x00,0x00,0x01,
-0x00,0x66,0x00,0x00,0x04,0x6b,0x04,0x60,0x00,0x08,0x00,0x00,0x13,0x33,0x09,0x01,
-0x33,0x01,0x11,0x23,0x11,0x66,0xd9,0x01,0x25,0x01,0x2e,0xd9,0xfe,0x5d,0xcb,0x04,
-0x60,0xfe,0x38,0x01,0xc8,0xfd,0x90,0xfe,0x10,0x01,0xf0,0x00,0x00,0x01,0x00,0x58,
-0xfe,0x56,0x04,0xbf,0x04,0x60,0x00,0x17,0x00,0x00,0x13,0x21,0x15,0x01,0x21,0x15,
-0x23,0x15,0x14,0x17,0x16,0x3b,0x01,0x15,0x23,0x22,0x27,0x26,0x3d,0x01,0x21,0x35,
-0x01,0x21,0x71,0x03,0x6a,0xfd,0x4c,0x02,0xb4,0x02,0x26,0x26,0x69,0x31,0x46,0xb5,
-0x51,0x52,0xfd,0x37,0x02,0xb4,0xfd,0x65,0x04,0x60,0xa8,0xfc,0xdb,0x93,0x14,0x99,
-0x31,0x30,0x9c,0x60,0x60,0xd6,0x14,0xa8,0x03,0x25,0x00,0x02,0x00,0x58,0xff,0x91,
-0x03,0xdb,0x04,0x60,0x00,0x14,0x00,0x1b,0x00,0x00,0x21,0x06,0x15,0x23,0x34,0x37,
-0x21,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x33,0x12,0x33,0x32,0x17,0x16,0x21,0x27,
-0x33,0x32,0x35,0x34,0x23,0x06,0x02,0x5b,0x03,0x99,0x03,0xfe,0x96,0x02,0xb4,0xfd,
-0x65,0x03,0x6a,0xfd,0x4c,0xaf,0x3c,0xdb,0xe3,0x01,0x01,0xfe,0xb2,0x14,0x14,0xae,
-0x46,0x58,0x33,0x3c,0x3b,0x34,0xa8,0x03,0x25,0x93,0xa8,0xfc,0xdb,0x01,0x20,0xf6,
-0xbd,0x93,0x36,0x5b,0x02,0x00,0x00,0x01,0x00,0x58,0xfe,0x4c,0x04,0x2f,0x04,0x60,
-0x00,0x20,0x00,0x00,0x01,0x32,0x17,0x16,0x17,0x16,0x15,0x14,0x04,0x21,0x22,0x27,
-0x26,0x27,0x35,0x1e,0x01,0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x2b,0x01,0x35,
-0x01,0x21,0x35,0x21,0x15,0x02,0x3c,0x6a,0x80,0x62,0x56,0x51,0xfe,0xd0,0xfe,0xe8,
-0x5e,0x63,0x64,0x6a,0x54,0xc8,0x6d,0xbe,0x63,0x64,0x5c,0x5d,0xa5,0xae,0x01,0xae,
-0xfd,0x65,0x03,0x6a,0x01,0xdc,0x38,0x2a,0x6d,0x68,0x8a,0xdd,0xf2,0x12,0x13,0x25,
-0xc3,0x31,0x32,0x4b,0x4b,0x8f,0x84,0x4b,0x4a,0xa6,0x01,0xf3,0x93,0xa8,0x00,0x02,
-0x00,0x6d,0xfe,0x4c,0x04,0x6c,0x04,0x60,0x00,0x23,0x00,0x2c,0x00,0x00,0x01,0x20,
-0x37,0x36,0x05,0x16,0x17,0x36,0x35,0x34,0x27,0x26,0x2b,0x01,0x35,0x01,0x21,0x35,
-0x21,0x15,0x01,0x32,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x16,0x15,0x23,0x34,0x27,
-0x07,0x06,0x37,0x26,0x23,0x22,0x07,0x14,0x33,0x32,0x37,0x01,0xe7,0xfe,0xb1,0x02,
-0x02,0x01,0x2a,0xf6,0x9e,0x0c,0x5c,0x5e,0xa4,0xae,0x01,0xae,0xfd,0x65,0x03,0x6a,
-0xfe,0x65,0x69,0x81,0x64,0x54,0x51,0x27,0x64,0x99,0x28,0x14,0x97,0x09,0x7d,0xc5,
-0x83,0x01,0x9e,0xbe,0x63,0xfe,0x4c,0xbd,0xfb,0x05,0x04,0x3b,0x2a,0x31,0x85,0x4a,
-0x4a,0xa6,0x01,0xf3,0x93,0xa8,0xfe,0x24,0x38,0x2b,0x6c,0x67,0x8b,0x71,0x55,0x65,
-0xa4,0x52,0x38,0x11,0x79,0xfa,0x2a,0x4b,0x2f,0x4b,0x00,0x01,0x00,0x58,0x00,0x00,
-0x03,0xa5,0x06,0x12,0x00,0x1c,0x00,0x00,0x01,0x33,0x32,0x37,0x36,0x35,0x26,0x27,
-0x26,0x23,0x22,0x07,0x06,0x07,0x35,0x36,0x37,0x36,0x33,0x20,0x17,0x16,0x15,0x14,
-0x07,0x06,0x07,0x11,0x23,0x01,0x54,0x3f,0xc0,0x56,0x3a,0x01,0x39,0x63,0xb3,0x50,
-0x4f,0x4e,0x4e,0x4c,0x51,0x51,0x55,0x01,0x13,0x8a,0x6d,0x6c,0x70,0xaa,0xca,0x03,
-0x1e,0x72,0x4c,0x62,0x85,0x41,0x72,0x16,0x15,0x2b,0xac,0x23,0x11,0x12,0x9d,0x7d,
-0xba,0xaa,0x73,0x77,0x1e,0xfd,0x74,0x00,0x00,0x01,0x00,0x58,0x00,0x00,0x03,0xa5,
-0x06,0x12,0x00,0x1c,0x00,0x00,0x01,0x11,0x23,0x11,0x26,0x27,0x26,0x35,0x34,0x37,
-0x36,0x21,0x32,0x17,0x16,0x17,0x15,0x26,0x27,0x26,0x23,0x22,0x07,0x06,0x07,0x14,
-0x17,0x16,0x33,0x02,0xa8,0xca,0xaa,0x70,0x6c,0x6e,0x89,0x01,0x13,0x55,0x51,0x51,
-0x4c,0x4e,0x4f,0x4e,0x50,0xb3,0x63,0x39,0x01,0x3a,0x56,0xc0,0x03,0x1e,0xfc,0xe2,
-0x02,0x8c,0x1e,0x77,0x73,0xaa,0xba,0x7d,0x9d,0x12,0x11,0x23,0xac,0x2b,0x15,0x16,
-0x72,0x41,0x85,0x62,0x4c,0x72,0x00,0x01,0x00,0x58,0x00,0x00,0x03,0xa5,0x06,0x12,
-0x00,0x1c,0x00,0x00,0x01,0x13,0x33,0x11,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x21,
-0x22,0x27,0x26,0x27,0x35,0x16,0x17,0x16,0x33,0x32,0x37,0x36,0x37,0x34,0x27,0x26,
-0x23,0x01,0x54,0x01,0xca,0xaa,0x70,0x6c,0x6d,0x8a,0xfe,0xed,0x55,0x51,0x51,0x4c,
-0x4e,0x4e,0x4f,0x50,0xb3,0x63,0x39,0x01,0x3a,0x56,0xc0,0x02,0xf4,0x03,0x1e,0xfd,
-0x74,0x1e,0x77,0x73,0xaa,0xba,0x7d,0x9d,0x12,0x11,0x23,0xac,0x2b,0x15,0x16,0x72,
-0x41,0x85,0x62,0x4c,0x72,0x00,0x00,0x01,0x00,0x58,0xfe,0x4c,0x03,0xa5,0x06,0x14,
-0x00,0x23,0x00,0x00,0x13,0x34,0x37,0x36,0x21,0x32,0x17,0x16,0x17,0x15,0x26,0x27,
-0x26,0x23,0x22,0x07,0x06,0x07,0x11,0x16,0x17,0x16,0x33,0x32,0x37,0x36,0x37,0x15,
-0x06,0x07,0x06,0x23,0x20,0x27,0x26,0x35,0x58,0x6e,0x89,0x01,0x13,0x55,0x51,0x51,
-0x4c,0x4e,0x4f,0x4e,0x50,0xb3,0x63,0x39,0x01,0x01,0x39,0x63,0xb3,0x50,0x4e,0x4f,
-0x4e,0x4c,0x51,0x51,0x55,0xfe,0xed,0x89,0x6e,0x04,0x40,0xba,0x7d,0x9d,0x12,0x11,
-0x23,0xac,0x2b,0x15,0x16,0x72,0x41,0x85,0xfb,0xe0,0x85,0x41,0x72,0x16,0x15,0x2b,
-0xac,0x23,0x11,0x12,0x9d,0x7d,0xba,0x00,0x00,0x03,0x00,0x5e,0x00,0x2d,0x04,0x74,
-0x04,0x42,0x00,0x0d,0x00,0x1b,0x00,0x29,0x00,0x00,0x01,0x14,0x17,0x16,0x20,0x36,
-0x35,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x07,0x34,0x37,0x36,0x33,0x32,0x17,0x16,
-0x15,0x14,0x00,0x20,0x27,0x26,0x25,0x34,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x14,
-0x06,0x22,0x27,0x26,0x01,0x14,0x66,0x64,0x01,0x1a,0xc6,0x64,0x66,0x8a,0x8c,0x64,
-0x66,0xb5,0x9a,0x9a,0xd8,0xd4,0x9a,0x9a,0xfe,0xd1,0xfe,0x4f,0x9a,0x9a,0x01,0x99,
-0x22,0x20,0x30,0x2e,0x22,0x20,0x42,0x5e,0x20,0x22,0x02,0x36,0x8d,0x63,0x63,0xc6,
-0x8d,0x8a,0x66,0x66,0x66,0x66,0x8b,0xd4,0x9c,0x9d,0x9d,0x9c,0xd4,0xd8,0xfe,0xd0,
-0x98,0x98,0xda,0x2e,0x22,0x22,0x22,0x22,0x2e,0x2f,0x42,0x21,0x21,0x00,0xff,0xff,
-0x00,0xba,0x00,0x00,0x04,0x3e,0x04,0x60,0x10,0x06,0x03,0xaa,0x00,0x00,0x00,0x02,
-0x00,0x71,0xff,0xd5,0x05,0x09,0x04,0x79,0x00,0x15,0x00,0x2b,0x00,0x00,0x01,0x22,
-0x07,0x06,0x14,0x17,0x16,0x3b,0x01,0x15,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,
-0x33,0x24,0x13,0x02,0x27,0x04,0x11,0x10,0x05,0x06,0x27,0x22,0x27,0x26,0x35,0x34,
-0x36,0x37,0x2e,0x01,0x35,0x34,0x37,0x36,0x33,0x32,0x02,0x75,0x9a,0x4c,0x55,0x4f,
-0x2b,0xb9,0xb6,0xb6,0xb9,0x2b,0x4f,0x55,0x49,0x9d,0x01,0xc4,0x01,0x01,0x9f,0x01,
-0x6f,0xfe,0x91,0x73,0xc4,0xe6,0x86,0x86,0x8e,0x83,0x83,0x8e,0x86,0x86,0xe6,0xc8,
-0x03,0xd8,0x36,0x3d,0x9a,0x37,0x1e,0x9d,0x1e,0x36,0x4e,0x4a,0x40,0x36,0x01,0x01,
-0xbe,0x01,0xa2,0x73,0x97,0xfe,0x78,0xfe,0xa8,0xc2,0x3e,0x02,0x57,0x56,0x94,0x67,
-0x8e,0x1c,0x1b,0x8e,0x67,0x94,0x57,0x56,0x00,0x01,0x00,0x71,0x00,0x00,0x05,0xd1,
-0x06,0x12,0x00,0x30,0x00,0x00,0x25,0x11,0x23,0x35,0x21,0x11,0x06,0x07,0x06,0x23,
-0x22,0x27,0x26,0x11,0x10,0x37,0x36,0x21,0x32,0x17,0x16,0x17,0x35,0x34,0x37,0x36,
-0x3b,0x01,0x15,0x23,0x22,0x07,0x06,0x1d,0x01,0x23,0x15,0x26,0x27,0x26,0x23,0x22,
-0x07,0x06,0x10,0x17,0x16,0x33,0x32,0x03,0xa9,0x9b,0x01,0x41,0x48,0x57,0x4e,0xca,
-0xfe,0x94,0x95,0x97,0x96,0x01,0x06,0x3e,0x68,0x20,0x11,0x52,0x51,0xb5,0xfe,0xe9,
-0x6a,0x25,0x26,0x02,0x79,0x6e,0x55,0x49,0xb3,0x63,0x63,0x63,0x63,0xb3,0xaf,0xb2,
-0x01,0x1a,0x8c,0xfd,0xf0,0x22,0x14,0x12,0x9f,0xa0,0x01,0x0d,0x01,0x12,0x9d,0x9d,
-0x12,0x06,0x05,0x01,0xd7,0x5f,0x60,0x9c,0x30,0x32,0x98,0x94,0x6a,0x4d,0x1b,0x16,
-0x72,0x70,0xfe,0x64,0x70,0x72,0xff,0xff,0x00,0xc1,0x00,0x00,0x04,0x88,0x04,0x60,
-0x10,0x06,0x03,0xb5,0x00,0x00,0x00,0x03,0xfe,0xf2,0xfe,0x56,0x02,0x2e,0x06,0x14,
-0x00,0x03,0x00,0x12,0x00,0x1b,0x00,0x00,0x13,0x33,0x15,0x23,0x03,0x20,0x35,0x34,
-0x21,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x06,0x07,0x06,0x03,0x23,0x22,0x17,0x16,
-0x33,0x32,0x37,0x36,0xc1,0xb8,0xb8,0xa0,0xfe,0xd1,0x01,0x0e,0xc1,0xb8,0xb5,0xbf,
-0x12,0x35,0x52,0x20,0xb5,0x77,0x03,0x04,0x7b,0x69,0x26,0x12,0x06,0x14,0xe9,0xf9,
-0x2b,0xdd,0xcd,0x04,0x60,0xfb,0xa0,0x9b,0x70,0x3f,0x60,0x01,0x10,0x33,0x41,0x30,
-0x17,0x00,0x00,0x01,0x00,0xba,0xfe,0x4c,0x04,0x9c,0x04,0x60,0x00,0x0a,0x00,0x00,
-0x01,0x23,0x11,0x01,0x23,0x09,0x01,0x33,0x01,0x11,0x33,0x04,0x9c,0xb9,0xfd,0xdb,
-0xeb,0x02,0x52,0xfd,0x95,0xf0,0x02,0x39,0xb9,0xfe,0x4c,0x03,0x97,0xfe,0x1d,0x02,
-0x0c,0x02,0x54,0xfd,0xdd,0x02,0x23,0x00,0x00,0x01,0x00,0xb3,0x00,0x00,0x03,0xfc,
-0x04,0x60,0x00,0x05,0x00,0x00,0x13,0x33,0x11,0x21,0x15,0x21,0xb3,0xca,0x02,0x7f,
-0xfc,0xb7,0x04,0x60,0xfc,0x4a,0xaa,0x00,0x00,0x02,0x00,0x71,0xfe,0x56,0x05,0xf8,
-0x06,0x12,0x00,0x21,0x00,0x2d,0x00,0x00,0x25,0x06,0x07,0x06,0x23,0x22,0x27,0x26,
-0x10,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x3d,0x02,0x34,0x37,0x36,0x3b,0x01,0x15,
-0x23,0x22,0x07,0x06,0x1d,0x02,0x11,0x23,0x00,0x10,0x17,0x16,0x20,0x37,0x36,0x10,
-0x27,0x26,0x20,0x07,0x03,0xa2,0x3a,0x58,0x59,0x7c,0xcb,0x80,0x7f,0x7f,0x80,0xcb,
-0x7c,0x59,0x58,0x3a,0x52,0x51,0xb5,0xfe,0xe9,0x69,0x26,0x26,0xb8,0xfd,0x8d,0x53,
-0x54,0x01,0x24,0x54,0x54,0x54,0x54,0xfe,0xdc,0x54,0xa8,0x64,0x30,0x31,0xa2,0xa2,
-0x02,0x10,0xa2,0xa2,0x31,0x30,0x64,0x32,0x78,0x1c,0xd6,0x60,0x60,0x9c,0x30,0x31,
-0x99,0x1c,0x78,0xfa,0x6e,0x04,0xa4,0xfe,0x6a,0x74,0x73,0x73,0x74,0x01,0x96,0x74,
-0x73,0x73,0x00,0x01,0x00,0x58,0x00,0x00,0x03,0xa5,0x06,0x12,0x00,0x24,0x00,0x00,
-0x01,0x33,0x32,0x37,0x36,0x35,0x26,0x27,0x26,0x23,0x22,0x07,0x06,0x07,0x35,0x36,
-0x37,0x36,0x33,0x20,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x15,0x33,0x15,0x23,0x11,
-0x23,0x11,0x23,0x35,0x33,0x01,0x54,0x3f,0xc0,0x56,0x3a,0x01,0x39,0x63,0xb3,0x50,
-0x4f,0x4e,0x4e,0x4c,0x51,0x51,0x55,0x01,0x13,0x8a,0x6d,0x6c,0x70,0xaa,0xe7,0xe7,
-0xca,0xe5,0xe4,0x03,0x1e,0x72,0x4c,0x62,0x85,0x41,0x72,0x16,0x15,0x2b,0xac,0x23,
-0x11,0x12,0x9d,0x7d,0xba,0xaa,0x73,0x77,0x1e,0xd4,0xa4,0xfe,0xec,0x01,0x14,0xa4,
-0x00,0x01,0x00,0x58,0x00,0x00,0x03,0xa5,0x06,0x12,0x00,0x24,0x00,0x00,0x01,0x35,
-0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x21,0x32,0x17,0x16,0x17,0x15,0x26,0x27,0x26,
-0x23,0x22,0x07,0x06,0x07,0x14,0x17,0x16,0x3b,0x01,0x11,0x33,0x15,0x23,0x11,0x23,
-0x11,0x23,0x35,0x01,0xde,0xaa,0x70,0x6c,0x6e,0x89,0x01,0x13,0x55,0x51,0x51,0x4c,
-0x4e,0x4f,0x4e,0x50,0xb3,0x63,0x39,0x01,0x3a,0x56,0xc0,0x3e,0xe5,0xe5,0xca,0xe7,
-0x01,0xb8,0xd4,0x1e,0x77,0x73,0xaa,0xba,0x7d,0x9d,0x12,0x11,0x23,0xac,0x2b,0x15,
-0x16,0x72,0x41,0x85,0x62,0x4c,0x72,0xfe,0x9a,0xa4,0xfe,0xec,0x01,0x14,0xa4,0x00,
-0x00,0x03,0x00,0x71,0xff,0xe3,0x07,0xc3,0x06,0x14,0x00,0x0b,0x00,0x26,0x00,0x29,
-0x00,0x00,0x00,0x10,0x17,0x16,0x20,0x37,0x36,0x10,0x27,0x26,0x20,0x07,0x25,0x11,
-0x33,0x11,0x21,0x15,0x01,0x21,0x15,0x21,0x2b,0x01,0x35,0x06,0x07,0x06,0x23,0x22,
-0x27,0x26,0x10,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x11,0x01,0x01,0x2f,0x53,0x54,
-0x01,0x24,0x54,0x54,0x54,0x54,0xfe,0xdc,0x54,0x02,0x20,0xb8,0x03,0x69,0xfd,0x4c,
-0x02,0xb4,0xfc,0x97,0x1a,0x9e,0x3a,0x58,0x59,0x7c,0xcb,0x80,0x7f,0x7f,0x80,0xcb,
-0x7c,0x59,0x58,0xf2,0x02,0x9a,0x02,0xfa,0xfe,0x6a,0x74,0x73,0x73,0x74,0x01,0x96,
-0x74,0x73,0x73,0x48,0x02,0x5e,0xfe,0x4c,0xa8,0xfc,0xdb,0x93,0xa8,0x64,0x30,0x31,
-0xa2,0xa2,0x02,0x10,0xa2,0xa2,0x31,0x30,0x4d,0xfc,0xf9,0x03,0x07,0x00,0x00,0x02,
-0x00,0x71,0xfe,0x4c,0x08,0x1c,0x06,0x14,0x00,0x30,0x00,0x38,0x00,0x00,0x01,0x11,
-0x23,0x35,0x0e,0x01,0x23,0x22,0x02,0x10,0x00,0x33,0x32,0x16,0x17,0x11,0x33,0x11,
-0x21,0x15,0x01,0x32,0x17,0x16,0x17,0x16,0x15,0x14,0x04,0x21,0x22,0x27,0x26,0x27,
-0x35,0x1e,0x01,0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x2b,0x01,0x35,0x01,0x04,
-0x10,0x16,0x20,0x36,0x10,0x26,0x20,0x04,0x5a,0xb8,0x3a,0xb1,0x7c,0xcb,0xff,0x00,
-0xff,0xcb,0x7c,0xb1,0x3a,0xb8,0x03,0x6a,0xfe,0x65,0x6a,0x80,0x62,0x56,0x51,0xfe,
-0xd0,0xfe,0xe8,0x5e,0x63,0x64,0x6a,0x54,0xc8,0x6d,0xbe,0x63,0x64,0x5c,0x5d,0xa5,
-0xae,0x01,0xae,0xfa,0x3a,0xa7,0x01,0x24,0xa8,0xa8,0xfe,0xdc,0x03,0xcd,0xfc,0x33,
-0xa8,0x64,0x61,0x01,0x44,0x02,0x10,0x01,0x44,0x61,0x64,0x02,0x5e,0xfe,0x4c,0xa8,
-0xfe,0x24,0x38,0x2a,0x6d,0x68,0x8a,0xdd,0xf2,0x12,0x13,0x25,0xc3,0x31,0x32,0x4b,
-0x4b,0x8f,0x84,0x4b,0x4a,0xa6,0x01,0xf3,0xd3,0xfe,0x6a,0xe7,0xe7,0x01,0x96,0xe7,
-0x00,0x04,0x00,0x71,0xff,0x91,0x07,0xc2,0x06,0x14,0x00,0x07,0x00,0x0a,0x00,0x2b,
-0x00,0x32,0x00,0x00,0x00,0x10,0x16,0x20,0x36,0x10,0x26,0x20,0x05,0x11,0x01,0x25,
-0x21,0x15,0x01,0x33,0x12,0x33,0x32,0x17,0x16,0x21,0x23,0x06,0x15,0x23,0x34,0x37,
-0x21,0x23,0x35,0x0e,0x01,0x23,0x22,0x02,0x10,0x00,0x33,0x32,0x16,0x17,0x11,0x33,
-0x01,0x33,0x32,0x35,0x34,0x23,0x06,0x01,0x2f,0xa7,0x01,0x24,0xa8,0xa8,0xfe,0xdc,
-0x02,0x84,0x02,0x99,0xfd,0x67,0x03,0x68,0xfd,0x4c,0xaf,0x3c,0xdb,0xe3,0x01,0x01,
-0xfe,0xb2,0x29,0x03,0x99,0x03,0xfe,0x96,0x9d,0x3a,0xb1,0x7c,0xcb,0xff,0x00,0xff,
-0xcb,0x7c,0xb1,0x3a,0xb8,0x01,0xfd,0x14,0xae,0x46,0x58,0x02,0xfa,0xfe,0x6a,0xe7,
-0xe7,0x01,0x96,0xe7,0x14,0xfc,0xfa,0x03,0x06,0x93,0xa8,0xfc,0xdb,0x01,0x20,0xf6,
-0xbd,0x33,0x3c,0x3b,0x34,0xa8,0x64,0x61,0x01,0x44,0x02,0x10,0x01,0x44,0x61,0x64,
-0x02,0x5e,0xfa,0x7f,0x36,0x5b,0x02,0x00,0x00,0x01,0x00,0x37,0xff,0xe3,0x06,0x40,
-0x05,0x9e,0x00,0x3f,0x00,0x00,0x01,0x15,0x2e,0x01,0x23,0x22,0x06,0x15,0x14,0x17,
-0x16,0x1f,0x01,0x16,0x17,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x26,0x27,0x15,0x23,
-0x22,0x26,0x35,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0x21,0x15,0x21,0x11,0x14,0x16,
-0x3b,0x01,0x35,0x1e,0x01,0x33,0x32,0x36,0x35,0x34,0x27,0x26,0x2f,0x01,0x2e,0x01,
-0x35,0x34,0x36,0x33,0x32,0x16,0x06,0x04,0x4e,0xa8,0x5a,0x89,0x89,0x31,0x31,0x94,
-0x3f,0xc6,0x51,0x52,0xf7,0xd8,0x5a,0x61,0x5d,0x67,0xbd,0xd5,0xa2,0x87,0x87,0xb9,
-0x01,0x7b,0xfe,0x85,0x4b,0x73,0xb3,0x66,0xc6,0x61,0x82,0x8c,0x33,0x2c,0xb1,0x40,
-0xab,0x98,0xe0,0xce,0x66,0xb4,0x04,0x3f,0xae,0x28,0x28,0x54,0x54,0x40,0x25,0x24,
-0x21,0x0e,0x2c,0x4b,0x4c,0x89,0x9c,0xb6,0x11,0x11,0x21,0x26,0x9f,0xd2,0x02,0x60,
-0x8f,0x01,0x3e,0xfe,0xc2,0x8f,0xfd,0xa0,0x89,0x4e,0x4d,0x35,0x35,0x59,0x51,0x4b,
-0x28,0x24,0x29,0x0f,0x24,0x95,0x82,0x9e,0xac,0x1e,0x00,0x02,0x00,0x37,0xfe,0x56,
-0x05,0x08,0x06,0x14,0x00,0x25,0x00,0x2d,0x00,0x00,0x01,0x11,0x21,0x34,0x35,0x34,
-0x37,0x36,0x3b,0x01,0x15,0x23,0x22,0x07,0x06,0x15,0x13,0x14,0x07,0x06,0x2b,0x01,
-0x35,0x33,0x32,0x37,0x36,0x3d,0x01,0x23,0x22,0x26,0x35,0x11,0x23,0x35,0x33,0x11,
-0x01,0x02,0x11,0x21,0x11,0x14,0x16,0x33,0x01,0x77,0x01,0x78,0x57,0x51,0xc3,0xae,
-0xb0,0x63,0x26,0x27,0x02,0x51,0x52,0xb5,0x46,0x31,0x69,0x26,0x26,0xbd,0xd5,0xa2,
-0x87,0x87,0x02,0x33,0x02,0xfe,0x88,0x4b,0x73,0x05,0x9e,0xfe,0xc2,0x27,0x27,0xb5,
-0x5b,0x56,0x99,0x28,0x28,0x68,0xfb,0x29,0xd6,0x60,0x60,0x9c,0x30,0x31,0x99,0x14,
-0x9f,0xd2,0x02,0x60,0x8f,0x01,0x3e,0xfa,0xfc,0x01,0xa2,0x01,0x95,0xfd,0xa0,0x89,
-0x4e,0x00,0x00,0x03,0x00,0x37,0xff,0x70,0x05,0xca,0x05,0x9e,0x00,0x2c,0x00,0x38,
-0x00,0x42,0x00,0x00,0x01,0x11,0x21,0x15,0x36,0x21,0x32,0x17,0x16,0x17,0x15,0x26,
-0x27,0x26,0x23,0x22,0x07,0x06,0x10,0x1f,0x01,0x36,0x33,0x20,0x17,0x14,0x07,0x06,
-0x23,0x22,0x27,0x06,0x15,0x07,0x34,0x37,0x21,0x22,0x26,0x35,0x11,0x23,0x35,0x33,
-0x11,0x01,0x16,0x33,0x32,0x37,0x36,0x27,0x26,0x23,0x22,0x07,0x06,0x05,0x26,0x35,
-0x10,0x37,0x21,0x11,0x14,0x16,0x33,0x01,0x77,0x01,0x7b,0x95,0x00,0xff,0x55,0x51,
-0x51,0x4c,0x4e,0x4f,0x4e,0x50,0xb3,0x63,0x63,0x63,0x08,0x4f,0xce,0x01,0x2b,0x01,
-0x65,0x4b,0x9d,0x54,0x49,0x02,0x99,0x06,0xfe,0xeb,0xd5,0xa2,0x87,0x87,0x03,0x3b,
-0x42,0x53,0x5f,0x15,0x1f,0x01,0x01,0x83,0x72,0x28,0x05,0xfe,0xd6,0x80,0x8b,0xfe,
-0x99,0x4b,0x73,0x05,0x9e,0xfe,0xc2,0x7a,0x95,0x11,0x12,0x23,0xac,0x2b,0x16,0x15,
-0x71,0x72,0xfe,0x66,0x72,0x09,0xab,0xf6,0x76,0x29,0x1e,0x12,0x32,0x4c,0x03,0x4f,
-0x41,0x9f,0xd2,0x02,0x60,0x8f,0x01,0x3e,0xfa,0xf9,0x18,0x07,0x0b,0x27,0x4b,0x56,
-0x0a,0x09,0x9d,0xf8,0x01,0x07,0x9b,0xfd,0xa0,0x89,0x4e,0x00,0x00,0x01,0x00,0x2f,
-0xfe,0x56,0x06,0x6f,0x06,0x14,0x00,0x33,0x00,0x00,0x01,0x11,0x14,0x07,0x06,0x2b,
-0x01,0x35,0x33,0x32,0x37,0x36,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,
-0x11,0x21,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x3b,0x01,0x15,0x23,0x22,
-0x06,0x1d,0x01,0x21,0x3b,0x01,0x15,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x06,0x6f,
-0x52,0x51,0xb5,0xfe,0xe9,0x69,0x26,0x26,0x7c,0x7c,0x95,0xac,0xb9,0xfe,0xd3,0xb9,
-0xb0,0xb0,0xae,0xbd,0xae,0xb0,0x63,0x4d,0x01,0x2d,0x02,0xb7,0x42,0x59,0x5a,0x75,
-0xc1,0x63,0x63,0x02,0xa4,0xfd,0x48,0xd6,0x60,0x60,0x9c,0x30,0x31,0x99,0x02,0xb2,
-0x9f,0x9e,0xbe,0xa4,0xfd,0x87,0x03,0xd1,0xfc,0x2f,0x03,0xd1,0x8f,0x4e,0xbb,0xab,
-0x99,0x50,0x68,0x63,0xae,0x65,0x32,0x32,0x77,0x78,0x00,0x02,0x00,0xc1,0xff,0xe3,
-0x04,0xc9,0x06,0x14,0x00,0x21,0x00,0x31,0x00,0x00,0x01,0x15,0x2e,0x01,0x23,0x22,
-0x06,0x15,0x14,0x17,0x16,0x1f,0x01,0x16,0x17,0x16,0x15,0x14,0x06,0x23,0x22,0x27,
-0x26,0x27,0x15,0x23,0x11,0x33,0x11,0x34,0x36,0x33,0x32,0x16,0x01,0x11,0x16,0x17,
-0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x26,0x2f,0x01,0x2e,0x01,0x04,0x8d,0x4e,0xa8,
-0x5a,0x89,0x89,0x31,0x31,0x94,0x3f,0xc6,0x50,0x53,0xf7,0xd8,0x5a,0x62,0x5d,0x68,
-0xb8,0xb8,0xe0,0xce,0x66,0xb4,0xfd,0x38,0x62,0x5f,0x63,0x61,0x82,0x8c,0x32,0x2d,
-0xb1,0x40,0xab,0x98,0x04,0x3f,0xae,0x28,0x28,0x54,0x54,0x40,0x25,0x24,0x21,0x0e,
-0x2c,0x4b,0x4c,0x89,0x9c,0xb6,0x11,0x11,0x21,0x26,0x06,0x14,0xfd,0x1d,0x9e,0xac,
-0x1e,0xfe,0xd4,0xfd,0xb2,0x32,0x19,0x1b,0x59,0x51,0x4b,0x28,0x24,0x29,0x0f,0x24,
-0x95,0x00,0x00,0x02,0x00,0xc1,0x00,0x00,0x04,0xe2,0x06,0x14,0x00,0x0a,0x00,0x0d,
-0x00,0x00,0x13,0x33,0x11,0x21,0x15,0x01,0x21,0x15,0x21,0x2b,0x01,0x13,0x11,0x01,
-0xc1,0xb8,0x03,0x69,0xfd,0x4c,0x02,0xb4,0xfc,0x97,0x1a,0x9e,0xb8,0x02,0x9a,0x06,
-0x14,0xfe,0x4c,0xa8,0xfc,0xdb,0x93,0x03,0xcd,0xfc,0xf9,0x03,0x07,0x00,0x00,0x02,
-0x00,0x36,0xff,0xe2,0x03,0xea,0x05,0x20,0x00,0x0c,0x00,0x19,0x00,0x00,0x13,0x33,
-0x1b,0x01,0x33,0x1b,0x01,0x33,0x03,0x23,0x0b,0x01,0x23,0x03,0x33,0x1b,0x01,0x33,
-0x1b,0x01,0x33,0x03,0x23,0x0b,0x01,0x23,0x36,0x74,0x91,0x90,0x89,0x91,0x90,0x74,
-0xb9,0x88,0x98,0x99,0x88,0xb9,0x74,0x91,0x90,0x89,0x91,0x90,0x74,0xb9,0x88,0x98,
-0x99,0x88,0x02,0x55,0xfe,0x17,0x01,0xe9,0xfe,0x17,0x01,0xe9,0xfd,0x8d,0x02,0x02,
-0xfd,0xfe,0x05,0x3d,0xfe,0x17,0x01,0xe9,0xfe,0x17,0x01,0xe9,0xfd,0x8d,0x02,0x02,
-0xfd,0xfe,0x00,0x02,0x00,0x36,0x00,0xad,0x03,0xe9,0x05,0x1f,0x00,0x07,0x00,0x0f,
-0x00,0x00,0x13,0x21,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x21,
-0x11,0x23,0x36,0x03,0xb3,0x8f,0xfd,0x6b,0x8f,0x03,0xb3,0x8f,0xfd,0x6b,0x8f,0x02,
-0x55,0xfe,0x58,0x01,0x05,0xfe,0xfb,0x04,0x72,0xfe,0x58,0x01,0x05,0xfe,0xfb,0x00,
-0x00,0x01,0x00,0x00,0xfe,0x4a,0x04,0x90,0x06,0x14,0x00,0x21,0x00,0x00,0x01,0x14,
-0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x23,0x11,0x06,0x07,0x06,0x23,0x22,0x27,
-0x26,0x35,0x11,0x35,0x34,0x27,0x26,0x2b,0x01,0x35,0x33,0x32,0x17,0x16,0x1d,0x01,
-0x01,0x9e,0x7c,0x7c,0x95,0xac,0xb9,0xb9,0x42,0x59,0x5a,0x75,0xc1,0x63,0x63,0x26,
-0x26,0x69,0x31,0x46,0xb5,0x51,0x52,0x01,0xc0,0x9f,0x9e,0xbe,0xa4,0x02,0x79,0xf9,
-0xec,0x02,0x62,0x65,0x32,0x32,0x77,0x78,0xe8,0x02,0xa4,0x20,0x99,0x31,0x30,0x9c,
-0x60,0x60,0xd6,0x20,0x00,0x01,0x00,0x00,0xfe,0x56,0x05,0x76,0x06,0x14,0x00,0x2c,
-0x00,0x00,0x21,0x35,0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x11,0x35,0x34,0x27,
-0x26,0x2b,0x01,0x35,0x33,0x32,0x17,0x16,0x1d,0x01,0x11,0x14,0x16,0x33,0x32,0x36,
-0x35,0x11,0x33,0x11,0x06,0x17,0x16,0x3b,0x01,0x15,0x23,0x22,0x27,0x26,0x27,0x03,
-0xd7,0x42,0x59,0x5a,0x75,0xc1,0x63,0x63,0x26,0x26,0x69,0x31,0x46,0xb5,0x51,0x52,
-0x7c,0x7c,0x95,0xac,0xb9,0x04,0x2a,0x26,0x68,0x32,0x46,0xb6,0x52,0x4b,0x05,0xac,
-0x65,0x32,0x32,0x77,0x78,0xe8,0x02,0xa4,0x20,0x99,0x31,0x30,0x9c,0x60,0x60,0xd6,
-0x20,0xfd,0x62,0x9f,0x9e,0xbe,0xa4,0x02,0x79,0xfb,0x8e,0x94,0x36,0x30,0x9c,0x60,
-0x59,0xdd,0x00,0x01,0x00,0x75,0x02,0x9c,0x02,0xc4,0x06,0x03,0x00,0x17,0x00,0x00,
-0x01,0x11,0x23,0x11,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x11,0x23,0x11,0x33,
-0x11,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x02,0xc4,0x74,0x27,0x27,0x4e,0x5e,0x36,
-0x36,0x75,0x75,0x29,0x39,0x38,0x4a,0x79,0x3f,0x3e,0x04,0x17,0xfe,0x85,0x01,0x77,
-0x59,0x2c,0x2d,0x35,0x36,0x5c,0xfe,0x9e,0x03,0x67,0xfe,0xab,0x38,0x1c,0x1c,0x43,
-0x43,0x00,0x00,0x01,0x00,0x75,0x02,0x9b,0x02,0xc4,0x06,0x02,0x00,0x21,0x00,0x00,
-0x13,0x33,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,
-0x22,0x06,0x15,0x11,0x23,0x11,0x35,0x34,0x37,0x36,0x3b,0x01,0x15,0x23,0x22,0x07,
-0x06,0x15,0xe9,0x01,0x29,0x39,0x38,0x4a,0x79,0x3f,0x3e,0x74,0x4e,0x4e,0x5e,0x6c,
-0x75,0x34,0x33,0x72,0xa0,0x93,0x42,0x18,0x18,0x04,0xac,0x39,0x1c,0x1c,0x43,0x43,
-0x82,0xfe,0x86,0x01,0x77,0x59,0x58,0x6a,0x5c,0xfe,0x9e,0x02,0x31,0x53,0x77,0x36,
-0x36,0x57,0x1b,0x1c,0x55,0x00,0x00,0x02,0xff,0xe9,0x01,0xad,0x00,0xee,0x06,0x03,
-0x00,0x0d,0x00,0x11,0x00,0x23,0x40,0x07,0x13,0x0f,0x01,0x08,0x0e,0x00,0x12,0x10,
-0xdc,0x3c,0xcc,0xdc,0x3c,0xcc,0x31,0x00,0x40,0x07,0x0e,0x11,0x00,0x08,0x07,0x00,
-0x12,0x10,0xd4,0xd4,0xcc,0x10,0xdc,0xcc,0x30,0x13,0x33,0x11,0x14,0x07,0x06,0x2b,
-0x01,0x35,0x33,0x32,0x37,0x36,0x35,0x11,0x33,0x15,0x23,0x7a,0x74,0x34,0x33,0x72,
-0x2c,0x1f,0x42,0x18,0x18,0x74,0x74,0x05,0x0f,0xfd,0x82,0x78,0x36,0x36,0x58,0x1b,
-0x1b,0x56,0x03,0x72,0x82,0x00,0x00,0x01,0x00,0x75,0x02,0x9c,0x02,0x12,0x05,0x1e,
-0x00,0x15,0x00,0x00,0x01,0x26,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x11,0x23,0x11,
-0x33,0x15,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x02,0x12,0x13,0x17,0x17,0x1c,
-0x62,0x35,0x34,0x75,0x75,0x24,0x3b,0x3a,0x54,0x0c,0x0f,0x0e,0x12,0x04,0xaf,0x0a,
-0x05,0x04,0x38,0x39,0x6b,0xfe,0xb6,0x02,0x73,0x61,0x39,0x1c,0x1b,0x01,0x01,0x03,
-0x00,0x01,0x00,0x47,0x02,0x8d,0x01,0xe4,0x05,0x0f,0x00,0x15,0x00,0x00,0x13,0x16,
-0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x11,0x33,0x11,0x23,0x35,0x06,0x07,0x06,0x23,
-0x22,0x27,0x26,0x27,0x47,0x14,0x17,0x17,0x1b,0x63,0x34,0x35,0x74,0x74,0x25,0x3a,
-0x3b,0x54,0x0c,0x0e,0x0f,0x11,0x02,0xfc,0x0a,0x05,0x04,0x39,0x38,0x6b,0x01,0x4a,
-0xfd,0x8d,0x61,0x39,0x1b,0x1c,0x01,0x02,0x02,0x00,0x00,0x01,0x00,0x47,0x01,0xad,
-0x02,0x75,0x05,0x0f,0x00,0x20,0x00,0x00,0x13,0x16,0x17,0x16,0x33,0x32,0x37,0x36,
-0x35,0x11,0x33,0x11,0x15,0x14,0x16,0x3b,0x01,0x15,0x23,0x22,0x26,0x3d,0x01,0x23,
-0x35,0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x47,0x14,0x17,0x17,0x1b,0x63,0x34,
-0x35,0x74,0x30,0x42,0x1f,0x2c,0x72,0x66,0x01,0x25,0x3a,0x3c,0x53,0x0c,0x0e,0x0f,
-0x11,0x02,0xfc,0x0a,0x05,0x04,0x39,0x38,0x6b,0x01,0x4a,0xfd,0x8d,0x0b,0x56,0x36,
-0x58,0x6c,0x78,0x0b,0x61,0x39,0x1b,0x1c,0x01,0x02,0x02,0x00,0x00,0x02,0x00,0x20,
-0x02,0x9c,0x02,0x8f,0x05,0x0f,0x00,0x16,0x00,0x21,0x00,0x00,0x01,0x1e,0x01,0x15,
-0x14,0x07,0x06,0x2b,0x01,0x11,0x33,0x11,0x33,0x32,0x37,0x36,0x3f,0x01,0x33,0x07,
-0x06,0x07,0x06,0x01,0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x2b,0x01,0x01,0x9b,
-0x43,0x46,0x43,0x44,0x89,0xf4,0x74,0x6b,0x3d,0x25,0x25,0x28,0x66,0x7b,0x6e,0x21,
-0x21,0x22,0xfe,0xd7,0x7d,0x4b,0x27,0x29,0x29,0x27,0x4b,0x7d,0x03,0xe9,0x0f,0x4e,
-0x3b,0x5b,0x2d,0x2d,0x02,0x73,0xfe,0xf7,0x15,0x14,0x3f,0xa1,0xab,0x35,0x1e,0x1e,
-0xff,0x00,0x17,0x18,0x2f,0x2e,0x18,0x19,0x00,0x01,0x00,0x36,0x02,0x9c,0x03,0xe9,
-0x05,0x0f,0x00,0x0c,0x00,0x00,0x13,0x33,0x1b,0x01,0x33,0x1b,0x01,0x33,0x03,0x23,
-0x0b,0x01,0x23,0x36,0x74,0x91,0x90,0x89,0x91,0x90,0x74,0xb9,0x88,0x98,0x99,0x88,
-0x05,0x0f,0xfe,0x17,0x01,0xe9,0xfe,0x17,0x01,0xe9,0xfd,0x8d,0x02,0x02,0xfd,0xfe,
-0x00,0x01,0x00,0x26,0x01,0xad,0x02,0xd5,0x05,0x0f,0x00,0x11,0x00,0x00,0x01,0x06,
-0x07,0x06,0x2b,0x01,0x35,0x33,0x32,0x37,0x36,0x3f,0x01,0x01,0x33,0x1b,0x01,0x33,
-0x01,0x9f,0x31,0x2f,0x2e,0x4e,0x5d,0x44,0x30,0x1a,0x1b,0x20,0x15,0xfe,0xe2,0x7b,
-0xdd,0xdc,0x7b,0x02,0x62,0x70,0x22,0x23,0x57,0x14,0x14,0x4b,0x2f,0x02,0x69,0xfe,
-0x16,0x01,0xea,0x00,0xff,0xff,0x00,0xc5,0x03,0xaa,0x01,0x6f,0x05,0xd5,0x12,0x02,
-0x00,0x0a,0x00,0x00,0xff,0xff,0x00,0xc5,0x03,0xaa,0x02,0xe9,0x05,0xd5,0x12,0x02,
-0x00,0x05,0x00,0x00,0xff,0xff,0x00,0xae,0x03,0xe9,0x01,0xd3,0x05,0xd5,0x10,0x06,
-0x07,0x79,0x00,0x00,0xff,0xff,0x00,0xb2,0x03,0xfe,0x01,0xd7,0x05,0xd5,0x10,0x06,
-0x07,0x7a,0x00,0x00,0x00,0x01,0x00,0xc4,0x04,0xee,0x01,0xe9,0x06,0xda,0x00,0x05,
-0x00,0x00,0x01,0x15,0x13,0x23,0x03,0x35,0x01,0x97,0x52,0x81,0xa4,0x06,0xda,0xac,
-0xfe,0xc0,0x01,0x40,0xac,0x00,0x00,0x01,0x00,0x75,0x03,0xef,0x01,0x87,0x06,0x14,
-0x00,0x10,0x00,0x00,0x13,0x34,0x35,0x32,0x36,0x35,0x34,0x26,0x23,0x34,0x35,0x32,
-0x17,0x16,0x14,0x07,0x06,0x75,0x40,0x58,0x58,0x40,0x73,0x50,0x4f,0x4f,0x50,0x03,
-0xef,0x3d,0x3e,0x58,0x40,0x3f,0x58,0x3d,0x3e,0x50,0x4f,0xe6,0x50,0x50,0x00,0x01,
-0x00,0x75,0x03,0xef,0x01,0x87,0x06,0x14,0x00,0x10,0x00,0x00,0x01,0x22,0x27,0x26,
-0x34,0x37,0x36,0x33,0x14,0x15,0x22,0x06,0x15,0x14,0x16,0x33,0x14,0x01,0x87,0x73,
-0x50,0x4f,0x4f,0x50,0x73,0x40,0x58,0x58,0x40,0x03,0xef,0x50,0x50,0xe6,0x4f,0x50,
-0x3e,0x3d,0x58,0x3f,0x40,0x58,0x3e,0x00,0x00,0x01,0x00,0x75,0x02,0x9c,0x02,0x89,
-0x06,0x02,0x00,0x1c,0x00,0x00,0x01,0x33,0x32,0x37,0x36,0x35,0x26,0x27,0x26,0x23,
-0x22,0x07,0x06,0x07,0x35,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x06,
-0x07,0x11,0x23,0x01,0x14,0x27,0x79,0x37,0x24,0x01,0x23,0x3f,0x71,0x32,0x32,0x31,
-0x31,0x30,0x33,0x33,0x35,0xae,0x57,0x44,0x44,0x46,0x6b,0x80,0x04,0x5b,0x40,0x2a,
-0x37,0x4b,0x24,0x40,0x0c,0x0c,0x18,0x60,0x14,0x09,0x0a,0x58,0x46,0x68,0x5f,0x40,
-0x43,0x11,0xfe,0x93,0x00,0x01,0x00,0x75,0x02,0x9c,0x02,0x89,0x06,0x02,0x00,0x1c,
-0x00,0x00,0x01,0x11,0x23,0x11,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,
-0x16,0x17,0x15,0x26,0x27,0x26,0x23,0x22,0x07,0x06,0x07,0x14,0x17,0x16,0x33,0x01,
-0xea,0x7f,0x6b,0x47,0x44,0x45,0x57,0xad,0x35,0x33,0x33,0x30,0x31,0x32,0x31,0x32,
-0x71,0x3e,0x24,0x01,0x25,0x36,0x79,0x04,0x5b,0xfe,0x41,0x01,0x6d,0x11,0x43,0x40,
-0x5f,0x68,0x46,0x58,0x0a,0x09,0x14,0x60,0x18,0x0c,0x0c,0x40,0x24,0x4b,0x37,0x2a,
-0x40,0x00,0x00,0x01,0x01,0x0b,0x04,0x32,0x02,0xf5,0x06,0xb0,0x00,0x06,0x00,0x00,
-0x01,0x25,0x15,0x0d,0x01,0x15,0x25,0x01,0x0b,0x01,0xea,0xfe,0x99,0x01,0x67,0xfe,
-0x16,0x05,0xbb,0xf5,0x8b,0xb4,0xb4,0x8b,0xf5,0x00,0x00,0x01,0x01,0x0b,0x04,0x32,
-0x02,0xf5,0x06,0xb0,0x00,0x06,0x00,0x00,0x01,0x05,0x35,0x2d,0x01,0x35,0x05,0x02,
-0xf5,0xfe,0x16,0x01,0x67,0xfe,0x99,0x01,0xea,0x05,0x27,0xf5,0x8b,0xb4,0xb4,0x8b,
-0xf5,0x00,0x00,0x01,0x00,0xc1,0x04,0x7c,0x03,0x3f,0x06,0x66,0x00,0x06,0x00,0x00,
-0x01,0x03,0x33,0x1b,0x01,0x33,0x03,0x01,0xb6,0xf5,0x8b,0xb4,0xb4,0x8b,0xf5,0x04,
-0x7c,0x01,0xea,0xfe,0x99,0x01,0x67,0xfe,0x16,0x00,0x00,0x01,0x00,0xc1,0x04,0x7c,
-0x03,0x3f,0x06,0x66,0x00,0x06,0x00,0x00,0x01,0x33,0x13,0x23,0x0b,0x01,0x23,0x01,
-0xb6,0x94,0xf5,0x8b,0xb4,0xb4,0x8b,0x06,0x66,0xfe,0x16,0x01,0x67,0xfe,0x99,0x00,
-0x00,0x01,0x00,0xc1,0x04,0xee,0x03,0x3f,0x06,0x66,0x00,0x06,0x00,0x37,0x40,0x0c,
-0x04,0x05,0x02,0xb4,0x00,0xb3,0x07,0x04,0x02,0x75,0x06,0x07,0x10,0xdc,0xec,0x39,
-0x31,0x00,0x10,0xf4,0xec,0x32,0x39,0x30,0x00,0x4b,0xb0,0x09,0x54,0x4b,0xb0,0x0e,
-0x54,0x5b,0x58,0xbd,0x00,0x07,0xff,0xc0,0x00,0x01,0x00,0x07,0x00,0x07,0x00,0x40,
-0x38,0x11,0x37,0x38,0x59,0x01,0x33,0x13,0x23,0x27,0x07,0x23,0x01,0xb6,0x94,0xf5,
-0x8b,0xb4,0xb4,0x8b,0x06,0x66,0xfe,0x88,0xf5,0xf5,0x00,0x01,0x00,0xc1,0x04,0xee,
-0x03,0x3f,0x06,0x66,0x00,0x06,0x00,0x37,0x40,0x0c,0x03,0x00,0xb4,0x04,0x01,0xb3,
-0x07,0x03,0x05,0x75,0x01,0x07,0x10,0xdc,0xec,0x39,0x31,0x00,0x10,0xf4,0x3c,0xec,
-0x39,0x30,0x00,0x4b,0xb0,0x09,0x54,0x4b,0xb0,0x0e,0x54,0x5b,0x58,0xbd,0x00,0x07,
-0xff,0xc0,0x00,0x01,0x00,0x07,0x00,0x07,0x00,0x40,0x38,0x11,0x37,0x38,0x59,0x01,
-0x03,0x33,0x17,0x37,0x33,0x03,0x01,0xb6,0xf5,0x8b,0xb4,0xb4,0x8b,0xf5,0x04,0xee,
-0x01,0x78,0xf5,0xf5,0xfe,0x88,0x00,0x01,0x00,0xd6,0x03,0xe7,0x01,0x5e,0x06,0x12,
-0x00,0x03,0x00,0x13,0x40,0x04,0x05,0x00,0x03,0x04,0x10,0xdc,0xdc,0xcc,0x31,0x00,
-0x40,0x02,0x03,0x02,0x2f,0xc4,0x30,0x01,0x11,0x23,0x11,0x01,0x5e,0x88,0x06,0x12,
-0xfd,0xd5,0x02,0x2b,0xff,0xff,0x00,0xd5,0x05,0x62,0x03,0x2b,0x05,0xf6,0x10,0x06,
-0x00,0x71,0x00,0x00,0x00,0x01,0x01,0x73,0x04,0xee,0x03,0x52,0x06,0x66,0x00,0x03,
-0x00,0x00,0x01,0x33,0x01,0x23,0x02,0x8b,0xc7,0xfe,0xba,0x99,0x06,0x66,0xfe,0x88,
-0x00,0x01,0x00,0xaa,0x04,0xf0,0x02,0x89,0x06,0x66,0x00,0x03,0x00,0x00,0x09,0x01,
-0x23,0x01,0x01,0x6f,0x01,0x1a,0x99,0xfe,0xba,0x06,0x66,0xfe,0x8a,0x01,0x76,0x00,
-0x00,0x01,0x00,0xd6,0xfe,0xd1,0x01,0x5e,0x00,0xfc,0x00,0x03,0x00,0x13,0x40,0x04,
-0x05,0x00,0x03,0x04,0x10,0xdc,0xdc,0xcc,0x31,0x00,0x40,0x02,0x03,0x02,0x2f,0xc4,
-0x30,0x25,0x11,0x23,0x11,0x01,0x5e,0x88,0xfc,0xfd,0xd5,0x02,0x2b,0x00,0xff,0xff,
-0x00,0xd5,0xfe,0xc0,0x03,0x2b,0xff,0x54,0x10,0x07,0x00,0x71,0x00,0x00,0xf9,0x5e,
-0x00,0x01,0x00,0xaa,0xfe,0x1c,0x02,0x89,0xff,0x92,0x00,0x03,0x00,0x00,0x05,0x01,
-0x23,0x01,0x01,0x6f,0x01,0x1a,0x99,0xfe,0xba,0x6e,0xfe,0x8a,0x01,0x76,0x00,0x01,
-0x01,0x73,0xfe,0x1c,0x03,0x52,0xff,0x94,0x00,0x03,0x00,0x00,0x05,0x33,0x01,0x23,
-0x02,0x8b,0xc7,0xfe,0xba,0x99,0x6c,0xfe,0x88,0x00,0x00,0x02,0x00,0x6f,0x00,0x00,
-0x01,0xd4,0x04,0x23,0x00,0x02,0x00,0x05,0x00,0x00,0x01,0x03,0x21,0x03,0x13,0x21,
-0x01,0x21,0xb2,0x01,0x65,0xb3,0xb3,0xfe,0x9b,0x02,0xd9,0x01,0x4a,0xfd,0x27,0xfe,
-0xb6,0x00,0x00,0x01,0x00,0x6f,0x02,0xd8,0x01,0xd4,0x04,0x23,0x00,0x02,0x00,0x00,
-0x01,0x03,0x21,0x01,0x21,0xb2,0x01,0x65,0x02,0xd9,0x01,0x4a,0xff,0xff,0x00,0x75,
-0x01,0xfe,0x01,0x87,0x04,0x23,0x10,0x07,0x02,0x72,0x00,0x00,0xfe,0x0f,0xff,0xff,
-0x00,0x75,0x01,0xfe,0x01,0x87,0x04,0x23,0x10,0x07,0x02,0x73,0x00,0x00,0xfe,0x0f,
-0x00,0x01,0x01,0x1f,0x01,0xd4,0x02,0xe1,0x03,0x96,0x00,0x07,0x00,0x00,0x01,0x15,
-0x21,0x35,0x33,0x11,0x33,0x11,0x02,0xe1,0xfe,0x3e,0x96,0x96,0x02,0x6a,0x96,0x96,
-0x01,0x2c,0xfe,0xd4,0x00,0x01,0x01,0x1f,0x01,0xd4,0x02,0xe1,0x03,0x96,0x00,0x07,
-0x00,0x00,0x01,0x35,0x21,0x15,0x23,0x11,0x23,0x11,0x01,0x1f,0x01,0xc2,0x96,0x96,
-0x03,0x00,0x96,0x96,0xfe,0xd4,0x01,0x2c,0x00,0x01,0x00,0xc1,0x01,0x89,0x03,0x17,
-0x03,0xdf,0x00,0x0b,0x00,0x00,0x01,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x23,0x35,
-0x23,0x35,0x01,0xa2,0x94,0xe1,0xe1,0x94,0xe1,0x02,0xfe,0xe1,0xe1,0x94,0xe1,0xe1,
-0x94,0x00,0x00,0x01,0x01,0x1f,0x02,0x6a,0x02,0xe1,0x03,0x00,0x00,0x03,0x00,0x00,
-0x01,0x21,0x35,0x21,0x02,0xe1,0xfe,0x3e,0x01,0xc2,0x02,0x6a,0x96,0x00,0x00,0x01,
-0x00,0xc7,0x05,0x29,0x03,0x39,0x06,0x48,0x00,0x0d,0x00,0x57,0x40,0x0e,0x0b,0xf0,
-0x04,0x07,0x00,0xb3,0x0e,0x07,0x56,0x08,0x01,0x56,0x00,0x0e,0x10,0xdc,0xec,0xd4,
-0xec,0x31,0x00,0x10,0xf4,0x3c,0xd4,0xec,0x30,0x00,0x4b,0xb0,0x09,0x54,0x58,0xbd,
-0x00,0x0e,0xff,0xc0,0x00,0x01,0x00,0x0e,0x00,0x0e,0x00,0x40,0x38,0x11,0x37,0x38,
-0x59,0x00,0x4b,0xb0,0x0f,0x54,0x4b,0xb0,0x10,0x54,0x5b,0x4b,0xb0,0x11,0x54,0x5b,
-0x58,0xbd,0x00,0x0e,0x00,0x40,0x00,0x01,0x00,0x0e,0x00,0x0e,0xff,0xc0,0x38,0x11,
-0x37,0x38,0x59,0x13,0x33,0x1e,0x01,0x33,0x32,0x36,0x37,0x33,0x0e,0x01,0x23,0x22,
-0x26,0xc7,0x76,0x0b,0x61,0x57,0x56,0x60,0x0d,0x76,0x0a,0x9e,0x91,0x91,0x9e,0x06,
-0x48,0x4b,0x4b,0x4a,0x4c,0x8f,0x90,0x90,0x00,0x01,0x01,0x9a,0x05,0x44,0x02,0x66,
-0x06,0x10,0x00,0x03,0x00,0x2c,0x40,0x09,0x02,0xce,0x00,0xcd,0x04,0x01,0x64,0x00,
-0x04,0x10,0xd4,0xec,0x31,0x00,0x10,0xfc,0xec,0x30,0x00,0x4b,0xb0,0x09,0x54,0x58,
-0xbd,0x00,0x04,0xff,0xc0,0x00,0x01,0x00,0x04,0x00,0x04,0x00,0x40,0x38,0x11,0x37,
-0x38,0x59,0x01,0x33,0x15,0x23,0x01,0x9a,0xcc,0xcc,0x06,0x10,0xcc,0x00,0x00,0x02,
-0x00,0xee,0x04,0xe1,0x03,0x12,0x07,0x06,0x00,0x0b,0x00,0x17,0x00,0x20,0x40,0x11,
-0x03,0xc1,0x15,0xf2,0x09,0xc1,0x0f,0xf1,0x18,0x00,0x56,0x0c,0x78,0x06,0x56,0x12,
-0x18,0x10,0xd4,0xec,0xf4,0xec,0x31,0x00,0x10,0xf4,0xec,0xf4,0xec,0x30,0x01,0x34,
-0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x14,0x06,0x23,0x22,0x26,
-0x35,0x34,0x36,0x33,0x32,0x16,0x02,0x98,0x58,0x40,0x41,0x57,0x57,0x41,0x40,0x58,
-0x7a,0x9f,0x73,0x73,0x9f,0x9f,0x73,0x73,0x9f,0x05,0xf4,0x3f,0x58,0x57,0x40,0x41,
-0x57,0x58,0x40,0x73,0xa0,0xa0,0x73,0x73,0x9f,0x9f,0x00,0x01,0x01,0x4c,0xfe,0x75,
-0x02,0xc1,0x00,0x00,0x00,0x13,0x00,0x20,0x40,0x0f,0x0b,0x0e,0x0a,0x07,0xf3,0x0e,
-0xf4,0x00,0x01,0x00,0x0a,0x04,0x27,0x11,0x14,0x10,0xd4,0xec,0xc4,0xd4,0xcc,0x31,
-0x00,0x2f,0xfc,0xfc,0xc4,0x12,0x39,0x30,0x21,0x33,0x0e,0x01,0x15,0x14,0x16,0x33,
-0x32,0x36,0x37,0x15,0x0e,0x01,0x23,0x22,0x26,0x35,0x34,0x36,0x01,0xb8,0x77,0x2d,
-0x2b,0x37,0x36,0x20,0x3e,0x1f,0x26,0x44,0x1e,0x7a,0x73,0x35,0x3d,0x58,0x1f,0x2e,
-0x2e,0x0f,0x0f,0x85,0x0a,0x0a,0x57,0x5d,0x30,0x69,0x00,0x01,0x00,0xb6,0x05,0x1d,
-0x03,0x4a,0x06,0x37,0x00,0x1b,0x00,0x63,0x40,0x24,0x00,0x12,0x07,0x0e,0x0b,0x04,
-0x01,0x12,0x07,0x0f,0x0b,0x04,0x12,0xc3,0x19,0x07,0x04,0xc3,0x15,0x0b,0xed,0x1c,
-0x0f,0x01,0x0e,0x00,0x07,0x15,0x56,0x16,0x77,0x07,0x56,0x08,0x76,0x1c,0x10,0xf4,
-0xec,0xfc,0xec,0x11,0x39,0x39,0x39,0x39,0x31,0x00,0x10,0xfc,0x3c,0xfc,0xd4,0x3c,
-0xec,0x11,0x12,0x39,0x11,0x12,0x39,0x11,0x12,0x39,0x11,0x12,0x39,0x30,0x00,0x4b,
-0xb0,0x09,0x54,0x4b,0xb0,0x0c,0x54,0x5b,0x58,0xbd,0x00,0x1c,0xff,0xc0,0x00,0x01,
-0x00,0x1c,0x00,0x1c,0x00,0x40,0x38,0x11,0x37,0x38,0x59,0x01,0x27,0x2e,0x01,0x23,
-0x22,0x06,0x07,0x23,0x3e,0x01,0x33,0x32,0x16,0x1f,0x01,0x1e,0x01,0x33,0x32,0x36,
-0x37,0x33,0x0e,0x01,0x23,0x22,0x26,0x01,0xfc,0x39,0x16,0x21,0x0d,0x26,0x24,0x02,
-0x7d,0x02,0x66,0x5b,0x26,0x40,0x25,0x39,0x16,0x21,0x0d,0x26,0x24,0x02,0x7d,0x02,
-0x66,0x5b,0x26,0x40,0x05,0x5a,0x37,0x14,0x13,0x49,0x52,0x87,0x93,0x1c,0x21,0x37,
-0x14,0x13,0x49,0x52,0x87,0x93,0x1c,0x00,0x00,0x02,0x00,0xf0,0x04,0xee,0x03,0xae,
-0x06,0x66,0x00,0x03,0x00,0x07,0x00,0x42,0x40,0x11,0x06,0x02,0xb4,0x04,0x00,0xb3,
-0x08,0x04,0x07,0x03,0x00,0x05,0x01,0x03,0x05,0x07,0x08,0x10,0xd4,0xdc,0xd4,0xcc,
-0x11,0x39,0x11,0x12,0x39,0x31,0x00,0x10,0xf4,0x3c,0xec,0x32,0x30,0x00,0x4b,0xb0,
-0x09,0x54,0x4b,0xb0,0x0e,0x54,0x5b,0x58,0xbd,0x00,0x08,0xff,0xc0,0x00,0x01,0x00,
-0x08,0x00,0x08,0x00,0x40,0x38,0x11,0x37,0x38,0x59,0x01,0x33,0x03,0x23,0x03,0x33,
-0x03,0x23,0x02,0xfc,0xb2,0xf8,0x87,0x81,0xaa,0xdf,0x89,0x06,0x66,0xfe,0x88,0x01,
-0x78,0xfe,0x88,0x00,0x00,0x01,0xff,0xff,0x01,0xde,0x02,0xad,0x04,0x08,0x00,0x0f,
-0x00,0x00,0x03,0x25,0x33,0x15,0x14,0x17,0x16,0x3b,0x01,0x15,0x23,0x22,0x27,0x26,
-0x35,0x05,0x01,0x01,0x16,0xb8,0x26,0x26,0x69,0x2b,0x40,0xaf,0x57,0x52,0xfe,0xeb,
-0x03,0x64,0xa4,0x94,0x99,0x31,0x30,0x9c,0x60,0x5a,0xc8,0xa2,0x00,0x01,0x00,0xef,
-0x04,0xee,0x03,0x10,0x06,0x66,0x00,0x0b,0x00,0x00,0x01,0x27,0x07,0x23,0x37,0x27,
-0x33,0x17,0x37,0x33,0x07,0x17,0x02,0x5c,0x5c,0x5d,0xb4,0xb5,0xb5,0xb4,0x5d,0x5c,
-0xb4,0xb6,0xb6,0x04,0xee,0x61,0x61,0xbb,0xbd,0x60,0x60,0xbd,0xbb,0x00,0x00,0x02,
-0x00,0x75,0x01,0xaa,0x02,0xfd,0x05,0x0f,0x00,0x0d,0x00,0x15,0x00,0x00,0x01,0x16,
-0x15,0x14,0x07,0x04,0x27,0x26,0x37,0x03,0x33,0x17,0x37,0x33,0x01,0x06,0x17,0x16,
-0x33,0x32,0x37,0x34,0x02,0x05,0xb2,0xf2,0xfe,0xf6,0x01,0x01,0xb6,0xfa,0x89,0xbf,
-0xb7,0x89,0xfe,0xbc,0x8c,0x03,0x02,0x86,0x80,0x01,0x03,0xdc,0xf9,0xb4,0x81,0x03,
-0x03,0x87,0xc0,0xf1,0x01,0x2f,0xe0,0xe0,0xfe,0x8a,0xae,0x98,0x4d,0x4d,0x8c,0x00,
-0x00,0x01,0x00,0x75,0x02,0x9c,0x00,0xe9,0x06,0x03,0x00,0x03,0x00,0x00,0x13,0x33,
-0x11,0x23,0x75,0x74,0x74,0x06,0x03,0xfc,0x99,0x00,0x00,0x01,0x00,0x75,0x02,0x9c,
-0x02,0x90,0x05,0x2f,0x00,0x32,0x00,0x00,0x01,0x15,0x26,0x27,0x26,0x23,0x22,0x07,
-0x06,0x15,0x14,0x17,0x16,0x1f,0x01,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x23,0x22,
-0x27,0x26,0x27,0x35,0x16,0x17,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x26,0x2f,0x01,
-0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x16,0x02,0x6a,0x31,0x35,0x34,
-0x39,0x57,0x2b,0x2b,0x1f,0x1f,0x5d,0x28,0x7d,0x32,0x34,0x4e,0x4d,0x88,0x39,0x3e,
-0x3d,0x44,0x40,0x3f,0x3e,0x3d,0x52,0x58,0x20,0x1c,0x6f,0x28,0x6c,0x30,0x30,0x47,
-0x46,0x82,0x40,0x39,0x39,0x05,0x0d,0x61,0x16,0x0b,0x0b,0x17,0x18,0x2f,0x24,0x14,
-0x15,0x12,0x08,0x18,0x2a,0x2b,0x4d,0x57,0x33,0x33,0x0a,0x0a,0x13,0x6b,0x1e,0x0f,
-0x0f,0x32,0x2d,0x2a,0x17,0x14,0x17,0x08,0x15,0x29,0x2a,0x49,0x58,0x30,0x31,0x09,
-0x08,0x00,0x00,0x01,0x00,0x75,0x02,0x9c,0x03,0x21,0x05,0x0f,0x00,0x0b,0x00,0x00,
-0x01,0x03,0x01,0x23,0x27,0x07,0x23,0x01,0x03,0x33,0x17,0x37,0x03,0x14,0xff,0x01,
-0x0c,0x89,0xcd,0xcd,0x89,0x01,0x12,0xfb,0x89,0xbb,0xbb,0x05,0x0f,0xfe,0xcf,0xfe,
-0xbe,0xf6,0xf6,0x01,0x48,0x01,0x2b,0xdf,0xdf,0x00,0x00,0x01,0x00,0x75,0x02,0x9c,
-0x02,0x89,0x06,0x02,0x00,0x1c,0x00,0x00,0x01,0x11,0x23,0x11,0x26,0x27,0x26,0x35,
-0x34,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x15,0x26,0x27,0x26,0x23,0x22,0x07,0x06,
-0x07,0x14,0x17,0x16,0x33,0x01,0xea,0x7f,0x6b,0x47,0x44,0x45,0x57,0xad,0x35,0x33,
-0x33,0x30,0x31,0x32,0x31,0x32,0x71,0x3e,0x24,0x01,0x25,0x36,0x79,0x04,0x5b,0xfe,
-0x41,0x01,0x6d,0x11,0x43,0x40,0x5f,0x68,0x46,0x58,0x0a,0x09,0x14,0x60,0x18,0x0c,
-0x0c,0x40,0x24,0x4b,0x37,0x2a,0x40,0x00,0x00,0x01,0x00,0xd6,0x00,0x00,0x03,0x1d,
-0x05,0x58,0x00,0x05,0x00,0x00,0x21,0x11,0x21,0x35,0x21,0x11,0x02,0x95,0xfe,0x41,
-0x02,0x47,0x04,0xd0,0x88,0xfa,0xa8,0x00,0x00,0x01,0x00,0xd6,0x00,0x00,0x03,0x1d,
-0x05,0x58,0x00,0x07,0x00,0x00,0x21,0x11,0x21,0x35,0x21,0x11,0x33,0x11,0x02,0x95,
-0xfe,0x41,0x01,0xbf,0x88,0x03,0x9c,0x88,0x01,0x34,0xfa,0xa8,0x00,0x01,0x00,0xd6,
-0x00,0x00,0x03,0x1d,0x05,0x58,0x00,0x07,0x00,0x00,0x01,0x11,0x33,0x11,0x23,0x11,
-0x21,0x35,0x02,0x95,0x88,0x88,0xfe,0x41,0x02,0xf0,0x02,0x68,0xfa,0xa8,0x02,0x68,
-0x88,0x00,0x00,0x01,0x00,0xd6,0x00,0x00,0x03,0x1d,0x05,0x58,0x00,0x07,0x00,0x00,
-0x01,0x11,0x33,0x11,0x23,0x11,0x21,0x35,0x02,0x95,0x88,0x88,0xfe,0x41,0x01,0xbc,
-0x03,0x9c,0xfa,0xa8,0x01,0x34,0x88,0x00,0x00,0x01,0x00,0xd6,0x00,0x00,0x03,0x1d,
-0x05,0x58,0x00,0x05,0x00,0x00,0x25,0x11,0x33,0x11,0x21,0x35,0x02,0x95,0x88,0xfd,
-0xb9,0x88,0x04,0xd0,0xfa,0xa8,0x88,0x00,0xff,0xff,0x00,0xc1,0xfd,0xec,0x03,0x3f,
-0xff,0xd6,0x10,0x03,0x02,0x78,0x00,0x00,0xf9,0x70,0xff,0xff,0x00,0xd5,0x04,0xe2,
-0x03,0x2b,0x06,0x76,0x12,0x23,0x00,0x71,0x00,0x00,0x00,0x80,0x12,0x02,0x00,0x71,
-0x00,0x80,0x00,0x02,0x01,0x15,0x04,0xee,0x02,0xeb,0x06,0x66,0x00,0x03,0x00,0x07,
-0x00,0x00,0x01,0x33,0x11,0x23,0x01,0x33,0x11,0x23,0x01,0x15,0x96,0x96,0x01,0x40,
-0x96,0x96,0x06,0x66,0xfe,0x88,0x01,0x78,0xfe,0x88,0xff,0xff,0x00,0xee,0xfd,0x2e,
-0x03,0x12,0xff,0x53,0x10,0x07,0x02,0x8e,0x00,0x00,0xf8,0x4d,0x00,0x01,0x00,0xb6,
-0xfe,0x76,0x03,0x4a,0xff,0x90,0x00,0x1b,0x00,0x00,0x01,0x27,0x2e,0x01,0x23,0x22,
-0x06,0x07,0x23,0x3e,0x01,0x33,0x32,0x16,0x1f,0x01,0x1e,0x01,0x33,0x32,0x36,0x37,
-0x33,0x0e,0x01,0x23,0x22,0x26,0x01,0xfc,0x39,0x16,0x21,0x0d,0x26,0x24,0x02,0x7d,
-0x02,0x66,0x5b,0x26,0x40,0x25,0x39,0x16,0x21,0x0d,0x26,0x24,0x02,0x7d,0x02,0x66,
-0x5b,0x26,0x40,0xfe,0xb3,0x37,0x14,0x13,0x49,0x52,0x87,0x93,0x1c,0x21,0x37,0x14,
-0x13,0x49,0x52,0x87,0x93,0x1c,0xff,0xff,0xfc,0xa8,0x04,0xf0,0xfe,0x87,0x06,0x66,
-0x10,0x07,0x00,0x43,0xfb,0xfe,0x00,0x00,0xff,0xff,0xfd,0x71,0x04,0xee,0xff,0x50,
-0x06,0x66,0x10,0x07,0x00,0x76,0xfb,0xfe,0x00,0x00,0xff,0xff,0xfc,0xbf,0x04,0xee,
-0xff,0x3d,0x06,0x66,0x10,0x07,0x02,0x7a,0xfb,0xfe,0x00,0x00,0xff,0xff,0xfc,0xb4,
-0x05,0x1d,0xff,0x48,0x06,0x37,0x10,0x07,0x02,0x90,0xfb,0xfe,0x00,0x00,0xff,0xff,
-0xfc,0xd9,0x05,0x62,0xff,0x2f,0x05,0xf6,0x10,0x07,0x00,0x71,0xfc,0x04,0x00,0x00,
-0xff,0xff,0xfb,0xec,0x05,0x7c,0x00,0x14,0x06,0x0b,0x10,0x07,0x07,0x97,0xfc,0x00,
-0x00,0x00,0xff,0xff,0xfc,0xbf,0x05,0x29,0xff,0x31,0x06,0x48,0x10,0x07,0x02,0x8c,
-0xfb,0xf8,0x00,0x00,0xff,0xff,0xfd,0xa4,0x05,0x44,0xfe,0x70,0x06,0x10,0x10,0x07,
-0x02,0x8d,0xfc,0x0a,0x00,0x00,0xff,0xff,0xfc,0xd5,0x05,0x46,0xff,0x27,0x06,0x10,
-0x10,0x07,0x00,0x6a,0xfb,0xfe,0x00,0x00,0x00,0x01,0xfd,0x37,0x04,0xf2,0xfe,0xf7,
-0x06,0x7b,0x00,0x18,0x00,0x00,0x01,0x36,0x32,0x16,0x15,0x14,0x0f,0x01,0x06,0x07,
-0x06,0x15,0x23,0x35,0x34,0x36,0x3f,0x01,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0xfd,
-0x37,0x70,0xd1,0x7f,0x58,0x2c,0x23,0x04,0x07,0x77,0x1e,0x33,0x2d,0x2e,0x3e,0x47,
-0x5a,0x64,0x06,0x48,0x33,0x55,0x43,0x3d,0x41,0x20,0x1a,0x09,0x10,0x20,0x0c,0x28,
-0x36,0x25,0x22,0x22,0x28,0x15,0x24,0x34,0xff,0xff,0xfc,0xec,0x04,0xe1,0xff,0x10,
-0x07,0x06,0x10,0x07,0x02,0x8e,0xfb,0xfe,0x00,0x00,0xff,0xff,0xfc,0xf4,0x04,0xee,
-0xff,0xb2,0x06,0x66,0x10,0x07,0x02,0x91,0xfc,0x04,0x00,0x00,0xff,0xff,0xfc,0xc5,
-0x04,0xee,0xff,0x43,0x06,0x66,0x10,0x07,0x02,0x7b,0xfc,0x04,0x00,0x00,0x00,0x01,
-0xfd,0xbc,0x04,0xec,0xfe,0x44,0x06,0xa8,0x00,0x03,0x00,0x00,0x01,0x11,0x23,0x11,
-0xfe,0x44,0x88,0x06,0xa8,0xfe,0x44,0x01,0xbc,0x00,0xff,0xff,0xfc,0xf0,0x04,0xec,
-0xff,0x10,0x06,0xa8,0x10,0x27,0x02,0xb0,0xff,0x34,0x00,0x00,0x10,0x07,0x02,0xb0,
-0x00,0xcc,0x00,0x00,0x00,0x02,0xfc,0x5d,0x04,0xee,0xff,0x1b,0x06,0x66,0x00,0x03,
-0x00,0x07,0x00,0x00,0x01,0x13,0x23,0x03,0x21,0x13,0x23,0x03,0xfd,0x0f,0xcd,0x87,
-0xf8,0x02,0x00,0xbe,0x89,0xdf,0x06,0x66,0xfe,0x88,0x01,0x78,0xfe,0x88,0x01,0x78,
-0xff,0xff,0xfc,0xbf,0x05,0x29,0xff,0x31,0x06,0xd6,0x10,0x27,0x02,0x8d,0xfc,0x04,
-0x00,0xc6,0x10,0x07,0x02,0x8c,0xfb,0xf8,0x00,0x00,0xff,0xff,0xfc,0xbf,0x05,0x29,
-0xff,0x31,0x06,0x48,0x10,0x0f,0x02,0x8c,0xff,0xf8,0x0b,0x71,0xc0,0x00,0x00,0x01,
-0xfe,0x1f,0x03,0xe9,0xff,0x44,0x05,0x28,0x00,0x03,0x00,0x0a,0x40,0x03,0x02,0x01,
-0x04,0x00,0x10,0xd4,0xcc,0x30,0x01,0x23,0x13,0x33,0xfe,0xf2,0xd3,0xa4,0x81,0x03,
-0xe9,0x01,0x3f,0x00,0x00,0x01,0xfd,0x90,0x04,0xc2,0xfe,0x82,0x06,0xc1,0x00,0x08,
-0x00,0x00,0x01,0x10,0x23,0x35,0x16,0x35,0x23,0x35,0x33,0xfe,0x82,0xf2,0x70,0x70,
-0xf2,0x05,0xc3,0xfe,0xff,0x7b,0x03,0x89,0xfe,0x00,0x00,0x01,0xfd,0x90,0x04,0xc2,
-0xfe,0x82,0x06,0xc1,0x00,0x08,0x00,0x00,0x01,0x35,0x33,0x15,0x23,0x14,0x37,0x15,
-0x22,0xfd,0x90,0xf1,0x6f,0x70,0xf2,0x05,0xc3,0xfe,0xfe,0x89,0x03,0x7b,0x00,0x01,
-0xff,0x79,0x04,0x9a,0x00,0x87,0x06,0x12,0x00,0x03,0x00,0x00,0x03,0x33,0x03,0x23,
-0x40,0xc7,0x75,0x99,0x06,0x12,0xfe,0x88,0xff,0xff,0xfc,0xa8,0xfd,0xdf,0xfe,0x87,
-0xff,0x55,0x10,0x07,0x00,0x43,0xfb,0xfe,0xf8,0xef,0xff,0xff,0xfd,0x71,0xfd,0xdd,
-0xff,0x50,0xff,0x55,0x10,0x07,0x00,0x76,0xfb,0xfe,0xf8,0xef,0x00,0x01,0xfd,0x0c,
-0xfd,0x26,0xfe,0x44,0xff,0x10,0x00,0x07,0x00,0x00,0x01,0x35,0x33,0x11,0x23,0x35,
-0x23,0x35,0xfd,0xbc,0x88,0x88,0xb0,0xfe,0x5f,0xb1,0xfe,0x16,0xb1,0x88,0x00,0x01,
-0xfd,0xbc,0xfd,0x26,0xfe,0xf4,0xff,0x10,0x00,0x07,0x00,0x00,0x01,0x33,0x15,0x23,
-0x15,0x23,0x11,0x33,0xfe,0x44,0xb0,0xb0,0x88,0x88,0xfe,0x5f,0x88,0xb1,0x01,0xea,
-0x00,0x01,0xfe,0x55,0x05,0x86,0x00,0x3f,0x07,0x70,0x00,0x05,0x00,0x00,0x03,0x21,
-0x35,0x21,0x11,0x23,0x49,0xfe,0x9e,0x01,0xea,0x88,0x06,0xe8,0x88,0xfe,0x16,0x00,
-0x00,0x01,0xff,0x04,0x02,0xfc,0x00,0x8f,0x04,0x71,0x00,0x13,0x00,0x00,0x03,0x35,
-0x1e,0x01,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x33,0x1e,0x01,0x15,0x14,0x06,0x23,
-0x22,0x26,0xfc,0x3d,0x58,0x1f,0x2e,0x2e,0x0f,0x0f,0x85,0x0a,0x0a,0x57,0x5d,0x30,
-0x69,0x03,0x68,0x77,0x2d,0x2b,0x37,0x36,0x20,0x3e,0x1f,0x26,0x44,0x1e,0x7a,0x73,
-0x35,0x00,0x00,0x01,0xfd,0x81,0xfc,0xeb,0xfe,0x93,0xff,0x10,0x00,0x10,0x00,0x00,
-0x05,0x14,0x15,0x22,0x06,0x15,0x14,0x16,0x33,0x14,0x15,0x22,0x27,0x26,0x34,0x37,
-0x36,0xfe,0x93,0x40,0x58,0x58,0x40,0x73,0x50,0x4f,0x4f,0x50,0xf0,0x3e,0x3d,0x58,
-0x40,0x3f,0x58,0x3e,0x3d,0x4f,0x50,0xe6,0x50,0x50,0x00,0x01,0xfd,0x0b,0xfd,0xd7,
-0xfe,0xf5,0xff,0x10,0x00,0x07,0x00,0x00,0x01,0x33,0x15,0x21,0x35,0x33,0x35,0x33,
-0xfe,0x44,0xb1,0xfe,0x16,0xb1,0x88,0xfe,0x5f,0x88,0x88,0xb1,0x00,0x01,0xfd,0x0b,
-0xfd,0xd7,0xfe,0xf5,0xff,0x10,0x00,0x07,0x00,0x00,0x01,0x23,0x35,0x21,0x15,0x23,
-0x15,0x23,0xfd,0xbc,0xb1,0x01,0xea,0xb1,0x88,0xfe,0x88,0x88,0x88,0xb1,0x00,0x01,
-0xfd,0x0b,0xfd,0x26,0xfe,0xf5,0xff,0x10,0x00,0x0b,0x00,0x00,0x01,0x23,0x35,0x33,
-0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x23,0xfd,0xbc,0xb1,0xb1,0x88,0xb1,0xb1,0x88,
-0xfd,0xd7,0x88,0xb1,0xb1,0x88,0xb1,0x00,0x00,0x01,0xfd,0x0b,0xfe,0x88,0xfe,0xf5,
-0xff,0x10,0x00,0x03,0x00,0x00,0x01,0x35,0x21,0x15,0xfd,0x0b,0x01,0xea,0xfe,0x88,
-0x88,0x88,0x00,0x01,0xfd,0x7a,0xfe,0x56,0xff,0xd0,0x00,0x80,0x00,0x0d,0x00,0x00,
-0x27,0x15,0x14,0x07,0x06,0x2b,0x01,0x35,0x33,0x32,0x37,0x36,0x3d,0x01,0x30,0x52,
-0x51,0xb5,0xfe,0xe9,0x69,0x26,0x26,0x80,0x94,0xd6,0x60,0x60,0x9c,0x30,0x31,0x99,
-0x94,0x00,0x00,0x01,0xfd,0x77,0xfe,0x56,0xff,0xcd,0x00,0x80,0x00,0x0d,0x00,0x00,
-0x25,0x33,0x15,0x14,0x17,0x16,0x3b,0x01,0x15,0x23,0x22,0x27,0x26,0x35,0xfd,0x77,
-0xb8,0x26,0x26,0x69,0xe9,0xfe,0xb5,0x51,0x52,0x80,0x94,0x99,0x31,0x30,0x9c,0x60,
-0x60,0xd6,0xff,0xff,0xfd,0x9a,0xfe,0x87,0xfe,0x66,0xff,0x53,0x10,0x07,0x02,0x8d,
-0xfc,0x00,0xf9,0x43,0xff,0xff,0xfc,0xd5,0xfe,0x89,0xff,0x27,0xff,0x53,0x10,0x07,
-0x00,0x6a,0xfb,0xfe,0xf9,0x43,0xff,0xff,0xfc,0xec,0xfd,0x2e,0xff,0x10,0xff,0x53,
-0x10,0x07,0x02,0x8e,0xfb,0xfe,0xf8,0x4d,0x00,0x01,0xfd,0x6a,0xfe,0x14,0xfe,0x8f,
-0xff,0x54,0x00,0x03,0x00,0x0a,0x40,0x03,0x03,0x00,0x04,0x00,0x10,0xd4,0xcc,0x30,
-0x05,0x33,0x03,0x23,0xfd,0xbc,0xd3,0xa4,0x81,0xac,0xfe,0xc0,0xff,0xff,0xfd,0x23,
-0xfe,0x75,0xfe,0xc1,0x00,0x00,0x10,0x07,0x00,0x7a,0xfc,0x00,0x00,0x00,0xff,0xff,
-0xfd,0x4c,0xfe,0x75,0xfe,0xc1,0x00,0x00,0x10,0x07,0x02,0x8f,0xfc,0x00,0x00,0x00,
-0x00,0x01,0xfd,0xbc,0xfd,0x98,0xfe,0x44,0xff,0x54,0x00,0x03,0x00,0x00,0x05,0x11,
-0x23,0x11,0xfe,0x44,0x88,0xac,0xfe,0x44,0x01,0xbc,0x00,0x01,0xfc,0xf0,0xfe,0x0a,
-0xff,0x17,0xff,0x54,0x00,0x07,0x00,0x00,0x07,0x11,0x23,0x35,0x21,0x15,0x23,0x11,
-0xe9,0x89,0xfe,0xeb,0x89,0xac,0xfe,0xb6,0xc2,0xc2,0x01,0x4a,0x00,0x01,0xfc,0x63,
-0xfe,0x39,0xff,0x98,0xff,0x58,0x00,0x14,0x00,0x00,0x01,0x06,0x23,0x22,0x03,0x34,
-0x35,0x33,0x16,0x33,0x32,0x37,0x33,0x16,0x17,0x32,0x37,0x33,0x02,0x07,0x22,0xfd,
-0xfe,0x3c,0x74,0xda,0x11,0x75,0x0e,0x68,0x65,0x0f,0x76,0x0c,0x69,0x66,0x0f,0x76,
-0x0f,0xdc,0x74,0xfe,0x8b,0x52,0x01,0x1a,0x02,0x03,0x96,0x96,0x95,0x01,0x96,0xfe,
-0xe2,0x01,0xff,0xff,0xfc,0xc5,0xfd,0xda,0xff,0x43,0xff,0x52,0x10,0x07,0x02,0x7b,
-0xfc,0x04,0xf8,0xec,0xff,0xff,0xfc,0xbf,0xfd,0xdd,0xff,0x3d,0xff,0x55,0x10,0x07,
-0x02,0x7a,0xfb,0xfe,0xf8,0xef,0xff,0xff,0xfc,0xbf,0xfe,0x39,0xff,0x31,0xff,0x58,
-0x10,0x07,0x02,0x8c,0xfb,0xf8,0xf9,0x10,0xff,0xff,0xfc,0xbf,0xfe,0x36,0xff,0x31,
-0xff,0x55,0x10,0x0f,0x02,0x8c,0xff,0xf8,0x04,0x7e,0xc0,0x00,0xff,0xff,0xfc,0xb4,
-0xfe,0x39,0xff,0x48,0xff,0x53,0x10,0x07,0x02,0x90,0xfb,0xfe,0xf9,0x1c,0xff,0xff,
-0xfc,0xd9,0xfe,0xc0,0xff,0x2f,0xff,0x54,0x10,0x07,0x02,0x81,0xfc,0x04,0x00,0x00,
-0xff,0xff,0xfb,0xec,0xfe,0x1d,0x00,0x14,0xfe,0xac,0x10,0x07,0x00,0x42,0xfc,0x00,
-0x00,0x00,0xff,0xff,0xfb,0xec,0xfe,0x1d,0x00,0x14,0xff,0xee,0x10,0x07,0x07,0x78,
-0xfc,0x00,0x00,0x00,0x00,0x01,0xfb,0x8c,0x01,0xec,0xff,0xad,0x03,0x0c,0x00,0x1b,
-0x00,0x00,0x03,0x15,0x0e,0x01,0x23,0x22,0x27,0x26,0x27,0x2e,0x01,0x23,0x22,0x06,
-0x07,0x35,0x3e,0x01,0x33,0x32,0x16,0x17,0x16,0x17,0x16,0x33,0x32,0x36,0x53,0x4b,
-0x8f,0x4f,0x5a,0x71,0x16,0x0b,0x4d,0x67,0x33,0x4f,0x8d,0x49,0x4e,0x92,0x53,0x35,
-0x64,0x4a,0x0c,0x15,0x74,0x5d,0x46,0x89,0x03,0x0c,0xae,0x3b,0x37,0x33,0x0a,0x04,
-0x21,0x18,0x3b,0x3f,0xae,0x3c,0x36,0x16,0x1f,0x05,0x0a,0x37,0x3d,0x00,0x00,0x01,
-0xfd,0x77,0x01,0xc4,0xff,0x88,0x02,0x68,0x00,0x03,0x00,0x00,0x03,0x15,0x21,0x35,
-0x78,0xfd,0xf0,0x02,0x68,0xa4,0xa4,0x00,0x00,0x01,0xfa,0xed,0x01,0xc4,0xff,0xff,
-0x02,0x68,0x00,0x03,0x00,0x00,0x01,0x35,0x21,0x15,0xfa,0xed,0x05,0x12,0x01,0xc4,
-0xa4,0xa4,0x00,0x01,0xfb,0x68,0xff,0xa2,0xff,0xbc,0x04,0xbc,0x00,0x03,0x00,0x00,
-0x05,0x27,0x01,0x17,0xfb,0xc8,0x60,0x03,0xf5,0x5f,0x5e,0x4e,0x04,0xcc,0x4f,0x00,
-0x00,0x01,0xfa,0x12,0xff,0xba,0xff,0x91,0x06,0x17,0x00,0x03,0x00,0x00,0x05,0x27,
-0x01,0x17,0xfa,0x79,0x67,0x05,0x19,0x66,0x46,0x58,0x06,0x05,0x59,0x00,0xff,0xff,
-0xfd,0xf9,0xfd,0x3b,0xff,0x0b,0xff,0x60,0x10,0x0f,0x02,0xbf,0xfc,0x8c,0xfc,0x4b,
-0xc0,0x00,0xff,0xff,0xfc,0xf1,0xfe,0x5b,0xff,0x18,0xff,0xa5,0x10,0x0f,0x02,0xcd,
-0xfc,0x08,0xfd,0xaf,0xc0,0x00,0x00,0x02,0xfc,0xf0,0xfd,0x2e,0xff,0x17,0xff,0x54,
-0x00,0x03,0x00,0x07,0x00,0x00,0x07,0x11,0x21,0x11,0x01,0x11,0x21,0x11,0xe9,0xfd,
-0xd9,0x01,0x9e,0xfe,0xeb,0xac,0xfd,0xda,0x02,0x26,0xfe,0x62,0x01,0x16,0xfe,0xea,
-0x00,0x01,0xfc,0x63,0xfe,0x39,0xff,0x98,0xff,0x58,0x00,0x14,0x00,0x00,0x05,0x36,
-0x33,0x32,0x13,0x14,0x15,0x23,0x26,0x23,0x22,0x07,0x23,0x26,0x27,0x22,0x07,0x23,
-0x12,0x37,0x32,0xfd,0xfe,0x3b,0x74,0xda,0x11,0x76,0x0d,0x67,0x66,0x10,0x76,0x0b,
-0x69,0x66,0x0f,0x76,0x0f,0xdc,0x74,0xfa,0x52,0xfe,0xe6,0x02,0x03,0x96,0x96,0x95,
-0x01,0x96,0x01,0x1e,0x01,0x00,0x00,0x01,0xfd,0x2a,0x04,0xf2,0xfe,0xe6,0x06,0xae,
-0x00,0x0b,0x00,0x00,0x01,0x07,0x27,0x37,0x27,0x37,0x17,0x37,0x17,0x07,0x17,0x07,
-0xfe,0x08,0x7d,0x60,0x7d,0x7d,0x60,0x7d,0x7d,0x60,0x7d,0x7d,0x60,0x05,0x70,0x7d,
-0x60,0x7d,0x7d,0x60,0x7d,0x7d,0x60,0x7d,0x7d,0x60,0x00,0x01,0xfe,0x06,0x04,0xc2,
-0xff,0x20,0x06,0xd2,0x00,0x1d,0x00,0x00,0x01,0x2e,0x01,0x35,0x34,0x36,0x37,0x15,
-0x0e,0x01,0x15,0x14,0x17,0x16,0x1f,0x01,0x1e,0x01,0x15,0x14,0x06,0x07,0x35,0x3e,
-0x01,0x35,0x34,0x27,0x26,0x27,0xfe,0x43,0x21,0x1c,0x93,0x87,0x52,0x49,0x09,0x0c,
-0x12,0x37,0x21,0x1c,0x93,0x87,0x52,0x49,0x09,0x0c,0x12,0x05,0xc7,0x1c,0x30,0x1c,
-0x50,0x51,0x02,0x6e,0x02,0x1b,0x1c,0x0a,0x0c,0x0f,0x0e,0x2b,0x1c,0x30,0x1c,0x50,
-0x51,0x02,0x6e,0x02,0x1b,0x1c,0x0a,0x0c,0x0f,0x0e,0xff,0xff,0xfb,0xec,0x04,0x3a,
-0x00,0x14,0x06,0x0b,0x10,0x27,0x07,0x97,0xfc,0x00,0x00,0x00,0x10,0x07,0x07,0x97,
-0xfc,0x00,0xfe,0xbe,0xff,0xff,0xfc,0xa8,0x04,0xf0,0xfe,0x87,0x06,0x66,0x10,0x07,
-0x00,0x43,0xfb,0xfe,0x00,0x00,0xff,0xff,0xfd,0x71,0x04,0xee,0xff,0x50,0x06,0x66,
-0x10,0x07,0x00,0x76,0xfb,0xfe,0x00,0x00,0xff,0xff,0xfc,0xb4,0x05,0x1d,0xff,0x48,
-0x06,0x37,0x10,0x07,0x02,0x90,0xfb,0xfe,0x00,0x00,0xff,0xff,0xfd,0x84,0x04,0xc2,
-0xfe,0x76,0x06,0x72,0x10,0x07,0x07,0x2d,0xfb,0xfe,0x00,0x00,0xff,0xff,0xfc,0xe7,
-0x05,0x46,0xff,0x62,0x07,0xd2,0x10,0x07,0x03,0x01,0xfc,0x10,0x00,0x00,0xff,0xff,
-0xfd,0xc6,0xfe,0x56,0xfe,0xa2,0xff,0xa4,0x10,0x07,0x02,0xfe,0xfc,0x10,0x00,0x00,
-0x00,0x01,0xfc,0xd5,0x05,0x1d,0xff,0x2b,0x06,0x49,0x00,0x07,0x00,0x00,0x03,0x23,
-0x35,0x21,0x15,0x23,0x11,0x21,0xd5,0x96,0xfe,0xd6,0x96,0x02,0x56,0x05,0x1d,0x96,
-0x96,0x01,0x2c,0x00,0x00,0x02,0xfd,0x1f,0xfe,0x32,0xfe,0xe1,0xff,0xb8,0x00,0x03,
-0x00,0x07,0x00,0x00,0x01,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0xfe,0xe1,0xfe,0x3e,
-0x01,0xc2,0xfe,0x3e,0x01,0xc2,0xfe,0x32,0x78,0x96,0x78,0x00,0x00,0x02,0xfd,0x15,
-0xfe,0x14,0xfe,0xeb,0xff,0x8c,0x00,0x03,0x00,0x07,0x00,0x00,0x05,0x33,0x11,0x23,
-0x01,0x33,0x11,0x23,0xfd,0x15,0x96,0x96,0x01,0x40,0x96,0x96,0x74,0xfe,0x88,0x01,
-0x78,0xfe,0x88,0x00,0x00,0x01,0xfd,0x1f,0xfe,0x14,0xfe,0xe1,0xff,0xd6,0x00,0x05,
-0x00,0x00,0x05,0x21,0x11,0x23,0x11,0x21,0xfd,0x1f,0x01,0xc2,0x96,0xfe,0xd4,0x2a,
-0xfe,0x3e,0x01,0x2c,0x00,0x01,0xfc,0xb6,0x04,0xee,0xff,0x4a,0x06,0x66,0x00,0x27,
-0x00,0x00,0x01,0x37,0x33,0x07,0x16,0x17,0x16,0x33,0x32,0x37,0x36,0x37,0x33,0x06,
-0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x07,0x23,0x37,0x26,0x27,0x26,0x23,0x22,0x07,
-0x06,0x07,0x23,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0xfd,0xff,0x42,0x6d,0x6b,0x0b,
-0x16,0x10,0x0d,0x26,0x12,0x12,0x02,0x7d,0x02,0x33,0x33,0x5b,0x26,0x20,0x1e,0x21,
-0x42,0x6e,0x6b,0x0d,0x14,0x10,0x0d,0x26,0x12,0x12,0x02,0x7d,0x02,0x33,0x33,0x5b,
-0x26,0x20,0x1e,0x05,0xff,0x67,0xa9,0x09,0x0e,0x0a,0x24,0x25,0x52,0x87,0x4a,0x49,
-0x0e,0x0d,0x1d,0x67,0xa8,0x0b,0x0d,0x0a,0x24,0x25,0x52,0x87,0x4a,0x49,0x0e,0x0d,
-0x00,0x03,0xfc,0xb6,0x04,0x89,0xff,0x4a,0x06,0xcc,0x00,0x03,0x00,0x07,0x00,0x25,
-0x00,0x00,0x01,0x33,0x15,0x23,0x13,0x33,0x15,0x23,0x07,0x27,0x2e,0x01,0x23,0x22,
-0x06,0x1d,0x01,0x23,0x34,0x36,0x33,0x32,0x16,0x1f,0x01,0x1e,0x01,0x33,0x32,0x36,
-0x3d,0x01,0x33,0x0e,0x01,0x23,0x22,0x26,0xfd,0x48,0x96,0x96,0xd2,0x96,0x96,0x1e,
-0x39,0x19,0x1f,0x0c,0x24,0x28,0x7d,0x67,0x56,0x24,0x3d,0x30,0x39,0x17,0x22,0x0f,
-0x20,0x28,0x7d,0x02,0x67,0x54,0x22,0x3b,0x05,0x1f,0x96,0x02,0x43,0x96,0xce,0x21,
-0x0e,0x0b,0x32,0x2d,0x06,0x65,0x76,0x10,0x1b,0x1e,0x0d,0x0c,0x33,0x29,0x06,0x64,
-0x77,0x10,0xff,0xff,0xfc,0xb6,0x04,0xc5,0xff,0x4a,0x06,0x90,0x10,0x22,0x0b,0xeb,
-0x00,0xb7,0x10,0x03,0x0b,0xeb,0x00,0x00,0x00,0xa7,0x00,0x01,0xfc,0x63,0xfe,0x28,
-0xff,0x9d,0xff,0xc2,0x00,0x0d,0x00,0x00,0x01,0x37,0x21,0x17,0x23,0x27,0x37,0x33,
-0x07,0x21,0x27,0x33,0x17,0x07,0xfe,0x70,0x84,0xfe,0x19,0x84,0x7f,0xaf,0xaf,0x7f,
-0x84,0x01,0xe7,0x84,0x7e,0xaf,0xaf,0xfe,0x28,0x9b,0x9b,0xcd,0xcd,0x9b,0x9b,0xcd,
-0xcd,0x00,0x00,0x01,0xfd,0x33,0xfe,0x14,0xfe,0xcd,0xff,0xa4,0x00,0x08,0x00,0x00,
-0x01,0x23,0x35,0x07,0x35,0x37,0x17,0x15,0x27,0xfe,0x32,0x64,0x9b,0xcd,0xcd,0x9b,
-0xfe,0x14,0xe7,0x84,0x7e,0xaf,0xaf,0x7e,0x84,0x00,0x00,0x01,0xfd,0x78,0x04,0xe1,
-0xfe,0x88,0x07,0x06,0x00,0x10,0x00,0x00,0x01,0x06,0x07,0x06,0x15,0x14,0x17,0x16,
-0x17,0x15,0x26,0x27,0x26,0x34,0x37,0x36,0x37,0xfe,0x88,0x40,0x2a,0x2c,0x2c,0x2a,
-0x40,0x72,0x4e,0x50,0x50,0x4e,0x72,0x06,0x8b,0x01,0x2a,0x2c,0x40,0x41,0x2b,0x2b,
-0x01,0x7b,0x01,0x4f,0x50,0xe6,0x50,0x4e,0x01,0x00,0xff,0xff,0xfc,0xbf,0x05,0x29,
-0xff,0x31,0x06,0xd8,0x10,0x27,0x02,0xb4,0x00,0x00,0x00,0x90,0x10,0x06,0x02,0xaa,
-0x00,0xe5,0xff,0xff,0xfd,0x2a,0xfd,0x54,0xfe,0xe6,0xff,0x10,0x10,0x07,0x02,0xe0,
-0x00,0x00,0xf8,0x62,0x00,0x01,0xfd,0x78,0x04,0xe1,0xfe,0x88,0x07,0x06,0x00,0x10,
-0x00,0x00,0x01,0x35,0x16,0x17,0x16,0x14,0x07,0x06,0x07,0x35,0x36,0x37,0x36,0x35,
-0x34,0x27,0x26,0xfd,0x78,0x72,0x4e,0x50,0x50,0x4e,0x72,0x40,0x2a,0x2c,0x2c,0x2a,
-0x06,0x8b,0x7b,0x01,0x4e,0x50,0xe6,0x50,0x4f,0x01,0x7b,0x01,0x2b,0x2b,0x41,0x40,
-0x2c,0x2a,0xff,0xff,0xff,0x2e,0x05,0x44,0xff,0xfa,0x06,0x10,0x10,0x07,0x02,0x8d,
-0xfd,0x94,0x00,0x00,0xff,0xff,0xfc,0x70,0xfe,0x1b,0x03,0x90,0xff,0x85,0x10,0x07,
-0x07,0x98,0xfc,0xc9,0x00,0x00,0xff,0xff,0xfc,0x70,0x06,0x6b,0x03,0x90,0x07,0xd5,
-0x10,0x07,0x07,0x98,0xfc,0xc9,0x08,0x50,0x00,0x01,0xfd,0x2a,0x05,0x1d,0x02,0xd6,
-0x06,0x37,0x00,0x23,0x00,0x00,0x03,0x27,0x26,0x27,0x26,0x23,0x22,0x07,0x06,0x07,
-0x23,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x1f,0x01,0x16,0x17,0x16,0x33,0x32,0x37,
-0x36,0x37,0x33,0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x04,0x90,0x1c,0x4f,0x2c,0x24,
-0x65,0x35,0x46,0x05,0xa2,0x04,0x71,0x70,0xc8,0x5b,0x3f,0x39,0x5a,0x90,0x1c,0x4f,
-0x2c,0x24,0x61,0x39,0x47,0x04,0xa2,0x04,0x71,0x70,0xc8,0x5b,0x3f,0x39,0x05,0x5a,
-0x37,0x0b,0x12,0x0a,0x24,0x30,0x47,0x87,0x4a,0x49,0x0e,0x0d,0x22,0x37,0x0b,0x12,
-0x0a,0x24,0x2c,0x4b,0x87,0x4a,0x49,0x0e,0x0d,0x00,0xff,0xff,0xfc,0x70,0x06,0x04,
-0x03,0x90,0x07,0x6e,0x10,0x07,0x07,0x99,0xfc,0xc9,0x00,0x00,0x00,0x01,0xfc,0x77,
-0xfe,0x28,0x03,0x93,0xff,0xc2,0x00,0x08,0x00,0x00,0x01,0x35,0x21,0x27,0x33,0x17,
-0x07,0x23,0x37,0xfc,0x77,0x06,0x73,0x84,0x7e,0xaf,0xaf,0x7e,0x84,0xfe,0xc3,0x64,
-0x9b,0xcd,0xcd,0x9b,0x00,0x01,0x00,0xa0,0x04,0x74,0x01,0x9f,0x06,0x66,0x00,0x03,
-0x00,0x11,0x40,0x06,0x01,0x00,0x04,0x02,0x00,0x04,0x10,0xd4,0xcc,0x31,0x00,0x10,
-0xd4,0xcc,0x30,0x1b,0x01,0x33,0x03,0xa0,0x41,0xbe,0x6e,0x04,0x74,0x01,0xf2,0xfe,
-0x0e,0x00,0x00,0x01,0x00,0xa0,0xfe,0x56,0x01,0x9f,0x00,0x48,0x00,0x03,0x00,0x11,
-0x40,0x06,0x02,0x03,0x04,0x00,0x02,0x04,0x10,0xd4,0xcc,0x31,0x00,0x10,0xd4,0xcc,
-0x30,0x25,0x03,0x23,0x13,0x01,0x9f,0x41,0xbe,0x6e,0x48,0xfe,0x0e,0x01,0xf2,0x00,
-0x00,0x01,0x01,0xb6,0xfe,0x56,0x02,0x92,0xff,0xa4,0x00,0x09,0x00,0x00,0x01,0x23,
-0x22,0x3d,0x01,0x33,0x15,0x14,0x3b,0x01,0x02,0x92,0x84,0x58,0x95,0x33,0x14,0xfe,
-0x56,0xb7,0x97,0xa4,0x68,0x00,0xff,0xff,0x00,0x9e,0xff,0x12,0x01,0xc3,0x04,0x23,
-0x12,0x06,0x00,0x1e,0x00,0x00,0x00,0x01,0x01,0x73,0x04,0xee,0x03,0x52,0x06,0x66,
-0x00,0x03,0x00,0x31,0x40,0x09,0x02,0xb4,0x00,0xb3,0x04,0x03,0x44,0x01,0x04,0x10,
-0xd4,0xec,0x31,0x00,0x10,0xf4,0xec,0x30,0x00,0x4b,0xb0,0x09,0x54,0x4b,0xb0,0x0e,
-0x54,0x5b,0x58,0xbd,0x00,0x04,0xff,0xc0,0x00,0x01,0x00,0x04,0x00,0x04,0x00,0x40,
-0x38,0x11,0x37,0x38,0x59,0x01,0x33,0x01,0x23,0x02,0x8b,0xc7,0xfe,0xba,0x99,0x06,
-0x66,0xfe,0x88,0x00,0xff,0xff,0x00,0xd7,0x05,0x46,0x03,0x52,0x07,0xd2,0x12,0x26,
-0x00,0x6a,0x00,0x00,0x11,0x07,0x03,0x00,0x00,0x00,0x01,0x6c,0x00,0x14,0x00,0x40,
-0x07,0xaf,0x08,0x9f,0x08,0x5f,0x08,0x03,0x5d,0x40,0x05,0x5f,0x08,0x0f,0x08,0x02,
-0x71,0x30,0xff,0xff,0x00,0x10,0x00,0x00,0x05,0x68,0x06,0x66,0x10,0x27,0x03,0x00,
-0xfe,0xda,0x00,0x00,0x10,0x06,0x03,0x0b,0x00,0x00,0xff,0xff,0x00,0xdb,0x02,0x48,
-0x01,0xae,0x03,0x46,0x12,0x06,0x00,0x79,0x00,0x00,0xff,0xff,0xff,0xe7,0x00,0x00,
-0x05,0x75,0x06,0x66,0x10,0x27,0x03,0x00,0xfe,0x74,0x00,0x00,0x10,0x07,0x03,0x0f,
-0x00,0xea,0x00,0x00,0xff,0xff,0xff,0xf3,0x00,0x00,0x06,0x1f,0x06,0x66,0x10,0x27,
-0x03,0x00,0xfe,0x80,0x00,0x00,0x10,0x07,0x03,0x11,0x00,0xe4,0x00,0x00,0xff,0xff,
-0xff,0xed,0x00,0x00,0x02,0x7d,0x06,0x66,0x10,0x27,0x03,0x00,0xfe,0x7a,0x00,0x00,
-0x10,0x07,0x03,0x13,0x00,0xea,0x00,0x00,0xff,0xff,0xff,0xf2,0xff,0xe3,0x06,0x01,
-0x06,0x66,0x10,0x27,0x03,0x00,0xfe,0x7f,0x00,0x00,0x10,0x06,0x03,0x19,0x28,0x00,
-0xff,0xff,0xff,0xe1,0x00,0x00,0x06,0x91,0x06,0x66,0x10,0x27,0x03,0x00,0xfe,0x6e,
-0x00,0x00,0x10,0x07,0x03,0x1e,0x01,0xaa,0x00,0x00,0xff,0xff,0xff,0xdb,0x00,0x00,
-0x06,0x05,0x06,0x66,0x10,0x27,0x03,0x00,0xfe,0x68,0x00,0x00,0x10,0x06,0x03,0x22,
-0x36,0x00,0xff,0xff,0x00,0x05,0x00,0x00,0x02,0x80,0x07,0xd2,0x10,0x27,0x03,0x01,
-0xff,0x2e,0x00,0x00,0x12,0x06,0x03,0x32,0x0f,0x00,0xff,0xff,0x00,0x10,0x00,0x00,
-0x05,0x68,0x05,0xd5,0x12,0x06,0x00,0x24,0x00,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,
-0x04,0xec,0x05,0xd5,0x12,0x06,0x00,0x25,0x00,0x00,0x00,0x01,0x00,0xc9,0x00,0x00,
-0x04,0x6a,0x05,0xd5,0x00,0x05,0x00,0x19,0x40,0x0c,0x04,0x95,0x01,0x81,0x00,0x07,
-0x02,0x04,0x1c,0x01,0x04,0x06,0x10,0xfc,0xfc,0xcc,0xc4,0x31,0x00,0x2f,0xf4,0xec,
-0x30,0x33,0x11,0x21,0x15,0x21,0x11,0xc9,0x03,0xa1,0xfd,0x29,0x05,0xd5,0xaa,0xfa,
-0xd5,0x00,0x00,0x02,0x00,0x10,0x00,0x00,0x05,0x68,0x05,0xd5,0x00,0x02,0x00,0x06,
-0x00,0x3d,0x40,0x0c,0x42,0x00,0x95,0x04,0x81,0x01,0x95,0x03,0x08,0x06,0x03,0x07,
-0x10,0xd4,0xc4,0xc4,0x31,0x00,0x2f,0xec,0xf4,0xec,0x30,0x4b,0x53,0x58,0x40,0x12,
-0x00,0x11,0x05,0x04,0x03,0x02,0x11,0x06,0x06,0x05,0x00,0x11,0x04,0x01,0x11,0x03,
-0x03,0x04,0x05,0x07,0x10,0xec,0x10,0xec,0x07,0x10,0xec,0x08,0x10,0xec,0x59,0x09,
-0x01,0x21,0x05,0x01,0x33,0x01,0x02,0xbc,0xfe,0x66,0x03,0x35,0xfb,0xb9,0x02,0x3a,
-0xe5,0x02,0x39,0x05,0x0e,0xfb,0x9a,0xa8,0x05,0xd5,0xfa,0x2b,0xff,0xff,0x00,0xc9,
-0x00,0x00,0x04,0x8b,0x05,0xd5,0x12,0x06,0x00,0x28,0x00,0x00,0xff,0xff,0x00,0x5c,
-0x00,0x00,0x05,0x1f,0x05,0xd5,0x12,0x06,0x00,0x3d,0x00,0x00,0xff,0xff,0x00,0xc9,
-0x00,0x00,0x05,0x3b,0x05,0xd5,0x12,0x06,0x00,0x2b,0x00,0x00,0x00,0x03,0x00,0x73,
-0xff,0xe3,0x05,0xd9,0x05,0xf0,0x00,0x03,0x00,0x12,0x00,0x21,0x00,0x32,0x40,0x1c,
-0x04,0x95,0x13,0x91,0x22,0x03,0x95,0x00,0xad,0x22,0x0b,0x95,0x1a,0x8c,0x22,0x23,
-0x10,0x01,0x0f,0x19,0x16,0x33,0x00,0x08,0x19,0x1e,0x10,0x22,0x10,0xfc,0xec,0xc4,
-0xf4,0xec,0xc4,0xec,0x31,0x00,0x10,0xf4,0xec,0x10,0xf4,0xec,0x10,0xf4,0xec,0x30,
-0x01,0x21,0x15,0x21,0x01,0x22,0x07,0x06,0x11,0x10,0x00,0x33,0x32,0x37,0x36,0x11,
-0x10,0x27,0x26,0x27,0x20,0x00,0x11,0x10,0x07,0x06,0x21,0x20,0x27,0x26,0x11,0x10,
-0x37,0x36,0x01,0xc5,0x02,0xc2,0xfd,0x3e,0x01,0x62,0xdc,0x81,0x82,0x01,0x03,0xdc,
-0xdc,0x81,0x80,0x80,0x81,0xdc,0x01,0x3a,0x01,0x78,0xbc,0xbc,0xfe,0xc6,0xfe,0xc5,
-0xbc,0xbd,0xbd,0xbc,0x03,0x70,0xaa,0x02,0x86,0xa4,0xa4,0xfe,0xe5,0xfe,0xe6,0xfe,
-0xb8,0xa4,0xa4,0x01,0x1a,0x01,0x1b,0xa4,0xa4,0xa4,0xfe,0x5b,0xfe,0x9e,0xfe,0x9f,
-0xd2,0xd3,0xd2,0xd2,0x01,0x62,0x01,0x62,0xd3,0xd2,0xff,0xff,0x00,0xc9,0x00,0x00,
-0x01,0x93,0x05,0xd5,0x12,0x06,0x00,0x2c,0x00,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,
-0x05,0x6a,0x05,0xd5,0x12,0x06,0x00,0x2e,0x00,0x00,0x00,0x01,0x00,0x10,0x00,0x00,
-0x05,0x68,0x05,0xd5,0x00,0x06,0x00,0x3c,0x40,0x0b,0x42,0x06,0x95,0x02,0x81,0x05,
-0x01,0x08,0x04,0x01,0x07,0x10,0xd4,0xc4,0xc4,0x31,0x00,0x2f,0x3c,0xf4,0xec,0x30,
-0x4b,0x53,0x58,0x40,0x12,0x06,0x11,0x03,0x02,0x01,0x05,0x11,0x04,0x04,0x03,0x06,
-0x11,0x02,0x00,0x11,0x01,0x01,0x02,0x05,0x07,0x10,0xec,0x10,0xec,0x07,0x10,0xec,
-0x08,0x10,0xec,0x59,0x33,0x23,0x01,0x33,0x01,0x23,0x01,0xe5,0xd5,0x02,0x3a,0xe5,
-0x02,0x39,0xd2,0xfe,0x26,0x05,0xd5,0xfa,0x2b,0x05,0x0e,0x00,0xff,0xff,0x00,0xc9,
-0x00,0x00,0x06,0x1f,0x05,0xd5,0x12,0x06,0x00,0x30,0x00,0x00,0xff,0xff,0x00,0xc9,
-0x00,0x00,0x05,0x33,0x05,0xd5,0x12,0x06,0x00,0x31,0x00,0x00,0x00,0x03,0x00,0xc9,
-0x00,0x00,0x04,0x62,0x05,0xd5,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x2a,0x40,0x16,
-0x07,0x95,0x04,0x81,0x0b,0x03,0x95,0x00,0xad,0x08,0x95,0x0b,0x0d,0x04,0x01,0x09,
-0x05,0x00,0x08,0x04,0x04,0x0c,0x10,0xfc,0x3c,0xc4,0xd4,0x3c,0xc4,0xec,0x31,0x00,
-0x2f,0xec,0xf4,0xec,0x10,0xf4,0xec,0x30,0x01,0x21,0x15,0x21,0x03,0x21,0x15,0x21,
-0x11,0x21,0x15,0x21,0x01,0x32,0x02,0xc7,0xfd,0x39,0x69,0x03,0x99,0xfc,0x67,0x03,
-0x99,0xfc,0x67,0x03,0x71,0xaa,0x03,0x0e,0xaa,0xfb,0x7f,0xaa,0xff,0xff,0x00,0x73,
-0xff,0xe3,0x05,0xd9,0x05,0xf0,0x12,0x06,0x00,0x32,0x00,0x00,0xff,0xff,0x00,0xc9,
-0x00,0x00,0x05,0x3b,0x05,0xd5,0x12,0x06,0x03,0x97,0x00,0x00,0xff,0xff,0x00,0xc9,
-0x00,0x00,0x04,0x8d,0x05,0xd5,0x12,0x06,0x00,0x33,0x00,0x00,0x00,0x01,0x00,0xc9,
-0x00,0x00,0x04,0x8b,0x05,0xd5,0x00,0x0b,0x00,0x46,0x40,0x11,0x42,0x0a,0x06,0x95,
-0x07,0x81,0x00,0x04,0x95,0x03,0x0d,0x01,0x08,0x04,0x07,0x04,0x0c,0x10,0xfc,0x3c,
-0xd4,0x3c,0xcc,0x31,0x00,0x2f,0xec,0x32,0xf4,0xec,0x32,0x30,0x4b,0x53,0x58,0x40,
-0x12,0x0b,0x11,0x05,0x05,0x04,0x0a,0x11,0x06,0x06,0x05,0x0b,0x11,0x05,0x00,0x11,
-0x04,0x05,0x04,0x05,0x07,0x10,0xec,0x10,0xec,0x07,0x10,0xec,0x08,0x10,0xec,0x59,
-0x25,0x21,0x15,0x21,0x35,0x09,0x01,0x35,0x21,0x15,0x21,0x01,0x01,0xb1,0x02,0xda,
-0xfc,0x3e,0x01,0xdf,0xfe,0x21,0x03,0xb0,0xfd,0x38,0x01,0xdf,0xaa,0xaa,0xaa,0x02,
-0x70,0x02,0x11,0xaa,0xaa,0xfd,0xf3,0x00,0xff,0xff,0xff,0xfa,0x00,0x00,0x04,0xe9,
-0x05,0xd5,0x12,0x06,0x00,0x37,0x00,0x00,0xff,0xff,0xff,0xfc,0x00,0x00,0x04,0xe7,
-0x05,0xd5,0x12,0x06,0x00,0x3c,0x00,0x00,0xff,0xff,0x00,0x73,0x00,0x00,0x05,0xd9,
-0x05,0xd5,0x12,0x06,0x03,0x9c,0x00,0x00,0xff,0xff,0x00,0x3d,0x00,0x00,0x05,0x3b,
-0x05,0xd5,0x12,0x06,0x00,0x3b,0x00,0x00,0x00,0x01,0x00,0x73,0x00,0x00,0x05,0xdb,
-0x05,0xd5,0x00,0x1d,0x00,0x2e,0x40,0x17,0x10,0x0d,0x95,0x1b,0x02,0x15,0x0e,0x07,
-0x81,0x00,0x1f,0x15,0x1c,0x16,0x02,0x0e,0x1c,0x1b,0x0f,0x08,0x1c,0x07,0x1e,0x10,
-0xdc,0xec,0xd4,0x3c,0xfc,0x3c,0xd4,0xec,0xcc,0x31,0x00,0x2f,0xe4,0x32,0x32,0xdc,
-0x3c,0xec,0x32,0x30,0x21,0x36,0x27,0x22,0x27,0x26,0x03,0x11,0x33,0x11,0x10,0x17,
-0x16,0x17,0x11,0x33,0x11,0x36,0x37,0x36,0x19,0x01,0x33,0x11,0x02,0x07,0x06,0x23,
-0x06,0x17,0x02,0xc2,0x01,0x01,0xd6,0xbc,0xb8,0x05,0xd5,0x82,0x6e,0x8a,0xca,0x8a,
-0x6e,0x82,0xd5,0x05,0xb8,0xbc,0xd6,0x01,0x01,0x86,0xb0,0xd2,0xcc,0x01,0x68,0x01,
-0x99,0xfe,0x67,0xfe,0xe6,0xa4,0x8c,0x0e,0x03,0xf1,0xfc,0x0f,0x0e,0x8c,0xa4,0x01,
-0x1a,0x01,0x99,0xfe,0x67,0xfe,0x98,0xcc,0xd2,0x48,0xee,0x00,0x00,0x01,0x00,0x4e,
-0x00,0x00,0x05,0xcf,0x05,0xe7,0x00,0x26,0x00,0x33,0x40,0x1b,0x0b,0x95,0x1e,0x91,
-0x26,0x03,0x12,0x15,0x95,0x02,0x14,0x03,0x07,0x19,0x28,0x10,0x00,0x22,0x33,0x1a,
-0x12,0x0e,0x19,0x15,0x1a,0x10,0x27,0x10,0xfc,0xc4,0xfc,0xc4,0x10,0xf4,0xc4,0xec,
-0xfc,0xc4,0x31,0x00,0x2f,0x3c,0xec,0x32,0x32,0x32,0xf4,0xec,0x30,0x25,0x15,0x21,
-0x35,0x36,0x37,0x36,0x35,0x34,0x27,0x26,0x23,0x22,0x00,0x15,0x14,0x17,0x16,0x17,
-0x15,0x21,0x35,0x21,0x26,0x27,0x26,0x35,0x10,0x37,0x36,0x21,0x20,0x17,0x16,0x11,
-0x14,0x07,0x06,0x07,0x05,0xcf,0xfd,0xa8,0xb1,0x63,0x63,0x84,0x84,0xd8,0xd8,0xfe,
-0xf7,0x63,0x64,0xb2,0xfd,0xa8,0x01,0x3f,0x9e,0x49,0x48,0xc0,0xbf,0x01,0x31,0x01,
-0x2f,0xc1,0xc0,0x47,0x47,0xa1,0xb2,0xb2,0xb2,0x61,0xa6,0xa6,0xca,0xf0,0x91,0x91,
-0xfe,0xdd,0xef,0xca,0xa6,0xa6,0x61,0xb2,0xb2,0x8b,0x95,0x95,0xb8,0x01,0x3e,0xc5,
-0xc5,0xc5,0xc4,0xfe,0xcb,0xc2,0x94,0x94,0x8d,0x00,0xff,0xff,0x00,0x06,0x00,0x00,
-0x02,0x58,0x07,0x4e,0x10,0x27,0x0b,0xe9,0x03,0x2f,0x01,0x75,0x13,0x06,0x03,0x13,
-0x00,0x00,0x00,0x08,0xb4,0x09,0x03,0x06,0x08,0x07,0x2b,0x31,0xff,0xff,0xff,0xfc,
-0x00,0x00,0x04,0xe7,0x07,0x4e,0x10,0x27,0x0b,0xe9,0x04,0x71,0x01,0x75,0x13,0x06,
-0x03,0x1e,0x00,0x00,0x00,0x08,0xb4,0x0c,0x02,0x07,0x08,0x07,0x2b,0x31,0xff,0xff,
-0x00,0x71,0xff,0xe6,0x04,0xe5,0x06,0x66,0x12,0x26,0x03,0x2a,0x00,0x00,0x10,0x06,
-0x03,0x00,0x6e,0x00,0xff,0xff,0x00,0x85,0xff,0xe3,0x03,0xc8,0x06,0x66,0x10,0x26,
-0x03,0x00,0x50,0x00,0x12,0x06,0x03,0x2e,0x00,0x00,0xff,0xff,0x00,0xba,0xfe,0x56,
-0x04,0x64,0x06,0x66,0x10,0x27,0x03,0x00,0x00,0xc6,0x00,0x00,0x12,0x06,0x03,0x30,
-0x00,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x02,0x98,0x06,0x66,0x12,0x26,0x03,0x32,
-0x00,0x00,0x10,0x07,0x03,0x00,0xff,0x46,0x00,0x00,0xff,0xff,0x00,0x95,0xff,0xff,
-0x04,0x2a,0x07,0xd2,0x12,0x26,0x03,0x3e,0x00,0x00,0x10,0x06,0x03,0x01,0x1b,0x00,
-0x00,0x02,0x00,0x71,0xff,0xe6,0x04,0xe5,0x04,0x7a,0x00,0x0d,0x00,0x2a,0x00,0x68,
-0x40,0x0b,0x12,0x11,0x07,0x2c,0x10,0x17,0x07,0x12,0x25,0x45,0x2b,0x10,0xfc,0xec,
-0xd4,0xc4,0xc4,0x12,0x39,0x39,0x40,0x0a,0x3f,0x10,0x2f,0x10,0x1f,0x10,0x03,0x8f,
-0x10,0x01,0x5d,0x71,0x00,0x40,0x11,0x12,0x11,0x0b,0x03,0xb9,0x29,0xb8,0x19,0x0b,
-0xb9,0x21,0x8c,0x0f,0xbc,0x16,0x87,0x19,0x2f,0xec,0xe4,0xf4,0xec,0x10,0xf4,0xec,
-0x11,0x39,0x39,0x05,0x40,0x14,0x1d,0x11,0x00,0x11,0x0e,0x11,0x12,0x11,0x11,0x10,
-0x0f,0x11,0x0e,0x11,0x00,0x11,0x1d,0x11,0x11,0x10,0x07,0x10,0x3c,0xec,0xec,0xec,
-0x08,0x07,0x10,0x3c,0xec,0xec,0x31,0x30,0x01,0x27,0x26,0x27,0x26,0x07,0x06,0x15,
-0x14,0x17,0x16,0x33,0x32,0x37,0x1b,0x01,0x33,0x03,0x17,0x16,0x17,0x16,0x3b,0x01,
-0x15,0x23,0x22,0x27,0x26,0x27,0x06,0x07,0x06,0x27,0x26,0x27,0x26,0x11,0x10,0x37,
-0x36,0x37,0x24,0x03,0x4e,0x2c,0x2d,0xb2,0x86,0x3d,0x4d,0x4b,0x4c,0x79,0x86,0x48,
-0xa4,0x63,0xa4,0xcd,0x28,0x09,0x23,0x29,0x20,0x58,0x6e,0x5e,0x54,0x29,0x11,0x2c,
-0x60,0x2c,0x8f,0xea,0x73,0x75,0x7f,0x8d,0xc6,0x01,0x37,0x02,0x09,0xe7,0xec,0x01,
-0x01,0x6f,0x89,0xb7,0xdc,0x69,0x6b,0xd5,0x01,0xe7,0x01,0x25,0xfd,0xa1,0xdb,0x31,
-0x29,0x30,0x9c,0x54,0x2a,0x58,0x6b,0x5b,0x2a,0x01,0x02,0x96,0x9c,0x01,0x14,0x01,
-0x29,0x87,0x97,0x03,0x05,0x00,0x00,0x02,0x00,0xbf,0xfe,0x56,0x04,0x89,0x06,0x23,
-0x00,0x0e,0x00,0x1c,0x00,0x37,0x40,0x0f,0x18,0x12,0x07,0x1e,0x45,0x13,0x12,0x0b,
-0x16,0x00,0x1c,0x08,0x03,0x46,0x1d,0x10,0xfc,0xec,0x32,0xc4,0xd4,0xec,0xe4,0xd4,
-0xec,0x31,0x00,0x40,0x0e,0x1a,0xb9,0x05,0x09,0x15,0xb9,0x16,0x11,0xb9,0x0d,0x8c,
-0x02,0xbd,0x1d,0x10,0xec,0xf4,0xec,0xd4,0xfc,0x39,0xd4,0xec,0x30,0x25,0x11,0x23,
-0x11,0x10,0x05,0x04,0x11,0x02,0x07,0x04,0x13,0x12,0x05,0x06,0x03,0x16,0x17,0x04,
-0x11,0x10,0x05,0x35,0x04,0x11,0x34,0x27,0x24,0x11,0x01,0x79,0xb9,0x01,0xcd,0x01,
-0x8f,0x01,0xab,0x01,0x16,0x02,0x04,0xfe,0x1a,0x82,0xab,0x51,0xe3,0x01,0x20,0xfe,
-0x30,0x01,0x6b,0xea,0xfe,0xfb,0x45,0xfe,0x11,0x06,0x03,0x01,0xe7,0x1f,0x1b,0xfe,
-0x9a,0xfe,0xec,0x62,0x36,0xfe,0xd1,0xfe,0x3d,0x17,0x06,0x01,0x71,0x8d,0x15,0x19,
-0x01,0x27,0x01,0x1a,0x16,0xaa,0x06,0x01,0x30,0xbd,0x0d,0x0f,0xfe,0xe0,0x00,0x01,
-0x00,0x20,0xfe,0x56,0x04,0x7f,0x04,0x60,0x00,0x0e,0x00,0x40,0x40,0x07,0x10,0x03,
-0x07,0x08,0x04,0x0c,0x0f,0x10,0xd4,0xd4,0xfc,0xd4,0xc4,0x31,0x00,0x40,0x07,0x02,
-0x0c,0xbf,0x06,0xbd,0x04,0x07,0x2f,0x3c,0xec,0xe4,0x32,0x30,0x05,0x40,0x12,0x01,
-0x11,0x08,0x07,0x02,0x11,0x03,0x04,0x03,0x0e,0x0d,0x01,0x11,0x00,0x11,0x07,0x08,
-0x07,0x07,0x10,0xec,0xec,0x39,0x39,0x07,0x10,0xec,0x08,0xec,0x01,0x13,0x01,0x33,
-0x01,0x11,0x23,0x11,0x01,0x26,0x2b,0x01,0x35,0x33,0x32,0x01,0x69,0xf5,0x01,0x5e,
-0xc3,0xfe,0x3b,0xb8,0xfe,0xda,0x2c,0x5f,0x31,0x46,0xc5,0x03,0xb0,0xfd,0x4c,0x03,
-0x64,0xfb,0xa0,0xfe,0x56,0x01,0xaa,0x03,0x44,0x7e,0x9e,0x00,0x00,0x02,0x00,0x71,
-0xff,0xe3,0x04,0x75,0x05,0xf0,0x00,0x1c,0x00,0x2d,0x00,0x54,0x40,0x14,0x06,0x05,
-0x28,0x04,0x2f,0x45,0x1c,0x28,0x12,0x0a,0x51,0x12,0x04,0x12,0x18,0x21,0x12,0x12,
-0x45,0x2e,0x10,0xfc,0xec,0xd4,0xec,0x10,0xf4,0xb2,0x7f,0x0a,0x01,0x5d,0xec,0xc4,
-0xec,0x11,0x12,0x39,0x39,0x00,0x40,0x0e,0x06,0x05,0x25,0x02,0x1c,0x00,0x02,0xb9,
-0x1a,0x25,0xb9,0x0e,0x8c,0x2e,0x10,0xf4,0xec,0xd4,0xfc,0xd4,0xcc,0x11,0x12,0x39,
-0x39,0x40,0x06,0x16,0x1d,0x53,0x05,0x06,0x05,0x07,0x0e,0x10,0xec,0x39,0x31,0x30,
-0x01,0x26,0x23,0x22,0x15,0x14,0x05,0x16,0x17,0x16,0x11,0x10,0x07,0x06,0x23,0x22,
-0x27,0x26,0x11,0x34,0x37,0x36,0x37,0x26,0x35,0x10,0x21,0x32,0x17,0x01,0x06,0x07,
-0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x26,0x27,0x26,0x03,0xec,
-0x66,0xef,0xfd,0x01,0x08,0xd0,0x75,0x8e,0x89,0x89,0xf0,0xef,0x8a,0x89,0x89,0x35,
-0x4b,0x9c,0x01,0xb9,0xdd,0x78,0xfe,0x18,0x44,0x37,0x56,0x55,0x56,0x95,0x93,0xac,
-0x5b,0x61,0x7e,0x40,0x05,0x11,0x46,0x75,0x5c,0x30,0x25,0x70,0x87,0xfe,0xeb,0xfe,
-0xf7,0x9c,0x9d,0x9d,0x9c,0x01,0x13,0xcc,0xa5,0x40,0x24,0x4f,0x8d,0x01,0x10,0x46,
-0xfe,0x28,0x1d,0x49,0x71,0xcc,0xcb,0x72,0x73,0xe8,0xbe,0xc7,0x60,0x67,0x0b,0x06,
-0x00,0x01,0x00,0x85,0xff,0xe3,0x03,0xc8,0x04,0x7c,0x00,0x32,0x00,0x3d,0x40,0x22,
-0x0c,0x86,0x0b,0x88,0x10,0xb9,0x08,0xb8,0x33,0x1b,0xa9,0x18,0x33,0x27,0x86,0x28,
-0x88,0x23,0xb9,0x2c,0x8c,0x33,0x34,0x19,0x0b,0x27,0x14,0x08,0x04,0x1f,0x08,0x30,
-0x45,0x33,0x10,0xfc,0xec,0xd4,0xec,0xd4,0xc4,0xc4,0xc4,0x31,0x00,0x10,0xf4,0xec,
-0xf4,0xec,0x10,0xd4,0xec,0x10,0xf4,0xec,0xf4,0xec,0x30,0x01,0x26,0x27,0x26,0x35,
-0x34,0x37,0x36,0x33,0x32,0x16,0x17,0x15,0x26,0x27,0x26,0x23,0x22,0x07,0x06,0x15,
-0x14,0x17,0x16,0x3b,0x01,0x15,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x32,
-0x37,0x36,0x37,0x15,0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x36,0x01,0x8b,
-0x70,0x3c,0x3c,0x72,0x71,0xc4,0x4c,0xaa,0x62,0x61,0x50,0x51,0x47,0x77,0x45,0x46,
-0x44,0x43,0x74,0x9b,0x94,0x89,0x48,0x4e,0x54,0x55,0x97,0x5d,0x55,0x55,0x47,0x5a,
-0x54,0x55,0x50,0xee,0x81,0x81,0x8a,0x02,0x5c,0x18,0x41,0x40,0x5d,0x8d,0x4f,0x4e,
-0x18,0x18,0xa7,0x1d,0x0d,0x0d,0x2e,0x2e,0x40,0x46,0x2d,0x2c,0x98,0x33,0x38,0x58,
-0x5a,0x38,0x38,0x12,0x13,0x25,0xab,0x1c,0x0e,0x0e,0x5b,0x5b,0xad,0x6c,0x92,0x00,
-0x00,0x01,0x00,0x6a,0xfe,0x52,0x03,0xf8,0x06,0x14,0x00,0x1d,0x00,0x3e,0x40,0x0b,
-0x0a,0x0e,0x12,0x1f,0x04,0x19,0x18,0x1c,0x12,0x14,0x1e,0x10,0xd4,0xec,0xd4,0xd4,
-0xd4,0xc4,0xfc,0xcc,0x4b,0xb0,0x10,0x51,0x58,0xb9,0x00,0x16,0x00,0x40,0x38,0x59,
-0x31,0x00,0x40,0x0e,0x08,0xb9,0x0a,0x00,0xb9,0x12,0x8c,0x1e,0x1a,0x17,0x87,0x18,
-0x97,0x1e,0x10,0xf4,0xec,0x32,0x10,0xf4,0xec,0xdc,0xec,0x30,0x25,0x16,0x17,0x16,
-0x15,0x14,0x07,0x06,0x23,0x34,0x35,0x16,0x37,0x36,0x35,0x34,0x27,0x26,0x23,0x20,
-0x03,0x02,0x01,0x21,0x35,0x21,0x15,0x00,0x13,0x12,0x02,0xca,0x84,0x4f,0x54,0x4a,
-0x50,0xa3,0x45,0x2a,0x20,0x20,0x1f,0x3a,0xfd,0xb5,0x14,0x11,0x02,0x4c,0xfd,0xec,
-0x03,0x66,0xfc,0xfe,0x2e,0x2c,0x7f,0x01,0x4b,0x4f,0x78,0x73,0x50,0x57,0x4b,0x4c,
-0x05,0x2c,0x23,0x25,0x35,0x2c,0x2a,0x02,0x33,0x01,0xe0,0x01,0x65,0xb9,0xb9,0xfe,
-0x61,0xfe,0x5a,0xfe,0x69,0x00,0x00,0x01,0x00,0xba,0xfe,0x56,0x04,0x64,0x04,0x7b,
-0x00,0x15,0x00,0x31,0x40,0x16,0x06,0x87,0x0e,0x12,0xb8,0x0c,0xbc,0x02,0xbd,0x0b,
-0x17,0x46,0x03,0x08,0x00,0x4e,0x09,0x0d,0x08,0x0c,0x46,0x16,0x10,0xfc,0xec,0x32,
-0xf4,0xec,0xec,0x31,0x00,0x2f,0xec,0xe4,0xf4,0xc4,0xec,0x30,0x40,0x05,0xa0,0x17,
-0x80,0x17,0x02,0x01,0x5d,0x01,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,
-0x23,0x11,0x33,0x15,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x04,0x64,0xb8,0x7c,0x7c,
-0x95,0xac,0xb9,0xb9,0x42,0x59,0x5a,0x75,0xc1,0x63,0x63,0x02,0xa4,0xfb,0xb2,0x04,
-0x48,0x9f,0x9e,0xbe,0xa4,0xfd,0x87,0x04,0x60,0xae,0x65,0x32,0x32,0x77,0x78,0x00,
-0x00,0x03,0x00,0x71,0xff,0xe9,0x04,0x75,0x06,0x24,0x00,0x08,0x00,0x11,0x00,0x21,
-0x00,0x3f,0x40,0x1b,0x0d,0xb9,0x12,0x97,0x22,0x01,0x95,0x11,0x22,0x05,0xb9,0x1a,
-0x8c,0x22,0x23,0x45,0x00,0x09,0x12,0x16,0x51,0x01,0x11,0x12,0x1e,0x45,0x22,0x10,
-0xfc,0xec,0x32,0xf4,0xb2,0x7f,0x16,0x01,0x5d,0xec,0x32,0xec,0x31,0x00,0x10,0xf4,
-0xec,0x10,0xd4,0xec,0x10,0xf4,0xec,0x30,0x40,0x05,0xa0,0x23,0x80,0x23,0x02,0x01,
-0x5d,0x01,0x21,0x16,0x17,0x16,0x33,0x32,0x37,0x36,0x13,0x26,0x27,0x26,0x23,0x22,
-0x07,0x06,0x07,0x01,0x32,0x17,0x16,0x11,0x10,0x07,0x06,0x23,0x22,0x27,0x26,0x11,
-0x10,0x37,0x36,0x03,0xb1,0xfd,0x83,0x09,0x4b,0x56,0x95,0x93,0x56,0x4c,0x06,0x0e,
-0x44,0x56,0x93,0x94,0x56,0x45,0x0e,0x01,0x3d,0xf0,0x89,0x89,0x89,0x89,0xf0,0xf1,
-0x88,0x89,0x89,0x88,0x02,0xc6,0xe4,0x89,0x9c,0x9d,0x8a,0x01,0x8c,0xc3,0x7f,0x9e,
-0x9c,0x7e,0xc6,0x02,0xb4,0xd4,0xd3,0xfe,0x8a,0xfe,0x8b,0xd4,0xd5,0xd5,0xd4,0x01,
-0x75,0x01,0x76,0xd3,0xd4,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x02,0x6e,0x04,0x60,
-0x00,0x0d,0x00,0x1b,0x40,0x07,0x0f,0x06,0x00,0x08,0x0d,0x46,0x0e,0x10,0xfc,0xfc,
-0xd4,0xc4,0x31,0x00,0x40,0x05,0x0d,0xbc,0x05,0x87,0x08,0x2f,0xec,0xe4,0x30,0x01,
-0x11,0x14,0x17,0x16,0x3b,0x01,0x15,0x23,0x22,0x27,0x26,0x35,0x03,0x01,0x63,0x22,
-0x24,0x6c,0x59,0x6f,0xb4,0x52,0x52,0x01,0x04,0x60,0xfd,0x2b,0x91,0x2e,0x30,0x9c,
-0x60,0x62,0xd4,0x02,0xca,0x00,0x00,0x01,0x00,0xbf,0x00,0x00,0x04,0x85,0x04,0x60,
-0x00,0x0b,0x00,0x49,0x40,0x09,0x0d,0x06,0x04,0x09,0x01,0x08,0x0b,0x46,0x0c,0x10,
-0xfc,0xec,0x32,0xc4,0xd4,0xc4,0x31,0x00,0x40,0x05,0x03,0x00,0xbc,0x07,0x0b,0x2f,
-0x3c,0xe4,0x32,0x30,0x40,0x16,0x08,0x11,0x09,0x04,0x05,0x07,0x11,0x06,0x06,0x05,
-0x08,0x05,0x09,0x04,0x03,0x11,0x04,0x02,0x11,0x09,0x09,0x04,0x07,0x10,0x04,0xec,
-0x10,0x05,0xec,0x09,0x3c,0x3c,0x07,0x10,0x05,0xec,0x10,0x08,0xec,0x13,0x33,0x11,
-0x01,0x33,0x09,0x01,0x23,0x01,0x07,0x11,0x23,0xbf,0xbe,0x01,0xe3,0xe0,0xfe,0x47,
-0x01,0xfe,0xe1,0xfe,0x62,0x89,0xbe,0x04,0x60,0xfe,0x2f,0x01,0xd1,0xfe,0x5a,0xfd,
-0x46,0x02,0x42,0x81,0xfe,0x3f,0x00,0x01,0x00,0x3d,0x00,0x00,0x04,0x7f,0x06,0x15,
-0x00,0x0d,0x00,0x46,0x40,0x05,0x0f,0x01,0x0b,0x05,0x0e,0x10,0xd4,0xc4,0xd4,0xc4,
-0x31,0x00,0x40,0x06,0x0a,0x87,0x0b,0x97,0x02,0x05,0x2f,0x3c,0xf4,0xec,0x30,0x40,
-0x18,0x03,0x11,0x01,0x00,0x06,0x04,0x11,0x05,0x06,0x05,0x07,0x11,0x06,0x11,0x03,
-0x11,0x01,0x00,0x00,0x02,0x11,0x00,0x01,0x00,0x07,0x10,0x05,0xec,0x10,0x09,0xec,
-0xec,0x05,0xec,0x07,0x10,0x05,0xec,0x10,0x08,0xec,0x09,0x01,0x23,0x09,0x01,0x23,
-0x01,0x27,0x26,0x07,0x23,0x35,0x17,0x04,0x02,0x7a,0x02,0x05,0xc3,0xfe,0xc6,0xfe,
-0x7e,0xc3,0x01,0xeb,0x4a,0x2f,0x9a,0x31,0x46,0x01,0x12,0x05,0x65,0xfa,0x9b,0x03,
-0x3c,0xfc,0xc4,0x04,0x32,0xc6,0x7f,0x01,0x9e,0x02,0x07,0x00,0xff,0xff,0x00,0xae,
-0xfe,0x56,0x04,0xe5,0x04,0x60,0x10,0x06,0x00,0x77,0x00,0x00,0x00,0x01,0x00,0x4a,
-0x00,0x00,0x04,0x18,0x04,0x60,0x00,0x15,0x00,0x41,0x40,0x07,0x17,0x07,0x12,0x11,
-0x00,0x01,0x16,0x10,0xd4,0xc4,0xd4,0xec,0xc4,0x31,0x40,0x04,0x0b,0x01,0xbc,0x00,
-0x00,0x2f,0xe4,0x32,0x30,0x40,0x15,0x14,0x13,0x12,0x11,0x15,0x11,0x06,0x05,0x04,
-0x03,0x07,0x03,0x11,0x01,0x00,0x00,0x02,0x11,0x01,0x01,0x00,0x07,0x10,0x05,0xec,
-0x10,0x09,0xec,0x12,0x17,0x39,0x05,0xec,0x12,0x17,0x39,0x21,0x01,0x33,0x01,0x36,
-0x37,0x36,0x37,0x36,0x27,0x26,0x27,0x33,0x31,0x16,0x17,0x16,0x15,0x14,0x07,0x06,
-0x07,0x01,0xa0,0xfe,0xaa,0xc6,0x01,0x21,0x78,0x64,0x4c,0x04,0x02,0x18,0x1c,0x6a,
-0xba,0x45,0x2e,0x2a,0x88,0xb1,0x7b,0x04,0x60,0xfc,0x54,0x7c,0xac,0x81,0x70,0x35,
-0x64,0x77,0x83,0x59,0x7c,0x72,0x4e,0xc4,0xaf,0xe4,0x74,0x00,0x00,0x01,0x00,0x6b,
-0xfe,0x52,0x04,0x01,0x06,0x14,0x00,0x26,0x00,0x40,0x40,0x0f,0x0a,0x0e,0x12,0x28,
-0x04,0x22,0x1d,0x1c,0x20,0x12,0x18,0x25,0x12,0x14,0x27,0x10,0xd4,0xec,0xd4,0xec,
-0xd4,0xd4,0xc4,0xd4,0xc4,0xfc,0xcc,0x31,0x40,0x12,0x08,0xb9,0x0a,0x00,0xb9,0x12,
-0x8c,0x27,0x16,0x23,0x87,0x22,0x1e,0x1b,0x87,0x1c,0x97,0x27,0x00,0x10,0xf4,0xfc,
-0x3c,0xd4,0xec,0x39,0x10,0xf4,0xec,0xdc,0xec,0x30,0x25,0x16,0x17,0x16,0x15,0x14,
-0x07,0x06,0x23,0x34,0x35,0x16,0x37,0x36,0x35,0x34,0x27,0x26,0x23,0x20,0x11,0x10,
-0x25,0x24,0x11,0x34,0x37,0x23,0x35,0x21,0x15,0x20,0x11,0x14,0x05,0x15,0x24,0x13,
-0x12,0x02,0xda,0x84,0x4f,0x54,0x4a,0x50,0xa3,0x45,0x2a,0x20,0x20,0x1f,0x3a,0xfd,
-0x91,0x01,0x4d,0xfe,0xe8,0xdc,0xd0,0x03,0x15,0xfd,0x8b,0x02,0x10,0xfd,0xc6,0x02,
-0x01,0x7f,0x01,0x4b,0x4f,0x78,0x73,0x50,0x57,0x4b,0x4c,0x05,0x2c,0x23,0x25,0x35,
-0x2c,0x2a,0x01,0xb5,0x01,0x2c,0x58,0x24,0x01,0x04,0xc5,0x52,0xb9,0xb9,0xfe,0xdd,
-0xbf,0x09,0xaa,0x16,0xfe,0xbc,0xfe,0xf1,0xff,0xff,0x00,0x71,0xff,0xe3,0x04,0x75,
-0x04,0x7b,0x12,0x06,0x00,0x52,0x00,0x00,0x00,0x01,0x00,0x4a,0xff,0xd9,0x04,0x98,
-0x04,0x60,0x00,0x17,0x00,0x2f,0x40,0x0b,0x19,0x0a,0x01,0x12,0x08,0x03,0x13,0x08,
-0x00,0x16,0x18,0x10,0xdc,0xc4,0xec,0xd4,0xec,0xc4,0xc4,0xcc,0x31,0x40,0x0c,0x07,
-0x87,0x0e,0x8c,0x15,0x03,0x13,0x17,0x87,0x00,0xbc,0x15,0x00,0x2f,0xf4,0xec,0x32,
-0x32,0x10,0xf4,0xec,0x30,0x13,0x21,0x15,0x23,0x11,0x14,0x16,0x33,0x32,0x36,0x37,
-0x15,0x0e,0x01,0x23,0x22,0x26,0x35,0x11,0x21,0x11,0x23,0x11,0x23,0x4a,0x04,0x31,
-0x8d,0x31,0x37,0x0f,0x2c,0x07,0x23,0x4a,0x25,0x78,0x5c,0xfe,0x63,0xbc,0x8f,0x04,
-0x60,0xb8,0xfd,0x50,0x48,0x3f,0x05,0x01,0x85,0x0d,0x0c,0x83,0xb0,0x02,0x9c,0xfc,
-0x58,0x03,0xa8,0x00,0x00,0x02,0x00,0xba,0xfe,0x56,0x04,0xa4,0x04,0x7b,0x00,0x11,
-0x00,0x1d,0x00,0x31,0x40,0x19,0x15,0xb9,0x04,0xb8,0x1e,0x1b,0xb9,0x0a,0x8c,0x0f,
-0xbd,0x1e,0x1f,0x45,0x12,0x12,0x07,0x51,0x0d,0x08,0x18,0x12,0x10,0x46,0x1e,0x10,
-0xfc,0xec,0xec,0xf4,0xb2,0x7f,0x07,0x01,0x5d,0xec,0xec,0x31,0x00,0x10,0xec,0xf4,
-0xec,0x10,0xf4,0xec,0x30,0x01,0x36,0x37,0x36,0x33,0x32,0x00,0x11,0x10,0x02,0x23,
-0x22,0x26,0x27,0x11,0x23,0x11,0x34,0x05,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,
-0x33,0x32,0x36,0x01,0x14,0x3d,0x97,0x3b,0xb6,0xcc,0x00,0xff,0xff,0xcc,0x7b,0xb1,
-0x3a,0xb9,0x03,0x2b,0xa7,0x92,0x92,0xa7,0xa7,0x92,0x92,0xa7,0x03,0x98,0x66,0x5a,
-0x23,0xfe,0xbc,0xfe,0xf8,0xfe,0xf8,0xfe,0xbc,0x61,0x64,0xfd,0xae,0x03,0xcf,0xe7,
-0xdd,0xcb,0xe7,0xe7,0xcb,0xcb,0xe7,0xe7,0x00,0x01,0x00,0x71,0xfe,0x52,0x03,0xe7,
-0x04,0x7b,0x00,0x24,0x00,0x36,0x40,0x0c,0x1d,0x21,0x12,0x17,0x26,0x09,0x48,0x10,
-0x12,0x03,0x45,0x25,0x10,0xfc,0xec,0xf4,0xcc,0xd4,0xfc,0xc4,0x31,0x40,0x11,0x1b,
-0xb9,0x1d,0x13,0xb9,0x00,0x8c,0x25,0x09,0x86,0x0a,0x88,0x0d,0xb9,0x06,0xb8,0x25,
-0x00,0x10,0xf4,0xfc,0xf4,0xec,0x10,0xf4,0xec,0xdc,0xec,0x30,0x05,0x20,0x00,0x11,
-0x10,0x00,0x21,0x32,0x16,0x17,0x15,0x2e,0x01,0x23,0x22,0x06,0x15,0x14,0x16,0x33,
-0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x23,0x34,0x35,0x16,0x37,0x36,0x35,0x34,0x27,
-0x26,0x02,0xa8,0xfe,0xf3,0xfe,0xd6,0x01,0x2d,0x01,0x06,0x55,0xa2,0x4c,0x4e,0x9d,
-0x50,0xb3,0xc6,0xc6,0xaf,0x83,0x50,0x54,0x4a,0x50,0xa3,0x45,0x2a,0x20,0x20,0x1f,
-0x1d,0x01,0x3e,0x01,0x0e,0x01,0x12,0x01,0x3a,0x23,0x23,0xac,0x2b,0x2b,0xe3,0xcd,
-0xcd,0xe3,0x4c,0x4f,0x78,0x73,0x50,0x57,0x4b,0x4c,0x05,0x2c,0x23,0x25,0x35,0x2c,
-0x2a,0x00,0x00,0x02,0x00,0x71,0xff,0xe3,0x04,0xd6,0x04,0x62,0x00,0x0d,0x00,0x1e,
-0x00,0x31,0x40,0x0b,0x20,0x0f,0x0a,0x12,0x13,0x51,0x04,0x12,0x1b,0x45,0x1f,0x10,
-0xfc,0xec,0xf4,0xb2,0x7f,0x13,0x01,0x5d,0xec,0xd4,0xc4,0x31,0x40,0x0c,0x07,0xb9,
-0x17,0x8c,0x1f,0x11,0x87,0x00,0xb9,0x0e,0xbc,0x1f,0x00,0x10,0xf4,0xec,0xec,0x10,
-0xf4,0xec,0x30,0x01,0x22,0x07,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x27,
-0x26,0x27,0x05,0x15,0x23,0x16,0x15,0x10,0x07,0x06,0x23,0x22,0x27,0x26,0x11,0x10,
-0x37,0x36,0x02,0x73,0x98,0x52,0x56,0xab,0x95,0x93,0xac,0x56,0x4f,0x9a,0x02,0x63,
-0xce,0x6d,0x89,0x89,0xf0,0xf1,0x88,0x89,0x89,0x72,0x03,0xce,0x6e,0x73,0xbe,0xc9,
-0xe7,0xe8,0xc8,0xb7,0x7a,0x6e,0x93,0x01,0xb8,0x9c,0xdd,0xfe,0xed,0x9c,0x9d,0x9d,
-0x9c,0x01,0x13,0x01,0x14,0x9c,0x82,0x00,0x00,0x01,0x00,0x64,0x00,0x00,0x04,0x6d,
-0x04,0x60,0x00,0x11,0x00,0x23,0x40,0x08,0x13,0x0d,0x03,0x0f,0x08,0x0c,0x0a,0x12,
-0x10,0xd4,0xc4,0xfc,0xc4,0xc4,0xc4,0x31,0x00,0x40,0x08,0x0f,0x0b,0x87,0x0c,0xbc,
-0x02,0xb9,0x05,0x2f,0xec,0xf4,0xec,0x32,0x30,0x25,0x16,0x3b,0x01,0x15,0x23,0x22,
-0x27,0x26,0x35,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x14,0x02,0xe6,0x24,0x6c,0x59,
-0x6f,0xb4,0x52,0x52,0xfe,0x5c,0x04,0x09,0xfe,0x57,0xcc,0x30,0x9c,0x60,0x62,0xd4,
-0x02,0x12,0xb8,0xb8,0xfd,0xe3,0x91,0x00,0x00,0x01,0x00,0x95,0xff,0xff,0x04,0x2a,
-0x04,0x60,0x00,0x1c,0x00,0x21,0x40,0x0a,0x1e,0x45,0x09,0x12,0x13,0x00,0x08,0x1c,
-0x46,0x1d,0x10,0xfc,0xec,0xd4,0xec,0xec,0x31,0x00,0x40,0x06,0x0d,0x1c,0xbc,0x05,
-0xb9,0x17,0x2f,0xec,0xf4,0x3c,0x30,0x01,0x11,0x14,0x17,0x16,0x33,0x32,0x37,0x36,
-0x37,0x36,0x27,0x26,0x27,0x33,0x31,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x25,0x22,
-0x27,0x26,0x35,0x03,0x01,0x52,0x32,0x2b,0x77,0xa5,0x5a,0x3b,0x0f,0x08,0x1e,0x1c,
-0x6a,0xba,0x46,0x2d,0x2a,0x80,0x85,0xfe,0xeb,0xc6,0x52,0x62,0x01,0x04,0x60,0xfd,
-0x2b,0x86,0x39,0x30,0xb3,0x76,0xbb,0x66,0x80,0x77,0x83,0x5a,0x7b,0x73,0x9a,0xe1,
-0xcb,0xd3,0x01,0x60,0x76,0xc0,0x02,0xca,0x00,0x02,0x00,0x6f,0xfe,0x56,0x04,0xd2,
-0x04,0x68,0x00,0x0a,0x00,0x29,0x00,0x3d,0x40,0x10,0x2b,0x45,0x07,0x12,0x0f,0x13,
-0x02,0x08,0x1e,0x16,0x28,0x23,0x12,0x1a,0x45,0x2a,0x10,0xfc,0xec,0xd4,0x3c,0xcc,
-0xfc,0x3c,0xd4,0xec,0xec,0x31,0x00,0x40,0x10,0x00,0x1f,0xb9,0x0b,0x1e,0xb8,0x2a,
-0x03,0x27,0x87,0x13,0x16,0x8c,0x15,0xbd,0x2a,0x10,0xec,0xf4,0x3c,0xec,0x32,0x10,
-0xf4,0x3c,0xec,0x32,0x30,0x01,0x22,0x15,0x11,0x32,0x37,0x36,0x27,0x26,0x27,0x26,
-0x27,0x32,0x17,0x16,0x13,0x12,0x07,0x06,0x23,0x11,0x23,0x11,0x22,0x27,0x26,0x11,
-0x02,0x37,0x36,0x37,0x15,0x06,0x07,0x06,0x17,0x16,0x17,0x16,0x33,0x11,0x10,0x03,
-0x3d,0x41,0x5e,0x60,0x56,0x01,0x01,0x55,0x46,0x36,0x90,0x7b,0x85,0x04,0x04,0x8d,
-0x85,0xc7,0xb7,0xc7,0x86,0x88,0x01,0x89,0x68,0xa4,0x42,0x3a,0x57,0x01,0x01,0x55,
-0x4c,0x71,0x03,0xcb,0x91,0xfd,0x52,0x68,0x5d,0xdf,0xd0,0x70,0x5b,0x9d,0x84,0x8d,
-0xfe,0xd9,0xfe,0xf1,0xa1,0x98,0xfe,0x6e,0x01,0x91,0x99,0x9c,0x01,0x13,0x01,0x1e,
-0x92,0x6d,0x1c,0xa3,0x17,0x4e,0x73,0xbe,0xca,0x73,0x67,0x02,0xaf,0x01,0x2e,0x00,
-0x00,0x01,0x00,0x3b,0xfe,0x55,0x04,0x64,0x04,0x61,0x00,0x17,0x00,0x76,0x40,0x0c,
-0x11,0x10,0x05,0x04,0x04,0x09,0x19,0x14,0x0f,0x03,0x09,0x18,0x10,0xd4,0xc4,0xd4,
-0xc4,0xc4,0x12,0x17,0x39,0x00,0x40,0x12,0x11,0x10,0x05,0x04,0x04,0x13,0x08,0x87,
-0x0e,0x09,0xbc,0x18,0x13,0x87,0x16,0x03,0xbd,0x18,0x10,0xf4,0x3c,0xec,0x10,0xf4,
-0x3c,0xec,0x11,0x17,0x39,0x05,0x40,0x14,0x0e,0x11,0x0f,0x10,0x0f,0x0c,0x11,0x05,
-0x05,0x04,0x02,0x11,0x03,0x04,0x03,0x00,0x11,0x11,0x11,0x10,0x07,0x10,0xec,0x07,
-0x10,0xec,0x07,0x10,0xec,0x07,0x10,0xec,0x40,0x14,0x10,0x11,0x0c,0x0f,0x02,0x0d,
-0x11,0x0c,0x0e,0x03,0x04,0x0e,0x03,0x05,0x00,0x01,0x0f,0x02,0x05,0x00,0x0f,0x0f,
-0x0f,0x0f,0x31,0x30,0x05,0x03,0x01,0x23,0x01,0x03,0x26,0x2b,0x01,0x35,0x17,0x04,
-0x17,0x13,0x01,0x33,0x01,0x13,0x16,0x3b,0x01,0x15,0x27,0x24,0x02,0xdc,0x95,0xfe,
-0xcd,0xd9,0x01,0xb2,0xb6,0x31,0x9a,0x31,0x46,0x01,0x02,0x41,0x94,0x01,0x33,0xd9,
-0xfe,0x4e,0xb6,0x31,0x9a,0x31,0x46,0xfe,0xfe,0xfa,0x01,0x7f,0xfd,0xd0,0x03,0x18,
-0x01,0xd7,0x7e,0x9e,0x02,0x07,0xa7,0xfe,0x81,0x02,0x30,0xfc,0xe8,0xfe,0x29,0x7e,
-0x9e,0x02,0x07,0x00,0x00,0x01,0x00,0x70,0xfe,0x56,0x04,0xd1,0x04,0x60,0x00,0x1b,
-0x00,0x36,0x40,0x0d,0x1d,0x13,0x08,0x14,0x19,0x0d,0x08,0x00,0x0c,0x06,0x08,0x05,
-0x1c,0x10,0xdc,0xec,0xd4,0x3c,0xfc,0x3c,0xd4,0xec,0xcc,0x31,0x00,0x40,0x0e,0x13,
-0x0c,0x05,0xbc,0x1c,0x0e,0x0b,0x87,0x19,0x00,0x8c,0x1b,0xbd,0x1c,0x10,0xec,0xf4,
-0x3c,0xec,0x32,0x10,0xf4,0x3c,0x3c,0x30,0x05,0x26,0x27,0x26,0x35,0x11,0x33,0x11,
-0x14,0x17,0x16,0x17,0x11,0x33,0x11,0x36,0x37,0x36,0x35,0x11,0x33,0x11,0x14,0x07,
-0x06,0x07,0x11,0x23,0x02,0x45,0xe7,0x6b,0x83,0xba,0x55,0x4a,0x7c,0xb7,0x83,0x43,
-0x55,0xba,0x83,0x76,0xdc,0xb7,0x19,0x25,0x61,0x77,0xf3,0x02,0x89,0xfd,0x7e,0xb7,
-0x4c,0x42,0x0e,0x03,0xd5,0xfc,0x2c,0x0e,0x42,0x54,0xaf,0x02,0x81,0xfd,0x78,0xfc,
-0x6e,0x63,0x23,0xfe,0x6e,0x00,0x00,0x01,0x00,0x87,0xff,0xff,0x06,0x28,0x04,0x60,
-0x00,0x1a,0x00,0x38,0x40,0x14,0x12,0x12,0x13,0x1c,0x45,0x10,0x12,0x15,0x0b,0x08,
-0x0c,0x07,0x12,0x02,0x05,0x12,0x04,0x02,0x45,0x1b,0x10,0xfc,0xdc,0xec,0x10,0xec,
-0xd4,0xfc,0xd4,0xec,0xec,0xdc,0xec,0x31,0x00,0x40,0x09,0x0b,0x12,0x04,0xbc,0x0e,
-0x09,0x87,0x17,0x00,0x2f,0x3c,0xec,0x32,0xf4,0x3c,0xc4,0x30,0x21,0x20,0x11,0x34,
-0x13,0x33,0x02,0x15,0x02,0x17,0x16,0x03,0x33,0x02,0x37,0x36,0x11,0x34,0x03,0x33,
-0x12,0x15,0x12,0x25,0x24,0x03,0x02,0x02,0x26,0xfe,0x61,0x87,0xda,0x8f,0x01,0xdf,
-0xd0,0x05,0xaa,0x03,0xce,0xde,0x8f,0xda,0x87,0x01,0xfe,0x60,0xfe,0xed,0x1e,0x23,
-0x02,0x35,0xeb,0x01,0x40,0xfe,0xc0,0xf0,0xfe,0x97,0x01,0x01,0x01,0xd4,0xfe,0x2b,
-0x02,0x02,0x01,0x68,0xf0,0x01,0x40,0xfe,0xc0,0xeb,0xfd,0xca,0x01,0x01,0x01,0x0d,
-0xfe,0xf2,0xff,0xff,0x00,0x05,0x00,0x00,0x02,0x7d,0x06,0x10,0x12,0x26,0x03,0x32,
-0x0f,0x00,0x10,0x07,0x00,0x6a,0xff,0x2e,0x00,0x00,0xff,0xff,0x00,0x95,0xff,0xff,
-0x04,0x2a,0x06,0x10,0x10,0x26,0x00,0x6a,0x1d,0x00,0x12,0x06,0x03,0x3e,0x00,0x00,
-0xff,0xff,0x00,0x71,0xff,0xe3,0x04,0x75,0x06,0x66,0x10,0x26,0x03,0x00,0x7d,0x00,
-0x12,0x06,0x03,0x38,0x00,0x00,0xff,0xff,0x00,0x95,0xff,0xff,0x04,0x2a,0x06,0x66,
-0x10,0x26,0x03,0x00,0x22,0x00,0x12,0x06,0x03,0x3e,0x00,0x00,0xff,0xff,0x00,0x87,
-0xff,0xff,0x06,0x28,0x06,0x66,0x12,0x26,0x03,0x42,0x00,0x00,0x10,0x07,0x03,0x00,
-0x01,0x59,0x00,0x00,0x00,0x03,0x00,0xa6,0xff,0xe8,0x04,0x54,0x06,0x24,0x00,0x09,
-0x00,0x19,0x00,0x23,0x00,0x00,0x01,0x20,0x37,0x36,0x27,0x26,0x07,0x06,0x07,0x06,
-0x05,0x04,0x03,0x06,0x25,0x24,0x27,0x26,0x03,0x02,0x37,0x36,0x33,0x20,0x13,0x16,
-0x05,0x06,0x27,0x12,0x17,0x16,0x37,0x36,0x37,0x36,0x01,0x6e,0x01,0x0c,0x4e,0x93,
-0x1a,0x1f,0xac,0x8e,0x49,0x35,0x01,0xed,0x01,0x7c,0xc1,0x74,0xff,0x00,0xfe,0xed,
-0x74,0x66,0x0a,0x09,0x80,0x86,0xd2,0x01,0x4d,0x32,0x1b,0xfe,0x8e,0x43,0xf0,0x06,
-0x36,0x52,0xa5,0xaf,0x37,0x56,0x03,0x70,0x41,0x7b,0x89,0xa1,0x06,0x05,0xa5,0x7a,
-0xfd,0xfa,0xfe,0x89,0xe1,0x0c,0x0f,0xc6,0xb2,0x01,0x97,0x01,0x7f,0xca,0xd4,0xfe,
-0x82,0xcd,0xff,0x1e,0x0a,0xfe,0xfd,0x69,0xa1,0x04,0x04,0x98,0xf5,0x00,0x00,0x02,
-0x00,0x6f,0xff,0xe9,0x04,0x76,0x06,0x24,0x00,0x09,0x00,0x24,0x00,0x00,0x01,0x36,
-0x27,0x26,0x27,0x26,0x07,0x06,0x17,0x16,0x05,0x04,0x27,0x26,0x37,0x12,0x21,0x32,
-0x17,0x16,0x03,0x02,0x07,0x06,0x23,0x22,0x27,0x26,0x13,0x17,0x12,0x17,0x16,0x33,
-0x32,0x37,0x36,0x03,0xae,0x04,0x35,0x49,0x8e,0xac,0x1f,0x1a,0x93,0x4e,0x01,0x0f,
-0xfe,0xb6,0x6d,0xf0,0x1d,0x2d,0x01,0x52,0xd2,0x86,0x80,0x09,0x09,0x80,0x89,0xf0,
-0xdb,0x9e,0x96,0x0d,0xc3,0x07,0x4d,0x73,0x78,0x85,0x64,0x50,0x03,0x70,0xbc,0x7a,
-0xa5,0x05,0x06,0xa1,0x89,0x7b,0x41,0xaa,0x0a,0x4b,0xa4,0xfb,0x01,0x7e,0xd4,0xc8,
-0xfe,0x7f,0xfe,0x7d,0xc6,0xd5,0xd5,0xc8,0x01,0xeb,0x01,0xfe,0x53,0x6a,0x9c,0x9d,
-0x7e,0x00,0x00,0x01,0x00,0x57,0x00,0x00,0x05,0x51,0x05,0xdf,0x00,0x1b,0x00,0x00,
-0x01,0x06,0x03,0x06,0x15,0x11,0x23,0x11,0x34,0x27,0x02,0x27,0x26,0x07,0x35,0x36,
-0x17,0x04,0x13,0x12,0x25,0x36,0x17,0x16,0x07,0x06,0x27,0x26,0x04,0x46,0xa0,0x52,
-0x2a,0xcb,0x2a,0x52,0xa0,0x74,0x78,0x43,0xa0,0x01,0x43,0x48,0x6b,0x01,0x1f,0x6f,
-0x40,0x78,0x36,0x21,0x75,0x56,0x05,0x11,0x48,0xfe,0xf3,0x8d,0xa5,0xfd,0x76,0x02,
-0x8a,0xa5,0x8d,0x01,0x0d,0x48,0x34,0x1a,0xaa,0x15,0x18,0x30,0xfe,0x72,0x01,0x7b,
-0x43,0x1a,0x31,0x5d,0x96,0x56,0x1a,0x12,0xff,0xff,0xff,0xe1,0x00,0x00,0x06,0xa1,
-0x06,0x66,0x10,0x27,0x03,0x00,0xfe,0x6e,0x00,0x00,0x10,0x07,0x03,0x4a,0x01,0x50,
-0x00,0x00,0xff,0xff,0x00,0x57,0x00,0x00,0x05,0x51,0x07,0x4e,0x10,0x27,0x0b,0xe9,
-0x04,0xc5,0x01,0x75,0x12,0x06,0x03,0x4a,0x00,0x00,0x00,0x03,0x00,0x70,0xfe,0x56,
-0x04,0xd1,0x06,0x14,0x00,0x13,0x00,0x1c,0x00,0x25,0x00,0x00,0x01,0x11,0x32,0x17,
-0x16,0x10,0x07,0x06,0x23,0x11,0x23,0x11,0x22,0x27,0x26,0x10,0x37,0x36,0x33,0x11,
-0x13,0x32,0x37,0x36,0x37,0x36,0x27,0x26,0x23,0x03,0x11,0x22,0x07,0x06,0x17,0x16,
-0x17,0x16,0x02,0xfc,0xc7,0x85,0x89,0x89,0x85,0xc7,0xb7,0xc7,0x86,0x88,0x88,0x86,
-0xc7,0xb7,0x71,0x4d,0x54,0x01,0x01,0x56,0x4d,0x71,0xb7,0x71,0x4c,0x57,0x01,0x01,
-0x55,0x4c,0x06,0x14,0xfe,0x63,0x99,0x9c,0xfd,0xda,0x9c,0x99,0xfe,0x6f,0x01,0x91,
-0x99,0x9c,0x02,0x26,0x9c,0x99,0x01,0x9d,0xfa,0x77,0x67,0x73,0xca,0xc8,0x75,0x67,
-0xfc,0xb8,0x03,0x48,0x67,0x75,0xc8,0xca,0x73,0x67,0x00,0x02,0x00,0x41,0xff,0xff,
-0x06,0x6d,0x04,0x60,0x00,0x0d,0x00,0x1e,0x00,0x00,0x01,0x06,0x07,0x02,0x17,0x16,
-0x03,0x33,0x02,0x37,0x36,0x03,0x26,0x27,0x21,0x23,0x35,0x21,0x15,0x23,0x16,0x17,
-0x12,0x25,0x24,0x03,0x02,0x21,0x20,0x13,0x36,0x01,0x79,0x1f,0x01,0x01,0xdf,0xd0,
-0x05,0xaa,0x03,0xce,0xdf,0x01,0x01,0x21,0xfb,0x7f,0x71,0x06,0x2c,0x70,0x24,0x06,
-0x0f,0xfe,0x52,0xfe,0xed,0x1e,0x23,0xfe,0xf2,0xfe,0x52,0x0f,0x06,0x03,0xa8,0x88,
-0xf0,0xfe,0x97,0x01,0x01,0x01,0xd4,0xfe,0x2b,0x02,0x02,0x01,0x68,0xf0,0x88,0xb8,
-0xb8,0x89,0xea,0xfd,0xc9,0x02,0x01,0x01,0x0d,0xfe,0xf2,0x02,0x35,0xe9,0x00,0x01,
-0x00,0x6f,0xfe,0x5b,0x04,0xce,0x04,0x67,0x00,0x2f,0x00,0x00,0x05,0x26,0x27,0x26,
-0x37,0x07,0x02,0x07,0x06,0x27,0x26,0x37,0x36,0x37,0x36,0x27,0x26,0x23,0x22,0x07,
-0x35,0x36,0x17,0x16,0x17,0x16,0x07,0x37,0x12,0x37,0x36,0x17,0x16,0x07,0x06,0x07,
-0x06,0x17,0x16,0x33,0x32,0x37,0x02,0x07,0x06,0x27,0x35,0x04,0x03,0xf9,0xf6,0x21,
-0x15,0x18,0xbd,0x60,0xc8,0x8d,0x03,0x01,0x3d,0x60,0x88,0x5b,0x2b,0x1a,0x8e,0x39,
-0x5b,0x52,0x7e,0xf6,0x21,0x13,0x2a,0xbd,0x60,0xc8,0x8d,0x03,0x01,0x3d,0x60,0x88,
-0x5b,0x2b,0x1a,0x8e,0x39,0x5b,0x26,0xcd,0x98,0xad,0x01,0x37,0x0a,0x20,0xf0,0x9c,
-0x63,0x6c,0xfe,0xf7,0x7c,0x59,0x91,0x44,0x54,0x84,0x7c,0xcb,0xa9,0x68,0x6c,0xe0,
-0x3d,0x11,0x22,0xee,0x8c,0x70,0x6c,0x01,0x09,0x7c,0x59,0x91,0x44,0x54,0x84,0x7c,
-0xcb,0xa9,0x68,0x6c,0xfd,0xe0,0x66,0x4d,0x5a,0xa0,0xa0,0x00,0x00,0x02,0x00,0x73,
-0xfe,0x58,0x05,0xd9,0x05,0xf0,0x00,0x0f,0x00,0x19,0x00,0x00,0x05,0x11,0x23,0x11,
-0x26,0x27,0x26,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x07,0x06,0x02,0x20,0x00,0x11,
-0x10,0x00,0x20,0x00,0x11,0x10,0x03,0x84,0xb8,0xfc,0xa0,0xbd,0x01,0x79,0x01,0x3b,
-0x01,0x3a,0x01,0x78,0xbc,0x9f,0x7b,0xfe,0x48,0xfe,0xfd,0x01,0x03,0x01,0xb8,0x01,
-0x01,0x18,0xfe,0x70,0x01,0x90,0x1a,0xb3,0xd2,0x02,0xc4,0x01,0xa5,0xfe,0x5b,0xfe,
-0x9e,0xfe,0x9f,0xd2,0xb3,0x05,0x49,0xfe,0xb8,0xfe,0xe5,0xfe,0xe6,0xfe,0xb8,0x01,
-0x48,0x01,0x1a,0x01,0x1b,0x00,0x00,0x02,0x00,0x71,0xfe,0x56,0x04,0x75,0x04,0x7b,
-0x00,0x0a,0x00,0x1b,0x00,0x00,0x01,0x22,0x06,0x10,0x16,0x33,0x32,0x36,0x35,0x34,
-0x26,0x03,0x11,0x23,0x11,0x26,0x27,0x26,0x11,0x10,0x00,0x33,0x32,0x00,0x11,0x10,
-0x07,0x06,0x02,0x73,0x94,0xac,0xab,0x95,0x93,0xac,0xac,0x39,0xaa,0xbe,0x6b,0x89,
-0x01,0x11,0xf1,0xf0,0x01,0x12,0x89,0x6a,0x03,0xdf,0xe7,0xfe,0x6e,0xe7,0xe8,0xc8,
-0xc7,0xe9,0xfc,0x09,0xfe,0x6e,0x01,0x92,0x1b,0x7d,0x9c,0x01,0x13,0x01,0x14,0x01,
-0x38,0xfe,0xc8,0xfe,0xec,0xfe,0xed,0x9c,0x7b,0x00,0x00,0x01,0x00,0x8b,0xfe,0x52,
-0x04,0xab,0x05,0xd5,0x00,0x24,0x00,0x00,0x01,0x20,0x07,0x06,0x11,0x10,0x17,0x16,
-0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x23,0x34,0x35,0x16,0x37,0x36,0x35,0x34,
-0x27,0x26,0x23,0x20,0x27,0x26,0x11,0x10,0x37,0x36,0x29,0x01,0x15,0x03,0x46,0xfe,
-0xf1,0x5e,0x7b,0x71,0x58,0xc7,0x7a,0x59,0x54,0x4a,0x50,0xa3,0x45,0x2a,0x20,0x20,
-0x1f,0x3a,0xfe,0xef,0xbd,0x95,0xb9,0x8a,0x01,0x78,0x01,0x65,0x05,0x2b,0x77,0x98,
-0xfe,0xcd,0xfe,0xf9,0xc3,0x98,0x54,0x4f,0x78,0x73,0x50,0x57,0x4b,0x4c,0x05,0x2c,
-0x23,0x25,0x35,0x2c,0x2a,0xcb,0x9e,0x01,0x9d,0x01,0x4e,0xed,0xb1,0xaa,0x00,0x01,
-0x00,0x71,0xfe,0x52,0x04,0x51,0x04,0x61,0x00,0x22,0x00,0x00,0x01,0x22,0x07,0x06,
-0x15,0x14,0x16,0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x23,0x34,0x35,0x16,0x37,
-0x36,0x35,0x34,0x27,0x26,0x23,0x22,0x00,0x11,0x34,0x37,0x36,0x05,0x21,0x15,0x02,
-0xac,0xd8,0x3e,0x63,0xc6,0x6e,0x83,0x50,0x54,0x4a,0x50,0xa3,0x45,0x2a,0x20,0x20,
-0x20,0x39,0xcc,0xfe,0xd6,0x97,0x68,0x01,0x34,0x01,0xad,0x03,0xa8,0x48,0x71,0xc0,
-0xcd,0xe3,0x4c,0x4f,0x78,0x73,0x50,0x57,0x4b,0x4c,0x05,0x2c,0x23,0x25,0x35,0x2c,
-0x2a,0x01,0x3e,0x01,0x0e,0xf3,0xbc,0x83,0x01,0xb8,0xff,0xff,0x00,0xc9,0x00,0x00,
-0x04,0x23,0x05,0xd5,0x12,0x06,0x00,0x29,0x00,0x00,0x00,0x01,0xff,0x40,0xfe,0x56,
-0x03,0x46,0x06,0x14,0x00,0x23,0x00,0x00,0x33,0x11,0x34,0x37,0x36,0x33,0x32,0x16,
-0x17,0x15,0x2e,0x01,0x23,0x22,0x07,0x06,0x15,0x11,0x21,0x15,0x21,0x11,0x14,0x07,
-0x06,0x23,0x22,0x26,0x27,0x35,0x1e,0x01,0x33,0x32,0x37,0x36,0xee,0x88,0x60,0xa9,
-0x31,0x63,0x33,0x24,0x52,0x2c,0x78,0x3a,0x4b,0x01,0x41,0xfe,0xbf,0x8b,0x62,0xad,
-0x39,0x66,0x2e,0x31,0x64,0x30,0x57,0x40,0x52,0x04,0x82,0xa0,0x8e,0x64,0x12,0x12,
-0xa4,0x1c,0x1d,0x3e,0x51,0x6f,0xfe,0xc9,0x8f,0xfd,0x3f,0x92,0xa5,0x73,0x15,0x16,
-0xa4,0x1f,0x21,0x4b,0x5f,0x00,0x00,0x01,0x00,0xb3,0xff,0xfc,0x04,0xd4,0x05,0xd5,
-0x00,0x17,0x00,0x00,0x01,0x03,0x01,0x03,0x06,0x17,0x16,0x37,0x15,0x22,0x27,0x26,
-0x37,0x13,0x01,0x13,0x36,0x27,0x26,0x07,0x35,0x32,0x17,0x16,0x02,0x36,0x6e,0x03,
-0x0c,0xea,0x27,0x1b,0x42,0x83,0xe6,0x51,0x5f,0x13,0x9a,0xfd,0x06,0xac,0x27,0x1b,
-0x42,0x83,0xe6,0x51,0x5f,0x04,0x87,0xfe,0x5b,0x01,0x7e,0xfd,0x2c,0x60,0x2a,0x6c,
-0x23,0xbd,0x46,0x52,0xb6,0x01,0xda,0xfe,0x91,0x02,0x90,0x60,0x2a,0x6c,0x23,0xbd,
-0x46,0x52,0x00,0x01,0x00,0xbf,0x00,0x00,0x04,0x88,0x06,0x13,0x00,0x07,0x00,0x00,
-0x09,0x01,0x23,0x13,0x21,0x01,0x33,0x03,0x04,0x88,0xfe,0xe7,0xb8,0xe2,0xfd,0x26,
-0x01,0x19,0xb8,0xe2,0x03,0x70,0xfc,0x90,0x02,0xc6,0x03,0x4d,0xfd,0x5d,0x00,0x01,
-0x00,0x72,0xfe,0x56,0x06,0x60,0x05,0xf1,0x00,0x21,0x00,0x00,0x01,0x11,0x23,0x11,
-0x06,0x07,0x35,0x36,0x05,0x04,0x13,0x12,0x11,0x10,0x03,0x23,0x00,0x11,0x10,0x27,
-0x06,0x07,0x06,0x17,0x11,0x23,0x36,0x11,0x34,0x3f,0x01,0x26,0x25,0x26,0x02,0x51,
-0xaa,0xcd,0x68,0xd0,0x01,0x82,0x01,0xd9,0xed,0xd6,0xf6,0xe1,0x01,0x04,0x52,0x38,
-0x79,0x45,0x05,0xcd,0x02,0xb6,0xbb,0xd0,0xfe,0xa4,0x30,0x05,0x3a,0xfd,0x8c,0x02,
-0x49,0x4b,0x69,0xc6,0xd7,0x08,0x0a,0xfe,0xd8,0xfe,0xf1,0xfd,0xbd,0xfe,0x58,0xfe,
-0x92,0x01,0x4c,0x01,0xca,0x01,0xd1,0x7d,0x20,0x5c,0x34,0xd0,0xfd,0xc6,0x21,0x02,
-0x14,0xf7,0x8f,0x8d,0xf9,0x0b,0x01,0x00,0x00,0x01,0x00,0x77,0xfe,0x90,0x04,0x96,
-0x04,0x78,0x00,0x16,0x00,0x00,0x01,0x03,0x23,0x01,0x26,0x27,0x01,0x23,0x01,0x26,
-0x27,0x26,0x23,0x35,0x20,0x17,0x16,0x13,0x12,0x11,0x23,0x10,0x27,0x03,0x6e,0xef,
-0xb9,0x01,0x64,0x0e,0x32,0xfe,0x46,0xb9,0x02,0x1f,0x62,0x2e,0xbc,0xd3,0x01,0x2d,
-0xf2,0xe0,0xac,0x74,0xa8,0x60,0x01,0x34,0xfe,0xcc,0x01,0xc0,0x23,0x4d,0xfd,0xd0,
-0x02,0xb0,0x7f,0x21,0x84,0xa4,0xd8,0xc8,0xfe,0x50,0xfe,0xdf,0xfe,0x89,0x01,0x5e,
-0xf6,0x00,0x00,0x01,0x00,0x73,0xfe,0x4b,0x07,0x05,0x05,0xd5,0x00,0x3d,0x00,0x00,
-0x01,0x34,0x03,0x26,0x27,0x23,0x16,0x13,0x16,0x15,0x10,0x07,0x06,0x23,0x22,0x27,
-0x26,0x3d,0x01,0x23,0x15,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x11,0x34,0x37,0x12,
-0x37,0x23,0x06,0x07,0x02,0x15,0x10,0x17,0x16,0x33,0x32,0x37,0x36,0x37,0x16,0x17,
-0x16,0x17,0x06,0x07,0x06,0x07,0x17,0x36,0x37,0x24,0x37,0x36,0x37,0x36,0x07,0x05,
-0x64,0x38,0x5f,0xfa,0x54,0x87,0x43,0x47,0x41,0x86,0x74,0x46,0x46,0xc7,0x47,0x48,
-0x72,0x7d,0x49,0x48,0x43,0x87,0x54,0xf9,0x5d,0x3b,0x64,0x7b,0x79,0xd3,0x92,0x65,
-0x64,0x27,0x27,0x64,0x44,0x67,0xa4,0xcd,0x79,0x8a,0x61,0x8c,0x76,0x01,0x14,0xb4,
-0xdb,0x44,0x3d,0x02,0xe0,0xc2,0x01,0x15,0x9c,0x82,0x46,0xfe,0xbf,0x9f,0xb7,0xfe,
-0xd9,0x77,0x6d,0x69,0x68,0xc6,0xf1,0xf1,0xc6,0x68,0x69,0x6d,0x6b,0x01,0x33,0xb7,
-0x9f,0x01,0x41,0x46,0x7f,0x9f,0xfe,0xf2,0xc9,0xfe,0x68,0xb4,0xb1,0x5e,0x5e,0xad,
-0xad,0x5e,0x41,0x17,0x80,0x51,0x30,0x18,0x85,0x17,0x2a,0x64,0x88,0xa6,0xe6,0xcb,
-0x00,0x01,0x00,0x87,0xfe,0x55,0x06,0x28,0x04,0x60,0x00,0x25,0x00,0x00,0x21,0x24,
-0x03,0x02,0x21,0x20,0x11,0x34,0x13,0x33,0x02,0x15,0x02,0x17,0x16,0x03,0x33,0x02,
-0x37,0x36,0x11,0x34,0x03,0x33,0x12,0x15,0x16,0x07,0x06,0x07,0x06,0x07,0x06,0x07,
-0x27,0x36,0x37,0x36,0x04,0x88,0xfe,0xed,0x1e,0x23,0xfe,0xf2,0xfe,0x61,0x87,0xda,
-0x8f,0x01,0xdf,0xd0,0x05,0xaa,0x03,0xce,0xde,0x8f,0xda,0x87,0x01,0x39,0x69,0xc5,
-0x9a,0xd2,0x6b,0x70,0x5b,0x51,0x8b,0xc7,0x01,0x01,0x0d,0xfe,0xf2,0x02,0x35,0xeb,
-0x01,0x40,0xfe,0xc0,0xf0,0xfe,0x97,0x01,0x01,0x01,0xd4,0xfe,0x2b,0x02,0x02,0x01,
-0x68,0xf0,0x01,0x40,0xfe,0xc0,0xeb,0xd1,0x84,0xf4,0x9e,0x7b,0x49,0x25,0x10,0x6c,
-0x0b,0x2b,0x3f,0x00,0x00,0x01,0x00,0x73,0xfe,0x56,0x05,0x48,0x05,0xf0,0x00,0x1d,
-0x00,0x00,0x01,0x06,0x07,0x06,0x11,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x19,0x01,
-0x33,0x11,0x23,0x11,0x06,0x07,0x06,0x23,0x20,0x27,0x26,0x11,0x10,0x13,0x36,0x25,
-0x02,0xec,0xb4,0x60,0x85,0x6e,0x62,0xc3,0xc4,0x62,0x63,0xd9,0xd9,0x44,0x68,0x68,
-0xaa,0xff,0x00,0x9c,0xa2,0xba,0x97,0x01,0x28,0x05,0x4a,0x12,0x84,0xb9,0xfe,0xee,
-0xf9,0xab,0x98,0x98,0x99,0x01,0x0b,0x02,0xec,0xf8,0x81,0x02,0x90,0x84,0x40,0x3f,
-0xd5,0xdd,0x01,0x47,0x01,0x36,0x01,0x08,0xd5,0x01,0x00,0x01,0x00,0x71,0xfe,0x56,
-0x04,0x8c,0x04,0x7b,0x00,0x1a,0x00,0x00,0x01,0x06,0x07,0x06,0x15,0x14,0x17,0x16,
-0x20,0x36,0x35,0x11,0x33,0x11,0x23,0x11,0x0e,0x01,0x23,0x22,0x27,0x26,0x35,0x34,
-0x37,0x36,0x33,0x02,0x8b,0x9a,0x50,0x72,0x5e,0x53,0x01,0x4c,0xa8,0xb8,0xb8,0x3a,
-0xb1,0x90,0xda,0x85,0x89,0x9e,0x7f,0xfd,0x03,0xfd,0x0e,0x63,0x8d,0xd0,0xbd,0x81,
-0x74,0xe7,0xcb,0x02,0x31,0xf9,0xf6,0x02,0x52,0x64,0x61,0xa2,0xa8,0xf8,0xec,0xc8,
-0xa2,0x00,0x00,0x01,0x00,0xc9,0xfe,0x4b,0x05,0xe2,0x05,0xd5,0x00,0x25,0x00,0x00,
-0x01,0x20,0x17,0x16,0x11,0x14,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x27,0x36,0x37,
-0x36,0x37,0x36,0x37,0x36,0x35,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x11,0x23,
-0x11,0x33,0x11,0x36,0x37,0x36,0x03,0x4c,0x01,0x27,0xb1,0xbe,0x3c,0x43,0xaa,0xc3,
-0xf1,0xb9,0x49,0x61,0x86,0x7d,0xd9,0x98,0x88,0x2c,0x36,0x7e,0x73,0xcd,0xcb,0x73,
-0x71,0xca,0xca,0x4e,0x69,0x69,0x04,0x7b,0xb3,0xc2,0xfe,0xfd,0xcc,0xa1,0xb2,0x80,
-0x93,0x45,0x35,0x0c,0x85,0x16,0x32,0x57,0x7a,0x6d,0x68,0x7f,0xc0,0x9d,0x96,0x86,
-0x81,0x7e,0xde,0xfe,0x27,0x05,0xd5,0xfd,0x9a,0x87,0x42,0x43,0x00,0x02,0x00,0x2d,
-0xff,0xe3,0x04,0x92,0x04,0x9a,0x00,0x17,0x00,0x4d,0x00,0x00,0x01,0x26,0x23,0x22,
-0x07,0x06,0x07,0x06,0x07,0x06,0x15,0x14,0x17,0x16,0x17,0x16,0x17,0x16,0x33,0x32,
-0x37,0x36,0x37,0x36,0x25,0x16,0x15,0x14,0x07,0x06,0x21,0x22,0x27,0x26,0x23,0x22,
-0x07,0x27,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x06,0x07,
-0x06,0x07,0x06,0x27,0x26,0x27,0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,
-0x36,0x37,0x36,0x33,0x32,0x17,0x36,0x37,0x17,0x06,0x03,0x2c,0x7f,0x8d,0x1f,0x37,
-0x1d,0x25,0x1d,0x10,0x0e,0x0c,0x0f,0x18,0x1a,0x23,0x20,0x1e,0x19,0x47,0x3b,0x49,
-0x24,0x01,0x0b,0x6c,0x7f,0x6f,0xfe,0xf7,0x8d,0x63,0x4b,0x35,0x41,0x51,0x54,0x87,
-0x5f,0x82,0x52,0x3f,0x5b,0x9d,0x4f,0x4b,0x31,0x1b,0x1f,0x46,0x75,0x66,0x47,0x29,
-0x48,0x32,0x40,0x30,0x29,0x1e,0x1d,0x1f,0x2e,0x3e,0x50,0x65,0x5e,0xd2,0x90,0x38,
-0x2a,0x88,0x37,0x03,0x44,0x98,0x16,0x0b,0x21,0x1a,0x20,0x1b,0x21,0x20,0x15,0x1c,
-0x11,0x14,0x06,0x05,0x19,0x14,0x31,0x18,0x32,0xc0,0xd4,0xb0,0x9c,0x88,0x2e,0x23,
-0x41,0x93,0x4c,0x2e,0x23,0x5e,0x59,0x7f,0x8c,0x71,0x19,0x17,0x34,0x2b,0x26,0x02,
-0x01,0x0a,0x07,0x22,0x1a,0x48,0x34,0x42,0x3b,0x3b,0x3d,0x2f,0x3f,0x22,0x2b,0x9f,
-0x56,0x68,0x50,0x92,0x00,0x01,0x00,0x4f,0xfe,0x56,0x05,0x0b,0x05,0xf6,0x00,0x21,
-0x00,0x00,0x05,0x04,0x21,0x20,0x01,0x00,0x37,0x36,0x35,0x34,0x27,0x26,0x23,0x22,
-0x07,0x06,0x07,0x23,0x36,0x37,0x36,0x21,0x20,0x17,0x16,0x15,0x14,0x07,0x00,0x01,
-0x16,0x33,0x20,0x37,0x04,0xfa,0xff,0x00,0xfe,0xed,0xfe,0xaf,0xfe,0xb9,0x02,0xba,
-0xb3,0x6c,0x6c,0x63,0xa4,0xb4,0x5e,0x23,0x18,0xf0,0x2c,0x56,0xa3,0x01,0x18,0x01,
-0x13,0xa1,0xa2,0xa2,0xfe,0xf7,0xfe,0x18,0x9c,0xd5,0x01,0x29,0xe8,0xec,0xbe,0x01,
-0xa3,0x01,0xf1,0xdb,0x84,0x9c,0x8d,0x65,0x5d,0x92,0x36,0x3f,0xa1,0x66,0xc2,0x90,
-0x91,0xf1,0xd8,0xb6,0xfe,0xf2,0xfe,0x85,0xb5,0xb3,0x00,0x01,0x00,0x64,0xfe,0x56,
-0x04,0x6a,0x04,0x7b,0x00,0x20,0x00,0x00,0x01,0x06,0x23,0x20,0x01,0x00,0x37,0x36,
-0x35,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x07,0x23,0x36,0x37,0x36,0x33,0x32,0x04,
-0x15,0x14,0x07,0x06,0x01,0x16,0x33,0x32,0x37,0x04,0x5c,0xda,0xea,0xfe,0xee,0xfe,
-0xde,0x02,0x42,0xa7,0x5c,0x5c,0x54,0x8b,0x99,0x50,0x1e,0x14,0xcc,0x25,0x49,0x8b,
-0xee,0xe8,0x01,0x14,0x8a,0xaf,0xfe,0x2f,0x91,0xa9,0xfd,0xc5,0xfe,0xef,0x99,0x01,
-0x79,0x01,0x59,0xc2,0x6b,0x7d,0x6f,0x53,0x4b,0x75,0x2c,0x32,0x81,0x52,0x9c,0xe8,
-0xc2,0xa4,0x9c,0xc5,0xfe,0xe0,0xba,0x90,0x00,0x02,0x00,0x73,0x00,0x00,0x05,0xb6,
-0x05,0xef,0x00,0x02,0x00,0x35,0x00,0x00,0x25,0x21,0x09,0x03,0x26,0x27,0x26,0x23,
-0x22,0x0f,0x01,0x35,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x09,0x01,0x36,0x37,
-0x36,0x33,0x32,0x17,0x16,0x17,0x15,0x27,0x26,0x23,0x22,0x07,0x06,0x07,0x09,0x01,
-0x16,0x17,0x16,0x3b,0x01,0x15,0x21,0x35,0x33,0x32,0x37,0x36,0x01,0xda,0x02,0x6e,
-0xfe,0xcd,0xfe,0x14,0x01,0x80,0xfe,0xdc,0x13,0x1a,0x22,0x3f,0x19,0x16,0x45,0x21,
-0x20,0x1f,0x1c,0x72,0x4b,0x2c,0x2f,0x01,0x02,0x01,0x09,0x34,0x27,0x4b,0x72,0x1d,
-0x1e,0x20,0x21,0x44,0x17,0x18,0x3c,0x26,0x13,0x1a,0xfe,0xd2,0x01,0x74,0x06,0x07,
-0x1d,0x45,0x47,0xfa,0xc3,0x47,0x48,0x1a,0x0c,0xaa,0x01,0xca,0xfe,0x68,0x02,0x3d,
-0x01,0xbb,0x1d,0x1a,0x22,0x04,0x0a,0xbb,0x0b,0x05,0x05,0x43,0x28,0x46,0xfe,0x81,
-0x01,0x7f,0x4b,0x23,0x43,0x05,0x05,0x0b,0xbb,0x0a,0x04,0x22,0x11,0x26,0xfe,0x45,
-0xfd,0xc3,0x09,0x08,0x21,0xaa,0xaa,0x21,0x0f,0x00,0x00,0x03,0x00,0x36,0x00,0x00,
-0x04,0xcb,0x04,0x7b,0x00,0x00,0x00,0x03,0x00,0x36,0x00,0x00,0x25,0x29,0x01,0x03,
-0x09,0x01,0x03,0x26,0x27,0x26,0x23,0x22,0x0f,0x01,0x35,0x36,0x37,0x36,0x33,0x32,
-0x17,0x16,0x17,0x1b,0x01,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x15,0x27,0x26,
-0x23,0x22,0x07,0x06,0x07,0x03,0x01,0x16,0x17,0x16,0x3b,0x01,0x15,0x21,0x35,0x33,
-0x32,0x37,0x36,0x04,0xcb,0xfc,0xcf,0x01,0xcc,0xe4,0xfe,0x5b,0x01,0x39,0xef,0x15,
-0x11,0x1d,0x36,0x15,0x13,0x3a,0x1c,0x1b,0x1a,0x18,0x83,0x40,0x25,0x28,0xc5,0xc5,
-0x28,0x25,0x40,0x83,0x18,0x1a,0x1b,0x1c,0x3a,0x13,0x15,0x36,0x1d,0x11,0x15,0xf6,
-0x01,0x2d,0x06,0x05,0x19,0x3a,0x49,0xfb,0x6b,0x49,0x3a,0x19,0x05,0x9e,0x01,0x38,
-0xfe,0xee,0x01,0xa4,0x01,0x3d,0x1c,0x0e,0x19,0x03,0x07,0x8d,0x08,0x04,0x04,0x33,
-0x1e,0x35,0xfe,0xfa,0x01,0x06,0x35,0x1e,0x33,0x04,0x04,0x08,0x8d,0x07,0x03,0x19,
-0x0e,0x1c,0xfe,0xb8,0xfe,0x67,0x08,0x05,0x19,0x9e,0x9e,0x19,0x05,0x00,0x00,0x02,
-0x00,0x73,0xff,0xe3,0x05,0x25,0x06,0x10,0x00,0x1d,0x00,0x2b,0x00,0x00,0x01,0x24,
-0x07,0x06,0x07,0x36,0x37,0x36,0x33,0x32,0x00,0x10,0x00,0x21,0x20,0x27,0x26,0x11,
-0x10,0x37,0x36,0x21,0x32,0x37,0x36,0x37,0x15,0x06,0x07,0x06,0x12,0x10,0x26,0x23,
-0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x03,0x2a,0xfe,0xd6,0x57,0x38,
-0x16,0x51,0x55,0x7b,0x82,0xf5,0x01,0x32,0xfe,0xce,0xfe,0xf9,0xfe,0xce,0xa4,0xa3,
-0x8b,0x7c,0x01,0xb0,0x73,0x95,0xa0,0x4b,0x5e,0x97,0x6c,0x8e,0xc8,0xba,0xbc,0x68,
-0x69,0x69,0x65,0xbf,0xbc,0x62,0x05,0x2d,0x02,0x73,0x4a,0xa0,0x56,0x22,0x31,0xfe,
-0xbc,0xfd,0xf0,0xfe,0xbc,0x9c,0x9b,0x01,0x50,0x01,0xde,0xd2,0xbb,0x0a,0x0a,0x27,
-0xb1,0x24,0x08,0x06,0xfc,0x41,0x01,0x82,0xe6,0x73,0x74,0xc0,0xbd,0x78,0x73,0x73,
-0x00,0x02,0x00,0x71,0xff,0xe3,0x04,0x5b,0x06,0x10,0x00,0x1f,0x00,0x2f,0x00,0x00,
-0x01,0x26,0x07,0x06,0x07,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x10,0x07,0x06,0x23,
-0x22,0x27,0x26,0x11,0x10,0x37,0x36,0x21,0x32,0x37,0x36,0x37,0x15,0x06,0x07,0x06,
-0x13,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,
-0x02,0x9b,0xe3,0x49,0x2c,0x14,0x29,0x65,0x5b,0x78,0xcc,0x7f,0x80,0x80,0x7f,0xdb,
-0xff,0x89,0x88,0x74,0x67,0x01,0x4f,0x5f,0x5c,0x53,0x47,0x5d,0x45,0x5a,0xa8,0x53,
-0x54,0x92,0x95,0x56,0x58,0x58,0x54,0x97,0x94,0x52,0x53,0x05,0x37,0x02,0x78,0x4a,
-0xa9,0x46,0x36,0x31,0xa2,0xa2,0xfd,0xf0,0xa2,0xa2,0x9c,0x9b,0x01,0x50,0x01,0xde,
-0xd2,0xbb,0x0a,0x0a,0x27,0xa7,0x27,0x05,0x06,0xfc,0xf8,0xcd,0x72,0x73,0x73,0x74,
-0xcb,0xc7,0x78,0x73,0x73,0x74,0x00,0x01,0x00,0x2c,0xfe,0x56,0x04,0xb7,0x05,0xd5,
-0x00,0x0f,0x00,0x00,0x01,0x11,0x23,0x35,0x21,0x11,0x23,0x11,0x21,0x15,0x23,0x11,
-0x21,0x11,0x33,0x11,0x04,0xb7,0xcb,0xfe,0xeb,0xcb,0xfe,0xeb,0xcb,0x01,0xe0,0xcb,
-0x04,0x60,0xfe,0xf2,0x64,0xfa,0xa0,0x05,0x60,0x64,0x01,0x0e,0x01,0x75,0xfe,0x8b,
-0x00,0x01,0x00,0x37,0xfe,0x55,0x04,0x14,0x05,0xcf,0x00,0x0f,0x00,0x00,0x01,0x11,
-0x23,0x35,0x23,0x11,0x23,0x11,0x23,0x15,0x23,0x11,0x21,0x11,0x33,0x11,0x04,0x14,
-0xad,0xe5,0xb9,0xe5,0xad,0x01,0x92,0xb9,0x04,0x5f,0xff,0x00,0x70,0xfa,0x86,0x05,
-0x7a,0x70,0x01,0x00,0x01,0x70,0xfe,0x90,0x00,0x01,0x00,0x6f,0xff,0xf2,0x04,0xce,
-0x04,0x67,0x00,0x2b,0x00,0x00,0x01,0x02,0x07,0x06,0x27,0x26,0x37,0x36,0x37,0x36,
-0x27,0x26,0x23,0x22,0x07,0x35,0x36,0x17,0x16,0x17,0x16,0x07,0x37,0x12,0x37,0x36,
-0x17,0x16,0x07,0x06,0x07,0x06,0x17,0x16,0x33,0x32,0x37,0x15,0x06,0x27,0x26,0x27,
-0x26,0x37,0x02,0x28,0x60,0xc8,0x8d,0x03,0x01,0x3d,0x60,0x88,0x5b,0x2b,0x1a,0x8e,
-0x39,0x5b,0x52,0x7e,0xf6,0x21,0x13,0x2a,0xbd,0x60,0xc8,0x8d,0x03,0x01,0x3d,0x60,
-0x88,0x5b,0x2b,0x1a,0x8e,0x39,0x5b,0x52,0x7e,0xf6,0x21,0x13,0x2a,0x01,0x99,0xfe,
-0xf7,0x7c,0x59,0x91,0x44,0x54,0x84,0x7c,0xcb,0xa9,0x68,0x6c,0xe0,0x3d,0x11,0x20,
-0xf0,0x8c,0x70,0x6c,0x01,0x09,0x7c,0x59,0x91,0x44,0x54,0x84,0x7c,0xcb,0xa9,0x68,
-0x6c,0xe0,0x3d,0x11,0x20,0xf0,0x8c,0x70,0x00,0x02,0x00,0xb7,0xfe,0x56,0x04,0xa4,
-0x04,0x7b,0x00,0x15,0x00,0x1d,0x00,0x00,0x13,0x36,0x37,0x36,0x37,0x36,0x33,0x32,
-0x00,0x10,0x02,0x23,0x22,0x26,0x27,0x12,0x29,0x01,0x15,0x21,0x20,0x13,0x24,0x10,
-0x26,0x20,0x06,0x10,0x16,0x20,0xba,0x02,0x58,0x3d,0x97,0x3b,0xb6,0xcc,0x00,0xff,
-0xff,0xcc,0x7b,0xb1,0x3a,0x05,0x01,0x20,0x01,0xf4,0xfe,0x1c,0xfe,0x0a,0x06,0x03,
-0x2d,0xa7,0xfe,0xdc,0xa7,0xa7,0x01,0x24,0x02,0x25,0xcc,0xa7,0x66,0x5a,0x23,0xfe,
-0xbc,0xfd,0xf0,0xfe,0xbc,0x61,0x64,0xfe,0x58,0xaa,0x02,0xda,0x34,0x01,0x96,0xe7,
-0xe7,0xfe,0x6a,0xe7,0xff,0xff,0x00,0x71,0xff,0xe3,0x03,0xe7,0x04,0x7b,0x12,0x06,
-0x00,0x46,0x00,0x00,0xff,0xff,0xff,0xdb,0xfe,0x56,0x01,0x79,0x06,0x14,0x12,0x06,
-0x00,0x4d,0x00,0x00,0x00,0x03,0x00,0x73,0xff,0xe3,0x05,0xd9,0x05,0xf0,0x00,0x07,
-0x00,0x0f,0x00,0x1a,0x00,0x00,0x01,0x21,0x12,0x17,0x16,0x20,0x37,0x36,0x13,0x26,
-0x27,0x26,0x20,0x07,0x06,0x07,0x01,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x10,
-0x00,0x05,0x03,0xfc,0x45,0x08,0x7a,0x81,0x01,0xb8,0x81,0x77,0x01,0x16,0x62,0x81,
-0xfe,0x48,0x81,0x60,0x19,0x01,0xd6,0x01,0x3a,0x01,0x78,0xfe,0x88,0xfe,0xc6,0xfe,
-0xc5,0xfe,0x87,0x01,0x79,0x02,0xc6,0xfe,0xff,0x9a,0xa4,0xa4,0x99,0x01,0xac,0xba,
-0x7e,0xa4,0xa4,0x79,0xbf,0x02,0x80,0xfe,0x5b,0xfe,0x9e,0xfe,0x9f,0xfe,0x5b,0x01,
-0xa4,0x02,0xc4,0x01,0xa5,0x00,0x00,0x01,0x00,0x71,0xff,0xe3,0x03,0xd8,0x04,0x7b,
-0x00,0x21,0x00,0x00,0x01,0x26,0x27,0x26,0x23,0x22,0x07,0x06,0x07,0x21,0x15,0x21,
-0x16,0x17,0x16,0x33,0x32,0x3f,0x01,0x15,0x07,0x06,0x23,0x20,0x27,0x26,0x10,0x37,
-0x36,0x21,0x32,0x17,0x16,0x17,0x03,0xd8,0x25,0x25,0x63,0x6a,0xb7,0x66,0x5f,0x12,
-0x02,0xa5,0xfd,0x5b,0x12,0x5f,0x66,0xb7,0x80,0x4d,0x4a,0x4f,0x68,0x6b,0xfe,0xf4,
-0x9c,0x9d,0x9d,0x9c,0x01,0x0c,0x65,0x6e,0x28,0x27,0x03,0xae,0x0d,0x0a,0x1a,0x63,
-0x5c,0xa9,0x90,0xa9,0x5c,0x63,0x1a,0x19,0xa7,0x12,0x16,0x9c,0x9c,0x02,0x28,0x9c,
-0x9c,0x16,0x08,0x0c,0x00,0x01,0x00,0xc4,0xff,0xe3,0x04,0x2b,0x04,0x7b,0x00,0x21,
-0x00,0x00,0x13,0x35,0x36,0x37,0x36,0x33,0x20,0x17,0x16,0x10,0x07,0x06,0x21,0x22,
-0x2f,0x01,0x35,0x17,0x16,0x33,0x32,0x37,0x36,0x37,0x21,0x35,0x21,0x26,0x27,0x26,
-0x23,0x22,0x07,0x06,0xc4,0x27,0x28,0x6e,0x65,0x01,0x0c,0x9c,0x9d,0x9d,0x9c,0xfe,
-0xf4,0x6b,0x68,0x4f,0x4a,0x4d,0x80,0xb7,0x66,0x5f,0x12,0xfd,0x5b,0x02,0xa5,0x12,
-0x5f,0x66,0xb7,0x6a,0x63,0x25,0x03,0xae,0xa3,0x0c,0x08,0x16,0x9c,0x9c,0xfd,0xd8,
-0x9c,0x9c,0x16,0x12,0xa7,0x19,0x1a,0x63,0x5c,0xa9,0x90,0xa9,0x5c,0x63,0x1a,0x0a,
-0xff,0xff,0x00,0xc9,0x00,0x00,0x04,0x8d,0x05,0xd5,0x12,0x06,0x00,0xa0,0x00,0x00,
-0xff,0xff,0x00,0xba,0xfe,0x56,0x04,0xa4,0x06,0x14,0x12,0x06,0x00,0xc0,0x00,0x00,
-0xff,0xff,0x00,0x73,0xff,0xe3,0x05,0x27,0x05,0xf0,0x12,0x06,0x00,0x26,0x00,0x00,
-0x00,0x01,0x00,0xc9,0x00,0x00,0x06,0x1f,0x05,0xd5,0x00,0x0c,0x00,0x00,0x13,0x21,
-0x09,0x01,0x21,0x11,0x23,0x11,0x01,0x23,0x01,0x11,0x23,0xc9,0x01,0x2d,0x01,0x7d,
-0x01,0x7f,0x01,0x2d,0xc5,0xfe,0x7f,0xcb,0xfe,0x7f,0xc4,0x05,0xd5,0xfe,0x21,0x01,
-0xdf,0xfa,0x2b,0x05,0x1f,0xfe,0x19,0x01,0xe7,0xfa,0xe1,0x00,0x00,0x01,0x00,0x7f,
-0xfe,0x56,0x04,0xb3,0x04,0x60,0x00,0x0c,0x00,0x00,0x13,0x21,0x13,0x01,0x21,0x11,
-0x23,0x11,0x01,0x23,0x01,0x11,0x23,0x7f,0x01,0x1b,0xfe,0x01,0x00,0x01,0x1b,0xb9,
-0xfe,0xec,0x99,0xfe,0xeb,0xb9,0x04,0x60,0xfe,0x7b,0x01,0x85,0xfb,0xa0,0x03,0xb2,
-0xfe,0x60,0x01,0xa0,0xfa,0xa4,0x00,0x02,0x00,0x55,0xfe,0x56,0x04,0xa4,0x04,0x7b,
-0x00,0x18,0x00,0x20,0x00,0x00,0x17,0x11,0x34,0x37,0x36,0x37,0x36,0x33,0x32,0x00,
-0x10,0x02,0x23,0x22,0x26,0x27,0x11,0x21,0x15,0x21,0x15,0x23,0x35,0x23,0x35,0x00,
-0x10,0x26,0x20,0x06,0x10,0x16,0x20,0xba,0x5a,0x3d,0x97,0x3b,0xb6,0xcc,0x00,0xff,
-0xff,0xcc,0x7b,0xb1,0x3a,0x01,0xe5,0xfe,0x1b,0xb9,0x65,0x03,0x90,0xa7,0xfe,0xdc,
-0xa7,0xa7,0x01,0x24,0x90,0x02,0xb5,0xe7,0x8c,0x66,0x5a,0x23,0xfe,0xbc,0xfd,0xf0,
-0xfe,0xbc,0x61,0x64,0xfe,0xc8,0xaa,0x70,0x70,0xaa,0x01,0xf4,0x01,0x96,0xe7,0xe7,
-0xfe,0x6a,0xe7,0x00,0x00,0x01,0x00,0x79,0xff,0xe3,0x05,0x2d,0x05,0xf0,0x00,0x19,
-0x00,0x00,0x13,0x3e,0x01,0x33,0x20,0x00,0x11,0x10,0x00,0x21,0x22,0x26,0x27,0x35,
-0x1e,0x01,0x33,0x20,0x00,0x11,0x10,0x00,0x21,0x22,0x06,0x07,0x79,0x68,0xed,0x86,
-0x01,0x53,0x01,0x86,0xfe,0x7a,0xfe,0xad,0x84,0xed,0x6a,0x66,0xe7,0x82,0x01,0x00,
-0x01,0x10,0xfe,0xf0,0xff,0x00,0x82,0xe7,0x66,0x05,0x62,0x47,0x47,0xfe,0x61,0xfe,
-0x98,0xfe,0x99,0xfe,0x61,0x48,0x48,0xd3,0x5f,0x5e,0x01,0x39,0x01,0x27,0x01,0x28,
-0x01,0x39,0x5e,0x5f,0xff,0xff,0x00,0x73,0xff,0xe3,0x05,0x27,0x05,0xf0,0x12,0x26,
-0x03,0x71,0x00,0x00,0x10,0x07,0x00,0x79,0x02,0x33,0x00,0x00,0xff,0xff,0x00,0x79,
-0xff,0xe3,0x05,0x2d,0x05,0xf0,0x10,0x27,0x00,0x79,0x00,0xe4,0x00,0x00,0x10,0x06,
-0x03,0x75,0x00,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,0x04,0x8b,0x07,0x6b,0x12,0x26,
-0x03,0x8d,0x00,0x00,0x10,0x07,0x0b,0xec,0x04,0xee,0x01,0x75,0xff,0xff,0x00,0xc9,
-0x00,0x00,0x04,0x8b,0x07,0x4e,0x12,0x26,0x03,0x8d,0x00,0x00,0x10,0x07,0x0b,0xe9,
-0x04,0xe5,0x01,0x75,0x00,0x01,0xff,0xfa,0xfe,0x66,0x05,0xac,0x05,0xd5,0x00,0x1d,
-0x00,0x00,0x25,0x10,0x06,0x2b,0x01,0x35,0x33,0x32,0x37,0x36,0x35,0x11,0x34,0x26,
-0x23,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x21,0x32,0x17,0x16,0x15,
-0x05,0xac,0xcc,0xe4,0x4c,0x3e,0x86,0x38,0x37,0x7c,0x7c,0xfe,0x88,0xcb,0xfe,0x52,
-0x04,0x8b,0xfd,0xee,0x01,0xa1,0xba,0x71,0x6d,0x68,0xfe,0xf2,0xf4,0xaa,0x4b,0x4b,
-0xc2,0x01,0x22,0x9f,0x9e,0xfd,0x39,0x05,0x2b,0xaa,0xaa,0xfe,0x46,0x77,0x72,0xee,
-0xff,0xff,0x00,0xc9,0x00,0x00,0x04,0x6a,0x07,0x6b,0x12,0x26,0x03,0x8b,0x00,0x00,
-0x10,0x07,0x0b,0xea,0x04,0xae,0x01,0x75,0x00,0x01,0x00,0x73,0xff,0xe3,0x05,0x27,
-0x05,0xf0,0x00,0x24,0x00,0x3a,0x40,0x20,0x24,0x95,0x23,0xad,0x25,0x1a,0xa1,0x19,
-0xae,0x1e,0x95,0x15,0x91,0x25,0x08,0xa1,0x09,0xae,0x04,0x95,0x0d,0x8c,0x25,0x26,
-0x23,0x19,0x08,0x22,0x00,0x19,0x11,0x25,0x10,0xdc,0xec,0x32,0xd4,0x3c,0xcc,0xcc,
-0x31,0x00,0x10,0xf4,0xec,0xf4,0xec,0x10,0xf4,0xec,0xf4,0xec,0x10,0xf4,0xec,0x30,
-0x01,0x12,0x17,0x16,0x21,0x32,0x37,0x36,0x37,0x15,0x06,0x07,0x06,0x23,0x20,0x27,
-0x26,0x11,0x10,0x37,0x36,0x21,0x32,0x17,0x16,0x17,0x15,0x26,0x27,0x26,0x23,0x20,
-0x07,0x06,0x07,0x21,0x15,0x01,0x48,0x07,0x81,0x88,0x01,0x00,0x82,0x74,0x73,0x66,
-0x6a,0x77,0x76,0x84,0xfe,0xad,0xc3,0xc3,0xc3,0xc3,0x01,0x53,0x86,0x76,0x77,0x68,
-0x66,0x73,0x74,0x82,0xff,0x00,0x88,0x67,0x19,0x02,0xb2,0x02,0xc7,0xfe,0xf2,0x93,
-0x9d,0x2f,0x2f,0x5f,0xd3,0x48,0x24,0x24,0xcf,0xd0,0x01,0x67,0x01,0x68,0xcf,0xd0,
-0x24,0x23,0x47,0xd5,0x5f,0x2f,0x2f,0x9c,0x77,0xc6,0xaa,0x00,0xff,0xff,0x00,0x87,
-0xff,0xe3,0x04,0xa2,0x05,0xf0,0x12,0x06,0x00,0x36,0x00,0x00,0xff,0xff,0x00,0xc9,
-0x00,0x00,0x01,0x93,0x05,0xd5,0x12,0x06,0x00,0x2c,0x00,0x00,0xff,0xff,0x00,0x06,
-0x00,0x00,0x02,0x58,0x07,0x4e,0x12,0x26,0x03,0x7e,0x00,0x00,0x11,0x07,0x0b,0xe9,
-0x03,0x2f,0x01,0x75,0x00,0x08,0xb4,0x00,0x0a,0x07,0x01,0x07,0x2b,0x31,0xff,0xff,
-0xff,0x96,0xfe,0x66,0x01,0x93,0x05,0xd5,0x12,0x06,0x00,0x2d,0x00,0x00,0x00,0x02,
-0x00,0x36,0xff,0xe3,0x08,0x2f,0x05,0xd5,0x00,0x16,0x00,0x21,0x00,0x00,0x01,0x21,
-0x15,0x10,0x03,0x06,0x05,0x35,0x36,0x37,0x12,0x19,0x01,0x21,0x11,0x33,0x32,0x04,
-0x15,0x14,0x04,0x23,0x21,0x01,0x34,0x27,0x26,0x2b,0x01,0x11,0x33,0x32,0x37,0x36,
-0x04,0x70,0xfe,0x1b,0x84,0x62,0xfe,0x91,0xd4,0x43,0x75,0x03,0x78,0xea,0xfb,0x01,
-0x10,0xfe,0xf0,0xfb,0xfe,0x4c,0x02,0xea,0x4f,0x4e,0xa3,0xe0,0xe0,0xa1,0x50,0x4f,
-0x05,0x2b,0xd5,0xfe,0x18,0xfe,0xaa,0xfd,0x38,0xa7,0x2e,0xa8,0x01,0x25,0x02,0x35,
-0x01,0x1b,0xfd,0x9a,0xda,0xde,0xdd,0xda,0x01,0xb7,0x8b,0x44,0x43,0xfd,0xdd,0x44,
-0x43,0x00,0x00,0x02,0x00,0xc9,0x00,0x00,0x07,0xcc,0x05,0xd5,0x00,0x12,0x00,0x1d,
-0x00,0x00,0x21,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x32,
-0x04,0x15,0x14,0x04,0x23,0x01,0x34,0x27,0x26,0x2b,0x01,0x11,0x33,0x32,0x37,0x36,
-0x04,0x0d,0xfd,0x86,0xca,0xca,0x02,0x7a,0xca,0xea,0xfb,0x01,0x10,0xfe,0xf0,0xfb,
-0x01,0x36,0x4f,0x4e,0xa3,0xe0,0xe0,0xa1,0x50,0x4f,0x02,0xc7,0xfd,0x39,0x05,0xd5,
-0xfd,0x9c,0x02,0x64,0xfd,0x9a,0xda,0xde,0xdd,0xda,0x01,0xb7,0x8b,0x44,0x43,0xfd,
-0xdd,0x44,0x43,0x00,0x00,0x01,0xff,0xfa,0x00,0x00,0x05,0xac,0x05,0xd5,0x00,0x14,
-0x00,0x00,0x01,0x32,0x17,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x21,0x11,0x23,
-0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x04,0x14,0xba,0x71,0x6d,0xc9,0x7c,0x7c,0xfe,
-0x88,0xcb,0xfe,0x52,0x04,0x8b,0xfd,0xee,0x03,0x71,0x77,0x72,0xee,0xfe,0x66,0x01,
-0x8a,0x9f,0x9e,0xfd,0x39,0x05,0x2b,0xaa,0xaa,0xfe,0x46,0x00,0xff,0xff,0x00,0xc9,
-0x00,0x00,0x05,0x6a,0x07,0x6b,0x12,0x26,0x03,0x92,0x00,0x00,0x10,0x07,0x0b,0xea,
-0x04,0xee,0x01,0x75,0xff,0xff,0x00,0xc9,0x00,0x00,0x05,0x33,0x07,0x6b,0x12,0x26,
-0x03,0x90,0x00,0x00,0x10,0x07,0x0b,0xec,0x04,0xe5,0x01,0x75,0xff,0xff,0x00,0x23,
-0xff,0xe3,0x04,0xbd,0x07,0x6d,0x10,0x27,0x0b,0xf0,0x04,0x72,0x01,0x75,0x12,0x06,
-0x03,0x9b,0x00,0x00,0x00,0x01,0x00,0xc9,0xfe,0x56,0x05,0x3b,0x05,0xd5,0x00,0x0b,
-0x00,0x00,0x29,0x01,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x23,0x02,0xbc,
-0xfe,0x0d,0xca,0x02,0xde,0xca,0xfe,0x4a,0xc9,0x05,0xd5,0xfa,0xd5,0x05,0x2b,0xfa,
-0x2b,0xfe,0x56,0x00,0xff,0xff,0x00,0x10,0x00,0x00,0x05,0x68,0x05,0xd5,0x12,0x06,
-0x00,0x24,0x00,0x00,0x00,0x02,0x00,0xc9,0x00,0x00,0x04,0xec,0x05,0xd5,0x00,0x0a,
-0x00,0x17,0x00,0x2c,0x40,0x18,0x0d,0x95,0x17,0x81,0x16,0x05,0x95,0x0e,0xad,0x06,
-0x95,0x16,0x19,0x0b,0x00,0x19,0x12,0x2e,0x05,0x0d,0x1c,0x17,0x04,0x18,0x10,0xfc,
-0xec,0x32,0xf4,0xec,0xc4,0xcc,0x31,0x00,0x2f,0xec,0xf4,0xec,0x10,0xf4,0xec,0x30,
-0x01,0x34,0x27,0x26,0x23,0x21,0x11,0x21,0x32,0x37,0x36,0x11,0x15,0x21,0x11,0x21,
-0x32,0x04,0x15,0x14,0x04,0x23,0x21,0x11,0x04,0x17,0x4f,0x4e,0xa3,0xfe,0xbc,0x01,
-0x44,0xa3,0x4e,0x4f,0xfd,0x7c,0x01,0x4e,0xfb,0x01,0x10,0xfe,0xf0,0xfb,0xfd,0xe8,
-0x01,0xb7,0x8b,0x44,0x43,0xfd,0xdd,0x44,0x43,0x04,0xa8,0xa6,0xfe,0x40,0xda,0xde,
-0xdd,0xda,0x05,0xd5,0xff,0xff,0x00,0xc9,0x00,0x00,0x04,0xec,0x05,0xd5,0x12,0x06,
-0x00,0x25,0x00,0x00,0x00,0x01,0x00,0xc9,0x00,0x00,0x04,0x6a,0x05,0xd5,0x00,0x05,
-0x00,0x19,0x40,0x0c,0x04,0x95,0x01,0x81,0x00,0x07,0x02,0x04,0x1c,0x01,0x04,0x06,
-0x10,0xfc,0xfc,0xcc,0xc4,0x31,0x00,0x2f,0xf4,0xec,0x30,0x33,0x11,0x21,0x15,0x21,
-0x11,0xc9,0x03,0xa1,0xfd,0x29,0x05,0xd5,0xaa,0xfa,0xd5,0x00,0x00,0x02,0x00,0x31,
-0xfe,0x56,0x06,0x03,0x05,0xd5,0x00,0x07,0x00,0x17,0x00,0x35,0x40,0x0f,0x02,0x1c,
-0x0e,0x19,0x13,0x1c,0x10,0x17,0x03,0x1c,0x0d,0x14,0x1c,0x17,0x18,0x10,0xdc,0xec,
-0xd4,0xec,0x10,0xd4,0xec,0xcc,0xd4,0xec,0x31,0x00,0x40,0x0c,0x03,0x95,0x0d,0x81,
-0x12,0x16,0xbd,0x0f,0x00,0x17,0x95,0x14,0x2f,0xec,0x32,0x32,0xec,0x32,0xf4,0xec,
-0x30,0x25,0x21,0x11,0x21,0x15,0x10,0x03,0x06,0x05,0x36,0x37,0x12,0x19,0x01,0x21,
-0x11,0x33,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x01,0xc8,0x02,0xa8,0xfe,0x1b,0x84,
-0x18,0xfe,0xa8,0x84,0x32,0x75,0x03,0x78,0xc9,0xc9,0xfb,0xc0,0xc9,0xaa,0x04,0x81,
-0xd4,0xfe,0x11,0xfe,0xb1,0x3d,0x32,0x39,0x7e,0x01,0x25,0x02,0x35,0x01,0x1a,0xfa,
-0xd5,0xfd,0xac,0x01,0xaa,0xfe,0x56,0x02,0x54,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,
-0x04,0x8b,0x05,0xd5,0x12,0x06,0x00,0x28,0x00,0x00,0x00,0x01,0x00,0x3b,0x00,0x00,
-0x06,0xad,0x05,0xd5,0x00,0x15,0x00,0x6e,0x40,0x16,0x42,0x02,0x14,0x10,0x81,0x0e,
-0x08,0x0c,0x95,0x00,0x12,0xad,0x06,0x0a,0x0e,0x17,0x08,0x15,0x1c,0x0b,0x14,0x16,
-0x10,0xd4,0x3c,0xfc,0x3c,0xc4,0x31,0x00,0x2f,0x3c,0x3c,0xf4,0x3c,0xec,0x32,0x10,
-0xf4,0x3c,0x3c,0x30,0x4b,0x53,0x58,0x40,0x24,0x04,0x11,0x07,0x02,0x01,0x05,0x11,
-0x06,0x07,0x06,0x04,0x11,0x01,0x03,0x11,0x02,0x02,0x01,0x0f,0x11,0x12,0x0d,0x0c,
-0x10,0x11,0x11,0x12,0x11,0x0f,0x11,0x0c,0x0e,0x11,0x0d,0x0d,0x0c,0x05,0x07,0x10,
-0xec,0x10,0xec,0x07,0x10,0xec,0x08,0x10,0xec,0x05,0x07,0x10,0xec,0x10,0xec,0x07,
-0x10,0xec,0x08,0x10,0xec,0x59,0x01,0x33,0x01,0x33,0x09,0x01,0x23,0x01,0x23,0x11,
-0x23,0x11,0x23,0x01,0x23,0x09,0x01,0x33,0x01,0x33,0x11,0x33,0x03,0xd9,0x95,0x01,
-0x34,0xd9,0xfe,0xa2,0x01,0x90,0xd9,0xfe,0x9b,0x96,0xca,0x96,0xfe,0x9b,0xd9,0x01,
-0x90,0xfe,0xa2,0xd9,0x01,0x34,0x95,0xca,0x03,0x71,0x02,0x64,0xfd,0x47,0xfc,0xe4,
-0x02,0xc7,0xfd,0x39,0x02,0xc7,0xfd,0x39,0x03,0x1c,0x02,0xb9,0xfd,0x9c,0x02,0x64,
-0xff,0xff,0x00,0x9c,0xff,0xe3,0x04,0x73,0x05,0xf0,0x12,0x06,0x00,0x16,0x00,0x00,
-0x00,0x01,0x00,0xc9,0x00,0x00,0x05,0x33,0x05,0xd5,0x00,0x09,0x00,0x79,0x40,0x1e,
-0x03,0x11,0x09,0x09,0x08,0x08,0x11,0x04,0x04,0x03,0x42,0x08,0x03,0x09,0x06,0xaf,
-0x02,0x05,0x09,0x04,0x07,0x03,0x1c,0x00,0x36,0x07,0x1c,0x06,0x04,0x0a,0x10,0xfc,
-0xec,0xfc,0xec,0x11,0x39,0x39,0x31,0x00,0x2f,0x3c,0xec,0x32,0x39,0x39,0x30,0x4b,
-0x53,0x58,0x07,0x10,0x04,0xed,0x07,0x10,0x04,0xed,0x59,0x22,0xb2,0x1f,0x0b,0x01,
-0x01,0x5d,0x40,0x30,0x36,0x08,0x38,0x03,0x48,0x08,0x47,0x03,0x69,0x08,0x66,0x03,
-0x80,0x08,0x07,0x06,0x04,0x09,0x09,0x15,0x04,0x1a,0x09,0x46,0x04,0x49,0x09,0x57,
-0x04,0x58,0x09,0x65,0x04,0x69,0x09,0x79,0x09,0x85,0x04,0x8a,0x09,0x95,0x04,0x9a,
-0x09,0x9f,0x0b,0x10,0x5d,0x00,0x5d,0x01,0x11,0x23,0x11,0x01,0x21,0x11,0x33,0x11,
-0x01,0x05,0x33,0xc4,0xfd,0x6a,0xfe,0xf0,0xc4,0x02,0x96,0x05,0xd5,0xfa,0x2b,0x04,
-0xe1,0xfb,0x1f,0x05,0xd5,0xfb,0x1f,0x04,0xe1,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,
-0x05,0x33,0x07,0x6d,0x10,0x27,0x0b,0xf0,0x04,0xf5,0x01,0x75,0x12,0x06,0x03,0x90,
-0x00,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,0x05,0x6a,0x05,0xd5,0x12,0x06,0x00,0x2e,
-0x00,0x00,0x00,0x01,0x00,0x36,0xff,0xe4,0x05,0x3a,0x05,0xd5,0x00,0x0f,0x00,0x26,
-0x40,0x14,0x0b,0x95,0x06,0x81,0x09,0x01,0x95,0x00,0x8c,0x09,0x11,0x04,0x0a,0x1c,
-0x07,0x0b,0x1c,0x06,0x01,0x10,0x10,0xd4,0xd4,0xec,0xd4,0xec,0xec,0x31,0x00,0x2f,
-0xf4,0xec,0x10,0xf4,0xec,0x30,0x17,0x35,0x36,0x37,0x12,0x19,0x01,0x21,0x11,0x23,
-0x11,0x21,0x15,0x10,0x03,0x06,0x36,0xd4,0x43,0x75,0x03,0x78,0xca,0xfe,0x1b,0x84,
-0x62,0x1c,0xa7,0x2e,0xa8,0x01,0x25,0x02,0x35,0x01,0x1a,0xfa,0x2b,0x05,0x2b,0xd4,
-0xfe,0x18,0xfe,0xaa,0xfd,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,0x06,0x1f,0x05,0xd5,
-0x12,0x06,0x00,0x30,0x00,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,0x05,0x3b,0x05,0xd5,
-0x12,0x06,0x00,0x2b,0x00,0x00,0xff,0xff,0x00,0x73,0xff,0xe3,0x05,0xd9,0x05,0xf0,
-0x12,0x06,0x00,0x32,0x00,0x00,0x00,0x01,0x00,0xc9,0x00,0x00,0x05,0x3b,0x05,0xd5,
-0x00,0x07,0x00,0x1f,0x40,0x10,0x04,0x95,0x07,0x81,0x02,0x06,0x09,0x04,0x03,0x1c,
-0x00,0x04,0x1c,0x07,0x04,0x08,0x10,0xfc,0xec,0xd4,0xec,0xec,0x31,0x00,0x2f,0x3c,
-0xf4,0xec,0x30,0x01,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x05,0x3b,0xca,0xfd,0x22,
-0xca,0x05,0xd5,0xfa,0x2b,0x05,0x2b,0xfa,0xd5,0x05,0xd5,0x00,0xff,0xff,0x00,0xc9,
-0x00,0x00,0x04,0x8d,0x05,0xd5,0x12,0x06,0x00,0x33,0x00,0x00,0xff,0xff,0x00,0x73,
-0xff,0xe3,0x05,0x27,0x05,0xf0,0x12,0x06,0x00,0x26,0x00,0x00,0xff,0xff,0xff,0xfa,
-0x00,0x00,0x04,0xe9,0x05,0xd5,0x12,0x06,0x00,0x37,0x00,0x00,0x00,0x01,0x00,0x23,
-0xff,0xe3,0x04,0xbd,0x05,0xd5,0x00,0x11,0x00,0x41,0x40,0x0e,0x42,0x06,0x95,0x05,
-0x8c,0x10,0x0d,0x81,0x12,0x13,0x11,0x06,0x0d,0x12,0x10,0xd4,0xc4,0xd4,0xc4,0x31,
-0x00,0x10,0xe4,0x32,0xf4,0xec,0x30,0x4b,0x53,0x58,0x40,0x12,0x0f,0x11,0x00,0x0d,
-0x0c,0x10,0x11,0x11,0x11,0x00,0x0f,0x11,0x0c,0x0e,0x11,0x0d,0x0d,0x0c,0x05,0x07,
-0x10,0xec,0x10,0xec,0x07,0x10,0xec,0x08,0x10,0xec,0x59,0x25,0x06,0x07,0x06,0x2b,
-0x01,0x35,0x33,0x32,0x37,0x36,0x3f,0x01,0x01,0x33,0x09,0x01,0x33,0x02,0x8f,0x16,
-0x1f,0x67,0xe3,0x4d,0x3f,0x8c,0x31,0x0e,0x08,0x2d,0xfe,0x21,0xd9,0x01,0x73,0x01,
-0x75,0xd9,0xb5,0x33,0x25,0x7a,0xaa,0x4b,0x16,0x12,0x6a,0x04,0x6b,0xfc,0x94,0x03,
-0x6c,0x00,0x00,0x03,0x00,0x73,0x00,0x00,0x05,0xd9,0x05,0xd5,0x00,0x08,0x00,0x11,
-0x00,0x27,0x00,0x3b,0x40,0x1f,0x11,0x00,0x95,0x1d,0x1a,0x1b,0x81,0x27,0x09,0x08,
-0x95,0x25,0x12,0x27,0x29,0x10,0x0d,0x19,0x21,0x12,0x00,0x1b,0x1c,0x25,0x11,0x1c,
-0x04,0x19,0x16,0x10,0x28,0x10,0xfc,0xec,0xd4,0x3c,0x3c,0xfc,0x3c,0x3c,0xd4,0xec,
-0xec,0x31,0x00,0x2f,0xdc,0x3c,0xec,0x32,0x10,0xf4,0xdc,0x3c,0xec,0x32,0x30,0x01,
-0x06,0x07,0x06,0x15,0x14,0x17,0x16,0x17,0x33,0x36,0x37,0x36,0x35,0x34,0x27,0x26,
-0x27,0x03,0x26,0x27,0x26,0x11,0x10,0x37,0x36,0x37,0x35,0x33,0x15,0x16,0x17,0x16,
-0x11,0x10,0x07,0x06,0x07,0x15,0x23,0x02,0xc2,0x96,0x62,0x82,0x82,0x62,0x96,0xca,
-0x96,0x62,0x80,0x80,0x62,0x96,0xca,0xf4,0x9e,0xbd,0xbd,0x9d,0xf5,0xca,0xf4,0x9d,
-0xbc,0xbc,0x9d,0xf4,0xca,0x04,0x8e,0x15,0x57,0x73,0xc6,0xc5,0x73,0x57,0x15,0x15,
-0x57,0x73,0xc5,0xc6,0x73,0x57,0x15,0xfc,0x10,0x16,0x86,0xa0,0x01,0x0f,0x01,0x0f,
-0xa1,0x87,0x16,0x9f,0x9f,0x17,0x86,0xa1,0xfe,0xf1,0xfe,0xf2,0xa1,0x86,0x17,0x9d,
-0xff,0xff,0x00,0x3d,0x00,0x00,0x05,0x3b,0x05,0xd5,0x12,0x06,0x00,0x3b,0x00,0x00,
-0x00,0x01,0x00,0xc9,0xfe,0x56,0x06,0x04,0x05,0xd5,0x00,0x0b,0x00,0x28,0x40,0x15,
-0x06,0x02,0x81,0x0b,0xbd,0x08,0x04,0x95,0x01,0x0d,0x00,0x1c,0x09,0x06,0x1c,0x07,
-0x03,0x1c,0x02,0x04,0x0c,0x10,0xfc,0xec,0xd4,0xec,0xd4,0xec,0xcc,0x31,0x00,0x2f,
-0xec,0x32,0xec,0xf4,0x3c,0x30,0x29,0x01,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,
-0x11,0x23,0x05,0x3b,0xfb,0x8e,0xca,0x02,0xde,0xca,0xc9,0xc9,0x05,0xd5,0xfa,0xd5,
-0x05,0x2b,0xfa,0xd5,0xfd,0xac,0x00,0x01,0x00,0xaf,0x00,0x00,0x04,0xb3,0x05,0xd5,
-0x00,0x10,0x00,0x23,0x40,0x12,0x02,0x95,0x0c,0xad,0x0e,0x07,0x81,0x00,0x12,0x04,
-0x01,0x0e,0x1c,0x0f,0x08,0x1c,0x07,0x11,0x10,0xdc,0xec,0xd4,0xec,0x32,0xec,0x31,
-0x00,0x2f,0xe4,0x32,0xf4,0xec,0x30,0x21,0x11,0x21,0x22,0x27,0x26,0x35,0x11,0x33,
-0x11,0x14,0x16,0x33,0x21,0x11,0x33,0x11,0x03,0xe8,0xfe,0x5f,0xba,0x71,0x6d,0xc9,
-0x7c,0x7c,0x01,0x78,0xcb,0x02,0xc7,0x77,0x72,0xee,0x01,0x37,0xfe,0xd9,0x9f,0x9e,
-0x02,0x64,0xfa,0x2b,0x00,0x01,0x00,0xc9,0x00,0x00,0x07,0x39,0x05,0xd5,0x00,0x0b,
-0x00,0x28,0x40,0x15,0x0a,0x02,0x06,0x81,0x00,0x08,0x95,0x05,0x0d,0x04,0x02,0x1c,
-0x03,0x0a,0x1c,0x0b,0x07,0x1c,0x06,0x04,0x0c,0x10,0xfc,0xec,0xd4,0xfc,0xd4,0xec,
-0xec,0x31,0x00,0x2f,0xec,0x32,0xf4,0x3c,0xc4,0x30,0x25,0x21,0x11,0x33,0x11,0x21,
-0x11,0x33,0x11,0x21,0x11,0x33,0x04,0x66,0x02,0x09,0xca,0xf9,0x90,0xca,0x02,0x09,
-0xca,0xaa,0x05,0x2b,0xfa,0x2b,0x05,0xd5,0xfa,0xd5,0x04,0xdd,0x00,0x01,0x00,0xc9,
-0xfe,0x56,0x08,0x02,0x05,0xd5,0x00,0x0f,0x00,0x31,0x40,0x1a,0x06,0x0a,0x02,0x81,
-0x0f,0xbd,0x0c,0x08,0x04,0x95,0x01,0x11,0x00,0x1c,0x0d,0x0a,0x1c,0x0b,0x06,0x1c,
-0x07,0x03,0x1c,0x02,0x04,0x10,0x10,0xfc,0xec,0xd4,0xfc,0xd4,0xec,0xd4,0xec,0xcc,
-0x31,0x00,0x2f,0xec,0x32,0x32,0xec,0xf4,0x3c,0xc4,0x30,0x29,0x01,0x11,0x33,0x11,
-0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x11,0x23,0x07,0x39,0xf9,0x90,0xca,
-0x02,0x09,0xca,0x02,0x09,0xca,0xc9,0xc9,0x05,0xd5,0xfa,0xd5,0x04,0xdd,0xfb,0x23,
-0x05,0x2b,0xfa,0xd5,0xfd,0xac,0x00,0x02,0x00,0x32,0x00,0x00,0x06,0x18,0x05,0xd5,
-0x00,0x0c,0x00,0x17,0x00,0x2a,0x40,0x16,0x02,0x95,0x03,0x81,0x00,0x12,0x95,0x05,
-0xad,0x13,0x95,0x00,0x10,0x0d,0x19,0x09,0x12,0x04,0x1c,0x01,0x03,0x18,0x10,0xcc,
-0xdc,0xec,0x32,0xd4,0xec,0xcc,0x31,0x00,0x2f,0xec,0xf4,0xec,0x10,0xf4,0xec,0x30,
-0x21,0x11,0x21,0x35,0x21,0x11,0x21,0x32,0x04,0x15,0x14,0x04,0x23,0x01,0x34,0x27,
-0x26,0x23,0x21,0x11,0x21,0x32,0x37,0x36,0x01,0xf5,0xfe,0x3d,0x02,0x8d,0x01,0x4e,
-0xfb,0x01,0x10,0xfe,0xf0,0xfb,0x01,0x36,0x4f,0x4e,0xa3,0xfe,0xbc,0x01,0x44,0xa1,
-0x50,0x4f,0x05,0x2b,0xaa,0xfd,0x9a,0xda,0xde,0xdd,0xda,0x01,0xb7,0x8b,0x44,0x43,
-0xfd,0xdd,0x44,0x43,0xff,0xff,0x00,0xc9,0x00,0x00,0x06,0x46,0x05,0xd5,0x10,0x27,
-0x00,0x2c,0x04,0xb3,0x00,0x00,0x11,0x06,0x03,0xa4,0x00,0x00,0x00,0x0d,0x40,0x06,
-0x1b,0x04,0x01,0x1c,0x00,0x15,0x10,0xdc,0xfc,0xec,0x31,0x00,0x00,0x02,0x00,0xc9,
-0x00,0x00,0x04,0xec,0x05,0xd5,0x00,0x0a,0x00,0x15,0x00,0x24,0x40,0x13,0x05,0x95,
-0x0d,0xad,0x0b,0x81,0x06,0x95,0x15,0x17,0x00,0x19,0x11,0x05,0x0c,0x1c,0x0b,0x04,
-0x16,0x10,0xfc,0xec,0x32,0xd4,0xec,0xcc,0x31,0x00,0x2f,0xec,0xe4,0xf4,0xec,0x30,
-0x01,0x34,0x27,0x26,0x23,0x21,0x11,0x21,0x32,0x37,0x36,0x01,0x33,0x11,0x21,0x32,
-0x04,0x15,0x14,0x04,0x23,0x21,0x04,0x17,0x4f,0x4e,0xa3,0xfe,0xbc,0x01,0x44,0xa3,
-0x4e,0x4f,0xfc,0xb2,0xca,0x01,0x4e,0xfb,0x01,0x10,0xfe,0xf0,0xfb,0xfd,0xe8,0x01,
-0xb7,0x8b,0x44,0x43,0xfd,0xdd,0x44,0x43,0x04,0xa8,0xfd,0x9a,0xda,0xde,0xdd,0xda,
-0x00,0x01,0x00,0x6f,0xff,0xe3,0x05,0x23,0x05,0xf0,0x00,0x24,0x00,0x3a,0x40,0x20,
-0x01,0x95,0x02,0xad,0x25,0x0b,0xa1,0x0c,0xae,0x07,0x95,0x10,0x91,0x25,0x1d,0xa1,
-0x1c,0xae,0x21,0x95,0x18,0x8c,0x25,0x26,0x00,0x03,0x19,0x14,0x02,0x1d,0x0c,0x25,
-0x10,0xdc,0x3c,0xcc,0xd4,0xec,0x32,0xcc,0x31,0x00,0x10,0xf4,0xec,0xf4,0xec,0x10,
-0xf4,0xec,0xf4,0xec,0x10,0xf4,0xec,0x30,0x01,0x21,0x35,0x21,0x26,0x27,0x26,0x21,
-0x22,0x07,0x06,0x07,0x35,0x36,0x37,0x36,0x33,0x20,0x17,0x16,0x11,0x10,0x07,0x06,
-0x21,0x22,0x27,0x26,0x27,0x35,0x16,0x17,0x16,0x33,0x20,0x37,0x36,0x04,0x4e,0xfd,
-0x46,0x02,0xb2,0x19,0x67,0x88,0xff,0x00,0x82,0x74,0x73,0x66,0x68,0x77,0x76,0x86,
-0x01,0x53,0xc3,0xc3,0xc3,0xc3,0xfe,0xad,0x84,0x76,0x77,0x6a,0x66,0x73,0x74,0x82,
-0x01,0x00,0x88,0x81,0x02,0xc7,0xaa,0xc6,0x77,0x9c,0x2f,0x2f,0x5f,0xd5,0x47,0x23,
-0x24,0xd0,0xcf,0xfe,0x98,0xfe,0x99,0xd0,0xcf,0x24,0x24,0x48,0xd3,0x5f,0x2f,0x2f,
-0x9d,0x93,0x00,0x02,0x00,0xd3,0xff,0xe3,0x07,0xcc,0x05,0xf0,0x00,0x0f,0x00,0x26,
-0x00,0x38,0x40,0x1f,0x00,0x95,0x14,0x91,0x27,0x08,0x95,0x1c,0x8c,0x27,0x21,0x95,
-0x26,0xad,0x24,0x81,0x23,0x28,0x0c,0x19,0x18,0x04,0x19,0x20,0x10,0x21,0x25,0x1c,
-0x24,0x04,0x27,0x10,0xfc,0xec,0x32,0xd4,0x3c,0xec,0xd4,0xec,0xcc,0x31,0x00,0x2f,
-0xe4,0xf4,0xec,0x10,0xf4,0xec,0x10,0xf4,0xec,0x30,0x01,0x22,0x07,0x06,0x11,0x10,
-0x17,0x16,0x33,0x32,0x37,0x36,0x11,0x10,0x27,0x26,0x01,0x12,0x37,0x36,0x21,0x20,
-0x17,0x16,0x11,0x10,0x07,0x06,0x21,0x20,0x27,0x26,0x03,0x23,0x11,0x23,0x11,0x33,
-0x11,0x05,0x1a,0xdc,0x82,0x81,0x81,0x82,0xdc,0xdc,0x80,0x81,0x81,0x80,0xfc,0x77,
-0x1e,0x97,0xbd,0x01,0x3b,0x01,0x3a,0xbc,0xbc,0xbc,0xbc,0xfe,0xc6,0xfe,0xc5,0xbd,
-0xb3,0x09,0xc9,0xca,0xca,0x05,0x4c,0xa4,0xa4,0xfe,0xe5,0xfe,0xe6,0xa4,0xa4,0xa4,
-0xa4,0x01,0x1a,0x01,0x1b,0xa4,0xa4,0xfe,0x25,0x01,0x05,0xa8,0xd2,0xd2,0xd3,0xfe,
-0x9e,0xfe,0x9f,0xd2,0xd3,0xd2,0xc8,0x01,0x4a,0xfd,0x39,0x05,0xd5,0xfd,0x9c,0x00,
-0x00,0x02,0x00,0x3b,0x00,0x00,0x04,0xc6,0x05,0xd5,0x00,0x13,0x00,0x1c,0x00,0x45,
-0x40,0x16,0x42,0x15,0x95,0x06,0x81,0x10,0x0b,0x95,0x1b,0xad,0x09,0x10,0x1e,0x04,
-0x0a,0x14,0x1c,0x07,0x18,0x19,0x03,0x1d,0x10,0xd4,0xec,0xd4,0xec,0x32,0xec,0x31,
-0x00,0x2f,0x3c,0xf4,0xec,0x10,0xf4,0xec,0x30,0x4b,0x53,0x58,0x40,0x0d,0x0d,0x0c,
-0x0b,0x03,0x0a,0x0e,0x11,0x11,0x0f,0x11,0x10,0x11,0x10,0x05,0x07,0x10,0xec,0x10,
-0xec,0x11,0x17,0x39,0x59,0x01,0x2e,0x01,0x35,0x34,0x36,0x29,0x01,0x11,0x23,0x11,
-0x23,0x22,0x06,0x07,0x03,0x23,0x13,0x3e,0x01,0x01,0x23,0x22,0x06,0x15,0x14,0x16,
-0x3b,0x01,0x02,0x02,0x7d,0x83,0xfc,0x01,0x00,0x01,0xc8,0xca,0xdc,0x78,0x8b,0x4a,
-0xbf,0xd9,0xcd,0x3e,0x7b,0x02,0x3b,0xfe,0x92,0x95,0x95,0x92,0xfe,0x02,0xbc,0x24,
-0xba,0x8d,0xd8,0xd6,0xfa,0x2b,0x02,0x77,0x62,0x96,0xfe,0x81,0x01,0x98,0x7e,0x90,
-0x02,0x89,0x85,0x83,0x83,0x87,0xff,0xff,0x00,0x7b,0xff,0xe3,0x04,0x2d,0x04,0x7b,
-0x12,0x06,0x00,0x44,0x00,0x00,0x00,0x02,0x00,0x71,0xff,0xe3,0x04,0x75,0x05,0xf0,
-0x00,0x1c,0x00,0x2d,0x00,0x49,0x40,0x28,0x1d,0x16,0x2c,0xb9,0x06,0x2e,0x00,0x86,
-0x1c,0x88,0x02,0xb9,0x1a,0x2e,0x25,0xb9,0x0e,0x8c,0x2e,0x1d,0x28,0x16,0x21,0x04,
-0x2f,0x45,0x1c,0x28,0x12,0x0a,0x51,0x12,0x04,0x12,0x18,0x21,0x12,0x12,0x45,0x2e,
-0x10,0xfc,0xec,0xd4,0xec,0x10,0xf4,0xec,0xc4,0xec,0x11,0x12,0x39,0x12,0x39,0x31,
-0x00,0x10,0xf4,0xec,0x10,0xd4,0xec,0xf4,0xec,0x10,0xd4,0xec,0x39,0x39,0x30,0x01,
-0x26,0x23,0x22,0x15,0x14,0x05,0x16,0x17,0x16,0x11,0x10,0x07,0x06,0x23,0x22,0x27,
-0x26,0x11,0x34,0x37,0x36,0x37,0x26,0x35,0x10,0x21,0x32,0x17,0x01,0x06,0x07,0x06,
-0x15,0x14,0x17,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x26,0x27,0x26,0x03,0xec,0x66,
-0xef,0xfd,0x01,0x08,0xd0,0x75,0x8e,0x89,0x89,0xf0,0xef,0x8a,0x89,0x89,0x35,0x4b,
-0x9c,0x01,0xb9,0xdd,0x78,0xfe,0x18,0x44,0x37,0x56,0x55,0x56,0x95,0x93,0xac,0x5b,
-0x61,0x7e,0x40,0x05,0x11,0x46,0x75,0x5c,0x30,0x25,0x70,0x87,0xfe,0xeb,0xfe,0xf7,
-0x9c,0x9d,0x9d,0x9c,0x01,0x13,0xcc,0xa5,0x40,0x24,0x4f,0x8d,0x01,0x10,0x46,0xfe,
-0x28,0x1d,0x49,0x71,0xcc,0xcb,0x72,0x73,0xe8,0xbe,0xc7,0x60,0x67,0x0b,0x06,0x00,
-0x00,0x03,0x00,0xba,0x00,0x00,0x04,0x3e,0x04,0x60,0x00,0x0a,0x00,0x15,0x00,0x26,
-0x00,0x2d,0x40,0x18,0x00,0xa9,0x0c,0x26,0x0b,0xa9,0x16,0xbc,0x01,0xa9,0x26,0x11,
-0x12,0x1a,0x28,0x06,0x12,0x21,0x00,0x0b,0x08,0x16,0x46,0x27,0x10,0xfc,0xec,0x32,
-0xd4,0xec,0xcc,0xd4,0xec,0x31,0x00,0x2f,0xec,0xf4,0xec,0x10,0xd4,0xec,0x30,0x01,
-0x11,0x21,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x23,0x01,0x11,0x33,0x32,0x37,0x36,
-0x35,0x34,0x27,0x26,0x23,0x25,0x21,0x32,0x16,0x15,0x14,0x07,0x06,0x07,0x1e,0x01,
-0x15,0x14,0x07,0x06,0x23,0x21,0x01,0x72,0x01,0x06,0x81,0x42,0x3f,0x3f,0x45,0x7e,
-0xfe,0xfa,0xf2,0x75,0x3d,0x3a,0x3a,0x3d,0x75,0xfe,0x56,0x01,0xb6,0xc5,0xd4,0x36,
-0x36,0x6a,0x7f,0x8c,0x74,0x73,0xd6,0xfe,0x39,0x02,0x02,0xfe,0x97,0x2e,0x2c,0x5b,
-0x5e,0x29,0x2d,0x01,0xc5,0xfe,0xda,0x26,0x24,0x4b,0x48,0x24,0x25,0x99,0x90,0x85,
-0x67,0x3c,0x3d,0x0f,0x18,0x98,0x72,0x96,0x52,0x52,0x00,0x01,0x00,0xba,0x00,0x00,
-0x03,0xd0,0x04,0x60,0x00,0x05,0x00,0x19,0x40,0x0c,0x04,0xa9,0x01,0xbc,0x00,0x07,
-0x02,0x04,0x08,0x01,0x46,0x06,0x10,0xfc,0xfc,0xcc,0xc4,0x31,0x00,0x2f,0xf4,0xec,
-0x30,0x33,0x11,0x21,0x15,0x21,0x11,0xba,0x03,0x16,0xfd,0xa2,0x04,0x60,0xaa,0xfc,
-0x4a,0x00,0x00,0x02,0x00,0x32,0xfe,0x56,0x05,0x2e,0x04,0x60,0x00,0x07,0x00,0x17,
-0x00,0x35,0x40,0x0f,0x02,0x08,0x0e,0x19,0x13,0x08,0x10,0x17,0x03,0x08,0x0d,0x14,
-0x08,0x17,0x18,0x10,0xdc,0xec,0xd4,0xec,0x10,0xd4,0xec,0xcc,0xd4,0xec,0x31,0x00,
-0x40,0x0c,0x03,0xa9,0x0d,0xbc,0x12,0x16,0xbd,0x0f,0x00,0x17,0xa9,0x14,0x2f,0xec,
-0x32,0x32,0xec,0x32,0xf4,0xec,0x30,0x25,0x21,0x11,0x21,0x15,0x10,0x07,0x06,0x05,
-0x36,0x37,0x36,0x11,0x35,0x21,0x11,0x33,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x01,
-0xa6,0x02,0x18,0xfe,0x7b,0x76,0x14,0xfe,0xed,0x5b,0x28,0x62,0x02,0xf5,0xb8,0xb8,
-0xfc,0x74,0xb8,0x99,0x03,0x2e,0x86,0xfe,0x6d,0xdf,0x11,0x25,0x28,0x55,0xd3,0x01,
-0xa3,0xd4,0xfc,0x39,0xfd,0xbd,0x01,0xaa,0xfe,0x56,0x02,0x43,0xff,0xff,0x00,0x71,
-0xff,0xe3,0x04,0x7f,0x04,0x7b,0x12,0x06,0x00,0x48,0x00,0x00,0x00,0x01,0x00,0x32,
-0x00,0x00,0x05,0xad,0x04,0x60,0x00,0x15,0x00,0x6d,0x40,0x15,0x42,0x02,0x14,0x10,
-0xbc,0x0e,0x08,0x0c,0xa9,0x00,0x12,0x06,0x0a,0x0e,0x17,0x08,0x15,0x08,0x0b,0x14,
-0x16,0x10,0xd4,0x3c,0xfc,0x3c,0xc4,0x31,0x00,0x2f,0x3c,0x3c,0xd4,0x3c,0xec,0x32,
-0x10,0xf4,0x3c,0x3c,0x30,0x4b,0x53,0x58,0x40,0x24,0x04,0x11,0x07,0x02,0x01,0x05,
-0x11,0x06,0x07,0x06,0x04,0x11,0x01,0x03,0x11,0x02,0x02,0x01,0x0f,0x11,0x12,0x0d,
-0x0c,0x10,0x11,0x11,0x12,0x11,0x0f,0x11,0x0c,0x0e,0x11,0x0d,0x0d,0x0c,0x05,0x07,
-0x10,0xec,0x10,0xec,0x07,0x10,0xec,0x08,0x10,0xec,0x05,0x07,0x10,0xec,0x10,0xec,
-0x07,0x10,0xec,0x08,0x10,0xec,0x59,0x01,0x33,0x01,0x33,0x09,0x01,0x23,0x01,0x23,
-0x11,0x23,0x11,0x23,0x01,0x23,0x09,0x01,0x33,0x01,0x33,0x11,0x33,0x03,0x4b,0x71,
-0x01,0x02,0xc4,0xfe,0xd7,0x01,0x54,0xc5,0xfe,0xd5,0x72,0xb7,0x72,0xfe,0xd5,0xc5,
-0x01,0x54,0xfe,0xd7,0xc4,0x01,0x02,0x71,0xb7,0x02,0xa1,0x01,0xbf,0xfd,0xf5,0xfd,
-0xab,0x02,0x09,0xfd,0xf7,0x02,0x09,0xfd,0xf7,0x02,0x55,0x02,0x0b,0xfe,0x41,0x01,
-0xbf,0x00,0x00,0x01,0x00,0x85,0xff,0xe3,0x03,0xc8,0x04,0x7c,0x00,0x31,0x00,0x3c,
-0x40,0x21,0x26,0x86,0x27,0x88,0x22,0xb9,0x2a,0xb8,0x32,0x18,0xa9,0x19,0x32,0x0b,
-0x86,0x0a,0x88,0x0f,0xb9,0x06,0x8c,0x32,0x1e,0x12,0x2e,0x33,0x13,0x12,0x03,0x19,
-0x27,0x0b,0x32,0x10,0xdc,0xc4,0xc4,0xd4,0xec,0xcc,0xd4,0xec,0x31,0x00,0x10,0xf4,
-0xec,0xfc,0xec,0x10,0xd4,0xec,0x10,0xf4,0xec,0xfc,0xec,0x30,0x01,0x1e,0x01,0x15,
-0x14,0x04,0x23,0x22,0x27,0x26,0x27,0x35,0x16,0x17,0x16,0x33,0x32,0x37,0x36,0x35,
-0x34,0x27,0x26,0x2b,0x01,0x35,0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x23,0x22,
-0x07,0x06,0x07,0x35,0x3e,0x01,0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x02,0xc2,
-0x7c,0x8a,0xfe,0xfe,0xee,0x50,0x55,0x54,0x5a,0x47,0x55,0x55,0x5d,0x97,0x55,0x54,
-0x4e,0x48,0x89,0x94,0x9b,0x74,0x43,0x44,0x46,0x45,0x77,0x47,0x51,0x50,0x61,0x62,
-0xaa,0x4c,0xc4,0x71,0x72,0x3c,0x3c,0x02,0x5c,0x18,0x92,0x6c,0xad,0xb6,0x0e,0x0e,
-0x1c,0xab,0x25,0x13,0x12,0x38,0x38,0x5a,0x58,0x38,0x33,0x98,0x2c,0x2d,0x46,0x40,
-0x2e,0x2e,0x0d,0x0d,0x1d,0xa7,0x18,0x18,0x4e,0x4f,0x8d,0x5d,0x40,0x41,0x00,0x01,
-0x00,0xc1,0x00,0x00,0x04,0x80,0x04,0x60,0x00,0x09,0x00,0x3f,0x40,0x15,0x42,0x08,
-0x03,0x09,0x06,0xbc,0x02,0x05,0x0b,0x46,0x09,0x04,0x07,0x03,0x08,0x00,0x07,0x08,
-0x06,0x46,0x0a,0x10,0xfc,0xec,0xd4,0xec,0x11,0x39,0x39,0xec,0x31,0x00,0x2f,0x3c,
-0xe4,0x32,0x39,0x39,0x30,0x4b,0x53,0x58,0x40,0x0a,0x03,0x11,0x09,0x09,0x08,0x08,
-0x11,0x04,0x04,0x03,0x07,0x10,0xec,0x07,0x10,0xec,0x59,0x01,0x11,0x23,0x11,0x01,
-0x23,0x11,0x33,0x11,0x01,0x04,0x80,0xb7,0xfd,0xe4,0xec,0xb7,0x02,0x1b,0x04,0x60,
-0xfb,0xa0,0x03,0x83,0xfc,0x7d,0x04,0x60,0xfc,0x7f,0x03,0x81,0xff,0xff,0x00,0xc1,
-0x00,0x00,0x04,0x80,0x06,0x14,0x10,0x27,0x02,0x8c,0x00,0xa0,0xff,0xcc,0x12,0x06,
-0x03,0xb0,0x00,0x00,0x00,0x01,0x00,0xbf,0x00,0x00,0x04,0xa1,0x04,0x60,0x00,0x0a,
-0x00,0x46,0x40,0x11,0x42,0x03,0x00,0xbc,0x07,0x0a,0x0c,0x05,0x01,0x04,0x06,0x08,
-0x01,0x08,0x00,0x46,0x0b,0x10,0xfc,0xec,0x32,0xd4,0xc4,0x11,0x39,0xc4,0x31,0x00,
-0x2f,0x3c,0xe4,0x32,0x30,0x4b,0x53,0x58,0x40,0x10,0x07,0x11,0x06,0x08,0x11,0x05,
-0x06,0x05,0x02,0x11,0x05,0x03,0x11,0x04,0x05,0x04,0x05,0x07,0x10,0xec,0x04,0x10,
-0xec,0x07,0x10,0xec,0x05,0x10,0xec,0x59,0x13,0x33,0x11,0x01,0x33,0x09,0x01,0x23,
-0x01,0x11,0x23,0xbf,0xb9,0x02,0x25,0xeb,0xfd,0xae,0x02,0x6b,0xf0,0xfd,0xc7,0xb9,
-0x04,0x60,0xfe,0x1d,0x01,0xe3,0xfd,0xf4,0xfd,0xac,0x02,0x23,0xfd,0xdd,0x00,0x01,
-0x00,0x2e,0xff,0xe3,0x04,0x73,0x04,0x60,0x00,0x0f,0x00,0x26,0x40,0x14,0x0b,0xa9,
-0x06,0xbc,0x09,0x01,0xa9,0x00,0x8c,0x09,0x11,0x46,0x0a,0x08,0x07,0x0b,0x08,0x06,
-0x01,0x10,0x10,0xd4,0xd4,0xec,0xd4,0xec,0xec,0x31,0x00,0x2f,0xf4,0xec,0x10,0xf4,
-0xec,0x30,0x17,0x35,0x36,0x37,0x36,0x11,0x35,0x21,0x11,0x23,0x11,0x21,0x15,0x10,
-0x03,0x06,0x2e,0xb3,0x3b,0x62,0x02,0xf5,0xb8,0xfe,0x7b,0x76,0x5e,0x1d,0x99,0x1b,
-0x7f,0xcf,0x01,0xa7,0xd4,0xfb,0xa0,0x03,0xc7,0x86,0xfe,0x92,0xfe,0xfc,0xcf,0x00,
-0x00,0x01,0x00,0xc1,0x00,0x00,0x05,0x48,0x04,0x60,0x00,0x0c,0x00,0x4d,0x40,0x16,
-0x42,0x0a,0x07,0x02,0x03,0x08,0x03,0x00,0xbc,0x09,0x06,0x0c,0x0e,0x46,0x07,0x08,
-0x04,0x0a,0x08,0x00,0x46,0x0d,0x10,0xfc,0xec,0xdc,0xec,0xec,0x31,0x00,0x2f,0x3c,
-0xc4,0xec,0x32,0x11,0x17,0x39,0x30,0x4b,0x53,0x58,0x40,0x12,0x02,0x11,0x08,0x0a,
-0x09,0x03,0x11,0x07,0x08,0x07,0x02,0x11,0x09,0x01,0x11,0x0a,0x0a,0x09,0x05,0x07,
-0x10,0xed,0x10,0xed,0x07,0x10,0xed,0x08,0x10,0xed,0x59,0x13,0x21,0x09,0x01,0x21,
-0x11,0x23,0x11,0x01,0x23,0x01,0x11,0x23,0xc1,0x01,0x06,0x01,0x3e,0x01,0x3f,0x01,
-0x04,0xb2,0xfe,0xcb,0xb8,0xfe,0xca,0xb2,0x04,0x60,0xfd,0x12,0x02,0xee,0xfb,0xa0,
-0x03,0xb0,0xfd,0x27,0x02,0xd9,0xfc,0x50,0x00,0x01,0x00,0xc1,0x00,0x00,0x04,0x88,
-0x04,0x60,0x00,0x0b,0x00,0x27,0x40,0x14,0x09,0xa9,0x02,0x04,0x00,0xbc,0x07,0x0b,
-0x0d,0x46,0x08,0x04,0x08,0x05,0x09,0x01,0x08,0x00,0x46,0x0c,0x10,0xfc,0xec,0x32,
-0xdc,0xec,0x32,0xec,0x31,0x00,0x2f,0x3c,0xe4,0x32,0xdc,0xec,0x30,0x13,0x33,0x11,
-0x21,0x11,0x33,0x11,0x23,0x11,0x21,0x11,0x23,0xc1,0xb8,0x02,0x57,0xb8,0xb8,0xfd,
-0xa9,0xb8,0x04,0x60,0xfe,0x33,0x01,0xcd,0xfb,0xa0,0x02,0x04,0xfd,0xfc,0xff,0xff,
-0x00,0x71,0xff,0xe3,0x04,0x75,0x04,0x7b,0x12,0x06,0x00,0x52,0x00,0x00,0x00,0x01,
-0x00,0xc1,0x00,0x00,0x04,0x88,0x04,0x60,0x00,0x07,0x00,0x28,0x40,0x10,0x04,0xa9,
-0x07,0xbc,0x02,0x06,0x03,0x08,0x09,0x46,0x00,0x04,0x08,0x07,0x46,0x08,0x10,0xfc,
-0xec,0xd4,0xec,0xec,0x31,0x00,0x2f,0x3c,0xf4,0xec,0x30,0x40,0x05,0xa0,0x09,0x80,
-0x09,0x02,0x01,0x5d,0x01,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x04,0x88,0xb8,0xfd,
-0xa9,0xb8,0x04,0x60,0xfb,0xa0,0x03,0xc6,0xfc,0x3a,0x04,0x60,0xff,0xff,0x00,0xba,
-0xfe,0x56,0x04,0xa4,0x04,0x7b,0x12,0x06,0x00,0x53,0x00,0x00,0xff,0xff,0x00,0x71,
-0xff,0xe3,0x03,0xe7,0x04,0x7b,0x12,0x06,0x00,0x46,0x00,0x00,0x00,0x01,0x00,0x05,
-0x00,0x00,0x04,0x36,0x04,0x60,0x00,0x07,0x00,0x25,0x40,0x0d,0x03,0x07,0xa9,0x00,
-0xbc,0x05,0x09,0x01,0x03,0x08,0x00,0x06,0x08,0x10,0xd4,0xcc,0xfc,0xcc,0xcc,0x31,
-0x00,0x2f,0xf4,0xec,0x32,0x30,0x40,0x05,0xa0,0x09,0x80,0x09,0x02,0x01,0x5d,0x13,
-0x21,0x15,0x21,0x11,0x23,0x11,0x21,0x05,0x04,0x31,0xfe,0x42,0xb5,0xfe,0x42,0x04,
-0x60,0xaa,0xfc,0x4a,0x03,0xb6,0xff,0xff,0x00,0x3d,0xfe,0x56,0x04,0x7f,0x04,0x60,
-0x12,0x06,0x00,0x5c,0x00,0x00,0x00,0x03,0x00,0x71,0xfe,0x56,0x06,0xe4,0x05,0xd5,
-0x00,0x0f,0x00,0x34,0x00,0x43,0x00,0x40,0x40,0x23,0x39,0x0c,0xb9,0x27,0x1c,0xb8,
-0x21,0x97,0x44,0x40,0x04,0xb9,0x2f,0x15,0x8c,0x10,0xbd,0x44,0x45,0x45,0x35,0x12,
-0x2b,0x11,0x08,0x21,0x08,0x33,0x3d,0x22,0x00,0x12,0x19,0x45,0x44,0x10,0xfc,0xec,
-0xd4,0x3c,0x3c,0xfc,0x3c,0x3c,0xd4,0xec,0xec,0x31,0x00,0x10,0xec,0xf4,0x3c,0xec,
-0x32,0x10,0xe4,0xf4,0x3c,0xec,0x32,0x30,0x01,0x14,0x17,0x16,0x33,0x32,0x37,0x36,
-0x35,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x01,0x11,0x06,0x07,0x06,0x23,0x22,0x27,
-0x26,0x11,0x10,0x12,0x33,0x32,0x17,0x16,0x17,0x11,0x33,0x11,0x36,0x37,0x36,0x33,
-0x32,0x17,0x16,0x11,0x10,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x11,0x01,0x34,0x27,
-0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x01,0x34,0x44,0x43,
-0x85,0x85,0x45,0x44,0x44,0x45,0x85,0x85,0x43,0x44,0x02,0x1a,0x2d,0x4d,0x4c,0x65,
-0xc9,0x74,0x75,0xe8,0xca,0x64,0x4d,0x4c,0x2e,0xb9,0x2e,0x4d,0x4c,0x64,0xcb,0x73,
-0x74,0x74,0x74,0xca,0x66,0x4c,0x4d,0x2c,0x02,0x1c,0x43,0x44,0x85,0x86,0x45,0x45,
-0x8a,0x86,0x85,0x44,0x43,0x02,0x2f,0xd6,0x6d,0x6d,0x6d,0x6e,0xd5,0xd5,0x6e,0x6d,
-0x6d,0x6d,0xfb,0x51,0x02,0x39,0x53,0x2c,0x2d,0x9b,0x9c,0x01,0x11,0x01,0x16,0x01,
-0x3a,0x2b,0x2c,0x53,0x02,0x04,0xfd,0xfc,0x53,0x2c,0x2b,0x9d,0x9d,0xfe,0xea,0xfe,
-0xef,0x9c,0x9b,0x2b,0x2c,0x53,0xfd,0xc9,0x03,0xd9,0xd6,0x6d,0x6d,0x6d,0x6e,0xd5,
-0xd4,0xdc,0x6d,0x6d,0xff,0xff,0x00,0x3b,0x00,0x00,0x04,0x79,0x04,0x60,0x12,0x06,
-0x00,0x5b,0x00,0x00,0x00,0x01,0x00,0xc1,0xfe,0x56,0x05,0x40,0x04,0x60,0x00,0x0b,
-0x00,0x28,0x40,0x15,0x06,0x02,0xbc,0x0b,0xbd,0x08,0x04,0xa9,0x01,0x0d,0x00,0x08,
-0x09,0x06,0x08,0x07,0x03,0x08,0x02,0x46,0x0c,0x10,0xfc,0xec,0xd4,0xec,0xd4,0xec,
-0xcc,0x31,0x00,0x2f,0xec,0x32,0xec,0xf4,0x3c,0x30,0x29,0x01,0x11,0x33,0x11,0x21,
-0x11,0x33,0x11,0x33,0x11,0x23,0x04,0x88,0xfc,0x39,0xb8,0x02,0x57,0xb8,0xb8,0xb8,
-0x04,0x60,0xfc,0x39,0x03,0xc7,0xfc,0x39,0xfd,0xbd,0x00,0x01,0x00,0x96,0x00,0x00,
-0x04,0x00,0x04,0x60,0x00,0x11,0x00,0x22,0x40,0x11,0x02,0xa9,0x0d,0x0f,0x07,0xbc,
-0x00,0x13,0x46,0x01,0x0f,0x08,0x10,0x08,0x08,0x07,0x12,0x10,0xdc,0xec,0xd4,0xec,
-0x32,0xec,0x31,0x00,0x2f,0xe4,0x32,0xd4,0xec,0x30,0x21,0x11,0x21,0x22,0x27,0x26,
-0x3d,0x01,0x33,0x15,0x14,0x17,0x16,0x33,0x21,0x11,0x33,0x11,0x03,0x48,0xfe,0xa9,
-0x99,0x66,0x5c,0xb8,0x34,0x35,0x68,0x01,0x29,0xb8,0x02,0x09,0x5f,0x56,0xb8,0xea,
-0xd3,0x75,0x3b,0x3b,0x01,0xbe,0xfb,0xa0,0x00,0x01,0x00,0xc1,0x00,0x00,0x06,0x3a,
-0x04,0x60,0x00,0x0b,0x00,0x28,0x40,0x15,0x0a,0x02,0x06,0xbc,0x00,0x08,0xa9,0x05,
-0x0d,0x46,0x02,0x08,0x03,0x0a,0x08,0x0b,0x07,0x08,0x06,0x46,0x0c,0x10,0xfc,0xec,
-0xd4,0xfc,0xd4,0xec,0xec,0x31,0x00,0x2f,0xec,0x32,0xf4,0x3c,0xc4,0x30,0x25,0x21,
-0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x03,0xd9,0x01,0xa9,0xb8,0xfa,
-0x87,0xb8,0x01,0xa8,0xb8,0x99,0x03,0xc7,0xfb,0xa0,0x04,0x60,0xfc,0x39,0x03,0x8c,
-0x00,0x01,0x00,0xc1,0xfe,0x56,0x06,0xf2,0x04,0x60,0x00,0x0f,0x00,0x31,0x40,0x1a,
-0x06,0x0a,0x02,0xbc,0x0f,0xbd,0x0c,0x08,0x04,0xa9,0x01,0x11,0x00,0x08,0x0d,0x0a,
-0x08,0x0b,0x06,0x08,0x07,0x03,0x08,0x02,0x46,0x10,0x10,0xfc,0xec,0xd4,0xfc,0xd4,
-0xec,0xd4,0xec,0xcc,0x31,0x00,0x2f,0xec,0x32,0x32,0xec,0xf4,0x3c,0xc4,0x30,0x29,
-0x01,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x11,0x23,0x06,
-0x3a,0xfa,0x87,0xb8,0x01,0xa8,0xb8,0x01,0xa9,0xb8,0xb8,0xb8,0x04,0x60,0xfc,0x39,
-0x03,0x8c,0xfc,0x74,0x03,0xc7,0xfc,0x39,0xfd,0xbd,0x00,0x02,0x00,0x2a,0x00,0x00,
-0x05,0x2e,0x04,0x60,0x00,0x0a,0x00,0x19,0x00,0x2a,0x40,0x16,0x0c,0xa9,0x0d,0xbc,
-0x19,0x05,0xa9,0x0f,0x06,0xa9,0x19,0x1b,0x45,0x00,0x12,0x14,0x05,0x0e,0x08,0x0b,
-0x0d,0x1a,0x10,0xcc,0xdc,0xec,0x32,0xd4,0xec,0xec,0x31,0x00,0x2f,0xec,0xd4,0xec,
-0x10,0xf4,0xec,0x30,0x01,0x34,0x27,0x26,0x23,0x21,0x11,0x21,0x32,0x37,0x36,0x01,
-0x21,0x35,0x21,0x11,0x21,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x23,0x21,0x04,0x6a,
-0x3e,0x43,0x80,0xfe,0xf9,0x01,0x07,0x81,0x42,0x3e,0xfd,0x40,0xfe,0x80,0x02,0x38,
-0x01,0x0f,0xd0,0x79,0x74,0x74,0x73,0xd6,0xfe,0x39,0x01,0x4c,0x5e,0x2a,0x2e,0xfe,
-0x97,0x2e,0x2b,0x02,0xd4,0x9a,0xfe,0x3b,0x55,0x52,0xa8,0xa8,0x52,0x52,0xff,0xff,
-0x00,0xc1,0x00,0x00,0x05,0x69,0x04,0x60,0x10,0x26,0x03,0xc4,0x00,0x00,0x11,0x07,
-0x00,0xf3,0x03,0xf0,0x00,0x00,0x00,0x0d,0x40,0x06,0x1d,0x46,0x19,0x08,0x18,0x12,
-0x10,0xdc,0xfc,0xec,0x31,0x00,0x00,0x02,0x00,0xc1,0x00,0x00,0x04,0x45,0x04,0x60,
-0x00,0x0a,0x00,0x17,0x00,0x24,0x40,0x13,0x05,0xa9,0x0d,0x0b,0xbc,0x06,0xa9,0x17,
-0x19,0x45,0x00,0x12,0x12,0x05,0x0c,0x08,0x0b,0x46,0x18,0x10,0xfc,0xec,0x32,0xd4,
-0xec,0xec,0x31,0x00,0x2f,0xec,0xe4,0xd4,0xec,0x30,0x01,0x34,0x27,0x26,0x23,0x21,
-0x11,0x21,0x32,0x37,0x36,0x01,0x33,0x11,0x21,0x32,0x17,0x16,0x15,0x14,0x07,0x06,
-0x23,0x21,0x03,0x81,0x3e,0x43,0x80,0xfe,0xf9,0x01,0x07,0x81,0x42,0x3e,0xfd,0x40,
-0xb8,0x01,0x0f,0xd0,0x79,0x74,0x74,0x73,0xd6,0xfe,0x39,0x01,0x4c,0x5e,0x2a,0x2e,
-0xfe,0x97,0x2e,0x2b,0x03,0x6e,0xfe,0x3b,0x55,0x52,0xa8,0xa8,0x52,0x52,0x00,0x01,
-0x00,0x71,0xff,0xe3,0x03,0xe7,0x04,0x7b,0x00,0x1c,0x00,0x00,0x01,0x22,0x07,0x15,
-0x36,0x33,0x32,0x17,0x16,0x17,0x21,0x15,0x21,0x06,0x07,0x06,0x23,0x22,0x27,0x15,
-0x16,0x33,0x20,0x37,0x36,0x11,0x10,0x27,0x26,0x01,0xb4,0xa6,0x9d,0xa1,0x9a,0xe6,
-0x5c,0x22,0x0c,0xfe,0x34,0x01,0xd4,0x0d,0x9e,0x55,0x78,0x9d,0x9e,0x93,0xbd,0x01,
-0x0b,0x94,0x87,0x97,0x94,0x04,0x7b,0x46,0xac,0x56,0xb4,0x41,0x57,0x8f,0xf4,0x5e,
-0x33,0x56,0xaa,0x48,0xac,0x9d,0x01,0x03,0x01,0x11,0x9d,0x9e,0x00,0x02,0x00,0xc1,
-0xff,0xe3,0x06,0x10,0x04,0x7b,0x00,0x0e,0x00,0x24,0x00,0x38,0x40,0x1f,0x00,0xb9,
-0x13,0xb8,0x25,0x08,0xb9,0x1a,0x8c,0x25,0x1f,0xa9,0x24,0x22,0xbc,0x21,0x26,0x45,
-0x0b,0x12,0x16,0x04,0x12,0x1e,0x0f,0x1f,0x23,0x08,0x22,0x46,0x25,0x10,0xfc,0xec,
-0x32,0xd4,0x3c,0xec,0xd4,0xec,0xec,0x31,0x00,0x2f,0xe4,0xd4,0xec,0x10,0xf4,0xec,
-0x10,0xf4,0xec,0x30,0x01,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x36,0x35,
-0x34,0x27,0x26,0x01,0x36,0x37,0x36,0x33,0x32,0x00,0x11,0x10,0x07,0x06,0x23,0x22,
-0x27,0x26,0x27,0x23,0x11,0x23,0x11,0x33,0x11,0x04,0x0e,0x94,0x56,0x56,0x55,0x56,
-0x95,0x93,0xac,0x56,0x56,0xfd,0x71,0x13,0x70,0x89,0xf0,0xf0,0x01,0x12,0x89,0x89,
-0xf0,0xf1,0x88,0x7f,0x09,0x94,0xb8,0xb8,0x03,0xdf,0x73,0x74,0xc9,0xc9,0x74,0x73,
-0xe8,0xc8,0xc7,0x74,0x75,0xfe,0xc2,0xbe,0x80,0x9c,0xfe,0xc8,0xfe,0xec,0xfe,0xed,
-0x9c,0x9d,0x9d,0x91,0xf8,0xfd,0xf7,0x04,0x60,0xfe,0x41,0x00,0x00,0x02,0x00,0x32,
-0x00,0x00,0x04,0x0f,0x04,0x60,0x00,0x16,0x00,0x21,0x00,0x44,0x40,0x15,0x42,0x18,
-0xa9,0x07,0xbc,0x12,0x0c,0xa9,0x20,0x0a,0x12,0x23,0x46,0x0b,0x17,0x08,0x08,0x1c,
-0x12,0x03,0x22,0x10,0xd4,0xec,0xd4,0xec,0x32,0xec,0x31,0x00,0x2f,0x3c,0xd4,0xec,
-0x10,0xf4,0xec,0x30,0x4b,0x53,0x58,0x40,0x0d,0x0f,0x0e,0x0d,0x03,0x0c,0x10,0x11,
-0x13,0x11,0x11,0x12,0x13,0x12,0x05,0x07,0x10,0xec,0x10,0xec,0x11,0x17,0x39,0x59,
-0x01,0x2e,0x01,0x35,0x34,0x37,0x36,0x33,0x21,0x11,0x23,0x11,0x23,0x22,0x07,0x06,
-0x07,0x03,0x23,0x13,0x36,0x37,0x36,0x01,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,
-0x3b,0x01,0x01,0xb5,0x6a,0x70,0x6b,0x6c,0xd9,0x01,0x84,0xb9,0xa9,0x61,0x3b,0x3b,
-0x3f,0xa2,0xc3,0xae,0x35,0x34,0x35,0x01,0xd8,0xc6,0x77,0x3f,0x40,0x40,0x3f,0x77,
-0xc6,0x02,0x0d,0x1b,0x8c,0x69,0xa2,0x51,0x50,0xfb,0xa0,0x01,0xd9,0x25,0x24,0x71,
-0xfe,0xe1,0x01,0x32,0x5e,0x36,0x36,0x01,0xc9,0x2a,0x2a,0x54,0x53,0x2b,0x2b,0x00,
-0xff,0xff,0x00,0x71,0xff,0xe3,0x04,0x7f,0x06,0x6b,0x10,0x26,0x00,0x43,0x5a,0x05,
-0x12,0x06,0x03,0xad,0x00,0x00,0xff,0xff,0x00,0x71,0xff,0xe3,0x04,0x7f,0x06,0x10,
-0x10,0x27,0x00,0x6a,0x00,0x96,0x00,0x00,0x12,0x06,0x03,0xad,0x00,0x00,0x00,0x01,
-0x00,0x28,0xfe,0x56,0x04,0x6b,0x06,0x14,0x00,0x28,0x00,0x00,0x13,0x23,0x35,0x33,
-0x35,0x33,0x15,0x21,0x15,0x21,0x11,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x11,
-0x14,0x07,0x06,0x2b,0x01,0x35,0x33,0x32,0x37,0x36,0x35,0x11,0x34,0x26,0x23,0x22,
-0x07,0x06,0x15,0x11,0x23,0xc1,0x99,0x99,0xb9,0x01,0x46,0xfe,0xba,0x42,0x59,0x5a,
-0x75,0xb9,0x6b,0x63,0x52,0x51,0xb5,0x46,0x31,0x6e,0x21,0x26,0x7c,0x7c,0x9a,0x51,
-0x56,0xb9,0x05,0x04,0x7d,0x93,0x93,0x7d,0xfe,0x57,0x65,0x32,0x32,0x77,0x6e,0xf2,
-0xfd,0x9f,0xd6,0x60,0x60,0x9c,0x30,0x37,0x93,0x02,0x5b,0x9f,0x9e,0x5f,0x65,0x9e,
-0xfd,0xde,0xff,0xff,0x00,0xba,0x00,0x00,0x03,0xd8,0x06,0x6d,0x10,0x27,0x00,0x76,
-0x00,0x86,0x00,0x07,0x12,0x06,0x03,0xab,0x00,0x00,0x00,0x01,0x00,0x71,0xff,0xe3,
-0x03,0xe7,0x04,0x7b,0x00,0x1c,0x00,0x3a,0x40,0x21,0x02,0x86,0x03,0x88,0x05,0x13,
-0x86,0x12,0x88,0x10,0xb9,0x15,0x0a,0xa9,0x0b,0xbb,0x05,0xb9,0x00,0xb8,0x15,0x8c,
-0x1d,0x0a,0x0c,0x09,0x12,0x12,0x02,0x48,0x19,0x45,0x1d,0x10,0xfc,0xe4,0x32,0xfc,
-0x32,0xcc,0x31,0x00,0x10,0xe4,0xf4,0xec,0xf4,0xee,0x10,0xfe,0xf4,0xee,0x10,0xf5,
-0xee,0x30,0x01,0x32,0x17,0x15,0x26,0x23,0x22,0x07,0x06,0x07,0x21,0x15,0x21,0x16,
-0x17,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x20,0x27,0x26,0x11,0x10,0x37,0x36,0x02,
-0xa4,0xa6,0x9d,0xa1,0x9a,0xe6,0x5c,0x22,0x0c,0x01,0xcc,0xfe,0x2c,0x0d,0x9e,0x55,
-0x78,0x9d,0x9e,0x93,0xbc,0xfe,0xf3,0x94,0x86,0x97,0x95,0x04,0x7b,0x46,0xac,0x56,
-0xb4,0x41,0x57,0x8f,0xf4,0x5e,0x33,0x56,0xaa,0x48,0xad,0x9d,0x01,0x02,0x01,0x11,
-0x9d,0x9e,0xff,0xff,0x00,0x6f,0xff,0xe3,0x03,0xc7,0x04,0x7b,0x12,0x06,0x00,0x56,
-0x00,0x00,0xff,0xff,0x00,0xc1,0x00,0x00,0x01,0x79,0x06,0x14,0x12,0x06,0x00,0x4c,
-0x00,0x00,0xff,0xff,0xff,0xf4,0x00,0x00,0x02,0x46,0x06,0x10,0x12,0x26,0x00,0xf3,
-0x00,0x00,0x11,0x07,0x00,0x6a,0xff,0x1d,0x00,0x00,0x00,0x08,0xb4,0x00,0x0a,0x07,
-0x01,0x07,0x2b,0x31,0xff,0xff,0xff,0xdb,0xfe,0x56,0x01,0x79,0x06,0x14,0x12,0x06,
-0x00,0x4d,0x00,0x00,0x00,0x02,0x00,0x2e,0xff,0xe3,0x06,0xbe,0x04,0x60,0x00,0x17,
-0x00,0x22,0x00,0x00,0x01,0x21,0x15,0x10,0x03,0x06,0x05,0x35,0x36,0x37,0x36,0x11,
-0x35,0x21,0x11,0x33,0x32,0x17,0x16,0x10,0x07,0x06,0x23,0x21,0x01,0x34,0x27,0x26,
-0x2b,0x01,0x11,0x33,0x32,0x37,0x36,0x03,0x9e,0xfe,0x98,0x76,0x5e,0xfe,0xcc,0xb3,
-0x3b,0x62,0x02,0xd8,0xab,0xd0,0x79,0x74,0x74,0x73,0xd6,0xfe,0x9d,0x02,0x5c,0x3e,
-0x43,0x80,0xa3,0xa3,0x81,0x42,0x3e,0x03,0xc7,0x86,0xfe,0x92,0xfe,0xfc,0xcf,0x1d,
-0x99,0x1b,0x7f,0xcf,0x01,0xa7,0xd4,0xfe,0x3b,0x55,0x52,0xfe,0xb0,0x52,0x52,0x01,
-0x4c,0x5e,0x2a,0x2e,0xfe,0x97,0x2e,0x2b,0x00,0x02,0x00,0xc1,0x00,0x00,0x06,0xbc,
-0x04,0x60,0x00,0x0a,0x00,0x1e,0x00,0x00,0x01,0x34,0x27,0x26,0x2b,0x01,0x11,0x33,
-0x32,0x37,0x36,0x05,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,
-0x32,0x17,0x16,0x10,0x07,0x06,0x23,0x05,0xf8,0x3e,0x42,0x81,0xa3,0xa3,0x81,0x42,
-0x3e,0xfd,0xa4,0xfd,0xdd,0xb8,0xb8,0x02,0x23,0xb8,0xab,0xd0,0x79,0x74,0x74,0x73,
-0xd6,0x01,0x4c,0x5f,0x2a,0x2d,0xfe,0x97,0x2e,0x2b,0xf2,0x02,0x02,0xfd,0xfe,0x04,
-0x60,0xfe,0x3b,0x01,0xc5,0xfe,0x3b,0x55,0x52,0xfe,0xb0,0x52,0x52,0x00,0x00,0x01,
-0x00,0x28,0x00,0x00,0x04,0x6b,0x06,0x14,0x00,0x1e,0x00,0x00,0x13,0x23,0x35,0x33,
-0x35,0x33,0x15,0x21,0x15,0x21,0x11,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x11,
-0x23,0x11,0x34,0x26,0x23,0x22,0x07,0x06,0x15,0x11,0x23,0xc1,0x99,0x99,0xb9,0x01,
-0x46,0xfe,0xba,0x42,0x59,0x5a,0x75,0xbd,0x67,0x63,0xb8,0x7c,0x7c,0x98,0x53,0x56,
-0xb9,0x05,0x04,0x7d,0x93,0x93,0x7d,0xfe,0x57,0x65,0x32,0x32,0x77,0x73,0xed,0xfd,
-0xb3,0x02,0x47,0x9f,0x9e,0x5f,0x62,0xa1,0xfd,0xde,0xff,0xff,0x00,0xbf,0x00,0x00,
-0x04,0xa1,0x06,0x6d,0x10,0x27,0x00,0x76,0x00,0xe4,0x00,0x07,0x12,0x06,0x03,0xb2,
-0x00,0x00,0xff,0xff,0x00,0xc1,0x00,0x00,0x04,0x80,0x06,0x6b,0x10,0x26,0x00,0x43,
-0x64,0x05,0x12,0x06,0x03,0xb0,0x00,0x00,0xff,0xff,0x00,0x3d,0xfe,0x56,0x04,0x7f,
-0x06,0x14,0x10,0x26,0x02,0x8c,0x5e,0xcc,0x12,0x06,0x03,0xbb,0x00,0x00,0x00,0x01,
-0x00,0xc1,0xfe,0x56,0x04,0x88,0x04,0x60,0x00,0x0b,0x00,0x00,0x21,0x11,0x23,0x11,
-0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x02,0xff,0xb8,0xfe,0x7a,0xb8,0x02,0x57,
-0xb8,0xfe,0x56,0x01,0xaa,0x04,0x60,0xfc,0x3a,0x03,0xc6,0xfb,0xa0,0x00,0x00,0x01,
-0x00,0x73,0xff,0xe3,0x07,0x05,0x05,0xd5,0x00,0x34,0x00,0x00,0x01,0x16,0x33,0x32,
-0x37,0x36,0x3d,0x01,0x33,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x11,0x34,0x27,
-0x02,0x27,0x33,0x16,0x17,0x12,0x15,0x10,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x06,
-0x07,0x06,0x23,0x22,0x27,0x26,0x11,0x34,0x13,0x36,0x37,0x33,0x06,0x03,0x06,0x15,
-0x10,0x01,0x92,0x49,0x7d,0x72,0x48,0x47,0xc7,0x46,0x46,0x74,0x86,0x41,0x47,0x43,
-0x87,0x54,0xfa,0x5f,0x38,0x64,0x7b,0x7b,0xd1,0x92,0x65,0x64,0x27,0x27,0x64,0x65,
-0x92,0xd3,0x79,0x7b,0x64,0x3b,0x5d,0xf9,0x54,0x87,0x43,0x01,0x5a,0x6d,0x69,0x68,
-0xc6,0xf1,0xf1,0xc6,0x68,0x69,0x6d,0x77,0x01,0x27,0xb7,0x9f,0x01,0x41,0x46,0x82,
-0x9c,0xfe,0xe7,0xbe,0xfe,0x66,0xb2,0xb1,0x5e,0x5e,0xad,0xad,0x5e,0x5e,0xb1,0xb4,
-0x01,0x98,0xc9,0x01,0x0e,0x9f,0x7f,0x46,0xfe,0xbf,0x9f,0xb7,0xfe,0xcd,0xff,0xff,
-0x00,0x87,0xff,0xff,0x06,0x28,0x04,0x60,0x10,0x02,0x03,0x42,0x00,0x00,0xff,0xff,
-0x00,0x21,0x00,0x00,0x04,0xec,0x05,0xd5,0x10,0x02,0x04,0x03,0x00,0x00,0x00,0x02,
-0x00,0x3a,0x00,0x00,0x04,0x45,0x05,0xd5,0x00,0x13,0x00,0x1e,0x00,0x00,0x01,0x11,
-0x21,0x32,0x17,0x16,0x10,0x07,0x06,0x23,0x21,0x11,0x23,0x35,0x33,0x11,0x33,0x11,
-0x33,0x15,0x01,0x34,0x27,0x26,0x23,0x21,0x11,0x21,0x32,0x37,0x36,0x01,0x79,0x01,
-0x0f,0xd0,0x79,0x74,0x74,0x73,0xd6,0xfe,0x39,0x87,0x87,0xb8,0xaf,0x01,0x59,0x3e,
-0x43,0x80,0xfe,0xf9,0x01,0x07,0x81,0x42,0x3e,0x03,0xd1,0xfe,0xca,0x55,0x52,0xfe,
-0xb0,0x52,0x52,0x03,0xd1,0x8f,0x01,0x75,0xfe,0x8b,0x8f,0xfd,0x7b,0x5e,0x2a,0x2e,
-0xfe,0x97,0x2e,0x2b,0x00,0x01,0x00,0xd3,0xff,0xe3,0x07,0x1b,0x05,0xf0,0x00,0x2b,
-0x00,0x00,0x01,0x11,0x23,0x11,0x33,0x11,0x33,0x12,0x37,0x36,0x21,0x32,0x17,0x16,
-0x17,0x15,0x26,0x27,0x26,0x23,0x20,0x07,0x06,0x07,0x21,0x15,0x21,0x12,0x17,0x16,
-0x21,0x32,0x37,0x36,0x37,0x15,0x06,0x07,0x06,0x23,0x20,0x27,0x26,0x03,0x01,0x9d,
-0xca,0xca,0xd2,0x1e,0x9d,0xc3,0x01,0x53,0x86,0x76,0x77,0x68,0x66,0x73,0x74,0x82,
-0xff,0x00,0x88,0x67,0x19,0x02,0xb2,0xfd,0x46,0x07,0x81,0x89,0x00,0xff,0x82,0x74,
-0x73,0x66,0x6a,0x77,0x76,0x84,0xfe,0xad,0xc3,0xba,0x09,0x02,0xc7,0xfd,0x39,0x05,
-0xd5,0xfd,0x9c,0x01,0x08,0xa7,0xd0,0x24,0x23,0x47,0xd5,0x5f,0x2f,0x2f,0x9c,0x77,
-0xc6,0xaa,0xfe,0xf3,0x94,0x9d,0x2f,0x2f,0x5f,0xd3,0x48,0x24,0x24,0xcf,0xc6,0x01,
-0x4f,0x00,0x00,0x01,0x00,0xc1,0xff,0xe3,0x05,0x81,0x04,0x7b,0x00,0x23,0x00,0x00,
-0x01,0x32,0x17,0x15,0x26,0x23,0x22,0x07,0x06,0x07,0x21,0x15,0x21,0x16,0x17,0x16,
-0x33,0x32,0x37,0x15,0x06,0x23,0x20,0x27,0x26,0x27,0x23,0x11,0x23,0x11,0x33,0x11,
-0x33,0x36,0x37,0x36,0x04,0x3e,0xa6,0x9d,0xa1,0x9a,0xe6,0x5c,0x22,0x0c,0x01,0xcc,
-0xfe,0x2c,0x0d,0x9e,0x55,0x78,0x9d,0x9e,0x93,0xbc,0xfe,0xf3,0x94,0x7b,0x0a,0x93,
-0xb8,0xb8,0x98,0x17,0x7a,0x97,0x04,0x7b,0x46,0xac,0x56,0xb4,0x41,0x57,0x8f,0xf4,
-0x5e,0x33,0x56,0xaa,0x48,0xad,0x90,0xe4,0xfd,0xfc,0x04,0x60,0xfe,0x33,0xca,0x80,
-0x9e,0x00,0x00,0x02,0x00,0x10,0x00,0x00,0x06,0xf8,0x05,0xd5,0x00,0x03,0x00,0x0f,
-0x00,0x00,0x01,0x0b,0x01,0x1f,0x01,0x11,0x23,0x11,0x27,0x01,0x23,0x01,0x33,0x01,
-0x23,0x01,0x04,0x6a,0xe6,0xe7,0xe7,0x66,0xca,0xde,0xfe,0xaf,0xe1,0x03,0x02,0xe5,
-0x03,0x01,0xe1,0xfe,0xaf,0x03,0x3f,0x01,0xc0,0xfe,0x40,0x77,0xac,0xfd,0xe4,0x02,
-0x1b,0x72,0xfd,0x73,0x05,0xd5,0xfa,0x2b,0x02,0x8e,0x00,0x02,0x00,0x33,0x00,0x00,
-0x06,0x11,0x04,0x60,0x00,0x03,0x00,0x0f,0x00,0x00,0x01,0x0b,0x01,0x1f,0x01,0x11,
-0x23,0x11,0x27,0x01,0x23,0x01,0x33,0x01,0x23,0x01,0x03,0xe2,0xc0,0xc0,0xc0,0x5d,
-0xb8,0xb3,0xfe,0xe2,0xc3,0x02,0x8e,0xc3,0x02,0x8d,0xc3,0xfe,0xe2,0x02,0x70,0x01,
-0x4a,0xfe,0xb6,0x57,0x83,0xfe,0x6a,0x01,0x95,0x51,0xfe,0x1a,0x04,0x60,0xfb,0xa0,
-0x01,0xe7,0x00,0x02,0x00,0xc9,0x00,0x00,0x09,0x14,0x05,0xd5,0x00,0x03,0x00,0x17,
-0x00,0x00,0x01,0x0b,0x01,0x17,0x05,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x01,0x33,
-0x01,0x23,0x01,0x07,0x11,0x23,0x11,0x27,0x01,0x23,0x06,0x86,0xe6,0xe7,0xe7,0xfd,
-0xfb,0xfd,0xf8,0xca,0xca,0x02,0x5f,0x01,0x3c,0xe5,0x03,0x01,0xe1,0xfe,0xaf,0xdc,
-0xca,0xde,0xfe,0xaf,0xe1,0x03,0x3f,0x01,0xc0,0xfe,0x40,0x77,0x01,0xfd,0x39,0x05,
-0xd5,0xfd,0x9c,0x02,0x64,0xfa,0x2b,0x02,0x8e,0x72,0xfd,0xe4,0x02,0x1b,0x72,0xfd,
-0x73,0x00,0x00,0x02,0x00,0xc1,0x00,0x00,0x07,0xd0,0x04,0x60,0x00,0x03,0x00,0x17,
-0x00,0x00,0x01,0x0b,0x01,0x17,0x05,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x01,0x33,
-0x01,0x23,0x01,0x07,0x11,0x23,0x11,0x27,0x01,0x23,0x05,0xa1,0xc0,0xc0,0xc0,0xfe,
-0x2d,0xfe,0x6b,0xb8,0xb8,0x01,0xe9,0x01,0x1e,0xc3,0x02,0x8d,0xc3,0xfe,0xe2,0xb1,
-0xb8,0xb3,0xfe,0xe2,0xc3,0x02,0x70,0x01,0x4a,0xfe,0xb6,0x57,0x32,0xfe,0x19,0x04,
-0x60,0xfe,0x17,0x01,0xe9,0xfb,0xa0,0x01,0xe7,0x51,0xfe,0x6a,0x01,0x95,0x51,0xfe,
-0x1a,0x00,0x00,0x02,0x00,0x73,0x00,0x00,0x05,0xd9,0x05,0xd5,0x00,0x17,0x00,0x1a,
-0x00,0x00,0x01,0x11,0x23,0x11,0x06,0x07,0x06,0x11,0x23,0x10,0x37,0x36,0x37,0x01,
-0x21,0x01,0x16,0x17,0x16,0x11,0x23,0x10,0x27,0x26,0x27,0x01,0x21,0x03,0x8b,0xca,
-0x93,0x64,0x82,0xd5,0xbd,0x78,0xaa,0xfe,0x51,0x05,0x12,0xfe,0x50,0xa4,0x74,0xbc,
-0xd5,0x80,0x60,0xf8,0x01,0x3e,0xfd,0x83,0x02,0x59,0xfd,0xa7,0x02,0x59,0x1c,0x7e,
-0xa4,0xfe,0xe5,0x01,0x62,0xd2,0x86,0x31,0x02,0xea,0xfd,0x13,0x32,0x82,0xd2,0xfe,
-0x9e,0x01,0x1e,0xa1,0x7a,0xca,0x02,0x28,0x00,0x02,0x00,0x6b,0x00,0x00,0x04,0x7b,
-0x04,0x60,0x00,0x02,0x00,0x1a,0x00,0x00,0x01,0x21,0x13,0x09,0x01,0x16,0x17,0x16,
-0x11,0x23,0x34,0x27,0x26,0x27,0x11,0x23,0x11,0x06,0x07,0x06,0x15,0x23,0x10,0x37,
-0x36,0x37,0x01,0x03,0x45,0xfe,0x5d,0xd1,0x02,0x08,0xfe,0xbb,0x6b,0x4b,0x89,0xc3,
-0x56,0x3a,0x56,0xb8,0x53,0x38,0x56,0xc2,0x89,0x4a,0x6c,0xfe,0xbb,0x03,0xb6,0xfe,
-0x96,0x02,0x14,0xfd,0xcc,0x26,0x56,0x9c,0xfe,0xec,0xc7,0x74,0x4f,0x1a,0xfe,0x5c,
-0x01,0xa2,0x1a,0x4b,0x74,0xc9,0x01,0x14,0x9c,0x55,0x27,0x02,0x34,0x00,0x00,0x02,
-0x00,0xc9,0x00,0x00,0x07,0xc4,0x05,0xd5,0x00,0x1e,0x00,0x21,0x00,0x00,0x09,0x01,
-0x21,0x01,0x16,0x17,0x16,0x11,0x23,0x10,0x27,0x26,0x27,0x11,0x23,0x11,0x06,0x07,
-0x06,0x11,0x23,0x10,0x37,0x36,0x37,0x21,0x11,0x23,0x11,0x33,0x11,0x05,0x01,0x21,
-0x03,0xef,0xfe,0x9f,0x05,0x12,0xfe,0x50,0xa4,0x74,0xbc,0xd5,0x80,0x60,0x99,0xca,
-0x93,0x64,0x82,0xd5,0xbd,0x55,0x6e,0xfd,0xb5,0xca,0xca,0x03,0x84,0x01,0x3e,0xfd,
-0x83,0x03,0x71,0x02,0x64,0xfd,0x13,0x32,0x82,0xd2,0xfe,0x9e,0x01,0x1e,0xa1,0x7a,
-0x20,0xfd,0xa7,0x02,0x59,0x1c,0x7e,0xa4,0xfe,0xe5,0x01,0x62,0xd2,0x5f,0x34,0xfd,
-0x39,0x05,0xd5,0xfd,0x9c,0x6e,0x02,0x28,0x00,0x02,0x00,0xc1,0x00,0x00,0x06,0x2e,
-0x04,0x60,0x00,0x1e,0x00,0x21,0x00,0x00,0x09,0x01,0x21,0x01,0x16,0x17,0x16,0x11,
-0x23,0x34,0x27,0x26,0x27,0x11,0x23,0x11,0x06,0x07,0x06,0x15,0x23,0x10,0x37,0x36,
-0x37,0x21,0x11,0x23,0x11,0x33,0x11,0x01,0x21,0x13,0x03,0x37,0xfe,0xe7,0x04,0x10,
-0xfe,0xbb,0x6b,0x4b,0x89,0xc3,0x56,0x3a,0x56,0xb8,0x53,0x38,0x56,0xc2,0x89,0x1b,
-0x1f,0xfe,0x92,0xb8,0xb8,0x03,0x7f,0xfe,0x5d,0xd1,0x02,0x77,0x01,0xe9,0xfd,0xcc,
-0x26,0x56,0x9c,0xfe,0xec,0xc7,0x74,0x4f,0x1a,0xfe,0x5c,0x01,0xa2,0x1a,0x4b,0x74,
-0xc9,0x01,0x14,0x9c,0x1f,0x18,0xfe,0x19,0x04,0x60,0xfe,0x17,0x01,0x3f,0xfe,0x96,
-0x00,0x02,0x00,0x73,0xfe,0x56,0x04,0x73,0x07,0x6d,0x00,0x4b,0x00,0x52,0x00,0x00,
-0x05,0x32,0x17,0x16,0x17,0x15,0x26,0x27,0x26,0x23,0x20,0x27,0x26,0x35,0x34,0x37,
-0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x2b,0x01,0x35,
-0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x23,0x22,0x06,0x07,0x35,0x36,0x37,0x36,
-0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x16,0x17,0x16,0x15,0x14,0x07,0x06,
-0x23,0x22,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x13,0x03,0x33,0x17,
-0x37,0x33,0x03,0x02,0xbb,0x3c,0x5b,0x60,0x56,0x47,0x67,0x86,0x19,0xfe,0xcd,0x72,
-0xa3,0x3f,0x47,0x63,0x2e,0x84,0x49,0x64,0x5b,0x55,0x3f,0x5c,0x5b,0xa7,0xae,0xb6,
-0x95,0x4f,0x4f,0x51,0x52,0x98,0x53,0xbe,0x72,0x73,0x64,0x65,0x59,0xe6,0x86,0x86,
-0x47,0x47,0x83,0x93,0x50,0x51,0x73,0x98,0xc6,0x56,0x4c,0x55,0x2a,0x28,0x20,0x18,
-0x75,0x5e,0x12,0xd3,0x8b,0xa6,0xa6,0x8b,0xd3,0xd1,0x06,0x06,0x26,0xa7,0x29,0x08,
-0x0a,0x43,0x60,0x93,0x90,0x48,0x51,0x2d,0x19,0x5a,0x41,0x79,0x7a,0x4a,0x49,0xa6,
-0x3b,0x3c,0x70,0x73,0x3d,0x3e,0x24,0x26,0xb4,0x20,0x10,0x10,0x68,0x69,0xb2,0x7c,
-0x55,0x56,0x21,0x1f,0x60,0x62,0x86,0xd0,0x66,0x88,0x24,0x2a,0x24,0x1b,0x43,0x57,
-0x27,0x20,0x07,0x35,0x01,0x0a,0xb2,0xb2,0xfe,0xf6,0x00,0x02,0x00,0x5b,0xfe,0x74,
-0x03,0xc8,0x06,0x66,0x00,0x49,0x00,0x50,0x00,0x00,0x25,0x32,0x37,0x36,0x35,0x34,
-0x27,0x26,0x2b,0x01,0x35,0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x23,0x22,0x07,
-0x06,0x07,0x35,0x3e,0x01,0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x1e,0x01,
-0x15,0x14,0x06,0x27,0x26,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x33,
-0x32,0x17,0x16,0x17,0x15,0x26,0x27,0x26,0x23,0x20,0x27,0x26,0x35,0x34,0x37,0x36,
-0x33,0x32,0x17,0x16,0x0b,0x01,0x33,0x17,0x37,0x33,0x03,0x02,0x4b,0x57,0x3b,0x36,
-0x4e,0x48,0x89,0x94,0x9b,0x74,0x43,0x44,0x46,0x45,0x77,0x47,0x51,0x50,0x61,0x62,
-0xaa,0x4c,0xc4,0x71,0x72,0x3c,0x3c,0x70,0x7c,0x8a,0xee,0xa8,0x4e,0x3b,0x4b,0x20,
-0x24,0x19,0x13,0x62,0x6a,0x8c,0x52,0x2e,0x5d,0x3b,0x3b,0x58,0x84,0x01,0xfe,0xfe,
-0x60,0x89,0x34,0x3a,0x56,0x33,0x67,0x3e,0x3e,0xf5,0x8b,0xb4,0xb4,0x8b,0xf5,0x99,
-0x31,0x2d,0x5b,0x4c,0x38,0x33,0x98,0x2c,0x2d,0x46,0x40,0x2e,0x2e,0x0d,0x0d,0x1d,
-0xa7,0x18,0x18,0x4e,0x4f,0x8d,0x5d,0x40,0x41,0x18,0x18,0x92,0x60,0xa1,0xb6,0x05,
-0x02,0x1c,0x23,0x1e,0x17,0x4c,0x63,0x19,0x1b,0x05,0x0b,0x1a,0x8b,0x22,0x06,0x09,
-0x38,0x51,0x98,0x8d,0x3b,0x44,0x24,0x15,0x04,0x55,0x01,0x78,0xf5,0xf5,0xfe,0x88,
-0xff,0xff,0x00,0x73,0x00,0x00,0x05,0xdb,0x05,0xd5,0x12,0x02,0x03,0x21,0x00,0x00,
-0xff,0xff,0x00,0x70,0xfe,0x56,0x04,0xd1,0x04,0x60,0x12,0x02,0x03,0x41,0x00,0x00,
-0x00,0x03,0x00,0x73,0xff,0xe3,0x05,0xd9,0x05,0xf0,0x00,0x09,0x00,0x14,0x00,0x23,
-0x00,0x00,0x01,0x05,0x27,0x05,0x12,0x17,0x16,0x20,0x37,0x36,0x11,0x26,0x27,0x26,
-0x23,0x22,0x07,0x06,0x07,0x25,0x17,0x03,0x20,0x17,0x16,0x11,0x10,0x07,0x06,0x21,
-0x20,0x27,0x26,0x10,0x37,0x36,0x05,0x04,0xfe,0x68,0xe6,0xfe,0xc2,0x08,0x7a,0x81,
-0x01,0xb8,0x81,0x78,0x19,0x5f,0x81,0xdc,0xda,0x83,0x62,0x18,0x01,0x90,0xe6,0x9f,
-0x01,0x3a,0xbc,0xbc,0xbc,0xbc,0xfe,0xc6,0xfe,0xc5,0xbc,0xbd,0xbd,0xbc,0x02,0xc7,
-0x6e,0xc8,0x5a,0xfe,0xff,0x9b,0xa4,0xa4,0x98,0x01,0xae,0xbd,0x7a,0xa4,0xa4,0x7b,
-0xbc,0x6e,0xc8,0x02,0xd9,0xd2,0xd3,0xfe,0x9e,0xfe,0x9f,0xd2,0xd3,0xd2,0xd2,0x02,
-0xc4,0xd3,0xd2,0x00,0x00,0x03,0x00,0x71,0xff,0xe3,0x04,0x75,0x04,0x7b,0x00,0x0a,
-0x00,0x15,0x00,0x24,0x00,0x00,0x01,0x25,0x17,0x37,0x26,0x27,0x26,0x23,0x22,0x07,
-0x06,0x03,0x16,0x17,0x16,0x33,0x32,0x37,0x36,0x37,0x05,0x27,0x13,0x32,0x00,0x11,
-0x10,0x07,0x06,0x23,0x22,0x27,0x26,0x11,0x10,0x37,0x36,0x01,0x39,0x01,0x07,0x96,
-0xd5,0x11,0x3e,0x56,0x93,0x95,0x55,0x3f,0x16,0x08,0x4c,0x56,0x95,0x93,0x56,0x4c,
-0x09,0xfe,0xf3,0x96,0x65,0xf0,0x01,0x12,0x89,0x89,0xf0,0xf1,0x88,0x89,0x89,0x88,
-0x02,0x94,0x46,0x78,0x32,0x81,0x55,0x75,0x73,0x55,0xfe,0xed,0xad,0x65,0x73,0x74,
-0x67,0xaa,0x46,0x82,0x02,0x3b,0xfe,0xc8,0xfe,0xec,0xfe,0xed,0x9c,0x9d,0x9d,0x9c,
-0x01,0x13,0x01,0x14,0x9c,0x9c,0x00,0x01,0x00,0x10,0x00,0x00,0x06,0x27,0x05,0xf0,
-0x00,0x14,0x00,0x00,0x21,0x23,0x01,0x33,0x09,0x01,0x12,0x37,0x36,0x33,0x32,0x16,
-0x17,0x15,0x27,0x26,0x23,0x22,0x07,0x06,0x07,0x03,0x2f,0xe5,0xfd,0xc6,0xd3,0x01,
-0xd9,0x01,0x38,0x73,0x60,0x4e,0x94,0x1f,0x3e,0x21,0x44,0x16,0x19,0x49,0x22,0x47,
-0x54,0x05,0xd5,0xfb,0x17,0x03,0x3d,0x01,0x32,0x52,0x43,0x0a,0x0b,0xbb,0x0a,0x04,
-0x22,0x43,0xdd,0x00,0x00,0x01,0x00,0x32,0x00,0x00,0x05,0x1f,0x04,0x7b,0x00,0x15,
-0x00,0x00,0x01,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x15,0x27,0x26,0x23,0x22,
-0x07,0x06,0x07,0x01,0x23,0x01,0x33,0x01,0x03,0x3b,0x50,0x66,0x42,0x81,0x1a,0x1a,
-0x1b,0x1c,0x3a,0x13,0x15,0x36,0x1d,0x41,0x3d,0xfe,0xe4,0xfa,0xfe,0x5c,0xc3,0x01,
-0x5e,0x03,0x24,0xd5,0x4f,0x33,0x04,0x04,0x08,0x8d,0x07,0x03,0x19,0x37,0xa2,0xfd,
-0x0a,0x04,0x60,0xfc,0x54,0x00,0x00,0x03,0x00,0x10,0x00,0x00,0x06,0x27,0x07,0x6c,
-0x00,0x03,0x00,0x07,0x00,0x1c,0x00,0x00,0x01,0x13,0x23,0x03,0x25,0x13,0x23,0x03,
-0x13,0x23,0x01,0x33,0x09,0x01,0x12,0x37,0x36,0x33,0x32,0x16,0x17,0x15,0x27,0x26,
-0x23,0x22,0x07,0x06,0x07,0x01,0xfd,0x90,0x87,0xae,0x01,0xee,0x86,0x89,0x9d,0x89,
-0xe5,0xfd,0xc6,0xd3,0x01,0xd9,0x01,0x38,0x73,0x60,0x4e,0x94,0x1f,0x3e,0x21,0x44,
-0x16,0x19,0x49,0x22,0x47,0x54,0x07,0x6b,0xfe,0xf8,0x01,0x08,0x01,0xfe,0xf7,0x01,
-0x09,0xf8,0x94,0x05,0xd5,0xfb,0x17,0x03,0x3d,0x01,0x32,0x52,0x43,0x0a,0x0b,0xbb,
-0x0a,0x04,0x22,0x43,0xdd,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x05,0x1f,0x06,0x66,
-0x10,0x23,0x02,0xb2,0x04,0xc2,0x00,0x00,0x12,0x02,0x03,0xed,0x00,0x00,0xff,0xff,
-0x00,0x71,0xff,0xe3,0x05,0x25,0x05,0xf0,0x10,0x02,0x01,0xe4,0x00,0x00,0xff,0xff,
-0x00,0x71,0xff,0xe3,0x04,0x71,0x05,0x2f,0x10,0x02,0x01,0xe5,0x00,0x00,0x00,0x02,
-0x00,0x73,0xff,0xe3,0x07,0x2d,0x05,0xf0,0x00,0x29,0x00,0x52,0x00,0x00,0x25,0x33,
-0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x2b,0x01,0x06,0x07,0x06,0x07,0x06,0x22,0x27,
-0x26,0x27,0x26,0x27,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x3b,0x01,0x36,0x37,
-0x36,0x37,0x36,0x32,0x17,0x16,0x17,0x16,0x07,0x23,0x20,0x27,0x26,0x10,0x37,0x36,
-0x21,0x33,0x36,0x37,0x36,0x37,0x36,0x32,0x17,0x16,0x17,0x16,0x17,0x33,0x20,0x17,
-0x16,0x11,0x10,0x07,0x06,0x21,0x23,0x06,0x07,0x06,0x07,0x06,0x22,0x27,0x26,0x27,
-0x26,0x04,0x5d,0x1e,0xeb,0x72,0x80,0x80,0x72,0xeb,0x1e,0x0b,0x0f,0x16,0x1b,0x1a,
-0x3e,0x1a,0x1b,0x16,0x10,0x0a,0x2e,0xeb,0x72,0x82,0x82,0x72,0xeb,0x2e,0x0a,0x10,
-0x16,0x1b,0x1a,0x3e,0x1a,0x1b,0x16,0x10,0xfe,0x2e,0xfe,0xa1,0x98,0xbd,0xbd,0x98,
-0x01,0x5f,0x2d,0x0b,0x10,0x16,0x1b,0x1a,0x3e,0x1a,0x1f,0x12,0x10,0x0b,0x1d,0x01,
-0x5e,0x98,0xbc,0xbc,0x98,0xfe,0xa2,0x1d,0x0a,0x11,0x16,0x1b,0x1a,0x3e,0x1a,0x1f,
-0x12,0x10,0xc2,0x91,0xa4,0xf2,0xf3,0xa4,0x91,0x14,0x0e,0x15,0x0c,0x0b,0x0b,0x0c,
-0x15,0x10,0x12,0x91,0xa4,0xf3,0xf2,0xa4,0x91,0x12,0x10,0x15,0x0c,0x0b,0x0b,0x0c,
-0x15,0x10,0xa1,0xaa,0xd2,0x02,0x74,0xd3,0xaa,0x15,0x0f,0x15,0x0c,0x0b,0x0b,0x0e,
-0x13,0x11,0x13,0xaa,0xd3,0xfe,0xc6,0xfe,0xc7,0xd2,0xab,0x13,0x11,0x15,0x0c,0x0b,
-0x0b,0x0e,0x13,0x11,0x00,0x02,0x00,0x71,0xff,0xe3,0x05,0xa1,0x04,0x7b,0x00,0x26,
-0x00,0x50,0x00,0x00,0x25,0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x2b,0x01,0x06,
-0x07,0x0e,0x01,0x22,0x26,0x27,0x26,0x27,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,
-0x3b,0x01,0x36,0x37,0x3e,0x01,0x32,0x17,0x16,0x17,0x16,0x07,0x23,0x20,0x27,0x26,
-0x35,0x34,0x37,0x36,0x21,0x33,0x36,0x37,0x36,0x37,0x36,0x32,0x17,0x16,0x17,0x16,
-0x17,0x33,0x20,0x17,0x16,0x15,0x14,0x07,0x06,0x21,0x23,0x06,0x07,0x06,0x07,0x06,
-0x22,0x27,0x26,0x27,0x26,0x03,0x72,0x2d,0xa1,0x48,0x56,0x56,0x3f,0xaa,0x2d,0x07,
-0x0a,0x12,0x2c,0x34,0x2c,0x12,0x0a,0x07,0x2d,0xa3,0x47,0x56,0x55,0x48,0xa3,0x2d,
-0x07,0x0a,0x12,0x2c,0x34,0x16,0x1b,0x0d,0x09,0xc9,0x2e,0xfe,0xff,0x78,0x89,0x89,
-0x74,0x01,0x05,0x2e,0x07,0x09,0x0d,0x1b,0x16,0x34,0x16,0x1b,0x0d,0x09,0x07,0x2e,
-0x01,0x02,0x77,0x89,0x89,0x74,0xfe,0xfb,0x2e,0x07,0x09,0x0d,0x1b,0x16,0x34,0x16,
-0x1b,0x0d,0x09,0xa4,0x60,0x74,0xb7,0xa7,0x83,0x61,0x0b,0x0a,0x11,0x14,0x14,0x11,
-0x0a,0x0b,0x5f,0x74,0xb8,0xbc,0x70,0x5f,0x0b,0x0a,0x11,0x14,0x0a,0x0c,0x0f,0x0a,
-0x93,0x89,0x9c,0xee,0xe9,0xa2,0x88,0x0a,0x0a,0x0f,0x0c,0x0a,0x0a,0x0c,0x0f,0x0a,
-0x0a,0x88,0x9c,0xef,0xe8,0xa2,0x89,0x0a,0x0a,0x0f,0x0c,0x0a,0x0a,0x0c,0x0f,0x0a,
-0xff,0xff,0x00,0x73,0xff,0xe3,0x07,0x05,0x07,0xb7,0x10,0x23,0x03,0xfb,0x06,0x2c,
-0x01,0x3d,0x10,0x02,0x03,0xd8,0x00,0x00,0xff,0xff,0x00,0x87,0xff,0xff,0x06,0x28,
-0x06,0x64,0x10,0x23,0x03,0xfb,0x05,0xc4,0xff,0xea,0x10,0x02,0x03,0xd9,0x00,0x00,
-0x00,0x02,0x00,0x73,0xff,0xe3,0x07,0x05,0x07,0x33,0x00,0x0b,0x00,0x40,0x00,0x00,
-0x01,0x07,0x23,0x27,0x23,0x07,0x23,0x27,0x23,0x07,0x23,0x27,0x03,0x16,0x33,0x32,
-0x37,0x36,0x3d,0x01,0x33,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x11,0x34,0x27,
-0x02,0x27,0x33,0x16,0x17,0x12,0x15,0x10,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x06,
-0x07,0x06,0x23,0x22,0x27,0x26,0x11,0x34,0x13,0x36,0x37,0x33,0x06,0x03,0x06,0x15,
-0x10,0x05,0x7e,0x64,0x32,0x32,0xaf,0x32,0x32,0x32,0xaf,0x32,0x32,0x64,0x68,0x49,
-0x7d,0x72,0x48,0x47,0xc7,0x46,0x46,0x74,0x86,0x41,0x47,0x43,0x87,0x54,0xfa,0x5f,
-0x38,0x64,0x7b,0x7b,0xd1,0x92,0x65,0x64,0x27,0x27,0x64,0x65,0x92,0xd3,0x79,0x7b,
-0x64,0x3b,0x5d,0xf9,0x54,0x87,0x43,0x07,0x33,0xc8,0x64,0x64,0x64,0x64,0xc8,0xfa,
-0x27,0x6d,0x69,0x68,0xc6,0xf1,0xf1,0xc6,0x68,0x69,0x6d,0x77,0x01,0x27,0xb7,0x9f,
-0x01,0x41,0x46,0x82,0x9c,0xfe,0xe7,0xbe,0xfe,0x66,0xb2,0xb1,0x5e,0x5e,0xad,0xad,
-0x5e,0x5e,0xb1,0xb4,0x01,0x98,0xc9,0x01,0x0e,0x9f,0x7f,0x46,0xfe,0xbf,0x9f,0xb7,
-0xfe,0xcd,0x00,0x02,0x00,0x87,0xff,0xff,0x06,0x28,0x05,0xe0,0x00,0x0b,0x00,0x26,
-0x00,0x00,0x01,0x07,0x23,0x27,0x23,0x07,0x23,0x27,0x23,0x07,0x23,0x27,0x13,0x20,
-0x11,0x34,0x13,0x33,0x02,0x15,0x02,0x17,0x16,0x03,0x33,0x02,0x37,0x36,0x11,0x34,
-0x03,0x33,0x12,0x15,0x12,0x25,0x24,0x03,0x02,0x05,0x1b,0x64,0x32,0x32,0xaf,0x32,
-0x32,0x32,0xaf,0x32,0x32,0x64,0x8f,0xfe,0x61,0x87,0xda,0x8f,0x01,0xdf,0xd0,0x05,
-0xaa,0x03,0xce,0xde,0x8f,0xda,0x87,0x01,0xfe,0x60,0xfe,0xed,0x1e,0x23,0x05,0xe0,
-0xc8,0x64,0x64,0x64,0x64,0xc8,0xfa,0x20,0x02,0x35,0xeb,0x01,0x40,0xfe,0xc0,0xf0,
-0xfe,0x97,0x01,0x01,0x01,0xd4,0xfe,0x2b,0x02,0x02,0x01,0x68,0xf0,0x01,0x40,0xfe,
-0xc0,0xeb,0xfd,0xca,0x01,0x01,0x01,0x0d,0xfe,0xf2,0x00,0x01,0x00,0x73,0xfe,0x56,
-0x05,0x27,0x05,0xf0,0x00,0x19,0x00,0x00,0x21,0x23,0x20,0x27,0x26,0x11,0x10,0x00,
-0x21,0x32,0x16,0x17,0x15,0x2e,0x01,0x23,0x20,0x00,0x11,0x10,0x17,0x16,0x33,0x21,
-0x11,0x23,0x03,0xfa,0xae,0xfe,0xa5,0xbb,0xc3,0x01,0x86,0x01,0x53,0x86,0xed,0x68,
-0x66,0xe7,0x82,0xff,0x00,0xfe,0xf0,0x88,0x98,0xf0,0x01,0x6b,0xc9,0xc6,0xd0,0x01,
-0x53,0x01,0x68,0x01,0x9f,0x47,0x47,0xd5,0x5f,0x5e,0xfe,0xc7,0xfe,0xd8,0xfe,0xd3,
-0x82,0x94,0xfd,0xb0,0x00,0x01,0x00,0x71,0xfe,0x56,0x03,0xe7,0x04,0x7b,0x00,0x18,
-0x00,0x00,0x21,0x20,0x27,0x26,0x35,0x10,0x00,0x21,0x32,0x16,0x17,0x15,0x2e,0x01,
-0x23,0x22,0x06,0x15,0x14,0x16,0x3b,0x01,0x11,0x23,0x11,0x02,0x98,0xfe,0xfb,0x8d,
-0x95,0x01,0x2d,0x01,0x06,0x55,0xa2,0x4c,0x4e,0x9d,0x50,0xb3,0xc6,0xc6,0xb3,0xf5,
-0xc9,0x96,0x9f,0xfa,0x01,0x12,0x01,0x3a,0x23,0x23,0xac,0x2b,0x2b,0xe3,0xcd,0xb9,
-0xe3,0xfd,0xc3,0x01,0xaa,0x00,0x00,0x01,0x00,0x32,0x00,0x34,0x04,0x8e,0x05,0xbc,
-0x00,0x1b,0x00,0x00,0x01,0x37,0x27,0x37,0x17,0x37,0x17,0x07,0x17,0x07,0x27,0x07,
-0x17,0x07,0x27,0x07,0x17,0x07,0x27,0x07,0x27,0x37,0x27,0x37,0x17,0x37,0x27,0x37,
-0x02,0x3b,0x69,0xd8,0x64,0xd8,0x7d,0xae,0x7d,0xd8,0x64,0xd8,0x69,0xd8,0x64,0xd8,
-0x69,0xd8,0x64,0xd8,0x7d,0xae,0x7d,0xd8,0x64,0xd8,0x69,0xd8,0x64,0x03,0x81,0xb5,
-0x7d,0xae,0x7d,0xd8,0x64,0xd8,0x7d,0xae,0x7d,0xb5,0x7d,0xae,0x7d,0xb5,0x7d,0xae,
-0x7d,0xd8,0x64,0xd8,0x7d,0xae,0x7d,0xb5,0x7d,0xae,0x00,0x01,0xfb,0xda,0x04,0xde,
-0xff,0x42,0x06,0x7a,0x00,0x2f,0x00,0x00,0x01,0x21,0x14,0x07,0x06,0x07,0x06,0x07,
-0x06,0x22,0x27,0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x37,0x36,
-0x33,0x21,0x34,0x37,0x36,0x37,0x36,0x37,0x36,0x32,0x17,0x16,0x17,0x16,0x17,0x16,
-0x15,0x14,0x07,0x06,0x07,0x06,0x07,0x06,0xfe,0xb9,0xfe,0x33,0x0a,0x0b,0x13,0x14,
-0x19,0x18,0x38,0x18,0x19,0x14,0x13,0x0b,0x0a,0x0a,0x0b,0x13,0x14,0x19,0x18,0x1c,
-0x01,0xcd,0x0a,0x0b,0x13,0x14,0x19,0x18,0x38,0x18,0x19,0x14,0x14,0x0a,0x0a,0x0a,
-0x0b,0x13,0x14,0x19,0x18,0x05,0x67,0x1b,0x19,0x1b,0x12,0x13,0x0b,0x0a,0x0a,0x0b,
-0x13,0x12,0x1b,0x19,0x1b,0x1c,0x19,0x1b,0x12,0x13,0x0b,0x0a,0x1b,0x19,0x1b,0x12,
-0x13,0x0b,0x0a,0x0a,0x0b,0x13,0x15,0x18,0x19,0x1c,0x1b,0x19,0x1b,0x12,0x13,0x0b,
-0x0a,0x00,0x00,0x01,0xfb,0xf7,0x05,0x29,0xfe,0xf9,0x06,0x4d,0x00,0x11,0x00,0x00,
-0x01,0x36,0x33,0x32,0x17,0x16,0x17,0x33,0x26,0x27,0x26,0x23,0x22,0x07,0x06,0x07,
-0x15,0x36,0xfd,0x12,0x5d,0x5b,0x46,0x38,0x30,0x0b,0x76,0x0a,0x4f,0x56,0x8a,0x7c,
-0x78,0x48,0x8d,0x8a,0x05,0x95,0x2f,0x2a,0x24,0x4d,0x8f,0x48,0x4d,0x43,0x29,0x28,
-0x86,0x17,0x00,0x01,0xfc,0x22,0x04,0xe3,0xfe,0xf8,0x06,0x75,0x00,0x07,0x00,0x00,
-0x01,0x15,0x21,0x15,0x23,0x11,0x33,0x15,0xfe,0xf8,0xfd,0xc0,0x96,0x96,0x05,0xf7,
-0x96,0x7e,0x01,0x92,0x7e,0x00,0x00,0x01,0xfc,0x22,0x04,0xe3,0xfe,0xf8,0x06,0x75,
-0x00,0x07,0x00,0x00,0x01,0x21,0x35,0x33,0x11,0x23,0x35,0x21,0xfc,0x22,0x02,0x40,
-0x96,0x96,0xfd,0xc0,0x05,0xf7,0x7e,0xfe,0x6e,0x7e,0xff,0xff,0xf7,0xd6,0xfe,0x90,
-0x03,0x46,0x07,0x60,0x10,0x2b,0x02,0x8c,0xff,0x8e,0x04,0xd8,0xc0,0x00,0x10,0x2b,
-0x02,0x8c,0xfb,0x0f,0x08,0xb1,0xc0,0x00,0x10,0x2b,0x02,0x8c,0x04,0x0d,0x08,0xb1,
-0xc0,0x00,0x10,0x2b,0x02,0x8c,0xfc,0x60,0x05,0xf9,0xc0,0x00,0x10,0x2b,0x02,0x8c,
-0x02,0xbc,0x05,0xf9,0xc0,0x00,0x10,0x2b,0x02,0x8c,0xfc,0x60,0x0b,0x69,0xc0,0x00,
-0x10,0x2b,0x02,0x8c,0x02,0xbc,0x0b,0x69,0xc0,0x00,0x10,0x0b,0x02,0x8c,0xff,0x8e,
-0x0c,0x89,0xc0,0x00,0x00,0x08,0xf8,0x58,0xfd,0xc3,0x02,0xc2,0x08,0x2d,0x00,0x05,
-0x00,0x0b,0x00,0x11,0x00,0x17,0x00,0x1d,0x00,0x23,0x00,0x29,0x00,0x2f,0x00,0x00,
-0x27,0x37,0x17,0x13,0x07,0x03,0x01,0x07,0x27,0x03,0x37,0x13,0x01,0x27,0x37,0x25,
-0x17,0x05,0x01,0x17,0x07,0x05,0x27,0x25,0x01,0x35,0x33,0x05,0x15,0x2d,0x01,0x15,
-0x23,0x25,0x35,0x05,0x01,0x23,0x35,0x13,0x33,0x0b,0x01,0x33,0x15,0x03,0x23,0x13,
-0x6b,0x96,0x79,0x6f,0x5c,0xa9,0xfb,0x77,0x96,0x79,0x6f,0x5c,0xa9,0x05,0x1f,0x96,
-0x7a,0x01,0x56,0x5c,0xfe,0xe3,0xfa,0x4c,0x95,0x79,0xfe,0xa9,0x5b,0x01,0x1c,0x06,
-0x60,0xac,0x01,0x40,0xfe,0xc0,0xf8,0xc2,0xac,0xfe,0xc0,0x01,0x40,0x04,0x5f,0xd3,
-0xa4,0x81,0x52,0xd3,0xd3,0xa4,0x81,0x52,0x5a,0x96,0x79,0xfe,0xa9,0x5c,0x01,0x1d,
-0x05,0xb5,0x96,0x79,0x01,0x57,0x5c,0xfe,0xe3,0xfe,0xf1,0x95,0x7a,0x6e,0x5b,0xa9,
-0xfb,0x77,0x96,0x79,0x6f,0x5c,0xa8,0x02,0x18,0xd4,0xa4,0x82,0x52,0xd4,0xd4,0xa4,
-0x82,0x52,0x02,0xdf,0xac,0x01,0x40,0xfe,0xc0,0xf8,0xc2,0xac,0xfe,0xc0,0x01,0x40,
-0x00,0x02,0x00,0xc9,0xfe,0x56,0x05,0xfc,0x07,0x6d,0x00,0x0e,0x00,0x1c,0x00,0x00,
-0x21,0x23,0x11,0x01,0x21,0x11,0x33,0x11,0x01,0x21,0x11,0x33,0x15,0x01,0x23,0x01,
-0x33,0x1e,0x01,0x33,0x32,0x36,0x37,0x33,0x0e,0x01,0x23,0x22,0x26,0x05,0x33,0xc4,
-0xfd,0x6a,0xfe,0xf0,0xc4,0x02,0x96,0x01,0x10,0xc9,0xfe,0x92,0x86,0xfd,0xb4,0x76,
-0x0d,0x63,0x53,0x52,0x61,0x10,0x76,0x0a,0xa0,0x8f,0x90,0x9f,0x04,0xe1,0xfb,0x1f,
-0x05,0xd5,0xfb,0x1f,0x04,0xe1,0xfa,0xd5,0xaa,0xfe,0x56,0x09,0x17,0x36,0x39,0x37,
-0x38,0x77,0x7b,0x7a,0x00,0x02,0x00,0xc1,0xfe,0x56,0x05,0x38,0x06,0x14,0x00,0x0e,
-0x00,0x1c,0x00,0x00,0x21,0x23,0x11,0x01,0x23,0x11,0x33,0x11,0x01,0x33,0x11,0x33,
-0x15,0x01,0x23,0x01,0x33,0x1e,0x01,0x33,0x32,0x36,0x37,0x33,0x0e,0x01,0x23,0x22,
-0x26,0x04,0x80,0xb7,0xfd,0xe4,0xec,0xb7,0x02,0x1b,0xed,0xb8,0xfe,0xde,0x7b,0xfd,
-0xcd,0x76,0x0a,0x62,0x56,0x56,0x60,0x0e,0x76,0x0a,0x9e,0x92,0x90,0x9e,0x03,0x83,
-0xfc,0x7d,0x04,0x60,0xfc,0x7f,0x03,0x81,0xfc,0x39,0x99,0xfe,0x56,0x07,0xbe,0x4b,
-0x4b,0x4a,0x4c,0x8f,0x90,0x90,0x00,0x02,0x00,0x21,0x00,0x00,0x04,0xec,0x05,0xd5,
-0x00,0x12,0x00,0x1d,0x00,0x00,0x01,0x15,0x21,0x32,0x04,0x15,0x14,0x04,0x23,0x21,
-0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x01,0x34,0x27,0x26,0x23,0x21,0x11,
-0x21,0x32,0x37,0x36,0x01,0x93,0x01,0x4e,0xfb,0x01,0x10,0xfe,0xf0,0xfb,0xfd,0xe8,
-0xa8,0xa8,0xca,0xa8,0x01,0xdc,0x4f,0x4e,0xa3,0xfe,0xbc,0x01,0x44,0xa3,0x4e,0x4f,
-0x04,0x51,0xe2,0xda,0xde,0xdd,0xda,0x04,0x51,0xa4,0xe0,0xe0,0xa4,0xfd,0x66,0x8b,
-0x44,0x43,0xfd,0xdd,0x44,0x43,0x00,0x02,0x00,0x26,0x00,0x00,0x04,0x45,0x05,0x9e,
-0x00,0x0a,0x00,0x1e,0x00,0x00,0x01,0x34,0x27,0x26,0x23,0x21,0x11,0x21,0x32,0x37,
-0x36,0x01,0x11,0x21,0x32,0x17,0x16,0x10,0x07,0x06,0x23,0x21,0x11,0x23,0x35,0x33,
-0x11,0x33,0x11,0x33,0x15,0x03,0x81,0x3e,0x43,0x80,0xfe,0xf9,0x01,0x07,0x81,0x42,
-0x3e,0xfd,0xf8,0x01,0x0f,0xd0,0x79,0x74,0x74,0x73,0xd6,0xfe,0x39,0x9b,0x9b,0xb8,
-0x9d,0x01,0x4c,0x5e,0x2a,0x2e,0xfe,0x97,0x2e,0x2b,0x02,0xdf,0xfe,0xca,0x55,0x52,
-0xfe,0xb0,0x52,0x52,0x03,0xd1,0x8f,0x01,0x3e,0xfe,0xc2,0x8f,0x00,0x02,0x00,0xc9,
-0x00,0x00,0x04,0xe1,0x05,0xd5,0x00,0x0e,0x00,0x1b,0x00,0x00,0x01,0x17,0x07,0x27,
-0x06,0x2b,0x01,0x11,0x23,0x11,0x21,0x32,0x04,0x15,0x14,0x27,0x36,0x37,0x34,0x26,
-0x2b,0x01,0x11,0x33,0x32,0x37,0x27,0x37,0x04,0x55,0x8c,0x6a,0x92,0x7e,0xd6,0xfe,
-0xca,0x01,0xc8,0xfb,0x01,0x01,0xe2,0x0c,0x01,0x9a,0x8d,0xfe,0xfe,0x72,0x47,0xd7,
-0x6a,0x03,0x23,0x75,0x7e,0x7b,0x53,0xfd,0xa8,0x05,0xd5,0xe3,0xdb,0x92,0x2d,0x2c,
-0x39,0x86,0x92,0xfd,0xcf,0x2f,0xb4,0x7e,0x00,0x02,0x00,0xba,0xfe,0x56,0x04,0xa4,
-0x04,0x7b,0x00,0x0d,0x00,0x23,0x00,0x00,0x25,0x27,0x37,0x17,0x36,0x35,0x34,0x26,
-0x20,0x06,0x10,0x16,0x33,0x32,0x05,0x17,0x07,0x27,0x06,0x23,0x22,0x26,0x27,0x11,
-0x23,0x11,0x33,0x15,0x3e,0x01,0x33,0x32,0x00,0x10,0x07,0x06,0x03,0x2a,0x8c,0x6e,
-0x8a,0x4f,0xa7,0xfe,0xdc,0xa7,0xa7,0x92,0x46,0x01,0x1b,0x93,0x6f,0x95,0x57,0x6c,
-0x7b,0xb1,0x3a,0xb9,0xb9,0x3a,0xb1,0x7b,0xcc,0x00,0xff,0x80,0x0c,0x98,0xa7,0x5d,
-0xa5,0x73,0xc5,0xcb,0xe7,0xe7,0xfe,0x6a,0xe7,0x14,0xae,0x5d,0xb3,0x2e,0x61,0x64,
-0xfd,0xae,0x06,0x0a,0xaa,0x64,0x61,0xfe,0xbc,0xfd,0xf0,0xa2,0x0f,0x00,0x00,0x01,
-0x00,0xc9,0x00,0x00,0x04,0x6a,0x07,0x07,0x00,0x07,0x00,0x1b,0x40,0x0d,0x03,0x06,
-0x95,0x01,0x81,0x00,0x03,0x04,0x06,0x1c,0x01,0x04,0x08,0x10,0xfc,0xfc,0xdc,0xcc,
-0x31,0x00,0x2f,0xf4,0xec,0xcc,0x30,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0xc9,
-0x02,0xd8,0xc9,0xfd,0x29,0x05,0xd5,0x01,0x32,0xfe,0x24,0xfa,0xd5,0x00,0x00,0x01,
-0x00,0xba,0x00,0x00,0x03,0xd0,0x05,0x9a,0x00,0x07,0x00,0x1b,0x40,0x0d,0x03,0x06,
-0xa9,0x01,0xbc,0x00,0x03,0x04,0x06,0x08,0x01,0x46,0x08,0x10,0xfc,0xfc,0xdc,0xcc,
-0x31,0x00,0x2f,0xf4,0xec,0xcc,0x30,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0xba,
-0x02,0x5e,0xb8,0xfd,0xa2,0x04,0x60,0x01,0x3a,0xfe,0x1c,0xfc,0x4a,0x00,0x00,0x01,
-0x00,0x47,0x00,0x00,0x04,0x6a,0x05,0xd5,0x00,0x0d,0x00,0x00,0x13,0x33,0x11,0x21,
-0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x23,0x11,0x23,0x47,0x82,0x03,0xa1,0xfd,0x29,
-0x02,0x23,0xfd,0xdd,0xca,0x82,0x03,0xe8,0x01,0xed,0xaa,0xfe,0xbd,0xaa,0xfc,0xc2,
-0x03,0x3e,0x00,0x01,0x00,0x38,0x00,0x00,0x03,0xd0,0x04,0x60,0x00,0x0d,0x00,0x00,
-0x33,0x11,0x23,0x35,0x33,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0xba,0x82,
-0x82,0x03,0x16,0xfd,0xa2,0x01,0xa0,0xfe,0x60,0x01,0xf4,0xaa,0x01,0xc2,0xaa,0xfe,
-0xe8,0xaa,0xfe,0x0c,0x00,0x01,0x00,0xc9,0xfe,0x66,0x04,0xcc,0x05,0xd5,0x00,0x1b,
-0x00,0x00,0x01,0x11,0x23,0x11,0x21,0x15,0x21,0x11,0x21,0x32,0x17,0x16,0x15,0x11,
-0x10,0x06,0x2b,0x01,0x35,0x33,0x32,0x37,0x36,0x35,0x11,0x34,0x26,0x23,0x01,0x93,
-0xca,0x03,0xa1,0xfd,0x29,0x01,0xa1,0xba,0x71,0x6d,0xcc,0xe4,0x4c,0x3e,0x86,0x38,
-0x37,0x7c,0x7c,0x02,0xc7,0xfd,0x39,0x05,0xd5,0xaa,0xfe,0x46,0x77,0x72,0xee,0xfe,
-0xce,0xfe,0xf2,0xf4,0xaa,0x4b,0x4b,0xc2,0x01,0x22,0x9f,0x9e,0x00,0x01,0x00,0xba,
-0xfe,0x56,0x04,0x0b,0x04,0x60,0x00,0x1d,0x00,0x00,0x01,0x11,0x23,0x11,0x21,0x15,
-0x21,0x11,0x33,0x20,0x17,0x16,0x15,0x11,0x14,0x07,0x06,0x2b,0x01,0x35,0x33,0x32,
-0x37,0x36,0x35,0x11,0x34,0x27,0x26,0x23,0x01,0x72,0xb8,0x03,0x16,0xfd,0xa2,0xfa,
-0x01,0x07,0x46,0x52,0x52,0x51,0xb5,0xc1,0xac,0x6e,0x21,0x26,0x26,0x31,0x86,0x01,
-0xe7,0xfe,0x19,0x04,0x60,0xaa,0xfe,0xc1,0x47,0x51,0xe5,0xfe,0xf2,0xd6,0x60,0x60,
-0x9c,0x30,0x37,0x93,0x01,0x08,0xaa,0x20,0x29,0x00,0x00,0x01,0x00,0x3b,0xfe,0x56,
-0x06,0xc2,0x05,0xd5,0x00,0x19,0x00,0x00,0x25,0x33,0x11,0x23,0x11,0x23,0x01,0x23,
-0x11,0x23,0x11,0x23,0x01,0x23,0x09,0x01,0x33,0x01,0x33,0x11,0x33,0x11,0x33,0x01,
-0x33,0x01,0x06,0x57,0x6b,0xc5,0x29,0xfe,0x9b,0x96,0xca,0x96,0xfe,0x9b,0xd9,0x01,
-0x90,0xfe,0xa2,0xd9,0x01,0x34,0x95,0xca,0x95,0x01,0x34,0xd9,0xfe,0xa2,0xaa,0xfd,
-0xac,0x01,0xaa,0x02,0xc7,0xfd,0x39,0x02,0xc7,0xfd,0x39,0x03,0x1c,0x02,0xb9,0xfd,
-0x9c,0x02,0x64,0xfd,0x9c,0x02,0x64,0xfd,0x47,0x00,0x00,0x01,0x00,0x32,0xfe,0x56,
-0x05,0xc1,0x04,0x60,0x00,0x19,0x00,0x00,0x25,0x33,0x11,0x23,0x11,0x23,0x01,0x23,
-0x11,0x23,0x11,0x23,0x01,0x23,0x09,0x01,0x33,0x01,0x33,0x11,0x33,0x11,0x33,0x01,
-0x33,0x01,0x05,0x55,0x6c,0xb8,0x21,0xfe,0xd5,0x72,0xb7,0x72,0xfe,0xd5,0xc5,0x01,
-0x54,0xfe,0xd7,0xc4,0x01,0x02,0x71,0xb7,0x71,0x01,0x02,0xc4,0xfe,0xd7,0x99,0xfd,
-0xbd,0x01,0xaa,0x02,0x09,0xfd,0xf7,0x02,0x09,0xfd,0xf7,0x02,0x55,0x02,0x0b,0xfe,
-0x41,0x01,0xbf,0xfe,0x41,0x01,0xbf,0xfd,0xf5,0x00,0xff,0xff,0x00,0x9c,0xfe,0x75,
-0x04,0x73,0x05,0xf0,0x10,0x26,0x00,0x7a,0x39,0x00,0x10,0x06,0x03,0x8f,0x00,0x00,
-0xff,0xff,0x00,0x85,0xfe,0x75,0x03,0xc8,0x04,0x7c,0x10,0x26,0x00,0x7a,0xce,0x00,
-0x10,0x06,0x03,0xaf,0x00,0x00,0x00,0x01,0x00,0xc9,0xfe,0x56,0x05,0x6a,0x05,0xd5,
-0x00,0x0e,0x00,0x00,0x25,0x33,0x11,0x23,0x11,0x23,0x01,0x11,0x23,0x11,0x33,0x11,
-0x01,0x21,0x01,0x04,0xc1,0xa9,0xc5,0x45,0xfd,0x33,0xca,0xca,0x02,0x9e,0x01,0x04,
-0xfd,0x1b,0xaa,0xfd,0xac,0x01,0xaa,0x02,0xcf,0xfd,0x31,0x05,0xd5,0xfd,0x89,0x02,
-0x77,0xfd,0x48,0x00,0x00,0x01,0x00,0xbf,0xfe,0x56,0x04,0xa1,0x04,0x60,0x00,0x0e,
-0x00,0x00,0x25,0x33,0x11,0x23,0x11,0x23,0x01,0x11,0x23,0x11,0x33,0x11,0x01,0x33,
-0x01,0x04,0x02,0x9f,0xb8,0x38,0xfd,0xc7,0xb9,0xb9,0x02,0x25,0xeb,0xfd,0xae,0x99,
-0xfd,0xbd,0x01,0xaa,0x02,0x23,0xfd,0xdd,0x04,0x60,0xfe,0x1d,0x01,0xe3,0xfd,0xf4,
-0x00,0x01,0x00,0xc9,0x00,0x00,0x05,0x6a,0x05,0xd5,0x00,0x12,0x00,0x00,0x01,0x27,
-0x11,0x23,0x11,0x33,0x11,0x37,0x11,0x33,0x15,0x01,0x21,0x09,0x01,0x21,0x01,0x15,
-0x23,0x01,0xe0,0x4d,0xca,0xca,0x4d,0x64,0x01,0xed,0x01,0x04,0xfd,0x1b,0x03,0x1a,
-0xfe,0xf6,0xfd,0xe4,0x64,0x02,0x82,0x4d,0xfd,0x31,0x05,0xd5,0xfd,0x89,0x49,0x01,
-0x51,0xf3,0x01,0xd0,0xfd,0x48,0xfc,0xe3,0x02,0x1e,0xf8,0x00,0x00,0x01,0x00,0xbf,
-0x00,0x00,0x04,0xa1,0x04,0x60,0x00,0x12,0x00,0x00,0x01,0x15,0x23,0x35,0x27,0x11,
-0x23,0x11,0x33,0x11,0x37,0x35,0x37,0x15,0x01,0x33,0x09,0x01,0x23,0x02,0x1d,0x65,
-0x40,0xb9,0xb9,0x40,0x65,0x01,0x80,0xeb,0xfd,0xae,0x02,0x6b,0xf0,0x01,0x84,0x8a,
-0xeb,0x3e,0xfd,0xdd,0x04,0x60,0xfe,0x1d,0x38,0xd9,0x02,0x82,0x01,0x52,0xfd,0xf4,
-0xfd,0xac,0x00,0x01,0x00,0x21,0x00,0x00,0x05,0x6a,0x05,0xd5,0x00,0x12,0x00,0x00,
-0x13,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x01,0x21,0x09,0x01,0x21,
-0x01,0x11,0x23,0xc9,0xa8,0xa8,0xca,0xa8,0xa8,0x02,0x9e,0x01,0x04,0xfd,0x1b,0x03,
-0x1a,0xfe,0xf6,0xfd,0x33,0xca,0x04,0x51,0xa4,0xe0,0xe0,0xa4,0xf3,0x02,0x77,0xfd,
-0x48,0xfc,0xe3,0x02,0xcf,0xfd,0x31,0x00,0x00,0x01,0x00,0x3d,0x00,0x00,0x04,0x9c,
-0x06,0x14,0x00,0x12,0x00,0x00,0x01,0x11,0x01,0x33,0x09,0x01,0x23,0x01,0x11,0x23,
-0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x21,0x15,0x01,0x73,0x02,0x25,0xeb,0xfd,0xae,
-0x02,0x6b,0xf0,0xfd,0xc7,0xb9,0x7d,0x7d,0xb9,0x01,0x60,0x04,0xf6,0xfd,0x87,0x01,
-0xe3,0xfd,0xf4,0xfd,0xac,0x02,0x23,0xfd,0xdd,0x04,0xf6,0xa4,0x7a,0x7a,0xa4,0x00,
-0x00,0x01,0x00,0x32,0x00,0x00,0x06,0x96,0x05,0xd5,0x00,0x0c,0x00,0x00,0x01,0x21,
-0x35,0x21,0x11,0x01,0x21,0x09,0x01,0x21,0x01,0x11,0x23,0x01,0xf5,0xfe,0x3d,0x02,
-0x8d,0x02,0x9e,0x01,0x04,0xfd,0x1b,0x03,0x1a,0xfe,0xf6,0xfd,0x33,0xca,0x05,0x2b,
-0xaa,0xfd,0x89,0x02,0x77,0xfd,0x48,0xfc,0xe3,0x02,0xcf,0xfd,0x31,0x00,0x00,0x01,
-0x00,0x2a,0x00,0x00,0x05,0x8b,0x04,0x60,0x00,0x0c,0x00,0x00,0x01,0x21,0x35,0x21,
-0x11,0x01,0x33,0x09,0x01,0x23,0x01,0x11,0x23,0x01,0xa9,0xfe,0x81,0x02,0x38,0x02,
-0x25,0xeb,0xfd,0xae,0x02,0x6b,0xf0,0xfd,0xc7,0xb9,0x03,0xc6,0x9a,0xfe,0x1d,0x01,
-0xe3,0xfd,0xf4,0xfd,0xac,0x02,0x23,0xfd,0xdd,0x00,0x00,0x01,0x00,0xc9,0xfe,0x56,
-0x06,0x04,0x05,0xd5,0x00,0x0f,0x00,0x00,0x21,0x11,0x21,0x11,0x23,0x11,0x33,0x11,
-0x21,0x11,0x33,0x11,0x33,0x11,0x23,0x11,0x04,0x71,0xfd,0x22,0xca,0xca,0x02,0xde,
-0xca,0xc9,0xc9,0x02,0xc7,0xfd,0x39,0x05,0xd5,0xfd,0x9c,0x02,0x64,0xfa,0xd5,0xfd,
-0xac,0x01,0xaa,0x00,0x00,0x01,0x00,0xc1,0xfe,0x56,0x05,0x40,0x04,0x60,0x00,0x0f,
-0x00,0x00,0x25,0x33,0x11,0x23,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,
-0x11,0x33,0x04,0x88,0xb8,0xb8,0xb8,0xfd,0xa9,0xb8,0xb8,0x02,0x57,0xb8,0x99,0xfd,
-0xbd,0x01,0xaa,0x02,0x04,0xfd,0xfc,0x04,0x60,0xfe,0x33,0x01,0xcd,0x00,0x00,0x01,
-0x00,0xc9,0x00,0x00,0x08,0x12,0x05,0xd5,0x00,0x0d,0x00,0x00,0x01,0x11,0x23,0x11,
-0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x21,0x15,0x05,0x3b,0xca,0xfd,0x22,0xca,
-0xca,0x02,0xde,0x03,0xa1,0x05,0x2b,0xfa,0xd5,0x02,0xc7,0xfd,0x39,0x05,0xd5,0xfd,
-0x9c,0x02,0x64,0xaa,0x00,0x01,0x00,0xc1,0x00,0x00,0x06,0xe6,0x04,0x60,0x00,0x0d,
-0x00,0x00,0x01,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x21,0x15,
-0x04,0x88,0xb8,0xfd,0xa9,0xb8,0xb8,0x02,0x57,0x03,0x16,0x03,0xb6,0xfc,0x4a,0x02,
-0x04,0xfd,0xfc,0x04,0x60,0xfe,0x33,0x01,0xcd,0xaa,0x00,0x01,0x00,0xc9,0xfe,0x66,
-0x08,0x74,0x05,0xd5,0x00,0x1d,0x00,0x00,0x01,0x11,0x23,0x11,0x21,0x11,0x23,0x11,
-0x21,0x11,0x21,0x32,0x17,0x16,0x15,0x11,0x10,0x06,0x2b,0x01,0x35,0x33,0x32,0x37,
-0x36,0x35,0x11,0x34,0x26,0x23,0x05,0x3b,0xca,0xfd,0x22,0xca,0x04,0x72,0x01,0xa1,
-0xba,0x71,0x6d,0xcc,0xe4,0x4c,0x3e,0x86,0x38,0x37,0x7c,0x7c,0x02,0xc7,0xfd,0x39,
-0x05,0x2b,0xfa,0xd5,0x05,0xd5,0xfd,0x9c,0x77,0x72,0xee,0xfe,0xce,0xfe,0xf2,0xf4,
-0xaa,0x4b,0x4b,0xc2,0x01,0x22,0x9f,0x9e,0x00,0x01,0x00,0xc1,0xfe,0x56,0x07,0x21,
-0x04,0x60,0x00,0x1f,0x00,0x00,0x01,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x21,0x11,
-0x33,0x20,0x17,0x16,0x15,0x11,0x14,0x07,0x06,0x2b,0x01,0x35,0x33,0x32,0x37,0x36,
-0x35,0x11,0x34,0x27,0x26,0x07,0x04,0x88,0xb8,0xfd,0xa9,0xb8,0x03,0xc7,0xfa,0x01,
-0x07,0x46,0x52,0x52,0x51,0xb5,0xc1,0xac,0x6e,0x21,0x26,0x26,0x31,0x86,0x01,0xe7,
-0xfe,0x19,0x03,0xc6,0xfc,0x3a,0x04,0x60,0xfe,0x17,0x47,0x51,0xe5,0xfe,0xf2,0xd6,
-0x60,0x60,0x9c,0x30,0x37,0x93,0x01,0x08,0xa4,0x26,0x2e,0x05,0x00,0x02,0x00,0x73,
-0xff,0x2d,0x06,0x27,0x05,0xf0,0x00,0x32,0x00,0x40,0x00,0x00,0x25,0x26,0x11,0x34,
-0x37,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x07,0x16,0x33,0x32,0x37,0x15,0x06,
-0x23,0x04,0x27,0x06,0x23,0x24,0x27,0x26,0x11,0x10,0x37,0x36,0x21,0x32,0x17,0x16,
-0x17,0x15,0x26,0x27,0x26,0x23,0x20,0x07,0x06,0x11,0x10,0x17,0x16,0x33,0x32,0x37,
-0x36,0x37,0x36,0x35,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x10,0x03,0x45,0x64,
-0x60,0x5f,0xa9,0xa8,0xc0,0x66,0x4a,0x78,0x75,0x8e,0x54,0x47,0x49,0x52,0xfe,0xe9,
-0xbe,0x44,0x4c,0xfe,0xc5,0xbc,0xbd,0xc3,0xc3,0x01,0x53,0x75,0x87,0x81,0x5e,0x5c,
-0x7d,0x7d,0x79,0xff,0x00,0x88,0x88,0x82,0x81,0xdc,0x0f,0xd9,0x49,0x30,0x61,0x2b,
-0x2b,0x49,0x4a,0x2b,0x2b,0x88,0xb9,0x01,0x13,0xdc,0x7d,0x7d,0xfa,0xdc,0xd6,0x9d,
-0x73,0x3f,0x5d,0x18,0xa6,0x16,0x01,0xc0,0x0a,0x01,0xd1,0xd2,0x01,0x62,0x01,0x68,
-0xcf,0xd0,0x24,0x22,0x3e,0xb7,0x37,0x2f,0x2f,0x9c,0x9d,0xfe,0xd8,0xfe,0xe8,0xa6,
-0xa4,0x2e,0x24,0x3f,0x7f,0xd6,0x78,0x45,0x47,0x45,0x46,0x79,0xfe,0xe4,0x00,0x02,
-0x00,0x71,0xff,0x52,0x05,0x04,0x04,0x7b,0x00,0x0c,0x00,0x3f,0x00,0x00,0x25,0x36,
-0x37,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x07,0x26,0x35,0x34,0x37,
-0x36,0x33,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x16,0x33,0x32,0x37,0x15,0x06,
-0x23,0x22,0x27,0x06,0x23,0x20,0x27,0x26,0x11,0x10,0x37,0x36,0x21,0x32,0x17,0x16,
-0x17,0x15,0x26,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x03,0x57,
-0x21,0x16,0x56,0x30,0x29,0x2c,0x18,0x1b,0x8f,0x33,0x4d,0x4e,0x83,0x84,0x4e,0x4d,
-0x89,0x27,0x38,0x48,0x65,0x5a,0x3e,0x46,0x52,0xeb,0x89,0x35,0x3c,0xfe,0xfd,0x8a,
-0x89,0x97,0x96,0x01,0x06,0x55,0x51,0x51,0x4c,0x43,0x5a,0x49,0x55,0xb3,0x63,0x63,
-0x55,0x54,0xab,0xad,0x15,0x1d,0x71,0x87,0x48,0x54,0x2a,0x2e,0x4e,0xb3,0x9b,0x85,
-0xc2,0x9b,0x57,0x58,0x01,0x58,0x57,0xa5,0xb5,0x9a,0x2c,0x1e,0x34,0x14,0x9e,0x12,
-0x97,0x06,0x9d,0x9c,0x01,0x13,0x01,0x12,0x9d,0x9d,0x11,0x12,0x23,0x98,0x19,0x16,
-0x13,0x71,0x72,0xcd,0xc9,0x74,0x73,0x00,0xff,0xff,0x00,0x73,0xfe,0x75,0x05,0x27,
-0x05,0xf0,0x10,0x27,0x00,0x7a,0x01,0x2d,0x00,0x00,0x10,0x06,0x03,0x99,0x00,0x00,
-0xff,0xff,0x00,0x71,0xfe,0x75,0x03,0xe7,0x04,0x7b,0x10,0x27,0x00,0x7a,0x00,0x8f,
-0x00,0x00,0x10,0x06,0x03,0xb9,0x00,0x00,0x00,0x01,0xff,0xfa,0xfe,0x56,0x04,0xe9,
-0x05,0xd5,0x00,0x0b,0x00,0x00,0x25,0x33,0x11,0x23,0x11,0x23,0x11,0x21,0x35,0x21,
-0x15,0x21,0x02,0xd7,0xc9,0xc9,0xcb,0xfd,0xee,0x04,0xef,0xfd,0xee,0xaa,0xfd,0xac,
-0x01,0xaa,0x05,0x2b,0xaa,0xaa,0x00,0x01,0x00,0x05,0xfe,0x56,0x04,0x36,0x04,0x60,
-0x00,0x0b,0x00,0x00,0x25,0x33,0x11,0x23,0x11,0x23,0x11,0x21,0x35,0x21,0x15,0x21,
-0x02,0x78,0xb8,0xb8,0xb5,0xfe,0x42,0x04,0x31,0xfe,0x42,0x99,0xfd,0xbd,0x01,0xaa,
-0x03,0xb6,0xaa,0xaa,0xff,0xff,0xff,0xfc,0x00,0x00,0x04,0xe7,0x05,0xd5,0x12,0x06,
-0x00,0x3c,0x00,0x00,0x00,0x01,0x00,0x3d,0xfe,0x56,0x04,0x7f,0x04,0x60,0x00,0x08,
-0x00,0x00,0x25,0x11,0x23,0x11,0x01,0x33,0x09,0x01,0x33,0x02,0xc5,0xc3,0xfe,0x3b,
-0xc3,0x01,0x5e,0x01,0x5e,0xc3,0x12,0xfe,0x44,0x01,0xbc,0x04,0x4e,0xfc,0x94,0x03,
-0x6c,0x00,0x00,0x01,0xff,0xfc,0x00,0x00,0x04,0xe7,0x05,0xd5,0x00,0x0e,0x00,0x00,
-0x09,0x01,0x33,0x09,0x01,0x33,0x01,0x21,0x15,0x21,0x11,0x23,0x11,0x21,0x35,0x02,
-0x0c,0xfd,0xf0,0xd9,0x01,0x9e,0x01,0x9b,0xd9,0xfd,0xf0,0x02,0x0c,0xfd,0xf4,0xcb,
-0xfd,0xf4,0x02,0xc7,0x03,0x0e,0xfd,0x9a,0x02,0x66,0xfc,0xf2,0xaa,0xfd,0xe3,0x02,
-0x1d,0xaa,0x00,0x01,0x00,0x3d,0xfe,0x56,0x04,0x7f,0x04,0x60,0x00,0x0e,0x00,0x00,
-0x05,0x11,0x23,0x11,0x21,0x35,0x21,0x01,0x33,0x09,0x01,0x33,0x01,0x21,0x15,0x02,
-0xc5,0xc3,0xfe,0x3b,0x01,0xc5,0xfe,0x3b,0xc3,0x01,0x5e,0x01,0x5e,0xc3,0xfe,0x46,
-0x01,0xba,0x7c,0xfe,0xd2,0x01,0x2e,0x8e,0x04,0x4e,0xfc,0x94,0x03,0x6c,0xfb,0xb2,
-0x8e,0x00,0x00,0x01,0x00,0x3d,0xfe,0x56,0x05,0x3b,0x05,0xd5,0x00,0x0f,0x00,0x00,
-0x25,0x33,0x11,0x23,0x11,0x23,0x09,0x01,0x23,0x09,0x01,0x33,0x09,0x01,0x33,0x01,
-0x04,0xcb,0x70,0xc5,0x14,0xfe,0x5c,0xfe,0x59,0xda,0x02,0x15,0xfe,0x2f,0xd9,0x01,
-0x73,0x01,0x75,0xd9,0xfe,0x20,0xaa,0xfd,0xac,0x01,0xaa,0x02,0x7b,0xfd,0x85,0x03,
-0x1d,0x02,0xb8,0xfd,0xd5,0x02,0x2b,0xfd,0x33,0x00,0x00,0x01,0x00,0x3b,0xfe,0x56,
-0x04,0x79,0x04,0x60,0x00,0x0f,0x00,0x00,0x25,0x33,0x11,0x23,0x11,0x23,0x09,0x01,
-0x23,0x09,0x01,0x33,0x09,0x01,0x33,0x01,0x04,0x08,0x71,0xb8,0x21,0xfe,0xba,0xfe,
-0xba,0xd9,0x01,0xb3,0xfe,0x72,0xd9,0x01,0x29,0x01,0x29,0xd9,0xfe,0x6b,0x99,0xfd,
-0xbd,0x01,0xaa,0x01,0xb8,0xfe,0x48,0x02,0x4a,0x02,0x16,0xfe,0x71,0x01,0x8f,0xfd,
-0xdf,0x00,0x00,0x01,0xff,0xfa,0xfe,0x56,0x07,0x47,0x05,0xd5,0x00,0x0f,0x00,0x00,
-0x25,0x21,0x11,0x33,0x11,0x33,0x11,0x23,0x11,0x21,0x11,0x21,0x35,0x21,0x15,0x21,
-0x02,0xd6,0x02,0xde,0xca,0xc9,0xc9,0xfb,0x8e,0xfd,0xee,0x04,0xef,0xfd,0xee,0xaa,
-0x05,0x2b,0xfa,0xd5,0xfd,0xac,0x01,0xaa,0x05,0x2b,0xaa,0xaa,0x00,0x01,0x00,0x05,
-0xfe,0x56,0x06,0x42,0x04,0x60,0x00,0x0f,0x00,0x00,0x25,0x21,0x11,0x33,0x11,0x33,
-0x11,0x23,0x11,0x21,0x11,0x21,0x35,0x21,0x15,0x21,0x02,0x78,0x02,0x5a,0xb8,0xb8,
-0xb8,0xfc,0x39,0xfe,0x42,0x04,0x31,0xfe,0x42,0x99,0x03,0xc7,0xfc,0x39,0xfd,0xbd,
-0x01,0xaa,0x03,0xb6,0xaa,0xaa,0x00,0x01,0x00,0xaf,0xfe,0x56,0x05,0x7c,0x05,0xd5,
-0x00,0x14,0x00,0x00,0x25,0x33,0x11,0x23,0x11,0x23,0x11,0x21,0x22,0x27,0x26,0x35,
-0x11,0x33,0x11,0x14,0x16,0x33,0x21,0x11,0x33,0x04,0xb3,0xc9,0xc9,0xcb,0xfe,0x5f,
-0xba,0x71,0x6d,0xc9,0x7c,0x7c,0x01,0x78,0xcb,0xaa,0xfd,0xac,0x01,0xaa,0x02,0xc7,
-0x77,0x72,0xee,0x01,0x37,0xfe,0xd9,0x9f,0x9e,0x02,0x64,0x00,0x00,0x01,0x00,0x96,
-0xfe,0x56,0x04,0xb8,0x04,0x60,0x00,0x15,0x00,0x00,0x25,0x33,0x11,0x23,0x11,0x23,
-0x11,0x21,0x22,0x27,0x26,0x3d,0x01,0x33,0x15,0x14,0x17,0x16,0x33,0x21,0x11,0x33,
-0x04,0x00,0xb8,0xb8,0xb8,0xfe,0xa9,0x99,0x66,0x5c,0xb8,0x34,0x35,0x68,0x01,0x29,
-0xb8,0x99,0xfd,0xbd,0x01,0xaa,0x02,0x09,0x5f,0x56,0xb8,0xea,0xd3,0x75,0x3b,0x3b,
-0x01,0xbe,0x00,0x01,0x00,0xaf,0x00,0x00,0x04,0xb3,0x05,0xd5,0x00,0x18,0x00,0x00,
-0x01,0x23,0x22,0x27,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x3b,0x01,0x11,0x33,0x11,
-0x33,0x11,0x33,0x11,0x23,0x11,0x23,0x11,0x23,0x02,0x82,0x3b,0xba,0x71,0x6d,0xc9,
-0x7c,0x7c,0x12,0x90,0xd6,0xcb,0xcb,0xd6,0x90,0x02,0xc7,0x77,0x72,0xee,0x01,0x37,
-0xfe,0xd9,0x9f,0x9e,0x01,0x39,0xfe,0xc7,0x02,0x64,0xfa,0x2b,0x02,0xc7,0xfe,0xcf,
-0x00,0x01,0x00,0x96,0x00,0x00,0x04,0x00,0x04,0x60,0x00,0x18,0x00,0x00,0x01,0x35,
-0x33,0x15,0x33,0x11,0x33,0x11,0x23,0x11,0x23,0x15,0x23,0x35,0x23,0x22,0x27,0x26,
-0x3d,0x01,0x33,0x15,0x14,0x17,0x16,0x01,0xf9,0xa0,0xaf,0xb8,0xb8,0xaf,0xa0,0x08,
-0x99,0x66,0x5c,0xb8,0x34,0x2b,0x02,0xa4,0xc2,0xc4,0x01,0xbe,0xfb,0xa0,0x02,0x09,
-0xc4,0xc4,0x5f,0x56,0xb8,0xea,0xd3,0x75,0x3b,0x30,0x00,0x01,0x00,0xaf,0x00,0x00,
-0x04,0xb3,0x05,0xd5,0x00,0x10,0x00,0x00,0x01,0x11,0x21,0x32,0x17,0x16,0x15,0x11,
-0x23,0x11,0x34,0x26,0x23,0x21,0x11,0x23,0x11,0x01,0x7a,0x01,0xa1,0xba,0x71,0x6d,
-0xc9,0x7c,0x7c,0xfe,0x88,0xcb,0x05,0xd5,0xfd,0x9c,0x77,0x72,0xee,0xfe,0x66,0x01,
-0x8a,0x9f,0x9e,0xfd,0x39,0x05,0xd5,0x00,0xff,0xff,0x00,0xba,0x00,0x00,0x04,0x64,
-0x06,0x14,0x10,0x06,0x00,0x4b,0x00,0x00,0x00,0x02,0x00,0x14,0xff,0xe3,0x07,0x14,
-0x05,0xf0,0x00,0x21,0x00,0x29,0x00,0x00,0x01,0x12,0x37,0x36,0x21,0x20,0x17,0x16,
-0x13,0x21,0x10,0x00,0x21,0x32,0x36,0x37,0x15,0x06,0x04,0x23,0x20,0x27,0x26,0x03,
-0x06,0x27,0x26,0x3d,0x01,0x33,0x15,0x14,0x17,0x16,0x25,0x21,0x26,0x27,0x26,0x20,
-0x07,0x06,0x01,0xb2,0x22,0x96,0xbc,0x01,0x3a,0x01,0x43,0xb5,0xbb,0x01,0xfb,0x70,
-0x01,0x12,0x01,0x12,0x8b,0xfc,0x70,0x6f,0xfe,0xf9,0x92,0xfe,0xa2,0xc5,0xbc,0x0a,
-0xaa,0x76,0x7a,0xaa,0x4b,0x42,0x01,0x40,0x03,0xad,0x18,0x62,0x82,0xfe,0x48,0x80,
-0x61,0x03,0x6d,0x01,0x07,0xaa,0xd2,0xd2,0xdb,0xfe,0x84,0xfe,0xf4,0xfe,0xce,0x60,
-0x5f,0xd7,0x46,0x48,0xcd,0xc2,0x01,0x55,0x01,0x67,0x6b,0xdf,0x4c,0x3e,0x9d,0x44,
-0x39,0x02,0xbf,0x7c,0xa4,0xa4,0x7c,0x00,0x00,0x02,0x00,0x0f,0xff,0xe2,0x05,0x66,
-0x04,0x7b,0x00,0x22,0x00,0x29,0x00,0x00,0x01,0x22,0x27,0x26,0x3d,0x01,0x33,0x15,
-0x14,0x17,0x16,0x33,0x36,0x37,0x36,0x21,0x32,0x00,0x1d,0x01,0x21,0x1e,0x01,0x33,
-0x32,0x36,0x37,0x15,0x06,0x07,0x06,0x27,0x24,0x27,0x26,0x01,0x2e,0x01,0x23,0x22,
-0x06,0x07,0x01,0x58,0x90,0x59,0x60,0x9c,0x30,0x39,0x4a,0x1a,0x74,0x92,0x00,0xff,
-0xe2,0x01,0x07,0xfc,0xb2,0x0c,0xcd,0xb7,0x6a,0xc7,0x62,0x63,0x68,0x6e,0x65,0xfe,
-0xf3,0x9c,0x94,0x03,0x4e,0x02,0xa5,0x88,0x9a,0xb9,0x0e,0x02,0x04,0x52,0x5a,0xac,
-0x46,0x31,0x97,0x21,0x26,0xc5,0x82,0xa1,0xfe,0xdd,0xfa,0x5a,0xbe,0xc7,0x34,0x34,
-0xae,0x2a,0x16,0x17,0x01,0x05,0x97,0x90,0x01,0x85,0x97,0xb4,0xae,0x9e,0xff,0xff,
-0x00,0x14,0xfe,0x75,0x07,0x14,0x05,0xf0,0x10,0x27,0x02,0x8f,0x02,0xbc,0x00,0x00,
-0x10,0x06,0x04,0x33,0x00,0x00,0xff,0xff,0x00,0x0f,0xfe,0x75,0x05,0x66,0x04,0x7b,
-0x10,0x27,0x02,0x8f,0x01,0xe7,0x00,0x00,0x10,0x06,0x04,0x34,0x00,0x00,0xff,0xff,
-0x00,0xc1,0x00,0x00,0x01,0x79,0x06,0x14,0x10,0x06,0x00,0x4f,0x00,0x00,0xff,0xff,
-0x00,0x3b,0x00,0x00,0x06,0xad,0x07,0x6d,0x10,0x27,0x0b,0xf0,0x05,0x74,0x01,0x75,
-0x11,0x06,0x03,0x8e,0x00,0x00,0x00,0x08,0xb4,0x22,0x00,0x08,0x23,0x07,0x2b,0x31,
-0xff,0xff,0x00,0x32,0x00,0x00,0x05,0xad,0x06,0x48,0x10,0x27,0x02,0x8c,0x00,0xf0,
-0x00,0x00,0x13,0x06,0x03,0xae,0x00,0x00,0x00,0x08,0xb4,0x22,0x00,0x08,0x23,0x07,
-0x2b,0x31,0x00,0x01,0x00,0xc9,0xfe,0x66,0x05,0x35,0x05,0xd5,0x00,0x1c,0x00,0x00,
-0x01,0x33,0x32,0x17,0x16,0x15,0x11,0x10,0x06,0x2b,0x01,0x35,0x33,0x32,0x37,0x36,
-0x35,0x11,0x34,0x26,0x23,0x21,0x11,0x23,0x11,0x33,0x11,0x01,0x21,0x02,0xa9,0x8b,
-0xba,0x71,0x6d,0xcc,0xe4,0x4c,0x3e,0x86,0x38,0x37,0x7c,0x7c,0xfe,0x88,0xca,0xca,
-0x02,0x9e,0x01,0x04,0x03,0x71,0x77,0x72,0xee,0xfe,0xce,0xfe,0xf2,0xf4,0xaa,0x4b,
-0x4b,0xc2,0x01,0x22,0x9f,0x9e,0xfd,0x39,0x05,0xd5,0xfd,0x89,0x02,0x77,0x00,0x01,
-0x00,0xbf,0xfe,0x56,0x04,0x88,0x04,0x60,0x00,0x1e,0x00,0x00,0x01,0x33,0x20,0x17,
-0x16,0x15,0x11,0x14,0x07,0x06,0x2b,0x01,0x35,0x33,0x32,0x37,0x36,0x35,0x11,0x34,
-0x27,0x26,0x23,0x21,0x11,0x23,0x11,0x33,0x11,0x01,0x33,0x02,0x5e,0x14,0x01,0x05,
-0x48,0x52,0x52,0x51,0xb5,0xc1,0xac,0x6e,0x21,0x26,0x26,0x2c,0x8b,0xfe,0xfc,0xb9,
-0xb9,0x02,0x25,0xeb,0x02,0x77,0x47,0x51,0xe5,0xfe,0xf2,0xd6,0x60,0x60,0x9c,0x30,
-0x37,0x93,0x01,0x08,0xa6,0x24,0x29,0xfe,0x19,0x04,0x60,0xfe,0x1d,0x01,0xe3,0x00,
-0x00,0x01,0x00,0x36,0xfe,0x56,0x06,0x03,0x05,0xd5,0x00,0x14,0x00,0x00,0x21,0x23,
-0x11,0x21,0x15,0x10,0x03,0x06,0x05,0x35,0x36,0x37,0x12,0x19,0x01,0x21,0x11,0x33,
-0x15,0x01,0x23,0x05,0x3a,0xca,0xfe,0x1b,0x84,0x62,0xfe,0x91,0xd4,0x43,0x75,0x03,
-0x78,0xc9,0xfe,0x92,0x86,0x05,0x2b,0xd4,0xfe,0x18,0xfe,0xaa,0xfd,0x38,0xa7,0x2e,
-0xa8,0x01,0x25,0x02,0x35,0x01,0x1a,0xfa,0xd5,0xaa,0xfe,0x56,0x00,0x02,0x00,0x2e,
-0xfe,0x56,0x05,0x2b,0x04,0x60,0x00,0x00,0x00,0x15,0x00,0x00,0x09,0x01,0x33,0x15,
-0x01,0x23,0x13,0x23,0x11,0x21,0x15,0x10,0x03,0x06,0x05,0x35,0x36,0x37,0x36,0x11,
-0x35,0x21,0xfd,0xb4,0x06,0xbf,0xb8,0xfe,0xde,0x7b,0xe5,0xb8,0xfe,0x7b,0x76,0x5e,
-0xfe,0xcc,0xb3,0x3b,0x62,0x02,0xf5,0x08,0x00,0xf8,0x99,0x99,0xfe,0x56,0x01,0xaa,
-0x03,0xc7,0x86,0xfe,0x92,0xfe,0xfc,0xcf,0x1d,0x99,0x1b,0x7f,0xcf,0x01,0xa7,0xd4,
-0x00,0x01,0x00,0xc9,0xfe,0x66,0x05,0x3b,0x05,0xd5,0x00,0x15,0x00,0x00,0x25,0x11,
-0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x10,0x07,0x06,0x2b,0x01,0x35,
-0x33,0x32,0x37,0x36,0x04,0x71,0xfd,0x22,0xca,0xca,0x02,0xde,0xca,0x67,0x67,0xe3,
-0x4c,0x3e,0x86,0x38,0x37,0x68,0x02,0x5f,0xfd,0x39,0x05,0xd5,0xfd,0x9c,0x02,0x64,
-0xfa,0x93,0xfe,0xf2,0x7a,0x7a,0xaa,0x4b,0x4b,0x00,0x00,0x01,0x00,0xc1,0xfe,0x56,
-0x04,0x88,0x04,0x60,0x00,0x15,0x00,0x00,0x05,0x11,0x21,0x11,0x23,0x11,0x33,0x11,
-0x21,0x11,0x33,0x11,0x14,0x07,0x06,0x2b,0x01,0x35,0x33,0x32,0x37,0x36,0x03,0xd0,
-0xfd,0xa9,0xb8,0xb8,0x02,0x57,0xb8,0x52,0x51,0xb5,0xc1,0xac,0x6e,0x21,0x26,0x14,
-0x02,0x18,0xfd,0xfc,0x04,0x60,0xfe,0x33,0x01,0xcd,0xfb,0x8c,0xd6,0x60,0x60,0x9c,
-0x30,0x37,0x00,0x01,0x00,0xc9,0xfe,0x56,0x06,0x04,0x05,0xd5,0x00,0x10,0x00,0x00,
-0x21,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x15,0x01,
-0x23,0x05,0x3b,0xca,0xfd,0x22,0xca,0xca,0x02,0xde,0xca,0xc9,0xfe,0x92,0x86,0x02,
-0xc7,0xfd,0x39,0x05,0xd5,0xfd,0x9c,0x02,0x64,0xfa,0xd5,0xaa,0xfe,0x56,0x00,0x01,
-0x00,0xc1,0xfe,0x56,0x05,0x40,0x04,0x60,0x00,0x10,0x00,0x00,0x21,0x23,0x11,0x21,
-0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x15,0x01,0x23,0x04,0x88,0xb8,
-0xfd,0xa9,0xb8,0xb8,0x02,0x57,0xb8,0xb8,0xfe,0xde,0x7b,0x02,0x04,0xfd,0xfc,0x04,
-0x60,0xfe,0x33,0x01,0xcd,0xfc,0x39,0x99,0xfe,0x56,0x00,0x01,0x00,0xaf,0xfe,0x56,
-0x04,0xb3,0x05,0xd5,0x00,0x14,0x00,0x00,0x25,0x11,0x21,0x22,0x27,0x26,0x35,0x11,
-0x33,0x11,0x14,0x16,0x33,0x21,0x11,0x33,0x11,0x23,0x11,0x23,0x11,0x03,0xe8,0xfe,
-0x5f,0xba,0x71,0x6d,0xc9,0x7c,0x7c,0x01,0x78,0xcb,0xcb,0xc9,0xaa,0x02,0x1d,0x77,
-0x72,0xee,0x01,0x37,0xfe,0xd9,0x9f,0x9e,0x02,0x64,0xfa,0x2b,0xfe,0x56,0x02,0x54,
-0x00,0x01,0x00,0x96,0xfe,0x56,0x04,0x00,0x04,0x60,0x00,0x15,0x00,0x00,0x25,0x11,
-0x21,0x22,0x27,0x26,0x3d,0x01,0x33,0x15,0x14,0x17,0x16,0x33,0x21,0x11,0x33,0x11,
-0x23,0x11,0x23,0x11,0x03,0x48,0xfe,0xa9,0x99,0x66,0x5c,0xb8,0x34,0x35,0x68,0x01,
-0x29,0xb8,0xb8,0xb8,0x99,0x01,0x70,0x5f,0x56,0xb8,0xea,0xd3,0x75,0x3b,0x3b,0x01,
-0xbe,0xfb,0xa0,0xfe,0x56,0x02,0x43,0x00,0x00,0x01,0x00,0xc9,0xfe,0x56,0x06,0xe8,
-0x05,0xd5,0x00,0x11,0x00,0x00,0x25,0x33,0x15,0x01,0x23,0x01,0x23,0x11,0x01,0x23,
-0x01,0x11,0x23,0x11,0x21,0x09,0x01,0x21,0x06,0x1f,0xc9,0xfe,0x92,0x86,0x01,0x2b,
-0xc5,0xfe,0x7f,0xcb,0xfe,0x7f,0xc4,0x01,0x2d,0x01,0x7d,0x01,0x7f,0x01,0x2d,0xaa,
-0xaa,0xfe,0x56,0x01,0xaa,0x05,0x1f,0xfc,0x00,0x04,0x00,0xfa,0xe1,0x05,0xd5,0xfc,
-0x08,0x03,0xf8,0x00,0x00,0x01,0x00,0xc1,0xfe,0x56,0x06,0x00,0x04,0x60,0x00,0x11,
-0x00,0x00,0x25,0x33,0x15,0x01,0x23,0x13,0x23,0x11,0x01,0x23,0x01,0x11,0x23,0x11,
-0x21,0x09,0x01,0x21,0x05,0x48,0xb8,0xfe,0xde,0x7b,0xe5,0xb2,0xfe,0xcb,0xb8,0xfe,
-0xca,0xb2,0x01,0x06,0x01,0x3e,0x01,0x3f,0x01,0x04,0x99,0x99,0xfe,0x56,0x01,0xaa,
-0x03,0xb0,0xfd,0x27,0x02,0xd9,0xfc,0x50,0x04,0x60,0xfd,0x12,0x02,0xee,0xff,0xff,
-0x00,0x10,0x00,0x00,0x05,0x68,0x07,0x92,0x10,0x27,0x02,0x8c,0x00,0xce,0x01,0x4a,
-0x11,0x06,0x03,0x88,0x00,0x00,0x00,0x12,0xb4,0x18,0x00,0x08,0x13,0x07,0x2b,0x31,
-0x00,0x40,0x05,0x6f,0x00,0x6f,0x08,0x02,0x5d,0x30,0xff,0xff,0x00,0x7b,0xff,0xe3,
-0x04,0x2d,0x06,0x1f,0x10,0x26,0x02,0x8c,0x4f,0xd7,0x13,0x06,0x03,0xa8,0x00,0x00,
-0x00,0x08,0xb4,0x22,0x00,0x08,0x19,0x07,0x2b,0x31,0xff,0xff,0x00,0x10,0x00,0x00,
-0x05,0x68,0x07,0x4e,0x10,0x26,0x03,0x88,0x00,0x00,0x11,0x07,0x0b,0xe9,0x04,0xbc,
-0x01,0x75,0x00,0x14,0xb4,0x0a,0x12,0x0d,0x05,0x07,0x2b,0x40,0x09,0x30,0x12,0x3f,
-0x0d,0x00,0x12,0x0f,0x0d,0x04,0x5d,0x31,0xff,0xff,0x00,0x7b,0xff,0xe3,0x04,0x2d,
-0x06,0x10,0x12,0x26,0x03,0xa8,0x00,0x00,0x11,0x06,0x00,0x6a,0x52,0x00,0x00,0x20,
-0xb4,0x14,0x2d,0x28,0x0b,0x07,0x2b,0x40,0x15,0x7f,0x28,0x6f,0x28,0x50,0x2d,0x5f,
-0x28,0x40,0x2d,0x4f,0x28,0x30,0x2d,0x3f,0x28,0x00,0x2d,0x0f,0x28,0x0a,0x5d,0x31,
-0xff,0xff,0x00,0x08,0x00,0x00,0x07,0x48,0x05,0xd5,0x12,0x06,0x00,0x88,0x00,0x00,
-0xff,0xff,0x00,0x7b,0xff,0xe3,0x07,0x6f,0x04,0x7b,0x12,0x06,0x00,0xa8,0x00,0x00,
-0xff,0xff,0x00,0xc9,0x00,0x00,0x04,0x8b,0x07,0x6d,0x10,0x27,0x0b,0xf0,0x04,0xa1,
-0x01,0x75,0x11,0x06,0x03,0x8d,0x00,0x00,0x00,0x07,0x40,0x03,0x40,0x00,0x01,0x5d,
-0x31,0x00,0xff,0xff,0x00,0x71,0xff,0xe3,0x04,0x7f,0x06,0x48,0x10,0x27,0x02,0x8c,
-0x00,0x96,0x00,0x00,0x13,0x06,0x03,0xad,0x00,0x00,0x00,0x07,0x40,0x03,0x70,0x00,
-0x01,0x5d,0x31,0x00,0xff,0xff,0x00,0x73,0xff,0xe3,0x05,0xd9,0x05,0xf0,0x10,0x06,
-0x01,0x51,0x00,0x00,0xff,0xff,0x00,0x71,0xff,0xe3,0x04,0x7f,0x04,0x7b,0x10,0x06,
-0x02,0x0d,0x00,0x00,0xff,0xff,0x00,0x73,0xff,0xe3,0x05,0xd9,0x07,0x4e,0x10,0x27,
-0x0b,0xe9,0x05,0x20,0x01,0x75,0x10,0x06,0x04,0x4e,0x00,0x00,0xff,0xff,0x00,0x71,
-0xff,0xe3,0x04,0x7f,0x06,0x10,0x10,0x26,0x00,0x6a,0x54,0x00,0x10,0x06,0x04,0x4f,
-0x00,0x00,0xff,0xff,0x00,0x3b,0x00,0x00,0x06,0xad,0x07,0x4e,0x10,0x27,0x0b,0xe9,
-0x05,0x74,0x01,0x75,0x11,0x06,0x03,0x8e,0x00,0x00,0x00,0x08,0xb4,0x1c,0x07,0x02,
-0x1d,0x07,0x2b,0x31,0xff,0xff,0x00,0x32,0x00,0x00,0x05,0xad,0x06,0x10,0x10,0x27,
-0x00,0x6a,0x00,0xf0,0x00,0x00,0x12,0x06,0x03,0xae,0x00,0x00,0xff,0xff,0x00,0x9c,
-0xff,0xe3,0x04,0x73,0x07,0x4e,0x10,0x27,0x0b,0xe9,0x04,0x87,0x01,0x75,0x10,0x06,
-0x03,0x8f,0x00,0x00,0xff,0xff,0x00,0x85,0xff,0xe3,0x03,0xc8,0x06,0x10,0x10,0x26,
-0x00,0x6a,0x3a,0x00,0x10,0x06,0x03,0xaf,0x00,0x00,0xff,0xff,0x00,0xa0,0xff,0xc1,
-0x04,0xf8,0x05,0xd5,0x10,0x06,0x01,0x79,0x00,0x00,0xff,0xff,0x00,0x58,0xfe,0x4c,
-0x04,0x2f,0x04,0x60,0x10,0x06,0x02,0x46,0x00,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,
-0x05,0x33,0x07,0x31,0x10,0x27,0x00,0x71,0x00,0xf5,0x01,0x3b,0x10,0x06,0x03,0x90,
-0x00,0x00,0xff,0xff,0x00,0xc1,0x00,0x00,0x04,0x80,0x05,0xf5,0x10,0x27,0x00,0x71,
-0x00,0x89,0xff,0xff,0x10,0x06,0x03,0xb0,0x00,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,
-0x05,0x33,0x07,0x4e,0x10,0x27,0x0b,0xe9,0x04,0xf5,0x01,0x75,0x10,0x06,0x03,0x90,
-0x00,0x00,0xff,0xff,0x00,0xc1,0x00,0x00,0x04,0x80,0x06,0x10,0x10,0x27,0x00,0x6a,
-0x00,0x89,0x00,0x00,0x10,0x06,0x03,0xb0,0x00,0x00,0xff,0xff,0x00,0x73,0xff,0xe3,
-0x05,0xd9,0x07,0x4e,0x10,0x26,0x03,0x96,0x00,0x00,0x11,0x07,0x0b,0xe9,0x05,0x27,
-0x01,0x75,0x00,0x14,0xb4,0x03,0x1f,0x1a,0x09,0x07,0x2b,0x40,0x09,0x40,0x1f,0x4f,
-0x1a,0x10,0x1f,0x1f,0x1a,0x04,0x5d,0x31,0xff,0xff,0x00,0x71,0xff,0xe3,0x04,0x75,
-0x06,0x10,0x12,0x26,0x03,0xb6,0x00,0x00,0x11,0x06,0x00,0x6a,0x73,0x00,0x00,0x14,
-0xb4,0x03,0x1f,0x1a,0x09,0x07,0x2b,0x40,0x09,0x40,0x1f,0x4f,0x1a,0x30,0x1f,0x3f,
-0x1a,0x04,0x5d,0x31,0xff,0xff,0x00,0x73,0xff,0xe3,0x05,0xd9,0x05,0xf0,0x10,0x06,
-0x03,0x6c,0x00,0x00,0xff,0xff,0x00,0x71,0xff,0xe3,0x04,0x75,0x04,0x7b,0x10,0x06,
-0x02,0x29,0x00,0x00,0xff,0xff,0x00,0x73,0xff,0xe3,0x05,0xd9,0x07,0x4e,0x12,0x26,
-0x04,0x5e,0x00,0x00,0x10,0x07,0x0b,0xe9,0x05,0x27,0x01,0x75,0xff,0xff,0x00,0x71,
-0xff,0xe3,0x04,0x75,0x06,0x10,0x12,0x26,0x04,0x5f,0x00,0x00,0x10,0x06,0x00,0x6a,
-0x73,0x00,0xff,0xff,0x00,0x6f,0xff,0xe3,0x05,0x23,0x07,0x4e,0x10,0x27,0x0b,0xe9,
-0x04,0x67,0x01,0x75,0x10,0x06,0x03,0xa5,0x00,0x00,0xff,0xff,0x00,0x71,0xff,0xe3,
-0x03,0xe7,0x06,0x10,0x10,0x26,0x00,0x6a,0xe2,0x00,0x10,0x06,0x03,0xc5,0x00,0x00,
-0xff,0xff,0x00,0x23,0xff,0xe3,0x04,0xbd,0x07,0x31,0x10,0x27,0x00,0x71,0x00,0x72,
-0x01,0x3b,0x10,0x06,0x03,0x9b,0x00,0x00,0xff,0xff,0x00,0x3d,0xfe,0x56,0x04,0x7f,
-0x05,0xf5,0x10,0x26,0x00,0x71,0x5e,0xff,0x10,0x06,0x03,0xbb,0x00,0x00,0xff,0xff,
-0x00,0x23,0xff,0xe3,0x04,0xbd,0x07,0x4e,0x10,0x27,0x0b,0xe9,0x04,0x72,0x01,0x75,
-0x10,0x06,0x03,0x9b,0x00,0x00,0xff,0xff,0x00,0x3d,0xfe,0x56,0x04,0x7f,0x06,0x10,
-0x10,0x26,0x00,0x6a,0x5e,0x00,0x10,0x06,0x03,0xbb,0x00,0x00,0xff,0xff,0x00,0x23,
-0xff,0xe3,0x04,0xbd,0x07,0x6b,0x10,0x27,0x0b,0xf2,0x04,0x72,0x01,0x75,0x10,0x06,
-0x03,0x9b,0x00,0x00,0xff,0xff,0x00,0x3d,0xfe,0x56,0x04,0x7f,0x06,0x66,0x10,0x26,
-0x02,0x91,0x5e,0x00,0x10,0x06,0x03,0xbb,0x00,0x00,0xff,0xff,0x00,0xaf,0x00,0x00,
-0x04,0xb3,0x07,0x4e,0x10,0x27,0x0b,0xe9,0x04,0xcc,0x01,0x75,0x10,0x06,0x03,0x9f,
-0x00,0x00,0xff,0xff,0x00,0x96,0x00,0x00,0x04,0x00,0x06,0x10,0x10,0x26,0x00,0x6a,
-0x5e,0x00,0x10,0x06,0x03,0xbf,0x00,0x00,0x00,0x01,0x00,0xc9,0xfe,0x56,0x04,0x6a,
-0x05,0xd5,0x00,0x09,0x00,0x00,0x25,0x33,0x11,0x23,0x11,0x23,0x11,0x21,0x15,0x21,
-0x01,0x93,0xc9,0xc9,0xca,0x03,0xa1,0xfd,0x29,0xaa,0xfd,0xac,0x01,0xaa,0x05,0xd5,
-0xaa,0x00,0x00,0x01,0x00,0xba,0xfe,0x56,0x03,0xd0,0x04,0x60,0x00,0x09,0x00,0x00,
-0x25,0x33,0x11,0x23,0x11,0x23,0x11,0x21,0x15,0x21,0x01,0x72,0xb8,0xb8,0xb8,0x03,
-0x16,0xfd,0xa2,0x99,0xfd,0xbd,0x01,0xaa,0x04,0x60,0xaa,0x00,0xff,0xff,0x00,0xc9,
-0x00,0x00,0x06,0x46,0x07,0x4e,0x10,0x27,0x0b,0xe9,0x05,0xb7,0x01,0x75,0x10,0x06,
-0x03,0xa3,0x00,0x00,0xff,0xff,0x00,0xc1,0x00,0x00,0x05,0x69,0x06,0x10,0x10,0x26,
-0x03,0xc3,0x00,0x00,0x10,0x07,0x00,0x6a,0x01,0x08,0x00,0x00,0x00,0x02,0x00,0x91,
-0x00,0x00,0x04,0xb4,0x05,0xd5,0x00,0x0a,0x00,0x15,0x00,0x00,0x01,0x14,0x17,0x16,
-0x33,0x21,0x11,0x21,0x22,0x07,0x06,0x01,0x11,0x21,0x22,0x24,0x35,0x34,0x24,0x33,
-0x21,0x11,0x01,0x66,0x4f,0x4e,0xa3,0x01,0x44,0xfe,0xbc,0xa3,0x4e,0x4f,0x03,0x4e,
-0xfd,0xe8,0xfb,0xfe,0xf0,0x01,0x10,0xfb,0x01,0x4e,0x01,0xb7,0x8a,0x43,0x44,0x02,
-0x23,0x43,0x44,0x03,0x93,0xfa,0x2b,0xda,0xdd,0xde,0xda,0x02,0x66,0x00,0x00,0x02,
-0x00,0x71,0x00,0x00,0x03,0xf5,0x04,0x60,0x00,0x0a,0x00,0x16,0x00,0x00,0x01,0x14,
-0x17,0x16,0x33,0x21,0x11,0x21,0x22,0x07,0x06,0x01,0x11,0x21,0x22,0x27,0x26,0x10,
-0x37,0x36,0x33,0x21,0x11,0x01,0x35,0x3e,0x42,0x81,0x01,0x07,0xfe,0xf9,0x80,0x43,
-0x3e,0x02,0xc0,0xfe,0x39,0xd6,0x73,0x74,0x74,0x79,0xd0,0x01,0x0f,0x01,0x4c,0x5a,
-0x2b,0x2e,0x01,0x69,0x2e,0x2a,0x02,0xb6,0xfb,0xa0,0x52,0x52,0x01,0x50,0x52,0x55,
-0x01,0xc5,0x00,0x02,0x00,0x91,0xff,0xe3,0x07,0x43,0x05,0xd5,0x00,0x0c,0x00,0x30,
-0x00,0x00,0x01,0x21,0x22,0x07,0x06,0x10,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x13,
-0x06,0x07,0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x24,0x33,0x21,0x11,0x33,
-0x03,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x11,0x33,0x11,0x14,0x07,0x06,0x23,
-0x22,0x27,0x26,0x03,0xea,0xfe,0xbc,0xa3,0x4e,0x4f,0x4f,0x5f,0x81,0xb4,0x4b,0x56,
-0x21,0x0c,0x0e,0x33,0x6a,0x5e,0x6e,0xee,0x81,0x88,0x01,0x10,0xfb,0x01,0x4e,0xca,
-0x01,0x3f,0x34,0x70,0x69,0x3b,0x3f,0xca,0x6e,0x68,0xd7,0xd9,0x66,0x31,0x02,0xc9,
-0x43,0x44,0xfe,0xea,0x50,0x5f,0x6d,0x7d,0x9f,0xfe,0xdd,0x1d,0x1c,0x60,0x36,0x31,
-0x81,0x89,0xca,0xde,0xda,0x02,0x66,0xfb,0xec,0x8f,0x5b,0x4a,0x4a,0x4f,0x9b,0x02,
-0x9f,0xfd,0x5a,0xe0,0x7f,0x78,0x78,0x39,0x00,0x02,0x00,0x71,0xff,0xe3,0x06,0x73,
-0x04,0x60,0x00,0x0c,0x00,0x2e,0x00,0x00,0x01,0x21,0x22,0x07,0x06,0x15,0x14,0x16,
-0x33,0x32,0x37,0x36,0x35,0x13,0x06,0x07,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x36,
-0x33,0x21,0x11,0x33,0x11,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x11,0x33,0x11,
-0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x03,0x3d,0xfe,0xf9,0x80,0x43,0x3e,0x81,0x6a,
-0x94,0x5c,0x2d,0x31,0x43,0x5d,0x5e,0x88,0xac,0xcb,0x74,0x79,0xd0,0x01,0x0f,0xb8,
-0x3e,0x3c,0x6a,0x68,0x3c,0x3e,0xb8,0x64,0x68,0xce,0xd3,0x64,0x1f,0x02,0x02,0x2e,
-0x2a,0x5e,0x5c,0x73,0x6d,0x34,0x9c,0xfe,0xf6,0x6c,0x30,0x31,0xc1,0xa6,0xaa,0x52,
-0x55,0x01,0xc5,0xfd,0x61,0x9f,0x50,0x4f,0x4f,0x52,0x9d,0x01,0x41,0xfe,0xb8,0xec,
-0x73,0x78,0x78,0x25,0x00,0x01,0x00,0xc9,0xff,0xe3,0x07,0x03,0x05,0xf0,0x00,0x37,
-0x00,0x00,0x01,0x34,0x27,0x26,0x2b,0x01,0x35,0x33,0x32,0x37,0x36,0x35,0x34,0x27,
-0x26,0x23,0x22,0x06,0x07,0x35,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x14,0x07,
-0x06,0x07,0x16,0x17,0x16,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x11,0x33,
-0x11,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x26,0x03,0xaa,0x5c,0x5d,0xa5,0xae,
-0xb6,0x95,0x4f,0x4f,0x51,0x52,0x98,0x53,0xbe,0x72,0x73,0x64,0x65,0x59,0xe6,0x86,
-0x86,0x47,0x47,0x83,0x91,0x52,0x51,0x3f,0x34,0x70,0x69,0x3b,0x3f,0xca,0x6e,0x68,
-0xd7,0xd9,0x66,0x30,0x1c,0x21,0x01,0xb2,0x84,0x4a,0x4b,0xa6,0x3b,0x3c,0x70,0x73,
-0x3d,0x3e,0x24,0x26,0xb4,0x20,0x10,0x10,0x68,0x69,0xb2,0x7c,0x55,0x56,0x21,0x1f,
-0x62,0x62,0x90,0x80,0x5b,0x4a,0x4a,0x4f,0x9b,0x02,0x9f,0xfd,0x5a,0xe0,0x7f,0x78,
-0x78,0x38,0x50,0x61,0x00,0x01,0x00,0xab,0xff,0xe3,0x06,0x46,0x04,0x7c,0x00,0x35,
-0x00,0x00,0x01,0x34,0x27,0x26,0x2b,0x01,0x35,0x33,0x32,0x37,0x36,0x35,0x34,0x27,
-0x26,0x23,0x22,0x07,0x06,0x07,0x35,0x3e,0x01,0x33,0x32,0x17,0x16,0x15,0x14,0x07,
-0x06,0x07,0x16,0x17,0x16,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x11,0x33,
-0x11,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x03,0x13,0x4e,0x48,0x89,0x94,0x9b,0x74,
-0x43,0x44,0x46,0x45,0x77,0x47,0x51,0x50,0x61,0x62,0xaa,0x4c,0xc4,0x71,0x72,0x3c,
-0x3c,0x70,0x81,0x40,0x45,0x3e,0x3d,0x69,0x68,0x3c,0x3e,0xb8,0x64,0x68,0xce,0xc7,
-0x70,0x62,0x01,0x38,0x66,0x38,0x33,0x98,0x2c,0x2d,0x46,0x40,0x2e,0x2e,0x0d,0x0d,
-0x1d,0xa7,0x18,0x18,0x4e,0x4f,0x8d,0x5d,0x40,0x41,0x18,0x19,0x48,0x4f,0x48,0x58,
-0x44,0x45,0x4f,0x52,0x9d,0x01,0x41,0xfe,0xb8,0xec,0x73,0x78,0x75,0x65,0x00,0x01,
-0x00,0xc9,0xfe,0x56,0x05,0x3c,0x05,0xf0,0x00,0x29,0x00,0x00,0x21,0x23,0x11,0x34,
-0x27,0x26,0x2b,0x01,0x35,0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x23,0x22,0x06,
-0x07,0x35,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x16,0x17,
-0x16,0x15,0x11,0x33,0x11,0x23,0x04,0x73,0xc9,0x5c,0x5d,0xa5,0xae,0xb6,0x95,0x4f,
-0x4f,0x51,0x52,0x98,0x53,0xbe,0x72,0x73,0x64,0x65,0x59,0xe6,0x86,0x86,0x47,0x47,
-0x83,0x91,0x52,0x51,0xc9,0xc9,0x01,0xb1,0x85,0x4a,0x4b,0xa6,0x3b,0x3c,0x70,0x73,
-0x3d,0x3e,0x24,0x26,0xb4,0x20,0x10,0x10,0x68,0x69,0xb2,0x7c,0x55,0x56,0x21,0x1f,
-0x62,0x61,0x92,0xfe,0xf9,0xfd,0xac,0x00,0x00,0x01,0x00,0xab,0xfe,0x56,0x04,0x83,
-0x04,0x7c,0x00,0x29,0x00,0x00,0x25,0x33,0x11,0x23,0x11,0x23,0x11,0x34,0x27,0x26,
-0x2b,0x01,0x35,0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x07,
-0x35,0x3e,0x01,0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x16,0x17,0x16,0x15,
-0x03,0xc8,0xbb,0xb8,0xb8,0x4e,0x48,0x89,0x94,0x9b,0x74,0x43,0x44,0x46,0x45,0x77,
-0x47,0x51,0x50,0x61,0x62,0xaa,0x4c,0xc4,0x71,0x72,0x3c,0x3c,0x70,0x7e,0x43,0x45,
-0x99,0xfd,0xbd,0x01,0xaa,0x01,0x46,0x58,0x38,0x33,0x98,0x2c,0x2d,0x46,0x40,0x2e,
-0x2e,0x0d,0x0d,0x1d,0xa7,0x18,0x18,0x4e,0x4f,0x8d,0x5d,0x40,0x41,0x18,0x18,0x49,
-0x4b,0x6a,0x00,0x01,0x00,0x36,0xff,0xe3,0x07,0xca,0x05,0xd5,0x00,0x21,0x00,0x00,
-0x01,0x11,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x11,0x33,0x11,0x14,0x07,0x06,
-0x23,0x22,0x27,0x26,0x35,0x11,0x21,0x15,0x10,0x03,0x06,0x05,0x35,0x36,0x37,0x12,
-0x19,0x01,0x05,0x3a,0x3f,0x34,0x70,0x69,0x3b,0x3f,0xca,0x6e,0x68,0xd7,0xd6,0x69,
-0x6e,0xfe,0x1b,0x84,0x62,0xfe,0x91,0xd4,0x43,0x75,0x05,0xd5,0xfb,0xec,0x8f,0x5b,
-0x4a,0x4a,0x4f,0x9b,0x02,0x9f,0xfd,0x5a,0xe0,0x7f,0x78,0x78,0x7d,0xe2,0x03,0x71,
-0xd4,0xfe,0x18,0xfe,0xaa,0xfd,0x38,0xa7,0x2e,0xa8,0x01,0x25,0x02,0x35,0x01,0x1a,
-0x00,0x01,0x00,0x2e,0xff,0xe3,0x06,0xee,0x04,0x60,0x00,0x20,0x00,0x00,0x01,0x11,
-0x14,0x16,0x33,0x32,0x37,0x36,0x35,0x11,0x33,0x11,0x14,0x07,0x06,0x23,0x22,0x27,
-0x26,0x35,0x11,0x21,0x15,0x10,0x03,0x06,0x05,0x35,0x36,0x37,0x36,0x11,0x35,0x04,
-0x73,0x7a,0x67,0x68,0x3c,0x3e,0xb8,0x64,0x68,0xce,0xc7,0x70,0x62,0xfe,0x7b,0x76,
-0x5e,0xfe,0xcc,0xb3,0x3b,0x62,0x04,0x60,0xfd,0x04,0x57,0x8a,0x4f,0x52,0x9d,0x01,
-0x41,0xfe,0xb8,0xec,0x73,0x78,0x75,0x65,0x7b,0x02,0x8f,0x86,0xfe,0x92,0xfe,0xfc,
-0xcf,0x1d,0x99,0x1b,0x7f,0xcf,0x01,0xa7,0xd4,0x00,0xff,0xff,0x00,0xc9,0xff,0xe3,
-0x08,0x2d,0x05,0xd5,0x10,0x02,0x01,0xb8,0x00,0x00,0x00,0x01,0x00,0xc1,0xff,0xe3,
-0x07,0x03,0x04,0x60,0x00,0x1c,0x00,0x00,0x01,0x11,0x14,0x16,0x33,0x32,0x37,0x36,
-0x35,0x11,0x33,0x11,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x3d,0x01,0x21,0x11,0x23,
-0x11,0x33,0x11,0x21,0x11,0x04,0x88,0x7a,0x67,0x68,0x3c,0x3e,0xb8,0x64,0x68,0xce,
-0xc7,0x70,0x62,0xfd,0xa9,0xb8,0xb8,0x02,0x57,0x04,0x60,0xfd,0x04,0x57,0x8a,0x4f,
-0x52,0x9d,0x01,0x41,0xfe,0xb8,0xec,0x73,0x78,0x75,0x65,0x7b,0xcc,0xfd,0xfc,0x04,
-0x60,0xfe,0x33,0x01,0xcd,0x00,0xff,0xff,0x00,0x73,0xff,0xe3,0x05,0x8b,0x05,0xf0,
-0x10,0x02,0x00,0x2a,0x00,0x00,0xff,0xff,0x00,0x71,0x00,0x00,0x04,0x4f,0x04,0x98,
-0x10,0x02,0x02,0x16,0x00,0x00,0x00,0x01,0xff,0xfa,0xff,0xe3,0x05,0x66,0x05,0xd5,
-0x00,0x19,0x00,0x00,0x01,0x11,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x11,0x33,
-0x11,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x11,0x21,0x35,0x21,0x15,0x02,0xd7,
-0x3f,0x34,0x6f,0x69,0x3b,0x3f,0xca,0x6e,0x68,0xd7,0xd6,0x69,0x6e,0xfd,0xee,0x04,
-0xef,0x05,0x2b,0xfc,0x96,0x8f,0x5b,0x4a,0x4a,0x4f,0x9b,0x02,0x9f,0xfd,0x5a,0xe0,
-0x7f,0x78,0x78,0x7d,0xe2,0x03,0x71,0xaa,0xaa,0x00,0x00,0x01,0x00,0x05,0xff,0xe3,
-0x04,0xf6,0x04,0x60,0x00,0x19,0x00,0x00,0x01,0x11,0x14,0x17,0x16,0x33,0x32,0x37,
-0x36,0x35,0x11,0x33,0x11,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x11,0x21,0x35,
-0x21,0x15,0x02,0x78,0x3e,0x3d,0x69,0x68,0x3c,0x3e,0xb8,0x64,0x68,0xce,0xc7,0x70,
-0x62,0xfe,0x42,0x04,0x31,0x03,0xb6,0xfd,0xae,0x56,0x46,0x45,0x4f,0x52,0x9d,0x01,
-0x41,0xfe,0xb8,0xec,0x73,0x78,0x75,0x65,0x7b,0x02,0x7e,0xaa,0xaa,0x00,0x00,0x01,
-0x00,0xb2,0xff,0xe3,0x06,0xa0,0x05,0xd5,0x00,0x21,0x00,0x00,0x25,0x06,0x07,0x06,
-0x21,0x20,0x00,0x19,0x01,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,
-0x14,0x07,0x33,0x32,0x17,0x16,0x1d,0x01,0x23,0x35,0x34,0x27,0x26,0x23,0x04,0xef,
-0x2a,0x2d,0x90,0xfe,0xe6,0xfe,0xe5,0xfe,0xdf,0xcb,0xae,0xc3,0xc2,0xae,0xcb,0x09,
-0x2c,0x94,0x60,0x60,0x9c,0x30,0x37,0x51,0xf8,0x52,0x2e,0x95,0x01,0x2a,0x01,0x24,
-0x03,0xa4,0xfc,0x75,0xf0,0xd3,0xd3,0xf0,0x03,0x8b,0xfc,0x5c,0x47,0x43,0x5b,0x5b,
-0xab,0x46,0x31,0x6c,0x2a,0x31,0x00,0x01,0x00,0xb2,0x00,0x00,0x05,0x29,0x05,0xf2,
-0x00,0x20,0x00,0x00,0x21,0x23,0x11,0x10,0x00,0x21,0x20,0x17,0x16,0x11,0x15,0x23,
-0x35,0x34,0x26,0x23,0x22,0x06,0x1d,0x01,0x21,0x32,0x17,0x16,0x1d,0x01,0x23,0x35,
-0x34,0x27,0x26,0x23,0x21,0x01,0x7d,0xcb,0x01,0x21,0x01,0x1b,0x01,0x17,0x93,0x91,
-0xcb,0xae,0xc2,0xc3,0xae,0x02,0x58,0x95,0x5f,0x60,0x9c,0x30,0x37,0x51,0xfd,0xa8,
-0x03,0xa4,0x01,0x24,0x01,0x2a,0x95,0x92,0xfe,0xd9,0x39,0x20,0xf0,0xd3,0xd3,0xf0,
-0x9d,0x5b,0x5b,0xab,0x46,0x31,0x6c,0x2a,0x31,0x00,0x00,0x02,0x00,0xb2,0x00,0x00,
-0x06,0xc4,0x05,0xf2,0x00,0x1c,0x00,0x28,0x00,0x00,0x01,0x33,0x32,0x17,0x16,0x1d,
-0x01,0x23,0x35,0x34,0x27,0x26,0x2b,0x01,0x11,0x23,0x11,0x21,0x22,0x27,0x26,0x35,
-0x34,0x37,0x36,0x21,0x20,0x00,0x11,0x03,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x14,
-0x17,0x16,0x33,0x05,0x29,0x47,0x95,0x5f,0x60,0x9c,0x30,0x37,0x51,0x47,0xcb,0xfe,
-0x2a,0xc9,0x9f,0x6e,0x90,0x98,0x01,0x13,0x01,0x1b,0x01,0x21,0xcb,0xae,0xc3,0xc2,
-0xae,0x35,0x5a,0xa6,0x02,0x72,0x5b,0x5b,0xab,0x46,0x31,0x6c,0x2a,0x31,0xfe,0x3d,
-0x01,0xc3,0xb3,0x7c,0xe0,0xfd,0x8e,0x95,0xfe,0xd6,0xfe,0xdc,0xfe,0xce,0x01,0x19,
-0xf0,0xd3,0xd3,0xaf,0x95,0x49,0x7c,0x00,0x00,0x01,0x00,0xb2,0x00,0x00,0x06,0xc4,
-0x05,0xf2,0x00,0x20,0x00,0x00,0x01,0x33,0x32,0x17,0x16,0x1d,0x01,0x23,0x35,0x34,
-0x27,0x26,0x2b,0x01,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x07,0x06,0x1d,0x01,0x23,
-0x35,0x10,0x00,0x21,0x20,0x17,0x16,0x05,0x17,0x59,0x95,0x5f,0x60,0x9c,0x30,0x37,
-0x51,0x47,0xcb,0xae,0xc2,0xc3,0x57,0x57,0xcb,0x01,0x21,0x01,0x1b,0x01,0x1a,0x90,
-0x5a,0x04,0x60,0x5b,0x5b,0xab,0x46,0x31,0x6c,0x2a,0x31,0xfc,0x4f,0x03,0x8b,0xf0,
-0xd3,0x6a,0x6a,0xef,0x20,0x39,0x01,0x24,0x01,0x2a,0x95,0x5c,0x00,0x01,0x00,0xb2,
-0xff,0xe3,0x05,0x29,0x05,0xd5,0x00,0x20,0x00,0x00,0x13,0x10,0x00,0x21,0x20,0x37,
-0x36,0x3d,0x01,0x23,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x21,0x32,0x17,0x16,
-0x1d,0x01,0x33,0x35,0x34,0x27,0x26,0x23,0x21,0x11,0x23,0xb2,0x01,0x21,0x01,0x1b,
-0x01,0x17,0x93,0x91,0xcb,0xae,0xc2,0xc3,0xae,0x02,0x58,0x51,0x37,0x30,0x9c,0x60,
-0x5f,0x95,0xfd,0xa8,0xcb,0x02,0x31,0xfe,0xdc,0xfe,0xd6,0x95,0x92,0xe3,0x39,0x20,
-0xac,0xd3,0xd3,0xf0,0x01,0x67,0x31,0x2a,0x6c,0x31,0x46,0xab,0x5b,0x5b,0x01,0x75,
-0x00,0x02,0x00,0x9b,0xff,0x08,0x04,0xba,0x05,0xf0,0x00,0x21,0x00,0x2b,0x00,0x00,
-0x25,0x21,0x36,0x37,0x06,0x07,0x06,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x20,0x17,
-0x16,0x03,0x02,0x03,0x32,0x17,0x16,0x1d,0x01,0x23,0x35,0x34,0x27,0x26,0x23,0x21,
-0x11,0x33,0x12,0x20,0x36,0x35,0x34,0x26,0x20,0x06,0x15,0x14,0x01,0x66,0x01,0x0f,
-0xe8,0x3c,0x30,0x1c,0x49,0x7c,0xe0,0xfe,0xfb,0x01,0x10,0xe2,0x01,0x08,0x83,0x9b,
-0x3a,0x34,0xe7,0x95,0x5f,0x60,0x9c,0x30,0x37,0x51,0xfd,0x35,0xcb,0xa7,0x01,0x10,
-0x9f,0x9f,0xfe,0xf0,0x9f,0xaf,0xe1,0xd0,0x27,0x11,0x2e,0x01,0x0f,0xeb,0xe6,0x01,
-0x16,0xc6,0xea,0xfe,0xa9,0xfe,0xcf,0xfe,0xf7,0x5b,0x5b,0xab,0x46,0x31,0x6c,0x2a,
-0x31,0x01,0x4c,0x01,0x4c,0xba,0xa2,0xa1,0xbb,0xbb,0xa1,0xa2,0x00,0x01,0x00,0xb2,
-0xff,0x08,0x05,0x29,0x05,0xd5,0x00,0x1d,0x00,0x00,0x25,0x21,0x32,0x17,0x16,0x1d,
-0x01,0x23,0x35,0x34,0x27,0x26,0x23,0x21,0x11,0x33,0x11,0x21,0x32,0x17,0x16,0x1d,
-0x01,0x23,0x35,0x34,0x27,0x26,0x23,0x21,0x01,0x7d,0x01,0x85,0x95,0x5f,0x60,0x9c,
-0x30,0x37,0x51,0xfd,0xb0,0xcb,0x02,0x58,0x95,0x5f,0x60,0x9c,0x30,0x37,0x51,0xfd,
-0xa8,0xaf,0x5b,0x5b,0xab,0x46,0x31,0x6c,0x2a,0x31,0x05,0xd5,0xfe,0x8b,0x5b,0x5b,
-0xab,0x46,0x31,0x6c,0x2a,0x31,0x00,0x01,0x00,0xb2,0xff,0x08,0x05,0x29,0x05,0xf2,
-0x00,0x1f,0x00,0x00,0x33,0x11,0x10,0x00,0x21,0x20,0x17,0x16,0x11,0x15,0x23,0x35,
-0x34,0x26,0x23,0x22,0x07,0x06,0x15,0x11,0x21,0x32,0x17,0x16,0x1d,0x01,0x23,0x35,
-0x34,0x27,0x26,0x23,0xb2,0x01,0x21,0x01,0x1b,0x01,0x13,0x97,0x91,0xcb,0xae,0xc2,
-0xc5,0x55,0x57,0x02,0x58,0x95,0x5f,0x60,0x9c,0x30,0x37,0x51,0x03,0xa4,0x01,0x24,
-0x01,0x2a,0x95,0x8e,0xfe,0xd5,0x39,0x20,0xf0,0xd3,0x6a,0x6c,0xed,0xfd,0x24,0x5b,
-0x5b,0xab,0x46,0x31,0x6c,0x2a,0x31,0x00,0x00,0x02,0x00,0xb2,0x00,0x00,0x06,0x8e,
-0x05,0xf2,0x00,0x2b,0x00,0x38,0x00,0x00,0x01,0x23,0x15,0x14,0x07,0x06,0x07,0x06,
-0x27,0x26,0x27,0x26,0x37,0x36,0x33,0x21,0x26,0x27,0x26,0x23,0x22,0x06,0x15,0x11,
-0x23,0x11,0x10,0x00,0x21,0x20,0x17,0x16,0x17,0x33,0x32,0x17,0x16,0x1d,0x01,0x23,
-0x35,0x34,0x27,0x26,0x21,0x23,0x22,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x35,
-0x34,0x05,0x3a,0x11,0x67,0x69,0x98,0x92,0x6d,0x82,0x02,0x01,0x49,0x4e,0x4b,0x01,
-0x28,0x16,0x2a,0x57,0xc2,0xc3,0xae,0xcb,0x01,0x21,0x01,0x1b,0x01,0x13,0x97,0x5c,
-0x21,0x25,0x95,0x5f,0x60,0x9c,0x30,0x35,0xfe,0xd0,0xbb,0x99,0x39,0x3a,0x45,0x35,
-0x3a,0x2e,0x03,0xb1,0x20,0xdf,0x72,0x73,0x0a,0x0a,0x54,0x66,0xbd,0x93,0x4c,0x51,
-0x52,0x32,0x6a,0xd3,0xf0,0xfc,0x75,0x03,0xa4,0x01,0x24,0x01,0x2a,0x95,0x5b,0xa2,
-0x5b,0x5b,0xab,0x46,0x31,0x6a,0x2c,0x31,0x87,0x69,0x2d,0x2d,0x51,0x40,0x93,0x11,
-0x00,0x02,0x00,0xb2,0x00,0x00,0x06,0xc4,0x05,0xf2,0x00,0x1c,0x00,0x28,0x00,0x00,
-0x01,0x23,0x11,0x10,0x00,0x21,0x20,0x27,0x26,0x11,0x34,0x37,0x36,0x33,0x21,0x11,
-0x33,0x11,0x33,0x32,0x17,0x16,0x1d,0x01,0x23,0x35,0x34,0x27,0x26,0x29,0x01,0x22,
-0x07,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x05,0x70,0x47,0xfe,0xdf,0xfe,0xe5,
-0xfe,0xed,0x98,0x90,0x6e,0x9f,0xc9,0x01,0xd6,0xcb,0x47,0x95,0x5f,0x60,0x9c,0x30,
-0x37,0xfe,0x9d,0xfe,0x54,0xa6,0x5a,0x35,0xae,0xc2,0xc3,0xae,0x03,0xb1,0xfe,0x9d,
-0xfe,0xdc,0xfe,0xd6,0x95,0x8e,0x01,0x2e,0xe0,0x7c,0xb3,0x01,0x92,0xfe,0x6e,0x5b,
-0x5b,0xab,0x46,0x31,0x6c,0x2a,0x31,0x7d,0x48,0x95,0xe0,0xd3,0xd3,0xf0,0x00,0x01,
-0x00,0xb2,0x00,0x00,0x05,0x29,0x05,0xd5,0x00,0x14,0x00,0x00,0x13,0x33,0x11,0x36,
-0x33,0x20,0x17,0x16,0x11,0x15,0x23,0x35,0x34,0x26,0x23,0x22,0x07,0x06,0x15,0x11,
-0x23,0xb2,0xcb,0xa0,0xd1,0x01,0x13,0x97,0x91,0xcb,0xae,0xc2,0xc1,0x59,0x57,0xcb,
-0x05,0xd5,0xfe,0x3b,0x64,0x95,0x8e,0xfe,0xd5,0x4b,0x32,0xf0,0xd3,0x6a,0x67,0xf2,
-0xfd,0xf3,0x00,0x01,0x00,0xb2,0xff,0x08,0x04,0x56,0x05,0xd5,0x00,0x0f,0x00,0x00,
-0x01,0x11,0x21,0x32,0x17,0x16,0x1d,0x01,0x23,0x35,0x34,0x27,0x26,0x23,0x21,0x11,
-0x01,0x7d,0x01,0x85,0x95,0x5f,0x60,0x9c,0x30,0x37,0x51,0xfd,0xb0,0x05,0xd5,0xfa,
-0xda,0x5b,0x5b,0xab,0x46,0x31,0x6c,0x2a,0x31,0x05,0xd5,0x00,0x00,0x01,0x00,0xb2,
-0xff,0xe3,0x05,0xe7,0x05,0xd5,0x00,0x1b,0x00,0x00,0x01,0x11,0x10,0x17,0x16,0x33,
-0x32,0x37,0x36,0x35,0x11,0x33,0x11,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x19,0x01,
-0x21,0x11,0x23,0x11,0x33,0x11,0x03,0x7c,0x25,0x33,0x78,0x81,0x2a,0x25,0xcb,0x71,
-0x58,0xd2,0xc6,0x64,0x71,0xfe,0xcc,0xcb,0xcb,0x04,0x60,0xfd,0xd7,0xfe,0xe5,0x3e,
-0x57,0x57,0x4b,0x87,0x02,0xb0,0xfd,0x37,0xd5,0x7d,0x62,0x62,0x70,0x01,0x69,0x01,
-0x93,0xfc,0x4f,0x05,0xd5,0xfe,0x8b,0x00,0x00,0x02,0x00,0x41,0xff,0xe3,0x07,0x99,
-0x06,0xcd,0x00,0x22,0x00,0x2f,0x00,0x00,0x01,0x16,0x11,0x10,0x00,0x21,0x20,0x00,
-0x11,0x10,0x37,0x23,0x06,0x27,0x26,0x3d,0x01,0x33,0x15,0x14,0x17,0x16,0x33,0x21,
-0x32,0x17,0x16,0x1d,0x01,0x23,0x35,0x34,0x27,0x26,0x23,0x25,0x22,0x07,0x06,0x11,
-0x10,0x00,0x20,0x00,0x11,0x10,0x27,0x26,0x05,0xd6,0xc9,0xfe,0x88,0xfe,0xc6,0xfe,
-0xc5,0xfe,0x87,0xc3,0x67,0x94,0x60,0x60,0x9c,0x30,0x37,0x51,0x04,0xb0,0x95,0x5f,
-0x60,0x9c,0x30,0x37,0x51,0xfd,0xa8,0xe1,0x7c,0x82,0x01,0x03,0x01,0xb8,0x01,0x01,
-0x80,0x79,0x05,0x26,0xe1,0xfe,0xa4,0xfe,0x9f,0xfe,0x5b,0x01,0xa4,0x01,0x62,0x01,
-0x63,0xda,0x01,0x5c,0x5b,0xab,0x46,0x31,0x6c,0x2a,0x31,0x5b,0x5b,0xab,0x46,0x31,
-0x6c,0x2a,0x31,0x20,0x9e,0xa4,0xfe,0xe5,0xfe,0xe6,0xfe,0xb8,0x01,0x48,0x01,0x1a,
-0x01,0x16,0xa9,0x9e,0x00,0x01,0x00,0xb2,0x00,0x00,0x05,0x29,0x05,0xd5,0x00,0x14,
-0x00,0x00,0x21,0x23,0x11,0x06,0x23,0x20,0x27,0x26,0x19,0x01,0x33,0x11,0x14,0x16,
-0x33,0x32,0x37,0x36,0x3d,0x01,0x33,0x05,0x29,0xcb,0xa0,0xd1,0xfe,0xed,0x98,0x90,
-0xcb,0xae,0xc2,0xc1,0x59,0x57,0xcb,0x01,0xc5,0x64,0x95,0x8e,0x01,0x2b,0x02,0x26,
-0xfd,0xf3,0xf0,0xd3,0x69,0x68,0xf2,0x98,0x00,0x01,0x00,0xb2,0xff,0x08,0x05,0x29,
-0x05,0xd5,0x00,0x12,0x00,0x00,0x09,0x02,0x21,0x32,0x17,0x16,0x1d,0x01,0x23,0x35,
-0x34,0x27,0x26,0x23,0x21,0x35,0x09,0x01,0x03,0x75,0x01,0x77,0xfc,0xc9,0x02,0x20,
-0x95,0x5f,0x60,0x9c,0x30,0x37,0x51,0xfc,0xdd,0x03,0x31,0xfe,0x6b,0x05,0xd5,0xfe,
-0xae,0xfc,0x2c,0x5b,0x5b,0xab,0x46,0x31,0x6c,0x2a,0x31,0xaf,0x03,0xc0,0x01,0x66,
-0x00,0x03,0x00,0x8f,0xff,0xd2,0x04,0xc9,0x05,0xf0,0x00,0x26,0x00,0x2c,0x00,0x36,
-0x00,0x00,0x25,0x06,0x23,0x22,0x27,0x26,0x37,0x36,0x33,0x32,0x17,0x36,0x37,0x06,
-0x07,0x06,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x20,0x17,0x16,0x03,0x02,0x07,0x06,
-0x07,0x16,0x37,0x36,0x37,0x15,0x06,0x07,0x06,0x25,0x26,0x07,0x06,0x17,0x16,0x12,
-0x20,0x36,0x35,0x34,0x26,0x20,0x06,0x15,0x14,0x02,0xae,0x6e,0x56,0xac,0x49,0x67,
-0x02,0x05,0xc9,0xb2,0x94,0x83,0x72,0x30,0x1c,0x49,0x7c,0xe0,0xfe,0xfb,0x01,0x10,
-0xe2,0x01,0x08,0x83,0x9b,0x3a,0x37,0xbe,0x20,0x24,0x54,0x2e,0x81,0x7e,0x67,0x98,
-0x9a,0xfe,0xce,0x5d,0x2a,0x56,0x1f,0x18,0xb5,0x01,0x10,0x9f,0x9f,0xfe,0xf0,0x9f,
-0x1c,0x40,0x23,0x32,0x6e,0xf5,0x9a,0x77,0xef,0x27,0x11,0x2e,0x01,0x0f,0xeb,0xe6,
-0x01,0x16,0xc6,0xea,0xfe,0xa9,0xfe,0xbf,0xcc,0x22,0x25,0x16,0x03,0x07,0x64,0xc0,
-0x59,0x01,0x03,0xc6,0x51,0x04,0x08,0x3c,0x2d,0x02,0x26,0xba,0xa2,0xa1,0xbb,0xbb,
-0xa1,0xa2,0x00,0x01,0x00,0xb2,0xff,0x08,0x06,0xc4,0x05,0xf2,0x00,0x1e,0x00,0x00,
-0x21,0x11,0x34,0x26,0x23,0x22,0x07,0x06,0x1d,0x01,0x23,0x35,0x10,0x00,0x21,0x20,
-0x00,0x19,0x01,0x33,0x32,0x17,0x16,0x1d,0x01,0x23,0x35,0x34,0x27,0x26,0x23,0x04,
-0x5e,0xae,0xc2,0xc5,0x55,0x57,0xcb,0x01,0x21,0x01,0x1b,0x01,0x1a,0x01,0x21,0x47,
-0x95,0x5f,0x60,0x9c,0x30,0x37,0x51,0x03,0x8b,0xf0,0xd3,0x6a,0x6a,0xef,0x20,0x39,
-0x01,0x24,0x01,0x2a,0xfe,0xd6,0xfe,0xdc,0xfd,0x0b,0x5b,0x5b,0xab,0x46,0x31,0x6c,
-0x2a,0x31,0x00,0x02,0x00,0x5c,0xff,0xe2,0x05,0x85,0x05,0xd5,0x00,0x0d,0x00,0x2b,
-0x00,0x00,0x01,0x11,0x14,0x16,0x33,0x32,0x37,0x36,0x3d,0x01,0x34,0x27,0x26,0x23,
-0x21,0x23,0x35,0x33,0x35,0x34,0x37,0x36,0x33,0x21,0x15,0x21,0x22,0x07,0x06,0x15,
-0x21,0x32,0x17,0x16,0x15,0x11,0x23,0x35,0x06,0x23,0x20,0x27,0x26,0x11,0x01,0xd9,
-0xae,0xc2,0xc1,0x59,0x57,0x30,0x37,0x51,0xfd,0x0c,0xb2,0xb2,0x60,0x5f,0x95,0x03,
-0x23,0xfd,0x0c,0x51,0x37,0x30,0x02,0x58,0x95,0x5f,0x60,0xcb,0xa0,0xd1,0xfe,0xe7,
-0x92,0x90,0x03,0xb1,0xfe,0x98,0xf0,0xd3,0x6a,0x67,0xf2,0xa1,0x6c,0x2a,0x31,0xaf,
-0x14,0xab,0x5b,0x5b,0xaf,0x31,0x2a,0x6b,0x5b,0x5b,0xab,0xfd,0x01,0x46,0x64,0x95,
-0x94,0x01,0x25,0x00,0x00,0x01,0x00,0xb2,0xff,0xe3,0x06,0xc4,0x05,0xd5,0x00,0x1d,
-0x00,0x00,0x01,0x11,0x10,0x00,0x21,0x20,0x00,0x19,0x01,0x33,0x11,0x14,0x16,0x33,
-0x32,0x36,0x35,0x11,0x21,0x32,0x17,0x16,0x1d,0x01,0x23,0x35,0x34,0x27,0x26,0x23,
-0x05,0x29,0xfe,0xdf,0xfe,0xe6,0xfe,0xe5,0xfe,0xdf,0xcb,0xae,0xc3,0xc2,0xae,0x01,
-0x12,0x95,0x5f,0x60,0x9c,0x30,0x37,0x51,0x05,0x26,0xfd,0x0b,0xfe,0xdc,0xfe,0xd6,
-0x01,0x2a,0x01,0x24,0x03,0xa4,0xfc,0x75,0xf0,0xd3,0xd3,0xf0,0x03,0x8b,0x5b,0x5b,
-0xab,0x46,0x31,0x6c,0x2a,0x31,0x00,0x01,0x00,0x8c,0xff,0xe3,0x05,0x53,0x05,0xf2,
-0x00,0x2c,0x00,0x00,0x13,0x34,0x37,0x36,0x21,0x20,0x17,0x16,0x15,0x14,0x07,0x06,
-0x07,0x1e,0x01,0x15,0x14,0x04,0x20,0x24,0x35,0x33,0x14,0x17,0x16,0x20,0x36,0x35,
-0x34,0x26,0x23,0x21,0x35,0x21,0x32,0x36,0x35,0x34,0x27,0x26,0x23,0x22,0x07,0x06,
-0x07,0xad,0x9b,0x90,0x01,0x17,0x01,0x14,0x93,0x9b,0x49,0x49,0x81,0x92,0xa3,0xfe,
-0xf7,0xfd,0x4a,0xfe,0xf8,0xca,0x52,0x53,0x01,0xe8,0xa6,0xa5,0xf5,0xfd,0xbf,0x02,
-0x41,0xe6,0x93,0x63,0x61,0xb5,0xb5,0x61,0x57,0x0b,0x04,0xab,0x8f,0x60,0x58,0x58,
-0x60,0x8f,0x80,0x5b,0x59,0x20,0x22,0xc6,0xaf,0xf5,0xe8,0xe7,0xf6,0xa2,0x4e,0x4d,
-0x9b,0xa2,0xa7,0x9a,0x9f,0x82,0x74,0x59,0x31,0x30,0x30,0x2b,0x4a,0x00,0x00,0x01,
-0x00,0x5c,0xff,0xe3,0x06,0x6e,0x06,0xcd,0x00,0x1e,0x00,0x00,0x01,0x11,0x14,0x16,
-0x33,0x32,0x37,0x36,0x3d,0x01,0x33,0x15,0x10,0x00,0x21,0x20,0x00,0x19,0x01,0x23,
-0x22,0x27,0x26,0x3d,0x01,0x33,0x15,0x14,0x17,0x16,0x33,0x02,0xc2,0xae,0xc2,0xc5,
-0x55,0x57,0xcb,0xfe,0xdf,0xfe,0xe5,0xfe,0xe6,0xfe,0xdf,0x47,0x95,0x5f,0x60,0x9c,
-0x30,0x37,0x51,0x05,0xd5,0xfc,0x75,0xf0,0xd3,0x69,0x6b,0xef,0x20,0x39,0xfe,0xdc,
-0xfe,0xd6,0x01,0x2a,0x01,0x24,0x02,0xf5,0x5b,0x5b,0xab,0x46,0x31,0x6c,0x2a,0x31,
-0x00,0x01,0x00,0xb2,0xff,0xe1,0x05,0x29,0x06,0x93,0x00,0x20,0x00,0x00,0x01,0x14,
-0x17,0x16,0x33,0x32,0x37,0x36,0x3d,0x01,0x33,0x15,0x10,0x07,0x06,0x25,0x24,0x27,
-0x26,0x35,0x10,0x37,0x36,0x25,0x37,0x25,0x35,0x05,0x15,0x05,0x04,0x07,0x06,0x01,
-0x7a,0x5a,0x5b,0xbe,0xc3,0x57,0x57,0xcb,0x91,0x9f,0xfe,0xf4,0xfe,0xd0,0x7b,0x90,
-0x3d,0x81,0x01,0x73,0x96,0xfd,0x39,0x04,0x11,0xfe,0xa4,0xfe,0x99,0x57,0x2f,0x02,
-0x07,0xaf,0x68,0x69,0x69,0x6b,0xef,0x20,0x39,0xfe,0xdc,0x95,0xa5,0x10,0x12,0x83,
-0x9b,0xea,0x01,0x26,0x64,0xe0,0xa1,0x41,0x8c,0xbe,0xbe,0xbe,0x9c,0xa1,0x9e,0x55,
-0x00,0x01,0x00,0xb2,0x00,0x00,0x05,0x29,0x05,0xf2,0x00,0x11,0x00,0x00,0x33,0x11,
-0x10,0x00,0x21,0x20,0x00,0x19,0x01,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,
-0xb2,0x01,0x21,0x01,0x1b,0x01,0x1a,0x01,0x21,0xcb,0xae,0xc2,0xc3,0xae,0x03,0xa4,
-0x01,0x24,0x01,0x2a,0xfe,0xd6,0xfe,0xdc,0xfc,0x5c,0x03,0x8b,0xf0,0xd3,0xd3,0xf0,
-0xfc,0x75,0x00,0x01,0x00,0xb2,0xff,0x42,0x05,0x29,0x05,0xf4,0x00,0x20,0x00,0x00,
-0x01,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x1d,0x01,0x23,0x35,0x10,0x37,0x36,0x05,
-0x04,0x17,0x16,0x15,0x10,0x07,0x06,0x05,0x07,0x05,0x15,0x25,0x35,0x25,0x24,0x37,
-0x36,0x04,0x61,0x5a,0x5b,0xbe,0xc3,0x57,0x57,0xcb,0x90,0xa0,0x01,0x0c,0x01,0x30,
-0x7a,0x91,0x3d,0x81,0xfe,0x8d,0x96,0x02,0xc7,0xfb,0xef,0x01,0x5c,0x01,0x67,0x57,
-0x2f,0x03,0xce,0xaf,0x67,0x6a,0x6a,0x6a,0xef,0x20,0x39,0x01,0x24,0x95,0xa5,0x10,
-0x12,0x83,0x9b,0xea,0xfe,0xda,0x64,0xe0,0xa1,0x41,0x8c,0xbe,0xbe,0xbe,0x9c,0xa1,
-0x9e,0x55,0x00,0x01,0x00,0xb2,0x00,0x00,0x05,0xa1,0x05,0xf2,0x00,0x18,0x00,0x00,
-0x01,0x11,0x23,0x11,0x06,0x07,0x06,0x1d,0x01,0x23,0x35,0x10,0x37,0x36,0x21,0x20,
-0x17,0x16,0x19,0x01,0x23,0x11,0x34,0x27,0x26,0x03,0x90,0xcb,0x88,0x4b,0x75,0xcb,
-0xae,0x91,0x01,0x39,0x01,0x29,0x9f,0xaf,0xcb,0x75,0x42,0x05,0x47,0xfc,0x94,0x03,
-0x6c,0x13,0x50,0x7c,0xdd,0x20,0x39,0x01,0x05,0xb4,0x95,0x95,0xa3,0xfe,0xea,0xfc,
-0x5c,0x03,0x8b,0xcc,0x8d,0x50,0x00,0x02,0x00,0x9b,0xff,0x08,0x04,0xba,0x05,0xf0,
-0x00,0x1d,0x00,0x2b,0x00,0x00,0x25,0x26,0x27,0x26,0x11,0x34,0x00,0x33,0x20,0x17,
-0x16,0x03,0x02,0x03,0x32,0x17,0x16,0x1d,0x01,0x23,0x35,0x34,0x27,0x26,0x23,0x21,
-0x11,0x33,0x15,0x21,0x37,0x36,0x37,0x36,0x27,0x26,0x27,0x26,0x20,0x06,0x15,0x14,
-0x17,0x16,0x02,0xa2,0x45,0xf0,0xca,0x01,0x10,0xe2,0x01,0x08,0x83,0x9b,0x3a,0x34,
-0xe7,0x95,0x5f,0x60,0x9c,0x30,0x37,0x51,0xfd,0x35,0xcb,0x01,0x14,0xab,0x65,0x0f,
-0x3f,0x1c,0x19,0x37,0x4f,0xfe,0xf0,0x9f,0x97,0xa3,0xdc,0xdc,0xaa,0x8e,0x01,0x04,
-0xe6,0x01,0x16,0xc6,0xea,0xfe,0xa9,0xfe,0xcf,0xfe,0xf7,0x5b,0x5b,0xab,0x46,0x31,
-0x6c,0x2a,0x31,0x01,0x4c,0x9d,0xc3,0xc2,0x2c,0xbd,0xd7,0xbe,0x40,0x5e,0xbb,0xa1,
-0xaa,0x74,0x7e,0x00,0x00,0x01,0x00,0xb2,0x00,0x00,0x06,0xc4,0x05,0xf2,0x00,0x1f,
-0x00,0x00,0x01,0x33,0x32,0x17,0x16,0x1d,0x01,0x23,0x35,0x34,0x27,0x26,0x2b,0x01,
-0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x10,0x00,0x21,0x20,
-0x17,0x16,0x05,0x17,0x59,0x95,0x5f,0x60,0x9c,0x30,0x37,0x51,0x47,0xcb,0xae,0xc2,
-0xc3,0xae,0xcb,0x01,0x21,0x01,0x1b,0x01,0x1a,0x90,0x5a,0x04,0x60,0x5b,0x5b,0xab,
-0x46,0x31,0x6c,0x2a,0x31,0xfc,0x4f,0x03,0x8b,0xf0,0xd3,0xd3,0xf0,0xfc,0x75,0x03,
-0xa4,0x01,0x24,0x01,0x2a,0x95,0x5c,0x00,0xff,0xff,0x00,0xb2,0xff,0xe3,0x05,0x29,
-0x05,0xd5,0x10,0x06,0x00,0x38,0x00,0x00,0x00,0x01,0x00,0xb2,0xff,0x08,0x06,0xc4,
-0x05,0xd5,0x00,0x20,0x00,0x00,0x29,0x01,0x32,0x17,0x16,0x1d,0x01,0x33,0x35,0x34,
-0x27,0x26,0x2b,0x01,0x11,0x23,0x11,0x14,0x07,0x06,0x23,0x22,0x26,0x3d,0x01,0x23,
-0x15,0x10,0x17,0x16,0x21,0x32,0x37,0x04,0x5e,0x01,0x12,0x51,0x37,0x30,0x9c,0x60,
-0x5f,0x95,0x47,0xcb,0x57,0x59,0xc1,0xc2,0xae,0xcb,0x90,0x98,0x01,0x13,0xd1,0xa0,
-0x31,0x2a,0x6c,0x31,0x46,0xab,0x5b,0x5b,0x05,0x26,0xfd,0xf3,0xf2,0x68,0x69,0xd3,
-0xf0,0x98,0xb1,0xfe,0xd7,0x90,0x95,0x64,0xff,0xff,0x00,0x87,0xff,0xe3,0x04,0xa2,
-0x05,0xf0,0x10,0x06,0x00,0x36,0x00,0x00,0x00,0x01,0x00,0xb2,0x00,0x00,0x05,0x29,
-0x05,0xf2,0x00,0x12,0x00,0x00,0x33,0x11,0x10,0x00,0x21,0x20,0x17,0x16,0x11,0x15,
-0x23,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0xb2,0x01,0x21,0x01,0x1b,0x01,0x13,
-0x97,0x91,0xcb,0xae,0xc2,0xc3,0xae,0x03,0xa4,0x01,0x24,0x01,0x2a,0x95,0x8e,0xfe,
-0xd5,0x39,0x20,0xf0,0xd3,0xd3,0xf0,0xfc,0x75,0x00,0x00,0x02,0x00,0x8c,0xff,0xe3,
-0x05,0x53,0x05,0xf2,0x00,0x2b,0x00,0x39,0x00,0x00,0x01,0x1e,0x01,0x15,0x14,0x04,
-0x20,0x24,0x35,0x33,0x14,0x17,0x16,0x20,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x06,
-0x07,0x22,0x23,0x36,0x37,0x36,0x37,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x21,0x20,
-0x17,0x16,0x15,0x14,0x07,0x06,0x01,0x22,0x07,0x06,0x15,0x14,0x16,0x33,0x32,0x36,
-0x35,0x34,0x27,0x26,0x04,0x1e,0x92,0xa3,0xfe,0xf7,0xfd,0x4a,0xfe,0xf8,0xca,0x52,
-0x53,0x01,0xe8,0xa6,0xa5,0xf5,0xe2,0x65,0x1f,0x05,0x66,0x67,0x03,0x23,0x52,0x92,
-0x81,0x48,0x4a,0x9b,0x93,0x01,0x13,0x01,0x14,0x93,0x9b,0x49,0x49,0xfe,0x50,0xb4,
-0x61,0x63,0x93,0xe5,0xe6,0x93,0x63,0x61,0x03,0x57,0x22,0xc6,0xaf,0xf5,0xe8,0xe7,
-0xf6,0xa2,0x4e,0x4d,0x9b,0xa2,0xa7,0x9a,0x4d,0x1c,0x0c,0x1c,0x2a,0x63,0x22,0x20,
-0x59,0x5b,0x80,0x8f,0x60,0x58,0x58,0x5e,0x91,0x80,0x5b,0x59,0x01,0xd9,0x30,0x31,
-0x59,0x74,0x82,0x82,0x74,0x59,0x31,0x30,0x00,0x01,0x00,0xb2,0x00,0x00,0x06,0x0c,
-0x05,0xd5,0x00,0x15,0x00,0x00,0x01,0x35,0x34,0x26,0x23,0x22,0x07,0x06,0x15,0x11,
-0x23,0x11,0x33,0x11,0x36,0x33,0x20,0x17,0x16,0x17,0x33,0x15,0x04,0x5e,0xae,0xc2,
-0xc1,0x59,0x57,0xcb,0xcb,0xa0,0xd1,0x01,0x13,0x97,0x75,0x18,0xe7,0x01,0xdb,0x32,
-0xf0,0xd3,0x6a,0x67,0xf2,0xfd,0xf3,0x05,0xd5,0xfe,0x3b,0x64,0x95,0x73,0xe2,0xaf,
-0xff,0xff,0x00,0x73,0x00,0x00,0x05,0xd9,0x05,0xd5,0x10,0x06,0x03,0x1f,0x00,0x00,
-0x00,0x02,0x00,0x5c,0x00,0x00,0x05,0xe3,0x05,0xf2,0x00,0x2c,0x00,0x3c,0x00,0x00,
-0x01,0x11,0x34,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x23,0x22,0x27,
-0x15,0x21,0x32,0x17,0x16,0x1d,0x01,0x23,0x35,0x34,0x27,0x26,0x23,0x21,0x11,0x23,
-0x11,0x23,0x22,0x27,0x26,0x3d,0x01,0x33,0x15,0x14,0x17,0x16,0x33,0x01,0x06,0x07,
-0x06,0x15,0x14,0x17,0x16,0x17,0x16,0x37,0x36,0x35,0x34,0x27,0x26,0x01,0xd0,0x92,
-0x8d,0xeb,0xf4,0x84,0x91,0x91,0x84,0xf4,0xf6,0x49,0x01,0xf4,0x95,0x5f,0x60,0x9c,
-0x30,0x37,0x51,0xfe,0x0c,0xcb,0x20,0x95,0x5f,0x60,0x9c,0x30,0x37,0x51,0x02,0x2a,
-0x8a,0x5d,0x57,0x57,0x5d,0x8a,0x88,0x5f,0x57,0x57,0x5f,0x02,0x72,0x02,0x08,0x95,
-0x73,0x70,0x70,0x7a,0x90,0x95,0x7a,0x70,0x53,0xda,0x5b,0x5b,0xab,0x46,0x31,0x6c,
-0x2a,0x31,0xfe,0x3d,0x01,0xc3,0x5b,0x5b,0xab,0x46,0x31,0x6c,0x2a,0x31,0x02,0xdc,
-0x01,0x41,0x3e,0x54,0x5d,0x3d,0x42,0x01,0x01,0x44,0x3d,0x5b,0x56,0x3e,0x43,0x00,
-0xff,0xff,0x00,0x73,0xff,0xe3,0x05,0xd9,0x05,0xf0,0x10,0x06,0x00,0x32,0x00,0x00,
-0x00,0x03,0x00,0x87,0xff,0xe3,0x04,0xa2,0x05,0xf0,0x00,0x08,0x00,0x13,0x00,0x2e,
-0x00,0x00,0x01,0x11,0x36,0x37,0x36,0x35,0x34,0x27,0x26,0x01,0x11,0x34,0x27,0x22,
-0x07,0x06,0x15,0x14,0x17,0x16,0x05,0x17,0x1e,0x01,0x15,0x14,0x04,0x21,0x22,0x26,
-0x27,0x35,0x16,0x17,0x16,0x17,0x11,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x32,
-0x15,0x02,0xb9,0x71,0x47,0x5e,0x43,0x43,0xfe,0xbc,0x39,0x35,0x2b,0x1a,0x3c,0x26,
-0x01,0x05,0x30,0xe2,0xd7,0xfe,0xdd,0xfe,0xe7,0x6a,0xef,0x80,0x7b,0x76,0x45,0x42,
-0xbe,0x5b,0x65,0x4b,0x5b,0xa5,0xe7,0x02,0x94,0xfd,0xf8,0x0b,0x34,0x44,0x7e,0x6e,
-0x3e,0x3d,0x01,0x12,0x01,0x84,0x3e,0x02,0x40,0x25,0x91,0x63,0x33,0x1f,0x41,0x0a,
-0x2b,0xd9,0xb6,0xd9,0xe0,0x30,0x2f,0xd0,0x45,0x23,0x14,0x0a,0x02,0x2c,0x2c,0x57,
-0x60,0xab,0xd7,0x61,0x72,0xc9,0xff,0xff,0x00,0x75,0x03,0xef,0x01,0x87,0x06,0x14,
-0x10,0x06,0x02,0x73,0x00,0x00,0xff,0xff,0x00,0xb2,0x03,0xfe,0x01,0xd7,0x05,0xd5,
-0x10,0x06,0x02,0x70,0x00,0x00,0x00,0x01,0x00,0x5e,0x04,0xf1,0x03,0xa9,0x06,0xc2,
-0x00,0x03,0x00,0x00,0x01,0x23,0x01,0x33,0x01,0x33,0xd5,0x02,0x76,0xd5,0x04,0xf1,
-0x01,0xd1,0x00,0x01,0x00,0x78,0x04,0xf1,0x03,0x86,0x07,0x25,0x00,0x11,0x00,0x00,
-0x01,0x22,0x07,0x06,0x15,0x23,0x34,0x37,0x36,0x33,0x32,0x37,0x36,0x35,0x33,0x14,
-0x07,0x06,0x01,0xff,0x5b,0x52,0x42,0x98,0x68,0x6a,0xb5,0x5b,0x52,0x42,0x98,0x68,
-0x6a,0x05,0xcd,0x54,0x44,0x44,0x82,0x6a,0x6c,0x54,0x44,0x44,0x82,0x6a,0x6c,0x00,
-0xff,0xff,0x00,0x9e,0x04,0xf0,0x02,0x7d,0x06,0x66,0x10,0x06,0x00,0x43,0xf4,0x00,
-0x00,0x01,0x00,0x5e,0x04,0xe5,0x03,0xbd,0x07,0x37,0x00,0x15,0x00,0x00,0x13,0x23,
-0x34,0x37,0x12,0x21,0x20,0x17,0x12,0x21,0x22,0x11,0x33,0x14,0x33,0x32,0x27,0x26,
-0x27,0x26,0x07,0x06,0xfc,0x9e,0x20,0x71,0x01,0x33,0x01,0x55,0x37,0x4b,0xfe,0xc1,
-0xfb,0x98,0x61,0x79,0x26,0x22,0xcd,0xce,0x39,0x19,0x04,0xf1,0xd3,0x53,0x01,0x20,
-0xfc,0xfe,0xaa,0x01,0x08,0x7a,0x9e,0x8c,0x02,0x01,0xb3,0x4e,0x00,0x01,0x00,0x5a,
-0x04,0xf1,0x03,0xb2,0x07,0x25,0x00,0x05,0x00,0x00,0x1b,0x01,0x33,0x03,0x21,0x15,
-0x5a,0xaa,0xaa,0x7d,0x02,0x81,0x04,0xf1,0x02,0x34,0xfe,0x62,0x96,0x00,0x00,0x01,
-0x00,0xba,0xff,0xe6,0x07,0x1d,0x04,0x62,0x00,0x26,0x00,0x00,0x25,0x06,0x07,0x06,
-0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x37,0x36,0x35,0x11,0x33,
-0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x23,0x35,0x06,0x07,0x06,0x23,
-0x22,0x27,0x26,0x03,0xae,0x45,0x60,0x60,0x82,0xaf,0xbe,0xb9,0x72,0x75,0x8f,0x53,
-0x53,0xb9,0x72,0x77,0x8d,0xa6,0xb9,0xb9,0x3f,0x58,0x58,0x79,0x7a,0x56,0x55,0xd8,
-0x7c,0x3a,0x3c,0xf6,0xe2,0x02,0xa4,0xfd,0x62,0xa2,0x9c,0x60,0x5e,0xa4,0x02,0x7a,
-0xfd,0x62,0xa2,0x9c,0xc0,0xa2,0x02,0x7a,0xfb,0xa0,0xae,0x68,0x30,0x32,0x3e,0x3e,
-0x00,0x01,0x00,0xba,0xfe,0x56,0x04,0x64,0x04,0x7b,0x00,0x17,0x00,0x00,0x21,0x11,
-0x23,0x11,0x33,0x15,0x3e,0x01,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,
-0x22,0x06,0x15,0x11,0x21,0x15,0x01,0x73,0xb9,0xb9,0x42,0xb3,0x75,0xc1,0xc6,0xb8,
-0x7c,0x7c,0x95,0xac,0x02,0xf1,0xfe,0x56,0x06,0x0a,0xae,0x65,0x64,0xef,0xe8,0xfe,
-0x88,0x01,0x72,0x9f,0x9e,0xbe,0xa4,0xfe,0x36,0xaf,0x00,0x02,0x00,0x71,0xfe,0x56,
-0x05,0x2f,0x04,0x7b,0x00,0x07,0x00,0x1b,0x00,0x00,0x00,0x10,0x16,0x20,0x36,0x10,
-0x26,0x20,0x01,0x23,0x11,0x0e,0x01,0x23,0x22,0x02,0x10,0x00,0x33,0x32,0x16,0x17,
-0x35,0x33,0x11,0x33,0x15,0x23,0x01,0x2f,0xa7,0x01,0x24,0xa8,0xa8,0xfe,0xdc,0x02,
-0x84,0xb8,0x3a,0xb1,0x7c,0xcb,0xff,0x00,0xff,0xcb,0x7c,0xb1,0x3a,0xb8,0xd5,0xd5,
-0x02,0xfa,0xfe,0x6a,0xe7,0xe7,0x01,0x96,0xe7,0xfa,0x75,0x02,0x52,0x64,0x61,0x01,
-0x44,0x02,0x10,0x01,0x44,0x61,0x64,0xaa,0xfc,0x4f,0xaf,0x00,0x00,0x01,0x00,0xba,
-0xfe,0x56,0x05,0x39,0x04,0x7b,0x00,0x17,0x00,0x00,0x21,0x11,0x23,0x11,0x34,0x26,
-0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x3e,0x01,0x33,0x32,0x16,0x15,0x11,
-0x33,0x15,0x04,0x64,0xb8,0x7c,0x7c,0x95,0xac,0xb9,0xb9,0x42,0xb3,0x75,0xc1,0xc6,
-0xd5,0xfe,0x56,0x04,0x48,0x9f,0x9e,0xbe,0xa4,0xfd,0x87,0x04,0x60,0xae,0x65,0x64,
-0xef,0xe8,0xfe,0x0b,0xaf,0x00,0x00,0x01,0x00,0xae,0xff,0xe3,0x04,0x58,0x06,0x14,
-0x00,0x18,0x00,0x00,0x01,0x11,0x14,0x16,0x33,0x32,0x37,0x36,0x35,0x11,0x33,0x11,
-0x23,0x35,0x0e,0x01,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x21,0x15,0x01,0x66,0x7c,
-0x7c,0x98,0x54,0x56,0xb8,0xb8,0x43,0xb1,0x75,0xc1,0xc8,0xb8,0x02,0xf2,0x03,0xb6,
-0xfe,0x0b,0x9f,0x9f,0x5f,0x62,0xa1,0x01,0x3b,0xfc,0xe0,0xac,0x66,0x63,0xf0,0xe7,
-0x04,0x5a,0xfe,0x4c,0xaa,0x00,0x00,0x02,0x00,0x71,0xfe,0x56,0x05,0x2f,0x04,0x7b,
-0x00,0x11,0x00,0x19,0x00,0x00,0x01,0x33,0x15,0x21,0x11,0x0e,0x01,0x23,0x22,0x02,
-0x10,0x00,0x33,0x32,0x16,0x17,0x35,0x33,0x00,0x10,0x16,0x20,0x36,0x10,0x26,0x20,
-0x04,0x5a,0xd5,0xfe,0x73,0x3a,0xb1,0x7c,0xcb,0xff,0x00,0xff,0xcb,0x7c,0xb1,0x3a,
-0xb8,0xfc,0xd5,0xa7,0x01,0x24,0xa8,0xa8,0xfe,0xdc,0xfe,0xf8,0xa2,0x02,0x52,0x64,
-0x61,0x01,0x44,0x02,0x10,0x01,0x44,0x61,0x64,0xaa,0xfe,0x9a,0xfe,0x6a,0xe7,0xe7,
-0x01,0x96,0xe7,0x00,0x00,0x01,0x00,0xae,0xff,0x1a,0x03,0xe0,0x06,0x14,0x00,0x13,
-0x00,0x00,0x29,0x01,0x11,0x33,0x11,0x21,0x15,0x21,0x11,0x33,0x32,0x17,0x16,0x1d,
-0x01,0x23,0x35,0x34,0x27,0x26,0x02,0x02,0xfe,0xac,0xb8,0x02,0x7a,0xfd,0x86,0x9c,
-0xe9,0x4d,0x60,0x9c,0x30,0x31,0x06,0x14,0xfe,0x4c,0xaa,0xfc,0xf9,0x49,0x5b,0xab,
-0x46,0x31,0x69,0x26,0x26,0x00,0x00,0x01,0x00,0xba,0xfe,0x56,0x04,0x64,0x04,0x7b,
-0x00,0x15,0x00,0x00,0x13,0x11,0x33,0x15,0x3e,0x01,0x33,0x32,0x16,0x15,0x11,0x23,
-0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x21,0x15,0xba,0xb9,0x42,0xb3,0x75,0xc1,
-0xc6,0xb8,0x7c,0x7c,0x95,0xac,0x02,0xf1,0xfe,0x56,0x06,0x0a,0xae,0x65,0x64,0xef,
-0xe8,0xfd,0x5c,0x02,0x9e,0x9f,0x9e,0xbe,0xa4,0xfc,0x8c,0xaf,0x00,0x02,0x00,0xba,
-0xfe,0x56,0x05,0x36,0x04,0x7b,0x00,0x1f,0x00,0x28,0x00,0x00,0x01,0x33,0x34,0x26,
-0x20,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x3e,0x01,0x33,0x32,0x00,0x11,0x33,0x15,
-0x23,0x06,0x07,0x06,0x07,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x05,0x23,0x22,0x17,
-0x16,0x33,0x32,0x37,0x36,0x03,0x23,0xc2,0xa7,0xfe,0xdc,0xa7,0xb9,0xb9,0x3a,0xb1,
-0x7b,0xcc,0x00,0xff,0x92,0xa2,0x26,0x38,0x79,0x87,0xa6,0x2e,0x78,0x42,0x64,0x01,
-0x42,0x98,0x9f,0x05,0x05,0x8b,0x42,0x32,0x2c,0x02,0x2f,0xcb,0xe7,0xe7,0xcb,0xfc,
-0x27,0x06,0x0a,0xaa,0x64,0x61,0xfe,0xbc,0xfe,0xf8,0xaf,0xb0,0x4b,0xa1,0x01,0x29,
-0x6c,0x78,0x7b,0x4e,0x76,0xaf,0x90,0x71,0x71,0x64,0x00,0x02,0x00,0x71,0xff,0xe3,
-0x05,0x2f,0x06,0x14,0x00,0x0c,0x00,0x1f,0x00,0x00,0x01,0x21,0x22,0x07,0x06,0x15,
-0x14,0x16,0x33,0x32,0x37,0x36,0x35,0x13,0x11,0x10,0x05,0x06,0x23,0x22,0x02,0x11,
-0x34,0x37,0x36,0x33,0x21,0x11,0x33,0x11,0x33,0x15,0x03,0xa2,0xfe,0xc6,0xa5,0x41,
-0x53,0xa7,0x92,0x9a,0x4d,0x53,0xb8,0xfe,0xec,0x4b,0x95,0xf6,0xff,0x7f,0x71,0xda,
-0x01,0x67,0xb8,0xd5,0x03,0xb6,0x5a,0x73,0xba,0xcb,0xe7,0x6b,0x73,0xd4,0x01,0x87,
-0xfe,0x43,0xfe,0xaf,0x9a,0x2b,0x01,0x44,0x01,0x08,0xeb,0xae,0x98,0x01,0xb4,0xfe,
-0x4c,0xaa,0x00,0x01,0x00,0xba,0xfe,0x56,0x04,0x64,0x06,0x14,0x00,0x13,0x00,0x00,
-0x01,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x11,0x3e,
-0x01,0x33,0x32,0x16,0x04,0x64,0xb8,0x7c,0x7c,0x95,0xac,0xb9,0xb9,0x42,0xb3,0x75,
-0xc1,0xc6,0x02,0xa4,0xfd,0x5c,0x02,0x9e,0x9f,0x9e,0xbe,0xa4,0xfb,0xdd,0x07,0xbe,
-0xfd,0x9e,0x65,0x64,0xef,0x00,0x00,0x01,0x00,0xc1,0xfe,0x56,0x02,0xd7,0x04,0x60,
-0x00,0x05,0x00,0x00,0x01,0x21,0x15,0x21,0x11,0x33,0x01,0x79,0x01,0x5e,0xfd,0xea,
-0xb8,0xfe,0xf8,0xa2,0x06,0x0a,0x00,0x01,0x00,0xba,0xfe,0x56,0x07,0x1c,0x06,0x14,
-0x00,0x26,0x00,0x00,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x11,
-0x36,0x37,0x36,0x33,0x32,0x16,0x1d,0x01,0x14,0x17,0x16,0x33,0x32,0x36,0x35,0x11,
-0x33,0x11,0x23,0x35,0x0e,0x01,0x23,0x22,0x27,0x26,0x35,0x03,0x8f,0x7c,0x7c,0x78,
-0xac,0xb9,0xb9,0x63,0x26,0x59,0x6b,0xc1,0xc6,0x3e,0x38,0x6e,0x8c,0xad,0xb8,0xb8,
-0x43,0xb1,0x6c,0xaf,0x62,0x64,0x02,0x9e,0x9f,0x9e,0xbe,0xa4,0xfb,0xdd,0x07,0xbe,
-0xfd,0x9e,0x81,0x16,0x32,0xef,0xe8,0xe3,0x97,0x58,0x4f,0xbe,0xa4,0x02,0x7b,0xfb,
-0xa0,0xac,0x66,0x63,0x78,0x7b,0xe4,0x00,0x00,0x02,0x00,0x71,0xff,0xe2,0x04,0xbc,
-0x06,0x14,0x00,0x0c,0x00,0x2a,0x00,0x00,0x01,0x23,0x22,0x07,0x06,0x15,0x14,0x16,
-0x33,0x32,0x37,0x36,0x27,0x03,0x27,0x26,0x37,0x36,0x3b,0x01,0x15,0x23,0x26,0x17,
-0x16,0x1f,0x01,0x21,0x15,0x21,0x17,0x12,0x07,0x06,0x27,0x26,0x27,0x26,0x11,0x34,
-0x37,0x36,0x33,0x02,0xe9,0x81,0xa5,0x41,0x53,0xa7,0x92,0xa9,0x61,0x5b,0x3f,0xee,
-0x18,0x4e,0x18,0x24,0xe4,0x39,0x2b,0x60,0x06,0x06,0x1d,0x32,0x01,0x59,0xfe,0xf1,
-0x68,0x9e,0xe5,0x86,0xe2,0xf7,0x7f,0x7f,0x7f,0x71,0xda,0x03,0xb6,0x5a,0x73,0xba,
-0xcb,0xe7,0x96,0x8e,0x94,0x02,0x2b,0x38,0xb2,0x50,0x7a,0xaf,0x01,0x29,0x27,0x42,
-0x74,0xaa,0xf0,0xfe,0x95,0xee,0x8b,0x01,0x01,0xa1,0xa2,0x01,0x08,0xeb,0xae,0x98,
-0x00,0x01,0x00,0xae,0xfe,0x56,0x04,0x58,0x06,0x14,0x00,0x13,0x00,0x00,0x13,0x11,
-0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x23,0x11,0x0e,0x01,0x23,
-0x22,0x26,0xae,0xb8,0x7c,0x7c,0x95,0xad,0xb8,0xb8,0x43,0xb1,0x75,0xc1,0xc8,0x01,
-0xba,0x04,0x5a,0xfb,0xad,0x9f,0x9f,0xbe,0xa4,0x02,0x7b,0xf9,0xf6,0x02,0x56,0x66,
-0x63,0xf0,0xff,0xff,0x00,0xba,0x00,0x00,0x04,0x64,0x06,0x14,0x10,0x06,0x00,0x4b,
-0x00,0x00,0x00,0x02,0x00,0x71,0xff,0xe3,0x04,0x5a,0x06,0x14,0x00,0x21,0x00,0x2d,
-0x00,0x00,0x01,0x16,0x17,0x04,0x19,0x01,0x23,0x35,0x06,0x07,0x06,0x23,0x22,0x27,
-0x26,0x11,0x10,0x37,0x36,0x37,0x36,0x37,0x36,0x2b,0x01,0x22,0x13,0x33,0x06,0x17,
-0x33,0x32,0x07,0x06,0x00,0x10,0x17,0x16,0x20,0x37,0x36,0x10,0x27,0x26,0x20,0x07,
-0x03,0x18,0x17,0x1f,0x01,0x0c,0xb8,0x3a,0x58,0x59,0x7c,0xcb,0x80,0x7f,0x7f,0x60,
-0x79,0xdb,0x0d,0x15,0x59,0x5e,0xc9,0x7f,0xc2,0x36,0x2a,0x7b,0xa6,0x21,0x15,0xfd,
-0xc9,0x53,0x54,0x01,0x24,0x54,0x54,0x54,0x54,0xfe,0xdc,0x54,0x04,0x65,0x08,0x13,
-0xa7,0xfe,0x91,0xfd,0xcc,0xa8,0x64,0x30,0x31,0xa2,0xa2,0x01,0x08,0x01,0x10,0x9a,
-0x75,0x1a,0x2e,0x22,0x36,0x01,0x26,0xa0,0x04,0x87,0x57,0xfe,0x68,0xfe,0x6a,0x74,
-0x73,0x73,0x74,0x01,0x96,0x74,0x73,0x73,0x00,0x01,0x00,0xba,0xfe,0x56,0x05,0x39,
-0x04,0x7b,0x00,0x15,0x00,0x00,0x01,0x21,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,
-0x23,0x11,0x33,0x15,0x3e,0x01,0x33,0x32,0x16,0x15,0x11,0x33,0x05,0x39,0xfe,0x73,
-0x7c,0x7c,0x95,0xac,0xb9,0xb9,0x42,0xb3,0x75,0xc1,0xc6,0xd5,0xfe,0x56,0x04,0x48,
-0x9f,0x9e,0xbe,0xa4,0xfd,0x87,0x04,0x60,0xae,0x65,0x64,0xef,0xe8,0xfc,0x54,0x00,
-0x00,0x02,0x00,0xae,0xff,0xe3,0x04,0x58,0x06,0x14,0x00,0x1a,0x00,0x29,0x00,0x00,
-0x01,0x16,0x17,0x04,0x19,0x01,0x23,0x35,0x0e,0x01,0x23,0x22,0x27,0x26,0x3d,0x01,
-0x10,0x37,0x26,0x23,0x35,0x32,0x17,0x36,0x25,0x15,0x04,0x01,0x06,0x11,0x15,0x14,
-0x17,0x16,0x33,0x32,0x36,0x3d,0x01,0x34,0x27,0x26,0x02,0xa1,0x70,0x45,0x01,0x02,
-0xb8,0x43,0xb1,0x75,0xc3,0x62,0x64,0xb5,0x4b,0x6a,0xaf,0x88,0xeb,0x01,0x88,0xfe,
-0xfb,0xfe,0xc5,0xb2,0x3e,0x41,0x79,0x95,0xad,0xcd,0x44,0x04,0xa0,0x2d,0x37,0xc8,
-0xfe,0xac,0xfd,0xe0,0xac,0x66,0x63,0x78,0x7b,0xe4,0x7e,0x01,0x03,0xfb,0x07,0xaf,
-0x18,0xf7,0x49,0xaf,0x3a,0xfe,0xec,0xd8,0xfe,0xf9,0x77,0xa2,0x4d,0x4f,0xbe,0xa4,
-0x3b,0xec,0xb1,0x3a,0x00,0x01,0x00,0xae,0xff,0xe3,0x05,0x0a,0x06,0x14,0x00,0x23,
-0x00,0x00,0x01,0x23,0x26,0x15,0x14,0x1f,0x01,0x16,0x15,0x11,0x23,0x35,0x0e,0x01,
-0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x34,0x2f,
-0x01,0x26,0x37,0x36,0x3b,0x01,0x05,0x0a,0xde,0x60,0x0e,0x4d,0x31,0xb8,0x43,0xb1,
-0x75,0xc1,0xc8,0xb8,0x7c,0x7c,0x95,0xad,0x10,0x4d,0x4d,0x20,0x37,0xd1,0xec,0x05,
-0x65,0x01,0x2c,0x27,0x22,0xbc,0x78,0x4d,0xfc,0x90,0xac,0x66,0x63,0xf0,0xe7,0x02,
-0xa6,0xfd,0x61,0x9f,0x9f,0xbe,0xa4,0x01,0x91,0x3f,0x27,0xbc,0xbb,0x47,0x7a,0x00,
-0xff,0xff,0xff,0xdb,0xfe,0x56,0x01,0x79,0x04,0x60,0x10,0x06,0x01,0xf9,0x00,0x00,
-0x00,0x01,0x00,0x31,0xff,0xe3,0x05,0x5a,0x06,0x14,0x00,0x23,0x00,0x00,0x13,0x14,
-0x3b,0x01,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x23,0x35,0x0e,0x01,
-0x23,0x22,0x26,0x35,0x11,0x23,0x22,0x27,0x26,0x37,0x36,0x37,0x36,0x3b,0x01,0x15,
-0x23,0x22,0xf2,0x83,0xf3,0x7c,0x7c,0x95,0xad,0xb8,0xb8,0x43,0xb1,0x75,0xc1,0xc8,
-0x3b,0x95,0x5e,0x53,0x03,0x03,0x57,0x73,0x76,0x59,0x59,0x83,0x04,0xea,0x8a,0xfd,
-0x61,0x9f,0x9f,0xbe,0xa4,0x02,0x7b,0xfb,0xa0,0xac,0x66,0x63,0xf0,0xe7,0x01,0xfc,
-0x5e,0x53,0x91,0x83,0x42,0x57,0xaf,0x00,0x00,0x01,0x00,0x9f,0xfe,0x56,0x03,0x97,
-0x04,0x7c,0x00,0x19,0x00,0x00,0x05,0x06,0x17,0x16,0x33,0x21,0x15,0x21,0x22,0x27,
-0x26,0x37,0x01,0x36,0x27,0x26,0x07,0x06,0x07,0x35,0x36,0x17,0x16,0x17,0x12,0x07,
-0x01,0x94,0x27,0x0a,0x0d,0x3c,0x01,0xd7,0xfd,0xe5,0x8d,0x33,0x3d,0x45,0x01,0xcd,
-0x7c,0x69,0x43,0x8d,0x78,0xbc,0xbc,0xa1,0xe7,0x60,0x9f,0x93,0x90,0x38,0x1c,0x24,
-0xa2,0x56,0x66,0x66,0x02,0xad,0xb9,0x8e,0x5a,0x01,0x01,0x78,0xc6,0x6a,0x01,0x01,
-0xaa,0xfe,0xe9,0xd1,0xff,0xff,0x00,0xba,0x00,0x00,0x04,0x64,0x04,0x7b,0x10,0x06,
-0x00,0x51,0x00,0x00,0x00,0x01,0x00,0x7a,0xfe,0x56,0x03,0x74,0x04,0x60,0x00,0x1f,
-0x00,0x00,0x01,0x26,0x37,0x36,0x3b,0x01,0x15,0x23,0x26,0x07,0x06,0x1f,0x01,0x16,
-0x17,0x16,0x07,0x01,0x06,0x17,0x16,0x33,0x21,0x15,0x21,0x22,0x27,0x26,0x37,0x01,
-0x36,0x27,0x01,0x19,0x75,0x3f,0x34,0xd4,0x36,0x28,0x51,0x0f,0x0f,0x45,0x8e,0x46,
-0x1a,0x16,0x3a,0xfe,0xd8,0x29,0x0c,0x0d,0x3c,0x01,0xd7,0xfd,0xe5,0x8d,0x33,0x41,
-0x49,0x01,0x46,0x55,0x8e,0x02,0xd4,0x80,0x92,0x7a,0xaf,0x01,0x2c,0x2c,0x4b,0x9b,
-0x4c,0x88,0x6f,0x49,0xfe,0x88,0x34,0x20,0x24,0xa2,0x56,0x6c,0x60,0x01,0xad,0x70,
-0x9c,0x00,0x00,0x01,0x00,0xba,0xfe,0x56,0x07,0x1d,0x04,0x62,0x00,0x26,0x00,0x00,
-0x25,0x06,0x07,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x37,
-0x36,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x23,0x11,
-0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x03,0xae,0x43,0x62,0x60,0x82,0xaf,0xbe,0xb9,
-0x72,0x75,0x8f,0x53,0x53,0xb9,0x72,0x77,0x8d,0xa6,0xb9,0xb9,0x3d,0x5a,0x58,0x79,
-0x7a,0x56,0x55,0xd8,0x79,0x3d,0x3c,0xf6,0xe2,0x02,0xa4,0xfd,0x62,0xa2,0x9c,0x60,
-0x5e,0xa4,0x02,0x7a,0xfd,0x62,0xa2,0x9c,0xc0,0xa2,0x02,0x7a,0xf9,0xf4,0x02,0x5a,
-0x65,0x33,0x32,0x3e,0x3e,0x00,0x00,0x02,0x00,0x78,0xfe,0x56,0x03,0x97,0x04,0x7c,
-0x00,0x09,0x00,0x21,0x00,0x00,0x01,0x13,0x36,0x27,0x26,0x07,0x06,0x15,0x14,0x17,
-0x0b,0x01,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x17,0x12,0x07,0x01,0x06,0x17,0x16,
-0x33,0x21,0x15,0x21,0x22,0x27,0x26,0x37,0x01,0xd2,0xbf,0x7d,0x6a,0x46,0x8a,0xac,
-0x30,0x03,0xbf,0x1e,0x5c,0x58,0xd1,0xe4,0x63,0x9f,0x93,0xfe,0x44,0x27,0x0a,0x0d,
-0x3c,0x01,0xd7,0xfd,0xe5,0x8d,0x33,0x3d,0x45,0x01,0x0b,0x01,0x1a,0xb8,0x8f,0x5f,
-0x06,0x08,0xbd,0x36,0x7e,0xfe,0x05,0x01,0xe4,0x4c,0x83,0xa8,0x68,0x64,0x03,0x03,
-0xae,0xfe,0xe9,0xd1,0xfd,0x88,0x38,0x1c,0x24,0xa2,0x56,0x65,0x67,0x00,0x00,0x01,
-0x00,0xba,0x00,0x00,0x04,0x74,0x04,0x7b,0x00,0x18,0x00,0x00,0x01,0x36,0x27,0x26,
-0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x3e,0x01,0x33,0x32,0x17,0x16,0x07,
-0x03,0x21,0x15,0x21,0x35,0x03,0x71,0x7a,0x7d,0x3e,0x7c,0x95,0xac,0xb9,0xb9,0x42,
-0xb3,0x75,0xe2,0x6a,0x74,0x5b,0xec,0x01,0x1e,0xfe,0x18,0x02,0x25,0xc8,0x9f,0x4f,
-0xbe,0xa4,0xfd,0x87,0x04,0x60,0xae,0x65,0x64,0xd4,0xe9,0x93,0xfe,0x84,0xaf,0xaf,
-0xff,0xff,0x00,0xae,0xff,0xe3,0x04,0x58,0x04,0x60,0x10,0x06,0x00,0x58,0x00,0x00,
-0x00,0x01,0x00,0xae,0xfe,0x56,0x05,0x2d,0x06,0x14,0x00,0x15,0x00,0x00,0x01,0x11,
-0x0e,0x01,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,
-0x33,0x11,0x33,0x15,0x03,0xa0,0x43,0xb1,0x75,0xc1,0xc8,0xb8,0x7c,0x7c,0x95,0xad,
-0xb8,0xd5,0xfe,0x56,0x02,0x56,0x66,0x63,0xf0,0xe7,0x02,0xa6,0xfd,0x61,0x9f,0x9f,
-0xbe,0xa4,0x04,0x2f,0xf8,0xe4,0xa2,0x00,0x00,0x01,0x00,0xae,0xff,0xe3,0x07,0x1c,
-0x04,0x7b,0x00,0x25,0x00,0x00,0x01,0x11,0x33,0x15,0x3e,0x01,0x33,0x32,0x16,0x15,
-0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x07,0x06,0x15,0x11,0x23,0x35,0x0e,0x01,0x23,
-0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x37,0x36,0x03,0x8f,0xb8,0x42,
-0xb3,0x59,0xc1,0xc6,0xb8,0x7c,0x7c,0x7a,0x55,0x56,0xb8,0x43,0xb1,0x64,0xc1,0xc8,
-0xb8,0x7c,0x7c,0x82,0x58,0x57,0x01,0xe5,0x02,0x7b,0xae,0x65,0x64,0xef,0xe8,0xfd,
-0x5c,0x02,0x9e,0x9f,0x9e,0x5f,0x60,0xa3,0xfd,0x87,0xac,0x66,0x63,0xf0,0xe7,0x02,
-0xa6,0xfd,0x61,0x9f,0x9f,0x5f,0x5c,0x00,0x00,0x01,0x00,0xba,0xfe,0x56,0x04,0x64,
-0x04,0x7b,0x00,0x13,0x00,0x00,0x01,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,
-0x11,0x23,0x11,0x33,0x15,0x3e,0x01,0x33,0x32,0x16,0x04,0x64,0xb8,0x7c,0x7c,0x95,
-0xac,0xb9,0xb9,0x42,0xb3,0x75,0xc1,0xc6,0x02,0xa4,0xfd,0x5c,0x02,0x9e,0x9f,0x9e,
-0xbe,0xa4,0xfb,0xdd,0x06,0x0a,0xae,0x65,0x64,0xef,0xff,0xff,0x00,0x71,0xfe,0x56,
-0x04,0x5a,0x04,0x7b,0x10,0x06,0x00,0x4a,0x00,0x00,0x00,0x01,0x00,0xc1,0x00,0x00,
-0x02,0xd7,0x04,0x60,0x00,0x05,0x00,0x00,0x25,0x21,0x15,0x21,0x11,0x33,0x01,0x79,
-0x01,0x5e,0xfd,0xea,0xb8,0xaf,0xaf,0x04,0x60,0x00,0x00,0x01,0x00,0xae,0xfe,0x56,
-0x07,0x1c,0x06,0x14,0x00,0x24,0x00,0x00,0x01,0x11,0x33,0x11,0x3e,0x01,0x33,0x32,
-0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x07,0x06,0x15,0x11,0x23,0x11,0x0e,
-0x01,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x03,0x8f,0xb8,
-0x42,0xb3,0x59,0xc1,0xc6,0xb8,0x7c,0x7c,0x7a,0x55,0x56,0xb8,0x43,0xb1,0x64,0xc1,
-0xc8,0xb8,0x7c,0x7c,0x84,0xad,0x01,0xe5,0x04,0x2f,0xfd,0x9e,0x65,0x64,0xef,0xe8,
-0xfd,0x5c,0x02,0x9e,0x9f,0x9e,0x5f,0x60,0xa3,0xfb,0xdd,0x02,0x56,0x66,0x63,0xf0,
-0xe7,0x02,0xa6,0xfd,0x61,0x9f,0x9f,0xbe,0x00,0x02,0x00,0x00,0xfe,0x56,0x04,0xbf,
-0x04,0x7b,0x00,0x17,0x00,0x1f,0x00,0x00,0x25,0x11,0x21,0x15,0x21,0x15,0x23,0x35,
-0x23,0x35,0x33,0x11,0x33,0x15,0x3e,0x01,0x33,0x32,0x00,0x10,0x02,0x23,0x22,0x26,
-0x00,0x10,0x26,0x20,0x06,0x10,0x16,0x20,0x01,0x8e,0x02,0xe9,0xfd,0x17,0xb9,0xd5,
-0xd5,0xb9,0x3a,0xb1,0x7b,0xcc,0x00,0xff,0xff,0xcc,0x7b,0xb1,0x02,0x38,0xa7,0xfe,
-0xdc,0xa7,0xa7,0x01,0x24,0xa8,0xfe,0xf4,0x96,0xb0,0xb0,0x96,0x04,0xc4,0xaa,0x64,
-0x61,0xfe,0xbc,0xfd,0xf0,0xfe,0xbc,0x61,0x01,0x20,0x01,0x96,0xe7,0xe7,0xfe,0x6a,
-0xe7,0x00,0xff,0xff,0x00,0x71,0xff,0xe3,0x04,0x75,0x04,0x7b,0x10,0x06,0x00,0x52,
-0x00,0x00,0x00,0x03,0x00,0x7a,0xfe,0x56,0x04,0x76,0x06,0x2b,0x00,0x22,0x00,0x2d,
-0x00,0x35,0x00,0x00,0x05,0x26,0x27,0x26,0x27,0x35,0x16,0x17,0x16,0x17,0x11,0x26,
-0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x17,0x16,0x15,0x11,0x17,0x16,0x17,0x16,
-0x15,0x14,0x07,0x06,0x23,0x11,0x23,0x19,0x01,0x34,0x27,0x26,0x07,0x06,0x17,0x16,
-0x17,0x16,0x05,0x11,0x32,0x37,0x36,0x10,0x27,0x26,0x02,0x0d,0x47,0x42,0x5c,0x9b,
-0xc2,0x2f,0x4c,0x43,0xd6,0x58,0x65,0x78,0x5e,0x54,0x89,0x35,0x63,0x23,0xb9,0x69,
-0x6c,0x92,0x6c,0xb3,0xb8,0x45,0x22,0x28,0x49,0x05,0x03,0x39,0x27,0x01,0x28,0x5f,
-0x35,0x5e,0x43,0x45,0x18,0x04,0x0f,0x15,0x47,0xbb,0x58,0x10,0x1a,0x01,0x02,0x42,
-0x2e,0x53,0x60,0xb2,0xdc,0x82,0x67,0x01,0x02,0x34,0x60,0x83,0xfe,0x48,0x07,0x2e,
-0x6a,0x6c,0xb6,0xe1,0x79,0x5a,0xfe,0x6e,0x05,0x2c,0x01,0x93,0x5b,0x04,0x01,0x18,
-0x2e,0xbb,0x80,0x34,0x24,0xef,0xfd,0xe2,0x2b,0x49,0x01,0x14,0x3e,0x3e,0x00,0x01,
-0x00,0xae,0xff,0xe3,0x05,0x75,0x06,0x14,0x00,0x15,0x00,0x00,0x25,0x21,0x15,0x21,
-0x35,0x0e,0x01,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,
-0x11,0x33,0x04,0x58,0x01,0x1d,0xfe,0x2b,0x43,0xb1,0x75,0xc1,0xc8,0xb8,0x7c,0x7c,
-0x95,0xad,0xb8,0xaf,0xaf,0xac,0x66,0x63,0xf0,0xe7,0x04,0x5a,0xfb,0xad,0x9f,0x9f,
-0xbe,0xa4,0x02,0x7b,0x00,0x02,0x00,0xf0,0x00,0x00,0x01,0xc3,0x03,0x52,0x00,0x03,
-0x00,0x07,0x00,0x00,0x37,0x33,0x15,0x23,0x11,0x33,0x15,0x23,0xf0,0xd3,0xd3,0xd3,
-0xd3,0xfe,0xfe,0x03,0x52,0xfe,0x00,0x01,0x00,0x6c,0xff,0xe6,0x03,0xde,0x01,0x90,
-0x00,0x0d,0x00,0x00,0x13,0x33,0x16,0x17,0x16,0x37,0x36,0x37,0x15,0x06,0x07,0x06,
-0x27,0x26,0x6c,0xa7,0x2c,0x7d,0x71,0xcd,0x66,0x7e,0x9c,0xf2,0xc9,0x84,0x7c,0x01,
-0x90,0xb9,0x31,0x2d,0x2a,0x15,0x4b,0xa8,0x5d,0x15,0x11,0x61,0x5b,0x00,0x00,0x01,
-0x00,0xdb,0x00,0x00,0x02,0x00,0x01,0xec,0x00,0x05,0x00,0x00,0x21,0x23,0x35,0x13,
-0x33,0x03,0x01,0xae,0xd3,0xa4,0x81,0x52,0xac,0x01,0x40,0xfe,0xc0,0x00,0x00,0x02,
-0x00,0xfb,0x04,0xfc,0x03,0x06,0x06,0xf2,0x00,0x0a,0x00,0x1b,0x00,0x00,0x01,0x33,
-0x32,0x37,0x36,0x35,0x34,0x27,0x06,0x07,0x06,0x17,0x2b,0x01,0x35,0x33,0x11,0x33,
-0x11,0x36,0x37,0x36,0x17,0x16,0x15,0x14,0x07,0x06,0x01,0xcd,0x37,0x4d,0x17,0x35,
-0x1e,0x0f,0x39,0x33,0x17,0xaf,0x70,0x51,0x66,0x24,0x68,0x3f,0x46,0x41,0x40,0x36,
-0x05,0x62,0x0d,0x21,0x15,0x1f,0x10,0x04,0x16,0x14,0xa9,0x65,0x01,0x8f,0xfe,0xbf,
-0x49,0x28,0x18,0x1a,0x19,0x52,0x5b,0x32,0x2a,0x00,0x00,0x02,0x00,0xdb,0x00,0x00,
-0x02,0x00,0x05,0x11,0x00,0x05,0x00,0x09,0x00,0x00,0x01,0x23,0x35,0x13,0x33,0x0b,
-0x01,0x33,0x15,0x23,0x01,0xae,0xd3,0xa4,0x81,0x52,0xd3,0xd3,0xd3,0x03,0x25,0xac,
-0x01,0x40,0xfe,0xc0,0xfd,0x2d,0xfe,0x00,0x00,0x02,0x00,0x93,0x00,0x00,0x03,0xb0,
-0x05,0xf0,0x00,0x03,0x00,0x24,0x00,0x00,0x25,0x15,0x23,0x35,0x37,0x35,0x34,0x26,
-0x27,0x2e,0x01,0x2f,0x01,0x2e,0x01,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x15,0x2e,
-0x01,0x23,0x22,0x06,0x15,0x14,0x16,0x1f,0x01,0x1e,0x01,0x1d,0x01,0x02,0xbc,0xcb,
-0x06,0x06,0x06,0x08,0x27,0x2f,0x58,0x5a,0x48,0xdf,0xb8,0x67,0xc1,0x5e,0x61,0xb3,
-0x4f,0x6c,0x83,0x33,0x39,0x5a,0x5a,0x38,0xfe,0xfe,0xfe,0x93,0x7b,0x34,0x3c,0x15,
-0x19,0x35,0x2f,0x56,0x56,0x89,0x4c,0x9f,0xc2,0x38,0x39,0xbc,0x43,0x46,0x6e,0x59,
-0x31,0x5e,0x35,0x59,0x56,0x82,0x65,0x9a,0x00,0x01,0x00,0xa3,0x00,0x55,0x03,0x1e,
-0x03,0xde,0x00,0x22,0x00,0x00,0x37,0x35,0x36,0x37,0x36,0x37,0x26,0x27,0x26,0x35,
-0x34,0x37,0x36,0x37,0x36,0x33,0x32,0x17,0x15,0x26,0x07,0x06,0x07,0x06,0x17,0x14,
-0x17,0x16,0x37,0x36,0x37,0x15,0x06,0x07,0x06,0xa3,0x2f,0x53,0x44,0x34,0x8e,0x33,
-0x35,0x15,0x1e,0x67,0x63,0x62,0x6e,0x5a,0x64,0x46,0x33,0x31,0x60,0x01,0xc8,0x39,
-0x3a,0x48,0x3a,0x5a,0xcd,0xe7,0x55,0xb0,0x06,0x19,0x14,0x21,0x18,0x4c,0x4f,0x54,
-0x41,0x4b,0x76,0x3f,0x3d,0x16,0xb9,0x1f,0x02,0x01,0x1a,0x30,0x70,0x73,0x32,0x0e,
-0x0f,0x13,0x23,0xb9,0x3c,0x50,0x5a,0x00,0xff,0xff,0xff,0xb5,0x00,0x00,0x02,0x85,
-0x07,0x83,0x10,0x27,0x05,0x07,0xff,0x1d,0x01,0xc2,0x10,0x06,0x04,0xe0,0x00,0x00,
-0xff,0xff,0x00,0x6c,0x00,0x00,0x01,0xc4,0x07,0xfd,0x10,0x27,0x05,0x08,0xff,0x1d,
-0x01,0x86,0x10,0x06,0x04,0xe0,0x00,0x00,0xff,0xff,0xff,0xab,0xfe,0x32,0x03,0x43,
-0x06,0x13,0x10,0x26,0x05,0x08,0xc2,0x9c,0x10,0x06,0x04,0xfc,0x00,0x00,0xff,0xff,
-0x00,0x6c,0xfe,0x0b,0x01,0xc4,0x06,0x14,0x10,0x27,0x05,0x09,0xff,0x1d,0x00,0x00,
-0x10,0x06,0x04,0xe0,0x00,0x00,0xff,0xff,0x00,0x82,0xfe,0xf3,0x05,0xc0,0x04,0xb5,
-0x10,0x27,0x05,0x08,0xff,0xf4,0xfe,0x3e,0x10,0x06,0x04,0xfd,0x00,0x00,0x00,0x01,
-0x00,0xc1,0x00,0x00,0x01,0x79,0x06,0x14,0x00,0x03,0x00,0x00,0x13,0x33,0x11,0x23,
-0xc1,0xb8,0xb8,0x06,0x14,0xf9,0xec,0x00,0xff,0xff,0x00,0x81,0xfe,0xa2,0x06,0xeb,
-0x02,0x9d,0x10,0x26,0x05,0x18,0x00,0x00,0x10,0x07,0x0b,0xf4,0x03,0x39,0xfe,0xa2,
-0xff,0xff,0x00,0x8b,0xff,0xc6,0x03,0xa0,0x04,0x1a,0x10,0x26,0x04,0xfb,0x00,0x00,
-0x10,0x07,0x0b,0xf5,0x00,0xfa,0x03,0x84,0xff,0xff,0x00,0x81,0xff,0xeb,0x06,0xeb,
-0x03,0x20,0x10,0x26,0x05,0x18,0x00,0x00,0x10,0x07,0x0b,0xf5,0x02,0xbc,0x02,0x8a,
-0xff,0xff,0x00,0x81,0xff,0xeb,0x06,0xeb,0x04,0x1a,0x10,0x26,0x05,0x18,0x00,0x00,
-0x10,0x07,0x0b,0xf6,0x02,0xbc,0x02,0x8a,0xff,0xff,0x00,0x9d,0xfe,0x0b,0x05,0x28,
-0x03,0x67,0x10,0x26,0x04,0xe6,0x00,0x00,0x10,0x07,0x0b,0xf4,0x03,0x07,0x00,0x19,
-0x00,0x01,0x00,0x9d,0xfe,0x0b,0x05,0x28,0x03,0x67,0x00,0x1e,0x00,0x00,0x13,0x24,
-0x17,0x04,0x17,0x15,0x24,0x07,0x06,0x15,0x14,0x17,0x16,0x05,0x32,0x37,0x15,0x06,
-0x07,0x04,0x27,0x26,0x35,0x10,0x37,0x36,0x37,0x26,0x07,0x06,0x07,0x9d,0x01,0x14,
-0xc3,0x01,0x24,0xc4,0xfe,0xda,0xd7,0xe0,0x4a,0x7f,0x01,0x4b,0xc1,0xd4,0x96,0xfa,
-0xfe,0x5e,0xa9,0x83,0xd4,0x60,0x89,0x65,0x9f,0x87,0x5f,0x03,0x27,0x40,0x01,0x01,
-0x35,0x9a,0x0d,0xb4,0xbc,0xf7,0x8c,0x5b,0xa3,0x01,0x76,0xb8,0x62,0x01,0x02,0xc4,
-0x98,0xde,0x01,0x02,0xdf,0x65,0x34,0x03,0x16,0x13,0x29,0x00,0xff,0xff,0x00,0x9d,
-0xfe,0x0b,0x05,0x28,0x04,0xb0,0x10,0x26,0x04,0xe6,0x00,0x00,0x10,0x07,0x0b,0xf4,
-0x02,0x3f,0x04,0x1a,0x00,0x01,0x00,0x7d,0xff,0xda,0x03,0x1b,0x03,0x52,0x00,0x19,
-0x00,0x00,0x25,0x36,0x37,0x36,0x35,0x34,0x27,0x26,0x27,0x33,0x16,0x17,0x16,0x15,
-0x14,0x07,0x06,0x05,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x01,0x87,0xac,0x23,
-0x08,0x3c,0x42,0xad,0xe3,0x71,0x42,0x52,0x20,0x50,0xfe,0xfa,0x2e,0x2d,0x66,0x67,
-0x73,0x54,0x21,0x97,0x31,0x70,0x1b,0x2a,0x4e,0x74,0x81,0x92,0x5b,0x7c,0x98,0x69,
-0x63,0x4b,0xc2,0x29,0x07,0x26,0xb8,0x2a,0xff,0xff,0x00,0x7d,0xff,0xda,0x03,0x1b,
-0x04,0xb0,0x10,0x26,0x04,0xe8,0x00,0x00,0x10,0x07,0x0b,0xf4,0x01,0x45,0x04,0x1a,
-0x00,0x01,0xff,0xab,0xfe,0x0c,0x03,0x62,0x02,0x26,0x00,0x11,0x00,0x00,0x25,0x36,
-0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x07,0x02,0x05,0x04,0x21,0x35,0x20,0x37,0x36,
-0x02,0xa3,0x0a,0x35,0xb8,0x32,0x08,0x2e,0xfe,0xdd,0xfe,0xe4,0xfe,0xbe,0x01,0x30,
-0xcb,0xda,0x9e,0x3a,0x48,0x7e,0x88,0x76,0x84,0x52,0x3e,0xfe,0xa2,0x9b,0x97,0xb8,
-0x80,0x8a,0xff,0xff,0xff,0xab,0xfe,0x0c,0x03,0x62,0x03,0xb6,0x10,0x26,0x04,0xea,
-0x00,0x00,0x10,0x07,0x0b,0xf4,0x02,0x71,0x03,0x20,0x00,0x01,0x00,0x82,0xfe,0x0c,
-0x09,0x1a,0x02,0xee,0x00,0x3f,0x00,0x00,0x25,0x06,0x07,0x06,0x07,0x06,0x23,0x26,
-0x27,0x24,0x11,0x34,0x37,0x33,0x06,0x17,0x16,0x17,0x16,0x33,0x32,0x37,0x36,0x37,
-0x36,0x27,0x26,0x2f,0x01,0x33,0x17,0x16,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x33,
-0x14,0x17,0x16,0x33,0x32,0x19,0x01,0x33,0x11,0x14,0x07,0x06,0x07,0x06,0x23,0x22,
-0x27,0x26,0x27,0x06,0x07,0x06,0x07,0x06,0x04,0xfc,0x18,0x54,0x85,0xc1,0x50,0x78,
-0x80,0x6d,0xfe,0xed,0x69,0xb8,0x6c,0x01,0x01,0x93,0x5f,0x51,0x62,0x5f,0x79,0x5e,
-0x40,0x01,0x01,0x10,0x40,0xb8,0x24,0x10,0x1c,0x3b,0x73,0x52,0x2c,0x25,0xb8,0x13,
-0x40,0x6e,0x8e,0xb8,0x5c,0x4b,0x66,0x25,0x20,0x49,0x30,0x8a,0x11,0x31,0x5f,0x32,
-0x46,0x84,0x2c,0xb3,0x6b,0xaa,0x3e,0x1a,0x01,0x1c,0x47,0x01,0x48,0xf6,0xb4,0xce,
-0xdc,0xb3,0x26,0x18,0x25,0x30,0x9e,0x6c,0x8e,0x7d,0x3d,0xea,0x9c,0x4a,0x3c,0x81,
-0x7a,0x67,0xc2,0xcd,0x32,0xa9,0x01,0x18,0x01,0x26,0xfe,0xaa,0xc7,0x71,0x5c,0x18,
-0x09,0x19,0x46,0x7b,0x9f,0x1e,0x0f,0x03,0x06,0x00,0xff,0xff,0x00,0x82,0xfe,0x0c,
-0x09,0x1a,0x04,0xb0,0x10,0x26,0x04,0xec,0x00,0x00,0x10,0x07,0x0b,0xf6,0x04,0xe2,
-0x03,0x20,0x00,0x02,0x00,0x82,0xfe,0x0c,0x09,0x13,0x02,0xe6,0x00,0x32,0x00,0x3f,
-0x00,0x00,0x05,0x06,0x07,0x06,0x23,0x26,0x27,0x24,0x11,0x34,0x37,0x33,0x06,0x17,
-0x16,0x17,0x16,0x33,0x32,0x37,0x36,0x37,0x36,0x35,0x34,0x27,0x33,0x06,0x17,0x16,
-0x17,0x36,0x37,0x36,0x37,0x36,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x29,0x01,
-0x22,0x27,0x26,0x37,0x14,0x01,0x22,0x07,0x06,0x07,0x33,0x32,0x37,0x36,0x27,0x26,
-0x27,0x26,0x04,0x90,0x58,0xee,0x50,0x78,0x80,0x6d,0xfe,0xed,0x69,0xb8,0x6c,0x01,
-0x01,0x93,0x5f,0x51,0x66,0x5b,0xa2,0x2b,0x21,0x27,0xab,0x01,0x0e,0x0a,0x28,0x73,
-0x7b,0x7e,0x81,0x4f,0x51,0x7d,0x61,0xba,0xb8,0xca,0xfe,0xe4,0xfe,0xec,0x22,0x38,
-0x33,0x06,0x02,0xa1,0x4c,0x7e,0xa8,0x91,0xbb,0xed,0x81,0xbb,0x01,0x02,0x89,0x25,
-0xf2,0x9b,0x4d,0x1a,0x01,0x1c,0x47,0x01,0x48,0xf6,0xb4,0xce,0xdc,0xb3,0x26,0x18,
-0x25,0x44,0x8a,0x6c,0x7f,0x93,0x8a,0x0f,0x37,0x28,0x32,0x92,0x6c,0x6e,0x36,0x22,
-0x01,0x02,0x25,0x47,0xe9,0xa9,0x6d,0x78,0x1e,0x1b,0x0f,0xba,0x02,0xa9,0x51,0x6c,
-0xc2,0x3f,0x5b,0x46,0x87,0x13,0x05,0x00,0xff,0xff,0x00,0x82,0xfe,0x0c,0x09,0x13,
-0x03,0xb6,0x10,0x26,0x04,0xee,0x00,0x00,0x10,0x07,0x0b,0xf4,0x04,0xfb,0x03,0x20,
-0x00,0x02,0x00,0x90,0x00,0x00,0x06,0xdc,0x06,0x14,0x00,0x0c,0x00,0x1f,0x00,0x00,
-0x25,0x33,0x32,0x37,0x36,0x27,0x26,0x27,0x26,0x23,0x22,0x07,0x06,0x13,0x29,0x01,
-0x35,0x21,0x11,0x33,0x11,0x12,0x25,0x36,0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x06,
-0x03,0x41,0xbb,0xed,0x81,0xbb,0x01,0x02,0x89,0x25,0x30,0x50,0x7a,0xb1,0x75,0xfd,
-0xc1,0xfe,0x91,0x01,0x6f,0xb8,0xd9,0x01,0x14,0x5c,0x44,0x78,0x66,0xba,0xb8,0xca,
-0xb8,0x3f,0x5d,0x44,0x87,0x13,0x05,0x51,0x78,0xfe,0x92,0xb8,0x05,0x5c,0xfb,0x0e,
-0x01,0x3f,0x63,0x21,0x27,0x45,0xeb,0xa9,0x6d,0x78,0xff,0xff,0x00,0x90,0x00,0x00,
-0x06,0xdc,0x06,0x14,0x10,0x26,0x04,0xf0,0x00,0x00,0x10,0x07,0x0b,0xf4,0x03,0xcf,
-0x03,0x52,0x00,0x01,0x00,0x74,0xfe,0x0b,0x04,0xb2,0x04,0x2b,0x00,0x28,0x00,0x00,
-0x05,0x16,0x21,0x32,0x37,0x15,0x06,0x07,0x04,0x27,0x26,0x27,0x26,0x37,0x36,0x37,
-0x26,0x27,0x26,0x37,0x36,0x37,0x36,0x17,0x15,0x26,0x07,0x06,0x15,0x14,0x17,0x16,
-0x37,0x36,0x37,0x15,0x04,0x07,0x06,0x15,0x14,0x01,0x53,0x77,0x01,0x53,0xc1,0xd4,
-0x96,0xfa,0xfe,0x59,0xa4,0x61,0x01,0x01,0x58,0x73,0x4b,0x32,0x30,0x59,0x01,0x02,
-0xca,0x7c,0xfc,0xc3,0x74,0x5d,0x30,0x54,0x58,0x9e,0xfe,0xfe,0xef,0xec,0xd1,0xb1,
-0x9e,0x76,0xb8,0x62,0x01,0x02,0xbe,0x70,0xc8,0xb1,0x65,0x84,0x18,0x04,0x1e,0x38,
-0x82,0xc3,0x8c,0x55,0x08,0xa9,0x06,0x47,0x39,0x63,0x4b,0x19,0x2c,0x26,0x45,0x1d,
-0xb8,0x1a,0x95,0x83,0xb9,0x75,0xff,0xff,0x00,0x74,0xfe,0x0b,0x04,0xb2,0x05,0x46,
-0x10,0x26,0x04,0xf2,0x00,0x00,0x10,0x07,0x0b,0xf4,0x01,0x77,0x04,0xb0,0x00,0x01,
-0xff,0xec,0x00,0x00,0x02,0x6c,0x00,0xb8,0x00,0x03,0x00,0x00,0x23,0x35,0x21,0x15,
-0x14,0x02,0x80,0xb8,0xb8,0x00,0xff,0xff,0x00,0x81,0xff,0xa4,0x07,0x9f,0x05,0x14,
-0x10,0x26,0x05,0x2c,0x00,0x00,0x10,0x07,0x0b,0xf4,0x05,0xf5,0x04,0x7e,0xff,0xff,
-0x00,0x6b,0xfe,0x47,0x05,0x9b,0x05,0x14,0x10,0x26,0x05,0x19,0x00,0x00,0x10,0x07,
-0x0b,0xf5,0x03,0x52,0x04,0x7e,0x00,0x02,0x00,0x90,0xff,0xc8,0x05,0xc7,0x06,0x14,
-0x00,0x21,0x00,0x3d,0x00,0x00,0x01,0x15,0x06,0x07,0x06,0x15,0x14,0x17,0x16,0x17,
-0x16,0x15,0x14,0x07,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x37,0x36,0x35,0x34,
-0x27,0x26,0x27,0x26,0x37,0x36,0x37,0x36,0x01,0x36,0x19,0x01,0x33,0x11,0x10,0x07,
-0x06,0x07,0x06,0x27,0x26,0x27,0x24,0x35,0x34,0x37,0x33,0x06,0x15,0x16,0x17,0x16,
-0x33,0x32,0x37,0x36,0x03,0xd0,0x4a,0x26,0x50,0x0e,0x0c,0x44,0x66,0x58,0x52,0x4e,
-0x42,0x38,0x44,0x2d,0x3c,0x39,0x3c,0x4e,0x4a,0x12,0x20,0x01,0x02,0x4b,0x55,0x01,
-0x66,0x4c,0xb8,0x6e,0x95,0xdd,0x88,0x76,0xcf,0x65,0xfe,0xdb,0x10,0xb8,0x0e,0x02,
-0xa0,0x79,0x7f,0x8c,0x59,0x98,0x04,0x6f,0x52,0x04,0x0e,0x1e,0x21,0x1c,0x12,0x10,
-0x0a,0x0f,0x58,0x6e,0x2a,0x27,0x0b,0x58,0x0a,0x1a,0x1a,0x1e,0x26,0x11,0x10,0x1c,
-0x2f,0x2e,0x51,0x26,0x2b,0xfc,0xae,0x49,0x01,0x01,0x03,0xb1,0xfc,0x4f,0xfe,0xb9,
-0x7b,0xa7,0x1f,0x13,0x01,0x02,0x1e,0x58,0xc3,0x4b,0x35,0x3a,0x2c,0x5c,0x2e,0x23,
-0x1b,0x2f,0x00,0x01,0x00,0x8f,0xfe,0xc8,0x05,0x18,0x06,0x14,0x00,0x1b,0x00,0x00,
-0x25,0x36,0x35,0x11,0x33,0x11,0x10,0x07,0x06,0x05,0x06,0x23,0x22,0x27,0x24,0x03,
-0x26,0x37,0x33,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x04,0x12,0x4e,0xb8,
-0x62,0x79,0xfe,0xfb,0x86,0x55,0x5f,0x49,0xfe,0xdc,0x01,0x01,0x40,0xb8,0x41,0xa6,
-0x28,0x49,0x50,0x6d,0xae,0x49,0x7e,0xe3,0x04,0x6a,0xfb,0x96,0xfe,0xc3,0x90,0xb1,
-0x42,0x22,0x16,0x5c,0x01,0x11,0x8a,0x5c,0x73,0x73,0x82,0x3e,0x10,0x22,0x35,0x00,
-0x00,0x02,0x00,0x8c,0xfe,0x14,0x04,0x5e,0x02,0xf3,0x00,0x11,0x00,0x2e,0x00,0x00,
-0x01,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x27,0x26,0x23,0x22,0x07,0x06,
-0x15,0x14,0x07,0x26,0x07,0x06,0x15,0x11,0x23,0x11,0x34,0x37,0x36,0x33,0x26,0x35,
-0x34,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x23,0x06,0x02,
-0x62,0x7a,0x4c,0x2c,0x15,0x35,0x06,0x15,0x3b,0x28,0x2e,0x3b,0x1b,0x44,0x6e,0x32,
-0x4b,0x19,0xc8,0x78,0x41,0x5a,0x02,0xa2,0x4d,0x5c,0x4d,0x4f,0xb6,0x1c,0x08,0x62,
-0x78,0x58,0xb2,0x01,0x27,0x2a,0x16,0x39,0x3a,0x18,0x14,0x58,0x11,0x0c,0x1b,0x44,
-0x44,0x28,0xc1,0x1c,0x4e,0x1a,0x4f,0xfe,0x14,0x01,0xec,0xad,0x66,0x37,0x2a,0x28,
-0x94,0x84,0x3f,0x24,0x53,0xa7,0x2d,0x38,0x92,0x41,0x50,0x02,0xff,0xff,0x00,0x93,
-0xfe,0xb5,0x05,0x49,0x03,0xb6,0x10,0x26,0x05,0x31,0x00,0x00,0x10,0x07,0x0b,0xf4,
-0x02,0x3f,0x03,0x20,0x00,0x02,0x00,0x8b,0xff,0xc6,0x03,0xa0,0x02,0xde,0x00,0x0f,
-0x00,0x1f,0x00,0x00,0x01,0x22,0x07,0x06,0x17,0x16,0x17,0x16,0x33,0x32,0x37,0x36,
-0x35,0x34,0x27,0x26,0x27,0x32,0x17,0x16,0x15,0x06,0x07,0x06,0x23,0x22,0x27,0x26,
-0x35,0x34,0x37,0x36,0x01,0xbb,0x42,0x21,0x1a,0x01,0x01,0x37,0x39,0x39,0x5b,0x5d,
-0x4b,0x42,0x7b,0x98,0xc6,0xb6,0x8d,0x01,0x93,0xa5,0x84,0x60,0x51,0xa7,0x25,0x54,
-0x02,0x2a,0x57,0x45,0x7b,0x52,0x2c,0x2c,0x39,0x2e,0x55,0x4d,0x41,0x78,0xb3,0xa0,
-0x7c,0x94,0xc8,0x4b,0x55,0x23,0x4a,0xef,0xb5,0x4e,0xb9,0x00,0x00,0x02,0xff,0xab,
-0xfe,0x32,0x03,0x43,0x03,0xd9,0x00,0x1c,0x00,0x2c,0x00,0x00,0x01,0x06,0x05,0x35,
-0x36,0x37,0x24,0x11,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x33,
-0x32,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x03,0x36,0x35,0x34,0x27,0x26,0x07,
-0x06,0x07,0x06,0x07,0x14,0x17,0x16,0x33,0x32,0x01,0xb8,0xb7,0xfe,0xaa,0xfa,0xa5,
-0x01,0x4a,0x3f,0x7a,0x85,0x4b,0x62,0x08,0x17,0x96,0x4e,0x4c,0x63,0x39,0x5f,0x2f,
-0x21,0x3c,0x5c,0x5b,0x29,0x42,0x1f,0x2c,0x34,0x28,0x28,0x01,0x37,0x28,0x2a,0x48,
-0xfe,0xe6,0x8e,0x26,0xb8,0x1b,0x75,0xea,0x01,0x48,0x4b,0x43,0x57,0x81,0x34,0x2c,
-0x94,0x45,0x24,0x32,0x52,0x7f,0x59,0xad,0xcc,0x8c,0xd5,0x02,0x76,0x2b,0x4d,0x3b,
-0x33,0x19,0x01,0x01,0x2a,0x29,0x33,0x50,0x26,0x19,0x00,0x01,0x00,0x82,0xfe,0xf3,
-0x05,0xc0,0x03,0x4a,0x00,0x36,0x00,0x00,0x25,0x06,0x05,0x06,0x23,0x22,0x27,0x24,
-0x11,0x34,0x37,0x33,0x06,0x17,0x16,0x17,0x16,0x37,0x36,0x37,0x36,0x37,0x36,0x35,
-0x34,0x27,0x26,0x27,0x26,0x27,0x26,0x27,0x34,0x37,0x36,0x32,0x17,0x16,0x17,0x23,
-0x26,0x27,0x26,0x27,0x26,0x07,0x06,0x15,0x14,0x17,0x16,0x17,0x16,0x17,0x16,0x05,
-0x56,0x66,0xfe,0xa9,0xb1,0x78,0x81,0x48,0xfe,0xdb,0x3f,0xb8,0x42,0x01,0x02,0xa4,
-0x61,0x3d,0x7e,0x81,0xb1,0x54,0x3b,0x7e,0x42,0x72,0x43,0x3a,0x40,0x01,0xbe,0x5f,
-0xd0,0x60,0x8d,0x1b,0xb8,0x0d,0x42,0x28,0x45,0x4e,0x3e,0x3c,0x7d,0xf8,0x39,0x4d,
-0x02,0x01,0x0c,0xaa,0x49,0x26,0x1a,0x68,0x01,0x05,0x75,0x71,0x83,0x63,0x93,0x2d,
-0x1a,0x06,0x0b,0x18,0x21,0x50,0x38,0x35,0x4a,0x1d,0x0f,0x2e,0x1b,0x33,0x39,0x73,
-0x96,0x4a,0x25,0x2a,0x3d,0xad,0x3d,0x21,0x14,0x02,0x02,0x27,0x26,0x22,0x37,0x2a,
-0x53,0x40,0x55,0x59,0x44,0x00,0xff,0xff,0x00,0x82,0xfe,0x0c,0x05,0xc0,0x03,0x4a,
-0x10,0x26,0x04,0xfd,0x00,0x00,0x10,0x07,0x0b,0xf5,0x01,0xf4,0xfe,0x0c,0x00,0x02,
-0x00,0xdc,0x04,0xba,0x03,0x24,0x06,0x9a,0x00,0x03,0x00,0x07,0x00,0x00,0x13,0x35,
-0x25,0x15,0x01,0x35,0x25,0x15,0xdc,0x02,0x48,0xfd,0xb8,0x02,0x48,0x05,0xaa,0x6e,
-0x82,0x6e,0xfe,0x8e,0x6e,0x82,0x6e,0x00,0x00,0x02,0x00,0xdc,0x04,0xba,0x03,0x24,
-0x06,0xfd,0x00,0x26,0x00,0x35,0x00,0x00,0x01,0x36,0x37,0x26,0x27,0x26,0x35,0x34,
-0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x16,0x33,0x16,0x33,0x15,0x22,0x2f,
-0x01,0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x33,0x14,0x17,0x16,0x33,0x32,0x37,
-0x36,0x37,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x02,0x0b,
-0x25,0x15,0x21,0x17,0x6c,0x45,0x1c,0x3f,0x49,0x28,0x37,0x0c,0x13,0x0e,0x12,0x14,
-0x2f,0x14,0x34,0x1a,0x4b,0x55,0x5e,0x72,0x38,0x0f,0x5a,0x0c,0x23,0x30,0x38,0x9f,
-0x03,0x03,0x09,0x22,0x14,0x17,0x0b,0x12,0x2d,0x14,0x05,0x64,0x24,0x2a,0x07,0x0d,
-0x39,0x5e,0x57,0x34,0x15,0x27,0x36,0x4f,0x27,0x26,0x01,0x01,0x6e,0x02,0x05,0x3d,
-0x4e,0x56,0x9a,0x29,0x71,0x61,0x1a,0x4b,0xee,0x07,0x07,0x15,0x18,0x22,0x1c,0x09,
-0x0d,0x1c,0x25,0x12,0x08,0x00,0x00,0x02,0x00,0xdc,0xfe,0x16,0x03,0x24,0xff,0xf6,
-0x00,0x03,0x00,0x07,0x00,0x00,0x13,0x35,0x25,0x15,0x25,0x35,0x25,0x15,0xdc,0x02,
-0x48,0xfd,0xb8,0x02,0x48,0xfe,0x16,0x6e,0x82,0x6e,0x6e,0x6e,0x82,0x6e,0x00,0x01,
-0x00,0xdc,0x04,0xba,0x03,0x24,0x05,0xaa,0x00,0x03,0x00,0x00,0x13,0x35,0x25,0x15,
-0xdc,0x02,0x48,0x04,0xba,0x6e,0x82,0x6e,0x00,0x02,0x00,0xdc,0x04,0xb9,0x03,0x24,
-0x06,0xfd,0x00,0x1e,0x00,0x2d,0x00,0x00,0x01,0x26,0x27,0x26,0x35,0x34,0x37,0x36,
-0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x1e,0x01,0x33,0x15,0x22,0x27,0x26,0x27,0x06,
-0x07,0x06,0x23,0x35,0x32,0x37,0x36,0x37,0x36,0x37,0x36,0x35,0x34,0x26,0x23,0x22,
-0x07,0x06,0x15,0x14,0x17,0x16,0x02,0x29,0x09,0x13,0x6c,0x45,0x1c,0x3f,0x49,0x28,
-0x37,0x0e,0x11,0x24,0x14,0x23,0x20,0x1e,0x1c,0x2b,0x45,0xc8,0x93,0x98,0x8b,0x17,
-0x56,0x03,0x03,0x09,0x22,0x14,0x17,0x0b,0x12,0x2d,0x14,0x05,0xba,0x02,0x0a,0x38,
-0x5f,0x57,0x34,0x15,0x27,0x36,0x4f,0x20,0x2d,0x01,0x01,0x6e,0x02,0x02,0x03,0x3d,
-0x2a,0x7b,0x6e,0x6d,0x12,0x70,0x07,0x07,0x15,0x18,0x22,0x1c,0x09,0x0d,0x1c,0x25,
-0x12,0x08,0x00,0x01,0x00,0xdc,0xfe,0xe8,0x03,0x24,0xff,0xd8,0x00,0x03,0x00,0x00,
-0x13,0x35,0x25,0x15,0xdc,0x02,0x48,0xfe,0xe8,0x6e,0x82,0x6e,0x00,0x01,0x00,0xc8,
-0x04,0xca,0x03,0x39,0x06,0xf4,0x00,0x28,0x00,0x00,0x01,0x06,0x07,0x06,0x07,0x06,
-0x27,0x26,0x35,0x34,0x37,0x33,0x06,0x17,0x16,0x17,0x16,0x37,0x36,0x37,0x36,0x35,
-0x33,0x06,0x17,0x16,0x37,0x36,0x35,0x34,0x27,0x33,0x16,0x07,0x06,0x07,0x06,0x07,
-0x06,0x27,0x26,0x02,0x10,0x0f,0x21,0x39,0x45,0x4f,0x29,0x22,0x10,0x61,0x0d,0x02,
-0x03,0x16,0x12,0x33,0x3d,0x04,0x02,0x60,0x01,0x04,0x0d,0x4c,0x47,0x0d,0x67,0x0f,
-0x03,0x04,0x17,0x26,0x5a,0x47,0x1f,0x1b,0x05,0x84,0x4d,0x27,0x44,0x01,0x02,0x41,
-0x32,0x6f,0x6d,0x62,0x7d,0x38,0x54,0x22,0x1c,0x17,0x1a,0xa8,0x52,0x59,0x24,0x36,
-0xc5,0x02,0x01,0xad,0x73,0x39,0x49,0x74,0x85,0x36,0x58,0x0b,0x09,0x21,0x1e,0x00,
-0x00,0x02,0x00,0xec,0x04,0xe1,0x03,0x10,0x07,0x06,0x00,0x0b,0x00,0x13,0x00,0x00,
-0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x3e,0x01,0x14,0x06,0x22,
-0x26,0x34,0x36,0x32,0x02,0x96,0x58,0x40,0x41,0x57,0x57,0x41,0x40,0x58,0x7a,0x9f,
-0xe6,0x9f,0x9f,0xe6,0x05,0xf4,0x3f,0x58,0x57,0x40,0x41,0x57,0x58,0xb3,0xe6,0xa0,
-0xa0,0xe6,0x9f,0x00,0x00,0x01,0x00,0x98,0x04,0xb9,0x03,0x68,0x05,0xc1,0x00,0x13,
-0x00,0x00,0x13,0x37,0x16,0x17,0x16,0x33,0x32,0x37,0x36,0x37,0x15,0x06,0x07,0x06,
-0x23,0x22,0x27,0x26,0x27,0x07,0x98,0xa0,0x67,0x43,0x2a,0x36,0x3a,0x29,0x6b,0x58,
-0x5a,0x5a,0x43,0x35,0x22,0x4c,0x4d,0x44,0xa5,0x05,0x36,0x7b,0x53,0x15,0x0d,0x10,
-0x29,0x4c,0x7d,0x40,0x1d,0x16,0x11,0x11,0x46,0x80,0xff,0xff,0x01,0x4f,0x04,0xbe,
-0x02,0xa7,0x06,0x77,0x10,0x07,0x05,0x1a,0x00,0xd5,0xff,0x8d,0xff,0xff,0x01,0x4f,
-0xfe,0x0b,0x02,0xa7,0xff,0xc4,0x10,0x07,0x05,0x1a,0x00,0xd5,0xf8,0xda,0x00,0x01,
-0x01,0xb8,0x01,0xc2,0x02,0x94,0x02,0xbc,0x00,0x03,0x00,0x00,0x01,0x33,0x15,0x23,
-0x01,0xb8,0xdc,0xdc,0x02,0xbc,0xfa,0x00,0x00,0x01,0x01,0x16,0x00,0x00,0x02,0xbc,
-0x05,0x14,0x00,0x09,0x00,0x00,0x21,0x23,0x10,0x27,0x02,0x03,0x33,0x12,0x13,0x16,
-0x02,0xbc,0xb4,0x25,0x31,0x9c,0xc4,0x79,0x49,0x20,0x01,0xa9,0xdc,0x01,0x21,0x01,
-0x6e,0xfe,0xdd,0xfe,0x94,0x9b,0x00,0x01,0x00,0x52,0x00,0x00,0x03,0xf0,0x05,0x14,
-0x00,0x18,0x00,0x00,0x01,0x16,0x17,0x16,0x11,0x23,0x10,0x27,0x02,0x03,0x33,0x16,
-0x17,0x16,0x33,0x16,0x37,0x36,0x37,0x33,0x06,0x07,0x02,0x23,0x22,0x01,0xa6,0x1b,
-0x17,0x20,0xb4,0x25,0x31,0x9c,0xc7,0x42,0x03,0x52,0xb4,0x7b,0x36,0x1f,0x08,0xb4,
-0x08,0x29,0x63,0xf3,0x6f,0x03,0x61,0x6a,0x72,0x9b,0xfe,0x16,0x01,0xa9,0xdc,0x01,
-0x21,0x01,0x6e,0x9b,0x05,0x98,0x02,0x95,0x55,0x50,0x79,0x6d,0xfe,0xfa,0x00,0x01,
-0x00,0x4c,0x00,0x00,0x04,0x12,0x05,0x14,0x00,0x25,0x00,0x00,0x01,0x16,0x17,0x16,
-0x11,0x23,0x10,0x27,0x02,0x03,0x33,0x16,0x17,0x16,0x37,0x36,0x37,0x36,0x35,0x33,
-0x14,0x17,0x16,0x17,0x16,0x37,0x36,0x35,0x33,0x10,0x07,0x06,0x23,0x22,0x27,0x06,
-0x07,0x06,0x01,0xab,0x18,0x0f,0x20,0xb4,0x25,0x31,0x9c,0xc4,0x2f,0x28,0x14,0x2f,
-0x48,0x08,0x06,0xb4,0x0e,0x16,0x2f,0x3b,0x0f,0x0d,0xb4,0x27,0x47,0x9b,0x85,0x20,
-0x34,0x34,0x2e,0x03,0x35,0x57,0x59,0xbe,0xfe,0x39,0x01,0xa9,0xdc,0x01,0x21,0x01,
-0x6e,0x72,0x7c,0x3e,0x08,0x0c,0x40,0x32,0xa6,0xde,0x19,0x25,0x02,0x02,0x2c,0x2a,
-0xca,0xfe,0xcf,0x3b,0x6c,0x3e,0x33,0x0c,0x0a,0x00,0x00,0x01,0x00,0xaf,0xff,0xec,
-0x03,0xa7,0x05,0x20,0x00,0x2a,0x00,0x00,0x01,0x15,0x06,0x07,0x06,0x15,0x14,0x17,
-0x16,0x17,0x15,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x17,0x32,0x37,0x36,0x37,0x15,
-0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x26,0x27,0x26,0x27,
-0x26,0x37,0x36,0x03,0x23,0x7a,0x66,0x88,0x5c,0x4d,0x4f,0x59,0x87,0x70,0x30,0x3b,
-0x4a,0x63,0x58,0x7e,0x56,0x49,0x7c,0x65,0x65,0x95,0x70,0x64,0x6b,0x41,0x58,0x48,
-0x2c,0x37,0x01,0x02,0xe2,0x70,0x05,0x20,0xa8,0x11,0x34,0x43,0x40,0x23,0x39,0x30,
-0x04,0xa4,0x4c,0x40,0x72,0x52,0x3c,0x4a,0x01,0x17,0x21,0x2b,0xc4,0x25,0x1c,0x17,
-0x7d,0x70,0xa5,0x86,0x80,0x4c,0x18,0x20,0x30,0x3a,0x3f,0x96,0x80,0x3f,0x00,0x02,
-0x00,0x87,0xff,0xec,0x03,0xc5,0x05,0x25,0x00,0x0d,0x00,0x1c,0x00,0x00,0x00,0x22,
-0x07,0x06,0x07,0x06,0x17,0x16,0x32,0x37,0x36,0x27,0x26,0x27,0x03,0x16,0x13,0x16,
-0x15,0x10,0x07,0x06,0x20,0x27,0x26,0x11,0x34,0x37,0x12,0x02,0x69,0x86,0x56,0x4e,
-0x04,0x04,0x47,0x29,0xfe,0x29,0x47,0x04,0x04,0x4e,0x99,0xbf,0x86,0x5a,0x55,0x69,
-0xfe,0x3e,0x69,0x55,0x5a,0x87,0x04,0x68,0xd4,0xc0,0xae,0xc7,0x73,0x42,0x42,0x73,
-0xc7,0xae,0xc0,0x01,0x90,0x01,0xfe,0xa1,0xeb,0xb3,0xfe,0xcb,0x75,0x90,0x90,0x75,
-0x01,0x35,0xb3,0xeb,0x01,0x61,0x00,0x01,0x00,0x55,0x00,0x00,0x03,0xf2,0x05,0x14,
-0x00,0x11,0x00,0x00,0x01,0x10,0x13,0x12,0x13,0x23,0x02,0x03,0x02,0x27,0x06,0x23,
-0x22,0x27,0x35,0x16,0x33,0x32,0x03,0x4e,0x25,0x1d,0x62,0xc4,0x55,0x1f,0x1c,0x02,
-0x60,0x8e,0xb2,0xa7,0xb4,0xa5,0xd2,0x05,0x14,0xfe,0xdc,0xfe,0x9f,0xfe,0xeb,0xfe,
-0x86,0x01,0x44,0x01,0x4b,0x01,0x2a,0x91,0x1c,0x32,0xb4,0x32,0x00,0x01,0x00,0x3c,
-0x00,0x00,0x04,0x10,0x05,0x14,0x00,0x12,0x00,0x00,0x21,0x26,0x03,0x02,0x27,0x33,
-0x12,0x13,0x16,0x17,0x36,0x37,0x12,0x13,0x33,0x02,0x03,0x02,0x07,0x01,0xcc,0x11,
-0x62,0x9f,0x7e,0xc4,0x9a,0x5a,0x30,0x02,0x02,0x30,0x5a,0x9a,0xc4,0xa5,0x78,0x55,
-0x1e,0xf6,0x01,0x3a,0x01,0xfe,0xe6,0xfe,0xca,0xfe,0xc5,0xa8,0x0b,0x0b,0xa8,0x01,
-0x3b,0x01,0x36,0xfe,0xd3,0xfe,0x49,0xfe,0xca,0xfa,0x00,0x01,0x00,0x3c,0x00,0x00,
-0x04,0x10,0x05,0x14,0x00,0x12,0x00,0x00,0x01,0x33,0x16,0x13,0x12,0x13,0x23,0x02,
-0x03,0x26,0x27,0x06,0x07,0x02,0x03,0x23,0x36,0x13,0x12,0x01,0xcc,0xb4,0x1e,0x55,
-0x78,0xa5,0xc4,0x9a,0x5a,0x30,0x02,0x02,0x30,0x5a,0x9a,0xc4,0x7e,0x9f,0x62,0x05,
-0x14,0xfa,0xfe,0xca,0xfe,0x49,0xfe,0xd3,0x01,0x36,0x01,0x3b,0xa8,0x0b,0x0b,0xa8,
-0xfe,0xc5,0xfe,0xca,0xe6,0x01,0xfe,0x01,0x3a,0x00,0x00,0x02,0x00,0x63,0x00,0x00,
-0x03,0xf2,0x05,0x1f,0x00,0x14,0x00,0x23,0x00,0x00,0x01,0x26,0x27,0x26,0x27,0x26,
-0x27,0x26,0x37,0x36,0x17,0x16,0x17,0x16,0x17,0x16,0x17,0x12,0x13,0x23,0x02,0x03,
-0x27,0x26,0x27,0x26,0x23,0x22,0x07,0x06,0x17,0x16,0x17,0x16,0x17,0x16,0x02,0xbf,
-0xce,0x3d,0xa5,0x42,0x66,0x03,0x03,0x62,0x7f,0x91,0x9a,0x5c,0x81,0x0d,0x0a,0x12,
-0x25,0x5a,0xc4,0x5b,0x24,0x08,0x0a,0x22,0x38,0x6b,0x4d,0x3b,0x39,0x01,0x01,0x3b,
-0x22,0x4c,0x4f,0x02,0x55,0x03,0x0f,0x29,0x41,0x65,0x7b,0x8e,0x62,0x7e,0x01,0x01,
-0x54,0x76,0xa7,0x87,0x96,0xfe,0xcd,0xfe,0xa4,0x01,0x9c,0x01,0x6e,0x57,0x6c,0x3c,
-0x61,0x37,0x36,0x47,0x39,0x36,0x1f,0x0d,0x0e,0x00,0x00,0x03,0x00,0x85,0x00,0x00,
-0x03,0xc7,0x05,0x14,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x00,0x25,0x33,0x15,0x23,
-0x01,0x33,0x15,0x23,0x25,0x33,0x01,0x23,0x03,0x04,0xb4,0xb4,0xfd,0x8f,0xb4,0xb4,
-0x02,0x94,0xa0,0xfd,0x5e,0xa0,0xfa,0xfa,0x05,0x14,0xfa,0xfa,0xfa,0xec,0x00,0x01,
-0x00,0x00,0xff,0x1f,0x02,0x66,0x02,0x8b,0x00,0x11,0x00,0x00,0x15,0x36,0x37,0x36,
-0x37,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x07,0xa9,0x70,
-0x6b,0x2f,0x1a,0x16,0x96,0x19,0x4c,0x4f,0xa5,0x69,0xbd,0x46,0x05,0x71,0x6d,0x8f,
-0x50,0x4f,0x60,0x60,0x4e,0x6f,0xaa,0xa0,0xa6,0x71,0x48,0x06,0x00,0x01,0x00,0xb2,
-0x03,0xfe,0x01,0xd7,0x05,0xd5,0x00,0x05,0x00,0x00,0x01,0x33,0x15,0x03,0x23,0x13,
-0x01,0x04,0xd3,0xa4,0x81,0x52,0x05,0xd5,0x98,0xfe,0xc1,0x01,0x3f,0x00,0x00,0x01,
-0x00,0x57,0x00,0xce,0x04,0x05,0x04,0x4c,0x00,0x09,0x00,0x00,0x13,0x21,0x1b,0x01,
-0x21,0x05,0x13,0x25,0x05,0x13,0x57,0x01,0x67,0x70,0x70,0x01,0x67,0xfe,0xde,0x6f,
-0xfe,0xdc,0xfe,0xdc,0x6f,0x02,0xf7,0x01,0x55,0xfe,0xab,0xd4,0xfe,0xab,0xd3,0xd3,
-0x01,0x55,0x00,0x01,0x00,0x81,0xff,0xeb,0x06,0xeb,0x02,0x9d,0x00,0x1d,0x00,0x00,
-0x01,0x16,0x15,0x14,0x07,0x06,0x05,0x04,0x23,0x06,0x27,0x24,0x03,0x26,0x37,0x33,
-0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x25,0x24,0x37,0x36,0x35,0x26,0x27,0x06,0xdc,
-0x0f,0x4c,0x80,0xfe,0xc3,0xfe,0xe3,0xb9,0xbf,0x81,0xfe,0xb7,0x01,0x01,0x40,0xb8,
-0x41,0xcb,0x68,0x97,0xb9,0x01,0x09,0x00,0xff,0x43,0x37,0x01,0x18,0x02,0x9d,0x5a,
-0x46,0x87,0x65,0xaa,0x41,0x3a,0x02,0x28,0x65,0x01,0x08,0x8a,0x5c,0x5e,0x88,0x7d,
-0x43,0x22,0x39,0x36,0x71,0x5d,0x4b,0x3b,0x3d,0x00,0x00,0x02,0x00,0x6b,0xfe,0x47,
-0x05,0x9b,0x03,0xd9,0x00,0x0f,0x00,0x38,0x00,0x00,0x01,0x36,0x35,0x34,0x27,0x26,
-0x07,0x06,0x07,0x06,0x07,0x14,0x17,0x16,0x33,0x32,0x01,0x32,0x37,0x24,0x11,0x06,
-0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x16,
-0x15,0x14,0x07,0x06,0x07,0x06,0x25,0x26,0x27,0x26,0x35,0x34,0x37,0x33,0x06,0x07,
-0x06,0x17,0x16,0x04,0xa8,0x29,0x42,0x1f,0x2c,0x34,0x28,0x28,0x01,0x37,0x28,0x2a,
-0x48,0xfd,0x80,0xf0,0xa2,0x01,0x4a,0x3f,0x7a,0x85,0x4b,0x62,0x08,0x17,0x96,0x4e,
-0x4c,0x63,0x39,0x67,0x27,0x21,0x3c,0x5c,0xf3,0xce,0xfe,0xce,0xd3,0x85,0x4d,0x52,
-0xb7,0x55,0x03,0x01,0x0c,0x35,0x02,0x19,0x2b,0x4d,0x3b,0x33,0x19,0x01,0x01,0x2a,
-0x29,0x33,0x50,0x26,0x19,0xfd,0x06,0x73,0xea,0x01,0x48,0x4b,0x43,0x57,0x81,0x34,
-0x2c,0x94,0x45,0x24,0x32,0x5a,0x77,0x66,0xa0,0xcc,0x8c,0xd5,0xbd,0x9f,0x01,0x01,
-0xbf,0x6e,0xae,0xb4,0xd8,0xb9,0x9b,0x3c,0x34,0xe5,0x00,0x01,0x00,0x7a,0x05,0x31,
-0x01,0xd2,0x06,0xea,0x00,0x18,0x00,0x00,0x13,0x37,0x26,0x27,0x26,0x35,0x36,0x37,
-0x36,0x17,0x16,0x17,0x15,0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x37,0x15,
-0x05,0x7a,0x4e,0x2c,0x10,0x10,0x03,0x35,0x38,0x5e,0x3e,0x34,0x32,0x40,0x42,0x11,
-0x1d,0x5e,0x21,0x78,0xfe,0xa9,0x05,0x96,0x12,0x14,0x24,0x25,0x2d,0x5f,0x2c,0x2e,
-0x01,0x01,0x20,0x64,0x21,0x12,0x20,0x1a,0x4d,0x1b,0x0a,0x1d,0x66,0x4d,0xff,0xff,
-0x00,0x81,0xff,0xeb,0x06,0xeb,0x04,0x9a,0x10,0x26,0x05,0x18,0x00,0x00,0x10,0x07,
-0x04,0xd7,0x01,0x84,0xfd,0xa8,0xff,0xff,0x00,0x81,0xff,0xeb,0x06,0xeb,0x04,0x1a,
-0x10,0x26,0x05,0x18,0x00,0x00,0x10,0x07,0x0b,0xf8,0x03,0x39,0x03,0x84,0xff,0xff,
-0x00,0x81,0xfe,0x0c,0x06,0xeb,0x02,0x9d,0x10,0x26,0x05,0x18,0x00,0x00,0x10,0x07,
-0x0b,0xf8,0x03,0x39,0xff,0x06,0xff,0xff,0x00,0x81,0xfe,0x90,0x06,0xeb,0x03,0x20,
-0x10,0x26,0x05,0x18,0x00,0x00,0x10,0x27,0x0b,0xf5,0x02,0xbc,0x02,0x8a,0x10,0x07,
-0x0c,0x05,0x02,0xa9,0xfe,0x90,0xff,0xff,0x00,0x81,0xff,0xeb,0x06,0xeb,0x03,0xb6,
-0x10,0x26,0x05,0x18,0x00,0x00,0x10,0x07,0x0b,0xf7,0x02,0xbc,0x03,0x20,0xff,0xff,
-0x00,0x81,0xfe,0x0c,0x06,0xeb,0x02,0x9d,0x10,0x26,0x05,0x18,0x00,0x00,0x10,0x07,
-0x0b,0xf7,0x02,0xbc,0xff,0x06,0xff,0xff,0x00,0x81,0xff,0xeb,0x06,0xeb,0x04,0x1a,
-0x10,0x26,0x05,0x18,0x00,0x00,0x10,0x07,0x0b,0xf9,0x02,0xbc,0x03,0x84,0xff,0xff,
-0x00,0x81,0xfe,0x0c,0x06,0xeb,0x02,0x9d,0x10,0x26,0x05,0x18,0x00,0x00,0x10,0x07,
-0x0b,0xf9,0x02,0xbc,0xff,0x06,0xff,0xff,0x00,0x9d,0xfe,0x0b,0x05,0x28,0x05,0xaf,
-0x10,0x26,0x04,0xe6,0x00,0x00,0x10,0x07,0x05,0x08,0x00,0x8a,0xff,0x38,0xff,0xff,
-0x00,0x9d,0xfe,0x0b,0x05,0x28,0x05,0xaa,0x10,0x26,0x04,0xe6,0x00,0x00,0x10,0x07,
-0x0b,0xf8,0x02,0x3f,0x05,0x14,0xff,0xff,0x00,0x9d,0xfe,0x0b,0x05,0x28,0x03,0x67,
-0x10,0x26,0x04,0xe6,0x00,0x00,0x10,0x07,0x0b,0xf5,0x02,0x8a,0x00,0x19,0xff,0xff,
-0x00,0x9d,0xfe,0x0b,0x05,0x28,0x03,0x67,0x10,0x26,0x04,0xe6,0x00,0x00,0x10,0x07,
-0x0b,0xf8,0x03,0x07,0x00,0xaf,0xff,0xff,0x00,0x9d,0xfe,0x0b,0x05,0x28,0x05,0xaa,
-0x10,0x26,0x04,0xe6,0x00,0x00,0x10,0x07,0x0b,0xf6,0x01,0xc2,0x04,0x1a,0xff,0xff,
-0x00,0x9d,0xfe,0x0b,0x05,0x28,0x03,0x67,0x10,0x26,0x04,0xe6,0x00,0x00,0x10,0x07,
-0x0b,0xf7,0x02,0x96,0x00,0x96,0xff,0xff,0x00,0x9d,0xfe,0x0b,0x05,0x28,0x03,0x67,
-0x10,0x26,0x04,0xe6,0x00,0x00,0x10,0x07,0x0b,0xf9,0x02,0x96,0x00,0xaf,0xff,0xff,
-0xff,0xab,0xfe,0x0c,0x03,0xc2,0x05,0x30,0x10,0x27,0x04,0xd7,0x00,0xbc,0xfe,0x3e,
-0x10,0x06,0x04,0xea,0x00,0x00,0xff,0xff,0xff,0xab,0xfe,0x0c,0x03,0x84,0x04,0xb0,
-0x10,0x26,0x04,0xea,0x00,0x00,0x10,0x07,0x0b,0xf6,0x01,0xf4,0x03,0x20,0x00,0x02,
-0x00,0x81,0xff,0xa4,0x07,0x9f,0x03,0xd9,0x00,0x0f,0x00,0x3a,0x00,0x00,0x01,0x36,
-0x35,0x34,0x27,0x26,0x07,0x06,0x07,0x06,0x07,0x14,0x17,0x16,0x33,0x32,0x13,0x06,
-0x05,0x04,0x21,0x20,0x27,0x24,0x03,0x26,0x37,0x33,0x06,0x15,0x14,0x17,0x16,0x21,
-0x20,0x37,0x36,0x37,0x36,0x37,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x37,
-0x36,0x33,0x32,0x17,0x16,0x17,0x16,0x07,0x06,0x06,0xb5,0x29,0x42,0x1f,0x2c,0x34,
-0x28,0x28,0x01,0x37,0x28,0x2a,0x48,0xb3,0x6e,0xfe,0xc3,0xfe,0xef,0xfe,0xe1,0xfe,
-0xd9,0x82,0xfe,0xb7,0x01,0x01,0x40,0xb8,0x41,0xcb,0x5a,0x01,0x18,0x01,0x41,0xd1,
-0xd7,0x64,0x23,0x14,0x3f,0x7a,0x85,0x4b,0x62,0x08,0x17,0x96,0x4e,0x4c,0x5a,0x42,
-0x60,0x2e,0x18,0x01,0x02,0x02,0x19,0x2b,0x4d,0x3b,0x33,0x19,0x01,0x01,0x2a,0x29,
-0x33,0x50,0x26,0x19,0xfe,0xda,0xb4,0x46,0x3d,0x29,0x64,0x01,0x09,0x8a,0x5c,0x5e,
-0x88,0x74,0x4c,0x22,0x39,0x3b,0x6c,0x26,0x4e,0x4b,0x43,0x57,0x81,0x34,0x2c,0x94,
-0x45,0x24,0x32,0x48,0x66,0x36,0x89,0xe2,0xff,0xff,0x00,0x81,0xff,0xa4,0x07,0x9f,
-0x06,0x0e,0x10,0x26,0x05,0x2c,0x00,0x00,0x10,0x07,0x0b,0xf6,0x05,0x78,0x04,0x7e,
-0xff,0xff,0x00,0x81,0xff,0xa4,0x07,0x9f,0x06,0x0e,0x10,0x26,0x05,0x2c,0x00,0x00,
-0x10,0x07,0x0b,0xf9,0x05,0x78,0x05,0x78,0x00,0x01,0x00,0x81,0xff,0xa6,0x07,0x29,
-0x06,0x14,0x00,0x2d,0x00,0x00,0x25,0x36,0x37,0x36,0x37,0x36,0x35,0x34,0x27,0x01,
-0x26,0x35,0x34,0x37,0x36,0x37,0x01,0x15,0x05,0x06,0x07,0x06,0x15,0x14,0x17,0x01,
-0x16,0x15,0x14,0x07,0x06,0x05,0x06,0x07,0x06,0x27,0x24,0x03,0x26,0x37,0x33,0x06,
-0x15,0x14,0x17,0x16,0x03,0x02,0xb8,0xc2,0x9b,0x26,0x10,0x36,0xfe,0xca,0x32,0x0a,
-0x23,0x64,0x02,0xe9,0xfd,0xad,0x47,0x15,0x06,0x1f,0x01,0x13,0x66,0x3e,0x36,0xfe,
-0xf8,0xe3,0xa1,0xc0,0x80,0xfe,0xb7,0x01,0x01,0x40,0xb8,0x41,0xcb,0x68,0x58,0x02,
-0x4e,0x3e,0x3a,0x1a,0x2e,0x45,0x42,0x01,0x7c,0x3d,0x51,0x23,0x21,0x77,0x2a,0x01,
-0x36,0xba,0xfa,0x1e,0x28,0x0b,0x19,0x20,0x25,0xfe,0xb6,0x7b,0x7b,0x71,0x65,0x58,
-0x53,0x47,0x02,0x02,0x28,0x65,0x01,0x08,0x8a,0x5c,0x5e,0x88,0x7d,0x43,0x23,0x00,
-0xff,0xff,0x00,0x81,0xff,0xa6,0x07,0x29,0x07,0x2b,0x10,0x26,0x05,0x2f,0x00,0x00,
-0x10,0x07,0x0c,0x18,0x03,0xca,0x00,0x00,0x00,0x01,0x00,0x93,0xfe,0xb5,0x05,0x49,
-0x02,0xee,0x00,0x1d,0x00,0x00,0x01,0x16,0x07,0x06,0x07,0x06,0x23,0x22,0x27,0x24,
-0x11,0x34,0x37,0x33,0x06,0x15,0x16,0x17,0x16,0x33,0x32,0x37,0x36,0x37,0x36,0x35,
-0x34,0x27,0x33,0x16,0x05,0x48,0x01,0x65,0x70,0xf7,0x61,0x50,0x84,0x6d,0xfe,0xb8,
-0x2f,0xb8,0x31,0x01,0xc8,0x5a,0x60,0x4c,0x47,0xc1,0x4c,0x22,0x66,0xb8,0x67,0x01,
-0x38,0xad,0xb2,0xc5,0x44,0x1b,0x25,0x6a,0x01,0x64,0xeb,0x51,0x90,0xac,0xed,0x34,
-0x18,0x14,0x35,0xde,0x62,0x60,0xb8,0xde,0x9c,0x00,0xff,0xff,0x00,0x9d,0xfe,0x0b,
-0x05,0x28,0x04,0xb0,0x10,0x27,0x0b,0xf7,0x02,0x96,0x00,0x96,0x10,0x26,0x04,0xe6,
-0x00,0x00,0x10,0x07,0x0b,0xf4,0x02,0x3f,0x04,0x1a,0xff,0xff,0x00,0x82,0xfe,0xf3,
-0x05,0xc0,0x03,0x4a,0x10,0x06,0x04,0xfd,0x00,0x00,0xff,0xff,0x01,0xb8,0x01,0xc2,
-0x02,0x94,0x02,0xbc,0x10,0x06,0x05,0x0a,0x00,0x00,0xff,0xff,0x01,0x16,0x00,0x00,
-0x02,0xbc,0x05,0x14,0x10,0x06,0x05,0x0b,0x00,0x00,0xff,0xff,0x00,0x52,0x00,0x00,
-0x03,0xf0,0x05,0x14,0x10,0x06,0x05,0x0c,0x00,0x00,0xff,0xff,0x00,0x4c,0x00,0x00,
-0x04,0x12,0x05,0x14,0x10,0x06,0x05,0x0d,0x00,0x00,0x00,0x01,0x00,0x52,0x00,0x00,
-0x03,0xc5,0x05,0x25,0x00,0x27,0x00,0x00,0x01,0x26,0x35,0x34,0x37,0x36,0x33,0x32,
-0x17,0x15,0x26,0x07,0x06,0x07,0x06,0x15,0x14,0x17,0x16,0x37,0x36,0x37,0x15,0x06,
-0x23,0x22,0x27,0x16,0x17,0x16,0x11,0x23,0x10,0x27,0x02,0x03,0x33,0x16,0x17,0x16,
-0x01,0xc8,0x04,0x58,0x5c,0x6c,0x54,0x58,0x5c,0x44,0x38,0x1e,0x1f,0x19,0x2f,0x30,
-0x45,0x8d,0xc3,0x3d,0x8d,0x92,0x1b,0x17,0x20,0xb4,0x25,0x31,0x9c,0xc7,0x42,0x03,
-0x1b,0x04,0x14,0x0f,0x13,0x78,0x3a,0x3d,0x19,0x9c,0x24,0x02,0x01,0x21,0x22,0x15,
-0x34,0x15,0x27,0x02,0x02,0x11,0xb4,0x1a,0x51,0x6a,0x72,0x9b,0xfe,0x16,0x01,0xa9,
-0xdc,0x01,0x21,0x01,0x6e,0x9b,0x05,0x38,0x00,0x02,0x00,0x6a,0xff,0xf4,0x03,0xe3,
-0x05,0x24,0x00,0x14,0x00,0x28,0x00,0x00,0x01,0x16,0x33,0x32,0x37,0x36,0x35,0x34,
-0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x17,0x06,0x27,
-0x26,0x27,0x26,0x35,0x10,0x37,0x12,0x33,0x32,0x13,0x16,0x13,0x16,0x07,0x06,0x07,
-0x06,0x02,0x80,0x2d,0x32,0x21,0x13,0x1b,0x57,0x5a,0x57,0x58,0x5a,0x56,0x1b,0x0f,
-0x25,0x32,0x2d,0x5a,0x28,0x91,0xa0,0x2e,0x35,0x5f,0xb3,0xaa,0xa1,0xbc,0x5e,0x01,
-0x01,0x36,0x33,0x9b,0x91,0x01,0x5a,0xa1,0x4a,0x6b,0x56,0xd7,0xd8,0xe0,0xe0,0xd5,
-0xda,0x3c,0x85,0x4a,0xa1,0xd0,0x97,0x02,0x02,0x9c,0xb5,0x7c,0x01,0x26,0xc4,0x01,
-0x76,0xfe,0x8a,0xbb,0xfe,0xd1,0x8d,0xa4,0x9d,0x01,0x02,0x00,0x00,0x01,0x00,0xd0,
-0x00,0x00,0x03,0x90,0x05,0x20,0x00,0x20,0x00,0x00,0x33,0x12,0x37,0x36,0x37,0x22,
-0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x17,0x15,0x26,0x23,0x22,0x07,0x06,0x15,
-0x14,0x17,0x16,0x33,0x32,0x37,0x15,0x06,0x07,0x06,0x07,0xd0,0x41,0x6f,0x44,0x64,
-0x4e,0x2e,0x86,0x62,0x70,0x8c,0x78,0x58,0x57,0x73,0x3e,0x30,0x42,0x37,0x2c,0x67,
-0x8c,0x60,0xe1,0x70,0x86,0x35,0x00,0xff,0xb5,0x6f,0x55,0x25,0x6d,0x97,0xaf,0x60,
-0x6d,0x02,0x02,0x21,0xb4,0x33,0x2f,0x41,0x62,0x4d,0x33,0x29,0x29,0xb4,0x49,0x98,
-0xb7,0xe1,0xff,0xff,0x00,0x3c,0x00,0x00,0x04,0x10,0x05,0x14,0x10,0x06,0x05,0x11,
-0x00,0x00,0xff,0xff,0x00,0x3c,0x00,0x00,0x04,0x10,0x05,0x14,0x10,0x06,0x05,0x12,
-0x00,0x00,0xff,0xff,0x00,0x63,0x00,0x00,0x03,0xf2,0x05,0x1f,0x10,0x06,0x05,0x13,
-0x00,0x00,0x00,0x03,0x00,0x7b,0xff,0xe3,0x07,0x6f,0x04,0x7b,0x00,0x2c,0x00,0x33,
-0x00,0x3e,0x00,0x00,0x25,0x0e,0x01,0x23,0x22,0x00,0x3d,0x01,0x21,0x2e,0x01,0x23,
-0x22,0x06,0x07,0x35,0x3e,0x01,0x33,0x32,0x16,0x17,0x3e,0x01,0x33,0x32,0x16,0x15,
-0x14,0x06,0x23,0x21,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x15,0x0e,0x01,0x23,0x22,
-0x26,0x01,0x1e,0x01,0x33,0x32,0x36,0x37,0x25,0x32,0x36,0x35,0x34,0x26,0x23,0x22,
-0x06,0x1d,0x01,0x04,0x07,0x4a,0xd4,0x84,0xe2,0xfe,0xf8,0x03,0x4e,0x0c,0xcc,0xb7,
-0x68,0xc8,0x64,0x64,0xd0,0x6a,0xa7,0xf8,0x4d,0x49,0xd8,0x8f,0xbd,0xd2,0xfd,0xfb,
-0xfe,0xfe,0xa7,0x97,0x60,0xb6,0x54,0x65,0xbe,0x5a,0x8e,0xd5,0xfc,0xf7,0x01,0xa5,
-0x89,0x99,0xb9,0x0e,0x01,0x69,0xdf,0xac,0x81,0x6f,0x99,0xb9,0x9b,0x5a,0x5e,0x01,
-0x23,0xfa,0x5a,0xbf,0xc8,0x35,0x35,0xae,0x2a,0x2c,0x79,0x77,0x78,0x78,0xbb,0xa8,
-0xbd,0xc0,0x12,0x7f,0x8b,0x2e,0x2e,0xaa,0x27,0x27,0x60,0x01,0x87,0x97,0xb4,0xae,
-0x9e,0x60,0x66,0x7b,0x62,0x73,0xd9,0xb4,0x29,0x00,0x00,0x01,0x00,0x82,0xff,0xe3,
-0x03,0xc5,0x04,0x7c,0x00,0x31,0x00,0x00,0x01,0x16,0x17,0x16,0x15,0x14,0x07,0x06,
-0x23,0x22,0x26,0x27,0x35,0x16,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x26,
-0x2b,0x01,0x35,0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x07,
-0x35,0x36,0x37,0x36,0x33,0x32,0x04,0x15,0x14,0x06,0x02,0xbf,0x70,0x3c,0x3c,0x72,
-0x71,0xc4,0x4c,0xaa,0x62,0x61,0x50,0x51,0x47,0x77,0x45,0x46,0x44,0x43,0x74,0x9b,
-0x94,0x89,0x48,0x4e,0x54,0x55,0x97,0x5d,0x55,0x55,0x47,0x5a,0x54,0x55,0x50,0xee,
-0x01,0x02,0x8a,0x02,0x03,0x18,0x41,0x40,0x5d,0x8d,0x4f,0x4e,0x18,0x18,0xa7,0x1d,
-0x0d,0x0d,0x2e,0x2e,0x40,0x46,0x2d,0x2c,0x98,0x33,0x38,0x58,0x5a,0x38,0x38,0x12,
-0x13,0x25,0xab,0x1c,0x0e,0x0e,0xb6,0xad,0x6c,0x92,0x00,0x02,0x00,0xc1,0xfe,0x4c,
-0x01,0x79,0x04,0x60,0x00,0x03,0x00,0x07,0x00,0x00,0x13,0x33,0x11,0x23,0x11,0x35,
-0x33,0x15,0xc1,0xb8,0xb8,0xb8,0x04,0x60,0xfb,0xa0,0xfe,0x4c,0xe9,0xe9,0x00,0x03,
-0x00,0x71,0xff,0xe3,0x07,0xc3,0x04,0x7b,0x00,0x20,0x00,0x27,0x00,0x32,0x00,0x00,
-0x13,0x35,0x21,0x2e,0x01,0x23,0x22,0x06,0x07,0x35,0x3e,0x01,0x33,0x32,0x16,0x17,
-0x3e,0x01,0x33,0x32,0x00,0x11,0x10,0x00,0x23,0x22,0x26,0x27,0x0e,0x01,0x23,0x22,
-0x00,0x37,0x1e,0x01,0x33,0x32,0x36,0x37,0x01,0x32,0x36,0x10,0x26,0x23,0x22,0x06,
-0x15,0x14,0x16,0x71,0x03,0x4e,0x0c,0xcc,0xb7,0x6a,0xc8,0x62,0x64,0xd0,0x6a,0xa0,
-0xf2,0x51,0x47,0xd1,0x8c,0xf1,0x01,0x11,0xfe,0xef,0xf1,0x8c,0xd3,0x42,0x4e,0xe8,
-0x8f,0xe2,0xfe,0xf8,0xb9,0x02,0xa4,0x89,0x99,0xb9,0x0e,0x02,0x08,0x94,0xac,0xab,
-0x95,0x93,0xac,0xac,0x02,0x00,0x5a,0xbe,0xc7,0x34,0x34,0xae,0x2a,0x2c,0x6e,0x6d,
-0x6e,0x6d,0xfe,0xc7,0xfe,0xed,0xfe,0xec,0xfe,0xc8,0x6f,0x6c,0x6b,0x70,0x01,0x23,
-0xc4,0x98,0xb3,0xae,0x9e,0xfe,0xb4,0xe7,0x01,0x92,0xe7,0xe8,0xc8,0xc7,0xe9,0x00,
-0x00,0x01,0x00,0x71,0x02,0x2f,0x04,0x75,0x04,0x7b,0x00,0x0d,0x00,0x00,0x01,0x34,
-0x26,0x23,0x22,0x06,0x15,0x23,0x10,0x00,0x33,0x32,0x00,0x11,0x03,0xb2,0xac,0x93,
-0x94,0xac,0xc2,0x01,0x11,0xf1,0xf0,0x01,0x12,0x02,0x2f,0xc7,0xe9,0xe7,0xc9,0x01,
-0x14,0x01,0x38,0xfe,0xc8,0xfe,0xec,0x00,0x00,0x01,0x00,0x71,0xff,0xe3,0x04,0x75,
-0x02,0x2f,0x00,0x0d,0x00,0x00,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x10,0x00,
-0x23,0x22,0x00,0x11,0x01,0x34,0xac,0x93,0x94,0xac,0xc2,0xfe,0xef,0xf1,0xf0,0xfe,
-0xee,0x02,0x2f,0xc7,0xe9,0xe7,0xc9,0xfe,0xec,0xfe,0xc8,0x01,0x38,0x01,0x14,0x00,
-0x00,0x01,0x00,0xae,0x00,0x4c,0x05,0x2b,0x03,0xf7,0x00,0x13,0x00,0x00,0x25,0x21,
-0x35,0x21,0x32,0x36,0x35,0x34,0x26,0x23,0x21,0x35,0x21,0x15,0x23,0x1e,0x01,0x15,
-0x14,0x06,0x03,0x54,0xfd,0x5a,0x02,0x9f,0x9f,0x9f,0xbe,0xa4,0xfd,0x85,0x04,0x60,
-0xac,0x66,0x63,0xf0,0x4c,0xb8,0x7c,0x7c,0x96,0xac,0xb8,0xb8,0x42,0xb2,0x74,0xc2,
-0xc8,0x00,0x00,0x03,0x00,0xae,0x00,0x4d,0x06,0xdb,0x03,0xf8,0x00,0x03,0x00,0x07,
-0x00,0x1b,0x00,0x00,0x13,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0x05,0x21,0x35,0x21,
-0x32,0x36,0x35,0x34,0x26,0x23,0x21,0x35,0x21,0x15,0x23,0x1e,0x01,0x15,0x14,0x06,
-0xae,0xca,0xca,0xca,0x03,0x8c,0xfd,0x5a,0x02,0x9f,0x9f,0x9f,0xbe,0xa4,0xfd,0x85,
-0x04,0x60,0xac,0x66,0x63,0xf0,0x02,0x78,0xcc,0xcc,0xfe,0x7a,0xca,0xca,0xa4,0xb8,
-0x7c,0x7c,0x94,0xae,0xb8,0xb8,0x44,0xb0,0x76,0xc0,0xc8,0x00,0x00,0x01,0x00,0x2f,
-0xfe,0x18,0x04,0xaa,0x04,0x7b,0x00,0x22,0x00,0x00,0x01,0x1e,0x01,0x15,0x14,0x06,
-0x23,0x21,0x35,0x21,0x32,0x36,0x35,0x34,0x26,0x23,0x21,0x35,0x21,0x32,0x36,0x35,
-0x34,0x26,0x23,0x21,0x35,0x21,0x15,0x23,0x1e,0x01,0x15,0x14,0x06,0x03,0xb8,0x7c,
-0x76,0xf5,0xe2,0xfd,0x5c,0x02,0x9e,0xa1,0x9c,0xbe,0xa4,0xfd,0x87,0x02,0x9e,0xa2,
-0x9b,0xbf,0xa3,0xfd,0x87,0x04,0x60,0xae,0x67,0x62,0x7c,0x01,0x0c,0x45,0xc0,0x82,
-0xaf,0xbe,0xb9,0x72,0x75,0x8f,0xa6,0xb9,0x72,0x77,0x8d,0xa6,0xb9,0xb9,0x3f,0xb0,
-0x79,0x7a,0xab,0x00,0x00,0x02,0x00,0x4d,0x02,0x8b,0x02,0xa2,0x05,0x1f,0x00,0x0a,
-0x00,0x25,0x00,0x00,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x3d,0x01,0x37,
-0x11,0x23,0x35,0x0e,0x01,0x23,0x22,0x26,0x35,0x34,0x36,0x3b,0x01,0x35,0x34,0x26,
-0x23,0x22,0x06,0x07,0x35,0x3e,0x01,0x33,0x32,0x16,0x01,0xba,0x8c,0x6d,0x52,0x46,
-0x60,0x75,0x73,0x73,0x28,0x77,0x55,0x6d,0x80,0xa0,0x9e,0xa3,0x6a,0x5f,0x3c,0x73,
-0x35,0x40,0x77,0x39,0x99,0x97,0x03,0xd7,0x39,0x45,0x37,0x40,0x7a,0x64,0x17,0x2b,
-0xfe,0x9a,0x5f,0x39,0x36,0x6c,0x5b,0x69,0x6c,0x0a,0x47,0x4e,0x1a,0x1a,0x60,0x15,
-0x16,0x8d,0x00,0x02,0x00,0x4d,0x02,0x8b,0x02,0xa2,0x05,0x1f,0x00,0x0c,0x00,0x2c,
-0x00,0x00,0x01,0x32,0x36,0x35,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x1d,0x01,0x07,
-0x11,0x33,0x15,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x2b,0x01,
-0x15,0x14,0x17,0x16,0x33,0x32,0x36,0x37,0x15,0x06,0x07,0x06,0x23,0x22,0x26,0x01,
-0x35,0x8c,0x6d,0x29,0x29,0x46,0x60,0x3a,0x3b,0x74,0x74,0x28,0x3b,0x3c,0x55,0x6d,
-0x40,0x3f,0x50,0x4f,0x9e,0xa3,0x35,0x35,0x5f,0x3c,0x73,0x35,0x40,0x3c,0x3c,0x38,
-0x99,0x98,0x03,0xd3,0x39,0x45,0x37,0x20,0x20,0x3d,0x3c,0x65,0x17,0x2b,0x01,0x66,
-0x5f,0x39,0x1b,0x1b,0x36,0x36,0x5a,0x6a,0x36,0x36,0x0a,0x47,0x27,0x27,0x1a,0x1a,
-0x60,0x15,0x0c,0x0a,0x8d,0x00,0x00,0x02,0x00,0x47,0x02,0x8b,0x02,0xbe,0x05,0x1f,
-0x00,0x13,0x00,0x1f,0x00,0x00,0x01,0x35,0x33,0x11,0x23,0x35,0x06,0x07,0x06,0x23,
-0x22,0x27,0x26,0x10,0x37,0x36,0x33,0x32,0x17,0x16,0x04,0x14,0x17,0x16,0x32,0x37,
-0x36,0x34,0x27,0x26,0x22,0x07,0x02,0x4a,0x74,0x74,0x25,0x37,0x38,0x4e,0x80,0x51,
-0x50,0x50,0x51,0x80,0x4e,0x38,0x37,0xfe,0x9a,0x34,0x35,0xb8,0x35,0x35,0x35,0x35,
-0xb8,0x35,0x04,0xb0,0x5f,0xfd,0x8d,0x5e,0x38,0x1b,0x1b,0x5a,0x5b,0x01,0x28,0x5b,
-0x5a,0x1b,0x1b,0xa1,0xe4,0x41,0x40,0x40,0x41,0xe4,0x41,0x40,0x40,0x00,0x00,0x03,
-0x00,0x4d,0x02,0x8b,0x04,0xaf,0x05,0x1f,0x00,0x2c,0x00,0x33,0x00,0x3e,0x00,0x00,
-0x01,0x0e,0x01,0x23,0x22,0x26,0x3d,0x01,0x21,0x2e,0x01,0x23,0x22,0x06,0x07,0x35,
-0x3e,0x01,0x33,0x32,0x16,0x17,0x3e,0x01,0x33,0x32,0x16,0x15,0x14,0x06,0x2b,0x01,
-0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x15,0x0e,0x01,0x23,0x22,0x26,0x25,0x1e,0x01,
-0x33,0x32,0x36,0x3f,0x01,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x1d,0x01,0x02,
-0x8a,0x2f,0x86,0x53,0x8e,0xa7,0x02,0x15,0x07,0x81,0x73,0x41,0x7e,0x3f,0x3f,0x83,
-0x42,0x6a,0x9c,0x30,0x2e,0x88,0x5b,0x77,0x84,0x9f,0x9f,0xa2,0x69,0x5f,0x3d,0x72,
-0x35,0x3f,0x78,0x39,0x59,0x86,0xfe,0x16,0x01,0x68,0x56,0x60,0x75,0x09,0xe3,0x8d,
-0x6c,0x51,0x46,0x61,0x74,0x02,0xf3,0x33,0x34,0xa3,0x8c,0x32,0x6b,0x70,0x1e,0x1d,
-0x61,0x18,0x18,0x43,0x43,0x43,0x43,0x68,0x5e,0x6a,0x6c,0x0a,0x47,0x4e,0x1a,0x1a,
-0x60,0x15,0x16,0x36,0xda,0x54,0x65,0x62,0x58,0x36,0x39,0x45,0x37,0x40,0x79,0x65,
-0x17,0x00,0x00,0x02,0x00,0x75,0x02,0x8b,0x02,0xed,0x06,0x04,0x00,0x07,0x00,0x17,
-0x00,0x00,0x00,0x34,0x26,0x22,0x06,0x14,0x16,0x32,0x01,0x3e,0x01,0x33,0x32,0x16,
-0x10,0x06,0x23,0x22,0x26,0x27,0x15,0x23,0x11,0x33,0x02,0x74,0x69,0xb8,0x69,0x69,
-0xb8,0xfe,0xdf,0x24,0x70,0x4d,0x81,0xa0,0xa0,0x81,0x4d,0x70,0x24,0x75,0x75,0x03,
-0x63,0xe4,0x81,0x81,0xe4,0x81,0x01,0xce,0x38,0x36,0xb5,0xfe,0xd8,0xb5,0x36,0x38,
-0x5e,0x03,0x67,0x00,0x00,0x02,0x00,0x47,0x02,0x8b,0x02,0xbe,0x06,0x04,0x00,0x0f,
-0x00,0x17,0x00,0x00,0x01,0x11,0x33,0x11,0x23,0x35,0x0e,0x01,0x23,0x22,0x26,0x10,
-0x36,0x33,0x32,0x16,0x04,0x14,0x16,0x32,0x36,0x34,0x26,0x22,0x02,0x4a,0x74,0x74,
-0x25,0x6f,0x4e,0x80,0xa1,0xa1,0x80,0x4e,0x6f,0xfe,0x9a,0x69,0xb8,0x6a,0x6a,0xb8,
-0x04,0xb0,0x01,0x53,0xfc,0x99,0x5e,0x38,0x36,0xb5,0x01,0x28,0xb5,0x36,0xa1,0xe4,
-0x81,0x81,0xe4,0x81,0x00,0x02,0x00,0x47,0x02,0x8b,0x02,0xd6,0x05,0x1f,0x00,0x14,
-0x00,0x1b,0x00,0x00,0x01,0x15,0x21,0x1e,0x01,0x33,0x32,0x36,0x37,0x15,0x0e,0x01,
-0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x07,0x2e,0x01,0x23,0x22,0x06,0x07,
-0x02,0xd5,0xfd,0xeb,0x08,0x81,0x73,0x43,0x7d,0x3e,0x3e,0x83,0x44,0xa9,0xc5,0xbb,
-0x9f,0x8e,0xa6,0x74,0x01,0x68,0x56,0x61,0x74,0x09,0x03,0xef,0x32,0x6a,0x70,0x1d,
-0x1d,0x61,0x18,0x18,0xae,0x95,0x9a,0xb5,0xa3,0x6d,0x54,0x65,0x61,0x59,0x00,0x02,
-0x00,0x47,0x02,0x8b,0x02,0xd6,0x05,0x1f,0x00,0x19,0x00,0x22,0x00,0x00,0x13,0x35,
-0x21,0x26,0x27,0x26,0x23,0x22,0x07,0x06,0x07,0x35,0x3e,0x01,0x33,0x32,0x17,0x16,
-0x15,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x37,0x16,0x17,0x16,0x33,0x32,0x37,0x36,
-0x37,0x47,0x02,0x15,0x07,0x41,0x41,0x73,0x43,0x3e,0x3f,0x3e,0x3f,0x83,0x43,0xa9,
-0x62,0x63,0x5e,0x5d,0x9f,0x8e,0x53,0x53,0x74,0x01,0x35,0x33,0x56,0x61,0x3a,0x3b,
-0x08,0x03,0xbb,0x32,0x6b,0x38,0x37,0x0f,0x0e,0x1d,0x61,0x18,0x18,0x57,0x57,0x95,
-0x9a,0x5b,0x5a,0x51,0x52,0x6d,0x54,0x32,0x33,0x31,0x31,0x58,0x00,0x01,0x00,0x53,
-0x02,0x8b,0x02,0x62,0x05,0x1f,0x00,0x31,0x00,0x00,0x13,0x26,0x27,0x26,0x35,0x34,
-0x37,0x36,0x33,0x32,0x16,0x17,0x15,0x26,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x14,
-0x17,0x16,0x3b,0x01,0x15,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,
-0x36,0x37,0x15,0x06,0x07,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0xf9,0x47,0x26,0x25,
-0x48,0x47,0x7b,0x30,0x6b,0x3e,0x3d,0x33,0x33,0x2c,0x4b,0x2c,0x2c,0x2b,0x2a,0x49,
-0x62,0x5d,0x57,0x2d,0x31,0x35,0x35,0x5f,0x3b,0x36,0x35,0x2d,0x39,0x35,0x35,0x33,
-0x96,0xa2,0x57,0x03,0xee,0x0e,0x24,0x24,0x34,0x4f,0x2c,0x2c,0x0e,0x0d,0x5e,0x11,
-0x07,0x07,0x19,0x1a,0x24,0x27,0x19,0x19,0x55,0x1d,0x1f,0x31,0x33,0x1f,0x20,0x0b,
-0x0a,0x15,0x60,0x10,0x07,0x08,0x66,0x61,0x3c,0x52,0x00,0x01,0x00,0x51,0x02,0x8b,
-0x02,0x60,0x05,0x1f,0x00,0x31,0x00,0x00,0x01,0x16,0x17,0x16,0x15,0x14,0x07,0x06,
-0x23,0x22,0x26,0x27,0x35,0x16,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x26,
-0x2b,0x01,0x35,0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x07,
-0x35,0x36,0x37,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0xbb,0x46,0x26,0x26,0x48,
-0x47,0x7b,0x30,0x6b,0x3e,0x3d,0x32,0x33,0x2d,0x4b,0x2c,0x2c,0x2b,0x2a,0x49,0x62,
-0x5d,0x56,0x2e,0x31,0x35,0x36,0x5f,0x3a,0x36,0x35,0x2d,0x39,0x35,0x35,0x32,0x96,
-0xa3,0x57,0x03,0xbc,0x0d,0x24,0x24,0x34,0x4f,0x2d,0x2b,0x0d,0x0e,0x5d,0x10,0x07,
-0x08,0x1a,0x1a,0x24,0x27,0x19,0x19,0x55,0x1c,0x20,0x31,0x32,0x20,0x1f,0x0a,0x0b,
-0x14,0x60,0x0f,0x08,0x08,0x66,0x61,0x3c,0x52,0x00,0x00,0x02,0x00,0x47,0x01,0xad,
-0x02,0xbe,0x05,0x1f,0x00,0x0b,0x00,0x28,0x00,0x00,0x01,0x34,0x26,0x23,0x22,0x06,
-0x15,0x14,0x16,0x33,0x32,0x36,0x17,0x14,0x06,0x23,0x22,0x26,0x27,0x35,0x1e,0x01,
-0x33,0x32,0x36,0x3d,0x01,0x0e,0x01,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,
-0x17,0x35,0x33,0x02,0x4a,0x68,0x5e,0x5d,0x68,0x68,0x5d,0x5e,0x68,0x74,0xa0,0xa5,
-0x3d,0x6d,0x33,0x33,0x64,0x33,0x72,0x72,0x24,0x70,0x4e,0x82,0x9f,0x9f,0x82,0x4e,
-0x70,0x24,0x74,0x03,0xdd,0x70,0x7b,0x7b,0x70,0x70,0x7b,0x7b,0x83,0xa0,0x9d,0x11,
-0x10,0x65,0x19,0x17,0x69,0x6b,0x33,0x37,0x37,0xb0,0x91,0x91,0xb0,0x37,0x37,0x5f,
-0x00,0x02,0x00,0x79,0x01,0xa7,0x00,0xee,0x05,0x10,0x00,0x03,0x00,0x07,0x00,0x00,
-0x13,0x33,0x11,0x23,0x15,0x35,0x33,0x15,0x7a,0x74,0x74,0x74,0x05,0x0f,0xfd,0x8d,
-0xf4,0x82,0x82,0x00,0x00,0x01,0x00,0x75,0x02,0x9c,0x02,0xe8,0x06,0x04,0x00,0x0a,
-0x00,0x00,0x13,0x33,0x11,0x01,0x33,0x09,0x01,0x23,0x01,0x11,0x23,0x75,0x75,0x01,
-0x5a,0x94,0xfe,0x89,0x01,0x86,0x97,0xfe,0x9a,0x75,0x06,0x03,0xfd,0xfe,0x01,0x0e,
-0xfe,0xdb,0xfe,0xb2,0x01,0x32,0xfe,0xce,0x00,0x01,0x00,0x75,0x02,0x9c,0x04,0x7c,
-0x05,0x1f,0x00,0x22,0x00,0x00,0x01,0x3e,0x01,0x33,0x32,0x16,0x15,0x11,0x23,0x11,
-0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,
-0x23,0x11,0x33,0x15,0x3e,0x01,0x33,0x32,0x16,0x02,0x9f,0x2b,0x79,0x52,0x6f,0x77,
-0x74,0x48,0x4a,0x5a,0x69,0x74,0x48,0x4b,0x59,0x68,0x75,0x75,0x27,0x6f,0x4d,0x4c,
-0x6c,0x04,0x97,0x45,0x42,0x89,0x7e,0xfe,0x85,0x01,0x77,0x5a,0x58,0x6b,0x5c,0xfe,
-0x9e,0x01,0x77,0x5b,0x57,0x6b,0x5c,0xfe,0x9e,0x02,0x73,0x61,0x39,0x37,0x45,0x00,
-0x00,0x01,0x00,0x75,0x01,0xad,0x02,0xc5,0x05,0x1f,0x00,0x1f,0x00,0x00,0x01,0x11,
-0x14,0x07,0x06,0x2b,0x01,0x35,0x33,0x32,0x37,0x36,0x35,0x11,0x34,0x26,0x23,0x22,
-0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x02,0xc4,
-0x34,0x33,0x72,0xa0,0x93,0x42,0x18,0x18,0x4e,0x4e,0x5e,0x6c,0x75,0x75,0x29,0x38,
-0x39,0x4a,0x79,0x3f,0x3e,0x04,0x17,0xfe,0x7a,0x78,0x36,0x36,0x58,0x1b,0x1b,0x56,
-0x01,0x82,0x59,0x59,0x6b,0x5c,0xfe,0x9e,0x02,0x73,0x61,0x38,0x1c,0x1c,0x42,0x44,
-0x00,0x02,0x00,0x47,0x02,0x8b,0x02,0xcf,0x05,0x1f,0x00,0x0a,0x00,0x16,0x00,0x00,
-0x01,0x22,0x06,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x32,0x16,0x15,0x14,
-0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x01,0x8b,0x5d,0x6d,0x6c,0x5e,0x5d,0x6c,0x6c,
-0x5d,0x97,0xad,0xad,0x97,0x98,0xac,0xac,0x04,0xc7,0x81,0xe2,0x81,0x82,0x70,0x6f,
-0x83,0x57,0xae,0x9b,0x9a,0xaf,0xaf,0x9a,0x9b,0xae,0x00,0x01,0x00,0x47,0x02,0x8b,
-0x02,0x76,0x05,0x1f,0x00,0x1f,0x00,0x00,0x13,0x36,0x37,0x36,0x33,0x32,0x17,0x16,
-0x15,0x14,0x06,0x23,0x22,0x27,0x26,0x27,0x35,0x16,0x17,0x16,0x33,0x32,0x37,0x36,
-0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x07,0x47,0x30,0x33,0x33,0x36,0xa5,0x5e,0x5f,
-0xbb,0xa0,0x3a,0x35,0x33,0x31,0x31,0x32,0x31,0x33,0x70,0x3f,0x3e,0x3e,0x3f,0x70,
-0x33,0x31,0x32,0x31,0x04,0xf7,0x14,0x0a,0x09,0x58,0x58,0x99,0x97,0xb2,0x0a,0x0a,
-0x14,0x5f,0x18,0x0c,0x0c,0x3f,0x40,0xe6,0x40,0x3f,0x0c,0x0c,0x18,0x00,0x00,0x01,
-0x00,0x47,0x03,0xd5,0x02,0xcf,0x05,0x1f,0x00,0x0d,0x00,0x00,0x01,0x34,0x26,0x23,
-0x22,0x06,0x15,0x23,0x34,0x36,0x33,0x32,0x16,0x15,0x02,0x54,0x6c,0x5d,0x5d,0x6d,
-0x7a,0xac,0x98,0x97,0xad,0x03,0xd5,0x6f,0x83,0x81,0x71,0x9b,0xae,0xae,0x9b,0x00,
-0x00,0x01,0x00,0x47,0x02,0x8b,0x02,0xcf,0x03,0xd6,0x00,0x0d,0x00,0x00,0x13,0x14,
-0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x23,0x22,0x26,0x35,0xc2,0x6c,0x5d,0x5d,
-0x6d,0x7a,0xac,0x98,0x97,0xad,0x03,0xd5,0x6f,0x83,0x81,0x71,0x9b,0xae,0xae,0x9b,
-0x00,0x02,0x00,0x75,0x01,0xad,0x02,0xed,0x05,0x1f,0x00,0x0f,0x00,0x17,0x00,0x00,
-0x13,0x11,0x23,0x11,0x33,0x15,0x3e,0x01,0x33,0x32,0x16,0x10,0x06,0x23,0x22,0x26,
-0x24,0x34,0x26,0x22,0x06,0x14,0x16,0x32,0xea,0x75,0x75,0x24,0x70,0x4d,0x81,0xa0,
-0xa0,0x81,0x4d,0x70,0x01,0x66,0x69,0xb8,0x69,0x69,0xb8,0x02,0xfa,0xfe,0xb3,0x03,
-0x62,0x5f,0x38,0x36,0xb5,0xfe,0xd8,0xb5,0x36,0xa1,0xe4,0x81,0x81,0xe4,0x81,0x00,
-0x00,0x01,0x00,0x22,0x02,0x9c,0x01,0xdc,0x05,0xc2,0x00,0x13,0x00,0x00,0x13,0x15,
-0x33,0x15,0x23,0x11,0x14,0x16,0x3b,0x01,0x15,0x23,0x22,0x26,0x35,0x11,0x23,0x35,
-0x33,0x35,0xec,0xef,0xef,0x30,0x48,0x77,0x77,0x86,0x66,0x55,0x55,0x05,0xc1,0xb2,
-0x50,0xfe,0xac,0x4d,0x2c,0x56,0x59,0x76,0x01,0x54,0x50,0xb2,0x00,0x01,0x00,0x6d,
-0x02,0x8b,0x02,0xbd,0x05,0x10,0x00,0x13,0x00,0x00,0x13,0x11,0x33,0x11,0x14,0x16,
-0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x23,0x35,0x0e,0x01,0x23,0x22,0x26,0x6e,0x74,
-0x4e,0x4e,0x5e,0x6d,0x74,0x74,0x2b,0x6f,0x4a,0x79,0x7e,0x03,0x94,0x01,0x7b,0xfe,
-0x88,0x59,0x59,0x6b,0x5c,0x01,0x63,0xfd,0x8d,0x60,0x39,0x37,0x86,0x00,0x00,0x01,
-0x00,0x6d,0x02,0xc6,0x03,0x42,0x04,0xd5,0x00,0x13,0x00,0x00,0x01,0x21,0x35,0x21,
-0x32,0x36,0x35,0x34,0x26,0x23,0x21,0x35,0x21,0x15,0x23,0x1e,0x01,0x15,0x14,0x06,
-0x02,0x19,0xfe,0x55,0x01,0xa6,0x65,0x64,0x78,0x67,0xfe,0x70,0x02,0xc1,0x6c,0x40,
-0x3e,0x97,0x02,0xc7,0x67,0x45,0x46,0x53,0x61,0x67,0x67,0x25,0x64,0x41,0x6c,0x70,
-0x00,0x01,0x00,0x75,0x02,0x8d,0x04,0x7c,0x05,0x11,0x00,0x26,0x00,0x00,0x01,0x06,
-0x07,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x37,0x36,0x35,
-0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x23,0x35,0x06,0x07,
-0x06,0x23,0x22,0x27,0x26,0x02,0x51,0x2b,0x3c,0x3d,0x52,0x6e,0x78,0x75,0x48,0x49,
-0x5a,0x35,0x34,0x74,0x48,0x4b,0x59,0x69,0x74,0x74,0x28,0x37,0x38,0x4c,0x4d,0x36,
-0x36,0x03,0x15,0x45,0x21,0x22,0x8a,0x7f,0x01,0x7a,0xfe,0x89,0x5b,0x57,0x36,0x34,
-0x5c,0x01,0x63,0xfe,0x89,0x5b,0x57,0x6c,0x5a,0x01,0x63,0xfd,0x8d,0x62,0x3b,0x1b,
-0x1c,0x23,0x23,0x00,0x00,0x01,0x00,0x26,0x02,0x9c,0x02,0xd6,0x05,0x10,0x00,0x06,
-0x00,0x00,0x13,0x33,0x1b,0x01,0x33,0x01,0x23,0x26,0x7b,0xdd,0xdc,0x7b,0xfe,0xf8,
-0x9e,0x05,0x0f,0xfd,0xf2,0x02,0x0e,0xfd,0x8d,0x00,0x00,0x02,0x00,0xba,0xfe,0x56,
-0x04,0xa3,0x04,0x7b,0x00,0x1c,0x00,0x28,0x00,0x00,0x13,0x10,0x12,0x21,0x32,0x16,
-0x17,0x15,0x2e,0x01,0x23,0x22,0x06,0x1d,0x01,0x3e,0x01,0x33,0x32,0x12,0x11,0x10,
-0x02,0x23,0x22,0x26,0x27,0x15,0x23,0x13,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,
-0x23,0x22,0x06,0xba,0xfe,0x01,0x06,0x61,0xac,0x51,0x51,0x9e,0x52,0xb5,0xb4,0x39,
-0xb2,0x7c,0xce,0xfc,0xfc,0xce,0x7c,0xb2,0x39,0xb8,0xb8,0xa5,0x95,0x94,0xa5,0xa5,
-0x94,0x95,0xa5,0x02,0x46,0x01,0x1e,0x01,0x17,0x1d,0x1e,0xb3,0x2c,0x2a,0xbd,0xbf,
-0x5b,0x63,0x62,0xfe,0xc6,0xfe,0xfd,0xfe,0xfc,0xfe,0xc6,0x62,0x63,0xaa,0x02,0x23,
-0xc8,0xdc,0xdc,0xc8,0xc7,0xdc,0xdc,0x00,0x00,0x01,0x00,0x74,0x00,0x00,0x02,0x85,
-0x04,0x60,0x00,0x13,0x00,0x00,0x13,0x35,0x21,0x15,0x23,0x11,0x33,0x15,0x23,0x11,
-0x33,0x15,0x21,0x35,0x33,0x11,0x23,0x35,0x33,0x11,0x74,0x02,0x10,0xa8,0xa8,0xa8,
-0xa8,0xfd,0xf0,0xb0,0xb0,0xb0,0x03,0xbc,0xa4,0xa4,0xfe,0xac,0xa4,0xfe,0xe0,0xa4,
-0xa4,0x01,0x20,0xa4,0x01,0x54,0x00,0x01,0x00,0x91,0xfe,0x56,0x02,0x2f,0x06,0x14,
-0x00,0x10,0x00,0x00,0x25,0x15,0x14,0x06,0x2b,0x01,0x35,0x33,0x32,0x37,0x36,0x27,
-0x37,0x23,0x11,0x33,0x11,0x02,0x2f,0xa4,0xb4,0x46,0x30,0x6a,0x26,0x2a,0x04,0x02,
-0xb8,0xb8,0x9a,0xae,0xd6,0xc0,0x9c,0x30,0x36,0x94,0x14,0x06,0x14,0xfa,0x86,0x00,
-0x00,0x02,0x00,0x47,0x02,0x8b,0x02,0xbe,0x05,0x1f,0x00,0x13,0x00,0x1f,0x00,0x00,
-0x13,0x15,0x23,0x11,0x33,0x15,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x10,0x07,0x06,
-0x23,0x22,0x27,0x26,0x24,0x34,0x27,0x26,0x22,0x07,0x06,0x14,0x17,0x16,0x32,0x37,
-0xbb,0x74,0x74,0x25,0x38,0x37,0x4e,0x80,0x50,0x51,0x51,0x50,0x80,0x4e,0x37,0x38,
-0x01,0x66,0x35,0x34,0xb8,0x35,0x35,0x35,0x35,0xb8,0x34,0x02,0xfa,0x5f,0x02,0x73,
-0x5e,0x38,0x1b,0x1b,0x5a,0x5b,0xfe,0xd8,0x5b,0x5a,0x1b,0x1b,0xa1,0xe4,0x41,0x40,
-0x40,0x41,0xe4,0x41,0x40,0x40,0x00,0x01,0x00,0x47,0x02,0x8b,0x02,0x76,0x05,0x1f,
-0x00,0x18,0x00,0x00,0x01,0x15,0x2e,0x01,0x23,0x22,0x06,0x14,0x16,0x33,0x32,0x36,
-0x37,0x15,0x0e,0x01,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x02,0x75,0x31,
-0x63,0x32,0x71,0x7d,0x7d,0x71,0x32,0x63,0x31,0x30,0x68,0x3b,0x9f,0xbc,0xbe,0xa5,
-0x35,0x66,0x04,0xf7,0x60,0x18,0x18,0x7f,0xe6,0x7f,0x18,0x18,0x5f,0x14,0x14,0xb2,
-0x97,0x99,0xb0,0x13,0x00,0x02,0x00,0x47,0x02,0x4b,0x02,0x76,0x05,0x1f,0x00,0x07,
-0x00,0x2c,0x00,0x00,0x01,0x16,0x33,0x32,0x35,0x26,0x23,0x22,0x07,0x06,0x15,0x07,
-0x34,0x37,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x15,0x26,
-0x27,0x26,0x23,0x22,0x07,0x06,0x14,0x17,0x16,0x17,0x36,0x33,0x32,0x17,0x16,0x23,
-0x22,0x01,0x5a,0x25,0x30,0x5c,0x01,0x52,0x40,0x35,0x04,0x60,0x08,0x24,0x1e,0x5e,
-0x5f,0x5f,0xa5,0x34,0x34,0x31,0x32,0x2f,0x34,0x31,0x32,0x71,0x3e,0x3f,0x3f,0x02,
-0x06,0x35,0x7b,0xbc,0x01,0x01,0xd2,0x33,0x02,0xee,0x0b,0x20,0x2a,0x9a,0x20,0x26,
-0x02,0x3b,0x2f,0x13,0x1d,0x5a,0x96,0x99,0x58,0x58,0x09,0x0a,0x14,0x60,0x17,0x0d,
-0x0c,0x3f,0x40,0xe6,0x40,0x02,0x05,0x62,0x8a,0x69,0x00,0x02,0x00,0x47,0x02,0x8b,
-0x02,0xcf,0x06,0x04,0x00,0x0e,0x00,0x28,0x00,0x00,0x01,0x2e,0x01,0x23,0x22,0x06,
-0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x37,0x1e,0x01,0x15,0x14,0x06,0x23,
-0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x27,0x07,0x27,0x37,0x27,0x33,0x17,
-0x37,0x17,0x07,0x02,0x10,0x20,0x37,0x1a,0x69,0x75,0x6e,0x5c,0x5b,0x6e,0x22,0x06,
-0x4f,0x48,0xb3,0x91,0x92,0xb2,0xae,0x8b,0x0c,0x20,0x1b,0x64,0xc9,0x15,0xb1,0x72,
-0x90,0x50,0xd1,0x15,0xba,0x04,0x9c,0x0a,0x09,0x79,0x6d,0x6a,0x7c,0x7c,0x6a,0x44,
-0x69,0xa5,0x50,0xa1,0x61,0x8f,0xae,0xae,0x8f,0x8c,0xae,0x03,0x03,0x65,0x3c,0x38,
-0x33,0x72,0x51,0x3e,0x36,0x37,0x00,0x01,0x00,0x53,0x02,0x8b,0x02,0x62,0x05,0x1f,
-0x00,0x31,0x00,0x00,0x01,0x1e,0x01,0x15,0x14,0x06,0x23,0x22,0x27,0x26,0x27,0x35,
-0x16,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x2b,0x01,0x35,0x33,0x32,
-0x37,0x36,0x35,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x07,0x35,0x3e,0x01,0x33,0x32,
-0x17,0x16,0x15,0x14,0x07,0x06,0x01,0xbd,0x4e,0x57,0xa3,0x96,0x32,0x36,0x35,0x38,
-0x2d,0x35,0x36,0x3a,0x5f,0x36,0x35,0x31,0x2e,0x56,0x5d,0x61,0x49,0x2b,0x2b,0x2d,
-0x2b,0x4b,0x2d,0x33,0x32,0x3d,0x3d,0x6c,0x2f,0x7c,0x47,0x48,0x26,0x26,0x03,0xee,
-0x0d,0x52,0x3c,0x61,0x66,0x08,0x07,0x10,0x60,0x15,0x0a,0x0b,0x20,0x1f,0x33,0x31,
-0x1f,0x1d,0x55,0x19,0x19,0x27,0x24,0x1a,0x19,0x07,0x07,0x11,0x5e,0x0d,0x0e,0x2c,
-0x2c,0x4f,0x34,0x24,0x24,0x00,0x00,0x01,0x00,0x1d,0x02,0x9c,0x01,0xdf,0x06,0x04,
-0x00,0x13,0x00,0x00,0x01,0x15,0x23,0x22,0x06,0x1d,0x01,0x33,0x15,0x23,0x11,0x23,
-0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x01,0xdf,0x6f,0x3e,0x31,0xbf,0xbf,0x75,
-0x6e,0x6e,0x6e,0x77,0x06,0x03,0x55,0x2d,0x3a,0x38,0x50,0xfd,0xdd,0x02,0x23,0x50,
-0x2c,0x69,0x5f,0x00,0x00,0x01,0xff,0xe8,0x01,0xad,0x01,0x5d,0x05,0x10,0x00,0x17,
-0x00,0x00,0x13,0x23,0x35,0x33,0x11,0x33,0x03,0x33,0x15,0x23,0x33,0x15,0x14,0x07,
-0x06,0x2b,0x01,0x35,0x33,0x32,0x37,0x36,0x3d,0x01,0x7a,0x72,0x72,0x74,0x01,0x6f,
-0x6f,0x01,0x34,0x33,0x72,0x2c,0x1f,0x42,0x18,0x18,0x02,0x9c,0x50,0x02,0x23,0xfd,
-0xdd,0x50,0x0b,0x78,0x36,0x36,0x58,0x1b,0x1c,0x55,0x0b,0x00,0x00,0x02,0x00,0x47,
-0x01,0xad,0x02,0xbe,0x05,0x10,0x00,0x0d,0x00,0x29,0x00,0x00,0x01,0x35,0x23,0x22,
-0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x13,0x11,0x14,0x07,0x06,0x23,
-0x22,0x27,0x26,0x27,0x35,0x1e,0x01,0x33,0x32,0x37,0x36,0x3d,0x01,0x0e,0x01,0x23,
-0x22,0x26,0x35,0x34,0x36,0x33,0x02,0x4a,0xc6,0x5d,0x34,0x34,0x34,0x34,0x5d,0x5e,
-0x34,0x34,0x74,0x50,0x50,0xa5,0x3d,0x37,0x36,0x33,0x33,0x64,0x33,0x72,0x39,0x39,
-0x24,0x70,0x4e,0x82,0x9f,0x9f,0x82,0x03,0xdd,0xeb,0x3e,0x3d,0x70,0x70,0x3d,0x3e,
-0x3e,0x3d,0x01,0xa2,0xfd,0xdb,0xa0,0x4e,0x4f,0x08,0x09,0x10,0x65,0x19,0x17,0x34,
-0x35,0x6b,0x33,0x37,0x37,0xb0,0x91,0x82,0xb0,0x00,0x00,0x01,0x00,0x6d,0x01,0xad,
-0x02,0xbd,0x05,0x10,0x00,0x16,0x00,0x00,0x13,0x11,0x33,0x11,0x14,0x17,0x16,0x33,
-0x32,0x37,0x36,0x35,0x11,0x33,0x11,0x23,0x11,0x06,0x07,0x06,0x23,0x22,0x26,0x6e,
-0x74,0x27,0x27,0x4e,0x5e,0x36,0x37,0x74,0x74,0x2b,0x38,0x37,0x4a,0x79,0x7e,0x03,
-0x94,0x01,0x7b,0xfe,0x88,0x59,0x2c,0x2d,0x36,0x35,0x5c,0x01,0x63,0xfc,0x9e,0x01,
-0x4f,0x39,0x1c,0x1b,0x86,0x00,0x00,0x02,0x00,0x49,0x02,0x9c,0x01,0x97,0x06,0x04,
-0x00,0x0b,0x00,0x0f,0x00,0x00,0x13,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x15,
-0x23,0x35,0x11,0x33,0x15,0x23,0x49,0x72,0x74,0x67,0x67,0x74,0x74,0x74,0x03,0x99,
-0x5c,0x01,0x1a,0xfe,0xe6,0x5c,0xfd,0xfd,0x02,0x6a,0x82,0x00,0x00,0x01,0x00,0x79,
-0x02,0x9c,0x01,0x7f,0x05,0x10,0x00,0x0d,0x00,0x00,0x13,0x11,0x14,0x17,0x16,0x3b,
-0x01,0x15,0x23,0x22,0x27,0x26,0x35,0x11,0xee,0x17,0x18,0x43,0x1e,0x2c,0x72,0x33,
-0x33,0x05,0x0f,0xfe,0x70,0x55,0x1c,0x1b,0x57,0x36,0x36,0x77,0x01,0x90,0x00,0x01,
-0x00,0x49,0x02,0x9c,0x01,0x96,0x05,0x10,0x00,0x0b,0x00,0x00,0x13,0x35,0x21,0x15,
-0x23,0x11,0x33,0x15,0x21,0x35,0x33,0x11,0x49,0x01,0x4d,0x6a,0x6a,0xfe,0xb3,0x6f,
-0x04,0xb3,0x5c,0x5c,0xfe,0x45,0x5c,0x5c,0x01,0xbb,0x00,0x02,0x00,0x49,0x02,0x9c,
-0x01,0x97,0x05,0x10,0x00,0x03,0x00,0x0f,0x00,0x00,0x01,0x15,0x21,0x3d,0x02,0x21,
-0x15,0x23,0x11,0x33,0x15,0x21,0x35,0x33,0x11,0x01,0x96,0xfe,0xb3,0x01,0x4d,0x6a,
-0x6a,0xfe,0xb3,0x6f,0x03,0xf5,0x5c,0x5c,0xbe,0x5c,0x5c,0xfe,0x45,0x5c,0x5c,0x01,
-0xbb,0x00,0x00,0x03,0xff,0x55,0x01,0xad,0x01,0x60,0x06,0x04,0x00,0x03,0x00,0x12,
-0x00,0x1b,0x00,0x00,0x13,0x33,0x15,0x23,0x03,0x22,0x35,0x34,0x3b,0x01,0x11,0x33,
-0x11,0x33,0x15,0x23,0x06,0x07,0x06,0x27,0x23,0x22,0x17,0x16,0x33,0x32,0x37,0x36,
-0x7a,0x74,0x74,0x65,0xbf,0xaa,0x7a,0x74,0x72,0x79,0x0b,0x22,0x33,0x14,0x72,0x4b,
-0x02,0x02,0x4e,0x42,0x18,0x0b,0x06,0x03,0x82,0xfc,0x2c,0x7c,0x73,0x02,0x73,0xfd,
-0x8d,0x57,0x3f,0x23,0x35,0x98,0x1d,0x24,0x1b,0x0d,0x00,0x01,0x00,0x79,0x01,0xad,
-0x01,0x7f,0x06,0x04,0x00,0x0f,0x00,0x00,0x13,0x11,0x33,0x11,0x15,0x14,0x17,0x16,
-0x3b,0x01,0x15,0x23,0x22,0x27,0x26,0x35,0x7a,0x74,0x17,0x18,0x43,0x1e,0x2c,0x72,
-0x33,0x33,0x02,0xe4,0x03,0x1f,0xfc,0xe1,0x53,0x56,0x1b,0x1b,0x58,0x36,0x36,0x78,
-0x00,0x01,0x00,0x5b,0x01,0xad,0x01,0x61,0x06,0x04,0x00,0x10,0x00,0x00,0x01,0x15,
-0x14,0x06,0x2b,0x01,0x35,0x33,0x32,0x37,0x36,0x27,0x37,0x23,0x11,0x33,0x11,0x01,
-0x60,0x67,0x72,0x2c,0x1f,0x42,0x18,0x1b,0x03,0x02,0x74,0x74,0x02,0xf2,0x61,0x78,
-0x6c,0x58,0x1b,0x1e,0x53,0x0b,0x03,0x67,0xfc,0xef,0x00,0x01,0x00,0x70,0x02,0x9c,
-0x02,0x83,0x05,0x1f,0x00,0x05,0x00,0x00,0x13,0x33,0x11,0x21,0x15,0x21,0x71,0x7f,
-0x01,0x93,0xfd,0xee,0x05,0x1e,0xfd,0xdd,0x5f,0x00,0x00,0x01,0x00,0x75,0x01,0xad,
-0x04,0x7c,0x05,0x1f,0x00,0x33,0x00,0x00,0x01,0x3e,0x01,0x33,0x32,0x17,0x16,0x15,
-0x11,0x14,0x07,0x06,0x2b,0x01,0x35,0x33,0x32,0x37,0x36,0x35,0x26,0x37,0x34,0x35,
-0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x27,0x26,0x23,0x22,0x07,0x06,
-0x15,0x11,0x23,0x11,0x33,0x15,0x3e,0x01,0x33,0x32,0x17,0x16,0x02,0x9f,0x2b,0x79,
-0x52,0x6f,0x3b,0x3c,0x33,0x33,0x72,0xa1,0x93,0x42,0x18,0x18,0x01,0x01,0x48,0x4a,
-0x5a,0x69,0x74,0x24,0x24,0x4b,0x59,0x34,0x34,0x75,0x75,0x27,0x6f,0x4d,0x4c,0x36,
-0x36,0x04,0x97,0x45,0x42,0x45,0x44,0x7e,0xfe,0x7a,0x78,0x36,0x36,0x58,0x1b,0x1b,
-0x56,0x30,0xe8,0x3d,0x2d,0x5a,0x58,0x6b,0x5c,0xfe,0x9e,0x01,0x77,0x5b,0x2c,0x2b,
-0x35,0x36,0x5c,0xfe,0x9e,0x02,0x73,0x61,0x39,0x37,0x22,0x23,0x00,0x01,0x00,0x75,
-0x01,0xad,0x04,0x7c,0x05,0x10,0x00,0x26,0x00,0x00,0x01,0x0e,0x01,0x23,0x22,0x27,
-0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x17,
-0x16,0x33,0x32,0x37,0x36,0x35,0x11,0x33,0x11,0x23,0x11,0x0e,0x01,0x23,0x22,0x27,
-0x26,0x02,0x51,0x2b,0x79,0x52,0x6e,0x3c,0x3c,0x75,0x48,0x49,0x5a,0x69,0x74,0x24,
-0x24,0x4b,0x59,0x34,0x35,0x74,0x74,0x28,0x6f,0x4c,0x4d,0x36,0x36,0x03,0x15,0x45,
-0x43,0x45,0x45,0x7e,0x01,0x7b,0xfe,0x89,0x5b,0x57,0x6a,0x5c,0x01,0x63,0xfe,0x89,
-0x5b,0x2b,0x2c,0x36,0x35,0x5b,0x01,0x63,0xfc,0x9d,0x01,0x51,0x3a,0x37,0x23,0x23,
-0x00,0x01,0xff,0xe8,0x01,0xad,0x02,0xc9,0x05,0x1f,0x00,0x1f,0x00,0x00,0x13,0x14,
-0x07,0x06,0x2b,0x01,0x35,0x33,0x32,0x37,0x36,0x35,0x11,0x33,0x15,0x36,0x37,0x36,
-0x33,0x32,0x17,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0xee,0x34,
-0x33,0x72,0x2c,0x1f,0x42,0x18,0x18,0x74,0x2a,0x38,0x38,0x4a,0x7a,0x3e,0x3f,0x74,
-0x4f,0x4e,0x5e,0x6c,0x02,0x91,0x78,0x36,0x36,0x58,0x1b,0x1b,0x56,0x02,0x7e,0x61,
-0x38,0x1c,0x1c,0x42,0x44,0x81,0xfe,0x85,0x01,0x77,0x59,0x59,0x6b,0x5c,0x00,0x01,
-0x00,0x75,0x01,0xad,0x03,0x56,0x05,0x1f,0x00,0x1f,0x00,0x00,0x01,0x34,0x26,0x23,
-0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x15,
-0x11,0x14,0x17,0x16,0x3b,0x01,0x15,0x23,0x22,0x27,0x26,0x35,0x02,0x50,0x4e,0x4e,
-0x5e,0x6c,0x75,0x75,0x29,0x38,0x39,0x4a,0x79,0x3f,0x3e,0x18,0x18,0x42,0x1f,0x2c,
-0x72,0x33,0x34,0x04,0x13,0x59,0x59,0x6b,0x5c,0xfe,0x9e,0x02,0x73,0x61,0x38,0x1c,
-0x1c,0x42,0x44,0x81,0xfe,0x7a,0x56,0x1b,0x1b,0x58,0x36,0x36,0x78,0x00,0x00,0x01,
-0x00,0x70,0x02,0x9c,0x02,0xc5,0x05,0x1f,0x00,0x09,0x00,0x00,0x13,0x33,0x01,0x11,
-0x33,0x11,0x23,0x01,0x11,0x23,0x71,0xab,0x01,0x2d,0x7b,0xab,0xfe,0xd3,0x7b,0x05,
-0x1e,0xfe,0x07,0x01,0xf9,0xfd,0x7e,0x01,0xfa,0xfe,0x06,0x00,0x00,0x03,0x00,0x47,
-0x02,0x8b,0x02,0xcf,0x05,0x1f,0x00,0x0e,0x00,0x17,0x00,0x20,0x00,0x00,0x01,0x32,
-0x16,0x15,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x17,0x22,0x07,
-0x06,0x07,0x21,0x26,0x27,0x26,0x13,0x21,0x16,0x17,0x16,0x33,0x32,0x37,0x36,0x01,
-0x8b,0x97,0xad,0x56,0x57,0x97,0x98,0x55,0x57,0x57,0x55,0x98,0x5d,0x36,0x2f,0x07,
-0x01,0x91,0x06,0x2f,0x36,0x67,0xfe,0x77,0x0b,0x26,0x36,0x5e,0x5d,0x36,0x26,0x05,
-0x1e,0xae,0x9b,0x9a,0x57,0x58,0x58,0x57,0x9a,0x9b,0x57,0x57,0x57,0x40,0x39,0x5c,
-0x5b,0x38,0x42,0xfe,0xcf,0x45,0x2d,0x41,0x41,0x2e,0x00,0x03,0x00,0x47,0x01,0xae,
-0x02,0xcf,0x06,0x03,0x00,0x1d,0x00,0x26,0x00,0x2e,0x00,0x00,0x01,0x23,0x35,0x21,
-0x15,0x23,0x15,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x15,0x33,0x15,0x21,0x35,
-0x33,0x35,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x17,0x11,0x36,0x37,0x36,0x35,
-0x34,0x27,0x26,0x03,0x11,0x06,0x07,0x06,0x14,0x17,0x16,0x01,0x4f,0x97,0x01,0xa2,
-0x97,0x70,0x46,0x56,0x56,0x46,0x70,0x97,0xfe,0x5e,0x97,0x6e,0x43,0x57,0x57,0x43,
-0x6e,0x74,0x36,0x25,0x36,0x36,0x25,0xaa,0x34,0x23,0x37,0x36,0x24,0x05,0xa7,0x5c,
-0x5c,0x8c,0x0e,0x46,0x57,0x9b,0x9a,0x57,0x47,0x0e,0x85,0x5c,0x5c,0x86,0x0e,0x46,
-0x57,0x9a,0x9b,0x57,0x45,0x0f,0x5b,0xfe,0x2a,0x0e,0x2c,0x41,0x70,0x6f,0x41,0x2d,
-0xfe,0x39,0x01,0xd4,0x0e,0x2a,0x41,0xe2,0x40,0x2b,0x00,0x01,0x00,0x45,0x01,0xad,
-0x02,0x62,0x05,0x1f,0x00,0x3c,0x00,0x00,0x01,0x15,0x2e,0x01,0x23,0x22,0x07,0x06,
-0x15,0x14,0x17,0x16,0x1f,0x01,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x23,0x22,0x2f,
-0x01,0x15,0x14,0x17,0x16,0x3b,0x01,0x15,0x23,0x22,0x27,0x26,0x3d,0x02,0x16,0x17,
-0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x2f,0x01,0x26,0x27,0x26,0x35,0x34,
-0x36,0x33,0x32,0x16,0x02,0x3b,0x31,0x6a,0x38,0x57,0x2a,0x2c,0x1f,0x1f,0x5d,0x28,
-0x7b,0x34,0x34,0x4d,0x4e,0x88,0x39,0x3e,0x0d,0x18,0x18,0x42,0x93,0xa0,0x72,0x33,
-0x34,0x40,0x3f,0x3e,0x3d,0x52,0x2c,0x2c,0x1f,0x20,0x6c,0x29,0x6b,0x30,0x30,0x8d,
-0x82,0x40,0x72,0x04,0xfd,0x62,0x17,0x16,0x17,0x18,0x2f,0x24,0x15,0x14,0x12,0x08,
-0x18,0x2b,0x2a,0x4d,0x57,0x33,0x33,0x09,0x03,0x07,0x56,0x1b,0x1b,0x58,0x36,0x36,
-0x78,0x22,0x6a,0x1d,0x0f,0x0f,0x19,0x19,0x2d,0x2a,0x17,0x16,0x15,0x08,0x14,0x2a,
-0x2a,0x49,0x58,0x60,0x10,0x00,0x00,0x01,0xff,0xe8,0x01,0xad,0x01,0xcb,0x06,0x04,
-0x00,0x18,0x00,0x00,0x13,0x02,0x03,0x34,0x37,0x36,0x3b,0x01,0x15,0x23,0x22,0x07,
-0x06,0x15,0x13,0x14,0x07,0x06,0x2b,0x01,0x35,0x33,0x32,0x37,0x36,0x7a,0x01,0x01,
-0x37,0x33,0x7a,0x6e,0x6f,0x3e,0x18,0x19,0x02,0x34,0x33,0x72,0x2c,0x1f,0x42,0x18,
-0x18,0x02,0x91,0x01,0x5d,0x01,0x4d,0x65,0x33,0x30,0x55,0x17,0x16,0x3a,0xfd,0x4a,
-0x78,0x36,0x36,0x58,0x1b,0x1b,0x00,0x01,0x00,0x22,0x01,0xad,0x01,0xdc,0x05,0xc2,
-0x00,0x1d,0x00,0x00,0x13,0x15,0x33,0x15,0x23,0x11,0x14,0x16,0x3b,0x01,0x15,0x14,
-0x06,0x2b,0x01,0x35,0x33,0x32,0x36,0x3d,0x01,0x23,0x22,0x26,0x35,0x11,0x23,0x35,
-0x33,0x35,0xec,0xef,0xef,0x30,0x48,0x77,0x67,0x72,0x2c,0x1f,0x42,0x30,0x03,0x86,
-0x66,0x55,0x55,0x05,0xc1,0xb2,0x50,0xfe,0xac,0x4d,0x2c,0x61,0x78,0x6c,0x58,0x36,
-0x56,0x0b,0x59,0x76,0x01,0x54,0x50,0xb2,0x00,0x02,0x00,0x5e,0x02,0x8b,0x03,0x90,
-0x05,0x10,0x00,0x17,0x00,0x21,0x00,0x00,0x13,0x35,0x33,0x11,0x33,0x11,0x21,0x11,
-0x33,0x11,0x33,0x15,0x23,0x15,0x23,0x35,0x06,0x07,0x06,0x23,0x22,0x26,0x3d,0x01,
-0x29,0x01,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x5e,0x6e,0x74,0x01,0x67,0x74,
-0x75,0x75,0x74,0x2b,0x38,0x37,0x4a,0x79,0x7e,0x01,0xda,0xfe,0x9a,0x27,0x27,0x4e,
-0x5e,0x36,0x31,0x03,0x99,0x5c,0x01,0x1a,0xfe,0xe6,0x01,0x1a,0xfe,0xe6,0x5c,0xfd,
-0x60,0x39,0x1c,0x1b,0x86,0x82,0x05,0x02,0x59,0x2c,0x2d,0x36,0x2f,0x00,0x00,0x01,
-0x00,0x47,0x02,0x8b,0x02,0xd9,0x05,0x10,0x00,0x23,0x00,0x00,0x13,0x35,0x21,0x15,
-0x06,0x07,0x06,0x15,0x14,0x16,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x27,0x35,0x21,
-0x15,0x23,0x16,0x17,0x16,0x15,0x14,0x06,0x20,0x27,0x26,0x35,0x34,0x37,0x36,0x37,
-0x47,0x01,0x17,0x45,0x28,0x29,0x6f,0xb5,0x37,0x38,0x2a,0x2c,0x3f,0x01,0x12,0x94,
-0x47,0x24,0x22,0xb3,0xfe,0xe4,0x59,0x5a,0x21,0x22,0x4a,0x04,0xb3,0x5c,0x7b,0x27,
-0x3a,0x3f,0x4b,0x59,0x6d,0x36,0x37,0x59,0x52,0x38,0x3e,0x23,0x7b,0x5c,0x38,0x3f,
-0x3e,0x4c,0x83,0xa4,0x51,0x52,0x80,0x52,0x3c,0x3d,0x3a,0x00,0x00,0x01,0x00,0x79,
-0x02,0x9c,0x02,0xc0,0x05,0x10,0x00,0x1f,0x00,0x00,0x01,0x33,0x31,0x16,0x17,0x16,
-0x15,0x14,0x06,0x2b,0x01,0x22,0x27,0x26,0x35,0x11,0x33,0x11,0x14,0x17,0x16,0x3f,
-0x01,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x27,0x26,0x01,0x67,0xcb,0x48,0x23,0x22,
-0xb3,0x8e,0x2c,0x72,0x33,0x33,0x74,0x17,0x1a,0x41,0x20,0x5a,0x38,0x37,0x29,0x32,
-0x3a,0x30,0x04,0xc4,0x38,0x3f,0x3e,0x4c,0x83,0xa4,0x36,0x36,0x77,0x01,0x90,0xfe,
-0x70,0x55,0x1c,0x1c,0x01,0x01,0x36,0x37,0x59,0x51,0x38,0x43,0x1f,0x18,0x00,0x01,
-0x00,0x26,0x02,0x9c,0x02,0xd6,0x05,0x10,0x00,0x06,0x00,0x00,0x01,0x23,0x0b,0x01,
-0x23,0x01,0x33,0x02,0xd5,0x7b,0xdc,0xdd,0x7b,0x01,0x09,0x9e,0x02,0x9c,0x02,0x0e,
-0xfd,0xf2,0x02,0x73,0x00,0x01,0x00,0x37,0x02,0x9c,0x02,0x6e,0x05,0x10,0x00,0x09,
-0x00,0x00,0x13,0x21,0x15,0x01,0x21,0x15,0x21,0x35,0x01,0x21,0x47,0x02,0x27,0xfe,
-0x4c,0x01,0xb4,0xfd,0xc9,0x01,0xb4,0xfe,0x5c,0x05,0x0f,0x5e,0xfe,0x3d,0x52,0x5e,
-0x01,0xc3,0x00,0x01,0x00,0x37,0x01,0xad,0x02,0xfe,0x05,0x10,0x00,0x17,0x00,0x00,
-0x13,0x21,0x15,0x01,0x21,0x15,0x23,0x15,0x14,0x17,0x16,0x3b,0x01,0x15,0x23,0x22,
-0x27,0x26,0x3d,0x01,0x21,0x35,0x01,0x21,0x47,0x02,0x27,0xfe,0x4c,0x01,0xb4,0x01,
-0x17,0x18,0x43,0x1e,0x2c,0x72,0x33,0x33,0xfe,0x3e,0x01,0xb4,0xfe,0x5c,0x05,0x0f,
-0x5e,0xfe,0x3d,0x52,0x0b,0x56,0x1b,0x1b,0x58,0x36,0x36,0x78,0x0b,0x5e,0x01,0xc3,
-0x00,0x02,0x00,0x37,0x02,0x5d,0x02,0x6e,0x05,0x10,0x00,0x14,0x00,0x1b,0x00,0x00,
-0x01,0x06,0x15,0x23,0x34,0x37,0x23,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x33,0x36,
-0x33,0x32,0x17,0x14,0x23,0x27,0x33,0x32,0x35,0x34,0x23,0x06,0x01,0x7c,0x02,0x60,
-0x02,0xe5,0x01,0xb4,0xfe,0x5c,0x02,0x27,0xfe,0x4c,0x6e,0x26,0x8a,0x8f,0x01,0xd2,
-0x0d,0x0d,0x6d,0x2c,0x37,0x02,0x9c,0x1d,0x21,0x21,0x1d,0x5e,0x01,0xc3,0x52,0x5e,
-0xfe,0x3d,0xa2,0x8a,0x6a,0x52,0x1f,0x33,0x01,0x00,0x00,0x01,0x00,0x37,0x01,0xa7,
-0x02,0xa3,0x05,0x10,0x00,0x20,0x00,0x00,0x01,0x32,0x17,0x16,0x17,0x16,0x15,0x14,
-0x06,0x23,0x22,0x27,0x26,0x27,0x35,0x1e,0x01,0x33,0x32,0x37,0x36,0x35,0x34,0x27,
-0x26,0x2b,0x01,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x68,0x43,0x51,0x3e,0x36,0x33,
-0xc0,0xb0,0x3b,0x3f,0x3f,0x43,0x35,0x7e,0x45,0x78,0x3e,0x3f,0x3a,0x3a,0x68,0x6e,
-0x01,0x0f,0xfe,0x5c,0x02,0x26,0x03,0xa7,0x20,0x17,0x3d,0x3b,0x4d,0x7c,0x87,0x0a,
-0x0b,0x14,0x6d,0x1b,0x1c,0x2a,0x2a,0x50,0x4a,0x2a,0x29,0x5d,0x01,0x18,0x52,0x5e,
-0x00,0x03,0x00,0x47,0x02,0x8f,0x02,0xcf,0x06,0x0d,0x00,0x08,0x00,0x11,0x00,0x1d,
-0x00,0x00,0x01,0x21,0x16,0x17,0x16,0x33,0x32,0x37,0x36,0x37,0x26,0x27,0x26,0x23,
-0x22,0x07,0x06,0x07,0x13,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,
-0x02,0x53,0xfe,0x6f,0x06,0x2f,0x36,0x5e,0x5d,0x36,0x2f,0x05,0x09,0x2b,0x36,0x5d,
-0x5d,0x36,0x2c,0x08,0xc7,0x97,0xad,0xad,0x97,0x98,0xac,0xac,0x04,0x2a,0x80,0x4d,
-0x57,0x58,0x4d,0xde,0x6d,0x47,0x59,0x58,0x46,0x6f,0x01,0x83,0xed,0xd1,0xd1,0xee,
-0xee,0xd1,0xd1,0xed,0xff,0xff,0x00,0x10,0xfd,0x2e,0x05,0x68,0x05,0xd5,0x10,0x27,
-0x02,0xa1,0x00,0xb7,0x00,0x00,0x12,0x02,0x00,0x24,0x00,0x00,0xff,0xff,0x00,0x7b,
-0xfd,0x2e,0x04,0x2d,0x04,0x7b,0x10,0x26,0x02,0xa1,0x6b,0x00,0x12,0x02,0x00,0x44,
-0x00,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,0x04,0xec,0x07,0x50,0x12,0x22,0x00,0x25,
-0x00,0x00,0x10,0x03,0x02,0x8d,0x00,0xad,0x01,0x40,0xff,0xff,0x00,0xba,0xff,0xe3,
-0x04,0xa4,0x06,0x14,0x12,0x22,0x00,0x45,0x00,0x00,0x10,0x03,0x02,0x8d,0x00,0xe9,
-0x00,0x00,0xff,0xff,0x00,0xc9,0xfe,0x87,0x04,0xec,0x05,0xd5,0x12,0x22,0x00,0x25,
-0x00,0x00,0x10,0x03,0x02,0xc6,0x04,0xa5,0x00,0x00,0xff,0xff,0x00,0xba,0xfe,0x87,
-0x04,0xa4,0x06,0x14,0x12,0x22,0x00,0x45,0x00,0x00,0x10,0x03,0x02,0xc6,0x04,0x9a,
-0x00,0x00,0xff,0xff,0x00,0xc9,0xfe,0xc0,0x04,0xec,0x05,0xd5,0x12,0x22,0x00,0x25,
-0x00,0x00,0x10,0x03,0x02,0x81,0x00,0x97,0x00,0x00,0xff,0xff,0x00,0xba,0xfe,0xc0,
-0x04,0xa4,0x06,0x14,0x12,0x22,0x00,0x45,0x00,0x00,0x10,0x03,0x02,0x81,0x00,0x8f,
-0x00,0x00,0xff,0xff,0x00,0x73,0xfe,0x75,0x05,0x27,0x07,0x6b,0x12,0x22,0x00,0x89,
-0x00,0x00,0x10,0x43,0x00,0x76,0x00,0xfe,0x02,0xf0,0x40,0x00,0x2c,0xcc,0xff,0xff,
-0x00,0x71,0xfe,0x75,0x03,0xe7,0x06,0x66,0x12,0x22,0x00,0xa9,0x00,0x00,0x10,0x02,
-0x00,0x76,0x43,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,0x05,0xb0,0x07,0x50,0x12,0x22,
-0x00,0x27,0x00,0x00,0x10,0x03,0x02,0x8d,0x00,0xfd,0x01,0x40,0xff,0xff,0x00,0x71,
-0xff,0xe3,0x04,0x5a,0x06,0x14,0x12,0x22,0x00,0x47,0x00,0x00,0x10,0x02,0x02,0x8d,
-0x2a,0x02,0xff,0xff,0x00,0xc9,0xfe,0x87,0x05,0xb0,0x05,0xd5,0x10,0x23,0x02,0xc6,
-0x04,0xae,0x00,0x00,0x10,0x02,0x00,0x27,0x00,0x00,0xff,0xff,0x00,0x71,0xfe,0x87,
-0x04,0x5a,0x06,0x14,0x10,0x23,0x02,0xc6,0x04,0x7a,0x00,0x00,0x10,0x02,0x00,0x47,
-0x00,0x00,0xff,0xff,0x00,0xc9,0xfe,0xc0,0x05,0xb0,0x05,0xd5,0x12,0x22,0x00,0x27,
-0x00,0x00,0x10,0x03,0x02,0x81,0x00,0xe8,0x00,0x00,0xff,0xff,0x00,0x71,0xfe,0xc0,
-0x04,0x5a,0x06,0x14,0x12,0x22,0x00,0x47,0x00,0x00,0x10,0x02,0x02,0x81,0x4f,0x00,
-0xff,0xff,0x00,0xc9,0xfe,0x77,0x05,0xb0,0x05,0xd5,0x12,0x22,0x00,0x27,0x00,0x00,
-0x10,0x02,0x00,0x7a,0x5b,0x02,0xff,0xff,0x00,0x71,0xfe,0x75,0x04,0x5a,0x06,0x14,
-0x12,0x22,0x00,0x47,0x00,0x00,0x10,0x02,0x00,0x7a,0xf6,0x00,0xff,0xff,0x00,0xc9,
-0xfe,0x18,0x05,0xb0,0x05,0xd5,0x10,0x27,0x02,0x7a,0x00,0xa6,0xf9,0x2a,0x12,0x06,
-0x00,0x27,0x00,0x00,0xff,0xff,0x00,0x71,0xfe,0x18,0x04,0x5a,0x06,0x14,0x10,0x27,
-0x02,0x7a,0x00,0x5e,0xf9,0x2a,0x12,0x06,0x00,0x47,0x00,0x00,0xff,0xff,0x00,0xc9,
-0x00,0x00,0x04,0x8b,0x08,0x57,0x12,0x22,0x00,0x28,0x00,0x00,0x10,0x02,0x0a,0xfc,
-0xee,0x00,0xff,0xff,0x00,0x71,0xff,0xe3,0x04,0x7f,0x07,0x13,0x12,0x22,0x00,0x48,
-0x00,0x00,0x10,0x03,0x0a,0xfc,0xff,0xc8,0xfe,0xbc,0xff,0xff,0x00,0xc9,0x00,0x00,
-0x04,0x8b,0x08,0x57,0x12,0x22,0x00,0x28,0x00,0x00,0x10,0x02,0x0a,0xfa,0xee,0x00,
-0xff,0xff,0x00,0x71,0xff,0xe3,0x04,0x7f,0x07,0x13,0x12,0x22,0x00,0x48,0x00,0x00,
-0x10,0x03,0x0a,0xfa,0xff,0xc8,0xfe,0xbc,0xff,0xff,0x00,0xc9,0xfd,0xdd,0x04,0x8b,
-0x05,0xd5,0x12,0x22,0x00,0x28,0x00,0x00,0x10,0x03,0x02,0xd0,0x04,0xb1,0x00,0x00,
-0xff,0xff,0x00,0x71,0xfd,0xdd,0x04,0x7f,0x04,0x7b,0x12,0x22,0x00,0x48,0x00,0x00,
-0x10,0x03,0x02,0xd0,0x04,0xb0,0x00,0x00,0xff,0xff,0x00,0xc9,0xfe,0x76,0x04,0x8b,
-0x05,0xd5,0x12,0x22,0x00,0x28,0x00,0x00,0x10,0x03,0x02,0xa2,0x00,0xb3,0x00,0x00,
-0xff,0xff,0x00,0x71,0xfe,0x76,0x04,0x7f,0x04,0x7b,0x12,0x22,0x00,0x48,0x00,0x00,
-0x10,0x03,0x02,0xa2,0x00,0x9b,0x00,0x00,0xff,0xff,0x00,0xc9,0xfe,0x75,0x04,0x8b,
-0x07,0x66,0x12,0x22,0x00,0x28,0x00,0x00,0x10,0x63,0x02,0x8c,0x00,0xda,0x01,0xbe,
-0x40,0x00,0x39,0x99,0x10,0x03,0x00,0x7a,0x00,0xbe,0x00,0x00,0xff,0xff,0x00,0x71,
-0xfe,0x75,0x04,0x7f,0x06,0x48,0x12,0x22,0x00,0x48,0x00,0x00,0x10,0x23,0x02,0x8c,
-0x00,0x87,0x00,0x00,0x10,0x02,0x00,0x7a,0x4b,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,
-0x04,0x23,0x07,0x50,0x12,0x22,0x00,0x29,0x00,0x00,0x10,0x03,0x02,0x8d,0x00,0x76,
-0x01,0x40,0xff,0xff,0x00,0x2f,0x00,0x00,0x02,0xf8,0x07,0x50,0x12,0x22,0x00,0x49,
-0x00,0x00,0x10,0x03,0x02,0x8d,0x00,0x0c,0x01,0x40,0xff,0xff,0x00,0x73,0xff,0xe3,
-0x05,0x8b,0x07,0x18,0x12,0x22,0x00,0x2a,0x00,0x00,0x10,0x03,0x02,0x7d,0x01,0x32,
-0x01,0x22,0xff,0xff,0x00,0x71,0xfe,0x56,0x04,0x5a,0x05,0xf6,0x12,0x22,0x00,0x4a,
-0x00,0x00,0x10,0x02,0x02,0x7d,0x49,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,0x05,0x3b,
-0x07,0x50,0x12,0x22,0x00,0x2b,0x00,0x00,0x10,0x03,0x02,0x8d,0x01,0x14,0x01,0x40,
-0xff,0xff,0x00,0xba,0x00,0x00,0x04,0x64,0x06,0x14,0x12,0x22,0x00,0x4b,0x00,0x00,
-0x10,0x03,0x02,0x8d,0x00,0xe9,0x00,0x00,0xff,0xff,0x00,0xc9,0xfe,0x87,0x05,0x3b,
-0x05,0xd5,0x10,0x23,0x02,0xc6,0x05,0x02,0x00,0x00,0x10,0x02,0x00,0x2b,0x00,0x00,
-0xff,0xff,0x00,0xba,0xfe,0x87,0x04,0x64,0x06,0x14,0x10,0x23,0x02,0xc6,0x04,0x8f,
-0x00,0x00,0x10,0x02,0x00,0x4b,0x00,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,0x05,0x3b,
-0x07,0x50,0x12,0x22,0x00,0x2b,0x00,0x00,0x10,0x03,0x00,0x6a,0x01,0x08,0x01,0x40,
-0xff,0xff,0x00,0xba,0x00,0x00,0x04,0x64,0x07,0x4e,0x12,0x22,0x00,0x4b,0x00,0x00,
-0x10,0x03,0x00,0x6a,0x00,0xc0,0x01,0x3e,0xff,0xff,0x00,0x11,0xfe,0x74,0x05,0x3b,
-0x05,0xd5,0x12,0x22,0x00,0x2b,0x00,0x00,0x10,0x03,0x00,0x7a,0xfe,0xee,0xff,0xff,
-0xff,0xff,0x00,0x02,0xfe,0x74,0x04,0x64,0x06,0x14,0x12,0x22,0x00,0x4b,0x00,0x00,
-0x10,0x03,0x00,0x7a,0xfe,0xdf,0xff,0xff,0xff,0xff,0x00,0xc9,0xfe,0x39,0x05,0x3b,
-0x05,0xd5,0x12,0x22,0x00,0x2b,0x00,0x00,0x10,0x03,0x02,0xd1,0x05,0x97,0x00,0x00,
-0xff,0xff,0x00,0xba,0xfe,0x39,0x04,0x64,0x06,0x14,0x12,0x22,0x00,0x4b,0x00,0x00,
-0x10,0x03,0x02,0xd1,0x05,0x26,0x00,0x00,0xff,0xff,0x00,0x00,0xfe,0x76,0x02,0x94,
-0x05,0xd5,0x12,0x22,0x00,0x2c,0x00,0x00,0x10,0x03,0x02,0xa2,0xff,0x4a,0x00,0x00,
-0xff,0xff,0x00,0x27,0xfe,0x76,0x02,0x38,0x06,0x14,0x12,0x22,0x00,0x4c,0x00,0x00,
-0x10,0x42,0x02,0xa2,0x96,0x00,0x33,0x33,0x40,0x00,0xff,0xff,0x00,0x08,0x00,0x00,
-0x02,0xb7,0x08,0x57,0x12,0x22,0x00,0x2c,0x00,0x00,0x10,0x03,0x0a,0xf8,0xfe,0x75,
-0x00,0x00,0xff,0xff,0xff,0xf4,0x00,0x00,0x02,0xa3,0x07,0x13,0x12,0x22,0x00,0xf3,
-0x00,0x00,0x10,0x03,0x0a,0xf8,0xfe,0x61,0xfe,0xbc,0xff,0xff,0x00,0xc9,0x00,0x00,
-0x05,0x6a,0x07,0x6b,0x12,0x22,0x00,0x2e,0x00,0x00,0x10,0x43,0x00,0x76,0x00,0xa4,
-0x02,0xf0,0x40,0x00,0x2c,0xcc,0xff,0xff,0x00,0xba,0x00,0x00,0x04,0x9c,0x07,0x6b,
-0x12,0x22,0x00,0x4e,0x00,0x00,0x10,0x43,0x00,0x76,0x00,0xbc,0x02,0xf0,0x40,0x00,
-0x2c,0xcc,0xff,0xff,0x00,0xc9,0xfe,0x87,0x05,0x6a,0x05,0xd5,0x12,0x22,0x00,0x2e,
-0x00,0x00,0x10,0x03,0x02,0xc6,0x04,0xdc,0x00,0x00,0xff,0xff,0x00,0xba,0xfe,0x87,
-0x04,0x9c,0x06,0x14,0x12,0x22,0x00,0x4e,0x00,0x00,0x10,0x03,0x02,0xc6,0x04,0x91,
-0x00,0x00,0xff,0xff,0x00,0xc9,0xfe,0xc0,0x05,0x6a,0x05,0xd5,0x12,0x22,0x00,0x2e,
-0x00,0x00,0x10,0x03,0x02,0x81,0x01,0x0d,0x00,0x00,0xff,0xff,0x00,0xba,0xfe,0xc0,
-0x04,0x9c,0x06,0x14,0x12,0x22,0x00,0x4e,0x00,0x00,0x10,0x02,0x02,0x81,0x76,0x00,
-0xff,0xff,0x00,0xc9,0xfe,0x87,0x04,0x6a,0x05,0xd5,0x10,0x23,0x02,0xc6,0x04,0x9a,
-0x00,0x00,0x10,0x02,0x00,0x2f,0x00,0x00,0xff,0xff,0x00,0xb6,0xfe,0x87,0x01,0x83,
-0x06,0x14,0x10,0x23,0x02,0xc6,0x03,0x1c,0x00,0x00,0x10,0x02,0x00,0x4f,0x00,0x00,
-0xff,0xff,0x00,0xc9,0xfe,0x87,0x04,0x6a,0x07,0x33,0x10,0x63,0x00,0x71,0x00,0x96,
-0x01,0x32,0x40,0x00,0x40,0x6e,0x10,0x02,0x05,0xbd,0x00,0x00,0xff,0xff,0xff,0xf1,
-0xfe,0x87,0x02,0x48,0x07,0x31,0x10,0x23,0x00,0x71,0xff,0x1c,0x01,0x3b,0x10,0x02,
-0x05,0xbe,0x00,0x00,0xff,0xff,0x00,0xc9,0xfe,0xc0,0x04,0x6a,0x05,0xd5,0x12,0x22,
-0x00,0x2f,0x00,0x00,0x10,0x03,0x02,0x81,0x00,0x8e,0x00,0x00,0xff,0xff,0x00,0x27,
-0xfe,0xc0,0x02,0x07,0x06,0x14,0x12,0x22,0x00,0x4f,0x00,0x00,0x10,0x43,0x02,0x81,
-0xff,0x7d,0x00,0x00,0x33,0x33,0x40,0x00,0xff,0xff,0x00,0xc9,0xfe,0x17,0x04,0x6a,
-0x05,0xd5,0x10,0x27,0x02,0x7a,0x00,0x97,0xf9,0x29,0x12,0x06,0x00,0x2f,0x00,0x00,
-0xff,0xff,0xff,0xde,0xfe,0x17,0x02,0x5c,0x06,0x14,0x10,0x27,0x02,0x7a,0xff,0x1d,
-0xf9,0x29,0x12,0x06,0x00,0x4f,0x00,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,0x06,0x1f,
-0x07,0x6b,0x12,0x22,0x00,0x30,0x00,0x00,0x10,0x43,0x00,0x76,0x01,0x42,0x02,0xf0,
-0x40,0x00,0x2c,0xcc,0xff,0xff,0x00,0xba,0x00,0x00,0x07,0x1d,0x06,0x66,0x12,0x22,
-0x00,0x50,0x00,0x00,0x10,0x03,0x00,0x76,0x01,0x94,0x00,0x00,0xff,0xff,0x00,0xc9,
-0x00,0x00,0x06,0x1f,0x07,0x50,0x12,0x22,0x00,0x30,0x00,0x00,0x10,0x03,0x02,0x8d,
-0x01,0x77,0x01,0x40,0xff,0xff,0x00,0xba,0x00,0x00,0x07,0x1d,0x06,0x10,0x10,0x27,
-0x02,0x8d,0x02,0x46,0x00,0x00,0x12,0x06,0x00,0x50,0x00,0x00,0xff,0xff,0x00,0xc9,
-0xfe,0x87,0x06,0x1f,0x05,0xd5,0x10,0x23,0x02,0xc6,0x05,0x74,0x00,0x00,0x10,0x02,
-0x00,0x30,0x00,0x00,0xff,0xff,0x00,0xba,0xfe,0x87,0x07,0x1d,0x04,0x7b,0x10,0x23,
-0x02,0xc6,0x05,0xe6,0x00,0x00,0x10,0x02,0x00,0x50,0x00,0x00,0xff,0xff,0x00,0xc9,
-0x00,0x00,0x05,0x33,0x07,0x37,0x10,0x27,0x0b,0xf1,0x04,0xfe,0x01,0x5c,0x12,0x06,
-0x00,0x31,0x00,0x00,0xff,0xff,0x00,0xba,0x00,0x00,0x04,0x64,0x05,0xc1,0x10,0x27,
-0x02,0x8d,0x00,0x8f,0xff,0xb1,0x12,0x06,0x00,0x51,0x00,0x00,0xff,0xff,0x00,0xc9,
-0xfe,0x87,0x05,0x33,0x05,0xd5,0x10,0x23,0x02,0xc6,0x04,0xfe,0x00,0x00,0x10,0x02,
-0x00,0x31,0x00,0x00,0xff,0xff,0x00,0xba,0xfe,0x87,0x04,0x64,0x04,0x7b,0x10,0x23,
-0x02,0xc6,0x04,0x8f,0x00,0x00,0x10,0x02,0x00,0x51,0x00,0x00,0xff,0xff,0x00,0xc9,
-0xfe,0xc0,0x05,0x33,0x05,0xd5,0x12,0x22,0x00,0x31,0x00,0x00,0x10,0x03,0x02,0x81,
-0x00,0xf7,0x00,0x00,0xff,0xff,0x00,0xba,0xfe,0xc0,0x04,0x64,0x04,0x7b,0x12,0x22,
-0x00,0x51,0x00,0x00,0x10,0x03,0x02,0x81,0x00,0x8c,0x00,0x00,0xff,0xff,0x00,0xc9,
-0xfe,0x15,0x05,0x33,0x05,0xd5,0x10,0x27,0x02,0x7a,0x00,0xfe,0xf9,0x27,0x12,0x06,
-0x00,0x31,0x00,0x00,0xff,0xff,0x00,0xba,0xfe,0x15,0x04,0x64,0x04,0x7b,0x10,0x27,
-0x02,0x7a,0x00,0x95,0xf9,0x27,0x12,0x06,0x00,0x51,0x00,0x00,0xff,0xff,0x00,0x73,
-0xff,0xe3,0x05,0xd9,0x08,0x57,0x12,0x22,0x00,0x32,0x00,0x00,0x10,0x02,0x0b,0x01,
-0x6a,0x00,0xff,0xff,0x00,0x71,0xff,0xe3,0x04,0x75,0x07,0x13,0x12,0x22,0x00,0x52,
-0x00,0x00,0x10,0x03,0x0b,0x01,0xff,0xb6,0xfe,0xbc,0xff,0xff,0x00,0x73,0xff,0xe3,
-0x05,0xd9,0x08,0x57,0x12,0x22,0x00,0x32,0x00,0x00,0x10,0x02,0x0a,0xff,0x6a,0x00,
-0xff,0xff,0x00,0x71,0xff,0xe3,0x04,0x75,0x07,0x13,0x12,0x22,0x00,0x52,0x00,0x00,
-0x10,0x03,0x0a,0xff,0xff,0xb6,0xfe,0xbc,0xff,0xff,0x00,0x73,0xff,0xe3,0x05,0xd9,
-0x08,0x57,0x12,0x22,0x00,0x32,0x00,0x00,0x10,0x02,0x0a,0xfc,0x6a,0x00,0xff,0xff,
-0x00,0x71,0xff,0xe3,0x04,0x75,0x07,0x13,0x12,0x22,0x00,0x52,0x00,0x00,0x10,0x03,
-0x0a,0xfc,0xff,0xb6,0xfe,0xbc,0xff,0xff,0x00,0x73,0xff,0xe3,0x05,0xd9,0x08,0x57,
-0x12,0x22,0x00,0x32,0x00,0x00,0x10,0x02,0x0a,0xfa,0x6a,0x00,0xff,0xff,0x00,0x71,
-0xff,0xe3,0x04,0x75,0x07,0x13,0x12,0x22,0x00,0x52,0x00,0x00,0x10,0x03,0x0a,0xfa,
-0xff,0xb6,0xfe,0xbc,0xff,0xff,0x00,0xc9,0x00,0x00,0x04,0x8d,0x07,0x6b,0x12,0x22,
-0x00,0x33,0x00,0x00,0x10,0x43,0x00,0x76,0x00,0x41,0x02,0xf0,0x40,0x00,0x2c,0xcc,
-0xff,0xff,0x00,0xba,0xfe,0x56,0x04,0xa4,0x06,0x66,0x12,0x22,0x00,0x53,0x00,0x00,
-0x10,0x02,0x00,0x76,0x32,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,0x04,0x8d,0x07,0x50,
-0x12,0x22,0x00,0x33,0x00,0x00,0x10,0x03,0x02,0x8d,0x00,0x84,0x01,0x40,0xff,0xff,
-0x00,0xba,0xfe,0x56,0x04,0xa4,0x06,0x10,0x10,0x27,0x02,0x8d,0x00,0xd9,0x00,0x00,
-0x12,0x06,0x00,0x53,0x00,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,0x05,0x54,0x07,0x50,
-0x12,0x22,0x00,0x35,0x00,0x00,0x10,0x03,0x02,0x8d,0x00,0x83,0x01,0x40,0xff,0xff,
-0x00,0xba,0x00,0x00,0x03,0x4a,0x06,0x12,0x12,0x22,0x00,0x55,0x00,0x00,0x10,0x02,
-0x02,0x8d,0x13,0x02,0xff,0xff,0x00,0xc9,0xfe,0x87,0x05,0x54,0x05,0xd5,0x10,0x23,
-0x02,0xc6,0x04,0x7d,0x00,0x00,0x10,0x02,0x00,0x35,0x00,0x00,0xff,0xff,0x00,0xba,
-0xfe,0x87,0x03,0x4a,0x04,0x7b,0x10,0x23,0x02,0xc6,0x03,0x20,0x00,0x00,0x10,0x02,
-0x00,0x55,0x00,0x00,0xff,0xff,0x00,0xc9,0xfe,0x87,0x05,0x54,0x07,0x33,0x10,0x63,
-0x00,0x71,0x00,0x7a,0x01,0x32,0x40,0x00,0x40,0x6e,0x10,0x02,0x05,0xe1,0x00,0x00,
-0xff,0xff,0x00,0xba,0xfe,0x87,0x03,0x4a,0x05,0xf5,0x10,0x22,0x00,0x71,0x18,0xff,
-0x10,0x02,0x05,0xe2,0x00,0x00,0xff,0xff,0x00,0xc9,0xfe,0xc0,0x05,0x54,0x05,0xd5,
-0x12,0x22,0x00,0x35,0x00,0x00,0x10,0x03,0x02,0x81,0x00,0xe5,0x00,0x00,0xff,0xff,
-0x00,0x54,0xfe,0xc0,0x03,0x4a,0x04,0x7b,0x12,0x22,0x00,0x55,0x00,0x00,0x10,0x03,
-0x02,0x81,0xff,0x7f,0x00,0x00,0xff,0xff,0x00,0x87,0xff,0xe3,0x04,0xa2,0x07,0x50,
-0x12,0x22,0x00,0x36,0x00,0x00,0x10,0x03,0x02,0x8d,0x00,0xb8,0x01,0x40,0xff,0xff,
-0x00,0x6f,0xff,0xe3,0x03,0xc7,0x06,0x10,0x10,0x26,0x02,0x8d,0x25,0x00,0x12,0x06,
-0x00,0x56,0x00,0x00,0xff,0xff,0x00,0x87,0xfe,0x87,0x04,0xa2,0x05,0xf0,0x10,0x23,
-0x02,0xc6,0x04,0x8a,0x00,0x00,0x10,0x02,0x00,0x36,0x00,0x00,0xff,0xff,0x00,0x6f,
-0xfe,0x87,0x03,0xc7,0x04,0x7b,0x10,0x23,0x02,0xc6,0x04,0x15,0x00,0x00,0x10,0x02,
-0x00,0x56,0x00,0x00,0xff,0xff,0x00,0x87,0xff,0xe3,0x04,0xa2,0x07,0x6b,0x12,0x22,
-0x00,0x36,0x00,0x00,0x10,0x23,0x02,0x8d,0xff,0xa4,0x01,0x5a,0x10,0x43,0x00,0x76,
-0x00,0xf2,0x02,0xf0,0x40,0x00,0x2c,0xcc,0xff,0xff,0x00,0x6f,0xff,0xe3,0x03,0xe2,
-0x06,0x66,0x12,0x22,0x00,0x56,0x00,0x00,0x10,0x22,0x02,0x8d,0x8c,0x56,0x10,0x03,
-0x00,0x76,0x00,0x90,0x00,0x00,0xff,0xff,0x00,0x87,0xff,0xe3,0x04,0xa2,0x08,0x57,
-0x12,0x22,0x00,0x36,0x00,0x00,0x10,0x02,0x0b,0x00,0xe4,0x00,0xff,0xff,0x00,0x6f,
-0xff,0xe3,0x03,0xc7,0x06,0xe4,0x12,0x22,0x00,0x56,0x00,0x00,0x10,0x03,0x0b,0x00,
-0xff,0x66,0xfe,0x8d,0xff,0xff,0x00,0x87,0xfe,0x87,0x04,0xa2,0x07,0x50,0x12,0x22,
-0x05,0xe9,0x00,0x00,0x10,0x03,0x02,0x8d,0x00,0x9b,0x01,0x40,0xff,0xff,0x00,0x6f,
-0xfe,0x87,0x03,0xc7,0x06,0x12,0x12,0x22,0x05,0xea,0x00,0x00,0x10,0x02,0x02,0x8d,
-0x2a,0x02,0xff,0xff,0xff,0xfa,0x00,0x00,0x04,0xe9,0x07,0x50,0x12,0x22,0x00,0x37,
-0x00,0x00,0x10,0x03,0x02,0x8d,0x00,0x72,0x01,0x40,0xff,0xff,0x00,0x37,0x00,0x00,
-0x02,0xf2,0x07,0x2f,0x12,0x22,0x00,0x57,0x00,0x00,0x10,0x03,0x02,0x8d,0xff,0x23,
-0x01,0x1f,0xff,0xff,0xff,0xfa,0xfe,0x87,0x04,0xe9,0x05,0xd5,0x10,0x23,0x02,0xc6,
-0x04,0x71,0x00,0x00,0x10,0x02,0x00,0x37,0x00,0x00,0xff,0xff,0x00,0x37,0xfe,0x87,
-0x02,0xf2,0x05,0x9e,0x10,0x23,0x02,0xc6,0x03,0xe8,0x00,0x00,0x10,0x02,0x00,0x57,
-0x00,0x00,0xff,0xff,0xff,0xfa,0xfe,0xc0,0x04,0xe9,0x05,0xd5,0x12,0x22,0x00,0x37,
-0x00,0x00,0x10,0x02,0x02,0x81,0x62,0x00,0xff,0xff,0x00,0x37,0xfe,0xc0,0x02,0xf2,
-0x05,0x9e,0x12,0x22,0x00,0x57,0x00,0x00,0x10,0x42,0x02,0x81,0x3c,0x00,0x33,0x33,
-0x40,0x00,0xff,0xff,0xff,0xfa,0xfe,0x15,0x04,0xe9,0x05,0xd5,0x10,0x27,0x02,0x7a,
-0x00,0x72,0xf9,0x27,0x12,0x06,0x00,0x37,0x00,0x00,0xff,0xff,0x00,0x37,0xfe,0x14,
-0x03,0x27,0x05,0x9e,0x10,0x27,0x02,0x7a,0xff,0xe8,0xf9,0x26,0x12,0x06,0x00,0x57,
-0x00,0x00,0xff,0xff,0x00,0xb2,0xfe,0x89,0x05,0x29,0x05,0xd5,0x12,0x22,0x00,0x38,
-0x00,0x00,0x10,0x03,0x02,0xc7,0x05,0x86,0x00,0x00,0xff,0xff,0x00,0xae,0xfe,0x89,
-0x04,0x66,0x04,0x60,0x12,0x22,0x00,0x58,0x00,0x00,0x10,0x03,0x02,0xc7,0x05,0x3f,
-0x00,0x00,0xff,0xff,0x00,0xb2,0xfe,0x76,0x05,0x29,0x05,0xd5,0x12,0x22,0x00,0x38,
-0x00,0x00,0x10,0x03,0x02,0xa2,0x00,0xf2,0x00,0x00,0xff,0xff,0x00,0xae,0xfe,0x76,
-0x04,0x58,0x04,0x60,0x12,0x22,0x00,0x58,0x00,0x00,0x10,0x03,0x02,0xa2,0x00,0x8f,
-0x00,0x00,0xff,0xff,0x00,0xb2,0xfd,0xdd,0x05,0x29,0x05,0xd5,0x12,0x22,0x00,0x38,
-0x00,0x00,0x10,0x03,0x02,0xd0,0x04,0xe0,0x00,0x00,0xff,0xff,0x00,0xae,0xfd,0xdd,
-0x04,0x58,0x04,0x60,0x12,0x22,0x00,0x58,0x00,0x00,0x10,0x03,0x02,0xd0,0x04,0x75,
-0x00,0x00,0xff,0xff,0x00,0xb2,0xff,0xe3,0x05,0x29,0x08,0x57,0x12,0x22,0x00,0x38,
-0x00,0x00,0x10,0x02,0x0b,0x01,0x32,0x00,0xff,0xff,0x00,0xae,0xff,0xe3,0x04,0x5b,
-0x07,0x6d,0x12,0x22,0x00,0x58,0x00,0x00,0x10,0x03,0x0b,0x01,0xff,0xc8,0xff,0x16,
-0xff,0xff,0x00,0xb2,0xff,0xe3,0x05,0x29,0x08,0x34,0x12,0x22,0x00,0x38,0x00,0x00,
-0x10,0x02,0x0a,0xf6,0x32,0x00,0xff,0xff,0x00,0xae,0xff,0xe3,0x04,0x58,0x06,0xf0,
-0x12,0x22,0x00,0x58,0x00,0x00,0x10,0x03,0x0a,0xf6,0xff,0xc8,0xfe,0xbc,0xff,0xff,
-0x00,0x10,0x00,0x00,0x05,0x68,0x07,0x7d,0x12,0x22,0x00,0x39,0x00,0x00,0x10,0x03,
-0x02,0x90,0x00,0xed,0x01,0x46,0xff,0xff,0x00,0x3d,0x00,0x00,0x04,0x7f,0x06,0x37,
-0x12,0x22,0x00,0x59,0x00,0x00,0x10,0x02,0x02,0x90,0x6d,0x00,0xff,0xff,0x00,0x10,
-0xfe,0x87,0x05,0x68,0x05,0xd5,0x10,0x26,0x00,0x39,0x00,0x00,0x10,0x07,0x02,0xc6,
-0x04,0xbc,0x00,0x00,0xff,0xff,0x00,0x3d,0xfe,0x87,0x04,0x7f,0x04,0x60,0x10,0x26,
-0x00,0x59,0x00,0x00,0x10,0x07,0x02,0xc6,0x04,0x5e,0x00,0x00,0xff,0xff,0x00,0x44,
-0x00,0x00,0x07,0xa6,0x07,0x72,0x10,0x27,0x0b,0xec,0x05,0xf5,0x01,0x7c,0x12,0x06,
-0x00,0x3a,0x00,0x00,0xff,0xff,0x00,0x56,0x00,0x00,0x06,0x35,0x06,0x6b,0x10,0x27,
-0x00,0x43,0x01,0x09,0x00,0x05,0x12,0x06,0x00,0x5a,0x00,0x00,0xff,0xff,0x00,0x44,
-0x00,0x00,0x07,0xa6,0x07,0x72,0x10,0x27,0x0b,0xea,0x05,0xf5,0x01,0x7c,0x12,0x06,
-0x00,0x3a,0x00,0x00,0xff,0xff,0x00,0x56,0x00,0x00,0x06,0x35,0x06,0x6d,0x10,0x27,
-0x00,0x76,0x01,0x86,0x00,0x07,0x12,0x06,0x00,0x5a,0x00,0x00,0xff,0xff,0x00,0x44,
-0x00,0x00,0x07,0xa6,0x07,0x34,0x10,0x27,0x00,0x6a,0x01,0xf5,0x01,0x24,0x12,0x06,
-0x00,0x3a,0x00,0x00,0xff,0xff,0x00,0x56,0x00,0x00,0x06,0x35,0x05,0xbf,0x10,0x27,
-0x00,0x6a,0x01,0x45,0xff,0xaf,0x12,0x06,0x00,0x5a,0x00,0x00,0xff,0xff,0x00,0x44,
-0x00,0x00,0x07,0xa6,0x07,0x50,0x12,0x22,0x00,0x3a,0x00,0x00,0x10,0x03,0x02,0x8d,
-0x01,0xf5,0x01,0x40,0xff,0xff,0x00,0x56,0x00,0x00,0x06,0x35,0x06,0x12,0x12,0x22,
-0x00,0x5a,0x00,0x00,0x10,0x03,0x02,0x8d,0x01,0x47,0x00,0x02,0xff,0xff,0x00,0x44,
-0xfe,0x87,0x07,0xa6,0x05,0xd5,0x12,0x22,0x00,0x3a,0x00,0x00,0x10,0x03,0x02,0xc6,
-0x05,0xfb,0x00,0x00,0xff,0xff,0x00,0x56,0xfe,0x87,0x06,0x35,0x04,0x60,0x12,0x22,
-0x00,0x5a,0x00,0x00,0x10,0x03,0x02,0xc6,0x05,0x4a,0x00,0x00,0xff,0xff,0x00,0x3d,
-0x00,0x00,0x05,0x3b,0x07,0x50,0x12,0x22,0x00,0x3b,0x00,0x00,0x10,0x03,0x02,0x8d,
-0x00,0xca,0x01,0x40,0xff,0xff,0x00,0x3b,0x00,0x00,0x04,0x79,0x06,0x12,0x12,0x22,
-0x00,0x5b,0x00,0x00,0x10,0x02,0x02,0x8d,0x67,0x02,0xff,0xff,0x00,0x3d,0x00,0x00,
-0x05,0x3b,0x07,0x4e,0x12,0x22,0x00,0x3b,0x00,0x00,0x10,0x03,0x00,0x6a,0x00,0xca,
-0x01,0x3e,0xff,0xff,0x00,0x3b,0x00,0x00,0x04,0x79,0x06,0x10,0x12,0x22,0x00,0x5b,
-0x00,0x00,0x10,0x02,0x00,0x6a,0x66,0x00,0xff,0xff,0xff,0xfc,0x00,0x00,0x04,0xe7,
-0x07,0x50,0x12,0x22,0x00,0x3c,0x00,0x00,0x10,0x03,0x02,0x8d,0x00,0x70,0x01,0x40,
-0xff,0xff,0x00,0x3d,0xfe,0x56,0x04,0x7f,0x06,0x10,0x12,0x22,0x00,0x5c,0x00,0x00,
-0x10,0x02,0x02,0x8d,0x66,0x00,0xff,0xff,0x00,0x5c,0x00,0x00,0x05,0x1f,0x07,0x6b,
-0x12,0x22,0x00,0x3d,0x00,0x00,0x10,0x43,0x02,0x7a,0x00,0xbe,0x02,0xf0,0x40,0x00,
-0x2c,0xcc,0xff,0xff,0x00,0x58,0x00,0x00,0x03,0xdb,0x06,0x66,0x12,0x22,0x00,0x5d,
-0x00,0x00,0x10,0x02,0x02,0x7a,0x1a,0x00,0xff,0xff,0x00,0x5c,0xfe,0x87,0x05,0x1f,
-0x05,0xd5,0x12,0x22,0x00,0x3d,0x00,0x00,0x10,0x03,0x02,0xc6,0x04,0xd9,0x00,0x00,
-0xff,0xff,0x00,0x58,0xfe,0x87,0x03,0xdb,0x04,0x60,0x12,0x22,0x00,0x5d,0x00,0x00,
-0x10,0x03,0x02,0xc6,0x04,0x31,0x00,0x00,0xff,0xff,0x00,0x5c,0xfe,0xc0,0x05,0x1f,
-0x05,0xd5,0x12,0x22,0x00,0x3d,0x00,0x00,0x10,0x03,0x02,0x81,0x00,0xc7,0x00,0x00,
-0xff,0xff,0x00,0x58,0xfe,0xc0,0x03,0xdb,0x04,0x60,0x12,0x22,0x00,0x5d,0x00,0x00,
-0x10,0x02,0x02,0x81,0x1b,0x00,0xff,0xff,0x00,0xba,0xfe,0xc0,0x04,0x64,0x06,0x14,
-0x12,0x22,0x00,0x4b,0x00,0x00,0x10,0x02,0x02,0x81,0x66,0x00,0xff,0xff,0x00,0x04,
-0x00,0x00,0x02,0xf2,0x07,0x4e,0x12,0x22,0x00,0x57,0x00,0x00,0x10,0x03,0x00,0x6a,
-0xff,0x2d,0x01,0x3e,0xff,0xff,0x00,0x56,0x00,0x00,0x06,0x35,0x07,0x06,0x12,0x22,
-0x00,0x5a,0x00,0x00,0x10,0x03,0x02,0x8e,0x01,0x42,0x00,0x00,0xff,0xff,0x00,0x3d,
-0xfe,0x56,0x04,0x7f,0x07,0x06,0x12,0x22,0x00,0x5c,0x00,0x00,0x10,0x03,0x02,0x8e,
-0x00,0x81,0x00,0x00,0xff,0xff,0x00,0x7b,0xff,0xe3,0x05,0x61,0x06,0x14,0x12,0x22,
-0x00,0x44,0x00,0x00,0x10,0x03,0x02,0x72,0x03,0xda,0x00,0x00,0xff,0xff,0x00,0x2f,
-0x00,0x00,0x02,0xf8,0x07,0x50,0x12,0x22,0x01,0x41,0x00,0x00,0x10,0x03,0x02,0x8d,
-0xff,0xfd,0x01,0x40,0xff,0xff,0x00,0x10,0xfe,0x87,0x05,0x68,0x05,0xd5,0x12,0x22,
-0x00,0x24,0x00,0x00,0x10,0x03,0x02,0xc6,0x04,0xb7,0x00,0x00,0xff,0xff,0x00,0x7b,
-0xfe,0x87,0x04,0x2d,0x04,0x7b,0x12,0x22,0x00,0x44,0x00,0x00,0x10,0x03,0x02,0xc6,
-0x04,0x21,0x00,0x00,0xff,0xff,0x00,0x10,0x00,0x00,0x05,0x68,0x07,0xee,0x12,0x22,
-0x00,0x24,0x00,0x00,0x10,0x03,0x02,0xac,0x05,0x4c,0x01,0x73,0xff,0xff,0x00,0x7b,
-0xff,0xe3,0x04,0x2d,0x06,0x7b,0x12,0x22,0x00,0x44,0x00,0x00,0x10,0x03,0x02,0xac,
-0x04,0xd5,0x00,0x00,0xff,0xff,0x00,0x10,0x00,0x00,0x05,0x79,0x08,0x35,0x12,0x22,
-0x00,0x24,0x00,0x00,0x10,0x02,0x0b,0x02,0x00,0x00,0xff,0xff,0x00,0x7b,0xff,0xe3,
-0x05,0x01,0x06,0xc2,0x12,0x22,0x00,0x44,0x00,0x00,0x10,0x03,0x0b,0x02,0xff,0x88,
-0xfe,0x8d,0xff,0xff,0xff,0xfe,0x00,0x00,0x05,0x68,0x08,0x35,0x12,0x22,0x00,0x24,
-0x00,0x00,0x10,0x02,0x0b,0x03,0x00,0x00,0xff,0xff,0xff,0x86,0xff,0xe3,0x04,0x2d,
-0x06,0xc2,0x12,0x22,0x00,0x44,0x00,0x00,0x10,0x03,0x0b,0x03,0xff,0x88,0xfe,0x8d,
-0xff,0xff,0x00,0x10,0x00,0x00,0x05,0x68,0x08,0x57,0x12,0x22,0x00,0x24,0x00,0x00,
-0x10,0x02,0x0b,0x09,0x00,0x00,0xff,0xff,0x00,0x7b,0xff,0xe3,0x04,0x90,0x06,0xe4,
-0x12,0x22,0x00,0x44,0x00,0x00,0x10,0x03,0x0b,0x09,0xff,0x88,0xfe,0x8d,0xff,0xff,
-0x00,0x10,0x00,0x00,0x05,0x68,0x08,0x57,0x12,0x22,0x00,0x24,0x00,0x00,0x10,0x02,
-0x0b,0x04,0x00,0x00,0xff,0xff,0x00,0x7b,0xff,0xe3,0x04,0x2d,0x06,0xe4,0x12,0x22,
-0x00,0x44,0x00,0x00,0x10,0x03,0x0b,0x04,0xff,0x88,0xfe,0x8d,0xff,0xff,0x00,0x10,
-0xfe,0x87,0x05,0x68,0x07,0x6d,0x12,0x22,0x00,0x84,0x00,0x00,0x10,0x03,0x02,0xc6,
-0x04,0xaf,0x00,0x00,0xff,0xff,0x00,0x7b,0xfe,0x87,0x04,0x2d,0x06,0x66,0x12,0x22,
-0x00,0xa4,0x00,0x00,0x10,0x03,0x02,0xc6,0x04,0x22,0x00,0x00,0xff,0xff,0x00,0x10,
-0x00,0x00,0x05,0x68,0x08,0x57,0x12,0x22,0x00,0x24,0x00,0x00,0x10,0x02,0x0b,0x06,
-0x00,0x00,0xff,0xff,0x00,0x7b,0xff,0xe3,0x04,0x2d,0x06,0xe4,0x12,0x22,0x00,0x44,
-0x00,0x00,0x10,0x03,0x0b,0x06,0xff,0x88,0xfe,0x8d,0xff,0xff,0x00,0x10,0x00,0x00,
-0x05,0x68,0x08,0x57,0x12,0x22,0x00,0x24,0x00,0x00,0x10,0x02,0x0b,0x07,0x00,0x00,
-0xff,0xff,0x00,0x7b,0xff,0xe3,0x04,0x2d,0x06,0xe4,0x12,0x22,0x00,0x44,0x00,0x00,
-0x10,0x03,0x0b,0x07,0xff,0x88,0xfe,0x8d,0xff,0xff,0x00,0x10,0x00,0x00,0x05,0x68,
-0x08,0x57,0x12,0x22,0x00,0x24,0x00,0x00,0x10,0x02,0x0b,0x08,0x00,0x00,0xff,0xff,
-0x00,0x7b,0xff,0xe3,0x04,0x2d,0x06,0xe4,0x12,0x22,0x00,0x44,0x00,0x00,0x10,0x03,
-0x0b,0x08,0xff,0x88,0xfe,0x8d,0xff,0xff,0x00,0x10,0x00,0x00,0x05,0x68,0x08,0x57,
-0x12,0x22,0x00,0x24,0x00,0x00,0x10,0x02,0x0b,0x05,0x00,0x00,0xff,0xff,0x00,0x7b,
-0xff,0xe3,0x04,0x2d,0x06,0xe4,0x12,0x22,0x00,0x44,0x00,0x00,0x10,0x03,0x0b,0x05,
-0xff,0x88,0xfe,0x8d,0xff,0xff,0x00,0x10,0xfe,0x87,0x05,0x68,0x07,0x92,0x12,0x22,
-0x00,0xc4,0x00,0x00,0x10,0x03,0x02,0xc6,0x04,0xc0,0x00,0x00,0xff,0xff,0x00,0x7b,
-0xfe,0x87,0x04,0x2d,0x06,0x1f,0x12,0x22,0x00,0xc5,0x00,0x00,0x10,0x03,0x02,0xc6,
-0x04,0x33,0x00,0x00,0xff,0xff,0x00,0xc9,0xfe,0x87,0x04,0x8b,0x05,0xd5,0x10,0x27,
-0x02,0xc6,0x04,0x9e,0x00,0x00,0x10,0x06,0x00,0x28,0x00,0x00,0xff,0xff,0x00,0x71,
-0xfe,0x87,0x04,0x7f,0x04,0x7b,0x10,0x27,0x02,0xc6,0x04,0x8b,0x00,0x00,0x10,0x06,
-0x00,0x48,0x00,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,0x04,0x8b,0x07,0xee,0x12,0x22,
-0x00,0x28,0x00,0x00,0x10,0x03,0x02,0xac,0x05,0x35,0x01,0x73,0xff,0xff,0x00,0x71,
-0xff,0xe3,0x04,0x7f,0x06,0x7b,0x12,0x22,0x00,0x48,0x00,0x00,0x10,0x03,0x02,0xac,
-0x05,0x1f,0x00,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,0x04,0x8b,0x07,0x45,0x12,0x22,
-0x00,0x28,0x00,0x00,0x10,0x43,0x02,0x90,0x00,0xb9,0x02,0x4c,0x40,0x00,0x33,0x33,
-0xff,0xff,0x00,0x71,0xff,0xe3,0x04,0x7f,0x06,0x37,0x12,0x22,0x00,0x48,0x00,0x00,
-0x10,0x03,0x02,0x90,0x00,0x97,0x00,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,0x05,0x67,
-0x08,0x35,0x12,0x22,0x00,0x28,0x00,0x00,0x10,0x02,0x0b,0x02,0xee,0x00,0xff,0xff,
-0x00,0x71,0xff,0xe3,0x05,0x41,0x06,0xc2,0x12,0x22,0x00,0x48,0x00,0x00,0x10,0x03,
-0x0b,0x02,0xff,0xc8,0xfe,0x8d,0xff,0xff,0xff,0xec,0x00,0x00,0x04,0x8b,0x08,0x35,
-0x12,0x22,0x00,0x28,0x00,0x00,0x10,0x02,0x0b,0x03,0xee,0x00,0xff,0xff,0xff,0xc6,
-0xff,0xe3,0x04,0x7f,0x06,0xc2,0x12,0x22,0x00,0x48,0x00,0x00,0x10,0x03,0x0b,0x03,
-0xff,0xc8,0xfe,0x8d,0xff,0xff,0x00,0xc9,0x00,0x00,0x04,0xf6,0x08,0x57,0x12,0x22,
-0x00,0x28,0x00,0x00,0x10,0x02,0x0b,0x09,0xee,0x00,0xff,0xff,0x00,0x71,0xff,0xe3,
-0x04,0xda,0x06,0xe4,0x12,0x22,0x00,0x48,0x00,0x00,0x10,0x03,0x0b,0x09,0xff,0xd2,
-0xfe,0x8d,0xff,0xff,0x00,0xc9,0x00,0x00,0x04,0x8b,0x08,0x57,0x12,0x22,0x00,0x28,
-0x00,0x00,0x10,0x02,0x0b,0x04,0xee,0x00,0xff,0xff,0x00,0x71,0xff,0xe3,0x04,0x7f,
-0x06,0xe4,0x12,0x22,0x00,0x48,0x00,0x00,0x10,0x03,0x0b,0x04,0xff,0xc8,0xfe,0x8d,
-0xff,0xff,0x00,0xc9,0xfe,0x87,0x04,0x8b,0x07,0x6d,0x10,0x27,0x02,0xc6,0x04,0x9e,
-0x00,0x00,0x12,0x02,0x00,0x8c,0x00,0x00,0xff,0xff,0x00,0x71,0xfe,0x87,0x04,0x7f,
-0x06,0x66,0x10,0x27,0x02,0xc6,0x04,0x8b,0x00,0x00,0x12,0x02,0x00,0xac,0x00,0x00,
-0xff,0xff,0x00,0xc9,0x00,0x00,0x02,0xb3,0x07,0xef,0x12,0x22,0x00,0x2c,0x00,0x00,
-0x10,0x03,0x02,0xac,0x03,0xbc,0x01,0x74,0xff,0xff,0x00,0xc1,0x00,0x00,0x02,0xa1,
-0x06,0x7b,0x12,0x22,0x00,0xf3,0x00,0x00,0x10,0x03,0x02,0xac,0x03,0xaa,0x00,0x00,
-0xff,0xff,0x00,0xc8,0xfe,0x87,0x01,0x94,0x05,0xd5,0x10,0x27,0x02,0xc6,0x03,0x2e,
-0x00,0x00,0x10,0x06,0x00,0x2c,0x00,0x00,0xff,0xff,0x00,0xb7,0xfe,0x87,0x01,0x83,
-0x06,0x14,0x10,0x27,0x02,0xc6,0x03,0x1d,0x00,0x00,0x10,0x06,0x00,0x4c,0x00,0x00,
-0xff,0xff,0x00,0x73,0xfe,0x87,0x05,0xd9,0x05,0xf0,0x10,0x27,0x02,0xc6,0x05,0x27,
-0x00,0x00,0x10,0x06,0x00,0x32,0x00,0x00,0xff,0xff,0x00,0x71,0xfe,0x87,0x04,0x75,
-0x04,0x7b,0x10,0x27,0x02,0xc6,0x04,0x73,0x00,0x00,0x10,0x06,0x00,0x52,0x00,0x00,
-0xff,0xff,0x00,0x73,0xff,0xe3,0x05,0xd9,0x07,0xee,0x12,0x22,0x00,0x32,0x00,0x00,
-0x10,0x03,0x02,0xac,0x05,0xb3,0x01,0x73,0xff,0xff,0x00,0x71,0xff,0xe3,0x04,0x75,
-0x06,0x7b,0x12,0x22,0x00,0x52,0x00,0x00,0x10,0x03,0x02,0xac,0x04,0xfc,0x00,0x00,
-0xff,0xff,0x00,0x73,0xff,0xe3,0x05,0xe3,0x08,0x35,0x12,0x22,0x00,0x32,0x00,0x00,
-0x10,0x02,0x0b,0x02,0x6a,0x00,0xff,0xff,0x00,0x71,0xff,0xe3,0x05,0x2f,0x06,0xc2,
-0x12,0x22,0x00,0x52,0x00,0x00,0x10,0x03,0x0b,0x02,0xff,0xb6,0xfe,0x8d,0xff,0xff,
-0x00,0x68,0xff,0xe3,0x05,0xd9,0x08,0x35,0x12,0x22,0x00,0x32,0x00,0x00,0x10,0x02,
-0x0b,0x03,0x6a,0x00,0xff,0xff,0xff,0xb4,0xff,0xe3,0x04,0x75,0x06,0xc2,0x12,0x22,
-0x00,0x52,0x00,0x00,0x10,0x03,0x0b,0x03,0xff,0xb6,0xfe,0x8d,0xff,0xff,0x00,0x73,
-0xff,0xe3,0x05,0xd9,0x08,0x57,0x12,0x22,0x00,0x32,0x00,0x00,0x10,0x02,0x0b,0x09,
-0x6a,0x00,0xff,0xff,0x00,0x71,0xff,0xe3,0x04,0xbe,0x06,0xe4,0x12,0x22,0x00,0x52,
-0x00,0x00,0x10,0x03,0x0b,0x09,0xff,0xb6,0xfe,0x8d,0xff,0xff,0x00,0x73,0xff,0xe3,
-0x05,0xd9,0x08,0x57,0x12,0x22,0x00,0x32,0x00,0x00,0x10,0x02,0x0b,0x04,0x6a,0x00,
-0xff,0xff,0x00,0x71,0xff,0xe3,0x04,0x75,0x06,0xe4,0x12,0x22,0x00,0x52,0x00,0x00,
-0x10,0x03,0x0b,0x04,0xff,0xb6,0xfe,0x8d,0xff,0xff,0x00,0x73,0xfe,0x87,0x05,0xd9,
-0x07,0x6d,0x10,0x27,0x02,0xc6,0x05,0x27,0x00,0x00,0x12,0x02,0x00,0x96,0x00,0x00,
-0xff,0xff,0x00,0x71,0xfe,0x87,0x04,0x75,0x06,0x66,0x10,0x27,0x02,0xc6,0x04,0x73,
-0x00,0x00,0x12,0x02,0x00,0xb6,0x00,0x00,0xff,0xff,0x00,0x67,0xff,0xe3,0x06,0xdb,
-0x07,0x6b,0x12,0x22,0x01,0x62,0x00,0x00,0x10,0x43,0x00,0x76,0x00,0xa9,0x02,0xf0,
-0x40,0x00,0x2c,0xcc,0xff,0xff,0x00,0x76,0xff,0xe3,0x05,0x74,0x06,0x66,0x12,0x22,
-0x01,0x63,0x00,0x00,0x10,0x02,0x00,0x76,0x16,0x00,0xff,0xff,0x00,0x67,0xff,0xe3,
-0x06,0xdb,0x07,0x6b,0x12,0x22,0x01,0x62,0x00,0x00,0x10,0x43,0x00,0x43,0x01,0x85,
-0x02,0xf0,0x40,0x00,0x2c,0xcc,0xff,0xff,0x00,0x76,0xff,0xe3,0x05,0x74,0x06,0x66,
-0x12,0x22,0x01,0x63,0x00,0x00,0x10,0x03,0x00,0x43,0x00,0xe6,0x00,0x00,0xff,0xff,
-0x00,0x67,0xff,0xe3,0x06,0xdb,0x07,0xee,0x12,0x22,0x01,0x62,0x00,0x00,0x10,0x03,
-0x02,0xac,0x05,0xb3,0x01,0x73,0xff,0xff,0x00,0x76,0xff,0xe3,0x05,0x74,0x06,0x7b,
-0x12,0x22,0x01,0x63,0x00,0x00,0x10,0x03,0x02,0xac,0x04,0xfc,0x00,0x00,0xff,0xff,
-0x00,0x67,0xff,0xe3,0x06,0xdb,0x07,0x45,0x12,0x22,0x01,0x62,0x00,0x00,0x10,0x43,
-0x02,0x90,0x01,0x0a,0x02,0x4c,0x40,0x00,0x33,0x33,0xff,0xff,0x00,0x76,0xff,0xe3,
-0x05,0x74,0x06,0x37,0x12,0x22,0x01,0x63,0x00,0x00,0x10,0x02,0x02,0x90,0x5e,0x00,
-0xff,0xff,0x00,0x67,0xfe,0x87,0x06,0xdb,0x05,0xf0,0x10,0x27,0x02,0xc6,0x05,0x27,
-0x00,0x00,0x12,0x02,0x01,0x62,0x00,0x00,0xff,0xff,0x00,0x76,0xfe,0x87,0x05,0x74,
-0x04,0x7b,0x10,0x27,0x02,0xc6,0x04,0x73,0x00,0x00,0x12,0x02,0x01,0x63,0x00,0x00,
-0xff,0xff,0x00,0xb2,0xfe,0x87,0x05,0x29,0x05,0xd5,0x10,0x27,0x02,0xc6,0x04,0xf5,
-0x00,0x00,0x10,0x06,0x00,0x38,0x00,0x00,0xff,0xff,0x00,0xae,0xfe,0x87,0x04,0x58,
-0x04,0x60,0x10,0x27,0x02,0xc6,0x04,0x7b,0x00,0x00,0x10,0x06,0x00,0x58,0x00,0x00,
-0xff,0xff,0x00,0xb2,0xff,0xe3,0x05,0x29,0x07,0xee,0x12,0x22,0x00,0x38,0x00,0x00,
-0x10,0x03,0x02,0xac,0x05,0x67,0x01,0x73,0xff,0xff,0x00,0xae,0xff,0xe3,0x04,0x58,
-0x06,0x7b,0x12,0x22,0x00,0x58,0x00,0x00,0x10,0x03,0x02,0xac,0x05,0x14,0x00,0x00,
-0xff,0xff,0x00,0xad,0xff,0xf7,0x06,0x6a,0x07,0x6b,0x12,0x22,0x01,0x71,0x00,0x00,
-0x10,0x43,0x00,0x76,0x00,0xa3,0x02,0xf0,0x40,0x00,0x2c,0xcc,0xff,0xff,0x00,0xb0,
-0xff,0xe3,0x05,0xa1,0x06,0x66,0x12,0x22,0x01,0x72,0x00,0x00,0x10,0x02,0x00,0x76,
-0x1c,0x00,0xff,0xff,0x00,0xad,0xff,0xf7,0x06,0x6a,0x07,0x6b,0x12,0x22,0x01,0x71,
-0x00,0x00,0x10,0x43,0x00,0x43,0x01,0x4b,0x02,0xf0,0x40,0x00,0x2c,0xcc,0xff,0xff,
-0x00,0xb0,0xff,0xe3,0x05,0xa1,0x06,0x66,0x12,0x22,0x01,0x72,0x00,0x00,0x10,0x03,
-0x00,0x43,0x00,0xbc,0x00,0x00,0xff,0xff,0x00,0xad,0xff,0xf7,0x06,0x6a,0x07,0xee,
-0x12,0x22,0x01,0x71,0x00,0x00,0x10,0x03,0x02,0xac,0x05,0x67,0x01,0x73,0xff,0xff,
-0x00,0xb0,0xff,0xe3,0x05,0xa1,0x06,0x7b,0x12,0x22,0x01,0x72,0x00,0x00,0x10,0x03,
-0x02,0xac,0x05,0x14,0x00,0x00,0xff,0xff,0x00,0xad,0xff,0xf7,0x06,0x6a,0x07,0x45,
-0x12,0x22,0x01,0x71,0x00,0x00,0x10,0x43,0x02,0x90,0x01,0x0c,0x02,0x4c,0x40,0x00,
-0x33,0x33,0xff,0xff,0x00,0xb0,0xff,0xe3,0x05,0xa1,0x06,0x37,0x12,0x22,0x01,0x72,
-0x00,0x00,0x10,0x03,0x02,0x90,0x00,0x80,0x00,0x00,0xff,0xff,0x00,0xad,0xfe,0x87,
-0x06,0x6a,0x05,0xe9,0x10,0x27,0x02,0xc6,0x04,0xf5,0x00,0x00,0x12,0x02,0x01,0x71,
-0x00,0x00,0xff,0xff,0x00,0xb0,0xfe,0x87,0x05,0xa1,0x04,0x71,0x10,0x27,0x02,0xc6,
-0x04,0x7b,0x00,0x00,0x12,0x02,0x01,0x72,0x00,0x00,0xff,0xff,0xff,0xfc,0x00,0x00,
-0x04,0xe7,0x07,0x72,0x10,0x27,0x0b,0xec,0x04,0x72,0x01,0x7c,0x12,0x06,0x00,0x3c,
-0x00,0x00,0xff,0xff,0x00,0x3d,0xfe,0x56,0x04,0x7f,0x06,0x6b,0x10,0x26,0x00,0x43,
-0x21,0x05,0x12,0x06,0x00,0x5c,0x00,0x00,0xff,0xff,0xff,0xfc,0xfe,0x82,0x04,0xe7,
-0x05,0xd5,0x12,0x22,0x00,0x3c,0x00,0x00,0x10,0x03,0x02,0xc6,0x04,0x76,0xff,0xfb,
-0xff,0xff,0x00,0x3d,0xfe,0x56,0x04,0x7f,0x04,0x60,0x12,0x22,0x00,0x5c,0x00,0x00,
-0x10,0x03,0x02,0xc6,0x05,0x74,0x00,0x00,0xff,0xff,0xff,0xfc,0x00,0x00,0x04,0xe7,
-0x07,0xee,0x12,0x22,0x00,0x3c,0x00,0x00,0x10,0x03,0x02,0xac,0x04,0xff,0x01,0x73,
-0xff,0xff,0x00,0x3d,0xfe,0x56,0x04,0x7f,0x06,0x7b,0x12,0x22,0x00,0x5c,0x00,0x00,
-0x10,0x03,0x02,0xac,0x04,0xf3,0x00,0x00,0xff,0xff,0xff,0xfc,0x00,0x00,0x04,0xe7,
-0x07,0x45,0x12,0x22,0x00,0x3c,0x00,0x00,0x10,0x43,0x02,0x90,0x00,0x79,0x02,0x4c,
-0x40,0x00,0x33,0x33,0xff,0xff,0x00,0x3d,0xfe,0x56,0x04,0x7f,0x06,0x37,0x12,0x22,
-0x00,0x5c,0x00,0x00,0x10,0x02,0x02,0x90,0x77,0x00,0xff,0xff,0x00,0x71,0xff,0xe6,
-0x04,0xe5,0x06,0x72,0x10,0x26,0x03,0x2a,0x00,0x00,0x10,0x06,0x07,0x2d,0x70,0x00,
-0xff,0xff,0x00,0x71,0xff,0xe6,0x04,0xe5,0x06,0x72,0x10,0x26,0x03,0x2a,0x00,0x00,
-0x10,0x06,0x07,0x65,0x48,0x00,0xff,0xff,0x00,0x71,0xff,0xe6,0x04,0xe5,0x06,0x72,
-0x10,0x26,0x03,0x2a,0x00,0x00,0x10,0x07,0x07,0x3a,0x00,0x94,0x00,0x00,0xff,0xff,
-0x00,0x71,0xff,0xe6,0x04,0xe5,0x06,0x72,0x10,0x26,0x03,0x2a,0x00,0x00,0x10,0x07,
-0x07,0x47,0x00,0x84,0x00,0x00,0xff,0xff,0x00,0x71,0xff,0xe6,0x04,0xe5,0x06,0x72,
-0x10,0x26,0x03,0x2a,0x00,0x00,0x10,0x07,0x07,0x3b,0x00,0x84,0x00,0x00,0xff,0xff,
-0x00,0x71,0xff,0xe6,0x04,0xe5,0x06,0x72,0x10,0x26,0x03,0x2a,0x00,0x00,0x10,0x07,
-0x07,0x48,0x00,0xa0,0x00,0x00,0xff,0xff,0x00,0x71,0xff,0xe6,0x04,0xe5,0x07,0xd0,
-0x10,0x26,0x03,0x2a,0x00,0x00,0x10,0x06,0x07,0x3c,0x76,0x00,0xff,0xff,0x00,0x71,
-0xff,0xe6,0x04,0xe5,0x07,0xd0,0x10,0x26,0x03,0x2a,0x00,0x00,0x10,0x06,0x07,0x49,
-0x44,0x00,0xff,0xff,0x00,0x10,0x00,0x00,0x05,0x68,0x06,0x72,0x10,0x26,0x03,0x0b,
-0x00,0x00,0x10,0x07,0x07,0x2d,0xff,0x23,0x00,0x00,0xff,0xff,0x00,0x10,0x00,0x00,
-0x05,0x68,0x06,0x72,0x10,0x26,0x03,0x0b,0x00,0x00,0x10,0x07,0x07,0x65,0xfe,0xf3,
-0x00,0x00,0xff,0xff,0x00,0x05,0x00,0x00,0x06,0xf4,0x06,0x72,0x10,0x27,0x03,0x0b,
-0x01,0x8c,0x00,0x00,0x10,0x07,0x07,0x3a,0xff,0x7c,0x00,0x00,0xff,0xff,0x00,0x06,
-0x00,0x00,0x06,0xf4,0x06,0x72,0x10,0x27,0x03,0x0b,0x01,0x8c,0x00,0x00,0x10,0x06,
-0x07,0x47,0x88,0x00,0xff,0xff,0x00,0x07,0x00,0x00,0x06,0x16,0x06,0x72,0x10,0x27,
-0x03,0x0b,0x00,0xae,0x00,0x00,0x10,0x07,0x07,0x3b,0xff,0x53,0x00,0x00,0xff,0xff,
-0x00,0x04,0x00,0x00,0x06,0x58,0x06,0x72,0x10,0x27,0x03,0x0b,0x00,0xf0,0x00,0x00,
-0x10,0x07,0x07,0x48,0xff,0x6f,0x00,0x00,0xff,0xff,0x00,0x07,0x00,0x00,0x05,0x99,
-0x07,0xd0,0x10,0x26,0x03,0x0b,0x31,0x00,0x10,0x07,0x07,0x3c,0xff,0x51,0x00,0x00,
-0xff,0xff,0x00,0x04,0x00,0x00,0x05,0xe0,0x07,0xd0,0x10,0x26,0x03,0x0b,0x78,0x00,
-0x10,0x07,0x07,0x49,0xff,0x4e,0x00,0x00,0xff,0xff,0x00,0x85,0xff,0xe3,0x03,0xc8,
-0x06,0x72,0x10,0x26,0x03,0x2e,0x00,0x00,0x10,0x06,0x07,0x2d,0x44,0x00,0xff,0xff,
-0x00,0x85,0xff,0xe3,0x03,0xc8,0x06,0x72,0x10,0x26,0x03,0x2e,0x00,0x00,0x10,0x06,
-0x07,0x65,0x39,0x00,0xff,0xff,0x00,0x85,0xff,0xe3,0x03,0xc8,0x06,0x72,0x10,0x26,
-0x03,0x2e,0x00,0x00,0x10,0x06,0x07,0x3a,0x20,0x00,0xff,0xff,0x00,0x85,0xff,0xe3,
-0x03,0xc8,0x06,0x72,0x10,0x26,0x03,0x2e,0x00,0x00,0x10,0x06,0x07,0x47,0x25,0x00,
-0xff,0xff,0x00,0x85,0xff,0xe3,0x03,0xe3,0x06,0x72,0x10,0x26,0x03,0x2e,0x00,0x00,
-0x10,0x06,0x07,0x3b,0x4f,0x00,0xff,0xff,0x00,0x85,0xff,0xe3,0x04,0x03,0x06,0x72,
-0x10,0x26,0x03,0x2e,0x00,0x00,0x10,0x06,0x07,0x48,0x52,0x00,0xff,0xff,0x00,0x07,
-0x00,0x00,0x05,0x2d,0x06,0x72,0x10,0x27,0x03,0x0f,0x00,0xa2,0x00,0x00,0x10,0x07,
-0x07,0x2d,0xfe,0x81,0x00,0x00,0xff,0xff,0x00,0x07,0x00,0x00,0x05,0x2d,0x06,0x72,
-0x10,0x27,0x03,0x0f,0x00,0xa2,0x00,0x00,0x10,0x07,0x07,0x65,0xfe,0x81,0x00,0x00,
-0xff,0xff,0x00,0x05,0x00,0x00,0x07,0x37,0x06,0x72,0x10,0x27,0x03,0x0f,0x02,0xac,
-0x00,0x00,0x10,0x07,0x07,0x3a,0xff,0x7c,0x00,0x00,0xff,0xff,0x00,0x06,0x00,0x00,
-0x07,0x49,0x06,0x72,0x10,0x27,0x03,0x0f,0x02,0xbe,0x00,0x00,0x10,0x06,0x07,0x47,
-0x88,0x00,0xff,0xff,0x00,0x07,0x00,0x00,0x06,0xad,0x06,0x72,0x10,0x27,0x03,0x0f,
-0x02,0x22,0x00,0x00,0x10,0x07,0x07,0x3b,0xff,0x53,0x00,0x00,0xff,0xff,0x00,0x04,
-0x00,0x00,0x06,0xe9,0x06,0x72,0x10,0x27,0x03,0x0f,0x02,0x5e,0x00,0x00,0x10,0x07,
-0x07,0x48,0xff,0x6f,0x00,0x00,0xff,0xff,0x00,0xba,0xfe,0x56,0x04,0x64,0x06,0x72,
-0x10,0x26,0x03,0x30,0x00,0x00,0x10,0x07,0x07,0x2d,0x00,0xa6,0x00,0x00,0xff,0xff,
-0x00,0xba,0xfe,0x56,0x04,0x64,0x06,0x72,0x10,0x26,0x03,0x30,0x00,0x00,0x10,0x07,
-0x07,0x65,0x00,0xa2,0x00,0x00,0xff,0xff,0x00,0xba,0xfe,0x56,0x04,0x64,0x06,0x72,
-0x10,0x26,0x03,0x30,0x00,0x00,0x10,0x07,0x07,0x3a,0x00,0x80,0x00,0x00,0xff,0xff,
-0x00,0xba,0xfe,0x56,0x04,0x64,0x06,0x72,0x10,0x26,0x03,0x30,0x00,0x00,0x10,0x06,
-0x07,0x47,0x70,0x00,0xff,0xff,0x00,0xba,0xfe,0x56,0x04,0x64,0x06,0x72,0x10,0x26,
-0x03,0x30,0x00,0x00,0x10,0x07,0x07,0x3b,0x00,0x84,0x00,0x00,0xff,0xff,0x00,0xba,
-0xfe,0x56,0x04,0x64,0x06,0x72,0x10,0x26,0x03,0x30,0x00,0x00,0x10,0x07,0x07,0x48,
-0x00,0xae,0x00,0x00,0xff,0xff,0x00,0xba,0xfe,0x56,0x04,0x64,0x07,0xd0,0x10,0x26,
-0x03,0x30,0x00,0x00,0x10,0x07,0x07,0x3c,0x00,0x9c,0x00,0x00,0xff,0xff,0x00,0xba,
-0xfe,0x56,0x04,0x64,0x07,0xd0,0x10,0x26,0x03,0x30,0x00,0x00,0x10,0x07,0x07,0x49,
-0x00,0x87,0x00,0x00,0xff,0xff,0x00,0x07,0x00,0x00,0x05,0xe9,0x06,0x72,0x10,0x27,
-0x03,0x11,0x00,0xae,0x00,0x00,0x10,0x07,0x07,0x2d,0xfe,0x81,0x00,0x00,0xff,0xff,
-0x00,0x07,0x00,0x00,0x05,0xe6,0x06,0x72,0x10,0x27,0x03,0x11,0x00,0xab,0x00,0x00,
-0x10,0x07,0x07,0x65,0xfe,0x81,0x00,0x00,0xff,0xff,0x00,0x05,0x00,0x00,0x07,0xe7,
-0x06,0x72,0x10,0x27,0x03,0x11,0x02,0xac,0x00,0x00,0x10,0x07,0x07,0x3a,0xff,0x7c,
-0x00,0x00,0xff,0xff,0x00,0x06,0x00,0x00,0x07,0xed,0x06,0x72,0x10,0x27,0x03,0x11,
-0x02,0xb2,0x00,0x00,0x10,0x06,0x07,0x47,0x88,0x00,0xff,0xff,0x00,0x07,0x00,0x00,
-0x07,0x6e,0x06,0x72,0x10,0x27,0x03,0x11,0x02,0x33,0x00,0x00,0x10,0x07,0x07,0x3b,
-0xff,0x53,0x00,0x00,0xff,0xff,0x00,0x04,0x00,0x00,0x07,0x9f,0x06,0x72,0x10,0x27,
-0x03,0x11,0x02,0x64,0x00,0x00,0x10,0x07,0x07,0x48,0xff,0x6f,0x00,0x00,0xff,0xff,
-0x00,0x07,0x00,0x00,0x06,0xaf,0x07,0xd0,0x10,0x27,0x03,0x11,0x01,0x74,0x00,0x00,
-0x10,0x07,0x07,0x3c,0xff,0x51,0x00,0x00,0xff,0xff,0x00,0x04,0x00,0x00,0x06,0xca,
-0x07,0xd0,0x10,0x27,0x03,0x11,0x01,0x8f,0x00,0x00,0x10,0x07,0x07,0x49,0xff,0x4e,
-0x00,0x00,0xff,0xff,0x00,0x9b,0x00,0x00,0x02,0x6e,0x06,0x72,0x10,0x26,0x03,0x32,
-0x00,0x00,0x10,0x07,0x07,0x2d,0xff,0x15,0x00,0x00,0xff,0xff,0x00,0x91,0x00,0x00,
-0x02,0x6e,0x06,0x72,0x10,0x26,0x03,0x32,0x00,0x00,0x10,0x07,0x07,0x65,0xff,0x0b,
-0x00,0x00,0xff,0xff,0xff,0xb0,0x00,0x00,0x02,0xb9,0x06,0x72,0x10,0x26,0x03,0x32,
-0x00,0x00,0x10,0x07,0x07,0x3a,0xff,0x27,0x00,0x00,0xff,0xff,0xff,0xba,0x00,0x00,
-0x02,0xc7,0x06,0x72,0x10,0x26,0x03,0x32,0x00,0x00,0x10,0x07,0x07,0x47,0xff,0x3c,
-0x00,0x00,0xff,0xff,0x00,0x05,0x00,0x00,0x02,0xe5,0x06,0x72,0x10,0x26,0x03,0x32,
-0x00,0x00,0x10,0x07,0x07,0x3b,0xff,0x51,0x00,0x00,0xff,0xff,0xff,0xd2,0x00,0x00,
-0x02,0xee,0x06,0x72,0x10,0x26,0x03,0x32,0x00,0x00,0x10,0x07,0x07,0x48,0xff,0x3d,
-0x00,0x00,0xff,0xff,0xff,0xcb,0x00,0x00,0x02,0x6e,0x07,0xd0,0x10,0x26,0x03,0x32,
-0x00,0x00,0x10,0x07,0x07,0x3c,0xff,0x15,0x00,0x00,0xff,0xff,0xff,0xc6,0x00,0x00,
-0x02,0x6e,0x07,0xd0,0x10,0x26,0x03,0x32,0x00,0x00,0x10,0x07,0x07,0x49,0xff,0x10,
-0x00,0x00,0xff,0xff,0x00,0x07,0x00,0x00,0x02,0x41,0x06,0x72,0x10,0x27,0x03,0x13,
-0x00,0xae,0x00,0x00,0x10,0x07,0x07,0x2d,0xfe,0x81,0x00,0x00,0xff,0xff,0x00,0x07,
-0x00,0x00,0x02,0x35,0x06,0x72,0x10,0x27,0x03,0x13,0x00,0xa2,0x00,0x00,0x10,0x07,
-0x07,0x65,0xfe,0x81,0x00,0x00,0xff,0xff,0x00,0x05,0x00,0x00,0x04,0x4b,0x06,0x72,
-0x10,0x27,0x03,0x13,0x02,0xb8,0x00,0x00,0x10,0x07,0x07,0x3a,0xff,0x7c,0x00,0x00,
-0xff,0xff,0x00,0x06,0x00,0x00,0x04,0x4b,0x06,0x72,0x10,0x27,0x03,0x13,0x02,0xb8,
-0x00,0x00,0x10,0x06,0x07,0x47,0x88,0x00,0xff,0xff,0x00,0x07,0x00,0x00,0x03,0xc7,
-0x06,0x72,0x10,0x27,0x03,0x13,0x02,0x34,0x00,0x00,0x10,0x07,0x07,0x3b,0xff,0x53,
-0x00,0x00,0xff,0xff,0x00,0x04,0x00,0x00,0x04,0x03,0x06,0x72,0x10,0x27,0x03,0x13,
-0x02,0x70,0x00,0x00,0x10,0x07,0x07,0x48,0xff,0x6f,0x00,0x00,0xff,0xff,0x00,0x07,
-0x00,0x00,0x03,0x22,0x07,0xd0,0x10,0x27,0x03,0x13,0x01,0x8f,0x00,0x00,0x10,0x07,
-0x07,0x3c,0xff,0x51,0x00,0x00,0xff,0xff,0x00,0x04,0x00,0x00,0x03,0x29,0x07,0xd0,
-0x10,0x27,0x03,0x13,0x01,0x96,0x00,0x00,0x10,0x07,0x07,0x49,0xff,0x4e,0x00,0x00,
-0xff,0xff,0x00,0x71,0xff,0xe3,0x04,0x75,0x06,0x72,0x10,0x26,0x03,0x38,0x00,0x00,
-0x10,0x06,0x07,0x2d,0x78,0x00,0xff,0xff,0x00,0x71,0xff,0xe3,0x04,0x75,0x06,0x72,
-0x10,0x26,0x03,0x38,0x00,0x00,0x10,0x06,0x07,0x65,0x6e,0x00,0xff,0xff,0x00,0x71,
-0xff,0xe3,0x04,0x75,0x06,0x72,0x10,0x26,0x03,0x38,0x00,0x00,0x10,0x06,0x07,0x3a,
-0x65,0x00,0xff,0xff,0x00,0x71,0xff,0xe3,0x04,0x75,0x06,0x72,0x10,0x26,0x03,0x38,
-0x00,0x00,0x10,0x06,0x07,0x47,0x54,0x00,0xff,0xff,0x00,0x71,0xff,0xe3,0x04,0x75,
-0x06,0x72,0x10,0x26,0x03,0x38,0x00,0x00,0x10,0x07,0x07,0x3b,0x00,0x88,0x00,0x00,
-0xff,0xff,0x00,0x71,0xff,0xe3,0x04,0x75,0x06,0x72,0x10,0x26,0x03,0x38,0x00,0x00,
-0x10,0x07,0x07,0x48,0x00,0x91,0x00,0x00,0xff,0xff,0x00,0x07,0xff,0xe3,0x05,0xfc,
-0x06,0x72,0x10,0x26,0x03,0x19,0x23,0x00,0x10,0x07,0x07,0x2d,0xfe,0x81,0x00,0x00,
-0xff,0xff,0x00,0x07,0xff,0xe3,0x06,0x56,0x06,0x72,0x10,0x26,0x03,0x19,0x7d,0x00,
-0x10,0x07,0x07,0x65,0xfe,0x81,0x00,0x00,0xff,0xff,0x00,0x05,0xff,0xe3,0x08,0x4f,
-0x06,0x72,0x10,0x27,0x03,0x19,0x02,0x76,0x00,0x00,0x10,0x07,0x07,0x3a,0xff,0x7c,
-0x00,0x00,0xff,0xff,0x00,0x06,0xff,0xe3,0x08,0x59,0x06,0x72,0x10,0x27,0x03,0x19,
-0x02,0x80,0x00,0x00,0x10,0x06,0x07,0x47,0x88,0x00,0xff,0xff,0x00,0x07,0xff,0xe3,
-0x07,0x0f,0x06,0x72,0x10,0x27,0x03,0x19,0x01,0x36,0x00,0x00,0x10,0x07,0x07,0x3b,
-0xff,0x53,0x00,0x00,0xff,0xff,0x00,0x04,0xff,0xe3,0x07,0x50,0x06,0x72,0x10,0x27,
-0x03,0x19,0x01,0x77,0x00,0x00,0x10,0x07,0x07,0x48,0xff,0x6f,0x00,0x00,0xff,0xff,
-0x00,0x95,0xff,0xff,0x04,0x2a,0x06,0x72,0x10,0x26,0x03,0x3e,0x00,0x00,0x10,0x06,
-0x07,0x2d,0x3d,0x00,0xff,0xff,0x00,0x95,0xff,0xff,0x04,0x2a,0x06,0x72,0x10,0x26,
-0x03,0x3e,0x00,0x00,0x10,0x06,0x07,0x65,0x1b,0x00,0xff,0xff,0x00,0x95,0xff,0xff,
-0x04,0x2a,0x06,0x72,0x10,0x26,0x03,0x3e,0x00,0x00,0x10,0x06,0x07,0x3a,0x27,0x00,
-0xff,0xff,0x00,0x95,0xff,0xff,0x04,0x2a,0x06,0x72,0x10,0x26,0x03,0x3e,0x00,0x00,
-0x10,0x06,0x07,0x47,0x21,0x00,0xff,0xff,0x00,0x95,0xff,0xff,0x04,0x2a,0x06,0x72,
-0x10,0x26,0x03,0x3e,0x00,0x00,0x10,0x06,0x07,0x3b,0x60,0x00,0xff,0xff,0x00,0x95,
-0xff,0xff,0x04,0x2a,0x06,0x72,0x10,0x26,0x03,0x3e,0x00,0x00,0x10,0x06,0x07,0x48,
-0x57,0x00,0xff,0xff,0x00,0x95,0xff,0xff,0x04,0x2a,0x07,0xd0,0x10,0x26,0x03,0x3e,
-0x00,0x00,0x10,0x06,0x07,0x3c,0x38,0x00,0xff,0xff,0x00,0x95,0xff,0xff,0x04,0x2a,
-0x07,0xd0,0x10,0x26,0x03,0x3e,0x00,0x00,0x10,0x06,0x07,0x49,0x18,0x00,0xff,0xff,
-0x00,0x07,0x00,0x00,0x06,0x49,0x06,0x72,0x10,0x27,0x03,0x1e,0x01,0x62,0x00,0x00,
-0x10,0x07,0x07,0x65,0xfe,0x81,0x00,0x00,0xff,0xff,0x00,0x06,0x00,0x00,0x07,0xff,
-0x06,0x72,0x10,0x27,0x03,0x1e,0x03,0x18,0x00,0x00,0x10,0x06,0x07,0x47,0x88,0x00,
-0xff,0xff,0x00,0x04,0x00,0x00,0x08,0x1d,0x06,0x72,0x10,0x27,0x03,0x1e,0x03,0x36,
-0x00,0x00,0x10,0x07,0x07,0x48,0xff,0x6f,0x00,0x00,0xff,0xff,0x00,0x04,0x00,0x00,
-0x07,0x33,0x07,0xd0,0x10,0x27,0x03,0x1e,0x02,0x4c,0x00,0x00,0x10,0x07,0x07,0x49,
-0xff,0x4e,0x00,0x00,0xff,0xff,0x00,0x87,0xff,0xff,0x06,0x28,0x06,0x72,0x10,0x26,
-0x03,0x42,0x00,0x00,0x10,0x07,0x07,0x2d,0x01,0x5e,0x00,0x00,0xff,0xff,0x00,0x87,
-0xff,0xff,0x06,0x28,0x06,0x72,0x10,0x26,0x03,0x42,0x00,0x00,0x10,0x07,0x07,0x65,
-0x01,0x54,0x00,0x00,0xff,0xff,0x00,0x87,0xff,0xff,0x06,0x28,0x06,0x72,0x10,0x26,
-0x03,0x42,0x00,0x00,0x10,0x07,0x07,0x3a,0x01,0x59,0x00,0x00,0xff,0xff,0x00,0x87,
-0xff,0xff,0x06,0x28,0x06,0x72,0x10,0x26,0x03,0x42,0x00,0x00,0x10,0x07,0x07,0x47,
-0x01,0x5e,0x00,0x00,0xff,0xff,0x00,0x87,0xff,0xff,0x06,0x28,0x06,0x72,0x10,0x26,
-0x03,0x42,0x00,0x00,0x10,0x07,0x07,0x3b,0x01,0xa4,0x00,0x00,0xff,0xff,0x00,0x87,
-0xff,0xff,0x06,0x28,0x06,0x72,0x10,0x26,0x03,0x42,0x00,0x00,0x10,0x07,0x07,0x48,
-0x01,0x8b,0x00,0x00,0xff,0xff,0x00,0x87,0xff,0xff,0x06,0x28,0x07,0xd0,0x10,0x26,
-0x03,0x42,0x00,0x00,0x10,0x07,0x07,0x3c,0x01,0x63,0x00,0x00,0xff,0xff,0x00,0x87,
-0xff,0xff,0x06,0x28,0x07,0xd0,0x10,0x26,0x03,0x42,0x00,0x00,0x10,0x07,0x07,0x49,
-0x01,0x5e,0x00,0x00,0xff,0xff,0x00,0x07,0x00,0x00,0x06,0x1d,0x06,0x72,0x10,0x26,
-0x03,0x22,0x4e,0x00,0x10,0x07,0x07,0x2d,0xfe,0x81,0x00,0x00,0xff,0xff,0x00,0x07,
-0x00,0x00,0x06,0x71,0x06,0x72,0x10,0x27,0x03,0x22,0x00,0xa2,0x00,0x00,0x10,0x07,
-0x07,0x65,0xfe,0x81,0x00,0x00,0xff,0xff,0x00,0x05,0x00,0x00,0x08,0x69,0x06,0x72,
-0x10,0x27,0x03,0x22,0x02,0x9a,0x00,0x00,0x10,0x07,0x07,0x3a,0xff,0x7c,0x00,0x00,
-0xff,0xff,0x00,0x06,0x00,0x00,0x08,0x75,0x06,0x72,0x10,0x27,0x03,0x22,0x02,0xa6,
-0x00,0x00,0x10,0x06,0x07,0x47,0x88,0x00,0xff,0xff,0x00,0x07,0x00,0x00,0x07,0x43,
-0x06,0x72,0x10,0x27,0x03,0x22,0x01,0x74,0x00,0x00,0x10,0x07,0x07,0x3b,0xff,0x53,
-0x00,0x00,0xff,0xff,0x00,0x04,0x00,0x00,0x07,0x79,0x06,0x72,0x10,0x27,0x03,0x22,
-0x01,0xaa,0x00,0x00,0x10,0x07,0x07,0x48,0xff,0x6f,0x00,0x00,0xff,0xff,0x00,0x07,
-0x00,0x00,0x07,0x11,0x07,0xd0,0x10,0x27,0x03,0x22,0x01,0x42,0x00,0x00,0x10,0x07,
-0x07,0x3c,0xff,0x51,0x00,0x00,0xff,0xff,0x00,0x04,0x00,0x00,0x07,0x50,0x07,0xd0,
-0x10,0x27,0x03,0x22,0x01,0x81,0x00,0x00,0x10,0x07,0x07,0x49,0xff,0x4e,0x00,0x00,
-0xff,0xff,0x00,0x71,0xff,0xe6,0x04,0xe5,0x06,0x66,0x10,0x26,0x03,0x2a,0x00,0x00,
-0x10,0x06,0x07,0x59,0x74,0x00,0xff,0xff,0x00,0x71,0xff,0xe6,0x04,0xe5,0x06,0x66,
-0x10,0x06,0x03,0x25,0x00,0x00,0xff,0xff,0x00,0x85,0xff,0xe3,0x03,0xc8,0x06,0x66,
-0x10,0x26,0x03,0x2e,0x00,0x00,0x10,0x06,0x07,0x59,0x54,0x00,0xff,0xff,0x00,0x85,
-0xff,0xe3,0x03,0xc8,0x06,0x66,0x10,0x06,0x03,0x26,0x00,0x00,0xff,0xff,0x00,0xba,
-0xfe,0x56,0x04,0x64,0x06,0x66,0x10,0x26,0x03,0x30,0x00,0x00,0x10,0x07,0x07,0x59,
-0x00,0xc6,0x00,0x00,0xff,0xff,0x00,0xba,0xfe,0x56,0x04,0x64,0x06,0x66,0x10,0x06,
-0x03,0x27,0x00,0x00,0xff,0xff,0xff,0x8d,0x00,0x00,0x02,0x6e,0x06,0x66,0x10,0x26,
-0x03,0x32,0x00,0x00,0x10,0x07,0x07,0x59,0xfe,0xe3,0x00,0x00,0xff,0xff,0x00,0xa6,
-0x00,0x00,0x02,0x98,0x06,0x66,0x10,0x06,0x03,0x28,0x00,0x00,0xff,0xff,0x00,0x71,
-0xff,0xe3,0x04,0x75,0x06,0x66,0x10,0x26,0x03,0x38,0x00,0x00,0x10,0x06,0x07,0x59,
-0x7b,0x00,0xff,0xff,0x00,0x71,0xff,0xe3,0x04,0x75,0x06,0x66,0x10,0x06,0x03,0x45,
-0x00,0x00,0xff,0xff,0x00,0x95,0xff,0xff,0x04,0x2a,0x06,0x66,0x10,0x26,0x03,0x3e,
-0x00,0x00,0x10,0x06,0x07,0x59,0x30,0x00,0xff,0xff,0x00,0x95,0xff,0xff,0x04,0x2a,
-0x06,0x66,0x10,0x06,0x03,0x46,0x00,0x00,0xff,0xff,0x00,0x87,0xff,0xff,0x06,0x28,
-0x06,0x66,0x10,0x26,0x03,0x42,0x00,0x00,0x10,0x07,0x07,0x59,0x01,0x4d,0x00,0x00,
-0xff,0xff,0x00,0x87,0xff,0xff,0x06,0x28,0x06,0x66,0x10,0x06,0x03,0x47,0x00,0x00,
-0xff,0xff,0x00,0x71,0xfe,0x56,0x04,0xe5,0x06,0x72,0x10,0x26,0x06,0x7d,0x00,0x00,
-0x10,0x06,0x02,0xfe,0x48,0x00,0xff,0xff,0x00,0x71,0xfe,0x56,0x04,0xe5,0x06,0x72,
-0x10,0x26,0x06,0x7e,0x00,0x00,0x10,0x06,0x02,0xfe,0x48,0x00,0xff,0xff,0x00,0x71,
-0xfe,0x56,0x04,0xe5,0x06,0x72,0x10,0x26,0x06,0x7f,0x00,0x00,0x10,0x06,0x02,0xfe,
-0x48,0x00,0xff,0xff,0x00,0x71,0xfe,0x56,0x04,0xe5,0x06,0x72,0x10,0x26,0x06,0x80,
-0x00,0x00,0x10,0x06,0x02,0xfe,0x48,0x00,0xff,0xff,0x00,0x71,0xfe,0x56,0x04,0xe5,
-0x06,0x72,0x10,0x26,0x06,0x81,0x00,0x00,0x10,0x06,0x02,0xfe,0x48,0x00,0xff,0xff,
-0x00,0x71,0xfe,0x56,0x04,0xe5,0x06,0x72,0x10,0x26,0x06,0x82,0x00,0x00,0x10,0x06,
-0x02,0xfe,0x48,0x00,0xff,0xff,0x00,0x71,0xfe,0x56,0x04,0xe5,0x07,0xd0,0x10,0x26,
-0x06,0x83,0x00,0x00,0x10,0x06,0x02,0xfe,0x48,0x00,0xff,0xff,0x00,0x71,0xfe,0x56,
-0x04,0xe5,0x07,0xd0,0x10,0x26,0x06,0x84,0x00,0x00,0x10,0x06,0x02,0xfe,0x48,0x00,
-0xff,0xff,0x00,0x10,0xfe,0x56,0x05,0x68,0x06,0x72,0x10,0x26,0x06,0x85,0x00,0x00,
-0x10,0x07,0x07,0x2c,0x00,0xba,0x00,0x00,0xff,0xff,0x00,0x10,0xfe,0x56,0x05,0x68,
-0x06,0x72,0x10,0x26,0x06,0x86,0x00,0x00,0x10,0x07,0x07,0x2c,0x00,0xba,0x00,0x00,
-0xff,0xff,0x00,0x05,0xfe,0x56,0x06,0xf4,0x06,0x72,0x10,0x26,0x06,0x87,0x00,0x00,
-0x10,0x07,0x07,0x2c,0x02,0x46,0x00,0x00,0xff,0xff,0x00,0x06,0xfe,0x56,0x06,0xf4,
-0x06,0x72,0x10,0x26,0x06,0x88,0x00,0x00,0x10,0x07,0x07,0x2c,0x02,0x46,0x00,0x00,
-0xff,0xff,0x00,0x07,0xfe,0x56,0x06,0x16,0x06,0x72,0x10,0x26,0x06,0x89,0x00,0x00,
-0x10,0x07,0x07,0x2c,0x01,0x68,0x00,0x00,0xff,0xff,0x00,0x04,0xfe,0x56,0x06,0x58,
-0x06,0x72,0x10,0x26,0x06,0x8a,0x00,0x00,0x10,0x07,0x07,0x2c,0x01,0xaa,0x00,0x00,
-0xff,0xff,0x00,0x07,0xfe,0x56,0x05,0x99,0x07,0xd0,0x10,0x26,0x06,0x8b,0x00,0x00,
-0x10,0x07,0x07,0x2c,0x00,0xeb,0x00,0x00,0xff,0xff,0x00,0x04,0xfe,0x56,0x05,0xe0,
-0x07,0xd0,0x10,0x26,0x06,0x8c,0x00,0x00,0x10,0x07,0x07,0x2c,0x01,0x32,0x00,0x00,
-0xff,0xff,0x00,0xba,0xfe,0x56,0x04,0x64,0x06,0x72,0x10,0x26,0x06,0x99,0x00,0x00,
-0x10,0x07,0x02,0xfe,0xff,0x38,0x00,0x00,0xff,0xff,0x00,0xba,0xfe,0x56,0x04,0x64,
-0x06,0x72,0x10,0x26,0x06,0x9a,0x00,0x00,0x10,0x07,0x02,0xfe,0xff,0x38,0x00,0x00,
-0xff,0xff,0x00,0xba,0xfe,0x56,0x04,0x64,0x06,0x72,0x10,0x26,0x06,0x9b,0x00,0x00,
-0x10,0x07,0x02,0xfe,0xff,0x38,0x00,0x00,0xff,0xff,0x00,0xba,0xfe,0x56,0x04,0x64,
-0x06,0x72,0x10,0x26,0x06,0x9c,0x00,0x00,0x10,0x07,0x02,0xfe,0xff,0x38,0x00,0x00,
-0xff,0xff,0x00,0xba,0xfe,0x56,0x04,0x64,0x06,0x72,0x10,0x26,0x06,0x9d,0x00,0x00,
-0x10,0x07,0x02,0xfe,0xff,0x38,0x00,0x00,0xff,0xff,0x00,0xba,0xfe,0x56,0x04,0x64,
-0x06,0x72,0x10,0x26,0x06,0x9e,0x00,0x00,0x10,0x07,0x02,0xfe,0xff,0x38,0x00,0x00,
-0xff,0xff,0x00,0xba,0xfe,0x56,0x04,0x64,0x07,0xd0,0x10,0x26,0x06,0x9f,0x00,0x00,
-0x10,0x07,0x02,0xfe,0xff,0x38,0x00,0x00,0xff,0xff,0x00,0xba,0xfe,0x56,0x04,0x64,
-0x07,0xd0,0x10,0x26,0x06,0xa0,0x00,0x00,0x10,0x07,0x02,0xfe,0xff,0x38,0x00,0x00,
-0xff,0xff,0x00,0x07,0xfe,0x56,0x05,0xe9,0x06,0x72,0x10,0x26,0x06,0xa1,0x00,0x00,
-0x10,0x07,0x07,0x2c,0x01,0x9e,0x00,0x00,0xff,0xff,0x00,0x07,0xfe,0x56,0x05,0xe6,
-0x06,0x72,0x10,0x26,0x06,0xa2,0x00,0x00,0x10,0x07,0x07,0x2c,0x01,0x9b,0x00,0x00,
-0xff,0xff,0x00,0x05,0xfe,0x56,0x07,0xe7,0x06,0x72,0x10,0x26,0x06,0xa3,0x00,0x00,
-0x10,0x07,0x07,0x2c,0x03,0x9c,0x00,0x00,0xff,0xff,0x00,0x06,0xfe,0x56,0x07,0xed,
-0x06,0x72,0x10,0x26,0x06,0xa4,0x00,0x00,0x10,0x07,0x07,0x2c,0x03,0xa2,0x00,0x00,
-0xff,0xff,0x00,0x07,0xfe,0x56,0x07,0x6e,0x06,0x72,0x10,0x26,0x06,0xa5,0x00,0x00,
-0x10,0x07,0x07,0x2c,0x03,0x23,0x00,0x00,0xff,0xff,0x00,0x04,0xfe,0x56,0x07,0x9f,
-0x06,0x72,0x10,0x26,0x06,0xa6,0x00,0x00,0x10,0x07,0x07,0x2c,0x03,0x54,0x00,0x00,
-0xff,0xff,0x00,0x07,0xfe,0x56,0x06,0xaf,0x07,0xd0,0x10,0x26,0x06,0xa7,0x00,0x00,
-0x10,0x07,0x07,0x2c,0x02,0x64,0x00,0x00,0xff,0xff,0x00,0x04,0xfe,0x56,0x06,0xca,
-0x07,0xd0,0x10,0x26,0x06,0xa8,0x00,0x00,0x10,0x07,0x07,0x2c,0x02,0x7f,0x00,0x00,
-0xff,0xff,0x00,0x87,0xfe,0x56,0x06,0x28,0x06,0x72,0x10,0x26,0x06,0xd1,0x00,0x00,
-0x10,0x07,0x02,0xfe,0x01,0x59,0x00,0x00,0xff,0xff,0x00,0x87,0xfe,0x56,0x06,0x28,
-0x06,0x72,0x10,0x26,0x06,0xd2,0x00,0x00,0x10,0x07,0x02,0xfe,0x01,0x59,0x00,0x00,
-0xff,0xff,0x00,0x87,0xfe,0x56,0x06,0x28,0x06,0x72,0x10,0x26,0x06,0xd3,0x00,0x00,
-0x10,0x07,0x02,0xfe,0x01,0x59,0x00,0x00,0xff,0xff,0x00,0x87,0xfe,0x56,0x06,0x28,
-0x06,0x72,0x10,0x26,0x06,0xd4,0x00,0x00,0x10,0x07,0x02,0xfe,0x01,0x59,0x00,0x00,
-0xff,0xff,0x00,0x87,0xfe,0x56,0x06,0x28,0x06,0x72,0x10,0x26,0x06,0xd5,0x00,0x00,
-0x10,0x07,0x02,0xfe,0x01,0x59,0x00,0x00,0xff,0xff,0x00,0x87,0xfe,0x56,0x06,0x28,
-0x06,0x72,0x10,0x26,0x06,0xd6,0x00,0x00,0x10,0x07,0x02,0xfe,0x01,0x59,0x00,0x00,
-0xff,0xff,0x00,0x87,0xfe,0x56,0x06,0x28,0x07,0xd0,0x10,0x26,0x06,0xd7,0x00,0x00,
-0x10,0x07,0x02,0xfe,0x01,0x59,0x00,0x00,0xff,0xff,0x00,0x87,0xfe,0x56,0x06,0x28,
-0x07,0xd0,0x10,0x26,0x06,0xd8,0x00,0x00,0x10,0x07,0x02,0xfe,0x01,0x59,0x00,0x00,
-0xff,0xff,0x00,0x07,0xfe,0x56,0x06,0x1d,0x06,0x72,0x10,0x26,0x06,0xd9,0x00,0x00,
-0x10,0x07,0x07,0x2c,0x01,0x5c,0x00,0x00,0xff,0xff,0x00,0x07,0xfe,0x56,0x06,0x71,
-0x06,0x72,0x10,0x26,0x06,0xda,0x00,0x00,0x10,0x07,0x07,0x2c,0x01,0xb0,0x00,0x00,
-0xff,0xff,0x00,0x05,0xfe,0x56,0x08,0x69,0x06,0x72,0x10,0x26,0x06,0xdb,0x00,0x00,
-0x10,0x07,0x07,0x2c,0x03,0xa8,0x00,0x00,0xff,0xff,0x00,0x06,0xfe,0x56,0x08,0x75,
-0x06,0x72,0x10,0x26,0x06,0xdc,0x00,0x00,0x10,0x07,0x07,0x2c,0x03,0xb4,0x00,0x00,
-0xff,0xff,0x00,0x07,0xfe,0x56,0x07,0x43,0x06,0x72,0x10,0x26,0x06,0xdd,0x00,0x00,
-0x10,0x07,0x07,0x2c,0x02,0x82,0x00,0x00,0xff,0xff,0x00,0x04,0xfe,0x56,0x07,0x79,
-0x06,0x72,0x10,0x26,0x06,0xde,0x00,0x00,0x10,0x07,0x07,0x2c,0x02,0xb8,0x00,0x00,
-0xff,0xff,0x00,0x07,0xfe,0x56,0x07,0x11,0x07,0xd0,0x10,0x26,0x06,0xdf,0x00,0x00,
-0x10,0x07,0x07,0x2c,0x02,0x50,0x00,0x00,0xff,0xff,0x00,0x04,0xfe,0x56,0x07,0x50,
-0x07,0xd0,0x10,0x26,0x06,0xe0,0x00,0x00,0x10,0x07,0x07,0x2c,0x02,0x8f,0x00,0x00,
-0xff,0xff,0x00,0x71,0xff,0xe6,0x04,0xe5,0x06,0x48,0x10,0x26,0x03,0x2a,0x00,0x00,
-0x10,0x06,0x02,0x8c,0x7a,0x00,0xff,0xff,0x00,0x71,0xff,0xe6,0x04,0xe5,0x05,0xf6,
-0x10,0x26,0x03,0x2a,0x00,0x00,0x10,0x06,0x00,0x71,0x79,0x00,0xff,0xff,0x00,0x71,
-0xfe,0x56,0x04,0xe5,0x06,0x66,0x10,0x26,0x06,0xe1,0x00,0x00,0x10,0x06,0x02,0xfe,
-0x48,0x00,0xff,0xff,0x00,0x71,0xfe,0x56,0x04,0xe5,0x04,0x7a,0x10,0x26,0x03,0x2a,
-0x00,0x00,0x10,0x06,0x02,0xfe,0x48,0x00,0xff,0xff,0x00,0x71,0xfe,0x56,0x04,0xe5,
-0x06,0x66,0x10,0x26,0x03,0x25,0x00,0x00,0x10,0x06,0x02,0xfe,0x48,0x00,0xff,0xff,
-0x00,0x71,0xff,0xe6,0x04,0xe5,0x06,0x37,0x10,0x26,0x03,0x2a,0x00,0x00,0x10,0x06,
-0x07,0x2e,0x6e,0x00,0xff,0xff,0x00,0x71,0xfe,0x56,0x04,0xe5,0x06,0x37,0x10,0x26,
-0x07,0x24,0x00,0x00,0x10,0x06,0x02,0xfe,0x48,0x00,0xff,0xff,0x00,0x10,0x00,0x00,
-0x05,0x68,0x07,0x6d,0x10,0x26,0x03,0x0b,0x00,0x00,0x10,0x07,0x0b,0xf0,0x04,0xba,
-0x01,0x75,0xff,0xff,0x00,0x10,0x00,0x00,0x05,0x68,0x07,0x31,0x10,0x26,0x03,0x0b,
-0x00,0x00,0x10,0x07,0x00,0x71,0x00,0xbc,0x01,0x3b,0xff,0xff,0xff,0xfc,0x00,0x00,
-0x05,0xaa,0x06,0x66,0x10,0x26,0x03,0x0b,0x42,0x00,0x10,0x07,0x07,0x59,0xff,0x52,
-0x00,0x00,0xff,0xff,0x00,0x10,0x00,0x00,0x05,0x68,0x06,0x66,0x10,0x06,0x03,0x02,
-0x00,0x00,0xff,0xff,0x00,0x10,0xfe,0x56,0x05,0x68,0x05,0xd5,0x10,0x26,0x03,0x0b,
-0x00,0x00,0x10,0x07,0x07,0x2c,0x00,0xba,0x00,0x00,0xff,0xff,0x01,0x86,0x04,0xc2,
-0x02,0x78,0x06,0x72,0x10,0x06,0x07,0x2d,0x00,0x00,0xff,0xff,0x01,0xb6,0xfe,0x56,
-0x02,0x92,0xff,0xa4,0x10,0x06,0x02,0xfe,0x00,0x00,0x00,0x01,0x01,0x86,0x04,0xc2,
-0x02,0x78,0x06,0x72,0x00,0x08,0x00,0x00,0x01,0x10,0x23,0x35,0x16,0x35,0x23,0x35,
-0x33,0x02,0x78,0xf2,0x70,0x6f,0xf1,0x05,0xc3,0xfe,0xff,0x7b,0x03,0x89,0xaf,0x00,
-0xff,0xff,0x00,0xb6,0x05,0x1d,0x03,0x4a,0x06,0x37,0x10,0x06,0x02,0x90,0x00,0x00,
-0xff,0xff,0x00,0xb6,0x05,0x46,0x03,0x4a,0x07,0x95,0x12,0x26,0x00,0x6a,0x00,0x00,
-0x10,0x07,0x07,0x2e,0x00,0x00,0x01,0x5e,0xff,0xff,0x00,0xba,0xfe,0x56,0x04,0x64,
-0x06,0x66,0x10,0x26,0x06,0xe5,0x00,0x00,0x10,0x07,0x02,0xfe,0xff,0x38,0x00,0x00,
-0xff,0xff,0x00,0xba,0xfe,0x56,0x04,0x64,0x04,0x7b,0x10,0x26,0x03,0x30,0x00,0x00,
-0x10,0x07,0x02,0xfe,0xff,0x38,0x00,0x00,0xff,0xff,0x00,0xba,0xfe,0x56,0x04,0x64,
-0x06,0x66,0x10,0x26,0x03,0x27,0x00,0x00,0x10,0x07,0x02,0xfe,0xff,0x38,0x00,0x00,
-0xff,0xff,0x00,0xba,0xfe,0x56,0x04,0x64,0x06,0x37,0x10,0x26,0x03,0x30,0x00,0x00,
-0x10,0x07,0x07,0x2e,0x00,0x90,0x00,0x00,0xff,0xff,0x00,0xba,0xfe,0x56,0x04,0x64,
-0x06,0x37,0x10,0x26,0x07,0x33,0x00,0x00,0x10,0x07,0x02,0xfe,0xff,0x38,0x00,0x00,
-0xff,0xff,0xff,0xfc,0x00,0x00,0x05,0xed,0x06,0x66,0x10,0x27,0x03,0x0f,0x01,0x62,
-0x00,0x00,0x10,0x07,0x07,0x59,0xff,0x52,0x00,0x00,0xff,0xff,0xff,0xe7,0x00,0x00,
-0x05,0x75,0x06,0x66,0x10,0x06,0x03,0x04,0x00,0x00,0xff,0xff,0xff,0xfc,0x00,0x00,
-0x06,0xa9,0x06,0x66,0x10,0x27,0x03,0x11,0x01,0x6e,0x00,0x00,0x10,0x07,0x07,0x59,
-0xff,0x52,0x00,0x00,0xff,0xff,0xff,0xf3,0x00,0x00,0x06,0x1f,0x06,0x66,0x10,0x06,
-0x03,0x05,0x00,0x00,0xff,0xff,0x00,0xc9,0xfe,0x56,0x05,0x3b,0x05,0xd5,0x10,0x26,
-0x03,0x11,0x00,0x00,0x10,0x07,0x07,0x2c,0x00,0xff,0x00,0x00,0xff,0xff,0x00,0x89,
-0x04,0xc2,0x03,0x92,0x06,0x72,0x10,0x27,0x07,0x2d,0xff,0x03,0x00,0x00,0x10,0x07,
-0x07,0x59,0x01,0x09,0x00,0x00,0xff,0xff,0x00,0xb4,0x04,0xc2,0x03,0x94,0x06,0x72,
-0x10,0x27,0x07,0x2d,0xff,0x2e,0x00,0x00,0x10,0x06,0x07,0x64,0x42,0x00,0xff,0xff,
-0x00,0xb6,0x04,0xc2,0x03,0x4a,0x07,0xd0,0x10,0x26,0x07,0x2d,0x00,0x00,0x10,0x07,
-0x07,0x2e,0x00,0x00,0x01,0x99,0xff,0xff,0xff,0xeb,0x00,0x00,0x02,0x6e,0x06,0x48,
-0x10,0x26,0x03,0x32,0x00,0x00,0x10,0x07,0x02,0x8c,0xff,0x24,0x00,0x00,0xff,0xff,
-0xff,0xe3,0x00,0x00,0x02,0x6e,0x05,0xf6,0x10,0x26,0x03,0x32,0x00,0x00,0x10,0x07,
-0x00,0x71,0xff,0x0e,0x00,0x00,0xff,0xff,0xff,0xd8,0x00,0x00,0x02,0x6e,0x07,0xd2,
-0x10,0x26,0x03,0x32,0x00,0x00,0x10,0x07,0x07,0x57,0xff,0x2e,0x00,0x00,0xff,0xff,
-0x00,0x05,0x00,0x00,0x02,0x80,0x07,0xd2,0x10,0x06,0x03,0x0a,0x00,0x00,0xff,0xff,
-0xff,0xe4,0x00,0x00,0x02,0x78,0x06,0x37,0x10,0x26,0x03,0x32,0x00,0x00,0x10,0x07,
-0x07,0x2e,0xff,0x2e,0x00,0x00,0xff,0xff,0xff,0xe6,0x00,0x00,0x02,0x7a,0x07,0x95,
-0x10,0x26,0x03,0x32,0x00,0x00,0x10,0x07,0x07,0x2f,0xff,0x30,0x00,0x00,0xff,0xff,
-0xff,0xf5,0x00,0x00,0x02,0x67,0x07,0x6d,0x10,0x26,0x03,0x13,0x00,0x00,0x10,0x07,
-0x0b,0xf0,0x03,0x2e,0x01,0x75,0xff,0xff,0x00,0x04,0x00,0x00,0x02,0x5b,0x07,0x31,
-0x10,0x26,0x03,0x13,0x00,0x00,0x10,0x07,0x00,0x71,0xff,0x30,0x01,0x3b,0xff,0xff,
-0xff,0xfc,0x00,0x00,0x03,0x04,0x06,0x66,0x10,0x27,0x03,0x13,0x01,0x71,0x00,0x00,
-0x10,0x07,0x07,0x59,0xff,0x52,0x00,0x00,0xff,0xff,0xff,0xed,0x00,0x00,0x02,0x7d,
-0x06,0x66,0x10,0x06,0x03,0x06,0x00,0x00,0xff,0xff,0x00,0x7e,0x04,0xc2,0x03,0x8b,
-0x06,0x72,0x10,0x27,0x07,0x65,0xfe,0xf8,0x00,0x00,0x10,0x07,0x07,0x59,0x01,0x02,
-0x00,0x00,0xff,0xff,0x00,0x95,0x04,0xc2,0x03,0xb1,0x06,0x72,0x10,0x27,0x07,0x65,
-0xff,0x0f,0x00,0x00,0x10,0x06,0x07,0x64,0x5f,0x00,0xff,0xff,0x00,0xb6,0x04,0xc2,
-0x03,0x4a,0x07,0xd0,0x10,0x26,0x07,0x65,0x00,0x00,0x10,0x07,0x07,0x2e,0x00,0x00,
-0x01,0x99,0xff,0xff,0x00,0x95,0xff,0xff,0x04,0x2a,0x06,0x48,0x10,0x26,0x03,0x3e,
-0x00,0x00,0x10,0x06,0x02,0x8c,0x27,0x00,0xff,0xff,0x00,0x95,0xff,0xff,0x04,0x2a,
-0x05,0xf6,0x10,0x26,0x03,0x3e,0x00,0x00,0x10,0x06,0x00,0x71,0x24,0x00,0xff,0xff,
-0x00,0x95,0xff,0xff,0x04,0x2a,0x07,0xd2,0x10,0x26,0x03,0x3e,0x00,0x00,0x10,0x06,
-0x07,0x57,0x1b,0x00,0xff,0xff,0x00,0x95,0xff,0xff,0x04,0x2a,0x07,0xd2,0x10,0x06,
-0x03,0x29,0x00,0x00,0xff,0xff,0x00,0xba,0xfe,0x56,0x04,0xa4,0x06,0x72,0x10,0x26,
-0x03,0x3a,0x00,0x00,0x10,0x07,0x07,0x2d,0x00,0xbb,0x00,0x00,0xff,0xff,0x00,0xba,
-0xfe,0x56,0x04,0xa4,0x06,0x72,0x10,0x26,0x03,0x3a,0x00,0x00,0x10,0x07,0x07,0x65,
-0x00,0xb1,0x00,0x00,0xff,0xff,0x00,0x95,0xff,0xff,0x04,0x2a,0x06,0x37,0x10,0x26,
-0x03,0x3e,0x00,0x00,0x10,0x06,0x07,0x2e,0x27,0x00,0xff,0xff,0x00,0x95,0xff,0xff,
-0x04,0x2a,0x07,0x95,0x10,0x26,0x03,0x3e,0x00,0x00,0x10,0x06,0x07,0x2f,0x1a,0x00,
-0xff,0xff,0xff,0xfc,0x00,0x00,0x04,0xe7,0x07,0x6d,0x10,0x26,0x03,0x1e,0x00,0x00,
-0x10,0x07,0x0b,0xf0,0x04,0x76,0x01,0x75,0xff,0xff,0xff,0xfc,0x00,0x00,0x04,0xe7,
-0x07,0x31,0x10,0x26,0x03,0x1e,0x00,0x00,0x10,0x07,0x00,0x71,0x00,0x80,0x01,0x3b,
-0xff,0xff,0xff,0xfc,0x00,0x00,0x06,0xc7,0x06,0x66,0x10,0x27,0x03,0x1e,0x01,0xe0,
-0x00,0x00,0x10,0x07,0x07,0x59,0xff,0x52,0x00,0x00,0xff,0xff,0xff,0xe1,0x00,0x00,
-0x06,0x91,0x06,0x66,0x10,0x06,0x03,0x08,0x00,0x00,0xff,0xff,0x00,0x07,0x00,0x00,
-0x05,0x35,0x06,0x72,0x10,0x27,0x03,0x1b,0x00,0xa8,0x00,0x00,0x10,0x07,0x07,0x65,
-0xfe,0x81,0x00,0x00,0xff,0xff,0x00,0xaa,0x05,0x46,0x03,0x29,0x07,0xd2,0x12,0x26,
-0x00,0x6a,0x00,0x00,0x10,0x07,0x07,0x59,0x00,0x00,0x01,0x6c,0xff,0xff,0x00,0xd7,
-0x05,0x46,0x03,0x52,0x07,0xd2,0x10,0x06,0x03,0x01,0x00,0x00,0xff,0xff,0x00,0xaa,
-0x04,0xf0,0x02,0x89,0x06,0x66,0x10,0x06,0x00,0x43,0x00,0x00,0xff,0xff,0x00,0x87,
-0xfe,0x56,0x06,0x28,0x06,0x66,0x10,0x26,0x06,0xed,0x00,0x00,0x10,0x07,0x02,0xfe,
-0x01,0x59,0x00,0x00,0xff,0xff,0x00,0x87,0xfe,0x56,0x06,0x28,0x04,0x60,0x10,0x26,
-0x03,0x42,0x00,0x00,0x10,0x07,0x02,0xfe,0x01,0x59,0x00,0x00,0xff,0xff,0x00,0x87,
-0xfe,0x56,0x06,0x28,0x06,0x66,0x10,0x26,0x03,0x47,0x00,0x00,0x10,0x07,0x02,0xfe,
-0x01,0x59,0x00,0x00,0xff,0xff,0x00,0x87,0xff,0xff,0x06,0x28,0x06,0x37,0x10,0x26,
-0x03,0x42,0x00,0x00,0x10,0x07,0x07,0x2e,0x01,0x4f,0x00,0x00,0xff,0xff,0x00,0x87,
-0xfe,0x56,0x06,0x28,0x06,0x37,0x10,0x26,0x07,0x5d,0x00,0x00,0x10,0x07,0x02,0xfe,
-0x01,0x59,0x00,0x00,0xff,0xff,0xff,0xfc,0xff,0xe3,0x07,0x14,0x06,0x66,0x10,0x27,
-0x03,0x19,0x01,0x3b,0x00,0x00,0x10,0x07,0x07,0x59,0xff,0x52,0x00,0x00,0xff,0xff,
-0xff,0xf2,0xff,0xe3,0x06,0x01,0x06,0x66,0x10,0x06,0x03,0x07,0x00,0x00,0xff,0xff,
-0xff,0xfc,0x00,0x00,0x07,0x13,0x06,0x66,0x10,0x27,0x03,0x22,0x01,0x44,0x00,0x00,
-0x10,0x07,0x07,0x59,0xff,0x52,0x00,0x00,0xff,0xff,0xff,0xdb,0x00,0x00,0x06,0x05,
-0x06,0x66,0x10,0x06,0x03,0x09,0x00,0x00,0xff,0xff,0x00,0x4e,0xfe,0x56,0x05,0xcf,
-0x05,0xe7,0x10,0x26,0x03,0x22,0x00,0x00,0x10,0x07,0x07,0x2c,0x01,0x0e,0x00,0x00,
-0xff,0xff,0x01,0x73,0x04,0xee,0x03,0x52,0x06,0x66,0x10,0x06,0x00,0x76,0x00,0x00,
-0x00,0x01,0x01,0x86,0x04,0xc2,0x02,0x78,0x06,0x72,0x00,0x08,0x00,0x00,0x01,0x35,
-0x33,0x15,0x23,0x14,0x37,0x15,0x22,0x01,0x86,0xf2,0x70,0x70,0xf2,0x05,0xc3,0xaf,
-0xaf,0x89,0x03,0x7b,0x00,0x01,0x00,0x64,0x01,0xdf,0x02,0x7f,0x02,0x83,0x00,0x03,
-0x00,0x11,0xb6,0x00,0x9c,0x02,0x04,0x01,0x00,0x04,0x10,0xdc,0xcc,0x31,0x00,0x10,
-0xd4,0xec,0x30,0x13,0x21,0x15,0x21,0x64,0x02,0x1b,0xfd,0xe5,0x02,0x83,0xa4,0x00,
-0xff,0xff,0x00,0x64,0x01,0xdf,0x02,0x7f,0x02,0x83,0x12,0x06,0x07,0x71,0x00,0x00,
-0x00,0x01,0x00,0x00,0x01,0xe9,0x04,0x00,0x02,0x79,0x00,0x03,0x00,0x10,0xb6,0x02,
-0xa9,0x00,0xe9,0x04,0x01,0x00,0x2f,0xc6,0x31,0x00,0x10,0xfc,0xec,0x30,0x11,0x21,
-0x15,0x21,0x04,0x00,0xfc,0x00,0x02,0x79,0x90,0x00,0x00,0x01,0x00,0x00,0x01,0xe9,
-0x04,0x00,0x02,0x79,0x00,0x03,0x00,0x10,0xb6,0x02,0xa9,0x00,0xe9,0x04,0x01,0x00,
-0x2f,0xc6,0x31,0x00,0x10,0xfc,0xec,0x30,0x11,0x21,0x15,0x21,0x04,0x00,0xfc,0x00,
-0x02,0x79,0x90,0x00,0x00,0x01,0x00,0x00,0x01,0xe9,0x08,0x00,0x02,0x79,0x00,0x03,
-0x00,0x0f,0xb5,0x02,0xa9,0x00,0x04,0x01,0x00,0x2f,0xcc,0x31,0x00,0x10,0xd4,0xec,
-0x30,0x11,0x21,0x15,0x21,0x08,0x00,0xf8,0x00,0x02,0x79,0x90,0x00,0x01,0x00,0x00,
-0x01,0xe9,0x08,0x00,0x02,0x79,0x00,0x03,0x00,0x0f,0xb5,0x02,0xa9,0x00,0x04,0x01,
-0x00,0x2f,0xcc,0x31,0x00,0x10,0xd4,0xec,0x30,0x11,0x21,0x15,0x21,0x08,0x00,0xf8,
-0x00,0x02,0x79,0x90,0xff,0xff,0x01,0x04,0xfe,0x1d,0x02,0xf8,0x06,0x1d,0x10,0x22,
-0x00,0x5f,0x00,0x00,0x10,0x03,0x00,0x5f,0x01,0x4a,0x00,0x00,0xff,0xff,0xff,0xec,
-0xfe,0x1d,0x04,0x14,0xff,0xee,0x10,0x26,0x00,0x42,0x00,0x00,0x10,0x07,0x00,0x42,
-0x00,0x00,0x01,0x42,0x00,0x01,0x00,0xae,0x03,0xe9,0x01,0xd3,0x05,0xd5,0x00,0x05,
-0x00,0x18,0x40,0x0b,0x00,0x9e,0x03,0x81,0x06,0x03,0x04,0x00,0x19,0x01,0x06,0x10,
-0xdc,0xfc,0xd4,0xcc,0x31,0x00,0x10,0xf4,0xec,0x30,0x01,0x23,0x35,0x13,0x33,0x03,
-0x01,0x81,0xd3,0xa4,0x81,0x52,0x03,0xe9,0xad,0x01,0x3f,0xfe,0xc1,0x00,0x00,0x01,
-0x00,0xb2,0x03,0xfe,0x01,0xd7,0x05,0xd5,0x00,0x05,0x00,0x18,0x40,0x0b,0x03,0x9e,
-0x00,0x81,0x06,0x03,0x04,0x01,0x19,0x00,0x06,0x10,0xdc,0xec,0xd4,0xcc,0x31,0x00,
-0x10,0xf4,0xec,0x30,0x01,0x33,0x15,0x03,0x23,0x13,0x01,0x04,0xd3,0xa4,0x81,0x52,
-0x05,0xd5,0x98,0xfe,0xc1,0x01,0x3f,0x00,0x00,0x01,0x00,0xae,0xff,0x12,0x01,0xd3,
-0x00,0xfe,0x00,0x05,0x00,0x18,0x40,0x0b,0x03,0x9e,0x00,0x83,0x06,0x03,0x04,0x01,
-0x19,0x00,0x06,0x10,0xd4,0xec,0xd4,0xcc,0x31,0x00,0x10,0xfc,0xec,0x30,0x25,0x33,
-0x15,0x03,0x23,0x13,0x01,0x00,0xd3,0xa4,0x81,0x52,0xfe,0xac,0xfe,0xc0,0x01,0x40,
-0x00,0x01,0x00,0xb2,0x03,0xfe,0x01,0xd7,0x05,0xd5,0x00,0x05,0x00,0x00,0x01,0x15,
-0x13,0x23,0x03,0x35,0x01,0x85,0x52,0x81,0xa4,0x05,0xd5,0x98,0xfe,0xc1,0x01,0x3f,
-0x98,0x00,0x00,0x02,0x00,0xae,0x03,0xe9,0x03,0x6d,0x05,0xd5,0x00,0x05,0x00,0x0b,
-0x00,0x27,0x40,0x13,0x06,0x00,0x9e,0x09,0x03,0x81,0x0c,0x09,0x0a,0x06,0x19,0x07,
-0x03,0x04,0x07,0x00,0x19,0x01,0x0c,0x10,0xdc,0xfc,0xcc,0xd4,0xcc,0x10,0xfe,0xd4,
-0xce,0x31,0x00,0x10,0xf4,0x3c,0xec,0x32,0x30,0x01,0x23,0x35,0x13,0x33,0x03,0x05,
-0x23,0x35,0x13,0x33,0x03,0x01,0x81,0xd3,0xa4,0x81,0x52,0x01,0x9a,0xd3,0xa4,0x81,
-0x52,0x03,0xe9,0xad,0x01,0x3f,0xfe,0xc1,0xad,0xad,0x01,0x3f,0xfe,0xc1,0x00,0x02,
-0x00,0xae,0x03,0xe9,0x03,0x6d,0x05,0xd5,0x00,0x05,0x00,0x0b,0x00,0x27,0x40,0x13,
-0x09,0x03,0x9e,0x06,0x00,0x81,0x0c,0x09,0x0a,0x07,0x19,0x06,0x01,0x03,0x04,0x01,
-0x19,0x00,0x0c,0x10,0xdc,0xec,0xd4,0xcc,0x10,0xdc,0xee,0xd4,0xce,0x31,0x00,0x10,
-0xf4,0x3c,0xec,0x32,0x30,0x01,0x33,0x15,0x03,0x23,0x13,0x25,0x33,0x15,0x03,0x23,
-0x13,0x01,0x00,0xd3,0xa4,0x81,0x52,0x01,0x9a,0xd3,0xa4,0x81,0x52,0x05,0xd5,0xac,
-0xfe,0xc0,0x01,0x40,0xac,0xac,0xfe,0xc0,0x01,0x40,0x00,0x02,0x00,0xae,0xff,0x12,
-0x03,0x6d,0x00,0xfe,0x00,0x05,0x00,0x0b,0x00,0x27,0x40,0x13,0x09,0x03,0x9e,0x06,
-0x00,0x83,0x0c,0x03,0x04,0x01,0x19,0x00,0x07,0x09,0x0a,0x07,0x19,0x06,0x0c,0x10,
-0xdc,0xec,0xd4,0xcc,0x10,0xdc,0xee,0xd4,0xce,0x31,0x00,0x10,0xfc,0x3c,0xec,0x32,
-0x30,0x25,0x33,0x15,0x03,0x23,0x13,0x25,0x33,0x15,0x03,0x23,0x13,0x02,0x9a,0xd3,
-0xa4,0x81,0x52,0xfe,0x66,0xd3,0xa4,0x81,0x52,0xfe,0xac,0xfe,0xc0,0x01,0x40,0xac,
-0xac,0xfe,0xc0,0x01,0x40,0x00,0x00,0x02,0x00,0xae,0x03,0xe9,0x03,0x6d,0x05,0xd5,
-0x00,0x05,0x00,0x0b,0x00,0x00,0x01,0x15,0x13,0x23,0x03,0x35,0x21,0x15,0x13,0x23,
-0x03,0x35,0x01,0x81,0x52,0x81,0xa4,0x02,0x6d,0x52,0x81,0xa4,0x05,0xd5,0xad,0xfe,
-0xc1,0x01,0x3f,0xad,0xad,0xfe,0xc1,0x01,0x3f,0xad,0x00,0x01,0x00,0x39,0xff,0x3b,
-0x03,0xc7,0x05,0xd5,0x00,0x0b,0x00,0x27,0x40,0x14,0x08,0x04,0xb9,0x0a,0x02,0x00,
-0x81,0x06,0xc2,0x0c,0x03,0x59,0x05,0x01,0x57,0x09,0x59,0x07,0x00,0x0c,0x10,0xd4,
-0x3c,0xec,0xfc,0x3c,0xec,0x31,0x00,0x10,0xe4,0xf4,0xd4,0x3c,0xec,0x32,0x30,0x01,
-0x33,0x11,0x21,0x15,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x01,0xa8,0xb0,0x01,0x6f,
-0xfe,0x91,0xb0,0xfe,0x91,0x01,0x6f,0x05,0xd5,0xfe,0x5c,0x99,0xfb,0xa3,0x04,0x5d,
-0x99,0x00,0x00,0x01,0x00,0x39,0xff,0x3b,0x03,0xc7,0x05,0xd5,0x00,0x13,0x00,0x3e,
-0x40,0x20,0x12,0x06,0xb9,0x00,0x10,0x08,0xb9,0x0a,0x04,0x00,0x02,0x0e,0x0a,0x0c,
-0x81,0x02,0xc2,0x14,0x0f,0x00,0x59,0x11,0x0d,0x01,0x57,0x09,0x05,0x59,0x0b,0x07,
-0x03,0x14,0x10,0xd4,0x3c,0x3c,0xec,0x32,0xfc,0x3c,0x3c,0xec,0x32,0x31,0x00,0x10,
-0xe4,0xf4,0xc4,0x32,0x10,0xc4,0x32,0x10,0xee,0x32,0x10,0xee,0x32,0x30,0x25,0x21,
-0x11,0x23,0x11,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0x21,
-0x11,0x21,0x03,0xc7,0xfe,0x91,0xb0,0xfe,0x91,0x01,0x6f,0xfe,0x91,0x01,0x6f,0xb0,
-0x01,0x6f,0xfe,0x91,0x01,0x6f,0xdf,0xfe,0x5c,0x01,0xa4,0x9a,0x02,0x1f,0x99,0x01,
-0xa4,0xfe,0x5c,0x99,0xfd,0xe1,0x00,0x01,0x01,0x33,0x01,0xd1,0x03,0x85,0x04,0x21,
-0x00,0x0b,0x00,0x12,0xb7,0x09,0xc7,0x03,0x0c,0x06,0x5c,0x00,0x0c,0x10,0xd4,0xec,
-0x31,0x00,0x10,0xd4,0xec,0x30,0x01,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,
-0x22,0x26,0x01,0x33,0xad,0x7e,0x7c,0xab,0xac,0x7d,0x7d,0xac,0x02,0xfa,0x7c,0xab,
-0xab,0x7c,0x7d,0xac,0xac,0x00,0x00,0x01,0x01,0x33,0x01,0x81,0x03,0xd5,0x04,0x71,
-0x00,0x02,0x00,0x00,0x01,0x11,0x01,0x01,0x33,0x02,0xa2,0x01,0x81,0x02,0xf0,0xfe,
-0x88,0x00,0x00,0x01,0x00,0xec,0x00,0x00,0x01,0xc1,0x00,0xfe,0x00,0x03,0x00,0x00,
-0x37,0x33,0x15,0x23,0xec,0xd5,0xd5,0xfe,0xfe,0x00,0x00,0x02,0x00,0xec,0x00,0x00,
-0x04,0x6b,0x00,0xfe,0x00,0x03,0x00,0x07,0x00,0x00,0x25,0x33,0x15,0x23,0x25,0x33,
-0x15,0x23,0x03,0x96,0xd5,0xd5,0xfd,0x56,0xd5,0xd5,0xfe,0xfe,0xfe,0xfe,0x00,0x03,
-0x00,0xec,0x00,0x00,0x07,0x14,0x00,0xfe,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x23,
-0x40,0x11,0x08,0x04,0x00,0x83,0x0a,0x06,0x02,0x04,0x19,0x05,0x00,0x19,0x01,0x09,
-0x19,0x08,0x0c,0x10,0xd4,0xfc,0xd4,0xec,0xd4,0xec,0x31,0x00,0x2f,0x3c,0x3c,0xec,
-0x32,0x32,0x30,0x25,0x33,0x15,0x23,0x25,0x33,0x15,0x23,0x25,0x33,0x15,0x23,0x03,
-0x96,0xd4,0xd4,0x02,0xa9,0xd5,0xd5,0xfa,0xad,0xd5,0xd5,0xfe,0xfe,0xfe,0xfe,0xfe,
-0xfe,0x00,0x00,0x01,0x00,0xdc,0x02,0x6b,0x01,0xaf,0x03,0x69,0x00,0x03,0x00,0x00,
-0x13,0x33,0x15,0x23,0xdc,0xd3,0xd3,0x03,0x69,0xfe,0x00,0x07,0x00,0x71,0xff,0xe3,
-0x0a,0x4c,0x05,0xf0,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x27,0x00,0x33,0x00,0x3f,
-0x00,0x4b,0x00,0xae,0x40,0x44,0x24,0x0f,0x25,0x26,0x25,0x26,0x0f,0x27,0x24,0x27,
-0x42,0x40,0x00,0x92,0x0c,0x2e,0x92,0x1e,0x8d,0x28,0x92,0x18,0x46,0x06,0x92,0x34,
-0x0c,0x8d,0x3a,0x26,0x12,0x8c,0x24,0x18,0x91,0x4c,0x25,0x49,0x43,0x27,0x31,0x2b,
-0x43,0x0d,0x3d,0x09,0x0d,0x0f,0x0e,0x03,0x0d,0x15,0x31,0x0d,0x1b,0x3d,0x0e,0x49,
-0x0d,0x15,0x37,0x2b,0x0d,0x1b,0x0e,0x21,0x0b,0x4c,0x10,0xfc,0xe4,0xec,0xd4,0xc4,
-0xec,0xe4,0x10,0xee,0x10,0xee,0xf6,0xee,0x10,0xee,0x11,0x12,0x39,0x11,0x12,0x39,
-0x31,0x00,0x10,0xe4,0x32,0xf4,0x3c,0x3c,0xe4,0x32,0xec,0x32,0x10,0xee,0xf6,0xee,
-0x10,0xee,0x32,0x30,0x4b,0x53,0x58,0x07,0x10,0x05,0xed,0x07,0x10,0x05,0xed,0x59,
-0x22,0x01,0x4b,0xb0,0x14,0x54,0x4b,0xb0,0x09,0x54,0x5b,0x4b,0xb0,0x0b,0x54,0x5b,
-0x4b,0xb0,0x0c,0x54,0x5b,0x4b,0xb0,0x0d,0x54,0x5b,0x4b,0xb0,0x0e,0x54,0x5b,0x58,
-0xbd,0x00,0x4c,0x00,0x40,0x00,0x01,0x00,0x4c,0x00,0x4c,0xff,0xc0,0x38,0x11,0x37,
-0x38,0x59,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x32,
-0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x01,0x32,0x16,0x15,0x14,0x06,
-0x23,0x22,0x26,0x35,0x34,0x36,0x21,0x33,0x01,0x23,0x13,0x22,0x06,0x15,0x14,0x16,
-0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,
-0x34,0x36,0x17,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x08,0xf4,
-0x57,0x64,0x64,0x57,0x55,0x63,0x63,0x55,0x9e,0xba,0xbb,0x9d,0xa0,0xba,0xbb,0xf9,
-0x74,0x9e,0xbc,0xbb,0x9f,0x9f,0xb9,0xba,0x04,0x25,0xa0,0xfc,0x5a,0xa0,0x1f,0x56,
-0x63,0x62,0x57,0x57,0x63,0x64,0x03,0xb2,0x9e,0xba,0xbb,0x9d,0xa0,0xba,0xbb,0x9f,
-0x57,0x63,0x63,0x57,0x55,0x63,0x63,0x02,0x91,0x94,0x84,0x82,0x95,0x95,0x82,0x83,
-0x95,0x7f,0xdc,0xbb,0xbb,0xdb,0xdb,0xbb,0xbc,0xdb,0x02,0xe0,0xdb,0xbb,0xbd,0xda,
-0xdb,0xbc,0xba,0xdc,0xf9,0xf3,0x05,0x8e,0x95,0x82,0x84,0x94,0x94,0x84,0x81,0x96,
-0xfd,0x9f,0xdc,0xbb,0xbb,0xdb,0xdb,0xbb,0xbc,0xdb,0x7f,0x94,0x84,0x82,0x95,0x95,
-0x82,0x83,0x95,0x00,0x00,0x09,0x00,0x71,0xff,0xe3,0x0d,0x72,0x05,0xf0,0x00,0x0b,
-0x00,0x16,0x00,0x22,0x00,0x2d,0x00,0x37,0x00,0x3b,0x00,0x45,0x00,0x50,0x00,0x5c,
-0x00,0x00,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x32,
-0x16,0x10,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x05,0x22,0x06,0x15,0x14,0x16,0x33,
-0x32,0x36,0x35,0x34,0x26,0x27,0x32,0x16,0x10,0x06,0x23,0x22,0x26,0x35,0x34,0x36,
-0x00,0x20,0x16,0x15,0x14,0x06,0x20,0x26,0x35,0x34,0x25,0x33,0x01,0x23,0x12,0x22,
-0x06,0x15,0x14,0x16,0x32,0x36,0x35,0x34,0x01,0x32,0x16,0x10,0x06,0x23,0x22,0x26,
-0x35,0x34,0x36,0x17,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x0c,
-0x1a,0x57,0x64,0x64,0x57,0x55,0x63,0x63,0x55,0x9e,0xba,0xbb,0x9d,0xa0,0xba,0xbb,
-0xfd,0x79,0x57,0x64,0x64,0x57,0x55,0x63,0x63,0x55,0x9e,0xba,0xbb,0x9d,0xa0,0xba,
-0xbb,0xf8,0xd6,0x01,0x3c,0xbc,0xbb,0xfe,0xc2,0xb9,0x04,0xdf,0xa0,0xfc,0x5a,0xa0,
-0x75,0xac,0x63,0x62,0xae,0x63,0x03,0x4e,0x9e,0xba,0xbb,0x9d,0xa0,0xba,0xbb,0x9f,
-0x57,0x63,0x63,0x57,0x55,0x63,0x63,0x02,0x91,0x94,0x84,0x82,0x95,0x95,0x82,0x83,
-0x95,0x7f,0xdc,0xfe,0x8a,0xdb,0xdb,0xbb,0xbc,0xdb,0x7f,0x94,0x84,0x82,0x95,0x95,
-0x82,0x83,0x95,0x7f,0xdc,0xfe,0x8a,0xdb,0xdb,0xbb,0xbc,0xdb,0x02,0xe0,0xdb,0xbb,
-0xbd,0xda,0xdb,0xbc,0xba,0xdc,0xf9,0xf3,0x05,0x8e,0x95,0x82,0x84,0x94,0x94,0x84,
-0x81,0xfe,0x35,0xdc,0xfe,0x8a,0xdb,0xdb,0xbb,0xbc,0xdb,0x7f,0x94,0x84,0x82,0x95,
-0x95,0x82,0x83,0x95,0x00,0x01,0x00,0x6a,0x03,0x9d,0x01,0x9e,0x05,0xe2,0x00,0x03,
-0x00,0x00,0x13,0x03,0x17,0x13,0xfa,0x90,0xa4,0x90,0x05,0xe2,0xfd,0xe7,0x2c,0x02,
-0x19,0x00,0xff,0xff,0x00,0x6a,0x03,0x9d,0x02,0xe3,0x05,0xe2,0x10,0x26,0x07,0x8b,
-0x00,0x00,0x10,0x07,0x07,0x8b,0x01,0x45,0x00,0x00,0xff,0xff,0x00,0x6a,0x03,0x9d,
-0x04,0x28,0x05,0xe2,0x10,0x26,0x07,0x8b,0x00,0x00,0x10,0x27,0x07,0x8b,0x01,0x45,
-0x00,0x00,0x10,0x07,0x07,0x8b,0x02,0x8a,0x00,0x00,0x00,0x01,0x00,0x80,0x03,0x9d,
-0x01,0xb4,0x05,0xe2,0x00,0x03,0x00,0x00,0x01,0x13,0x07,0x03,0x01,0x24,0x90,0xa4,
-0x90,0x05,0xe2,0xfd,0xe7,0x2c,0x02,0x19,0xff,0xff,0x00,0x80,0x03,0x9d,0x02,0xf9,
-0x05,0xe2,0x10,0x27,0x07,0x8e,0x01,0x45,0x00,0x00,0x10,0x06,0x07,0x8e,0x00,0x00,
-0xff,0xff,0x00,0x80,0x03,0x9d,0x04,0x3e,0x05,0xe2,0x10,0x26,0x07,0x8e,0x00,0x00,
-0x10,0x27,0x07,0x8e,0x02,0x8a,0x00,0x00,0x10,0x07,0x07,0x8e,0x01,0x45,0x00,0x00,
-0x00,0x01,0x00,0x0b,0xfe,0x1d,0x02,0xab,0xff,0xc3,0x00,0x05,0x00,0x00,0x01,0x23,
-0x27,0x07,0x23,0x01,0x02,0xab,0x94,0xbb,0xbc,0x95,0x01,0x52,0xfe,0x1d,0xf9,0xf9,
-0x01,0xa6,0x00,0x01,0x00,0x9e,0x00,0x8d,0x02,0x73,0x04,0x23,0x00,0x06,0x00,0x47,
-0x40,0x25,0x03,0xe8,0x04,0x05,0x04,0x02,0xe8,0x01,0x02,0x05,0x05,0x04,0x02,0xe8,
-0x03,0x02,0x06,0x00,0x06,0x01,0xe8,0x00,0x06,0x42,0x02,0x04,0xe7,0x00,0xa6,0x07,
-0x02,0x03,0x00,0x6f,0x05,0x6e,0x07,0x10,0xfc,0xec,0x32,0x39,0x31,0x00,0x10,0xf4,
-0xec,0x39,0x30,0x4b,0x53,0x58,0x07,0x04,0xed,0x07,0x10,0x08,0xed,0x07,0x10,0x08,
-0xed,0x07,0x10,0x04,0xed,0x59,0x22,0x01,0x15,0x09,0x01,0x15,0x01,0x35,0x02,0x73,
-0xfe,0xd3,0x01,0x2d,0xfe,0x2b,0x04,0x23,0xbf,0xfe,0xf4,0xfe,0xf4,0xbf,0x01,0xa2,
-0x52,0x00,0x00,0x01,0x00,0xc1,0x00,0x8d,0x02,0x96,0x04,0x23,0x00,0x06,0x00,0x49,
-0x40,0x26,0x05,0xe8,0x06,0x05,0x02,0x03,0x02,0x04,0xe8,0x03,0x03,0x02,0x06,0xe8,
-0x00,0x01,0x00,0x05,0xe8,0x04,0x05,0x01,0x01,0x00,0x42,0x05,0x03,0xe7,0x00,0xa6,
-0x07,0x05,0x01,0x6f,0x03,0x00,0x70,0x07,0x10,0xfc,0x3c,0xec,0x39,0x31,0x00,0x10,
-0xf4,0xec,0x39,0x30,0x4b,0x53,0x58,0x07,0x10,0x08,0xed,0x07,0x10,0x04,0xed,0x07,
-0x10,0x04,0xed,0x07,0x10,0x08,0xed,0x59,0x22,0x13,0x01,0x15,0x01,0x35,0x09,0x01,
-0xc1,0x01,0xd5,0xfe,0x2b,0x01,0x2d,0xfe,0xd3,0x04,0x23,0xfe,0x5e,0x52,0xfe,0x5e,
-0xbf,0x01,0x0c,0x01,0x0c,0x00,0xff,0xff,0x00,0xc3,0x00,0x04,0x05,0xeb,0x05,0xcc,
-0x12,0x22,0x00,0x99,0x00,0x4b,0x10,0x23,0x00,0x11,0xff,0xe8,0x02,0x4e,0x10,0x23,
-0x00,0x11,0x02,0x16,0x00,0x04,0x10,0x23,0x00,0x11,0x04,0x3d,0x02,0x4e,0x10,0x03,
-0x00,0x11,0x02,0x16,0x04,0xce,0xff,0xff,0x00,0x93,0x00,0x00,0x03,0x4f,0x05,0xd5,
-0x10,0x27,0x00,0x04,0xff,0x5e,0x00,0x00,0x10,0x07,0x00,0x04,0x01,0x4f,0x00,0x00,
-0x00,0x03,0x00,0x93,0x00,0x00,0x03,0xb0,0x05,0xf0,0x00,0x17,0x00,0x1b,0x00,0x24,
-0x00,0x00,0x01,0x23,0x11,0x06,0x07,0x06,0x07,0x35,0x3e,0x01,0x33,0x32,0x16,0x15,
-0x14,0x06,0x0f,0x01,0x0e,0x01,0x07,0x0e,0x01,0x15,0x03,0x33,0x15,0x23,0x13,0x11,
-0x37,0x3e,0x01,0x35,0x34,0x27,0x26,0x02,0x4c,0xbf,0x1f,0x20,0x5a,0x61,0x5e,0xc1,
-0x67,0xb8,0xdf,0x48,0x5a,0x58,0x2f,0x27,0x08,0x06,0x06,0xc5,0xcb,0xcb,0xc5,0x2d,
-0x39,0x33,0x41,0x25,0x01,0x91,0x03,0xad,0x08,0x0d,0x23,0x43,0xbc,0x39,0x38,0xc2,
-0x9f,0x4c,0x89,0x56,0x56,0x2f,0x35,0x19,0x15,0x3c,0x34,0xfe,0xf2,0xfe,0x05,0x42,
-0xfe,0x52,0x2d,0x35,0x5e,0x31,0x59,0x37,0x1f,0x00,0xff,0xff,0xff,0xec,0x05,0x7c,
-0x04,0x14,0x06,0x0b,0x10,0x07,0x00,0x42,0x00,0x00,0x07,0x5f,0x00,0x01,0xff,0xa7,
-0xfe,0x1b,0x06,0xc7,0xff,0x85,0x00,0x0c,0x00,0x00,0x07,0x16,0x04,0x20,0x24,0x37,
-0x15,0x06,0x04,0x23,0x22,0x24,0x27,0x59,0xe6,0x01,0xc2,0x01,0xce,0x01,0xc5,0xe5,
-0xeb,0xfe,0x3a,0xe0,0xdf,0xfe,0x3c,0xec,0x7b,0x69,0x67,0x68,0x68,0x7e,0x76,0x76,
-0x75,0x77,0x00,0x01,0xff,0xa7,0x06,0x04,0x06,0xc7,0x07,0x6e,0x00,0x0c,0x00,0x00,
-0x03,0x36,0x24,0x20,0x04,0x17,0x35,0x26,0x24,0x23,0x22,0x04,0x07,0x59,0xe6,0x01,
-0xc2,0x01,0xce,0x01,0xc5,0xe5,0xeb,0xfe,0x3a,0xe0,0xdf,0xfe,0x3c,0xec,0x06,0x04,
-0x69,0x67,0x68,0x68,0x7e,0x76,0x76,0x75,0x77,0x00,0x00,0x01,0xff,0xaa,0xfe,0x1d,
-0x02,0x49,0x01,0xd5,0x00,0x07,0x00,0x00,0x01,0x33,0x09,0x01,0x23,0x0b,0x01,0x23,
-0x01,0xe7,0x62,0xfe,0xe2,0x01,0x1e,0x62,0xed,0xed,0x63,0x01,0xd5,0xfe,0x24,0xfe,
-0x24,0x01,0x8a,0xfe,0x76,0x00,0xff,0xff,0x00,0x3d,0xff,0xc5,0x07,0xc3,0x06,0x83,
-0x10,0x23,0x00,0x0d,0x00,0x00,0xfd,0x7b,0x10,0x23,0x00,0x0d,0x04,0x00,0xfd,0x7b,
-0x10,0x03,0x00,0x0d,0x02,0x00,0x00,0x93,0xff,0xff,0x00,0xdd,0x02,0x81,0x03,0x33,
-0x03,0x5f,0x12,0x43,0x02,0x7d,0x00,0x08,0xfa,0x6e,0x40,0x00,0x60,0x00,0x00,0x01,
-0xfe,0x89,0xff,0xe3,0x02,0xcd,0x05,0xf0,0x00,0x03,0x00,0x2b,0x40,0x13,0x00,0x0f,
-0x01,0x02,0x01,0x02,0x0f,0x03,0x00,0x03,0x42,0x02,0x8c,0x00,0x91,0x04,0x01,0x03,
-0x04,0x10,0xd4,0xcc,0x31,0x00,0x10,0xe4,0xe4,0x30,0x4b,0x53,0x58,0x07,0x10,0x05,
-0xed,0x07,0x10,0x05,0xed,0x59,0x22,0x01,0x33,0x01,0x23,0x02,0x2d,0xa0,0xfc,0x5c,
-0xa0,0x05,0xf0,0xf9,0xf3,0x00,0x00,0x01,0x00,0xb0,0xfe,0xf2,0x02,0x58,0x06,0x14,
-0x00,0x0b,0x00,0x00,0x01,0x11,0x33,0x15,0x21,0x11,0x21,0x15,0x23,0x11,0x33,0x15,
-0x01,0x68,0xf0,0xfe,0x58,0x01,0xa8,0xf0,0xf0,0x02,0x5e,0xfd,0x23,0x8f,0x07,0x22,
-0x8f,0xfd,0x23,0x4a,0x00,0x01,0x00,0xb0,0xfe,0xf2,0x02,0x58,0x06,0x14,0x00,0x0b,
-0x00,0x00,0x13,0x35,0x33,0x11,0x23,0x35,0x21,0x11,0x21,0x35,0x33,0x11,0xb0,0xf0,
-0xf0,0x01,0xa8,0xfe,0x58,0xf0,0x02,0x5e,0x4a,0x02,0xdd,0x8f,0xf8,0xde,0x8f,0x02,
-0xdd,0x00,0xff,0xff,0x00,0x49,0x00,0x00,0x07,0x17,0x05,0xf0,0x10,0x26,0x00,0x22,
-0xb6,0x00,0x10,0x07,0x00,0x22,0x03,0x66,0x00,0x00,0xff,0xff,0x00,0x93,0x00,0x00,
-0x05,0x4a,0x05,0xf0,0x10,0x26,0x00,0x22,0x00,0x00,0x10,0x07,0x00,0x04,0x03,0x4a,
-0x00,0x00,0xff,0xff,0x00,0x93,0x00,0x00,0x05,0x4a,0x05,0xf0,0x10,0x27,0x00,0x04,
-0xff,0x5e,0x00,0x00,0x10,0x07,0x00,0x22,0x01,0x9a,0x00,0x00,0x00,0x01,0x00,0x6f,
-0x00,0x00,0x03,0xa1,0x04,0x84,0x00,0x13,0x00,0x00,0x25,0x33,0x15,0x23,0x35,0x07,
-0x23,0x13,0x23,0x35,0x21,0x13,0x21,0x35,0x21,0x15,0x03,0x33,0x15,0x23,0x01,0xfe,
-0xa9,0xd1,0x03,0xb4,0xe0,0xf9,0x01,0x24,0xa8,0xfd,0x9d,0x03,0x32,0xc3,0xa5,0xd0,
-0x66,0x66,0x07,0x07,0x02,0x0f,0x66,0x01,0x8b,0x84,0x43,0xfe,0x34,0x66,0x00,0x01,
-0x00,0xec,0xff,0x3b,0x04,0x87,0x05,0xd5,0x00,0x0d,0x00,0x00,0x01,0x21,0x11,0x33,
-0x11,0x33,0x11,0x33,0x11,0x3e,0x01,0x35,0x34,0x24,0x02,0xac,0xfe,0x40,0x8d,0xbe,
-0x8e,0xd7,0xeb,0xfe,0xfc,0x05,0xd5,0xf9,0x66,0x06,0x1f,0xf9,0xe1,0x03,0x4e,0x11,
-0xdd,0xb8,0xbe,0xe8,0x00,0x02,0x00,0xd8,0x01,0xc2,0x03,0x28,0x04,0x12,0x00,0x03,
-0x00,0x0b,0x00,0x00,0x01,0x33,0x11,0x07,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,
-0x02,0x79,0xaf,0xaf,0x76,0x02,0x7d,0xac,0xad,0x7e,0x04,0x12,0xfd,0xb1,0x01,0xac,
-0x7d,0x7c,0xab,0x00,0x00,0x02,0x00,0xd8,0x01,0xc2,0x03,0x28,0x04,0x12,0x00,0x03,
-0x00,0x0b,0x00,0x00,0x01,0x27,0x11,0x3b,0x01,0x32,0x16,0x15,0x14,0x06,0x2b,0x01,
-0x01,0x87,0xaf,0xaf,0x76,0x7e,0xad,0xac,0x7d,0x02,0x01,0xc2,0x01,0x02,0x4f,0xab,
-0x7c,0x7d,0xac,0x00,0xff,0xff,0x00,0x3d,0xff,0xc5,0x03,0xc3,0x03,0x6b,0x12,0x03,
-0x00,0x0d,0x00,0x00,0xfd,0x7b,0x00,0x02,0x01,0x1d,0xff,0x12,0x02,0x42,0x04,0x23,
-0x00,0x03,0x00,0x09,0x00,0x00,0x01,0x23,0x15,0x33,0x11,0x23,0x15,0x13,0x33,0x03,
-0x01,0xf0,0xd3,0xd3,0xd3,0xa4,0x81,0x52,0x04,0x23,0xfe,0xfd,0xd9,0xac,0xfe,0xc0,
-0x01,0x40,0x00,0x02,0xff,0xa7,0xfe,0x1b,0x06,0xc7,0x07,0x6e,0x00,0x0c,0x00,0x19,
-0x00,0x00,0x07,0x16,0x04,0x20,0x24,0x37,0x15,0x06,0x04,0x23,0x22,0x24,0x27,0x11,
-0x36,0x24,0x20,0x04,0x17,0x35,0x26,0x24,0x23,0x22,0x04,0x07,0x59,0xe6,0x01,0xc2,
-0x01,0xce,0x01,0xc5,0xe5,0xeb,0xfe,0x3a,0xe0,0xdf,0xfe,0x3c,0xec,0xe6,0x01,0xc2,
-0x01,0xce,0x01,0xc5,0xe5,0xeb,0xfe,0x3a,0xe0,0xdf,0xfe,0x3c,0xec,0x7b,0x69,0x67,
-0x68,0x68,0x7e,0x76,0x76,0x75,0x77,0x06,0xfd,0x69,0x67,0x68,0x68,0x7e,0x76,0x76,
-0x75,0x77,0xff,0xff,0x00,0x3d,0xff,0xf2,0x03,0xc3,0x07,0x6f,0x12,0x23,0x00,0x0d,
-0x00,0x00,0xfd,0xa8,0x10,0x03,0x00,0x0d,0x00,0x00,0x01,0x7f,0xff,0xff,0x00,0x91,
-0xff,0x42,0x03,0x43,0x05,0xd5,0x10,0x23,0x00,0x12,0x00,0x91,0x00,0x00,0x10,0x23,
-0x00,0x11,0x01,0x8e,0x00,0x00,0x10,0x03,0x00,0x11,0xff,0xd9,0x04,0x48,0xff,0xff,
-0x00,0xd9,0x01,0xd3,0x05,0xdb,0x03,0x31,0x12,0x02,0x00,0x61,0x00,0x00,0xff,0xff,
-0xff,0xa7,0xfe,0x14,0x06,0xc7,0xff,0x7e,0x10,0x07,0x07,0x99,0x00,0x00,0xf8,0x10,
-0x00,0x01,0x01,0x38,0x00,0xc8,0x05,0x7c,0x05,0x0d,0x00,0x17,0x00,0x00,0x01,0x11,
-0x23,0x11,0x07,0x27,0x37,0x21,0x35,0x21,0x27,0x37,0x17,0x11,0x33,0x11,0x37,0x17,
-0x07,0x21,0x15,0x21,0x17,0x07,0x03,0xaa,0xa0,0xf9,0x71,0xf9,0xfe,0x9f,0x01,0x61,
-0xfa,0x71,0xfa,0xa0,0xfa,0x71,0xfa,0x01,0x61,0xfe,0x9f,0xfa,0x71,0x02,0x29,0xfe,
-0x9f,0x01,0x60,0xf9,0x72,0xf9,0xa0,0xfa,0x72,0xfb,0x01,0x62,0xfe,0x9e,0xfa,0x71,
-0xfa,0xa0,0xf9,0x72,0x00,0x03,0x00,0xfa,0x01,0x32,0x03,0xb6,0x04,0xb6,0x00,0x03,
-0x00,0x07,0x00,0x0b,0x00,0x00,0x13,0x35,0x33,0x15,0x01,0x35,0x33,0x15,0x03,0x35,
-0x33,0x15,0xfa,0xc8,0x01,0x2c,0xc8,0xc8,0xc8,0x02,0x90,0xc8,0xc8,0xfe,0xa2,0xc8,
-0xc8,0x02,0xbc,0xc8,0xc8,0x00,0x00,0x04,0x00,0x28,0x04,0x60,0x05,0x24,0x05,0xd5,
-0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x00,0x01,0x13,0x33,0x01,0x21,0x13,
-0x33,0x01,0x21,0x13,0x33,0x01,0x21,0x13,0x33,0x01,0x03,0xac,0xad,0xcb,0xfe,0xdf,
-0xfe,0x7d,0xad,0xcb,0xfe,0xdf,0xfe,0x7d,0xad,0xcb,0xfe,0xdf,0xfe,0x7d,0xad,0xcb,
-0xfe,0xdf,0x04,0x60,0x01,0x75,0xfe,0x8b,0x01,0x75,0xfe,0x8b,0x01,0x75,0xfe,0x8b,
-0x01,0x75,0xfe,0x8b,0x00,0x04,0x01,0x66,0x01,0x00,0x05,0x4e,0x04,0xe8,0x00,0x03,
-0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x00,0x01,0x35,0x33,0x15,0x21,0x35,0x33,0x15,
-0x01,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0x01,0x66,0xc8,0x02,0x58,0xc8,0xfd,0xa8,
-0xc8,0xc8,0xc8,0x02,0x90,0xc8,0xc8,0xc8,0xc8,0xfe,0x70,0xc8,0xc8,0x03,0x20,0xc8,
-0xc8,0x00,0x00,0x05,0x01,0x66,0x00,0xf6,0x05,0x4e,0x04,0xde,0x00,0x03,0x00,0x07,
-0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x00,0x01,0x35,0x33,0x15,0x13,0x35,0x33,0x15,
-0x03,0x35,0x33,0x15,0x01,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0x02,0xf6,0xc8,0xc8,
-0xc8,0xc8,0xc8,0xfc,0x2c,0xc8,0xdc,0xc8,0x02,0x86,0xc8,0xc8,0xfe,0x70,0xc8,0xc8,
-0x03,0x20,0xc8,0xc8,0xfc,0xf4,0xc8,0xc8,0x03,0x0c,0xc8,0xc8,0x00,0x02,0x00,0xdb,
-0x00,0x00,0x01,0xae,0x05,0xd5,0x00,0x03,0x00,0x07,0x00,0x00,0x13,0x33,0x15,0x23,
-0x11,0x33,0x15,0x23,0xdb,0xd3,0xd3,0xd3,0xd3,0x05,0xd5,0xfe,0xfc,0x27,0xfe,0x00,
-0x00,0x04,0x00,0x64,0xfe,0xe5,0x05,0xfd,0x06,0xef,0x00,0x03,0x00,0x07,0x00,0x0b,
-0x00,0x0f,0x00,0x00,0x13,0x33,0x15,0x23,0x25,0x33,0x15,0x23,0x01,0x33,0x15,0x23,
-0x11,0x33,0x15,0x23,0x64,0xd3,0xd3,0x04,0xc6,0xd3,0xd3,0xfd,0x9d,0xd3,0xd3,0xd3,
-0xd3,0x03,0x69,0xfe,0xfe,0xfe,0x04,0x84,0xfe,0xf9,0xf2,0xfe,0x00,0x05,0x00,0x70,
-0x00,0x00,0x06,0x44,0x05,0xd5,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x1b,
-0x00,0x00,0x25,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0x01,0x35,0x33,0x15,0x03,0x35,
-0x33,0x15,0x01,0x11,0x23,0x11,0x21,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0x04,0x86,
-0xc8,0xc8,0xc8,0xfc,0x2c,0xc8,0xdc,0xc8,0x01,0x7c,0xa0,0xfd,0x66,0x02,0x9a,0xa0,
-0x02,0x9a,0xf6,0xc8,0xc8,0x03,0x20,0xc8,0xc8,0xfc,0xf4,0xc8,0xc8,0x03,0x0c,0xc8,
-0xc8,0xfe,0x84,0xfd,0x66,0x02,0x9a,0xa0,0x02,0x9b,0xfd,0x65,0xa0,0x00,0x00,0x03,
-0x00,0xdb,0x00,0x50,0x01,0xae,0x05,0x3e,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x00,
-0x13,0x33,0x15,0x23,0x11,0x33,0x15,0x23,0x11,0x33,0x15,0x23,0xdb,0xd3,0xd3,0xd3,
-0xd3,0xd3,0xd3,0x05,0x3e,0xfe,0xfd,0x0e,0xfe,0x02,0xf6,0xfe,0x00,0x04,0x00,0xdb,
-0x00,0x11,0x01,0xae,0x05,0x77,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x00,
-0x13,0x33,0x15,0x23,0x11,0x33,0x15,0x23,0x11,0x33,0x15,0x23,0x11,0x33,0x15,0x23,
-0xdb,0xd3,0xd3,0xd3,0xd3,0xd3,0xd3,0xd3,0xd3,0x02,0x89,0xfe,0x03,0xec,0xfe,0xfc,
-0x96,0xfe,0x03,0xf0,0xfe,0x00,0x00,0x02,0x00,0x57,0x02,0x8d,0x02,0xee,0x05,0xf0,
-0x00,0x0d,0x00,0x19,0x00,0x00,0x00,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x32,0x37,
-0x36,0x35,0x34,0x2f,0x01,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,
-0x02,0x08,0xca,0x32,0x33,0x33,0x32,0xca,0x32,0x33,0x33,0x97,0xa1,0xaa,0xaa,0xa1,
-0xa2,0xaa,0xaa,0x05,0x97,0x56,0x56,0xac,0xad,0x56,0x56,0x56,0x56,0xad,0xac,0x56,
-0xaf,0xde,0xd3,0xd4,0xde,0xde,0xd4,0xd3,0xde,0x00,0x00,0x02,0x00,0x7a,0x02,0x9c,
-0x00,0xee,0x06,0x03,0x00,0x03,0x00,0x07,0x00,0x00,0x13,0x33,0x11,0x23,0x11,0x33,
-0x15,0x23,0x7a,0x74,0x74,0x74,0x74,0x05,0x0f,0xfd,0x8d,0x03,0x67,0x82,0x00,0x02,
-0x00,0x3f,0x02,0x9c,0x02,0xf4,0x05,0xdf,0x00,0x02,0x00,0x0d,0x00,0xd4,0x40,0x16,
-0x00,0x03,0x0b,0x07,0xdd,0x05,0x01,0x09,0xf7,0x03,0x91,0x0e,0x01,0x0c,0x0a,0x00,
-0x5d,0x06,0x08,0x04,0x0c,0x0e,0x10,0xdc,0xd4,0x3c,0xc4,0xec,0x32,0x11,0x39,0x31,
-0x00,0x10,0xf4,0xfc,0xd4,0x3c,0xec,0x32,0x12,0x39,0x30,0x01,0x4b,0xb0,0x0e,0x54,
-0x4b,0xb0,0x0f,0x54,0x5b,0x4b,0xb0,0x10,0x54,0x5b,0x4b,0xb0,0x11,0x54,0x5b,0x4b,
-0xb0,0x0b,0x54,0x5b,0x4b,0xb0,0x0a,0x54,0x5b,0x58,0xbd,0x00,0x0e,0x00,0x40,0x00,
-0x01,0x00,0x0e,0x00,0x0e,0xff,0xc0,0x38,0x11,0x37,0x38,0x59,0x00,0x4b,0xb0,0x11,
-0x54,0x4b,0xb0,0x0e,0x54,0x5b,0x58,0xbd,0x00,0x0e,0xff,0xc0,0x00,0x01,0x00,0x0e,
-0x00,0x0e,0x00,0x40,0x38,0x11,0x37,0x38,0x59,0x40,0x54,0x0b,0x01,0x1d,0x01,0x2f,
-0x01,0x39,0x01,0x49,0x01,0x46,0x03,0x59,0x03,0x69,0x03,0x8b,0x03,0xab,0x03,0xbb,
-0x03,0x0b,0x01,0x00,0x0f,0x01,0x0f,0x02,0x0f,0x05,0x0f,0x06,0x0f,0x07,0x0f,0x08,
-0x0f,0x0b,0x0f,0x0c,0x0f,0x0d,0x13,0x00,0x1f,0x01,0x1f,0x02,0x1f,0x05,0x1f,0x06,
-0x1f,0x07,0x1f,0x08,0x1f,0x0b,0x1f,0x0c,0x1f,0x0d,0x22,0x00,0x35,0x00,0x47,0x00,
-0x4b,0x0d,0x53,0x00,0x5b,0x0d,0x65,0x00,0x84,0x00,0xa5,0x00,0xb5,0x00,0x1e,0x5d,
-0x01,0x5d,0x09,0x01,0x21,0x03,0x33,0x11,0x33,0x15,0x23,0x15,0x23,0x35,0x21,0x35,
-0x01,0xdd,0xfe,0xcb,0x01,0x35,0x16,0xa6,0x87,0x87,0x90,0xfe,0x62,0x05,0x66,0xfe,
-0x5d,0x02,0x1c,0xfd,0xe4,0x6d,0xba,0xba,0x79,0x00,0x00,0x01,0x00,0x66,0x02,0x8d,
-0x02,0xd3,0x05,0xdf,0x00,0x20,0x00,0x00,0x13,0x21,0x15,0x21,0x15,0x36,0x37,0x36,
-0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x23,0x22,0x26,0x27,0x35,0x16,0x17,0x16,
-0x33,0x32,0x36,0x34,0x26,0x23,0x22,0x06,0x07,0x8e,0x01,0xfe,0xfe,0x79,0x1c,0x1d,
-0x1c,0x1c,0xa1,0x5e,0x5e,0x61,0x60,0xb0,0x3c,0x7e,0x42,0x39,0x3e,0x3e,0x45,0x6f,
-0x82,0x82,0x6f,0x34,0x68,0x36,0x05,0xdf,0x5f,0xcc,0x09,0x04,0x04,0x4d,0x4c,0x83,
-0x87,0x4b,0x4a,0x12,0x12,0x71,0x1b,0x0e,0x0d,0x66,0xae,0x66,0x14,0x15,0x00,0x02,
-0x00,0x5c,0x02,0x8d,0x02,0xf3,0x05,0xf0,0x00,0x0f,0x00,0x2f,0x00,0x00,0x01,0x22,
-0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x13,0x15,
-0x26,0x27,0x26,0x23,0x22,0x07,0x06,0x07,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x15,
-0x14,0x07,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x16,0x01,0xb3,
-0x58,0x33,0x33,0x33,0x33,0x58,0x57,0x33,0x33,0x33,0x33,0xab,0x31,0x32,0x32,0x31,
-0x80,0x44,0x44,0x0a,0x26,0x39,0x3a,0x44,0x91,0x54,0x54,0x58,0x57,0x91,0xa7,0xb0,
-0x6c,0x6c,0xb6,0x31,0x32,0x32,0x04,0x6d,0x34,0x35,0x5b,0x5a,0x34,0x35,0x35,0x34,
-0x5a,0x5b,0x35,0x34,0x01,0x62,0x67,0x14,0x0a,0x0b,0x4b,0x4c,0x99,0x31,0x1a,0x1a,
-0x4c,0x4d,0x84,0x7f,0x4f,0x4e,0xde,0xd4,0xc6,0x75,0x76,0x08,0x09,0x00,0x00,0x01,
-0x00,0x6c,0x02,0x9c,0x02,0xd5,0x05,0xdf,0x00,0x06,0x00,0x00,0x13,0x21,0x15,0x01,
-0x23,0x01,0x21,0x6c,0x02,0x69,0xfe,0xa4,0x88,0x01,0x48,0xfe,0x33,0x05,0xdf,0x30,
-0xfc,0xed,0x02,0xe4,0x00,0x03,0x00,0x59,0x02,0x8d,0x02,0xec,0x05,0xf0,0x00,0x0c,
-0x00,0x2a,0x00,0x3a,0x00,0x00,0x00,0x22,0x07,0x06,0x15,0x14,0x16,0x33,0x32,0x37,
-0x36,0x34,0x27,0x25,0x26,0x27,0x26,0x35,0x34,0x36,0x20,0x17,0x16,0x15,0x14,0x07,
-0x06,0x07,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,
-0x36,0x37,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x23,0x22,0x07,
-0x06,0x02,0x00,0xba,0x35,0x35,0x6a,0x5d,0x5c,0x36,0x35,0x35,0xfe,0xec,0x54,0x2e,
-0x2f,0xa4,0x01,0x1e,0x52,0x51,0x2e,0x2f,0x53,0x5a,0x38,0x35,0x55,0x56,0x9e,0x9f,
-0x55,0x56,0x35,0x36,0x2d,0x2f,0x2e,0x55,0x51,0x31,0x30,0x30,0x2f,0x53,0x53,0x30,
-0x2f,0x04,0x2a,0x2c,0x2b,0x4b,0x4c,0x56,0x2c,0x2b,0x96,0x2b,0x5d,0x12,0x31,0x32,
-0x48,0x64,0x74,0x3a,0x3a,0x64,0x4a,0x30,0x31,0x12,0x12,0x3a,0x37,0x50,0x79,0x41,
-0x41,0x41,0x41,0x79,0x4e,0x39,0x38,0xc6,0x3f,0x26,0x25,0x25,0x24,0x41,0x3f,0x26,
-0x25,0x25,0x24,0x00,0x00,0x02,0x00,0x53,0x02,0x8d,0x02,0xe9,0x05,0xf0,0x00,0x1f,
-0x00,0x2e,0x00,0x00,0x13,0x35,0x16,0x17,0x16,0x33,0x32,0x37,0x36,0x37,0x06,0x07,
-0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x06,
-0x23,0x22,0x27,0x26,0x13,0x32,0x36,0x35,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x15,
-0x14,0x17,0x16,0x91,0x31,0x32,0x32,0x30,0x81,0x44,0x43,0x0a,0x23,0x3c,0x39,0x45,
-0x90,0xa8,0x57,0x58,0x91,0xa7,0x57,0x58,0x6b,0x6c,0xb6,0x31,0x32,0x32,0xcc,0x58,
-0x66,0x33,0x33,0x58,0x55,0x35,0x34,0x34,0x33,0x02,0xae,0x67,0x14,0x0b,0x0a,0x4b,
-0x4b,0x9a,0x2f,0x1b,0x1a,0x98,0x84,0x81,0x4d,0x4e,0x6f,0x6f,0xd4,0xc6,0x75,0x76,
-0x08,0x09,0x01,0x72,0x68,0x5c,0x5a,0x34,0x35,0x35,0x34,0x5a,0x5c,0x34,0x34,0x00,
-0x00,0x01,0x00,0x89,0x02,0x9c,0x03,0xb0,0x05,0x6b,0x00,0x0b,0x00,0x00,0x01,0x11,
-0x21,0x15,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x11,0x02,0x51,0x01,0x5f,0xfe,0xa1,
-0x69,0xfe,0xa1,0x01,0x5f,0x05,0x6b,0xfe,0xc8,0x5f,0xfe,0xc8,0x01,0x38,0x5f,0x01,
-0x38,0x00,0x00,0x01,0x00,0x89,0x03,0xd4,0x03,0xb0,0x04,0x33,0x00,0x03,0x00,0x00,
-0x13,0x21,0x15,0x21,0x89,0x03,0x27,0xfc,0xd9,0x04,0x33,0x5f,0x00,0x02,0x00,0x89,
-0x03,0x61,0x03,0xb0,0x04,0xa5,0x00,0x03,0x00,0x07,0x00,0x00,0x13,0x21,0x15,0x21,
-0x15,0x21,0x15,0x21,0x89,0x03,0x27,0xfc,0xd9,0x03,0x27,0xfc,0xd9,0x04,0xa5,0x5e,
-0x87,0x5f,0x00,0x01,0x00,0x6f,0x02,0x05,0x01,0x90,0x06,0x02,0x00,0x0d,0x00,0x00,
-0x01,0x0e,0x01,0x10,0x16,0x17,0x23,0x26,0x27,0x26,0x34,0x37,0x36,0x37,0x01,0x90,
-0x54,0x52,0x52,0x54,0x65,0x5e,0x2f,0x2f,0x2f,0x2e,0x5f,0x06,0x02,0x81,0xfc,0xfe,
-0xfe,0xfe,0x80,0x83,0x80,0x7f,0xfa,0x7f,0x7e,0x84,0x00,0x01,0x00,0x67,0x02,0x05,
-0x01,0x88,0x06,0x02,0x00,0x0f,0x00,0x00,0x13,0x33,0x16,0x17,0x16,0x14,0x07,0x06,
-0x07,0x23,0x36,0x37,0x36,0x10,0x27,0x26,0x67,0x65,0x5f,0x2f,0x2e,0x2e,0x2f,0x5f,
-0x65,0x54,0x29,0x2a,0x2a,0x29,0x06,0x02,0x84,0x7e,0x7f,0xfa,0x7f,0x80,0x83,0x80,
-0x7f,0x7f,0x01,0x02,0x7e,0x7e,0x00,0x01,0x00,0x75,0x02,0x9c,0x02,0xc5,0x05,0x1f,
-0x00,0x13,0x00,0x00,0x01,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,
-0x11,0x33,0x15,0x3e,0x01,0x33,0x32,0x16,0x02,0xc4,0x74,0x4e,0x4e,0x5e,0x6c,0x75,
-0x75,0x29,0x71,0x4a,0x79,0x7d,0x04,0x17,0xfe,0x85,0x01,0x77,0x59,0x59,0x6b,0x5c,
-0xfe,0x9e,0x02,0x73,0x61,0x38,0x38,0x86,0xff,0xff,0x00,0x57,0xff,0xf1,0x02,0xee,
-0x03,0x54,0x10,0x07,0x07,0xb8,0x00,0x00,0xfd,0x64,0xff,0xff,0x00,0x89,0x00,0x00,
-0x02,0xc5,0x03,0x43,0x10,0x07,0x00,0x7b,0x00,0x00,0xfd,0x64,0xff,0xff,0x00,0x5e,
-0x00,0x00,0x02,0xb4,0x03,0x54,0x10,0x07,0x00,0x74,0x00,0x00,0xfd,0x64,0xff,0xff,
-0x00,0x62,0xff,0xf1,0x02,0xcd,0x03,0x54,0x10,0x07,0x00,0x75,0x00,0x00,0xfd,0x64,
-0xff,0xff,0x00,0x3f,0x00,0x00,0x02,0xf4,0x03,0x43,0x10,0x07,0x07,0xba,0x00,0x00,
-0xfd,0x64,0xff,0xff,0x00,0x66,0xff,0xf1,0x02,0xd3,0x03,0x43,0x10,0x07,0x07,0xbb,
-0x00,0x00,0xfd,0x64,0xff,0xff,0x00,0x5c,0xff,0xf1,0x02,0xf3,0x03,0x54,0x10,0x07,
-0x07,0xbc,0x00,0x00,0xfd,0x64,0xff,0xff,0x00,0x6c,0x00,0x00,0x02,0xd5,0x03,0x43,
-0x10,0x07,0x07,0xbd,0x00,0x00,0xfd,0x64,0xff,0xff,0x00,0x59,0xff,0xf1,0x02,0xec,
-0x03,0x54,0x10,0x07,0x07,0xbe,0x00,0x00,0xfd,0x64,0xff,0xff,0x00,0x53,0xff,0xf1,
-0x02,0xe9,0x03,0x54,0x10,0x07,0x07,0xbf,0x00,0x00,0xfd,0x64,0xff,0xff,0x00,0x89,
-0x00,0x00,0x03,0xb0,0x02,0xcf,0x10,0x07,0x07,0xc0,0x00,0x00,0xfd,0x64,0xff,0xff,
-0x00,0x89,0x01,0x38,0x03,0xb0,0x01,0x97,0x10,0x07,0x07,0xc1,0x00,0x00,0xfd,0x64,
-0xff,0xff,0x00,0x89,0x00,0xc5,0x03,0xb0,0x02,0x09,0x10,0x07,0x07,0xc2,0x00,0x00,
-0xfd,0x64,0xff,0xff,0x00,0x6f,0xff,0x69,0x01,0x90,0x03,0x66,0x10,0x07,0x07,0xc3,
-0x00,0x00,0xfd,0x64,0xff,0xff,0x00,0x67,0xff,0x69,0x01,0x88,0x03,0x66,0x10,0x07,
-0x07,0xc4,0x00,0x00,0xfd,0x64,0x00,0x01,0x00,0x56,0x00,0x00,0x06,0xae,0x05,0xd6,
-0x00,0x23,0x00,0x00,0x01,0x0e,0x01,0x23,0x22,0x00,0x10,0x00,0x33,0x32,0x16,0x17,
-0x15,0x2e,0x01,0x23,0x22,0x06,0x10,0x16,0x33,0x32,0x36,0x37,0x11,0x21,0x15,0x21,
-0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x03,0xdd,0x4f,0xb2,0x63,0xfe,0xfe,0xdb,
-0x01,0x25,0xfe,0x65,0xb1,0x4e,0x4c,0xad,0x62,0xc0,0xcc,0xcc,0xc0,0x62,0xad,0x4c,
-0x02,0xc4,0xfd,0xd3,0x02,0x16,0xfd,0xea,0x02,0x3a,0xfd,0x2f,0x01,0xb8,0x36,0x36,
-0x01,0x37,0x02,0x1c,0x01,0x37,0x35,0x36,0x9f,0x47,0x46,0xea,0xfe,0x44,0xea,0x46,
-0x47,0x02,0x0a,0x80,0xfe,0xb5,0x80,0xfe,0x6b,0x80,0x00,0x03,0x00,0x73,0xff,0xa6,
-0x04,0xbe,0x06,0x39,0x00,0x27,0x00,0x2e,0x00,0x34,0x00,0x00,0x01,0x16,0x17,0x37,
-0x33,0x07,0x16,0x17,0x15,0x26,0x27,0x01,0x33,0x32,0x36,0x37,0x15,0x0e,0x01,0x23,
-0x22,0x27,0x07,0x23,0x37,0x26,0x27,0x07,0x23,0x37,0x26,0x27,0x26,0x11,0x10,0x37,
-0x36,0x25,0x37,0x33,0x07,0x06,0x07,0x06,0x11,0x14,0x17,0x01,0x26,0x27,0x01,0x16,
-0x17,0x03,0x68,0x41,0x3e,0x1e,0x9b,0x2f,0x28,0x25,0x3a,0x40,0xfe,0xc1,0x12,0x77,
-0xd3,0x5d,0x61,0xd8,0x79,0x1b,0x1a,0x12,0x9b,0x19,0x41,0x39,0x26,0x9b,0x41,0x13,
-0x11,0xb2,0xb2,0xa0,0x01,0x08,0x15,0x9c,0xe3,0x91,0x58,0x7d,0x52,0x02,0x34,0x3e,
-0x43,0xfe,0xc1,0x35,0x41,0x05,0xeb,0x08,0x13,0x69,0xa5,0x16,0x1c,0xd5,0x3c,0x29,
-0xfb,0x97,0x5e,0x5f,0xd3,0x48,0x48,0x02,0x3f,0x57,0x12,0x1e,0x87,0xe6,0x12,0x15,
-0xcf,0x01,0x67,0x01,0x68,0xd0,0xb9,0x14,0x4b,0xfc,0x1f,0x70,0x9d,0xfe,0xd8,0xee,
-0x94,0x03,0xcb,0x13,0x04,0xfb,0x95,0x28,0x15,0x00,0x00,0x01,0x00,0x60,0xff,0xe4,
-0x04,0xb3,0x05,0xf0,0x00,0x2c,0x00,0x00,0x25,0x36,0x37,0x36,0x37,0x15,0x0e,0x01,
-0x23,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x16,0x17,0x15,0x2e,0x01,0x23,0x22,0x02,
-0x11,0x10,0x17,0x16,0x17,0x11,0x33,0x15,0x3e,0x01,0x33,0x32,0x16,0x1f,0x01,0x2e,
-0x01,0x23,0x22,0x06,0x15,0x03,0x2e,0x61,0x58,0x6a,0x5d,0x61,0xd9,0x79,0xfe,0xca,
-0xfe,0x9b,0x01,0x65,0x01,0x36,0x7b,0xd9,0x5f,0x5d,0xd4,0x77,0xea,0xf9,0x7c,0x5e,
-0x99,0x98,0x30,0x9a,0x6e,0x0f,0x26,0x17,0x01,0x1a,0x3c,0x24,0x80,0x8b,0x8a,0x07,
-0x27,0x2f,0x5f,0xd3,0x48,0x47,0x01,0x9e,0x01,0x67,0x01,0x68,0x01,0x9f,0x47,0x47,
-0xd5,0x5f,0x5e,0xfe,0xc7,0xfe,0xd8,0xfe,0xd9,0x9c,0x75,0x1e,0x03,0x5d,0x9d,0x5c,
-0x59,0x04,0x05,0xaa,0x10,0x0f,0xb6,0xab,0x00,0x01,0x00,0x85,0x00,0x00,0x04,0xcb,
-0x05,0xd5,0x00,0x11,0x00,0x00,0x01,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,
-0x33,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0x01,0x71,0x03,0x5a,0xfd,0x70,0x02,0x50,
-0xfd,0xb0,0xfa,0xfa,0xca,0xec,0x01,0x7e,0x04,0x57,0xaa,0xfe,0x48,0xaa,0xfe,0xb5,
-0x45,0xfe,0xc7,0x01,0x39,0x45,0x00,0x01,0x00,0x81,0x00,0x00,0x04,0x62,0x05,0xf0,
-0x00,0x23,0x00,0x00,0x01,0x11,0x21,0x15,0x21,0x35,0x33,0x11,0x23,0x35,0x33,0x35,
-0x23,0x35,0x33,0x35,0x10,0x36,0x33,0x32,0x16,0x17,0x15,0x2e,0x01,0x23,0x22,0x06,
-0x1d,0x01,0x21,0x15,0x21,0x15,0x21,0x15,0x02,0x35,0x02,0x2d,0xfc,0x1f,0xec,0xbf,
-0xbf,0xc7,0xc7,0xd6,0xe8,0x3d,0x97,0x4f,0x4c,0x88,0x3d,0x94,0x74,0x01,0x87,0xfe,
-0x79,0x01,0x8f,0x01,0xec,0xfe,0xbe,0xaa,0xaa,0x01,0x42,0x8f,0x8f,0x8f,0x5f,0x01,
-0x05,0xf3,0x1f,0x1d,0xb6,0x29,0x29,0x9b,0xd4,0x48,0x8f,0x8f,0x8f,0x00,0x00,0x01,
-0x00,0xba,0xff,0xbd,0x07,0x1d,0x04,0xab,0x00,0x2a,0x00,0x00,0x01,0x16,0x17,0x3e,
-0x01,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,
-0x11,0x34,0x27,0x01,0x23,0x01,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,
-0x3e,0x01,0x33,0x32,0x17,0x37,0x33,0x03,0xcc,0x3d,0x20,0x45,0xc0,0x82,0xaf,0xbe,
-0xb9,0x72,0x75,0x8f,0xa6,0xb9,0x0e,0xfe,0xf0,0x80,0x01,0x3b,0x35,0x51,0x8d,0xa6,
-0xb9,0xb9,0x3f,0xb0,0x79,0x4a,0x3c,0x16,0x80,0x04,0x21,0x3b,0x5d,0x7c,0x76,0xf5,
-0xe2,0xfd,0x5c,0x02,0x9e,0xa1,0x9c,0xbe,0xa4,0xfd,0x87,0x02,0x9e,0x52,0x3c,0xfc,
-0x91,0x03,0xfa,0x24,0xbf,0xa3,0xfd,0x87,0x04,0x60,0xae,0x67,0x62,0x17,0x47,0x00,
-0x00,0x05,0x00,0x75,0x00,0x00,0x05,0x87,0x05,0xd5,0x00,0x02,0x00,0x06,0x00,0x22,
-0x00,0x26,0x00,0x29,0x00,0x00,0x01,0x27,0x15,0x13,0x27,0x23,0x15,0x03,0x21,0x13,
-0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x15,0x33,0x15,0x23,0x11,0x21,0x03,0x23,0x11,
-0x23,0x11,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x05,0x17,0x33,0x35,0x03,0x17,0x35,
-0x02,0x4b,0x4f,0xb6,0x38,0x7e,0xc4,0x01,0x10,0xd3,0xe5,0xc4,0xc3,0xc3,0xc3,0xc3,
-0xfe,0xf0,0xd3,0xe5,0xc4,0xc3,0xc3,0xc3,0xc3,0x02,0x12,0x38,0x7e,0x4f,0x4f,0x03,
-0xaf,0xce,0xce,0xfe,0xf2,0x93,0x93,0x03,0x34,0xfd,0xda,0x02,0x26,0xfd,0xda,0x7b,
-0x93,0x7b,0xfd,0xda,0x02,0x26,0xfd,0xda,0x02,0x26,0x7b,0x93,0x7b,0x7b,0x93,0x93,
-0xfe,0xf2,0xce,0xce,0x00,0x02,0x00,0xc9,0xff,0xe3,0x09,0xce,0x05,0xd5,0x00,0x08,
-0x00,0x50,0x00,0x00,0x01,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x01,0x06,0x07,
-0x06,0x2b,0x01,0x11,0x23,0x11,0x21,0x32,0x17,0x16,0x17,0x33,0x11,0x33,0x11,0x21,
-0x15,0x21,0x11,0x14,0x16,0x3b,0x01,0x35,0x1e,0x01,0x33,0x32,0x36,0x35,0x34,0x26,
-0x2f,0x01,0x2e,0x01,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x15,0x2e,0x01,0x23,0x22,
-0x06,0x15,0x14,0x16,0x1f,0x01,0x1e,0x01,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x35,
-0x23,0x22,0x26,0x35,0x11,0x01,0x87,0xef,0x85,0x91,0x91,0x85,0x01,0xdd,0x06,0x71,
-0x7a,0xec,0xef,0xbe,0x01,0xad,0xec,0x7a,0x57,0x18,0x51,0xae,0x01,0x65,0xfe,0x9b,
-0x47,0x6c,0xab,0x60,0xbb,0x5b,0x7a,0x84,0x5f,0xa1,0x3c,0xa1,0x8f,0xd3,0xc2,0x60,
-0xa9,0x48,0x4a,0x9e,0x55,0x81,0x81,0x5d,0x8b,0x3b,0xb9,0x9b,0xe9,0xcb,0x55,0xb7,
-0x66,0xab,0xc9,0x98,0x05,0x2f,0xfd,0xcf,0x92,0x87,0x86,0x92,0xfe,0xcc,0xc8,0x6a,
-0x71,0xfd,0xa8,0x05,0xd5,0x71,0x52,0x88,0x01,0x3e,0xfe,0xc2,0x8f,0xfd,0xa0,0x89,
-0x4e,0x23,0x35,0x35,0x59,0x51,0x4b,0x50,0x25,0x0f,0x24,0x95,0x82,0x9e,0xac,0x1e,
-0x1e,0xae,0x28,0x28,0x54,0x54,0x40,0x49,0x21,0x0e,0x2a,0x99,0x89,0x9c,0xb6,0x23,
-0x23,0x01,0x9f,0xd2,0x02,0x60,0x00,0x02,0x00,0xc9,0xff,0xe3,0x08,0x33,0x05,0xd5,
-0x00,0x07,0x00,0x45,0x00,0x00,0x01,0x11,0x33,0x32,0x36,0x10,0x26,0x23,0x01,0x17,
-0x23,0x03,0x2e,0x01,0x2b,0x01,0x11,0x23,0x11,0x21,0x20,0x16,0x15,0x14,0x06,0x07,
-0x1e,0x01,0x1f,0x01,0x16,0x17,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x2f,0x01,0x2e,
-0x01,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x15,0x2e,0x01,0x23,0x22,0x06,0x15,0x14,
-0x16,0x1f,0x01,0x1e,0x01,0x15,0x14,0x06,0x23,0x22,0x27,0x26,0x01,0x93,0xfe,0x92,
-0x95,0x95,0x92,0x02,0xbf,0x04,0xd9,0xbf,0x4a,0x8b,0x78,0xdc,0xca,0x01,0xc8,0x01,
-0x00,0xfc,0x83,0x7d,0x41,0x7b,0x3e,0x5b,0x62,0x60,0x63,0x61,0x82,0x8c,0x65,0xab,
-0x40,0xab,0x98,0xe0,0xce,0x66,0xb4,0x4c,0x4e,0xa8,0x5a,0x89,0x89,0x62,0x94,0x3f,
-0xc4,0xa5,0xf7,0xd8,0x5a,0x61,0x2c,0x05,0x2f,0xfd,0xee,0x87,0x01,0x06,0x85,0xfa,
-0xd8,0x07,0x01,0x7f,0x96,0x62,0xfd,0x89,0x05,0xd5,0xd6,0xd8,0x8d,0xba,0x24,0x16,
-0x90,0x7e,0xb4,0x33,0x19,0x1b,0x59,0x51,0x4b,0x50,0x25,0x0f,0x24,0x95,0x82,0x9e,
-0xac,0x1e,0x1e,0xae,0x28,0x28,0x54,0x54,0x40,0x49,0x21,0x0e,0x2a,0x99,0x89,0x9c,
-0xb6,0x12,0x08,0x00,0x00,0x06,0x00,0x3b,0x00,0x00,0x07,0xae,0x05,0xd5,0x00,0x1f,
-0x00,0x22,0x00,0x26,0x00,0x29,0x00,0x2d,0x00,0x31,0x00,0x00,0x13,0x27,0x23,0x35,
-0x33,0x27,0x33,0x17,0x21,0x37,0x33,0x17,0x21,0x37,0x33,0x07,0x33,0x15,0x23,0x07,
-0x33,0x15,0x23,0x03,0x23,0x03,0x23,0x03,0x23,0x03,0x23,0x35,0x05,0x1b,0x01,0x01,
-0x17,0x21,0x37,0x01,0x1b,0x02,0x07,0x33,0x27,0x21,0x17,0x21,0x37,0xb6,0x1e,0x5d,
-0x3a,0x31,0xcc,0x30,0x02,0x13,0x30,0xe3,0x30,0x02,0x13,0x30,0xcd,0x31,0x39,0x5d,
-0x1d,0x7a,0x9e,0xe1,0xfe,0xda,0xc3,0xdc,0xfe,0xe0,0x9f,0x04,0xc0,0xa5,0xa5,0xfe,
-0x75,0x1d,0x01,0x91,0x1d,0xfb,0x20,0xa5,0xa5,0xe5,0x1d,0x7d,0x1c,0xfd,0x4c,0x1d,
-0x01,0x91,0x1d,0x04,0x0f,0x75,0x8f,0xc2,0xc2,0xc2,0xc2,0xc2,0xc2,0x8f,0x75,0x8f,
-0xfc,0x80,0x03,0x80,0xfc,0x80,0x03,0x80,0x8f,0x8f,0xfd,0x67,0x02,0x99,0x01,0x04,
-0x75,0x75,0xfe,0xfc,0xfd,0x67,0x02,0x99,0x01,0x04,0x75,0x75,0x75,0x75,0x00,0x02,
-0x00,0x5f,0xff,0xe3,0x05,0xf1,0x05,0xd5,0x00,0x0d,0x00,0x1b,0x00,0x00,0x13,0x25,
-0x20,0x00,0x19,0x01,0x23,0x11,0x34,0x26,0x23,0x21,0x11,0x23,0x29,0x01,0x22,0x00,
-0x19,0x01,0x33,0x11,0x14,0x16,0x33,0x21,0x03,0x33,0x5f,0x02,0x07,0x00,0xff,0x01,
-0x06,0xb8,0x9d,0xb0,0xfe,0xb1,0xb8,0x05,0x8e,0xfd,0xfd,0xff,0xfe,0xfa,0xb8,0x9d,
-0xb0,0x01,0x53,0x04,0xb8,0x05,0xd2,0x03,0xfe,0xd6,0xfe,0xdc,0xfe,0x91,0x01,0x56,
-0xf0,0xd3,0xfa,0xb2,0x01,0x2a,0x01,0x24,0x01,0x6f,0xfe,0xaa,0xf0,0xd3,0x05,0x4e,
-0xff,0xff,0x00,0x81,0xfe,0xc0,0x05,0x04,0x06,0x14,0x12,0x22,0x00,0xd3,0x10,0x00,
-0x10,0x03,0x02,0x81,0x00,0x8a,0x00,0x00,0x00,0x01,0x00,0x00,0xff,0xe3,0x04,0x8f,
-0x05,0xf0,0x00,0x31,0x01,0x1c,0x40,0x3a,0x20,0x12,0xd3,0x22,0x10,0x2b,0x07,0xd3,
-0x09,0x19,0xa1,0x1a,0xae,0x16,0x95,0x1d,0x01,0xa1,0x00,0xae,0x04,0x95,0x2f,0x91,
-0x1d,0x8c,0x29,0x09,0x32,0x2b,0x22,0x21,0x29,0x23,0x26,0x12,0x10,0x0a,0x03,0x0d,
-0x09,0x11,0x08,0x2c,0x20,0x26,0x13,0x07,0x11,0x08,0x11,0x0d,0x1c,0x19,0x00,0x26,
-0x2a,0x21,0x2f,0x3c,0xd4,0xc4,0x32,0xfc,0xc4,0xc4,0x12,0x39,0x39,0x12,0x39,0x39,
-0x11,0x12,0x39,0x11,0x17,0x39,0x12,0x39,0x39,0x11,0x39,0x39,0x31,0x00,0x10,0xc4,
-0x32,0xe4,0xf4,0xec,0xf4,0xec,0x10,0xee,0xf6,0xee,0x10,0xee,0x32,0xdd,0x3c,0xee,
-0x32,0x30,0x01,0x4b,0xb0,0x09,0x54,0x4b,0xb0,0x0c,0x54,0x5b,0x4b,0xb0,0x0d,0x54,
-0x5b,0x4b,0xb0,0x0f,0x54,0x5b,0x4b,0xb0,0x17,0x54,0x5b,0x4b,0xb0,0x18,0x54,0x5b,
-0x58,0xbd,0x00,0x32,0xff,0xc0,0x00,0x01,0x00,0x32,0x00,0x32,0x00,0x40,0x38,0x11,
-0x37,0x38,0x59,0x40,0x7a,0x0e,0x00,0x0e,0x01,0x0b,0x02,0x0b,0x31,0x54,0x14,0x69,
-0x0c,0x6c,0x0e,0x6e,0x0f,0x6f,0x10,0x6f,0x11,0x6f,0x12,0x6f,0x13,0x69,0x14,0x6b,
-0x1f,0x6f,0x20,0x6f,0x21,0x6f,0x22,0x6f,0x23,0x6e,0x24,0x6c,0x25,0x69,0x27,0x69,
-0x2d,0x9f,0x07,0x9f,0x08,0x9f,0x09,0x9f,0x0a,0x9f,0x0b,0x9f,0x0c,0x9f,0x0d,0x9f,
-0x0e,0x9f,0x0f,0x9f,0x10,0x9f,0x11,0x9f,0x12,0x9f,0x13,0x96,0x1f,0x9f,0x20,0x9f,
-0x21,0x9f,0x22,0x9f,0x23,0x9f,0x24,0x9f,0x25,0x9f,0x26,0x9f,0x27,0x9f,0x28,0x9f,
-0x29,0x9f,0x2a,0x9f,0x2b,0x9f,0x2c,0x9d,0x2d,0x32,0x00,0x08,0x00,0x09,0x10,0x08,
-0x10,0x09,0x20,0x08,0x20,0x09,0x55,0x15,0x53,0x1e,0x6a,0x15,0x67,0x1f,0x0a,0x5d,
-0x00,0x5d,0x01,0x15,0x2e,0x01,0x23,0x22,0x06,0x07,0x21,0x07,0x21,0x0e,0x01,0x15,
-0x14,0x16,0x17,0x21,0x07,0x21,0x1e,0x01,0x33,0x32,0x36,0x37,0x15,0x0e,0x01,0x23,
-0x22,0x00,0x03,0x23,0x37,0x33,0x34,0x26,0x35,0x34,0x36,0x35,0x23,0x37,0x33,0x12,
-0x00,0x33,0x32,0x16,0x04,0x8f,0x5b,0xa9,0x66,0x9d,0xca,0x20,0x02,0x41,0x37,0xfd,
-0xe6,0x02,0x01,0x01,0x02,0x01,0xbe,0x38,0xfe,0x8a,0x20,0xca,0x9d,0x66,0xa9,0x5b,
-0x59,0xb9,0x60,0xed,0xfe,0xcb,0x28,0xd3,0x37,0x8b,0x01,0x01,0xc2,0x37,0x9c,0x28,
-0x01,0x36,0xec,0x62,0xb9,0x05,0x62,0xd5,0x69,0x5a,0xc8,0xbb,0x7b,0x18,0x2e,0x23,
-0x20,0x2e,0x18,0x7b,0xbb,0xca,0x5a,0x69,0xd3,0x48,0x48,0x01,0x22,0x01,0x03,0x7b,
-0x17,0x2f,0x20,0x23,0x2f,0x17,0x7b,0x01,0x01,0x01,0x22,0x47,0x00,0x01,0x00,0x28,
-0x00,0x00,0x05,0x16,0x05,0xd5,0x00,0x11,0x00,0x00,0x13,0x11,0x33,0x11,0x01,0x33,
-0x01,0x21,0x15,0x21,0x01,0x23,0x01,0x11,0x23,0x11,0x23,0x35,0xbf,0xbd,0x02,0x75,
-0xf3,0xfd,0x80,0x01,0xaa,0xfe,0x58,0x02,0xb0,0xf9,0xfd,0x5f,0xbd,0x97,0x03,0x54,
-0x02,0x81,0xfd,0x89,0x02,0x77,0xfd,0x7f,0x73,0xfd,0x1f,0x02,0xcf,0xfd,0x31,0x02,
-0xe1,0x73,0x00,0x01,0x00,0x14,0x00,0x00,0x05,0x03,0x05,0xd5,0x00,0x17,0x00,0x00,
-0x01,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x37,0x17,0x05,0x15,0x37,0x17,0x05,0x11,
-0x23,0x11,0x07,0x27,0x25,0x35,0x07,0x27,0x02,0x26,0xfd,0xee,0x04,0xef,0xfd,0xee,
-0xe5,0x50,0xfe,0xcb,0xe6,0x50,0xfe,0xca,0xcb,0xe7,0x4d,0x01,0x34,0xe8,0x4d,0x03,
-0x8d,0x01,0x9e,0xaa,0xaa,0xfe,0xf1,0xa1,0x6f,0xd8,0x88,0xa2,0x6f,0xd9,0xfd,0xb8,
-0x01,0xba,0xa1,0x6e,0xd9,0x88,0xa2,0x6e,0x00,0x04,0x00,0x1b,0xfe,0x75,0x08,0x5a,
-0x05,0xc8,0x00,0x17,0x00,0x23,0x00,0x30,0x00,0x3b,0x00,0x00,0x33,0x37,0x33,0x36,
-0x37,0x13,0x22,0x06,0x1d,0x01,0x07,0x10,0x37,0x36,0x21,0x33,0x32,0x00,0x15,0x10,
-0x03,0x06,0x04,0x21,0x37,0x33,0x20,0x00,0x11,0x34,0x26,0x2b,0x01,0x03,0x02,0x06,
-0x01,0x13,0x1a,0x01,0x33,0x20,0x11,0x10,0x00,0x23,0x22,0x27,0x03,0x13,0x16,0x33,
-0x32,0x12,0x35,0x34,0x23,0x22,0x03,0x07,0x1c,0x94,0x38,0x74,0x2a,0xac,0x82,0x96,
-0xc2,0xa0,0xa0,0x01,0x8a,0x40,0xe2,0x01,0x04,0xee,0x7c,0xfe,0xac,0xfe,0xd4,0x30,
-0x76,0x01,0x18,0x01,0x44,0x96,0x80,0x50,0x86,0x34,0x4a,0x02,0x8c,0xa0,0x4a,0xe6,
-0xc0,0x01,0x48,0xfe,0xb2,0xe0,0x34,0x5c,0x56,0x7c,0x4a,0x4a,0x84,0xb0,0x96,0x9c,
-0x44,0x1a,0xa0,0x52,0xd3,0x03,0x5f,0xa6,0x91,0x18,0x5e,0x01,0x11,0x9f,0xa1,0xfe,
-0xea,0xf1,0xfe,0x77,0xfe,0xda,0x98,0x7a,0xa0,0x01,0xa8,0x01,0x6e,0xae,0xd0,0xfd,
-0x58,0xfe,0xff,0xa1,0xfd,0x8b,0x03,0x2c,0x01,0x73,0x01,0x42,0xfe,0xa5,0xfe,0xce,
-0xfe,0x37,0x23,0xfe,0x52,0x02,0x6d,0x4e,0x01,0x43,0xf6,0xf5,0xfe,0xb9,0x82,0x00,
-0x00,0x04,0x00,0x44,0x00,0x00,0x04,0xa2,0x05,0xd5,0x00,0x1d,0x00,0x24,0x00,0x2b,
-0x00,0x31,0x00,0x00,0x13,0x35,0x23,0x35,0x33,0x11,0x21,0x32,0x17,0x16,0x17,0x33,
-0x15,0x23,0x16,0x14,0x07,0x33,0x15,0x23,0x06,0x07,0x06,0x2b,0x01,0x11,0x23,0x11,
-0x23,0x35,0x05,0x21,0x15,0x33,0x32,0x37,0x36,0x01,0x21,0x26,0x27,0x26,0x2b,0x01,
-0x05,0x21,0x15,0x21,0x36,0x34,0x97,0x52,0x52,0x01,0xc8,0xfb,0x81,0x4c,0x1f,0x5c,
-0x48,0x01,0x01,0x47,0x5a,0x1f,0x4d,0x81,0xfb,0xfe,0xca,0x53,0x03,0x1c,0xfe,0x01,
-0xfe,0x8d,0x4d,0x17,0xfe,0x11,0x01,0xff,0x10,0x17,0x4d,0x8d,0xfe,0x02,0x23,0xfd,
-0xdd,0x02,0x23,0x02,0x03,0xec,0x56,0x74,0x01,0x1f,0x71,0x44,0x6a,0x74,0x15,0x2c,
-0x15,0x74,0x6b,0x44,0x71,0xfd,0xa8,0x03,0x78,0x74,0x74,0x7a,0x49,0x16,0x01,0x59,
-0x1b,0x15,0x49,0xed,0x56,0x15,0x2c,0x00,0x00,0x01,0x00,0x75,0xff,0xe3,0x05,0xbc,
-0x05,0xf0,0x00,0x36,0x00,0x00,0x01,0x36,0x37,0x36,0x37,0x21,0x35,0x21,0x36,0x37,
-0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x35,0x3e,0x01,0x33,0x32,0x04,0x15,0x14,
-0x07,0x33,0x15,0x21,0x06,0x0f,0x01,0x21,0x15,0x21,0x06,0x15,0x14,0x16,0x33,0x32,
-0x36,0x37,0x15,0x0e,0x01,0x23,0x20,0x24,0x35,0x34,0x37,0x23,0x35,0x01,0x5c,0x04,
-0x16,0x4a,0x80,0xfe,0x35,0x03,0x92,0x0c,0x0d,0x3b,0xb3,0xa5,0x5f,0xcc,0x73,0x72,
-0xda,0x69,0xf5,0x01,0x17,0x19,0xaf,0xfe,0xfd,0x67,0xd8,0x43,0x02,0x85,0xfc,0x53,
-0x31,0xbc,0xad,0x72,0xec,0x7b,0x80,0xef,0x6a,0xfe,0xe7,0xfe,0xdd,0x12,0xa8,0x02,
-0xa1,0x07,0x16,0x4a,0x2c,0x7b,0x08,0x09,0x2b,0x6b,0x76,0x80,0x36,0x37,0xc5,0x26,
-0x26,0xe4,0xc6,0x55,0x42,0x7b,0x5c,0x2a,0x0d,0x7b,0x3b,0x5e,0x7e,0x88,0x46,0x45,
-0xd0,0x2f,0x30,0xe0,0xd9,0x4b,0x3f,0x7b,0x00,0x02,0x00,0xaa,0xfe,0xd3,0x04,0x77,
-0x06,0x14,0x00,0x21,0x00,0x2c,0x00,0x00,0x01,0x15,0x26,0x27,0x26,0x23,0x11,0x32,
-0x37,0x36,0x37,0x15,0x06,0x07,0x06,0x07,0x11,0x23,0x11,0x26,0x27,0x26,0x11,0x35,
-0x10,0x37,0x36,0x37,0x35,0x37,0x15,0x16,0x17,0x16,0x01,0x03,0x06,0x07,0x06,0x07,
-0x06,0x17,0x16,0x17,0x16,0x04,0x77,0x5b,0x54,0x55,0x65,0x65,0x55,0x54,0x5b,0x59,
-0x5c,0x59,0x5b,0x64,0xb9,0x73,0xd4,0xd4,0x79,0xb2,0x65,0x5d,0x59,0x5c,0xfe,0x8a,
-0x01,0x5b,0x43,0x76,0x0f,0x0e,0x0e,0x19,0x6c,0x43,0x04,0xa4,0xd5,0x69,0x2d,0x2d,
-0xfb,0xf1,0x2d,0x2d,0x69,0xd3,0x48,0x24,0x22,0x02,0xfe,0xf0,0x01,0x15,0x17,0x75,
-0xd6,0x01,0x39,0x11,0x01,0x42,0xcb,0x74,0x17,0xe6,0x02,0xe2,0x02,0x22,0x23,0xfb,
-0xa3,0x03,0xf9,0x17,0x42,0x75,0xaa,0xa1,0x66,0xb4,0x6c,0x43,0x00,0x04,0x00,0x43,
-0xff,0xcf,0x07,0xd8,0x06,0x04,0x00,0x0a,0x00,0x24,0x00,0x28,0x00,0x42,0x00,0x00,
-0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x3d,0x01,0x37,0x11,0x23,0x35,0x0e,
-0x01,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x17,0x34,0x26,0x23,0x22,0x06,0x07,0x35,
-0x3e,0x01,0x33,0x32,0x16,0x25,0x33,0x01,0x23,0x01,0x15,0x2e,0x01,0x23,0x22,0x06,
-0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x15,0x0e,0x01,0x23,0x22,0x26,0x35,0x34,0x36,
-0x33,0x32,0x16,0x02,0x0f,0xa0,0x70,0x53,0x48,0x66,0x7f,0xbc,0xbc,0x03,0x99,0x6d,
-0x8d,0xa6,0xcd,0xc6,0xa9,0x6f,0x67,0x44,0x81,0x63,0x5c,0x94,0x47,0xc2,0xc1,0x02,
-0xb0,0xd8,0xfc,0x44,0xd8,0x05,0xa9,0x5e,0x6f,0x38,0x79,0x89,0x89,0x79,0x38,0x6f,
-0x5e,0x49,0x82,0x49,0xca,0xec,0xee,0xd1,0x43,0x80,0x03,0xf6,0x42,0x52,0x43,0x49,
-0x94,0x82,0x0a,0x4d,0xfe,0x0d,0x3e,0x05,0x4f,0x9e,0x81,0x96,0x9b,0x06,0x57,0x5c,
-0x20,0x37,0xb2,0x24,0x1e,0xca,0xfa,0xf9,0xcb,0x03,0x84,0xb2,0x34,0x1e,0x9c,0x94,
-0x93,0x9d,0x1f,0x34,0xb1,0x22,0x1b,0xfa,0xd1,0xd4,0xf9,0x1b,0xff,0xff,0x00,0xc3,
-0xff,0xf0,0x08,0x8c,0x05,0xf0,0x10,0x26,0x00,0x72,0x00,0x00,0x10,0x47,0x00,0x26,
-0x03,0x46,0x00,0x0c,0x41,0x75,0x3e,0x52,0x00,0x02,0xff,0xd6,0x00,0x00,0x05,0x18,
-0x05,0xd5,0x00,0x08,0x00,0x2b,0x00,0x99,0xb8,0x00,0x2c,0x2f,0xb8,0x00,0x2d,0x2f,
-0xb8,0x00,0x15,0xdc,0xb8,0x00,0x00,0xdc,0xb8,0x00,0x2c,0x10,0xb8,0x00,0x28,0xd0,
-0xb8,0x00,0x28,0x2f,0xb8,0x00,0x04,0xdc,0x41,0x1b,0x00,0x16,0x00,0x04,0x00,0x26,
-0x00,0x04,0x00,0x36,0x00,0x04,0x00,0x46,0x00,0x04,0x00,0x56,0x00,0x04,0x00,0x66,
-0x00,0x04,0x00,0x76,0x00,0x04,0x00,0x86,0x00,0x04,0x00,0x96,0x00,0x04,0x00,0xa6,
-0x00,0x04,0x00,0xb6,0x00,0x04,0x00,0xc6,0x00,0x04,0x00,0xd6,0x00,0x04,0x00,0x0d,
-0x5d,0x41,0x05,0x00,0xe5,0x00,0x04,0x00,0xf5,0x00,0x04,0x00,0x02,0x5d,0xb8,0x00,
-0x00,0x10,0xb8,0x00,0x09,0xd0,0xb8,0x00,0x15,0x10,0xb8,0x00,0x0b,0xd0,0xb8,0x00,
-0x15,0x10,0xb8,0x00,0x1f,0xd0,0xb8,0x00,0x00,0x10,0xb8,0x00,0x23,0xd0,0x00,0xb8,
-0x00,0x0a,0x2f,0xba,0x00,0x21,0x00,0x22,0x00,0x03,0x2b,0xb8,0x00,0x21,0x10,0x30,
-0x31,0x01,0x06,0x07,0x06,0x15,0x14,0x17,0x16,0x17,0x11,0x35,0x33,0x15,0x16,0x17,
-0x16,0x17,0x15,0x26,0x27,0x26,0x27,0x11,0x36,0x37,0x36,0x37,0x15,0x06,0x07,0x06,
-0x07,0x15,0x21,0x15,0x21,0x35,0x26,0x27,0x26,0x11,0x10,0x37,0x36,0x01,0x77,0x49,
-0x33,0x63,0x63,0x33,0x49,0xca,0x38,0x36,0x51,0x4c,0x4e,0x4e,0x37,0x38,0x38,0x37,
-0x4e,0x4e,0x4d,0x52,0x34,0x38,0x02,0xd7,0xfc,0x5f,0xa1,0x6b,0x95,0x97,0x69,0x04,
-0xb3,0x1d,0x3a,0x72,0xcd,0xcd,0x71,0x3b,0x1d,0x03,0xd4,0x7a,0x6e,0x04,0x0b,0x12,
-0x23,0xac,0x2b,0x16,0x0f,0x04,0xfc,0xa4,0x04,0x10,0x15,0x2b,0xaa,0x24,0x12,0x0b,
-0x04,0x2a,0xaa,0xde,0x20,0x72,0x9f,0x01,0x0e,0x01,0x12,0x9d,0x6e,0x00,0x00,0x04,
-0x00,0x3c,0xff,0xcf,0x07,0xe5,0x06,0x04,0x00,0x19,0x00,0x1d,0x00,0x28,0x00,0x32,
-0x00,0x00,0x01,0x15,0x2e,0x01,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,
-0x15,0x0e,0x01,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x25,0x33,0x01,0x23,
-0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x10,0x26,0x24,0x20,0x16,0x15,0x14,
-0x06,0x20,0x26,0x35,0x34,0x03,0x06,0x5e,0x6f,0x38,0x79,0x89,0x89,0x79,0x38,0x6f,
-0x5e,0x49,0x82,0x49,0xca,0xec,0xee,0xd1,0x43,0x80,0x02,0xdd,0xd8,0xfc,0x44,0xd8,
-0x04,0x6b,0x61,0x76,0x76,0x61,0x60,0x77,0x77,0xfe,0xdf,0x01,0x82,0xda,0xda,0xfe,
-0x7e,0xd9,0x05,0x97,0xb2,0x34,0x1e,0x9c,0x94,0x93,0x9d,0x1f,0x34,0xb1,0x22,0x1d,
-0xfc,0xd1,0xd4,0xf9,0x1b,0x4b,0xf9,0xcb,0x03,0x04,0x9e,0x92,0x91,0x9f,0xa0,0x01,
-0x20,0xa0,0x9d,0xf8,0xd5,0xd4,0xf8,0xf8,0xd4,0xd5,0x00,0x03,0x00,0x3c,0xff,0xcf,
-0x08,0x4d,0x06,0x04,0x00,0x13,0x00,0x2d,0x00,0x31,0x00,0x00,0x01,0x11,0x33,0x11,
-0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x23,0x35,0x0e,0x01,0x23,0x22,0x26,
-0x01,0x15,0x2e,0x01,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x15,0x0e,
-0x01,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x25,0x33,0x01,0x23,0x05,0x5c,
-0xbc,0x51,0x50,0x63,0x75,0xbc,0xbc,0x06,0x90,0x60,0x9e,0xa1,0xfd,0xaa,0x5e,0x6f,
-0x38,0x79,0x89,0x89,0x79,0x38,0x6f,0x5e,0x49,0x82,0x49,0xca,0xec,0xee,0xd1,0x43,
-0x80,0x02,0xdd,0xd8,0xfc,0x44,0xd8,0x01,0x4c,0x02,0x10,0xfd,0xf5,0x72,0x69,0x81,
-0x75,0x01,0xf0,0xfc,0x90,0x44,0x09,0x50,0xc1,0x04,0xff,0xb2,0x34,0x1e,0x9c,0x94,
-0x93,0x9d,0x1f,0x34,0xb1,0x22,0x1d,0xfc,0xd1,0xd4,0xf9,0x1b,0x4b,0xf9,0xcb,0x00,
-0xff,0xff,0x00,0xc3,0x00,0x00,0x07,0x26,0x05,0xf0,0x10,0x22,0x00,0x72,0x00,0x00,
-0x10,0x03,0x00,0x29,0x03,0x03,0x00,0x00,0x00,0x01,0x00,0x48,0x00,0x00,0x04,0x87,
-0x06,0x14,0x00,0x19,0x00,0x00,0x01,0x03,0x23,0x13,0x3e,0x01,0x35,0x34,0x26,0x23,
-0x22,0x06,0x07,0x03,0x23,0x01,0x33,0x03,0x3e,0x01,0x33,0x32,0x16,0x15,0x14,0x06,
-0x04,0x75,0x83,0xb9,0x83,0x09,0x0a,0x6a,0x5f,0x94,0xd9,0x20,0x79,0xb8,0x01,0x2f,
-0xb8,0x77,0x46,0xda,0x78,0x94,0xa3,0x09,0x02,0xa4,0xfd,0x5c,0x02,0x9d,0x2f,0x48,
-0x15,0x54,0x5e,0xc8,0xa6,0xfd,0x93,0x06,0x14,0xfd,0x9c,0x5e,0x6d,0xa0,0x91,0x24,
-0x52,0x00,0x00,0x01,0x00,0x22,0x00,0x00,0x04,0x62,0x06,0x14,0x00,0x1d,0x00,0x00,
-0x01,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x07,0x03,0x23,0x13,0x36,0x26,0x23,0x22,
-0x06,0x07,0x03,0x23,0x13,0x23,0x37,0x33,0x37,0x33,0x07,0x21,0x07,0x21,0x01,0x94,
-0x55,0x63,0x64,0x75,0xc1,0x4c,0x4b,0x2d,0x83,0xb8,0x82,0x1f,0x5d,0x7c,0x95,0xd1,
-0x20,0x7b,0xb9,0xf9,0x9a,0x19,0x9a,0x1c,0xb9,0x1c,0x02,0x40,0x19,0xfd,0xc0,0x03,
-0xb2,0x65,0x32,0x32,0x77,0x78,0xe8,0xfd,0x5c,0x02,0x9e,0x9f,0x9e,0xbe,0xa4,0xfd,
-0x87,0x05,0x04,0x7d,0x93,0x93,0x7d,0x00,0x00,0x02,0x00,0x6a,0xff,0xe3,0x05,0x46,
-0x05,0xf0,0x00,0x21,0x00,0x32,0x00,0x00,0x3f,0x01,0x36,0x33,0x32,0x17,0x16,0x33,
-0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x35,0x34,0x3f,0x01,0x06,0x15,0x14,0x17,0x16,
-0x15,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x13,0x36,0x33,0x32,0x17,0x16,
-0x33,0x32,0x37,0x07,0x06,0x23,0x22,0x26,0x23,0x22,0x07,0x6a,0x8c,0x6f,0x75,0x39,
-0x84,0x90,0x21,0x79,0x64,0x47,0x3e,0x50,0x50,0xd5,0x50,0x50,0x35,0xca,0xba,0xf2,
-0x36,0x81,0x85,0x38,0x5e,0x6e,0x6d,0x8d,0x7b,0x7f,0x7a,0x80,0x7d,0x7d,0xc8,0x8b,
-0x6f,0x8f,0xd6,0x8f,0x7a,0x80,0x5a,0xa5,0x27,0x50,0x56,0x89,0x61,0x4b,0x7e,0x70,
-0x92,0x6d,0x64,0xa0,0x8c,0x8b,0x79,0x6b,0x94,0x62,0xbc,0x5e,0xf2,0xde,0x4f,0x50,
-0x05,0x36,0x38,0x31,0x2f,0x3a,0xaa,0x3a,0x62,0x3a,0x00,0x02,0xff,0xe4,0xff,0xe3,
-0x02,0xd2,0x05,0xf0,0x00,0x1c,0x00,0x26,0x00,0x00,0x01,0x16,0x33,0x32,0x37,0x33,
-0x06,0x07,0x06,0x23,0x22,0x27,0x07,0x23,0x36,0x37,0x26,0x35,0x34,0x37,0x12,0x37,
-0x36,0x33,0x32,0x15,0x06,0x07,0x02,0x01,0x12,0x13,0x36,0x35,0x34,0x23,0x06,0x03,
-0x06,0x01,0x30,0x29,0x57,0x3a,0x4b,0x85,0x3c,0x46,0x4c,0x46,0x9c,0x3f,0x4b,0x9c,
-0x6c,0x50,0x0a,0x1f,0x75,0x68,0x48,0x7b,0x7d,0x01,0x12,0x48,0xfe,0xb8,0xbb,0x39,
-0x1e,0x19,0x6d,0x61,0x1b,0x01,0x0c,0xc8,0x73,0x66,0x35,0x39,0x8b,0x6e,0x93,0x89,
-0x4e,0x55,0x98,0x98,0x02,0x3b,0x75,0x51,0xad,0x4e,0x5d,0xfe,0x83,0xfe,0xf7,0x01,
-0x5c,0x01,0x16,0x93,0x26,0x45,0x57,0xfd,0xfa,0x91,0xff,0xff,0x00,0xc9,0x00,0x00,
-0x08,0xf0,0x05,0xf0,0x10,0x27,0x00,0x7c,0x05,0x8c,0x00,0x00,0x10,0x06,0x00,0x31,
-0x00,0x00,0x00,0x04,0x01,0x1b,0x00,0x00,0x06,0xe5,0x05,0xca,0x00,0x0c,0x00,0x19,
-0x00,0x22,0x00,0x2d,0x00,0x00,0x01,0x16,0x11,0x10,0x00,0x21,0x20,0x00,0x03,0x10,
-0x00,0x21,0x20,0x06,0x21,0x20,0x00,0x11,0x12,0x00,0x21,0x20,0x00,0x11,0x10,0x27,
-0x05,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x25,0x21,0x32,0x16,0x15,0x14,0x06,
-0x2b,0x01,0x11,0x23,0x06,0x0b,0xda,0xfe,0x4a,0xfe,0xd1,0xfe,0xcf,0xfe,0x52,0x06,
-0x01,0xb4,0x01,0x31,0x01,0x32,0x29,0xfe,0xf7,0xfe,0xfa,0xfe,0x86,0x05,0x01,0x75,
-0x01,0x06,0x01,0x07,0x01,0x79,0xbb,0xfd,0xd3,0xb2,0x63,0x6b,0x6b,0x63,0xfe,0xc1,
-0x01,0x3f,0xb0,0xb4,0xb4,0xb0,0xb2,0x8d,0x04,0xf1,0xdb,0xfe,0xce,0xfe,0xd0,0xfe,
-0x4c,0x01,0xb4,0x01,0x30,0x01,0x30,0x01,0xb6,0x65,0xfe,0x85,0xfe,0xf9,0xfe,0xfb,
-0xfe,0x87,0x01,0x79,0x01,0x05,0x01,0x09,0xbb,0x77,0xfe,0xaf,0x58,0x51,0x50,0x58,
-0x64,0x89,0x83,0x85,0x87,0xfe,0x98,0x00,0x00,0x02,0x00,0x6e,0xfe,0x3b,0x05,0x43,
-0x03,0xf6,0x00,0x30,0x00,0x3c,0x00,0x00,0x01,0x06,0x15,0x14,0x17,0x36,0x37,0x36,
-0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x23,0x22,0x27,0x36,0x37,0x16,0x33,0x32,
-0x37,0x36,0x35,0x34,0x27,0x26,0x23,0x22,0x01,0x12,0x15,0x14,0x07,0x06,0x23,0x22,
-0x27,0x26,0x35,0x10,0x37,0x26,0x35,0x34,0x37,0x03,0x06,0x15,0x14,0x17,0x16,0x17,
-0x32,0x37,0x36,0x35,0x34,0x02,0x35,0x88,0x1f,0x5b,0xab,0xdb,0x84,0x83,0x46,0x49,
-0x9c,0x79,0xae,0x65,0x4c,0x12,0x09,0x29,0x71,0x7a,0x5d,0x45,0x26,0x20,0x4a,0xbd,
-0xfe,0x9f,0x87,0x45,0x59,0x83,0x71,0x3a,0x3f,0xdf,0x2e,0xe8,0x94,0x81,0x1f,0x30,
-0x2e,0x41,0x1c,0x20,0x03,0xc6,0x82,0xbe,0x4d,0x6b,0x65,0x94,0xbd,0x4c,0x50,0xab,
-0xda,0xd7,0xa7,0x3c,0x2b,0x1d,0x28,0x8c,0x68,0xc3,0x7c,0x48,0x3d,0xfe,0x79,0xfe,
-0xde,0x7c,0x9d,0x6e,0x8e,0x3d,0x42,0x86,0x01,0x0b,0xfc,0x9e,0x7f,0xee,0xa4,0xfc,
-0xef,0xc6,0x7b,0x75,0x2e,0x46,0x01,0x2f,0x34,0x5f,0x4e,0x00,0x00,0x02,0x00,0x53,
-0xff,0xe3,0x06,0x6c,0x05,0xf1,0x00,0x49,0x00,0x58,0x00,0x00,0x05,0x26,0x35,0x34,
-0x27,0x26,0x23,0x22,0x0f,0x01,0x15,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x16,
-0x17,0x14,0x17,0x16,0x32,0x37,0x36,0x35,0x11,0x34,0x27,0x26,0x23,0x22,0x07,0x06,
-0x14,0x17,0x16,0x33,0x17,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x16,
-0x17,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x32,0x17,0x16,0x17,
-0x16,0x15,0x14,0x17,0x37,0x17,0x01,0x16,0x15,0x11,0x37,0x36,0x37,0x36,0x35,0x34,
-0x27,0x26,0x23,0x22,0x07,0x05,0x02,0x52,0x16,0x28,0x4f,0x2a,0x5c,0x78,0x67,0x67,
-0x8c,0x8d,0x66,0x67,0x2d,0x2e,0x40,0x40,0x90,0x3f,0x40,0x40,0x3f,0x5c,0x51,0x41,
-0x40,0x40,0x40,0x53,0x36,0x97,0x66,0x67,0x67,0x66,0x97,0xa2,0x65,0x1e,0x10,0xd3,
-0xbb,0x70,0x2f,0x24,0x7e,0x41,0x42,0x7d,0x3a,0x31,0x24,0x1b,0x20,0x2d,0x90,0x2a,
-0xfc,0xa4,0x15,0x9a,0x90,0x4d,0x4a,0x4a,0x18,0x1f,0x40,0x66,0x1d,0xb7,0x9f,0x8c,
-0x5b,0xa6,0x2b,0x38,0xc7,0xce,0x76,0x75,0x75,0x76,0xb0,0x0c,0x0c,0x7a,0x56,0x57,
-0x57,0x57,0x96,0x02,0x9b,0x95,0x58,0x57,0x57,0x56,0xca,0x56,0x57,0x5c,0x75,0x76,
-0x9c,0x9d,0x75,0x75,0x75,0x23,0x20,0x62,0x57,0x0e,0x31,0xb1,0x57,0x7b,0x7c,0x5e,
-0x31,0x24,0x68,0x7b,0x83,0x80,0x76,0x43,0x5b,0x04,0x53,0x4b,0x5c,0xfe,0x95,0x47,
-0x43,0x68,0x66,0x79,0x97,0x20,0x0a,0x2f,0x00,0x05,0x00,0x76,0x00,0x00,0x05,0xe1,
-0x05,0xd5,0x00,0x07,0x00,0x1b,0x00,0x1f,0x00,0x27,0x00,0x30,0x00,0x00,0x01,0x16,
-0x17,0x13,0x33,0x03,0x26,0x27,0x20,0x2b,0x01,0x11,0x21,0x11,0x21,0x20,0x16,0x15,
-0x14,0x06,0x07,0x1e,0x01,0x17,0x13,0x21,0x03,0x26,0x01,0x11,0x33,0x11,0x01,0x11,
-0x26,0x23,0x21,0x11,0x21,0x32,0x37,0x36,0x37,0x36,0x35,0x34,0x27,0x26,0x27,0x03,
-0x2e,0x4e,0x66,0x8e,0xc8,0x8e,0x60,0x5a,0xfe,0xa4,0x78,0x14,0xfe,0x6e,0x02,0xa8,
-0x01,0x00,0xfc,0x84,0x7c,0x40,0x7c,0x3e,0xcc,0xfe,0x48,0xbe,0x4a,0xfd,0xba,0xc6,
-0x01,0xee,0x22,0x26,0xfe,0xc2,0x01,0x3e,0x26,0x8a,0x3a,0x28,0x5e,0x5e,0x26,0x3c,
-0x02,0x77,0x2f,0xc9,0xfe,0xe5,0x01,0x1b,0xc0,0x38,0xfd,0x89,0x05,0xd5,0xd6,0xd8,
-0x8d,0xba,0x24,0x16,0x90,0x7e,0xfe,0x68,0x01,0x7f,0x96,0x03,0x5c,0xfa,0xf3,0x05,
-0x0d,0xfd,0x6e,0x02,0x8e,0x04,0xfd,0x6a,0x1b,0x15,0x25,0x54,0xa4,0x9e,0x58,0x24,
-0x14,0x00,0x00,0x02,0x00,0xa9,0x00,0x00,0x06,0x83,0x05,0xd5,0x00,0x08,0x00,0x1f,
-0x00,0xa7,0xb8,0x00,0x20,0x2f,0xb8,0x00,0x21,0x2f,0xb8,0x00,0x20,0x10,0xb8,0x00,
-0x0e,0xd0,0xb8,0x00,0x0e,0x2f,0xb8,0x00,0x0d,0xdc,0xb8,0x00,0x00,0xd0,0xb8,0x00,
-0x21,0x10,0xb8,0x00,0x13,0xdc,0xb8,0x00,0x05,0xdc,0x41,0x05,0x00,0xea,0x00,0x05,
-0x00,0xfa,0x00,0x05,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,0x05,0x00,0x29,0x00,
-0x05,0x00,0x39,0x00,0x05,0x00,0x49,0x00,0x05,0x00,0x59,0x00,0x05,0x00,0x69,0x00,
-0x05,0x00,0x79,0x00,0x05,0x00,0x89,0x00,0x05,0x00,0x99,0x00,0x05,0x00,0xa9,0x00,
-0x05,0x00,0xb9,0x00,0x05,0x00,0xc9,0x00,0x05,0x00,0xd9,0x00,0x05,0x00,0x0d,0x5d,
-0xb8,0x00,0x09,0xd0,0xb8,0x00,0x09,0x2f,0xba,0x00,0x1e,0x00,0x0e,0x00,0x13,0x11,
-0x12,0x39,0x00,0xb8,0x00,0x0d,0x2f,0xb8,0x00,0x1a,0x2f,0xb8,0x00,0x1d,0x2f,0xba,
-0x00,0x0f,0x00,0x00,0x00,0x03,0x2b,0xb8,0x00,0x0f,0x10,0xba,0x00,0x02,0x00,0x0b,
-0x00,0x03,0x2b,0xb8,0x00,0x02,0x10,0x30,0x31,0x01,0x11,0x33,0x32,0x36,0x35,0x34,
-0x26,0x23,0x01,0x06,0x2b,0x01,0x11,0x23,0x11,0x21,0x32,0x04,0x15,0x14,0x07,0x17,
-0x37,0x33,0x09,0x01,0x23,0x0b,0x01,0x23,0x01,0x01,0x73,0xfe,0x8d,0x9a,0x9a,0x8d,
-0x01,0x20,0x73,0xad,0xfe,0xca,0x01,0xc8,0xfb,0x01,0x01,0x4e,0xae,0xbe,0xe8,0xfe,
-0xcd,0x01,0x43,0xe9,0xcf,0xd4,0xe8,0x01,0x49,0x05,0x2f,0xfd,0xcf,0x92,0x87,0x86,
-0x92,0xfd,0x5f,0x36,0xfd,0xa8,0x05,0xd5,0xe3,0xdb,0xac,0x6b,0xdb,0xea,0xfe,0x86,
-0xfe,0x6b,0x01,0x04,0xfe,0xfc,0x01,0x95,0x00,0x02,0x01,0x03,0x03,0x8b,0x06,0x28,
-0x05,0xd8,0x00,0x27,0x00,0x34,0x00,0x00,0x01,0x15,0x2e,0x01,0x23,0x22,0x06,0x15,
-0x14,0x16,0x1f,0x01,0x1e,0x01,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x35,0x1e,0x01,
-0x33,0x32,0x36,0x35,0x34,0x26,0x2f,0x01,0x2e,0x01,0x35,0x34,0x36,0x33,0x32,0x16,
-0x37,0x33,0x1b,0x01,0x33,0x11,0x23,0x11,0x03,0x23,0x03,0x11,0x23,0x02,0xe6,0x55,
-0x57,0x27,0x41,0x47,0x2f,0x45,0x38,0x70,0x69,0x90,0x8c,0x34,0x73,0x47,0x5b,0x64,
-0x2f,0x45,0x4b,0x37,0x3f,0x38,0x70,0x63,0x8a,0x7c,0x33,0x69,0xd0,0xb8,0xa1,0xa2,
-0xb8,0x8a,0x8c,0x87,0x8d,0x89,0x05,0xb7,0x59,0x22,0x13,0x2a,0x2f,0x28,0x20,0x0b,
-0x09,0x12,0x56,0x41,0x4f,0x5b,0x13,0x15,0x60,0x2a,0x18,0x2c,0x32,0x2c,0x2a,0x0a,
-0x09,0x12,0x4d,0x3d,0x48,0x5c,0x0f,0x05,0xfe,0xac,0x01,0x54,0xfd,0xc8,0x01,0x94,
-0xfe,0xd8,0x01,0x28,0xfe,0x6c,0x00,0x03,0xff,0xfc,0x00,0x00,0x08,0x30,0x04,0x60,
-0x00,0x07,0x00,0x13,0x00,0x19,0x00,0x00,0x03,0x21,0x15,0x21,0x11,0x23,0x11,0x21,
-0x05,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x01,0x33,0x11,0x21,
-0x15,0x21,0x04,0x03,0xb3,0xfe,0x72,0x98,0xfe,0x73,0x02,0xe0,0x02,0x6f,0xfe,0x16,
-0x01,0xd5,0xfe,0x2b,0x01,0xf6,0xfd,0x85,0x02,0xef,0x85,0x01,0xe0,0xfd,0x9b,0x04,
-0x60,0x80,0xfc,0x20,0x03,0xe0,0x60,0x66,0xfe,0xf7,0x66,0xfe,0xbb,0x66,0x03,0x80,
-0xfc,0xe6,0x66,0x00,0x00,0x02,0x01,0x27,0x03,0x93,0x06,0x46,0x05,0xd5,0x00,0x0c,
-0x00,0x14,0x00,0x3e,0x40,0x21,0x01,0x06,0x07,0x10,0x0a,0x04,0x12,0x0e,0x09,0x03,
-0x06,0xc9,0x0d,0x02,0x00,0x81,0x15,0x01,0x09,0x05,0x62,0x03,0x09,0x62,0x0b,0x0d,
-0x63,0x0f,0x62,0x13,0x63,0x11,0x15,0x10,0xd4,0xe4,0xfc,0xe4,0xd4,0xec,0xd4,0xec,
-0x11,0x39,0x31,0x00,0x10,0xf4,0x3c,0x3c,0xec,0x17,0x32,0xd4,0x3c,0x3c,0xc4,0x11,
-0x39,0x30,0x01,0x1b,0x01,0x33,0x11,0x23,0x11,0x03,0x23,0x03,0x11,0x23,0x11,0x23,
-0x15,0x23,0x11,0x23,0x11,0x23,0x35,0x04,0x4a,0xae,0xa4,0xaa,0x71,0xc3,0x37,0xcb,
-0x72,0x71,0xcb,0x72,0xc9,0x05,0xd5,0xff,0x00,0x01,0x00,0xfd,0xbe,0x01,0xe4,0xfe,
-0xd1,0x01,0x2f,0xfe,0x1c,0x02,0x42,0x5e,0xfe,0x1c,0x01,0xe4,0x5e,0x00,0xff,0xff,
-0x00,0x4e,0x00,0x00,0x05,0xcf,0x05,0xe7,0x10,0x06,0x03,0x22,0x00,0x00,0x00,0x01,
-0x00,0x4e,0xff,0xe3,0x05,0xcf,0x05,0xca,0x00,0x1e,0x00,0x00,0x01,0x35,0x21,0x15,
-0x16,0x12,0x15,0x14,0x00,0x20,0x00,0x35,0x34,0x12,0x37,0x35,0x21,0x15,0x21,0x06,
-0x02,0x15,0x10,0x00,0x21,0x20,0x00,0x11,0x34,0x02,0x27,0x05,0xcf,0xfd,0xa8,0xb1,
-0xc6,0xfe,0xf8,0xfe,0x50,0xfe,0xf7,0xc7,0xb2,0xfd,0xa8,0x01,0x3f,0x9e,0x91,0x01,
-0x7f,0x01,0x31,0x01,0x2f,0x01,0x81,0x8e,0xa1,0x05,0x18,0xb2,0xb2,0x61,0xfe,0xb4,
-0xca,0xf0,0xfe,0xde,0x01,0x23,0xef,0xca,0x01,0x4c,0x61,0xb2,0xb2,0x8b,0xfe,0xd6,
-0xb8,0xfe,0xc2,0xfe,0x76,0x01,0x89,0x01,0x35,0xc2,0x01,0x28,0x8d,0x00,0xff,0xff,
-0x00,0xc9,0x00,0x00,0x05,0x6a,0x05,0xd5,0x10,0x06,0x00,0x2e,0x00,0x00,0xff,0xff,
-0x00,0x10,0x00,0x00,0x05,0x68,0x07,0x6d,0x10,0x06,0x00,0x87,0x00,0x00,0x00,0x02,
-0x00,0x7d,0xff,0xe7,0x06,0x59,0x05,0x2d,0x00,0x1a,0x00,0x29,0x00,0x00,0x25,0x16,
-0x17,0x16,0x20,0x37,0x36,0x37,0x33,0x06,0x07,0x06,0x20,0x24,0x02,0x35,0x34,0x12,
-0x24,0x33,0x32,0x04,0x12,0x15,0x21,0x22,0x15,0x35,0x14,0x33,0x21,0x32,0x35,0x11,
-0x26,0x27,0x26,0x23,0x22,0x07,0x06,0x07,0x01,0x90,0x43,0x5d,0x96,0x01,0x4a,0x98,
-0x6a,0x4d,0x6f,0x5f,0x8e,0xb3,0xfe,0x7a,0xfe,0x9b,0xc6,0xc9,0x01,0x67,0xbe,0xbd,
-0x01,0x67,0xca,0xfb,0x4a,0x13,0x13,0x03,0x90,0x14,0x46,0x5f,0x98,0x9f,0xa0,0x98,
-0x5f,0x44,0xe4,0x4d,0x33,0x54,0x54,0x3c,0x60,0x78,0x47,0x5a,0xb3,0x01,0x41,0xaf,
-0xb0,0x01,0x45,0xae,0xae,0xfe,0xbb,0xb0,0x13,0x49,0x13,0x13,0x01,0x70,0x50,0x33,
-0x52,0x51,0x34,0x4f,0x00,0x01,0x00,0xc9,0x00,0x00,0x04,0x23,0x05,0xd5,0x00,0x09,
-0x00,0x00,0x29,0x01,0x35,0x21,0x11,0x21,0x35,0x21,0x11,0x33,0x04,0x23,0xfc,0xa6,
-0x02,0x90,0xfd,0xb0,0x02,0x50,0xca,0xaa,0x01,0xb8,0xaa,0x02,0xc9,0x00,0x00,0x02,
-0x00,0x68,0xff,0xe7,0x03,0x4a,0x03,0x29,0x00,0x0b,0x00,0x17,0x00,0x00,0x01,0x34,
-0x26,0x23,0x22,0x02,0x15,0x14,0x16,0x33,0x32,0x12,0x03,0x32,0x16,0x15,0x14,0x02,
-0x23,0x22,0x26,0x35,0x34,0x12,0x02,0xa9,0x57,0x4f,0x6d,0x8d,0x56,0x50,0x6d,0x8d,
-0xc2,0x98,0xcb,0xdd,0xa2,0x98,0xcb,0xdd,0x01,0xf7,0x74,0x7d,0xfe,0xfe,0xcf,0x74,
-0x7b,0x01,0x04,0x01,0xfd,0xd8,0xa3,0xc6,0xfe,0xff,0xd8,0xa3,0xc6,0x01,0x01,0x00,
-0x00,0x01,0x00,0x67,0xff,0xe3,0x05,0xb2,0x05,0xf0,0x00,0x36,0x00,0x00,0x09,0x01,
-0x16,0x15,0x14,0x07,0x34,0x27,0x01,0x07,0x06,0x1f,0x01,0x16,0x15,0x14,0x07,0x06,
-0x2b,0x01,0x35,0x36,0x35,0x34,0x2f,0x01,0x26,0x35,0x34,0x3f,0x01,0x27,0x26,0x35,
-0x34,0x37,0x14,0x17,0x09,0x01,0x27,0x26,0x35,0x34,0x37,0x14,0x1f,0x01,0x16,0x15,
-0x14,0x07,0x34,0x2f,0x01,0x03,0xc4,0x01,0x8b,0x63,0x90,0x32,0xfc,0xfb,0x9b,0x3e,
-0x42,0xac,0x64,0x3d,0x56,0x45,0xf5,0xc4,0x2f,0x62,0x35,0x8c,0x9a,0xf1,0x63,0x90,
-0x32,0x02,0x6c,0x01,0x19,0x74,0x63,0x90,0x32,0xb6,0x63,0x90,0x32,0x12,0x02,0xd0,
-0xfe,0x75,0x63,0x31,0x82,0x4c,0x53,0x32,0x03,0x05,0x9c,0x3f,0x42,0xac,0x64,0x6a,
-0x6c,0x2c,0x3e,0x38,0x3f,0x5d,0x1d,0x2f,0x63,0x36,0x67,0x55,0x8d,0x9b,0xf1,0x63,
-0x31,0x82,0x4c,0x53,0x32,0xfd,0x96,0x01,0x19,0x74,0x63,0x31,0x82,0x4c,0x53,0x32,
-0xb6,0x63,0x31,0x82,0x4c,0x53,0x32,0x12,0x00,0x04,0x00,0x97,0x00,0x00,0x09,0x4c,
-0x04,0x60,0x00,0x09,0x00,0x0c,0x00,0x14,0x00,0x20,0x00,0x00,0x13,0x21,0x15,0x21,
-0x11,0x21,0x15,0x21,0x11,0x23,0x01,0x03,0x21,0x01,0x33,0x01,0x23,0x27,0x21,0x07,
-0x23,0x01,0x33,0x1b,0x01,0x33,0x09,0x01,0x23,0x09,0x01,0x23,0x01,0x97,0x02,0x83,
-0xfe,0x14,0x01,0xbc,0xfe,0x44,0x97,0x03,0x83,0xb5,0x01,0x6a,0xff,0x00,0x97,0x01,
-0x77,0x8a,0x5a,0xfe,0x44,0x5a,0x8c,0x03,0xd6,0x8f,0xf5,0xf6,0x90,0xfe,0xc3,0x01,
-0x52,0x90,0xfe,0xeb,0xfe,0xe9,0x90,0x01,0x60,0x04,0x60,0x80,0xfe,0xb6,0x7f,0xfd,
-0xe9,0x03,0x08,0xfe,0x43,0x02,0x35,0xfc,0x80,0xe6,0xe6,0x03,0x80,0xfe,0xb3,0x01,
-0x4d,0xfe,0x52,0xfe,0x2e,0x01,0x7d,0xfe,0x83,0x01,0xde,0x00,0x00,0x02,0x00,0x3b,
-0xff,0xe3,0x05,0xb8,0x05,0xf0,0x00,0x26,0x00,0x30,0x00,0x00,0x09,0x01,0x0e,0x01,
-0x07,0x23,0x36,0x12,0x37,0x01,0x33,0x17,0x3e,0x01,0x33,0x32,0x00,0x15,0x14,0x06,
-0x07,0x1e,0x01,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x35,0x1e,0x01,0x33,0x32,0x36,
-0x35,0x34,0x26,0x37,0x3e,0x01,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x03,0xba,0xfe,
-0x04,0x3b,0x42,0x06,0xba,0x0c,0x68,0x5d,0xfe,0xe9,0xfc,0x8f,0x68,0xe4,0x83,0xf1,
-0x01,0x32,0x86,0x86,0x30,0x32,0xde,0xb8,0x53,0xa5,0x55,0x57,0x9e,0x44,0x69,0x83,
-0x3b,0x32,0x5b,0x55,0xd4,0xa0,0x5f,0xa6,0x49,0x02,0x40,0x02,0x08,0x59,0xcb,0x72,
-0x84,0x01,0x02,0x7e,0x01,0x1d,0x93,0x59,0x57,0xfe,0xed,0xd7,0x80,0xe1,0x63,0x3f,
-0x7d,0x3c,0xa2,0xc5,0x24,0x24,0xb6,0x2f,0x31,0x6f,0x58,0x33,0x67,0xce,0x51,0xa1,
-0x58,0x92,0xc2,0x3f,0x40,0x00,0xff,0xff,0x00,0x89,0xff,0xe3,0x07,0x58,0x05,0xf0,
-0x10,0x22,0x00,0x7b,0x00,0x00,0x10,0x27,0x08,0x86,0x03,0x35,0x00,0x00,0x10,0x03,
-0x00,0x75,0x04,0x8b,0xfd,0x64,0xff,0xff,0x00,0x5e,0xff,0xe3,0x07,0x58,0x05,0xf0,
-0x10,0x22,0x00,0x74,0x00,0x00,0x10,0x27,0x08,0x86,0x03,0x35,0x00,0x00,0x10,0x03,
-0x00,0x75,0x04,0x8b,0xfd,0x64,0xff,0xff,0x00,0x89,0xff,0xe3,0x07,0x5e,0x05,0xf0,
-0x10,0x22,0x00,0x7b,0x00,0x00,0x10,0x27,0x08,0x86,0x03,0x35,0x00,0x00,0x10,0x03,
-0x07,0xbb,0x04,0x8b,0xfd,0x64,0xff,0xff,0x00,0x5e,0xff,0xe3,0x07,0x5e,0x05,0xf0,
-0x10,0x22,0x00,0x74,0x00,0x00,0x10,0x27,0x08,0x86,0x03,0x35,0x00,0x00,0x10,0x03,
-0x07,0xbb,0x04,0x8b,0xfd,0x64,0xff,0xff,0x00,0x62,0xff,0xe3,0x07,0x5e,0x05,0xf0,
-0x10,0x22,0x00,0x75,0x00,0x00,0x10,0x27,0x08,0x86,0x03,0x35,0x00,0x00,0x10,0x03,
-0x07,0xbb,0x04,0x8b,0xfd,0x64,0xff,0xff,0x00,0x3f,0xff,0xe3,0x07,0x5e,0x05,0xf0,
-0x10,0x22,0x07,0xba,0x00,0x00,0x10,0x27,0x08,0x86,0x03,0x35,0x00,0x00,0x10,0x03,
-0x07,0xbb,0x04,0x8b,0xfd,0x64,0xff,0xff,0x00,0x89,0xff,0xe3,0x07,0x7e,0x05,0xf0,
-0x10,0x22,0x00,0x7b,0x00,0x00,0x10,0x27,0x08,0x86,0x03,0x35,0x00,0x00,0x10,0x03,
-0x07,0xbc,0x04,0x8b,0xfd,0x64,0xff,0xff,0x00,0x66,0xff,0xe3,0x07,0x7e,0x05,0xf0,
-0x10,0x22,0x07,0xbb,0x00,0x00,0x10,0x27,0x08,0x86,0x03,0x35,0x00,0x00,0x10,0x03,
-0x07,0xbc,0x04,0x8b,0xfd,0x64,0xff,0xff,0x00,0x89,0xff,0xe3,0x07,0x77,0x05,0xf0,
-0x10,0x22,0x00,0x7b,0x00,0x00,0x10,0x27,0x08,0x86,0x03,0x35,0x00,0x00,0x10,0x03,
-0x07,0xbe,0x04,0x8b,0xfd,0x64,0xff,0xff,0x00,0x62,0xff,0xe3,0x07,0x77,0x05,0xf0,
-0x10,0x22,0x00,0x75,0x00,0x00,0x10,0x27,0x08,0x86,0x03,0x35,0x00,0x00,0x10,0x03,
-0x07,0xbe,0x04,0x8b,0xfd,0x64,0xff,0xff,0x00,0x66,0xff,0xe3,0x07,0x77,0x05,0xf0,
-0x10,0x22,0x07,0xbb,0x00,0x00,0x10,0x27,0x08,0x86,0x03,0x35,0x00,0x00,0x10,0x03,
-0x07,0xbe,0x04,0x8b,0xfd,0x64,0xff,0xff,0x00,0x6c,0xff,0xe3,0x07,0x77,0x05,0xf0,
-0x10,0x22,0x07,0xbd,0x00,0x00,0x10,0x27,0x08,0x86,0x03,0x35,0x00,0x00,0x10,0x03,
-0x07,0xbe,0x04,0x8b,0xfd,0x64,0xff,0xff,0x00,0x89,0xff,0xe3,0x06,0x02,0x05,0xf0,
-0x10,0x22,0x00,0x7b,0x00,0x00,0x10,0x07,0x08,0x86,0x03,0x35,0x00,0x00,0xff,0xff,
-0x00,0xc9,0x00,0x00,0x01,0x93,0x05,0xd5,0x10,0x06,0x00,0x2c,0x00,0x00,0xff,0xff,
-0x00,0xc9,0x00,0x00,0x03,0x27,0x05,0xd5,0x10,0x26,0x00,0x2c,0x00,0x00,0x10,0x07,
-0x00,0x2c,0x01,0x94,0x00,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,0x04,0xbb,0x05,0xd5,
-0x10,0x26,0x00,0x2c,0x00,0x00,0x10,0x27,0x00,0x2c,0x01,0x94,0x00,0x00,0x10,0x07,
-0x00,0x2c,0x03,0x28,0x00,0x00,0xff,0xff,0x00,0xc9,0x00,0x00,0x07,0x51,0x05,0xd5,
-0x10,0x26,0x00,0x2c,0x00,0x00,0x10,0x07,0x00,0x39,0x01,0xe9,0x00,0x00,0xff,0xff,
-0x00,0x10,0x00,0x00,0x05,0x68,0x05,0xd5,0x10,0x06,0x00,0x39,0x00,0x00,0xff,0xff,
-0x00,0x10,0x00,0x00,0x06,0x98,0x05,0xd5,0x10,0x26,0x00,0x39,0x00,0x00,0x10,0x07,
-0x00,0x2c,0x05,0x05,0x00,0x00,0xff,0xff,0x00,0x10,0x00,0x00,0x08,0x2c,0x05,0xd5,
-0x10,0x26,0x00,0x39,0x00,0x00,0x10,0x27,0x00,0x2c,0x05,0x05,0x00,0x00,0x10,0x07,
-0x00,0x2c,0x06,0x99,0x00,0x00,0xff,0xff,0x00,0x10,0x00,0x00,0x09,0xc0,0x05,0xd5,
-0x10,0x26,0x00,0x39,0x00,0x00,0x10,0x27,0x00,0x2c,0x05,0x05,0x00,0x00,0x10,0x27,
-0x00,0x2c,0x06,0x99,0x00,0x00,0x10,0x07,0x00,0x2c,0x08,0x2d,0x00,0x00,0xff,0xff,
-0x00,0xc9,0x00,0x00,0x07,0x17,0x05,0xd5,0x10,0x26,0x00,0x2c,0x00,0x00,0x10,0x07,
-0x00,0x3b,0x01,0xdc,0x00,0x00,0xff,0xff,0x00,0x3d,0x00,0x00,0x05,0x3b,0x05,0xd5,
-0x10,0x06,0x00,0x3b,0x00,0x00,0xff,0xff,0x00,0x3d,0x00,0x00,0x06,0xae,0x05,0xd5,
-0x10,0x26,0x00,0x3b,0x00,0x00,0x10,0x07,0x00,0x2c,0x05,0x1b,0x00,0x00,0xff,0xff,
-0x00,0x3d,0x00,0x00,0x08,0x42,0x05,0xd5,0x10,0x26,0x00,0x3b,0x00,0x00,0x10,0x27,
-0x00,0x2c,0x05,0x1b,0x00,0x00,0x10,0x07,0x00,0x2c,0x06,0xaf,0x00,0x00,0xff,0xff,
-0x00,0xc9,0x00,0x00,0x04,0x6a,0x05,0xd5,0x10,0x06,0x00,0x2f,0x00,0x00,0xff,0xff,
-0x00,0x73,0xff,0xe3,0x05,0x27,0x05,0xf0,0x10,0x06,0x00,0x26,0x00,0x00,0xff,0xff,
-0x00,0xc9,0x00,0x00,0x05,0xb0,0x05,0xd5,0x10,0x06,0x00,0x27,0x00,0x00,0xff,0xff,
-0x00,0xc9,0x00,0x00,0x06,0x1f,0x05,0xd5,0x10,0x06,0x00,0x30,0x00,0x00,0xff,0xff,
-0x00,0xc1,0x00,0x00,0x01,0x79,0x06,0x14,0x10,0x06,0x00,0x4c,0x00,0x00,0xff,0xff,
-0x00,0xc1,0x00,0x00,0x02,0xe9,0x06,0x14,0x10,0x26,0x00,0x4c,0x00,0x00,0x10,0x07,
-0x00,0x4c,0x01,0x70,0x00,0x00,0xff,0xff,0x00,0xc1,0x00,0x00,0x04,0x59,0x06,0x14,
-0x10,0x26,0x00,0x4c,0x00,0x00,0x10,0x27,0x00,0x4c,0x01,0x70,0x00,0x00,0x10,0x07,
-0x00,0x4c,0x02,0xe0,0x00,0x00,0xff,0xff,0x00,0xc1,0x00,0x00,0x06,0x41,0x06,0x14,
-0x10,0x26,0x00,0x4c,0x00,0x00,0x10,0x07,0x00,0x59,0x01,0xc2,0x00,0x00,0xff,0xff,
-0x00,0x3d,0x00,0x00,0x04,0x7f,0x04,0x60,0x10,0x06,0x00,0x59,0x00,0x00,0xff,0xff,
-0x00,0x3d,0x00,0x00,0x05,0xbd,0x06,0x14,0x10,0x26,0x00,0x59,0x00,0x00,0x10,0x07,
-0x00,0x4c,0x04,0x44,0x00,0x00,0xff,0xff,0x00,0x3d,0x00,0x00,0x07,0x2d,0x06,0x14,
-0x10,0x26,0x00,0x59,0x00,0x00,0x10,0x27,0x00,0x4c,0x04,0x44,0x00,0x00,0x10,0x07,
-0x00,0x4c,0x05,0xb4,0x00,0x00,0xff,0xff,0x00,0x3d,0x00,0x00,0x08,0x9d,0x06,0x14,
-0x10,0x26,0x00,0x59,0x00,0x00,0x10,0x27,0x00,0x4c,0x04,0x44,0x00,0x00,0x10,0x27,
-0x00,0x4c,0x05,0xb4,0x00,0x00,0x10,0x07,0x00,0x4c,0x07,0x24,0x00,0x00,0xff,0xff,
-0x00,0xc1,0x00,0x00,0x06,0x4a,0x06,0x14,0x10,0x26,0x00,0x4c,0x00,0x00,0x10,0x07,
-0x00,0x5b,0x01,0xd1,0x00,0x00,0xff,0xff,0x00,0x3b,0x00,0x00,0x04,0x79,0x04,0x60,
-0x10,0x06,0x00,0x5b,0x00,0x00,0xff,0xff,0x00,0x3b,0x00,0x00,0x05,0xd4,0x06,0x14,
-0x10,0x26,0x00,0x5b,0x00,0x00,0x10,0x07,0x00,0x4c,0x04,0x5b,0x00,0x00,0xff,0xff,
-0x00,0x3b,0x00,0x00,0x07,0x44,0x06,0x14,0x10,0x26,0x00,0x5b,0x00,0x00,0x10,0x27,
-0x00,0x4c,0x04,0x5b,0x00,0x00,0x10,0x07,0x00,0x4c,0x05,0xcb,0x00,0x00,0xff,0xff,
-0x00,0xc1,0x00,0x00,0x01,0x79,0x06,0x14,0x10,0x06,0x00,0x4f,0x00,0x00,0xff,0xff,
-0x00,0x71,0xff,0xe3,0x03,0xe7,0x04,0x7b,0x10,0x06,0x00,0x46,0x00,0x00,0xff,0xff,
-0x00,0x71,0xff,0xe3,0x04,0x5a,0x06,0x14,0x10,0x06,0x00,0x47,0x00,0x00,0xff,0xff,
-0x00,0xba,0x00,0x00,0x07,0x1d,0x04,0x7b,0x10,0x06,0x00,0x50,0x00,0x00,0x00,0x03,
-0x00,0x79,0xff,0xff,0x09,0x7d,0x05,0xd5,0x00,0x0d,0x00,0x16,0x00,0x1f,0x00,0x00,
-0x01,0x20,0x00,0x11,0x10,0x00,0x29,0x01,0x20,0x00,0x11,0x10,0x00,0x21,0x01,0x33,
-0x20,0x00,0x11,0x10,0x00,0x21,0x23,0x03,0x11,0x23,0x20,0x00,0x11,0x10,0x00,0x21,
-0x06,0x35,0x01,0xb2,0x01,0x96,0xfe,0x68,0xfe,0x50,0xfd,0x8c,0xfe,0x50,0xfe,0x68,
-0x01,0x96,0x01,0xb2,0x01,0x9f,0xf4,0x01,0x35,0x01,0x1f,0xfe,0xe1,0xfe,0xcb,0xf4,
-0xca,0xf4,0xfe,0xcb,0xfe,0xe1,0x01,0x1f,0x01,0x35,0x05,0xd5,0xfe,0x97,0xfe,0x80,
-0xfe,0x7e,0xfe,0x96,0x01,0x6a,0x01,0x82,0x01,0x80,0x01,0x69,0xfa,0xd1,0x01,0x18,
-0x01,0x2e,0x01,0x2c,0x01,0x17,0xfb,0x77,0x04,0x89,0xfe,0xe9,0xfe,0xd4,0xfe,0xd2,
-0xfe,0xe8,0x00,0x03,0x00,0xc9,0x00,0x00,0x05,0xb0,0x05,0xd5,0x00,0x11,0x00,0x1a,
-0x00,0x23,0x00,0xfb,0xba,0x00,0x09,0x00,0x1b,0x00,0x03,0x2b,0xb8,0x00,0x09,0x10,
-0xba,0x00,0x0e,0x00,0x17,0x00,0x03,0x2b,0xb8,0x00,0x0e,0x10,0xba,0x00,0x1f,0x00,
-0x05,0x00,0x03,0x2b,0xb8,0x00,0x1f,0x10,0xb8,0x00,0x09,0x10,0xb8,0x00,0x00,0xd0,
-0x41,0x05,0x00,0xea,0x00,0x05,0x00,0xfa,0x00,0x05,0x00,0x02,0x5d,0x41,0x1b,0x00,
-0x19,0x00,0x05,0x00,0x29,0x00,0x05,0x00,0x39,0x00,0x05,0x00,0x49,0x00,0x05,0x00,
-0x59,0x00,0x05,0x00,0x69,0x00,0x05,0x00,0x79,0x00,0x05,0x00,0x89,0x00,0x05,0x00,
-0x99,0x00,0x05,0x00,0xa9,0x00,0x05,0x00,0xb9,0x00,0x05,0x00,0xc9,0x00,0x05,0x00,
-0xd9,0x00,0x05,0x00,0x0d,0x5d,0xb8,0x00,0x09,0x10,0xb8,0x00,0x12,0xd0,0x41,0x05,
-0x00,0xea,0x00,0x17,0x00,0xfa,0x00,0x17,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,
-0x17,0x00,0x29,0x00,0x17,0x00,0x39,0x00,0x17,0x00,0x49,0x00,0x17,0x00,0x59,0x00,
-0x17,0x00,0x69,0x00,0x17,0x00,0x79,0x00,0x17,0x00,0x89,0x00,0x17,0x00,0x99,0x00,
-0x17,0x00,0xa9,0x00,0x17,0x00,0xb9,0x00,0x17,0x00,0xc9,0x00,0x17,0x00,0xd9,0x00,
-0x17,0x00,0x0d,0x5d,0xb8,0x00,0x1f,0x10,0xb8,0x00,0x25,0xdc,0x00,0xba,0x00,0x02,
-0x00,0x22,0x00,0x03,0x2b,0xb8,0x00,0x02,0x10,0xba,0x00,0x1c,0x00,0x08,0x00,0x03,
-0x2b,0xb8,0x00,0x1c,0x10,0xba,0x00,0x13,0x00,0x00,0x00,0x03,0x2b,0xb8,0x00,0x13,
-0x10,0xba,0x00,0x0a,0x00,0x12,0x00,0x03,0x2b,0xb8,0x00,0x0a,0x10,0x30,0x31,0x01,
-0x15,0x33,0x20,0x00,0x11,0x10,0x00,0x21,0x23,0x15,0x33,0x20,0x16,0x15,0x14,0x06,
-0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x01,0x21,0x20,0x00,0x11,0x10,
-0x00,0x29,0x01,0x01,0x93,0xf4,0x01,0x35,0x01,0x1f,0xfe,0xe1,0xfe,0xcb,0xf4,0x48,
-0x01,0x00,0xf0,0xf1,0xff,0x48,0x4e,0x9f,0x93,0x93,0x9f,0xfe,0xe8,0x01,0x9f,0x01,
-0xb2,0x01,0x96,0xfe,0x68,0xfe,0x50,0xfe,0x61,0x01,0x59,0xb3,0x01,0x18,0x01,0x2e,
-0x01,0x2c,0x01,0x17,0xb2,0xc2,0xcf,0xd0,0xc3,0x02,0x9e,0xfd,0xe8,0x81,0x8c,0x8a,
-0x81,0x01,0xde,0xfe,0x97,0xfe,0x80,0xfe,0x7e,0xfe,0x96,0x00,0x00,0x05,0x00,0x79,
-0xff,0xff,0x09,0x7d,0x05,0xd5,0x00,0x11,0x00,0x1a,0x00,0x28,0x00,0x31,0x00,0x43,
-0x00,0x00,0x01,0x33,0x20,0x00,0x11,0x10,0x00,0x21,0x23,0x35,0x33,0x20,0x36,0x35,
-0x34,0x26,0x21,0x23,0x19,0x01,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x13,0x20,0x00,
-0x11,0x10,0x00,0x29,0x01,0x20,0x00,0x11,0x10,0x00,0x21,0x13,0x23,0x22,0x26,0x35,
-0x34,0x36,0x3b,0x01,0x35,0x23,0x20,0x06,0x15,0x14,0x16,0x21,0x33,0x15,0x23,0x20,
-0x00,0x11,0x10,0x00,0x21,0x33,0x05,0x60,0xf4,0x01,0x35,0x01,0x1f,0xfe,0xe1,0xfe,
-0xcb,0xf4,0x48,0x00,0xff,0xf1,0xf0,0xff,0x00,0x48,0x4e,0x9f,0x93,0x93,0x9f,0x87,
-0x01,0xb0,0x01,0x98,0xfe,0x6a,0xfe,0x4e,0xfd,0x8c,0xfe,0x4e,0xfe,0x6a,0x01,0x98,
-0x01,0xb0,0xd5,0x4e,0x9f,0x93,0x93,0x9f,0x4e,0x48,0xff,0x00,0xf0,0xf1,0x00,0xff,
-0x48,0xf4,0xfe,0xcb,0xfe,0xe1,0x01,0x1f,0x01,0x35,0xf4,0x05,0x2f,0xfe,0xe9,0xfe,
-0xd4,0xfe,0xd2,0xfe,0xe8,0xb3,0xc3,0xd0,0xcf,0xc2,0xfd,0x62,0x02,0x18,0x81,0x8a,
-0x8c,0x81,0xfe,0x21,0x01,0x6a,0x01,0x82,0x01,0x80,0x01,0x69,0xfe,0x97,0xfe,0x80,
-0xfe,0x7e,0xfe,0x96,0x01,0xdf,0x81,0x8c,0x8a,0x81,0x86,0xc2,0xcf,0xd0,0xc3,0xb3,
-0x01,0x18,0x01,0x2e,0x01,0x2c,0x01,0x17,0xff,0xff,0x00,0x73,0xff,0xe3,0x05,0x27,
-0x05,0xf0,0x10,0x06,0x01,0x48,0x00,0x00,0x00,0x01,0x00,0x78,0x00,0xdf,0x06,0x12,
-0x02,0xdf,0x00,0x06,0x00,0x00,0x25,0x09,0x01,0x07,0x21,0x15,0x21,0x01,0x78,0xff,
-0x00,0x01,0x00,0x40,0x04,0xda,0xfb,0x26,0xdf,0x01,0x00,0x01,0x00,0xc0,0x80,0x00,
-0x00,0x01,0x00,0xfa,0x00,0x00,0x02,0xfa,0x05,0x9a,0x00,0x06,0x00,0x00,0x13,0x09,
-0x01,0x27,0x11,0x23,0x11,0xfa,0x01,0x00,0x01,0x00,0xc0,0x80,0x04,0x9a,0x01,0x00,
-0xff,0x00,0x40,0xfb,0x26,0x04,0xda,0x00,0x00,0x01,0x00,0x78,0x00,0xdf,0x06,0x12,
-0x02,0xdf,0x00,0x06,0x00,0x00,0x01,0x21,0x35,0x21,0x27,0x09,0x01,0x05,0x51,0xfb,
-0x27,0x04,0xd9,0x40,0x01,0x01,0xfe,0xff,0x01,0x9f,0x80,0xc0,0xff,0x00,0xff,0x00,
-0x00,0x01,0x00,0xfa,0x00,0x00,0x02,0xfa,0x05,0x9a,0x00,0x06,0x00,0x00,0x25,0x11,
-0x33,0x11,0x37,0x09,0x01,0x01,0xba,0x80,0xc0,0xff,0x00,0xff,0x00,0xc1,0x04,0xd9,
-0xfb,0x27,0x40,0xfe,0xff,0x01,0x01,0x00,0x00,0x01,0x00,0x78,0x00,0xdf,0x06,0x12,
-0x02,0xdf,0x00,0x09,0x00,0x00,0x01,0x17,0x09,0x01,0x07,0x21,0x27,0x09,0x01,0x37,
-0x01,0x38,0x40,0xff,0x00,0x01,0x00,0x40,0x04,0x19,0x40,0x01,0x01,0xfe,0xff,0x40,
-0x01,0x9f,0xc0,0x01,0x00,0x01,0x00,0xc0,0xc0,0xff,0x00,0xff,0x00,0xc0,0x00,0x01,
-0x00,0xfa,0x00,0x00,0x02,0xfa,0x05,0x9a,0x00,0x09,0x00,0x00,0x25,0x37,0x09,0x01,
-0x17,0x11,0x07,0x09,0x01,0x27,0x02,0x3a,0xc0,0xff,0x00,0xff,0x00,0xc0,0xc0,0x01,
-0x00,0x01,0x00,0xc0,0xc1,0x40,0xfe,0xff,0x01,0x01,0x40,0x04,0x19,0x40,0x01,0x00,
-0xff,0x00,0x40,0x00,0x00,0x01,0x01,0x33,0x00,0xbb,0x05,0x57,0x04,0xdf,0x00,0x06,
-0x00,0x00,0x01,0x03,0x05,0x07,0x01,0x07,0x01,0x01,0x34,0x01,0x01,0x6b,0xb5,0x03,
-0x6e,0x5b,0xfc,0x92,0x03,0x74,0x01,0x6b,0x01,0x5a,0xfc,0x92,0x5b,0x03,0x6e,0x00,
-0x00,0x01,0x01,0x33,0x00,0xbb,0x05,0x57,0x04,0xdf,0x00,0x06,0x00,0x00,0x01,0x25,
-0x03,0x27,0x01,0x27,0x01,0x03,0xec,0x01,0x6b,0x01,0x5a,0xfc,0x92,0x5b,0x03,0x6e,
-0x04,0xde,0x01,0xfe,0x95,0xb5,0xfc,0x92,0x5b,0x03,0x6e,0x00,0x00,0x01,0x01,0x33,
-0x00,0xbb,0x05,0x57,0x04,0xdf,0x00,0x06,0x00,0x00,0x09,0x01,0x37,0x01,0x37,0x13,
-0x25,0x04,0xa1,0xfc,0x92,0x5b,0x03,0x6e,0x5a,0x01,0xfe,0x95,0x01,0x16,0x03,0x6e,
-0x5b,0xfc,0x92,0xb5,0xfe,0x95,0x01,0x00,0x00,0x01,0x01,0x33,0x00,0xbb,0x05,0x57,
-0x04,0xdf,0x00,0x06,0x00,0x00,0x09,0x01,0x17,0x01,0x17,0x05,0x13,0x01,0x8e,0x03,
-0x6e,0x5b,0xfc,0x92,0xb5,0xfe,0x95,0x01,0x01,0x71,0x03,0x6e,0x5b,0xfc,0x92,0x5a,
-0x01,0x01,0x6b,0x00,0x00,0x01,0x00,0x78,0x00,0x57,0x06,0x12,0x03,0x67,0x00,0x0e,
-0x00,0x00,0x01,0x21,0x17,0x09,0x01,0x07,0x21,0x13,0x33,0x03,0x21,0x15,0x21,0x03,
-0x23,0x02,0xf0,0xfe,0x48,0x40,0xff,0x00,0x01,0x00,0x40,0x01,0xe2,0x6b,0x80,0x6b,
-0x02,0x78,0xfd,0x5e,0x6b,0x80,0x01,0x9f,0xc0,0x01,0x00,0x01,0x00,0xc0,0x01,0x48,
-0xfe,0xb8,0x80,0xfe,0xb8,0x00,0x00,0x01,0x00,0x78,0x00,0x57,0x06,0x12,0x03,0x67,
-0x00,0x0e,0x00,0x00,0x01,0x21,0x27,0x09,0x01,0x37,0x21,0x03,0x23,0x13,0x21,0x35,
-0x21,0x13,0x33,0x03,0x9a,0x01,0xb7,0x40,0x01,0x01,0xfe,0xff,0x40,0xfe,0x1f,0x6b,
-0x80,0x6b,0xfd,0x88,0x02,0xa2,0x6b,0x80,0x02,0x1f,0xc0,0xff,0x00,0xff,0x00,0xc0,
-0xfe,0xb8,0x01,0x48,0x80,0x01,0x48,0x00,0x00,0x01,0x00,0xcd,0x01,0x01,0x05,0xbd,
-0x02,0xbd,0x00,0x14,0x00,0x00,0x01,0x03,0x25,0x07,0x17,0x16,0x00,0x37,0x16,0x1f,
-0x01,0x07,0x27,0x26,0x07,0x26,0x04,0x07,0x26,0x2f,0x01,0x01,0x2b,0x5e,0x01,0x5e,
-0x98,0x87,0xbb,0x01,0x50,0xaa,0x49,0x35,0x70,0x40,0x49,0x2d,0x5f,0x5f,0xfe,0xf8,
-0x8a,0x80,0x5d,0x87,0x01,0x01,0x01,0x5e,0x5e,0x87,0x4d,0x65,0x01,0x11,0x01,0x01,
-0x19,0x43,0x6f,0x2c,0x1a,0x01,0x01,0xd2,0x01,0x0a,0x33,0x4e,0x00,0x01,0x00,0xcd,
-0x01,0x01,0x05,0xbd,0x02,0xbd,0x00,0x14,0x00,0x00,0x01,0x07,0x06,0x07,0x26,0x24,
-0x07,0x26,0x0f,0x01,0x27,0x37,0x36,0x37,0x16,0x00,0x3f,0x01,0x27,0x05,0x03,0x05,
-0x37,0x87,0x5d,0x80,0x8a,0xfe,0xf8,0x5f,0x5f,0x2d,0x49,0x40,0x70,0x35,0x49,0xaa,
-0x01,0x50,0xbb,0x87,0x98,0x01,0x5e,0x5e,0x01,0xc8,0x4e,0x33,0x0a,0x01,0xd2,0x01,
-0x01,0x1a,0x2c,0x6f,0x43,0x19,0x01,0x01,0xfe,0xef,0x65,0x4d,0x87,0x5e,0xfe,0xa2,
-0x00,0x01,0x00,0x78,0x00,0xdf,0x06,0x12,0x02,0xdf,0x00,0x0c,0x00,0x00,0x01,0x33,
-0x37,0x07,0x21,0x15,0x21,0x17,0x27,0x23,0x17,0x09,0x01,0x01,0x38,0x22,0xc0,0x40,
-0x04,0x38,0xfb,0xc8,0x40,0xc0,0x22,0x40,0xff,0x00,0x01,0x00,0x02,0x1f,0xc0,0xc0,
-0x80,0xc0,0xc0,0xc0,0x01,0x00,0x01,0x00,0x00,0x01,0x00,0xfa,0x00,0x00,0x02,0xfa,
-0x05,0x9a,0x00,0x0c,0x00,0x00,0x01,0x15,0x17,0x27,0x11,0x23,0x11,0x07,0x37,0x35,
-0x07,0x09,0x01,0x02,0x3a,0xc0,0xc0,0x80,0xc0,0xc0,0xc0,0x01,0x00,0x01,0x00,0x04,
-0xda,0x22,0xc0,0x40,0xfb,0xc8,0x04,0x38,0x40,0xc0,0x22,0x40,0x01,0x00,0xff,0x00,
-0x00,0x01,0x00,0x78,0x00,0xdf,0x06,0x12,0x02,0xdf,0x00,0x0c,0x00,0x00,0x01,0x23,
-0x07,0x37,0x21,0x35,0x21,0x27,0x17,0x33,0x27,0x09,0x01,0x05,0x52,0x22,0xc0,0x40,
-0xfb,0xc8,0x04,0x38,0x40,0xc0,0x22,0x40,0x01,0x00,0xff,0x00,0x01,0x9f,0xc0,0xc0,
-0x80,0xc0,0xc0,0xc0,0xff,0x00,0xff,0x00,0x00,0x01,0x00,0xfa,0x00,0x00,0x02,0xfa,
-0x05,0x9a,0x00,0x0c,0x00,0x00,0x25,0x35,0x27,0x17,0x11,0x33,0x11,0x37,0x07,0x15,
-0x37,0x09,0x01,0x01,0xba,0xc0,0xc0,0x80,0xc0,0xc0,0xc0,0xff,0x00,0xff,0x00,0xc0,
-0x22,0xc0,0x40,0x04,0x38,0xfb,0xc8,0x40,0xc0,0x22,0x40,0xff,0x00,0x01,0x00,0x00,
-0x00,0x01,0x00,0x78,0x00,0xdf,0x06,0x3b,0x02,0xdf,0x00,0x0b,0x00,0x00,0x01,0x21,
-0x17,0x09,0x01,0x07,0x21,0x37,0x33,0x07,0x13,0x23,0x05,0x24,0xfc,0x14,0x40,0xff,
-0x00,0x01,0x00,0x40,0x03,0xec,0x97,0x80,0xc8,0xc8,0x80,0x01,0x9f,0xc0,0x01,0x00,
-0x01,0x00,0xc0,0xc0,0xfe,0xfe,0xfe,0x00,0x00,0x01,0x00,0x78,0x00,0xdf,0x06,0x3b,
-0x02,0xdf,0x00,0x0b,0x00,0x00,0x37,0x23,0x13,0x27,0x33,0x17,0x21,0x27,0x09,0x01,
-0x37,0x21,0xf8,0x80,0xc8,0xc8,0x80,0x97,0x03,0xec,0x40,0x01,0x00,0xff,0x00,0x40,
-0xfc,0x14,0xdf,0x01,0x02,0xfe,0xc0,0xc0,0xff,0x00,0xff,0x00,0xc0,0x00,0x00,0x01,
-0x00,0x78,0x00,0xdf,0x06,0x12,0x02,0xdf,0x00,0x0a,0x00,0x00,0x01,0x35,0x33,0x11,
-0x23,0x35,0x21,0x17,0x09,0x01,0x07,0x05,0xd2,0x40,0x40,0xfb,0x66,0x40,0xff,0x00,
-0x01,0x00,0x40,0x02,0x1f,0x80,0xfe,0x80,0x80,0xc0,0x01,0x00,0x01,0x00,0xc0,0x00,
-0x00,0x01,0x00,0xf8,0x00,0x00,0x02,0xf8,0x05,0x9a,0x00,0x0a,0x00,0x00,0x25,0x33,
-0x15,0x21,0x35,0x33,0x11,0x07,0x09,0x01,0x27,0x02,0x38,0x80,0xfe,0x80,0x80,0xc0,
-0x01,0x00,0x01,0x00,0xc0,0x40,0x40,0x40,0x04,0x9a,0x40,0x01,0x00,0xff,0x00,0x40,
-0x00,0x01,0x00,0x78,0x00,0xdf,0x06,0x12,0x02,0xdf,0x00,0x0a,0x00,0x00,0x01,0x35,
-0x33,0x11,0x23,0x35,0x21,0x17,0x09,0x01,0x07,0x05,0xd2,0x40,0x40,0xfb,0x66,0x40,
-0xff,0x00,0x01,0x00,0x40,0x02,0x1f,0x80,0xfe,0x80,0x80,0xc0,0x01,0x00,0x01,0x00,
-0xc0,0x00,0x00,0x01,0x00,0xf8,0x00,0x00,0x02,0xf8,0x05,0x9a,0x00,0x0a,0x00,0x00,
-0x01,0x23,0x35,0x21,0x15,0x23,0x11,0x37,0x09,0x01,0x17,0x01,0xb8,0x80,0x01,0x80,
-0x80,0xc0,0xff,0x00,0xff,0x00,0xc0,0x05,0x5a,0x40,0x40,0xfb,0x66,0x40,0xff,0x00,
-0x01,0x00,0x40,0x00,0x00,0x02,0x00,0x78,0x00,0x00,0x03,0x74,0x05,0x9a,0x00,0x03,
-0x00,0x0d,0x00,0x00,0x37,0x21,0x15,0x21,0x01,0x37,0x09,0x01,0x17,0x11,0x07,0x09,
-0x01,0x27,0x78,0x02,0xfc,0xfd,0x04,0x01,0xc2,0xc0,0xff,0x00,0xff,0x00,0xc0,0xc0,
-0x01,0x00,0x01,0x00,0xc0,0x64,0x64,0x01,0x63,0x40,0xfe,0xff,0x01,0x01,0x40,0x03,
-0x77,0x40,0x01,0x00,0xff,0x00,0x40,0x00,0x00,0x01,0x00,0x78,0x00,0x00,0x03,0x5e,
-0x05,0x98,0x00,0x08,0x00,0x00,0x01,0x21,0x17,0x09,0x01,0x07,0x25,0x11,0x23,0x02,
-0xde,0xfe,0x5a,0x40,0xff,0x00,0x01,0x00,0x40,0x02,0x26,0x80,0x04,0x58,0xc0,0x01,
-0x00,0x01,0x00,0xc0,0x01,0xfb,0x27,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0x7c,
-0x05,0x98,0x00,0x08,0x00,0x00,0x21,0x23,0x11,0x05,0x27,0x09,0x01,0x37,0x21,0x01,
-0x16,0x80,0x02,0x26,0x40,0x01,0x00,0xff,0x00,0x40,0xfe,0x5a,0x04,0xd9,0x01,0xc0,
-0xff,0x00,0xff,0x00,0xc0,0x00,0x00,0x01,0x00,0x78,0x00,0x00,0x03,0x5e,0x05,0x98,
-0x00,0x08,0x00,0x00,0x01,0x33,0x11,0x25,0x17,0x09,0x01,0x07,0x21,0x02,0xde,0x80,
-0xfd,0xda,0x40,0xff,0x00,0x01,0x00,0x40,0x01,0xa6,0x05,0x98,0xfb,0x27,0x01,0xc0,
-0x01,0x00,0x01,0x00,0xc0,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0x7c,0x05,0x98,
-0x00,0x08,0x00,0x00,0x01,0x21,0x27,0x09,0x01,0x37,0x05,0x11,0x33,0x01,0x16,0x01,
-0xa6,0x40,0x01,0x00,0xff,0x00,0x40,0xfd,0xda,0x80,0x01,0x40,0xc0,0xff,0x00,0xff,
-0x00,0xc0,0x01,0x04,0xd9,0x00,0x00,0x01,0x00,0x78,0x00,0x03,0x03,0x8a,0x05,0x9a,
-0x00,0x08,0x00,0x00,0x13,0x35,0x21,0x03,0x37,0x09,0x01,0x17,0x11,0x78,0x02,0x53,
-0x01,0xc0,0xff,0x00,0xff,0x00,0xc0,0x05,0x1a,0x80,0xfb,0x29,0x40,0xff,0x00,0x01,
-0x00,0x40,0x04,0x57,0x00,0x01,0x00,0x78,0x00,0x00,0x05,0x87,0x05,0x98,0x00,0x08,
-0x00,0x00,0x01,0x33,0x11,0x25,0x17,0x09,0x01,0x07,0x21,0x05,0x07,0x80,0xfb,0xb1,
-0x40,0xff,0x00,0x01,0x00,0x40,0x03,0xcf,0x05,0x98,0xfb,0x27,0x01,0xc0,0x01,0x00,
-0x01,0x00,0xc0,0x00,0x00,0x01,0x00,0x48,0x02,0xcc,0x06,0x42,0x05,0xae,0x00,0x19,
-0x00,0x00,0x01,0x26,0x27,0x26,0x24,0x27,0x26,0x07,0x06,0x07,0x06,0x07,0x37,0x07,
-0x03,0x17,0x36,0x37,0x36,0x37,0x36,0x0c,0x01,0x17,0x16,0x17,0x05,0xbd,0x04,0x48,
-0x4a,0xfe,0xea,0xa9,0xa6,0x89,0x87,0x57,0x2c,0x16,0x64,0xd8,0x5d,0x52,0x1a,0x34,
-0x6b,0xa8,0xa8,0x01,0x98,0x01,0x51,0x59,0x59,0x04,0x02,0xce,0xa0,0x84,0x86,0xb2,
-0x01,0x02,0x4a,0x4c,0x8e,0x49,0x4e,0x05,0xab,0x01,0x05,0x39,0x5b,0x55,0xae,0x5d,
-0x5c,0x03,0xd8,0xa2,0xa0,0xc4,0x00,0x01,0x00,0x48,0x02,0xcc,0x06,0x42,0x05,0xae,
-0x00,0x19,0x00,0x00,0x13,0x36,0x37,0x36,0x2c,0x01,0x17,0x16,0x17,0x16,0x17,0x37,
-0x03,0x27,0x17,0x26,0x27,0x26,0x27,0x26,0x07,0x06,0x04,0x07,0x06,0x07,0x48,0x03,
-0x59,0x59,0x01,0x51,0x01,0x98,0xa8,0xa8,0x6b,0x34,0x1a,0x53,0x5e,0xd8,0x64,0x16,
-0x2c,0x57,0x87,0x89,0xa6,0xa9,0xfe,0xea,0x4a,0x48,0x03,0x02,0xce,0xc4,0xa0,0xa2,
-0xd8,0x03,0x5c,0x5d,0xae,0x55,0x5b,0x39,0xfe,0xfb,0xab,0x05,0x4e,0x49,0x8e,0x4c,
-0x4a,0x02,0x01,0xb2,0x86,0x84,0xa0,0x00,0x00,0x02,0x01,0x33,0x00,0x00,0x05,0x57,
-0x05,0x9a,0x00,0x06,0x00,0x0a,0x00,0x00,0x01,0x03,0x05,0x07,0x01,0x07,0x01,0x03,
-0x21,0x15,0x21,0x01,0x34,0x01,0x01,0x6b,0xb5,0x03,0x6e,0x5b,0xfc,0x92,0x5b,0x04,
-0x24,0xfb,0xdc,0x02,0xb9,0x01,0x6b,0x01,0x5a,0xfc,0x92,0x5b,0x03,0x6e,0x02,0x2c,
-0x80,0x00,0x00,0x04,0x00,0x78,0x00,0x00,0x06,0x12,0x03,0xfb,0x00,0x06,0x00,0x0a,
-0x00,0x11,0x00,0x15,0x00,0x00,0x09,0x02,0x07,0x21,0x15,0x21,0x05,0x11,0x33,0x11,
-0x01,0x21,0x35,0x21,0x27,0x09,0x01,0x05,0x11,0x33,0x11,0x02,0x0d,0xff,0x00,0x01,
-0x00,0x40,0x04,0x45,0xfb,0xbb,0xfe,0xab,0x64,0x03,0xe1,0xfb,0xbb,0x04,0x45,0x40,
-0x01,0x00,0xff,0x00,0x01,0x31,0x64,0x01,0xfb,0x01,0x00,0x01,0x00,0xc0,0x80,0xc1,
-0x02,0x00,0xfe,0x00,0xfe,0xc7,0x80,0xc0,0xff,0x00,0xff,0x00,0x01,0x02,0x00,0xfe,
-0x00,0x00,0x00,0x01,0x00,0x59,0xff,0xeb,0x06,0x1b,0x05,0x5f,0x00,0x22,0x00,0x00,
-0x13,0x06,0x17,0x16,0x17,0x16,0x04,0x37,0x36,0x24,0x37,0x36,0x27,0x26,0x27,0x26,
-0x27,0x07,0x03,0x21,0x07,0x16,0x17,0x16,0x17,0x16,0x02,0x04,0x07,0x06,0x24,0x02,
-0x27,0x26,0x35,0xda,0x01,0x08,0x1a,0x67,0x68,0x01,0x39,0x98,0x97,0x01,0x05,0x3a,
-0x3a,0x18,0x1a,0x68,0x35,0x42,0x1e,0x58,0x01,0x15,0x51,0x4d,0x3e,0x80,0x1f,0x1e,
-0x8c,0xfe,0xc3,0xb7,0xb8,0xfe,0x86,0xfd,0x1e,0x0a,0x02,0xce,0x32,0x31,0x99,0x82,
-0x84,0x6d,0x19,0x19,0xc9,0x9e,0x9d,0x99,0x99,0x82,0x42,0x2f,0x60,0x01,0x05,0x3b,
-0x37,0x4d,0xa0,0xbe,0xbd,0xfe,0x81,0xf4,0x1d,0x1e,0x83,0x01,0x3f,0xbd,0x3c,0x3c,
-0x00,0x01,0x00,0x6e,0xff,0xeb,0x06,0x30,0x05,0x5f,0x00,0x22,0x00,0x00,0x01,0x14,
-0x07,0x06,0x02,0x04,0x27,0x26,0x24,0x02,0x37,0x36,0x37,0x36,0x37,0x27,0x21,0x03,
-0x27,0x06,0x07,0x06,0x07,0x06,0x17,0x16,0x04,0x17,0x16,0x24,0x37,0x36,0x37,0x36,
-0x27,0x06,0x30,0x0a,0x1e,0xfd,0xfe,0x86,0xb8,0xb7,0xfe,0xc3,0x8c,0x1e,0x1f,0x80,
-0x3e,0x4d,0x51,0x01,0x15,0x58,0x1e,0x42,0x35,0x68,0x1a,0x18,0x3a,0x3a,0x01,0x05,
-0x97,0x98,0x01,0x39,0x68,0x67,0x1a,0x08,0x01,0x02,0xce,0x3c,0x3c,0xbd,0xfe,0xc1,
-0x83,0x1e,0x1d,0xf4,0x01,0x7f,0xbd,0xbe,0xa0,0x4d,0x37,0x3b,0xfe,0xfb,0x60,0x2f,
-0x42,0x82,0x99,0x99,0x9d,0x9e,0xc9,0x19,0x19,0x6d,0x84,0x82,0x99,0x31,0x32,0x00,
-0x00,0x01,0x00,0x78,0x02,0x20,0x06,0x12,0x03,0x60,0x00,0x04,0x00,0x00,0x13,0x01,
-0x07,0x21,0x15,0x78,0x01,0x40,0x40,0x04,0x9a,0x02,0x20,0x01,0x40,0xc0,0x80,0x00,
-0x00,0x01,0x00,0x78,0x00,0xdf,0x06,0x12,0x02,0x1f,0x00,0x04,0x00,0x00,0x01,0x15,
-0x21,0x17,0x01,0x06,0x12,0xfb,0x66,0x40,0xfe,0xc0,0x02,0x1f,0x80,0xc0,0x01,0x40,
-0x00,0x01,0x01,0xc0,0x00,0x00,0x03,0x00,0x05,0x9a,0x00,0x04,0x00,0x00,0x09,0x01,
-0x27,0x11,0x23,0x01,0xc0,0x01,0x40,0xc0,0x80,0x05,0x9a,0xfe,0xc0,0x40,0xfb,0x66,
-0x00,0x01,0x01,0x00,0x00,0x00,0x02,0x40,0x05,0x9a,0x00,0x04,0x00,0x00,0x09,0x01,
-0x11,0x23,0x11,0x01,0x00,0x01,0x40,0x80,0x04,0x5a,0x01,0x40,0xfa,0x66,0x04,0x9a,
-0x00,0x01,0x00,0x78,0x02,0x1d,0x06,0x12,0x03,0x5d,0x00,0x04,0x00,0x00,0x13,0x35,
-0x21,0x27,0x01,0x78,0x04,0x99,0x40,0x01,0x41,0x02,0x1d,0x80,0xc0,0xfe,0xc0,0x00,
-0x00,0x01,0x00,0x78,0x00,0xdf,0x06,0x12,0x02,0x1f,0x00,0x04,0x00,0x00,0x01,0x21,
-0x35,0x21,0x01,0x05,0x11,0xfb,0x67,0x05,0x9a,0xfe,0xbf,0x01,0x9f,0x80,0xfe,0xc0,
-0x00,0x01,0x01,0xc0,0x00,0x00,0x03,0x00,0x05,0x9a,0x00,0x04,0x00,0x00,0x01,0x33,
-0x11,0x37,0x01,0x01,0xc0,0x80,0xc0,0xfe,0xc0,0x05,0x9a,0xfb,0x67,0x40,0xfe,0xbf,
-0x00,0x01,0x01,0x00,0x00,0x00,0x02,0x40,0x05,0x9a,0x00,0x04,0x00,0x00,0x01,0x11,
-0x33,0x11,0x01,0x01,0xc0,0x80,0xfe,0xc0,0x01,0x01,0x04,0x99,0xfa,0x66,0x01,0x41,
-0x00,0x02,0x00,0x77,0xff,0xf6,0x06,0x12,0x03,0xbf,0x00,0x06,0x00,0x0d,0x00,0x00,
-0x05,0x09,0x01,0x07,0x21,0x15,0x21,0x01,0x21,0x35,0x21,0x27,0x09,0x01,0x01,0x77,
-0xff,0x00,0x01,0x00,0x40,0x04,0xda,0xfb,0x26,0x04,0x1b,0xfb,0x26,0x04,0xda,0x40,
-0x01,0x00,0xff,0x00,0x0a,0x00,0xff,0x01,0x00,0xc0,0x80,0x01,0xca,0x80,0xc0,0xff,
-0x00,0xff,0x00,0x00,0x00,0x02,0x01,0x4a,0x00,0x00,0x05,0x40,0x05,0x9b,0x00,0x06,
-0x00,0x0d,0x00,0x00,0x09,0x02,0x27,0x11,0x23,0x11,0x01,0x11,0x33,0x11,0x37,0x09,
-0x01,0x01,0x4a,0x01,0x00,0x01,0x00,0xc0,0x80,0x01,0xf6,0x80,0xc0,0xff,0x00,0xff,
-0x00,0x04,0x9a,0x01,0x00,0xff,0x00,0x40,0xfb,0x26,0x04,0xda,0xfb,0xe7,0x04,0xda,
-0xfb,0x26,0x40,0xff,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x77,0xff,0xf6,0x06,0x12,
-0x03,0xbf,0x00,0x06,0x00,0x0d,0x00,0x00,0x25,0x21,0x35,0x21,0x27,0x01,0x05,0x09,
-0x02,0x07,0x21,0x15,0x21,0x05,0x52,0xfb,0x26,0x04,0xda,0x40,0x01,0x00,0xff,0x00,
-0xfc,0x65,0xff,0x00,0x01,0x00,0x40,0x04,0xda,0xfb,0x26,0xb5,0x80,0xc0,0xff,0x00,
-0xff,0x01,0xc9,0x01,0x00,0x01,0x00,0xc0,0x80,0x00,0x00,0x02,0x00,0x77,0x00,0x36,
-0x06,0x12,0x03,0x7f,0x00,0x06,0x00,0x0d,0x00,0x00,0x01,0x21,0x15,0x21,0x17,0x2d,
-0x01,0x03,0x21,0x15,0x21,0x17,0x2d,0x01,0x01,0x3e,0x04,0xd3,0xfb,0x2d,0x39,0xff,
-0x00,0x01,0x00,0x38,0x04,0xd3,0xfb,0x2d,0x39,0xff,0x00,0x01,0x00,0x02,0xff,0x80,
-0x80,0xc0,0xc0,0xfd,0xb6,0x80,0x7f,0xbf,0xc1,0x00,0x00,0x02,0x01,0xa0,0x00,0x00,
-0x04,0xe9,0x05,0x9a,0x00,0x06,0x00,0x0d,0x00,0x00,0x01,0x11,0x23,0x11,0x07,0x1b,
-0x01,0x25,0x11,0x23,0x11,0x07,0x1b,0x01,0x04,0x69,0x80,0x80,0xc0,0xc0,0xfd,0xb6,
-0x80,0x7f,0xbf,0xc1,0x04,0xd3,0xfb,0x2d,0x04,0xd3,0x39,0x01,0x00,0xff,0x00,0x38,
-0xfb,0x2e,0x04,0xd2,0x39,0x01,0x00,0xff,0x00,0x00,0x00,0x02,0x00,0x77,0x00,0x36,
-0x06,0x12,0x03,0x7f,0x00,0x06,0x00,0x0d,0x00,0x00,0x01,0x0d,0x01,0x37,0x21,0x35,
-0x21,0x03,0x0d,0x01,0x37,0x21,0x35,0x21,0x05,0x12,0x01,0x00,0xff,0x00,0x39,0xfb,
-0x2d,0x04,0xd3,0x3a,0x01,0x00,0xff,0x00,0x39,0xfb,0x2d,0x04,0xd3,0x03,0x7f,0xc0,
-0xc0,0x80,0x80,0xfe,0xb7,0xc1,0xbf,0x7f,0x80,0x00,0x00,0x02,0x01,0xa0,0x00,0x00,
-0x04,0xe9,0x05,0x9a,0x00,0x06,0x00,0x0d,0x00,0x00,0x01,0x07,0x03,0x17,0x11,0x33,
-0x11,0x25,0x0b,0x01,0x17,0x11,0x33,0x11,0x04,0xe9,0xc0,0xc0,0x80,0x80,0xfe,0xb7,
-0xc1,0xbf,0x7f,0x80,0x00,0xff,0xff,0x00,0xff,0x39,0x04,0xd3,0xfb,0x2d,0x3a,0xff,
-0x00,0x01,0x00,0x39,0x04,0xd3,0xfb,0x2d,0x00,0x02,0x00,0x78,0x00,0x9f,0x06,0x12,
-0x03,0xa0,0x00,0x04,0x00,0x09,0x00,0x00,0x09,0x01,0x37,0x21,0x3d,0x01,0x01,0x07,
-0x21,0x15,0x06,0x12,0xfe,0xc0,0x40,0xfb,0x66,0x01,0x40,0x40,0x04,0x9a,0x01,0xdf,
-0xfe,0xc0,0xc0,0x80,0x81,0x01,0x40,0xc0,0x80,0x00,0x00,0x02,0x00,0x78,0x00,0x9f,
-0x06,0x12,0x03,0xa0,0x00,0x04,0x00,0x09,0x00,0x00,0x01,0x15,0x21,0x17,0x01,0x3d,
-0x01,0x21,0x27,0x01,0x06,0x12,0xfb,0x66,0x40,0xfe,0xc0,0x04,0x9a,0x40,0x01,0x40,
-0x01,0xdf,0x80,0xc0,0x01,0x40,0x81,0x80,0xc0,0xfe,0xc0,0x00,0x00,0x01,0x00,0x64,
-0x00,0xcc,0x06,0x3f,0x04,0x38,0x00,0x0e,0x00,0x00,0x01,0x21,0x15,0x21,0x17,0x07,
-0x01,0x35,0x01,0x17,0x07,0x21,0x15,0x21,0x07,0x01,0x90,0x04,0xaf,0xfb,0xc9,0x5d,
-0x78,0xfe,0x77,0x01,0x89,0x78,0x5d,0x04,0x37,0xfb,0x51,0x69,0x02,0x19,0x78,0x5d,
-0x78,0x01,0x89,0x5a,0x01,0x89,0x78,0x5d,0x78,0x69,0x00,0x01,0x01,0xa5,0x00,0x00,
-0x05,0x11,0x05,0xdc,0x00,0x0e,0x00,0x00,0x01,0x11,0x23,0x11,0x07,0x27,0x01,0x33,
-0x01,0x07,0x27,0x11,0x23,0x11,0x27,0x02,0xf1,0x78,0x5c,0x78,0x01,0x88,0x5a,0x01,
-0x8a,0x78,0x5e,0x78,0x68,0x04,0xb0,0xfb,0x50,0x04,0x38,0x5e,0x78,0x01,0x8a,0xfe,
-0x76,0x78,0x5e,0xfb,0xc8,0x04,0xb0,0x68,0x00,0x01,0x00,0x75,0x00,0xcc,0x06,0x50,
-0x04,0x38,0x00,0x0e,0x00,0x00,0x01,0x37,0x27,0x21,0x35,0x21,0x27,0x37,0x01,0x15,
-0x01,0x27,0x37,0x21,0x35,0x05,0x24,0x69,0x69,0xfb,0x51,0x04,0x37,0x5d,0x78,0x01,
-0x89,0xfe,0x77,0x78,0x5d,0xfb,0xc9,0x02,0x19,0x69,0x69,0x78,0x5d,0x78,0xfe,0x77,
-0x5a,0xfe,0x77,0x78,0x5d,0x78,0x00,0x01,0x01,0xa5,0x00,0x00,0x05,0x11,0x05,0xdc,
-0x00,0x0e,0x00,0x00,0x01,0x17,0x37,0x11,0x33,0x11,0x37,0x17,0x01,0x23,0x01,0x37,
-0x17,0x11,0x33,0x02,0xf1,0x6a,0x68,0x78,0x5e,0x78,0xfe,0x76,0x5a,0xfe,0x78,0x78,
-0x5c,0x78,0x01,0x2c,0x68,0x68,0x04,0xb0,0xfb,0xc8,0x5e,0x78,0xfe,0x76,0x01,0x8a,
-0x78,0x5e,0x04,0x38,0x00,0x02,0x00,0x64,0x00,0xcc,0x06,0x50,0x04,0x38,0x00,0x05,
-0x00,0x15,0x00,0x00,0x01,0x21,0x37,0x27,0x21,0x07,0x05,0x21,0x17,0x07,0x01,0x35,
-0x01,0x17,0x07,0x21,0x27,0x37,0x01,0x15,0x01,0x27,0x01,0x90,0x03,0x94,0x69,0x69,
-0xfc,0x6c,0x69,0x03,0x85,0xfd,0x5c,0x5d,0x78,0xfe,0x77,0x01,0x89,0x78,0x5d,0x02,
-0xa4,0x5d,0x78,0x01,0x89,0xfe,0x77,0x78,0x02,0x19,0x69,0x69,0x69,0xe1,0x5d,0x78,
-0x01,0x89,0x5a,0x01,0x89,0x78,0x5d,0x5d,0x78,0xfe,0x77,0x5a,0xfe,0x77,0x78,0x00,
-0x00,0x02,0x00,0x10,0x00,0x00,0x05,0x68,0x05,0xd5,0x00,0x02,0x00,0x0a,0x00,0x00,
-0x25,0x01,0x21,0x13,0x01,0x33,0x13,0x21,0x13,0x33,0x01,0x02,0xbc,0x01,0x13,0xfd,
-0xdb,0xa0,0xfd,0xc6,0xd5,0x88,0x02,0xa1,0x88,0xd2,0xfd,0xc7,0xc7,0x02,0xe7,0xfc,
-0x52,0x05,0xd5,0xfe,0x81,0x01,0x7f,0xfa,0x2b,0x00,0x00,0x01,0x00,0x87,0xff,0xe3,
-0x04,0x6e,0x05,0xf0,0x00,0x1d,0x00,0x6d,0xba,0x00,0x0f,0x00,0x00,0x00,0x03,0x2b,
-0xb8,0x00,0x0f,0x10,0x41,0x1b,0x00,0x16,0x00,0x0f,0x00,0x26,0x00,0x0f,0x00,0x36,
-0x00,0x0f,0x00,0x46,0x00,0x0f,0x00,0x56,0x00,0x0f,0x00,0x66,0x00,0x0f,0x00,0x76,
-0x00,0x0f,0x00,0x86,0x00,0x0f,0x00,0x96,0x00,0x0f,0x00,0xa6,0x00,0x0f,0x00,0xb6,
-0x00,0x0f,0x00,0xc6,0x00,0x0f,0x00,0xd6,0x00,0x0f,0x00,0x0d,0x5d,0x41,0x05,0x00,
-0xe5,0x00,0x0f,0x00,0xf5,0x00,0x0f,0x00,0x02,0x5d,0x00,0xba,0x00,0x12,0x00,0x1b,
-0x00,0x03,0x2b,0xb8,0x00,0x12,0x10,0xba,0x00,0x03,0x00,0x0c,0x00,0x03,0x2b,0xb8,
-0x00,0x03,0x10,0x30,0x31,0x13,0x10,0x00,0x33,0x32,0x17,0x16,0x17,0x23,0x26,0x27,
-0x26,0x23,0x22,0x02,0x11,0x10,0x12,0x33,0x32,0x37,0x36,0x37,0x33,0x06,0x07,0x06,
-0x23,0x22,0x00,0x87,0x01,0x09,0xfb,0xfb,0x85,0x42,0x21,0xca,0x12,0x1b,0x4f,0x9d,
-0x9c,0x9d,0x9d,0x9c,0x9d,0x4f,0x1b,0x12,0xca,0x21,0x42,0x85,0xfb,0xfb,0xfe,0xf7,
-0x02,0xe9,0x01,0x7a,0x01,0x8d,0xc6,0x63,0x90,0x49,0x37,0x99,0xfe,0xcd,0xfe,0xcc,
-0xfe,0xcc,0xfe,0xcd,0x99,0x37,0x49,0x90,0x63,0xc5,0x01,0x8c,0x00,0x02,0x00,0x68,
-0xff,0xe7,0x03,0xc1,0x05,0x2d,0x00,0x1d,0x00,0x29,0x00,0x62,0x40,0x19,0x00,0x27,
-0x21,0x09,0x1b,0x06,0x27,0x15,0x06,0x0f,0x21,0x1b,0x0f,0x15,0xd5,0x2a,0x0c,0x24,
-0x03,0x00,0x1e,0x12,0x24,0x18,0x2a,0x10,0xd4,0xcc,0xdc,0xcc,0x39,0x39,0x11,0x39,
-0x31,0x00,0x10,0xe4,0xcc,0xdc,0xcc,0x10,0xce,0x10,0xce,0x11,0x12,0x39,0x11,0x12,
-0x39,0x30,0x01,0x4b,0xb0,0x0c,0x54,0x4b,0xb0,0x0b,0x54,0x5b,0x4b,0xb0,0x0e,0x54,
-0x5b,0x4b,0xb0,0x10,0x54,0x5b,0x4b,0xb0,0x14,0x54,0x5b,0x58,0xbd,0x00,0x2a,0x00,
-0x40,0x00,0x01,0x00,0x2a,0x00,0x2a,0xff,0xc0,0x38,0x11,0x37,0x38,0x59,0x01,0x3e,
-0x01,0x35,0x34,0x26,0x23,0x22,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x12,
-0x11,0x10,0x00,0x23,0x22,0x26,0x35,0x34,0x12,0x33,0x32,0x16,0x07,0x34,0x26,0x23,
-0x22,0x02,0x15,0x14,0x16,0x33,0x32,0x12,0x02,0xf4,0x0f,0x0f,0x49,0x48,0x37,0x90,
-0x24,0x24,0x30,0x90,0x65,0xb4,0xd6,0xfe,0xdf,0xd5,0x98,0xcb,0xdd,0xa2,0x65,0x82,
-0x0b,0x57,0x4f,0x6d,0x8d,0x56,0x50,0x6d,0x8d,0x02,0x6d,0x57,0xa3,0x4b,0x81,0x83,
-0x74,0x2c,0x1f,0x3e,0x62,0xfe,0xca,0xfe,0xf9,0xfe,0xb1,0xfe,0x46,0xd8,0xa3,0xc6,
-0x01,0x01,0x5b,0xe0,0x74,0x7d,0xfe,0xfe,0xcf,0x74,0x7b,0x01,0x04,0x00,0x00,0x01,
-0x00,0xc9,0x00,0x00,0x04,0x8b,0x05,0xd5,0x00,0x0b,0x00,0x00,0x01,0x11,0x21,0x35,
-0x21,0x11,0x21,0x35,0x21,0x11,0x21,0x35,0x04,0x8b,0xfc,0x3e,0x02,0xf8,0xfd,0x39,
-0x02,0xc7,0xfd,0x1a,0x05,0xd5,0xfa,0x2b,0xaa,0x02,0x1d,0xaa,0x01,0xba,0xaa,0x00,
-0x00,0x03,0x00,0x9f,0xff,0xa2,0x04,0x61,0x06,0x35,0x00,0x13,0x00,0x17,0x00,0x1b,
-0x00,0x00,0x01,0x33,0x11,0x21,0x07,0x23,0x37,0x23,0x35,0x33,0x13,0x23,0x35,0x21,
-0x13,0x21,0x35,0x21,0x37,0x33,0x01,0x21,0x11,0x21,0x37,0x21,0x11,0x23,0x03,0x68,
-0xf9,0xfd,0x3a,0x1d,0xaa,0x1d,0x40,0x75,0x88,0xde,0x01,0x13,0xa7,0xfe,0x15,0x02,
-0x1f,0x1e,0xaa,0xfe,0x4a,0x01,0xc7,0xfe,0xc1,0x35,0x01,0x0a,0x63,0x05,0xd5,0xfa,
-0x2b,0x5e,0x5e,0xaa,0x01,0xba,0xaa,0x02,0x1d,0xaa,0x60,0xfa,0x75,0x01,0xba,0xaa,
-0x02,0x1d,0x00,0x03,0x00,0x9b,0xff,0xec,0x06,0x5d,0x05,0xae,0x00,0x1b,0x00,0x28,
-0x00,0x36,0x00,0x00,0x01,0x37,0x33,0x07,0x16,0x17,0x16,0x10,0x02,0x04,0x23,0x22,
-0x27,0x26,0x27,0x07,0x23,0x37,0x26,0x27,0x26,0x10,0x12,0x24,0x33,0x32,0x17,0x16,
-0x09,0x01,0x27,0x26,0x23,0x22,0x04,0x07,0x06,0x07,0x16,0x17,0x16,0x09,0x01,0x16,
-0x17,0x16,0x33,0x32,0x24,0x37,0x36,0x37,0x26,0x27,0x26,0x05,0x08,0x59,0x6a,0x80,
-0x69,0x45,0x64,0xc8,0xfe,0xa0,0xb9,0xbb,0xb0,0x38,0x30,0x7e,0x69,0xaa,0x3f,0x2f,
-0x63,0xc6,0x01,0x60,0xbb,0xb9,0xb0,0x12,0xfc,0xc9,0x02,0xf4,0x0e,0x91,0x99,0x9a,
-0xfe,0xdd,0x52,0x51,0x01,0x01,0x51,0x24,0x03,0x67,0xfd,0x05,0x27,0x2d,0x91,0x9a,
-0x99,0x01,0x22,0x53,0x52,0x01,0x01,0x52,0x3a,0x05,0x3b,0x6e,0x9d,0x53,0x7a,0xb2,
-0xfe,0x80,0xfe,0x9d,0xbe,0x5f,0x1e,0x27,0x9c,0xd2,0x42,0x54,0xb1,0x01,0x80,0x01,
-0x63,0xbe,0x5f,0x0a,0xfb,0xe9,0x03,0xa5,0x08,0x4e,0x9d,0x93,0x91,0x9b,0x9b,0x91,
-0x40,0x03,0x44,0xfc,0x52,0x1f,0x18,0x4f,0x9d,0x93,0x91,0x9b,0x9b,0x91,0x67,0x00,
-0x00,0x02,0xff,0xfa,0x00,0x00,0x05,0x60,0x05,0xc1,0x00,0x02,0x00,0x06,0x00,0x38,
-0x40,0x0f,0x00,0x03,0x01,0x03,0x05,0x04,0x03,0x02,0x01,0x00,0x05,0x07,0x05,0x06,
-0x07,0x10,0xd4,0xcc,0x11,0x17,0x39,0x31,0x00,0x2f,0xc4,0xcc,0x11,0x39,0x30,0x40,
-0x14,0x63,0x01,0x6d,0x02,0x70,0x01,0x78,0x02,0x7f,0x02,0x79,0x05,0x76,0x06,0x07,
-0x6e,0x00,0x7f,0x00,0x02,0x5d,0x01,0x5d,0x09,0x01,0x21,0x01,0x33,0x01,0x21,0x02,
-0xac,0xfe,0x5e,0x03,0x44,0xfd,0xef,0xe0,0x02,0x43,0xfa,0x9a,0x04,0xee,0xfb,0xc4,
-0x05,0x0f,0xfa,0x3f,0x00,0x02,0xff,0xfa,0x00,0x00,0x05,0x60,0x05,0xc1,0x00,0x02,
-0x00,0x06,0x00,0x00,0x25,0x01,0x21,0x09,0x01,0x21,0x01,0x02,0xac,0x01,0xa2,0xfc,
-0xbc,0x01,0x33,0xfd,0xbd,0x05,0x66,0xfd,0xbd,0xd3,0x04,0x3c,0xfa,0xf1,0x05,0xc1,
-0xfa,0x3f,0x00,0x01,0x00,0xaf,0xff,0xec,0x06,0x49,0x05,0xae,0x00,0x1c,0x00,0x00,
-0x01,0x16,0x17,0x16,0x17,0x16,0x17,0x21,0x15,0x21,0x22,0x24,0x02,0x35,0x34,0x12,
-0x24,0x33,0x21,0x15,0x21,0x06,0x07,0x06,0x07,0x06,0x07,0x21,0x15,0x01,0x39,0x0e,
-0x3c,0x4e,0x93,0x91,0x9b,0x02,0xb9,0xfd,0x47,0xc0,0xfe,0x9d,0xbe,0xbe,0x01,0x63,
-0xc0,0x02,0xb9,0xfd,0x47,0x9b,0x91,0x93,0x4e,0x41,0x0c,0x05,0x13,0x02,0x83,0x73,
-0x6e,0x92,0x52,0x51,0x01,0x80,0xc6,0x01,0x60,0xbb,0xb9,0x01,0x60,0xc8,0x80,0x01,
-0x52,0x53,0x91,0x77,0x7d,0x80,0x00,0x03,0x00,0xaf,0xff,0x72,0x06,0x49,0x06,0x05,
-0x00,0x1c,0x00,0x25,0x00,0x2d,0x00,0x63,0x00,0xb8,0x00,0x1b,0x2f,0xba,0x00,0x16,
-0x00,0x17,0x00,0x03,0x2b,0xb8,0x00,0x16,0x10,0xba,0x00,0x0c,0x00,0x10,0x00,0x03,
-0x2b,0xb8,0x00,0x0c,0x10,0xba,0x00,0x12,0x00,0x13,0x00,0x03,0x2b,0xb8,0x00,0x12,
-0x10,0xb8,0x00,0x10,0x10,0xb8,0x00,0x0e,0xdc,0xb8,0x00,0x09,0xd0,0xb8,0x00,0x17,
-0x10,0xb8,0x00,0x1a,0xd0,0xb8,0x00,0x1a,0x2f,0xb8,0x00,0x10,0x10,0xb8,0x00,0x1d,
-0xd0,0xb8,0x00,0x0f,0x10,0xb8,0x00,0x1e,0xd0,0xb8,0x00,0x12,0x10,0xb8,0x00,0x24,
-0xd0,0xb8,0x00,0x13,0x10,0xb8,0x00,0x26,0xd0,0x30,0x31,0x25,0x26,0x27,0x26,0x02,
-0x35,0x34,0x12,0x24,0x33,0x21,0x37,0x33,0x07,0x21,0x15,0x21,0x03,0x21,0x15,0x21,
-0x03,0x21,0x15,0x21,0x22,0x27,0x07,0x23,0x01,0x23,0x06,0x07,0x06,0x07,0x06,0x07,
-0x21,0x07,0x21,0x16,0x17,0x16,0x17,0x16,0x17,0x02,0xda,0x60,0x5b,0xb2,0xbe,0xbe,
-0x01,0x63,0xc0,0x01,0x0a,0x1b,0xaa,0x1b,0x01,0x05,0xfe,0xd4,0xac,0x01,0xd8,0xfe,
-0x01,0xa6,0x02,0xa5,0xfd,0x47,0x0a,0x09,0x26,0xaa,0x01,0xc6,0xe3,0x9b,0x91,0x93,
-0x4e,0x41,0x0c,0x02,0x91,0x27,0xfd,0x99,0x0e,0x3c,0x4e,0x93,0x4d,0x4f,0x03,0x19,
-0x33,0x63,0x01,0x60,0xbb,0xb9,0x01,0x60,0xc8,0x57,0x57,0x80,0xfd,0xd5,0x80,0xfd,
-0xe9,0x80,0x01,0x7b,0x05,0xbc,0x01,0x52,0x53,0x91,0x77,0x7d,0x80,0x73,0x6e,0x92,
-0x52,0x2b,0x14,0x00,0x00,0x01,0x00,0xd9,0x00,0x9b,0x05,0x7b,0x04,0x67,0x00,0x16,
-0x00,0x00,0x25,0x20,0x24,0x35,0x34,0x24,0x29,0x01,0x15,0x21,0x22,0x07,0x06,0x07,
-0x21,0x15,0x21,0x16,0x17,0x16,0x33,0x21,0x15,0x03,0x2b,0xfe,0xd8,0xfe,0xd6,0x01,
-0x2a,0x01,0x28,0x02,0x50,0xfd,0xc9,0xf4,0x6a,0x4b,0x16,0x03,0xf6,0xfc,0x0a,0x15,
-0x4c,0x6a,0xf4,0x02,0x37,0x9b,0xf6,0xf0,0xf0,0xf6,0xad,0x4a,0x35,0x64,0xaa,0x66,
-0x35,0x4a,0xad,0x00,0x00,0x01,0x00,0xaf,0xff,0xf6,0x06,0x49,0x05,0xb8,0x00,0x1c,
-0x00,0x00,0x13,0x35,0x21,0x26,0x27,0x26,0x27,0x26,0x27,0x21,0x35,0x21,0x32,0x04,
-0x12,0x15,0x14,0x02,0x04,0x23,0x21,0x35,0x21,0x36,0x37,0x36,0x37,0x36,0x37,0xaf,
-0x05,0x13,0x0c,0x40,0x4f,0x93,0x91,0x9b,0xfd,0x47,0x02,0xb9,0xc0,0x01,0x63,0xbe,
-0xbe,0xfe,0x9d,0xc0,0xfd,0x47,0x02,0xb9,0x9b,0x91,0x93,0x4f,0x3b,0x0e,0x02,0x8d,
-0x80,0x7d,0x77,0x91,0x53,0x52,0x01,0x80,0xc8,0xfe,0xa0,0xb9,0xbb,0xfe,0xa0,0xc6,
-0x80,0x01,0x51,0x52,0x92,0x6e,0x73,0x00,0x00,0x03,0x00,0xaf,0xff,0x73,0x06,0x49,
-0x06,0x05,0x00,0x1e,0x00,0x27,0x00,0x2f,0x00,0x77,0x00,0xb8,0x00,0x01,0x2f,0xba,
-0x00,0x20,0x00,0x0e,0x00,0x03,0x2b,0xb8,0x00,0x20,0x10,0xba,0x00,0x21,0x00,0x0c,
-0x00,0x03,0x2b,0xb8,0x00,0x21,0x10,0xba,0x00,0x1d,0x00,0x1a,0x00,0x03,0x2b,0xb8,
-0x00,0x1d,0x10,0xba,0x00,0x17,0x00,0x14,0x00,0x03,0x2b,0xb8,0x00,0x17,0x10,0xb8,
-0x00,0x1d,0x10,0xb8,0x00,0x00,0xd0,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x0c,0x10,0xb8,
-0x00,0x10,0xd0,0xb8,0x00,0x20,0x10,0xb8,0x00,0x12,0xd0,0xb8,0x00,0x21,0x10,0xb8,
-0x00,0x13,0xd0,0xb8,0x00,0x1a,0x10,0xb8,0x00,0x18,0xd0,0xb8,0x00,0x18,0x2f,0xb8,
-0x00,0x14,0x10,0xb8,0x00,0x1f,0xd0,0xb8,0x00,0x17,0x10,0xb8,0x00,0x29,0xd0,0x30,
-0x31,0x01,0x37,0x33,0x07,0x16,0x17,0x16,0x12,0x15,0x14,0x02,0x04,0x2b,0x01,0x07,
-0x23,0x37,0x21,0x35,0x21,0x13,0x21,0x35,0x21,0x13,0x26,0x23,0x21,0x35,0x21,0x32,
-0x0b,0x01,0x33,0x36,0x37,0x36,0x37,0x36,0x37,0x01,0x03,0x21,0x26,0x27,0x26,0x27,
-0x26,0x03,0xbb,0x19,0xaa,0x25,0x41,0x40,0xb1,0xbe,0xbe,0xfe,0x9d,0xc0,0xca,0x28,
-0xaa,0x28,0xfe,0xbb,0x01,0x6d,0xa5,0xfd,0xee,0x02,0x3a,0xab,0x16,0x16,0xfd,0x47,
-0x02,0xb9,0x2a,0x27,0xa5,0xa2,0x9b,0x91,0x93,0x4f,0x3b,0x0e,0xfe,0x74,0xa0,0x02,
-0x2f,0x0c,0x40,0x4f,0x93,0x30,0x05,0xb3,0x52,0x77,0x16,0x24,0x64,0xfe,0xa0,0xb9,
-0xbb,0xfe,0xa0,0xc6,0x83,0x83,0x80,0x02,0x17,0x80,0x02,0x29,0x02,0x80,0xfc,0xd5,
-0xfd,0xe9,0x01,0x51,0x52,0x92,0x6e,0x73,0x02,0x85,0xfd,0xfb,0x7d,0x77,0x91,0x53,
-0x1b,0x00,0x00,0x01,0x00,0xd9,0x00,0x9b,0x05,0x7b,0x04,0x67,0x00,0x16,0x00,0x00,
-0x25,0x21,0x35,0x21,0x32,0x37,0x36,0x37,0x21,0x35,0x21,0x26,0x27,0x26,0x23,0x21,
-0x35,0x21,0x20,0x04,0x15,0x14,0x04,0x03,0x29,0xfd,0xb0,0x02,0x37,0xf4,0x6a,0x4c,
-0x15,0xfc,0x0a,0x03,0xf6,0x16,0x4b,0x6a,0xf4,0xfd,0xc9,0x02,0x50,0x01,0x28,0x01,
-0x2a,0xfe,0xd6,0x9b,0xad,0x4a,0x35,0x66,0xaa,0x64,0x35,0x4a,0xad,0xf6,0xf0,0xf0,
-0xf6,0x00,0x00,0x01,0x01,0x2c,0x00,0x00,0x03,0xeb,0x03,0xe2,0x00,0x03,0x00,0x0b,
-0x00,0xb8,0x00,0x01,0x2f,0xb8,0x00,0x00,0x2f,0x30,0x31,0x21,0x11,0x21,0x11,0x01,
-0x2c,0x02,0xbf,0x03,0xe2,0xfc,0x1e,0x00,0x00,0x01,0x00,0x9c,0xfe,0x77,0x05,0x71,
-0x05,0xc1,0x00,0x07,0x00,0x1e,0x40,0x0f,0x06,0x02,0xd7,0x04,0xd6,0x00,0xaf,0x08,
-0x03,0x67,0x01,0x05,0x67,0x00,0x08,0x10,0xd4,0xec,0xd4,0xec,0x31,0x00,0x10,0xfc,
-0xec,0xec,0x32,0x30,0x13,0x21,0x11,0x23,0x11,0x21,0x11,0x23,0x9c,0x04,0xd5,0xf0,
-0xfd,0x0a,0xef,0x05,0xc1,0xf8,0xb6,0x06,0x7d,0xf9,0x83,0x00,0x00,0x01,0x00,0x9c,
-0xfe,0x77,0x05,0x71,0x05,0xc1,0x00,0x07,0x00,0x00,0x13,0x21,0x11,0x23,0x11,0x21,
-0x11,0x23,0x9c,0x04,0xd5,0xf0,0xfd,0x0a,0xef,0xfe,0x77,0x07,0x4a,0xf9,0x83,0x06,
-0x7d,0x00,0x00,0x01,0x00,0x19,0xfe,0x77,0x05,0x3b,0x05,0xc1,0x00,0x0b,0x00,0x5d,
-0x40,0x14,0x0a,0x04,0x0c,0x02,0x05,0x07,0x02,0x00,0x07,0x0c,0x0a,0x05,0x04,0x03,
-0x01,0x00,0x06,0x06,0x08,0x0c,0x10,0xd4,0xc4,0x17,0x39,0x31,0x00,0x10,0xc4,0xd4,
-0xcc,0x10,0xce,0x11,0x12,0x39,0x39,0x30,0x40,0x30,0x51,0x03,0x56,0x05,0x50,0x05,
-0x5a,0x0a,0x73,0x03,0x70,0x03,0x76,0x04,0x75,0x05,0x70,0x05,0x7a,0x0a,0x80,0x03,
-0x80,0x05,0x0c,0x5a,0x09,0x7f,0x02,0x7f,0x03,0x70,0x05,0x70,0x06,0x7b,0x09,0x74,
-0x0b,0x8f,0x02,0x8f,0x03,0x80,0x05,0x80,0x06,0x0b,0x5d,0x01,0x5d,0x13,0x21,0x15,
-0x21,0x09,0x01,0x21,0x15,0x21,0x35,0x09,0x01,0x37,0x04,0xea,0xfc,0x41,0x02,0xa0,
-0xfd,0x4a,0x03,0xef,0xfa,0xde,0x02,0xd5,0xfd,0x49,0x05,0xc1,0xc1,0xfd,0x33,0xfd,
-0x04,0xc0,0x95,0x03,0x21,0x02,0xe3,0x00,0x00,0x01,0x00,0xd9,0x02,0x2d,0x05,0xdb,
-0x02,0xd7,0x00,0x03,0x00,0x11,0xb6,0x00,0x9c,0x02,0x04,0x01,0x00,0x04,0x10,0xd4,
-0xc4,0x31,0x00,0x10,0xd4,0xec,0x30,0x13,0x21,0x15,0x21,0xd9,0x05,0x02,0xfa,0xfe,
-0x02,0xd7,0xaa,0x00,0x00,0x02,0x00,0xd9,0x00,0x00,0x05,0xdb,0x05,0x04,0x00,0x0b,
-0x00,0x0f,0x00,0x00,0x21,0x23,0x11,0x21,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0x21,
-0x01,0x35,0x21,0x15,0x03,0xae,0xa8,0xfd,0xd3,0x02,0x2d,0xa8,0x02,0x2d,0xfd,0xd3,
-0xfd,0x2b,0x05,0x02,0x01,0x83,0xaa,0x01,0x83,0xfe,0x7d,0xaa,0x02,0xd7,0xaa,0xaa,
-0x00,0x02,0x00,0xd9,0x00,0x00,0x05,0xdb,0x05,0xd5,0x00,0x0b,0x00,0x0f,0x00,0x57,
-0xba,0x00,0x05,0x00,0x06,0x00,0x03,0x2b,0xb8,0x00,0x05,0x10,0xb8,0x00,0x00,0xd0,
-0xb8,0x00,0x06,0x10,0xb8,0x00,0x0a,0xd0,0xb8,0x00,0x06,0x10,0xb8,0x00,0x0c,0xd0,
-0xb8,0x00,0x05,0x10,0xb8,0x00,0x0d,0xd0,0x00,0xb8,0x00,0x05,0x2f,0xba,0x00,0x0d,
-0x00,0x0e,0x00,0x03,0x2b,0xb8,0x00,0x0d,0x10,0xba,0x00,0x02,0x00,0x03,0x00,0x03,
-0x2b,0xb8,0x00,0x02,0x10,0xb8,0x00,0x03,0x10,0xb8,0x00,0x07,0xd0,0xb8,0x00,0x02,
-0x10,0xb8,0x00,0x09,0xd0,0x30,0x31,0x01,0x11,0x21,0x15,0x21,0x11,0x23,0x11,0x21,
-0x35,0x21,0x19,0x01,0x33,0x15,0x23,0x03,0xae,0x02,0x2d,0xfd,0xd3,0xa8,0xfd,0xd3,
-0x02,0x2d,0xa8,0xa8,0x04,0xa0,0xfe,0x05,0xaa,0xfe,0x05,0x01,0xfb,0xaa,0x01,0xfb,
-0x01,0x35,0xcc,0x00,0x00,0x01,0xfe,0x89,0xff,0xe3,0x02,0xcd,0x05,0xf0,0x00,0x03,
-0x00,0x2b,0x40,0x13,0x00,0x0f,0x01,0x02,0x01,0x02,0x0f,0x03,0x00,0x03,0x42,0x02,
-0x8c,0x00,0x91,0x04,0x01,0x03,0x04,0x10,0xd4,0xcc,0x31,0x00,0x10,0xe4,0xe4,0x30,
-0x4b,0x53,0x58,0x07,0x10,0x05,0xed,0x07,0x10,0x05,0xed,0x59,0x22,0x01,0x33,0x01,
-0x23,0x02,0x2d,0xa0,0xfc,0x5c,0xa0,0x05,0xf0,0xf9,0xf3,0x00,0xff,0xff,0x01,0x8a,
-0xff,0x92,0x04,0x3c,0x06,0x25,0x10,0x03,0x00,0x3f,0x01,0x8a,0x00,0x50,0xff,0xff,
-0x00,0xbe,0x00,0xaf,0x04,0x44,0x04,0x55,0x10,0x07,0x00,0x0d,0x00,0x81,0xfe,0x65,
-0xff,0xff,0x01,0x44,0x01,0x47,0x03,0xbe,0x03,0xc2,0x10,0x07,0x00,0x72,0x00,0x81,
-0xfd,0xd2,0x00,0x01,0x00,0xdb,0x02,0x48,0x01,0xae,0x03,0x46,0x00,0x03,0x00,0x12,
-0xb7,0x02,0x83,0x00,0x04,0x01,0x19,0x00,0x04,0x10,0xd4,0xec,0x31,0x00,0x10,0xd4,
-0xec,0x30,0x13,0x33,0x15,0x23,0xdb,0xd3,0xd3,0x03,0x46,0xfe,0x00,0x01,0x00,0x3d,
-0xff,0xd7,0x05,0x19,0x06,0x7d,0x00,0x0a,0x00,0x2a,0x40,0x18,0x0a,0x09,0x08,0x07,
-0x06,0x05,0x0b,0x02,0x04,0x02,0x00,0x0b,0x0a,0x09,0x07,0x06,0x05,0x04,0x03,0x00,
-0x08,0x01,0x08,0x0b,0x10,0xd4,0xcc,0x17,0x39,0x31,0x00,0x10,0xd4,0xcc,0xc4,0x11,
-0x12,0x17,0x39,0x30,0x01,0x33,0x15,0x23,0x01,0x23,0x01,0x07,0x27,0x25,0x01,0x04,
-0x5c,0xbd,0x73,0xfd,0xae,0x42,0xfe,0xc1,0x7d,0x19,0x01,0x1b,0x01,0x00,0x06,0x7d,
-0x60,0xf9,0xba,0x03,0x73,0x2d,0x50,0x62,0xfd,0x3b,0xff,0xff,0x00,0x3d,0xff,0xd7,
-0x05,0x19,0x07,0xd0,0x12,0x22,0x08,0x8b,0x00,0x00,0x10,0x03,0x00,0x75,0x00,0x73,
-0x01,0xe0,0xff,0xff,0x00,0x3d,0xff,0xd7,0x05,0x19,0x07,0xbf,0x12,0x22,0x08,0x8b,
-0x00,0x00,0x10,0x03,0x07,0xba,0x00,0x73,0x01,0xe0,0x00,0x02,0x00,0xdd,0x00,0xdd,
-0x04,0x8d,0x03,0xee,0x00,0x0b,0x00,0x25,0x00,0x00,0x01,0x2e,0x01,0x23,0x22,0x06,
-0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x22,0x26,0x27,0x0e,0x01,0x23,0x22,0x26,0x35,
-0x34,0x36,0x33,0x32,0x16,0x17,0x3e,0x01,0x33,0x15,0x22,0x06,0x07,0x1e,0x01,0x33,
-0x03,0x19,0x31,0x85,0x55,0x66,0x7f,0x76,0x59,0x52,0x86,0x01,0xbd,0x49,0x95,0x4f,
-0x46,0x9d,0x5e,0x88,0xba,0xa7,0x86,0x5f,0x99,0x48,0x44,0x9e,0x61,0x2b,0x85,0x4a,
-0x31,0x86,0x43,0x02,0x9a,0x58,0x58,0x84,0x6a,0x65,0x86,0x88,0xfe,0xe8,0x77,0x8b,
-0x87,0x7f,0xdf,0xa6,0xaf,0xd8,0x7e,0x8a,0x8a,0x83,0x96,0x87,0xa2,0x58,0x5a,0x00,
-0x00,0x03,0x00,0xdd,0x00,0xdd,0x05,0xcf,0x03,0xee,0x00,0x0b,0x00,0x17,0x00,0x2f,
-0x00,0xff,0x40,0x1d,0x2d,0x1b,0x15,0x09,0x21,0x03,0x00,0x24,0x18,0x04,0x15,0x0f,
-0x27,0x21,0x15,0x1b,0x0f,0x21,0x30,0x0c,0x00,0x24,0x18,0x12,0x06,0x2a,0x12,0x1e,
-0x30,0x10,0xd4,0xc4,0xd4,0xc4,0x11,0x39,0x39,0x39,0x39,0x31,0x00,0x10,0xd4,0xc4,
-0xd4,0xc4,0x10,0xc0,0x11,0x12,0x17,0x39,0x12,0x39,0x11,0x12,0x39,0x30,0x40,0xbe,
-0x05,0x02,0x05,0x03,0x05,0x04,0x00,0x05,0x00,0x06,0x00,0x07,0x05,0x08,0x05,0x09,
-0x05,0x0a,0x0a,0x10,0x0f,0x11,0x0f,0x12,0x0f,0x13,0x0a,0x14,0x15,0x02,0x15,0x03,
-0x15,0x04,0x10,0x05,0x10,0x06,0x10,0x07,0x15,0x08,0x15,0x09,0x15,0x0a,0x1a,0x0e,
-0x1a,0x0f,0x1a,0x10,0x1f,0x11,0x1f,0x12,0x1f,0x13,0x1a,0x14,0x1a,0x15,0x1a,0x16,
-0x24,0x02,0x24,0x03,0x24,0x04,0x20,0x05,0x20,0x06,0x20,0x07,0x24,0x08,0x24,0x09,
-0x24,0x0a,0x2a,0x0e,0x2a,0x0f,0x2a,0x10,0x2f,0x11,0x2f,0x12,0x2f,0x13,0x2a,0x14,
-0x2a,0x15,0x2a,0x16,0x35,0x02,0x35,0x03,0x35,0x04,0x30,0x05,0x30,0x06,0x30,0x07,
-0x35,0x08,0x35,0x09,0x35,0x0a,0x3a,0x0e,0x3a,0x0f,0x3a,0x10,0x3f,0x11,0x3f,0x12,
-0x3f,0x13,0x3a,0x14,0x3a,0x15,0x3a,0x16,0x45,0x02,0x45,0x03,0x45,0x04,0x40,0x05,
-0x40,0x06,0x40,0x07,0x45,0x08,0x45,0x09,0x45,0x0a,0x4a,0x0e,0x4a,0x0f,0x4a,0x10,
-0x4f,0x11,0x4f,0x12,0x4f,0x13,0x4a,0x14,0x4a,0x15,0x4a,0x16,0x56,0xb4,0x1f,0xb0,
-0x20,0xb0,0x21,0xb0,0x22,0xb0,0x26,0xb0,0x27,0xb0,0x28,0xb4,0x29,0x08,0x5d,0x01,
-0x5d,0x01,0x1e,0x01,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x2e,0x01,
-0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x17,0x0e,0x01,0x23,0x22,0x26,0x35,
-0x34,0x36,0x33,0x32,0x16,0x17,0x3e,0x01,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,
-0x26,0x03,0x93,0x31,0x86,0x54,0x65,0x80,0x76,0x59,0x52,0x85,0xc4,0x31,0x85,0x55,
-0x66,0x7f,0x76,0x59,0x52,0x86,0x90,0x46,0x9d,0x5e,0x88,0xba,0xa7,0x86,0x5f,0x99,
-0x48,0x44,0x9e,0x61,0x86,0xbc,0xa7,0x86,0x5e,0x95,0x02,0x2f,0x58,0x5a,0x87,0x69,
-0x65,0x86,0x87,0x37,0x58,0x58,0x84,0x6a,0x65,0x86,0x88,0x16,0x87,0x7f,0xdf,0xa6,
-0xaf,0xd8,0x7e,0x8a,0x8a,0x83,0xe1,0xa7,0xaf,0xd6,0x77,0x00,0x00,0x01,0x01,0x1b,
-0x00,0xcb,0x05,0x99,0x05,0x49,0x00,0x05,0x00,0x00,0x25,0x21,0x11,0x33,0x11,0x21,
-0x05,0x99,0xfb,0x82,0xaa,0x03,0xd4,0xcb,0x04,0x7e,0xfc,0x2c,0x00,0x01,0x01,0x1b,
-0x00,0xcb,0x05,0x99,0x05,0x49,0x00,0x05,0x00,0x00,0x25,0x21,0x01,0x33,0x01,0x21,
-0x05,0x99,0xfb,0x82,0x03,0xc0,0xaa,0xfc,0xcd,0x03,0x47,0xcb,0x04,0x7e,0xfc,0x2c,
-0x00,0x02,0x00,0xaf,0xff,0x94,0x06,0x49,0x05,0xd5,0x00,0x05,0x00,0x1b,0x00,0x41,
-0x00,0xb8,0x00,0x07,0x2f,0xb8,0x00,0x12,0x2f,0xba,0x00,0x0e,0x00,0x0f,0x00,0x03,
-0x2b,0xb8,0x00,0x0e,0x10,0xb8,0x00,0x00,0xd0,0xba,0x00,0x04,0x00,0x12,0x00,0x07,
-0x11,0x12,0x39,0xba,0x00,0x05,0x00,0x12,0x00,0x07,0x11,0x12,0x39,0xb8,0x00,0x0f,
-0x10,0xb8,0x00,0x15,0xd0,0xba,0x00,0x16,0x00,0x12,0x00,0x07,0x11,0x12,0x39,0x30,
-0x31,0x25,0x26,0x27,0x26,0x27,0x01,0x13,0x01,0x33,0x01,0x16,0x17,0x16,0x17,0x21,
-0x15,0x21,0x16,0x15,0x23,0x34,0x27,0x21,0x01,0x26,0x27,0x37,0x16,0x04,0x60,0x27,
-0x4a,0x41,0x57,0xfe,0xce,0xe3,0x01,0x60,0xf2,0xfe,0x4c,0x71,0x52,0x5d,0x2b,0x01,
-0x58,0xfe,0xc9,0x04,0x8c,0x05,0xfc,0x2a,0x02,0x0d,0x1e,0x1f,0x50,0x1d,0xca,0x8b,
-0x86,0x73,0x5e,0xfe,0x1e,0x02,0xe3,0x02,0x28,0xfd,0x52,0x73,0x93,0xa7,0xb0,0xca,
-0x35,0x37,0x37,0x35,0x03,0x36,0x15,0x14,0x75,0x13,0x00,0x02,0x00,0xed,0xff,0xfa,
-0x05,0xdc,0x05,0xd1,0x00,0x17,0x00,0x1d,0x00,0x35,0xba,0x00,0x0d,0x00,0x1c,0x00,
-0x03,0x2b,0xb8,0x00,0x0d,0x10,0x00,0xb8,0x00,0x09,0x2f,0xb8,0x00,0x12,0x2f,0xba,
-0x00,0x05,0x00,0x12,0x00,0x09,0x11,0x12,0x39,0xba,0x00,0x16,0x00,0x12,0x00,0x09,
-0x11,0x12,0x39,0xba,0x00,0x19,0x00,0x12,0x00,0x09,0x11,0x12,0x39,0x30,0x31,0x09,
-0x01,0x37,0x01,0x26,0x27,0x37,0x16,0x17,0x25,0x15,0x05,0x16,0x07,0x15,0x06,0x07,
-0x05,0x15,0x25,0x06,0x07,0x27,0x36,0x13,0x09,0x01,0x36,0x37,0x36,0x03,0x72,0xfd,
-0x7b,0x02,0x02,0x8e,0x19,0x1d,0x8b,0x1d,0x19,0x01,0xd4,0xfe,0x8a,0x45,0x06,0x07,
-0x47,0x01,0x85,0xfe,0x25,0x1c,0x1e,0x86,0x1f,0x79,0xfd,0xdd,0x02,0x1a,0x34,0x04,
-0x07,0x01,0x34,0x01,0x52,0xc0,0x01,0x57,0x21,0x1e,0x4c,0x21,0x24,0xee,0xd2,0xbe,
-0xb3,0xc6,0x09,0xa1,0x93,0xbf,0xd2,0xf1,0x26,0x21,0x4c,0x20,0x02,0xe9,0xfe,0xe7,
-0xfe,0xf0,0x7b,0x81,0x9e,0x00,0x00,0x01,0x01,0xb0,0xfe,0x4a,0x02,0x50,0x06,0x2b,
-0x00,0x03,0x00,0x00,0x01,0x33,0x11,0x23,0x01,0xb0,0xa0,0xa0,0x06,0x2b,0xf8,0x1f,
-0x00,0x01,0x00,0x66,0xfe,0x4a,0x03,0x9b,0x06,0x2b,0x00,0x0b,0x00,0x37,0xba,0x00,
-0x06,0x00,0x00,0x00,0x03,0x2b,0xb8,0x00,0x06,0x10,0xb8,0x00,0x02,0xd0,0xb8,0x00,
-0x00,0x10,0xb8,0x00,0x08,0xd0,0x00,0xb8,0x00,0x01,0x2f,0xb8,0x00,0x07,0x2f,0xba,
-0x00,0x03,0x00,0x07,0x00,0x01,0x11,0x12,0x39,0xba,0x00,0x09,0x00,0x07,0x00,0x01,
-0x11,0x12,0x39,0x30,0x31,0x01,0x11,0x33,0x11,0x37,0x17,0x05,0x11,0x23,0x11,0x07,
-0x27,0x01,0xb0,0xa0,0xfb,0x50,0xfe,0xb5,0xa0,0xfd,0x4d,0x02,0x56,0x03,0xd5,0xfc,
-0x9c,0xb0,0x6f,0xe7,0xfc,0x29,0x03,0x67,0xb1,0x6e,0x00,0x02,0x01,0x10,0xfe,0x4a,
-0x02,0xf0,0x06,0x2b,0x00,0x03,0x00,0x07,0x00,0x00,0x01,0x33,0x11,0x23,0x01,0x33,
-0x11,0x23,0x01,0x10,0xa0,0xa0,0x01,0x40,0xa0,0xa0,0x06,0x2b,0xf8,0x1f,0x07,0xe1,
-0xf8,0x1f,0x00,0x01,0x00,0x66,0xfe,0x4a,0x03,0x9b,0x06,0x2b,0x00,0x13,0x00,0x7b,
-0xb8,0x00,0x14,0x2f,0xb8,0x00,0x15,0x2f,0xb8,0x00,0x14,0x10,0xb8,0x00,0x00,0xd0,
-0xb8,0x00,0x00,0x2f,0xb8,0x00,0x0e,0xdc,0xb8,0x00,0x02,0xd0,0xb8,0x00,0x15,0x10,
-0xb8,0x00,0x0a,0xdc,0xb8,0x00,0x04,0xdc,0xb8,0x00,0x0a,0x10,0xb8,0x00,0x06,0xd0,
-0xb8,0x00,0x04,0x10,0xb8,0x00,0x0c,0xd0,0xb8,0x00,0x00,0x10,0xb8,0x00,0x10,0xd0,
-0x00,0xb8,0x00,0x01,0x2f,0xb8,0x00,0x05,0x2f,0xb8,0x00,0x0b,0x2f,0xb8,0x00,0x0f,
-0x2f,0xba,0x00,0x03,0x00,0x0b,0x00,0x01,0x11,0x12,0x39,0xba,0x00,0x07,0x00,0x0b,
-0x00,0x01,0x11,0x12,0x39,0xba,0x00,0x0d,0x00,0x0b,0x00,0x01,0x11,0x12,0x39,0xba,
-0x00,0x11,0x00,0x0b,0x00,0x01,0x11,0x12,0x39,0x30,0x31,0x01,0x11,0x33,0x11,0x37,
-0x11,0x33,0x11,0x37,0x17,0x07,0x11,0x23,0x11,0x07,0x11,0x23,0x11,0x07,0x27,0x01,
-0x10,0xa0,0xa0,0xa0,0x5b,0x50,0xab,0xa0,0xa0,0xa0,0x5d,0x4d,0x01,0xe6,0x04,0x45,
-0xfc,0x2b,0x71,0x03,0x64,0xfd,0x0c,0x40,0x6f,0x78,0xfb,0xba,0x03,0xd7,0x70,0xfc,
-0x99,0x02,0xf7,0x41,0x6e,0x00,0x00,0x01,0x01,0x07,0x00,0x00,0x04,0xd4,0x04,0xa2,
-0x00,0x06,0x00,0x00,0x21,0x01,0x33,0x01,0x23,0x09,0x01,0x01,0x08,0x01,0x69,0xfa,
-0x01,0x68,0xc3,0xfe,0xde,0xfe,0xdd,0x04,0xa2,0xfb,0x5e,0x03,0xac,0xfc,0x54,0x00,
-0x00,0x01,0x01,0x07,0x00,0x00,0x04,0xd4,0x04,0xa2,0x00,0x06,0x00,0x00,0x01,0x33,
-0x09,0x01,0x33,0x01,0x23,0x01,0x08,0xc3,0x01,0x23,0x01,0x22,0xc3,0xfe,0x98,0xfa,
-0x04,0xa2,0xfc,0x54,0x03,0xac,0xfb,0x5e,0x00,0x01,0x01,0x07,0x00,0x00,0x04,0xd4,
-0x04,0xa2,0x00,0x11,0x00,0x00,0x01,0x10,0x12,0x33,0x32,0x12,0x19,0x01,0x23,0x11,
-0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x01,0x08,0xf5,0xf1,0xf0,0xf5,0xac,0x94,
-0xa5,0xa6,0x94,0xac,0x02,0x50,0x01,0x28,0x01,0x2a,0xfe,0xd6,0xfe,0xd8,0xfd,0xb0,
-0x02,0x37,0xf4,0xd3,0xd3,0xf4,0xfd,0xc9,0x00,0x01,0x01,0x07,0x00,0x00,0x04,0xd4,
-0x04,0xa2,0x00,0x11,0x00,0x00,0x01,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,
-0x11,0x33,0x11,0x10,0x02,0x23,0x22,0x02,0x01,0x08,0xac,0x94,0xa6,0xa5,0x94,0xac,
-0xf5,0xf0,0xf1,0xf5,0x02,0x52,0x02,0x50,0xfd,0xc9,0xf4,0xd3,0xd3,0xf4,0x02,0x37,
-0xfd,0xb0,0xfe,0xd8,0xfe,0xd6,0x01,0x2a,0x00,0x01,0x00,0x2f,0xfe,0x8d,0x03,0xfa,
-0x06,0x0e,0x00,0x25,0x00,0x26,0x40,0x14,0x20,0xdb,0x00,0x1a,0x0d,0xdb,0x13,0x1a,
-0xdc,0x07,0xb1,0x26,0x0a,0x69,0x17,0x6a,0x1d,0x69,0x04,0x26,0x10,0xdc,0xec,0xfc,
-0xec,0x31,0x00,0x10,0xfc,0xec,0xdc,0xe4,0x10,0xde,0xe4,0x30,0x01,0x32,0x13,0x36,
-0x37,0x1a,0x01,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x2e,0x01,0x23,
-0x22,0x03,0x06,0x07,0x0a,0x01,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,
-0x1e,0x01,0x01,0x37,0x6a,0x0e,0x02,0x01,0x0c,0xbe,0xca,0x50,0x64,0x40,0x37,0x2a,
-0x38,0x0c,0x06,0x09,0x10,0x6b,0x0e,0x04,0x04,0x11,0xbd,0xc4,0x4f,0x65,0x44,0x3d,
-0x21,0x30,0x0f,0x0a,0x0a,0xfe,0xfa,0x02,0xb0,0x6c,0x39,0x02,0x03,0x01,0xbc,0x54,
-0x41,0x36,0x3f,0x26,0x23,0x0f,0x48,0xfd,0x95,0xc1,0x6e,0xfe,0x21,0xfe,0x62,0x53,
-0x41,0x38,0x3f,0x1d,0x1c,0x12,0x53,0x00,0xff,0xff,0x00,0x2f,0xfe,0x8d,0x06,0x9f,
-0x06,0x0e,0x10,0x26,0x08,0x9c,0x00,0x00,0x10,0x07,0x08,0x9c,0x02,0xa5,0x00,0x00,
-0xff,0xff,0x00,0x2f,0xfe,0x8d,0x09,0x44,0x06,0x0e,0x10,0x26,0x08,0x9c,0x00,0x00,
-0x10,0x27,0x08,0x9c,0x02,0xa5,0x00,0x00,0x10,0x07,0x08,0x9c,0x05,0x4a,0x00,0x00,
-0xff,0xff,0x00,0x79,0x00,0xcd,0x04,0x9e,0x04,0xd5,0x10,0x27,0x08,0x8a,0xff,0x9e,
-0xfe,0x85,0x10,0x27,0x08,0x8a,0x02,0xf0,0xfe,0x85,0x10,0x07,0x08,0x8a,0x01,0x47,
-0x01,0x8f,0xff,0xff,0x00,0x79,0x00,0xcd,0x04,0x9e,0x04,0xd5,0x10,0x27,0x08,0x8a,
-0x01,0x47,0xfe,0x85,0x10,0x27,0x08,0x8a,0x02,0xf0,0x01,0x8f,0x10,0x07,0x08,0x8a,
-0xff,0x9e,0x01,0x8f,0xff,0xff,0x00,0xa1,0x00,0xcd,0x01,0x74,0x04,0xd6,0x10,0x27,
-0x08,0x8a,0xff,0xc6,0x01,0x90,0x10,0x07,0x08,0x8a,0xff,0xc6,0xfe,0x85,0xff,0xff,
-0x00,0x79,0x00,0xcd,0x04,0x9e,0x04,0xd5,0x10,0x27,0x08,0x8a,0x02,0xf0,0x01,0x8f,
-0x10,0x27,0x08,0x8a,0xff,0x9e,0x01,0x8f,0x10,0x27,0x08,0x8a,0x02,0xf0,0xfe,0x85,
-0x10,0x07,0x08,0x8a,0xff,0x9e,0xfe,0x85,0xff,0xff,0x00,0xd9,0x02,0x2d,0x05,0xdb,
-0x04,0x6a,0x10,0x27,0x08,0x8a,0x02,0x14,0x01,0x24,0x10,0x06,0x08,0x83,0x00,0x00,
-0x00,0x03,0x00,0xd9,0x00,0x9f,0x05,0xdc,0x04,0x6a,0x00,0x03,0x00,0x07,0x00,0x0b,
-0x00,0x00,0x13,0x21,0x15,0x21,0x01,0x33,0x15,0x23,0x03,0x33,0x15,0x23,0xd9,0x03,
-0x58,0xfc,0xa8,0x04,0x30,0xd3,0xd3,0x01,0xd3,0xd3,0x02,0xd7,0xaa,0x02,0x3d,0xfe,
-0xfe,0x31,0xfe,0x00,0xff,0xff,0x00,0xd8,0x00,0x9f,0x05,0xdc,0x04,0x6a,0x10,0x26,
-0x08,0x83,0x00,0x00,0x10,0x27,0x08,0x8a,0xff,0xfd,0xfe,0x57,0x10,0x27,0x08,0x8a,
-0xff,0xfe,0x01,0x24,0x10,0x27,0x08,0x8a,0x04,0x2d,0xfe,0x57,0x10,0x07,0x08,0x8a,
-0x04,0x2e,0x01,0x24,0xff,0xff,0x00,0xd9,0x00,0x9f,0x05,0xdb,0x04,0x6a,0x10,0x26,
-0x08,0xa7,0x00,0x00,0x10,0x27,0x08,0x8a,0x02,0x13,0xfe,0x57,0x10,0x07,0x08,0x8a,
-0x02,0x14,0x01,0x24,0x00,0x01,0x00,0xd9,0x01,0xd3,0x05,0xdb,0x03,0x32,0x00,0x1d,
-0x00,0x00,0x01,0x15,0x0e,0x01,0x23,0x22,0x27,0x26,0x27,0x26,0x27,0x26,0x23,0x22,
-0x06,0x07,0x35,0x3e,0x01,0x33,0x32,0x17,0x16,0x17,0x16,0x17,0x16,0x33,0x32,0x36,
-0x05,0xdb,0x69,0xb3,0x61,0x6e,0x92,0x0a,0x07,0x06,0x0f,0x9b,0x5e,0x58,0xac,0x62,
-0x69,0xb3,0x61,0x6e,0x93,0x0b,0x05,0x06,0x0f,0x9b,0x5e,0x56,0xa9,0x03,0x32,0xb3,
-0x4e,0x45,0x3b,0x04,0x03,0x02,0x06,0x3d,0x4c,0x54,0xb3,0x4e,0x45,0x3b,0x05,0x02,
-0x02,0x06,0x3d,0x4b,0x00,0x01,0x00,0xd9,0x01,0xd3,0x05,0xdb,0x03,0x32,0x00,0x1d,
-0x00,0x00,0x13,0x1e,0x01,0x33,0x32,0x37,0x36,0x37,0x36,0x37,0x36,0x33,0x32,0x16,
-0x17,0x15,0x2e,0x01,0x23,0x22,0x07,0x06,0x07,0x06,0x07,0x06,0x23,0x22,0x26,0x27,
-0xd9,0x67,0xa9,0x56,0x5e,0x9b,0x0f,0x06,0x05,0x0b,0x93,0x6e,0x61,0xb3,0x69,0x62,
-0xac,0x58,0x5e,0x9b,0x0f,0x06,0x07,0x0a,0x92,0x6e,0x61,0xb3,0x69,0x03,0x32,0x55,
-0x4b,0x3d,0x06,0x02,0x02,0x05,0x3b,0x45,0x4e,0xb3,0x54,0x4c,0x3d,0x06,0x02,0x03,
-0x04,0x3b,0x45,0x4e,0x00,0x01,0x00,0xd9,0x00,0x98,0x05,0xdb,0x04,0x6e,0x00,0x1b,
-0x00,0x00,0x01,0x26,0x23,0x22,0x06,0x07,0x35,0x3e,0x01,0x33,0x32,0x17,0x13,0x17,
-0x03,0x16,0x33,0x32,0x36,0x37,0x15,0x0e,0x01,0x23,0x22,0x27,0x03,0x27,0x02,0xde,
-0x5e,0x41,0x58,0xac,0x62,0x69,0xb3,0x61,0x5a,0x72,0xa9,0xae,0xa3,0x5e,0x41,0x56,
-0xa9,0x67,0x69,0xb3,0x61,0x5a,0x73,0xa8,0xae,0x02,0x56,0x1d,0x4c,0x54,0xb3,0x4e,
-0x45,0x27,0x01,0x7c,0x4d,0xfe,0x8e,0x1d,0x4b,0x55,0xb3,0x4e,0x45,0x28,0xfe,0x84,
-0x4c,0x00,0x00,0x02,0x00,0xd9,0x01,0x10,0x05,0xdb,0x03,0xa2,0x00,0x1c,0x00,0x20,
-0x00,0x00,0x01,0x15,0x0e,0x01,0x23,0x22,0x2f,0x01,0x26,0x27,0x26,0x23,0x22,0x06,
-0x07,0x35,0x3e,0x01,0x33,0x32,0x17,0x16,0x17,0x16,0x17,0x16,0x33,0x32,0x36,0x01,
-0x21,0x15,0x21,0x05,0xdb,0x69,0xb3,0x61,0x6e,0x92,0x11,0x06,0x0f,0x9b,0x5e,0x58,
-0xac,0x62,0x69,0xb3,0x61,0x6e,0x93,0x0b,0x05,0x06,0x0f,0x9b,0x5e,0x56,0xa9,0xfb,
-0x65,0x05,0x02,0xfa,0xfe,0x02,0x6f,0xb3,0x4e,0x45,0x3b,0x07,0x02,0x06,0x3d,0x4c,
-0x54,0xb3,0x4e,0x45,0x3b,0x05,0x02,0x02,0x06,0x3d,0x4b,0x01,0x88,0xa8,0x00,0x02,
-0x00,0xd9,0x01,0x60,0x05,0xdb,0x03,0xf4,0x00,0x1a,0x00,0x1e,0x00,0x00,0x01,0x15,
-0x0e,0x01,0x23,0x22,0x2f,0x01,0x26,0x27,0x26,0x23,0x22,0x06,0x07,0x35,0x3e,0x01,
-0x33,0x32,0x1f,0x02,0x16,0x33,0x32,0x36,0x01,0x21,0x15,0x21,0x05,0xdb,0x69,0xb3,
-0x61,0x6e,0x92,0x11,0x06,0x0f,0x9b,0x5e,0x58,0xac,0x62,0x69,0xb3,0x61,0x6e,0x93,
-0x0f,0x16,0x9b,0x5e,0x56,0xa9,0xfb,0x65,0x05,0x02,0xfa,0xfe,0x03,0xf4,0xb2,0x4f,
-0x45,0x3b,0x07,0x02,0x06,0x3d,0x4c,0x53,0xb2,0x4e,0x45,0x3b,0x06,0x09,0x3d,0x4b,
-0xfe,0x6b,0xaa,0x00,0x00,0x02,0x00,0xd9,0x00,0x61,0x05,0xdb,0x04,0xd3,0x00,0x24,
-0x00,0x25,0x00,0x00,0x01,0x03,0x16,0x37,0x36,0x37,0x15,0x0e,0x01,0x23,0x22,0x27,
-0x07,0x21,0x15,0x21,0x07,0x27,0x37,0x21,0x35,0x21,0x37,0x26,0x23,0x22,0x06,0x07,
-0x35,0x3e,0x01,0x33,0x32,0x1f,0x02,0x13,0x01,0x05,0x03,0xcb,0x5e,0x8a,0xaf,0x0c,
-0x69,0xb3,0x61,0x42,0x50,0x90,0x02,0x9f,0xfc,0xef,0xb9,0x89,0x6c,0xfe,0xe5,0x01,
-0x99,0xb8,0x91,0x5a,0x58,0xac,0x62,0x69,0xb3,0x61,0x6e,0x93,0x0f,0x24,0xef,0xfd,
-0x7d,0x04,0x6f,0xfe,0xe9,0x22,0x44,0x58,0x22,0xb2,0x4f,0x45,0x16,0xba,0xaa,0xfe,
-0x64,0x9a,0xaa,0xf3,0x38,0x4c,0x53,0xb2,0x4e,0x45,0x3b,0x06,0x10,0x01,0x49,0xfc,
-0x8d,0x00,0x00,0x03,0x00,0xd9,0x00,0xb8,0x05,0xdb,0x04,0xc1,0x00,0x1a,0x00,0x1e,
-0x00,0x22,0x00,0x00,0x01,0x15,0x0e,0x01,0x23,0x22,0x2f,0x01,0x26,0x27,0x26,0x23,
-0x22,0x06,0x07,0x35,0x3e,0x01,0x33,0x32,0x1f,0x02,0x16,0x33,0x32,0x36,0x01,0x21,
-0x15,0x21,0x15,0x21,0x15,0x21,0x05,0xdb,0x69,0xb3,0x61,0x6e,0x92,0x11,0x06,0x0f,
-0x9b,0x5e,0x58,0xac,0x62,0x69,0xb3,0x61,0x6e,0x93,0x0f,0x16,0x9b,0x5e,0x56,0xa9,
-0xfb,0x65,0x05,0x02,0xfa,0xfe,0x05,0x02,0xfa,0xfe,0x04,0xc1,0xb2,0x4f,0x45,0x3b,
-0x07,0x02,0x06,0x3d,0x4c,0x53,0xb2,0x4e,0x45,0x3b,0x06,0x07,0x3f,0x4b,0xfe,0x6b,
-0xaa,0xcb,0xaa,0x00,0x00,0x02,0x00,0xd9,0x00,0x17,0x05,0xdb,0x04,0xc1,0x00,0x1a,
-0x00,0x2e,0x00,0x00,0x01,0x15,0x0e,0x01,0x23,0x22,0x2f,0x01,0x26,0x27,0x26,0x23,
-0x22,0x06,0x07,0x35,0x3e,0x01,0x33,0x32,0x1f,0x02,0x16,0x33,0x32,0x36,0x01,0x23,
-0x35,0x21,0x37,0x21,0x35,0x21,0x37,0x17,0x07,0x21,0x15,0x21,0x07,0x21,0x15,0x21,
-0x07,0x27,0x05,0xdb,0x69,0xb3,0x61,0x6e,0x92,0x11,0x06,0x0f,0x9b,0x5e,0x58,0xac,
-0x62,0x69,0xb3,0x61,0x6e,0x93,0x0f,0x16,0x9b,0x5e,0x56,0xa9,0xfc,0x4c,0xe7,0x01,
-0x95,0xd1,0xfd,0x9a,0x03,0x19,0x8c,0x6f,0x13,0x01,0x01,0xfe,0x4b,0xd0,0x02,0x85,
-0xfc,0xc9,0xa6,0x6f,0x04,0xc1,0xb2,0x4f,0x45,0x3b,0x07,0x02,0x06,0x3d,0x4c,0x53,
-0xb2,0x4e,0x45,0x3b,0x06,0x07,0x3f,0x4b,0xfc,0x4c,0xaa,0xcb,0xaa,0x8a,0x73,0x17,
-0xaa,0xcb,0xaa,0xa0,0x73,0x00,0x00,0x01,0x00,0xd9,0xff,0xf5,0x05,0xdb,0x05,0x43,
-0x00,0x33,0x00,0x00,0x01,0x16,0x33,0x32,0x36,0x37,0x15,0x0e,0x01,0x23,0x22,0x27,
-0x07,0x21,0x15,0x21,0x07,0x21,0x15,0x21,0x07,0x27,0x37,0x23,0x35,0x21,0x37,0x21,
-0x35,0x21,0x37,0x2f,0x01,0x26,0x27,0x26,0x23,0x22,0x06,0x07,0x35,0x3e,0x01,0x33,
-0x32,0x1f,0x02,0x16,0x17,0x37,0x17,0x04,0x62,0x0a,0x09,0x56,0xa9,0x67,0x69,0xb3,
-0x61,0x27,0x2b,0x5c,0x02,0x2b,0xfd,0x7a,0x6c,0x02,0xf2,0xfc,0xb3,0x68,0x92,0x3e,
-0xf9,0x01,0x54,0x6d,0xfe,0x3f,0x02,0x1c,0x75,0x0c,0x11,0x06,0x0f,0x9b,0x5e,0x58,
-0xac,0x62,0x69,0xb3,0x61,0x6e,0x93,0x0f,0x16,0x20,0x1e,0x86,0x92,0x04,0x22,0x01,
-0x4b,0x55,0xb2,0x4f,0x45,0x07,0xab,0xaa,0xcb,0xaa,0xc2,0x4e,0x74,0xaa,0xcb,0xaa,
-0xda,0x05,0x07,0x02,0x06,0x3d,0x4c,0x53,0xb2,0x4e,0x45,0x3b,0x06,0x07,0x0d,0x0b,
-0xfa,0x4e,0x00,0x02,0x00,0xd9,0x01,0x10,0x05,0xdb,0x03,0xf4,0x00,0x1d,0x00,0x3b,
-0x00,0x3f,0x40,0x1f,0x2e,0x1f,0x39,0x2a,0x00,0x2d,0x22,0x13,0x01,0x10,0x1b,0x0c,
-0x1e,0x2a,0x9c,0x31,0x39,0x9c,0x22,0x04,0x9c,0x1b,0x0c,0x9c,0x13,0x3c,0x1e,0x00,
-0x2d,0x0f,0x3c,0x10,0xd4,0x3c,0xc4,0x32,0x31,0x00,0x10,0xd4,0xec,0xd4,0xec,0xdc,
-0xfc,0xd4,0xec,0xc0,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,
-0x30,0x01,0x15,0x0e,0x01,0x23,0x22,0x27,0x26,0x27,0x26,0x27,0x26,0x23,0x22,0x06,
-0x07,0x35,0x3e,0x01,0x33,0x32,0x17,0x16,0x17,0x16,0x17,0x16,0x33,0x32,0x36,0x13,
-0x15,0x0e,0x01,0x23,0x22,0x27,0x26,0x27,0x26,0x27,0x26,0x23,0x22,0x06,0x07,0x35,
-0x3e,0x01,0x33,0x32,0x17,0x16,0x17,0x16,0x17,0x16,0x33,0x32,0x36,0x05,0xdb,0x69,
-0xb3,0x61,0x6e,0x92,0x0a,0x07,0x06,0x0f,0x9b,0x5e,0x58,0xac,0x62,0x69,0xb3,0x61,
-0x6e,0x93,0x0b,0x05,0x06,0x0f,0x9b,0x5e,0x56,0xa9,0x67,0x69,0xb3,0x61,0x6e,0x92,
-0x0a,0x07,0x06,0x0f,0x9b,0x5e,0x58,0xac,0x62,0x69,0xb3,0x61,0x6e,0x93,0x0a,0x05,
-0x07,0x0f,0x9b,0x5e,0x56,0xa9,0x02,0x6f,0xb3,0x4e,0x45,0x3b,0x04,0x03,0x02,0x06,
-0x3d,0x4c,0x54,0xb3,0x4e,0x45,0x3b,0x05,0x02,0x02,0x06,0x3d,0x4b,0x01,0xda,0xb2,
-0x4f,0x45,0x3b,0x04,0x03,0x02,0x06,0x3d,0x4c,0x53,0xb2,0x4e,0x45,0x3b,0x04,0x02,
-0x03,0x06,0x3d,0x4b,0x00,0x01,0x00,0xd9,0x00,0x05,0x05,0xdb,0x04,0xff,0x00,0x34,
-0x00,0x00,0x01,0x16,0x33,0x32,0x36,0x37,0x15,0x0e,0x01,0x23,0x22,0x27,0x07,0x16,
-0x33,0x32,0x36,0x37,0x15,0x0e,0x01,0x23,0x22,0x2f,0x01,0x03,0x27,0x13,0x26,0x23,
-0x22,0x06,0x07,0x35,0x3e,0x01,0x33,0x32,0x17,0x37,0x26,0x23,0x22,0x06,0x07,0x35,
-0x3e,0x01,0x32,0x1f,0x01,0x13,0x17,0x04,0x11,0x39,0x2b,0x56,0xa9,0x67,0x69,0xb3,
-0x61,0x40,0x4c,0x4a,0x93,0x5a,0x56,0xa9,0x67,0x69,0xb3,0x61,0x83,0x7d,0x13,0x8d,
-0xa4,0x89,0x39,0x2b,0x58,0xac,0x62,0x69,0xb3,0x61,0x40,0x4d,0x48,0x92,0x5a,0x58,
-0xac,0x62,0x69,0xb3,0xc2,0xa0,0x12,0x8d,0xa4,0x03,0x61,0x0d,0x4b,0x55,0xb2,0x4f,
-0x45,0x14,0xbb,0x38,0x4b,0x55,0xb3,0x4e,0x45,0x3b,0x09,0xfe,0x98,0x40,0x01,0x5e,
-0x0d,0x4c,0x54,0xb3,0x4e,0x45,0x14,0xbb,0x38,0x4c,0x53,0xb2,0x4e,0x45,0x3b,0x07,
-0x01,0x66,0x40,0x00,0x00,0x03,0x00,0xd9,0x00,0xb8,0x05,0xdb,0x04,0xc9,0x00,0x1a,
-0x00,0x35,0x00,0x39,0x00,0x00,0x01,0x15,0x0e,0x01,0x23,0x22,0x2f,0x01,0x26,0x27,
-0x26,0x23,0x22,0x06,0x07,0x35,0x3e,0x01,0x33,0x32,0x1f,0x02,0x16,0x33,0x32,0x36,
-0x13,0x15,0x0e,0x01,0x23,0x22,0x2f,0x01,0x26,0x27,0x26,0x23,0x22,0x06,0x07,0x35,
-0x3e,0x01,0x33,0x32,0x1f,0x02,0x16,0x33,0x32,0x36,0x01,0x21,0x15,0x21,0x05,0xdb,
-0x69,0xb3,0x61,0x6e,0x92,0x11,0x06,0x0f,0x9b,0x5e,0x58,0xac,0x62,0x69,0xb3,0x61,
-0x6e,0x93,0x0f,0x16,0x9b,0x5e,0x56,0xa9,0x67,0x69,0xb3,0x61,0x71,0x8f,0x11,0x06,
-0x0f,0x9b,0x5e,0x58,0xac,0x62,0x69,0xb3,0x61,0x6e,0x93,0x0f,0x16,0xc6,0x33,0x56,
-0xa9,0xfb,0x65,0x05,0x02,0xfa,0xfe,0x03,0x4c,0xb2,0x4f,0x45,0x3b,0x07,0x02,0x06,
-0x3d,0x4c,0x53,0xb2,0x4e,0x45,0x3b,0x06,0x07,0x3f,0x4b,0x01,0xd2,0xb2,0x4f,0x45,
-0x3b,0x07,0x02,0x06,0x3d,0x4c,0x53,0xb2,0x4e,0x45,0x3b,0x06,0x07,0x3f,0x4b,0xfc,
-0xee,0xaa,0x00,0x03,0x00,0xd9,0x00,0x79,0x05,0xdb,0x04,0xd1,0x00,0x1a,0x00,0x35,
-0x00,0x50,0x00,0x00,0x01,0x15,0x0e,0x01,0x23,0x22,0x2f,0x01,0x26,0x27,0x26,0x23,
-0x22,0x06,0x07,0x35,0x3e,0x01,0x33,0x32,0x1f,0x02,0x16,0x33,0x32,0x36,0x13,0x15,
-0x0e,0x01,0x23,0x22,0x2f,0x01,0x26,0x27,0x26,0x23,0x22,0x06,0x07,0x35,0x3e,0x01,
-0x33,0x32,0x1f,0x02,0x16,0x33,0x32,0x36,0x13,0x15,0x0e,0x01,0x23,0x22,0x2f,0x01,
-0x26,0x27,0x26,0x23,0x22,0x06,0x07,0x35,0x3e,0x01,0x33,0x32,0x1f,0x02,0x16,0x33,
-0x32,0x36,0x05,0xdb,0x69,0xb3,0x61,0x6e,0x92,0x11,0x06,0x0f,0x9b,0x5e,0x58,0xac,
-0x62,0x69,0xb3,0x61,0x6e,0x93,0x0f,0x16,0x9b,0x5e,0x56,0xa9,0x67,0x69,0xb3,0x61,
-0x6e,0x92,0x11,0x06,0x0f,0x9b,0x5e,0x58,0xac,0x62,0x69,0xb3,0x61,0x6e,0x93,0x0f,
-0x16,0x9b,0x5e,0x56,0xa9,0x67,0x69,0xb3,0x61,0x71,0x8f,0x11,0x06,0x0f,0x9b,0x5e,
-0x58,0xac,0x62,0x69,0xb3,0x61,0x6e,0x93,0x0f,0x16,0xc6,0x33,0x56,0xa9,0x01,0xd7,
-0xb2,0x4f,0x45,0x3b,0x07,0x02,0x06,0x3d,0x4c,0x53,0xb2,0x4e,0x45,0x3b,0x06,0x07,
-0x3f,0x4b,0x01,0xd2,0xb2,0x4f,0x45,0x3b,0x07,0x02,0x06,0x3d,0x4c,0x53,0xb2,0x4e,
-0x45,0x3b,0x06,0x07,0x3f,0x4b,0x01,0xd2,0xb2,0x4f,0x45,0x3b,0x07,0x02,0x06,0x3d,
-0x4c,0x53,0xb2,0x4e,0x45,0x3b,0x06,0x07,0x3f,0x4b,0x00,0x03,0x00,0xd9,0x00,0xb8,
-0x05,0xdb,0x04,0xc1,0x00,0x1a,0x00,0x1e,0x00,0x22,0x00,0x00,0x13,0x1e,0x01,0x33,
-0x32,0x3f,0x02,0x36,0x33,0x32,0x16,0x17,0x15,0x2e,0x01,0x23,0x22,0x07,0x06,0x0f,
-0x01,0x06,0x23,0x22,0x26,0x27,0x01,0x15,0x21,0x35,0x01,0x15,0x21,0x35,0xd9,0x67,
-0xa9,0x56,0x5e,0x9b,0x16,0x0f,0x93,0x6e,0x61,0xb3,0x69,0x62,0xac,0x58,0x5e,0x9b,
-0x0f,0x06,0x11,0x92,0x6e,0x61,0xb3,0x69,0x05,0x02,0xfa,0xfe,0x05,0x02,0xfa,0xfe,
-0x04,0xc1,0x55,0x4b,0x3f,0x07,0x06,0x3b,0x45,0x4e,0xb2,0x53,0x4c,0x3d,0x06,0x02,
-0x07,0x3b,0x45,0x4f,0xfe,0xc8,0xaa,0xaa,0xfe,0x8b,0xaa,0xaa,0x00,0x02,0x00,0xd8,
-0x00,0xd7,0x05,0xdb,0x04,0x2b,0x00,0x09,0x00,0x13,0x00,0x00,0x01,0x20,0x25,0x35,
-0x04,0x05,0x20,0x25,0x15,0x04,0x05,0x20,0x05,0x15,0x24,0x25,0x04,0x05,0x35,0x24,
-0x03,0x5b,0xfe,0xe1,0xfe,0x9c,0x01,0x67,0x01,0x1c,0x01,0x26,0x01,0x59,0xfe,0xa2,
-0xfe,0xe0,0x01,0x25,0x01,0x5a,0xfe,0xa3,0xfe,0xde,0xfe,0xe0,0xfe,0x9d,0x01,0x68,
-0x02,0xd3,0xa6,0xb2,0x95,0x11,0xa6,0xb2,0x97,0xb3,0xa6,0xb2,0x97,0x0f,0x02,0xa4,
-0xb2,0x97,0x00,0x02,0x00,0xd9,0x01,0x60,0x05,0xdb,0x04,0xce,0x00,0x1c,0x00,0x20,
-0x00,0x00,0x01,0x06,0x07,0x06,0x07,0x06,0x07,0x21,0x35,0x21,0x36,0x37,0x36,0x37,
-0x36,0x32,0x17,0x16,0x17,0x16,0x17,0x21,0x15,0x21,0x26,0x27,0x26,0x27,0x26,0x01,
-0x21,0x15,0x21,0x03,0x5b,0x43,0x2e,0x38,0x1e,0x1b,0x04,0xfe,0x64,0x01,0x0a,0x0c,
-0x1e,0x36,0x57,0x59,0xce,0x59,0x56,0x37,0x1c,0x0e,0x01,0x0a,0xfe,0x65,0x04,0x1b,
-0x1e,0x38,0x2d,0xfd,0x3b,0x05,0x02,0xfa,0xfe,0x04,0x2b,0x04,0x1e,0x2b,0x44,0x44,
-0x5c,0xa8,0x39,0x33,0x5b,0x32,0x33,0x33,0x32,0x5b,0x30,0x3c,0xa8,0x5b,0x45,0x43,
-0x2c,0x1e,0xfd,0xe3,0xaa,0x00,0x00,0x02,0x00,0xd9,0x00,0x36,0x05,0xdb,0x04,0xce,
-0x00,0x1c,0x00,0x39,0x00,0x00,0x25,0x36,0x37,0x36,0x37,0x36,0x37,0x21,0x15,0x21,
-0x06,0x07,0x06,0x07,0x06,0x22,0x27,0x26,0x27,0x26,0x27,0x21,0x35,0x21,0x16,0x17,
-0x16,0x17,0x16,0x13,0x06,0x07,0x06,0x07,0x06,0x07,0x21,0x35,0x21,0x36,0x37,0x36,
-0x37,0x36,0x32,0x17,0x16,0x17,0x16,0x17,0x21,0x15,0x21,0x26,0x27,0x26,0x27,0x26,
-0x03,0x5b,0x43,0x2d,0x38,0x1e,0x1b,0x04,0x01,0x9b,0xfe,0xf6,0x0e,0x1c,0x37,0x56,
-0x59,0xce,0x59,0x57,0x36,0x1e,0x0c,0xfe,0xf6,0x01,0x9c,0x04,0x1b,0x1e,0x38,0x2e,
-0x43,0x43,0x2e,0x38,0x1e,0x1b,0x04,0xfe,0x64,0x01,0x0a,0x0c,0x1e,0x36,0x57,0x59,
-0xce,0x59,0x56,0x37,0x1c,0x0e,0x01,0x0a,0xfe,0x65,0x04,0x1b,0x1e,0x38,0x2d,0xd9,
-0x04,0x1e,0x2c,0x43,0x45,0x5b,0xa8,0x3c,0x30,0x5b,0x32,0x33,0x33,0x32,0x5b,0x33,
-0x39,0xa8,0x5c,0x44,0x44,0x2b,0x1e,0x03,0x4e,0x04,0x1e,0x2b,0x44,0x44,0x5c,0xa8,
-0x39,0x33,0x5b,0x32,0x33,0x33,0x32,0x5b,0x30,0x3c,0xa8,0x5b,0x45,0x43,0x2c,0x1e,
-0xff,0xff,0x00,0xd9,0x01,0x60,0x05,0xdb,0x04,0xff,0x10,0x27,0x08,0x8a,0x02,0x15,
-0x01,0xb9,0x10,0x06,0x00,0x20,0x00,0x00,0xff,0xff,0x00,0xd9,0x00,0x02,0x05,0xdb,
-0x04,0xff,0x10,0x27,0x08,0x8a,0x02,0x13,0xfd,0xba,0x10,0x26,0x00,0x20,0x00,0x00,
-0x10,0x07,0x08,0x8a,0x02,0x14,0x01,0xb9,0xff,0xff,0x00,0xd6,0x00,0x05,0x05,0xdc,
-0x04,0xff,0x10,0x27,0x08,0x8a,0xff,0xfc,0x01,0xb9,0x10,0x26,0x00,0x20,0xfe,0x00,
-0x10,0x07,0x08,0x8a,0x04,0x2e,0xfd,0xbd,0xff,0xff,0x00,0xd5,0x00,0x05,0x05,0xda,
-0x04,0xff,0x10,0x27,0x08,0x8a,0xff,0xfa,0xfd,0xbd,0x10,0x26,0x00,0x20,0xfe,0x00,
-0x10,0x07,0x08,0x8a,0x04,0x2a,0x01,0xb9,0xff,0xff,0x00,0xce,0x01,0x36,0x07,0x32,
-0x03,0xcf,0x10,0x27,0x08,0x8a,0xff,0xf4,0xfe,0xee,0x10,0x27,0x08,0x8a,0xff,0xf4,
-0x00,0x89,0x10,0x07,0x00,0x20,0x01,0x56,0x00,0x00,0xff,0xff,0x00,0xcd,0x01,0x36,
-0x07,0x33,0x03,0xcc,0x10,0x26,0x00,0x20,0xf4,0x00,0x10,0x27,0x08,0x8a,0x05,0x85,
-0x00,0x86,0x10,0x07,0x08,0x8a,0x05,0x85,0xfe,0xee,0x00,0x02,0x00,0xd9,0x01,0x60,
-0x05,0xdb,0x03,0xa2,0x00,0x09,0x00,0x1b,0x00,0x00,0x01,0x06,0x15,0x14,0x17,0x33,
-0x36,0x35,0x34,0x27,0x17,0x21,0x15,0x21,0x35,0x21,0x26,0x35,0x34,0x37,0x21,0x35,
-0x21,0x15,0x21,0x16,0x17,0x14,0x02,0xe6,0x34,0x34,0xf2,0x33,0x34,0x8d,0x01,0x77,
-0xfa,0xfe,0x01,0x7e,0x19,0x1b,0xfe,0x80,0x05,0x02,0xfe,0x89,0x1a,0x01,0x02,0xfa,
-0x30,0x49,0x47,0x30,0x30,0x47,0x47,0x32,0xf0,0xaa,0xaa,0x3f,0x38,0x3e,0x3b,0xa8,
-0xa8,0x1a,0x5f,0x38,0x00,0x04,0x00,0xd9,0x01,0x60,0x05,0xdb,0x06,0x15,0x00,0x09,
-0x00,0x18,0x00,0x1c,0x00,0x20,0x00,0x00,0x01,0x22,0x06,0x15,0x14,0x16,0x32,0x36,
-0x34,0x26,0x27,0x32,0x16,0x17,0x1e,0x01,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,
-0x36,0x01,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x03,0x5e,0x48,0x64,0x64,0x91,0x64,
-0x65,0x48,0x3b,0x6b,0x27,0x2a,0x2a,0xa8,0x7a,0x7b,0xa4,0xa7,0xfd,0xf4,0x05,0x02,
-0xfa,0xfe,0x05,0x02,0xfa,0xfe,0x05,0xa4,0x62,0x46,0x45,0x60,0x60,0x8b,0x62,0x71,
-0x2b,0x28,0x28,0x64,0x3a,0x73,0xa1,0x9e,0x76,0x76,0xa3,0xfd,0x8d,0xa8,0xf0,0xaa,
-0x00,0x03,0x00,0xd9,0x01,0x60,0x05,0xdb,0x05,0x4b,0x00,0x09,0x00,0x0d,0x00,0x11,
-0x00,0x00,0x01,0x20,0x17,0x15,0x26,0x21,0x06,0x07,0x35,0x36,0x01,0x21,0x15,0x21,
-0x15,0x21,0x15,0x21,0x03,0x5b,0x01,0x00,0xe1,0xe0,0xfe,0xff,0xfe,0xe6,0xe9,0xfe,
-0x79,0x05,0x02,0xfa,0xfe,0x05,0x02,0xfa,0xfe,0x05,0x4b,0x97,0xb2,0x97,0x02,0x95,
-0xb2,0x97,0xfe,0x57,0xa8,0xf0,0xaa,0x00,0x00,0x03,0x00,0xd9,0x01,0x60,0x05,0xdb,
-0x06,0x7f,0x00,0x06,0x00,0x0a,0x00,0x0e,0x00,0x00,0x09,0x01,0x33,0x01,0x23,0x0b,
-0x01,0x05,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x01,0xfd,0x01,0x04,0xb4,0x01,0x03,
-0x9f,0xbe,0xb8,0xfe,0x36,0x05,0x02,0xfa,0xfe,0x05,0x02,0xfa,0xfe,0x03,0xe2,0x02,
-0x9d,0xfd,0x63,0x01,0xd9,0xfe,0x27,0x40,0xa8,0xf0,0xaa,0x00,0x00,0x03,0x00,0xd9,
-0x01,0x60,0x05,0xdb,0x06,0x7f,0x00,0x06,0x00,0x0a,0x00,0x0e,0x00,0x00,0x01,0x33,
-0x1b,0x01,0x33,0x01,0x23,0x05,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x01,0xfd,0xa6,
-0xb8,0xbe,0x9f,0xfe,0xfd,0xb4,0xfd,0xd8,0x05,0x02,0xfa,0xfe,0x05,0x02,0xfa,0xfe,
-0x06,0x7f,0xfe,0x27,0x01,0xd9,0xfd,0x63,0x40,0xa8,0xf0,0xaa,0x00,0x03,0x00,0xd9,
-0x01,0x60,0x05,0xdb,0x06,0xca,0x00,0x09,0x00,0x0d,0x00,0x11,0x00,0x00,0x01,0x21,
-0x1b,0x01,0x21,0x07,0x13,0x27,0x07,0x13,0x01,0x21,0x15,0x21,0x15,0x21,0x15,0x21,
-0x01,0xd3,0x01,0x2b,0x5d,0x5e,0x01,0x2a,0xf2,0x5e,0xf4,0xf3,0x5d,0xfe,0x14,0x05,
-0x02,0xfa,0xfe,0x05,0x02,0xfa,0xfe,0x05,0xae,0x01,0x1c,0xfe,0xe4,0xb0,0xfe,0xe4,
-0xb0,0xb0,0x01,0x1c,0xfe,0xa4,0xa8,0xf0,0xaa,0x00,0x00,0x04,0x00,0xd9,0x01,0x60,
-0x05,0xdb,0x06,0xd4,0x00,0x02,0x00,0x06,0x00,0x0a,0x00,0x0e,0x00,0x00,0x01,0x03,
-0x21,0x03,0x33,0x01,0x21,0x05,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x03,0x5b,0xa6,
-0x01,0x4e,0xdf,0x70,0x01,0x21,0xfd,0x4e,0xfe,0xd6,0x05,0x02,0xfa,0xfe,0x05,0x02,
-0xfa,0xfe,0x06,0x20,0xfe,0x4e,0x02,0x66,0xfd,0x1f,0x51,0xa8,0xf0,0xaa,0x00,0x07,
-0x00,0xd9,0x01,0x60,0x05,0xdb,0x06,0x1d,0x00,0x13,0x00,0x28,0x00,0x2f,0x00,0x3f,
-0x00,0x47,0x00,0x4b,0x00,0x4f,0x00,0x00,0x01,0x15,0x23,0x22,0x06,0x1d,0x01,0x33,
-0x15,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x03,0x15,0x21,0x1e,
-0x01,0x33,0x32,0x36,0x37,0x15,0x0e,0x01,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,
-0x16,0x07,0x34,0x26,0x23,0x22,0x06,0x07,0x27,0x35,0x33,0x11,0x23,0x35,0x0e,0x01,
-0x23,0x22,0x26,0x34,0x36,0x33,0x32,0x16,0x06,0x14,0x16,0x32,0x36,0x34,0x26,0x22,
-0x03,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x05,0x7d,0x3f,0x24,0x1b,0x6d,0x6d,0x43,
-0x3f,0x3f,0x3f,0x44,0xed,0xfe,0xcf,0x04,0x4a,0x42,0x26,0x48,0x23,0x24,0x4a,0x27,
-0x60,0x71,0x6b,0x5b,0x51,0x5f,0x43,0x3c,0x31,0x37,0x43,0x05,0xc6,0x42,0x42,0x15,
-0x40,0x2c,0x49,0x5c,0x5c,0x49,0x2c,0x40,0xcd,0x3c,0x69,0x3d,0x3d,0x69,0xde,0x05,
-0x02,0xfa,0xfe,0x05,0x02,0xfa,0xfe,0x06,0x1c,0x37,0x1d,0x25,0x24,0x33,0xfe,0xa0,
-0x01,0x60,0x33,0x1c,0x44,0x3d,0xfe,0xaa,0x20,0x44,0x48,0x13,0x12,0x3e,0x0f,0x10,
-0x70,0x60,0x63,0x74,0x69,0x46,0x36,0x41,0x3f,0x39,0x69,0xda,0xfd,0xd0,0x3d,0x24,
-0x23,0x74,0xbe,0x75,0x23,0x67,0x93,0x53,0x53,0x93,0x53,0xfe,0x50,0xa8,0xf0,0xaa,
-0x00,0x03,0x00,0xd9,0x01,0x60,0x05,0xdb,0x06,0x14,0x00,0x22,0x00,0x26,0x00,0x2a,
-0x00,0x00,0x01,0x3e,0x01,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,
-0x06,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,
-0x3e,0x01,0x33,0x32,0x16,0x01,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x03,0x78,0x21,
-0x5d,0x3f,0x55,0x5c,0x5a,0x37,0x39,0x45,0x50,0x5a,0x37,0x3a,0x44,0x50,0x5a,0x5a,
-0x1e,0x56,0x3a,0x3b,0x53,0xfd,0x75,0x05,0x02,0xfa,0xfe,0x05,0x02,0xfa,0xfe,0x05,
-0x9d,0x3d,0x3a,0x78,0x6f,0xfe,0xb5,0x01,0x48,0x4f,0x4d,0x5d,0x51,0xfe,0xca,0x01,
-0x48,0x50,0x4c,0x5e,0x50,0xfe,0xca,0x02,0x25,0x55,0x32,0x30,0x3d,0xfd,0xcb,0xa8,
-0xf0,0xaa,0x00,0x04,0x00,0xd9,0x01,0x60,0x05,0xdb,0x06,0xda,0x00,0x03,0x00,0x24,
-0x00,0x28,0x00,0x2c,0x00,0x00,0x01,0x33,0x15,0x23,0x37,0x23,0x35,0x34,0x36,0x3f,
-0x01,0x3e,0x01,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x35,0x3e,0x01,0x33,0x32,0x16,
-0x15,0x14,0x06,0x0f,0x01,0x0e,0x01,0x07,0x0e,0x01,0x15,0x01,0x21,0x15,0x21,0x15,
-0x21,0x15,0x21,0x03,0x0d,0x65,0x65,0x62,0x5f,0x1c,0x2d,0x2d,0x1c,0x1a,0x42,0x36,
-0x27,0x5a,0x30,0x2f,0x60,0x34,0x5c,0x6f,0x24,0x2d,0x2c,0x17,0x14,0x04,0x03,0x03,
-0xfd,0x6a,0x05,0x02,0xfa,0xfe,0x05,0x02,0xfa,0xfe,0x04,0x61,0x7f,0xc8,0x4e,0x32,
-0x41,0x2b,0x2c,0x1b,0x2f,0x18,0x2d,0x37,0x23,0x21,0x5e,0x1c,0x1c,0x61,0x4f,0x26,
-0x45,0x2b,0x2b,0x17,0x1b,0x0d,0x0a,0x1e,0x1a,0xfe,0xba,0xa8,0xf0,0xaa,0x00,0x01,
-0x00,0xd9,0x00,0x27,0x05,0xdb,0x04,0xdd,0x00,0x13,0x00,0x3e,0x40,0x22,0x0d,0x0c,
-0x0a,0x03,0x02,0xcf,0x04,0x00,0x9c,0x06,0x0c,0xcf,0x0e,0x0a,0x9c,0x12,0x06,0x10,
-0x08,0x14,0x12,0x0e,0x0d,0x0c,0x08,0x04,0x03,0x02,0x08,0x09,0x05,0x0f,0x00,0x14,
-0x10,0xdc,0x3c,0xc4,0x32,0x17,0x39,0x31,0x00,0x10,0xd4,0x3c,0xcc,0x32,0xfc,0x3c,
-0xec,0x10,0xfe,0x3c,0xec,0x39,0x11,0x12,0x39,0x30,0x13,0x21,0x01,0x17,0x07,0x21,
-0x15,0x21,0x07,0x21,0x15,0x21,0x01,0x27,0x37,0x21,0x35,0x21,0x37,0x21,0xd9,0x03,
-0x04,0x01,0x00,0x7d,0xae,0x01,0x2f,0xfe,0x48,0xc3,0x02,0x7b,0xfc,0xfa,0xfe,0xfe,
-0x7d,0xae,0xfe,0xd5,0x01,0xb6,0xc3,0xfd,0x87,0x03,0xa2,0x01,0x3b,0x66,0xd5,0xa8,
-0xf0,0xaa,0xfe,0xc7,0x66,0xd3,0xaa,0xf0,0x00,0x03,0x00,0xd9,0x00,0xb8,0x05,0xdb,
-0x04,0x4a,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x00,0x13,0x21,0x15,0x21,0x11,0x21,
-0x15,0x21,0x11,0x21,0x15,0x21,0xd9,0x05,0x02,0xfa,0xfe,0x05,0x02,0xfa,0xfe,0x05,
-0x02,0xfa,0xfe,0x02,0xd7,0xaa,0x02,0x1d,0xa8,0xfd,0xc0,0xaa,0x00,0x01,0x00,0xd9,
-0xff,0xce,0x05,0xdb,0x05,0x34,0x00,0x1b,0x00,0x00,0x01,0x21,0x35,0x21,0x37,0x17,
-0x07,0x21,0x15,0x21,0x07,0x21,0x15,0x21,0x07,0x21,0x15,0x21,0x07,0x27,0x37,0x21,
-0x35,0x21,0x37,0x21,0x35,0x21,0x03,0x95,0xfd,0x44,0x03,0x17,0x81,0x99,0x52,0x01,
-0x23,0xfe,0x81,0x72,0x01,0xf1,0xfd,0xb5,0x6e,0x02,0xb9,0xfc,0xe9,0x81,0x99,0x52,
-0xfe,0xdd,0x01,0x81,0x6f,0xfe,0x10,0x02,0x4c,0x03,0xa2,0xa8,0xea,0x54,0x96,0xa8,
-0xcb,0xaa,0xcb,0xaa,0xea,0x54,0x96,0xaa,0xcb,0xaa,0x00,0x04,0x00,0xd9,0xff,0xc6,
-0x05,0xdb,0x05,0x3c,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x00,0x37,0x21,
-0x15,0x21,0x11,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0xd9,0x05,
-0x02,0xfa,0xfe,0x05,0x02,0xfa,0xfe,0x05,0x02,0xfa,0xfe,0x05,0x02,0xfa,0xfe,0x70,
-0xaa,0x05,0x76,0xa8,0xf2,0xa8,0xf0,0xaa,0x00,0x02,0x00,0xd9,0x00,0x00,0x05,0xdb,
-0x04,0xa8,0x00,0x06,0x00,0x0a,0x00,0x54,0x40,0x2e,0x02,0x9c,0x03,0x04,0x03,0x01,
-0x9c,0x00,0x01,0x04,0x04,0x03,0x01,0x9c,0x02,0x01,0x05,0x06,0x05,0x00,0x9c,0x06,
-0x05,0x42,0x05,0x04,0x02,0x01,0x00,0x05,0x03,0xd1,0x06,0xa7,0x07,0x9c,0x09,0x01,
-0x08,0x02,0x00,0x24,0x07,0x04,0x23,0x0b,0x10,0xfc,0x3c,0xec,0x32,0x32,0x39,0x31,
-0x00,0x2f,0xec,0xf4,0xec,0x17,0x39,0x30,0x4b,0x53,0x58,0x07,0x04,0xed,0x07,0x10,
-0x08,0xed,0x07,0x10,0x08,0xed,0x07,0x10,0x04,0xed,0x59,0x22,0x09,0x02,0x15,0x01,
-0x35,0x09,0x01,0x21,0x15,0x21,0x05,0xdb,0xfc,0x40,0x03,0xc0,0xfa,0xfe,0x05,0x02,
-0xfa,0xfe,0x05,0x02,0xfa,0xfe,0x03,0xf8,0xfe,0xeb,0xfe,0xee,0xb2,0x01,0x70,0xaa,
-0x01,0x6f,0xfc,0x02,0xaa,0x00,0x00,0x02,0x00,0xd9,0x00,0x00,0x05,0xdb,0x04,0xa8,
-0x00,0x06,0x00,0x0a,0x00,0x56,0x40,0x2f,0x06,0x9c,0x00,0x06,0x03,0x04,0x03,0x05,
-0x9c,0x04,0x04,0x03,0x00,0x9c,0x01,0x02,0x01,0x06,0x9c,0x05,0x06,0x02,0x02,0x01,
-0x42,0x06,0x05,0x03,0x02,0x00,0x05,0x04,0xd1,0x01,0xa7,0x07,0x9c,0x08,0x06,0x07,
-0x02,0x24,0x09,0x04,0x00,0x23,0x0b,0x10,0xfc,0x3c,0x3c,0xec,0x32,0x39,0x31,0x00,
-0x2f,0xec,0xf4,0xec,0x17,0x39,0x30,0x4b,0x53,0x58,0x07,0x10,0x08,0xed,0x07,0x10,
-0x04,0xed,0x07,0x10,0x04,0xed,0x07,0x10,0x08,0xed,0x59,0x22,0x13,0x35,0x01,0x15,
-0x01,0x35,0x09,0x01,0x15,0x21,0x35,0xd9,0x05,0x02,0xfa,0xfe,0x03,0xc1,0x01,0x41,
-0xfa,0xfe,0x03,0xf8,0xb0,0xfe,0x91,0xaa,0xfe,0x90,0xb2,0x01,0x12,0xfd,0xc7,0xaa,
-0xaa,0x00,0x00,0x03,0x00,0xda,0xff,0x56,0x05,0xdc,0x05,0x1b,0x00,0x03,0x00,0x0a,
-0x00,0x0e,0x00,0x00,0x33,0x21,0x15,0x21,0x09,0x02,0x15,0x01,0x35,0x09,0x01,0x21,
-0x15,0x21,0xda,0x05,0x02,0xfa,0xfe,0x05,0x02,0xfc,0x40,0x03,0xc0,0xfa,0xfe,0x05,
-0x02,0xfa,0xfe,0x05,0x02,0xfa,0xfe,0xaa,0x05,0x15,0xfe,0xeb,0xfe,0xee,0xb2,0x01,
-0x70,0xaa,0x01,0x6f,0xfc,0x02,0xaa,0x00,0x00,0x03,0x00,0xda,0xff,0x56,0x05,0xdc,
-0x05,0x1b,0x00,0x03,0x00,0x0a,0x00,0x0e,0x00,0x00,0x21,0x15,0x21,0x35,0x11,0x35,
-0x01,0x15,0x01,0x35,0x09,0x01,0x15,0x21,0x35,0x05,0xdc,0xfa,0xfe,0x05,0x02,0xfa,
-0xfe,0x03,0xc0,0x01,0x42,0xfa,0xfe,0xaa,0xaa,0x04,0x6b,0xb0,0xfe,0x91,0xaa,0xfe,
-0x90,0xb2,0x01,0x12,0xfd,0xc7,0xaa,0xaa,0x00,0x02,0x00,0xda,0xfe,0xb1,0x05,0xdc,
-0x05,0x1b,0x00,0x13,0x00,0x1a,0x00,0x00,0x05,0x21,0x35,0x21,0x37,0x21,0x35,0x21,
-0x37,0x17,0x07,0x21,0x15,0x21,0x07,0x21,0x15,0x21,0x07,0x27,0x09,0x02,0x15,0x01,
-0x35,0x01,0x02,0x27,0xfe,0xb3,0x01,0xda,0x60,0xfd,0xc6,0x02,0xc8,0x89,0x8a,0x29,
-0x01,0x50,0xfe,0x22,0x5f,0x02,0x3d,0xfd,0x36,0x8a,0x8a,0x03,0xde,0xfc,0x40,0x03,
-0xc0,0xfa,0xfe,0x05,0x02,0xaa,0xaa,0x73,0xaa,0xa4,0x73,0x31,0xaa,0x73,0xaa,0xa5,
-0x74,0x05,0x46,0xfe,0xeb,0xfe,0xee,0xb2,0x01,0x70,0xaa,0x01,0x6f,0x00,0x00,0x02,
-0x00,0xda,0xfe,0xb1,0x05,0xdc,0x05,0x1b,0x00,0x13,0x00,0x1a,0x00,0x00,0x05,0x21,
-0x35,0x21,0x37,0x21,0x35,0x21,0x37,0x17,0x07,0x21,0x15,0x21,0x07,0x21,0x15,0x21,
-0x07,0x27,0x01,0x35,0x01,0x15,0x01,0x35,0x01,0x02,0x27,0xfe,0xb3,0x01,0xda,0x60,
-0xfd,0xc6,0x02,0xc8,0x89,0x8a,0x29,0x01,0x50,0xfe,0x22,0x5f,0x02,0x3d,0xfd,0x36,
-0x8a,0x8a,0xfe,0xdc,0x05,0x02,0xfa,0xfe,0x03,0xc0,0xaa,0xaa,0x73,0xaa,0xa4,0x73,
-0x31,0xaa,0x73,0xaa,0xa5,0x74,0x05,0x46,0xb0,0xfe,0x91,0xaa,0xfe,0x90,0xb2,0x01,
-0x12,0x00,0x00,0x02,0x00,0x94,0x00,0x2e,0x07,0xcc,0x04,0xdf,0x00,0x06,0x00,0x0d,
-0x00,0x00,0x09,0x02,0x15,0x01,0x35,0x01,0x05,0x09,0x01,0x15,0x01,0x35,0x01,0x07,
-0xcc,0xfc,0xc6,0x03,0x3a,0xfb,0xca,0x04,0x36,0xfc,0xfe,0xfc,0xc6,0x03,0x3a,0xfb,
-0xca,0x04,0x36,0x04,0x11,0xfe,0x70,0xfe,0x72,0xc5,0x02,0x08,0x9f,0x02,0x0a,0xce,
-0xfe,0x70,0xfe,0x72,0xc5,0x02,0x08,0x9f,0x02,0x0a,0x00,0x02,0x00,0x94,0x00,0x2e,
-0x07,0xcc,0x04,0xdf,0x00,0x06,0x00,0x0d,0x00,0x00,0x13,0x35,0x01,0x15,0x01,0x35,
-0x01,0x03,0x35,0x01,0x15,0x01,0x35,0x01,0x94,0x04,0x36,0xfb,0xca,0x03,0x3a,0x38,
-0x04,0x36,0xfb,0xca,0x03,0x3a,0x04,0x11,0xce,0xfd,0xf6,0x9f,0xfd,0xf8,0xc5,0x01,
-0x8e,0x01,0x90,0xce,0xfd,0xf6,0x9f,0xfd,0xf8,0xc5,0x01,0x8e,0x00,0x01,0x00,0xd8,
-0x00,0x1a,0x05,0xdc,0x04,0xe8,0x00,0x1b,0x00,0x00,0x01,0x06,0x07,0x35,0x24,0x3f,
-0x01,0x24,0x25,0x35,0x04,0x25,0x13,0x17,0x07,0x36,0x37,0x15,0x04,0x0f,0x01,0x04,
-0x05,0x15,0x24,0x05,0x03,0x27,0x02,0x57,0xb4,0xc9,0x01,0x09,0xdf,0x65,0xfe,0xf6,
-0xfe,0xbb,0x01,0xb2,0x01,0x00,0xc4,0x94,0x87,0xb7,0xc8,0xfe,0xfb,0xe4,0x64,0x01,
-0x10,0x01,0x3f,0xfe,0x4e,0xff,0x00,0xc4,0x94,0x01,0x5d,0x29,0x5d,0xb2,0x6f,0x26,
-0xb6,0x0e,0x97,0xb2,0xaf,0x0a,0x01,0x62,0x52,0xf4,0x29,0x60,0xb2,0x71,0x25,0xb5,
-0x0d,0x98,0xb2,0xaf,0x0b,0xfe,0x9f,0x52,0x00,0x02,0x00,0xd9,0x00,0x05,0x05,0xdb,
-0x05,0x64,0x00,0x0f,0x00,0x12,0x00,0x00,0x01,0x05,0x15,0x25,0x03,0x27,0x13,0x25,
-0x35,0x01,0x13,0x17,0x07,0x25,0x15,0x05,0x07,0x0d,0x01,0x03,0x9d,0x02,0x3e,0xfd,
-0x7a,0x99,0x87,0x93,0xfe,0x11,0x03,0x1b,0xad,0x88,0x6d,0x01,0x1f,0xfe,0x7a,0xc8,
-0xfe,0x46,0x01,0x3c,0x01,0xdf,0xcb,0xb6,0xea,0xfe,0xbd,0x40,0x01,0x36,0xb4,0xa6,
-0x01,0x20,0x01,0x6f,0x40,0xe6,0x68,0xb6,0x8b,0x47,0x9d,0x70,0x00,0x02,0x00,0xd9,
-0xff,0xa0,0x05,0xdb,0x04,0xff,0x00,0x0f,0x00,0x12,0x00,0x00,0x01,0x25,0x35,0x05,
-0x13,0x17,0x03,0x05,0x15,0x01,0x03,0x27,0x37,0x05,0x35,0x25,0x37,0x2d,0x01,0x03,
-0x17,0xfd,0xc2,0x02,0x86,0x99,0x87,0x93,0x01,0xef,0xfc,0xe5,0xad,0x88,0x6d,0xfe,
-0xe1,0x01,0x86,0xc8,0x01,0xba,0xfe,0xc4,0x03,0x25,0xcb,0xb6,0xea,0x01,0x43,0x40,
-0xfe,0xca,0xb4,0xa6,0xfe,0xe0,0xfe,0x91,0x40,0xe6,0x68,0xb6,0x8b,0x47,0x9d,0x70,
-0x00,0x02,0x00,0xd9,0xff,0x2f,0x05,0xdb,0x05,0x56,0x00,0x02,0x00,0x1a,0x00,0x00,
-0x01,0x0d,0x01,0x03,0x21,0x35,0x21,0x13,0x25,0x35,0x25,0x13,0x17,0x07,0x25,0x15,
-0x05,0x03,0x05,0x15,0x25,0x03,0x21,0x15,0x21,0x07,0x27,0x03,0x92,0xfe,0x89,0x01,
-0x2f,0xf4,0xfe,0x83,0x01,0xbd,0x78,0xfd,0xcb,0x03,0x03,0x76,0xa4,0x48,0x01,0x2d,
-0xfe,0x89,0x72,0x01,0xe9,0xfd,0xdb,0x66,0x02,0x8b,0xfd,0x35,0x4c,0xa4,0x03,0x4f,
-0x6c,0x55,0xfd,0x72,0xaa,0x01,0x43,0xa2,0xaa,0xdd,0x01,0x40,0x3d,0xc7,0x56,0xb0,
-0x6c,0xfe,0xd1,0x8c,0xb2,0x9e,0xfe,0xed,0xaa,0xd1,0x3d,0x00,0x00,0x02,0x00,0xd9,
-0xff,0x2f,0x05,0xdb,0x05,0x56,0x00,0x02,0x00,0x1a,0x00,0x00,0x01,0x25,0x27,0x01,
-0x21,0x35,0x21,0x37,0x05,0x35,0x25,0x37,0x25,0x35,0x05,0x13,0x17,0x03,0x05,0x15,
-0x05,0x03,0x21,0x15,0x21,0x07,0x27,0x03,0x91,0x01,0x09,0xd6,0xfe,0x1d,0xfe,0xf8,
-0x01,0x47,0x57,0xfe,0x62,0x01,0xe8,0x5b,0xfd,0xbd,0x02,0x7f,0x84,0xa4,0x7f,0x01,
-0xda,0xfd,0x6d,0x6d,0x03,0x00,0xfc,0xc1,0x4e,0xa4,0x02,0x97,0x4c,0x3e,0xfc,0xdf,
-0xaa,0xec,0x77,0xb2,0x8b,0xf5,0xa7,0xb0,0xb7,0x01,0x65,0x3d,0xfe,0xa8,0x88,0xaa,
-0xbd,0xfe,0xd8,0xaa,0xd1,0x3d,0x00,0x02,0x00,0xd9,0xff,0x90,0x05,0xdc,0x04,0xa8,
-0x00,0x1d,0x00,0x24,0x00,0x00,0x25,0x15,0x0e,0x01,0x23,0x22,0x27,0x26,0x27,0x26,
-0x27,0x26,0x23,0x22,0x06,0x07,0x35,0x3e,0x01,0x33,0x32,0x17,0x16,0x17,0x16,0x17,
-0x16,0x33,0x32,0x36,0x13,0x09,0x01,0x15,0x01,0x35,0x01,0x05,0xdc,0x6a,0xb2,0x62,
-0x6e,0x92,0x0a,0x06,0x06,0x10,0x9a,0x5e,0x58,0xac,0x62,0x68,0xb4,0x60,0x6e,0x94,
-0x0a,0x06,0x06,0x0e,0x9c,0x5e,0x56,0xa8,0x67,0xfc,0x40,0x03,0xc0,0xfa,0xfe,0x05,
-0x02,0xf0,0xb4,0x4e,0x44,0x3a,0x04,0x04,0x02,0x06,0x3c,0x4c,0x54,0xb4,0x4e,0x44,
-0x3a,0x06,0x02,0x02,0x06,0x3c,0x4a,0x03,0x5e,0xfe,0xeb,0xfe,0xee,0xb2,0x01,0x70,
-0xaa,0x01,0x6f,0x00,0x00,0x02,0x00,0xd9,0xff,0xaf,0x05,0xdc,0x04,0xa8,0x00,0x1d,
-0x00,0x24,0x00,0x00,0x01,0x15,0x0e,0x01,0x23,0x22,0x27,0x26,0x27,0x26,0x27,0x26,
-0x23,0x22,0x06,0x07,0x35,0x3e,0x01,0x33,0x32,0x17,0x16,0x17,0x16,0x17,0x16,0x33,
-0x32,0x36,0x01,0x35,0x01,0x15,0x01,0x35,0x01,0x05,0xdc,0x6a,0xb2,0x62,0x6e,0x92,
-0x0a,0x06,0x06,0x10,0x9a,0x5e,0x58,0xac,0x62,0x68,0xb4,0x60,0x6e,0x94,0x0a,0x06,
-0x06,0x0e,0x9c,0x5e,0x56,0xa8,0xfb,0x65,0x05,0x02,0xfa,0xfe,0x03,0xc1,0x01,0x0e,
-0xb2,0x4e,0x46,0x3c,0x04,0x02,0x02,0x06,0x3e,0x4c,0x54,0xb2,0x4e,0x46,0x3c,0x04,
-0x02,0x02,0x06,0x3e,0x4c,0x03,0x3e,0xb0,0xfe,0x91,0xaa,0xfe,0x90,0xb2,0x01,0x12,
-0x00,0x02,0x00,0xd9,0xff,0x29,0x05,0xdc,0x05,0x50,0x00,0x31,0x00,0x34,0x00,0x00,
-0x25,0x26,0x23,0x22,0x06,0x07,0x35,0x3e,0x01,0x33,0x32,0x17,0x13,0x25,0x35,0x25,
-0x13,0x17,0x07,0x25,0x15,0x05,0x03,0x05,0x15,0x25,0x03,0x17,0x16,0x17,0x16,0x17,
-0x16,0x33,0x32,0x36,0x37,0x15,0x0e,0x01,0x23,0x22,0x27,0x26,0x27,0x26,0x2f,0x01,
-0x07,0x27,0x01,0x0d,0x01,0x02,0x6b,0x1e,0x0d,0x58,0xac,0x62,0x68,0xb4,0x60,0x27,
-0x2b,0x6b,0xfd,0xc6,0x03,0x08,0x75,0xa5,0x45,0x01,0x25,0xfe,0x8f,0x73,0x01,0xe4,
-0xfd,0xe1,0x6b,0x07,0x0a,0x06,0x06,0x0e,0x9c,0x5e,0x56,0xa8,0x68,0x6a,0xb2,0x62,
-0x6e,0x92,0x0a,0x06,0x06,0x10,0x22,0x50,0xa5,0x01,0x76,0xfe,0x84,0x01,0x31,0x2d,
-0x03,0x4c,0x54,0xb4,0x4e,0x44,0x07,0x01,0x1d,0xa3,0xaa,0xde,0x01,0x39,0x41,0xbb,
-0x54,0xb0,0x6a,0xfe,0xcd,0x8a,0xb2,0x9c,0xfe,0xe3,0x02,0x06,0x02,0x02,0x06,0x3c,
-0x4a,0x56,0xb4,0x4e,0x44,0x3a,0x04,0x04,0x02,0x06,0x0d,0xd8,0x3c,0x03,0xec,0x6e,
-0x57,0x00,0x00,0x02,0x00,0xd9,0xff,0x2f,0x05,0xdc,0x05,0x56,0x00,0x31,0x00,0x34,
-0x00,0x00,0x01,0x05,0x15,0x05,0x07,0x16,0x17,0x16,0x17,0x16,0x17,0x16,0x33,0x32,
-0x36,0x37,0x15,0x0e,0x01,0x23,0x22,0x27,0x26,0x27,0x26,0x27,0x26,0x27,0x03,0x27,
-0x37,0x06,0x07,0x06,0x07,0x35,0x36,0x37,0x36,0x3f,0x01,0x05,0x35,0x25,0x37,0x25,
-0x35,0x05,0x13,0x17,0x03,0x25,0x27,0x04,0x08,0x01,0xd3,0xfd,0x75,0x5e,0x30,0x36,
-0x0a,0x06,0x06,0x0e,0x9c,0x5e,0x56,0xa8,0x68,0x6a,0xb2,0x62,0x6e,0x92,0x0a,0x06,
-0x06,0x10,0x47,0x3b,0x68,0xa4,0x56,0x38,0x36,0x56,0x62,0x68,0x5a,0x4d,0x53,0x3c,
-0xfe,0x61,0x01,0xe9,0x5e,0xfd,0xb9,0x02,0x83,0x80,0xa4,0xe8,0x01,0x02,0xce,0x03,
-0xbf,0x86,0xaa,0xbb,0xf7,0x0d,0x16,0x04,0x02,0x02,0x06,0x3e,0x4c,0x54,0xb2,0x4e,
-0x46,0x3c,0x04,0x02,0x02,0x06,0x1d,0x0f,0xfe,0xf1,0x3d,0xdf,0x09,0x18,0x26,0x54,
-0xb2,0x4e,0x23,0x1e,0x04,0xa1,0x77,0xb2,0x8b,0xf4,0xa8,0xb0,0xb8,0x01,0x66,0x3d,
-0xfd,0x80,0x4a,0x3b,0x00,0x02,0x00,0xd0,0xff,0x4e,0x05,0xdc,0x05,0x7d,0x00,0x06,
-0x00,0x0d,0x00,0x00,0x13,0x35,0x01,0x15,0x01,0x35,0x09,0x03,0x15,0x01,0x35,0x01,
-0xda,0x05,0x02,0xfa,0xfe,0x03,0xc0,0x01,0x38,0xfc,0x40,0x03,0xc0,0xfa,0xfe,0x05,
-0x02,0x02,0x27,0xb0,0xfe,0x91,0xaa,0xfe,0x90,0xb2,0x01,0x12,0x03,0xbb,0xfe,0xeb,
-0xfe,0xee,0xb2,0x01,0x70,0xaa,0x01,0x6f,0x00,0x02,0x00,0xd0,0xff,0x4e,0x05,0xdc,
-0x05,0x7d,0x00,0x06,0x00,0x0d,0x00,0x00,0x09,0x02,0x15,0x01,0x35,0x09,0x01,0x35,
-0x01,0x15,0x01,0x35,0x01,0x05,0xd2,0xfc,0x40,0x03,0xc0,0xfa,0xfe,0x05,0x02,0xfb,
-0x08,0x05,0x02,0xfa,0xfe,0x03,0xc0,0x02,0x27,0xfe,0xeb,0xfe,0xee,0xb2,0x01,0x70,
-0xaa,0x01,0x6f,0x01,0xf6,0xb0,0xfe,0x91,0xaa,0xfe,0x90,0xb2,0x01,0x12,0x00,0x03,
-0x00,0xd0,0xfe,0x6d,0x05,0xdc,0x06,0x60,0x00,0x02,0x00,0x1e,0x00,0x21,0x00,0x00,
-0x2d,0x02,0x03,0x25,0x35,0x25,0x13,0x17,0x03,0x25,0x15,0x05,0x03,0x05,0x15,0x25,
-0x07,0x05,0x15,0x05,0x03,0x27,0x13,0x05,0x35,0x25,0x13,0x25,0x35,0x05,0x13,0x0d,
-0x01,0x03,0x4d,0x01,0x4d,0xfe,0xdc,0x60,0xfd,0xba,0x02,0xc2,0x5a,0xa6,0x44,0x01,
-0x84,0xfe,0x4f,0x41,0x01,0xf2,0xfd,0xe8,0x1e,0x02,0x40,0xfd,0x46,0x5a,0xa6,0x44,
-0xfe,0x74,0x01,0xb8,0x40,0xfe,0x08,0x02,0x1f,0x6d,0xfe,0xac,0x01,0x2a,0xb3,0x5f,
-0x54,0x01,0x57,0xa7,0xaa,0xca,0x01,0x88,0x26,0xfe,0xd4,0x6f,0xb0,0x7d,0xfe,0xe4,
-0x8e,0xb2,0x9a,0x81,0xa5,0xaa,0xc8,0xfe,0x77,0x26,0x01,0x2d,0x72,0xb2,0x7e,0x01,
-0x18,0x91,0xb0,0x9b,0x01,0xde,0x62,0x55,0x00,0x03,0x00,0xd0,0xfe,0x6d,0x05,0xdc,
-0x06,0x60,0x00,0x02,0x00,0x05,0x00,0x21,0x00,0x00,0x01,0x07,0x17,0x01,0x37,0x2f,
-0x01,0x25,0x35,0x05,0x13,0x17,0x03,0x05,0x15,0x05,0x07,0x25,0x15,0x05,0x07,0x05,
-0x15,0x25,0x03,0x27,0x13,0x25,0x35,0x25,0x37,0x05,0x35,0x25,0x02,0xc0,0xae,0x98,
-0x01,0x4a,0xa6,0x92,0xa4,0xfd,0x76,0x02,0xb1,0x61,0xa6,0x64,0x01,0xae,0xfd,0xec,
-0x22,0x02,0x2c,0xfd,0xa9,0x2c,0x02,0x83,0xfd,0x56,0x60,0xa6,0x62,0xfe,0x4c,0x02,
-0x1c,0x22,0xfd,0xcc,0x02,0x5f,0x01,0x44,0x32,0x2c,0x02,0xa3,0x2f,0x2a,0x2f,0xbc,
-0xb0,0xc5,0x01,0xa8,0x26,0xfe,0x4f,0x7b,0xaa,0x98,0x94,0x9f,0xb0,0xad,0xc2,0xb8,
-0xb2,0xc4,0xfe,0x5b,0x26,0x01,0xae,0x7d,0xaa,0x9a,0x94,0xa2,0xb2,0xad,0x00,0x01,
-0x00,0xd9,0xff,0xb2,0x05,0xdb,0x05,0x50,0x00,0x0a,0x00,0x00,0x01,0x00,0x05,0x04,
-0x01,0x15,0x00,0x25,0x35,0x24,0x01,0x05,0xdb,0xfe,0x72,0xfd,0xf3,0x02,0x09,0x01,
-0x92,0xfe,0x6f,0xfc,0x8f,0x03,0x73,0x01,0x8f,0x04,0x61,0xfe,0x81,0x61,0x5e,0xfe,
-0x7e,0xef,0x02,0x00,0x7c,0xa6,0x7c,0x02,0x00,0x00,0x00,0x01,0x00,0xd9,0xff,0xb2,
-0x05,0xdb,0x05,0x50,0x00,0x0a,0x00,0x00,0x13,0x35,0x00,0x05,0x15,0x04,0x01,0x35,
-0x00,0x25,0x24,0xd9,0x01,0x8f,0x03,0x73,0xfc,0x8f,0xfe,0x6f,0x01,0x92,0x02,0x09,
-0xfd,0xf3,0x04,0x61,0xef,0xfe,0x00,0x7c,0xa6,0x7c,0xfe,0x00,0xef,0x01,0x82,0x5e,
-0x61,0x00,0x00,0x02,0x00,0xd9,0xff,0x29,0x05,0xdb,0x05,0x57,0x00,0x05,0x00,0x10,
-0x00,0x00,0x21,0x15,0x00,0x25,0x35,0x04,0x01,0x00,0x05,0x04,0x01,0x15,0x00,0x25,
-0x35,0x24,0x01,0x05,0xdb,0xfe,0x67,0xfc,0x97,0x03,0x56,0x01,0xac,0xfe,0x81,0xfe,
-0x24,0x01,0xdc,0x01,0x7f,0xfe,0x81,0xfc,0x7d,0x03,0x83,0x01,0x7f,0xd7,0x01,0xbe,
-0x91,0xae,0x85,0x02,0xdf,0xfe,0xe5,0x5d,0x5d,0xfe,0xe5,0xd7,0x01,0x78,0x84,0xa6,
-0x7c,0x01,0x80,0x00,0x00,0x02,0x00,0xd9,0xff,0x29,0x05,0xdb,0x05,0x57,0x00,0x05,
-0x00,0x10,0x00,0x00,0x33,0x00,0x25,0x15,0x04,0x01,0x11,0x35,0x00,0x05,0x15,0x04,
-0x01,0x35,0x00,0x25,0x24,0xd9,0x01,0xac,0x03,0x56,0xfc,0x97,0xfe,0x67,0x01,0x7f,
-0x03,0x83,0xfc,0x7d,0xfe,0x81,0x01,0x7f,0x01,0xdc,0xfe,0x24,0x01,0xa1,0x85,0xae,
-0x91,0xfe,0x42,0x05,0x57,0xd7,0xfe,0x80,0x7c,0xa6,0x84,0xfe,0x88,0xd7,0x01,0x1b,
-0x5d,0x5d,0x00,0x02,0x00,0xd9,0xff,0x52,0x05,0xdb,0x05,0x57,0x00,0x1d,0x00,0x28,
-0x00,0x00,0x25,0x15,0x0e,0x01,0x23,0x22,0x27,0x26,0x27,0x26,0x27,0x26,0x23,0x22,
-0x06,0x07,0x35,0x3e,0x01,0x33,0x32,0x17,0x16,0x17,0x16,0x17,0x16,0x33,0x32,0x36,
-0x13,0x00,0x05,0x04,0x01,0x15,0x00,0x25,0x35,0x24,0x01,0x05,0xdb,0x69,0xb3,0x61,
-0x6e,0x92,0x0a,0x07,0x06,0x0f,0x9b,0x5e,0x58,0xac,0x62,0x69,0xb3,0x61,0x6e,0x93,
-0x0b,0x05,0x06,0x0f,0x9b,0x5e,0x56,0xa9,0x67,0xfe,0x81,0xfe,0x24,0x01,0xdc,0x01,
-0x7f,0xfe,0x81,0xfc,0x7d,0x03,0x83,0x01,0x7f,0xb1,0xb3,0x4e,0x45,0x3b,0x04,0x03,
-0x02,0x06,0x3d,0x4c,0x54,0xb3,0x4e,0x45,0x3b,0x05,0x02,0x02,0x06,0x3d,0x4b,0x04,
-0x24,0xfe,0xe5,0x5d,0x5d,0xfe,0xe5,0xd7,0x01,0x78,0x84,0xa6,0x7c,0x01,0x80,0x00,
-0x00,0x02,0x00,0xd9,0xff,0x52,0x05,0xdb,0x05,0x57,0x00,0x1d,0x00,0x28,0x00,0x00,
-0x25,0x15,0x0e,0x01,0x23,0x22,0x27,0x26,0x27,0x26,0x27,0x26,0x23,0x22,0x06,0x07,
-0x35,0x3e,0x01,0x33,0x32,0x17,0x16,0x17,0x16,0x17,0x16,0x33,0x32,0x36,0x01,0x00,
-0x05,0x04,0x01,0x15,0x00,0x25,0x35,0x24,0x01,0x05,0xdb,0x69,0xb3,0x61,0x6e,0x92,
-0x0a,0x07,0x06,0x0f,0x9b,0x5e,0x58,0xac,0x62,0x69,0xb3,0x61,0x6e,0x93,0x0b,0x05,
-0x06,0x0f,0x9b,0x5e,0x56,0xa9,0xfb,0x65,0x01,0x7f,0x01,0xdc,0xfe,0x24,0xfe,0x81,
-0x01,0x7f,0x03,0x83,0xfc,0x7d,0xfe,0x81,0xb1,0xb3,0x4e,0x45,0x3b,0x04,0x03,0x02,
-0x06,0x3d,0x4c,0x54,0xb3,0x4e,0x45,0x3b,0x05,0x02,0x02,0x06,0x3d,0x4b,0x04,0x24,
-0xfe,0xe5,0x5d,0x5d,0xfe,0xe5,0xd7,0x01,0x78,0x84,0xa6,0x7c,0x01,0x80,0x00,0x02,
-0x00,0xd9,0xff,0x83,0x05,0xdb,0x06,0x1d,0x00,0x15,0x00,0x1a,0x00,0x00,0x01,0x26,
-0x25,0x35,0x24,0x25,0x01,0x17,0x03,0x36,0x37,0x15,0x06,0x07,0x03,0x04,0x17,0x15,
-0x02,0x25,0x03,0x27,0x01,0x06,0x07,0x16,0x17,0x02,0xee,0xf0,0xfe,0xdb,0x01,0xc3,
-0x01,0x45,0x01,0x1e,0x83,0xb9,0x9e,0x74,0xba,0xd6,0x8b,0x01,0x24,0xf7,0xe3,0xfe,
-0x82,0xeb,0x82,0x01,0x6b,0x97,0xa1,0x7d,0x75,0x01,0xb0,0x55,0x29,0xa6,0x3f,0xa5,
-0x02,0x65,0x4b,0xfe,0x74,0x75,0x95,0xef,0xb3,0x75,0xfe,0xd4,0x7f,0xed,0xef,0x01,
-0x22,0xa6,0xfe,0x09,0x4b,0x03,0x0a,0x39,0x1e,0x17,0x27,0x00,0x00,0x02,0x00,0xd9,
-0xfe,0xe5,0x05,0xdb,0x05,0x7f,0x00,0x15,0x00,0x1a,0x00,0x00,0x01,0x16,0x05,0x15,
-0x04,0x05,0x01,0x27,0x13,0x06,0x07,0x35,0x36,0x37,0x13,0x24,0x27,0x35,0x12,0x05,
-0x13,0x17,0x01,0x36,0x37,0x26,0x27,0x03,0xc6,0xf0,0x01,0x25,0xfe,0x3d,0xfe,0xbb,
-0xfe,0xe2,0x83,0xb9,0x9e,0x74,0xba,0xd6,0x8b,0xfe,0xdc,0xf7,0xe3,0x01,0x7e,0xeb,
-0x82,0xfe,0x95,0x97,0xa1,0x7d,0x75,0x03,0x52,0x55,0x29,0xa6,0x3f,0xa5,0xfd,0x9b,
-0x4b,0x01,0x8c,0x75,0x95,0xef,0xb3,0x75,0x01,0x2c,0x7f,0xed,0xef,0xfe,0xde,0xa6,
-0x01,0xf7,0x4b,0xfc,0xf6,0x39,0x1e,0x17,0x27,0x00,0x00,0x01,0x00,0xcb,0x00,0xa3,
-0x05,0xe9,0x04,0x5f,0x00,0x14,0x00,0x00,0x25,0x21,0x22,0x27,0x26,0x35,0x34,0x37,
-0x36,0x33,0x21,0x15,0x21,0x22,0x06,0x15,0x14,0x17,0x16,0x33,0x21,0x05,0xe8,0xfc,
-0xc2,0xca,0x8a,0x8a,0x8a,0x8a,0xc8,0x03,0x40,0xfc,0xc0,0x88,0xbe,0x5e,0x60,0x88,
-0x03,0x40,0xa3,0x8b,0x8b,0xc8,0xc6,0x8d,0x8b,0x96,0xc0,0x88,0x8a,0x5e,0x60,0x00,
-0x00,0x01,0x00,0xcb,0x00,0xa3,0x05,0xe9,0x04,0x5f,0x00,0x14,0x00,0x00,0x37,0x35,
-0x21,0x32,0x37,0x36,0x35,0x34,0x26,0x23,0x21,0x35,0x21,0x32,0x17,0x16,0x15,0x14,
-0x07,0x06,0x23,0xcc,0x03,0x40,0x88,0x60,0x5e,0xbe,0x88,0xfc,0xc0,0x03,0x40,0xc8,
-0x8a,0x8a,0x8a,0x8a,0xca,0xa3,0x96,0x60,0x5e,0x8a,0x88,0xc0,0x96,0x8b,0x8d,0xc6,
-0xc8,0x8b,0x8b,0x00,0x00,0x02,0x00,0xcb,0xff,0x3b,0x05,0xe9,0x05,0xcf,0x00,0x09,
-0x00,0x1e,0x00,0x00,0x01,0x23,0x22,0x06,0x15,0x14,0x17,0x16,0x3b,0x01,0x1b,0x01,
-0x33,0x03,0x21,0x15,0x21,0x03,0x21,0x15,0x21,0x03,0x23,0x13,0x22,0x00,0x35,0x34,
-0x37,0x36,0x33,0x03,0xa2,0xfa,0x88,0xbe,0x5e,0x60,0x88,0x30,0xf8,0x72,0xaa,0x72,
-0x01,0x6e,0xfe,0x64,0xca,0x02,0x66,0xfd,0x6c,0x70,0xaa,0x70,0xc8,0xfe,0xea,0x8a,
-0x8a,0xc8,0x03,0xc9,0xc0,0x88,0x8a,0x5e,0x60,0x03,0x26,0x01,0x70,0xfe,0x90,0x96,
-0xfd,0x70,0x96,0xfe,0x98,0x01,0x68,0x01,0x16,0xc8,0xc6,0x8d,0x8b,0x00,0x00,0x02,
-0x00,0xcb,0xff,0x33,0x05,0xe9,0x05,0xc7,0x00,0x09,0x00,0x1e,0x00,0x00,0x01,0x33,
-0x32,0x36,0x35,0x34,0x27,0x26,0x2b,0x01,0x0b,0x01,0x23,0x13,0x21,0x35,0x21,0x13,
-0x21,0x35,0x21,0x13,0x33,0x03,0x32,0x00,0x15,0x14,0x07,0x06,0x23,0x03,0x12,0xfa,
-0x88,0xbe,0x5e,0x60,0x88,0x30,0xf8,0x72,0xaa,0x72,0xfe,0x92,0x01,0x9c,0xca,0xfd,
-0x9a,0x02,0x94,0x70,0xaa,0x70,0xc8,0x01,0x16,0x8a,0x8a,0xc8,0x01,0x39,0xc0,0x88,
-0x8a,0x5e,0x60,0xfc,0xda,0xfe,0x90,0x01,0x70,0x96,0x02,0x90,0x96,0x01,0x68,0xfe,
-0x98,0xfe,0xea,0xc8,0xc6,0x8d,0x8b,0x00,0x00,0x02,0x00,0xbe,0x00,0x00,0x05,0xdb,
-0x04,0xe8,0x00,0x03,0x00,0x18,0x00,0x00,0x37,0x21,0x15,0x21,0x01,0x21,0x22,0x27,
-0x26,0x35,0x34,0x37,0x36,0x33,0x21,0x15,0x21,0x22,0x06,0x15,0x14,0x17,0x16,0x33,
-0x21,0xf2,0x04,0xe9,0xfb,0x17,0x04,0xe9,0xfc,0xc1,0xc9,0x8a,0x8b,0x8b,0x8a,0xc8,
-0x03,0x40,0xfc,0xc0,0x89,0xbe,0x5f,0x60,0x88,0x03,0x40,0x96,0x96,0x01,0x2c,0x8b,
-0x8b,0xc8,0xc6,0x8d,0x8b,0x96,0xc0,0x88,0x8a,0x5e,0x60,0x00,0x00,0x02,0x00,0xd9,
-0x00,0x00,0x05,0xf6,0x04,0xe8,0x00,0x03,0x00,0x18,0x00,0x00,0x37,0x21,0x15,0x21,
-0x11,0x35,0x21,0x32,0x37,0x36,0x35,0x34,0x26,0x23,0x21,0x35,0x21,0x32,0x17,0x16,
-0x15,0x14,0x07,0x06,0x23,0xd9,0x04,0xe9,0xfb,0x17,0x03,0x40,0x88,0x60,0x5f,0xbe,
-0x89,0xfc,0xc0,0x03,0x40,0xc8,0x8a,0x8b,0x8b,0x8a,0xc9,0x96,0x96,0x01,0x2c,0x96,
-0x60,0x5e,0x8a,0x88,0xc0,0x96,0x8b,0x8d,0xc6,0xc8,0x8b,0x8b,0x00,0x02,0x00,0xbe,
-0xff,0x13,0x05,0xdb,0x05,0xd7,0x00,0x09,0x00,0x27,0x00,0x00,0x01,0x21,0x22,0x06,
-0x15,0x14,0x17,0x16,0x3b,0x02,0x21,0x15,0x21,0x07,0x21,0x15,0x21,0x07,0x27,0x37,
-0x21,0x35,0x21,0x37,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x21,0x37,0x17,0x07,
-0x21,0x15,0x21,0x03,0xd1,0xfe,0xca,0x89,0xbe,0x5f,0x60,0x88,0x27,0x9c,0x02,0x7d,
-0xfd,0x45,0x3d,0x02,0xf8,0xfc,0xc9,0x61,0x86,0x4c,0xfe,0xe9,0x01,0x54,0x3e,0xb9,
-0x82,0x8b,0x8b,0x8a,0xc8,0x01,0x73,0x63,0x86,0x4c,0x01,0x30,0xfe,0x92,0x04,0x52,
-0xc0,0x88,0x8a,0x5e,0x60,0x96,0x96,0x96,0xed,0x35,0xb8,0x96,0x96,0x08,0x83,0x8b,
-0xc8,0xc6,0x8d,0x8b,0xef,0x37,0xb8,0x96,0x00,0x02,0x00,0xd9,0xff,0x13,0x05,0xf6,
-0x05,0xd7,0x00,0x09,0x00,0x27,0x00,0x00,0x01,0x33,0x32,0x37,0x36,0x35,0x34,0x27,
-0x26,0x2f,0x01,0x21,0x35,0x21,0x37,0x17,0x07,0x16,0x17,0x16,0x15,0x14,0x07,0x06,
-0x2b,0x01,0x07,0x21,0x15,0x21,0x07,0x27,0x37,0x21,0x35,0x21,0x37,0x21,0x35,0x21,
-0x03,0x5e,0xbb,0x88,0x60,0x5f,0x5f,0x42,0x56,0x99,0xfd,0x09,0x03,0x35,0x63,0x86,
-0x54,0x70,0x58,0x8b,0x8b,0x8a,0xc9,0xf7,0x3f,0x02,0xe0,0xfc,0xe3,0x62,0x86,0x4c,
-0xfe,0xd0,0x01,0x6d,0x3e,0xfe,0x55,0x01,0xe9,0x01,0xc2,0x60,0x5e,0x8a,0x88,0x60,
-0x43,0x14,0x09,0x96,0xef,0x37,0xcb,0x20,0x58,0x8d,0xc6,0xc8,0x8b,0x8b,0x96,0x96,
-0xed,0x35,0xb8,0x96,0x96,0x96,0x00,0x02,0x00,0xbe,0xff,0x6a,0x05,0xdb,0x04,0xe8,
-0x00,0x0b,0x00,0x20,0x00,0x00,0x29,0x01,0x35,0x21,0x37,0x17,0x07,0x21,0x15,0x21,
-0x07,0x27,0x01,0x21,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x21,0x15,0x21,0x22,
-0x06,0x15,0x14,0x17,0x16,0x33,0x21,0x02,0xc4,0xfe,0x2e,0x02,0x42,0x71,0x78,0x2d,
-0x01,0xeb,0xfd,0xa5,0x71,0x78,0x03,0x44,0xfc,0xc1,0xc9,0x8a,0x8b,0x8b,0x8a,0xc8,
-0x03,0x40,0xfc,0xc0,0x89,0xbe,0x5f,0x60,0x88,0x03,0x40,0x96,0x96,0x5a,0x3c,0x96,
-0x96,0x5a,0x01,0x68,0x8b,0x8b,0xc8,0xc6,0x8d,0x8b,0x96,0xc0,0x88,0x8a,0x5e,0x60,
-0x00,0x02,0x00,0xbe,0xff,0x6a,0x05,0xdb,0x04,0xe8,0x00,0x0b,0x00,0x20,0x00,0x00,
-0x29,0x01,0x35,0x21,0x37,0x17,0x07,0x21,0x15,0x21,0x07,0x27,0x01,0x35,0x21,0x32,
-0x37,0x36,0x35,0x34,0x26,0x23,0x21,0x35,0x21,0x32,0x17,0x16,0x15,0x14,0x07,0x06,
-0x23,0x02,0xc4,0xfe,0x2e,0x02,0x42,0x71,0x78,0x2d,0x01,0xeb,0xfd,0xa5,0x71,0x78,
-0xfe,0x27,0x03,0x40,0x88,0x60,0x5f,0xbe,0x89,0xfc,0xc0,0x03,0x40,0xc8,0x8a,0x8b,
-0x8b,0x8a,0xc9,0x96,0x96,0x5a,0x3c,0x96,0x96,0x5a,0x01,0x68,0x96,0x60,0x5e,0x8a,
-0x88,0xc0,0x96,0x8b,0x8d,0xc6,0xc8,0x8b,0x8b,0x00,0x00,0x03,0x00,0xbb,0xff,0xe3,
-0x05,0xf9,0x05,0x24,0x00,0x19,0x00,0x33,0x00,0x3f,0x00,0x00,0x00,0x22,0x07,0x06,
-0x07,0x0e,0x01,0x15,0x14,0x16,0x17,0x16,0x17,0x16,0x32,0x37,0x36,0x37,0x3e,0x01,
-0x35,0x34,0x26,0x27,0x26,0x27,0x24,0x20,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,
-0x06,0x07,0x0e,0x01,0x20,0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,
-0x05,0x11,0x21,0x15,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x11,0x03,0xc5,0xd6,0x5d,
-0x5c,0x4c,0x4d,0x4c,0x4c,0x4d,0x4c,0x5c,0x5d,0xd6,0x5d,0x5c,0x4c,0x4d,0x4c,0x4c,
-0x4d,0x4c,0x5c,0xfe,0xae,0x01,0x14,0xee,0x62,0x63,0x31,0x31,0x31,0x31,0x63,0x62,
-0xee,0xfe,0xec,0xee,0x62,0x63,0x31,0x31,0x31,0x31,0x63,0x62,0x01,0xcd,0x01,0x64,
-0xfe,0x9c,0xaa,0xfe,0x9c,0x01,0x64,0x04,0x8e,0x27,0x27,0x4c,0x4d,0xb8,0x6d,0x6a,
-0xb8,0x4d,0x4c,0x27,0x27,0x27,0x27,0x4c,0x4d,0xb8,0x6a,0x6d,0xb8,0x4d,0x4c,0x27,
-0xbd,0x64,0x62,0x63,0x77,0x76,0x8c,0x89,0x77,0x76,0x63,0x62,0x64,0x64,0x62,0x63,
-0x76,0x77,0x89,0x8c,0x76,0x77,0x63,0x62,0x84,0xfe,0x9b,0xaa,0xfe,0x9b,0x01,0x65,
-0xaa,0x01,0x65,0x00,0x00,0x03,0x00,0xbb,0xff,0xe3,0x05,0xf9,0x05,0x24,0x00,0x03,
-0x00,0x1d,0x00,0x37,0x00,0x00,0x01,0x21,0x15,0x21,0x00,0x22,0x07,0x06,0x07,0x0e,
-0x01,0x15,0x14,0x16,0x17,0x16,0x17,0x16,0x32,0x37,0x36,0x37,0x3e,0x01,0x35,0x34,
-0x26,0x27,0x26,0x27,0x24,0x20,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,
-0x0e,0x01,0x20,0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x01,0xa1,
-0x03,0x72,0xfc,0x8e,0x02,0x24,0xd6,0x5d,0x5c,0x4c,0x4d,0x4c,0x4c,0x4d,0x4c,0x5c,
-0x5d,0xd6,0x5d,0x5c,0x4c,0x4d,0x4c,0x4c,0x4d,0x4c,0x5c,0xfe,0xae,0x01,0x14,0xee,
-0x62,0x63,0x31,0x31,0x31,0x31,0x63,0x62,0xee,0xfe,0xec,0xee,0x62,0x63,0x31,0x31,
-0x31,0x31,0x63,0x62,0x02,0xd7,0xaa,0x02,0x61,0x27,0x27,0x4c,0x4d,0xb8,0x6d,0x6a,
-0xb8,0x4d,0x4c,0x27,0x27,0x27,0x27,0x4c,0x4d,0xb8,0x6a,0x6d,0xb8,0x4d,0x4c,0x27,
-0xbd,0x64,0x62,0x63,0x77,0x76,0x8c,0x89,0x77,0x76,0x63,0x62,0x64,0x64,0x62,0x63,
-0x76,0x77,0x89,0x8c,0x76,0x77,0x63,0x62,0x00,0x03,0x00,0xbb,0xff,0xe3,0x05,0xf9,
-0x05,0x24,0x00,0x19,0x00,0x33,0x00,0x3f,0x00,0x00,0x00,0x22,0x07,0x06,0x07,0x0e,
-0x01,0x15,0x14,0x16,0x17,0x16,0x17,0x16,0x32,0x37,0x36,0x37,0x3e,0x01,0x35,0x34,
-0x26,0x27,0x26,0x27,0x24,0x20,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,
-0x0e,0x01,0x20,0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x01,0x07,
-0x17,0x07,0x27,0x07,0x27,0x37,0x27,0x37,0x17,0x37,0x03,0xc5,0xd6,0x5d,0x5c,0x4c,
-0x4d,0x4c,0x4c,0x4d,0x4c,0x5c,0x5d,0xd6,0x5d,0x5c,0x4c,0x4d,0x4c,0x4c,0x4d,0x4c,
-0x5c,0xfe,0xae,0x01,0x14,0xee,0x62,0x63,0x31,0x31,0x31,0x31,0x63,0x62,0xee,0xfe,
-0xec,0xee,0x62,0x63,0x31,0x31,0x31,0x31,0x63,0x62,0x02,0xed,0xfd,0xfc,0x78,0xfc,
-0xfc,0x79,0xfd,0xfc,0x78,0xfc,0xfc,0x04,0x8e,0x27,0x27,0x4c,0x4d,0xb8,0x6d,0x6a,
-0xb8,0x4d,0x4c,0x27,0x27,0x27,0x27,0x4c,0x4d,0xb8,0x6a,0x6d,0xb8,0x4d,0x4c,0x27,
-0xbd,0x64,0x62,0x63,0x77,0x76,0x8c,0x89,0x77,0x76,0x63,0x62,0x64,0x64,0x62,0x63,
-0x76,0x77,0x89,0x8c,0x76,0x77,0x63,0x62,0xfe,0xbe,0xfc,0xfc,0x78,0xfc,0xfd,0x79,
-0xfc,0xfc,0x78,0xfc,0xfd,0x00,0x00,0x03,0x00,0xbb,0xff,0xe3,0x05,0xf9,0x05,0x24,
-0x00,0x03,0x00,0x1d,0x00,0x37,0x00,0x00,0x09,0x01,0x17,0x01,0x00,0x22,0x07,0x06,
-0x07,0x0e,0x01,0x15,0x14,0x16,0x17,0x16,0x17,0x16,0x32,0x37,0x36,0x37,0x3e,0x01,
-0x35,0x34,0x26,0x27,0x26,0x27,0x24,0x20,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,
-0x06,0x07,0x0e,0x01,0x20,0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,
-0x01,0xe6,0x02,0x70,0x78,0xfd,0x90,0x01,0x67,0xd6,0x5d,0x5c,0x4c,0x4d,0x4c,0x4c,
-0x4d,0x4c,0x5c,0x5d,0xd6,0x5d,0x5c,0x4c,0x4d,0x4c,0x4c,0x4d,0x4c,0x5c,0xfe,0xae,
-0x01,0x14,0xee,0x62,0x63,0x31,0x31,0x31,0x31,0x63,0x62,0xee,0xfe,0xec,0xee,0x62,
-0x63,0x31,0x31,0x31,0x31,0x63,0x62,0x01,0x86,0x02,0x70,0x78,0xfd,0x90,0x03,0x80,
-0x27,0x27,0x4c,0x4d,0xb8,0x6d,0x6a,0xb8,0x4d,0x4c,0x27,0x27,0x27,0x27,0x4c,0x4d,
-0xb8,0x6a,0x6d,0xb8,0x4d,0x4c,0x27,0xbd,0x64,0x62,0x63,0x77,0x76,0x8c,0x89,0x77,
-0x76,0x63,0x62,0x64,0x64,0x62,0x63,0x76,0x77,0x89,0x8c,0x76,0x77,0x63,0x62,0x00,
-0x00,0x01,0x00,0xaf,0x00,0x00,0x06,0x49,0x05,0x9a,0x00,0x07,0x00,0x00,0x01,0x11,
-0x33,0x11,0x21,0x35,0x21,0x15,0x03,0x3c,0x80,0x02,0x8d,0xfa,0x66,0x05,0x1b,0xfa,
-0xe5,0x05,0x1b,0x7f,0x7f,0x00,0x00,0x01,0x00,0xaf,0x00,0x00,0x06,0x49,0x05,0x9a,
-0x00,0x07,0x00,0x00,0x25,0x11,0x33,0x11,0x21,0x15,0x21,0x35,0x03,0x3c,0x80,0x02,
-0x8d,0xfa,0x66,0x7f,0x05,0x1b,0xfa,0xe5,0x7f,0x7f,0xff,0xff,0x00,0x06,0xfe,0x23,
-0x03,0xee,0x06,0x75,0x12,0x02,0x09,0x65,0x00,0x00,0xff,0xff,0x00,0xdb,0x02,0x48,
-0x01,0xae,0x03,0x46,0x10,0x06,0x08,0x8a,0x00,0x00,0x00,0x01,0x00,0xf9,0x01,0x31,
-0x04,0x09,0x04,0x19,0x00,0x09,0x00,0x00,0x13,0x21,0x1b,0x01,0x21,0x07,0x13,0x27,
-0x07,0x13,0xf9,0x01,0x2b,0x5d,0x5e,0x01,0x2a,0xf2,0x5e,0xf4,0xf3,0x5d,0x02,0xfd,
-0x01,0x1c,0xfe,0xe4,0xb0,0xfe,0xe4,0xb0,0xb0,0x01,0x1c,0x00,0x00,0x02,0x00,0x92,
-0x00,0x00,0x04,0x82,0x04,0xc4,0x00,0x04,0x00,0x09,0x00,0x00,0x33,0x11,0x09,0x01,
-0x11,0x25,0x21,0x11,0x09,0x01,0x92,0x01,0xf8,0x01,0xf8,0xfc,0xb6,0x02,0xa4,0xfe,
-0xae,0xfe,0xae,0x02,0xa0,0x02,0x24,0xfd,0xdc,0xfd,0x60,0xaa,0x01,0xd5,0x01,0x79,
-0xfe,0x87,0x00,0x03,0x00,0x64,0x00,0x00,0x06,0x94,0x05,0x9a,0x00,0x05,0x00,0x09,
-0x00,0x0d,0x00,0x00,0x21,0x09,0x01,0x27,0x09,0x02,0x35,0x21,0x15,0x05,0x35,0x21,
-0x15,0x05,0xf2,0xfd,0x88,0xfd,0x85,0x9b,0x03,0x18,0x03,0x18,0xfa,0x1b,0x05,0x9a,
-0xfa,0x66,0x05,0x9a,0x03,0x03,0xfc,0xfd,0x01,0x03,0xbd,0xfc,0x42,0x05,0x1a,0x80,
-0x80,0xe2,0x80,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x90,0x06,0x14,0x00,0x05,
-0x00,0x00,0x01,0x21,0x11,0x23,0x11,0x21,0x01,0x90,0xfe,0xfe,0x8e,0x01,0x90,0x05,
-0x85,0xfa,0x7b,0x06,0x14,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x90,0x06,0x14,
-0x00,0x05,0x00,0x00,0x11,0x35,0x21,0x11,0x23,0x11,0x01,0x90,0x8e,0x05,0x85,0x8f,
-0xf9,0xec,0x05,0x85,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x90,0x06,0x14,0x00,0x05,
-0x00,0x00,0x25,0x15,0x21,0x11,0x33,0x11,0x01,0x90,0xfe,0x70,0x8e,0x8f,0x8f,0x06,
-0x14,0xfa,0x7b,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x90,0x06,0x14,0x00,0x05,
-0x00,0x00,0x35,0x21,0x11,0x33,0x11,0x21,0x01,0x02,0x8e,0xfe,0x70,0x8f,0x05,0x85,
-0xf9,0xec,0x00,0x01,0x00,0xd9,0x01,0x1f,0x05,0xdb,0x03,0x5e,0x00,0x05,0x00,0x00,
-0x01,0x15,0x21,0x11,0x23,0x11,0x05,0xdb,0xfb,0xa6,0xa8,0x03,0x5e,0xaa,0xfe,0x6b,
-0x02,0x3f,0x00,0x02,0x00,0x06,0x01,0x02,0x04,0x15,0x05,0x12,0x00,0x07,0x00,0x0f,
-0x00,0x00,0x13,0x24,0x05,0x02,0x13,0x04,0x25,0x12,0x01,0x12,0x03,0x04,0x25,0x02,
-0x13,0x24,0x8c,0x01,0x81,0x01,0x81,0x89,0x89,0xfe,0x7f,0xfe,0x7f,0x89,0xfe,0xf1,
-0xb8,0xb8,0x02,0x07,0x02,0x08,0xb8,0xb8,0xfd,0xf8,0x01,0x8a,0x89,0x89,0x01,0x80,
-0x01,0x82,0x8a,0x8a,0xfe,0x7e,0xfd,0xf8,0x01,0xf4,0x02,0x1c,0xb1,0xb1,0xfe,0x0c,
-0xfd,0xe5,0xb1,0x00,0x00,0x06,0x00,0xf7,0x00,0x01,0x07,0x09,0x06,0x13,0x00,0x03,
-0x00,0x31,0x00,0x3b,0x00,0x46,0x00,0x4f,0x00,0x59,0x00,0x00,0x01,0x21,0x11,0x21,
-0x11,0x15,0x14,0x06,0x20,0x26,0x35,0x34,0x36,0x3b,0x01,0x11,0x23,0x22,0x26,0x35,
-0x34,0x36,0x20,0x16,0x1d,0x01,0x21,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,
-0x2b,0x01,0x11,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x3d,0x01,0x01,0x35,
-0x34,0x26,0x23,0x22,0x06,0x14,0x16,0x33,0x13,0x23,0x22,0x06,0x15,0x14,0x16,0x33,
-0x32,0x36,0x35,0x01,0x33,0x32,0x36,0x34,0x26,0x22,0x06,0x15,0x11,0x15,0x14,0x16,
-0x32,0x36,0x35,0x34,0x26,0x23,0x03,0x6c,0x01,0x28,0xfe,0xd8,0xb9,0xfe,0xfc,0xb8,
-0xb8,0x7f,0xaa,0xaa,0x7f,0xb8,0xb8,0x01,0x04,0xb9,0x01,0x28,0xb9,0x82,0x83,0xb7,
-0xb7,0x80,0xaa,0xaa,0x80,0xb7,0xb7,0x83,0x82,0xb9,0xfe,0x44,0x62,0x45,0x44,0x62,
-0x62,0x45,0xa6,0xa6,0x45,0x62,0x62,0x45,0x44,0x62,0x02,0x50,0xa7,0x44,0x62,0x61,
-0x8a,0x62,0x62,0x8a,0x61,0x62,0x44,0x02,0x76,0x01,0x28,0xfe,0x44,0xaa,0x80,0xb7,
-0xb8,0x83,0x80,0xba,0x01,0x28,0xba,0x81,0x82,0xb8,0xb7,0x80,0xaa,0xaa,0x80,0xb7,
-0xb8,0x82,0x81,0xba,0xfe,0xd8,0xba,0x80,0x83,0xb8,0xb7,0x80,0xaa,0x02,0x50,0xa7,
-0x45,0x61,0x61,0x8a,0x62,0xfd,0xb0,0x62,0x44,0x45,0x62,0x62,0x44,0x02,0xf7,0x62,
-0x8a,0x61,0x61,0x45,0xfd,0x09,0xa7,0x44,0x62,0x62,0x45,0x44,0x62,0x00,0x00,0x01,
-0x00,0xd9,0x01,0x1f,0x05,0xdb,0x03,0x5e,0x00,0x05,0x00,0x00,0x01,0x21,0x11,0x33,
-0x11,0x21,0x05,0xdb,0xfa,0xfe,0xa8,0x04,0x5a,0x01,0x1f,0x02,0x3f,0xfe,0x6b,0x00,
-0x00,0x01,0x01,0xaf,0xfe,0x00,0x03,0xfa,0x06,0x0e,0x00,0x18,0x00,0x00,0x01,0x11,
-0x36,0x37,0x1a,0x01,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x26,0x27,0x2e,
-0x01,0x23,0x22,0x03,0x06,0x07,0x11,0x01,0xaf,0x02,0x01,0x0c,0xbe,0xca,0x50,0x64,
-0x40,0x37,0x2a,0x1c,0x19,0x0f,0x06,0x09,0x10,0x6c,0x0d,0x04,0x04,0xfe,0x00,0x03,
-0xaa,0x6c,0x39,0x02,0x03,0x01,0xbc,0x54,0x41,0x36,0x3f,0x13,0x11,0x25,0x0f,0x48,
-0xfd,0x95,0xc1,0x6e,0xfb,0xf6,0x00,0x01,0x00,0x2a,0xfe,0x1a,0x02,0x75,0x06,0x28,
-0x00,0x18,0x00,0x00,0x01,0x11,0x06,0x07,0x0a,0x01,0x23,0x22,0x26,0x35,0x34,0x36,
-0x33,0x32,0x17,0x16,0x17,0x1e,0x01,0x33,0x32,0x13,0x36,0x37,0x11,0x02,0x75,0x02,
-0x01,0x0c,0xbe,0xca,0x50,0x64,0x40,0x37,0x2a,0x1c,0x19,0x0f,0x06,0x09,0x10,0x6c,
-0x0d,0x04,0x04,0x06,0x28,0xfc,0x56,0x6c,0x39,0xfd,0xfd,0xfe,0x44,0x54,0x41,0x36,
-0x3f,0x13,0x11,0x25,0x0f,0x48,0x02,0x6b,0xc1,0x6e,0x04,0x0a,0x00,0x02,0x00,0xac,
-0x00,0x00,0x07,0x54,0x05,0xc8,0x00,0x07,0x00,0x0b,0x00,0x00,0x13,0x21,0x01,0x21,
-0x15,0x21,0x01,0x21,0x25,0x21,0x15,0x21,0xac,0x02,0x42,0x02,0x9a,0x01,0xcc,0xfd,
-0xbc,0xfd,0x66,0xfe,0x36,0x03,0xf4,0x02,0xb4,0xfd,0x4c,0x05,0xc8,0xfa,0xcc,0x94,
-0x05,0x34,0x94,0x94,0x00,0x2b,0x00,0x78,0x00,0x00,0x0b,0x14,0x05,0xd5,0x00,0x0b,
-0x00,0x17,0x00,0x23,0x00,0x2f,0x00,0x3b,0x00,0x47,0x00,0x53,0x00,0x5f,0x00,0x6b,
-0x00,0x77,0x00,0x83,0x00,0x8f,0x00,0x9b,0x00,0xa7,0x00,0xb3,0x00,0xbf,0x00,0xcb,
-0x00,0xd7,0x00,0xe3,0x00,0xef,0x00,0xfb,0x01,0x07,0x01,0x13,0x01,0x1f,0x01,0x2b,
-0x01,0x37,0x01,0x43,0x01,0x4f,0x01,0x5b,0x01,0x67,0x01,0x73,0x01,0x7f,0x01,0x8b,
-0x01,0x97,0x01,0xa3,0x01,0xaf,0x01,0xbb,0x01,0xc7,0x01,0xd3,0x01,0xe4,0x01,0xf0,
-0x01,0xfc,0x02,0x08,0x03,0x7b,0xba,0x00,0x0d,0x00,0x09,0x00,0x03,0x2b,0xb8,0x00,
-0x0d,0x10,0xba,0x01,0x5d,0x01,0x62,0x00,0x03,0x2b,0xb8,0x01,0x5d,0x10,0xba,0x00,
-0x25,0x00,0x2a,0x00,0x03,0x2b,0xb8,0x00,0x25,0x10,0xba,0x00,0x91,0x00,0x96,0x00,
-0x03,0x2b,0xb8,0x00,0x91,0x10,0xba,0x00,0x04,0x00,0x12,0x00,0x03,0x2b,0xb8,0x00,
-0x04,0x10,0xb8,0x01,0x5d,0x10,0xb8,0x00,0x18,0xd0,0xb8,0x00,0x18,0x2f,0xb8,0x01,
-0x62,0x10,0xb8,0x00,0x1e,0xd0,0xb8,0x00,0x1e,0x2f,0xb8,0x00,0x2a,0x10,0xb8,0x00,
-0x9c,0xd0,0xb8,0x00,0x9c,0x2f,0xb8,0x00,0x25,0x10,0xb8,0x01,0x68,0xd0,0xb8,0x00,
-0x2a,0x10,0xb8,0x01,0x6e,0xd0,0xb8,0x00,0x91,0x10,0xb8,0x01,0xc8,0xd0,0xb8,0x00,
-0x91,0x10,0xb8,0x01,0xd6,0xd0,0xb8,0x00,0x96,0x10,0xb8,0x01,0xdc,0xd0,0xb8,0x00,
-0x91,0x10,0xb8,0x01,0xf1,0xd0,0xb8,0x01,0xf1,0x2f,0xb8,0x00,0x04,0x10,0xb8,0x02,
-0x0a,0xdc,0x00,0xba,0x00,0x10,0x00,0x06,0x00,0x03,0x2b,0xb8,0x00,0x10,0x10,0xba,
-0x00,0x01,0x00,0x15,0x00,0x03,0x2b,0xb8,0x00,0x01,0x10,0xba,0x00,0x22,0x00,0x1b,
-0x00,0x03,0x2b,0xb8,0x00,0x22,0x10,0xba,0x01,0x66,0x01,0x5f,0x00,0x03,0x2b,0xb8,
-0x01,0x66,0x10,0xba,0x00,0x3a,0x00,0x33,0x00,0x03,0x2b,0xb8,0x00,0x3a,0x10,0xba,
-0x01,0xd4,0x01,0xdf,0x00,0x03,0x2b,0xb8,0x01,0xd4,0x10,0xba,0x00,0xfa,0x01,0xda,
-0x00,0x03,0x2b,0xb8,0x00,0xfa,0x10,0xb8,0x00,0x1b,0x10,0xb8,0x00,0x27,0xd0,0xb8,
-0x00,0x22,0x10,0xb8,0x00,0x2d,0xd0,0xb8,0x00,0x33,0x10,0xb8,0x00,0x3f,0xd0,0xb8,
-0x00,0x3a,0x10,0xb8,0x00,0x45,0xd0,0xb8,0x00,0x33,0x10,0xb8,0x00,0x4b,0xd0,0xb8,
-0x00,0x3a,0x10,0xb8,0x00,0x51,0xd0,0xb8,0x00,0x33,0x10,0xb8,0x00,0x57,0xd0,0xb8,
-0x00,0x3a,0x10,0xb8,0x00,0x5d,0xd0,0xb8,0x00,0x33,0x10,0xb8,0x00,0x63,0xd0,0xb8,
-0x00,0x3a,0x10,0xb8,0x00,0x69,0xd0,0xb8,0x00,0x33,0x10,0xb8,0x00,0x6f,0xd0,0xb8,
-0x00,0x3a,0x10,0xb8,0x00,0x75,0xd0,0xb8,0x00,0x33,0x10,0xb8,0x00,0x7b,0xd0,0xb8,
-0x00,0x3a,0x10,0xb8,0x00,0x81,0xd0,0xb8,0x00,0x33,0x10,0xb8,0x00,0x87,0xd0,0xb8,
-0x00,0x3a,0x10,0xb8,0x00,0x8d,0xd0,0xb8,0x00,0x33,0x10,0xb8,0x00,0x93,0xd0,0xb8,
-0x00,0x3a,0x10,0xb8,0x00,0x99,0xd0,0xb8,0x01,0xda,0x10,0xb8,0x00,0x9f,0xd0,0xb8,
-0x00,0x9f,0x2f,0xb8,0x00,0xfa,0x10,0xb8,0x00,0xa5,0xd0,0xb8,0x01,0xda,0x10,0xb8,
-0x00,0xab,0xd0,0xb8,0x00,0xab,0x2f,0xb8,0x00,0xfa,0x10,0xb8,0x00,0xb1,0xd0,0xb8,
-0x01,0xda,0x10,0xb8,0x00,0xb7,0xd0,0xb8,0x00,0xb7,0x2f,0xb8,0x00,0xfa,0x10,0xb8,
-0x00,0xbd,0xd0,0xb8,0x01,0xda,0x10,0xb8,0x00,0xc3,0xd0,0xb8,0x00,0xc3,0x2f,0xb8,
-0x00,0xfa,0x10,0xb8,0x00,0xc9,0xd0,0xb8,0x01,0xda,0x10,0xb8,0x00,0xcf,0xd0,0xb8,
-0x00,0xcf,0x2f,0xb8,0x00,0xfa,0x10,0xb8,0x00,0xd5,0xd0,0xb8,0x01,0xda,0x10,0xb8,
-0x00,0xdb,0xd0,0xb8,0x00,0xdb,0x2f,0xb8,0x00,0xfa,0x10,0xb8,0x00,0xe1,0xd0,0xb8,
-0x01,0xda,0x10,0xb8,0x00,0xe7,0xd0,0xb8,0x00,0xe7,0x2f,0xb8,0x00,0xfa,0x10,0xb8,
-0x00,0xed,0xd0,0xb8,0x01,0xda,0x10,0xb8,0x00,0xf3,0xd0,0xb8,0x00,0xf3,0x2f,0xb8,
-0x01,0xdf,0x10,0xb8,0x00,0xff,0xd0,0xb8,0x01,0xd4,0x10,0xb8,0x01,0x05,0xd0,0xb8,
-0x01,0x05,0x2f,0xb8,0x01,0xdf,0x10,0xb8,0x01,0x0b,0xd0,0xb8,0x01,0xd4,0x10,0xb8,
-0x01,0x11,0xd0,0xb8,0x01,0x11,0x2f,0xb8,0x01,0xdf,0x10,0xb8,0x01,0x17,0xd0,0xb8,
-0x01,0xd4,0x10,0xb8,0x01,0x1d,0xd0,0xb8,0x01,0x1d,0x2f,0xb8,0x01,0xdf,0x10,0xb8,
-0x01,0x23,0xd0,0xb8,0x01,0xd4,0x10,0xb8,0x01,0x29,0xd0,0xb8,0x01,0x29,0x2f,0xb8,
-0x01,0xdf,0x10,0xb8,0x01,0x2f,0xd0,0xb8,0x01,0xd4,0x10,0xb8,0x01,0x35,0xd0,0xb8,
-0x01,0x35,0x2f,0xb8,0x01,0xdf,0x10,0xb8,0x01,0x3b,0xd0,0xb8,0x01,0xd4,0x10,0xb8,
-0x01,0x41,0xd0,0xb8,0x01,0x41,0x2f,0xb8,0x01,0xdf,0x10,0xb8,0x01,0x47,0xd0,0xb8,
-0x01,0xd4,0x10,0xb8,0x01,0x4d,0xd0,0xb8,0x01,0x4d,0x2f,0xb8,0x01,0xdf,0x10,0xb8,
-0x01,0x53,0xd0,0xb8,0x01,0xd4,0x10,0xb8,0x01,0x59,0xd0,0xb8,0x01,0x59,0x2f,0xb8,
-0x01,0x5f,0x10,0xb8,0x01,0x6b,0xd0,0xb8,0x01,0x66,0x10,0xb8,0x01,0x71,0xd0,0xb8,
-0x01,0x5f,0x10,0xb8,0x01,0x77,0xd0,0xb8,0x01,0x66,0x10,0xb8,0x01,0x7d,0xd0,0xb8,
-0x01,0x5f,0x10,0xb8,0x01,0x83,0xd0,0xb8,0x01,0x66,0x10,0xb8,0x01,0x89,0xd0,0xb8,
-0x01,0x5f,0x10,0xb8,0x01,0x8f,0xd0,0xb8,0x01,0x66,0x10,0xb8,0x01,0x95,0xd0,0xb8,
-0x01,0x5f,0x10,0xb8,0x01,0x9b,0xd0,0xb8,0x01,0x66,0x10,0xb8,0x01,0xa1,0xd0,0xb8,
-0x01,0x5f,0x10,0xb8,0x01,0xa7,0xd0,0xb8,0x01,0x66,0x10,0xb8,0x01,0xad,0xd0,0xb8,
-0x01,0x5f,0x10,0xb8,0x01,0xb3,0xd0,0xb8,0x01,0x66,0x10,0xb8,0x01,0xb9,0xd0,0xb8,
-0x01,0x5f,0x10,0xb8,0x01,0xbf,0xd0,0xb8,0x01,0x66,0x10,0xb8,0x01,0xc5,0xd0,0xb8,
-0x01,0x5f,0x10,0xb8,0x01,0xcb,0xd0,0xb8,0x01,0x66,0x10,0xb8,0x01,0xd1,0xd0,0xb8,
-0x00,0x1b,0x10,0xb8,0x01,0xe8,0xd0,0xb8,0x00,0x22,0x10,0xb8,0x01,0xee,0xd0,0xb8,
-0x00,0x1b,0x10,0xb8,0x01,0xf4,0xd0,0xb8,0x00,0x22,0x10,0xb8,0x01,0xfa,0xd0,0xb8,
-0x00,0x1b,0x10,0xb8,0x01,0xfd,0xd0,0xb8,0x00,0x22,0x10,0xb8,0x02,0x02,0xd0,0x30,
-0x31,0x01,0x21,0x32,0x15,0x11,0x14,0x23,0x21,0x22,0x35,0x11,0x34,0x17,0x11,0x14,
-0x33,0x21,0x32,0x35,0x11,0x34,0x23,0x21,0x22,0x01,0x15,0x14,0x2b,0x01,0x22,0x3d,
-0x01,0x34,0x3b,0x01,0x32,0x17,0x15,0x14,0x2b,0x01,0x22,0x3d,0x01,0x34,0x3b,0x01,
-0x32,0x25,0x15,0x14,0x2b,0x01,0x22,0x3d,0x01,0x34,0x3b,0x01,0x32,0x05,0x15,0x14,
-0x2b,0x01,0x22,0x3d,0x01,0x34,0x3b,0x01,0x32,0x17,0x15,0x14,0x2b,0x01,0x22,0x3d,
-0x01,0x34,0x3b,0x01,0x32,0x05,0x15,0x14,0x2b,0x01,0x22,0x3d,0x01,0x34,0x3b,0x01,
-0x32,0x17,0x15,0x14,0x2b,0x01,0x22,0x3d,0x01,0x34,0x3b,0x01,0x32,0x17,0x15,0x14,
-0x2b,0x01,0x22,0x3d,0x01,0x34,0x3b,0x01,0x32,0x17,0x15,0x14,0x2b,0x01,0x22,0x3d,
-0x01,0x34,0x3b,0x01,0x32,0x17,0x15,0x14,0x2b,0x01,0x22,0x3d,0x01,0x34,0x3b,0x01,
-0x32,0x05,0x15,0x14,0x2b,0x01,0x22,0x3d,0x01,0x34,0x3b,0x01,0x32,0x25,0x15,0x14,
-0x2b,0x01,0x22,0x3d,0x01,0x34,0x3b,0x01,0x32,0x17,0x15,0x14,0x2b,0x01,0x22,0x3d,
-0x01,0x34,0x3b,0x01,0x32,0x17,0x15,0x14,0x2b,0x01,0x22,0x3d,0x01,0x34,0x3b,0x01,
-0x32,0x17,0x15,0x14,0x2b,0x01,0x22,0x3d,0x01,0x34,0x3b,0x01,0x32,0x17,0x15,0x14,
-0x2b,0x01,0x22,0x3d,0x01,0x34,0x3b,0x01,0x32,0x17,0x15,0x14,0x2b,0x01,0x22,0x3d,
-0x01,0x34,0x3b,0x01,0x32,0x17,0x15,0x14,0x2b,0x01,0x22,0x3d,0x01,0x34,0x3b,0x01,
-0x32,0x17,0x15,0x14,0x2b,0x01,0x22,0x3d,0x01,0x34,0x3b,0x01,0x32,0x27,0x15,0x14,
-0x2b,0x01,0x22,0x3d,0x01,0x34,0x3b,0x01,0x32,0x07,0x15,0x14,0x2b,0x01,0x22,0x3d,
-0x01,0x34,0x3b,0x01,0x32,0x07,0x15,0x14,0x2b,0x01,0x22,0x3d,0x01,0x34,0x3b,0x01,
-0x32,0x07,0x15,0x14,0x2b,0x01,0x22,0x3d,0x01,0x34,0x3b,0x01,0x32,0x07,0x15,0x14,
-0x2b,0x01,0x22,0x3d,0x01,0x34,0x3b,0x01,0x32,0x07,0x15,0x14,0x2b,0x01,0x22,0x3d,
-0x01,0x34,0x3b,0x01,0x32,0x07,0x15,0x14,0x2b,0x01,0x22,0x3d,0x01,0x34,0x3b,0x01,
-0x32,0x07,0x15,0x14,0x2b,0x01,0x22,0x3d,0x01,0x34,0x3b,0x01,0x32,0x27,0x15,0x14,
-0x2b,0x01,0x22,0x3d,0x01,0x34,0x3b,0x01,0x32,0x17,0x15,0x14,0x2b,0x01,0x22,0x3d,
-0x01,0x34,0x3b,0x01,0x32,0x17,0x15,0x14,0x2b,0x01,0x22,0x3d,0x01,0x34,0x3b,0x01,
-0x32,0x17,0x15,0x14,0x2b,0x01,0x22,0x3d,0x01,0x34,0x3b,0x01,0x32,0x17,0x15,0x14,
-0x2b,0x01,0x22,0x3d,0x01,0x34,0x3b,0x01,0x32,0x17,0x15,0x14,0x2b,0x01,0x22,0x3d,
-0x01,0x34,0x3b,0x01,0x32,0x17,0x15,0x14,0x2b,0x01,0x22,0x3d,0x01,0x34,0x3b,0x01,
-0x32,0x17,0x15,0x14,0x2b,0x01,0x22,0x3d,0x01,0x34,0x3b,0x01,0x32,0x17,0x15,0x14,
-0x2b,0x01,0x22,0x3d,0x01,0x34,0x3b,0x01,0x32,0x05,0x15,0x14,0x2b,0x01,0x22,0x3d,
-0x01,0x34,0x3b,0x01,0x32,0x07,0x32,0x15,0x11,0x14,0x2b,0x01,0x22,0x3d,0x01,0x34,
-0x23,0x22,0x3d,0x01,0x34,0x33,0x13,0x15,0x14,0x2b,0x01,0x22,0x3d,0x01,0x34,0x3b,
-0x01,0x32,0x17,0x15,0x14,0x2b,0x01,0x22,0x3d,0x01,0x34,0x3b,0x01,0x32,0x05,0x22,
-0x3d,0x01,0x34,0x33,0x21,0x32,0x1d,0x01,0x14,0x23,0x01,0x55,0x08,0xe2,0xdd,0xdd,
-0xf7,0x1e,0xdd,0x93,0x4a,0x08,0xe2,0x49,0x49,0xf7,0x1e,0x4a,0x01,0x03,0x25,0x4a,
-0x25,0x25,0x4a,0x25,0xdf,0x25,0x4b,0x24,0x24,0x4b,0x25,0x01,0x4a,0x25,0x4a,0x25,
-0x25,0x4a,0x25,0xfe,0x46,0x25,0x4a,0x25,0x25,0x4a,0x25,0xdd,0x25,0x4a,0x25,0x25,
-0x4a,0x25,0x01,0xb9,0x25,0x4a,0x25,0x25,0x4a,0x25,0xdd,0x25,0x4a,0x25,0x25,0x4a,
-0x25,0xdd,0x25,0x4a,0x25,0x25,0x4a,0x25,0xdd,0x25,0x4a,0x25,0x25,0x4a,0x25,0xdd,
-0x25,0x4a,0x25,0x25,0x4a,0x25,0x01,0x8e,0x25,0xfb,0x25,0x25,0xfb,0x25,0xf8,0x43,
-0x25,0x4a,0x25,0x25,0x4a,0x25,0xdd,0x25,0x4a,0x25,0x25,0x4a,0x25,0xdd,0x25,0x4a,
-0x25,0x25,0x4a,0x25,0xdc,0x25,0x4a,0x25,0x25,0x4a,0x25,0xdd,0x25,0x4a,0x25,0x25,
-0x4a,0x25,0xdd,0x25,0x4a,0x25,0x25,0x4a,0x25,0xdd,0x25,0x4a,0x25,0x25,0x4a,0x25,
-0xdd,0x25,0x4a,0x25,0x25,0x4a,0x25,0x24,0x25,0x4a,0x25,0x25,0x4a,0x25,0xdd,0x25,
-0x4a,0x25,0x25,0x4a,0x25,0xdd,0x25,0x4a,0x25,0x25,0x4a,0x25,0xdd,0x25,0x4a,0x25,
-0x25,0x4a,0x25,0xdc,0x25,0x4a,0x25,0x25,0x4a,0x25,0xdd,0x25,0x4a,0x25,0x25,0x4a,
-0x25,0xdd,0x25,0x4a,0x25,0x25,0x4a,0x25,0xdd,0x25,0x4a,0x25,0x25,0x4a,0x25,0x24,
-0x25,0x4a,0x25,0x25,0x4a,0x25,0xdd,0x25,0x4a,0x25,0x25,0x4a,0x25,0xdd,0x25,0x4a,
-0x25,0x25,0x4a,0x25,0xdd,0x25,0x4a,0x25,0x25,0x4a,0x25,0xdc,0x25,0x4a,0x25,0x25,
-0x4a,0x25,0xdd,0x25,0x4a,0x25,0x25,0x4a,0x25,0xdd,0x25,0x4a,0x25,0x25,0x4a,0x25,
-0xdd,0x25,0x4a,0x25,0x25,0x4a,0x25,0xdd,0x25,0x4a,0x25,0x25,0x4a,0x25,0x01,0x1e,
-0x25,0x8b,0x25,0x25,0x8b,0x25,0x25,0x25,0x25,0xf6,0x2a,0x24,0x25,0x25,0x94,0x25,
-0x4a,0x25,0x25,0x4a,0x25,0xdf,0x25,0x4b,0x24,0x24,0x4b,0x25,0xf9,0xa5,0x25,0x25,
-0x04,0x04,0x25,0x25,0x05,0xd5,0xdd,0xfb,0xe5,0xdd,0xdd,0x04,0x1b,0xdd,0xdd,0xfb,
-0xe5,0x4a,0x4a,0x04,0x1b,0x4a,0xfc,0x1c,0x49,0x25,0x25,0x49,0x26,0x25,0x4a,0x25,
-0x25,0x4a,0x25,0xb7,0x4a,0x25,0x25,0x4a,0x25,0x25,0x4a,0x25,0x25,0x4a,0x25,0x25,
-0x4a,0x25,0x25,0x4a,0x25,0x25,0x4a,0x25,0x25,0x4a,0x25,0x25,0x4a,0x25,0x25,0x4a,
-0x25,0x25,0x4a,0x25,0x25,0x4a,0x25,0x25,0x4a,0x25,0x25,0x4a,0x25,0x25,0x4a,0x25,
-0x25,0x4a,0x25,0x25,0x4a,0x25,0x25,0x4a,0x25,0xb7,0x4a,0x25,0x25,0x4a,0x25,0x25,
-0x4a,0x25,0x25,0x4a,0x25,0x25,0x4a,0x25,0x25,0x4a,0x25,0x25,0x4a,0x25,0x25,0x4a,
-0x25,0x25,0x4a,0x25,0x25,0x4a,0x25,0x25,0x4a,0x25,0x25,0x4a,0x25,0x25,0x4a,0x25,
-0x25,0x4a,0x25,0x25,0x4a,0x25,0x25,0x4a,0x25,0xb7,0x4a,0x25,0x25,0x4a,0x25,0x25,
-0x4a,0x25,0x25,0x4a,0x25,0x25,0x4a,0x25,0x25,0x4a,0x25,0x25,0x4a,0x25,0x25,0x4a,
-0x25,0x25,0x4a,0x25,0x25,0x4a,0x25,0x25,0x4a,0x25,0x25,0x4a,0x25,0x25,0x4a,0x25,
-0x25,0x4a,0x25,0x25,0x4a,0x25,0x25,0x4a,0x25,0xb4,0x4a,0x25,0x25,0x4a,0x25,0x25,
-0x4a,0x25,0x25,0x4a,0x25,0x25,0x4a,0x25,0x25,0x4a,0x25,0x25,0x4a,0x25,0x25,0x4a,
-0x25,0x25,0x4a,0x25,0x25,0x4a,0x25,0x25,0x4a,0x25,0x25,0x4a,0x25,0x25,0x4a,0x25,
-0x25,0x4a,0x25,0x25,0x4a,0x25,0x25,0x4a,0x25,0x25,0x4a,0x25,0x25,0x4a,0x25,0x25,
-0x4a,0x25,0x25,0x4a,0x25,0xdb,0x25,0xfe,0xde,0x25,0x25,0x95,0x20,0x25,0x49,0x25,
-0xfd,0x48,0x4a,0x25,0x25,0x4a,0x25,0x25,0x4a,0x25,0x25,0x4a,0x25,0x94,0x25,0x4a,
-0x25,0x25,0x4a,0x25,0x00,0x01,0x00,0xb7,0xfe,0xf2,0x02,0x7b,0x06,0x12,0x00,0x05,
-0x00,0x00,0x13,0x01,0x33,0x09,0x01,0x23,0xb7,0x01,0x1a,0xaa,0xfe,0xe6,0x01,0x1a,
-0xaa,0x02,0x82,0xfc,0x70,0x03,0x90,0x03,0x90,0x00,0x00,0x01,0x00,0xa4,0xfe,0xf2,
-0x02,0x68,0x06,0x12,0x00,0x05,0x00,0x00,0x09,0x01,0x23,0x09,0x01,0x33,0x02,0x68,
-0xfe,0xe6,0xaa,0x01,0x1a,0xfe,0xe6,0xaa,0x02,0x82,0xfc,0x70,0x03,0x90,0x03,0x90,
-0x00,0x01,0x00,0x1a,0xfe,0x2e,0x05,0xf5,0x00,0xd0,0x00,0x0b,0x00,0x00,0x01,0x21,
-0x11,0x21,0x15,0x23,0x11,0x21,0x11,0x23,0x35,0x21,0x01,0xb8,0x02,0xa0,0x01,0x9d,
-0xf5,0xfc,0x10,0xf6,0x01,0x9e,0xfe,0xd8,0x01,0xf8,0xaa,0xfe,0x08,0x01,0xf8,0xaa,
-0x00,0x01,0x01,0xaf,0xfe,0x00,0x02,0x75,0x06,0x28,0x00,0x03,0x00,0x00,0x01,0x11,
-0x33,0x11,0x01,0xaf,0xc6,0xfe,0x00,0x08,0x28,0xf7,0xd8,0x00,0x00,0x02,0x00,0x06,
-0x00,0x00,0x06,0x21,0x04,0xc4,0x00,0x02,0x00,0x06,0x00,0x00,0x01,0x21,0x09,0x01,
-0x21,0x11,0x21,0x06,0x21,0xf9,0xe5,0x03,0x0d,0x03,0x0e,0xf9,0xe5,0x06,0x1b,0x02,
-0xa0,0x02,0x24,0xfb,0x3c,0x01,0xf8,0x00,0x00,0x02,0xff,0x82,0xff,0xe3,0x04,0xa4,
-0x06,0x14,0x00,0x17,0x00,0x1f,0x00,0x00,0x01,0x3e,0x01,0x33,0x32,0x00,0x10,0x02,
-0x23,0x22,0x26,0x27,0x15,0x23,0x11,0x05,0x27,0x25,0x35,0x33,0x15,0x25,0x17,0x05,
-0x00,0x10,0x26,0x20,0x06,0x10,0x16,0x20,0x01,0x73,0x3a,0xb1,0x7b,0xcc,0x00,0xff,
-0xff,0xcc,0x7b,0xb1,0x3a,0xb9,0xfe,0xe9,0x21,0x01,0x38,0xb9,0x01,0x23,0x21,0xfe,
-0xbc,0x02,0x72,0xa7,0xfe,0xdc,0xa7,0xa7,0x01,0x24,0x03,0xb6,0x64,0x61,0xfe,0xbc,
-0xfd,0xf0,0xfe,0xbc,0x61,0x64,0xa8,0x04,0xe6,0x5d,0x63,0x68,0xc0,0x83,0x61,0x61,
-0x6d,0xfc,0x40,0x01,0x96,0xe7,0xe7,0xfe,0x6a,0xe7,0x00,0x01,0x00,0x92,0xfe,0x2e,
-0x04,0x82,0x00,0xd0,0x00,0x07,0x00,0x00,0x01,0x21,0x11,0x33,0x11,0x21,0x11,0x33,
-0x01,0x3a,0x02,0xa0,0xa8,0xfc,0x10,0xa8,0xfe,0xd8,0x01,0xf8,0xfd,0x5e,0x02,0xa2,
-0x00,0x03,0x00,0x98,0xff,0xec,0x06,0x94,0x05,0xe8,0x00,0x0d,0x00,0x1b,0x00,0x26,
-0x00,0xdb,0xba,0x00,0x0e,0x00,0x06,0x00,0x03,0x2b,0xb8,0x00,0x0e,0x10,0xba,0x00,
-0x23,0x00,0x1d,0x00,0x03,0x2b,0xb8,0x00,0x23,0x10,0xba,0x00,0x00,0x00,0x14,0x00,
-0x03,0x2b,0xb8,0x00,0x00,0x10,0x41,0x1b,0x00,0x16,0x00,0x0e,0x00,0x26,0x00,0x0e,
-0x00,0x36,0x00,0x0e,0x00,0x46,0x00,0x0e,0x00,0x56,0x00,0x0e,0x00,0x66,0x00,0x0e,
-0x00,0x76,0x00,0x0e,0x00,0x86,0x00,0x0e,0x00,0x96,0x00,0x0e,0x00,0xa6,0x00,0x0e,
-0x00,0xb6,0x00,0x0e,0x00,0xc6,0x00,0x0e,0x00,0xd6,0x00,0x0e,0x00,0x0d,0x5d,0x41,
-0x05,0x00,0xe5,0x00,0x0e,0x00,0xf5,0x00,0x0e,0x00,0x02,0x5d,0x41,0x05,0x00,0xea,
-0x00,0x14,0x00,0xfa,0x00,0x14,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,0x14,0x00,
-0x29,0x00,0x14,0x00,0x39,0x00,0x14,0x00,0x49,0x00,0x14,0x00,0x59,0x00,0x14,0x00,
-0x69,0x00,0x14,0x00,0x79,0x00,0x14,0x00,0x89,0x00,0x14,0x00,0x99,0x00,0x14,0x00,
-0xa9,0x00,0x14,0x00,0xb9,0x00,0x14,0x00,0xc9,0x00,0x14,0x00,0xd9,0x00,0x14,0x00,
-0x0d,0x5d,0x00,0xba,0x00,0x11,0x00,0x03,0x00,0x03,0x2b,0xb8,0x00,0x11,0x10,0xba,
-0x00,0x0a,0x00,0x18,0x00,0x03,0x2b,0xb8,0x00,0x0a,0x10,0xba,0x00,0x24,0x00,0x25,
-0x00,0x03,0x2b,0xb8,0x00,0x24,0x10,0xb8,0x00,0x1c,0xd0,0x30,0x31,0x01,0x10,0x00,
-0x21,0x20,0x00,0x11,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x05,0x10,0x00,0x21,0x20,
-0x00,0x11,0x34,0x02,0x24,0x23,0x22,0x04,0x02,0x01,0x33,0x11,0x07,0x35,0x25,0x33,
-0x11,0x33,0x15,0x21,0x06,0x94,0xfe,0x3f,0xfe,0xc2,0xfe,0xc4,0xfe,0x3f,0xce,0x01,
-0x71,0xbe,0xc1,0x01,0x71,0xcd,0xfa,0x57,0x01,0x8f,0x01,0x1c,0x01,0x1c,0x01,0x8f,
-0xb6,0xfe,0xb8,0xad,0xad,0xfe,0xb8,0xb6,0x01,0x7c,0xd9,0xec,0x01,0x01,0xa1,0xda,
-0xfd,0x97,0x02,0xea,0xfe,0xc1,0xfe,0x41,0x01,0xbf,0x01,0x3f,0xc6,0x01,0x72,0xc6,
-0xc6,0xfe,0x90,0xc8,0xfe,0xe4,0xfe,0x70,0x01,0x90,0x01,0x1c,0xb3,0x01,0x47,0xb1,
-0xb1,0xfe,0xb9,0xfd,0xff,0x02,0x7e,0x2b,0x98,0x2f,0xfc,0xe6,0x8e,0x00,0x00,0x03,
-0x00,0x98,0xff,0xec,0x06,0x94,0x05,0xe8,0x00,0x0d,0x00,0x1b,0x00,0x38,0x01,0x3f,
-0xba,0x00,0x0e,0x00,0x06,0x00,0x03,0x2b,0xb8,0x00,0x0e,0x10,0xba,0x00,0x33,0x00,
-0x26,0x00,0x03,0x2b,0xb8,0x00,0x33,0x10,0xba,0x00,0x00,0x00,0x14,0x00,0x03,0x2b,
-0xb8,0x00,0x00,0x10,0x41,0x1b,0x00,0x16,0x00,0x0e,0x00,0x26,0x00,0x0e,0x00,0x36,
-0x00,0x0e,0x00,0x46,0x00,0x0e,0x00,0x56,0x00,0x0e,0x00,0x66,0x00,0x0e,0x00,0x76,
-0x00,0x0e,0x00,0x86,0x00,0x0e,0x00,0x96,0x00,0x0e,0x00,0xa6,0x00,0x0e,0x00,0xb6,
-0x00,0x0e,0x00,0xc6,0x00,0x0e,0x00,0xd6,0x00,0x0e,0x00,0x0d,0x5d,0x41,0x05,0x00,
-0xe5,0x00,0x0e,0x00,0xf5,0x00,0x0e,0x00,0x02,0x5d,0x41,0x05,0x00,0xea,0x00,0x14,
-0x00,0xfa,0x00,0x14,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,0x14,0x00,0x29,0x00,
-0x14,0x00,0x39,0x00,0x14,0x00,0x49,0x00,0x14,0x00,0x59,0x00,0x14,0x00,0x69,0x00,
-0x14,0x00,0x79,0x00,0x14,0x00,0x89,0x00,0x14,0x00,0x99,0x00,0x14,0x00,0xa9,0x00,
-0x14,0x00,0xb9,0x00,0x14,0x00,0xc9,0x00,0x14,0x00,0xd9,0x00,0x14,0x00,0x0d,0x5d,
-0xb8,0x00,0x33,0x10,0xb8,0x00,0x1d,0xd0,0xb8,0x00,0x1d,0x2f,0x41,0x05,0x00,0xea,
-0x00,0x26,0x00,0xfa,0x00,0x26,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,0x26,0x00,
-0x29,0x00,0x26,0x00,0x39,0x00,0x26,0x00,0x49,0x00,0x26,0x00,0x59,0x00,0x26,0x00,
-0x69,0x00,0x26,0x00,0x79,0x00,0x26,0x00,0x89,0x00,0x26,0x00,0x99,0x00,0x26,0x00,
-0xa9,0x00,0x26,0x00,0xb9,0x00,0x26,0x00,0xc9,0x00,0x26,0x00,0xd9,0x00,0x26,0x00,
-0x0d,0x5d,0xba,0x00,0x2c,0x00,0x06,0x00,0x00,0x11,0x12,0x39,0x00,0xba,0x00,0x11,
-0x00,0x03,0x00,0x03,0x2b,0xb8,0x00,0x11,0x10,0xba,0x00,0x0a,0x00,0x18,0x00,0x03,
-0x2b,0xb8,0x00,0x0a,0x10,0xba,0x00,0x1d,0x00,0x1e,0x00,0x03,0x2b,0xb8,0x00,0x1d,
-0x10,0xba,0x00,0x30,0x00,0x29,0x00,0x03,0x2b,0xb8,0x00,0x30,0x10,0x30,0x31,0x01,
-0x10,0x00,0x21,0x20,0x00,0x11,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x05,0x10,0x00,
-0x21,0x20,0x00,0x11,0x34,0x02,0x24,0x23,0x22,0x04,0x02,0x01,0x21,0x15,0x21,0x35,
-0x36,0x24,0x37,0x3e,0x01,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x35,0x3e,0x01,0x33,
-0x32,0x16,0x15,0x14,0x06,0x07,0x0e,0x01,0x06,0x94,0xfe,0x3f,0xfe,0xc2,0xfe,0xc4,
-0xfe,0x3f,0xce,0x01,0x71,0xbe,0xc1,0x01,0x71,0xcd,0xfa,0x57,0x01,0x8f,0x01,0x1c,
-0x01,0x1c,0x01,0x8f,0xb6,0xfe,0xb8,0xad,0xad,0xfe,0xb8,0xb6,0x02,0x4f,0x01,0xb4,
-0xfd,0x5c,0x52,0x01,0x06,0x21,0x3e,0x2f,0x5f,0x4e,0x3b,0x84,0x73,0x61,0x91,0x3d,
-0xa3,0xc5,0x30,0x3e,0x11,0xb2,0x02,0xea,0xfe,0xc1,0xfe,0x41,0x01,0xbf,0x01,0x3f,
-0xc6,0x01,0x72,0xc6,0xc6,0xfe,0x90,0xc8,0xfe,0xe4,0xfe,0x70,0x01,0x90,0x01,0x1c,
-0xb3,0x01,0x47,0xb1,0xb1,0xfe,0xb9,0xfd,0xff,0x8e,0x81,0x4d,0xf1,0x22,0x3f,0x55,
-0x28,0x3f,0x4e,0x26,0x3a,0xab,0x24,0x1f,0x97,0x7d,0x3a,0x69,0x46,0x12,0xa7,0x00,
-0x00,0x03,0x00,0x98,0xff,0xec,0x06,0x94,0x05,0xe8,0x00,0x0d,0x00,0x1b,0x00,0x44,
-0x01,0xb5,0xba,0x00,0x0e,0x00,0x06,0x00,0x03,0x2b,0xb8,0x00,0x0e,0x10,0xba,0x00,
-0x42,0x00,0x35,0x00,0x03,0x2b,0xb8,0x00,0x42,0x10,0xba,0x00,0x00,0x00,0x14,0x00,
-0x03,0x2b,0xb8,0x00,0x00,0x10,0x41,0x1b,0x00,0x16,0x00,0x0e,0x00,0x26,0x00,0x0e,
-0x00,0x36,0x00,0x0e,0x00,0x46,0x00,0x0e,0x00,0x56,0x00,0x0e,0x00,0x66,0x00,0x0e,
-0x00,0x76,0x00,0x0e,0x00,0x86,0x00,0x0e,0x00,0x96,0x00,0x0e,0x00,0xa6,0x00,0x0e,
-0x00,0xb6,0x00,0x0e,0x00,0xc6,0x00,0x0e,0x00,0xd6,0x00,0x0e,0x00,0x0d,0x5d,0x41,
-0x05,0x00,0xe5,0x00,0x0e,0x00,0xf5,0x00,0x0e,0x00,0x02,0x5d,0x41,0x05,0x00,0xea,
-0x00,0x14,0x00,0xfa,0x00,0x14,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,0x14,0x00,
-0x29,0x00,0x14,0x00,0x39,0x00,0x14,0x00,0x49,0x00,0x14,0x00,0x59,0x00,0x14,0x00,
-0x69,0x00,0x14,0x00,0x79,0x00,0x14,0x00,0x89,0x00,0x14,0x00,0x99,0x00,0x14,0x00,
-0xa9,0x00,0x14,0x00,0xb9,0x00,0x14,0x00,0xc9,0x00,0x14,0x00,0xd9,0x00,0x14,0x00,
-0x0d,0x5d,0x41,0x05,0x00,0xea,0x00,0x35,0x00,0xfa,0x00,0x35,0x00,0x02,0x5d,0x41,
-0x1b,0x00,0x19,0x00,0x35,0x00,0x29,0x00,0x35,0x00,0x39,0x00,0x35,0x00,0x49,0x00,
-0x35,0x00,0x59,0x00,0x35,0x00,0x69,0x00,0x35,0x00,0x79,0x00,0x35,0x00,0x89,0x00,
-0x35,0x00,0x99,0x00,0x35,0x00,0xa9,0x00,0x35,0x00,0xb9,0x00,0x35,0x00,0xc9,0x00,
-0x35,0x00,0xd9,0x00,0x35,0x00,0x0d,0x5d,0xba,0x00,0x1c,0x00,0x35,0x00,0x42,0x11,
-0x12,0x39,0xba,0x00,0x2c,0x00,0x35,0x00,0x42,0x11,0x12,0x39,0xb8,0x00,0x2c,0x2f,
-0x41,0x05,0x00,0xea,0x00,0x2c,0x00,0xfa,0x00,0x2c,0x00,0x02,0x5d,0x41,0x1b,0x00,
-0x19,0x00,0x2c,0x00,0x29,0x00,0x2c,0x00,0x39,0x00,0x2c,0x00,0x49,0x00,0x2c,0x00,
-0x59,0x00,0x2c,0x00,0x69,0x00,0x2c,0x00,0x79,0x00,0x2c,0x00,0x89,0x00,0x2c,0x00,
-0x99,0x00,0x2c,0x00,0xa9,0x00,0x2c,0x00,0xb9,0x00,0x2c,0x00,0xc9,0x00,0x2c,0x00,
-0xd9,0x00,0x2c,0x00,0x0d,0x5d,0xb8,0x00,0x1f,0xdc,0xba,0x00,0x26,0x00,0x06,0x00,
-0x00,0x11,0x12,0x39,0xba,0x00,0x3b,0x00,0x06,0x00,0x00,0x11,0x12,0x39,0x00,0xba,
-0x00,0x11,0x00,0x03,0x00,0x03,0x2b,0xb8,0x00,0x11,0x10,0xba,0x00,0x0a,0x00,0x18,
-0x00,0x03,0x2b,0xb8,0x00,0x0a,0x10,0xba,0x00,0x29,0x00,0x22,0x00,0x03,0x2b,0xb8,
-0x00,0x29,0x10,0xba,0x00,0x3f,0x00,0x38,0x00,0x03,0x2b,0xb8,0x00,0x3f,0x10,0xba,
-0x00,0x32,0x00,0x2f,0x00,0x03,0x2b,0xb8,0x00,0x32,0x10,0xba,0x00,0x1c,0x00,0x2f,
-0x00,0x32,0x11,0x12,0x39,0x30,0x31,0x01,0x10,0x00,0x21,0x20,0x00,0x11,0x34,0x12,
-0x24,0x33,0x32,0x04,0x12,0x05,0x10,0x00,0x21,0x20,0x00,0x11,0x34,0x02,0x24,0x23,
-0x22,0x04,0x02,0x05,0x1e,0x01,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x35,0x1e,0x01,
-0x33,0x32,0x36,0x35,0x34,0x26,0x2b,0x01,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,
-0x22,0x06,0x07,0x35,0x3e,0x01,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0x94,0xfe,0x3f,
-0xfe,0xc2,0xfe,0xc4,0xfe,0x3f,0xce,0x01,0x71,0xbe,0xc1,0x01,0x71,0xcd,0xfa,0x57,
-0x01,0x8f,0x01,0x1c,0x01,0x1c,0x01,0x8f,0xb6,0xfe,0xb8,0xad,0xad,0xfe,0xb8,0xb6,
-0x03,0xb9,0x0d,0x76,0xd8,0xc3,0x40,0x88,0x58,0x5b,0x7d,0x44,0x75,0x73,0x6b,0x63,
-0x8c,0x91,0x5a,0x58,0x5c,0x5b,0x34,0x79,0x6b,0x5f,0x88,0x3d,0xa1,0xc1,0x68,0x02,
-0xea,0xfe,0xc1,0xfe,0x41,0x01,0xbf,0x01,0x3f,0xc6,0x01,0x72,0xc6,0xc6,0xfe,0x90,
-0xc8,0xfe,0xe4,0xfe,0x70,0x01,0x90,0x01,0x1c,0xb3,0x01,0x47,0xb1,0xb1,0xfe,0xb9,
-0x96,0x03,0x81,0x5d,0x8d,0x9c,0x17,0x1b,0xa8,0x30,0x1c,0x4f,0x4c,0x47,0x4e,0x8c,
-0x3c,0x3a,0x3c,0x3f,0x15,0x20,0x97,0x18,0x14,0x89,0x73,0x51,0x72,0x00,0x00,0x04,
-0x00,0x98,0xff,0xec,0x06,0x94,0x05,0xe8,0x00,0x0d,0x00,0x1b,0x00,0x1e,0x00,0x29,
-0x00,0xf3,0xba,0x00,0x0e,0x00,0x06,0x00,0x03,0x2b,0xb8,0x00,0x0e,0x10,0xba,0x00,
-0x20,0x00,0x1c,0x00,0x03,0x2b,0xb8,0x00,0x20,0x10,0xba,0x00,0x00,0x00,0x14,0x00,
-0x03,0x2b,0xb8,0x00,0x00,0x10,0x41,0x1b,0x00,0x16,0x00,0x0e,0x00,0x26,0x00,0x0e,
-0x00,0x36,0x00,0x0e,0x00,0x46,0x00,0x0e,0x00,0x56,0x00,0x0e,0x00,0x66,0x00,0x0e,
-0x00,0x76,0x00,0x0e,0x00,0x86,0x00,0x0e,0x00,0x96,0x00,0x0e,0x00,0xa6,0x00,0x0e,
-0x00,0xb6,0x00,0x0e,0x00,0xc6,0x00,0x0e,0x00,0xd6,0x00,0x0e,0x00,0x0d,0x5d,0x41,
-0x05,0x00,0xe5,0x00,0x0e,0x00,0xf5,0x00,0x0e,0x00,0x02,0x5d,0x41,0x05,0x00,0xea,
-0x00,0x14,0x00,0xfa,0x00,0x14,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,0x14,0x00,
-0x29,0x00,0x14,0x00,0x39,0x00,0x14,0x00,0x49,0x00,0x14,0x00,0x59,0x00,0x14,0x00,
-0x69,0x00,0x14,0x00,0x79,0x00,0x14,0x00,0x89,0x00,0x14,0x00,0x99,0x00,0x14,0x00,
-0xa9,0x00,0x14,0x00,0xb9,0x00,0x14,0x00,0xc9,0x00,0x14,0x00,0xd9,0x00,0x14,0x00,
-0x0d,0x5d,0xb8,0x00,0x20,0x10,0xb8,0x00,0x24,0xd0,0xb8,0x00,0x1c,0x10,0xb8,0x00,
-0x26,0xd0,0x00,0xba,0x00,0x11,0x00,0x03,0x00,0x03,0x2b,0xb8,0x00,0x11,0x10,0xba,
-0x00,0x0a,0x00,0x18,0x00,0x03,0x2b,0xb8,0x00,0x0a,0x10,0xba,0x00,0x22,0x00,0x23,
-0x00,0x03,0x2b,0xb8,0x00,0x22,0x10,0xb8,0x00,0x1d,0xd0,0xb8,0x00,0x23,0x10,0xb8,
-0x00,0x27,0xd0,0x30,0x31,0x01,0x10,0x00,0x21,0x20,0x00,0x11,0x34,0x12,0x24,0x33,
-0x32,0x04,0x12,0x05,0x10,0x00,0x21,0x20,0x00,0x11,0x34,0x02,0x24,0x23,0x22,0x04,
-0x02,0x25,0x01,0x21,0x03,0x33,0x11,0x33,0x15,0x23,0x15,0x23,0x35,0x21,0x35,0x06,
-0x94,0xfe,0x3f,0xfe,0xc2,0xfe,0xc4,0xfe,0x3f,0xce,0x01,0x71,0xbe,0xc1,0x01,0x71,
-0xcd,0xfa,0x57,0x01,0x8f,0x01,0x1c,0x01,0x1c,0x01,0x8f,0xb6,0xfe,0xb8,0xad,0xad,
-0xfe,0xb8,0xb6,0x02,0xbf,0xfe,0xf3,0x01,0x0d,0x18,0xce,0x8d,0x8d,0xb6,0xfe,0x43,
-0x02,0xea,0xfe,0xc1,0xfe,0x41,0x01,0xbf,0x01,0x3f,0xc6,0x01,0x72,0xc6,0xc6,0xfe,
-0x90,0xc8,0xfe,0xe4,0xfe,0x70,0x01,0x90,0x01,0x1c,0xb3,0x01,0x47,0xb1,0xb1,0xfe,
-0xb9,0x4f,0xfe,0x82,0x02,0x48,0xfd,0xb8,0x8d,0xd3,0xd3,0x8e,0x00,0x03,0x00,0x98,
-0xff,0xec,0x06,0x94,0x05,0xe8,0x00,0x0d,0x00,0x1b,0x00,0x39,0x01,0x4b,0xba,0x00,
-0x0e,0x00,0x06,0x00,0x03,0x2b,0xb8,0x00,0x0e,0x10,0xba,0x00,0x1f,0x00,0x1c,0x00,
-0x03,0x2b,0xb8,0x00,0x1f,0x10,0xba,0x00,0x26,0x00,0x33,0x00,0x03,0x2b,0xb8,0x00,
-0x26,0x10,0xba,0x00,0x00,0x00,0x14,0x00,0x03,0x2b,0xb8,0x00,0x00,0x10,0x41,0x1b,
-0x00,0x16,0x00,0x0e,0x00,0x26,0x00,0x0e,0x00,0x36,0x00,0x0e,0x00,0x46,0x00,0x0e,
-0x00,0x56,0x00,0x0e,0x00,0x66,0x00,0x0e,0x00,0x76,0x00,0x0e,0x00,0x86,0x00,0x0e,
-0x00,0x96,0x00,0x0e,0x00,0xa6,0x00,0x0e,0x00,0xb6,0x00,0x0e,0x00,0xc6,0x00,0x0e,
-0x00,0xd6,0x00,0x0e,0x00,0x0d,0x5d,0x41,0x05,0x00,0xe5,0x00,0x0e,0x00,0xf5,0x00,
-0x0e,0x00,0x02,0x5d,0x41,0x05,0x00,0xea,0x00,0x14,0x00,0xfa,0x00,0x14,0x00,0x02,
-0x5d,0x41,0x1b,0x00,0x19,0x00,0x14,0x00,0x29,0x00,0x14,0x00,0x39,0x00,0x14,0x00,
-0x49,0x00,0x14,0x00,0x59,0x00,0x14,0x00,0x69,0x00,0x14,0x00,0x79,0x00,0x14,0x00,
-0x89,0x00,0x14,0x00,0x99,0x00,0x14,0x00,0xa9,0x00,0x14,0x00,0xb9,0x00,0x14,0x00,
-0xc9,0x00,0x14,0x00,0xd9,0x00,0x14,0x00,0x0d,0x5d,0xba,0x00,0x2d,0x00,0x06,0x00,
-0x00,0x11,0x12,0x39,0x41,0x05,0x00,0xea,0x00,0x33,0x00,0xfa,0x00,0x33,0x00,0x02,
-0x5d,0x41,0x1b,0x00,0x19,0x00,0x33,0x00,0x29,0x00,0x33,0x00,0x39,0x00,0x33,0x00,
-0x49,0x00,0x33,0x00,0x59,0x00,0x33,0x00,0x69,0x00,0x33,0x00,0x79,0x00,0x33,0x00,
-0x89,0x00,0x33,0x00,0x99,0x00,0x33,0x00,0xa9,0x00,0x33,0x00,0xb9,0x00,0x33,0x00,
-0xc9,0x00,0x33,0x00,0xd9,0x00,0x33,0x00,0x0d,0x5d,0x00,0xba,0x00,0x11,0x00,0x03,
-0x00,0x03,0x2b,0xb8,0x00,0x11,0x10,0xba,0x00,0x0a,0x00,0x18,0x00,0x03,0x2b,0xb8,
-0x00,0x0a,0x10,0xba,0x00,0x30,0x00,0x29,0x00,0x03,0x2b,0xb8,0x00,0x30,0x10,0xba,
-0x00,0x1d,0x00,0x1e,0x00,0x03,0x2b,0xb8,0x00,0x1d,0x10,0xba,0x00,0x23,0x00,0x36,
-0x00,0x03,0x2b,0xb8,0x00,0x23,0x10,0x30,0x31,0x01,0x10,0x00,0x21,0x20,0x00,0x11,
-0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x05,0x10,0x00,0x21,0x20,0x00,0x11,0x34,0x02,
-0x24,0x23,0x22,0x04,0x02,0x01,0x21,0x15,0x21,0x15,0x06,0x36,0x33,0x32,0x16,0x15,
-0x14,0x06,0x23,0x22,0x26,0x27,0x35,0x1e,0x01,0x33,0x32,0x36,0x35,0x34,0x26,0x23,
-0x22,0x06,0x07,0x06,0x94,0xfe,0x3f,0xfe,0xc2,0xfe,0xc4,0xfe,0x3f,0xce,0x01,0x71,
-0xbe,0xc1,0x01,0x71,0xcd,0xfa,0x57,0x01,0x8f,0x01,0x1c,0x01,0x1c,0x01,0x8f,0xb6,
-0xfe,0xb8,0xad,0xad,0xfe,0xb8,0xb6,0x01,0x98,0x02,0x3d,0xfe,0x6f,0x03,0x3f,0x1f,
-0xb0,0xcf,0xd5,0xbe,0x40,0x85,0x58,0x5f,0x77,0x44,0x68,0x76,0x76,0x68,0x32,0x65,
-0x59,0x02,0xea,0xfe,0xc1,0xfe,0x41,0x01,0xbf,0x01,0x3f,0xc6,0x01,0x72,0xc6,0xc6,
-0xfe,0x90,0xc8,0xfe,0xe4,0xfe,0x70,0x01,0x90,0x01,0x1c,0xb3,0x01,0x47,0xb1,0xb1,
-0xfe,0xb9,0x01,0x19,0x8e,0xab,0x01,0x0a,0xb0,0x95,0x98,0xac,0x14,0x18,0xac,0x2f,
-0x1b,0x61,0x55,0x56,0x61,0x14,0x25,0x00,0x00,0x04,0x00,0x98,0xff,0xec,0x06,0x94,
-0x05,0xe8,0x00,0x0d,0x00,0x1b,0x00,0x27,0x00,0x40,0x01,0x91,0xba,0x00,0x0e,0x00,
-0x06,0x00,0x03,0x2b,0xb8,0x00,0x0e,0x10,0xba,0x00,0x1f,0x00,0x3b,0x00,0x03,0x2b,
-0xb8,0x00,0x1f,0x10,0xba,0x00,0x35,0x00,0x25,0x00,0x03,0x2b,0xb8,0x00,0x35,0x10,
-0xba,0x00,0x00,0x00,0x14,0x00,0x03,0x2b,0xb8,0x00,0x00,0x10,0x41,0x1b,0x00,0x16,
-0x00,0x0e,0x00,0x26,0x00,0x0e,0x00,0x36,0x00,0x0e,0x00,0x46,0x00,0x0e,0x00,0x56,
-0x00,0x0e,0x00,0x66,0x00,0x0e,0x00,0x76,0x00,0x0e,0x00,0x86,0x00,0x0e,0x00,0x96,
-0x00,0x0e,0x00,0xa6,0x00,0x0e,0x00,0xb6,0x00,0x0e,0x00,0xc6,0x00,0x0e,0x00,0xd6,
-0x00,0x0e,0x00,0x0d,0x5d,0x41,0x05,0x00,0xe5,0x00,0x0e,0x00,0xf5,0x00,0x0e,0x00,
-0x02,0x5d,0x41,0x05,0x00,0xea,0x00,0x14,0x00,0xfa,0x00,0x14,0x00,0x02,0x5d,0x41,
-0x1b,0x00,0x19,0x00,0x14,0x00,0x29,0x00,0x14,0x00,0x39,0x00,0x14,0x00,0x49,0x00,
-0x14,0x00,0x59,0x00,0x14,0x00,0x69,0x00,0x14,0x00,0x79,0x00,0x14,0x00,0x89,0x00,
-0x14,0x00,0x99,0x00,0x14,0x00,0xa9,0x00,0x14,0x00,0xb9,0x00,0x14,0x00,0xc9,0x00,
-0x14,0x00,0xd9,0x00,0x14,0x00,0x0d,0x5d,0x41,0x1b,0x00,0x16,0x00,0x1f,0x00,0x26,
-0x00,0x1f,0x00,0x36,0x00,0x1f,0x00,0x46,0x00,0x1f,0x00,0x56,0x00,0x1f,0x00,0x66,
-0x00,0x1f,0x00,0x76,0x00,0x1f,0x00,0x86,0x00,0x1f,0x00,0x96,0x00,0x1f,0x00,0xa6,
-0x00,0x1f,0x00,0xb6,0x00,0x1f,0x00,0xc6,0x00,0x1f,0x00,0xd6,0x00,0x1f,0x00,0x0d,
-0x5d,0x41,0x05,0x00,0xe5,0x00,0x1f,0x00,0xf5,0x00,0x1f,0x00,0x02,0x5d,0x41,0x05,
-0x00,0xea,0x00,0x25,0x00,0xfa,0x00,0x25,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,
-0x25,0x00,0x29,0x00,0x25,0x00,0x39,0x00,0x25,0x00,0x49,0x00,0x25,0x00,0x59,0x00,
-0x25,0x00,0x69,0x00,0x25,0x00,0x79,0x00,0x25,0x00,0x89,0x00,0x25,0x00,0x99,0x00,
-0x25,0x00,0xa9,0x00,0x25,0x00,0xb9,0x00,0x25,0x00,0xc9,0x00,0x25,0x00,0xd9,0x00,
-0x25,0x00,0x0d,0x5d,0xba,0x00,0x29,0x00,0x25,0x00,0x35,0x11,0x12,0x39,0x00,0xba,
-0x00,0x11,0x00,0x03,0x00,0x03,0x2b,0xb8,0x00,0x11,0x10,0xba,0x00,0x0a,0x00,0x18,
-0x00,0x03,0x2b,0xb8,0x00,0x0a,0x10,0xba,0x00,0x22,0x00,0x38,0x00,0x03,0x2b,0xb8,
-0x00,0x22,0x10,0xba,0x00,0x3e,0x00,0x2c,0x00,0x03,0x2b,0xb8,0x00,0x3e,0x10,0xba,
-0x00,0x32,0x00,0x1c,0x00,0x03,0x2b,0xb8,0x00,0x32,0x10,0x30,0x31,0x01,0x10,0x00,
-0x21,0x20,0x00,0x11,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x05,0x10,0x00,0x21,0x20,
-0x00,0x11,0x34,0x02,0x24,0x23,0x22,0x04,0x02,0x05,0x22,0x06,0x15,0x14,0x16,0x33,
-0x32,0x36,0x35,0x34,0x26,0x13,0x15,0x2e,0x01,0x23,0x22,0x06,0x07,0x06,0x36,0x33,
-0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x12,0x33,0x32,0x16,0x06,0x94,
-0xfe,0x3f,0xfe,0xc2,0xfe,0xc4,0xfe,0x3f,0xce,0x01,0x71,0xbe,0xc1,0x01,0x71,0xcd,
-0xfa,0x57,0x01,0x8f,0x01,0x1c,0x01,0x1c,0x01,0x8f,0xb6,0xfe,0xb8,0xad,0xad,0xfe,
-0xb8,0xb6,0x02,0xa1,0x4e,0x5c,0x5c,0x4e,0x4e,0x5c,0x5c,0xd4,0x54,0x61,0x2f,0x77,
-0x7f,0x05,0x09,0x80,0x4e,0xa0,0xba,0xc2,0xa0,0xb9,0xc0,0xea,0xc8,0x35,0x6a,0x02,
-0xea,0xfe,0xc1,0xfe,0x41,0x01,0xbf,0x01,0x3f,0xc6,0x01,0x72,0xc6,0xc6,0xfe,0x90,
-0xc8,0xfe,0xe4,0xfe,0x70,0x01,0x90,0x01,0x1c,0xb3,0x01,0x47,0xb1,0xb1,0xfe,0xb9,
-0x9f,0x62,0x5b,0x5a,0x62,0x62,0x5a,0x5b,0x62,0x01,0x9d,0x9c,0x23,0x16,0x94,0x50,
-0x0b,0x3d,0xb1,0x94,0x91,0xb3,0xfd,0xe7,0xda,0x01,0x0b,0x13,0x00,0x03,0x00,0x98,
-0xff,0xec,0x06,0x94,0x05,0xe8,0x00,0x0d,0x00,0x1b,0x00,0x22,0x00,0xeb,0xb8,0x00,
-0x23,0x2f,0xb8,0x00,0x24,0x2f,0xb8,0x00,0x00,0xdc,0xb8,0x00,0x23,0x10,0xb8,0x00,
-0x06,0xd0,0xb8,0x00,0x06,0x2f,0xb8,0x00,0x0e,0xdc,0x41,0x1b,0x00,0x16,0x00,0x0e,
-0x00,0x26,0x00,0x0e,0x00,0x36,0x00,0x0e,0x00,0x46,0x00,0x0e,0x00,0x56,0x00,0x0e,
-0x00,0x66,0x00,0x0e,0x00,0x76,0x00,0x0e,0x00,0x86,0x00,0x0e,0x00,0x96,0x00,0x0e,
-0x00,0xa6,0x00,0x0e,0x00,0xb6,0x00,0x0e,0x00,0xc6,0x00,0x0e,0x00,0xd6,0x00,0x0e,
-0x00,0x0d,0x5d,0x41,0x05,0x00,0xe5,0x00,0x0e,0x00,0xf5,0x00,0x0e,0x00,0x02,0x5d,
-0xb8,0x00,0x00,0x10,0xb8,0x00,0x14,0xdc,0x41,0x05,0x00,0xea,0x00,0x14,0x00,0xfa,
-0x00,0x14,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,0x14,0x00,0x29,0x00,0x14,0x00,
-0x39,0x00,0x14,0x00,0x49,0x00,0x14,0x00,0x59,0x00,0x14,0x00,0x69,0x00,0x14,0x00,
-0x79,0x00,0x14,0x00,0x89,0x00,0x14,0x00,0x99,0x00,0x14,0x00,0xa9,0x00,0x14,0x00,
-0xb9,0x00,0x14,0x00,0xc9,0x00,0x14,0x00,0xd9,0x00,0x14,0x00,0x0d,0x5d,0xba,0x00,
-0x20,0x00,0x06,0x00,0x00,0x11,0x12,0x39,0xba,0x00,0x21,0x00,0x06,0x00,0x00,0x11,
-0x12,0x39,0x00,0xba,0x00,0x11,0x00,0x03,0x00,0x03,0x2b,0xb8,0x00,0x11,0x10,0xba,
-0x00,0x0a,0x00,0x18,0x00,0x03,0x2b,0xb8,0x00,0x0a,0x10,0xba,0x00,0x1d,0x00,0x21,
-0x00,0x03,0x2b,0xb8,0x00,0x1d,0x10,0x30,0x31,0x01,0x10,0x00,0x21,0x20,0x00,0x11,
-0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x05,0x10,0x00,0x21,0x20,0x00,0x11,0x34,0x02,
-0x24,0x23,0x22,0x04,0x02,0x01,0x21,0x15,0x01,0x23,0x01,0x21,0x06,0x94,0xfe,0x3f,
-0xfe,0xc2,0xfe,0xc4,0xfe,0x3f,0xce,0x01,0x71,0xbe,0xc1,0x01,0x71,0xcd,0xfa,0x57,
-0x01,0x8f,0x01,0x1c,0x01,0x1c,0x01,0x8f,0xb6,0xfe,0xb8,0xad,0xad,0xfe,0xb8,0xb6,
-0x01,0x6b,0x02,0xab,0xfe,0x94,0xc1,0x01,0x51,0xfe,0x31,0x02,0xea,0xfe,0xc1,0xfe,
-0x41,0x01,0xbf,0x01,0x3f,0xc6,0x01,0x72,0xc6,0xc6,0xfe,0x90,0xc8,0xfe,0xe4,0xfe,
-0x70,0x01,0x90,0x01,0x1c,0xb3,0x01,0x47,0xb1,0xb1,0xfe,0xb9,0x01,0x19,0x4b,0xfc,
-0xa3,0x03,0x1a,0x00,0x00,0x05,0x00,0x98,0xff,0xec,0x06,0x94,0x05,0xe8,0x00,0x0d,
-0x00,0x1b,0x00,0x27,0x00,0x3f,0x00,0x4b,0x02,0x0d,0xba,0x00,0x0e,0x00,0x06,0x00,
-0x03,0x2b,0xb8,0x00,0x0e,0x10,0xba,0x00,0x1f,0x00,0x3d,0x00,0x03,0x2b,0xb8,0x00,
-0x1f,0x10,0xba,0x00,0x31,0x00,0x46,0x00,0x03,0x2b,0xb8,0x00,0x31,0x10,0xba,0x00,
-0x00,0x00,0x14,0x00,0x03,0x2b,0xb8,0x00,0x00,0x10,0x41,0x1b,0x00,0x16,0x00,0x0e,
-0x00,0x26,0x00,0x0e,0x00,0x36,0x00,0x0e,0x00,0x46,0x00,0x0e,0x00,0x56,0x00,0x0e,
-0x00,0x66,0x00,0x0e,0x00,0x76,0x00,0x0e,0x00,0x86,0x00,0x0e,0x00,0x96,0x00,0x0e,
-0x00,0xa6,0x00,0x0e,0x00,0xb6,0x00,0x0e,0x00,0xc6,0x00,0x0e,0x00,0xd6,0x00,0x0e,
-0x00,0x0d,0x5d,0x41,0x05,0x00,0xe5,0x00,0x0e,0x00,0xf5,0x00,0x0e,0x00,0x02,0x5d,
-0x41,0x05,0x00,0xea,0x00,0x14,0x00,0xfa,0x00,0x14,0x00,0x02,0x5d,0x41,0x1b,0x00,
-0x19,0x00,0x14,0x00,0x29,0x00,0x14,0x00,0x39,0x00,0x14,0x00,0x49,0x00,0x14,0x00,
-0x59,0x00,0x14,0x00,0x69,0x00,0x14,0x00,0x79,0x00,0x14,0x00,0x89,0x00,0x14,0x00,
-0x99,0x00,0x14,0x00,0xa9,0x00,0x14,0x00,0xb9,0x00,0x14,0x00,0xc9,0x00,0x14,0x00,
-0xd9,0x00,0x14,0x00,0x0d,0x5d,0x41,0x1b,0x00,0x16,0x00,0x1f,0x00,0x26,0x00,0x1f,
-0x00,0x36,0x00,0x1f,0x00,0x46,0x00,0x1f,0x00,0x56,0x00,0x1f,0x00,0x66,0x00,0x1f,
-0x00,0x76,0x00,0x1f,0x00,0x86,0x00,0x1f,0x00,0x96,0x00,0x1f,0x00,0xa6,0x00,0x1f,
-0x00,0xb6,0x00,0x1f,0x00,0xc6,0x00,0x1f,0x00,0xd6,0x00,0x1f,0x00,0x0d,0x5d,0x41,
-0x05,0x00,0xe5,0x00,0x1f,0x00,0xf5,0x00,0x1f,0x00,0x02,0x5d,0x41,0x05,0x00,0xea,
-0x00,0x46,0x00,0xfa,0x00,0x46,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,0x46,0x00,
-0x29,0x00,0x46,0x00,0x39,0x00,0x46,0x00,0x49,0x00,0x46,0x00,0x59,0x00,0x46,0x00,
-0x69,0x00,0x46,0x00,0x79,0x00,0x46,0x00,0x89,0x00,0x46,0x00,0x99,0x00,0x46,0x00,
-0xa9,0x00,0x46,0x00,0xb9,0x00,0x46,0x00,0xc9,0x00,0x46,0x00,0xd9,0x00,0x46,0x00,
-0x0d,0x5d,0xba,0x00,0x25,0x00,0x46,0x00,0x31,0x11,0x12,0x39,0xb8,0x00,0x25,0x2f,
-0x41,0x05,0x00,0xea,0x00,0x25,0x00,0xfa,0x00,0x25,0x00,0x02,0x5d,0x41,0x1b,0x00,
-0x19,0x00,0x25,0x00,0x29,0x00,0x25,0x00,0x39,0x00,0x25,0x00,0x49,0x00,0x25,0x00,
-0x59,0x00,0x25,0x00,0x69,0x00,0x25,0x00,0x79,0x00,0x25,0x00,0x89,0x00,0x25,0x00,
-0x99,0x00,0x25,0x00,0xa9,0x00,0x25,0x00,0xb9,0x00,0x25,0x00,0xc9,0x00,0x25,0x00,
-0xd9,0x00,0x25,0x00,0x0d,0x5d,0xba,0x00,0x2b,0x00,0x3d,0x00,0x1f,0x11,0x12,0x39,
-0xb8,0x00,0x2b,0x2f,0xba,0x00,0x34,0x00,0x46,0x00,0x31,0x11,0x12,0x39,0xb8,0x00,
-0x25,0x10,0xb8,0x00,0x37,0xdc,0xb8,0x00,0x2b,0x10,0xb8,0x00,0x40,0xdc,0x00,0xba,
-0x00,0x11,0x00,0x03,0x00,0x03,0x2b,0xb8,0x00,0x11,0x10,0xba,0x00,0x0a,0x00,0x18,
-0x00,0x03,0x2b,0xb8,0x00,0x0a,0x10,0xba,0x00,0x22,0x00,0x3a,0x00,0x03,0x2b,0xb8,
-0x00,0x22,0x10,0xba,0x00,0x2e,0x00,0x49,0x00,0x03,0x2b,0xb8,0x00,0x2e,0x10,0xba,
-0x00,0x43,0x00,0x1c,0x00,0x03,0x2b,0xb8,0x00,0x43,0x10,0xba,0x00,0x34,0x00,0x1c,
-0x00,0x43,0x11,0x12,0x39,0x30,0x31,0x01,0x10,0x00,0x21,0x20,0x00,0x11,0x34,0x12,
-0x24,0x33,0x32,0x04,0x12,0x05,0x10,0x00,0x21,0x20,0x00,0x11,0x34,0x02,0x24,0x23,
-0x22,0x04,0x02,0x05,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x25,
-0x2e,0x01,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x1e,0x01,0x15,0x14,
-0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,
-0x23,0x22,0x06,0x06,0x94,0xfe,0x3f,0xfe,0xc2,0xfe,0xc4,0xfe,0x3f,0xce,0x01,0x71,
-0xbe,0xc1,0x01,0x71,0xcd,0xfa,0x57,0x01,0x8f,0x01,0x1c,0x01,0x1c,0x01,0x8f,0xb6,
-0xfe,0xb8,0xad,0xad,0xfe,0xb8,0xb6,0x02,0xaf,0x54,0x5f,0x5f,0x54,0x54,0x5f,0x5f,
-0xfe,0xc6,0x04,0x6a,0xb7,0x9d,0x9d,0xb6,0x69,0x04,0x0f,0x76,0xbe,0xad,0xad,0xbe,
-0x76,0x57,0x51,0x4d,0x4b,0x52,0x52,0x4b,0x4d,0x51,0x02,0xea,0xfe,0xc1,0xfe,0x41,
-0x01,0xbf,0x01,0x3f,0xc6,0x01,0x72,0xc6,0xc6,0xfe,0x90,0xc8,0xfe,0xe4,0xfe,0x70,
-0x01,0x90,0x01,0x1c,0xb3,0x01,0x47,0xb1,0xb1,0xfe,0xb9,0xe6,0x50,0x49,0x49,0x50,
-0x51,0x48,0x49,0x50,0x49,0x01,0x76,0x53,0x74,0x88,0x88,0x74,0x53,0x76,0x01,0x03,
-0x83,0x5c,0x8a,0x97,0x97,0x8a,0x5c,0x83,0xc1,0x3d,0x42,0x42,0x3d,0x3e,0x42,0x42,
-0x00,0x04,0x00,0x98,0xff,0xec,0x06,0x94,0x05,0xe8,0x00,0x0d,0x00,0x1b,0x00,0x34,
-0x00,0x40,0x01,0x91,0xba,0x00,0x0e,0x00,0x06,0x00,0x03,0x2b,0xb8,0x00,0x0e,0x10,
-0xba,0x00,0x3e,0x00,0x29,0x00,0x03,0x2b,0xb8,0x00,0x3e,0x10,0xba,0x00,0x00,0x00,
-0x14,0x00,0x03,0x2b,0xb8,0x00,0x00,0x10,0xba,0x00,0x2f,0x00,0x38,0x00,0x03,0x2b,
-0xb8,0x00,0x2f,0x10,0x41,0x1b,0x00,0x16,0x00,0x0e,0x00,0x26,0x00,0x0e,0x00,0x36,
-0x00,0x0e,0x00,0x46,0x00,0x0e,0x00,0x56,0x00,0x0e,0x00,0x66,0x00,0x0e,0x00,0x76,
-0x00,0x0e,0x00,0x86,0x00,0x0e,0x00,0x96,0x00,0x0e,0x00,0xa6,0x00,0x0e,0x00,0xb6,
-0x00,0x0e,0x00,0xc6,0x00,0x0e,0x00,0xd6,0x00,0x0e,0x00,0x0d,0x5d,0x41,0x05,0x00,
-0xe5,0x00,0x0e,0x00,0xf5,0x00,0x0e,0x00,0x02,0x5d,0x41,0x05,0x00,0xea,0x00,0x14,
-0x00,0xfa,0x00,0x14,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,0x14,0x00,0x29,0x00,
-0x14,0x00,0x39,0x00,0x14,0x00,0x49,0x00,0x14,0x00,0x59,0x00,0x14,0x00,0x69,0x00,
-0x14,0x00,0x79,0x00,0x14,0x00,0x89,0x00,0x14,0x00,0x99,0x00,0x14,0x00,0xa9,0x00,
-0x14,0x00,0xb9,0x00,0x14,0x00,0xc9,0x00,0x14,0x00,0xd9,0x00,0x14,0x00,0x0d,0x5d,
-0x41,0x1b,0x00,0x16,0x00,0x3e,0x00,0x26,0x00,0x3e,0x00,0x36,0x00,0x3e,0x00,0x46,
-0x00,0x3e,0x00,0x56,0x00,0x3e,0x00,0x66,0x00,0x3e,0x00,0x76,0x00,0x3e,0x00,0x86,
-0x00,0x3e,0x00,0x96,0x00,0x3e,0x00,0xa6,0x00,0x3e,0x00,0xb6,0x00,0x3e,0x00,0xc6,
-0x00,0x3e,0x00,0xd6,0x00,0x3e,0x00,0x0d,0x5d,0x41,0x05,0x00,0xe5,0x00,0x3e,0x00,
-0xf5,0x00,0x3e,0x00,0x02,0x5d,0xba,0x00,0x1d,0x00,0x29,0x00,0x3e,0x11,0x12,0x39,
-0x41,0x05,0x00,0xea,0x00,0x38,0x00,0xfa,0x00,0x38,0x00,0x02,0x5d,0x41,0x1b,0x00,
-0x19,0x00,0x38,0x00,0x29,0x00,0x38,0x00,0x39,0x00,0x38,0x00,0x49,0x00,0x38,0x00,
-0x59,0x00,0x38,0x00,0x69,0x00,0x38,0x00,0x79,0x00,0x38,0x00,0x89,0x00,0x38,0x00,
-0x99,0x00,0x38,0x00,0xa9,0x00,0x38,0x00,0xb9,0x00,0x38,0x00,0xc9,0x00,0x38,0x00,
-0xd9,0x00,0x38,0x00,0x0d,0x5d,0x00,0xba,0x00,0x11,0x00,0x03,0x00,0x03,0x2b,0xb8,
-0x00,0x11,0x10,0xba,0x00,0x0a,0x00,0x18,0x00,0x03,0x2b,0xb8,0x00,0x0a,0x10,0xba,
-0x00,0x20,0x00,0x32,0x00,0x03,0x2b,0xb8,0x00,0x20,0x10,0xba,0x00,0x2c,0x00,0x3b,
-0x00,0x03,0x2b,0xb8,0x00,0x2c,0x10,0xba,0x00,0x35,0x00,0x26,0x00,0x03,0x2b,0xb8,
-0x00,0x35,0x10,0x30,0x31,0x01,0x10,0x00,0x21,0x20,0x00,0x11,0x34,0x12,0x24,0x33,
-0x32,0x04,0x12,0x05,0x10,0x00,0x21,0x20,0x00,0x11,0x34,0x02,0x24,0x23,0x22,0x04,
-0x02,0x01,0x35,0x1e,0x01,0x33,0x32,0x36,0x37,0x36,0x06,0x23,0x22,0x26,0x35,0x34,
-0x36,0x33,0x32,0x16,0x15,0x14,0x02,0x23,0x22,0x26,0x13,0x32,0x36,0x35,0x34,0x26,
-0x23,0x22,0x06,0x15,0x14,0x16,0x06,0x94,0xfe,0x3f,0xfe,0xc2,0xfe,0xc4,0xfe,0x3f,
-0xce,0x01,0x71,0xbe,0xc1,0x01,0x71,0xcd,0xfa,0x57,0x01,0x8f,0x01,0x1c,0x01,0x1c,
-0x01,0x8f,0xb6,0xfe,0xb8,0xad,0xad,0xfe,0xb8,0xb6,0x01,0x90,0x55,0x61,0x2e,0x77,
-0x7f,0x05,0x0a,0x80,0x4f,0x9f,0xba,0xc2,0xa0,0xb9,0xbf,0xe9,0xc8,0x35,0x6b,0xd9,
-0x4e,0x5b,0x5b,0x4e,0x4e,0x5c,0x5c,0x02,0xea,0xfe,0xc1,0xfe,0x41,0x01,0xbf,0x01,
-0x3f,0xc6,0x01,0x72,0xc6,0xc6,0xfe,0x90,0xc8,0xfe,0xe4,0xfe,0x70,0x01,0x90,0x01,
-0x1c,0xb3,0x01,0x47,0xb1,0xb1,0xfe,0xb9,0xfd,0x8b,0x9c,0x24,0x15,0x93,0x4f,0x0d,
-0x3c,0xaf,0x94,0x91,0xb4,0xfd,0xe8,0xda,0xfe,0xf6,0x13,0x01,0xb4,0x62,0x5b,0x5b,
-0x62,0x62,0x5b,0x5b,0x62,0x00,0x00,0x05,0x00,0x98,0xff,0xec,0x06,0x94,0x05,0xe8,
-0x00,0x0d,0x00,0x1b,0x00,0x26,0x00,0x32,0x00,0x3e,0x01,0x9b,0xba,0x00,0x0e,0x00,
-0x06,0x00,0x03,0x2b,0xb8,0x00,0x0e,0x10,0xba,0x00,0x23,0x00,0x1d,0x00,0x03,0x2b,
-0xb8,0x00,0x23,0x10,0xba,0x00,0x2a,0x00,0x3c,0x00,0x03,0x2b,0xb8,0x00,0x2a,0x10,
-0xba,0x00,0x36,0x00,0x30,0x00,0x03,0x2b,0xb8,0x00,0x36,0x10,0xba,0x00,0x00,0x00,
-0x14,0x00,0x03,0x2b,0xb8,0x00,0x00,0x10,0x41,0x1b,0x00,0x16,0x00,0x0e,0x00,0x26,
-0x00,0x0e,0x00,0x36,0x00,0x0e,0x00,0x46,0x00,0x0e,0x00,0x56,0x00,0x0e,0x00,0x66,
-0x00,0x0e,0x00,0x76,0x00,0x0e,0x00,0x86,0x00,0x0e,0x00,0x96,0x00,0x0e,0x00,0xa6,
-0x00,0x0e,0x00,0xb6,0x00,0x0e,0x00,0xc6,0x00,0x0e,0x00,0xd6,0x00,0x0e,0x00,0x0d,
-0x5d,0x41,0x05,0x00,0xe5,0x00,0x0e,0x00,0xf5,0x00,0x0e,0x00,0x02,0x5d,0x41,0x05,
-0x00,0xea,0x00,0x14,0x00,0xfa,0x00,0x14,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,
-0x14,0x00,0x29,0x00,0x14,0x00,0x39,0x00,0x14,0x00,0x49,0x00,0x14,0x00,0x59,0x00,
-0x14,0x00,0x69,0x00,0x14,0x00,0x79,0x00,0x14,0x00,0x89,0x00,0x14,0x00,0x99,0x00,
-0x14,0x00,0xa9,0x00,0x14,0x00,0xb9,0x00,0x14,0x00,0xc9,0x00,0x14,0x00,0xd9,0x00,
-0x14,0x00,0x0d,0x5d,0x41,0x05,0x00,0xea,0x00,0x30,0x00,0xfa,0x00,0x30,0x00,0x02,
-0x5d,0x41,0x1b,0x00,0x19,0x00,0x30,0x00,0x29,0x00,0x30,0x00,0x39,0x00,0x30,0x00,
-0x49,0x00,0x30,0x00,0x59,0x00,0x30,0x00,0x69,0x00,0x30,0x00,0x79,0x00,0x30,0x00,
-0x89,0x00,0x30,0x00,0x99,0x00,0x30,0x00,0xa9,0x00,0x30,0x00,0xb9,0x00,0x30,0x00,
-0xc9,0x00,0x30,0x00,0xd9,0x00,0x30,0x00,0x0d,0x5d,0x41,0x05,0x00,0xea,0x00,0x3c,
-0x00,0xfa,0x00,0x3c,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,0x3c,0x00,0x29,0x00,
-0x3c,0x00,0x39,0x00,0x3c,0x00,0x49,0x00,0x3c,0x00,0x59,0x00,0x3c,0x00,0x69,0x00,
-0x3c,0x00,0x79,0x00,0x3c,0x00,0x89,0x00,0x3c,0x00,0x99,0x00,0x3c,0x00,0xa9,0x00,
-0x3c,0x00,0xb9,0x00,0x3c,0x00,0xc9,0x00,0x3c,0x00,0xd9,0x00,0x3c,0x00,0x0d,0x5d,
-0x00,0xba,0x00,0x11,0x00,0x03,0x00,0x03,0x2b,0xb8,0x00,0x11,0x10,0xba,0x00,0x0a,
-0x00,0x18,0x00,0x03,0x2b,0xb8,0x00,0x0a,0x10,0xba,0x00,0x2d,0x00,0x39,0x00,0x03,
-0x2b,0xb8,0x00,0x2d,0x10,0xba,0x00,0x24,0x00,0x25,0x00,0x03,0x2b,0xb8,0x00,0x24,
-0x10,0xba,0x00,0x33,0x00,0x27,0x00,0x03,0x2b,0xb8,0x00,0x33,0x10,0xb8,0x00,0x24,
-0x10,0xb8,0x00,0x1c,0xd0,0x30,0x31,0x01,0x10,0x00,0x21,0x20,0x00,0x11,0x34,0x12,
-0x24,0x33,0x32,0x04,0x12,0x05,0x10,0x00,0x21,0x20,0x00,0x11,0x34,0x02,0x24,0x23,
-0x22,0x04,0x02,0x13,0x33,0x11,0x07,0x35,0x37,0x33,0x11,0x33,0x15,0x21,0x01,0x22,
-0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x32,0x16,0x15,0x14,0x06,
-0x23,0x22,0x26,0x35,0x34,0x36,0x06,0x94,0xfe,0x3f,0xfe,0xc2,0xfe,0xc4,0xfe,0x3f,
-0xce,0x01,0x71,0xbe,0xc1,0x01,0x71,0xcd,0xfa,0x57,0x01,0x8f,0x01,0x1c,0x01,0x1c,
-0x01,0x8f,0xb6,0xfe,0xb8,0xad,0xad,0xfe,0xb8,0xb6,0xcd,0x9e,0xac,0xbc,0x75,0x9f,
-0xfe,0x3e,0x03,0x04,0x40,0x45,0x45,0x40,0x3f,0x46,0x46,0x3f,0x82,0x88,0x88,0x82,
-0x83,0x88,0x88,0x02,0xea,0xfe,0xc1,0xfe,0x41,0x01,0xbf,0x01,0x3f,0xc6,0x01,0x72,
-0xc6,0xc6,0xfe,0x90,0xc8,0xfe,0xe4,0xfe,0x70,0x01,0x90,0x01,0x1c,0xb3,0x01,0x47,
-0xb1,0xb1,0xfe,0xb9,0xfe,0x3e,0x02,0x3e,0x27,0x89,0x2a,0xfd,0x36,0x80,0x02,0xde,
-0x97,0xa3,0xa2,0x97,0x97,0xa2,0xa3,0x97,0x7b,0xe4,0xd1,0xd0,0xe4,0xe4,0xd0,0xd1,
-0xe4,0x00,0xff,0xff,0xff,0xec,0x02,0x14,0x06,0x3b,0x06,0x28,0x10,0x07,0x09,0x1f,
-0x00,0x00,0x04,0x14,0x00,0x01,0xff,0xec,0xfe,0x00,0x06,0x3b,0xff,0x05,0x00,0x03,
-0x00,0x00,0x03,0x11,0x21,0x11,0x14,0x06,0x4f,0xfe,0x00,0x01,0x05,0xfe,0xfb,0x00,
-0x00,0x01,0xff,0xec,0xfe,0x00,0x06,0x3b,0xff,0xf6,0x00,0x03,0x00,0x00,0x03,0x11,
-0x21,0x11,0x14,0x06,0x4f,0xfe,0x00,0x01,0xf6,0xfe,0x0a,0x00,0x00,0x01,0xff,0xec,
-0xfe,0x00,0x06,0x3b,0x01,0x0f,0x00,0x03,0x00,0x00,0x03,0x11,0x21,0x11,0x14,0x06,
-0x4f,0xfe,0x00,0x03,0x0f,0xfc,0xf1,0x00,0x00,0x01,0xff,0xec,0xfe,0x00,0x06,0x3b,
-0x02,0x14,0x00,0x03,0x00,0x00,0x03,0x11,0x21,0x11,0x14,0x06,0x4f,0xfe,0x00,0x04,
-0x14,0xfb,0xec,0x00,0x00,0x01,0xff,0xec,0xfe,0x00,0x06,0x3b,0x03,0x19,0x00,0x03,
-0x00,0x00,0x03,0x11,0x21,0x11,0x14,0x06,0x4f,0xfe,0x00,0x05,0x19,0xfa,0xe7,0x00,
-0x00,0x01,0xff,0xec,0xfe,0x00,0x06,0x3b,0x04,0x1e,0x00,0x03,0x00,0x00,0x03,0x11,
-0x21,0x11,0x14,0x06,0x4f,0xfe,0x00,0x06,0x1e,0xf9,0xe2,0x00,0x00,0x01,0xff,0xec,
-0xfe,0x00,0x06,0x3b,0x05,0x23,0x00,0x03,0x00,0x00,0x03,0x11,0x21,0x11,0x14,0x06,
-0x4f,0xfe,0x00,0x07,0x23,0xf8,0xdd,0x00,0x00,0x01,0xff,0xec,0xfe,0x00,0x06,0x3b,
-0x06,0x28,0x00,0x03,0x00,0x00,0x03,0x11,0x21,0x11,0x14,0x06,0x4f,0xfe,0x00,0x08,
-0x28,0xf7,0xd8,0x00,0x00,0x01,0xff,0xec,0xfe,0x00,0x05,0x71,0x06,0x28,0x00,0x03,
-0x00,0x00,0x03,0x11,0x21,0x11,0x14,0x05,0x85,0xfe,0x00,0x08,0x28,0xf7,0xd8,0x00,
-0x00,0x01,0xff,0xec,0xfe,0x00,0x04,0xa7,0x06,0x28,0x00,0x03,0x00,0x00,0x03,0x11,
-0x21,0x11,0x14,0x04,0xbb,0xfe,0x00,0x08,0x28,0xf7,0xd8,0x00,0x00,0x01,0xff,0xec,
-0xfe,0x00,0x03,0xdd,0x06,0x28,0x00,0x03,0x00,0x00,0x03,0x11,0x21,0x11,0x14,0x03,
-0xf1,0xfe,0x00,0x08,0x28,0xf7,0xd8,0x00,0x00,0x01,0xff,0xec,0xfe,0x00,0x03,0x13,
-0x06,0x28,0x00,0x03,0x00,0x00,0x03,0x11,0x21,0x11,0x14,0x03,0x27,0xfe,0x00,0x08,
-0x28,0xf7,0xd8,0x00,0x00,0x01,0xff,0xec,0xfe,0x00,0x02,0x49,0x06,0x28,0x00,0x03,
-0x00,0x00,0x03,0x11,0x21,0x11,0x14,0x02,0x5d,0xfe,0x00,0x08,0x28,0xf7,0xd8,0x00,
-0x00,0x01,0xff,0xec,0xfe,0x00,0x01,0x7f,0x06,0x28,0x00,0x03,0x00,0x00,0x03,0x11,
-0x21,0x11,0x14,0x01,0x93,0xfe,0x00,0x08,0x28,0xf7,0xd8,0x00,0x00,0x01,0xff,0xec,
-0xfe,0x00,0x00,0xb5,0x06,0x28,0x00,0x03,0x00,0x00,0x03,0x11,0x33,0x11,0x14,0xc9,
-0xfe,0x00,0x08,0x28,0xf7,0xd8,0xff,0xff,0x03,0x13,0xfe,0x00,0x06,0x3a,0x06,0x28,
-0x10,0x07,0x09,0x27,0x03,0x27,0x00,0x00,0x00,0x0c,0xff,0xec,0xfe,0x00,0x05,0x71,
-0x06,0x28,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x17,0x00,0x1b,
-0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0x2b,0x00,0x2f,0x00,0x00,0x01,0x11,0x33,0x11,
-0x21,0x11,0x33,0x11,0x13,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x01,0x11,0x33,0x11,
-0x21,0x11,0x33,0x11,0x13,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x01,0x11,0x33,0x11,
-0x21,0x11,0x33,0x11,0x13,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x04,0xa7,0xca,0xfc,
-0x0e,0xca,0xca,0xca,0xfc,0x0f,0xc9,0x03,0xf2,0xca,0xfc,0x0e,0xca,0xca,0xca,0xfc,
-0x0f,0xc9,0x03,0xf2,0xca,0xfc,0x0e,0xca,0xca,0xca,0xfc,0x0f,0xc9,0xfe,0x00,0x01,
-0x05,0xfe,0xfb,0x01,0x05,0xfe,0xfb,0x01,0x6d,0x01,0x05,0xfe,0xfb,0x01,0x05,0xfe,
-0xfb,0x01,0x6e,0x01,0x05,0xfe,0xfb,0x01,0x05,0xfe,0xfb,0x01,0x6d,0x01,0x05,0xfe,
-0xfb,0x01,0x05,0xfe,0xfb,0x01,0x6e,0x01,0x05,0xfe,0xfb,0x01,0x05,0xfe,0xfb,0x01,
-0x6d,0x01,0x05,0xfe,0xfb,0x01,0x05,0xfe,0xfb,0x00,0x00,0x04,0xff,0xec,0xfe,0x00,
-0x06,0x3b,0x06,0x28,0x00,0x12,0x00,0x25,0x00,0x38,0x00,0x4b,0x00,0x00,0x01,0x11,
-0x23,0x11,0x21,0x11,0x31,0x21,0x11,0x21,0x11,0x21,0x11,0x21,0x11,0x21,0x11,0x21,
-0x11,0x21,0x11,0x23,0x11,0x21,0x11,0x31,0x21,0x11,0x21,0x11,0x21,0x11,0x21,0x11,
-0x21,0x11,0x21,0x11,0x21,0x11,0x23,0x11,0x21,0x11,0x31,0x21,0x11,0x21,0x11,0x21,
-0x11,0x21,0x11,0x21,0x11,0x21,0x11,0x21,0x11,0x23,0x11,0x21,0x11,0x31,0x21,0x11,
-0x21,0x11,0x21,0x11,0x21,0x11,0x21,0x11,0x21,0x11,0x05,0x71,0xca,0x01,0x94,0xfe,
-0x6c,0x01,0x94,0xfe,0x6c,0x01,0x94,0xfe,0x6c,0x01,0x94,0xfd,0xa2,0xca,0x01,0x94,
-0xfe,0x6c,0x01,0x94,0xfe,0x6c,0x01,0x94,0xfe,0x6c,0x01,0x94,0xfd,0xa2,0xca,0x01,
-0x94,0xfe,0x6c,0x01,0x94,0xfe,0x6c,0x01,0x94,0xfe,0x6c,0x01,0x94,0xfd,0xa2,0xc9,
-0x01,0x93,0xfe,0x6d,0x01,0x93,0xfe,0x6d,0x01,0x93,0xfe,0x6d,0x01,0x93,0xfe,0x00,
-0x08,0x28,0xfe,0xfb,0xfe,0xfb,0xfe,0xfb,0xfe,0xfb,0xfe,0xfb,0xfe,0xfb,0xfe,0xfb,
-0xfe,0xfb,0x08,0x28,0xfe,0xfb,0xfe,0xfb,0xfe,0xfb,0xfe,0xfb,0xfe,0xfb,0xfe,0xfb,
-0xfe,0xfb,0xfe,0xfb,0x08,0x28,0xfe,0xfb,0xfe,0xfb,0xfe,0xfb,0xfe,0xfb,0xfe,0xfb,
-0xfe,0xfb,0xfe,0xfb,0xfe,0xfb,0x08,0x28,0xfe,0xfb,0xfe,0xfb,0xfe,0xfb,0xfe,0xfb,
-0xfe,0xfb,0xfe,0xfb,0xfe,0xfb,0xfe,0xfb,0x00,0x07,0xff,0xec,0xfe,0x00,0x06,0x3b,
-0x06,0x28,0x00,0x19,0x00,0x1d,0x00,0x21,0x00,0x25,0x00,0x29,0x00,0x2d,0x00,0x31,
-0x00,0x00,0x03,0x11,0x33,0x11,0x23,0x11,0x33,0x11,0x23,0x11,0x33,0x11,0x21,0x11,
-0x33,0x11,0x21,0x11,0x23,0x11,0x23,0x11,0x21,0x11,0x23,0x19,0x01,0x33,0x11,0x23,
-0x01,0x33,0x11,0x23,0x01,0x33,0x11,0x23,0x01,0x33,0x11,0x23,0x01,0x33,0x11,0x23,
-0x01,0x33,0x11,0x23,0x14,0xc9,0xc9,0xc9,0xc9,0xc9,0x02,0x5e,0xca,0x02,0x5e,0xca,
-0xca,0xfd,0xa2,0xca,0xca,0xca,0x03,0x28,0xca,0xca,0xfe,0x6c,0xca,0xca,0xfe,0x6c,
-0xca,0xca,0x03,0x28,0xca,0xca,0xfe,0x6c,0xca,0xca,0xfe,0x00,0x01,0x6d,0x01,0x05,
-0x01,0xd6,0x01,0x05,0x01,0xd6,0x01,0x05,0xfe,0xfb,0x01,0x05,0xf7,0xd8,0x01,0x05,
-0xfe,0xfb,0x01,0x05,0xfe,0xfb,0x05,0xb6,0x01,0x05,0xfe,0xfb,0x01,0x05,0xfd,0x8d,
-0x01,0x05,0xfd,0x8e,0x01,0x05,0xfe,0xfb,0x01,0x05,0xfd,0x8d,0x01,0x05,0xff,0xff,
-0xff,0xec,0x05,0x23,0x06,0x3b,0x06,0x28,0x10,0x07,0x09,0x1c,0x00,0x00,0x07,0x23,
-0xff,0xff,0x05,0x71,0xfe,0x00,0x06,0x3a,0x06,0x28,0x10,0x07,0x09,0x2a,0x05,0x85,
-0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x00,0x03,0x12,0x02,0x14,0x00,0x03,0x00,0x00,
-0x03,0x11,0x21,0x11,0x14,0x03,0x26,0xfe,0x00,0x04,0x14,0xfb,0xec,0x00,0xff,0xff,
-0x03,0x13,0xfe,0x00,0x06,0x39,0x02,0x14,0x10,0x07,0x09,0x31,0x03,0x27,0x00,0x00,
-0xff,0xff,0xff,0xec,0x02,0x14,0x03,0x12,0x06,0x28,0x10,0x07,0x09,0x31,0x00,0x00,
-0x04,0x14,0xff,0xff,0xff,0xec,0xfe,0x00,0x06,0x39,0x06,0x28,0x10,0x26,0x09,0x31,
-0x00,0x00,0x10,0x26,0x09,0x32,0x00,0x00,0x10,0x06,0x09,0x33,0x00,0x00,0xff,0xff,
-0xff,0xec,0xfe,0x00,0x06,0x39,0x06,0x28,0x10,0x26,0x09,0x32,0x00,0x00,0x10,0x06,
-0x09,0x33,0x00,0x00,0xff,0xff,0xff,0xec,0xfe,0x00,0x06,0x39,0x06,0x28,0x10,0x26,
-0x09,0x31,0x00,0x00,0x10,0x26,0x09,0x33,0x00,0x00,0x10,0x06,0x09,0x38,0x00,0x00,
-0xff,0xff,0xff,0xec,0xfe,0x00,0x06,0x39,0x06,0x28,0x10,0x26,0x09,0x32,0x00,0x00,
-0x10,0x26,0x09,0x33,0x00,0x00,0x10,0x06,0x09,0x38,0x00,0x00,0xff,0xff,0x03,0x13,
-0x02,0x14,0x06,0x39,0x06,0x28,0x10,0x07,0x09,0x31,0x03,0x27,0x04,0x14,0xff,0xff,
-0xff,0xec,0xfe,0x00,0x06,0x39,0x06,0x28,0x10,0x26,0x09,0x31,0x00,0x00,0x10,0x06,
-0x09,0x38,0x00,0x00,0xff,0xff,0xff,0xec,0xfe,0x00,0x06,0x39,0x06,0x28,0x10,0x26,
-0x09,0x31,0x00,0x00,0x10,0x26,0x09,0x32,0x00,0x00,0x10,0x06,0x09,0x38,0x00,0x00,
-0x00,0x01,0x00,0xba,0xff,0x03,0x06,0xd5,0x05,0x25,0x00,0x03,0x00,0x00,0x17,0x11,
-0x21,0x11,0xba,0x06,0x1b,0xfc,0x06,0x20,0xf9,0xe0,0x00,0x02,0x00,0xba,0xff,0x03,
-0x06,0xd5,0x05,0x25,0x00,0x03,0x00,0x07,0x00,0x00,0x05,0x21,0x11,0x21,0x03,0x11,
-0x21,0x11,0x01,0x2c,0x05,0x37,0xfa,0xc9,0x72,0x06,0x1b,0x8a,0x05,0x3c,0xfa,0x52,
-0x06,0x20,0xf9,0xe0,0x00,0x02,0x00,0xba,0xff,0x03,0x06,0xd5,0x05,0x25,0x00,0x0b,
-0x00,0x17,0x00,0x00,0x25,0x14,0x33,0x21,0x32,0x35,0x11,0x34,0x23,0x21,0x22,0x15,
-0x03,0x11,0x10,0x29,0x01,0x20,0x19,0x01,0x10,0x29,0x01,0x20,0x01,0x2c,0xe4,0x03,
-0x6f,0xe4,0xe4,0xfc,0x91,0xe4,0x72,0x01,0x56,0x03,0x6f,0x01,0x56,0xfe,0xaa,0xfc,
-0x91,0xfe,0xaa,0x5a,0xe4,0xe4,0x03,0x74,0xe4,0xe4,0xfc,0x8c,0x03,0x74,0x01,0x56,
-0xfe,0xaa,0xfc,0x8c,0xfe,0xaa,0xff,0xff,0x00,0xba,0xff,0x03,0x06,0xd5,0x05,0x25,
-0x10,0x27,0x09,0x45,0x01,0x11,0x00,0x00,0x10,0x06,0x09,0x3c,0x00,0x00,0x00,0x06,
-0x00,0xba,0xff,0x03,0x06,0xd5,0x05,0x25,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,
-0x00,0x13,0x00,0x17,0x00,0x00,0x17,0x11,0x21,0x11,0x25,0x21,0x35,0x21,0x35,0x21,
-0x35,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0xba,0x06,
-0x1b,0xfa,0x57,0x05,0x37,0xfa,0xc9,0x05,0x37,0xfa,0xc9,0x05,0x37,0xfa,0xc9,0x05,
-0x37,0xfa,0xc9,0x05,0x37,0xfa,0xc9,0xfc,0x06,0x20,0xf9,0xe0,0x72,0xb0,0x72,0xb2,
-0x72,0xb0,0x72,0xb2,0x72,0xb0,0x00,0x06,0x00,0xba,0xff,0x03,0x06,0xd5,0x05,0x25,
-0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x17,0x00,0x00,0x17,0x11,
-0x21,0x11,0x25,0x33,0x11,0x23,0x01,0x33,0x11,0x23,0x01,0x33,0x11,0x23,0x01,0x33,
-0x11,0x23,0x01,0x33,0x11,0x23,0xba,0x06,0x1b,0xfe,0xe1,0xb0,0xb0,0xfe,0xdc,0xb2,
-0xb2,0xfe,0xde,0xb0,0xb0,0xfe,0xdc,0xb2,0xb2,0xfe,0xde,0xb0,0xb0,0xfc,0x06,0x20,
-0xf9,0xe0,0x74,0x05,0x38,0xfa,0xc8,0x05,0x38,0xfa,0xc8,0x05,0x38,0xfa,0xc8,0x05,
-0x38,0xfa,0xc8,0x05,0x38,0x00,0x00,0x1a,0x00,0xba,0xff,0x03,0x06,0xd5,0x05,0x25,
-0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x17,0x00,0x1b,0x00,0x1f,
-0x00,0x23,0x00,0x27,0x00,0x2b,0x00,0x2f,0x00,0x33,0x00,0x37,0x00,0x3b,0x00,0x3f,
-0x00,0x43,0x00,0x47,0x00,0x4b,0x00,0x4f,0x00,0x53,0x00,0x57,0x00,0x5b,0x00,0x5f,
-0x00,0x63,0x00,0x67,0x00,0x00,0x05,0x33,0x35,0x23,0x05,0x33,0x35,0x23,0x05,0x33,
-0x35,0x23,0x01,0x33,0x35,0x23,0x11,0x33,0x35,0x23,0x11,0x33,0x35,0x23,0x11,0x33,
-0x35,0x23,0x11,0x33,0x35,0x23,0x01,0x33,0x35,0x23,0x11,0x33,0x35,0x23,0x11,0x33,
-0x35,0x23,0x11,0x33,0x35,0x23,0x01,0x33,0x35,0x23,0x11,0x33,0x35,0x23,0x11,0x33,
-0x35,0x23,0x11,0x33,0x35,0x23,0x01,0x33,0x35,0x23,0x11,0x33,0x35,0x23,0x11,0x33,
-0x35,0x23,0x11,0x33,0x35,0x23,0x01,0x33,0x35,0x23,0x11,0x33,0x35,0x23,0x11,0x33,
-0x35,0x23,0x11,0x33,0x35,0x23,0x11,0x33,0x35,0x23,0x01,0x11,0x21,0x11,0x02,0x4c,
-0xb2,0xb2,0x01,0x24,0xb0,0xb0,0x01,0x22,0xb2,0xb2,0xfc,0x9a,0xae,0xae,0xae,0xae,
-0xae,0xae,0xae,0xae,0xae,0xae,0x01,0x20,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,
-0x01,0x24,0xb0,0xb0,0xb0,0xb0,0xb0,0xb0,0xb0,0xb0,0x01,0x22,0xb2,0xb2,0xb2,0xb2,
-0xb2,0xb2,0xb2,0xb2,0x01,0x24,0xad,0xad,0xad,0xad,0xad,0xad,0xad,0xad,0xad,0xad,
-0xfb,0x04,0x06,0x1b,0x88,0xae,0xae,0xae,0xae,0xae,0x03,0xdc,0xae,0xfe,0x2e,0xb2,
-0xfe,0x2c,0xb0,0xfe,0x2c,0xb2,0xfe,0x2e,0xae,0x03,0xdc,0xae,0xfe,0x2e,0xb2,0xfe,
-0x2c,0xb0,0xfe,0x2c,0xb2,0x02,0xb8,0xae,0xfe,0x2e,0xb2,0xfe,0x2c,0xb0,0xfe,0x2c,
-0xb2,0x02,0xb8,0xae,0xfe,0x2e,0xb2,0xfe,0x2c,0xb0,0xfe,0x2c,0xb2,0x02,0xb8,0xae,
-0xfe,0x2e,0xb2,0xfe,0x2c,0xb0,0xfe,0x2c,0xb2,0xfe,0x2e,0xae,0xfe,0xde,0x06,0x20,
-0xf9,0xe0,0x00,0x08,0x00,0xba,0xff,0x03,0x06,0xd5,0x05,0x25,0x00,0x03,0x00,0x06,
-0x00,0x0a,0x00,0x0e,0x00,0x14,0x00,0x18,0x00,0x1c,0x00,0x1f,0x00,0x00,0x17,0x11,
-0x21,0x11,0x01,0x15,0x33,0x03,0x15,0x01,0x33,0x01,0x15,0x01,0x37,0x01,0x15,0x01,
-0x37,0x35,0x01,0x33,0x01,0x35,0x01,0x33,0x01,0x35,0x01,0x33,0x17,0x35,0xba,0x06,
-0x1b,0xfa,0x57,0xe2,0xe2,0x01,0x84,0xfb,0xfd,0x81,0x03,0x21,0xfb,0xfb,0xe4,0x04,
-0xbe,0x79,0xfb,0x42,0xa2,0x04,0x1c,0xfc,0xdf,0xa2,0x02,0x7f,0xfe,0x7c,0xa2,0xe2,
-0xfc,0x06,0x20,0xf9,0xe0,0x01,0x54,0xe2,0x02,0x7f,0xfc,0xfe,0x7d,0x04,0x1c,0xfc,
-0xfc,0xdf,0x01,0x05,0x3c,0x7f,0xfb,0x42,0x01,0x7f,0x04,0xbd,0xfb,0xe4,0xfc,0x03,
-0x20,0xfd,0x81,0xfc,0x01,0x83,0xe2,0xe2,0x00,0x08,0x00,0xba,0xff,0x03,0x06,0xd5,
-0x05,0x25,0x00,0x03,0x00,0x06,0x00,0x0a,0x00,0x0e,0x00,0x14,0x00,0x18,0x00,0x1c,
-0x00,0x1f,0x00,0x00,0x17,0x11,0x21,0x11,0x25,0x33,0x35,0x05,0x33,0x01,0x35,0x01,
-0x17,0x01,0x35,0x01,0x17,0x01,0x35,0x23,0x01,0x35,0x01,0x23,0x01,0x35,0x01,0x23,
-0x01,0x35,0x37,0x23,0xba,0x06,0x1b,0xfe,0xac,0xe2,0xfd,0x81,0xfb,0x01,0x84,0xfb,
-0xe4,0xfb,0x03,0x21,0xfa,0xc9,0x79,0x04,0xbe,0x79,0xfb,0x42,0x04,0x1c,0xfb,0xfc,
-0xdf,0x02,0x7f,0xfb,0xfe,0x7c,0xe2,0xe2,0xfc,0x06,0x20,0xf9,0xe0,0x72,0xe2,0xe2,
-0x01,0x83,0xfc,0xfd,0x81,0x01,0x03,0x21,0xfc,0xfb,0xe4,0x01,0x04,0xbe,0x7f,0xfb,
-0x43,0xa1,0x04,0x1c,0xfc,0xe0,0xa1,0x02,0x7f,0xfe,0x7d,0xa1,0xe2,0x00,0x00,0x1a,
-0x00,0xba,0xff,0x03,0x06,0xd5,0x05,0x25,0x00,0x04,0x00,0x09,0x00,0x0e,0x00,0x12,
-0x00,0x17,0x00,0x1c,0x00,0x20,0x00,0x24,0x00,0x28,0x00,0x2d,0x00,0x31,0x00,0x35,
-0x00,0x39,0x00,0x3d,0x00,0x41,0x00,0x46,0x00,0x4b,0x00,0x4f,0x00,0x53,0x00,0x57,
-0x00,0x5c,0x00,0x61,0x00,0x65,0x00,0x6a,0x00,0x6f,0x00,0x73,0x00,0x00,0x01,0x17,
-0x37,0x27,0x23,0x11,0x17,0x37,0x27,0x07,0x01,0x17,0x37,0x27,0x23,0x01,0x17,0x37,
-0x27,0x03,0x17,0x37,0x27,0x07,0x01,0x17,0x37,0x27,0x23,0x01,0x17,0x37,0x27,0x01,
-0x17,0x37,0x27,0x01,0x17,0x37,0x27,0x01,0x17,0x37,0x35,0x23,0x01,0x17,0x37,0x27,
-0x01,0x17,0x37,0x27,0x01,0x17,0x37,0x27,0x01,0x17,0x37,0x27,0x01,0x17,0x37,0x27,
-0x01,0x33,0x37,0x27,0x07,0x01,0x17,0x37,0x35,0x27,0x01,0x17,0x37,0x27,0x01,0x17,
-0x37,0x27,0x01,0x17,0x37,0x27,0x01,0x17,0x33,0x37,0x27,0x01,0x17,0x37,0x35,0x27,
-0x01,0x17,0x37,0x27,0x01,0x17,0x33,0x37,0x27,0x05,0x17,0x33,0x35,0x27,0x01,0x11,
-0x21,0x11,0x01,0x2c,0x32,0x7c,0x35,0x79,0x32,0x7e,0x7e,0x32,0x01,0x4f,0x7e,0x7e,
-0x35,0x92,0xfe,0xfe,0x7e,0x7c,0x7e,0xfe,0x32,0x7e,0x7e,0x32,0x02,0xec,0x7e,0x7e,
-0x35,0x92,0xfe,0xfd,0x7e,0x7d,0x7d,0xfe,0xb5,0x7d,0x7d,0x7e,0xfe,0xb5,0x7e,0x7e,
-0x7e,0x03,0x89,0x7d,0x31,0x79,0xfe,0xfd,0x7c,0x7e,0x7c,0xfe,0xb3,0x7c,0x7e,0x7c,
-0xfe,0xb5,0x7d,0x7c,0x7c,0xfe,0xb5,0x7c,0x7e,0x7c,0xfe,0xb3,0x7d,0x7d,0x7c,0xff,
-0x00,0x7a,0x34,0x7c,0x32,0x04,0x88,0x7e,0x31,0x32,0xfe,0xb4,0x7e,0x7e,0x7e,0xfe,
-0xb5,0x7e,0x7c,0x7e,0xfe,0xb6,0x7e,0x7e,0x7e,0xfe,0xb3,0x35,0x93,0x34,0x7e,0x02,
-0xbb,0x7d,0x32,0x32,0xfe,0xb5,0x7e,0x7d,0x7e,0xfe,0xb5,0x34,0x93,0x35,0x7e,0x01,
-0x1f,0x34,0x7a,0x32,0xfa,0x89,0x06,0x1b,0x04,0x33,0x31,0x7c,0x34,0xfd,0xe4,0x32,
-0x7e,0x7e,0x31,0x01,0x4f,0x7e,0x7e,0x34,0xfe,0xff,0x7e,0x7c,0x7e,0xfc,0xcc,0x31,
-0x7e,0x7d,0x31,0x02,0xec,0x7e,0x7e,0x34,0xfe,0xfd,0x7d,0x7d,0x7e,0xfe,0xb5,0x7e,
-0x7d,0x7d,0xfe,0xb6,0x7e,0x7e,0x7e,0x01,0xec,0x7c,0x31,0x7f,0xfe,0xfd,0x7c,0x7e,
-0x7c,0xfe,0xb4,0x7d,0x7e,0x7c,0xfe,0xb6,0x7c,0x7c,0x7c,0xfe,0xb5,0x7c,0x7e,0x7c,
-0xfe,0xb4,0x7c,0x7d,0x7d,0xfe,0x81,0x34,0x7c,0x31,0x02,0xed,0x7e,0x32,0x99,0x31,
-0xfe,0xb4,0x7e,0x7e,0x7e,0xfe,0xb5,0x7e,0x7c,0x7e,0xfe,0xb5,0x7e,0x7e,0x7e,0xfe,
-0xb4,0x34,0x34,0x7e,0x01,0x1e,0x7e,0x31,0x99,0x31,0xfe,0xb5,0x7d,0x7c,0x7e,0xfe,
-0xb5,0x34,0x34,0x7e,0x7e,0x34,0x7f,0x31,0xfe,0xde,0x06,0x20,0xf9,0xe0,0x00,0x01,
-0x00,0xba,0x00,0x16,0x04,0xb2,0x04,0x12,0x00,0x03,0x00,0x00,0x37,0x11,0x21,0x11,
-0xba,0x03,0xf8,0x16,0x03,0xfc,0xfc,0x04,0x00,0x02,0x00,0xba,0x00,0x16,0x04,0xb2,
-0x04,0x12,0x00,0x03,0x00,0x07,0x00,0x00,0x25,0x21,0x11,0x21,0x03,0x11,0x21,0x11,
-0x01,0x2c,0x03,0x14,0xfc,0xec,0x72,0x03,0xf8,0x88,0x03,0x18,0xfc,0x76,0x03,0xfc,
-0xfc,0x04,0x00,0x01,0x00,0xba,0x00,0x9a,0x06,0xd5,0x03,0x8e,0x00,0x03,0x00,0x00,
-0x25,0x21,0x11,0x21,0x06,0xd5,0xf9,0xe5,0x06,0x1b,0x9a,0x02,0xf4,0x00,0x00,0x02,
-0x00,0xba,0x00,0x9a,0x06,0xd5,0x03,0x8e,0x00,0x03,0x00,0x07,0x00,0x00,0x01,0x11,
-0x21,0x11,0x05,0x21,0x11,0x21,0x06,0x63,0xfa,0xc9,0x05,0xa9,0xf9,0xe5,0x06,0x1b,
-0x01,0x0c,0x02,0x10,0xfd,0xf0,0x72,0x02,0xf4,0x00,0x00,0x01,0x00,0xba,0xff,0x06,
-0x03,0xad,0x05,0x22,0x00,0x03,0x00,0x00,0x17,0x11,0x21,0x11,0xba,0x02,0xf3,0xfa,
-0x06,0x1c,0xf9,0xe4,0x00,0x02,0x00,0xba,0xff,0x06,0x03,0xad,0x05,0x22,0x00,0x03,
-0x00,0x07,0x00,0x00,0x05,0x21,0x11,0x21,0x03,0x11,0x21,0x11,0x01,0x2c,0x02,0x0f,
-0xfd,0xf1,0x72,0x02,0xf3,0x88,0x05,0x38,0xfa,0x56,0x06,0x1c,0xf9,0xe4,0x00,0x01,
-0x00,0x06,0x00,0x9a,0x06,0x21,0x03,0x8e,0x00,0x03,0x00,0x00,0x25,0x21,0x01,0x21,
-0x04,0x98,0xfb,0x6e,0x01,0x8a,0x04,0x91,0x9a,0x02,0xf4,0x00,0x00,0x02,0x00,0x06,
-0x00,0x9a,0x06,0x21,0x03,0x8e,0x00,0x03,0x00,0x07,0x00,0x00,0x09,0x01,0x21,0x01,
-0x05,0x21,0x01,0x21,0x04,0x62,0x01,0x10,0xfc,0x53,0xfe,0xef,0x03,0xe4,0xfb,0x6e,
-0x01,0x8a,0x04,0x91,0x01,0x0c,0x02,0x10,0xfd,0xf0,0x72,0x02,0xf4,0x00,0x00,0x01,
-0x00,0x06,0xff,0x03,0x06,0x21,0x05,0x25,0x00,0x02,0x00,0x00,0x17,0x09,0x01,0x06,
-0x03,0x0d,0x03,0x0e,0xfc,0x06,0x20,0xf9,0xe0,0x00,0x00,0x02,0x00,0x06,0xff,0x03,
-0x06,0x21,0x05,0x25,0x00,0x02,0x00,0x05,0x00,0x00,0x17,0x21,0x09,0x03,0xb1,0x04,
-0xc5,0xfd,0x9d,0xfc,0xf3,0x03,0x0d,0x03,0x0e,0x8a,0x04,0xca,0xfa,0xc4,0x06,0x20,
-0xf9,0xe0,0x00,0x01,0x00,0x06,0x00,0x16,0x03,0xfe,0x04,0x12,0x00,0x02,0x00,0x00,
-0x37,0x09,0x01,0x06,0x01,0xfc,0x01,0xfc,0x16,0x03,0xfc,0xfc,0x04,0x00,0x00,0x02,
-0x00,0x06,0x00,0x16,0x03,0xfe,0x04,0x12,0x00,0x02,0x00,0x05,0x00,0x00,0x37,0x21,
-0x09,0x03,0xb1,0x02,0xa2,0xfe,0xaf,0xfe,0x04,0x01,0xfc,0x01,0xfc,0x88,0x02,0xa6,
-0xfc,0xe8,0x03,0xfc,0xfc,0x04,0x00,0x01,0x00,0x06,0xff,0x03,0x06,0x21,0x05,0x25,
-0x00,0x02,0x00,0x00,0x17,0x11,0x01,0x06,0x06,0x1b,0xfc,0x06,0x20,0xfc,0xf0,0x00,
-0x00,0x02,0x00,0x06,0xff,0x03,0x06,0x21,0x05,0x25,0x00,0x02,0x00,0x05,0x00,0x00,
-0x17,0x09,0x01,0x03,0x11,0x01,0x78,0x04,0xc5,0xfb,0x3b,0x72,0x06,0x1b,0x52,0x02,
-0x66,0x02,0x66,0xfa,0x8a,0x06,0x20,0xfc,0xf0,0x00,0x00,0x01,0x00,0x06,0x00,0x16,
-0x03,0xfe,0x04,0x12,0x00,0x02,0x00,0x00,0x37,0x11,0x01,0x06,0x03,0xf8,0x16,0x03,
-0xfc,0xfe,0x02,0x00,0x00,0x02,0x00,0x06,0x00,0x16,0x03,0xfe,0x04,0x12,0x00,0x02,
-0x00,0x05,0x00,0x00,0x37,0x09,0x01,0x03,0x11,0x01,0x78,0x02,0xa2,0xfd,0x5e,0x72,
-0x03,0xf8,0xc1,0x01,0x53,0x01,0x53,0xfc,0xaf,0x03,0xfc,0xfe,0x02,0x00,0x00,0x01,
-0x00,0x06,0x00,0x16,0x06,0x21,0x04,0x12,0x00,0x02,0x00,0x00,0x37,0x11,0x01,0x06,
-0x06,0x1b,0x16,0x03,0xfc,0xfe,0x02,0x00,0x00,0x02,0x00,0x06,0x00,0x16,0x06,0x21,
-0x04,0x12,0x00,0x02,0x00,0x05,0x00,0x00,0x37,0x09,0x01,0x03,0x11,0x01,0x78,0x04,
-0x8c,0xfb,0x74,0x72,0x06,0x1b,0xc1,0x01,0x53,0x01,0x53,0xfc,0xaf,0x03,0xfc,0xfe,
-0x02,0x00,0x00,0x01,0x00,0x06,0xff,0x03,0x06,0x21,0x05,0x25,0x00,0x02,0x00,0x00,
-0x13,0x21,0x01,0x06,0x06,0x1b,0xfc,0xf2,0x05,0x24,0xf9,0xe0,0x00,0x02,0x00,0x06,
-0xff,0x03,0x06,0x21,0x05,0x25,0x00,0x02,0x00,0x05,0x00,0x00,0x13,0x09,0x01,0x25,
-0x21,0x01,0xb1,0x02,0x62,0x02,0x63,0xfa,0x90,0x06,0x1b,0xfc,0xf2,0x04,0xb2,0xfb,
-0x36,0x04,0xca,0x72,0xf9,0xe0,0x00,0x01,0x00,0x06,0x00,0x16,0x03,0xfe,0x04,0x12,
-0x00,0x02,0x00,0x00,0x13,0x21,0x01,0x06,0x03,0xf8,0xfe,0x04,0x04,0x12,0xfc,0x04,
-0x00,0x02,0x00,0x06,0x00,0x16,0x03,0xfe,0x04,0x12,0x00,0x02,0x00,0x05,0x00,0x00,
-0x13,0x09,0x01,0x25,0x21,0x01,0xb1,0x01,0x51,0x01,0x51,0xfc,0xb3,0x03,0xf8,0xfe,
-0x04,0x03,0xa0,0xfd,0x5a,0x02,0xa6,0x72,0xfc,0x04,0x00,0x01,0x00,0x06,0xff,0x03,
-0x06,0x21,0x05,0x25,0x00,0x02,0x00,0x00,0x13,0x01,0x11,0x06,0x06,0x1b,0x02,0x14,
-0x03,0x10,0xf9,0xe0,0x00,0x02,0x00,0x06,0xff,0x03,0x06,0x21,0x05,0x25,0x00,0x02,
-0x00,0x05,0x00,0x00,0x13,0x01,0x11,0x09,0x01,0x11,0xea,0x04,0xc5,0xfa,0x57,0x06,
-0x1b,0x02,0x14,0xfd,0x9a,0x04,0xcc,0xfd,0x9a,0x03,0x10,0xf9,0xe0,0x00,0x00,0x01,
-0x00,0x06,0x00,0x16,0x03,0xfe,0x04,0x12,0x00,0x02,0x00,0x00,0x13,0x01,0x11,0x06,
-0x03,0xf8,0x02,0x14,0x01,0xfe,0xfc,0x04,0x00,0x02,0x00,0x06,0x00,0x16,0x03,0xfe,
-0x04,0x12,0x00,0x02,0x00,0x05,0x00,0x00,0x13,0x01,0x11,0x09,0x01,0x11,0xea,0x02,
-0xa2,0xfc,0x7a,0x03,0xf8,0x02,0x14,0xfe,0xad,0x02,0xa6,0xfe,0xad,0x01,0xfe,0xfc,
-0x04,0x00,0x00,0x01,0x00,0x06,0x00,0x16,0x06,0x21,0x04,0x12,0x00,0x02,0x00,0x00,
-0x13,0x01,0x11,0x06,0x06,0x1b,0x02,0x14,0x01,0xfe,0xfc,0x04,0x00,0x02,0x00,0x06,
-0x00,0x16,0x06,0x21,0x04,0x12,0x00,0x02,0x00,0x05,0x00,0x00,0x09,0x01,0x11,0x09,
-0x01,0x11,0x01,0x23,0x04,0x8c,0xfa,0x57,0x06,0x1b,0x02,0x14,0xfe,0xad,0x02,0xa6,
-0xfe,0xad,0x01,0xfe,0xfc,0x04,0x00,0x01,0x00,0x06,0xff,0x03,0x06,0x21,0x05,0x25,
-0x00,0x03,0x00,0x00,0x13,0x09,0x02,0x06,0x03,0x0d,0x03,0x0e,0xfc,0xf2,0x02,0x14,
-0x03,0x10,0xfc,0xf0,0xfc,0xf0,0x00,0x02,0x00,0x06,0xff,0x03,0x06,0x21,0x05,0x25,
-0x00,0x03,0x00,0x07,0x00,0x00,0x13,0x09,0x06,0x9e,0x02,0x75,0x02,0x76,0xfd,0x8a,
-0xfc,0xf3,0x03,0x0d,0x03,0x0e,0xfc,0xf2,0x02,0x14,0xfd,0x88,0x02,0x78,0x02,0x78,
-0xfd,0x88,0x03,0x10,0xfc,0xf0,0xfc,0xf0,0x00,0x03,0x00,0x06,0xff,0x03,0x06,0x21,
-0x05,0x25,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x00,0x09,0x0b,0x01,0x3e,0x01,0xd5,
-0x01,0xd5,0xfe,0x2b,0xfd,0x8b,0x02,0x75,0x02,0x76,0xfd,0x8a,0xfc,0xf3,0x03,0x0d,
-0x03,0x0e,0xfc,0xf2,0x02,0x14,0x01,0xd7,0xfe,0x29,0xfe,0x29,0x01,0xd7,0xfd,0x88,
-0x02,0x78,0x02,0x78,0xfd,0x88,0x03,0x10,0xfc,0xf0,0xfc,0xf0,0x00,0x03,0x00,0x70,
-0xfe,0xff,0x06,0x8b,0x05,0x29,0x00,0x0d,0x00,0x1b,0x00,0x29,0x00,0x00,0x24,0x10,
-0x37,0x36,0x33,0x32,0x17,0x16,0x10,0x07,0x06,0x23,0x22,0x27,0x00,0x10,0x05,0x16,
-0x33,0x32,0x37,0x24,0x10,0x25,0x26,0x23,0x22,0x07,0x00,0x10,0x25,0x36,0x33,0x32,
-0x17,0x04,0x10,0x05,0x06,0x23,0x22,0x27,0x01,0x82,0xfe,0x7e,0x7f,0x80,0x7e,0xfe,
-0xfe,0x7e,0x80,0x7f,0x7e,0xfe,0x65,0x01,0x4d,0xa5,0xa6,0xa7,0xa5,0x01,0x4d,0xfe,
-0xb3,0xa5,0xa7,0xa6,0xa5,0xfe,0x3e,0x01,0x87,0xc3,0xc3,0xc4,0xc3,0x01,0x87,0xfe,
-0x79,0xc3,0xc4,0xc3,0xc3,0xef,0x02,0x4a,0x92,0x4a,0x4a,0x92,0xfd,0xb6,0x92,0x4a,
-0x4a,0x03,0x36,0xfd,0x02,0xc0,0x60,0x60,0xc0,0x02,0xfe,0xc0,0x60,0x60,0xfb,0xff,
-0x03,0x84,0xe2,0x71,0x71,0xe2,0xfc,0x7c,0xe2,0x71,0x71,0x00,0x00,0x02,0x00,0x06,
-0xfe,0x23,0x03,0xee,0x06,0x75,0x00,0x03,0x00,0x07,0x00,0x22,0x40,0x11,0x02,0x06,
-0x00,0x08,0x04,0x06,0x08,0x06,0x04,0x03,0x02,0x01,0x00,0x06,0x05,0x07,0x08,0x10,
-0xd4,0xcc,0x17,0x39,0x31,0x00,0x10,0xd4,0xcc,0x11,0x39,0x12,0x39,0x30,0x09,0x07,
-0x01,0xfa,0xfe,0x7f,0x01,0x81,0x01,0x81,0xfe,0x7f,0x01,0xf4,0xfe,0x0c,0xfe,0x0c,
-0x05,0x81,0xfc,0xcf,0xfc,0xc7,0x03,0x39,0x04,0x25,0xfb,0xdb,0xfb,0xd3,0x04,0x2d,
-0x00,0x02,0x00,0x70,0xfe,0xff,0x06,0x8b,0x05,0x29,0x00,0x0d,0x00,0x1b,0x00,0x00,
-0x12,0x10,0x05,0x16,0x33,0x32,0x37,0x24,0x10,0x25,0x26,0x23,0x22,0x07,0x00,0x10,
-0x25,0x36,0x33,0x32,0x17,0x04,0x10,0x05,0x06,0x23,0x22,0x27,0xe5,0x01,0x4d,0xa5,
-0xa6,0xa7,0xa5,0x01,0x4d,0xfe,0xb3,0xa5,0xa7,0xa6,0xa5,0xfe,0x3e,0x01,0x87,0xc3,
-0xc3,0xc4,0xc3,0x01,0x87,0xfe,0x79,0xc3,0xc4,0xc3,0xc3,0x03,0x93,0xfd,0x02,0xc0,
-0x60,0x60,0xc0,0x02,0xfe,0xc0,0x60,0x60,0xfb,0xff,0x03,0x84,0xe2,0x71,0x71,0xe2,
-0xfc,0x7c,0xe2,0x71,0x71,0x00,0x00,0x08,0x00,0x72,0xff,0x01,0x06,0x89,0x05,0x27,
-0x00,0x09,0x00,0x13,0x00,0x1d,0x00,0x27,0x00,0x2f,0x00,0x37,0x00,0x3f,0x00,0x47,
-0x00,0x00,0x25,0x16,0x17,0x16,0x17,0x07,0x26,0x27,0x26,0x27,0x05,0x36,0x37,0x36,
-0x37,0x17,0x06,0x07,0x06,0x07,0x13,0x26,0x27,0x26,0x27,0x37,0x16,0x17,0x16,0x17,
-0x25,0x06,0x07,0x06,0x07,0x27,0x36,0x37,0x36,0x37,0x13,0x16,0x32,0x37,0x17,0x06,
-0x22,0x27,0x01,0x36,0x34,0x27,0x37,0x16,0x14,0x07,0x01,0x26,0x22,0x07,0x27,0x36,
-0x32,0x17,0x01,0x06,0x14,0x17,0x07,0x26,0x34,0x37,0x01,0x5c,0x2b,0x3b,0x2e,0x38,
-0x31,0x46,0x39,0x4b,0x35,0x03,0xda,0x38,0x2e,0x34,0x32,0x64,0x3b,0x45,0x39,0x47,
-0x9c,0x2c,0x3a,0x2e,0x38,0x30,0x47,0x39,0x4a,0x36,0xfc,0x26,0x38,0x2e,0x3b,0x2b,
-0x64,0x31,0x4f,0x39,0x46,0xed,0x4c,0x9a,0x4c,0x26,0x5f,0xc0,0x60,0x03,0x4a,0x10,
-0x10,0x6e,0x14,0x14,0xfd,0xa1,0x4c,0x9a,0x4c,0x27,0x60,0xc0,0x5f,0xfc,0xb8,0x10,
-0x10,0x6e,0x14,0x14,0x8f,0x3c,0x31,0x26,0x20,0x6a,0x28,0x30,0x3d,0x4a,0x75,0x20,
-0x26,0x2c,0x41,0x3d,0x4e,0x3a,0x30,0x28,0x04,0x27,0x3c,0x31,0x26,0x20,0x6a,0x28,
-0x30,0x3d,0x4a,0x75,0x20,0x26,0x31,0x3c,0x3e,0x45,0x42,0x30,0x28,0xfa,0xd4,0x16,
-0x16,0x6e,0x1b,0x1b,0x02,0x5f,0x49,0xa0,0x49,0x27,0x5b,0xca,0x5b,0x03,0x4a,0x16,
-0x16,0x6e,0x1b,0x1b,0xfd,0xa1,0x49,0xa0,0x49,0x27,0x5b,0xca,0x5b,0x00,0x00,0x06,
-0x00,0x70,0xfe,0xff,0x06,0x8b,0x05,0x29,0x00,0x0d,0x00,0x17,0x00,0x1b,0x00,0x25,
-0x00,0x2f,0x00,0x33,0x00,0x00,0x36,0x10,0x25,0x36,0x33,0x32,0x17,0x04,0x10,0x05,
-0x06,0x23,0x22,0x27,0x13,0x11,0x16,0x17,0x16,0x17,0x11,0x06,0x07,0x06,0x07,0x06,
-0x10,0x17,0x01,0x11,0x16,0x33,0x32,0x37,0x11,0x26,0x23,0x22,0x17,0x11,0x36,0x37,
-0x36,0x37,0x11,0x26,0x27,0x26,0x17,0x11,0x36,0x10,0x70,0x01,0x87,0xc3,0xc3,0xc4,
-0xc3,0x01,0x87,0xfe,0x79,0xc3,0xc4,0xc3,0xc3,0x0b,0x17,0x19,0x41,0x41,0x41,0x41,
-0x19,0x89,0xab,0xab,0x01,0x96,0x2c,0x2b,0x2d,0x2c,0x2c,0x2d,0x2b,0xf6,0x41,0x40,
-0x1a,0x17,0x17,0x1a,0x40,0xe3,0xaa,0x52,0x03,0x84,0xe2,0x71,0x71,0xe2,0xfc,0x7c,
-0xe2,0x71,0x71,0x04,0xc5,0xfb,0xbe,0x0f,0x0f,0x25,0x17,0x04,0xf6,0x17,0x25,0x0f,
-0x6d,0xb1,0xfd,0xdc,0xb1,0x04,0x5b,0xfa,0xd0,0x07,0x07,0x05,0x30,0x07,0x24,0xfb,
-0x0a,0x17,0x25,0x0f,0x10,0x04,0x40,0x10,0x0f,0x25,0xa2,0xfc,0x7c,0xb1,0x02,0x22,
-0x00,0x04,0x00,0x70,0xfe,0xff,0x06,0x8b,0x05,0x29,0x00,0x0d,0x00,0x1b,0x00,0x29,
-0x00,0x37,0x00,0x00,0x00,0x10,0x17,0x16,0x33,0x32,0x37,0x36,0x10,0x27,0x26,0x23,
-0x22,0x07,0x02,0x10,0x37,0x36,0x33,0x32,0x17,0x16,0x10,0x07,0x06,0x23,0x22,0x27,
-0x00,0x10,0x05,0x16,0x33,0x32,0x37,0x24,0x10,0x25,0x26,0x23,0x22,0x07,0x00,0x10,
-0x25,0x36,0x33,0x32,0x17,0x04,0x10,0x05,0x06,0x23,0x22,0x27,0x02,0x99,0x72,0x39,
-0x39,0x3a,0x39,0x72,0x72,0x39,0x3a,0x39,0x39,0xed,0xb0,0x58,0x57,0x58,0x58,0xb0,
-0xb0,0x58,0x58,0x57,0x58,0xfe,0x17,0x01,0x4d,0xa5,0xa6,0xa7,0xa5,0x01,0x4d,0xfe,
-0xb3,0xa5,0xa7,0xa6,0xa5,0xfe,0x3e,0x01,0x87,0xc3,0xc3,0xc4,0xc3,0x01,0x87,0xfe,
-0x79,0xc3,0xc4,0xc3,0xc3,0x02,0x98,0xfe,0xf8,0x42,0x21,0x21,0x42,0x01,0x08,0x42,
-0x21,0x21,0xfe,0x6f,0x01,0x96,0x65,0x33,0x33,0x65,0xfe,0x6a,0x65,0x33,0x33,0x02,
-0xaf,0xfd,0x02,0xc0,0x60,0x60,0xc0,0x02,0xfe,0xc0,0x60,0x60,0xfb,0xff,0x03,0x84,
-0xe2,0x71,0x71,0xe2,0xfc,0x7c,0xe2,0x71,0x71,0x00,0x00,0x01,0x00,0x70,0xff,0x04,
-0x06,0x8b,0x05,0x20,0x00,0x17,0x00,0x13,0x40,0x07,0x06,0x12,0x18,0x19,0x0c,0x00,
-0x18,0x10,0xdc,0xd4,0xcc,0x31,0x00,0x10,0xd4,0xc4,0x30,0x13,0x34,0x37,0x36,0x37,
-0x36,0x33,0x32,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x23,0x22,0x27,
-0x26,0x27,0x26,0x70,0x69,0x68,0xb6,0xb5,0xd2,0xd1,0xb5,0xb6,0x68,0x69,0x69,0x68,
-0xb6,0xb5,0xd1,0xd2,0xb5,0xb6,0x68,0x69,0x02,0x12,0xd1,0xb6,0xb5,0x69,0x69,0x69,
-0x69,0xb5,0xb6,0xd1,0xd1,0xb6,0xb5,0x69,0x69,0x69,0x69,0xb5,0xb6,0x00,0x00,0x02,
-0x00,0x70,0xff,0x04,0x06,0x8b,0x05,0x20,0x00,0x0b,0x00,0x13,0x00,0x00,0x12,0x10,
-0x12,0x24,0x20,0x04,0x12,0x10,0x02,0x04,0x20,0x24,0x05,0x32,0x37,0x24,0x10,0x25,
-0x26,0x23,0x70,0xd1,0x01,0x6b,0x01,0xa3,0x01,0x6b,0xd1,0xd1,0xfe,0x95,0xfe,0x5d,
-0xfe,0x95,0x02,0x3c,0xa7,0xa5,0x01,0x4d,0xfe,0xb3,0xa5,0xa7,0x01,0x41,0x01,0xa2,
-0x01,0x6b,0xd2,0xd2,0xfe,0x95,0xfe,0x5e,0xfe,0x95,0xd2,0xd2,0x61,0x60,0xc0,0x02,
-0xfe,0xc0,0x60,0x00,0x00,0x02,0x00,0x70,0xff,0x04,0x06,0x8b,0x05,0x20,0x00,0x0b,
-0x00,0x13,0x00,0x00,0x12,0x10,0x12,0x24,0x20,0x04,0x12,0x10,0x02,0x04,0x20,0x24,
-0x01,0x22,0x07,0x04,0x10,0x05,0x16,0x33,0x70,0xd1,0x01,0x6b,0x01,0xa3,0x01,0x6b,
-0xd1,0xd1,0xfe,0x95,0xfe,0x5d,0xfe,0x95,0x02,0x3c,0xa6,0xa5,0xfe,0xb3,0x01,0x4d,
-0xa5,0xa6,0x01,0x41,0x01,0xa2,0x01,0x6b,0xd2,0xd2,0xfe,0x95,0xfe,0x5e,0xfe,0x95,
-0xd2,0xd2,0x04,0xdd,0x60,0xc0,0xfd,0x02,0xc0,0x60,0x00,0x02,0x00,0x70,0xff,0x04,
-0x06,0x8b,0x05,0x20,0x00,0x0b,0x00,0x14,0x00,0x00,0x12,0x10,0x12,0x24,0x20,0x04,
-0x12,0x10,0x02,0x04,0x20,0x24,0x03,0x10,0x05,0x16,0x33,0x32,0x37,0x24,0x11,0x70,
-0xd1,0x01,0x6b,0x01,0xa3,0x01,0x6b,0xd1,0xd1,0xfe,0x95,0xfe,0x5d,0xfe,0x95,0x5c,
-0x01,0x4d,0xa5,0xa6,0xa7,0xa5,0x01,0x4d,0x01,0x41,0x01,0xa2,0x01,0x6b,0xd2,0xd2,
-0xfe,0x95,0xfe,0x5e,0xfe,0x95,0xd2,0xd2,0x02,0x3e,0xfe,0x81,0xc0,0x60,0x60,0xc0,
-0x01,0x7f,0x00,0x02,0x00,0x70,0xff,0x04,0x06,0x8b,0x05,0x20,0x00,0x0b,0x00,0x14,
-0x00,0x00,0x12,0x10,0x12,0x24,0x20,0x04,0x12,0x10,0x02,0x04,0x20,0x24,0x01,0x10,
-0x25,0x26,0x23,0x22,0x07,0x04,0x11,0x70,0xd1,0x01,0x6b,0x01,0xa3,0x01,0x6b,0xd1,
-0xd1,0xfe,0x95,0xfe,0x5d,0xfe,0x95,0x04,0xd5,0xfe,0xb3,0xa5,0xa7,0xa6,0xa5,0xfe,
-0xb3,0x01,0x41,0x01,0xa2,0x01,0x6b,0xd2,0xd2,0xfe,0x95,0xfe,0x5e,0xfe,0x95,0xd2,
-0xd2,0x02,0x3e,0x01,0x7f,0xc0,0x60,0x60,0xc0,0xfe,0x81,0x00,0x00,0x02,0x00,0x70,
-0xff,0x04,0x06,0x8b,0x05,0x20,0x00,0x0b,0x00,0x18,0x00,0x00,0x12,0x10,0x12,0x24,
-0x20,0x04,0x12,0x10,0x02,0x04,0x20,0x24,0x01,0x22,0x07,0x04,0x10,0x05,0x16,0x33,
-0x32,0x37,0x24,0x11,0x21,0x70,0xd1,0x01,0x6b,0x01,0xa3,0x01,0x6b,0xd1,0xd1,0xfe,
-0x95,0xfe,0x5d,0xfe,0x95,0x02,0x3c,0xa6,0xa5,0xfe,0xb3,0x01,0x4d,0xa5,0xa6,0xa7,
-0xa5,0x01,0x4d,0xfd,0x67,0x01,0x41,0x01,0xa2,0x01,0x6b,0xd2,0xd2,0xfe,0x95,0xfe,
-0x5e,0xfe,0x95,0xd2,0xd2,0x04,0xdd,0x60,0xc0,0xfd,0x02,0xc0,0x60,0x60,0xc0,0x01,
-0x7f,0x00,0x00,0x02,0x00,0x70,0xff,0x04,0x06,0x8b,0x05,0x20,0x00,0x0b,0x00,0x11,
-0x00,0x00,0x12,0x10,0x12,0x24,0x20,0x04,0x12,0x10,0x02,0x04,0x20,0x24,0x01,0x22,
-0x07,0x04,0x11,0x21,0x70,0xd1,0x01,0x6b,0x01,0xa3,0x01,0x6b,0xd1,0xd1,0xfe,0x95,
-0xfe,0x5d,0xfe,0x95,0x02,0x3c,0xa6,0xa5,0xfe,0xb3,0x02,0x98,0x01,0x41,0x01,0xa2,
-0x01,0x6b,0xd2,0xd2,0xfe,0x95,0xfe,0x5e,0xfe,0x95,0xd2,0xd2,0x04,0xdd,0x60,0xc0,
-0xfe,0x81,0x00,0x01,0x00,0x70,0xfe,0xff,0x03,0x7d,0x05,0x29,0x00,0x07,0x00,0x00,
-0x36,0x10,0x25,0x36,0x33,0x11,0x22,0x27,0x70,0x01,0x87,0xc3,0xc3,0xc3,0xc3,0x52,
-0x03,0x84,0xe2,0x71,0xf9,0xd6,0x71,0x00,0x00,0x01,0x00,0xba,0xfe,0xff,0x03,0xc7,
-0x05,0x29,0x00,0x07,0x00,0x00,0x00,0x10,0x05,0x06,0x23,0x11,0x32,0x17,0x03,0xc7,
-0xfe,0x79,0xc3,0xc3,0xc3,0xc3,0x03,0xd6,0xfc,0x7c,0xe2,0x71,0x06,0x2a,0x71,0x00,
-0x00,0x02,0x00,0xba,0xff,0xec,0x05,0x9a,0x06,0x28,0x00,0x0a,0x00,0x0e,0x00,0x00,
-0x01,0x14,0x16,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x01,0x11,0x21,0x11,0x02,
-0x01,0xac,0xfa,0xac,0xab,0x7c,0x7e,0xad,0xfe,0xb9,0x04,0xe0,0x02,0xfa,0x7d,0xac,
-0xac,0x7d,0x7c,0xab,0xab,0xfc,0x76,0x06,0x3c,0xf9,0xc4,0x00,0x00,0x03,0x00,0xba,
-0xfe,0x00,0x07,0x09,0x06,0x28,0x00,0x0d,0x00,0x1b,0x00,0x1f,0x00,0x00,0x00,0x10,
-0x05,0x16,0x33,0x32,0x37,0x24,0x10,0x25,0x26,0x23,0x22,0x07,0x04,0x10,0x05,0x16,
-0x33,0x32,0x37,0x24,0x10,0x25,0x26,0x23,0x22,0x07,0x01,0x11,0x21,0x11,0x01,0x49,
-0x01,0x4d,0xa5,0xa6,0xa7,0xa5,0x01,0x4d,0xfe,0xb3,0xa5,0xa7,0xa6,0xa5,0xfe,0x3e,
-0x01,0x87,0xc3,0xc3,0xc4,0xc3,0x01,0x87,0xfe,0x79,0xc3,0xc4,0xc3,0xc3,0xfe,0x5f,
-0x06,0x4f,0x03,0x93,0xfd,0x02,0xc0,0x60,0x60,0xc0,0x02,0xfe,0xc0,0x60,0x60,0x7d,
-0xfc,0x7c,0xe2,0x71,0x71,0xe2,0x03,0x84,0xe2,0x71,0x71,0xf9,0x48,0x08,0x28,0xf7,
-0xd8,0x00,0x00,0x02,0x00,0xba,0x02,0x14,0x07,0x09,0x06,0x28,0x00,0x0c,0x00,0x15,
-0x00,0x00,0x13,0x11,0x21,0x11,0x23,0x10,0x25,0x26,0x23,0x22,0x07,0x04,0x11,0x29,
-0x01,0x10,0x25,0x36,0x33,0x32,0x17,0x04,0xba,0x06,0x4f,0x1a,0xfe,0x79,0xc3,0xc4,
-0xc3,0xc3,0xfe,0x79,0x05,0xa6,0xfa,0xcf,0x01,0x4d,0xa6,0xa5,0xa6,0xa6,0x01,0x4d,
-0x02,0x14,0x04,0x14,0xfb,0xec,0x01,0xc2,0xe2,0x71,0x71,0xe2,0xfe,0x3e,0x01,0x7e,
-0xc1,0x60,0x60,0xc1,0x00,0x02,0x00,0xba,0xfe,0x00,0x07,0x09,0x02,0x14,0x00,0x0c,
-0x00,0x15,0x00,0x00,0x13,0x11,0x33,0x10,0x05,0x16,0x33,0x32,0x37,0x24,0x11,0x33,
-0x11,0x01,0x21,0x10,0x05,0x06,0x23,0x22,0x27,0x24,0xba,0x1a,0x01,0x87,0xc3,0xc3,
-0xc4,0xc3,0x01,0x87,0x1a,0xfa,0x40,0x05,0x31,0xfe,0xb3,0xa6,0xa6,0xa5,0xa6,0xfe,
-0xb3,0xfe,0x00,0x04,0x14,0xfe,0x3e,0xe2,0x71,0x71,0xe2,0x01,0xc2,0xfb,0xec,0x04,
-0x14,0xfe,0x82,0xc1,0x60,0x60,0xc1,0x00,0x00,0x01,0x00,0x06,0x02,0x14,0x03,0x14,
-0x05,0x29,0x00,0x09,0x00,0x00,0x13,0x10,0x25,0x36,0x33,0x15,0x22,0x07,0x04,0x11,
-0x06,0x01,0x87,0xc3,0xc3,0xa6,0xa5,0xfe,0xb3,0x02,0x14,0x01,0xc2,0xe2,0x71,0x76,
-0x60,0xc0,0xfe,0x81,0x00,0x01,0x00,0x06,0x02,0x14,0x03,0x13,0x05,0x29,0x00,0x09,
-0x00,0x00,0x13,0x32,0x17,0x04,0x11,0x23,0x10,0x25,0x26,0x23,0x06,0xc3,0xc3,0x01,
-0x87,0x75,0xfe,0xb3,0xa5,0xa6,0x05,0x29,0x71,0xe2,0xfe,0x3e,0x01,0x7f,0xc0,0x60,
-0x00,0x01,0x00,0x06,0xfe,0xff,0x03,0x13,0x02,0x14,0x00,0x09,0x00,0x00,0x13,0x35,
-0x32,0x37,0x24,0x11,0x33,0x10,0x05,0x06,0x06,0xa6,0xa5,0x01,0x4d,0x75,0xfe,0x79,
-0xc3,0xfe,0xff,0x76,0x60,0xc0,0x01,0x7f,0xfe,0x3e,0xe2,0x71,0x00,0x01,0x00,0x06,
-0xfe,0xff,0x03,0x14,0x02,0x14,0x00,0x09,0x00,0x00,0x01,0x22,0x27,0x24,0x11,0x33,
-0x10,0x05,0x16,0x33,0x03,0x13,0xc3,0xc3,0xfe,0x79,0x75,0x01,0x4d,0xa5,0xa6,0xfe,
-0xff,0x71,0xe2,0x01,0xc2,0xfe,0x81,0xc0,0x60,0x00,0x00,0x01,0x00,0x70,0x02,0x14,
-0x06,0x8b,0x05,0x29,0x00,0x11,0x00,0x00,0x13,0x10,0x25,0x36,0x33,0x32,0x17,0x04,
-0x11,0x23,0x10,0x25,0x26,0x23,0x22,0x07,0x04,0x11,0x70,0x01,0x87,0xc3,0xc3,0xc4,
-0xc3,0x01,0x87,0x75,0xfe,0xb3,0xa5,0xa7,0xa6,0xa5,0xfe,0xb3,0x02,0x14,0x01,0xc2,
-0xe2,0x71,0x71,0xe2,0xfe,0x3e,0x01,0x7f,0xc0,0x60,0x60,0xc0,0xfe,0x81,0x00,0x01,
-0x00,0x70,0xfe,0xff,0x06,0x8b,0x02,0x14,0x00,0x11,0x00,0x00,0x13,0x33,0x10,0x05,
-0x16,0x33,0x32,0x37,0x24,0x11,0x33,0x10,0x05,0x06,0x23,0x22,0x27,0x24,0x70,0x75,
-0x01,0x4d,0xa5,0xa6,0xa7,0xa5,0x01,0x4d,0x75,0xfe,0x79,0xc3,0xc4,0xc3,0xc3,0xfe,
-0x79,0x02,0x14,0xfe,0x81,0xc0,0x60,0x60,0xc0,0x01,0x7f,0xfe,0x3e,0xe2,0x71,0x71,
-0xe2,0x00,0x00,0x01,0x00,0x06,0xff,0x03,0x06,0x21,0x05,0x25,0x00,0x02,0x00,0x00,
-0x17,0x01,0x11,0x06,0x06,0x1b,0xfc,0x06,0x20,0xf9,0xe0,0x00,0x00,0x01,0x00,0x06,
-0xff,0x03,0x06,0x21,0x05,0x25,0x00,0x02,0x00,0x00,0x17,0x11,0x01,0x06,0x06,0x1b,
-0xfc,0x06,0x20,0xf9,0xe0,0x00,0x00,0x01,0x00,0x06,0xff,0x03,0x06,0x21,0x05,0x25,
-0x00,0x02,0x00,0x00,0x17,0x11,0x21,0x06,0x06,0x1b,0xfc,0x06,0x20,0x00,0x00,0x01,
-0x00,0x06,0xff,0x03,0x06,0x21,0x05,0x25,0x00,0x02,0x00,0x00,0x13,0x21,0x11,0x06,
-0x06,0x1b,0x05,0x24,0xf9,0xe0,0x00,0x02,0x01,0x33,0x01,0xd1,0x03,0x85,0x04,0x21,
-0x00,0x0a,0x00,0x15,0x00,0x00,0x01,0x14,0x16,0x32,0x36,0x35,0x34,0x26,0x23,0x22,
-0x06,0x07,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x22,0x26,0x01,0x6e,0x8a,0xc8,
-0x8a,0x89,0x63,0x65,0x8b,0x3b,0xad,0x7e,0x7c,0xab,0xac,0xfa,0xac,0x02,0xfa,0x64,
-0x8a,0x8a,0x64,0x63,0x89,0x89,0x63,0x7c,0xab,0xab,0x7c,0x7d,0xac,0xac,0x00,0x02,
-0x00,0xba,0xff,0x03,0x06,0xd5,0x05,0x25,0x00,0x03,0x00,0x07,0x00,0x00,0x17,0x11,
-0x21,0x11,0x25,0x21,0x11,0x21,0xba,0x06,0x1b,0xfc,0xf2,0x02,0x9c,0xfd,0x64,0xfc,
-0x06,0x20,0xf9,0xe0,0x72,0x05,0x3c,0x00,0x00,0x02,0x00,0xba,0xff,0x03,0x06,0xd5,
-0x05,0x25,0x00,0x03,0x00,0x07,0x00,0x00,0x17,0x11,0x21,0x11,0x25,0x21,0x11,0x21,
-0xba,0x06,0x1b,0xfa,0x57,0x02,0x9b,0xfd,0x65,0xfc,0x06,0x20,0xf9,0xe0,0x72,0x05,
-0x3c,0x00,0x00,0x02,0x00,0xba,0xff,0x03,0x06,0xd5,0x05,0x25,0x00,0x03,0x00,0x06,
-0x00,0x00,0x17,0x11,0x21,0x11,0x25,0x21,0x11,0xba,0x06,0x1b,0xfa,0x57,0x05,0x37,
-0xfc,0x06,0x20,0xf9,0xe0,0x72,0x05,0x3c,0x00,0x02,0x00,0xba,0xff,0x03,0x06,0xd5,
-0x05,0x25,0x00,0x03,0x00,0x06,0x00,0x00,0x17,0x11,0x21,0x11,0x25,0x01,0x21,0xba,
-0x06,0x1b,0xfa,0x57,0x05,0x37,0xfa,0xc9,0xfc,0x06,0x20,0xf9,0xe0,0x72,0x05,0x3c,
-0x00,0x03,0x00,0xba,0xff,0x03,0x06,0xd5,0x05,0x25,0x00,0x03,0x00,0x07,0x00,0x0b,
-0x00,0x00,0x17,0x11,0x21,0x11,0x25,0x21,0x11,0x21,0x01,0x21,0x11,0x21,0xba,0x06,
-0x1b,0xfd,0x2b,0x02,0x63,0xfd,0x9d,0xfd,0x2c,0x02,0x62,0xfd,0x9e,0xfc,0x06,0x20,
-0xf9,0xe0,0x72,0x05,0x3c,0xfa,0xc4,0x05,0x3c,0x00,0x00,0x03,0x00,0x06,0xff,0x03,
-0x06,0x21,0x05,0x25,0x00,0x0a,0x00,0x0d,0x00,0x10,0x00,0x00,0x01,0x34,0x36,0x33,
-0x32,0x16,0x15,0x14,0x06,0x22,0x26,0x01,0x21,0x09,0x03,0x02,0x7f,0x57,0x3e,0x3e,
-0x56,0x56,0x7d,0x56,0xfe,0x32,0x04,0xc5,0xfd,0x9d,0xfc,0xf3,0x03,0x0d,0x03,0x0e,
-0x01,0x6a,0x3e,0x56,0x56,0x3e,0x3e,0x56,0x56,0xfe,0x4a,0x04,0xca,0xfa,0xc4,0x06,
-0x20,0xf9,0xe0,0x00,0x00,0x02,0x00,0x06,0xff,0x03,0x06,0x21,0x05,0x25,0x00,0x02,
-0x00,0x05,0x00,0x00,0x05,0x21,0x09,0x03,0x03,0x13,0x02,0x63,0xfd,0x9d,0xfc,0xf3,
-0x03,0x0d,0x03,0x0e,0x8a,0x04,0xca,0xfa,0xc4,0x06,0x20,0xf9,0xe0,0x00,0x00,0x02,
-0x00,0x06,0xff,0x03,0x06,0x21,0x05,0x25,0x00,0x02,0x00,0x05,0x00,0x00,0x17,0x21,
-0x11,0x09,0x02,0xb1,0x02,0x62,0xfc,0xf3,0x03,0x0d,0x03,0x0e,0x8a,0x04,0xca,0xfa,
-0xc4,0x06,0x20,0xf9,0xe0,0x00,0x00,0x02,0x00,0x70,0xfe,0x00,0x08,0x84,0x06,0x28,
-0x00,0x0b,0x00,0x17,0x00,0x00,0x12,0x10,0x01,0x16,0x20,0x37,0x00,0x10,0x01,0x26,
-0x20,0x07,0x00,0x10,0x01,0x24,0x20,0x05,0x00,0x10,0x01,0x04,0x20,0x25,0xf1,0x01,
-0xc5,0xe2,0x01,0xc4,0xe2,0x01,0xc5,0xfe,0x3b,0xe2,0xfe,0x3c,0xe2,0xfd,0xba,0x02,
-0x05,0x01,0x03,0x02,0x04,0x01,0x03,0x02,0x05,0xfd,0xfb,0xfe,0xfd,0xfd,0xfc,0xfe,
-0xfd,0x04,0x1e,0xfb,0xec,0xfe,0xfb,0x83,0x83,0x01,0x05,0x04,0x14,0x01,0x05,0x83,
-0x83,0xfa,0x9d,0x04,0xa8,0x01,0x2a,0x96,0x96,0xfe,0xd6,0xfb,0x58,0xfe,0xd6,0x96,
-0x96,0x00,0x00,0x03,0x00,0xba,0xff,0x03,0x06,0xd5,0x05,0x25,0x00,0x05,0x00,0x09,
-0x00,0x0d,0x00,0x00,0x05,0x21,0x11,0x21,0x11,0x21,0x03,0x11,0x21,0x11,0x01,0x21,
-0x11,0x21,0x01,0x2c,0x05,0x37,0xfd,0x9d,0xfd,0x2c,0x72,0x06,0x1b,0xfa,0x57,0x02,
-0x62,0xfd,0x9e,0x8a,0x05,0x3c,0xfd,0x29,0xfd,0x29,0x06,0x20,0xf9,0xe0,0x03,0x49,
-0x02,0x65,0x00,0x03,0x00,0xba,0xff,0x03,0x06,0xd5,0x05,0x25,0x00,0x05,0x00,0x09,
-0x00,0x0d,0x00,0x00,0x01,0x21,0x11,0x21,0x11,0x21,0x03,0x11,0x21,0x11,0x25,0x21,
-0x11,0x21,0x01,0x2c,0x02,0xd4,0x02,0x63,0xfa,0xc9,0x72,0x06,0x1b,0xfa,0x57,0x02,
-0x62,0xfd,0x9e,0x02,0x4d,0xfd,0x29,0x05,0x3c,0xfa,0x52,0x06,0x20,0xf9,0xe0,0x72,
-0x02,0x65,0x00,0x03,0x00,0xba,0xff,0x03,0x06,0xd5,0x05,0x25,0x00,0x05,0x00,0x09,
-0x00,0x0d,0x00,0x00,0x05,0x21,0x11,0x21,0x11,0x21,0x03,0x11,0x21,0x11,0x25,0x21,
-0x11,0x21,0x01,0x2c,0x02,0x62,0x02,0xd5,0xfa,0xc9,0x72,0x06,0x1b,0xfd,0x2b,0x02,
-0x63,0xfd,0x9d,0x8a,0x02,0xd7,0x02,0x65,0xfa,0x52,0x06,0x20,0xf9,0xe0,0x72,0x02,
-0x65,0x00,0x00,0x03,0x00,0xba,0xff,0x03,0x06,0xd5,0x05,0x25,0x00,0x05,0x00,0x09,
-0x00,0x0d,0x00,0x00,0x05,0x21,0x11,0x21,0x11,0x21,0x03,0x11,0x21,0x11,0x01,0x21,
-0x11,0x21,0x01,0x2c,0x05,0x37,0xfd,0x2b,0xfd,0x9e,0x72,0x06,0x1b,0xfd,0x2b,0x02,
-0x63,0xfd,0x9d,0x8a,0x02,0x65,0x02,0xd7,0xfa,0x52,0x06,0x20,0xf9,0xe0,0x03,0x49,
-0x02,0x65,0x00,0x03,0x00,0x70,0xff,0x04,0x06,0x8b,0x05,0x20,0x00,0x0b,0x00,0x11,
-0x00,0x1e,0x00,0x00,0x12,0x10,0x12,0x24,0x20,0x04,0x12,0x10,0x02,0x04,0x20,0x24,
-0x01,0x06,0x07,0x04,0x03,0x21,0x05,0x12,0x05,0x16,0x33,0x32,0x37,0x24,0x10,0x25,
-0x26,0x27,0x11,0x70,0xd1,0x01,0x6b,0x01,0xa3,0x01,0x6b,0xd1,0xd1,0xfe,0x95,0xfe,
-0x5d,0xfe,0x95,0x02,0x03,0x89,0x89,0xfe,0xcc,0x17,0x02,0x5d,0xfd,0xa3,0x17,0x01,
-0x34,0xa6,0xa5,0xa6,0xa6,0x01,0x4d,0xfe,0xb3,0x89,0x8a,0x01,0x41,0x01,0xa2,0x01,
-0x6b,0xd2,0xd2,0xfe,0x95,0xfe,0x5e,0xfe,0x95,0xd2,0xd2,0x04,0xda,0x0e,0x4f,0xb2,
-0xfe,0xac,0x72,0xfe,0xac,0xb2,0x60,0x60,0xc1,0x02,0xfc,0xc1,0x4f,0x0e,0xfd,0x2b,
-0x00,0x03,0x00,0x70,0xff,0x04,0x06,0x8b,0x05,0x20,0x00,0x0b,0x00,0x18,0x00,0x1e,
-0x00,0x00,0x12,0x10,0x12,0x24,0x20,0x04,0x12,0x10,0x02,0x04,0x20,0x24,0x05,0x36,
-0x37,0x24,0x10,0x25,0x26,0x23,0x22,0x07,0x04,0x03,0x21,0x05,0x12,0x05,0x16,0x17,
-0x11,0x70,0xd1,0x01,0x6b,0x01,0xa3,0x01,0x6b,0xd1,0xd1,0xfe,0x95,0xfe,0x5d,0xfe,
-0x95,0x02,0x75,0x8a,0x89,0x01,0x4d,0xfe,0xb3,0xa6,0xa6,0xa5,0xa6,0xfe,0xcc,0x17,
-0x02,0xcf,0xfd,0x31,0x17,0x01,0x34,0x89,0x89,0x01,0x41,0x01,0xa2,0x01,0x6b,0xd2,
-0xd2,0xfe,0x95,0xfe,0x5e,0xfe,0x95,0xd2,0xd2,0x5e,0x0e,0x4f,0xc1,0x02,0xfc,0xc1,
-0x60,0x60,0xb2,0xfe,0xac,0x72,0xfe,0xac,0xb2,0x4f,0x0e,0x02,0x63,0x00,0x00,0x03,
-0x00,0x70,0xff,0x04,0x06,0x8b,0x05,0x20,0x00,0x0b,0x00,0x18,0x00,0x1e,0x00,0x00,
-0x12,0x10,0x12,0x24,0x20,0x04,0x12,0x10,0x02,0x04,0x20,0x24,0x02,0x10,0x05,0x16,
-0x17,0x11,0x21,0x02,0x25,0x26,0x23,0x22,0x07,0x01,0x36,0x37,0x24,0x13,0x21,0x70,
-0xd1,0x01,0x6b,0x01,0xa3,0x01,0x6b,0xd1,0xd1,0xfe,0x95,0xfe,0x5d,0xfe,0x95,0x5c,
-0x01,0x4d,0x89,0x89,0x02,0xd0,0x17,0xfe,0xcc,0xa6,0xa6,0xa5,0xa6,0x01,0x84,0x8a,
-0x89,0x01,0x34,0x17,0xfd,0xa2,0x01,0x41,0x01,0xa2,0x01,0x6b,0xd2,0xd2,0xfe,0x95,
-0xfe,0x5e,0xfe,0x95,0xd2,0xd2,0x03,0xbc,0xfd,0x04,0xc1,0x4f,0x0e,0x02,0xd5,0x01,
-0x54,0xb2,0x60,0x60,0xfb,0x25,0x0e,0x4f,0xb2,0x01,0x54,0x00,0x00,0x03,0x00,0x70,
-0xff,0x04,0x06,0x8b,0x05,0x20,0x00,0x0b,0x00,0x18,0x00,0x1e,0x00,0x00,0x12,0x10,
-0x12,0x24,0x20,0x04,0x12,0x10,0x02,0x04,0x20,0x24,0x02,0x10,0x05,0x16,0x33,0x32,
-0x37,0x24,0x13,0x21,0x11,0x06,0x07,0x01,0x02,0x25,0x26,0x27,0x11,0x70,0xd1,0x01,
-0x6b,0x01,0xa3,0x01,0x6b,0xd1,0xd1,0xfe,0x95,0xfe,0x5d,0xfe,0x95,0x5c,0x01,0x4d,
-0xa6,0xa5,0xa6,0xa6,0x01,0x34,0x17,0xfd,0x30,0x89,0x89,0x03,0xe2,0x17,0xfe,0xcc,
-0x89,0x8a,0x01,0x41,0x01,0xa2,0x01,0x6b,0xd2,0xd2,0xfe,0x95,0xfe,0x5e,0xfe,0x95,
-0xd2,0xd2,0x03,0xbc,0xfd,0x04,0xc1,0x60,0x60,0xb2,0x01,0x54,0x02,0xd5,0x0e,0x4f,
-0xfd,0xfa,0x01,0x54,0xb2,0x4f,0x0e,0xfd,0x9d,0x00,0x00,0x02,0x00,0x06,0xff,0x03,
-0x06,0x21,0x05,0x25,0x00,0x02,0x00,0x05,0x00,0x00,0x37,0x01,0x21,0x03,0x11,0x21,
-0x78,0x04,0x8c,0xfb,0x74,0x72,0x06,0x1b,0x20,0x04,0x92,0xfa,0x52,0x06,0x20,0x00,
-0x00,0x02,0x00,0x06,0xff,0x03,0x06,0x21,0x05,0x25,0x00,0x02,0x00,0x05,0x00,0x00,
-0x09,0x01,0x11,0x25,0x21,0x11,0x01,0x23,0x04,0x8c,0xfa,0x57,0x06,0x1b,0x04,0xb2,
-0xfb,0x6e,0x04,0x92,0x72,0xf9,0xe0,0x00,0x00,0x02,0x00,0x06,0xff,0x03,0x06,0x21,
-0x05,0x25,0x00,0x02,0x00,0x05,0x00,0x00,0x17,0x21,0x01,0x03,0x11,0x01,0x78,0x04,
-0x8c,0xfb,0x74,0x72,0x06,0x1b,0x8a,0x04,0x92,0xfa,0xfc,0x06,0x20,0xf9,0xe0,0x00,
-0x00,0x02,0x00,0xba,0xff,0x79,0x05,0xea,0x04,0xaf,0x00,0x03,0x00,0x07,0x00,0x00,
-0x05,0x21,0x11,0x21,0x03,0x11,0x21,0x11,0x01,0x2c,0x04,0x4c,0xfb,0xb4,0x72,0x05,
-0x30,0x15,0x04,0x52,0xfb,0x3c,0x05,0x36,0xfa,0xca,0x00,0x01,0x00,0xba,0xff,0x79,
-0x05,0xea,0x04,0xaf,0x00,0x03,0x00,0x00,0x17,0x11,0x21,0x11,0xba,0x05,0x30,0x87,
-0x05,0x36,0xfa,0xca,0x00,0x02,0x00,0xba,0xff,0xdd,0x05,0x22,0x04,0x4b,0x00,0x03,
-0x00,0x07,0x00,0x00,0x25,0x21,0x11,0x21,0x03,0x11,0x21,0x11,0x01,0x2c,0x03,0x84,
-0xfc,0x7c,0x72,0x04,0x68,0x4f,0x03,0x8a,0xfc,0x04,0x04,0x6e,0xfb,0x92,0x00,0x01,
-0x00,0xba,0xff,0xdd,0x05,0x22,0x04,0x4b,0x00,0x03,0x00,0x00,0x17,0x11,0x21,0x11,
-0xba,0x04,0x68,0x23,0x04,0x6e,0xfb,0x92,0x00,0x02,0x00,0x06,0xff,0x03,0x06,0x21,
-0x05,0x25,0x00,0x02,0x00,0x05,0x00,0x00,0x05,0x21,0x11,0x09,0x01,0x11,0x01,0x23,
-0x04,0x8c,0xfa,0x57,0x06,0x1b,0x8a,0x04,0x92,0xfa,0xfc,0x06,0x20,0xf9,0xe0,0x00,
-0x00,0x09,0x00,0xab,0x00,0x00,0x06,0x80,0x05,0xd5,0x00,0x07,0x00,0x0c,0x00,0x13,
-0x00,0x22,0x00,0x2a,0x00,0x32,0x00,0x3a,0x00,0x41,0x00,0x49,0x00,0x43,0xba,0x00,
-0x03,0x00,0x06,0x00,0x03,0x2b,0xb8,0x00,0x03,0x10,0xb8,0x00,0x44,0xd0,0xb8,0x00,
-0x06,0x10,0xb8,0x00,0x48,0xd0,0x00,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x02,0x2f,0xb8,
-0x00,0x46,0x2f,0xb8,0x00,0x48,0x2f,0xba,0x00,0x24,0x00,0x27,0x00,0x03,0x2b,0xb8,
-0x00,0x24,0x10,0xb8,0x00,0x2b,0xd0,0xb8,0x00,0x27,0x10,0xb8,0x00,0x2f,0xd0,0x30,
-0x31,0x01,0x33,0x17,0x11,0x07,0x23,0x27,0x11,0x05,0x17,0x15,0x07,0x27,0x25,0x17,
-0x07,0x23,0x26,0x27,0x35,0x05,0x32,0x1f,0x01,0x14,0x07,0x06,0x23,0x22,0x27,0x26,
-0x35,0x34,0x37,0x36,0x01,0x21,0x17,0x15,0x07,0x21,0x27,0x35,0x25,0x21,0x17,0x15,
-0x07,0x21,0x27,0x35,0x03,0x33,0x16,0x17,0x15,0x07,0x27,0x35,0x25,0x33,0x17,0x15,
-0x07,0x27,0x35,0x25,0x33,0x17,0x11,0x07,0x23,0x27,0x11,0x03,0x73,0x4d,0x06,0x06,
-0x4d,0x06,0x02,0x37,0x3a,0xf8,0x3d,0xfc,0xfd,0xfc,0x3d,0x03,0xc8,0x2d,0x02,0x30,
-0xd0,0x59,0x0d,0xbe,0x47,0x2e,0xaf,0x62,0x23,0xb7,0x43,0xfd,0x4b,0x01,0x53,0x06,
-0x06,0xfe,0xad,0x06,0x04,0x75,0x01,0x59,0x07,0x07,0xfe,0xa7,0x06,0x47,0x03,0x86,
-0x72,0x3d,0xf8,0xfd,0xb5,0x03,0x3b,0xf6,0x3e,0x02,0x1b,0x4d,0x06,0x06,0x4d,0x06,
-0x05,0xd5,0x06,0xfe,0xa2,0x06,0x06,0x01,0x5e,0x9b,0x3f,0x03,0xfe,0x3f,0xee,0xfe,
-0x40,0xc7,0x37,0x04,0xb5,0xe1,0x60,0xbd,0x64,0x17,0xa7,0x3f,0x5c,0xb5,0x67,0x1b,
-0xfe,0xed,0x06,0x4f,0x06,0x06,0x4f,0x06,0x06,0x4f,0x06,0x06,0x4f,0xfe,0xe8,0x82,
-0x79,0x03,0x3e,0xfd,0x04,0x2a,0x3c,0x03,0xfe,0x3f,0x04,0x76,0x06,0xfe,0xa2,0x06,
-0x06,0x01,0x5e,0x00,0x00,0x01,0x00,0x68,0xff,0xfb,0x07,0x97,0x02,0xe1,0x00,0x22,
-0x00,0x2d,0x00,0xb8,0x00,0x0f,0x2f,0xb8,0x00,0x11,0x2f,0xb8,0x00,0x00,0x2f,0xba,
-0x00,0x04,0x00,0x0f,0x00,0x00,0x11,0x12,0x39,0xba,0x00,0x0a,0x00,0x0f,0x00,0x00,
-0x11,0x12,0x39,0xba,0x00,0x1b,0x00,0x0f,0x00,0x00,0x11,0x12,0x39,0x30,0x31,0x01,
-0x33,0x32,0x1f,0x01,0x36,0x33,0x16,0x15,0x14,0x07,0x16,0x1d,0x01,0x06,0x23,0x21,
-0x35,0x32,0x37,0x36,0x3b,0x01,0x27,0x34,0x3f,0x01,0x17,0x27,0x34,0x3f,0x01,0x32,
-0x17,0x36,0x04,0xf5,0x16,0xd9,0x75,0x15,0x27,0x36,0x87,0x22,0x67,0x12,0x50,0xf9,
-0x33,0x39,0x86,0x2e,0x34,0x21,0x0c,0xa0,0x27,0x2a,0x05,0xcc,0x43,0x30,0x2e,0x78,
-0x02,0xe1,0xe8,0x56,0x23,0x1b,0x6d,0x31,0x34,0x17,0x48,0x1a,0x65,0x09,0xae,0x27,
-0x31,0x6c,0x31,0x04,0x04,0x0c,0x93,0x5a,0x08,0x2b,0x64,0x00,0x00,0x01,0x00,0x64,
-0x00,0x00,0x06,0xc8,0x05,0xd5,0x00,0x3f,0x00,0x37,0xba,0x00,0x18,0x00,0x29,0x00,
-0x03,0x2b,0xb8,0x00,0x18,0x10,0xb8,0x00,0x02,0xd0,0xb8,0x00,0x02,0x2f,0x00,0xb8,
-0x00,0x00,0x2f,0xb8,0x00,0x02,0x2f,0xb8,0x00,0x1b,0x2f,0xba,0x00,0x0a,0x00,0x1b,
-0x00,0x00,0x11,0x12,0x39,0xba,0x00,0x3a,0x00,0x1b,0x00,0x00,0x11,0x12,0x39,0x30,
-0x31,0x01,0x33,0x17,0x15,0x33,0x20,0x01,0x16,0x1d,0x01,0x23,0x26,0x27,0x26,0x2b,
-0x01,0x22,0x07,0x15,0x14,0x07,0x27,0x26,0x23,0x11,0x14,0x0f,0x01,0x22,0x2f,0x01,
-0x35,0x37,0x33,0x17,0x15,0x16,0x3b,0x01,0x32,0x3f,0x01,0x11,0x22,0x07,0x06,0x23,
-0x27,0x35,0x37,0x23,0x26,0x27,0x23,0x22,0x0f,0x01,0x23,0x35,0x36,0x37,0x36,0x21,
-0x35,0x03,0x8b,0x3a,0x06,0x02,0x01,0xb8,0x01,0x18,0x2b,0x02,0x16,0x13,0x23,0x39,
-0x2c,0x96,0x70,0x08,0x21,0x97,0x88,0x6a,0x1e,0x5b,0x25,0x02,0x06,0x2b,0x05,0x0b,
-0x3e,0x0a,0x37,0x14,0x06,0xd3,0x56,0x11,0x0e,0x07,0x07,0x04,0x43,0xc5,0x43,0x63,
-0x22,0x14,0x03,0x3a,0xc0,0xef,0x01,0x38,0x05,0xd5,0x06,0x7d,0xfe,0x1a,0x56,0x0d,
-0x08,0x0f,0x2e,0x18,0x65,0x33,0x0f,0x02,0x42,0x3d,0xfd,0x53,0x65,0x18,0x02,0x60,
-0x1c,0x1a,0x06,0x06,0x0c,0x65,0x39,0x2a,0x02,0xa4,0x3d,0x39,0x06,0x0c,0x33,0x40,
-0x1b,0x3d,0x12,0x02,0x90,0xda,0xdf,0x7d,0x00,0x1a,0x00,0xaa,0xff,0xff,0x06,0x82,
-0x07,0x6b,0x00,0x09,0x00,0x11,0x00,0x19,0x00,0x21,0x00,0x3d,0x00,0x5d,0x00,0x89,
-0x00,0xb5,0x00,0xe1,0x01,0x0d,0x01,0x39,0x01,0x65,0x01,0x91,0x01,0xbd,0x01,0xe9,
-0x02,0x15,0x02,0x41,0x02,0x6d,0x02,0x75,0x02,0x7d,0x02,0x85,0x02,0xb1,0x02,0xdd,
-0x03,0x09,0x03,0x35,0x03,0x61,0x01,0xc7,0xba,0x00,0x4d,0x00,0x2a,0x00,0x03,0x2b,
-0xb8,0x00,0x4d,0x10,0x41,0x05,0x00,0xea,0x00,0x2a,0x00,0xfa,0x00,0x2a,0x00,0x02,
-0x5d,0x41,0x1b,0x00,0x19,0x00,0x2a,0x00,0x29,0x00,0x2a,0x00,0x39,0x00,0x2a,0x00,
-0x49,0x00,0x2a,0x00,0x59,0x00,0x2a,0x00,0x69,0x00,0x2a,0x00,0x79,0x00,0x2a,0x00,
-0x89,0x00,0x2a,0x00,0x99,0x00,0x2a,0x00,0xa9,0x00,0x2a,0x00,0xb9,0x00,0x2a,0x00,
-0xc9,0x00,0x2a,0x00,0xd9,0x00,0x2a,0x00,0x0d,0x5d,0xb8,0x00,0x2a,0x10,0xb8,0x00,
-0xb7,0xd0,0xba,0x00,0xbd,0x00,0x2a,0x00,0x4d,0x11,0x12,0x39,0xb8,0x00,0x4d,0x10,
-0xb8,0x00,0xc2,0xd0,0xb8,0x00,0xc2,0x2f,0xba,0x00,0xc5,0x00,0x2a,0x00,0x4d,0x11,
-0x12,0x39,0xb8,0x00,0x4d,0x10,0xb8,0x00,0xc8,0xd0,0xb8,0x00,0xc8,0x2f,0xba,0x00,
-0xcd,0x00,0x2a,0x00,0x4d,0x11,0x12,0x39,0xb8,0x00,0x2a,0x10,0xb8,0x00,0xd2,0xd0,
-0xb8,0x00,0xd2,0x2f,0xb8,0x00,0x4d,0x10,0xb8,0x03,0x63,0xdc,0x00,0xb8,0x01,0x10,
-0x2f,0xb8,0x01,0x12,0x2f,0xb8,0x01,0x14,0x2f,0xba,0x00,0x27,0x00,0x50,0x00,0x03,
-0x2b,0xb8,0x00,0x27,0x10,0xba,0x00,0x16,0x00,0x05,0x00,0x03,0x2b,0xb8,0x00,0x16,
-0x10,0xb8,0x00,0x12,0xdc,0xb8,0x00,0x0a,0xd0,0xb8,0x00,0x0a,0x2f,0xb8,0x00,0x16,
-0x10,0xb8,0x00,0x0e,0xd0,0xb8,0x00,0x0e,0x2f,0xba,0x00,0x8b,0x00,0x05,0x00,0x16,
-0x11,0x12,0x39,0xba,0x00,0x91,0x00,0x05,0x00,0x16,0x11,0x12,0x39,0xb8,0x00,0x12,
-0x10,0xb8,0x00,0x94,0xd0,0xb8,0x00,0x94,0x2f,0xba,0x00,0x99,0x00,0x05,0x00,0x16,
-0x11,0x12,0x39,0xba,0x00,0xa1,0x00,0x05,0x00,0x16,0x11,0x12,0x39,0xb8,0x00,0x05,
-0x10,0xb8,0x00,0xa4,0xd0,0xb8,0x00,0xa4,0x2f,0xba,0x00,0xa7,0x00,0x05,0x00,0x16,
-0x11,0x12,0x39,0xba,0x00,0xaf,0x00,0x05,0x00,0x16,0x11,0x12,0x39,0xb8,0x00,0x12,
-0x10,0xb8,0x00,0xb4,0xd0,0xb8,0x00,0xb4,0x2f,0xba,0x00,0xb7,0x00,0x05,0x00,0x16,
-0x11,0x12,0x39,0xba,0x00,0xbd,0x00,0x05,0x00,0x16,0x11,0x12,0x39,0xba,0x00,0xc5,
-0x00,0x05,0x00,0x16,0x11,0x12,0x39,0xba,0x00,0xcd,0x00,0x05,0x00,0x16,0x11,0x12,
-0x39,0xba,0x00,0xd3,0x00,0x05,0x00,0x16,0x11,0x12,0x39,0xba,0x00,0xdb,0x00,0x05,
-0x00,0x16,0x11,0x12,0x39,0xb8,0x00,0x16,0x10,0xb8,0x00,0xfc,0xd0,0xb8,0x00,0xfc,
-0x2f,0xba,0x02,0xdf,0x00,0x05,0x00,0x16,0x11,0x12,0x39,0xba,0x02,0xe5,0x00,0x05,
-0x00,0x16,0x11,0x12,0x39,0xba,0x02,0xed,0x00,0x05,0x00,0x16,0x11,0x12,0x39,0xba,
-0x02,0xf5,0x00,0x05,0x00,0x16,0x11,0x12,0x39,0xba,0x02,0xfb,0x00,0x05,0x00,0x16,
-0x11,0x12,0x39,0xba,0x03,0x03,0x00,0x05,0x00,0x16,0x11,0x12,0x39,0x30,0x31,0x01,
-0x16,0x37,0x33,0x06,0x07,0x26,0x27,0x33,0x16,0x37,0x26,0x27,0x36,0x37,0x16,0x17,
-0x06,0x05,0x26,0x27,0x36,0x37,0x16,0x17,0x06,0x03,0x26,0x27,0x36,0x37,0x16,0x17,
-0x06,0x27,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x26,0x27,0x16,0x37,
-0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x16,0x33,0x06,0x13,0x36,0x37,
-0x32,0x1f,0x01,0x16,0x15,0x14,0x07,0x06,0x07,0x16,0x17,0x16,0x15,0x14,0x04,0x23,
-0x22,0x24,0x35,0x34,0x37,0x36,0x37,0x26,0x27,0x26,0x35,0x34,0x37,0x01,0x17,0x27,
-0x26,0x33,0x32,0x0f,0x01,0x37,0x36,0x33,0x32,0x15,0x14,0x0f,0x01,0x17,0x16,0x15,
-0x14,0x23,0x22,0x2f,0x01,0x17,0x16,0x23,0x22,0x35,0x37,0x07,0x06,0x23,0x22,0x35,
-0x34,0x3f,0x01,0x27,0x26,0x35,0x34,0x33,0x32,0x01,0x17,0x27,0x26,0x33,0x32,0x0f,
-0x01,0x37,0x36,0x33,0x32,0x15,0x14,0x0f,0x01,0x17,0x16,0x15,0x14,0x23,0x22,0x2f,
-0x01,0x17,0x16,0x23,0x22,0x35,0x37,0x07,0x06,0x23,0x22,0x35,0x34,0x3f,0x01,0x27,
-0x26,0x35,0x34,0x33,0x32,0x05,0x17,0x27,0x26,0x33,0x32,0x0f,0x01,0x37,0x36,0x33,
-0x32,0x15,0x14,0x0f,0x01,0x17,0x16,0x15,0x14,0x23,0x22,0x2f,0x01,0x17,0x16,0x23,
-0x22,0x35,0x37,0x07,0x06,0x23,0x22,0x35,0x34,0x3f,0x01,0x27,0x26,0x35,0x34,0x33,
-0x32,0x13,0x17,0x27,0x26,0x33,0x32,0x0f,0x01,0x37,0x36,0x33,0x32,0x15,0x14,0x0f,
-0x01,0x17,0x16,0x15,0x14,0x23,0x22,0x2f,0x01,0x17,0x16,0x23,0x22,0x35,0x37,0x07,
-0x06,0x23,0x22,0x35,0x34,0x3f,0x01,0x27,0x26,0x35,0x34,0x33,0x32,0x01,0x17,0x27,
-0x26,0x33,0x32,0x0f,0x01,0x37,0x36,0x33,0x32,0x15,0x14,0x0f,0x01,0x17,0x16,0x15,
-0x14,0x23,0x22,0x2f,0x01,0x17,0x14,0x23,0x22,0x35,0x37,0x07,0x06,0x23,0x22,0x35,
-0x34,0x3f,0x01,0x27,0x26,0x35,0x34,0x33,0x32,0x01,0x17,0x27,0x26,0x33,0x32,0x0f,
-0x01,0x37,0x36,0x33,0x32,0x15,0x14,0x0f,0x01,0x17,0x16,0x15,0x14,0x23,0x22,0x2f,
-0x01,0x17,0x14,0x23,0x22,0x35,0x37,0x07,0x06,0x23,0x22,0x35,0x34,0x3f,0x01,0x27,
-0x26,0x35,0x34,0x33,0x32,0x05,0x17,0x27,0x34,0x33,0x32,0x15,0x07,0x37,0x36,0x33,
-0x32,0x15,0x14,0x0f,0x01,0x17,0x16,0x15,0x14,0x23,0x22,0x2f,0x01,0x17,0x16,0x23,
-0x22,0x35,0x37,0x07,0x06,0x23,0x22,0x35,0x34,0x3f,0x01,0x27,0x26,0x35,0x34,0x33,
-0x32,0x03,0x17,0x27,0x26,0x33,0x32,0x0f,0x01,0x37,0x36,0x33,0x32,0x15,0x14,0x0f,
-0x01,0x17,0x16,0x15,0x14,0x23,0x22,0x2f,0x01,0x17,0x16,0x23,0x22,0x35,0x37,0x07,
-0x06,0x23,0x22,0x35,0x34,0x3f,0x01,0x27,0x26,0x35,0x34,0x33,0x32,0x05,0x17,0x27,
-0x26,0x33,0x32,0x0f,0x01,0x37,0x36,0x33,0x32,0x15,0x14,0x0f,0x01,0x17,0x16,0x15,
-0x14,0x23,0x22,0x2f,0x01,0x17,0x16,0x23,0x22,0x35,0x37,0x07,0x06,0x23,0x22,0x35,
-0x34,0x3f,0x01,0x27,0x26,0x35,0x34,0x33,0x32,0x1f,0x01,0x27,0x26,0x33,0x32,0x0f,
-0x01,0x37,0x36,0x33,0x32,0x15,0x14,0x0f,0x01,0x17,0x16,0x15,0x14,0x23,0x22,0x2f,
-0x01,0x17,0x14,0x23,0x22,0x35,0x37,0x07,0x06,0x23,0x22,0x35,0x34,0x3f,0x01,0x27,
-0x26,0x35,0x34,0x33,0x32,0x37,0x17,0x27,0x34,0x33,0x32,0x0f,0x01,0x37,0x36,0x33,
-0x32,0x15,0x14,0x0f,0x01,0x17,0x16,0x15,0x14,0x23,0x22,0x2f,0x01,0x17,0x16,0x23,
-0x22,0x35,0x37,0x07,0x06,0x23,0x22,0x35,0x34,0x3f,0x01,0x27,0x26,0x35,0x34,0x33,
-0x32,0x37,0x17,0x27,0x26,0x33,0x32,0x0f,0x01,0x37,0x36,0x33,0x32,0x15,0x14,0x0f,
-0x01,0x17,0x16,0x15,0x14,0x23,0x22,0x2f,0x01,0x17,0x16,0x23,0x22,0x35,0x37,0x07,
-0x06,0x23,0x22,0x35,0x34,0x3f,0x01,0x27,0x26,0x35,0x34,0x33,0x32,0x13,0x26,0x27,
-0x36,0x37,0x16,0x17,0x06,0x05,0x26,0x27,0x36,0x37,0x16,0x17,0x06,0x17,0x26,0x27,
-0x36,0x37,0x16,0x17,0x06,0x01,0x17,0x27,0x26,0x33,0x32,0x0f,0x01,0x37,0x36,0x33,
-0x32,0x15,0x14,0x0f,0x01,0x17,0x16,0x15,0x14,0x23,0x22,0x2f,0x01,0x17,0x16,0x23,
-0x22,0x35,0x37,0x07,0x06,0x23,0x22,0x35,0x34,0x3f,0x01,0x27,0x26,0x35,0x34,0x33,
-0x32,0x01,0x17,0x27,0x26,0x33,0x32,0x0f,0x01,0x37,0x36,0x33,0x32,0x15,0x14,0x0f,
-0x01,0x17,0x16,0x15,0x14,0x23,0x22,0x2f,0x01,0x17,0x14,0x23,0x22,0x35,0x37,0x07,
-0x06,0x23,0x22,0x35,0x34,0x3f,0x01,0x27,0x26,0x35,0x34,0x33,0x32,0x05,0x17,0x27,
-0x26,0x33,0x32,0x0f,0x01,0x37,0x36,0x33,0x32,0x15,0x14,0x0f,0x01,0x17,0x16,0x15,
-0x14,0x23,0x22,0x2f,0x01,0x17,0x16,0x23,0x22,0x35,0x37,0x07,0x06,0x23,0x22,0x35,
-0x34,0x3f,0x01,0x27,0x26,0x35,0x34,0x33,0x32,0x01,0x17,0x27,0x26,0x33,0x32,0x0f,
-0x01,0x37,0x36,0x33,0x32,0x15,0x14,0x0f,0x01,0x17,0x16,0x15,0x14,0x23,0x22,0x2f,
-0x01,0x17,0x16,0x23,0x22,0x35,0x37,0x07,0x06,0x23,0x22,0x35,0x34,0x3f,0x01,0x27,
-0x26,0x35,0x34,0x33,0x32,0x01,0x17,0x27,0x26,0x33,0x32,0x0f,0x01,0x37,0x36,0x33,
-0x32,0x15,0x14,0x0f,0x01,0x17,0x16,0x15,0x14,0x23,0x22,0x2f,0x01,0x17,0x16,0x23,
-0x22,0x35,0x37,0x07,0x06,0x23,0x22,0x35,0x34,0x3f,0x01,0x27,0x26,0x35,0x34,0x33,
-0x32,0x03,0xfc,0x4f,0x1c,0x19,0x05,0x80,0x7e,0x09,0x18,0x29,0xb9,0x2a,0x01,0x03,
-0x2b,0x27,0x03,0x03,0xfe,0xeb,0x29,0x03,0x03,0x2b,0x28,0x03,0x03,0x40,0x26,0x02,
-0x03,0x27,0x24,0x02,0x02,0xca,0x7c,0xf7,0xaf,0xae,0xf8,0x7c,0x65,0x8b,0x3f,0x2f,
-0x41,0x7d,0x5d,0x5c,0x8a,0x42,0x2d,0x37,0x90,0x15,0x1a,0x93,0x84,0x31,0x02,0x53,
-0x4c,0x14,0x18,0x6f,0x57,0x8e,0xfe,0xe4,0xcb,0xcb,0xfe,0xe3,0x8f,0x5c,0x76,0x15,
-0x13,0x4c,0x4c,0xfd,0xa9,0x29,0x06,0x01,0x0f,0x11,0x02,0x06,0x28,0x04,0x04,0x10,
-0x08,0x30,0x2f,0x09,0x10,0x04,0x04,0x28,0x06,0x01,0x10,0x0e,0x05,0x28,0x03,0x05,
-0x0e,0x09,0x2e,0x31,0x07,0x0f,0x05,0x01,0x28,0x25,0x06,0x02,0x0f,0x0f,0x02,0x06,
-0x25,0x04,0x04,0x0e,0x07,0x2c,0x2a,0x07,0x0c,0x05,0x03,0x23,0x04,0x01,0x0e,0x0d,
-0x05,0x24,0x03,0x04,0x0d,0x08,0x29,0x2a,0x08,0x0e,0x04,0x03,0x66,0x24,0x05,0x02,
-0x0e,0x10,0x02,0x06,0x25,0x03,0x05,0x0d,0x07,0x2b,0x29,0x08,0x0c,0x06,0x02,0x24,
-0x05,0x01,0x0f,0x0c,0x04,0x23,0x04,0x03,0x0e,0x08,0x2a,0x2b,0x08,0x0f,0x03,0x66,
-0x25,0x06,0x02,0x0f,0x0f,0x02,0x06,0x25,0x04,0x04,0x0e,0x07,0x2c,0x2a,0x07,0x0c,
-0x06,0x02,0x24,0x05,0x01,0x0e,0x0d,0x05,0x24,0x03,0x04,0x0d,0x08,0x29,0x2a,0x08,
-0x0e,0x04,0xfb,0xcb,0x13,0x02,0x01,0x07,0x08,0x01,0x03,0x14,0x01,0x02,0x08,0x03,
-0x18,0x17,0x04,0x08,0x02,0x01,0x13,0x02,0x07,0x06,0x02,0x13,0x02,0x03,0x06,0x04,
-0x17,0x18,0x03,0x08,0x01,0x03,0x17,0x15,0x03,0x01,0x09,0x09,0x01,0x04,0x16,0x02,
-0x02,0x09,0x04,0x1a,0x18,0x05,0x08,0x02,0x02,0x16,0x04,0x08,0x08,0x03,0x15,0x02,
-0x02,0x08,0x04,0x19,0x1a,0x04,0x09,0x02,0xfc,0xbb,0x13,0x04,0x07,0x08,0x04,0x13,
-0x03,0x02,0x08,0x05,0x16,0x16,0x04,0x07,0x02,0x03,0x13,0x03,0x01,0x08,0x07,0x04,
-0x13,0x03,0x02,0x07,0x04,0x16,0x16,0x05,0x08,0x02,0x5c,0x14,0x04,0x01,0x08,0x08,
-0x01,0x03,0x13,0x03,0x02,0x07,0x04,0x17,0x16,0x05,0x07,0x02,0x03,0x13,0x03,0x01,
-0x08,0x07,0x03,0x13,0x02,0x02,0x08,0x05,0x16,0x16,0x05,0x08,0x02,0x01,0x1c,0x13,
-0x02,0x01,0x08,0x08,0x01,0x03,0x13,0x01,0x03,0x08,0x04,0x17,0x16,0x05,0x08,0x03,
-0x01,0x13,0x03,0x01,0x08,0x07,0x02,0x13,0x02,0x01,0x08,0x05,0x16,0x17,0x04,0x08,
-0x01,0x6f,0x13,0x02,0x02,0x08,0x08,0x01,0x03,0x14,0x01,0x02,0x08,0x04,0x17,0x17,
-0x04,0x08,0x02,0x01,0x13,0x02,0x07,0x06,0x02,0x13,0x02,0x03,0x06,0x04,0x16,0x17,
-0x03,0x06,0x03,0xf7,0x15,0x03,0x07,0x09,0x01,0x03,0x16,0x01,0x04,0x08,0x05,0x1a,
-0x19,0x06,0x08,0x04,0x02,0x14,0x02,0x01,0x09,0x07,0x03,0x15,0x03,0x02,0x08,0x05,
-0x18,0x19,0x04,0x08,0x02,0x5b,0x16,0x03,0x01,0x09,0x09,0x01,0x04,0x16,0x02,0x02,
-0x08,0x03,0x1a,0x18,0x05,0x08,0x02,0x02,0x16,0x03,0x01,0x08,0x08,0x02,0x15,0x01,
-0x03,0x08,0x05,0x19,0x1a,0x04,0x09,0x02,0xae,0x25,0x02,0x02,0x29,0x23,0x03,0x03,
-0xfe,0xb7,0x26,0x02,0x03,0x27,0x25,0x01,0x01,0xfc,0x26,0x02,0x02,0x29,0x23,0x03,
-0x03,0x01,0x60,0x23,0x05,0x01,0x0e,0x0f,0x01,0x06,0x24,0x03,0x05,0x0d,0x07,0x2a,
-0x29,0x08,0x0d,0x05,0x03,0x24,0x04,0x02,0x0e,0x0d,0x05,0x23,0x04,0x04,0x0e,0x08,
-0x2b,0x2c,0x07,0x0e,0x04,0xfc,0x55,0x15,0x03,0x01,0x09,0x09,0x01,0x04,0x15,0x03,
-0x02,0x09,0x05,0x19,0x18,0x05,0x08,0x02,0x03,0x15,0x04,0x08,0x08,0x03,0x15,0x02,
-0x02,0x08,0x04,0x19,0x1a,0x04,0x09,0x02,0xfe,0x51,0x17,0x04,0x01,0x09,0x09,0x01,
-0x03,0x15,0x02,0x02,0x08,0x03,0x1a,0x19,0x04,0x08,0x02,0x02,0x15,0x02,0x01,0x08,
-0x08,0x04,0x17,0x01,0x02,0x09,0x06,0x18,0x1a,0x04,0x09,0x02,0x04,0x30,0x17,0x04,
-0x01,0x09,0x09,0x01,0x03,0x15,0x02,0x02,0x08,0x03,0x1a,0x19,0x04,0x08,0x02,0x02,
-0x15,0x02,0x01,0x08,0x08,0x03,0x16,0x01,0x03,0x08,0x06,0x18,0x19,0x05,0x09,0x02,
-0xfc,0x45,0x25,0x05,0x02,0x0e,0x10,0x03,0x05,0x25,0x03,0x05,0x0d,0x07,0x2b,0x29,
-0x08,0x0c,0x06,0x02,0x24,0x04,0x02,0x0f,0x0c,0x04,0x24,0x03,0x03,0x0e,0x08,0x2a,
-0x2b,0x08,0x0f,0x03,0x03,0x89,0x05,0x2a,0x45,0x05,0x07,0x43,0x2a,0x5a,0x02,0x2a,
-0x2c,0x03,0x03,0x29,0x2d,0x04,0x02,0x29,0x2d,0x03,0x03,0x2a,0x2c,0xfe,0x12,0x02,
-0x25,0x26,0x02,0x02,0x25,0x26,0x9e,0x66,0x93,0x91,0xd0,0xd0,0x91,0x93,0x66,0x55,
-0x20,0x02,0x35,0x48,0x68,0x66,0x65,0x65,0x66,0x68,0x48,0x32,0x1e,0x01,0xd9,0x70,
-0x18,0x75,0x13,0x5e,0x74,0x74,0x51,0x18,0x10,0x1c,0x46,0x73,0xa5,0xa3,0xe6,0xe6,
-0xa3,0xa5,0x73,0x4b,0x1a,0x0f,0x16,0x51,0x74,0x74,0x47,0xfd,0x68,0x21,0x39,0x0f,
-0x0f,0x39,0x21,0x04,0x11,0x0b,0x03,0x15,0x16,0x03,0x0c,0x0f,0x02,0x21,0x37,0x10,
-0x10,0x37,0x21,0x02,0x0f,0x0c,0x03,0x16,0x15,0x03,0x0b,0x11,0x01,0xd1,0x1f,0x34,
-0x0d,0x0d,0x34,0x1f,0x03,0x10,0x07,0x05,0x14,0x13,0x03,0x09,0x0e,0x02,0x1e,0x32,
-0x0f,0x0f,0x32,0x1e,0x02,0x0e,0x09,0x03,0x13,0x14,0x05,0x07,0x10,0x4b,0x1f,0x34,
-0x0e,0x0e,0x34,0x1f,0x03,0x10,0x07,0x03,0x15,0x13,0x04,0x09,0x0e,0x02,0x1e,0x32,
-0x0e,0x0e,0x32,0x1e,0x02,0x0e,0x09,0x04,0x13,0x15,0x03,0x07,0x10,0x01,0x1b,0x1e,
-0x32,0x0e,0x0e,0x32,0x1e,0x02,0x0e,0x09,0x04,0x13,0x14,0x03,0x09,0x0f,0x03,0x1d,
-0x31,0x0e,0x0e,0x31,0x1d,0x03,0x0f,0x09,0x03,0x14,0x13,0x04,0x09,0x0e,0x02,0x9a,
-0x10,0x1c,0x06,0x06,0x1c,0x10,0x01,0x07,0x06,0x02,0x09,0x0b,0x02,0x04,0x08,0x02,
-0x0e,0x19,0x07,0x07,0x19,0x0e,0x02,0x08,0x04,0x02,0x0b,0x09,0x02,0x06,0x07,0xfe,
-0xe3,0x11,0x1d,0x0a,0x0a,0x1d,0x11,0x03,0x0a,0x05,0x01,0x0d,0x0a,0x03,0x06,0x07,
-0x01,0x11,0x1e,0x07,0x07,0x1e,0x11,0x01,0x07,0x06,0x03,0x0a,0x0d,0x01,0x05,0x0a,
-0xa8,0x10,0x1c,0x07,0x07,0x1c,0x10,0x02,0x07,0x06,0x02,0x09,0x0b,0x02,0x05,0x08,
-0x02,0x0f,0x1a,0x08,0x08,0x1a,0x0f,0x02,0x08,0x05,0x02,0x0b,0x09,0x02,0x06,0x07,
-0x01,0x18,0x10,0x1c,0x06,0x06,0x1c,0x10,0x02,0x08,0x04,0x03,0x0a,0x0a,0x02,0x05,
-0x07,0x01,0x0f,0x19,0x08,0x08,0x19,0x0f,0x01,0x07,0x05,0x02,0x0a,0x0a,0x03,0x04,
-0x08,0x18,0x0f,0x1b,0x07,0x07,0x1b,0x0f,0x02,0x08,0x05,0x01,0x0a,0x0b,0x01,0x06,
-0x07,0x01,0x10,0x1b,0x08,0x08,0x1b,0x10,0x01,0x07,0x06,0x01,0x0b,0x0a,0x01,0x06,
-0x07,0xa1,0x0f,0x1b,0x07,0x07,0x1b,0x0f,0x01,0x07,0x04,0x01,0x0c,0x0a,0x01,0x06,
-0x06,0x01,0x0f,0x1b,0x07,0x07,0x1b,0x0f,0x01,0x06,0x06,0x01,0x0a,0x0c,0x01,0x04,
-0x07,0x37,0x12,0x1f,0x07,0x07,0x1f,0x12,0x01,0x08,0x05,0x02,0x0c,0x0c,0x02,0x05,
-0x08,0x01,0x12,0x1d,0x0a,0x0a,0x1d,0x12,0x01,0x08,0x05,0x02,0x0c,0x0c,0x02,0x05,
-0x08,0xd9,0x12,0x1f,0x07,0x07,0x1f,0x12,0x01,0x08,0x05,0x02,0x0b,0x0c,0x02,0x05,
-0x0a,0x03,0x10,0x1c,0x09,0x09,0x1c,0x10,0x03,0x0a,0x05,0x02,0x0c,0x0b,0x02,0x06,
-0x07,0xfa,0xe0,0x02,0x25,0x26,0x02,0x02,0x25,0x26,0xe2,0x02,0x25,0x27,0x02,0x03,
-0x25,0x26,0x02,0x02,0x25,0x27,0x02,0x03,0x25,0x26,0x01,0x81,0x1d,0x32,0x0e,0x0e,
-0x32,0x1d,0x03,0x0f,0x09,0x03,0x13,0x14,0x03,0x0a,0x0e,0x04,0x1b,0x2f,0x0f,0x0f,
-0x2f,0x1b,0x04,0x0e,0x0a,0x03,0x14,0x13,0x03,0x09,0x0f,0x02,0x67,0x12,0x1e,0x08,
-0x08,0x1e,0x12,0x01,0x0a,0x04,0x02,0x0b,0x0c,0x02,0x06,0x08,0x02,0x11,0x1d,0x09,
-0x09,0x1d,0x11,0x02,0x08,0x06,0x02,0x0c,0x0b,0x02,0x04,0x0a,0xfb,0x12,0x1f,0x07,
-0x07,0x1f,0x12,0x01,0x08,0x05,0x03,0x0b,0x0c,0x02,0x05,0x09,0x01,0x12,0x1c,0x0a,
-0x0a,0x1c,0x12,0x01,0x09,0x05,0x02,0x0c,0x0b,0x03,0x05,0x08,0x01,0x82,0x11,0x1e,
-0x08,0x08,0x1e,0x11,0x02,0x08,0x07,0x01,0x0b,0x0c,0x02,0x05,0x09,0x01,0x11,0x1c,
-0x09,0x09,0x1c,0x11,0x01,0x09,0x05,0x02,0x0c,0x0b,0x01,0x07,0x08,0xfd,0x7f,0x1f,
-0x34,0x0e,0x0e,0x34,0x1f,0x03,0x10,0x07,0x04,0x14,0x13,0x03,0x0a,0x0e,0x03,0x1d,
-0x32,0x0e,0x0e,0x32,0x1d,0x03,0x0e,0x0a,0x03,0x13,0x14,0x04,0x07,0x10,0x00,0x0f,
-0x00,0x83,0x00,0x00,0x06,0xa9,0x07,0x0b,0x00,0x13,0x00,0x21,0x00,0x32,0x00,0x43,
-0x00,0x54,0x00,0x65,0x00,0x76,0x00,0x87,0x00,0x98,0x00,0xa9,0x00,0xba,0x00,0xcb,
-0x00,0xdc,0x00,0xed,0x00,0xfe,0x00,0x17,0x00,0xb8,0x00,0x55,0x2f,0xb8,0x00,0x64,
-0x2f,0xb8,0x00,0xaa,0x2f,0xb8,0x00,0xb9,0x2f,0xb8,0x00,0x07,0x2f,0x30,0x31,0x01,
-0x16,0x07,0x06,0x0f,0x01,0x06,0x2b,0x01,0x26,0x27,0x26,0x35,0x34,0x3f,0x02,0x36,
-0x17,0x16,0x05,0x06,0x17,0x16,0x1f,0x01,0x16,0x3f,0x01,0x36,0x2f,0x01,0x26,0x07,
-0x13,0x32,0x17,0x16,0x1d,0x01,0x14,0x07,0x06,0x23,0x22,0x2f,0x01,0x35,0x34,0x37,
-0x36,0x13,0x32,0x17,0x16,0x1d,0x01,0x14,0x07,0x06,0x23,0x22,0x2f,0x01,0x35,0x34,
-0x37,0x36,0x13,0x32,0x17,0x16,0x1d,0x01,0x14,0x07,0x06,0x23,0x22,0x2f,0x01,0x35,
-0x34,0x37,0x36,0x13,0x32,0x17,0x16,0x1d,0x01,0x14,0x07,0x06,0x23,0x22,0x2f,0x01,
-0x35,0x34,0x37,0x36,0x13,0x32,0x17,0x16,0x1d,0x01,0x14,0x07,0x06,0x23,0x22,0x2f,
-0x01,0x35,0x34,0x37,0x36,0x03,0x32,0x17,0x16,0x1d,0x01,0x14,0x07,0x06,0x23,0x22,
-0x2f,0x01,0x35,0x34,0x37,0x36,0x01,0x32,0x17,0x16,0x1d,0x01,0x14,0x07,0x06,0x23,
-0x22,0x2f,0x01,0x35,0x34,0x37,0x36,0x37,0x32,0x17,0x16,0x1d,0x01,0x14,0x07,0x06,
-0x23,0x22,0x2f,0x01,0x35,0x34,0x37,0x36,0x13,0x32,0x17,0x16,0x1d,0x01,0x14,0x07,
-0x06,0x23,0x22,0x2f,0x01,0x35,0x34,0x37,0x36,0x01,0x32,0x17,0x16,0x1d,0x01,0x14,
-0x07,0x06,0x23,0x22,0x2f,0x01,0x35,0x34,0x37,0x36,0x25,0x32,0x17,0x16,0x1d,0x01,
-0x14,0x07,0x06,0x23,0x22,0x2f,0x01,0x35,0x34,0x37,0x36,0x25,0x32,0x17,0x16,0x1d,
-0x01,0x14,0x07,0x06,0x23,0x22,0x2f,0x01,0x35,0x34,0x37,0x36,0x25,0x32,0x17,0x16,
-0x1d,0x01,0x14,0x07,0x06,0x23,0x22,0x2f,0x01,0x35,0x34,0x37,0x36,0x02,0x44,0x51,
-0x3d,0x14,0x32,0x15,0x60,0x7b,0x16,0x34,0x26,0x2f,0x3c,0x29,0x0c,0x67,0x8d,0x3e,
-0xfe,0xfa,0x69,0x23,0x05,0x0e,0x0e,0x40,0x86,0x33,0x65,0x17,0x20,0x45,0x8d,0xf7,
-0x1d,0x0f,0x07,0x1a,0x0b,0x0d,0x24,0x0d,0x01,0x1a,0x0d,0xa8,0x1d,0x0f,0x07,0x1a,
-0x0b,0x0d,0x24,0x0d,0x01,0x1a,0x0d,0x8a,0x1c,0x0f,0x07,0x1a,0x0a,0x0e,0x23,0x0e,
-0x01,0x1a,0x0d,0x9b,0x1c,0x0f,0x07,0x1a,0x0a,0x0e,0x23,0x0e,0x01,0x1a,0x0d,0x03,
-0x1c,0x0f,0x07,0x1a,0x0a,0x0e,0x23,0x0e,0x01,0x1a,0x0d,0xbd,0x1d,0x0f,0x07,0x1a,
-0x0b,0x0d,0x24,0x0d,0x01,0x1a,0x0d,0x01,0x8a,0x1c,0x0f,0x07,0x1a,0x0a,0x0e,0x23,
-0x0e,0x01,0x1a,0x0d,0xc2,0x1d,0x0f,0x07,0x1a,0x0b,0x0d,0x24,0x0d,0x01,0x1a,0x0d,
-0xc2,0x1d,0x0f,0x07,0x1a,0x0b,0x0d,0x24,0x0d,0x01,0x1a,0x0d,0xfd,0x55,0x1d,0x0f,
-0x07,0x1a,0x0b,0x0d,0x24,0x0d,0x01,0x1a,0x0d,0x01,0x12,0x1c,0x0f,0x07,0x1a,0x0a,
-0x0e,0x23,0x0e,0x01,0x1a,0x0d,0x01,0x22,0x1d,0x0f,0x07,0x1a,0x0b,0x0d,0x24,0x0d,
-0x01,0x1a,0x0d,0x01,0x03,0x1c,0x0f,0x07,0x1a,0x0a,0x0e,0x23,0x0e,0x01,0x1a,0x0d,
-0x02,0x20,0x61,0xaf,0x47,0x3c,0x1a,0x73,0x07,0x2d,0x38,0x50,0x5a,0x79,0x39,0x0e,
-0x7d,0x03,0x0c,0x80,0x7f,0x89,0x16,0x10,0x12,0x4b,0x57,0x32,0x7b,0x92,0x30,0x52,
-0x5e,0x01,0x6a,0x1f,0x0c,0x0f,0x06,0x1f,0x12,0x07,0x2c,0x0e,0x03,0x1f,0x14,0x08,
-0x01,0x3a,0x1e,0x0c,0x0f,0x07,0x1e,0x13,0x08,0x2e,0x0c,0x05,0x1e,0x14,0x08,0x01,
-0x34,0x1f,0x0c,0x0e,0x07,0x1e,0x14,0x07,0x2e,0x0c,0x05,0x1e,0x14,0x08,0x01,0x3d,
-0x1f,0x0c,0x0f,0x06,0x1f,0x12,0x07,0x2c,0x0d,0x04,0x1f,0x14,0x08,0xfd,0x02,0x1f,
-0x0c,0x0f,0x06,0x1f,0x12,0x07,0x2c,0x0e,0x03,0x20,0x13,0x08,0xfe,0xfc,0x1f,0x0c,
-0x0e,0x06,0x20,0x12,0x07,0x2d,0x0d,0x04,0x1f,0x13,0x08,0x02,0x07,0x1e,0x0c,0x0f,
-0x07,0x1e,0x13,0x07,0x2d,0x0c,0x05,0x1e,0x15,0x07,0xfa,0x1e,0x0c,0x0f,0x07,0x1e,
-0x13,0x07,0x2d,0x0c,0x05,0x1e,0x15,0x07,0x01,0x04,0x20,0x0c,0x0e,0x06,0x1f,0x12,
-0x08,0x2d,0x0d,0x04,0x1f,0x13,0x09,0xfb,0x0c,0x1e,0x0c,0x0f,0x07,0x1e,0x13,0x08,
-0x2e,0x0c,0x05,0x1e,0x14,0x08,0xd3,0x1e,0x0c,0x0e,0x07,0x1e,0x14,0x07,0x2e,0x0c,
-0x05,0x1e,0x14,0x07,0xe7,0x1f,0x0c,0x0e,0x06,0x20,0x12,0x07,0x2c,0x0e,0x03,0x20,
-0x13,0x08,0xca,0x1f,0x0c,0x0e,0x06,0x20,0x12,0x07,0x2d,0x0d,0x03,0x20,0x13,0x08,
-0x00,0x01,0x00,0x85,0xff,0xf7,0x06,0xa7,0x05,0xc9,0x00,0x09,0x00,0x23,0x00,0xb8,
-0x00,0x02,0x2f,0xb8,0x00,0x06,0x2f,0xb8,0x00,0x08,0x2f,0xba,0x00,0x00,0x00,0x06,
-0x00,0x02,0x11,0x12,0x39,0xba,0x00,0x04,0x00,0x06,0x00,0x02,0x11,0x12,0x39,0x30,
-0x31,0x13,0x21,0x1b,0x01,0x21,0x01,0x13,0x09,0x01,0x13,0x85,0x02,0x57,0xba,0xbb,
-0x02,0x56,0xfe,0x1c,0xba,0xfe,0x19,0xfe,0x1a,0xb9,0x03,0x90,0x02,0x39,0xfd,0xc7,
-0xfe,0x9f,0xfd,0xc8,0x01,0x60,0xfe,0xa0,0x02,0x38,0x00,0x02,0x00,0x85,0xff,0xf7,
-0x06,0xa7,0x05,0xc9,0x00,0x09,0x00,0x13,0x00,0x4f,0x00,0xb8,0x00,0x06,0x2f,0xb8,
-0x00,0x08,0x2f,0xb8,0x00,0x02,0x2f,0xba,0x00,0x04,0x00,0x0f,0x00,0x03,0x2b,0xb8,
-0x00,0x04,0x10,0xb8,0x00,0x00,0xd0,0xba,0x00,0x0b,0x00,0x06,0x00,0x02,0x11,0x12,
-0x39,0xba,0x00,0x0d,0x00,0x06,0x00,0x02,0x11,0x12,0x39,0xba,0x00,0x11,0x00,0x06,
-0x00,0x02,0x11,0x12,0x39,0xb8,0x00,0x0f,0x10,0xb8,0x00,0x12,0xd0,0xba,0x00,0x13,
-0x00,0x06,0x00,0x02,0x11,0x12,0x39,0x30,0x31,0x13,0x21,0x1b,0x01,0x21,0x01,0x13,
-0x09,0x01,0x13,0x37,0x03,0x09,0x01,0x03,0x01,0x21,0x0b,0x01,0x21,0x85,0x02,0x57,
-0xba,0xbb,0x02,0x56,0xfe,0x1c,0xba,0xfe,0x19,0xfe,0x1a,0xb9,0x44,0x8c,0x01,0x75,
-0x01,0x80,0x98,0x01,0x8f,0xfe,0x1a,0x91,0x8e,0xfe,0x18,0x03,0x90,0x02,0x39,0xfd,
-0xc7,0xfe,0x9f,0xfd,0xc8,0x01,0x60,0xfe,0xa0,0x02,0x38,0x15,0xfe,0x4e,0x01,0x0c,
-0xfe,0xe6,0x01,0xc2,0x01,0x18,0x01,0xb7,0xfe,0x49,0x00,0x01,0x00,0xaa,0x00,0x04,
-0x03,0xeb,0x05,0xd5,0x00,0x11,0x00,0x37,0x00,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x10,
-0x2f,0xb8,0x00,0x08,0x2f,0xba,0x00,0x06,0x00,0x08,0x00,0x00,0x11,0x12,0x39,0xba,
-0x00,0x07,0x00,0x08,0x00,0x00,0x11,0x12,0x39,0xba,0x00,0x09,0x00,0x08,0x00,0x00,
-0x11,0x12,0x39,0xba,0x00,0x0a,0x00,0x08,0x00,0x00,0x11,0x12,0x39,0x30,0x31,0x01,
-0x16,0x17,0x14,0x07,0x09,0x01,0x37,0x13,0x25,0x37,0x01,0x26,0x35,0x34,0x37,0x01,
-0x36,0x03,0xb0,0x39,0x02,0x09,0xfd,0x7d,0x01,0xee,0x56,0x26,0xfe,0x37,0xe0,0xfd,
-0xdd,0x13,0x41,0x02,0x93,0x0b,0x05,0xd5,0x02,0x36,0x24,0x0c,0xfd,0x85,0xfd,0xf4,
-0xe6,0xfe,0x38,0x27,0x5e,0x02,0x34,0x17,0x17,0x1b,0x3f,0x02,0x86,0x0a,0x00,0x01,
-0x00,0xaa,0x00,0x00,0x06,0x81,0x05,0xd9,0x00,0x19,0x00,0x27,0xba,0x00,0x13,0x00,
-0x17,0x00,0x03,0x2b,0xb8,0x00,0x13,0x10,0x00,0xb8,0x00,0x15,0x2f,0xba,0x00,0x01,
-0x00,0x05,0x00,0x03,0x2b,0xb8,0x00,0x01,0x10,0xb8,0x00,0x05,0x10,0xb8,0x00,0x11,
-0xd0,0x30,0x31,0x13,0x21,0x32,0x15,0x14,0x07,0x09,0x01,0x37,0x13,0x25,0x37,0x01,
-0x26,0x35,0x34,0x37,0x01,0x21,0x11,0x06,0x07,0x26,0x27,0x11,0x36,0xed,0x05,0x49,
-0x40,0x1b,0xfd,0xc1,0x01,0xe7,0x59,0x25,0xfe,0x31,0xe7,0xfd,0xef,0x0f,0x34,0x01,
-0xe5,0xfb,0xa8,0x01,0x48,0x46,0x01,0x01,0x05,0xd9,0x53,0x22,0x1b,0xfd,0xc5,0xfe,
-0x1b,0xd5,0xfe,0x3d,0x22,0x6c,0x02,0x16,0x10,0x2d,0x1c,0x32,0x01,0xdf,0xfa,0xfc,
-0x44,0x01,0x01,0x43,0x05,0x5b,0x39,0x00,0x00,0x03,0x00,0xaa,0x00,0x00,0x06,0x82,
-0x05,0xd8,0x00,0x0d,0x00,0x1b,0x00,0x29,0x01,0x11,0xba,0x00,0x0e,0x00,0x06,0x00,
-0x03,0x2b,0xb8,0x00,0x0e,0x10,0xba,0x00,0x1c,0x00,0x22,0x00,0x03,0x2b,0xb8,0x00,
-0x1c,0x10,0xba,0x00,0x00,0x00,0x14,0x00,0x03,0x2b,0xb8,0x00,0x00,0x10,0x41,0x1b,
-0x00,0x16,0x00,0x0e,0x00,0x26,0x00,0x0e,0x00,0x36,0x00,0x0e,0x00,0x46,0x00,0x0e,
-0x00,0x56,0x00,0x0e,0x00,0x66,0x00,0x0e,0x00,0x76,0x00,0x0e,0x00,0x86,0x00,0x0e,
-0x00,0x96,0x00,0x0e,0x00,0xa6,0x00,0x0e,0x00,0xb6,0x00,0x0e,0x00,0xc6,0x00,0x0e,
-0x00,0xd6,0x00,0x0e,0x00,0x0d,0x5d,0x41,0x05,0x00,0xe5,0x00,0x0e,0x00,0xf5,0x00,
-0x0e,0x00,0x02,0x5d,0x41,0x05,0x00,0xea,0x00,0x14,0x00,0xfa,0x00,0x14,0x00,0x02,
-0x5d,0x41,0x1b,0x00,0x19,0x00,0x14,0x00,0x29,0x00,0x14,0x00,0x39,0x00,0x14,0x00,
-0x49,0x00,0x14,0x00,0x59,0x00,0x14,0x00,0x69,0x00,0x14,0x00,0x79,0x00,0x14,0x00,
-0x89,0x00,0x14,0x00,0x99,0x00,0x14,0x00,0xa9,0x00,0x14,0x00,0xb9,0x00,0x14,0x00,
-0xc9,0x00,0x14,0x00,0xd9,0x00,0x14,0x00,0x0d,0x5d,0x41,0x1b,0x00,0x16,0x00,0x1c,
-0x00,0x26,0x00,0x1c,0x00,0x36,0x00,0x1c,0x00,0x46,0x00,0x1c,0x00,0x56,0x00,0x1c,
-0x00,0x66,0x00,0x1c,0x00,0x76,0x00,0x1c,0x00,0x86,0x00,0x1c,0x00,0x96,0x00,0x1c,
-0x00,0xa6,0x00,0x1c,0x00,0xb6,0x00,0x1c,0x00,0xc6,0x00,0x1c,0x00,0xd6,0x00,0x1c,
-0x00,0x0d,0x5d,0x41,0x05,0x00,0xe5,0x00,0x1c,0x00,0xf5,0x00,0x1c,0x00,0x02,0x5d,
-0x00,0xba,0x00,0x11,0x00,0x03,0x00,0x03,0x2b,0xb8,0x00,0x11,0x10,0xba,0x00,0x0a,
-0x00,0x18,0x00,0x03,0x2b,0xb8,0x00,0x0a,0x10,0x30,0x31,0x01,0x10,0x00,0x21,0x20,
-0x00,0x11,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x05,0x10,0x00,0x21,0x20,0x00,0x11,
-0x34,0x02,0x24,0x23,0x22,0x04,0x02,0x05,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x3e,
-0x01,0x33,0x32,0x1e,0x01,0x06,0x82,0xfe,0x4a,0xfe,0xc9,0xfe,0xcb,0xfe,0x4a,0xc9,
-0x01,0x68,0xba,0xbd,0x01,0x68,0xc8,0xfa,0x71,0x01,0x8a,0x01,0x18,0x01,0x18,0x01,
-0x8a,0xb4,0xfe,0xbc,0xaa,0xaa,0xfe,0xbc,0xb4,0x03,0x5e,0x6d,0x4e,0x4d,0x6e,0x32,
-0x5a,0x2f,0x2f,0x5a,0x32,0x02,0xec,0xfe,0xc9,0xfe,0x4b,0x01,0xb5,0x01,0x37,0xc2,
-0x01,0x69,0xc1,0xc1,0xfe,0x99,0xc4,0xfe,0xe8,0xfe,0x77,0x01,0x89,0x01,0x18,0xb1,
-0x01,0x42,0xae,0xae,0xfe,0xbe,0xb1,0x4e,0x6d,0x6d,0x4e,0x31,0x5a,0x30,0x30,0x5a,
-0x00,0x03,0x00,0x7d,0x00,0x00,0x06,0x9f,0x05,0xd1,0x00,0x0b,0x00,0x17,0x00,0x47,
-0x00,0xff,0xb8,0x00,0x48,0x2f,0xb8,0x00,0x49,0x2f,0xb8,0x00,0x46,0xdc,0xb8,0x00,
-0x28,0xdc,0x41,0x05,0x00,0xea,0x00,0x28,0x00,0xfa,0x00,0x28,0x00,0x02,0x5d,0x41,
-0x1b,0x00,0x19,0x00,0x28,0x00,0x29,0x00,0x28,0x00,0x39,0x00,0x28,0x00,0x49,0x00,
-0x28,0x00,0x59,0x00,0x28,0x00,0x69,0x00,0x28,0x00,0x79,0x00,0x28,0x00,0x89,0x00,
-0x28,0x00,0x99,0x00,0x28,0x00,0xa9,0x00,0x28,0x00,0xb9,0x00,0x28,0x00,0xc9,0x00,
-0x28,0x00,0xd9,0x00,0x28,0x00,0x0d,0x5d,0xb8,0x00,0x48,0x10,0xb8,0x00,0x40,0xd0,
-0xb8,0x00,0x40,0x2f,0xb8,0x00,0x2e,0xdc,0x41,0x1b,0x00,0x16,0x00,0x2e,0x00,0x26,
-0x00,0x2e,0x00,0x36,0x00,0x2e,0x00,0x46,0x00,0x2e,0x00,0x56,0x00,0x2e,0x00,0x66,
-0x00,0x2e,0x00,0x76,0x00,0x2e,0x00,0x86,0x00,0x2e,0x00,0x96,0x00,0x2e,0x00,0xa6,
-0x00,0x2e,0x00,0xb6,0x00,0x2e,0x00,0xc6,0x00,0x2e,0x00,0xd6,0x00,0x2e,0x00,0x0d,
-0x5d,0x41,0x05,0x00,0xe5,0x00,0x2e,0x00,0xf5,0x00,0x2e,0x00,0x02,0x5d,0xb8,0x00,
-0x40,0x10,0xb8,0x00,0x3a,0xd0,0xb8,0x00,0x3a,0x2f,0x00,0xb8,0x00,0x1f,0x2f,0xb8,
-0x00,0x37,0x2f,0xba,0x00,0x43,0x00,0x2b,0x00,0x03,0x2b,0xb8,0x00,0x43,0x10,0xba,
-0x00,0x30,0x00,0x0c,0x00,0x03,0x2b,0xb8,0x00,0x30,0x10,0xb8,0x00,0x0c,0x10,0xb8,
-0x00,0x00,0xd0,0xb8,0x00,0x37,0x10,0xb8,0x00,0x12,0xdc,0xb8,0x00,0x06,0xd0,0xb8,
-0x00,0x06,0x2f,0xb8,0x00,0x30,0x10,0xb8,0x00,0x26,0xd0,0xb8,0x00,0x26,0x2f,0x30,
-0x31,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x21,0x22,0x06,
-0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x25,0x16,0x17,0x16,0x15,0x14,0x06,
-0x23,0x22,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x35,0x34,0x24,0x23,0x22,0x04,0x15,
-0x14,0x17,0x16,0x17,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x36,0x37,
-0x26,0x35,0x34,0x00,0x21,0x20,0x00,0x15,0x14,0x05,0x67,0x4a,0x67,0x67,0x4a,0x49,
-0x68,0x67,0xfc,0x03,0x49,0x68,0x68,0x49,0x4a,0x67,0x67,0x04,0x17,0x19,0x16,0x5b,
-0xb6,0x82,0x81,0xb6,0x5a,0x51,0x6f,0x79,0xfe,0xb1,0xf0,0xf0,0xfe,0xb1,0x79,0x7d,
-0x57,0x5a,0xb6,0x82,0x80,0xb7,0x5b,0x12,0x13,0x7a,0x01,0xc0,0x01,0x41,0x01,0x44,
-0x01,0xc0,0x01,0xe9,0x67,0x4a,0x49,0x67,0x67,0x49,0x4a,0x67,0x67,0x4a,0x49,0x68,
-0x68,0x49,0x4a,0x67,0x55,0x11,0x16,0x5c,0x82,0x81,0xb7,0xb7,0x81,0x82,0x5c,0x51,
-0x09,0x73,0x99,0xb4,0xfd,0xfd,0xb4,0x99,0x72,0x04,0x57,0x5c,0x82,0x82,0xb7,0xb7,
-0x82,0x82,0x5c,0x11,0x0f,0x8e,0xb6,0xf8,0x01,0x5e,0xfe,0xa2,0xf8,0xb1,0x00,0x03,
-0x00,0x7d,0x00,0x00,0x06,0x9f,0x05,0xc9,0x00,0x0b,0x00,0x17,0x00,0x47,0x01,0x03,
-0xb8,0x00,0x48,0x2f,0xb8,0x00,0x49,0x2f,0xb8,0x00,0x18,0xdc,0xb8,0x00,0x48,0x10,
-0xb8,0x00,0x24,0xd0,0xb8,0x00,0x24,0x2f,0xb8,0x00,0x1e,0xd0,0xb8,0x00,0x1e,0x2f,
-0xb8,0x00,0x24,0x10,0xb8,0x00,0x30,0xdc,0x41,0x1b,0x00,0x16,0x00,0x30,0x00,0x26,
-0x00,0x30,0x00,0x36,0x00,0x30,0x00,0x46,0x00,0x30,0x00,0x56,0x00,0x30,0x00,0x66,
-0x00,0x30,0x00,0x76,0x00,0x30,0x00,0x86,0x00,0x30,0x00,0x96,0x00,0x30,0x00,0xa6,
-0x00,0x30,0x00,0xb6,0x00,0x30,0x00,0xc6,0x00,0x30,0x00,0xd6,0x00,0x30,0x00,0x0d,
-0x5d,0x41,0x05,0x00,0xe5,0x00,0x30,0x00,0xf5,0x00,0x30,0x00,0x02,0x5d,0xb8,0x00,
-0x18,0x10,0xb8,0x00,0x36,0xdc,0x41,0x05,0x00,0xea,0x00,0x36,0x00,0xfa,0x00,0x36,
-0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,0x36,0x00,0x29,0x00,0x36,0x00,0x39,0x00,
-0x36,0x00,0x49,0x00,0x36,0x00,0x59,0x00,0x36,0x00,0x69,0x00,0x36,0x00,0x79,0x00,
-0x36,0x00,0x89,0x00,0x36,0x00,0x99,0x00,0x36,0x00,0xa9,0x00,0x36,0x00,0xb9,0x00,
-0x36,0x00,0xc9,0x00,0x36,0x00,0xd9,0x00,0x36,0x00,0x0d,0x5d,0x00,0xba,0x00,0x33,
-0x00,0x1b,0x00,0x03,0x2b,0xb8,0x00,0x33,0x10,0xba,0x00,0x3f,0x00,0x03,0x00,0x03,
-0x2b,0xb8,0x00,0x3f,0x10,0xba,0x00,0x15,0x00,0x2e,0x00,0x03,0x2b,0xb8,0x00,0x15,
-0x10,0xb8,0x00,0x09,0xd0,0xb8,0x00,0x09,0x2f,0xb8,0x00,0x03,0x10,0xb8,0x00,0x0f,
-0xd0,0xb8,0x00,0x3f,0x10,0xb8,0x00,0x27,0xd0,0xb8,0x00,0x2e,0x10,0xb8,0x00,0x38,
-0xd0,0x30,0x31,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x25,
-0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x14,0x00,0x21,0x20,
-0x00,0x35,0x34,0x37,0x26,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,
-0x06,0x07,0x06,0x15,0x14,0x04,0x33,0x32,0x24,0x35,0x34,0x27,0x26,0x27,0x26,0x35,
-0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x07,0x16,0x06,0x18,0x68,0x49,0x4a,
-0x67,0x67,0x4a,0x4a,0x67,0xfc,0x4d,0x67,0x4a,0x49,0x68,0x68,0x49,0x4a,0x67,0x04,
-0x23,0xfe,0x40,0xfe,0xbc,0xfe,0xbf,0xfe,0x40,0x7a,0x13,0x12,0x5b,0xb7,0x80,0x82,
-0xb6,0x5a,0x57,0x7d,0x79,0x01,0x4f,0xf0,0xf0,0x01,0x4f,0x79,0x6f,0x51,0x5a,0xb6,
-0x81,0x82,0xb6,0x5b,0x16,0x19,0x73,0x04,0x91,0x49,0x68,0x68,0x49,0x4a,0x67,0x67,
-0x4a,0x4a,0x67,0x67,0x4a,0x49,0x67,0x67,0xfe,0x0c,0xf7,0xfe,0xa3,0x01,0x5d,0xf7,
-0xb4,0x8d,0x0f,0x12,0x5b,0x81,0x81,0xb6,0xb6,0x81,0x81,0x5b,0x58,0x03,0x72,0x97,
-0xb4,0xfb,0xfb,0xb4,0x98,0x71,0x09,0x51,0x5c,0x81,0x81,0xb6,0xb6,0x81,0x81,0x5c,
-0x16,0x11,0x8b,0x00,0x00,0x02,0x00,0x7d,0xff,0xfd,0x04,0xe2,0x05,0xc6,0x00,0x0b,
-0x00,0x1d,0x00,0xd7,0xb8,0x00,0x1e,0x2f,0xb8,0x00,0x1f,0x2f,0xb8,0x00,0x1e,0x10,
-0xb8,0x00,0x16,0xd0,0xb8,0x00,0x16,0x2f,0xb8,0x00,0x03,0xdc,0x41,0x1b,0x00,0x16,
-0x00,0x03,0x00,0x26,0x00,0x03,0x00,0x36,0x00,0x03,0x00,0x46,0x00,0x03,0x00,0x56,
-0x00,0x03,0x00,0x66,0x00,0x03,0x00,0x76,0x00,0x03,0x00,0x86,0x00,0x03,0x00,0x96,
-0x00,0x03,0x00,0xa6,0x00,0x03,0x00,0xb6,0x00,0x03,0x00,0xc6,0x00,0x03,0x00,0xd6,
-0x00,0x03,0x00,0x0d,0x5d,0x41,0x05,0x00,0xe5,0x00,0x03,0x00,0xf5,0x00,0x03,0x00,
-0x02,0x5d,0xb8,0x00,0x1f,0x10,0xb8,0x00,0x10,0xdc,0xb8,0x00,0x09,0xdc,0x41,0x05,
-0x00,0xea,0x00,0x09,0x00,0xfa,0x00,0x09,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,
-0x09,0x00,0x29,0x00,0x09,0x00,0x39,0x00,0x09,0x00,0x49,0x00,0x09,0x00,0x59,0x00,
-0x09,0x00,0x69,0x00,0x09,0x00,0x79,0x00,0x09,0x00,0x89,0x00,0x09,0x00,0x99,0x00,
-0x09,0x00,0xa9,0x00,0x09,0x00,0xb9,0x00,0x09,0x00,0xc9,0x00,0x09,0x00,0xd9,0x00,
-0x09,0x00,0x0d,0x5d,0xb8,0x00,0x0c,0xd0,0xb8,0x00,0x0c,0x2f,0x00,0xb8,0x00,0x1c,
-0x2f,0xba,0x00,0x06,0x00,0x13,0x00,0x03,0x2b,0xb8,0x00,0x06,0x10,0xba,0x00,0x19,
-0x00,0x00,0x00,0x03,0x2b,0xb8,0x00,0x19,0x10,0x30,0x31,0x01,0x22,0x06,0x15,0x14,
-0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x37,0x16,0x17,0x16,0x15,0x14,0x00,0x23,0x22,
-0x00,0x35,0x34,0x00,0x33,0x32,0x17,0x01,0x17,0x02,0x86,0x8f,0xc9,0xc9,0x8f,0x8e,
-0xc9,0xc7,0xbe,0x13,0x12,0x98,0xfe,0xce,0xd9,0xd7,0xfe,0xce,0x01,0x2f,0xda,0x60,
-0x54,0x01,0x0e,0x9a,0x03,0x5f,0xc8,0x90,0x8e,0xc9,0xc9,0x8e,0x90,0xc8,0x3b,0x10,
-0x13,0x99,0xd8,0xd8,0xfe,0xcf,0x01,0x31,0xd8,0xd8,0x01,0x32,0x1d,0x01,0xd3,0x59,
-0x00,0x03,0x00,0x7d,0x00,0x01,0x07,0x9e,0x05,0xc9,0x00,0x0b,0x00,0x17,0x00,0x37,
-0x01,0x7f,0xba,0x00,0x03,0x00,0x20,0x00,0x03,0x2b,0xb8,0x00,0x03,0x10,0xba,0x00,
-0x1a,0x00,0x09,0x00,0x03,0x2b,0xb8,0x00,0x1a,0x10,0xba,0x00,0x0f,0x00,0x2a,0x00,
-0x03,0x2b,0xb8,0x00,0x0f,0x10,0xba,0x00,0x30,0x00,0x15,0x00,0x03,0x2b,0xb8,0x00,
-0x30,0x10,0x41,0x1b,0x00,0x16,0x00,0x03,0x00,0x26,0x00,0x03,0x00,0x36,0x00,0x03,
-0x00,0x46,0x00,0x03,0x00,0x56,0x00,0x03,0x00,0x66,0x00,0x03,0x00,0x76,0x00,0x03,
-0x00,0x86,0x00,0x03,0x00,0x96,0x00,0x03,0x00,0xa6,0x00,0x03,0x00,0xb6,0x00,0x03,
-0x00,0xc6,0x00,0x03,0x00,0xd6,0x00,0x03,0x00,0x0d,0x5d,0x41,0x05,0x00,0xe5,0x00,
-0x03,0x00,0xf5,0x00,0x03,0x00,0x02,0x5d,0x41,0x05,0x00,0xea,0x00,0x15,0x00,0xfa,
-0x00,0x15,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,0x15,0x00,0x29,0x00,0x15,0x00,
-0x39,0x00,0x15,0x00,0x49,0x00,0x15,0x00,0x59,0x00,0x15,0x00,0x69,0x00,0x15,0x00,
-0x79,0x00,0x15,0x00,0x89,0x00,0x15,0x00,0x99,0x00,0x15,0x00,0xa9,0x00,0x15,0x00,
-0xb9,0x00,0x15,0x00,0xc9,0x00,0x15,0x00,0xd9,0x00,0x15,0x00,0x0d,0x5d,0x41,0x1b,
-0x00,0x16,0x00,0x1a,0x00,0x26,0x00,0x1a,0x00,0x36,0x00,0x1a,0x00,0x46,0x00,0x1a,
-0x00,0x56,0x00,0x1a,0x00,0x66,0x00,0x1a,0x00,0x76,0x00,0x1a,0x00,0x86,0x00,0x1a,
-0x00,0x96,0x00,0x1a,0x00,0xa6,0x00,0x1a,0x00,0xb6,0x00,0x1a,0x00,0xc6,0x00,0x1a,
-0x00,0xd6,0x00,0x1a,0x00,0x0d,0x5d,0x41,0x05,0x00,0xe5,0x00,0x1a,0x00,0xf5,0x00,
-0x1a,0x00,0x02,0x5d,0x41,0x05,0x00,0xea,0x00,0x2a,0x00,0xfa,0x00,0x2a,0x00,0x02,
-0x5d,0x41,0x1b,0x00,0x19,0x00,0x2a,0x00,0x29,0x00,0x2a,0x00,0x39,0x00,0x2a,0x00,
-0x49,0x00,0x2a,0x00,0x59,0x00,0x2a,0x00,0x69,0x00,0x2a,0x00,0x79,0x00,0x2a,0x00,
-0x89,0x00,0x2a,0x00,0x99,0x00,0x2a,0x00,0xa9,0x00,0x2a,0x00,0xb9,0x00,0x2a,0x00,
-0xc9,0x00,0x2a,0x00,0xd9,0x00,0x2a,0x00,0x0d,0x5d,0xb8,0x00,0x39,0xdc,0x00,0xba,
-0x00,0x06,0x00,0x1d,0x00,0x03,0x2b,0xb8,0x00,0x06,0x10,0xba,0x00,0x2d,0x00,0x0c,
-0x00,0x03,0x2b,0xb8,0x00,0x2d,0x10,0xba,0x00,0x12,0x00,0x33,0x00,0x03,0x2b,0xb8,
-0x00,0x12,0x10,0xba,0x00,0x23,0x00,0x00,0x00,0x03,0x2b,0xb8,0x00,0x23,0x10,0x30,
-0x31,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x22,0x06,
-0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x16,0x15,0x14,0x00,0x23,0x22,
-0x00,0x35,0x34,0x00,0x33,0x32,0x17,0x16,0x17,0x37,0x26,0x35,0x34,0x00,0x33,0x32,
-0x00,0x15,0x14,0x00,0x23,0x22,0x27,0x26,0x27,0x02,0x33,0x78,0xa9,0xa9,0x78,0x78,
-0xa9,0xa8,0x03,0x3a,0x79,0xa8,0xa8,0x79,0x78,0xa9,0xa8,0xfd,0x66,0x26,0xfe,0xff,
-0xb7,0xb5,0xfe,0xff,0x00,0xff,0xb7,0xb9,0x80,0x02,0x02,0xdc,0x1c,0x00,0xff,0xb7,
-0xb8,0x01,0x00,0xfe,0xff,0xb7,0xb5,0x81,0x0b,0x0b,0x02,0xda,0xa9,0x78,0x78,0xa9,
-0xa9,0x78,0x78,0xa9,0x02,0x5a,0xa9,0x78,0x78,0xa9,0xa9,0x78,0x78,0xa9,0xfd,0x3b,
-0x54,0x64,0xb5,0xfe,0xff,0x01,0x01,0xb5,0xb7,0x01,0x01,0x80,0x03,0x02,0x89,0x49,
-0x55,0xb7,0x01,0x01,0xfe,0xff,0xb7,0xb5,0xfe,0xff,0x81,0x0b,0x0c,0x00,0x00,0x0e,
-0x00,0x8c,0x00,0x00,0x09,0x6b,0x05,0xd5,0x00,0x17,0x00,0x29,0x00,0x35,0x00,0x41,
-0x00,0x4d,0x00,0x59,0x00,0x65,0x00,0x71,0x00,0x7d,0x00,0x89,0x00,0x95,0x00,0xa1,
-0x00,0xad,0x00,0xb9,0x00,0x85,0xba,0x00,0x42,0x00,0x48,0x00,0x03,0x2b,0xb8,0x00,
-0x42,0x10,0x41,0x05,0x00,0xea,0x00,0x48,0x00,0xfa,0x00,0x48,0x00,0x02,0x5d,0x41,
-0x1b,0x00,0x19,0x00,0x48,0x00,0x29,0x00,0x48,0x00,0x39,0x00,0x48,0x00,0x49,0x00,
-0x48,0x00,0x59,0x00,0x48,0x00,0x69,0x00,0x48,0x00,0x79,0x00,0x48,0x00,0x89,0x00,
-0x48,0x00,0x99,0x00,0x48,0x00,0xa9,0x00,0x48,0x00,0xb9,0x00,0x48,0x00,0xc9,0x00,
-0x48,0x00,0xd9,0x00,0x48,0x00,0x0d,0x5d,0xb8,0x00,0x4e,0xd0,0xb8,0x00,0x48,0x10,
-0xb8,0x00,0x54,0xd0,0x00,0xba,0x00,0x2d,0x00,0x21,0x00,0x03,0x2b,0xb8,0x00,0x2d,
-0x10,0xba,0x00,0x01,0x00,0x0c,0x00,0x03,0x2b,0xb8,0x00,0x01,0x10,0xba,0x00,0x29,
-0x00,0x33,0x00,0x03,0x2b,0xb8,0x00,0x29,0x10,0x30,0x31,0x01,0x33,0x04,0x05,0x04,
-0x15,0x06,0x27,0x25,0x26,0x37,0x36,0x27,0x21,0x06,0x17,0x16,0x07,0x05,0x06,0x27,
-0x34,0x25,0x24,0x01,0x35,0x33,0x15,0x14,0x17,0x16,0x19,0x01,0x21,0x11,0x10,0x37,
-0x36,0x3d,0x01,0x33,0x15,0x03,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,
-0x06,0x05,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x27,0x14,0x06,
-0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x11,0x14,0x06,0x23,0x22,0x26,0x35,
-0x34,0x36,0x33,0x32,0x16,0x03,0x16,0x06,0x07,0x06,0x26,0x27,0x26,0x36,0x37,0x36,
-0x16,0x01,0x16,0x06,0x07,0x06,0x26,0x27,0x26,0x36,0x37,0x36,0x16,0x01,0x1e,0x01,
-0x07,0x0e,0x01,0x27,0x2e,0x01,0x37,0x3e,0x01,0x05,0x1e,0x01,0x07,0x0e,0x01,0x27,
-0x2e,0x01,0x37,0x3e,0x01,0x05,0x36,0x16,0x17,0x16,0x06,0x07,0x06,0x26,0x27,0x26,
-0x36,0x25,0x36,0x16,0x17,0x16,0x06,0x07,0x06,0x26,0x27,0x26,0x36,0x01,0x3e,0x01,
-0x17,0x1e,0x01,0x07,0x0e,0x01,0x27,0x2e,0x01,0x01,0x3e,0x01,0x17,0x1e,0x01,0x07,
-0x0e,0x01,0x27,0x2e,0x01,0x04,0xf7,0x09,0x02,0x5b,0x01,0x01,0x01,0x0f,0x26,0x72,
-0xfe,0x69,0x58,0x28,0x74,0x52,0xfb,0x9c,0x53,0x75,0x28,0x59,0xfe,0x69,0x71,0x27,
-0x01,0x10,0x01,0x00,0x03,0x4c,0x90,0xf1,0xe7,0xf9,0x57,0xe8,0xf0,0x91,0xab,0xec,
-0xa5,0xa8,0xea,0xe9,0xa9,0xa7,0xea,0x02,0x72,0x83,0x5e,0x5d,0x83,0x83,0x5d,0x5e,
-0x83,0x9f,0x20,0x18,0x17,0x21,0x21,0x17,0x18,0x20,0x20,0x18,0x17,0x21,0x21,0x17,
-0x18,0x20,0xc4,0x0d,0x06,0x13,0x13,0x2e,0x0e,0x0e,0x08,0x13,0x13,0x2e,0x01,0x7f,
-0x0f,0x07,0x14,0x13,0x2d,0x0f,0x0d,0x07,0x13,0x13,0x2e,0xfe,0x0c,0x18,0x14,0x07,
-0x07,0x2a,0x16,0x16,0x16,0x07,0x08,0x29,0x02,0x6e,0x16,0x15,0x07,0x08,0x29,0x16,
-0x16,0x15,0x07,0x08,0x29,0xfd,0x9c,0x16,0x2a,0x07,0x07,0x14,0x16,0x18,0x29,0x08,
-0x07,0x16,0x02,0x6d,0x16,0x29,0x08,0x07,0x15,0x16,0x16,0x2b,0x06,0x07,0x15,0xfe,
-0x15,0x0e,0x2e,0x13,0x13,0x08,0x0f,0x0d,0x2e,0x13,0x13,0x08,0x01,0x80,0x0f,0x2d,
-0x13,0x14,0x07,0x0f,0x0d,0x2e,0x13,0x13,0x07,0x05,0xd5,0x11,0x9b,0xa4,0xaa,0xa2,
-0x0a,0x8c,0x1a,0x4f,0x79,0x08,0x08,0x79,0x4f,0x1a,0x8c,0x0a,0xa2,0xaa,0xa4,0x99,
-0xfe,0x76,0x4b,0x98,0x4b,0x39,0x5f,0xfe,0xe2,0xfe,0x16,0x01,0xea,0x01,0x1e,0x5f,
-0x39,0x4b,0x98,0x4b,0xfd,0xdd,0xa7,0xea,0xea,0xa7,0xa6,0xec,0xec,0xa5,0x5d,0x84,
-0x84,0x5d,0x5f,0x83,0x83,0xde,0x16,0x22,0x22,0x16,0x18,0x22,0x22,0xfd,0x73,0x18,
-0x21,0x21,0x18,0x17,0x22,0x22,0x02,0x44,0x13,0x2e,0x0d,0x0f,0x07,0x13,0x14,0x2d,
-0x0f,0x0d,0x07,0xfd,0xf0,0x13,0x2e,0x0f,0x0d,0x07,0x14,0x13,0x2d,0x0e,0x0d,0x06,
-0x01,0x61,0x08,0x29,0x16,0x16,0x15,0x06,0x07,0x2a,0x17,0x16,0x15,0xca,0x07,0x2a,
-0x16,0x16,0x15,0x08,0x07,0x29,0x17,0x16,0x14,0x07,0x07,0x14,0x16,0x18,0x29,0x08,
-0x06,0x15,0x16,0x16,0x2a,0xca,0x07,0x15,0x16,0x16,0x29,0x08,0x07,0x15,0x16,0x16,
-0x29,0xfe,0x94,0x12,0x07,0x0d,0x0e,0x2f,0x11,0x14,0x07,0x0d,0x0f,0x2e,0x02,0x10,
-0x13,0x07,0x0d,0x0f,0x2d,0x14,0x13,0x07,0x0f,0x0d,0x2e,0x00,0x00,0x10,0x00,0x91,
-0x00,0x00,0x09,0x70,0x05,0xd5,0x00,0x11,0x00,0x1d,0x00,0x29,0x00,0x35,0x00,0x41,
-0x00,0x4d,0x00,0x59,0x00,0x65,0x00,0x71,0x00,0x7d,0x00,0x89,0x00,0x95,0x00,0xa1,
-0x00,0xb3,0x00,0xce,0x00,0xe8,0x01,0x05,0xba,0x00,0x08,0x00,0xab,0x00,0x03,0x2b,
-0xb8,0x00,0x08,0x10,0xba,0x00,0x21,0x00,0x1b,0x00,0x03,0x2b,0xb8,0x00,0x21,0x10,
-0xba,0x00,0xa5,0x00,0x27,0x00,0x03,0x2b,0xb8,0x00,0xa5,0x10,0xba,0x00,0xaa,0x00,
-0x09,0x00,0x03,0x2b,0xb8,0x00,0xaa,0x10,0xb8,0x00,0x27,0x10,0xb8,0x00,0x15,0xdc,
-0x41,0x1b,0x00,0x16,0x00,0x21,0x00,0x26,0x00,0x21,0x00,0x36,0x00,0x21,0x00,0x46,
-0x00,0x21,0x00,0x56,0x00,0x21,0x00,0x66,0x00,0x21,0x00,0x76,0x00,0x21,0x00,0x86,
-0x00,0x21,0x00,0x96,0x00,0x21,0x00,0xa6,0x00,0x21,0x00,0xb6,0x00,0x21,0x00,0xc6,
-0x00,0x21,0x00,0xd6,0x00,0x21,0x00,0x0d,0x5d,0x41,0x05,0x00,0xe5,0x00,0x21,0x00,
-0xf5,0x00,0x21,0x00,0x02,0x5d,0xb8,0x00,0x27,0x10,0xb8,0x00,0xa2,0xd0,0xb8,0x00,
-0xa2,0x2f,0xb8,0x00,0x21,0x10,0xb8,0x00,0xb0,0xdc,0xb8,0x00,0x21,0x10,0xb8,0x00,
-0xb2,0xd0,0xb8,0x00,0xb2,0x2f,0xb8,0x00,0xaa,0x10,0xb8,0x00,0xea,0xdc,0x00,0xb8,
-0x00,0xbf,0x2f,0xb8,0x00,0xc1,0x2f,0xb8,0x00,0xc3,0x2f,0xba,0x00,0x09,0x00,0xaa,
-0x00,0x03,0x2b,0xb8,0x00,0x09,0x10,0xba,0x00,0x24,0x00,0x18,0x00,0x03,0x2b,0xb8,
-0x00,0x24,0x10,0xba,0x00,0xb2,0x00,0x00,0x00,0x03,0x2b,0xb8,0x00,0xb2,0x10,0xba,
-0x00,0x12,0x00,0x1e,0x00,0x03,0x2b,0xb8,0x00,0x12,0x10,0xb8,0x00,0xb2,0x10,0xb8,
-0x00,0xa3,0xd0,0xb8,0x00,0x00,0x10,0xb8,0x00,0xb3,0xdc,0xb8,0x00,0xbf,0x10,0xb8,
-0x00,0xb4,0xdc,0xb8,0x00,0x00,0x10,0xb8,0x00,0xe8,0xdc,0x30,0x31,0x01,0x35,0x23,
-0x15,0x06,0x07,0x06,0x15,0x11,0x21,0x11,0x34,0x27,0x26,0x27,0x35,0x23,0x15,0x05,
-0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x17,0x22,0x06,0x15,0x14,
-0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,
-0x35,0x34,0x26,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x03,
-0x0e,0x01,0x17,0x1e,0x01,0x37,0x3e,0x01,0x27,0x2e,0x01,0x01,0x0e,0x01,0x17,0x1e,
-0x01,0x37,0x3e,0x01,0x27,0x2e,0x01,0x01,0x06,0x16,0x17,0x16,0x36,0x37,0x36,0x26,
-0x27,0x26,0x06,0x05,0x06,0x16,0x17,0x16,0x36,0x37,0x36,0x26,0x27,0x26,0x06,0x05,
-0x1e,0x01,0x37,0x3e,0x01,0x27,0x2e,0x01,0x07,0x0e,0x01,0x25,0x1e,0x01,0x37,0x3e,
-0x01,0x27,0x2e,0x01,0x07,0x0e,0x01,0x01,0x16,0x36,0x37,0x36,0x26,0x27,0x26,0x06,
-0x07,0x06,0x16,0x01,0x16,0x36,0x37,0x36,0x26,0x27,0x26,0x06,0x07,0x06,0x16,0x13,
-0x35,0x33,0x15,0x14,0x17,0x16,0x19,0x01,0x21,0x11,0x10,0x37,0x36,0x3d,0x01,0x33,
-0x15,0x25,0x06,0x17,0x16,0x07,0x05,0x06,0x27,0x36,0x37,0x36,0x25,0x16,0x33,0x32,
-0x37,0x04,0x17,0x16,0x17,0x06,0x27,0x25,0x26,0x37,0x36,0x27,0x37,0x16,0x07,0x06,
-0x17,0x05,0x16,0x37,0x26,0x27,0x24,0x25,0x27,0x15,0x23,0x04,0x05,0x06,0x07,0x16,
-0x37,0x25,0x36,0x27,0x26,0x37,0x03,0xec,0x31,0x0f,0xcb,0xc3,0x05,0x9d,0xc4,0xca,
-0x08,0x38,0xfe,0xfa,0xa6,0xe5,0xe6,0xa5,0xa3,0xe7,0xe6,0xa4,0x5c,0x81,0x81,0x5c,
-0x5c,0x81,0x81,0x52,0x17,0x20,0x20,0x17,0x17,0x20,0x20,0x17,0x17,0x20,0x20,0x17,
-0x17,0x20,0x20,0xee,0x12,0x08,0x0d,0x0f,0x2d,0x13,0x12,0x06,0x0d,0x0d,0x2d,0x01,
-0x59,0x13,0x07,0x0d,0x0e,0x2d,0x13,0x13,0x07,0x0e,0x0d,0x2d,0xfd,0xfc,0x07,0x16,
-0x15,0x16,0x29,0x07,0x07,0x14,0x17,0x16,0x29,0x02,0x47,0x07,0x14,0x16,0x15,0x29,
-0x07,0x07,0x14,0x16,0x15,0x29,0xfd,0xab,0x07,0x29,0x17,0x16,0x14,0x07,0x07,0x29,
-0x16,0x15,0x16,0x02,0x55,0x06,0x2a,0x15,0x16,0x14,0x07,0x07,0x29,0x15,0x16,0x14,
-0xfe,0x3e,0x13,0x2d,0x0d,0x0f,0x08,0x12,0x13,0x2d,0x0f,0x0d,0x08,0x01,0x7e,0x13,
-0x2d,0x0d,0x0e,0x07,0x13,0x13,0x2d,0x0e,0x0d,0x07,0x56,0x86,0xe1,0xd8,0xf9,0xc9,
-0xd8,0xe1,0x86,0xfe,0xa9,0x46,0x77,0x44,0x63,0xfe,0x8a,0x80,0x44,0x0d,0xf8,0xf8,
-0x02,0x43,0x18,0x18,0x18,0x18,0x02,0x42,0xf8,0xf8,0x0d,0x44,0x7f,0xfe,0x89,0x63,
-0x44,0x77,0x45,0x19,0x54,0x63,0x3d,0x3d,0x01,0x46,0x5c,0x4a,0x0a,0xec,0xfe,0xc7,
-0xfe,0x24,0x30,0x36,0xfe,0x23,0xfe,0xc7,0xeb,0x0a,0x4a,0x5c,0x01,0x46,0x3d,0x3d,
-0x63,0x53,0x03,0xc2,0x40,0x8e,0x40,0x31,0x41,0xf1,0xfe,0x65,0x01,0x9b,0xf1,0x41,
-0x31,0x40,0x8e,0x40,0x48,0xe7,0xa3,0xa4,0xe6,0xe6,0xa4,0xa3,0xe7,0xad,0x81,0x5c,
-0x5c,0x80,0x80,0x5c,0x5c,0x81,0x93,0x20,0x17,0x17,0x20,0x20,0x17,0x17,0x20,0xfd,
-0x95,0x20,0x17,0x17,0x20,0x20,0x17,0x17,0x20,0x02,0x25,0x0d,0x2d,0x13,0x12,0x08,
-0x0d,0x0f,0x2d,0x13,0x11,0x07,0xfd,0xff,0x0e,0x2d,0x13,0x13,0x07,0x0f,0x0d,0x2c,
-0x13,0x13,0x07,0x01,0x31,0x16,0x29,0x07,0x07,0x14,0x17,0x16,0x29,0x07,0x07,0x16,
-0xd5,0x15,0x29,0x07,0x07,0x15,0x16,0x16,0x28,0x08,0x07,0x14,0x39,0x17,0x14,0x07,
-0x07,0x29,0x15,0x16,0x16,0x07,0x08,0x28,0xa9,0x15,0x16,0x07,0x07,0x29,0x16,0x15,
-0x16,0x07,0x07,0x29,0xfe,0x75,0x0f,0x07,0x13,0x13,0x2d,0x0d,0x0e,0x07,0x13,0x13,
-0x2c,0x01,0xe6,0x0d,0x08,0x12,0x13,0x2d,0x0d,0x0f,0x08,0x12,0x13,0x2d,0x01,0x20,
-0x47,0x9c,0x37,0x37,0x57,0xfe,0xf5,0xfe,0x36,0x01,0xca,0x01,0x0b,0x57,0x37,0x37,
-0x9c,0x47,0xe5,0x10,0x6c,0x5e,0x13,0xa5,0x09,0xd4,0xc7,0x65,0x8b,0x11,0x01,0x01,
-0x11,0x8b,0x65,0xc7,0xd4,0x09,0xa5,0x13,0x5e,0x6c,0x10,0x1c,0x28,0x71,0x2c,0x26,
-0x88,0x24,0xb5,0x9d,0x70,0x81,0x19,0x01,0x01,0x19,0x81,0x70,0x9d,0xb5,0x24,0x88,
-0x26,0x2c,0x71,0x28,0x00,0x02,0x00,0xb8,0x00,0x00,0x06,0x75,0x05,0xd5,0x00,0x07,
-0x00,0x0b,0x00,0x53,0xb8,0x00,0x0c,0x2f,0xb8,0x00,0x0d,0x2f,0xb8,0x00,0x0c,0x10,
-0xb8,0x00,0x06,0xd0,0xb8,0x00,0x06,0x2f,0xb8,0x00,0x00,0xd0,0xb8,0x00,0x00,0x2f,
-0xb8,0x00,0x0d,0x10,0xb8,0x00,0x03,0xdc,0xb8,0x00,0x01,0xd0,0xb8,0x00,0x01,0x2f,
-0xb8,0x00,0x06,0x10,0xb8,0x00,0x09,0xdc,0xb8,0x00,0x03,0x10,0xb8,0x00,0x0a,0xdc,
-0x00,0xba,0x00,0x0a,0x00,0x04,0x00,0x03,0x2b,0xba,0x00,0x00,0x00,0x08,0x00,0x03,
-0x2b,0xb8,0x00,0x00,0x10,0x30,0x31,0x13,0x21,0x17,0x11,0x07,0x21,0x27,0x11,0x17,
-0x11,0x21,0x11,0xbe,0x05,0xb0,0x07,0x07,0xfa,0x50,0x06,0x6e,0x04,0xe0,0x05,0xd5,
-0x07,0xfa,0x38,0x06,0x06,0x05,0xc8,0x68,0xfb,0x08,0x04,0xf8,0x00,0x03,0x00,0xb7,
-0x00,0x00,0x06,0x76,0x05,0xd5,0x00,0x07,0x00,0x0b,0x00,0x22,0x00,0x67,0xb8,0x00,
-0x23,0x2f,0xb8,0x00,0x24,0x2f,0xb8,0x00,0x23,0x10,0xb8,0x00,0x06,0xd0,0xb8,0x00,
-0x06,0x2f,0xb8,0x00,0x00,0xd0,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x24,0x10,0xb8,0x00,
-0x03,0xdc,0xb8,0x00,0x01,0xd0,0xb8,0x00,0x01,0x2f,0xb8,0x00,0x06,0x10,0xb8,0x00,
-0x09,0xdc,0xb8,0x00,0x03,0x10,0xb8,0x00,0x0a,0xdc,0xba,0x00,0x0d,0x00,0x06,0x00,
-0x03,0x11,0x12,0x39,0xba,0x00,0x1d,0x00,0x06,0x00,0x03,0x11,0x12,0x39,0x00,0xba,
-0x00,0x0a,0x00,0x04,0x00,0x03,0x2b,0xba,0x00,0x00,0x00,0x08,0x00,0x03,0x2b,0xb8,
-0x00,0x00,0x10,0x30,0x31,0x13,0x21,0x17,0x11,0x07,0x21,0x27,0x11,0x17,0x11,0x21,
-0x11,0x07,0x15,0x06,0x07,0x00,0x03,0x06,0x23,0x06,0x23,0x02,0x2b,0x01,0x35,0x37,
-0x32,0x17,0x33,0x36,0x37,0x36,0x37,0x36,0xbd,0x05,0xb3,0x06,0x06,0xfa,0x4d,0x06,
-0x6f,0x04,0xe0,0x87,0x4c,0x29,0xfe,0xb9,0x3e,0x06,0x10,0x75,0x0d,0x65,0xcd,0x17,
-0xa2,0x97,0x49,0x06,0x33,0x3f,0x62,0x9b,0x61,0x05,0xd5,0x06,0xfa,0x38,0x07,0x07,
-0x05,0xc8,0x68,0xfb,0x08,0x04,0xf8,0x9e,0x06,0x41,0x3a,0xfe,0x46,0xfe,0xbd,0x3b,
-0x2f,0x01,0x02,0x07,0x49,0x83,0xa6,0x74,0xb3,0xbb,0x78,0x00,0x00,0x03,0x00,0xb7,
-0x00,0x00,0x06,0x76,0x05,0xd5,0x00,0x07,0x00,0x0b,0x00,0x1a,0x00,0x53,0xb8,0x00,
-0x1b,0x2f,0xb8,0x00,0x1c,0x2f,0xb8,0x00,0x1b,0x10,0xb8,0x00,0x06,0xd0,0xb8,0x00,
-0x06,0x2f,0xb8,0x00,0x00,0xd0,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x1c,0x10,0xb8,0x00,
-0x03,0xdc,0xb8,0x00,0x01,0xd0,0xb8,0x00,0x01,0x2f,0xb8,0x00,0x06,0x10,0xb8,0x00,
-0x09,0xdc,0xb8,0x00,0x03,0x10,0xb8,0x00,0x0a,0xdc,0x00,0xba,0x00,0x0a,0x00,0x04,
-0x00,0x03,0x2b,0xba,0x00,0x00,0x00,0x08,0x00,0x03,0x2b,0xb8,0x00,0x00,0x10,0x30,
-0x31,0x13,0x21,0x17,0x11,0x07,0x21,0x27,0x11,0x17,0x11,0x21,0x11,0x05,0x09,0x01,
-0x17,0x09,0x01,0x15,0x07,0x01,0x23,0x01,0x23,0x27,0x09,0x01,0xbd,0x05,0xb3,0x06,
-0x06,0xfa,0x4d,0x06,0x6f,0x04,0xe0,0xfb,0xf7,0x01,0x9b,0x01,0x97,0x5f,0xfe,0x68,
-0x01,0x98,0x5b,0xfe,0x65,0x04,0xfe,0x69,0x04,0x5b,0x01,0x97,0xfe,0x69,0x05,0xd5,
-0x06,0xfa,0x38,0x07,0x07,0x05,0xc8,0x68,0xfb,0x08,0x04,0xf8,0x86,0xfe,0x69,0x01,
-0x97,0x5b,0xfe,0x65,0xfe,0x66,0x03,0x5b,0x01,0x97,0xfe,0x6c,0x5b,0x01,0x9a,0x01,
-0x9b,0x00,0x00,0x01,0x00,0x9a,0x00,0xa0,0x03,0xa7,0x05,0x40,0x00,0x14,0x00,0x1d,
-0x00,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x06,0x2f,0xb8,0x00,0x0c,0x2f,0xb8,0x00,0x0f,
-0x2f,0xba,0x00,0x0e,0x00,0x0c,0x00,0x00,0x11,0x12,0x39,0x30,0x31,0x13,0x33,0x01,
-0x36,0x01,0x32,0x37,0x33,0x17,0x09,0x01,0x15,0x07,0x01,0x23,0x01,0x23,0x27,0x01,
-0x00,0x35,0xf1,0x05,0x01,0x29,0x0b,0x01,0x1a,0x04,0x06,0x04,0x55,0xfe,0xd2,0x01,
-0x2e,0x57,0xfe,0xd4,0x02,0xfe,0xd2,0x03,0x57,0x01,0x31,0xfe,0xcf,0x05,0x40,0xfe,
-0x0b,0x08,0x01,0xde,0x0f,0x55,0xfe,0x04,0xfe,0x07,0x03,0x53,0x01,0xf7,0xfe,0x0b,
-0x56,0x01,0xf9,0x01,0xf5,0x07,0x00,0x08,0x00,0x64,0x00,0x00,0x06,0xf5,0x07,0x76,
-0x00,0x08,0x00,0x11,0x00,0x1a,0x00,0x23,0x00,0x2c,0x00,0x35,0x00,0x3e,0x00,0x7e,
-0x00,0x87,0xba,0x00,0x57,0x00,0x68,0x00,0x03,0x2b,0xb8,0x00,0x57,0x10,0xb8,0x00,
-0x41,0xd0,0xb8,0x00,0x41,0x2f,0x00,0xb8,0x00,0x5a,0x2f,0xb8,0x00,0x12,0x2f,0xba,
-0x00,0x1f,0x00,0x43,0x00,0x03,0x2b,0xb8,0x00,0x1f,0x10,0xba,0x00,0x01,0x00,0x5a,
-0x00,0x12,0x11,0x12,0x39,0xba,0x00,0x0a,0x00,0x5a,0x00,0x12,0x11,0x12,0x39,0xba,
-0x00,0x1c,0x00,0x5a,0x00,0x12,0x11,0x12,0x39,0xba,0x00,0x25,0x00,0x5a,0x00,0x12,
-0x11,0x12,0x39,0xba,0x00,0x2e,0x00,0x5a,0x00,0x12,0x11,0x12,0x39,0xb8,0x00,0x30,
-0xd0,0xba,0x00,0x37,0x00,0x43,0x00,0x1f,0x11,0x12,0x39,0xba,0x00,0x49,0x00,0x5a,
-0x00,0x12,0x11,0x12,0x39,0xba,0x00,0x79,0x00,0x5a,0x00,0x12,0x11,0x12,0x39,0xb8,
-0x00,0x43,0x10,0xb8,0x00,0x7d,0xd0,0x30,0x31,0x01,0x33,0x06,0x2b,0x01,0x26,0x3d,
-0x01,0x34,0x01,0x33,0x06,0x2b,0x01,0x26,0x3d,0x01,0x34,0x25,0x33,0x06,0x2b,0x01,
-0x26,0x3d,0x01,0x34,0x17,0x33,0x06,0x2b,0x01,0x26,0x3d,0x01,0x34,0x01,0x33,0x06,
-0x2b,0x01,0x26,0x3d,0x01,0x34,0x05,0x33,0x06,0x2b,0x01,0x26,0x3d,0x01,0x34,0x17,
-0x33,0x06,0x2b,0x01,0x26,0x3d,0x01,0x34,0x25,0x33,0x17,0x15,0x33,0x20,0x01,0x16,
-0x1d,0x01,0x23,0x26,0x27,0x26,0x2b,0x01,0x22,0x07,0x15,0x14,0x07,0x27,0x26,0x23,
-0x11,0x14,0x0f,0x01,0x22,0x2f,0x01,0x35,0x37,0x33,0x17,0x15,0x16,0x3b,0x01,0x32,
-0x3f,0x01,0x11,0x22,0x07,0x06,0x23,0x27,0x35,0x37,0x23,0x26,0x27,0x23,0x22,0x0f,
-0x01,0x23,0x35,0x36,0x37,0x36,0x21,0x35,0x01,0xd6,0x03,0x1e,0x5c,0x06,0x3a,0x02,
-0x56,0x02,0x1d,0x5c,0x07,0x39,0x02,0x1e,0x03,0x1e,0x5c,0x06,0x3a,0xf7,0x04,0x1e,
-0x5c,0x06,0x3a,0x02,0x1e,0x03,0x1d,0x5d,0x06,0x3a,0x01,0x26,0x02,0x1c,0x5d,0x07,
-0x39,0x5b,0x03,0x1e,0x5c,0x06,0x3a,0xfd,0xab,0x3a,0x06,0x02,0x01,0xb8,0x01,0x18,
-0x2b,0x02,0x16,0x13,0x23,0x39,0x2c,0x96,0x70,0x08,0x21,0x97,0x88,0x6a,0x1e,0x5b,
-0x25,0x02,0x06,0x2b,0x05,0x0b,0x3e,0x0a,0x37,0x14,0x06,0xd3,0x56,0x11,0x0e,0x07,
-0x07,0x04,0x43,0xc5,0x43,0x63,0x22,0x14,0x03,0x3a,0xc0,0xef,0x01,0x38,0x06,0x01,
-0xcf,0x0a,0x23,0x02,0x38,0x01,0x64,0xcf,0x08,0x23,0x03,0x37,0xe3,0xcf,0x08,0x24,
-0x03,0x36,0xb9,0xcf,0x08,0x24,0x02,0x38,0x01,0x3b,0xce,0x07,0x24,0x03,0x37,0x69,
-0xcf,0x07,0x24,0x03,0x37,0xeb,0xcf,0x09,0x23,0x02,0x39,0x9a,0x05,0x70,0xfe,0x50,
-0x4c,0x0c,0x07,0x0d,0x29,0x16,0x5a,0x2e,0x0d,0x02,0x3b,0x36,0xfd,0x9f,0x5a,0x15,
-0x02,0x56,0x18,0x17,0x06,0x06,0x0a,0x5a,0x33,0x25,0x02,0x59,0x36,0x33,0x05,0x0b,
-0x2e,0x38,0x19,0x37,0x10,0x02,0x80,0xc2,0xc6,0x70,0x00,0x09,0x00,0x98,0x00,0x00,
-0x06,0x93,0x05,0xd9,0x00,0x09,0x00,0x0f,0x00,0x18,0x00,0x2f,0x00,0x3e,0x00,0x45,
-0x00,0x71,0x00,0x77,0x00,0x86,0x00,0x67,0x00,0xb8,0x00,0x30,0x2f,0xba,0x00,0x46,
-0x00,0x51,0x00,0x03,0x2b,0xb8,0x00,0x46,0x10,0xba,0x00,0x0d,0x00,0x43,0x00,0x03,
-0x2b,0xb8,0x00,0x0d,0x10,0xba,0x00,0x74,0x00,0x0a,0x00,0x03,0x2b,0xb8,0x00,0x74,
-0x10,0xba,0x00,0x63,0x00,0x72,0x00,0x03,0x2b,0xb8,0x00,0x63,0x10,0xb8,0x00,0x72,
-0x10,0xb8,0x00,0x02,0xdc,0xb8,0x00,0x0d,0x10,0xb8,0x00,0x12,0xd0,0xb8,0x00,0x46,
-0x10,0xb8,0x00,0x3f,0xd0,0xb8,0x00,0x46,0x10,0xb8,0x00,0x41,0xd0,0xb8,0x00,0x41,
-0x2f,0xb8,0x00,0x46,0x10,0xb8,0x00,0x5f,0xd0,0xb8,0x00,0x5f,0x2f,0x30,0x31,0x01,
-0x06,0x17,0x21,0x36,0x37,0x34,0x23,0x21,0x06,0x13,0x16,0x17,0x21,0x36,0x3f,0x01,
-0x06,0x07,0x36,0x37,0x36,0x27,0x26,0x23,0x27,0x06,0x07,0x33,0x32,0x15,0x14,0x07,
-0x06,0x07,0x06,0x07,0x33,0x32,0x37,0x36,0x37,0x36,0x37,0x36,0x35,0x34,0x23,0x01,
-0x33,0x14,0x06,0x07,0x14,0x16,0x17,0x23,0x26,0x27,0x26,0x27,0x26,0x36,0x01,0x04,
-0x25,0x36,0x37,0x21,0x16,0x05,0x36,0x37,0x32,0x17,0x15,0x14,0x05,0x07,0x17,0x14,
-0x07,0x21,0x26,0x3d,0x01,0x37,0x35,0x24,0x2f,0x01,0x35,0x36,0x33,0x16,0x17,0x26,
-0x11,0x34,0x33,0x21,0x16,0x15,0x33,0x32,0x15,0x14,0x07,0x06,0x07,0x06,0x2b,0x01,
-0x27,0x01,0x16,0x17,0x21,0x36,0x37,0x01,0x06,0x07,0x06,0x07,0x23,0x3e,0x01,0x35,
-0x34,0x26,0x35,0x33,0x1e,0x01,0x01,0x23,0x02,0x11,0x04,0x81,0x0b,0x03,0x1e,0xfb,
-0xa0,0x1c,0x3f,0x05,0x10,0x03,0xf4,0x0d,0x09,0x49,0x09,0x3a,0x57,0x30,0x1f,0x02,
-0x01,0x20,0x39,0x02,0x01,0x36,0x3b,0x45,0x2c,0x51,0x20,0x32,0x07,0x3a,0x26,0x13,
-0x6c,0x36,0x1d,0x18,0x78,0xfd,0x30,0x09,0x62,0x01,0x88,0x04,0x08,0x13,0x6d,0x21,
-0x0a,0x03,0x72,0xfe,0xdb,0x01,0x61,0x01,0x73,0x22,0x5c,0xfc,0x3e,0x25,0x03,0x45,
-0xfe,0x66,0x12,0x06,0xfe,0x99,0x7e,0x02,0x10,0xfd,0xf1,0x11,0x04,0xfe,0x65,0x32,
-0x03,0x04,0x12,0x55,0xd6,0xc9,0x36,0x04,0x67,0x21,0x36,0x8f,0x56,0x23,0x70,0x35,
-0x43,0x07,0x11,0xfc,0x2b,0x06,0x0a,0x04,0x43,0x0b,0x04,0xfe,0x98,0x06,0x13,0x3f,
-0x0b,0x06,0x03,0x50,0x39,0x05,0x0a,0x42,0x02,0xb4,0x3b,0x51,0x34,0x58,0x16,0x04,
-0xfe,0xcd,0x1a,0x12,0x16,0x16,0xc7,0x6d,0x86,0x01,0x4d,0x3b,0x59,0x11,0x56,0x1c,
-0x20,0x2f,0x82,0x4d,0x28,0x01,0x3d,0x48,0x3a,0x0d,0x1f,0x2c,0x71,0x4c,0x55,0x44,
-0x03,0x29,0x38,0x88,0x57,0x71,0x6b,0xb1,0x92,0x65,0x2d,0x50,0x6d,0x7b,0xfa,0xf3,
-0x18,0x16,0x10,0x97,0x4e,0x57,0x18,0x0a,0x0a,0x0a,0x10,0x3d,0x24,0x0a,0x0f,0x08,
-0x07,0x10,0x06,0x02,0x02,0x55,0x12,0x0d,0x04,0x0b,0x09,0x14,0xfe,0x01,0x2f,0x30,
-0x02,0x18,0x63,0x9b,0x99,0x29,0x16,0x48,0x04,0x01,0x3f,0x1a,0x12,0x13,0x19,0x01,
-0xf5,0x32,0x1c,0x40,0x5b,0x6e,0x44,0x46,0x38,0x54,0x24,0x2e,0x4c,0x00,0x00,0x02,
-0x00,0xac,0x00,0x01,0x06,0x81,0x05,0xd9,0x00,0x07,0x00,0x0c,0x00,0x13,0x00,0xb8,
-0x00,0x00,0x2f,0xba,0x00,0x0a,0x00,0x03,0x00,0x03,0x2b,0xb8,0x00,0x0a,0x10,0x30,
-0x31,0x09,0x01,0x13,0x07,0x21,0x27,0x13,0x09,0x01,0x03,0x21,0x03,0x01,0x03,0x9e,
-0x02,0x8f,0x54,0x03,0xfa,0x34,0x06,0x58,0x02,0x97,0xfd,0xcd,0x4b,0x04,0xf3,0x47,
-0xfd,0xcf,0x05,0xd9,0xfe,0x77,0xfb,0xb4,0x03,0x06,0x04,0x4c,0x01,0x86,0xfe,0x35,
-0xfc,0x5f,0x03,0xa1,0x01,0x4b,0x00,0x01,0x00,0xac,0x00,0x00,0x06,0x81,0x05,0xd0,
-0x00,0x09,0x00,0x13,0x00,0xb8,0x00,0x02,0x2f,0xb8,0x00,0x04,0x2f,0xb8,0x00,0x06,
-0x2f,0xb8,0x00,0x00,0x2f,0x30,0x31,0x09,0x01,0x13,0x17,0x07,0x21,0x27,0x13,0x00,
-0x37,0x03,0x9b,0x02,0x8c,0x57,0x03,0x03,0xfa,0x34,0x06,0x5a,0x02,0x7e,0x14,0x05,
-0xd0,0xfe,0x77,0xfb,0xbf,0x03,0x03,0x06,0x04,0x44,0x01,0x80,0x06,0x00,0x00,0x01,
-0x00,0x9f,0x00,0x00,0x06,0x8d,0x05,0xd4,0x00,0x42,0x00,0x37,0x00,0xb8,0x00,0x07,
-0x2f,0xb8,0x00,0x0b,0x2f,0xb8,0x00,0x2a,0x2f,0xba,0x00,0x00,0x00,0x2a,0x00,0x07,
-0x11,0x12,0x39,0xba,0x00,0x12,0x00,0x2a,0x00,0x07,0x11,0x12,0x39,0xba,0x00,0x28,
-0x00,0x2a,0x00,0x07,0x11,0x12,0x39,0xba,0x00,0x2d,0x00,0x2a,0x00,0x07,0x11,0x12,
-0x39,0x30,0x31,0x01,0x03,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x16,0x36,0x33,0x32,
-0x17,0x16,0x15,0x14,0x07,0x03,0x25,0x36,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x0e,
-0x01,0x16,0x07,0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x03,0x12,0x03,0x23,0x12,
-0x0b,0x01,0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x26,0x36,0x26,0x27,0x26,0x35,
-0x34,0x37,0x36,0x37,0x36,0x17,0x03,0x78,0xd8,0x4a,0x58,0x25,0x26,0x58,0x57,0x58,
-0x3a,0x5c,0x38,0x0d,0x5b,0xc7,0x01,0x45,0x89,0x7a,0x23,0x23,0x46,0x07,0x12,0x84,
-0x4d,0x1c,0x0b,0x21,0x39,0x40,0x21,0x23,0x6a,0x4c,0xcf,0x29,0x90,0x5f,0xb3,0x28,
-0xce,0x4d,0x69,0x23,0x22,0x3f,0x38,0x22,0x0c,0x1b,0x4d,0x84,0x12,0x07,0x46,0x23,
-0x23,0x79,0x8a,0x03,0x08,0x01,0x34,0x68,0x6f,0x6b,0x40,0x16,0x6d,0x6d,0x72,0x2a,
-0x25,0x7f,0x74,0xfe,0xeb,0x65,0x32,0x27,0x0c,0x1b,0x42,0x42,0x15,0x15,0x39,0x30,
-0x74,0x55,0x25,0x1b,0x29,0x0c,0x22,0x66,0x01,0x16,0xfe,0x74,0xfe,0xd7,0x01,0x28,
-0x01,0x8d,0xfe,0xea,0x66,0x22,0x0c,0x29,0x1b,0x25,0x55,0x74,0x30,0x39,0x15,0x14,
-0x43,0x42,0x1b,0x0c,0x27,0x32,0x00,0x02,0x00,0xab,0x01,0x1e,0x06,0x81,0x04,0x98,
-0x00,0x39,0x00,0x3e,0x00,0x2d,0x00,0xb8,0x00,0x0e,0x2f,0xb8,0x00,0x1f,0x2f,0xb8,
-0x00,0x00,0x2f,0xba,0x00,0x06,0x00,0x1f,0x00,0x00,0x11,0x12,0x39,0xba,0x00,0x31,
-0x00,0x1f,0x00,0x00,0x11,0x12,0x39,0xba,0x00,0x3d,0x00,0x1f,0x00,0x00,0x11,0x12,
-0x39,0x30,0x31,0x01,0x16,0x17,0x14,0x07,0x06,0x07,0x04,0x13,0x33,0x17,0x07,0x23,
-0x06,0x07,0x22,0x27,0x34,0x33,0x16,0x37,0x32,0x37,0x24,0x27,0x23,0x22,0x07,0x16,
-0x15,0x06,0x05,0x24,0x03,0x34,0x37,0x16,0x17,0x15,0x07,0x14,0x17,0x32,0x37,0x12,
-0x25,0x16,0x07,0x14,0x07,0x36,0x37,0x32,0x35,0x36,0x37,0x36,0x26,0x03,0x06,0x17,
-0x35,0x26,0x05,0xa7,0x6f,0x14,0x4a,0xb0,0x14,0x01,0x00,0x37,0x1b,0x13,0x2e,0x03,
-0x11,0x98,0x62,0x19,0x14,0x10,0x3c,0x4d,0x0d,0xfe,0xfa,0x07,0x03,0x83,0x44,0x86,
-0x09,0xfe,0xb2,0xfd,0x99,0x2c,0x42,0x33,0x08,0x0d,0x71,0x59,0x0d,0x35,0x01,0x2a,
-0xc9,0x05,0x2a,0x5d,0x64,0x3d,0x48,0x4e,0x4e,0x3a,0x87,0x0f,0xf3,0x20,0x04,0x98,
-0x05,0x73,0x57,0x19,0x24,0x2c,0x1b,0xfe,0xf0,0x4a,0x0d,0xae,0x09,0x5d,0x54,0x2e,
-0x01,0x4d,0x4d,0xf1,0x6d,0x40,0x65,0xf6,0x10,0x03,0x01,0x64,0x3a,0x09,0x03,0x2c,
-0x17,0x27,0x5a,0x0c,0x4d,0x01,0xde,0x14,0x06,0xa8,0x27,0x63,0x4d,0x14,0x26,0x54,
-0x29,0x32,0x5f,0xfe,0xa5,0x91,0x4d,0x03,0xb5,0x00,0x00,0x01,0x00,0xac,0x00,0xe7,
-0x06,0x81,0x04,0x8d,0x00,0x32,0x00,0x53,0x00,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x2e,
-0x2f,0xba,0x00,0x15,0x00,0x0b,0x00,0x03,0x2b,0xb8,0x00,0x15,0x10,0xba,0x00,0x2a,
-0x00,0x21,0x00,0x03,0x2b,0xb8,0x00,0x2a,0x10,0xba,0x00,0x20,0x00,0x16,0x00,0x03,
-0x2b,0xb8,0x00,0x20,0x10,0xb8,0x00,0x0b,0x10,0xb8,0x00,0x09,0xd0,0xb8,0x00,0x09,
-0x2f,0xb8,0x00,0x15,0x10,0xb8,0x00,0x17,0xd0,0xb8,0x00,0x17,0x2f,0xb8,0x00,0x21,
-0x10,0xb8,0x00,0x1f,0xd0,0xb8,0x00,0x1f,0x2f,0x30,0x31,0x25,0x21,0x22,0x26,0x35,
-0x34,0x36,0x37,0x36,0x37,0x33,0x37,0x23,0x26,0x27,0x26,0x35,0x34,0x3e,0x01,0x3b,
-0x01,0x37,0x21,0x22,0x26,0x35,0x34,0x36,0x37,0x36,0x37,0x21,0x37,0x21,0x22,0x26,
-0x35,0x34,0x3e,0x01,0x33,0x21,0x36,0x37,0x36,0x33,0x21,0x32,0x16,0x15,0x06,0x36,
-0xfd,0x50,0x2b,0x3d,0x1c,0x19,0x12,0x13,0x36,0x04,0x88,0x2f,0x19,0x1f,0x1d,0x32,
-0x1a,0xb4,0x01,0xfe,0xff,0x44,0x3e,0x1d,0x19,0x14,0x16,0x01,0x52,0x02,0xfd,0x03,
-0x2b,0x3e,0x1d,0x32,0x1a,0x03,0x2c,0x08,0x10,0x1f,0x2b,0x01,0x76,0x2a,0x3e,0xe7,
-0x3e,0x2b,0x1b,0x32,0x0d,0x0a,0x03,0x0c,0x02,0x1a,0x1e,0x2c,0x1b,0x32,0x1c,0x0a,
-0x3d,0x2c,0x1a,0x32,0x0e,0x0b,0x02,0x0a,0x3d,0x2c,0x1b,0x33,0x1a,0x16,0x11,0x1f,
-0x3e,0x2c,0x00,0x01,0x00,0xac,0x00,0xe7,0x06,0x81,0x04,0x8d,0x00,0x32,0x00,0x4b,
-0x00,0xb8,0x00,0x03,0x2f,0xb8,0x00,0x31,0x2f,0xba,0x00,0x1e,0x00,0x26,0x00,0x03,
-0x2b,0xb8,0x00,0x1e,0x10,0xba,0x00,0x09,0x00,0x10,0x00,0x03,0x2b,0xb8,0x00,0x09,
-0x10,0xb8,0x00,0x10,0x10,0xb8,0x00,0x12,0xd0,0xb8,0x00,0x12,0x2f,0xb8,0x00,0x1e,
-0x10,0xb8,0x00,0x1b,0xd0,0xb8,0x00,0x1b,0x2f,0xb8,0x00,0x13,0xdc,0xb8,0x00,0x26,
-0x10,0xb8,0x00,0x28,0xd0,0xb8,0x00,0x28,0x2f,0x30,0x31,0x13,0x34,0x36,0x33,0x21,
-0x32,0x17,0x16,0x17,0x21,0x32,0x1e,0x01,0x15,0x14,0x06,0x23,0x21,0x17,0x21,0x16,
-0x17,0x1e,0x01,0x15,0x14,0x06,0x23,0x21,0x17,0x33,0x32,0x1e,0x01,0x15,0x14,0x07,
-0x06,0x07,0x23,0x17,0x33,0x16,0x17,0x1e,0x01,0x15,0x14,0x06,0x23,0x21,0xac,0x3e,
-0x2a,0x01,0x76,0x2b,0x1e,0x11,0x08,0x03,0x2c,0x1a,0x31,0x1e,0x3e,0x2b,0xfd,0x03,
-0x02,0x01,0x52,0x16,0x14,0x19,0x1c,0x3d,0x44,0xfe,0xff,0x01,0xb3,0x1b,0x32,0x1c,
-0x1e,0x19,0x30,0x87,0x04,0x36,0x13,0x12,0x18,0x1d,0x3d,0x2b,0xfd,0x50,0x04,0x23,
-0x2c,0x3e,0x1f,0x11,0x16,0x1a,0x33,0x1b,0x2c,0x3d,0x0a,0x02,0x0b,0x0e,0x32,0x1a,
-0x2c,0x3d,0x0a,0x1c,0x32,0x1b,0x2c,0x1e,0x1a,0x02,0x0c,0x03,0x0a,0x0d,0x32,0x1b,
-0x2b,0x3e,0x00,0x02,0x00,0xb2,0x00,0xd4,0x06,0x7b,0x04,0x8d,0x00,0x21,0x00,0x43,
-0x00,0x5f,0x00,0xba,0x00,0x1a,0x00,0x22,0x00,0x03,0x2b,0xb8,0x00,0x1a,0x10,0xba,
-0x00,0x3f,0x00,0x04,0x00,0x03,0x2b,0xb8,0x00,0x3f,0x10,0xba,0x00,0x3c,0x00,0x36,
-0x00,0x03,0x2b,0xb8,0x00,0x3c,0x10,0xba,0x00,0x0d,0x00,0x0e,0x00,0x03,0x2b,0xb8,
-0x00,0x0d,0x10,0xba,0x00,0x14,0x00,0x15,0x00,0x03,0x2b,0xb8,0x00,0x14,0x10,0xba,
-0x00,0x35,0x00,0x2f,0x00,0x03,0x2b,0xb8,0x00,0x35,0x10,0xb8,0x00,0x22,0x10,0xb8,
-0x00,0x26,0xdc,0xb8,0x00,0x28,0xd0,0xb8,0x00,0x28,0x2f,0xb8,0x00,0x2e,0xdc,0x30,
-0x31,0x25,0x13,0x34,0x26,0x23,0x21,0x22,0x07,0x21,0x26,0x15,0x14,0x33,0x21,0x07,
-0x21,0x22,0x15,0x14,0x33,0x21,0x07,0x23,0x22,0x15,0x14,0x3b,0x01,0x07,0x23,0x22,
-0x15,0x14,0x33,0x07,0x26,0x27,0x36,0x37,0x33,0x37,0x23,0x26,0x27,0x36,0x37,0x33,
-0x37,0x21,0x22,0x27,0x36,0x37,0x21,0x37,0x21,0x26,0x27,0x36,0x33,0x21,0x36,0x37,
-0x21,0x32,0x16,0x15,0x03,0x06,0x08,0x49,0x30,0x21,0xfe,0x9f,0x36,0x17,0xfc,0xd9,
-0x53,0x53,0x02,0xff,0x0d,0xfe,0x9e,0x53,0x53,0x01,0x3a,0x09,0xdd,0x53,0x53,0xae,
-0x13,0x3e,0x53,0x53,0x1c,0x5d,0x01,0x01,0x5d,0x4a,0x04,0xab,0x5d,0x01,0x01,0x5d,
-0xe4,0x02,0xfe,0xc6,0x5d,0x01,0x01,0x5d,0x01,0x68,0x04,0xfd,0x04,0x5c,0x01,0x01,
-0x5c,0x03,0x2c,0x20,0x42,0x01,0x76,0x2a,0x3e,0x4b,0xf1,0x03,0x15,0x25,0x33,0x39,
-0x02,0x4b,0x49,0x4c,0x4b,0x49,0x4f,0x4b,0x48,0x4c,0x4b,0x49,0x1d,0x01,0x68,0x67,
-0x01,0x0e,0x01,0x68,0x67,0x01,0x13,0x68,0x67,0x01,0x0f,0x01,0x68,0x67,0x45,0x02,
-0x3f,0x2d,0xfc,0xb3,0x00,0x02,0x00,0x93,0x00,0x00,0x04,0x4c,0x05,0xca,0x00,0x21,
-0x00,0x44,0x00,0xa3,0xba,0x00,0x27,0x00,0x43,0x00,0x03,0x2b,0xb8,0x00,0x27,0x10,
-0xba,0x00,0x14,0x00,0x15,0x00,0x03,0x2b,0xb8,0x00,0x14,0x10,0xba,0x00,0x0d,0x00,
-0x0e,0x00,0x03,0x2b,0xb8,0x00,0x0d,0x10,0xba,0x00,0x3f,0x00,0x04,0x00,0x03,0x2b,
-0xb8,0x00,0x3f,0x10,0xb8,0x00,0x43,0x10,0xb8,0x00,0x1b,0xdc,0xb8,0x00,0x43,0x10,
-0xb8,0x00,0x22,0xd0,0xb8,0x00,0x22,0x2f,0xb8,0x00,0x27,0x10,0xb8,0x00,0x29,0xd0,
-0xb8,0x00,0x29,0x2f,0xb8,0x00,0x27,0x10,0xb8,0x00,0x2e,0xdc,0xba,0x00,0x2f,0x00,
-0x15,0x00,0x14,0x11,0x12,0x39,0xb8,0x00,0x2f,0x2f,0xb8,0x00,0x35,0xdc,0xba,0x00,
-0x36,0x00,0x0e,0x00,0x0d,0x11,0x12,0x39,0xb8,0x00,0x36,0x2f,0xb8,0x00,0x3c,0xdc,
-0xb8,0x00,0x3f,0x10,0xb8,0x00,0x46,0xdc,0x00,0xb8,0x00,0x39,0x2f,0xb8,0x00,0x42,
-0x2f,0xba,0x00,0x28,0x00,0x42,0x00,0x39,0x11,0x12,0x39,0xba,0x00,0x36,0x00,0x42,
-0x00,0x39,0x11,0x12,0x39,0x30,0x31,0x37,0x05,0x32,0x36,0x35,0x11,0x34,0x27,0x11,
-0x36,0x23,0x22,0x15,0x11,0x27,0x11,0x34,0x23,0x22,0x15,0x11,0x27,0x35,0x34,0x23,
-0x22,0x1d,0x01,0x27,0x35,0x34,0x23,0x22,0x15,0x27,0x36,0x37,0x16,0x17,0x15,0x17,
-0x35,0x36,0x37,0x16,0x17,0x15,0x17,0x11,0x34,0x37,0x16,0x17,0x11,0x17,0x11,0x36,
-0x37,0x16,0x15,0x11,0x16,0x17,0x11,0x14,0x06,0x23,0x25,0x13,0xb1,0x03,0x15,0x24,
-0x34,0x3a,0x02,0x4a,0x49,0x4c,0x4c,0x48,0x4f,0x4b,0x48,0x4c,0x4b,0x49,0x1d,0x01,
-0x68,0x67,0x01,0x0e,0x01,0x68,0x67,0x01,0x12,0x69,0x67,0x01,0x0f,0x01,0x68,0x67,
-0x44,0x02,0x3e,0x2d,0xfc,0xb2,0x01,0x73,0x4a,0x31,0x20,0x01,0x62,0x36,0x16,0x03,
-0x27,0x53,0x53,0xfd,0x02,0x0d,0x01,0x63,0x52,0x52,0xfe,0xc4,0x09,0xdf,0x53,0x53,
-0xae,0x12,0x3f,0x53,0x53,0x1c,0x5c,0x01,0x01,0x5c,0x4b,0x04,0xac,0x5c,0x01,0x01,
-0x5c,0xe4,0x03,0x01,0x3b,0x5c,0x01,0x01,0x5c,0xfe,0x96,0x04,0x02,0xfd,0x5d,0x01,
-0x01,0x5d,0xfc,0xd4,0x21,0x41,0xfe,0x8a,0x2a,0x3e,0x4b,0x02,0x9b,0x00,0x00,0x02,
-0x00,0xb1,0x00,0xd3,0x06,0x7b,0x04,0x8d,0x00,0x21,0x00,0x43,0x00,0x75,0x00,0xba,
-0x00,0x06,0x00,0x43,0x00,0x03,0x2b,0xb8,0x00,0x06,0x10,0xba,0x00,0x27,0x00,0x1c,
-0x00,0x03,0x2b,0xb8,0x00,0x27,0x10,0xba,0x00,0x2a,0x00,0x2e,0x00,0x03,0x2b,0xb8,
-0x00,0x2a,0x10,0xba,0x00,0x14,0x00,0x13,0x00,0x03,0x2b,0xb8,0x00,0x14,0x10,0xba,
-0x00,0x0e,0x00,0x0b,0x00,0x03,0x2b,0xb8,0x00,0x0e,0x10,0xba,0x00,0x31,0x00,0x35,
-0x00,0x03,0x2b,0xb8,0x00,0x31,0x10,0xb8,0x00,0x43,0x10,0xb8,0x00,0x3e,0xdc,0xb8,
-0x00,0x3c,0xd0,0xb8,0x00,0x3c,0x2f,0xb8,0x00,0x38,0xdc,0xba,0x00,0x3d,0x00,0x43,
-0x00,0x06,0x11,0x12,0x39,0xb8,0x00,0x3c,0x10,0xb8,0x00,0x3f,0xd0,0xb8,0x00,0x3f,
-0x2f,0x30,0x31,0x25,0x32,0x35,0x34,0x2b,0x01,0x27,0x33,0x32,0x35,0x34,0x2b,0x01,
-0x27,0x21,0x32,0x35,0x34,0x23,0x21,0x27,0x21,0x32,0x35,0x34,0x07,0x21,0x26,0x23,
-0x21,0x22,0x06,0x15,0x13,0x07,0x03,0x34,0x36,0x33,0x21,0x16,0x17,0x21,0x32,0x17,
-0x06,0x07,0x21,0x17,0x21,0x16,0x17,0x06,0x23,0x21,0x17,0x33,0x16,0x17,0x06,0x07,
-0x23,0x17,0x33,0x16,0x17,0x06,0x07,0x03,0xc1,0x53,0x53,0x3f,0x12,0xae,0x53,0x53,
-0xdf,0x09,0x01,0x3c,0x52,0x52,0xfe,0x9d,0x0d,0x02,0xfe,0x53,0x53,0xfc,0xd9,0x16,
-0x36,0xfe,0x9e,0x20,0x31,0x4a,0x28,0x4b,0x3e,0x2a,0x01,0x76,0x41,0x21,0x03,0x2c,
-0x5d,0x01,0x01,0x5d,0xfd,0x03,0x04,0x01,0x6a,0x5c,0x01,0x01,0x5c,0xfe,0xc5,0x03,
-0xe4,0x5c,0x01,0x01,0x5c,0xac,0x04,0x4b,0x5c,0x01,0x01,0x5c,0xf1,0x49,0x4b,0x4c,
-0x48,0x4b,0x4f,0x49,0x4b,0x4c,0x49,0x4b,0x02,0x39,0x33,0x25,0xfc,0xeb,0x1e,0x03,
-0x4e,0x2d,0x3f,0x02,0x45,0x67,0x68,0x01,0x0f,0x01,0x67,0x68,0x13,0x01,0x67,0x68,
-0x01,0x0e,0x01,0x67,0x69,0x01,0x00,0x02,0x00,0x93,0xff,0xf9,0x04,0x4c,0x05,0xc2,
-0x00,0x21,0x00,0x43,0x00,0xab,0xba,0x00,0x3e,0x00,0x22,0x00,0x03,0x2b,0xb8,0x00,
-0x3e,0x10,0xba,0x00,0x0e,0x00,0x0b,0x00,0x03,0x2b,0xb8,0x00,0x0e,0x10,0xba,0x00,
-0x14,0x00,0x13,0x00,0x03,0x2b,0xb8,0x00,0x14,0x10,0xba,0x00,0x27,0x00,0x1c,0x00,
-0x03,0x2b,0xb8,0x00,0x27,0x10,0xb8,0x00,0x22,0x10,0xb8,0x00,0x06,0xdc,0xba,0x00,
-0x2e,0x00,0x13,0x00,0x14,0x11,0x12,0x39,0xb8,0x00,0x2e,0x2f,0xb8,0x00,0x2a,0xdc,
-0xba,0x00,0x2f,0x00,0x13,0x00,0x14,0x11,0x12,0x39,0xba,0x00,0x35,0x00,0x0b,0x00,
-0x0e,0x11,0x12,0x39,0xb8,0x00,0x35,0x2f,0xb8,0x00,0x31,0xdc,0xb8,0x00,0x3e,0x10,
-0xb8,0x00,0x38,0xdc,0xb8,0x00,0x3e,0x10,0xb8,0x00,0x3c,0xd0,0xb8,0x00,0x3c,0x2f,
-0xb8,0x00,0x27,0x10,0xb8,0x00,0x45,0xdc,0x00,0xb8,0x00,0x23,0x2f,0xb8,0x00,0x2c,
-0x2f,0xba,0x00,0x06,0x00,0x2c,0x00,0x23,0x11,0x12,0x39,0xba,0x00,0x2f,0x00,0x2c,
-0x00,0x23,0x11,0x12,0x39,0xba,0x00,0x3d,0x00,0x2c,0x00,0x23,0x11,0x12,0x39,0x30,
-0x31,0x13,0x14,0x33,0x32,0x3d,0x01,0x37,0x15,0x14,0x33,0x32,0x3d,0x01,0x37,0x11,
-0x14,0x33,0x32,0x35,0x11,0x37,0x11,0x14,0x33,0x32,0x27,0x11,0x36,0x35,0x11,0x34,
-0x26,0x23,0x05,0x27,0x25,0x32,0x16,0x15,0x11,0x06,0x07,0x11,0x14,0x07,0x26,0x27,
-0x11,0x07,0x11,0x06,0x07,0x26,0x35,0x11,0x07,0x15,0x06,0x07,0x26,0x27,0x35,0x07,
-0x15,0x06,0x07,0x26,0x27,0xb1,0x49,0x4b,0x4c,0x48,0x4b,0x4f,0x48,0x4c,0x4c,0x49,
-0x4a,0x02,0x3a,0x34,0x24,0xfc,0xeb,0x1e,0x03,0x4e,0x2d,0x3e,0x02,0x44,0x67,0x68,
-0x01,0x0f,0x01,0x67,0x69,0x12,0x01,0x67,0x68,0x01,0x0e,0x01,0x67,0x68,0x01,0x02,
-0xb3,0x53,0x53,0x3d,0x14,0xae,0x53,0x53,0xdd,0x09,0xfe,0xc6,0x53,0x53,0x01,0x62,
-0x0d,0xfd,0x01,0x53,0x53,0x03,0x27,0x17,0x36,0x01,0x61,0x21,0x30,0x4a,0x29,0x4b,
-0x3e,0x2a,0xfe,0x8a,0x42,0x20,0xfc,0xd4,0x5c,0x01,0x01,0x5c,0x02,0xfc,0x04,0xfe,
-0x98,0x5d,0x01,0x01,0x5d,0x01,0x3a,0x02,0xe4,0x5d,0x01,0x01,0x5d,0xab,0x04,0x4a,
-0x5d,0x01,0x01,0x5d,0x00,0x1d,0x00,0x7d,0x00,0x00,0x06,0xaf,0x05,0xd8,0x00,0x4f,
-0x00,0x80,0x00,0x88,0x00,0x90,0x00,0x9f,0x00,0xae,0x00,0xb5,0x00,0xbc,0x00,0xcd,
-0x00,0xd3,0x00,0xda,0x00,0xde,0x00,0xe2,0x00,0xe6,0x00,0xea,0x00,0xee,0x00,0xf2,
-0x00,0xf6,0x00,0xfa,0x00,0xfe,0x01,0x02,0x01,0x11,0x01,0x1d,0x01,0x21,0x01,0x25,
-0x01,0x29,0x01,0x2d,0x01,0x31,0x01,0x35,0x03,0x23,0xba,0x00,0x50,0x00,0x4c,0x00,
-0x03,0x2b,0xb8,0x00,0x50,0x10,0xba,0x00,0xf1,0x00,0xe5,0x00,0x03,0x2b,0xb8,0x00,
-0xf1,0x10,0xba,0x00,0x05,0x00,0x77,0x00,0x03,0x2b,0xb8,0x00,0x05,0x10,0xba,0x00,
-0x0c,0x00,0x4c,0x00,0x05,0x11,0x12,0x39,0xba,0x00,0x48,0x00,0x4c,0x00,0x05,0x11,
-0x12,0x39,0x41,0x1b,0x00,0x16,0x00,0x50,0x00,0x26,0x00,0x50,0x00,0x36,0x00,0x50,
-0x00,0x46,0x00,0x50,0x00,0x56,0x00,0x50,0x00,0x66,0x00,0x50,0x00,0x76,0x00,0x50,
-0x00,0x86,0x00,0x50,0x00,0x96,0x00,0x50,0x00,0xa6,0x00,0x50,0x00,0xb6,0x00,0x50,
-0x00,0xc6,0x00,0x50,0x00,0xd6,0x00,0x50,0x00,0x0d,0x5d,0x41,0x05,0x00,0xe5,0x00,
-0x50,0x00,0xf5,0x00,0x50,0x00,0x02,0x5d,0xba,0x00,0x75,0x00,0x4c,0x00,0x05,0x11,
-0x12,0x39,0xba,0x00,0x92,0x00,0x4c,0x00,0x05,0x11,0x12,0x39,0xba,0x00,0xa8,0x00,
-0x4c,0x00,0x05,0x11,0x12,0x39,0xb8,0x00,0xf1,0x10,0xb8,0x00,0xb0,0xd0,0xb8,0x00,
-0xf1,0x10,0xb8,0x00,0xbb,0xd0,0xb8,0x00,0xbb,0x2f,0xb8,0x00,0xb1,0xd0,0xb8,0x00,
-0xb1,0x2f,0xb8,0x00,0xe5,0x10,0xb8,0x00,0xb4,0xd0,0xb8,0x00,0xb4,0x2f,0xb8,0x00,
-0xf1,0x10,0xb8,0x01,0x2e,0xdc,0xb8,0x00,0xb8,0xd0,0xb8,0x00,0xb8,0x2f,0xba,0x00,
-0xc3,0x00,0x4c,0x00,0x05,0x11,0x12,0x39,0xba,0x00,0xcc,0x00,0x4c,0x00,0x05,0x11,
-0x12,0x39,0xba,0x00,0xce,0x00,0x4c,0x00,0x05,0x11,0x12,0x39,0xba,0x00,0xd1,0x00,
-0x4c,0x00,0x05,0x11,0x12,0x39,0xba,0x00,0xd8,0x00,0x4c,0x00,0x05,0x11,0x12,0x39,
-0xba,0x00,0xdb,0x00,0x4c,0x00,0x05,0x11,0x12,0x39,0xba,0x00,0xdd,0x00,0x4c,0x00,
-0x05,0x11,0x12,0x39,0xba,0x00,0xe0,0x00,0x4c,0x00,0x05,0x11,0x12,0x39,0xba,0x00,
-0xe2,0x00,0x4c,0x00,0x05,0x11,0x12,0x39,0xb8,0x01,0x2e,0x10,0xb8,0x00,0xe7,0xd0,
-0xb8,0x00,0xe7,0x2f,0xba,0x00,0xe8,0x00,0x4c,0x00,0x05,0x11,0x12,0x39,0xb8,0x00,
-0xbb,0x10,0xb8,0x00,0xf3,0xd0,0xb8,0x00,0xf3,0x2f,0xb8,0x00,0xe5,0x10,0xb8,0x00,
-0xf9,0xd0,0xb8,0x00,0xbb,0x10,0xb8,0x00,0xfb,0xd0,0xb8,0x00,0xfb,0x2f,0xba,0x00,
-0xfe,0x00,0xf1,0x01,0x2e,0x11,0x12,0x39,0xb8,0x00,0xf1,0x10,0xb8,0x01,0x01,0xd0,
-0xb8,0x00,0xbb,0x10,0xb8,0x01,0x02,0xd0,0xb8,0x01,0x02,0x2f,0xba,0x01,0x10,0x00,
-0x4c,0x00,0x05,0x11,0x12,0x39,0xb8,0x00,0xe5,0x10,0xb8,0x01,0x1f,0xd0,0xb8,0x01,
-0x1f,0x2f,0xba,0x01,0x22,0x00,0xe5,0x00,0xf1,0x11,0x12,0x39,0xba,0x01,0x28,0x00,
-0x4c,0x00,0x05,0x11,0x12,0x39,0xba,0x01,0x33,0x00,0x4c,0x00,0x05,0x11,0x12,0x39,
-0xb8,0x00,0x05,0x10,0xb8,0x01,0x37,0xdc,0x00,0xb8,0x00,0x24,0x2f,0xb8,0x00,0x30,
-0x2f,0xba,0x00,0x00,0x00,0x7c,0x00,0x03,0x2b,0xb8,0x00,0x00,0x10,0xba,0x00,0xbf,
-0x00,0x2a,0x00,0x03,0x2b,0xb8,0x00,0xbf,0x10,0xba,0x00,0xa5,0x00,0x35,0x00,0x03,
-0x2b,0xb8,0x00,0xa5,0x10,0xba,0x00,0x44,0x00,0x18,0x00,0x03,0x2b,0xb8,0x00,0x44,
-0x10,0xba,0x00,0x81,0x00,0x85,0x00,0x03,0x2b,0xb8,0x00,0x81,0x10,0xba,0x00,0x0c,
-0x00,0x18,0x00,0x44,0x11,0x12,0x39,0xb8,0x00,0x44,0x10,0xb8,0x00,0x10,0xd0,0xb8,
-0x00,0x10,0x2f,0xb8,0x00,0x18,0x10,0xb8,0x00,0x3b,0xd0,0xb8,0x00,0x3b,0x2f,0xba,
-0x00,0x48,0x00,0x18,0x00,0x44,0x11,0x12,0x39,0xba,0x00,0x75,0x00,0x85,0x00,0x81,
-0x11,0x12,0x39,0xb8,0x00,0x81,0x10,0xb8,0x00,0x89,0xd0,0xb8,0x00,0x85,0x10,0xb8,
-0x00,0x8d,0xd0,0xba,0x00,0x92,0x00,0x35,0x00,0xa5,0x11,0x12,0x39,0xb8,0x00,0xa5,
-0x10,0xb8,0x00,0x94,0xd0,0xb8,0x00,0x94,0x2f,0xb8,0x00,0x18,0x10,0xb8,0x00,0x95,
-0xdc,0xba,0x00,0xa8,0x00,0x35,0x00,0xa5,0x11,0x12,0x39,0xb8,0x00,0x18,0x10,0xb8,
-0x00,0xba,0xd0,0xba,0x00,0xc3,0x00,0x35,0x00,0xa5,0x11,0x12,0x39,0xba,0x00,0xcc,
-0x00,0x35,0x00,0xa5,0x11,0x12,0x39,0xba,0x00,0xce,0x00,0x35,0x00,0xa5,0x11,0x12,
-0x39,0xba,0x00,0xd1,0x00,0x35,0x00,0xa5,0x11,0x12,0x39,0xb8,0x00,0x18,0x10,0xb8,
-0x00,0xd8,0xd0,0xba,0x00,0xdb,0x00,0x35,0x00,0xa5,0x11,0x12,0x39,0xba,0x00,0xdd,
-0x00,0x35,0x00,0xa5,0x11,0x12,0x39,0xba,0x00,0xe0,0x00,0x35,0x00,0xa5,0x11,0x12,
-0x39,0xba,0x00,0xe2,0x00,0x35,0x00,0xa5,0x11,0x12,0x39,0xba,0x00,0xe8,0x00,0x35,
-0x00,0xa5,0x11,0x12,0x39,0xba,0x00,0xfe,0x00,0x35,0x00,0xa5,0x11,0x12,0x39,0xb8,
-0x00,0x35,0x10,0xb8,0x01,0x03,0xd0,0xba,0x01,0x10,0x00,0x35,0x00,0xa5,0x11,0x12,
-0x39,0xb8,0x00,0x35,0x10,0xb8,0x01,0x1c,0xd0,0xb8,0x01,0x1c,0x2f,0xba,0x01,0x22,
-0x00,0x35,0x00,0xa5,0x11,0x12,0x39,0xba,0x01,0x28,0x00,0x35,0x00,0xa5,0x11,0x12,
-0x39,0xba,0x01,0x33,0x00,0x35,0x00,0xa5,0x11,0x12,0x39,0x30,0x31,0x01,0x20,0x17,
-0x16,0x1d,0x01,0x14,0x07,0x17,0x15,0x14,0x07,0x33,0x36,0x35,0x36,0x3b,0x01,0x32,
-0x15,0x16,0x1d,0x01,0x06,0x23,0x27,0x06,0x07,0x15,0x17,0x37,0x16,0x15,0x14,0x07,
-0x14,0x2b,0x01,0x22,0x2f,0x01,0x06,0x23,0x22,0x27,0x06,0x15,0x06,0x2b,0x01,0x22,
-0x35,0x26,0x35,0x34,0x37,0x17,0x37,0x35,0x25,0x07,0x22,0x27,0x35,0x34,0x37,0x36,
-0x3b,0x01,0x32,0x1f,0x01,0x35,0x27,0x37,0x26,0x35,0x36,0x25,0x36,0x01,0x14,0x17,
-0x33,0x35,0x26,0x35,0x36,0x3b,0x01,0x17,0x07,0x17,0x15,0x07,0x15,0x14,0x17,0x16,
-0x1d,0x01,0x17,0x33,0x37,0x34,0x37,0x36,0x35,0x27,0x37,0x35,0x27,0x37,0x16,0x1d,
-0x01,0x07,0x17,0x36,0x3d,0x01,0x34,0x27,0x26,0x2b,0x01,0x20,0x07,0x06,0x05,0x16,
-0x07,0x06,0x27,0x22,0x27,0x34,0x21,0x16,0x17,0x06,0x23,0x22,0x27,0x26,0x13,0x33,
-0x24,0x33,0x17,0x36,0x35,0x26,0x35,0x26,0x23,0x06,0x07,0x06,0x15,0x25,0x06,0x23,
-0x06,0x15,0x17,0x37,0x16,0x17,0x35,0x34,0x27,0x26,0x35,0x26,0x05,0x17,0x15,0x07,
-0x26,0x35,0x34,0x37,0x16,0x15,0x14,0x07,0x27,0x35,0x01,0x16,0x33,0x36,0x37,0x26,
-0x37,0x06,0x07,0x06,0x2b,0x01,0x26,0x27,0x26,0x27,0x16,0x37,0x16,0x17,0x33,0x35,
-0x26,0x05,0x15,0x32,0x3f,0x01,0x22,0x07,0x05,0x15,0x17,0x35,0x25,0x15,0x37,0x35,
-0x05,0x15,0x17,0x35,0x33,0x15,0x37,0x27,0x07,0x15,0x37,0x27,0x07,0x15,0x33,0x35,
-0x33,0x15,0x33,0x35,0x07,0x15,0x17,0x35,0x17,0x15,0x33,0x35,0x07,0x15,0x33,0x35,
-0x05,0x27,0x07,0x15,0x16,0x15,0x16,0x33,0x32,0x37,0x36,0x37,0x26,0x35,0x06,0x25,
-0x07,0x16,0x15,0x14,0x17,0x32,0x3f,0x01,0x26,0x23,0x07,0x25,0x07,0x17,0x35,0x07,
-0x15,0x17,0x35,0x27,0x15,0x17,0x35,0x17,0x15,0x37,0x35,0x37,0x15,0x37,0x35,0x37,
-0x15,0x37,0x35,0x03,0xa7,0x01,0x31,0x92,0x3a,0x65,0x06,0x19,0x06,0xa0,0x2c,0x24,
-0x08,0x3f,0x46,0x1a,0x3f,0x59,0xf8,0x3e,0xea,0x46,0x5f,0x4c,0x41,0x06,0x33,0x45,
-0xbe,0x4c,0xac,0xaf,0x48,0xd1,0x33,0x2c,0x0e,0x38,0x4c,0x59,0x4c,0xe4,0xfe,0xd0,
-0x6c,0x45,0x07,0x46,0x04,0x27,0x21,0x30,0x3c,0x85,0x19,0x0c,0x6b,0x23,0x01,0x07,
-0x67,0xfe,0x9a,0x46,0x07,0x1f,0x0b,0x0d,0x0d,0x13,0x0d,0x20,0x13,0x99,0x45,0x65,
-0x59,0x7f,0xc4,0x21,0x1a,0x21,0x0d,0x1f,0x19,0x1f,0x06,0x47,0xe0,0x80,0x70,0x26,
-0xfe,0xad,0x69,0x14,0x01,0x71,0x39,0x0d,0x3a,0x5e,0x4e,0x24,0x01,0xcf,0xcb,0x06,
-0x25,0x60,0x42,0x43,0x02,0xed,0x06,0x01,0x18,0x18,0x66,0x20,0x46,0x07,0x14,0x1c,
-0x34,0xf9,0xfc,0x22,0x11,0x0e,0x34,0x2e,0x5f,0x3f,0xf1,0x65,0xcb,0x19,0x02,0x65,
-0x0e,0x33,0x26,0x7b,0x45,0x28,0x31,0xfe,0xf5,0x2d,0xd6,0xd9,0x2b,0x06,0x21,0x24,
-0x1c,0x4b,0x74,0x38,0xbf,0x0c,0x07,0x2d,0x1c,0x0a,0x14,0x19,0x06,0x09,0x01,0x87,
-0x0f,0x03,0x19,0x0d,0x18,0xfe,0x96,0x12,0x01,0x24,0x1a,0xfe,0xd6,0x19,0xcc,0x1b,
-0x02,0x47,0x17,0x03,0x73,0x20,0x14,0x19,0xa5,0x19,0x73,0x19,0x4d,0x20,0xfd,0xf9,
-0x72,0x07,0x45,0x06,0x0e,0x13,0x46,0x9b,0x22,0x13,0xba,0x03,0x0f,0x12,0xe3,0x32,
-0x15,0x0c,0x3e,0x06,0x1f,0x5f,0xfd,0xa3,0x03,0x1d,0x19,0x19,0x70,0x19,0xcc,0x1b,
-0x0f,0x19,0x14,0x1a,0x05,0xd8,0xc1,0x6c,0x54,0x45,0x72,0x66,0x5e,0x06,0x35,0x2e,
-0x3e,0x3d,0x39,0x7c,0x35,0x22,0x18,0x2d,0x07,0x6c,0x29,0x12,0x64,0x0d,0x12,0x2c,
-0x26,0x3e,0x76,0x76,0x5d,0x63,0x63,0x63,0x19,0x57,0x70,0x43,0x2d,0x2b,0x0d,0x0d,
-0x64,0x12,0x95,0x07,0x38,0x0d,0x1b,0x42,0x70,0x70,0x3e,0x06,0x57,0x5d,0x6f,0xd8,
-0xe6,0x61,0x1d,0xfe,0x78,0x76,0x75,0x50,0x70,0x38,0x32,0x13,0x2c,0x8e,0x44,0xa8,
-0x0c,0x5e,0x1e,0x38,0x2c,0x18,0x0d,0x1a,0x5e,0x42,0x24,0x4b,0xbb,0x9c,0x12,0x2b,
-0x14,0x0b,0x22,0x31,0xae,0x18,0x52,0x5b,0x2b,0xd2,0x65,0x2a,0xf1,0x3b,0xd0,0x10,
-0x47,0xa0,0x05,0x9b,0x57,0x0a,0x51,0x97,0x9b,0x55,0xfe,0x12,0x82,0x05,0x08,0x0a,
-0x49,0x26,0x3f,0x09,0x67,0x70,0x13,0xeb,0x6f,0x25,0x19,0x0b,0x05,0x12,0x77,0x0d,
-0x5e,0x19,0x53,0x41,0x24,0x0d,0x07,0x9f,0x32,0x0c,0x39,0x69,0x2d,0x35,0x6e,0x30,
-0x08,0x32,0xa2,0xfe,0x86,0xc7,0x0e,0xbf,0x44,0x7c,0x26,0xae,0x49,0x16,0x59,0x5e,
-0x50,0x77,0x5e,0x25,0x88,0x5c,0x3f,0x3f,0x5c,0x4f,0x57,0x43,0x0d,0x2c,0x05,0x2c,
-0x05,0x31,0x0a,0x2f,0x0f,0x32,0x05,0x31,0x31,0x08,0x2f,0x06,0x3d,0x02,0x3b,0x06,
-0x37,0x37,0x37,0x37,0x3d,0x33,0x05,0x32,0x0e,0x31,0x38,0x07,0x31,0x31,0x7b,0x05,
-0x05,0x13,0x39,0x30,0x38,0x68,0x4e,0x1d,0x25,0x1e,0x62,0x5c,0x44,0x68,0x2c,0x0f,
-0x29,0x68,0x3f,0x12,0x05,0xcc,0x31,0x06,0x37,0x49,0x32,0x06,0x31,0x21,0x31,0x07,
-0x32,0x18,0x32,0x06,0x32,0x04,0x32,0x05,0x33,0x0a,0x32,0x07,0x31,0x00,0x00,0x01,
-0x00,0xac,0x00,0x00,0x06,0x81,0x05,0xd8,0x00,0x26,0x00,0x0b,0x00,0xb8,0x00,0x00,
-0x2f,0xb8,0x00,0x11,0x2f,0x30,0x31,0x01,0x32,0x17,0x16,0x15,0x14,0x07,0x01,0x07,
-0x14,0x17,0x25,0x32,0x17,0x15,0x14,0x23,0x05,0x22,0x27,0x26,0x3d,0x01,0x34,0x37,
-0x00,0x37,0x36,0x35,0x34,0x27,0x23,0x05,0x22,0x27,0x35,0x34,0x37,0x33,0x04,0x42,
-0x8f,0x71,0x34,0x7c,0xfd,0x6c,0x0b,0x61,0x03,0x6e,0x4e,0x09,0x69,0xfc,0xa1,0xa1,
-0x6c,0x1b,0x8b,0x02,0x6d,0x14,0x0b,0x62,0x0b,0xfc,0xb5,0x39,0x0b,0x62,0x0e,0x05,
-0xd8,0x8d,0x4d,0x4f,0x8a,0x62,0xfd,0xa0,0x3e,0x59,0x1a,0xd1,0x61,0x03,0x59,0xc6,
-0xae,0x35,0x38,0x18,0x8a,0x6c,0x02,0x37,0x1b,0x1b,0x16,0x50,0x20,0xcc,0x50,0x1e,
-0x40,0x0c,0x00,0x06,0x00,0xaa,0x00,0x00,0x06,0x82,0x05,0xd8,0x00,0x11,0x00,0x24,
-0x00,0x30,0x00,0x3c,0x00,0x46,0x00,0x58,0x00,0x3f,0xb8,0x00,0x59,0x2f,0xb8,0x00,
-0x5a,0x2f,0xb8,0x00,0x04,0xdc,0xb8,0x00,0x59,0x10,0xb8,0x00,0x0d,0xd0,0xb8,0x00,
-0x0d,0x2f,0xb8,0x00,0x18,0xdc,0xb8,0x00,0x04,0x10,0xb8,0x00,0x20,0xdc,0x00,0xba,
-0x00,0x1c,0x00,0x09,0x00,0x03,0x2b,0xb8,0x00,0x1c,0x10,0xba,0x00,0x00,0x00,0x14,
-0x00,0x03,0x2b,0xb8,0x00,0x00,0x10,0x30,0x31,0x01,0x20,0x01,0x16,0x15,0x10,0x05,
-0x06,0x2b,0x01,0x20,0x01,0x26,0x3d,0x01,0x10,0x01,0x36,0x05,0x26,0x23,0x20,0x03,
-0x06,0x15,0x10,0x05,0x16,0x33,0x20,0x13,0x36,0x3d,0x01,0x02,0x25,0x26,0x01,0x23,
-0x22,0x27,0x13,0x16,0x3b,0x01,0x32,0x37,0x13,0x06,0x01,0x06,0x1d,0x01,0x21,0x35,
-0x10,0x25,0x36,0x37,0x13,0x06,0x25,0x16,0x17,0x21,0x26,0x27,0x26,0x27,0x13,0x16,
-0x01,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x2b,0x01,0x22,0x27,0x26,0x3d,0x01,0x34,
-0x37,0x36,0x03,0x89,0x01,0x7f,0x01,0x08,0x72,0xfe,0xc3,0xc2,0xd4,0x20,0xfe,0x84,
-0xfe,0xfa,0x63,0x01,0x52,0xb9,0x02,0x1e,0xa6,0xa7,0xfe,0xd4,0xeb,0x7e,0x01,0x17,
-0xb2,0xdf,0x01,0x55,0xea,0x59,0x01,0xfe,0xad,0x05,0xfe,0xd4,0x1c,0xa8,0x8d,0xd1,
-0x30,0x38,0x08,0x32,0x2e,0xd4,0x8d,0xfe,0xe0,0x5f,0xfe,0x57,0x01,0x1f,0x12,0x13,
-0xd2,0x07,0x02,0x86,0x5f,0x03,0xfe,0x56,0x01,0x1f,0x22,0x2b,0xd2,0x7d,0xfe,0x49,
-0x52,0x38,0x19,0x44,0x29,0x2e,0x07,0x50,0x39,0x14,0x48,0x27,0x05,0xd8,0xfe,0x8d,
-0xaf,0xd6,0xfe,0xb0,0xfd,0x93,0x01,0x83,0xae,0xb2,0x1c,0x01,0x53,0x01,0x02,0x84,
-0xac,0x5d,0xfe,0xd9,0xb1,0xc2,0xfe,0xc4,0xe2,0x8a,0x01,0x5a,0x96,0xa6,0x0f,0x01,
-0x59,0xe0,0x04,0xfb,0x48,0x59,0x01,0x6f,0x1f,0x1d,0xfe,0x92,0x58,0x03,0x28,0x49,
-0x5f,0x05,0x10,0x01,0x20,0xdb,0x0d,0x0c,0xfe,0x92,0x04,0x8f,0x91,0xb0,0x3b,0x2e,
-0x32,0x19,0x01,0x6c,0x4f,0xfe,0xcf,0x50,0x25,0x2e,0x47,0x36,0x1f,0x52,0x25,0x26,
-0x05,0x49,0x38,0x1c,0x00,0x06,0x00,0x64,0x00,0x00,0x06,0xc8,0x05,0xd8,0x00,0x09,
-0x00,0x13,0x00,0x1d,0x00,0x38,0x00,0x50,0x00,0x69,0x00,0x5d,0x00,0xb8,0x00,0x39,
-0x2f,0xb8,0x00,0x5c,0x2f,0xb8,0x00,0x20,0x2f,0xb8,0x00,0x22,0x2f,0xb8,0x00,0x29,
-0x2f,0xba,0x00,0x57,0x00,0x67,0x00,0x03,0x2b,0xb8,0x00,0x57,0x10,0xba,0x00,0x1e,
-0x00,0x20,0x00,0x39,0x11,0x12,0x39,0xba,0x00,0x25,0x00,0x20,0x00,0x39,0x11,0x12,
-0x39,0xba,0x00,0x2b,0x00,0x20,0x00,0x39,0x11,0x12,0x39,0xb8,0x00,0x3d,0xd0,0xb8,
-0x00,0x3d,0x2f,0xba,0x00,0x43,0x00,0x20,0x00,0x39,0x11,0x12,0x39,0xba,0x00,0x51,
-0x00,0x20,0x00,0x39,0x11,0x12,0x39,0x30,0x31,0x01,0x3e,0x01,0x27,0x36,0x37,0x16,
-0x06,0x07,0x26,0x03,0x26,0x06,0x07,0x26,0x27,0x36,0x16,0x17,0x06,0x01,0x14,0x16,
-0x17,0x06,0x07,0x2e,0x01,0x37,0x16,0x01,0x06,0x23,0x22,0x27,0x26,0x27,0x07,0x06,
-0x07,0x06,0x23,0x22,0x27,0x16,0x24,0x37,0x36,0x27,0x37,0x16,0x37,0x17,0x06,0x17,
-0x1e,0x01,0x01,0x16,0x17,0x16,0x07,0x33,0x16,0x17,0x16,0x11,0x15,0x2e,0x01,0x23,
-0x06,0x07,0x27,0x36,0x27,0x35,0x36,0x37,0x36,0x26,0x01,0x26,0x35,0x34,0x37,0x36,
-0x17,0x27,0x26,0x27,0x12,0x25,0x06,0x02,0x17,0x16,0x1f,0x01,0x06,0x17,0x07,0x26,
-0x07,0x26,0x06,0x04,0x38,0x44,0x4e,0x07,0x24,0x24,0x0d,0x84,0x55,0x10,0x08,0x45,
-0xa8,0x3e,0x21,0x15,0x5d,0xfa,0x4a,0x19,0xfe,0x28,0x5b,0x46,0x03,0x10,0x68,0x79,
-0x0c,0x2a,0x03,0xc1,0x6d,0xa6,0x2e,0x32,0xa4,0x5c,0x01,0x3d,0x77,0x5c,0x60,0x7c,
-0x80,0x8f,0x01,0x05,0x3a,0x53,0x3f,0x45,0x44,0x3a,0x40,0x40,0x5d,0x3f,0xdc,0xfe,
-0xff,0xa2,0x5d,0x31,0x66,0x04,0x69,0x78,0xc3,0x0d,0xd2,0x70,0xb7,0x82,0x46,0x07,
-0x46,0xb6,0x54,0x44,0x27,0xfb,0x86,0x04,0x79,0x72,0xc1,0x02,0x2c,0x02,0x11,0x01,
-0x14,0xb1,0x34,0x38,0x65,0xbf,0x01,0x4c,0x0c,0x40,0x76,0xaf,0x85,0xb4,0x01,0x91,
-0x28,0x96,0x4e,0x0e,0x05,0x72,0xd5,0x25,0x26,0x02,0x26,0x26,0x07,0x2b,0x16,0x1c,
-0x46,0x09,0x37,0x21,0xfe,0xea,0x4e,0x8f,0x20,0x26,0x22,0x2e,0xdd,0x5c,0x06,0xfd,
-0xb2,0x53,0x06,0x24,0xaa,0x02,0x58,0x45,0x2f,0x4b,0x43,0x5c,0x61,0xa3,0xba,0x2a,
-0x30,0x2f,0x27,0xac,0x97,0x72,0x53,0x05,0xb6,0x43,0xd9,0x9f,0xa5,0x0a,0x43,0x82,
-0xfe,0xff,0x0a,0x9d,0xb6,0x0a,0x93,0x28,0x52,0x1b,0x4b,0x1f,0x9c,0x70,0xe8,0xfc,
-0x46,0x18,0x19,0x95,0xa1,0x7c,0x06,0x02,0x62,0x89,0x01,0x0e,0x70,0x68,0xfe,0xef,
-0x63,0x98,0x27,0x52,0x22,0x4a,0x24,0x8e,0x06,0x02,0x95,0x00,0x00,0x17,0x00,0x64,
-0xff,0xfc,0x04,0xf6,0x05,0xd1,0x00,0x03,0x00,0x13,0x00,0x19,0x00,0x1d,0x00,0x31,
-0x00,0x46,0x00,0x5b,0x00,0x71,0x00,0x8b,0x00,0x95,0x00,0x9a,0x00,0x9f,0x00,0xa4,
-0x00,0xa9,0x00,0xae,0x00,0xb3,0x00,0xb8,0x00,0xbd,0x00,0xc2,0x00,0xc7,0x00,0xcc,
-0x00,0xd1,0x00,0xfd,0x04,0x11,0xba,0x00,0x47,0x00,0x5e,0x00,0x03,0x2b,0xb8,0x00,
-0x47,0x10,0xb8,0x00,0x24,0xdc,0xb8,0x00,0x67,0xdc,0xb8,0x00,0x04,0xd0,0xb8,0x00,
-0x04,0x2f,0xba,0x00,0x08,0x00,0x24,0x00,0x67,0x11,0x12,0x39,0xba,0x00,0x09,0x00,
-0x24,0x00,0x67,0x11,0x12,0x39,0xba,0x00,0x0a,0x00,0x24,0x00,0x67,0x11,0x12,0x39,
-0xba,0x00,0x12,0x00,0x24,0x00,0x67,0x11,0x12,0x39,0xba,0x00,0x14,0x00,0x5e,0x00,
-0x47,0x11,0x12,0x39,0xb8,0x00,0x47,0x10,0xb8,0x00,0x1e,0xd0,0xb8,0x00,0xf2,0x10,
-0xb8,0x00,0x1f,0xd0,0xb8,0x00,0x71,0x10,0xb8,0x00,0x23,0xd0,0xb8,0x00,0x47,0x10,
-0xb8,0x00,0xcb,0xdc,0xb8,0x00,0x26,0xd0,0xb8,0x00,0x26,0x2f,0xba,0x00,0x2a,0x00,
-0x5e,0x00,0x47,0x11,0x12,0x39,0xb8,0x00,0x47,0x10,0xb8,0x00,0x32,0xd0,0xb8,0x00,
-0xf2,0x10,0xb8,0x00,0x33,0xd0,0xb8,0x00,0x24,0x10,0xb8,0x00,0x34,0xd0,0xb8,0x00,
-0x71,0x10,0xb8,0x00,0x35,0xd0,0xb8,0x00,0x5e,0x10,0xb8,0x00,0x37,0xd0,0xb8,0x00,
-0x37,0x2f,0xba,0x00,0x3b,0x00,0x5e,0x00,0x47,0x11,0x12,0x39,0xb8,0x00,0xcb,0x10,
-0xb8,0x00,0x3d,0xd0,0xb8,0x00,0x3d,0x2f,0xb8,0x00,0x24,0x10,0xb8,0x00,0xaa,0xdc,
-0xb8,0x00,0x40,0xd0,0xb8,0x00,0x40,0x2f,0xba,0x00,0x43,0x00,0x24,0x00,0x67,0x11,
-0x12,0x39,0xb8,0x00,0x24,0x10,0xb8,0x00,0x49,0xd0,0xb8,0x00,0x71,0x10,0xb8,0x00,
-0x4a,0xd0,0xba,0x00,0x50,0x00,0x5e,0x00,0x47,0x11,0x12,0x39,0xb8,0x00,0x67,0x10,
-0xb8,0x00,0x55,0xd0,0xb8,0x00,0x55,0x2f,0xba,0x00,0x58,0x00,0x24,0x00,0x67,0x11,
-0x12,0x39,0xb8,0x00,0xaa,0x10,0xb8,0x00,0x5a,0xd0,0xb8,0x00,0x5a,0x2f,0xb8,0x00,
-0x24,0x10,0xb8,0x00,0x5c,0xd0,0xba,0x00,0x62,0x00,0x5e,0x00,0x47,0x11,0x12,0x39,
-0xb8,0x00,0xcb,0x10,0xb8,0x00,0x64,0xd0,0xb8,0x00,0x64,0x2f,0xba,0x00,0x6b,0x00,
-0x24,0x00,0x67,0x11,0x12,0x39,0xb8,0x00,0x47,0x10,0xb8,0x00,0x6f,0xd0,0xb8,0x00,
-0xf2,0x10,0xb8,0x00,0x70,0xd0,0xb8,0x00,0x47,0x10,0xb8,0x00,0x72,0xd0,0xb8,0x00,
-0xf2,0x10,0xb8,0x00,0x73,0xd0,0xb8,0x00,0x24,0x10,0xb8,0x00,0x74,0xd0,0xb8,0x00,
-0x71,0x10,0xb8,0x00,0x75,0xd0,0xba,0x00,0x7b,0x00,0x5e,0x00,0x47,0x11,0x12,0x39,
-0xba,0x00,0x7c,0x00,0x5e,0x00,0x47,0x11,0x12,0x39,0xba,0x00,0x7d,0x00,0x5e,0x00,
-0x47,0x11,0x12,0x39,0xb8,0x00,0x5e,0x10,0xb8,0x00,0x81,0xd0,0xb8,0x00,0x81,0x2f,
-0xba,0x00,0x88,0x00,0x24,0x00,0x67,0x11,0x12,0x39,0xb8,0x00,0x67,0x10,0xb8,0x00,
-0x8a,0xd0,0xb8,0x00,0x8a,0x2f,0xba,0x00,0x90,0x00,0x5e,0x00,0x47,0x11,0x12,0x39,
-0xba,0x00,0x92,0x00,0x5e,0x00,0x47,0x11,0x12,0x39,0xba,0x00,0x9b,0x00,0x24,0x00,
-0x67,0x11,0x12,0x39,0xba,0x00,0xa0,0x00,0x24,0x00,0x67,0x11,0x12,0x39,0xba,0x00,
-0xa5,0x00,0x24,0x00,0x67,0x11,0x12,0x39,0xba,0x00,0xaf,0x00,0x24,0x00,0x67,0x11,
-0x12,0x39,0xba,0x00,0xb1,0x00,0x24,0x00,0x67,0x11,0x12,0x39,0xba,0x00,0xbc,0x00,
-0x5e,0x00,0x37,0x11,0x12,0x39,0xba,0x00,0xc1,0x00,0x5e,0x00,0x47,0x11,0x12,0x39,
-0xba,0x00,0xc6,0x00,0x5e,0x00,0x47,0x11,0x12,0x39,0xba,0x00,0xce,0x00,0x5e,0x00,
-0x47,0x11,0x12,0x39,0xba,0x00,0xd0,0x00,0x5e,0x00,0x47,0x11,0x12,0x39,0xb8,0x00,
-0x47,0x10,0xb8,0x00,0xd2,0xd0,0xb8,0x00,0xf2,0x10,0xb8,0x00,0xd3,0xd0,0xb8,0x00,
-0x24,0x10,0xb8,0x00,0xd4,0xd0,0xb8,0x00,0x71,0x10,0xb8,0x00,0xd5,0xd0,0xb8,0x00,
-0x24,0x10,0xb8,0x00,0xdf,0xd0,0xb8,0x00,0x71,0x10,0xb8,0x00,0xe0,0xd0,0xb8,0x00,
-0x47,0x10,0xb8,0x00,0xf5,0xd0,0xb8,0x00,0xf2,0x10,0xb8,0x00,0xf6,0xd0,0x00,0xb8,
-0x00,0x92,0x2f,0xb8,0x00,0xe9,0x2f,0xb8,0x00,0x16,0x2f,0xb8,0x00,0x21,0x2f,0xb8,
-0x00,0x2f,0x2f,0xba,0x00,0xdb,0x00,0xd7,0x00,0x03,0x2b,0xb8,0x00,0xdb,0x10,0xba,
-0x00,0x79,0x00,0x75,0x00,0x03,0x2b,0xb8,0x00,0x79,0x10,0xba,0x00,0x08,0x00,0x75,
-0x00,0x79,0x11,0x12,0x39,0xba,0x00,0x09,0x00,0x75,0x00,0x79,0x11,0x12,0x39,0xba,
-0x00,0x0a,0x00,0x75,0x00,0x79,0x11,0x12,0x39,0xb8,0x00,0x0c,0xd0,0xb8,0x00,0x0c,
-0x2f,0xba,0x00,0x12,0x00,0x75,0x00,0x79,0x11,0x12,0x39,0xba,0x00,0x14,0x00,0x2f,
-0x00,0xe9,0x11,0x12,0x39,0xba,0x00,0x1e,0x00,0x2f,0x00,0xe9,0x11,0x12,0x39,0xba,
-0x00,0x2a,0x00,0x2f,0x00,0xe9,0x11,0x12,0x39,0xba,0x00,0x3b,0x00,0x2f,0x00,0xe9,
-0x11,0x12,0x39,0xba,0x00,0x43,0x00,0x2f,0x00,0xe9,0x11,0x12,0x39,0xb8,0x00,0x75,
-0x10,0xb8,0x00,0x50,0xd0,0xb8,0x00,0x50,0x2f,0xba,0x00,0x58,0x00,0x2f,0x00,0xe9,
-0x11,0x12,0x39,0xba,0x00,0x62,0x00,0x2f,0x00,0xe9,0x11,0x12,0x39,0xba,0x00,0x6b,
-0x00,0x2f,0x00,0xe9,0x11,0x12,0x39,0xb8,0x00,0x75,0x10,0xb8,0x00,0x72,0xd0,0xb8,
-0x00,0x72,0x2f,0xba,0x00,0x7b,0x00,0x75,0x00,0x79,0x11,0x12,0x39,0xba,0x00,0x7c,
-0x00,0x75,0x00,0x79,0x11,0x12,0x39,0xba,0x00,0x7d,0x00,0x75,0x00,0x79,0x11,0x12,
-0x39,0xba,0x00,0x88,0x00,0x2f,0x00,0xe9,0x11,0x12,0x39,0xba,0x00,0x90,0x00,0xd7,
-0x00,0xdb,0x11,0x12,0x39,0xba,0x00,0x96,0x00,0xd7,0x00,0xdb,0x11,0x12,0x39,0xba,
-0x00,0x9b,0x00,0xd7,0x00,0xdb,0x11,0x12,0x39,0xba,0x00,0xa0,0x00,0xd7,0x00,0xdb,
-0x11,0x12,0x39,0xba,0x00,0xa5,0x00,0xd7,0x00,0xdb,0x11,0x12,0x39,0xba,0x00,0xaa,
-0x00,0xd7,0x00,0xdb,0x11,0x12,0x39,0xba,0x00,0xaf,0x00,0xd7,0x00,0xdb,0x11,0x12,
-0x39,0xba,0x00,0xb1,0x00,0xd7,0x00,0xdb,0x11,0x12,0x39,0xba,0x00,0xb7,0x00,0xd7,
-0x00,0xdb,0x11,0x12,0x39,0xba,0x00,0xbc,0x00,0xd7,0x00,0xdb,0x11,0x12,0x39,0xba,
-0x00,0xc1,0x00,0xd7,0x00,0xdb,0x11,0x12,0x39,0xba,0x00,0xc6,0x00,0xd7,0x00,0xdb,
-0x11,0x12,0x39,0xba,0x00,0xcb,0x00,0xd7,0x00,0xdb,0x11,0x12,0x39,0xba,0x00,0xce,
-0x00,0xd7,0x00,0xdb,0x11,0x12,0x39,0xba,0x00,0xd0,0x00,0xd7,0x00,0xdb,0x11,0x12,
-0x39,0xba,0x00,0xdf,0x00,0xd7,0x00,0xdb,0x11,0x12,0x39,0xba,0x00,0xf6,0x00,0xd7,
-0x00,0xdb,0x11,0x12,0x39,0xb8,0x00,0xdb,0x10,0xb8,0x00,0xf8,0xd0,0xb8,0x00,0xd7,
-0x10,0xb8,0x00,0xfc,0xd0,0x30,0x31,0x01,0x06,0x37,0x26,0x17,0x26,0x07,0x06,0x27,
-0x37,0x27,0x36,0x17,0x16,0x17,0x06,0x07,0x26,0x27,0x24,0x01,0x06,0x07,0x23,0x26,
-0x37,0x03,0x16,0x27,0x26,0x13,0x15,0x06,0x23,0x22,0x27,0x35,0x26,0x37,0x36,0x37,
-0x16,0x17,0x06,0x07,0x06,0x04,0x07,0x23,0x26,0x27,0x15,0x27,0x35,0x24,0x27,0x36,
-0x37,0x16,0x17,0x06,0x07,0x06,0x04,0x17,0x16,0x07,0x27,0x36,0x27,0x36,0x03,0x15,
-0x27,0x35,0x24,0x27,0x36,0x37,0x16,0x17,0x06,0x17,0x06,0x04,0x17,0x06,0x07,0x27,
-0x36,0x35,0x36,0x07,0x24,0x27,0x36,0x37,0x16,0x17,0x06,0x15,0x14,0x04,0x17,0x06,
-0x07,0x26,0x27,0x36,0x27,0x26,0x27,0x15,0x27,0x13,0x15,0x27,0x35,0x24,0x37,0x36,
-0x37,0x36,0x17,0x07,0x17,0x06,0x27,0x26,0x07,0x06,0x04,0x17,0x06,0x07,0x26,0x27,
-0x24,0x27,0x36,0x01,0x14,0x1e,0x01,0x33,0x26,0x37,0x22,0x0e,0x01,0x05,0x16,0x17,
-0x37,0x26,0x27,0x16,0x17,0x37,0x26,0x27,0x16,0x17,0x37,0x26,0x27,0x16,0x07,0x37,
-0x26,0x27,0x16,0x07,0x17,0x36,0x27,0x06,0x07,0x17,0x36,0x25,0x17,0x36,0x37,0x06,
-0x07,0x17,0x36,0x37,0x06,0x07,0x17,0x36,0x37,0x06,0x1f,0x01,0x26,0x37,0x06,0x17,
-0x37,0x26,0x37,0x06,0x17,0x37,0x26,0x27,0x06,0x17,0x15,0x27,0x35,0x26,0x07,0x20,
-0x27,0x36,0x25,0x16,0x17,0x16,0x33,0x35,0x26,0x27,0x2e,0x01,0x35,0x34,0x3e,0x01,
-0x33,0x32,0x1e,0x01,0x15,0x14,0x06,0x07,0x06,0x07,0x33,0x14,0x23,0x15,0x36,0x37,
-0x04,0x17,0x06,0x21,0x26,0x03,0x57,0x11,0x3d,0x0a,0x79,0x0a,0x2f,0x5f,0x49,0x5b,
-0x6c,0x2a,0x4f,0xcc,0x0d,0x02,0x8d,0x46,0x9d,0x01,0x17,0xfe,0x83,0x5f,0x1f,0x0f,
-0x01,0x56,0x68,0x42,0x15,0x22,0xef,0x0b,0x1a,0x22,0x03,0xaf,0x01,0x04,0x40,0x2e,
-0x2c,0x3c,0x01,0x03,0x01,0x39,0x02,0x0f,0x1a,0x74,0x4a,0xfe,0xe8,0x04,0x02,0x80,
-0x34,0x56,0xaa,0x04,0x05,0x01,0xb5,0x06,0x04,0x74,0x31,0x50,0x0d,0x01,0x51,0x4a,
-0xfe,0x93,0x03,0x05,0x71,0x4d,0x69,0xdb,0x0e,0x0a,0x02,0x76,0x02,0x05,0x96,0x68,
-0xa3,0x02,0xff,0xfe,0xf3,0x05,0x01,0x70,0x48,0x49,0xa3,0x02,0x15,0x03,0x04,0xae,
-0x21,0x3a,0xb4,0x05,0x02,0xbb,0x4a,0x4a,0x4a,0xfe,0x80,0x01,0x0d,0xcd,0x42,0x37,
-0x6d,0x5c,0x4a,0x5f,0x2f,0x0a,0x04,0x02,0xd6,0x06,0x07,0xae,0x3f,0x6f,0x01,0x07,
-0x02,0x0c,0xfe,0x76,0x12,0x21,0x12,0x1e,0x1e,0x11,0x22,0x12,0x01,0xba,0x74,0x2c,
-0x1b,0x60,0x97,0x73,0x26,0x2a,0x5f,0x7e,0x50,0x11,0x31,0x3e,0x81,0x35,0x01,0x3d,
-0x27,0x67,0x03,0x19,0x3d,0x02,0x40,0x32,0x34,0x3c,0x31,0xfd,0x0d,0x1b,0x2d,0x73,
-0x5b,0x2c,0x2a,0x26,0x73,0x64,0x14,0x31,0x11,0x50,0x54,0x10,0x3e,0x02,0x35,0x4a,
-0x40,0x3d,0x19,0x03,0x29,0x6a,0x3c,0x34,0x32,0x07,0xeb,0x4a,0x43,0x7f,0xfe,0xf5,
-0x59,0x54,0x01,0x5f,0x17,0x59,0x02,0x01,0x03,0x02,0x14,0x17,0x17,0x29,0x15,0x15,
-0x29,0x17,0x16,0x14,0x03,0x03,0x01,0x01,0x58,0x18,0x01,0x5e,0x54,0x59,0xfe,0xf5,
-0x7b,0x04,0x20,0x23,0x18,0x14,0x6d,0x37,0x0b,0x22,0x0f,0x17,0x19,0x4a,0x0e,0x04,
-0x7d,0x3e,0x20,0x11,0x09,0x14,0xfc,0xce,0x22,0x3c,0x48,0x23,0x03,0xa6,0x1a,0x25,
-0x09,0xfc,0x2d,0x38,0x1a,0x38,0x29,0x1e,0x37,0x30,0x18,0x0d,0x06,0x15,0x13,0x2a,
-0x37,0x66,0x38,0xad,0x5a,0x0d,0x5c,0x2b,0x48,0x44,0x20,0x13,0x09,0x19,0x26,0x2b,
-0x3e,0x48,0x31,0x0e,0x0b,0x14,0x24,0x17,0x01,0x99,0x8c,0x0d,0x89,0x26,0x62,0x35,
-0x16,0x14,0x07,0x10,0x20,0x34,0x43,0x55,0x45,0x20,0x1b,0x27,0x19,0x28,0xa4,0x21,
-0x60,0x39,0x1e,0x0c,0x07,0x21,0x2c,0x28,0x4d,0x54,0x45,0x15,0x0f,0x0b,0x1f,0x2b,
-0x1f,0x1d,0x85,0x0c,0x02,0x04,0x7f,0x08,0x7d,0x15,0x72,0x7d,0x04,0x04,0x41,0x18,
-0x17,0x0f,0x22,0x0b,0x37,0x2c,0x29,0x66,0x5b,0x14,0x10,0x0f,0x1c,0x34,0x1f,0x02,
-0x66,0x12,0x20,0x11,0x41,0x44,0x11,0x20,0x3c,0x40,0x30,0x26,0x39,0x15,0x63,0x3f,
-0x22,0x56,0x2b,0x80,0x47,0x13,0x6f,0x4d,0x93,0x4b,0x08,0x7e,0x61,0x9c,0x47,0x0b,
-0x84,0x67,0x89,0x39,0x19,0x73,0x0b,0x26,0x30,0x40,0x11,0x6b,0x22,0x3f,0x63,0x2a,
-0x89,0x13,0x47,0x80,0x45,0x89,0x08,0x4b,0x93,0x58,0x8d,0x0b,0x47,0x9c,0x6a,0x74,
-0x19,0x39,0x89,0x68,0xb9,0xce,0x06,0xc2,0x4e,0x26,0xa5,0x5c,0x06,0x36,0x1e,0x01,
-0x18,0x01,0x02,0x0a,0x27,0x16,0x15,0x27,0x16,0x16,0x27,0x15,0x16,0x27,0x0a,0x02,
-0x01,0x01,0x16,0x1e,0x36,0x06,0x5c,0xa5,0x25,0x00,0x00,0x02,0x00,0xaa,0x00,0x00,
-0x05,0x4e,0x05,0xd9,0x00,0x07,0x00,0x24,0x00,0x91,0xb8,0x00,0x25,0x2f,0xb8,0x00,
-0x0a,0xd0,0xb8,0x00,0x0a,0x2f,0xb8,0x00,0x08,0xdc,0x41,0x03,0x00,0xff,0x00,0x08,
-0x00,0x01,0x5d,0xb8,0x00,0x00,0xdc,0x41,0x03,0x00,0xff,0x00,0x00,0x00,0x01,0x5d,
-0xb8,0x00,0x0a,0x10,0xb8,0x00,0x04,0xdc,0xb8,0x00,0x00,0x10,0xb8,0x00,0x0e,0xdc,
-0xb8,0x00,0x08,0x10,0xb8,0x00,0x10,0xdc,0xb8,0x00,0x18,0xd0,0xba,0x00,0x1a,0x00,
-0x00,0x00,0x0e,0x11,0x12,0x39,0xba,0x00,0x1b,0x00,0x0a,0x00,0x08,0x11,0x12,0x39,
-0xb8,0x00,0x08,0x10,0xb8,0x00,0x1d,0xd0,0xb8,0x00,0x0e,0x10,0xb8,0x00,0x26,0xdc,
-0x00,0xb8,0x00,0x1a,0x2f,0xba,0x00,0x0c,0x00,0x02,0x00,0x03,0x2b,0xb8,0x00,0x0c,
-0x10,0xba,0x00,0x11,0x00,0x16,0x00,0x03,0x2b,0xb8,0x00,0x11,0x10,0xb8,0x00,0x08,
-0xd0,0xb8,0x00,0x16,0x10,0xb8,0x00,0x1e,0xd0,0x30,0x31,0x01,0x26,0x27,0x06,0x07,
-0x16,0x17,0x36,0x07,0x26,0x27,0x36,0x37,0x16,0x17,0x16,0x07,0x33,0x32,0x37,0x11,
-0x26,0x07,0x23,0x11,0x14,0x17,0x21,0x36,0x35,0x11,0x23,0x26,0x07,0x11,0x16,0x33,
-0x03,0x79,0x02,0x79,0x79,0x02,0x08,0x73,0x7e,0xc8,0x77,0x0c,0x03,0xca,0xca,0x03,
-0x05,0x88,0xa3,0xb5,0xae,0xac,0xb6,0xa4,0x63,0xfe,0xa6,0x63,0xa8,0xb6,0xac,0xae,
-0xb5,0x04,0xde,0xb1,0x02,0x02,0xb1,0x8e,0x71,0x5a,0x72,0x65,0xb8,0xf3,0x02,0x02,
-0xf3,0xc2,0x5b,0x63,0xfe,0xf7,0x37,0x01,0xfe,0x0c,0xb5,0xae,0xae,0xb5,0x01,0xf4,
-0x01,0x37,0x01,0x09,0x63,0x00,0x00,0x03,0x00,0xaa,0xff,0xfd,0x04,0x88,0x05,0xd9,
-0x00,0x03,0x00,0x20,0x00,0x2c,0x01,0x0b,0xba,0x00,0x21,0x00,0x17,0x00,0x03,0x2b,
-0xb8,0x00,0x21,0x10,0xba,0x00,0x10,0x00,0x22,0x00,0x03,0x2b,0xb8,0x00,0x10,0x10,
-0xb8,0x00,0x02,0xd0,0xb8,0x00,0x02,0x2f,0xb8,0x00,0x21,0x10,0xb8,0x00,0x19,0xdc,
-0xb8,0x00,0x04,0xd0,0xb8,0x00,0x04,0x2f,0xb8,0x00,0x16,0x10,0xb8,0x00,0x05,0xd0,
-0xb8,0x00,0x05,0x2f,0xb8,0x00,0x10,0x10,0xb8,0x00,0x06,0xd0,0xb8,0x00,0x10,0x10,
-0xb8,0x00,0x0a,0xd0,0xb8,0x00,0x19,0x10,0xb8,0x00,0x11,0xdc,0xb8,0x00,0x10,0x10,
-0xb8,0x00,0x13,0xd0,0xb8,0x00,0x13,0x2f,0xb8,0x00,0x19,0x10,0xb8,0x00,0x15,0xd0,
-0xb8,0x00,0x15,0x2f,0xb8,0x00,0x16,0x10,0xb8,0x00,0x1a,0xd0,0xb8,0x00,0x19,0x10,
-0xb8,0x00,0x1d,0xd0,0xb8,0x00,0x1d,0x2f,0xb8,0x00,0x16,0x10,0xb8,0x00,0x1e,0xd0,
-0xb8,0x00,0x1e,0x2f,0xb8,0x00,0x22,0x10,0xb8,0x00,0x26,0xd0,0xb8,0x00,0x21,0x10,
-0xb8,0x00,0x28,0xd0,0x00,0xb8,0x00,0x14,0x2f,0xba,0x00,0x04,0x00,0x00,0x00,0x03,
-0x2b,0xb8,0x00,0x04,0x10,0xba,0x00,0x02,0x00,0x0a,0x00,0x03,0x2b,0xb8,0x00,0x02,
-0x10,0xba,0x00,0x0c,0x00,0x26,0x00,0x03,0x2b,0xb8,0x00,0x0c,0x10,0xba,0x00,0x24,
-0x00,0x0e,0x00,0x03,0x2b,0xb8,0x00,0x24,0x10,0xb8,0x00,0x00,0x10,0xb8,0x00,0x05,
-0xdc,0xb8,0x00,0x04,0x10,0xb8,0x00,0x07,0xd0,0xb8,0x00,0x0e,0x10,0xb8,0x00,0x1a,
-0xd0,0xb8,0x00,0x0c,0x10,0xb8,0x00,0x1c,0xd0,0xb8,0x00,0x0a,0x10,0xb8,0x00,0x1e,
-0xd0,0xb8,0x00,0x26,0x10,0xb8,0x00,0x29,0xd0,0xb8,0x00,0x24,0x10,0xb8,0x00,0x2b,
-0xd0,0x30,0x31,0x01,0x15,0x33,0x35,0x27,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x33,
-0x05,0x15,0x21,0x11,0x17,0x15,0x27,0x03,0x23,0x03,0x27,0x35,0x17,0x11,0x21,0x35,
-0x21,0x35,0x23,0x35,0x13,0x33,0x11,0x21,0x35,0x21,0x35,0x23,0x15,0x21,0x15,0x21,
-0x02,0x2d,0xca,0xb7,0xab,0x7d,0x7d,0x09,0x01,0x94,0xfe,0x63,0x8f,0x88,0x01,0xb1,
-0x01,0x86,0x86,0xfe,0x6b,0x01,0x96,0x76,0xa4,0x47,0x01,0x0c,0xfe,0xf4,0x47,0xfe,
-0xf5,0x01,0x0b,0x05,0x40,0x3c,0x3c,0x33,0x66,0x66,0xa2,0x58,0x01,0xaf,0xfd,0xe8,
-0x8b,0x9c,0x85,0xfe,0xee,0x01,0xbc,0x86,0x9b,0x82,0x01,0x71,0xb0,0x58,0xa2,0xfc,
-0xcf,0x01,0xbb,0x47,0x63,0x63,0x47,0x00,0x00,0x02,0x00,0xaa,0x00,0x00,0x05,0x9b,
-0x07,0x4a,0x00,0x08,0x00,0x21,0x00,0xbd,0xb8,0x00,0x22,0x2f,0xb8,0x00,0x23,0x2f,
-0xb8,0x00,0x22,0x10,0xb8,0x00,0x09,0xd0,0xb8,0x00,0x09,0x2f,0xb8,0x00,0x13,0xdc,
-0xb8,0x00,0x00,0xd0,0xb8,0x00,0x23,0x10,0xb8,0x00,0x0e,0xdc,0xb8,0x00,0x05,0xdc,
-0x41,0x05,0x00,0xea,0x00,0x05,0x00,0xfa,0x00,0x05,0x00,0x02,0x5d,0x41,0x1b,0x00,
-0x19,0x00,0x05,0x00,0x29,0x00,0x05,0x00,0x39,0x00,0x05,0x00,0x49,0x00,0x05,0x00,
-0x59,0x00,0x05,0x00,0x69,0x00,0x05,0x00,0x79,0x00,0x05,0x00,0x89,0x00,0x05,0x00,
-0x99,0x00,0x05,0x00,0xa9,0x00,0x05,0x00,0xb9,0x00,0x05,0x00,0xc9,0x00,0x05,0x00,
-0xd9,0x00,0x05,0x00,0x0d,0x5d,0xb8,0x00,0x15,0xd0,0xb8,0x00,0x15,0x2f,0xb8,0x00,
-0x05,0x10,0xb8,0x00,0x17,0xd0,0xb8,0x00,0x17,0x2f,0xb8,0x00,0x13,0x10,0xb8,0x00,
-0x19,0xd0,0xb8,0x00,0x19,0x2f,0xb8,0x00,0x09,0x10,0xb8,0x00,0x1b,0xd0,0x00,0xb8,
-0x00,0x17,0x2f,0xb8,0x00,0x1a,0x2f,0xb8,0x00,0x1d,0x2f,0xba,0x00,0x0a,0x00,0x00,
-0x00,0x03,0x2b,0xb8,0x00,0x0a,0x10,0xba,0x00,0x02,0x00,0x11,0x00,0x03,0x2b,0xb8,
-0x00,0x02,0x10,0x30,0x31,0x01,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x01,0x11,
-0x21,0x32,0x16,0x15,0x14,0x06,0x2b,0x01,0x11,0x37,0x33,0x09,0x01,0x23,0x03,0x11,
-0x23,0x11,0x03,0x23,0x09,0x01,0x33,0x03,0x28,0xd1,0x74,0x7f,0x7f,0x74,0xfe,0x8a,
-0x01,0x76,0xce,0xd4,0xd4,0xce,0xd1,0xda,0xdc,0xfe,0x67,0x01,0xae,0xdb,0xef,0xa6,
-0xfe,0xdb,0x01,0xb7,0xfe,0x6e,0xdc,0x06,0xa7,0xfd,0xd8,0x90,0x84,0x84,0x90,0xfc,
-0x04,0x04,0x9f,0xdf,0xd8,0xd9,0xde,0xfe,0xcd,0xed,0xfe,0x42,0xfe,0x28,0x01,0x06,
-0xfe,0xfa,0x01,0x17,0xfe,0xe9,0x01,0xe1,0x01,0xb5,0x00,0x01,0x00,0xaa,0x00,0x00,
-0x03,0xb2,0x05,0xd7,0x00,0x1f,0x00,0x73,0xba,0x00,0x0f,0x00,0x12,0x00,0x03,0x2b,
-0xb8,0x00,0x0f,0x10,0xb8,0x00,0x02,0xd0,0xb8,0x00,0x0f,0x10,0xb8,0x00,0x08,0xd0,
-0xb8,0x00,0x12,0x10,0xb8,0x00,0x18,0xd0,0xb8,0x00,0x12,0x10,0xb8,0x00,0x1e,0xd0,
-0x00,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x02,0x2f,0xb8,0x00,0x10,0x2f,0xb8,0x00,0x12,
-0x2f,0xba,0x00,0x04,0x00,0x07,0x00,0x03,0x2b,0xb8,0x00,0x04,0x10,0xba,0x00,0x0a,
-0x00,0x0d,0x00,0x03,0x2b,0xb8,0x00,0x0a,0x10,0xb8,0x00,0x0d,0x10,0xb8,0x00,0x13,
-0xd0,0xb8,0x00,0x0a,0x10,0xb8,0x00,0x17,0xd0,0xb8,0x00,0x07,0x10,0xb8,0x00,0x19,
-0xd0,0xb8,0x00,0x04,0x10,0xb8,0x00,0x1d,0xd0,0x30,0x31,0x01,0x33,0x17,0x15,0x33,
-0x17,0x15,0x07,0x23,0x15,0x21,0x17,0x15,0x07,0x21,0x11,0x07,0x23,0x27,0x11,0x21,
-0x27,0x35,0x37,0x21,0x35,0x23,0x27,0x35,0x37,0x33,0x35,0x01,0xd7,0xab,0x06,0xa5,
-0x05,0x05,0xa5,0x01,0x24,0x06,0x06,0xfe,0xdc,0x06,0xab,0x06,0xfe,0xde,0x05,0x05,
-0x01,0x22,0xa3,0x05,0x05,0xa3,0x05,0xd7,0x05,0x9b,0x06,0x94,0x06,0x71,0x06,0x98,
-0x05,0xfc,0x82,0x05,0x05,0x03,0x7e,0x05,0x98,0x06,0x71,0x06,0x94,0x06,0x9b,0x00,
-0x00,0x01,0x00,0xaa,0xff,0xfd,0x06,0x82,0x05,0xd5,0x00,0x2b,0x00,0x93,0xba,0x00,
-0x1e,0x00,0x21,0x00,0x03,0x2b,0xb8,0x00,0x1e,0x10,0xba,0x00,0x12,0x00,0x1b,0x00,
-0x03,0x2b,0xb8,0x00,0x12,0x10,0xba,0x00,0x0b,0x00,0x08,0x00,0x03,0x2b,0xb8,0x00,
-0x0b,0x10,0xb8,0x00,0x12,0x10,0xb8,0x00,0x05,0xd0,0xb8,0x00,0x08,0x10,0xb8,0x00,
-0x0f,0xd0,0xb8,0x00,0x1e,0x10,0xb8,0x00,0x25,0xd0,0xb8,0x00,0x1b,0x10,0xb8,0x00,
-0x27,0xd0,0xb8,0x00,0x0b,0x10,0xb8,0x00,0x2d,0xdc,0x00,0xba,0x00,0x13,0x00,0x16,
-0x00,0x03,0x2b,0xb8,0x00,0x13,0x10,0xba,0x00,0x01,0x00,0x04,0x00,0x03,0x2b,0xb8,
-0x00,0x01,0x10,0xba,0x00,0x07,0x00,0x10,0x00,0x03,0x2b,0xb8,0x00,0x07,0x10,0xb8,
-0x00,0x13,0x10,0xb8,0x00,0x1a,0xd0,0xb8,0x00,0x10,0x10,0xb8,0x00,0x1c,0xd0,0xb8,
-0x00,0x07,0x10,0xb8,0x00,0x26,0xd0,0xb8,0x00,0x04,0x10,0xb8,0x00,0x28,0xd0,0x30,
-0x31,0x01,0x21,0x17,0x15,0x07,0x23,0x11,0x21,0x35,0x37,0x33,0x17,0x11,0x07,0x23,
-0x27,0x35,0x21,0x11,0x33,0x17,0x15,0x07,0x21,0x27,0x35,0x37,0x33,0x11,0x21,0x15,
-0x07,0x23,0x27,0x11,0x37,0x33,0x17,0x15,0x21,0x11,0x23,0x27,0x35,0x02,0xbb,0x01,
-0xb6,0x06,0x06,0xa0,0x02,0x3b,0x06,0x6a,0x06,0x06,0x6a,0x06,0xfd,0xc5,0xa0,0x06,
-0x06,0xfe,0x4a,0x06,0x06,0xaa,0xfd,0xc4,0x06,0x73,0x06,0x06,0x73,0x06,0x02,0x3c,
-0xaa,0x06,0x05,0xd5,0x06,0x77,0x06,0xfd,0xd1,0xa1,0x06,0x06,0xfe,0x49,0x06,0x06,
-0x9e,0xfd,0xc8,0x06,0x6a,0x06,0x06,0x6a,0x06,0x02,0x38,0x9e,0x06,0x06,0x01,0xb7,
-0x06,0x06,0xa1,0x02,0x2f,0x06,0x77,0x00,0x00,0x02,0x00,0xb2,0x00,0x00,0x06,0x7b,
-0x05,0xd8,0x00,0x1b,0x00,0x2c,0x00,0x69,0xba,0x00,0x09,0x00,0x18,0x00,0x03,0x2b,
-0xb8,0x00,0x09,0x10,0x41,0x1b,0x00,0x16,0x00,0x09,0x00,0x26,0x00,0x09,0x00,0x36,
-0x00,0x09,0x00,0x46,0x00,0x09,0x00,0x56,0x00,0x09,0x00,0x66,0x00,0x09,0x00,0x76,
-0x00,0x09,0x00,0x86,0x00,0x09,0x00,0x96,0x00,0x09,0x00,0xa6,0x00,0x09,0x00,0xb6,
-0x00,0x09,0x00,0xc6,0x00,0x09,0x00,0xd6,0x00,0x09,0x00,0x0d,0x5d,0x41,0x05,0x00,
-0xe5,0x00,0x09,0x00,0xf5,0x00,0x09,0x00,0x02,0x5d,0x00,0xb8,0x00,0x11,0x2f,0xb8,
-0x00,0x13,0x2f,0xba,0x00,0x01,0x00,0x05,0x00,0x03,0x2b,0xb8,0x00,0x01,0x10,0x30,
-0x31,0x01,0x33,0x32,0x17,0x23,0x27,0x20,0x03,0x06,0x15,0x10,0x05,0x16,0x33,0x25,
-0x15,0x06,0x07,0x06,0x2b,0x01,0x20,0x03,0x26,0x35,0x10,0x25,0x36,0x01,0x33,0x32,
-0x17,0x33,0x15,0x07,0x16,0x15,0x27,0x07,0x23,0x35,0x37,0x27,0x35,0x33,0x03,0x9c,
-0x15,0xdd,0xd2,0x06,0xef,0xfe,0xa9,0xd1,0x5e,0x01,0x56,0x88,0x9c,0x01,0x01,0xa0,
-0x8a,0x51,0x36,0x1c,0xfe,0x91,0xee,0x84,0x01,0x86,0xac,0x02,0x7f,0x03,0x06,0x3e,
-0xd1,0xa8,0x41,0xb1,0xa9,0x03,0x42,0xac,0xd5,0x05,0xd8,0x92,0x36,0xfe,0xca,0x9e,
-0xb9,0xfe,0x92,0xd6,0x47,0x32,0x06,0x6b,0x1a,0x0b,0x01,0x3e,0xc0,0xe9,0x01,0xaa,
-0xee,0x59,0xfe,0x33,0xc9,0x03,0x7e,0xbb,0x11,0x7c,0x7c,0x03,0xc9,0x7e,0x03,0x00,
-0x00,0x04,0x00,0xaa,0x00,0x00,0x06,0x83,0x05,0xd9,0x00,0x16,0x00,0x4f,0x00,0x62,
-0x00,0x73,0x02,0x7f,0xba,0x00,0x55,0x00,0x5d,0x00,0x03,0x2b,0xb8,0x00,0x55,0x10,
-0xba,0x00,0x48,0x00,0x42,0x00,0x03,0x2b,0xb8,0x00,0x48,0x10,0xba,0x00,0x1a,0x00,
-0x13,0x00,0x03,0x2b,0xb8,0x00,0x1a,0x10,0xba,0x00,0x25,0x00,0x20,0x00,0x03,0x2b,
-0xb8,0x00,0x25,0x10,0xba,0x00,0x68,0x00,0x71,0x00,0x03,0x2b,0xb8,0x00,0x68,0x10,
-0x41,0x05,0x00,0xea,0x00,0x13,0x00,0xfa,0x00,0x13,0x00,0x02,0x5d,0x41,0x1b,0x00,
-0x19,0x00,0x13,0x00,0x29,0x00,0x13,0x00,0x39,0x00,0x13,0x00,0x49,0x00,0x13,0x00,
-0x59,0x00,0x13,0x00,0x69,0x00,0x13,0x00,0x79,0x00,0x13,0x00,0x89,0x00,0x13,0x00,
-0x99,0x00,0x13,0x00,0xa9,0x00,0x13,0x00,0xb9,0x00,0x13,0x00,0xc9,0x00,0x13,0x00,
-0xd9,0x00,0x13,0x00,0x0d,0x5d,0xba,0x00,0x04,0x00,0x13,0x00,0x1a,0x11,0x12,0x39,
-0xba,0x00,0x0a,0x00,0x5d,0x00,0x68,0x11,0x12,0x39,0xba,0x00,0x11,0x00,0x13,0x00,
-0x1a,0x11,0x12,0x39,0xba,0x00,0x18,0x00,0x13,0x00,0x1a,0x11,0x12,0x39,0xb8,0x00,
-0x1a,0x10,0xb8,0x00,0x1c,0xd0,0xb8,0x00,0x1c,0x2f,0xba,0x00,0x1e,0x00,0x5d,0x00,
-0x68,0x11,0x12,0x39,0xba,0x00,0x23,0x00,0x5d,0x00,0x68,0x11,0x12,0x39,0xba,0x00,
-0x2b,0x00,0x5d,0x00,0x68,0x11,0x12,0x39,0xba,0x00,0x2f,0x00,0x20,0x00,0x25,0x11,
-0x12,0x39,0xba,0x00,0x34,0x00,0x13,0x00,0x1a,0x11,0x12,0x39,0x41,0x1b,0x00,0x16,
-0x00,0x48,0x00,0x26,0x00,0x48,0x00,0x36,0x00,0x48,0x00,0x46,0x00,0x48,0x00,0x56,
-0x00,0x48,0x00,0x66,0x00,0x48,0x00,0x76,0x00,0x48,0x00,0x86,0x00,0x48,0x00,0x96,
-0x00,0x48,0x00,0xa6,0x00,0x48,0x00,0xb6,0x00,0x48,0x00,0xc6,0x00,0x48,0x00,0xd6,
-0x00,0x48,0x00,0x0d,0x5d,0x41,0x05,0x00,0xe5,0x00,0x48,0x00,0xf5,0x00,0x48,0x00,
-0x02,0x5d,0xba,0x00,0x39,0x00,0x42,0x00,0x48,0x11,0x12,0x39,0xba,0x00,0x3d,0x00,
-0x5d,0x00,0x68,0x11,0x12,0x39,0xba,0x00,0x46,0x00,0x5d,0x00,0x68,0x11,0x12,0x39,
-0xb8,0x00,0x13,0x10,0xb8,0x00,0x4b,0xd0,0xb8,0x00,0x4b,0x2f,0xb8,0x00,0x13,0x10,
-0xb8,0x00,0x4c,0xd0,0xb8,0x00,0x4c,0x2f,0xb8,0x00,0x13,0x10,0xb8,0x00,0x4e,0xd0,
-0xb8,0x00,0x4e,0x2f,0xba,0x00,0x51,0x00,0x5d,0x00,0x68,0x11,0x12,0x39,0x41,0x1b,
-0x00,0x16,0x00,0x55,0x00,0x26,0x00,0x55,0x00,0x36,0x00,0x55,0x00,0x46,0x00,0x55,
-0x00,0x56,0x00,0x55,0x00,0x66,0x00,0x55,0x00,0x76,0x00,0x55,0x00,0x86,0x00,0x55,
-0x00,0x96,0x00,0x55,0x00,0xa6,0x00,0x55,0x00,0xb6,0x00,0x55,0x00,0xc6,0x00,0x55,
-0x00,0xd6,0x00,0x55,0x00,0x0d,0x5d,0x41,0x05,0x00,0xe5,0x00,0x55,0x00,0xf5,0x00,
-0x55,0x00,0x02,0x5d,0xba,0x00,0x59,0x00,0x42,0x00,0x48,0x11,0x12,0x39,0xb8,0x00,
-0x68,0x10,0xb8,0x00,0x75,0xdc,0x00,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x08,0x2f,0xb8,
-0x00,0x0a,0x2f,0xb8,0x00,0x34,0x2f,0xba,0x00,0x06,0x00,0x0f,0x00,0x03,0x2b,0xb8,
-0x00,0x06,0x10,0xb8,0x00,0x02,0xd0,0xba,0x00,0x04,0x00,0x34,0x00,0x00,0x11,0x12,
-0x39,0xba,0x00,0x11,0x00,0x0f,0x00,0x06,0x11,0x12,0x39,0xb8,0x00,0x0f,0x10,0xb8,
-0x00,0x13,0xd0,0xba,0x00,0x18,0x00,0x34,0x00,0x00,0x11,0x12,0x39,0xba,0x00,0x1e,
-0x00,0x34,0x00,0x00,0x11,0x12,0x39,0xba,0x00,0x23,0x00,0x34,0x00,0x00,0x11,0x12,
-0x39,0xba,0x00,0x2b,0x00,0x34,0x00,0x00,0x11,0x12,0x39,0xba,0x00,0x2f,0x00,0x34,
-0x00,0x00,0x11,0x12,0x39,0xba,0x00,0x39,0x00,0x34,0x00,0x00,0x11,0x12,0x39,0xba,
-0x00,0x3d,0x00,0x34,0x00,0x00,0x11,0x12,0x39,0xba,0x00,0x46,0x00,0x34,0x00,0x00,
-0x11,0x12,0x39,0xba,0x00,0x4b,0x00,0x34,0x00,0x00,0x11,0x12,0x39,0xba,0x00,0x51,
-0x00,0x34,0x00,0x00,0x11,0x12,0x39,0xba,0x00,0x59,0x00,0x34,0x00,0x00,0x11,0x12,
-0x39,0x30,0x31,0x01,0x16,0x33,0x32,0x37,0x16,0x33,0x32,0x37,0x35,0x33,0x17,0x15,
-0x14,0x0f,0x01,0x22,0x27,0x06,0x23,0x22,0x27,0x34,0x17,0x33,0x16,0x17,0x32,0x15,
-0x03,0x33,0x24,0x11,0x34,0x27,0x35,0x16,0x11,0x15,0x10,0x07,0x06,0x07,0x15,0x16,
-0x3b,0x01,0x15,0x06,0x2b,0x01,0x22,0x07,0x27,0x23,0x22,0x27,0x35,0x33,0x32,0x37,
-0x35,0x27,0x26,0x27,0x26,0x35,0x10,0x3f,0x01,0x15,0x06,0x15,0x10,0x05,0x35,0x03,
-0x35,0x37,0x32,0x25,0x15,0x06,0x07,0x06,0x15,0x14,0x17,0x15,0x23,0x26,0x27,0x26,
-0x35,0x10,0x25,0x36,0x33,0x34,0x25,0x16,0x17,0x16,0x1d,0x01,0x14,0x07,0x06,0x07,
-0x34,0x37,0x36,0x3d,0x01,0x10,0x25,0x02,0xea,0x1b,0x40,0x2e,0x21,0x25,0x2c,0x42,
-0x15,0x05,0x02,0x45,0x1e,0x2c,0x23,0x21,0x2d,0x51,0x10,0xb2,0x02,0x32,0x22,0x08,
-0x0a,0x02,0x01,0x24,0x6e,0xde,0xe0,0x4c,0x2f,0x50,0xa5,0x1a,0x75,0x48,0x81,0x16,
-0x45,0x44,0x90,0x38,0x88,0x3c,0x79,0x56,0x58,0x7d,0x24,0x63,0xc7,0x21,0x75,0x01,
-0x26,0x12,0x03,0x23,0xff,0x00,0x5f,0x41,0x86,0x92,0x02,0x9e,0x5d,0x26,0x01,0x0c,
-0x79,0x23,0x02,0x7b,0x84,0x82,0xb0,0xa6,0x59,0x1f,0x36,0x5c,0xfe,0xd6,0x05,0xd9,
-0x4b,0x30,0x30,0x44,0x07,0x28,0x05,0x3b,0x1b,0x04,0x2c,0x2c,0x65,0x22,0x87,0x40,
-0x0b,0x05,0xfc,0x20,0xe4,0x01,0x70,0xc2,0xcf,0x03,0xd7,0xfe,0xeb,0x24,0xfe,0xf1,
-0xdd,0x42,0x16,0x05,0x28,0x05,0x21,0x63,0x63,0x1c,0x05,0x2a,0x03,0x40,0x72,0x4a,
-0xb1,0xb1,0x01,0x01,0xe6,0x1f,0x05,0xc0,0xe2,0xfe,0xa7,0xf5,0x02,0x03,0x26,0x16,
-0xa9,0x2a,0x06,0x45,0x63,0xcc,0xef,0xe9,0xd6,0x02,0x4a,0xe9,0x6b,0x67,0x01,0x0c,
-0xcd,0x46,0x04,0x02,0x1e,0x70,0xb7,0xd8,0x2f,0xd4,0xb6,0x51,0x06,0x07,0x52,0xaf,
-0xbf,0x02,0x01,0x6d,0xf4,0x00,0x00,0x03,0x00,0xaa,0x00,0x00,0x05,0x05,0x05,0xd9,
-0x00,0x54,0x00,0x5f,0x00,0x67,0x02,0x1b,0xba,0x00,0x46,0x00,0x40,0x00,0x03,0x2b,
-0xb8,0x00,0x46,0x10,0xba,0x00,0x55,0x00,0x4f,0x00,0x03,0x2b,0xb8,0x00,0x55,0x10,
-0xba,0x00,0x62,0x00,0x5a,0x00,0x03,0x2b,0xb8,0x00,0x62,0x10,0xba,0x00,0x08,0x00,
-0x66,0x00,0x03,0x2b,0xb8,0x00,0x08,0x10,0xba,0x00,0x17,0x00,0x11,0x00,0x03,0x2b,
-0xb8,0x00,0x17,0x10,0x41,0x1b,0x00,0x16,0x00,0x62,0x00,0x26,0x00,0x62,0x00,0x36,
-0x00,0x62,0x00,0x46,0x00,0x62,0x00,0x56,0x00,0x62,0x00,0x66,0x00,0x62,0x00,0x76,
-0x00,0x62,0x00,0x86,0x00,0x62,0x00,0x96,0x00,0x62,0x00,0xa6,0x00,0x62,0x00,0xb6,
-0x00,0x62,0x00,0xc6,0x00,0x62,0x00,0xd6,0x00,0x62,0x00,0x0d,0x5d,0x41,0x05,0x00,
-0xe5,0x00,0x62,0x00,0xf5,0x00,0x62,0x00,0x02,0x5d,0xba,0x00,0x30,0x00,0x5a,0x00,
-0x62,0x11,0x12,0x39,0xb8,0x00,0x30,0x2f,0xb8,0x00,0x28,0xdc,0xb8,0x00,0x0c,0xd0,
-0x41,0x05,0x00,0xea,0x00,0x11,0x00,0xfa,0x00,0x11,0x00,0x02,0x5d,0x41,0x1b,0x00,
-0x19,0x00,0x11,0x00,0x29,0x00,0x11,0x00,0x39,0x00,0x11,0x00,0x49,0x00,0x11,0x00,
-0x59,0x00,0x11,0x00,0x69,0x00,0x11,0x00,0x79,0x00,0x11,0x00,0x89,0x00,0x11,0x00,
-0x99,0x00,0x11,0x00,0xa9,0x00,0x11,0x00,0xb9,0x00,0x11,0x00,0xc9,0x00,0x11,0x00,
-0xd9,0x00,0x11,0x00,0x0d,0x5d,0xba,0x00,0x19,0x00,0x40,0x00,0x17,0x11,0x12,0x39,
-0xba,0x00,0x27,0x00,0x5a,0x00,0x62,0x11,0x12,0x39,0xba,0x00,0x31,0x00,0x5a,0x00,
-0x62,0x11,0x12,0x39,0xba,0x00,0x3e,0x00,0x40,0x00,0x17,0x11,0x12,0x39,0x41,0x1b,
-0x00,0x16,0x00,0x46,0x00,0x26,0x00,0x46,0x00,0x36,0x00,0x46,0x00,0x46,0x00,0x46,
-0x00,0x56,0x00,0x46,0x00,0x66,0x00,0x46,0x00,0x76,0x00,0x46,0x00,0x86,0x00,0x46,
-0x00,0x96,0x00,0x46,0x00,0xa6,0x00,0x46,0x00,0xb6,0x00,0x46,0x00,0xc6,0x00,0x46,
-0x00,0xd6,0x00,0x46,0x00,0x0d,0x5d,0x41,0x05,0x00,0xe5,0x00,0x46,0x00,0xf5,0x00,
-0x46,0x00,0x02,0x5d,0xb8,0x00,0x30,0x10,0xb8,0x00,0x4a,0xd0,0x41,0x1b,0x00,0x16,
-0x00,0x55,0x00,0x26,0x00,0x55,0x00,0x36,0x00,0x55,0x00,0x46,0x00,0x55,0x00,0x56,
-0x00,0x55,0x00,0x66,0x00,0x55,0x00,0x76,0x00,0x55,0x00,0x86,0x00,0x55,0x00,0x96,
-0x00,0x55,0x00,0xa6,0x00,0x55,0x00,0xb6,0x00,0x55,0x00,0xc6,0x00,0x55,0x00,0xd6,
-0x00,0x55,0x00,0x0d,0x5d,0x41,0x05,0x00,0xe5,0x00,0x55,0x00,0xf5,0x00,0x55,0x00,
-0x02,0x5d,0x41,0x05,0x00,0xea,0x00,0x66,0x00,0xfa,0x00,0x66,0x00,0x02,0x5d,0x41,
-0x1b,0x00,0x19,0x00,0x66,0x00,0x29,0x00,0x66,0x00,0x39,0x00,0x66,0x00,0x49,0x00,
-0x66,0x00,0x59,0x00,0x66,0x00,0x69,0x00,0x66,0x00,0x79,0x00,0x66,0x00,0x89,0x00,
-0x66,0x00,0x99,0x00,0x66,0x00,0xa9,0x00,0x66,0x00,0xb9,0x00,0x66,0x00,0xc9,0x00,
-0x66,0x00,0xd9,0x00,0x66,0x00,0x0d,0x5d,0xb8,0x00,0x17,0x10,0xb8,0x00,0x69,0xdc,
-0x00,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x2c,0x2f,0xba,0x00,0x19,0x00,0x2c,0x00,0x00,
-0x11,0x12,0x39,0xba,0x00,0x27,0x00,0x2c,0x00,0x00,0x11,0x12,0x39,0xba,0x00,0x31,
-0x00,0x2c,0x00,0x00,0x11,0x12,0x39,0xba,0x00,0x3e,0x00,0x2c,0x00,0x00,0x11,0x12,
-0x39,0x30,0x31,0x01,0x32,0x17,0x0f,0x01,0x16,0x17,0x16,0x15,0x14,0x07,0x17,0x23,
-0x15,0x32,0x37,0x36,0x35,0x34,0x27,0x37,0x33,0x16,0x11,0x10,0x03,0x26,0x23,0x22,
-0x15,0x14,0x17,0x16,0x07,0x06,0x23,0x06,0x27,0x26,0x27,0x15,0x06,0x17,0x14,0x23,
-0x22,0x35,0x36,0x3d,0x01,0x06,0x15,0x06,0x27,0x22,0x27,0x34,0x36,0x27,0x34,0x23,
-0x22,0x07,0x02,0x11,0x34,0x37,0x33,0x17,0x06,0x15,0x14,0x17,0x16,0x17,0x35,0x23,
-0x35,0x26,0x35,0x34,0x37,0x2f,0x01,0x36,0x03,0x14,0x17,0x33,0x36,0x35,0x34,0x27,
-0x06,0x07,0x06,0x25,0x06,0x15,0x14,0x17,0x36,0x35,0x34,0x02,0xd8,0x42,0x52,0x13,
-0x0f,0x7f,0x33,0x38,0xcd,0x01,0x78,0x79,0x8e,0x87,0x7d,0x15,0x05,0xea,0x95,0x78,
-0x4f,0x38,0x78,0x20,0x02,0x0d,0x2a,0x40,0x07,0x3b,0x5e,0x04,0x54,0x68,0x6f,0x50,
-0x9a,0x07,0x3f,0x29,0x0e,0x9a,0x04,0x2e,0x52,0x74,0x9a,0xe4,0x05,0x15,0x7d,0xd6,
-0x3f,0x79,0x77,0xcc,0xee,0x18,0x10,0x57,0xce,0x87,0x04,0x46,0x1d,0x59,0x33,0x28,
-0x01,0x70,0x22,0x41,0x90,0x05,0xd9,0x4b,0x0f,0x7c,0x2e,0x50,0x51,0x55,0xc7,0x62,
-0x4b,0x78,0x81,0x9d,0xc6,0xb0,0x72,0x13,0xa5,0xfe,0xfe,0xfe,0xe0,0xfe,0xc9,0xae,
-0x2d,0x1c,0x93,0x28,0x2d,0x3b,0x09,0x29,0xee,0x31,0x96,0x48,0x76,0x3b,0x3c,0x74,
-0x4d,0x92,0x5d,0xbf,0x25,0x02,0x3b,0x40,0xa8,0x21,0x28,0xad,0x01,0x21,0x01,0x4d,
-0xe9,0xa6,0x13,0x79,0xae,0xfb,0xa3,0x2f,0x12,0x78,0x4b,0x5c,0xcc,0xbe,0x67,0x7c,
-0x12,0x48,0xfd,0xff,0x92,0x4a,0x69,0x8b,0x53,0x7e,0x19,0x4a,0x3f,0xa2,0x73,0x63,
-0x89,0x66,0x3d,0xa8,0x98,0x00,0x00,0x01,0x00,0xab,0x00,0x00,0x06,0x81,0x05,0xd7,
-0x00,0x32,0x00,0x2f,0xba,0x00,0x04,0x00,0x29,0x00,0x03,0x2b,0xb8,0x00,0x04,0x10,
-0xb8,0x00,0x34,0xdc,0x00,0xb8,0x00,0x10,0x2f,0xba,0x00,0x00,0x00,0x2e,0x00,0x03,
-0x2b,0xb8,0x00,0x00,0x10,0xba,0x00,0x19,0x00,0x0c,0x00,0x03,0x2b,0xb8,0x00,0x19,
-0x10,0x30,0x31,0x01,0x32,0x17,0x16,0x15,0x14,0x07,0x17,0x07,0x23,0x27,0x06,0x23,
-0x22,0x27,0x15,0x01,0x23,0x26,0x27,0x36,0x01,0x36,0x33,0x16,0x33,0x32,0x37,0x27,
-0x07,0x23,0x26,0x27,0x13,0x04,0x15,0x07,0x16,0x17,0x35,0x36,0x3d,0x01,0x34,0x27,
-0x26,0x2b,0x01,0x22,0x07,0x36,0x03,0xe8,0xed,0xd1,0x96,0x7d,0xc2,0x8c,0x03,0xb9,
-0xa5,0xd9,0xaa,0x8f,0xfe,0xfc,0x03,0xcc,0x04,0x1a,0x01,0x59,0x18,0x07,0x71,0x9e,
-0xbf,0x97,0xd9,0x6c,0x06,0xbb,0x09,0xe9,0x01,0x1b,0x7e,0xe6,0x1d,0x42,0xfb,0x89,
-0x77,0x25,0x62,0x78,0xaa,0x05,0xd7,0xbd,0x9b,0xd7,0xc9,0x8a,0x94,0x83,0xaa,0x6e,
-0x58,0x03,0xfe,0x31,0x8d,0x07,0x19,0x01,0x98,0x1d,0x55,0x68,0xc6,0x73,0x74,0x0c,
-0x01,0x02,0x0e,0x05,0x9f,0xaf,0x0e,0x02,0x5a,0x7c,0x24,0xfe,0x65,0x45,0x37,0x8f,
-0x00,0x05,0x00,0xaa,0x00,0x00,0x06,0x82,0x05,0xd8,0x00,0x0b,0x00,0x12,0x00,0x16,
-0x00,0x1a,0x00,0x21,0x00,0xff,0xba,0x00,0x0c,0x00,0x00,0x00,0x03,0x2b,0xb8,0x00,
-0x0c,0x10,0xba,0x00,0x17,0x00,0x15,0x00,0x03,0x2b,0xb8,0x00,0x17,0x10,0xba,0x00,
-0x06,0x00,0x1d,0x00,0x03,0x2b,0xb8,0x00,0x06,0x10,0x41,0x1b,0x00,0x16,0x00,0x0c,
-0x00,0x26,0x00,0x0c,0x00,0x36,0x00,0x0c,0x00,0x46,0x00,0x0c,0x00,0x56,0x00,0x0c,
-0x00,0x66,0x00,0x0c,0x00,0x76,0x00,0x0c,0x00,0x86,0x00,0x0c,0x00,0x96,0x00,0x0c,
-0x00,0xa6,0x00,0x0c,0x00,0xb6,0x00,0x0c,0x00,0xc6,0x00,0x0c,0x00,0xd6,0x00,0x0c,
-0x00,0x0d,0x5d,0x41,0x05,0x00,0xe5,0x00,0x0c,0x00,0xf5,0x00,0x0c,0x00,0x02,0x5d,
-0xb8,0x00,0x15,0x10,0xb8,0x00,0x0f,0xd0,0xb8,0x00,0x0f,0x2f,0x41,0x05,0x00,0xea,
-0x00,0x1d,0x00,0xfa,0x00,0x1d,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,0x1d,0x00,
-0x29,0x00,0x1d,0x00,0x39,0x00,0x1d,0x00,0x49,0x00,0x1d,0x00,0x59,0x00,0x1d,0x00,
-0x69,0x00,0x1d,0x00,0x79,0x00,0x1d,0x00,0x89,0x00,0x1d,0x00,0x99,0x00,0x1d,0x00,
-0xa9,0x00,0x1d,0x00,0xb9,0x00,0x1d,0x00,0xc9,0x00,0x1d,0x00,0xd9,0x00,0x1d,0x00,
-0x0d,0x5d,0xb8,0x00,0x17,0x10,0xb8,0x00,0x20,0xd0,0xb8,0x00,0x20,0x2f,0xb8,0x00,
-0x06,0x10,0xb8,0x00,0x23,0xdc,0x00,0xba,0x00,0x17,0x00,0x09,0x00,0x03,0x2b,0xb8,
-0x00,0x17,0x10,0xba,0x00,0x03,0x00,0x20,0x00,0x03,0x2b,0xb8,0x00,0x03,0x10,0xb8,
-0x00,0x20,0x10,0xb8,0x00,0x10,0xd0,0xb8,0x00,0x17,0x10,0xb8,0x00,0x15,0xd0,0xb8,
-0x00,0x15,0x2f,0x30,0x31,0x13,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,
-0x00,0x13,0x14,0x17,0x01,0x03,0x06,0x00,0x13,0x16,0x17,0x1b,0x01,0x36,0x37,0x09,
-0x01,0x36,0x35,0x34,0x00,0x27,0x11,0xaa,0x01,0xb6,0x01,0x36,0x01,0x37,0x01,0xb5,
-0xfe,0x4b,0xfe,0xc9,0xfe,0xca,0xfe,0x4a,0x98,0x79,0x01,0xaa,0x02,0xc4,0xfe,0xa3,
-0xad,0xb0,0xc0,0x02,0x5f,0xcd,0xaa,0xfe,0x89,0x01,0xbb,0x71,0xfe,0xa1,0xd3,0x02,
-0xea,0x01,0x37,0x01,0xb7,0xfe,0x49,0xfe,0xc9,0xfe,0xca,0xfe,0x4c,0x01,0xb4,0x01,
-0x36,0xe5,0x78,0x01,0xf5,0x01,0xc2,0x04,0xfe,0xa3,0xfd,0x62,0xb1,0x06,0x02,0x68,
-0xfd,0x96,0x08,0xa4,0x01,0xb6,0xfe,0x97,0x70,0xf5,0xf9,0x01,0x5d,0x04,0xfe,0x42,
-0x00,0x04,0x00,0xaa,0x00,0x00,0x06,0x82,0x05,0xd8,0x00,0x12,0x00,0x1e,0x00,0x2a,
-0x00,0x36,0x00,0xcf,0xba,0x00,0x0d,0x00,0x31,0x00,0x03,0x2b,0xb8,0x00,0x0d,0x10,
-0xba,0x00,0x2b,0x00,0x07,0x00,0x03,0x2b,0xb8,0x00,0x2b,0x10,0x41,0x05,0x00,0xea,
-0x00,0x07,0x00,0xfa,0x00,0x07,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,0x07,0x00,
-0x29,0x00,0x07,0x00,0x39,0x00,0x07,0x00,0x49,0x00,0x07,0x00,0x59,0x00,0x07,0x00,
-0x69,0x00,0x07,0x00,0x79,0x00,0x07,0x00,0x89,0x00,0x07,0x00,0x99,0x00,0x07,0x00,
-0xa9,0x00,0x07,0x00,0xb9,0x00,0x07,0x00,0xc9,0x00,0x07,0x00,0xd9,0x00,0x07,0x00,
-0x0d,0x5d,0x41,0x1b,0x00,0x16,0x00,0x0d,0x00,0x26,0x00,0x0d,0x00,0x36,0x00,0x0d,
-0x00,0x46,0x00,0x0d,0x00,0x56,0x00,0x0d,0x00,0x66,0x00,0x0d,0x00,0x76,0x00,0x0d,
-0x00,0x86,0x00,0x0d,0x00,0x96,0x00,0x0d,0x00,0xa6,0x00,0x0d,0x00,0xb6,0x00,0x0d,
-0x00,0xc6,0x00,0x0d,0x00,0xd6,0x00,0x0d,0x00,0x0d,0x5d,0x41,0x05,0x00,0xe5,0x00,
-0x0d,0x00,0xf5,0x00,0x0d,0x00,0x02,0x5d,0xb8,0x00,0x31,0x10,0xb8,0x00,0x25,0xdc,
-0xb8,0x00,0x2b,0x10,0xb8,0x00,0x38,0xdc,0x00,0xba,0x00,0x04,0x00,0x2e,0x00,0x03,
-0x2b,0xb8,0x00,0x04,0x10,0xba,0x00,0x34,0x00,0x0a,0x00,0x03,0x2b,0xb8,0x00,0x34,
-0x10,0x30,0x31,0x01,0x15,0x1e,0x01,0x33,0x32,0x36,0x35,0x10,0x00,0x21,0x20,0x00,
-0x03,0x3e,0x01,0x33,0x32,0x16,0x05,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,
-0x32,0x16,0x05,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x25,0x10,
-0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x03,0x96,0x0a,0xc5,0x90,0x92,
-0xc9,0xfe,0x62,0xfe,0xe4,0xfe,0xde,0xfe,0x7b,0x14,0x18,0xb1,0x95,0x8f,0xc6,0x01,
-0xca,0x3d,0x26,0x2a,0x3c,0x3c,0x2a,0x28,0x3b,0xfd,0x45,0x3b,0x29,0x29,0x3a,0x3a,
-0x29,0x29,0x3b,0x03,0xe5,0xfe,0x4b,0xfe,0xc9,0xfe,0xca,0xfe,0x4a,0x01,0xb6,0x01,
-0x36,0x01,0x37,0x01,0xb5,0x02,0xf8,0x1a,0x8e,0xc1,0xcf,0x9a,0x01,0x16,0x01,0x98,
-0xfe,0x7b,0xfe,0xc9,0xac,0xb2,0xc0,0x9e,0x29,0x3a,0x3a,0x29,0x2a,0x3c,0x3c,0x2a,
-0x2a,0x3c,0x3c,0x2a,0x29,0x3a,0x3c,0x27,0xfe,0xca,0xfe,0x4c,0x01,0xb4,0x01,0x36,
-0x01,0x37,0x01,0xb7,0xfe,0x49,0xff,0xff,0x00,0xaa,0x00,0x00,0x06,0x82,0x05,0xd5,
-0x12,0x22,0x0a,0x25,0x00,0x00,0x10,0x23,0x0a,0x25,0x00,0x00,0x02,0x86,0x10,0x03,
-0x0a,0x25,0x00,0x00,0x05,0x0d,0xff,0xff,0x00,0xaa,0x00,0x00,0x06,0x83,0x05,0xd4,
-0x12,0x22,0x0a,0x25,0x00,0x00,0x10,0x23,0x0a,0x25,0x00,0x01,0x02,0x85,0x10,0x03,
-0x0a,0x26,0x00,0x00,0x05,0x0c,0xff,0xff,0x00,0xaa,0x00,0x00,0x06,0x82,0x05,0xd5,
-0x12,0x22,0x0a,0x25,0x00,0x00,0x10,0x23,0x0a,0x26,0x00,0x00,0x02,0x85,0x10,0x03,
-0x0a,0x25,0x00,0x00,0x05,0x0d,0xff,0xff,0x00,0xaa,0x00,0x00,0x06,0x82,0x05,0xd5,
-0x12,0x22,0x0a,0x25,0x00,0x00,0x10,0x23,0x0a,0x26,0x00,0x00,0x02,0x85,0x10,0x03,
-0x0a,0x26,0x00,0x00,0x05,0x0d,0xff,0xff,0x00,0xaa,0x00,0x00,0x06,0x82,0x05,0xd5,
-0x12,0x22,0x0a,0x26,0x00,0x00,0x10,0x23,0x0a,0x25,0x00,0x00,0x02,0x85,0x10,0x03,
-0x0a,0x25,0x00,0x00,0x05,0x0d,0xff,0xff,0x00,0xaa,0x00,0x00,0x06,0x82,0x05,0xd5,
-0x12,0x22,0x0a,0x26,0x00,0x00,0x10,0x23,0x0a,0x25,0x00,0x00,0x02,0x85,0x10,0x03,
-0x0a,0x26,0x00,0x00,0x05,0x0d,0xff,0xff,0x00,0xaa,0x00,0x00,0x06,0x82,0x05,0xd5,
-0x12,0x22,0x0a,0x26,0x00,0x00,0x10,0x23,0x0a,0x26,0x00,0x00,0x02,0x85,0x10,0x03,
-0x0a,0x25,0x00,0x00,0x05,0x0d,0xff,0xff,0x00,0xaa,0x00,0x00,0x06,0x82,0x05,0xd5,
-0x12,0x22,0x0a,0x26,0x00,0x00,0x10,0x23,0x0a,0x26,0x00,0x00,0x02,0x85,0x10,0x03,
-0x0a,0x26,0x00,0x00,0x05,0x0d,0x00,0x0a,0x00,0x87,0xff,0xea,0x06,0xa5,0x05,0xe1,
-0x00,0x0c,0x00,0x3c,0x00,0x42,0x00,0x48,0x00,0x4e,0x00,0x54,0x00,0x5a,0x00,0x60,
-0x00,0x66,0x00,0x6c,0x00,0x00,0x00,0x14,0x17,0x16,0x33,0x32,0x36,0x34,0x27,0x26,
-0x23,0x22,0x07,0x05,0x26,0x37,0x33,0x36,0x37,0x27,0x36,0x37,0x17,0x36,0x37,0x35,
-0x36,0x17,0x15,0x16,0x17,0x37,0x16,0x17,0x07,0x16,0x17,0x33,0x16,0x07,0x23,0x06,
-0x07,0x17,0x06,0x07,0x27,0x06,0x07,0x15,0x06,0x27,0x35,0x26,0x27,0x07,0x26,0x27,
-0x37,0x26,0x27,0x01,0x36,0x37,0x03,0x06,0x07,0x05,0x16,0x17,0x37,0x26,0x27,0x01,
-0x36,0x37,0x27,0x06,0x07,0x25,0x16,0x17,0x25,0x26,0x27,0x01,0x26,0x27,0x05,0x16,
-0x17,0x25,0x06,0x07,0x17,0x36,0x37,0x05,0x06,0x07,0x13,0x36,0x37,0x25,0x26,0x27,
-0x07,0x16,0x17,0x02,0xf4,0x30,0x2f,0x43,0x42,0x5e,0x30,0x2f,0x41,0x43,0x2f,0xfd,
-0x7f,0x38,0x38,0x70,0x1b,0x6b,0x54,0x0f,0x63,0x52,0x7c,0xc2,0x4e,0x4f,0xb6,0x89,
-0x4f,0x66,0x11,0x55,0x69,0x1c,0x70,0x38,0x38,0x70,0x14,0x71,0x55,0x11,0x66,0x4f,
-0x8a,0xb6,0x4e,0x4e,0xb5,0x8a,0x51,0x61,0x11,0x51,0x68,0x1b,0x01,0xfb,0x21,0x24,
-0x0c,0x8e,0x62,0x01,0x80,0x29,0x1d,0xb7,0x64,0x8c,0xfe,0xaf,0x08,0x16,0xcb,0x4c,
-0x17,0x02,0xf7,0x18,0x06,0x01,0x12,0x13,0x51,0xfd,0x6b,0x14,0x0a,0xfe,0xf0,0x16,
-0x4b,0x02,0xb4,0x08,0x16,0xcc,0x52,0x11,0xfe,0x74,0x21,0x25,0x0c,0x8d,0x63,0xfe,
-0x7f,0x1d,0x27,0xb8,0x64,0x8d,0x03,0x26,0x84,0x2f,0x2f,0x5e,0x84,0x30,0x30,0x30,
-0xc3,0x4e,0x4e,0xb7,0x7c,0x50,0x5f,0x10,0x50,0x66,0x1e,0x70,0x38,0x38,0x70,0x16,
-0x6f,0x51,0x0f,0x60,0x51,0x79,0xb9,0x4e,0x4e,0xb0,0x83,0x50,0x5c,0x0b,0x51,0x67,
-0x1d,0x70,0x38,0x38,0x70,0x17,0x6d,0x51,0x0b,0x5c,0x50,0x79,0xba,0x01,0x2c,0x13,
-0x0a,0x01,0x0d,0x16,0x4d,0xaa,0x0a,0x13,0xc6,0x4e,0x15,0xfe,0x3e,0x26,0x1a,0xab,
-0x60,0x82,0x37,0x1e,0x22,0x0a,0x7f,0x62,0xfe,0x4b,0x1e,0x2a,0x11,0x8c,0x56,0xf4,
-0x26,0x22,0xac,0x67,0x7b,0x89,0x12,0x0b,0xfe,0xf0,0x1e,0x4d,0xa5,0x09,0x14,0xc2,
-0x4d,0x1e,0x00,0x05,0x00,0xaa,0x00,0x00,0x06,0x82,0x05,0xd8,0x00,0x0b,0x00,0x17,
-0x00,0x21,0x00,0x29,0x00,0x31,0x01,0x61,0xba,0x00,0x0c,0x00,0x00,0x00,0x03,0x2b,
-0xb8,0x00,0x0c,0x10,0xba,0x00,0x30,0x00,0x2c,0x00,0x03,0x2b,0xb8,0x00,0x30,0x10,
-0xba,0x00,0x1f,0x00,0x24,0x00,0x03,0x2b,0xb8,0x00,0x1f,0x10,0xba,0x00,0x06,0x00,
-0x12,0x00,0x03,0x2b,0xb8,0x00,0x06,0x10,0x41,0x1b,0x00,0x16,0x00,0x0c,0x00,0x26,
-0x00,0x0c,0x00,0x36,0x00,0x0c,0x00,0x46,0x00,0x0c,0x00,0x56,0x00,0x0c,0x00,0x66,
-0x00,0x0c,0x00,0x76,0x00,0x0c,0x00,0x86,0x00,0x0c,0x00,0x96,0x00,0x0c,0x00,0xa6,
-0x00,0x0c,0x00,0xb6,0x00,0x0c,0x00,0xc6,0x00,0x0c,0x00,0xd6,0x00,0x0c,0x00,0x0d,
-0x5d,0x41,0x05,0x00,0xe5,0x00,0x0c,0x00,0xf5,0x00,0x0c,0x00,0x02,0x5d,0x41,0x05,
-0x00,0xea,0x00,0x12,0x00,0xfa,0x00,0x12,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,
-0x12,0x00,0x29,0x00,0x12,0x00,0x39,0x00,0x12,0x00,0x49,0x00,0x12,0x00,0x59,0x00,
-0x12,0x00,0x69,0x00,0x12,0x00,0x79,0x00,0x12,0x00,0x89,0x00,0x12,0x00,0x99,0x00,
-0x12,0x00,0xa9,0x00,0x12,0x00,0xb9,0x00,0x12,0x00,0xc9,0x00,0x12,0x00,0xd9,0x00,
-0x12,0x00,0x0d,0x5d,0xb8,0x00,0x2c,0x10,0xb8,0x00,0x1b,0xd0,0xb8,0x00,0x1f,0x10,
-0xb8,0x00,0x28,0xd0,0xb8,0x00,0x28,0x2f,0x41,0x1b,0x00,0x16,0x00,0x30,0x00,0x26,
-0x00,0x30,0x00,0x36,0x00,0x30,0x00,0x46,0x00,0x30,0x00,0x56,0x00,0x30,0x00,0x66,
-0x00,0x30,0x00,0x76,0x00,0x30,0x00,0x86,0x00,0x30,0x00,0x96,0x00,0x30,0x00,0xa6,
-0x00,0x30,0x00,0xb6,0x00,0x30,0x00,0xc6,0x00,0x30,0x00,0xd6,0x00,0x30,0x00,0x0d,
-0x5d,0x41,0x05,0x00,0xe5,0x00,0x30,0x00,0xf5,0x00,0x30,0x00,0x02,0x5d,0xb8,0x00,
-0x06,0x10,0xb8,0x00,0x33,0xdc,0x00,0xba,0x00,0x0f,0x00,0x09,0x00,0x03,0x2b,0xb8,
-0x00,0x0f,0x10,0xba,0x00,0x03,0x00,0x15,0x00,0x03,0x2b,0xb8,0x00,0x03,0x10,0xba,
-0x00,0x1d,0x00,0x18,0x00,0x03,0x2b,0xb8,0x00,0x1d,0x10,0xba,0x00,0x26,0x00,0x22,
-0x00,0x03,0x2b,0xb8,0x00,0x26,0x10,0xb8,0x00,0x22,0x10,0xb8,0x00,0x2a,0xd0,0xb8,
-0x00,0x26,0x10,0xb8,0x00,0x2e,0xd0,0x30,0x31,0x13,0x10,0x00,0x21,0x20,0x00,0x11,
-0x10,0x00,0x21,0x20,0x00,0x13,0x14,0x00,0x33,0x32,0x00,0x35,0x34,0x00,0x23,0x22,
-0x00,0x01,0x26,0x03,0x23,0x12,0x25,0x04,0x13,0x23,0x02,0x37,0x26,0x27,0x36,0x37,
-0x16,0x17,0x06,0x05,0x26,0x27,0x36,0x37,0x16,0x17,0x06,0xaa,0x01,0xb6,0x01,0x36,
-0x01,0x37,0x01,0xb5,0xfe,0x4b,0xfe,0xc9,0xfe,0xca,0xfe,0x4a,0x98,0x01,0x5d,0xf7,
-0xf7,0x01,0x5f,0xfe,0xa1,0xf7,0xf7,0xfe,0xa3,0x02,0x56,0xd2,0x4e,0x45,0x13,0x01,
-0x57,0x01,0x4d,0x13,0x43,0x65,0x32,0x6e,0x04,0x06,0x74,0x6a,0x06,0x06,0xfd,0xac,
-0x6e,0x04,0x06,0x74,0x69,0x07,0x07,0x02,0xea,0x01,0x37,0x01,0xb7,0xfe,0x49,0xfe,
-0xc9,0xfe,0xca,0xfe,0x4c,0x01,0xb4,0x01,0x36,0xf5,0xfe,0x9f,0x01,0x61,0xf5,0xf9,
-0x01,0x5d,0xfe,0xa3,0xfe,0x8d,0x0d,0xfe,0xfa,0x01,0x5d,0x12,0x18,0xfe,0xab,0x01,
-0x02,0xe0,0x06,0x70,0x75,0x07,0x09,0x6f,0x74,0x06,0x06,0x70,0x75,0x07,0x09,0x6f,
-0x74,0x00,0x00,0x05,0x00,0xaa,0x00,0x00,0x06,0x82,0x05,0xd8,0x00,0x0b,0x00,0x17,
-0x00,0x21,0x00,0x29,0x00,0x31,0x01,0x61,0xba,0x00,0x0c,0x00,0x00,0x00,0x03,0x2b,
-0xb8,0x00,0x0c,0x10,0xba,0x00,0x30,0x00,0x2c,0x00,0x03,0x2b,0xb8,0x00,0x30,0x10,
-0xba,0x00,0x1b,0x00,0x24,0x00,0x03,0x2b,0xb8,0x00,0x1b,0x10,0xba,0x00,0x06,0x00,
-0x12,0x00,0x03,0x2b,0xb8,0x00,0x06,0x10,0x41,0x1b,0x00,0x16,0x00,0x0c,0x00,0x26,
-0x00,0x0c,0x00,0x36,0x00,0x0c,0x00,0x46,0x00,0x0c,0x00,0x56,0x00,0x0c,0x00,0x66,
-0x00,0x0c,0x00,0x76,0x00,0x0c,0x00,0x86,0x00,0x0c,0x00,0x96,0x00,0x0c,0x00,0xa6,
-0x00,0x0c,0x00,0xb6,0x00,0x0c,0x00,0xc6,0x00,0x0c,0x00,0xd6,0x00,0x0c,0x00,0x0d,
-0x5d,0x41,0x05,0x00,0xe5,0x00,0x0c,0x00,0xf5,0x00,0x0c,0x00,0x02,0x5d,0x41,0x05,
-0x00,0xea,0x00,0x12,0x00,0xfa,0x00,0x12,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,
-0x12,0x00,0x29,0x00,0x12,0x00,0x39,0x00,0x12,0x00,0x49,0x00,0x12,0x00,0x59,0x00,
-0x12,0x00,0x69,0x00,0x12,0x00,0x79,0x00,0x12,0x00,0x89,0x00,0x12,0x00,0x99,0x00,
-0x12,0x00,0xa9,0x00,0x12,0x00,0xb9,0x00,0x12,0x00,0xc9,0x00,0x12,0x00,0xd9,0x00,
-0x12,0x00,0x0d,0x5d,0xb8,0x00,0x2c,0x10,0xb8,0x00,0x1f,0xd0,0xb8,0x00,0x1b,0x10,
-0xb8,0x00,0x28,0xd0,0xb8,0x00,0x28,0x2f,0x41,0x1b,0x00,0x16,0x00,0x30,0x00,0x26,
-0x00,0x30,0x00,0x36,0x00,0x30,0x00,0x46,0x00,0x30,0x00,0x56,0x00,0x30,0x00,0x66,
-0x00,0x30,0x00,0x76,0x00,0x30,0x00,0x86,0x00,0x30,0x00,0x96,0x00,0x30,0x00,0xa6,
-0x00,0x30,0x00,0xb6,0x00,0x30,0x00,0xc6,0x00,0x30,0x00,0xd6,0x00,0x30,0x00,0x0d,
-0x5d,0x41,0x05,0x00,0xe5,0x00,0x30,0x00,0xf5,0x00,0x30,0x00,0x02,0x5d,0xb8,0x00,
-0x06,0x10,0xb8,0x00,0x33,0xdc,0x00,0xba,0x00,0x0f,0x00,0x09,0x00,0x03,0x2b,0xb8,
-0x00,0x0f,0x10,0xba,0x00,0x03,0x00,0x15,0x00,0x03,0x2b,0xb8,0x00,0x03,0x10,0xba,
-0x00,0x18,0x00,0x1d,0x00,0x03,0x2b,0xb8,0x00,0x18,0x10,0xba,0x00,0x26,0x00,0x22,
-0x00,0x03,0x2b,0xb8,0x00,0x26,0x10,0xb8,0x00,0x22,0x10,0xb8,0x00,0x2a,0xd0,0xb8,
-0x00,0x26,0x10,0xb8,0x00,0x2e,0xd0,0x30,0x31,0x13,0x10,0x00,0x21,0x20,0x00,0x11,
-0x10,0x00,0x21,0x20,0x00,0x13,0x14,0x00,0x33,0x32,0x00,0x35,0x34,0x00,0x23,0x22,
-0x00,0x01,0x16,0x13,0x33,0x02,0x05,0x24,0x03,0x33,0x12,0x01,0x26,0x27,0x36,0x37,
-0x16,0x17,0x06,0x05,0x26,0x27,0x36,0x37,0x16,0x17,0x06,0xaa,0x01,0xb6,0x01,0x36,
-0x01,0x37,0x01,0xb5,0xfe,0x4b,0xfe,0xc9,0xfe,0xca,0xfe,0x4a,0x98,0x01,0x5d,0xf7,
-0xf7,0x01,0x5f,0xfe,0xa1,0xf7,0xf7,0xfe,0xa3,0x02,0x54,0xd4,0x4e,0x45,0x13,0xfe,
-0xa8,0xfe,0xb4,0x13,0x41,0x67,0x01,0xac,0x6e,0x04,0x06,0x74,0x6a,0x06,0x06,0xfd,
-0xac,0x6e,0x04,0x06,0x74,0x69,0x07,0x07,0x02,0xea,0x01,0x37,0x01,0xb7,0xfe,0x49,
-0xfe,0xc9,0xfe,0xca,0xfe,0x4c,0x01,0xb4,0x01,0x36,0xf5,0xfe,0x9f,0x01,0x61,0xf5,
-0xf9,0x01,0x5d,0xfe,0xa3,0xfe,0x09,0x0c,0x01,0x06,0xfe,0xa3,0x12,0x18,0x01,0x55,
-0xfe,0xfe,0x01,0x79,0x06,0x70,0x75,0x07,0x09,0x6f,0x74,0x06,0x06,0x70,0x75,0x07,
-0x09,0x6f,0x74,0x00,0x00,0x04,0x00,0xaa,0x00,0x00,0x06,0x82,0x05,0xd8,0x00,0x0b,
-0x00,0x15,0x00,0x1d,0x00,0x25,0x00,0xcd,0xba,0x00,0x0d,0x00,0x00,0x00,0x03,0x2b,
-0xb8,0x00,0x0d,0x10,0xba,0x00,0x1a,0x00,0x1e,0x00,0x03,0x2b,0xb8,0x00,0x1a,0x10,
-0xba,0x00,0x06,0x00,0x11,0x00,0x03,0x2b,0xb8,0x00,0x06,0x10,0xb8,0x00,0x11,0x10,
-0xb8,0x00,0x16,0xd0,0xb8,0x00,0x16,0x2f,0x41,0x05,0x00,0xea,0x00,0x1e,0x00,0xfa,
-0x00,0x1e,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,0x1e,0x00,0x29,0x00,0x1e,0x00,
-0x39,0x00,0x1e,0x00,0x49,0x00,0x1e,0x00,0x59,0x00,0x1e,0x00,0x69,0x00,0x1e,0x00,
-0x79,0x00,0x1e,0x00,0x89,0x00,0x1e,0x00,0x99,0x00,0x1e,0x00,0xa9,0x00,0x1e,0x00,
-0xb9,0x00,0x1e,0x00,0xc9,0x00,0x1e,0x00,0xd9,0x00,0x1e,0x00,0x0d,0x5d,0xb8,0x00,
-0x0d,0x10,0xb8,0x00,0x22,0xd0,0xb8,0x00,0x22,0x2f,0xb8,0x00,0x06,0x10,0xb8,0x00,
-0x27,0xdc,0x00,0xba,0x00,0x0f,0x00,0x09,0x00,0x03,0x2b,0xb8,0x00,0x0f,0x10,0xba,
-0x00,0x03,0x00,0x20,0x00,0x03,0x2b,0xb8,0x00,0x03,0x10,0xba,0x00,0x1c,0x00,0x11,
-0x00,0x03,0x2b,0xb8,0x00,0x1c,0x10,0xb8,0x00,0x11,0x10,0xb8,0x00,0x0c,0xd0,0xb8,
-0x00,0x0c,0x2f,0xb8,0x00,0x20,0x10,0xb8,0x00,0x18,0xd0,0xb8,0x00,0x1c,0x10,0xb8,
-0x00,0x24,0xd0,0x30,0x31,0x13,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,
-0x00,0x01,0x23,0x12,0x05,0x24,0x13,0x27,0x02,0x27,0x06,0x01,0x26,0x27,0x06,0x07,
-0x16,0x17,0x36,0x25,0x26,0x27,0x06,0x07,0x16,0x17,0x36,0xaa,0x01,0xb6,0x01,0x36,
-0x01,0x37,0x01,0xb5,0xfe,0x4b,0xfe,0xc9,0xfe,0xca,0xfe,0x4a,0x01,0x8b,0x4f,0x17,
-0x01,0x93,0x01,0xa0,0x17,0x52,0x60,0xff,0xe5,0x02,0x98,0x08,0x7f,0x8c,0x08,0x06,
-0x84,0x89,0xfd,0xc1,0x06,0x80,0x8d,0x07,0x05,0x85,0x8a,0x02,0xea,0x01,0x37,0x01,
-0xb7,0xfe,0x49,0xfe,0xc9,0xfe,0xca,0xfe,0x4c,0x01,0xb4,0x01,0x30,0xfe,0x63,0x1d,
-0x16,0x01,0xa6,0x02,0xfe,0xc2,0x0e,0x0c,0x02,0x5a,0x89,0x0a,0x08,0x8f,0x86,0x09,
-0x09,0x8c,0x87,0x0a,0x08,0x8f,0x86,0x09,0x09,0x00,0x00,0x0a,0x00,0xaa,0x00,0x00,
-0x06,0x82,0x05,0xd8,0x00,0x07,0x00,0x0c,0x00,0x13,0x00,0x22,0x00,0x2a,0x00,0x32,
-0x00,0x3a,0x00,0x41,0x00,0x49,0x00,0x58,0x00,0xe9,0xb8,0x00,0x59,0x2f,0xb8,0x00,
-0x5a,0x2f,0xb8,0x00,0x03,0xdc,0xb8,0x00,0x06,0xdc,0xb8,0x00,0x00,0xd0,0xb8,0x00,
-0x00,0x2f,0xb8,0x00,0x03,0x10,0xb8,0x00,0x01,0xd0,0xb8,0x00,0x01,0x2f,0xb8,0x00,
-0x59,0x10,0xb8,0x00,0x1f,0xd0,0xb8,0x00,0x1f,0x2f,0xb8,0x00,0x0f,0xd0,0xb8,0x00,
-0x0f,0x2f,0xb8,0x00,0x06,0x10,0xb8,0x00,0x42,0xd0,0xb8,0x00,0x42,0x2f,0xb8,0x00,
-0x03,0x10,0xb8,0x00,0x43,0xd0,0xb8,0x00,0x43,0x2f,0xb8,0x00,0x03,0x10,0xb8,0x00,
-0x45,0xd0,0xb8,0x00,0x06,0x10,0xb8,0x00,0x47,0xd0,0xb8,0x00,0x47,0x2f,0xb8,0x00,
-0x1f,0x10,0xb8,0x00,0x4c,0xdc,0x41,0x1b,0x00,0x16,0x00,0x4c,0x00,0x26,0x00,0x4c,
-0x00,0x36,0x00,0x4c,0x00,0x46,0x00,0x4c,0x00,0x56,0x00,0x4c,0x00,0x66,0x00,0x4c,
-0x00,0x76,0x00,0x4c,0x00,0x86,0x00,0x4c,0x00,0x96,0x00,0x4c,0x00,0xa6,0x00,0x4c,
-0x00,0xb6,0x00,0x4c,0x00,0xc6,0x00,0x4c,0x00,0xd6,0x00,0x4c,0x00,0x0d,0x5d,0x41,
-0x05,0x00,0xe5,0x00,0x4c,0x00,0xf5,0x00,0x4c,0x00,0x02,0x5d,0x00,0xb8,0x00,0x46,
-0x2f,0xb8,0x00,0x48,0x2f,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x02,0x2f,0xba,0x00,0x14,
-0x00,0x57,0x00,0x03,0x2b,0xb8,0x00,0x14,0x10,0xba,0x00,0x24,0x00,0x27,0x00,0x03,
-0x2b,0xb8,0x00,0x24,0x10,0xb8,0x00,0x2b,0xd0,0xb8,0x00,0x27,0x10,0xb8,0x00,0x2f,
-0xd0,0x30,0x31,0x01,0x33,0x17,0x11,0x07,0x23,0x27,0x11,0x05,0x17,0x15,0x07,0x27,
-0x25,0x17,0x07,0x23,0x26,0x27,0x35,0x05,0x32,0x1f,0x01,0x14,0x07,0x06,0x23,0x22,
-0x27,0x26,0x35,0x34,0x37,0x36,0x01,0x21,0x17,0x15,0x07,0x21,0x27,0x35,0x25,0x21,
-0x17,0x15,0x07,0x21,0x27,0x35,0x03,0x33,0x16,0x17,0x15,0x07,0x27,0x35,0x25,0x33,
-0x17,0x15,0x07,0x27,0x35,0x25,0x33,0x17,0x11,0x07,0x23,0x27,0x11,0x03,0x06,0x15,
-0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x27,0x26,0x23,0x22,0x03,0x73,0x4e,0x06,
-0x06,0x4e,0x06,0x02,0x39,0x39,0xf8,0x3d,0xfc,0xfb,0xfd,0x3e,0x03,0xc8,0x2d,0x02,
-0x31,0xd7,0x5c,0x0d,0xc4,0x48,0x30,0xb5,0x65,0x25,0xbd,0x46,0xfd,0x4b,0x01,0x53,
-0x06,0x06,0xfe,0xad,0x06,0x04,0x77,0x01,0x5a,0x07,0x07,0xfe,0xa6,0x06,0x47,0x03,
-0x86,0x72,0x3d,0xf8,0xfd,0xb4,0x03,0x3b,0xf7,0x3d,0x02,0x1b,0x4e,0x06,0x06,0x4e,
-0x06,0x24,0x82,0x19,0x45,0x7c,0x20,0x31,0x86,0x09,0x3f,0x92,0x27,0x05,0xd8,0x06,
-0xfe,0xa1,0x06,0x06,0x01,0x5f,0x9c,0x3e,0x03,0xff,0x3f,0xee,0xfe,0x40,0xc7,0x37,
-0x04,0xb5,0xe2,0x60,0xbd,0x64,0x18,0xa8,0x40,0x5c,0xb4,0x68,0x1b,0xfe,0xed,0x06,
-0x50,0x06,0x06,0x50,0x06,0x06,0x50,0x06,0x06,0x50,0xfe,0xe7,0x82,0x79,0x03,0x3f,
-0xfd,0x04,0x2b,0x3c,0x03,0xfe,0x3e,0x04,0x77,0x06,0xfe,0xa1,0x06,0x06,0x01,0x5f,
-0x02,0x56,0x47,0x7b,0x3f,0x2c,0x72,0x11,0x43,0x82,0x41,0x9a,0x00,0x02,0x02,0xdd,
-0x00,0x00,0x06,0x83,0x05,0xd7,0x00,0x17,0x00,0x2b,0x00,0x93,0xb8,0x00,0x2c,0x2f,
-0xb8,0x00,0x2d,0x2f,0xb8,0x00,0x04,0xdc,0xb8,0x00,0x2c,0x10,0xb8,0x00,0x10,0xd0,
-0xb8,0x00,0x10,0x2f,0xb8,0x00,0x1b,0xdc,0x41,0x1b,0x00,0x16,0x00,0x1b,0x00,0x26,
-0x00,0x1b,0x00,0x36,0x00,0x1b,0x00,0x46,0x00,0x1b,0x00,0x56,0x00,0x1b,0x00,0x66,
-0x00,0x1b,0x00,0x76,0x00,0x1b,0x00,0x86,0x00,0x1b,0x00,0x96,0x00,0x1b,0x00,0xa6,
-0x00,0x1b,0x00,0xb6,0x00,0x1b,0x00,0xc6,0x00,0x1b,0x00,0xd6,0x00,0x1b,0x00,0x0d,
-0x5d,0x41,0x05,0x00,0xe5,0x00,0x1b,0x00,0xf5,0x00,0x1b,0x00,0x02,0x5d,0xb8,0x00,
-0x04,0x10,0xb8,0x00,0x26,0xdc,0x00,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x08,0x2f,0xba,
-0x00,0x0c,0x00,0x08,0x00,0x00,0x11,0x12,0x39,0xba,0x00,0x19,0x00,0x08,0x00,0x00,
-0x11,0x12,0x39,0xba,0x00,0x20,0x00,0x08,0x00,0x00,0x11,0x12,0x39,0x30,0x31,0x01,
-0x20,0x01,0x16,0x15,0x10,0x01,0x06,0x2b,0x01,0x22,0x27,0x35,0x24,0x37,0x36,0x11,
-0x10,0x25,0x26,0x27,0x35,0x34,0x37,0x17,0x15,0x04,0x11,0x10,0x05,0x07,0x15,0x33,
-0x32,0x37,0x36,0x37,0x36,0x3d,0x01,0x10,0x01,0x26,0x23,0x03,0x7e,0x01,0x8b,0x01,
-0x10,0x6a,0xfe,0x74,0xb3,0xb0,0x31,0x2f,0x51,0x01,0x15,0x7d,0x9b,0xfe,0xb2,0x88,
-0x5d,0x95,0x28,0x01,0xc9,0xfe,0xaf,0x2b,0x06,0x56,0x9e,0xe9,0x52,0x1d,0xfe,0xa5,
-0xa3,0x9e,0x05,0xd7,0xfe,0x87,0xad,0xc6,0xfe,0x78,0xfe,0xff,0x62,0x0f,0x06,0x4f,
-0xb1,0xca,0x01,0x0c,0x01,0x90,0xe0,0x50,0x10,0x03,0x0b,0x0e,0x3e,0x03,0xc5,0xfe,
-0x14,0xfe,0x6e,0xe8,0x18,0x04,0x53,0x98,0xf4,0x5d,0x5d,0x09,0x01,0x3d,0x01,0x05,
-0x66,0x00,0x00,0x02,0x00,0xaa,0x00,0x00,0x04,0x50,0x05,0xd8,0x00,0x17,0x00,0x2b,
-0x00,0x8d,0xb8,0x00,0x2c,0x2f,0xb8,0x00,0x2d,0x2f,0xb8,0x00,0x2c,0x10,0xb8,0x00,
-0x04,0xd0,0xb8,0x00,0x04,0x2f,0xb8,0x00,0x2d,0x10,0xb8,0x00,0x10,0xdc,0xb8,0x00,
-0x1b,0xdc,0x41,0x05,0x00,0xea,0x00,0x1b,0x00,0xfa,0x00,0x1b,0x00,0x02,0x5d,0x41,
-0x1b,0x00,0x19,0x00,0x1b,0x00,0x29,0x00,0x1b,0x00,0x39,0x00,0x1b,0x00,0x49,0x00,
-0x1b,0x00,0x59,0x00,0x1b,0x00,0x69,0x00,0x1b,0x00,0x79,0x00,0x1b,0x00,0x89,0x00,
-0x1b,0x00,0x99,0x00,0x1b,0x00,0xa9,0x00,0x1b,0x00,0xb9,0x00,0x1b,0x00,0xc9,0x00,
-0x1b,0x00,0xd9,0x00,0x1b,0x00,0x0d,0x5d,0xb8,0x00,0x04,0x10,0xb8,0x00,0x26,0xdc,
-0x00,0xb8,0x00,0x08,0x2f,0xb8,0x00,0x00,0x2f,0xba,0x00,0x19,0x00,0x00,0x00,0x08,
-0x11,0x12,0x39,0xba,0x00,0x20,0x00,0x00,0x00,0x08,0x11,0x12,0x39,0x30,0x31,0x21,
-0x20,0x01,0x26,0x35,0x10,0x01,0x36,0x3b,0x01,0x32,0x17,0x15,0x04,0x07,0x06,0x11,
-0x10,0x05,0x16,0x17,0x15,0x14,0x07,0x27,0x35,0x24,0x11,0x10,0x25,0x37,0x35,0x23,
-0x22,0x07,0x06,0x07,0x06,0x1d,0x01,0x10,0x01,0x16,0x33,0x03,0xaf,0xfe,0x75,0xfe,
-0xef,0x69,0x01,0x8c,0xb3,0xb1,0x31,0x2e,0x50,0xfe,0xec,0x7e,0x9a,0x01,0x4e,0x88,
-0x5d,0x95,0x28,0xfe,0x37,0x01,0x50,0x2c,0x06,0x56,0x9f,0xe8,0x53,0x1c,0x01,0x5a,
-0xa4,0x9e,0x01,0x79,0xad,0xc6,0x01,0x88,0x01,0x01,0x63,0x0f,0x07,0x4f,0xb1,0xcb,
-0xfe,0xf5,0xfe,0x70,0xe1,0x4f,0x10,0x04,0x0a,0x0e,0x3e,0x03,0xc5,0x01,0xed,0x01,
-0x91,0xe8,0x18,0x03,0x53,0x96,0xf5,0x5c,0x5e,0x09,0xfe,0xc2,0xfe,0xfc,0x66,0x00,
-0x00,0x02,0x00,0xaf,0xff,0x30,0x04,0x3a,0x05,0xdb,0x00,0x31,0x00,0x40,0x01,0x21,
-0xba,0x00,0x37,0x00,0x17,0x00,0x03,0x2b,0xb8,0x00,0x37,0x10,0xba,0x00,0x09,0x00,
-0x0f,0x00,0x03,0x2b,0xb8,0x00,0x09,0x10,0xba,0x00,0x2e,0x00,0x2b,0x00,0x03,0x2b,
-0xb8,0x00,0x2e,0x10,0xba,0x00,0x00,0x00,0x17,0x00,0x2e,0x11,0x12,0x39,0xb8,0x00,
-0x04,0xd0,0xb8,0x00,0x09,0x10,0xb8,0x00,0x0c,0xd0,0xb8,0x00,0x0c,0x2f,0xb8,0x00,
-0x0f,0x10,0xb8,0x00,0x12,0xd0,0xba,0x00,0x1b,0x00,0x17,0x00,0x2e,0x11,0x12,0x39,
-0xb8,0x00,0x17,0x10,0xb8,0x00,0x1f,0xd0,0x41,0x1b,0x00,0x16,0x00,0x37,0x00,0x26,
-0x00,0x37,0x00,0x36,0x00,0x37,0x00,0x46,0x00,0x37,0x00,0x56,0x00,0x37,0x00,0x66,
-0x00,0x37,0x00,0x76,0x00,0x37,0x00,0x86,0x00,0x37,0x00,0x96,0x00,0x37,0x00,0xa6,
-0x00,0x37,0x00,0xb6,0x00,0x37,0x00,0xc6,0x00,0x37,0x00,0xd6,0x00,0x37,0x00,0x0d,
-0x5d,0x41,0x05,0x00,0xe5,0x00,0x37,0x00,0xf5,0x00,0x37,0x00,0x02,0x5d,0xb8,0x00,
-0x37,0x10,0xb8,0x00,0x21,0xd0,0xb8,0x00,0x2b,0x10,0xb8,0x00,0x3d,0xd0,0xb8,0x00,
-0x2e,0x10,0xb8,0x00,0x42,0xdc,0x00,0xb8,0x00,0x20,0x2f,0xb8,0x00,0x22,0x2f,0xb8,
-0x00,0x2b,0x2f,0xb8,0x00,0x2d,0x2f,0xb8,0x00,0x0d,0x2f,0xba,0x00,0x0a,0x00,0x0b,
-0x00,0x03,0x2b,0xb8,0x00,0x0a,0x10,0xba,0x00,0x27,0x00,0x32,0x00,0x03,0x2b,0xb8,
-0x00,0x27,0x10,0xba,0x00,0x3a,0x00,0x13,0x00,0x03,0x2b,0xb8,0x00,0x3a,0x10,0xba,
-0x00,0x00,0x00,0x32,0x00,0x27,0x11,0x12,0x39,0xb8,0x00,0x13,0x10,0xb8,0x00,0x08,
-0xd0,0xb8,0x00,0x0b,0x10,0xb8,0x00,0x0f,0xd0,0xb8,0x00,0x0a,0x10,0xb8,0x00,0x11,
-0xd0,0xb8,0x00,0x11,0x2f,0xba,0x00,0x1b,0x00,0x32,0x00,0x27,0x11,0x12,0x39,0x30,
-0x31,0x01,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x15,0x37,0x15,0x07,0x17,0x23,
-0x27,0x23,0x35,0x33,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x26,0x27,0x26,
-0x3d,0x01,0x33,0x15,0x14,0x17,0x16,0x17,0x33,0x36,0x37,0x36,0x3d,0x01,0x33,0x15,
-0x14,0x07,0x06,0x05,0x23,0x06,0x07,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,
-0x27,0x26,0x03,0x69,0x28,0x24,0x85,0x84,0x6c,0x8f,0xd8,0xdc,0x01,0x81,0x01,0xca,
-0xca,0x02,0x93,0x6d,0x85,0x85,0x24,0x28,0x28,0x24,0x85,0x8e,0x5b,0x55,0x75,0x26,
-0x74,0x55,0x5b,0x8e,0x85,0x24,0xfe,0xf7,0x26,0x75,0x55,0x5b,0xb7,0x82,0x7f,0xb7,
-0x5b,0x55,0x04,0x56,0x1a,0x24,0x83,0xbd,0xbc,0x7c,0x64,0x0e,0xd1,0x02,0x64,0x01,
-0xca,0xcb,0x62,0xd1,0x0d,0x65,0x7c,0xbc,0xbd,0x83,0x24,0x1a,0x19,0x25,0x83,0xbc,
-0x08,0x0a,0x82,0x5a,0x53,0x07,0x07,0x53,0x5a,0x82,0x0a,0x08,0xbc,0x83,0x25,0x5f,
-0x06,0x54,0x59,0x82,0x82,0xaa,0xaa,0x82,0x82,0x59,0x54,0x00,0x00,0x02,0x00,0xaf,
-0xfe,0xff,0x05,0x2a,0x05,0xda,0x00,0x0b,0x00,0x24,0x01,0x13,0xba,0x00,0x06,0x00,
-0x0e,0x00,0x03,0x2b,0xb8,0x00,0x06,0x10,0xba,0x00,0x19,0x00,0x1f,0x00,0x03,0x2b,
-0xb8,0x00,0x19,0x10,0xba,0x00,0x14,0x00,0x00,0x00,0x03,0x2b,0xb8,0x00,0x14,0x10,
-0x41,0x05,0x00,0xea,0x00,0x00,0x00,0xfa,0x00,0x00,0x00,0x02,0x5d,0x41,0x1b,0x00,
-0x19,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x49,0x00,0x00,0x00,
-0x59,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x89,0x00,0x00,0x00,
-0x99,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0xb9,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,
-0xd9,0x00,0x00,0x00,0x0d,0x5d,0x41,0x1b,0x00,0x16,0x00,0x06,0x00,0x26,0x00,0x06,
-0x00,0x36,0x00,0x06,0x00,0x46,0x00,0x06,0x00,0x56,0x00,0x06,0x00,0x66,0x00,0x06,
-0x00,0x76,0x00,0x06,0x00,0x86,0x00,0x06,0x00,0x96,0x00,0x06,0x00,0xa6,0x00,0x06,
-0x00,0xb6,0x00,0x06,0x00,0xc6,0x00,0x06,0x00,0xd6,0x00,0x06,0x00,0x0d,0x5d,0x41,
-0x05,0x00,0xe5,0x00,0x06,0x00,0xf5,0x00,0x06,0x00,0x02,0x5d,0xb8,0x00,0x19,0x10,
-0xb8,0x00,0x1c,0xd0,0xb8,0x00,0x1c,0x2f,0xb8,0x00,0x1f,0x10,0xb8,0x00,0x22,0xd0,
-0xb8,0x00,0x14,0x10,0xb8,0x00,0x26,0xdc,0x00,0xb8,0x00,0x1d,0x2f,0xba,0x00,0x11,
-0x00,0x03,0x00,0x03,0x2b,0xb8,0x00,0x11,0x10,0xba,0x00,0x1a,0x00,0x1b,0x00,0x03,
-0x2b,0xb8,0x00,0x1a,0x10,0xba,0x00,0x09,0x00,0x23,0x00,0x03,0x2b,0xb8,0x00,0x09,
-0x10,0xb8,0x00,0x23,0x10,0xb8,0x00,0x18,0xd0,0xb8,0x00,0x1b,0x10,0xb8,0x00,0x1f,
-0xd0,0xb8,0x00,0x1a,0x10,0xb8,0x00,0x21,0xd0,0xb8,0x00,0x21,0x2f,0x30,0x31,0x01,
-0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x05,0x26,0x35,0x34,0x00,
-0x33,0x32,0x00,0x15,0x14,0x07,0x06,0x07,0x11,0x25,0x15,0x05,0x17,0x23,0x03,0x23,
-0x35,0x21,0x03,0x26,0x04,0x77,0xe8,0xa1,0xa4,0xe7,0xe7,0xa4,0xa1,0xe8,0xfc,0xe1,
-0xa9,0x01,0x50,0xef,0xec,0x01,0x50,0xa7,0x89,0xb3,0x01,0x10,0xfe,0xea,0x02,0xa4,
-0x02,0xff,0x00,0xff,0x02,0xba,0x03,0xa2,0xa4,0xe4,0xe4,0xa4,0xa3,0xd8,0xd8,0xeb,
-0x9d,0xee,0xef,0x01,0x4c,0xfe,0xb4,0xef,0xee,0x9d,0x7e,0x12,0xfe,0xf7,0x02,0x7e,
-0x02,0xfe,0x01,0x00,0x7c,0x01,0x09,0x10,0x00,0x02,0x00,0xaf,0xfe,0xff,0x05,0x2a,
-0x05,0xda,0x00,0x0b,0x00,0x24,0x01,0x1b,0xba,0x00,0x03,0x00,0x21,0x00,0x03,0x2b,
-0xb8,0x00,0x03,0x10,0xba,0x00,0x17,0x00,0x0c,0x00,0x03,0x2b,0xb8,0x00,0x17,0x10,
-0xba,0x00,0x1b,0x00,0x09,0x00,0x03,0x2b,0xb8,0x00,0x1b,0x10,0x41,0x1b,0x00,0x16,
-0x00,0x03,0x00,0x26,0x00,0x03,0x00,0x36,0x00,0x03,0x00,0x46,0x00,0x03,0x00,0x56,
-0x00,0x03,0x00,0x66,0x00,0x03,0x00,0x76,0x00,0x03,0x00,0x86,0x00,0x03,0x00,0x96,
-0x00,0x03,0x00,0xa6,0x00,0x03,0x00,0xb6,0x00,0x03,0x00,0xc6,0x00,0x03,0x00,0xd6,
-0x00,0x03,0x00,0x0d,0x5d,0x41,0x05,0x00,0xe5,0x00,0x03,0x00,0xf5,0x00,0x03,0x00,
-0x02,0x5d,0x41,0x05,0x00,0xea,0x00,0x09,0x00,0xfa,0x00,0x09,0x00,0x02,0x5d,0x41,
-0x1b,0x00,0x19,0x00,0x09,0x00,0x29,0x00,0x09,0x00,0x39,0x00,0x09,0x00,0x49,0x00,
-0x09,0x00,0x59,0x00,0x09,0x00,0x69,0x00,0x09,0x00,0x79,0x00,0x09,0x00,0x89,0x00,
-0x09,0x00,0x99,0x00,0x09,0x00,0xa9,0x00,0x09,0x00,0xb9,0x00,0x09,0x00,0xc9,0x00,
-0x09,0x00,0xd9,0x00,0x09,0x00,0x0d,0x5d,0xb8,0x00,0x0c,0x10,0xb8,0x00,0x10,0xd0,
-0xb8,0x00,0x10,0x2f,0xb8,0x00,0x17,0x10,0xb8,0x00,0x12,0xd0,0xb8,0x00,0x12,0x2f,
-0xb8,0x00,0x1b,0x10,0xb8,0x00,0x26,0xdc,0x00,0xb8,0x00,0x11,0x2f,0xba,0x00,0x06,
-0x00,0x1e,0x00,0x03,0x2b,0xb8,0x00,0x06,0x10,0xba,0x00,0x10,0x00,0x0d,0x00,0x03,
-0x2b,0xb8,0x00,0x10,0x10,0xba,0x00,0x0c,0x00,0x00,0x00,0x03,0x2b,0xb8,0x00,0x0c,
-0x10,0xb8,0x00,0x10,0x10,0xb8,0x00,0x13,0xd0,0xb8,0x00,0x13,0x2f,0xb8,0x00,0x0d,
-0x10,0xb8,0x00,0x15,0xd0,0xb8,0x00,0x15,0x2f,0xb8,0x00,0x0c,0x10,0xb8,0x00,0x17,
-0xd0,0x30,0x31,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,
-0x13,0x23,0x35,0x21,0x13,0x33,0x07,0x05,0x15,0x25,0x11,0x16,0x17,0x16,0x15,0x14,
-0x00,0x23,0x22,0x00,0x35,0x34,0x37,0x36,0x02,0xee,0xa4,0xe7,0xe7,0xa4,0xa1,0xe8,
-0xe8,0xf4,0x02,0xff,0x00,0xff,0x02,0xa4,0x02,0x01,0x16,0xfe,0xf0,0xb3,0x89,0xa7,
-0xfe,0xb0,0xec,0xef,0xfe,0xb0,0xa9,0x89,0x02,0xb1,0xd7,0xa4,0xa4,0xe3,0xe3,0xa4,
-0xa4,0xd7,0xa3,0x01,0x09,0x7c,0x01,0x01,0xff,0x02,0x7e,0x02,0xfe,0xf7,0x12,0x7e,
-0x9d,0xee,0xee,0xfe,0xb4,0x01,0x4c,0xee,0xee,0x9d,0x80,0x00,0x00,0x02,0x00,0xaf,
-0xff,0xf5,0x06,0xa5,0x05,0xd5,0x00,0x0b,0x00,0x23,0x00,0x1f,0xba,0x00,0x1e,0x00,
-0x1f,0x00,0x03,0x2b,0xb8,0x00,0x1e,0x10,0xb8,0x00,0x25,0xdc,0x00,0xba,0x00,0x1c,
-0x00,0x1a,0x00,0x03,0x2b,0xb8,0x00,0x1c,0x10,0x30,0x31,0x01,0x26,0x24,0x07,0x06,
-0x10,0x17,0x16,0x04,0x37,0x36,0x02,0x13,0x06,0x2b,0x01,0x22,0x27,0x26,0x35,0x27,
-0x34,0x37,0x36,0x04,0x17,0x01,0x25,0x37,0x21,0x11,0x07,0x11,0x01,0x16,0x12,0x03,
-0xf4,0x74,0xfe,0xc6,0x74,0x73,0x73,0x74,0x01,0x45,0x75,0x73,0x0b,0x15,0xa8,0xe9,
-0x02,0xed,0xa6,0xa6,0x02,0xa8,0xa6,0x01,0xc8,0x70,0x01,0x69,0xfe,0x8d,0x8c,0x01,
-0xee,0x8f,0xfe,0x98,0x64,0x10,0x03,0x35,0x73,0x0a,0x71,0x74,0xfe,0xba,0x74,0x72,
-0x02,0x74,0x74,0x01,0x3c,0xfd,0xd6,0xa4,0xa4,0xa5,0xeb,0x03,0xea,0xa7,0xa6,0x11,
-0x67,0x01,0x5c,0x02,0x8c,0xfe,0x14,0x8f,0x01,0x75,0xfe,0xa2,0x6c,0xfe,0x39,0x00,
-0x00,0x01,0x01,0x53,0x00,0x00,0x05,0xd7,0x05,0xd8,0x00,0x1c,0x00,0x9f,0xb8,0x00,
-0x1d,0x2f,0xb8,0x00,0x1e,0x2f,0xb8,0x00,0x1d,0x10,0xb8,0x00,0x04,0xd0,0xb8,0x00,
-0x04,0x2f,0xb8,0x00,0x12,0xdc,0x41,0x1b,0x00,0x16,0x00,0x12,0x00,0x26,0x00,0x12,
-0x00,0x36,0x00,0x12,0x00,0x46,0x00,0x12,0x00,0x56,0x00,0x12,0x00,0x66,0x00,0x12,
-0x00,0x76,0x00,0x12,0x00,0x86,0x00,0x12,0x00,0x96,0x00,0x12,0x00,0xa6,0x00,0x12,
-0x00,0xb6,0x00,0x12,0x00,0xc6,0x00,0x12,0x00,0xd6,0x00,0x12,0x00,0x0d,0x5d,0x41,
-0x05,0x00,0xe5,0x00,0x12,0x00,0xf5,0x00,0x12,0x00,0x02,0x5d,0xba,0x00,0x14,0x00,
-0x04,0x00,0x12,0x11,0x12,0x39,0xb8,0x00,0x1e,0x10,0xb8,0x00,0x18,0xdc,0xb8,0x00,
-0x19,0xdc,0xb8,0x00,0x15,0xd0,0x00,0xb8,0x00,0x18,0x2f,0xb8,0x00,0x16,0x2f,0xba,
-0x00,0x0f,0x00,0x07,0x00,0x03,0x2b,0xb8,0x00,0x0f,0x10,0xba,0x00,0x15,0x00,0x1a,
-0x00,0x03,0x2b,0xb8,0x00,0x15,0x10,0xb8,0x00,0x00,0xd0,0x30,0x31,0x01,0x35,0x32,
-0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x1d,0x01,0x23,0x34,0x00,0x33,0x32,0x00,0x15,
-0x14,0x07,0x33,0x11,0x33,0x11,0x23,0x11,0x21,0x35,0x03,0x0d,0x7a,0xaa,0xa9,0x7b,
-0x79,0xab,0x96,0x01,0x02,0xb8,0xbb,0x01,0x02,0x6d,0xe3,0x97,0x97,0xfc,0x13,0x02,
-0x13,0x01,0xab,0x79,0x79,0xab,0xab,0x79,0x02,0xb9,0x01,0x04,0xfe,0xfc,0xb9,0xa8,
-0x7b,0x03,0xc5,0xfa,0x28,0x01,0x7c,0x97,0x00,0x01,0x01,0xc0,0x00,0x00,0x05,0x6a,
-0x05,0xd8,0x00,0x1f,0x00,0xc7,0xb8,0x00,0x20,0x2f,0xb8,0x00,0x21,0x2f,0xb8,0x00,
-0x20,0x10,0xb8,0x00,0x00,0xd0,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x03,0xd0,0xb8,0x00,
-0x00,0x10,0xb8,0x00,0x09,0xdc,0xb8,0x00,0x05,0xd0,0xb8,0x00,0x21,0x10,0xb8,0x00,
-0x0f,0xdc,0xb8,0x00,0x17,0xdc,0x41,0x05,0x00,0xea,0x00,0x17,0x00,0xfa,0x00,0x17,
-0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,0x17,0x00,0x29,0x00,0x17,0x00,0x39,0x00,
-0x17,0x00,0x49,0x00,0x17,0x00,0x59,0x00,0x17,0x00,0x69,0x00,0x17,0x00,0x79,0x00,
-0x17,0x00,0x89,0x00,0x17,0x00,0x99,0x00,0x17,0x00,0xa9,0x00,0x17,0x00,0xb9,0x00,
-0x17,0x00,0xc9,0x00,0x17,0x00,0xd9,0x00,0x17,0x00,0x0d,0x5d,0xb8,0x00,0x12,0xd0,
-0xb8,0x00,0x12,0x2f,0xb8,0x00,0x09,0x10,0xb8,0x00,0x1d,0xd0,0x00,0xb8,0x00,0x13,
-0x2f,0xb8,0x00,0x1e,0x2f,0xb8,0x00,0x04,0x2f,0xba,0x00,0x03,0x00,0x00,0x00,0x03,
-0x2b,0xb8,0x00,0x03,0x10,0xba,0x00,0x0c,0x00,0x1a,0x00,0x03,0x2b,0xb8,0x00,0x0c,
-0x10,0xb8,0x00,0x03,0x10,0xb8,0x00,0x06,0xd0,0xb8,0x00,0x00,0x10,0xb8,0x00,0x08,
-0xd0,0xba,0x00,0x0a,0x00,0x1a,0x00,0x0c,0x11,0x12,0x39,0x30,0x31,0x01,0x23,0x35,
-0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x36,0x33,0x32,0x12,0x15,0x14,0x06,0x1d,
-0x01,0x23,0x34,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x02,0x2a,0x6a,
-0x6a,0x98,0xb2,0xb2,0x6f,0x98,0xb2,0xef,0x8c,0x97,0x8d,0x9b,0x6f,0x6e,0x9a,0x98,
-0x04,0x8d,0x97,0xb4,0xb4,0x97,0xfe,0x7d,0x6d,0xfe,0xfe,0xbb,0x5a,0xe5,0x79,0x02,
-0x84,0xee,0x48,0x7b,0xa9,0xaa,0x7a,0xfe,0x46,0x00,0x00,0x02,0x00,0xf8,0x00,0x00,
-0x06,0x32,0x05,0xd8,0x00,0x0b,0x00,0x34,0x00,0xcb,0xba,0x00,0x1d,0x00,0x1e,0x00,
-0x03,0x2b,0xb8,0x00,0x1d,0x10,0xba,0x00,0x0c,0x00,0x1a,0x00,0x03,0x2b,0xb8,0x00,
-0x0c,0x10,0xba,0x00,0x2e,0x00,0x2b,0x00,0x03,0x2b,0xb8,0x00,0x2e,0x10,0xb8,0x00,
-0x1d,0x10,0xb8,0x00,0x20,0xdc,0xb8,0x00,0x1e,0x10,0xb8,0x00,0x22,0xd0,0xb8,0x00,
-0x1d,0x10,0xb8,0x00,0x24,0xd0,0xb8,0x00,0x1a,0x10,0xb8,0x00,0x26,0xd0,0xb8,0x00,
-0x0c,0x10,0xb8,0x00,0x28,0xd0,0xb8,0x00,0x2b,0x10,0xb8,0x00,0x2d,0xdc,0xb8,0x00,
-0x30,0xd0,0xb8,0x00,0x2b,0x10,0xb8,0x00,0x32,0xd0,0xb8,0x00,0x2e,0x10,0xb8,0x00,
-0x36,0xdc,0x00,0xb8,0x00,0x13,0x2f,0xba,0x00,0x24,0x00,0x21,0x00,0x03,0x2b,0xb8,
-0x00,0x24,0x10,0xba,0x00,0x20,0x00,0x1d,0x00,0x03,0x2b,0xb8,0x00,0x20,0x10,0xba,
-0x00,0x26,0x00,0x1b,0x00,0x03,0x2b,0xb8,0x00,0x26,0x10,0xb8,0x00,0x24,0x10,0xb8,
-0x00,0x27,0xd0,0xb8,0x00,0x26,0x10,0xb8,0x00,0x29,0xd0,0xb8,0x00,0x24,0x10,0xb8,
-0x00,0x2b,0xd0,0xb8,0x00,0x21,0x10,0xb8,0x00,0x2d,0xd0,0xb8,0x00,0x20,0x10,0xb8,
-0x00,0x2f,0xd0,0xb8,0x00,0x1d,0x10,0xb8,0x00,0x31,0xd0,0xb8,0x00,0x1b,0x10,0xb8,
-0x00,0x33,0xd0,0x30,0x31,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,
-0x26,0x37,0x16,0x17,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x36,0x37,
-0x11,0x21,0x11,0x21,0x35,0x33,0x11,0x23,0x35,0x21,0x11,0x21,0x11,0x33,0x11,0x21,
-0x11,0x21,0x15,0x23,0x11,0x33,0x15,0x21,0x11,0x21,0x03,0x95,0x38,0x4f,0x4f,0x38,
-0x37,0x4f,0x4e,0x14,0x3d,0x30,0x4c,0x98,0x6d,0x6b,0x99,0x4c,0x2f,0x3e,0xfe,0xe0,
-0xfe,0xce,0x9b,0x9b,0x01,0x32,0x01,0x20,0x97,0x01,0x20,0x01,0x31,0x99,0x99,0xfe,
-0xcf,0xfe,0xe0,0x01,0x8c,0x4f,0x37,0x39,0x4e,0x4e,0x39,0x37,0x4f,0x73,0x12,0x30,
-0x4c,0x6c,0x6c,0x99,0x99,0x6c,0x6c,0x4c,0x31,0x11,0x01,0x8c,0xfe,0x4b,0x97,0x02,
-0xd3,0x98,0xfe,0x4a,0x01,0xb6,0xfe,0x4a,0x01,0xb6,0x98,0xfd,0x2d,0x97,0x01,0xb5,
-0x00,0x01,0x01,0x04,0x00,0x00,0x06,0x27,0x05,0xd8,0x00,0x3c,0x01,0x83,0xba,0x00,
-0x14,0x00,0x0b,0x00,0x03,0x2b,0xb8,0x00,0x14,0x10,0xba,0x00,0x01,0x00,0x02,0x00,
-0x03,0x2b,0xb8,0x00,0x01,0x10,0xba,0x00,0x34,0x00,0x29,0x00,0x03,0x2b,0xb8,0x00,
-0x34,0x10,0xb8,0x00,0x02,0x10,0xb8,0x00,0x06,0xd0,0xba,0x00,0x12,0x00,0x0b,0x00,
-0x34,0x11,0x12,0x39,0xb8,0x00,0x14,0x10,0xb8,0x00,0x17,0xd0,0xb8,0x00,0x02,0x10,
-0xb8,0x00,0x1b,0xd0,0xba,0x00,0x1c,0x00,0x0b,0x00,0x34,0x11,0x12,0x39,0xba,0x00,
-0x1d,0x00,0x0b,0x00,0x34,0x11,0x12,0x39,0xba,0x00,0x22,0x00,0x0b,0x00,0x34,0x11,
-0x12,0x39,0xb8,0x00,0x01,0x10,0xb8,0x00,0x23,0xd0,0x41,0x05,0x00,0xea,0x00,0x29,
-0x00,0xfa,0x00,0x29,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,0x29,0x00,0x29,0x00,
-0x29,0x00,0x39,0x00,0x29,0x00,0x49,0x00,0x29,0x00,0x59,0x00,0x29,0x00,0x69,0x00,
-0x29,0x00,0x79,0x00,0x29,0x00,0x89,0x00,0x29,0x00,0x99,0x00,0x29,0x00,0xa9,0x00,
-0x29,0x00,0xb9,0x00,0x29,0x00,0xc9,0x00,0x29,0x00,0xd9,0x00,0x29,0x00,0x0d,0x5d,
-0xb8,0x00,0x29,0x10,0xb8,0x00,0x2b,0xd0,0xb8,0x00,0x2b,0x2f,0xba,0x00,0x2c,0x00,
-0x0b,0x00,0x34,0x11,0x12,0x39,0xb8,0x00,0x34,0x10,0xb8,0x00,0x32,0xd0,0xb8,0x00,
-0x32,0x2f,0xb8,0x00,0x01,0x10,0xb8,0x00,0x39,0xd0,0xb8,0x00,0x34,0x10,0xb8,0x00,
-0x3e,0xdc,0x00,0xb8,0x00,0x1f,0x2f,0xb8,0x00,0x01,0x2f,0xba,0x00,0x3a,0x00,0x00,
-0x00,0x03,0x2b,0xb8,0x00,0x3a,0x10,0xb8,0x00,0x00,0x10,0xb8,0x00,0x03,0xd0,0xb8,
-0x00,0x3a,0x10,0xb8,0x00,0x05,0xd0,0xba,0x00,0x0c,0x00,0x01,0x00,0x1f,0x11,0x12,
-0x39,0xba,0x00,0x0d,0x00,0x01,0x00,0x1f,0x11,0x12,0x39,0xba,0x00,0x12,0x00,0x01,
-0x00,0x1f,0x11,0x12,0x39,0xba,0x00,0x13,0x00,0x01,0x00,0x1f,0x11,0x12,0x39,0xba,
-0x00,0x1c,0x00,0x01,0x00,0x1f,0x11,0x12,0x39,0xba,0x00,0x1d,0x00,0x01,0x00,0x1f,
-0x11,0x12,0x39,0xba,0x00,0x22,0x00,0x01,0x00,0x1f,0x11,0x12,0x39,0xba,0x00,0x23,
-0x00,0x01,0x00,0x1f,0x11,0x12,0x39,0xba,0x00,0x2b,0x00,0x01,0x00,0x1f,0x11,0x12,
-0x39,0xba,0x00,0x2c,0x00,0x01,0x00,0x1f,0x11,0x12,0x39,0xba,0x00,0x31,0x00,0x01,
-0x00,0x1f,0x11,0x12,0x39,0xba,0x00,0x32,0x00,0x01,0x00,0x1f,0x11,0x12,0x39,0x30,
-0x31,0x25,0x15,0x23,0x35,0x23,0x35,0x33,0x35,0x26,0x27,0x26,0x27,0x35,0x07,0x27,
-0x37,0x33,0x17,0x15,0x27,0x15,0x33,0x15,0x23,0x16,0x17,0x16,0x17,0x11,0x07,0x27,
-0x37,0x33,0x17,0x15,0x27,0x11,0x36,0x37,0x36,0x3d,0x01,0x33,0x35,0x07,0x27,0x37,
-0x33,0x17,0x15,0x27,0x15,0x33,0x15,0x06,0x07,0x06,0x07,0x15,0x33,0x15,0x03,0xe2,
-0x97,0xb0,0xb0,0xa5,0x7a,0x96,0x01,0x90,0x01,0x91,0x98,0x90,0x90,0x02,0x02,0x01,
-0x68,0x4e,0x67,0x91,0x01,0x92,0x97,0x91,0x91,0x65,0x4d,0x6a,0x01,0x90,0x01,0x91,
-0x98,0x90,0x90,0x01,0x01,0x96,0x7a,0xa5,0xaf,0xbb,0xbb,0xbb,0x97,0x8b,0x16,0x7a,
-0x96,0xd7,0x54,0x8e,0x8c,0x99,0x99,0x8c,0x8e,0x54,0x02,0x97,0x68,0x4f,0x14,0x02,
-0xca,0x8d,0x8b,0x9a,0x9a,0x8b,0x8d,0xfd,0x37,0x14,0x4e,0x6a,0x96,0x01,0x59,0x8e,
-0x8c,0x99,0x99,0x8c,0x8e,0x59,0x04,0xd3,0x96,0x79,0x17,0x8b,0x97,0x00,0x00,0x02,
-0x01,0xec,0x00,0x00,0x05,0x3f,0x05,0xd8,0x00,0x12,0x00,0x1d,0x00,0xa5,0xb8,0x00,
-0x1e,0x2f,0xb8,0x00,0x1f,0x2f,0xb8,0x00,0x1e,0x10,0xb8,0x00,0x11,0xd0,0xb8,0x00,
-0x11,0x2f,0xb8,0x00,0x00,0xd0,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x1f,0x10,0xb8,0x00,
-0x05,0xdc,0xb8,0x00,0x11,0x10,0xb8,0x00,0x0b,0xdc,0xb8,0x00,0x13,0xd0,0xb8,0x00,
-0x05,0x10,0xb8,0x00,0x19,0xdc,0x41,0x05,0x00,0xea,0x00,0x19,0x00,0xfa,0x00,0x19,
-0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,0x19,0x00,0x29,0x00,0x19,0x00,0x39,0x00,
-0x19,0x00,0x49,0x00,0x19,0x00,0x59,0x00,0x19,0x00,0x69,0x00,0x19,0x00,0x79,0x00,
-0x19,0x00,0x89,0x00,0x19,0x00,0x99,0x00,0x19,0x00,0xa9,0x00,0x19,0x00,0xb9,0x00,
-0x19,0x00,0xc9,0x00,0x19,0x00,0xd9,0x00,0x19,0x00,0x0d,0x5d,0x00,0xba,0x00,0x0c,
-0x00,0x0f,0x00,0x03,0x2b,0xb8,0x00,0x0c,0x10,0xba,0x00,0x00,0x00,0x13,0x00,0x03,
-0x2b,0xb8,0x00,0x00,0x10,0xba,0x00,0x15,0x00,0x09,0x00,0x03,0x2b,0xb8,0x00,0x15,
-0x10,0x30,0x31,0x01,0x21,0x20,0x17,0x16,0x15,0x10,0x07,0x06,0x23,0x21,0x11,0x21,
-0x17,0x15,0x07,0x21,0x27,0x11,0x17,0x11,0x21,0x32,0x37,0x36,0x37,0x34,0x27,0x26,
-0x23,0x01,0xf4,0x01,0x99,0x01,0x2e,0x64,0x20,0xfb,0x3b,0x36,0xfe,0xaa,0x02,0x7a,
-0x08,0x08,0xfc,0xfd,0x08,0x91,0x01,0x46,0x82,0x48,0x10,0x08,0xa2,0x25,0x51,0x05,
-0xd8,0xd0,0x4d,0x5f,0xfe,0xf6,0x5c,0x11,0xfd,0xad,0x08,0x82,0x08,0x08,0x05,0xc7,
-0x83,0xfe,0x24,0x82,0x1a,0x50,0xa4,0x3c,0x10,0x00,0x00,0x01,0x00,0x5d,0x00,0x00,
-0x06,0xce,0x05,0xda,0x00,0x20,0x00,0x35,0xba,0x00,0x20,0x00,0x00,0x00,0x03,0x2b,
-0xb8,0x00,0x20,0x10,0xba,0x00,0x10,0x00,0x00,0x00,0x20,0x11,0x12,0x39,0x00,0xb8,
-0x00,0x00,0x2f,0xba,0x00,0x0c,0x00,0x03,0x00,0x03,0x2b,0xb8,0x00,0x0c,0x10,0xb8,
-0x00,0x14,0xd0,0xb8,0x00,0x03,0x10,0xb8,0x00,0x1d,0xd0,0x30,0x31,0x21,0x10,0x00,
-0x23,0x22,0x02,0x17,0x23,0x26,0x35,0x34,0x36,0x33,0x20,0x13,0x16,0x17,0x36,0x37,
-0x12,0x21,0x32,0x16,0x15,0x14,0x07,0x23,0x36,0x02,0x23,0x22,0x00,0x11,0x03,0x56,
-0xfe,0xe2,0xa9,0x81,0x39,0x6b,0x86,0x5d,0xa3,0x92,0x01,0x74,0x83,0x08,0x05,0x04,
-0x08,0x84,0x01,0x73,0x93,0xa2,0x5d,0x86,0x6b,0x38,0x82,0xa8,0xfe,0xe2,0x02,0x58,
-0x03,0x05,0xfe,0xbb,0xa2,0x84,0xa1,0x84,0xbb,0xfc,0xfb,0x31,0x28,0x28,0x31,0x03,
-0x05,0xbb,0x84,0xa1,0x84,0xa2,0x01,0x45,0xfc,0xfb,0xfd,0xa8,0x00,0x02,0x00,0xb7,
-0x00,0x00,0x06,0x75,0x05,0xd8,0x00,0x0b,0x00,0x31,0x01,0x23,0xb8,0x00,0x32,0x2f,
-0xb8,0x00,0x33,0x2f,0xb8,0x00,0x32,0x10,0xb8,0x00,0x22,0xd0,0xb8,0x00,0x22,0x2f,
-0xb8,0x00,0x03,0xdc,0x41,0x1b,0x00,0x16,0x00,0x03,0x00,0x26,0x00,0x03,0x00,0x36,
-0x00,0x03,0x00,0x46,0x00,0x03,0x00,0x56,0x00,0x03,0x00,0x66,0x00,0x03,0x00,0x76,
-0x00,0x03,0x00,0x86,0x00,0x03,0x00,0x96,0x00,0x03,0x00,0xa6,0x00,0x03,0x00,0xb6,
-0x00,0x03,0x00,0xc6,0x00,0x03,0x00,0xd6,0x00,0x03,0x00,0x0d,0x5d,0x41,0x05,0x00,
-0xe5,0x00,0x03,0x00,0xf5,0x00,0x03,0x00,0x02,0x5d,0xb8,0x00,0x33,0x10,0xb8,0x00,
-0x1c,0xdc,0xb8,0x00,0x09,0xdc,0x41,0x05,0x00,0xea,0x00,0x09,0x00,0xfa,0x00,0x09,
-0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,0x09,0x00,0x29,0x00,0x09,0x00,0x39,0x00,
-0x09,0x00,0x49,0x00,0x09,0x00,0x59,0x00,0x09,0x00,0x69,0x00,0x09,0x00,0x79,0x00,
-0x09,0x00,0x89,0x00,0x09,0x00,0x99,0x00,0x09,0x00,0xa9,0x00,0x09,0x00,0xb9,0x00,
-0x09,0x00,0xc9,0x00,0x09,0x00,0xd9,0x00,0x09,0x00,0x0d,0x5d,0xba,0x00,0x18,0x00,
-0x22,0x00,0x1c,0x11,0x12,0x39,0xb8,0x00,0x1a,0xd0,0xb8,0x00,0x1a,0x2f,0xb8,0x00,
-0x03,0x10,0xb8,0x00,0x24,0xd0,0xb8,0x00,0x24,0x2f,0xba,0x00,0x26,0x00,0x22,0x00,
-0x1c,0x11,0x12,0x39,0x00,0xba,0x00,0x06,0x00,0x1f,0x00,0x03,0x2b,0xb8,0x00,0x06,
-0x10,0xba,0x00,0x12,0x00,0x13,0x00,0x03,0x2b,0xb8,0x00,0x12,0x10,0xba,0x00,0x0c,
-0x00,0x00,0x00,0x03,0x2b,0xb8,0x00,0x0c,0x10,0xba,0x00,0x18,0x00,0x00,0x00,0x0c,
-0x11,0x12,0x39,0xba,0x00,0x26,0x00,0x00,0x00,0x0c,0x11,0x12,0x39,0xb8,0x00,0x13,
-0x10,0xb8,0x00,0x2b,0xd0,0xb8,0x00,0x12,0x10,0xb8,0x00,0x2c,0xd0,0x30,0x31,0x01,
-0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x36,0x37,0x3e,0x02,
-0x33,0x15,0x22,0x02,0x07,0x06,0x07,0x16,0x17,0x16,0x15,0x14,0x00,0x23,0x22,0x00,
-0x35,0x34,0x37,0x36,0x37,0x26,0x27,0x26,0x02,0x23,0x35,0x32,0x1e,0x01,0x17,0x16,
-0x03,0x95,0x93,0xce,0xce,0x93,0x93,0xcf,0xcd,0x95,0x83,0x4c,0x56,0x61,0xa1,0xb9,
-0x7b,0xa7,0x83,0x15,0x17,0x2e,0x2b,0x92,0xfe,0xd9,0xd3,0xd0,0xfe,0xd8,0x94,0x29,
-0x30,0x18,0x15,0x81,0xab,0x7a,0xb9,0xba,0x48,0x55,0x4d,0x03,0x5c,0xcf,0x93,0x93,
-0xce,0xce,0x93,0x93,0xcf,0x96,0x05,0x3d,0x42,0xb4,0xae,0x6c,0xfe,0xc8,0x6c,0x13,
-0x0f,0x1e,0x29,0x95,0xd2,0xd1,0xfe,0xd9,0x01,0x27,0xd1,0xd2,0x95,0x2a,0x1e,0x0e,
-0x13,0x6c,0x01,0x38,0x6c,0xae,0xb4,0x42,0x3d,0x00,0x00,0x02,0x00,0xc0,0x00,0x00,
-0x06,0x6a,0x05,0xda,0x00,0x13,0x00,0x19,0x00,0x3b,0xb8,0x00,0x1a,0x2f,0xb8,0x00,
-0x1b,0x2f,0xb8,0x00,0x1a,0x10,0xb8,0x00,0x00,0xd0,0xb8,0x00,0x00,0x2f,0xb8,0x00,
-0x1b,0x10,0xb8,0x00,0x0a,0xdc,0xb8,0x00,0x16,0xdc,0xb8,0x00,0x00,0x10,0xb8,0x00,
-0x19,0xdc,0x00,0xb8,0x00,0x03,0x2f,0xb8,0x00,0x06,0x2f,0xb8,0x00,0x0d,0x2f,0xb8,
-0x00,0x10,0x2f,0x30,0x31,0x01,0x26,0x27,0x35,0x04,0x20,0x25,0x15,0x06,0x07,0x11,
-0x16,0x17,0x15,0x24,0x20,0x05,0x35,0x36,0x3f,0x01,0x36,0x17,0x11,0x06,0x27,0x02,
-0x12,0xa8,0xaa,0x01,0x5b,0x02,0xf8,0x01,0x57,0xb0,0xa6,0xa6,0xb0,0xfe,0xa9,0xfd,
-0x08,0xfe,0xa5,0xaa,0xa8,0x98,0xe9,0xe9,0xe9,0xe9,0x04,0xfc,0x16,0x34,0x94,0x5a,
-0x5a,0x97,0x2f,0x18,0xfb,0xe2,0x17,0x2f,0x98,0x5b,0x5b,0x94,0x35,0x15,0x0c,0x1a,
-0x1a,0x04,0x07,0x1a,0x1a,0x00,0x00,0x04,0x00,0xe7,0x00,0x40,0x06,0x45,0x05,0x6f,
-0x00,0x0b,0x00,0x1f,0x00,0x2b,0x00,0x3f,0x01,0x81,0xba,0x00,0x29,0x00,0x3b,0x00,
-0x03,0x2b,0xb8,0x00,0x29,0x10,0xba,0x00,0x35,0x00,0x23,0x00,0x03,0x2b,0xb8,0x00,
-0x35,0x10,0xba,0x00,0x1b,0x00,0x09,0x00,0x03,0x2b,0xb8,0x00,0x1b,0x10,0x41,0x1b,
-0x00,0x16,0x00,0x35,0x00,0x26,0x00,0x35,0x00,0x36,0x00,0x35,0x00,0x46,0x00,0x35,
-0x00,0x56,0x00,0x35,0x00,0x66,0x00,0x35,0x00,0x76,0x00,0x35,0x00,0x86,0x00,0x35,
-0x00,0x96,0x00,0x35,0x00,0xa6,0x00,0x35,0x00,0xb6,0x00,0x35,0x00,0xc6,0x00,0x35,
-0x00,0xd6,0x00,0x35,0x00,0x0d,0x5d,0x41,0x05,0x00,0xe5,0x00,0x35,0x00,0xf5,0x00,
-0x35,0x00,0x02,0x5d,0xba,0x00,0x15,0x00,0x23,0x00,0x35,0x11,0x12,0x39,0xb8,0x00,
-0x15,0x2f,0x41,0x05,0x00,0xea,0x00,0x15,0x00,0xfa,0x00,0x15,0x00,0x02,0x5d,0x41,
-0x1b,0x00,0x19,0x00,0x15,0x00,0x29,0x00,0x15,0x00,0x39,0x00,0x15,0x00,0x49,0x00,
-0x15,0x00,0x59,0x00,0x15,0x00,0x69,0x00,0x15,0x00,0x79,0x00,0x15,0x00,0x89,0x00,
-0x15,0x00,0x99,0x00,0x15,0x00,0xa9,0x00,0x15,0x00,0xb9,0x00,0x15,0x00,0xc9,0x00,
-0x15,0x00,0xd9,0x00,0x15,0x00,0x0d,0x5d,0xb8,0x00,0x03,0xdc,0x41,0x05,0x00,0xea,
-0x00,0x09,0x00,0xfa,0x00,0x09,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,0x09,0x00,
-0x29,0x00,0x09,0x00,0x39,0x00,0x09,0x00,0x49,0x00,0x09,0x00,0x59,0x00,0x09,0x00,
-0x69,0x00,0x09,0x00,0x79,0x00,0x09,0x00,0x89,0x00,0x09,0x00,0x99,0x00,0x09,0x00,
-0xa9,0x00,0x09,0x00,0xb9,0x00,0x09,0x00,0xc9,0x00,0x09,0x00,0xd9,0x00,0x09,0x00,
-0x0d,0x5d,0xb8,0x00,0x3b,0x10,0xb8,0x00,0x0f,0xd0,0x41,0x1b,0x00,0x16,0x00,0x29,
-0x00,0x26,0x00,0x29,0x00,0x36,0x00,0x29,0x00,0x46,0x00,0x29,0x00,0x56,0x00,0x29,
-0x00,0x66,0x00,0x29,0x00,0x76,0x00,0x29,0x00,0x86,0x00,0x29,0x00,0x96,0x00,0x29,
-0x00,0xa6,0x00,0x29,0x00,0xb6,0x00,0x29,0x00,0xc6,0x00,0x29,0x00,0xd6,0x00,0x29,
-0x00,0x0d,0x5d,0x41,0x05,0x00,0xe5,0x00,0x29,0x00,0xf5,0x00,0x29,0x00,0x02,0x5d,
-0xb8,0x00,0x1b,0x10,0xb8,0x00,0x2f,0xd0,0xb8,0x00,0x1b,0x10,0xb8,0x00,0x41,0xdc,
-0x00,0xba,0x00,0x20,0x00,0x38,0x00,0x03,0x2b,0xb8,0x00,0x20,0x10,0xba,0x00,0x18,
-0x00,0x00,0x00,0x03,0x2b,0xb8,0x00,0x18,0x10,0x30,0x31,0x01,0x22,0x06,0x15,0x14,
-0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x2c,0x01,0x27,0x35,0x16,0x04,0x27,0x26,
-0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x0e,0x01,0x01,0x32,0x36,0x35,0x34,
-0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x0c,0x01,0x17,0x15,0x26,0x24,0x17,0x16,
-0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x3e,0x01,0x04,0xe3,0x5f,0x84,0x84,
-0x5f,0x5e,0x85,0x84,0xfe,0xe2,0xfe,0xc8,0xfe,0x94,0x99,0xfd,0x02,0x2d,0x0c,0x83,
-0xcd,0x93,0x95,0xce,0x68,0x49,0xf6,0xfd,0xab,0x5e,0x85,0x85,0x5e,0x5e,0x86,0x85,
-0x01,0x1d,0x01,0x39,0x01,0x6c,0x99,0xfd,0xfd,0xd4,0x0b,0x83,0xcd,0x93,0x95,0xce,
-0x68,0x49,0xf5,0x02,0xb8,0x84,0x5f,0x5f,0x85,0x85,0x5f,0x5f,0x84,0xfd,0x88,0x02,
-0x28,0x2b,0x7c,0x54,0x21,0x25,0x6c,0xa7,0x93,0xcf,0xcf,0x93,0x93,0x67,0x4d,0x4c,
-0x02,0xb6,0x84,0x5f,0x5f,0x84,0x84,0x5f,0x5f,0x84,0x02,0x78,0x02,0x29,0x2b,0x7b,
-0x54,0x21,0x26,0x6c,0xa6,0x94,0xcf,0xcf,0x94,0x92,0x67,0x4d,0x4d,0x00,0x00,0x02,
-0x01,0x1e,0x00,0x00,0x06,0x0d,0x05,0xd8,0x00,0x0b,0x00,0x3d,0x01,0x15,0xba,0x00,
-0x28,0x00,0x0c,0x00,0x03,0x2b,0xb8,0x00,0x28,0x10,0xba,0x00,0x15,0x00,0x1f,0x00,
-0x03,0x2b,0xb8,0x00,0x15,0x10,0xba,0x00,0x12,0x00,0x22,0x00,0x03,0x2b,0xb8,0x00,
-0x12,0x10,0x41,0x05,0x00,0xea,0x00,0x1f,0x00,0xfa,0x00,0x1f,0x00,0x02,0x5d,0x41,
-0x1b,0x00,0x19,0x00,0x1f,0x00,0x29,0x00,0x1f,0x00,0x39,0x00,0x1f,0x00,0x49,0x00,
-0x1f,0x00,0x59,0x00,0x1f,0x00,0x69,0x00,0x1f,0x00,0x79,0x00,0x1f,0x00,0x89,0x00,
-0x1f,0x00,0x99,0x00,0x1f,0x00,0xa9,0x00,0x1f,0x00,0xb9,0x00,0x1f,0x00,0xc9,0x00,
-0x1f,0x00,0xd9,0x00,0x1f,0x00,0x0d,0x5d,0x41,0x05,0x00,0xea,0x00,0x22,0x00,0xfa,
-0x00,0x22,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,0x22,0x00,0x29,0x00,0x22,0x00,
-0x39,0x00,0x22,0x00,0x49,0x00,0x22,0x00,0x59,0x00,0x22,0x00,0x69,0x00,0x22,0x00,
-0x79,0x00,0x22,0x00,0x89,0x00,0x22,0x00,0x99,0x00,0x22,0x00,0xa9,0x00,0x22,0x00,
-0xb9,0x00,0x22,0x00,0xc9,0x00,0x22,0x00,0xd9,0x00,0x22,0x00,0x0d,0x5d,0x41,0x1b,
-0x00,0x16,0x00,0x28,0x00,0x26,0x00,0x28,0x00,0x36,0x00,0x28,0x00,0x46,0x00,0x28,
-0x00,0x56,0x00,0x28,0x00,0x66,0x00,0x28,0x00,0x76,0x00,0x28,0x00,0x86,0x00,0x28,
-0x00,0x96,0x00,0x28,0x00,0xa6,0x00,0x28,0x00,0xb6,0x00,0x28,0x00,0xc6,0x00,0x28,
-0x00,0xd6,0x00,0x28,0x00,0x0d,0x5d,0x41,0x05,0x00,0xe5,0x00,0x28,0x00,0xf5,0x00,
-0x28,0x00,0x02,0x5d,0xb8,0x00,0x3f,0xdc,0x00,0xba,0x00,0x17,0x00,0x1c,0x00,0x03,
-0x2b,0xb8,0x00,0x17,0x10,0xba,0x00,0x0f,0x00,0x25,0x00,0x03,0x2b,0xb8,0x00,0x0f,
-0x10,0x30,0x31,0x01,0x3e,0x01,0x27,0x2e,0x01,0x07,0x0e,0x01,0x17,0x1e,0x01,0x13,
-0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x00,0x15,0x16,0x17,0x32,0x37,0x17,0x06,0x23,
-0x22,0x26,0x35,0x34,0x00,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x1e,
-0x01,0x07,0x06,0x07,0x06,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x17,0x36,
-0x26,0x02,0x94,0x4b,0x41,0x1d,0x1d,0x94,0x4b,0x4b,0x40,0x1d,0x1e,0x92,0x57,0xdf,
-0xb4,0xac,0xda,0xfe,0xde,0x04,0x86,0x47,0x64,0x41,0x7f,0x6f,0x63,0x90,0x01,0x1f,
-0xa4,0x84,0x7f,0x96,0x2e,0x19,0x25,0x0f,0x26,0x33,0x74,0x75,0xe4,0x2f,0x16,0x1b,
-0x33,0x75,0x84,0x80,0x18,0x5d,0x01,0x8c,0x1d,0x94,0x4a,0x4b,0x41,0x1d,0x1e,0x92,
-0x4b,0x4c,0x40,0x02,0xff,0xa1,0xc9,0xdd,0xb0,0xbb,0xfe,0x0a,0xb4,0x7c,0x03,0x58,
-0x48,0x77,0x79,0x6f,0xc7,0x01,0xe1,0xc2,0x86,0xa5,0x9b,0x81,0x3c,0x91,0x3e,0x62,
-0xdb,0x51,0x73,0x2d,0x2e,0x63,0x78,0x36,0x38,0x3c,0x3c,0x72,0x2e,0x33,0x47,0x01,
-0xde,0x00,0x00,0x02,0x00,0x6d,0xfe,0x8f,0x06,0xbe,0x05,0xd8,0x00,0x36,0x00,0x3f,
-0x00,0xe9,0xba,0x00,0x2d,0x00,0x2e,0x00,0x03,0x2b,0xb8,0x00,0x2d,0x10,0xba,0x00,
-0x24,0x00,0x25,0x00,0x03,0x2b,0xb8,0x00,0x24,0x10,0xba,0x00,0x38,0x00,0x1d,0x00,
-0x03,0x2b,0xb8,0x00,0x38,0x10,0xba,0x00,0x10,0x00,0x3a,0x00,0x03,0x2b,0xb8,0x00,
-0x10,0x10,0xb8,0x00,0x24,0x10,0xb8,0x00,0x03,0xd0,0xb8,0x00,0x03,0x2f,0xb8,0x00,
-0x38,0x10,0xb8,0x00,0x09,0xd0,0xba,0x00,0x0a,0x00,0x2e,0x00,0x10,0x11,0x12,0x39,
-0xba,0x00,0x14,0x00,0x2e,0x00,0x10,0x11,0x12,0x39,0xb8,0x00,0x24,0x10,0xb8,0x00,
-0x19,0xd0,0xb8,0x00,0x19,0x2f,0xba,0x00,0x34,0x00,0x2e,0x00,0x2d,0x11,0x12,0x39,
-0x41,0x05,0x00,0xea,0x00,0x3a,0x00,0xfa,0x00,0x3a,0x00,0x02,0x5d,0x41,0x1b,0x00,
-0x19,0x00,0x3a,0x00,0x29,0x00,0x3a,0x00,0x39,0x00,0x3a,0x00,0x49,0x00,0x3a,0x00,
-0x59,0x00,0x3a,0x00,0x69,0x00,0x3a,0x00,0x79,0x00,0x3a,0x00,0x89,0x00,0x3a,0x00,
-0x99,0x00,0x3a,0x00,0xa9,0x00,0x3a,0x00,0xb9,0x00,0x3a,0x00,0xc9,0x00,0x3a,0x00,
-0xd9,0x00,0x3a,0x00,0x0d,0x5d,0xb8,0x00,0x10,0x10,0xb8,0x00,0x41,0xdc,0x00,0xb8,
-0x00,0x14,0x2f,0xba,0x00,0x06,0x00,0x20,0x00,0x03,0x2b,0xb8,0x00,0x06,0x10,0xb8,
-0x00,0x00,0xd0,0xb8,0x00,0x20,0x10,0xb8,0x00,0x29,0xd0,0xb8,0x00,0x29,0x2f,0xba,
-0x00,0x31,0x00,0x20,0x00,0x06,0x11,0x12,0x39,0x30,0x31,0x01,0x32,0x16,0x15,0x3e,
-0x01,0x33,0x32,0x16,0x1d,0x01,0x3e,0x01,0x33,0x32,0x16,0x11,0x10,0x01,0x16,0x17,
-0x23,0x26,0x27,0x06,0x07,0x35,0x36,0x37,0x27,0x11,0x12,0x27,0x0e,0x01,0x07,0x11,
-0x23,0x11,0x10,0x26,0x07,0x26,0x06,0x07,0x11,0x23,0x11,0x34,0x27,0x33,0x16,0x17,
-0x3e,0x01,0x01,0x11,0x24,0x13,0x34,0x26,0x07,0x22,0x06,0x02,0xa8,0x3f,0x77,0x28,
-0xc6,0x4b,0x3e,0x52,0x30,0x83,0x44,0x3c,0x64,0xfe,0x83,0x01,0x92,0xa8,0x2e,0x4a,
-0xa7,0xaf,0xbf,0x7c,0x09,0x03,0x31,0x3a,0x85,0x3f,0x97,0x1f,0x24,0x29,0xb4,0x13,
-0x95,0x98,0x8e,0x76,0x24,0x17,0xb7,0x02,0xc4,0x01,0x02,0x18,0x2f,0x1e,0x1e,0x8f,
-0x05,0xd8,0xc6,0x80,0x77,0xcf,0xa7,0xdb,0xca,0x7d,0x77,0xe8,0xfe,0xef,0xfe,0x68,
-0xfe,0xbf,0x5e,0xc1,0x29,0xa1,0x65,0x07,0x74,0x1c,0x57,0xd9,0x03,0x57,0x01,0x3c,
-0x01,0x01,0xd9,0xc8,0xfc,0x61,0x03,0x9a,0x01,0x41,0x6b,0x01,0x01,0xe3,0xd7,0xfc,
-0x74,0x04,0x41,0xbe,0xbf,0x4f,0xb0,0x5d,0xbc,0xfc,0x92,0xfd,0xd0,0xfa,0x01,0x52,
-0xc1,0x90,0x05,0xce,0x00,0x02,0x00,0xab,0x00,0x6b,0x06,0x81,0x05,0x39,0x00,0x03,
-0x00,0x24,0x00,0xff,0xb8,0x00,0x25,0x2f,0xb8,0x00,0x26,0x2f,0xb8,0x00,0x25,0x10,
-0xb8,0x00,0x09,0xd0,0xb8,0x00,0x09,0x2f,0xb8,0x00,0x20,0xdc,0x41,0x1b,0x00,0x16,
-0x00,0x20,0x00,0x26,0x00,0x20,0x00,0x36,0x00,0x20,0x00,0x46,0x00,0x20,0x00,0x56,
-0x00,0x20,0x00,0x66,0x00,0x20,0x00,0x76,0x00,0x20,0x00,0x86,0x00,0x20,0x00,0x96,
-0x00,0x20,0x00,0xa6,0x00,0x20,0x00,0xb6,0x00,0x20,0x00,0xc6,0x00,0x20,0x00,0xd6,
-0x00,0x20,0x00,0x0d,0x5d,0x41,0x05,0x00,0xe5,0x00,0x20,0x00,0xf5,0x00,0x20,0x00,
-0x02,0x5d,0xba,0x00,0x07,0x00,0x09,0x00,0x20,0x11,0x12,0x39,0xb8,0x00,0x26,0x10,
-0xb8,0x00,0x0f,0xdc,0xb8,0x00,0x1a,0xdc,0x41,0x05,0x00,0xea,0x00,0x1a,0x00,0xfa,
-0x00,0x1a,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,0x1a,0x00,0x29,0x00,0x1a,0x00,
-0x39,0x00,0x1a,0x00,0x49,0x00,0x1a,0x00,0x59,0x00,0x1a,0x00,0x69,0x00,0x1a,0x00,
-0x79,0x00,0x1a,0x00,0x89,0x00,0x1a,0x00,0x99,0x00,0x1a,0x00,0xa9,0x00,0x1a,0x00,
-0xb9,0x00,0x1a,0x00,0xc9,0x00,0x1a,0x00,0xd9,0x00,0x1a,0x00,0x0d,0x5d,0xba,0x00,
-0x11,0x00,0x0f,0x00,0x1a,0x11,0x12,0x39,0x00,0xba,0x00,0x01,0x00,0x02,0x00,0x03,
-0x2b,0xb8,0x00,0x01,0x10,0xba,0x00,0x0c,0x00,0x1d,0x00,0x03,0x2b,0xb8,0x00,0x0c,
-0x10,0xba,0x00,0x24,0x00,0x04,0x00,0x03,0x2b,0xb8,0x00,0x24,0x10,0xb8,0x00,0x06,
-0xd0,0xb8,0x00,0x24,0x10,0xb8,0x00,0x11,0xd0,0xb8,0x00,0x04,0x10,0xb8,0x00,0x13,
-0xd0,0x30,0x31,0x13,0x21,0x15,0x21,0x01,0x21,0x35,0x21,0x26,0x35,0x34,0x00,0x33,
-0x32,0x00,0x15,0x14,0x07,0x21,0x15,0x21,0x35,0x23,0x36,0x37,0x36,0x35,0x34,0x26,
-0x23,0x22,0x06,0x15,0x14,0x17,0x16,0x17,0xab,0x05,0xd6,0xfa,0x2a,0x02,0x2d,0xfd,
-0xd3,0x01,0x62,0x43,0x01,0x01,0xb9,0xba,0x01,0x03,0x44,0x01,0x84,0xfd,0xaf,0x01,
-0x12,0x11,0x56,0xaa,0x7a,0x7a,0xaa,0x55,0x10,0x13,0x01,0x03,0x98,0x01,0x8f,0x98,
-0x68,0x83,0xb9,0x01,0x03,0xfe,0xfd,0xb9,0x83,0x68,0x98,0x98,0x0d,0x11,0x55,0x79,
-0x7a,0xaa,0xaa,0x7a,0x79,0x55,0x11,0x0d,0x00,0x01,0x00,0x45,0xff,0x3c,0x06,0xe8,
-0x05,0xd8,0x00,0x34,0x00,0xab,0xba,0x00,0x1f,0x00,0x20,0x00,0x03,0x2b,0xb8,0x00,
-0x1f,0x10,0xba,0x00,0x16,0x00,0x17,0x00,0x03,0x2b,0xb8,0x00,0x16,0x10,0xba,0x00,
-0x32,0x00,0x2f,0x00,0x03,0x2b,0xb8,0x00,0x32,0x10,0xb8,0x00,0x00,0xd0,0xb8,0x00,
-0x00,0x2f,0xb8,0x00,0x32,0x10,0xb8,0x00,0x05,0xdc,0xb8,0x00,0x09,0xd0,0xb8,0x00,
-0x2f,0x10,0xb8,0x00,0x0f,0xd0,0xb8,0x00,0x0f,0x2f,0xb8,0x00,0x2f,0x10,0xb8,0x00,
-0x10,0xd0,0xb8,0x00,0x10,0x2f,0xb8,0x00,0x1f,0x10,0xb8,0x00,0x18,0xdc,0xba,0x00,
-0x26,0x00,0x20,0x00,0x1f,0x11,0x12,0x39,0xb8,0x00,0x16,0x10,0xb8,0x00,0x2c,0xd0,
-0xb8,0x00,0x2c,0x2f,0x00,0xb8,0x00,0x08,0x2f,0xba,0x00,0x04,0x00,0x0a,0x00,0x03,
-0x2b,0xb8,0x00,0x04,0x10,0xba,0x00,0x2f,0x00,0x12,0x00,0x03,0x2b,0xb8,0x00,0x2f,
-0x10,0xb8,0x00,0x12,0x10,0xb8,0x00,0x1b,0xd0,0xb8,0x00,0x1b,0x2f,0xba,0x00,0x23,
-0x00,0x12,0x00,0x2f,0x11,0x12,0x39,0xb8,0x00,0x2f,0x10,0xb8,0x00,0x29,0xd0,0x30,
-0x31,0x01,0x14,0x16,0x17,0x33,0x35,0x33,0x17,0x07,0x27,0x35,0x23,0x22,0x27,0x26,
-0x27,0x03,0x12,0x27,0x0e,0x01,0x07,0x11,0x23,0x11,0x10,0x26,0x07,0x26,0x06,0x07,
-0x11,0x23,0x11,0x34,0x27,0x33,0x16,0x17,0x3e,0x01,0x33,0x32,0x16,0x15,0x3e,0x01,
-0x33,0x32,0x16,0x1d,0x01,0x13,0x05,0x00,0x67,0x59,0x59,0x04,0xcb,0xcb,0x04,0x59,
-0xcb,0x44,0x2c,0x08,0x15,0x03,0x31,0x3a,0x85,0x3f,0x97,0x1f,0x24,0x29,0xb4,0x13,
-0x95,0x98,0x8e,0x76,0x24,0x17,0xb7,0x45,0x3f,0x77,0x28,0xc6,0x4b,0x3e,0x52,0x01,
-0x01,0x0f,0x6f,0x7d,0x01,0x76,0xad,0xaf,0x04,0x76,0x78,0x4a,0x76,0x03,0x16,0x01,
-0x3c,0x01,0x01,0xd9,0xc8,0xfc,0x61,0x03,0x9a,0x01,0x41,0x6b,0x01,0x01,0xe3,0xd7,
-0xfc,0x74,0x04,0x41,0xbe,0xbf,0x4f,0xb0,0x5d,0xbc,0xc6,0x80,0x77,0xcf,0xa7,0xdb,
-0xca,0xfd,0x84,0x00,0x00,0x01,0x00,0xa9,0x00,0x00,0x06,0x83,0x05,0xd8,0x00,0x13,
-0x00,0x65,0xb8,0x00,0x14,0x2f,0xb8,0x00,0x15,0x2f,0xb8,0x00,0x14,0x10,0xb8,0x00,
-0x0c,0xd0,0xb8,0x00,0x0c,0x2f,0xb8,0x00,0x15,0x10,0xb8,0x00,0x07,0xdc,0xb8,0x00,
-0x05,0xd0,0xb8,0x00,0x05,0x2f,0xba,0x00,0x00,0x00,0x0c,0x00,0x05,0x11,0x12,0x39,
-0xb8,0x00,0x07,0x10,0xb8,0x00,0x03,0xd0,0xb8,0x00,0x07,0x10,0xb8,0x00,0x08,0xdc,
-0xb8,0x00,0x0c,0x10,0xb8,0x00,0x0b,0xdc,0x00,0xb8,0x00,0x0e,0x2f,0xba,0x00,0x03,
-0x00,0x00,0x00,0x03,0x2b,0xb8,0x00,0x03,0x10,0xba,0x00,0x13,0x00,0x10,0x00,0x03,
-0x2b,0xb8,0x00,0x13,0x10,0x30,0x31,0x01,0x21,0x35,0x21,0x15,0x33,0x07,0x11,0x23,
-0x11,0x01,0x11,0x23,0x11,0x01,0x27,0x01,0x21,0x35,0x21,0x05,0x7e,0xfd,0xd2,0x03,
-0x32,0x01,0x01,0x98,0xfe,0xff,0x98,0xfc,0xc3,0x6b,0x03,0x3c,0xfd,0xd2,0x02,0xc6,
-0x05,0x40,0x98,0x69,0x01,0xfd,0x38,0x02,0x30,0xfe,0xff,0xfd,0x38,0x02,0x30,0xfc,
-0xc3,0x6b,0x03,0x3c,0x98,0x00,0x00,0x02,0x00,0xc0,0x00,0x00,0x06,0x6a,0x05,0xd8,
-0x00,0x27,0x00,0x2f,0x00,0xa5,0xb8,0x00,0x30,0x2f,0xb8,0x00,0x31,0x2f,0xb8,0x00,
-0x08,0xdc,0xb8,0x00,0x30,0x10,0xb8,0x00,0x1c,0xd0,0xb8,0x00,0x1c,0x2f,0xba,0x00,
-0x0d,0x00,0x1c,0x00,0x08,0x11,0x12,0x39,0xb8,0x00,0x1b,0xdc,0xba,0x00,0x23,0x00,
-0x1c,0x00,0x1b,0x11,0x12,0x39,0xb8,0x00,0x25,0xd0,0xb8,0x00,0x25,0x2f,0xb8,0x00,
-0x08,0x10,0xb8,0x00,0x2c,0xdc,0x41,0x05,0x00,0xea,0x00,0x2c,0x00,0xfa,0x00,0x2c,
-0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,0x2c,0x00,0x29,0x00,0x2c,0x00,0x39,0x00,
-0x2c,0x00,0x49,0x00,0x2c,0x00,0x59,0x00,0x2c,0x00,0x69,0x00,0x2c,0x00,0x79,0x00,
-0x2c,0x00,0x89,0x00,0x2c,0x00,0x99,0x00,0x2c,0x00,0xa9,0x00,0x2c,0x00,0xb9,0x00,
-0x2c,0x00,0xc9,0x00,0x2c,0x00,0xd9,0x00,0x2c,0x00,0x0d,0x5d,0x00,0xb8,0x00,0x00,
-0x2f,0xba,0x00,0x12,0x00,0x11,0x00,0x03,0x2b,0xb8,0x00,0x12,0x10,0xba,0x00,0x2a,
-0x00,0x0b,0x00,0x03,0x2b,0xb8,0x00,0x2a,0x10,0x30,0x31,0x01,0x32,0x12,0x37,0x36,
-0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x0e,0x01,0x07,0x23,0x35,0x37,0x36,
-0x13,0x26,0x02,0x23,0x22,0x02,0x17,0x07,0x34,0x02,0x27,0x35,0x32,0x16,0x13,0x36,
-0x37,0x3e,0x01,0x01,0x16,0x33,0x32,0x37,0x26,0x27,0x22,0x03,0x53,0x6b,0x51,0x19,
-0x6d,0xc3,0x79,0x99,0x8f,0x8e,0x9b,0x7a,0x2c,0x7e,0x8a,0xa8,0x9a,0x7a,0x69,0x32,
-0x40,0x3a,0x24,0xa0,0x06,0x9e,0x8d,0x84,0x93,0xa1,0x28,0x2e,0x2d,0x29,0x7a,0x01,
-0x57,0x5d,0x82,0xa1,0x09,0x07,0x9f,0x98,0x05,0xd8,0xfc,0x9e,0x04,0xdd,0xbe,0x67,
-0x91,0xab,0x85,0xa0,0xd7,0x04,0x76,0x01,0x04,0x01,0x78,0x10,0x03,0x15,0xfe,0x1c,
-0xcf,0x02,0xfd,0x01,0xf0,0x06,0x61,0xde,0xfe,0xed,0xc9,0x58,0x5b,0x96,0xfc,0x26,
-0x91,0xc5,0x9d,0x13,0x00,0x02,0x00,0xb0,0x01,0x39,0x06,0x7b,0x04,0xa2,0x00,0x21,
-0x00,0x43,0x00,0x0f,0x00,0xb8,0x00,0x2a,0x2f,0xb8,0x00,0x11,0x2f,0xb8,0x00,0x20,
-0x2f,0x30,0x31,0x13,0x00,0x33,0x32,0x17,0x16,0x37,0x36,0x33,0x32,0x17,0x16,0x37,
-0x36,0x33,0x32,0x13,0x07,0x02,0x07,0x06,0x23,0x22,0x27,0x26,0x07,0x06,0x23,0x22,
-0x27,0x26,0x00,0x23,0x27,0x11,0x00,0x33,0x32,0x17,0x16,0x37,0x36,0x33,0x32,0x17,
-0x16,0x37,0x36,0x33,0x32,0x13,0x07,0x02,0x07,0x06,0x23,0x22,0x27,0x26,0x07,0x06,
-0x23,0x22,0x27,0x26,0x00,0x23,0x27,0xb0,0x01,0x45,0x73,0x2d,0x0d,0x31,0xad,0x56,
-0x38,0x36,0x18,0x35,0xad,0x2b,0x29,0x7c,0x6d,0x5e,0x61,0xac,0x56,0x38,0x38,0x19,
-0x35,0xac,0x57,0x37,0x38,0x19,0x30,0xfe,0xa9,0x05,0x35,0x01,0x44,0x74,0x2c,0x0e,
-0x31,0xac,0x57,0x37,0x37,0x17,0x36,0xac,0x2b,0x29,0x7d,0x6d,0x5e,0x61,0xac,0x57,
-0x37,0x38,0x1a,0x34,0xad,0x56,0x38,0x37,0x19,0x30,0xfe,0xa9,0x05,0x35,0x01,0x9d,
-0x01,0x0f,0x28,0x8e,0x8e,0x47,0x47,0x8e,0x8e,0x24,0xfe,0xc4,0x33,0x01,0x1c,0x98,
-0x4c,0x4b,0x97,0x8c,0x47,0x48,0x8d,0xfe,0xe4,0x62,0x01,0xd9,0x01,0x0d,0x27,0x8d,
-0x8d,0x48,0x48,0x8d,0x8d,0x23,0xfe,0xc5,0x32,0x01,0x1c,0x99,0x4d,0x4c,0x97,0x8d,
-0x47,0x48,0x8f,0xfe,0xe4,0x61,0x00,0x01,0x01,0x41,0x00,0x00,0x05,0xea,0x05,0xd8,
-0x00,0x1c,0x00,0x83,0xb8,0x00,0x1d,0x2f,0xb8,0x00,0x1e,0x2f,0xb8,0x00,0x17,0xdc,
-0xb8,0x00,0x0f,0xdc,0xb8,0x00,0x00,0xd0,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x1d,0x10,
-0xb8,0x00,0x06,0xd0,0xb8,0x00,0x06,0x2f,0xb8,0x00,0x01,0xdc,0xb8,0x00,0x06,0x10,
-0xb8,0x00,0x09,0xd0,0xb8,0x00,0x01,0x10,0xb8,0x00,0x0e,0xd0,0xb8,0x00,0x17,0x10,
-0xb8,0x00,0x14,0xd0,0xb8,0x00,0x14,0x2f,0x00,0xb8,0x00,0x04,0x2f,0xb8,0x00,0x19,
-0x2f,0xb8,0x00,0x0b,0x2f,0xb8,0x00,0x11,0x2f,0xba,0x00,0x0e,0x00,0x01,0x00,0x03,
-0x2b,0xb8,0x00,0x0e,0x10,0xb8,0x00,0x01,0x10,0xb8,0x00,0x06,0xd0,0xb8,0x00,0x0e,
-0x10,0xb8,0x00,0x08,0xd0,0xb8,0x00,0x0e,0x10,0xb8,0x00,0x14,0xd0,0xb8,0x00,0x01,
-0x10,0xb8,0x00,0x16,0xd0,0x30,0x31,0x01,0x07,0x02,0x01,0x07,0x00,0x13,0x21,0x35,
-0x21,0x02,0x01,0x17,0x00,0x13,0x33,0x12,0x01,0x37,0x00,0x03,0x21,0x07,0x21,0x12,
-0x01,0x27,0x00,0x03,0x04,0x0e,0xf1,0x20,0xfe,0xea,0xa5,0x01,0x33,0x1b,0xfe,0xd8,
-0x01,0x28,0x1c,0xfe,0xcd,0xa6,0x01,0x16,0x20,0xf2,0x1f,0x01,0x17,0xa5,0xfe,0xcd,
-0x1b,0x01,0x27,0x01,0xfe,0xd8,0x1d,0x01,0x33,0xa6,0xfe,0xe9,0x1f,0x02,0x99,0x03,
-0xfe,0xae,0xfe,0xbf,0x03,0x01,0x5f,0x01,0x37,0xac,0x01,0x36,0x01,0x60,0x03,0xfe,
-0xc0,0xfe,0xad,0x01,0x53,0x01,0x40,0x03,0xfe,0xa0,0xfe,0xca,0xac,0xfe,0xc9,0xfe,
-0xa1,0x03,0x01,0x41,0x01,0x52,0x00,0x05,0x00,0xc9,0x00,0x00,0x06,0x63,0x05,0xd8,
-0x00,0x10,0x00,0x21,0x00,0x25,0x00,0x55,0x00,0x65,0x01,0x53,0xba,0x00,0x0a,0x00,
-0x2c,0x00,0x03,0x2b,0xb8,0x00,0x0a,0x10,0xba,0x00,0x23,0x00,0x26,0x00,0x03,0x2b,
-0xb8,0x00,0x23,0x10,0xba,0x00,0x21,0x00,0x00,0x00,0x03,0x2b,0xb8,0x00,0x21,0x10,
-0xba,0x00,0x55,0x00,0x24,0x00,0x03,0x2b,0xb8,0x00,0x55,0x10,0xba,0x00,0x4f,0x00,
-0x17,0x00,0x03,0x2b,0xb8,0x00,0x4f,0x10,0x41,0x1b,0x00,0x16,0x00,0x0a,0x00,0x26,
-0x00,0x0a,0x00,0x36,0x00,0x0a,0x00,0x46,0x00,0x0a,0x00,0x56,0x00,0x0a,0x00,0x66,
-0x00,0x0a,0x00,0x76,0x00,0x0a,0x00,0x86,0x00,0x0a,0x00,0x96,0x00,0x0a,0x00,0xa6,
-0x00,0x0a,0x00,0xb6,0x00,0x0a,0x00,0xc6,0x00,0x0a,0x00,0xd6,0x00,0x0a,0x00,0x0d,
-0x5d,0x41,0x05,0x00,0xe5,0x00,0x0a,0x00,0xf5,0x00,0x0a,0x00,0x02,0x5d,0x41,0x05,
-0x00,0xea,0x00,0x17,0x00,0xfa,0x00,0x17,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,
-0x17,0x00,0x29,0x00,0x17,0x00,0x39,0x00,0x17,0x00,0x49,0x00,0x17,0x00,0x59,0x00,
-0x17,0x00,0x69,0x00,0x17,0x00,0x79,0x00,0x17,0x00,0x89,0x00,0x17,0x00,0x99,0x00,
-0x17,0x00,0xa9,0x00,0x17,0x00,0xb9,0x00,0x17,0x00,0xc9,0x00,0x17,0x00,0xd9,0x00,
-0x17,0x00,0x0d,0x5d,0xba,0x00,0x33,0x00,0x2c,0x00,0x4f,0x11,0x12,0x39,0xba,0x00,
-0x49,0x00,0x2c,0x00,0x4f,0x11,0x12,0x39,0xb8,0x00,0x67,0xdc,0x00,0xb8,0x00,0x3d,
-0x2f,0xba,0x00,0x23,0x00,0x26,0x00,0x03,0x2b,0xb8,0x00,0x23,0x10,0xba,0x00,0x3c,
-0x00,0x39,0x00,0x03,0x2b,0xb8,0x00,0x3c,0x10,0xba,0x00,0x0f,0x00,0x22,0x00,0x03,
-0x2b,0xb8,0x00,0x0f,0x10,0xba,0x00,0x30,0x00,0x06,0x00,0x03,0x2b,0xb8,0x00,0x30,
-0x10,0xb8,0x00,0x0f,0x10,0xb8,0x00,0x11,0xd0,0xb8,0x00,0x06,0x10,0xb8,0x00,0x1b,
-0xd0,0xba,0x00,0x33,0x00,0x06,0x00,0x30,0x11,0x12,0x39,0xb8,0x00,0x3c,0x10,0xb8,
-0x00,0x3f,0xd0,0xb8,0x00,0x39,0x10,0xb8,0x00,0x41,0xd0,0xba,0x00,0x49,0x00,0x06,
-0x00,0x30,0x11,0x12,0x39,0xb8,0x00,0x30,0x10,0xb8,0x00,0x4b,0xd0,0x30,0x31,0x01,
-0x36,0x37,0x26,0x27,0x26,0x23,0x22,0x0e,0x01,0x15,0x14,0x16,0x17,0x16,0x17,0x21,
-0x33,0x21,0x36,0x37,0x3e,0x01,0x35,0x34,0x2e,0x01,0x23,0x22,0x07,0x06,0x07,0x16,
-0x17,0x01,0x11,0x21,0x11,0x01,0x11,0x26,0x27,0x2e,0x01,0x35,0x34,0x3e,0x01,0x33,
-0x32,0x17,0x35,0x34,0x36,0x37,0x36,0x37,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,
-0x15,0x23,0x15,0x16,0x17,0x1e,0x01,0x1d,0x01,0x36,0x33,0x32,0x1e,0x01,0x15,0x14,
-0x06,0x07,0x06,0x07,0x11,0x01,0x14,0x1e,0x01,0x33,0x32,0x3e,0x01,0x35,0x34,0x2e,
-0x01,0x23,0x22,0x0e,0x01,0x03,0x50,0x01,0x02,0x23,0x33,0x4a,0x4e,0x4e,0x93,0x54,
-0x52,0x4a,0x16,0x17,0x01,0x57,0x8d,0x01,0x56,0x18,0x16,0x4a,0x51,0x53,0x93,0x4f,
-0x4d,0x4a,0x34,0x22,0x02,0x01,0xfe,0x3f,0x02,0xf5,0xfc,0xb9,0x2a,0x26,0x45,0x6c,
-0x6e,0xc6,0x68,0x50,0x4c,0x24,0x20,0x0d,0x10,0x6c,0x6c,0x69,0x6c,0x6c,0x10,0x0d,
-0x1f,0x25,0x4c,0x4f,0x68,0xc6,0x6e,0x6c,0x44,0x27,0x29,0xfd,0xd6,0x19,0x2d,0x17,
-0x18,0x2d,0x18,0x18,0x2d,0x18,0x17,0x2d,0x19,0x03,0xc7,0x03,0x03,0x2b,0x1c,0x29,
-0x51,0x95,0x50,0x51,0x92,0x28,0x0e,0x08,0x08,0x0e,0x28,0x92,0x51,0x50,0x95,0x51,
-0x29,0x1c,0x2b,0x03,0x03,0xfd,0xb8,0xfe,0xd1,0x01,0x2f,0xfe,0x81,0x01,0x7f,0x0d,
-0x16,0x36,0xc4,0x6b,0x6c,0xc5,0x6a,0x1f,0x02,0x24,0x3f,0x12,0x07,0x04,0x36,0x46,
-0x57,0x57,0x46,0x36,0x04,0x07,0x12,0x3f,0x24,0x02,0x1f,0x6a,0xc5,0x6c,0x6b,0xc4,
-0x36,0x16,0x0d,0xfe,0x81,0x04,0x7d,0x19,0x2b,0x19,0x19,0x2b,0x19,0x18,0x2d,0x17,
-0x17,0x2d,0x00,0x08,0x00,0xe2,0x00,0x00,0x06,0x4a,0x05,0xd8,0x00,0x48,0x00,0x4e,
-0x00,0x52,0x00,0x68,0x00,0x7e,0x00,0x94,0x00,0xa9,0x00,0xbf,0x00,0xf5,0xb8,0x00,
-0xc0,0x2f,0xb8,0x00,0xc1,0x2f,0xb8,0x00,0xc0,0x10,0xb8,0x00,0x47,0xd0,0xb8,0x00,
-0x47,0x2f,0xb8,0x00,0x10,0xd0,0xb8,0x00,0x10,0x2f,0xb8,0x00,0xc1,0x10,0xb8,0x00,
-0x46,0xdc,0xba,0x00,0x0d,0x00,0x10,0x00,0x46,0x11,0x12,0x39,0xba,0x00,0x1b,0x00,
-0x10,0x00,0x46,0x11,0x12,0x39,0xba,0x00,0x29,0x00,0x10,0x00,0x46,0x11,0x12,0x39,
-0xba,0x00,0x37,0x00,0x10,0x00,0x46,0x11,0x12,0x39,0xb8,0x00,0x51,0xdc,0xb8,0x00,
-0x49,0xd0,0xba,0x00,0x4a,0x00,0x10,0x00,0x46,0x11,0x12,0x39,0xb8,0x00,0x47,0x10,
-0xb8,0x00,0x50,0xdc,0xb8,0x00,0x4d,0xd0,0xba,0x00,0x54,0x00,0x10,0x00,0x46,0x11,
-0x12,0x39,0xba,0x00,0x6a,0x00,0x10,0x00,0x46,0x11,0x12,0x39,0xba,0x00,0x7f,0x00,
-0x10,0x00,0x46,0x11,0x12,0x39,0xb8,0x00,0x46,0x10,0xb8,0x00,0x87,0xd0,0xb8,0x00,
-0x87,0x2f,0xba,0x00,0xaa,0x00,0x10,0x00,0x46,0x11,0x12,0x39,0x00,0xba,0x00,0x51,
-0x00,0x46,0x00,0x03,0x2b,0xb8,0x00,0x51,0x10,0xba,0x00,0x4e,0x00,0x4f,0x00,0x03,
-0x2b,0xb8,0x00,0x4e,0x10,0xba,0x00,0x3e,0x00,0x44,0x00,0x03,0x2b,0xb8,0x00,0x3e,
-0x10,0xb8,0x00,0x44,0x10,0xb8,0x00,0x00,0xd0,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x3e,
-0x10,0xb8,0x00,0x06,0xd0,0xb8,0x00,0x06,0x2f,0xb8,0x00,0x3e,0x10,0xb8,0x00,0x0e,
-0xd0,0xb8,0x00,0x0e,0x2f,0xb8,0x00,0x3e,0x10,0xb8,0x00,0x36,0xd0,0xb8,0x00,0x36,
-0x2f,0x30,0x31,0x01,0x26,0x27,0x34,0x3e,0x01,0x33,0x32,0x1e,0x01,0x15,0x06,0x07,
-0x13,0x03,0x22,0x27,0x34,0x3e,0x01,0x33,0x32,0x1e,0x01,0x15,0x06,0x07,0x1b,0x01,
-0x26,0x27,0x34,0x3e,0x01,0x33,0x32,0x1e,0x01,0x15,0x06,0x07,0x1b,0x01,0x26,0x35,
-0x34,0x3e,0x01,0x33,0x32,0x1e,0x01,0x15,0x06,0x07,0x03,0x01,0x26,0x35,0x34,0x3e,
-0x01,0x33,0x32,0x1e,0x01,0x15,0x06,0x23,0x03,0x11,0x21,0x11,0x01,0x35,0x07,0x21,
-0x27,0x1d,0x02,0x21,0x35,0x01,0x17,0x03,0x36,0x37,0x3e,0x01,0x35,0x34,0x2e,0x01,
-0x23,0x22,0x0e,0x01,0x15,0x14,0x1e,0x01,0x33,0x32,0x37,0x01,0x17,0x03,0x36,0x37,
-0x3e,0x01,0x35,0x34,0x2e,0x01,0x23,0x22,0x0e,0x01,0x15,0x14,0x1e,0x01,0x33,0x32,
-0x37,0x01,0x37,0x13,0x16,0x33,0x32,0x3e,0x01,0x35,0x34,0x2e,0x01,0x23,0x22,0x0e,
-0x01,0x15,0x14,0x16,0x17,0x16,0x17,0x01,0x33,0x03,0x32,0x37,0x3e,0x01,0x35,0x34,
-0x2e,0x01,0x23,0x22,0x0e,0x01,0x15,0x14,0x16,0x17,0x16,0x17,0x01,0x37,0x13,0x16,
-0x33,0x32,0x3e,0x01,0x35,0x34,0x2e,0x01,0x23,0x22,0x0e,0x01,0x15,0x14,0x16,0x17,
-0x16,0x17,0x01,0x4d,0x5f,0x0c,0x1d,0x36,0x1d,0x1c,0x36,0x1c,0x04,0x39,0xef,0x34,
-0x53,0x12,0x1d,0x35,0x1f,0x1c,0x35,0x1d,0x02,0x2e,0xbd,0x2b,0x43,0x02,0x1e,0x35,
-0x1b,0x1d,0x35,0x1e,0x03,0x43,0x26,0xb9,0x2e,0x1d,0x36,0x1b,0x1e,0x36,0x1d,0x0b,
-0x56,0x5c,0x01,0x01,0x2b,0x1d,0x35,0x1c,0x1e,0x35,0x1d,0x0d,0x63,0xa0,0xfc,0xa3,
-0x03,0x24,0xb5,0xfe,0x95,0xb7,0x02,0xd7,0xfc,0xff,0x4d,0xe7,0x07,0x07,0x12,0x14,
-0x14,0x23,0x14,0x12,0x23,0x15,0x14,0x24,0x12,0x07,0x09,0x01,0x36,0x88,0xbb,0x06,
-0x05,0x11,0x13,0x13,0x24,0x12,0x13,0x23,0x14,0x13,0x24,0x13,0x07,0x08,0x01,0xad,
-0x73,0x60,0x05,0x05,0x13,0x25,0x13,0x15,0x23,0x13,0x12,0x24,0x14,0x14,0x12,0x08,
-0x07,0xfe,0x9a,0x64,0x30,0x13,0x10,0x11,0x15,0x16,0x22,0x13,0x12,0x25,0x13,0x13,
-0x13,0x0e,0x0f,0x01,0x29,0x68,0xa6,0x0b,0x0b,0x13,0x23,0x14,0x15,0x22,0x13,0x14,
-0x23,0x13,0x13,0x12,0x04,0x03,0x03,0xfb,0x02,0x5f,0x1c,0x33,0x1c,0x1c,0x33,0x1c,
-0x40,0x16,0xfe,0x06,0x02,0xbe,0x5d,0x1c,0x32,0x1c,0x1c,0x32,0x1c,0x2d,0x22,0xfd,
-0x14,0x03,0x34,0x1e,0x30,0x1c,0x34,0x1a,0x1a,0x34,0x1c,0x36,0x18,0xfc,0xca,0x02,
-0xe4,0x2f,0x2a,0x1b,0x33,0x1c,0x1c,0x33,0x1b,0x55,0x10,0xfd,0x4a,0x02,0x03,0x22,
-0x2b,0x1c,0x33,0x1b,0x1b,0x33,0x1c,0x5e,0xfe,0x31,0xfd,0xd1,0x02,0x2f,0xfe,0xdf,
-0xe1,0x4b,0x3d,0xd3,0x30,0xa4,0xa4,0x01,0x54,0x2a,0x02,0x0e,0x03,0x04,0x0a,0x23,
-0x13,0x14,0x23,0x14,0x14,0x23,0x14,0x13,0x23,0x14,0x01,0xfd,0xf8,0x20,0x02,0xf9,
-0x02,0x03,0x0a,0x23,0x13,0x13,0x24,0x13,0x13,0x24,0x13,0x13,0x23,0x14,0x01,0xfd,
-0x13,0x1b,0x02,0xd1,0x01,0x14,0x23,0x13,0x13,0x24,0x13,0x13,0x24,0x13,0x13,0x23,
-0x0a,0x05,0x02,0xfd,0x0a,0x03,0x42,0x0a,0x0a,0x23,0x14,0x13,0x23,0x14,0x14,0x23,
-0x13,0x14,0x23,0x0a,0x08,0x02,0xfc,0xda,0x2a,0x01,0xea,0x03,0x15,0x22,0x14,0x13,
-0x24,0x13,0x13,0x24,0x13,0x14,0x22,0x0b,0x02,0x02,0x00,0x05,0x01,0x55,0xff,0xfe,
-0x05,0xd6,0x05,0xd6,0x00,0x1d,0x00,0x21,0x00,0x27,0x00,0x2d,0x00,0x32,0x01,0x67,
-0xba,0x00,0x28,0x00,0x10,0x00,0x03,0x2b,0xb8,0x00,0x28,0x10,0xba,0x00,0x01,0x00,
-0x00,0x00,0x03,0x2b,0xb8,0x00,0x01,0x10,0xba,0x00,0x06,0x00,0x03,0x00,0x03,0x2b,
-0xb8,0x00,0x06,0x10,0xba,0x00,0x2b,0x00,0x03,0x00,0x06,0x11,0x12,0x39,0xb8,0x00,
-0x2b,0x2f,0xb8,0x00,0x0c,0xdc,0xb8,0x00,0x07,0xd0,0xb8,0x00,0x03,0x10,0xb8,0x00,
-0x0a,0xdc,0xb8,0x00,0x06,0x10,0xb8,0x00,0x0d,0xd0,0xba,0x00,0x11,0x00,0x10,0x00,
-0x28,0x11,0x12,0x39,0xb8,0x00,0x11,0x2f,0xb8,0x00,0x28,0x10,0xb8,0x00,0x14,0xdc,
-0xb8,0x00,0x11,0x10,0xb8,0x00,0x17,0xd0,0xb8,0x00,0x10,0x10,0xb8,0x00,0x19,0xd0,
-0xb8,0x00,0x28,0x10,0xb8,0x00,0x1b,0xd0,0xb8,0x00,0x1b,0x2f,0xb8,0x00,0x32,0x10,
-0xb8,0x00,0x1c,0xd0,0xb8,0x00,0x1c,0x2f,0xb8,0x00,0x2b,0x10,0xb8,0x00,0x23,0xd0,
-0xb8,0x00,0x23,0x2f,0xb8,0x00,0x11,0x10,0xb8,0x00,0x2a,0xdc,0xb8,0x00,0x25,0xd0,
-0xb8,0x00,0x25,0x2f,0xb8,0x00,0x03,0x10,0xb8,0x00,0x2e,0xd0,0xb8,0x00,0x2e,0x2f,
-0xb8,0x00,0x28,0x10,0xb8,0x00,0x31,0xd0,0xb8,0x00,0x06,0x10,0xb8,0x00,0x34,0xdc,
-0x00,0xba,0x00,0x1e,0x00,0x0e,0x00,0x03,0x2b,0xb8,0x00,0x1e,0x10,0xba,0x00,0x2b,
-0x00,0x1f,0x00,0x03,0x2b,0xb8,0x00,0x2b,0x10,0xba,0x00,0x05,0x00,0x06,0x00,0x03,
-0x2b,0xb8,0x00,0x05,0x10,0xba,0x00,0x03,0x00,0x24,0x00,0x03,0x2b,0xb8,0x00,0x03,
-0x10,0xba,0x00,0x32,0x00,0x28,0x00,0x03,0x2b,0xb8,0x00,0x32,0x10,0xba,0x00,0x22,
-0x00,0x30,0x00,0x03,0x2b,0xb8,0x00,0x22,0x10,0xb8,0x00,0x05,0x10,0xb8,0x00,0x00,
-0xd0,0xb8,0x00,0x06,0x10,0xb8,0x00,0x02,0xd0,0xb8,0x00,0x02,0x2f,0xb8,0x00,0x2b,
-0x10,0xb8,0x00,0x0c,0xd0,0xb8,0x00,0x0c,0x2f,0xb8,0x00,0x2b,0x10,0xb8,0x00,0x10,
-0xd0,0xb8,0x00,0x10,0x2f,0xb8,0x00,0x06,0x10,0xb8,0x00,0x18,0xd0,0xb8,0x00,0x03,
-0x10,0xb8,0x00,0x19,0xd0,0xb8,0x00,0x19,0x2f,0xb8,0x00,0x05,0x10,0xb8,0x00,0x1a,
-0xd0,0xb8,0x00,0x06,0x10,0xb8,0x00,0x1c,0xd0,0xb8,0x00,0x1c,0x2f,0xb8,0x00,0x03,
-0x10,0xb8,0x00,0x1d,0xd0,0x30,0x31,0x01,0x21,0x15,0x33,0x35,0x21,0x15,0x23,0x15,
-0x07,0x11,0x17,0x15,0x33,0x15,0x21,0x35,0x33,0x35,0x37,0x33,0x11,0x23,0x27,0x35,
-0x23,0x35,0x21,0x15,0x33,0x01,0x35,0x21,0x15,0x01,0x37,0x35,0x21,0x15,0x17,0x11,
-0x07,0x15,0x21,0x35,0x27,0x35,0x11,0x37,0x21,0x11,0x03,0x08,0x01,0x15,0xab,0x01,
-0x0e,0x73,0x5c,0x5c,0x73,0xfb,0x7f,0x73,0x5d,0x01,0x01,0x5d,0x73,0x01,0x09,0xaa,
-0x02,0x97,0xfb,0xee,0x03,0x4a,0x52,0xfc,0xda,0x52,0x49,0x03,0x14,0x4a,0x01,0xfd,
-0x7e,0x05,0xd6,0x9b,0x9b,0xa2,0x90,0x96,0xfd,0xb7,0x95,0x8f,0xa3,0xa3,0x8f,0x98,
-0x02,0x45,0x97,0x90,0xa2,0x9b,0xfa,0xfb,0x37,0x37,0x03,0xea,0x83,0x5f,0x5f,0x83,
-0xfd,0x76,0x74,0x80,0x80,0x74,0x34,0x02,0x21,0x02,0xfd,0xdd,0x00,0x04,0x01,0xb6,
-0x00,0x00,0x05,0x76,0x05,0xd8,0x00,0x37,0x00,0x43,0x00,0x52,0x00,0x62,0x01,0x57,
-0xb8,0x00,0x63,0x2f,0xb8,0x00,0x64,0x2f,0xb8,0x00,0x63,0x10,0xb8,0x00,0x15,0xd0,
-0xb8,0x00,0x15,0x2f,0xb8,0x00,0x0f,0xd0,0xb8,0x00,0x0f,0x2f,0xb8,0x00,0x15,0x10,
-0xb8,0x00,0x53,0xdc,0x41,0x1b,0x00,0x16,0x00,0x53,0x00,0x26,0x00,0x53,0x00,0x36,
-0x00,0x53,0x00,0x46,0x00,0x53,0x00,0x56,0x00,0x53,0x00,0x66,0x00,0x53,0x00,0x76,
-0x00,0x53,0x00,0x86,0x00,0x53,0x00,0x96,0x00,0x53,0x00,0xa6,0x00,0x53,0x00,0xb6,
-0x00,0x53,0x00,0xc6,0x00,0x53,0x00,0xd6,0x00,0x53,0x00,0x0d,0x5d,0x41,0x05,0x00,
-0xe5,0x00,0x53,0x00,0xf5,0x00,0x53,0x00,0x02,0x5d,0xb8,0x00,0x11,0xd0,0xb8,0x00,
-0x11,0x2f,0xb8,0x00,0x64,0x10,0xb8,0x00,0x1d,0xdc,0xb8,0x00,0x5b,0xdc,0x41,0x05,
-0x00,0xea,0x00,0x5b,0x00,0xfa,0x00,0x5b,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,
-0x5b,0x00,0x29,0x00,0x5b,0x00,0x39,0x00,0x5b,0x00,0x49,0x00,0x5b,0x00,0x59,0x00,
-0x5b,0x00,0x69,0x00,0x5b,0x00,0x79,0x00,0x5b,0x00,0x89,0x00,0x5b,0x00,0x99,0x00,
-0x5b,0x00,0xa9,0x00,0x5b,0x00,0xb9,0x00,0x5b,0x00,0xc9,0x00,0x5b,0x00,0xd9,0x00,
-0x5b,0x00,0x0d,0x5d,0xb8,0x00,0x21,0xd0,0xb8,0x00,0x21,0x2f,0xb8,0x00,0x1d,0x10,
-0xb8,0x00,0x23,0xd0,0xb8,0x00,0x23,0x2f,0xb8,0x00,0x5b,0x10,0xb8,0x00,0x44,0xd0,
-0xb8,0x00,0x44,0x2f,0xb8,0x00,0x1d,0x10,0xb8,0x00,0x46,0xd0,0xb8,0x00,0x46,0x2f,
-0xb8,0x00,0x15,0x10,0xb8,0x00,0x4e,0xd0,0xb8,0x00,0x53,0x10,0xb8,0x00,0x50,0xd0,
-0xb8,0x00,0x50,0x2f,0x00,0xba,0x00,0x52,0x00,0x35,0x00,0x03,0x2b,0xb8,0x00,0x52,
-0x10,0xba,0x00,0x19,0x00,0x5f,0x00,0x03,0x2b,0xb8,0x00,0x19,0x10,0xba,0x00,0x57,
-0x00,0x3c,0x00,0x03,0x2b,0xb8,0x00,0x57,0x10,0xba,0x00,0x42,0x00,0x4a,0x00,0x03,
-0x2b,0xb8,0x00,0x42,0x10,0xba,0x00,0x11,0x00,0x3c,0x00,0x57,0x11,0x12,0x39,0xba,
-0x00,0x21,0x00,0x3c,0x00,0x57,0x11,0x12,0x39,0xb8,0x00,0x39,0xd0,0xb8,0x00,0x3c,
-0x10,0xb8,0x00,0x3f,0xd0,0x30,0x31,0x01,0x26,0x35,0x34,0x37,0x36,0x37,0x26,0x27,
-0x26,0x27,0x35,0x36,0x37,0x36,0x37,0x36,0x37,0x26,0x27,0x26,0x35,0x34,0x3e,0x01,
-0x33,0x32,0x1e,0x01,0x15,0x14,0x07,0x06,0x07,0x16,0x17,0x16,0x17,0x16,0x17,0x15,
-0x06,0x07,0x06,0x07,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x01,0x21,0x09,0x01,
-0x35,0x33,0x35,0x23,0x35,0x23,0x15,0x23,0x15,0x33,0x15,0x13,0x36,0x35,0x34,0x2e,
-0x01,0x23,0x22,0x0e,0x01,0x15,0x14,0x17,0x03,0x21,0x01,0x14,0x1e,0x01,0x33,0x32,
-0x3e,0x01,0x35,0x34,0x2e,0x01,0x23,0x22,0x0e,0x01,0x02,0xcb,0x1f,0x20,0x08,0x0b,
-0x3c,0x24,0x29,0x01,0x01,0x29,0x2b,0x4e,0x1c,0x1e,0x1a,0x11,0x16,0x2d,0x4e,0x2a,
-0x29,0x4e,0x2d,0x15,0x10,0x1a,0x1c,0x1d,0x4d,0x2c,0x2a,0x01,0x01,0x2a,0x25,0x3a,
-0x0b,0x08,0x1f,0x20,0x02,0x02,0x01,0x1a,0xfc,0x40,0x01,0x0f,0x01,0x0c,0xac,0xac,
-0x76,0xac,0xac,0xa2,0x3c,0x2d,0x4d,0x2a,0x2a,0x4d,0x2d,0x3f,0xde,0x02,0x8a,0xfe,
-0x4b,0x1d,0x35,0x1d,0x1d,0x36,0x1d,0x1e,0x36,0x1c,0x1d,0x34,0x1e,0x01,0x94,0x35,
-0x39,0x3c,0x35,0x11,0x0e,0x26,0x3f,0x48,0x50,0x04,0x50,0x49,0x4b,0x2a,0x0e,0x0a,
-0x12,0x1d,0x27,0x29,0x2b,0x4b,0x2a,0x2a,0x4b,0x2b,0x29,0x27,0x1d,0x13,0x09,0x0e,
-0x2a,0x4b,0x49,0x50,0x04,0x50,0x48,0x3e,0x26,0x0f,0x11,0x35,0x3c,0x3a,0x36,0x03,
-0x04,0xfe,0x75,0x01,0x94,0x01,0x4e,0x7c,0x6c,0x7c,0x7c,0x6c,0x7c,0xfe,0xb2,0x2d,
-0x49,0x2b,0x4e,0x29,0x29,0x4e,0x2b,0x40,0x36,0xfe,0xac,0x04,0xfc,0x1d,0x35,0x1c,
-0x1c,0x35,0x1d,0x1d,0x35,0x1b,0x1b,0x35,0x00,0x04,0x01,0x51,0x00,0x00,0x05,0xdb,
-0x05,0xd8,0x00,0x1e,0x00,0x2a,0x00,0x33,0x00,0x56,0x01,0x15,0xb8,0x00,0x57,0x2f,
-0xb8,0x00,0x58,0x2f,0xb8,0x00,0x07,0xdc,0xb8,0x00,0x57,0x10,0xb8,0x00,0x17,0xd0,
-0xb8,0x00,0x17,0x2f,0xba,0x00,0x0d,0x00,0x17,0x00,0x07,0x11,0x12,0x39,0xba,0x00,
-0x22,0x00,0x17,0x00,0x07,0x11,0x12,0x39,0xb8,0x00,0x3b,0xdc,0x41,0x1b,0x00,0x16,
-0x00,0x3b,0x00,0x26,0x00,0x3b,0x00,0x36,0x00,0x3b,0x00,0x46,0x00,0x3b,0x00,0x56,
-0x00,0x3b,0x00,0x66,0x00,0x3b,0x00,0x76,0x00,0x3b,0x00,0x86,0x00,0x3b,0x00,0x96,
-0x00,0x3b,0x00,0xa6,0x00,0x3b,0x00,0xb6,0x00,0x3b,0x00,0xc6,0x00,0x3b,0x00,0xd6,
-0x00,0x3b,0x00,0x0d,0x5d,0x41,0x05,0x00,0xe5,0x00,0x3b,0x00,0xf5,0x00,0x3b,0x00,
-0x02,0x5d,0xb8,0x00,0x2e,0xd0,0xb8,0x00,0x2e,0x2f,0xb8,0x00,0x17,0x10,0xb8,0x00,
-0x31,0xd0,0xb8,0x00,0x31,0x2f,0xba,0x00,0x40,0x00,0x17,0x00,0x07,0x11,0x12,0x39,
-0xba,0x00,0x41,0x00,0x17,0x00,0x07,0x11,0x12,0x39,0xba,0x00,0x45,0x00,0x17,0x00,
-0x07,0x11,0x12,0x39,0xb8,0x00,0x07,0x10,0xb8,0x00,0x4b,0xdc,0xba,0x00,0x50,0x00,
-0x17,0x00,0x07,0x11,0x12,0x39,0xba,0x00,0x53,0x00,0x17,0x00,0x07,0x11,0x12,0x39,
-0x00,0xb8,0x00,0x03,0x2f,0xb8,0x00,0x07,0x2f,0xba,0x00,0x0d,0x00,0x07,0x00,0x03,
-0x11,0x12,0x39,0xba,0x00,0x22,0x00,0x07,0x00,0x03,0x11,0x12,0x39,0xba,0x00,0x40,
-0x00,0x07,0x00,0x03,0x11,0x12,0x39,0xba,0x00,0x41,0x00,0x07,0x00,0x03,0x11,0x12,
-0x39,0xba,0x00,0x45,0x00,0x07,0x00,0x03,0x11,0x12,0x39,0xba,0x00,0x50,0x00,0x07,
-0x00,0x03,0x11,0x12,0x39,0xba,0x00,0x53,0x00,0x07,0x00,0x03,0x11,0x12,0x39,0x30,
-0x31,0x01,0x36,0x26,0x37,0x16,0x07,0x00,0x13,0x21,0x26,0x35,0x34,0x00,0x27,0x06,
-0x07,0x06,0x07,0x27,0x07,0x26,0x27,0x12,0x27,0x36,0x37,0x2e,0x01,0x37,0x16,0x17,
-0x03,0x36,0x3b,0x01,0x06,0x15,0x14,0x2b,0x01,0x22,0x27,0x35,0x03,0x17,0x14,0x07,
-0x23,0x22,0x3d,0x01,0x36,0x13,0x26,0x27,0x06,0x16,0x07,0x06,0x07,0x16,0x07,0x16,
-0x17,0x37,0x07,0x36,0x37,0x36,0x37,0x16,0x00,0x17,0x14,0x17,0x25,0x02,0x01,0x32,
-0x35,0x23,0x36,0x26,0x27,0x06,0x16,0x07,0x03,0x1e,0x0d,0x33,0x5a,0x9a,0x28,0x01,
-0xea,0x2d,0xfc,0x36,0x0d,0x01,0x93,0x09,0x5a,0x38,0x2e,0x9e,0x09,0x2c,0x8b,0x1f,
-0x5a,0x0e,0x30,0x48,0x15,0x0c,0x26,0x68,0x36,0xa2,0x25,0x60,0x06,0x2b,0x45,0x15,
-0x08,0x04,0x06,0x07,0x48,0x0a,0x1c,0x29,0xd8,0x23,0x4d,0x2b,0x3d,0x19,0x3b,0x2c,
-0x14,0x5a,0x19,0x67,0x61,0x23,0x87,0x1d,0x69,0x52,0x36,0xfe,0x55,0x02,0x0c,0x03,
-0x6b,0x27,0xfe,0x12,0x01,0x04,0x27,0x15,0x4d,0x2e,0x2b,0x12,0x04,0xe8,0x18,0x60,
-0x78,0x83,0x81,0xfe,0xbd,0xfc,0x6f,0x38,0x3a,0xa0,0x01,0x2e,0x40,0x73,0x03,0x8e,
-0x12,0x16,0x1e,0x2e,0x50,0x01,0x20,0xd3,0x6d,0x7a,0x20,0x22,0x7f,0x1b,0x78,0xfe,
-0xeb,0x3f,0x2e,0x23,0x31,0x1e,0x0f,0xfe,0x70,0x23,0x34,0x0f,0x1e,0x17,0x31,0x02,
-0xa7,0x60,0x26,0x6a,0x44,0x22,0x61,0x63,0xf2,0xeb,0x4c,0x18,0x48,0x4a,0x0a,0x90,
-0x04,0xad,0x95,0xfe,0xcc,0x7e,0x34,0x34,0x01,0x03,0x37,0x01,0x7c,0x01,0x0d,0x83,
-0x4a,0x6c,0x4c,0x22,0x00,0x04,0x01,0x30,0xff,0xff,0x05,0xfb,0x05,0xd7,0x00,0x0f,
-0x00,0x1f,0x00,0x54,0x00,0x5f,0x01,0x01,0xba,0x00,0x00,0x00,0x2f,0x00,0x03,0x2b,
-0xba,0x00,0x40,0x00,0x38,0x00,0x03,0x2b,0xb8,0x00,0x40,0x10,0x41,0x1b,0x00,0x16,
-0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x56,
-0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x86,0x00,0x00,0x00,0x96,
-0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0xd6,
-0x00,0x00,0x00,0x0d,0x5d,0x41,0x05,0x00,0xe5,0x00,0x00,0x00,0xf5,0x00,0x00,0x00,
-0x02,0x5d,0xba,0x00,0x2b,0x00,0x2f,0x00,0x00,0x11,0x12,0x39,0x41,0x1b,0x00,0x16,
-0x00,0x40,0x00,0x26,0x00,0x40,0x00,0x36,0x00,0x40,0x00,0x46,0x00,0x40,0x00,0x56,
-0x00,0x40,0x00,0x66,0x00,0x40,0x00,0x76,0x00,0x40,0x00,0x86,0x00,0x40,0x00,0x96,
-0x00,0x40,0x00,0xa6,0x00,0x40,0x00,0xb6,0x00,0x40,0x00,0xc6,0x00,0x40,0x00,0xd6,
-0x00,0x40,0x00,0x0d,0x5d,0x41,0x05,0x00,0xe5,0x00,0x40,0x00,0xf5,0x00,0x40,0x00,
-0x02,0x5d,0xba,0x00,0x34,0x00,0x38,0x00,0x40,0x11,0x12,0x39,0xba,0x00,0x44,0x00,
-0x38,0x00,0x40,0x11,0x12,0x39,0x00,0xba,0x00,0x55,0x00,0x21,0x00,0x03,0x2b,0xb8,
-0x00,0x55,0x10,0xba,0x00,0x04,0x00,0x5a,0x00,0x03,0x2b,0xb8,0x00,0x04,0x10,0xb8,
-0x00,0x21,0x10,0xb8,0x00,0x23,0xd0,0xb8,0x00,0x23,0x2f,0xba,0x00,0x2b,0x00,0x5a,
-0x00,0x04,0x11,0x12,0x39,0xba,0x00,0x4d,0x00,0x5a,0x00,0x04,0x11,0x12,0x39,0xb8,
-0x00,0x21,0x10,0xb8,0x00,0x54,0xd0,0x30,0x31,0x01,0x14,0x1e,0x01,0x33,0x32,0x3e,
-0x01,0x35,0x34,0x2e,0x01,0x23,0x22,0x0e,0x01,0x13,0x14,0x1e,0x01,0x33,0x32,0x3e,
-0x01,0x35,0x34,0x2e,0x01,0x23,0x22,0x0e,0x01,0x01,0x15,0x21,0x35,0x07,0x26,0x35,
-0x34,0x12,0x37,0x36,0x37,0x26,0x27,0x26,0x35,0x34,0x36,0x37,0x36,0x37,0x26,0x27,
-0x26,0x35,0x34,0x3e,0x01,0x33,0x32,0x1e,0x01,0x15,0x14,0x07,0x06,0x07,0x16,0x17,
-0x1e,0x01,0x15,0x14,0x07,0x06,0x07,0x16,0x17,0x16,0x12,0x15,0x14,0x07,0x27,0x26,
-0x27,0x2e,0x01,0x23,0x22,0x06,0x07,0x06,0x07,0x02,0xbf,0x3a,0x65,0x37,0x39,0x65,
-0x38,0x39,0x66,0x37,0x36,0x65,0x3b,0x9b,0x10,0x1c,0x0f,0x10,0x1c,0x10,0x10,0x1d,
-0x0f,0x0e,0x1d,0x10,0x02,0x5b,0xfb,0xd9,0x53,0x0b,0xa5,0x92,0x26,0x28,0x1e,0x15,
-0x2a,0x55,0x4d,0x1b,0x1d,0x1a,0x0f,0x17,0x2c,0x4e,0x29,0x28,0x4e,0x2d,0x15,0x11,
-0x19,0x1b,0x1e,0x4b,0x56,0x29,0x16,0x1e,0x26,0x26,0x93,0xa6,0x0c,0x5c,0x04,0x40,
-0x45,0xf5,0x80,0x81,0xf5,0x43,0x41,0x04,0x03,0x89,0x38,0x64,0x38,0x38,0x64,0x38,
-0x38,0x67,0x36,0x36,0x67,0x01,0x75,0x10,0x1b,0x0f,0x0f,0x1b,0x10,0x0f,0x1c,0x10,
-0x10,0x1c,0xfa,0xbb,0x01,0x01,0x01,0x39,0x3a,0xa0,0x01,0x25,0x4e,0x15,0x0f,0x1d,
-0x26,0x4b,0x52,0x53,0x97,0x2a,0x0e,0x0a,0x13,0x1d,0x27,0x2a,0x2a,0x4d,0x2a,0x2a,
-0x4d,0x2a,0x2a,0x27,0x1d,0x14,0x09,0x0e,0x2a,0x97,0x53,0x52,0x4b,0x26,0x1d,0x10,
-0x14,0x4e,0xfe,0xdb,0xa0,0x3a,0x39,0x84,0x7d,0x71,0x79,0x83,0x83,0x79,0x71,0x7d,
-0x00,0x08,0x00,0xc9,0x00,0x00,0x06,0x63,0x05,0xd8,0x00,0x10,0x00,0x21,0x00,0x25,
-0x00,0x55,0x00,0x65,0x00,0x69,0x00,0x7a,0x00,0x8b,0x01,0x5f,0xba,0x00,0x0a,0x00,
-0x2c,0x00,0x03,0x2b,0xb8,0x00,0x0a,0x10,0xba,0x00,0x23,0x00,0x26,0x00,0x03,0x2b,
-0xb8,0x00,0x23,0x10,0xba,0x00,0x21,0x00,0x00,0x00,0x03,0x2b,0xb8,0x00,0x21,0x10,
-0xba,0x00,0x55,0x00,0x24,0x00,0x03,0x2b,0xb8,0x00,0x55,0x10,0xba,0x00,0x4f,0x00,
-0x17,0x00,0x03,0x2b,0xb8,0x00,0x4f,0x10,0x41,0x1b,0x00,0x16,0x00,0x0a,0x00,0x26,
-0x00,0x0a,0x00,0x36,0x00,0x0a,0x00,0x46,0x00,0x0a,0x00,0x56,0x00,0x0a,0x00,0x66,
-0x00,0x0a,0x00,0x76,0x00,0x0a,0x00,0x86,0x00,0x0a,0x00,0x96,0x00,0x0a,0x00,0xa6,
-0x00,0x0a,0x00,0xb6,0x00,0x0a,0x00,0xc6,0x00,0x0a,0x00,0xd6,0x00,0x0a,0x00,0x0d,
-0x5d,0x41,0x05,0x00,0xe5,0x00,0x0a,0x00,0xf5,0x00,0x0a,0x00,0x02,0x5d,0x41,0x05,
-0x00,0xea,0x00,0x17,0x00,0xfa,0x00,0x17,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,
-0x17,0x00,0x29,0x00,0x17,0x00,0x39,0x00,0x17,0x00,0x49,0x00,0x17,0x00,0x59,0x00,
-0x17,0x00,0x69,0x00,0x17,0x00,0x79,0x00,0x17,0x00,0x89,0x00,0x17,0x00,0x99,0x00,
-0x17,0x00,0xa9,0x00,0x17,0x00,0xb9,0x00,0x17,0x00,0xc9,0x00,0x17,0x00,0xd9,0x00,
-0x17,0x00,0x0d,0x5d,0xba,0x00,0x33,0x00,0x2c,0x00,0x4f,0x11,0x12,0x39,0xba,0x00,
-0x49,0x00,0x2c,0x00,0x4f,0x11,0x12,0x39,0xb8,0x00,0x8d,0xdc,0x00,0xb8,0x00,0x3d,
-0x2f,0xba,0x00,0x23,0x00,0x26,0x00,0x03,0x2b,0xb8,0x00,0x23,0x10,0xba,0x00,0x66,
-0x00,0x67,0x00,0x03,0x2b,0xb8,0x00,0x66,0x10,0xba,0x00,0x3c,0x00,0x39,0x00,0x03,
-0x2b,0xb8,0x00,0x3c,0x10,0xba,0x00,0x0f,0x00,0x22,0x00,0x03,0x2b,0xb8,0x00,0x0f,
-0x10,0xba,0x00,0x30,0x00,0x06,0x00,0x03,0x2b,0xb8,0x00,0x30,0x10,0xb8,0x00,0x0f,
-0x10,0xb8,0x00,0x11,0xd0,0xb8,0x00,0x06,0x10,0xb8,0x00,0x1b,0xd0,0xba,0x00,0x33,
-0x00,0x06,0x00,0x30,0x11,0x12,0x39,0xb8,0x00,0x3c,0x10,0xb8,0x00,0x3f,0xd0,0xb8,
-0x00,0x39,0x10,0xb8,0x00,0x41,0xd0,0xba,0x00,0x49,0x00,0x06,0x00,0x30,0x11,0x12,
-0x39,0xb8,0x00,0x30,0x10,0xb8,0x00,0x4b,0xd0,0x30,0x31,0x01,0x36,0x37,0x26,0x27,
-0x26,0x23,0x22,0x0e,0x01,0x15,0x14,0x16,0x17,0x16,0x17,0x21,0x33,0x21,0x36,0x37,
-0x3e,0x01,0x35,0x34,0x2e,0x01,0x23,0x22,0x07,0x06,0x07,0x16,0x17,0x01,0x11,0x21,
-0x11,0x01,0x11,0x26,0x27,0x2e,0x01,0x35,0x34,0x3e,0x01,0x33,0x32,0x17,0x35,0x34,
-0x36,0x37,0x36,0x37,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x16,
-0x17,0x1e,0x01,0x1d,0x01,0x36,0x33,0x32,0x1e,0x01,0x15,0x14,0x06,0x07,0x06,0x07,
-0x11,0x01,0x14,0x1e,0x01,0x33,0x32,0x3e,0x01,0x35,0x34,0x2e,0x01,0x23,0x22,0x0e,
-0x01,0x01,0x15,0x21,0x35,0x37,0x21,0x26,0x27,0x2e,0x01,0x35,0x34,0x3e,0x01,0x33,
-0x32,0x17,0x16,0x17,0x06,0x15,0x33,0x34,0x27,0x36,0x37,0x36,0x33,0x32,0x1e,0x01,
-0x15,0x14,0x06,0x07,0x06,0x07,0x21,0x03,0x50,0x01,0x02,0x23,0x33,0x4a,0x4e,0x4e,
-0x93,0x54,0x52,0x4a,0x16,0x17,0x01,0x57,0x8d,0x01,0x56,0x18,0x16,0x4a,0x51,0x53,
-0x93,0x4f,0x4d,0x4a,0x34,0x22,0x02,0x01,0xfe,0x3f,0x02,0xf5,0xfc,0xb9,0x2a,0x26,
-0x45,0x6c,0x6e,0xc6,0x68,0x50,0x4c,0x24,0x20,0x0d,0x10,0x6c,0x6c,0x69,0x6c,0x6c,
-0x10,0x0d,0x1f,0x25,0x4c,0x4f,0x68,0xc6,0x6e,0x6c,0x44,0x27,0x29,0xfd,0xd6,0x19,
-0x2d,0x17,0x18,0x2d,0x18,0x18,0x2d,0x18,0x17,0x2d,0x19,0x01,0xa4,0xfd,0x73,0xce,
-0xfe,0xe8,0x12,0x11,0x3d,0x42,0x44,0x77,0x40,0x3e,0x3d,0x29,0x1d,0x02,0xf1,0x02,
-0x1d,0x29,0x3d,0x3d,0x41,0x77,0x44,0x42,0x3d,0x12,0x12,0xfe,0xe9,0x03,0xc7,0x03,
-0x03,0x2b,0x1c,0x29,0x51,0x95,0x50,0x51,0x92,0x28,0x0e,0x08,0x08,0x0e,0x28,0x92,
-0x51,0x50,0x95,0x51,0x29,0x1c,0x2b,0x03,0x03,0xfd,0xb8,0xfe,0xd1,0x01,0x2f,0xfe,
-0x81,0x01,0x7f,0x0d,0x16,0x36,0xc4,0x6b,0x6c,0xc5,0x6a,0x1f,0x02,0x24,0x3f,0x12,
-0x07,0x04,0x36,0x46,0x57,0x57,0x46,0x36,0x04,0x07,0x12,0x3f,0x24,0x02,0x1f,0x6a,
-0xc5,0x6c,0x6b,0xc4,0x36,0x16,0x0d,0xfe,0x81,0x04,0x7d,0x19,0x2b,0x19,0x19,0x2b,
-0x19,0x18,0x2d,0x17,0x17,0x2d,0xfc,0xb6,0xc8,0xc8,0xce,0x07,0x0c,0x21,0x79,0x43,
-0x42,0x7b,0x43,0x21,0x17,0x24,0x03,0x02,0x02,0x03,0x24,0x17,0x21,0x43,0x7b,0x42,
-0x43,0x79,0x21,0x0c,0x07,0x00,0x00,0x03,0x00,0xe2,0x00,0x00,0x06,0x4a,0x05,0xd8,
-0x00,0x48,0x00,0x4c,0x00,0x50,0x00,0xb7,0xb8,0x00,0x51,0x2f,0xb8,0x00,0x52,0x2f,
-0xb8,0x00,0x51,0x10,0xb8,0x00,0x47,0xd0,0xb8,0x00,0x47,0x2f,0xb8,0x00,0x10,0xd0,
-0xb8,0x00,0x10,0x2f,0xb8,0x00,0x52,0x10,0xb8,0x00,0x45,0xdc,0xba,0x00,0x0d,0x00,
-0x10,0x00,0x45,0x11,0x12,0x39,0xba,0x00,0x1b,0x00,0x10,0x00,0x45,0x11,0x12,0x39,
-0xba,0x00,0x29,0x00,0x10,0x00,0x45,0x11,0x12,0x39,0xba,0x00,0x37,0x00,0x10,0x00,
-0x45,0x11,0x12,0x39,0xb8,0x00,0x4a,0xdc,0xb8,0x00,0x47,0x10,0xb8,0x00,0x50,0xdc,
-0xb8,0x00,0x4b,0xd0,0xb8,0x00,0x4a,0x10,0xb8,0x00,0x4d,0xd0,0x00,0xba,0x00,0x4d,
-0x00,0x46,0x00,0x03,0x2b,0xba,0x00,0x49,0x00,0x4e,0x00,0x03,0x2b,0xb8,0x00,0x49,
-0x10,0xba,0x00,0x3e,0x00,0x44,0x00,0x03,0x2b,0xb8,0x00,0x3e,0x10,0xb8,0x00,0x44,
-0x10,0xb8,0x00,0x00,0xd0,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x3e,0x10,0xb8,0x00,0x06,
-0xd0,0xb8,0x00,0x06,0x2f,0xb8,0x00,0x3e,0x10,0xb8,0x00,0x0e,0xd0,0xb8,0x00,0x0e,
-0x2f,0xb8,0x00,0x3e,0x10,0xb8,0x00,0x36,0xd0,0xb8,0x00,0x36,0x2f,0x30,0x31,0x01,
-0x26,0x27,0x34,0x3e,0x01,0x33,0x32,0x1e,0x01,0x15,0x06,0x07,0x13,0x03,0x22,0x27,
-0x34,0x3e,0x01,0x33,0x32,0x1e,0x01,0x15,0x06,0x07,0x1b,0x01,0x26,0x27,0x34,0x3e,
-0x01,0x33,0x32,0x1e,0x01,0x15,0x06,0x07,0x1b,0x01,0x26,0x35,0x34,0x3e,0x01,0x33,
-0x32,0x1e,0x01,0x15,0x06,0x07,0x03,0x01,0x26,0x35,0x34,0x3e,0x01,0x33,0x32,0x1e,
-0x01,0x15,0x06,0x23,0x03,0x11,0x21,0x11,0x05,0x35,0x21,0x15,0x01,0x35,0x21,0x15,
-0x01,0x4d,0x5f,0x0c,0x1d,0x36,0x1d,0x1c,0x36,0x1c,0x04,0x39,0xef,0x34,0x53,0x12,
-0x1d,0x35,0x1f,0x1c,0x35,0x1d,0x02,0x2e,0xbd,0x2b,0x43,0x02,0x1e,0x35,0x1b,0x1d,
-0x35,0x1e,0x03,0x43,0x26,0xb9,0x2e,0x1d,0x36,0x1b,0x1e,0x36,0x1d,0x0b,0x56,0x5c,
-0x01,0x01,0x2b,0x1d,0x35,0x1c,0x1e,0x35,0x1d,0x0d,0x63,0xa0,0xfc,0xa3,0x03,0x24,
-0xfd,0x29,0x02,0xd7,0xfd,0x29,0x03,0xfb,0x02,0x5f,0x1c,0x33,0x1c,0x1c,0x33,0x1c,
-0x40,0x16,0xfe,0x06,0x02,0xbe,0x5d,0x1c,0x32,0x1c,0x1c,0x32,0x1c,0x2d,0x22,0xfd,
-0x14,0x03,0x34,0x1e,0x30,0x1c,0x34,0x1a,0x1a,0x34,0x1c,0x36,0x18,0xfc,0xca,0x02,
-0xe4,0x2f,0x2a,0x1b,0x33,0x1c,0x1c,0x33,0x1b,0x55,0x10,0xfd,0x4a,0x02,0x03,0x22,
-0x2b,0x1c,0x33,0x1b,0x1b,0x33,0x1c,0x5e,0xfe,0x31,0xfd,0xd1,0x02,0x2f,0xcb,0x4e,
-0x4e,0xfe,0xd6,0x4f,0x4f,0x00,0x00,0x04,0x01,0x55,0xff,0xfe,0x05,0xd6,0x05,0xd6,
-0x00,0x03,0x00,0x07,0x00,0x25,0x00,0x29,0x00,0xe3,0xba,0x00,0x24,0x00,0x21,0x00,
-0x03,0x2b,0xb8,0x00,0x24,0x10,0xba,0x00,0x09,0x00,0x08,0x00,0x03,0x2b,0xb8,0x00,
-0x09,0x10,0xba,0x00,0x0e,0x00,0x0b,0x00,0x03,0x2b,0xb8,0x00,0x0e,0x10,0xb8,0x00,
-0x0b,0x10,0xb8,0x00,0x00,0xd0,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x24,0x10,0xb8,0x00,
-0x02,0xd0,0xb8,0x00,0x02,0x2f,0xb8,0x00,0x0e,0x10,0xb8,0x00,0x15,0xd0,0xb8,0x00,
-0x21,0x10,0xb8,0x00,0x17,0xd0,0xb8,0x00,0x24,0x10,0xb8,0x00,0x20,0xdc,0xb8,0x00,
-0x19,0xd0,0xb8,0x00,0x0e,0x10,0xb8,0x00,0x2b,0xdc,0x00,0xba,0x00,0x26,0x00,0x16,
-0x00,0x03,0x2b,0xb8,0x00,0x26,0x10,0xba,0x00,0x04,0x00,0x27,0x00,0x03,0x2b,0xb8,
-0x00,0x04,0x10,0xba,0x00,0x0d,0x00,0x0e,0x00,0x03,0x2b,0xb8,0x00,0x0d,0x10,0xba,
-0x00,0x0b,0x00,0x01,0x00,0x03,0x2b,0xb8,0x00,0x0b,0x10,0xb8,0x00,0x0d,0x10,0xb8,
-0x00,0x08,0xd0,0xb8,0x00,0x0e,0x10,0xb8,0x00,0x0a,0xd0,0xb8,0x00,0x0a,0x2f,0xb8,
-0x00,0x27,0x10,0xb8,0x00,0x15,0xdc,0xb8,0x00,0x18,0xd0,0xb8,0x00,0x0e,0x10,0xb8,
-0x00,0x20,0xd0,0xb8,0x00,0x0b,0x10,0xb8,0x00,0x21,0xd0,0xb8,0x00,0x21,0x2f,0xb8,
-0x00,0x0d,0x10,0xb8,0x00,0x22,0xd0,0xb8,0x00,0x0e,0x10,0xb8,0x00,0x24,0xd0,0xb8,
-0x00,0x24,0x2f,0xb8,0x00,0x0b,0x10,0xb8,0x00,0x25,0xd0,0x30,0x31,0x01,0x35,0x21,
-0x15,0x01,0x35,0x21,0x15,0x13,0x21,0x15,0x33,0x35,0x21,0x15,0x23,0x15,0x07,0x11,
-0x17,0x15,0x33,0x15,0x21,0x35,0x33,0x35,0x37,0x33,0x11,0x23,0x27,0x35,0x23,0x35,
-0x21,0x15,0x33,0x01,0x35,0x21,0x15,0x04,0xd6,0xfd,0x80,0x02,0xca,0xfc,0xec,0xfc,
-0x01,0x15,0xab,0x01,0x0e,0x73,0x5c,0x5c,0x73,0xfb,0x7f,0x73,0x5d,0x01,0x01,0x5d,
-0x73,0x01,0x09,0xaa,0x02,0x97,0xfb,0xee,0x04,0x84,0x5e,0x5e,0xfc,0x2f,0x6f,0x6f,
-0x05,0x23,0x9b,0x9b,0xa2,0x90,0x96,0xfd,0xb7,0x95,0x8f,0xa3,0xa3,0x8f,0x98,0x02,
-0x45,0x97,0x90,0xa2,0x9b,0xfa,0xfb,0x37,0x37,0x00,0x00,0x02,0x01,0xb6,0x00,0x00,
-0x05,0x76,0x05,0xd8,0x00,0x34,0x00,0x40,0x00,0x6d,0xba,0x00,0x1b,0x00,0x13,0x00,
-0x03,0x2b,0xb8,0x00,0x1b,0x10,0x41,0x1b,0x00,0x16,0x00,0x1b,0x00,0x26,0x00,0x1b,
-0x00,0x36,0x00,0x1b,0x00,0x46,0x00,0x1b,0x00,0x56,0x00,0x1b,0x00,0x66,0x00,0x1b,
-0x00,0x76,0x00,0x1b,0x00,0x86,0x00,0x1b,0x00,0x96,0x00,0x1b,0x00,0xa6,0x00,0x1b,
-0x00,0xb6,0x00,0x1b,0x00,0xc6,0x00,0x1b,0x00,0xd6,0x00,0x1b,0x00,0x0d,0x5d,0x41,
-0x05,0x00,0xe5,0x00,0x1b,0x00,0xf5,0x00,0x1b,0x00,0x02,0x5d,0xba,0x00,0x0f,0x00,
-0x13,0x00,0x1b,0x11,0x12,0x39,0xba,0x00,0x1f,0x00,0x13,0x00,0x1b,0x11,0x12,0x39,
-0x00,0xb8,0x00,0x31,0x2f,0x30,0x31,0x01,0x34,0x37,0x36,0x37,0x26,0x27,0x26,0x27,
-0x35,0x36,0x37,0x36,0x37,0x36,0x37,0x26,0x27,0x26,0x35,0x34,0x3e,0x01,0x33,0x32,
-0x1e,0x01,0x15,0x14,0x07,0x06,0x07,0x16,0x17,0x16,0x17,0x16,0x17,0x15,0x06,0x07,
-0x06,0x07,0x16,0x17,0x16,0x15,0x14,0x07,0x01,0x21,0x01,0x26,0x01,0x35,0x33,0x35,
-0x23,0x35,0x23,0x15,0x23,0x15,0x33,0x15,0x02,0xac,0x20,0x08,0x0b,0x3c,0x24,0x29,
-0x01,0x01,0x29,0x2b,0x4e,0x1c,0x1e,0x1a,0x11,0x16,0x2d,0x4e,0x2a,0x29,0x4e,0x2d,
-0x15,0x10,0x1a,0x1c,0x1d,0x4d,0x2c,0x2a,0x01,0x01,0x2a,0x25,0x3a,0x0b,0x08,0x1f,
-0x20,0x01,0x16,0xfc,0x40,0x01,0x0f,0x19,0x01,0x25,0xac,0xac,0x76,0xac,0xac,0x02,
-0x02,0x3c,0x35,0x11,0x0e,0x26,0x3f,0x48,0x50,0x04,0x50,0x49,0x4b,0x2a,0x0e,0x0a,
-0x12,0x1d,0x27,0x29,0x2b,0x4b,0x2a,0x2a,0x4b,0x2b,0x29,0x27,0x1d,0x13,0x09,0x0e,
-0x2a,0x4b,0x49,0x50,0x04,0x50,0x48,0x3e,0x26,0x0f,0x11,0x35,0x3c,0x3a,0x36,0xfe,
-0x6e,0x01,0x94,0x35,0x01,0x19,0x7c,0x6c,0x7c,0x7c,0x6c,0x7c,0x00,0x04,0x01,0x4c,
-0x00,0x00,0x05,0xe0,0x05,0xd8,0x00,0x22,0x00,0x2e,0x00,0x37,0x00,0x3d,0x00,0x57,
-0xba,0x00,0x0b,0x00,0x3c,0x00,0x03,0x2b,0xb8,0x00,0x0b,0x10,0xb8,0x00,0x3f,0xdc,
-0x00,0xb8,0x00,0x03,0x2f,0xb8,0x00,0x0b,0x2f,0xba,0x00,0x09,0x00,0x0b,0x00,0x03,
-0x11,0x12,0x39,0xba,0x00,0x11,0x00,0x0b,0x00,0x03,0x11,0x12,0x39,0xba,0x00,0x15,
-0x00,0x0b,0x00,0x03,0x11,0x12,0x39,0xba,0x00,0x16,0x00,0x0b,0x00,0x03,0x11,0x12,
-0x39,0xba,0x00,0x2c,0x00,0x0b,0x00,0x03,0x11,0x12,0x39,0xba,0x00,0x38,0x00,0x0b,
-0x00,0x03,0x11,0x12,0x39,0x30,0x31,0x01,0x36,0x26,0x37,0x1e,0x01,0x07,0x33,0x14,
-0x23,0x00,0x13,0x21,0x26,0x35,0x34,0x00,0x27,0x06,0x27,0x06,0x27,0x37,0x07,0x26,
-0x27,0x12,0x27,0x36,0x37,0x36,0x26,0x37,0x16,0x17,0x07,0x15,0x16,0x3b,0x01,0x32,
-0x35,0x34,0x37,0x23,0x22,0x07,0x03,0x15,0x14,0x3b,0x01,0x36,0x35,0x27,0x22,0x01,
-0x17,0x00,0x13,0x33,0x02,0x03,0x16,0x3d,0x51,0x55,0x55,0x18,0x2b,0x04,0x02,0x02,
-0x18,0x2d,0xfc,0x36,0x0d,0x01,0xa2,0x0e,0x45,0x7c,0x5d,0x6b,0x30,0x6b,0x72,0x1b,
-0x64,0x0e,0x30,0x63,0x0b,0x47,0x26,0x68,0x38,0xaa,0x04,0x08,0x15,0x45,0x2b,0x06,
-0x60,0x25,0x73,0x1c,0x0a,0x48,0x07,0x3e,0x01,0xc9,0x34,0x01,0x77,0x06,0x4d,0x2d,
-0x04,0xe6,0x27,0x9f,0x2c,0x51,0x92,0x0f,0x01,0xfe,0xac,0xfc,0x6f,0x38,0x3a,0xa0,
-0x01,0x24,0x77,0xae,0x07,0x97,0x05,0x68,0x50,0x1c,0x53,0x01,0x05,0xd3,0x6d,0x68,
-0x2a,0x2a,0x7f,0x1b,0x7a,0xff,0x10,0x1e,0x31,0x22,0x30,0x40,0xfe,0x29,0x18,0x1d,
-0x0f,0x35,0x22,0x02,0x40,0x59,0xfe,0xf3,0xfd,0x04,0x03,0x52,0x00,0x01,0x01,0x30,
-0xff,0xff,0x05,0xfb,0x05,0xd7,0x00,0x30,0x00,0x6d,0xba,0x00,0x1c,0x00,0x14,0x00,
-0x03,0x2b,0xb8,0x00,0x1c,0x10,0x41,0x1b,0x00,0x16,0x00,0x1c,0x00,0x26,0x00,0x1c,
-0x00,0x36,0x00,0x1c,0x00,0x46,0x00,0x1c,0x00,0x56,0x00,0x1c,0x00,0x66,0x00,0x1c,
-0x00,0x76,0x00,0x1c,0x00,0x86,0x00,0x1c,0x00,0x96,0x00,0x1c,0x00,0xa6,0x00,0x1c,
-0x00,0xb6,0x00,0x1c,0x00,0xc6,0x00,0x1c,0x00,0xd6,0x00,0x1c,0x00,0x0d,0x5d,0x41,
-0x05,0x00,0xe5,0x00,0x1c,0x00,0xf5,0x00,0x1c,0x00,0x02,0x5d,0xba,0x00,0x10,0x00,
-0x14,0x00,0x1c,0x11,0x12,0x39,0xba,0x00,0x20,0x00,0x14,0x00,0x1c,0x11,0x12,0x39,
-0x00,0xb8,0x00,0x00,0x2f,0x30,0x31,0x05,0x26,0x35,0x34,0x12,0x37,0x36,0x37,0x26,
-0x27,0x26,0x35,0x34,0x36,0x37,0x36,0x37,0x26,0x27,0x26,0x35,0x34,0x3e,0x01,0x33,
-0x32,0x1e,0x01,0x15,0x14,0x07,0x06,0x07,0x16,0x17,0x1e,0x01,0x15,0x14,0x07,0x06,
-0x07,0x16,0x17,0x16,0x12,0x15,0x14,0x07,0x01,0x3b,0x0b,0xa5,0x92,0x26,0x28,0x1e,
-0x15,0x2a,0x55,0x4d,0x1b,0x1d,0x1a,0x0f,0x17,0x2c,0x4e,0x29,0x28,0x4e,0x2d,0x15,
-0x11,0x19,0x1b,0x1e,0x4b,0x56,0x29,0x16,0x1e,0x26,0x26,0x93,0xa6,0x0c,0x01,0x39,
-0x3a,0xa0,0x01,0x25,0x4e,0x15,0x0f,0x1d,0x26,0x4b,0x52,0x53,0x97,0x2a,0x0e,0x0a,
-0x13,0x1d,0x27,0x2a,0x2a,0x4d,0x2a,0x2a,0x4d,0x2a,0x2a,0x27,0x1d,0x14,0x09,0x0e,
-0x2a,0x97,0x53,0x52,0x4b,0x26,0x1d,0x10,0x14,0x4e,0xfe,0xdb,0xa0,0x3a,0x39,0x00,
-0x00,0x01,0x01,0x43,0x00,0x00,0x05,0xe8,0x05,0xd4,0x00,0x23,0x00,0x1f,0xba,0x00,
-0x0e,0x00,0x15,0x00,0x03,0x2b,0xb8,0x00,0x0e,0x10,0x00,0xb8,0x00,0x11,0x2f,0xb8,
-0x00,0x13,0x2f,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x22,0x2f,0x30,0x31,0x01,0x16,0x13,
-0x12,0x17,0x16,0x1d,0x01,0x14,0x07,0x06,0x23,0x22,0x27,0x23,0x15,0x10,0x17,0x23,
-0x35,0x36,0x11,0x27,0x23,0x07,0x06,0x23,0x22,0x2f,0x01,0x35,0x34,0x37,0x00,0x3f,
-0x01,0x03,0x98,0x5e,0xd8,0xed,0x06,0x27,0xa2,0x35,0x40,0x9a,0x5f,0x2a,0x53,0xd7,
-0x55,0x03,0x26,0x2f,0x55,0x7f,0xbb,0x4c,0x09,0xbb,0x01,0x3b,0x59,0x03,0x05,0xd4,
-0xa7,0xfe,0xec,0xfe,0xea,0x39,0x55,0x50,0x28,0xa7,0x60,0x16,0xdd,0x0c,0xfe,0xe5,
-0x96,0x06,0x97,0x01,0x1d,0x03,0x58,0x85,0xd1,0x49,0x2e,0xb7,0xcb,0x01,0x82,0xa5,
-0x03,0x00,0x00,0x02,0x00,0xb9,0x00,0x01,0x06,0x73,0x05,0xd1,0x00,0x18,0x00,0x32,
-0x00,0x51,0xb8,0x00,0x33,0x2f,0xb8,0x00,0x34,0x2f,0xb8,0x00,0x0d,0xdc,0xb8,0x00,
-0x21,0xdc,0xb8,0x00,0x0a,0xd0,0xb8,0x00,0x0a,0x2f,0xb8,0x00,0x33,0x10,0xb8,0x00,
-0x15,0xd0,0xb8,0x00,0x15,0x2f,0xb8,0x00,0x1a,0xdc,0xba,0x00,0x2b,0x00,0x15,0x00,
-0x0d,0x11,0x12,0x39,0x00,0xb8,0x00,0x11,0x2f,0xba,0x00,0x08,0x00,0x26,0x00,0x03,
-0x2b,0xb8,0x00,0x08,0x10,0xb8,0x00,0x00,0xd0,0xb8,0x00,0x26,0x10,0xb8,0x00,0x2f,
-0xd0,0x30,0x31,0x01,0x32,0x13,0x16,0x15,0x32,0x37,0x12,0x33,0x32,0x17,0x16,0x1d,
-0x01,0x10,0x07,0x00,0x07,0x23,0x01,0x26,0x35,0x34,0x37,0x36,0x03,0x15,0x14,0x17,
-0x01,0x33,0x01,0x36,0x3d,0x01,0x34,0x27,0x26,0x23,0x20,0x03,0x06,0x15,0x23,0x34,
-0x27,0x26,0x23,0x22,0x07,0x06,0x02,0x2a,0xda,0x74,0x1c,0x06,0x0d,0x70,0xeb,0xd1,
-0x7a,0x26,0xdd,0xfe,0x3d,0x3c,0x06,0xfd,0xa0,0x78,0xc7,0x51,0xe5,0xd0,0x01,0xdb,
-0x03,0x02,0x3e,0x68,0xbd,0x47,0x3a,0xfe,0xf8,0x56,0x0a,0x06,0x48,0x65,0xbd,0xae,
-0x6b,0x25,0x05,0xd1,0xfe,0xed,0x50,0x18,0x46,0x01,0x35,0xd3,0x4e,0x50,0x0d,0xfe,
-0xfe,0xe7,0xfd,0xd9,0x42,0x02,0xed,0xb2,0xb6,0xd2,0x7c,0x2d,0xfe,0x8f,0x10,0xdb,
-0xe4,0xfd,0xbc,0x02,0xbb,0xa1,0x97,0x26,0xac,0x70,0x1c,0xfe,0x41,0x26,0x1a,0x4e,
-0xd1,0xe0,0xb1,0x46,0x00,0x02,0x01,0x58,0x00,0x00,0x05,0xd2,0x05,0xd4,0x00,0x08,
-0x00,0x0d,0x00,0x15,0x00,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x04,0x2f,0xba,0x00,0x0b,
-0x00,0x04,0x00,0x00,0x11,0x12,0x39,0x30,0x31,0x09,0x01,0x15,0x00,0x07,0x26,0x01,
-0x26,0x35,0x09,0x04,0x03,0x96,0x02,0x3c,0xfd,0xe3,0x1f,0x0f,0xfe,0x17,0x46,0x02,
-0x3a,0xfe,0x03,0x02,0x01,0x02,0x01,0xfe,0x5e,0x05,0xd4,0xfd,0x1a,0x07,0xfd,0x3b,
-0x22,0x0b,0x02,0x80,0x56,0x0d,0x02,0x96,0xfd,0x67,0xfd,0x64,0x02,0x9c,0x02,0x1e,
-0x00,0x01,0x00,0xe4,0x00,0x00,0x06,0x47,0x05,0xd4,0x00,0x37,0x00,0x43,0xba,0x00,
-0x16,0x00,0x1e,0x00,0x03,0x2b,0xb8,0x00,0x16,0x10,0x00,0xb8,0x00,0x1a,0x2f,0xb8,
-0x00,0x1c,0x2f,0xb8,0x00,0x00,0x2f,0xba,0x00,0x08,0x00,0x1a,0x00,0x00,0x11,0x12,
-0x39,0xba,0x00,0x16,0x00,0x1a,0x00,0x00,0x11,0x12,0x39,0xba,0x00,0x20,0x00,0x1a,
-0x00,0x00,0x11,0x12,0x39,0xba,0x00,0x2f,0x00,0x1a,0x00,0x00,0x11,0x12,0x39,0x30,
-0x31,0x01,0x32,0x17,0x16,0x17,0x14,0x0f,0x01,0x33,0x36,0x3b,0x01,0x32,0x17,0x16,
-0x15,0x14,0x07,0x06,0x07,0x22,0x03,0x23,0x15,0x10,0x17,0x15,0x23,0x27,0x36,0x11,
-0x35,0x23,0x02,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x3b,0x01,0x32,0x17,0x33,
-0x35,0x26,0x27,0x26,0x3d,0x01,0x34,0x37,0x36,0x03,0x97,0xd6,0x65,0x0d,0x03,0x78,
-0x3c,0x03,0x4a,0x54,0x13,0xee,0x60,0x17,0xd1,0x28,0x47,0xf2,0x65,0x03,0x52,0xd0,
-0x06,0x55,0x03,0x64,0xf5,0xbf,0x66,0x19,0xf6,0x42,0x33,0x09,0x56,0x4e,0x03,0x54,
-0x1d,0x3c,0xd7,0x47,0x05,0xd4,0xe3,0x34,0x38,0x75,0xa0,0x3c,0x1c,0xca,0x42,0x3c,
-0xcd,0x68,0x0c,0x06,0x01,0x12,0x09,0xfe,0xa9,0x6d,0x06,0x06,0x80,0x01,0x4d,0x03,
-0xfe,0xeb,0xc9,0x44,0x3a,0xe9,0x53,0x0c,0x1c,0x03,0x47,0x45,0x6e,0x51,0x0e,0xc9,
-0x68,0x13,0x00,0x03,0x01,0x42,0x00,0x01,0x05,0xea,0x05,0xd5,0x00,0x22,0x00,0x3c,
-0x00,0x42,0x00,0xad,0xba,0x00,0x27,0x00,0x1e,0x00,0x03,0x2b,0xb8,0x00,0x27,0x10,
-0xba,0x00,0x0d,0x00,0x14,0x00,0x03,0x2b,0xb8,0x00,0x0d,0x10,0xba,0x00,0x05,0x00,
-0x38,0x00,0x03,0x2b,0xb8,0x00,0x05,0x10,0xba,0x00,0x00,0x00,0x14,0x00,0x0d,0x11,
-0x12,0x39,0xba,0x00,0x10,0x00,0x1e,0x00,0x05,0x11,0x12,0x39,0xba,0x00,0x12,0x00,
-0x1e,0x00,0x05,0x11,0x12,0x39,0xba,0x00,0x23,0x00,0x14,0x00,0x0d,0x11,0x12,0x39,
-0xba,0x00,0x3d,0x00,0x1e,0x00,0x05,0x11,0x12,0x39,0xba,0x00,0x3e,0x00,0x1e,0x00,
-0x05,0x11,0x12,0x39,0xb8,0x00,0x44,0xdc,0x00,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x10,
-0x2f,0xb8,0x00,0x12,0x2f,0xba,0x00,0x34,0x00,0x09,0x00,0x03,0x2b,0xb8,0x00,0x34,
-0x10,0xb8,0x00,0x09,0x10,0xb8,0x00,0x18,0xd0,0xba,0x00,0x23,0x00,0x10,0x00,0x00,
-0x11,0x12,0x39,0xb8,0x00,0x34,0x10,0xb8,0x00,0x2b,0xd0,0xba,0x00,0x3d,0x00,0x10,
-0x00,0x00,0x11,0x12,0x39,0xba,0x00,0x3e,0x00,0x10,0x00,0x00,0x11,0x12,0x39,0x30,
-0x31,0x01,0x16,0x01,0x16,0x1d,0x01,0x14,0x07,0x06,0x2b,0x01,0x22,0x27,0x23,0x15,
-0x10,0x17,0x23,0x35,0x36,0x11,0x23,0x07,0x06,0x2b,0x01,0x22,0x27,0x26,0x35,0x37,
-0x35,0x34,0x37,0x00,0x37,0x06,0x01,0x06,0x15,0x16,0x17,0x16,0x3b,0x01,0x32,0x37,
-0x33,0x32,0x17,0x16,0x3b,0x01,0x32,0x37,0x36,0x3d,0x01,0x34,0x27,0x02,0x03,0x33,
-0x26,0x27,0x22,0x07,0x03,0x97,0x7e,0x01,0x7f,0x56,0xb5,0x22,0x30,0x16,0x91,0x62,
-0x2a,0x53,0xd7,0x56,0x2a,0x38,0x55,0x69,0x16,0xa0,0x51,0x19,0x03,0xce,0x01,0x22,
-0x5f,0x7c,0xfe,0xae,0x51,0x0a,0x94,0x16,0x29,0x10,0x77,0x60,0xb7,0x07,0x1f,0x53,
-0x67,0x13,0x89,0x41,0x0a,0xcb,0xe6,0x8e,0x3f,0x0d,0x0f,0x06,0x10,0x05,0xd5,0xe1,
-0xfe,0x36,0x8b,0x86,0x03,0xd1,0x4e,0x10,0xda,0x0d,0xfe,0xe8,0x9b,0x06,0x97,0x01,
-0x23,0x65,0x75,0xae,0x42,0x3f,0x0d,0x03,0xc8,0xd4,0x01,0x67,0x49,0xc7,0xfe,0x6f,
-0x82,0x85,0xbb,0x35,0x09,0xda,0x46,0x94,0xa7,0x28,0x1e,0x1f,0xb0,0xcf,0x01,0x1f,
-0xfb,0x70,0x17,0x5a,0x52,0x00,0x00,0x01,0x00,0xb6,0x00,0x00,0x06,0x77,0x05,0xd4,
-0x00,0x17,0x00,0x19,0x00,0xb8,0x00,0x10,0x2f,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x09,
-0x2f,0xba,0x00,0x05,0x00,0x10,0x00,0x00,0x11,0x12,0x39,0x30,0x31,0x01,0x32,0x17,
-0x16,0x17,0x33,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x01,0x23,0x01,
-0x26,0x35,0x34,0x37,0x36,0x02,0x28,0xcb,0x74,0x2a,0x02,0x03,0x23,0x5c,0x6c,0x87,
-0xd1,0x7e,0x20,0xd0,0xfd,0xef,0x06,0xfd,0xce,0xa8,0xc7,0x54,0x05,0xd4,0xeb,0x5d,
-0x31,0xa2,0x6b,0x6c,0xe0,0x53,0x49,0xfa,0xe3,0xfd,0x85,0x02,0xb1,0xcd,0xda,0xd3,
-0x7c,0x2d,0x00,0x01,0x01,0x58,0x00,0x00,0x05,0xd2,0x05,0xd4,0x00,0x08,0x00,0x0b,
-0x00,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x04,0x2f,0x30,0x31,0x09,0x01,0x16,0x15,0x01,
-0x26,0x01,0x34,0x37,0x03,0x96,0x01,0xf7,0x45,0xfd,0xc4,0x0c,0xfd,0xce,0x6f,0x05,
-0xd4,0xfd,0x73,0x55,0x0d,0xfd,0x1b,0x08,0x02,0xdd,0x0e,0x8a,0x00,0x03,0x00,0xe4,
-0x00,0x00,0x06,0x48,0x05,0xdc,0x00,0x32,0x00,0x60,0x00,0x67,0x01,0x1d,0xba,0x00,
-0x15,0x00,0x1d,0x00,0x03,0x2b,0xb8,0x00,0x15,0x10,0xba,0x00,0x04,0x00,0x5a,0x00,
-0x03,0x2b,0xb8,0x00,0x04,0x10,0xba,0x00,0x0e,0x00,0x4e,0x00,0x03,0x2b,0xb8,0x00,
-0x0e,0x10,0xba,0x00,0x07,0x00,0x1d,0x00,0x0e,0x11,0x12,0x39,0xba,0x00,0x19,0x00,
-0x1d,0x00,0x0e,0x11,0x12,0x39,0xba,0x00,0x56,0x00,0x1d,0x00,0x0e,0x11,0x12,0x39,
-0x41,0x05,0x00,0xea,0x00,0x5a,0x00,0xfa,0x00,0x5a,0x00,0x02,0x5d,0x41,0x1b,0x00,
-0x19,0x00,0x5a,0x00,0x29,0x00,0x5a,0x00,0x39,0x00,0x5a,0x00,0x49,0x00,0x5a,0x00,
-0x59,0x00,0x5a,0x00,0x69,0x00,0x5a,0x00,0x79,0x00,0x5a,0x00,0x89,0x00,0x5a,0x00,
-0x99,0x00,0x5a,0x00,0xa9,0x00,0x5a,0x00,0xb9,0x00,0x5a,0x00,0xc9,0x00,0x5a,0x00,
-0xd9,0x00,0x5a,0x00,0x0d,0x5d,0xb8,0x00,0x69,0xdc,0x00,0xb8,0x00,0x19,0x2f,0xb8,
-0x00,0x1b,0x2f,0xba,0x00,0x00,0x00,0x5e,0x00,0x03,0x2b,0xb8,0x00,0x00,0x10,0xba,
-0x00,0x4a,0x00,0x12,0x00,0x03,0x2b,0xb8,0x00,0x4a,0x10,0xba,0x00,0x29,0x00,0x3a,
-0x00,0x03,0x2b,0xb8,0x00,0x29,0x10,0xb8,0x00,0x07,0xd0,0xb8,0x00,0x07,0x2f,0xb8,
-0x00,0x29,0x10,0xb8,0x00,0x09,0xd0,0xb8,0x00,0x12,0x10,0xb8,0x00,0x21,0xd0,0xb8,
-0x00,0x29,0x10,0xb8,0x00,0x2c,0xd0,0xb8,0x00,0x2c,0x2f,0xb8,0x00,0x3a,0x10,0xb8,
-0x00,0x37,0xd0,0xb8,0x00,0x37,0x2f,0xb8,0x00,0x4a,0x10,0xb8,0x00,0x41,0xd0,0xb8,
-0x00,0x3a,0x10,0xb8,0x00,0x51,0xd0,0xb8,0x00,0x51,0x2f,0xb8,0x00,0x3a,0x10,0xb8,
-0x00,0x53,0xd0,0xb8,0x00,0x3a,0x10,0xb8,0x00,0x55,0xd0,0xb8,0x00,0x55,0x2f,0xba,
-0x00,0x56,0x00,0x3a,0x00,0x37,0x11,0x12,0x39,0x30,0x31,0x01,0x32,0x17,0x16,0x15,
-0x14,0x0f,0x01,0x36,0x3b,0x01,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x22,0x03,
-0x23,0x15,0x10,0x17,0x15,0x23,0x27,0x36,0x11,0x35,0x23,0x02,0x23,0x22,0x27,0x26,
-0x35,0x34,0x37,0x36,0x3b,0x01,0x32,0x17,0x26,0x27,0x35,0x34,0x37,0x36,0x03,0x14,
-0x1f,0x01,0x15,0x26,0x2b,0x01,0x22,0x0f,0x01,0x14,0x17,0x16,0x33,0x32,0x13,0x36,
-0x37,0x33,0x16,0x17,0x16,0x33,0x32,0x37,0x36,0x3d,0x01,0x34,0x2f,0x01,0x23,0x22,
-0x07,0x35,0x36,0x37,0x36,0x35,0x34,0x27,0x26,0x23,0x22,0x07,0x01,0x14,0x07,0x33,
-0x35,0x26,0x35,0x03,0x9b,0xcb,0x68,0x19,0x72,0x16,0x1f,0x3d,0x29,0xf8,0x5c,0x10,
-0xd2,0x22,0x49,0xf1,0x66,0x03,0x52,0xd1,0x06,0x55,0x03,0x64,0xf6,0xc0,0x67,0x19,
-0xf7,0x43,0x33,0x26,0x3d,0x1f,0x63,0x1c,0xd8,0x47,0xf0,0xa9,0x0c,0x6b,0x76,0x09,
-0xf3,0x3d,0x07,0x88,0x3d,0x4e,0xd2,0x72,0x10,0x16,0x07,0x25,0x53,0x5a,0x9e,0xa8,
-0x55,0x0c,0xfd,0x36,0x06,0x76,0x6b,0x81,0x20,0x1a,0xbb,0x36,0x29,0xb8,0x53,0x01,
-0x07,0x1c,0x3c,0x1c,0x05,0xdc,0xce,0x46,0x39,0x84,0xa6,0x17,0x06,0xd7,0x38,0x3a,
-0xd3,0x64,0x0c,0x07,0x01,0x14,0x09,0xfe,0xa7,0x6d,0x06,0x06,0x80,0x01,0x4f,0x04,
-0xfe,0xe8,0xcb,0x45,0x3a,0xeb,0x52,0x0c,0x06,0x70,0xb1,0x26,0xcb,0x69,0x13,0xfe,
-0xb3,0x9b,0xcc,0x0c,0x03,0x09,0xd4,0x43,0x94,0x5d,0x26,0x01,0x27,0x1b,0x41,0x78,
-0x86,0x85,0xbe,0x2e,0x2b,0x06,0xde,0x30,0x03,0x09,0x03,0x89,0x6e,0x4d,0x2c,0xb6,
-0x57,0x10,0xc8,0xfb,0xce,0x1c,0x60,0x03,0x63,0x16,0x00,0x04,0x00,0xd8,0xff,0xfe,
-0x06,0x54,0x05,0xd4,0x00,0x0e,0x00,0x1d,0x00,0x2c,0x00,0x4c,0x01,0x23,0xba,0x00,
-0x40,0x00,0x38,0x00,0x03,0x2b,0xb8,0x00,0x40,0x10,0xba,0x00,0x13,0x00,0x1b,0x00,
-0x03,0x2b,0xb8,0x00,0x13,0x10,0xba,0x00,0x30,0x00,0x48,0x00,0x03,0x2b,0xb8,0x00,
-0x30,0x10,0x41,0x1b,0x00,0x16,0x00,0x13,0x00,0x26,0x00,0x13,0x00,0x36,0x00,0x13,
-0x00,0x46,0x00,0x13,0x00,0x56,0x00,0x13,0x00,0x66,0x00,0x13,0x00,0x76,0x00,0x13,
-0x00,0x86,0x00,0x13,0x00,0x96,0x00,0x13,0x00,0xa6,0x00,0x13,0x00,0xb6,0x00,0x13,
-0x00,0xc6,0x00,0x13,0x00,0xd6,0x00,0x13,0x00,0x0d,0x5d,0x41,0x05,0x00,0xe5,0x00,
-0x13,0x00,0xf5,0x00,0x13,0x00,0x02,0x5d,0xb8,0x00,0x1b,0x10,0xb8,0x00,0x22,0xdc,
-0xba,0x00,0x3c,0x00,0x38,0x00,0x30,0x11,0x12,0x39,0x41,0x1b,0x00,0x16,0x00,0x40,
-0x00,0x26,0x00,0x40,0x00,0x36,0x00,0x40,0x00,0x46,0x00,0x40,0x00,0x56,0x00,0x40,
-0x00,0x66,0x00,0x40,0x00,0x76,0x00,0x40,0x00,0x86,0x00,0x40,0x00,0x96,0x00,0x40,
-0x00,0xa6,0x00,0x40,0x00,0xb6,0x00,0x40,0x00,0xc6,0x00,0x40,0x00,0xd6,0x00,0x40,
-0x00,0x0d,0x5d,0x41,0x05,0x00,0xe5,0x00,0x40,0x00,0xf5,0x00,0x40,0x00,0x02,0x5d,
-0x41,0x05,0x00,0xea,0x00,0x48,0x00,0xfa,0x00,0x48,0x00,0x02,0x5d,0x41,0x1b,0x00,
-0x19,0x00,0x48,0x00,0x29,0x00,0x48,0x00,0x39,0x00,0x48,0x00,0x49,0x00,0x48,0x00,
-0x59,0x00,0x48,0x00,0x69,0x00,0x48,0x00,0x79,0x00,0x48,0x00,0x89,0x00,0x48,0x00,
-0x99,0x00,0x48,0x00,0xa9,0x00,0x48,0x00,0xb9,0x00,0x48,0x00,0xc9,0x00,0x48,0x00,
-0xd9,0x00,0x48,0x00,0x0d,0x5d,0xb8,0x00,0x30,0x10,0xb8,0x00,0x4e,0xdc,0x00,0xb8,
-0x00,0x0f,0x2f,0xba,0x00,0x44,0x00,0x34,0x00,0x03,0x2b,0xb8,0x00,0x44,0x10,0x30,
-0x31,0x01,0x33,0x14,0x06,0x07,0x14,0x16,0x17,0x23,0x26,0x27,0x26,0x27,0x26,0x36,
-0x25,0x33,0x14,0x06,0x07,0x14,0x16,0x13,0x23,0x26,0x27,0x26,0x27,0x26,0x36,0x05,
-0x33,0x14,0x06,0x07,0x14,0x16,0x17,0x23,0x26,0x27,0x26,0x27,0x26,0x36,0x13,0x1e,
-0x01,0x15,0x14,0x06,0x04,0x23,0x22,0x24,0x26,0x35,0x34,0x36,0x37,0x33,0x06,0x07,
-0x06,0x15,0x14,0x16,0x04,0x33,0x32,0x24,0x36,0x35,0x34,0x27,0x26,0x27,0x02,0x76,
-0x0d,0x91,0x02,0xcc,0x07,0x0d,0x1d,0xa3,0x30,0x0f,0x05,0xaa,0x01,0x41,0x0d,0x92,
-0x02,0xcd,0x06,0x0d,0x1d,0xa2,0x31,0x0f,0x04,0xaa,0x01,0x59,0x0d,0x92,0x02,0xcd,
-0x06,0x0d,0x1c,0xa3,0x31,0x0f,0x04,0xaa,0x2c,0xa8,0xbe,0xb9,0xfe,0xb1,0xb6,0xb6,
-0xfe,0xb1,0xb9,0xbd,0xa8,0x03,0x83,0x4b,0x56,0xa7,0x01,0x2e,0xa5,0xa5,0x01,0x2f,
-0xa6,0x56,0x4c,0x83,0x05,0x39,0x3f,0x9b,0x63,0x82,0x79,0xc9,0xa6,0x74,0x33,0x5a,
-0x7c,0x8c,0xed,0x60,0xed,0x97,0xc5,0xbb,0xfe,0xce,0xfb,0xb2,0x4e,0x8b,0xbd,0xd6,
-0x5b,0x4f,0xc4,0x7d,0xa1,0x9a,0xfd,0xd0,0x91,0x42,0x72,0x9b,0xb1,0xfe,0x1e,0x31,
-0xb1,0x61,0x60,0xb0,0x62,0x62,0xb0,0x60,0x61,0xb1,0x31,0x29,0x45,0x4d,0x54,0x54,
-0x98,0x55,0x55,0x98,0x54,0x54,0x4d,0x45,0x29,0x00,0x00,0x01,0x00,0xac,0xff,0xf6,
-0x02,0xb7,0x05,0xd5,0x00,0x11,0x00,0x25,0xba,0x00,0x03,0x00,0x10,0x00,0x03,0x2b,
-0xb8,0x00,0x03,0x10,0x00,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x02,0x2f,0xb8,0x00,0x06,
-0x2f,0xba,0x00,0x10,0x00,0x06,0x00,0x00,0x11,0x12,0x39,0x30,0x31,0x01,0x33,0x17,
-0x11,0x14,0x0f,0x01,0x23,0x22,0x2f,0x01,0x34,0x3f,0x01,0x32,0x17,0x33,0x11,0x02,
-0x68,0x48,0x07,0xc4,0x30,0x23,0xd4,0x1c,0x04,0xd3,0x21,0x63,0x5a,0x04,0x05,0xd5,
-0x08,0xfa,0xfd,0xa3,0x2d,0x04,0x85,0x1f,0x82,0x18,0x05,0x40,0x04,0xd4,0x00,0x01,
-0x00,0xac,0xff,0xf6,0x04,0x6f,0x05,0xd5,0x00,0x1d,0x00,0x33,0xba,0x00,0x12,0x00,
-0x1c,0x00,0x03,0x2b,0xb8,0x00,0x12,0x10,0xb8,0x00,0x02,0xd0,0x00,0xb8,0x00,0x00,
-0x2f,0xb8,0x00,0x02,0x2f,0xb8,0x00,0x14,0x2f,0xba,0x00,0x11,0x00,0x14,0x00,0x00,
-0x11,0x12,0x39,0xba,0x00,0x1c,0x00,0x14,0x00,0x00,0x11,0x12,0x39,0x30,0x31,0x01,
-0x33,0x17,0x15,0x16,0x17,0x16,0x15,0x14,0x07,0x23,0x27,0x36,0x35,0x34,0x27,0x26,
-0x27,0x11,0x14,0x07,0x23,0x22,0x35,0x34,0x37,0x33,0x32,0x17,0x11,0x02,0x58,0x57,
-0x08,0x1b,0xad,0xf0,0x7a,0x04,0x1e,0x3d,0xe4,0x5c,0x19,0xe0,0x39,0xf2,0xd4,0x17,
-0x60,0x59,0x05,0xd5,0x07,0x27,0x36,0x3f,0x46,0x8a,0x92,0x60,0x20,0x31,0x54,0x46,
-0x47,0x2a,0x1a,0xfb,0xd6,0x99,0x2d,0xa8,0x83,0x17,0x40,0x04,0xd6,0x00,0x00,0x01,
-0x01,0x78,0xff,0x2f,0x05,0xb3,0x05,0xd5,0x00,0x1e,0x00,0x65,0xb8,0x00,0x1f,0x2f,
-0xb8,0x00,0x20,0x2f,0xb8,0x00,0x1f,0x10,0xb8,0x00,0x1d,0xd0,0xb8,0x00,0x1d,0x2f,
-0xb8,0x00,0x00,0xd0,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x20,0x10,0xb8,0x00,0x03,0xdc,
-0xb8,0x00,0x01,0xd0,0xb8,0x00,0x01,0x2f,0xb8,0x00,0x03,0x10,0xb8,0x00,0x0e,0xdc,
-0xb8,0x00,0x1d,0x10,0xb8,0x00,0x11,0xdc,0x00,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x05,
-0x2f,0xba,0x00,0x0e,0x00,0x05,0x00,0x00,0x11,0x12,0x39,0xba,0x00,0x10,0x00,0x05,
-0x00,0x00,0x11,0x12,0x39,0xba,0x00,0x1d,0x00,0x05,0x00,0x00,0x11,0x12,0x39,0x30,
-0x31,0x01,0x05,0x17,0x11,0x14,0x07,0x23,0x22,0x3d,0x01,0x34,0x3f,0x01,0x32,0x17,
-0x11,0x25,0x11,0x14,0x0f,0x01,0x23,0x22,0x3d,0x01,0x34,0x3f,0x01,0x32,0x17,0x11,
-0x02,0xfd,0x02,0xb3,0x03,0xc0,0x36,0xd5,0xb1,0x27,0x56,0x51,0xfd,0xdc,0x96,0x43,
-0x1a,0xd8,0xaa,0x2b,0x59,0x50,0x05,0xd5,0xca,0x04,0xfa,0xed,0x9b,0x2a,0xa4,0x04,
-0x7e,0x16,0x03,0x3a,0x04,0x0b,0xa9,0xfb,0xdb,0x89,0x38,0x08,0x9b,0x07,0x7a,0x22,
-0x04,0x43,0x04,0xd3,0x00,0x02,0x00,0xbc,0xff,0xf6,0x06,0x6f,0x05,0xd5,0x00,0x18,
-0x00,0x1c,0x00,0x8b,0xb8,0x00,0x1d,0x2f,0xb8,0x00,0x1e,0x2f,0xb8,0x00,0x02,0xdc,
-0xb8,0x00,0x00,0xd0,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x02,0x10,0xb8,0x00,0x0b,0xdc,
-0xb8,0x00,0x1d,0x10,0xb8,0x00,0x17,0xd0,0xb8,0x00,0x17,0x2f,0xb8,0x00,0x0e,0xdc,
-0xb8,0x00,0x19,0xd0,0xb8,0x00,0x0b,0x10,0xb8,0x00,0x1b,0xd0,0x00,0xba,0x00,0x15,
-0x00,0x11,0x00,0x03,0x2b,0xb8,0x00,0x15,0x10,0xba,0x00,0x18,0x00,0x19,0x00,0x03,
-0x2b,0xb8,0x00,0x18,0x10,0xba,0x00,0x1b,0x00,0x0c,0x00,0x03,0x2b,0xb8,0x00,0x1b,
-0x10,0xb8,0x00,0x11,0x10,0xb8,0x00,0x04,0xd0,0xb8,0x00,0x04,0x2f,0xb8,0x00,0x15,
-0x10,0xb8,0x00,0x08,0xd0,0xb8,0x00,0x08,0x2f,0xba,0x00,0x0b,0x00,0x11,0x00,0x15,
-0x11,0x12,0x39,0xba,0x00,0x17,0x00,0x11,0x00,0x15,0x11,0x12,0x39,0x30,0x31,0x01,
-0x17,0x11,0x14,0x05,0x22,0x27,0x34,0x37,0x32,0x17,0x33,0x11,0x21,0x11,0x06,0x07,
-0x23,0x20,0x35,0x34,0x37,0x32,0x17,0x11,0x17,0x15,0x21,0x35,0x06,0x6b,0x04,0xfe,
-0xfb,0xe9,0x12,0xe9,0x6d,0x4f,0x03,0xfc,0xa5,0x08,0xf2,0x04,0xfe,0xfe,0xec,0x64,
-0x58,0x58,0x03,0x5b,0x05,0xd5,0x04,0xfb,0x12,0xd5,0x15,0xa4,0x8a,0x0e,0x3b,0x02,
-0x95,0xfd,0x5a,0xcf,0x24,0xb1,0x7d,0x10,0x40,0x04,0xe1,0xcf,0x9c,0x9c,0x00,0x02,
-0x00,0xb5,0xff,0xfa,0x03,0x22,0x05,0xd9,0x00,0x0c,0x00,0x13,0x00,0x9d,0xba,0x00,
-0x0e,0x00,0x0b,0x00,0x03,0x2b,0xb8,0x00,0x0e,0x10,0xba,0x00,0x08,0x00,0x10,0x00,
-0x03,0x2b,0xb8,0x00,0x08,0x10,0xb8,0x00,0x0e,0x10,0xb8,0x00,0x02,0xd0,0xba,0x00,
-0x04,0x00,0x0b,0x00,0x08,0x11,0x12,0x39,0x41,0x05,0x00,0xea,0x00,0x10,0x00,0xfa,
-0x00,0x10,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,0x10,0x00,0x29,0x00,0x10,0x00,
-0x39,0x00,0x10,0x00,0x49,0x00,0x10,0x00,0x59,0x00,0x10,0x00,0x69,0x00,0x10,0x00,
-0x79,0x00,0x10,0x00,0x89,0x00,0x10,0x00,0x99,0x00,0x10,0x00,0xa9,0x00,0x10,0x00,
-0xb9,0x00,0x10,0x00,0xc9,0x00,0x10,0x00,0xd9,0x00,0x10,0x00,0x0d,0x5d,0xb8,0x00,
-0x08,0x10,0xb8,0x00,0x15,0xdc,0x00,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x02,0x2f,0xb8,
-0x00,0x0a,0x2f,0xba,0x00,0x06,0x00,0x12,0x00,0x03,0x2b,0xb8,0x00,0x06,0x10,0xba,
-0x00,0x04,0x00,0x0a,0x00,0x00,0x11,0x12,0x39,0x30,0x31,0x13,0x33,0x17,0x11,0x33,
-0x36,0x33,0x16,0x13,0x02,0x05,0x27,0x11,0x13,0x11,0x24,0x11,0x36,0x27,0x22,0xbb,
-0x2d,0x05,0x03,0xaa,0x91,0xe3,0x14,0x1d,0xfd,0xb3,0x03,0x38,0x01,0xa2,0x0d,0xa1,
-0x77,0x05,0xd9,0x06,0xfc,0x3f,0xed,0x03,0xfe,0xff,0xfe,0x57,0x58,0x03,0x05,0xd6,
-0xfb,0xd4,0xfe,0x9d,0x63,0x01,0x31,0xac,0x09,0x00,0x00,0x02,0x00,0xac,0x00,0x00,
-0x02,0x30,0x05,0xd9,0x00,0x0d,0x00,0x13,0x00,0xab,0xb8,0x00,0x14,0x2f,0xb8,0x00,
-0x15,0x2f,0xb8,0x00,0x14,0x10,0xb8,0x00,0x0c,0xd0,0xb8,0x00,0x0c,0x2f,0xb8,0x00,
-0x00,0xd0,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x0c,0x10,0xb8,0x00,0x0f,0xdc,0xb8,0x00,
-0x01,0xd0,0xb8,0x00,0x01,0x2f,0xb8,0x00,0x0f,0x10,0xb8,0x00,0x03,0xd0,0xb8,0x00,
-0x15,0x10,0xb8,0x00,0x06,0xdc,0xb8,0x00,0x04,0xd0,0xb8,0x00,0x04,0x2f,0xb8,0x00,
-0x06,0x10,0xb8,0x00,0x09,0xdc,0xb8,0x00,0x11,0xd0,0xb8,0x00,0x09,0x10,0xb8,0x00,
-0x13,0xd0,0xb8,0x00,0x13,0x2f,0x00,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x02,0x2f,0xb8,
-0x00,0x07,0x2f,0xb8,0x00,0x09,0x2f,0xba,0x00,0x03,0x00,0x07,0x00,0x00,0x11,0x12,
-0x39,0xba,0x00,0x05,0x00,0x07,0x00,0x00,0x11,0x12,0x39,0xba,0x00,0x0a,0x00,0x07,
-0x00,0x00,0x11,0x12,0x39,0xba,0x00,0x0c,0x00,0x07,0x00,0x00,0x11,0x12,0x39,0xba,
-0x00,0x10,0x00,0x07,0x00,0x00,0x11,0x12,0x39,0xba,0x00,0x13,0x00,0x07,0x00,0x00,
-0x11,0x12,0x39,0x30,0x31,0x13,0x33,0x17,0x11,0x25,0x17,0x11,0x07,0x23,0x27,0x11,
-0x05,0x23,0x11,0x13,0x11,0x33,0x25,0x11,0x23,0xb1,0x29,0x06,0x01,0x4e,0x02,0x04,
-0x28,0x05,0xfe,0xaf,0x02,0x34,0x02,0x01,0x1d,0x02,0x05,0xd9,0x05,0xfe,0x2f,0xa1,
-0x02,0xfb,0x63,0x05,0x05,0x01,0xe5,0xa0,0x04,0x8a,0xfd,0x99,0xfe,0x7d,0x90,0x01,
-0x7f,0x00,0x00,0x02,0x00,0xad,0x00,0x00,0x03,0x34,0x05,0xd9,0x00,0x28,0x00,0x2c,
-0x01,0x3d,0xba,0x00,0x13,0x00,0x1a,0x00,0x03,0x2b,0xb8,0x00,0x13,0x10,0xba,0x00,
-0x0e,0x00,0x11,0x00,0x03,0x2b,0xb8,0x00,0x0e,0x10,0xb8,0x00,0x02,0xd0,0xb8,0x00,
-0x11,0x10,0xb8,0x00,0x0b,0xdc,0xba,0x00,0x03,0x00,0x11,0x00,0x0b,0x11,0x12,0x39,
-0xb8,0x00,0x05,0xd0,0xb8,0x00,0x0e,0x10,0xb8,0x00,0x08,0xd0,0xba,0x00,0x09,0x00,
-0x11,0x00,0x0b,0x11,0x12,0x39,0xb8,0x00,0x13,0x10,0xb8,0x00,0x17,0xdc,0xba,0x00,
-0x18,0x00,0x1a,0x00,0x13,0x11,0x12,0x39,0xb8,0x00,0x1c,0xd0,0xba,0x00,0x1e,0x00,
-0x1a,0x00,0x13,0x11,0x12,0x39,0xb8,0x00,0x1a,0x10,0xb8,0x00,0x1f,0xd0,0xb8,0x00,
-0x17,0x10,0xb8,0x00,0x21,0xd0,0xb8,0x00,0x13,0x10,0xb8,0x00,0x25,0xd0,0xb8,0x00,
-0x14,0x10,0xb8,0x00,0x26,0xd0,0xb8,0x00,0x11,0x10,0xb8,0x00,0x27,0xd0,0xb8,0x00,
-0x11,0x10,0xb8,0x00,0x2b,0xd0,0xb8,0x00,0x28,0xd0,0xb8,0x00,0x13,0x10,0xb8,0x00,
-0x29,0xd0,0xb8,0x00,0x14,0x10,0xb8,0x00,0x2a,0xd0,0xba,0x00,0x2c,0x00,0x1a,0x00,
-0x0b,0x11,0x12,0x39,0x00,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x02,0x2f,0xb8,0x00,0x15,
-0x2f,0xb8,0x00,0x17,0x2f,0xba,0x00,0x03,0x00,0x15,0x00,0x00,0x11,0x12,0x39,0xba,
-0x00,0x05,0x00,0x15,0x00,0x00,0x11,0x12,0x39,0xba,0x00,0x09,0x00,0x15,0x00,0x00,
-0x11,0x12,0x39,0xba,0x00,0x0a,0x00,0x15,0x00,0x00,0x11,0x12,0x39,0xba,0x00,0x12,
-0x00,0x15,0x00,0x00,0x11,0x12,0x39,0xba,0x00,0x18,0x00,0x15,0x00,0x00,0x11,0x12,
-0x39,0xba,0x00,0x19,0x00,0x15,0x00,0x00,0x11,0x12,0x39,0xba,0x00,0x1e,0x00,0x15,
-0x00,0x00,0x11,0x12,0x39,0xba,0x00,0x1f,0x00,0x15,0x00,0x00,0x11,0x12,0x39,0xba,
-0x00,0x26,0x00,0x15,0x00,0x00,0x11,0x12,0x39,0xba,0x00,0x2a,0x00,0x15,0x00,0x00,
-0x11,0x12,0x39,0xba,0x00,0x2c,0x00,0x15,0x00,0x00,0x11,0x12,0x39,0x30,0x31,0x01,
-0x33,0x17,0x11,0x37,0x17,0x15,0x06,0x07,0x11,0x37,0x15,0x06,0x07,0x11,0x07,0x23,
-0x27,0x11,0x05,0x11,0x07,0x23,0x27,0x11,0x07,0x35,0x34,0x37,0x11,0x23,0x07,0x35,
-0x37,0x11,0x37,0x33,0x17,0x11,0x25,0x11,0x01,0x11,0x25,0x11,0x02,0x87,0x2e,0x05,
-0x77,0x03,0x03,0x77,0x7a,0x01,0x79,0x05,0x2e,0x05,0xfe,0xe0,0x05,0x2a,0x05,0x81,
-0x81,0x02,0x7f,0x81,0x05,0x2a,0x05,0x01,0x20,0xfe,0xe0,0x01,0x20,0x05,0xd9,0x05,
-0xfe,0xd0,0x3c,0x02,0x8d,0x07,0x3c,0xfe,0x8b,0x37,0x87,0x04,0x43,0xfe,0xd7,0x04,
-0x04,0x01,0x11,0x8c,0xfe,0xa6,0x04,0x04,0x01,0x41,0x3c,0x8e,0x06,0x3c,0x01,0x7b,
-0x38,0x8b,0x41,0x01,0x1f,0x04,0x04,0xfe,0xfa,0x86,0x01,0x4d,0xfd,0x96,0xfe,0x87,
-0x8b,0x01,0x74,0x00,0x00,0x01,0x00,0xac,0x00,0x00,0x05,0x50,0x05,0xd9,0x00,0x47,
-0x00,0x63,0xba,0x00,0x36,0x00,0x00,0x00,0x03,0x2b,0xb8,0x00,0x36,0x10,0xb8,0x00,
-0x00,0x10,0xb8,0x00,0x12,0xd0,0xb8,0x00,0x36,0x10,0xb8,0x00,0x23,0xd0,0x00,0xb8,
-0x00,0x18,0x2f,0xb8,0x00,0x1d,0x2f,0xb8,0x00,0x3c,0x2f,0xb8,0x00,0x41,0x2f,0xba,
-0x00,0x0f,0x00,0x03,0x00,0x03,0x2b,0xb8,0x00,0x0f,0x10,0xba,0x00,0x12,0x00,0x00,
-0x00,0x03,0x2b,0xb8,0x00,0x12,0x10,0xb8,0x00,0x24,0xd0,0xb8,0x00,0x0f,0x10,0xb8,
-0x00,0x27,0xd0,0xb8,0x00,0x03,0x10,0xb8,0x00,0x32,0xd0,0xb8,0x00,0x00,0x10,0xb8,
-0x00,0x35,0xd0,0x30,0x31,0x01,0x23,0x26,0x07,0x23,0x22,0x27,0x35,0x36,0x35,0x34,
-0x27,0x35,0x36,0x37,0x33,0x16,0x3b,0x01,0x35,0x34,0x27,0x35,0x36,0x37,0x33,0x16,
-0x33,0x32,0x37,0x33,0x16,0x17,0x15,0x06,0x1d,0x01,0x33,0x32,0x37,0x33,0x16,0x17,
-0x15,0x06,0x15,0x14,0x17,0x15,0x06,0x2b,0x01,0x26,0x07,0x23,0x11,0x14,0x17,0x15,
-0x06,0x07,0x23,0x26,0x23,0x22,0x07,0x23,0x26,0x27,0x35,0x36,0x35,0x02,0xb6,0xa8,
-0xb6,0x51,0x38,0x18,0x0b,0x63,0x63,0x02,0x20,0x39,0x53,0xb5,0xa7,0x83,0x03,0x1d,
-0x3a,0x2d,0x46,0x46,0x2d,0x3a,0x1d,0x03,0x83,0xa3,0xb5,0x53,0x38,0x21,0x02,0x63,
-0x63,0x0b,0x19,0x37,0x51,0xb6,0xa4,0x83,0x03,0x1d,0x3a,0x2d,0x46,0x46,0x2d,0x3a,
-0x1d,0x03,0x83,0x03,0x11,0x01,0x5b,0x23,0x3b,0x31,0x37,0x46,0x2d,0x3a,0x1d,0x03,
-0x83,0xaf,0xb5,0x53,0x38,0x21,0x02,0x63,0x63,0x02,0x21,0x38,0x53,0xb5,0xaf,0x83,
-0x03,0x1d,0x3a,0x2d,0x46,0x37,0x31,0x3b,0x23,0x5b,0x01,0xfe,0x52,0xb5,0x53,0x39,
-0x20,0x02,0x63,0x63,0x02,0x20,0x39,0x53,0xb5,0x00,0x00,0x06,0x00,0x84,0x00,0x00,
-0x05,0x9c,0x05,0xd9,0x00,0x06,0x00,0x0d,0x00,0x14,0x00,0x1b,0x00,0x3b,0x00,0x47,
-0x01,0x29,0xb8,0x00,0x48,0x2f,0xb8,0x00,0x49,0x2f,0xb8,0x00,0x25,0xdc,0xb8,0x00,
-0x0e,0xd0,0xb8,0x00,0x0e,0x2f,0xb8,0x00,0x48,0x10,0xb8,0x00,0x2b,0xd0,0xb8,0x00,
-0x2b,0x2f,0xb8,0x00,0x12,0xd0,0xb8,0x00,0x12,0x2f,0xb8,0x00,0x2b,0x10,0xb8,0x00,
-0x41,0xdc,0xb8,0x00,0x13,0xd0,0xb8,0x00,0x13,0x2f,0xb8,0x00,0x25,0x10,0xb8,0x00,
-0x42,0xdc,0xb8,0x00,0x14,0xd0,0xb8,0x00,0x14,0x2f,0xb8,0x00,0x42,0x10,0xb8,0x00,
-0x15,0xd0,0xb8,0x00,0x15,0x2f,0xb8,0x00,0x41,0x10,0xb8,0x00,0x16,0xd0,0xb8,0x00,
-0x16,0x2f,0xb8,0x00,0x2b,0x10,0xb8,0x00,0x17,0xd0,0xb8,0x00,0x17,0x2f,0xb8,0x00,
-0x25,0x10,0xb8,0x00,0x1b,0xd0,0xb8,0x00,0x1b,0x2f,0xb8,0x00,0x25,0x10,0xb8,0x00,
-0x1c,0xd0,0xb8,0x00,0x2b,0x10,0xb8,0x00,0x34,0xd0,0xb8,0x00,0x41,0x10,0xb8,0x00,
-0x3c,0xd0,0xb8,0x00,0x42,0x10,0xb8,0x00,0x46,0xd0,0x00,0xb8,0x00,0x38,0x2f,0xb8,
-0x00,0x28,0x2f,0xba,0x00,0x33,0x00,0x06,0x00,0x03,0x2b,0xb8,0x00,0x33,0x10,0xba,
-0x00,0x44,0x00,0x24,0x00,0x03,0x2b,0xb8,0x00,0x44,0x10,0xb8,0x00,0x33,0x10,0xb8,
-0x00,0x1c,0xd0,0xba,0x00,0x1e,0x00,0x28,0x00,0x38,0x11,0x12,0x39,0xba,0x00,0x22,
-0x00,0x28,0x00,0x38,0x11,0x12,0x39,0xba,0x00,0x26,0x00,0x28,0x00,0x38,0x11,0x12,
-0x39,0xba,0x00,0x2a,0x00,0x28,0x00,0x38,0x11,0x12,0x39,0xb8,0x00,0x24,0x10,0xb8,
-0x00,0x2c,0xd0,0xba,0x00,0x2e,0x00,0x28,0x00,0x38,0x11,0x12,0x39,0xba,0x00,0x36,
-0x00,0x28,0x00,0x38,0x11,0x12,0x39,0xba,0x00,0x3a,0x00,0x28,0x00,0x38,0x11,0x12,
-0x39,0xb8,0x00,0x06,0x10,0xb8,0x00,0x3d,0xd0,0xb8,0x00,0x44,0x10,0xb8,0x00,0x3f,
-0xd0,0xb8,0x00,0x06,0x10,0xb8,0x00,0x45,0xd0,0x30,0x31,0x01,0x06,0x07,0x16,0x17,
-0x37,0x35,0x05,0x15,0x17,0x36,0x37,0x26,0x27,0x01,0x26,0x27,0x06,0x07,0x17,0x33,
-0x03,0x23,0x07,0x16,0x17,0x36,0x37,0x03,0x33,0x37,0x16,0x17,0x06,0x07,0x27,0x23,
-0x11,0x17,0x06,0x07,0x26,0x27,0x37,0x11,0x23,0x07,0x26,0x27,0x36,0x37,0x17,0x33,
-0x35,0x27,0x36,0x37,0x16,0x17,0x0f,0x01,0x15,0x23,0x15,0x33,0x11,0x33,0x11,0x33,
-0x35,0x23,0x35,0x01,0x3b,0x16,0x30,0x2f,0x17,0x5f,0x02,0xed,0x5e,0x17,0x2f,0x2f,
-0x17,0xfe,0x86,0x2c,0x2f,0x2c,0x2d,0x44,0x2d,0x01,0x2d,0x43,0x2d,0x2c,0x2e,0x2d,
-0x07,0xe4,0xd0,0x0a,0x7a,0x7a,0x0a,0xd0,0xe4,0x7e,0x6a,0x69,0x68,0x68,0x7e,0xe4,
-0xd0,0x0b,0x7a,0x7a,0x0b,0xd0,0xe4,0x7e,0x68,0x69,0x68,0x6a,0x7e,0x6e,0x74,0x74,
-0x36,0x74,0x74,0x03,0xb4,0x2d,0x2e,0x2c,0x2d,0x43,0x2e,0x01,0x2e,0x43,0x2e,0x2c,
-0x2e,0x2d,0x01,0x6e,0x17,0x2f,0x2f,0x17,0x5f,0xfc,0x52,0x5f,0x17,0x2f,0x2f,0x17,
-0x02,0xf7,0x7e,0x69,0x6a,0x68,0x68,0x7e,0xfe,0x4e,0xd0,0x0b,0x79,0x79,0x0b,0xd0,
-0x01,0xb2,0x7e,0x68,0x69,0x69,0x69,0x7e,0xd6,0xd1,0x0b,0x7a,0x7a,0x0b,0xd1,0x73,
-0x9f,0x2e,0xfe,0x80,0x01,0x80,0x2e,0x9f,0x00,0x0c,0x00,0xac,0x00,0x00,0x06,0x81,
-0x05,0xac,0x00,0x14,0x00,0x23,0x00,0x2e,0x00,0x36,0x00,0x43,0x00,0x4d,0x00,0x68,
-0x00,0x77,0x00,0x8c,0x00,0x97,0x00,0xa6,0x00,0xaf,0x00,0x9d,0xba,0x00,0x8f,0x00,
-0xae,0x00,0x03,0x2b,0xb8,0x00,0x8f,0x10,0x00,0xb8,0x00,0x88,0x2f,0xba,0x00,0x00,
-0x00,0x24,0x00,0x03,0x2b,0xb8,0x00,0x00,0x10,0xba,0x00,0x16,0x00,0x33,0x00,0x03,
-0x2b,0xb8,0x00,0x16,0x10,0xba,0x00,0x9f,0x00,0x85,0x00,0x03,0x2b,0xb8,0x00,0x9f,
-0x10,0xba,0x00,0x7c,0x00,0xa2,0x00,0x03,0x2b,0xb8,0x00,0x7c,0x10,0xba,0x00,0x29,
-0x00,0x09,0x00,0x03,0x2b,0xb8,0x00,0x29,0x10,0xba,0x00,0x46,0x00,0x3f,0x00,0x03,
-0x2b,0xb8,0x00,0x46,0x10,0xb8,0x00,0x7c,0x10,0xb8,0x00,0x8d,0xd0,0xb8,0x00,0x85,
-0x10,0xb8,0x00,0x90,0xd0,0xb8,0x00,0x7c,0x10,0xb8,0x00,0x98,0xd0,0xb8,0x00,0x98,
-0x2f,0xb8,0x00,0x85,0x10,0xb8,0x00,0x9a,0xd0,0xb8,0x00,0x9a,0x2f,0xba,0x00,0x9b,
-0x00,0x85,0x00,0x9f,0x11,0x12,0x39,0xb8,0x00,0xa2,0x10,0xb8,0x00,0xa7,0xd0,0xb8,
-0x00,0x9f,0x10,0xb8,0x00,0xad,0xd0,0x30,0x31,0x01,0x21,0x32,0x1f,0x01,0x37,0x33,
-0x32,0x15,0x03,0x21,0x27,0x35,0x36,0x37,0x35,0x02,0x27,0x26,0x3d,0x01,0x07,0x33,
-0x32,0x17,0x16,0x15,0x02,0x07,0x23,0x24,0x27,0x35,0x12,0x37,0x36,0x05,0x15,0x13,
-0x07,0x15,0x33,0x37,0x07,0x26,0x2f,0x01,0x01,0x17,0x13,0x26,0x2b,0x01,0x22,0x07,
-0x01,0x16,0x13,0x17,0x15,0x14,0x07,0x06,0x2b,0x01,0x26,0x03,0x35,0x17,0x13,0x33,
-0x32,0x3f,0x01,0x34,0x2f,0x01,0x06,0x25,0x33,0x32,0x17,0x16,0x15,0x07,0x23,0x27,
-0x02,0x0f,0x01,0x17,0x07,0x23,0x26,0x03,0x26,0x3d,0x01,0x34,0x3f,0x01,0x23,0x27,
-0x35,0x37,0x17,0x15,0x17,0x33,0x15,0x14,0x07,0x15,0x16,0x17,0x13,0x33,0x17,0x35,
-0x27,0x01,0x33,0x17,0x15,0x21,0x32,0x37,0x33,0x17,0x15,0x06,0x03,0x06,0x2b,0x01,
-0x15,0x07,0x23,0x02,0x3d,0x01,0x27,0x17,0x11,0x07,0x21,0x22,0x2f,0x01,0x35,0x34,
-0x37,0x05,0x07,0x17,0x33,0x35,0x34,0x3b,0x01,0x32,0x3f,0x01,0x21,0x26,0x3d,0x01,
-0x05,0x06,0x07,0x15,0x14,0x1f,0x01,0x21,0x11,0x03,0x28,0x01,0x8b,0x3a,0x1d,0x4d,
-0x62,0x08,0x05,0xad,0xfe,0xa4,0x05,0x12,0x52,0xbb,0x10,0x2e,0x71,0x17,0x70,0x37,
-0x1e,0xb0,0x10,0x03,0xfe,0xd3,0x04,0x9e,0x11,0x2c,0x01,0x12,0xca,0x16,0xca,0x5f,
-0x1c,0x71,0x10,0x14,0xfd,0x1e,0xf0,0xa0,0x3e,0x4d,0x1c,0x54,0x2c,0x03,0x9b,0x12,
-0x95,0x05,0x50,0x17,0x24,0x92,0x0c,0xb4,0x36,0x9c,0x85,0x36,0x24,0x02,0x30,0x5f,
-0xe4,0xfd,0x13,0x14,0x09,0x75,0x33,0x05,0x05,0x64,0xb4,0x0f,0x03,0x05,0x07,0x03,
-0x16,0xad,0x14,0x55,0x14,0x02,0x64,0x05,0x80,0x12,0x03,0x74,0x01,0x9c,0xc8,0x02,
-0x1c,0x5f,0x02,0x7d,0x05,0x05,0x01,0x73,0x2a,0x24,0x02,0x05,0x06,0xc4,0x19,0x22,
-0xc3,0x05,0x08,0xac,0x52,0x08,0x05,0xfe,0xd6,0x74,0x30,0x06,0x58,0x02,0x58,0x5f,
-0x5f,0x05,0x08,0xe7,0x16,0x2f,0x69,0xfe,0x6b,0x08,0xfd,0xb8,0x3d,0x06,0x5a,0x1e,
-0x01,0x0e,0x05,0xac,0x47,0x86,0x38,0x07,0xfe,0xd4,0x05,0x05,0x11,0x2a,0x05,0x01,
-0x46,0x14,0x16,0x04,0x05,0x0d,0x80,0x31,0x0a,0xfe,0xc6,0x11,0xac,0x08,0x02,0x01,
-0x1a,0x08,0x2e,0x17,0x02,0xfe,0x9d,0x0f,0x03,0xad,0x0d,0xc5,0x0d,0x05,0xfe,0xd1,
-0x8a,0x01,0x17,0x90,0x66,0xfe,0xf5,0x11,0xfe,0xef,0x29,0x14,0x4d,0x43,0x12,0x0b,
-0x01,0x3d,0x05,0x0f,0xfe,0xea,0x67,0x1a,0x39,0x45,0xa2,0x81,0x6b,0xd7,0x4f,0x0d,
-0x05,0x39,0xfe,0xcb,0x21,0x15,0x28,0x05,0x1b,0x01,0x2d,0x1a,0x1f,0x07,0x1c,0x83,
-0x29,0x3b,0x05,0x05,0x26,0x05,0x0d,0x02,0x08,0xc6,0x0a,0x1a,0xfe,0x01,0x5d,0x08,
-0x03,0xac,0xfe,0xd4,0x05,0x74,0x21,0x05,0x02,0x15,0xfe,0xb1,0x1d,0x79,0x05,0x01,
-0x22,0x0d,0x03,0xb3,0x07,0xfe,0xa5,0x05,0x86,0x26,0x0d,0x32,0x7c,0x0c,0xac,0xaa,
-0x08,0x1c,0x62,0xb3,0x01,0x14,0x08,0x1d,0x61,0x24,0x0a,0x55,0x2b,0x06,0x01,0x15,
-0x00,0x04,0x00,0x9c,0x00,0x20,0x06,0x8f,0x05,0xd9,0x00,0x0a,0x00,0x1f,0x00,0x32,
-0x00,0x45,0x00,0x8b,0x00,0xb8,0x00,0x33,0x2f,0xb8,0x00,0x24,0x2f,0xba,0x00,0x1a,
-0x00,0x1b,0x00,0x03,0x2b,0xb8,0x00,0x1a,0x10,0xba,0x00,0x08,0x00,0x09,0x00,0x03,
-0x2b,0xb8,0x00,0x08,0x10,0xb8,0x00,0x00,0xd0,0xba,0x00,0x11,0x00,0x24,0x00,0x33,
-0x11,0x12,0x39,0xba,0x00,0x12,0x00,0x24,0x00,0x33,0x11,0x12,0x39,0xba,0x00,0x13,
-0x00,0x24,0x00,0x33,0x11,0x12,0x39,0xb8,0x00,0x1b,0x10,0xb8,0x00,0x22,0xd0,0xba,
-0x00,0x25,0x00,0x1b,0x00,0x1a,0x11,0x12,0x39,0xba,0x00,0x26,0x00,0x24,0x00,0x33,
-0x11,0x12,0x39,0xb8,0x00,0x1a,0x10,0xb8,0x00,0x27,0xd0,0xb8,0x00,0x27,0x2f,0xba,
-0x00,0x37,0x00,0x24,0x00,0x33,0x11,0x12,0x39,0xba,0x00,0x38,0x00,0x24,0x00,0x33,
-0x11,0x12,0x39,0xba,0x00,0x39,0x00,0x24,0x00,0x33,0x11,0x12,0x39,0x30,0x31,0x01,
-0x33,0x11,0x07,0x35,0x37,0x33,0x11,0x33,0x15,0x21,0x05,0x26,0x35,0x34,0x3f,0x01,
-0x27,0x37,0x13,0x27,0x07,0x06,0x17,0x16,0x37,0x21,0x15,0x21,0x22,0x27,0x26,0x25,
-0x06,0x07,0x23,0x15,0x27,0x37,0x15,0x33,0x36,0x37,0x36,0x27,0x03,0x37,0x13,0x16,
-0x15,0x14,0x01,0x16,0x1f,0x01,0x37,0x03,0x27,0x37,0x27,0x26,0x07,0x06,0x07,0x03,
-0x27,0x13,0x36,0x37,0x36,0x02,0xd5,0xab,0xba,0xca,0x7f,0xab,0xfe,0x1b,0xfd,0xf3,
-0x2c,0x26,0x54,0x3e,0xeb,0x18,0x3d,0x63,0x14,0x24,0x28,0x77,0x01,0x96,0xfe,0x1c,
-0x4b,0x39,0x2e,0x05,0x8b,0x55,0xaf,0xa7,0xd2,0xd2,0xc6,0x3a,0x19,0x19,0x43,0xca,
-0x88,0xf3,0x25,0xfc,0xe6,0xa9,0x60,0x54,0x3f,0x19,0xea,0x3c,0x63,0x26,0x3e,0x3f,
-0x35,0xcc,0x88,0xf1,0x27,0x38,0x2f,0x01,0xea,0x01,0x9a,0x1a,0x61,0x1e,0xfe,0x01,
-0x5c,0xb8,0x4d,0x4f,0x48,0x4b,0x92,0x24,0x6b,0xfe,0xff,0x24,0xac,0x38,0x32,0x33,
-0x08,0x9f,0x21,0x1b,0x61,0x93,0x0a,0x49,0x97,0x95,0x46,0x0b,0x37,0x3d,0x63,0x01,
-0x60,0x4f,0xfe,0x5d,0x42,0x41,0x36,0x04,0x9e,0x01,0x92,0x91,0x24,0xfe,0xff,0x6b,
-0x23,0xac,0x2d,0x06,0x09,0x6b,0xfe,0xa1,0x4e,0x01,0xa4,0x41,0x21,0x1b,0x00,0x04,
-0x00,0x9c,0x00,0x20,0x06,0x8f,0x05,0xd9,0x00,0x1c,0x00,0x31,0x00,0x44,0x00,0x57,
-0x00,0x9d,0x00,0xb8,0x00,0x45,0x2f,0xb8,0x00,0x36,0x2f,0xba,0x00,0x2c,0x00,0x2d,
-0x00,0x03,0x2b,0xb8,0x00,0x2c,0x10,0xba,0x00,0x01,0x00,0x02,0x00,0x03,0x2b,0xb8,
-0x00,0x01,0x10,0xba,0x00,0x14,0x00,0x0d,0x00,0x03,0x2b,0xb8,0x00,0x14,0x10,0xba,
-0x00,0x10,0x00,0x36,0x00,0x45,0x11,0x12,0x39,0xba,0x00,0x23,0x00,0x36,0x00,0x45,
-0x11,0x12,0x39,0xba,0x00,0x24,0x00,0x36,0x00,0x45,0x11,0x12,0x39,0xba,0x00,0x25,
-0x00,0x36,0x00,0x45,0x11,0x12,0x39,0xb8,0x00,0x2d,0x10,0xb8,0x00,0x34,0xd0,0xba,
-0x00,0x37,0x00,0x2d,0x00,0x2c,0x11,0x12,0x39,0xba,0x00,0x38,0x00,0x36,0x00,0x45,
-0x11,0x12,0x39,0xb8,0x00,0x2c,0x10,0xb8,0x00,0x39,0xd0,0xb8,0x00,0x39,0x2f,0xba,
-0x00,0x49,0x00,0x36,0x00,0x45,0x11,0x12,0x39,0xba,0x00,0x4a,0x00,0x0d,0x00,0x14,
-0x11,0x12,0x39,0xba,0x00,0x4b,0x00,0x36,0x00,0x45,0x11,0x12,0x39,0x30,0x31,0x01,
-0x21,0x15,0x21,0x35,0x3e,0x01,0x37,0x3e,0x01,0x35,0x34,0x26,0x23,0x22,0x06,0x07,
-0x35,0x3e,0x01,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x0e,0x01,0x01,0x26,0x35,0x34,
-0x3f,0x01,0x27,0x37,0x13,0x27,0x07,0x06,0x17,0x16,0x37,0x21,0x15,0x21,0x22,0x27,
-0x26,0x25,0x06,0x07,0x23,0x15,0x27,0x37,0x15,0x33,0x36,0x37,0x36,0x27,0x03,0x37,
-0x13,0x16,0x15,0x14,0x01,0x16,0x1f,0x01,0x37,0x03,0x27,0x37,0x27,0x26,0x07,0x06,
-0x07,0x03,0x27,0x13,0x36,0x37,0x36,0x03,0x5d,0x01,0x54,0xfd,0xf1,0x40,0xcd,0x19,
-0x31,0x24,0x4a,0x3c,0x2f,0x67,0x59,0x4c,0x70,0x30,0x7f,0x9a,0x26,0x30,0x0e,0x8b,
-0xfd,0x0a,0x2c,0x26,0x54,0x3e,0xeb,0x18,0x3d,0x63,0x14,0x24,0x28,0x77,0x01,0x96,
-0xfe,0x1c,0x4b,0x39,0x2e,0x05,0x8b,0x55,0xaf,0xa7,0xd2,0xd2,0xc6,0x3a,0x19,0x19,
-0x43,0xca,0x88,0xf3,0x25,0xfc,0xe6,0xa9,0x60,0x54,0x3f,0x19,0xea,0x3c,0x63,0x26,
-0x3e,0x3f,0x35,0xcc,0x88,0xf1,0x27,0x38,0x2f,0x01,0xd2,0x5d,0x55,0x31,0x9e,0x15,
-0x29,0x38,0x1a,0x28,0x33,0x18,0x26,0x6e,0x19,0x14,0x63,0x51,0x26,0x44,0x2d,0x0d,
-0x6d,0xfe,0xba,0x4d,0x4f,0x48,0x4b,0x92,0x24,0x6b,0xfe,0xff,0x24,0xac,0x38,0x32,
-0x33,0x08,0x9f,0x21,0x1b,0x61,0x93,0x0a,0x49,0x97,0x95,0x46,0x0b,0x37,0x3d,0x63,
-0x01,0x60,0x4f,0xfe,0x5d,0x42,0x41,0x36,0x04,0x9e,0x01,0x92,0x91,0x24,0xfe,0xff,
-0x6b,0x23,0xac,0x2d,0x06,0x09,0x6b,0xfe,0xa1,0x4e,0x01,0xa4,0x41,0x21,0x1b,0x00,
-0x00,0x04,0x00,0x9c,0x00,0x20,0x06,0x8f,0x05,0xd9,0x00,0x28,0x00,0x3d,0x00,0x50,
-0x00,0x63,0x00,0xb3,0x00,0xb8,0x00,0x51,0x2f,0xb8,0x00,0x42,0x2f,0xba,0x00,0x38,
-0x00,0x39,0x00,0x03,0x2b,0xb8,0x00,0x38,0x10,0xba,0x00,0x0d,0x00,0x06,0x00,0x03,
-0x2b,0xb8,0x00,0x0d,0x10,0xba,0x00,0x23,0x00,0x1c,0x00,0x03,0x2b,0xb8,0x00,0x23,
-0x10,0xba,0x00,0x16,0x00,0x13,0x00,0x03,0x2b,0xb8,0x00,0x16,0x10,0xba,0x00,0x00,
-0x00,0x13,0x00,0x16,0x11,0x12,0x39,0xba,0x00,0x0a,0x00,0x42,0x00,0x51,0x11,0x12,
-0x39,0xba,0x00,0x2f,0x00,0x13,0x00,0x16,0x11,0x12,0x39,0xba,0x00,0x30,0x00,0x42,
-0x00,0x51,0x11,0x12,0x39,0xba,0x00,0x31,0x00,0x42,0x00,0x51,0x11,0x12,0x39,0xb8,
-0x00,0x39,0x10,0xb8,0x00,0x40,0xd0,0xba,0x00,0x43,0x00,0x39,0x00,0x38,0x11,0x12,
-0x39,0xba,0x00,0x44,0x00,0x42,0x00,0x51,0x11,0x12,0x39,0xb8,0x00,0x38,0x10,0xb8,
-0x00,0x45,0xd0,0xb8,0x00,0x45,0x2f,0xba,0x00,0x55,0x00,0x42,0x00,0x51,0x11,0x12,
-0x39,0xba,0x00,0x56,0x00,0x1c,0x00,0x23,0x11,0x12,0x39,0xba,0x00,0x57,0x00,0x42,
-0x00,0x51,0x11,0x12,0x39,0x30,0x31,0x01,0x1e,0x01,0x15,0x14,0x06,0x23,0x22,0x26,
-0x27,0x35,0x1e,0x01,0x33,0x32,0x36,0x35,0x34,0x26,0x2b,0x01,0x35,0x33,0x32,0x36,
-0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x35,0x3e,0x01,0x33,0x32,0x16,0x15,0x14,0x06,
-0x01,0x26,0x35,0x34,0x3f,0x01,0x27,0x37,0x13,0x27,0x07,0x06,0x17,0x16,0x37,0x21,
-0x15,0x21,0x22,0x27,0x26,0x25,0x06,0x07,0x23,0x15,0x27,0x37,0x15,0x33,0x36,0x37,
-0x36,0x27,0x03,0x37,0x13,0x16,0x15,0x14,0x01,0x16,0x1f,0x01,0x37,0x03,0x27,0x37,
-0x27,0x26,0x07,0x06,0x07,0x03,0x27,0x13,0x36,0x37,0x36,0x04,0x5a,0x0b,0x5f,0xad,
-0x9d,0x33,0x6c,0x46,0x48,0x65,0x35,0x5e,0x5c,0x56,0x4f,0x6f,0x73,0x48,0x47,0x4a,
-0x49,0x29,0x60,0x56,0x4b,0x6d,0x31,0x81,0x9a,0x53,0xfc,0x6a,0x2c,0x26,0x54,0x3e,
-0xeb,0x18,0x3d,0x63,0x14,0x24,0x28,0x77,0x01,0x96,0xfe,0x1c,0x4b,0x39,0x2e,0x05,
-0x8b,0x55,0xaf,0xa7,0xd2,0xd2,0xc6,0x3a,0x19,0x19,0x43,0xca,0x88,0xf3,0x25,0xfc,
-0xe6,0xa9,0x60,0x54,0x3f,0x19,0xea,0x3c,0x63,0x26,0x3e,0x3f,0x35,0xcc,0x88,0xf1,
-0x27,0x38,0x2f,0x02,0xbe,0x02,0x53,0x3c,0x5c,0x65,0x0e,0x12,0x6c,0x1e,0x12,0x32,
-0x33,0x2d,0x32,0x5b,0x27,0x26,0x27,0x29,0x0e,0x14,0x62,0x0f,0x0d,0x59,0x4b,0x34,
-0x4a,0xfe,0x18,0x4d,0x4f,0x48,0x4b,0x92,0x24,0x6b,0xfe,0xff,0x24,0xac,0x38,0x32,
-0x33,0x08,0x9f,0x21,0x1b,0x61,0x93,0x0a,0x49,0x97,0x95,0x46,0x0b,0x37,0x3d,0x63,
-0x01,0x60,0x4f,0xfe,0x5d,0x42,0x41,0x36,0x04,0x9e,0x01,0x92,0x91,0x24,0xfe,0xff,
-0x6b,0x23,0xac,0x2d,0x06,0x09,0x6b,0xfe,0xa1,0x4e,0x01,0xa4,0x41,0x21,0x1b,0x00,
-0x00,0x05,0x00,0x9c,0x00,0x20,0x06,0x8f,0x05,0xd9,0x00,0x02,0x00,0x0d,0x00,0x22,
-0x00,0x35,0x00,0x48,0x00,0x9d,0x00,0xb8,0x00,0x36,0x2f,0xb8,0x00,0x27,0x2f,0xba,
-0x00,0x1d,0x00,0x1e,0x00,0x03,0x2b,0xb8,0x00,0x1d,0x10,0xba,0x00,0x06,0x00,0x07,
-0x00,0x03,0x2b,0xb8,0x00,0x06,0x10,0xba,0x00,0x00,0x00,0x27,0x00,0x36,0x11,0x12,
-0x39,0xb8,0x00,0x01,0xd0,0xb8,0x00,0x07,0x10,0xb8,0x00,0x0b,0xd0,0xba,0x00,0x14,
-0x00,0x27,0x00,0x36,0x11,0x12,0x39,0xba,0x00,0x15,0x00,0x27,0x00,0x36,0x11,0x12,
-0x39,0xba,0x00,0x16,0x00,0x07,0x00,0x06,0x11,0x12,0x39,0xb8,0x00,0x1e,0x10,0xb8,
-0x00,0x25,0xd0,0xba,0x00,0x28,0x00,0x1e,0x00,0x1d,0x11,0x12,0x39,0xba,0x00,0x29,
-0x00,0x27,0x00,0x36,0x11,0x12,0x39,0xb8,0x00,0x1d,0x10,0xb8,0x00,0x2a,0xd0,0xb8,
-0x00,0x2a,0x2f,0xba,0x00,0x3a,0x00,0x27,0x00,0x36,0x11,0x12,0x39,0xba,0x00,0x3b,
-0x00,0x27,0x00,0x36,0x11,0x12,0x39,0xba,0x00,0x3c,0x00,0x27,0x00,0x36,0x11,0x12,
-0x39,0x30,0x31,0x01,0x03,0x33,0x03,0x33,0x11,0x33,0x15,0x23,0x15,0x23,0x35,0x21,
-0x35,0x01,0x26,0x35,0x34,0x3f,0x01,0x27,0x37,0x13,0x27,0x07,0x06,0x17,0x16,0x37,
-0x21,0x15,0x21,0x22,0x27,0x26,0x25,0x06,0x07,0x23,0x15,0x27,0x37,0x15,0x33,0x36,
-0x37,0x36,0x27,0x03,0x37,0x13,0x16,0x15,0x14,0x01,0x16,0x1f,0x01,0x37,0x03,0x27,
-0x37,0x27,0x26,0x07,0x06,0x07,0x03,0x27,0x13,0x36,0x37,0x36,0x03,0xb6,0xe6,0xe6,
-0x14,0xb1,0x79,0x79,0x9d,0xfe,0x82,0xfe,0x90,0x2c,0x26,0x54,0x3e,0xeb,0x18,0x3d,
-0x63,0x14,0x24,0x28,0x77,0x01,0x96,0xfe,0x1c,0x4b,0x39,0x2e,0x05,0x8b,0x55,0xaf,
-0xa7,0xd2,0xd2,0xc6,0x3a,0x19,0x19,0x43,0xca,0x88,0xf3,0x25,0xfc,0xe6,0xa9,0x60,
-0x54,0x3f,0x19,0xea,0x3c,0x63,0x26,0x3e,0x3f,0x35,0xcc,0x88,0xf1,0x27,0x38,0x2f,
-0x03,0x52,0xfe,0xff,0x01,0x8a,0xfe,0x76,0x5f,0x8e,0x8e,0x60,0xfe,0x84,0x4d,0x4f,
-0x48,0x4b,0x92,0x24,0x6b,0xfe,0xff,0x24,0xac,0x38,0x32,0x33,0x08,0x9f,0x21,0x1b,
-0x61,0x93,0x0a,0x49,0x97,0x95,0x46,0x0b,0x37,0x3d,0x63,0x01,0x60,0x4f,0xfe,0x5d,
-0x42,0x41,0x36,0x04,0x9e,0x01,0x92,0x91,0x24,0xfe,0xff,0x6b,0x23,0xac,0x2d,0x06,
-0x09,0x6b,0xfe,0xa1,0x4e,0x01,0xa4,0x41,0x21,0x1b,0x00,0x04,0x00,0x9c,0x00,0x20,
-0x06,0x8f,0x05,0xd9,0x00,0x1d,0x00,0x32,0x00,0x45,0x00,0x58,0x00,0xab,0x00,0xb8,
-0x00,0x46,0x2f,0xb8,0x00,0x37,0x2f,0xba,0x00,0x2d,0x00,0x2e,0x00,0x03,0x2b,0xb8,
-0x00,0x2d,0x10,0xba,0x00,0x14,0x00,0x0d,0x00,0x03,0x2b,0xb8,0x00,0x14,0x10,0xba,
-0x00,0x01,0x00,0x02,0x00,0x03,0x2b,0xb8,0x00,0x01,0x10,0xba,0x00,0x11,0x00,0x37,
-0x00,0x46,0x11,0x12,0x39,0xb8,0x00,0x1a,0xdc,0xba,0x00,0x1d,0x00,0x37,0x00,0x46,
-0x11,0x12,0x39,0xba,0x00,0x24,0x00,0x01,0x00,0x1a,0x11,0x12,0x39,0xba,0x00,0x25,
-0x00,0x01,0x00,0x1a,0x11,0x12,0x39,0xba,0x00,0x26,0x00,0x37,0x00,0x46,0x11,0x12,
-0x39,0xb8,0x00,0x2e,0x10,0xb8,0x00,0x35,0xd0,0xba,0x00,0x38,0x00,0x2e,0x00,0x2d,
-0x11,0x12,0x39,0xba,0x00,0x39,0x00,0x37,0x00,0x46,0x11,0x12,0x39,0xb8,0x00,0x2d,
-0x10,0xb8,0x00,0x3a,0xd0,0xb8,0x00,0x3a,0x2f,0xba,0x00,0x4a,0x00,0x37,0x00,0x46,
-0x11,0x12,0x39,0xba,0x00,0x4b,0x00,0x37,0x00,0x46,0x11,0x12,0x39,0xba,0x00,0x4c,
-0x00,0x37,0x00,0x46,0x11,0x12,0x39,0x30,0x31,0x01,0x21,0x15,0x21,0x15,0x06,0x36,
-0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x35,0x1e,0x01,0x33,0x32,0x36,
-0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x01,0x26,0x35,0x34,0x3f,0x01,0x27,0x37,0x13,
-0x27,0x07,0x06,0x17,0x16,0x37,0x21,0x15,0x21,0x22,0x27,0x26,0x25,0x06,0x07,0x23,
-0x15,0x27,0x37,0x15,0x33,0x36,0x37,0x36,0x27,0x03,0x37,0x13,0x16,0x15,0x14,0x01,
-0x16,0x1f,0x01,0x37,0x03,0x27,0x37,0x27,0x26,0x07,0x06,0x07,0x03,0x27,0x13,0x36,
-0x37,0x36,0x02,0xbb,0x01,0xc3,0xfe,0xc5,0x02,0x31,0x18,0x8b,0xa2,0xa7,0x96,0x32,
-0x68,0x46,0x4c,0x5d,0x35,0x52,0x5d,0x5d,0x52,0x27,0x50,0x46,0xfe,0x0d,0x2c,0x26,
-0x54,0x3e,0xeb,0x18,0x3d,0x63,0x14,0x24,0x28,0x77,0x01,0x96,0xfe,0x1c,0x4b,0x39,
-0x2e,0x05,0x8b,0x55,0xaf,0xa7,0xd2,0xd2,0xc6,0x3a,0x19,0x19,0x43,0xca,0x88,0xf3,
-0x25,0xfc,0xe6,0xa9,0x60,0x54,0x3f,0x19,0xea,0x3c,0x63,0x26,0x3e,0x3f,0x35,0xcc,
-0x88,0xf1,0x27,0x38,0x2f,0x03,0xd0,0x5f,0x70,0x01,0x07,0x74,0x63,0x64,0x72,0x0e,
-0x0f,0x72,0x1f,0x12,0x40,0x38,0x39,0x40,0x0d,0x19,0xfe,0x53,0x4d,0x4f,0x48,0x4b,
-0x92,0x24,0x6b,0xfe,0xff,0x24,0xac,0x38,0x32,0x33,0x08,0x9f,0x21,0x1b,0x61,0x93,
-0x0a,0x49,0x97,0x95,0x46,0x0b,0x37,0x3d,0x63,0x01,0x60,0x4f,0xfe,0x5d,0x42,0x41,
-0x36,0x04,0x9e,0x01,0x92,0x91,0x24,0xfe,0xff,0x6b,0x23,0xac,0x2d,0x06,0x09,0x6b,
-0xfe,0xa1,0x4e,0x01,0xa4,0x41,0x21,0x1b,0x00,0x05,0x00,0x9c,0x00,0x20,0x06,0x8f,
-0x05,0xd9,0x00,0x0b,0x00,0x24,0x00,0x39,0x00,0x4c,0x00,0x5f,0x01,0x0d,0xba,0x00,
-0x09,0x00,0x03,0x00,0x03,0x2b,0xb8,0x00,0x09,0x10,0x41,0x1b,0x00,0x16,0x00,0x09,
-0x00,0x26,0x00,0x09,0x00,0x36,0x00,0x09,0x00,0x46,0x00,0x09,0x00,0x56,0x00,0x09,
-0x00,0x66,0x00,0x09,0x00,0x76,0x00,0x09,0x00,0x86,0x00,0x09,0x00,0x96,0x00,0x09,
-0x00,0xa6,0x00,0x09,0x00,0xb6,0x00,0x09,0x00,0xc6,0x00,0x09,0x00,0xd6,0x00,0x09,
-0x00,0x0d,0x5d,0x41,0x05,0x00,0xe5,0x00,0x09,0x00,0xf5,0x00,0x09,0x00,0x02,0x5d,
-0xb8,0x00,0x03,0x10,0xb8,0x00,0x13,0xd0,0xb8,0x00,0x13,0x2f,0xba,0x00,0x3f,0x00,
-0x03,0x00,0x09,0x11,0x12,0x39,0x00,0xb8,0x00,0x4d,0x2f,0xb8,0x00,0x3e,0x2f,0xba,
-0x00,0x34,0x00,0x35,0x00,0x03,0x2b,0xb8,0x00,0x34,0x10,0xba,0x00,0x06,0x00,0x1c,
-0x00,0x03,0x2b,0xb8,0x00,0x06,0x10,0xba,0x00,0x22,0x00,0x00,0x00,0x03,0x2b,0xb8,
-0x00,0x22,0x10,0xba,0x00,0x0d,0x00,0x00,0x00,0x22,0x11,0x12,0x39,0xb8,0x00,0x00,
-0x10,0xb8,0x00,0x16,0xdc,0xba,0x00,0x2b,0x00,0x3e,0x00,0x4d,0x11,0x12,0x39,0xba,
-0x00,0x2c,0x00,0x00,0x00,0x22,0x11,0x12,0x39,0xba,0x00,0x2d,0x00,0x3e,0x00,0x4d,
-0x11,0x12,0x39,0xb8,0x00,0x35,0x10,0xb8,0x00,0x3c,0xd0,0xba,0x00,0x3f,0x00,0x35,
-0x00,0x34,0x11,0x12,0x39,0xba,0x00,0x40,0x00,0x3e,0x00,0x4d,0x11,0x12,0x39,0xb8,
-0x00,0x34,0x10,0xb8,0x00,0x41,0xd0,0xb8,0x00,0x41,0x2f,0xba,0x00,0x51,0x00,0x3e,
-0x00,0x4d,0x11,0x12,0x39,0xba,0x00,0x52,0x00,0x00,0x00,0x22,0x11,0x12,0x39,0xba,
-0x00,0x53,0x00,0x3e,0x00,0x4d,0x11,0x12,0x39,0x30,0x31,0x01,0x22,0x06,0x15,0x14,
-0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x13,0x15,0x2e,0x01,0x23,0x22,0x06,0x07,0x06,
-0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,
-0x01,0x26,0x35,0x34,0x3f,0x01,0x27,0x37,0x13,0x27,0x07,0x06,0x17,0x16,0x37,0x21,
-0x15,0x21,0x22,0x27,0x26,0x25,0x06,0x07,0x23,0x15,0x27,0x37,0x15,0x33,0x36,0x37,
-0x36,0x27,0x03,0x37,0x13,0x16,0x15,0x14,0x01,0x16,0x1f,0x01,0x37,0x03,0x27,0x37,
-0x27,0x26,0x07,0x06,0x07,0x03,0x27,0x13,0x36,0x37,0x36,0x03,0x86,0x37,0x44,0x44,
-0x37,0x3a,0x42,0x42,0x99,0x3d,0x46,0x22,0x57,0x5c,0x03,0x07,0x5d,0x38,0x75,0x87,
-0x8d,0x75,0x85,0x8c,0xa9,0x92,0x26,0x4d,0xfc,0xa5,0x2c,0x26,0x54,0x3e,0xeb,0x18,
-0x3d,0x63,0x14,0x24,0x28,0x77,0x01,0x96,0xfe,0x1c,0x4b,0x39,0x2e,0x05,0x8b,0x55,
-0xaf,0xa7,0xd2,0xd2,0xc6,0x3a,0x19,0x19,0x43,0xca,0x88,0xf3,0x25,0xfc,0xe6,0xa9,
-0x60,0x54,0x3f,0x19,0xea,0x3c,0x63,0x26,0x3e,0x3f,0x35,0xcc,0x88,0xf1,0x27,0x38,
-0x2f,0x02,0xbc,0x41,0x3b,0x3b,0x40,0x40,0x3b,0x3b,0x41,0x01,0x0e,0x66,0x16,0x0e,
-0x60,0x35,0x07,0x28,0x73,0x61,0x5f,0x74,0xa5,0x96,0x8f,0xae,0x0c,0xfc,0xfd,0x4d,
-0x4f,0x48,0x4b,0x92,0x24,0x6b,0xfe,0xff,0x24,0xac,0x38,0x32,0x33,0x08,0x9f,0x21,
-0x1b,0x61,0x93,0x0a,0x49,0x97,0x95,0x46,0x0b,0x37,0x3d,0x63,0x01,0x60,0x4f,0xfe,
-0x5d,0x42,0x41,0x36,0x04,0x9e,0x01,0x92,0x91,0x24,0xfe,0xff,0x6b,0x23,0xac,0x2d,
-0x06,0x09,0x6b,0xfe,0xa1,0x4e,0x01,0xa4,0x41,0x21,0x1b,0x00,0x00,0x04,0x00,0x9c,
-0x00,0x20,0x06,0x8f,0x05,0xd9,0x00,0x06,0x00,0x1b,0x00,0x2e,0x00,0x41,0x00,0x87,
-0x00,0xb8,0x00,0x2f,0x2f,0xb8,0x00,0x20,0x2f,0xba,0x00,0x16,0x00,0x17,0x00,0x03,
-0x2b,0xb8,0x00,0x16,0x10,0xba,0x00,0x01,0x00,0x05,0x00,0x03,0x2b,0xb8,0x00,0x01,
-0x10,0xba,0x00,0x0d,0x00,0x20,0x00,0x2f,0x11,0x12,0x39,0xba,0x00,0x0e,0x00,0x20,
-0x00,0x2f,0x11,0x12,0x39,0xba,0x00,0x0f,0x00,0x20,0x00,0x2f,0x11,0x12,0x39,0xb8,
-0x00,0x17,0x10,0xb8,0x00,0x1e,0xd0,0xba,0x00,0x21,0x00,0x17,0x00,0x16,0x11,0x12,
-0x39,0xba,0x00,0x22,0x00,0x20,0x00,0x2f,0x11,0x12,0x39,0xb8,0x00,0x16,0x10,0xb8,
-0x00,0x23,0xd0,0xb8,0x00,0x23,0x2f,0xba,0x00,0x33,0x00,0x20,0x00,0x2f,0x11,0x12,
-0x39,0xba,0x00,0x34,0x00,0x20,0x00,0x2f,0x11,0x12,0x39,0xba,0x00,0x35,0x00,0x20,
-0x00,0x2f,0x11,0x12,0x39,0x30,0x31,0x01,0x21,0x15,0x01,0x23,0x13,0x21,0x01,0x26,
-0x35,0x34,0x3f,0x01,0x27,0x37,0x13,0x27,0x07,0x06,0x17,0x16,0x37,0x21,0x15,0x21,
-0x22,0x27,0x26,0x25,0x06,0x07,0x23,0x15,0x27,0x37,0x15,0x33,0x36,0x37,0x36,0x27,
-0x03,0x37,0x13,0x16,0x15,0x14,0x01,0x16,0x1f,0x01,0x37,0x03,0x27,0x37,0x27,0x26,
-0x07,0x06,0x07,0x03,0x27,0x13,0x36,0x37,0x36,0x02,0xa2,0x02,0x02,0xfe,0xf0,0x93,
-0xfe,0xfe,0xa3,0xfe,0x26,0x2c,0x26,0x54,0x3e,0xeb,0x18,0x3d,0x63,0x14,0x24,0x28,
-0x77,0x01,0x96,0xfe,0x1c,0x4b,0x39,0x2e,0x05,0x8b,0x55,0xaf,0xa7,0xd2,0xd2,0xc6,
-0x3a,0x19,0x19,0x43,0xca,0x88,0xf3,0x25,0xfc,0xe6,0xa9,0x60,0x54,0x3f,0x19,0xea,
-0x3c,0x63,0x26,0x3e,0x3f,0x35,0xcc,0x88,0xf1,0x27,0x38,0x2f,0x03,0xba,0x32,0xfd,
-0xb9,0x02,0x1a,0xfd,0x7b,0x4d,0x4f,0x48,0x4b,0x92,0x24,0x6b,0xfe,0xff,0x24,0xac,
-0x38,0x32,0x33,0x08,0x9f,0x21,0x1b,0x61,0x93,0x0a,0x49,0x97,0x95,0x46,0x0b,0x37,
-0x3d,0x63,0x01,0x60,0x4f,0xfe,0x5d,0x42,0x41,0x36,0x04,0x9e,0x01,0x92,0x91,0x24,
-0xfe,0xff,0x6b,0x23,0xac,0x2d,0x06,0x09,0x6b,0xfe,0xa1,0x4e,0x01,0xa4,0x41,0x21,
-0x1b,0x00,0x00,0x03,0x00,0x9c,0x00,0x20,0x06,0x8f,0x05,0xd9,0x00,0x14,0x00,0x27,
-0x00,0x3a,0x00,0x7b,0x00,0xb8,0x00,0x28,0x2f,0xb8,0x00,0x19,0x2f,0xba,0x00,0x0f,
-0x00,0x10,0x00,0x03,0x2b,0xb8,0x00,0x0f,0x10,0xba,0x00,0x06,0x00,0x19,0x00,0x28,
-0x11,0x12,0x39,0xba,0x00,0x07,0x00,0x19,0x00,0x28,0x11,0x12,0x39,0xba,0x00,0x08,
-0x00,0x19,0x00,0x28,0x11,0x12,0x39,0xb8,0x00,0x10,0x10,0xb8,0x00,0x17,0xd0,0xba,
-0x00,0x1a,0x00,0x10,0x00,0x0f,0x11,0x12,0x39,0xba,0x00,0x1b,0x00,0x19,0x00,0x28,
-0x11,0x12,0x39,0xb8,0x00,0x0f,0x10,0xb8,0x00,0x1c,0xd0,0xb8,0x00,0x1c,0x2f,0xba,
-0x00,0x2c,0x00,0x19,0x00,0x28,0x11,0x12,0x39,0xba,0x00,0x2d,0x00,0x19,0x00,0x28,
-0x11,0x12,0x39,0xba,0x00,0x2e,0x00,0x19,0x00,0x28,0x11,0x12,0x39,0x30,0x31,0x37,
-0x26,0x35,0x34,0x3f,0x01,0x27,0x37,0x13,0x27,0x07,0x06,0x17,0x16,0x37,0x21,0x15,
-0x21,0x22,0x27,0x26,0x25,0x06,0x07,0x23,0x15,0x27,0x37,0x15,0x33,0x36,0x37,0x36,
-0x27,0x03,0x37,0x13,0x16,0x15,0x14,0x01,0x16,0x1f,0x01,0x37,0x03,0x27,0x37,0x27,
-0x26,0x07,0x06,0x07,0x03,0x27,0x13,0x36,0x37,0x36,0xc8,0x2c,0x26,0x54,0x3e,0xeb,
-0x18,0x3d,0x63,0x14,0x24,0x28,0x77,0x01,0x96,0xfe,0x1c,0x4b,0x39,0x2e,0x05,0x8b,
-0x55,0xaf,0xa7,0xd2,0xd2,0xc6,0x3a,0x19,0x19,0x43,0xca,0x88,0xf3,0x25,0xfc,0xe6,
-0xa9,0x60,0x54,0x3f,0x19,0xea,0x3c,0x63,0x26,0x3e,0x3f,0x35,0xcc,0x88,0xf1,0x27,
-0x38,0x2f,0xd6,0x4d,0x4f,0x48,0x4b,0x92,0x24,0x6b,0xfe,0xff,0x24,0xac,0x38,0x32,
-0x33,0x08,0x9f,0x21,0x1b,0x61,0x93,0x0a,0x49,0x97,0x95,0x46,0x0b,0x37,0x3d,0x63,
-0x01,0x60,0x4f,0xfe,0x5d,0x42,0x41,0x36,0x04,0x9e,0x01,0x92,0x91,0x24,0xfe,0xff,
-0x6b,0x23,0xac,0x2d,0x06,0x09,0x6b,0xfe,0xa1,0x4e,0x01,0xa4,0x41,0x21,0x1b,0x00,
-0x00,0x06,0x00,0xac,0x00,0x00,0x06,0x7f,0x05,0xa1,0x00,0x10,0x00,0x1a,0x00,0x27,
-0x00,0x39,0x00,0x48,0x00,0x52,0x00,0x6d,0x00,0xb8,0x00,0x00,0x2f,0xb8,0x00,0x11,
-0x2f,0xb8,0x00,0x46,0x2f,0xba,0x00,0x3d,0x00,0x44,0x00,0x03,0x2b,0xb8,0x00,0x3d,
-0x10,0xba,0x00,0x07,0x00,0x46,0x00,0x00,0x11,0x12,0x39,0xba,0x00,0x0b,0x00,0x46,
-0x00,0x00,0x11,0x12,0x39,0xba,0x00,0x2a,0x00,0x46,0x00,0x00,0x11,0x12,0x39,0xba,
-0x00,0x30,0x00,0x44,0x00,0x3d,0x11,0x12,0x39,0xba,0x00,0x38,0x00,0x46,0x00,0x00,
-0x11,0x12,0x39,0xba,0x00,0x3b,0x00,0x46,0x00,0x00,0x11,0x12,0x39,0xba,0x00,0x40,
-0x00,0x46,0x00,0x00,0x11,0x12,0x39,0xb8,0x00,0x49,0xd0,0xb8,0x00,0x44,0x10,0xb8,
-0x00,0x4c,0xd0,0x30,0x31,0x01,0x21,0x32,0x1f,0x01,0x37,0x33,0x15,0x02,0x07,0x21,
-0x35,0x36,0x37,0x03,0x26,0x23,0x07,0x32,0x1f,0x01,0x03,0x24,0x27,0x12,0x37,0x36,
-0x01,0x12,0x15,0x17,0x14,0x07,0x06,0x2b,0x01,0x26,0x03,0x36,0x37,0x05,0x12,0x17,
-0x27,0x02,0x0f,0x01,0x17,0x23,0x03,0x27,0x36,0x37,0x36,0x35,0x27,0x35,0x33,0x01,
-0x33,0x15,0x21,0x32,0x37,0x33,0x14,0x03,0x06,0x2b,0x01,0x15,0x23,0x03,0x27,0x17,
-0x11,0x07,0x21,0x22,0x2f,0x01,0x34,0x37,0x03,0x2a,0x01,0x86,0x3a,0x21,0x4a,0x63,
-0x06,0x9d,0x10,0xfe,0xa9,0x61,0x05,0xc6,0x23,0x0d,0x66,0x69,0x2a,0x31,0xc1,0xfe,
-0xf5,0x1b,0x95,0x16,0x31,0x03,0x5a,0xa6,0x02,0x61,0x0f,0x28,0x7d,0x0e,0xaf,0x18,
-0xc9,0xfc,0x79,0xab,0x02,0x70,0xc0,0x04,0x03,0x05,0x05,0xc9,0x08,0x04,0x50,0x1a,
-0x64,0xe4,0x02,0xd8,0x02,0x01,0x8a,0x21,0x1e,0x03,0xc9,0x18,0x1f,0xcc,0x05,0xa8,
-0x5e,0x05,0x05,0xfe,0xde,0x74,0x2f,0x05,0x54,0x05,0xa1,0x54,0x7d,0x37,0x02,0xfe,
-0xed,0x15,0x05,0x35,0x09,0x01,0x62,0x1a,0x05,0x5c,0x56,0xfe,0xb6,0x9a,0x13,0x01,
-0x04,0x1c,0x2f,0xfe,0x56,0xfe,0xea,0x17,0x27,0x66,0x3a,0x08,0x0f,0x01,0x3a,0x17,
-0x70,0x1b,0xfe,0xe0,0x0d,0x3f,0xfe,0xb6,0x10,0x29,0x1d,0x01,0x5c,0x20,0x1f,0x80,
-0x29,0x0b,0x39,0x03,0xfe,0xa5,0x73,0x1a,0x09,0xfe,0xa4,0x17,0x73,0x01,0x25,0xb0,
-0x06,0xfe,0xa9,0x05,0x80,0x30,0x30,0x82,0x00,0x07,0x00,0xaa,0x00,0x00,0x06,0x83,
-0x05,0xd9,0x00,0x13,0x00,0x25,0x00,0x32,0x00,0x3c,0x00,0x4a,0x00,0x5c,0x00,0x65,
-0x00,0x39,0x00,0xba,0x00,0x64,0x00,0x0b,0x00,0x03,0x2b,0xb8,0x00,0x64,0x10,0xba,
-0x00,0x00,0x00,0x14,0x00,0x03,0x2b,0xb8,0x00,0x00,0x10,0xb8,0x00,0x14,0x10,0xb8,
-0x00,0x2e,0xd0,0xb8,0x00,0x2e,0x2f,0xba,0x00,0x4f,0x00,0x0b,0x00,0x64,0x11,0x12,
-0x39,0xb8,0x00,0x64,0x10,0xb8,0x00,0x51,0xd0,0x30,0x31,0x01,0x33,0x20,0x13,0x16,
-0x1d,0x01,0x10,0x05,0x06,0x2b,0x01,0x20,0x03,0x26,0x3d,0x01,0x10,0x25,0x36,0x17,
-0x15,0x32,0x1f,0x01,0x15,0x06,0x07,0x15,0x21,0x36,0x37,0x23,0x07,0x26,0x27,0x26,
-0x23,0x01,0x16,0x33,0x36,0x13,0x26,0x23,0x26,0x23,0x22,0x07,0x06,0x07,0x05,0x15,
-0x13,0x33,0x32,0x37,0x34,0x2f,0x01,0x22,0x05,0x17,0x06,0x07,0x14,0x1f,0x01,0x33,
-0x34,0x3f,0x01,0x33,0x17,0x27,0x01,0x07,0x16,0x17,0x33,0x35,0x37,0x33,0x32,0x3f,
-0x01,0x35,0x23,0x06,0x23,0x21,0x27,0x35,0x05,0x06,0x1d,0x01,0x14,0x1f,0x01,0x33,
-0x11,0x03,0x89,0x1b,0x01,0x8b,0xf3,0x61,0xfe,0x6f,0xa3,0xb7,0x03,0xfe,0x50,0xe8,
-0x53,0x01,0x3c,0xbe,0x89,0x26,0x33,0x79,0x1b,0x3a,0x01,0x18,0x0a,0x84,0x03,0x53,
-0x4f,0x12,0x15,0x1a,0xfd,0x88,0xf2,0x09,0x04,0x95,0x42,0x17,0x1d,0x32,0x5f,0x35,
-0x4e,0x0d,0x02,0x81,0x99,0x76,0x62,0x1a,0x65,0x29,0x0e,0xfb,0xcd,0x50,0x4b,0x0b,
-0x8b,0x1d,0x03,0x1b,0x8e,0x09,0x4c,0x8b,0x01,0xf9,0x87,0x06,0x81,0x03,0x06,0xac,
-0x24,0x3d,0x6a,0x03,0x16,0x22,0xfe,0xc4,0x06,0xfd,0xea,0x41,0x6a,0x1a,0xfc,0x05,
-0xd9,0xfe,0x92,0xae,0xcf,0x06,0xfe,0x4f,0xeb,0x4c,0x01,0x86,0xa8,0xa3,0x35,0x01,
-0x5f,0xf1,0x83,0x93,0x03,0x6b,0xce,0x03,0x16,0x1f,0x03,0x08,0xf0,0x2c,0x89,0x16,
-0x0c,0xfe,0xdf,0x8b,0x0f,0x01,0x01,0x7e,0x12,0x79,0x7d,0x1f,0xde,0x03,0xfe,0xf4,
-0x8a,0x2f,0x9d,0x4d,0x3c,0x34,0x7b,0x31,0x16,0xe8,0x3b,0x43,0x19,0xf8,0x2c,0xf1,
-0xfe,0xe5,0xfb,0x03,0xec,0x5b,0x06,0x80,0xb1,0x03,0x10,0x06,0x5f,0x65,0x69,0x27,
-0x0c,0x5b,0x29,0x04,0x01,0x24,0x00,0x08,0x00,0xaa,0x00,0x00,0x06,0x83,0x05,0xd9,
-0x00,0x0f,0x00,0x20,0x00,0x2f,0x00,0x3a,0x00,0x42,0x00,0x52,0x00,0x60,0x00,0x6a,
-0x01,0x5f,0xb8,0x00,0x6b,0x2f,0xb8,0x00,0x6c,0x2f,0xb8,0x00,0x04,0xdc,0xb8,0x00,
-0x6b,0x10,0xb8,0x00,0x0c,0xd0,0xb8,0x00,0x0c,0x2f,0xb8,0x00,0x10,0xdc,0x41,0x1b,
-0x00,0x16,0x00,0x10,0x00,0x26,0x00,0x10,0x00,0x36,0x00,0x10,0x00,0x46,0x00,0x10,
-0x00,0x56,0x00,0x10,0x00,0x66,0x00,0x10,0x00,0x76,0x00,0x10,0x00,0x86,0x00,0x10,
-0x00,0x96,0x00,0x10,0x00,0xa6,0x00,0x10,0x00,0xb6,0x00,0x10,0x00,0xc6,0x00,0x10,
-0x00,0xd6,0x00,0x10,0x00,0x0d,0x5d,0x41,0x05,0x00,0xe5,0x00,0x10,0x00,0xf5,0x00,
-0x10,0x00,0x02,0x5d,0xb8,0x00,0x04,0x10,0xb8,0x00,0x19,0xdc,0x41,0x05,0x00,0xea,
-0x00,0x19,0x00,0xfa,0x00,0x19,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,0x19,0x00,
-0x29,0x00,0x19,0x00,0x39,0x00,0x19,0x00,0x49,0x00,0x19,0x00,0x59,0x00,0x19,0x00,
-0x69,0x00,0x19,0x00,0x79,0x00,0x19,0x00,0x89,0x00,0x19,0x00,0x99,0x00,0x19,0x00,
-0xa9,0x00,0x19,0x00,0xb9,0x00,0x19,0x00,0xc9,0x00,0x19,0x00,0xd9,0x00,0x19,0x00,
-0x0d,0x5d,0xba,0x00,0x27,0x00,0x0c,0x00,0x04,0x11,0x12,0x39,0xba,0x00,0x2b,0x00,
-0x0c,0x00,0x04,0x11,0x12,0x39,0xba,0x00,0x47,0x00,0x0c,0x00,0x04,0x11,0x12,0x39,
-0xba,0x00,0x4c,0x00,0x0c,0x00,0x04,0x11,0x12,0x39,0xba,0x00,0x54,0x00,0x0c,0x00,
-0x04,0x11,0x12,0x39,0xba,0x00,0x59,0x00,0x0c,0x00,0x04,0x11,0x12,0x39,0xba,0x00,
-0x5f,0x00,0x0c,0x00,0x04,0x11,0x12,0x39,0x00,0xba,0x00,0x14,0x00,0x08,0x00,0x03,
-0x2b,0xb8,0x00,0x14,0x10,0xba,0x00,0x00,0x00,0x1d,0x00,0x03,0x2b,0xb8,0x00,0x00,
-0x10,0xba,0x00,0x56,0x00,0x5b,0x00,0x03,0x2b,0xb8,0x00,0x56,0x10,0xba,0x00,0x22,
-0x00,0x29,0x00,0x03,0x2b,0xb8,0x00,0x22,0x10,0xba,0x00,0x27,0x00,0x29,0x00,0x22,
-0x11,0x12,0x39,0xba,0x00,0x2b,0x00,0x29,0x00,0x22,0x11,0x12,0x39,0xb8,0x00,0x30,
-0xd0,0xb8,0x00,0x30,0x2f,0xba,0x00,0x4c,0x00,0x5b,0x00,0x56,0x11,0x12,0x39,0xb8,
-0x00,0x56,0x10,0xb8,0x00,0x61,0xd0,0xb8,0x00,0x5b,0x10,0xb8,0x00,0x65,0xd0,0x30,
-0x31,0x01,0x20,0x13,0x16,0x15,0x10,0x05,0x06,0x23,0x20,0x03,0x26,0x35,0x10,0x25,
-0x36,0x01,0x10,0x05,0x16,0x3b,0x01,0x20,0x13,0x36,0x35,0x10,0x25,0x26,0x23,0x20,
-0x03,0x06,0x01,0x21,0x32,0x1f,0x01,0x37,0x15,0x06,0x07,0x21,0x35,0x37,0x26,0x2f,
-0x01,0x23,0x32,0x1f,0x01,0x03,0x23,0x26,0x27,0x36,0x37,0x36,0x01,0x16,0x1d,0x01,
-0x06,0x2b,0x01,0x03,0x25,0x21,0x17,0x07,0x23,0x27,0x23,0x02,0x07,0x15,0x26,0x03,
-0x27,0x34,0x37,0x27,0x01,0x33,0x15,0x21,0x32,0x37,0x15,0x03,0x07,0x23,0x07,0x15,
-0x23,0x27,0x25,0x21,0x17,0x11,0x07,0x23,0x22,0x2f,0x01,0x36,0x03,0x98,0x01,0x97,
-0xed,0x67,0xfe,0x84,0xa4,0xd1,0xfe,0x5e,0xe7,0x5f,0x01,0x88,0xaa,0xfd,0xf9,0x01,
-0x62,0x9d,0xaa,0x30,0x01,0x68,0xe5,0x5c,0xfe,0x96,0xa0,0xb8,0xfe,0x7b,0xdf,0x5c,
-0x02,0x5b,0x01,0x3a,0x35,0x18,0x3a,0x51,0x6d,0x1b,0xfe,0xf0,0x4d,0x92,0x1a,0x1b,
-0x4d,0x5b,0x1e,0x2d,0x9a,0x03,0xe3,0x12,0x77,0x1c,0x2c,0x02,0xa3,0x89,0x15,0x6c,
-0x64,0x9c,0xfc,0xd8,0x01,0x14,0x91,0x03,0x03,0x4e,0x03,0xa6,0x06,0x0c,0x9c,0x02,
-0x56,0x4e,0x02,0xfd,0x06,0x01,0x47,0x14,0x18,0xad,0x17,0xa9,0x06,0x06,0x87,0xfe,
-0x8a,0x01,0x2b,0x06,0x06,0xf5,0x51,0x27,0x06,0x01,0x05,0xd9,0xfe,0x97,0xb2,0xd4,
-0xfe,0x58,0xe9,0x59,0x01,0x74,0xa2,0xdb,0x01,0xa9,0xeb,0x54,0xfd,0x12,0xfe,0x70,
-0xd8,0x58,0x01,0x59,0xa5,0xc5,0x01,0x8c,0xe0,0x53,0xfe,0xa6,0x9f,0x01,0x6d,0x45,
-0x62,0x2c,0x03,0xcc,0x23,0x03,0x34,0xfe,0x27,0x0c,0x46,0x56,0xfe,0xfe,0x7f,0x10,
-0xd5,0x1a,0x20,0xfe,0xa7,0xe2,0x21,0x17,0x82,0x01,0x09,0x59,0xf4,0x03,0x31,0xfe,
-0xea,0x15,0x1a,0x0b,0x01,0x12,0x11,0x1c,0x8d,0x31,0xfe,0xec,0x5f,0x14,0x06,0xfe,
-0xdc,0x09,0x06,0x55,0xee,0x8c,0x05,0xfe,0xeb,0x05,0x67,0x2c,0x31,0x00,0x00,0x05,
-0x00,0xaa,0x00,0x00,0x06,0x83,0x05,0xd9,0x00,0x07,0x00,0x17,0x00,0x1f,0x00,0x37,
-0x00,0x48,0x01,0xb3,0xba,0x00,0x38,0x00,0x14,0x00,0x03,0x2b,0xb8,0x00,0x38,0x10,
-0xba,0x00,0x00,0x00,0x27,0x00,0x03,0x2b,0xb8,0x00,0x00,0x10,0xba,0x00,0x31,0x00,
-0x1e,0x00,0x03,0x2b,0xb8,0x00,0x31,0x10,0xba,0x00,0x0c,0x00,0x41,0x00,0x03,0x2b,
-0xb8,0x00,0x0c,0x10,0x41,0x1b,0x00,0x16,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x36,
-0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x76,
-0x00,0x00,0x00,0x86,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0xb6,
-0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0x0d,0x5d,0x41,0x05,0x00,
-0xe5,0x00,0x00,0x00,0xf5,0x00,0x00,0x00,0x02,0x5d,0x41,0x05,0x00,0xea,0x00,0x1e,
-0x00,0xfa,0x00,0x1e,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,0x1e,0x00,0x29,0x00,
-0x1e,0x00,0x39,0x00,0x1e,0x00,0x49,0x00,0x1e,0x00,0x59,0x00,0x1e,0x00,0x69,0x00,
-0x1e,0x00,0x79,0x00,0x1e,0x00,0x89,0x00,0x1e,0x00,0x99,0x00,0x1e,0x00,0xa9,0x00,
-0x1e,0x00,0xb9,0x00,0x1e,0x00,0xc9,0x00,0x1e,0x00,0xd9,0x00,0x1e,0x00,0x0d,0x5d,
-0xba,0x00,0x20,0x00,0x14,0x00,0x0c,0x11,0x12,0x39,0xba,0x00,0x2c,0x00,0x14,0x00,
-0x0c,0x11,0x12,0x39,0x41,0x1b,0x00,0x16,0x00,0x38,0x00,0x26,0x00,0x38,0x00,0x36,
-0x00,0x38,0x00,0x46,0x00,0x38,0x00,0x56,0x00,0x38,0x00,0x66,0x00,0x38,0x00,0x76,
-0x00,0x38,0x00,0x86,0x00,0x38,0x00,0x96,0x00,0x38,0x00,0xa6,0x00,0x38,0x00,0xb6,
-0x00,0x38,0x00,0xc6,0x00,0x38,0x00,0xd6,0x00,0x38,0x00,0x0d,0x5d,0x41,0x05,0x00,
-0xe5,0x00,0x38,0x00,0xf5,0x00,0x38,0x00,0x02,0x5d,0x41,0x05,0x00,0xea,0x00,0x41,
-0x00,0xfa,0x00,0x41,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,0x41,0x00,0x29,0x00,
-0x41,0x00,0x39,0x00,0x41,0x00,0x49,0x00,0x41,0x00,0x59,0x00,0x41,0x00,0x69,0x00,
-0x41,0x00,0x79,0x00,0x41,0x00,0x89,0x00,0x41,0x00,0x99,0x00,0x41,0x00,0xa9,0x00,
-0x41,0x00,0xb9,0x00,0x41,0x00,0xc9,0x00,0x41,0x00,0xd9,0x00,0x41,0x00,0x0d,0x5d,
-0xb8,0x00,0x4a,0xdc,0x00,0xba,0x00,0x3c,0x00,0x10,0x00,0x03,0x2b,0xb8,0x00,0x3c,
-0x10,0xba,0x00,0x08,0x00,0x45,0x00,0x03,0x2b,0xb8,0x00,0x08,0x10,0xba,0x00,0x02,
-0x00,0x24,0x00,0x03,0x2b,0xb8,0x00,0x02,0x10,0xba,0x00,0x2a,0x00,0x06,0x00,0x03,
-0x2b,0xb8,0x00,0x2a,0x10,0xb8,0x00,0x06,0x10,0xb8,0x00,0x18,0xd0,0xb8,0x00,0x02,
-0x10,0xb8,0x00,0x1c,0xd0,0xb8,0x00,0x2a,0x10,0xb8,0x00,0x2e,0xd0,0xb8,0x00,0x24,
-0x10,0xb8,0x00,0x34,0xd0,0x30,0x31,0x01,0x16,0x17,0x32,0x37,0x26,0x27,0x06,0x01,
-0x20,0x13,0x16,0x15,0x10,0x05,0x06,0x23,0x20,0x03,0x26,0x35,0x10,0x25,0x36,0x01,
-0x06,0x07,0x16,0x33,0x36,0x37,0x26,0x01,0x15,0x23,0x06,0x27,0x2e,0x01,0x37,0x26,
-0x36,0x37,0x32,0x17,0x36,0x33,0x1e,0x01,0x07,0x16,0x06,0x07,0x06,0x27,0x23,0x25,
-0x10,0x05,0x16,0x3b,0x01,0x20,0x13,0x36,0x35,0x10,0x25,0x26,0x23,0x20,0x03,0x06,
-0x01,0xc2,0x02,0xb7,0x90,0x61,0x57,0xa2,0xaf,0x01,0xd4,0x01,0x97,0xed,0x67,0xfe,
-0x84,0xa4,0xd1,0xfe,0x5e,0xe7,0x5f,0x01,0x88,0xaa,0x01,0xe1,0xa2,0x57,0x61,0x90,
-0xb7,0x02,0x02,0xfe,0x2b,0x03,0x7b,0xbb,0x8c,0x7f,0x06,0x03,0x9e,0x87,0x9d,0x7f,
-0x80,0x9e,0x87,0x9e,0x03,0x06,0x7f,0x8c,0xbb,0x7c,0x02,0xfd,0x3c,0x01,0x62,0x9d,
-0xaa,0x30,0x01,0x68,0xe5,0x5c,0xfe,0x96,0xa0,0xb8,0xfe,0x7b,0xdf,0x5c,0x02,0xf4,
-0xcd,0x02,0xcb,0xc2,0x04,0x03,0x02,0x26,0xfe,0x97,0xb2,0xd4,0xfe,0x58,0xe9,0x59,
-0x01,0x74,0xa2,0xdb,0x01,0xa9,0xeb,0x54,0xfd,0xdd,0x04,0xc2,0xcb,0x02,0xcd,0xbf,
-0xfe,0xf3,0x1c,0xc5,0x08,0x0f,0xc1,0x57,0x7a,0x9c,0x01,0xaa,0xaa,0x01,0x9c,0x7a,
-0x57,0xc1,0x0f,0x08,0xc5,0x61,0xfe,0x70,0xd8,0x58,0x01,0x59,0xa5,0xc5,0x01,0x8c,
-0xe0,0x53,0xfe,0xa6,0x9f,0x00,0x00,0x02,0x01,0x31,0x00,0x02,0x05,0xfa,0x05,0xd9,
-0x00,0x18,0x00,0x2f,0x00,0x35,0x00,0xb8,0x00,0x00,0x2f,0xba,0x00,0x2a,0x00,0x1b,
-0x00,0x03,0x2b,0xb8,0x00,0x2a,0x10,0xba,0x00,0x0c,0x00,0x14,0x00,0x03,0x2b,0xb8,
-0x00,0x0c,0x10,0xba,0x00,0x06,0x00,0x09,0x00,0x03,0x2b,0xb8,0x00,0x06,0x10,0xba,
-0x00,0x23,0x00,0x09,0x00,0x06,0x11,0x12,0x39,0x30,0x31,0x01,0x32,0x15,0x06,0x07,
-0x17,0x21,0x32,0x17,0x07,0x21,0x17,0x21,0x16,0x13,0x37,0x17,0x06,0x05,0x26,0x03,
-0x21,0x22,0x03,0x34,0x01,0x06,0x23,0x22,0x2e,0x01,0x35,0x34,0x37,0x36,0x37,0x17,
-0x06,0x07,0x14,0x1e,0x01,0x33,0x32,0x36,0x37,0x17,0x06,0x02,0x9a,0x99,0x01,0x80,
-0x18,0x01,0x13,0x0c,0x10,0x04,0xfe,0xed,0x0c,0x01,0xbd,0x0c,0x8d,0x86,0x30,0x05,
-0xfe,0xee,0x10,0x95,0xfe,0x23,0x0c,0x55,0x01,0xf8,0x71,0x7b,0x7c,0xe2,0x7d,0x40,
-0x21,0x2f,0x28,0x19,0x02,0x53,0x98,0x53,0x53,0x97,0x2a,0x45,0x2e,0x05,0xd9,0x8e,
-0xa3,0x02,0xe6,0x92,0x04,0x65,0x06,0xfe,0x72,0x28,0x8d,0x08,0x59,0x18,0x01,0xad,
-0x03,0x24,0x85,0xfa,0x68,0x3f,0x7d,0xe1,0x7d,0x7c,0x72,0x3c,0x2e,0xd9,0x3c,0x43,
-0x53,0x98,0x53,0x53,0x4c,0xa9,0x32,0x00,0x00,0x03,0x00,0x96,0x00,0x00,0x06,0x60,
-0x05,0xcd,0x00,0x17,0x00,0x1b,0x00,0x1f,0x00,0x00,0x01,0x34,0x37,0x36,0x37,0x36,
-0x33,0x32,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x23,0x22,0x27,0x26,
-0x27,0x26,0x01,0x11,0x21,0x11,0x25,0x21,0x11,0x21,0x02,0xef,0x13,0x14,0x1f,0x1b,
-0x2b,0x2a,0x1c,0x1e,0x15,0x13,0x13,0x14,0x1f,0x1c,0x2a,0x2a,0x1c,0x1e,0x15,0x13,
-0xfd,0xa7,0x05,0xca,0xfa,0xdb,0x04,0x80,0xfb,0x80,0x02,0xe9,0x2a,0x1c,0x1e,0x15,
-0x13,0x13,0x14,0x1f,0x1b,0x2b,0x2a,0x1c,0x1e,0x15,0x13,0x13,0x14,0x1f,0x1b,0xfd,
-0x42,0x05,0xcd,0xfa,0x33,0xa5,0x04,0x83,0x00,0x04,0x00,0x96,0x00,0x00,0x06,0x60,
-0x05,0xcd,0x00,0x17,0x00,0x2f,0x00,0x33,0x00,0x37,0x00,0x00,0x01,0x34,0x37,0x36,
-0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x23,0x22,
-0x27,0x26,0x27,0x26,0x01,0x34,0x37,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x16,
-0x15,0x14,0x07,0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x26,0x01,0x11,0x21,0x11,
-0x25,0x21,0x11,0x21,0x01,0xb9,0x13,0x14,0x1f,0x1c,0x2a,0x2a,0x1c,0x1e,0x15,0x13,
-0x13,0x14,0x1f,0x1b,0x2b,0x2a,0x1c,0x1e,0x15,0x13,0x02,0x6c,0x13,0x14,0x1f,0x1b,
-0x2b,0x2a,0x1c,0x1e,0x15,0x13,0x13,0x14,0x1f,0x1c,0x2a,0x2a,0x1c,0x1e,0x15,0x13,
-0xfc,0x71,0x05,0xca,0xfa,0xdb,0x04,0x80,0xfb,0x80,0x01,0xae,0x2a,0x1c,0x1e,0x15,
-0x13,0x13,0x14,0x1f,0x1b,0x2b,0x2a,0x1c,0x1e,0x15,0x13,0x13,0x14,0x1f,0x1b,0x02,
-0x9c,0x2a,0x1c,0x1e,0x15,0x13,0x13,0x14,0x1f,0x1b,0x2b,0x2a,0x1c,0x1e,0x15,0x13,
-0x13,0x14,0x1f,0x1b,0xfc,0x0c,0x05,0xcd,0xfa,0x33,0xa5,0x04,0x83,0x00,0x00,0x05,
-0x00,0x96,0x00,0x00,0x06,0x60,0x05,0xcd,0x00,0x17,0x00,0x2f,0x00,0x47,0x00,0x4b,
-0x00,0x4f,0x00,0x00,0x01,0x34,0x37,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x16,
-0x15,0x14,0x07,0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x26,0x01,0x34,0x37,0x36,
-0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x23,0x22,
-0x27,0x26,0x27,0x26,0x01,0x34,0x37,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x16,
-0x15,0x14,0x07,0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x26,0x01,0x11,0x21,0x11,
-0x25,0x21,0x11,0x21,0x01,0xb9,0x13,0x14,0x1f,0x1c,0x2a,0x2a,0x1c,0x1e,0x15,0x13,
-0x13,0x14,0x1f,0x1b,0x2b,0x2a,0x1c,0x1e,0x15,0x13,0x01,0x36,0x13,0x14,0x1f,0x1b,
-0x2b,0x2a,0x1c,0x1e,0x15,0x13,0x13,0x14,0x1f,0x1c,0x2a,0x2a,0x1c,0x1e,0x15,0x13,
-0x01,0x36,0x13,0x14,0x1f,0x1b,0x2b,0x2a,0x1c,0x1e,0x15,0x13,0x13,0x14,0x1f,0x1c,
-0x2a,0x2a,0x1c,0x1e,0x15,0x13,0xfc,0x71,0x05,0xca,0xfa,0xdb,0x04,0x80,0xfb,0x80,
-0x01,0xae,0x2a,0x1c,0x1e,0x15,0x13,0x13,0x14,0x1f,0x1b,0x2b,0x2a,0x1c,0x1e,0x15,
-0x13,0x13,0x14,0x1f,0x1b,0x01,0x66,0x2a,0x1c,0x1e,0x15,0x13,0x13,0x14,0x1f,0x1b,
-0x2b,0x2a,0x1c,0x1e,0x15,0x13,0x13,0x14,0x1f,0x1b,0x01,0x61,0x2a,0x1c,0x1e,0x15,
-0x13,0x13,0x14,0x1f,0x1b,0x2b,0x2a,0x1c,0x1e,0x15,0x13,0x13,0x14,0x1f,0x1b,0xfc,
-0x0c,0x05,0xcd,0xfa,0x33,0xa5,0x04,0x83,0x00,0x06,0x00,0x96,0x00,0x00,0x06,0x60,
-0x05,0xcd,0x00,0x17,0x00,0x2f,0x00,0x47,0x00,0x5f,0x00,0x63,0x00,0x67,0x00,0x00,
-0x01,0x34,0x37,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,
-0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x26,0x01,0x34,0x37,0x36,0x37,0x36,0x33,0x32,
-0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x26,
-0x25,0x34,0x37,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,
-0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x26,0x01,0x34,0x37,0x36,0x37,0x36,0x33,0x32,
-0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x26,
-0x01,0x11,0x21,0x11,0x25,0x21,0x11,0x21,0x01,0xb9,0x13,0x14,0x1f,0x1c,0x2a,0x2a,
-0x1c,0x1e,0x15,0x13,0x13,0x14,0x1f,0x1b,0x2b,0x2a,0x1c,0x1e,0x15,0x13,0x02,0x6c,
-0x13,0x14,0x1f,0x1b,0x2b,0x2a,0x1c,0x1e,0x15,0x13,0x13,0x14,0x1f,0x1c,0x2a,0x2a,
-0x1c,0x1e,0x15,0x13,0xfd,0x94,0x13,0x14,0x1f,0x1c,0x2a,0x2a,0x1c,0x1e,0x15,0x13,
-0x13,0x14,0x1f,0x1b,0x2b,0x2a,0x1c,0x1e,0x15,0x13,0x02,0x6c,0x13,0x14,0x1f,0x1b,
-0x2b,0x2a,0x1c,0x1e,0x15,0x13,0x13,0x14,0x1f,0x1c,0x2a,0x2a,0x1c,0x1e,0x15,0x13,
-0xfc,0x71,0x05,0xca,0xfa,0xdb,0x04,0x80,0xfb,0x80,0x04,0x1f,0x2a,0x1c,0x1e,0x15,
-0x13,0x13,0x14,0x1f,0x1b,0x2b,0x2a,0x1c,0x1e,0x15,0x13,0x13,0x14,0x1f,0x1b,0xfd,
-0xba,0x2a,0x1c,0x1e,0x15,0x13,0x13,0x14,0x1f,0x1b,0x2b,0x2a,0x1c,0x1e,0x15,0x13,
-0x13,0x14,0x1f,0x1b,0x2b,0x2a,0x1c,0x1e,0x15,0x13,0x13,0x14,0x1f,0x1b,0x2b,0x2a,
-0x1c,0x1e,0x15,0x13,0x13,0x14,0x1f,0x1b,0x02,0x9c,0x2a,0x1c,0x1e,0x15,0x13,0x13,
-0x14,0x1f,0x1b,0x2b,0x2a,0x1c,0x1e,0x15,0x13,0x13,0x14,0x1f,0x1b,0xfc,0x0c,0x05,
-0xcd,0xfa,0x33,0xa5,0x04,0x83,0x00,0x07,0x00,0x96,0x00,0x00,0x06,0x60,0x05,0xcd,
-0x00,0x17,0x00,0x2f,0x00,0x47,0x00,0x5f,0x00,0x77,0x00,0x7b,0x00,0x7f,0x00,0x00,
-0x01,0x34,0x37,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,
-0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x26,0x01,0x34,0x37,0x36,0x37,0x36,0x33,0x32,
-0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x26,
-0x25,0x34,0x37,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,
-0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x26,0x01,0x34,0x37,0x36,0x37,0x36,0x33,0x32,
-0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x26,
-0x01,0x34,0x37,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,
-0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x26,0x01,0x11,0x21,0x11,0x25,0x21,0x11,0x21,
-0x01,0xb9,0x13,0x14,0x1f,0x1c,0x2a,0x2a,0x1c,0x1e,0x15,0x13,0x13,0x14,0x1f,0x1b,
-0x2b,0x2a,0x1c,0x1e,0x15,0x13,0x02,0x6c,0x13,0x14,0x1f,0x1b,0x2b,0x2a,0x1c,0x1e,
-0x15,0x13,0x13,0x14,0x1f,0x1c,0x2a,0x2a,0x1c,0x1e,0x15,0x13,0xfd,0x94,0x13,0x14,
-0x1f,0x1c,0x2a,0x2a,0x1c,0x1e,0x15,0x13,0x13,0x14,0x1f,0x1b,0x2b,0x2a,0x1c,0x1e,
-0x15,0x13,0x02,0x6c,0x13,0x14,0x1f,0x1b,0x2b,0x2a,0x1c,0x1e,0x15,0x13,0x13,0x14,
-0x1f,0x1c,0x2a,0x2a,0x1c,0x1e,0x15,0x13,0xfe,0xca,0x13,0x14,0x1f,0x1b,0x2b,0x2a,
-0x1c,0x1e,0x15,0x13,0x13,0x14,0x1f,0x1c,0x2a,0x2a,0x1c,0x1e,0x15,0x13,0xfd,0xa7,
-0x05,0xca,0xfa,0xdb,0x04,0x80,0xfb,0x80,0x04,0x1f,0x2a,0x1c,0x1e,0x15,0x13,0x13,
-0x14,0x1f,0x1b,0x2b,0x2a,0x1c,0x1e,0x15,0x13,0x13,0x14,0x1f,0x1b,0xfd,0xba,0x2a,
-0x1c,0x1e,0x15,0x13,0x13,0x14,0x1f,0x1b,0x2b,0x2a,0x1c,0x1e,0x15,0x13,0x13,0x14,
-0x1f,0x1b,0x2b,0x2a,0x1c,0x1e,0x15,0x13,0x13,0x14,0x1f,0x1b,0x2b,0x2a,0x1c,0x1e,
-0x15,0x13,0x13,0x14,0x1f,0x1b,0x02,0x9c,0x2a,0x1c,0x1e,0x15,0x13,0x13,0x14,0x1f,
-0x1b,0x2b,0x2a,0x1c,0x1e,0x15,0x13,0x13,0x14,0x1f,0x1b,0xfe,0xf5,0x2a,0x1c,0x1e,
-0x15,0x13,0x13,0x14,0x1f,0x1b,0x2b,0x2a,0x1c,0x1e,0x15,0x13,0x13,0x14,0x1f,0x1b,
-0xfd,0x42,0x05,0xcd,0xfa,0x33,0xa5,0x04,0x83,0x00,0x00,0x08,0x00,0x96,0x00,0x00,
-0x06,0x60,0x05,0xcd,0x00,0x17,0x00,0x2f,0x00,0x47,0x00,0x5f,0x00,0x77,0x00,0x8f,
-0x00,0x93,0x00,0x97,0x00,0x00,0x01,0x34,0x37,0x36,0x37,0x36,0x33,0x32,0x17,0x16,
-0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x26,0x25,0x34,
-0x37,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,
-0x23,0x22,0x27,0x26,0x27,0x26,0x11,0x34,0x37,0x36,0x37,0x36,0x33,0x32,0x17,0x16,
-0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x26,0x01,0x34,
-0x37,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,
-0x23,0x22,0x27,0x26,0x27,0x26,0x25,0x34,0x37,0x36,0x37,0x36,0x33,0x32,0x17,0x16,
-0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x26,0x01,0x34,
-0x37,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,
-0x23,0x22,0x27,0x26,0x27,0x26,0x01,0x11,0x21,0x11,0x25,0x21,0x11,0x21,0x04,0x24,
-0x13,0x14,0x1f,0x1b,0x2b,0x2a,0x1c,0x1e,0x15,0x13,0x13,0x14,0x1f,0x1b,0x2b,0x2a,
-0x1c,0x1e,0x15,0x13,0xfd,0x95,0x13,0x14,0x1f,0x1b,0x2b,0x2a,0x1c,0x1e,0x15,0x13,
-0x13,0x14,0x1f,0x1b,0x2b,0x2a,0x1c,0x1e,0x15,0x13,0x13,0x14,0x1f,0x1c,0x2a,0x2a,
-0x1c,0x1e,0x15,0x13,0x13,0x14,0x1f,0x1b,0x2b,0x2a,0x1c,0x1e,0x15,0x13,0x02,0x6c,
-0x13,0x14,0x1f,0x1b,0x2b,0x2a,0x1c,0x1e,0x15,0x13,0x13,0x14,0x1f,0x1c,0x2a,0x2a,
-0x1c,0x1e,0x15,0x13,0xfd,0x94,0x13,0x14,0x1f,0x1c,0x2a,0x2a,0x1c,0x1e,0x15,0x13,
-0x13,0x14,0x1f,0x1b,0x2b,0x2a,0x1c,0x1e,0x15,0x13,0x02,0x6c,0x13,0x14,0x1f,0x1b,
-0x2b,0x2a,0x1c,0x1e,0x15,0x13,0x13,0x14,0x1f,0x1c,0x2a,0x2a,0x1c,0x1e,0x15,0x13,
-0xfc,0x71,0x05,0xca,0xfa,0xdb,0x04,0x80,0xfb,0x80,0x02,0xe9,0x2a,0x1c,0x1e,0x15,
-0x13,0x13,0x14,0x1f,0x1b,0x2b,0x2a,0x1c,0x1e,0x15,0x13,0x13,0x14,0x1f,0x1b,0x2b,
-0x2a,0x1c,0x1e,0x15,0x13,0x13,0x14,0x1f,0x1b,0x2b,0x2a,0x1c,0x1e,0x15,0x13,0x13,
-0x14,0x1f,0x1b,0x01,0x93,0x2a,0x1c,0x1e,0x15,0x13,0x13,0x14,0x1f,0x1b,0x2b,0x2a,
-0x1c,0x1e,0x15,0x13,0x13,0x14,0x1f,0x1b,0xfd,0x56,0x2a,0x1c,0x1e,0x15,0x13,0x13,
-0x14,0x1f,0x1b,0x2b,0x2a,0x1c,0x1e,0x15,0x13,0x13,0x14,0x1f,0x1b,0x2b,0x2a,0x1c,
-0x1e,0x15,0x13,0x13,0x14,0x1f,0x1b,0x2b,0x2a,0x1c,0x1e,0x15,0x13,0x13,0x14,0x1f,
-0x1b,0x03,0x00,0x2a,0x1c,0x1e,0x15,0x13,0x13,0x14,0x1f,0x1b,0x2b,0x2a,0x1c,0x1e,
-0x15,0x13,0x13,0x14,0x1f,0x1b,0xfb,0xda,0x05,0xcd,0xfa,0x33,0xa5,0x04,0x83,0x00,
-0x00,0x03,0x00,0xaa,0x00,0x01,0x06,0x82,0x05,0xd9,0x00,0x0f,0x00,0x1f,0x00,0x2f,
-0x01,0x21,0xba,0x00,0x10,0x00,0x0c,0x00,0x03,0x2b,0xb8,0x00,0x10,0x10,0xba,0x00,
-0x28,0x00,0x20,0x00,0x03,0x2b,0xb8,0x00,0x28,0x10,0xba,0x00,0x04,0x00,0x18,0x00,
-0x03,0x2b,0xb8,0x00,0x04,0x10,0x41,0x1b,0x00,0x16,0x00,0x10,0x00,0x26,0x00,0x10,
-0x00,0x36,0x00,0x10,0x00,0x46,0x00,0x10,0x00,0x56,0x00,0x10,0x00,0x66,0x00,0x10,
-0x00,0x76,0x00,0x10,0x00,0x86,0x00,0x10,0x00,0x96,0x00,0x10,0x00,0xa6,0x00,0x10,
-0x00,0xb6,0x00,0x10,0x00,0xc6,0x00,0x10,0x00,0xd6,0x00,0x10,0x00,0x0d,0x5d,0x41,
-0x05,0x00,0xe5,0x00,0x10,0x00,0xf5,0x00,0x10,0x00,0x02,0x5d,0x41,0x05,0x00,0xea,
-0x00,0x18,0x00,0xfa,0x00,0x18,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,0x18,0x00,
-0x29,0x00,0x18,0x00,0x39,0x00,0x18,0x00,0x49,0x00,0x18,0x00,0x59,0x00,0x18,0x00,
-0x69,0x00,0x18,0x00,0x79,0x00,0x18,0x00,0x89,0x00,0x18,0x00,0x99,0x00,0x18,0x00,
-0xa9,0x00,0x18,0x00,0xb9,0x00,0x18,0x00,0xc9,0x00,0x18,0x00,0xd9,0x00,0x18,0x00,
-0x0d,0x5d,0x41,0x05,0x00,0xea,0x00,0x20,0x00,0xfa,0x00,0x20,0x00,0x02,0x5d,0x41,
-0x1b,0x00,0x19,0x00,0x20,0x00,0x29,0x00,0x20,0x00,0x39,0x00,0x20,0x00,0x49,0x00,
-0x20,0x00,0x59,0x00,0x20,0x00,0x69,0x00,0x20,0x00,0x79,0x00,0x20,0x00,0x89,0x00,
-0x20,0x00,0x99,0x00,0x20,0x00,0xa9,0x00,0x20,0x00,0xb9,0x00,0x20,0x00,0xc9,0x00,
-0x20,0x00,0xd9,0x00,0x20,0x00,0x0d,0x5d,0xb8,0x00,0x31,0xdc,0x00,0xba,0x00,0x14,
-0x00,0x08,0x00,0x03,0x2b,0xb8,0x00,0x14,0x10,0xba,0x00,0x00,0x00,0x1c,0x00,0x03,
-0x2b,0xb8,0x00,0x00,0x10,0xba,0x00,0x24,0x00,0x2c,0x00,0x03,0x2b,0xb8,0x00,0x24,
-0x10,0x30,0x31,0x01,0x32,0x04,0x12,0x15,0x14,0x02,0x04,0x23,0x22,0x24,0x02,0x35,
-0x34,0x12,0x24,0x01,0x14,0x12,0x04,0x33,0x32,0x24,0x12,0x35,0x34,0x02,0x24,0x23,
-0x22,0x04,0x02,0x05,0x34,0x3e,0x01,0x33,0x32,0x1e,0x01,0x15,0x14,0x0e,0x01,0x23,
-0x22,0x2e,0x01,0x03,0x96,0xbc,0x01,0x65,0xcb,0xc5,0xfe,0x9b,0xc2,0xc2,0xfe,0x9b,
-0xc5,0xc9,0x01,0x65,0xfe,0x28,0xae,0x01,0x3c,0xac,0xac,0x01,0x3c,0xae,0xb3,0xfe,
-0xc4,0xa7,0xa8,0xfe,0xc3,0xb1,0x03,0x93,0x22,0x3c,0x21,0x20,0x3c,0x22,0x23,0x3c,
-0x1f,0x21,0x3b,0x23,0x05,0xd9,0xc1,0xfe,0x98,0xc3,0xc3,0xfe,0x9d,0xc6,0xc6,0x01,
-0x63,0xc3,0xc3,0x01,0x68,0xc1,0xfd,0x14,0xad,0xfe,0xc5,0xae,0xae,0x01,0x3b,0xad,
-0xac,0x01,0x3f,0xab,0xab,0xfe,0xc1,0xac,0x21,0x3c,0x21,0x21,0x3c,0x21,0x21,0x3d,
-0x20,0x20,0x3d,0x00,0x00,0x04,0x00,0xaa,0x00,0x01,0x06,0x82,0x05,0xd9,0x00,0x0f,
-0x00,0x1f,0x00,0x2f,0x00,0x3f,0x01,0x7f,0xba,0x00,0x10,0x00,0x0c,0x00,0x03,0x2b,
-0xb8,0x00,0x10,0x10,0xba,0x00,0x34,0x00,0x3c,0x00,0x03,0x2b,0xb8,0x00,0x34,0x10,
-0xba,0x00,0x28,0x00,0x20,0x00,0x03,0x2b,0xb8,0x00,0x28,0x10,0xba,0x00,0x04,0x00,
-0x18,0x00,0x03,0x2b,0xb8,0x00,0x04,0x10,0x41,0x1b,0x00,0x16,0x00,0x10,0x00,0x26,
-0x00,0x10,0x00,0x36,0x00,0x10,0x00,0x46,0x00,0x10,0x00,0x56,0x00,0x10,0x00,0x66,
-0x00,0x10,0x00,0x76,0x00,0x10,0x00,0x86,0x00,0x10,0x00,0x96,0x00,0x10,0x00,0xa6,
-0x00,0x10,0x00,0xb6,0x00,0x10,0x00,0xc6,0x00,0x10,0x00,0xd6,0x00,0x10,0x00,0x0d,
-0x5d,0x41,0x05,0x00,0xe5,0x00,0x10,0x00,0xf5,0x00,0x10,0x00,0x02,0x5d,0x41,0x05,
-0x00,0xea,0x00,0x18,0x00,0xfa,0x00,0x18,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,
-0x18,0x00,0x29,0x00,0x18,0x00,0x39,0x00,0x18,0x00,0x49,0x00,0x18,0x00,0x59,0x00,
-0x18,0x00,0x69,0x00,0x18,0x00,0x79,0x00,0x18,0x00,0x89,0x00,0x18,0x00,0x99,0x00,
-0x18,0x00,0xa9,0x00,0x18,0x00,0xb9,0x00,0x18,0x00,0xc9,0x00,0x18,0x00,0xd9,0x00,
-0x18,0x00,0x0d,0x5d,0x41,0x05,0x00,0xea,0x00,0x20,0x00,0xfa,0x00,0x20,0x00,0x02,
-0x5d,0x41,0x1b,0x00,0x19,0x00,0x20,0x00,0x29,0x00,0x20,0x00,0x39,0x00,0x20,0x00,
-0x49,0x00,0x20,0x00,0x59,0x00,0x20,0x00,0x69,0x00,0x20,0x00,0x79,0x00,0x20,0x00,
-0x89,0x00,0x20,0x00,0x99,0x00,0x20,0x00,0xa9,0x00,0x20,0x00,0xb9,0x00,0x20,0x00,
-0xc9,0x00,0x20,0x00,0xd9,0x00,0x20,0x00,0x0d,0x5d,0x41,0x1b,0x00,0x16,0x00,0x34,
-0x00,0x26,0x00,0x34,0x00,0x36,0x00,0x34,0x00,0x46,0x00,0x34,0x00,0x56,0x00,0x34,
-0x00,0x66,0x00,0x34,0x00,0x76,0x00,0x34,0x00,0x86,0x00,0x34,0x00,0x96,0x00,0x34,
-0x00,0xa6,0x00,0x34,0x00,0xb6,0x00,0x34,0x00,0xc6,0x00,0x34,0x00,0xd6,0x00,0x34,
-0x00,0x0d,0x5d,0x41,0x05,0x00,0xe5,0x00,0x34,0x00,0xf5,0x00,0x34,0x00,0x02,0x5d,
-0xb8,0x00,0x41,0xdc,0x00,0xba,0x00,0x14,0x00,0x08,0x00,0x03,0x2b,0xb8,0x00,0x14,
-0x10,0xba,0x00,0x00,0x00,0x1c,0x00,0x03,0x2b,0xb8,0x00,0x00,0x10,0xba,0x00,0x24,
-0x00,0x2c,0x00,0x03,0x2b,0xb8,0x00,0x24,0x10,0xb8,0x00,0x30,0xd0,0xb8,0x00,0x2c,
-0x10,0xb8,0x00,0x38,0xd0,0x30,0x31,0x01,0x32,0x04,0x12,0x15,0x14,0x02,0x04,0x23,
-0x22,0x24,0x02,0x35,0x34,0x12,0x24,0x01,0x14,0x12,0x04,0x33,0x32,0x24,0x12,0x35,
-0x34,0x02,0x24,0x23,0x22,0x04,0x02,0x05,0x34,0x3e,0x01,0x33,0x32,0x1e,0x01,0x15,
-0x14,0x0e,0x01,0x23,0x22,0x2e,0x01,0x25,0x32,0x1e,0x01,0x15,0x14,0x0e,0x01,0x23,
-0x22,0x2e,0x01,0x35,0x34,0x3e,0x01,0x03,0x96,0xbc,0x01,0x65,0xcb,0xc5,0xfe,0x9b,
-0xc2,0xc2,0xfe,0x9b,0xc5,0xc9,0x01,0x65,0xfe,0x28,0xae,0x01,0x3c,0xac,0xac,0x01,
-0x3c,0xae,0xb3,0xfe,0xc4,0xa7,0xa8,0xfe,0xc3,0xb1,0x03,0x93,0x22,0x3c,0x21,0x20,
-0x3c,0x22,0x23,0x3c,0x1f,0x21,0x3b,0x23,0xfd,0x81,0x20,0x3c,0x23,0x22,0x3c,0x21,
-0x20,0x3c,0x22,0x23,0x3b,0x05,0xd9,0xc1,0xfe,0x98,0xc3,0xc3,0xfe,0x9d,0xc6,0xc6,
-0x01,0x63,0xc3,0xc3,0x01,0x68,0xc1,0xfd,0x14,0xad,0xfe,0xc5,0xae,0xae,0x01,0x3b,
-0xad,0xac,0x01,0x3f,0xab,0xab,0xfe,0xc1,0xac,0x21,0x3c,0x21,0x21,0x3c,0x21,0x21,
-0x3d,0x20,0x20,0x3d,0x9f,0x20,0x3d,0x21,0x21,0x3c,0x21,0x21,0x3c,0x21,0x21,0x3d,
-0x20,0x00,0x00,0x02,0x00,0xaa,0x00,0x01,0x06,0x82,0x05,0xd9,0x00,0x0f,0x00,0x1f,
-0x00,0x61,0xba,0x00,0x04,0x00,0x14,0x00,0x03,0x2b,0xb8,0x00,0x04,0x10,0x41,0x05,
-0x00,0xea,0x00,0x14,0x00,0xfa,0x00,0x14,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,
-0x14,0x00,0x29,0x00,0x14,0x00,0x39,0x00,0x14,0x00,0x49,0x00,0x14,0x00,0x59,0x00,
-0x14,0x00,0x69,0x00,0x14,0x00,0x79,0x00,0x14,0x00,0x89,0x00,0x14,0x00,0x99,0x00,
-0x14,0x00,0xa9,0x00,0x14,0x00,0xb9,0x00,0x14,0x00,0xc9,0x00,0x14,0x00,0xd9,0x00,
-0x14,0x00,0x0d,0x5d,0xb8,0x00,0x21,0xdc,0x00,0xb8,0x00,0x08,0x2f,0xb8,0x00,0x00,
-0x2f,0x30,0x31,0x01,0x32,0x04,0x12,0x15,0x14,0x02,0x04,0x23,0x22,0x24,0x02,0x35,
-0x34,0x12,0x24,0x01,0x32,0x3e,0x01,0x35,0x34,0x2e,0x01,0x23,0x22,0x0e,0x01,0x15,
-0x14,0x1e,0x01,0x03,0x96,0xbc,0x01,0x65,0xcb,0xc5,0xfe,0x9b,0xc2,0xc2,0xfe,0x9b,
-0xc5,0xc9,0x01,0x65,0x02,0x3a,0x1f,0x3c,0x23,0x22,0x3c,0x20,0x21,0x3c,0x22,0x23,
-0x3b,0x05,0xd9,0xc1,0xfe,0x98,0xc3,0xc3,0xfe,0x9d,0xc6,0xc6,0x01,0x63,0xc3,0xc3,
-0x01,0x68,0xc1,0xfc,0x96,0x20,0x3d,0x21,0x21,0x3c,0x21,0x21,0x3c,0x21,0x21,0x3d,
-0x20,0x00,0x00,0x03,0x00,0xaa,0x00,0x01,0x06,0x82,0x05,0xd9,0x00,0x0f,0x00,0x1f,
-0x00,0x2f,0x00,0xbf,0xb8,0x00,0x30,0x2f,0xb8,0x00,0x31,0x2f,0xb8,0x00,0x04,0xdc,
-0xb8,0x00,0x30,0x10,0xb8,0x00,0x0c,0xd0,0xb8,0x00,0x0c,0x2f,0xb8,0x00,0x04,0x10,
-0xb8,0x00,0x14,0xdc,0x41,0x05,0x00,0xea,0x00,0x14,0x00,0xfa,0x00,0x14,0x00,0x02,
-0x5d,0x41,0x1b,0x00,0x19,0x00,0x14,0x00,0x29,0x00,0x14,0x00,0x39,0x00,0x14,0x00,
-0x49,0x00,0x14,0x00,0x59,0x00,0x14,0x00,0x69,0x00,0x14,0x00,0x79,0x00,0x14,0x00,
-0x89,0x00,0x14,0x00,0x99,0x00,0x14,0x00,0xa9,0x00,0x14,0x00,0xb9,0x00,0x14,0x00,
-0xc9,0x00,0x14,0x00,0xd9,0x00,0x14,0x00,0x0d,0x5d,0xb8,0x00,0x0c,0x10,0xb8,0x00,
-0x20,0xdc,0x41,0x1b,0x00,0x16,0x00,0x20,0x00,0x26,0x00,0x20,0x00,0x36,0x00,0x20,
-0x00,0x46,0x00,0x20,0x00,0x56,0x00,0x20,0x00,0x66,0x00,0x20,0x00,0x76,0x00,0x20,
-0x00,0x86,0x00,0x20,0x00,0x96,0x00,0x20,0x00,0xa6,0x00,0x20,0x00,0xb6,0x00,0x20,
-0x00,0xc6,0x00,0x20,0x00,0xd6,0x00,0x20,0x00,0x0d,0x5d,0x41,0x05,0x00,0xe5,0x00,
-0x20,0x00,0xf5,0x00,0x20,0x00,0x02,0x5d,0x00,0xb8,0x00,0x08,0x2f,0xb8,0x00,0x00,
-0x2f,0x30,0x31,0x01,0x32,0x04,0x12,0x15,0x14,0x02,0x04,0x23,0x22,0x24,0x02,0x35,
-0x34,0x12,0x24,0x01,0x32,0x3e,0x01,0x35,0x34,0x2e,0x01,0x23,0x22,0x0e,0x01,0x15,
-0x14,0x1e,0x01,0x25,0x14,0x1e,0x01,0x33,0x32,0x3e,0x01,0x35,0x34,0x2e,0x01,0x23,
-0x22,0x0e,0x01,0x03,0x96,0xbc,0x01,0x65,0xcb,0xc5,0xfe,0x9b,0xc2,0xc2,0xfe,0x9b,
-0xc5,0xc9,0x01,0x65,0x02,0x3a,0x1f,0x3c,0x23,0x22,0x3c,0x20,0x21,0x3c,0x22,0x23,
-0x3b,0xfc,0xa5,0x22,0x3c,0x20,0x21,0x3c,0x22,0x23,0x3c,0x20,0x20,0x3b,0x23,0x05,
-0xd9,0xc1,0xfe,0x98,0xc3,0xc3,0xfe,0x9d,0xc6,0xc6,0x01,0x63,0xc3,0xc3,0x01,0x68,
-0xc1,0xfc,0x96,0x20,0x3d,0x21,0x21,0x3c,0x21,0x21,0x3c,0x21,0x21,0x3d,0x20,0x7e,
-0x21,0x3c,0x21,0x21,0x3c,0x21,0x21,0x3d,0x20,0x20,0x3d,0x00,0x00,0x01,0x00,0xaa,
-0x00,0x00,0x06,0x82,0x00,0xc8,0x00,0x03,0x00,0x0f,0x00,0xba,0x00,0x01,0x00,0x02,
-0x00,0x03,0x2b,0xb8,0x00,0x01,0x10,0x30,0x31,0x37,0x21,0x15,0x21,0xaa,0x05,0xd8,
-0xfa,0x28,0xc8,0xc8,0x00,0x02,0x00,0xaa,0x00,0x00,0x06,0x82,0x00,0xc8,0x00,0x03,
-0x00,0x07,0x00,0x1b,0x00,0xba,0x00,0x01,0x00,0x02,0x00,0x03,0x2b,0xb8,0x00,0x01,
-0x10,0xb8,0x00,0x04,0xd0,0xb8,0x00,0x02,0x10,0xb8,0x00,0x06,0xd0,0x30,0x31,0x37,
-0x21,0x15,0x21,0x25,0x21,0x15,0x21,0xaa,0x02,0x60,0xfd,0xa0,0x03,0x78,0x02,0x60,
-0xfd,0xa0,0xc8,0xc8,0xc8,0xc8,0xff,0xff,0x00,0xaa,0x00,0x00,0x06,0x82,0x03,0x4d,
-0x12,0x22,0x0a,0x25,0x00,0x00,0x10,0x03,0x0a,0x25,0x00,0x00,0x02,0x85,0xff,0xff,
-0x00,0xaa,0x00,0x00,0x06,0x82,0x03,0x4d,0x12,0x22,0x0a,0x25,0x00,0x00,0x10,0x03,
-0x0a,0x26,0x00,0x00,0x02,0x85,0xff,0xff,0x00,0xaa,0x00,0x00,0x06,0x82,0x03,0x4e,
-0x12,0x22,0x0a,0x26,0x00,0x00,0x10,0x03,0x0a,0x25,0x00,0x00,0x02,0x86,0xff,0xff,
-0x00,0xaa,0x00,0x00,0x06,0x82,0x03,0x4e,0x12,0x22,0x0a,0x26,0x00,0x00,0x10,0x03,
-0x0a,0x26,0x00,0x00,0x02,0x86,0x00,0x02,0x01,0x58,0x00,0x06,0x05,0xd2,0x05,0xd9,
-0x00,0x09,0x00,0x1a,0x00,0x43,0xb8,0x00,0x1b,0x2f,0xb8,0x00,0x1c,0x2f,0xb8,0x00,
-0x15,0xdc,0xb8,0x00,0x03,0xdc,0xb8,0x00,0x1b,0x10,0xb8,0x00,0x0a,0xd0,0xb8,0x00,
-0x0a,0x2f,0xb8,0x00,0x09,0xdc,0xb8,0x00,0x18,0xd0,0xb8,0x00,0x18,0x2f,0x00,0xb8,
-0x00,0x19,0x2f,0xba,0x00,0x0c,0x00,0x0b,0x00,0x03,0x2b,0xb8,0x00,0x0c,0x10,0xb8,
-0x00,0x0b,0x10,0xb8,0x00,0x0e,0xd0,0x30,0x31,0x01,0x36,0x04,0x25,0x11,0x06,0x27,
-0x26,0x05,0x2f,0x01,0x23,0x27,0x21,0x15,0x23,0x15,0x36,0x17,0x16,0x37,0x11,0x04,
-0x24,0x07,0x11,0x23,0x02,0x07,0xa6,0x01,0xd8,0x01,0x09,0xd7,0xea,0xb0,0xfe,0xfe,
-0x14,0x63,0x4b,0x01,0x01,0x0e,0x4c,0xfd,0xd8,0xfb,0xe8,0xfe,0xe4,0xfe,0x02,0xb4,
-0x60,0x02,0x9f,0x35,0xe6,0x2b,0x02,0x62,0x28,0x7d,0x9f,0x2a,0x02,0x5d,0x35,0x35,
-0x1a,0x28,0x98,0x89,0x42,0xfd,0x0d,0x4a,0xf8,0x4e,0xfd,0xc6,0x00,0x01,0x01,0x58,
-0x00,0x06,0x05,0xd2,0x05,0xd9,0x00,0x10,0x00,0x27,0xba,0x00,0x0e,0x00,0x10,0x00,
-0x03,0x2b,0xb8,0x00,0x0e,0x10,0x00,0xb8,0x00,0x0f,0x2f,0xba,0x00,0x02,0x00,0x01,
-0x00,0x03,0x2b,0xb8,0x00,0x02,0x10,0xb8,0x00,0x01,0x10,0xb8,0x00,0x04,0xd0,0x30,
-0x31,0x01,0x23,0x27,0x21,0x15,0x23,0x15,0x36,0x17,0x16,0x37,0x11,0x04,0x24,0x07,
-0x11,0x23,0x01,0xa4,0x4b,0x01,0x01,0x0e,0x4c,0xfd,0xd8,0xfb,0xe8,0xfe,0xe4,0xfe,
-0x02,0xb4,0x60,0x05,0xa4,0x35,0x35,0x1a,0x28,0x98,0x89,0x42,0xfd,0x0d,0x4a,0xf8,
-0x4e,0xfd,0xc6,0x00,0x00,0x01,0x00,0x6a,0x00,0x01,0x06,0xc1,0x05,0xda,0x00,0x1f,
-0x00,0x1d,0x00,0xb8,0x00,0x08,0x2f,0xb8,0x00,0x0e,0x2f,0xb8,0x00,0x19,0x2f,0xb8,
-0x00,0x1d,0x2f,0xba,0x00,0x14,0x00,0x19,0x00,0x08,0x11,0x12,0x39,0x30,0x31,0x09,
-0x01,0x07,0x27,0x37,0x27,0x37,0x17,0x37,0x17,0x07,0x09,0x01,0x27,0x37,0x17,0x37,
-0x17,0x07,0x16,0x13,0x09,0x01,0x17,0x01,0x07,0x01,0x27,0x07,0x01,0x27,0x01,0x03,
-0x36,0xfe,0xb3,0xb9,0xc6,0xba,0x2e,0x8a,0x2b,0xb9,0xc5,0xb8,0x01,0x4d,0x01,0x4d,
-0xb8,0xc6,0xb8,0x2c,0x88,0x2c,0x45,0x23,0xfe,0xd3,0xfe,0xb3,0xb2,0x01,0x3f,0xb9,
-0xfe,0xf2,0xb3,0xb2,0xfe,0xf2,0xb8,0x01,0x3d,0x02,0x7e,0x01,0x51,0xbb,0xc7,0xbb,
-0x2c,0x8a,0x2c,0xba,0xc8,0xba,0xfe,0xb0,0x01,0x4f,0xbb,0xc8,0xbb,0x2d,0x8a,0x2c,
-0x71,0xfe,0x74,0x01,0x35,0xfe,0xaf,0xb3,0xfe,0xf0,0xb9,0x01,0x40,0xb4,0xb4,0xfe,
-0xc0,0xb9,0x01,0x10,0x00,0x02,0x00,0xc6,0xff,0xec,0x06,0x65,0x05,0xdb,0x00,0x0f,
-0x00,0x53,0x01,0x03,0xba,0x00,0x00,0x00,0x33,0x00,0x03,0x2b,0xba,0x00,0x45,0x00,
-0x29,0x00,0x03,0x2b,0xb8,0x00,0x45,0x10,0xba,0x00,0x3b,0x00,0x08,0x00,0x03,0x2b,
-0xb8,0x00,0x3b,0x10,0x41,0x1b,0x00,0x16,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x36,
-0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x76,
-0x00,0x00,0x00,0x86,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0xb6,
-0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0x0d,0x5d,0x41,0x05,0x00,
-0xe5,0x00,0x00,0x00,0xf5,0x00,0x00,0x00,0x02,0x5d,0x41,0x05,0x00,0xea,0x00,0x08,
-0x00,0xfa,0x00,0x08,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,0x08,0x00,0x29,0x00,
-0x08,0x00,0x39,0x00,0x08,0x00,0x49,0x00,0x08,0x00,0x59,0x00,0x08,0x00,0x69,0x00,
-0x08,0x00,0x79,0x00,0x08,0x00,0x89,0x00,0x08,0x00,0x99,0x00,0x08,0x00,0xa9,0x00,
-0x08,0x00,0xb9,0x00,0x08,0x00,0xc9,0x00,0x08,0x00,0xd9,0x00,0x08,0x00,0x0d,0x5d,
-0xb8,0x00,0x29,0x10,0xb8,0x00,0x2d,0xd0,0xb8,0x00,0x45,0x10,0xb8,0x00,0x40,0xd0,
-0x00,0xb8,0x00,0x10,0x2f,0xb8,0x00,0x12,0x2f,0xb8,0x00,0x14,0x2f,0xb8,0x00,0x16,
-0x2f,0xb8,0x00,0x18,0x2f,0xb8,0x00,0x1a,0x2f,0xba,0x00,0x37,0x00,0x0c,0x00,0x03,
-0x2b,0xb8,0x00,0x37,0x10,0xba,0x00,0x04,0x00,0x2a,0x00,0x03,0x2b,0xb8,0x00,0x04,
-0x10,0xb8,0x00,0x2a,0x10,0xb8,0x00,0x2d,0xdc,0xb8,0x00,0x41,0xd0,0xb8,0x00,0x2a,
-0x10,0xb8,0x00,0x43,0xd0,0x30,0x31,0x01,0x14,0x1e,0x01,0x33,0x32,0x3e,0x01,0x35,
-0x34,0x2e,0x01,0x23,0x22,0x0e,0x01,0x13,0x15,0x23,0x06,0x23,0x22,0x27,0x35,0x23,
-0x15,0x23,0x22,0x24,0x27,0x26,0x27,0x07,0x03,0x05,0x07,0x17,0x16,0x17,0x16,0x17,
-0x11,0x21,0x35,0x21,0x35,0x26,0x27,0x2e,0x01,0x35,0x34,0x3e,0x01,0x33,0x32,0x1e,
-0x01,0x15,0x14,0x06,0x07,0x06,0x07,0x15,0x21,0x15,0x21,0x11,0x36,0x37,0x36,0x37,
-0x36,0x37,0x27,0x25,0x03,0x27,0x06,0x07,0x06,0x07,0x06,0x03,0x10,0x27,0x48,0x26,
-0x28,0x47,0x28,0x29,0x47,0x27,0x25,0x48,0x28,0xe3,0x08,0x25,0x27,0x03,0x03,0x07,
-0x07,0xa9,0xfe,0xcb,0x56,0x10,0x0d,0x57,0x1d,0x01,0x33,0x57,0x06,0x49,0x84,0x6d,
-0x75,0xfe,0x89,0x01,0x77,0x1a,0x19,0x3e,0x44,0x45,0x7d,0x41,0x42,0x7c,0x47,0x45,
-0x3d,0x1b,0x1a,0x01,0x6d,0xfe,0x93,0x64,0x5e,0x84,0x4a,0x02,0x03,0x57,0x01,0x34,
-0x1e,0x57,0x0c,0x11,0x56,0x9b,0x73,0x04,0xd6,0x27,0x48,0x27,0x27,0x48,0x27,0x28,
-0x48,0x27,0x27,0x48,0xfa,0xf2,0x01,0x03,0x01,0x02,0x02,0x60,0x58,0x11,0x10,0x41,
-0x01,0x4b,0x7c,0x40,0x06,0x58,0x31,0x28,0x07,0x02,0xd4,0x81,0x33,0x08,0x0e,0x22,
-0x7c,0x44,0x44,0x7d,0x44,0x44,0x7d,0x44,0x44,0x7c,0x22,0x0e,0x09,0x32,0x81,0xfd,
-0x2f,0x0a,0x22,0x31,0x58,0x03,0x03,0x40,0x7c,0xfe,0xb5,0x41,0x10,0x11,0x58,0x31,
-0x23,0x00,0x00,0x04,0x01,0x0d,0x00,0x00,0x06,0x1f,0x05,0xd6,0x00,0x04,0x00,0x09,
-0x00,0x39,0x00,0x59,0x00,0x77,0x00,0xb8,0x00,0x16,0x2f,0xb8,0x00,0x28,0x2f,0xb8,
-0x00,0x36,0x2f,0xb8,0x00,0x38,0x2f,0xba,0x00,0x00,0x00,0x16,0x00,0x36,0x11,0x12,
-0x39,0xba,0x00,0x02,0x00,0x16,0x00,0x36,0x11,0x12,0x39,0xba,0x00,0x06,0x00,0x16,
-0x00,0x36,0x11,0x12,0x39,0xba,0x00,0x08,0x00,0x16,0x00,0x36,0x11,0x12,0x39,0xba,
-0x00,0x1c,0x00,0x16,0x00,0x36,0x11,0x12,0x39,0xba,0x00,0x22,0x00,0x16,0x00,0x36,
-0x11,0x12,0x39,0xba,0x00,0x3e,0x00,0x16,0x00,0x36,0x11,0x12,0x39,0xba,0x00,0x40,
-0x00,0x16,0x00,0x36,0x11,0x12,0x39,0xba,0x00,0x46,0x00,0x16,0x00,0x36,0x11,0x12,
-0x39,0xba,0x00,0x56,0x00,0x16,0x00,0x36,0x11,0x12,0x39,0x30,0x31,0x25,0x26,0x27,
-0x07,0x16,0x25,0x17,0x36,0x37,0x26,0x09,0x01,0x36,0x37,0x33,0x06,0x07,0x17,0x16,
-0x17,0x0e,0x01,0x07,0x26,0x2f,0x01,0x06,0x07,0x27,0x36,0x37,0x0b,0x01,0x16,0x17,
-0x07,0x26,0x27,0x07,0x06,0x07,0x22,0x26,0x27,0x36,0x3f,0x01,0x26,0x27,0x33,0x16,
-0x17,0x09,0x01,0x27,0x09,0x01,0x07,0x01,0x15,0x27,0x01,0x37,0x09,0x01,0x17,0x09,
-0x01,0x26,0x2f,0x01,0x1e,0x01,0x17,0x37,0x26,0x27,0x01,0x17,0x07,0x01,0x06,0x07,
-0x17,0x3e,0x01,0x37,0x07,0x06,0x07,0x05,0xc8,0x30,0x14,0x09,0x04,0xfb,0x96,0x09,
-0x13,0x31,0x4a,0x02,0xca,0x01,0x16,0x4b,0x1b,0x5b,0x19,0x5d,0x9c,0x3e,0x02,0x06,
-0x3c,0x2b,0x47,0x04,0x9d,0x67,0x5b,0x27,0x66,0x42,0xf4,0xf2,0x42,0x65,0x26,0x5c,
-0x68,0x9c,0x01,0x3f,0x28,0x4b,0x04,0x01,0x3f,0x9c,0x5d,0x1a,0x5c,0x1b,0x4b,0x01,
-0x16,0xfd,0xe3,0x20,0x02,0x88,0x02,0x8a,0x21,0xfd,0xc6,0x20,0x02,0x52,0x04,0xfd,
-0x9b,0xfd,0x9c,0x04,0x02,0x54,0xfe,0xc1,0x58,0x31,0x16,0x29,0xa2,0xb1,0x08,0x7b,
-0x56,0x01,0x38,0x23,0x01,0x01,0x10,0x55,0x77,0x09,0xb1,0xa1,0x29,0x16,0x2f,0x5e,
-0x10,0x0e,0x40,0x08,0x52,0x3f,0x08,0x3f,0x0e,0x0c,0x02,0x29,0xfe,0xd0,0x3b,0x3c,
-0x75,0x49,0xb6,0x03,0x40,0x2a,0x22,0x01,0x04,0x4f,0xa8,0x38,0x08,0x42,0x11,0x31,
-0x01,0x22,0xfe,0xde,0x31,0x11,0x42,0x08,0x38,0xa8,0x48,0x0b,0x1d,0x24,0x4c,0x03,
-0xb6,0x49,0x75,0x3c,0x3b,0x01,0x30,0x02,0x84,0x95,0xfd,0x3a,0x02,0xc6,0x95,0xfd,
-0x59,0x01,0x25,0x02,0xc0,0x0e,0xfd,0x43,0x02,0xbd,0x0e,0xfd,0x45,0xfe,0x99,0x3a,
-0x5c,0x02,0x4c,0x85,0x42,0x10,0x26,0x37,0x01,0x65,0x28,0x01,0xfe,0xc1,0x35,0x25,
-0x10,0x42,0x85,0x4c,0x02,0x59,0x41,0x00,0x00,0x05,0x00,0x7d,0xff,0xec,0x03,0xd5,
-0x05,0xdb,0x00,0x03,0x00,0x16,0x00,0x2a,0x00,0x43,0x00,0x54,0x01,0x0d,0xba,0x00,
-0x2c,0x00,0x19,0x00,0x03,0x2b,0xb8,0x00,0x2c,0x10,0xb8,0x00,0x04,0xd0,0xb8,0x00,
-0x2c,0x10,0xb8,0x00,0x0a,0xdc,0xb8,0x00,0x17,0xd0,0xb8,0x00,0x09,0xd0,0xb8,0x00,
-0x0a,0x10,0xb8,0x00,0x21,0xdc,0xb8,0x00,0x2c,0x10,0xb8,0x00,0x28,0xd0,0xb8,0x00,
-0x04,0x10,0xb8,0x00,0x29,0xd0,0xb8,0x00,0x0a,0x10,0xb8,0x00,0x2d,0xd0,0xb8,0x00,
-0x17,0x10,0xb8,0x00,0x2e,0xd0,0xba,0x00,0x34,0x00,0x19,0x00,0x2c,0x11,0x12,0x39,
-0xba,0x00,0x35,0x00,0x19,0x00,0x2c,0x11,0x12,0x39,0xba,0x00,0x36,0x00,0x19,0x00,
-0x2c,0x11,0x12,0x39,0xb8,0x00,0x19,0x10,0xb8,0x00,0x3a,0xd0,0xb8,0x00,0x3a,0x2f,
-0xb8,0x00,0x2c,0x10,0xb8,0x00,0x3f,0xd0,0xb8,0x00,0x3f,0x2f,0xb8,0x00,0x04,0x10,
-0xb8,0x00,0x40,0xd0,0xb8,0x00,0x40,0x2f,0xb8,0x00,0x21,0x10,0xb8,0x00,0x42,0xd0,
-0xb8,0x00,0x42,0x2f,0xb8,0x00,0x2c,0x10,0xb8,0x00,0x44,0xd0,0xb8,0x00,0x0a,0x10,
-0xb8,0x00,0x45,0xd0,0xb8,0x00,0x17,0x10,0xb8,0x00,0x46,0xd0,0xb8,0x00,0x46,0x2f,
-0xb8,0x00,0x04,0x10,0xb8,0x00,0x54,0xd0,0xb8,0x00,0x54,0x2f,0x00,0xb8,0x00,0x4d,
-0x2f,0xb8,0x00,0x07,0x2f,0xb8,0x00,0x14,0x2f,0xba,0x00,0x32,0x00,0x2e,0x00,0x03,
-0x2b,0xb8,0x00,0x32,0x10,0xba,0x00,0x04,0x00,0x14,0x00,0x4d,0x11,0x12,0x39,0xb8,
-0x00,0x2e,0x10,0xb8,0x00,0x2b,0xd0,0xb8,0x00,0x2b,0x2f,0xba,0x00,0x34,0x00,0x2e,
-0x00,0x32,0x11,0x12,0x39,0xba,0x00,0x35,0x00,0x2e,0x00,0x32,0x11,0x12,0x39,0xba,
-0x00,0x36,0x00,0x2e,0x00,0x32,0x11,0x12,0x39,0x30,0x31,0x01,0x16,0x27,0x26,0x13,
-0x15,0x06,0x23,0x22,0x27,0x35,0x26,0x37,0x36,0x37,0x17,0x06,0x07,0x06,0x04,0x07,
-0x23,0x26,0x03,0x24,0x27,0x26,0x25,0x15,0x06,0x15,0x14,0x04,0x17,0x06,0x05,0x27,
-0x36,0x27,0x26,0x27,0x11,0x27,0x13,0x11,0x27,0x11,0x24,0x27,0x36,0x37,0x36,0x17,
-0x07,0x17,0x06,0x27,0x26,0x07,0x06,0x04,0x17,0x06,0x05,0x35,0x24,0x27,0x36,0x25,
-0x27,0x03,0x2e,0x01,0x35,0x34,0x3e,0x01,0x33,0x32,0x1e,0x01,0x15,0x14,0x06,0x07,
-0x01,0x54,0x44,0x15,0x24,0xf9,0x0c,0x1b,0x23,0x03,0xb6,0x01,0x07,0x9d,0x01,0x40,
-0x01,0x03,0x01,0x46,0x02,0x0f,0x1c,0xc5,0xfe,0xe8,0x06,0x02,0x01,0x10,0xab,0x02,
-0x2c,0x03,0x04,0xfe,0xed,0x01,0xbb,0x05,0x02,0xc3,0x4d,0x4d,0x4d,0xfe,0x76,0x04,
-0x0d,0xd5,0x45,0x38,0x70,0x5f,0x4c,0x63,0x31,0x0b,0x04,0x02,0xf3,0x06,0x07,0xfe,
-0x96,0x01,0x12,0x02,0x0d,0xfe,0xd7,0x4d,0x05,0x15,0x18,0x18,0x2a,0x16,0x17,0x2a,
-0x18,0x17,0x15,0x04,0xa4,0x1e,0x2b,0x0b,0xfb,0x94,0x42,0x1d,0x40,0x30,0x22,0x41,
-0x52,0x19,0x2f,0x18,0x16,0x30,0x3f,0x77,0x41,0x01,0xb7,0x25,0x6f,0x64,0x2f,0x44,
-0x26,0x33,0x2e,0x59,0x61,0x51,0x2f,0x35,0x23,0x33,0x24,0x22,0xfe,0xb4,0x13,0x03,
-0x01,0xfe,0x81,0x10,0x01,0x75,0x13,0x8a,0x90,0x05,0x04,0x49,0x1e,0x19,0x12,0x27,
-0x0d,0x40,0x33,0x2f,0x75,0x8a,0x10,0x3d,0x20,0x3d,0x23,0x6e,0x07,0x01,0x2d,0x0b,
-0x2e,0x18,0x19,0x2e,0x18,0x18,0x2e,0x19,0x18,0x2e,0x0b,0x00,0x00,0x03,0x00,0x79,
-0xff,0xec,0x06,0xb2,0x05,0xdb,0x00,0x03,0x00,0x07,0x00,0x34,0x00,0x75,0x00,0xb8,
-0x00,0x31,0x2f,0xb8,0x00,0x15,0x2f,0xb8,0x00,0x20,0x2f,0xba,0x00,0x09,0x00,0x0e,
-0x00,0x03,0x2b,0xb8,0x00,0x09,0x10,0xba,0x00,0x01,0x00,0x15,0x00,0x31,0x11,0x12,
-0x39,0xba,0x00,0x05,0x00,0x15,0x00,0x31,0x11,0x12,0x39,0xb8,0x00,0x0e,0x10,0xb8,
-0x00,0x1a,0xd0,0xba,0x00,0x1b,0x00,0x15,0x00,0x31,0x11,0x12,0x39,0xb8,0x00,0x0e,
-0x10,0xb8,0x00,0x26,0xd0,0xb8,0x00,0x09,0x10,0xb8,0x00,0x2c,0xd0,0xba,0x00,0x2e,
-0x00,0x15,0x00,0x31,0x11,0x12,0x39,0xb8,0x00,0x09,0x10,0xb8,0x00,0x2f,0xd0,0xb8,
-0x00,0x09,0x10,0xb8,0x00,0x32,0xd0,0xba,0x00,0x34,0x00,0x15,0x00,0x31,0x11,0x12,
-0x39,0x30,0x31,0x25,0x09,0x01,0x04,0x25,0x09,0x01,0x04,0x01,0x33,0x32,0x1d,0x01,
-0x14,0x2b,0x01,0x01,0x06,0x07,0x0e,0x01,0x23,0x22,0x2e,0x01,0x37,0x01,0x21,0x01,
-0x16,0x0e,0x01,0x23,0x22,0x26,0x27,0x26,0x27,0x01,0x23,0x26,0x3d,0x01,0x34,0x3b,
-0x01,0x37,0x17,0x33,0x1b,0x01,0x33,0x37,0x06,0x5f,0xfe,0xec,0xfe,0xec,0x01,0x15,
-0xfd,0xaf,0xfe,0xed,0xfe,0xec,0x01,0x14,0x03,0x93,0xd6,0x38,0x29,0xc2,0x01,0x14,
-0x02,0x30,0x2f,0xad,0x5f,0x5e,0xab,0x61,0x03,0x01,0x10,0xfd,0x4d,0x01,0x12,0x02,
-0x60,0xac,0x5e,0x5e,0xad,0x31,0x2f,0x01,0x01,0x13,0xcc,0x20,0x39,0xd7,0x35,0x33,
-0xfc,0x81,0x81,0xfc,0x34,0xed,0x03,0x3c,0xfc,0xc4,0x4c,0x4c,0x03,0x3c,0xfc,0xc4,
-0x4c,0x03,0xf7,0x2a,0x19,0x28,0xfc,0xc7,0x44,0x3e,0x3f,0x47,0x47,0x7e,0x46,0x03,
-0x36,0xfc,0xca,0x46,0x7e,0x47,0x47,0x3f,0x3e,0x44,0x03,0x39,0x11,0x1c,0x0f,0x2f,
-0x9b,0x9b,0x01,0x43,0xfe,0xbd,0x9b,0x00,0x00,0x02,0x00,0x7d,0x00,0x00,0x06,0xae,
-0x05,0xdb,0x00,0x16,0x00,0x22,0x00,0x37,0xba,0x00,0x1b,0x00,0x1e,0x00,0x03,0x2b,
-0xb8,0x00,0x1b,0x10,0x00,0xb8,0x00,0x02,0x2f,0xb8,0x00,0x04,0x2f,0xb8,0x00,0x18,
-0x2f,0xb8,0x00,0x1c,0x2f,0xb8,0x00,0x20,0x2f,0xba,0x00,0x17,0x00,0x1a,0x00,0x03,
-0x2b,0xb8,0x00,0x17,0x10,0xb8,0x00,0x1a,0x10,0xb8,0x00,0x1e,0xd0,0x30,0x31,0x01,
-0x36,0x33,0x32,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x26,0x27,0x2e,
-0x01,0x07,0x06,0x03,0x27,0x12,0x01,0x13,0x23,0x03,0x21,0x11,0x23,0x03,0x21,0x03,
-0x23,0x13,0x02,0xd2,0xb8,0x9e,0x36,0x32,0xc9,0x4b,0x23,0x11,0x2b,0x7e,0x7e,0xe0,
-0x52,0x21,0x4e,0x8f,0xa3,0xc7,0x78,0xe5,0x04,0xed,0x5f,0x7f,0x54,0xfe,0xe2,0x8a,
-0x01,0xfe,0xe3,0x56,0x7f,0x5f,0x05,0x87,0x54,0x09,0x27,0xa6,0x4e,0x51,0x39,0x3b,
-0x8d,0x3a,0x3b,0x50,0xb3,0x48,0x69,0x3f,0x43,0xfe,0xdf,0x44,0x01,0x99,0xfd,0x7c,
-0xfd,0xa6,0x01,0xd7,0xfe,0x29,0x01,0xd7,0xfe,0x29,0x02,0x5a,0x00,0x02,0x01,0x29,
-0x00,0x00,0x06,0x01,0x05,0xdb,0x00,0x0f,0x00,0x36,0x00,0xd7,0xba,0x00,0x00,0x00,
-0x2a,0x00,0x03,0x2b,0xba,0x00,0x1a,0x00,0x24,0x00,0x03,0x2b,0xb8,0x00,0x1a,0x10,
-0xba,0x00,0x32,0x00,0x08,0x00,0x03,0x2b,0xb8,0x00,0x32,0x10,0x41,0x1b,0x00,0x16,
-0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x56,
-0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x86,0x00,0x00,0x00,0x96,
-0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0xd6,
-0x00,0x00,0x00,0x0d,0x5d,0x41,0x05,0x00,0xe5,0x00,0x00,0x00,0xf5,0x00,0x00,0x00,
-0x02,0x5d,0x41,0x05,0x00,0xea,0x00,0x08,0x00,0xfa,0x00,0x08,0x00,0x02,0x5d,0x41,
-0x1b,0x00,0x19,0x00,0x08,0x00,0x29,0x00,0x08,0x00,0x39,0x00,0x08,0x00,0x49,0x00,
-0x08,0x00,0x59,0x00,0x08,0x00,0x69,0x00,0x08,0x00,0x79,0x00,0x08,0x00,0x89,0x00,
-0x08,0x00,0x99,0x00,0x08,0x00,0xa9,0x00,0x08,0x00,0xb9,0x00,0x08,0x00,0xc9,0x00,
-0x08,0x00,0xd9,0x00,0x08,0x00,0x0d,0x5d,0xb8,0x00,0x1a,0x10,0xb8,0x00,0x10,0xd0,
-0xb8,0x00,0x10,0x2f,0xb8,0x00,0x24,0x10,0xb8,0x00,0x1d,0xd0,0xb8,0x00,0x1d,0x2f,
-0x00,0xb8,0x00,0x1a,0x2f,0xba,0x00,0x2e,0x00,0x0c,0x00,0x03,0x2b,0xb8,0x00,0x2e,
-0x10,0x30,0x31,0x01,0x14,0x1e,0x01,0x33,0x32,0x3e,0x01,0x35,0x34,0x2e,0x01,0x23,
-0x22,0x0e,0x01,0x13,0x15,0x33,0x16,0x36,0x37,0x14,0x04,0x07,0x06,0x07,0x23,0x26,
-0x37,0x26,0x24,0x03,0x1e,0x01,0x37,0x33,0x35,0x26,0x27,0x2e,0x01,0x35,0x34,0x3e,
-0x01,0x33,0x32,0x1e,0x01,0x15,0x14,0x06,0x07,0x06,0x02,0xe6,0x32,0x5b,0x30,0x32,
-0x5b,0x32,0x34,0x5a,0x31,0x2f,0x5b,0x33,0xee,0x06,0x98,0xe2,0xad,0xfe,0x29,0x27,
-0x35,0x02,0x2a,0x2e,0x03,0x05,0xfe,0x0f,0x58,0xc7,0xf7,0x90,0x06,0x41,0x3c,0x4e,
-0x57,0x58,0x9d,0x53,0x53,0x9e,0x5a,0x58,0x4e,0x39,0x04,0x92,0x32,0x59,0x32,0x32,
-0x59,0x32,0x32,0x5b,0x30,0x30,0x5b,0xfe,0x88,0x9c,0x01,0xc0,0x26,0xe7,0x9a,0x97,
-0x88,0xf5,0xb3,0xa3,0x84,0x8f,0x01,0x31,0x02,0xf5,0x0d,0x9b,0x07,0x23,0x2b,0x9c,
-0x56,0x56,0x9e,0x55,0x55,0x9e,0x56,0x56,0x9c,0x2b,0x20,0x00,0x00,0x03,0x00,0xa9,
-0x00,0x00,0x06,0x84,0x05,0xdb,0x00,0x0f,0x00,0x1f,0x00,0x5f,0x01,0x1f,0xb8,0x00,
-0x60,0x2f,0xb8,0x00,0x61,0x2f,0xb8,0x00,0x60,0x10,0xb8,0x00,0x00,0xd0,0xb8,0x00,
-0x00,0x2f,0xb8,0x00,0x61,0x10,0xb8,0x00,0x08,0xdc,0xb8,0x00,0x14,0xdc,0x41,0x05,
-0x00,0xea,0x00,0x14,0x00,0xfa,0x00,0x14,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,
-0x14,0x00,0x29,0x00,0x14,0x00,0x39,0x00,0x14,0x00,0x49,0x00,0x14,0x00,0x59,0x00,
-0x14,0x00,0x69,0x00,0x14,0x00,0x79,0x00,0x14,0x00,0x89,0x00,0x14,0x00,0x99,0x00,
-0x14,0x00,0xa9,0x00,0x14,0x00,0xb9,0x00,0x14,0x00,0xc9,0x00,0x14,0x00,0xd9,0x00,
-0x14,0x00,0x0d,0x5d,0xb8,0x00,0x00,0x10,0xb8,0x00,0x1c,0xdc,0x41,0x1b,0x00,0x16,
-0x00,0x1c,0x00,0x26,0x00,0x1c,0x00,0x36,0x00,0x1c,0x00,0x46,0x00,0x1c,0x00,0x56,
-0x00,0x1c,0x00,0x66,0x00,0x1c,0x00,0x76,0x00,0x1c,0x00,0x86,0x00,0x1c,0x00,0x96,
-0x00,0x1c,0x00,0xa6,0x00,0x1c,0x00,0xb6,0x00,0x1c,0x00,0xc6,0x00,0x1c,0x00,0xd6,
-0x00,0x1c,0x00,0x0d,0x5d,0x41,0x05,0x00,0xe5,0x00,0x1c,0x00,0xf5,0x00,0x1c,0x00,
-0x02,0x5d,0xb8,0x00,0x14,0x10,0xb8,0x00,0x26,0xd0,0xb8,0x00,0x26,0x2f,0xb8,0x00,
-0x1c,0x10,0xb8,0x00,0x2b,0xd0,0xb8,0x00,0x2b,0x2f,0xb8,0x00,0x00,0x10,0xb8,0x00,
-0x33,0xd0,0xb8,0x00,0x33,0x2f,0xb8,0x00,0x1c,0x10,0xb8,0x00,0x46,0xd0,0xb8,0x00,
-0x46,0x2f,0xb8,0x00,0x14,0x10,0xb8,0x00,0x4b,0xd0,0xb8,0x00,0x4b,0x2f,0xb8,0x00,
-0x08,0x10,0xb8,0x00,0x53,0xd0,0xb8,0x00,0x53,0x2f,0x00,0xb8,0x00,0x48,0x2f,0xb8,
-0x00,0x28,0x2f,0xba,0x00,0x18,0x00,0x04,0x00,0x03,0x2b,0xb8,0x00,0x18,0x10,0xba,
-0x00,0x0c,0x00,0x10,0x00,0x03,0x2b,0xb8,0x00,0x0c,0x10,0x30,0x31,0x01,0x14,0x1e,
-0x01,0x33,0x32,0x3e,0x01,0x35,0x34,0x2e,0x01,0x23,0x22,0x0e,0x01,0x25,0x32,0x1e,
-0x01,0x15,0x14,0x0e,0x01,0x23,0x22,0x2e,0x01,0x35,0x34,0x3e,0x01,0x01,0x07,0x27,
-0x07,0x17,0x07,0x27,0x0f,0x01,0x23,0x2f,0x01,0x07,0x27,0x37,0x27,0x07,0x27,0x37,
-0x27,0x07,0x27,0x37,0x2f,0x01,0x35,0x3f,0x01,0x27,0x37,0x17,0x37,0x27,0x37,0x17,
-0x37,0x27,0x37,0x17,0x3f,0x01,0x33,0x1f,0x01,0x37,0x17,0x07,0x17,0x37,0x17,0x07,
-0x17,0x37,0x17,0x07,0x1f,0x01,0x15,0x0f,0x01,0x17,0x07,0x27,0x07,0x01,0x86,0x8c,
-0xfb,0x89,0x8a,0xfb,0x8c,0x90,0xfc,0x85,0x86,0xfc,0x8e,0x02,0x10,0x27,0x48,0x29,
-0x28,0x48,0x28,0x27,0x48,0x28,0x28,0x49,0x02,0x5c,0x48,0x73,0x3d,0x11,0x5d,0x53,
-0x48,0x24,0x65,0x24,0x48,0x52,0x5e,0x0f,0x3c,0x72,0x48,0x40,0x28,0x86,0x27,0x6a,
-0x0e,0x7f,0x7e,0x0d,0x68,0x28,0x83,0x29,0x3f,0x48,0x73,0x3c,0x10,0x5d,0x54,0x48,
-0x23,0x65,0x24,0x48,0x52,0x5e,0x10,0x3c,0x73,0x48,0x41,0x29,0x86,0x26,0x6a,0x0f,
-0x7f,0x7e,0x0e,0x68,0x27,0x83,0x2a,0x02,0xed,0x89,0xfb,0x8b,0x8b,0xfb,0x89,0x8a,
-0xfe,0x89,0x89,0xfe,0x0e,0x27,0x49,0x28,0x27,0x48,0x28,0x28,0x48,0x27,0x28,0x49,
-0x27,0xfd,0x7b,0x48,0x40,0x28,0x86,0x27,0x6b,0x0e,0x80,0x7f,0x0d,0x69,0x28,0x83,
-0x29,0x3f,0x48,0x73,0x3c,0x10,0x5d,0x53,0x48,0x24,0x65,0x24,0x48,0x52,0x5e,0x0f,
-0x3b,0x73,0x48,0x41,0x29,0x86,0x26,0x6a,0x0e,0x80,0x7f,0x0e,0x69,0x27,0x84,0x2a,
-0x41,0x48,0x73,0x3c,0x10,0x5d,0x53,0x48,0x24,0x65,0x24,0x48,0x52,0x5e,0x0f,0x3b,
-0x00,0x0f,0x01,0x06,0xff,0xed,0x06,0x25,0x05,0xdd,0x00,0x09,0x00,0x0e,0x00,0x13,
-0x00,0x18,0x00,0x1d,0x00,0x22,0x00,0x27,0x00,0x2c,0x00,0x31,0x00,0x36,0x00,0x3b,
-0x00,0x40,0x00,0x45,0x00,0x51,0x00,0x94,0x01,0x0b,0xba,0x00,0x7c,0x00,0x52,0x00,
-0x03,0x2b,0xb8,0x00,0x7c,0x10,0xba,0x00,0x04,0x00,0x52,0x00,0x7c,0x11,0x12,0x39,
-0xba,0x00,0x06,0x00,0x52,0x00,0x7c,0x11,0x12,0x39,0xb8,0x00,0x68,0xd0,0xb8,0x00,
-0x68,0x2f,0xb8,0x00,0x52,0x10,0xb8,0x00,0x81,0xd0,0xb8,0x00,0x81,0x2f,0xb8,0x00,
-0x52,0x10,0xb8,0x00,0x83,0xd0,0x00,0xb8,0x00,0x7f,0x2f,0xb8,0x00,0x06,0x2f,0xb8,
-0x00,0x5c,0x2f,0xba,0x00,0x8f,0x00,0x8b,0x00,0x03,0x2b,0xb8,0x00,0x8f,0x10,0xba,
-0x00,0x04,0x00,0x8b,0x00,0x8f,0x11,0x12,0x39,0xba,0x00,0x0a,0x00,0x8b,0x00,0x8f,
-0x11,0x12,0x39,0xba,0x00,0x0f,0x00,0x8b,0x00,0x8f,0x11,0x12,0x39,0xba,0x00,0x14,
-0x00,0x8b,0x00,0x8f,0x11,0x12,0x39,0xba,0x00,0x19,0x00,0x8b,0x00,0x8f,0x11,0x12,
-0x39,0xba,0x00,0x1e,0x00,0x8b,0x00,0x8f,0x11,0x12,0x39,0xba,0x00,0x23,0x00,0x8b,
-0x00,0x8f,0x11,0x12,0x39,0xba,0x00,0x25,0x00,0x8b,0x00,0x8f,0x11,0x12,0x39,0xba,
-0x00,0x2b,0x00,0x8b,0x00,0x8f,0x11,0x12,0x39,0xba,0x00,0x30,0x00,0x8b,0x00,0x8f,
-0x11,0x12,0x39,0xba,0x00,0x35,0x00,0x8b,0x00,0x8f,0x11,0x12,0x39,0xba,0x00,0x3a,
-0x00,0x8b,0x00,0x8f,0x11,0x12,0x39,0xba,0x00,0x3f,0x00,0x8b,0x00,0x8f,0x11,0x12,
-0x39,0xba,0x00,0x42,0x00,0x8b,0x00,0x8f,0x11,0x12,0x39,0xba,0x00,0x44,0x00,0x8b,
-0x00,0x8f,0x11,0x12,0x39,0xb8,0x00,0x6f,0xd0,0xb8,0x00,0x6f,0x2f,0xb8,0x00,0x8b,
-0x10,0xb8,0x00,0x73,0xd0,0xb8,0x00,0x73,0x2f,0xba,0x00,0x91,0x00,0x8b,0x00,0x8f,
-0x11,0x12,0x39,0x30,0x31,0x01,0x14,0x1e,0x01,0x33,0x26,0x37,0x22,0x0e,0x01,0x05,
-0x16,0x17,0x37,0x26,0x27,0x16,0x17,0x37,0x26,0x27,0x16,0x17,0x37,0x26,0x27,0x16,
-0x07,0x37,0x26,0x27,0x16,0x07,0x17,0x36,0x27,0x06,0x07,0x17,0x36,0x25,0x17,0x36,
-0x37,0x06,0x07,0x17,0x36,0x37,0x06,0x07,0x17,0x36,0x37,0x06,0x1f,0x01,0x26,0x37,
-0x06,0x17,0x37,0x26,0x37,0x06,0x17,0x37,0x26,0x27,0x06,0x05,0x22,0x06,0x15,0x14,
-0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x35,0x26,0x27,0x2e,0x01,0x35,0x34,0x3e,
-0x01,0x33,0x32,0x1e,0x01,0x15,0x14,0x06,0x07,0x06,0x07,0x33,0x14,0x23,0x15,0x16,
-0x17,0x16,0x17,0x36,0x37,0x04,0x17,0x06,0x23,0x26,0x07,0x16,0x15,0x14,0x07,0x06,
-0x07,0x03,0x15,0x06,0x23,0x22,0x2f,0x01,0x03,0x26,0x27,0x26,0x35,0x34,0x37,0x26,
-0x07,0x22,0x27,0x36,0x25,0x16,0x17,0x36,0x37,0x36,0x03,0x56,0x11,0x1f,0x12,0x1d,
-0x1d,0x11,0x20,0x11,0x02,0x04,0x6e,0x2a,0x1a,0x5b,0x91,0x6e,0x25,0x27,0x5a,0x78,
-0x4c,0x10,0x30,0x3c,0x7b,0x32,0x01,0x3b,0x26,0x62,0x03,0x18,0x3b,0x02,0x3e,0x2f,
-0x32,0x3a,0x2e,0xfc,0x6d,0x1a,0x2a,0x6e,0x57,0x29,0x27,0x24,0x6f,0x60,0x14,0x30,
-0x10,0x4c,0x50,0x0f,0x3b,0x01,0x32,0x46,0x3c,0x3b,0x19,0x04,0x28,0x65,0x3a,0x32,
-0x2f,0x07,0x01,0x22,0x37,0x4c,0x4c,0x37,0x35,0x4d,0x4c,0x5a,0x03,0x02,0x13,0x15,
-0x15,0x27,0x15,0x14,0x26,0x16,0x15,0x13,0x02,0x03,0x01,0x01,0x34,0x29,0x03,0x03,
-0x50,0x16,0x01,0x4e,0x50,0x55,0xfe,0x51,0x37,0x04,0x34,0x28,0x34,0x01,0x0b,0x17,
-0x19,0x08,0x01,0x02,0x33,0x28,0x34,0x03,0x3a,0x58,0xfe,0x55,0x50,0x01,0x4e,0x15,
-0x52,0x07,0x09,0x28,0x05,0x8f,0x11,0x1f,0x12,0x40,0x44,0x11,0x20,0x56,0x3e,0x30,
-0x26,0x38,0x14,0x61,0x3e,0x21,0x55,0x2a,0x7e,0x45,0x13,0x6d,0x4c,0x91,0x4b,0x08,
-0x7d,0x60,0x9a,0x47,0x0a,0x82,0x66,0x88,0x37,0x1a,0x72,0x0a,0x26,0x30,0x3e,0x10,
-0x6a,0x21,0x3e,0x61,0x29,0x86,0x13,0x45,0x7e,0x43,0x88,0x08,0x4b,0x91,0x57,0x8b,
-0x0a,0x47,0x9a,0x69,0x73,0x1a,0x37,0x88,0x67,0x3a,0x4d,0x35,0x37,0x4c,0x4c,0x37,
-0x35,0x4d,0x2d,0x5a,0x01,0x02,0x0a,0x27,0x15,0x15,0x27,0x15,0x15,0x27,0x15,0x15,
-0x27,0x0a,0x02,0x01,0x01,0x59,0x09,0x28,0x03,0x04,0x80,0x35,0x06,0x5b,0xa3,0x18,
-0x18,0x14,0x15,0x4a,0x35,0x28,0x09,0xfc,0xd6,0x5c,0x16,0x1c,0x64,0x03,0x1c,0x09,
-0x28,0x35,0x4a,0x12,0x11,0x20,0x1b,0xa3,0x5b,0x06,0x34,0x8c,0x0a,0x09,0x27,0x00,
-0x00,0x0f,0x01,0x05,0x00,0x00,0x06,0x27,0x05,0xd3,0x00,0x0f,0x00,0x1b,0x00,0x27,
-0x00,0x2f,0x00,0x47,0x00,0x53,0x00,0x8b,0x00,0x97,0x00,0x9f,0x00,0xa7,0x00,0xb3,
-0x00,0xbb,0x00,0xc3,0x00,0xcb,0x00,0xd7,0x02,0x6d,0xb8,0x00,0xd8,0x2f,0xb8,0x00,
-0xd9,0x2f,0xb8,0x00,0xd8,0x10,0xb8,0x00,0xba,0xd0,0xb8,0x00,0xba,0x2f,0xb8,0x00,
-0x10,0xd0,0xb8,0x00,0x10,0x2f,0xb8,0x00,0xd9,0x10,0xb8,0x00,0x4a,0xdc,0xb8,0x00,
-0x1c,0xd0,0xb8,0x00,0x4a,0x10,0xb8,0x00,0x28,0xd0,0xb8,0x00,0x28,0x2f,0xb8,0x00,
-0x4a,0x10,0xb8,0x00,0x2a,0xd0,0xb8,0x00,0x2a,0x2f,0xb8,0x00,0x4a,0x10,0xb8,0x00,
-0x2c,0xd0,0xb8,0x00,0x2c,0x2f,0xb8,0x00,0x4a,0x10,0xb8,0x00,0x9e,0xdc,0x41,0x05,
-0x00,0xea,0x00,0x9e,0x00,0xfa,0x00,0x9e,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,
-0x9e,0x00,0x29,0x00,0x9e,0x00,0x39,0x00,0x9e,0x00,0x49,0x00,0x9e,0x00,0x59,0x00,
-0x9e,0x00,0x69,0x00,0x9e,0x00,0x79,0x00,0x9e,0x00,0x89,0x00,0x9e,0x00,0x99,0x00,
-0x9e,0x00,0xa9,0x00,0x9e,0x00,0xb9,0x00,0x9e,0x00,0xc9,0x00,0x9e,0x00,0xd9,0x00,
-0x9e,0x00,0x0d,0x5d,0xb8,0x00,0x30,0xd0,0xb8,0x00,0x30,0x2f,0xb8,0x00,0xba,0x10,
-0xb8,0x00,0xbc,0xdc,0x41,0x1b,0x00,0x16,0x00,0xbc,0x00,0x26,0x00,0xbc,0x00,0x36,
-0x00,0xbc,0x00,0x46,0x00,0xbc,0x00,0x56,0x00,0xbc,0x00,0x66,0x00,0xbc,0x00,0x76,
-0x00,0xbc,0x00,0x86,0x00,0xbc,0x00,0x96,0x00,0xbc,0x00,0xa6,0x00,0xbc,0x00,0xb6,
-0x00,0xbc,0x00,0xc6,0x00,0xbc,0x00,0xd6,0x00,0xbc,0x00,0x0d,0x5d,0x41,0x05,0x00,
-0xe5,0x00,0xbc,0x00,0xf5,0x00,0xbc,0x00,0x02,0x5d,0xb8,0x00,0x38,0xd0,0xb8,0x00,
-0x38,0x2f,0xb8,0x00,0xbc,0x10,0xb8,0x00,0x3a,0xd0,0xb8,0x00,0x3a,0x2f,0xb8,0x00,
-0xbc,0x10,0xb8,0x00,0x3c,0xd0,0xb8,0x00,0x3c,0x2f,0xb8,0x00,0x9e,0x10,0xb8,0x00,
-0x44,0xd0,0xb8,0x00,0x44,0x2f,0xb8,0x00,0x9e,0x10,0xb8,0x00,0x46,0xd0,0xb8,0x00,
-0x46,0x2f,0xb8,0x00,0x9e,0x10,0xb8,0x00,0x98,0xd0,0xb8,0x00,0x98,0x2f,0xba,0x00,
-0x9a,0x00,0xba,0x00,0x2a,0x11,0x12,0x39,0xb8,0x00,0xbc,0x10,0xb8,0x00,0xa0,0xd0,
-0xb8,0x00,0xa0,0x2f,0xb8,0x00,0xbc,0x10,0xb8,0x00,0xa2,0xd0,0xba,0x00,0xa6,0x00,
-0xba,0x00,0x2a,0x11,0x12,0x39,0xb8,0x00,0xba,0x10,0xb8,0x00,0xb2,0xd0,0xb8,0x00,
-0xb2,0x2f,0xb8,0x00,0xba,0x10,0xb8,0x00,0xb4,0xd0,0xb8,0x00,0xb4,0x2f,0xb8,0x00,
-0xba,0x10,0xb8,0x00,0xb8,0xd0,0xb8,0x00,0xb8,0x2f,0xb8,0x00,0xbc,0x10,0xb8,0x00,
-0xbe,0xd0,0xb8,0x00,0xbe,0x2f,0xba,0x00,0xc0,0x00,0xba,0x00,0x2a,0x11,0x12,0x39,
-0xba,0x00,0xc4,0x00,0xba,0x00,0x2a,0x11,0x12,0x39,0xb8,0x00,0x9e,0x10,0xb8,0x00,
-0xc6,0xd0,0xb8,0x00,0xc6,0x2f,0xb8,0x00,0x9e,0x10,0xb8,0x00,0xc8,0xd0,0x00,0xb8,
-0x00,0x58,0x2f,0xb8,0x00,0x75,0x2f,0xba,0x00,0x5e,0x00,0x52,0x00,0x03,0x2b,0xb8,
-0x00,0x5e,0x10,0xba,0x00,0x28,0x00,0x75,0x00,0x58,0x11,0x12,0x39,0xba,0x00,0x2c,
-0x00,0x75,0x00,0x58,0x11,0x12,0x39,0xb8,0x00,0x8a,0xd0,0xba,0x00,0x98,0x00,0x75,
-0x00,0x58,0x11,0x12,0x39,0xba,0x00,0x9a,0x00,0x75,0x00,0x58,0x11,0x12,0x39,0xba,
-0x00,0x9e,0x00,0x75,0x00,0x58,0x11,0x12,0x39,0xba,0x00,0xa2,0x00,0x75,0x00,0x58,
-0x11,0x12,0x39,0xba,0x00,0xa6,0x00,0x75,0x00,0x58,0x11,0x12,0x39,0xb8,0x00,0x52,
-0x10,0xb8,0x00,0xaa,0xd0,0xba,0x00,0xb4,0x00,0x75,0x00,0x58,0x11,0x12,0x39,0xba,
-0x00,0xb8,0x00,0x75,0x00,0x58,0x11,0x12,0x39,0xba,0x00,0xbc,0x00,0x75,0x00,0x58,
-0x11,0x12,0x39,0xba,0x00,0xbe,0x00,0x75,0x00,0x58,0x11,0x12,0x39,0xba,0x00,0xc0,
-0x00,0x75,0x00,0x58,0x11,0x12,0x39,0xba,0x00,0xc4,0x00,0x75,0x00,0x58,0x11,0x12,
-0x39,0xba,0x00,0xc6,0x00,0x75,0x00,0x58,0x11,0x12,0x39,0xba,0x00,0xc8,0x00,0x75,
-0x00,0x58,0x11,0x12,0x39,0x30,0x31,0x01,0x32,0x1e,0x01,0x15,0x14,0x0e,0x01,0x23,
-0x22,0x2e,0x01,0x35,0x34,0x3e,0x01,0x07,0x26,0x27,0x06,0x07,0x06,0x17,0x16,0x37,
-0x36,0x37,0x26,0x25,0x06,0x07,0x16,0x17,0x16,0x37,0x36,0x27,0x26,0x27,0x06,0x27,
-0x16,0x15,0x14,0x07,0x36,0x37,0x26,0x27,0x26,0x27,0x26,0x27,0x06,0x07,0x06,0x07,
-0x06,0x15,0x14,0x17,0x16,0x17,0x16,0x17,0x36,0x37,0x36,0x37,0x36,0x35,0x34,0x13,
-0x16,0x17,0x16,0x17,0x36,0x37,0x36,0x27,0x26,0x07,0x06,0x05,0x37,0x3e,0x01,0x33,
-0x32,0x16,0x17,0x15,0x36,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x17,0x16,
-0x17,0x16,0x15,0x14,0x07,0x0e,0x01,0x27,0x23,0x06,0x07,0x06,0x23,0x22,0x27,0x26,
-0x27,0x06,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x26,0x27,0x26,0x35,0x34,0x37,
-0x36,0x37,0x36,0x05,0x26,0x27,0x26,0x23,0x22,0x07,0x06,0x07,0x16,0x17,0x36,0x17,
-0x06,0x07,0x16,0x17,0x16,0x17,0x26,0x25,0x06,0x07,0x36,0x37,0x36,0x37,0x26,0x27,
-0x26,0x27,0x26,0x07,0x06,0x17,0x16,0x17,0x36,0x37,0x36,0x07,0x06,0x07,0x16,0x17,
-0x26,0x35,0x34,0x17,0x16,0x17,0x36,0x37,0x26,0x27,0x26,0x17,0x16,0x17,0x36,0x37,
-0x06,0x07,0x06,0x07,0x06,0x07,0x16,0x17,0x16,0x33,0x32,0x37,0x36,0x37,0x26,0x03,
-0x96,0x13,0x24,0x14,0x14,0x24,0x13,0x14,0x24,0x14,0x14,0x24,0xe1,0x4f,0x47,0x7f,
-0x33,0x36,0x19,0x19,0x65,0x63,0x98,0x0e,0x01,0xe2,0x06,0x0e,0x99,0x63,0x65,0x19,
-0x1a,0x37,0x34,0x7f,0x47,0x4c,0x02,0x02,0x39,0x34,0x34,0x6d,0x2f,0x31,0x32,0x32,
-0x31,0x30,0x32,0x2f,0x02,0x02,0x2e,0x33,0x30,0x33,0x31,0x31,0x32,0x2e,0x03,0x19,
-0x0f,0x06,0x4f,0x46,0x7d,0x36,0x38,0x1a,0x1a,0x67,0x65,0xfd,0xb4,0x01,0x22,0x77,
-0x3f,0x3e,0x76,0x22,0xa9,0x72,0x74,0x20,0x0c,0x23,0x38,0x88,0x01,0x8a,0x37,0x21,
-0x0c,0x1f,0xe2,0xac,0x01,0x22,0x3a,0x3b,0x40,0x41,0x3c,0x3a,0x22,0xab,0xe3,0x1f,
-0x0b,0x21,0x36,0x8a,0x88,0x36,0x23,0x0b,0x20,0x73,0x72,0x02,0x2a,0x1b,0x2e,0x2f,
-0x31,0x33,0x2f,0x2e,0x1b,0x55,0x56,0x54,0x5c,0x3c,0x3e,0x22,0x24,0x21,0x21,0x05,
-0xfe,0x95,0x09,0x05,0x21,0x22,0x23,0x22,0x3e,0x6b,0x95,0x63,0x67,0x19,0x1b,0x38,
-0x36,0x7c,0x46,0x4f,0x06,0x09,0x39,0x33,0x33,0x39,0x01,0x39,0x05,0x09,0x3c,0x3e,
-0x23,0x22,0x23,0xd6,0x3e,0x3c,0x09,0x05,0x20,0x22,0x24,0x5a,0x54,0x55,0x1a,0x2e,
-0x2f,0x34,0x33,0x2e,0x2e,0x1a,0x56,0x03,0x35,0x13,0x24,0x15,0x14,0x23,0x14,0x14,
-0x23,0x14,0x15,0x24,0x13,0xd9,0x35,0x39,0x67,0x54,0x56,0x2b,0x2b,0x04,0x04,0x39,
-0x5a,0x5e,0x5e,0x5a,0x39,0x04,0x04,0x2b,0x2b,0x56,0x54,0x67,0x39,0xa7,0x27,0x28,
-0x27,0x27,0x26,0x28,0x29,0x49,0x1e,0x1c,0x1c,0x1a,0x1a,0x1c,0x1c,0x1e,0x38,0x3a,
-0x39,0x38,0x1e,0x1c,0x1d,0x1a,0x1a,0x1d,0x1c,0x1e,0x38,0x39,0x3a,0x01,0x0c,0x5a,
-0x5f,0x35,0x39,0x65,0x55,0x56,0x2d,0x2c,0x05,0x05,0x09,0x02,0xb3,0xc0,0xc0,0xb3,
-0x02,0x3c,0x02,0x02,0x38,0x14,0x1b,0x2e,0x3e,0x65,0x75,0x01,0x76,0x63,0x3e,0x2d,
-0x1b,0x14,0x37,0x06,0x3d,0xb0,0x62,0x63,0x63,0x62,0xb0,0x3e,0x07,0x37,0x14,0x1a,
-0x2d,0x3f,0x63,0x77,0x75,0x64,0x3f,0x2f,0x1a,0x14,0x38,0x02,0x02,0x4d,0xa2,0x57,
-0x5a,0x5a,0x57,0xa2,0x20,0x2a,0x2a,0x10,0x19,0x1d,0x12,0x14,0x15,0x14,0x44,0x40,
-0x40,0x44,0x14,0x15,0x14,0x12,0x1d,0x2b,0x38,0x05,0x05,0x2c,0x2d,0x56,0x54,0x65,
-0x39,0x35,0x5e,0x9d,0x26,0x29,0x28,0x26,0x27,0x27,0x28,0xd6,0x44,0x41,0x19,0x1d,
-0x12,0x14,0x14,0x3a,0x1d,0x19,0x41,0x44,0x15,0x14,0x14,0x2e,0x2a,0x21,0x9e,0x59,
-0x5b,0x5b,0x59,0x9e,0x21,0x00,0x00,0x07,0x01,0x05,0x00,0x00,0x06,0x26,0x05,0xd6,
-0x00,0x0b,0x00,0x14,0x00,0x1d,0x00,0x29,0x00,0x72,0x00,0x82,0x00,0x92,0x02,0x61,
-0xba,0x00,0x11,0x00,0x6f,0x00,0x03,0x2b,0xb8,0x00,0x11,0x10,0xba,0x00,0x3e,0x00,
-0x38,0x00,0x03,0x2b,0xb8,0x00,0x3e,0x10,0xba,0x00,0x51,0x00,0x19,0x00,0x03,0x2b,
-0xb8,0x00,0x51,0x10,0x41,0x05,0x00,0xea,0x00,0x38,0x00,0xfa,0x00,0x38,0x00,0x02,
-0x5d,0x41,0x1b,0x00,0x19,0x00,0x38,0x00,0x29,0x00,0x38,0x00,0x39,0x00,0x38,0x00,
-0x49,0x00,0x38,0x00,0x59,0x00,0x38,0x00,0x69,0x00,0x38,0x00,0x79,0x00,0x38,0x00,
-0x89,0x00,0x38,0x00,0x99,0x00,0x38,0x00,0xa9,0x00,0x38,0x00,0xb9,0x00,0x38,0x00,
-0xc9,0x00,0x38,0x00,0xd9,0x00,0x38,0x00,0x0d,0x5d,0xba,0x00,0x1e,0x00,0x38,0x00,
-0x3e,0x11,0x12,0x39,0xb8,0x00,0x1e,0x2f,0x41,0x05,0x00,0xea,0x00,0x1e,0x00,0xfa,
-0x00,0x1e,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,0x1e,0x00,0x29,0x00,0x1e,0x00,
-0x39,0x00,0x1e,0x00,0x49,0x00,0x1e,0x00,0x59,0x00,0x1e,0x00,0x69,0x00,0x1e,0x00,
-0x79,0x00,0x1e,0x00,0x89,0x00,0x1e,0x00,0x99,0x00,0x1e,0x00,0xa9,0x00,0x1e,0x00,
-0xb9,0x00,0x1e,0x00,0xc9,0x00,0x1e,0x00,0xd9,0x00,0x1e,0x00,0x0d,0x5d,0xb8,0x00,
-0x00,0xdc,0xba,0x00,0x06,0x00,0x38,0x00,0x3e,0x11,0x12,0x39,0xb8,0x00,0x06,0x2f,
-0x41,0x05,0x00,0xea,0x00,0x06,0x00,0xfa,0x00,0x06,0x00,0x02,0x5d,0x41,0x1b,0x00,
-0x19,0x00,0x06,0x00,0x29,0x00,0x06,0x00,0x39,0x00,0x06,0x00,0x49,0x00,0x06,0x00,
-0x59,0x00,0x06,0x00,0x69,0x00,0x06,0x00,0x79,0x00,0x06,0x00,0x89,0x00,0x06,0x00,
-0x99,0x00,0x06,0x00,0xa9,0x00,0x06,0x00,0xb9,0x00,0x06,0x00,0xc9,0x00,0x06,0x00,
-0xd9,0x00,0x06,0x00,0x0d,0x5d,0x41,0x1b,0x00,0x16,0x00,0x11,0x00,0x26,0x00,0x11,
-0x00,0x36,0x00,0x11,0x00,0x46,0x00,0x11,0x00,0x56,0x00,0x11,0x00,0x66,0x00,0x11,
-0x00,0x76,0x00,0x11,0x00,0x86,0x00,0x11,0x00,0x96,0x00,0x11,0x00,0xa6,0x00,0x11,
-0x00,0xb6,0x00,0x11,0x00,0xc6,0x00,0x11,0x00,0xd6,0x00,0x11,0x00,0x0d,0x5d,0x41,
-0x05,0x00,0xe5,0x00,0x11,0x00,0xf5,0x00,0x11,0x00,0x02,0x5d,0xb8,0x00,0x11,0x10,
-0xb8,0x00,0x24,0xdc,0xb8,0x00,0x0c,0xdc,0xba,0x00,0x0f,0x00,0x11,0x00,0x24,0x11,
-0x12,0x39,0xba,0x00,0x13,0x00,0x11,0x00,0x24,0x11,0x12,0x39,0xb8,0x00,0x06,0x10,
-0xb8,0x00,0x15,0xdc,0xba,0x00,0x17,0x00,0x6f,0x00,0x51,0x11,0x12,0x39,0x41,0x05,
-0x00,0xea,0x00,0x19,0x00,0xfa,0x00,0x19,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,
-0x19,0x00,0x29,0x00,0x19,0x00,0x39,0x00,0x19,0x00,0x49,0x00,0x19,0x00,0x59,0x00,
-0x19,0x00,0x69,0x00,0x19,0x00,0x79,0x00,0x19,0x00,0x89,0x00,0x19,0x00,0x99,0x00,
-0x19,0x00,0xa9,0x00,0x19,0x00,0xb9,0x00,0x19,0x00,0xc9,0x00,0x19,0x00,0xd9,0x00,
-0x19,0x00,0x0d,0x5d,0xba,0x00,0x1c,0x00,0x6f,0x00,0x51,0x11,0x12,0x39,0xba,0x00,
-0x3c,0x00,0x38,0x00,0x3e,0x11,0x12,0x39,0xb8,0x00,0x19,0x10,0xb8,0x00,0x87,0xd0,
-0xb8,0x00,0x87,0x2f,0xb8,0x00,0x11,0x10,0xb8,0x00,0x8f,0xd0,0xb8,0x00,0x8f,0x2f,
-0x00,0xb8,0x00,0x3b,0x2f,0xb8,0x00,0x5f,0x2f,0xba,0x00,0x8b,0x00,0x77,0x00,0x03,
-0x2b,0xb8,0x00,0x8b,0x10,0xba,0x00,0x32,0x00,0x2e,0x00,0x03,0x2b,0xb8,0x00,0x32,
-0x10,0xba,0x00,0x0f,0x00,0x5f,0x00,0x3b,0x11,0x12,0x39,0xba,0x00,0x13,0x00,0x5f,
-0x00,0x3b,0x11,0x12,0x39,0xba,0x00,0x17,0x00,0x5f,0x00,0x3b,0x11,0x12,0x39,0xba,
-0x00,0x1c,0x00,0x5f,0x00,0x3b,0x11,0x12,0x39,0xba,0x00,0x3c,0x00,0x5f,0x00,0x3b,
-0x11,0x12,0x39,0xb8,0x00,0x45,0xd0,0xb8,0x00,0x2e,0x10,0xb8,0x00,0x49,0xd0,0x30,
-0x31,0x01,0x14,0x17,0x36,0x37,0x26,0x27,0x36,0x37,0x26,0x27,0x06,0x05,0x34,0x26,
-0x15,0x06,0x15,0x16,0x17,0x36,0x25,0x06,0x17,0x36,0x37,0x2e,0x01,0x27,0x06,0x05,
-0x34,0x27,0x06,0x07,0x16,0x17,0x06,0x07,0x16,0x17,0x36,0x01,0x26,0x07,0x06,0x07,
-0x26,0x27,0x36,0x37,0x16,0x17,0x36,0x37,0x26,0x35,0x34,0x3f,0x01,0x15,0x16,0x15,
-0x14,0x07,0x1e,0x01,0x17,0x36,0x37,0x16,0x17,0x06,0x07,0x26,0x27,0x26,0x07,0x16,
-0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x16,0x17,0x06,0x23,0x26,0x27,0x06,0x07,0x06,
-0x07,0x23,0x26,0x27,0x35,0x26,0x27,0x06,0x07,0x22,0x27,0x36,0x37,0x26,0x27,0x26,
-0x35,0x34,0x37,0x36,0x07,0x14,0x1e,0x01,0x33,0x32,0x3e,0x01,0x35,0x34,0x2e,0x01,
-0x23,0x22,0x0e,0x01,0x01,0x32,0x1e,0x01,0x15,0x14,0x0e,0x01,0x23,0x22,0x2e,0x01,
-0x35,0x34,0x3e,0x01,0x03,0xce,0x27,0x37,0x2c,0x33,0x09,0x03,0x33,0x25,0x2f,0x30,
-0xfe,0xdc,0x29,0x2c,0x08,0x37,0x15,0x01,0xdf,0x06,0x16,0x3d,0x03,0x03,0x2a,0x01,
-0x27,0xfe,0xdb,0x30,0x2a,0x2b,0x33,0x03,0x0e,0x2e,0x32,0x32,0x27,0xfe,0xf7,0x51,
-0x1e,0x20,0x59,0x66,0x02,0x02,0xb7,0xa9,0x54,0x2c,0x31,0x27,0xa5,0x01,0xa4,0x27,
-0x29,0x2e,0x05,0x55,0xa8,0xb8,0x01,0x02,0x66,0x59,0x20,0x15,0x5a,0x1a,0x14,0x39,
-0x38,0x18,0x20,0x22,0x32,0x01,0x0d,0x42,0x32,0x3b,0x46,0x5f,0x19,0x20,0x20,0x58,
-0x42,0x3f,0x32,0x43,0x0d,0x01,0x33,0x22,0x20,0x17,0x38,0x39,0x14,0x34,0x69,0xbc,
-0x68,0x67,0xbc,0x69,0x6b,0xbe,0x63,0x65,0xbd,0x6b,0x01,0x8d,0x53,0x9f,0x5b,0x58,
-0x9f,0x56,0x57,0x9f,0x58,0x5a,0x9f,0x02,0x84,0xa3,0xa7,0x0f,0x23,0x65,0x8d,0xaa,
-0x6a,0x1c,0x0f,0x70,0xcd,0x4d,0x63,0x01,0x4e,0x54,0x76,0x4a,0x4b,0x72,0x80,0x3f,
-0x56,0x6c,0x4c,0x57,0x02,0x57,0x37,0xa9,0x70,0x0d,0x1e,0x6a,0xaa,0x85,0x6b,0x25,
-0x0f,0xa7,0x01,0x6e,0x5e,0x2a,0x56,0x02,0x02,0x7b,0x77,0x02,0x06,0x77,0x19,0x11,
-0x5b,0x31,0x87,0xf4,0x01,0x01,0xf4,0x87,0x31,0x5b,0x0d,0x1a,0x03,0x77,0x06,0x02,
-0x77,0x7b,0x02,0x02,0x56,0x29,0x5c,0x1e,0x23,0x66,0x6e,0x6e,0x64,0x2d,0x23,0x4a,
-0x4d,0x0c,0x37,0x42,0x2f,0x15,0x22,0x89,0x89,0x22,0x01,0x14,0x30,0x43,0x37,0x0c,
-0x4e,0x4b,0x22,0x2c,0x64,0x6e,0x6e,0x66,0x23,0xef,0x67,0xbd,0x68,0x68,0xbd,0x67,
-0x67,0xbf,0x67,0x67,0xbf,0x01,0x10,0x55,0xa0,0x57,0x57,0x9d,0x58,0x58,0x9d,0x57,
-0x57,0xa0,0x55,0x00,0x00,0x04,0x00,0x64,0x00,0x00,0x06,0xc8,0x05,0xd4,0x00,0x07,
-0x00,0x0d,0x00,0x15,0x00,0x25,0x00,0x99,0xba,0x00,0x10,0x00,0x14,0x00,0x03,0x2b,
-0xb8,0x00,0x10,0x10,0x41,0x05,0x00,0xea,0x00,0x14,0x00,0xfa,0x00,0x14,0x00,0x02,
-0x5d,0x41,0x1b,0x00,0x19,0x00,0x14,0x00,0x29,0x00,0x14,0x00,0x39,0x00,0x14,0x00,
-0x49,0x00,0x14,0x00,0x59,0x00,0x14,0x00,0x69,0x00,0x14,0x00,0x79,0x00,0x14,0x00,
-0x89,0x00,0x14,0x00,0x99,0x00,0x14,0x00,0xa9,0x00,0x14,0x00,0xb9,0x00,0x14,0x00,
-0xc9,0x00,0x14,0x00,0xd9,0x00,0x14,0x00,0x0d,0x5d,0xba,0x00,0x08,0x00,0x14,0x00,
-0x10,0x11,0x12,0x39,0xb8,0x00,0x1a,0xd0,0xb8,0x00,0x1a,0x2f,0xb8,0x00,0x14,0x10,
-0xb8,0x00,0x22,0xd0,0xb8,0x00,0x22,0x2f,0x00,0xb8,0x00,0x00,0x2f,0xba,0x00,0x0b,
-0x00,0x03,0x00,0x03,0x2b,0xb8,0x00,0x0b,0x10,0xb8,0x00,0x03,0x10,0xb8,0x00,0x05,
-0xd0,0xb8,0x00,0x05,0x2f,0xba,0x00,0x06,0x00,0x03,0x00,0x0b,0x11,0x12,0x39,0x30,
-0x31,0x01,0x33,0x01,0x15,0x21,0x27,0x23,0x00,0x17,0x01,0x15,0x21,0x35,0x00,0x07,
-0x32,0x15,0x02,0x23,0x22,0x03,0x36,0x13,0x32,0x1e,0x01,0x15,0x14,0x0e,0x01,0x23,
-0x22,0x2e,0x01,0x35,0x34,0x3e,0x01,0x03,0x9f,0x07,0x03,0x22,0xf9,0xad,0x08,0x09,
-0x03,0x1b,0x17,0xfd,0x68,0x05,0x39,0xfd,0x7c,0x14,0x4d,0x34,0x19,0x17,0x36,0x19,
-0x33,0x13,0x25,0x15,0x14,0x26,0x13,0x14,0x24,0x15,0x15,0x24,0x05,0xd4,0xfa,0x35,
-0x09,0x09,0x05,0xaa,0x9b,0xfb,0x4f,0x11,0x09,0x04,0x9d,0xc2,0x44,0xfd,0x9b,0x02,
-0x6e,0x3b,0xfd,0x0d,0x14,0x24,0x15,0x14,0x24,0x14,0x14,0x24,0x14,0x15,0x24,0x14,
-0x00,0x01,0x00,0xaa,0x00,0x04,0x04,0xf4,0x05,0xd8,0x00,0x13,0x00,0x0b,0x00,0xb8,
-0x00,0x00,0x2f,0xb8,0x00,0x0a,0x2f,0x30,0x31,0x01,0x33,0x17,0x15,0x01,0x14,0x33,
-0x04,0x15,0x17,0x01,0x27,0x35,0x00,0x35,0x34,0x23,0x24,0x2f,0x01,0x04,0xd1,0x0e,
-0x15,0xfd,0x8e,0x5b,0x01,0x83,0x07,0xfc,0x51,0x0e,0x02,0x87,0x77,0xfe,0x93,0x10,
-0x07,0x05,0xd8,0x15,0x07,0xfd,0xe2,0x47,0x53,0x0e,0x47,0xfd,0x55,0x15,0x07,0x02,
-0x57,0x0d,0x47,0x4a,0x11,0x47,0x00,0x01,0x00,0xaa,0x01,0x77,0x06,0x82,0x04,0x63,
-0x00,0x05,0x00,0x0b,0x00,0xb8,0x00,0x02,0x2f,0xb8,0x00,0x05,0x2f,0x30,0x31,0x13,
-0x11,0x25,0x05,0x11,0x05,0xaa,0x01,0x77,0x04,0x61,0xfb,0x9f,0x02,0x32,0x01,0x75,
-0xbc,0xbc,0xfe,0x8b,0xbb,0x00,0x00,0x01,0x00,0xaa,0x00,0x00,0x04,0x74,0x05,0xd9,
-0x00,0x13,0x00,0x1f,0x00,0xb8,0x00,0x05,0x2f,0xba,0x00,0x10,0x00,0x12,0x00,0x03,
-0x2b,0xb8,0x00,0x10,0x10,0xb8,0x00,0x12,0x10,0xb8,0x00,0x0d,0xd0,0xb8,0x00,0x0d,
-0x2f,0x30,0x31,0x01,0x16,0x15,0x14,0x07,0x03,0x21,0x03,0x26,0x35,0x34,0x37,0x36,
-0x27,0x23,0x35,0x21,0x17,0x07,0x16,0x03,0x7e,0xf6,0x08,0xee,0xfe,0x22,0xed,0x09,
-0xf6,0x7f,0x07,0x75,0x01,0xda,0x01,0x77,0x01,0x04,0xe0,0x42,0xb3,0x20,0x24,0xfc,
-0x59,0x03,0xa7,0x26,0x22,0xaf,0x42,0x1a,0x86,0x59,0x59,0x01,0x87,0x00,0x00,0x03,
-0x00,0x16,0x01,0x85,0x06,0x6c,0x05,0x14,0x00,0x5a,0x00,0x79,0x00,0x99,0x00,0x00,
-0x01,0x27,0x23,0x22,0x27,0x26,0x07,0x06,0x15,0x14,0x07,0x06,0x07,0x06,0x07,0x06,
-0x23,0x22,0x27,0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x37,0x36,
-0x33,0x32,0x1f,0x01,0x16,0x33,0x32,0x37,0x36,0x37,0x36,0x37,0x36,0x27,0x26,0x27,
-0x26,0x27,0x26,0x2f,0x01,0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,
-0x37,0x36,0x32,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x07,0x06,
-0x17,0x16,0x1f,0x01,0x21,0x32,0x17,0x16,0x17,0x21,0x17,0x25,0x16,0x33,0x32,0x37,
-0x36,0x37,0x36,0x37,0x36,0x35,0x34,0x27,0x26,0x27,0x26,0x27,0x26,0x23,0x22,0x07,
-0x06,0x07,0x06,0x07,0x06,0x15,0x14,0x17,0x1e,0x01,0x01,0x26,0x23,0x22,0x07,0x06,
-0x07,0x06,0x07,0x06,0x15,0x14,0x17,0x16,0x17,0x16,0x17,0x16,0x33,0x32,0x37,0x36,
-0x37,0x36,0x37,0x36,0x35,0x34,0x27,0x26,0x27,0x26,0x03,0xcd,0xd6,0x73,0xae,0x1c,
-0x2a,0x03,0x02,0x09,0x0d,0x19,0x17,0x24,0x1c,0x2b,0x24,0x24,0x24,0x1a,0x15,0x17,
-0x12,0x0c,0x0d,0x18,0x19,0x23,0x1d,0x2a,0x23,0x25,0x3e,0x61,0x5a,0x25,0x0e,0x16,
-0x12,0x13,0x03,0x03,0x04,0x03,0x0d,0x0c,0x16,0x4e,0x54,0x3e,0x25,0x19,0x1c,0x0f,
-0x13,0x0c,0x0d,0x19,0x1b,0x20,0x23,0x48,0x48,0x1a,0x1f,0x0d,0x12,0x0c,0x09,0x0d,
-0x11,0x03,0x05,0x22,0x29,0x6d,0x52,0x01,0x8b,0xe8,0x4f,0x65,0x11,0xfd,0x62,0xd5,
-0xfc,0x0d,0x15,0x14,0x18,0x10,0x15,0x0d,0x10,0x05,0x05,0x0c,0x0a,0x0f,0x11,0x13,
-0x19,0x11,0x14,0x14,0x15,0x0d,0x0d,0x07,0x06,0x0d,0x0a,0x1e,0x01,0x30,0x12,0x17,
-0x1c,0x0c,0x15,0x0d,0x11,0x04,0x05,0x0c,0x0a,0x0f,0x0f,0x15,0x16,0x14,0x17,0x11,
-0x15,0x0d,0x0f,0x05,0x06,0x0d,0x0a,0x0f,0x0b,0x01,0x85,0xcd,0x06,0x08,0x0d,0x08,
-0x17,0x12,0x17,0x20,0x18,0x16,0x0d,0x0b,0x0f,0x0e,0x19,0x15,0x24,0x1d,0x26,0x24,
-0x1e,0x20,0x17,0x17,0x0d,0x0b,0x0f,0x19,0x27,0x03,0x05,0x0d,0x0f,0x07,0x08,0x18,
-0x16,0x13,0x13,0x13,0x44,0x22,0x19,0x0f,0x18,0x1b,0x1e,0x26,0x1d,0x25,0x1d,0x20,
-0x18,0x19,0x0a,0x0b,0x1e,0x18,0x1e,0x1c,0x24,0x20,0x23,0x1e,0x17,0x0c,0x11,0x07,
-0x0d,0x16,0x1a,0x6d,0x52,0x20,0x29,0x4b,0xcf,0x79,0x09,0x05,0x07,0x0b,0x0d,0x10,
-0x11,0x12,0x0d,0x17,0x12,0x0d,0x10,0x07,0x09,0x06,0x06,0x0b,0x0c,0x11,0x11,0x12,
-0x0e,0x16,0x12,0x1c,0x02,0xb5,0x09,0x05,0x07,0x0b,0x0e,0x0f,0x11,0x12,0x0f,0x15,
-0x12,0x0e,0x0d,0x09,0x09,0x05,0x07,0x0b,0x0e,0x0e,0x12,0x12,0x0e,0x16,0x12,0x0e,
-0x09,0x00,0x00,0x03,0x00,0x56,0x01,0x21,0x06,0x45,0x04,0xb5,0x00,0x19,0x00,0x72,
-0x00,0x8c,0x00,0x00,0x12,0x32,0x36,0x37,0x36,0x37,0x36,0x35,0x34,0x27,0x26,0x27,
-0x2e,0x01,0x22,0x06,0x07,0x06,0x07,0x06,0x15,0x14,0x17,0x16,0x17,0x16,0x01,0x05,
-0x06,0x23,0x22,0x27,0x25,0x07,0x0e,0x01,0x15,0x14,0x17,0x16,0x15,0x14,0x07,0x06,
-0x07,0x06,0x07,0x06,0x22,0x27,0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,
-0x36,0x37,0x36,0x3b,0x01,0x32,0x37,0x3e,0x01,0x37,0x36,0x34,0x27,0x2e,0x01,0x27,
-0x26,0x2b,0x01,0x22,0x27,0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,
-0x37,0x36,0x32,0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x15,0x14,0x16,
-0x1f,0x01,0x25,0x36,0x33,0x32,0x17,0x24,0x22,0x06,0x07,0x06,0x07,0x06,0x15,0x14,
-0x17,0x16,0x17,0x1e,0x01,0x32,0x36,0x37,0x36,0x37,0x36,0x35,0x34,0x27,0x26,0x27,
-0x26,0xfd,0x2e,0x26,0x10,0x11,0x08,0x08,0x08,0x08,0x11,0x10,0x26,0x2e,0x26,0x10,
-0x11,0x08,0x08,0x08,0x08,0x11,0x10,0x03,0x01,0x02,0x6d,0x2c,0x6d,0x51,0xdb,0xfe,
-0x91,0x6a,0x96,0x50,0x0a,0x07,0x0e,0x0e,0x1c,0x16,0x28,0x21,0x4e,0x21,0x22,0x1c,
-0x1a,0x10,0x0e,0x0e,0x0e,0x1c,0x16,0x28,0x21,0x27,0x43,0x56,0x66,0x1b,0x26,0x0b,
-0x0d,0x0d,0x0b,0x26,0x1b,0x62,0x5a,0x43,0x27,0x21,0x28,0x16,0x1c,0x0e,0x0e,0x0e,
-0x10,0x1a,0x1c,0x22,0x21,0x4e,0x21,0x28,0x16,0x1c,0x0e,0x0e,0x07,0x0a,0x50,0x96,
-0x6a,0x01,0x6f,0xdb,0x51,0x6d,0x2c,0xfa,0xe6,0x2e,0x26,0x10,0x11,0x08,0x08,0x08,
-0x08,0x11,0x10,0x26,0x2e,0x26,0x10,0x11,0x08,0x08,0x08,0x08,0x11,0x10,0x01,0x71,
-0x0e,0x0d,0x0e,0x0f,0x10,0x13,0x12,0x10,0x0f,0x0e,0x0d,0x0e,0x0e,0x0d,0x0e,0x0f,
-0x10,0x12,0x13,0x10,0x0f,0x0e,0x0d,0x01,0x6c,0xfc,0x3f,0x57,0x92,0x2c,0x3e,0x0e,
-0x0e,0x08,0x16,0x10,0x19,0x23,0x1f,0x1d,0x1a,0x15,0x10,0x0d,0x0d,0x0e,0x17,0x15,
-0x22,0x1f,0x23,0x22,0x1f,0x1d,0x1a,0x15,0x10,0x0d,0x22,0x09,0x1a,0x13,0x15,0x10,
-0x15,0x13,0x1a,0x09,0x22,0x0d,0x10,0x15,0x1a,0x1d,0x1f,0x22,0x23,0x1f,0x22,0x15,
-0x17,0x0e,0x0d,0x0d,0x10,0x15,0x1a,0x1d,0x1f,0x23,0x19,0x10,0x16,0x08,0x0e,0x0e,
-0x3e,0x2c,0x92,0x57,0x3f,0x7e,0x0e,0x0d,0x0e,0x0f,0x10,0x13,0x12,0x10,0x0f,0x0e,
-0x0d,0x0e,0x0e,0x0d,0x0e,0x0f,0x10,0x12,0x13,0x10,0x0f,0x0e,0x0d,0x00,0x00,0x03,
-0x00,0x16,0x00,0xc0,0x06,0x6c,0x04,0x4f,0x00,0x59,0x00,0x78,0x00,0x97,0x00,0x00,
-0x01,0x33,0x07,0x21,0x06,0x07,0x06,0x23,0x21,0x07,0x06,0x07,0x06,0x15,0x14,0x17,
-0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x0e,0x01,0x22,0x27,0x26,0x27,0x26,0x27,
-0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x3f,0x01,0x36,0x37,0x36,0x37,0x36,0x37,0x36,
-0x27,0x26,0x27,0x26,0x27,0x26,0x23,0x22,0x0f,0x01,0x06,0x23,0x22,0x27,0x26,0x27,
-0x26,0x27,0x26,0x35,0x34,0x37,0x3e,0x01,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x16,
-0x17,0x16,0x15,0x14,0x17,0x16,0x37,0x36,0x3b,0x01,0x25,0x06,0x07,0x06,0x07,0x06,
-0x15,0x14,0x17,0x16,0x17,0x16,0x17,0x16,0x33,0x32,0x36,0x37,0x36,0x37,0x36,0x35,
-0x34,0x27,0x26,0x27,0x26,0x27,0x26,0x23,0x22,0x01,0x36,0x37,0x36,0x37,0x36,0x35,
-0x34,0x27,0x26,0x27,0x26,0x27,0x26,0x23,0x22,0x06,0x07,0x06,0x07,0x06,0x15,0x14,
-0x17,0x16,0x17,0x16,0x17,0x16,0x33,0x32,0x03,0xcd,0xd6,0xd5,0x02,0x9e,0x11,0x65,
-0x4f,0xe8,0xfe,0x75,0x52,0x64,0x32,0x1d,0x14,0x0d,0x09,0x0c,0x12,0x0d,0x1f,0x1a,
-0x48,0x48,0x23,0x20,0x1b,0x1c,0x0a,0x0c,0x13,0x0c,0x1f,0x19,0x25,0x3e,0x54,0x4e,
-0x16,0x0c,0x0d,0x03,0x04,0x03,0x03,0x13,0x0a,0x1e,0x08,0x2b,0x5a,0x61,0x3e,0x25,
-0x23,0x2b,0x1c,0x24,0x18,0x18,0x0d,0x0c,0x12,0x12,0x34,0x24,0x24,0x24,0x2b,0x1c,
-0x24,0x17,0x19,0x0d,0x09,0x02,0x06,0x27,0x19,0xb1,0x73,0xfd,0xb9,0x15,0x0f,0x09,
-0x10,0x0d,0x06,0x07,0x0d,0x0a,0x18,0x11,0x17,0x15,0x2a,0x0f,0x0f,0x0a,0x0d,0x06,
-0x07,0x0e,0x08,0x1a,0x11,0x17,0x14,0x01,0x06,0x15,0x0f,0x09,0x10,0x0d,0x06,0x07,
-0x0d,0x0f,0x13,0x12,0x16,0x15,0x2a,0x0f,0x0f,0x0a,0x0c,0x05,0x07,0x0e,0x10,0x12,
-0x14,0x14,0x0e,0x04,0x4f,0xcf,0x4b,0x29,0x20,0x52,0x64,0x23,0x14,0x0f,0x06,0x12,
-0x0c,0x17,0x21,0x23,0x1b,0x26,0x1c,0x1e,0x18,0x1e,0x0b,0x0a,0x19,0x1a,0x1e,0x22,
-0x1f,0x1a,0x2a,0x1b,0x1e,0x18,0x0f,0x19,0x22,0x44,0x13,0x13,0x13,0x16,0x18,0x08,
-0x07,0x0f,0x07,0x0b,0x03,0x27,0x19,0x0f,0x0b,0x0e,0x16,0x17,0x20,0x20,0x22,0x22,
-0x21,0x20,0x32,0x0e,0x0f,0x0b,0x0d,0x16,0x18,0x20,0x17,0x12,0x1a,0x05,0x0e,0x09,
-0x06,0x54,0x08,0x0e,0x08,0x18,0x13,0x11,0x14,0x0f,0x11,0x0c,0x09,0x08,0x06,0x12,
-0x0e,0x0d,0x12,0x16,0x12,0x11,0x0e,0x12,0x0b,0x0a,0x08,0x05,0xfd,0x3a,0x09,0x0d,
-0x08,0x18,0x13,0x10,0x16,0x0f,0x10,0x0c,0x0d,0x05,0x05,0x12,0x0d,0x0e,0x12,0x13,
-0x12,0x16,0x0c,0x11,0x0c,0x0d,0x05,0x05,0x00,0x09,0x00,0x49,0x00,0xf4,0x06,0x98,
-0x04,0xe8,0x00,0x5a,0x00,0x78,0x00,0x96,0x00,0xb4,0x00,0xd2,0x00,0xfe,0x01,0x2d,
-0x01,0x34,0x01,0x48,0x00,0x00,0x01,0x36,0x37,0x26,0x27,0x26,0x27,0x26,0x2b,0x01,
-0x22,0x27,0x26,0x27,0x26,0x27,0x26,0x34,0x37,0x36,0x37,0x36,0x37,0x36,0x33,0x32,
-0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x16,0x1f,0x01,0x25,0x36,0x33,0x32,
-0x17,0x16,0x15,0x14,0x07,0x0d,0x01,0x16,0x15,0x14,0x07,0x06,0x23,0x22,0x27,0x25,
-0x07,0x06,0x07,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x07,0x06,0x23,0x22,0x27,0x26,
-0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x37,0x36,0x3b,0x01,0x32,0x37,
-0x36,0x00,0x32,0x37,0x36,0x37,0x36,0x37,0x36,0x35,0x34,0x27,0x26,0x27,0x26,0x27,
-0x26,0x22,0x07,0x06,0x07,0x06,0x07,0x06,0x15,0x14,0x17,0x16,0x17,0x16,0x17,0x12,
-0x32,0x37,0x36,0x37,0x36,0x37,0x36,0x35,0x34,0x27,0x26,0x27,0x26,0x27,0x26,0x22,
-0x07,0x06,0x07,0x06,0x07,0x06,0x15,0x14,0x17,0x16,0x17,0x16,0x17,0x12,0x22,0x27,
-0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x37,0x36,0x32,0x17,0x16,
-0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x07,0x02,0x22,0x27,0x26,0x27,
-0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x37,0x36,0x32,0x17,0x16,0x17,0x16,
-0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x07,0x05,0x27,0x26,0x27,0x26,0x27,0x26,
-0x35,0x34,0x37,0x36,0x35,0x34,0x27,0x26,0x27,0x26,0x27,0x26,0x22,0x07,0x06,0x07,
-0x06,0x07,0x06,0x15,0x14,0x17,0x16,0x17,0x16,0x17,0x16,0x3b,0x01,0x32,0x17,0x16,
-0x17,0x16,0x17,0x37,0x36,0x03,0x2d,0x01,0x26,0x23,0x22,0x07,0x05,0x06,0x07,0x06,
-0x07,0x06,0x07,0x06,0x2b,0x01,0x22,0x07,0x06,0x07,0x06,0x07,0x06,0x15,0x14,0x17,
-0x16,0x17,0x16,0x17,0x16,0x32,0x37,0x36,0x37,0x36,0x37,0x36,0x35,0x34,0x27,0x26,
-0x35,0x34,0x37,0x36,0x25,0x05,0x16,0x33,0x32,0x37,0x25,0x26,0x14,0x07,0x06,0x07,
-0x06,0x22,0x27,0x26,0x27,0x26,0x34,0x37,0x36,0x37,0x36,0x32,0x17,0x16,0x17,0x02,
-0x49,0x0b,0x07,0x07,0x0b,0x09,0x19,0x51,0x5c,0x43,0x2d,0x2d,0x25,0x28,0x22,0x13,
-0x12,0x12,0x10,0x28,0x1b,0x2f,0x2a,0x30,0x2e,0x2c,0x2b,0x22,0x28,0x0d,0x12,0x06,
-0x2f,0x8e,0x58,0x01,0x5d,0xe2,0x5c,0x88,0x39,0x08,0x1e,0xfe,0x02,0x01,0xfe,0x1e,
-0x08,0x3c,0x85,0x5c,0xe2,0xfe,0xa3,0x58,0x8e,0x2f,0x06,0x12,0x13,0x22,0x24,0x29,
-0x30,0x2a,0x33,0x27,0x29,0x22,0x2a,0x0d,0x12,0x12,0x10,0x25,0x1c,0x31,0x2a,0x30,
-0x43,0x52,0x5b,0x17,0xfe,0xeb,0x1c,0x0b,0x0c,0x09,0x0a,0x03,0x03,0x03,0x03,0x0a,
-0x09,0x0c,0x0b,0x1c,0x0b,0x0c,0x09,0x0a,0x03,0x03,0x03,0x03,0x0a,0x09,0x0c,0x0b,
-0x1c,0x0b,0x0c,0x09,0x0a,0x03,0x03,0x03,0x03,0x0a,0x09,0x0c,0x0b,0x1c,0x0b,0x0c,
-0x09,0x0a,0x03,0x03,0x03,0x03,0x0a,0x09,0x0c,0x32,0x32,0x15,0x15,0x11,0x13,0x09,
-0x09,0x09,0x09,0x13,0x11,0x15,0x15,0x32,0x15,0x15,0x11,0x13,0x09,0x09,0x09,0x09,
-0x13,0x11,0x15,0x15,0x32,0x15,0x15,0x11,0x13,0x09,0x09,0x09,0x09,0x13,0x11,0x15,
-0x15,0x32,0x15,0x15,0x11,0x13,0x09,0x09,0x09,0x09,0x13,0x11,0x15,0x01,0x86,0x25,
-0x95,0x27,0x16,0x0b,0x10,0x0b,0x06,0x0d,0x0d,0x1b,0x14,0x26,0x1f,0x4a,0x1f,0x20,
-0x1b,0x18,0x0f,0x0d,0x0d,0x0d,0x1b,0x14,0x26,0x1f,0x25,0x43,0x5c,0x64,0x1e,0x12,
-0x17,0x07,0x23,0x1c,0xbd,0x01,0xed,0x02,0x5f,0x2a,0x5d,0x4f,0xd9,0xfe,0x91,0x94,
-0x12,0x11,0x17,0x14,0x1c,0x68,0x58,0x43,0x25,0x1f,0x26,0x14,0x1b,0x0d,0x0d,0x0d,
-0x0f,0x18,0x1b,0x20,0x1f,0x4a,0x1f,0x26,0x14,0x1b,0x0d,0x0d,0x06,0x0b,0x10,0x0c,
-0x01,0x93,0x01,0x1f,0xd9,0x4f,0x5d,0x2a,0xfd,0xdd,0xd9,0x05,0x06,0x09,0x09,0x16,
-0x09,0x09,0x06,0x05,0x05,0x06,0x09,0x09,0x16,0x09,0x09,0x06,0x02,0xd9,0x08,0x0d,
-0x0e,0x07,0x06,0x0a,0x20,0x10,0x0d,0x22,0x1c,0x29,0x26,0x60,0x26,0x22,0x27,0x1a,
-0x12,0x10,0x10,0x10,0x1f,0x24,0x22,0x2f,0x27,0x1d,0x12,0x09,0x3c,0x25,0x8b,0x5a,
-0x53,0x0d,0x11,0x1f,0x0c,0xcf,0xcf,0x0c,0x25,0x0d,0x0b,0x53,0x5a,0x8b,0x25,0x3c,
-0x09,0x18,0x17,0x2f,0x27,0x2a,0x1d,0x20,0x0e,0x10,0x10,0x11,0x1c,0x22,0x25,0x35,
-0x22,0x2d,0x28,0x24,0x23,0x1b,0x13,0x10,0x20,0x09,0xfe,0xd2,0x04,0x05,0x08,0x07,
-0x07,0x04,0x08,0x07,0x05,0x06,0x08,0x07,0x05,0x04,0x04,0x05,0x08,0x07,0x07,0x04,
-0x07,0x08,0x05,0x06,0x08,0x07,0x05,0x02,0x3b,0x04,0x05,0x08,0x07,0x07,0x04,0x07,
-0x08,0x05,0x06,0x08,0x07,0x05,0x04,0x04,0x05,0x08,0x07,0x07,0x04,0x08,0x07,0x05,
-0x06,0x08,0x07,0x05,0xfd,0x82,0x07,0x08,0x0e,0x10,0x11,0x12,0x16,0x15,0x12,0x11,
-0x10,0x0e,0x08,0x07,0x07,0x08,0x0e,0x10,0x11,0x12,0x15,0x16,0x12,0x11,0x10,0x0e,
-0x08,0x02,0x38,0x07,0x08,0x0e,0x10,0x11,0x12,0x15,0x16,0x12,0x11,0x10,0x0e,0x08,
-0x07,0x07,0x08,0x0e,0x10,0x11,0x12,0x16,0x15,0x12,0x11,0x10,0x0e,0x08,0x5c,0x0f,
-0x3d,0x07,0x04,0x06,0x08,0x0e,0x0a,0x18,0x0e,0x17,0x21,0x1c,0x1b,0x19,0x13,0x10,
-0x0c,0x0c,0x0e,0x16,0x13,0x20,0x1c,0x21,0x20,0x1c,0x1b,0x19,0x13,0x10,0x0c,0x22,
-0x0a,0x0e,0x11,0x08,0x18,0x11,0xfe,0xf2,0xc2,0xf7,0x2f,0x56,0x92,0x43,0x1e,0x1e,
-0x0f,0x0e,0x0a,0x22,0x0c,0x10,0x13,0x19,0x1b,0x1c,0x20,0x21,0x1c,0x20,0x13,0x16,
-0x0e,0x0c,0x0c,0x10,0x13,0x19,0x1b,0x1c,0x21,0x17,0x0d,0x19,0x0a,0x14,0x02,0x02,
-0x5b,0x75,0x56,0x2f,0xe1,0x2b,0x16,0x09,0x09,0x06,0x05,0x05,0x06,0x09,0x09,0x16,
-0x09,0x09,0x06,0x05,0x05,0x06,0x09,0x00,0x00,0x03,0x00,0x56,0xff,0xe3,0x06,0x5e,
-0x05,0xf0,0x00,0x6e,0x00,0x80,0x00,0x92,0x00,0x00,0x01,0x06,0x07,0x06,0x15,0x14,
-0x17,0x16,0x17,0x16,0x17,0x16,0x33,0x32,0x37,0x36,0x37,0x36,0x37,0x36,0x35,0x34,
-0x27,0x26,0x27,0x26,0x27,0x26,0x23,0x22,0x07,0x06,0x07,0x06,0x07,0x06,0x15,0x14,
-0x17,0x16,0x17,0x15,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x37,0x36,0x33,
-0x32,0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x07,0x06,0x23,
-0x22,0x27,0x2e,0x02,0x35,0x34,0x37,0x36,0x37,0x26,0x35,0x34,0x37,0x12,0x33,0x32,
-0x17,0x16,0x15,0x14,0x07,0x06,0x23,0x22,0x07,0x06,0x07,0x06,0x15,0x14,0x17,0x16,
-0x15,0x14,0x07,0x06,0x07,0x06,0x23,0x22,0x17,0x36,0x37,0x36,0x37,0x36,0x37,0x16,
-0x17,0x16,0x07,0x06,0x07,0x06,0x07,0x06,0x27,0x26,0x01,0x16,0x17,0x16,0x15,0x14,
-0x07,0x06,0x07,0x06,0x23,0x22,0x27,0x36,0x37,0x36,0x35,0x34,0x02,0x13,0x03,0x02,
-0x0a,0x0a,0x0b,0x13,0x14,0x18,0x6f,0x93,0x88,0x7a,0x77,0x62,0x64,0x30,0x31,0x31,
-0x2e,0x66,0x5f,0x7a,0x78,0x8a,0x86,0x7c,0x77,0x62,0x64,0x30,0x31,0x31,0x1c,0x2c,
-0x6b,0x39,0x39,0x39,0x35,0x75,0x6c,0x8d,0x8c,0x9c,0x9a,0x8e,0x86,0x73,0x70,0x3a,
-0x39,0x39,0x35,0x75,0x6e,0x8b,0x8d,0x9b,0x9e,0x8a,0x2a,0x44,0x24,0x12,0x0e,0x1c,
-0x04,0x6c,0xb5,0xa9,0x51,0x06,0x10,0x24,0x22,0x09,0x36,0x2a,0x1f,0x44,0x3f,0x10,
-0x12,0x16,0x22,0x35,0x27,0x12,0x10,0x4b,0x18,0x28,0x32,0x19,0x17,0x03,0x2d,0x06,
-0x12,0x02,0x0a,0x13,0x1b,0x23,0x25,0x14,0x1b,0x01,0x9e,0x3e,0x16,0x10,0x15,0x0d,
-0x1e,0x0a,0x1c,0x0a,0x3a,0x11,0x1d,0x1e,0x01,0x37,0x06,0x06,0x18,0x1b,0x1c,0x18,
-0x1a,0x12,0x13,0x0b,0x33,0x33,0x31,0x63,0x64,0x76,0x77,0x88,0x8d,0x77,0x71,0x69,
-0x60,0x34,0x33,0x33,0x31,0x63,0x64,0x76,0x77,0x8d,0x87,0x78,0x44,0x3e,0x98,0x6d,
-0x87,0x89,0x9c,0x9d,0x8d,0x83,0x77,0x6e,0x3c,0x3b,0x3b,0x38,0x72,0x6f,0x8b,0x89,
-0xa1,0x98,0x8d,0x83,0x77,0x70,0x3a,0x3b,0x3b,0x12,0x42,0x56,0x30,0x2f,0x2b,0x22,
-0x1f,0x10,0x0f,0xcd,0xef,0x01,0x90,0x08,0x14,0x38,0x3a,0x44,0x40,0x2a,0x1f,0x7c,
-0x73,0x61,0x20,0x16,0x1b,0x1e,0x09,0x2d,0x46,0x28,0x1c,0x37,0x0c,0x22,0x2a,0x3d,
-0x38,0x19,0x26,0x08,0x15,0x0f,0x30,0x21,0x32,0x1d,0x20,0x05,0x06,0x04,0x20,0x16,
-0x11,0x0c,0x31,0x2d,0x35,0x24,0x26,0x0c,0x0a,0x12,0x36,0x3a,0x42,0x34,0x00,0x06,
-0x00,0x56,0xff,0xe3,0x06,0x5e,0x05,0xf0,0x00,0x0f,0x00,0x1c,0x00,0x2c,0x00,0x4a,
-0x00,0x69,0x00,0x89,0x00,0x00,0x01,0x26,0x27,0x26,0x27,0x25,0x06,0x15,0x14,0x17,
-0x16,0x17,0x16,0x17,0x16,0x17,0x13,0x26,0x27,0x26,0x22,0x07,0x06,0x07,0x13,0x36,
-0x33,0x32,0x17,0x13,0x05,0x06,0x07,0x06,0x07,0x25,0x36,0x37,0x36,0x37,0x36,0x37,
-0x36,0x35,0x34,0x24,0x32,0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,
-0x06,0x07,0x06,0x22,0x27,0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,
-0x37,0x13,0x22,0x07,0x06,0x07,0x06,0x07,0x06,0x15,0x14,0x17,0x16,0x17,0x1e,0x01,
-0x33,0x32,0x37,0x36,0x37,0x36,0x37,0x36,0x35,0x34,0x27,0x26,0x27,0x26,0x27,0x26,
-0x27,0x32,0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x07,0x06,
-0x23,0x22,0x27,0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x37,0x36,
-0x01,0xa9,0x3f,0x21,0x06,0x05,0x01,0x2a,0x08,0x13,0x13,0x24,0x20,0x31,0x14,0x08,
-0xf3,0x24,0x2d,0x2b,0x68,0x2b,0x2d,0x24,0x46,0x33,0x37,0x38,0x32,0x88,0x01,0x2a,
-0x02,0x09,0x21,0x3f,0xfe,0x92,0x0e,0x0e,0x31,0x20,0x24,0x13,0x13,0xfe,0xe7,0x3e,
-0x1a,0x1b,0x16,0x16,0x0b,0x0b,0x0b,0x0b,0x16,0x16,0x1b,0x1a,0x3e,0x1a,0x1b,0x16,
-0x16,0x0b,0x0b,0x0b,0x0b,0x16,0x16,0x1b,0x39,0x86,0x7c,0x77,0x62,0x64,0x30,0x31,
-0x31,0x31,0x63,0x60,0xf2,0x89,0x88,0x7a,0x77,0x62,0x64,0x30,0x31,0x31,0x2e,0x66,
-0x5f,0x7a,0x78,0x8a,0x9a,0x8e,0x86,0x73,0x70,0x3a,0x39,0x39,0x35,0x75,0x6e,0x8b,
-0x8d,0x9b,0x9a,0x8e,0x86,0x73,0x70,0x3a,0x39,0x39,0x35,0x75,0x6c,0x8d,0x8c,0x01,
-0x77,0x49,0x50,0x0f,0x0f,0xfd,0x1e,0x22,0x32,0x2d,0x2e,0x24,0x20,0x16,0x09,0x01,
-0x01,0xa3,0x22,0x14,0x13,0x13,0x14,0x22,0x01,0x83,0x09,0x09,0xfe,0x0b,0xfd,0x07,
-0x17,0x50,0x49,0x83,0x04,0x06,0x16,0x20,0x24,0x2e,0x2d,0x32,0x21,0x76,0x0b,0x0c,
-0x15,0x17,0x1a,0x1b,0x1f,0x1e,0x1b,0x1a,0x17,0x15,0x0c,0x0b,0x0b,0x0c,0x15,0x17,
-0x1a,0x1b,0x1e,0x1f,0x1b,0x1a,0x17,0x15,0x0c,0x02,0x15,0x33,0x31,0x63,0x64,0x76,
-0x77,0x8d,0x85,0x7a,0x77,0x63,0x61,0x66,0x33,0x31,0x63,0x64,0x76,0x77,0x88,0x8d,
-0x77,0x71,0x69,0x60,0x34,0x33,0x64,0x3b,0x38,0x72,0x6f,0x8b,0x89,0xa1,0x98,0x8d,
-0x83,0x77,0x70,0x3a,0x3b,0x3b,0x38,0x72,0x6f,0x8b,0x89,0x9c,0x9d,0x8d,0x83,0x77,
-0x6e,0x3c,0x3b,0x00,0x00,0x01,0x00,0x78,0x00,0x2c,0x06,0x41,0x05,0xaa,0x00,0x2d,
-0x00,0x00,0x13,0x35,0x37,0x27,0x33,0x17,0x36,0x25,0x02,0x03,0x33,0x17,0x33,0x15,
-0x23,0x17,0x33,0x15,0x23,0x17,0x21,0x32,0x17,0x16,0x14,0x07,0x06,0x23,0x21,0x07,
-0x33,0x15,0x23,0x07,0x33,0x15,0x23,0x07,0x23,0x12,0x13,0x24,0x27,0x07,0x23,0x37,
-0x94,0x24,0x40,0x64,0x92,0x92,0x01,0x1e,0x35,0xab,0x7b,0x73,0x94,0x56,0x64,0x9a,
-0x5d,0x98,0x01,0x08,0x46,0x30,0x20,0x20,0x30,0x46,0xfe,0xf8,0x98,0x5d,0x9a,0x64,
-0x56,0x94,0x73,0x7b,0xab,0x35,0xfe,0xe2,0x92,0x92,0x64,0x40,0x02,0xd7,0x28,0x05,
-0xda,0xc9,0x0d,0x0a,0x01,0x14,0x01,0x6a,0x96,0x50,0x82,0x50,0xc6,0x1a,0x11,0x2c,
-0x11,0x1a,0xc6,0x50,0x82,0x50,0x96,0x01,0x60,0x01,0x1e,0x0b,0x0c,0xc9,0xda,0x00,
-0x00,0x05,0x00,0x84,0x00,0xdc,0x06,0x30,0x04,0xf9,0x00,0x0d,0x00,0x14,0x00,0x22,
-0x00,0x29,0x00,0x2d,0x00,0x00,0x09,0x01,0x21,0x01,0x36,0x37,0x36,0x37,0x36,0x32,
-0x17,0x16,0x17,0x16,0x17,0x01,0x11,0x01,0x16,0x15,0x14,0x05,0x01,0x21,0x01,0x06,
-0x07,0x06,0x07,0x06,0x22,0x27,0x26,0x27,0x26,0x27,0x01,0x11,0x01,0x26,0x35,0x34,
-0x01,0x11,0x21,0x11,0x03,0xf6,0x01,0xb8,0xfb,0x58,0x01,0xb8,0x07,0x08,0x1d,0x24,
-0x23,0x52,0x23,0x2b,0x16,0x08,0x2f,0x01,0xae,0xfe,0x52,0x03,0xfe,0x9f,0xfe,0x46,
-0x04,0xa8,0xfe,0x46,0x06,0x07,0x1d,0x24,0x23,0x52,0x23,0x24,0x1d,0x07,0x31,0xfe,
-0x53,0x01,0xad,0x03,0xfd,0xf2,0x05,0xac,0x03,0x68,0x01,0x2c,0xfe,0xd4,0x09,0x08,
-0x1c,0x10,0x0f,0x0f,0x13,0x19,0x09,0xaa,0xfe,0xde,0x02,0x8d,0xfe,0xdd,0x11,0x12,
-0x13,0x6b,0xfe,0xd3,0x01,0x2d,0x08,0x07,0x1c,0x10,0x0f,0x0f,0x10,0x1c,0x07,0xaa,
-0x01,0x22,0xfd,0x73,0x01,0x21,0x13,0x13,0x12,0xfd,0xdf,0x04,0x1d,0xfb,0xe3,0x00,
-0x00,0x04,0x01,0xb3,0x00,0x00,0x04,0x7c,0x05,0xef,0x00,0x4b,0x00,0xc6,0x00,0xd9,
-0x00,0xe9,0x00,0x00,0x01,0x34,0x37,0x36,0x3f,0x01,0x36,0x37,0x36,0x33,0x17,0x26,
-0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x16,0x1f,0x01,
-0x16,0x17,0x36,0x37,0x36,0x37,0x36,0x37,0x36,0x35,0x34,0x27,0x26,0x37,0x36,0x33,
-0x32,0x17,0x16,0x17,0x16,0x07,0x03,0x06,0x1f,0x01,0x16,0x15,0x14,0x07,0x17,0x14,
-0x07,0x06,0x15,0x14,0x17,0x21,0x35,0x34,0x27,0x26,0x27,0x26,0x37,0x36,0x27,0x26,
-0x01,0x26,0x23,0x22,0x0f,0x01,0x06,0x0f,0x01,0x06,0x0f,0x01,0x27,0x26,0x2f,0x01,
-0x26,0x27,0x26,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x1f,0x02,0x16,
-0x17,0x16,0x15,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x26,0x2f,0x01,0x26,0x27,
-0x26,0x23,0x22,0x07,0x06,0x07,0x16,0x17,0x16,0x17,0x16,0x17,0x16,0x17,0x14,0x07,
-0x06,0x07,0x15,0x14,0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x26,0x27,0x26,
-0x27,0x26,0x3f,0x01,0x36,0x27,0x26,0x27,0x06,0x23,0x22,0x27,0x26,0x27,0x26,0x23,
-0x22,0x17,0x16,0x17,0x16,0x1f,0x01,0x16,0x15,0x07,0x21,0x27,0x34,0x37,0x36,0x2f,
-0x01,0x36,0x35,0x34,0x27,0x26,0x37,0x13,0x36,0x27,0x01,0x07,0x16,0x17,0x16,0x17,
-0x16,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x27,0x26,0x07,0x06,0x07,
-0x16,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x2f,0x01,0x01,0xb3,0x25,
-0x16,0x12,0x34,0x15,0x26,0x02,0x02,0x04,0x1a,0x29,0x1e,0x14,0x22,0x17,0x1b,0x24,
-0x10,0x12,0x30,0x11,0x4a,0x4b,0x26,0x0f,0x0e,0x13,0x06,0x05,0x0a,0x05,0x0c,0x05,
-0x01,0x06,0x24,0x1b,0x29,0x37,0x1d,0x0d,0x01,0x0c,0x03,0x09,0x01,0x03,0x02,0x04,
-0x01,0x03,0x15,0x03,0x01,0xfd,0xde,0x05,0x09,0x25,0x31,0x01,0x02,0x1d,0x12,0x02,
-0x87,0x03,0x27,0x23,0x04,0x05,0x01,0x0a,0x23,0x05,0x16,0x36,0x19,0x09,0x2b,0x11,
-0x2d,0x4c,0x1a,0x14,0x11,0x0e,0x11,0x08,0x07,0x1d,0x0d,0x13,0x5f,0x88,0x5f,0x5e,
-0x04,0x14,0x05,0x04,0x16,0x12,0x06,0x03,0x2f,0x73,0x34,0x07,0x2a,0x1e,0x13,0x0c,
-0x07,0x05,0x03,0x08,0x31,0x28,0x0d,0x08,0x2e,0x32,0x01,0x15,0x0f,0x01,0x36,0x17,
-0x18,0x36,0x09,0x03,0x1c,0x7c,0x2f,0x06,0x07,0x0e,0x02,0x07,0x02,0x07,0x07,0x0f,
-0x1c,0x28,0x0e,0x0f,0x18,0x11,0x31,0x09,0x04,0x02,0x0a,0x07,0x04,0x0a,0x5c,0x01,
-0x01,0x01,0xab,0x01,0x0c,0x0e,0x01,0x02,0x03,0x09,0x06,0x01,0x0c,0x01,0x03,0xfd,
-0xfe,0x11,0x23,0x3a,0x37,0x11,0x04,0x01,0x11,0x0a,0x0b,0x04,0x02,0x0c,0x05,0x06,
-0x6c,0x80,0x0f,0x03,0x53,0x26,0x0f,0x0b,0x10,0x08,0x04,0x0c,0x08,0x0b,0x78,0x02,
-0xeb,0x37,0x31,0x07,0x1f,0x5d,0x25,0x0a,0x01,0x01,0x2f,0x7e,0x5b,0x23,0x3c,0x24,
-0x1c,0x1b,0x20,0x05,0x0c,0x1a,0x6f,0xbb,0x5f,0x25,0x15,0x11,0x3f,0x2c,0x1f,0x10,
-0x86,0x3a,0x06,0x0b,0x0a,0x2a,0x28,0x1e,0x3b,0x1a,0x12,0x96,0x59,0xfe,0xd4,0x1c,
-0x29,0x16,0x24,0x58,0x24,0x2b,0x7c,0x1d,0x85,0x13,0x8d,0x3d,0x4c,0xb6,0x12,0x21,
-0x36,0x43,0x58,0x26,0x50,0x59,0x38,0x02,0xb9,0x39,0x44,0x6f,0x1e,0x36,0xc2,0x1d,
-0x06,0x0f,0x0b,0x0d,0x62,0x27,0x6e,0x95,0x32,0x0f,0x0c,0x0b,0x06,0x0b,0x1f,0x38,
-0x1a,0x33,0xfe,0x65,0x46,0x5d,0x0c,0x08,0x13,0x04,0x01,0x14,0x06,0x07,0x34,0x54,
-0x26,0x03,0x1f,0x16,0x0a,0x07,0x0c,0x16,0x26,0x20,0x12,0x0c,0x2f,0x35,0x30,0x24,
-0x3f,0x2d,0x20,0x02,0x31,0x40,0x1b,0x11,0x26,0x11,0x06,0x05,0x10,0x09,0x33,0x6c,
-0x0f,0x0a,0x17,0x17,0x4b,0x0f,0x0b,0x0a,0x05,0x19,0x03,0x05,0x0d,0x43,0x04,0x22,
-0x50,0x31,0x16,0xd6,0x09,0x0b,0x9f,0xb7,0x3a,0x30,0x37,0x40,0x44,0x3a,0x35,0x58,
-0x49,0x36,0x2e,0x01,0x44,0x11,0x33,0xfe,0x5b,0x14,0x2b,0x2d,0x31,0x3a,0x0d,0x0c,
-0x11,0x10,0x09,0x09,0x15,0x17,0x09,0x05,0x71,0x12,0x14,0x2f,0x41,0x38,0x09,0x12,
-0x0a,0x0a,0x12,0x11,0x0b,0x06,0x67,0x00,0x00,0x08,0x00,0x2b,0x00,0xa9,0x06,0x6a,
-0x05,0x6c,0x00,0x06,0x00,0x39,0x00,0x4c,0x00,0x70,0x00,0x7b,0x00,0x7f,0x00,0x89,
-0x00,0x8d,0x00,0x00,0x13,0x16,0x37,0x36,0x35,0x34,0x27,0x01,0x22,0x27,0x26,0x23,
-0x22,0x07,0x06,0x2b,0x01,0x22,0x27,0x07,0x05,0x13,0x26,0x35,0x34,0x3f,0x01,0x36,
-0x37,0x36,0x37,0x36,0x37,0x36,0x33,0x32,0x17,0x37,0x36,0x33,0x32,0x17,0x16,0x15,
-0x07,0x17,0x16,0x33,0x32,0x37,0x33,0x16,0x15,0x14,0x07,0x23,0x35,0x06,0x25,0x36,
-0x37,0x36,0x37,0x01,0x27,0x26,0x23,0x22,0x07,0x06,0x0f,0x01,0x16,0x15,0x14,0x07,
-0x36,0x01,0x22,0x2f,0x01,0x07,0x14,0x07,0x36,0x37,0x16,0x15,0x14,0x07,0x06,0x23,
-0x22,0x07,0x16,0x15,0x14,0x07,0x32,0x37,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x37,
-0x36,0x35,0x34,0x27,0x06,0x37,0x16,0x15,0x14,0x07,0x15,0x33,0x36,0x35,0x34,0x27,
-0x05,0x36,0x37,0x0f,0x01,0x06,0x15,0x14,0x17,0x16,0x17,0x36,0x35,0x34,0x05,0x07,
-0x37,0x26,0xd8,0x1b,0x14,0x0f,0x10,0x03,0x70,0x2f,0x6c,0x30,0x1d,0x26,0x96,0x4a,
-0x21,0x63,0x53,0x25,0x59,0xfe,0xf8,0x81,0x06,0x0e,0x45,0x1c,0x19,0x5d,0x7b,0x40,
-0x43,0x22,0x24,0x34,0x3e,0x99,0x2d,0x3b,0x25,0x1e,0x0d,0xbe,0xcc,0x2c,0x28,0x36,
-0x06,0xe1,0x59,0x3e,0xf8,0x6d,0xfc,0xbc,0x21,0x1e,0x08,0x05,0x01,0x4e,0x24,0x11,
-0x1f,0x58,0xec,0x36,0x22,0x14,0x2f,0x2c,0x28,0x03,0xab,0x34,0x19,0xf2,0x73,0x53,
-0x3f,0x58,0x0f,0x24,0x55,0x81,0x3e,0x18,0x22,0x14,0x73,0x4a,0x3f,0x4b,0x28,0x60,
-0x2e,0x2f,0x34,0x89,0x2b,0x32,0x19,0x4b,0x32,0x2e,0x9e,0x30,0x3e,0xfc,0xb0,0x53,
-0x0d,0xa2,0x5a,0x70,0x30,0x1f,0x2b,0x17,0xfe,0xa0,0x31,0x5e,0x07,0x01,0xf0,0x03,
-0x27,0x1f,0x1f,0x20,0x10,0xfe,0xc7,0x0e,0x05,0x10,0x08,0x3b,0x63,0x73,0x01,0x0c,
-0x12,0x20,0x1a,0x2f,0xe8,0x5e,0x22,0x7c,0x59,0x2f,0x1a,0x0d,0x34,0xab,0x32,0x38,
-0x19,0x1d,0xdb,0x87,0x1d,0x1e,0x83,0xb4,0xcf,0x95,0x6c,0x25,0xe9,0x25,0x6f,0x1d,
-0x0f,0x01,0x74,0x1e,0x0e,0xe9,0x35,0x6f,0x41,0x3d,0x27,0x59,0x24,0x09,0x01,0x61,
-0x10,0x9d,0x85,0xa3,0x54,0x02,0x2a,0x0d,0x16,0x12,0x10,0x27,0x01,0x27,0x47,0x2b,
-0x2d,0x0d,0x0b,0x0c,0x06,0x25,0x5f,0x6b,0x6a,0x7e,0x07,0x1d,0x72,0x8d,0x7d,0x6a,
-0x4c,0x60,0xd0,0x86,0x7c,0xef,0x5c,0x67,0xc3,0x4b,0x1a,0x40,0x2f,0x1e,0x14,0x03,
-0x2e,0x38,0x35,0x96,0x63,0x28,0x24,0x00,0x00,0x07,0x00,0xb6,0x00,0x9a,0x05,0xcb,
-0x05,0xaf,0x00,0x15,0x00,0x1b,0x00,0x22,0x00,0x29,0x00,0x33,0x00,0x53,0x00,0x5a,
-0x00,0x00,0x01,0x36,0x37,0x36,0x35,0x34,0x2f,0x01,0x06,0x23,0x14,0x07,0x06,0x23,
-0x14,0x07,0x17,0x16,0x33,0x32,0x37,0x36,0x01,0x3f,0x01,0x0f,0x02,0x13,0x25,0x01,
-0x13,0x25,0x01,0x13,0x05,0x01,0x16,0x35,0x34,0x27,0x01,0x00,0x36,0x35,0x34,0x27,
-0x01,0x07,0x01,0x16,0x33,0x01,0x36,0x37,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x15,
-0x14,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x35,
-0x34,0x37,0x36,0x37,0x36,0x17,0x07,0x01,0x16,0x33,0x32,0x27,0x05,0x25,0x08,0x05,
-0x07,0x02,0x3b,0x17,0x1e,0x36,0x36,0x49,0x16,0xed,0x08,0x07,0x0a,0x0f,0x0b,0xfc,
-0x80,0x99,0x0d,0x92,0x99,0x0d,0x83,0x01,0x09,0x02,0x7d,0xb8,0xfd,0x67,0xfd,0x84,
-0x11,0x01,0xbd,0x02,0x0d,0x41,0x02,0xfd,0xc2,0x01,0xa4,0x36,0x06,0xfd,0xfb,0x71,
-0x02,0x05,0x11,0x0f,0xfd,0x6e,0x0d,0x10,0x0f,0x10,0x0d,0x0a,0x0e,0x09,0x08,0x05,
-0x06,0x09,0x0a,0x0e,0x0e,0x0f,0x0e,0x11,0x0e,0x09,0x0e,0x09,0x07,0x04,0x05,0x0a,
-0x0a,0x2d,0x7f,0x02,0x3e,0x0b,0x0a,0x39,0x01,0x01,0x40,0x08,0x0c,0x10,0x0a,0x05,
-0x08,0xee,0x17,0x48,0x36,0x37,0x1c,0x18,0x3b,0x02,0x06,0x05,0x02,0xf9,0x98,0x92,
-0x0d,0x98,0x92,0x01,0x7a,0x12,0xfd,0x83,0xfd,0x68,0xb8,0x02,0x7c,0x01,0x09,0x14,
-0xfd,0xf3,0x01,0x39,0x0a,0x0c,0x02,0x3e,0xfc,0xb6,0x36,0x21,0x0f,0x11,0x02,0x06,
-0x71,0xfd,0xfa,0x06,0x02,0xea,0x0d,0x0b,0x0a,0x05,0x04,0x08,0x09,0x0d,0x0a,0x0e,
-0x10,0x0e,0x11,0x0d,0x0e,0x0a,0x0a,0x05,0x04,0x08,0x06,0x10,0x0b,0x0d,0x10,0x0e,
-0x10,0xf4,0x0e,0xfd,0xc2,0x02,0x42,0x00,0x00,0x07,0x00,0x35,0x01,0x96,0x06,0x8e,
-0x04,0x3e,0x00,0x13,0x00,0x19,0x00,0x20,0x00,0x27,0x00,0x2d,0x00,0x45,0x00,0x4c,
-0x00,0x00,0x00,0x34,0x27,0x26,0x27,0x26,0x2f,0x01,0x14,0x07,0x16,0x14,0x07,0x16,
-0x15,0x37,0x36,0x37,0x36,0x37,0x05,0x35,0x27,0x07,0x15,0x17,0x03,0x37,0x21,0x09,
-0x01,0x21,0x27,0x01,0x21,0x36,0x35,0x34,0x27,0x21,0x00,0x34,0x27,0x21,0x15,0x21,
-0x24,0x34,0x37,0x36,0x37,0x3e,0x01,0x32,0x16,0x17,0x16,0x17,0x16,0x14,0x07,0x06,
-0x07,0x0e,0x01,0x22,0x26,0x27,0x26,0x27,0x17,0x07,0x21,0x36,0x35,0x34,0x27,0x05,
-0xa3,0x04,0x03,0x07,0x05,0x0a,0xd2,0x15,0x33,0x33,0x15,0xd2,0x0a,0x05,0x07,0x03,
-0xfb,0xa3,0x5e,0x5e,0x5e,0xaf,0xaf,0x03,0x52,0x02,0x58,0xfd,0xa8,0xfc,0xae,0xaf,
-0x01,0x49,0x02,0xb4,0x19,0x23,0xfd,0x06,0x03,0x4a,0x32,0xfd,0x56,0x02,0xaa,0xfc,
-0x6c,0x04,0x03,0x08,0x07,0x12,0x14,0x12,0x07,0x08,0x03,0x04,0x04,0x03,0x08,0x07,
-0x12,0x14,0x12,0x07,0x08,0x03,0xc8,0x50,0x02,0xfa,0x23,0x19,0x02,0xde,0x18,0x0b,
-0x0a,0x09,0x07,0x06,0x7e,0x21,0x14,0x38,0x90,0x38,0x14,0x21,0x7e,0x06,0x07,0x09,
-0x0a,0x55,0xd8,0x70,0x70,0xd8,0x70,0x01,0x68,0xc8,0xfe,0xac,0xfe,0xac,0xc8,0x01,
-0x2c,0x19,0x17,0x1b,0x19,0xfe,0xc4,0x70,0x18,0xa0,0x3c,0x28,0x12,0x11,0x0f,0x0e,
-0x10,0x10,0x0e,0x0f,0x11,0x12,0x28,0x12,0x11,0x0f,0x0e,0x10,0x10,0x0e,0x0f,0x11,
-0x7a,0x64,0x19,0x1b,0x17,0x19,0x00,0x07,0x00,0xb6,0x00,0x9a,0x05,0xcb,0x05,0xaf,
-0x00,0x15,0x00,0x1b,0x00,0x22,0x00,0x29,0x00,0x33,0x00,0x53,0x00,0x5a,0x00,0x00,
-0x01,0x26,0x27,0x26,0x23,0x22,0x0f,0x01,0x16,0x15,0x32,0x17,0x16,0x15,0x32,0x17,
-0x37,0x36,0x35,0x34,0x27,0x26,0x01,0x27,0x1f,0x02,0x27,0x07,0x27,0x03,0x01,0x25,
-0x03,0x01,0x27,0x17,0x01,0x36,0x35,0x34,0x07,0x2e,0x01,0x23,0x22,0x07,0x01,0x17,
-0x01,0x36,0x35,0x01,0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,
-0x16,0x17,0x16,0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x23,0x22,0x27,
-0x26,0x27,0x26,0x13,0x01,0x36,0x23,0x22,0x07,0x01,0x05,0x25,0x09,0x0b,0x0f,0x0a,
-0x07,0x08,0xed,0x16,0x49,0x36,0x36,0x1e,0x17,0x3b,0x02,0x07,0x05,0xfc,0x6f,0x92,
-0x0d,0x99,0x92,0x0d,0xa8,0xc6,0x11,0x02,0x7c,0x02,0x99,0xb8,0xfd,0x83,0x12,0x0e,
-0x02,0x3e,0x02,0x41,0x25,0x36,0x21,0x0f,0x11,0xfd,0xfb,0x71,0x02,0x05,0x06,0xfd,
-0x17,0x0e,0x0a,0x0a,0x05,0x04,0x07,0x09,0x0e,0x09,0x0e,0x11,0x0e,0x0f,0x0e,0x0e,
-0x0a,0x09,0x06,0x05,0x08,0x09,0x0e,0x0a,0x0d,0x10,0x0f,0x10,0x12,0x02,0x0c,0x01,
-0x39,0x0a,0x0b,0xfd,0xc2,0x05,0x09,0x09,0x05,0x06,0x02,0x3b,0x18,0x1c,0x37,0x36,
-0x48,0x17,0xee,0x08,0x05,0x0a,0x10,0x0c,0xfd,0x18,0x0d,0x92,0x98,0x0d,0x92,0xd5,
-0xc6,0x01,0x09,0x02,0x7c,0xb8,0xfd,0x68,0xfd,0x83,0xec,0x7f,0x02,0x3e,0x0c,0x0a,
-0x39,0x01,0x88,0x36,0x06,0xfd,0xfa,0x71,0x02,0x06,0x11,0x0f,0xfd,0x6d,0x0e,0x10,
-0x0e,0x10,0x0d,0x0b,0x10,0x06,0x08,0x04,0x05,0x0a,0x0a,0x0e,0x0d,0x11,0x0e,0x10,
-0x0e,0x0a,0x0d,0x09,0x08,0x04,0x05,0x0a,0x0b,0x01,0x0f,0x02,0x0c,0x42,0x02,0xfd,
-0xc2,0x00,0x00,0x02,0x00,0x58,0x01,0x7b,0x06,0x0e,0x04,0x5b,0x00,0x23,0x00,0x43,
-0x00,0x00,0x12,0x10,0x27,0x04,0x25,0x01,0x15,0x25,0x2e,0x01,0x27,0x26,0x22,0x07,
-0x06,0x07,0x06,0x07,0x06,0x14,0x17,0x16,0x17,0x16,0x17,0x16,0x32,0x37,0x3e,0x01,
-0x37,0x25,0x15,0x01,0x24,0x05,0x12,0x14,0x07,0x36,0x05,0x25,0x05,0x06,0x07,0x06,
-0x22,0x27,0x26,0x27,0x26,0x27,0x26,0x34,0x37,0x36,0x37,0x36,0x37,0x36,0x32,0x17,
-0x16,0x17,0x05,0x25,0x04,0x27,0x8a,0x32,0x01,0x26,0x02,0x25,0x02,0x6b,0xfd,0xbf,
-0x05,0x0e,0x12,0x0d,0x1e,0x0d,0x0e,0x0b,0x0a,0x06,0x06,0x06,0x08,0x08,0x0b,0x0e,
-0x0d,0x1e,0x0d,0x12,0x0e,0x05,0x02,0x41,0xfd,0x95,0xfd,0xdb,0xfe,0xda,0x99,0x17,
-0xac,0x02,0x1d,0x01,0xb7,0xfe,0x9c,0x16,0x1b,0x1a,0x3e,0x1a,0x1b,0x16,0x16,0x0b,
-0x0b,0x0b,0x0b,0x16,0x16,0x1b,0x1a,0x3e,0x1a,0x1b,0x16,0x01,0x64,0xfe,0x49,0xfd,
-0xe3,0xac,0x02,0x49,0x01,0x44,0x60,0x03,0x71,0xfe,0xed,0x53,0x1c,0x08,0x10,0x08,
-0x06,0x06,0x06,0x0a,0x09,0x10,0x0d,0x20,0x0d,0x12,0x07,0x0a,0x06,0x06,0x06,0x08,
-0x10,0x08,0x1c,0x53,0xfe,0xed,0x71,0x03,0x01,0x47,0x8a,0x59,0x03,0x71,0xb9,0x18,
-0x15,0x0c,0x0b,0x0b,0x0c,0x15,0x17,0x1a,0x1b,0x3e,0x1b,0x1a,0x17,0x15,0x0c,0x0b,
-0x0b,0x0c,0x15,0x18,0xb9,0x71,0x03,0x00,0x00,0x01,0x00,0x8a,0x01,0xad,0x06,0x0e,
-0x04,0x29,0x00,0x26,0x00,0x00,0x01,0x25,0x15,0x01,0x24,0x07,0x36,0x34,0x27,0x16,
-0x25,0x01,0x15,0x25,0x26,0x27,0x26,0x27,0x26,0x22,0x07,0x06,0x07,0x06,0x07,0x06,
-0x15,0x14,0x17,0x16,0x17,0x16,0x17,0x16,0x32,0x37,0x36,0x37,0x36,0x03,0xe8,0x02,
-0x26,0xfd,0x95,0xfd,0xde,0xf7,0x32,0x32,0xf7,0x02,0x22,0x02,0x6b,0xfd,0xda,0x07,
-0x0f,0x0e,0x12,0x11,0x2a,0x11,0x12,0x0e,0x0f,0x07,0x08,0x08,0x07,0x0f,0x0e,0x12,
-0x11,0x2a,0x11,0x12,0x0e,0x0f,0x02,0xc5,0x1c,0x21,0xfe,0xed,0x71,0x03,0x60,0xe0,
-0x60,0x03,0x71,0xfe,0xed,0x21,0x1d,0x11,0x0f,0x0e,0x08,0x08,0x08,0x08,0x0e,0x0f,
-0x11,0x12,0x15,0x14,0x12,0x11,0x0f,0x0e,0x08,0x08,0x08,0x08,0x0e,0x0f,0x00,0x01,
-0x01,0x33,0x00,0xc6,0x05,0x57,0x05,0x0a,0x00,0x1c,0x00,0x00,0x01,0x32,0x17,0x16,
-0x33,0x32,0x37,0x00,0x13,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x00,0x01,0x06,0x23,
-0x22,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x01,0xc5,0x27,0x14,0x28,0x11,0x0d,
-0x0e,0x01,0x19,0xef,0x3e,0x87,0x20,0x16,0x21,0xfe,0x7e,0xfe,0xb6,0x17,0x47,0x48,
-0x0d,0x22,0x2e,0x34,0x46,0x2b,0x02,0x8e,0x40,0x78,0x14,0x01,0xc2,0x01,0x16,0x48,
-0x0c,0x09,0x0e,0x29,0xfe,0x30,0xfd,0xfc,0x24,0x06,0x0f,0x8a,0x99,0x27,0x2a,0x27,
-0x18,0x00,0x00,0x01,0x00,0xed,0x00,0xb2,0x05,0xc5,0x05,0x0c,0x00,0x1d,0x00,0x00,
-0x01,0x32,0x17,0x16,0x37,0x32,0x37,0x00,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x14,
-0x07,0x00,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x01,0xc5,
-0x27,0x14,0x28,0x11,0x0d,0x0e,0x01,0x19,0xef,0x65,0x60,0x7f,0x1a,0x0b,0x17,0xfd,
-0x7d,0x7b,0x2a,0x98,0x32,0x37,0x17,0x39,0x48,0x46,0x62,0x03,0x1a,0x40,0x79,0x01,
-0x14,0x01,0x9d,0xaf,0x4a,0x08,0x03,0x16,0x12,0x1b,0xfd,0x1e,0xde,0x4c,0x1a,0x0c,
-0x8d,0xb2,0x86,0x31,0x20,0x2d,0x00,0x01,0x01,0x03,0x00,0x94,0x05,0xb1,0x05,0x41,
-0x00,0x0b,0x00,0x00,0x09,0x01,0x07,0x09,0x01,0x27,0x09,0x01,0x37,0x09,0x01,0x17,
-0x03,0xe7,0x01,0xc9,0x8e,0xfe,0x38,0xfe,0x37,0x8e,0x01,0xc9,0xfe,0x37,0x8e,0x01,
-0xc9,0x01,0xc9,0x8e,0x02,0xea,0xfe,0x37,0x8d,0x01,0xc9,0xfe,0x37,0x8d,0x01,0xc9,
-0x01,0xc9,0x8d,0xfe,0x38,0x01,0xc9,0x8d,0x00,0x01,0x00,0xaf,0x00,0x3f,0x06,0x05,
-0x05,0x96,0x00,0x0b,0x00,0x00,0x09,0x0b,0x04,0x91,0x01,0x74,0xfe,0xc9,0xfe,0x8c,
-0xfe,0x8c,0xfe,0xc9,0x01,0x74,0xfe,0x8c,0x01,0x37,0x01,0x74,0x01,0x74,0x01,0x37,
-0x02,0xea,0xfe,0x8c,0xfe,0xc9,0x01,0x74,0xfe,0x8c,0x01,0x37,0x01,0x74,0x01,0x74,
-0x01,0x37,0xfe,0x8c,0x01,0x75,0xfe,0xc9,0x00,0x01,0x00,0xf1,0xff,0xee,0x05,0x9c,
-0x05,0xdc,0x00,0x42,0x00,0x00,0x01,0x32,0x17,0x16,0x17,0x36,0x33,0x32,0x17,0x16,
-0x15,0x14,0x07,0x06,0x03,0x16,0x17,0x16,0x15,0x14,0x0f,0x01,0x16,0x15,0x14,0x07,
-0x06,0x23,0x22,0x27,0x26,0x27,0x06,0x03,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,
-0x36,0x37,0x12,0x13,0x02,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x36,0x37,
-0x36,0x33,0x32,0x17,0x16,0x17,0x36,0x37,0x36,0x04,0xf8,0x0a,0x10,0x11,0x12,0x1d,
-0x11,0x0f,0x1a,0x10,0x16,0xd0,0xc4,0x51,0x8f,0x0c,0x1e,0x20,0x04,0x16,0x1a,0x0c,
-0x1a,0x14,0x78,0x80,0xac,0xde,0x20,0x4c,0x24,0x04,0x33,0x0b,0x05,0x1b,0xcc,0xe4,
-0x7a,0x28,0x09,0x12,0x13,0x10,0x0f,0x17,0x09,0x0d,0x12,0x1c,0x20,0x0a,0x36,0x58,
-0x8e,0xcc,0x18,0x05,0xdc,0x10,0x10,0x1a,0x33,0x1b,0x11,0x15,0x1b,0x17,0xe2,0xfe,
-0xf1,0xc6,0xef,0x14,0x0c,0x17,0x19,0x16,0x0c,0x14,0x1e,0x10,0x12,0x1a,0x9a,0xd0,
-0xe0,0xfe,0x8a,0x36,0x2a,0x1c,0x3d,0x50,0x1f,0x0e,0x2a,0x01,0x3e,0x01,0x0a,0x01,
-0x22,0x9d,0x23,0x0a,0x0e,0x1a,0x1a,0x1d,0x11,0x0c,0x10,0x1e,0xa8,0x98,0xb8,0xcc,
-0x18,0x00,0x00,0x01,0x00,0xfc,0xff,0xff,0x06,0x08,0x05,0xea,0x00,0x51,0x00,0x00,
-0x01,0x32,0x17,0x16,0x17,0x36,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x03,0x16,
-0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x07,0x06,0x23,0x22,0x27,0x06,0x07,0x06,
-0x23,0x22,0x27,0x26,0x27,0x02,0x07,0x06,0x23,0x06,0x27,0x26,0x27,0x06,0x23,0x22,
-0x27,0x26,0x35,0x34,0x37,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x26,0x03,0x26,
-0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x12,
-0x37,0x36,0x05,0x54,0x1d,0x1b,0x14,0x08,0x1a,0x0a,0x20,0x0e,0x0e,0x10,0xf1,0xeb,
-0x94,0x94,0x11,0x1e,0x14,0x25,0x02,0x0e,0x18,0x20,0x24,0x1e,0x08,0x0e,0x24,0x1b,
-0x17,0x1a,0x59,0x79,0xe6,0x58,0x11,0x15,0x13,0x12,0x0f,0x02,0x14,0x12,0x19,0x1d,
-0x24,0x1e,0x09,0x09,0x12,0x18,0x82,0xc4,0x7a,0x63,0x16,0x17,0x10,0x16,0x1a,0x30,
-0x01,0x0b,0x17,0x11,0x2b,0x0d,0x6a,0x96,0xe7,0xf9,0x0c,0x05,0xea,0x1e,0x16,0x3a,
-0x01,0x05,0x0c,0x0e,0x0d,0x15,0x28,0x10,0xdb,0xfe,0xc7,0xcc,0xa2,0x12,0x18,0x31,
-0x1a,0x11,0x02,0x11,0x23,0x3a,0x18,0x12,0x0b,0x1b,0x1c,0x5f,0xbf,0xfe,0xfb,0x87,
-0x1a,0x02,0x26,0x1f,0x0d,0x0c,0x1e,0x23,0x11,0x1b,0x2d,0x03,0x0d,0x18,0x18,0x15,
-0x1f,0xb0,0xd4,0xbd,0x01,0x0b,0x3d,0x1c,0x1a,0x31,0x20,0x27,0x0e,0x19,0x32,0x1a,
-0xc4,0xba,0x01,0x08,0xda,0x0c,0x00,0x03,0x00,0x70,0x00,0x00,0x06,0x44,0x05,0xd5,
-0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x00,0x01,0x11,0x21,0x11,0x21,0x11,0x21,0x11,
-0x21,0x11,0x21,0x11,0x25,0x21,0x11,0x21,0x11,0x21,0x11,0x21,0x11,0x21,0x11,0x21,
-0x03,0x21,0x15,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x11,0x33,0x04,0x36,0xfe,0x48,
-0xfe,0x56,0x01,0xaa,0x01,0xb8,0x01,0xaa,0xfe,0xa6,0x01,0xbe,0xfe,0x42,0xfd,0xa8,
-0xfe,0x42,0x01,0xbe,0x02,0x58,0xc8,0x01,0xbe,0xfe,0x42,0xc8,0xfe,0x42,0x01,0xbe,
-0xc8,0x03,0xc6,0x01,0xab,0xfe,0x55,0xfe,0x48,0xfe,0x56,0x01,0xaa,0x01,0xb8,0x50,
-0xfd,0xa8,0xfe,0x42,0x01,0xbe,0x02,0x58,0x01,0xbf,0xfd,0x79,0xc8,0xfe,0x42,0x01,
-0xbe,0xc8,0x01,0xbf,0x00,0x01,0x00,0x70,0x00,0x00,0x06,0x44,0x05,0xd5,0x00,0x0b,
-0x00,0x00,0x01,0x21,0x11,0x21,0x11,0x21,0x11,0x21,0x11,0x21,0x11,0x21,0x04,0x22,
-0x02,0x22,0xfd,0xde,0xfe,0x70,0xfd,0xde,0x02,0x22,0x01,0x90,0x03,0xb2,0xfe,0x70,
-0xfd,0xde,0x02,0x22,0x01,0x90,0x02,0x23,0x00,0x02,0x00,0x70,0x00,0x00,0x06,0x44,
-0x05,0xd5,0x00,0x03,0x00,0x0f,0x00,0x00,0x01,0x33,0x35,0x23,0x37,0x21,0x15,0x21,
-0x11,0x23,0x11,0x21,0x35,0x21,0x11,0x33,0x02,0xe3,0xee,0xee,0xef,0x02,0x72,0xfd,
-0x8e,0xf0,0xfd,0x8e,0x02,0x72,0xf0,0x02,0x73,0xee,0x01,0xf0,0xfd,0x8e,0x02,0x72,
-0xf0,0x02,0x73,0x00,0x00,0x02,0x00,0x70,0x00,0x00,0x06,0x44,0x05,0xd5,0x00,0x03,
-0x00,0x0f,0x00,0x00,0x01,0x21,0x11,0x21,0x25,0x21,0x11,0x21,0x11,0x21,0x11,0x21,
-0x11,0x21,0x11,0x21,0x02,0x93,0x01,0x8e,0xfe,0x72,0x01,0x8f,0x02,0x22,0xfd,0xde,
-0xfe,0x70,0xfd,0xde,0x02,0x22,0x01,0x90,0x02,0x23,0x01,0x8e,0x01,0xfe,0x70,0xfd,
-0xde,0x02,0x22,0x01,0x90,0x02,0x23,0x00,0x00,0x01,0x01,0x52,0x00,0x00,0x05,0x62,
-0x05,0xd5,0x00,0x0b,0x00,0x00,0x01,0x21,0x15,0x21,0x11,0x23,0x11,0x21,0x35,0x21,
-0x11,0x33,0x03,0xd2,0x01,0x90,0xfe,0x70,0xf0,0xfe,0x70,0x01,0x90,0xf0,0x04,0x45,
-0xf0,0xfc,0xab,0x03,0x55,0xf0,0x01,0x90,0x00,0x02,0x01,0x0c,0x00,0x00,0x05,0x6c,
-0x05,0xd5,0x00,0x0f,0x00,0x1b,0x00,0x00,0x01,0x33,0x17,0x11,0x21,0x11,0x21,0x27,
-0x11,0x23,0x27,0x11,0x21,0x11,0x21,0x17,0x07,0x11,0x23,0x11,0x21,0x15,0x21,0x11,
-0x33,0x11,0x21,0x35,0x04,0x40,0x96,0x96,0xfe,0xd4,0xfe,0x8e,0x96,0x96,0x96,0x01,
-0x2c,0x01,0x72,0x96,0xc8,0xdc,0xfe,0xd4,0x01,0x2c,0xdc,0x01,0x2c,0x04,0xa9,0x96,
-0xfe,0x8e,0xfd,0x5f,0x96,0x02,0x0b,0x96,0x01,0x72,0x01,0x2c,0x96,0xfa,0x01,0x2c,
-0xfe,0xd4,0xdc,0xfd,0x5f,0x02,0xa1,0xdc,0x00,0x03,0x01,0x3e,0x00,0x00,0x05,0x76,
-0x05,0xd5,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x00,0x01,0x11,0x21,0x11,0x21,0x11,
-0x21,0x11,0x21,0x11,0x21,0x11,0x27,0x21,0x11,0x21,0x11,0x21,0x11,0x21,0x11,0x21,
-0x11,0x21,0x03,0x21,0x15,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x11,0x33,0x04,0x0e,
-0xfe,0x98,0xfe,0xe8,0x01,0x18,0x01,0x68,0x01,0x18,0xc8,0x01,0x18,0xfe,0xe8,0xfd,
-0xf8,0xfe,0xe8,0x01,0x18,0x02,0x08,0xa0,0x01,0x18,0xfe,0xe8,0xc8,0xfe,0xe8,0x01,
-0x18,0xc8,0x04,0x6d,0x01,0x18,0xfe,0xe8,0xfe,0x84,0xfd,0x5f,0x02,0xa1,0x01,0x7c,
-0x50,0xfd,0xe4,0xfd,0x5f,0x02,0xa1,0x02,0x1c,0x01,0x18,0xfe,0x48,0xdc,0xfd,0x5f,
-0x02,0xa1,0xdc,0x01,0x18,0x00,0x00,0x01,0x00,0x70,0x00,0x00,0x06,0x44,0x05,0xd5,
-0x00,0x51,0x00,0x00,0x01,0x23,0x22,0x07,0x06,0x07,0x06,0x07,0x06,0x15,0x23,0x11,
-0x33,0x14,0x17,0x16,0x17,0x16,0x17,0x16,0x3b,0x01,0x35,0x34,0x27,0x26,0x27,0x26,
-0x27,0x26,0x23,0x35,0x21,0x15,0x22,0x07,0x06,0x07,0x0e,0x01,0x1d,0x01,0x33,0x32,
-0x37,0x36,0x37,0x36,0x37,0x36,0x35,0x33,0x11,0x23,0x34,0x27,0x26,0x27,0x26,0x27,
-0x26,0x2b,0x01,0x15,0x14,0x17,0x16,0x17,0x16,0x17,0x16,0x33,0x15,0x21,0x35,0x32,
-0x37,0x36,0x37,0x3e,0x01,0x35,0x03,0x0f,0x7b,0x64,0x5a,0x59,0x49,0x42,0x2c,0x24,
-0x32,0x32,0x24,0x2a,0x44,0x45,0x5d,0x56,0x68,0x7b,0x25,0x27,0x47,0x43,0x5f,0x52,
-0x6c,0x04,0x7c,0x6c,0x52,0x5f,0x43,0x49,0x4a,0x7b,0x68,0x56,0x5d,0x45,0x44,0x2a,
-0x24,0x32,0x32,0x24,0x2c,0x42,0x46,0x5c,0x5a,0x64,0x7b,0x25,0x27,0x47,0x43,0x5f,
-0x52,0x6c,0xfb,0x84,0x6c,0x52,0x5f,0x43,0x49,0x4a,0x02,0xa0,0x26,0x25,0x49,0x42,
-0x60,0x4f,0x6f,0x04,0x7c,0x6f,0x4f,0x5c,0x46,0x47,0x27,0x24,0x7a,0x64,0x5a,0x5c,
-0x47,0x42,0x2b,0x25,0x32,0x32,0x25,0x2b,0x42,0x49,0xb4,0x64,0x7a,0x24,0x27,0x47,
-0x46,0x5c,0x4f,0x6f,0xfb,0x84,0x6f,0x4f,0x60,0x42,0x48,0x26,0x26,0x7b,0x64,0x5a,
-0x5c,0x47,0x42,0x2b,0x25,0x32,0x32,0x25,0x2b,0x42,0x49,0xb4,0x64,0x00,0x00,0x08,
-0x00,0xbb,0xff,0xe5,0x05,0xf9,0x05,0xf3,0x00,0x0b,0x00,0x11,0x00,0x14,0x00,0x17,
-0x00,0x1a,0x00,0x1d,0x00,0x20,0x00,0x23,0x00,0x00,0x01,0x13,0x21,0x03,0x13,0x21,
-0x0b,0x01,0x21,0x13,0x03,0x21,0x17,0x03,0x13,0x21,0x13,0x0b,0x01,0x07,0x33,0x1f,
-0x01,0x37,0x03,0x07,0x33,0x05,0x23,0x17,0x01,0x27,0x07,0x13,0x37,0x23,0x03,0x5a,
-0xe0,0x01,0xbf,0xe0,0xe0,0xfe,0x41,0xe0,0xe0,0xfe,0x41,0xe0,0xe0,0x01,0xbf,0x3a,
-0xa6,0xa6,0x01,0x4c,0xa6,0xa6,0xa6,0x6c,0xd8,0xad,0x6d,0x6c,0x6c,0x6d,0xd9,0xfe,
-0x7a,0xd8,0x6c,0xfe,0xe7,0x6d,0x6c,0x6c,0x6d,0xd9,0x05,0xf3,0xfe,0x7c,0xfe,0x7d,
-0xfe,0x7d,0xfe,0x7c,0x01,0x84,0x01,0x83,0x01,0x83,0x64,0xfe,0xe1,0xfe,0xe0,0x01,
-0x20,0x01,0x1f,0x01,0x1f,0xbb,0x64,0xbb,0xbb,0xfe,0x7d,0xbc,0x63,0xbc,0x01,0x1f,
-0xbc,0xbc,0x01,0x84,0xbb,0x00,0x00,0x01,0x00,0x54,0xff,0xe3,0x06,0x60,0x05,0xf0,
-0x00,0x43,0x00,0x00,0x01,0x35,0x34,0x27,0x26,0x35,0x34,0x37,0x36,0x32,0x17,0x16,
-0x15,0x14,0x07,0x06,0x1d,0x01,0x33,0x32,0x37,0x36,0x33,0x32,0x17,0x16,0x14,0x07,
-0x06,0x23,0x22,0x27,0x26,0x2b,0x01,0x15,0x14,0x17,0x16,0x15,0x14,0x07,0x06,0x22,
-0x27,0x26,0x35,0x34,0x37,0x36,0x3d,0x01,0x23,0x22,0x07,0x06,0x23,0x22,0x27,0x26,
-0x34,0x37,0x36,0x33,0x32,0x17,0x16,0x33,0x03,0x28,0x4c,0x2c,0x36,0x38,0x78,0x38,
-0x36,0x2c,0x4c,0x20,0xba,0x7a,0x46,0x76,0x64,0x30,0x30,0x30,0x30,0x64,0x76,0x46,
-0x7a,0xba,0x20,0x4c,0x2c,0x36,0x38,0x78,0x38,0x36,0x2c,0x4c,0x20,0xba,0x7a,0x46,
-0x76,0x64,0x30,0x30,0x30,0x30,0x64,0x76,0x46,0x7a,0xba,0x03,0x1c,0x20,0xba,0x7a,
-0x46,0x76,0x64,0x30,0x30,0x30,0x30,0x64,0x76,0x46,0x7a,0xba,0x20,0x4c,0x2c,0x36,
-0x38,0x78,0x38,0x36,0x2c,0x4c,0x20,0xbb,0x79,0x46,0x76,0x64,0x30,0x31,0x31,0x30,
-0x64,0x76,0x46,0x79,0xbb,0x20,0x4c,0x2c,0x36,0x38,0x78,0x38,0x36,0x2c,0x4c,0x00,
-0x00,0x01,0x00,0x56,0xff,0xe7,0x06,0x5e,0x05,0xf0,0x00,0x83,0x00,0x00,0x01,0x26,
-0x27,0x23,0x06,0x07,0x06,0x07,0x0e,0x01,0x23,0x22,0x26,0x27,0x26,0x27,0x26,0x34,
-0x37,0x36,0x37,0x3e,0x01,0x33,0x32,0x16,0x17,0x16,0x17,0x16,0x17,0x33,0x36,0x37,
-0x36,0x37,0x35,0x26,0x27,0x26,0x27,0x2e,0x01,0x35,0x34,0x36,0x37,0x36,0x37,0x36,
-0x32,0x17,0x16,0x17,0x1e,0x01,0x15,0x14,0x06,0x07,0x06,0x07,0x06,0x07,0x15,0x16,
-0x17,0x16,0x17,0x33,0x36,0x37,0x36,0x37,0x3e,0x01,0x33,0x32,0x16,0x17,0x16,0x17,
-0x16,0x14,0x07,0x06,0x07,0x0e,0x01,0x23,0x22,0x26,0x27,0x26,0x27,0x26,0x27,0x23,
-0x06,0x07,0x06,0x07,0x15,0x16,0x17,0x16,0x17,0x1e,0x01,0x15,0x14,0x06,0x07,0x06,
-0x07,0x06,0x22,0x27,0x26,0x27,0x2e,0x01,0x35,0x34,0x36,0x37,0x36,0x37,0x36,0x37,
-0x35,0x26,0x03,0x02,0x10,0x0a,0xd4,0x02,0x0a,0x14,0x1d,0x20,0x52,0x2e,0x2d,0x52,
-0x20,0x1f,0x12,0x11,0x11,0x12,0x1f,0x20,0x52,0x2d,0x2e,0x52,0x20,0x22,0x0f,0x09,
-0x03,0xd4,0x0a,0x10,0x11,0x15,0x10,0x14,0x2a,0x1e,0x21,0x22,0x22,0x21,0x20,0x28,
-0x28,0x5c,0x28,0x28,0x20,0x21,0x22,0x22,0x21,0x23,0x25,0x17,0x0d,0x15,0x11,0x10,
-0x0a,0xd4,0x03,0x09,0x0f,0x22,0x20,0x52,0x2e,0x2d,0x52,0x20,0x1f,0x12,0x11,0x11,
-0x12,0x1f,0x20,0x52,0x2d,0x2e,0x52,0x20,0x1d,0x14,0x0a,0x02,0xd4,0x0a,0x10,0x11,
-0x15,0x0d,0x17,0x25,0x23,0x21,0x22,0x22,0x21,0x20,0x28,0x28,0x5c,0x28,0x28,0x20,
-0x21,0x22,0x22,0x21,0x1e,0x2a,0x14,0x10,0x15,0x02,0x93,0x11,0x15,0x10,0x14,0x2a,
-0x1e,0x21,0x22,0x22,0x21,0x20,0x28,0x28,0x5c,0x28,0x28,0x20,0x21,0x22,0x22,0x21,
-0x23,0x25,0x17,0x0d,0x15,0x11,0x10,0x0a,0xd5,0x02,0x0a,0x14,0x1d,0x20,0x52,0x2e,
-0x2d,0x52,0x20,0x1f,0x12,0x11,0x11,0x12,0x1f,0x20,0x52,0x2d,0x2e,0x52,0x20,0x22,
-0x0f,0x09,0x03,0xd5,0x0a,0x10,0x11,0x15,0x0d,0x17,0x25,0x23,0x21,0x22,0x22,0x21,
-0x20,0x28,0x28,0x5c,0x28,0x28,0x20,0x21,0x22,0x22,0x21,0x1e,0x2a,0x14,0x10,0x15,
-0x11,0x10,0x0a,0xd4,0x03,0x09,0x0f,0x22,0x20,0x52,0x2e,0x2d,0x52,0x20,0x1f,0x12,
-0x11,0x11,0x12,0x1f,0x20,0x52,0x2d,0x2e,0x52,0x20,0x1d,0x14,0x0a,0x02,0xd4,0x0a,
-0x00,0x01,0x00,0x53,0xff,0xe3,0x06,0x61,0x05,0xf0,0x00,0x9b,0x00,0x00,0x01,0x34,
-0x27,0x26,0x27,0x26,0x27,0x26,0x27,0x2e,0x01,0x35,0x34,0x37,0x36,0x37,0x36,0x37,
-0x36,0x33,0x32,0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x07,
-0x06,0x07,0x06,0x07,0x06,0x15,0x32,0x37,0x36,0x37,0x36,0x37,0x36,0x37,0x36,0x37,
-0x36,0x33,0x32,0x17,0x16,0x17,0x16,0x17,0x16,0x14,0x07,0x06,0x07,0x06,0x07,0x06,
-0x23,0x22,0x27,0x26,0x27,0x26,0x27,0x26,0x27,0x26,0x27,0x26,0x23,0x14,0x17,0x16,
-0x17,0x16,0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x07,0x06,
-0x22,0x27,0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x37,0x36,0x37,
-0x36,0x37,0x36,0x35,0x22,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x0e,0x01,0x23,0x22,
-0x27,0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x37,0x36,0x33,0x32,
-0x17,0x16,0x17,0x16,0x17,0x16,0x17,0x16,0x17,0x16,0x03,0x28,0x14,0x18,0x24,0x0e,
-0x10,0x18,0x0a,0x28,0x28,0x14,0x16,0x26,0x20,0x3a,0x2e,0x3a,0x38,0x30,0x36,0x24,
-0x26,0x16,0x14,0x14,0x16,0x26,0x0a,0x1a,0x08,0x14,0x29,0x13,0x14,0x44,0x2b,0x3a,
-0x21,0x0d,0x0c,0x12,0x0a,0x27,0x32,0x32,0x38,0x3a,0x2f,0x33,0x26,0x24,0x18,0x15,
-0x15,0x18,0x24,0x26,0x33,0x2f,0x3a,0x38,0x32,0x32,0x27,0x0a,0x12,0x0c,0x0d,0x29,
-0x32,0x2f,0x40,0x14,0x1b,0x21,0x0d,0x10,0x19,0x0a,0x27,0x15,0x14,0x14,0x16,0x26,
-0x24,0x36,0x2f,0x72,0x2f,0x36,0x24,0x26,0x16,0x14,0x14,0x15,0x27,0x0a,0x19,0x10,
-0x0d,0x27,0x15,0x14,0x3f,0x30,0x33,0x27,0x0e,0x0c,0x12,0x0a,0x26,0x64,0x38,0x3a,
-0x30,0x32,0x26,0x21,0x1b,0x16,0x16,0x18,0x24,0x26,0x32,0x30,0x3a,0x3d,0x2d,0x32,
-0x26,0x0a,0x12,0x06,0x14,0x28,0x32,0x30,0x03,0x1c,0x43,0x2c,0x37,0x22,0x0e,0x0c,
-0x12,0x0a,0x26,0x64,0x38,0x3a,0x30,0x32,0x26,0x20,0x1c,0x16,0x16,0x18,0x24,0x26,
-0x32,0x30,0x3a,0x3d,0x2d,0x32,0x26,0x0a,0x12,0x06,0x14,0x28,0x31,0x30,0x3f,0x14,
-0x1b,0x21,0x0d,0x10,0x19,0x0a,0x27,0x15,0x14,0x14,0x16,0x26,0x24,0x36,0x2f,0x72,
-0x2f,0x36,0x24,0x26,0x16,0x14,0x14,0x15,0x27,0x0a,0x19,0x10,0x0d,0x27,0x15,0x14,
-0x44,0x2b,0x3a,0x21,0x0d,0x0c,0x12,0x0a,0x27,0x32,0x32,0x38,0x3a,0x2f,0x33,0x26,
-0x24,0x18,0x15,0x15,0x18,0x24,0x26,0x33,0x2f,0x3a,0x38,0x32,0x32,0x27,0x0a,0x12,
-0x0c,0x0d,0x29,0x32,0x2f,0x40,0x14,0x15,0x27,0x0e,0x10,0x18,0x0a,0x28,0x28,0x14,
-0x16,0x26,0x20,0x3a,0x2e,0x3a,0x38,0x30,0x36,0x24,0x26,0x16,0x14,0x14,0x16,0x26,
-0x0a,0x1a,0x08,0x14,0x28,0x14,0x14,0x00,0x00,0x01,0x00,0x54,0xff,0xe5,0x06,0x60,
-0x05,0xf2,0x01,0x30,0x00,0x00,0x01,0x32,0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,
-0x07,0x06,0x07,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,
-0x07,0x0e,0x01,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x26,0x27,0x11,0x21,0x26,0x27,
-0x26,0x27,0x26,0x35,0x34,0x36,0x37,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x16,
-0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x16,
-0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x16,
-0x17,0x16,0x15,0x14,0x06,0x07,0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x26,0x27,
-0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x37,0x21,0x11,0x36,0x37,0x36,0x37,0x36,0x33,
-0x32,0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x07,0x06,0x23,
-0x22,0x27,0x26,0x27,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x07,0x06,0x22,
-0x27,0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x06,0x07,0x06,0x23,0x22,
-0x27,0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x37,0x36,0x33,0x32,
-0x16,0x17,0x16,0x17,0x11,0x21,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,
-0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,
-0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x26,0x27,0x26,0x34,0x37,0x36,0x37,0x36,
-0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,
-0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,
-0x07,0x21,0x11,0x06,0x07,0x06,0x07,0x06,0x23,0x22,0x27,0x2e,0x01,0x27,0x26,0x35,
-0x34,0x37,0x36,0x37,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x26,0x27,0x26,0x35,
-0x34,0x37,0x36,0x37,0x36,0x37,0x36,0x03,0x5a,0x1e,0x17,0x1b,0x12,0x14,0x0b,0x0a,
-0x0a,0x0b,0x14,0x0b,0x14,0x19,0x1c,0x1e,0x18,0x1a,0x13,0x14,0x0b,0x0a,0x0a,0x0b,
-0x28,0x19,0x19,0x1d,0x1e,0x17,0x19,0x14,0x0e,0x0a,0x01,0x26,0x11,0x0e,0x13,0x0b,
-0x0b,0x16,0x13,0x14,0x1a,0x19,0x1c,0x1d,0x19,0x1a,0x14,0x13,0x0b,0x0b,0x0b,0x08,
-0x09,0x14,0x19,0x19,0x1c,0x20,0x17,0x19,0x14,0x13,0x0c,0x0a,0x0a,0x0c,0x13,0x16,
-0x17,0x1a,0x1d,0x1c,0x19,0x19,0x14,0x09,0x08,0x0b,0x16,0x13,0x11,0x1d,0x19,0x1d,
-0x18,0x1d,0x1a,0x14,0x13,0x0b,0x0b,0x0b,0x0b,0x13,0x0e,0x11,0xfe,0xdb,0x09,0x0e,
-0x11,0x1d,0x17,0x1e,0x1d,0x18,0x1a,0x13,0x14,0x0b,0x0a,0x0a,0x0b,0x14,0x12,0x1b,
-0x17,0x1e,0x19,0x1c,0x14,0x0b,0x13,0x0b,0x0b,0x0b,0x0b,0x14,0x12,0x1b,0x17,0x3c,
-0x17,0x1b,0x12,0x14,0x0b,0x0b,0x0b,0x0b,0x13,0x0b,0x14,0x18,0x1d,0x1e,0x17,0x1b,
-0x12,0x14,0x0b,0x0a,0x0a,0x0b,0x14,0x13,0x1a,0x18,0x1d,0x1b,0x34,0x14,0x0e,0x09,
-0xfe,0xdb,0x11,0x0d,0x16,0x09,0x0a,0x0a,0x0b,0x14,0x16,0x17,0x1a,0x1b,0x1e,0x19,
-0x19,0x14,0x13,0x0c,0x0a,0x0a,0x08,0x0a,0x16,0x17,0x1a,0x1c,0x1d,0x19,0x1a,0x14,
-0x12,0x0c,0x0a,0x0a,0x0c,0x12,0x11,0x1d,0x19,0x1d,0x1c,0x1a,0x19,0x14,0x0a,0x08,
-0x0a,0x0a,0x0c,0x13,0x13,0x1a,0x19,0x1e,0x1b,0x1a,0x19,0x14,0x14,0x0b,0x0a,0x0a,
-0x0c,0x13,0x0d,0x11,0x01,0x25,0x0a,0x0e,0x14,0x19,0x17,0x1e,0x1d,0x18,0x1a,0x28,
-0x0a,0x0b,0x0b,0x0a,0x14,0x13,0x1b,0x17,0x1e,0x1d,0x18,0x14,0x0b,0x14,0x0b,0x0a,
-0x0a,0x0b,0x14,0x13,0x1a,0x17,0x05,0xf2,0x0b,0x0c,0x12,0x14,0x1a,0x19,0x1d,0x1c,
-0x19,0x1a,0x14,0x0a,0x08,0x0a,0x0a,0x0c,0x12,0x14,0x1a,0x19,0x1d,0x1f,0x17,0x19,
-0x28,0x0b,0x0a,0x0a,0x0c,0x13,0x0d,0x11,0xfe,0xdb,0x0a,0x0e,0x14,0x19,0x17,0x1e,
-0x1d,0x32,0x14,0x14,0x0b,0x0a,0x0a,0x0b,0x14,0x13,0x1a,0x18,0x1e,0x1c,0x19,0x14,
-0x0b,0x14,0x0b,0x0a,0x0a,0x0b,0x14,0x12,0x1b,0x18,0x1d,0x1e,0x18,0x1b,0x12,0x16,
-0x09,0x0a,0x0a,0x0b,0x14,0x0b,0x14,0x19,0x1c,0x1a,0x36,0x13,0x11,0x0d,0x0b,0x0b,
-0x0a,0x14,0x14,0x1a,0x18,0x1d,0x1e,0x17,0x19,0x14,0x0e,0x0a,0xfe,0xda,0x12,0x0d,
-0x10,0x0e,0x0b,0x0b,0x0b,0x13,0x14,0x1a,0x19,0x1c,0x1d,0x19,0x1a,0x14,0x12,0x0c,
-0x0b,0x0b,0x08,0x09,0x13,0x1a,0x19,0x1c,0x1d,0x1a,0x19,0x14,0x13,0x0c,0x0a,0x0a,
-0x0c,0x13,0x14,0x19,0x1a,0x1d,0x1c,0x19,0x1a,0x13,0x09,0x08,0x0b,0x0b,0x0c,0x12,
-0x14,0x1a,0x19,0x1d,0x1c,0x19,0x1a,0x14,0x13,0x0b,0x0b,0x16,0x13,0x0d,0x12,0x01,
-0x25,0x09,0x0e,0x17,0x16,0x18,0x1e,0x1c,0x19,0x1a,0x13,0x16,0x09,0x0a,0x0a,0x0b,
-0x14,0x12,0x1b,0x17,0x1e,0x1d,0x19,0x13,0x0c,0x16,0x09,0x0a,0x0a,0x0b,0x14,0x12,
-0x1b,0x17,0x3c,0x17,0x1b,0x13,0x11,0x0d,0x0b,0x0b,0x0a,0x14,0x0b,0x14,0x18,0x1d,
-0x1e,0x17,0x1b,0x12,0x14,0x0b,0x0b,0x0b,0x0b,0x14,0x13,0x1a,0x18,0x1d,0x1e,0x17,
-0x1a,0x13,0x0e,0x0a,0x01,0x25,0x11,0x0d,0x13,0x0c,0x0a,0x0a,0x0b,0x28,0x19,0x1a,
-0x1c,0x19,0x1d,0x1a,0x14,0x12,0x0c,0x0a,0x0a,0x08,0x0a,0x14,0x1a,0x19,0x1c,0x1d,
-0x19,0x1a,0x14,0x12,0x0c,0x0b,0x00,0x01,0x00,0x57,0xff,0xe3,0x06,0x5f,0x05,0xf5,
-0x00,0x1f,0x00,0x00,0x13,0x32,0x37,0x36,0x37,0x36,0x37,0x36,0x35,0x14,0x17,0x16,
-0x17,0x16,0x17,0x16,0x33,0x22,0x07,0x06,0x07,0x06,0x07,0x06,0x15,0x34,0x27,0x26,
-0x27,0x26,0x27,0x26,0x57,0x9b,0x8d,0x86,0x73,0x70,0x3a,0x39,0x39,0x35,0x75,0x6c,
-0x8d,0x8c,0x9c,0x9c,0x8c,0x8d,0x6c,0x75,0x35,0x39,0x39,0x3a,0x70,0x73,0x86,0x8d,
-0x02,0xec,0x3b,0x38,0x72,0x6f,0x8b,0x89,0xa1,0x9d,0x8d,0x83,0x77,0x6e,0x3c,0x3b,
-0x3b,0x3c,0x6e,0x77,0x83,0x8d,0x9d,0xa1,0x89,0x8b,0x6f,0x72,0x38,0x3b,0x00,0x02,
-0x00,0x57,0xff,0xe3,0x06,0x5f,0x05,0xf5,0x00,0x1f,0x00,0x3f,0x00,0x00,0x01,0x32,
-0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x34,0x37,0x36,0x37,0x36,0x37,0x36,0x33,0x22,
-0x27,0x26,0x27,0x26,0x27,0x26,0x35,0x14,0x07,0x06,0x07,0x06,0x07,0x06,0x21,0x32,
-0x37,0x36,0x37,0x36,0x37,0x36,0x35,0x14,0x17,0x16,0x17,0x16,0x17,0x16,0x33,0x22,
-0x07,0x06,0x07,0x06,0x07,0x06,0x15,0x34,0x27,0x26,0x27,0x26,0x27,0x26,0x01,0x65,
-0x65,0x5c,0x57,0x4a,0x49,0x26,0x25,0x25,0x22,0x4d,0x46,0x5b,0x5b,0x66,0x66,0x5b,
-0x5b,0x46,0x4d,0x22,0x25,0x25,0x26,0x49,0x4a,0x57,0x5c,0xfe,0x8d,0x9b,0x8d,0x86,
-0x73,0x70,0x3a,0x39,0x39,0x35,0x75,0x6c,0x8d,0x8c,0x9c,0x9c,0x8c,0x8d,0x6c,0x75,
-0x35,0x39,0x39,0x3a,0x70,0x73,0x86,0x8d,0x02,0xec,0x26,0x25,0x4a,0x48,0x5a,0x59,
-0x69,0x66,0x5c,0x55,0x4d,0x48,0x27,0x26,0x26,0x27,0x48,0x4d,0x55,0x5c,0x66,0x69,
-0x59,0x5a,0x48,0x4a,0x25,0x26,0x3b,0x38,0x72,0x6f,0x8b,0x89,0xa1,0x9d,0x8d,0x83,
-0x77,0x6e,0x3c,0x3b,0x3b,0x3c,0x6e,0x77,0x83,0x8d,0x9d,0xa1,0x89,0x8b,0x6f,0x72,
-0x38,0x3b,0x00,0x02,0x00,0x30,0xff,0xed,0x06,0x84,0x05,0xf2,0x00,0x09,0x00,0x13,
-0x00,0x00,0x13,0x25,0x09,0x01,0x05,0x01,0x13,0x25,0x05,0x13,0x01,0x03,0x21,0x01,
-0x03,0x09,0x01,0x03,0x01,0x21,0x30,0x02,0x0c,0x01,0x1e,0x01,0x1e,0x02,0x0c,0xfe,
-0xa7,0x24,0xfe,0x0b,0xfe,0x0b,0x24,0x01,0xd1,0xbf,0xfd,0x95,0x01,0xf4,0xbf,0x01,
-0xf5,0x01,0xf5,0xbf,0x01,0xf4,0xfd,0x95,0x03,0xa5,0x83,0x01,0xca,0xfe,0x36,0x83,
-0xfe,0x61,0xfd,0xe7,0xc9,0xc9,0x02,0x19,0x03,0xec,0xfd,0xb3,0xfe,0x94,0xfd,0xb4,
-0x01,0x6c,0xfe,0x94,0x02,0x4c,0x01,0x6c,0x00,0x02,0x00,0x56,0xff,0xe3,0x06,0x5e,
-0x05,0xf0,0x00,0x09,0x00,0x29,0x00,0x00,0x01,0x03,0x21,0x01,0x03,0x09,0x01,0x03,
-0x01,0x21,0x03,0x32,0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,
-0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,
-0x37,0x36,0x03,0x5a,0xac,0xfd,0xd3,0x01,0xc2,0xac,0x01,0xc3,0x01,0xc3,0xac,0x01,
-0xc2,0xfd,0xd3,0xac,0x9a,0x8e,0x86,0x73,0x70,0x3a,0x39,0x39,0x35,0x75,0x6e,0x8b,
-0x8d,0x9b,0x9a,0x8e,0x86,0x73,0x70,0x3a,0x39,0x39,0x35,0x75,0x6c,0x8d,0x8c,0x05,
-0xea,0xfd,0xee,0xfe,0xb8,0xfd,0xef,0x01,0x48,0xfe,0xb8,0x02,0x11,0x01,0x48,0x02,
-0x18,0x3b,0x38,0x72,0x6f,0x8b,0x89,0xa1,0x98,0x8d,0x83,0x77,0x70,0x3a,0x3b,0x3b,
-0x38,0x72,0x6f,0x8b,0x89,0x9c,0x9d,0x8d,0x83,0x77,0x6e,0x3c,0x3b,0x00,0x00,0x02,
-0x00,0x30,0xff,0xed,0x06,0x84,0x05,0xf2,0x00,0x1d,0x00,0x27,0x00,0x00,0x00,0x22,
-0x07,0x06,0x07,0x06,0x07,0x06,0x15,0x14,0x17,0x16,0x17,0x16,0x17,0x16,0x32,0x37,
-0x36,0x37,0x36,0x37,0x36,0x35,0x34,0x27,0x26,0x27,0x26,0x27,0x03,0x13,0x21,0x01,
-0x13,0x09,0x01,0x13,0x01,0x21,0x03,0x9d,0x86,0x39,0x39,0x30,0x30,0x17,0x18,0x18,
-0x17,0x30,0x30,0x39,0x39,0x86,0x39,0x39,0x30,0x30,0x17,0x18,0x18,0x17,0x30,0x30,
-0x39,0x7c,0xbf,0x02,0x6b,0xfe,0x0c,0xbf,0xfe,0x0b,0xfe,0x0b,0xbf,0xfe,0x0c,0x02,
-0x6b,0x03,0xe4,0x18,0x1a,0x2d,0x32,0x38,0x3b,0x42,0x41,0x3b,0x38,0x32,0x2d,0x1a,
-0x18,0x18,0x1a,0x2d,0x32,0x38,0x3b,0x41,0x42,0x3b,0x38,0x32,0x2d,0x1a,0x02,0x26,
-0xfd,0xb3,0xfe,0x94,0xfd,0xb4,0x01,0x6c,0xfe,0x94,0x02,0x4c,0x01,0x6c,0x00,0x03,
-0x00,0x30,0xff,0xed,0x06,0x84,0x05,0xf2,0x00,0x09,0x00,0x27,0x00,0x31,0x00,0x00,
-0x13,0x25,0x09,0x01,0x05,0x01,0x13,0x25,0x05,0x13,0x00,0x32,0x17,0x16,0x17,0x16,
-0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x07,0x06,0x22,0x27,0x26,0x27,0x26,0x27,
-0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x37,0x13,0x03,0x21,0x01,0x03,0x09,0x01,0x03,
-0x01,0x21,0x30,0x02,0x0c,0x01,0x1e,0x01,0x1e,0x02,0x0c,0xfe,0xa7,0x24,0xfe,0x0b,
-0xfe,0x0b,0x24,0x01,0x8e,0x86,0x39,0x39,0x30,0x30,0x17,0x18,0x18,0x17,0x30,0x30,
-0x39,0x39,0x86,0x39,0x39,0x30,0x30,0x17,0x18,0x18,0x17,0x30,0x30,0x39,0x7c,0xbf,
-0xfd,0x95,0x01,0xf4,0xbf,0x01,0xf5,0x01,0xf5,0xbf,0x01,0xf4,0xfd,0x95,0x03,0xa5,
-0x83,0x01,0xca,0xfe,0x36,0x83,0xfe,0x61,0xfd,0xe7,0xc9,0xc9,0x02,0x19,0x01,0xde,
-0x18,0x1a,0x2d,0x32,0x38,0x3b,0x42,0x41,0x3b,0x38,0x32,0x2d,0x1a,0x18,0x18,0x1a,
-0x2d,0x32,0x38,0x3b,0x41,0x42,0x3b,0x38,0x32,0x2d,0x1a,0x02,0x26,0xfd,0xb3,0xfe,
-0x94,0xfd,0xb4,0x01,0x6c,0xfe,0x94,0x02,0x4c,0x01,0x6c,0x00,0x00,0x03,0x00,0x30,
-0xff,0xed,0x06,0x84,0x05,0xf2,0x00,0x09,0x00,0x13,0x00,0x1d,0x00,0x00,0x01,0x13,
-0x21,0x07,0x13,0x27,0x07,0x13,0x27,0x21,0x13,0x03,0x21,0x01,0x03,0x09,0x01,0x03,
-0x01,0x21,0x03,0x13,0x21,0x01,0x13,0x09,0x01,0x13,0x01,0x21,0x03,0x5a,0x60,0x01,
-0x35,0xfa,0x5f,0xfa,0xfa,0x5f,0xfa,0x01,0x35,0x60,0x8f,0xfe,0x2f,0x01,0x78,0x90,
-0x01,0x78,0x01,0x78,0x90,0x01,0x78,0xfe,0x2f,0x8f,0xbf,0x02,0x6b,0xfe,0x0c,0xbf,
-0xfe,0x0b,0xfe,0x0b,0xbf,0xfe,0x0c,0x02,0x6b,0x04,0x49,0xfe,0xd9,0xb6,0xfe,0xda,
-0xb6,0xb6,0x01,0x26,0xb6,0x01,0xfb,0xfe,0x47,0xfe,0xef,0xfe,0x47,0x01,0x11,0xfe,
-0xef,0x01,0xb9,0x01,0x11,0x02,0x8e,0xfd,0xb3,0xfe,0x94,0xfd,0xb4,0x01,0x6c,0xfe,
-0x94,0x02,0x4c,0x01,0x6c,0x00,0x00,0x03,0x00,0x30,0xff,0xed,0x06,0x84,0x05,0xf2,
-0x00,0x09,0x00,0x13,0x00,0x1d,0x00,0x00,0x01,0x17,0x33,0x07,0x17,0x27,0x07,0x37,
-0x27,0x33,0x1b,0x01,0x21,0x01,0x13,0x09,0x01,0x13,0x01,0x21,0x37,0x03,0x21,0x05,
-0x03,0x25,0x05,0x03,0x25,0x21,0x03,0x5a,0x26,0x7c,0x64,0x26,0x64,0x64,0x26,0x64,
-0x7c,0x26,0xbf,0x02,0x6b,0xfe,0x0c,0xbf,0xfe,0x0b,0xfe,0x0b,0xbf,0xfe,0x0c,0x02,
-0x6b,0xbf,0x73,0xfe,0x8a,0x01,0x2f,0x75,0x01,0x2f,0x01,0x2f,0x75,0x01,0x2f,0xfe,
-0x8a,0x03,0x49,0x76,0x49,0x76,0x49,0x49,0x76,0x49,0x03,0x1f,0xfd,0xb3,0xfe,0x94,
-0xfd,0xb4,0x01,0x6c,0xfe,0x94,0x02,0x4c,0x01,0x6c,0xfb,0xfe,0x9d,0xdb,0xfe,0x9d,
-0xdb,0xdb,0x01,0x63,0xdb,0x00,0x00,0x06,0x00,0x30,0xff,0xed,0x06,0x84,0x05,0xf2,
-0x00,0x02,0x00,0x05,0x00,0x08,0x00,0x0b,0x00,0x0e,0x00,0x18,0x00,0x00,0x25,0x01,
-0x35,0x25,0x01,0x37,0x01,0x03,0x27,0x25,0x21,0x07,0x11,0x03,0x17,0x11,0x13,0x21,
-0x01,0x13,0x09,0x01,0x13,0x01,0x21,0x01,0xe2,0x01,0x78,0xfd,0xa0,0x01,0x78,0xe8,
-0x01,0x78,0x90,0xe8,0x02,0x60,0xfe,0x2f,0x8f,0x8f,0x8f,0xbf,0x02,0x6b,0xfe,0x0c,
-0xbf,0xfe,0x0b,0xfe,0x0b,0xbf,0xfe,0x0c,0x02,0x6b,0x9a,0x01,0x11,0xf3,0xc6,0xfe,
-0xef,0x4b,0xfd,0xfc,0x01,0xb9,0x4b,0xc6,0xc6,0x02,0x7f,0xfe,0x47,0xc6,0x03,0x54,
-0xfd,0xb3,0xfe,0x94,0xfd,0xb4,0x01,0x6c,0xfe,0x94,0x02,0x4c,0x01,0x6c,0x00,0x02,
-0x00,0x32,0x00,0x18,0x06,0x86,0x05,0xb7,0x00,0x0d,0x00,0x17,0x00,0x00,0x09,0x01,
-0x13,0x27,0x25,0x01,0x27,0x13,0x01,0x21,0x13,0x17,0x13,0x21,0x01,0x03,0x21,0x05,
-0x03,0x01,0x05,0x03,0x01,0x21,0x06,0x86,0xfe,0x3e,0xac,0xa2,0xfe,0xb2,0xfe,0x6a,
-0xa2,0xac,0xfe,0x3e,0x02,0x2d,0xac,0xa2,0x9b,0x01,0x9c,0xfd,0x27,0x86,0xfe,0x4f,
-0x01,0x5e,0x86,0x01,0x5f,0x01,0x5f,0x86,0x01,0x5e,0xfe,0x4f,0x03,0x71,0xfe,0xb8,
-0xfd,0xef,0x34,0xf3,0xfe,0xd9,0x34,0x02,0x11,0x01,0x48,0x02,0x12,0x34,0xfe,0x22,
-0x01,0x68,0xfe,0x64,0xff,0xfe,0x64,0x00,0xff,0xff,0x01,0x9c,0x00,0xff,0x00,0x01,
-0x00,0x84,0x00,0x00,0x06,0x30,0x05,0xd5,0x00,0x11,0x00,0x00,0x01,0x11,0x21,0x11,
-0x25,0x13,0x0d,0x01,0x03,0x25,0x11,0x21,0x11,0x05,0x03,0x2d,0x01,0x13,0x02,0xba,
-0x01,0x40,0x01,0x96,0xa0,0xfe,0x6a,0x01,0x96,0xa0,0xfe,0x6a,0xfe,0xc0,0xfe,0x6a,
-0xa0,0x01,0x95,0xfe,0x6b,0xa0,0x04,0x00,0x01,0xd5,0xfe,0x2a,0xeb,0xfe,0xeb,0xea,
-0xeb,0xfe,0xeb,0xeb,0xfe,0x2a,0x01,0xd6,0xeb,0x01,0x15,0xeb,0xea,0x01,0x15,0x00,
-0x00,0x02,0x00,0x98,0x00,0x00,0x06,0x1c,0x05,0xd5,0x00,0x05,0x00,0x17,0x00,0x00,
-0x01,0x07,0x17,0x33,0x37,0x27,0x05,0x01,0x37,0x01,0x11,0x17,0x11,0x01,0x17,0x09,
-0x01,0x07,0x01,0x11,0x23,0x11,0x01,0x27,0x02,0xe2,0x78,0x78,0xf0,0x78,0x78,0xfe,
-0x98,0xfe,0x2e,0x78,0x01,0xd2,0xf0,0x01,0xd2,0x78,0xfe,0x2e,0x01,0xd2,0x78,0xfe,
-0x2e,0xf0,0xfe,0x2e,0x78,0x03,0xba,0xcf,0xd1,0xd1,0xcf,0xcf,0x01,0x0d,0xd0,0xfe,
-0xf2,0x02,0x1b,0x01,0xfd,0xe6,0x01,0x0e,0xd0,0xfe,0xf3,0xfe,0xf2,0xd0,0x01,0x0d,
-0xfd,0xe6,0x02,0x1a,0xfe,0xf3,0xd0,0x00,0x00,0x01,0x00,0x70,0x00,0x00,0x06,0x44,
-0x05,0xd5,0x00,0x17,0x00,0x00,0x09,0x01,0x07,0x01,0x11,0x23,0x11,0x01,0x27,0x01,
-0x21,0x35,0x21,0x01,0x37,0x01,0x11,0x33,0x11,0x01,0x17,0x01,0x21,0x15,0x03,0xd4,
-0x01,0xb9,0x47,0xfe,0x46,0x64,0xfe,0x46,0x47,0x01,0xba,0xfd,0x8f,0x02,0x72,0xfe,
-0x45,0x47,0x01,0xba,0x64,0x01,0xba,0x47,0xfe,0x45,0x02,0x72,0x02,0xb8,0xfe,0x46,
-0x47,0x01,0xbb,0xfd,0x8e,0x02,0x71,0xfe,0x46,0x47,0x01,0xba,0x64,0x01,0xbb,0x47,
-0xfe,0x46,0x02,0x71,0xfd,0x8f,0x01,0xba,0x47,0xfe,0x45,0x64,0x00,0x01,0x00,0x40,
-0xff,0xe3,0x06,0x4c,0x05,0xf0,0x00,0x0f,0x00,0x00,0x01,0x13,0x09,0x01,0x0d,0x01,
-0x09,0x01,0x0b,0x01,0x09,0x01,0x2d,0x01,0x09,0x01,0x03,0x46,0x4f,0x01,0xd4,0xfe,
-0x9d,0x02,0x46,0xfd,0xba,0x01,0x63,0xfe,0x2c,0x4f,0x4f,0xfe,0x2c,0x01,0x63,0xfd,
-0xba,0x02,0x46,0xfe,0x9d,0x01,0xd4,0x05,0xf0,0xfd,0xb9,0x01,0x64,0xfe,0x2c,0x50,
-0x4f,0xfe,0x2c,0x01,0x64,0xfd,0xb9,0x02,0x47,0xfe,0x9c,0x01,0xd4,0x4f,0x50,0x01,
-0xd4,0xfe,0x9c,0x00,0x00,0x09,0x00,0x54,0xff,0xe3,0x06,0x60,0x05,0xf0,0x00,0x02,
-0x00,0x05,0x00,0x08,0x00,0x0b,0x00,0x0e,0x00,0x11,0x00,0x14,0x00,0x17,0x00,0x27,
-0x00,0x00,0x01,0x05,0x03,0x21,0x25,0x05,0x01,0x03,0x25,0x11,0x13,0x03,0x01,0x25,
-0x13,0x21,0x05,0x25,0x01,0x13,0x05,0x11,0x03,0x13,0x11,0x13,0x25,0x03,0x0d,0x01,
-0x13,0x25,0x0b,0x01,0x05,0x13,0x2d,0x01,0x03,0x05,0x04,0xf4,0xfe,0xdd,0x77,0x02,
-0x44,0xfe,0xdb,0xfe,0xe1,0x01,0x9a,0x7b,0xfe,0xe1,0x77,0x77,0xfe,0x66,0x01,0x23,
-0x77,0xfd,0xbc,0x01,0x25,0x01,0x1f,0xfe,0x66,0x7b,0x01,0x1f,0x77,0x77,0x9f,0x01,
-0x84,0xa4,0x01,0x87,0xfe,0x79,0xa4,0xfe,0x7c,0x9f,0x9f,0xfe,0x7c,0xa4,0xfe,0x79,
-0x01,0x87,0xa4,0x01,0x84,0x04,0x84,0x7b,0xfe,0xe0,0x78,0x78,0xfe,0x66,0x01,0x23,
-0x77,0xfd,0xbc,0x01,0x25,0x01,0x1f,0xfe,0x66,0x7b,0x01,0x1f,0x77,0x77,0x01,0x9b,
-0xfe,0xdd,0x78,0x02,0x45,0xfe,0xdb,0xfe,0xe0,0x03,0x07,0xfe,0x79,0xa4,0xfe,0x7c,
-0xa0,0x9f,0xfe,0x7c,0xa4,0xfe,0x79,0x01,0x87,0xa4,0x01,0x84,0x9f,0xa0,0x01,0x84,
-0xa4,0x00,0x00,0x01,0x00,0xbb,0xff,0xe3,0x05,0xf9,0x05,0xf0,0x00,0x0b,0x00,0x00,
-0x01,0x13,0x25,0x09,0x01,0x25,0x0b,0x01,0x05,0x09,0x01,0x05,0x03,0x5a,0x70,0x02,
-0x2f,0xfe,0x41,0x01,0xbf,0xfd,0xd1,0x70,0x70,0xfd,0xd1,0x01,0xbf,0xfe,0x41,0x02,
-0x2f,0x05,0xf0,0xfd,0xbc,0xc1,0xfe,0x7d,0xfe,0x7d,0xc1,0xfd,0xbb,0x02,0x45,0xc1,
-0x01,0x83,0x01,0x83,0xc1,0x00,0x00,0x01,0x00,0x54,0xff,0xe3,0x06,0x60,0x05,0xf0,
-0x00,0x0f,0x00,0x00,0x01,0x13,0x09,0x01,0x0d,0x01,0x09,0x01,0x0b,0x01,0x09,0x01,
-0x2d,0x01,0x09,0x01,0x03,0x5a,0x71,0x01,0xb2,0xfe,0xef,0x01,0xf4,0xfe,0x0c,0x01,
-0x11,0xfe,0x4e,0x71,0x71,0xfe,0x4e,0x01,0x11,0xfe,0x0c,0x01,0xf4,0xfe,0xef,0x01,
-0xb2,0x05,0xf0,0xfe,0x0b,0x01,0x12,0xfe,0x4e,0x72,0x71,0xfe,0x4e,0x01,0x12,0xfe,
-0x0b,0x01,0xf5,0xfe,0xee,0x01,0xb2,0x71,0x72,0x01,0xb2,0xfe,0xee,0x00,0x00,0x01,
-0x00,0x54,0xff,0xe3,0x06,0x60,0x05,0xf0,0x00,0x0f,0x00,0x00,0x01,0x13,0x25,0x03,
-0x0d,0x01,0x13,0x25,0x0b,0x01,0x05,0x13,0x2d,0x01,0x03,0x05,0x03,0x5a,0xaa,0x01,
-0x79,0x89,0x01,0x6c,0xfe,0x94,0x89,0xfe,0x87,0xaa,0xaa,0xfe,0x87,0x89,0xfe,0x94,
-0x01,0x6c,0x89,0x01,0x79,0x05,0xf0,0xfe,0x94,0x89,0xfe,0x87,0xab,0xaa,0xfe,0x87,
-0x89,0xfe,0x94,0x01,0x6c,0x89,0x01,0x79,0xaa,0xab,0x01,0x79,0x89,0x00,0x00,0x01,
-0x00,0x54,0xff,0xe3,0x06,0x60,0x05,0xf0,0x00,0x17,0x00,0x00,0x01,0x13,0x25,0x03,
-0x25,0x03,0x0d,0x01,0x13,0x25,0x13,0x25,0x0b,0x01,0x05,0x13,0x05,0x13,0x2d,0x01,
-0x03,0x05,0x03,0x05,0x03,0x5a,0x74,0x01,0x0f,0x47,0x01,0x63,0xef,0x01,0x56,0xfe,
-0xaa,0xef,0xfe,0x9d,0x47,0xfe,0xf1,0x74,0x74,0xfe,0xf1,0x47,0xfe,0x9d,0xef,0xfe,
-0xaa,0x01,0x56,0xef,0x01,0x63,0x47,0x01,0x0f,0x05,0xf0,0xfe,0xa9,0xef,0xfe,0x9d,
-0x47,0xfe,0xf1,0x73,0x74,0xfe,0xf1,0x47,0xfe,0x9d,0xef,0xfe,0xa9,0x01,0x57,0xef,
-0x01,0x63,0x47,0x01,0x0f,0x74,0x73,0x01,0x0f,0x47,0x01,0x63,0xef,0x00,0x00,0x01,
-0x00,0x70,0x00,0x00,0x06,0x44,0x05,0xd5,0x00,0x2f,0x00,0x00,0x01,0x11,0x33,0x11,
-0x13,0x17,0x03,0x01,0x17,0x01,0x25,0x17,0x05,0x21,0x15,0x21,0x05,0x07,0x25,0x01,
-0x07,0x01,0x13,0x07,0x03,0x11,0x23,0x11,0x03,0x27,0x13,0x01,0x27,0x01,0x05,0x27,
-0x25,0x21,0x35,0x21,0x25,0x37,0x05,0x01,0x37,0x01,0x03,0x37,0x03,0x1e,0x78,0xaa,
-0x6f,0xaa,0x01,0x3a,0x55,0xfe,0xc5,0x01,0x9c,0x2e,0xfe,0x63,0x01,0xbe,0xfe,0x46,
-0x01,0x99,0x2e,0xfe,0x64,0x01,0x3b,0x55,0xfe,0xc7,0xa9,0x6f,0xaa,0x78,0xaa,0x6f,
-0xaa,0xfe,0xc6,0x55,0x01,0x3a,0xfe,0x65,0x2e,0x01,0x9a,0xfe,0x45,0x01,0xbe,0xfe,
-0x63,0x2e,0x01,0x99,0xfe,0xc8,0x55,0x01,0x39,0xa9,0x6f,0x04,0x17,0x01,0xbe,0xfe,
-0x45,0x01,0x99,0x2e,0xfe,0x66,0x01,0x3a,0x55,0xfe,0xc5,0xab,0x6f,0xab,0x78,0xaa,
-0x6f,0xac,0xfe,0xc4,0x55,0x01,0x39,0xfe,0x67,0x2e,0x01,0x98,0xfe,0x46,0x01,0xbc,
-0xfe,0x66,0x2e,0x01,0x9b,0xfe,0xc5,0x55,0x01,0x3a,0xaa,0x6f,0xaa,0x78,0xab,0x6f,
-0xa9,0x01,0x39,0x55,0xfe,0xc7,0x01,0x99,0x2e,0x00,0x00,0x01,0x00,0xa7,0xff,0xe3,
-0x06,0x0d,0x05,0xf0,0x00,0x9f,0x00,0x00,0x01,0x35,0x34,0x27,0x26,0x35,0x34,0x37,
-0x36,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x1d,0x01,0x17,0x16,0x17,0x37,0x36,0x37,
-0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x23,
-0x22,0x23,0x22,0x23,0x22,0x0f,0x01,0x16,0x15,0x14,0x07,0x17,0x16,0x33,0x32,0x33,
-0x32,0x33,0x32,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x23,0x22,0x27,
-0x26,0x27,0x26,0x2f,0x01,0x06,0x0f,0x01,0x15,0x14,0x17,0x16,0x15,0x14,0x07,0x06,
-0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x3d,0x01,0x26,0x27,0x26,0x27,0x07,0x06,0x07,
-0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x33,
-0x32,0x33,0x32,0x33,0x32,0x3f,0x01,0x26,0x35,0x34,0x37,0x27,0x26,0x23,0x22,0x23,
-0x22,0x23,0x22,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x33,0x32,0x17,
-0x16,0x17,0x16,0x1f,0x01,0x36,0x37,0x36,0x03,0x27,0x4b,0x2c,0x36,0x38,0x78,0x38,
-0x36,0x2c,0x4c,0x10,0x1f,0x18,0x0a,0x71,0x41,0x27,0x43,0x3c,0x34,0x16,0x15,0x47,
-0x1e,0x14,0x05,0x0e,0x57,0x3e,0x4c,0x06,0x06,0x0b,0x0a,0x83,0x64,0x0c,0x04,0x05,
-0x0c,0x66,0x82,0x0b,0x0a,0x06,0x06,0x4c,0x3e,0x57,0x0e,0x05,0x14,0x1e,0x47,0x15,
-0x16,0x34,0x3c,0x43,0x27,0x43,0x6e,0x0e,0x1b,0x19,0x10,0x4c,0x2c,0x36,0x38,0x78,
-0x38,0x36,0x2c,0x4d,0x09,0x08,0x1d,0x17,0x0e,0x6e,0x43,0x27,0x43,0x3c,0x34,0x16,
-0x15,0x47,0x1e,0x14,0x05,0x0e,0x57,0x3e,0x4c,0x06,0x06,0x0b,0x0a,0x84,0x64,0x0c,
-0x05,0x04,0x0c,0x64,0x83,0x0a,0x0b,0x06,0x06,0x4c,0x3e,0x57,0x0e,0x05,0x14,0x1e,
-0x47,0x15,0x16,0x34,0x3c,0x43,0x27,0x45,0x6c,0x0b,0x1a,0x1d,0x08,0x03,0x94,0x0c,
-0x80,0x77,0x46,0x4e,0x64,0x30,0x31,0x31,0x30,0x64,0x4e,0x46,0x79,0x7e,0x0c,0x06,
-0x0e,0x17,0x06,0x44,0x7a,0x49,0x27,0x23,0x07,0x18,0x34,0x23,0x2c,0x16,0x18,0x47,
-0x32,0x24,0x3a,0x07,0x13,0x14,0x15,0x14,0x07,0x3b,0x24,0x32,0x47,0x18,0x16,0x2c,
-0x23,0x34,0x18,0x07,0x23,0x27,0x49,0x7e,0x3f,0x08,0x19,0x09,0x06,0x0f,0x7f,0x79,
-0x46,0x4e,0x64,0x30,0x31,0x31,0x30,0x64,0x4e,0x46,0x79,0x7f,0x0f,0x03,0x03,0x0d,
-0x15,0x08,0x3f,0x7e,0x49,0x27,0x23,0x07,0x18,0x34,0x23,0x2c,0x16,0x18,0x47,0x32,
-0x24,0x3a,0x07,0x14,0x16,0x14,0x13,0x07,0x3a,0x24,0x32,0x47,0x18,0x16,0x2c,0x23,
-0x34,0x18,0x07,0x23,0x27,0x49,0x82,0x3b,0x06,0x19,0x0b,0x03,0x00,0x02,0x00,0xa7,
-0xff,0xe3,0x06,0x0d,0x05,0xf0,0x00,0x1d,0x00,0xb9,0x00,0x00,0x00,0x22,0x07,0x06,
-0x07,0x06,0x07,0x06,0x15,0x14,0x17,0x16,0x17,0x16,0x17,0x16,0x32,0x37,0x36,0x37,
-0x36,0x37,0x36,0x35,0x34,0x27,0x26,0x27,0x26,0x2f,0x01,0x35,0x34,0x27,0x26,0x35,
-0x34,0x37,0x36,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x1d,0x01,0x17,0x16,0x17,0x37,
-0x36,0x37,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,
-0x06,0x2b,0x01,0x22,0x23,0x22,0x0f,0x01,0x16,0x15,0x14,0x07,0x17,0x16,0x33,0x32,
-0x3b,0x01,0x32,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x23,0x22,0x27,
-0x26,0x27,0x26,0x2f,0x01,0x06,0x0f,0x01,0x15,0x14,0x17,0x16,0x15,0x14,0x07,0x06,
-0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x3d,0x01,0x26,0x27,0x26,0x27,0x07,0x06,0x07,
-0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x3b,
-0x01,0x32,0x33,0x32,0x3f,0x01,0x26,0x35,0x34,0x37,0x27,0x26,0x23,0x22,0x2b,0x01,
-0x22,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x17,
-0x16,0x1f,0x01,0x36,0x37,0x36,0x03,0x6f,0x2a,0x11,0x12,0x0e,0x0f,0x07,0x08,0x08,
-0x07,0x0f,0x0e,0x12,0x11,0x2a,0x11,0x12,0x0e,0x0f,0x07,0x08,0x08,0x07,0x0f,0x0e,
-0x12,0x59,0x4b,0x2c,0x36,0x38,0x78,0x38,0x36,0x2c,0x4c,0x10,0x1f,0x18,0x0a,0x71,
-0x41,0x27,0x43,0x3c,0x34,0x16,0x15,0x47,0x1e,0x14,0x05,0x0e,0x57,0x3e,0x4c,0x0c,
-0x0b,0x0a,0x83,0x64,0x0c,0x04,0x05,0x0c,0x66,0x82,0x0b,0x0a,0x0c,0x4c,0x3e,0x57,
-0x0e,0x05,0x14,0x1e,0x47,0x15,0x16,0x34,0x3c,0x43,0x27,0x43,0x6e,0x0e,0x1b,0x19,
-0x10,0x4c,0x2c,0x36,0x38,0x78,0x38,0x36,0x2c,0x4d,0x09,0x08,0x1d,0x17,0x0e,0x6e,
-0x43,0x27,0x43,0x3c,0x34,0x16,0x15,0x47,0x1e,0x14,0x05,0x0e,0x57,0x3e,0x4c,0x0c,
-0x0b,0x0a,0x84,0x64,0x0c,0x05,0x04,0x0c,0x64,0x83,0x0a,0x0b,0x0c,0x4c,0x3e,0x57,
-0x0e,0x05,0x14,0x1e,0x47,0x15,0x16,0x34,0x3c,0x43,0x27,0x45,0x6c,0x0b,0x1a,0x1d,
-0x08,0x03,0x50,0x08,0x08,0x0e,0x0f,0x11,0x12,0x15,0x14,0x12,0x11,0x0f,0x0e,0x08,
-0x08,0x08,0x08,0x0e,0x0f,0x11,0x12,0x14,0x15,0x12,0x11,0x0f,0x0e,0x08,0x4c,0x0c,
-0x80,0x77,0x46,0x4e,0x64,0x30,0x31,0x31,0x30,0x64,0x4e,0x46,0x79,0x7e,0x0c,0x06,
-0x0e,0x17,0x06,0x44,0x7a,0x49,0x27,0x23,0x07,0x18,0x34,0x23,0x2c,0x16,0x18,0x47,
-0x32,0x24,0x3a,0x07,0x13,0x14,0x15,0x14,0x07,0x3b,0x24,0x32,0x47,0x18,0x16,0x2c,
-0x23,0x34,0x18,0x07,0x23,0x27,0x49,0x7e,0x3f,0x08,0x19,0x09,0x06,0x0f,0x7f,0x79,
-0x46,0x4e,0x64,0x30,0x31,0x31,0x30,0x64,0x4e,0x46,0x79,0x7f,0x0f,0x03,0x03,0x0d,
-0x15,0x08,0x3f,0x7e,0x49,0x27,0x23,0x07,0x18,0x34,0x23,0x2c,0x16,0x18,0x47,0x32,
-0x24,0x3a,0x07,0x14,0x16,0x14,0x13,0x07,0x3a,0x24,0x32,0x47,0x18,0x16,0x2c,0x23,
-0x34,0x18,0x07,0x23,0x27,0x49,0x82,0x3b,0x06,0x19,0x0b,0x03,0x00,0x01,0x00,0xa1,
-0xff,0xe3,0x06,0x13,0x05,0xf0,0x00,0x6a,0x00,0x00,0x01,0x27,0x26,0x07,0x06,0x27,
-0x26,0x27,0x26,0x37,0x36,0x37,0x36,0x17,0x16,0x17,0x16,0x1f,0x01,0x35,0x34,0x27,
-0x26,0x35,0x34,0x37,0x36,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x1d,0x01,0x37,0x36,
-0x37,0x36,0x37,0x36,0x17,0x16,0x17,0x16,0x07,0x06,0x07,0x06,0x27,0x26,0x0f,0x01,
-0x17,0x16,0x37,0x36,0x17,0x16,0x17,0x16,0x07,0x06,0x07,0x06,0x27,0x26,0x27,0x26,
-0x2f,0x01,0x15,0x14,0x17,0x16,0x15,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,
-0x37,0x36,0x3d,0x01,0x07,0x06,0x07,0x06,0x07,0x06,0x27,0x26,0x27,0x26,0x37,0x36,
-0x37,0x36,0x17,0x16,0x37,0x02,0xf5,0x2f,0x31,0xb8,0x6f,0x53,0x5c,0x12,0x1c,0x2a,
-0x2a,0x6e,0x48,0x5c,0x57,0x2b,0x47,0x38,0x30,0x6a,0x40,0x36,0x52,0xa8,0x52,0x36,
-0x40,0x6a,0x30,0x2f,0x50,0x31,0x51,0x5c,0x48,0x6e,0x2a,0x2a,0x1c,0x12,0x5c,0x57,
-0x6b,0xb0,0x39,0x30,0x30,0x30,0xb9,0x6f,0x53,0x5c,0x12,0x1c,0x2a,0x2c,0x6c,0x4c,
-0x58,0x57,0x2b,0x47,0x38,0x30,0x6a,0x40,0x36,0x52,0x54,0x58,0x4e,0x36,0x40,0x6a,
-0x30,0x33,0x4c,0x2f,0x53,0x5c,0x48,0x6e,0x2a,0x2b,0x1d,0x13,0x5b,0x57,0x6b,0xb3,
-0x36,0x02,0xea,0x1b,0x1c,0x10,0x09,0x30,0x35,0x48,0x6f,0x49,0x48,0x20,0x15,0x35,
-0x33,0x63,0xa2,0x21,0x1c,0x37,0x37,0x99,0x5c,0x60,0x6a,0x34,0x4f,0x4f,0x34,0x6a,
-0x66,0x56,0x8f,0x41,0x37,0x1c,0x1c,0xa7,0x67,0x2f,0x35,0x15,0x20,0x48,0x49,0x6f,
-0x48,0x35,0x33,0x0c,0x14,0x20,0x1b,0x1c,0x1c,0x10,0x09,0x30,0x35,0x48,0x6f,0x49,
-0x4c,0x1c,0x14,0x34,0x33,0x63,0xa2,0x21,0x1c,0x37,0x37,0x99,0x5c,0x60,0x6a,0x34,
-0x4f,0x4f,0x37,0x67,0x66,0x56,0x8f,0x41,0x37,0x1c,0x1e,0xa5,0x66,0x30,0x35,0x15,
-0x20,0x48,0x4c,0x6c,0x48,0x35,0x33,0x0c,0x14,0x20,0x00,0x04,0x00,0xa1,0xff,0xe3,
-0x06,0x13,0x05,0xf0,0x00,0x0e,0x00,0x99,0x00,0xb1,0x00,0xc9,0x00,0x00,0x01,0x36,
-0x37,0x36,0x35,0x34,0x27,0x26,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x13,0x17,0x16,
-0x33,0x32,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,
-0x23,0x22,0x27,0x26,0x27,0x26,0x2f,0x01,0x15,0x14,0x17,0x16,0x15,0x14,0x07,0x06,
-0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x3d,0x01,0x07,0x06,0x07,0x06,0x07,0x06,
-0x23,0x22,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x33,0x32,0x17,0x16,
-0x33,0x32,0x3f,0x01,0x27,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x26,
-0x35,0x34,0x37,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x16,0x1f,0x01,0x35,0x34,
-0x27,0x26,0x35,0x34,0x37,0x36,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x1d,0x01,0x37,
-0x36,0x37,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,
-0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x07,0x05,0x06,0x23,0x22,0x27,0x26,0x23,0x22,
-0x07,0x06,0x07,0x06,0x15,0x14,0x17,0x16,0x17,0x16,0x33,0x32,0x37,0x36,0x37,0x36,
-0x25,0x16,0x17,0x16,0x17,0x16,0x33,0x32,0x37,0x36,0x37,0x36,0x35,0x34,0x27,0x26,
-0x27,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x03,0x5a,0x1c,0x38,0x25,0x1e,0x31,0x54,
-0x31,0x1e,0x25,0x38,0xa8,0x12,0x35,0x65,0x20,0x25,0x12,0x10,0x5a,0x46,0x5c,0x12,
-0x0b,0x19,0x2b,0x6d,0x14,0x16,0x38,0x42,0x53,0x2f,0x3f,0x4a,0x12,0x56,0x40,0x36,
-0x52,0x54,0x58,0x4e,0x36,0x40,0x56,0x12,0x47,0x42,0x31,0x51,0x42,0x38,0x16,0x14,
-0x6e,0x2a,0x19,0x0b,0x12,0x5c,0x46,0x5a,0x10,0x12,0x25,0x20,0x65,0x35,0x12,0x12,
-0x33,0x65,0x21,0x26,0x12,0x10,0x5a,0x46,0x5a,0x14,0x0c,0x1a,0x2a,0x6e,0x14,0x16,
-0x38,0x42,0x53,0x2f,0x3f,0x4a,0x12,0x56,0x40,0x36,0x52,0xa8,0x52,0x36,0x40,0x56,
-0x12,0x47,0x42,0x31,0x51,0x42,0x38,0x16,0x14,0x6d,0x2b,0x19,0x0b,0x12,0x5c,0x46,
-0x5a,0x10,0x12,0x26,0x21,0x65,0x33,0xfe,0x98,0x44,0x41,0x1e,0x1d,0x09,0x0a,0x35,
-0x3c,0x3b,0x07,0x05,0x0d,0x15,0x3e,0x0a,0x0c,0x1f,0x2b,0x46,0x19,0x24,0x01,0xdc,
-0x48,0x24,0x19,0x46,0x2b,0x1f,0x0c,0x0a,0x3e,0x15,0x0d,0x05,0x07,0x3b,0x3c,0x35,
-0x0a,0x09,0x1d,0x1e,0x41,0x03,0xd3,0x63,0x4a,0x32,0x51,0x44,0x1a,0x2b,0x2b,0x1a,
-0x44,0x51,0x32,0x4a,0xfe,0xb4,0x0b,0x20,0x03,0x01,0x28,0x35,0x48,0x2c,0x27,0x39,
-0x2c,0x4a,0x1e,0x06,0x26,0x30,0x66,0x89,0x29,0x0a,0x14,0x54,0x7c,0x5c,0x60,0x6a,
-0x34,0x4f,0x4f,0x37,0x67,0x60,0x5c,0x7c,0x54,0x14,0x0a,0x27,0x8b,0x67,0x2f,0x26,
-0x06,0x20,0x48,0x2c,0x39,0x27,0x2c,0x49,0x34,0x28,0x01,0x03,0x20,0x0b,0x0b,0x1f,
-0x03,0x01,0x28,0x33,0x4a,0x2c,0x26,0x39,0x2d,0x48,0x20,0x06,0x26,0x30,0x66,0x89,
-0x29,0x0a,0x14,0x54,0x7c,0x5c,0x60,0x6a,0x34,0x4f,0x4f,0x34,0x6a,0x60,0x5c,0x7c,
-0x54,0x14,0x0a,0x27,0x8b,0x67,0x2f,0x26,0x06,0x1e,0x4a,0x2c,0x39,0x27,0x2c,0x48,
-0x35,0x28,0x01,0x03,0x1f,0x80,0x12,0x04,0x01,0x22,0x22,0x27,0x18,0x15,0x21,0x17,
-0x24,0x15,0x04,0x19,0x28,0x3a,0x55,0x4a,0x4a,0x55,0x3a,0x28,0x19,0x04,0x15,0x24,
-0x17,0x21,0x15,0x18,0x27,0x22,0x22,0x01,0x04,0x00,0x00,0x02,0x00,0x6e,0x00,0x00,
-0x06,0x46,0x05,0xad,0x00,0x1d,0x00,0x8d,0x00,0x00,0x00,0x22,0x07,0x06,0x07,0x06,
-0x07,0x06,0x15,0x14,0x17,0x16,0x17,0x16,0x17,0x16,0x32,0x37,0x36,0x37,0x36,0x37,
-0x36,0x35,0x34,0x27,0x26,0x27,0x26,0x27,0x37,0x36,0x37,0x36,0x33,0x32,0x17,0x16,
-0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x07,0x06,0x23,0x22,0x27,0x16,
-0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x07,0x06,0x23,0x22,0x27,0x26,
-0x27,0x26,0x27,0x26,0x27,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x23,0x22,0x27,0x26,
-0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x37,0x06,0x23,0x22,0x27,0x26,
-0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x37,0x36,0x33,0x32,0x17,0x16,
-0x17,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x37,0x36,0x33,0x32,0x17,0x16,
-0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x03,0xa2,0x90,0x3d,0x3e,0x33,0x34,0x19,
-0x1a,0x1a,0x19,0x34,0x33,0x3e,0x3d,0x90,0x3d,0x3e,0x33,0x34,0x19,0x1a,0x1a,0x19,
-0x34,0x33,0x3e,0x78,0x3e,0x25,0x38,0x35,0x36,0x37,0x30,0x2d,0x29,0x17,0x15,0x15,
-0x13,0x2d,0x25,0x38,0x2f,0x3e,0x1d,0x1b,0x30,0x21,0x2d,0x13,0x15,0x15,0x17,0x29,
-0x2d,0x30,0x32,0x3b,0x3e,0x2f,0x38,0x25,0x30,0x10,0x0d,0x05,0x05,0x0e,0x17,0x29,
-0x2d,0x30,0x32,0x3b,0x3e,0x2f,0x38,0x25,0x2d,0x13,0x15,0x15,0x19,0x27,0x26,0x24,
-0x17,0x19,0x3e,0x2f,0x3a,0x23,0x2d,0x13,0x15,0x15,0x17,0x29,0x2d,0x30,0x32,0x3b,
-0x3e,0x2f,0x3b,0x29,0x08,0x06,0x15,0x15,0x17,0x29,0x2d,0x30,0x32,0x3b,0x3e,0x2f,
-0x38,0x25,0x2d,0x13,0x15,0x15,0x06,0x04,0x0b,0x1a,0x1c,0x30,0x36,0x3c,0x3f,0x49,
-0x46,0x3f,0x3c,0x36,0x30,0x1c,0x1a,0x1a,0x1c,0x30,0x36,0x3c,0x3f,0x46,0x49,0x3f,
-0x3c,0x36,0x30,0x1c,0x13,0x35,0x10,0x17,0x17,0x14,0x2b,0x27,0x36,0x31,0x3e,0x3a,
-0x34,0x2f,0x2e,0x26,0x19,0x15,0x05,0x17,0x22,0x2e,0x2f,0x34,0x3b,0x3d,0x31,0x36,
-0x27,0x2b,0x14,0x15,0x15,0x19,0x26,0x31,0x2c,0x22,0x25,0x26,0x21,0x36,0x27,0x2b,
-0x14,0x15,0x15,0x19,0x26,0x2e,0x2f,0x34,0x3a,0x3e,0x31,0x3a,0x23,0x22,0x15,0x04,
-0x15,0x1b,0x24,0x2e,0x2f,0x34,0x3a,0x3e,0x31,0x36,0x27,0x2b,0x14,0x15,0x15,0x19,
-0x2c,0x0e,0x0e,0x34,0x3a,0x3e,0x31,0x36,0x27,0x2b,0x14,0x15,0x15,0x19,0x26,0x2e,
-0x2f,0x34,0x3b,0x3d,0x31,0x0e,0x00,0x06,0x00,0x6e,0x00,0x00,0x06,0x46,0x05,0xad,
-0x00,0x6e,0x00,0x8a,0x00,0xa3,0x00,0xbf,0x00,0xd8,0x00,0xf4,0x00,0x00,0x25,0x06,
-0x07,0x06,0x07,0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x26,0x27,0x26,0x35,0x34,
-0x37,0x36,0x37,0x36,0x37,0x06,0x23,0x22,0x27,0x26,0x27,0x26,0x27,0x26,0x35,0x34,
-0x37,0x36,0x37,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x26,0x27,0x26,0x35,0x34,
-0x37,0x36,0x37,0x36,0x37,0x36,0x32,0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,
-0x06,0x07,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,
-0x06,0x07,0x06,0x07,0x06,0x23,0x22,0x27,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,
-0x06,0x07,0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x26,0x27,0x26,0x02,0x32,0x17,
-0x16,0x17,0x37,0x36,0x35,0x34,0x27,0x26,0x27,0x26,0x27,0x26,0x22,0x07,0x06,0x07,
-0x06,0x07,0x06,0x15,0x14,0x1f,0x01,0x36,0x37,0x13,0x26,0x27,0x26,0x27,0x26,0x27,
-0x07,0x06,0x07,0x06,0x15,0x14,0x17,0x16,0x17,0x16,0x17,0x16,0x32,0x37,0x36,0x37,
-0x36,0x37,0x03,0x26,0x35,0x34,0x37,0x36,0x37,0x27,0x26,0x27,0x26,0x23,0x22,0x07,
-0x06,0x07,0x06,0x07,0x06,0x15,0x14,0x17,0x16,0x17,0x16,0x17,0x16,0x17,0x01,0x17,
-0x16,0x17,0x16,0x17,0x16,0x32,0x37,0x36,0x37,0x36,0x37,0x36,0x35,0x34,0x27,0x26,
-0x2f,0x01,0x06,0x07,0x06,0x07,0x06,0x13,0x37,0x36,0x37,0x36,0x37,0x36,0x37,0x36,
-0x35,0x34,0x27,0x26,0x27,0x26,0x27,0x26,0x23,0x22,0x07,0x06,0x0f,0x01,0x16,0x17,
-0x16,0x15,0x14,0x03,0x5a,0x05,0x0d,0x10,0x30,0x25,0x38,0x2f,0x3e,0x3b,0x32,0x30,
-0x2d,0x29,0x17,0x15,0x15,0x13,0x2d,0x21,0x30,0x1b,0x1d,0x3e,0x2f,0x38,0x25,0x2d,
-0x13,0x15,0x15,0x17,0x29,0x30,0x2d,0x3c,0x31,0x3a,0x33,0x25,0x3e,0x07,0x06,0x15,
-0x15,0x13,0x2d,0x25,0x38,0x2f,0x7c,0x2f,0x38,0x25,0x2d,0x13,0x15,0x15,0x06,0x07,
-0x3e,0x25,0x38,0x35,0x36,0x37,0x30,0x2d,0x29,0x17,0x15,0x15,0x13,0x2d,0x25,0x38,
-0x2f,0x3e,0x1d,0x1b,0x30,0x21,0x2d,0x13,0x15,0x15,0x17,0x29,0x2d,0x30,0x32,0x3b,
-0x3e,0x2f,0x38,0x25,0x30,0x10,0x0d,0x4d,0x90,0x3d,0x08,0x07,0x12,0x09,0x0d,0x0c,
-0x1b,0x19,0x20,0x1e,0x48,0x1e,0x20,0x19,0x1b,0x0c,0x0d,0x09,0x12,0x07,0x08,0x43,
-0x23,0x20,0x42,0x2f,0x1e,0x1b,0x67,0x18,0x0f,0x0d,0x0d,0x0c,0x1b,0x19,0x20,0x1e,
-0x48,0x1e,0x20,0x19,0x18,0x0f,0xe1,0x03,0x1a,0x15,0x2a,0x78,0x08,0x07,0x23,0x1f,
-0x24,0x1e,0x20,0x19,0x18,0x0f,0x0d,0x0d,0x0c,0x1b,0x19,0x20,0x15,0x0f,0x02,0x2d,
-0x37,0x0f,0x18,0x19,0x20,0x1e,0x48,0x1e,0x20,0x19,0x1b,0x0c,0x0d,0x0d,0x0f,0x18,
-0x67,0x1b,0x1e,0x2f,0x42,0x20,0xf5,0x91,0x0f,0x15,0x20,0x19,0x1b,0x0c,0x0d,0x0d,
-0x0f,0x18,0x19,0x20,0x1e,0x24,0x1f,0x23,0x07,0x08,0x78,0x2a,0x15,0x1a,0xf8,0x25,
-0x22,0x2c,0x31,0x26,0x19,0x15,0x15,0x14,0x2b,0x27,0x36,0x31,0x3d,0x3b,0x34,0x2f,
-0x2e,0x22,0x17,0x05,0x15,0x19,0x26,0x2e,0x2f,0x34,0x3a,0x3e,0x31,0x36,0x27,0x2e,
-0x11,0x17,0x17,0x10,0x35,0x0d,0x0e,0x31,0x3d,0x3b,0x34,0x2f,0x2e,0x26,0x19,0x15,
-0x15,0x19,0x26,0x2e,0x2f,0x34,0x3b,0x3d,0x31,0x0e,0x0d,0x35,0x10,0x17,0x17,0x14,
-0x2b,0x27,0x36,0x31,0x3e,0x3a,0x34,0x2f,0x2e,0x26,0x19,0x15,0x05,0x17,0x22,0x2e,
-0x2f,0x34,0x3b,0x3d,0x31,0x36,0x27,0x2b,0x14,0x15,0x15,0x19,0x26,0x31,0x2c,0x22,
-0x03,0x38,0x1a,0x03,0x04,0x5f,0x2f,0x14,0x24,0x20,0x1e,0x1b,0x18,0x0e,0x0d,0x0d,
-0x0e,0x18,0x1b,0x1e,0x20,0x24,0x14,0x2f,0x5f,0x04,0x03,0xfd,0x63,0x06,0x0e,0x1e,
-0x2e,0x1e,0x2c,0x62,0x17,0x22,0x20,0x24,0x23,0x20,0x1e,0x1b,0x18,0x0e,0x0d,0x0d,
-0x0e,0x18,0x18,0x21,0x01,0xa2,0x16,0x17,0x49,0x3f,0x33,0x30,0x43,0x04,0x03,0x0d,
-0x0d,0x0e,0x18,0x18,0x21,0x1d,0x27,0x23,0x20,0x1e,0x1b,0x18,0x0e,0x09,0x02,0xfe,
-0xc4,0x78,0x21,0x18,0x18,0x0e,0x0d,0x0d,0x0e,0x18,0x1b,0x1e,0x20,0x23,0x24,0x20,
-0x22,0x17,0x62,0x2c,0x1e,0x2e,0x1e,0x0e,0x01,0x24,0x12,0x02,0x09,0x0e,0x18,0x1b,
-0x1e,0x20,0x23,0x27,0x1d,0x21,0x18,0x18,0x0e,0x0d,0x0d,0x03,0x04,0x43,0x30,0x33,
-0x3f,0x49,0x17,0x00,0x00,0x0a,0x00,0x54,0xff,0xe3,0x06,0x60,0x05,0xf0,0x00,0x2d,
-0x00,0x5b,0x00,0xd5,0x01,0x04,0x01,0x33,0x01,0x62,0x01,0x91,0x01,0xaf,0x01,0xdd,
-0x02,0x0b,0x00,0x00,0x01,0x26,0x27,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x26,0x27,
-0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x37,0x36,0x33,0x32,0x1f,0x01,0x36,0x37,0x27,
-0x26,0x23,0x22,0x06,0x07,0x06,0x07,0x06,0x14,0x17,0x16,0x17,0x16,0x17,0x16,0x33,
-0x32,0x37,0x25,0x06,0x07,0x17,0x16,0x33,0x32,0x37,0x36,0x37,0x36,0x37,0x36,0x34,
-0x27,0x26,0x27,0x2e,0x01,0x23,0x22,0x0f,0x01,0x16,0x17,0x37,0x36,0x33,0x32,0x17,
-0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x07,0x06,0x23,0x22,0x27,
-0x01,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x37,0x36,0x33,0x32,0x17,0x16,
-0x17,0x34,0x36,0x37,0x36,0x37,0x36,0x32,0x17,0x16,0x17,0x1e,0x01,0x15,0x36,0x37,
-0x36,0x33,0x32,0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x32,0x17,
-0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x07,0x06,0x23,0x16,0x17,
-0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x14,0x06,
-0x07,0x06,0x07,0x06,0x22,0x27,0x26,0x27,0x2e,0x01,0x35,0x06,0x07,0x06,0x23,0x22,
-0x27,0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x22,0x27,0x26,0x27,0x26,
-0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x37,0x36,0x01,0x26,0x27,0x07,0x06,0x07,
-0x06,0x07,0x06,0x07,0x26,0x27,0x26,0x27,0x26,0x27,0x26,0x27,0x36,0x37,0x36,0x37,
-0x36,0x3f,0x01,0x26,0x27,0x07,0x06,0x07,0x06,0x07,0x06,0x15,0x16,0x17,0x16,0x17,
-0x1e,0x01,0x33,0x32,0x37,0x36,0x37,0x36,0x37,0x01,0x16,0x17,0x37,0x36,0x37,0x36,
-0x37,0x36,0x35,0x26,0x27,0x26,0x27,0x2e,0x01,0x23,0x22,0x07,0x06,0x07,0x06,0x0f,
-0x01,0x16,0x17,0x37,0x36,0x37,0x36,0x37,0x36,0x37,0x16,0x17,0x16,0x17,0x16,0x17,
-0x16,0x17,0x06,0x07,0x06,0x07,0x06,0x07,0x03,0x06,0x07,0x17,0x16,0x17,0x16,0x17,
-0x16,0x17,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x26,0x27,0x26,0x27,0x26,0x2f,
-0x01,0x06,0x07,0x17,0x16,0x17,0x16,0x17,0x16,0x33,0x32,0x36,0x37,0x36,0x37,0x36,
-0x37,0x34,0x27,0x26,0x27,0x26,0x27,0x01,0x36,0x37,0x27,0x26,0x27,0x26,0x27,0x26,
-0x23,0x22,0x06,0x07,0x06,0x07,0x06,0x07,0x14,0x17,0x16,0x17,0x16,0x1f,0x01,0x36,
-0x37,0x27,0x26,0x27,0x26,0x27,0x26,0x27,0x36,0x37,0x36,0x37,0x36,0x37,0x36,0x37,
-0x16,0x17,0x16,0x17,0x16,0x17,0x04,0x22,0x07,0x06,0x07,0x06,0x07,0x06,0x15,0x14,
-0x17,0x16,0x17,0x16,0x17,0x16,0x32,0x37,0x36,0x37,0x36,0x37,0x36,0x35,0x34,0x27,
-0x26,0x27,0x26,0x27,0x13,0x06,0x07,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x07,
-0x06,0x22,0x27,0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x3f,0x01,0x26,0x27,0x07,0x06,
-0x15,0x14,0x17,0x16,0x17,0x16,0x17,0x16,0x32,0x37,0x36,0x37,0x36,0x37,0x36,0x35,
-0x34,0x27,0x03,0x16,0x17,0x37,0x36,0x35,0x34,0x27,0x26,0x27,0x26,0x27,0x26,0x22,
-0x07,0x06,0x07,0x06,0x07,0x06,0x15,0x14,0x1f,0x01,0x36,0x37,0x27,0x26,0x35,0x34,
-0x37,0x36,0x37,0x36,0x37,0x36,0x32,0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,
-0x02,0x3a,0x06,0x02,0xe4,0x11,0x09,0x0a,0x0e,0x0c,0x0a,0x08,0x06,0x04,0x04,0x06,
-0x08,0x0a,0x0c,0x0c,0x0c,0x09,0x11,0xe4,0x02,0x06,0xce,0x24,0x14,0x1c,0x34,0x16,
-0x14,0x0c,0x0a,0x0a,0x0c,0x14,0x16,0x1a,0x1a,0x1c,0x14,0x24,0x03,0x1a,0x02,0x06,
-0xca,0x24,0x12,0x1e,0x1a,0x1a,0x16,0x14,0x0c,0x0a,0x0a,0x0c,0x14,0x16,0x34,0x1e,
-0x12,0x24,0xca,0x06,0x02,0xe0,0x11,0x07,0x10,0x0a,0x0c,0x0a,0x08,0x06,0x04,0x04,
-0x06,0x08,0x0c,0x0a,0x0e,0x0c,0x07,0x11,0xfb,0xd6,0x25,0x11,0x11,0x11,0x10,0x20,
-0x21,0x28,0x29,0x2d,0x2b,0x2c,0x29,0x24,0x22,0x21,0x20,0x28,0x28,0x5c,0x28,0x28,
-0x20,0x21,0x22,0x26,0x27,0x2c,0x2b,0x2d,0x29,0x28,0x21,0x1c,0x14,0x11,0x11,0x0f,
-0x27,0x37,0x27,0x26,0x22,0x23,0x0f,0x10,0x10,0x12,0x20,0x1c,0x2c,0x2a,0x32,0x25,
-0x0f,0x11,0x11,0x10,0x20,0x21,0x28,0x29,0x2d,0x2e,0x29,0x29,0x24,0x22,0x21,0x20,
-0x28,0x28,0x5c,0x28,0x28,0x20,0x21,0x22,0x28,0x25,0x2a,0x2d,0x2c,0x2a,0x28,0x21,
-0x20,0x10,0x11,0x11,0x11,0x23,0x32,0x2a,0x26,0x22,0x23,0x0f,0x10,0x10,0x12,0x20,
-0x22,0x26,0x27,0x01,0xc1,0x14,0x10,0x8e,0x0b,0x06,0x07,0x0d,0x0c,0x0e,0x0d,0x0b,
-0x0c,0x0a,0x09,0x05,0x04,0x01,0x01,0x05,0x04,0x09,0x06,0x0e,0xb4,0x0e,0x0b,0xb8,
-0x21,0x0e,0x15,0x0a,0x0b,0x01,0x0a,0x0a,0x15,0x15,0x34,0x1d,0x20,0x18,0x1a,0x15,
-0x0e,0x13,0x01,0xeb,0x0f,0x0a,0xb5,0x21,0x0d,0x16,0x0a,0x0b,0x01,0x0a,0x0a,0x15,
-0x15,0x34,0x1d,0x20,0x18,0x1a,0x16,0x0d,0x13,0x67,0x14,0x11,0x8b,0x0b,0x05,0x0a,
-0x0b,0x0c,0x0e,0x0d,0x0b,0x0c,0x0a,0x09,0x05,0x04,0x01,0x01,0x05,0x06,0x08,0x05,
-0x0e,0x9b,0x0b,0x0e,0xb4,0x0e,0x06,0x07,0x06,0x05,0x01,0x01,0x04,0x05,0x09,0x0a,
-0x0c,0x0b,0x0d,0x0e,0x0c,0x0b,0x09,0x06,0x0b,0x8e,0x11,0x13,0x69,0x13,0x0e,0x15,
-0x1a,0x18,0x20,0x1d,0x34,0x15,0x15,0x0a,0x0a,0x01,0x0b,0x0a,0x15,0x0e,0x21,0xfd,
-0x89,0x12,0x13,0x67,0x13,0x0d,0x16,0x1a,0x18,0x20,0x1d,0x34,0x15,0x15,0x0a,0x0a,
-0x01,0x0b,0x0a,0x16,0x0d,0x21,0xb5,0x0b,0x0e,0xb1,0x0e,0x05,0x0a,0x04,0x05,0x01,
-0x01,0x04,0x05,0x09,0x0a,0x0c,0x0b,0x0d,0x11,0x09,0x0d,0x08,0x05,0x0b,0x01,0x6f,
-0x52,0x23,0x24,0x1d,0x1d,0x0f,0x0f,0x0f,0x0f,0x1d,0x1d,0x24,0x23,0x52,0x23,0x24,
-0x1d,0x1d,0x0f,0x0f,0x0f,0x0f,0x1d,0x1d,0x24,0x03,0x16,0x15,0x1b,0x02,0x05,0x05,
-0x09,0x0a,0x0b,0x0c,0x1a,0x0c,0x0b,0x0a,0x09,0x05,0x05,0x02,0x1b,0x16,0x15,0x38,
-0x0a,0x0b,0x0a,0x16,0x15,0x1a,0x19,0x3c,0x19,0x1a,0x15,0x16,0x0a,0x0b,0x0a,0x63,
-0x17,0x15,0x37,0x0a,0x0b,0x0a,0x16,0x15,0x1a,0x19,0x3c,0x19,0x1a,0x15,0x16,0x0a,
-0x0b,0x0a,0x37,0x16,0x16,0x1b,0x02,0x05,0x05,0x09,0x0a,0x0b,0x0c,0x1a,0x0c,0x0b,
-0x0a,0x0b,0x03,0x05,0x02,0x02,0x9a,0x16,0x16,0x1c,0x02,0x06,0x04,0x0a,0x0a,0x0a,
-0x0c,0x0e,0x0c,0x0c,0x0c,0x0a,0x08,0x06,0x04,0x02,0x1a,0x16,0x14,0x38,0x0a,0x14,
-0x16,0x16,0x1a,0x18,0x3c,0x1a,0x1a,0x14,0x16,0x0a,0x0c,0x0a,0x64,0x18,0x14,0x38,
-0x0a,0x0c,0x0a,0x16,0x14,0x1a,0x1a,0x3c,0x18,0x1a,0x16,0x16,0x14,0x0a,0x36,0x17,
-0x15,0x1a,0x02,0x04,0x06,0x08,0x0a,0x0c,0x0c,0x0c,0x0e,0x0c,0x0a,0x0a,0x0c,0x02,
-0x06,0x02,0x01,0x20,0x25,0x29,0x2c,0x2b,0x2b,0x2a,0x29,0x20,0x21,0x10,0x10,0x10,
-0x11,0x24,0x33,0x52,0x20,0x1f,0x12,0x11,0x11,0x12,0x1f,0x20,0x52,0x33,0x26,0x0f,
-0x10,0x10,0x10,0x21,0x1c,0x2d,0x28,0x2d,0x25,0x32,0x28,0x26,0x10,0x10,0x22,0x23,
-0x25,0x28,0x2e,0x32,0x24,0x28,0x20,0x1e,0x14,0x12,0x26,0x27,0x2c,0x2b,0x2c,0x29,
-0x29,0x20,0x21,0x10,0x10,0x10,0x11,0x24,0x33,0x52,0x20,0x1f,0x12,0x11,0x11,0x12,
-0x1f,0x20,0x52,0x33,0x27,0x0e,0x10,0x10,0x10,0x21,0x20,0x29,0x29,0x2c,0x2c,0x2b,
-0x29,0x24,0x12,0x10,0x22,0x23,0x25,0x28,0x2e,0x32,0x24,0x28,0x20,0x22,0x10,0x10,
-0xfe,0x1c,0x0b,0x0d,0xb4,0x0d,0x06,0x08,0x05,0x05,0x01,0x01,0x04,0x05,0x09,0x09,
-0x0c,0x0c,0x0d,0x0d,0x0c,0x0c,0x09,0x06,0x0a,0x8e,0x11,0x13,0x69,0x13,0x0e,0x14,
-0x1a,0x19,0x1f,0x1d,0x1b,0x19,0x16,0x15,0x14,0x0a,0x0b,0x14,0x0e,0x21,0x02,0x78,
-0x12,0x13,0x67,0x13,0x0d,0x15,0x1a,0x19,0x1f,0x1d,0x1b,0x19,0x16,0x15,0x14,0x0a,
-0x0b,0x15,0x0d,0x21,0xb5,0x0c,0x0e,0xb2,0x0d,0x05,0x0b,0x03,0x05,0x01,0x01,0x04,
-0x05,0x09,0x09,0x0c,0x0c,0x0d,0x10,0x09,0x0d,0x09,0x05,0x0a,0xfe,0x25,0x13,0x11,
-0x8e,0x0a,0x06,0x08,0x0d,0x0c,0x0d,0x0d,0x0c,0x0c,0x09,0x09,0x05,0x04,0x01,0x01,
-0x05,0x04,0x09,0x06,0x0d,0xb4,0x0e,0x0a,0xb9,0x21,0x0e,0x14,0x0b,0x0a,0x14,0x15,
-0x16,0x19,0x1b,0x1d,0x1f,0x19,0x1a,0x14,0x0e,0x13,0x01,0xeb,0x0f,0x0b,0xb5,0x21,
-0x0d,0x15,0x0b,0x0a,0x14,0x15,0x16,0x19,0x1b,0x1d,0x1f,0x19,0x1a,0x15,0x0d,0x13,
-0x67,0x13,0x12,0x8b,0x0a,0x05,0x0b,0x0b,0x0c,0x0d,0x0d,0x0c,0x0c,0x09,0x09,0x05,
-0x04,0x01,0x01,0x05,0x05,0x09,0x05,0x0d,0xd5,0x0f,0x10,0x1c,0x1f,0x22,0x24,0x29,
-0x28,0x24,0x23,0x1e,0x1c,0x10,0x0f,0x0f,0x10,0x1c,0x1e,0x23,0x24,0x28,0x29,0x24,
-0x22,0x1f,0x1c,0x10,0xfe,0x24,0x06,0x02,0xe4,0x11,0x08,0x0b,0x0d,0x0c,0x0a,0x09,
-0x05,0x05,0x05,0x05,0x09,0x0a,0x0c,0x0b,0x0d,0x08,0x11,0xe4,0x02,0x06,0xcd,0x25,
-0x13,0x1d,0x1a,0x19,0x16,0x14,0x0c,0x0b,0x0b,0x0c,0x14,0x16,0x19,0x1a,0x1d,0x13,
-0x25,0x03,0x1a,0x02,0x06,0xc9,0x25,0x12,0x1e,0x1a,0x19,0x16,0x14,0x0c,0x0b,0x0b,
-0x0c,0x14,0x16,0x19,0x1a,0x1e,0x12,0x25,0xc9,0x06,0x02,0xe0,0x11,0x07,0x0f,0x0a,
-0x0c,0x0a,0x09,0x05,0x05,0x05,0x05,0x09,0x0c,0x0a,0x0d,0x0c,0x07,0x11,0x00,0x04,
-0x00,0x56,0xff,0xe3,0x06,0x5e,0x05,0xf0,0x00,0x1d,0x00,0x3c,0x00,0x5c,0x00,0x6c,
-0x00,0x00,0x00,0x22,0x07,0x06,0x07,0x06,0x07,0x06,0x15,0x14,0x17,0x16,0x17,0x16,
-0x17,0x16,0x32,0x37,0x36,0x37,0x36,0x37,0x36,0x35,0x34,0x27,0x26,0x27,0x26,0x2f,
-0x01,0x32,0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x07,0x06,
-0x23,0x22,0x27,0x26,0x27,0x26,0x27,0x26,0x34,0x37,0x36,0x37,0x36,0x37,0x36,0x13,
-0x32,0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x07,0x06,0x23,
-0x22,0x27,0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x37,0x36,0x17,
-0x03,0x25,0x13,0x0d,0x01,0x03,0x25,0x1b,0x01,0x05,0x03,0x2d,0x01,0x13,0x05,0x03,
-0x97,0x7a,0x33,0x35,0x2b,0x2b,0x16,0x15,0x15,0x16,0x2b,0x2b,0x35,0x33,0x7a,0x33,
-0x35,0x2b,0x2b,0x16,0x15,0x15,0x16,0x2b,0x2b,0x35,0x70,0x57,0x44,0x4d,0x36,0x39,
-0x20,0x1f,0x1f,0x1e,0x3b,0x39,0x4a,0x48,0x53,0x57,0x44,0x4d,0x36,0x39,0x20,0x1f,
-0x1f,0x1e,0x3b,0x39,0x4a,0x48,0x53,0x9a,0x8e,0x86,0x73,0x70,0x3a,0x39,0x39,0x35,
-0x75,0x6e,0x8b,0x8d,0x9b,0x9a,0x8e,0x86,0x73,0x70,0x3a,0x39,0x39,0x35,0x75,0x6c,
-0x8d,0x8c,0x9c,0x9d,0xfe,0x7f,0xa3,0xfe,0x7d,0x01,0x83,0xa3,0x01,0x81,0x9d,0x9d,
-0x01,0x81,0xa3,0x01,0x83,0xfe,0x7d,0xa3,0xfe,0x7f,0x04,0x13,0x16,0x18,0x28,0x2e,
-0x33,0x35,0x3c,0x3b,0x35,0x33,0x2e,0x28,0x18,0x16,0x16,0x18,0x28,0x2e,0x33,0x35,
-0x3b,0x3c,0x35,0x33,0x2e,0x28,0x18,0x86,0x1f,0x22,0x36,0x38,0x4d,0x49,0x54,0x4e,
-0x4c,0x4a,0x3b,0x39,0x1f,0x1f,0x1f,0x22,0x36,0x38,0x4d,0x49,0xa2,0x4c,0x4a,0x3b,
-0x39,0x1f,0x1f,0x01,0x6d,0x3b,0x38,0x72,0x6f,0x8b,0x89,0xa1,0x98,0x8d,0x83,0x77,
-0x70,0x3a,0x3b,0x3b,0x38,0x72,0x6f,0x8b,0x89,0x9c,0x9d,0x8d,0x83,0x77,0x6e,0x3c,
-0x3b,0x08,0xfe,0x7d,0xa3,0xfe,0x7f,0x9e,0x9d,0xfe,0x7f,0xa3,0xfe,0x7d,0x01,0x83,
-0xa3,0x01,0x81,0x9d,0x9e,0x01,0x81,0xa3,0x00,0x07,0x00,0xa1,0xff,0xe3,0x06,0x13,
-0x05,0xf0,0x00,0x08,0x00,0x93,0x00,0x9c,0x00,0xa7,0x00,0xb2,0x00,0xc1,0x00,0xd0,
-0x00,0x00,0x01,0x11,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x13,0x17,0x16,0x33,0x32,
-0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x23,0x22,
-0x27,0x26,0x27,0x26,0x2f,0x01,0x15,0x14,0x17,0x16,0x15,0x14,0x07,0x06,0x23,0x22,
-0x27,0x26,0x35,0x34,0x37,0x36,0x3d,0x01,0x07,0x06,0x07,0x06,0x07,0x06,0x23,0x22,
-0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x33,0x32,
-0x3f,0x01,0x27,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x26,0x35,0x34,
-0x37,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x16,0x1f,0x01,0x35,0x34,0x27,0x26,
-0x35,0x34,0x37,0x36,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x1d,0x01,0x37,0x36,0x37,
-0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x23,
-0x22,0x27,0x26,0x23,0x22,0x0f,0x01,0x11,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x13,
-0x25,0x26,0x27,0x26,0x23,0x22,0x07,0x06,0x07,0x06,0x01,0x05,0x16,0x17,0x16,0x33,
-0x32,0x37,0x36,0x37,0x36,0x13,0x25,0x06,0x15,0x14,0x17,0x16,0x17,0x16,0x33,0x32,
-0x37,0x36,0x33,0x32,0x0d,0x01,0x36,0x35,0x34,0x27,0x26,0x27,0x26,0x23,0x22,0x07,
-0x06,0x23,0x22,0x03,0x5a,0x2a,0x31,0x1e,0x25,0x38,0xa8,0x12,0x35,0x65,0x20,0x25,
-0x12,0x10,0x5a,0x46,0x5c,0x12,0x0b,0x19,0x2b,0x6d,0x14,0x16,0x38,0x42,0x53,0x2f,
-0x3f,0x4a,0x12,0x56,0x40,0x36,0x52,0x54,0x58,0x4e,0x36,0x40,0x56,0x12,0x47,0x42,
-0x31,0x51,0x42,0x38,0x16,0x14,0x6e,0x2a,0x19,0x0b,0x12,0x5c,0x46,0x5a,0x10,0x12,
-0x25,0x20,0x65,0x35,0x12,0x12,0x33,0x65,0x21,0x26,0x12,0x10,0x5a,0x46,0x5a,0x14,
-0x0c,0x1a,0x2a,0x6e,0x14,0x16,0x38,0x42,0x53,0x2f,0x3f,0x4a,0x12,0x56,0x40,0x36,
-0x52,0xa8,0x52,0x36,0x40,0x56,0x12,0x47,0x42,0x31,0x51,0x42,0x38,0x16,0x14,0x6d,
-0x2b,0x19,0x0b,0x12,0x5c,0x46,0x5a,0x10,0x12,0x26,0x21,0x65,0x33,0x9e,0x2a,0x31,
-0x1e,0x25,0x38,0xae,0x01,0x7e,0x15,0x3e,0x0a,0x0c,0x1f,0x2b,0x46,0x19,0x24,0xfe,
-0x24,0xfe,0x82,0x15,0x3e,0x0a,0x0c,0x1f,0x2b,0x46,0x19,0x24,0x48,0xfe,0x82,0x0d,
-0x05,0x07,0x3b,0x3c,0x35,0x0a,0x09,0x1d,0x1e,0x41,0x01,0xd8,0x01,0x7e,0x0d,0x05,
-0x07,0x3b,0x3c,0x35,0x0a,0x09,0x1d,0x1e,0x41,0x03,0xd3,0x01,0xb9,0x2b,0x1a,0x44,
-0x51,0x32,0x4a,0xfe,0xb4,0x0b,0x20,0x03,0x01,0x28,0x35,0x48,0x2c,0x27,0x39,0x2c,
-0x4a,0x1e,0x06,0x26,0x30,0x66,0x89,0x29,0x0a,0x14,0x54,0x7c,0x5c,0x60,0x6a,0x34,
-0x4f,0x4f,0x37,0x67,0x60,0x5c,0x7c,0x54,0x14,0x0a,0x27,0x8b,0x67,0x2f,0x26,0x06,
-0x20,0x48,0x2c,0x39,0x27,0x2c,0x49,0x34,0x28,0x01,0x03,0x20,0x0b,0x0b,0x1f,0x03,
-0x01,0x28,0x33,0x4a,0x2c,0x26,0x39,0x2d,0x48,0x20,0x06,0x26,0x30,0x66,0x89,0x29,
-0x0a,0x14,0x54,0x7c,0x5c,0x60,0x6a,0x34,0x4f,0x4f,0x34,0x6a,0x60,0x5c,0x7c,0x54,
-0x14,0x0a,0x27,0x8b,0x67,0x2f,0x26,0x06,0x1e,0x4a,0x2c,0x39,0x27,0x2c,0x48,0x35,
-0x28,0x01,0x03,0x1f,0xf5,0xfe,0x47,0x2b,0x1a,0x44,0x51,0x32,0x4a,0x01,0xc1,0xdd,
-0x24,0x15,0x04,0x19,0x28,0x3a,0x55,0xfe,0xcd,0xdd,0x24,0x15,0x04,0x19,0x28,0x3a,
-0x55,0x01,0x33,0xdd,0x17,0x21,0x15,0x18,0x27,0x22,0x22,0x01,0x04,0xfb,0xdd,0x17,
-0x21,0x15,0x18,0x27,0x22,0x22,0x01,0x04,0x00,0x01,0x00,0xb6,0x00,0x00,0x05,0xfe,
-0x05,0xd5,0x00,0x41,0x00,0x00,0x01,0x27,0x07,0x27,0x37,0x27,0x37,0x17,0x35,0x33,
-0x15,0x17,0x11,0x27,0x37,0x17,0x35,0x33,0x15,0x37,0x17,0x07,0x11,0x37,0x35,0x33,
-0x15,0x37,0x17,0x07,0x17,0x07,0x27,0x07,0x17,0x37,0x17,0x07,0x17,0x07,0x27,0x15,
-0x23,0x35,0x27,0x11,0x17,0x07,0x27,0x15,0x23,0x35,0x07,0x27,0x37,0x11,0x07,0x15,
-0x23,0x35,0x07,0x27,0x37,0x27,0x37,0x17,0x02,0xe2,0xf0,0xc2,0x3c,0x86,0xc4,0x3c,
-0xc4,0x78,0xf0,0xc2,0x3c,0x86,0x78,0x86,0x3c,0xc2,0xf0,0x78,0xc4,0x3c,0xc4,0x86,
-0x3c,0xc2,0xf0,0xf0,0xc2,0x3c,0x86,0xc4,0x3c,0xc4,0x78,0xf0,0xc2,0x3c,0x86,0x78,
-0x86,0x3c,0xc2,0xf0,0x78,0xc4,0x3c,0xc4,0x86,0x3c,0xc2,0x02,0xeb,0x8a,0x70,0x68,
-0x4d,0x72,0x68,0x72,0x9b,0xe0,0x8b,0x01,0x16,0x6f,0x68,0x4d,0xe3,0xe3,0x4d,0x68,
-0x6f,0xfe,0xeb,0x8a,0xe0,0x9b,0x72,0x68,0x72,0x4d,0x68,0x70,0x8a,0x8b,0x70,0x68,
-0x4d,0x72,0x68,0x72,0x9b,0xe0,0x8b,0xfe,0xea,0x6f,0x68,0x4d,0xe3,0xe3,0x4d,0x68,
-0x6f,0x01,0x16,0x8b,0xe0,0x9b,0x72,0x68,0x72,0x4d,0x68,0x70,0x00,0x07,0x00,0x9c,
-0x00,0x00,0x06,0x18,0x05,0xd5,0x00,0x1d,0x00,0x21,0x00,0x25,0x00,0x29,0x00,0x2d,
-0x00,0x31,0x00,0x35,0x00,0x00,0x01,0x33,0x11,0x25,0x11,0x25,0x17,0x0d,0x03,0x07,
-0x25,0x11,0x25,0x11,0x23,0x11,0x05,0x11,0x05,0x27,0x2d,0x03,0x37,0x05,0x11,0x05,
-0x07,0x15,0x17,0x35,0x25,0x07,0x15,0x37,0x05,0x07,0x17,0x37,0x25,0x07,0x17,0x37,
-0x05,0x07,0x15,0x3f,0x01,0x15,0x17,0x35,0x03,0x1e,0x78,0x01,0x23,0x01,0x09,0x3c,
-0xfe,0xf6,0x01,0x24,0xfe,0xdd,0x01,0x09,0x3c,0xfe,0xf7,0xfe,0xdd,0x78,0xfe,0xdd,
-0xfe,0xf7,0x3c,0x01,0x09,0xfe,0xdd,0x01,0x24,0xfe,0xf6,0x3c,0x01,0x09,0x01,0x23,
-0xab,0xab,0x01,0x23,0xab,0xab,0xfd,0xf7,0xac,0xab,0xab,0x01,0x9a,0xaa,0xab,0xab,
-0xfd,0xf6,0xab,0xab,0x78,0xab,0x05,0xd5,0xfe,0xcc,0xa9,0xfe,0xb0,0x9a,0x68,0x9a,
-0xa8,0xa8,0x99,0x68,0x9a,0xfe,0xaf,0xa9,0xfe,0xcd,0x01,0x33,0xa9,0x01,0x51,0x9a,
-0x68,0x99,0xa8,0xa8,0x9a,0x68,0x9a,0x01,0x50,0xa9,0x27,0xc5,0x63,0xc5,0x63,0x63,
-0xc5,0x63,0x68,0x63,0x62,0x62,0x63,0x63,0x62,0x62,0x67,0x63,0xc6,0x63,0xc6,0xc6,
-0x63,0xc6,0x00,0x01,0x00,0x82,0x00,0x04,0x06,0x30,0x05,0xd5,0x00,0x41,0x00,0x00,
-0x01,0x33,0x15,0x37,0x17,0x07,0x11,0x25,0x11,0x33,0x15,0x37,0x17,0x07,0x17,0x07,
-0x27,0x0d,0x01,0x37,0x17,0x07,0x17,0x07,0x27,0x15,0x23,0x11,0x25,0x11,0x17,0x07,
-0x27,0x15,0x23,0x35,0x07,0x27,0x37,0x11,0x05,0x11,0x23,0x35,0x07,0x27,0x37,0x27,
-0x37,0x17,0x2d,0x01,0x07,0x27,0x37,0x27,0x37,0x17,0x35,0x33,0x11,0x05,0x11,0x27,
-0x37,0x17,0x03,0x1e,0x78,0x8c,0x64,0xf0,0x01,0x0c,0xc8,0x58,0x3c,0x5b,0x8c,0x64,
-0xf0,0xfe,0xf6,0x01,0x0b,0xf0,0x64,0x8c,0x59,0x3c,0x5c,0xc8,0xfe,0xf9,0xf0,0x64,
-0x8c,0x78,0x8c,0x64,0xf0,0xfe,0xf7,0xc8,0x5b,0x3c,0x58,0x8c,0x64,0xf0,0x01,0x0b,
-0xfe,0xf7,0xf0,0x64,0x8c,0x5c,0x3c,0x59,0xc8,0x01,0x0d,0xf0,0x64,0x8c,0x05,0xd5,
-0x68,0x51,0xad,0x8b,0xfe,0xce,0x9b,0x01,0x15,0xa2,0x34,0x68,0x35,0x51,0xad,0x8a,
-0x99,0x9b,0x8b,0xad,0x51,0x34,0x68,0x35,0xa1,0x01,0x15,0x98,0xfe,0xd0,0x8b,0xad,
-0x51,0x68,0x65,0x51,0xad,0x8b,0x01,0x35,0x99,0xfe,0xeb,0xa1,0x35,0x68,0x33,0x51,
-0xae,0x8b,0x9a,0x99,0x8b,0xad,0x51,0x35,0x68,0x33,0xa1,0xfe,0xeb,0x9b,0x01,0x36,
-0x8b,0xad,0x51,0x00,0x00,0x01,0x00,0xa1,0xff,0xe5,0x06,0x13,0x05,0xf0,0x00,0x87,
-0x00,0x00,0x01,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x07,
-0x17,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,
-0x23,0x22,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x27,0x11,0x16,0x17,0x1e,0x01,0x14,
-0x0e,0x01,0x22,0x2e,0x01,0x34,0x36,0x37,0x36,0x37,0x11,0x07,0x16,0x15,0x14,0x07,
-0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x32,
-0x17,0x16,0x17,0x37,0x27,0x06,0x07,0x06,0x23,0x22,0x2e,0x01,0x34,0x37,0x36,0x37,
-0x36,0x33,0x32,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x17,0x11,0x26,0x27,0x2e,0x01,
-0x34,0x36,0x37,0x36,0x33,0x32,0x1e,0x01,0x14,0x06,0x07,0x06,0x07,0x11,0x37,0x26,
-0x35,0x34,0x37,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x05,0xf8,0x1b,0x1b,0x1b,0x2e,
-0x2f,0x35,0x36,0x2e,0x13,0x11,0xf1,0xf1,0x11,0x13,0x2e,0x36,0x35,0x2f,0x2e,0x1b,
-0x1b,0x1b,0x1c,0x2d,0x2f,0x35,0x33,0x31,0x2f,0x1b,0x1a,0x04,0xf1,0x15,0x13,0x2e,
-0x36,0x36,0x5c,0x6c,0x5c,0x36,0x36,0x2e,0x13,0x15,0xf1,0x04,0x1a,0x1b,0x2f,0x2f,
-0x35,0x36,0x2e,0x2e,0x1b,0x1b,0x1b,0x1b,0x2e,0x2f,0x6a,0x2f,0x13,0x11,0xf1,0xf1,
-0x10,0x14,0x31,0x33,0x36,0x5c,0x36,0x1b,0x1b,0x2e,0x2f,0x35,0x33,0x31,0x2f,0x1b,
-0x1a,0x04,0xf1,0x15,0x13,0x2e,0x36,0x36,0x2e,0x2f,0x35,0x36,0x5c,0x36,0x36,0x2e,
-0x13,0x15,0xf1,0x04,0x1a,0x1a,0x30,0x2e,0x36,0x35,0x2f,0x33,0x04,0x6d,0x36,0x2e,
-0x35,0x2f,0x2e,0x1b,0x1b,0x1b,0x0b,0x0f,0x8b,0x8c,0x0f,0x0b,0x1b,0x1b,0x1b,0x2e,
-0x2f,0x35,0x34,0x2f,0x2f,0x1b,0x1b,0x1b,0x1a,0x2f,0x2e,0x36,0x16,0x15,0x8c,0xfe,
-0xe9,0x07,0x0b,0x1b,0x5c,0x6c,0x5c,0x36,0x36,0x5c,0x6c,0x5c,0x1b,0x0b,0x07,0x01,
-0x17,0x8c,0x15,0x16,0x36,0x2e,0x2f,0x1a,0x1b,0x1b,0x1a,0x2f,0x2e,0x36,0x35,0x2f,
-0x2e,0x1b,0x1b,0x1b,0x0b,0x0f,0x8c,0x8b,0x0f,0x0b,0x1b,0x36,0x5c,0x6c,0x2e,0x2f,
-0x1a,0x1b,0x1b,0x1a,0x2f,0x2e,0x36,0x16,0x15,0x8c,0x01,0x17,0x07,0x0b,0x1b,0x5c,
-0x6c,0x5c,0x1b,0x1b,0x36,0x5c,0x6c,0x5c,0x1b,0x0b,0x07,0xfe,0xe9,0x8c,0x15,0x16,
-0x36,0x2e,0x2d,0x1c,0x1b,0x1b,0x1e,0x00,0x00,0x09,0x00,0x61,0xff,0xe5,0x06,0x53,
-0x05,0xd7,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x17,0x00,0x2e,0x00,0x45,
-0x00,0x5c,0x00,0x73,0x00,0x00,0x00,0x14,0x06,0x22,0x26,0x34,0x36,0x32,0x09,0x01,
-0x37,0x09,0x02,0x37,0x09,0x02,0x27,0x09,0x02,0x27,0x01,0x13,0x26,0x27,0x26,0x27,
-0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x32,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,
-0x07,0x06,0x03,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x22,0x27,
-0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x03,0x06,0x07,0x06,0x07,0x06,0x23,
-0x22,0x27,0x26,0x27,0x26,0x34,0x37,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x16,
-0x05,0x36,0x37,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x16,0x14,0x07,0x06,0x07,
-0x06,0x23,0x22,0x27,0x26,0x27,0x26,0x03,0xf0,0x58,0x7c,0x58,0x58,0x7c,0x01,0xa7,
-0xfe,0x7d,0x55,0x01,0x83,0xfd,0x0d,0xfe,0x7f,0x55,0x01,0x81,0x02,0x9e,0xfe,0x7d,
-0x55,0x01,0x83,0xfd,0xb7,0xfe,0x7f,0x55,0x01,0x81,0xb9,0x39,0x0f,0x17,0x04,0x01,
-0x02,0x03,0x0f,0x17,0x72,0x17,0x0f,0x03,0x02,0x01,0x04,0x17,0x0f,0x39,0x39,0x0f,
-0x17,0x04,0x01,0x02,0x03,0x0f,0x17,0x72,0x17,0x0f,0x03,0x02,0x01,0x04,0x17,0x0f,
-0x9f,0x3c,0x18,0x25,0x44,0x1d,0x52,0x45,0x1e,0x41,0x20,0x31,0x31,0x20,0x41,0x1e,
-0x45,0x52,0x1d,0x44,0x25,0x18,0x01,0xec,0x3c,0x18,0x25,0x44,0x1d,0x52,0x45,0x1e,
-0x41,0x20,0x31,0x31,0x20,0x41,0x1e,0x45,0x52,0x1d,0x44,0x25,0x18,0x03,0x2c,0x7c,
-0x58,0x58,0x7c,0x58,0xfd,0x2e,0x01,0x84,0x55,0xfe,0x7c,0x02,0x4a,0x01,0x81,0x55,
-0xfe,0x7e,0x01,0x2d,0xfe,0x7c,0x55,0x01,0x84,0xfd,0x0d,0xfe,0x7e,0x55,0x01,0x81,
-0x01,0x2e,0x3c,0x18,0x25,0x44,0x1d,0x52,0x45,0x1e,0x41,0x20,0x31,0x31,0x20,0x41,
-0x1e,0x45,0x52,0x1d,0x44,0x25,0x18,0xfe,0x14,0x3c,0x18,0x25,0x44,0x1d,0x52,0x45,
-0x1e,0x41,0x20,0x31,0x31,0x20,0x41,0x1e,0x45,0x52,0x1d,0x44,0x25,0x18,0x01,0x14,
-0x39,0x0f,0x17,0x04,0x01,0x02,0x03,0x0f,0x17,0x72,0x17,0x0f,0x03,0x02,0x01,0x04,
-0x17,0x0f,0x39,0x39,0x0f,0x17,0x04,0x01,0x02,0x03,0x0f,0x17,0x72,0x17,0x0f,0x03,
-0x02,0x01,0x04,0x17,0x0f,0x00,0x00,0x09,0x00,0x61,0xff,0xe5,0x06,0x53,0x05,0xd7,
-0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x17,0x00,0x2b,0x00,0x3f,0x00,0x53,
-0x00,0x67,0x00,0x00,0x00,0x14,0x06,0x22,0x26,0x34,0x36,0x32,0x09,0x01,0x17,0x09,
-0x02,0x17,0x09,0x02,0x07,0x09,0x02,0x07,0x01,0x02,0x14,0x07,0x06,0x07,0x06,0x22,
-0x27,0x26,0x27,0x26,0x34,0x37,0x36,0x37,0x36,0x32,0x17,0x16,0x17,0x12,0x14,0x07,
-0x06,0x07,0x06,0x22,0x27,0x26,0x27,0x26,0x34,0x37,0x36,0x37,0x36,0x32,0x17,0x16,
-0x17,0x00,0x32,0x17,0x16,0x17,0x16,0x14,0x07,0x06,0x07,0x06,0x22,0x27,0x26,0x27,
-0x26,0x34,0x37,0x36,0x37,0x24,0x32,0x17,0x16,0x17,0x16,0x14,0x07,0x06,0x07,0x06,
-0x22,0x27,0x26,0x27,0x26,0x34,0x37,0x36,0x37,0x04,0x3b,0x84,0xba,0x84,0x84,0xba,
-0xfd,0x69,0x01,0x29,0x55,0xfe,0xd7,0x02,0xa1,0x01,0x29,0x55,0xfe,0xd7,0xfd,0x0a,
-0x01,0x29,0x55,0xfe,0xd7,0x03,0x4b,0x01,0x29,0x55,0xfe,0xd7,0x08,0x13,0x15,0x27,
-0x2e,0x6e,0x2e,0x27,0x15,0x13,0x13,0x15,0x27,0x2e,0x6e,0x2e,0x27,0x15,0x13,0x13,
-0x15,0x27,0x2e,0x6e,0x2e,0x27,0x15,0x13,0x13,0x15,0x27,0x2e,0x6e,0x2e,0x27,0x15,
-0xfd,0x19,0x70,0x31,0x37,0x23,0x28,0x28,0x23,0x37,0x31,0x70,0x31,0x37,0x23,0x28,
-0x28,0x23,0x37,0x04,0x4d,0x70,0x31,0x37,0x23,0x28,0x28,0x23,0x37,0x31,0x70,0x31,
-0x37,0x23,0x28,0x28,0x23,0x37,0x03,0x4b,0xba,0x84,0x84,0xba,0x84,0xfd,0x38,0x01,
-0x29,0x55,0xfe,0xd7,0x03,0x4c,0x01,0x29,0x55,0xfe,0xd7,0x01,0x7e,0xfe,0xd7,0x55,
-0x01,0x29,0xfd,0x5e,0xfe,0xd7,0x55,0x01,0x29,0x03,0x49,0x70,0x31,0x37,0x23,0x28,
-0x28,0x23,0x37,0x31,0x70,0x31,0x37,0x23,0x28,0x28,0x23,0x37,0xfb,0xb3,0x70,0x31,
-0x37,0x23,0x28,0x28,0x23,0x37,0x31,0x70,0x31,0x37,0x23,0x28,0x28,0x23,0x37,0x02,
-0x59,0x13,0x15,0x27,0x2e,0x6e,0x2e,0x27,0x15,0x13,0x13,0x15,0x27,0x2e,0x6e,0x2e,
-0x27,0x15,0x13,0x13,0x15,0x27,0x2e,0x6e,0x2e,0x27,0x15,0x13,0x13,0x15,0x27,0x2e,
-0x6e,0x2e,0x27,0x15,0x00,0x09,0x00,0x54,0xff,0xe5,0x06,0x60,0x05,0xf2,0x00,0x0c,
-0x00,0x19,0x00,0x26,0x00,0x33,0x00,0x40,0x00,0x4d,0x00,0x59,0x00,0x61,0x00,0x6d,
-0x00,0x00,0x01,0x14,0x07,0x06,0x2b,0x01,0x25,0x35,0x25,0x33,0x32,0x17,0x16,0x05,
-0x34,0x37,0x36,0x3b,0x01,0x05,0x15,0x05,0x23,0x22,0x27,0x26,0x01,0x16,0x15,0x14,
-0x0f,0x01,0x01,0x27,0x01,0x37,0x36,0x33,0x32,0x01,0x26,0x35,0x34,0x3f,0x01,0x01,
-0x17,0x01,0x07,0x06,0x23,0x22,0x03,0x36,0x33,0x32,0x1f,0x01,0x01,0x07,0x01,0x27,
-0x26,0x35,0x34,0x01,0x06,0x23,0x22,0x2f,0x01,0x01,0x37,0x01,0x17,0x16,0x15,0x14,
-0x00,0x32,0x17,0x16,0x1d,0x01,0x03,0x23,0x03,0x35,0x34,0x37,0x12,0x14,0x06,0x22,
-0x26,0x34,0x36,0x32,0x02,0x22,0x27,0x26,0x3d,0x01,0x13,0x33,0x13,0x15,0x14,0x07,
-0x06,0x60,0x1c,0x1c,0x28,0x0a,0xfe,0x60,0x01,0xa0,0x0a,0x26,0x1e,0x1c,0xf9,0xf4,
-0x1c,0x1c,0x28,0x0a,0x01,0xa0,0xfe,0x60,0x0a,0x26,0x1e,0x1c,0x05,0x2a,0x1d,0x1b,
-0x07,0xfe,0xb7,0x47,0x01,0x02,0x07,0x1c,0x29,0x2a,0xfb,0xd5,0x1d,0x1b,0x07,0x01,
-0x49,0x47,0xfe,0xfe,0x07,0x1c,0x29,0x28,0x1f,0x1d,0x2a,0x28,0x1d,0x07,0x01,0x02,
-0x47,0xfe,0xb7,0x07,0x1b,0x04,0x65,0x1e,0x29,0x29,0x1c,0x07,0xfe,0xfe,0x47,0x01,
-0x49,0x07,0x1b,0xfd,0x96,0x52,0x1e,0x1d,0x32,0x64,0x32,0x1d,0xdd,0x58,0x7c,0x58,
-0x58,0x7c,0x15,0x52,0x1e,0x1d,0x32,0x64,0x32,0x1d,0x02,0xec,0x2a,0x1e,0x1c,0x32,
-0x64,0x32,0x1e,0x1e,0x28,0x28,0x1e,0x1e,0x32,0x64,0x32,0x1c,0x1e,0x02,0x4d,0x1d,
-0x2a,0x27,0x1d,0x07,0xfe,0xfe,0x46,0x01,0x49,0x07,0x1c,0xfb,0x9b,0x1d,0x2a,0x27,
-0x1d,0x07,0x01,0x02,0x46,0xfe,0xb7,0x07,0x1c,0x04,0x65,0x1e,0x1c,0x07,0xfe,0xb7,
-0x46,0x01,0x02,0x07,0x1b,0x29,0x2a,0xfb,0xd6,0x1e,0x1c,0x07,0x01,0x49,0x46,0xfe,
-0xfe,0x07,0x1b,0x29,0x2a,0x05,0x0d,0x1d,0x1c,0x28,0x0a,0xfe,0x61,0x01,0x9f,0x0a,
-0x27,0x1d,0xfd,0x55,0x7c,0x58,0x58,0x7c,0x58,0xfc,0x63,0x1d,0x1c,0x28,0x0a,0x01,
-0x9f,0xfe,0x61,0x0a,0x27,0x1d,0x00,0x01,0x00,0x54,0xff,0xe5,0x06,0x60,0x05,0xf2,
-0x00,0x6c,0x00,0x00,0x01,0x32,0x17,0x16,0x15,0x14,0x07,0x03,0x01,0x36,0x37,0x36,
-0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x01,0x25,0x36,0x33,0x32,0x17,0x16,
-0x14,0x07,0x06,0x23,0x22,0x27,0x25,0x01,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x23,
-0x22,0x27,0x26,0x27,0x01,0x13,0x16,0x15,0x14,0x07,0x06,0x22,0x27,0x26,0x35,0x34,
-0x37,0x13,0x01,0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x01,
-0x05,0x06,0x23,0x22,0x27,0x26,0x34,0x37,0x36,0x33,0x32,0x17,0x05,0x01,0x26,0x27,
-0x26,0x35,0x34,0x37,0x36,0x33,0x16,0x17,0x16,0x17,0x01,0x03,0x26,0x35,0x34,0x37,
-0x36,0x03,0x5a,0x2b,0x2f,0x23,0x05,0x4e,0x01,0x1c,0x15,0x02,0x34,0x32,0x42,0x1f,
-0x1e,0x34,0x0a,0x19,0xfe,0x7b,0x01,0xdf,0x19,0x0c,0x4c,0x22,0x2e,0x2e,0x24,0x4a,
-0x07,0x25,0xfe,0x28,0x01,0x8a,0x1c,0x02,0x34,0x1e,0x1f,0x42,0x2b,0x3b,0x0a,0x12,
-0xfe,0xe9,0x4e,0x05,0x23,0x2f,0x56,0x2f,0x23,0x05,0x4e,0xfe,0xe9,0x12,0x0a,0x34,
-0x32,0x42,0x1f,0x1e,0x34,0x02,0x1c,0x01,0x8a,0xfe,0x28,0x25,0x07,0x4a,0x24,0x2e,
-0x2e,0x22,0x4c,0x0c,0x19,0x01,0xdf,0xfe,0x7b,0x19,0x0a,0x34,0x1e,0x1f,0x42,0x24,
-0x42,0x02,0x15,0x01,0x1c,0x4e,0x05,0x23,0x2e,0x05,0xf2,0x2f,0x23,0x4a,0x07,0x1f,
-0xfe,0x22,0x01,0x89,0x1d,0x01,0x35,0x1f,0x1e,0x43,0x37,0x2f,0x09,0x12,0xfe,0xe9,
-0x4e,0x04,0x22,0x2e,0x58,0x2e,0x24,0x06,0x4d,0xfe,0xe5,0x16,0x01,0x35,0x31,0x43,
-0x1e,0x1f,0x35,0x09,0x19,0x01,0x85,0xfe,0x22,0x1f,0x07,0x4a,0x23,0x2f,0x2f,0x23,
-0x4a,0x0e,0x1e,0x01,0xd8,0xfe,0x7b,0x19,0x09,0x35,0x1f,0x1e,0x43,0x4c,0x1a,0x01,
-0x16,0x01,0x1b,0x4d,0x06,0x24,0x2e,0x58,0x2e,0x22,0x04,0x4e,0x01,0x17,0x12,0x09,
-0x35,0x31,0x43,0x1e,0x1f,0x14,0x21,0x01,0x1d,0xfe,0x77,0x01,0xd8,0x1e,0x0e,0x4a,
-0x23,0x2f,0x00,0x02,0x00,0x66,0xff,0xec,0x06,0xc6,0x05,0xe8,0x00,0x0d,0x00,0x23,
-0x00,0xe7,0xba,0x00,0x00,0x00,0x13,0x00,0x03,0x2b,0xba,0x00,0x1f,0x00,0x06,0x00,
-0x03,0x2b,0xb8,0x00,0x1f,0x10,0x41,0x1b,0x00,0x16,0x00,0x00,0x00,0x26,0x00,0x00,
-0x00,0x36,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x66,0x00,0x00,
-0x00,0x76,0x00,0x00,0x00,0x86,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0xa6,0x00,0x00,
-0x00,0xb6,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0x0d,0x5d,0x41,
-0x05,0x00,0xe5,0x00,0x00,0x00,0xf5,0x00,0x00,0x00,0x02,0x5d,0x41,0x05,0x00,0xea,
-0x00,0x06,0x00,0xfa,0x00,0x06,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,0x06,0x00,
-0x29,0x00,0x06,0x00,0x39,0x00,0x06,0x00,0x49,0x00,0x06,0x00,0x59,0x00,0x06,0x00,
-0x69,0x00,0x06,0x00,0x79,0x00,0x06,0x00,0x89,0x00,0x06,0x00,0x99,0x00,0x06,0x00,
-0xa9,0x00,0x06,0x00,0xb9,0x00,0x06,0x00,0xc9,0x00,0x06,0x00,0xd9,0x00,0x06,0x00,
-0x0d,0x5d,0xb8,0x00,0x25,0xdc,0x00,0xba,0x00,0x03,0x00,0x10,0x00,0x03,0x2b,0xb8,
-0x00,0x03,0x10,0xba,0x00,0x17,0x00,0x0a,0x00,0x03,0x2b,0xb8,0x00,0x17,0x10,0xb8,
-0x00,0x10,0x10,0xb8,0x00,0x0e,0xd0,0xb8,0x00,0x0e,0x2f,0xb8,0x00,0x17,0x10,0xb8,
-0x00,0x19,0xd0,0xb8,0x00,0x19,0x2f,0xb8,0x00,0x17,0x10,0xb8,0x00,0x1b,0xd0,0xb8,
-0x00,0x10,0x10,0xb8,0x00,0x22,0xd0,0x30,0x31,0x13,0x10,0x00,0x21,0x20,0x00,0x11,
-0x34,0x02,0x24,0x23,0x22,0x04,0x02,0x01,0x06,0x23,0x20,0x00,0x11,0x34,0x12,0x24,
-0x33,0x32,0x17,0x36,0x33,0x32,0x04,0x12,0x15,0x10,0x00,0x21,0x22,0xb9,0x01,0x8f,
-0x01,0x1c,0x01,0x1c,0x01,0x8f,0xb6,0xfe,0xb8,0xad,0xad,0xfe,0xb8,0xb6,0x02,0xdc,
-0x19,0x19,0xfe,0xc4,0xfe,0x3f,0xce,0x01,0x71,0xbe,0x19,0x19,0x19,0x19,0xc1,0x01,
-0x71,0xcd,0xfe,0x3f,0xfe,0xc2,0x19,0x02,0xea,0xfe,0xe4,0xfe,0x70,0x01,0x90,0x01,
-0x1c,0xb3,0x01,0x47,0xb1,0xb1,0xfe,0xb9,0xfc,0x51,0x02,0x01,0xbf,0x01,0x3f,0xc6,
-0x01,0x72,0xc6,0x02,0x02,0xc6,0xfe,0x90,0xc8,0xfe,0xc1,0xfe,0x41,0x00,0x00,0x02,
-0x00,0x7a,0xff,0x9c,0x06,0xb2,0x05,0xd4,0x00,0x03,0x00,0x0b,0x00,0x37,0xba,0x00,
-0x03,0x00,0x05,0x00,0x03,0x2b,0xb8,0x00,0x03,0x10,0xba,0x00,0x0a,0x00,0x00,0x00,
-0x03,0x2b,0xb8,0x00,0x0a,0x10,0xb8,0x00,0x0d,0xdc,0x00,0xba,0x00,0x00,0x00,0x0a,
-0x00,0x03,0x2b,0xb8,0x00,0x00,0x10,0xba,0x00,0x07,0x00,0x01,0x00,0x03,0x2b,0xb8,
-0x00,0x07,0x10,0x30,0x31,0x25,0x11,0x21,0x11,0x17,0x23,0x11,0x21,0x15,0x33,0x11,
-0x21,0x05,0xfb,0xfa,0xd2,0x11,0x64,0x05,0xd4,0x64,0xfa,0x2c,0x53,0x05,0x2e,0xfa,
-0xd2,0x53,0x05,0xd4,0x64,0xfa,0x2c,0x00,0x00,0x02,0x00,0x7a,0x00,0x00,0x06,0xb2,
-0x06,0x38,0x00,0x03,0x00,0x0b,0x00,0x37,0xba,0x00,0x03,0x00,0x06,0x00,0x03,0x2b,
-0xb8,0x00,0x03,0x10,0xba,0x00,0x0b,0x00,0x00,0x00,0x03,0x2b,0xb8,0x00,0x0b,0x10,
-0xb8,0x00,0x0d,0xdc,0x00,0xba,0x00,0x00,0x00,0x05,0x00,0x03,0x2b,0xb8,0x00,0x00,
-0x10,0xba,0x00,0x0a,0x00,0x01,0x00,0x03,0x2b,0xb8,0x00,0x0a,0x10,0x30,0x31,0x25,
-0x11,0x21,0x11,0x25,0x15,0x21,0x11,0x33,0x35,0x21,0x11,0x05,0xfb,0xfa,0xd2,0x05,
-0x81,0xfa,0x2c,0x64,0x05,0xd4,0x53,0x05,0x2e,0xfa,0xd2,0x11,0x64,0x05,0xd4,0x64,
-0xfa,0x2c,0x00,0x02,0x00,0x7a,0xff,0x9c,0x06,0xb2,0x05,0xd4,0x00,0x03,0x00,0x09,
-0x00,0x37,0xba,0x00,0x03,0x00,0x04,0x00,0x03,0x2b,0xb8,0x00,0x03,0x10,0xba,0x00,
-0x08,0x00,0x00,0x00,0x03,0x2b,0xb8,0x00,0x08,0x10,0xb8,0x00,0x0b,0xdc,0x00,0xba,
-0x00,0x00,0x00,0x08,0x00,0x03,0x2b,0xb8,0x00,0x00,0x10,0xba,0x00,0x06,0x00,0x01,
-0x00,0x03,0x2b,0xb8,0x00,0x06,0x10,0x30,0x31,0x25,0x11,0x21,0x11,0x07,0x11,0x21,
-0x17,0x11,0x21,0x05,0xfb,0xfa,0xd2,0x53,0x05,0xd4,0x64,0xfa,0x4a,0x53,0x05,0x2e,
-0xfa,0xd2,0x53,0x05,0xd4,0x82,0xfa,0x4a,0x00,0x02,0x00,0x7a,0x00,0x00,0x06,0xb2,
-0x06,0x38,0x00,0x03,0x00,0x09,0x00,0x37,0xba,0x00,0x03,0x00,0x05,0x00,0x03,0x2b,
-0xb8,0x00,0x03,0x10,0xba,0x00,0x09,0x00,0x00,0x00,0x03,0x2b,0xb8,0x00,0x09,0x10,
-0xb8,0x00,0x0b,0xdc,0x00,0xba,0x00,0x00,0x00,0x04,0x00,0x03,0x2b,0xb8,0x00,0x00,
-0x10,0xba,0x00,0x08,0x00,0x01,0x00,0x03,0x2b,0xb8,0x00,0x08,0x10,0x30,0x31,0x25,
-0x11,0x21,0x11,0x05,0x21,0x11,0x37,0x21,0x11,0x05,0xfb,0xfa,0xd2,0x05,0x81,0xfa,
-0x2c,0x82,0x05,0xb6,0x53,0x05,0x2e,0xfa,0xd2,0x53,0x05,0xd4,0x64,0xfa,0x4a,0x00,
-0x00,0x04,0x00,0xaa,0xff,0xfb,0x06,0x82,0x05,0xd3,0x00,0x03,0x00,0x07,0x00,0x0b,
-0x00,0x0f,0x00,0x0b,0x00,0xb8,0x00,0x09,0x2f,0xb8,0x00,0x0f,0x2f,0x30,0x31,0x13,
-0x09,0x0e,0xaa,0x01,0x53,0x01,0x53,0xfe,0xad,0x01,0xdf,0x01,0x54,0x01,0x52,0xfe,
-0xae,0xfd,0x15,0x01,0x53,0x01,0x53,0xfe,0xad,0xfe,0xad,0x01,0x53,0x01,0x53,0xfe,
-0xad,0x02,0xe9,0x01,0x53,0xfe,0xad,0xfe,0xad,0x01,0x53,0x01,0x52,0xfe,0xae,0xfe,
-0xab,0x02,0xea,0x01,0x55,0xfe,0xab,0xfe,0xae,0xfe,0x22,0x01,0x53,0xfe,0xad,0xfe,
-0xad,0x00,0x00,0x01,0x03,0x05,0xfe,0x14,0x03,0xaf,0x06,0x14,0x00,0x03,0x00,0x00,
-0x01,0x11,0x23,0x11,0x03,0xaf,0xaa,0x06,0x14,0xf8,0x00,0x08,0x00,0x00,0x00,0x01,
-0x02,0xb0,0xfe,0x14,0x04,0x04,0x06,0x14,0x00,0x03,0x00,0x00,0x01,0x11,0x21,0x11,
-0x04,0x04,0xfe,0xac,0x06,0x14,0xf8,0x00,0x08,0x00,0x00,0x01,0x02,0x06,0xfe,0x14,
-0x04,0xae,0x06,0x14,0x00,0x03,0x00,0x00,0x01,0x11,0x21,0x11,0x04,0xae,0xfd,0x58,
-0x06,0x14,0xf8,0x00,0x08,0x00,0x00,0x01,0x00,0xae,0x03,0x28,0x02,0x1c,0x05,0xd5,
-0x00,0x06,0x00,0x1b,0xba,0x00,0x00,0x00,0x01,0x00,0x03,0x2b,0x00,0xb8,0x00,0x03,
-0x2f,0xba,0x00,0x06,0x00,0x00,0x00,0x03,0x2b,0xb8,0x00,0x06,0x10,0x30,0x31,0x01,
-0x21,0x11,0x13,0x33,0x03,0x33,0x02,0x1c,0xfe,0x92,0xa4,0x81,0x52,0x9b,0x03,0x28,
-0x01,0x6e,0x01,0x3f,0xfe,0xc1,0x00,0x01,0x00,0x78,0x03,0x28,0x01,0xe6,0x05,0xd5,
-0x00,0x06,0x00,0x27,0xba,0x00,0x01,0x00,0x00,0x00,0x03,0x2b,0xb8,0x00,0x01,0x10,
-0x00,0xb8,0x00,0x03,0x2f,0xba,0x00,0x01,0x00,0x02,0x00,0x03,0x2b,0xb8,0x00,0x01,
-0x10,0xb8,0x00,0x02,0x10,0xb8,0x00,0x05,0xd0,0x30,0x31,0x13,0x21,0x11,0x03,0x23,
-0x13,0x23,0x78,0x01,0x6e,0xa4,0x81,0x52,0x9b,0x05,0xd5,0xfe,0x92,0xfe,0xc1,0x01,
-0x3f,0x00,0xff,0xff,0x00,0xae,0x03,0x28,0x03,0xd6,0x05,0xd5,0x10,0x22,0x0a,0x8c,
-0x00,0x00,0x10,0x03,0x0a,0x8c,0x01,0xba,0x00,0x00,0xff,0xff,0x00,0x78,0x03,0x28,
-0x03,0xa0,0x05,0xd5,0x10,0x22,0x0a,0x8d,0x00,0x00,0x10,0x03,0x0a,0x8d,0x01,0xba,
-0x00,0x00,0x00,0x02,0x01,0x3e,0xff,0x42,0x06,0x2d,0x06,0xcf,0x00,0x4f,0x00,0x53,
-0x00,0x00,0x01,0x32,0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,
-0x07,0x06,0x23,0x22,0x07,0x06,0x07,0x06,0x07,0x06,0x14,0x17,0x16,0x17,0x16,0x17,
-0x16,0x33,0x32,0x37,0x36,0x37,0x36,0x37,0x36,0x35,0x11,0x21,0x22,0x27,0x26,0x35,
-0x34,0x24,0x33,0x21,0x35,0x37,0x15,0x21,0x07,0x23,0x11,0x14,0x07,0x06,0x07,0x06,
-0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,
-0x37,0x36,0x01,0x11,0x23,0x11,0x02,0xdd,0x1f,0x1a,0x1b,0x16,0x15,0x0c,0x0b,0x0b,
-0x0c,0x15,0x16,0x1b,0x1a,0x1a,0x1c,0x13,0x13,0x10,0x11,0x08,0x08,0x09,0x0a,0x10,
-0x14,0x10,0x18,0x20,0x3f,0x3e,0x49,0x2d,0x37,0x19,0x1b,0xfe,0xcd,0xde,0x87,0x76,
-0x01,0x04,0xd7,0x01,0x33,0x8d,0x01,0x54,0x8c,0xc8,0x25,0x2b,0x3e,0x43,0x50,0x4e,
-0x48,0x69,0x44,0x47,0x2d,0x32,0x16,0x18,0x18,0x19,0x2f,0x26,0x44,0x39,0x01,0xa8,
-0xbe,0x01,0xd0,0x0b,0x0c,0x15,0x14,0x1d,0x1b,0x1f,0x1e,0x1b,0x1d,0x14,0x15,0x0c,
-0x0b,0x09,0x08,0x10,0x10,0x13,0x14,0x2e,0x14,0x16,0x0e,0x12,0x06,0x09,0x1b,0x21,
-0x2d,0x38,0x3d,0x44,0x44,0x01,0x5f,0x7f,0x6f,0xb8,0xbe,0xe8,0xc8,0x32,0xfa,0x7b,
-0xfb,0xdb,0x6a,0x54,0x63,0x40,0x46,0x27,0x25,0x19,0x1a,0x2e,0x33,0x36,0x3c,0x40,
-0x4d,0x31,0x33,0x37,0x2b,0x1d,0x18,0x01,0x34,0x02,0x56,0xfd,0xaa,0x00,0x00,0x02,
-0x01,0x9e,0xff,0xdd,0x05,0x16,0x05,0xf0,0x00,0x17,0x00,0x35,0x00,0x00,0x01,0x32,
-0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x26,0x27,0x26,0x35,0x34,
-0x37,0x36,0x37,0x36,0x37,0x36,0x12,0x32,0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,
-0x07,0x06,0x07,0x06,0x07,0x06,0x22,0x27,0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,
-0x36,0x37,0x36,0x37,0x03,0x5a,0xa0,0x79,0x2a,0x2c,0x26,0x13,0x14,0x88,0xb2,0x82,
-0x86,0xae,0x88,0x14,0x13,0x26,0x25,0x31,0x5d,0x7e,0x7c,0x34,0x35,0x2c,0x2d,0x15,
-0x16,0x16,0x15,0x2d,0x2c,0x35,0x34,0x7c,0x34,0x35,0x2c,0x2d,0x15,0x16,0x16,0x15,
-0x2d,0x2c,0x35,0x05,0xf0,0x28,0x0e,0x2b,0x26,0x30,0x31,0x34,0x7c,0x64,0x83,0xce,
-0xce,0x83,0x66,0x7a,0x34,0x31,0x30,0x26,0x24,0x15,0x28,0xfc,0x46,0x16,0x18,0x2a,
-0x2e,0x34,0x36,0x3d,0x3c,0x36,0x34,0x2e,0x2a,0x18,0x16,0x16,0x18,0x2a,0x2e,0x34,
-0x36,0x3c,0x3d,0x36,0x34,0x2e,0x2a,0x18,0x00,0x02,0x01,0x4e,0xff,0xdd,0x05,0x66,
-0x05,0xf0,0x00,0x25,0x00,0x43,0x00,0x00,0x01,0x26,0x25,0x26,0x35,0x34,0x37,0x36,
-0x37,0x36,0x37,0x36,0x32,0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x34,0x37,0x36,0x37,
-0x36,0x37,0x36,0x32,0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x04,0x02,0x32,
-0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x07,0x06,0x22,0x27,
-0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x37,0x03,0x5a,0x7b,0xfe,
-0xf7,0x88,0x14,0x13,0x26,0x25,0x31,0x2d,0x6c,0x2e,0x2f,0x26,0x25,0x14,0x14,0x14,
-0x14,0x25,0x26,0x2f,0x2e,0x6c,0x2d,0x31,0x25,0x26,0x13,0x14,0x88,0xfe,0xf6,0xb8,
-0x7c,0x34,0x35,0x2c,0x2d,0x15,0x16,0x16,0x15,0x2d,0x2c,0x35,0x34,0x7c,0x34,0x35,
-0x2c,0x2d,0x15,0x16,0x16,0x15,0x2d,0x2c,0x35,0x02,0xad,0xc4,0xa1,0x53,0x83,0x34,
-0x31,0x30,0x26,0x24,0x15,0x14,0x14,0x14,0x25,0x25,0x31,0x2f,0x36,0x36,0x2f,0x31,
-0x25,0x25,0x14,0x14,0x14,0x15,0x24,0x26,0x30,0x31,0x34,0x84,0x52,0xa1,0xfe,0xc5,
-0x16,0x18,0x2a,0x2e,0x34,0x36,0x3d,0x3c,0x36,0x34,0x2e,0x2a,0x18,0x16,0x16,0x18,
-0x2a,0x2e,0x34,0x36,0x3c,0x3d,0x36,0x34,0x2e,0x2a,0x18,0x00,0x00,0x01,0x00,0x6e,
-0x00,0xab,0x06,0x46,0x05,0x28,0x00,0x25,0x00,0x00,0x25,0x26,0x25,0x26,0x35,0x34,
-0x37,0x36,0x37,0x36,0x37,0x36,0x32,0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x34,0x37,
-0x36,0x37,0x36,0x37,0x36,0x32,0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x04,
-0x03,0x5a,0x89,0xfe,0x5f,0xc2,0x1c,0x1b,0x37,0x35,0x45,0x41,0x9a,0x41,0x44,0x36,
-0x35,0x1d,0x1c,0x1c,0x1d,0x35,0x36,0x44,0x41,0x9a,0x41,0x45,0x35,0x37,0x1b,0x1c,
-0xc2,0xfe,0x5f,0xab,0xef,0xf2,0x71,0xb2,0x4b,0x46,0x44,0x36,0x34,0x1e,0x1c,0x1c,
-0x1d,0x35,0x34,0x46,0x43,0x4e,0x4e,0x43,0x46,0x34,0x35,0x1d,0x1c,0x1c,0x1e,0x34,
-0x36,0x44,0x46,0x4b,0xb4,0x6f,0xf2,0x00,0x00,0x01,0x01,0x58,0xff,0xfe,0x05,0xd4,
-0x05,0xd6,0x00,0x27,0x00,0x00,0x01,0x06,0x03,0x06,0x23,0x22,0x27,0x26,0x27,0x26,
-0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x37,0x36,0x33,0x22,0x27,0x26,0x27,0x26,
-0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x37,0x36,0x33,0x32,0x17,0x12,0x05,0xd4,
-0xee,0xf2,0x72,0xb2,0x4a,0x46,0x44,0x36,0x34,0x1e,0x1c,0x1c,0x1c,0x36,0x34,0x46,
-0x42,0x4e,0x4e,0x42,0x46,0x34,0x36,0x1c,0x1c,0x1c,0x1e,0x34,0x36,0x44,0x46,0x4a,
-0xb4,0x70,0xf2,0x02,0xea,0x8a,0xfe,0x60,0xc2,0x1c,0x1a,0x38,0x34,0x46,0x40,0x4e,
-0x4c,0x42,0x44,0x36,0x34,0x1e,0x1c,0x1c,0x1c,0x36,0x36,0x44,0x40,0x4e,0x4c,0x42,
-0x44,0x36,0x36,0x1c,0x1c,0xc2,0xfe,0x5e,0x00,0x02,0x00,0x7e,0x00,0x2a,0x05,0xcb,
-0x05,0x9e,0x00,0x0d,0x00,0x69,0x00,0x00,0x01,0x36,0x35,0x34,0x27,0x26,0x23,0x22,
-0x07,0x06,0x15,0x14,0x17,0x16,0x17,0x06,0x07,0x36,0x33,0x32,0x17,0x16,0x15,0x14,
-0x05,0x06,0x15,0x14,0x33,0x32,0x37,0x36,0x33,0x32,0x15,0x14,0x21,0x22,0x27,0x26,
-0x35,0x10,0x21,0x32,0x17,0x36,0x37,0x26,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x14,
-0x16,0x15,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x1f,
-0x01,0x34,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x16,0x33,0x32,0x37,0x36,
-0x35,0x34,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x06,
-0x23,0x22,0x03,0x97,0x0a,0x1d,0x18,0x36,0x1e,0x16,0x13,0x2b,0x4a,0x6f,0x15,0x2e,
-0x5e,0x56,0x7c,0x3b,0x2d,0xfe,0xcb,0x99,0x69,0x74,0x10,0x33,0x36,0x3f,0xfe,0xc5,
-0xcc,0xba,0xc6,0x01,0x05,0x66,0x51,0x4d,0x10,0x65,0xe6,0x45,0x4a,0x53,0x3f,0x28,
-0x2a,0x1a,0x24,0x14,0x20,0x19,0x0e,0x73,0x5d,0x76,0x68,0x32,0x4b,0x29,0x2a,0x4e,
-0x4c,0x31,0x33,0x10,0x3c,0x56,0x4c,0x2a,0x2d,0x15,0x2a,0x15,0x1f,0x38,0x41,0x2a,
-0x14,0x8f,0x5f,0x78,0x41,0x04,0x67,0x30,0x2c,0x3f,0x29,0x21,0x12,0x0f,0x1b,0x3a,
-0x22,0x39,0x8c,0x4a,0x4f,0x43,0x51,0x3e,0x5e,0xda,0x76,0x3a,0x4d,0x63,0x2a,0x84,
-0x5a,0x9c,0x99,0xa3,0xfe,0x01,0x65,0x8d,0x97,0x43,0x30,0xaa,0x33,0x4e,0x33,0x35,
-0x25,0x26,0x1d,0x17,0x14,0x1c,0x2d,0x19,0x4b,0x74,0x5c,0x4b,0x25,0x39,0x53,0x1f,
-0x20,0x3e,0x42,0x57,0x4e,0x3d,0x11,0x21,0x24,0x1f,0x3f,0x12,0x24,0x15,0x38,0x1c,
-0x28,0x46,0x21,0x35,0x7b,0x5e,0x3f,0x00,0x00,0x02,0x00,0xa0,0x01,0x5a,0x06,0x13,
-0x04,0x84,0x00,0x07,0x00,0x4e,0x00,0x00,0x01,0x06,0x07,0x06,0x07,0x36,0x37,0x36,
-0x01,0x20,0x35,0x34,0x37,0x26,0x27,0x26,0x07,0x16,0x07,0x06,0x07,0x16,0x33,0x32,
-0x37,0x16,0x15,0x14,0x23,0x22,0x27,0x23,0x35,0x33,0x36,0x37,0x36,0x37,0x26,0x27,
-0x26,0x27,0x26,0x35,0x34,0x33,0x06,0x15,0x14,0x17,0x16,0x17,0x32,0x17,0x16,0x17,
-0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x13,0x16,0x33,0x32,0x35,0x34,0x27,0x26,0x35,
-0x34,0x33,0x32,0x15,0x14,0x07,0x06,0x01,0xdf,0x3f,0x2d,0x42,0x1b,0x4f,0x3e,0x42,
-0x01,0xf9,0xfe,0x8b,0x76,0x30,0x36,0x28,0x27,0x02,0x4b,0x60,0x64,0x19,0x43,0x2b,
-0x28,0x08,0x91,0x6b,0x14,0x24,0x27,0x1e,0x65,0x4d,0x3f,0x0f,0x24,0x23,0x3d,0x48,
-0x62,0x0c,0x8f,0x42,0x04,0x3d,0x29,0x2b,0x38,0x1f,0x3d,0x2e,0x6d,0xd8,0x39,0x18,
-0x65,0x62,0x0c,0x0b,0x50,0x42,0xf7,0xb0,0x03,0x3e,0x0e,0x24,0x33,0x67,0x1d,0x3a,
-0x3d,0xfe,0x54,0xfe,0x45,0x42,0x37,0x1c,0x15,0x01,0x57,0x50,0x66,0x0f,0x47,0x2b,
-0x1e,0x31,0x4b,0xab,0x48,0x8e,0x50,0x3c,0x02,0x12,0x12,0x12,0x0e,0x11,0x46,0x66,
-0x1d,0x23,0x26,0x54,0x27,0x19,0x13,0x14,0x30,0x50,0x2b,0x41,0x27,0x1d,0xfe,0x93,
-0x9a,0x3c,0x1e,0x12,0x11,0x1b,0x3c,0x51,0xad,0x62,0x46,0x00,0x00,0x01,0x01,0x91,
-0xfe,0xe4,0x05,0x2f,0x06,0x27,0x00,0x20,0x00,0x00,0x01,0x22,0x27,0x26,0x27,0x26,
-0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x37,0x36,0x33,0x15,0x22,0x07,0x06,0x02,
-0x07,0x06,0x15,0x14,0x17,0x16,0x17,0x16,0x17,0x16,0x33,0x05,0x2f,0xba,0xa9,0xa1,
-0x8a,0x86,0x46,0x44,0x44,0x40,0x8c,0x84,0xa7,0xa9,0xba,0x6d,0x68,0x60,0xa6,0x28,
-0x28,0x28,0x28,0x53,0x4e,0x65,0x63,0x72,0xfe,0xe4,0x47,0x43,0x89,0x85,0xa7,0xa4,
-0xbb,0xbd,0xa9,0x9d,0x8f,0x86,0x46,0x47,0x2f,0x43,0x3e,0xfe,0xfa,0x9b,0x9c,0xb8,
-0xb1,0x9c,0x9b,0x83,0x7d,0x44,0x43,0x00,0x00,0x01,0x01,0x91,0xfe,0xe4,0x05,0x2f,
-0x06,0x27,0x00,0x20,0x00,0x00,0x01,0x35,0x32,0x37,0x36,0x37,0x36,0x37,0x36,0x35,
-0x34,0x27,0x26,0x02,0x27,0x26,0x23,0x35,0x32,0x17,0x16,0x17,0x16,0x17,0x16,0x15,
-0x14,0x07,0x06,0x07,0x06,0x07,0x06,0x01,0x91,0x72,0x63,0x65,0x4e,0x53,0x28,0x28,
-0x28,0x28,0xa6,0x60,0x68,0x6d,0xba,0xa9,0xa7,0x84,0x8c,0x40,0x44,0x44,0x46,0x86,
-0x8a,0xa1,0xa9,0xfe,0xe4,0x2f,0x43,0x44,0x7d,0x83,0x9b,0x9c,0xb1,0xb8,0x9c,0x9b,
-0x01,0x06,0x3e,0x43,0x2f,0x47,0x46,0x86,0x8f,0x9d,0xa9,0xbd,0xbb,0xa4,0xa7,0x85,
-0x89,0x43,0x47,0x00,0x00,0x01,0x02,0x1d,0xfe,0xf1,0x04,0x98,0x06,0x11,0x00,0x0c,
-0x00,0x00,0x01,0x06,0x02,0x10,0x12,0x17,0x21,0x26,0x02,0x35,0x34,0x12,0x37,0x04,
-0x98,0x86,0x82,0x83,0x85,0xfe,0xb0,0x96,0x95,0x94,0x97,0x06,0x11,0xe6,0xfe,0x3e,
-0xfe,0x32,0xfe,0x3b,0xe5,0xeb,0x01,0xc6,0xe0,0xdf,0x01,0xc4,0xec,0x00,0x00,0x01,
-0x02,0x1d,0xfe,0xf1,0x04,0x98,0x06,0x11,0x00,0x0e,0x00,0x00,0x01,0x21,0x16,0x12,
-0x15,0x14,0x07,0x06,0x07,0x21,0x36,0x37,0x36,0x10,0x02,0x02,0x1d,0x01,0x50,0x97,
-0x94,0x4a,0x4b,0x96,0xfe,0xb0,0x85,0x42,0x41,0x82,0x06,0x11,0xec,0xfe,0x3c,0xdf,
-0xe0,0xe3,0xe3,0xeb,0xe5,0xe2,0xe3,0x01,0xce,0x01,0xc2,0x00,0x00,0x01,0x01,0xb9,
-0xfe,0x14,0x04,0xdb,0x06,0x14,0x00,0x05,0x00,0x00,0x01,0x21,0x09,0x01,0x21,0x01,
-0x04,0xdb,0xfe,0xdc,0xfe,0x02,0x01,0xfe,0x01,0x24,0xfe,0x00,0xfe,0x14,0x04,0x00,
-0x04,0x00,0xfc,0x00,0x00,0x01,0x01,0xdb,0xfe,0x14,0x04,0xfc,0x06,0x14,0x00,0x05,
-0x00,0x00,0x09,0x02,0x21,0x09,0x01,0x01,0xdb,0x01,0xff,0xfe,0x02,0x01,0x22,0x01,
-0xfe,0xfe,0x02,0xfe,0x14,0x04,0x00,0x04,0x00,0xfc,0x00,0xfc,0x00,0x00,0x00,0x01,
-0x01,0x23,0xfe,0x14,0x05,0x7b,0x06,0x14,0x00,0x05,0x00,0x00,0x01,0x21,0x09,0x01,
-0x21,0x01,0x05,0x7b,0xfe,0x3c,0xfd,0x6c,0x02,0x94,0x01,0xc4,0xfd,0x60,0xfe,0x14,
-0x04,0x00,0x04,0x00,0xfc,0x00,0x00,0x01,0x01,0x39,0xfe,0x14,0x05,0x91,0x06,0x14,
-0x00,0x05,0x00,0x00,0x09,0x02,0x21,0x09,0x01,0x01,0x39,0x02,0xa0,0xfd,0x60,0x01,
-0xc4,0x02,0x94,0xfd,0x6c,0xfe,0x14,0x04,0x00,0x04,0x00,0xfc,0x00,0xfc,0x00,0x00,
-0x00,0x01,0x01,0x55,0xfe,0x14,0x05,0x3f,0x06,0x14,0x00,0x05,0x00,0x00,0x01,0x21,
-0x09,0x01,0x21,0x01,0x05,0x3f,0xfe,0x14,0xfe,0x02,0x01,0xfe,0x01,0xec,0xfe,0x00,
-0xfe,0x14,0x04,0x00,0x04,0x00,0xfc,0x00,0x00,0x01,0x01,0x77,0xfe,0x14,0x05,0x60,
-0x06,0x14,0x00,0x05,0x00,0x00,0x09,0x02,0x21,0x09,0x01,0x01,0x77,0x01,0xff,0xfe,
-0x02,0x01,0xea,0x01,0xfe,0xfe,0x02,0xfe,0x14,0x04,0x00,0x04,0x00,0xfc,0x00,0xfc,
-0x00,0x00,0x00,0x01,0x02,0xc4,0xfe,0x13,0x04,0x48,0x06,0x14,0x00,0x07,0x00,0x00,
-0x05,0x17,0x07,0x01,0x11,0x01,0x17,0x07,0x03,0x5a,0xee,0x6a,0xfe,0xe6,0x01,0x1a,
-0x6a,0xee,0x95,0xee,0x6a,0x01,0x1a,0x05,0xcd,0x01,0x1a,0x6a,0xee,0x00,0x00,0x01,
-0x02,0x6c,0xfe,0x13,0x03,0xf0,0x06,0x14,0x00,0x07,0x00,0x00,0x01,0x27,0x37,0x01,
-0x11,0x01,0x27,0x37,0x03,0x5a,0xee,0x6a,0x01,0x1a,0xfe,0xe6,0x6a,0xee,0x04,0xbc,
-0xee,0x6a,0xfe,0xe6,0xfa,0x33,0xfe,0xe6,0x6a,0xee,0x00,0x01,0x01,0x66,0xfe,0xb2,
-0x05,0x13,0x06,0x14,0x00,0x24,0x00,0x00,0x05,0x15,0x23,0x22,0x26,0x3d,0x01,0x34,
-0x26,0x2b,0x01,0x35,0x33,0x32,0x36,0x3d,0x01,0x34,0x36,0x3b,0x01,0x15,0x23,0x22,
-0x06,0x1d,0x01,0x14,0x06,0x07,0x1e,0x01,0x1d,0x01,0x14,0x16,0x33,0x05,0x13,0xd4,
-0xf9,0xa9,0x6c,0x8e,0x3d,0x3d,0x8f,0x6b,0xa9,0xf9,0xd4,0x44,0x8d,0x56,0x5b,0x6e,
-0x6f,0x5a,0x56,0x8d,0xbe,0x90,0x94,0xdd,0xef,0x97,0x74,0x8f,0x73,0x95,0xf0,0xdd,
-0x93,0x8f,0x58,0x8d,0xf8,0x9d,0x8e,0x19,0x1b,0x8e,0x9c,0xf8,0x8d,0x58,0x00,0x01,
-0x01,0xa1,0xfe,0xb2,0x05,0x4e,0x06,0x14,0x00,0x28,0x00,0x00,0x05,0x33,0x32,0x36,
-0x3d,0x01,0x34,0x36,0x37,0x26,0x27,0x26,0x3d,0x01,0x34,0x26,0x2b,0x01,0x35,0x33,
-0x32,0x17,0x16,0x1d,0x01,0x14,0x17,0x16,0x3b,0x01,0x15,0x23,0x22,0x06,0x1d,0x01,
-0x14,0x07,0x06,0x2b,0x01,0x01,0xa1,0x44,0x8d,0x56,0x5a,0x6f,0x6e,0x2e,0x2d,0x56,
-0x8d,0x44,0xd4,0xf9,0x55,0x54,0x36,0x35,0x8f,0x3d,0x3d,0x8e,0x6c,0x54,0x55,0xf9,
-0xd4,0xbe,0x58,0x8d,0xf8,0x9c,0x8e,0x1b,0x19,0x47,0x47,0x9d,0xf8,0x8d,0x58,0x8f,
-0x4a,0x49,0xdd,0xf0,0x95,0x39,0x3a,0x8f,0x74,0x97,0xef,0xdd,0x4a,0x4a,0x00,0x02,
-0x00,0x98,0xff,0xec,0x06,0x94,0x05,0xe8,0x00,0x0d,0x00,0x18,0x00,0x1b,0x00,0xba,
-0x00,0x0e,0x00,0x03,0x00,0x03,0x2b,0xb8,0x00,0x0e,0x10,0xba,0x00,0x0a,0x00,0x13,
-0x00,0x03,0x2b,0xb8,0x00,0x0a,0x10,0x30,0x31,0x01,0x10,0x00,0x21,0x20,0x00,0x11,
-0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x01,0x21,0x35,0x23,0x11,0x23,0x05,0x15,0x37,
-0x11,0x23,0x06,0x94,0xfe,0x3f,0xfe,0xc2,0xfe,0xc4,0xfe,0x3f,0xce,0x01,0x71,0xbe,
-0xc1,0x01,0x71,0xcd,0xfb,0xd3,0x02,0x69,0xda,0xa1,0xfe,0xff,0xec,0xd9,0x02,0xea,
-0xfe,0xc1,0xfe,0x41,0x01,0xbf,0x01,0x3f,0xc6,0x01,0x72,0xc6,0xc6,0xfe,0x90,0xfd,
-0x5c,0x8e,0x03,0x1a,0x2f,0x98,0x2b,0xfd,0x82,0x00,0x00,0x02,0x00,0x98,0xff,0xec,
-0x06,0x94,0x05,0xe8,0x00,0x0d,0x00,0x2a,0x00,0x1b,0x00,0xba,0x00,0x25,0x00,0x03,
-0x00,0x03,0x2b,0xb8,0x00,0x25,0x10,0xba,0x00,0x0a,0x00,0x14,0x00,0x03,0x2b,0xb8,
-0x00,0x0a,0x10,0x30,0x31,0x01,0x10,0x00,0x21,0x20,0x00,0x11,0x34,0x12,0x24,0x33,
-0x32,0x04,0x12,0x05,0x3e,0x01,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x15,0x3e,0x01,
-0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x06,0x04,0x07,0x15,0x21,0x35,0x21,0x3e,0x01,
-0x06,0x94,0xfe,0x3f,0xfe,0xc2,0xfe,0xc4,0xfe,0x3f,0xce,0x01,0x71,0xbe,0xc1,0x01,
-0x71,0xcd,0xfd,0xe6,0x3e,0x30,0xc5,0xa3,0x3d,0x91,0x61,0x73,0x84,0x3b,0x4e,0x5f,
-0x2f,0x3e,0x21,0xfe,0xfa,0x52,0x02,0xa4,0xfe,0x4c,0x7d,0xb2,0x02,0xea,0xfe,0xc1,
-0xfe,0x41,0x01,0xbf,0x01,0x3f,0xc6,0x01,0x72,0xc6,0xc6,0xfe,0x90,0xe9,0x46,0x69,
-0x3a,0x7d,0x97,0x1f,0x24,0xab,0x3a,0x26,0x4e,0x3f,0x28,0x55,0x3f,0x22,0xf1,0x4d,
-0x81,0x8e,0x74,0xa7,0x00,0x02,0x00,0x98,0xff,0xec,0x06,0x94,0x05,0xe8,0x00,0x0d,
-0x00,0x36,0x00,0x99,0xba,0x00,0x00,0x00,0x0e,0x00,0x03,0x2b,0x41,0x05,0x00,0xea,
-0x00,0x0e,0x00,0xfa,0x00,0x0e,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,0x0e,0x00,
-0x29,0x00,0x0e,0x00,0x39,0x00,0x0e,0x00,0x49,0x00,0x0e,0x00,0x59,0x00,0x0e,0x00,
-0x69,0x00,0x0e,0x00,0x79,0x00,0x0e,0x00,0x89,0x00,0x0e,0x00,0x99,0x00,0x0e,0x00,
-0xa9,0x00,0x0e,0x00,0xb9,0x00,0x0e,0x00,0xc9,0x00,0x0e,0x00,0xd9,0x00,0x0e,0x00,
-0x0d,0x5d,0xb8,0x00,0x31,0xdc,0x00,0xba,0x00,0x2e,0x00,0x03,0x00,0x03,0x2b,0xb8,
-0x00,0x2e,0x10,0xba,0x00,0x0a,0x00,0x11,0x00,0x03,0x2b,0xb8,0x00,0x0a,0x10,0xba,
-0x00,0x21,0x00,0x27,0x00,0x03,0x2b,0xb8,0x00,0x21,0x10,0xba,0x00,0x18,0x00,0x1e,
-0x00,0x03,0x2b,0xb8,0x00,0x18,0x10,0xba,0x00,0x15,0x00,0x1e,0x00,0x18,0x11,0x12,
-0x39,0xba,0x00,0x2a,0x00,0x27,0x00,0x21,0x11,0x12,0x39,0x30,0x31,0x01,0x10,0x00,
-0x21,0x20,0x00,0x11,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x25,0x34,0x26,0x23,0x22,
-0x06,0x07,0x15,0x3e,0x01,0x33,0x32,0x16,0x15,0x14,0x06,0x2b,0x01,0x15,0x33,0x32,
-0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x15,0x1e,0x01,0x33,0x32,0x36,0x35,0x34,
-0x26,0x27,0x32,0x36,0x06,0x94,0xfe,0x3f,0xfe,0xc2,0xfe,0xc4,0xfe,0x3f,0xce,0x01,
-0x71,0xbe,0xc1,0x01,0x71,0xcd,0xfe,0x7c,0xc1,0xa1,0x3d,0x88,0x5f,0x6b,0x79,0x34,
-0x5b,0x5c,0x58,0x5a,0x91,0x8c,0x63,0x6b,0x73,0x75,0x44,0x7d,0x5b,0x58,0x88,0x40,
-0xc3,0xd8,0x76,0x0d,0x04,0x68,0x02,0xea,0xfe,0xc1,0xfe,0x41,0x01,0xbf,0x01,0x3f,
-0xc6,0x01,0x72,0xc6,0xc6,0xfe,0x90,0x18,0x73,0x89,0x14,0x18,0x97,0x20,0x15,0x3f,
-0x3c,0x3a,0x3c,0x8c,0x4e,0x47,0x4c,0x4f,0x1c,0x30,0xa8,0x1b,0x17,0x9c,0x8d,0x5d,
-0x81,0x03,0x72,0x00,0x00,0x03,0x00,0x98,0xff,0xec,0x06,0x94,0x05,0xe8,0x00,0x0d,
-0x00,0x10,0x00,0x1b,0x00,0x1b,0x00,0xba,0x00,0x14,0x00,0x03,0x00,0x03,0x2b,0xb8,
-0x00,0x14,0x10,0xba,0x00,0x0a,0x00,0x1b,0x00,0x03,0x2b,0xb8,0x00,0x0a,0x10,0x30,
-0x31,0x01,0x10,0x00,0x21,0x20,0x00,0x11,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x01,
-0x21,0x09,0x01,0x15,0x21,0x15,0x33,0x35,0x33,0x35,0x23,0x11,0x23,0x06,0x94,0xfe,
-0x3f,0xfe,0xc2,0xfe,0xc4,0xfe,0x3f,0xce,0x01,0x71,0xbe,0xc1,0x01,0x71,0xcd,0xfd,
-0x16,0xfe,0xf3,0x01,0x0d,0xfe,0x43,0x01,0xbd,0xb6,0x8d,0x8d,0xce,0x02,0xea,0xfe,
-0xc1,0xfe,0x41,0x01,0xbf,0x01,0x3f,0xc6,0x01,0x72,0xc6,0xc6,0xfe,0x90,0xfe,0xbc,
-0x01,0x7e,0xfe,0x83,0x8e,0xd3,0xd3,0x8d,0x02,0x48,0x00,0x02,0x00,0x98,0xff,0xec,
-0x06,0x94,0x05,0xe8,0x00,0x0d,0x00,0x2b,0x00,0x8b,0xba,0x00,0x00,0x00,0x21,0x00,
-0x03,0x2b,0x41,0x05,0x00,0xea,0x00,0x21,0x00,0xfa,0x00,0x21,0x00,0x02,0x5d,0x41,
-0x1b,0x00,0x19,0x00,0x21,0x00,0x29,0x00,0x21,0x00,0x39,0x00,0x21,0x00,0x49,0x00,
-0x21,0x00,0x59,0x00,0x21,0x00,0x69,0x00,0x21,0x00,0x79,0x00,0x21,0x00,0x89,0x00,
-0x21,0x00,0x99,0x00,0x21,0x00,0xa9,0x00,0x21,0x00,0xb9,0x00,0x21,0x00,0xc9,0x00,
-0x21,0x00,0xd9,0x00,0x21,0x00,0x0d,0x5d,0x00,0xba,0x00,0x1e,0x00,0x03,0x00,0x03,
-0x2b,0xb8,0x00,0x1e,0x10,0xba,0x00,0x0a,0x00,0x2b,0x00,0x03,0x2b,0xb8,0x00,0x0a,
-0x10,0xba,0x00,0x11,0x00,0x17,0x00,0x03,0x2b,0xb8,0x00,0x11,0x10,0xba,0x00,0x28,
-0x00,0x24,0x00,0x03,0x2b,0xb8,0x00,0x28,0x10,0xba,0x00,0x1a,0x00,0x17,0x00,0x11,
-0x11,0x12,0x39,0x30,0x31,0x01,0x10,0x00,0x21,0x20,0x00,0x11,0x34,0x12,0x24,0x33,
-0x32,0x04,0x12,0x05,0x3e,0x01,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,
-0x15,0x1e,0x01,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x37,0x35,0x21,0x35,
-0x21,0x06,0x94,0xfe,0x3f,0xfe,0xc2,0xfe,0xc4,0xfe,0x3f,0xce,0x01,0x71,0xbe,0xc1,
-0x01,0x71,0xcd,0xfb,0xef,0x59,0x65,0x32,0x68,0x76,0x76,0x68,0x44,0x77,0x5f,0x58,
-0x85,0x40,0xbe,0xd5,0xcf,0xb0,0x1f,0x3f,0x03,0x01,0x91,0xfd,0xc3,0x02,0xea,0xfe,
-0xc1,0xfe,0x41,0x01,0xbf,0x01,0x3f,0xc6,0x01,0x72,0xc6,0xc6,0xfe,0x90,0xf3,0x25,
-0x14,0x61,0x56,0x55,0x61,0x1b,0x2f,0xac,0x18,0x14,0xac,0x98,0x95,0xb0,0x0a,0x01,
-0xab,0x8e,0x00,0x03,0x00,0x98,0xff,0xec,0x06,0x94,0x05,0xe8,0x00,0x0d,0x00,0x19,
-0x00,0x32,0x00,0xf1,0xb8,0x00,0x33,0x2f,0xb8,0x00,0x34,0x2f,0xb8,0x00,0x33,0x10,
-0xb8,0x00,0x06,0xd0,0xb8,0x00,0x06,0x2f,0xb8,0x00,0x34,0x10,0xb8,0x00,0x0e,0xdc,
-0xb8,0x00,0x14,0xdc,0x41,0x05,0x00,0xea,0x00,0x14,0x00,0xfa,0x00,0x14,0x00,0x02,
-0x5d,0x41,0x1b,0x00,0x19,0x00,0x14,0x00,0x29,0x00,0x14,0x00,0x39,0x00,0x14,0x00,
-0x49,0x00,0x14,0x00,0x59,0x00,0x14,0x00,0x69,0x00,0x14,0x00,0x79,0x00,0x14,0x00,
-0x89,0x00,0x14,0x00,0x99,0x00,0x14,0x00,0xa9,0x00,0x14,0x00,0xb9,0x00,0x14,0x00,
-0xc9,0x00,0x14,0x00,0xd9,0x00,0x14,0x00,0x0d,0x5d,0xb8,0x00,0x06,0x10,0xb8,0x00,
-0x1d,0xdc,0x41,0x1b,0x00,0x16,0x00,0x1d,0x00,0x26,0x00,0x1d,0x00,0x36,0x00,0x1d,
-0x00,0x46,0x00,0x1d,0x00,0x56,0x00,0x1d,0x00,0x66,0x00,0x1d,0x00,0x76,0x00,0x1d,
-0x00,0x86,0x00,0x1d,0x00,0x96,0x00,0x1d,0x00,0xa6,0x00,0x1d,0x00,0xb6,0x00,0x1d,
-0x00,0xc6,0x00,0x1d,0x00,0xd6,0x00,0x1d,0x00,0x0d,0x5d,0x41,0x05,0x00,0xe5,0x00,
-0x1d,0x00,0xf5,0x00,0x1d,0x00,0x02,0x5d,0x00,0xba,0x00,0x20,0x00,0x03,0x00,0x03,
-0x2b,0xb8,0x00,0x20,0x10,0xba,0x00,0x0a,0x00,0x1a,0x00,0x03,0x2b,0xb8,0x00,0x0a,
-0x10,0xba,0x00,0x17,0x00,0x11,0x00,0x03,0x2b,0xb8,0x00,0x17,0x10,0xba,0x00,0x2c,
-0x00,0x26,0x00,0x03,0x2b,0xb8,0x00,0x2c,0x10,0xba,0x00,0x2f,0x00,0x26,0x00,0x2c,
-0x11,0x12,0x39,0x30,0x31,0x01,0x10,0x00,0x21,0x20,0x00,0x11,0x34,0x12,0x24,0x33,
-0x32,0x04,0x12,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x03,
-0x22,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x37,0x3e,
-0x01,0x33,0x32,0x16,0x17,0x35,0x2e,0x01,0x06,0x94,0xfe,0x3f,0xfe,0xc2,0xfe,0xc4,
-0xfe,0x3f,0xce,0x01,0x71,0xbe,0xc1,0x01,0x71,0xcd,0xfd,0xa2,0x5c,0x4e,0x4e,0x5c,
-0x5c,0x4e,0x4e,0x5c,0x71,0xc8,0xea,0xc0,0xb9,0xa0,0xc2,0xba,0xa0,0x4e,0x80,0x09,
-0x05,0x7f,0x77,0x2f,0x61,0x54,0x4a,0x6a,0x02,0xea,0xfe,0xc1,0xfe,0x41,0x01,0xbf,
-0x01,0x3f,0xc6,0x01,0x72,0xc6,0xc6,0xfe,0x90,0xfe,0x8f,0x5a,0x62,0x62,0x5a,0x5b,
-0x62,0x62,0x02,0x2a,0xfe,0xf5,0xda,0xe7,0xfd,0xb3,0x91,0x94,0xb1,0x3d,0x0b,0x50,
-0x94,0x16,0x23,0x9c,0x18,0x13,0x00,0x02,0x00,0x98,0xff,0xec,0x06,0x94,0x05,0xe8,
-0x00,0x0d,0x00,0x14,0x00,0x1b,0x00,0xba,0x00,0x11,0x00,0x03,0x00,0x03,0x2b,0xb8,
-0x00,0x11,0x10,0xba,0x00,0x0a,0x00,0x14,0x00,0x03,0x2b,0xb8,0x00,0x0a,0x10,0x30,
-0x31,0x01,0x10,0x00,0x21,0x20,0x00,0x11,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x25,
-0x21,0x01,0x33,0x01,0x35,0x21,0x06,0x94,0xfe,0x3f,0xfe,0xc2,0xfe,0xc4,0xfe,0x3f,
-0xce,0x01,0x71,0xbe,0xc1,0x01,0x71,0xcd,0xfb,0xc2,0x01,0xcf,0xfe,0xaf,0xc1,0x01,
-0x6c,0xfd,0x55,0x02,0xea,0xfe,0xc1,0xfe,0x41,0x01,0xbf,0x01,0x3f,0xc6,0x01,0x72,
-0xc6,0xc6,0xfe,0x90,0x76,0xfc,0xe6,0x03,0x5d,0x4b,0x00,0x04,0x00,0x98,0xff,0xec,
-0x06,0x94,0x05,0xe8,0x00,0x0d,0x00,0x19,0x00,0x31,0x00,0x3d,0x01,0x8b,0xba,0x00,
-0x1a,0x00,0x06,0x00,0x03,0x2b,0xb8,0x00,0x1a,0x10,0xba,0x00,0x0e,0x00,0x14,0x00,
-0x03,0x2b,0xb8,0x00,0x0e,0x10,0xba,0x00,0x00,0x00,0x20,0x00,0x03,0x2b,0xb8,0x00,
-0x00,0x10,0x41,0x05,0x00,0xea,0x00,0x14,0x00,0xfa,0x00,0x14,0x00,0x02,0x5d,0x41,
-0x1b,0x00,0x19,0x00,0x14,0x00,0x29,0x00,0x14,0x00,0x39,0x00,0x14,0x00,0x49,0x00,
-0x14,0x00,0x59,0x00,0x14,0x00,0x69,0x00,0x14,0x00,0x79,0x00,0x14,0x00,0x89,0x00,
-0x14,0x00,0x99,0x00,0x14,0x00,0xa9,0x00,0x14,0x00,0xb9,0x00,0x14,0x00,0xc9,0x00,
-0x14,0x00,0xd9,0x00,0x14,0x00,0x0d,0x5d,0x41,0x1b,0x00,0x16,0x00,0x1a,0x00,0x26,
-0x00,0x1a,0x00,0x36,0x00,0x1a,0x00,0x46,0x00,0x1a,0x00,0x56,0x00,0x1a,0x00,0x66,
-0x00,0x1a,0x00,0x76,0x00,0x1a,0x00,0x86,0x00,0x1a,0x00,0x96,0x00,0x1a,0x00,0xa6,
-0x00,0x1a,0x00,0xb6,0x00,0x1a,0x00,0xc6,0x00,0x1a,0x00,0xd6,0x00,0x1a,0x00,0x0d,
-0x5d,0x41,0x05,0x00,0xe5,0x00,0x1a,0x00,0xf5,0x00,0x1a,0x00,0x02,0x5d,0x41,0x05,
-0x00,0xea,0x00,0x20,0x00,0xfa,0x00,0x20,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,
-0x20,0x00,0x29,0x00,0x20,0x00,0x39,0x00,0x20,0x00,0x49,0x00,0x20,0x00,0x59,0x00,
-0x20,0x00,0x69,0x00,0x20,0x00,0x79,0x00,0x20,0x00,0x89,0x00,0x20,0x00,0x99,0x00,
-0x20,0x00,0xa9,0x00,0x20,0x00,0xb9,0x00,0x20,0x00,0xc9,0x00,0x20,0x00,0xd9,0x00,
-0x20,0x00,0x0d,0x5d,0xba,0x00,0x2f,0x00,0x06,0x00,0x00,0x11,0x12,0x39,0xba,0x00,
-0x3b,0x00,0x14,0x00,0x0e,0x11,0x12,0x39,0xb8,0x00,0x3b,0x2f,0x41,0x05,0x00,0xea,
-0x00,0x3b,0x00,0xfa,0x00,0x3b,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,0x3b,0x00,
-0x29,0x00,0x3b,0x00,0x39,0x00,0x3b,0x00,0x49,0x00,0x3b,0x00,0x59,0x00,0x3b,0x00,
-0x69,0x00,0x3b,0x00,0x79,0x00,0x3b,0x00,0x89,0x00,0x3b,0x00,0x99,0x00,0x3b,0x00,
-0xa9,0x00,0x3b,0x00,0xb9,0x00,0x3b,0x00,0xc9,0x00,0x3b,0x00,0xd9,0x00,0x3b,0x00,
-0x0d,0x5d,0xb8,0x00,0x35,0xdc,0x00,0xba,0x00,0x1d,0x00,0x03,0x00,0x03,0x2b,0xb8,
-0x00,0x1d,0x10,0xba,0x00,0x0a,0x00,0x29,0x00,0x03,0x2b,0xb8,0x00,0x0a,0x10,0xba,
-0x00,0x17,0x00,0x11,0x00,0x03,0x2b,0xb8,0x00,0x17,0x10,0xba,0x00,0x32,0x00,0x38,
-0x00,0x03,0x2b,0xb8,0x00,0x32,0x10,0x30,0x31,0x01,0x10,0x00,0x21,0x20,0x00,0x11,
-0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,
-0x33,0x32,0x16,0x05,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x3e,0x01,0x35,
-0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x0e,0x01,0x01,0x32,0x16,0x15,0x14,
-0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x06,0x94,0xfe,0x3f,0xfe,0xc2,0xfe,0xc4,0xfe,
-0x3f,0xce,0x01,0x71,0xbe,0xc1,0x01,0x71,0xcd,0xfd,0xb9,0x5f,0x54,0x54,0x5f,0x5f,
-0x54,0x54,0x5f,0xfd,0xe2,0xbe,0xad,0xad,0xbe,0x76,0x0f,0x04,0x69,0xb6,0x9d,0x9d,
-0xb7,0x6a,0x04,0x0f,0x76,0x01,0x6b,0x4b,0x52,0x52,0x4b,0x4d,0x51,0x51,0x02,0xea,
-0xfe,0xc1,0xfe,0x41,0x01,0xbf,0x01,0x3f,0xc6,0x01,0x72,0xc6,0xc6,0xfe,0x90,0xfe,
-0x6c,0x48,0x51,0x50,0x49,0x49,0x50,0x50,0x49,0x8a,0x97,0x97,0x8a,0x5c,0x83,0x03,
-0x01,0x76,0x53,0x74,0x88,0x88,0x74,0x53,0x76,0x01,0x03,0x83,0x01,0xc4,0x42,0x3e,
-0x3d,0x42,0x42,0x3d,0x3e,0x42,0x00,0x03,0x00,0x98,0xff,0xec,0x06,0x94,0x05,0xe8,
-0x00,0x0d,0x00,0x26,0x00,0x32,0x00,0xe9,0xb8,0x00,0x33,0x2f,0xb8,0x00,0x34,0x2f,
-0xb8,0x00,0x00,0xdc,0xb8,0x00,0x11,0xdc,0x41,0x05,0x00,0xea,0x00,0x11,0x00,0xfa,
-0x00,0x11,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,0x11,0x00,0x29,0x00,0x11,0x00,
-0x39,0x00,0x11,0x00,0x49,0x00,0x11,0x00,0x59,0x00,0x11,0x00,0x69,0x00,0x11,0x00,
-0x79,0x00,0x11,0x00,0x89,0x00,0x11,0x00,0x99,0x00,0x11,0x00,0xa9,0x00,0x11,0x00,
-0xb9,0x00,0x11,0x00,0xc9,0x00,0x11,0x00,0xd9,0x00,0x11,0x00,0x0d,0x5d,0xb8,0x00,
-0x33,0x10,0xb8,0x00,0x27,0xd0,0xb8,0x00,0x27,0x2f,0xb8,0x00,0x2d,0xdc,0x41,0x1b,
-0x00,0x16,0x00,0x2d,0x00,0x26,0x00,0x2d,0x00,0x36,0x00,0x2d,0x00,0x46,0x00,0x2d,
-0x00,0x56,0x00,0x2d,0x00,0x66,0x00,0x2d,0x00,0x76,0x00,0x2d,0x00,0x86,0x00,0x2d,
-0x00,0x96,0x00,0x2d,0x00,0xa6,0x00,0x2d,0x00,0xb6,0x00,0x2d,0x00,0xc6,0x00,0x2d,
-0x00,0xd6,0x00,0x2d,0x00,0x0d,0x5d,0x41,0x05,0x00,0xe5,0x00,0x2d,0x00,0xf5,0x00,
-0x2d,0x00,0x02,0x5d,0x00,0xba,0x00,0x0e,0x00,0x03,0x00,0x03,0x2b,0xb8,0x00,0x0e,
-0x10,0xba,0x00,0x0a,0x00,0x14,0x00,0x03,0x2b,0xb8,0x00,0x0a,0x10,0xba,0x00,0x1a,
-0x00,0x20,0x00,0x03,0x2b,0xb8,0x00,0x1a,0x10,0xba,0x00,0x2a,0x00,0x30,0x00,0x03,
-0x2b,0xb8,0x00,0x2a,0x10,0xba,0x00,0x23,0x00,0x20,0x00,0x1a,0x11,0x12,0x39,0x30,
-0x31,0x01,0x10,0x00,0x21,0x20,0x00,0x11,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x01,
-0x32,0x12,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x07,0x0e,
-0x01,0x23,0x22,0x26,0x27,0x15,0x1e,0x01,0x03,0x34,0x36,0x33,0x32,0x16,0x15,0x14,
-0x06,0x23,0x22,0x26,0x06,0x94,0xfe,0x3f,0xfe,0xc2,0xfe,0xc4,0xfe,0x3f,0xce,0x01,
-0x71,0xbe,0xc1,0x01,0x71,0xcd,0xfc,0xd1,0xc8,0xe9,0xbf,0xb9,0xa0,0xc2,0xba,0x9f,
-0x4f,0x80,0x0a,0x05,0x7f,0x77,0x2e,0x61,0x55,0x4a,0x6b,0x3c,0x5c,0x4e,0x4e,0x5b,
-0x5b,0x4e,0x4e,0x5c,0x02,0xea,0xfe,0xc1,0xfe,0x41,0x01,0xbf,0x01,0x3f,0xc6,0x01,
-0x72,0xc6,0xc6,0xfe,0x90,0xfd,0x4b,0x01,0x0a,0xda,0xe8,0xfd,0xb4,0x91,0x94,0xaf,
-0x3c,0x0d,0x4f,0x93,0x15,0x24,0x9c,0x18,0x13,0x02,0x84,0x5b,0x62,0x62,0x5b,0x5b,
-0x62,0x62,0x00,0x04,0x00,0x98,0xff,0xec,0x06,0x94,0x05,0xe8,0x00,0x0d,0x00,0x18,
-0x00,0x24,0x00,0x30,0x00,0xd3,0xba,0x00,0x25,0x00,0x11,0x00,0x03,0x2b,0xb8,0x00,
-0x25,0x10,0xba,0x00,0x19,0x00,0x1f,0x00,0x03,0x2b,0xb8,0x00,0x19,0x10,0xba,0x00,
-0x00,0x00,0x2b,0x00,0x03,0x2b,0xb8,0x00,0x00,0x10,0x41,0x05,0x00,0xea,0x00,0x1f,
-0x00,0xfa,0x00,0x1f,0x00,0x02,0x5d,0x41,0x1b,0x00,0x19,0x00,0x1f,0x00,0x29,0x00,
-0x1f,0x00,0x39,0x00,0x1f,0x00,0x49,0x00,0x1f,0x00,0x59,0x00,0x1f,0x00,0x69,0x00,
-0x1f,0x00,0x79,0x00,0x1f,0x00,0x89,0x00,0x1f,0x00,0x99,0x00,0x1f,0x00,0xa9,0x00,
-0x1f,0x00,0xb9,0x00,0x1f,0x00,0xc9,0x00,0x1f,0x00,0xd9,0x00,0x1f,0x00,0x0d,0x5d,
-0x41,0x05,0x00,0xea,0x00,0x2b,0x00,0xfa,0x00,0x2b,0x00,0x02,0x5d,0x41,0x1b,0x00,
-0x19,0x00,0x2b,0x00,0x29,0x00,0x2b,0x00,0x39,0x00,0x2b,0x00,0x49,0x00,0x2b,0x00,
-0x59,0x00,0x2b,0x00,0x69,0x00,0x2b,0x00,0x79,0x00,0x2b,0x00,0x89,0x00,0x2b,0x00,
-0x99,0x00,0x2b,0x00,0xa9,0x00,0x2b,0x00,0xb9,0x00,0x2b,0x00,0xc9,0x00,0x2b,0x00,
-0xd9,0x00,0x2b,0x00,0x0d,0x5d,0x00,0xba,0x00,0x0f,0x00,0x03,0x00,0x03,0x2b,0xb8,
-0x00,0x0f,0x10,0xba,0x00,0x0a,0x00,0x2e,0x00,0x03,0x2b,0xb8,0x00,0x0a,0x10,0xb8,
-0x00,0x03,0x10,0xb8,0x00,0x28,0xdc,0x30,0x31,0x01,0x10,0x00,0x21,0x20,0x00,0x11,
-0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x01,0x21,0x35,0x23,0x11,0x23,0x07,0x15,0x37,
-0x11,0x23,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x05,0x14,
-0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x06,0x94,0xfe,0x3f,0xfe,0xc2,
-0xfe,0xc4,0xfe,0x3f,0xce,0x01,0x71,0xbe,0xc1,0x01,0x71,0xcd,0xfb,0x24,0x01,0xc2,
-0x9f,0x75,0xbc,0xac,0x9e,0x03,0x89,0x46,0x3f,0x40,0x45,0x45,0x40,0x3f,0x46,0xfe,
-0x70,0x88,0x83,0x82,0x88,0x88,0x82,0x83,0x88,0x02,0xea,0xfe,0xc1,0xfe,0x41,0x01,
-0xbf,0x01,0x3f,0xc6,0x01,0x72,0xc6,0xc6,0xfe,0x90,0xfd,0xa9,0x80,0x02,0xca,0x2a,
-0x89,0x27,0xfd,0xc2,0x01,0x24,0xa2,0x97,0x97,0xa2,0xa3,0x97,0x97,0xa3,0xd0,0xe4,
-0xe4,0xd0,0xd1,0xe4,0xe4,0x00,0x00,0x03,0x00,0x09,0xff,0x96,0x06,0xab,0x06,0x3d,
-0x00,0x1d,0x00,0x28,0x00,0x46,0x00,0x00,0x00,0x20,0x07,0x06,0x07,0x06,0x07,0x06,
-0x15,0x14,0x17,0x16,0x17,0x16,0x17,0x16,0x20,0x37,0x36,0x37,0x36,0x37,0x36,0x35,
-0x34,0x27,0x26,0x27,0x26,0x27,0x01,0x21,0x11,0x05,0x35,0x25,0x33,0x11,0x21,0x15,
-0x21,0x12,0x20,0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x07,
-0x06,0x20,0x27,0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x37,0x03,
-0xf4,0xfe,0xcc,0x86,0x84,0x6d,0x6f,0x35,0x38,0x38,0x35,0x6f,0x6d,0x84,0x86,0x01,
-0x34,0x86,0x84,0x6d,0x6f,0x35,0x38,0x38,0x35,0x6f,0x6d,0x84,0xfd,0xa5,0x01,0x08,
-0xfe,0xe1,0x01,0x1e,0xa1,0x01,0x08,0xfd,0x50,0x8d,0x01,0x5c,0x98,0x96,0x7c,0x7e,
-0x3c,0x3f,0x3f,0x3c,0x7e,0x7c,0x96,0x98,0xfe,0xa4,0x98,0x96,0x7c,0x7e,0x3c,0x3f,
-0x3f,0x3c,0x7e,0x7c,0x96,0x05,0xd9,0x39,0x36,0x6f,0x6f,0x83,0x86,0x9c,0x97,0x86,
-0x83,0x6f,0x6f,0x36,0x39,0x39,0x36,0x6f,0x6f,0x83,0x86,0x97,0x9c,0x86,0x83,0x6f,
-0x6f,0x36,0xfb,0x7d,0x03,0x8f,0x39,0x93,0x3a,0xfb,0xdd,0x88,0x05,0xa8,0x40,0x3e,
-0x7d,0x7e,0x95,0x97,0xb1,0xac,0x97,0x95,0x7e,0x7d,0x3e,0x40,0x40,0x3e,0x7d,0x7e,
-0x95,0x97,0xac,0xb1,0x97,0x95,0x7e,0x7d,0x3e,0x00,0x00,0x03,0x00,0x09,0xff,0x96,
-0x06,0xab,0x06,0x3d,0x00,0x1d,0x00,0x41,0x00,0x5f,0x00,0x00,0x00,0x20,0x07,0x06,
-0x07,0x06,0x07,0x06,0x15,0x14,0x17,0x16,0x17,0x16,0x17,0x16,0x20,0x37,0x36,0x37,
-0x36,0x37,0x36,0x35,0x34,0x27,0x26,0x27,0x26,0x27,0x01,0x21,0x15,0x21,0x35,0x36,
-0x37,0x36,0x37,0x36,0x37,0x36,0x35,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x07,0x35,
-0x3e,0x01,0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x07,0x06,0x02,0x20,
-0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x07,0x06,0x20,0x27,
-0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x37,0x03,0xf4,0xfe,0xcc,
-0x86,0x84,0x6d,0x6f,0x35,0x38,0x38,0x35,0x6f,0x6d,0x84,0x86,0x01,0x34,0x86,0x84,
-0x6d,0x6f,0x35,0x38,0x38,0x35,0x6f,0x6d,0x84,0xfe,0x29,0x02,0x34,0xfd,0x0a,0x5c,
-0x9f,0x9e,0x29,0x4e,0x1f,0x1e,0x42,0x43,0x6b,0x50,0x51,0x54,0x60,0x61,0xaa,0x46,
-0xba,0x6e,0x6f,0x1c,0x1b,0x49,0x14,0x6b,0x6c,0xba,0x01,0x5c,0x98,0x96,0x7c,0x7e,
-0x3c,0x3f,0x3f,0x3c,0x7e,0x7c,0x96,0x98,0xfe,0xa4,0x98,0x96,0x7c,0x7e,0x3c,0x3f,
-0x3f,0x3c,0x7e,0x7c,0x96,0x05,0xd9,0x39,0x36,0x6f,0x6f,0x83,0x86,0x9c,0x97,0x86,
-0x83,0x6f,0x6f,0x36,0x39,0x39,0x36,0x6f,0x6f,0x83,0x86,0x97,0x9c,0x86,0x83,0x6f,
-0x6f,0x36,0xfb,0x80,0x88,0x88,0x5f,0xa1,0xa0,0x2e,0x58,0x3c,0x3c,0x3b,0x5f,0x3c,
-0x3c,0x1a,0x1b,0x35,0xa3,0x27,0x28,0x5d,0x5d,0x9b,0x49,0x42,0x42,0x5a,0x17,0x6f,
-0x6f,0x04,0x56,0x40,0x3e,0x7d,0x7e,0x95,0x97,0xb1,0xac,0x97,0x95,0x7e,0x7d,0x3e,
-0x40,0x40,0x3e,0x7d,0x7e,0x95,0x97,0xac,0xb1,0x97,0x95,0x7e,0x7d,0x3e,0x00,0x03,
-0x00,0x09,0xff,0x96,0x06,0xab,0x06,0x3d,0x00,0x1d,0x00,0x4f,0x00,0x6d,0x00,0x00,
-0x00,0x20,0x07,0x06,0x07,0x06,0x07,0x06,0x15,0x14,0x17,0x16,0x17,0x16,0x17,0x16,
-0x20,0x37,0x36,0x37,0x36,0x37,0x36,0x35,0x34,0x27,0x26,0x27,0x26,0x27,0x03,0x16,
-0x17,0x16,0x15,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x35,0x1e,0x01,0x33,0x32,
-0x37,0x36,0x35,0x34,0x27,0x26,0x2b,0x01,0x35,0x33,0x32,0x37,0x36,0x35,0x34,0x26,
-0x23,0x22,0x07,0x06,0x07,0x35,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x14,0x06,
-0x00,0x20,0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x07,0x06,
-0x20,0x27,0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x37,0x03,0xf4,
-0xfe,0xcc,0x86,0x84,0x6d,0x6f,0x35,0x38,0x38,0x35,0x6f,0x6d,0x84,0x86,0x01,0x34,
-0x86,0x84,0x6d,0x6f,0x35,0x38,0x38,0x35,0x6f,0x6d,0x84,0x74,0x74,0x42,0x41,0x7a,
-0x79,0xe0,0x4c,0x4f,0x50,0x55,0x44,0xa0,0x57,0x98,0x4f,0x50,0x4a,0x4a,0x84,0x8b,
-0x91,0x78,0x3f,0x3f,0x82,0x7a,0x42,0x4c,0x4c,0x5c,0x52,0x5b,0x50,0x47,0xba,0x6a,
-0x6b,0x72,0xfe,0x3d,0x01,0x5c,0x98,0x96,0x7c,0x7e,0x3c,0x3f,0x3f,0x3c,0x7e,0x7c,
-0x96,0x98,0xfe,0xa4,0x98,0x96,0x7c,0x7e,0x3c,0x3f,0x3f,0x3c,0x7e,0x7c,0x96,0x05,
-0xd9,0x39,0x36,0x6f,0x6f,0x83,0x86,0x9c,0x97,0x86,0x83,0x6f,0x6f,0x36,0x39,0x39,
-0x36,0x6f,0x6f,0x83,0x86,0x97,0x9c,0x86,0x83,0x6f,0x6f,0x36,0xfd,0x79,0x19,0x4e,
-0x4e,0x74,0xb0,0x61,0x61,0x0f,0x0f,0x1d,0x9c,0x27,0x28,0x3c,0x3c,0x72,0x6a,0x3c,
-0x3b,0x85,0x30,0x2f,0x5a,0x5c,0x62,0x0e,0x0f,0x1e,0x90,0x17,0x0f,0x0d,0x53,0x54,
-0x8e,0x64,0x88,0x03,0x09,0x40,0x3e,0x7d,0x7e,0x95,0x97,0xb1,0xac,0x97,0x95,0x7e,
-0x7d,0x3e,0x40,0x40,0x3e,0x7d,0x7e,0x95,0x97,0xac,0xb1,0x97,0x95,0x7e,0x7d,0x3e,
-0x00,0x04,0x00,0x09,0xff,0x96,0x06,0xab,0x06,0x3d,0x00,0x1d,0x00,0x20,0x00,0x2b,
-0x00,0x49,0x00,0x00,0x00,0x20,0x07,0x06,0x07,0x06,0x07,0x06,0x15,0x14,0x17,0x16,
-0x17,0x16,0x17,0x16,0x20,0x37,0x36,0x37,0x36,0x37,0x36,0x35,0x34,0x27,0x26,0x27,
-0x26,0x27,0x07,0x01,0x21,0x03,0x33,0x11,0x33,0x15,0x23,0x11,0x23,0x11,0x21,0x35,
-0x00,0x20,0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x07,0x06,
-0x20,0x27,0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x37,0x03,0xf4,
-0xfe,0xcc,0x86,0x84,0x6d,0x6f,0x35,0x38,0x38,0x35,0x6f,0x6d,0x84,0x86,0x01,0x34,
-0x86,0x84,0x6d,0x6f,0x35,0x38,0x38,0x35,0x6f,0x6d,0x84,0xde,0xfe,0x68,0x01,0x98,
-0x2a,0xcb,0xaa,0xaa,0xa1,0xfd,0xe5,0x01,0x2b,0x01,0x5c,0x98,0x96,0x7c,0x7e,0x3c,
-0x3f,0x3f,0x3c,0x7e,0x7c,0x96,0x98,0xfe,0xa4,0x98,0x96,0x7c,0x7e,0x3c,0x3f,0x3f,
-0x3c,0x7e,0x7c,0x96,0x05,0xd9,0x39,0x36,0x6f,0x6f,0x83,0x86,0x9c,0x97,0x86,0x83,
-0x6f,0x6f,0x36,0x39,0x39,0x36,0x6f,0x6f,0x83,0x86,0x97,0x9c,0x86,0x83,0x6f,0x6f,
-0x36,0xed,0xfd,0x82,0x03,0x0b,0xfc,0xf5,0x86,0xfe,0xe6,0x01,0x1a,0x9c,0x03,0xf2,
-0x40,0x3e,0x7d,0x7e,0x95,0x97,0xb1,0xac,0x97,0x95,0x7e,0x7d,0x3e,0x40,0x40,0x3e,
-0x7d,0x7e,0x95,0x97,0xac,0xb1,0x97,0x95,0x7e,0x7d,0x3e,0x00,0x00,0x03,0x00,0x09,
-0xff,0x96,0x06,0xab,0x06,0x3d,0x00,0x1d,0x00,0x3f,0x00,0x5d,0x00,0x00,0x00,0x20,
-0x07,0x06,0x07,0x06,0x07,0x06,0x15,0x14,0x17,0x16,0x17,0x16,0x17,0x16,0x20,0x37,
-0x36,0x37,0x36,0x37,0x36,0x35,0x34,0x27,0x26,0x27,0x26,0x27,0x05,0x21,0x15,0x21,
-0x11,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x35,
-0x16,0x17,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x06,0x07,0x12,0x20,
-0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x07,0x06,0x20,0x27,
-0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x37,0x03,0xf4,0xfe,0xcc,
-0x86,0x84,0x6d,0x6f,0x35,0x38,0x38,0x35,0x6f,0x6d,0x84,0x86,0x01,0x34,0x86,0x84,
-0x6d,0x6f,0x35,0x38,0x38,0x35,0x6f,0x6d,0x84,0xfd,0xa3,0x02,0x7a,0xfe,0x1a,0x23,
-0x23,0x24,0x23,0xc8,0x75,0x74,0xf0,0xda,0x4b,0x9c,0x53,0x4c,0x48,0x4d,0x56,0x8a,
-0xa2,0xa2,0x8a,0x41,0x40,0x41,0x43,0x8f,0x01,0x5c,0x98,0x96,0x7c,0x7e,0x3c,0x3f,
-0x3f,0x3c,0x7e,0x7c,0x96,0x98,0xfe,0xa4,0x98,0x96,0x7c,0x7e,0x3c,0x3f,0x3f,0x3c,
-0x7e,0x7c,0x96,0x05,0xd9,0x39,0x36,0x6f,0x6f,0x83,0x86,0x9c,0x97,0x86,0x83,0x6f,
-0x6f,0x36,0x39,0x39,0x36,0x6f,0x6f,0x83,0x86,0x97,0x9c,0x86,0x83,0x6f,0x6f,0x36,
-0x63,0x88,0xfe,0xdb,0x0c,0x06,0x06,0x6e,0x6d,0xbb,0xc1,0xd6,0x1a,0x19,0xa3,0x29,
-0x12,0x13,0x92,0x7d,0x7c,0x92,0x0e,0x0f,0x1e,0x03,0x58,0x40,0x3e,0x7d,0x7e,0x95,
-0x97,0xb1,0xac,0x97,0x95,0x7e,0x7d,0x3e,0x40,0x40,0x3e,0x7d,0x7e,0x95,0x97,0xac,
-0xb1,0x97,0x95,0x7e,0x7d,0x3e,0x00,0x04,0x00,0x09,0xff,0x96,0x06,0xab,0x06,0x3d,
-0x00,0x1d,0x00,0x2c,0x00,0x4a,0x00,0x68,0x00,0x00,0x00,0x20,0x07,0x06,0x07,0x06,
-0x07,0x06,0x15,0x14,0x17,0x16,0x17,0x16,0x17,0x16,0x20,0x37,0x36,0x37,0x36,0x37,
-0x36,0x35,0x34,0x27,0x26,0x27,0x26,0x27,0x01,0x22,0x07,0x06,0x15,0x14,0x16,0x33,
-0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x13,0x15,0x2e,0x01,0x23,0x22,0x07,0x06,0x07,
-0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x26,0x11,0x10,
-0x37,0x36,0x33,0x32,0x16,0x00,0x20,0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,
-0x06,0x07,0x06,0x07,0x06,0x20,0x27,0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,
-0x37,0x36,0x37,0x03,0xf4,0xfe,0xcc,0x86,0x84,0x6d,0x6f,0x35,0x38,0x38,0x35,0x6f,
-0x6d,0x84,0x86,0x01,0x34,0x86,0x84,0x6d,0x6f,0x35,0x38,0x38,0x35,0x6f,0x6d,0x84,
-0xfe,0xd6,0x6c,0x40,0x40,0x80,0x6c,0x6d,0x40,0x3f,0x3f,0x40,0xd4,0x3d,0x7c,0x3c,
-0xa0,0x55,0x54,0x0c,0x2f,0x47,0x47,0x56,0xb4,0x68,0x69,0xda,0xb5,0xcf,0x6d,0x6e,
-0x86,0x87,0xe2,0x3d,0x7c,0xfe,0x5e,0x01,0x5c,0x98,0x96,0x7c,0x7e,0x3c,0x3f,0x3f,
-0x3c,0x7e,0x7c,0x96,0x98,0xfe,0xa4,0x98,0x96,0x7c,0x7e,0x3c,0x3f,0x3f,0x3c,0x7e,
-0x7c,0x96,0x05,0xd9,0x39,0x36,0x6f,0x6f,0x83,0x86,0x9c,0x97,0x86,0x83,0x6f,0x6f,
-0x36,0x39,0x39,0x36,0x6f,0x6f,0x83,0x86,0x97,0x9c,0x86,0x83,0x6f,0x6f,0x36,0xfd,
-0x8b,0x4b,0x4a,0x82,0x80,0x96,0x4b,0x4b,0x80,0x82,0x4a,0x4b,0x01,0xfa,0x93,0x1d,
-0x1e,0x6c,0x6c,0xda,0x45,0x26,0x25,0x6d,0x6e,0xbc,0xb8,0xde,0x9f,0x9f,0x01,0x2d,
-0x01,0x1d,0xa7,0xa8,0x18,0x01,0x00,0x40,0x3e,0x7d,0x7e,0x95,0x97,0xb1,0xac,0x97,
-0x95,0x7e,0x7d,0x3e,0x40,0x40,0x3e,0x7d,0x7e,0x95,0x97,0xac,0xb1,0x97,0x95,0x7e,
-0x7d,0x3e,0x00,0x03,0x00,0x09,0xff,0x96,0x06,0xab,0x06,0x3d,0x00,0x1d,0x00,0x24,
-0x00,0x42,0x00,0x00,0x00,0x20,0x07,0x06,0x07,0x06,0x07,0x06,0x15,0x14,0x17,0x16,
-0x17,0x16,0x17,0x16,0x20,0x37,0x36,0x37,0x36,0x37,0x36,0x35,0x34,0x27,0x26,0x27,
-0x26,0x27,0x05,0x21,0x15,0x01,0x23,0x01,0x21,0x12,0x20,0x17,0x16,0x17,0x16,0x17,
-0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x07,0x06,0x20,0x27,0x26,0x27,0x26,0x27,0x26,
-0x35,0x34,0x37,0x36,0x37,0x36,0x37,0x03,0xf4,0xfe,0xcc,0x86,0x84,0x6d,0x6f,0x35,
-0x38,0x38,0x35,0x6f,0x6d,0x84,0x86,0x01,0x34,0x86,0x84,0x6d,0x6f,0x35,0x38,0x38,
-0x35,0x6f,0x6d,0x84,0xfd,0x5c,0x03,0x00,0xfe,0x4e,0xa8,0x01,0x98,0xfd,0xc2,0xd6,
-0x01,0x5c,0x98,0x96,0x7c,0x7e,0x3c,0x3f,0x3f,0x3c,0x7e,0x7c,0x96,0x98,0xfe,0xa4,
-0x98,0x96,0x7c,0x7e,0x3c,0x3f,0x3f,0x3c,0x7e,0x7c,0x96,0x05,0xd9,0x39,0x36,0x6f,
-0x6f,0x83,0x86,0x9c,0x97,0x86,0x83,0x6f,0x6f,0x36,0x39,0x39,0x36,0x6f,0x6f,0x83,
-0x86,0x97,0x9c,0x86,0x83,0x6f,0x6f,0x36,0x60,0x45,0xfb,0x9a,0x04,0x23,0x01,0x85,
-0x40,0x3e,0x7d,0x7e,0x95,0x97,0xb1,0xac,0x97,0x95,0x7e,0x7d,0x3e,0x40,0x40,0x3e,
-0x7d,0x7e,0x95,0x97,0xac,0xb1,0x97,0x95,0x7e,0x7d,0x3e,0x00,0x00,0x05,0x00,0x09,
-0xff,0x96,0x06,0xab,0x06,0x3d,0x00,0x1d,0x00,0x2b,0x00,0x42,0x00,0x4e,0x00,0x6c,
-0x00,0x00,0x00,0x20,0x07,0x06,0x07,0x06,0x07,0x06,0x15,0x14,0x17,0x16,0x17,0x16,
-0x17,0x16,0x20,0x37,0x36,0x37,0x36,0x37,0x36,0x35,0x34,0x27,0x26,0x27,0x26,0x27,
-0x01,0x22,0x07,0x06,0x14,0x17,0x16,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x25,0x2e,
-0x01,0x35,0x34,0x36,0x20,0x16,0x15,0x14,0x06,0x07,0x16,0x17,0x16,0x15,0x14,0x06,
-0x20,0x26,0x35,0x34,0x36,0x13,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,
-0x06,0x12,0x20,0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x07,
-0x06,0x20,0x27,0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x37,0x03,
-0xf4,0xfe,0xcc,0x86,0x84,0x6d,0x6f,0x35,0x38,0x38,0x35,0x6f,0x6d,0x84,0x86,0x01,
-0x34,0x86,0x84,0x6d,0x6f,0x35,0x38,0x38,0x35,0x6f,0x6d,0x84,0xfe,0xdf,0x73,0x42,
-0x42,0x42,0x42,0xe6,0x43,0x42,0x42,0x42,0xfe,0xea,0x68,0x74,0xcc,0x01,0x64,0xcc,
-0x74,0x68,0x75,0x41,0x42,0xd4,0xfe,0x74,0xd4,0x84,0x39,0x74,0x69,0x68,0x76,0x76,
-0x68,0x69,0x74,0x30,0x01,0x5c,0x98,0x96,0x7c,0x7e,0x3c,0x3f,0x3f,0x3c,0x7e,0x7c,
-0x96,0x98,0xfe,0xa4,0x98,0x96,0x7c,0x7e,0x3c,0x3f,0x3f,0x3c,0x7e,0x7c,0x96,0x05,
-0xd9,0x39,0x36,0x6f,0x6f,0x83,0x86,0x9c,0x97,0x86,0x83,0x6f,0x6f,0x36,0x39,0x39,
-0x36,0x6f,0x6f,0x83,0x86,0x97,0x9c,0x86,0x83,0x6f,0x6f,0x36,0xfd,0x2c,0x3d,0x3e,
-0xd8,0x3d,0x3e,0x3e,0x3e,0x6b,0x6c,0x3e,0x3d,0x45,0x1a,0x8e,0x67,0x8f,0xa6,0xa6,
-0x8f,0x67,0x8e,0x1a,0x1b,0x4f,0x4f,0x73,0xad,0xba,0xba,0xad,0x73,0x9e,0x01,0x1a,
-0x5c,0x68,0x68,0x5c,0x5d,0x68,0x68,0x01,0xd0,0x40,0x3e,0x7d,0x7e,0x95,0x97,0xb1,
-0xac,0x97,0x95,0x7e,0x7d,0x3e,0x40,0x40,0x3e,0x7d,0x7e,0x95,0x97,0xac,0xb1,0x97,
-0x95,0x7e,0x7d,0x3e,0x00,0x04,0x00,0x09,0xff,0x96,0x06,0xab,0x06,0x3d,0x00,0x1d,
-0x00,0x3c,0x00,0x4c,0x00,0x6a,0x00,0x00,0x00,0x20,0x07,0x06,0x07,0x06,0x07,0x06,
-0x15,0x14,0x17,0x16,0x17,0x16,0x17,0x16,0x20,0x37,0x36,0x37,0x36,0x37,0x36,0x35,
-0x34,0x27,0x26,0x27,0x26,0x27,0x01,0x35,0x1e,0x01,0x33,0x32,0x37,0x36,0x37,0x06,
-0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x16,0x11,0x10,0x07,
-0x06,0x23,0x22,0x27,0x26,0x13,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x23,0x22,0x07,
-0x06,0x15,0x14,0x17,0x16,0x02,0x20,0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,
-0x06,0x07,0x06,0x07,0x06,0x20,0x27,0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,
-0x37,0x36,0x37,0x03,0xf4,0xfe,0xcc,0x86,0x84,0x6d,0x6f,0x35,0x38,0x38,0x35,0x6f,
-0x6d,0x84,0x86,0x01,0x34,0x86,0x84,0x6d,0x6f,0x35,0x38,0x38,0x35,0x6f,0x6d,0x84,
-0xfd,0xa7,0x3d,0x7c,0x3c,0xa0,0x55,0x54,0x0c,0x2e,0x47,0x48,0x56,0xb5,0x67,0x68,
-0xda,0xb4,0xd0,0x6d,0x6d,0x86,0x86,0xe2,0x3d,0x3f,0x3e,0xfe,0x6d,0x40,0x3f,0x3f,
-0x40,0x6d,0x6c,0x40,0x40,0x40,0x40,0x4a,0x01,0x5c,0x98,0x96,0x7c,0x7e,0x3c,0x3f,
-0x3f,0x3c,0x7e,0x7c,0x96,0x98,0xfe,0xa4,0x98,0x96,0x7c,0x7e,0x3c,0x3f,0x3f,0x3c,
-0x7e,0x7c,0x96,0x05,0xd9,0x39,0x36,0x6f,0x6f,0x83,0x86,0x9c,0x97,0x86,0x83,0x6f,
-0x6f,0x36,0x39,0x39,0x36,0x6f,0x6f,0x83,0x86,0x97,0x9c,0x86,0x83,0x6f,0x6f,0x36,
-0xfb,0x0e,0x93,0x1d,0x1e,0x6c,0x6b,0xdb,0x44,0x25,0x25,0x6c,0x6d,0xbc,0xb8,0xde,
-0x9f,0x9e,0xfe,0xd1,0xfe,0xe6,0xa9,0xa8,0x0c,0x0c,0x02,0x12,0x4b,0x4a,0x82,0x81,
-0x4a,0x4b,0x4b,0x4a,0x81,0x82,0x4a,0x4b,0x03,0x95,0x40,0x3e,0x7d,0x7e,0x95,0x97,
-0xb1,0xac,0x97,0x95,0x7e,0x7d,0x3e,0x40,0x40,0x3e,0x7d,0x7e,0x95,0x97,0xac,0xb1,
-0x97,0x95,0x7e,0x7d,0x3e,0x00,0x00,0x05,0x00,0x09,0xff,0x96,0x06,0xab,0x06,0x3d,
-0x00,0x1d,0x00,0x2b,0x00,0x38,0x00,0x43,0x00,0x61,0x00,0x00,0x00,0x20,0x07,0x06,
-0x07,0x06,0x07,0x06,0x15,0x14,0x17,0x16,0x17,0x16,0x17,0x16,0x20,0x37,0x36,0x37,
-0x36,0x37,0x36,0x35,0x34,0x27,0x26,0x27,0x26,0x27,0x07,0x22,0x07,0x06,0x15,0x14,
-0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x2e,0x01,0x20,0x17,0x16,0x11,0x10,0x07,0x06,
-0x20,0x02,0x11,0x10,0x37,0x01,0x15,0x21,0x35,0x23,0x11,0x23,0x07,0x15,0x37,0x11,
-0x12,0x20,0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x07,0x06,
-0x20,0x27,0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x37,0x03,0xf4,
-0xfe,0xcc,0x86,0x84,0x6d,0x6f,0x35,0x38,0x38,0x35,0x6f,0x6d,0x84,0x86,0x01,0x34,
-0x86,0x84,0x6d,0x6f,0x35,0x38,0x38,0x35,0x6f,0x6d,0x84,0x1d,0x54,0x2c,0x2b,0x56,
-0x55,0x56,0x56,0x2b,0x2b,0xef,0x01,0x32,0x51,0x50,0x50,0x51,0xfe,0xce,0xa0,0x50,
-0xfe,0x33,0x01,0x90,0x83,0x81,0x95,0x96,0x78,0x01,0x5c,0x98,0x96,0x7c,0x7e,0x3c,
-0x3f,0x3f,0x3c,0x7e,0x7c,0x96,0x98,0xfe,0xa4,0x98,0x96,0x7c,0x7e,0x3c,0x3f,0x3f,
-0x3c,0x7e,0x7c,0x96,0x05,0xd9,0x39,0x36,0x6f,0x6f,0x83,0x86,0x9c,0x97,0x86,0x83,
-0x6f,0x6f,0x36,0x39,0x39,0x36,0x6f,0x6f,0x83,0x86,0x97,0x9c,0x86,0x83,0x6f,0x6f,
-0x36,0xcb,0x7b,0x7a,0xf7,0xf5,0xf6,0xf6,0xf5,0xf3,0x7e,0x7b,0x80,0x9f,0x9e,0xfe,
-0xd1,0xfe,0xd3,0x9f,0x9f,0x01,0x3e,0x01,0x2d,0x01,0x2c,0xa1,0xfc,0x67,0x88,0x88,
-0x04,0x23,0x26,0x93,0x25,0xfc,0x71,0x05,0x20,0x40,0x3e,0x7d,0x7e,0x95,0x97,0xb1,
-0xac,0x97,0x95,0x7e,0x7d,0x3e,0x40,0x40,0x3e,0x7d,0x7e,0x95,0x97,0xac,0xb1,0x97,
-0x95,0x7e,0x7d,0x3e,0x00,0x02,0x00,0x09,0xff,0x96,0x06,0xab,0x06,0x3d,0x00,0x0a,
-0x00,0x28,0x00,0x00,0x01,0x15,0x21,0x35,0x21,0x11,0x23,0x05,0x15,0x25,0x11,0x02,
-0x20,0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x07,0x06,0x20,
-0x27,0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x37,0x02,0x1f,0x02,
-0xb0,0xfe,0xf8,0xa1,0xfe,0xe2,0x01,0x1f,0x7b,0x01,0x5c,0x98,0x96,0x7c,0x7e,0x3c,
-0x3f,0x3f,0x3c,0x7e,0x7c,0x96,0x98,0xfe,0xa4,0x98,0x96,0x7c,0x7e,0x3c,0x3f,0x3f,
-0x3c,0x7e,0x7c,0x96,0x01,0x1d,0x88,0x88,0x04,0x23,0x3a,0x93,0x39,0xfc,0x71,0x05,
-0x20,0x40,0x3e,0x7d,0x7e,0x95,0x97,0xb1,0xac,0x97,0x95,0x7e,0x7d,0x3e,0x40,0x40,
-0x3e,0x7d,0x7e,0x95,0x97,0xac,0xb1,0x97,0x95,0x7e,0x7d,0x3e,0x00,0x02,0x00,0x09,
-0xff,0x96,0x06,0xab,0x06,0x3d,0x00,0x23,0x00,0x41,0x00,0x00,0x01,0x36,0x37,0x36,
-0x37,0x36,0x37,0x36,0x35,0x34,0x27,0x26,0x23,0x22,0x06,0x07,0x15,0x36,0x37,0x36,
-0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x15,0x21,0x35,
-0x00,0x20,0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x07,0x06,
-0x20,0x27,0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x37,0x02,0xa3,
-0xc3,0x6c,0x6b,0x14,0x49,0x1b,0x1c,0x6f,0x6e,0xba,0x46,0xaa,0x61,0x60,0x54,0x55,
-0x4c,0x6b,0x43,0x42,0x1e,0x1f,0x4e,0x29,0x9e,0x9f,0x5c,0x02,0xf6,0xfd,0xd5,0x01,
-0x5c,0x98,0x96,0x7c,0x7e,0x3c,0x3f,0x3f,0x3c,0x7e,0x7c,0x96,0x98,0xfe,0xa4,0x98,
-0x96,0x7c,0x7e,0x3c,0x3f,0x3f,0x3c,0x7e,0x7c,0x96,0x01,0x20,0xc7,0x6f,0x6f,0x17,
-0x5a,0x42,0x42,0x49,0x9b,0x5d,0x5d,0x28,0x27,0xa3,0x35,0x1b,0x1a,0x3c,0x3c,0x5f,
-0x3b,0x3c,0x3c,0x58,0x2e,0xa0,0xa1,0x5f,0x88,0x88,0x05,0x1d,0x40,0x3e,0x7d,0x7e,
-0x95,0x97,0xb1,0xac,0x97,0x95,0x7e,0x7d,0x3e,0x40,0x40,0x3e,0x7d,0x7e,0x95,0x97,
-0xac,0xb1,0x97,0x95,0x7e,0x7d,0x3e,0x00,0x00,0x02,0x00,0x09,0xff,0x96,0x06,0xab,
-0x06,0x3d,0x00,0x31,0x00,0x4f,0x00,0x00,0x01,0x3e,0x01,0x35,0x34,0x27,0x26,0x23,
-0x22,0x07,0x06,0x07,0x15,0x36,0x37,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x2b,
-0x01,0x15,0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x23,0x22,0x26,0x27,0x15,0x16,
-0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x00,0x20,0x17,0x16,0x17,0x16,
-0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x07,0x06,0x20,0x27,0x26,0x27,0x26,0x27,
-0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x37,0x04,0x06,0x69,0x72,0x6b,0x6c,0xb8,0x47,
-0x50,0x51,0x5c,0x5c,0x4c,0x4c,0x42,0x7a,0x82,0x3f,0x3f,0x78,0x91,0x8b,0x84,0x4a,
-0x4a,0x50,0x4f,0x98,0x57,0xa0,0x44,0x55,0x50,0x4f,0x4c,0xe0,0x79,0x7a,0x41,0x42,
-0xfe,0x32,0x01,0x5c,0x98,0x96,0x7c,0x7e,0x3c,0x3f,0x3f,0x3c,0x7e,0x7c,0x96,0x98,
-0xfe,0xa4,0x98,0x96,0x7c,0x7e,0x3c,0x3f,0x3f,0x3c,0x7e,0x7c,0x96,0x03,0x19,0x1b,
-0x88,0x64,0x8e,0x54,0x53,0x0d,0x0c,0x1a,0x90,0x1e,0x0f,0x0e,0x62,0x5c,0x5a,0x2f,
-0x30,0x85,0x3b,0x3c,0x6a,0x72,0x3c,0x3c,0x28,0x27,0x9c,0x1d,0x0f,0x0f,0x61,0x61,
-0xb0,0x74,0x4e,0x4e,0x03,0x3d,0x40,0x3e,0x7d,0x7e,0x95,0x97,0xb1,0xac,0x97,0x95,
-0x7e,0x7d,0x3e,0x40,0x40,0x3e,0x7d,0x7e,0x95,0x97,0xac,0xb1,0x97,0x95,0x7e,0x7d,
-0x3e,0x00,0x00,0x03,0x00,0x09,0xff,0x96,0x06,0xab,0x06,0x3d,0x00,0x02,0x00,0x0d,
-0x00,0x2b,0x00,0x00,0x01,0x11,0x21,0x09,0x01,0x15,0x21,0x11,0x33,0x11,0x33,0x35,
-0x23,0x11,0x24,0x20,0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,
-0x07,0x06,0x20,0x27,0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x37,
-0x03,0x9c,0xfe,0x68,0x01,0x6e,0xfe,0x0f,0x02,0x1b,0xa1,0xaa,0xaa,0xfe,0x6f,0x01,
-0x5c,0x98,0x96,0x7c,0x7e,0x3c,0x3f,0x3f,0x3c,0x7e,0x7c,0x96,0x98,0xfe,0xa4,0x98,
-0x96,0x7c,0x7e,0x3c,0x3f,0x3f,0x3c,0x7e,0x7c,0x96,0x04,0xb3,0xfd,0x82,0x03,0x0b,
-0xfd,0x0b,0x9c,0xfe,0xe6,0x01,0x1a,0x86,0x03,0x0b,0xfd,0x40,0x3e,0x7d,0x7e,0x95,
-0x97,0xb1,0xac,0x97,0x95,0x7e,0x7d,0x3e,0x40,0x40,0x3e,0x7d,0x7e,0x95,0x97,0xac,
-0xb1,0x97,0x95,0x7e,0x7d,0x3e,0x00,0x02,0x00,0x09,0xff,0x96,0x06,0xab,0x06,0x3d,
-0x00,0x21,0x00,0x3f,0x00,0x00,0x01,0x11,0x36,0x37,0x36,0x33,0x32,0x16,0x15,0x14,
-0x06,0x23,0x22,0x27,0x26,0x27,0x15,0x1e,0x01,0x33,0x32,0x36,0x35,0x34,0x27,0x26,
-0x23,0x22,0x07,0x06,0x07,0x11,0x21,0x35,0x00,0x20,0x17,0x16,0x17,0x16,0x17,0x16,
-0x15,0x14,0x07,0x06,0x07,0x06,0x07,0x06,0x20,0x27,0x26,0x27,0x26,0x27,0x26,0x35,
-0x34,0x37,0x36,0x37,0x36,0x37,0x02,0x1d,0x43,0x41,0x40,0x41,0x8a,0xa2,0xa2,0x8a,
-0x56,0x4d,0x4c,0x48,0x53,0x9c,0x4b,0xda,0xf0,0x74,0x75,0xc8,0x23,0x24,0x23,0x23,
-0x01,0xe6,0xfe,0x15,0x01,0x5c,0x98,0x96,0x7c,0x7e,0x3c,0x3f,0x3f,0x3c,0x7e,0x7c,
-0x96,0x98,0xfe,0xa4,0x98,0x96,0x7c,0x7e,0x3c,0x3f,0x3f,0x3c,0x7e,0x7c,0x96,0x05,
-0x3d,0xfd,0xa8,0x1e,0x0f,0x0e,0x92,0x7c,0x7d,0x92,0x13,0x14,0x27,0xa3,0x19,0x1a,
-0xd6,0xc1,0xbb,0x6d,0x6e,0x06,0x06,0x0c,0x01,0x25,0x88,0x01,0x00,0x40,0x3e,0x7d,
-0x7e,0x95,0x97,0xb1,0xac,0x97,0x95,0x7e,0x7d,0x3e,0x40,0x40,0x3e,0x7d,0x7e,0x95,
-0x97,0xac,0xb1,0x97,0x95,0x7e,0x7d,0x3e,0x00,0x03,0x00,0x09,0xff,0x96,0x06,0xab,
-0x06,0x3d,0x00,0x0e,0x00,0x2c,0x00,0x4a,0x00,0x00,0x01,0x32,0x17,0x16,0x15,0x14,
-0x07,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x36,0x01,0x2e,0x01,0x23,0x22,0x07,0x06,
-0x11,0x10,0x17,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x07,
-0x36,0x37,0x36,0x33,0x32,0x16,0x17,0x00,0x20,0x17,0x16,0x17,0x16,0x17,0x16,0x15,
-0x14,0x07,0x06,0x07,0x06,0x07,0x06,0x20,0x27,0x26,0x27,0x26,0x27,0x26,0x35,0x34,
-0x37,0x36,0x37,0x36,0x37,0x03,0x50,0x6d,0x40,0x3f,0x3f,0x40,0x6d,0x6c,0x80,0x40,
-0x40,0x01,0xad,0x43,0x7c,0x3d,0xe2,0x87,0x86,0x6e,0x6d,0xcf,0xb5,0xda,0x69,0x68,
-0xb4,0x56,0x47,0x47,0x2f,0x0c,0x54,0x55,0xa0,0x3c,0x7c,0x3d,0xfe,0x1b,0x01,0x5c,
-0x98,0x96,0x7c,0x7e,0x3c,0x3f,0x3f,0x3c,0x7e,0x7c,0x96,0x98,0xfe,0xa4,0x98,0x96,
-0x7c,0x7e,0x3c,0x3f,0x3f,0x3c,0x7e,0x7c,0x96,0x03,0x2b,0x4b,0x4a,0x82,0x80,0x4b,
-0x4b,0x96,0x80,0x82,0x4a,0x4b,0x01,0xfa,0x18,0x18,0xa8,0xa9,0xfe,0xe5,0xfe,0xd3,
-0x9f,0x9f,0xde,0xb8,0xbc,0x6e,0x6d,0x25,0x26,0x45,0xda,0x6c,0x6c,0x1e,0x1d,0x01,
-0xab,0x40,0x3e,0x7d,0x7e,0x95,0x97,0xb1,0xac,0x97,0x95,0x7e,0x7d,0x3e,0x40,0x40,
-0x3e,0x7d,0x7e,0x95,0x97,0xac,0xb1,0x97,0x95,0x7e,0x7d,0x3e,0x00,0x02,0x00,0x09,
-0xff,0x96,0x06,0xab,0x06,0x3d,0x00,0x06,0x00,0x24,0x00,0x00,0x01,0x15,0x21,0x01,
-0x33,0x01,0x35,0x24,0x20,0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,
-0x06,0x07,0x06,0x20,0x27,0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,
-0x37,0x01,0xd6,0x02,0x3e,0xfe,0x68,0xa8,0x01,0xb2,0xfd,0xd6,0x01,0x5c,0x98,0x96,
-0x7c,0x7e,0x3c,0x3f,0x3f,0x3c,0x7e,0x7c,0x96,0x98,0xfe,0xa4,0x98,0x96,0x7c,0x7e,
-0x3c,0x3f,0x3f,0x3c,0x7e,0x7c,0x96,0x05,0x40,0x88,0xfb,0xdd,0x04,0x66,0x45,0xfd,
-0x40,0x3e,0x7d,0x7e,0x95,0x97,0xb1,0xac,0x97,0x95,0x7e,0x7d,0x3e,0x40,0x40,0x3e,
-0x7d,0x7e,0x95,0x97,0xac,0xb1,0x97,0x95,0x7e,0x7d,0x3e,0x00,0x00,0x04,0x00,0x09,
-0xff,0x96,0x06,0xab,0x06,0x3d,0x00,0x0d,0x00,0x24,0x00,0x30,0x00,0x4e,0x00,0x00,
-0x01,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x22,0x27,0x26,0x34,0x37,0x36,0x27,0x0e,
-0x01,0x15,0x14,0x16,0x20,0x36,0x35,0x34,0x27,0x26,0x27,0x3e,0x01,0x35,0x34,0x26,
-0x20,0x06,0x15,0x14,0x16,0x37,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,
-0x26,0x12,0x20,0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x07,
-0x06,0x20,0x27,0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x37,0x03,
-0x59,0x74,0x42,0x42,0x42,0x43,0xe6,0x42,0x42,0x42,0x42,0x2f,0x74,0x84,0xd4,0x01,
-0x8c,0xd4,0x42,0x41,0x75,0x68,0x74,0xcc,0xfe,0x9c,0xcc,0x74,0x2d,0x74,0x69,0x68,
-0x76,0x76,0x68,0x69,0x74,0x30,0x01,0x5c,0x98,0x96,0x7c,0x7e,0x3c,0x3f,0x3f,0x3c,
-0x7e,0x7c,0x96,0x98,0xfe,0xa4,0x98,0x96,0x7c,0x7e,0x3c,0x3f,0x3f,0x3c,0x7e,0x7c,
-0x96,0x02,0xcc,0x3d,0x3e,0x6c,0x6b,0x3e,0x3e,0x3e,0x3d,0xd8,0x3e,0x3d,0x45,0x1b,
-0x9e,0x73,0xad,0xba,0xba,0xad,0x73,0x4f,0x4f,0x1b,0x1a,0x8e,0x67,0x8f,0xa6,0xa6,
-0x8f,0x67,0x8e,0xe5,0x5d,0x68,0x68,0x5d,0x5c,0x68,0x68,0x02,0x89,0x40,0x3e,0x7d,
-0x7e,0x95,0x97,0xb1,0xac,0x97,0x95,0x7e,0x7d,0x3e,0x40,0x40,0x3e,0x7d,0x7e,0x95,
-0x97,0xac,0xb1,0x97,0x95,0x7e,0x7d,0x3e,0x00,0x03,0x00,0x09,0xff,0x96,0x06,0xab,
-0x06,0x3d,0x00,0x1e,0x00,0x2e,0x00,0x4c,0x00,0x00,0x25,0x16,0x17,0x16,0x33,0x32,
-0x37,0x36,0x11,0x10,0x27,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,
-0x36,0x37,0x06,0x07,0x06,0x23,0x22,0x26,0x27,0x01,0x22,0x27,0x26,0x35,0x34,0x37,
-0x36,0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x00,0x20,0x17,0x16,0x17,0x16,0x17,
-0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x07,0x06,0x20,0x27,0x26,0x27,0x26,0x27,0x26,
-0x35,0x34,0x37,0x36,0x37,0x36,0x37,0x02,0x21,0x43,0x3e,0x3f,0x3d,0xe2,0x86,0x86,
-0x6d,0x6d,0xd0,0xb4,0xda,0x68,0x69,0xb3,0x56,0x48,0x47,0x2e,0x0c,0x54,0x55,0xa0,
-0x3c,0x7c,0x3d,0x01,0x41,0x6c,0x40,0x40,0x40,0x40,0x6c,0x6d,0x40,0x3f,0x3f,0x40,
-0xfe,0xdd,0x01,0x5c,0x98,0x96,0x7c,0x7e,0x3c,0x3f,0x3f,0x3c,0x7e,0x7c,0x96,0x98,
-0xfe,0xa4,0x98,0x96,0x7c,0x7e,0x3c,0x3f,0x3f,0x3c,0x7e,0x7c,0x96,0xae,0x18,0x0c,
-0x0c,0xa8,0xa9,0x01,0x1a,0x01,0x2f,0x9e,0x9f,0xde,0xb8,0xbc,0x6d,0x6c,0x25,0x25,
-0x44,0xdb,0x6b,0x6c,0x1e,0x1d,0x01,0x67,0x4b,0x4a,0x82,0x81,0x4a,0x4b,0x4b,0x4a,
-0x81,0x82,0x4a,0x4b,0x03,0x95,0x40,0x3e,0x7d,0x7e,0x95,0x97,0xb1,0xac,0x97,0x95,
-0x7e,0x7d,0x3e,0x40,0x40,0x3e,0x7d,0x7e,0x95,0x97,0xac,0xb1,0x97,0x95,0x7e,0x7d,
-0x3e,0x00,0x00,0x04,0x00,0x09,0xff,0x96,0x06,0xab,0x06,0x3d,0x00,0x0d,0x00,0x1a,
-0x00,0x25,0x00,0x43,0x00,0x00,0x01,0x32,0x17,0x16,0x15,0x14,0x06,0x23,0x22,0x26,
-0x35,0x34,0x37,0x36,0x24,0x20,0x07,0x06,0x11,0x10,0x17,0x16,0x20,0x12,0x11,0x10,
-0x27,0x01,0x15,0x21,0x35,0x23,0x11,0x23,0x07,0x15,0x37,0x11,0x12,0x20,0x17,0x16,
-0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x07,0x06,0x20,0x27,0x26,0x27,
-0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x37,0x04,0x99,0x65,0x32,0x32,0x64,
-0x65,0x64,0x64,0x32,0x32,0x01,0x05,0xfe,0xbe,0x54,0x55,0x55,0x54,0x01,0x42,0xaa,
-0x55,0xfb,0xe6,0x01,0xc2,0xa1,0x81,0xb3,0xb4,0x96,0x01,0x5c,0x98,0x96,0x7c,0x7e,
-0x3c,0x3f,0x3f,0x3c,0x7e,0x7c,0x96,0x98,0xfe,0xa4,0x98,0x96,0x7c,0x7e,0x3c,0x3f,
-0x3f,0x3c,0x7e,0x7c,0x96,0x04,0xd5,0x7b,0x7a,0xf7,0xf5,0xf6,0xf6,0xf5,0xf7,0x7a,
-0x7b,0x80,0x9f,0x9e,0xfe,0xd1,0xfe,0xd3,0x9f,0x9f,0x01,0x3e,0x01,0x2d,0x01,0x2f,
-0x9e,0xfc,0x67,0x88,0x88,0x04,0x23,0x26,0x93,0x25,0xfc,0x71,0x05,0x20,0x40,0x3e,
-0x7d,0x7e,0x95,0x97,0xb1,0xac,0x97,0x95,0x7e,0x7d,0x3e,0x40,0x40,0x3e,0x7d,0x7e,
-0x95,0x97,0xac,0xb1,0x97,0x95,0x7e,0x7d,0x3e,0x00,0x00,0x01,0x00,0x75,0x00,0x9a,
-0x06,0x50,0x04,0x6a,0x00,0x08,0x00,0x00,0x09,0x01,0x21,0x01,0x21,0x35,0x21,0x01,
-0x21,0x06,0x50,0xfe,0x18,0xfe,0xc0,0x01,0x70,0xfb,0xdd,0x04,0x23,0xfe,0x90,0x01,
-0x40,0x02,0x82,0xfe,0x18,0x01,0x70,0xf0,0x01,0x70,0x00,0x01,0x00,0xfc,0x00,0x70,
-0x05,0x74,0x04,0xe9,0x00,0x06,0x00,0x00,0x09,0x01,0x37,0x01,0x1b,0x01,0x25,0x03,
-0xf7,0xfd,0x05,0xa9,0x02,0xb5,0xd4,0x46,0xfd,0x4e,0x01,0x8b,0x02,0xb4,0xaa,0xfd,
-0x05,0x01,0x34,0xfd,0x4e,0x47,0x00,0x01,0x00,0x75,0x00,0xcc,0x06,0x50,0x04,0x38,
-0x00,0x06,0x00,0x00,0x01,0x05,0x35,0x05,0x03,0x09,0x01,0x04,0x7a,0xfb,0xfb,0x04,
-0x05,0x44,0x02,0x1a,0xfd,0xe6,0x02,0x3c,0x32,0xf0,0x32,0x01,0x70,0xfe,0x4a,0xfe,
-0x4a,0x00,0x00,0x01,0x00,0xfc,0x00,0x1b,0x05,0x74,0x04,0x94,0x00,0x06,0x00,0x00,
-0x09,0x01,0x27,0x01,0x2d,0x01,0x03,0x04,0x5a,0xfd,0x4b,0xa9,0x02,0xfb,0xfe,0xcb,
-0x02,0xb2,0x46,0x03,0x16,0xfd,0x05,0xaa,0x02,0xb4,0xd4,0x47,0xfd,0x4e,0x00,0x01,
-0x00,0x75,0x01,0x08,0x06,0x50,0x03,0xfc,0x00,0x08,0x00,0x00,0x13,0x21,0x03,0x04,
-0x05,0x04,0x05,0x13,0x21,0x75,0x02,0xbb,0xa8,0x01,0x5c,0x02,0x6c,0xfd,0x94,0xfe,
-0xa4,0xa8,0xfd,0x45,0x02,0xbe,0x01,0x3e,0xfc,0x7e,0x7e,0xfc,0x01,0x3e,0x00,0x01,
-0x00,0x75,0x00,0x75,0x06,0x1d,0x04,0x8f,0x00,0x32,0x00,0x00,0x00,0x14,0x07,0x06,
-0x07,0x01,0x06,0x07,0x06,0x22,0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x3f,
-0x01,0x21,0x22,0x2e,0x01,0x27,0x26,0x34,0x37,0x3e,0x02,0x33,0x21,0x27,0x26,0x27,
-0x26,0x35,0x34,0x37,0x36,0x37,0x3e,0x01,0x32,0x17,0x16,0x17,0x01,0x16,0x06,0x1d,
-0x09,0x0b,0x11,0xfe,0x70,0x10,0x18,0x16,0x34,0x2c,0x12,0x12,0x0a,0x09,0x09,0x0b,
-0x11,0xba,0xfc,0x80,0x1a,0x2c,0x24,0x0a,0x09,0x09,0x0a,0x24,0x2c,0x1a,0x03,0x80,
-0xba,0x11,0x0b,0x09,0x09,0x0a,0x12,0x12,0x2c,0x34,0x16,0x18,0x10,0x01,0x90,0x13,
-0x02,0x9b,0x32,0x16,0x18,0x11,0xfe,0x70,0x10,0x0b,0x0a,0x14,0x11,0x13,0x16,0x16,
-0x19,0x1a,0x16,0x18,0x11,0xba,0x14,0x22,0x18,0x16,0x32,0x16,0x18,0x22,0x14,0xba,
-0x11,0x18,0x16,0x1a,0x19,0x16,0x16,0x13,0x11,0x14,0x0a,0x0b,0x10,0xfe,0x70,0x13,
-0x00,0x01,0x00,0x75,0x00,0xcc,0x06,0x50,0x04,0x38,0x00,0x06,0x00,0x00,0x01,0x21,
-0x35,0x21,0x11,0x09,0x01,0x04,0x9a,0xfb,0xdb,0x04,0x25,0x01,0xb6,0xfe,0x4a,0x02,
-0x5a,0x50,0x01,0x8e,0xfe,0x4a,0xfe,0x4a,0x00,0x01,0x00,0x75,0x00,0xcc,0x06,0x50,
-0x04,0x38,0x00,0x06,0x00,0x00,0x01,0x21,0x35,0x21,0x11,0x09,0x01,0x04,0x9a,0xfb,
-0xdb,0x04,0x25,0x01,0xb6,0xfe,0x4a,0x02,0x14,0xdc,0x01,0x48,0xfe,0x4a,0xfe,0x4a,
-0x00,0x04,0x00,0x75,0x00,0xcc,0x06,0x50,0x04,0x38,0x00,0x03,0x00,0x07,0x00,0x0b,
-0x00,0x12,0x00,0x00,0x01,0x23,0x11,0x33,0x01,0x23,0x11,0x33,0x03,0x23,0x11,0x33,
-0x01,0x21,0x11,0x21,0x35,0x09,0x01,0x02,0xb9,0xf0,0xf0,0xfe,0xc0,0x78,0x78,0xc8,
-0x3c,0x3c,0x03,0xe9,0xfe,0x6f,0x01,0x91,0x01,0xb6,0xfe,0x4a,0x01,0xba,0x01,0x90,
-0xfe,0x70,0x01,0x90,0xfe,0x70,0x01,0x90,0xfe,0x70,0x01,0x90,0xee,0xfe,0x4a,0xfe,
-0x4a,0x00,0x00,0x04,0x00,0x75,0x00,0xcc,0x06,0x50,0x04,0x38,0x00,0x08,0x00,0x0c,
-0x00,0x10,0x00,0x14,0x00,0x00,0x01,0x35,0x12,0x17,0x06,0x03,0x35,0x21,0x11,0x03,
-0x23,0x11,0x33,0x01,0x23,0x11,0x33,0x03,0x23,0x11,0x33,0x04,0x9a,0xb8,0xfe,0xfe,
-0xb8,0xfe,0x6f,0x50,0xf0,0xf0,0xfe,0xc0,0x78,0x78,0xc8,0x3c,0x3c,0x03,0xae,0x8a,
-0xfe,0xce,0x84,0x84,0xfe,0xce,0x8a,0x02,0x58,0xfd,0xa8,0x02,0x58,0xfd,0xa8,0x02,
-0x58,0xfd,0xa8,0x02,0x58,0x00,0x00,0x01,0x00,0x75,0x00,0xcc,0x06,0x50,0x04,0x38,
-0x00,0x06,0x00,0x00,0x01,0x21,0x11,0x21,0x35,0x09,0x01,0x04,0x9a,0xfb,0xdb,0x04,
-0x25,0x01,0xb6,0xfe,0x4a,0x01,0xba,0x01,0x90,0xee,0xfe,0x4a,0xfe,0x4a,0x00,0x02,
-0x00,0xe4,0x00,0xc0,0x06,0x50,0x04,0x44,0x00,0x02,0x00,0x06,0x00,0x00,0x01,0x21,
-0x01,0x13,0x09,0x02,0x03,0x1e,0x02,0x36,0xfc,0xbc,0x96,0xfe,0x3e,0x05,0x6c,0xfa,
-0x94,0x02,0x82,0x01,0x0f,0xfe,0xf1,0x01,0xc2,0xfe,0x3e,0xfe,0x3e,0x00,0x00,0x02,
-0x00,0xe4,0x00,0xc0,0x06,0x50,0x04,0x44,0x00,0x02,0x00,0x06,0x00,0x00,0x09,0x02,
-0x21,0x09,0x02,0x03,0x1e,0xfe,0xf2,0x03,0x44,0xfd,0x52,0xfe,0x3e,0x05,0x6c,0xfa,
-0x94,0x02,0x82,0xfe,0xf1,0x01,0x0f,0x01,0xc2,0xfe,0x3e,0xfe,0x3e,0x00,0x00,0x01,
-0x00,0xe4,0xff,0xf8,0x06,0x50,0x05,0x0c,0x00,0x03,0x00,0x00,0x09,0x03,0x02,0x42,
-0xfe,0xa2,0x05,0x6c,0xfa,0x94,0x02,0x82,0x02,0x8a,0xfd,0x76,0xfd,0x76,0x00,0x01,
-0x00,0x75,0x00,0xcc,0x06,0x50,0x04,0x62,0x00,0x16,0x00,0x00,0x13,0x11,0x14,0x17,
-0x16,0x17,0x16,0x17,0x16,0x33,0x21,0x35,0x09,0x01,0x35,0x21,0x22,0x27,0x26,0x27,
-0x26,0x27,0x26,0x75,0x12,0x12,0x23,0x23,0x2b,0x2a,0x31,0x03,0x35,0x01,0xb6,0xfe,
-0x4a,0xfc,0xcb,0x31,0x2a,0x2b,0x23,0x23,0x12,0x12,0x02,0x82,0x01,0xe0,0x30,0x2b,
-0x2a,0x25,0x21,0x13,0x12,0xc6,0xfe,0x4a,0xfe,0x4a,0xc6,0x12,0x13,0x21,0x25,0x2a,
-0x2b,0x00,0x00,0x01,0x00,0x75,0x00,0xa2,0x06,0x50,0x04,0x38,0x00,0x16,0x00,0x00,
-0x13,0x34,0x37,0x36,0x37,0x36,0x37,0x36,0x33,0x21,0x35,0x09,0x01,0x35,0x21,0x22,
-0x07,0x06,0x07,0x06,0x07,0x06,0x15,0x75,0x12,0x12,0x23,0x23,0x2b,0x2a,0x31,0x03,
-0x35,0x01,0xb6,0xfe,0x4a,0xfc,0xcb,0x31,0x2a,0x2b,0x23,0x23,0x12,0x12,0x02,0x82,
-0x30,0x2b,0x2a,0x25,0x21,0x13,0x12,0xc6,0xfe,0x4a,0xfe,0x4a,0xc6,0x12,0x13,0x21,
-0x25,0x2a,0x2b,0x30,0x00,0x01,0x01,0xec,0xff,0xf1,0x04,0xd9,0x05,0x13,0x00,0x06,
-0x00,0x00,0x01,0x21,0x11,0x21,0x11,0x09,0x01,0x03,0x5e,0xfe,0x8e,0x01,0x72,0x01,
-0x7b,0xfe,0x85,0x01,0x56,0x02,0x58,0x01,0x65,0xfd,0x6f,0xfd,0x6f,0x00,0x00,0x01,
-0x00,0x75,0x00,0xcc,0x06,0x50,0x04,0x38,0x00,0x08,0x00,0x00,0x01,0x35,0x12,0x05,
-0x04,0x03,0x35,0x21,0x11,0x04,0x04,0x90,0x01,0xbc,0xfe,0x44,0x90,0xfc,0x71,0x03,
-0x9a,0x9e,0xfe,0xce,0x84,0x84,0xfe,0xce,0x9e,0x02,0x30,0x00,0x00,0x02,0x00,0x75,
-0x00,0x9a,0x06,0x1e,0x04,0x6a,0x00,0x08,0x00,0x0f,0x00,0x00,0x25,0x35,0x21,0x11,
-0x21,0x35,0x33,0x09,0x01,0x03,0x15,0x09,0x01,0x15,0x21,0x11,0x03,0x3c,0xfd,0x39,
-0x02,0xc7,0xfa,0x01,0xe8,0xfe,0x18,0xaa,0x01,0x98,0xfe,0x68,0xfd,0x39,0x9a,0xee,
-0x01,0xf4,0xee,0xfe,0x18,0xfe,0x18,0x01,0x3e,0xee,0x01,0x98,0x01,0x98,0xee,0xfe,
-0xac,0x00,0x00,0x02,0x00,0x75,0x00,0x9a,0x06,0x1e,0x04,0x6a,0x00,0x08,0x00,0x0f,
-0x00,0x00,0x25,0x35,0x21,0x11,0x21,0x35,0x33,0x09,0x01,0x03,0x15,0x09,0x01,0x15,
-0x21,0x11,0x03,0x3c,0xfd,0x39,0x02,0xc7,0xfa,0x01,0xe8,0xfe,0x18,0x14,0x01,0x98,
-0xfe,0x68,0xfd,0x39,0x9a,0xee,0x01,0xf4,0xee,0xfe,0x18,0xfe,0x18,0x01,0x3e,0xee,
-0x01,0x98,0x01,0x98,0xee,0xfe,0xac,0x00,0x00,0x02,0x00,0x2b,0x00,0x18,0x06,0x5a,
-0x04,0xb0,0x00,0x0b,0x00,0x12,0x00,0x00,0x13,0x01,0x21,0x37,0x33,0x13,0x15,0x01,
-0x23,0x35,0x37,0x21,0x01,0x07,0x01,0x03,0x07,0x21,0x03,0x2b,0x01,0x20,0x03,0x49,
-0x8a,0x64,0xd8,0xfd,0x26,0x96,0x16,0xfd,0x2b,0x03,0xd1,0x8a,0x02,0x84,0xac,0x8a,
-0xfc,0xb7,0xc4,0x01,0xce,0x01,0xf4,0xee,0xfd,0xfe,0xc8,0xfe,0x32,0xc8,0x26,0x01,
-0x18,0xee,0x01,0x98,0x01,0x98,0xee,0xfe,0xac,0x00,0x00,0x02,0x00,0x2b,0x00,0x18,
-0x06,0x5a,0x04,0xb0,0x00,0x0b,0x00,0x12,0x00,0x00,0x13,0x35,0x21,0x27,0x35,0x33,
-0x01,0x15,0x03,0x23,0x27,0x21,0x01,0x21,0x13,0x21,0x17,0x13,0x01,0x2b,0x02,0xd5,
-0x16,0x96,0x02,0xda,0xd8,0x64,0x8a,0xfc,0xb7,0x02,0xb1,0xfc,0xb7,0xc4,0x03,0x49,
-0x8a,0xac,0xfd,0x7c,0x02,0xfa,0xc8,0x26,0xc8,0xfe,0x32,0xc8,0xfd,0xfe,0xee,0x01,
-0xa4,0xfe,0xac,0xee,0x01,0x98,0x01,0x98,0x00,0x02,0x01,0x15,0x00,0x00,0x06,0x32,
-0x04,0x98,0x00,0x0a,0x00,0x11,0x00,0x00,0x21,0x27,0x21,0x27,0x11,0x21,0x35,0x33,
-0x01,0x17,0x01,0x03,0x15,0x09,0x01,0x15,0x21,0x11,0x03,0xdc,0x4f,0xfd,0xec,0x64,
-0x02,0x63,0x6e,0x01,0xe8,0x64,0xfe,0x18,0x82,0x01,0x98,0xfe,0x68,0xfd,0x9d,0x9e,
-0xc8,0x02,0x94,0x9e,0xfe,0x18,0xc8,0xfe,0x18,0x01,0xb6,0x9e,0x01,0x98,0x01,0x98,
-0x9e,0xfe,0x0c,0x00,0x00,0x02,0x01,0x15,0x00,0x00,0x06,0x32,0x04,0x98,0x00,0x0a,
-0x00,0x11,0x00,0x00,0x01,0x33,0x01,0x07,0x01,0x23,0x35,0x21,0x11,0x37,0x21,0x13,
-0x21,0x11,0x21,0x15,0x09,0x01,0x03,0xdc,0x6e,0x01,0xe8,0x64,0xfe,0x18,0x6e,0xfd,
-0x9d,0x64,0x02,0x14,0x3b,0xfd,0x9d,0x02,0x63,0x01,0x98,0xfe,0x68,0x04,0x98,0xfe,
-0x18,0xc8,0xfe,0x18,0x9e,0x02,0x94,0xc8,0xfe,0xe8,0xfe,0x0c,0x9e,0x01,0x98,0x01,
-0x98,0x00,0x00,0x02,0x00,0x7f,0x00,0x64,0x06,0x64,0x04,0x98,0x00,0x0c,0x00,0x14,
-0x00,0x00,0x01,0x03,0x21,0x35,0x33,0x01,0x17,0x01,0x23,0x27,0x35,0x21,0x27,0x13,
-0x07,0x21,0x15,0x09,0x01,0x15,0x21,0x01,0x15,0x96,0x03,0x5d,0x6e,0x01,0xe8,0x32,
-0xfe,0x18,0x6e,0x32,0xfc,0xd5,0x32,0xf2,0x72,0x03,0x2d,0x01,0x98,0xfe,0x68,0xfc,
-0xd3,0x02,0xb0,0x01,0x4a,0x9e,0xfe,0x18,0x64,0xfe,0x18,0x63,0x3b,0x64,0x01,0x4a,
-0xfa,0x9e,0x01,0x98,0x01,0x98,0x9e,0x00,0x00,0x02,0x00,0x7f,0x00,0x64,0x06,0x64,
-0x04,0x98,0x00,0x0c,0x00,0x14,0x00,0x00,0x01,0x03,0x37,0x21,0x35,0x37,0x33,0x01,
-0x07,0x01,0x23,0x35,0x21,0x13,0x07,0x21,0x15,0x09,0x01,0x15,0x21,0x01,0x15,0x96,
-0x32,0x03,0x2b,0x32,0x6e,0x01,0xe8,0x32,0xfe,0x18,0x6e,0xfc,0xa3,0xf2,0x72,0x03,
-0x2d,0x01,0x98,0xfe,0x68,0xfc,0xd3,0x02,0x4c,0x01,0x4a,0x64,0x3b,0x63,0xfe,0x18,
-0x64,0xfe,0x18,0x9e,0x01,0x4a,0xfa,0x9e,0x01,0x98,0x01,0x98,0x9e,0x00,0x00,0x01,
-0x01,0x3c,0xff,0xd8,0x05,0xc4,0x04,0xaf,0x00,0x21,0x00,0x00,0x01,0x36,0x37,0x36,
-0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,
-0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x26,0x27,0x21,0x15,0x09,0x01,0x15,0x01,0x3c,
-0x27,0x43,0x5a,0x6d,0x6f,0x7e,0x79,0x74,0x69,0x5e,0x5a,0x2e,0x2e,0x2e,0x2a,0x5e,
-0x56,0x71,0x6f,0x7e,0x79,0x74,0x69,0x5e,0x3f,0x29,0x02,0x58,0x01,0xca,0xfe,0x36,
-0x03,0x6e,0x47,0x43,0x5a,0x2e,0x2f,0x2f,0x2b,0x5d,0x59,0x6f,0x6e,0x80,0x7a,0x71,
-0x69,0x5f,0x58,0x30,0x2f,0x2f,0x2b,0x5d,0x3e,0x49,0x9e,0x01,0xca,0x01,0xca,0x9e,
-0x00,0x09,0x00,0x82,0x01,0x42,0x06,0x50,0x03,0xc2,0x00,0x03,0x00,0x07,0x00,0x0b,
-0x00,0x0f,0x00,0x1e,0x00,0x22,0x00,0x26,0x00,0x2a,0x00,0x2e,0x00,0x00,0x01,0x07,
-0x33,0x37,0x23,0x07,0x33,0x37,0x23,0x07,0x33,0x37,0x23,0x07,0x33,0x37,0x23,0x35,
-0x03,0x21,0x13,0x21,0x11,0x16,0x17,0x06,0x07,0x11,0x21,0x03,0x21,0x01,0x33,0x27,
-0x23,0x17,0x33,0x27,0x23,0x17,0x33,0x27,0x23,0x17,0x33,0x27,0x23,0x02,0xe1,0xa0,
-0x3c,0xa0,0xb4,0xa0,0x3c,0xa0,0xb4,0xa0,0x3c,0xa0,0xb4,0xa0,0x3c,0xa0,0x78,0xbb,
-0x02,0x1c,0xbb,0x01,0x87,0xad,0xc3,0xc3,0xad,0xfe,0x79,0xbb,0xfd,0xe4,0x02,0x5f,
-0x3c,0xa0,0x3c,0x28,0x3c,0xa0,0x3c,0x28,0x3c,0xa0,0x3c,0x28,0x3c,0xa0,0x3c,0x02,
-0x5a,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x50,0x01,0x18,0xfe,0xe8,0x01,0x16,
-0xbc,0x82,0x82,0xbc,0x01,0x16,0xfe,0xe8,0x01,0x68,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,
-0xf0,0x00,0x00,0x03,0x00,0xa5,0x00,0x70,0x05,0x74,0x05,0x3e,0x00,0x0c,0x00,0x10,
-0x00,0x14,0x00,0x00,0x01,0x37,0x06,0x15,0x14,0x17,0x26,0x23,0x22,0x07,0x37,0x27,
-0x37,0x09,0x01,0x21,0x01,0x25,0x11,0x01,0x11,0x04,0xa2,0xaf,0x07,0x2a,0x8e,0xa4,
-0x42,0x46,0xaf,0xfe,0x38,0xfe,0x1d,0x01,0xa9,0xfe,0xe5,0xfe,0x57,0x01,0x55,0x01,
-0xa8,0x01,0x7b,0xb0,0x46,0x43,0xa3,0x8f,0x2a,0x07,0xb0,0xfe,0x39,0x01,0x6f,0xfe,
-0x58,0x01,0xa8,0x3a,0x01,0x1b,0xfe,0x57,0xfe,0xe6,0x00,0x03,0x00,0x75,0x01,0x62,
-0x06,0x50,0x03,0xa2,0x00,0x08,0x00,0x0c,0x00,0x10,0x00,0x00,0x01,0x35,0x16,0x17,
-0x06,0x07,0x35,0x21,0x35,0x05,0x21,0x07,0x21,0x13,0x27,0x21,0x17,0x04,0xfe,0x9a,
-0xb8,0xb8,0x9a,0xfe,0x98,0xfd,0xa7,0x02,0x58,0xc8,0xfd,0xa8,0xc8,0xc8,0x02,0x58,
-0xc8,0x02,0xaa,0xf8,0xbc,0x64,0x64,0xbc,0xf8,0x50,0x52,0xc8,0x01,0x1a,0xc8,0xc8,
-0x00,0x03,0x00,0xa7,0xff,0xc5,0x05,0x74,0x04,0x94,0x00,0x0c,0x00,0x10,0x00,0x14,
-0x00,0x00,0x01,0x27,0x16,0x33,0x32,0x37,0x06,0x15,0x14,0x17,0x27,0x07,0x27,0x09,
-0x01,0x11,0x01,0x03,0x21,0x01,0x21,0x04,0x69,0xaf,0x46,0x42,0xa4,0x8e,0x2a,0x07,
-0xaf,0xff,0x38,0xfe,0x91,0x01,0xa8,0xfe,0x58,0x3a,0xfe,0xe5,0x01,0xa8,0x01,0x1b,
-0x03,0xc1,0xb0,0x07,0x2a,0x90,0xa2,0x43,0x46,0xb0,0xff,0x39,0xfe,0x1d,0x01,0xa8,
-0xfe,0xe5,0xfe,0x58,0x01,0x55,0x01,0xa8,0x00,0x01,0x00,0xa7,0x00,0x70,0x05,0x74,
-0x05,0x3e,0x00,0x32,0x00,0x00,0x25,0x26,0x23,0x22,0x07,0x36,0x37,0x36,0x37,0x01,
-0x26,0x27,0x26,0x22,0x07,0x06,0x07,0x01,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x17,
-0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x01,0x06,0x07,0x06,0x15,0x14,0x17,0x16,
-0x17,0x01,0x36,0x37,0x36,0x37,0x06,0x15,0x14,0x05,0x74,0x8f,0xa5,0x42,0x45,0x48,
-0x59,0x27,0x18,0xfe,0xd1,0x1d,0x23,0x26,0x4e,0x27,0x24,0x1c,0xfe,0x58,0x24,0x29,
-0x2e,0x2f,0x2c,0x30,0x2b,0x22,0x22,0x11,0x13,0x13,0x11,0x22,0x01,0xa8,0x20,0x0b,
-0x0e,0x0e,0x0f,0x1c,0x01,0x2f,0x04,0x10,0x25,0x48,0x07,0x70,0x2a,0x07,0x47,0x26,
-0x10,0x03,0x01,0x2f,0x1d,0x0e,0x0f,0x0f,0x0f,0x1c,0x01,0xa8,0x24,0x10,0x12,0x12,
-0x11,0x23,0x23,0x2a,0x30,0x2c,0x30,0x2e,0x2b,0x22,0xfe,0x57,0x21,0x1f,0x27,0x26,
-0x27,0x26,0x23,0x1d,0xfe,0xd1,0x17,0x27,0x5a,0x47,0x47,0x43,0xa3,0x00,0x00,0x01,
-0x00,0x75,0x01,0x61,0x06,0x50,0x03,0xa3,0x00,0x2f,0x00,0x00,0x01,0x06,0x07,0x34,
-0x37,0x36,0x37,0x21,0x22,0x07,0x06,0x07,0x06,0x07,0x06,0x15,0x21,0x34,0x37,0x36,
-0x37,0x36,0x37,0x36,0x33,0x22,0x27,0x26,0x27,0x26,0x27,0x26,0x35,0x21,0x14,0x17,
-0x16,0x17,0x16,0x17,0x16,0x33,0x21,0x26,0x27,0x26,0x35,0x16,0x06,0x50,0xb7,0x9b,
-0x25,0x10,0x0e,0xfe,0x54,0x29,0x23,0x24,0x1d,0x1c,0x10,0x0f,0xfd,0xa8,0x12,0x13,
-0x22,0x1f,0x2f,0x2a,0x31,0x31,0x2a,0x2f,0x1f,0x22,0x13,0x12,0x02,0x58,0x0f,0x10,
-0x1c,0x1d,0x24,0x23,0x29,0x01,0xac,0x0e,0x10,0x25,0x9b,0x02,0x82,0x65,0xbc,0x65,
-0x5a,0x27,0x13,0x0f,0x10,0x1c,0x1b,0x26,0x24,0x28,0x30,0x2b,0x2e,0x21,0x1f,0x15,
-0x12,0x12,0x15,0x1f,0x22,0x2d,0x2b,0x30,0x28,0x24,0x26,0x1b,0x1c,0x10,0x0f,0x13,
-0x27,0x5a,0x65,0xbc,0x00,0x01,0x00,0xa7,0xff,0xc6,0x05,0x74,0x04,0x94,0x00,0x32,
-0x00,0x00,0x01,0x06,0x15,0x14,0x17,0x26,0x27,0x26,0x27,0x01,0x06,0x07,0x06,0x15,
-0x14,0x17,0x16,0x17,0x01,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x06,0x07,0x06,
-0x23,0x22,0x27,0x26,0x27,0x01,0x16,0x17,0x16,0x32,0x37,0x36,0x37,0x01,0x26,0x27,
-0x26,0x27,0x16,0x33,0x32,0x05,0x74,0x29,0x07,0x48,0x25,0x10,0x04,0xfe,0xd1,0x1f,
-0x0c,0x0e,0x0e,0x0f,0x1c,0xfe,0x58,0x22,0x11,0x13,0x13,0x11,0x22,0x22,0x2b,0x30,
-0x2c,0x30,0x2d,0x2b,0x22,0x01,0xa8,0x1c,0x24,0x27,0x4e,0x26,0x23,0x1d,0x01,0x2f,
-0x18,0x27,0x59,0x48,0x45,0x42,0xa5,0x04,0x94,0x8e,0xa3,0x43,0x47,0x47,0x5a,0x27,
-0x17,0xfe,0xd1,0x21,0x1f,0x26,0x27,0x26,0x27,0x24,0x1c,0xfe,0x57,0x22,0x2b,0x2e,
-0x30,0x2c,0x30,0x2a,0x23,0x23,0x11,0x12,0x12,0x12,0x22,0x01,0xa8,0x1c,0x0f,0x0f,
-0x0f,0x0e,0x1d,0x01,0x2f,0x03,0x10,0x26,0x47,0x07,0x00,0x03,0x00,0x73,0x00,0xac,
-0x06,0x50,0x04,0x58,0x00,0x16,0x00,0x2b,0x00,0x42,0x00,0x00,0x01,0x36,0x25,0x06,
-0x03,0x06,0x07,0x06,0x07,0x06,0x22,0x27,0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,
-0x36,0x37,0x36,0x24,0x34,0x37,0x36,0x37,0x36,0x37,0x36,0x32,0x17,0x04,0x05,0x04,
-0x05,0x06,0x22,0x27,0x26,0x27,0x26,0x27,0x01,0x26,0x27,0x26,0x27,0x26,0x35,0x34,
-0x37,0x36,0x37,0x36,0x37,0x36,0x32,0x17,0x16,0x17,0x16,0x17,0x12,0x17,0x24,0x04,
-0x2f,0xf6,0x01,0x2b,0xe3,0x7a,0x0c,0x15,0x16,0x1b,0x1a,0x3e,0x1a,0x1b,0x16,0x15,
-0x0c,0x0b,0x0b,0x0c,0x15,0x16,0xfc,0x5f,0x0f,0x11,0x1b,0x1d,0x24,0x23,0x52,0x23,
-0x01,0x61,0x03,0x66,0xfc,0x82,0xfe,0xb7,0x23,0x52,0x23,0x29,0x18,0x1d,0x0f,0x03,
-0xad,0x1b,0x16,0x15,0x0c,0x0b,0x0b,0x0c,0x15,0x16,0x1b,0x1a,0x3e,0x1a,0x1b,0x16,
-0x12,0x0f,0x78,0xe5,0xfe,0x94,0x01,0xce,0x62,0x51,0x75,0xfe,0xfd,0x1d,0x14,0x15,
-0x0c,0x0b,0x0b,0x0c,0x15,0x14,0x1d,0x1b,0x1f,0x1e,0x1b,0x1d,0x14,0x15,0x97,0x52,
-0x24,0x27,0x1a,0x1c,0x10,0x0f,0x0e,0x85,0x36,0x38,0x83,0x0e,0x0f,0x12,0x1a,0x1f,
-0x22,0x01,0x01,0x0c,0x15,0x14,0x1d,0x1b,0x1e,0x1f,0x1b,0x1d,0x14,0x15,0x0c,0x0b,
-0x0b,0x0c,0x15,0x11,0x20,0xfe,0xfe,0x76,0x63,0x00,0x00,0x02,0x00,0x96,0x01,0x1f,
-0x06,0x3c,0x03,0xe5,0x00,0x1a,0x00,0x2e,0x00,0x00,0x13,0x36,0x37,0x36,0x37,0x36,
-0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x16,0x05,0x04,0x07,0x0e,0x01,0x23,0x22,0x27,
-0x26,0x27,0x26,0x27,0x26,0x25,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x16,0x17,
-0x06,0x07,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x96,0x41,0x1e,0x20,0x14,0x27,0x27,
-0x2b,0x2f,0x35,0x34,0x3c,0x33,0xa2,0x01,0x91,0xfe,0x6f,0xa2,0x38,0x6e,0x32,0x33,
-0x27,0x39,0x15,0x1d,0x17,0x1d,0x04,0x06,0x25,0x12,0x13,0x13,0x12,0x25,0x62,0xfc,
-0xfc,0x62,0x25,0x12,0x13,0x13,0x12,0x02,0x82,0x26,0x3a,0x3f,0x13,0x24,0x12,0x13,
-0x13,0x16,0x20,0x66,0x4c,0x4c,0x66,0x23,0x26,0x13,0x1d,0x19,0x23,0x2f,0x3a,0x26,
-0x27,0x2b,0x2d,0x32,0x33,0x2d,0x2b,0x27,0xf1,0x72,0x72,0xf1,0x27,0x2b,0x2d,0x33,
-0x32,0x2d,0x2b,0x00,0x00,0x01,0x00,0xa2,0x01,0x56,0x06,0x32,0x03,0xae,0x00,0x65,
-0x00,0x00,0x00,0x14,0x06,0x0f,0x01,0x06,0x07,0x06,0x22,0x27,0x26,0x27,0x2e,0x01,
-0x35,0x34,0x3f,0x01,0x36,0x35,0x34,0x27,0x26,0x27,0x26,0x27,0x26,0x23,0x21,0x22,
-0x07,0x06,0x07,0x06,0x0f,0x01,0x06,0x07,0x06,0x07,0x06,0x23,0x21,0x22,0x2e,0x02,
-0x34,0x3f,0x01,0x36,0x34,0x2f,0x01,0x26,0x34,0x36,0x37,0x36,0x37,0x36,0x33,0x21,
-0x32,0x17,0x16,0x17,0x16,0x1f,0x01,0x16,0x17,0x16,0x17,0x16,0x33,0x21,0x32,0x37,
-0x36,0x37,0x36,0x37,0x36,0x35,0x34,0x2f,0x01,0x26,0x35,0x34,0x36,0x37,0x36,0x37,
-0x36,0x32,0x17,0x16,0x1f,0x01,0x16,0x06,0x32,0x06,0x06,0xf0,0x04,0x09,0x07,0x10,
-0x07,0x07,0x06,0x06,0x06,0x03,0x1b,0x03,0x03,0x03,0x06,0x05,0x08,0x08,0x07,0xfe,
-0xe6,0x08,0x07,0x07,0x06,0x05,0x04,0x5a,0x05,0x03,0x06,0x08,0x06,0x08,0xfd,0x9c,
-0x08,0x0e,0x0c,0x06,0x03,0x72,0x03,0x03,0x72,0x03,0x06,0x06,0x06,0x07,0x07,0x08,
-0x02,0x64,0x08,0x06,0x09,0x05,0x03,0x05,0x5a,0x04,0x05,0x06,0x07,0x07,0x08,0x01,
-0x1a,0x07,0x08,0x08,0x05,0x06,0x03,0x03,0x03,0x1b,0x03,0x06,0x06,0x06,0x07,0x07,
-0x10,0x07,0x09,0x04,0xf0,0x06,0x02,0x8b,0x12,0x0e,0x06,0xf0,0x04,0x05,0x03,0x03,
-0x04,0x05,0x06,0x0e,0x09,0x04,0x0b,0x63,0x0b,0x05,0x07,0x07,0x08,0x06,0x05,0x03,
-0x04,0x03,0x04,0x05,0x05,0x08,0xb4,0x0a,0x03,0x05,0x04,0x03,0x06,0x0c,0x0e,0x12,
-0x06,0xe4,0x06,0x14,0x06,0xe4,0x06,0x12,0x0e,0x06,0x05,0x04,0x03,0x03,0x03,0x06,
-0x03,0x0a,0xb4,0x08,0x05,0x05,0x04,0x03,0x04,0x03,0x05,0x06,0x08,0x07,0x07,0x05,
-0x0b,0x63,0x0b,0x04,0x09,0x0e,0x06,0x05,0x04,0x03,0x03,0x05,0x04,0xf0,0x06,0x00,
-0x00,0x01,0x00,0xa2,0x00,0xf1,0x06,0x32,0x04,0x13,0x00,0x67,0x00,0x00,0x00,0x14,
-0x07,0x06,0x07,0x01,0x06,0x07,0x06,0x22,0x27,0x26,0x27,0x2e,0x01,0x35,0x34,0x3f,
-0x01,0x36,0x35,0x34,0x27,0x26,0x27,0x26,0x27,0x26,0x2b,0x01,0x22,0x07,0x06,0x07,
-0x06,0x0f,0x01,0x06,0x07,0x06,0x07,0x06,0x23,0x21,0x22,0x2e,0x02,0x34,0x37,0x13,
-0x36,0x34,0x27,0x03,0x26,0x34,0x36,0x37,0x36,0x37,0x36,0x33,0x21,0x32,0x17,0x16,
-0x17,0x16,0x17,0x13,0x16,0x17,0x16,0x17,0x16,0x3b,0x01,0x32,0x37,0x36,0x37,0x36,
-0x37,0x36,0x35,0x34,0x2f,0x01,0x26,0x35,0x34,0x36,0x37,0x36,0x37,0x36,0x32,0x17,
-0x16,0x17,0x01,0x16,0x17,0x06,0x32,0x03,0x03,0x06,0xfe,0x70,0x05,0x08,0x07,0x10,
-0x07,0x07,0x06,0x06,0x06,0x03,0x57,0x03,0x03,0x03,0x06,0x05,0x08,0x08,0x07,0x5c,
-0x08,0x07,0x07,0x06,0x05,0x04,0x78,0x05,0x03,0x06,0x08,0x06,0x08,0xfd,0x6a,0x08,
-0x0e,0x0c,0x06,0x03,0x90,0x03,0x03,0x9a,0x03,0x06,0x06,0x06,0x07,0x07,0x08,0x02,
-0x96,0x08,0x06,0x09,0x05,0x03,0x05,0x82,0x04,0x05,0x06,0x07,0x07,0x08,0x5c,0x07,
-0x08,0x08,0x05,0x06,0x03,0x03,0x03,0x57,0x03,0x06,0x06,0x06,0x07,0x07,0x10,0x07,
-0x08,0x05,0x01,0x90,0x06,0x03,0x02,0x8b,0x12,0x07,0x08,0x05,0xfe,0x98,0x05,0x04,
-0x03,0x03,0x04,0x05,0x06,0x0e,0x09,0x07,0x08,0xdb,0x08,0x08,0x07,0x07,0x08,0x06,
-0x05,0x03,0x04,0x03,0x04,0x05,0x05,0x08,0xf0,0x0a,0x03,0x05,0x04,0x03,0x06,0x0c,
-0x0e,0x12,0x06,0x01,0x20,0x06,0x14,0x06,0x01,0x34,0x06,0x12,0x0e,0x06,0x05,0x04,
-0x03,0x03,0x03,0x06,0x03,0x0a,0xfe,0xfc,0x08,0x05,0x05,0x04,0x03,0x04,0x03,0x05,
-0x06,0x08,0x07,0x07,0x08,0x08,0xdb,0x08,0x07,0x09,0x0e,0x06,0x05,0x04,0x03,0x03,
-0x04,0x05,0xfe,0x98,0x05,0x08,0x00,0x03,0x00,0x75,0x00,0xa6,0x06,0x50,0x04,0x5e,
-0x00,0x13,0x00,0x1f,0x00,0x2b,0x00,0x00,0x01,0x06,0x07,0x06,0x07,0x23,0x37,0x36,
-0x37,0x36,0x37,0x26,0x27,0x26,0x2f,0x01,0x33,0x16,0x17,0x16,0x01,0x23,0x36,0x37,
-0x36,0x37,0x21,0x35,0x21,0x06,0x07,0x06,0x03,0x16,0x17,0x16,0x17,0x21,0x35,0x21,
-0x26,0x27,0x26,0x27,0x06,0x50,0x88,0x53,0x8c,0x4a,0x6c,0x0a,0x52,0xa0,0x26,0x47,
-0x47,0x26,0xa0,0x52,0x0a,0x6c,0x48,0x8e,0x53,0xfd,0xcc,0x69,0x13,0x18,0x1f,0x2a,
-0xfc,0xd6,0x03,0xe5,0x6e,0x3a,0x11,0x0d,0x0d,0x11,0x3a,0x6e,0xfc,0x1b,0x03,0x2a,
-0x2a,0x1f,0x18,0x13,0x02,0x82,0x4f,0x55,0x8f,0xa9,0x18,0xc3,0xa4,0x27,0x36,0x36,
-0x27,0xa4,0xc3,0x18,0xa4,0x94,0x55,0xfd,0xd5,0x3d,0x3b,0x4a,0x48,0x64,0x8e,0x8e,
-0x29,0x03,0x8f,0x29,0x29,0x8e,0x8e,0x64,0x48,0x4a,0x3b,0x3d,0x00,0x03,0x00,0x06,
-0xfe,0x23,0x03,0xee,0x06,0x75,0x00,0x03,0x00,0x06,0x00,0x09,0x00,0x00,0x09,0x05,
-0x21,0x09,0x01,0x21,0x01,0xf9,0x01,0xf5,0xfe,0x0b,0xfe,0x0d,0x01,0xf3,0xfe,0x98,
-0x02,0xd2,0xfe,0x96,0x01,0x6a,0xfd,0x2e,0x06,0x75,0xfb,0xdb,0xfb,0xd3,0x04,0x2d,
-0x03,0x31,0xfd,0x08,0xfc,0x8e,0x03,0x00,0xff,0xff,0x00,0xb7,0xfe,0xf2,0x02,0x7b,
-0x06,0x12,0x10,0x06,0x09,0x0a,0x00,0x00,0xff,0xff,0x00,0xa4,0xfe,0xf2,0x02,0x68,
-0x06,0x12,0x10,0x06,0x09,0x0b,0x00,0x00,0xff,0xff,0x00,0xb7,0xfe,0xf2,0x03,0xcf,
-0x06,0x12,0x10,0x27,0x09,0x0a,0x01,0x54,0x00,0x00,0x10,0x06,0x09,0x0a,0x00,0x00,
-0xff,0xff,0x00,0xa4,0xfe,0xf2,0x03,0xbc,0x06,0x12,0x10,0x27,0x09,0x0b,0x01,0x54,
-0x00,0x00,0x10,0x06,0x09,0x0b,0x00,0x00,0x00,0x01,0x00,0x06,0xfe,0x23,0x03,0xee,
-0x06,0x75,0x00,0x03,0x00,0x00,0x09,0x03,0x01,0xfa,0x01,0xf4,0xfe,0x0c,0xfe,0x0c,
-0x06,0x75,0xfb,0xdb,0xfb,0xd3,0x04,0x2d,0xff,0xff,0x00,0x2f,0xfe,0x8d,0x0b,0xe9,
-0x06,0x0e,0x10,0x27,0x08,0x9c,0x07,0xef,0x00,0x00,0x10,0x26,0x08,0x9c,0x00,0x00,
-0x10,0x27,0x08,0x9c,0x02,0xa5,0x00,0x00,0x10,0x07,0x08,0x9c,0x05,0x4a,0x00,0x00,
-0x00,0x01,0x00,0x2f,0xfe,0x8d,0x03,0xfa,0x06,0x0e,0x00,0x2d,0x00,0x00,0x01,0x32,
-0x13,0x37,0x21,0x35,0x21,0x12,0x37,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,
-0x26,0x27,0x2e,0x01,0x23,0x22,0x03,0x07,0x21,0x15,0x21,0x14,0x07,0x02,0x07,0x06,
-0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x1e,0x01,0x01,0x37,0x6a,0x0e,
-0x02,0xfe,0xff,0x01,0x07,0x14,0x52,0x5f,0xca,0x50,0x64,0x40,0x37,0x2a,0x38,0x0c,
-0x06,0x09,0x10,0x6b,0x0e,0x02,0x01,0x08,0xfe,0xf3,0x01,0x11,0x5e,0x5f,0xc4,0x4f,
-0x65,0x44,0x3d,0x21,0x30,0x0f,0x0a,0x0a,0xfe,0xfa,0x02,0xb0,0x82,0xaa,0x01,0x9a,
-0xc0,0xde,0x54,0x41,0x36,0x3f,0x26,0x23,0x0f,0x48,0xfd,0x95,0x63,0xaa,0x12,0x10,
-0xfe,0x21,0xcf,0xcf,0x53,0x41,0x38,0x3f,0x1d,0x1c,0x12,0x53,0x00,0x01,0x00,0x2f,
-0xfe,0x8d,0x03,0xfa,0x06,0x0e,0x00,0x34,0x00,0x00,0x01,0x02,0x07,0x06,0x23,0x22,
-0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x1e,0x01,0x33,0x32,0x13,0x23,0x35,0x21,
-0x37,0x36,0x37,0x21,0x35,0x21,0x12,0x37,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,
-0x22,0x26,0x27,0x2e,0x01,0x23,0x22,0x03,0x21,0x15,0x21,0x06,0x07,0x21,0x15,0x02,
-0x6c,0x1a,0x4c,0x5f,0xc4,0x4f,0x65,0x44,0x3d,0x21,0x30,0x0f,0x0a,0x0a,0x13,0x64,
-0x12,0xfd,0x01,0x01,0x01,0x02,0x05,0xfe,0xf7,0x01,0x16,0x1b,0x3c,0x5f,0xca,0x50,
-0x64,0x40,0x37,0x2a,0x38,0x0c,0x06,0x09,0x10,0x62,0x14,0x01,0x03,0xfe,0xf9,0x04,
-0x03,0x01,0x0e,0x01,0x60,0xfe,0xa4,0xa8,0xcf,0x53,0x41,0x38,0x3f,0x1d,0x1c,0x12,
-0x53,0x02,0x66,0xaa,0x45,0x5a,0x51,0xa8,0x01,0x02,0x8c,0xde,0x54,0x41,0x36,0x3f,
-0x26,0x23,0x0f,0x48,0xfd,0xfe,0xa8,0xa3,0x4d,0xaa,0x00,0x02,0x00,0x06,0xff,0x03,
-0x06,0x21,0x05,0x25,0x00,0x03,0x00,0x07,0x00,0x00,0x17,0x11,0x21,0x11,0x25,0x21,
-0x11,0x21,0x06,0x06,0x1b,0xfa,0x57,0x05,0x37,0xfa,0xc9,0xfc,0x06,0x20,0xf9,0xe0,
-0x72,0x02,0x9e,0x00,0x00,0x02,0x00,0x06,0xff,0x03,0x06,0x21,0x05,0x25,0x00,0x03,
-0x00,0x07,0x00,0x00,0x17,0x11,0x21,0x11,0x01,0x21,0x11,0x21,0x06,0x06,0x1b,0xfa,
-0x57,0x05,0x37,0xfa,0xc9,0xfc,0x06,0x20,0xf9,0xe0,0x03,0x10,0x02,0x9e,0x00,0x03,
-0x01,0x91,0x06,0x63,0x03,0xe7,0x08,0x34,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x00,
-0x01,0x33,0x15,0x23,0x25,0x33,0x15,0x23,0x03,0x21,0x15,0x21,0x03,0x1a,0xcb,0xcb,
-0xfe,0x79,0xcb,0xcb,0x02,0x02,0x56,0xfd,0xaa,0x07,0x2d,0xca,0xca,0xca,0x01,0xd1,
-0x94,0x00,0x00,0x03,0x01,0x91,0x06,0x63,0x03,0xe7,0x08,0x34,0x00,0x03,0x00,0x07,
-0x00,0x0b,0x00,0x00,0x01,0x21,0x15,0x21,0x01,0x33,0x15,0x23,0x25,0x33,0x15,0x23,
-0x01,0x91,0x02,0x56,0xfd,0xaa,0x01,0x89,0xcb,0xcb,0xfe,0x79,0xcb,0xcb,0x06,0xf7,
-0x94,0x01,0xd1,0xca,0xca,0xca,0x00,0x02,0x01,0x91,0x06,0x63,0x03,0xe7,0x08,0x34,
-0x00,0x03,0x00,0x07,0x00,0x00,0x01,0x33,0x15,0x23,0x03,0x21,0x15,0x21,0x02,0x56,
-0xcc,0xcc,0xc5,0x02,0x56,0xfd,0xaa,0x07,0x2f,0xcc,0x01,0xd1,0x94,0x00,0x00,0x03,
-0x01,0x93,0x06,0x63,0x04,0x42,0x08,0x57,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x00,
-0x01,0x33,0x15,0x23,0x25,0x33,0x15,0x23,0x01,0x33,0x01,0x23,0x03,0x1a,0xcb,0xcb,
-0xfe,0x79,0xcb,0xcb,0x01,0xe8,0xc7,0xfe,0xba,0x99,0x07,0x2d,0xca,0xca,0xca,0x01,
-0xf4,0xfe,0xf8,0x00,0x00,0x03,0x01,0x2d,0x06,0x63,0x03,0xe5,0x08,0x57,0x00,0x03,
-0x00,0x07,0x00,0x0b,0x00,0x00,0x01,0x33,0x15,0x23,0x25,0x33,0x15,0x23,0x13,0x01,
-0x23,0x01,0x03,0x1a,0xcb,0xcb,0xfe,0x79,0xcb,0xcb,0x5f,0x01,0x1a,0x99,0xfe,0xba,
-0x07,0x2d,0xca,0xca,0xca,0x01,0xf4,0xfe,0xfa,0x01,0x06,0x00,0x00,0x02,0x01,0x91,
-0x06,0x63,0x04,0x42,0x08,0x57,0x00,0x03,0x00,0x07,0x00,0x00,0x01,0x21,0x15,0x21,
-0x01,0x33,0x01,0x23,0x01,0x91,0x02,0x56,0xfd,0xaa,0x01,0xea,0xc7,0xfe,0xba,0x99,
-0x06,0xf7,0x94,0x01,0xf4,0xfe,0xf8,0x00,0x00,0x03,0x01,0xe5,0x05,0xb3,0x05,0x42,
-0x08,0x57,0x00,0x0a,0x00,0x12,0x00,0x16,0x00,0x00,0x00,0x34,0x26,0x23,0x22,0x06,
-0x15,0x14,0x16,0x33,0x32,0x36,0x14,0x06,0x22,0x26,0x34,0x36,0x32,0x25,0x33,0x01,
-0x23,0x03,0x3a,0x46,0x33,0x34,0x46,0x46,0x34,0x33,0xa8,0x7f,0xb8,0x80,0x80,0xb8,
-0x01,0x5e,0xc7,0xfe,0xba,0x99,0x06,0x5c,0x66,0x46,0x46,0x33,0x34,0x45,0xd5,0xb8,
-0x80,0x80,0xb8,0x7f,0xed,0xfe,0xf8,0x00,0x00,0x02,0x01,0x2d,0x06,0x63,0x03,0xe7,
-0x08,0x57,0x00,0x03,0x00,0x07,0x00,0x00,0x01,0x21,0x15,0x21,0x13,0x01,0x23,0x01,
-0x01,0x91,0x02,0x56,0xfd,0xaa,0x61,0x01,0x1a,0x99,0xfe,0xba,0x06,0xf7,0x94,0x01,
-0xf4,0xfe,0xfa,0x01,0x06,0x00,0x00,0x02,0x01,0x72,0x06,0x63,0x04,0x06,0x08,0x34,
-0x00,0x1b,0x00,0x1f,0x00,0x00,0x01,0x27,0x2e,0x01,0x23,0x22,0x06,0x07,0x23,0x3e,
-0x01,0x33,0x32,0x16,0x1f,0x01,0x1e,0x01,0x33,0x32,0x36,0x37,0x33,0x0e,0x01,0x23,
-0x22,0x26,0x01,0x21,0x15,0x21,0x02,0xb8,0x39,0x16,0x21,0x0d,0x26,0x24,0x02,0x7d,
-0x02,0x66,0x5b,0x26,0x40,0x25,0x39,0x16,0x21,0x0d,0x26,0x24,0x02,0x7d,0x02,0x66,
-0x5b,0x26,0x40,0xfe,0xb4,0x02,0x56,0xfd,0xaa,0x06,0x94,0x2c,0x10,0x0f,0x3a,0x42,
-0x6c,0x76,0x17,0x1a,0x2c,0x10,0x0f,0x3a,0x42,0x6c,0x76,0x17,0x01,0xba,0x94,0x00,
-0x00,0x03,0x01,0x7d,0x06,0x63,0x03,0xfb,0x08,0x58,0x00,0x03,0x00,0x07,0x00,0x0e,
-0x00,0x00,0x01,0x33,0x15,0x23,0x25,0x33,0x15,0x23,0x37,0x03,0x33,0x17,0x37,0x33,
-0x03,0x03,0x1a,0xcb,0xcb,0xfe,0x79,0xcb,0xcb,0xdf,0xf5,0x8b,0xb4,0xb4,0x8b,0xf5,
-0x07,0x2d,0xca,0xca,0xca,0xed,0x01,0x08,0xac,0xac,0xfe,0xf8,0x00,0x03,0x01,0x72,
-0x06,0x63,0x04,0x06,0x08,0x57,0x00,0x1b,0x00,0x1f,0x00,0x23,0x00,0x00,0x01,0x27,
-0x2e,0x01,0x23,0x22,0x06,0x07,0x23,0x3e,0x01,0x33,0x32,0x16,0x1f,0x01,0x1e,0x01,
-0x33,0x32,0x36,0x37,0x33,0x0e,0x01,0x23,0x22,0x26,0x13,0x33,0x15,0x23,0x25,0x33,
-0x15,0x23,0x02,0xb8,0x39,0x16,0x21,0x0d,0x26,0x24,0x02,0x7d,0x02,0x66,0x5b,0x26,
-0x40,0x25,0x39,0x16,0x21,0x0d,0x26,0x24,0x02,0x7d,0x02,0x66,0x5b,0x26,0x40,0x3d,
-0xcb,0xcb,0xfe,0x79,0xcb,0xcb,0x06,0x94,0x2c,0x10,0x0f,0x3a,0x42,0x6c,0x76,0x17,
-0x1a,0x2c,0x10,0x0f,0x3a,0x42,0x6c,0x76,0x17,0x01,0xdd,0xca,0xca,0xca,0x00,0x02,
-0x01,0x7d,0x06,0x63,0x03,0xfb,0x08,0x57,0x00,0x06,0x00,0x0a,0x00,0x00,0x01,0x03,
-0x33,0x17,0x37,0x33,0x0b,0x01,0x33,0x15,0x23,0x02,0x72,0xf5,0x8b,0xb4,0xb4,0x8b,
-0xf5,0xb0,0xcc,0xcc,0x06,0x63,0x01,0x08,0xac,0xac,0xfe,0xf8,0x01,0xf4,0xcc,0x00,
-0x00,0x02,0x01,0x72,0x06,0x63,0x04,0x93,0x08,0x57,0x00,0x1b,0x00,0x1f,0x00,0x00,
-0x01,0x27,0x2e,0x01,0x23,0x22,0x06,0x07,0x23,0x3e,0x01,0x33,0x32,0x16,0x1f,0x01,
-0x1e,0x01,0x33,0x32,0x36,0x37,0x33,0x0e,0x01,0x23,0x22,0x26,0x13,0x33,0x01,0x23,
-0x02,0xb8,0x39,0x16,0x21,0x0d,0x26,0x24,0x02,0x7d,0x02,0x66,0x5b,0x26,0x40,0x25,
-0x39,0x16,0x21,0x0d,0x26,0x24,0x02,0x7d,0x02,0x66,0x5b,0x26,0x40,0xef,0xc7,0xfe,
-0xba,0x99,0x06,0x94,0x2c,0x10,0x0f,0x3a,0x42,0x6c,0x76,0x17,0x1a,0x2c,0x10,0x0f,
-0x3a,0x42,0x6c,0x76,0x17,0x01,0xdd,0xfe,0xf8,0x00,0x00,0x02,0x01,0x7d,0x06,0x63,
-0x05,0x79,0x08,0x35,0x00,0x06,0x00,0x0a,0x00,0x00,0x01,0x33,0x13,0x23,0x27,0x07,
-0x23,0x01,0x33,0x01,0x23,0x02,0x72,0x94,0xf5,0x8b,0xb4,0xb4,0x8b,0x03,0x35,0xc7,
-0xfe,0xba,0x99,0x07,0x6b,0xfe,0xf8,0xac,0xac,0x01,0xd2,0xfe,0xf8,0x00,0x00,0x02,
-0xff,0xfe,0x06,0x63,0x03,0xfb,0x08,0x35,0x00,0x06,0x00,0x0a,0x00,0x00,0x01,0x33,
-0x13,0x23,0x27,0x07,0x23,0x03,0x01,0x23,0x01,0x02,0x72,0x94,0xf5,0x8b,0xb4,0xb4,
-0x8b,0xba,0x01,0x1a,0x99,0xfe,0xba,0x07,0x6b,0xfe,0xf8,0xac,0xac,0x01,0xd2,0xfe,
-0xfa,0x01,0x06,0x00,0x00,0x02,0x01,0x72,0x06,0x62,0x04,0x06,0x08,0x57,0x00,0x06,
-0x00,0x22,0x00,0x00,0x01,0x33,0x17,0x23,0x27,0x07,0x23,0x01,0x27,0x2e,0x01,0x23,
-0x22,0x06,0x07,0x23,0x3e,0x01,0x33,0x32,0x16,0x1f,0x01,0x1e,0x01,0x33,0x32,0x36,
-0x37,0x33,0x0e,0x01,0x23,0x22,0x26,0x02,0x72,0x94,0xf5,0x8b,0xb4,0xb4,0x8b,0x01,
-0x3b,0x39,0x16,0x21,0x0d,0x26,0x24,0x02,0x7d,0x02,0x66,0x5b,0x26,0x40,0x25,0x39,
-0x16,0x21,0x0d,0x26,0x24,0x02,0x7d,0x02,0x66,0x5b,0x26,0x40,0x07,0x57,0xf5,0xa0,
-0xa0,0x01,0x50,0x29,0x0f,0x0e,0x37,0x3d,0x65,0x6e,0x15,0x18,0x2a,0x0f,0x0e,0x37,
-0x3d,0x65,0x6e,0x15,0x00,0x02,0x01,0x72,0x06,0x63,0x04,0x06,0x08,0x57,0x00,0x0c,
-0x00,0x28,0x00,0x00,0x01,0x33,0x1e,0x01,0x33,0x32,0x36,0x37,0x33,0x0e,0x01,0x20,
-0x26,0x25,0x27,0x2e,0x01,0x23,0x22,0x06,0x07,0x23,0x3e,0x01,0x33,0x32,0x16,0x1f,
-0x01,0x1e,0x01,0x33,0x32,0x36,0x37,0x33,0x0e,0x01,0x23,0x22,0x26,0x01,0x83,0x76,
-0x0b,0x61,0x57,0x56,0x60,0x0d,0x76,0x0a,0x9e,0xfe,0xde,0x9e,0x01,0x2b,0x39,0x16,
-0x21,0x0d,0x26,0x24,0x02,0x7d,0x02,0x66,0x5b,0x26,0x40,0x25,0x39,0x16,0x21,0x0d,
-0x26,0x24,0x02,0x7d,0x02,0x66,0x5b,0x26,0x40,0x07,0x3a,0x38,0x38,0x37,0x39,0x6b,
-0x6c,0x6c,0xe3,0x29,0x0f,0x0e,0x37,0x3d,0x65,0x6e,0x15,0x18,0x2a,0x0f,0x0e,0x37,
-0x3d,0x65,0x6e,0x15,0x00,0x02,0x01,0x83,0x06,0x63,0x04,0x3a,0x08,0x57,0x00,0x0c,
-0x00,0x10,0x00,0x00,0x01,0x33,0x1e,0x01,0x33,0x32,0x36,0x37,0x33,0x0e,0x01,0x20,
-0x26,0x01,0x33,0x01,0x23,0x01,0x83,0x76,0x0b,0x61,0x57,0x56,0x60,0x0d,0x76,0x0a,
-0x9e,0xfe,0xde,0x9e,0x01,0xe6,0xc7,0xfe,0xba,0x99,0x07,0x48,0x3c,0x3c,0x3c,0x3c,
-0x72,0x73,0x73,0x01,0x81,0xfe,0xf8,0x00,0x00,0x02,0x01,0x38,0x06,0x63,0x03,0xf5,
-0x08,0x57,0x00,0x0c,0x00,0x10,0x00,0x00,0x01,0x33,0x1e,0x01,0x33,0x32,0x36,0x37,
-0x33,0x0e,0x01,0x20,0x26,0x13,0x01,0x23,0x01,0x01,0x83,0x76,0x0b,0x61,0x57,0x56,
-0x60,0x0d,0x76,0x0a,0x9e,0xfe,0xde,0x9e,0x70,0x01,0x1a,0x99,0xfe,0xba,0x07,0x48,
-0x3c,0x3c,0x3c,0x3c,0x72,0x73,0x73,0x01,0x81,0xfe,0xfa,0x01,0x06,0x00,0x00,0x02,
-0x01,0x83,0x06,0x63,0x03,0xf5,0x08,0x57,0x00,0x0c,0x00,0x2d,0x00,0x00,0x01,0x33,
-0x1e,0x01,0x33,0x32,0x36,0x37,0x33,0x0e,0x01,0x20,0x26,0x25,0x23,0x35,0x34,0x36,
-0x3f,0x01,0x3e,0x01,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x35,0x3e,0x01,0x33,0x32,
-0x16,0x15,0x14,0x06,0x0f,0x01,0x0e,0x01,0x07,0x0e,0x01,0x15,0x01,0x83,0x76,0x0b,
-0x61,0x57,0x56,0x60,0x0d,0x76,0x0a,0x9e,0xfe,0xde,0x9e,0x01,0x79,0x91,0x20,0x31,
-0x2d,0x1a,0x14,0x31,0x2e,0x22,0x53,0x55,0x3e,0x67,0x37,0x65,0x7f,0x28,0x30,0x2c,
-0x16,0x10,0x03,0x02,0x03,0x07,0x48,0x3c,0x3c,0x3c,0x3c,0x72,0x73,0x73,0x2b,0x3a,
-0x1e,0x2a,0x1a,0x19,0x0e,0x15,0x0a,0x12,0x18,0x12,0x21,0x57,0x15,0x11,0x3f,0x32,
-0x18,0x2c,0x1a,0x18,0x0c,0x0c,0x05,0x04,0x10,0x0d,0x00,0x02,0x01,0x7d,0x06,0x63,
-0x05,0x08,0x08,0x57,0x00,0x06,0x00,0x27,0x00,0x00,0x01,0x33,0x13,0x23,0x27,0x07,
-0x23,0x25,0x23,0x35,0x34,0x36,0x3f,0x01,0x3e,0x01,0x35,0x34,0x26,0x23,0x22,0x06,
-0x07,0x35,0x3e,0x01,0x33,0x32,0x16,0x15,0x14,0x06,0x0f,0x01,0x0e,0x01,0x07,0x0e,
-0x01,0x15,0x02,0x72,0x94,0xf5,0x8b,0xb4,0xb4,0x8b,0x02,0xd9,0x91,0x20,0x31,0x2d,
-0x1a,0x14,0x31,0x2e,0x22,0x53,0x55,0x3e,0x67,0x37,0x65,0x7f,0x28,0x30,0x2c,0x16,
-0x10,0x03,0x02,0x03,0x07,0x6b,0xfe,0xf8,0xac,0xac,0x9e,0x3a,0x1e,0x2a,0x1a,0x19,
-0x0e,0x15,0x0a,0x12,0x18,0x12,0x21,0x57,0x15,0x11,0x3f,0x32,0x18,0x2c,0x1a,0x18,
-0x0c,0x0c,0x05,0x04,0x10,0x0d,0x00,0x01,0x00,0x2f,0x00,0x00,0x05,0xaa,0x06,0x14,
-0x00,0x24,0x00,0x48,0x40,0x13,0x26,0x00,0x07,0x09,0x05,0x08,0x0c,0x21,0x18,0x0d,
-0x1e,0x08,0x11,0x0c,0x21,0x10,0x14,0x4c,0x25,0x10,0xfc,0x3c,0xc4,0x32,0xc4,0xfc,
-0x3c,0xc4,0x10,0x3c,0xfc,0x3c,0xc4,0xc4,0xc4,0x31,0x00,0x40,0x11,0x09,0x0d,0x11,
-0xa9,0x12,0x02,0x1a,0x87,0x00,0x18,0x97,0x06,0x1f,0x12,0xbc,0x0b,0x0f,0x2f,0x3c,
-0xe6,0x32,0x32,0xfe,0x3c,0xee,0x32,0x10,0xee,0x32,0x32,0x30,0x01,0x15,0x23,0x22,
-0x06,0x1d,0x01,0x21,0x15,0x21,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x23,0x35,0x33,
-0x35,0x34,0x36,0x3b,0x01,0x15,0x23,0x22,0x07,0x06,0x1d,0x01,0x21,0x35,0x34,0x36,
-0x33,0x05,0xaa,0xb0,0x63,0x4d,0x01,0x2f,0xfe,0xd1,0xb9,0xfe,0x07,0xb9,0xb0,0xb0,
-0xae,0xbd,0xae,0xb0,0x63,0x27,0x26,0x01,0xf9,0xae,0xbd,0x06,0x14,0x99,0x50,0x68,
-0x63,0x8f,0xfc,0x2f,0x03,0xd1,0xfc,0x2f,0x03,0xd1,0x8f,0x4e,0xbb,0xab,0x99,0x28,
-0x28,0x68,0x63,0x4e,0xbb,0xab,0x00,0x02,0x00,0x2f,0x00,0x00,0x04,0x4a,0x06,0x14,
-0x00,0x15,0x00,0x19,0x00,0x43,0x40,0x11,0x1b,0x46,0x00,0x17,0x08,0x16,0x0f,0x14,
-0x04,0x08,0x08,0x03,0x16,0x0a,0x06,0x4c,0x1a,0x10,0xfc,0x3c,0xc4,0x32,0xc4,0xfc,
-0x3c,0xc4,0x10,0xfe,0x3c,0xec,0x31,0x00,0x40,0x12,0x08,0x03,0xa9,0x00,0x10,0x87,
-0x0e,0x18,0xbe,0x16,0xb1,0x0e,0x97,0x09,0x00,0xbc,0x05,0x01,0x2f,0x3c,0xe6,0x32,
-0xee,0xfe,0xee,0x10,0xee,0x10,0xee,0x32,0x30,0x01,0x11,0x23,0x11,0x21,0x11,0x23,
-0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x3b,0x01,0x15,0x23,0x22,0x06,0x1d,0x01,0x01,
-0x33,0x15,0x23,0x04,0x4a,0xb9,0xfe,0x07,0xb9,0xb0,0xb0,0xad,0xb3,0xb9,0xb0,0x63,
-0x4d,0x01,0xf9,0xb9,0xb9,0x04,0x60,0xfb,0xa0,0x03,0xd1,0xfc,0x2f,0x03,0xd1,0x8f,
-0x4e,0xb7,0xaf,0x99,0x50,0x68,0x63,0x01,0xb2,0xe9,0x00,0x01,0x00,0x2f,0x00,0x00,
-0x04,0x4a,0x06,0x14,0x00,0x15,0x00,0x37,0x40,0x0f,0x17,0x46,0x01,0x08,0x04,0x0a,
-0x0c,0x08,0x08,0x10,0x04,0x12,0x0e,0x4c,0x16,0x10,0xfc,0x3c,0xc4,0xc4,0xfc,0x3c,
-0xc4,0x10,0xfe,0xec,0x31,0x00,0x40,0x0d,0x0f,0x0b,0xa9,0x09,0x04,0x87,0x00,0x97,
-0x11,0x09,0xbc,0x0d,0x02,0x2f,0x3c,0xe6,0x32,0xfe,0xee,0x10,0xee,0x32,0x30,0x01,
-0x21,0x11,0x23,0x11,0x21,0x22,0x06,0x1d,0x01,0x21,0x15,0x21,0x11,0x23,0x11,0x23,
-0x35,0x33,0x35,0x34,0x36,0x02,0x4a,0x02,0x00,0xb9,0xfe,0xb7,0x63,0x4d,0x01,0x2f,
-0xfe,0xd1,0xb9,0xb0,0xb0,0xae,0x06,0x14,0xf9,0xec,0x05,0x7b,0x50,0x68,0x63,0x8f,
-0xfc,0x2f,0x03,0xd1,0x8f,0x4e,0xbb,0xab,0x00,0x02,0x00,0x2f,0x00,0x00,0x06,0xfc,
-0x06,0x14,0x00,0x29,0x00,0x2d,0x00,0x5a,0x40,0x18,0x2f,0x46,0x17,0x2b,0x08,0x2a,
-0x10,0x1b,0x15,0x08,0x1a,0x2a,0x09,0x00,0x1f,0x06,0x08,0x24,0x1e,0x09,0x22,0x26,
-0x4c,0x2e,0x10,0xfc,0x3c,0xc4,0x32,0xc4,0xfc,0x3c,0xc4,0x10,0xc4,0x32,0xfc,0x3c,
-0xc4,0x10,0xfc,0x3c,0xec,0x31,0x00,0x40,0x17,0x1b,0x1f,0x23,0xa9,0x24,0x11,0x01,
-0x87,0x00,0x2d,0xbe,0x2a,0xb1,0x10,0x00,0x97,0x16,0x07,0x24,0xbc,0x19,0x1d,0x21,
-0x2f,0x3c,0x3c,0xe4,0x32,0x32,0xe4,0x32,0xf4,0xec,0x10,0xec,0x32,0x10,0xec,0x32,
-0x32,0x30,0x01,0x15,0x23,0x22,0x07,0x06,0x1d,0x01,0x21,0x35,0x34,0x37,0x36,0x37,
-0x36,0x3b,0x01,0x15,0x23,0x22,0x06,0x1d,0x01,0x21,0x11,0x23,0x11,0x21,0x11,0x23,
-0x11,0x21,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x05,0x33,0x15,0x23,
-0x02,0xf8,0xb0,0x63,0x27,0x26,0x01,0xf9,0x57,0x1c,0x27,0x4e,0x83,0xae,0xb0,0x63,
-0x4d,0x02,0xb2,0xb9,0xfe,0x07,0xb9,0xfe,0x07,0xb9,0xb0,0xb0,0xae,0xbd,0x03,0xf9,
-0xb9,0xb9,0x06,0x14,0x99,0x28,0x28,0x68,0x63,0x4e,0xbb,0x55,0x1c,0x13,0x27,0x99,
-0x50,0x68,0x63,0xfb,0xa0,0x03,0xd1,0xfc,0x2f,0x03,0xd1,0xfc,0x2f,0x03,0xd1,0x8f,
-0x4e,0xbb,0xab,0x02,0xe9,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x06,0xfc,0x06,0x14,
-0x00,0x26,0x00,0x4e,0x40,0x16,0x28,0x46,0x0d,0x08,0x10,0x16,0x18,0x14,0x08,0x10,
-0x09,0x00,0x1c,0x06,0x08,0x21,0x1b,0x09,0x1f,0x23,0x4c,0x27,0x10,0xfc,0x3c,0xc4,
-0x32,0xc4,0xfc,0x3c,0xc4,0x10,0xc4,0xfc,0x3c,0xc4,0x10,0xfc,0xec,0x31,0x00,0x40,
-0x12,0x18,0x1c,0x20,0xa9,0x21,0x11,0x02,0x87,0x0c,0x26,0x97,0x15,0x07,0x21,0xbc,
-0x0f,0x1a,0x1e,0x2f,0x3c,0x3c,0xe4,0x32,0x32,0xf4,0x3c,0xec,0x32,0x10,0xec,0x32,
-0x32,0x30,0x01,0x15,0x23,0x22,0x07,0x06,0x1d,0x01,0x21,0x35,0x34,0x36,0x33,0x21,
-0x11,0x23,0x11,0x21,0x22,0x06,0x1d,0x01,0x21,0x15,0x21,0x11,0x23,0x11,0x21,0x11,
-0x23,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x02,0xf8,0xb0,0x63,0x27,0x26,0x01,
-0xf9,0xae,0xbd,0x02,0x00,0xb9,0xfe,0xb7,0x63,0x4d,0x01,0x2f,0xfe,0xd1,0xb9,0xfe,
-0x07,0xb9,0xb0,0xb0,0xae,0xbd,0x06,0x14,0x99,0x28,0x28,0x68,0x63,0x4e,0xbb,0xab,
-0xf9,0xec,0x05,0x7b,0x50,0x68,0x63,0x8f,0xfc,0x2f,0x03,0xd1,0xfc,0x2f,0x03,0xd1,
-0x8f,0x4e,0xbb,0xab,0x00,0x01,0x00,0x2f,0x00,0x00,0x05,0x4c,0x06,0x14,0x00,0x2d,
-0x00,0x00,0x01,0x35,0x34,0x27,0x26,0x2b,0x01,0x22,0x07,0x06,0x15,0x11,0x23,0x11,
-0x23,0x35,0x33,0x35,0x34,0x37,0x36,0x3b,0x01,0x32,0x17,0x16,0x1d,0x01,0x21,0x15,
-0x21,0x11,0x14,0x17,0x16,0x3b,0x01,0x15,0x23,0x22,0x27,0x26,0x35,0x11,0x23,0x35,
-0x03,0x18,0x24,0x25,0x65,0x22,0x63,0x27,0x26,0xb9,0xb0,0xb0,0x57,0x57,0xbd,0x1e,
-0xbd,0x57,0x55,0x01,0x7b,0xfe,0x85,0x25,0x26,0x73,0xbd,0xbd,0xd5,0x51,0x51,0x87,
-0x04,0x60,0x63,0x68,0x28,0x28,0x28,0x28,0x68,0xfb,0x3d,0x03,0xd1,0x8f,0x4e,0xbb,
-0x55,0x56,0x56,0x53,0xbd,0x4e,0x8f,0xfd,0xa0,0x89,0x27,0x27,0x9a,0x50,0x4f,0xd2,
-0x02,0x60,0x8f,0x00,0x00,0x01,0x00,0x6f,0xff,0xe3,0x06,0xb2,0x05,0xf0,0x00,0x59,
-0x00,0x00,0x01,0x15,0x26,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x1f,
-0x01,0x1e,0x01,0x15,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x35,0x16,0x17,0x16,
-0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x2f,0x01,0x26,0x27,0x26,0x35,0x34,0x37,
-0x36,0x33,0x32,0x17,0x26,0x35,0x34,0x37,0x36,0x37,0x32,0x17,0x16,0x1d,0x01,0x21,
-0x15,0x21,0x11,0x14,0x17,0x16,0x3b,0x01,0x15,0x23,0x22,0x27,0x26,0x35,0x11,0x23,
-0x35,0x33,0x35,0x34,0x27,0x26,0x07,0x22,0x07,0x06,0x15,0x14,0x03,0x51,0x56,0x49,
-0x54,0x46,0x75,0x3f,0x3b,0x31,0x31,0x94,0x3f,0xc3,0xa6,0x7b,0x7c,0xd8,0x60,0x5c,
-0x61,0x6c,0x66,0x63,0x63,0x61,0x82,0x46,0x46,0x32,0x2d,0xb1,0x40,0xab,0x4c,0x4c,
-0x66,0x70,0xb5,0x48,0x4d,0x05,0x5c,0x5b,0xa2,0x8c,0x62,0x5e,0x01,0x7b,0xfe,0x85,
-0x25,0x26,0x73,0xbd,0xbd,0xd5,0x51,0x51,0x87,0x87,0x30,0x36,0x44,0x45,0x36,0x34,
-0x04,0x3f,0xae,0x2b,0x11,0x14,0x2a,0x27,0x57,0x40,0x25,0x24,0x21,0x0e,0x2b,0x98,
-0x89,0x9c,0x5b,0x5b,0x11,0x12,0x23,0xbe,0x35,0x1a,0x1b,0x2d,0x2c,0x51,0x4b,0x28,
-0x23,0x2a,0x0f,0x24,0x4a,0x4b,0x82,0xa6,0x4e,0x56,0x0b,0x1d,0x1f,0x87,0x5f,0x5d,
-0x01,0x60,0x5c,0x88,0x4c,0x8f,0xfd,0xa0,0x89,0x27,0x27,0x9a,0x50,0x4f,0xd2,0x02,
-0x60,0x8f,0x4e,0x41,0x2b,0x32,0x01,0x31,0x30,0x40,0x3d,0x00,0x00,0x01,0x00,0xaa,
-0xff,0xe3,0x08,0xe3,0x06,0x14,0x00,0x4a,0x00,0x00,0x01,0x16,0x15,0x11,0x23,0x35,
-0x0e,0x01,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,
-0x34,0x27,0x21,0x22,0x27,0x26,0x37,0x36,0x37,0x36,0x3b,0x01,0x15,0x23,0x22,0x15,
-0x14,0x33,0x21,0x27,0x26,0x37,0x36,0x3b,0x01,0x15,0x23,0x26,0x15,0x14,0x1f,0x01,
-0x21,0x03,0x14,0x17,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x23,0x35,0x0e,0x01,
-0x23,0x22,0x26,0x35,0x11,0x04,0x4f,0x09,0xb8,0x43,0xb1,0x75,0xc1,0xc8,0xb8,0x7c,
-0x7c,0x95,0xad,0x05,0xfe,0x53,0x95,0x5e,0x53,0x03,0x03,0x57,0x73,0x76,0x59,0x59,
-0x83,0x83,0x01,0x6c,0x17,0x4d,0x20,0x37,0xd1,0xec,0xde,0x60,0x0e,0x3b,0x01,0xdd,
-0x01,0x3e,0x3e,0x7c,0x95,0xad,0xb8,0xb8,0x43,0xb1,0x75,0xc1,0xc8,0x03,0xb6,0x25,
-0x21,0xfc,0x90,0xac,0x66,0x63,0xf0,0xe7,0x01,0x66,0xfe,0xa1,0x9f,0x9f,0xbe,0xa4,
-0x01,0x91,0x24,0x1c,0x5e,0x53,0x91,0x83,0x42,0x57,0xaf,0x7b,0x8a,0x38,0xba,0x48,
-0x7a,0xaf,0x01,0x2c,0x27,0x22,0x91,0xfd,0x61,0xa0,0x4f,0x4f,0xbe,0xa4,0x02,0x7b,
-0xfb,0xa0,0xac,0x66,0x63,0xf0,0xe7,0x01,0xfc,0x00,0x00,0x01,0x00,0xae,0xff,0xe3,
-0x08,0xe3,0x06,0x14,0x00,0x3a,0x00,0x00,0x01,0x21,0x26,0x15,0x14,0x1f,0x01,0x16,
-0x15,0x11,0x23,0x35,0x0e,0x01,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,
-0x32,0x36,0x35,0x11,0x34,0x2f,0x01,0x26,0x37,0x36,0x33,0x21,0x11,0x21,0x15,0x21,
-0x11,0x14,0x16,0x33,0x32,0x37,0x36,0x35,0x11,0x33,0x11,0x23,0x35,0x0e,0x01,0x23,
-0x22,0x26,0x35,0x05,0x39,0xfe,0xf3,0x60,0x0e,0x4d,0x31,0xb8,0x43,0xb1,0x75,0xc1,
-0xc8,0xb8,0x7c,0x7c,0x95,0xad,0x10,0x4d,0x4d,0x20,0x37,0xd1,0x01,0xd3,0x02,0xf2,
-0xfd,0x0e,0x7c,0x7c,0x98,0x53,0x57,0xb8,0xb8,0x43,0xb1,0x75,0xc1,0xc8,0x05,0x65,
-0x01,0x2c,0x27,0x22,0xbc,0x78,0x4d,0xfc,0x90,0xac,0x66,0x63,0xf0,0xe7,0x02,0xa6,
-0xfd,0x61,0x9f,0x9f,0xbe,0xa4,0x01,0x91,0x3f,0x27,0xbc,0xbb,0x47,0x7a,0xfe,0x4c,
-0xaa,0xfe,0x0b,0x9f,0x9f,0x5f,0x62,0xa1,0x01,0x3b,0xfc,0xe0,0xac,0x66,0x63,0xf0,
-0xe7,0x00,0x00,0x01,0x00,0xae,0xfe,0x56,0x08,0xe3,0x06,0x14,0x00,0x35,0x00,0x00,
-0x01,0x21,0x26,0x15,0x14,0x1f,0x01,0x16,0x15,0x11,0x23,0x35,0x0e,0x01,0x23,0x22,
-0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x34,0x2f,0x01,0x26,
-0x37,0x36,0x33,0x21,0x11,0x3e,0x01,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x26,
-0x23,0x22,0x06,0x15,0x11,0x23,0x05,0x39,0xfe,0xf3,0x60,0x0e,0x4d,0x31,0xb8,0x43,
-0xb1,0x75,0xc1,0xc8,0xb8,0x7c,0x7c,0x95,0xad,0x10,0x4d,0x4d,0x20,0x37,0xd1,0x01,
-0xd4,0x42,0xb3,0x75,0xc1,0xc6,0xb8,0x7c,0x7c,0x95,0xac,0xb9,0x05,0x65,0x01,0x2c,
-0x27,0x22,0xbc,0x78,0x4d,0xfc,0x90,0xac,0x66,0x63,0xf0,0xe7,0x02,0xa6,0xfd,0x61,
-0x9f,0x9f,0xbe,0xa4,0x01,0x91,0x3f,0x27,0xbc,0xbb,0x47,0x7a,0xfd,0x9e,0x65,0x64,
-0xef,0xe8,0xfd,0x5c,0x02,0x9e,0x9f,0x9e,0xbe,0xa4,0xfb,0xdd,0x00,0x02,0x00,0xae,
-0xfe,0x56,0x08,0xe3,0x06,0x14,0x00,0x35,0x00,0x3c,0x00,0x00,0x01,0x21,0x22,0x27,
-0x26,0x37,0x36,0x37,0x36,0x33,0x21,0x11,0x21,0x11,0x14,0x16,0x33,0x32,0x36,0x35,
-0x11,0x33,0x11,0x23,0x35,0x0e,0x01,0x23,0x22,0x26,0x35,0x11,0x23,0x11,0x33,0x15,
-0x21,0x11,0x0e,0x01,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x37,
-0x36,0x35,0x19,0x01,0x21,0x22,0x15,0x14,0x33,0x03,0xa0,0xfe,0xdb,0x95,0x5e,0x53,
-0x03,0x03,0x57,0x73,0x76,0x01,0xdd,0x01,0x99,0x7c,0x7c,0x95,0xad,0xb8,0xb8,0x43,
-0xb1,0x75,0xc1,0xc8,0xe1,0xd5,0xfe,0x73,0x43,0xb1,0x75,0xc1,0xc8,0xb8,0x7c,0x7c,
-0x95,0x57,0x56,0xfe,0xdb,0x83,0x83,0x03,0xb6,0x5e,0x53,0x91,0x83,0x42,0x57,0xfe,
-0x4c,0xfd,0x61,0x9f,0x9f,0xbe,0xa4,0x02,0x7b,0xfb,0xa0,0xac,0x66,0x63,0xf0,0xe7,
-0x01,0xfc,0xfb,0x42,0xa2,0x02,0x56,0x66,0x63,0xf0,0xe7,0x01,0x66,0xfe,0xa1,0x9f,
-0x9f,0x5f,0x5f,0xa4,0x02,0x7b,0x01,0x05,0x7b,0x8a,0x00,0x01,0x00,0xae,0xfe,0x56,
-0x0b,0x9b,0x06,0x14,0x00,0x48,0x00,0x00,0x01,0x21,0x26,0x15,0x14,0x1f,0x01,0x16,
-0x15,0x11,0x23,0x35,0x0e,0x01,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,
-0x32,0x36,0x35,0x11,0x34,0x2f,0x01,0x26,0x37,0x36,0x33,0x21,0x11,0x36,0x37,0x36,
-0x33,0x32,0x16,0x1d,0x01,0x14,0x17,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x23,
-0x35,0x0e,0x01,0x23,0x22,0x27,0x26,0x3d,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x11,
-0x23,0x05,0x39,0xfe,0xf3,0x60,0x0e,0x4d,0x31,0xb8,0x43,0xb1,0x75,0xc1,0xc8,0xb8,
-0x7c,0x7c,0x95,0xad,0x10,0x4d,0x4d,0x20,0x37,0xd1,0x01,0xd4,0x63,0x25,0x5a,0x6b,
-0xc1,0xc6,0x3e,0x38,0x6e,0x8c,0xad,0xb8,0xb8,0x43,0xb1,0x6c,0xaf,0x62,0x64,0x7c,
-0x7c,0x78,0xac,0xb9,0x05,0x65,0x01,0x2c,0x27,0x22,0xbc,0x78,0x4d,0xfc,0x90,0xac,
-0x66,0x63,0xf0,0xe7,0x02,0xa6,0xfd,0x61,0x9f,0x9f,0xbe,0xa4,0x01,0x91,0x3f,0x27,
-0xbc,0xbb,0x47,0x7a,0xfd,0x9e,0x81,0x16,0x32,0xef,0xe8,0xe3,0x97,0x58,0x4f,0xbe,
-0xa4,0x02,0x7b,0xfb,0xa0,0xac,0x66,0x63,0x78,0x7b,0xe4,0xe4,0x9f,0x9e,0xbe,0xa4,
-0xfb,0xdd,0xff,0xff,0x00,0x81,0xfe,0x0c,0x06,0xeb,0x02,0x9d,0x10,0x27,0x0b,0xf8,
-0x03,0x39,0xff,0x06,0x10,0x06,0x05,0x18,0x00,0x00,0xff,0xff,0x00,0x81,0xfe,0x0c,
-0x07,0xef,0x02,0x9d,0x10,0x27,0x0b,0xf8,0x03,0x39,0xff,0x06,0x10,0x06,0x0b,0xfa,
-0x00,0x00,0xff,0xff,0xff,0xec,0xfe,0x0c,0x01,0x87,0x02,0x58,0x10,0x26,0x0b,0xfb,
-0x00,0x00,0x10,0x07,0x0b,0xf8,0x00,0xe0,0xff,0x06,0xff,0xff,0xff,0xec,0xfe,0x0c,
-0x02,0x7e,0x02,0x58,0x10,0x27,0x0b,0xf8,0x00,0xe0,0xff,0x06,0x10,0x06,0x0b,0xfc,
-0x00,0x00,0xff,0xff,0x00,0x81,0xfe,0x0c,0x06,0xeb,0x02,0x9d,0x10,0x27,0x0b,0xf7,
-0x02,0xbc,0xff,0x06,0x10,0x06,0x05,0x18,0x00,0x00,0xff,0xff,0x00,0x81,0xfe,0x0c,
-0x07,0xef,0x02,0x9d,0x10,0x27,0x0b,0xf7,0x02,0xbc,0xff,0x06,0x10,0x06,0x0b,0xfa,
-0x00,0x00,0xff,0xff,0xff,0xec,0xfe,0x0c,0x01,0xf3,0x02,0x58,0x10,0x26,0x0b,0xfb,
-0x00,0x00,0x10,0x07,0x0b,0xf7,0x00,0x63,0xff,0x06,0xff,0xff,0xff,0xec,0xfe,0x0c,
-0x02,0x7e,0x02,0x58,0x10,0x26,0x0b,0xfc,0x00,0x00,0x10,0x07,0x0b,0xf7,0x00,0x63,
-0xff,0x06,0xff,0xff,0x00,0x81,0xfe,0x0c,0x06,0xeb,0x02,0x9d,0x10,0x27,0x0b,0xf9,
-0x02,0xbc,0xff,0x06,0x10,0x06,0x05,0x18,0x00,0x00,0xff,0xff,0x00,0x81,0xfe,0x0c,
-0x07,0xef,0x02,0x9d,0x10,0x27,0x0b,0xf9,0x02,0xbc,0xff,0x06,0x10,0x06,0x0b,0xfa,
-0x00,0x00,0xff,0xff,0xff,0xec,0xfe,0x0c,0x01,0xf3,0x02,0x58,0x10,0x26,0x0b,0xfb,
-0x00,0x00,0x10,0x07,0x0b,0xf9,0x00,0x63,0xff,0x06,0xff,0xff,0xff,0xec,0xfe,0x0c,
-0x02,0x7e,0x02,0x58,0x10,0x26,0x0b,0xfc,0x00,0x00,0x10,0x07,0x0b,0xf9,0x00,0x63,
-0xff,0x06,0xff,0xff,0x00,0x81,0xff,0xeb,0x06,0xeb,0x04,0x1a,0x10,0x27,0x0b,0xf8,
-0x03,0x39,0x03,0x84,0x10,0x06,0x05,0x18,0x00,0x00,0xff,0xff,0x00,0x81,0xff,0xec,
-0x07,0xef,0x04,0x1a,0x10,0x27,0x0b,0xf8,0x03,0x39,0x03,0x84,0x10,0x06,0x0b,0xfa,
-0x00,0x00,0xff,0xff,0xff,0xec,0x00,0x00,0x01,0x87,0x04,0xe2,0x10,0x26,0x0b,0xfb,
-0x00,0x00,0x10,0x07,0x0b,0xf8,0x00,0xe0,0x04,0x4c,0xff,0xff,0xff,0xec,0x00,0x00,
-0x02,0x7e,0x04,0xe2,0x10,0x26,0x0b,0xfc,0x00,0x00,0x10,0x07,0x0b,0xf8,0x00,0xe0,
-0x04,0x4c,0xff,0xff,0x00,0x81,0xff,0xeb,0x06,0xeb,0x04,0x1a,0x10,0x27,0x0b,0xf9,
-0x02,0xbc,0x03,0x84,0x10,0x06,0x05,0x18,0x00,0x00,0xff,0xff,0x00,0x81,0xff,0xec,
-0x07,0xef,0x04,0x1a,0x10,0x26,0x0b,0xfa,0x00,0x00,0x10,0x07,0x0b,0xf9,0x02,0xbc,
-0x03,0x84,0xff,0xff,0xff,0xec,0x00,0x00,0x01,0xf3,0x04,0xe2,0x10,0x26,0x0b,0xfb,
-0x00,0x00,0x10,0x07,0x0b,0xf9,0x00,0x63,0x04,0x4c,0xff,0xff,0xff,0xec,0x00,0x00,
-0x02,0x7e,0x04,0xe2,0x10,0x26,0x0b,0xfc,0x00,0x00,0x10,0x07,0x0b,0xf9,0x00,0x63,
-0x04,0x4c,0xff,0xff,0x00,0x81,0xff,0xeb,0x06,0xeb,0x04,0x9a,0x10,0x27,0x04,0xd7,
-0x01,0x84,0xfd,0xa8,0x10,0x06,0x05,0x18,0x00,0x00,0xff,0xff,0x00,0x81,0xff,0xec,
-0x07,0xef,0x04,0x9a,0x10,0x26,0x0b,0xfa,0x00,0x00,0x10,0x07,0x04,0xd7,0x01,0x84,
-0xfd,0xa8,0xff,0xff,0xff,0xec,0x00,0x00,0x02,0x31,0x05,0x62,0x10,0x26,0x0b,0xfb,
-0x00,0x00,0x10,0x07,0x04,0xd7,0xff,0x2b,0xfe,0x70,0xff,0xff,0xff,0xec,0x00,0x00,
-0x02,0x7e,0x05,0x62,0x10,0x26,0x0b,0xfc,0x00,0x00,0x10,0x07,0x04,0xd7,0xff,0x2b,
-0xfe,0x70,0xff,0xff,0x00,0x81,0xff,0xa4,0x07,0x9f,0x06,0x0e,0x10,0x27,0x0b,0xf6,
-0x05,0x78,0x04,0x7e,0x10,0x06,0x05,0x2c,0x00,0x00,0xff,0xff,0x00,0x81,0xff,0xa5,
-0x08,0x5c,0x05,0x46,0x10,0x26,0x0b,0xfd,0x00,0x00,0x10,0x07,0x0b,0xf6,0x05,0x78,
-0x03,0xb6,0xff,0xff,0xff,0xec,0x00,0x00,0x03,0x3f,0x06,0x0e,0x10,0x26,0x0b,0xfe,
-0x00,0x00,0x10,0x07,0x0b,0xf6,0x01,0x2c,0x04,0x7e,0xff,0xff,0xff,0xec,0x00,0x00,
-0x04,0x20,0x05,0x78,0x10,0x26,0x0b,0xff,0x00,0x00,0x10,0x07,0x0b,0xf6,0x01,0x3e,
-0x03,0xe8,0xff,0xff,0x00,0x81,0xff,0xa4,0x07,0x9f,0x06,0x0e,0x10,0x27,0x0b,0xf9,
-0x05,0x78,0x05,0x78,0x10,0x06,0x05,0x2c,0x00,0x00,0xff,0xff,0x00,0x81,0xff,0xa5,
-0x08,0x5c,0x05,0x46,0x10,0x26,0x0b,0xfd,0x00,0x00,0x10,0x07,0x0b,0xf9,0x05,0x78,
-0x04,0xb0,0xff,0xff,0xff,0xec,0x00,0x00,0x03,0x3f,0x06,0x0e,0x10,0x26,0x0b,0xfe,
-0x00,0x00,0x10,0x07,0x0b,0xf9,0x01,0x2c,0x05,0x78,0xff,0xff,0xff,0xec,0x00,0x00,
-0x04,0x20,0x05,0x78,0x10,0x26,0x0b,0xff,0x00,0x00,0x10,0x07,0x0b,0xf9,0x01,0x3e,
-0x04,0xe2,0xff,0xff,0x00,0x9d,0xfe,0x0b,0x05,0x28,0x03,0x67,0x10,0x27,0x0b,0xf8,
-0x03,0x07,0x00,0xaf,0x10,0x06,0x04,0xe6,0x00,0x00,0xff,0xff,0x00,0x9d,0xfe,0x0b,
-0x05,0x3e,0x03,0x67,0x10,0x27,0x0b,0xf8,0x02,0xa3,0x00,0x7d,0x10,0x06,0x0b,0x8b,
-0x00,0x00,0xff,0xff,0xff,0xec,0xfe,0x3e,0x04,0x5c,0x03,0x2f,0x10,0x26,0x0b,0x8c,
-0x00,0x00,0x10,0x07,0x0b,0xf8,0x02,0x0d,0xff,0x38,0xff,0xff,0xff,0xec,0xfe,0x3e,
-0x05,0x3e,0x03,0x2f,0x10,0x26,0x0b,0x8d,0x00,0x00,0x10,0x07,0x0b,0xf8,0x02,0x0d,
-0xff,0x38,0xff,0xff,0x00,0x9d,0xfe,0x0b,0x05,0x28,0x03,0x67,0x10,0x27,0x0b,0xf5,
-0x02,0x8a,0x00,0x19,0x10,0x06,0x04,0xe6,0x00,0x00,0xff,0xff,0x00,0x9d,0xfe,0x0b,
-0x05,0x3e,0x03,0x67,0x10,0x27,0x0b,0xf5,0x02,0x26,0xff,0xe7,0x10,0x06,0x0b,0x8b,
-0x00,0x00,0xff,0xff,0xff,0xec,0xff,0x38,0x04,0x5c,0x03,0x2f,0x10,0x26,0x0b,0x8c,
-0x00,0x00,0x10,0x07,0x0b,0xf5,0x01,0x90,0xff,0x38,0xff,0xff,0xff,0xec,0xff,0x38,
-0x05,0x3e,0x03,0x2f,0x10,0x26,0x0b,0x8d,0x00,0x00,0x10,0x07,0x0b,0xf5,0x01,0x90,
-0xff,0x38,0xff,0xff,0x00,0x9d,0xfe,0x0b,0x05,0x28,0x03,0x67,0x10,0x27,0x0b,0xf7,
-0x02,0x96,0x00,0x96,0x10,0x06,0x04,0xe6,0x00,0x00,0xff,0xff,0x00,0x9d,0xfe,0x0b,
-0x05,0x3e,0x03,0x67,0x10,0x27,0x0b,0xf7,0x02,0x19,0x00,0x32,0x10,0x06,0x0b,0x8b,
-0x00,0x00,0xff,0xff,0xff,0xec,0xfe,0x3e,0x04,0x5c,0x03,0x2f,0x10,0x26,0x0b,0x8c,
-0x00,0x00,0x10,0x07,0x0b,0xf7,0x01,0x90,0xff,0x38,0xff,0xff,0xff,0xec,0xfe,0x3e,
-0x05,0x3e,0x03,0x2f,0x10,0x26,0x0b,0x8d,0x00,0x00,0x10,0x07,0x0b,0xf7,0x01,0x90,
-0xff,0x38,0xff,0xff,0x00,0x9d,0xfe,0x0b,0x05,0x28,0x03,0x67,0x10,0x27,0x0b,0xf9,
-0x02,0x96,0x00,0xaf,0x10,0x06,0x04,0xe6,0x00,0x00,0xff,0xff,0x00,0x9d,0xfe,0x0b,
-0x05,0x3e,0x03,0x67,0x10,0x27,0x0b,0xf9,0x02,0x19,0x00,0x32,0x10,0x06,0x0b,0x8b,
-0x00,0x00,0xff,0xff,0xff,0xec,0xfe,0x3e,0x04,0x5c,0x03,0x2f,0x10,0x26,0x0b,0x8c,
-0x00,0x00,0x10,0x07,0x0b,0xf9,0x01,0x90,0xff,0x38,0xff,0xff,0xff,0xec,0xfe,0x3e,
-0x05,0x3e,0x03,0x2f,0x10,0x26,0x0b,0x8d,0x00,0x00,0x10,0x07,0x0b,0xf9,0x01,0x90,
-0xff,0x38,0xff,0xff,0xff,0xab,0xfe,0x0c,0x03,0x84,0x04,0xb0,0x10,0x27,0x0b,0xf6,
-0x01,0xf4,0x03,0x20,0x10,0x06,0x04,0xea,0x00,0x00,0xff,0xff,0xff,0xab,0xfe,0x0c,
-0x04,0x7e,0x04,0xb0,0x10,0x26,0x0b,0x97,0x00,0x00,0x10,0x07,0x0b,0xf6,0x01,0xf4,
-0x03,0x20,0xff,0xff,0xff,0xab,0xfe,0x0c,0x03,0xc2,0x05,0x30,0x10,0x26,0x04,0xea,
-0x00,0x00,0x10,0x07,0x04,0xd7,0x00,0xbc,0xfe,0x3e,0xff,0xff,0xff,0xab,0xfe,0x0c,
-0x04,0x7e,0x05,0x30,0x10,0x26,0x0b,0x97,0x00,0x00,0x10,0x07,0x04,0xd7,0x00,0xbc,
-0xfe,0x3e,0xff,0xff,0x00,0x81,0xff,0xa6,0x07,0x29,0x06,0x14,0x10,0x06,0x05,0x2f,
-0x00,0x00,0x00,0x01,0x00,0x81,0xff,0xa6,0x07,0xd9,0x06,0x14,0x00,0x37,0x00,0x00,
-0x25,0x06,0x07,0x06,0x07,0x06,0x27,0x24,0x03,0x26,0x37,0x33,0x06,0x15,0x14,0x17,
-0x16,0x37,0x36,0x37,0x36,0x37,0x36,0x35,0x34,0x27,0x01,0x26,0x35,0x34,0x37,0x36,
-0x37,0x01,0x15,0x05,0x06,0x07,0x06,0x15,0x14,0x17,0x01,0x16,0x17,0x16,0x3b,0x01,
-0x15,0x23,0x22,0x27,0x26,0x2f,0x01,0x06,0x05,0x9c,0x66,0xa6,0xcd,0xb7,0xc0,0x80,
-0xfe,0xb7,0x01,0x01,0x40,0xb8,0x41,0xcb,0x68,0x97,0xb8,0xc2,0x9d,0x24,0x10,0x36,
-0xfe,0xca,0x32,0x0a,0x23,0x64,0x02,0xe9,0xfd,0xad,0x47,0x15,0x06,0x1f,0x02,0x47,
-0x16,0x26,0x2b,0x40,0x58,0x84,0x41,0x3a,0x67,0x21,0x61,0x19,0x78,0x4e,0x3a,0x47,
-0x02,0x02,0x28,0x65,0x01,0x08,0x8a,0x5c,0x5e,0x88,0x7d,0x43,0x23,0x01,0x02,0x4e,
-0x3f,0x39,0x1a,0x2e,0x45,0x42,0x01,0x7c,0x3d,0x51,0x23,0x21,0x77,0x2a,0x01,0x36,
-0xba,0xfa,0x1e,0x28,0x0b,0x19,0x20,0x25,0xfd,0x3f,0x1a,0x0e,0x10,0xb8,0x18,0x2b,
-0x29,0x78,0x40,0x00,0xff,0xff,0xff,0xec,0x00,0x00,0x03,0xcf,0x06,0x14,0x10,0x06,
-0x0b,0xc4,0x00,0x00,0xff,0xff,0xff,0xec,0x00,0x00,0x04,0x7f,0x06,0x14,0x10,0x06,
-0x0b,0xc5,0x00,0x00,0xff,0xff,0x00,0x81,0xff,0xa6,0x07,0x29,0x07,0x2b,0x10,0x27,
-0x0c,0x18,0x03,0xca,0x00,0x00,0x10,0x06,0x05,0x2f,0x00,0x00,0xff,0xff,0x00,0x81,
-0xff,0xa6,0x07,0xd9,0x07,0x2b,0x10,0x26,0x0b,0x4b,0x00,0x00,0x10,0x07,0x0c,0x18,
-0x03,0xca,0x00,0x00,0xff,0xff,0xff,0xec,0x00,0x00,0x03,0xcf,0x07,0x2b,0x10,0x26,
-0x0b,0x4c,0x00,0x00,0x10,0x06,0x0c,0x18,0x70,0x00,0xff,0xff,0xff,0xec,0x00,0x00,
-0x04,0x7f,0x07,0x2b,0x10,0x26,0x0b,0x4d,0x00,0x00,0x10,0x06,0x0c,0x18,0x70,0x00,
-0xff,0xff,0x00,0x93,0xfe,0xb5,0x05,0x49,0x02,0xee,0x10,0x06,0x05,0x31,0x00,0x00,
-0x00,0x01,0x00,0x93,0xfe,0x0c,0x06,0x2b,0x02,0x45,0x00,0x26,0x00,0x00,0x01,0x16,
-0x17,0x16,0x17,0x16,0x3b,0x01,0x15,0x23,0x22,0x27,0x06,0x07,0x06,0x07,0x06,0x23,
-0x22,0x27,0x24,0x11,0x34,0x37,0x33,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,
-0x37,0x36,0x35,0x34,0x27,0x04,0xe0,0x2c,0x1b,0x16,0x32,0x35,0x3c,0x4b,0x82,0x47,
-0x22,0x03,0x59,0x78,0xef,0x61,0x5c,0x74,0x71,0xfe,0xb8,0x2f,0xb8,0x31,0xc9,0x5a,
-0x4c,0x58,0x4f,0xc2,0x4b,0x21,0x65,0x02,0x45,0x61,0x60,0x50,0x3c,0x40,0xb8,0x30,
-0x6d,0x93,0xc7,0x42,0x1b,0x25,0x6b,0x01,0x63,0xaf,0x8d,0x89,0xb3,0xec,0x35,0x18,
-0x14,0x30,0xe3,0x65,0x70,0xb8,0xcb,0x00,0x00,0x01,0xff,0xec,0x00,0x00,0x01,0x87,
-0x02,0x58,0x00,0x0d,0x00,0x00,0x25,0x06,0x2b,0x01,0x35,0x33,0x32,0x37,0x36,0x3d,
-0x01,0x33,0x15,0x14,0x01,0x2b,0x48,0x9d,0x5a,0x23,0x63,0x2c,0x31,0xb8,0x56,0x56,
-0xb8,0x2c,0x31,0x6a,0xd9,0xd9,0xbb,0x00,0x00,0x01,0xff,0xec,0x00,0x00,0x02,0x7e,
-0x02,0x58,0x00,0x14,0x00,0x00,0x25,0x06,0x2b,0x01,0x35,0x33,0x32,0x37,0x36,0x3d,
-0x01,0x33,0x15,0x14,0x17,0x16,0x3b,0x01,0x15,0x23,0x22,0x01,0x2b,0x4d,0x98,0x5a,
-0x23,0x63,0x2c,0x31,0xb8,0x31,0x2c,0x63,0x37,0x6e,0x96,0x56,0x56,0xb8,0x2c,0x31,
-0x6a,0xd9,0xd9,0x6a,0x31,0x2c,0xb8,0x00,0xff,0xff,0x00,0x82,0xfe,0xf3,0x05,0xc0,
-0x03,0x4a,0x10,0x06,0x04,0xfd,0x00,0x00,0xff,0xff,0x00,0x82,0xfe,0xf0,0x06,0xbf,
-0x02,0x02,0x10,0x06,0x0b,0xd9,0x00,0x00,0xff,0xff,0xff,0xec,0xfe,0xd4,0x01,0xf3,
-0x02,0x58,0x10,0x26,0x0b,0x54,0x00,0x00,0x10,0x07,0x0b,0xf5,0x00,0x63,0xfe,0xd4,
-0xff,0xff,0xff,0xec,0xfe,0xd4,0x02,0x7e,0x02,0x58,0x10,0x26,0x0b,0x55,0x00,0x00,
-0x10,0x07,0x0b,0xf5,0x00,0x63,0xfe,0xd4,0xff,0xff,0x00,0x08,0x04,0xba,0x02,0x50,
-0x06,0x9a,0x10,0x07,0x04,0xff,0xff,0x2c,0x00,0x00,0xff,0xff,0xff,0xec,0x00,0x00,
-0x02,0x6c,0x06,0x9a,0x10,0x26,0x04,0xf4,0x00,0x00,0x10,0x07,0x04,0xff,0xff,0x2c,
-0x00,0x00,0xff,0xff,0x00,0x08,0x04,0xba,0x02,0x50,0x06,0xfd,0x10,0x07,0x05,0x00,
-0xff,0x2c,0x00,0x00,0x00,0x01,0x00,0x69,0x00,0x00,0x02,0x2c,0x01,0x6b,0x00,0x0d,
-0x00,0x00,0x01,0x14,0x17,0x16,0x3b,0x01,0x15,0x23,0x22,0x27,0x26,0x3d,0x01,0x33,
-0x01,0x21,0x31,0x2c,0x63,0x4b,0x82,0x8e,0x5c,0x57,0xb8,0x01,0x4c,0x37,0x31,0x2c,
-0xb8,0x5c,0x57,0x8d,0x2b,0x00,0xff,0xff,0x00,0x08,0xfe,0x16,0x02,0x50,0xff,0xf6,
-0x10,0x07,0x05,0x01,0xff,0x2c,0x00,0x00,0xff,0xff,0x00,0x08,0x04,0xba,0x02,0x50,
-0x05,0xaa,0x10,0x07,0x05,0x02,0xff,0x2c,0x00,0x00,0xff,0xff,0xff,0xec,0x00,0x00,
-0x02,0x6c,0x05,0xaa,0x10,0x27,0x05,0x02,0xff,0x2c,0x00,0x00,0x10,0x06,0x04,0xf4,
-0x00,0x00,0xff,0xff,0x00,0x08,0x04,0xb9,0x02,0x50,0x06,0xfd,0x10,0x07,0x05,0x03,
-0xff,0x2c,0x00,0x00,0xff,0xff,0xff,0xec,0x00,0x00,0x02,0x6c,0x06,0xfd,0x10,0x27,
-0x05,0x03,0xff,0x2c,0x00,0x00,0x10,0x06,0x04,0xf4,0x00,0x00,0xff,0xff,0x00,0x08,
-0xfe,0xe8,0x02,0x50,0xff,0xd8,0x10,0x07,0x05,0x04,0xff,0x2c,0x00,0x00,0xff,0xff,
-0xff,0xec,0xfe,0xe8,0x02,0x6c,0x00,0xb8,0x10,0x27,0x05,0x04,0xff,0x2c,0x00,0x00,
-0x10,0x06,0x04,0xf4,0x00,0x00,0xff,0xff,0xff,0xf4,0x04,0xca,0x02,0x65,0x06,0xf4,
-0x10,0x07,0x05,0x05,0xff,0x2c,0x00,0x00,0xff,0xff,0xff,0xec,0x00,0x00,0x02,0x6c,
-0x06,0xf4,0x10,0x27,0x05,0x05,0xff,0x2c,0x00,0x00,0x10,0x06,0x04,0xf4,0x00,0x00,
-0xff,0xff,0x00,0x18,0x04,0xe1,0x02,0x3c,0x07,0x06,0x10,0x07,0x05,0x06,0xff,0x2c,
-0x00,0x00,0xff,0xff,0xff,0xec,0x00,0x00,0x02,0x6c,0x07,0x06,0x10,0x26,0x04,0xf4,
-0x00,0x00,0x10,0x07,0x05,0x06,0xff,0x2c,0x00,0x00,0xff,0xff,0x00,0xa3,0x00,0x55,
-0x03,0x1e,0x03,0xde,0x10,0x06,0x04,0xda,0x00,0x00,0xff,0xff,0xff,0xb5,0x00,0x00,
-0x02,0x85,0x07,0x83,0x10,0x27,0x05,0x07,0xff,0x1d,0x01,0xc2,0x10,0x06,0x04,0xe0,
-0x00,0x00,0xff,0xff,0xff,0xb5,0x00,0x00,0x02,0x85,0x07,0x83,0x10,0x26,0x0b,0x77,
-0x00,0x00,0x10,0x07,0x05,0x07,0xff,0x1d,0x01,0xc2,0xff,0xff,0x00,0x6c,0x00,0x00,
-0x01,0xc4,0x08,0x39,0x10,0x27,0x05,0x08,0xff,0x1d,0x01,0xc2,0x10,0x06,0x04,0xe0,
-0x00,0x00,0xff,0xff,0x00,0x6c,0x00,0x00,0x02,0x84,0x08,0x39,0x10,0x26,0x0b,0x77,
-0x00,0x00,0x10,0x07,0x05,0x08,0xff,0x1d,0x01,0xc2,0xff,0xff,0xff,0xab,0xfe,0x32,
-0x03,0x43,0x06,0x13,0x10,0x26,0x04,0xfc,0x00,0x00,0x10,0x06,0x05,0x08,0xc2,0x9c,
-0xff,0xff,0xff,0xab,0xfe,0x0c,0x04,0x36,0x04,0xb5,0x10,0x26,0x0b,0xd7,0x00,0x00,
-0x10,0x07,0x05,0x08,0xff,0xc2,0xfe,0x3e,0xff,0xff,0x00,0x6c,0xfe,0x0b,0x01,0xc4,
-0x06,0x14,0x10,0x27,0x05,0x09,0xff,0x1d,0x00,0x00,0x10,0x06,0x04,0xe0,0x00,0x00,
-0xff,0xff,0x00,0x6c,0xfe,0x0b,0x02,0x84,0x06,0x14,0x10,0x26,0x0b,0x77,0x00,0x00,
-0x10,0x07,0x05,0x09,0xff,0x1d,0x00,0x00,0xff,0xff,0x00,0x82,0xfe,0xf3,0x05,0xc0,
-0x04,0xb5,0x10,0x27,0x05,0x08,0xff,0xf4,0xfe,0x3e,0x10,0x06,0x04,0xfd,0x00,0x00,
-0xff,0xff,0x00,0x82,0xfe,0xf0,0x06,0xbf,0x03,0xbb,0x10,0x26,0x0b,0xd9,0x00,0x00,
-0x10,0x07,0x05,0x08,0x00,0x58,0xfd,0x44,0xff,0xff,0xff,0xec,0x00,0x00,0x01,0xd2,
-0x04,0xe7,0x10,0x26,0x0b,0x54,0x00,0x00,0x10,0x07,0x05,0x08,0xff,0x2b,0xfe,0x70,
-0xff,0xff,0xff,0xec,0x00,0x00,0x02,0x7e,0x04,0xe7,0x10,0x26,0x0b,0x55,0x00,0x00,
-0x10,0x07,0x05,0x08,0xff,0x2b,0xfe,0x70,0xff,0xff,0x00,0xc1,0x00,0x00,0x01,0x79,
-0x06,0x14,0x10,0x06,0x04,0xe0,0x00,0x00,0x00,0x01,0x00,0xc1,0x00,0x00,0x02,0x84,
-0x06,0x14,0x00,0x0d,0x00,0x00,0x13,0x11,0x33,0x11,0x14,0x17,0x16,0x3b,0x01,0x15,
-0x23,0x22,0x27,0x26,0xc1,0xb8,0x31,0x2c,0x63,0x4b,0x82,0x9a,0x50,0x57,0x01,0x73,
-0x04,0xa1,0xfb,0x6b,0x6a,0x31,0x2c,0xb8,0x5c,0x65,0xff,0xff,0x00,0x81,0xfe,0xa2,
-0x06,0xeb,0x02,0x9d,0x10,0x27,0x0b,0xf4,0x03,0x39,0xfe,0xa2,0x10,0x06,0x05,0x18,
-0x00,0x00,0xff,0xff,0x00,0x81,0xfe,0xa2,0x07,0xef,0x02,0x9d,0x10,0x26,0x0b,0xfa,
-0x00,0x00,0x10,0x07,0x0b,0xf4,0x03,0x39,0xfe,0xa2,0xff,0xff,0xff,0xec,0xfe,0xd4,
-0x01,0x87,0x02,0x58,0x10,0x26,0x0b,0xfb,0x00,0x00,0x10,0x07,0x0b,0xf4,0x00,0xe0,
-0xfe,0xd4,0xff,0xff,0xff,0xec,0xfe,0xd4,0x02,0x7e,0x02,0x58,0x10,0x26,0x0b,0xfc,
-0x00,0x00,0x10,0x07,0x0b,0xf4,0x00,0xe0,0xfe,0xd4,0xff,0xff,0x00,0x8b,0xff,0xc6,
-0x03,0xa0,0x04,0x1a,0x10,0x27,0x0b,0xf5,0x00,0xfa,0x03,0x84,0x10,0x06,0x04,0xfb,
-0x00,0x00,0xff,0xff,0x00,0x91,0x00,0x00,0x04,0x5e,0x04,0x1a,0x10,0x26,0x0b,0xd3,
-0x00,0x00,0x10,0x07,0x0b,0xf5,0x01,0x5e,0x03,0x84,0xff,0xff,0x00,0x81,0xff,0xeb,
-0x06,0xeb,0x03,0x20,0x10,0x27,0x0b,0xf5,0x02,0xbc,0x02,0x8a,0x10,0x06,0x05,0x18,
-0x00,0x00,0xff,0xff,0x00,0x81,0xff,0xec,0x07,0xef,0x03,0x20,0x10,0x26,0x0b,0xfa,
-0x00,0x00,0x10,0x07,0x0b,0xf5,0x02,0xbc,0x02,0x8a,0xff,0xff,0xff,0xec,0x00,0x00,
-0x01,0xf3,0x03,0xe8,0x10,0x26,0x0b,0xfb,0x00,0x00,0x10,0x07,0x0b,0xf5,0x00,0x63,
-0x03,0x52,0xff,0xff,0xff,0xec,0x00,0x00,0x02,0x7e,0x03,0xe8,0x10,0x26,0x0b,0xfc,
-0x00,0x00,0x10,0x07,0x0b,0xf5,0x00,0x63,0x03,0x52,0xff,0xff,0x00,0x81,0xff,0xeb,
-0x06,0xeb,0x04,0x1a,0x10,0x27,0x0b,0xf6,0x02,0xbc,0x02,0x8a,0x10,0x06,0x05,0x18,
-0x00,0x00,0xff,0xff,0x00,0x81,0xff,0xec,0x07,0xef,0x04,0x1a,0x10,0x26,0x0b,0xfa,
-0x00,0x00,0x10,0x07,0x0b,0xf6,0x02,0xbc,0x02,0x8a,0xff,0xff,0xff,0xec,0x00,0x00,
-0x01,0xf3,0x04,0xe2,0x10,0x26,0x0b,0xfb,0x00,0x00,0x10,0x07,0x0b,0xf6,0x00,0x63,
-0x03,0x52,0xff,0xff,0xff,0xec,0x00,0x00,0x02,0x7e,0x04,0xe2,0x10,0x26,0x0b,0xfc,
-0x00,0x00,0x10,0x07,0x0b,0xf6,0x00,0x63,0x03,0x52,0xff,0xff,0x00,0x9d,0xfe,0x0b,
-0x05,0x28,0x03,0x67,0x10,0x27,0x0b,0xf4,0x03,0x07,0x00,0x19,0x10,0x06,0x04,0xe6,
-0x00,0x00,0xff,0xff,0x00,0x9d,0xfe,0x0b,0x05,0x3e,0x03,0x67,0x10,0x26,0x0b,0x8b,
-0x00,0x00,0x10,0x07,0x0b,0xf4,0x02,0xbc,0xff,0xce,0xff,0xff,0xff,0xec,0xfe,0xd4,
-0x04,0x5c,0x03,0x2f,0x10,0x26,0x0b,0x8c,0x00,0x00,0x10,0x07,0x0b,0xf4,0x02,0x0d,
-0xfe,0xd4,0xff,0xff,0xff,0xec,0xfe,0xd4,0x05,0x3e,0x03,0x2f,0x10,0x26,0x0b,0x8d,
-0x00,0x00,0x10,0x07,0x0b,0xf4,0x02,0x0d,0xfe,0xd4,0xff,0xff,0x00,0x9d,0xfe,0x0b,
-0x05,0x28,0x03,0x67,0x10,0x06,0x04,0xe6,0x00,0x00,0x00,0x01,0x00,0x9d,0xfe,0x0b,
-0x05,0x3e,0x03,0x67,0x00,0x2e,0x00,0x00,0x25,0x33,0x15,0x23,0x22,0x27,0x26,0x27,
-0x26,0x27,0x06,0x07,0x06,0x15,0x14,0x17,0x16,0x05,0x32,0x37,0x15,0x06,0x07,0x04,
-0x27,0x26,0x35,0x10,0x37,0x36,0x37,0x26,0x07,0x06,0x07,0x35,0x24,0x17,0x04,0x17,
-0x15,0x06,0x07,0x17,0x16,0x17,0x16,0x05,0x16,0x28,0x31,0x81,0x7b,0x52,0x3d,0x06,
-0x49,0x72,0x62,0xe0,0x4a,0x81,0x01,0x49,0xc1,0xd4,0x96,0xfa,0xfe,0x5e,0xa9,0x83,
-0xd4,0x60,0x89,0x65,0x9f,0x87,0x5f,0x01,0x14,0xc3,0x01,0x24,0xc4,0x6d,0x1f,0x1d,
-0x33,0x48,0x5a,0xb8,0xb8,0x96,0x64,0x9c,0x0f,0xb2,0x18,0x50,0xb7,0xfc,0x8a,0x5d,
-0xa3,0x01,0x76,0xb8,0x62,0x01,0x02,0xc4,0x98,0xde,0x01,0x02,0xdf,0x65,0x34,0x03,
-0x16,0x13,0x29,0xb8,0x40,0x01,0x01,0x35,0x9a,0x03,0x0a,0x5b,0xa0,0x5f,0x77,0x00,
-0x00,0x01,0xff,0xec,0x00,0x00,0x04,0x5c,0x03,0x2f,0x00,0x1e,0x00,0x00,0x01,0x26,
-0x27,0x26,0x27,0x26,0x07,0x35,0x36,0x37,0x32,0x17,0x04,0x17,0x15,0x06,0x07,0x06,
-0x07,0x06,0x07,0x06,0x2b,0x01,0x35,0x33,0x32,0x37,0x36,0x37,0x36,0x03,0x53,0x53,
-0x67,0x55,0xb4,0x52,0xa1,0x48,0x4b,0xa2,0xac,0x01,0x02,0xdc,0x4c,0x58,0xa6,0x4a,
-0x91,0x4b,0xdd,0xa3,0x80,0x64,0xe3,0x81,0x68,0x74,0x5e,0x02,0x1d,0x17,0x17,0x13,
-0x10,0x07,0x06,0xb8,0x07,0x01,0x23,0x34,0x62,0x9a,0x18,0x34,0x62,0x42,0x81,0x1b,
-0x50,0xb8,0x48,0x3a,0x6a,0x56,0x00,0x01,0xff,0xec,0x00,0x00,0x05,0x3e,0x03,0x2f,
-0x00,0x29,0x00,0x00,0x01,0x04,0x17,0x15,0x06,0x07,0x16,0x17,0x16,0x3b,0x01,0x15,
-0x23,0x22,0x27,0x26,0x27,0x06,0x07,0x06,0x07,0x06,0x2b,0x01,0x35,0x33,0x32,0x37,
-0x36,0x37,0x36,0x37,0x26,0x27,0x26,0x27,0x26,0x07,0x35,0x36,0x37,0x32,0x02,0x7e,
-0x01,0x02,0xdc,0x41,0x49,0x32,0x1e,0x68,0x72,0x42,0x56,0xd1,0x7e,0x28,0x3b,0x45,
-0x29,0x91,0x4b,0xdd,0xa3,0x80,0x64,0xe3,0x81,0x68,0x74,0x5e,0x65,0x53,0x67,0x55,
-0xb4,0x52,0xa1,0x48,0x4b,0xa2,0x03,0x0c,0x34,0x62,0x9a,0x14,0x29,0x4e,0x22,0x77,
-0xb8,0xa8,0x36,0x61,0x2e,0x25,0x81,0x1b,0x50,0xb8,0x48,0x3a,0x6a,0x56,0x23,0x17,
-0x17,0x13,0x10,0x07,0x06,0xb8,0x07,0x01,0xff,0xff,0x00,0x9d,0xfe,0x0b,0x05,0x28,
-0x04,0xb0,0x10,0x27,0x0b,0xf4,0x02,0x3f,0x04,0x1a,0x10,0x06,0x04,0xe6,0x00,0x00,
-0xff,0xff,0x00,0x9d,0xfe,0x0b,0x05,0x3e,0x04,0xb0,0x10,0x26,0x0b,0x8b,0x00,0x00,
-0x10,0x07,0x0b,0xf4,0x02,0x3f,0x04,0x1a,0xff,0xff,0xff,0xec,0x00,0x00,0x04,0x5c,
-0x04,0x4c,0x10,0x26,0x0b,0x8c,0x00,0x00,0x10,0x07,0x0b,0xf4,0x02,0x0d,0x03,0xb6,
-0xff,0xff,0xff,0xec,0x00,0x00,0x05,0x3e,0x04,0x4c,0x10,0x26,0x0b,0x8d,0x00,0x00,
-0x10,0x07,0x0b,0xf4,0x02,0x0d,0x03,0xb6,0xff,0xff,0x00,0x7d,0xff,0xda,0x03,0x1b,
-0x03,0x52,0x10,0x06,0x04,0xe8,0x00,0x00,0x00,0x01,0x00,0x7d,0xff,0xda,0x04,0x47,
-0x03,0x52,0x00,0x20,0x00,0x00,0x01,0x26,0x27,0x33,0x16,0x17,0x16,0x15,0x14,0x17,
-0x16,0x3b,0x01,0x15,0x23,0x22,0x27,0x06,0x07,0x06,0x23,0x22,0x27,0x35,0x16,0x33,
-0x32,0x37,0x36,0x37,0x36,0x35,0x34,0x02,0x22,0x39,0xb6,0xe3,0x61,0x52,0x51,0x53,
-0x2c,0x63,0x4b,0x82,0x93,0x61,0x5d,0xcf,0x2e,0x2d,0x66,0x67,0x73,0x54,0x21,0x22,
-0xac,0x23,0x08,0x02,0x3f,0x7a,0x99,0x4e,0x89,0x86,0x75,0x49,0x53,0x2c,0xb8,0x82,
-0x80,0x21,0x07,0x26,0xb8,0x2a,0x09,0x31,0x70,0x1b,0x2a,0x44,0xff,0xff,0x00,0x7d,
-0xff,0xda,0x03,0x1b,0x04,0xb0,0x10,0x27,0x0b,0xf4,0x01,0x45,0x04,0x1a,0x10,0x06,
-0x04,0xe8,0x00,0x00,0xff,0xff,0x00,0x7d,0xff,0xda,0x04,0x47,0x04,0xb0,0x10,0x26,
-0x0b,0x93,0x00,0x00,0x10,0x07,0x0b,0xf4,0x01,0x45,0x04,0x1a,0xff,0xff,0xff,0xab,
-0xfe,0x0c,0x03,0x62,0x02,0x26,0x10,0x06,0x04,0xea,0x00,0x00,0x00,0x01,0xff,0xab,
-0xfe,0x0c,0x04,0x7e,0x02,0x26,0x00,0x18,0x00,0x00,0x01,0x33,0x16,0x17,0x16,0x17,
-0x16,0x3b,0x01,0x15,0x23,0x22,0x27,0x02,0x07,0x04,0x21,0x35,0x20,0x37,0x36,0x37,
-0x36,0x35,0x34,0x02,0x78,0xb8,0x1e,0x03,0x0a,0x49,0x2a,0x65,0x4b,0x82,0x82,0x32,
-0x44,0xfb,0xfe,0xe4,0xfe,0xbe,0x01,0x30,0xcb,0xda,0x23,0x0a,0x02,0x26,0x70,0x1e,
-0x67,0x4d,0x2c,0xb8,0x3e,0xfe,0xea,0x85,0x97,0xb8,0x80,0x8a,0xd0,0x3a,0x48,0x7e,
-0xff,0xff,0xff,0xab,0xfe,0x0c,0x03,0x62,0x03,0xb6,0x10,0x27,0x0b,0xf4,0x02,0x71,
-0x03,0x20,0x10,0x06,0x04,0xea,0x00,0x00,0xff,0xff,0xff,0xab,0xfe,0x0c,0x04,0x7e,
-0x03,0xb6,0x10,0x26,0x0b,0x97,0x00,0x00,0x10,0x07,0x0b,0xf4,0x02,0x71,0x03,0x20,
-0xff,0xff,0x00,0x82,0xfe,0x0c,0x09,0x1a,0x02,0xee,0x10,0x06,0x04,0xec,0x00,0x00,
-0x00,0x01,0x00,0x82,0xfe,0x0c,0x0a,0x47,0x02,0xee,0x00,0x46,0x00,0x00,0x25,0x16,
-0x37,0x36,0x35,0x33,0x14,0x17,0x16,0x33,0x32,0x19,0x01,0x33,0x11,0x14,0x17,0x16,
-0x3b,0x01,0x15,0x23,0x22,0x27,0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x06,0x07,
-0x06,0x27,0x26,0x27,0x06,0x07,0x06,0x07,0x06,0x23,0x26,0x27,0x24,0x11,0x34,0x37,
-0x33,0x06,0x17,0x16,0x17,0x16,0x33,0x32,0x37,0x36,0x37,0x36,0x27,0x26,0x2f,0x01,
-0x33,0x17,0x16,0x17,0x16,0x05,0xb8,0x4e,0x30,0x25,0xb8,0x13,0x40,0x6e,0x8e,0xb8,
-0x53,0x2c,0x63,0x4b,0x82,0x91,0x76,0x44,0x6d,0x25,0x20,0x49,0x30,0x8a,0x11,0x31,
-0x5f,0x40,0x38,0x89,0x27,0x18,0x54,0x85,0xc1,0x50,0x78,0x80,0x6d,0xfe,0xed,0x69,
-0xb8,0x6c,0x01,0x01,0x93,0x5f,0x51,0x62,0x5f,0x79,0x5e,0x40,0x01,0x01,0x10,0x40,
-0xb8,0x24,0x10,0x1c,0x3a,0xb5,0x02,0x7c,0x5f,0xca,0xcd,0x32,0xa9,0x01,0x18,0x01,
-0x26,0xfe,0xaa,0x61,0x53,0x2c,0xb8,0x60,0x5b,0x19,0x09,0x19,0x46,0x7b,0x9f,0x1e,
-0x14,0x02,0x02,0x3c,0xb3,0x6b,0xaa,0x3e,0x1a,0x01,0x1c,0x47,0x01,0x48,0xf6,0xb4,
-0xce,0xdc,0xb3,0x26,0x18,0x25,0x30,0x9e,0x6c,0x8e,0x7d,0x3d,0xea,0x9c,0x4a,0x3c,
-0x7e,0x00,0x00,0x01,0xff,0xec,0xff,0xe3,0x06,0x0a,0x02,0xee,0x00,0x31,0x00,0x00,
-0x25,0x06,0x07,0x06,0x2b,0x01,0x35,0x33,0x32,0x37,0x36,0x3d,0x01,0x33,0x15,0x14,
-0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x33,0x14,0x17,0x16,0x37,0x36,0x19,0x01,0x33,
-0x11,0x14,0x07,0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x06,0x07,0x06,0x23,0x22,
-0x27,0x26,0x01,0x80,0x2b,0x38,0x4c,0x63,0x82,0x4b,0x63,0x2c,0x50,0xb8,0x2c,0x2b,
-0x68,0x6d,0x2c,0x25,0xb8,0x13,0x40,0x6e,0x8e,0xb8,0x5c,0x4b,0x66,0x25,0x23,0x3f,
-0x37,0x89,0x12,0x30,0x60,0x44,0x41,0x62,0x48,0x3c,0x8a,0x3b,0x21,0x2e,0xb8,0x2c,
-0x50,0x64,0xc0,0x9c,0x40,0x64,0x63,0x7a,0x67,0xc2,0xcd,0x32,0xaa,0x01,0x02,0x01,
-0x16,0x01,0x26,0xfe,0xaa,0xc7,0x71,0x5c,0x18,0x09,0x19,0x3d,0x84,0x9c,0x21,0x18,
-0x31,0x28,0x00,0x01,0xff,0xec,0xff,0xe3,0x07,0x37,0x02,0xee,0x00,0x38,0x00,0x00,
-0x05,0x06,0x23,0x22,0x27,0x26,0x27,0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x06,
-0x07,0x06,0x2b,0x01,0x35,0x33,0x32,0x37,0x36,0x3d,0x01,0x33,0x15,0x14,0x17,0x16,
-0x33,0x32,0x37,0x36,0x35,0x33,0x14,0x17,0x16,0x37,0x36,0x19,0x01,0x33,0x11,0x14,
-0x17,0x16,0x3b,0x01,0x15,0x23,0x22,0x27,0x06,0x04,0xfd,0x25,0x23,0x3f,0x37,0x89,
-0x12,0x30,0x60,0x44,0x41,0x62,0x48,0x3c,0x29,0x2b,0x38,0x4c,0x63,0x82,0x4b,0x63,
-0x2c,0x50,0xb8,0x2c,0x2b,0x68,0x6d,0x2c,0x25,0xb8,0x13,0x40,0x6e,0x8e,0xb8,0x53,
-0x2c,0x63,0x4b,0x82,0x91,0x76,0x44,0x14,0x09,0x19,0x3d,0x84,0x9c,0x21,0x18,0x31,
-0x28,0x49,0x3b,0x21,0x2e,0xb8,0x2c,0x50,0x64,0xc0,0x9c,0x40,0x64,0x63,0x7a,0x67,
-0xc2,0xcd,0x32,0xaa,0x01,0x02,0x01,0x16,0x01,0x26,0xfe,0xaa,0x61,0x53,0x2c,0xb8,
-0x60,0x5a,0xff,0xff,0x00,0x82,0xfe,0x0c,0x09,0x1a,0x04,0xb0,0x10,0x27,0x0b,0xf6,
-0x04,0xe2,0x03,0x20,0x10,0x06,0x04,0xec,0x00,0x00,0xff,0xff,0x00,0x82,0xfe,0x0c,
-0x0a,0x47,0x04,0xb0,0x10,0x26,0x0b,0x9b,0x00,0x00,0x10,0x07,0x0b,0xf6,0x04,0xe2,
-0x03,0x20,0xff,0xff,0xff,0xec,0xff,0xe3,0x06,0x0a,0x04,0xb0,0x10,0x26,0x0b,0x9c,
-0x00,0x00,0x10,0x07,0x0b,0xf6,0x02,0x8a,0x03,0x20,0xff,0xff,0xff,0xec,0xff,0xe3,
-0x07,0x37,0x04,0xb0,0x10,0x26,0x0b,0x9d,0x00,0x00,0x10,0x07,0x0b,0xf6,0x02,0x8a,
-0x03,0x20,0xff,0xff,0x00,0x82,0xfe,0x0c,0x09,0x13,0x02,0xe6,0x10,0x06,0x04,0xee,
-0x00,0x00,0x00,0x02,0x00,0x82,0xfe,0x0c,0x09,0xe1,0x02,0xe6,0x00,0x3c,0x00,0x49,
-0x00,0x00,0x29,0x01,0x22,0x27,0x26,0x37,0x14,0x07,0x06,0x07,0x06,0x23,0x26,0x27,
-0x24,0x11,0x34,0x37,0x33,0x06,0x17,0x16,0x17,0x16,0x33,0x32,0x37,0x36,0x37,0x36,
-0x35,0x34,0x27,0x33,0x06,0x17,0x16,0x17,0x36,0x37,0x36,0x37,0x36,0x17,0x16,0x17,
-0x16,0x15,0x14,0x07,0x16,0x17,0x16,0x3b,0x01,0x15,0x23,0x22,0x2f,0x01,0x06,0x03,
-0x22,0x07,0x06,0x07,0x33,0x32,0x37,0x36,0x27,0x26,0x27,0x26,0x06,0x75,0xfe,0xec,
-0x22,0x38,0x33,0x06,0x4a,0x58,0xee,0x50,0x78,0x80,0x6d,0xfe,0xed,0x69,0xb8,0x6c,
-0x01,0x01,0x93,0x5f,0x51,0x66,0x5b,0xa2,0x2b,0x21,0x27,0xab,0x01,0x0e,0x0a,0x28,
-0x73,0x7b,0x6c,0x93,0x48,0x58,0x7d,0x61,0xba,0x2a,0x0e,0x10,0x3d,0x52,0x4b,0x82,
-0x83,0x67,0x1c,0xcc,0x12,0x4c,0x7e,0xa8,0x91,0xbb,0xed,0x81,0xbb,0x01,0x02,0x89,
-0x25,0x1e,0x1b,0x0f,0xba,0x80,0x9b,0x4d,0x1a,0x01,0x1c,0x47,0x01,0x48,0xf6,0xb4,
-0xce,0xdc,0xb3,0x26,0x18,0x25,0x44,0x8a,0x6c,0x7f,0x93,0x8a,0x0f,0x37,0x28,0x32,
-0x92,0x6c,0x5e,0x46,0x22,0x01,0x02,0x25,0x47,0xe9,0x4d,0x46,0x0c,0x0b,0x2c,0xb8,
-0x5c,0x1a,0x76,0x02,0x37,0x51,0x6c,0xc2,0x3f,0x5b,0x46,0x87,0x13,0x05,0x00,0x02,
-0xff,0xec,0x00,0x00,0x06,0x32,0x02,0xe6,0x00,0x0c,0x00,0x2e,0x00,0x00,0x01,0x06,
-0x07,0x33,0x32,0x37,0x36,0x27,0x26,0x27,0x26,0x23,0x22,0x03,0x21,0x22,0x27,0x26,
-0x27,0x06,0x2b,0x01,0x35,0x33,0x32,0x37,0x36,0x3d,0x01,0x33,0x15,0x14,0x16,0x17,
-0x36,0x37,0x36,0x37,0x36,0x37,0x36,0x17,0x16,0x15,0x14,0x07,0x06,0x03,0xd0,0xa8,
-0x91,0xbb,0xed,0x81,0xbb,0x01,0x02,0x89,0x25,0x30,0x4c,0xba,0xfe,0xec,0x4a,0x4e,
-0x41,0x27,0x66,0xac,0x82,0x4b,0x63,0x2c,0x50,0xb8,0x12,0x2d,0x65,0x5f,0xa0,0x89,
-0x4b,0x55,0x73,0x6b,0xba,0xb8,0xca,0x01,0xe6,0x6c,0xc2,0x3f,0x5b,0x46,0x87,0x13,
-0x05,0xfd,0xc9,0x2a,0x23,0x3d,0x8a,0xb8,0x2c,0x50,0x64,0x72,0x4e,0x18,0x50,0x32,
-0x86,0x54,0x8f,0x39,0x20,0x01,0x02,0x29,0x47,0xe9,0xa9,0x6d,0x78,0x00,0x00,0x02,
-0xff,0xec,0x00,0x00,0x07,0x04,0x02,0xe6,0x00,0x2b,0x00,0x38,0x00,0x00,0x29,0x01,
-0x22,0x27,0x26,0x27,0x06,0x2b,0x01,0x35,0x33,0x32,0x37,0x36,0x3d,0x01,0x33,0x15,
-0x14,0x16,0x17,0x36,0x37,0x36,0x37,0x36,0x37,0x36,0x17,0x16,0x17,0x16,0x07,0x16,
-0x17,0x16,0x3b,0x01,0x15,0x23,0x22,0x2f,0x01,0x06,0x03,0x06,0x07,0x33,0x32,0x37,
-0x36,0x27,0x26,0x27,0x26,0x23,0x22,0x03,0x98,0xfe,0xe8,0x4a,0x4e,0x41,0x27,0x66,
-0xac,0x82,0x4b,0x63,0x2c,0x50,0xb8,0x12,0x2d,0x65,0x5f,0xa0,0x89,0x4b,0x55,0x73,
-0x6b,0xba,0x04,0x01,0x2b,0x0e,0x10,0x3d,0x52,0x4b,0x82,0x83,0x67,0x1c,0xcc,0xe0,
-0xa8,0x91,0xbb,0xed,0x81,0xbb,0x01,0x02,0x89,0x25,0x30,0x4c,0x2a,0x23,0x3d,0x8a,
-0xb8,0x2c,0x50,0x64,0x72,0x4e,0x18,0x50,0x32,0x86,0x54,0x8f,0x39,0x20,0x01,0x02,
-0x29,0x46,0xea,0x4b,0x48,0x0c,0x0b,0x2c,0xb8,0x5c,0x1a,0x76,0x01,0xe6,0x6c,0xc2,
-0x3f,0x5b,0x46,0x87,0x13,0x05,0xff,0xff,0x00,0x82,0xfe,0x0c,0x09,0x13,0x03,0xb6,
-0x10,0x27,0x0b,0xf4,0x04,0xfb,0x03,0x20,0x10,0x06,0x04,0xee,0x00,0x00,0xff,0xff,
-0x00,0x82,0xfe,0x0c,0x09,0xe1,0x03,0xb6,0x10,0x26,0x0b,0xa3,0x00,0x00,0x10,0x07,
-0x0b,0xf4,0x04,0xfb,0x03,0x20,0xff,0xff,0xff,0xec,0x00,0x00,0x06,0x32,0x03,0xb6,
-0x10,0x26,0x0b,0xa4,0x00,0x00,0x10,0x07,0x0b,0xf4,0x01,0xdb,0x03,0x20,0xff,0xff,
-0xff,0xec,0x00,0x00,0x07,0x04,0x03,0xb6,0x10,0x26,0x0b,0xa5,0x00,0x00,0x10,0x07,
-0x0b,0xf4,0x01,0xdb,0x03,0x20,0xff,0xff,0x00,0x90,0x00,0x00,0x06,0xdc,0x06,0x14,
-0x10,0x06,0x04,0xf0,0x00,0x00,0x00,0x02,0x00,0x90,0x00,0x00,0x07,0xac,0x06,0x14,
-0x00,0x1c,0x00,0x29,0x00,0x00,0x29,0x02,0x35,0x21,0x11,0x33,0x11,0x12,0x25,0x36,
-0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x16,0x17,0x16,0x3b,0x01,0x15,0x23,0x22,0x2f,
-0x01,0x06,0x25,0x33,0x32,0x37,0x36,0x27,0x26,0x27,0x26,0x23,0x22,0x07,0x06,0x04,
-0x40,0xfd,0xbf,0xfe,0x91,0x01,0x6f,0xb8,0xd9,0x01,0x14,0x5c,0x44,0x75,0x69,0xbc,
-0x2a,0x0e,0x10,0x3d,0x52,0x4b,0x82,0x83,0x67,0x1c,0xcc,0xfd,0xe9,0xbb,0xed,0x81,
-0xbb,0x01,0x02,0x89,0x25,0x30,0x50,0x7a,0xb1,0xb8,0x05,0x5c,0xfb,0x0e,0x01,0x3f,
-0x63,0x21,0x27,0x45,0xeb,0x4d,0x46,0x0c,0x0b,0x2c,0xb8,0x5c,0x1a,0x76,0xb8,0x3f,
-0x5d,0x44,0x87,0x13,0x05,0x51,0x78,0x00,0x00,0x02,0xff,0xec,0x00,0x00,0x05,0xd4,
-0x06,0x14,0x00,0x0c,0x00,0x1f,0x00,0x00,0x25,0x33,0x32,0x37,0x36,0x27,0x26,0x27,
-0x26,0x23,0x22,0x07,0x06,0x13,0x29,0x01,0x35,0x21,0x11,0x33,0x11,0x12,0x25,0x36,
-0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x02,0x39,0xbb,0xed,0x81,0xbb,0x01,0x02,
-0x89,0x25,0x30,0x50,0x7a,0xb1,0x75,0xfd,0xc1,0xfe,0xf5,0x01,0x0b,0xb8,0xd9,0x01,
-0x14,0x5c,0x44,0x75,0x69,0xba,0xb8,0xca,0xb8,0x3f,0x5d,0x44,0x87,0x13,0x05,0x51,
-0x78,0xfe,0x92,0xb8,0x05,0x5c,0xfb,0x0e,0x01,0x3f,0x63,0x21,0x27,0x45,0xeb,0xa9,
-0x6d,0x78,0x00,0x02,0xff,0xec,0x00,0x00,0x06,0xa4,0x06,0x14,0x00,0x1c,0x00,0x29,
-0x00,0x00,0x29,0x02,0x35,0x21,0x11,0x33,0x11,0x12,0x25,0x36,0x33,0x32,0x17,0x16,
-0x15,0x14,0x07,0x16,0x17,0x16,0x3b,0x01,0x15,0x23,0x22,0x2f,0x01,0x06,0x25,0x33,
-0x32,0x37,0x36,0x27,0x26,0x27,0x26,0x23,0x22,0x07,0x06,0x03,0x38,0xfd,0xbf,0xfe,
-0xf5,0x01,0x0b,0xb8,0xd9,0x01,0x14,0x5c,0x44,0x75,0x69,0xbc,0x2a,0x0e,0x10,0x3d,
-0x52,0x4b,0x82,0x83,0x67,0x1c,0xcc,0xfd,0xe9,0xbb,0xed,0x81,0xbb,0x01,0x02,0x89,
-0x25,0x30,0x50,0x7a,0xb1,0xb8,0x05,0x5c,0xfb,0x0e,0x01,0x3f,0x63,0x21,0x27,0x45,
-0xeb,0x4d,0x46,0x0c,0x0b,0x2c,0xb8,0x5c,0x1a,0x76,0xb8,0x3f,0x5d,0x44,0x87,0x13,
-0x05,0x51,0x78,0x00,0xff,0xff,0x00,0x90,0x00,0x00,0x06,0xdc,0x06,0x14,0x10,0x27,
-0x0b,0xf4,0x03,0xcf,0x03,0x52,0x10,0x06,0x04,0xf0,0x00,0x00,0xff,0xff,0x00,0x90,
-0x00,0x00,0x07,0xac,0x06,0x14,0x10,0x26,0x0b,0xab,0x00,0x00,0x10,0x07,0x0b,0xf4,
-0x03,0xcf,0x03,0x52,0xff,0xff,0xff,0xec,0x00,0x00,0x05,0xd4,0x06,0x14,0x10,0x26,
-0x0b,0xac,0x00,0x00,0x10,0x07,0x0b,0xf4,0x02,0xc7,0x03,0x52,0xff,0xff,0xff,0xec,
-0x00,0x00,0x06,0xa4,0x06,0x14,0x10,0x26,0x0b,0xad,0x00,0x00,0x10,0x07,0x0b,0xf4,
-0x02,0xc7,0x03,0x52,0xff,0xff,0x00,0x74,0xfe,0x0b,0x04,0xb2,0x04,0x2b,0x10,0x06,
-0x04,0xf2,0x00,0x00,0x00,0x02,0x00,0x75,0xfe,0x0b,0x04,0xb2,0x03,0x0e,0x00,0x2c,
-0x00,0x37,0x00,0x00,0x33,0x34,0x37,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,
-0x32,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x16,0x17,0x16,0x3b,0x01,0x15,
-0x23,0x20,0x27,0x06,0x15,0x14,0x17,0x16,0x21,0x32,0x37,0x15,0x06,0x07,0x04,0x27,
-0x26,0x00,0x22,0x07,0x06,0x15,0x14,0x17,0x36,0x37,0x36,0x27,0x75,0xbb,0x3d,0x26,
-0x1e,0x0d,0x10,0x68,0x59,0xee,0x59,0x65,0x13,0x0d,0x45,0x76,0x37,0x44,0x57,0x5f,
-0x55,0xa0,0x90,0xfe,0xf6,0xf8,0x9a,0x29,0x6b,0x01,0x5f,0xc1,0xd4,0x96,0xfa,0xfe,
-0x54,0x9f,0x62,0x01,0xa9,0x34,0x1e,0x2f,0x46,0x86,0x02,0x01,0x30,0xd4,0x8c,0x32,
-0x48,0x39,0x1b,0x1f,0x29,0x37,0x34,0x2d,0x2d,0x33,0x38,0x26,0x22,0x3e,0x38,0x60,
-0x13,0x40,0x25,0x28,0xb8,0xe4,0x81,0x6a,0x6d,0x3d,0x9e,0x76,0xb8,0x62,0x01,0x02,
-0xbe,0x7a,0x03,0x13,0x07,0x0c,0x20,0x24,0x41,0x37,0x2e,0x20,0x0c,0x00,0x00,0x01,
-0xff,0xec,0x00,0x00,0x03,0xf8,0x04,0x2b,0x00,0x1d,0x00,0x00,0x25,0x36,0x37,0x26,
-0x27,0x26,0x37,0x36,0x37,0x36,0x17,0x15,0x26,0x06,0x15,0x14,0x17,0x16,0x37,0x36,
-0x37,0x25,0x15,0x05,0x04,0x2b,0x01,0x35,0x33,0x32,0x01,0x07,0x61,0x3f,0x4b,0x34,
-0x59,0x01,0x02,0xca,0x7c,0xfc,0xda,0xba,0x3e,0x5f,0x4f,0x3a,0x32,0x01,0x20,0xfe,
-0x5c,0xfe,0xa2,0xb2,0x58,0x50,0x64,0xd9,0x1f,0x1d,0x18,0x3b,0x64,0x8c,0xfa,0x8b,
-0x55,0x08,0xa9,0x07,0x90,0x8a,0x75,0x34,0x50,0x0c,0x09,0x16,0x81,0xb8,0xc5,0xa4,
-0xb8,0x00,0x00,0x02,0xff,0xec,0x00,0x00,0x03,0xf0,0x03,0x0e,0x00,0x24,0x00,0x2f,
-0x00,0x00,0x25,0x06,0x2b,0x01,0x35,0x33,0x32,0x37,0x36,0x37,0x26,0x27,0x26,0x35,
-0x34,0x37,0x36,0x37,0x36,0x32,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x16,
-0x17,0x16,0x3b,0x01,0x15,0x23,0x22,0x02,0x22,0x07,0x06,0x15,0x14,0x17,0x36,0x35,
-0x34,0x27,0x01,0xee,0xc2,0xca,0x76,0x60,0x6b,0x42,0x3b,0x28,0x61,0x44,0x1e,0x0d,
-0x10,0x68,0x59,0xee,0x59,0x68,0x10,0x0d,0x1e,0x4d,0x58,0x1f,0x44,0x3d,0x70,0x60,
-0x76,0xca,0xa8,0x34,0x1e,0x2f,0x67,0x67,0x2f,0xb9,0xb9,0xb8,0x28,0x24,0x27,0x55,
-0x5a,0x27,0x2d,0x1f,0x29,0x37,0x34,0x2d,0x2d,0x34,0x37,0x29,0x1f,0x2d,0x27,0x62,
-0x4d,0x1f,0x2c,0x28,0xb8,0x02,0x55,0x07,0x0c,0x20,0x1d,0x5f,0x5f,0x1d,0x20,0x0c,
-0xff,0xff,0x00,0x74,0xfe,0x0b,0x04,0xb2,0x05,0x46,0x10,0x27,0x0b,0xf4,0x01,0x77,
-0x04,0xb0,0x10,0x06,0x04,0xf2,0x00,0x00,0xff,0xff,0x00,0x75,0xfe,0x0b,0x04,0xb2,
-0x04,0x4c,0x10,0x26,0x0b,0xb3,0x00,0x00,0x10,0x07,0x0b,0xf4,0x01,0xa9,0x03,0xb6,
-0xff,0xff,0xff,0xec,0x00,0x00,0x03,0xf8,0x05,0x46,0x10,0x26,0x0b,0xb4,0x00,0x00,
-0x10,0x07,0x0b,0xf4,0x01,0x77,0x04,0xb0,0xff,0xff,0xff,0xec,0x00,0x00,0x03,0xf0,
-0x04,0x4c,0x10,0x26,0x0b,0xb5,0x00,0x00,0x10,0x07,0x0b,0xf4,0x01,0xa3,0x03,0xb6,
-0xff,0xff,0x00,0x81,0xff,0xa4,0x07,0x9f,0x05,0x14,0x10,0x27,0x0b,0xf4,0x05,0xf5,
-0x04,0x7e,0x10,0x06,0x05,0x2c,0x00,0x00,0xff,0xff,0x00,0x81,0xff,0xa5,0x08,0x5c,
-0x04,0x4c,0x10,0x26,0x0b,0xfd,0x00,0x00,0x10,0x07,0x0b,0xf4,0x05,0xf5,0x03,0xb6,
-0xff,0xff,0xff,0xec,0x00,0x00,0x03,0x3f,0x05,0x14,0x10,0x26,0x0b,0xfe,0x00,0x00,
-0x10,0x07,0x0b,0xf4,0x01,0xa9,0x04,0x7e,0xff,0xff,0xff,0xec,0x00,0x00,0x04,0x20,
-0x04,0x7e,0x10,0x26,0x0b,0xff,0x00,0x00,0x10,0x07,0x0b,0xf4,0x01,0xbb,0x03,0xe8,
-0xff,0xff,0x00,0x6b,0xfe,0x47,0x05,0x9b,0x05,0x14,0x10,0x27,0x0b,0xf5,0x03,0x52,
-0x04,0x7e,0x10,0x06,0x05,0x19,0x00,0x00,0xff,0xff,0x00,0x6b,0xfe,0x0b,0x06,0xc0,
-0x04,0x01,0x10,0x26,0x0c,0x00,0x00,0x00,0x10,0x07,0x0b,0xf5,0x03,0x84,0x03,0x6b,
-0xff,0xff,0xff,0xec,0x00,0x00,0x03,0x3f,0x05,0x14,0x10,0x26,0x0c,0x01,0x00,0x00,
-0x10,0x07,0x0b,0xf5,0x01,0x2c,0x04,0x7e,0xff,0xff,0xff,0xec,0x00,0x00,0x04,0x20,
-0x04,0x7e,0x10,0x26,0x0c,0x02,0x00,0x00,0x10,0x07,0x0b,0xf5,0x01,0x38,0x03,0xe8,
-0xff,0xff,0x00,0x90,0xff,0xc8,0x05,0xc7,0x06,0x14,0x10,0x06,0x04,0xf7,0x00,0x00,
-0x00,0x02,0x00,0x90,0xff,0xc8,0x06,0xd2,0x06,0x14,0x00,0x21,0x00,0x44,0x00,0x00,
-0x01,0x15,0x06,0x07,0x06,0x15,0x14,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x23,
-0x22,0x27,0x35,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x27,0x26,0x37,0x36,
-0x37,0x36,0x13,0x06,0x27,0x26,0x27,0x24,0x35,0x34,0x37,0x33,0x06,0x15,0x16,0x17,
-0x16,0x33,0x32,0x37,0x36,0x37,0x36,0x19,0x01,0x33,0x11,0x14,0x17,0x16,0x3b,0x01,
-0x15,0x23,0x22,0x27,0x06,0x03,0xd0,0x4a,0x26,0x50,0x0e,0x0c,0x44,0x66,0x58,0x52,
-0x4e,0x42,0x38,0x44,0x2d,0x3c,0x39,0x3c,0x4e,0x4a,0x12,0x20,0x01,0x02,0x4b,0x55,
-0x8a,0x6d,0x91,0xcf,0x65,0xfe,0xdb,0x10,0xb8,0x0e,0x02,0xa0,0x79,0x7f,0x8c,0x59,
-0x98,0x62,0x4c,0xb8,0x31,0x2c,0x63,0x4b,0x82,0x99,0x71,0x9e,0x04,0x6f,0x52,0x04,
-0x0e,0x1e,0x21,0x1c,0x12,0x10,0x0a,0x0f,0x58,0x6e,0x2a,0x27,0x0b,0x58,0x0a,0x1a,
-0x1a,0x1e,0x26,0x11,0x10,0x1c,0x2f,0x2e,0x51,0x26,0x2b,0xfb,0x70,0x14,0x02,0x02,
-0x1e,0x58,0xc3,0x4b,0x35,0x3a,0x2c,0x5c,0x2e,0x23,0x1b,0x2f,0x5e,0x49,0x01,0x01,
-0x03,0xb1,0xfb,0x6b,0x6a,0x31,0x2c,0xb8,0x7b,0x7e,0x00,0x01,0xff,0xec,0x00,0x00,
-0x03,0xcf,0x06,0x14,0x00,0x1f,0x00,0x00,0x29,0x01,0x35,0x21,0x32,0x37,0x36,0x35,
-0x34,0x27,0x01,0x26,0x35,0x34,0x37,0x36,0x37,0x01,0x15,0x05,0x06,0x07,0x06,0x15,
-0x14,0x17,0x01,0x16,0x15,0x14,0x07,0x06,0x01,0x36,0xfe,0xb6,0x01,0x36,0x94,0x2d,
-0x10,0x36,0xfe,0xca,0x32,0x0a,0x1f,0x68,0x02,0xe9,0xfd,0xad,0x47,0x15,0x06,0x1f,
-0x01,0x13,0x66,0x3e,0x5f,0xb8,0x68,0x24,0x24,0x45,0x42,0x01,0x7c,0x3d,0x51,0x23,
-0x21,0x76,0x2b,0x01,0x36,0xba,0xfa,0x1e,0x28,0x0b,0x19,0x20,0x25,0xfe,0xb6,0x7b,
-0x7b,0x71,0x65,0x9b,0x00,0x01,0xff,0xec,0x00,0x00,0x04,0x7f,0x06,0x14,0x00,0x29,
-0x00,0x00,0x29,0x01,0x35,0x21,0x32,0x37,0x36,0x35,0x34,0x27,0x01,0x26,0x35,0x34,
-0x37,0x36,0x37,0x01,0x15,0x05,0x06,0x07,0x06,0x15,0x14,0x17,0x01,0x16,0x17,0x16,
-0x3b,0x01,0x15,0x23,0x22,0x27,0x26,0x2f,0x01,0x06,0x07,0x06,0x01,0x36,0xfe,0xb6,
-0x01,0x36,0x94,0x2d,0x10,0x36,0xfe,0xca,0x32,0x0a,0x1f,0x68,0x02,0xe9,0xfd,0xad,
-0x47,0x15,0x06,0x1f,0x02,0x47,0x16,0x26,0x2b,0x40,0x58,0x84,0x41,0x3a,0x67,0x21,
-0x61,0x15,0x11,0x5f,0xb8,0x68,0x24,0x24,0x45,0x42,0x01,0x7c,0x3d,0x51,0x23,0x21,
-0x76,0x2b,0x01,0x36,0xba,0xfa,0x1e,0x28,0x0b,0x19,0x20,0x25,0xfd,0x3f,0x1a,0x0e,
-0x10,0xb8,0x18,0x2b,0x29,0x78,0x2e,0x1b,0x9b,0x00,0xff,0xff,0x00,0x8f,0xfe,0xc8,
-0x05,0x18,0x06,0x14,0x10,0x06,0x04,0xf8,0x00,0x00,0x00,0x01,0x00,0x8f,0xfe,0xc8,
-0x06,0x23,0x06,0x14,0x00,0x24,0x00,0x00,0x25,0x36,0x35,0x11,0x33,0x11,0x14,0x17,
-0x16,0x3b,0x01,0x15,0x23,0x22,0x27,0x06,0x07,0x06,0x05,0x06,0x23,0x22,0x27,0x24,
-0x03,0x26,0x37,0x33,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x04,0x12,0x4e,
-0xb8,0x31,0x2c,0x63,0x4b,0x82,0x70,0x4e,0x12,0x1b,0x79,0xfe,0xfb,0x86,0x55,0x63,
-0x45,0xfe,0xdc,0x01,0x01,0x40,0xb8,0x41,0xa6,0x28,0x49,0x50,0x6d,0xae,0x49,0x7e,
-0xe3,0x04,0x6a,0xfb,0x6b,0x6a,0x31,0x2c,0xb8,0x33,0x2e,0x28,0xb1,0x42,0x22,0x16,
-0x5b,0x01,0x12,0x8a,0x5c,0x73,0x73,0x7e,0x42,0x10,0x22,0x35,0x00,0x01,0xff,0xec,
-0x00,0x00,0x01,0xaf,0x06,0x14,0x00,0x0d,0x00,0x00,0x01,0x14,0x07,0x06,0x2b,0x01,
-0x35,0x33,0x32,0x37,0x36,0x35,0x11,0x33,0x01,0xaf,0x57,0x50,0x9a,0x82,0x4b,0x63,
-0x2c,0x31,0xb8,0x01,0x73,0xb2,0x65,0x5c,0xb8,0x2c,0x31,0x6a,0x04,0x95,0x00,0x01,
-0xff,0xec,0x00,0x00,0x02,0xba,0x06,0x14,0x00,0x14,0x00,0x00,0x25,0x06,0x2b,0x01,
-0x35,0x33,0x32,0x37,0x36,0x35,0x11,0x33,0x11,0x14,0x17,0x16,0x3b,0x01,0x15,0x23,
-0x22,0x01,0x53,0x4d,0x98,0x82,0x4b,0x63,0x2c,0x31,0xb8,0x31,0x2c,0x63,0x4b,0x82,
-0x96,0x56,0x56,0xb8,0x2c,0x31,0x6a,0x04,0x95,0xfb,0x6b,0x6a,0x31,0x2c,0xb8,0x00,
-0xff,0xff,0x00,0x8c,0xfe,0x14,0x04,0x5e,0x02,0xf3,0x10,0x06,0x04,0xf9,0x00,0x00,
-0x00,0x02,0x00,0x8c,0xfe,0x14,0x05,0x67,0x02,0x74,0x00,0x11,0x00,0x35,0x00,0x00,
-0x25,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x27,0x26,0x23,0x22,0x07,0x06,
-0x15,0x14,0x05,0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x07,0x06,0x15,0x11,0x23,0x11,
-0x34,0x37,0x36,0x33,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x16,0x17,
-0x16,0x3b,0x01,0x15,0x23,0x22,0x02,0x62,0x7a,0x4c,0x2c,0x15,0x35,0x06,0x15,0x3b,
-0x28,0x2e,0x3b,0x1b,0x44,0x01,0xc0,0x0f,0x0d,0x85,0x4b,0xb5,0x8d,0x32,0x4b,0x19,
-0xc8,0x78,0x41,0x5a,0x02,0xa2,0x4d,0x5c,0x48,0x54,0xaa,0x28,0x0f,0x28,0x26,0x69,
-0x4b,0x82,0xaf,0xa8,0x2a,0x16,0x39,0x3a,0x18,0x14,0x58,0x11,0x0c,0x1b,0x44,0x44,
-0x28,0xa9,0x0e,0x08,0x50,0x4e,0x1c,0x4e,0x1a,0x4f,0xfe,0x93,0x01,0x6d,0xad,0x66,
-0x37,0x2a,0x28,0x94,0x84,0x3f,0x24,0x47,0xb3,0x43,0x2c,0x2c,0xb8,0x00,0x00,0x02,
-0xff,0xec,0xff,0xcd,0x03,0xa6,0x02,0x6d,0x00,0x18,0x00,0x2a,0x00,0x00,0x25,0x06,
-0x07,0x06,0x27,0x06,0x2b,0x01,0x35,0x33,0x32,0x37,0x36,0x37,0x36,0x37,0x36,0x33,
-0x32,0x17,0x16,0x17,0x16,0x15,0x14,0x25,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x27,
-0x26,0x27,0x26,0x23,0x22,0x07,0x06,0x07,0x06,0x03,0x64,0x60,0x8c,0xd4,0x70,0x40,
-0x68,0xa0,0x74,0x34,0x2c,0x2b,0x05,0x14,0x87,0x5e,0x5d,0x45,0x45,0xbd,0x15,0x04,
-0xfd,0xf0,0x3e,0x9f,0x2f,0x13,0x34,0x05,0x16,0x3a,0x27,0x27,0x35,0x29,0x32,0x0f,
-0x07,0x34,0x65,0x01,0x02,0x64,0x30,0xb8,0x24,0x23,0x31,0xb5,0x50,0x38,0x1d,0x4f,
-0xab,0x24,0x2a,0x8e,0x4d,0x45,0x12,0x35,0x45,0x13,0x12,0x58,0x11,0x0c,0x1b,0x21,
-0x61,0x25,0x00,0x02,0xff,0xec,0xff,0xce,0x04,0xb4,0x02,0x6d,0x00,0x1d,0x00,0x2f,
-0x00,0x00,0x25,0x06,0x23,0x22,0x27,0x06,0x2b,0x01,0x35,0x33,0x32,0x37,0x36,0x37,
-0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x16,0x17,0x16,0x3b,0x01,0x15,0x23,0x22,
-0x25,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x27,0x26,0x23,0x22,0x07,0x06,
-0x07,0x06,0x03,0x64,0x61,0x8b,0xd6,0x6e,0x40,0x68,0xa0,0x74,0x34,0x2c,0x2b,0x05,
-0x14,0x87,0x5e,0x5d,0x48,0x42,0xc1,0x11,0x05,0x33,0x24,0x6b,0x4b,0x82,0xb0,0xfe,
-0x14,0x3e,0x9f,0x2f,0x13,0x34,0x05,0x16,0x3a,0x27,0x27,0x35,0x29,0x32,0x0f,0x07,
-0x34,0x66,0x62,0x30,0xb8,0x24,0x23,0x31,0xb5,0x50,0x38,0x1d,0x53,0xa7,0x31,0x3e,
-0x2c,0xb8,0xc4,0x45,0x12,0x35,0x45,0x13,0x12,0x58,0x11,0x0c,0x1b,0x21,0x61,0x25,
-0xff,0xff,0x00,0x93,0xfe,0xb5,0x05,0x49,0x03,0xb6,0x10,0x27,0x0b,0xf4,0x02,0x3f,
-0x03,0x20,0x10,0x06,0x05,0x31,0x00,0x00,0xff,0xff,0x00,0x93,0xfe,0x0c,0x06,0x2b,
-0x02,0xbc,0x10,0x26,0x0b,0x53,0x00,0x00,0x10,0x07,0x0b,0xf4,0x02,0x3f,0x02,0x26,
-0xff,0xff,0xff,0xec,0x00,0x00,0x01,0x87,0x03,0xe8,0x10,0x27,0x0b,0xf4,0x00,0xe0,
-0x03,0x52,0x10,0x06,0x0b,0xfb,0x00,0x00,0xff,0xff,0xff,0xec,0x00,0x00,0x02,0x7e,
-0x03,0xe8,0x10,0x27,0x0b,0xf4,0x00,0xe0,0x03,0x52,0x10,0x06,0x0b,0xfc,0x00,0x00,
-0xff,0xff,0x00,0x8b,0xff,0xc6,0x03,0xa0,0x02,0xde,0x10,0x06,0x04,0xfb,0x00,0x00,
-0x00,0x02,0x00,0x91,0x00,0x00,0x04,0x5e,0x02,0xee,0x00,0x0a,0x00,0x24,0x00,0x00,
-0x01,0x26,0x27,0x26,0x27,0x06,0x07,0x06,0x17,0x1e,0x01,0x13,0x26,0x27,0x33,0x16,
-0x17,0x16,0x17,0x16,0x3b,0x01,0x15,0x23,0x22,0x27,0x26,0x27,0x06,0x23,0x22,0x27,
-0x26,0x35,0x34,0x37,0x36,0x02,0xa4,0x0f,0x0d,0x0d,0x0c,0x78,0x52,0x6f,0x02,0x01,
-0xb4,0x74,0x04,0x03,0xb8,0x01,0x24,0x15,0x38,0x1f,0x70,0x4b,0x82,0x5a,0x49,0x2d,
-0x26,0x8a,0x9c,0x38,0x3a,0xbd,0xcc,0x6d,0x01,0x1a,0x2a,0x31,0x32,0x65,0x0c,0x43,
-0x59,0x3e,0x29,0x32,0x01,0xd1,0x27,0x2b,0xa8,0xae,0x65,0x4f,0x2c,0xb8,0x33,0x1f,
-0x3b,0x49,0x0f,0x30,0x9a,0xad,0x7f,0x44,0x00,0x03,0xff,0xec,0xff,0xbd,0x03,0xbd,
-0x03,0xe5,0x00,0x0f,0x00,0x2d,0x00,0x3d,0x00,0x00,0x01,0x36,0x37,0x36,0x35,0x34,
-0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x07,0x32,0x37,0x26,0x27,0x26,
-0x35,0x34,0x37,0x36,0x17,0x26,0x27,0x35,0x16,0x17,0x04,0x17,0x16,0x15,0x14,0x07,
-0x06,0x23,0x22,0x27,0x06,0x2b,0x01,0x35,0x01,0x16,0x15,0x14,0x07,0x06,0x07,0x16,
-0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x01,0x94,0x24,0x22,0x27,0x0f,0x16,0x3a,
-0x41,0x17,0x16,0x07,0x15,0xf9,0x34,0x4e,0x2d,0x0f,0x12,0x2d,0x30,0x4d,0x2c,0x51,
-0xdf,0xd8,0x01,0x00,0x40,0x0e,0x28,0x4a,0xaf,0x83,0x9a,0x78,0x92,0x89,0x02,0xab,
-0x06,0x62,0x0c,0x11,0x34,0x31,0x7d,0x11,0x07,0x21,0x1d,0x01,0x0d,0x1b,0x40,0x48,
-0x3d,0x2e,0x25,0x34,0x2d,0x2b,0x23,0x1e,0x25,0x76,0x88,0x0b,0x69,0x45,0x4e,0x40,
-0x54,0x53,0x5a,0x09,0x27,0x0e,0xb9,0x44,0xb3,0xd1,0xde,0x34,0x39,0x67,0x3d,0x71,
-0x6c,0x29,0xb8,0x01,0x44,0x25,0x27,0x93,0x69,0x0e,0x13,0x2e,0x43,0x1e,0x21,0x3c,
-0x4e,0x45,0x00,0x03,0xff,0xec,0xfe,0x0d,0x03,0xc4,0x02,0xab,0x00,0x0a,0x00,0x24,
-0x00,0x2f,0x00,0x00,0x25,0x33,0x32,0x37,0x36,0x35,0x34,0x23,0x22,0x07,0x06,0x07,
-0x12,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x21,0x15,0x21,0x16,0x15,0x14,
-0x07,0x06,0x23,0x22,0x27,0x26,0x03,0x23,0x35,0x05,0x14,0x17,0x16,0x33,0x32,0x35,
-0x34,0x27,0x26,0x23,0x01,0x53,0x13,0x2a,0x60,0x72,0x54,0x4b,0x4a,0x26,0xb8,0x09,
-0x81,0x6c,0x81,0x8a,0x45,0x2e,0xa3,0x01,0x58,0xfe,0xa8,0xa3,0x2e,0x45,0x8a,0x81,
-0x6c,0x81,0x09,0xaf,0x01,0x67,0x26,0x4a,0x4b,0x54,0x72,0x60,0x2a,0xb8,0x4c,0x5a,
-0x34,0x70,0x8d,0x48,0x75,0x01,0x0a,0x7e,0x6b,0x63,0x43,0x72,0x6f,0x6c,0xb8,0x6c,
-0x6f,0x72,0x43,0x63,0x6b,0x80,0x01,0x08,0xb8,0xb8,0x75,0x48,0x8d,0x70,0x34,0x5a,
-0x4c,0x00,0xff,0xff,0xff,0xab,0xfe,0x32,0x03,0x43,0x03,0xd9,0x10,0x06,0x04,0xfc,
-0x00,0x00,0x00,0x02,0xff,0xab,0xfe,0x0c,0x04,0x36,0x02,0x87,0x00,0x0b,0x00,0x2c,
-0x00,0x00,0x25,0x34,0x27,0x26,0x27,0x26,0x07,0x06,0x07,0x06,0x17,0x16,0x05,0x33,
-0x15,0x23,0x27,0x06,0x07,0x06,0x07,0x06,0x21,0x35,0x20,0x37,0x36,0x37,0x26,0x27,
-0x26,0x27,0x26,0x27,0x26,0x37,0x36,0x37,0x36,0x17,0x16,0x17,0x16,0x17,0x16,0x02,
-0x8d,0x10,0x18,0x2e,0x3c,0x3c,0x43,0x0d,0x11,0x40,0x2f,0x01,0x73,0xf6,0xc2,0x46,
-0x19,0x81,0x53,0x69,0xc0,0xfe,0x93,0x01,0x69,0x84,0xa8,0x3e,0x76,0x2d,0x8b,0x33,
-0x6a,0x0a,0x02,0x0a,0x1b,0xb0,0x3b,0x41,0x57,0x45,0x85,0x16,0x0d,0xb8,0x4c,0x39,
-0x50,0x1e,0x29,0x1a,0x1d,0x38,0x4b,0x36,0x28,0x04,0xb8,0x01,0x9c,0x81,0x53,0x2f,
-0x56,0xb8,0x4c,0x5f,0x94,0x03,0x07,0x18,0x2b,0x59,0x87,0x1f,0x39,0x9b,0x4b,0x19,
-0x01,0x02,0x31,0x5c,0x8d,0x53,0xff,0xff,0x00,0x82,0xfe,0xf3,0x05,0xc0,0x03,0x4a,
-0x10,0x06,0x04,0xfd,0x00,0x00,0x00,0x01,0x00,0x82,0xfe,0xf0,0x06,0xbf,0x02,0x02,
-0x00,0x37,0x00,0x00,0x05,0x36,0x35,0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,
-0x37,0x36,0x33,0x32,0x17,0x16,0x3b,0x01,0x15,0x23,0x22,0x27,0x26,0x23,0x22,0x07,
-0x06,0x15,0x14,0x17,0x16,0x17,0x16,0x07,0x06,0x07,0x06,0x23,0x22,0x27,0x24,0x11,
-0x34,0x37,0x33,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x04,0x4c,0x5b,0x01,
-0x2f,0x1d,0x1e,0x2c,0x34,0x50,0x54,0x1e,0x2a,0x75,0x57,0x80,0x20,0x23,0x23,0x72,
-0x70,0x6c,0x1a,0x24,0x0f,0x2d,0x41,0x49,0x03,0x03,0x71,0x80,0xda,0x59,0x68,0xbc,
-0x75,0xfe,0xdb,0x3f,0xb8,0x41,0xa6,0x42,0xb3,0x5b,0x4d,0x95,0x21,0x33,0x21,0x2b,
-0x0d,0x08,0x28,0x3b,0x3d,0x41,0x3c,0x5e,0x0e,0x06,0x86,0xc4,0xb8,0xac,0xa5,0x06,
-0x11,0x23,0x30,0x1b,0x1e,0x7b,0x62,0x56,0x60,0x1f,0x0c,0x29,0x67,0x01,0x06,0x99,
-0x5a,0x5a,0x99,0x72,0x4e,0x1f,0x08,0x0f,0xff,0xff,0x00,0x82,0xfe,0x0c,0x05,0xc0,
-0x03,0x4a,0x10,0x27,0x0b,0xf5,0x01,0xf4,0xfe,0x0c,0x10,0x06,0x04,0xfd,0x00,0x00,
-0xff,0xff,0x00,0x82,0xfe,0x0c,0x06,0xbf,0x02,0x02,0x10,0x27,0x0b,0xf5,0x01,0xf4,
-0xfe,0x0c,0x10,0x06,0x0b,0xd9,0x00,0x00,0xff,0xff,0xff,0xec,0xfe,0xd4,0x01,0xf3,
-0x02,0x58,0x10,0x26,0x0b,0x54,0x00,0x00,0x10,0x07,0x0b,0xf5,0x00,0x63,0xfe,0xd4,
-0xff,0xff,0xff,0xec,0xfe,0xd4,0x02,0x7e,0x02,0x58,0x10,0x26,0x0b,0x55,0x00,0x00,
-0x10,0x07,0x0b,0xf5,0x00,0x63,0xfe,0xd4,0xff,0xff,0xff,0x2e,0xff,0xec,0x03,0xbf,
-0x06,0xed,0x10,0x26,0x0b,0xe4,0x00,0x00,0x10,0x07,0x05,0x07,0xfe,0x96,0x01,0x2c,
-0xff,0xff,0xff,0x2e,0xff,0xec,0x04,0xda,0x06,0xed,0x10,0x26,0x0b,0xe5,0x00,0x00,
-0x10,0x07,0x05,0x07,0xfe,0x96,0x01,0x2c,0xff,0xff,0xff,0xe5,0xff,0xec,0x03,0xbf,
-0x07,0xa3,0x10,0x26,0x0b,0xe4,0x00,0x00,0x10,0x07,0x05,0x08,0xfe,0x96,0x01,0x2c,
-0xff,0xff,0xff,0xe5,0xff,0xec,0x04,0xda,0x07,0xa3,0x10,0x26,0x0b,0xe5,0x00,0x00,
-0x10,0x07,0x05,0x08,0xfe,0x96,0x01,0x2c,0xff,0xff,0x00,0x17,0xfe,0x0b,0x03,0xbf,
-0x06,0x14,0x10,0x26,0x0b,0xe4,0x00,0x00,0x10,0x07,0x05,0x09,0xfe,0xc8,0x00,0x00,
-0xff,0xff,0x00,0x17,0xfe,0x0b,0x04,0xda,0x06,0x14,0x10,0x26,0x0b,0xe5,0x00,0x00,
-0x10,0x07,0x05,0x09,0xfe,0xc8,0x00,0x00,0x00,0x01,0x00,0x54,0xff,0xec,0x03,0xbf,
-0x06,0x14,0x00,0x16,0x00,0x00,0x01,0x10,0x07,0x06,0x07,0x06,0x23,0x22,0x27,0x35,
-0x16,0x33,0x32,0x37,0x01,0x33,0x01,0x36,0x37,0x36,0x35,0x11,0x33,0x03,0xbf,0x8b,
-0x37,0x4d,0xcd,0x9e,0x6a,0x4b,0x60,0x55,0x71,0x88,0xfe,0x16,0xb3,0x01,0xaa,0x1d,
-0x14,0x25,0xb8,0x03,0x42,0xfe,0xd4,0xda,0x55,0x47,0xb4,0x20,0xb8,0x20,0x98,0x04,
-0x46,0xfc,0x41,0x2b,0x37,0x89,0xb8,0x02,0xae,0x00,0x00,0x01,0x00,0x54,0xff,0xec,
-0x04,0xda,0x06,0x14,0x00,0x1f,0x00,0x00,0x01,0x06,0x07,0x06,0x23,0x22,0x27,0x35,
-0x16,0x33,0x32,0x37,0x01,0x33,0x01,0x36,0x37,0x36,0x35,0x11,0x33,0x11,0x14,0x17,
-0x16,0x3b,0x01,0x15,0x23,0x22,0x27,0x26,0x03,0x34,0x3b,0x49,0xca,0xa1,0x6a,0x4b,
-0x60,0x55,0x71,0x88,0xfe,0x16,0xb3,0x01,0xaa,0x1d,0x14,0x25,0xb8,0x22,0x40,0x50,
-0x69,0x81,0xaf,0x66,0x11,0x01,0x3c,0x5b,0x41,0xb4,0x20,0xb8,0x20,0x98,0x04,0x46,
-0xfc,0x41,0x2b,0x37,0x89,0xb8,0x02,0xae,0xfc,0x44,0xae,0x54,0x9e,0xb8,0xf3,0x29,
-0x00,0x03,0x00,0x1e,0xff,0x54,0x08,0x16,0x07,0x4c,0x00,0x03,0x00,0x07,0x00,0x2a,
-0x00,0x00,0x09,0x04,0x15,0x33,0x35,0x27,0x35,0x34,0x36,0x37,0x36,0x37,0x36,0x3f,
-0x01,0x36,0x37,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x15,0x3e,0x01,0x33,0x32,
-0x16,0x15,0x14,0x06,0x0f,0x01,0x0e,0x01,0x1d,0x01,0x04,0x1a,0x03,0xfc,0xfc,0x04,
-0xfc,0x04,0x03,0x96,0xcb,0x06,0x06,0x06,0x08,0x13,0x17,0x2c,0x58,0x5c,0x22,0x24,
-0xdf,0xb8,0x67,0xc1,0x5e,0x61,0xb3,0x4f,0x6c,0x83,0x33,0x39,0x5a,0x5a,0x38,0x07,
-0x4c,0xfc,0x04,0xfc,0x04,0x03,0xfc,0xfd,0xae,0xfe,0xfe,0x93,0x7b,0x34,0x3c,0x15,
-0x19,0x1a,0x1f,0x2b,0x56,0x5a,0x40,0x45,0x4c,0x9f,0xc2,0x38,0x39,0xbc,0x43,0x46,
-0x6e,0x59,0x31,0x5e,0x35,0x59,0x56,0x82,0x65,0x9a,0x00,0x01,0xff,0xb9,0x04,0x9a,
-0x00,0xc7,0x06,0x12,0x00,0x03,0x00,0x0a,0x40,0x03,0x00,0x03,0x04,0x00,0x10,0xd4,
-0xcc,0x30,0x11,0x33,0x03,0x23,0xc7,0x75,0x99,0x06,0x12,0xfe,0x88,0x00,0x00,0x02,
-0xfc,0xd7,0x05,0x0e,0xff,0x29,0x05,0xd9,0x00,0x03,0x00,0x07,0x00,0xa5,0x40,0x0d,
-0x04,0x00,0xce,0x06,0x02,0x08,0x01,0x64,0x00,0x05,0x64,0x04,0x08,0x10,0xd4,0xfc,
-0xdc,0xec,0x31,0x00,0x10,0xd4,0x3c,0xec,0x32,0x30,0x00,0x4b,0xb0,0x0e,0x54,0x4b,
-0xb0,0x11,0x54,0x5b,0x58,0xbd,0x00,0x08,0x00,0x40,0x00,0x01,0x00,0x08,0x00,0x08,
-0xff,0xc0,0x38,0x11,0x37,0x38,0x59,0x01,0x4b,0xb0,0x0e,0x54,0x4b,0xb0,0x0d,0x54,
-0x5b,0x4b,0xb0,0x17,0x54,0x5b,0x58,0xbd,0x00,0x08,0xff,0xc0,0x00,0x01,0x00,0x08,
-0x00,0x08,0x00,0x40,0x38,0x11,0x37,0x38,0x59,0x01,0x4b,0xb0,0x11,0x54,0x4b,0xb0,
-0x19,0x54,0x5b,0x58,0xbd,0x00,0x08,0x00,0x40,0x00,0x01,0x00,0x08,0x00,0x08,0xff,
-0xc0,0x38,0x11,0x37,0x38,0x59,0x00,0x4b,0xb0,0x18,0x54,0x58,0xbd,0x00,0x08,0xff,
-0xc0,0x00,0x01,0x00,0x08,0x00,0x08,0x00,0x40,0x38,0x11,0x37,0x38,0x59,0x40,0x11,
-0x60,0x01,0x60,0x02,0x60,0x05,0x60,0x06,0x70,0x01,0x70,0x02,0x70,0x05,0x70,0x06,
-0x08,0x01,0x5d,0x01,0x33,0x15,0x23,0x25,0x33,0x15,0x23,0xfe,0x5e,0xcb,0xcb,0xfe,
-0x79,0xcb,0xcb,0x05,0xd9,0xcb,0xcb,0xcb,0x00,0x01,0xfd,0x73,0x04,0xee,0xfe,0xf0,
-0x05,0xf6,0x00,0x03,0x00,0x7f,0x40,0x11,0x02,0x03,0x00,0x03,0x01,0x00,0x00,0x03,
-0x42,0x00,0x02,0xfa,0x04,0x01,0x03,0x03,0x04,0x10,0xc4,0x10,0xc0,0x31,0x00,0x10,
-0xf4,0xcc,0x30,0x4b,0x53,0x58,0x07,0x10,0x05,0xc9,0x07,0x10,0x05,0xc9,0x59,0x22,
-0x00,0x4b,0xb0,0x0c,0x54,0x58,0xbd,0x00,0x04,0xff,0xc0,0x00,0x01,0x00,0x04,0x00,
-0x04,0x00,0x40,0x38,0x11,0x37,0x38,0x59,0x00,0x4b,0xb0,0x0e,0x54,0x58,0xbd,0x00,
-0x04,0x00,0x40,0x00,0x01,0x00,0x04,0x00,0x04,0xff,0xc0,0x38,0x11,0x37,0x38,0x59,
-0x40,0x20,0x06,0x02,0x15,0x02,0x25,0x01,0x25,0x02,0x36,0x02,0x46,0x02,0x56,0x02,
-0x6a,0x01,0x67,0x02,0x09,0x0f,0x00,0x0f,0x01,0x1f,0x00,0x1f,0x01,0x2f,0x00,0x2f,
-0x01,0x06,0x5d,0x01,0x5d,0x01,0x33,0x03,0x23,0xfe,0x37,0xb9,0xe4,0x99,0x05,0xf6,
-0xfe,0xf8,0x00,0x01,0xfc,0xb6,0x05,0x0e,0xff,0x4a,0x05,0xe9,0x00,0x1d,0x00,0x75,
-0x40,0x21,0x16,0x10,0x0f,0x03,0x13,0x0c,0x07,0x01,0x00,0x03,0x08,0x17,0x0c,0xc3,
-0x04,0x13,0xc3,0x1b,0x08,0xfa,0x1e,0x10,0x01,0x0f,0x00,0x07,0x16,0x56,0x18,0x07,
-0x56,0x09,0x1e,0x10,0xd4,0xec,0xd4,0xec,0x11,0x39,0x39,0x39,0x39,0x31,0x00,0x10,
-0xf4,0x3c,0xec,0xd4,0xec,0x32,0x12,0x17,0x39,0x11,0x12,0x17,0x39,0x30,0x00,0x4b,
-0xb0,0x0c,0x54,0x58,0xbd,0x00,0x1e,0xff,0xc0,0x00,0x01,0x00,0x1e,0x00,0x1e,0x00,
-0x40,0x38,0x11,0x37,0x38,0x59,0x00,0x4b,0xb0,0x0e,0x54,0x58,0xbd,0x00,0x1e,0x00,
-0x40,0x00,0x01,0x00,0x1e,0x00,0x1e,0xff,0xc0,0x38,0x11,0x37,0x38,0x59,0xb4,0x10,
-0x0b,0x1f,0x1a,0x02,0x5d,0x01,0x27,0x2e,0x01,0x23,0x22,0x06,0x1d,0x01,0x23,0x34,
-0x36,0x33,0x32,0x16,0x1f,0x01,0x1e,0x01,0x33,0x32,0x36,0x3d,0x01,0x33,0x0e,0x01,
-0x23,0x22,0x26,0xfd,0xfc,0x39,0x19,0x1f,0x0c,0x24,0x28,0x7d,0x67,0x56,0x24,0x3d,
-0x30,0x39,0x17,0x22,0x0f,0x20,0x28,0x7d,0x02,0x67,0x54,0x22,0x3b,0x05,0x39,0x21,
-0x0e,0x0b,0x32,0x2d,0x06,0x65,0x76,0x10,0x1b,0x1e,0x0d,0x0c,0x33,0x29,0x06,0x64,
-0x77,0x10,0x00,0x01,0xfd,0x0c,0x04,0xee,0xfe,0x8b,0x05,0xf6,0x00,0x03,0x00,0x89,
-0x40,0x11,0x01,0x02,0x03,0x02,0x00,0x03,0x03,0x02,0x42,0x00,0x01,0xfa,0x04,0x01,
-0x03,0x03,0x04,0x10,0xc4,0x10,0xc0,0x31,0x00,0x10,0xf4,0xcc,0x30,0x4b,0x53,0x58,
-0x07,0x10,0x05,0xc9,0x07,0x10,0x05,0xc9,0x59,0x22,0x00,0x4b,0xb0,0x0c,0x54,0x58,
-0xbd,0x00,0x04,0xff,0xc0,0x00,0x01,0x00,0x04,0x00,0x04,0x00,0x40,0x38,0x11,0x37,
-0x38,0x59,0x00,0x4b,0xb0,0x0e,0x54,0x58,0xbd,0x00,0x04,0x00,0x40,0x00,0x01,0x00,
-0x04,0x00,0x04,0xff,0xc0,0x38,0x11,0x37,0x38,0x59,0x40,0x2a,0x06,0x00,0x06,0x01,
-0x16,0x00,0x12,0x01,0x24,0x00,0x24,0x01,0x35,0x01,0x43,0x01,0x55,0x00,0x55,0x01,
-0x9f,0x00,0x9f,0x01,0xaf,0x00,0xaf,0x01,0x0e,0x0f,0x00,0x0f,0x03,0x1f,0x00,0x1f,
-0x03,0x2f,0x00,0x2f,0x03,0x06,0x5d,0x01,0x5d,0x01,0x13,0x23,0x03,0xfd,0xc7,0xc4,
-0x99,0xe6,0x05,0xf6,0xfe,0xf8,0x01,0x08,0x00,0x01,0xfc,0xcf,0x04,0xee,0xff,0x31,
-0x05,0xf8,0x00,0x06,0x00,0x77,0x40,0x0a,0x04,0x00,0x05,0x02,0xfa,0x07,0x04,0x02,
-0x06,0x07,0x10,0xd4,0xc4,0x39,0x31,0x00,0x10,0xf4,0x3c,0xc4,0x39,0x30,0x00,0x4b,
-0xb0,0x0c,0x54,0x58,0xbd,0x00,0x07,0xff,0xc0,0x00,0x01,0x00,0x07,0x00,0x07,0x00,
-0x40,0x38,0x11,0x37,0x38,0x59,0x00,0x4b,0xb0,0x0e,0x54,0x58,0xbd,0x00,0x07,0x00,
-0x40,0x00,0x01,0x00,0x07,0x00,0x07,0xff,0xc0,0x38,0x11,0x37,0x38,0x59,0x01,0x4b,
-0xb0,0x0e,0x54,0x58,0xbd,0x00,0x07,0xff,0xc0,0x00,0x01,0x00,0x07,0x00,0x07,0x00,
-0x40,0x38,0x11,0x37,0x38,0x59,0x40,0x13,0x0f,0x00,0x0f,0x01,0x0c,0x04,0x1f,0x00,
-0x1f,0x01,0x1d,0x04,0x2f,0x00,0x2f,0x01,0x2d,0x04,0x09,0x00,0x5d,0x01,0x33,0x13,
-0x23,0x27,0x07,0x23,0xfd,0xa2,0xbc,0xd3,0x8b,0xa6,0xa6,0x8b,0x05,0xf8,0xfe,0xf6,
-0xb2,0xb2,0x00,0x01,0xfc,0xcf,0x04,0xee,0xff,0x31,0x05,0xf8,0x00,0x06,0x00,0x86,
-0x40,0x0a,0x03,0x04,0x01,0x00,0xfa,0x07,0x03,0x05,0x01,0x07,0x10,0xd4,0xc4,0x39,
-0x31,0x00,0x10,0xf4,0xc4,0x32,0x39,0x30,0x00,0x4b,0xb0,0x0c,0x54,0x4b,0xb0,0x09,
-0x54,0x5b,0x4b,0xb0,0x0a,0x54,0x5b,0x4b,0xb0,0x0b,0x54,0x5b,0x58,0xbd,0x00,0x07,
-0xff,0xc0,0x00,0x01,0x00,0x07,0x00,0x07,0x00,0x40,0x38,0x11,0x37,0x38,0x59,0x00,
-0x4b,0xb0,0x0e,0x54,0x58,0xbd,0x00,0x07,0x00,0x40,0x00,0x01,0x00,0x07,0x00,0x07,
-0xff,0xc0,0x38,0x11,0x37,0x38,0x59,0x01,0x4b,0xb0,0x0e,0x54,0x58,0xbd,0x00,0x07,
-0xff,0xc0,0x00,0x01,0x00,0x07,0x00,0x07,0x00,0x40,0x38,0x11,0x37,0x38,0x59,0x40,
-0x13,0x00,0x00,0x03,0x03,0x00,0x06,0x10,0x00,0x12,0x03,0x10,0x06,0x20,0x00,0x22,
-0x03,0x20,0x06,0x09,0x00,0x5d,0x01,0x03,0x33,0x17,0x37,0x33,0x03,0xfd,0xa2,0xd3,
-0x8b,0xa6,0xa6,0x8b,0xd3,0x04,0xee,0x01,0x0a,0xb2,0xb2,0xfe,0xf6,0x00,0x00,0x01,
-0xfc,0xc7,0x05,0x06,0xff,0x39,0x05,0xf8,0x00,0x0d,0x00,0x00,0x03,0x23,0x2e,0x01,
-0x23,0x22,0x06,0x07,0x23,0x3e,0x01,0x33,0x32,0x16,0xc7,0x76,0x0d,0x63,0x53,0x52,
-0x61,0x10,0x76,0x0a,0xa0,0x8f,0x90,0x9f,0x05,0x06,0x36,0x39,0x37,0x38,0x77,0x7b,
-0x7a,0x00,0x00,0x01,0xfc,0xc7,0x05,0x06,0xff,0x39,0x05,0xf8,0x00,0x0d,0x00,0x6a,
-0x40,0x0e,0x07,0x00,0x04,0xc3,0x0b,0xfa,0x0e,0x07,0x56,0x08,0x01,0x56,0x00,0x0e,
-0x10,0xd4,0xec,0xd4,0xec,0x31,0x00,0x10,0xf4,0xfc,0xc4,0x32,0x30,0x00,0x4b,0xb0,
-0x0c,0x54,0x58,0xbd,0x00,0x0e,0xff,0xc0,0x00,0x01,0x00,0x0e,0x00,0x0e,0x00,0x40,
-0x38,0x11,0x37,0x38,0x59,0x00,0x4b,0xb0,0x0e,0x54,0x58,0xbd,0x00,0x0e,0x00,0x40,
-0x00,0x01,0x00,0x0e,0x00,0x0e,0xff,0xc0,0x38,0x11,0x37,0x38,0x59,0x01,0x4b,0xb0,
-0x0e,0x54,0x4b,0xb0,0x0f,0x54,0x5b,0x58,0xbd,0x00,0x0e,0xff,0xc0,0x00,0x01,0x00,
-0x0e,0x00,0x0e,0x00,0x40,0x38,0x11,0x37,0x38,0x59,0x01,0x33,0x1e,0x01,0x33,0x32,
-0x36,0x37,0x33,0x0e,0x01,0x23,0x22,0x26,0xfc,0xc7,0x76,0x0d,0x63,0x53,0x52,0x61,
-0x10,0x76,0x0a,0xa0,0x8f,0x90,0x9f,0x05,0xf8,0x36,0x39,0x37,0x38,0x77,0x7b,0x7a,
-0x00,0x01,0xfd,0x9a,0x05,0x0e,0xfe,0x66,0x05,0xdb,0x00,0x03,0x00,0x11,0xb6,0x00,
-0x02,0xfa,0x04,0x01,0x00,0x04,0x10,0xd4,0xcc,0x31,0x00,0x10,0xf4,0xcc,0x30,0x01,
-0x33,0x15,0x23,0xfd,0x9a,0xcc,0xcc,0x05,0xdb,0xcd,0x00,0x02,0xfc,0xe6,0x04,0xee,
-0xff,0xb2,0x05,0xf6,0x00,0x03,0x00,0x07,0x00,0x13,0x40,0x07,0x00,0x04,0x03,0x07,
-0x08,0x00,0x04,0x10,0xcc,0x31,0x00,0x10,0xd4,0x3c,0xcc,0x32,0x30,0x01,0x33,0x03,
-0x23,0x03,0x33,0x03,0x23,0xfe,0xf9,0xb9,0xe4,0x99,0x8b,0xb9,0xe4,0x99,0x05,0xf6,
-0xfe,0xf8,0x01,0x08,0xfe,0xf8,0x00,0x02,0xfc,0x4e,0x04,0xee,0xff,0x1a,0x05,0xf6,
-0x00,0x03,0x00,0x07,0x00,0x00,0x01,0x13,0x23,0x03,0x21,0x13,0x23,0x03,0xfd,0x07,
-0xc4,0x99,0xe4,0x02,0x08,0xc4,0x99,0xe4,0x05,0xf6,0xfe,0xf8,0x01,0x08,0xfe,0xf8,
-0x01,0x08,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x96,0x00,0x96,0x00,0x03,0x00,0x00,
-0x35,0x33,0x15,0x23,0x96,0x96,0x96,0x96,0x00,0x02,0x00,0x00,0x00,0x00,0x01,0x90,
-0x00,0x96,0x00,0x03,0x00,0x07,0x00,0x00,0x37,0x33,0x15,0x23,0x27,0x33,0x15,0x23,
-0xfa,0x96,0x96,0xfa,0x96,0x96,0x96,0x96,0x96,0x96,0x00,0x03,0x00,0x00,0x00,0x00,
-0x01,0x90,0x01,0x90,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x00,0x13,0x33,0x15,0x23,
-0x17,0x33,0x15,0x23,0x27,0x33,0x15,0x23,0x7d,0x96,0x96,0x7d,0x96,0x96,0xfa,0x96,
-0x96,0x01,0x90,0x96,0x64,0x96,0x96,0x96,0x00,0x03,0x00,0x00,0xff,0x06,0x01,0x90,
-0x00,0x96,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x00,0x17,0x33,0x15,0x23,0x13,0x33,
-0x15,0x23,0x27,0x33,0x15,0x23,0x7d,0x96,0x96,0x7d,0x96,0x96,0xfa,0x96,0x96,0x64,
-0x96,0x01,0x90,0x96,0x96,0x96,0x00,0x02,0x00,0x00,0xff,0x06,0x00,0x96,0x00,0x96,
-0x00,0x03,0x00,0x07,0x00,0x00,0x15,0x33,0x15,0x23,0x11,0x33,0x15,0x23,0x96,0x96,
-0x96,0x96,0x64,0x96,0x01,0x90,0x96,0x00,0x00,0x04,0x00,0x00,0xff,0x06,0x01,0x90,
-0x00,0x96,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x00,0x17,0x33,0x15,0x23,
-0x11,0x33,0x15,0x23,0x07,0x33,0x15,0x23,0x11,0x33,0x15,0x23,0xfa,0x96,0x96,0x96,
-0x96,0xfa,0x96,0x96,0x96,0x96,0x64,0x96,0x01,0x90,0x96,0x64,0x96,0x01,0x90,0x96,
-0x00,0x01,0x00,0x81,0xff,0xec,0x07,0xef,0x02,0x9d,0x00,0x26,0x00,0x00,0x01,0x14,
-0x17,0x16,0x3b,0x01,0x15,0x23,0x22,0x27,0x26,0x27,0x06,0x07,0x04,0x23,0x22,0x27,
-0x24,0x03,0x26,0x37,0x33,0x06,0x15,0x14,0x17,0x16,0x33,0x24,0x37,0x36,0x37,0x36,
-0x35,0x34,0x27,0x33,0x16,0x06,0xef,0x46,0x3f,0x3f,0x3c,0x66,0x74,0x47,0x50,0x18,
-0x9b,0xe9,0xfe,0xfd,0xd3,0xc4,0x7c,0xfe,0xb7,0x01,0x01,0x40,0xb8,0x41,0xcb,0x68,
-0x97,0x01,0x04,0xbe,0xc7,0x7b,0x3b,0x1d,0xb8,0x13,0x01,0xf8,0xd0,0x3b,0x35,0xb8,
-0x49,0x53,0x42,0x83,0x35,0x3a,0x26,0x65,0x01,0x08,0x8a,0x5c,0x5e,0x88,0x7d,0x43,
-0x22,0x02,0x37,0x3a,0x6d,0x34,0x77,0x3e,0x37,0x4b,0xff,0xff,0xff,0xec,0x00,0x00,
-0x01,0x87,0x02,0x58,0x10,0x06,0x0b,0x54,0x00,0x00,0xff,0xff,0xff,0xec,0x00,0x00,
-0x02,0x7e,0x02,0x58,0x10,0x06,0x0b,0x55,0x00,0x00,0x00,0x02,0x00,0x81,0xff,0xa5,
-0x08,0x5c,0x03,0x11,0x00,0x2c,0x00,0x3e,0x00,0x00,0x25,0x06,0x07,0x04,0x21,0x24,
-0x27,0x24,0x03,0x26,0x37,0x33,0x06,0x15,0x14,0x17,0x16,0x21,0x32,0x25,0x37,0x26,
-0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x33,0x32,0x17,0x16,0x17,0x16,0x15,0x14,
-0x07,0x16,0x33,0x21,0x15,0x21,0x22,0x27,0x36,0x35,0x34,0x27,0x26,0x27,0x26,0x23,
-0x22,0x07,0x06,0x07,0x06,0x15,0x14,0x17,0x16,0x06,0x78,0x68,0x6e,0xfe,0xe8,0xfe,
-0xf0,0xfe,0xcf,0x7d,0xfe,0xb7,0x01,0x01,0x40,0xb8,0x41,0xcb,0x51,0x01,0x2b,0xe8,
-0x01,0x1d,0x1c,0x22,0x1d,0x52,0x04,0x16,0xbc,0x3a,0x34,0x52,0x51,0x89,0x12,0x04,
-0x50,0x09,0x07,0x01,0x07,0xfe,0xf4,0x69,0x6f,0x68,0x05,0x0e,0x34,0x22,0x28,0x18,
-0x16,0x3d,0x13,0x06,0x29,0x31,0x24,0x2b,0x18,0x3c,0x01,0x27,0x67,0x01,0x06,0x8a,
-0x5c,0x5e,0x88,0x73,0x4d,0x1f,0x36,0x04,0x1b,0x2c,0x7c,0x79,0x1f,0x24,0x9b,0x4b,
-0x17,0x32,0x53,0x96,0x25,0x1e,0x90,0x6a,0x01,0xb8,0xdf,0x41,0x7a,0x14,0x1b,0x47,
-0x27,0x19,0x0a,0x19,0x3c,0x13,0x12,0x38,0x42,0x4e,0x00,0x02,0xff,0xec,0x00,0x00,
-0x03,0x3f,0x03,0xd9,0x00,0x0f,0x00,0x30,0x00,0x00,0x01,0x36,0x35,0x34,0x27,0x26,
-0x07,0x06,0x07,0x06,0x07,0x14,0x17,0x16,0x33,0x32,0x01,0x33,0x32,0x37,0x36,0x37,
-0x36,0x37,0x06,0x07,0x06,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x33,0x32,0x17,
-0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x23,0x21,0x02,0x56,0x29,0x42,0x1f,
-0x2c,0x34,0x28,0x28,0x01,0x37,0x28,0x2a,0x48,0xfd,0xae,0xf1,0x54,0x97,0x4f,0x3c,
-0x1f,0x0f,0x3f,0x61,0x82,0x4e,0x62,0x08,0x17,0x96,0x4e,0x4c,0x5a,0x42,0x60,0x2e,
-0x17,0x4e,0x4a,0x7c,0x6d,0x91,0xfe,0xbf,0x02,0x19,0x2b,0x4d,0x3b,0x33,0x19,0x01,
-0x01,0x2a,0x29,0x33,0x50,0x26,0x19,0xfe,0xb7,0x17,0x0c,0x5d,0x30,0x32,0x37,0x02,
-0x02,0x45,0x57,0x81,0x34,0x2c,0x94,0x45,0x24,0x32,0x48,0x66,0x33,0x8c,0xd0,0x8f,
-0x88,0x2c,0x27,0x00,0x00,0x02,0xff,0xec,0x00,0x00,0x04,0x20,0x03,0x08,0x00,0x21,
-0x00,0x35,0x00,0x00,0x01,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x16,0x3b,0x01,
-0x15,0x23,0x22,0x27,0x06,0x2b,0x01,0x35,0x33,0x32,0x37,0x26,0x27,0x26,0x35,0x34,
-0x37,0x36,0x37,0x36,0x33,0x32,0x07,0x22,0x07,0x06,0x07,0x06,0x15,0x14,0x17,0x16,
-0x17,0x36,0x37,0x36,0x35,0x34,0x27,0x26,0x27,0x26,0x02,0x66,0xb7,0x18,0x08,0x15,
-0x1d,0x24,0x27,0x93,0x7f,0xd9,0x88,0xb9,0xb9,0x88,0xd9,0x7f,0x93,0x27,0x1d,0x24,
-0x15,0x08,0x17,0xb9,0x1e,0x41,0x3f,0x3f,0x0f,0x12,0x38,0x18,0x0a,0x18,0x1f,0x44,
-0x3f,0x24,0x19,0x0b,0x17,0x39,0x13,0x02,0xfa,0x50,0x96,0x32,0x2a,0x49,0x31,0x43,
-0x32,0x11,0xb8,0x39,0x39,0xb8,0x11,0x28,0x4d,0x2e,0x4c,0x2c,0x30,0x8f,0x57,0x0e,
-0xb8,0x0a,0x20,0x35,0x15,0x1d,0x2b,0x35,0x44,0x16,0x15,0x45,0x32,0x2e,0x18,0x1a,
-0x34,0x21,0x0a,0x00,0x00,0x02,0x00,0x6b,0xfe,0x0b,0x06,0xc0,0x02,0xe4,0x00,0x2e,
-0x00,0x40,0x00,0x00,0x25,0x26,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,
-0x33,0x32,0x17,0x16,0x17,0x16,0x17,0x16,0x33,0x21,0x15,0x21,0x23,0x06,0x07,0x06,
-0x07,0x06,0x27,0x24,0x27,0x26,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x17,0x16,0x21,
-0x32,0x37,0x36,0x13,0x36,0x27,0x26,0x27,0x26,0x23,0x22,0x07,0x06,0x07,0x06,0x15,
-0x14,0x17,0x16,0x17,0x16,0x04,0xb8,0x42,0x2e,0x79,0x39,0x93,0x06,0x28,0x93,0x29,
-0x57,0x70,0x38,0x63,0x32,0x14,0x06,0x1a,0x04,0x01,0x07,0xfe,0xf4,0x30,0x2d,0x3d,
-0x80,0x9e,0xaf,0xcd,0xfe,0x8e,0x5e,0x45,0x3e,0xb8,0x3e,0x1b,0x3c,0x01,0x06,0x8c,
-0x96,0xd5,0x6c,0x04,0x16,0x13,0x2f,0x22,0x27,0x22,0x15,0x33,0x15,0x0a,0x39,0x4c,
-0x64,0x2f,0x0a,0x05,0x0d,0x23,0x2b,0x6d,0xb9,0x3d,0x1a,0xa5,0x45,0x13,0x32,0x58,
-0x91,0x3a,0xd6,0x01,0xb8,0x7a,0x46,0x91,0x4e,0x56,0x01,0x02,0xbe,0x8a,0x7d,0xa6,
-0x60,0x6b,0x9b,0x4c,0x3a,0x82,0x44,0x62,0x01,0x5a,0x7a,0x57,0x4b,0x23,0x19,0x0a,
-0x1b,0x3a,0x1e,0x19,0x3c,0x2c,0x3b,0x14,0x09,0x00,0xff,0xff,0xff,0xec,0x00,0x00,
-0x03,0x3f,0x03,0xd9,0x10,0x06,0x0b,0xfe,0x00,0x00,0xff,0xff,0xff,0xec,0x00,0x00,
-0x04,0x20,0x03,0x08,0x10,0x06,0x0b,0xff,0x00,0x00,0xff,0xff,0xff,0xec,0x00,0x00,
-0x01,0x87,0x03,0xe8,0x10,0x26,0x0b,0xfb,0x00,0x00,0x10,0x07,0x0b,0xf4,0x00,0xe0,
-0x03,0x52,0xff,0xff,0xff,0xec,0x00,0x00,0x02,0x7e,0x03,0xe8,0x10,0x26,0x0b,0xfc,
-0x00,0x00,0x10,0x07,0x0b,0xf4,0x00,0xe0,0x03,0x52,0x00,0x02,0x00,0x00,0x00,0x00,
-0x01,0xb6,0x01,0xb7,0x00,0x0b,0x00,0x17,0x00,0x00,0x25,0x34,0x27,0x26,0x22,0x06,
-0x15,0x14,0x17,0x16,0x32,0x3e,0x01,0x14,0x07,0x06,0x22,0x27,0x26,0x34,0x37,0x36,
-0x32,0x17,0x01,0x3c,0x1c,0x1c,0x52,0x38,0x1c,0x1c,0x52,0x38,0x7a,0x3f,0x40,0xb8,
-0x3f,0x40,0x40,0x3f,0xb8,0x40,0xdc,0x28,0x1c,0x1d,0x38,0x29,0x2a,0x1c,0x1b,0x38,
-0x85,0xb8,0x40,0x40,0x40,0x40,0xb8,0x40,0x3f,0x3f,0xff,0xff,0x00,0x81,0xfe,0x90,
-0x07,0xef,0x03,0x20,0x10,0x27,0x0b,0xf5,0x02,0xbc,0x02,0x8a,0x10,0x27,0x0c,0x05,
-0x02,0xa9,0xfe,0x90,0x10,0x06,0x0b,0xfa,0x00,0x00,0xff,0xff,0xff,0xec,0xfe,0xf4,
-0x02,0x06,0x03,0xe8,0x10,0x26,0x0b,0xfb,0x00,0x00,0x10,0x27,0x0b,0xf5,0x00,0x63,
-0x03,0x52,0x10,0x07,0x0c,0x05,0x00,0x50,0xfe,0xf4,0xff,0xff,0xff,0xec,0xfe,0xf4,
-0x02,0x7e,0x03,0xe8,0x10,0x26,0x0b,0xfc,0x00,0x00,0x10,0x27,0x0b,0xf5,0x00,0x63,
-0x03,0x52,0x10,0x07,0x0c,0x05,0x00,0x50,0xfe,0xf4,0xff,0xff,0x00,0x81,0xff,0xec,
-0x07,0xef,0x03,0xb6,0x10,0x27,0x0b,0xf7,0x02,0xbc,0x03,0x20,0x10,0x06,0x0b,0xfa,
-0x00,0x00,0xff,0xff,0xff,0xec,0x00,0x00,0x01,0xf3,0x04,0xe2,0x10,0x26,0x0b,0xfb,
-0x00,0x00,0x10,0x07,0x0b,0xf7,0x00,0x63,0x04,0x4c,0xff,0xff,0xff,0xec,0x00,0x00,
-0x02,0x7e,0x04,0xe2,0x10,0x26,0x0b,0xfc,0x00,0x00,0x10,0x07,0x0b,0xf7,0x00,0x63,
-0x04,0x4c,0xff,0xff,0x00,0x9d,0xfe,0x0b,0x05,0x3e,0x05,0xaf,0x10,0x26,0x0b,0x8b,
-0x00,0x00,0x10,0x07,0x05,0x08,0x00,0x8a,0xff,0x38,0xff,0xff,0xff,0xec,0x00,0x00,
-0x04,0x5c,0x05,0x4b,0x10,0x26,0x0b,0x8c,0x00,0x00,0x10,0x07,0x05,0x08,0x00,0x58,
-0xfe,0xd4,0xff,0xff,0xff,0xec,0x00,0x00,0x05,0x3e,0x05,0x4b,0x10,0x26,0x0b,0x8d,
-0x00,0x00,0x10,0x07,0x05,0x08,0x00,0x58,0xfe,0xd4,0xff,0xff,0x00,0x9d,0xfe,0x0b,
-0x05,0x3e,0x05,0xaa,0x10,0x26,0x0b,0x8b,0x00,0x00,0x10,0x07,0x0b,0xf8,0x02,0x3f,
-0x05,0x14,0xff,0xff,0xff,0xec,0x00,0x00,0x04,0x5c,0x05,0x46,0x10,0x26,0x0b,0x8c,
-0x00,0x00,0x10,0x07,0x0b,0xf8,0x02,0x0d,0x04,0xb0,0xff,0xff,0xff,0xec,0x00,0x00,
-0x05,0x3e,0x05,0x46,0x10,0x26,0x0b,0x8d,0x00,0x00,0x10,0x07,0x0b,0xf8,0x02,0x0d,
-0x04,0xb0,0xff,0xff,0x00,0x9d,0xfe,0x0b,0x05,0x3e,0x05,0xaa,0x10,0x26,0x0b,0x8b,
-0x00,0x00,0x10,0x07,0x0b,0xf6,0x01,0xc2,0x04,0x1a,0xff,0xff,0xff,0xec,0x00,0x00,
-0x04,0x5c,0x05,0x46,0x10,0x26,0x0b,0x8c,0x00,0x00,0x10,0x07,0x0b,0xf6,0x01,0x90,
-0x03,0xb6,0xff,0xff,0xff,0xec,0x00,0x00,0x05,0x3e,0x05,0x46,0x10,0x26,0x0b,0x8d,
-0x00,0x00,0x10,0x07,0x0b,0xf6,0x01,0x90,0x03,0xb6,0xff,0xff,0x00,0x9d,0xfe,0x0b,
-0x05,0x3e,0x04,0xb0,0x10,0x26,0x0b,0x8b,0x00,0x00,0x10,0x27,0x0b,0xf4,0x02,0x3f,
-0x04,0x1a,0x10,0x07,0x0b,0xf7,0x01,0xe7,0x00,0x19,0xff,0xff,0xff,0xec,0xfe,0x3e,
-0x04,0x5c,0x04,0x4c,0x10,0x26,0x0b,0x8c,0x00,0x00,0x10,0x27,0x0b,0xf7,0x01,0x90,
-0xff,0x38,0x10,0x07,0x0b,0xf4,0x02,0x0d,0x03,0xb6,0xff,0xff,0xff,0xec,0xfe,0x3e,
-0x05,0x3e,0x04,0x4c,0x10,0x26,0x0b,0x8d,0x00,0x00,0x10,0x27,0x0b,0xf7,0x01,0x9c,
-0xff,0x38,0x10,0x07,0x0b,0xf4,0x02,0x0d,0x03,0xb6,0x00,0x01,0x00,0x00,0x05,0x33,
-0x03,0x5f,0x07,0x2b,0x00,0x03,0x00,0x00,0x09,0x01,0x35,0x01,0x03,0x5f,0xfc,0xa1,
-0x03,0x5f,0x06,0x95,0xfe,0x9e,0x96,0x01,0x62,0x00,0x00,0x01,0x00,0xc9,0xfe,0x56,
-0x05,0x19,0x05,0xf0,0x00,0x1c,0x00,0x00,0x01,0x10,0x21,0x22,0x06,0x15,0x11,0x23,
-0x11,0x33,0x15,0x36,0x37,0x36,0x33,0x32,0x12,0x19,0x01,0x14,0x07,0x06,0x2b,0x01,
-0x35,0x33,0x32,0x36,0x35,0x04,0x50,0xfe,0xcd,0xb3,0xd7,0xca,0xca,0x4e,0x69,0x6a,
-0x99,0xe3,0xe9,0x51,0x52,0xb5,0x57,0x31,0x66,0x4f,0x03,0x7f,0x01,0xac,0xff,0xde,
-0xfc,0xb2,0x05,0xd5,0xf1,0x86,0x43,0x43,0xfe,0xc1,0xfe,0xcc,0xfc,0x6f,0xd5,0x61,
-0x60,0x9c,0x5a,0xa0,0x00,0x01,0x00,0x74,0x00,0x00,0x02,0x85,0x04,0x60,0x00,0x0b,
-0x00,0x00,0x13,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x11,0x23,0x11,0x74,0xb4,
-0xb8,0xa4,0xa4,0xb8,0x01,0xc4,0xa4,0x01,0xf8,0xfe,0x08,0xa4,0xfe,0x3c,0x01,0xc4,
-0x00,0x02,0xfe,0xf2,0xfe,0x56,0x02,0x2e,0x04,0x60,0x00,0x0e,0x00,0x17,0x00,0x00,
-0x13,0x20,0x35,0x34,0x21,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x06,0x07,0x06,0x03,
-0x23,0x22,0x17,0x16,0x33,0x32,0x37,0x36,0x21,0xfe,0xd1,0x01,0x0e,0xc1,0xb8,0xb5,
-0xbf,0x12,0x35,0x52,0x20,0xb5,0x77,0x03,0x04,0x7b,0x69,0x26,0x12,0xfe,0x56,0xdd,
-0xcd,0x04,0x60,0xfb,0xa0,0x9b,0x70,0x3f,0x60,0x01,0x10,0x33,0x41,0x30,0x17,0x00,
-0xff,0xff,0x01,0x92,0x06,0x63,0x03,0xe8,0x08,0x33,0x10,0x27,0x0b,0xe9,0x04,0xbc,
-0x01,0x55,0x10,0x07,0x00,0x71,0x00,0xbd,0x02,0x3d,0xff,0xff,0x01,0x92,0x06,0x61,
-0x03,0xe8,0x08,0x34,0x10,0x27,0x0b,0xe9,0x04,0xbc,0x02,0x5b,0x10,0x07,0x00,0x71,
-0x00,0xbd,0x00,0xff,0xff,0xff,0x01,0x92,0x06,0x5e,0x03,0xe8,0x08,0x33,0x10,0x27,
-0x00,0x71,0x00,0xbd,0x02,0x3d,0x10,0x07,0x0b,0xf1,0x04,0xbc,0x01,0x50,0xff,0xff,
-0x01,0x93,0x06,0x63,0x03,0xe5,0x08,0x5a,0x10,0x27,0x0b,0xe9,0x04,0xbc,0x01,0x55,
-0x10,0x07,0x0b,0xea,0x04,0xf0,0x02,0x64,0xff,0xff,0x01,0x93,0x06,0x63,0x03,0xe5,
-0x08,0x5a,0x10,0x27,0x0b,0xe9,0x04,0xbc,0x01,0x55,0x10,0x07,0x0b,0xec,0x04,0x8c,
-0x02,0x64,0xff,0xff,0x01,0x92,0x06,0x61,0x03,0xe8,0x08,0x5a,0x10,0x27,0x00,0x71,
-0x00,0xbd,0x00,0xff,0x10,0x07,0x0b,0xea,0x04,0xf0,0x02,0x64,0xff,0xff,0x01,0x92,
-0x06,0x61,0x03,0xe8,0x08,0x5a,0x10,0x27,0x00,0x71,0x00,0xbd,0x00,0xff,0x10,0x07,
-0x0b,0xec,0x04,0x8c,0x02,0x64,0xff,0xff,0x01,0x76,0x06,0x6a,0x04,0x0a,0x08,0x33,
-0x10,0x27,0x00,0x71,0x00,0xbd,0x02,0x3d,0x10,0x07,0x0b,0xeb,0x04,0xc0,0x01,0x5c,
-0xff,0xff,0x01,0x8b,0x06,0x63,0x03,0xed,0x08,0x5a,0x10,0x27,0x0b,0xe9,0x04,0xbc,
-0x01,0x55,0x10,0x07,0x0b,0xee,0x04,0xbc,0x02,0x62,0xff,0xff,0x01,0x76,0x06,0x6a,
-0x04,0x0a,0x08,0x56,0x10,0x27,0x0b,0xeb,0x04,0xc0,0x01,0x5c,0x10,0x07,0x0b,0xe9,
-0x04,0xbc,0x02,0x7d,0xff,0xff,0x01,0x8b,0x06,0x63,0x03,0xed,0x08,0x57,0x10,0x27,
-0x0b,0xf1,0x04,0xbc,0x02,0x7c,0x10,0x07,0x0b,0xee,0x04,0xbc,0x01,0x75,0xff,0xff,
-0x01,0x76,0x06,0x6a,0x04,0x30,0x08,0x5a,0x10,0x27,0x0b,0xeb,0x04,0xc0,0x01,0x5c,
-0x10,0x07,0x0b,0xea,0x05,0x40,0x02,0x64,0xff,0xff,0x01,0x8b,0x06,0x63,0x05,0x18,
-0x08,0x3a,0x10,0x27,0x0b,0xea,0x06,0x28,0x02,0x44,0x10,0x07,0x0b,0xed,0x04,0xbc,
-0x01,0x75,0xff,0xff,0x00,0x5c,0x06,0x63,0x03,0xed,0x08,0x3a,0x10,0x27,0x0b,0xed,
-0x04,0xbc,0x01,0x75,0x10,0x07,0x0b,0xec,0x03,0x50,0x02,0x44,0xff,0xff,0x01,0x76,
-0x06,0x63,0x04,0x0a,0x08,0x59,0x10,0x27,0x0b,0xeb,0x04,0xc0,0x02,0x70,0x10,0x07,
-0x0b,0xed,0x04,0xbc,0x01,0x75,0xff,0xff,0x01,0x76,0x06,0x56,0x04,0x0a,0x08,0x59,
-0x10,0x27,0x0b,0xeb,0x04,0xc0,0x02,0x70,0x10,0x07,0x0b,0xf0,0x04,0xbc,0x01,0x50,
-0xff,0xff,0x01,0x83,0x06,0x56,0x03,0xf5,0x08,0x5a,0x10,0x27,0x0b,0xea,0x04,0xf0,
-0x02,0x64,0x10,0x07,0x0b,0xf0,0x04,0xbc,0x01,0x50,0xff,0xff,0x01,0x83,0x06,0x56,
-0x03,0xf5,0x08,0x5a,0x10,0x27,0x0b,0xec,0x04,0x8c,0x02,0x64,0x10,0x07,0x0b,0xf0,
-0x04,0xbc,0x01,0x50,0xff,0xff,0x01,0x83,0x06,0x56,0x03,0xf5,0x08,0x8b,0x10,0x27,
-0x0b,0xf0,0x04,0xbc,0x01,0x50,0x10,0x07,0x02,0xac,0x04,0xc3,0x02,0x10,0xff,0xff,
-0x01,0x8b,0x06,0x63,0x05,0x07,0x08,0x5b,0x10,0x27,0x0b,0xed,0x04,0xbc,0x01,0x75,
-0x10,0x07,0x02,0xac,0x06,0x10,0x01,0xe0,0xff,0xff,0xfc,0x9c,0x04,0xee,0xff,0x50,
-0x06,0x6a,0x10,0x27,0x02,0xaa,0xfe,0xf8,0x00,0x5a,0x10,0x06,0x02,0xa4,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x80,0x00,0x05,0xde,0xc5,0x71,
-0x5f,0x0f,0x3c,0xf5,0x00,0x1f,0x08,0x00,0x00,0x00,0x00,0x00,0xc0,0x71,0x79,0xf6,
-0x00,0x00,0x00,0x00,0xc0,0x71,0x79,0xf6,0xf7,0xd6,0xfc,0xeb,0x0d,0x72,0x08,0xe9,
-0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,
-0x07,0x6d,0xfe,0x1d,0x00,0x00,0x0d,0xe2,0xf7,0xd6,0xfc,0x6d,0x0d,0x72,0x00,0x01,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x31,
-0x04,0xcd,0x00,0x66,0x00,0x00,0x00,0x00,0x02,0xaa,0x00,0x00,0x02,0x8b,0x00,0x00,
-0x03,0x35,0x01,0x35,0x03,0xae,0x00,0xc5,0x06,0xb4,0x00,0x9e,0x05,0x17,0x00,0xaa,
-0x07,0x9a,0x00,0x71,0x06,0x3d,0x00,0x81,0x02,0x33,0x00,0xc5,0x03,0x1f,0x00,0xb0,
-0x03,0x1f,0x00,0xa4,0x04,0x00,0x00,0x3d,0x06,0xb4,0x00,0xd9,0x02,0x8b,0x00,0x9e,
-0x02,0xe3,0x00,0x64,0x02,0x8b,0x00,0xdb,0x02,0xb2,0x00,0x00,0x05,0x17,0x00,0x87,
-0x05,0x17,0x00,0xe1,0x05,0x17,0x00,0x96,0x05,0x17,0x00,0x9c,0x05,0x17,0x00,0x64,
-0x05,0x17,0x00,0x9e,0x05,0x17,0x00,0x8f,0x05,0x17,0x00,0xa8,0x05,0x17,0x00,0x8b,
-0x05,0x17,0x00,0x81,0x02,0xb2,0x00,0xf0,0x02,0xb2,0x00,0x9e,0x06,0xb4,0x00,0xd9,
-0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xd9,0x04,0x3f,0x00,0x93,0x08,0x00,0x00,0x87,
-0x05,0x79,0x00,0x10,0x05,0x7d,0x00,0xc9,0x05,0x96,0x00,0x73,0x06,0x29,0x00,0xc9,
-0x05,0x0e,0x00,0xc9,0x04,0x9a,0x00,0xc9,0x06,0x33,0x00,0x73,0x06,0x04,0x00,0xc9,
-0x02,0x5c,0x00,0xc9,0x02,0x5c,0xff,0x96,0x05,0x3f,0x00,0xc9,0x04,0x75,0x00,0xc9,
-0x06,0xe7,0x00,0xc9,0x05,0xfc,0x00,0xc9,0x06,0x4c,0x00,0x73,0x04,0xd3,0x00,0xc9,
-0x06,0x4c,0x00,0x73,0x05,0x8f,0x00,0xc9,0x05,0x14,0x00,0x87,0x04,0xe3,0xff,0xfa,
-0x05,0xdb,0x00,0xb2,0x05,0x79,0x00,0x10,0x07,0xe9,0x00,0x44,0x05,0x7b,0x00,0x3d,
-0x04,0xe3,0xff,0xfc,0x05,0x7b,0x00,0x5c,0x03,0x1f,0x00,0xb0,0x02,0xb2,0x00,0x00,
-0x03,0x1f,0x00,0xc7,0x06,0xb4,0x00,0xd9,0x04,0x00,0xff,0xec,0x04,0x00,0x00,0xaa,
-0x04,0xe7,0x00,0x7b,0x05,0x14,0x00,0xba,0x04,0x66,0x00,0x71,0x05,0x14,0x00,0x71,
-0x04,0xec,0x00,0x71,0x02,0xd1,0x00,0x2f,0x05,0x14,0x00,0x71,0x05,0x12,0x00,0xba,
-0x02,0x39,0x00,0xc1,0x02,0x39,0xff,0xdb,0x04,0xa2,0x00,0xba,0x02,0x39,0x00,0xc1,
-0x07,0xcb,0x00,0xba,0x05,0x12,0x00,0xba,0x04,0xe5,0x00,0x71,0x05,0x14,0x00,0xba,
-0x05,0x14,0x00,0x71,0x03,0x4a,0x00,0xba,0x04,0x2b,0x00,0x6f,0x03,0x23,0x00,0x37,
-0x05,0x12,0x00,0xae,0x04,0xbc,0x00,0x3d,0x06,0x8b,0x00,0x56,0x04,0xbc,0x00,0x3b,
-0x04,0xbc,0x00,0x3d,0x04,0x33,0x00,0x58,0x05,0x17,0x01,0x00,0x02,0xb2,0x01,0x04,
-0x05,0x17,0x01,0x00,0x06,0xb4,0x00,0xd9,0x05,0x17,0x00,0x00,0x03,0x35,0x01,0x35,
-0x05,0x17,0x00,0xac,0x05,0x17,0x00,0x81,0x05,0x17,0x00,0x5e,0x05,0x17,0x00,0x52,
-0x02,0xb2,0x01,0x04,0x04,0x00,0x00,0x5c,0x04,0x00,0x00,0xd7,0x08,0x00,0x01,0x1b,
-0x03,0xc5,0x00,0x73,0x04,0xe5,0x00,0x9e,0x06,0xb4,0x00,0xd9,0x02,0xe3,0x00,0x64,
-0x08,0x00,0x01,0x1b,0x04,0x00,0x00,0xd5,0x04,0x00,0x00,0xc3,0x06,0xb4,0x00,0xd9,
-0x03,0x35,0x00,0x5e,0x03,0x35,0x00,0x62,0x04,0x00,0x01,0x73,0x05,0x17,0x00,0xae,
-0x05,0x17,0x00,0x9e,0x02,0x8b,0x00,0xdb,0x04,0x00,0x01,0x23,0x03,0x35,0x00,0x89,
-0x03,0xc5,0x00,0x60,0x04,0xe5,0x00,0xc1,0x07,0xc1,0x00,0x89,0x07,0xc1,0x00,0x89,
-0x07,0xc1,0x00,0x62,0x04,0x3f,0x00,0x8f,0x05,0x79,0x00,0x10,0x05,0x79,0x00,0x10,
-0x05,0x79,0x00,0x10,0x05,0x79,0x00,0x10,0x05,0x79,0x00,0x10,0x05,0x79,0x00,0x10,
-0x07,0xcb,0x00,0x08,0x05,0x96,0x00,0x73,0x05,0x0e,0x00,0xc9,0x05,0x0e,0x00,0xc9,
-0x05,0x0e,0x00,0xc9,0x05,0x0e,0x00,0xc9,0x02,0x5c,0x00,0x3b,0x02,0x5c,0x00,0xa2,
-0x02,0x5c,0xff,0xfe,0x02,0x5c,0x00,0x06,0x06,0x33,0x00,0x0a,0x05,0xfc,0x00,0xc9,
-0x06,0x4c,0x00,0x73,0x06,0x4c,0x00,0x73,0x06,0x4c,0x00,0x73,0x06,0x4c,0x00,0x73,
-0x06,0x4c,0x00,0x73,0x06,0xb4,0x01,0x19,0x06,0x4c,0x00,0x66,0x05,0xdb,0x00,0xb2,
-0x05,0xdb,0x00,0xb2,0x05,0xdb,0x00,0xb2,0x05,0xdb,0x00,0xb2,0x04,0xe3,0xff,0xfc,
-0x04,0xd7,0x00,0xc9,0x05,0x0a,0x00,0xba,0x04,0xe7,0x00,0x7b,0x04,0xe7,0x00,0x7b,
-0x04,0xe7,0x00,0x7b,0x04,0xe7,0x00,0x7b,0x04,0xe7,0x00,0x7b,0x04,0xe7,0x00,0x7b,
-0x07,0xdb,0x00,0x7b,0x04,0x66,0x00,0x71,0x04,0xec,0x00,0x71,0x04,0xec,0x00,0x71,
-0x04,0xec,0x00,0x71,0x04,0xec,0x00,0x71,0x02,0x39,0xff,0xc7,0x02,0x39,0x00,0x90,
-0x02,0x39,0xff,0xde,0x02,0x39,0xff,0xf4,0x04,0xe5,0x00,0x71,0x05,0x12,0x00,0xba,
-0x04,0xe5,0x00,0x71,0x04,0xe5,0x00,0x71,0x04,0xe5,0x00,0x71,0x04,0xe5,0x00,0x71,
-0x04,0xe5,0x00,0x71,0x06,0xb4,0x00,0xd9,0x04,0xe5,0x00,0x48,0x05,0x12,0x00,0xae,
-0x05,0x12,0x00,0xae,0x05,0x12,0x00,0xae,0x05,0x12,0x00,0xae,0x04,0xbc,0x00,0x3d,
-0x05,0x14,0x00,0xba,0x04,0xbc,0x00,0x3d,0x05,0x79,0x00,0x10,0x04,0xe7,0x00,0x7b,
-0x05,0x79,0x00,0x10,0x04,0xe7,0x00,0x7b,0x05,0x79,0x00,0x10,0x04,0xe7,0x00,0x7b,
-0x05,0x96,0x00,0x73,0x04,0x66,0x00,0x71,0x05,0x96,0x00,0x73,0x04,0x66,0x00,0x71,
-0x05,0x96,0x00,0x73,0x04,0x66,0x00,0x71,0x05,0x96,0x00,0x73,0x04,0x66,0x00,0x71,
-0x06,0x29,0x00,0xc9,0x05,0x14,0x00,0x71,0x06,0x33,0x00,0x0a,0x05,0x14,0x00,0x71,
-0x05,0x0e,0x00,0xc9,0x04,0xec,0x00,0x71,0x05,0x0e,0x00,0xc9,0x04,0xec,0x00,0x71,
-0x05,0x0e,0x00,0xc9,0x04,0xec,0x00,0x71,0x05,0x0e,0x00,0xc9,0x04,0xec,0x00,0x71,
-0x05,0x0e,0x00,0xc9,0x04,0xec,0x00,0x71,0x06,0x33,0x00,0x73,0x05,0x14,0x00,0x71,
-0x06,0x33,0x00,0x73,0x05,0x14,0x00,0x71,0x06,0x33,0x00,0x73,0x05,0x14,0x00,0x71,
-0x06,0x33,0x00,0x73,0x05,0x14,0x00,0x71,0x06,0x04,0x00,0xc9,0x05,0x12,0xff,0xe5,
-0x07,0x54,0x00,0xc9,0x05,0x8f,0x00,0x78,0x02,0x5c,0xff,0xe4,0x02,0x39,0xff,0xd3,
-0x02,0x5c,0x00,0x03,0x02,0x39,0xff,0xf2,0x02,0x5c,0xff,0xf5,0x02,0x39,0xff,0xe4,
-0x02,0x5c,0x00,0xb0,0x02,0x39,0x00,0x96,0x02,0x5c,0x00,0xc9,0x02,0x39,0x00,0xc1,
-0x04,0xb8,0x00,0xc9,0x04,0x72,0x00,0xc1,0x02,0x5c,0xff,0x96,0x02,0x39,0xff,0xdb,
-0x05,0x3f,0x00,0xc9,0x04,0xa2,0x00,0xba,0x04,0xa2,0x00,0xba,0x04,0x75,0x00,0xc9,
-0x02,0x58,0x00,0xc1,0x04,0x75,0x00,0xc9,0x02,0x39,0x00,0x88,0x04,0x75,0x00,0xc9,
-0x03,0x00,0x00,0xc1,0x04,0x75,0x00,0xc9,0x02,0xbc,0x00,0xc1,0x04,0x7f,0xff,0xf2,
-0x02,0x46,0x00,0x02,0x05,0xfc,0x00,0xc9,0x05,0x12,0x00,0xba,0x05,0xfc,0x00,0xc9,
-0x05,0x12,0x00,0xba,0x05,0xfc,0x00,0xc9,0x05,0x12,0x00,0xba,0x06,0x82,0x00,0xcd,
-0x05,0xfc,0x00,0xd5,0x05,0x12,0x00,0xba,0x06,0x4c,0x00,0x73,0x04,0xe5,0x00,0x71,
-0x06,0x4c,0x00,0x73,0x04,0xe5,0x00,0x71,0x06,0x4c,0x00,0x73,0x04,0xe5,0x00,0x71,
-0x08,0x8f,0x00,0x73,0x08,0x2f,0x00,0x71,0x05,0x8f,0x00,0xc9,0x03,0x4a,0x00,0xba,
-0x05,0x8f,0x00,0xc9,0x03,0x4a,0x00,0x82,0x05,0x8f,0x00,0xc9,0x03,0x4a,0x00,0xba,
-0x05,0x14,0x00,0x87,0x04,0x2b,0x00,0x6f,0x05,0x14,0x00,0x87,0x04,0x2b,0x00,0x6f,
-0x05,0x14,0x00,0x87,0x04,0x2b,0x00,0x6f,0x05,0x14,0x00,0x87,0x04,0x2b,0x00,0x6f,
-0x04,0xe3,0xff,0xfa,0x03,0x23,0x00,0x37,0x04,0xe3,0xff,0xfa,0x03,0x23,0x00,0x37,
-0x04,0xe3,0xff,0xfa,0x03,0x23,0x00,0x37,0x05,0xdb,0x00,0xb2,0x05,0x12,0x00,0xae,
-0x05,0xdb,0x00,0xb2,0x05,0x12,0x00,0xae,0x05,0xdb,0x00,0xb2,0x05,0x12,0x00,0xae,
-0x05,0xdb,0x00,0xb2,0x05,0x12,0x00,0xae,0x05,0xdb,0x00,0xb2,0x05,0x12,0x00,0xae,
-0x05,0xdb,0x00,0xb2,0x05,0x12,0x00,0xae,0x07,0xe9,0x00,0x44,0x06,0x8b,0x00,0x56,
-0x04,0xe3,0xff,0xfc,0x04,0xbc,0x00,0x3d,0x04,0xe3,0xff,0xfc,0x05,0x7b,0x00,0x5c,
-0x04,0x33,0x00,0x58,0x05,0x7b,0x00,0x5c,0x04,0x33,0x00,0x58,0x05,0x7b,0x00,0x5c,
-0x04,0x33,0x00,0x58,0x02,0xd1,0x00,0x2f,0x05,0x14,0x00,0x20,0x05,0xe1,0xff,0x97,
-0x05,0x7d,0x00,0xc9,0x05,0x14,0x00,0xba,0x05,0x7d,0x00,0x00,0x05,0x14,0x00,0x00,
-0x05,0x96,0x00,0x73,0x05,0x96,0x00,0x73,0x04,0x66,0x00,0x71,0x06,0x33,0x00,0x0a,
-0x06,0x97,0xff,0x97,0x05,0x7d,0x00,0xc9,0x05,0x14,0x00,0x71,0x04,0xe5,0x00,0x71,
-0x05,0x0e,0x00,0xc9,0x06,0x4c,0x00,0x73,0x05,0x17,0x00,0x9c,0x04,0x9a,0xff,0x96,
-0x02,0xd1,0xff,0x7f,0x06,0x33,0x00,0x73,0x05,0x7b,0x00,0x81,0x07,0xb4,0x00,0xba,
-0x02,0xd4,0x00,0xc9,0x02,0x5c,0x00,0x0a,0x05,0x85,0x00,0xc9,0x04,0xa2,0x00,0xb9,
-0x02,0x39,0x00,0x0a,0x04,0xbc,0x00,0x3d,0x07,0xcb,0x00,0xb2,0x05,0xfc,0xff,0x96,
-0x05,0x12,0x00,0xba,0x06,0x4c,0x00,0x73,0x06,0x4c,0x00,0x67,0x04,0xe5,0x00,0x76,
-0x07,0x82,0x00,0x73,0x05,0xe5,0x00,0x71,0x05,0x37,0xff,0x97,0x05,0x14,0x00,0xb9,
-0x04,0xd7,0x00,0xc9,0x05,0x14,0x00,0x45,0x04,0x2b,0x00,0x47,0x05,0x0e,0x00,0xc9,
-0x02,0xb0,0xfe,0xf2,0x03,0x23,0x00,0x37,0x04,0xe3,0x00,0x18,0x03,0x23,0x00,0x37,
-0x04,0xe3,0xff,0xfa,0x05,0xdb,0x00,0xad,0x05,0x12,0x00,0xb0,0x06,0x1d,0x00,0x4e,
-0x05,0xc4,0x00,0xc9,0x05,0x91,0xff,0xfc,0x06,0x70,0x00,0x3d,0x05,0x7b,0x00,0x5c,
-0x04,0x33,0x00,0x58,0x05,0x54,0x00,0xa0,0x05,0x54,0x00,0x5c,0x04,0x9f,0x00,0x68,
-0x04,0x33,0x00,0x71,0x05,0x17,0x00,0x96,0x05,0x54,0x00,0x5d,0x04,0x9f,0x00,0x68,
-0x04,0x15,0x00,0x58,0x05,0x14,0x00,0xba,0x02,0x5c,0x00,0xc9,0x03,0xf0,0x00,0xc9,
-0x03,0xac,0x00,0x14,0x02,0x5d,0x00,0xc9,0x0b,0x60,0x00,0xc9,0x0a,0x64,0x00,0xc9,
-0x09,0x3c,0x00,0x71,0x06,0xaf,0x00,0xc9,0x06,0x4b,0x00,0xc9,0x03,0xa7,0x00,0xc1,
-0x07,0x73,0x00,0xc9,0x07,0x64,0x00,0xc9,0x06,0x61,0x00,0xba,0x05,0x79,0x00,0x10,
-0x04,0xe7,0x00,0x7b,0x02,0x5c,0xff,0xfe,0x02,0x39,0xff,0xe0,0x06,0x4c,0x00,0x73,
-0x04,0xe5,0x00,0x71,0x05,0xdb,0x00,0xb2,0x05,0x12,0x00,0xae,0x05,0xdb,0x00,0xb2,
-0x05,0x12,0x00,0xae,0x05,0xdb,0x00,0xb2,0x05,0x12,0x00,0xae,0x05,0xdb,0x00,0xb2,
-0x05,0x12,0x00,0xae,0x05,0xdb,0x00,0xb2,0x05,0x12,0x00,0xae,0x04,0xec,0x00,0x71,
-0x05,0x79,0x00,0x10,0x04,0xe7,0x00,0x7b,0x05,0x79,0x00,0x10,0x04,0xe7,0x00,0x7b,
-0x07,0xcb,0x00,0x08,0x07,0xdb,0x00,0x7b,0x06,0x33,0x00,0x73,0x05,0x14,0x00,0x71,
-0x06,0x33,0x00,0x73,0x05,0x14,0x00,0x71,0x05,0x3f,0x00,0x07,0x04,0xa2,0xff,0xe9,
-0x06,0x4c,0x00,0x73,0x04,0xe5,0x00,0x71,0x06,0x4c,0x00,0x73,0x04,0xe5,0x00,0x71,
-0x05,0x54,0x00,0xa0,0x04,0x9f,0x00,0x58,0x02,0x39,0xff,0xdb,0x0b,0x60,0x00,0xc9,
-0x0a,0x64,0x00,0xc9,0x09,0x3c,0x00,0x71,0x06,0x33,0x00,0x73,0x05,0x14,0x00,0x71,
-0x08,0xe7,0x00,0xc9,0x05,0x75,0x00,0xc9,0x05,0xfc,0x00,0xc9,0x05,0x12,0x00,0xba,
-0x05,0x79,0x00,0x10,0x04,0xe7,0x00,0x7b,0x07,0xcb,0x00,0x08,0x07,0xdb,0x00,0x7b,
-0x06,0x4c,0x00,0x66,0x04,0xe5,0x00,0x48,0x05,0x79,0x00,0x10,0x04,0xe7,0x00,0x7b,
-0x05,0x79,0x00,0x10,0x04,0xe7,0x00,0x7b,0x05,0x0e,0x00,0xc9,0x04,0xec,0x00,0x71,
-0x05,0x0e,0x00,0xc9,0x04,0xec,0x00,0x71,0x02,0x5c,0xff,0xa7,0x02,0x39,0xff,0xc3,
-0x02,0x5c,0x00,0x05,0x02,0x39,0xff,0xe4,0x06,0x4c,0x00,0x73,0x04,0xe5,0x00,0x71,
-0x06,0x4c,0x00,0x73,0x04,0xe5,0x00,0x71,0x05,0x8f,0x00,0xc7,0x03,0x4a,0x00,0x82,
-0x05,0x8f,0x00,0xc9,0x03,0x4a,0x00,0xba,0x05,0xdb,0x00,0xb2,0x05,0x12,0x00,0xae,
-0x05,0xdb,0x00,0xb2,0x05,0x12,0x00,0xae,0x05,0x14,0x00,0x87,0x04,0x2b,0x00,0x6f,
-0x04,0xe3,0xff,0xfa,0x03,0x23,0x00,0x37,0x05,0x04,0x00,0x9c,0x04,0x2c,0x00,0x47,
-0x06,0x04,0x00,0xc9,0x05,0x12,0xff,0xf0,0x05,0xe2,0x00,0xc9,0x06,0xb4,0x00,0x71,
-0x05,0x96,0x00,0x71,0x04,0xe2,0x00,0x71,0x05,0x7b,0x00,0x5c,0x04,0x33,0x00,0x58,
-0x05,0x79,0x00,0x10,0x04,0xe7,0x00,0x7b,0x05,0x0e,0x00,0xc9,0x04,0xec,0x00,0x71,
-0x06,0x4c,0x00,0x73,0x04,0xe5,0x00,0x71,0x06,0x4c,0x00,0x73,0x04,0xe5,0x00,0x71,
-0x06,0x4c,0x00,0x73,0x04,0xe5,0x00,0x71,0x06,0x4c,0x00,0x73,0x04,0xe5,0x00,0x71,
-0x04,0xe3,0xff,0xfc,0x04,0xbc,0x00,0x3d,0x03,0xcc,0x00,0x8a,0x06,0xbe,0x00,0xba,
-0x03,0xd1,0x00,0x37,0x02,0x39,0xff,0xdb,0x07,0xfc,0x00,0x71,0x07,0xfc,0x00,0x71,
-0x05,0x79,0xff,0xfd,0x05,0x96,0x00,0x0b,0x04,0x66,0x00,0x09,0x04,0x75,0x00,0x0a,
-0x04,0xe3,0xff,0xb2,0x04,0x2b,0x00,0x6f,0x04,0x33,0x00,0x58,0x04,0x15,0x00,0x50,
-0x04,0xe7,0x00,0x7b,0x05,0x14,0x00,0x71,0x05,0x14,0x00,0x71,0x05,0x14,0x00,0xba,
-0x04,0x66,0x00,0x71,0x04,0x66,0x00,0x71,0x05,0x14,0x00,0x71,0x05,0xd1,0x00,0x71,
-0x04,0xec,0x00,0x71,0x04,0xec,0x00,0x71,0x06,0x5d,0x00,0x7c,0x04,0x53,0x00,0x85,
-0x04,0x53,0x00,0x85,0x06,0x1f,0x00,0x71,0x05,0x74,0x00,0x71,0x02,0x9c,0xff,0xdb,
-0x05,0x19,0x00,0x71,0x05,0x14,0x00,0x71,0x05,0x09,0x00,0x71,0x05,0x7b,0x00,0xce,
-0x04,0xbc,0x00,0x60,0x05,0x12,0x00,0xae,0x05,0x12,0x00,0xba,0x05,0x12,0x00,0xba,
-0x02,0xf9,0x00,0x74,0x03,0x19,0x00,0xc1,0x02,0xf9,0x00,0x74,0x03,0xe6,0x00,0xb0,
-0x03,0xe6,0x00,0x4c,0x02,0x3a,0x00,0xc1,0x05,0xa6,0x00,0xc1,0x07,0xcb,0x00,0xba,
-0x07,0xcb,0x00,0xba,0x07,0xcb,0x00,0xba,0x05,0x2b,0xff,0xdb,0x05,0x23,0x00,0xba,
-0x05,0x12,0x00,0xb3,0x04,0xe5,0x00,0x71,0x06,0xdd,0x00,0x71,0x05,0xd3,0x00,0x99,
-0x04,0xe5,0x00,0x71,0x03,0xc1,0x00,0x71,0x03,0xc1,0x00,0x71,0x03,0xc0,0x00,0x71,
-0x03,0xc1,0x00,0x71,0x03,0xc1,0x00,0x70,0x04,0x3e,0x00,0x74,0x04,0x3e,0x00,0x74,
-0x04,0xd0,0x00,0x32,0x04,0xd0,0x00,0x32,0x04,0x2b,0x00,0x6f,0x02,0xb0,0xff,0xdb,
-0x03,0x0c,0x00,0x37,0x03,0xb1,0x00,0x37,0x02,0xb0,0xfe,0xf2,0x03,0x23,0x00,0x37,
-0x03,0x23,0x00,0x37,0x05,0x12,0x00,0x00,0x04,0xf1,0x00,0x71,0x04,0xc9,0x00,0xc1,
-0x04,0xbc,0x00,0x3d,0x06,0x8b,0x00,0x56,0x04,0xbc,0x00,0x3d,0x04,0xe3,0x00,0x66,
-0x04,0x33,0x00,0x58,0x04,0x33,0x00,0x58,0x04,0x9f,0x00,0x58,0x04,0x9f,0x00,0x6d,
-0x04,0x15,0x00,0x58,0x04,0x15,0x00,0x58,0x04,0x15,0x00,0x58,0x04,0x15,0x00,0x58,
-0x04,0xd2,0x00,0x5e,0x04,0xa3,0x00,0xba,0x05,0x74,0x00,0x71,0x05,0xaa,0x00,0x71,
-0x05,0x49,0x00,0xc1,0x02,0xee,0xfe,0xf2,0x05,0x56,0x00,0xba,0x04,0xaa,0x00,0xb3,
-0x05,0xd1,0x00,0x71,0x04,0x15,0x00,0x58,0x04,0x15,0x00,0x58,0x08,0x1d,0x00,0x71,
-0x08,0x76,0x00,0x71,0x08,0x1a,0x00,0x71,0x06,0x98,0x00,0x37,0x04,0xe1,0x00,0x37,
-0x06,0x3a,0x00,0x37,0x06,0xc9,0x00,0x2f,0x05,0x20,0x00,0xc1,0x05,0x3c,0x00,0xc1,
-0x04,0x1f,0x00,0x36,0x04,0x1f,0x00,0x36,0x04,0x90,0x00,0x00,0x05,0x4f,0x00,0x00,
-0x03,0x31,0x00,0x75,0x03,0x31,0x00,0x75,0x01,0x66,0xff,0xe9,0x02,0x12,0x00,0x75,
-0x02,0x5d,0x00,0x47,0x02,0x5e,0x00,0x47,0x03,0x08,0x00,0x20,0x04,0x1f,0x00,0x36,
-0x02,0xfb,0x00,0x26,0x02,0x33,0x00,0xc5,0x03,0xae,0x00,0xc5,0x02,0x8b,0x00,0xae,
-0x02,0x8b,0x00,0xb2,0x02,0x8b,0x00,0xc4,0x02,0x75,0x00,0x75,0x02,0x75,0x00,0x75,
-0x02,0xf5,0x00,0x75,0x02,0xf5,0x00,0x75,0x04,0x00,0x01,0x0b,0x04,0x00,0x01,0x0b,
-0x04,0x00,0x00,0xc1,0x04,0x00,0x00,0xc1,0x04,0x00,0x00,0xc1,0x04,0x00,0x00,0xc1,
-0x02,0x33,0x00,0xd6,0x04,0x00,0x00,0xd5,0x04,0x00,0x01,0x73,0x04,0x00,0x00,0xaa,
-0x02,0x33,0x00,0xd6,0x04,0x00,0x00,0xd5,0x04,0x00,0x00,0xaa,0x04,0x00,0x01,0x73,
-0x02,0xb2,0x00,0x6f,0x02,0xb2,0x00,0x6f,0x02,0x75,0x00,0x75,0x02,0x75,0x00,0x75,
-0x04,0x00,0x01,0x1f,0x04,0x00,0x01,0x1f,0x03,0x4d,0x00,0xc1,0x04,0x00,0x01,0x1f,
-0x04,0x00,0x00,0xc7,0x04,0x00,0x01,0x9a,0x04,0x00,0x00,0xee,0x04,0x00,0x01,0x4c,
-0x04,0x00,0x00,0xb6,0x04,0x00,0x00,0xf0,0x02,0x86,0xff,0xff,0x04,0x00,0x00,0xef,
-0x03,0x68,0x00,0x75,0x01,0x54,0x00,0x75,0x02,0xfc,0x00,0x75,0x03,0x8d,0x00,0x75,
-0x02,0xf5,0x00,0x75,0x03,0xf2,0x00,0xd6,0x03,0xf2,0x00,0xd6,0x03,0xf2,0x00,0xd6,
-0x03,0xf2,0x00,0xd6,0x03,0xf2,0x00,0xd6,0x04,0x00,0x00,0xc1,0x04,0x00,0x00,0xd5,
-0x04,0x00,0x01,0x15,0x04,0x00,0x00,0xee,0x04,0x00,0x00,0xb6,0x00,0x00,0xfc,0xa8,
-0x00,0x00,0xfd,0x71,0x00,0x00,0xfc,0xbf,0x00,0x00,0xfc,0xb4,0x00,0x00,0xfc,0xd9,
-0x00,0x00,0xfb,0xec,0x00,0x00,0xfc,0xbf,0x00,0x00,0xfd,0xa4,0x00,0x00,0xfc,0xd5,
-0x00,0x00,0xfd,0x37,0x00,0x00,0xfc,0xec,0x00,0x00,0xfc,0xf4,0x00,0x00,0xfc,0xc5,
-0x00,0x00,0xfd,0xbc,0x00,0x00,0xfc,0xf0,0x00,0x00,0xfc,0x5d,0x00,0x00,0xfc,0xbf,
-0x00,0x00,0xfc,0xbf,0x00,0x00,0xfe,0x1f,0x00,0x00,0xfd,0x90,0x00,0x00,0xfd,0x90,
-0x00,0x00,0xff,0x79,0x00,0x00,0xfc,0xa8,0x00,0x00,0xfd,0x71,0x00,0x00,0xfd,0x0c,
-0x00,0x00,0xfd,0xbc,0x00,0x00,0xfe,0x55,0x00,0x00,0xff,0x04,0x00,0x00,0xfd,0x81,
-0x00,0x00,0xfd,0x0b,0x00,0x00,0xfd,0x0b,0x00,0x00,0xfd,0x0b,0x00,0x00,0xfd,0x0b,
-0x00,0x00,0xfd,0x7a,0x00,0x00,0xfd,0x77,0x00,0x00,0xfd,0x9a,0x00,0x00,0xfc,0xd5,
-0x00,0x00,0xfc,0xec,0x00,0x00,0xfd,0x6a,0x00,0x00,0xfd,0x23,0x00,0x00,0xfd,0x4c,
-0x00,0x00,0xfd,0xbc,0x00,0x00,0xfc,0xf0,0x00,0x00,0xfc,0x63,0x00,0x00,0xfc,0xc5,
-0x00,0x00,0xfc,0xbf,0x00,0x00,0xfc,0xbf,0x00,0x00,0xfc,0xbf,0x00,0x00,0xfc,0xb4,
-0x00,0x00,0xfc,0xd9,0x00,0x00,0xfb,0xec,0x00,0x00,0xfb,0xec,0x00,0x00,0xfb,0x8c,
-0x00,0x00,0xfd,0x78,0x00,0x00,0xfa,0xed,0x00,0x00,0xfb,0x68,0x00,0x00,0xfa,0x12,
-0x00,0x00,0xfd,0xf9,0x00,0x00,0xfc,0xf1,0x00,0x00,0xfc,0xf0,0x00,0x00,0xfc,0x63,
-0x00,0x00,0xfd,0x2b,0x00,0x00,0xfe,0x06,0x00,0x00,0xfb,0xec,0x00,0x00,0xfc,0xa8,
-0x00,0x00,0xfd,0x71,0x00,0x00,0xfc,0xb4,0x00,0x00,0xfd,0x85,0x00,0x00,0xfc,0xe7,
-0x00,0x00,0xfd,0xc6,0x00,0x00,0xfc,0xd5,0x00,0x00,0xfd,0x1f,0x00,0x00,0xfd,0x15,
-0x00,0x00,0xfd,0x1f,0x00,0x00,0xfc,0xb6,0x00,0x00,0xfc,0xb6,0x00,0x00,0xfc,0xb6,
-0x00,0x00,0xfc,0x63,0x00,0x00,0xfd,0x33,0x00,0x00,0xfd,0x78,0x00,0x00,0xfc,0xbf,
-0x00,0x00,0xfd,0x2b,0x00,0x00,0xfd,0x78,0x00,0x00,0xff,0x2e,0x00,0x00,0xfc,0x70,
-0x00,0x00,0xfc,0x70,0x00,0x00,0xfd,0x2a,0x00,0x00,0xfc,0x70,0x00,0x00,0xfc,0x77,
-0x02,0x3a,0x00,0xa0,0x02,0x3a,0x00,0xa0,0x04,0x00,0x01,0xb6,0x02,0xb2,0x00,0x9e,
-0x04,0x00,0x01,0x73,0x04,0x00,0x00,0xd7,0x05,0x8a,0x00,0x10,0x02,0x8b,0x00,0xdb,
-0x05,0xf8,0xff,0xe7,0x06,0xf8,0xff,0xf3,0x03,0x44,0xff,0xed,0x06,0x80,0xff,0xf2,
-0x06,0x99,0xff,0xe1,0x06,0x9b,0xff,0xdb,0x02,0xb5,0x00,0x05,0x05,0x79,0x00,0x10,
-0x05,0x7d,0x00,0xc9,0x04,0x75,0x00,0xc9,0x05,0x79,0x00,0x10,0x05,0x0e,0x00,0xc9,
-0x05,0x7b,0x00,0x5c,0x06,0x04,0x00,0xc9,0x06,0x4c,0x00,0x73,0x02,0x5c,0x00,0xc9,
-0x05,0x3f,0x00,0xc9,0x05,0x79,0x00,0x10,0x06,0xe7,0x00,0xc9,0x05,0xfc,0x00,0xc9,
-0x05,0x0e,0x00,0xc9,0x06,0x4c,0x00,0x73,0x06,0x04,0x00,0xc9,0x04,0xd3,0x00,0xc9,
-0x05,0x0e,0x00,0xc9,0x04,0xe3,0xff,0xfa,0x04,0xe3,0xff,0xfc,0x06,0x4c,0x00,0x73,
-0x05,0x7b,0x00,0x3d,0x06,0x4c,0x00,0x73,0x06,0x1d,0x00,0x4e,0x02,0x5c,0x00,0x06,
-0x04,0xe3,0xff,0xfc,0x05,0x46,0x00,0x71,0x04,0x63,0x00,0x85,0x05,0x3c,0x00,0xba,
-0x02,0xb5,0x00,0xa6,0x04,0xa1,0x00,0x95,0x05,0x46,0x00,0x71,0x05,0x1b,0x00,0xbf,
-0x04,0xbc,0x00,0x20,0x04,0xe5,0x00,0x71,0x04,0x53,0x00,0x85,0x04,0x5a,0x00,0x6a,
-0x05,0x12,0x00,0xba,0x04,0xe5,0x00,0x71,0x02,0xb5,0x00,0xa6,0x04,0xb7,0x00,0xbf,
-0x04,0xbc,0x00,0x3d,0x05,0x17,0x00,0xae,0x04,0x78,0x00,0x4a,0x04,0x76,0x00,0x6b,
-0x04,0xe5,0x00,0x71,0x04,0xd1,0x00,0x4a,0x05,0x14,0x00,0xba,0x04,0xb2,0x00,0x71,
-0x05,0x12,0x00,0x71,0x04,0xd1,0x00,0x64,0x04,0xa1,0x00,0x95,0x05,0x47,0x00,0x6f,
-0x04,0x9f,0x00,0x3b,0x05,0x47,0x00,0x70,0x06,0xb3,0x00,0x87,0x02,0xb5,0x00,0x05,
-0x04,0xa1,0x00,0x95,0x04,0xe5,0x00,0x71,0x04,0xa1,0x00,0x95,0x06,0xb3,0x00,0x87,
-0x04,0xea,0x00,0xa6,0x04,0xf4,0x00,0x6f,0x05,0x97,0x00,0x57,0x06,0xbd,0xff,0xe1,
-0x05,0x97,0x00,0x57,0x05,0x47,0x00,0x70,0x06,0xb3,0x00,0x41,0x05,0x4f,0x00,0x6f,
-0x06,0x4c,0x00,0x73,0x04,0xe5,0x00,0x71,0x05,0x30,0x00,0x8b,0x04,0xb2,0x00,0x71,
-0x04,0x9a,0x00,0xc9,0x03,0xab,0xff,0x40,0x05,0x47,0x00,0xb3,0x05,0x47,0x00,0xbf,
-0x06,0xec,0x00,0x72,0x05,0x05,0x00,0x77,0x07,0x78,0x00,0x73,0x06,0xb3,0x00,0x87,
-0x06,0x11,0x00,0x73,0x05,0x46,0x00,0x71,0x06,0x55,0x00,0xc9,0x04,0xeb,0x00,0x2d,
-0x05,0x7e,0x00,0x4f,0x04,0xdb,0x00,0x64,0x06,0x24,0x00,0x73,0x05,0x00,0x00,0x36,
-0x05,0x98,0x00,0x73,0x04,0xe5,0x00,0x71,0x04,0xe3,0x00,0x2c,0x04,0x4a,0x00,0x37,
-0x05,0x4f,0x00,0x6f,0x05,0x14,0x00,0xb7,0x04,0x66,0x00,0x71,0x02,0x39,0xff,0xdb,
-0x06,0x4c,0x00,0x73,0x04,0xec,0x00,0x71,0x04,0xec,0x00,0xc4,0x04,0xd7,0x00,0xc9,
-0x05,0x14,0x00,0xba,0x05,0x96,0x00,0x73,0x06,0xe7,0x00,0xc9,0x05,0x35,0x00,0x7f,
-0x05,0x14,0x00,0x55,0x05,0x96,0x00,0x79,0x05,0x96,0x00,0x73,0x05,0x96,0x00,0x79,
-0x05,0x0e,0x00,0xc9,0x05,0x0e,0x00,0xc9,0x06,0x4a,0xff,0xfa,0x04,0x75,0x00,0xc9,
-0x05,0x96,0x00,0x73,0x05,0x14,0x00,0x87,0x02,0x5c,0x00,0xc9,0x02,0x5c,0x00,0x06,
-0x02,0x5c,0xff,0x96,0x08,0xc0,0x00,0x36,0x08,0x5c,0x00,0xc9,0x06,0x4a,0xff,0xfa,
-0x05,0x3f,0x00,0xc9,0x05,0xfc,0x00,0xc9,0x04,0xe0,0x00,0x23,0x06,0x04,0x00,0xc9,
-0x05,0x79,0x00,0x10,0x05,0x7d,0x00,0xc9,0x05,0x7d,0x00,0xc9,0x04,0x75,0x00,0xc9,
-0x06,0x36,0x00,0x31,0x05,0x0e,0x00,0xc9,0x06,0xe8,0x00,0x3b,0x05,0x17,0x00,0x9c,
-0x05,0xfc,0x00,0xc9,0x05,0xfc,0x00,0xc9,0x05,0x3f,0x00,0xc9,0x06,0x04,0x00,0x36,
-0x06,0xe7,0x00,0xc9,0x06,0x04,0x00,0xc9,0x06,0x4c,0x00,0x73,0x06,0x04,0x00,0xc9,
-0x04,0xd3,0x00,0xc9,0x05,0x96,0x00,0x73,0x04,0xe3,0xff,0xfa,0x04,0xe0,0x00,0x23,
-0x06,0x4c,0x00,0x73,0x05,0x7b,0x00,0x3d,0x06,0x36,0x00,0xc9,0x05,0x7c,0x00,0xaf,
-0x08,0x06,0x00,0xc9,0x08,0x34,0x00,0xc9,0x06,0xa9,0x00,0x32,0x07,0x0f,0x00,0xc9,
-0x05,0x7d,0x00,0xc9,0x05,0x96,0x00,0x6f,0x08,0x3f,0x00,0xd3,0x05,0x8f,0x00,0x3b,
-0x04,0xe7,0x00,0x7b,0x04,0xe5,0x00,0x71,0x04,0xb0,0x00,0xba,0x03,0xee,0x00,0xba,
-0x05,0x60,0x00,0x32,0x04,0xec,0x00,0x71,0x05,0xde,0x00,0x32,0x04,0x53,0x00,0x85,
-0x05,0x41,0x00,0xc1,0x05,0x41,0x00,0xc1,0x04,0xd5,0x00,0xbf,0x05,0x1d,0x00,0x2e,
-0x06,0x09,0x00,0xc1,0x05,0x49,0x00,0xc1,0x04,0xe5,0x00,0x71,0x05,0x47,0x00,0xc1,
-0x05,0x14,0x00,0xba,0x04,0x66,0x00,0x71,0x04,0x3b,0x00,0x05,0x04,0xbc,0x00,0x3d,
-0x07,0x55,0x00,0x71,0x04,0xbc,0x00,0x3b,0x05,0x72,0x00,0xc1,0x04,0xba,0x00,0x96,
-0x06,0xfb,0x00,0xc1,0x07,0x24,0x00,0xc1,0x05,0xa0,0x00,0x2a,0x06,0x1f,0x00,0xc1,
-0x04,0xb7,0x00,0xc1,0x04,0x64,0x00,0x71,0x06,0x80,0x00,0xc1,0x04,0xd0,0x00,0x32,
-0x04,0xec,0x00,0x71,0x04,0xec,0x00,0x71,0x05,0x27,0x00,0x28,0x03,0xee,0x00,0xba,
-0x04,0x64,0x00,0x71,0x04,0x2b,0x00,0x6f,0x02,0x39,0x00,0xc1,0x02,0x39,0xff,0xf4,
-0x02,0x39,0xff,0xdb,0x07,0x30,0x00,0x2e,0x07,0x22,0x00,0xc1,0x05,0x19,0x00,0x28,
-0x04,0xd5,0x00,0xbf,0x05,0x41,0x00,0xc1,0x04,0xbc,0x00,0x3d,0x05,0x4c,0x00,0xc1,
-0x07,0x78,0x00,0x73,0x06,0xb3,0x00,0x87,0x05,0x7d,0x00,0x21,0x04,0xb7,0x00,0x3a,
-0x07,0x8a,0x00,0xd3,0x05,0xfe,0x00,0xc1,0x07,0x09,0x00,0x10,0x06,0x44,0x00,0x33,
-0x09,0x47,0x00,0xc9,0x08,0x03,0x00,0xc1,0x06,0x4c,0x00,0x73,0x04,0xe5,0x00,0x6b,
-0x08,0x37,0x00,0xc9,0x06,0x98,0x00,0xc1,0x05,0x17,0x00,0x73,0x04,0x53,0x00,0x5b,
-0x06,0x4c,0x00,0x73,0x05,0x47,0x00,0x70,0x06,0x4c,0x00,0x73,0x04,0xe5,0x00,0x71,
-0x06,0x40,0x00,0x10,0x05,0x52,0x00,0x32,0x06,0x40,0x00,0x10,0x05,0x52,0x00,0x32,
-0x05,0x96,0x00,0x71,0x04,0xe2,0x00,0x71,0x07,0xa0,0x00,0x73,0x06,0x11,0x00,0x71,
-0x07,0x78,0x00,0x73,0x06,0xb3,0x00,0x87,0x07,0x78,0x00,0x73,0x06,0xb3,0x00,0x87,
-0x05,0x96,0x00,0x73,0x04,0x66,0x00,0x71,0x04,0xc0,0x00,0x32,0x00,0x00,0xfb,0xda,
-0x00,0x00,0xfb,0xf7,0x00,0x00,0xfc,0x22,0x00,0x00,0xfc,0x22,0x03,0x58,0xf7,0xd6,
-0x03,0x58,0xf8,0x58,0x06,0x2e,0x00,0xc9,0x05,0x6a,0x00,0xc1,0x05,0x7d,0x00,0x21,
-0x04,0xb7,0x00,0x26,0x04,0xd3,0x00,0xc9,0x05,0x14,0x00,0xba,0x04,0x75,0x00,0xc9,
-0x03,0xee,0x00,0xba,0x04,0x75,0x00,0x47,0x03,0xee,0x00,0x38,0x04,0xfe,0x00,0xc9,
-0x04,0x3d,0x00,0xba,0x06,0xe8,0x00,0x3b,0x05,0xde,0x00,0x32,0x05,0x17,0x00,0x9c,
-0x04,0x53,0x00,0x85,0x05,0x3f,0x00,0xc9,0x04,0xd5,0x00,0xbf,0x05,0x3f,0x00,0xc9,
-0x04,0xd5,0x00,0xbf,0x05,0x3f,0x00,0x21,0x04,0xa2,0x00,0x3d,0x06,0x6b,0x00,0x32,
-0x05,0xbf,0x00,0x2a,0x06,0x04,0x00,0xc9,0x05,0x49,0x00,0xc1,0x08,0x1d,0x00,0xc9,
-0x07,0x04,0x00,0xc1,0x08,0xa6,0x00,0xc9,0x07,0x53,0x00,0xc1,0x06,0x5e,0x00,0x73,
-0x05,0x36,0x00,0x71,0x05,0x96,0x00,0x73,0x04,0x66,0x00,0x71,0x04,0xe3,0xff,0xfa,
-0x04,0x3b,0x00,0x05,0x04,0xe3,0xff,0xfc,0x04,0xbc,0x00,0x3d,0x04,0xe3,0xff,0xfc,
-0x04,0xbc,0x00,0x3d,0x05,0x7b,0x00,0x3d,0x04,0xbc,0x00,0x3b,0x07,0x79,0xff,0xfa,
-0x06,0x74,0x00,0x05,0x05,0x7c,0x00,0xaf,0x04,0xba,0x00,0x96,0x05,0x7c,0x00,0xaf,
-0x04,0xba,0x00,0x96,0x05,0x7c,0x00,0xaf,0x05,0x12,0x00,0xba,0x07,0x87,0x00,0x14,
-0x05,0xd3,0x00,0x0f,0x07,0x87,0x00,0x14,0x05,0xd3,0x00,0x0f,0x02,0x39,0x00,0xc1,
-0x06,0xe8,0x00,0x3b,0x05,0xde,0x00,0x32,0x05,0x3f,0x00,0xc9,0x04,0xd5,0x00,0xbf,
-0x06,0x35,0x00,0x36,0x05,0x5d,0x00,0x2e,0x06,0x04,0x00,0xc9,0x05,0x49,0x00,0xc1,
-0x06,0x36,0x00,0xc9,0x05,0x72,0x00,0xc1,0x05,0x7c,0x00,0xaf,0x04,0xba,0x00,0x96,
-0x07,0x1a,0x00,0xc9,0x06,0x32,0x00,0xc1,0x05,0x79,0x00,0x10,0x04,0xe7,0x00,0x7b,
-0x05,0x79,0x00,0x10,0x04,0xe7,0x00,0x7b,0x07,0xcb,0x00,0x08,0x07,0xdb,0x00,0x7b,
-0x05,0x0e,0x00,0xc9,0x04,0xec,0x00,0x71,0x06,0x4c,0x00,0x73,0x04,0xec,0x00,0x71,
-0x06,0x4c,0x00,0x73,0x04,0xec,0x00,0x71,0x06,0xe8,0x00,0x3b,0x05,0xde,0x00,0x32,
-0x05,0x17,0x00,0x9c,0x04,0x53,0x00,0x85,0x05,0x54,0x00,0xa0,0x04,0x9f,0x00,0x58,
-0x05,0xfc,0x00,0xc9,0x05,0x41,0x00,0xc1,0x05,0xfc,0x00,0xc9,0x05,0x41,0x00,0xc1,
-0x06,0x4c,0x00,0x73,0x04,0xe5,0x00,0x71,0x06,0x4c,0x00,0x73,0x04,0xe5,0x00,0x71,
-0x06,0x4c,0x00,0x73,0x04,0xe5,0x00,0x71,0x05,0x96,0x00,0x6f,0x04,0x64,0x00,0x71,
-0x04,0xe0,0x00,0x23,0x04,0xbc,0x00,0x3d,0x04,0xe0,0x00,0x23,0x04,0xbc,0x00,0x3d,
-0x04,0xe0,0x00,0x23,0x04,0xbc,0x00,0x3d,0x05,0x7c,0x00,0xaf,0x04,0xba,0x00,0x96,
-0x04,0x75,0x00,0xc9,0x03,0xee,0x00,0xba,0x07,0x0f,0x00,0xc9,0x06,0x1f,0x00,0xc1,
-0x05,0x7d,0x00,0x91,0x04,0xb7,0x00,0x71,0x08,0x0c,0x00,0x91,0x07,0x2d,0x00,0x71,
-0x07,0xcc,0x00,0xc9,0x06,0xf4,0x00,0xab,0x05,0x6e,0x00,0xc9,0x04,0xb5,0x00,0xab,
-0x08,0x93,0x00,0x36,0x07,0xa8,0x00,0x2e,0x08,0x94,0x00,0xc9,0x07,0xbd,0x00,0xc1,
-0x06,0x33,0x00,0x73,0x05,0x47,0x00,0x71,0x06,0x2f,0xff,0xfa,0x05,0xb0,0x00,0x05,
-0x06,0xef,0x00,0xb2,0x05,0xdb,0x00,0xb2,0x07,0x0f,0x00,0xb2,0x07,0x0f,0x00,0xb2,
-0x05,0xdb,0x00,0xb2,0x05,0x26,0x00,0x9b,0x05,0xdb,0x00,0xb2,0x05,0xdb,0x00,0xb2,
-0x06,0xce,0x00,0xb2,0x07,0x0f,0x00,0xb2,0x05,0xdb,0x00,0xb2,0x05,0x08,0x00,0xb2,
-0x06,0x97,0x00,0xb2,0x07,0xe4,0x00,0x41,0x05,0xdb,0x00,0xb2,0x05,0xa8,0x00,0xb2,
-0x05,0x26,0x00,0x8f,0x07,0x0f,0x00,0xb2,0x06,0x37,0x00,0x5c,0x07,0x0f,0x00,0xb2,
-0x05,0xdb,0x00,0x8c,0x06,0xb9,0x00,0x5c,0x05,0xdb,0x00,0xb2,0x05,0xdb,0x00,0xb2,
-0x05,0xdb,0x00,0xb2,0x06,0x53,0x00,0xb2,0x05,0x26,0x00,0x9b,0x07,0x0f,0x00,0xb2,
-0x05,0xdb,0x00,0xb2,0x07,0x0f,0x00,0xb2,0x05,0x14,0x00,0x87,0x05,0xdb,0x00,0xb2,
-0x05,0xdb,0x00,0x8c,0x06,0x65,0x00,0xb2,0x06,0x4c,0x00,0x73,0x06,0x52,0x00,0x5c,
-0x06,0x4c,0x00,0x73,0x05,0x14,0x00,0x87,0x02,0x75,0x00,0x75,0x02,0x8b,0x00,0xb2,
-0x04,0x00,0x00,0x5e,0x04,0x00,0x00,0x78,0x03,0x22,0x00,0x9e,0x04,0x36,0x00,0x5e,
-0x04,0x00,0x00,0x5a,0x07,0xcb,0x00,0xba,0x05,0x12,0x00,0xba,0x05,0x4c,0x00,0x71,
-0x05,0x56,0x00,0xba,0x05,0x12,0x00,0xae,0x05,0x4c,0x00,0x71,0x04,0x68,0x00,0xae,
-0x05,0x12,0x00,0xba,0x05,0x78,0x00,0xba,0x05,0x64,0x00,0x71,0x05,0x12,0x00,0xba,
-0x03,0x00,0x00,0xc1,0x07,0xbd,0x00,0xba,0x05,0x0f,0x00,0x71,0x05,0x12,0x00,0xae,
-0x05,0x12,0x00,0xba,0x05,0x14,0x00,0x71,0x05,0x56,0x00,0xba,0x05,0x12,0x00,0xae,
-0x05,0x46,0x00,0xae,0x02,0x39,0xff,0xdb,0x06,0x14,0x00,0x31,0x04,0x20,0x00,0x9f,
-0x05,0x12,0x00,0xba,0x03,0x94,0x00,0x7a,0x07,0xcb,0x00,0xba,0x04,0x20,0x00,0x78,
-0x05,0x12,0x00,0xba,0x05,0x12,0x00,0xae,0x05,0x4a,0x00,0xae,0x07,0xca,0x00,0xae,
-0x05,0x12,0x00,0xba,0x05,0x14,0x00,0x71,0x03,0x00,0x00,0xc1,0x07,0xca,0x00,0xae,
-0x05,0x2c,0x00,0x00,0x04,0xe5,0x00,0x71,0x04,0xe8,0x00,0x7a,0x05,0x92,0x00,0xae,
-0x02,0xb2,0x00,0xf0,0x04,0x3d,0x00,0x6c,0x02,0x95,0x00,0xdb,0x00,0x00,0x00,0xfb,
-0x02,0x8b,0x00,0xdb,0x04,0x3f,0x00,0x93,0x03,0xc3,0x00,0xa3,0x02,0x39,0xff,0xb5,
-0x02,0x39,0x00,0x6c,0x03,0xdd,0xff,0xab,0x02,0x39,0x00,0x6c,0x06,0x43,0x00,0x82,
-0x02,0x39,0x00,0xc1,0x07,0x88,0x00,0x81,0x04,0x31,0x00,0x8b,0x07,0x88,0x00,0x81,
-0x07,0x88,0x00,0x81,0x05,0x2a,0x00,0x9d,0x05,0x2a,0x00,0x9d,0x05,0x2a,0x00,0x9d,
-0x03,0x90,0x00,0x7d,0x03,0x90,0x00,0x7d,0x03,0xdd,0xff,0xab,0x03,0xdd,0xff,0xab,
-0x09,0xc4,0x00,0x82,0x09,0xc4,0x00,0x82,0x09,0xac,0x00,0x82,0x09,0xac,0x00,0x82,
-0x07,0x66,0x00,0x90,0x07,0x66,0x00,0x90,0x04,0xc6,0x00,0x74,0x04,0xc6,0x00,0x74,
-0x02,0x58,0xff,0xec,0x08,0x4b,0x00,0x81,0x06,0x35,0x00,0x6b,0x06,0x98,0x00,0x90,
-0x05,0xd0,0x00,0x8f,0x04,0xf4,0x00,0x8c,0x05,0xe0,0x00,0x93,0x04,0x31,0x00,0x8b,
-0x03,0xdd,0xff,0xab,0x06,0x43,0x00,0x82,0x06,0x43,0x00,0x82,0x00,0x00,0x00,0xdc,
-0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0xdc,
-0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0xec,0x00,0x00,0x00,0x98,
-0x00,0x00,0x01,0x4f,0x00,0x00,0x01,0x4f,0x04,0x4c,0x01,0xb8,0x04,0x4c,0x01,0x16,
-0x04,0x4c,0x00,0x52,0x04,0x4c,0x00,0x4c,0x04,0x4c,0x00,0xaf,0x04,0x4c,0x00,0x87,
-0x04,0x4c,0x00,0x55,0x04,0x4c,0x00,0x3c,0x04,0x4c,0x00,0x3c,0x04,0x4c,0x00,0x63,
-0x04,0x4c,0x00,0x85,0x02,0x99,0x00,0x00,0x02,0x8b,0x00,0xb2,0x04,0x5c,0x00,0x57,
-0x07,0x88,0x00,0x81,0x06,0x35,0x00,0x6b,0x02,0x56,0x00,0x7a,0x07,0x88,0x00,0x81,
-0x07,0x88,0x00,0x81,0x07,0x88,0x00,0x81,0x07,0x88,0x00,0x81,0x07,0x88,0x00,0x81,
-0x07,0x88,0x00,0x81,0x07,0x88,0x00,0x81,0x07,0x88,0x00,0x81,0x05,0x2a,0x00,0x9d,
-0x05,0x2a,0x00,0x9d,0x05,0x2a,0x00,0x9d,0x05,0x2a,0x00,0x9d,0x05,0x2a,0x00,0x9d,
-0x05,0x2a,0x00,0x9d,0x05,0x2a,0x00,0x9d,0x03,0xdd,0xff,0xab,0x03,0xdd,0xff,0xab,
-0x08,0x4b,0x00,0x81,0x08,0x4b,0x00,0x81,0x08,0x4b,0x00,0x81,0x07,0x29,0x00,0x81,
-0x07,0x29,0x00,0x81,0x05,0xe0,0x00,0x93,0x05,0x2a,0x00,0x9d,0x06,0x43,0x00,0x82,
-0x04,0x4c,0x01,0xb8,0x04,0x4c,0x01,0x16,0x04,0x4c,0x00,0x52,0x04,0x4c,0x00,0x4c,
-0x04,0x4c,0x00,0x52,0x04,0x4c,0x00,0x6a,0x04,0x4c,0x00,0xd0,0x04,0x4c,0x00,0x3c,
-0x04,0x4c,0x00,0x3c,0x04,0x4c,0x00,0x63,0x07,0xdb,0x00,0x7b,0x04,0x53,0x00,0x82,
-0x02,0x39,0x00,0xc1,0x08,0x2f,0x00,0x71,0x04,0xe5,0x00,0x71,0x04,0xe5,0x00,0x71,
-0x05,0xe5,0x00,0xae,0x07,0x95,0x00,0xae,0x05,0x1a,0x00,0x2f,0x03,0x22,0x00,0x4d,
-0x03,0x22,0x00,0x4d,0x03,0x3e,0x00,0x47,0x05,0x2f,0x00,0x4d,0x03,0x6d,0x00,0x75,
-0x03,0x3e,0x00,0x47,0x03,0x56,0x00,0x47,0x03,0x56,0x00,0x47,0x02,0xe2,0x00,0x53,
-0x02,0xe0,0x00,0x51,0x03,0x3e,0x00,0x47,0x01,0x6e,0x00,0x79,0x03,0x68,0x00,0x75,
-0x04,0xfc,0x00,0x75,0x03,0x45,0x00,0x75,0x03,0x4f,0x00,0x47,0x02,0xf6,0x00,0x47,
-0x03,0x4f,0x00,0x47,0x03,0x4f,0x00,0x47,0x03,0x6d,0x00,0x75,0x02,0x5c,0x00,0x22,
-0x03,0x3d,0x00,0x6d,0x03,0xc2,0x00,0x6d,0x04,0xfc,0x00,0x75,0x03,0x56,0x00,0x26,
-0x05,0x14,0x00,0xba,0x02,0xf9,0x00,0x74,0x02,0x39,0x00,0x91,0x03,0x3e,0x00,0x47,
-0x02,0xf6,0x00,0x47,0x02,0xf6,0x00,0x47,0x03,0x4f,0x00,0x47,0x02,0xe2,0x00,0x53,
-0x02,0x5f,0x00,0x1d,0x01,0xdd,0xff,0xe9,0x03,0x3e,0x00,0x47,0x03,0x3d,0x00,0x6d,
-0x02,0x17,0x00,0x49,0x01,0xff,0x00,0x79,0x02,0x16,0x00,0x49,0x02,0x17,0x00,0x49,
-0x01,0xe0,0xff,0x56,0x01,0xff,0x00,0x79,0x01,0xe1,0x00,0x5b,0x03,0x03,0x00,0x70,
-0x04,0xfc,0x00,0x75,0x04,0xfc,0x00,0x75,0x03,0x49,0xff,0xe9,0x03,0xd6,0x00,0x75,
-0x03,0x45,0x00,0x70,0x03,0x4f,0x00,0x47,0x03,0x4f,0x00,0x47,0x02,0xe2,0x00,0x45,
-0x02,0x4b,0xff,0xe9,0x02,0x5c,0x00,0x22,0x04,0x10,0x00,0x5e,0x03,0x59,0x00,0x47,
-0x03,0x40,0x00,0x79,0x03,0x56,0x00,0x26,0x02,0xee,0x00,0x37,0x03,0x7e,0x00,0x37,
-0x02,0xee,0x00,0x37,0x03,0x23,0x00,0x37,0x03,0x4f,0x00,0x47,0x05,0x79,0x00,0x10,
-0x04,0xe7,0x00,0x7b,0x05,0x7d,0x00,0xc9,0x05,0x14,0x00,0xba,0x05,0x7d,0x00,0xc9,
-0x05,0x14,0x00,0xba,0x05,0x7d,0x00,0xc9,0x05,0x14,0x00,0xba,0x05,0x96,0x00,0x73,
-0x04,0x66,0x00,0x71,0x06,0x29,0x00,0xc9,0x05,0x14,0x00,0x71,0x06,0x29,0x00,0xc9,
-0x05,0x14,0x00,0x71,0x06,0x29,0x00,0xc9,0x05,0x14,0x00,0x71,0x06,0x29,0x00,0xc9,
-0x05,0x14,0x00,0x71,0x06,0x29,0x00,0xc9,0x05,0x14,0x00,0x71,0x05,0x0e,0x00,0xc9,
-0x04,0xec,0x00,0x71,0x05,0x0e,0x00,0xc9,0x04,0xec,0x00,0x71,0x05,0x0e,0x00,0xc9,
-0x04,0xec,0x00,0x71,0x05,0x0e,0x00,0xc9,0x04,0xec,0x00,0x71,0x05,0x0e,0x00,0xc9,
-0x04,0xec,0x00,0x71,0x04,0x9a,0x00,0xc9,0x02,0xd1,0x00,0x2f,0x06,0x33,0x00,0x73,
-0x05,0x14,0x00,0x71,0x06,0x04,0x00,0xc9,0x05,0x12,0x00,0xba,0x06,0x04,0x00,0xc9,
-0x05,0x12,0x00,0xba,0x06,0x04,0x00,0xc9,0x05,0x12,0x00,0xba,0x06,0x04,0x00,0x11,
-0x05,0x12,0x00,0x02,0x06,0x04,0x00,0xc9,0x05,0x12,0x00,0xba,0x02,0x5c,0x00,0x00,
-0x02,0x39,0x00,0x27,0x02,0x5c,0x00,0x08,0x02,0x39,0xff,0xf4,0x05,0x3f,0x00,0xc9,
-0x04,0xa2,0x00,0xba,0x05,0x3f,0x00,0xc9,0x04,0xa2,0x00,0xba,0x05,0x3f,0x00,0xc9,
-0x04,0xa2,0x00,0xba,0x04,0x75,0x00,0xc9,0x02,0x39,0x00,0xb6,0x04,0x75,0x00,0xc9,
-0x02,0x39,0xff,0xf2,0x04,0x75,0x00,0xc9,0x02,0x39,0x00,0x27,0x04,0x75,0x00,0xc9,
-0x02,0x39,0xff,0xde,0x06,0xe7,0x00,0xc9,0x07,0xcb,0x00,0xba,0x06,0xe7,0x00,0xc9,
-0x07,0xcb,0x00,0xba,0x06,0xe7,0x00,0xc9,0x07,0xcb,0x00,0xba,0x05,0xfc,0x00,0xc9,
-0x05,0x12,0x00,0xba,0x05,0xfc,0x00,0xc9,0x05,0x12,0x00,0xba,0x05,0xfc,0x00,0xc9,
-0x05,0x12,0x00,0xba,0x05,0xfc,0x00,0xc9,0x05,0x12,0x00,0xba,0x06,0x4c,0x00,0x73,
-0x04,0xe5,0x00,0x71,0x06,0x4c,0x00,0x73,0x04,0xe5,0x00,0x71,0x06,0x4c,0x00,0x73,
-0x04,0xe5,0x00,0x71,0x06,0x4c,0x00,0x73,0x04,0xe5,0x00,0x71,0x04,0xd3,0x00,0xc9,
-0x05,0x14,0x00,0xba,0x04,0xd3,0x00,0xc9,0x05,0x14,0x00,0xba,0x05,0x8f,0x00,0xc9,
-0x03,0x4a,0x00,0xba,0x05,0x8f,0x00,0xc9,0x03,0x4a,0x00,0xba,0x05,0x8f,0x00,0xc9,
-0x03,0x4a,0x00,0xba,0x05,0x8f,0x00,0xc9,0x03,0x4a,0x00,0x54,0x05,0x14,0x00,0x87,
-0x04,0x2b,0x00,0x6f,0x05,0x14,0x00,0x87,0x04,0x2b,0x00,0x6f,0x05,0x14,0x00,0x87,
-0x04,0x2b,0x00,0x6f,0x05,0x14,0x00,0x87,0x04,0x2b,0x00,0x6f,0x05,0x14,0x00,0x87,
-0x04,0x2b,0x00,0x6f,0x04,0xe3,0xff,0xfa,0x03,0x23,0x00,0x37,0x04,0xe3,0xff,0xfa,
-0x03,0x23,0x00,0x37,0x04,0xe3,0xff,0xfa,0x03,0x23,0x00,0x37,0x04,0xe3,0xff,0xfa,
-0x03,0x23,0x00,0x37,0x05,0xdb,0x00,0xb2,0x05,0x12,0x00,0xae,0x05,0xdb,0x00,0xb2,
-0x05,0x12,0x00,0xae,0x05,0xdb,0x00,0xb2,0x05,0x12,0x00,0xae,0x05,0xdb,0x00,0xb2,
-0x05,0x12,0x00,0xae,0x05,0xdb,0x00,0xb2,0x05,0x12,0x00,0xae,0x05,0x79,0x00,0x10,
-0x04,0xbc,0x00,0x3d,0x05,0x79,0x00,0x10,0x04,0xbc,0x00,0x3d,0x07,0xe9,0x00,0x44,
-0x06,0x8b,0x00,0x56,0x07,0xe9,0x00,0x44,0x06,0x8b,0x00,0x56,0x07,0xe9,0x00,0x44,
-0x06,0x8b,0x00,0x56,0x07,0xe9,0x00,0x44,0x06,0x8b,0x00,0x56,0x07,0xe9,0x00,0x44,
-0x06,0x8b,0x00,0x56,0x05,0x7b,0x00,0x3d,0x04,0xbc,0x00,0x3b,0x05,0x7b,0x00,0x3d,
-0x04,0xbc,0x00,0x3b,0x04,0xe3,0xff,0xfc,0x04,0xbc,0x00,0x3d,0x05,0x7b,0x00,0x5c,
-0x04,0x33,0x00,0x58,0x05,0x7b,0x00,0x5c,0x04,0x33,0x00,0x58,0x05,0x7b,0x00,0x5c,
-0x04,0x33,0x00,0x58,0x05,0x12,0x00,0xba,0x03,0x23,0x00,0x04,0x06,0x8b,0x00,0x56,
-0x04,0xbc,0x00,0x3d,0x06,0x4f,0x00,0x7b,0x02,0xd1,0x00,0x2f,0x05,0x79,0x00,0x10,
-0x04,0xe7,0x00,0x7b,0x05,0x79,0x00,0x10,0x04,0xe7,0x00,0x7b,0x05,0x79,0x00,0x10,
-0x04,0xe7,0x00,0x7b,0x05,0x79,0xff,0xfe,0x04,0xe7,0xff,0x86,0x05,0x79,0x00,0x10,
-0x04,0xe7,0x00,0x7b,0x05,0x79,0x00,0x10,0x04,0xe7,0x00,0x7b,0x05,0x79,0x00,0x10,
-0x04,0xe7,0x00,0x7b,0x05,0x79,0x00,0x10,0x04,0xe7,0x00,0x7b,0x05,0x79,0x00,0x10,
-0x04,0xe7,0x00,0x7b,0x05,0x79,0x00,0x10,0x04,0xe7,0x00,0x7b,0x05,0x79,0x00,0x10,
-0x04,0xe7,0x00,0x7b,0x05,0x79,0x00,0x10,0x04,0xe7,0x00,0x7b,0x05,0x0e,0x00,0xc9,
-0x04,0xec,0x00,0x71,0x05,0x0e,0x00,0xc9,0x04,0xec,0x00,0x71,0x05,0x0e,0x00,0xc9,
-0x04,0xec,0x00,0x71,0x05,0x0e,0x00,0xc9,0x04,0xec,0x00,0x71,0x05,0x0e,0xff,0xec,
-0x04,0xec,0xff,0xc6,0x05,0x0e,0x00,0xc9,0x04,0xec,0x00,0x71,0x05,0x0e,0x00,0xc9,
-0x04,0xec,0x00,0x71,0x05,0x0e,0x00,0xc9,0x04,0xec,0x00,0x71,0x02,0x5c,0x00,0xc9,
-0x02,0x39,0x00,0xc1,0x02,0x5c,0x00,0xc8,0x02,0x39,0x00,0xb7,0x06,0x4c,0x00,0x73,
-0x04,0xe5,0x00,0x71,0x06,0x4c,0x00,0x73,0x04,0xe5,0x00,0x71,0x06,0x4c,0x00,0x73,
-0x04,0xe5,0x00,0x71,0x06,0x4c,0x00,0x68,0x04,0xe5,0xff,0xb4,0x06,0x4c,0x00,0x73,
-0x04,0xe5,0x00,0x71,0x06,0x4c,0x00,0x73,0x04,0xe5,0x00,0x71,0x06,0x4c,0x00,0x73,
-0x04,0xe5,0x00,0x71,0x06,0x4c,0x00,0x67,0x04,0xe5,0x00,0x76,0x06,0x4c,0x00,0x67,
-0x04,0xe5,0x00,0x76,0x06,0x4c,0x00,0x67,0x04,0xe5,0x00,0x76,0x06,0x4c,0x00,0x67,
-0x04,0xe5,0x00,0x76,0x06,0x4c,0x00,0x67,0x04,0xe5,0x00,0x76,0x05,0xdb,0x00,0xb2,
-0x05,0x12,0x00,0xae,0x05,0xdb,0x00,0xb2,0x05,0x12,0x00,0xae,0x05,0xdb,0x00,0xad,
-0x05,0x12,0x00,0xb0,0x05,0xdb,0x00,0xad,0x05,0x12,0x00,0xb0,0x05,0xdb,0x00,0xad,
-0x05,0x12,0x00,0xb0,0x05,0xdb,0x00,0xad,0x05,0x12,0x00,0xb0,0x05,0xdb,0x00,0xad,
-0x05,0x12,0x00,0xb0,0x04,0xe3,0xff,0xfc,0x04,0xbc,0x00,0x3d,0x04,0xe3,0xff,0xfc,
-0x04,0xbc,0x00,0x3d,0x04,0xe3,0xff,0xfc,0x04,0xbc,0x00,0x3d,0x04,0xe3,0xff,0xfc,
-0x04,0xbc,0x00,0x3d,0x05,0x46,0x00,0x71,0x05,0x46,0x00,0x71,0x05,0x46,0x00,0x71,
-0x05,0x46,0x00,0x71,0x05,0x46,0x00,0x71,0x05,0x46,0x00,0x71,0x05,0x46,0x00,0x71,
-0x05,0x46,0x00,0x71,0x05,0x79,0x00,0x10,0x05,0x79,0x00,0x10,0x07,0x05,0x00,0x05,
-0x07,0x05,0x00,0x06,0x06,0x27,0x00,0x07,0x06,0x69,0x00,0x04,0x05,0xaa,0x00,0x07,
-0x05,0xf1,0x00,0x04,0x04,0x53,0x00,0x85,0x04,0x53,0x00,0x85,0x04,0x53,0x00,0x85,
-0x04,0x53,0x00,0x85,0x04,0x53,0x00,0x85,0x04,0x53,0x00,0x85,0x05,0xb0,0x00,0x07,
-0x05,0xb0,0x00,0x07,0x07,0xba,0x00,0x05,0x07,0xcc,0x00,0x06,0x07,0x30,0x00,0x07,
-0x07,0x6c,0x00,0x04,0x05,0x12,0x00,0xba,0x05,0x12,0x00,0xba,0x05,0x12,0x00,0xba,
-0x05,0x12,0x00,0xba,0x05,0x12,0x00,0xba,0x05,0x12,0x00,0xba,0x05,0x12,0x00,0xba,
-0x05,0x12,0x00,0xba,0x06,0xb2,0x00,0x07,0x06,0xaf,0x00,0x07,0x08,0xb0,0x00,0x05,
-0x08,0xb6,0x00,0x06,0x08,0x37,0x00,0x07,0x08,0x68,0x00,0x04,0x07,0x78,0x00,0x07,
-0x07,0x93,0x00,0x04,0x02,0xb5,0x00,0x9b,0x02,0xb5,0x00,0x91,0x02,0xb5,0xff,0xb1,
-0x02,0xb5,0xff,0xbb,0x02,0xb5,0x00,0x05,0x02,0xb5,0xff,0xd3,0x02,0xb5,0xff,0xcb,
-0x02,0xb5,0xff,0xc6,0x03,0x0a,0x00,0x07,0x02,0xfe,0x00,0x07,0x05,0x14,0x00,0x05,
-0x05,0x14,0x00,0x06,0x04,0x90,0x00,0x07,0x04,0xcc,0x00,0x04,0x03,0xea,0x00,0x07,
-0x03,0xf1,0x00,0x04,0x04,0xe5,0x00,0x71,0x04,0xe5,0x00,0x71,0x04,0xe5,0x00,0x71,
-0x04,0xe5,0x00,0x71,0x04,0xe5,0x00,0x71,0x04,0xe5,0x00,0x71,0x06,0x6f,0x00,0x07,
-0x06,0xc9,0x00,0x07,0x08,0xc2,0x00,0x05,0x08,0xcc,0x00,0x06,0x07,0x82,0x00,0x07,
-0x07,0xc3,0x00,0x04,0x04,0xa1,0x00,0x95,0x04,0xa1,0x00,0x95,0x04,0xa1,0x00,0x95,
-0x04,0xa1,0x00,0x95,0x04,0xa1,0x00,0x95,0x04,0xa1,0x00,0x95,0x04,0xa1,0x00,0x95,
-0x04,0xa1,0x00,0x95,0x06,0x45,0x00,0x07,0x07,0xfb,0x00,0x06,0x08,0x19,0x00,0x04,
-0x07,0x2e,0x00,0x04,0x06,0xb3,0x00,0x87,0x06,0xb3,0x00,0x87,0x06,0xb3,0x00,0x87,
-0x06,0xb3,0x00,0x87,0x06,0xb3,0x00,0x87,0x06,0xb3,0x00,0x87,0x06,0xb3,0x00,0x87,
-0x06,0xb3,0x00,0x87,0x06,0x6b,0x00,0x07,0x06,0xbf,0x00,0x07,0x08,0xb7,0x00,0x05,
-0x08,0xc3,0x00,0x06,0x07,0x91,0x00,0x07,0x07,0xc7,0x00,0x04,0x07,0x5f,0x00,0x07,
-0x07,0x9e,0x00,0x04,0x05,0x46,0x00,0x71,0x05,0x46,0x00,0x71,0x04,0x53,0x00,0x85,
-0x04,0x63,0x00,0x85,0x05,0x12,0x00,0xba,0x05,0x3c,0x00,0xba,0x02,0xb5,0xff,0x8d,
-0x02,0xb5,0x00,0xa6,0x04,0xe5,0x00,0x71,0x04,0xe5,0x00,0x71,0x04,0xa1,0x00,0x95,
-0x04,0xa1,0x00,0x95,0x06,0xb3,0x00,0x87,0x06,0xb3,0x00,0x87,0x05,0x46,0x00,0x71,
-0x05,0x46,0x00,0x71,0x05,0x46,0x00,0x71,0x05,0x46,0x00,0x71,0x05,0x46,0x00,0x71,
-0x05,0x46,0x00,0x71,0x05,0x46,0x00,0x71,0x05,0x46,0x00,0x71,0x05,0x79,0x00,0x10,
-0x05,0x79,0x00,0x10,0x07,0x05,0x00,0x05,0x07,0x05,0x00,0x06,0x06,0x27,0x00,0x07,
-0x06,0x69,0x00,0x04,0x05,0xaa,0x00,0x07,0x05,0xf1,0x00,0x04,0x05,0x12,0x00,0xba,
-0x05,0x12,0x00,0xba,0x05,0x12,0x00,0xba,0x05,0x12,0x00,0xba,0x05,0x12,0x00,0xba,
-0x05,0x12,0x00,0xba,0x05,0x12,0x00,0xba,0x05,0x12,0x00,0xba,0x06,0xb2,0x00,0x07,
-0x06,0xaf,0x00,0x07,0x08,0xb0,0x00,0x05,0x08,0xb6,0x00,0x06,0x08,0x37,0x00,0x07,
-0x08,0x68,0x00,0x04,0x07,0x78,0x00,0x07,0x07,0x93,0x00,0x04,0x06,0xb3,0x00,0x87,
-0x06,0xb3,0x00,0x87,0x06,0xb3,0x00,0x87,0x06,0xb3,0x00,0x87,0x06,0xb3,0x00,0x87,
-0x06,0xb3,0x00,0x87,0x06,0xb3,0x00,0x87,0x06,0xb3,0x00,0x87,0x06,0x6b,0x00,0x07,
-0x06,0xbf,0x00,0x07,0x08,0xb7,0x00,0x05,0x08,0xc3,0x00,0x06,0x07,0x91,0x00,0x07,
-0x07,0xc7,0x00,0x04,0x07,0x5f,0x00,0x07,0x07,0x9e,0x00,0x04,0x05,0x46,0x00,0x71,
-0x05,0x46,0x00,0x71,0x05,0x46,0x00,0x71,0x05,0x46,0x00,0x71,0x05,0x46,0x00,0x71,
-0x05,0x46,0x00,0x71,0x05,0x46,0x00,0x71,0x05,0x79,0x00,0x10,0x05,0x79,0x00,0x10,
-0x05,0xbb,0xff,0xfc,0x05,0x8a,0x00,0x10,0x05,0x79,0x00,0x10,0x04,0x00,0x01,0x86,
-0x04,0x00,0x01,0xb6,0x04,0x00,0x01,0x86,0x04,0x00,0x00,0xb6,0x04,0x00,0x00,0xb6,
-0x05,0x12,0x00,0xba,0x05,0x12,0x00,0xba,0x05,0x3c,0x00,0xba,0x05,0x12,0x00,0xba,
-0x05,0x12,0x00,0xba,0x06,0x70,0xff,0xfc,0x05,0xf8,0xff,0xe7,0x07,0x72,0xff,0xfc,
-0x06,0xf8,0xff,0xf3,0x06,0x04,0x00,0xc9,0x04,0x00,0x00,0x89,0x04,0x00,0x00,0xb4,
-0x04,0x00,0x00,0xb6,0x02,0xb5,0xff,0xeb,0x02,0xb5,0xff,0xe3,0x02,0xb5,0xff,0xd8,
-0x02,0xb5,0x00,0x05,0x02,0xb5,0xff,0xe4,0x02,0xb5,0xff,0xe6,0x02,0x5c,0xff,0xf5,
-0x02,0x5c,0x00,0x04,0x03,0xcd,0xff,0xfc,0x03,0x44,0xff,0xed,0x04,0x00,0x00,0x7e,
-0x04,0x00,0x00,0x95,0x04,0x00,0x00,0xb6,0x04,0xa1,0x00,0x95,0x04,0xa1,0x00,0x95,
-0x04,0xa1,0x00,0x95,0x04,0xa1,0x00,0x95,0x05,0x14,0x00,0xba,0x05,0x14,0x00,0xba,
-0x04,0xa1,0x00,0x95,0x04,0xa1,0x00,0x95,0x04,0xe3,0xff,0xfc,0x04,0xe3,0xff,0xfc,
-0x06,0xc3,0xff,0xfc,0x06,0x99,0xff,0xe1,0x05,0x7b,0x00,0x07,0x04,0x00,0x00,0xaa,
-0x04,0x00,0x00,0xd7,0x04,0x00,0x00,0xaa,0x06,0xb3,0x00,0x87,0x06,0xb3,0x00,0x87,
-0x06,0xb3,0x00,0x87,0x06,0xb3,0x00,0x87,0x06,0xb3,0x00,0x87,0x07,0x87,0xff,0xfc,
-0x06,0x80,0xff,0xf2,0x07,0x61,0xff,0xfc,0x06,0x9b,0xff,0xdb,0x06,0x1d,0x00,0x4e,
-0x04,0x00,0x01,0x73,0x04,0x00,0x01,0x86,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
-0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x02,0xa3,0x00,0x00,0x02,0x00,0x00,0x00,
-0x01,0x56,0x00,0x00,0x05,0x17,0x00,0x00,0x02,0x8b,0x00,0x00,0x01,0x99,0x00,0x00,
-0x00,0xcc,0x00,0x00,0x02,0xe3,0x00,0x64,0x02,0xe3,0x00,0x64,0x04,0x00,0x00,0x00,
-0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x04,0x00,0x01,0x04,
-0x04,0x00,0xff,0xec,0x02,0x8b,0x00,0xae,0x02,0x8b,0x00,0xb2,0x02,0x8b,0x00,0xae,
-0x02,0x8b,0x00,0xb2,0x04,0x25,0x00,0xae,0x04,0x25,0x00,0xae,0x04,0x25,0x00,0xae,
-0x04,0x25,0x00,0xae,0x04,0x00,0x00,0x39,0x04,0x00,0x00,0x39,0x04,0xb8,0x01,0x33,
-0x04,0xb8,0x01,0x33,0x02,0xad,0x00,0xec,0x05,0x57,0x00,0xec,0x08,0x00,0x00,0xec,
-0x02,0x8b,0x00,0xdc,0x0a,0xbc,0x00,0x71,0x0d,0xe2,0x00,0x71,0x02,0x33,0x00,0x6a,
-0x03,0x78,0x00,0x6a,0x04,0xbd,0x00,0x6a,0x02,0x33,0x00,0x80,0x03,0x78,0x00,0x80,
-0x04,0xbd,0x00,0x80,0x02,0xb6,0x00,0x0b,0x03,0x33,0x00,0x9e,0x03,0x33,0x00,0xc1,
-0x06,0xb4,0x00,0xc3,0x03,0xe2,0x00,0x93,0x04,0x3f,0x00,0x93,0x04,0x00,0xff,0xec,
-0x06,0x6e,0xff,0xa7,0x06,0x6e,0xff,0xa7,0x02,0x00,0xff,0xaa,0x08,0x00,0x00,0x3d,
-0x04,0x00,0x00,0xdd,0x01,0x56,0xfe,0x89,0x03,0x1f,0x00,0xb0,0x03,0x1f,0x00,0xb0,
-0x07,0x60,0x00,0x49,0x05,0xdd,0x00,0x93,0x05,0xdd,0x00,0x93,0x03,0xf0,0x00,0x6f,
-0x05,0x17,0x00,0xec,0x04,0x00,0x00,0xd8,0x04,0x00,0x00,0xd8,0x04,0x00,0x00,0x3d,
-0x02,0xb2,0x01,0x1d,0x06,0x6e,0xff,0xa7,0x04,0x00,0x00,0x3d,0x03,0x99,0x00,0x91,
-0x06,0xb4,0x00,0xd9,0x06,0x6e,0xff,0xa7,0x06,0xb4,0x01,0x38,0x04,0xb0,0x00,0xfa,
-0x05,0x4e,0x00,0x28,0x06,0xb4,0x01,0x66,0x06,0xb4,0x01,0x66,0x02,0x8b,0x00,0xdb,
-0x06,0x61,0x00,0x64,0x06,0xb4,0x00,0x70,0x02,0x8b,0x00,0xdb,0x02,0x8b,0x00,0xdb,
-0x03,0x35,0x00,0x57,0x01,0x6e,0x00,0x7a,0x03,0x35,0x00,0x3f,0x03,0x35,0x00,0x66,
-0x03,0x35,0x00,0x5c,0x03,0x35,0x00,0x6c,0x03,0x35,0x00,0x59,0x03,0x35,0x00,0x53,
-0x04,0x39,0x00,0x89,0x04,0x39,0x00,0x89,0x04,0x39,0x00,0x89,0x01,0xf7,0x00,0x6f,
-0x01,0xf7,0x00,0x67,0x03,0x31,0x00,0x75,0x03,0x35,0x00,0x57,0x03,0x35,0x00,0x89,
-0x03,0x35,0x00,0x5e,0x03,0x35,0x00,0x62,0x03,0x35,0x00,0x3f,0x03,0x35,0x00,0x66,
-0x03,0x35,0x00,0x5c,0x03,0x35,0x00,0x6c,0x03,0x35,0x00,0x59,0x03,0x35,0x00,0x53,
-0x04,0x39,0x00,0x89,0x04,0x39,0x00,0x89,0x04,0x39,0x00,0x89,0x01,0xf7,0x00,0x6f,
-0x01,0xf7,0x00,0x67,0x07,0x04,0x00,0x56,0x05,0x17,0x00,0x73,0x05,0x17,0x00,0x60,
-0x05,0x17,0x00,0x85,0x05,0x17,0x00,0x81,0x07,0xcb,0x00,0xba,0x05,0xfc,0x00,0x75,
-0x0a,0x2e,0x00,0xc9,0x08,0x97,0x00,0xc9,0x07,0xe9,0x00,0x3b,0x06,0x46,0x00,0x5f,
-0x05,0x17,0x00,0x81,0x05,0x17,0x00,0x00,0x05,0x17,0x00,0x28,0x05,0x17,0x00,0x14,
-0x08,0x75,0x00,0x1b,0x05,0x17,0x00,0x44,0x06,0x31,0x00,0x75,0x05,0x21,0x00,0xaa,
-0x08,0x26,0x00,0x43,0x08,0xfc,0x00,0xc3,0x05,0x23,0xff,0xd6,0x08,0x26,0x00,0x3c,
-0x08,0x89,0x00,0x3c,0x07,0x9d,0x00,0xc3,0x05,0x12,0x00,0x48,0x05,0x12,0x00,0x22,
-0x05,0x94,0x00,0x6a,0x03,0x4e,0xff,0xe4,0x09,0x51,0x00,0xc9,0x08,0x00,0x01,0x1b,
-0x05,0x94,0x00,0x6e,0x06,0x83,0x00,0x53,0x06,0x57,0x00,0x76,0x07,0x2c,0x00,0xa9,
-0x08,0x28,0x01,0x03,0x08,0x98,0xff,0xfc,0x08,0x00,0x01,0x27,0x06,0x1d,0x00,0x4e,
-0x06,0x1d,0x00,0x4e,0x05,0x3f,0x00,0xc9,0x05,0x79,0x00,0x10,0x06,0xd6,0x00,0x7d,
-0x04,0x9a,0x00,0xc9,0x03,0xb2,0x00,0x68,0x05,0xf6,0x00,0x67,0x09,0x8d,0x00,0x97,
-0x06,0x3d,0x00,0x3b,0x07,0xc1,0x00,0x89,0x07,0xc1,0x00,0x5e,0x07,0xc1,0x00,0x89,
-0x07,0xc1,0x00,0x5e,0x07,0xc1,0x00,0x62,0x07,0xc1,0x00,0x3f,0x07,0xc1,0x00,0x89,
-0x07,0xc1,0x00,0x66,0x07,0xc1,0x00,0x89,0x07,0xc1,0x00,0x62,0x07,0xc1,0x00,0x66,
-0x07,0xc1,0x00,0x6c,0x04,0x8b,0x00,0x89,0x02,0x5c,0x00,0xc9,0x03,0xf0,0x00,0xc9,
-0x05,0x84,0x00,0xc9,0x07,0x62,0x00,0xc9,0x05,0x79,0x00,0x10,0x07,0x61,0x00,0x10,
-0x08,0xf5,0x00,0x10,0x0a,0x89,0x00,0x10,0x07,0x57,0x00,0xc9,0x05,0x7b,0x00,0x3d,
-0x07,0x77,0x00,0x3d,0x09,0x0d,0x00,0x3d,0x04,0x75,0x00,0xc9,0x05,0x96,0x00,0x73,
-0x06,0x29,0x00,0xc9,0x06,0xe7,0x00,0xc9,0x02,0x39,0x00,0xc1,0x03,0xa9,0x00,0xc1,
-0x05,0x19,0x00,0xc1,0x06,0x7e,0x00,0xc1,0x04,0xbc,0x00,0x3d,0x06,0x7d,0x00,0x3d,
-0x07,0xed,0x00,0x3d,0x09,0x5d,0x00,0x3d,0x06,0x8d,0x00,0xc1,0x04,0xbc,0x00,0x3b,
-0x06,0x94,0x00,0x3b,0x08,0x04,0x00,0x3b,0x02,0x39,0x00,0xc1,0x04,0x66,0x00,0x71,
-0x05,0x14,0x00,0x71,0x07,0xcb,0x00,0xba,0x09,0xf6,0x00,0x79,0x06,0x29,0x00,0xc9,
-0x09,0xf6,0x00,0x79,0x05,0x96,0x00,0x73,0x06,0x8a,0x00,0x78,0x03,0xf4,0x00,0xfa,
-0x06,0x8a,0x00,0x78,0x03,0xf4,0x00,0xfa,0x06,0x8a,0x00,0x78,0x03,0xf4,0x00,0xfa,
-0x06,0x8a,0x01,0x33,0x06,0x8a,0x01,0x33,0x06,0x8a,0x01,0x33,0x06,0x8a,0x01,0x33,
-0x06,0x8a,0x00,0x78,0x06,0x8a,0x00,0x78,0x06,0x8a,0x00,0xcd,0x06,0x8a,0x00,0xcd,
-0x06,0x8a,0x00,0x78,0x03,0xf4,0x00,0xfa,0x06,0x8a,0x00,0x78,0x03,0xf4,0x00,0xfa,
-0x06,0x8a,0x00,0x78,0x06,0x8a,0x00,0x78,0x06,0x8a,0x00,0x78,0x03,0xf4,0x00,0xf8,
-0x06,0x8a,0x00,0x78,0x03,0xf4,0x00,0xf8,0x03,0xf4,0x00,0x78,0x03,0xf4,0x00,0x78,
-0x03,0xf4,0x00,0x96,0x03,0xf4,0x00,0x78,0x03,0xf4,0x00,0x96,0x03,0xf4,0x00,0x78,
-0x06,0x8a,0x00,0x78,0x06,0x8a,0x00,0x48,0x06,0x8a,0x00,0x48,0x06,0x8a,0x01,0x33,
-0x06,0x8a,0x00,0x78,0x06,0x8a,0x00,0x59,0x06,0x8a,0x00,0x6e,0x06,0x8a,0x00,0x78,
-0x06,0x8a,0x00,0x78,0x04,0x00,0x01,0xc0,0x04,0x00,0x01,0x00,0x06,0x8a,0x00,0x78,
-0x06,0x8a,0x00,0x78,0x04,0x00,0x01,0xc0,0x04,0x00,0x01,0x00,0x06,0x8a,0x00,0x77,
-0x06,0x8a,0x01,0x4a,0x06,0x8a,0x00,0x77,0x06,0x8a,0x00,0x77,0x06,0x8a,0x01,0xa0,
-0x06,0x8a,0x00,0x77,0x06,0x8a,0x01,0xa0,0x06,0x8a,0x00,0x78,0x06,0x8a,0x00,0x78,
-0x06,0xb4,0x00,0x64,0x06,0xb4,0x01,0xa5,0x06,0xb4,0x00,0x75,0x06,0xb4,0x01,0xa5,
-0x06,0xb4,0x00,0x64,0x05,0x79,0x00,0x10,0x05,0x17,0x00,0x87,0x04,0x23,0x00,0x68,
-0x05,0x0e,0x00,0xc9,0x05,0x0e,0x00,0x9f,0x06,0xf8,0x00,0x9b,0x05,0x5a,0xff,0xfa,
-0x05,0x5a,0xff,0xfa,0x06,0xf8,0x00,0xaf,0x06,0xf8,0x00,0xaf,0x06,0x54,0x00,0xd9,
-0x06,0xf8,0x00,0xaf,0x06,0xf8,0x00,0xaf,0x06,0x54,0x00,0xd9,0x05,0x17,0x01,0x2c,
-0x06,0x0e,0x00,0x9c,0x06,0x0e,0x00,0x9c,0x05,0x64,0x00,0x19,0x06,0xb4,0x00,0xd9,
-0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xd9,0x01,0x56,0xfe,0x89,0x05,0x18,0x01,0x8a,
-0x05,0x02,0x00,0xbe,0x05,0x02,0x01,0x44,0x02,0x8b,0x00,0xdb,0x05,0x19,0x00,0x3d,
-0x05,0x19,0x00,0x3d,0x05,0x19,0x00,0x3d,0x05,0x6a,0x00,0xdd,0x06,0xaa,0x00,0xdd,
-0x06,0xb4,0x01,0x1b,0x06,0xb4,0x01,0x1b,0x07,0x2c,0x00,0xaf,0x06,0xb4,0x00,0xed,
-0x04,0x00,0x01,0xb0,0x04,0x00,0x00,0x66,0x04,0x00,0x01,0x10,0x04,0x00,0x00,0x66,
-0x05,0xdb,0x01,0x07,0x05,0xdb,0x01,0x07,0x05,0xdb,0x01,0x07,0x05,0xdb,0x01,0x07,
-0x04,0x2b,0x00,0x2f,0x06,0xd0,0x00,0x2f,0x09,0x75,0x00,0x2f,0x05,0x17,0x00,0x79,
-0x05,0x17,0x00,0x79,0x02,0x15,0x00,0xa1,0x05,0x17,0x00,0x79,0x06,0xb4,0x00,0xd9,
-0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xd8,0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xd9,
-0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xd9,
-0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xd9,
-0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xd9,
-0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xd8,0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xd9,
-0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xd6,0x06,0xb4,0x00,0xd5,
-0x08,0x00,0x00,0xce,0x08,0x00,0x00,0xcd,0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xd9,
-0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xd9,
-0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xd9,
-0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xd9,
-0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xda,0x06,0xb4,0x00,0xda,
-0x06,0xb4,0x00,0xda,0x06,0xb4,0x00,0xda,0x08,0x60,0x00,0x94,0x08,0x60,0x00,0x94,
-0x06,0xb4,0x00,0xd8,0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xd9,
-0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xd9,
-0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xd0,0x06,0xb4,0x00,0xd0,0x06,0xb4,0x00,0xd0,
-0x06,0xb4,0x00,0xd0,0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xd9,
-0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xd9,
-0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xcb,0x06,0xb4,0x00,0xcb,0x06,0xb4,0x00,0xcb,
-0x06,0xb4,0x00,0xcb,0x06,0xb4,0x00,0xbe,0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xbe,
-0x06,0xb4,0x00,0xd9,0x06,0xb4,0x00,0xbe,0x06,0xb4,0x00,0xbe,0x06,0xb4,0x00,0xbb,
-0x06,0xb4,0x00,0xbb,0x06,0xb4,0x00,0xbb,0x06,0xb4,0x00,0xbb,0x06,0xf8,0x00,0xaf,
-0x06,0xf8,0x00,0xaf,0x03,0xf4,0x00,0x06,0x02,0x8b,0x00,0xdb,0x05,0x02,0x00,0xf9,
-0x05,0x14,0x00,0x92,0x06,0xf8,0x00,0x64,0x01,0x90,0x00,0x00,0x01,0x90,0x00,0x00,
-0x01,0x90,0x00,0x00,0x01,0x90,0x00,0x00,0x06,0xb4,0x00,0xd9,0x04,0x1b,0x00,0x06,
-0x08,0x00,0x00,0xf7,0x06,0xb4,0x00,0xd9,0x04,0x2b,0x01,0xaf,0x04,0x2b,0x00,0x2a,
-0x08,0x00,0x00,0xac,0x0b,0x8c,0x00,0x78,0x03,0x1f,0x00,0xb7,0x03,0x1f,0x00,0xa4,
-0x06,0x0f,0x00,0x1a,0x04,0x2b,0x01,0xaf,0x06,0x27,0x00,0x06,0x05,0x14,0xff,0x83,
-0x05,0x14,0x00,0x92,0x07,0x2c,0x00,0x98,0x07,0x2c,0x00,0x98,0x07,0x2c,0x00,0x98,
-0x07,0x2c,0x00,0x98,0x07,0x2c,0x00,0x98,0x07,0x2c,0x00,0x98,0x07,0x2c,0x00,0x98,
-0x07,0x2c,0x00,0x98,0x07,0x2c,0x00,0x98,0x07,0x2c,0x00,0x98,0x06,0x27,0xff,0xec,
-0x06,0x27,0xff,0xec,0x06,0x27,0xff,0xec,0x06,0x27,0xff,0xec,0x06,0x27,0xff,0xec,
-0x06,0x27,0xff,0xec,0x06,0x27,0xff,0xec,0x06,0x27,0xff,0xec,0x06,0x27,0xff,0xec,
-0x06,0x27,0xff,0xec,0x06,0x27,0xff,0xec,0x06,0x27,0xff,0xec,0x06,0x27,0xff,0xec,
-0x06,0x27,0xff,0xec,0x06,0x27,0xff,0xec,0x06,0x27,0xff,0xec,0x06,0x27,0x03,0x13,
-0x06,0x27,0xff,0xec,0x06,0x27,0xff,0xec,0x06,0x27,0xff,0xec,0x06,0x27,0xff,0xec,
-0x06,0x27,0x05,0x71,0x06,0x27,0xff,0xec,0x06,0x27,0x03,0x13,0x06,0x27,0xff,0xec,
-0x06,0x27,0xff,0xec,0x06,0x27,0xff,0xec,0x06,0x27,0xff,0xec,0x06,0x27,0xff,0xec,
-0x06,0x27,0x03,0x13,0x06,0x27,0xff,0xec,0x06,0x27,0xff,0xec,0x07,0x8f,0x00,0xba,
-0x07,0x8f,0x00,0xba,0x07,0x8f,0x00,0xba,0x07,0x8f,0x00,0xba,0x07,0x8f,0x00,0xba,
-0x07,0x8f,0x00,0xba,0x07,0x8f,0x00,0xba,0x07,0x8f,0x00,0xba,0x07,0x8f,0x00,0xba,
-0x07,0x8f,0x00,0xba,0x05,0x6c,0x00,0xba,0x05,0x6c,0x00,0xba,0x07,0x8f,0x00,0xba,
-0x07,0x8f,0x00,0xba,0x04,0x67,0x00,0xba,0x04,0x67,0x00,0xba,0x06,0x27,0x00,0x06,
-0x06,0x27,0x00,0x06,0x06,0x27,0x00,0x06,0x06,0x27,0x00,0x06,0x04,0x04,0x00,0x06,
-0x04,0x04,0x00,0x06,0x06,0x27,0x00,0x06,0x06,0x27,0x00,0x06,0x04,0x04,0x00,0x06,
-0x04,0x04,0x00,0x06,0x06,0x27,0x00,0x06,0x06,0x27,0x00,0x06,0x06,0x27,0x00,0x06,
-0x06,0x27,0x00,0x06,0x04,0x04,0x00,0x06,0x04,0x04,0x00,0x06,0x06,0x27,0x00,0x06,
-0x06,0x27,0x00,0x06,0x04,0x04,0x00,0x06,0x04,0x04,0x00,0x06,0x06,0x27,0x00,0x06,
-0x06,0x27,0x00,0x06,0x06,0x27,0x00,0x06,0x06,0x27,0x00,0x06,0x06,0x27,0x00,0x06,
-0x06,0xfb,0x00,0x70,0x03,0xf4,0x00,0x06,0x06,0xfb,0x00,0x70,0x06,0xfb,0x00,0x72,
-0x06,0xfb,0x00,0x70,0x06,0xfb,0x00,0x70,0x06,0xfb,0x00,0x70,0x06,0xfb,0x00,0x70,
-0x06,0xfb,0x00,0x70,0x06,0xfb,0x00,0x70,0x06,0xfb,0x00,0x70,0x06,0xfb,0x00,0x70,
-0x06,0xfb,0x00,0x70,0x04,0x37,0x00,0x70,0x04,0x37,0x00,0xba,0x06,0x54,0x00,0xba,
-0x07,0xc3,0x00,0xba,0x07,0xc3,0x00,0xba,0x07,0xc3,0x00,0xba,0x03,0x19,0x00,0x06,
-0x03,0x19,0x00,0x06,0x03,0x19,0x00,0x06,0x03,0x19,0x00,0x06,0x06,0xfb,0x00,0x70,
-0x06,0xfb,0x00,0x70,0x06,0x27,0x00,0x06,0x06,0x27,0x00,0x06,0x06,0x27,0x00,0x06,
-0x06,0x27,0x00,0x06,0x04,0xb8,0x01,0x33,0x07,0x8f,0x00,0xba,0x07,0x8f,0x00,0xba,
-0x07,0x8f,0x00,0xba,0x07,0x8f,0x00,0xba,0x07,0x8f,0x00,0xba,0x06,0x27,0x00,0x06,
-0x06,0x27,0x00,0x06,0x06,0x27,0x00,0x06,0x08,0xf4,0x00,0x70,0x07,0x8f,0x00,0xba,
-0x07,0x8f,0x00,0xba,0x07,0x8f,0x00,0xba,0x07,0x8f,0x00,0xba,0x06,0xfb,0x00,0x70,
-0x06,0xfb,0x00,0x70,0x06,0xfb,0x00,0x70,0x06,0xfb,0x00,0x70,0x06,0x27,0x00,0x06,
-0x06,0x27,0x00,0x06,0x06,0x27,0x00,0x06,0x06,0xa4,0x00,0xba,0x06,0xa4,0x00,0xba,
-0x05,0xdc,0x00,0xba,0x05,0xdc,0x00,0xba,0x06,0x27,0x00,0x06,0x07,0x2c,0x00,0xab,
-0x08,0x00,0x00,0x68,0x07,0x2c,0x00,0x64,0x07,0x2c,0x00,0xaa,0x07,0x2c,0x00,0x83,
-0x07,0x2c,0x00,0x85,0x07,0x2c,0x00,0x85,0x04,0x95,0x00,0xaa,0x07,0x2b,0x00,0xaa,
-0x07,0x2c,0x00,0xaa,0x07,0x1b,0x00,0x7d,0x07,0x1b,0x00,0x7d,0x05,0x5f,0x00,0x7d,
-0x08,0x1a,0x00,0x7d,0x09,0xf7,0x00,0x8c,0x0a,0x01,0x00,0x91,0x07,0x2c,0x00,0xb8,
-0x07,0x2c,0x00,0xb7,0x07,0x2c,0x00,0xb7,0x04,0x42,0x00,0x9a,0x07,0x2c,0x00,0x64,
-0x07,0x2c,0x00,0x98,0x07,0x2c,0x00,0xac,0x07,0x2c,0x00,0xac,0x07,0x2c,0x00,0x9f,
-0x07,0x2c,0x00,0xab,0x07,0x2c,0x00,0xac,0x07,0x2c,0x00,0xac,0x07,0x2c,0x00,0xb2,
-0x04,0xdf,0x00,0x93,0x07,0x2c,0x00,0xb1,0x04,0xdf,0x00,0x93,0x07,0x2c,0x00,0x7d,
-0x07,0x2c,0x00,0xac,0x07,0x2c,0x00,0xaa,0x07,0x2c,0x00,0x64,0x05,0x5a,0x00,0x64,
-0x05,0xf8,0x00,0xaa,0x05,0x32,0x00,0xaa,0x06,0x45,0x00,0xaa,0x04,0x5c,0x00,0xaa,
-0x07,0x2c,0x00,0xaa,0x07,0x2c,0x00,0xb2,0x07,0x2c,0x00,0xaa,0x05,0xaf,0x00,0xaa,
-0x07,0x2c,0x00,0xab,0x07,0x2c,0x00,0xaa,0x07,0x2c,0x00,0xaa,0x07,0x2c,0x00,0xaa,
-0x07,0x2c,0x00,0xaa,0x07,0x2c,0x00,0xaa,0x07,0x2c,0x00,0xaa,0x07,0x2c,0x00,0xaa,
-0x07,0x2c,0x00,0xaa,0x07,0x2c,0x00,0xaa,0x07,0x2c,0x00,0xaa,0x07,0x2c,0x00,0x87,
-0x07,0x2c,0x00,0xaa,0x07,0x2c,0x00,0xaa,0x07,0x2c,0x00,0xaa,0x07,0x2c,0x00,0xaa,
-0x07,0x2c,0x02,0xdd,0x07,0x2c,0x00,0xaa,0x04,0xe9,0x00,0xaf,0x05,0xd9,0x00,0xaf,
-0x05,0xd9,0x00,0xaf,0x07,0x2c,0x00,0xaf,0x07,0x2c,0x01,0x53,0x07,0x2c,0x01,0xc0,
-0x07,0x2c,0x00,0xf8,0x07,0x2c,0x01,0x04,0x07,0x2c,0x01,0xec,0x07,0x2c,0x00,0x5d,
-0x07,0x2c,0x00,0xb7,0x07,0x2c,0x00,0xc0,0x07,0x2c,0x00,0xe7,0x07,0x2c,0x01,0x1e,
-0x07,0x2c,0x00,0x6d,0x07,0x2c,0x00,0xab,0x07,0x2c,0x00,0x45,0x07,0x2c,0x00,0xa9,
-0x07,0x2c,0x00,0xc0,0x07,0x2c,0x00,0xb0,0x07,0x2c,0x01,0x41,0x07,0x2c,0x00,0xc9,
-0x07,0x2c,0x00,0xe2,0x07,0x2c,0x01,0x55,0x07,0x2c,0x01,0xb6,0x07,0x2c,0x01,0x51,
-0x07,0x2c,0x01,0x30,0x07,0x2c,0x00,0xc9,0x07,0x2c,0x00,0xe2,0x07,0x2c,0x01,0x55,
-0x07,0x2c,0x01,0xb6,0x07,0x2c,0x01,0x4c,0x07,0x2c,0x01,0x30,0x07,0x2c,0x01,0x43,
-0x07,0x2c,0x00,0xb9,0x07,0x2c,0x01,0x58,0x07,0x2c,0x00,0xe4,0x07,0x2c,0x01,0x42,
-0x07,0x2c,0x00,0xb6,0x07,0x2c,0x01,0x58,0x07,0x2c,0x00,0xe4,0x07,0x2c,0x00,0xd8,
-0x03,0xc6,0x00,0xac,0x05,0x1b,0x00,0xac,0x07,0x2c,0x01,0x78,0x07,0x2c,0x00,0xbc,
-0x03,0xc6,0x00,0xb5,0x02,0xdc,0x00,0xac,0x03,0xdf,0x00,0xad,0x05,0xfc,0x00,0xac,
-0x06,0x20,0x00,0x84,0x07,0x2c,0x00,0xac,0x07,0x2c,0x00,0x9c,0x07,0x2c,0x00,0x9c,
-0x07,0x2c,0x00,0x9c,0x07,0x2c,0x00,0x9c,0x07,0x2c,0x00,0x9c,0x07,0x2c,0x00,0x9c,
-0x07,0x2c,0x00,0x9c,0x07,0x2c,0x00,0x9c,0x07,0x2c,0x00,0xac,0x07,0x2c,0x00,0xaa,
-0x07,0x2c,0x00,0xaa,0x07,0x2c,0x00,0xaa,0x07,0x2c,0x01,0x31,0x06,0xf4,0x00,0x96,
-0x06,0xf4,0x00,0x96,0x06,0xf4,0x00,0x96,0x06,0xf4,0x00,0x96,0x06,0xf4,0x00,0x96,
-0x06,0xf4,0x00,0x96,0x07,0x2c,0x00,0xaa,0x07,0x2c,0x00,0xaa,0x07,0x2c,0x00,0xaa,
-0x07,0x2c,0x00,0xaa,0x07,0x2c,0x00,0xaa,0x07,0x2c,0x00,0xaa,0x07,0x2c,0x00,0xaa,
-0x07,0x2c,0x00,0xaa,0x07,0x2c,0x00,0xaa,0x07,0x2c,0x00,0xaa,0x07,0x2c,0x01,0x58,
-0x07,0x2c,0x01,0x58,0x07,0x2c,0x00,0x6a,0x07,0x2c,0x00,0xc6,0x07,0x2c,0x01,0x0d,
-0x04,0x54,0x00,0x7d,0x07,0x2c,0x00,0x79,0x07,0x2c,0x00,0x7d,0x07,0x2c,0x01,0x29,
-0x07,0x2c,0x00,0xa9,0x07,0x2c,0x01,0x06,0x07,0x2c,0x01,0x05,0x07,0x2c,0x01,0x05,
-0x07,0x2c,0x00,0x64,0x05,0x9e,0x00,0xaa,0x07,0x2c,0x00,0xaa,0x05,0x1e,0x00,0xaa,
-0x06,0xb4,0x00,0x16,0x06,0xb4,0x00,0x56,0x06,0xb4,0x00,0x16,0x06,0xb4,0x00,0x49,
-0x06,0xb4,0x00,0x56,0x06,0xb4,0x00,0x56,0x06,0xb4,0x00,0x78,0x06,0xb4,0x00,0x84,
-0x06,0xb4,0x01,0xb3,0x06,0xb4,0x00,0x2b,0x06,0xb4,0x00,0xb6,0x06,0xb4,0x00,0x35,
-0x06,0xb4,0x00,0xb6,0x06,0xb4,0x00,0x58,0x06,0xb4,0x00,0x8a,0x06,0xb4,0x01,0x33,
-0x06,0xb4,0x00,0xed,0x06,0xb4,0x01,0x03,0x06,0xb4,0x00,0xaf,0x06,0xb4,0x00,0xf1,
-0x06,0xb4,0x00,0xfc,0x06,0xb4,0x00,0x70,0x06,0xb4,0x00,0x70,0x06,0xb4,0x00,0x70,
-0x06,0xb4,0x00,0x70,0x06,0xb4,0x01,0x52,0x06,0xb4,0x01,0x0c,0x06,0xb4,0x01,0x3e,
-0x06,0xb4,0x00,0x70,0x06,0xb4,0x00,0xbb,0x06,0xb4,0x00,0x54,0x06,0xb4,0x00,0x56,
-0x06,0xb4,0x00,0x53,0x06,0xb4,0x00,0x54,0x06,0xb4,0x00,0x57,0x06,0xb4,0x00,0x57,
-0x06,0xb4,0x00,0x30,0x06,0xb4,0x00,0x56,0x06,0xb4,0x00,0x30,0x06,0xb4,0x00,0x30,
-0x06,0xb4,0x00,0x30,0x06,0xb4,0x00,0x30,0x06,0xb4,0x00,0x30,0x06,0xb4,0x00,0x32,
-0x06,0xb4,0x00,0x84,0x06,0xb4,0x00,0x98,0x06,0xb4,0x00,0x70,0x06,0xb4,0x00,0x40,
-0x06,0xb4,0x00,0x54,0x06,0xb4,0x00,0xbb,0x06,0xb4,0x00,0x54,0x06,0xb4,0x00,0x54,
-0x06,0xb4,0x00,0x54,0x06,0xb4,0x00,0x70,0x06,0xb4,0x00,0xa7,0x06,0xb4,0x00,0xa7,
-0x06,0xb4,0x00,0xa1,0x06,0xb4,0x00,0xa1,0x06,0xb4,0x00,0x6e,0x06,0xb4,0x00,0x6e,
-0x06,0xb4,0x00,0x54,0x06,0xb4,0x00,0x56,0x06,0xb4,0x00,0xa1,0x06,0xb4,0x00,0xb6,
-0x06,0xb4,0x00,0x9c,0x06,0xb4,0x00,0x82,0x06,0xb4,0x00,0xa1,0x06,0xb4,0x00,0x61,
-0x06,0xb4,0x00,0x61,0x06,0xb4,0x00,0x54,0x06,0xb4,0x00,0x54,0x07,0x2c,0x00,0x66,
-0x07,0x2c,0x00,0x7a,0x07,0x2c,0x00,0x7a,0x07,0x2c,0x00,0x7a,0x07,0x2c,0x00,0x7a,
-0x07,0x2c,0x00,0xaa,0x06,0xb4,0x03,0x05,0x06,0xb4,0x02,0xb0,0x06,0xb4,0x02,0x06,
-0x02,0x94,0x00,0xae,0x02,0x94,0x00,0x78,0x04,0x4e,0x00,0xae,0x04,0x4e,0x00,0x78,
-0x06,0xb4,0x01,0x3e,0x06,0xb4,0x01,0x9e,0x06,0xb4,0x01,0x4e,0x06,0xb4,0x00,0x6e,
-0x06,0xb4,0x01,0x58,0x06,0xb4,0x00,0x7e,0x06,0xb4,0x00,0xa0,0x06,0xb4,0x01,0x91,
-0x06,0xb4,0x01,0x91,0x06,0xb4,0x02,0x1d,0x06,0xb4,0x02,0x1d,0x06,0xb4,0x01,0xb9,
-0x06,0xb4,0x01,0xdb,0x06,0xb4,0x01,0x23,0x06,0xb4,0x01,0x39,0x06,0xb4,0x01,0x55,
-0x06,0xb4,0x01,0x77,0x06,0xb4,0x02,0xc4,0x06,0xb4,0x02,0x6c,0x06,0xb4,0x01,0x66,
-0x06,0xb4,0x01,0xa1,0x07,0x2c,0x00,0x98,0x07,0x2c,0x00,0x98,0x07,0x2c,0x00,0x98,
-0x07,0x2c,0x00,0x98,0x07,0x2c,0x00,0x98,0x07,0x2c,0x00,0x98,0x07,0x2c,0x00,0x98,
-0x07,0x2c,0x00,0x98,0x07,0x2c,0x00,0x98,0x07,0x2c,0x00,0x98,0x06,0xb4,0x00,0x09,
-0x06,0xb4,0x00,0x09,0x06,0xb4,0x00,0x09,0x06,0xb4,0x00,0x09,0x06,0xb4,0x00,0x09,
-0x06,0xb4,0x00,0x09,0x06,0xb4,0x00,0x09,0x06,0xb4,0x00,0x09,0x06,0xb4,0x00,0x09,
-0x06,0xb4,0x00,0x09,0x06,0xb4,0x00,0x09,0x06,0xb4,0x00,0x09,0x06,0xb4,0x00,0x09,
-0x06,0xb4,0x00,0x09,0x06,0xb4,0x00,0x09,0x06,0xb4,0x00,0x09,0x06,0xb4,0x00,0x09,
-0x06,0xb4,0x00,0x09,0x06,0xb4,0x00,0x09,0x06,0xb4,0x00,0x09,0x06,0xb4,0x00,0x75,
-0x06,0xb4,0x00,0xfc,0x06,0xb4,0x00,0x75,0x06,0xb4,0x00,0xfc,0x06,0xb4,0x00,0x75,
-0x06,0xb4,0x00,0x75,0x06,0xb4,0x00,0x75,0x06,0xb4,0x00,0x75,0x06,0xb4,0x00,0x75,
-0x06,0xb4,0x00,0x75,0x06,0xb4,0x00,0x75,0x06,0xb4,0x00,0xe4,0x06,0xb4,0x00,0xe4,
-0x06,0xb4,0x00,0xe4,0x06,0xb4,0x00,0x75,0x06,0xb4,0x00,0x75,0x06,0xb4,0x01,0xec,
-0x06,0xb4,0x00,0x75,0x06,0xb4,0x00,0x75,0x06,0xb4,0x00,0x75,0x06,0xb4,0x00,0x2b,
-0x06,0xb4,0x00,0x2b,0x06,0xb4,0x01,0x15,0x06,0xb4,0x01,0x15,0x06,0xb4,0x00,0x7f,
-0x06,0xb4,0x00,0x7f,0x06,0xb4,0x01,0x3c,0x06,0xb4,0x00,0x82,0x06,0xb4,0x00,0xa5,
-0x06,0xb4,0x00,0x75,0x06,0xb4,0x00,0xa7,0x06,0xb4,0x00,0xa7,0x06,0xb4,0x00,0x75,
-0x06,0xb4,0x00,0xa7,0x06,0xb4,0x00,0x73,0x06,0xb4,0x00,0x96,0x06,0xb4,0x00,0xa2,
-0x06,0xb4,0x00,0xa2,0x06,0xb4,0x00,0x75,0x03,0xf4,0x00,0x06,0x03,0x1f,0x00,0xb7,
-0x03,0x1f,0x00,0xa4,0x04,0x73,0x00,0xb7,0x04,0x73,0x00,0xa4,0x03,0xf4,0x00,0x06,
-0x0c,0x1a,0x00,0x2f,0x04,0x2b,0x00,0x2f,0x04,0x2b,0x00,0x2f,0x06,0x27,0x00,0x06,
-0x06,0x27,0x00,0x06,0x05,0x78,0x01,0x91,0x05,0x78,0x01,0x91,0x05,0x78,0x01,0x91,
-0x05,0x78,0x01,0x93,0x05,0x78,0x01,0x2d,0x05,0x78,0x01,0x91,0x05,0x78,0x01,0xe5,
-0x05,0x78,0x01,0x2d,0x05,0x78,0x01,0x72,0x05,0x78,0x01,0x7d,0x05,0x78,0x01,0x72,
-0x05,0x78,0x01,0x7d,0x05,0x78,0x01,0x72,0x05,0x78,0x01,0x7d,0x05,0x78,0xff,0xfe,
-0x05,0x78,0x01,0x72,0x05,0x78,0x01,0x72,0x05,0x78,0x01,0x83,0x05,0x78,0x01,0x38,
-0x05,0x78,0x01,0x83,0x05,0x78,0x01,0x7d,0x05,0x83,0x00,0x2f,0x05,0x0a,0x00,0x2f,
-0x05,0x0a,0x00,0x2f,0x07,0xbc,0x00,0x2f,0x07,0xbc,0x00,0x2f,0x05,0x7d,0x00,0x2f,
-0x06,0xe3,0x00,0x6f,0x09,0x9d,0x00,0xaa,0x09,0x9d,0x00,0xae,0x09,0x91,0x00,0xae,
-0x09,0x7d,0x00,0xae,0x0c,0x3c,0x00,0xae,0x07,0x88,0x00,0x81,0x07,0xdb,0x00,0x81,
-0x02,0x3a,0xff,0xec,0x02,0x6a,0xff,0xec,0x07,0x88,0x00,0x81,0x07,0xdb,0x00,0x81,
-0x02,0x3a,0xff,0xec,0x02,0x6a,0xff,0xec,0x07,0x88,0x00,0x81,0x07,0xdb,0x00,0x81,
-0x02,0x3a,0xff,0xec,0x02,0x6a,0xff,0xec,0x07,0x88,0x00,0x81,0x07,0xdb,0x00,0x81,
-0x02,0x3a,0xff,0xec,0x02,0x6a,0xff,0xec,0x07,0x88,0x00,0x81,0x07,0xdb,0x00,0x81,
-0x02,0x3a,0xff,0xec,0x02,0x6a,0xff,0xec,0x07,0x88,0x00,0x81,0x07,0xdb,0x00,0x81,
-0x02,0x3a,0xff,0xec,0x02,0x6a,0xff,0xec,0x08,0x4b,0x00,0x81,0x08,0x48,0x00,0x81,
-0x03,0xd3,0xff,0xec,0x04,0x0c,0xff,0xec,0x08,0x4b,0x00,0x81,0x08,0x48,0x00,0x81,
-0x03,0xd3,0xff,0xec,0x04,0x0c,0xff,0xec,0x05,0x2a,0x00,0x9d,0x05,0x2a,0x00,0x9d,
-0x04,0xf2,0xff,0xec,0x05,0x2a,0xff,0xec,0x05,0x2a,0x00,0x9d,0x05,0x2a,0x00,0x9d,
-0x04,0xf2,0xff,0xec,0x05,0x2a,0xff,0xec,0x05,0x2a,0x00,0x9d,0x05,0x2a,0x00,0x9d,
-0x04,0xf2,0xff,0xec,0x05,0x2a,0xff,0xec,0x05,0x2a,0x00,0x9d,0x05,0x2a,0x00,0x9d,
-0x04,0xf2,0xff,0xec,0x05,0x2a,0xff,0xec,0x03,0xdd,0xff,0xab,0x04,0x6a,0xff,0xab,
-0x03,0xdd,0xff,0xab,0x04,0x6a,0xff,0xab,0x07,0x29,0x00,0x81,0x07,0x29,0x00,0x81,
-0x03,0xcf,0xff,0xec,0x04,0x6b,0xff,0xec,0x07,0x29,0x00,0x81,0x07,0x29,0x00,0x81,
-0x03,0xcf,0xff,0xec,0x04,0x6b,0xff,0xec,0x05,0xe0,0x00,0x93,0x06,0x17,0x00,0x93,
-0x02,0x3a,0xff,0xec,0x02,0x6a,0xff,0xec,0x06,0x43,0x00,0x82,0x06,0xab,0x00,0x82,
-0x02,0x3a,0xff,0xec,0x02,0x6a,0xff,0xec,0x02,0x58,0x00,0x08,0x02,0x58,0xff,0xec,
-0x02,0x58,0x00,0x08,0x02,0x18,0x00,0x69,0x02,0x58,0x00,0x08,0x02,0x58,0x00,0x08,
-0x02,0x58,0xff,0xec,0x02,0x58,0x00,0x08,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0x08,
-0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xf4,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0x18,
-0x02,0x58,0xff,0xec,0x03,0xc3,0x00,0xa3,0x02,0x39,0xff,0xb5,0x02,0x70,0xff,0xb5,
-0x02,0x39,0x00,0x6c,0x02,0x70,0x00,0x6c,0x03,0xdd,0xff,0xab,0x04,0x22,0xff,0xab,
-0x02,0x39,0x00,0x6c,0x02,0x70,0x00,0x6c,0x06,0x43,0x00,0x82,0x06,0xab,0x00,0x82,
-0x02,0x3a,0xff,0xec,0x02,0x6a,0xff,0xec,0x02,0x39,0x00,0xc1,0x02,0x70,0x00,0xc1,
-0x07,0x88,0x00,0x81,0x07,0xdb,0x00,0x81,0x02,0x3a,0xff,0xec,0x02,0x6a,0xff,0xec,
-0x04,0x31,0x00,0x8b,0x04,0x4a,0x00,0x91,0x07,0x88,0x00,0x81,0x07,0xdb,0x00,0x81,
-0x02,0x3a,0xff,0xec,0x02,0x6a,0xff,0xec,0x07,0x88,0x00,0x81,0x07,0xdb,0x00,0x81,
-0x02,0x3a,0xff,0xec,0x02,0x6a,0xff,0xec,0x05,0x2a,0x00,0x9d,0x05,0x2a,0x00,0x9d,
-0x04,0xf2,0xff,0xec,0x05,0x2a,0xff,0xec,0x05,0x2a,0x00,0x9d,0x05,0x2a,0x00,0x9d,
-0x04,0xf2,0xff,0xec,0x05,0x2a,0xff,0xec,0x05,0x2a,0x00,0x9d,0x05,0x2a,0x00,0x9d,
-0x04,0xf2,0xff,0xec,0x05,0x2a,0xff,0xec,0x03,0x90,0x00,0x7d,0x04,0x33,0x00,0x7d,
-0x03,0x90,0x00,0x7d,0x04,0x33,0x00,0x7d,0x03,0xdd,0xff,0xab,0x04,0x6a,0xff,0xab,
-0x03,0xdd,0xff,0xab,0x04,0x6a,0xff,0xab,0x09,0xc4,0x00,0x82,0x0a,0x33,0x00,0x82,
-0x06,0xb4,0xff,0xec,0x07,0x23,0xff,0xec,0x09,0xc4,0x00,0x82,0x0a,0x33,0x00,0x82,
-0x06,0xb4,0xff,0xec,0x07,0x23,0xff,0xec,0x09,0xac,0x00,0x82,0x09,0xcd,0x00,0x82,
-0x06,0xcb,0xff,0xec,0x06,0xf0,0xff,0xec,0x09,0xac,0x00,0x82,0x09,0xcd,0x00,0x82,
-0x06,0xcb,0xff,0xec,0x06,0xf0,0xff,0xec,0x07,0x66,0x00,0x90,0x07,0x98,0x00,0x90,
-0x06,0x5e,0xff,0xec,0x06,0x90,0xff,0xec,0x07,0x66,0x00,0x90,0x07,0x98,0x00,0x90,
-0x06,0x5e,0xff,0xec,0x06,0x90,0xff,0xec,0x04,0xc6,0x00,0x74,0x04,0x42,0x00,0x75,
-0x04,0xc6,0xff,0xec,0x03,0xdc,0xff,0xec,0x04,0xc6,0x00,0x74,0x04,0x42,0x00,0x75,
-0x04,0x2f,0xff,0xec,0x03,0xdc,0xff,0xec,0x08,0x4b,0x00,0x81,0x08,0x48,0x00,0x81,
-0x03,0xd3,0xff,0xec,0x04,0x0c,0xff,0xec,0x06,0x35,0x00,0x6b,0x06,0xac,0x00,0x6b,
-0x03,0xd3,0xff,0xec,0x04,0x0c,0xff,0xec,0x06,0x98,0x00,0x90,0x06,0xbe,0x00,0x90,
-0x03,0xcf,0xff,0xec,0x04,0x6b,0xff,0xec,0x05,0xd0,0x00,0x8f,0x06,0x0f,0x00,0x8f,
-0x02,0x70,0xff,0xec,0x02,0xa6,0xff,0xec,0x04,0xf4,0x00,0x8c,0x05,0x53,0x00,0x8c,
-0x04,0x49,0xff,0xec,0x04,0xa0,0xff,0xec,0x05,0xe0,0x00,0x93,0x06,0x17,0x00,0x93,
-0x02,0x3a,0xff,0xec,0x02,0x6a,0xff,0xec,0x04,0x31,0x00,0x8b,0x04,0x4a,0x00,0x91,
-0x04,0x38,0xff,0xec,0x03,0xb0,0xff,0xec,0x03,0xdd,0xff,0xab,0x04,0x22,0xff,0xab,
-0x06,0x43,0x00,0x82,0x06,0xab,0x00,0x82,0x06,0x43,0x00,0x82,0x06,0xab,0x00,0x82,
-0x02,0x3a,0xff,0xec,0x02,0x6a,0xff,0xec,0x04,0x90,0xff,0x2e,0x04,0xc6,0xff,0x2e,
-0x04,0x90,0xff,0xe6,0x04,0xc6,0xff,0xe6,0x04,0x90,0x00,0x17,0x04,0xc6,0x00,0x17,
-0x04,0x90,0x00,0x54,0x04,0xc6,0x00,0x54,0x00,0x00,0x00,0x00,0x08,0x34,0x00,0x1e,
-0x00,0x00,0xff,0xb9,0x00,0x00,0xfc,0xd7,0x00,0x00,0xfd,0x73,0x00,0x00,0xfc,0xb6,
-0x00,0x00,0xfd,0x0c,0x00,0x00,0xfc,0xcf,0x00,0x00,0xfc,0xcf,0x00,0x00,0xfc,0xc7,
-0x00,0x00,0xfc,0xc7,0x00,0x00,0xfd,0x9a,0x00,0x00,0xfc,0xe6,0x00,0x00,0xfc,0x4e,
-0x00,0x96,0x00,0x00,0x01,0x90,0x00,0x00,0x01,0x90,0x00,0x00,0x01,0x90,0x00,0x00,
-0x00,0x96,0x00,0x00,0x01,0x90,0x00,0x00,0x07,0xdb,0x00,0x81,0x02,0x3a,0xff,0xec,
-0x02,0x6a,0xff,0xec,0x08,0x48,0x00,0x81,0x03,0xd3,0xff,0xec,0x04,0x0c,0xff,0xec,
-0x06,0xac,0x00,0x6b,0x03,0xd3,0xff,0xec,0x04,0x0c,0xff,0xec,0x02,0x3a,0xff,0xec,
-0x02,0x6a,0xff,0xec,0x01,0xb6,0x00,0x00,0x07,0xdb,0x00,0x81,0x02,0x3a,0xff,0xec,
-0x02,0x6a,0xff,0xec,0x07,0xdb,0x00,0x81,0x02,0x3a,0xff,0xec,0x02,0x6a,0xff,0xec,
-0x05,0x2a,0x00,0x9d,0x04,0xf2,0xff,0xec,0x05,0x2a,0xff,0xec,0x05,0x2a,0x00,0x9d,
-0x04,0xf2,0xff,0xec,0x05,0x2a,0xff,0xec,0x05,0x2a,0x00,0x9d,0x04,0xf2,0xff,0xec,
-0x05,0x2a,0xff,0xec,0x05,0x2a,0x00,0x9d,0x04,0xf2,0xff,0xec,0x05,0x2a,0xff,0xec,
-0x03,0x5f,0x00,0x00,0x05,0xfc,0x00,0xc9,0x02,0xf9,0x00,0x74,0x02,0xee,0xfe,0xf2,
-0x05,0x78,0x01,0x92,0x05,0x78,0x01,0x92,0x05,0x78,0x01,0x92,0x05,0x78,0x01,0x93,
-0x05,0x78,0x01,0x93,0x05,0x78,0x01,0x92,0x05,0x78,0x01,0x92,0x05,0x78,0x01,0x76,
-0x05,0x78,0x01,0x8b,0x05,0x78,0x01,0x76,0x05,0x78,0x01,0x8b,0x05,0x78,0x01,0x76,
-0x05,0x78,0x01,0x8b,0x05,0x78,0x00,0x5c,0x05,0x78,0x01,0x76,0x05,0x78,0x01,0x76,
-0x05,0x78,0x01,0x83,0x05,0x78,0x01,0x83,0x05,0x78,0x01,0x83,0x05,0x78,0x01,0x8b,
-0x00,0x00,0xfc,0x9c,0x00,0x00,0x00,0x01,0x00,0x00,0x3c,0x02,0x00,0x01,0x09,0xfe,
-0x30,0x00,0x00,0x0b,0x0b,0xf4,0x00,0x10,0x00,0x24,0xff,0xd3,0x00,0x10,0x00,0x25,
-0xff,0xb7,0x00,0x10,0x00,0x2a,0x00,0x4b,0x00,0x10,0x00,0x2d,0x00,0x72,0x00,0x10,
-0x00,0x32,0x00,0x39,0x00,0x10,0x00,0x34,0x00,0x4b,0x00,0x10,0x00,0x37,0xff,0x44,
-0x00,0x10,0x00,0x39,0xff,0x88,0x00,0x10,0x00,0x3a,0xff,0xad,0x00,0x10,0x00,0x3b,
-0xff,0x9a,0x00,0x10,0x00,0x3c,0xff,0x0d,0x00,0x10,0x00,0x52,0x00,0x26,0x00,0x10,
-0x00,0x59,0xff,0xc9,0x00,0x10,0x00,0x5c,0xff,0xdc,0x00,0x10,0x00,0x82,0xff,0xd3,
-0x00,0x10,0x00,0x83,0xff,0xd3,0x00,0x10,0x00,0x84,0xff,0xd3,0x00,0x10,0x00,0x85,
-0xff,0xd3,0x00,0x10,0x00,0x86,0xff,0xd3,0x00,0x10,0x00,0x94,0x00,0x39,0x00,0x10,
-0x00,0x95,0x00,0x39,0x00,0x10,0x00,0x96,0x00,0x39,0x00,0x10,0x00,0x97,0x00,0x39,
-0x00,0x10,0x00,0x98,0x00,0x39,0x00,0x10,0x00,0x9f,0xff,0x0d,0x00,0x10,0x00,0xb4,
-0x00,0x26,0x00,0x10,0x00,0xb5,0x00,0x26,0x00,0x10,0x00,0xb6,0x00,0x26,0x00,0x10,
-0x00,0xb7,0x00,0x26,0x00,0x10,0x00,0xb8,0x00,0x26,0x00,0x10,0x00,0xbf,0xff,0xdc,
-0x00,0x10,0x00,0xc1,0xff,0xdc,0x00,0x10,0x00,0xc2,0xff,0xd3,0x00,0x10,0x00,0xc4,
-0xff,0xd3,0x00,0x10,0x00,0xc6,0xff,0xd3,0x00,0x10,0x00,0xe0,0x00,0x4b,0x00,0x10,
-0x01,0x26,0xff,0x44,0x00,0x10,0x01,0x3a,0xff,0x0d,0x00,0x24,0x00,0x10,0xff,0xd3,
-0x00,0x24,0x00,0x11,0xff,0xdc,0x00,0x24,0x00,0x1d,0xff,0xdc,0x00,0x24,0x00,0x24,
-0x00,0x39,0x00,0x24,0x00,0x26,0xff,0xdc,0x00,0x24,0x00,0x2a,0xff,0xdc,0x00,0x24,
-0x00,0x32,0xff,0xdc,0x00,0x24,0x00,0x34,0xff,0xdc,0x00,0x24,0x00,0x37,0xff,0x61,
-0x00,0x24,0x00,0x39,0xff,0x7d,0x00,0x24,0x00,0x3a,0xff,0x90,0x00,0x24,0x00,0x3c,
-0xff,0x61,0x00,0x24,0x00,0x46,0xff,0xdc,0x00,0x24,0x00,0x47,0xff,0xdc,0x00,0x24,
-0x00,0x48,0xff,0xdc,0x00,0x24,0x00,0x49,0xff,0xb7,0x00,0x24,0x00,0x52,0xff,0xdc,
-0x00,0x24,0x00,0x54,0xff,0xdc,0x00,0x24,0x00,0x57,0xff,0xdc,0x00,0x24,0x00,0x59,
-0xff,0x88,0x00,0x24,0x00,0x5a,0xff,0xad,0x00,0x24,0x00,0x5c,0xff,0x75,0x00,0x24,
-0x00,0x6d,0xff,0xb7,0x00,0x24,0x00,0x82,0x00,0x39,0x00,0x24,0x00,0x83,0x00,0x39,
-0x00,0x24,0x00,0x84,0x00,0x39,0x00,0x24,0x00,0x85,0x00,0x39,0x00,0x24,0x00,0x86,
-0x00,0x39,0x00,0x24,0x00,0x89,0xff,0xdc,0x00,0x24,0x00,0x94,0xff,0xdc,0x00,0x24,
-0x00,0x95,0xff,0xdc,0x00,0x24,0x00,0x96,0xff,0xdc,0x00,0x24,0x00,0x97,0xff,0xdc,
-0x00,0x24,0x00,0x98,0xff,0xdc,0x00,0x24,0x00,0x9f,0xff,0x61,0x00,0x24,0x00,0xa9,
-0xff,0xdc,0x00,0x24,0x00,0xaa,0xff,0xdc,0x00,0x24,0x00,0xab,0xff,0xdc,0x00,0x24,
-0x00,0xac,0xff,0xdc,0x00,0x24,0x00,0xad,0xff,0xdc,0x00,0x24,0x00,0xb4,0xff,0xdc,
-0x00,0x24,0x00,0xb5,0xff,0xdc,0x00,0x24,0x00,0xb6,0xff,0xdc,0x00,0x24,0x00,0xb7,
-0xff,0xdc,0x00,0x24,0x00,0xb8,0xff,0xdc,0x00,0x24,0x00,0xbf,0xff,0x75,0x00,0x24,
-0x00,0xc1,0xff,0x75,0x00,0x24,0x00,0xc2,0x00,0x39,0x00,0x24,0x00,0xc4,0x00,0x39,
-0x00,0x24,0x00,0xc6,0x00,0x39,0x00,0x24,0x00,0xc8,0xff,0xdc,0x00,0x24,0x00,0xc9,
-0xff,0xdc,0x00,0x24,0x00,0xca,0xff,0xdc,0x00,0x24,0x00,0xcb,0xff,0xdc,0x00,0x24,
-0x00,0xcc,0xff,0xdc,0x00,0x24,0x00,0xcd,0xff,0xdc,0x00,0x24,0x00,0xce,0xff,0xdc,
-0x00,0x24,0x00,0xcf,0xff,0xdc,0x00,0x24,0x00,0xd1,0xff,0xdc,0x00,0x24,0x00,0xd3,
-0xff,0xdc,0x00,0x24,0x00,0xd5,0xff,0xdc,0x00,0x24,0x00,0xd7,0xff,0xdc,0x00,0x24,
-0x00,0xd9,0xff,0xdc,0x00,0x24,0x00,0xdb,0xff,0xdc,0x00,0x24,0x00,0xdd,0xff,0xdc,
-0x00,0x24,0x00,0xde,0xff,0xdc,0x00,0x24,0x00,0xe0,0xff,0xdc,0x00,0x24,0x00,0xe2,
-0xff,0xdc,0x00,0x24,0x01,0x0e,0xff,0xdc,0x00,0x24,0x01,0x0f,0xff,0xdc,0x00,0x24,
-0x01,0x10,0xff,0xdc,0x00,0x24,0x01,0x11,0xff,0xdc,0x00,0x24,0x01,0x12,0xff,0xdc,
-0x00,0x24,0x01,0x13,0xff,0xdc,0x00,0x24,0x01,0x24,0xff,0x61,0x00,0x24,0x01,0x25,
-0xff,0xdc,0x00,0x24,0x01,0x26,0xff,0x61,0x00,0x24,0x01,0x27,0xff,0xdc,0x00,0x24,
-0x01,0x36,0xff,0x90,0x00,0x24,0x01,0x37,0xff,0xad,0x00,0x24,0x01,0x38,0xff,0x61,
-0x00,0x24,0x01,0x39,0xff,0x75,0x00,0x24,0x01,0x3a,0xff,0x61,0x00,0x24,0x01,0x88,
-0xff,0xdc,0x00,0x24,0x01,0xac,0xff,0xdc,0x00,0x24,0x01,0xad,0xff,0xdc,0x00,0x24,
-0x01,0xae,0xff,0xdc,0x00,0x24,0x01,0xaf,0xff,0xdc,0x00,0x24,0x01,0xdc,0xff,0x61,
-0x00,0x24,0x01,0xdd,0xff,0xdc,0x00,0x24,0x01,0xf0,0xff,0xdc,0x00,0x24,0x01,0xf3,
-0xff,0xdc,0x00,0x24,0x01,0xf4,0xff,0x61,0x00,0x24,0x01,0xf5,0xff,0x75,0x00,0x24,
-0x06,0x07,0xff,0x90,0x00,0x24,0x06,0x08,0xff,0xad,0x00,0x24,0x06,0x09,0xff,0x90,
-0x00,0x24,0x06,0x0a,0xff,0xad,0x00,0x24,0x06,0x0b,0xff,0x90,0x00,0x24,0x06,0x0c,
-0xff,0xad,0x00,0x24,0x06,0x75,0xff,0x61,0x00,0x24,0x06,0x76,0xff,0x75,0x00,0x24,
-0x07,0x7d,0xfe,0xf8,0x00,0x24,0x07,0x7e,0xff,0x03,0x00,0x24,0x07,0x7f,0x00,0x2f,
-0x00,0x25,0x00,0x26,0xff,0xdc,0x00,0x25,0x00,0x2a,0xff,0xdc,0x00,0x25,0x00,0x32,
-0xff,0xdc,0x00,0x25,0x00,0x36,0xff,0xdc,0x00,0x25,0x00,0x39,0xff,0xc1,0x00,0x25,
-0x00,0x3a,0xff,0xb7,0x00,0x25,0x00,0x3c,0xff,0x90,0x00,0x25,0x00,0x6d,0xff,0xc1,
-0x00,0x25,0x00,0x7d,0xff,0xdc,0x00,0x25,0x00,0x89,0xff,0xdc,0x00,0x25,0x00,0x94,
-0xff,0xdc,0x00,0x25,0x00,0x95,0xff,0xdc,0x00,0x25,0x00,0x96,0xff,0xdc,0x00,0x25,
-0x00,0x97,0xff,0xdc,0x00,0x25,0x00,0x98,0xff,0xdc,0x00,0x25,0x00,0x9f,0xff,0x90,
-0x00,0x25,0x00,0xc8,0xff,0xdc,0x00,0x25,0x00,0xca,0xff,0xdc,0x00,0x25,0x00,0xcc,
-0xff,0xdc,0x00,0x25,0x00,0xce,0xff,0xdc,0x00,0x25,0x00,0xde,0xff,0xdc,0x00,0x25,
-0x00,0xe0,0xff,0xdc,0x00,0x25,0x00,0xe2,0xff,0xdc,0x00,0x25,0x00,0xe4,0xff,0xdc,
-0x00,0x25,0x01,0x0e,0xff,0xdc,0x00,0x25,0x01,0x10,0xff,0xdc,0x00,0x25,0x01,0x12,
-0xff,0xdc,0x00,0x25,0x01,0x1c,0xff,0xdc,0x00,0x25,0x01,0x1e,0xff,0xdc,0x00,0x25,
-0x01,0x20,0xff,0xdc,0x00,0x25,0x01,0x22,0xff,0xdc,0x00,0x25,0x01,0x36,0xff,0xb7,
-0x00,0x25,0x01,0x38,0xff,0x90,0x00,0x25,0x01,0x3a,0xff,0x90,0x00,0x25,0x01,0xac,
-0xff,0xdc,0x00,0x25,0x01,0xae,0xff,0xdc,0x00,0x25,0x01,0xda,0xff,0xdc,0x00,0x25,
-0x01,0xf0,0xff,0xdc,0x00,0x25,0x06,0x07,0xff,0xb7,0x00,0x25,0x06,0x09,0xff,0xb7,
-0x00,0x25,0x06,0x0b,0xff,0xb7,0x00,0x25,0x06,0x75,0xff,0x90,0x00,0x25,0x07,0x7d,
-0xff,0x90,0x00,0x25,0x07,0x7e,0xff,0x90,0x00,0x25,0x07,0x7f,0xff,0xad,0x00,0x26,
-0x00,0x3c,0xff,0xdc,0x00,0x26,0x00,0x6d,0xff,0xdc,0x00,0x26,0x00,0x7d,0xff,0xdc,
-0x00,0x26,0x00,0x9f,0xff,0xdc,0x00,0x26,0x01,0x38,0xff,0xdc,0x00,0x26,0x01,0x3a,
-0xff,0xdc,0x00,0x26,0x01,0xf4,0xff,0xdc,0x00,0x26,0x06,0x75,0xff,0xdc,0x00,0x26,
-0x07,0x7e,0x00,0x26,0x00,0x27,0x00,0x24,0xff,0xdc,0x00,0x27,0x00,0x39,0xff,0xdc,
-0x00,0x27,0x00,0x3c,0xff,0x90,0x00,0x27,0x00,0x6d,0xff,0xdc,0x00,0x27,0x00,0x7d,
-0xff,0xdc,0x00,0x27,0x00,0x82,0xff,0xdc,0x00,0x27,0x00,0x83,0xff,0xdc,0x00,0x27,
-0x00,0x84,0xff,0xdc,0x00,0x27,0x00,0x85,0xff,0xdc,0x00,0x27,0x00,0x86,0xff,0xdc,
-0x00,0x27,0x00,0x9f,0xff,0x90,0x00,0x27,0x00,0xc2,0xff,0xdc,0x00,0x27,0x00,0xc4,
-0xff,0xdc,0x00,0x27,0x00,0xc6,0xff,0xdc,0x00,0x27,0x01,0x38,0xff,0x90,0x00,0x27,
-0x01,0x3a,0xff,0x90,0x00,0x27,0x01,0xf4,0xff,0x90,0x00,0x27,0x06,0x75,0xff,0x90,
-0x00,0x27,0x07,0x7d,0xff,0xd3,0x00,0x27,0x07,0x7e,0xff,0xc9,0x00,0x27,0x07,0x7f,
-0xff,0x44,0x00,0x29,0x00,0x11,0xfe,0xb7,0x00,0x29,0x00,0x1d,0xff,0x61,0x00,0x29,
-0x00,0x24,0xff,0x44,0x00,0x29,0x00,0x36,0xff,0xdc,0x00,0x29,0x00,0x37,0xff,0xdc,
-0x00,0x29,0x00,0x44,0xff,0x44,0x00,0x29,0x00,0x48,0xff,0x90,0x00,0x29,0x00,0x4c,
-0xff,0x6b,0x00,0x29,0x00,0x52,0xff,0xb7,0x00,0x29,0x00,0x55,0xff,0x6b,0x00,0x29,
-0x00,0x58,0xff,0x90,0x00,0x29,0x00,0x5c,0xff,0x44,0x00,0x29,0x00,0x82,0xff,0x44,
-0x00,0x29,0x00,0x83,0xff,0x44,0x00,0x29,0x00,0x84,0xff,0x44,0x00,0x29,0x00,0x85,
-0xff,0x44,0x00,0x29,0x00,0x86,0xff,0x44,0x00,0x29,0x00,0xa2,0xff,0x44,0x00,0x29,
-0x00,0xa3,0xff,0x44,0x00,0x29,0x00,0xa4,0xff,0x44,0x00,0x29,0x00,0xa5,0xff,0x44,
-0x00,0x29,0x00,0xa6,0xff,0x44,0x00,0x29,0x00,0xa7,0xff,0x44,0x00,0x29,0x00,0xaa,
-0xff,0x90,0x00,0x29,0x00,0xab,0xff,0x90,0x00,0x29,0x00,0xac,0xff,0x90,0x00,0x29,
-0x00,0xad,0xff,0x90,0x00,0x29,0x00,0xb4,0xff,0xb7,0x00,0x29,0x00,0xb5,0xff,0xb7,
-0x00,0x29,0x00,0xb6,0xff,0xb7,0x00,0x29,0x00,0xb7,0xff,0xb7,0x00,0x29,0x00,0xb8,
-0xff,0xb7,0x00,0x29,0x00,0xbb,0xff,0x90,0x00,0x29,0x00,0xbc,0xff,0x90,0x00,0x29,
-0x00,0xbd,0xff,0x90,0x00,0x29,0x00,0xbe,0xff,0x90,0x00,0x29,0x00,0xbf,0xff,0x44,
-0x00,0x29,0x00,0xc1,0xff,0x44,0x00,0x29,0x00,0xc2,0xff,0x44,0x00,0x29,0x00,0xc3,
-0xff,0x44,0x00,0x29,0x00,0xc4,0xff,0x44,0x00,0x29,0x00,0xc5,0xff,0x44,0x00,0x29,
-0x00,0xc6,0xff,0x44,0x00,0x29,0x00,0xc7,0xff,0x44,0x00,0x29,0x00,0xd5,0xff,0x90,
-0x00,0x29,0x00,0xd7,0xff,0x90,0x00,0x29,0x00,0xd9,0xff,0x90,0x00,0x29,0x00,0xdb,
-0xff,0x90,0x00,0x29,0x00,0xdd,0xff,0x90,0x00,0x29,0x00,0xf1,0xff,0x6b,0x00,0x29,
-0x00,0xf5,0xff,0x6b,0x00,0x29,0x01,0x0f,0xff,0xb7,0x00,0x29,0x01,0x11,0xff,0xb7,
-0x00,0x29,0x01,0x13,0xff,0xb7,0x00,0x29,0x01,0x17,0xff,0x6b,0x00,0x29,0x01,0x19,
-0xff,0x6b,0x00,0x29,0x01,0x1b,0xff,0x6b,0x00,0x29,0x01,0x1c,0xff,0xdc,0x00,0x29,
-0x01,0x1e,0xff,0xdc,0x00,0x29,0x01,0x20,0xff,0xdc,0x00,0x29,0x01,0x22,0xff,0xdc,
-0x00,0x29,0x01,0x24,0xff,0xdc,0x00,0x29,0x01,0x26,0xff,0xdc,0x00,0x29,0x01,0x28,
-0xff,0xdc,0x00,0x29,0x01,0x2b,0xff,0x90,0x00,0x29,0x01,0x2d,0xff,0x90,0x00,0x29,
-0x01,0x2f,0xff,0x90,0x00,0x29,0x01,0x31,0xff,0x90,0x00,0x29,0x01,0x33,0xff,0x90,
-0x00,0x29,0x01,0x35,0xff,0x90,0x00,0x29,0x01,0x39,0xff,0x44,0x00,0x29,0x01,0xad,
-0xff,0xb7,0x00,0x29,0x01,0xaf,0xff,0xb7,0x00,0x29,0x01,0xda,0xff,0xdc,0x00,0x29,
-0x01,0xdc,0xff,0xdc,0x00,0x29,0x01,0xf1,0xff,0xb7,0x00,0x29,0x01,0xf5,0xff,0x44,
-0x00,0x29,0x06,0x76,0xff,0x44,0x00,0x29,0x07,0x7d,0xff,0xd3,0x00,0x29,0x07,0x7f,
-0xfe,0x88,0x00,0x2a,0x00,0x37,0xff,0xb7,0x00,0x2a,0x00,0x3c,0xff,0x9a,0x00,0x2a,
-0x00,0x6d,0xff,0xdc,0x00,0x2a,0x00,0x7d,0xff,0xdc,0x00,0x2a,0x00,0x9f,0xff,0x9a,
-0x00,0x2a,0x01,0x26,0xff,0xb7,0x00,0x2a,0x01,0x3a,0xff,0x9a,0x00,0x2a,0x07,0x7d,
-0xff,0xd3,0x00,0x2a,0x07,0x7e,0xff,0xd3,0x00,0x2a,0x07,0x7f,0xff,0xc9,0x00,0x2b,
-0x00,0x11,0xff,0xdc,0x00,0x2b,0x07,0x7d,0xff,0xb7,0x00,0x2b,0x07,0x7e,0xff,0xc1,
-0x00,0x2b,0x07,0x7f,0xff,0xb7,0x00,0x2d,0x00,0x10,0xff,0xb7,0x00,0x2d,0x00,0x24,
-0xff,0xdc,0x00,0x2d,0x00,0x6d,0xff,0xdc,0x00,0x2d,0x00,0x7d,0xff,0xdc,0x00,0x2d,
-0x00,0x82,0xff,0xdc,0x00,0x2d,0x00,0x83,0xff,0xdc,0x00,0x2d,0x00,0x84,0xff,0xdc,
-0x00,0x2d,0x00,0x85,0xff,0xdc,0x00,0x2d,0x00,0x86,0xff,0xdc,0x00,0x2d,0x07,0x7d,
-0xff,0xb7,0x00,0x2d,0x07,0x7e,0xff,0xc1,0x00,0x2d,0x07,0x7f,0xff,0x90,0x00,0x2e,
-0x00,0x10,0xff,0x29,0x00,0x2e,0x00,0x24,0xff,0xdc,0x00,0x2e,0x00,0x26,0xff,0x90,
-0x00,0x2e,0x00,0x32,0xff,0x90,0x00,0x2e,0x00,0x37,0xff,0x61,0x00,0x2e,0x00,0x38,
-0xff,0xc9,0x00,0x2e,0x00,0x3a,0xff,0xb7,0x00,0x2e,0x00,0x3c,0xff,0xb7,0x00,0x2e,
-0x00,0x44,0xff,0xdc,0x00,0x2e,0x00,0x48,0xff,0x9a,0x00,0x2e,0x00,0x52,0xff,0x9a,
-0x00,0x2e,0x00,0x58,0xff,0x9a,0x00,0x2e,0x00,0x5c,0xff,0x6b,0x00,0x2e,0x00,0x6d,
-0xff,0x7d,0x00,0x2e,0x00,0x82,0xff,0xdc,0x00,0x2e,0x00,0x83,0xff,0xdc,0x00,0x2e,
-0x00,0x84,0xff,0xdc,0x00,0x2e,0x00,0x85,0xff,0xdc,0x00,0x2e,0x00,0x86,0xff,0xdc,
-0x00,0x2e,0x00,0x89,0xff,0x90,0x00,0x2e,0x00,0x94,0xff,0x90,0x00,0x2e,0x00,0x95,
-0xff,0x90,0x00,0x2e,0x00,0x96,0xff,0x90,0x00,0x2e,0x00,0x97,0xff,0x90,0x00,0x2e,
-0x00,0x98,0xff,0x90,0x00,0x2e,0x00,0x9b,0xff,0xc9,0x00,0x2e,0x00,0x9c,0xff,0xc9,
-0x00,0x2e,0x00,0x9d,0xff,0xc9,0x00,0x2e,0x00,0x9e,0xff,0xc9,0x00,0x2e,0x00,0x9f,
-0xff,0xb7,0x00,0x2e,0x00,0xa2,0xff,0xdc,0x00,0x2e,0x00,0xa3,0xff,0xdc,0x00,0x2e,
-0x00,0xa4,0xff,0xdc,0x00,0x2e,0x00,0xa5,0xff,0xdc,0x00,0x2e,0x00,0xa6,0xff,0xdc,
-0x00,0x2e,0x00,0xa7,0xff,0xdc,0x00,0x2e,0x00,0xaa,0xff,0x9a,0x00,0x2e,0x00,0xab,
-0xff,0x9a,0x00,0x2e,0x00,0xac,0xff,0x9a,0x00,0x2e,0x00,0xad,0xff,0x9a,0x00,0x2e,
-0x00,0xb4,0xff,0x9a,0x00,0x2e,0x00,0xb5,0xff,0x9a,0x00,0x2e,0x00,0xb6,0xff,0x9a,
-0x00,0x2e,0x00,0xb7,0xff,0x9a,0x00,0x2e,0x00,0xb8,0xff,0x9a,0x00,0x2e,0x00,0xbb,
-0xff,0x9a,0x00,0x2e,0x00,0xbc,0xff,0x9a,0x00,0x2e,0x00,0xbd,0xff,0x9a,0x00,0x2e,
-0x00,0xbe,0xff,0x9a,0x00,0x2e,0x00,0xbf,0xff,0x6b,0x00,0x2e,0x00,0xc1,0xff,0x6b,
-0x00,0x2e,0x00,0xc8,0xff,0x90,0x00,0x2e,0x00,0xce,0xff,0x90,0x00,0x2e,0x00,0xdd,
-0xff,0x9a,0x00,0x2e,0x01,0x26,0xff,0x61,0x00,0x2e,0x01,0x30,0xff,0xc9,0x00,0x2e,
-0x01,0x31,0xff,0x9a,0x00,0x2e,0x01,0x3a,0xff,0xb7,0x00,0x2e,0x07,0x7d,0xff,0xc1,
-0x00,0x2e,0x07,0x7e,0xff,0xc1,0x00,0x2f,0x00,0x10,0xff,0xdc,0x00,0x2f,0x00,0x24,
-0x00,0x2f,0x00,0x2f,0x00,0x32,0xff,0xb7,0x00,0x2f,0x00,0x37,0xfe,0xe6,0x00,0x2f,
-0x00,0x38,0xff,0x9a,0x00,0x2f,0x00,0x39,0xff,0x1f,0x00,0x2f,0x00,0x3a,0xff,0x44,
-0x00,0x2f,0x00,0x3c,0xfe,0xf0,0x00,0x2f,0x00,0x48,0xff,0xdc,0x00,0x2f,0x00,0x52,
-0xff,0xdc,0x00,0x2f,0x00,0x58,0xff,0xdc,0x00,0x2f,0x00,0x5c,0xff,0x44,0x00,0x2f,
-0x00,0x82,0x00,0x2f,0x00,0x2f,0x00,0x83,0x00,0x2f,0x00,0x2f,0x00,0x84,0x00,0x2f,
-0x00,0x2f,0x00,0x85,0x00,0x2f,0x00,0x2f,0x00,0x86,0x00,0x2f,0x00,0x2f,0x00,0x94,
-0xff,0xb7,0x00,0x2f,0x00,0x95,0xff,0xb7,0x00,0x2f,0x00,0x96,0xff,0xb7,0x00,0x2f,
-0x00,0x97,0xff,0xb7,0x00,0x2f,0x00,0x98,0xff,0xb7,0x00,0x2f,0x00,0x9b,0xff,0x9a,
-0x00,0x2f,0x00,0x9c,0xff,0x9a,0x00,0x2f,0x00,0x9d,0xff,0x9a,0x00,0x2f,0x00,0x9e,
-0xff,0x9a,0x00,0x2f,0x00,0x9f,0xfe,0xf0,0x00,0x2f,0x00,0xaa,0xff,0xdc,0x00,0x2f,
-0x00,0xab,0xff,0xdc,0x00,0x2f,0x00,0xac,0xff,0xdc,0x00,0x2f,0x00,0xad,0xff,0xdc,
-0x00,0x2f,0x00,0xb4,0xff,0xdc,0x00,0x2f,0x00,0xb5,0xff,0xdc,0x00,0x2f,0x00,0xb6,
-0xff,0xdc,0x00,0x2f,0x00,0xb7,0xff,0xdc,0x00,0x2f,0x00,0xb8,0xff,0xdc,0x00,0x2f,
-0x00,0xbb,0xff,0xdc,0x00,0x2f,0x00,0xbc,0xff,0xdc,0x00,0x2f,0x00,0xbd,0xff,0xdc,
-0x00,0x2f,0x00,0xbe,0xff,0xdc,0x00,0x2f,0x00,0xbf,0xff,0x44,0x00,0x2f,0x00,0xc1,
-0xff,0x44,0x00,0x2f,0x00,0xdd,0xff,0xdc,0x00,0x2f,0x01,0x26,0xfe,0xe6,0x00,0x2f,
-0x01,0x30,0xff,0x9a,0x00,0x2f,0x01,0x31,0xff,0xdc,0x00,0x2f,0x01,0x3a,0xfe,0xf0,
-0x00,0x2f,0x07,0x7d,0xfe,0x61,0x00,0x2f,0x07,0x7e,0xfd,0xe6,0x00,0x32,0x00,0x10,
-0x00,0x39,0x00,0x32,0x00,0x11,0xff,0xad,0x00,0x32,0x00,0x1d,0xff,0xdc,0x00,0x32,
-0x00,0x24,0xff,0xdc,0x00,0x32,0x00,0x39,0xff,0xdc,0x00,0x32,0x00,0x3b,0xff,0x7d,
-0x00,0x32,0x00,0x3c,0xff,0x90,0x00,0x32,0x00,0x6d,0xff,0xdc,0x00,0x32,0x00,0x82,
-0xff,0xdc,0x00,0x32,0x00,0x83,0xff,0xdc,0x00,0x32,0x00,0x84,0xff,0xdc,0x00,0x32,
-0x00,0x85,0xff,0xdc,0x00,0x32,0x00,0x86,0xff,0xdc,0x00,0x32,0x00,0x9f,0xff,0x90,
-0x00,0x32,0x01,0x3a,0xff,0x90,0x00,0x32,0x07,0x7d,0xff,0xd3,0x00,0x32,0x07,0x7e,
-0xff,0xdc,0x00,0x32,0x07,0x7f,0xff,0x44,0x00,0x33,0x00,0x10,0xff,0xd3,0x00,0x33,
-0x00,0x11,0xfe,0xc1,0x00,0x33,0x00,0x24,0xff,0x7d,0x00,0x33,0x00,0x3c,0xff,0xd3,
-0x00,0x33,0x00,0x44,0xff,0xa4,0x00,0x33,0x00,0x48,0xff,0xb7,0x00,0x33,0x00,0x4c,
-0xff,0xd3,0x00,0x33,0x00,0x51,0xff,0xdc,0x00,0x33,0x00,0x52,0xff,0xb7,0x00,0x33,
-0x00,0x55,0xff,0xdc,0x00,0x33,0x00,0x56,0xff,0xdc,0x00,0x33,0x00,0x58,0xff,0xdc,
-0x00,0x33,0x00,0x6d,0xff,0xdc,0x00,0x33,0x00,0x82,0xff,0x7d,0x00,0x33,0x00,0x83,
-0xff,0x7d,0x00,0x33,0x00,0x84,0xff,0x7d,0x00,0x33,0x00,0x85,0xff,0x7d,0x00,0x33,
-0x00,0x86,0xff,0x7d,0x00,0x33,0x00,0x9f,0xff,0xd3,0x00,0x33,0x00,0xa2,0xff,0xa4,
-0x00,0x33,0x00,0xa3,0xff,0xa4,0x00,0x33,0x00,0xa4,0xff,0xa4,0x00,0x33,0x00,0xa5,
-0xff,0xa4,0x00,0x33,0x00,0xa6,0xff,0xa4,0x00,0x33,0x00,0xa7,0xff,0xa4,0x00,0x33,
-0x00,0xaa,0xff,0xb7,0x00,0x33,0x00,0xab,0xff,0xb7,0x00,0x33,0x00,0xac,0xff,0xb7,
-0x00,0x33,0x00,0xad,0xff,0xb7,0x00,0x33,0x00,0xb3,0xff,0xdc,0x00,0x33,0x00,0xb4,
-0xff,0xb7,0x00,0x33,0x00,0xb5,0xff,0xb7,0x00,0x33,0x00,0xb6,0xff,0xb7,0x00,0x33,
-0x00,0xb7,0xff,0xb7,0x00,0x33,0x00,0xb8,0xff,0xb7,0x00,0x33,0x00,0xbb,0xff,0xdc,
-0x00,0x33,0x00,0xbc,0xff,0xdc,0x00,0x33,0x00,0xbd,0xff,0xdc,0x00,0x33,0x00,0xbe,
-0xff,0xdc,0x00,0x33,0x00,0xdd,0xff,0xb7,0x00,0x33,0x01,0x0a,0xff,0xdc,0x00,0x33,
-0x01,0x17,0xff,0xdc,0x00,0x33,0x01,0x1b,0xff,0xdc,0x00,0x33,0x01,0x21,0xff,0xdc,
-0x00,0x33,0x01,0x23,0xff,0xdc,0x00,0x33,0x01,0x31,0xff,0xdc,0x00,0x33,0x01,0x3a,
-0xff,0xd3,0x00,0x33,0x07,0x7d,0x00,0x26,0x00,0x33,0x07,0x7e,0x00,0x26,0x00,0x33,
-0x07,0x7f,0xfe,0xb7,0x00,0x34,0x00,0x10,0x00,0x39,0x00,0x34,0x07,0x7d,0xff,0xd3,
-0x00,0x34,0x07,0x7e,0xff,0xdc,0x00,0x34,0x07,0x7f,0xff,0x7d,0x00,0x35,0x00,0x10,
-0xff,0xad,0x00,0x35,0x00,0x11,0xff,0xb7,0x00,0x35,0x00,0x1d,0xff,0xc1,0x00,0x35,
-0x00,0x24,0xff,0xad,0x00,0x35,0x00,0x26,0xff,0x9a,0x00,0x35,0x00,0x37,0xff,0x6b,
-0x00,0x35,0x00,0x39,0xff,0x90,0x00,0x35,0x00,0x3a,0xff,0xad,0x00,0x35,0x00,0x3c,
-0xff,0x7d,0x00,0x35,0x00,0x44,0xff,0xd3,0x00,0x35,0x00,0x48,0xff,0xa4,0x00,0x35,
-0x00,0x52,0xff,0xa4,0x00,0x35,0x00,0x58,0xff,0xa4,0x00,0x35,0x00,0x5c,0xff,0x90,
-0x00,0x35,0x00,0x6d,0xff,0x90,0x00,0x35,0x00,0x7d,0xff,0xdc,0x00,0x35,0x00,0x82,
-0xff,0xad,0x00,0x35,0x00,0x83,0xff,0xad,0x00,0x35,0x00,0x84,0xff,0xad,0x00,0x35,
-0x00,0x85,0xff,0xad,0x00,0x35,0x00,0x86,0xff,0xad,0x00,0x35,0x00,0x89,0xff,0x9a,
-0x00,0x35,0x00,0x9f,0xff,0x7d,0x00,0x35,0x00,0xa2,0xff,0xd3,0x00,0x35,0x00,0xa3,
-0xff,0xd3,0x00,0x35,0x00,0xa4,0xff,0xd3,0x00,0x35,0x00,0xa5,0xff,0xd3,0x00,0x35,
-0x00,0xa6,0xff,0xd3,0x00,0x35,0x00,0xa7,0xff,0xd3,0x00,0x35,0x00,0xaa,0xff,0xa4,
-0x00,0x35,0x00,0xab,0xff,0xa4,0x00,0x35,0x00,0xac,0xff,0xa4,0x00,0x35,0x00,0xad,
-0xff,0xa4,0x00,0x35,0x00,0xb4,0xff,0xa4,0x00,0x35,0x00,0xb5,0xff,0xa4,0x00,0x35,
-0x00,0xb6,0xff,0xa4,0x00,0x35,0x00,0xb7,0xff,0xa4,0x00,0x35,0x00,0xb8,0xff,0xa4,
-0x00,0x35,0x00,0xbb,0xff,0xa4,0x00,0x35,0x00,0xbc,0xff,0xa4,0x00,0x35,0x00,0xbd,
-0xff,0xa4,0x00,0x35,0x00,0xbe,0xff,0xa4,0x00,0x35,0x00,0xbf,0xff,0x90,0x00,0x35,
-0x00,0xc1,0xff,0x90,0x00,0x35,0x00,0xc8,0xff,0x9a,0x00,0x35,0x00,0xce,0xff,0x9a,
-0x00,0x35,0x00,0xdd,0xff,0xa4,0x00,0x35,0x01,0x26,0xff,0x6b,0x00,0x35,0x01,0x31,
-0xff,0xa4,0x00,0x35,0x01,0x3a,0xff,0x7d,0x00,0x35,0x07,0x7d,0xff,0x6b,0x00,0x35,
-0x07,0x7e,0xff,0x7d,0x00,0x35,0x07,0x7f,0xff,0xdc,0x00,0x36,0x00,0x24,0x00,0x26,
-0x00,0x36,0x00,0x82,0x00,0x26,0x00,0x36,0x00,0x83,0x00,0x26,0x00,0x36,0x00,0x84,
-0x00,0x26,0x00,0x36,0x00,0x85,0x00,0x26,0x00,0x36,0x00,0x86,0x00,0x26,0x00,0x37,
-0x00,0x10,0xff,0x44,0x00,0x37,0x00,0x11,0xff,0x0d,0x00,0x37,0x00,0x1d,0xff,0x1f,
-0x00,0x37,0x00,0x24,0xff,0x61,0x00,0x37,0x00,0x26,0xff,0x88,0x00,0x37,0x00,0x37,
-0xff,0xdc,0x00,0x37,0x00,0x44,0xfe,0xad,0x00,0x37,0x00,0x46,0xfe,0xa4,0x00,0x37,
-0x00,0x48,0xfe,0xa4,0x00,0x37,0x00,0x4c,0xff,0xc1,0x00,0x37,0x00,0x52,0xfe,0xa4,
-0x00,0x37,0x00,0x55,0xfe,0xd3,0x00,0x37,0x00,0x56,0xfe,0xad,0x00,0x37,0x00,0x58,
-0xfe,0xc9,0x00,0x37,0x00,0x5a,0xfe,0xad,0x00,0x37,0x00,0x5c,0xfe,0xc1,0x00,0x37,
-0x00,0x6d,0xff,0x44,0x00,0x37,0x00,0x7d,0xff,0x90,0x00,0x37,0x00,0x82,0xff,0x61,
-0x00,0x37,0x00,0x83,0xff,0x61,0x00,0x37,0x00,0x84,0xff,0x61,0x00,0x37,0x00,0x85,
-0xff,0x61,0x00,0x37,0x00,0x86,0xff,0x61,0x00,0x37,0x00,0x89,0xff,0x88,0x00,0x37,
-0x00,0xa2,0xfe,0xad,0x00,0x37,0x00,0xa3,0xfe,0xad,0x00,0x37,0x00,0xa4,0xfe,0xad,
-0x00,0x37,0x00,0xa5,0xfe,0xad,0x00,0x37,0x00,0xa6,0xfe,0xad,0x00,0x37,0x00,0xa7,
-0xfe,0xad,0x00,0x37,0x00,0xa9,0xfe,0xa4,0x00,0x37,0x00,0xaa,0xfe,0xa4,0x00,0x37,
-0x00,0xab,0xfe,0xa4,0x00,0x37,0x00,0xac,0xfe,0xa4,0x00,0x37,0x00,0xad,0xfe,0xa4,
-0x00,0x37,0x00,0xb4,0xfe,0xa4,0x00,0x37,0x00,0xb5,0xfe,0xa4,0x00,0x37,0x00,0xb6,
-0xfe,0xa4,0x00,0x37,0x00,0xb7,0xfe,0xa4,0x00,0x37,0x00,0xb8,0xfe,0xa4,0x00,0x37,
-0x00,0xbb,0xfe,0xc9,0x00,0x37,0x00,0xbc,0xfe,0xc9,0x00,0x37,0x00,0xbd,0xfe,0xc9,
-0x00,0x37,0x00,0xbe,0xfe,0xc9,0x00,0x37,0x00,0xbf,0xfe,0xc1,0x00,0x37,0x00,0xc1,
-0xfe,0xc1,0x00,0x37,0x00,0xc8,0xff,0x88,0x00,0x37,0x00,0xc9,0xfe,0xa4,0x00,0x37,
-0x00,0xce,0xff,0x88,0x00,0x37,0x00,0xcf,0xfe,0xa4,0x00,0x37,0x00,0xdd,0xfe,0xa4,
-0x00,0x37,0x01,0x17,0xfe,0xd3,0x00,0x37,0x01,0x1b,0xfe,0xd3,0x00,0x37,0x01,0x21,
-0xfe,0xad,0x00,0x37,0x01,0x23,0xfe,0xad,0x00,0x37,0x01,0x26,0xff,0xdc,0x00,0x37,
-0x01,0x31,0xfe,0xc9,0x00,0x37,0x07,0x7e,0xff,0xd3,0x00,0x37,0x07,0x7f,0xfe,0xf8,
-0x00,0x38,0x00,0x3d,0xff,0xdc,0x00,0x38,0x01,0x3f,0xff,0xdc,0x00,0x39,0x00,0x10,
-0xff,0x88,0x00,0x39,0x00,0x11,0xfe,0xf8,0x00,0x39,0x00,0x1d,0xff,0x59,0x00,0x39,
-0x00,0x24,0xff,0x7d,0x00,0x39,0x00,0x32,0xff,0xdc,0x00,0x39,0x00,0x44,0xff,0x61,
-0x00,0x39,0x00,0x48,0xff,0x61,0x00,0x39,0x00,0x4c,0xff,0xd3,0x00,0x39,0x00,0x52,
-0xff,0x61,0x00,0x39,0x00,0x58,0xff,0x75,0x00,0x39,0x00,0x5c,0xff,0xc9,0x00,0x39,
-0x00,0x6d,0xff,0x4e,0x00,0x39,0x00,0x7d,0xff,0x90,0x00,0x39,0x00,0x82,0xff,0x7d,
-0x00,0x39,0x00,0x83,0xff,0x7d,0x00,0x39,0x00,0x84,0xff,0x7d,0x00,0x39,0x00,0x85,
-0xff,0x7d,0x00,0x39,0x00,0x86,0xff,0x7d,0x00,0x39,0x00,0x94,0xff,0xdc,0x00,0x39,
-0x00,0x95,0xff,0xdc,0x00,0x39,0x00,0x96,0xff,0xdc,0x00,0x39,0x00,0x97,0xff,0xdc,
-0x00,0x39,0x00,0x98,0xff,0xdc,0x00,0x39,0x00,0xa2,0xff,0x61,0x00,0x39,0x00,0xa3,
-0xff,0x61,0x00,0x39,0x00,0xa4,0xff,0x61,0x00,0x39,0x00,0xa5,0xff,0x61,0x00,0x39,
-0x00,0xa6,0xff,0x61,0x00,0x39,0x00,0xa7,0xff,0x61,0x00,0x39,0x00,0xaa,0xff,0x61,
-0x00,0x39,0x00,0xab,0xff,0x61,0x00,0x39,0x00,0xac,0xff,0x61,0x00,0x39,0x00,0xad,
-0xff,0x61,0x00,0x39,0x00,0xb4,0xff,0x61,0x00,0x39,0x00,0xb5,0xff,0x61,0x00,0x39,
-0x00,0xb6,0xff,0x61,0x00,0x39,0x00,0xb7,0xff,0x61,0x00,0x39,0x00,0xb8,0xff,0x61,
-0x00,0x39,0x00,0xbb,0xff,0x75,0x00,0x39,0x00,0xbc,0xff,0x75,0x00,0x39,0x00,0xbd,
-0xff,0x75,0x00,0x39,0x00,0xbe,0xff,0x75,0x00,0x39,0x00,0xbf,0xff,0xc9,0x00,0x39,
-0x00,0xc1,0xff,0xc9,0x00,0x39,0x00,0xdd,0xff,0x61,0x00,0x39,0x01,0x31,0xff,0x75,
-0x00,0x39,0x07,0x7f,0xfe,0xe6,0x00,0x3a,0x00,0x10,0xff,0xad,0x00,0x3a,0x00,0x11,
-0xff,0x15,0x00,0x3a,0x00,0x1d,0xff,0x88,0x00,0x3a,0x00,0x24,0xff,0x90,0x00,0x3a,
-0x00,0x44,0xff,0x7d,0x00,0x3a,0x00,0x48,0xff,0x88,0x00,0x3a,0x00,0x4c,0xff,0xd3,
-0x00,0x3a,0x00,0x52,0xff,0x88,0x00,0x3a,0x00,0x55,0xff,0xa4,0x00,0x3a,0x00,0x58,
-0xff,0xb7,0x00,0x3a,0x00,0x5c,0xff,0xdc,0x00,0x3a,0x00,0x6d,0xff,0x90,0x00,0x3a,
-0x00,0x7d,0xff,0xdc,0x00,0x3a,0x00,0x82,0xff,0x90,0x00,0x3a,0x00,0x83,0xff,0x90,
-0x00,0x3a,0x00,0x84,0xff,0x90,0x00,0x3a,0x00,0x85,0xff,0x90,0x00,0x3a,0x00,0x86,
-0xff,0x90,0x00,0x3a,0x00,0xa2,0xff,0x7d,0x00,0x3a,0x00,0xa3,0xff,0x7d,0x00,0x3a,
-0x00,0xa4,0xff,0x7d,0x00,0x3a,0x00,0xa5,0xff,0x7d,0x00,0x3a,0x00,0xa6,0xff,0x7d,
-0x00,0x3a,0x00,0xa7,0xff,0x7d,0x00,0x3a,0x00,0xaa,0xff,0x88,0x00,0x3a,0x00,0xab,
-0xff,0x88,0x00,0x3a,0x00,0xac,0xff,0x88,0x00,0x3a,0x00,0xad,0xff,0x88,0x00,0x3a,
-0x00,0xb4,0xff,0x88,0x00,0x3a,0x00,0xb5,0xff,0x88,0x00,0x3a,0x00,0xb6,0xff,0x88,
-0x00,0x3a,0x00,0xb7,0xff,0x88,0x00,0x3a,0x00,0xb8,0xff,0x88,0x00,0x3a,0x00,0xbb,
-0xff,0xb7,0x00,0x3a,0x00,0xbc,0xff,0xb7,0x00,0x3a,0x00,0xbd,0xff,0xb7,0x00,0x3a,
-0x00,0xbe,0xff,0xb7,0x00,0x3a,0x00,0xbf,0xff,0xdc,0x00,0x3a,0x00,0xc1,0xff,0xdc,
-0x00,0x3a,0x00,0xdd,0xff,0x88,0x00,0x3a,0x01,0x17,0xff,0xa4,0x00,0x3a,0x01,0x1b,
-0xff,0xa4,0x00,0x3a,0x01,0x31,0xff,0xb7,0x00,0x3a,0x07,0x7d,0xff,0xdc,0x00,0x3a,
-0x07,0x7f,0xfe,0xf8,0x00,0x3b,0x00,0x10,0xff,0x9a,0x00,0x3b,0x00,0x26,0xff,0x6b,
-0x00,0x3b,0x00,0x32,0xff,0x7d,0x00,0x3b,0x00,0x37,0xff,0xdc,0x00,0x3b,0x00,0x48,
-0xff,0xa4,0x00,0x3b,0x00,0x6d,0xff,0x90,0x00,0x3b,0x00,0x89,0xff,0x6b,0x00,0x3b,
-0x00,0x94,0xff,0x7d,0x00,0x3b,0x00,0x95,0xff,0x7d,0x00,0x3b,0x00,0x96,0xff,0x7d,
-0x00,0x3b,0x00,0x97,0xff,0x7d,0x00,0x3b,0x00,0x98,0xff,0x7d,0x00,0x3b,0x00,0xaa,
-0xff,0xa4,0x00,0x3b,0x00,0xab,0xff,0xa4,0x00,0x3b,0x00,0xac,0xff,0xa4,0x00,0x3b,
-0x00,0xad,0xff,0xa4,0x00,0x3b,0x00,0xc8,0xff,0x6b,0x00,0x3b,0x00,0xce,0xff,0x6b,
-0x00,0x3b,0x00,0xdd,0xff,0xa4,0x00,0x3b,0x01,0x26,0xff,0xdc,0x00,0x3b,0x07,0x7d,
-0xff,0x61,0x00,0x3b,0x07,0x7e,0xff,0xad,0x00,0x3b,0x07,0x7f,0xff,0xd3,0x00,0x3c,
-0x00,0x10,0xff,0x0d,0x00,0x3c,0x00,0x11,0xfe,0x61,0x00,0x3c,0x00,0x1d,0xfe,0xf0,
-0x00,0x3c,0x00,0x24,0xff,0x61,0x00,0x3c,0x00,0x26,0xff,0x90,0x00,0x3c,0x00,0x32,
-0xff,0x90,0x00,0x3c,0x00,0x44,0xfe,0xe6,0x00,0x3c,0x00,0x48,0xfe,0xf0,0x00,0x3c,
-0x00,0x4c,0xff,0xb7,0x00,0x3c,0x00,0x52,0xfe,0xf0,0x00,0x3c,0x00,0x58,0xff,0x15,
-0x00,0x3c,0x00,0x6d,0xff,0x1f,0x00,0x3c,0x00,0x7d,0xff,0x6b,0x00,0x3c,0x00,0x82,
-0xff,0x61,0x00,0x3c,0x00,0x83,0xff,0x61,0x00,0x3c,0x00,0x84,0xff,0x61,0x00,0x3c,
-0x00,0x85,0xff,0x61,0x00,0x3c,0x00,0x86,0xff,0x61,0x00,0x3c,0x00,0x89,0xff,0x90,
-0x00,0x3c,0x00,0x94,0xff,0x90,0x00,0x3c,0x00,0x95,0xff,0x90,0x00,0x3c,0x00,0x96,
-0xff,0x90,0x00,0x3c,0x00,0x97,0xff,0x90,0x00,0x3c,0x00,0x98,0xff,0x90,0x00,0x3c,
-0x00,0xa2,0xfe,0xe6,0x00,0x3c,0x00,0xa3,0xfe,0xe6,0x00,0x3c,0x00,0xa4,0xfe,0xe6,
-0x00,0x3c,0x00,0xa5,0xfe,0xe6,0x00,0x3c,0x00,0xa6,0xfe,0xe6,0x00,0x3c,0x00,0xa7,
-0xfe,0xe6,0x00,0x3c,0x00,0xaa,0xfe,0xf0,0x00,0x3c,0x00,0xab,0xfe,0xf0,0x00,0x3c,
-0x00,0xac,0xfe,0xf0,0x00,0x3c,0x00,0xad,0xfe,0xf0,0x00,0x3c,0x00,0xb4,0xfe,0xf0,
-0x00,0x3c,0x00,0xb5,0xfe,0xf0,0x00,0x3c,0x00,0xb6,0xfe,0xf0,0x00,0x3c,0x00,0xb7,
-0xfe,0xf0,0x00,0x3c,0x00,0xb8,0xfe,0xf0,0x00,0x3c,0x00,0xbb,0xff,0x15,0x00,0x3c,
-0x00,0xbc,0xff,0x15,0x00,0x3c,0x00,0xbd,0xff,0x15,0x00,0x3c,0x00,0xbe,0xff,0x15,
-0x00,0x3c,0x00,0xc8,0xff,0x90,0x00,0x3c,0x00,0xce,0xff,0x90,0x00,0x3c,0x00,0xdd,
-0xfe,0xf0,0x00,0x3c,0x01,0x31,0xff,0x15,0x00,0x3c,0x07,0x7d,0xff,0x90,0x00,0x3c,
-0x07,0x7e,0xff,0xdc,0x00,0x3c,0x07,0x7f,0xfe,0xf8,0x00,0x3d,0x00,0x10,0xff,0xdc,
-0x00,0x3d,0x07,0x7d,0xff,0xdc,0x00,0x3d,0x07,0x7e,0xff,0xdc,0x00,0x3d,0x07,0x7f,
-0xff,0xdc,0x00,0x48,0x00,0x5b,0xff,0xdc,0x00,0x49,0x00,0x10,0xff,0x90,0x00,0x49,
-0x00,0x11,0xff,0x6b,0x00,0x49,0x00,0x1d,0xff,0xb7,0x00,0x49,0x00,0x57,0xff,0xdc,
-0x00,0x49,0x00,0x5a,0xff,0xdc,0x00,0x49,0x00,0x5c,0xff,0xdc,0x00,0x49,0x00,0x6d,
-0xff,0xb7,0x00,0x49,0x00,0x7d,0xff,0xdc,0x00,0x49,0x00,0xbf,0xff,0xdc,0x00,0x49,
-0x00,0xc1,0xff,0xdc,0x00,0x49,0x01,0x27,0xff,0xdc,0x00,0x49,0x07,0x7d,0x00,0x41,
-0x00,0x49,0x07,0x7f,0xff,0x15,0x00,0x4e,0x00,0x44,0xff,0xdc,0x00,0x4e,0x00,0x48,
-0xff,0xb7,0x00,0x4e,0x00,0x52,0xff,0xb7,0x00,0x4e,0x00,0x58,0xff,0xc1,0x00,0x4e,
-0x00,0x5c,0xff,0xb7,0x00,0x4e,0x00,0xa2,0xff,0xdc,0x00,0x4e,0x00,0xa3,0xff,0xdc,
-0x00,0x4e,0x00,0xa4,0xff,0xdc,0x00,0x4e,0x00,0xa5,0xff,0xdc,0x00,0x4e,0x00,0xa6,
-0xff,0xdc,0x00,0x4e,0x00,0xa7,0xff,0xdc,0x00,0x4e,0x00,0xaa,0xff,0xb7,0x00,0x4e,
-0x00,0xab,0xff,0xb7,0x00,0x4e,0x00,0xac,0xff,0xb7,0x00,0x4e,0x00,0xad,0xff,0xb7,
-0x00,0x4e,0x00,0xb4,0xff,0xb7,0x00,0x4e,0x00,0xb5,0xff,0xb7,0x00,0x4e,0x00,0xb6,
-0xff,0xb7,0x00,0x4e,0x00,0xb7,0xff,0xb7,0x00,0x4e,0x00,0xb8,0xff,0xb7,0x00,0x4e,
-0x00,0xbb,0xff,0xc1,0x00,0x4e,0x00,0xbc,0xff,0xc1,0x00,0x4e,0x00,0xbd,0xff,0xc1,
-0x00,0x4e,0x00,0xbe,0xff,0xc1,0x00,0x4e,0x00,0xbf,0xff,0xb7,0x00,0x4e,0x00,0xc1,
-0xff,0xb7,0x00,0x4e,0x00,0xdd,0xff,0xb7,0x00,0x4e,0x01,0x31,0xff,0xc1,0x00,0x51,
-0x07,0x7d,0xff,0x6b,0x00,0x51,0x07,0x7e,0xff,0x90,0x00,0x51,0x07,0x7f,0xff,0xa4,
-0x00,0x52,0x00,0x10,0x00,0x26,0x00,0x52,0x00,0x11,0xff,0xdc,0x00,0x52,0x00,0x5b,
-0xff,0xc1,0x00,0x52,0x07,0x7d,0xff,0x6b,0x00,0x52,0x07,0x7e,0xff,0xb7,0x00,0x52,
-0x07,0x7f,0xff,0x7d,0x00,0x55,0x00,0x10,0xff,0x7d,0x00,0x55,0x00,0x11,0xff,0x44,
-0x00,0x55,0x00,0x1d,0xff,0xdc,0x00,0x55,0x00,0x46,0xff,0xd3,0x00,0x55,0x00,0x47,
-0xff,0xdc,0x00,0x55,0x00,0x48,0xff,0xd3,0x00,0x55,0x00,0x4a,0xff,0xdc,0x00,0x55,
-0x00,0x4b,0xff,0xdc,0x00,0x55,0x00,0x50,0xff,0xdc,0x00,0x55,0x00,0x51,0xff,0xdc,
-0x00,0x55,0x00,0x52,0xff,0xd3,0x00,0x55,0x00,0x54,0xff,0xdc,0x00,0x55,0x00,0x55,
-0xff,0xdc,0x00,0x55,0x00,0x5b,0xff,0xc9,0x00,0x55,0x00,0x6d,0xff,0xb7,0x00,0x55,
-0x00,0xa9,0xff,0xd3,0x00,0x55,0x00,0xaa,0xff,0xd3,0x00,0x55,0x00,0xab,0xff,0xd3,
-0x00,0x55,0x00,0xac,0xff,0xd3,0x00,0x55,0x00,0xad,0xff,0xd3,0x00,0x55,0x00,0xb3,
-0xff,0xdc,0x00,0x55,0x00,0xb4,0xff,0xd3,0x00,0x55,0x00,0xb5,0xff,0xd3,0x00,0x55,
-0x00,0xb6,0xff,0xd3,0x00,0x55,0x00,0xb7,0xff,0xd3,0x00,0x55,0x00,0xb8,0xff,0xd3,
-0x00,0x55,0x00,0xc9,0xff,0xd3,0x00,0x55,0x00,0xcf,0xff,0xd3,0x00,0x55,0x00,0xd1,
-0x00,0x48,0x00,0x55,0x00,0xdd,0xff,0xd3,0x00,0x55,0x00,0xe1,0xff,0xdc,0x00,0x55,
-0x01,0x0a,0xff,0xdc,0x00,0x55,0x01,0x17,0xff,0xdc,0x00,0x55,0x01,0x1b,0xff,0xdc,
-0x00,0x55,0x07,0x7e,0x00,0x56,0x00,0x55,0x07,0x7f,0xfe,0xc9,0x00,0x59,0x00,0x10,
-0xff,0xc9,0x00,0x59,0x00,0x11,0xff,0x61,0x00,0x59,0x00,0x1d,0xff,0x90,0x00,0x59,
-0x00,0x6d,0xff,0xdc,0x00,0x59,0x00,0x7d,0xff,0xdc,0x00,0x59,0x07,0x7e,0xff,0xdc,
-0x00,0x59,0x07,0x7f,0xfe,0xf0,0x00,0x5a,0x00,0x11,0xff,0x44,0x00,0x5a,0x00,0x1d,
-0xff,0x90,0x00,0x5a,0x00,0x6d,0xff,0xdc,0x00,0x5a,0x00,0x7d,0xff,0xdc,0x00,0x5a,
-0x07,0x7f,0xff,0x29,0x00,0x5b,0x00,0x46,0xff,0xdc,0x00,0x5b,0x00,0x48,0xff,0xc1,
-0x00,0x5b,0x00,0x52,0xff,0xc1,0x00,0x5b,0x00,0xa9,0xff,0xdc,0x00,0x5b,0x00,0xaa,
-0xff,0xc1,0x00,0x5b,0x00,0xab,0xff,0xc1,0x00,0x5b,0x00,0xac,0xff,0xc1,0x00,0x5b,
-0x00,0xad,0xff,0xc1,0x00,0x5b,0x00,0xb4,0xff,0xc1,0x00,0x5b,0x00,0xb5,0xff,0xc1,
-0x00,0x5b,0x00,0xb6,0xff,0xc1,0x00,0x5b,0x00,0xb7,0xff,0xc1,0x00,0x5b,0x00,0xb8,
-0xff,0xc1,0x00,0x5b,0x00,0xc9,0xff,0xdc,0x00,0x5b,0x00,0xcf,0xff,0xdc,0x00,0x5b,
-0x00,0xdd,0xff,0xc1,0x00,0x5c,0x00,0x10,0xff,0xdc,0x00,0x5c,0x00,0x11,0xfe,0xdc,
-0x00,0x5c,0x00,0x1d,0xff,0x6b,0x00,0x5c,0x00,0x6d,0xff,0xdc,0x00,0x5c,0x00,0x7d,
-0xff,0xdc,0x00,0x5c,0x07,0x7f,0xfe,0xd3,0x00,0x6d,0x00,0x25,0xff,0xdc,0x00,0x6d,
-0x00,0x26,0xff,0xdc,0x00,0x6d,0x00,0x27,0xff,0xdc,0x00,0x6d,0x00,0x2a,0xff,0xdc,
-0x00,0x6d,0x00,0x2d,0xff,0xdc,0x00,0x6d,0x00,0x37,0xff,0x90,0x00,0x6d,0x00,0x39,
-0xff,0x90,0x00,0x6d,0x00,0x3a,0xff,0xdc,0x00,0x6d,0x00,0x3c,0xff,0x6b,0x00,0x6d,
-0x00,0x59,0xff,0xdc,0x00,0x6d,0x00,0x5a,0xff,0xdc,0x00,0x6d,0x00,0x5c,0xff,0xdc,
-0x00,0x6d,0x00,0x88,0x00,0x97,0x00,0x6d,0x00,0x89,0xff,0xdc,0x00,0x6d,0x00,0x9f,
-0xff,0x6b,0x00,0x6d,0x00,0xbf,0xff,0xdc,0x00,0x6d,0x00,0xc1,0xff,0xdc,0x00,0x6d,
-0x00,0xc8,0xff,0xdc,0x00,0x6d,0x00,0xce,0xff,0xdc,0x00,0x6d,0x00,0xd0,0xff,0xdc,
-0x00,0x6d,0x00,0xe0,0xff,0xdc,0x00,0x6d,0x01,0x26,0xff,0x90,0x00,0x6d,0x01,0x3a,
-0xff,0x6b,0x00,0x7d,0x00,0x24,0xff,0xb7,0x00,0x7d,0x00,0x25,0xff,0xb7,0x00,0x7d,
-0x00,0x26,0xff,0xdc,0x00,0x7d,0x00,0x27,0xff,0xdc,0x00,0x7d,0x00,0x2d,0xff,0xdc,
-0x00,0x7d,0x00,0x32,0xff,0xdc,0x00,0x7d,0x00,0x37,0xff,0x44,0x00,0x7d,0x00,0x39,
-0xff,0x4e,0x00,0x7d,0x00,0x3a,0xff,0x90,0x00,0x7d,0x00,0x3b,0xff,0x90,0x00,0x7d,
-0x00,0x3c,0xff,0x1f,0x00,0x7d,0x00,0x59,0xff,0xdc,0x00,0x7d,0x00,0x5a,0xff,0xdc,
-0x00,0x7d,0x00,0x5c,0xff,0xdc,0x00,0x7d,0x00,0x82,0xff,0xb7,0x00,0x7d,0x00,0x83,
-0xff,0xb7,0x00,0x7d,0x00,0x84,0xff,0xb7,0x00,0x7d,0x00,0x85,0xff,0xb7,0x00,0x7d,
-0x00,0x86,0xff,0xb7,0x00,0x7d,0x00,0x89,0xff,0xdc,0x00,0x7d,0x00,0x94,0xff,0xdc,
-0x00,0x7d,0x00,0x95,0xff,0xdc,0x00,0x7d,0x00,0x96,0xff,0xdc,0x00,0x7d,0x00,0x97,
-0xff,0xdc,0x00,0x7d,0x00,0x98,0xff,0xdc,0x00,0x7d,0x00,0x9f,0xff,0x1f,0x00,0x7d,
-0x00,0xbf,0xff,0xdc,0x00,0x7d,0x00,0xc1,0xff,0xdc,0x00,0x7d,0x00,0xc8,0xff,0xdc,
-0x00,0x7d,0x00,0xce,0xff,0xdc,0x00,0x7d,0x00,0xd0,0xff,0xdc,0x00,0x7d,0x01,0x26,
-0xff,0x44,0x00,0x7d,0x01,0x3a,0xff,0x1f,0x00,0x82,0x00,0x10,0xff,0xd3,0x00,0x82,
-0x00,0x11,0xff,0xdc,0x00,0x82,0x00,0x1d,0xff,0xdc,0x00,0x82,0x00,0x24,0x00,0x39,
-0x00,0x82,0x00,0x26,0xff,0xdc,0x00,0x82,0x00,0x2a,0xff,0xdc,0x00,0x82,0x00,0x32,
-0xff,0xdc,0x00,0x82,0x00,0x34,0xff,0xdc,0x00,0x82,0x00,0x37,0xff,0x61,0x00,0x82,
-0x00,0x39,0xff,0x7d,0x00,0x82,0x00,0x3a,0xff,0x90,0x00,0x82,0x00,0x3c,0xff,0x61,
-0x00,0x82,0x00,0x46,0xff,0xdc,0x00,0x82,0x00,0x47,0xff,0xdc,0x00,0x82,0x00,0x48,
-0xff,0xdc,0x00,0x82,0x00,0x49,0xff,0xb7,0x00,0x82,0x00,0x52,0xff,0xdc,0x00,0x82,
-0x00,0x54,0xff,0xdc,0x00,0x82,0x00,0x57,0xff,0xdc,0x00,0x82,0x00,0x59,0xff,0x88,
-0x00,0x82,0x00,0x5a,0xff,0xad,0x00,0x82,0x00,0x5c,0xff,0x75,0x00,0x82,0x00,0x6d,
-0xff,0xb7,0x00,0x82,0x00,0x82,0x00,0x39,0x00,0x82,0x00,0x83,0x00,0x39,0x00,0x82,
-0x00,0x84,0x00,0x39,0x00,0x82,0x00,0x85,0x00,0x39,0x00,0x82,0x00,0x86,0x00,0x39,
-0x00,0x82,0x00,0x89,0xff,0xdc,0x00,0x82,0x00,0x94,0xff,0xdc,0x00,0x82,0x00,0x95,
-0xff,0xdc,0x00,0x82,0x00,0x96,0xff,0xdc,0x00,0x82,0x00,0x97,0xff,0xdc,0x00,0x82,
-0x00,0x98,0xff,0xdc,0x00,0x82,0x00,0x9f,0xff,0x61,0x00,0x82,0x00,0xa9,0xff,0xdc,
-0x00,0x82,0x00,0xaa,0xff,0xdc,0x00,0x82,0x00,0xab,0xff,0xdc,0x00,0x82,0x00,0xac,
-0xff,0xdc,0x00,0x82,0x00,0xad,0xff,0xdc,0x00,0x82,0x00,0xb4,0xff,0xdc,0x00,0x82,
-0x00,0xb5,0xff,0xdc,0x00,0x82,0x00,0xb6,0xff,0xdc,0x00,0x82,0x00,0xb7,0xff,0xdc,
-0x00,0x82,0x00,0xb8,0xff,0xdc,0x00,0x82,0x00,0xbf,0xff,0x75,0x00,0x82,0x00,0xc1,
-0xff,0x75,0x00,0x82,0x00,0xc2,0x00,0x39,0x00,0x82,0x00,0xc4,0x00,0x39,0x00,0x82,
-0x00,0xc6,0x00,0x39,0x00,0x82,0x00,0xc8,0xff,0xdc,0x00,0x82,0x00,0xc9,0xff,0xdc,
-0x00,0x82,0x00,0xca,0xff,0xdc,0x00,0x82,0x00,0xcc,0xff,0xdc,0x00,0x82,0x00,0xcd,
-0xff,0xdc,0x00,0x82,0x00,0xce,0xff,0xdc,0x00,0x82,0x00,0xcf,0xff,0xdc,0x00,0x82,
-0x00,0xd1,0xff,0xdc,0x00,0x82,0x00,0xd5,0xff,0xdc,0x00,0x82,0x00,0xd7,0xff,0xdc,
-0x00,0x82,0x00,0xd9,0xff,0xdc,0x00,0x82,0x00,0xdb,0xff,0xdc,0x00,0x82,0x00,0xdd,
-0xff,0xdc,0x00,0x82,0x00,0xde,0xff,0xdc,0x00,0x82,0x00,0xe0,0xff,0xdc,0x00,0x82,
-0x00,0xe2,0xff,0xdc,0x00,0x82,0x01,0x0e,0xff,0xdc,0x00,0x82,0x01,0x0f,0xff,0xdc,
-0x00,0x82,0x01,0x10,0xff,0xdc,0x00,0x82,0x01,0x11,0xff,0xdc,0x00,0x82,0x01,0x12,
-0xff,0xdc,0x00,0x82,0x01,0x13,0xff,0xdc,0x00,0x82,0x01,0x24,0xff,0x61,0x00,0x82,
-0x01,0x25,0xff,0xdc,0x00,0x82,0x01,0x26,0xff,0x61,0x00,0x82,0x01,0x27,0xff,0xdc,
-0x00,0x82,0x01,0x36,0xff,0x90,0x00,0x82,0x01,0x37,0xff,0xad,0x00,0x82,0x01,0x38,
-0xff,0x61,0x00,0x82,0x01,0x39,0xff,0x75,0x00,0x82,0x01,0x3a,0xff,0x61,0x00,0x82,
-0x01,0xf0,0xff,0xdc,0x00,0x82,0x01,0xf1,0xff,0xdc,0x00,0x82,0x06,0x07,0xff,0x90,
-0x00,0x82,0x06,0x0a,0xff,0xad,0x00,0x82,0x06,0x0b,0xff,0x90,0x00,0x82,0x06,0x0c,
-0xff,0xad,0x00,0x82,0x06,0x75,0xff,0x61,0x00,0x82,0x06,0x76,0xff,0x75,0x00,0x82,
-0x07,0x7d,0xfe,0xf8,0x00,0x82,0x07,0x7e,0xff,0x03,0x00,0x82,0x07,0x7f,0x00,0x2f,
-0x00,0x83,0x00,0x10,0xff,0xd3,0x00,0x83,0x00,0x11,0xff,0xdc,0x00,0x83,0x00,0x1d,
-0xff,0xdc,0x00,0x83,0x00,0x24,0x00,0x39,0x00,0x83,0x00,0x26,0xff,0xdc,0x00,0x83,
-0x00,0x2a,0xff,0xdc,0x00,0x83,0x00,0x32,0xff,0xdc,0x00,0x83,0x00,0x34,0xff,0xdc,
-0x00,0x83,0x00,0x37,0xff,0x61,0x00,0x83,0x00,0x39,0xff,0x7d,0x00,0x83,0x00,0x3a,
-0xff,0x90,0x00,0x83,0x00,0x3c,0xff,0x61,0x00,0x83,0x00,0x46,0xff,0xdc,0x00,0x83,
-0x00,0x47,0xff,0xdc,0x00,0x83,0x00,0x48,0xff,0xdc,0x00,0x83,0x00,0x49,0xff,0xb7,
-0x00,0x83,0x00,0x52,0xff,0xdc,0x00,0x83,0x00,0x54,0xff,0xdc,0x00,0x83,0x00,0x57,
-0xff,0xdc,0x00,0x83,0x00,0x59,0xff,0x88,0x00,0x83,0x00,0x5a,0xff,0xad,0x00,0x83,
-0x00,0x5c,0xff,0x75,0x00,0x83,0x00,0x6d,0xff,0xb7,0x00,0x83,0x00,0x82,0x00,0x39,
-0x00,0x83,0x00,0x83,0x00,0x39,0x00,0x83,0x00,0x84,0x00,0x39,0x00,0x83,0x00,0x85,
-0x00,0x39,0x00,0x83,0x00,0x86,0x00,0x39,0x00,0x83,0x00,0x89,0xff,0xdc,0x00,0x83,
-0x00,0x94,0xff,0xdc,0x00,0x83,0x00,0x95,0xff,0xdc,0x00,0x83,0x00,0x96,0xff,0xdc,
-0x00,0x83,0x00,0x97,0xff,0xdc,0x00,0x83,0x00,0x98,0xff,0xdc,0x00,0x83,0x00,0x9f,
-0xff,0x61,0x00,0x83,0x00,0xa9,0xff,0xdc,0x00,0x83,0x00,0xaa,0xff,0xdc,0x00,0x83,
-0x00,0xab,0xff,0xdc,0x00,0x83,0x00,0xac,0xff,0xdc,0x00,0x83,0x00,0xad,0xff,0xdc,
-0x00,0x83,0x00,0xb4,0xff,0xdc,0x00,0x83,0x00,0xb5,0xff,0xdc,0x00,0x83,0x00,0xb6,
-0xff,0xdc,0x00,0x83,0x00,0xb7,0xff,0xdc,0x00,0x83,0x00,0xb8,0xff,0xdc,0x00,0x83,
-0x00,0xbf,0xff,0x75,0x00,0x83,0x00,0xc1,0xff,0x75,0x00,0x83,0x00,0xc2,0x00,0x39,
-0x00,0x83,0x00,0xc4,0x00,0x39,0x00,0x83,0x00,0xc6,0x00,0x39,0x00,0x83,0x00,0xc8,
-0xff,0xdc,0x00,0x83,0x00,0xc9,0xff,0xdc,0x00,0x83,0x00,0xca,0xff,0xdc,0x00,0x83,
-0x00,0xcc,0xff,0xdc,0x00,0x83,0x00,0xcd,0xff,0xdc,0x00,0x83,0x00,0xce,0xff,0xdc,
-0x00,0x83,0x00,0xcf,0xff,0xdc,0x00,0x83,0x00,0xd1,0xff,0xdc,0x00,0x83,0x00,0xd5,
-0xff,0xdc,0x00,0x83,0x00,0xd7,0xff,0xdc,0x00,0x83,0x00,0xd9,0xff,0xdc,0x00,0x83,
-0x00,0xdb,0xff,0xdc,0x00,0x83,0x00,0xdd,0xff,0xdc,0x00,0x83,0x00,0xde,0xff,0xdc,
-0x00,0x83,0x00,0xe0,0xff,0xdc,0x00,0x83,0x00,0xe2,0xff,0xdc,0x00,0x83,0x01,0x0e,
-0xff,0xdc,0x00,0x83,0x01,0x0f,0xff,0xdc,0x00,0x83,0x01,0x10,0xff,0xdc,0x00,0x83,
-0x01,0x11,0xff,0xdc,0x00,0x83,0x01,0x12,0xff,0xdc,0x00,0x83,0x01,0x13,0xff,0xdc,
-0x00,0x83,0x01,0x24,0xff,0x61,0x00,0x83,0x01,0x25,0xff,0xdc,0x00,0x83,0x01,0x26,
-0xff,0x61,0x00,0x83,0x01,0x27,0xff,0xdc,0x00,0x83,0x01,0x36,0xff,0x90,0x00,0x83,
-0x01,0x37,0xff,0xad,0x00,0x83,0x01,0x38,0xff,0x61,0x00,0x83,0x01,0x39,0xff,0x75,
-0x00,0x83,0x01,0x3a,0xff,0x61,0x00,0x83,0x01,0xf0,0xff,0xdc,0x00,0x83,0x01,0xf1,
-0xff,0xdc,0x00,0x83,0x06,0x07,0xff,0x90,0x00,0x83,0x06,0x09,0xff,0x90,0x00,0x83,
-0x06,0x0a,0xff,0xad,0x00,0x83,0x06,0x0b,0xff,0x90,0x00,0x83,0x06,0x0c,0xff,0xad,
-0x00,0x83,0x06,0x75,0xff,0x61,0x00,0x83,0x06,0x76,0xff,0x75,0x00,0x83,0x07,0x7d,
-0xfe,0xf8,0x00,0x83,0x07,0x7e,0xff,0x03,0x00,0x83,0x07,0x7f,0x00,0x2f,0x00,0x84,
-0x00,0x10,0xff,0xd3,0x00,0x84,0x00,0x11,0xff,0xdc,0x00,0x84,0x00,0x1d,0xff,0xdc,
-0x00,0x84,0x00,0x24,0x00,0x39,0x00,0x84,0x00,0x26,0xff,0xdc,0x00,0x84,0x00,0x2a,
-0xff,0xdc,0x00,0x84,0x00,0x32,0xff,0xdc,0x00,0x84,0x00,0x34,0xff,0xdc,0x00,0x84,
-0x00,0x37,0xff,0x61,0x00,0x84,0x00,0x39,0xff,0x7d,0x00,0x84,0x00,0x3a,0xff,0x90,
-0x00,0x84,0x00,0x3c,0xff,0x61,0x00,0x84,0x00,0x46,0xff,0xdc,0x00,0x84,0x00,0x47,
-0xff,0xdc,0x00,0x84,0x00,0x48,0xff,0xdc,0x00,0x84,0x00,0x49,0xff,0xb7,0x00,0x84,
-0x00,0x52,0xff,0xdc,0x00,0x84,0x00,0x54,0xff,0xdc,0x00,0x84,0x00,0x57,0xff,0xdc,
-0x00,0x84,0x00,0x59,0xff,0x88,0x00,0x84,0x00,0x5a,0xff,0xad,0x00,0x84,0x00,0x5c,
-0xff,0x75,0x00,0x84,0x00,0x6d,0xff,0xb7,0x00,0x84,0x00,0x82,0x00,0x39,0x00,0x84,
-0x00,0x83,0x00,0x39,0x00,0x84,0x00,0x84,0x00,0x39,0x00,0x84,0x00,0x85,0x00,0x39,
-0x00,0x84,0x00,0x86,0x00,0x39,0x00,0x84,0x00,0x89,0xff,0xdc,0x00,0x84,0x00,0x94,
-0xff,0xdc,0x00,0x84,0x00,0x95,0xff,0xdc,0x00,0x84,0x00,0x96,0xff,0xdc,0x00,0x84,
-0x00,0x97,0xff,0xdc,0x00,0x84,0x00,0x98,0xff,0xdc,0x00,0x84,0x00,0x9f,0xff,0x61,
-0x00,0x84,0x00,0xa9,0xff,0xdc,0x00,0x84,0x00,0xaa,0xff,0xdc,0x00,0x84,0x00,0xab,
-0xff,0xdc,0x00,0x84,0x00,0xac,0xff,0xdc,0x00,0x84,0x00,0xad,0xff,0xdc,0x00,0x84,
-0x00,0xb4,0xff,0xdc,0x00,0x84,0x00,0xb5,0xff,0xdc,0x00,0x84,0x00,0xb6,0xff,0xdc,
-0x00,0x84,0x00,0xb7,0xff,0xdc,0x00,0x84,0x00,0xb8,0xff,0xdc,0x00,0x84,0x00,0xbf,
-0xff,0x75,0x00,0x84,0x00,0xc1,0xff,0x75,0x00,0x84,0x00,0xc2,0x00,0x39,0x00,0x84,
-0x00,0xc4,0x00,0x39,0x00,0x84,0x00,0xc6,0x00,0x39,0x00,0x84,0x00,0xc8,0xff,0xdc,
-0x00,0x84,0x00,0xc9,0xff,0xdc,0x00,0x84,0x00,0xca,0xff,0xdc,0x00,0x84,0x00,0xcc,
-0xff,0xdc,0x00,0x84,0x00,0xcd,0xff,0xdc,0x00,0x84,0x00,0xce,0xff,0xdc,0x00,0x84,
-0x00,0xcf,0xff,0xdc,0x00,0x84,0x00,0xd1,0xff,0xdc,0x00,0x84,0x00,0xd5,0xff,0xdc,
-0x00,0x84,0x00,0xd7,0xff,0xdc,0x00,0x84,0x00,0xd9,0xff,0xdc,0x00,0x84,0x00,0xdb,
-0xff,0xdc,0x00,0x84,0x00,0xdd,0xff,0xdc,0x00,0x84,0x00,0xde,0xff,0xdc,0x00,0x84,
-0x00,0xe0,0xff,0xdc,0x00,0x84,0x00,0xe2,0xff,0xdc,0x00,0x84,0x01,0x0e,0xff,0xdc,
-0x00,0x84,0x01,0x0f,0xff,0xdc,0x00,0x84,0x01,0x10,0xff,0xdc,0x00,0x84,0x01,0x11,
-0xff,0xdc,0x00,0x84,0x01,0x12,0xff,0xdc,0x00,0x84,0x01,0x13,0xff,0xdc,0x00,0x84,
-0x01,0x24,0xff,0x61,0x00,0x84,0x01,0x25,0xff,0xdc,0x00,0x84,0x01,0x26,0xff,0x61,
-0x00,0x84,0x01,0x27,0xff,0xdc,0x00,0x84,0x01,0x36,0xff,0x90,0x00,0x84,0x01,0x37,
-0xff,0xad,0x00,0x84,0x01,0x38,0xff,0x61,0x00,0x84,0x01,0x39,0xff,0x75,0x00,0x84,
-0x01,0x3a,0xff,0x61,0x00,0x84,0x01,0xf0,0xff,0xdc,0x00,0x84,0x01,0xf1,0xff,0xdc,
-0x00,0x84,0x06,0x07,0xff,0x90,0x00,0x84,0x06,0x09,0xff,0x90,0x00,0x84,0x06,0x0a,
-0xff,0xad,0x00,0x84,0x06,0x0b,0xff,0x90,0x00,0x84,0x06,0x0c,0xff,0xad,0x00,0x84,
-0x06,0x75,0xff,0x61,0x00,0x84,0x06,0x76,0xff,0x75,0x00,0x84,0x07,0x7d,0xfe,0xf8,
-0x00,0x84,0x07,0x7e,0xff,0x03,0x00,0x84,0x07,0x7f,0x00,0x2f,0x00,0x85,0x00,0x10,
-0xff,0xd3,0x00,0x85,0x00,0x11,0xff,0xdc,0x00,0x85,0x00,0x1d,0xff,0xdc,0x00,0x85,
-0x00,0x24,0x00,0x39,0x00,0x85,0x00,0x26,0xff,0xdc,0x00,0x85,0x00,0x2a,0xff,0xdc,
-0x00,0x85,0x00,0x32,0xff,0xdc,0x00,0x85,0x00,0x34,0xff,0xdc,0x00,0x85,0x00,0x37,
-0xff,0x61,0x00,0x85,0x00,0x39,0xff,0x7d,0x00,0x85,0x00,0x3a,0xff,0x90,0x00,0x85,
-0x00,0x3c,0xff,0x61,0x00,0x85,0x00,0x46,0xff,0xdc,0x00,0x85,0x00,0x47,0xff,0xdc,
-0x00,0x85,0x00,0x48,0xff,0xdc,0x00,0x85,0x00,0x49,0xff,0xb7,0x00,0x85,0x00,0x52,
-0xff,0xdc,0x00,0x85,0x00,0x54,0xff,0xdc,0x00,0x85,0x00,0x57,0xff,0xdc,0x00,0x85,
-0x00,0x59,0xff,0x88,0x00,0x85,0x00,0x5a,0xff,0xad,0x00,0x85,0x00,0x5c,0xff,0x75,
-0x00,0x85,0x00,0x6d,0xff,0xb7,0x00,0x85,0x00,0x82,0x00,0x39,0x00,0x85,0x00,0x83,
-0x00,0x39,0x00,0x85,0x00,0x84,0x00,0x39,0x00,0x85,0x00,0x85,0x00,0x39,0x00,0x85,
-0x00,0x86,0x00,0x39,0x00,0x85,0x00,0x89,0xff,0xdc,0x00,0x85,0x00,0x94,0xff,0xdc,
-0x00,0x85,0x00,0x95,0xff,0xdc,0x00,0x85,0x00,0x96,0xff,0xdc,0x00,0x85,0x00,0x97,
-0xff,0xdc,0x00,0x85,0x00,0x98,0xff,0xdc,0x00,0x85,0x00,0x9f,0xff,0x61,0x00,0x85,
-0x00,0xa9,0xff,0xdc,0x00,0x85,0x00,0xaa,0xff,0xdc,0x00,0x85,0x00,0xab,0xff,0xdc,
-0x00,0x85,0x00,0xac,0xff,0xdc,0x00,0x85,0x00,0xad,0xff,0xdc,0x00,0x85,0x00,0xb4,
-0xff,0xdc,0x00,0x85,0x00,0xb5,0xff,0xdc,0x00,0x85,0x00,0xb6,0xff,0xdc,0x00,0x85,
-0x00,0xb7,0xff,0xdc,0x00,0x85,0x00,0xb8,0xff,0xdc,0x00,0x85,0x00,0xbf,0xff,0x75,
-0x00,0x85,0x00,0xc1,0xff,0x75,0x00,0x85,0x00,0xc2,0x00,0x39,0x00,0x85,0x00,0xc4,
-0x00,0x39,0x00,0x85,0x00,0xc6,0x00,0x39,0x00,0x85,0x00,0xc8,0xff,0xdc,0x00,0x85,
-0x00,0xc9,0xff,0xdc,0x00,0x85,0x00,0xca,0xff,0xdc,0x00,0x85,0x00,0xcc,0xff,0xdc,
-0x00,0x85,0x00,0xcd,0xff,0xdc,0x00,0x85,0x00,0xce,0xff,0xdc,0x00,0x85,0x00,0xcf,
-0xff,0xdc,0x00,0x85,0x00,0xd1,0xff,0xdc,0x00,0x85,0x00,0xd5,0xff,0xdc,0x00,0x85,
-0x00,0xd7,0xff,0xdc,0x00,0x85,0x00,0xd9,0xff,0xdc,0x00,0x85,0x00,0xdb,0xff,0xdc,
-0x00,0x85,0x00,0xdd,0xff,0xdc,0x00,0x85,0x00,0xde,0xff,0xdc,0x00,0x85,0x00,0xe0,
-0xff,0xdc,0x00,0x85,0x00,0xe2,0xff,0xdc,0x00,0x85,0x01,0x0e,0xff,0xdc,0x00,0x85,
-0x01,0x0f,0xff,0xdc,0x00,0x85,0x01,0x10,0xff,0xdc,0x00,0x85,0x01,0x11,0xff,0xdc,
-0x00,0x85,0x01,0x12,0xff,0xdc,0x00,0x85,0x01,0x13,0xff,0xdc,0x00,0x85,0x01,0x24,
-0xff,0x61,0x00,0x85,0x01,0x25,0xff,0xdc,0x00,0x85,0x01,0x26,0xff,0x61,0x00,0x85,
-0x01,0x27,0xff,0xdc,0x00,0x85,0x01,0x36,0xff,0x90,0x00,0x85,0x01,0x37,0xff,0xad,
-0x00,0x85,0x01,0x38,0xff,0x61,0x00,0x85,0x01,0x39,0xff,0x75,0x00,0x85,0x01,0x3a,
-0xff,0x61,0x00,0x85,0x01,0xf0,0xff,0xdc,0x00,0x85,0x06,0x07,0xff,0x90,0x00,0x85,
-0x06,0x09,0xff,0x90,0x00,0x85,0x06,0x0a,0xff,0xad,0x00,0x85,0x06,0x0b,0xff,0x90,
-0x00,0x85,0x06,0x0c,0xff,0xad,0x00,0x85,0x06,0x75,0xff,0x61,0x00,0x85,0x06,0x76,
-0xff,0x75,0x00,0x85,0x07,0x7d,0xfe,0xf8,0x00,0x85,0x07,0x7e,0xff,0x03,0x00,0x85,
-0x07,0x7f,0x00,0x2f,0x00,0x86,0x00,0x10,0xff,0xd3,0x00,0x86,0x00,0x11,0xff,0xdc,
-0x00,0x86,0x00,0x1d,0xff,0xdc,0x00,0x86,0x00,0x24,0x00,0x39,0x00,0x86,0x00,0x26,
-0xff,0xdc,0x00,0x86,0x00,0x2a,0xff,0xdc,0x00,0x86,0x00,0x32,0xff,0xdc,0x00,0x86,
-0x00,0x34,0xff,0xdc,0x00,0x86,0x00,0x37,0xff,0x61,0x00,0x86,0x00,0x39,0xff,0x7d,
-0x00,0x86,0x00,0x3a,0xff,0x90,0x00,0x86,0x00,0x3c,0xff,0x61,0x00,0x86,0x00,0x46,
-0xff,0xdc,0x00,0x86,0x00,0x47,0xff,0xdc,0x00,0x86,0x00,0x48,0xff,0xdc,0x00,0x86,
-0x00,0x49,0xff,0xb7,0x00,0x86,0x00,0x52,0xff,0xdc,0x00,0x86,0x00,0x54,0xff,0xdc,
-0x00,0x86,0x00,0x57,0xff,0xdc,0x00,0x86,0x00,0x59,0xff,0x88,0x00,0x86,0x00,0x5a,
-0xff,0xad,0x00,0x86,0x00,0x5c,0xff,0x75,0x00,0x86,0x00,0x6d,0xff,0xb7,0x00,0x86,
-0x00,0x82,0x00,0x39,0x00,0x86,0x00,0x83,0x00,0x39,0x00,0x86,0x00,0x84,0x00,0x39,
-0x00,0x86,0x00,0x85,0x00,0x39,0x00,0x86,0x00,0x86,0x00,0x39,0x00,0x86,0x00,0x89,
-0xff,0xdc,0x00,0x86,0x00,0x94,0xff,0xdc,0x00,0x86,0x00,0x95,0xff,0xdc,0x00,0x86,
-0x00,0x96,0xff,0xdc,0x00,0x86,0x00,0x97,0xff,0xdc,0x00,0x86,0x00,0x98,0xff,0xdc,
-0x00,0x86,0x00,0x9f,0xff,0x61,0x00,0x86,0x00,0xa9,0xff,0xdc,0x00,0x86,0x00,0xaa,
-0xff,0xdc,0x00,0x86,0x00,0xab,0xff,0xdc,0x00,0x86,0x00,0xac,0xff,0xdc,0x00,0x86,
-0x00,0xad,0xff,0xdc,0x00,0x86,0x00,0xb4,0xff,0xdc,0x00,0x86,0x00,0xb5,0xff,0xdc,
-0x00,0x86,0x00,0xb6,0xff,0xdc,0x00,0x86,0x00,0xb7,0xff,0xdc,0x00,0x86,0x00,0xb8,
-0xff,0xdc,0x00,0x86,0x00,0xbf,0xff,0x75,0x00,0x86,0x00,0xc1,0xff,0x75,0x00,0x86,
-0x00,0xc2,0x00,0x39,0x00,0x86,0x00,0xc4,0x00,0x39,0x00,0x86,0x00,0xc6,0x00,0x39,
-0x00,0x86,0x00,0xc8,0xff,0xdc,0x00,0x86,0x00,0xc9,0xff,0xdc,0x00,0x86,0x00,0xca,
-0xff,0xdc,0x00,0x86,0x00,0xcc,0xff,0xdc,0x00,0x86,0x00,0xcd,0xff,0xdc,0x00,0x86,
-0x00,0xce,0xff,0xdc,0x00,0x86,0x00,0xcf,0xff,0xdc,0x00,0x86,0x00,0xd1,0xff,0xdc,
-0x00,0x86,0x00,0xd5,0xff,0xdc,0x00,0x86,0x00,0xd7,0xff,0xdc,0x00,0x86,0x00,0xd9,
-0xff,0xdc,0x00,0x86,0x00,0xdb,0xff,0xdc,0x00,0x86,0x00,0xdd,0xff,0xdc,0x00,0x86,
-0x00,0xde,0xff,0xdc,0x00,0x86,0x00,0xe0,0xff,0xdc,0x00,0x86,0x00,0xe2,0xff,0xdc,
-0x00,0x86,0x01,0x0e,0xff,0xdc,0x00,0x86,0x01,0x0f,0xff,0xdc,0x00,0x86,0x01,0x10,
-0xff,0xdc,0x00,0x86,0x01,0x11,0xff,0xdc,0x00,0x86,0x01,0x12,0xff,0xdc,0x00,0x86,
-0x01,0x13,0xff,0xdc,0x00,0x86,0x01,0x24,0xff,0x61,0x00,0x86,0x01,0x25,0xff,0xdc,
-0x00,0x86,0x01,0x26,0xff,0x61,0x00,0x86,0x01,0x27,0xff,0xdc,0x00,0x86,0x01,0x36,
-0xff,0x90,0x00,0x86,0x01,0x37,0xff,0xad,0x00,0x86,0x01,0x38,0xff,0x61,0x00,0x86,
-0x01,0x39,0xff,0x75,0x00,0x86,0x01,0x3a,0xff,0x61,0x00,0x86,0x01,0xf0,0xff,0xdc,
-0x00,0x86,0x01,0xf1,0xff,0xdc,0x00,0x86,0x06,0x07,0xff,0x90,0x00,0x86,0x06,0x09,
-0xff,0x90,0x00,0x86,0x06,0x0a,0xff,0xad,0x00,0x86,0x06,0x0b,0xff,0x90,0x00,0x86,
-0x06,0x0c,0xff,0xad,0x00,0x86,0x06,0x75,0xff,0x61,0x00,0x86,0x06,0x76,0xff,0x75,
-0x00,0x86,0x07,0x7d,0xfe,0xf8,0x00,0x86,0x07,0x7e,0xff,0x03,0x00,0x86,0x07,0x7f,
-0x00,0x2f,0x00,0x88,0x07,0x7d,0xff,0xad,0x00,0x88,0x07,0x7e,0xff,0xa4,0x00,0x88,
-0x07,0x7f,0xff,0x90,0x00,0x89,0x00,0x3c,0xff,0xdc,0x00,0x89,0x00,0x6d,0xff,0xdc,
-0x00,0x89,0x00,0x7d,0xff,0xdc,0x00,0x89,0x00,0x9f,0xff,0xdc,0x00,0x89,0x01,0x3a,
-0xff,0xdc,0x00,0x89,0x07,0x7e,0x00,0x26,0x00,0x92,0x00,0x24,0xff,0xdc,0x00,0x92,
-0x00,0x39,0xff,0xdc,0x00,0x92,0x00,0x3c,0xff,0x90,0x00,0x92,0x00,0x6d,0xff,0xdc,
-0x00,0x92,0x00,0x7d,0xff,0xdc,0x00,0x92,0x00,0x82,0xff,0xdc,0x00,0x92,0x00,0x83,
-0xff,0xdc,0x00,0x92,0x00,0x84,0xff,0xdc,0x00,0x92,0x00,0x85,0xff,0xdc,0x00,0x92,
-0x00,0x86,0xff,0xdc,0x00,0x92,0x00,0x9f,0xff,0x90,0x00,0x92,0x00,0xc2,0xff,0xdc,
-0x00,0x92,0x00,0xc4,0xff,0xdc,0x00,0x92,0x00,0xc6,0xff,0xdc,0x00,0x92,0x01,0x38,
-0xff,0x90,0x00,0x92,0x01,0x3a,0xff,0x90,0x00,0x92,0x01,0xf4,0xff,0x90,0x00,0x92,
-0x06,0x75,0xff,0x90,0x00,0x92,0x07,0x7d,0xff,0xd3,0x00,0x92,0x07,0x7e,0xff,0xc9,
-0x00,0x92,0x07,0x7f,0xff,0x44,0x00,0x94,0x00,0x10,0x00,0x39,0x00,0x94,0x00,0x11,
-0xff,0xad,0x00,0x94,0x00,0x1d,0xff,0xdc,0x00,0x94,0x00,0x24,0xff,0xdc,0x00,0x94,
-0x00,0x39,0xff,0xdc,0x00,0x94,0x00,0x3b,0xff,0x7d,0x00,0x94,0x00,0x3c,0xff,0x90,
-0x00,0x94,0x00,0x6d,0xff,0xdc,0x00,0x94,0x00,0x82,0xff,0xdc,0x00,0x94,0x00,0x83,
-0xff,0xdc,0x00,0x94,0x00,0x84,0xff,0xdc,0x00,0x94,0x00,0x85,0xff,0xdc,0x00,0x94,
-0x00,0x86,0xff,0xdc,0x00,0x94,0x00,0x9f,0xff,0x90,0x00,0x94,0x01,0x3a,0xff,0x90,
-0x00,0x94,0x07,0x7d,0xff,0xd3,0x00,0x94,0x07,0x7e,0xff,0xdc,0x00,0x94,0x07,0x7f,
-0xff,0x44,0x00,0x95,0x00,0x10,0x00,0x39,0x00,0x95,0x00,0x11,0xff,0xad,0x00,0x95,
-0x00,0x1d,0xff,0xdc,0x00,0x95,0x00,0x24,0xff,0xdc,0x00,0x95,0x00,0x39,0xff,0xdc,
-0x00,0x95,0x00,0x3b,0xff,0x7d,0x00,0x95,0x00,0x3c,0xff,0x90,0x00,0x95,0x00,0x6d,
-0xff,0xdc,0x00,0x95,0x00,0x82,0xff,0xdc,0x00,0x95,0x00,0x83,0xff,0xdc,0x00,0x95,
-0x00,0x84,0xff,0xdc,0x00,0x95,0x00,0x85,0xff,0xdc,0x00,0x95,0x00,0x86,0xff,0xdc,
-0x00,0x95,0x00,0x9f,0xff,0x90,0x00,0x95,0x01,0x3a,0xff,0x90,0x00,0x95,0x07,0x7d,
-0xff,0xd3,0x00,0x95,0x07,0x7e,0xff,0xdc,0x00,0x95,0x07,0x7f,0xff,0x44,0x00,0x96,
-0x00,0x10,0x00,0x39,0x00,0x96,0x00,0x11,0xff,0xad,0x00,0x96,0x00,0x1d,0xff,0xdc,
-0x00,0x96,0x00,0x24,0xff,0xdc,0x00,0x96,0x00,0x39,0xff,0xdc,0x00,0x96,0x00,0x3b,
-0xff,0x7d,0x00,0x96,0x00,0x3c,0xff,0x90,0x00,0x96,0x00,0x6d,0xff,0xdc,0x00,0x96,
-0x00,0x82,0xff,0xdc,0x00,0x96,0x00,0x83,0xff,0xdc,0x00,0x96,0x00,0x84,0xff,0xdc,
-0x00,0x96,0x00,0x85,0xff,0xdc,0x00,0x96,0x00,0x86,0xff,0xdc,0x00,0x96,0x00,0x9f,
-0xff,0x90,0x00,0x96,0x01,0x3a,0xff,0x90,0x00,0x96,0x07,0x7d,0xff,0xd3,0x00,0x96,
-0x07,0x7e,0xff,0xdc,0x00,0x96,0x07,0x7f,0xff,0x44,0x00,0x97,0x00,0x10,0x00,0x39,
-0x00,0x97,0x00,0x11,0xff,0xad,0x00,0x97,0x00,0x1d,0xff,0xdc,0x00,0x97,0x00,0x24,
-0xff,0xdc,0x00,0x97,0x00,0x39,0xff,0xdc,0x00,0x97,0x00,0x3b,0xff,0x7d,0x00,0x97,
-0x00,0x3c,0xff,0x90,0x00,0x97,0x00,0x6d,0xff,0xdc,0x00,0x97,0x00,0x82,0xff,0xdc,
-0x00,0x97,0x00,0x83,0xff,0xdc,0x00,0x97,0x00,0x84,0xff,0xdc,0x00,0x97,0x00,0x85,
-0xff,0xdc,0x00,0x97,0x00,0x86,0xff,0xdc,0x00,0x97,0x00,0x9f,0xff,0x90,0x00,0x97,
-0x01,0x3a,0xff,0x90,0x00,0x97,0x07,0x7d,0xff,0xd3,0x00,0x97,0x07,0x7e,0xff,0xdc,
-0x00,0x97,0x07,0x7f,0xff,0x44,0x00,0x98,0x00,0x10,0x00,0x39,0x00,0x98,0x00,0x11,
-0xff,0xad,0x00,0x98,0x00,0x1d,0xff,0xdc,0x00,0x98,0x00,0x24,0xff,0xdc,0x00,0x98,
-0x00,0x39,0xff,0xdc,0x00,0x98,0x00,0x3b,0xff,0x7d,0x00,0x98,0x00,0x3c,0xff,0x90,
-0x00,0x98,0x00,0x6d,0xff,0xdc,0x00,0x98,0x00,0x82,0xff,0xdc,0x00,0x98,0x00,0x83,
-0xff,0xdc,0x00,0x98,0x00,0x84,0xff,0xdc,0x00,0x98,0x00,0x85,0xff,0xdc,0x00,0x98,
-0x00,0x86,0xff,0xdc,0x00,0x98,0x00,0x9f,0xff,0x90,0x00,0x98,0x01,0x3a,0xff,0x90,
-0x00,0x98,0x07,0x7d,0xff,0xd3,0x00,0x98,0x07,0x7e,0xff,0xdc,0x00,0x98,0x07,0x7f,
-0xff,0x44,0x00,0x9b,0x00,0x3d,0xff,0xdc,0x00,0x9b,0x01,0x3f,0xff,0xdc,0x00,0x9c,
-0x00,0x3d,0xff,0xdc,0x00,0x9c,0x01,0x3f,0xff,0xdc,0x00,0x9d,0x00,0x3d,0xff,0xdc,
-0x00,0x9d,0x01,0x3f,0xff,0xdc,0x00,0x9e,0x00,0x3d,0xff,0xdc,0x00,0x9e,0x01,0x3f,
-0xff,0xdc,0x00,0x9f,0x00,0x10,0xff,0x0d,0x00,0x9f,0x00,0x11,0xfe,0x61,0x00,0x9f,
-0x00,0x1d,0xfe,0xf0,0x00,0x9f,0x00,0x24,0xff,0x61,0x00,0x9f,0x00,0x26,0xff,0x90,
-0x00,0x9f,0x00,0x32,0xff,0x90,0x00,0x9f,0x00,0x44,0xfe,0xe6,0x00,0x9f,0x00,0x48,
-0xfe,0xf0,0x00,0x9f,0x00,0x4c,0xff,0xb7,0x00,0x9f,0x00,0x52,0xfe,0xf0,0x00,0x9f,
-0x00,0x58,0xff,0x15,0x00,0x9f,0x00,0x6d,0xff,0x1f,0x00,0x9f,0x00,0x7d,0xff,0x6b,
-0x00,0x9f,0x00,0x82,0xff,0x61,0x00,0x9f,0x00,0x83,0xff,0x61,0x00,0x9f,0x00,0x84,
-0xff,0x61,0x00,0x9f,0x00,0x85,0xff,0x61,0x00,0x9f,0x00,0x86,0xff,0x61,0x00,0x9f,
-0x00,0x89,0xff,0x90,0x00,0x9f,0x00,0x94,0xff,0x90,0x00,0x9f,0x00,0x95,0xff,0x90,
-0x00,0x9f,0x00,0x96,0xff,0x90,0x00,0x9f,0x00,0x97,0xff,0x90,0x00,0x9f,0x00,0x98,
-0xff,0x90,0x00,0x9f,0x00,0xa2,0xfe,0xe6,0x00,0x9f,0x00,0xa3,0xfe,0xe6,0x00,0x9f,
-0x00,0xa4,0xfe,0xe6,0x00,0x9f,0x00,0xa5,0xfe,0xe6,0x00,0x9f,0x00,0xa6,0xfe,0xe6,
-0x00,0x9f,0x00,0xa7,0xfe,0xe6,0x00,0x9f,0x00,0xaa,0xfe,0xf0,0x00,0x9f,0x00,0xab,
-0xfe,0xf0,0x00,0x9f,0x00,0xac,0xfe,0xf0,0x00,0x9f,0x00,0xad,0xfe,0xf0,0x00,0x9f,
-0x00,0xb4,0xfe,0xf0,0x00,0x9f,0x00,0xb5,0xfe,0xf0,0x00,0x9f,0x00,0xb6,0xfe,0xf0,
-0x00,0x9f,0x00,0xb7,0xfe,0xf0,0x00,0x9f,0x00,0xb8,0xfe,0xf0,0x00,0x9f,0x00,0xbb,
-0xff,0x15,0x00,0x9f,0x00,0xbc,0xff,0x15,0x00,0x9f,0x00,0xbd,0xff,0x15,0x00,0x9f,
-0x00,0xbe,0xff,0x15,0x00,0x9f,0x00,0xc8,0xff,0x90,0x00,0x9f,0x00,0xce,0xff,0x90,
-0x00,0x9f,0x00,0xdd,0xfe,0xf0,0x00,0x9f,0x01,0x31,0xff,0x15,0x00,0x9f,0x07,0x7d,
-0xff,0x90,0x00,0x9f,0x07,0x7e,0xff,0xdc,0x00,0x9f,0x07,0x7f,0xfe,0xf8,0x00,0xa0,
-0x00,0x11,0xff,0x6b,0x00,0xa0,0x00,0x1d,0xff,0xb7,0x00,0xa0,0x07,0x7d,0xff,0xdc,
-0x00,0xa0,0x07,0x7f,0xff,0x44,0x00,0xa1,0x00,0x10,0x00,0x26,0x00,0xa1,0x07,0x7d,
-0xff,0x90,0x00,0xa1,0x07,0x7e,0xff,0x90,0x00,0xa1,0x07,0x7f,0xff,0xad,0x00,0xaa,
-0x00,0x5b,0xff,0xdc,0x00,0xab,0x00,0x5b,0xff,0xdc,0x00,0xac,0x00,0x5b,0xff,0xdc,
-0x00,0xad,0x00,0x5b,0xff,0xdc,0x00,0xb2,0x07,0x7d,0xff,0xa4,0x00,0xb2,0x07,0x7e,
-0xff,0x90,0x00,0xb2,0x07,0x7f,0xff,0xb7,0x00,0xb3,0x07,0x7d,0xff,0x6b,0x00,0xb3,
-0x07,0x7e,0xff,0x90,0x00,0xb3,0x07,0x7f,0xff,0xa4,0x00,0xb4,0x00,0x10,0x00,0x26,
-0x00,0xb4,0x00,0x11,0xff,0xdc,0x00,0xb4,0x00,0x5b,0xff,0xc1,0x00,0xb4,0x07,0x7d,
-0xff,0x6b,0x00,0xb4,0x07,0x7e,0xff,0xb7,0x00,0xb4,0x07,0x7f,0xff,0x7d,0x00,0xb5,
-0x00,0x10,0x00,0x26,0x00,0xb5,0x00,0x11,0xff,0xdc,0x00,0xb5,0x00,0x5b,0xff,0xc1,
-0x00,0xb5,0x07,0x7d,0xff,0x6b,0x00,0xb5,0x07,0x7e,0xff,0xb7,0x00,0xb5,0x07,0x7f,
-0xff,0x7d,0x00,0xb6,0x00,0x10,0x00,0x26,0x00,0xb6,0x00,0x11,0xff,0xdc,0x00,0xb6,
-0x00,0x5b,0xff,0xc1,0x00,0xb6,0x07,0x7d,0xff,0x6b,0x00,0xb6,0x07,0x7e,0xff,0xb7,
-0x00,0xb6,0x07,0x7f,0xff,0x7d,0x00,0xb7,0x00,0x10,0x00,0x26,0x00,0xb7,0x00,0x11,
-0xff,0xdc,0x00,0xb7,0x00,0x5b,0xff,0xc1,0x00,0xb7,0x07,0x7d,0xff,0x6b,0x00,0xb7,
-0x07,0x7e,0xff,0xb7,0x00,0xb7,0x07,0x7f,0xff,0x7d,0x00,0xb8,0x00,0x10,0x00,0x26,
-0x00,0xb8,0x00,0x11,0xff,0xdc,0x00,0xb8,0x00,0x5b,0xff,0xc1,0x00,0xb8,0x07,0x7d,
-0xff,0x6b,0x00,0xb8,0x07,0x7e,0xff,0xb7,0x00,0xb8,0x07,0x7f,0xff,0x7d,0x00,0xbf,
-0x00,0x10,0xff,0xdc,0x00,0xbf,0x00,0x11,0xfe,0xdc,0x00,0xbf,0x00,0x1d,0xff,0x6b,
-0x00,0xbf,0x00,0x6d,0xff,0xdc,0x00,0xbf,0x00,0x7d,0xff,0xdc,0x00,0xbf,0x07,0x7f,
-0xfe,0xd3,0x00,0xc1,0x00,0x10,0xff,0xdc,0x00,0xc1,0x00,0x11,0xfe,0xdc,0x00,0xc1,
-0x00,0x1d,0xff,0x6b,0x00,0xc1,0x00,0x6d,0xff,0xdc,0x00,0xc1,0x00,0x7d,0xff,0xdc,
-0x00,0xc1,0x07,0x7f,0xfe,0xd3,0x00,0xc2,0x00,0x10,0xff,0xd3,0x00,0xc2,0x00,0x11,
-0xff,0xdc,0x00,0xc2,0x00,0x1d,0xff,0xdc,0x00,0xc2,0x00,0x24,0x00,0x39,0x00,0xc2,
-0x00,0x26,0xff,0xdc,0x00,0xc2,0x00,0x2a,0xff,0xdc,0x00,0xc2,0x00,0x32,0xff,0xdc,
-0x00,0xc2,0x00,0x34,0xff,0xdc,0x00,0xc2,0x00,0x37,0xff,0x61,0x00,0xc2,0x00,0x39,
-0xff,0x7d,0x00,0xc2,0x00,0x3a,0xff,0x90,0x00,0xc2,0x00,0x3c,0xff,0x61,0x00,0xc2,
-0x00,0x46,0xff,0xdc,0x00,0xc2,0x00,0x47,0xff,0xdc,0x00,0xc2,0x00,0x48,0xff,0xdc,
-0x00,0xc2,0x00,0x49,0xff,0xb7,0x00,0xc2,0x00,0x52,0xff,0xdc,0x00,0xc2,0x00,0x54,
-0xff,0xdc,0x00,0xc2,0x00,0x57,0xff,0xdc,0x00,0xc2,0x00,0x59,0xff,0x88,0x00,0xc2,
-0x00,0x5a,0xff,0xad,0x00,0xc2,0x00,0x5c,0xff,0x75,0x00,0xc2,0x00,0x6d,0xff,0xb7,
-0x00,0xc2,0x00,0x82,0x00,0x39,0x00,0xc2,0x00,0x83,0x00,0x39,0x00,0xc2,0x00,0x84,
-0x00,0x39,0x00,0xc2,0x00,0x85,0x00,0x39,0x00,0xc2,0x00,0x86,0x00,0x39,0x00,0xc2,
-0x00,0x94,0xff,0xdc,0x00,0xc2,0x00,0x95,0xff,0xdc,0x00,0xc2,0x00,0x96,0xff,0xdc,
-0x00,0xc2,0x00,0x97,0xff,0xdc,0x00,0xc2,0x00,0x98,0xff,0xdc,0x00,0xc2,0x00,0x9f,
-0xff,0x61,0x00,0xc2,0x00,0xa9,0xff,0xdc,0x00,0xc2,0x00,0xaa,0xff,0xdc,0x00,0xc2,
-0x00,0xab,0xff,0xdc,0x00,0xc2,0x00,0xac,0xff,0xdc,0x00,0xc2,0x00,0xad,0xff,0xdc,
-0x00,0xc2,0x00,0xb4,0xff,0xdc,0x00,0xc2,0x00,0xb5,0xff,0xdc,0x00,0xc2,0x00,0xb6,
-0xff,0xdc,0x00,0xc2,0x00,0xb7,0xff,0xdc,0x00,0xc2,0x00,0xb8,0xff,0xdc,0x00,0xc2,
-0x00,0xbf,0xff,0x75,0x00,0xc2,0x00,0xc1,0xff,0x75,0x00,0xc2,0x00,0xc2,0x00,0x39,
-0x00,0xc2,0x00,0xc4,0x00,0x39,0x00,0xc2,0x00,0xc6,0x00,0x39,0x00,0xc2,0x00,0xc8,
-0xff,0xdc,0x00,0xc2,0x00,0xca,0xff,0xdc,0x00,0xc2,0x00,0xcc,0xff,0xdc,0x00,0xc2,
-0x00,0xcd,0xff,0xdc,0x00,0xc2,0x00,0xce,0xff,0xdc,0x00,0xc2,0x00,0xd1,0xff,0xdc,
-0x00,0xc2,0x00,0xd3,0xff,0xdc,0x00,0xc2,0x00,0xd5,0xff,0xdc,0x00,0xc2,0x00,0xd7,
-0xff,0xdc,0x00,0xc2,0x00,0xd9,0xff,0xdc,0x00,0xc2,0x00,0xdb,0xff,0xdc,0x00,0xc2,
-0x00,0xdd,0xff,0xdc,0x00,0xc2,0x00,0xde,0xff,0xdc,0x00,0xc2,0x00,0xe2,0xff,0xdc,
-0x00,0xc2,0x01,0x0e,0xff,0xdc,0x00,0xc2,0x01,0x0f,0xff,0xdc,0x00,0xc2,0x01,0x10,
-0xff,0xdc,0x00,0xc2,0x01,0x11,0xff,0xdc,0x00,0xc2,0x01,0x12,0xff,0xdc,0x00,0xc2,
-0x01,0x13,0xff,0xdc,0x00,0xc2,0x01,0x24,0xff,0x61,0x00,0xc2,0x01,0x25,0xff,0xdc,
-0x00,0xc2,0x01,0x26,0xff,0x61,0x00,0xc2,0x01,0x27,0xff,0xdc,0x00,0xc2,0x01,0x36,
-0xff,0x90,0x00,0xc2,0x01,0x37,0xff,0xad,0x00,0xc2,0x01,0x38,0xff,0x61,0x00,0xc2,
-0x01,0x39,0xff,0x75,0x00,0xc2,0x01,0x3a,0xff,0x61,0x00,0xc2,0x01,0xf0,0xff,0xdc,
-0x00,0xc2,0x01,0xf1,0xff,0xdc,0x00,0xc2,0x06,0x07,0xff,0x90,0x00,0xc2,0x06,0x09,
-0xff,0x90,0x00,0xc2,0x06,0x0a,0xff,0xad,0x00,0xc2,0x06,0x0b,0xff,0x90,0x00,0xc2,
-0x06,0x0c,0xff,0xad,0x00,0xc2,0x06,0x75,0xff,0x61,0x00,0xc2,0x06,0x76,0xff,0x75,
-0x00,0xc2,0x07,0x7d,0xfe,0xf8,0x00,0xc2,0x07,0x7e,0xff,0x02,0x00,0xc2,0x07,0x7f,
-0x00,0x2f,0x00,0xc4,0x00,0x10,0xff,0xd3,0x00,0xc4,0x00,0x11,0xff,0xdc,0x00,0xc4,
-0x00,0x1d,0xff,0xdc,0x00,0xc4,0x00,0x24,0x00,0x39,0x00,0xc4,0x00,0x26,0xff,0xdc,
-0x00,0xc4,0x00,0x2a,0xff,0xdc,0x00,0xc4,0x00,0x32,0xff,0xdc,0x00,0xc4,0x00,0x34,
-0xff,0xdc,0x00,0xc4,0x00,0x37,0xff,0x61,0x00,0xc4,0x00,0x39,0xff,0x7d,0x00,0xc4,
-0x00,0x3a,0xff,0x90,0x00,0xc4,0x00,0x3c,0xff,0x61,0x00,0xc4,0x00,0x46,0xff,0xdc,
-0x00,0xc4,0x00,0x47,0xff,0xdc,0x00,0xc4,0x00,0x48,0xff,0xdc,0x00,0xc4,0x00,0x49,
-0xff,0xb7,0x00,0xc4,0x00,0x52,0xff,0xdc,0x00,0xc4,0x00,0x54,0xff,0xdc,0x00,0xc4,
-0x00,0x57,0xff,0xdc,0x00,0xc4,0x00,0x59,0xff,0x88,0x00,0xc4,0x00,0x5a,0xff,0xad,
-0x00,0xc4,0x00,0x5c,0xff,0x75,0x00,0xc4,0x00,0x6d,0xff,0xb7,0x00,0xc4,0x00,0x82,
-0x00,0x39,0x00,0xc4,0x00,0x83,0x00,0x39,0x00,0xc4,0x00,0x84,0x00,0x39,0x00,0xc4,
-0x00,0x85,0x00,0x39,0x00,0xc4,0x00,0x86,0x00,0x39,0x00,0xc4,0x00,0x94,0xff,0xdc,
-0x00,0xc4,0x00,0x95,0xff,0xdc,0x00,0xc4,0x00,0x96,0xff,0xdc,0x00,0xc4,0x00,0x97,
-0xff,0xdc,0x00,0xc4,0x00,0x98,0xff,0xdc,0x00,0xc4,0x00,0x9f,0xff,0x61,0x00,0xc4,
-0x00,0xa9,0xff,0xdc,0x00,0xc4,0x00,0xaa,0xff,0xdc,0x00,0xc4,0x00,0xab,0xff,0xdc,
-0x00,0xc4,0x00,0xac,0xff,0xdc,0x00,0xc4,0x00,0xad,0xff,0xdc,0x00,0xc4,0x00,0xb4,
-0xff,0xdc,0x00,0xc4,0x00,0xb5,0xff,0xdc,0x00,0xc4,0x00,0xb6,0xff,0xdc,0x00,0xc4,
-0x00,0xb7,0xff,0xdc,0x00,0xc4,0x00,0xb8,0xff,0xdc,0x00,0xc4,0x00,0xbf,0xff,0x75,
-0x00,0xc4,0x00,0xc1,0xff,0x75,0x00,0xc4,0x00,0xc2,0x00,0x39,0x00,0xc4,0x00,0xc4,
-0x00,0x39,0x00,0xc4,0x00,0xc6,0x00,0x39,0x00,0xc4,0x00,0xc8,0xff,0xdc,0x00,0xc4,
-0x00,0xca,0xff,0xdc,0x00,0xc4,0x00,0xcc,0xff,0xdc,0x00,0xc4,0x00,0xcd,0xff,0xdc,
-0x00,0xc4,0x00,0xce,0xff,0xdc,0x00,0xc4,0x00,0xd1,0xff,0xdc,0x00,0xc4,0x00,0xd3,
-0xff,0xdc,0x00,0xc4,0x00,0xd5,0xff,0xdc,0x00,0xc4,0x00,0xd7,0xff,0xdc,0x00,0xc4,
-0x00,0xd9,0xff,0xdc,0x00,0xc4,0x00,0xdb,0xff,0xdc,0x00,0xc4,0x00,0xdd,0xff,0xdc,
-0x00,0xc4,0x00,0xde,0xff,0xdc,0x00,0xc4,0x00,0xe2,0xff,0xdc,0x00,0xc4,0x01,0x0e,
-0xff,0xdc,0x00,0xc4,0x01,0x0f,0xff,0xdc,0x00,0xc4,0x01,0x10,0xff,0xdc,0x00,0xc4,
-0x01,0x11,0xff,0xdc,0x00,0xc4,0x01,0x12,0xff,0xdc,0x00,0xc4,0x01,0x13,0xff,0xdc,
-0x00,0xc4,0x01,0x24,0xff,0x61,0x00,0xc4,0x01,0x25,0xff,0xdc,0x00,0xc4,0x01,0x26,
-0xff,0x61,0x00,0xc4,0x01,0x27,0xff,0xdc,0x00,0xc4,0x01,0x36,0xff,0x90,0x00,0xc4,
-0x01,0x37,0xff,0xad,0x00,0xc4,0x01,0x38,0xff,0x61,0x00,0xc4,0x01,0x39,0xff,0x75,
-0x00,0xc4,0x01,0x3a,0xff,0x61,0x00,0xc4,0x01,0xf0,0xff,0xdc,0x00,0xc4,0x01,0xf1,
-0xff,0xdc,0x00,0xc4,0x06,0x07,0xff,0x90,0x00,0xc4,0x06,0x09,0xff,0x90,0x00,0xc4,
-0x06,0x0a,0xff,0xad,0x00,0xc4,0x06,0x0b,0xff,0x90,0x00,0xc4,0x06,0x0c,0xff,0xad,
-0x00,0xc4,0x06,0x75,0xff,0x61,0x00,0xc4,0x06,0x76,0xff,0x75,0x00,0xc4,0x07,0x7d,
-0xfe,0xf8,0x00,0xc4,0x07,0x7e,0xff,0x02,0x00,0xc4,0x07,0x7f,0x00,0x2f,0x00,0xc6,
-0x00,0x10,0xff,0xd3,0x00,0xc6,0x00,0x11,0xff,0xdc,0x00,0xc6,0x00,0x1d,0xff,0xdc,
-0x00,0xc6,0x00,0x24,0x00,0x39,0x00,0xc6,0x00,0x26,0xff,0xdc,0x00,0xc6,0x00,0x2a,
-0xff,0xdc,0x00,0xc6,0x00,0x32,0xff,0xdc,0x00,0xc6,0x00,0x34,0xff,0xdc,0x00,0xc6,
-0x00,0x37,0xff,0x61,0x00,0xc6,0x00,0x39,0xff,0x7d,0x00,0xc6,0x00,0x3a,0xff,0x90,
-0x00,0xc6,0x00,0x3c,0xff,0x61,0x00,0xc6,0x00,0x46,0xff,0xdc,0x00,0xc6,0x00,0x47,
-0xff,0xdc,0x00,0xc6,0x00,0x48,0xff,0xdc,0x00,0xc6,0x00,0x49,0xff,0xb7,0x00,0xc6,
-0x00,0x52,0xff,0xdc,0x00,0xc6,0x00,0x54,0xff,0xdc,0x00,0xc6,0x00,0x57,0xff,0xdc,
-0x00,0xc6,0x00,0x59,0xff,0x88,0x00,0xc6,0x00,0x5a,0xff,0xad,0x00,0xc6,0x00,0x6d,
-0xff,0xb7,0x00,0xc6,0x00,0x82,0x00,0x39,0x00,0xc6,0x00,0x83,0x00,0x39,0x00,0xc6,
-0x00,0x84,0x00,0x39,0x00,0xc6,0x00,0x85,0x00,0x39,0x00,0xc6,0x00,0x86,0x00,0x39,
-0x00,0xc6,0x00,0x94,0xff,0xdc,0x00,0xc6,0x00,0x95,0xff,0xdc,0x00,0xc6,0x00,0x96,
-0xff,0xdc,0x00,0xc6,0x00,0x97,0xff,0xdc,0x00,0xc6,0x00,0x98,0xff,0xdc,0x00,0xc6,
-0x00,0x9f,0xff,0x61,0x00,0xc6,0x00,0xa9,0xff,0xdc,0x00,0xc6,0x00,0xaa,0xff,0xdc,
-0x00,0xc6,0x00,0xab,0xff,0xdc,0x00,0xc6,0x00,0xac,0xff,0xdc,0x00,0xc6,0x00,0xad,
-0xff,0xdc,0x00,0xc6,0x00,0xb4,0xff,0xdc,0x00,0xc6,0x00,0xb5,0xff,0xdc,0x00,0xc6,
-0x00,0xb6,0xff,0xdc,0x00,0xc6,0x00,0xb7,0xff,0xdc,0x00,0xc6,0x00,0xb8,0xff,0xdc,
-0x00,0xc6,0x00,0xc2,0x00,0x39,0x00,0xc6,0x00,0xc4,0x00,0x39,0x00,0xc6,0x00,0xc6,
-0x00,0x39,0x00,0xc6,0x00,0xc8,0xff,0xdc,0x00,0xc6,0x00,0xca,0xff,0xdc,0x00,0xc6,
-0x00,0xcc,0xff,0xdc,0x00,0xc6,0x00,0xcd,0xff,0xdc,0x00,0xc6,0x00,0xce,0xff,0xdc,
-0x00,0xc6,0x00,0xd1,0xff,0xdc,0x00,0xc6,0x00,0xd3,0xff,0xdc,0x00,0xc6,0x00,0xd5,
-0xff,0xdc,0x00,0xc6,0x00,0xd7,0xff,0xdc,0x00,0xc6,0x00,0xd9,0xff,0xdc,0x00,0xc6,
-0x00,0xdb,0xff,0xdc,0x00,0xc6,0x00,0xdd,0xff,0xdc,0x00,0xc6,0x00,0xde,0xff,0xdc,
-0x00,0xc6,0x00,0xe2,0xff,0xdc,0x00,0xc6,0x01,0x0e,0xff,0xdc,0x00,0xc6,0x01,0x0f,
-0xff,0xdc,0x00,0xc6,0x01,0x10,0xff,0xdc,0x00,0xc6,0x01,0x11,0xff,0xdc,0x00,0xc6,
-0x01,0x13,0xff,0xdc,0x00,0xc6,0x01,0x24,0xff,0x61,0x00,0xc6,0x01,0x25,0xff,0xdc,
-0x00,0xc6,0x01,0x26,0xff,0x61,0x00,0xc6,0x01,0x27,0xff,0xdc,0x00,0xc6,0x01,0x36,
-0xff,0x90,0x00,0xc6,0x01,0x37,0xff,0xad,0x00,0xc6,0x01,0x38,0xff,0x61,0x00,0xc6,
-0x01,0x3a,0xff,0x61,0x00,0xc6,0x01,0xf0,0xff,0xdc,0x00,0xc6,0x01,0xf1,0xff,0xdc,
-0x00,0xc6,0x06,0x07,0xff,0x90,0x00,0xc6,0x06,0x09,0xff,0x90,0x00,0xc6,0x06,0x0a,
-0xff,0xad,0x00,0xc6,0x06,0x0b,0xff,0x90,0x00,0xc6,0x06,0x0c,0xff,0xad,0x00,0xc6,
-0x06,0x75,0xff,0x61,0x00,0xc6,0x07,0x7d,0xfe,0xf8,0x00,0xc6,0x07,0x7e,0xff,0x02,
-0x00,0xc6,0x07,0x7f,0x00,0x2f,0x00,0xc8,0x00,0x3c,0xff,0xdc,0x00,0xc8,0x00,0x6d,
-0xff,0xdc,0x00,0xc8,0x00,0x7d,0xff,0xdc,0x00,0xc8,0x00,0x9f,0xff,0xdc,0x00,0xc8,
-0x01,0x3a,0xff,0xdc,0x00,0xc8,0x07,0x7e,0x00,0x26,0x00,0xce,0x00,0x3c,0xff,0xdc,
-0x00,0xce,0x00,0x6d,0xff,0xdc,0x00,0xce,0x00,0x7d,0xff,0xdc,0x00,0xce,0x00,0x9f,
-0xff,0xdc,0x00,0xce,0x01,0x3a,0xff,0xdc,0x00,0xce,0x07,0x7e,0x00,0x26,0x00,0xd0,
-0x00,0x24,0xff,0xdc,0x00,0xd0,0x00,0x39,0xff,0xdc,0x00,0xd0,0x00,0x3c,0xff,0x90,
-0x00,0xd0,0x00,0x6d,0xff,0xdc,0x00,0xd0,0x00,0x7d,0xff,0xdc,0x00,0xd0,0x00,0x82,
-0xff,0xdc,0x00,0xd0,0x00,0x83,0xff,0xdc,0x00,0xd0,0x00,0x84,0xff,0xdc,0x00,0xd0,
-0x00,0x85,0xff,0xdc,0x00,0xd0,0x00,0x86,0xff,0xdc,0x00,0xd0,0x00,0x9f,0xff,0x90,
-0x00,0xd0,0x00,0xc2,0xff,0xdc,0x00,0xd0,0x00,0xc4,0xff,0xdc,0x00,0xd0,0x00,0xc6,
-0xff,0xdc,0x00,0xd0,0x01,0x38,0xff,0x90,0x00,0xd0,0x01,0x3a,0xff,0x90,0x00,0xd0,
-0x01,0xf4,0xff,0x90,0x00,0xd0,0x06,0x75,0xff,0x90,0x00,0xd0,0x07,0x7d,0xff,0xd3,
-0x00,0xd0,0x07,0x7e,0xff,0xc9,0x00,0xd0,0x07,0x7f,0xff,0x44,0x00,0xd2,0x00,0x24,
-0xff,0xdc,0x00,0xd2,0x00,0x39,0xff,0xdc,0x00,0xd2,0x00,0x3c,0xff,0x90,0x00,0xd2,
-0x00,0x6d,0xff,0xdc,0x00,0xd2,0x00,0x7d,0xff,0xdc,0x00,0xd2,0x00,0x82,0xff,0xdc,
-0x00,0xd2,0x00,0x83,0xff,0xdc,0x00,0xd2,0x00,0x84,0xff,0xdc,0x00,0xd2,0x00,0x85,
-0xff,0xdc,0x00,0xd2,0x00,0x86,0xff,0xdc,0x00,0xd2,0x00,0x9f,0xff,0x90,0x00,0xd2,
-0x01,0x3a,0xff,0x90,0x00,0xd2,0x07,0x7d,0xff,0xd3,0x00,0xd2,0x07,0x7e,0xff,0xc9,
-0x00,0xd2,0x07,0x7f,0xff,0x44,0x00,0xdd,0x00,0x5b,0xff,0xdc,0x00,0xe0,0x00,0x37,
-0xff,0xb7,0x00,0xe0,0x00,0x3c,0xff,0x9a,0x00,0xe0,0x00,0x6d,0xff,0xdc,0x00,0xe0,
-0x00,0x7d,0xff,0xdc,0x00,0xe0,0x00,0x9f,0xff,0x9a,0x00,0xe0,0x01,0x26,0xff,0xb7,
-0x00,0xe0,0x01,0x3a,0xff,0x9a,0x00,0xe0,0x07,0x7d,0xff,0xd3,0x00,0xe0,0x07,0x7e,
-0xff,0xd3,0x00,0xe0,0x07,0x7f,0xff,0xc9,0x00,0xfb,0x00,0x10,0xff,0xdc,0x00,0xfb,
-0x00,0x24,0x00,0x2f,0x00,0xfb,0x00,0x32,0xff,0xb7,0x00,0xfb,0x00,0x37,0xfe,0xe6,
-0x00,0xfb,0x00,0x38,0xff,0x9a,0x00,0xfb,0x00,0x39,0xff,0x1f,0x00,0xfb,0x00,0x3a,
-0xff,0x44,0x00,0xfb,0x00,0x3c,0xfe,0xf0,0x00,0xfb,0x00,0x48,0xff,0xdc,0x00,0xfb,
-0x00,0x52,0xff,0xdc,0x00,0xfb,0x00,0x58,0xff,0xdc,0x00,0xfb,0x00,0x5c,0xff,0x44,
-0x00,0xfb,0x00,0x82,0x00,0x2f,0x00,0xfb,0x00,0x83,0x00,0x2f,0x00,0xfb,0x00,0x84,
-0x00,0x2f,0x00,0xfb,0x00,0x85,0x00,0x2f,0x00,0xfb,0x00,0x86,0x00,0x2f,0x00,0xfb,
-0x00,0x94,0xff,0xb7,0x00,0xfb,0x00,0x95,0xff,0xb7,0x00,0xfb,0x00,0x96,0xff,0xb7,
-0x00,0xfb,0x00,0x97,0xff,0xb7,0x00,0xfb,0x00,0x98,0xff,0xb7,0x00,0xfb,0x00,0x9b,
-0xff,0x9a,0x00,0xfb,0x00,0x9c,0xff,0x9a,0x00,0xfb,0x00,0x9d,0xff,0x9a,0x00,0xfb,
-0x00,0x9e,0xff,0x9a,0x00,0xfb,0x00,0x9f,0xfe,0xf0,0x00,0xfb,0x00,0xaa,0xff,0xdc,
-0x00,0xfb,0x00,0xab,0xff,0xdc,0x00,0xfb,0x00,0xac,0xff,0xdc,0x00,0xfb,0x00,0xad,
-0xff,0xdc,0x00,0xfb,0x00,0xb4,0xff,0xdc,0x00,0xfb,0x00,0xb5,0xff,0xdc,0x00,0xfb,
-0x00,0xb6,0xff,0xdc,0x00,0xfb,0x00,0xb7,0xff,0xdc,0x00,0xfb,0x00,0xb8,0xff,0xdc,
-0x00,0xfb,0x00,0xbb,0xff,0xdc,0x00,0xfb,0x00,0xbc,0xff,0xdc,0x00,0xfb,0x00,0xbd,
-0xff,0xdc,0x00,0xfb,0x00,0xbe,0xff,0xdc,0x00,0xfb,0x00,0xbf,0xff,0x44,0x00,0xfb,
-0x00,0xc1,0xff,0x44,0x00,0xfb,0x00,0xdd,0xff,0xdc,0x00,0xfb,0x01,0x26,0xfe,0xe6,
-0x00,0xfb,0x01,0x30,0xff,0x9a,0x00,0xfb,0x01,0x31,0xff,0xdc,0x00,0xfb,0x01,0x3a,
-0xfe,0xf0,0x00,0xfb,0x07,0x7d,0xfe,0x61,0x00,0xfb,0x07,0x7e,0xfd,0xe6,0x00,0xff,
-0x00,0x10,0xff,0xdc,0x00,0xff,0x00,0x24,0x00,0x2f,0x00,0xff,0x00,0x32,0xff,0xb7,
-0x00,0xff,0x00,0x37,0xfe,0xe6,0x00,0xff,0x00,0x38,0xff,0x9a,0x00,0xff,0x00,0x39,
-0xff,0x1f,0x00,0xff,0x00,0x3a,0xff,0x44,0x00,0xff,0x00,0x3c,0xfe,0xf0,0x00,0xff,
-0x00,0x48,0xff,0xdc,0x00,0xff,0x00,0x52,0xff,0xdc,0x00,0xff,0x00,0x58,0xff,0xdc,
-0x00,0xff,0x00,0x5c,0xff,0x44,0x00,0xff,0x00,0x82,0x00,0x2f,0x00,0xff,0x00,0x83,
-0x00,0x2f,0x00,0xff,0x00,0x84,0x00,0x2f,0x00,0xff,0x00,0x85,0x00,0x2f,0x00,0xff,
-0x00,0x86,0x00,0x2f,0x00,0xff,0x00,0x94,0xff,0xb7,0x00,0xff,0x00,0x95,0xff,0xb7,
-0x00,0xff,0x00,0x96,0xff,0xb7,0x00,0xff,0x00,0x97,0xff,0xb7,0x00,0xff,0x00,0x98,
-0xff,0xb7,0x00,0xff,0x00,0x9b,0xff,0x9a,0x00,0xff,0x00,0x9c,0xff,0x9a,0x00,0xff,
-0x00,0x9d,0xff,0x9a,0x00,0xff,0x00,0x9e,0xff,0x9a,0x00,0xff,0x00,0x9f,0xfe,0xf0,
-0x00,0xff,0x00,0xaa,0xff,0xdc,0x00,0xff,0x00,0xab,0xff,0xdc,0x00,0xff,0x00,0xac,
-0xff,0xdc,0x00,0xff,0x00,0xad,0xff,0xdc,0x00,0xff,0x00,0xb4,0xff,0xdc,0x00,0xff,
-0x00,0xb5,0xff,0xdc,0x00,0xff,0x00,0xb6,0xff,0xdc,0x00,0xff,0x00,0xb7,0xff,0xdc,
-0x00,0xff,0x00,0xb8,0xff,0xdc,0x00,0xff,0x00,0xbb,0xff,0xdc,0x00,0xff,0x00,0xbc,
-0xff,0xdc,0x00,0xff,0x00,0xbd,0xff,0xdc,0x00,0xff,0x00,0xbe,0xff,0xdc,0x00,0xff,
-0x00,0xbf,0xff,0x44,0x00,0xff,0x00,0xc1,0xff,0x44,0x00,0xff,0x00,0xdd,0xff,0xdc,
-0x00,0xff,0x01,0x26,0xfe,0xe6,0x00,0xff,0x01,0x30,0xff,0x9a,0x00,0xff,0x01,0x31,
-0xff,0xdc,0x00,0xff,0x01,0x3a,0xfe,0xf0,0x00,0xff,0x07,0x7d,0xfe,0x61,0x00,0xff,
-0x07,0x7e,0xfd,0xe6,0x01,0x02,0x00,0x4f,0xff,0x3f,0x01,0x0a,0x07,0x7d,0xff,0x6b,
-0x01,0x0a,0x07,0x7e,0xff,0x90,0x01,0x0a,0x07,0x7f,0xff,0xa4,0x01,0x16,0x00,0x10,
-0xff,0xad,0x01,0x16,0x00,0x11,0xff,0xb7,0x01,0x16,0x00,0x1d,0xff,0xc1,0x01,0x16,
-0x00,0x24,0xff,0xad,0x01,0x16,0x00,0x26,0xff,0x9a,0x01,0x16,0x00,0x37,0xff,0x6b,
-0x01,0x16,0x00,0x39,0xff,0x90,0x01,0x16,0x00,0x3a,0xff,0xad,0x01,0x16,0x00,0x3c,
-0xff,0x7d,0x01,0x16,0x00,0x44,0xff,0xd3,0x01,0x16,0x00,0x48,0xff,0xa4,0x01,0x16,
-0x00,0x52,0xff,0xa4,0x01,0x16,0x00,0x58,0xff,0xa4,0x01,0x16,0x00,0x5c,0xff,0x90,
-0x01,0x16,0x00,0x6d,0xff,0x90,0x01,0x16,0x00,0x7d,0xff,0xdc,0x01,0x16,0x00,0x82,
-0xff,0xad,0x01,0x16,0x00,0x83,0xff,0xad,0x01,0x16,0x00,0x84,0xff,0xad,0x01,0x16,
-0x00,0x85,0xff,0xad,0x01,0x16,0x00,0x86,0xff,0xad,0x01,0x16,0x00,0x89,0xff,0x9a,
-0x01,0x16,0x00,0x9f,0xff,0x7d,0x01,0x16,0x00,0xa2,0xff,0xd3,0x01,0x16,0x00,0xa3,
-0xff,0xd3,0x01,0x16,0x00,0xa4,0xff,0xd3,0x01,0x16,0x00,0xa5,0xff,0xd3,0x01,0x16,
-0x00,0xa6,0xff,0xd3,0x01,0x16,0x00,0xa7,0xff,0xd3,0x01,0x16,0x00,0xaa,0xff,0xa4,
-0x01,0x16,0x00,0xab,0xff,0xa4,0x01,0x16,0x00,0xac,0xff,0xa4,0x01,0x16,0x00,0xad,
-0xff,0xa4,0x01,0x16,0x00,0xb4,0xff,0xa4,0x01,0x16,0x00,0xb5,0xff,0xa4,0x01,0x16,
-0x00,0xb6,0xff,0xa4,0x01,0x16,0x00,0xb7,0xff,0xa4,0x01,0x16,0x00,0xb8,0xff,0xa4,
-0x01,0x16,0x00,0xbb,0xff,0xa4,0x01,0x16,0x00,0xbc,0xff,0xa4,0x01,0x16,0x00,0xbd,
-0xff,0xa4,0x01,0x16,0x00,0xbe,0xff,0xa4,0x01,0x16,0x00,0xbf,0xff,0x90,0x01,0x16,
-0x00,0xc1,0xff,0x90,0x01,0x16,0x00,0xc8,0xff,0x9a,0x01,0x16,0x00,0xce,0xff,0x9a,
-0x01,0x16,0x00,0xdd,0xff,0xa4,0x01,0x16,0x01,0x26,0xff,0x6b,0x01,0x16,0x01,0x31,
-0xff,0xa4,0x01,0x16,0x01,0x3a,0xff,0x7d,0x01,0x16,0x07,0x7d,0xff,0x6b,0x01,0x16,
-0x07,0x7e,0xff,0x7d,0x01,0x16,0x07,0x7f,0xff,0xdc,0x01,0x17,0x00,0x10,0xff,0x7d,
-0x01,0x17,0x00,0x11,0xff,0x44,0x01,0x17,0x00,0x1d,0xff,0xdc,0x01,0x17,0x00,0x46,
-0xff,0xd3,0x01,0x17,0x00,0x47,0xff,0xdc,0x01,0x17,0x00,0x48,0xff,0xd3,0x01,0x17,
-0x00,0x4a,0xff,0xdc,0x01,0x17,0x00,0x4b,0xff,0xdc,0x01,0x17,0x00,0x50,0xff,0xdc,
-0x01,0x17,0x00,0x51,0xff,0xdc,0x01,0x17,0x00,0x52,0xff,0xd3,0x01,0x17,0x00,0x54,
-0xff,0xdc,0x01,0x17,0x00,0x55,0xff,0xdc,0x01,0x17,0x00,0x5b,0xff,0xc9,0x01,0x17,
-0x00,0x6d,0xff,0xb7,0x01,0x17,0x00,0xa9,0xff,0xd3,0x01,0x17,0x00,0xaa,0xff,0xd3,
-0x01,0x17,0x00,0xab,0xff,0xd3,0x01,0x17,0x00,0xac,0xff,0xd3,0x01,0x17,0x00,0xad,
-0xff,0xd3,0x01,0x17,0x00,0xb3,0xff,0xdc,0x01,0x17,0x00,0xb4,0xff,0xd3,0x01,0x17,
-0x00,0xb5,0xff,0xd3,0x01,0x17,0x00,0xb6,0xff,0xd3,0x01,0x17,0x00,0xb7,0xff,0xd3,
-0x01,0x17,0x00,0xb8,0xff,0xd3,0x01,0x17,0x00,0xc9,0xff,0xd3,0x01,0x17,0x00,0xcf,
-0xff,0xd3,0x01,0x17,0x00,0xd1,0x00,0x48,0x01,0x17,0x00,0xdd,0xff,0xd3,0x01,0x17,
-0x00,0xe1,0xff,0xdc,0x01,0x17,0x01,0x0a,0xff,0xdc,0x01,0x17,0x01,0x17,0xff,0xdc,
-0x01,0x17,0x01,0x1b,0xff,0xdc,0x01,0x17,0x07,0x7e,0x00,0x56,0x01,0x17,0x07,0x7f,
-0xfe,0xc9,0x01,0x1a,0x00,0x10,0xff,0xad,0x01,0x1a,0x00,0x11,0xff,0xb7,0x01,0x1a,
-0x00,0x1d,0xff,0xc1,0x01,0x1a,0x00,0x24,0xff,0xad,0x01,0x1a,0x00,0x26,0xff,0x9a,
-0x01,0x1a,0x00,0x37,0xff,0x6b,0x01,0x1a,0x00,0x39,0xff,0x90,0x01,0x1a,0x00,0x3a,
-0xff,0xad,0x01,0x1a,0x00,0x3c,0xff,0x7d,0x01,0x1a,0x00,0x44,0xff,0xd3,0x01,0x1a,
-0x00,0x48,0xff,0xa4,0x01,0x1a,0x00,0x52,0xff,0xa4,0x01,0x1a,0x00,0x58,0xff,0xa4,
-0x01,0x1a,0x00,0x5c,0xff,0x90,0x01,0x1a,0x00,0x6d,0xff,0x90,0x01,0x1a,0x00,0x7d,
-0xff,0xdc,0x01,0x1a,0x00,0x82,0xff,0xad,0x01,0x1a,0x00,0x83,0xff,0xad,0x01,0x1a,
-0x00,0x84,0xff,0xad,0x01,0x1a,0x00,0x85,0xff,0xad,0x01,0x1a,0x00,0x86,0xff,0xad,
-0x01,0x1a,0x00,0x89,0xff,0x9a,0x01,0x1a,0x00,0x9f,0xff,0x7d,0x01,0x1a,0x00,0xa2,
-0xff,0xd3,0x01,0x1a,0x00,0xa3,0xff,0xd3,0x01,0x1a,0x00,0xa4,0xff,0xd3,0x01,0x1a,
-0x00,0xa5,0xff,0xd3,0x01,0x1a,0x00,0xa6,0xff,0xd3,0x01,0x1a,0x00,0xa7,0xff,0xd3,
-0x01,0x1a,0x00,0xaa,0xff,0xa4,0x01,0x1a,0x00,0xab,0xff,0xa4,0x01,0x1a,0x00,0xac,
-0xff,0xa4,0x01,0x1a,0x00,0xad,0xff,0xa4,0x01,0x1a,0x00,0xb4,0xff,0xa4,0x01,0x1a,
-0x00,0xb5,0xff,0xa4,0x01,0x1a,0x00,0xb6,0xff,0xa4,0x01,0x1a,0x00,0xb7,0xff,0xa4,
-0x01,0x1a,0x00,0xb8,0xff,0xa4,0x01,0x1a,0x00,0xbb,0xff,0xa4,0x01,0x1a,0x00,0xbc,
-0xff,0xa4,0x01,0x1a,0x00,0xbd,0xff,0xa4,0x01,0x1a,0x00,0xbe,0xff,0xa4,0x01,0x1a,
-0x00,0xbf,0xff,0x90,0x01,0x1a,0x00,0xc1,0xff,0x90,0x01,0x1a,0x00,0xc8,0xff,0x9a,
-0x01,0x1a,0x00,0xce,0xff,0x9a,0x01,0x1a,0x00,0xdd,0xff,0xa4,0x01,0x1a,0x01,0x26,
-0xff,0x6b,0x01,0x1a,0x01,0x31,0xff,0xa4,0x01,0x1a,0x01,0x3a,0xff,0x7d,0x01,0x1a,
-0x07,0x7d,0xff,0x6b,0x01,0x1a,0x07,0x7e,0xff,0x7d,0x01,0x1a,0x07,0x7f,0xff,0xdc,
-0x01,0x1b,0x00,0x10,0xff,0x7d,0x01,0x1b,0x00,0x11,0xff,0x44,0x01,0x1b,0x00,0x1d,
-0xff,0xdc,0x01,0x1b,0x00,0x46,0xff,0xd3,0x01,0x1b,0x00,0x47,0xff,0xdc,0x01,0x1b,
-0x00,0x48,0xff,0xd3,0x01,0x1b,0x00,0x4a,0xff,0xdc,0x01,0x1b,0x00,0x4b,0xff,0xdc,
-0x01,0x1b,0x00,0x50,0xff,0xdc,0x01,0x1b,0x00,0x51,0xff,0xdc,0x01,0x1b,0x00,0x52,
-0xff,0xd3,0x01,0x1b,0x00,0x54,0xff,0xdc,0x01,0x1b,0x00,0x55,0xff,0xdc,0x01,0x1b,
-0x00,0x5b,0xff,0xc9,0x01,0x1b,0x00,0x6d,0xff,0xb7,0x01,0x1b,0x00,0xa9,0xff,0xd3,
-0x01,0x1b,0x00,0xaa,0xff,0xd3,0x01,0x1b,0x00,0xab,0xff,0xd3,0x01,0x1b,0x00,0xac,
-0xff,0xd3,0x01,0x1b,0x00,0xad,0xff,0xd3,0x01,0x1b,0x00,0xb3,0xff,0xdc,0x01,0x1b,
-0x00,0xb4,0xff,0xd3,0x01,0x1b,0x00,0xb5,0xff,0xd3,0x01,0x1b,0x00,0xb6,0xff,0xd3,
-0x01,0x1b,0x00,0xb7,0xff,0xd3,0x01,0x1b,0x00,0xb8,0xff,0xd3,0x01,0x1b,0x00,0xc9,
-0xff,0xd3,0x01,0x1b,0x00,0xcf,0xff,0xd3,0x01,0x1b,0x00,0xd1,0xff,0xdc,0x01,0x1b,
-0x00,0xdd,0xff,0xd3,0x01,0x1b,0x00,0xe1,0xff,0xdc,0x01,0x1b,0x01,0x0a,0xff,0xdc,
-0x01,0x1b,0x01,0x17,0xff,0xdc,0x01,0x1b,0x01,0x1b,0xff,0xdc,0x01,0x1b,0x07,0x7e,
-0x00,0x56,0x01,0x1b,0x07,0x7f,0xfe,0xc9,0x01,0x20,0x00,0x24,0x00,0x26,0x01,0x20,
-0x00,0x82,0x00,0x26,0x01,0x20,0x00,0x83,0x00,0x26,0x01,0x20,0x00,0x84,0x00,0x26,
-0x01,0x20,0x00,0x85,0x00,0x26,0x01,0x20,0x00,0x86,0x00,0x26,0x01,0x22,0x00,0x24,
-0x00,0x26,0x01,0x22,0x00,0x82,0x00,0x26,0x01,0x22,0x00,0x83,0x00,0x26,0x01,0x22,
-0x00,0x84,0x00,0x26,0x01,0x22,0x00,0x85,0x00,0x26,0x01,0x22,0x00,0x86,0x00,0x26,
-0x01,0x26,0x00,0x10,0xff,0x44,0x01,0x26,0x00,0x11,0xff,0x0d,0x01,0x26,0x00,0x1d,
-0xff,0x1f,0x01,0x26,0x00,0x24,0xff,0x61,0x01,0x26,0x00,0x26,0xff,0x88,0x01,0x26,
-0x00,0x37,0xff,0xdc,0x01,0x26,0x00,0x44,0xfe,0xad,0x01,0x26,0x00,0x46,0xfe,0xa4,
-0x01,0x26,0x00,0x48,0xfe,0xa4,0x01,0x26,0x00,0x4c,0xff,0xc1,0x01,0x26,0x00,0x52,
-0xfe,0xa4,0x01,0x26,0x00,0x55,0xfe,0xd3,0x01,0x26,0x00,0x56,0xfe,0xad,0x01,0x26,
-0x00,0x58,0xfe,0xc9,0x01,0x26,0x00,0x5a,0xfe,0xad,0x01,0x26,0x00,0x5c,0xfe,0xc1,
-0x01,0x26,0x00,0x6d,0xff,0x44,0x01,0x26,0x00,0x7d,0xff,0x90,0x01,0x26,0x00,0x82,
-0xff,0x61,0x01,0x26,0x00,0x83,0xff,0x61,0x01,0x26,0x00,0x84,0xff,0x61,0x01,0x26,
-0x00,0x85,0xff,0x61,0x01,0x26,0x00,0x86,0xff,0x61,0x01,0x26,0x00,0x89,0xff,0x88,
-0x01,0x26,0x00,0xa2,0xfe,0xad,0x01,0x26,0x00,0xa3,0xfe,0xad,0x01,0x26,0x00,0xa4,
-0xfe,0xad,0x01,0x26,0x00,0xa5,0xfe,0xad,0x01,0x26,0x00,0xa6,0xfe,0xad,0x01,0x26,
-0x00,0xa7,0xfe,0xad,0x01,0x26,0x00,0xa9,0xfe,0xa4,0x01,0x26,0x00,0xaa,0xfe,0xa4,
-0x01,0x26,0x00,0xab,0xfe,0xa4,0x01,0x26,0x00,0xac,0xfe,0xa4,0x01,0x26,0x00,0xad,
-0xfe,0xa4,0x01,0x26,0x00,0xb4,0xfe,0xa4,0x01,0x26,0x00,0xb5,0xfe,0xa4,0x01,0x26,
-0x00,0xb6,0xfe,0xa4,0x01,0x26,0x00,0xb7,0xfe,0xa4,0x01,0x26,0x00,0xb8,0xfe,0xa4,
-0x01,0x26,0x00,0xbb,0xfe,0xc9,0x01,0x26,0x00,0xbc,0xfe,0xc9,0x01,0x26,0x00,0xbd,
-0xfe,0xc9,0x01,0x26,0x00,0xbe,0xfe,0xc9,0x01,0x26,0x00,0xbf,0xfe,0xc1,0x01,0x26,
-0x00,0xc1,0xfe,0xc1,0x01,0x26,0x00,0xc8,0xff,0x88,0x01,0x26,0x00,0xc9,0xfe,0xa4,
-0x01,0x26,0x00,0xce,0xff,0x88,0x01,0x26,0x00,0xcf,0xfe,0xa4,0x01,0x26,0x00,0xdd,
-0xfe,0xa4,0x01,0x26,0x01,0x17,0xfe,0xd3,0x01,0x26,0x01,0x1b,0xfe,0xd3,0x01,0x26,
-0x01,0x21,0xfe,0xad,0x01,0x26,0x01,0x23,0xfe,0xad,0x01,0x26,0x01,0x26,0xff,0xdc,
-0x01,0x26,0x01,0x31,0xfe,0xc9,0x01,0x26,0x07,0x7e,0xff,0xd3,0x01,0x26,0x07,0x7f,
-0xfe,0xf8,0x01,0x30,0x00,0x3d,0xff,0xdc,0x01,0x30,0x01,0x3f,0xff,0xdc,0x01,0x3a,
-0x00,0x10,0xff,0x0d,0x01,0x3a,0x00,0x11,0xfe,0x61,0x01,0x3a,0x00,0x1d,0xfe,0xf0,
-0x01,0x3a,0x00,0x24,0xff,0x61,0x01,0x3a,0x00,0x26,0xff,0x90,0x01,0x3a,0x00,0x32,
-0xff,0x90,0x01,0x3a,0x00,0x44,0xfe,0xe6,0x01,0x3a,0x00,0x48,0xfe,0xf0,0x01,0x3a,
-0x00,0x4c,0xff,0xb7,0x01,0x3a,0x00,0x52,0xfe,0xf0,0x01,0x3a,0x00,0x58,0xff,0x15,
-0x01,0x3a,0x00,0x6d,0xff,0x1f,0x01,0x3a,0x00,0x7d,0xff,0x6b,0x01,0x3a,0x00,0x82,
-0xff,0x61,0x01,0x3a,0x00,0x83,0xff,0x61,0x01,0x3a,0x00,0x84,0xff,0x61,0x01,0x3a,
-0x00,0x85,0xff,0x61,0x01,0x3a,0x00,0x86,0xff,0x61,0x01,0x3a,0x00,0x89,0xff,0x90,
-0x01,0x3a,0x00,0x94,0xff,0x90,0x01,0x3a,0x00,0x95,0xff,0x90,0x01,0x3a,0x00,0x96,
-0xff,0x90,0x01,0x3a,0x00,0x97,0xff,0x90,0x01,0x3a,0x00,0x98,0xff,0x90,0x01,0x3a,
-0x00,0xa2,0xfe,0xe6,0x01,0x3a,0x00,0xa3,0xfe,0xe6,0x01,0x3a,0x00,0xa4,0xfe,0xe6,
-0x01,0x3a,0x00,0xa5,0xfe,0xe6,0x01,0x3a,0x00,0xa6,0xfe,0xe6,0x01,0x3a,0x00,0xa7,
-0xfe,0xe6,0x01,0x3a,0x00,0xaa,0xfe,0xf0,0x01,0x3a,0x00,0xab,0xfe,0xf0,0x01,0x3a,
-0x00,0xac,0xfe,0xf0,0x01,0x3a,0x00,0xad,0xfe,0xf0,0x01,0x3a,0x00,0xb4,0xfe,0xf0,
-0x01,0x3a,0x00,0xb5,0xfe,0xf0,0x01,0x3a,0x00,0xb6,0xfe,0xf0,0x01,0x3a,0x00,0xb7,
-0xfe,0xf0,0x01,0x3a,0x00,0xb8,0xfe,0xf0,0x01,0x3a,0x00,0xbb,0xff,0x15,0x01,0x3a,
-0x00,0xbc,0xff,0x15,0x01,0x3a,0x00,0xbd,0xff,0x15,0x01,0x3a,0x00,0xbe,0xff,0x15,
-0x01,0x3a,0x00,0xc8,0xff,0x90,0x01,0x3a,0x00,0xce,0xff,0x90,0x01,0x3a,0x00,0xdd,
-0xfe,0xf0,0x01,0x3a,0x01,0x31,0xff,0x15,0x01,0x3a,0x07,0x7d,0xff,0x90,0x01,0x3a,
-0x07,0x7e,0xff,0xdc,0x01,0x3a,0x07,0x7f,0xfe,0xf8,0x01,0x3f,0x00,0x10,0xff,0xdc,
-0x01,0x3f,0x07,0x7d,0xff,0xdc,0x01,0x3f,0x07,0x7e,0xff,0xdc,0x01,0x3f,0x07,0x7f,
-0xff,0xdc,0x07,0x71,0x00,0x24,0xff,0xd3,0x07,0x71,0x00,0x25,0xff,0xb7,0x07,0x71,
-0x00,0x2a,0x00,0x4b,0x07,0x71,0x00,0x2d,0x00,0x72,0x07,0x71,0x00,0x32,0x00,0x39,
-0x07,0x71,0x00,0x34,0x00,0x4b,0x07,0x71,0x00,0x37,0xff,0x44,0x07,0x71,0x00,0x39,
-0xff,0x88,0x07,0x71,0x00,0x3a,0xff,0xad,0x07,0x71,0x00,0x3b,0xff,0x9a,0x07,0x71,
-0x00,0x3c,0xff,0x0d,0x07,0x71,0x00,0x52,0x00,0x26,0x07,0x71,0x00,0x59,0xff,0xc9,
-0x07,0x71,0x00,0x5c,0xff,0xdc,0x07,0x71,0x00,0x82,0xff,0xd3,0x07,0x71,0x00,0x83,
-0xff,0xd3,0x07,0x71,0x00,0x84,0xff,0xd3,0x07,0x71,0x00,0x85,0xff,0xd3,0x07,0x71,
-0x00,0x86,0xff,0xd3,0x07,0x71,0x00,0x94,0x00,0x39,0x07,0x71,0x00,0x95,0x00,0x39,
-0x07,0x71,0x00,0x96,0x00,0x39,0x07,0x71,0x00,0x97,0x00,0x39,0x07,0x71,0x00,0x98,
-0x00,0x39,0x07,0x71,0x00,0x9f,0xff,0x0d,0x07,0x71,0x00,0xb4,0x00,0x26,0x07,0x71,
-0x00,0xb5,0x00,0x26,0x07,0x71,0x00,0xb6,0x00,0x26,0x07,0x71,0x00,0xb7,0x00,0x26,
-0x07,0x71,0x00,0xb8,0x00,0x26,0x07,0x71,0x00,0xbf,0xff,0xdc,0x07,0x71,0x00,0xc1,
-0xff,0xdc,0x07,0x71,0x00,0xe0,0x00,0x4b,0x07,0x71,0x01,0x26,0xff,0x44,0x07,0x71,
-0x01,0x3a,0xff,0x0d,0x07,0x7d,0x00,0x24,0xfe,0xf8,0x07,0x7d,0x00,0x25,0xff,0xc1,
-0x07,0x7d,0x00,0x26,0xff,0xb7,0x07,0x7d,0x00,0x27,0xff,0xc1,0x07,0x7d,0x00,0x29,
-0xff,0xc1,0x07,0x7d,0x00,0x2a,0xff,0xb7,0x07,0x7d,0x00,0x2b,0xff,0xc1,0x07,0x7d,
-0x00,0x2d,0xff,0xc1,0x07,0x7d,0x00,0x2e,0xff,0xc1,0x07,0x7d,0x00,0x2f,0xff,0xc1,
-0x07,0x7d,0x00,0x32,0xff,0xb7,0x07,0x7d,0x00,0x33,0xff,0xc1,0x07,0x7d,0x00,0x34,
-0xff,0xb7,0x07,0x7d,0x00,0x35,0xff,0xc1,0x07,0x7d,0x00,0x3b,0xff,0x88,0x07,0x7d,
-0x00,0x3d,0xff,0xdc,0x07,0x7d,0x00,0x49,0xff,0xb7,0x07,0x7d,0x00,0x51,0xff,0x90,
-0x07,0x7d,0x00,0x52,0xff,0x6b,0x07,0x7d,0x00,0x55,0xff,0x90,0x07,0x7d,0x00,0x59,
-0xff,0xb7,0x07,0x7d,0x00,0x5a,0xff,0xb7,0x07,0x7d,0x00,0x5c,0xff,0xb7,0x07,0x7d,
-0x00,0x82,0xfe,0xf8,0x07,0x7d,0x00,0x83,0xfe,0xf8,0x07,0x7d,0x00,0x84,0xfe,0xf8,
-0x07,0x7d,0x00,0x85,0xfe,0xf8,0x07,0x7d,0x00,0x86,0xfe,0xf8,0x07,0x7d,0x00,0x88,
-0xfe,0x7d,0x07,0x7d,0x00,0x89,0xff,0xb7,0x07,0x7d,0x00,0x94,0xff,0xb7,0x07,0x7d,
-0x00,0x95,0xff,0xb7,0x07,0x7d,0x00,0x96,0xff,0xb7,0x07,0x7d,0x00,0x97,0xff,0xb7,
-0x07,0x7d,0x00,0x98,0xff,0xb7,0x07,0x7d,0x00,0xa0,0xff,0xc1,0x07,0x7d,0x00,0xa1,
-0xff,0xc1,0x07,0x7d,0x00,0xb2,0xff,0xb7,0x07,0x7d,0x00,0xb3,0xff,0x90,0x07,0x7d,
-0x00,0xb4,0xff,0x6b,0x07,0x7d,0x00,0xb5,0xff,0x6b,0x07,0x7d,0x00,0xb6,0xff,0x6b,
-0x07,0x7d,0x00,0xb7,0xff,0x6b,0x07,0x7d,0x00,0xb8,0xff,0x6b,0x07,0x7d,0x00,0xbf,
-0xff,0xb7,0x07,0x7d,0x00,0xc1,0xff,0xb7,0x07,0x7d,0x00,0xc8,0xff,0xb7,0x07,0x7d,
-0x00,0xce,0xff,0xb7,0x07,0x7d,0x00,0xd0,0xff,0xc1,0x07,0x7d,0x00,0xe0,0xff,0xb7,
-0x07,0x7d,0x00,0xfb,0xff,0xc1,0x07,0x7d,0x00,0xff,0xff,0xc1,0x07,0x7d,0x01,0x0a,
-0xff,0x90,0x07,0x7d,0x01,0x16,0xff,0xc1,0x07,0x7d,0x01,0x17,0xff,0x90,0x07,0x7d,
-0x01,0x1a,0xff,0xc1,0x07,0x7d,0x01,0x1b,0xff,0x90,0x07,0x7d,0x01,0x3f,0xff,0xdc,
-0x07,0x7f,0x00,0x24,0x00,0x26,0x07,0x7f,0x00,0x25,0xff,0xb7,0x07,0x7f,0x00,0x26,
-0xff,0x90,0x07,0x7f,0x00,0x27,0xff,0xb7,0x07,0x7f,0x00,0x29,0xff,0xb7,0x07,0x7f,
-0x00,0x2a,0xff,0xb7,0x07,0x7f,0x00,0x2b,0xff,0xb7,0x07,0x7f,0x00,0x2d,0x00,0x2f,
-0x07,0x7f,0x00,0x2e,0xff,0xb7,0x07,0x7f,0x00,0x2f,0xff,0xb7,0x07,0x7f,0x00,0x32,
-0xff,0x90,0x07,0x7f,0x00,0x33,0xff,0xb7,0x07,0x7f,0x00,0x34,0xff,0x90,0x07,0x7f,
-0x00,0x35,0xff,0xb7,0x07,0x7f,0x00,0x37,0xfe,0xe6,0x07,0x7f,0x00,0x39,0xfe,0x88,
-0x07,0x7f,0x00,0x3a,0xff,0x03,0x07,0x7f,0x00,0x3b,0xff,0xb7,0x07,0x7f,0x00,0x3c,
-0xfe,0x88,0x07,0x7f,0x00,0x49,0xff,0xdc,0x07,0x7f,0x00,0x51,0xff,0xb7,0x07,0x7f,
-0x00,0x52,0xff,0xb7,0x07,0x7f,0x00,0x55,0xff,0xb7,0x07,0x7f,0x00,0x59,0xff,0x15,
-0x07,0x7f,0x00,0x5a,0xff,0x3c,0x07,0x7f,0x00,0x5c,0xff,0x90,0x07,0x7f,0x00,0x82,
-0x00,0x26,0x07,0x7f,0x00,0x83,0x00,0x26,0x07,0x7f,0x00,0x84,0x00,0x26,0x07,0x7f,
-0x00,0x85,0x00,0x26,0x07,0x7f,0x00,0x86,0x00,0x26,0x07,0x7f,0x00,0x88,0x00,0x26,
-0x07,0x7f,0x00,0x89,0xff,0x90,0x07,0x7f,0x00,0x94,0xff,0x90,0x07,0x7f,0x00,0x95,
-0xff,0x90,0x07,0x7f,0x00,0x96,0xff,0x90,0x07,0x7f,0x00,0x97,0xff,0x90,0x07,0x7f,
-0x00,0x98,0xff,0x90,0x07,0x7f,0x00,0x9f,0xfe,0x88,0x07,0x7f,0x00,0xa0,0xff,0xb7,
-0x07,0x7f,0x00,0xa1,0xff,0xb7,0x07,0x7f,0x00,0xb2,0xff,0xb7,0x07,0x7f,0x00,0xb3,
-0xff,0xb7,0x07,0x7f,0x00,0xb4,0xff,0xb7,0x07,0x7f,0x00,0xb5,0xff,0xb7,0x07,0x7f,
-0x00,0xb6,0xff,0xb7,0x07,0x7f,0x00,0xb7,0xff,0xb7,0x07,0x7f,0x00,0xb8,0xff,0xb7,
-0x07,0x7f,0x00,0xbf,0xff,0x90,0x07,0x7f,0x00,0xc1,0xff,0x90,0x07,0x7f,0x00,0xc8,
-0xff,0x90,0x07,0x7f,0x00,0xce,0xff,0x90,0x07,0x7f,0x00,0xd0,0xff,0xb7,0x07,0x7f,
-0x00,0xe0,0xff,0xb7,0x07,0x7f,0x00,0xfb,0xff,0xb7,0x07,0x7f,0x00,0xff,0xff,0xb7,
-0x07,0x7f,0x01,0x0a,0xff,0xb7,0x07,0x7f,0x01,0x16,0xff,0xb7,0x07,0x7f,0x01,0x17,
-0xff,0xb7,0x07,0x7f,0x01,0x1a,0xff,0xb7,0x07,0x7f,0x01,0x1b,0xff,0xb7,0x07,0x7f,
-0x01,0x26,0xfe,0xe6,0x07,0x7f,0x01,0x3a,0xfe,0x88,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x44,
-0x00,0x00,0x00,0xa6,0x00,0x00,0x01,0x10,0x00,0x00,0x01,0xe8,0x00,0x00,0x03,0x3e,
-0x00,0x00,0x04,0x64,0x00,0x00,0x06,0xcc,0x00,0x00,0x07,0x1e,0x00,0x00,0x07,0x8e,
-0x00,0x00,0x07,0xe4,0x00,0x00,0x08,0x7e,0x00,0x00,0x08,0xd2,0x00,0x00,0x09,0x0a,
-0x00,0x00,0x09,0x36,0x00,0x00,0x09,0x5e,0x00,0x00,0x09,0xa8,0x00,0x00,0x0a,0x2c,
-0x00,0x00,0x0a,0x9a,0x00,0x00,0x0b,0x94,0x00,0x00,0x0c,0x7c,0x00,0x00,0x0d,0x36,
-0x00,0x00,0x0d,0xf4,0x00,0x00,0x0e,0xca,0x00,0x00,0x0f,0x54,0x00,0x00,0x10,0x26,
-0x00,0x00,0x10,0xfa,0x00,0x00,0x11,0x38,0x00,0x00,0x11,0x88,0x00,0x00,0x12,0x00,
-0x00,0x00,0x12,0x42,0x00,0x00,0x12,0xb8,0x00,0x00,0x13,0x8e,0x00,0x00,0x15,0x0e,
-0x00,0x00,0x16,0x00,0x00,0x00,0x16,0xb0,0x00,0x00,0x17,0x46,0x00,0x00,0x17,0xc4,
-0x00,0x00,0x18,0x22,0x00,0x00,0x18,0x76,0x00,0x00,0x19,0x1c,0x00,0x00,0x19,0x78,
-0x00,0x00,0x19,0xc0,0x00,0x00,0x1a,0x2e,0x00,0x00,0x1b,0x54,0x00,0x00,0x1b,0x98,
-0x00,0x00,0x1c,0x92,0x00,0x00,0x1d,0x3a,0x00,0x00,0x1d,0xc4,0x00,0x00,0x1e,0x44,
-0x00,0x00,0x1f,0x10,0x00,0x00,0x20,0x24,0x00,0x00,0x21,0x1c,0x00,0x00,0x21,0x8c,
-0x00,0x00,0x22,0x10,0x00,0x00,0x22,0xf0,0x00,0x00,0x24,0xaa,0x00,0x00,0x25,0x4e,
-0x00,0x00,0x26,0x10,0x00,0x00,0x26,0xce,0x00,0x00,0x27,0x2c,0x00,0x00,0x27,0x78,
-0x00,0x00,0x27,0xcc,0x00,0x00,0x28,0x10,0x00,0x00,0x28,0x3a,0x00,0x00,0x28,0x8a,
-0x00,0x00,0x29,0xb6,0x00,0x00,0x2a,0x4e,0x00,0x00,0x2a,0xe4,0x00,0x00,0x2b,0x7c,
-0x00,0x00,0x2c,0x50,0x00,0x00,0x2c,0xe8,0x00,0x00,0x2d,0xb0,0x00,0x00,0x2e,0x28,
-0x00,0x00,0x2e,0x78,0x00,0x00,0x2e,0xf2,0x00,0x00,0x2f,0xe2,0x00,0x00,0x30,0x1e,
-0x00,0x00,0x30,0xe0,0x00,0x00,0x31,0x58,0x00,0x00,0x31,0xfa,0x00,0x00,0x32,0x98,
-0x00,0x00,0x33,0x36,0x00,0x00,0x33,0xa4,0x00,0x00,0x35,0x02,0x00,0x00,0x35,0x7c,
-0x00,0x00,0x35,0xf4,0x00,0x00,0x37,0x16,0x00,0x00,0x39,0x3a,0x00,0x00,0x3a,0xbe,
-0x00,0x00,0x3c,0x88,0x00,0x00,0x3d,0x54,0x00,0x00,0x3e,0x30,0x00,0x00,0x3e,0x5e,
-0x00,0x00,0x3f,0x4a,0x00,0x00,0x3f,0xce,0x00,0x00,0x3f,0xce,0x00,0x00,0x40,0x5e,
-0x00,0x00,0x41,0x28,0x00,0x00,0x41,0xde,0x00,0x00,0x42,0xf6,0x00,0x00,0x44,0x18,
-0x00,0x00,0x44,0x5e,0x00,0x00,0x45,0xa6,0x00,0x00,0x46,0x5e,0x00,0x00,0x47,0x80,
-0x00,0x00,0x48,0x5c,0x00,0x00,0x49,0x26,0x00,0x00,0x49,0x5e,0x00,0x00,0x49,0x8a,
-0x00,0x00,0x4a,0xd6,0x00,0x00,0x4b,0x20,0x00,0x00,0x4b,0x96,0x00,0x00,0x4c,0x04,
-0x00,0x00,0x4c,0xa2,0x00,0x00,0x4d,0x5e,0x00,0x00,0x4d,0xac,0x00,0x00,0x4e,0x5e,
-0x00,0x00,0x4e,0xba,0x00,0x00,0x4e,0xe4,0x00,0x00,0x4f,0x44,0x00,0x00,0x4f,0x9c,
-0x00,0x00,0x50,0x24,0x00,0x00,0x50,0xf2,0x00,0x00,0x51,0x12,0x00,0x00,0x51,0x32,
-0x00,0x00,0x51,0x52,0x00,0x00,0x52,0x4a,0x00,0x00,0x52,0x62,0x00,0x00,0x52,0x7a,
-0x00,0x00,0x52,0xa4,0x00,0x00,0x52,0xd2,0x00,0x00,0x53,0x00,0x00,0x00,0x54,0x40,
-0x00,0x00,0x55,0x16,0x00,0x00,0x55,0x2e,0x00,0x00,0x55,0x46,0x00,0x00,0x55,0x5e,
-0x00,0x00,0x55,0x80,0x00,0x00,0x55,0xa4,0x00,0x00,0x55,0xbc,0x00,0x00,0x55,0xd4,
-0x00,0x00,0x55,0xf6,0x00,0x00,0x56,0x18,0x00,0x00,0x56,0xe2,0x00,0x00,0x57,0x10,
-0x00,0x00,0x57,0x28,0x00,0x00,0x57,0x40,0x00,0x00,0x57,0x6a,0x00,0x00,0x57,0x9c,
-0x00,0x00,0x57,0xca,0x00,0x00,0x58,0x92,0x00,0x00,0x59,0xca,0x00,0x00,0x59,0xe2,
-0x00,0x00,0x59,0xfa,0x00,0x00,0x5a,0x28,0x00,0x00,0x5a,0x5e,0x00,0x00,0x5a,0x76,
-0x00,0x00,0x5a,0xfc,0x00,0x00,0x5c,0x22,0x00,0x00,0x5c,0x46,0x00,0x00,0x5c,0x6a,
-0x00,0x00,0x5c,0x8a,0x00,0x00,0x5c,0xb6,0x00,0x00,0x5c,0xee,0x00,0x00,0x5d,0x2c,
-0x00,0x00,0x5e,0xe6,0x00,0x00,0x5e,0xfe,0x00,0x00,0x5f,0x16,0x00,0x00,0x5f,0x2e,
-0x00,0x00,0x5f,0x50,0x00,0x00,0x5f,0x72,0x00,0x00,0x5f,0x8a,0x00,0x00,0x5f,0xa2,
-0x00,0x00,0x5f,0xc4,0x00,0x00,0x5f,0xe6,0x00,0x00,0x61,0x96,0x00,0x00,0x61,0xae,
-0x00,0x00,0x61,0xc4,0x00,0x00,0x61,0xda,0x00,0x00,0x61,0xfa,0x00,0x00,0x62,0x26,
-0x00,0x00,0x62,0x52,0x00,0x00,0x62,0xae,0x00,0x00,0x64,0x22,0x00,0x00,0x64,0x38,
-0x00,0x00,0x64,0x4e,0x00,0x00,0x64,0x6e,0x00,0x00,0x64,0x9e,0x00,0x00,0x64,0xb4,
-0x00,0x00,0x65,0x52,0x00,0x00,0x65,0x80,0x00,0x00,0x65,0xaa,0x00,0x00,0x65,0xd2,
-0x00,0x00,0x65,0xfe,0x00,0x00,0x66,0x1e,0x00,0x00,0x66,0x36,0x00,0x00,0x66,0x4e,
-0x00,0x00,0x66,0x66,0x00,0x00,0x66,0x7e,0x00,0x00,0x66,0xa2,0x00,0x00,0x66,0xba,
-0x00,0x00,0x66,0xd2,0x00,0x00,0x66,0xea,0x00,0x00,0x67,0x0c,0x00,0x00,0x67,0x24,
-0x00,0x00,0x67,0x3c,0x00,0x00,0x67,0x62,0x00,0x00,0x68,0x2c,0x00,0x00,0x68,0xe8,
-0x00,0x00,0x69,0x00,0x00,0x00,0x69,0x22,0x00,0x00,0x69,0x44,0x00,0x00,0x69,0x66,
-0x00,0x00,0x69,0x7e,0x00,0x00,0x69,0x96,0x00,0x00,0x69,0xae,0x00,0x00,0x69,0xc6,
-0x00,0x00,0x69,0xe8,0x00,0x00,0x6a,0x00,0x00,0x00,0x6a,0x24,0x00,0x00,0x6a,0x46,
-0x00,0x00,0x6a,0x5e,0x00,0x00,0x6a,0x76,0x00,0x00,0x6a,0x98,0x00,0x00,0x6a,0xae,
-0x00,0x00,0x6a,0xc6,0x00,0x00,0x6a,0xde,0x00,0x00,0x6b,0x0c,0x00,0x00,0x6b,0x50,
-0x00,0x00,0x6b,0xd6,0x00,0x00,0x6c,0x6a,0x00,0x00,0x6c,0x8c,0x00,0x00,0x6c,0xae,
-0x00,0x00,0x6c,0xd0,0x00,0x00,0x6c,0xf2,0x00,0x00,0x6d,0x14,0x00,0x00,0x6d,0x36,
-0x00,0x00,0x6d,0x4e,0x00,0x00,0x6d,0x66,0x00,0x00,0x6d,0x94,0x00,0x00,0x6d,0xce,
-0x00,0x00,0x6d,0xf0,0x00,0x00,0x6e,0x12,0x00,0x00,0x6e,0x34,0x00,0x00,0x6e,0x56,
-0x00,0x00,0x6e,0x6e,0x00,0x00,0x6e,0x86,0x00,0x00,0x6f,0x76,0x00,0x00,0x6f,0x8e,
-0x00,0x00,0x6f,0xc6,0x00,0x00,0x6f,0xde,0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x18,
-0x00,0x00,0x70,0x3c,0x00,0x00,0x70,0x54,0x00,0x00,0x70,0x86,0x00,0x00,0x71,0x00,
-0x00,0x00,0x71,0x90,0x00,0x00,0x71,0xb2,0x00,0x00,0x71,0xd4,0x00,0x00,0x71,0xec,
-0x00,0x00,0x72,0x04,0x00,0x00,0x72,0x32,0x00,0x00,0x72,0x5c,0x00,0x00,0x72,0x74,
-0x00,0x00,0x73,0x04,0x00,0x00,0x73,0xa0,0x00,0x00,0x73,0xca,0x00,0x00,0x73,0xea,
-0x00,0x00,0x74,0x14,0x00,0x00,0x74,0x34,0x00,0x00,0x74,0x4c,0x00,0x00,0x74,0x64,
-0x00,0x00,0x75,0x02,0x00,0x00,0x76,0x2a,0x00,0x00,0x76,0x42,0x00,0x00,0x76,0x58,
-0x00,0x00,0x76,0x70,0x00,0x00,0x76,0x88,0x00,0x00,0x76,0xaa,0x00,0x00,0x76,0xc0,
-0x00,0x00,0x76,0xd8,0x00,0x00,0x76,0xee,0x00,0x00,0x77,0x14,0x00,0x00,0x77,0x38,
-0x00,0x00,0x77,0x50,0x00,0x00,0x77,0x66,0x00,0x00,0x77,0x8c,0x00,0x00,0x77,0xb0,
-0x00,0x00,0x77,0xc6,0x00,0x00,0x77,0xdc,0x00,0x00,0x78,0x06,0x00,0x00,0x78,0x28,
-0x00,0x00,0x78,0xaa,0x00,0x00,0x79,0x42,0x00,0x00,0x79,0x6c,0x00,0x00,0x79,0x8e,
-0x00,0x00,0x79,0xbc,0x00,0x00,0x79,0xde,0x00,0x00,0x7a,0x08,0x00,0x00,0x7a,0x2a,
-0x00,0x00,0x7a,0x4e,0x00,0x00,0x7a,0x70,0x00,0x00,0x7a,0x88,0x00,0x00,0x7a,0xa0,
-0x00,0x00,0x7a,0xb8,0x00,0x00,0x7a,0xd0,0x00,0x00,0x7a,0xf2,0x00,0x00,0x7b,0x14,
-0x00,0x00,0x7b,0x36,0x00,0x00,0x7b,0x56,0x00,0x00,0x7b,0x78,0x00,0x00,0x7b,0x90,
-0x00,0x00,0x7b,0xa6,0x00,0x00,0x7b,0xbe,0x00,0x00,0x7b,0xd4,0x00,0x00,0x7b,0xec,
-0x00,0x00,0x7c,0x02,0x00,0x00,0x7c,0x5a,0x00,0x00,0x7d,0x26,0x00,0x00,0x7d,0xa8,
-0x00,0x00,0x7d,0xb8,0x00,0x00,0x7e,0x6c,0x00,0x00,0x7e,0xc0,0x00,0x00,0x7f,0x1e,
-0x00,0x00,0x7f,0xae,0x00,0x00,0x80,0x2a,0x00,0x00,0x80,0x96,0x00,0x00,0x80,0xa6,
-0x00,0x00,0x81,0x0c,0x00,0x00,0x81,0x62,0x00,0x00,0x81,0xc2,0x00,0x00,0x82,0x50,
-0x00,0x00,0x82,0x82,0x00,0x00,0x82,0xf2,0x00,0x00,0x83,0xaa,0x00,0x00,0x83,0xe8,
-0x00,0x00,0x84,0x3a,0x00,0x00,0x84,0xc2,0x00,0x00,0x85,0x24,0x00,0x00,0x85,0xe2,
-0x00,0x00,0x86,0x0e,0x00,0x00,0x86,0x3a,0x00,0x00,0x86,0x88,0x00,0x00,0x86,0xd4,
-0x00,0x00,0x87,0x00,0x00,0x00,0x87,0x48,0x00,0x00,0x87,0xb2,0x00,0x00,0x87,0xf8,
-0x00,0x00,0x88,0x08,0x00,0x00,0x88,0x7a,0x00,0x00,0x88,0x92,0x00,0x00,0x88,0xaa,
-0x00,0x00,0x89,0x1c,0x00,0x00,0x89,0x88,0x00,0x00,0x89,0xe4,0x00,0x00,0x8a,0x54,
-0x00,0x00,0x8a,0xd0,0x00,0x00,0x8b,0x4a,0x00,0x00,0x8b,0xc0,0x00,0x00,0x8b,0xd0,
-0x00,0x00,0x8c,0x3a,0x00,0x00,0x8c,0x92,0x00,0x00,0x8c,0xcc,0x00,0x00,0x8d,0x20,
-0x00,0x00,0x8d,0x5c,0x00,0x00,0x8d,0x74,0x00,0x00,0x8d,0x8c,0x00,0x00,0x8d,0xfc,
-0x00,0x00,0x8e,0x5a,0x00,0x00,0x8e,0xa2,0x00,0x00,0x8e,0xfa,0x00,0x00,0x8f,0x42,
-0x00,0x00,0x8f,0x88,0x00,0x00,0x90,0x00,0x00,0x00,0x90,0x78,0x00,0x00,0x90,0xec,
-0x00,0x00,0x91,0x58,0x00,0x00,0x91,0xc4,0x00,0x00,0x92,0x44,0x00,0x00,0x92,0xbc,
-0x00,0x00,0x93,0x2e,0x00,0x00,0x93,0x82,0x00,0x00,0x93,0x9c,0x00,0x00,0x93,0xb4,
-0x00,0x00,0x93,0xf8,0x00,0x00,0x94,0x08,0x00,0x00,0x94,0x20,0x00,0x00,0x94,0x38,
-0x00,0x00,0x94,0x50,0x00,0x00,0x94,0x68,0x00,0x00,0x94,0x80,0x00,0x00,0x94,0x98,
-0x00,0x00,0x94,0xb0,0x00,0x00,0x94,0xc8,0x00,0x00,0x94,0xe0,0x00,0x00,0x95,0x00,
-0x00,0x00,0x95,0x16,0x00,0x00,0x95,0x3c,0x00,0x00,0x95,0x62,0x00,0x00,0x95,0x7a,
-0x00,0x00,0x95,0x98,0x00,0x00,0x95,0xb8,0x00,0x00,0x95,0xdc,0x00,0x00,0x95,0xf2,
-0x00,0x00,0x96,0x0a,0x00,0x00,0x96,0x22,0x00,0x00,0x96,0x3a,0x00,0x00,0x96,0x52,
-0x00,0x00,0x96,0x6a,0x00,0x00,0x96,0x82,0x00,0x00,0x96,0x9a,0x00,0x00,0x96,0xaa,
-0x00,0x00,0x96,0xc0,0x00,0x00,0x96,0xd8,0x00,0x00,0x96,0xee,0x00,0x00,0x97,0x06,
-0x00,0x00,0x97,0x1e,0x00,0x00,0x97,0x36,0x00,0x00,0x97,0xb4,0x00,0x00,0x98,0x52,
-0x00,0x00,0x98,0x6a,0x00,0x00,0x98,0x80,0x00,0x00,0x98,0x98,0x00,0x00,0x98,0xb0,
-0x00,0x00,0x98,0xc8,0x00,0x00,0x98,0xe0,0x00,0x00,0x98,0xf8,0x00,0x00,0x99,0x0e,
-0x00,0x00,0x99,0x26,0x00,0x00,0x99,0x3c,0x00,0x00,0x99,0x80,0x00,0x00,0x99,0x98,
-0x00,0x00,0x99,0xb0,0x00,0x00,0x99,0xc8,0x00,0x00,0x99,0xe4,0x00,0x00,0x99,0xfa,
-0x00,0x00,0x9a,0x5c,0x00,0x00,0x9a,0xb2,0x00,0x00,0x9a,0xce,0x00,0x00,0x9a,0xe6,
-0x00,0x00,0x9a,0xfe,0x00,0x00,0x9b,0x16,0x00,0x00,0x9b,0x2e,0x00,0x00,0x9b,0x46,
-0x00,0x00,0x9b,0x5e,0x00,0x00,0x9b,0x74,0x00,0x00,0x9b,0x8c,0x00,0x00,0x9b,0xa4,
-0x00,0x00,0x9b,0xbc,0x00,0x00,0x9b,0xd4,0x00,0x00,0x9b,0xec,0x00,0x00,0x9c,0x04,
-0x00,0x00,0x9c,0x1c,0x00,0x00,0x9c,0x34,0x00,0x00,0x9c,0x4c,0x00,0x00,0x9c,0x64,
-0x00,0x00,0x9c,0x7c,0x00,0x00,0x9c,0x94,0x00,0x00,0x9c,0xac,0x00,0x00,0x9c,0xc4,
-0x00,0x00,0x9c,0xdc,0x00,0x00,0x9c,0xf4,0x00,0x00,0x9d,0x0c,0x00,0x00,0x9d,0x24,
-0x00,0x00,0x9d,0x3c,0x00,0x00,0x9d,0x54,0x00,0x00,0x9d,0x6c,0x00,0x00,0x9d,0x84,
-0x00,0x00,0x9d,0x9c,0x00,0x00,0x9d,0xb4,0x00,0x00,0x9d,0xcc,0x00,0x00,0x9d,0xe4,
-0x00,0x00,0x9d,0xfc,0x00,0x00,0x9e,0x14,0x00,0x00,0x9e,0xac,0x00,0x00,0x9f,0x46,
-0x00,0x00,0x9f,0x5e,0x00,0x00,0x9f,0x76,0x00,0x00,0x9f,0xc4,0x00,0x00,0xa0,0x68,
-0x00,0x00,0xa1,0x1c,0x00,0x00,0xa1,0xbe,0x00,0x00,0xa2,0x0a,0x00,0x00,0xa2,0x56,
-0x00,0x00,0xa2,0x6e,0x00,0x00,0xa2,0x84,0x00,0x00,0xa2,0x9c,0x00,0x00,0xa2,0xb2,
-0x00,0x00,0xa2,0xc8,0x00,0x00,0xa2,0xe0,0x00,0x00,0xa2,0xf6,0x00,0x00,0xa3,0x0e,
-0x00,0x00,0xa3,0x26,0x00,0x00,0xa3,0x3c,0x00,0x00,0xa3,0x52,0x00,0x00,0xa3,0x6a,
-0x00,0x00,0xa3,0x82,0x00,0x00,0xa3,0x98,0x00,0x00,0xa3,0xec,0x00,0x00,0xa4,0x6e,
-0x00,0x00,0xa4,0xd6,0x00,0x00,0xa5,0x3a,0x00,0x00,0xa5,0xd4,0x00,0x00,0xa6,0x6e,
-0x00,0x00,0xa6,0xdc,0x00,0x00,0xa7,0x6a,0x00,0x00,0xa7,0xee,0x00,0x00,0xa8,0x20,
-0x00,0x00,0xa8,0x70,0x00,0x00,0xa9,0x1e,0x00,0x00,0xa9,0x74,0x00,0x00,0xa9,0xc8,
-0x00,0x00,0xaa,0x4c,0x00,0x00,0xaa,0xb8,0x00,0x00,0xab,0x24,0x00,0x00,0xab,0xae,
-0x00,0x00,0xac,0x48,0x00,0x00,0xac,0xd4,0x00,0x00,0xad,0x5a,0x00,0x00,0xad,0xe4,
-0x00,0x00,0xae,0x56,0x00,0x00,0xae,0xc8,0x00,0x00,0xaf,0x6e,0x00,0x00,0xaf,0x7e,
-0x00,0x00,0xaf,0x8e,0x00,0x00,0xb0,0x4a,0x00,0x00,0xb0,0xd6,0x00,0x00,0xb1,0x14,
-0x00,0x00,0xb1,0xb6,0x00,0x00,0xb2,0x3a,0x00,0x00,0xb2,0xa8,0x00,0x00,0xb3,0x08,
-0x00,0x00,0xb3,0x5a,0x00,0x00,0xb3,0xa6,0x00,0x00,0xb4,0x0a,0x00,0x00,0xb4,0x86,
-0x00,0x00,0xb4,0xbe,0x00,0x00,0xb4,0xf2,0x00,0x00,0xb5,0x1e,0x00,0x00,0xb5,0x8e,
-0x00,0x00,0xb5,0xde,0x00,0x00,0xb6,0x14,0x00,0x00,0xb6,0x88,0x00,0x00,0xb6,0xfa,
-0x00,0x00,0xb7,0x6e,0x00,0x00,0xb8,0x02,0x00,0x00,0xb8,0x60,0x00,0x00,0xb8,0xc0,
-0x00,0x00,0xb8,0xf0,0x00,0x00,0xb9,0x64,0x00,0x00,0xb9,0xc8,0x00,0x00,0xba,0x78,
-0x00,0x00,0xbb,0x0e,0x00,0x00,0xbb,0x56,0x00,0x00,0xbb,0x9e,0x00,0x00,0xbc,0x00,
-0x00,0x00,0xbc,0x4a,0x00,0x00,0xbc,0xb0,0x00,0x00,0xbc,0xf0,0x00,0x00,0xbd,0x30,
-0x00,0x00,0xbd,0xa0,0x00,0x00,0xbe,0x10,0x00,0x00,0xbe,0xbc,0x00,0x00,0xbf,0x0c,
-0x00,0x00,0xbf,0x70,0x00,0x00,0xbf,0xc0,0x00,0x00,0xc0,0x24,0x00,0x00,0xc0,0x6c,
-0x00,0x00,0xc0,0xb0,0x00,0x00,0xc1,0x16,0x00,0x00,0xc1,0x86,0x00,0x00,0xc1,0xec,
-0x00,0x00,0xc2,0x12,0x00,0x00,0xc2,0x4a,0x00,0x00,0xc2,0x8a,0x00,0x00,0xc2,0xb8,
-0x00,0x00,0xc3,0x06,0x00,0x00,0xc3,0x62,0x00,0x00,0xc3,0xca,0x00,0x00,0xc4,0x56,
-0x00,0x00,0xc4,0xb4,0x00,0x00,0xc5,0x12,0x00,0x00,0xc5,0x72,0x00,0x00,0xc5,0xe4,
-0x00,0x00,0xc6,0x6a,0x00,0x00,0xc6,0x7a,0x00,0x00,0xc7,0x04,0x00,0x00,0xc7,0x92,
-0x00,0x00,0xc7,0xa2,0x00,0x00,0xc7,0xfe,0x00,0x00,0xc8,0x34,0x00,0x00,0xc8,0x54,
-0x00,0x00,0xc8,0xde,0x00,0x00,0xc9,0x4c,0x00,0x00,0xc9,0xbc,0x00,0x00,0xca,0x4a,
-0x00,0x00,0xca,0xfc,0x00,0x00,0xcb,0xa4,0x00,0x00,0xcc,0x56,0x00,0x00,0xcc,0xde,
-0x00,0x00,0xcd,0xa8,0x00,0x00,0xce,0x36,0x00,0x00,0xce,0xce,0x00,0x00,0xcf,0x0a,
-0x00,0x00,0xcf,0x6e,0x00,0x00,0xcf,0xac,0x00,0x00,0xd0,0x10,0x00,0x00,0xd0,0x8e,
-0x00,0x00,0xd0,0xde,0x00,0x00,0xd1,0x42,0x00,0x00,0xd1,0xa2,0x00,0x00,0xd1,0xec,
-0x00,0x00,0xd2,0x36,0x00,0x00,0xd2,0x98,0x00,0x00,0xd3,0x04,0x00,0x00,0xd3,0x3c,
-0x00,0x00,0xd3,0x80,0x00,0x00,0xd3,0x90,0x00,0x00,0xd3,0xa0,0x00,0x00,0xd3,0xb0,
-0x00,0x00,0xd3,0xc0,0x00,0x00,0xd3,0xe2,0x00,0x00,0xd4,0x1a,0x00,0x00,0xd4,0x54,
-0x00,0x00,0xd4,0xb0,0x00,0x00,0xd5,0x0e,0x00,0x00,0xd5,0x36,0x00,0x00,0xd5,0x5e,
-0x00,0x00,0xd5,0x86,0x00,0x00,0xd5,0xac,0x00,0x00,0xd6,0x06,0x00,0x00,0xd6,0x62,
-0x00,0x00,0xd6,0x90,0x00,0x00,0xd6,0xa0,0x00,0x00,0xd6,0xbc,0x00,0x00,0xd6,0xdc,
-0x00,0x00,0xd7,0x0a,0x00,0x00,0xd7,0x1c,0x00,0x00,0xd7,0x3a,0x00,0x00,0xd7,0x56,
-0x00,0x00,0xd7,0x7e,0x00,0x00,0xd7,0x98,0x00,0x00,0xd7,0xaa,0x00,0x00,0xd7,0xbc,
-0x00,0x00,0xd7,0xe0,0x00,0x00,0xd8,0x04,0x00,0x00,0xd8,0x2e,0x00,0x00,0xd8,0x4a,
-0x00,0x00,0xd8,0xd4,0x00,0x00,0xd9,0x1a,0x00,0x00,0xd9,0x86,0x00,0x00,0xd9,0xe6,
-0x00,0x00,0xda,0xa4,0x00,0x00,0xdb,0x10,0x00,0x00,0xdb,0x48,0x00,0x00,0xdb,0x7a,
-0x00,0x00,0xdb,0xcc,0x00,0x00,0xdb,0xe6,0x00,0x00,0xdc,0x7e,0x00,0x00,0xdc,0xb6,
-0x00,0x00,0xdd,0x14,0x00,0x00,0xdd,0x34,0x00,0x00,0xdd,0x58,0x00,0x00,0xdd,0x7e,
-0x00,0x00,0xdd,0xa4,0x00,0x00,0xdd,0xc4,0x00,0x00,0xdd,0xd6,0x00,0x00,0xdd,0xee,
-0x00,0x00,0xde,0x16,0x00,0x00,0xde,0x28,0x00,0x00,0xde,0x82,0x00,0x00,0xde,0x94,
-0x00,0x00,0xde,0xa6,0x00,0x00,0xde,0xb8,0x00,0x00,0xde,0xca,0x00,0x00,0xde,0xdc,
-0x00,0x00,0xde,0xee,0x00,0x00,0xdf,0x00,0x00,0x00,0xdf,0x12,0x00,0x00,0xdf,0x24,
-0x00,0x00,0xdf,0x74,0x00,0x00,0xdf,0x86,0x00,0x00,0xdf,0x98,0x00,0x00,0xdf,0xaa,
-0x00,0x00,0xdf,0xc6,0x00,0x00,0xdf,0xe0,0x00,0x00,0xe0,0x0c,0x00,0x00,0xe0,0x26,
-0x00,0x00,0xe0,0x3a,0x00,0x00,0xe0,0x60,0x00,0x00,0xe0,0x86,0x00,0x00,0xe0,0xaa,
-0x00,0x00,0xe0,0xc4,0x00,0x00,0xe0,0xd6,0x00,0x00,0xe0,0xe8,0x00,0x00,0xe1,0x0a,
-0x00,0x00,0xe1,0x2c,0x00,0x00,0xe1,0x4c,0x00,0x00,0xe1,0x8e,0x00,0x00,0xe1,0xc6,
-0x00,0x00,0xe1,0xe8,0x00,0x00,0xe2,0x0a,0x00,0x00,0xe2,0x34,0x00,0x00,0xe2,0x4e,
-0x00,0x00,0xe2,0x7e,0x00,0x00,0xe2,0xae,0x00,0x00,0xe2,0xc0,0x00,0x00,0xe2,0xd2,
-0x00,0x00,0xe2,0xe4,0x00,0x00,0xe3,0x08,0x00,0x00,0xe3,0x1a,0x00,0x00,0xe3,0x2c,
-0x00,0x00,0xe3,0x46,0x00,0x00,0xe3,0x68,0x00,0x00,0xe3,0xae,0x00,0x00,0xe3,0xc0,
-0x00,0x00,0xe3,0xd2,0x00,0x00,0xe3,0xe4,0x00,0x00,0xe3,0xf8,0x00,0x00,0xe4,0x0a,
-0x00,0x00,0xe4,0x1c,0x00,0x00,0xe4,0x2e,0x00,0x00,0xe4,0x40,0x00,0x00,0xe4,0x9a,
-0x00,0x00,0xe4,0xb4,0x00,0x00,0xe4,0xce,0x00,0x00,0xe4,0xec,0x00,0x00,0xe5,0x0a,
-0x00,0x00,0xe5,0x1e,0x00,0x00,0xe5,0x32,0x00,0x00,0xe5,0x5c,0x00,0x00,0xe5,0xa2,
-0x00,0x00,0xe5,0xd6,0x00,0x00,0xe6,0x36,0x00,0x00,0xe6,0x50,0x00,0x00,0xe6,0x62,
-0x00,0x00,0xe6,0x74,0x00,0x00,0xe6,0x86,0x00,0x00,0xe6,0x98,0x00,0x00,0xe6,0xaa,
-0x00,0x00,0xe6,0xbc,0x00,0x00,0xe6,0xe0,0x00,0x00,0xe7,0x08,0x00,0x00,0xe7,0x30,
-0x00,0x00,0xe7,0x50,0x00,0x00,0xe7,0xcc,0x00,0x00,0xe8,0x3e,0x00,0x00,0xe8,0x56,
-0x00,0x00,0xe8,0x8e,0x00,0x00,0xe8,0xb6,0x00,0x00,0xe8,0xf6,0x00,0x00,0xe9,0x0e,
-0x00,0x00,0xe9,0x20,0x00,0x00,0xe9,0x5e,0x00,0x00,0xe9,0x70,0x00,0x00,0xe9,0x82,
-0x00,0x00,0xe9,0x94,0x00,0x00,0xea,0x06,0x00,0x00,0xea,0x18,0x00,0x00,0xea,0x40,
-0x00,0x00,0xea,0x6e,0x00,0x00,0xea,0x9c,0x00,0x00,0xea,0xc2,0x00,0x00,0xea,0xd2,
-0x00,0x00,0xeb,0x20,0x00,0x00,0xeb,0x4e,0x00,0x00,0xeb,0x66,0x00,0x00,0xeb,0x76,
-0x00,0x00,0xeb,0x90,0x00,0x00,0xeb,0xaa,0x00,0x00,0xeb,0xc4,0x00,0x00,0xeb,0xdc,
-0x00,0x00,0xeb,0xf6,0x00,0x00,0xec,0x0e,0x00,0x00,0xec,0x26,0x00,0x00,0xec,0x36,
-0x00,0x00,0xec,0x46,0x00,0x00,0xec,0x7e,0x00,0x00,0xec,0xe8,0x00,0x00,0xec,0xf8,
-0x00,0x00,0xed,0x08,0x00,0x00,0xed,0x18,0x00,0x00,0xed,0xc6,0x00,0x00,0xed,0xd6,
-0x00,0x00,0xed,0xe6,0x00,0x00,0xee,0x48,0x00,0x00,0xee,0x58,0x00,0x00,0xee,0x68,
-0x00,0x00,0xee,0xc8,0x00,0x00,0xee,0xd8,0x00,0x00,0xee,0xe8,0x00,0x00,0xee,0xf8,
-0x00,0x00,0xef,0x74,0x00,0x00,0xef,0x84,0x00,0x00,0xef,0x94,0x00,0x00,0xef,0xa4,
-0x00,0x00,0xef,0xb4,0x00,0x00,0xf0,0x48,0x00,0x00,0xf0,0xf6,0x00,0x00,0xf1,0x18,
-0x00,0x00,0xf1,0x3a,0x00,0x00,0xf1,0x50,0x00,0x00,0xf1,0x66,0x00,0x00,0xf1,0x7e,
-0x00,0x00,0xf1,0x96,0x00,0x00,0xf1,0xac,0x00,0x00,0xf2,0xa2,0x00,0x00,0xf3,0x4a,
-0x00,0x00,0xf3,0xc8,0x00,0x00,0xf4,0xac,0x00,0x00,0xf5,0x7c,0x00,0x00,0xf6,0x22,
-0x00,0x00,0xf6,0x9c,0x00,0x00,0xf7,0x52,0x00,0x00,0xf7,0xa2,0x00,0x00,0xf8,0x22,
-0x00,0x00,0xf8,0xa8,0x00,0x00,0xf8,0xb8,0x00,0x00,0xf9,0x48,0x00,0x00,0xfa,0x04,
-0x00,0x00,0xfa,0x14,0x00,0x00,0xfa,0x90,0x00,0x00,0xfb,0x24,0x00,0x00,0xfb,0xce,
-0x00,0x00,0xfc,0x64,0x00,0x00,0xfc,0xc4,0x00,0x00,0xfd,0x44,0x00,0x00,0xfe,0x0c,
-0x00,0x00,0xfe,0xe0,0x00,0x00,0xff,0x72,0x00,0x01,0x00,0x0e,0x00,0x01,0x00,0x26,
-0x00,0x01,0x00,0x3c,0x00,0x01,0x00,0x52,0x00,0x01,0x00,0x68,0x00,0x01,0x00,0x80,
-0x00,0x01,0x01,0x0a,0x00,0x01,0x01,0x8e,0x00,0x01,0x01,0xf4,0x00,0x01,0x02,0x0e,
-0x00,0x01,0x02,0x26,0x00,0x01,0x02,0xa6,0x00,0x01,0x03,0x1a,0x00,0x01,0x03,0xb8,
-0x00,0x01,0x04,0x22,0x00,0x01,0x04,0x86,0x00,0x01,0x04,0xfa,0x00,0x01,0x05,0x66,
-0x00,0x01,0x05,0x76,0x00,0x01,0x05,0xe2,0x00,0x01,0x06,0x3e,0x00,0x01,0x06,0x6a,
-0x00,0x01,0x06,0xe4,0x00,0x01,0x07,0x3e,0x00,0x01,0x07,0xfc,0x00,0x01,0x08,0x80,
-0x00,0x01,0x08,0xe6,0x00,0x01,0x09,0x3e,0x00,0x01,0x09,0xb8,0x00,0x01,0x0a,0xa0,
-0x00,0x01,0x0b,0x16,0x00,0x01,0x0b,0x84,0x00,0x01,0x0c,0x36,0x00,0x01,0x0c,0xea,
-0x00,0x01,0x0d,0x7c,0x00,0x01,0x0e,0x12,0x00,0x01,0x0e,0x4c,0x00,0x01,0x0e,0x84,
-0x00,0x01,0x0f,0x14,0x00,0x01,0x0f,0x80,0x00,0x01,0x0f,0x90,0x00,0x01,0x0f,0xa0,
-0x00,0x01,0x10,0x12,0x00,0x01,0x10,0x80,0x00,0x01,0x10,0xec,0x00,0x01,0x10,0xfc,
-0x00,0x01,0x11,0x0c,0x00,0x01,0x11,0x1c,0x00,0x01,0x11,0x58,0x00,0x01,0x11,0x92,
-0x00,0x01,0x12,0x00,0x00,0x01,0x12,0x60,0x00,0x01,0x12,0x78,0x00,0x01,0x12,0x90,
-0x00,0x01,0x12,0xa8,0x00,0x01,0x12,0xc0,0x00,0x01,0x13,0x1c,0x00,0x01,0x13,0x34,
-0x00,0x01,0x13,0xe8,0x00,0x01,0x13,0xf8,0x00,0x01,0x14,0x08,0x00,0x01,0x14,0x2a,
-0x00,0x01,0x14,0x3a,0x00,0x01,0x14,0xae,0x00,0x01,0x15,0x10,0x00,0x01,0x15,0x58,
-0x00,0x01,0x15,0x70,0x00,0x01,0x15,0x88,0x00,0x01,0x15,0xa0,0x00,0x01,0x15,0xd0,
-0x00,0x01,0x15,0xe0,0x00,0x01,0x16,0x60,0x00,0x01,0x16,0x70,0x00,0x01,0x16,0xa8,
-0x00,0x01,0x17,0x36,0x00,0x01,0x17,0x46,0x00,0x01,0x18,0x0c,0x00,0x01,0x18,0x1c,
-0x00,0x01,0x18,0xc6,0x00,0x01,0x18,0xde,0x00,0x01,0x18,0xee,0x00,0x01,0x19,0x52,
-0x00,0x01,0x19,0x62,0x00,0x01,0x19,0x72,0x00,0x01,0x19,0x82,0x00,0x01,0x19,0xc8,
-0x00,0x01,0x19,0xd8,0x00,0x01,0x19,0xe8,0x00,0x01,0x19,0xf8,0x00,0x01,0x1a,0x7e,
-0x00,0x01,0x1b,0x3c,0x00,0x01,0x1b,0x4c,0x00,0x01,0x1b,0xa2,0x00,0x01,0x1c,0x00,
-0x00,0x01,0x1c,0x58,0x00,0x01,0x1c,0xc2,0x00,0x01,0x1d,0x40,0x00,0x01,0x1d,0x68,
-0x00,0x01,0x1d,0xdc,0x00,0x01,0x1e,0x8e,0x00,0x01,0x1f,0x4c,0x00,0x01,0x1f,0xf2,
-0x00,0x01,0x20,0x02,0x00,0x01,0x20,0xdc,0x00,0x01,0x21,0x86,0x00,0x01,0x21,0xbe,
-0x00,0x01,0x22,0x48,0x00,0x01,0x22,0x58,0x00,0x01,0x23,0x1e,0x00,0x01,0x23,0xea,
-0x00,0x01,0x24,0x58,0x00,0x01,0x24,0x70,0x00,0x01,0x24,0xea,0x00,0x01,0x25,0x4c,
-0x00,0x01,0x25,0xd4,0x00,0x01,0x26,0x2a,0x00,0x01,0x26,0x3a,0x00,0x01,0x26,0x88,
-0x00,0x01,0x26,0x98,0x00,0x01,0x26,0xa8,0x00,0x01,0x26,0xf2,0x00,0x01,0x27,0x02,
-0x00,0x01,0x28,0x10,0x00,0x01,0x28,0x20,0x00,0x01,0x28,0x76,0x00,0x01,0x28,0xd4,
-0x00,0x01,0x29,0x2c,0x00,0x01,0x29,0x96,0x00,0x01,0x2a,0x1a,0x00,0x01,0x2a,0x42,
-0x00,0x01,0x2a,0xba,0x00,0x01,0x2b,0x18,0x00,0x01,0x2b,0xc8,0x00,0x01,0x2c,0x7c,
-0x00,0x01,0x2c,0x92,0x00,0x01,0x2c,0xaa,0x00,0x01,0x2d,0x1e,0x00,0x01,0x2d,0x36,
-0x00,0x01,0x2d,0xce,0x00,0x01,0x2d,0xde,0x00,0x01,0x2d,0xee,0x00,0x01,0x2e,0x10,
-0x00,0x01,0x2e,0x20,0x00,0x01,0x2e,0x94,0x00,0x01,0x2e,0xfa,0x00,0x01,0x2f,0x56,
-0x00,0x01,0x2f,0x6e,0x00,0x01,0x2f,0x84,0x00,0x01,0x2f,0x9a,0x00,0x01,0x2f,0xca,
-0x00,0x01,0x30,0x6a,0x00,0x01,0x30,0x7a,0x00,0x01,0x30,0x8a,0x00,0x01,0x30,0xf0,
-0x00,0x01,0x31,0x7e,0x00,0x01,0x31,0xee,0x00,0x01,0x32,0x36,0x00,0x01,0x32,0x7e,
-0x00,0x01,0x32,0xde,0x00,0x01,0x33,0x3e,0x00,0x01,0x33,0xa4,0x00,0x01,0x34,0x0a,
-0x00,0x01,0x34,0x84,0x00,0x01,0x34,0xfc,0x00,0x01,0x35,0xe6,0x00,0x01,0x36,0xcc,
-0x00,0x01,0x36,0xdc,0x00,0x01,0x36,0xec,0x00,0x01,0x37,0x70,0x00,0x01,0x37,0xf2,
-0x00,0x01,0x38,0x40,0x00,0x01,0x38,0x92,0x00,0x01,0x39,0x02,0x00,0x01,0x39,0x1a,
-0x00,0x01,0x39,0x2a,0x00,0x01,0x39,0x3a,0x00,0x01,0x3a,0x30,0x00,0x01,0x3b,0x1c,
-0x00,0x01,0x3b,0x34,0x00,0x01,0x3b,0x4c,0x00,0x01,0x3c,0x0e,0x00,0x01,0x3c,0x96,
-0x00,0x01,0x3c,0xf0,0x00,0x01,0x3d,0x42,0x00,0x01,0x3d,0xa6,0x00,0x01,0x3e,0x3e,
-0x00,0x01,0x3e,0x7e,0x00,0x01,0x3e,0xa2,0x00,0x01,0x3e,0xc6,0x00,0x01,0x3f,0x20,
-0x00,0x01,0x3f,0xdc,0x00,0x01,0x40,0x40,0x00,0x01,0x40,0xa2,0x00,0x01,0x41,0x02,
-0x00,0x01,0x41,0x68,0x00,0x01,0x41,0xc4,0x00,0x01,0x42,0x3a,0x00,0x01,0x42,0x7a,
-0x00,0x01,0x42,0xba,0x00,0x01,0x42,0xee,0x00,0x01,0x43,0x20,0x00,0x01,0x43,0x78,
-0x00,0x01,0x43,0xd6,0x00,0x01,0x44,0x36,0x00,0x01,0x44,0x96,0x00,0x01,0x44,0xac,
-0x00,0x01,0x44,0xc2,0x00,0x01,0x45,0x00,0x00,0x01,0x45,0x3c,0x00,0x01,0x45,0x88,
-0x00,0x01,0x45,0xce,0x00,0x01,0x46,0x14,0x00,0x01,0x46,0x5c,0x00,0x01,0x46,0x9a,
-0x00,0x01,0x46,0xd6,0x00,0x01,0x47,0x10,0x00,0x01,0x47,0x4a,0x00,0x01,0x47,0x80,
-0x00,0x01,0x47,0xb6,0x00,0x01,0x48,0x14,0x00,0x01,0x48,0x78,0x00,0x01,0x49,0x3a,
-0x00,0x01,0x49,0xf4,0x00,0x01,0x4a,0x0c,0x00,0x01,0x4a,0x24,0x00,0x01,0x4a,0x52,
-0x00,0x01,0x4a,0x80,0x00,0x01,0x4a,0x90,0x00,0x01,0x4a,0xbe,0x00,0x01,0x4a,0xfe,
-0x00,0x01,0x4b,0x3e,0x00,0x01,0x4b,0x86,0x00,0x01,0x4b,0xce,0x00,0x01,0x4c,0x08,
-0x00,0x01,0x4c,0x42,0x00,0x01,0x4c,0x88,0x00,0x01,0x4c,0xce,0x00,0x01,0x4d,0x1c,
-0x00,0x01,0x4d,0x66,0x00,0x01,0x4d,0xa4,0x00,0x01,0x4d,0xb4,0x00,0x01,0x4e,0x44,
-0x00,0x01,0x4e,0xca,0x00,0x01,0x4e,0xe2,0x00,0x01,0x4e,0xfa,0x00,0x01,0x4f,0x0a,
-0x00,0x01,0x4f,0x2c,0x00,0x01,0x4f,0x4e,0x00,0x01,0x4f,0xaa,0x00,0x01,0x50,0x0c,
-0x00,0x01,0x50,0x58,0x00,0x01,0x50,0xac,0x00,0x01,0x50,0xf6,0x00,0x01,0x51,0x3e,
-0x00,0x01,0x51,0x7a,0x00,0x01,0x51,0xb6,0x00,0x01,0x51,0xfc,0x00,0x01,0x52,0x44,
-0x00,0x01,0x52,0x90,0x00,0x01,0x52,0xda,0x00,0x01,0x53,0x06,0x00,0x01,0x53,0x26,
-0x00,0x01,0x53,0x54,0x00,0x01,0x53,0x8c,0x00,0x01,0x53,0x9c,0x00,0x01,0x53,0xac,
-0x00,0x01,0x53,0xce,0x00,0x01,0x53,0xf0,0x00,0x01,0x54,0x00,0x00,0x01,0x54,0x10,
-0x00,0x01,0x54,0x28,0x00,0x01,0x54,0x3e,0x00,0x01,0x54,0x60,0x00,0x01,0x54,0x78,
-0x00,0x01,0x54,0x90,0x00,0x01,0x54,0xa6,0x00,0x01,0x54,0xb6,0x00,0x01,0x54,0xc6,
-0x00,0x01,0x54,0xde,0x00,0x01,0x54,0xf6,0x00,0x01,0x55,0x0e,0x00,0x01,0x55,0x26,
-0x00,0x01,0x55,0x54,0x00,0x01,0x55,0x80,0x00,0x01,0x55,0x90,0x00,0x01,0x55,0xa0,
-0x00,0x01,0x55,0xb8,0x00,0x01,0x55,0xce,0x00,0x01,0x55,0xe6,0x00,0x01,0x55,0xfc,
-0x00,0x01,0x56,0x14,0x00,0x01,0x56,0x2a,0x00,0x01,0x56,0x42,0x00,0x01,0x56,0x58,
-0x00,0x01,0x56,0x70,0x00,0x01,0x56,0x86,0x00,0x01,0x56,0x9e,0x00,0x01,0x56,0xb4,
-0x00,0x01,0x56,0xde,0x00,0x01,0x57,0x08,0x00,0x01,0x57,0x20,0x00,0x01,0x57,0x38,
-0x00,0x01,0x57,0x8a,0x00,0x01,0x57,0xde,0x00,0x01,0x58,0x74,0x00,0x01,0x59,0x00,
-0x00,0x01,0x59,0xa0,0x00,0x01,0x5a,0x3a,0x00,0x01,0x5a,0xb4,0x00,0x01,0x5b,0x2e,
-0x00,0x01,0x5b,0x9c,0x00,0x01,0x5c,0x06,0x00,0x01,0x5c,0x16,0x00,0x01,0x5c,0x72,
-0x00,0x01,0x5c,0x82,0x00,0x01,0x5c,0x92,0x00,0x01,0x5c,0xe6,0x00,0x01,0x5d,0x3a,
-0x00,0x01,0x5d,0xa2,0x00,0x01,0x5e,0x06,0x00,0x01,0x5e,0x84,0x00,0x01,0x5e,0xe8,
-0x00,0x01,0x5f,0x4c,0x00,0x01,0x5f,0xd8,0x00,0x01,0x60,0x32,0x00,0x01,0x60,0x94,
-0x00,0x01,0x61,0x3c,0x00,0x01,0x61,0xba,0x00,0x01,0x61,0xfe,0x00,0x01,0x62,0x38,
-0x00,0x01,0x62,0x94,0x00,0x01,0x63,0x30,0x00,0x01,0x63,0x74,0x00,0x01,0x63,0xbc,
-0x00,0x01,0x64,0x6e,0x00,0x01,0x64,0xce,0x00,0x01,0x65,0x50,0x00,0x01,0x65,0xb2,
-0x00,0x01,0x66,0x3a,0x00,0x01,0x66,0x9c,0x00,0x01,0x67,0x0c,0x00,0x01,0x67,0x4e,
-0x00,0x01,0x67,0xbe,0x00,0x01,0x68,0x12,0x00,0x01,0x68,0xa0,0x00,0x01,0x69,0x04,
-0x00,0x01,0x69,0x14,0x00,0x01,0x69,0x74,0x00,0x01,0x69,0x84,0x00,0x01,0x69,0xc6,
-0x00,0x01,0x6a,0x74,0x00,0x01,0x6a,0xbc,0x00,0x01,0x6a,0xcc,0x00,0x01,0x6b,0x7c,
-0x00,0x01,0x6b,0x8c,0x00,0x01,0x6c,0x22,0x00,0x01,0x6c,0x32,0x00,0x01,0x6c,0x42,
-0x00,0x01,0x6c,0x5e,0x00,0x01,0x6c,0x9c,0x00,0x01,0x6c,0xac,0x00,0x01,0x6c,0xf8,
-0x00,0x01,0x6d,0x1a,0x00,0x01,0x6d,0x8c,0x00,0x01,0x6d,0xd6,0x00,0x01,0x6e,0x38,
-0x00,0x01,0x6e,0x82,0x00,0x01,0x6e,0xd2,0x00,0x01,0x6f,0x30,0x00,0x01,0x6f,0x72,
-0x00,0x01,0x6f,0xb8,0x00,0x01,0x70,0x36,0x00,0x01,0x70,0x9e,0x00,0x01,0x70,0xe2,
-0x00,0x01,0x71,0x02,0x00,0x01,0x71,0x74,0x00,0x01,0x71,0xfc,0x00,0x01,0x72,0x3e,
-0x00,0x01,0x72,0x4e,0x00,0x01,0x72,0xe4,0x00,0x01,0x73,0x2c,0x00,0x01,0x73,0xb0,
-0x00,0x01,0x74,0x1c,0x00,0x01,0x74,0x2c,0x00,0x01,0x74,0x94,0x00,0x01,0x74,0xf0,
-0x00,0x01,0x75,0x00,0x00,0x01,0x75,0x6e,0x00,0x01,0x75,0xe2,0x00,0x01,0x76,0x5a,
-0x00,0x01,0x76,0xac,0x00,0x01,0x76,0xbc,0x00,0x01,0x77,0x04,0x00,0x01,0x77,0x74,
-0x00,0x01,0x77,0xb6,0x00,0x01,0x77,0xc6,0x00,0x01,0x77,0xe6,0x00,0x01,0x78,0x54,
-0x00,0x01,0x78,0xbe,0x00,0x01,0x78,0xce,0x00,0x01,0x79,0x7a,0x00,0x01,0x79,0xc0,
-0x00,0x01,0x79,0xe2,0x00,0x01,0x7a,0x1a,0x00,0x01,0x7a,0x3a,0x00,0x01,0x7a,0x96,
-0x00,0x01,0x7a,0xc4,0x00,0x01,0x7b,0x34,0x00,0x01,0x7b,0xa4,0x00,0x01,0x7b,0xbc,
-0x00,0x01,0x7b,0xd4,0x00,0x01,0x7b,0xea,0x00,0x01,0x7c,0x02,0x00,0x01,0x7c,0x1a,
-0x00,0x01,0x7c,0x34,0x00,0x01,0x7c,0x4c,0x00,0x01,0x7c,0x64,0x00,0x01,0x7c,0x7c,
-0x00,0x01,0x7c,0x94,0x00,0x01,0x7c,0xac,0x00,0x01,0x7d,0x18,0x00,0x01,0x7d,0x30,
-0x00,0x01,0x7d,0x84,0x00,0x01,0x7d,0x9c,0x00,0x01,0x7d,0xde,0x00,0x01,0x7d,0xf6,
-0x00,0x01,0x7e,0xb6,0x00,0x01,0x7e,0xce,0x00,0x01,0x7f,0x94,0x00,0x01,0x7f,0xac,
-0x00,0x01,0x80,0x16,0x00,0x01,0x80,0x2e,0x00,0x01,0x80,0xb2,0x00,0x01,0x80,0xca,
-0x00,0x01,0x80,0xe2,0x00,0x01,0x80,0xfa,0x00,0x01,0x81,0x12,0x00,0x01,0x81,0xce,
-0x00,0x01,0x82,0x2c,0x00,0x01,0x82,0xb8,0x00,0x01,0x82,0xd0,0x00,0x01,0x83,0x38,
-0x00,0x01,0x83,0xc6,0x00,0x01,0x84,0x72,0x00,0x01,0x84,0x8a,0x00,0x01,0x84,0xb4,
-0x00,0x01,0x85,0x52,0x00,0x01,0x85,0x7a,0x00,0x01,0x85,0x94,0x00,0x01,0x86,0x1e,
-0x00,0x01,0x86,0x38,0x00,0x01,0x86,0xbc,0x00,0x01,0x87,0x00,0x00,0x01,0x87,0x46,
-0x00,0x01,0x87,0x58,0x00,0x01,0x87,0x6a,0x00,0x01,0x87,0x84,0x00,0x01,0x87,0xb2,
-0x00,0x01,0x88,0x0a,0x00,0x01,0x88,0x86,0x00,0x01,0x89,0x0a,0x00,0x01,0x89,0x72,
-0x00,0x01,0x89,0xb8,0x00,0x01,0x8a,0x06,0x00,0x01,0x8a,0x56,0x00,0x01,0x8a,0xd6,
-0x00,0x01,0x8b,0x0a,0x00,0x01,0x8b,0x48,0x00,0x01,0x8b,0x6a,0x00,0x01,0x8b,0x9e,
-0x00,0x01,0x8c,0x06,0x00,0x01,0x8c,0xb6,0x00,0x01,0x8d,0x0a,0x00,0x01,0x8d,0x22,
-0x00,0x01,0x8d,0x3a,0x00,0x01,0x8d,0x52,0x00,0x01,0x8d,0x72,0x00,0x01,0x8d,0x8a,
-0x00,0x01,0x8d,0xa2,0x00,0x01,0x8d,0xba,0x00,0x01,0x8d,0xd2,0x00,0x01,0x8d,0xea,
-0x00,0x01,0x8e,0x02,0x00,0x01,0x8e,0x1a,0x00,0x01,0x8e,0x32,0x00,0x01,0x8e,0x4a,
-0x00,0x01,0x8e,0x62,0x00,0x01,0x8e,0x7a,0x00,0x01,0x8e,0x92,0x00,0x01,0x8e,0xaa,
-0x00,0x01,0x8f,0x64,0x00,0x01,0x8f,0x7c,0x00,0x01,0x8f,0x94,0x00,0x01,0x90,0x2c,
-0x00,0x01,0x90,0x44,0x00,0x01,0x90,0xa6,0x00,0x01,0x90,0xc6,0x00,0x01,0x90,0xd6,
-0x00,0x01,0x90,0xe6,0x00,0x01,0x90,0xf6,0x00,0x01,0x91,0x06,0x00,0x01,0x91,0x16,
-0x00,0x01,0x91,0x94,0x00,0x01,0x92,0x18,0x00,0x01,0x92,0x7e,0x00,0x01,0x92,0x8e,
-0x00,0x01,0x92,0x9e,0x00,0x01,0x92,0xae,0x00,0x01,0x93,0x66,0x00,0x01,0x93,0xf6,
-0x00,0x01,0x94,0x1a,0x00,0x01,0x94,0xbc,0x00,0x01,0x94,0xf4,0x00,0x01,0x95,0x2c,
-0x00,0x01,0x95,0x6e,0x00,0x01,0x95,0xc8,0x00,0x01,0x96,0x30,0x00,0x01,0x96,0x9e,
-0x00,0x01,0x97,0x22,0x00,0x01,0x97,0x8a,0x00,0x01,0x98,0x3e,0x00,0x01,0x98,0x90,
-0x00,0x01,0x98,0xe0,0x00,0x01,0x99,0x3a,0x00,0x01,0x99,0xa8,0x00,0x01,0x9a,0x36,
-0x00,0x01,0x9a,0xc6,0x00,0x01,0x9b,0x3c,0x00,0x01,0x9b,0x60,0x00,0x01,0x9b,0x94,
-0x00,0x01,0x9b,0xfc,0x00,0x01,0x9c,0x5c,0x00,0x01,0x9c,0xa6,0x00,0x01,0x9d,0x0a,
-0x00,0x01,0x9d,0x3c,0x00,0x01,0x9d,0x6c,0x00,0x01,0x9d,0xbc,0x00,0x01,0x9d,0xf8,
-0x00,0x01,0x9e,0x3a,0x00,0x01,0x9e,0x7c,0x00,0x01,0x9e,0xf0,0x00,0x01,0x9f,0x16,
-0x00,0x01,0x9f,0x94,0x00,0x01,0x9f,0xd2,0x00,0x01,0xa0,0x0c,0x00,0x01,0xa0,0x72,
-0x00,0x01,0xa0,0xc0,0x00,0x01,0xa1,0x46,0x00,0x01,0xa1,0xc2,0x00,0x01,0xa2,0x52,
-0x00,0x01,0xa2,0x90,0x00,0x01,0xa2,0xd8,0x00,0x01,0xa3,0x56,0x00,0x01,0xa3,0xa2,
-0x00,0x01,0xa3,0xd8,0x00,0x01,0xa4,0x0a,0x00,0x01,0xa4,0x36,0x00,0x01,0xa4,0x6e,
-0x00,0x01,0xa4,0xc6,0x00,0x01,0xa4,0xfc,0x00,0x01,0xa5,0x36,0x00,0x01,0xa5,0x56,
-0x00,0x01,0xa5,0xe8,0x00,0x01,0xa6,0x5c,0x00,0x01,0xa6,0xba,0x00,0x01,0xa7,0x1a,
-0x00,0x01,0xa7,0x48,0x00,0x01,0xa7,0xb6,0x00,0x01,0xa8,0x46,0x00,0x01,0xa8,0xf2,
-0x00,0x01,0xa9,0x42,0x00,0x01,0xa9,0x94,0x00,0x01,0xa9,0xfa,0x00,0x01,0xaa,0x68,
-0x00,0x01,0xaa,0xca,0x00,0x01,0xaa,0xf0,0x00,0x01,0xab,0x1e,0x00,0x01,0xab,0x6c,
-0x00,0x01,0xab,0xc6,0x00,0x01,0xac,0x2c,0x00,0x01,0xac,0x90,0x00,0x01,0xac,0xa8,
-0x00,0x01,0xac,0xbe,0x00,0x01,0xac,0xd6,0x00,0x01,0xac,0xee,0x00,0x01,0xad,0x06,
-0x00,0x01,0xad,0x1e,0x00,0x01,0xad,0x36,0x00,0x01,0xad,0x4e,0x00,0x01,0xad,0x6a,
-0x00,0x01,0xad,0x80,0x00,0x01,0xad,0x98,0x00,0x01,0xad,0xae,0x00,0x01,0xad,0xc6,
-0x00,0x01,0xad,0xde,0x00,0x01,0xad,0xf6,0x00,0x01,0xae,0x0c,0x00,0x01,0xae,0x22,
-0x00,0x01,0xae,0x38,0x00,0x01,0xae,0x50,0x00,0x01,0xae,0x68,0x00,0x01,0xae,0x7e,
-0x00,0x01,0xae,0x96,0x00,0x01,0xae,0xac,0x00,0x01,0xae,0xc4,0x00,0x01,0xae,0xdc,
-0x00,0x01,0xae,0xf4,0x00,0x01,0xaf,0x0c,0x00,0x01,0xaf,0x24,0x00,0x01,0xaf,0x48,
-0x00,0x01,0xaf,0x66,0x00,0x01,0xaf,0x7e,0x00,0x01,0xaf,0x96,0x00,0x01,0xaf,0xae,
-0x00,0x01,0xaf,0xc4,0x00,0x01,0xaf,0xdc,0x00,0x01,0xaf,0xf4,0x00,0x01,0xb0,0x0c,
-0x00,0x01,0xb0,0x24,0x00,0x01,0xb0,0x3c,0x00,0x01,0xb0,0x54,0x00,0x01,0xb0,0x6c,
-0x00,0x01,0xb0,0x84,0x00,0x01,0xb0,0x9c,0x00,0x01,0xb0,0xb4,0x00,0x01,0xb0,0xcc,
-0x00,0x01,0xb0,0xe6,0x00,0x01,0xb0,0xfe,0x00,0x01,0xb1,0x16,0x00,0x01,0xb1,0x32,
-0x00,0x01,0xb1,0x4e,0x00,0x01,0xb1,0x66,0x00,0x01,0xb1,0x7e,0x00,0x01,0xb1,0x96,
-0x00,0x01,0xb1,0xac,0x00,0x01,0xb1,0xc4,0x00,0x01,0xb1,0xdc,0x00,0x01,0xb1,0xf8,
-0x00,0x01,0xb2,0x10,0x00,0x01,0xb2,0x28,0x00,0x01,0xb2,0x44,0x00,0x01,0xb2,0x5c,
-0x00,0x01,0xb2,0x74,0x00,0x01,0xb2,0x90,0x00,0x01,0xb2,0xa8,0x00,0x01,0xb2,0xc0,
-0x00,0x01,0xb2,0xd8,0x00,0x01,0xb2,0xf0,0x00,0x01,0xb3,0x08,0x00,0x01,0xb3,0x20,
-0x00,0x01,0xb3,0x38,0x00,0x01,0xb3,0x50,0x00,0x01,0xb3,0x68,0x00,0x01,0xb3,0x80,
-0x00,0x01,0xb3,0x98,0x00,0x01,0xb3,0xb0,0x00,0x01,0xb3,0xc8,0x00,0x01,0xb3,0xde,
-0x00,0x01,0xb3,0xf6,0x00,0x01,0xb4,0x0c,0x00,0x01,0xb4,0x24,0x00,0x01,0xb4,0x3a,
-0x00,0x01,0xb4,0x52,0x00,0x01,0xb4,0x68,0x00,0x01,0xb4,0x80,0x00,0x01,0xb4,0x9c,
-0x00,0x01,0xb4,0xb2,0x00,0x01,0xb4,0xca,0x00,0x01,0xb4,0xe2,0x00,0x01,0xb4,0xfa,
-0x00,0x01,0xb5,0x10,0x00,0x01,0xb5,0x28,0x00,0x01,0xb5,0x40,0x00,0x01,0xb5,0x5c,
-0x00,0x01,0xb5,0x72,0x00,0x01,0xb5,0x8a,0x00,0x01,0xb5,0xa2,0x00,0x01,0xb5,0xba,
-0x00,0x01,0xb5,0xd0,0x00,0x01,0xb5,0xe8,0x00,0x01,0xb6,0x00,0x00,0x01,0xb6,0x24,
-0x00,0x01,0xb6,0x42,0x00,0x01,0xb6,0x58,0x00,0x01,0xb6,0x70,0x00,0x01,0xb6,0x88,
-0x00,0x01,0xb6,0x9e,0x00,0x01,0xb6,0xb6,0x00,0x01,0xb6,0xce,0x00,0x01,0xb6,0xe6,
-0x00,0x01,0xb6,0xfe,0x00,0x01,0xb7,0x14,0x00,0x01,0xb7,0x2e,0x00,0x01,0xb7,0x46,
-0x00,0x01,0xb7,0x5e,0x00,0x01,0xb7,0x76,0x00,0x01,0xb7,0x8e,0x00,0x01,0xb7,0xa6,
-0x00,0x01,0xb7,0xbe,0x00,0x01,0xb7,0xd6,0x00,0x01,0xb7,0xee,0x00,0x01,0xb8,0x04,
-0x00,0x01,0xb8,0x1c,0x00,0x01,0xb8,0x32,0x00,0x01,0xb8,0x4a,0x00,0x01,0xb8,0x62,
-0x00,0x01,0xb8,0x78,0x00,0x01,0xb8,0x90,0x00,0x01,0xb8,0xa8,0x00,0x01,0xb8,0xc0,
-0x00,0x01,0xb8,0xd8,0x00,0x01,0xb8,0xf0,0x00,0x01,0xb9,0x08,0x00,0x01,0xb9,0x20,
-0x00,0x01,0xb9,0x38,0x00,0x01,0xb9,0x50,0x00,0x01,0xb9,0x68,0x00,0x01,0xb9,0x80,
-0x00,0x01,0xb9,0x98,0x00,0x01,0xb9,0xb0,0x00,0x01,0xb9,0xc6,0x00,0x01,0xb9,0xde,
-0x00,0x01,0xb9,0xf4,0x00,0x01,0xba,0x0c,0x00,0x01,0xba,0x22,0x00,0x01,0xba,0x3e,
-0x00,0x01,0xba,0x54,0x00,0x01,0xba,0x6c,0x00,0x01,0xba,0x84,0x00,0x01,0xba,0x9c,
-0x00,0x01,0xba,0xb2,0x00,0x01,0xba,0xc8,0x00,0x01,0xba,0xe0,0x00,0x01,0xba,0xf8,
-0x00,0x01,0xbb,0x10,0x00,0x01,0xbb,0x28,0x00,0x01,0xbb,0x40,0x00,0x01,0xbb,0x58,
-0x00,0x01,0xbb,0x70,0x00,0x01,0xbb,0x88,0x00,0x01,0xbb,0xa0,0x00,0x01,0xbb,0xb6,
-0x00,0x01,0xbb,0xce,0x00,0x01,0xbb,0xe4,0x00,0x01,0xbb,0xfc,0x00,0x01,0xbc,0x12,
-0x00,0x01,0xbc,0x2a,0x00,0x01,0xbc,0x40,0x00,0x01,0xbc,0x58,0x00,0x01,0xbc,0x70,
-0x00,0x01,0xbc,0x88,0x00,0x01,0xbc,0x9e,0x00,0x01,0xbc,0xb6,0x00,0x01,0xbc,0xcc,
-0x00,0x01,0xbc,0xe4,0x00,0x01,0xbc,0xfa,0x00,0x01,0xbd,0x12,0x00,0x01,0xbd,0x28,
-0x00,0x01,0xbd,0x40,0x00,0x01,0xbd,0x58,0x00,0x01,0xbd,0x70,0x00,0x01,0xbd,0x88,
-0x00,0x01,0xbd,0xa0,0x00,0x01,0xbd,0xb8,0x00,0x01,0xbd,0xd0,0x00,0x01,0xbd,0xec,
-0x00,0x01,0xbe,0x04,0x00,0x01,0xbe,0x1a,0x00,0x01,0xbe,0x32,0x00,0x01,0xbe,0x48,
-0x00,0x01,0xbe,0x60,0x00,0x01,0xbe,0x76,0x00,0x01,0xbe,0x8e,0x00,0x01,0xbe,0xa4,
-0x00,0x01,0xbe,0xbc,0x00,0x01,0xbe,0xd4,0x00,0x01,0xbe,0xec,0x00,0x01,0xbf,0x04,
-0x00,0x01,0xbf,0x1c,0x00,0x01,0xbf,0x34,0x00,0x01,0xbf,0x4c,0x00,0x01,0xbf,0x64,
-0x00,0x01,0xbf,0x7c,0x00,0x01,0xbf,0x94,0x00,0x01,0xbf,0xac,0x00,0x01,0xbf,0xc2,
-0x00,0x01,0xbf,0xda,0x00,0x01,0xbf,0xf0,0x00,0x01,0xc0,0x08,0x00,0x01,0xc0,0x1e,
-0x00,0x01,0xc0,0x36,0x00,0x01,0xc0,0x4c,0x00,0x01,0xc0,0x64,0x00,0x01,0xc0,0x7c,
-0x00,0x01,0xc0,0x94,0x00,0x01,0xc0,0xb0,0x00,0x01,0xc0,0xc6,0x00,0x01,0xc0,0xe2,
-0x00,0x01,0xc0,0xfa,0x00,0x01,0xc1,0x12,0x00,0x01,0xc1,0x2a,0x00,0x01,0xc1,0x46,
-0x00,0x01,0xc1,0x5c,0x00,0x01,0xc1,0x74,0x00,0x01,0xc1,0x8c,0x00,0x01,0xc1,0xa4,
-0x00,0x01,0xc1,0xbc,0x00,0x01,0xc1,0xd4,0x00,0x01,0xc1,0xec,0x00,0x01,0xc2,0x08,
-0x00,0x01,0xc2,0x1e,0x00,0x01,0xc2,0x3a,0x00,0x01,0xc2,0x52,0x00,0x01,0xc2,0x6a,
-0x00,0x01,0xc2,0x82,0x00,0x01,0xc2,0x9e,0x00,0x01,0xc2,0xb6,0x00,0x01,0xc2,0xce,
-0x00,0x01,0xc2,0xe6,0x00,0x01,0xc2,0xfe,0x00,0x01,0xc3,0x14,0x00,0x01,0xc3,0x2c,
-0x00,0x01,0xc3,0x44,0x00,0x01,0xc3,0x5c,0x00,0x01,0xc3,0x74,0x00,0x01,0xc3,0x90,
-0x00,0x01,0xc3,0xa6,0x00,0x01,0xc3,0xbc,0x00,0x01,0xc3,0xd2,0x00,0x01,0xc3,0xea,
-0x00,0x01,0xc4,0x02,0x00,0x01,0xc4,0x1a,0x00,0x01,0xc4,0x32,0x00,0x01,0xc4,0x48,
-0x00,0x01,0xc4,0x5e,0x00,0x01,0xc4,0x76,0x00,0x01,0xc4,0x8e,0x00,0x01,0xc4,0xa8,
-0x00,0x01,0xc4,0xc0,0x00,0x01,0xc4,0xda,0x00,0x01,0xc4,0xf4,0x00,0x01,0xc5,0x0c,
-0x00,0x01,0xc5,0x24,0x00,0x01,0xc5,0x3a,0x00,0x01,0xc5,0x50,0x00,0x01,0xc5,0x66,
-0x00,0x01,0xc5,0x7c,0x00,0x01,0xc5,0x92,0x00,0x01,0xc5,0xa8,0x00,0x01,0xc5,0xc2,
-0x00,0x01,0xc5,0xdc,0x00,0x01,0xc5,0xf6,0x00,0x01,0xc6,0x0e,0x00,0x01,0xc6,0x28,
-0x00,0x01,0xc6,0x42,0x00,0x01,0xc6,0x5a,0x00,0x01,0xc6,0x72,0x00,0x01,0xc6,0x8a,
-0x00,0x01,0xc6,0xa0,0x00,0x01,0xc6,0xb8,0x00,0x01,0xc6,0xd0,0x00,0x01,0xc6,0xe8,
-0x00,0x01,0xc7,0x00,0x00,0x01,0xc7,0x1a,0x00,0x01,0xc7,0x34,0x00,0x01,0xc7,0x4e,
-0x00,0x01,0xc7,0x66,0x00,0x01,0xc7,0x80,0x00,0x01,0xc7,0x9a,0x00,0x01,0xc7,0xb4,
-0x00,0x01,0xc7,0xce,0x00,0x01,0xc7,0xe6,0x00,0x01,0xc7,0xfe,0x00,0x01,0xc8,0x16,
-0x00,0x01,0xc8,0x2e,0x00,0x01,0xc8,0x46,0x00,0x01,0xc8,0x5e,0x00,0x01,0xc8,0x76,
-0x00,0x01,0xc8,0x8e,0x00,0x01,0xc8,0xa8,0x00,0x01,0xc8,0xc2,0x00,0x01,0xc8,0xdc,
-0x00,0x01,0xc8,0xf4,0x00,0x01,0xc9,0x0e,0x00,0x01,0xc9,0x28,0x00,0x01,0xc9,0x42,
-0x00,0x01,0xc9,0x5c,0x00,0x01,0xc9,0x72,0x00,0x01,0xc9,0x88,0x00,0x01,0xc9,0x9e,
-0x00,0x01,0xc9,0xb4,0x00,0x01,0xc9,0xcc,0x00,0x01,0xc9,0xe4,0x00,0x01,0xc9,0xfc,
-0x00,0x01,0xca,0x14,0x00,0x01,0xca,0x2e,0x00,0x01,0xca,0x46,0x00,0x01,0xca,0x60,
-0x00,0x01,0xca,0x7a,0x00,0x01,0xca,0x90,0x00,0x01,0xca,0xa6,0x00,0x01,0xca,0xbc,
-0x00,0x01,0xca,0xd2,0x00,0x01,0xca,0xe8,0x00,0x01,0xca,0xfe,0x00,0x01,0xcb,0x14,
-0x00,0x01,0xcb,0x2a,0x00,0x01,0xcb,0x44,0x00,0x01,0xcb,0x5c,0x00,0x01,0xcb,0x76,
-0x00,0x01,0xcb,0x90,0x00,0x01,0xcb,0xa8,0x00,0x01,0xcb,0xc0,0x00,0x01,0xcb,0xd8,
-0x00,0x01,0xcb,0xf0,0x00,0x01,0xcc,0x08,0x00,0x01,0xcc,0x20,0x00,0x01,0xcc,0x38,
-0x00,0x01,0xcc,0x50,0x00,0x01,0xcc,0x68,0x00,0x01,0xcc,0x82,0x00,0x01,0xcc,0x9c,
-0x00,0x01,0xcc,0xb4,0x00,0x01,0xcc,0xce,0x00,0x01,0xcc,0xe8,0x00,0x01,0xcd,0x02,
-0x00,0x01,0xcd,0x1c,0x00,0x01,0xcd,0x32,0x00,0x01,0xcd,0x42,0x00,0x01,0xcd,0x58,
-0x00,0x01,0xcd,0x68,0x00,0x01,0xcd,0x80,0x00,0x01,0xcd,0x90,0x00,0x01,0xcd,0xa8,
-0x00,0x01,0xcd,0xb8,0x00,0x01,0xcd,0xce,0x00,0x01,0xcd,0xde,0x00,0x01,0xcd,0xf4,
-0x00,0x01,0xce,0x04,0x00,0x01,0xce,0x1c,0x00,0x01,0xce,0x2c,0x00,0x01,0xce,0x42,
-0x00,0x01,0xce,0x58,0x00,0x01,0xce,0x6e,0x00,0x01,0xce,0x84,0x00,0x01,0xce,0x9a,
-0x00,0x01,0xce,0xb0,0x00,0x01,0xce,0xc6,0x00,0x01,0xce,0xdc,0x00,0x01,0xce,0xf4,
-0x00,0x01,0xcf,0x0c,0x00,0x01,0xcf,0x24,0x00,0x01,0xcf,0x3c,0x00,0x01,0xcf,0x54,
-0x00,0x01,0xcf,0x6c,0x00,0x01,0xcf,0x84,0x00,0x01,0xcf,0x9c,0x00,0x01,0xcf,0xb4,
-0x00,0x01,0xcf,0xcc,0x00,0x01,0xcf,0xe4,0x00,0x01,0xcf,0xfc,0x00,0x01,0xd0,0x14,
-0x00,0x01,0xd0,0x2c,0x00,0x01,0xd0,0x44,0x00,0x01,0xd0,0x5c,0x00,0x01,0xd0,0x74,
-0x00,0x01,0xd0,0x8c,0x00,0x01,0xd0,0xa4,0x00,0x01,0xd0,0xbc,0x00,0x01,0xd0,0xd4,
-0x00,0x01,0xd0,0xec,0x00,0x01,0xd1,0x04,0x00,0x01,0xd1,0x1c,0x00,0x01,0xd1,0x34,
-0x00,0x01,0xd1,0x4c,0x00,0x01,0xd1,0x64,0x00,0x01,0xd1,0x7c,0x00,0x01,0xd1,0x94,
-0x00,0x01,0xd1,0xac,0x00,0x01,0xd1,0xc4,0x00,0x01,0xd1,0xdc,0x00,0x01,0xd1,0xf4,
-0x00,0x01,0xd2,0x0c,0x00,0x01,0xd2,0x24,0x00,0x01,0xd2,0x3c,0x00,0x01,0xd2,0x54,
-0x00,0x01,0xd2,0x6c,0x00,0x01,0xd2,0x84,0x00,0x01,0xd2,0x9c,0x00,0x01,0xd2,0xb2,
-0x00,0x01,0xd2,0xc8,0x00,0x01,0xd2,0xde,0x00,0x01,0xd2,0xf4,0x00,0x01,0xd3,0x0a,
-0x00,0x01,0xd3,0x20,0x00,0x01,0xd3,0x36,0x00,0x01,0xd3,0x4e,0x00,0x01,0xd3,0x66,
-0x00,0x01,0xd3,0x7e,0x00,0x01,0xd3,0x8e,0x00,0x01,0xd3,0xa6,0x00,0x01,0xd3,0xb6,
-0x00,0x01,0xd3,0xc6,0x00,0x01,0xd3,0xec,0x00,0x01,0xd3,0xfc,0x00,0x01,0xd4,0x14,
-0x00,0x01,0xd4,0x2c,0x00,0x01,0xd4,0x44,0x00,0x01,0xd4,0x5c,0x00,0x01,0xd4,0x74,
-0x00,0x01,0xd4,0x8c,0x00,0x01,0xd4,0xa6,0x00,0x01,0xd4,0xb6,0x00,0x01,0xd4,0xd0,
-0x00,0x01,0xd4,0xe0,0x00,0x01,0xd4,0xf8,0x00,0x01,0xd5,0x12,0x00,0x01,0xd5,0x2a,
-0x00,0x01,0xd5,0x42,0x00,0x01,0xd5,0x5a,0x00,0x01,0xd5,0x72,0x00,0x01,0xd5,0x8a,
-0x00,0x01,0xd5,0x9a,0x00,0x01,0xd5,0xb2,0x00,0x01,0xd5,0xca,0x00,0x01,0xd5,0xe2,
-0x00,0x01,0xd5,0xfa,0x00,0x01,0xd6,0x14,0x00,0x01,0xd6,0x24,0x00,0x01,0xd6,0x3e,
-0x00,0x01,0xd6,0x56,0x00,0x01,0xd6,0x6e,0x00,0x01,0xd6,0x84,0x00,0x01,0xd6,0x9a,
-0x00,0x01,0xd6,0xb0,0x00,0x01,0xd6,0xc0,0x00,0x01,0xd6,0xd8,0x00,0x01,0xd6,0xf0,
-0x00,0x01,0xd7,0x06,0x00,0x01,0xd7,0x1c,0x00,0x01,0xd7,0x34,0x00,0x01,0xd7,0x4c,
-0x00,0x01,0xd7,0x66,0x00,0x01,0xd7,0x76,0x00,0x01,0xd7,0x90,0x00,0x01,0xd7,0xa8,
-0x00,0x01,0xd7,0xb8,0x00,0x01,0xd7,0xc8,0x00,0x01,0xd7,0xe0,0x00,0x01,0xd7,0xf8,
-0x00,0x01,0xd8,0x10,0x00,0x01,0xd8,0x28,0x00,0x01,0xd8,0x40,0x00,0x01,0xd8,0x5a,
-0x00,0x01,0xd8,0x6a,0x00,0x01,0xd8,0x84,0x00,0x01,0xd8,0x94,0x00,0x01,0xd8,0xac,
-0x00,0x01,0xd8,0xbc,0x00,0x01,0xd8,0xe0,0x00,0x01,0xd8,0xe0,0x00,0x01,0xd8,0xe0,
-0x00,0x01,0xd8,0xe0,0x00,0x01,0xd8,0xe0,0x00,0x01,0xd8,0xe0,0x00,0x01,0xd8,0xe0,
-0x00,0x01,0xd8,0xe0,0x00,0x01,0xd8,0xe0,0x00,0x01,0xd8,0xe0,0x00,0x01,0xd8,0xe0,
-0x00,0x01,0xd8,0xe0,0x00,0x01,0xd9,0x0c,0x00,0x01,0xd9,0x1c,0x00,0x01,0xd9,0x46,
-0x00,0x01,0xd9,0x70,0x00,0x01,0xd9,0x98,0x00,0x01,0xd9,0xc0,0x00,0x01,0xd9,0xd8,
-0x00,0x01,0xd9,0xf0,0x00,0x01,0xda,0x2a,0x00,0x01,0xda,0x64,0x00,0x01,0xda,0x9c,
-0x00,0x01,0xda,0xbe,0x00,0x01,0xdb,0x1a,0x00,0x01,0xdb,0x76,0x00,0x01,0xdb,0xd2,
-0x00,0x01,0xdc,0x06,0x00,0x01,0xdc,0x5e,0x00,0x01,0xdc,0xe2,0x00,0x01,0xdd,0x22,
-0x00,0x01,0xdd,0x3e,0x00,0x01,0xdd,0x56,0x00,0x01,0xdd,0x7a,0x00,0x01,0xdd,0xce,
-0x00,0x01,0xdd,0xe6,0x00,0x01,0xdf,0x70,0x00,0x01,0xe0,0x80,0x00,0x01,0xe0,0x9e,
-0x00,0x01,0xe0,0xb6,0x00,0x01,0xe0,0xd6,0x00,0x01,0xe0,0xf4,0x00,0x01,0xe1,0x0c,
-0x00,0x01,0xe1,0x2c,0x00,0x01,0xe1,0x4e,0x00,0x01,0xe1,0xbe,0x00,0x01,0xe2,0x32,
-0x00,0x01,0xe2,0x62,0x00,0x01,0xe2,0x7c,0x00,0x01,0xe2,0xf6,0x00,0x01,0xe3,0x08,
-0x00,0x01,0xe3,0x3e,0x00,0x01,0xe3,0x76,0x00,0x01,0xe3,0xa2,0x00,0x01,0xe3,0xc4,
-0x00,0x01,0xe3,0xda,0x00,0x01,0xe4,0x22,0x00,0x01,0xe4,0x50,0x00,0x01,0xe4,0x7e,
-0x00,0x01,0xe4,0x96,0x00,0x01,0xe4,0xae,0x00,0x01,0xe4,0xc8,0x00,0x01,0xe5,0x0a,
-0x00,0x01,0xe5,0x40,0x00,0x01,0xe5,0x70,0x00,0x01,0xe5,0xa0,0x00,0x01,0xe5,0xb2,
-0x00,0x01,0xe5,0xde,0x00,0x01,0xe6,0x3e,0x00,0x01,0xe6,0x58,0x00,0x01,0xe6,0x7a,
-0x00,0x01,0xe6,0x8a,0x00,0x01,0xe6,0x9c,0x00,0x01,0xe6,0xf0,0x00,0x01,0xe7,0x22,
-0x00,0x01,0xe7,0x70,0x00,0x01,0xe7,0xae,0x00,0x01,0xe7,0xf8,0x00,0x01,0xe8,0x1c,
-0x00,0x01,0xe8,0x58,0x00,0x01,0xe8,0xba,0x00,0x01,0xe8,0xe8,0x00,0x01,0xe9,0x22,
-0x00,0x01,0xe9,0x76,0x00,0x01,0xe9,0x9a,0x00,0x01,0xea,0xa6,0x00,0x01,0xeb,0x0a,
-0x00,0x01,0xeb,0x9a,0x00,0x01,0xeb,0xc0,0x00,0x01,0xec,0x70,0x00,0x01,0xec,0xfc,
-0x00,0x01,0xed,0x2e,0x00,0x01,0xed,0x48,0x00,0x01,0xed,0x6e,0x00,0x01,0xed,0xa6,
-0x00,0x01,0xed,0xe2,0x00,0x01,0xee,0x24,0x00,0x01,0xee,0x36,0x00,0x01,0xee,0x48,
-0x00,0x01,0xee,0x5a,0x00,0x01,0xee,0x6c,0x00,0x01,0xee,0x7e,0x00,0x01,0xee,0x90,
-0x00,0x01,0xee,0xa2,0x00,0x01,0xee,0xb4,0x00,0x01,0xee,0xc6,0x00,0x01,0xee,0xd8,
-0x00,0x01,0xee,0xea,0x00,0x01,0xee,0xfc,0x00,0x01,0xef,0x0e,0x00,0x01,0xef,0x20,
-0x00,0x01,0xef,0x32,0x00,0x01,0xef,0xa6,0x00,0x01,0xf0,0x56,0x00,0x01,0xf0,0xe4,
-0x00,0x01,0xf1,0x22,0x00,0x01,0xf1,0x8a,0x00,0x01,0xf2,0x0c,0x00,0x01,0xf2,0x90,
-0x00,0x01,0xf3,0x72,0x00,0x01,0xf4,0x40,0x00,0x01,0xf4,0xea,0x00,0x01,0xf5,0x4c,
-0x00,0x01,0xf5,0x64,0x00,0x01,0xf7,0x18,0x00,0x01,0xf7,0x5e,0x00,0x01,0xf7,0xb4,
-0x00,0x01,0xf8,0x7c,0x00,0x01,0xf9,0x14,0x00,0x01,0xf9,0xb4,0x00,0x01,0xfa,0x48,
-0x00,0x01,0xfb,0x08,0x00,0x01,0xfb,0x24,0x00,0x01,0xfc,0x4a,0x00,0x01,0xfc,0xe6,
-0x00,0x01,0xfd,0x7c,0x00,0x01,0xfd,0x94,0x00,0x01,0xfd,0xee,0x00,0x01,0xfe,0x54,
-0x00,0x01,0xfe,0xe6,0x00,0x01,0xff,0x66,0x00,0x01,0xff,0x7e,0x00,0x02,0x00,0x24,
-0x00,0x02,0x00,0xd8,0x00,0x02,0x01,0xd4,0x00,0x02,0x02,0x7e,0x00,0x02,0x03,0x94,
-0x00,0x02,0x04,0x32,0x00,0x02,0x04,0x90,0x00,0x02,0x05,0x1a,0x00,0x02,0x05,0x2a,
-0x00,0x02,0x05,0x9a,0x00,0x02,0x05,0xaa,0x00,0x02,0x05,0xba,0x00,0x02,0x06,0x40,
-0x00,0x02,0x06,0x6a,0x00,0x02,0x06,0xbc,0x00,0x02,0x07,0x64,0x00,0x02,0x07,0xe8,
-0x00,0x02,0x08,0x82,0x00,0x02,0x08,0xa2,0x00,0x02,0x08,0xc2,0x00,0x02,0x08,0xe2,
-0x00,0x02,0x09,0x02,0x00,0x02,0x09,0x22,0x00,0x02,0x09,0x42,0x00,0x02,0x09,0x62,
-0x00,0x02,0x09,0x82,0x00,0x02,0x09,0xa2,0x00,0x02,0x09,0xc2,0x00,0x02,0x09,0xe2,
-0x00,0x02,0x0a,0x02,0x00,0x02,0x0a,0x1a,0x00,0x02,0x0a,0x2a,0x00,0x02,0x0a,0x42,
-0x00,0x02,0x0a,0x62,0x00,0x02,0x0a,0x7a,0x00,0x02,0x0a,0x8a,0x00,0x02,0x0a,0xa2,
-0x00,0x02,0x0a,0xc2,0x00,0x02,0x0a,0xea,0x00,0x02,0x0b,0x02,0x00,0x02,0x0b,0x12,
-0x00,0x02,0x0b,0x2a,0x00,0x02,0x0b,0x4a,0x00,0x02,0x0b,0x5a,0x00,0x02,0x0b,0x6a,
-0x00,0x02,0x0b,0x7a,0x00,0x02,0x0b,0x8a,0x00,0x02,0x0b,0x9a,0x00,0x02,0x0b,0xb2,
-0x00,0x02,0x0b,0xd2,0x00,0x02,0x0b,0xea,0x00,0x02,0x0b,0xfa,0x00,0x02,0x0c,0x12,
-0x00,0x02,0x0c,0x32,0x00,0x02,0x0c,0x5a,0x00,0x02,0x0c,0x72,0x00,0x02,0x0c,0x82,
-0x00,0x02,0x0c,0x9a,0x00,0x02,0x0c,0xba,0x00,0x02,0x0c,0xca,0x00,0x02,0x0c,0xda,
-0x00,0x02,0x0c,0xea,0x00,0x02,0x0c,0xfa,0x00,0x02,0x0d,0x7e,0x00,0x02,0x0e,0xf8,
-0x00,0x02,0x0f,0xd4,0x00,0x02,0x0f,0xe4,0x00,0x02,0x10,0x0c,0x00,0x02,0x10,0x34,
-0x00,0x02,0x10,0x5c,0x00,0x02,0x10,0x84,0x00,0x02,0x10,0xba,0x00,0x02,0x10,0xf0,
-0x00,0x02,0x11,0x1c,0x00,0x02,0x11,0x48,0x00,0x02,0x11,0x74,0x00,0x02,0x11,0xa0,
-0x00,0x02,0x11,0xe2,0x00,0x02,0x12,0x24,0x00,0x02,0x12,0x78,0x00,0x02,0x12,0xcc,
-0x00,0x02,0x13,0x04,0x00,0x02,0x13,0x3c,0x00,0x02,0x13,0x74,0x00,0x02,0x13,0xac,
-0x00,0x02,0x13,0xe4,0x00,0x02,0x14,0x1a,0x00,0x02,0x14,0x4c,0x00,0x02,0x14,0x7c,
-0x00,0x02,0x14,0xae,0x00,0x02,0x14,0xe0,0x00,0x02,0x15,0x24,0x00,0x02,0x15,0x54,
-0x00,0x02,0x15,0x82,0x00,0x02,0x15,0xb2,0x00,0x02,0x15,0xe2,0x00,0x02,0x16,0x10,
-0x00,0x02,0x16,0x40,0x00,0x02,0x16,0xa2,0x00,0x02,0x17,0x04,0x00,0x02,0x17,0x3e,
-0x00,0x02,0x17,0x9e,0x00,0x02,0x18,0x1c,0x00,0x02,0x18,0x9c,0x00,0x02,0x18,0xbc,
-0x00,0x02,0x18,0xdc,0x00,0x02,0x18,0xfc,0x00,0x02,0x19,0x1c,0x00,0x02,0x19,0x3c,
-0x00,0x02,0x19,0x5c,0x00,0x02,0x19,0x7c,0x00,0x02,0x19,0x9c,0x00,0x02,0x19,0xe0,
-0x00,0x02,0x1a,0x24,0x00,0x02,0x1a,0x66,0x00,0x02,0x1a,0xa6,0x00,0x02,0x1a,0xe6,
-0x00,0x02,0x1b,0x26,0x00,0x02,0x1b,0x64,0x00,0x02,0x1b,0x96,0x00,0x02,0x1b,0xc8,
-0x00,0x02,0x1c,0x06,0x00,0x02,0x1c,0x44,0x00,0x02,0x1c,0x82,0x00,0x02,0x1c,0xc0,
-0x00,0x02,0x1d,0x1c,0x00,0x02,0x1d,0x56,0x00,0x02,0x1e,0x28,0x00,0x02,0x1f,0x0a,
-0x00,0x02,0x1f,0x3c,0x00,0x02,0x1f,0x9e,0x00,0x02,0x20,0x5c,0x00,0x02,0x20,0xc0,
-0x00,0x02,0x20,0xee,0x00,0x02,0x21,0x52,0x00,0x02,0x22,0x50,0x00,0x02,0x22,0xa0,
-0x00,0x02,0x23,0x04,0x00,0x02,0x24,0x1e,0x00,0x02,0x24,0x6e,0x00,0x02,0x24,0x94,
-0x00,0x02,0x24,0xd8,0x00,0x02,0x24,0xfe,0x00,0x02,0x25,0x94,0x00,0x02,0x25,0xc0,
-0x00,0x02,0x25,0xfc,0x00,0x02,0x26,0x90,0x00,0x02,0x26,0xd8,0x00,0x02,0x26,0xea,
-0x00,0x02,0x26,0xfc,0x00,0x02,0x27,0x0e,0x00,0x02,0x27,0x38,0x00,0x02,0x27,0x96,
-0x00,0x02,0x27,0xae,0x00,0x02,0x27,0xc6,0x00,0x02,0x28,0x3c,0x00,0x02,0x29,0xc8,
-0x00,0x02,0x29,0xe8,0x00,0x02,0x2a,0x0c,0x00,0x02,0x2a,0xb6,0x00,0x02,0x2b,0x62,
-0x00,0x02,0x2b,0x7c,0x00,0x02,0x2b,0xe6,0x00,0x02,0x2c,0x0e,0x00,0x02,0x2c,0xd2,
-0x00,0x02,0x2c,0xfc,0x00,0x02,0x2d,0x24,0x00,0x02,0x2d,0x64,0x00,0x02,0x2d,0xa4,
-0x00,0x02,0x2e,0x44,0x00,0x02,0x2e,0x5c,0x00,0x02,0x2e,0x7c,0x00,0x02,0x2e,0x9e,
-0x00,0x02,0x2e,0xc0,0x00,0x02,0x2e,0xda,0x00,0x02,0x2f,0x04,0x00,0x02,0x2f,0x1c,
-0x00,0x02,0x2f,0x50,0x00,0x02,0x2f,0x80,0x00,0x02,0x2f,0xa0,0x00,0x02,0x30,0x00,
-0x00,0x02,0x30,0x60,0x00,0x02,0x30,0xbe,0x00,0x02,0x31,0x2a,0x00,0x02,0x31,0x90,
-0x00,0x02,0x32,0x0e,0x00,0x02,0x32,0x80,0x00,0x02,0x33,0x12,0x00,0x02,0x33,0xae,
-0x00,0x02,0x34,0xa0,0x00,0x02,0x35,0x40,0x00,0x02,0x35,0xee,0x00,0x02,0x36,0xd6,
-0x00,0x02,0x37,0x48,0x00,0x02,0x37,0x9e,0x00,0x02,0x38,0x12,0x00,0x02,0x38,0xcc,
-0x00,0x02,0x38,0xe4,0x00,0x02,0x39,0x04,0x00,0x02,0x39,0x24,0x00,0x02,0x39,0x44,
-0x00,0x02,0x39,0x66,0x00,0x02,0x39,0x86,0x00,0x02,0x39,0xe0,0x00,0x02,0x3a,0x4c,
-0x00,0x02,0x3a,0x94,0x00,0x02,0x3a,0xd8,0x00,0x02,0x3b,0x18,0x00,0x02,0x3b,0x66,
-0x00,0x02,0x3b,0xaa,0x00,0x02,0x3c,0x8c,0x00,0x02,0x3d,0x0e,0x00,0x02,0x3d,0x9a,
-0x00,0x02,0x3e,0x24,0x00,0x02,0x3e,0x58,0x00,0x02,0x3e,0xb6,0x00,0x02,0x3e,0xf4,
-0x00,0x02,0x3f,0x82,0x00,0x02,0x40,0x0e,0x00,0x02,0x40,0x54,0x00,0x02,0x40,0x94,
-0x00,0x02,0x40,0xfa,0x00,0x02,0x41,0x5e,0x00,0x02,0x41,0xa6,0x00,0x02,0x41,0xe8,
-0x00,0x02,0x42,0x54,0x00,0x02,0x42,0xa8,0x00,0x02,0x42,0xfc,0x00,0x02,0x43,0x68,
-0x00,0x02,0x43,0xd2,0x00,0x02,0x44,0x50,0x00,0x02,0x44,0xcc,0x00,0x02,0x45,0x7e,
-0x00,0x02,0x46,0x30,0x00,0x02,0x46,0x74,0x00,0x02,0x46,0xba,0x00,0x02,0x47,0x44,
-0x00,0x02,0x47,0xca,0x00,0x02,0x48,0x06,0x00,0x02,0x48,0x3e,0x00,0x02,0x48,0x90,
-0x00,0x02,0x48,0xde,0x00,0x02,0x49,0x6c,0x00,0x02,0x49,0xfa,0x00,0x02,0x4a,0x68,
-0x00,0x02,0x4a,0xd6,0x00,0x02,0x4b,0x1c,0x00,0x02,0x4b,0x60,0x00,0x02,0x4b,0xca,
-0x00,0x02,0x4c,0x34,0x00,0x02,0x4c,0x88,0x00,0x02,0x4c,0xd8,0x00,0x02,0x4d,0x54,
-0x00,0x02,0x4d,0xd2,0x00,0x02,0x4e,0x3c,0x00,0x02,0x4e,0xa6,0x00,0x02,0x4f,0x70,
-0x00,0x02,0x50,0x24,0x00,0x02,0x50,0xf2,0x00,0x02,0x51,0xac,0x00,0x02,0x51,0xd2,
-0x00,0x02,0x51,0xf6,0x00,0x02,0x52,0x06,0x00,0x02,0x52,0x16,0x00,0x02,0x52,0x48,
-0x00,0x02,0x52,0x7e,0x00,0x02,0x52,0xc0,0x00,0x02,0x52,0xe2,0x00,0x02,0x53,0x00,
-0x00,0x02,0x53,0x20,0x00,0x02,0x53,0x3e,0x00,0x02,0x53,0x5e,0x00,0x02,0x53,0xb0,
-0x00,0x02,0x54,0xaa,0x00,0x02,0x54,0xcc,0x00,0x02,0x55,0x22,0x00,0x02,0x55,0x78,
-0x00,0x02,0x55,0xb0,0x00,0x02,0x5d,0xe0,0x00,0x02,0x5e,0x06,0x00,0x02,0x5e,0x2c,
-0x00,0x02,0x5e,0x5c,0x00,0x02,0x5e,0x78,0x00,0x02,0x5e,0xa4,0x00,0x02,0x5f,0x16,
-0x00,0x02,0x5f,0x3c,0x00,0x02,0x60,0xaa,0x00,0x02,0x62,0xac,0x00,0x02,0x65,0x3a,
-0x00,0x02,0x66,0xc8,0x00,0x02,0x68,0xd4,0x00,0x02,0x6b,0x38,0x00,0x02,0x6c,0xb0,
-0x00,0x02,0x6f,0xac,0x00,0x02,0x72,0x12,0x00,0x02,0x74,0x7e,0x00,0x02,0x74,0x90,
-0x00,0x02,0x74,0xac,0x00,0x02,0x74,0xc8,0x00,0x02,0x74,0xe4,0x00,0x02,0x75,0x00,
-0x00,0x02,0x75,0x1c,0x00,0x02,0x75,0x38,0x00,0x02,0x75,0x54,0x00,0x02,0x75,0x70,
-0x00,0x02,0x75,0x8c,0x00,0x02,0x75,0xa8,0x00,0x02,0x75,0xc4,0x00,0x02,0x75,0xe0,
-0x00,0x02,0x75,0xfc,0x00,0x02,0x76,0x18,0x00,0x02,0x76,0x32,0x00,0x02,0x76,0x44,
-0x00,0x02,0x76,0xf6,0x00,0x02,0x77,0xe4,0x00,0x02,0x78,0x8a,0x00,0x02,0x78,0x9c,
-0x00,0x02,0x78,0xae,0x00,0x02,0x78,0xca,0x00,0x02,0x78,0xdc,0x00,0x02,0x78,0xee,
-0x00,0x02,0x79,0x0a,0x00,0x02,0x79,0x20,0x00,0x02,0x79,0x3c,0x00,0x02,0x79,0x58,
-0x00,0x02,0x79,0x6a,0x00,0x02,0x79,0x80,0x00,0x02,0x79,0x9c,0x00,0x02,0x79,0xb6,
-0x00,0x02,0x79,0xe0,0x00,0x02,0x7a,0x32,0x00,0x02,0x7a,0x4a,0x00,0x02,0x7a,0xa2,
-0x00,0x02,0x7b,0x02,0x00,0x02,0x7c,0x3e,0x00,0x02,0x7c,0xc4,0x00,0x02,0x7d,0x4a,
-0x00,0x02,0x7f,0x0a,0x00,0x02,0x7f,0x24,0x00,0x02,0x7f,0x4e,0x00,0x02,0x7f,0x6a,
-0x00,0x02,0x7f,0x96,0x00,0x02,0x7f,0xb0,0x00,0x02,0x7f,0xda,0x00,0x02,0x7f,0xf8,
-0x00,0x02,0x80,0x2a,0x00,0x02,0x80,0x46,0x00,0x02,0x80,0x6e,0x00,0x02,0x80,0x8a,
-0x00,0x02,0x80,0xb2,0x00,0x02,0x80,0xcc,0x00,0x02,0x80,0xf6,0x00,0x02,0x81,0x10,
-0x00,0x02,0x81,0x3a,0x00,0x02,0x81,0x54,0x00,0x02,0x81,0x7e,0x00,0x02,0x81,0x98,
-0x00,0x02,0x81,0xc2,0x00,0x02,0x81,0xdc,0x00,0x02,0x82,0x06,0x00,0x02,0x82,0x20,
-0x00,0x02,0x82,0x4a,0x00,0x02,0x82,0x64,0x00,0x02,0x82,0x8e,0x00,0x02,0x82,0xa8,
-0x00,0x02,0x82,0xd2,0x00,0x02,0x82,0xf2,0x00,0x02,0x83,0x24,0x00,0x02,0x83,0x68,
-0x00,0x02,0x83,0xf8,0x00,0x02,0x84,0x4c,0x00,0x02,0x84,0xb2,0x00,0x02,0x85,0xaa,
-0x00,0x02,0x86,0x5c,0x00,0x02,0x87,0x16,0x00,0x02,0x87,0x7a,0x00,0x02,0x87,0xd0,
-0x00,0x02,0x88,0x26,0x00,0x02,0x88,0x7e,0x00,0x02,0x88,0xd8,0x00,0x02,0x89,0x3e,
-0x00,0x02,0x89,0x8e,0x00,0x02,0x89,0xb4,0x00,0x02,0x89,0xdc,0x00,0x02,0x8a,0x18,
-0x00,0x02,0x8a,0x8e,0x00,0x02,0x8a,0xe0,0x00,0x02,0x8b,0x34,0x00,0x02,0x8b,0x60,
-0x00,0x02,0x8b,0x8c,0x00,0x02,0x8b,0xb8,0x00,0x02,0x8b,0xe6,0x00,0x02,0x8c,0x2a,
-0x00,0x02,0x8c,0x6e,0x00,0x02,0x8c,0x88,0x00,0x02,0x8c,0xa2,0x00,0x02,0x8c,0xba,
-0x00,0x02,0x8c,0xd2,0x00,0x02,0x8d,0x1a,0x00,0x02,0x8d,0x44,0x00,0x02,0x8d,0x6e,
-0x00,0x02,0x8d,0x94,0x00,0x02,0x8d,0xbc,0x00,0x02,0x8d,0xf6,0x00,0x02,0x8e,0x40,
-0x00,0x02,0x8e,0x6a,0x00,0x02,0x8e,0x92,0x00,0x02,0x8e,0xfe,0x00,0x02,0x8f,0x3e,
-0x00,0x02,0x8f,0x7e,0x00,0x02,0x8f,0xbe,0x00,0x02,0x8f,0xfe,0x00,0x02,0x90,0x7c,
-0x00,0x02,0x90,0xfa,0x00,0x02,0x91,0x78,0x00,0x02,0x91,0xf6,0x00,0x02,0x92,0x1c,
-0x00,0x02,0x92,0x44,0x00,0x02,0x92,0x6c,0x00,0x02,0x92,0x96,0x00,0x02,0x92,0xb0,
-0x00,0x02,0x92,0xda,0x00,0x02,0x92,0xf4,0x00,0x02,0x93,0x1c,0x00,0x02,0x94,0x50,
-0x00,0x02,0x94,0xe8,0x00,0x02,0x95,0xd4,0x00,0x02,0xa0,0x9a,0x00,0x02,0xa3,0x7c,
-0x00,0x02,0xa3,0xd6,0x00,0x02,0xa4,0x86,0x00,0x02,0xa5,0x0a,0x00,0x02,0xa5,0x94,
-0x00,0x02,0xa7,0x3c,0x00,0x02,0xa9,0x0a,0x00,0x02,0xaa,0xe0,0x00,0x02,0xac,0x1c,
-0x00,0x02,0xae,0x4a,0x00,0x02,0xb1,0x18,0x00,0x02,0xb4,0xf0,0x00,0x02,0xb5,0x78,
-0x00,0x02,0xb6,0x58,0x00,0x02,0xb7,0x1e,0x00,0x02,0xb7,0x92,0x00,0x02,0xb9,0x76,
-0x00,0x02,0xbb,0x7a,0x00,0x02,0xbb,0xd2,0x00,0x02,0xbc,0x1a,0x00,0x02,0xbd,0x22,
-0x00,0x02,0xbe,0x16,0x00,0x02,0xbe,0xfe,0x00,0x02,0xbf,0xde,0x00,0x02,0xc1,0x00,
-0x00,0x02,0xc2,0x6a,0x00,0x02,0xc3,0xa2,0x00,0x02,0xc5,0x10,0x00,0x02,0xcb,0xaa,
-0x00,0x02,0xcc,0x2e,0x00,0x02,0xcd,0x90,0x00,0x02,0xcf,0x48,0x00,0x02,0xd6,0x86,
-0x00,0x02,0xd7,0x92,0x00,0x02,0xd9,0x24,0x00,0x02,0xda,0x56,0x00,0x02,0xdb,0x2c,
-0x00,0x02,0xdc,0x44,0x00,0x02,0xdd,0x3c,0x00,0x02,0xe1,0x02,0x00,0x02,0xe4,0x42,
-0x00,0x02,0xe5,0x0c,0x00,0x02,0xe6,0x9c,0x00,0x02,0xe8,0x22,0x00,0x02,0xe8,0x42,
-0x00,0x02,0xe8,0x62,0x00,0x02,0xe8,0x82,0x00,0x02,0xe8,0xa2,0x00,0x02,0xe8,0xc2,
-0x00,0x02,0xe8,0xe2,0x00,0x02,0xe9,0x02,0x00,0x02,0xe9,0x22,0x00,0x02,0xea,0x8e,
-0x00,0x02,0xec,0xae,0x00,0x02,0xee,0xd0,0x00,0x02,0xf0,0x36,0x00,0x02,0xf2,0x38,
-0x00,0x02,0xf3,0x5e,0x00,0x02,0xf4,0x7c,0x00,0x02,0xf6,0x58,0x00,0x02,0xf7,0xe4,
-0x00,0x02,0xf9,0x78,0x00,0x02,0xfa,0x1c,0x00,0x02,0xfb,0x14,0x00,0x02,0xfc,0x36,
-0x00,0x02,0xfd,0x9c,0x00,0x02,0xff,0xca,0x00,0x03,0x00,0xd6,0x00,0x03,0x01,0x78,
-0x00,0x03,0x03,0x36,0x00,0x03,0x03,0xd2,0x00,0x03,0x06,0x1a,0x00,0x03,0x07,0xee,
-0x00,0x03,0x09,0xa0,0x00,0x03,0x0b,0x14,0x00,0x03,0x0c,0x60,0x00,0x03,0x0d,0x12,
-0x00,0x03,0x0e,0x50,0x00,0x03,0x0f,0x32,0x00,0x03,0x10,0x32,0x00,0x03,0x12,0xae,
-0x00,0x03,0x15,0xd6,0x00,0x03,0x17,0xd8,0x00,0x03,0x1a,0x54,0x00,0x03,0x1c,0x80,
-0x00,0x03,0x1e,0x9c,0x00,0x03,0x21,0x92,0x00,0x03,0x23,0x42,0x00,0x03,0x24,0xa6,
-0x00,0x03,0x25,0xd8,0x00,0x03,0x26,0xf8,0x00,0x03,0x27,0xfc,0x00,0x03,0x28,0x8e,
-0x00,0x03,0x29,0x80,0x00,0x03,0x29,0xdc,0x00,0x03,0x2a,0xbe,0x00,0x03,0x2c,0x32,
-0x00,0x03,0x2c,0x9e,0x00,0x03,0x2c,0xd8,0x00,0x03,0x2f,0x16,0x00,0x03,0x31,0x26,
-0x00,0x03,0x31,0x8a,0x00,0x03,0x32,0x1a,0x00,0x03,0x32,0xe0,0x00,0x03,0x33,0xca,
-0x00,0x03,0x34,0xb6,0x00,0x03,0x35,0xae,0x00,0x03,0x37,0x80,0x00,0x03,0x38,0xa6,
-0x00,0x03,0x3a,0xb4,0x00,0x03,0x3d,0x5c,0x00,0x03,0x3e,0xca,0x00,0x03,0x40,0x7c,
-0x00,0x03,0x42,0x5c,0x00,0x03,0x43,0xe6,0x00,0x03,0x45,0xa4,0x00,0x03,0x47,0xd8,
-0x00,0x03,0x49,0x3e,0x00,0x03,0x4a,0x7c,0x00,0x03,0x4b,0xf4,0x00,0x03,0x4d,0x62,
-0x00,0x03,0x50,0x1a,0x00,0x03,0x52,0xc2,0x00,0x03,0x53,0x94,0x00,0x03,0x54,0x04,
-0x00,0x03,0x54,0xba,0x00,0x03,0x55,0xb4,0x00,0x03,0x56,0xf2,0x00,0x03,0x58,0x76,
-0x00,0x03,0x5a,0x3c,0x00,0x03,0x5c,0x00,0x00,0x03,0x5e,0x4e,0x00,0x03,0x5f,0x1e,
-0x00,0x03,0x60,0x78,0x00,0x03,0x60,0xa0,0x00,0x03,0x60,0xe2,0x00,0x03,0x60,0xfa,
-0x00,0x03,0x61,0x12,0x00,0x03,0x61,0x2a,0x00,0x03,0x61,0x42,0x00,0x03,0x61,0xe8,
-0x00,0x03,0x62,0x50,0x00,0x03,0x62,0xf0,0x00,0x03,0x64,0xee,0x00,0x03,0x66,0xa4,
-0x00,0x03,0x68,0xc8,0x00,0x03,0x69,0xf4,0x00,0x03,0x6a,0xa8,0x00,0x03,0x6c,0x28,
-0x00,0x03,0x6e,0x6c,0x00,0x03,0x71,0x4c,0x00,0x03,0x76,0x52,0x00,0x03,0x7a,0x70,
-0x00,0x03,0x7b,0x8c,0x00,0x03,0x7b,0xe2,0x00,0x03,0x7c,0x12,0x00,0x03,0x7c,0x7a,
-0x00,0x03,0x7e,0x3e,0x00,0x03,0x7f,0xda,0x00,0x03,0x81,0x94,0x00,0x03,0x85,0x54,
-0x00,0x03,0x86,0xfa,0x00,0x03,0x88,0xa0,0x00,0x03,0x89,0x2c,0x00,0x03,0x89,0xdc,
-0x00,0x03,0x8c,0x84,0x00,0x03,0x8e,0x24,0x00,0x03,0x8f,0x54,0x00,0x03,0x90,0x52,
-0x00,0x03,0x91,0x7e,0x00,0x03,0x92,0x64,0x00,0x03,0x92,0xea,0x00,0x03,0x93,0x4e,
-0x00,0x03,0x93,0xb2,0x00,0x03,0x93,0xf4,0x00,0x03,0x94,0x34,0x00,0x03,0x94,0xfe,
-0x00,0x03,0x95,0xf2,0x00,0x03,0x96,0x70,0x00,0x03,0x96,0xa4,0x00,0x03,0x96,0xe0,
-0x00,0x03,0x97,0x24,0x00,0x03,0x97,0x54,0x00,0x03,0x97,0xb4,0x00,0x03,0x98,0x32,
-0x00,0x03,0x99,0x1a,0x00,0x03,0x99,0xb2,0x00,0x03,0x9a,0x6c,0x00,0x03,0x9b,0xec,
-0x00,0x03,0x9d,0xb4,0x00,0x03,0xa1,0x12,0x00,0x03,0xa1,0x7a,0x00,0x03,0xa2,0x3e,
-0x00,0x03,0xa2,0xa4,0x00,0x03,0xa3,0x3a,0x00,0x03,0xa3,0xca,0x00,0x03,0xa4,0x88,
-0x00,0x03,0xa5,0x12,0x00,0x03,0xa5,0x92,0x00,0x03,0xa6,0x0a,0x00,0x03,0xa6,0x7a,
-0x00,0x03,0xa6,0xcc,0x00,0x03,0xa7,0x34,0x00,0x03,0xa7,0x98,0x00,0x03,0xa7,0xf0,
-0x00,0x03,0xa8,0xae,0x00,0x03,0xa8,0xf2,0x00,0x03,0xa9,0x4a,0x00,0x03,0xa9,0x9a,
-0x00,0x03,0xaa,0x0a,0x00,0x03,0xaa,0xc6,0x00,0x03,0xac,0x78,0x00,0x03,0xae,0x78,
-0x00,0x03,0xaf,0xb6,0x00,0x03,0xb1,0xe6,0x00,0x03,0xb3,0x82,0x00,0x03,0xb6,0x50,
-0x00,0x03,0xbc,0x4a,0x00,0x03,0xbd,0xa4,0x00,0x03,0xbf,0xf4,0x00,0x03,0xc0,0xb8,
-0x00,0x03,0xc1,0x7e,0x00,0x03,0xc2,0x50,0x00,0x03,0xc3,0xd4,0x00,0x03,0xc5,0x52,
-0x00,0x03,0xc6,0xb0,0x00,0x03,0xc8,0x12,0x00,0x03,0xc9,0x5e,0x00,0x03,0xca,0xca,
-0x00,0x03,0xcb,0x34,0x00,0x03,0xcb,0x9e,0x00,0x03,0xcc,0x04,0x00,0x03,0xcc,0x6c,
-0x00,0x03,0xcc,0xce,0x00,0x03,0xcc,0xea,0x00,0x03,0xcd,0x06,0x00,0x03,0xcd,0x22,
-0x00,0x03,0xcd,0x62,0x00,0x03,0xcd,0xae,0x00,0x03,0xcd,0xc6,0x00,0x03,0xcd,0xde,
-0x00,0x03,0xce,0xda,0x00,0x03,0xcf,0x84,0x00,0x03,0xd0,0x58,0x00,0x03,0xd0,0xd4,
-0x00,0x03,0xd1,0x54,0x00,0x03,0xd2,0x74,0x00,0x03,0xd3,0x58,0x00,0x03,0xd3,0xc4,
-0x00,0x03,0xd4,0x30,0x00,0x03,0xd4,0x6a,0x00,0x03,0xd4,0xa8,0x00,0x03,0xd4,0xd0,
-0x00,0x03,0xd4,0xfa,0x00,0x03,0xd5,0x22,0x00,0x03,0xd5,0x4c,0x00,0x03,0xd5,0x74,
-0x00,0x03,0xd5,0x9e,0x00,0x03,0xd5,0xca,0x00,0x03,0xd5,0xf6,0x00,0x03,0xd6,0x5a,
-0x00,0x03,0xd6,0xca,0x00,0x03,0xd7,0x46,0x00,0x03,0xd7,0xf0,0x00,0x03,0xd9,0x30,
-0x00,0x03,0xd9,0xb6,0x00,0x03,0xda,0xce,0x00,0x03,0xdc,0x62,0x00,0x03,0xdc,0xd6,
-0x00,0x03,0xdf,0x22,0x00,0x03,0xe0,0xae,0x00,0x03,0xe2,0x22,0x00,0x03,0xe3,0x06,
-0x00,0x03,0xe4,0x2a,0x00,0x03,0xe5,0x6c,0x00,0x03,0xe6,0x58,0x00,0x03,0xe7,0x72,
-0x00,0x03,0xe8,0xae,0x00,0x03,0xe9,0x88,0x00,0x03,0xea,0xd0,0x00,0x03,0xec,0x12,
-0x00,0x03,0xed,0x40,0x00,0x03,0xed,0xc8,0x00,0x03,0xee,0x94,0x00,0x03,0xef,0x7e,
-0x00,0x03,0xf0,0x12,0x00,0x03,0xf0,0xd4,0x00,0x03,0xf1,0xb8,0x00,0x03,0xf2,0x38,
-0x00,0x03,0xf3,0x24,0x00,0x03,0xf4,0x0e,0x00,0x03,0xf4,0xe6,0x00,0x03,0xf5,0x16,
-0x00,0x03,0xf5,0x42,0x00,0x03,0xf5,0x6e,0x00,0x03,0xf5,0x9a,0x00,0x03,0xf5,0xca,
-0x00,0x03,0xf6,0x6c,0x00,0x03,0xf6,0x94,0x00,0x03,0xf6,0xbc,0x00,0x03,0xf7,0x0e,
-0x00,0x03,0xf7,0x62,0x00,0x03,0xf7,0x8a,0x00,0x03,0xf7,0xba,0x00,0x03,0xf7,0xea,
-0x00,0x03,0xf8,0x0a,0x00,0x03,0xf8,0x5e,0x00,0x03,0xf8,0xb0,0x00,0x03,0xf8,0xda,
-0x00,0x03,0xf9,0x08,0x00,0x03,0xf9,0x4e,0x00,0x03,0xf9,0x94,0x00,0x03,0xf9,0xe6,
-0x00,0x03,0xfa,0x34,0x00,0x03,0xfa,0x80,0x00,0x03,0xfa,0xce,0x00,0x03,0xfb,0x24,
-0x00,0x03,0xfb,0x7a,0x00,0x03,0xfb,0xec,0x00,0x03,0xfc,0x8e,0x00,0x03,0xfc,0xe6,
-0x00,0x03,0xfd,0x2c,0x00,0x03,0xfd,0x84,0x00,0x03,0xfe,0x2a,0x00,0x03,0xfe,0xc0,
-0x00,0x03,0xff,0x66,0x00,0x04,0x00,0x46,0x00,0x04,0x00,0xe0,0x00,0x04,0x02,0x0c,
-0x00,0x04,0x03,0x42,0x00,0x04,0x03,0xd8,0x00,0x04,0x04,0x14,0x00,0x04,0x04,0x24,
-0x00,0x04,0x04,0x34,0x00,0x04,0x04,0x4c,0x00,0x04,0x04,0x64,0x00,0x04,0x04,0x84,
-0x00,0x04,0x04,0xac,0x00,0x04,0x05,0x38,0x00,0x04,0x05,0xd6,0x00,0x04,0x06,0x00,
-0x00,0x04,0x06,0x2a,0x00,0x04,0x06,0x5e,0x00,0x04,0x06,0x92,0x00,0x04,0x06,0xba,
-0x00,0x04,0x06,0xf0,0x00,0x04,0x07,0x28,0x00,0x04,0x07,0x54,0x00,0x04,0x07,0xa4,
-0x00,0x04,0x07,0xd2,0x00,0x04,0x08,0x3c,0x00,0x04,0x08,0x78,0x00,0x04,0x08,0xea,
-0x00,0x04,0x09,0x1c,0x00,0x04,0x09,0x86,0x00,0x04,0x09,0xba,0x00,0x04,0x09,0xf0,
-0x00,0x04,0x0a,0x60,0x00,0x04,0x0a,0xe0,0x00,0x04,0x0b,0x24,0x00,0x04,0x0b,0x6a,
-0x00,0x04,0x0b,0xf6,0x00,0x04,0x0c,0x72,0x00,0x04,0x0d,0x22,0x00,0x04,0x0d,0xb6,
-0x00,0x04,0x0e,0x34,0x00,0x04,0x0f,0x12,0x00,0x04,0x0f,0xd0,0x00,0x04,0x10,0x50,
-0x00,0x04,0x11,0x48,0x00,0x04,0x12,0x16,0x00,0x04,0x12,0xbe,0x00,0x04,0x13,0x58,
-0x00,0x04,0x14,0x06,0x00,0x04,0x14,0xce,0x00,0x04,0x14,0xe6,0x00,0x04,0x14,0xfe,
-0x00,0x04,0x15,0x16,0x00,0x04,0x15,0x2e,0x00,0x04,0x15,0x46,0x00,0x04,0x15,0x5e,
-0x00,0x04,0x15,0x76,0x00,0x04,0x15,0x8e,0x00,0x04,0x15,0xa6,0x00,0x04,0x15,0xbe,
-0x00,0x04,0x15,0xd6,0x00,0x04,0x15,0xee,0x00,0x04,0x16,0x06,0x00,0x04,0x16,0x1e,
-0x00,0x04,0x16,0x36,0x00,0x04,0x16,0x4e,0x00,0x04,0x16,0x66,0x00,0x04,0x16,0x7e,
-0x00,0x04,0x16,0x96,0x00,0x04,0x16,0xae,0x00,0x04,0x16,0xc6,0x00,0x04,0x16,0xde,
-0x00,0x04,0x16,0xf6,0x00,0x04,0x17,0x0e,0x00,0x04,0x17,0x26,0x00,0x04,0x17,0x3e,
-0x00,0x04,0x17,0x56,0x00,0x04,0x17,0x6e,0x00,0x04,0x17,0x86,0x00,0x04,0x17,0x9e,
-0x00,0x04,0x17,0xb6,0x00,0x04,0x17,0xce,0x00,0x04,0x17,0xe6,0x00,0x04,0x17,0xfe,
-0x00,0x04,0x18,0x16,0x00,0x04,0x18,0x2e,0x00,0x04,0x18,0x46,0x00,0x04,0x18,0x5e,
-0x00,0x04,0x18,0x76,0x00,0x04,0x18,0x8e,0x00,0x04,0x18,0xa6,0x00,0x04,0x18,0xbe,
-0x00,0x04,0x18,0xd6,0x00,0x04,0x18,0xee,0x00,0x04,0x19,0x06,0x00,0x04,0x19,0x1e,
-0x00,0x04,0x19,0x36,0x00,0x04,0x19,0x4e,0x00,0x04,0x19,0x66,0x00,0x04,0x19,0x7e,
-0x00,0x04,0x19,0x96,0x00,0x04,0x19,0xae,0x00,0x04,0x19,0xbe,0x00,0x04,0x1a,0x70,
-0x00,0x04,0x1a,0x80,0x00,0x04,0x1a,0x90,0x00,0x04,0x1a,0xa8,0x00,0x04,0x1a,0xc0,
-0x00,0x04,0x1a,0xd6,0x00,0x04,0x1a,0xec,0x00,0x04,0x1a,0xfc,0x00,0x04,0x1b,0x74,
-0x00,0x04,0x1b,0xa4,0x00,0x04,0x1b,0xe4,0x00,0x04,0x1b,0xf4,0x00,0x04,0x1c,0x04,
-0x00,0x04,0x1c,0x1c,0x00,0x04,0x1c,0x34,0x00,0x04,0x1c,0x46,0x00,0x04,0x1c,0x5e,
-0x00,0x04,0x1c,0x70,0x00,0x04,0x1c,0xa2,0x00,0x04,0x1c,0xb4,0x00,0x04,0x1c,0xc6,
-0x00,0x04,0x1c,0xde,0x00,0x04,0x1c,0xf0,0x00,0x04,0x1d,0x08,0x00,0x04,0x1d,0x1a,
-0x00,0x04,0x1d,0x32,0x00,0x04,0x1d,0x44,0x00,0x04,0x1d,0x5c,0x00,0x04,0x1d,0x6e,
-0x00,0x04,0x1d,0x86,0x00,0x04,0x1d,0x96,0x00,0x04,0x1d,0xae,0x00,0x04,0x1d,0xc6,
-0x00,0x04,0x1d,0xde,0x00,0x04,0x1d,0xf6,0x00,0x04,0x1e,0x0c,0x00,0x04,0x1e,0x24,
-0x00,0x04,0x1e,0x3c,0x00,0x04,0x1e,0x54,0x00,0x04,0x1e,0x6c,0x00,0x04,0x1e,0x84,
-0x00,0x04,0x1e,0x9c,0x00,0x04,0x1e,0xb4,0x00,0x04,0x1e,0xc4,0x00,0x04,0x1e,0xf6,
-0x00,0x04,0x1f,0x0e,0x00,0x04,0x1f,0x26,0x00,0x04,0x1f,0x3e,0x00,0x04,0x1f,0x56,
-0x00,0x04,0x1f,0x6e,0x00,0x04,0x1f,0x86,0x00,0x04,0x1f,0x9e,0x00,0x04,0x1f,0xb6,
-0x00,0x04,0x1f,0xce,0x00,0x04,0x1f,0xe6,0x00,0x04,0x1f,0xfe,0x00,0x04,0x20,0x16,
-0x00,0x04,0x20,0x2e,0x00,0x04,0x20,0x46,0x00,0x04,0x20,0x5e,0x00,0x04,0x20,0x76,
-0x00,0x04,0x20,0x8e,0x00,0x04,0x20,0xa6,0x00,0x04,0x20,0xb6,0x00,0x04,0x21,0x4c,
-0x00,0x04,0x21,0xb2,0x00,0x04,0x22,0x34,0x00,0x04,0x22,0x4c,0x00,0x04,0x22,0x64,
-0x00,0x04,0x22,0x7c,0x00,0x04,0x22,0x94,0x00,0x04,0x22,0xa4,0x00,0x04,0x23,0x08,
-0x00,0x04,0x23,0x20,0x00,0x04,0x23,0x38,0x00,0x04,0x23,0x48,0x00,0x04,0x23,0x9c,
-0x00,0x04,0x23,0xb4,0x00,0x04,0x23,0xcc,0x00,0x04,0x23,0xdc,0x00,0x04,0x24,0xae,
-0x00,0x04,0x25,0x3e,0x00,0x04,0x25,0xde,0x00,0x04,0x25,0xf6,0x00,0x04,0x26,0x0e,
-0x00,0x04,0x26,0x26,0x00,0x04,0x26,0x3e,0x00,0x04,0x26,0x4e,0x00,0x04,0x27,0x2a,
-0x00,0x04,0x27,0xba,0x00,0x04,0x28,0x62,0x00,0x04,0x28,0x7a,0x00,0x04,0x28,0x92,
-0x00,0x04,0x28,0xaa,0x00,0x04,0x28,0xc2,0x00,0x04,0x28,0xd2,0x00,0x04,0x29,0x54,
-0x00,0x04,0x29,0xbe,0x00,0x04,0x2a,0x40,0x00,0x04,0x2a,0x58,0x00,0x04,0x2a,0x70,
-0x00,0x04,0x2a,0x88,0x00,0x04,0x2a,0xa0,0x00,0x04,0x2a,0xb0,0x00,0x04,0x2b,0x5a,
-0x00,0x04,0x2b,0xbe,0x00,0x04,0x2c,0x4c,0x00,0x04,0x2c,0x64,0x00,0x04,0x2c,0x7c,
-0x00,0x04,0x2c,0x94,0x00,0x04,0x2c,0xac,0x00,0x04,0x2c,0xc4,0x00,0x04,0x2c,0xdc,
-0x00,0x04,0x2c,0xf4,0x00,0x04,0x2d,0x0c,0x00,0x04,0x2d,0x24,0x00,0x04,0x2d,0x3c,
-0x00,0x04,0x2d,0x54,0x00,0x04,0x2d,0x6c,0x00,0x04,0x2d,0x7c,0x00,0x04,0x2e,0x46,
-0x00,0x04,0x2e,0xb0,0x00,0x04,0x2f,0x36,0x00,0x04,0x2f,0x46,0x00,0x04,0x2f,0xb8,
-0x00,0x04,0x2f,0xea,0x00,0x04,0x30,0x2c,0x00,0x04,0x30,0x3c,0x00,0x04,0x30,0xda,
-0x00,0x04,0x31,0x5e,0x00,0x04,0x31,0xec,0x00,0x04,0x32,0x04,0x00,0x04,0x32,0x1c,
-0x00,0x04,0x32,0x34,0x00,0x04,0x32,0x4c,0x00,0x04,0x32,0x5c,0x00,0x04,0x32,0xd4,
-0x00,0x04,0x33,0x8e,0x00,0x04,0x34,0x1e,0x00,0x04,0x34,0x2e,0x00,0x04,0x34,0xc2,
-0x00,0x04,0x34,0xd2,0x00,0x04,0x35,0x74,0x00,0x04,0x35,0x8c,0x00,0x04,0x35,0xa4,
-0x00,0x04,0x35,0xbc,0x00,0x04,0x35,0xd4,0x00,0x04,0x35,0xec,0x00,0x04,0x36,0x04,
-0x00,0x04,0x36,0x1c,0x00,0x04,0x36,0x34,0x00,0x04,0x36,0x4c,0x00,0x04,0x36,0x64,
-0x00,0x04,0x36,0xb6,0x00,0x04,0x37,0x1c,0x00,0x04,0x37,0x1c,0x00,0x04,0x37,0xa6,
-0x00,0x04,0x37,0xca,0x00,0x04,0x38,0x94,0x00,0x04,0x39,0x2e,0x00,0x04,0x39,0xfe,
-0x00,0x04,0x3a,0xa4,0x00,0x04,0x3b,0x3e,0x00,0x04,0x3b,0xea,0x00,0x04,0x3c,0x1e,
-0x00,0x04,0x3c,0xbc,0x00,0x04,0x3c,0xe6,0x00,0x04,0x3d,0x22,0x00,0x04,0x3d,0x4e,
-0x00,0x04,0x3d,0x64,0x00,0x04,0x3d,0x86,0x00,0x04,0x3d,0xb4,0x00,0x04,0x3d,0xe2,
-0x00,0x04,0x3e,0x04,0x00,0x04,0x3e,0x3c,0x00,0x04,0x3e,0xb6,0x00,0x04,0x3e,0xc6,
-0x00,0x04,0x3e,0xd6,0x00,0x04,0x3f,0x96,0x00,0x04,0x40,0x30,0x00,0x04,0x40,0xd0,
-0x00,0x04,0x41,0x96,0x00,0x04,0x41,0xa6,0x00,0x04,0x41,0xb6,0x00,0x04,0x41,0xce,
-0x00,0x04,0x41,0xe6,0x00,0x04,0x42,0x36,0x00,0x04,0x42,0x56,0x00,0x04,0x42,0x76,
-0x00,0x04,0x42,0x96,0x00,0x04,0x42,0xae,0x00,0x04,0x42,0xc6,0x00,0x04,0x42,0xde,
-0x00,0x04,0x42,0xf6,0x00,0x04,0x43,0x0e,0x00,0x04,0x43,0x26,0x00,0x04,0x43,0x3e,
-0x00,0x04,0x43,0x56,0x00,0x04,0x43,0x6e,0x00,0x04,0x43,0x86,0x00,0x04,0x43,0x9e,
-0x00,0x04,0x43,0xb6,0x00,0x04,0x43,0xd6,0x00,0x04,0x43,0xf6,0x00,0x04,0x44,0x16,
-0x00,0x04,0x44,0x36,0x00,0x04,0x44,0x90,0x00,0x04,0x44,0xbc,0x00,0x04,0x45,0x0c,
-0x00,0x04,0x45,0x26,0x00,0x04,0x45,0x40,0x00,0x04,0x45,0x5a,0x00,0x04,0x45,0x74,
-0x00,0x04,0x45,0x8e,0x00,0x04,0x45,0xa8,0x00,0x04,0x45,0xc2,0x00,0x04,0x45,0xdc,
-0x00,0x04,0x45,0xf6,0x00,0x04,0x46,0x10,0x00,0x04,0x46,0x2a,0x00,0x04,0x46,0x44,
-0x00,0x04,0x46,0x5e,0x00,0x04,0x46,0x78,0x00,0x04,0x46,0x92,0x00,0x04,0x46,0xac,
-0x00,0x04,0x46,0xc6,0x00,0x04,0x46,0xe0,0x00,0x04,0x46,0xfa,0x00,0x04,0x47,0x14,
-0x00,0x04,0x47,0x2c,0x00,0x01,0x00,0x00,0x0c,0x31,0x03,0x62,0x00,0x2b,0x00,0x98,
-0x00,0x08,0x00,0x02,0x00,0x10,0x00,0x40,0x00,0x08,0x00,0x00,0x04,0x15,0x05,0x68,
-0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,
-0x00,0x00,0x35,0xcc,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x09,0x00,0x01,0x00,0x00,
-0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xff,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,
-0xff,0xff,0xff,0xff,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x02,0xff,0xff,0xff,0xff,
-0x00,0x01,0x00,0x03,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x01,0x00,0x02,
-0x00,0x00,0x00,0x02,0xff,0xff,0xff,0xff,0x00,0x01,0x00,0x03,0x00,0x00,0x00,0x00,
-0xff,0xff,0xff,0xff,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x02,0xff,0xff,0xff,0xff,
-0x00,0x01,0x00,0x03,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x01,0x00,0x02,
-0x00,0x00,0x00,0x02,0xff,0xff,0xff,0xff,0x00,0x01,0x00,0x03,0x00,0x00,0x00,0x00,
-0xff,0xff,0xff,0xff,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x02,0xff,0xff,0xff,0xff,
-0x00,0x01,0x00,0x03,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x01,0x00,0x04,
-0x00,0x00,0x00,0x04,0xff,0xff,0xff,0xff,0x00,0x01,0x00,0x05,0x00,0x00,0x00,0x00,
-0xff,0xff,0xff,0xff,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x08,0xff,0xff,0xff,0xff,
-0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xf7,0x00,0x0b,0x00,0x02,
-0x00,0x00,0x00,0x10,0xff,0xff,0xff,0xff,0x00,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,
-0xff,0xff,0xff,0xef,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x88,
-0x40,0x00,0x00,0x01,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x14,
-0x00,0x00,0x03,0xc0,0x00,0x00,0x03,0xf0,0x00,0x00,0x04,0x30,0x00,0x04,0x00,0x06,
-0x00,0x0d,0x00,0x30,0x00,0x03,0x00,0x1e,0x02,0xb7,0x02,0xa3,0x00,0x60,0x02,0xbc,
-0x02,0xb9,0x00,0x8a,0x02,0xc3,0x02,0xbf,0x00,0x92,0x02,0xc9,0x02,0xc6,0x00,0x9c,
-0x02,0xd6,0x02,0xcc,0x00,0xa4,0x02,0xe5,0x02,0xdc,0x00,0xba,0x02,0xe7,0x02,0xe7,
-0x00,0xce,0x02,0xf5,0x02,0xe9,0x00,0xd0,0x05,0x3d,0x04,0xd6,0x00,0xea,0x0b,0xe6,
-0x0b,0x16,0x01,0xba,0x0b,0xf3,0x0b,0xe9,0x03,0x5c,0x0c,0x04,0x0b,0xfa,0x03,0x72,
-0x0c,0x17,0x0c,0x06,0x03,0x88,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x05,0x00,0x05,
-0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,
-0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,
-0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,
-0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,
-0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,
-0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,
-0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,
-0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,
-0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x04,0x00,0x05,0x00,0x04,0x00,0x04,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,
-0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,
-0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,
-0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x02,
-0x00,0x03,0x00,0x03,0x00,0x04,0x00,0x03,0x00,0x05,0x00,0x04,0x00,0x06,0x00,0x06,
-0x00,0x07,0x00,0x06,0x00,0x05,0x00,0x07,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,
-0x00,0x02,0x80,0x00,0xff,0xff,0x00,0x00,0x00,0x01,0x00,0x00,0xff,0xff,0xff,0xff,
-0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0x00,0x02,0x00,0x00,0xff,0xff,0xff,0xff,
-0x00,0x03,0x80,0x00,0xff,0xff,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xff,
-0x00,0x03,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x74,
-0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xe4,0x00,0x04,0x00,0x06,0x00,0x06,0x00,0x18,
-0x00,0x02,0x00,0x0c,0x04,0x55,0x04,0x55,0x00,0x36,0x04,0x57,0x04,0x57,0x00,0x38,
-0x04,0x5d,0x04,0x59,0x00,0x3a,0x04,0x69,0x04,0x62,0x00,0x44,0x04,0x6f,0x04,0x6b,
-0x00,0x54,0x04,0x82,0x04,0x80,0x00,0x5e,0xff,0xff,0xff,0xff,0x00,0x00,0x0b,0x74,
-0x0b,0x7a,0x0b,0x80,0x0b,0x84,0x0b,0x88,0x0b,0x8c,0x0b,0x90,0x0b,0x9c,0x0b,0xa0,
-0x0b,0xa4,0x0b,0xa8,0x0b,0xac,0x0b,0xb0,0x0b,0xb4,0x0b,0xb8,0x0b,0xbc,0x0b,0xc0,
-0x0b,0xc4,0x0b,0xc8,0x0b,0xcc,0x0c,0x03,0x0c,0x16,0x0b,0x58,0x00,0x04,0x00,0x06,
-0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x06,0x00,0x06,0x00,0x18,
-0x00,0x02,0x00,0x0c,0x04,0x55,0x04,0x55,0x00,0x36,0x04,0x57,0x04,0x57,0x00,0x38,
-0x04,0x5d,0x04,0x59,0x00,0x3a,0x04,0x69,0x04,0x62,0x00,0x44,0x04,0x6f,0x04,0x6b,
-0x00,0x54,0x04,0x82,0x04,0x80,0x00,0x5e,0xff,0xff,0xff,0xff,0x00,0x00,0x0b,0x75,
-0x0b,0x7b,0x0b,0x81,0x0b,0x85,0x0b,0x89,0x0b,0x8d,0x0b,0x91,0x0b,0x9d,0x0b,0xa1,
-0x0b,0xa5,0x0b,0xa9,0x0b,0xad,0x0b,0xb1,0x0b,0xb5,0x0b,0xb9,0x0b,0xbd,0x0b,0xc1,
-0x0b,0xc5,0x0b,0xc9,0x0b,0xcd,0x0c,0x04,0x0c,0x17,0x0b,0x59,0x00,0x04,0x00,0x06,
-0x00,0x03,0x00,0x0c,0x00,0x01,0x00,0x06,0x04,0x69,0x04,0x51,0x00,0x24,0x04,0x6f,
-0x04,0x6b,0x00,0x56,0x04,0x82,0x04,0x80,0x00,0x60,0xff,0xff,0xff,0xff,0x00,0x00,
-0x0b,0x6b,0x0b,0x6d,0x0b,0x6f,0x0b,0x71,0x0b,0x73,0x0b,0x77,0x0b,0x79,0x0b,0x7d,
-0x0b,0x7f,0x0b,0x83,0x0b,0x87,0x0b,0x8b,0x0b,0x8f,0x0b,0x93,0x0b,0x95,0x0b,0x97,
-0x0b,0x99,0x0b,0x9b,0x0b,0x9f,0x0b,0xa3,0x0b,0xa7,0x0b,0xab,0x0b,0xaf,0x0b,0xb3,
-0x0b,0xb7,0x0b,0xbb,0x0b,0xbf,0x0b,0xc3,0x0b,0xc7,0x0b,0xcb,0x0b,0x53,0x0c,0x15,
-0x0b,0x57,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x00,0x00,0x02,0x00,0x00,0x00,0x01,
-0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x78,
-0x00,0x00,0x00,0x96,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0xae,0x00,0x04,0x00,0x06,
-0x00,0x02,0x00,0x0c,0x00,0x01,0x00,0x00,0x0b,0x77,0x0b,0x77,0x00,0x1e,0x0b,0xc9,
-0x0b,0xc8,0x00,0x20,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x05,0x00,0x06,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x04,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
-0x80,0x00,0x00,0x00,0x00,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,
-0x00,0x00,0xa0,0x00,0x00,0x02,0x3f,0xff,0xf4,0x89,0xbf,0xff,0xf4,0x39,0x3f,0xff,
-0xf4,0x8b,0xbf,0xff,0xf4,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x0b,0xe4,
-0x0b,0xe5,0x00,0x00,0x00,0x00,0x18,0x40,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,
-0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x1c,0x00,0x00,0x01,0x0e,0x00,0x00,0x0f,0x82,
-0x00,0x00,0x12,0xac,0x00,0x00,0x15,0xd8,0x00,0x00,0x17,0x6e,0x00,0x04,0x00,0x06,
-0x00,0x16,0x00,0x60,0x00,0x04,0x00,0x24,0x00,0x12,0x00,0x12,0x00,0x96,0x00,0x24,
-0x00,0x24,0x00,0x98,0x00,0x2a,0x00,0x26,0x00,0x9a,0x00,0x2c,0x00,0x2c,0x00,0xa4,
-0x00,0x32,0x00,0x2f,0x00,0xa6,0x00,0x38,0x00,0x35,0x00,0xae,0x00,0x3d,0x00,0x3b,
-0x00,0xb6,0x00,0x44,0x00,0x44,0x00,0xbc,0x00,0x48,0x00,0x46,0x00,0xbe,0x00,0x4a,
-0x00,0x4a,0x00,0xc4,0x00,0x4c,0x00,0x4c,0x00,0xc6,0x00,0x4f,0x00,0x4f,0x00,0xc8,
-0x00,0x52,0x00,0x51,0x00,0xca,0x00,0x58,0x00,0x55,0x00,0xce,0x00,0x5d,0x00,0x5c,
-0x00,0xd6,0x00,0x79,0x00,0x79,0x00,0xda,0x02,0x72,0x02,0x72,0x00,0xdc,0x02,0xa6,
-0x02,0xa3,0x00,0xde,0x02,0xab,0x02,0xa9,0x00,0xe6,0x02,0xad,0x02,0xad,0x00,0xec,
-0x02,0xaf,0x02,0xaf,0x00,0xee,0x02,0xca,0x02,0xca,0x00,0xf0,0xff,0xff,0xff,0xff,
-0x00,0x00,0x00,0x04,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0a,
-0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,
-0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,
-0x00,0x1b,0x00,0x1c,0x00,0x1d,0x00,0x1e,0x00,0x1f,0x00,0x20,0x00,0x21,0x00,0x22,
-0x00,0x23,0x00,0x24,0x00,0x25,0x00,0x26,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x2a,
-0x00,0x2b,0x00,0x2c,0x00,0x2d,0x00,0x2e,0x00,0x2f,0x00,0x30,0x00,0x31,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,
-0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x00,0x00,0x09,0x00,0x0a,0x00,0x0b,
-0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x00,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,
-0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,
-0x00,0x1b,0x00,0x1c,0x00,0x1d,0x00,0x1e,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,
-0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x00,0x00,0x09,
-0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x00,0x00,0x0f,0x00,0x10,
-0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,
-0x00,0x19,0x00,0x1a,0x00,0x1b,0x00,0x1c,0x00,0x1d,0x00,0x1e,0x00,0x1f,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,
-0x00,0x00,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x00,
-0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,
-0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,0x00,0x1b,0x00,0x1c,0x00,0x1d,0x00,0x1e,
-0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x21,0x00,0x22,0x00,0x23,0x00,0x00,
-0x00,0x00,0x00,0x24,0x00,0x25,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x06,
-0x00,0x07,0x00,0x08,0x00,0x00,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,
-0x00,0x0e,0x00,0x00,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,
-0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,0x00,0x1b,0x00,0x1c,
-0x00,0x1d,0x00,0x1e,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x29,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,
-0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x00,0x00,0x09,0x00,0x0a,0x00,0x0b,
-0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x00,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,
-0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,
-0x00,0x1b,0x00,0x1c,0x00,0x1d,0x00,0x1e,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,
-0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x00,0x00,0x09,
-0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x00,0x00,0x0f,0x00,0x10,
-0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,
-0x00,0x19,0x00,0x1a,0x00,0x1b,0x00,0x1c,0x00,0x1d,0x00,0x1e,0x00,0x1f,0x00,0x00,
-0x00,0x00,0x00,0x2b,0x00,0x2c,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,
-0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x30,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,
-0x00,0x00,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x00,
-0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,
-0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,0x00,0x1b,0x00,0x1c,0x00,0x1d,0x00,0x1e,
-0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x06,
-0x00,0x07,0x00,0x08,0x00,0x00,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,
-0x00,0x0e,0x00,0x31,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,
-0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,0x00,0x1b,0x00,0x1c,
-0x00,0x1d,0x00,0x1e,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,
-0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x00,0x00,0x09,0x00,0x0a,0x00,0x0b,
-0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x00,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,
-0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,
-0x00,0x1b,0x00,0x1c,0x00,0x1d,0x00,0x1e,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,
-0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x00,0x00,0x09,
-0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x00,0x00,0x0f,0x00,0x10,
-0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,
-0x00,0x19,0x00,0x1a,0x00,0x1b,0x00,0x1c,0x00,0x1d,0x00,0x1e,0x00,0x1f,0x00,0x00,
-0x00,0x00,0x00,0x33,0x00,0x34,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x37,
-0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,
-0x00,0x00,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x00,
-0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,
-0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,0x00,0x1b,0x00,0x1c,0x00,0x1d,0x00,0x1e,
-0x00,0x1f,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x06,
-0x00,0x07,0x00,0x08,0x00,0x00,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,
-0x00,0x0e,0x00,0x00,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,
-0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,0x00,0x1b,0x00,0x1c,
-0x00,0x1d,0x00,0x1e,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,
-0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x00,0x00,0x09,0x00,0x0a,0x00,0x0b,
-0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x00,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,
-0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,
-0x00,0x1b,0x00,0x1c,0x00,0x1d,0x00,0x1e,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x3e,
-0x00,0x3f,0x00,0x40,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x43,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,
-0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x00,0x00,0x09,
-0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x00,0x00,0x0f,0x00,0x10,
-0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,
-0x00,0x19,0x00,0x1a,0x00,0x44,0x00,0x1c,0x00,0x1d,0x00,0x1e,0x00,0x1f,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,
-0x00,0x47,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x00,
-0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,
-0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,0x00,0x1b,0x00,0x1c,0x00,0x1d,0x00,0x1e,
-0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x00,0x49,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x4a,0x00,0x05,0x00,0x06,
-0x00,0x07,0x00,0x08,0x00,0x00,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,
-0x00,0x0e,0x00,0x00,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,
-0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,0x00,0x1b,0x00,0x1c,
-0x00,0x1d,0x00,0x1e,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,
-0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x4c,0x00,0x00,0x00,0x09,0x00,0x0a,0x00,0x0b,
-0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x00,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,
-0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,
-0x00,0x1b,0x00,0x1c,0x00,0x1d,0x00,0x1e,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,
-0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x00,0x00,0x09,
-0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x00,0x00,0x0f,0x00,0x10,
-0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,
-0x00,0x19,0x00,0x1a,0x00,0x1b,0x00,0x1c,0x00,0x1d,0x00,0x1e,0x00,0x1f,0x00,0x00,
-0x00,0x00,0x00,0x4d,0x00,0x4e,0x00,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,
-0x00,0x51,0x00,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,
-0x00,0x00,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x00,
-0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,
-0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,0x00,0x1b,0x00,0x1c,0x00,0x1d,0x00,0x1e,
-0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x06,
-0x00,0x07,0x00,0x08,0x00,0x00,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,
-0x00,0x0e,0x00,0x00,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,
-0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,0x00,0x1b,0x00,0x1c,
-0x00,0x1d,0x00,0x1e,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,
-0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x00,0x00,0x09,0x00,0x0a,0x00,0x0b,
-0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x00,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,
-0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,
-0x00,0x1b,0x00,0x1c,0x00,0x1d,0x00,0x1e,0x00,0x1f,0x00,0x00,0x00,0x57,0x00,0x58,
-0x00,0x59,0x00,0x5a,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x5c,0x00,0x5d,0x00,0x5e,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,
-0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x00,0x00,0x09,
-0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x00,0x00,0x0f,0x00,0x10,
-0x00,0x11,0x00,0x5f,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,
-0x00,0x19,0x00,0x1a,0x00,0x1b,0x00,0x1c,0x00,0x1d,0x00,0x1e,0x00,0x1f,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,
-0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,
-0x00,0x00,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x00,
-0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,
-0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,0x00,0x1b,0x00,0x1c,0x00,0x1d,0x00,0x1e,
-0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x06,
-0x00,0x07,0x00,0x08,0x00,0x00,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,
-0x00,0x0e,0x00,0x00,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,
-0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x64,0x00,0x1a,0x00,0x1b,0x00,0x1c,
-0x00,0x65,0x00,0x1e,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,
-0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x00,0x00,0x09,0x00,0x0a,0x00,0x0b,
-0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x00,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,
-0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,
-0x00,0x1b,0x00,0x1c,0x00,0x1d,0x00,0x1e,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,
-0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x00,0x00,0x09,
-0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x00,0x00,0x0f,0x00,0x10,
-0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,
-0x00,0x19,0x00,0x1a,0x00,0x1b,0x00,0x1c,0x00,0x1d,0x00,0x1e,0x00,0x1f,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,
-0x00,0x00,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x00,
-0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,
-0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,0x00,0x1b,0x00,0x1c,0x00,0x1d,0x00,0x1e,
-0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x06,
-0x00,0x07,0x00,0x08,0x00,0x00,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,
-0x00,0x0e,0x00,0x00,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,
-0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,0x00,0x1b,0x00,0x1c,
-0x00,0x1d,0x00,0x1e,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x69,0x00,0x6a,0x00,0x6b,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,
-0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x00,0x00,0x09,0x00,0x0a,0x00,0x0b,
-0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x00,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,
-0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,
-0x00,0x1b,0x00,0x1c,0x00,0x1d,0x00,0x1e,0x00,0x1f,0x00,0x6e,0x00,0x00,0x00,0x00,
-0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,
-0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x00,0x00,0x09,
-0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x00,0x00,0x0f,0x00,0x10,
-0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,
-0x00,0x19,0x00,0x1a,0x00,0x1b,0x00,0x1c,0x00,0x1d,0x00,0x1e,0x00,0x1f,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,
-0x00,0x00,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x00,
-0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,
-0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,0x00,0x1b,0x00,0x1c,0x00,0x1d,0x00,0x1e,
-0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x73,0x00,0x74,0x00,0x75,0x00,0x76,0x00,0x00,
-0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x06,
-0x00,0x07,0x00,0x08,0x00,0x00,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,
-0x00,0x0e,0x00,0x00,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,
-0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,0x00,0x1b,0x00,0x1c,
-0x00,0x1d,0x00,0x1e,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,
-0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x00,0x00,0x09,0x00,0x0a,0x00,0x0b,
-0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x00,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,
-0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,
-0x00,0x1b,0x00,0x1c,0x00,0x1d,0x00,0x1e,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,
-0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,
-0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x00,0x00,0x09,
-0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x00,0x00,0x0f,0x00,0x10,
-0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,
-0x00,0x19,0x00,0x1a,0x00,0x1b,0x00,0x1c,0x00,0x1d,0x00,0x1e,0x00,0x1f,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,
-0x00,0x00,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x00,
-0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,
-0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,0x00,0x1b,0x00,0x1c,0x00,0x1d,0x00,0x1e,
-0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x7f,0x00,0x80,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x81,0x00,0x82,0x00,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x06,
-0x00,0x07,0x00,0x08,0x00,0x00,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,
-0x00,0x0e,0x00,0x00,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,
-0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,0x00,0x1b,0x00,0x1c,
-0x00,0x1d,0x00,0x1e,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,
-0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x00,0x00,0x09,0x00,0x0a,0x00,0x0b,
-0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x00,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,
-0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,
-0x00,0x1b,0x00,0x1c,0x00,0x1d,0x00,0x1e,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x80,0x00,0x00,0x00,0x00,0x03,
-0x80,0x00,0x00,0x00,0x00,0x04,0x80,0x00,0x00,0x00,0x00,0x05,0x80,0x00,0x00,0x00,
-0x00,0x06,0x80,0x00,0x00,0x00,0x00,0x08,0x80,0x00,0x00,0x00,0x00,0x09,0x80,0x00,
-0x00,0x00,0x00,0x0a,0x80,0x00,0x00,0x00,0x00,0x0b,0x80,0x00,0x00,0x00,0x00,0x0c,
-0x80,0x00,0x00,0x00,0x00,0x0d,0x80,0x00,0x00,0x00,0x00,0x0e,0x80,0x00,0x00,0x00,
-0x00,0x0f,0x80,0x00,0x00,0x00,0x00,0x11,0x80,0x00,0x00,0x00,0x00,0x12,0x80,0x00,
-0x00,0x00,0x00,0x13,0x80,0x00,0x00,0x00,0x00,0x14,0x80,0x00,0x00,0x00,0x00,0x16,
-0x80,0x00,0x00,0x00,0x00,0x18,0x80,0x00,0x00,0x00,0x00,0x19,0x80,0x00,0x00,0x00,
-0x00,0x1a,0x80,0x00,0x00,0x00,0x00,0x1b,0x80,0x00,0x00,0x00,0x00,0x1c,0x80,0x00,
-0x00,0x00,0x00,0x1d,0x80,0x00,0x00,0x00,0x00,0x1e,0x80,0x00,0x00,0x00,0x00,0x1f,
-0x80,0x00,0x00,0x00,0x00,0x20,0x80,0x00,0x00,0x00,0x00,0x21,0x80,0x00,0x00,0x00,
-0x00,0x22,0x80,0x00,0x00,0x00,0x00,0x23,0x80,0x00,0x00,0x00,0x00,0x24,0x80,0x00,
-0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x02,0x00,0x00,
-0xa0,0x00,0x00,0x04,0x00,0x00,0xa0,0x00,0x00,0x06,0x00,0x00,0xa0,0x00,0x00,0x08,
-0x00,0x00,0xa0,0x00,0x00,0x0a,0x00,0x00,0xa0,0x00,0x00,0x0c,0x00,0x00,0xa0,0x00,
-0x00,0x0e,0x00,0x00,0xa0,0x00,0x00,0x10,0x00,0x00,0xa0,0x00,0x00,0x12,0x00,0x00,
-0xa0,0x00,0x00,0x14,0x00,0x00,0xa0,0x00,0x00,0x16,0x00,0x00,0xa0,0x00,0x00,0x18,
-0x00,0x00,0xa0,0x00,0x00,0x1a,0x00,0x00,0xa0,0x00,0x00,0x1c,0x00,0x00,0xa0,0x00,
-0x00,0x1e,0x00,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x20,0x00,0x00,
-0xa0,0x00,0x00,0x23,0x00,0x00,0xa0,0x00,0x00,0x25,0x00,0x00,0xa0,0x00,0x00,0x27,
-0x00,0x00,0xa0,0x00,0x00,0x29,0x00,0x00,0xa0,0x00,0x00,0x2b,0x00,0x00,0xa0,0x00,
-0x00,0x2d,0x00,0x00,0xa0,0x00,0x00,0x2f,0x00,0x00,0xa0,0x00,0x00,0x31,0x00,0x00,
-0xa0,0x00,0x00,0x33,0x00,0x00,0xa0,0x00,0x00,0x35,0x00,0x00,0xa0,0x00,0x00,0x37,
-0x00,0x00,0xa0,0x00,0x00,0x39,0x00,0x00,0xa0,0x00,0x00,0x3b,0x00,0x00,0xa0,0x00,
-0x00,0x3d,0x00,0x00,0xa0,0x00,0x00,0x3f,0x00,0x00,0xa0,0x00,0x00,0x41,0x00,0x00,
-0xa0,0x00,0x00,0x43,0x00,0x00,0xa0,0x00,0x00,0x45,0x00,0x00,0xa0,0x00,0x00,0x47,
-0x00,0x00,0xa0,0x00,0x00,0x49,0x00,0x00,0xa0,0x00,0x00,0x4b,0x00,0x00,0xa0,0x00,
-0x00,0x4d,0x00,0x00,0xa0,0x00,0x00,0x4f,0x00,0x00,0xa0,0x00,0x00,0x51,0x00,0x10,
-0x80,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x53,0x00,0x00,0xa0,0x00,0x00,0x55,
-0x00,0x00,0xa0,0x00,0x00,0x58,0x00,0x00,0xa0,0x00,0x00,0x5a,0x00,0x00,0xa0,0x00,
-0x00,0x5c,0x00,0x00,0xa0,0x00,0x00,0x5e,0x00,0x00,0xa0,0x00,0x00,0x60,0x00,0x00,
-0xa0,0x00,0x00,0x62,0x00,0x00,0xa0,0x00,0x00,0x64,0x00,0x00,0xa0,0x00,0x00,0x66,
-0x00,0x00,0xa0,0x00,0x00,0x68,0x00,0x15,0x80,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,
-0x00,0x6a,0x00,0x00,0xa0,0x00,0x00,0x6c,0x00,0x00,0xa0,0x00,0x00,0x6e,0x00,0x00,
-0xa0,0x00,0x00,0x70,0x00,0x00,0xa0,0x00,0x00,0x72,0x00,0x00,0xa0,0x00,0x00,0x74,
-0x00,0x00,0xa0,0x00,0x00,0x76,0x00,0x00,0xa0,0x00,0x00,0x78,0x00,0x00,0xa0,0x00,
-0x00,0x7a,0x00,0x17,0x80,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x7d,0x00,0x00,
-0xa0,0x00,0x00,0x7f,0x00,0x00,0xa0,0x00,0x00,0x81,0x00,0x00,0xa0,0x00,0x00,0x83,
-0x00,0x00,0xa0,0x00,0x00,0x86,0x00,0x00,0xa0,0x00,0x00,0x89,0x00,0x00,0xa0,0x00,
-0x00,0x8b,0x00,0x00,0xa0,0x00,0x00,0x8d,0x00,0x00,0xa0,0x00,0x00,0x8f,0x00,0x00,
-0xa0,0x00,0x00,0x91,0x00,0x00,0xa0,0x00,0x00,0x93,0x00,0x00,0xa0,0x00,0x00,0x95,
-0x00,0x00,0xa0,0x00,0x00,0x97,0x00,0x00,0xa0,0x00,0x00,0x99,0x00,0x00,0xa0,0x00,
-0x00,0x9b,0x00,0x00,0xa0,0x00,0x00,0x9d,0x00,0x00,0xa0,0x00,0x00,0x9f,0x00,0x00,
-0xa0,0x00,0x00,0xa1,0x00,0x00,0xa0,0x00,0x00,0xa3,0x00,0x00,0xa0,0x00,0x00,0xa5,
-0x00,0x00,0xa0,0x00,0x00,0xa7,0x00,0x00,0xa0,0x00,0x00,0xa9,0x00,0x00,0xa0,0x00,
-0x00,0xab,0x00,0x00,0xa0,0x00,0x00,0xad,0x00,0x00,0xa0,0x00,0x00,0xaf,0x00,0x00,
-0xa0,0x00,0x00,0xb1,0x00,0x00,0xa0,0x00,0x00,0xb3,0x00,0x00,0xa0,0x00,0x00,0xb5,
-0x00,0x00,0xa0,0x00,0x00,0xb7,0x00,0x00,0xa0,0x00,0x00,0xb9,0x00,0x00,0xa0,0x00,
-0x00,0xbb,0x00,0x00,0xa0,0x00,0x00,0xbd,0x00,0x00,0xa0,0x00,0x00,0xbf,0x00,0x00,
-0xa0,0x00,0x00,0xc1,0x00,0x00,0xa0,0x00,0x00,0xc3,0x00,0x00,0xa0,0x00,0x00,0xc5,
-0x00,0x00,0xa0,0x00,0x00,0xc7,0x00,0x00,0xa0,0x00,0x00,0xc9,0x3f,0xff,0xfd,0x5d,
-0xbf,0xff,0xff,0xdd,0x3f,0xff,0xfd,0x5e,0xbf,0xff,0xff,0xdf,0x3f,0xff,0xfd,0x5f,
-0xbf,0xff,0xff,0xe1,0x3f,0xff,0xfd,0x60,0xbf,0xff,0xff,0xe3,0x3f,0xff,0xfd,0x5d,
-0xbf,0xff,0xff,0xe5,0x3f,0xff,0xfd,0x5d,0xbf,0xff,0xff,0xe7,0x3f,0xff,0xfd,0x5d,
-0xbf,0xff,0xff,0xe9,0x3f,0xff,0xfd,0x6a,0xbf,0xff,0xff,0xe9,0x3f,0xff,0xfd,0x61,
-0xbf,0xff,0xff,0xeb,0x3f,0xff,0xfd,0x48,0xbf,0xff,0xff,0xed,0x3f,0xff,0xfd,0x65,
-0xbf,0xff,0xff,0xee,0x3f,0xff,0xfd,0x73,0xbf,0xff,0xff,0xef,0x3f,0xff,0xfd,0x74,
-0xbf,0xff,0xff,0xf1,0x3f,0xff,0xfd,0x75,0xbf,0xff,0xff,0xf3,0x3f,0xff,0xfd,0x71,
-0xbf,0xff,0xff,0xf5,0x3f,0xff,0xfd,0x6f,0xbf,0xff,0xff,0xf7,0x3f,0xff,0xff,0xe5,
-0x3f,0xff,0xff,0xfd,0xbf,0xff,0xff,0xf9,0x3f,0xff,0xfd,0x7a,0xbf,0xff,0xff,0xfa,
-0x3f,0xff,0xfd,0x82,0xbf,0xff,0xff,0xfa,0x3f,0xff,0xfd,0x83,0xbf,0xff,0xff,0xfc,
-0x3f,0xff,0xfd,0x84,0xbf,0xff,0xff,0xfe,0x3f,0xff,0xfd,0x81,0x80,0x00,0x00,0x00,
-0x3f,0xff,0xfd,0x82,0x80,0x00,0x00,0x02,0x3f,0xff,0xfd,0x80,0x80,0x00,0x00,0x04,
-0x3f,0xff,0xff,0xb8,0x80,0x00,0x00,0x03,0x3f,0xff,0xfd,0x8f,0x80,0x00,0x00,0x05,
-0x3f,0xff,0xfd,0x86,0x80,0x00,0x00,0x07,0x3f,0xff,0xfd,0x91,0x80,0x00,0x00,0x07,
-0x3f,0xff,0xfd,0x8a,0x80,0x00,0x00,0x09,0x3f,0xff,0xfd,0x98,0x80,0x00,0x00,0x0a,
-0x3f,0xff,0xfd,0x99,0x80,0x00,0x00,0x0c,0x3f,0xff,0xfd,0x9a,0x80,0x00,0x00,0x0e,
-0x3f,0xff,0xfd,0x9b,0x80,0x00,0x00,0x10,0x3f,0xff,0xfd,0x98,0x80,0x00,0x00,0x12,
-0x3f,0xff,0xfd,0x96,0x80,0x00,0x00,0x14,0x3f,0xff,0xff,0xf1,0x80,0x00,0x00,0x13,
-0x3f,0xff,0xfd,0xa5,0x80,0x00,0x00,0x15,0x3f,0xff,0xfd,0x9c,0x80,0x00,0x00,0x17,
-0x00,0x00,0x00,0x1d,0x80,0x00,0x00,0x18,0x3f,0xff,0xfd,0xa0,0x80,0x00,0x00,0x1a,
-0x3f,0xff,0xfd,0x87,0x80,0x00,0x00,0x1c,0x3f,0xff,0xfd,0xa4,0x80,0x00,0x00,0x1d,
-0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x2e,0x80,0x00,0x00,0x20,0x3f,0xff,0xfd,0xb5,
-0x80,0x00,0x00,0x21,0x3f,0xff,0xfd,0xb6,0x80,0x00,0x00,0x23,0x3f,0xff,0xfd,0xb7,
-0x80,0x00,0x00,0x25,0x3f,0xff,0xfd,0xb3,0x80,0x00,0x00,0x27,0x3f,0xff,0xfd,0xb3,
-0x80,0x00,0x00,0x29,0x3f,0xff,0xfd,0xb3,0x80,0x00,0x00,0x2b,0x3f,0xff,0xfd,0xc0,
-0x80,0x00,0x00,0x29,0x3f,0xff,0xfd,0xbb,0x80,0x00,0x00,0x2b,0x3f,0xff,0xfd,0xb9,
-0x80,0x00,0x00,0x2c,0x3f,0xff,0xfd,0xf8,0x80,0x00,0x00,0x27,0x3f,0xff,0xfd,0xc9,
-0x80,0x00,0x00,0x29,0x3f,0xff,0xfd,0xca,0x80,0x00,0x00,0x2b,0x3f,0xff,0xfd,0xcb,
-0x80,0x00,0x00,0x2d,0x3f,0xff,0xfd,0xcc,0x80,0x00,0x00,0x2f,0x3f,0xff,0xfd,0xc9,
-0x80,0x00,0x00,0x31,0x3f,0xff,0xfd,0xc9,0x80,0x00,0x00,0x33,0x3f,0xff,0xfd,0xc9,
-0x80,0x00,0x00,0x35,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x69,0x80,0x00,0x00,0x38,
-0x3f,0xff,0xfd,0xd9,0x80,0x00,0x00,0x38,0x3f,0xff,0xfd,0xd0,0x80,0x00,0x00,0x3a,
-0x3f,0xff,0xfd,0xb7,0x80,0x00,0x00,0x3c,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x72,
-0x80,0x00,0x00,0x3f,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x75,0x80,0x00,0x00,0x42,
-0x3f,0xff,0xfd,0xda,0x80,0x00,0x00,0x43,0x3f,0xff,0xfd,0xdc,0x80,0x00,0x00,0x44,
-0x3f,0xff,0xfd,0xe4,0x80,0x00,0x00,0x44,0x3f,0xff,0xfd,0xec,0x80,0x00,0x00,0x44,
-0x3f,0xff,0xfd,0xed,0x80,0x00,0x00,0x46,0x3f,0xff,0xfd,0xee,0x80,0x00,0x00,0x48,
-0x3f,0xff,0xfd,0xea,0x80,0x00,0x00,0x4a,0x3f,0xff,0xfd,0xe8,0x80,0x00,0x00,0x4c,
-0x00,0x00,0x00,0x20,0x80,0x00,0x00,0x4b,0x3f,0xff,0xfd,0xf7,0x80,0x00,0x00,0x4d,
-0x3f,0xff,0xfd,0xee,0x80,0x00,0x00,0x4f,0x3f,0xff,0xfd,0xf9,0x80,0x00,0x00,0x4f,
-0x3f,0xff,0xfd,0xf2,0x80,0x00,0x00,0x51,0x3f,0xff,0xfe,0x00,0x80,0x00,0x00,0x52,
-0x3f,0xff,0xfe,0x01,0x80,0x00,0x00,0x54,0x3f,0xff,0xfe,0x02,0x80,0x00,0x00,0x56,
-0x3f,0xff,0xfe,0x03,0x80,0x00,0x00,0x58,0x3f,0xff,0xfe,0x00,0x80,0x00,0x00,0x5a,
-0x3f,0xff,0xfd,0xfe,0x80,0x00,0x00,0x5c,0x3f,0xff,0xfe,0x0b,0x80,0x00,0x00,0x5b,
-0x3f,0xff,0xfe,0x02,0x80,0x00,0x00,0x5d,0x3f,0xff,0xfe,0x04,0x80,0x00,0x00,0x5e,
-0x3f,0xff,0xfd,0xeb,0x80,0x00,0x00,0x60,0x3f,0xff,0xfe,0x08,0x80,0x00,0x00,0x61,
-0x3f,0xff,0xfe,0x16,0x80,0x00,0x00,0x62,0x3f,0xff,0xfe,0x17,0x80,0x00,0x00,0x64,
-0x3f,0xff,0xfe,0x18,0x80,0x00,0x00,0x66,0x3f,0xff,0xfe,0x14,0x80,0x00,0x00,0x68,
-0x3f,0xff,0xfe,0x14,0x80,0x00,0x00,0x6a,0x3f,0xff,0xfe,0x14,0x80,0x00,0x00,0x6c,
-0x3f,0xff,0xfe,0x21,0x80,0x00,0x00,0x6a,0x3f,0xff,0xfe,0x1c,0x80,0x00,0x00,0x6c,
-0x3f,0xff,0xfe,0x1a,0x80,0x00,0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
-0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x05,
-0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x09,
-0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x0d,
-0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,
-0x00,0x11,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x14,0x00,0x00,
-0x00,0x15,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x18,0x00,0x00,
-0x00,0x19,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x1c,0x00,0x00,
-0x00,0x1d,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x20,0x00,0x00,
-0x00,0x21,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x24,0x00,0x00,
-0x00,0x25,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x28,0x00,0x00,
-0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x2c,
-0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x30,
-0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x34,
-0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x38,
-0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x00,
-0x00,0x3c,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x3f,0x00,0x00,
-0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x42,0x00,0x00,
-0x00,0x43,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x46,0x00,0x00,
-0x00,0x47,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x4a,0x00,0x00,
-0x00,0x4b,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x4e,0x00,0x00,
-0x00,0x4f,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x52,0x00,0x00,
-0x00,0x53,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x56,0x00,0x00,
-0x00,0x57,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x5a,0x00,0x00,
-0x00,0x5b,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x5e,0x00,0x00,
-0x00,0x5f,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x62,0x00,0x82,
-0x00,0x83,0x00,0x84,0x00,0x85,0x00,0x86,0x00,0x87,0x01,0x8f,0x00,0xc8,0x00,0xce,
-0x00,0x89,0x00,0xd0,0x00,0x8a,0x00,0x8b,0x00,0x8c,0x00,0x8d,0x00,0xdc,0x08,0x03,
-0x00,0xe0,0x00,0x8e,0x00,0x8f,0x00,0x90,0x00,0xf2,0x00,0x91,0x01,0x91,0x01,0x01,
-0x00,0xfb,0x00,0xff,0x00,0x93,0x01,0x09,0x00,0x94,0x00,0x95,0x00,0x96,0x00,0x97,
-0x00,0x98,0x01,0x93,0x07,0xdd,0x01,0x16,0x01,0x1a,0x07,0xf8,0x01,0x22,0x01,0x20,
-0x01,0x26,0x07,0xf9,0x00,0x9b,0x00,0x9c,0x00,0x9d,0x00,0x9e,0x01,0x30,0x01,0x95,
-0x00,0x9f,0x01,0x3a,0x01,0x3f,0x06,0x21,0x00,0xa2,0x00,0xa3,0x00,0xa4,0x00,0xa5,
-0x00,0xa6,0x00,0xa7,0x01,0x90,0x07,0xe8,0x00,0xc9,0x00,0xcf,0x00,0xa9,0x07,0xeb,
-0x07,0xec,0x00,0xd1,0x00,0xdd,0x00,0xe1,0x00,0xae,0x00,0xaf,0x00,0xb0,0x00,0xb1,
-0x01,0x92,0x01,0x02,0x00,0xfc,0x01,0x00,0x00,0xb3,0x01,0x0a,0x00,0xb4,0x00,0xb5,
-0x00,0xb6,0x00,0xb7,0x00,0xb8,0x01,0x94,0x01,0x17,0x01,0x1b,0x01,0x23,0x01,0x21,
-0x01,0x27,0x00,0xbb,0x00,0xbc,0x00,0xbd,0x00,0xbe,0x01,0x31,0x01,0x96,0x00,0xbf,
-0x00,0xc1,0x01,0x40,0x00,0x00,0x07,0x4c,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,
-0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0xd0,0x00,0x00,0x04,0x88,
-0x00,0x00,0x05,0x8a,0x00,0x00,0x06,0x86,0x00,0x00,0x07,0x04,0x00,0x04,0x00,0x06,
-0x00,0x11,0x00,0x60,0x00,0x04,0x00,0x06,0x00,0x04,0x00,0x03,0x00,0x78,0x00,0x11,
-0x00,0x11,0x00,0x7c,0x00,0x20,0x00,0x20,0x00,0x7e,0x00,0x22,0x00,0x22,0x00,0x80,
-0x00,0x29,0x00,0x29,0x00,0x82,0x00,0x51,0x00,0x51,0x00,0x84,0x00,0x72,0x00,0x72,
-0x00,0x86,0x02,0x70,0x02,0x70,0x00,0x88,0x02,0xa4,0x02,0xa4,0x00,0x8a,0x02,0xa7,
-0x02,0xa6,0x00,0x8c,0x02,0xab,0x02,0xa9,0x00,0x90,0x02,0xae,0x02,0xad,0x00,0x96,
-0x02,0xcb,0x02,0xca,0x00,0x9a,0x02,0xdb,0x02,0xdb,0x00,0x9e,0x05,0x06,0x04,0xff,
-0x00,0xa0,0x07,0x8b,0x07,0x8b,0x00,0xb0,0x07,0x8e,0x07,0x8e,0x00,0xb2,0xff,0xff,
-0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x09,
-0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x0f,0x00,0x10,0x00,0x11,
-0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,
-0x00,0x1a,0x00,0x1b,0x00,0x1c,0x00,0x1d,0x00,0x1e,0x00,0x1f,0x00,0x20,0x00,0x21,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,
-0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x08,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,
-0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x07,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x06,
-0x00,0x07,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x0f,0x00,0x10,
-0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x00,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,
-0x00,0x18,0x00,0x19,0x00,0x1a,0x00,0x1b,0x00,0x08,0x00,0x09,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x1c,0x00,0x03,0x00,0x04,0x00,0x1d,0x00,0x00,
-0x00,0x00,0x00,0x06,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x09,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x1e,0x00,0x04,
-0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x08,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,
-0x00,0x1f,0x00,0x04,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x07,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x06,
-0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x09,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x21,0x00,0x03,0x00,0x04,0x00,0x22,0x00,0x00,
-0x00,0x00,0x00,0x06,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x09,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,
-0x00,0x05,0x00,0x23,0x00,0x00,0x00,0x06,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x08,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,
-0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x00,0x00,0x24,0x00,0x06,0x00,0x07,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x06,
-0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x00,0x09,0x00,0x26,0x00,0x26,
-0x00,0x26,0x00,0x26,0x00,0x26,0x00,0x26,0x00,0x26,0x00,0x26,0x00,0x26,0x00,0x26,
-0x00,0x26,0x00,0x26,0x00,0x26,0x00,0x26,0x00,0x26,0x00,0x26,0x00,0x26,0x00,0x26,
-0x00,0x26,0x00,0x26,0x00,0x26,0x00,0x26,0x00,0x26,0x00,0x26,0x00,0x26,0x00,0x26,
-0x00,0x26,0x00,0x26,0x00,0x26,0x00,0x26,0x00,0x26,0x00,0x26,0x00,0x27,0x00,0x26,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,
-0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x08,0x00,0x28,0x00,0x29,0x00,0x29,0x00,0x29,0x00,0x29,0x00,0x29,0x00,0x29,
-0x00,0x29,0x00,0x29,0x00,0x29,0x00,0x29,0x00,0x29,0x00,0x29,0x00,0x29,0x00,0x29,
-0x00,0x29,0x00,0x29,0x00,0x29,0x00,0x29,0x00,0x29,0x00,0x29,0x00,0x29,0x00,0x29,
-0x00,0x29,0x00,0x29,0x00,0x29,0x00,0x29,0x00,0x29,0x00,0x29,0x00,0x29,0x00,0x29,
-0x00,0x29,0x00,0x29,0x00,0x29,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
-0x80,0x00,0x00,0x00,0x00,0x03,0x80,0x00,0x00,0x00,0x00,0x04,0x80,0x00,0x00,0x00,
-0x00,0x06,0x80,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0x00,0x08,0x80,0x00,
-0x00,0x00,0x00,0x09,0x80,0x00,0x00,0x00,0x00,0x0a,0x80,0x00,0x00,0x00,0x00,0x0c,
-0x80,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x02,
-0x00,0x00,0xa0,0x00,0x00,0x04,0x00,0x00,0xa0,0x00,0x00,0x06,0x00,0x00,0xa0,0x00,
-0x00,0x08,0x00,0x00,0xa0,0x00,0x00,0x0a,0x00,0x00,0xa0,0x00,0x00,0x0c,0x00,0x00,
-0xa0,0x00,0x00,0x0e,0x00,0x00,0xa0,0x00,0x00,0x10,0x00,0x00,0xa0,0x00,0x00,0x12,
-0x00,0x00,0xa0,0x00,0x00,0x14,0x00,0x00,0xa0,0x00,0x00,0x16,0x00,0x00,0xa0,0x00,
-0x00,0x18,0x00,0x00,0xa0,0x00,0x00,0x1a,0x00,0x00,0xa0,0x00,0x00,0x1c,0x00,0x00,
-0xa0,0x00,0x00,0x1e,0x00,0x00,0xa0,0x00,0x00,0x20,0x00,0x00,0xa0,0x00,0x00,0x22,
-0x00,0x00,0xa0,0x00,0x00,0x24,0x00,0x00,0xa0,0x00,0x00,0x26,0x00,0x05,0x80,0x00,
-0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x28,0x00,0x00,0xa0,0x00,0x00,0x2b,0x00,0x00,
-0xa0,0x00,0x00,0x2d,0x00,0x00,0xa0,0x00,0x00,0x2f,0x00,0x00,0xa0,0x00,0x00,0x31,
-0x00,0x00,0xa0,0x00,0x00,0x33,0x00,0x0b,0x80,0x00,0x00,0x00,0x00,0x00,0x60,0x00,
-0x00,0x35,0x00,0x00,0xa0,0x00,0x00,0x37,0x00,0x0d,0x80,0x00,0x00,0x00,0x00,0x00,
-0x60,0x00,0x00,0x3a,0x00,0x00,0xa0,0x00,0x00,0x3c,0x3f,0xff,0xfd,0x5c,0xbf,0xff,
-0xff,0xfe,0x3f,0xff,0xfd,0x5c,0x80,0x00,0x00,0x00,0x3f,0xff,0xfd,0x5d,0x80,0x00,
-0x00,0x02,0x3f,0xff,0xfd,0x5d,0x80,0x00,0x00,0x04,0x3f,0xff,0xfd,0x5e,0x80,0x00,
-0x00,0x06,0x3f,0xff,0xfd,0x5f,0x80,0x00,0x00,0x08,0x3f,0xff,0xfd,0x5f,0x80,0x00,
-0x00,0x0a,0x3f,0xff,0xfd,0x60,0x80,0x00,0x00,0x0c,0x3f,0xff,0xfd,0x46,0x80,0x00,
-0x00,0x0e,0x3f,0xff,0xfd,0x47,0x80,0x00,0x00,0x10,0x3f,0xff,0xfb,0x15,0x80,0x00,
-0x00,0x12,0x3f,0xff,0xfb,0x16,0x80,0x00,0x00,0x14,0x3f,0xff,0xfb,0x17,0x80,0x00,
-0x00,0x16,0x3f,0xff,0xfb,0x18,0x80,0x00,0x00,0x18,0x3f,0xff,0xfb,0x19,0x80,0x00,
-0x00,0x1a,0x3f,0xff,0xfb,0x1a,0x80,0x00,0x00,0x1c,0x3f,0xff,0xfb,0x1b,0x80,0x00,
-0x00,0x1e,0x3f,0xff,0xfb,0x1c,0x80,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x80,0x00,
-0x00,0x21,0x00,0x00,0x00,0x04,0x80,0x00,0x00,0x23,0x00,0x00,0x00,0x17,0x00,0x00,
-0x00,0x18,0x80,0x00,0x00,0x19,0x3f,0xff,0xfd,0x50,0x80,0x00,0x00,0x0c,0x00,0x00,
-0x00,0x29,0x80,0x00,0x00,0x0c,0x00,0x00,0x00,0x0d,0x80,0x00,0x00,0x0e,0x00,0x00,
-0x00,0x08,0xbf,0xff,0xff,0xc0,0x3f,0xff,0xff,0xe2,0xbf,0xff,0xfd,0xc4,0x3f,0xff,
-0xf8,0xaa,0xbf,0xff,0xf8,0xab,0x3f,0xff,0xf8,0xac,0x3f,0xff,0xf8,0xad,0xbf,0xff,
-0xf8,0xae,0x3f,0xff,0xf8,0xac,0xbf,0xff,0xf8,0xad,0x3f,0xff,0xf8,0xae,0x3f,0xff,
-0xf8,0xaf,0xbf,0xff,0xf8,0xb0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,
-0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x05,0x00,0x00,
-0x00,0x06,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x09,0x00,0x00,
-0x00,0x0a,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x0d,0x00,0x00,
-0x00,0x0e,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x11,0x00,0x00,
-0x00,0x12,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x15,
-0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x19,
-0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x1c,0x00,0x00,
-0x00,0x00,0x00,0x1d,0x00,0x76,0x02,0x90,0x00,0x71,0x02,0x8c,0x02,0x8d,0x00,0x6a,
-0x02,0x8e,0x02,0x91,0x00,0x7a,0x02,0x8f,0x0b,0x5a,0x0b,0x5c,0x0b,0x5e,0x0b,0x5f,
-0x0b,0x61,0x0b,0x63,0x0b,0x65,0x0b,0x67,0x07,0x95,0x07,0xa2,0x07,0x87,0x08,0xc8,
-0x07,0xa1,0x07,0xa0,0x07,0xed,0x01,0x0b,0x07,0x8c,0x07,0x8d,0x07,0x8f,0x07,0x90,
-0x00,0x00,0x03,0x74,0x40,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x16,
-0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x88,0x00,0x00,0x01,0xe8,0x00,0x00,0x02,0x78,
-0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x44,0x00,0x04,0x00,0x06,0x00,0x09,0x00,0x30,
-0x00,0x03,0x00,0x06,0x04,0xe0,0x04,0xe0,0x00,0x48,0x04,0xf4,0x04,0xf4,0x00,0x4a,
-0x04,0xfc,0x04,0xfc,0x00,0x4c,0x04,0xff,0x04,0xfe,0x00,0x4e,0x05,0x09,0x05,0x02,
-0x00,0x52,0x0b,0x6b,0x0b,0x6b,0x00,0x62,0x0b,0x6d,0x0b,0x6d,0x00,0x64,0x0b,0x71,
-0x0b,0x71,0x00,0x66,0x0b,0xc9,0x0b,0xc8,0x00,0x68,0xff,0xff,0xff,0xff,0x00,0x00,
-0x00,0x04,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0b,
-0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,
-0x00,0x14,0x00,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,
-0x00,0x03,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x06,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x06,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,
-0x00,0x0e,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x05,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,
-0x00,0x03,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x06,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x06,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,
-0x00,0x13,0x00,0x14,0x00,0x05,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x00,0x16,0x00,0x17,
-0x00,0x05,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x80,0x00,0x00,0x00,
-0x00,0x03,0x80,0x00,0x00,0x00,0x00,0x04,0x80,0x00,0x00,0x00,0x00,0x05,0x80,0x00,
-0x00,0x00,0x00,0x06,0x80,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0x00,0x00,
-0xa0,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x02,0x00,0x00,0xa0,0x00,0x00,0x04,
-0x00,0x00,0xa0,0x00,0x00,0x06,0x00,0x00,0xa0,0x00,0x00,0x08,0x00,0x00,0xa0,0x00,
-0x00,0x0a,0x00,0x00,0xa0,0x00,0x00,0x0c,0x00,0x00,0xa0,0x00,0x00,0x0e,0x00,0x00,
-0xa0,0x00,0x00,0x10,0x00,0x00,0xa0,0x00,0x00,0x12,0x00,0x00,0xa0,0x00,0x00,0x14,
-0x00,0x00,0xa0,0x00,0x00,0x16,0x00,0x00,0xa0,0x00,0x00,0x18,0x00,0x00,0xa0,0x00,
-0x00,0x1a,0x00,0x00,0xa0,0x00,0x00,0x1c,0x00,0x00,0xa0,0x00,0x00,0x1e,0x00,0x00,
-0xa0,0x00,0x00,0x20,0x3f,0xff,0xfa,0xf9,0xbf,0xff,0xfb,0x21,0x3f,0xff,0xfa,0xfa,
-0xbf,0xff,0xfb,0x23,0x3f,0xff,0xfa,0xfb,0xbf,0xff,0xfb,0x25,0x3f,0xff,0xfb,0x07,
-0xbf,0xff,0xfb,0x13,0x3f,0xff,0xfb,0x06,0xbf,0xff,0xfb,0x15,0x3f,0xff,0xfb,0x07,
-0xbf,0xff,0xfb,0x17,0x3f,0xff,0xfb,0x08,0xbf,0xff,0xfb,0x19,0x3f,0xff,0xfb,0x09,
-0xbf,0xff,0xfb,0x1b,0x3f,0xff,0xfb,0x0a,0xbf,0xff,0xfb,0x1d,0x3f,0xff,0xfb,0x0a,
-0xbf,0xff,0xfb,0x17,0x3f,0xff,0xfb,0x0c,0xbf,0xff,0xfb,0x17,0x3f,0xff,0xf4,0xab,
-0xbf,0xff,0xf4,0x4f,0x3f,0xff,0xf4,0xab,0xbf,0xff,0xf4,0x51,0x3f,0xff,0xf4,0xa9,
-0xbf,0xff,0xf4,0x53,0x3f,0xff,0xf4,0xb1,0xbf,0xff,0xf4,0x54,0x3f,0xff,0xf4,0xb1,
-0xbf,0xff,0xf4,0x56,0x3f,0xff,0xf4,0xaf,0xbf,0xff,0xf4,0x58,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x04,
-0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x08,
-0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x0c,
-0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x10,
-0x04,0xdb,0x04,0xdc,0x04,0xde,0x0b,0x5b,0x0b,0x60,0x0b,0x62,0x0b,0x64,0x0b,0x66,
-0x0b,0x68,0x04,0xdd,0x04,0xdf,0x0b,0xde,0x0b,0xe0,0x0b,0xe2,0x0b,0xdf,0x0b,0xe1,
-0x0b,0xe3,0x00,0x00,0x00,0x00,0x02,0x88,0x40,0x00,0x00,0x02,0x00,0x00,0x00,0x02,
-0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x7e,0x00,0x00,0x01,0x08,
-0x00,0x00,0x01,0x80,0x00,0x00,0x02,0x10,0x00,0x00,0x02,0x58,0x00,0x04,0x00,0x06,
-0x00,0x07,0x00,0x18,0x00,0x02,0x00,0x12,0x00,0x03,0x00,0x03,0x00,0x3c,0x02,0xa4,
-0x02,0xa4,0x00,0x3e,0x02,0xa7,0x02,0xa6,0x00,0x40,0x02,0xab,0x02,0xa9,0x00,0x44,
-0x02,0xae,0x02,0xad,0x00,0x4a,0x02,0xcb,0x02,0xca,0x00,0x4e,0x05,0x06,0x04,0xff,
-0x00,0x52,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x05,0x00,0x06,0x00,0x07,
-0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x0f,
-0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x06,0x00,0x07,
-0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x0f,
-0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
-0x80,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x02,
-0x00,0x00,0xa0,0x00,0x00,0x04,0x00,0x00,0xa0,0x00,0x00,0x06,0x00,0x00,0xa0,0x00,
-0x00,0x08,0x00,0x00,0xa0,0x00,0x00,0x0a,0x00,0x00,0xa0,0x00,0x00,0x0c,0x00,0x00,
-0xa0,0x00,0x00,0x0e,0x00,0x00,0xa0,0x00,0x00,0x10,0x00,0x00,0xa0,0x00,0x00,0x12,
-0x00,0x00,0xa0,0x00,0x00,0x14,0x00,0x00,0xa0,0x00,0x00,0x16,0x00,0x00,0xa0,0x00,
-0x00,0x18,0x00,0x00,0xa0,0x00,0x00,0x1a,0x00,0x00,0xa0,0x00,0x00,0x1c,0x00,0x00,
-0xa0,0x00,0x00,0x1e,0x00,0x00,0xa0,0x00,0x00,0x20,0x00,0x00,0xa0,0x00,0x00,0x22,
-0x3f,0xff,0xfd,0x5c,0xbf,0xff,0xff,0xfe,0x3f,0xff,0xfd,0x5c,0x80,0x00,0x00,0x00,
-0x3f,0xff,0xfd,0x5d,0x80,0x00,0x00,0x02,0x3f,0xff,0xfd,0x5d,0x80,0x00,0x00,0x04,
-0x3f,0xff,0xfd,0x5e,0x80,0x00,0x00,0x06,0x3f,0xff,0xfd,0x5f,0x80,0x00,0x00,0x08,
-0x3f,0xff,0xfd,0x5f,0x80,0x00,0x00,0x0a,0x3f,0xff,0xfd,0x60,0x80,0x00,0x00,0x0c,
-0x3f,0xff,0xfd,0x46,0x80,0x00,0x00,0x0e,0x3f,0xff,0xfd,0x47,0x80,0x00,0x00,0x10,
-0x3f,0xff,0xfb,0x15,0x80,0x00,0x00,0x12,0x3f,0xff,0xfb,0x16,0x80,0x00,0x00,0x14,
-0x3f,0xff,0xfb,0x17,0x80,0x00,0x00,0x16,0x3f,0xff,0xfb,0x18,0x80,0x00,0x00,0x18,
-0x3f,0xff,0xfb,0x19,0x80,0x00,0x00,0x1a,0x3f,0xff,0xfb,0x1a,0x80,0x00,0x00,0x1c,
-0x3f,0xff,0xfb,0x1b,0x80,0x00,0x00,0x1e,0x3f,0xff,0xfb,0x1c,0x80,0x00,0x00,0x20,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,
-0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x07,
-0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x0b,
-0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x0f,
-0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x11,0x00,0x76,0x02,0x90,0x00,0x71,0x02,0x8c,
-0x02,0x8d,0x00,0x6a,0x02,0x8e,0x02,0x91,0x00,0x7a,0x02,0x8f,0x0b,0x5a,0x0b,0x5c,
-0x0b,0x5e,0x0b,0x5f,0x0b,0x61,0x0b,0x63,0x0b,0x65,0x0b,0x67,0x00,0x00,0x01,0x70,
-0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x1c,
-0x00,0x00,0x00,0x66,0x00,0x00,0x00,0xd4,0x00,0x00,0x01,0x10,0x00,0x00,0x01,0x40,
-0x00,0x00,0x01,0x58,0x00,0x04,0x00,0x06,0x00,0x07,0x00,0x18,0x00,0x02,0x00,0x12,
-0x04,0xb1,0x04,0xb1,0x00,0x3c,0x04,0xb7,0x04,0xb7,0x00,0x3e,0x04,0xb9,0x04,0xb9,
-0x00,0x40,0x04,0xc0,0x04,0xc0,0x00,0x42,0x04,0xc2,0x04,0xc2,0x00,0x44,0x04,0xca,
-0x04,0xca,0x00,0x46,0x04,0xce,0x04,0xce,0x00,0x48,0xff,0xff,0xff,0xff,0x00,0x00,
-0x00,0x04,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,
-0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,
-0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x04,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x02,
-0x00,0x08,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
-0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x02,0x80,0x00,0x00,0x00,0x00,0x03,0x80,0x00,0x00,0x00,0x00,0x04,
-0x80,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x02,
-0x00,0x00,0xa0,0x00,0x00,0x04,0x00,0x00,0xa0,0x00,0x00,0x06,0x00,0x00,0xa0,0x00,
-0x00,0x08,0x00,0x00,0xa0,0x00,0x00,0x0a,0x3f,0xff,0xfb,0x32,0xbf,0xff,0xfb,0x50,
-0x3f,0xff,0xfb,0x51,0xbf,0xff,0xfb,0x43,0x3f,0xff,0xfb,0x4d,0xbf,0xff,0xfb,0x45,
-0x3f,0xff,0xfb,0x4d,0xbf,0xff,0xfb,0x47,0x3f,0xff,0xfb,0x46,0xbf,0xff,0xfb,0x49,
-0x3f,0xff,0xfb,0x48,0xbf,0xff,0xfb,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
-0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x05,
-0x04,0xd3,0x0b,0x12,0x0b,0x13,0x0b,0x15,0x0b,0x11,0x0b,0x14,0x00,0x00,0x01,0x54,
-0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x1c,
-0x00,0x00,0x00,0x50,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0xe6,0x00,0x00,0x01,0x1e,
-0x00,0x00,0x01,0x3a,0x00,0x04,0x00,0x06,0x00,0x04,0x00,0x18,0x00,0x02,0x00,0x00,
-0x00,0x49,0x00,0x49,0x00,0x2a,0x00,0x4c,0x00,0x4c,0x00,0x2c,0x00,0x4f,0x00,0x4f,
-0x00,0x2e,0x00,0x57,0x00,0x56,0x00,0x30,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x04,
-0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x02,0x00,0x00,0x00,0x06,
-0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x06,0x00,0x06,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x02,
-0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x80,0x00,0x00,0x00,0x00,0x04,
-0x80,0x00,0x00,0x00,0x00,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,
-0x00,0x00,0xa0,0x00,0x00,0x02,0x00,0x00,0x60,0x00,0x00,0x04,0x00,0x00,0xa0,0x00,
-0x00,0x06,0x00,0x00,0xa0,0x00,0x00,0x09,0x00,0x00,0xa0,0x00,0x00,0x0c,0x3f,0xff,
-0xff,0xb4,0xbf,0xff,0xff,0xb8,0x3f,0xff,0xff,0xb3,0xbf,0xff,0xff,0xba,0x3f,0xff,
-0xff,0xbb,0xbf,0xff,0xff,0xbc,0x3f,0xff,0xff,0xba,0x3f,0xff,0xff,0xbe,0xbf,0xff,
-0xff,0xbf,0x3f,0xff,0xff,0xba,0x3f,0xff,0xff,0xc1,0xbf,0xff,0xff,0xc2,0x3f,0xff,
-0xff,0xb5,0xbf,0xff,0xff,0xb7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,
-0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,
-0x00,0x05,0x0b,0x0b,0x0b,0x0c,0x0b,0x0a,0x0b,0x0d,0x0b,0x0e,0x0b,0x10,0x00,0x00,
-0x00,0x00,0x06,0x38,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x0e,
-0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x54,0x00,0x00,0x02,0x84,0x00,0x00,0x03,0xb6,
-0x00,0x00,0x05,0x2e,0x00,0x00,0x05,0xea,0x00,0x04,0x00,0x06,0x00,0x03,0x00,0x0c,
-0x00,0x01,0x00,0x06,0x00,0x12,0x00,0x12,0x00,0x24,0x00,0x1b,0x00,0x14,0x00,0x26,
-0x07,0x9d,0x07,0x9d,0x00,0x36,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x05,
-0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,
-0x00,0x04,0x00,0x05,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x05,
-0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x07,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x00,0x00,0x06,
-0x00,0x00,0x00,0x08,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x09,
-0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x09,0x00,0x0f,0x00,0x09,
-0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x11,0x00,0x12,
-0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x10,0x00,0x16,0x00,0x10,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x17,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x05,
-0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x19,0x00,0x04,0x00,0x1a,0x00,0x00,0x00,0x06,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
-0x00,0x02,0x00,0x1b,0x00,0x04,0x00,0x1c,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x00,0x01,0x00,0x02,0x00,0x03,
-0x00,0x04,0x00,0x05,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x1f,0x00,0x20,
-0x00,0x00,0x00,0x06,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x22,0x00,0x23,0x00,0x00,0x00,0x06,
-0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x00,0x01,
-0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x26,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,
-0x00,0x04,0x00,0x27,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x28,
-0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x29,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x00,0x00,0x06,
-0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
-0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x2b,0x00,0x06,0x00,0x2c,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,
-0x00,0x04,0x00,0x05,0x00,0x2d,0x00,0x06,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x2f,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x05,
-0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x00,0x00,0x06,
-0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
-0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x00,0x00,0x06,0x00,0x32,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x80,0x00,0x00,0x00,0x00,0x05,0x80,0x00,
-0x00,0x00,0x00,0x08,0x80,0x00,0x00,0x00,0x00,0x0b,0x80,0x00,0x00,0x00,0x00,0x0e,
-0x80,0x00,0x00,0x00,0x00,0x11,0x80,0x00,0x00,0x00,0x00,0x04,0x80,0x00,0x00,0x00,
-0x00,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,
-0x00,0x02,0x00,0x00,0xa0,0x00,0x00,0x05,0x00,0x00,0xa0,0x00,0x00,0x08,0x00,0x00,
-0xa0,0x00,0x00,0x0b,0x00,0x00,0xa0,0x00,0x00,0x0e,0x00,0x00,0xa0,0x00,0x00,0x11,
-0x00,0x00,0x60,0x00,0x00,0x14,0x00,0x00,0xa0,0x00,0x00,0x16,0x00,0x00,0xa0,0x00,
-0x00,0x19,0x00,0x00,0xa0,0x00,0x00,0x1c,0x00,0x00,0xa0,0x00,0x00,0x1f,0x00,0x00,
-0xa0,0x00,0x00,0x22,0x00,0x00,0xa0,0x00,0x00,0x25,0x00,0x07,0x80,0x00,0x00,0x00,
-0x00,0x06,0x80,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x28,0x00,0x00,0xa0,0x00,
-0x00,0x2b,0x00,0x00,0xa0,0x00,0x00,0x2e,0x00,0x00,0xa0,0x00,0x00,0x31,0x00,0x0a,
-0x80,0x00,0x00,0x00,0x00,0x09,0x80,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x34,
-0x00,0x00,0xa0,0x00,0x00,0x37,0x00,0x00,0xa0,0x00,0x00,0x3a,0x00,0x00,0xa0,0x00,
-0x00,0x3d,0x00,0x00,0xa0,0x00,0x00,0x40,0x00,0x00,0xa0,0x00,0x00,0x43,0x00,0x0d,
-0x80,0x00,0x00,0x00,0x00,0x0c,0x80,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x46,
-0x00,0x00,0xa0,0x00,0x00,0x49,0x00,0x10,0x80,0x00,0x00,0x00,0x00,0x0f,0x80,0x00,
-0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x4c,0x00,0x00,0xa0,0x00,0x00,0x4f,0x00,0x00,
-0xa0,0x00,0x00,0x52,0x00,0x00,0xa0,0x00,0x00,0x55,0x00,0x13,0x80,0x00,0x00,0x00,
-0x00,0x12,0x80,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x58,0x00,0x00,0xa0,0x00,
-0x00,0x5b,0x3f,0xff,0xf8,0x63,0xbf,0xff,0xff,0xed,0x3f,0xff,0xff,0xed,0x3f,0xff,
-0xf8,0x66,0xbf,0xff,0xff,0xf0,0x3f,0xff,0xff,0xef,0x3f,0xff,0xf8,0x69,0xbf,0xff,
-0xff,0xf3,0x3f,0xff,0xff,0xf1,0x3f,0xff,0xf8,0x6c,0xbf,0xff,0xff,0xf6,0x3f,0xff,
-0xff,0xf3,0x3f,0xff,0xf8,0x6f,0xbf,0xff,0xff,0xf9,0x3f,0xff,0xff,0xf5,0x3f,0xff,
-0xf8,0x72,0xbf,0xff,0xff,0xfc,0x3f,0xff,0xff,0xf6,0x3f,0xff,0xf8,0x75,0xbf,0xff,
-0xff,0xff,0x00,0x00,0x00,0x02,0x80,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,
-0x00,0x05,0x80,0x00,0x00,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x08,0x80,0x00,
-0x00,0x07,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0b,0x80,0x00,0x00,0x0a,0x00,0x00,
-0x00,0x07,0x00,0x00,0x00,0x0e,0x80,0x00,0x00,0x0d,0x00,0x00,0x00,0x09,0x00,0x00,
-0x00,0x11,0x80,0x00,0x00,0x10,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x14,0x80,0x00,
-0x00,0x13,0x00,0x00,0x00,0x12,0x3f,0xff,0xf8,0x8c,0x80,0x00,0x00,0x15,0x00,0x00,
-0x00,0x13,0x3f,0xff,0xf8,0x8f,0x80,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,
-0x00,0x1d,0x80,0x00,0x00,0x1b,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x20,0x80,0x00,
-0x00,0x1e,0x00,0x00,0x00,0x1d,0x3f,0xff,0xf8,0x98,0x80,0x00,0x00,0x20,0x00,0x00,
-0x00,0x1f,0x3f,0xff,0xf8,0x9b,0x80,0x00,0x00,0x23,0x00,0x00,0x00,0x1f,0x3f,0xff,
-0xf8,0x9e,0x80,0x00,0x00,0x26,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x2c,0x80,0x00,
-0x00,0x29,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x2f,0x80,0x00,0x00,0x2c,0x00,0x00,
-0x00,0x28,0x00,0x00,0x00,0x32,0x80,0x00,0x00,0x2f,0x00,0x00,0x00,0x2e,0x3f,0xff,
-0xf8,0xaa,0x80,0x00,0x00,0x31,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x38,0x80,0x00,
-0x00,0x34,0x00,0x00,0x00,0x33,0x3f,0xff,0xf8,0xb0,0x80,0x00,0x00,0x36,0x00,0x00,
-0x00,0x34,0x3f,0xff,0xf8,0xb3,0x80,0x00,0x00,0x39,0x00,0x00,0x00,0x39,0x00,0x00,
-0x00,0x41,0x80,0x00,0x00,0x3c,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x44,0x80,0x00,
-0x00,0x3f,0x00,0x00,0x00,0x3d,0x3f,0xff,0xf8,0xbc,0x80,0x00,0x00,0x40,0x00,0x00,
-0x00,0x40,0x00,0x00,0x00,0x4a,0x80,0x00,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x03,
-0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,
-0x00,0x06,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,
-0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x0b,0x00,0x00,
-0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x00,0x00,0x0e,
-0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,
-0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x00,0x00,0x13,0x00,0x00,
-0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x00,0x00,0x16,
-0x00,0x00,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,
-0x00,0x19,0x00,0x00,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x00,0x00,0x1b,0x00,0x00,
-0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x00,0x00,0x1e,
-0x00,0x00,0x00,0x00,0x00,0x1f,0x08,0x11,0x00,0x7f,0x08,0x05,0x00,0x7e,0x08,0x07,
-0x08,0x0b,0x08,0x0d,0x08,0x11,0x00,0x7f,0x08,0x05,0x00,0x7e,0x08,0x07,0x08,0x0b,
-0x08,0x0d,0x08,0x06,0x08,0x08,0x08,0x06,0x08,0x08,0x00,0x80,0x08,0x09,0x08,0x0e,
-0x00,0x80,0x08,0x09,0x08,0x0e,0x08,0x0a,0x08,0x0a,0x08,0x0c,0x08,0x0f,0x08,0x0c,
-0x08,0x0f,0x08,0x10,0x08,0x10,0x00,0x00,0x00,0x00,0x00,0x40,0x03,0x06,0x00,0x01,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,
-0x00,0x01,0x00,0x0b,0x01,0x38,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,
-0x01,0x4e,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x0b,0x01,0x6b,0x00,0x01,
-0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0b,0x01,0x8f,0x00,0x01,0x00,0x00,0x00,0x00,
-0x00,0x05,0x00,0x0b,0x01,0xb3,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x0a,
-0x01,0xd5,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x11,0x02,0x04,0x00,0x01,
-0x00,0x00,0x00,0x00,0x00,0x0b,0x00,0x1d,0x02,0x52,0x00,0x01,0x00,0x00,0x00,0x00,
-0x00,0x0d,0x09,0x93,0x15,0x98,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0x34,
-0x1f,0x96,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x09,0x1f,0xcb,0x00,0x01,
-0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x12,0x1f,0xfc,0x00,0x01,0x00,0x00,0x00,0x00,
-0x01,0x02,0x00,0x09,0x20,0x3b,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x18,
-0x20,0x57,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x04,0x00,0x12,0x20,0xde,0x00,0x01,
-0x00,0x00,0x00,0x00,0x01,0x05,0x00,0x10,0x21,0x17,0x00,0x01,0x00,0x00,0x00,0x00,
-0x01,0x06,0x00,0x0e,0x21,0x7e,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x07,0x00,0x07,
-0x21,0xd0,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x08,0x00,0x12,0x21,0xf6,0x00,0x01,
-0x00,0x00,0x00,0x00,0x01,0x09,0x00,0x11,0x22,0x56,0x00,0x01,0x00,0x00,0x00,0x01,
-0x01,0x00,0x00,0x09,0x1f,0xd5,0x00,0x01,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x17,
-0x20,0x0f,0x00,0x01,0x00,0x00,0x00,0x01,0x01,0x02,0x00,0x09,0x20,0x45,0x00,0x01,
-0x00,0x00,0x00,0x01,0x01,0x03,0x00,0x18,0x20,0x70,0x00,0x01,0x00,0x00,0x00,0x01,
-0x01,0x04,0x00,0x12,0x20,0xf1,0x00,0x01,0x00,0x00,0x00,0x01,0x01,0x05,0x00,0x12,
-0x21,0x28,0x00,0x01,0x00,0x00,0x00,0x01,0x01,0x06,0x00,0x0f,0x21,0x8d,0x00,0x01,
-0x00,0x00,0x00,0x01,0x01,0x07,0x00,0x15,0x21,0xd8,0x00,0x01,0x00,0x00,0x00,0x01,
-0x01,0x08,0x00,0x16,0x22,0x09,0x00,0x01,0x00,0x00,0x00,0x01,0x01,0x09,0x00,0x1f,
-0x22,0x68,0x00,0x01,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x09,0x1f,0xdf,0x00,0x01,
-0x00,0x00,0x00,0x02,0x01,0x03,0x00,0x21,0x20,0x89,0x00,0x01,0x00,0x00,0x00,0x02,
-0x01,0x05,0x00,0x11,0x21,0x3b,0x00,0x01,0x00,0x00,0x00,0x02,0x01,0x06,0x00,0x11,
-0x21,0x9d,0x00,0x01,0x00,0x00,0x00,0x02,0x01,0x08,0x00,0x10,0x22,0x20,0x00,0x01,
-0x00,0x00,0x00,0x02,0x01,0x09,0x00,0x17,0x22,0x88,0x00,0x01,0x00,0x00,0x00,0x03,
-0x01,0x00,0x00,0x08,0x1f,0xe9,0x00,0x01,0x00,0x00,0x00,0x03,0x01,0x03,0x00,0x15,
-0x20,0xab,0x00,0x01,0x00,0x00,0x00,0x03,0x01,0x05,0x00,0x13,0x21,0x4d,0x00,0x01,
-0x00,0x00,0x00,0x03,0x01,0x06,0x00,0x0d,0x21,0xaf,0x00,0x01,0x00,0x00,0x00,0x03,
-0x01,0x08,0x00,0x12,0x22,0x31,0x00,0x01,0x00,0x00,0x00,0x03,0x01,0x09,0x00,0x11,
-0x22,0xa0,0x00,0x01,0x00,0x00,0x00,0x04,0x01,0x00,0x00,0x09,0x1f,0xf2,0x00,0x01,
-0x00,0x00,0x00,0x04,0x01,0x01,0x00,0x13,0x20,0x27,0x00,0x01,0x00,0x00,0x00,0x04,
-0x01,0x02,0x00,0x07,0x20,0x4f,0x00,0x01,0x00,0x00,0x00,0x04,0x01,0x03,0x00,0x1c,
-0x20,0xc1,0x00,0x01,0x00,0x00,0x00,0x04,0x01,0x04,0x00,0x12,0x21,0x04,0x00,0x01,
-0x00,0x00,0x00,0x04,0x01,0x05,0x00,0x1c,0x21,0x61,0x00,0x01,0x00,0x00,0x00,0x04,
-0x01,0x06,0x00,0x12,0x21,0xbd,0x00,0x01,0x00,0x00,0x00,0x04,0x01,0x07,0x00,0x07,
-0x21,0xee,0x00,0x01,0x00,0x00,0x00,0x04,0x01,0x08,0x00,0x11,0x22,0x44,0x00,0x01,
-0x00,0x00,0x00,0x04,0x01,0x09,0x00,0x12,0x22,0xb2,0x00,0x03,0x00,0x01,0x04,0x09,
-0x00,0x00,0x00,0xbe,0x00,0x00,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x01,0x00,0x16,
-0x01,0x20,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x02,0x00,0x08,0x01,0x44,0x00,0x03,
-0x00,0x01,0x04,0x09,0x00,0x03,0x00,0x16,0x01,0x53,0x00,0x03,0x00,0x01,0x04,0x09,
-0x00,0x04,0x00,0x16,0x01,0x77,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x05,0x00,0x16,
-0x01,0x9b,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x06,0x00,0x14,0x01,0xbf,0x00,0x03,
-0x00,0x01,0x04,0x09,0x00,0x08,0x00,0x22,0x01,0xe0,0x00,0x03,0x00,0x01,0x04,0x09,
-0x00,0x0b,0x00,0x3a,0x02,0x16,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x0d,0x13,0x26,
-0x02,0x70,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x0e,0x00,0x68,0x1f,0x2c,0x00,0x43,
-0x00,0x6f,0x00,0x70,0x00,0x79,0x00,0x72,0x00,0x69,0x00,0x67,0x00,0x68,0x00,0x74,
-0x00,0x20,0x00,0x28,0x00,0x63,0x00,0x29,0x00,0x20,0x00,0x32,0x00,0x30,0x00,0x30,
-0x00,0x33,0x00,0x20,0x00,0x62,0x00,0x79,0x00,0x20,0x00,0x42,0x00,0x69,0x00,0x74,
-0x00,0x73,0x00,0x74,0x00,0x72,0x00,0x65,0x00,0x61,0x00,0x6d,0x00,0x2c,0x00,0x20,
-0x00,0x49,0x00,0x6e,0x00,0x63,0x00,0x2e,0x00,0x20,0x00,0x41,0x00,0x6c,0x00,0x6c,
-0x00,0x20,0x00,0x52,0x00,0x69,0x00,0x67,0x00,0x68,0x00,0x74,0x00,0x73,0x00,0x20,
-0x00,0x52,0x00,0x65,0x00,0x73,0x00,0x65,0x00,0x72,0x00,0x76,0x00,0x65,0x00,0x64,
-0x00,0x2e,0x00,0x0a,0x00,0x44,0x00,0x65,0x00,0x6a,0x00,0x61,0x00,0x56,0x00,0x75,
-0x00,0x20,0x00,0x63,0x00,0x68,0x00,0x61,0x00,0x6e,0x00,0x67,0x00,0x65,0x00,0x73,
-0x00,0x20,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x20,
-0x00,0x70,0x00,0x75,0x00,0x62,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x64,
-0x00,0x6f,0x00,0x6d,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x0a,0x00,0x00,0x43,0x6f,
-0x70,0x79,0x72,0x69,0x67,0x68,0x74,0x20,0x28,0x63,0x29,0x20,0x32,0x30,0x30,0x33,
-0x20,0x62,0x79,0x20,0x42,0x69,0x74,0x73,0x74,0x72,0x65,0x61,0x6d,0x2c,0x20,0x49,
-0x6e,0x63,0x2e,0x20,0x41,0x6c,0x6c,0x20,0x52,0x69,0x67,0x68,0x74,0x73,0x20,0x52,
-0x65,0x73,0x65,0x72,0x76,0x65,0x64,0x2e,0x0a,0x44,0x65,0x6a,0x61,0x56,0x75,0x20,
-0x63,0x68,0x61,0x6e,0x67,0x65,0x73,0x20,0x61,0x72,0x65,0x20,0x69,0x6e,0x20,0x70,
-0x75,0x62,0x6c,0x69,0x63,0x20,0x64,0x6f,0x6d,0x61,0x69,0x6e,0x0a,0x00,0x00,0x44,
-0x00,0x65,0x00,0x6a,0x00,0x61,0x00,0x56,0x00,0x75,0x00,0x20,0x00,0x53,0x00,0x61,
-0x00,0x6e,0x00,0x73,0x00,0x00,0x44,0x65,0x6a,0x61,0x56,0x75,0x20,0x53,0x61,0x6e,
-0x73,0x00,0x00,0x42,0x00,0x6f,0x00,0x6f,0x00,0x6b,0x00,0x00,0x42,0x6f,0x6f,0x6b,
-0x00,0x00,0x44,0x00,0x65,0x00,0x6a,0x00,0x61,0x00,0x56,0x00,0x75,0x00,0x20,0x00,
-0x53,0x00,0x61,0x00,0x6e,0x00,0x73,0x00,0x00,0x44,0x65,0x6a,0x61,0x56,0x75,0x20,
-0x53,0x61,0x6e,0x73,0x00,0x00,0x44,0x00,0x65,0x00,0x6a,0x00,0x61,0x00,0x56,0x00,
-0x75,0x00,0x20,0x00,0x53,0x00,0x61,0x00,0x6e,0x00,0x73,0x00,0x00,0x44,0x65,0x6a,
-0x61,0x56,0x75,0x20,0x53,0x61,0x6e,0x73,0x00,0x00,0x56,0x00,0x65,0x00,0x72,0x00,
-0x73,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x32,0x00,0x2e,0x00,0x35,0x00,
-0x00,0x56,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x32,0x2e,0x35,0x00,0x00,0x44,0x00,
-0x65,0x00,0x6a,0x00,0x61,0x00,0x56,0x00,0x75,0x00,0x53,0x00,0x61,0x00,0x6e,0x00,
-0x73,0x00,0x00,0x44,0x65,0x6a,0x61,0x56,0x75,0x53,0x61,0x6e,0x73,0x00,0x00,0x44,
-0x00,0x65,0x00,0x6a,0x00,0x61,0x00,0x56,0x00,0x75,0x00,0x20,0x00,0x66,0x00,0x6f,
-0x00,0x6e,0x00,0x74,0x00,0x73,0x00,0x20,0x00,0x74,0x00,0x65,0x00,0x61,0x00,0x6d,
-0x00,0x00,0x44,0x65,0x6a,0x61,0x56,0x75,0x20,0x66,0x6f,0x6e,0x74,0x73,0x20,0x74,
-0x65,0x61,0x6d,0x00,0x00,0x68,0x00,0x74,0x00,0x74,0x00,0x70,0x00,0x3a,0x00,0x2f,
-0x00,0x2f,0x00,0x64,0x00,0x65,0x00,0x6a,0x00,0x61,0x00,0x76,0x00,0x75,0x00,0x2e,
-0x00,0x73,0x00,0x6f,0x00,0x75,0x00,0x72,0x00,0x63,0x00,0x65,0x00,0x66,0x00,0x6f,
-0x00,0x72,0x00,0x67,0x00,0x65,0x00,0x2e,0x00,0x6e,0x00,0x65,0x00,0x74,0x00,0x00,
-0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x64,0x65,0x6a,0x61,0x76,0x75,0x2e,0x73,0x6f,
-0x75,0x72,0x63,0x65,0x66,0x6f,0x72,0x67,0x65,0x2e,0x6e,0x65,0x74,0x00,0x00,0x46,
-0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x73,0x00,0x20,0x00,0x61,0x00,0x72,0x00,0x65,
-0x00,0x20,0x00,0x28,0x00,0x63,0x00,0x29,0x00,0x20,0x00,0x42,0x00,0x69,0x00,0x74,
-0x00,0x73,0x00,0x74,0x00,0x72,0x00,0x65,0x00,0x61,0x00,0x6d,0x00,0x20,0x00,0x28,
-0x00,0x73,0x00,0x65,0x00,0x65,0x00,0x20,0x00,0x62,0x00,0x65,0x00,0x6c,0x00,0x6f,
-0x00,0x77,0x00,0x29,0x00,0x2e,0x00,0x20,0x00,0x44,0x00,0x65,0x00,0x6a,0x00,0x61,
-0x00,0x56,0x00,0x75,0x00,0x20,0x00,0x63,0x00,0x68,0x00,0x61,0x00,0x6e,0x00,0x67,
-0x00,0x65,0x00,0x73,0x00,0x20,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x20,0x00,0x69,
-0x00,0x6e,0x00,0x20,0x00,0x70,0x00,0x75,0x00,0x62,0x00,0x6c,0x00,0x69,0x00,0x63,
-0x00,0x20,0x00,0x64,0x00,0x6f,0x00,0x6d,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x2e,
-0x00,0x0a,0x00,0x0a,0x00,0x42,0x00,0x69,0x00,0x74,0x00,0x73,0x00,0x74,0x00,0x72,
-0x00,0x65,0x00,0x61,0x00,0x6d,0x00,0x20,0x00,0x56,0x00,0x65,0x00,0x72,0x00,0x61,
-0x00,0x20,0x00,0x46,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x73,0x00,0x20,0x00,0x43,
-0x00,0x6f,0x00,0x70,0x00,0x79,0x00,0x72,0x00,0x69,0x00,0x67,0x00,0x68,0x00,0x74,
-0x00,0x0a,0x00,0x2d,0x00,0x2d,0x00,0x2d,0x00,0x2d,0x00,0x2d,0x00,0x2d,0x00,0x2d,
-0x00,0x2d,0x00,0x2d,0x00,0x2d,0x00,0x2d,0x00,0x2d,0x00,0x2d,0x00,0x2d,0x00,0x2d,
-0x00,0x2d,0x00,0x2d,0x00,0x2d,0x00,0x2d,0x00,0x2d,0x00,0x2d,0x00,0x2d,0x00,0x2d,
-0x00,0x2d,0x00,0x2d,0x00,0x2d,0x00,0x2d,0x00,0x2d,0x00,0x2d,0x00,0x2d,0x00,0x0a,
-0x00,0x0a,0x00,0x43,0x00,0x6f,0x00,0x70,0x00,0x79,0x00,0x72,0x00,0x69,0x00,0x67,
-0x00,0x68,0x00,0x74,0x00,0x20,0x00,0x28,0x00,0x63,0x00,0x29,0x00,0x20,0x00,0x32,
-0x00,0x30,0x00,0x30,0x00,0x33,0x00,0x20,0x00,0x62,0x00,0x79,0x00,0x20,0x00,0x42,
-0x00,0x69,0x00,0x74,0x00,0x73,0x00,0x74,0x00,0x72,0x00,0x65,0x00,0x61,0x00,0x6d,
-0x00,0x2c,0x00,0x20,0x00,0x49,0x00,0x6e,0x00,0x63,0x00,0x2e,0x00,0x20,0x00,0x41,
-0x00,0x6c,0x00,0x6c,0x00,0x20,0x00,0x52,0x00,0x69,0x00,0x67,0x00,0x68,0x00,0x74,
-0x00,0x73,0x00,0x20,0x00,0x52,0x00,0x65,0x00,0x73,0x00,0x65,0x00,0x72,0x00,0x76,
-0x00,0x65,0x00,0x64,0x00,0x2e,0x00,0x20,0x00,0x42,0x00,0x69,0x00,0x74,0x00,0x73,
-0x00,0x74,0x00,0x72,0x00,0x65,0x00,0x61,0x00,0x6d,0x00,0x20,0x00,0x56,0x00,0x65,
-0x00,0x72,0x00,0x61,0x00,0x20,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x61,0x00,0x20,
-0x00,0x74,0x00,0x72,0x00,0x61,0x00,0x64,0x00,0x65,0x00,0x6d,0x00,0x61,0x00,0x72,
-0x00,0x6b,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x42,0x00,0x69,0x00,0x74,
-0x00,0x73,0x00,0x74,0x00,0x72,0x00,0x65,0x00,0x61,0x00,0x6d,0x00,0x2c,0x00,0x20,
-0x00,0x49,0x00,0x6e,0x00,0x63,0x00,0x2e,0x00,0x0a,0x00,0x0a,0x00,0x50,0x00,0x65,
-0x00,0x72,0x00,0x6d,0x00,0x69,0x00,0x73,0x00,0x73,0x00,0x69,0x00,0x6f,0x00,0x6e,
-0x00,0x20,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x68,0x00,0x65,0x00,0x72,0x00,0x65,
-0x00,0x62,0x00,0x79,0x00,0x20,0x00,0x67,0x00,0x72,0x00,0x61,0x00,0x6e,0x00,0x74,
-0x00,0x65,0x00,0x64,0x00,0x2c,0x00,0x20,0x00,0x66,0x00,0x72,0x00,0x65,0x00,0x65,
-0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x63,0x00,0x68,0x00,0x61,0x00,0x72,
-0x00,0x67,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x61,
-0x00,0x6e,0x00,0x79,0x00,0x20,0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x73,0x00,0x6f,
-0x00,0x6e,0x00,0x20,0x00,0x6f,0x00,0x62,0x00,0x74,0x00,0x61,0x00,0x69,0x00,0x6e,
-0x00,0x69,0x00,0x6e,0x00,0x67,0x00,0x20,0x00,0x61,0x00,0x20,0x00,0x63,0x00,0x6f,
-0x00,0x70,0x00,0x79,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x74,0x00,0x68,
-0x00,0x65,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x73,0x00,0x20,
-0x00,0x61,0x00,0x63,0x00,0x63,0x00,0x6f,0x00,0x6d,0x00,0x70,0x00,0x61,0x00,0x6e,
-0x00,0x79,0x00,0x69,0x00,0x6e,0x00,0x67,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x69,
-0x00,0x73,0x00,0x20,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,
-0x00,0x65,0x00,0x20,0x00,0x28,0x00,0x22,0x00,0x46,0x00,0x6f,0x00,0x6e,0x00,0x74,
-0x00,0x73,0x00,0x22,0x00,0x29,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20,
-0x00,0x61,0x00,0x73,0x00,0x73,0x00,0x6f,0x00,0x63,0x00,0x69,0x00,0x61,0x00,0x74,
-0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x64,0x00,0x6f,0x00,0x63,0x00,0x75,0x00,0x6d,
-0x00,0x65,0x00,0x6e,0x00,0x74,0x00,0x61,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,
-0x00,0x20,0x00,0x66,0x00,0x69,0x00,0x6c,0x00,0x65,0x00,0x73,0x00,0x20,0x00,0x28,
-0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x22,0x00,0x46,0x00,0x6f,0x00,0x6e,
-0x00,0x74,0x00,0x20,0x00,0x53,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,
-0x00,0x72,0x00,0x65,0x00,0x22,0x00,0x29,0x00,0x2c,0x00,0x20,0x00,0x74,0x00,0x6f,
-0x00,0x20,0x00,0x72,0x00,0x65,0x00,0x70,0x00,0x72,0x00,0x6f,0x00,0x64,0x00,0x75,
-0x00,0x63,0x00,0x65,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20,0x00,0x64,
-0x00,0x69,0x00,0x73,0x00,0x74,0x00,0x72,0x00,0x69,0x00,0x62,0x00,0x75,0x00,0x74,
-0x00,0x65,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x46,0x00,0x6f,
-0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x53,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,
-0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x63,
-0x00,0x6c,0x00,0x75,0x00,0x64,0x00,0x69,0x00,0x6e,0x00,0x67,0x00,0x20,0x00,0x77,
-0x00,0x69,0x00,0x74,0x00,0x68,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x6c,
-0x00,0x69,0x00,0x6d,0x00,0x69,0x00,0x74,0x00,0x61,0x00,0x74,0x00,0x69,0x00,0x6f,
-0x00,0x6e,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x72,0x00,0x69,
-0x00,0x67,0x00,0x68,0x00,0x74,0x00,0x73,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,
-0x00,0x75,0x00,0x73,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x70,
-0x00,0x79,0x00,0x2c,0x00,0x20,0x00,0x6d,0x00,0x65,0x00,0x72,0x00,0x67,0x00,0x65,
-0x00,0x2c,0x00,0x20,0x00,0x70,0x00,0x75,0x00,0x62,0x00,0x6c,0x00,0x69,0x00,0x73,
-0x00,0x68,0x00,0x2c,0x00,0x20,0x00,0x64,0x00,0x69,0x00,0x73,0x00,0x74,0x00,0x72,
-0x00,0x69,0x00,0x62,0x00,0x75,0x00,0x74,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x61,
-0x00,0x6e,0x00,0x64,0x00,0x2f,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x73,0x00,0x65,
-0x00,0x6c,0x00,0x6c,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x70,0x00,0x69,0x00,0x65,
-0x00,0x73,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,
-0x00,0x20,0x00,0x46,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x53,0x00,0x6f,
-0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x2c,0x00,0x20,
-0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x70,
-0x00,0x65,0x00,0x72,0x00,0x6d,0x00,0x69,0x00,0x74,0x00,0x20,0x00,0x70,0x00,0x65,
-0x00,0x72,0x00,0x73,0x00,0x6f,0x00,0x6e,0x00,0x73,0x00,0x20,0x00,0x74,0x00,0x6f,
-0x00,0x20,0x00,0x77,0x00,0x68,0x00,0x6f,0x00,0x6d,0x00,0x20,0x00,0x74,0x00,0x68,
-0x00,0x65,0x00,0x20,0x00,0x46,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x53,
-0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x20,
-0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x66,0x00,0x75,0x00,0x72,0x00,0x6e,0x00,0x69,
-0x00,0x73,0x00,0x68,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,
-0x00,0x64,0x00,0x6f,0x00,0x20,0x00,0x73,0x00,0x6f,0x00,0x2c,0x00,0x20,0x00,0x73,
-0x00,0x75,0x00,0x62,0x00,0x6a,0x00,0x65,0x00,0x63,0x00,0x74,0x00,0x20,0x00,0x74,
-0x00,0x6f,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x66,0x00,0x6f,
-0x00,0x6c,0x00,0x6c,0x00,0x6f,0x00,0x77,0x00,0x69,0x00,0x6e,0x00,0x67,0x00,0x20,
-0x00,0x63,0x00,0x6f,0x00,0x6e,0x00,0x64,0x00,0x69,0x00,0x74,0x00,0x69,0x00,0x6f,
-0x00,0x6e,0x00,0x73,0x00,0x3a,0x00,0x0a,0x00,0x0a,0x00,0x54,0x00,0x68,0x00,0x65,
-0x00,0x20,0x00,0x61,0x00,0x62,0x00,0x6f,0x00,0x76,0x00,0x65,0x00,0x20,0x00,0x63,
-0x00,0x6f,0x00,0x70,0x00,0x79,0x00,0x72,0x00,0x69,0x00,0x67,0x00,0x68,0x00,0x74,
-0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20,0x00,0x74,0x00,0x72,0x00,0x61,
-0x00,0x64,0x00,0x65,0x00,0x6d,0x00,0x61,0x00,0x72,0x00,0x6b,0x00,0x20,0x00,0x6e,
-0x00,0x6f,0x00,0x74,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x73,0x00,0x20,0x00,0x61,
-0x00,0x6e,0x00,0x64,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,
-0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x6d,0x00,0x69,0x00,0x73,0x00,0x73,0x00,0x69,
-0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x6e,0x00,0x6f,0x00,0x74,0x00,0x69,0x00,0x63,
-0x00,0x65,0x00,0x20,0x00,0x73,0x00,0x68,0x00,0x61,0x00,0x6c,0x00,0x6c,0x00,0x20,
-0x00,0x62,0x00,0x65,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x63,0x00,0x6c,0x00,0x75,
-0x00,0x64,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x20,0x00,0x61,
-0x00,0x6c,0x00,0x6c,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x70,0x00,0x69,0x00,0x65,
-0x00,0x73,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x6f,0x00,0x6e,0x00,0x65,
-0x00,0x20,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x6d,0x00,0x6f,0x00,0x72,0x00,0x65,
-0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,
-0x00,0x46,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x53,0x00,0x6f,0x00,0x66,
-0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x20,0x00,0x74,0x00,0x79,
-0x00,0x70,0x00,0x65,0x00,0x66,0x00,0x61,0x00,0x63,0x00,0x65,0x00,0x73,0x00,0x2e,
-0x00,0x0a,0x00,0x0a,0x00,0x54,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x46,0x00,0x6f,
-0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x53,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,
-0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x20,0x00,0x6d,0x00,0x61,0x00,0x79,0x00,0x20,
-0x00,0x62,0x00,0x65,0x00,0x20,0x00,0x6d,0x00,0x6f,0x00,0x64,0x00,0x69,0x00,0x66,
-0x00,0x69,0x00,0x65,0x00,0x64,0x00,0x2c,0x00,0x20,0x00,0x61,0x00,0x6c,0x00,0x74,
-0x00,0x65,0x00,0x72,0x00,0x65,0x00,0x64,0x00,0x2c,0x00,0x20,0x00,0x6f,0x00,0x72,
-0x00,0x20,0x00,0x61,0x00,0x64,0x00,0x64,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x74,
-0x00,0x6f,0x00,0x2c,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20,0x00,0x69,
-0x00,0x6e,0x00,0x20,0x00,0x70,0x00,0x61,0x00,0x72,0x00,0x74,0x00,0x69,0x00,0x63,
-0x00,0x75,0x00,0x6c,0x00,0x61,0x00,0x72,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,
-0x00,0x20,0x00,0x64,0x00,0x65,0x00,0x73,0x00,0x69,0x00,0x67,0x00,0x6e,0x00,0x73,
-0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x67,0x00,0x6c,0x00,0x79,0x00,0x70,
-0x00,0x68,0x00,0x73,0x00,0x20,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x63,0x00,0x68,
-0x00,0x61,0x00,0x72,0x00,0x61,0x00,0x63,0x00,0x74,0x00,0x65,0x00,0x72,0x00,0x73,
-0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,
-0x00,0x46,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x73,0x00,0x20,0x00,0x6d,0x00,0x61,
-0x00,0x79,0x00,0x20,0x00,0x62,0x00,0x65,0x00,0x20,0x00,0x6d,0x00,0x6f,0x00,0x64,
-0x00,0x69,0x00,0x66,0x00,0x69,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x61,0x00,0x6e,
-0x00,0x64,0x00,0x20,0x00,0x61,0x00,0x64,0x00,0x64,0x00,0x69,0x00,0x74,0x00,0x69,
-0x00,0x6f,0x00,0x6e,0x00,0x61,0x00,0x6c,0x00,0x20,0x00,0x67,0x00,0x6c,0x00,0x79,
-0x00,0x70,0x00,0x68,0x00,0x73,0x00,0x20,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x20,
-0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x63,0x00,0x68,0x00,0x61,0x00,0x72,0x00,0x61,
-0x00,0x63,0x00,0x74,0x00,0x65,0x00,0x72,0x00,0x73,0x00,0x20,0x00,0x6d,0x00,0x61,
-0x00,0x79,0x00,0x20,0x00,0x62,0x00,0x65,0x00,0x20,0x00,0x61,0x00,0x64,0x00,0x64,
-0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x74,0x00,0x68,
-0x00,0x65,0x00,0x20,0x00,0x46,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x73,0x00,0x2c,
-0x00,0x20,0x00,0x6f,0x00,0x6e,0x00,0x6c,0x00,0x79,0x00,0x20,0x00,0x69,0x00,0x66,
-0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6e,
-0x00,0x74,0x00,0x73,0x00,0x20,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x20,0x00,0x72,
-0x00,0x65,0x00,0x6e,0x00,0x61,0x00,0x6d,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x74,
-0x00,0x6f,0x00,0x20,0x00,0x6e,0x00,0x61,0x00,0x6d,0x00,0x65,0x00,0x73,0x00,0x20,
-0x00,0x6e,0x00,0x6f,0x00,0x74,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x6e,0x00,0x74,
-0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x69,0x00,0x6e,0x00,0x67,0x00,0x20,0x00,0x65,
-0x00,0x69,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x72,0x00,0x20,0x00,0x74,0x00,0x68,
-0x00,0x65,0x00,0x20,0x00,0x77,0x00,0x6f,0x00,0x72,0x00,0x64,0x00,0x73,0x00,0x20,
-0x00,0x22,0x00,0x42,0x00,0x69,0x00,0x74,0x00,0x73,0x00,0x74,0x00,0x72,0x00,0x65,
-0x00,0x61,0x00,0x6d,0x00,0x22,0x00,0x20,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x74,
-0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x77,0x00,0x6f,0x00,0x72,0x00,0x64,0x00,0x20,
-0x00,0x22,0x00,0x56,0x00,0x65,0x00,0x72,0x00,0x61,0x00,0x22,0x00,0x2e,0x00,0x0a,
-0x00,0x0a,0x00,0x54,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x4c,0x00,0x69,
-0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x20,0x00,0x62,0x00,0x65,
-0x00,0x63,0x00,0x6f,0x00,0x6d,0x00,0x65,0x00,0x73,0x00,0x20,0x00,0x6e,0x00,0x75,
-0x00,0x6c,0x00,0x6c,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20,0x00,0x76,
-0x00,0x6f,0x00,0x69,0x00,0x64,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x74,
-0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x65,0x00,0x78,0x00,0x74,0x00,0x65,0x00,0x6e,
-0x00,0x74,0x00,0x20,0x00,0x61,0x00,0x70,0x00,0x70,0x00,0x6c,0x00,0x69,0x00,0x63,
-0x00,0x61,0x00,0x62,0x00,0x6c,0x00,0x65,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,
-0x00,0x46,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x73,0x00,0x20,0x00,0x6f,0x00,0x72,
-0x00,0x20,0x00,0x46,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x53,0x00,0x6f,
-0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x20,0x00,0x74,
-0x00,0x68,0x00,0x61,0x00,0x74,0x00,0x20,0x00,0x68,0x00,0x61,0x00,0x73,0x00,0x20,
-0x00,0x62,0x00,0x65,0x00,0x65,0x00,0x6e,0x00,0x20,0x00,0x6d,0x00,0x6f,0x00,0x64,
-0x00,0x69,0x00,0x66,0x00,0x69,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x61,0x00,0x6e,
-0x00,0x64,0x00,0x20,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x64,0x00,0x69,0x00,0x73,
-0x00,0x74,0x00,0x72,0x00,0x69,0x00,0x62,0x00,0x75,0x00,0x74,0x00,0x65,0x00,0x64,
-0x00,0x20,0x00,0x75,0x00,0x6e,0x00,0x64,0x00,0x65,0x00,0x72,0x00,0x20,0x00,0x74,
-0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x22,0x00,0x42,0x00,0x69,0x00,0x74,0x00,0x73,
-0x00,0x74,0x00,0x72,0x00,0x65,0x00,0x61,0x00,0x6d,0x00,0x20,0x00,0x56,0x00,0x65,
-0x00,0x72,0x00,0x61,0x00,0x22,0x00,0x20,0x00,0x6e,0x00,0x61,0x00,0x6d,0x00,0x65,
-0x00,0x73,0x00,0x2e,0x00,0x0a,0x00,0x0a,0x00,0x54,0x00,0x68,0x00,0x65,0x00,0x20,
-0x00,0x46,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x53,0x00,0x6f,0x00,0x66,
-0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x20,0x00,0x6d,0x00,0x61,
-0x00,0x79,0x00,0x20,0x00,0x62,0x00,0x65,0x00,0x20,0x00,0x73,0x00,0x6f,0x00,0x6c,
-0x00,0x64,0x00,0x20,0x00,0x61,0x00,0x73,0x00,0x20,0x00,0x70,0x00,0x61,0x00,0x72,
-0x00,0x74,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x61,0x00,0x20,0x00,0x6c,
-0x00,0x61,0x00,0x72,0x00,0x67,0x00,0x65,0x00,0x72,0x00,0x20,0x00,0x73,0x00,0x6f,
-0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x20,0x00,0x70,
-0x00,0x61,0x00,0x63,0x00,0x6b,0x00,0x61,0x00,0x67,0x00,0x65,0x00,0x20,0x00,0x62,
-0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x6e,0x00,0x6f,0x00,0x20,0x00,0x63,0x00,0x6f,
-0x00,0x70,0x00,0x79,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x6f,0x00,0x6e,
-0x00,0x65,0x00,0x20,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x6d,0x00,0x6f,0x00,0x72,
-0x00,0x65,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,
-0x00,0x20,0x00,0x46,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x53,0x00,0x6f,
-0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x20,0x00,0x74,
-0x00,0x79,0x00,0x70,0x00,0x65,0x00,0x66,0x00,0x61,0x00,0x63,0x00,0x65,0x00,0x73,
-0x00,0x20,0x00,0x6d,0x00,0x61,0x00,0x79,0x00,0x20,0x00,0x62,0x00,0x65,0x00,0x20,
-0x00,0x73,0x00,0x6f,0x00,0x6c,0x00,0x64,0x00,0x20,0x00,0x62,0x00,0x79,0x00,0x20,
-0x00,0x69,0x00,0x74,0x00,0x73,0x00,0x65,0x00,0x6c,0x00,0x66,0x00,0x2e,0x00,0x0a,
-0x00,0x0a,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x20,0x00,0x46,0x00,0x4f,0x00,0x4e,
-0x00,0x54,0x00,0x20,0x00,0x53,0x00,0x4f,0x00,0x46,0x00,0x54,0x00,0x57,0x00,0x41,
-0x00,0x52,0x00,0x45,0x00,0x20,0x00,0x49,0x00,0x53,0x00,0x20,0x00,0x50,0x00,0x52,
-0x00,0x4f,0x00,0x56,0x00,0x49,0x00,0x44,0x00,0x45,0x00,0x44,0x00,0x20,0x00,0x22,
-0x00,0x41,0x00,0x53,0x00,0x20,0x00,0x49,0x00,0x53,0x00,0x22,0x00,0x2c,0x00,0x20,
-0x00,0x57,0x00,0x49,0x00,0x54,0x00,0x48,0x00,0x4f,0x00,0x55,0x00,0x54,0x00,0x20,
-0x00,0x57,0x00,0x41,0x00,0x52,0x00,0x52,0x00,0x41,0x00,0x4e,0x00,0x54,0x00,0x59,
-0x00,0x20,0x00,0x4f,0x00,0x46,0x00,0x20,0x00,0x41,0x00,0x4e,0x00,0x59,0x00,0x20,
-0x00,0x4b,0x00,0x49,0x00,0x4e,0x00,0x44,0x00,0x2c,0x00,0x20,0x00,0x45,0x00,0x58,
-0x00,0x50,0x00,0x52,0x00,0x45,0x00,0x53,0x00,0x53,0x00,0x20,0x00,0x4f,0x00,0x52,
-0x00,0x20,0x00,0x49,0x00,0x4d,0x00,0x50,0x00,0x4c,0x00,0x49,0x00,0x45,0x00,0x44,
-0x00,0x2c,0x00,0x20,0x00,0x49,0x00,0x4e,0x00,0x43,0x00,0x4c,0x00,0x55,0x00,0x44,
-0x00,0x49,0x00,0x4e,0x00,0x47,0x00,0x20,0x00,0x42,0x00,0x55,0x00,0x54,0x00,0x20,
-0x00,0x4e,0x00,0x4f,0x00,0x54,0x00,0x20,0x00,0x4c,0x00,0x49,0x00,0x4d,0x00,0x49,
-0x00,0x54,0x00,0x45,0x00,0x44,0x00,0x20,0x00,0x54,0x00,0x4f,0x00,0x20,0x00,0x41,
-0x00,0x4e,0x00,0x59,0x00,0x20,0x00,0x57,0x00,0x41,0x00,0x52,0x00,0x52,0x00,0x41,
-0x00,0x4e,0x00,0x54,0x00,0x49,0x00,0x45,0x00,0x53,0x00,0x20,0x00,0x4f,0x00,0x46,
-0x00,0x20,0x00,0x4d,0x00,0x45,0x00,0x52,0x00,0x43,0x00,0x48,0x00,0x41,0x00,0x4e,
-0x00,0x54,0x00,0x41,0x00,0x42,0x00,0x49,0x00,0x4c,0x00,0x49,0x00,0x54,0x00,0x59,
-0x00,0x2c,0x00,0x20,0x00,0x46,0x00,0x49,0x00,0x54,0x00,0x4e,0x00,0x45,0x00,0x53,
-0x00,0x53,0x00,0x20,0x00,0x46,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x41,0x00,0x20,
-0x00,0x50,0x00,0x41,0x00,0x52,0x00,0x54,0x00,0x49,0x00,0x43,0x00,0x55,0x00,0x4c,
-0x00,0x41,0x00,0x52,0x00,0x20,0x00,0x50,0x00,0x55,0x00,0x52,0x00,0x50,0x00,0x4f,
-0x00,0x53,0x00,0x45,0x00,0x20,0x00,0x41,0x00,0x4e,0x00,0x44,0x00,0x20,0x00,0x4e,
-0x00,0x4f,0x00,0x4e,0x00,0x49,0x00,0x4e,0x00,0x46,0x00,0x52,0x00,0x49,0x00,0x4e,
-0x00,0x47,0x00,0x45,0x00,0x4d,0x00,0x45,0x00,0x4e,0x00,0x54,0x00,0x20,0x00,0x4f,
-0x00,0x46,0x00,0x20,0x00,0x43,0x00,0x4f,0x00,0x50,0x00,0x59,0x00,0x52,0x00,0x49,
-0x00,0x47,0x00,0x48,0x00,0x54,0x00,0x2c,0x00,0x20,0x00,0x50,0x00,0x41,0x00,0x54,
-0x00,0x45,0x00,0x4e,0x00,0x54,0x00,0x2c,0x00,0x20,0x00,0x54,0x00,0x52,0x00,0x41,
-0x00,0x44,0x00,0x45,0x00,0x4d,0x00,0x41,0x00,0x52,0x00,0x4b,0x00,0x2c,0x00,0x20,
-0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x4f,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x52,
-0x00,0x20,0x00,0x52,0x00,0x49,0x00,0x47,0x00,0x48,0x00,0x54,0x00,0x2e,0x00,0x20,
-0x00,0x49,0x00,0x4e,0x00,0x20,0x00,0x4e,0x00,0x4f,0x00,0x20,0x00,0x45,0x00,0x56,
-0x00,0x45,0x00,0x4e,0x00,0x54,0x00,0x20,0x00,0x53,0x00,0x48,0x00,0x41,0x00,0x4c,
-0x00,0x4c,0x00,0x20,0x00,0x42,0x00,0x49,0x00,0x54,0x00,0x53,0x00,0x54,0x00,0x52,
-0x00,0x45,0x00,0x41,0x00,0x4d,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x54,
-0x00,0x48,0x00,0x45,0x00,0x20,0x00,0x47,0x00,0x4e,0x00,0x4f,0x00,0x4d,0x00,0x45,
-0x00,0x20,0x00,0x46,0x00,0x4f,0x00,0x55,0x00,0x4e,0x00,0x44,0x00,0x41,0x00,0x54,
-0x00,0x49,0x00,0x4f,0x00,0x4e,0x00,0x20,0x00,0x42,0x00,0x45,0x00,0x20,0x00,0x4c,
-0x00,0x49,0x00,0x41,0x00,0x42,0x00,0x4c,0x00,0x45,0x00,0x20,0x00,0x46,0x00,0x4f,
-0x00,0x52,0x00,0x20,0x00,0x41,0x00,0x4e,0x00,0x59,0x00,0x20,0x00,0x43,0x00,0x4c,
-0x00,0x41,0x00,0x49,0x00,0x4d,0x00,0x2c,0x00,0x20,0x00,0x44,0x00,0x41,0x00,0x4d,
-0x00,0x41,0x00,0x47,0x00,0x45,0x00,0x53,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,
-0x00,0x4f,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x52,0x00,0x20,0x00,0x4c,0x00,0x49,
-0x00,0x41,0x00,0x42,0x00,0x49,0x00,0x4c,0x00,0x49,0x00,0x54,0x00,0x59,0x00,0x2c,
-0x00,0x20,0x00,0x49,0x00,0x4e,0x00,0x43,0x00,0x4c,0x00,0x55,0x00,0x44,0x00,0x49,
-0x00,0x4e,0x00,0x47,0x00,0x20,0x00,0x41,0x00,0x4e,0x00,0x59,0x00,0x20,0x00,0x47,
-0x00,0x45,0x00,0x4e,0x00,0x45,0x00,0x52,0x00,0x41,0x00,0x4c,0x00,0x2c,0x00,0x20,
-0x00,0x53,0x00,0x50,0x00,0x45,0x00,0x43,0x00,0x49,0x00,0x41,0x00,0x4c,0x00,0x2c,
-0x00,0x20,0x00,0x49,0x00,0x4e,0x00,0x44,0x00,0x49,0x00,0x52,0x00,0x45,0x00,0x43,
-0x00,0x54,0x00,0x2c,0x00,0x20,0x00,0x49,0x00,0x4e,0x00,0x43,0x00,0x49,0x00,0x44,
-0x00,0x45,0x00,0x4e,0x00,0x54,0x00,0x41,0x00,0x4c,0x00,0x2c,0x00,0x20,0x00,0x4f,
-0x00,0x52,0x00,0x20,0x00,0x43,0x00,0x4f,0x00,0x4e,0x00,0x53,0x00,0x45,0x00,0x51,
-0x00,0x55,0x00,0x45,0x00,0x4e,0x00,0x54,0x00,0x49,0x00,0x41,0x00,0x4c,0x00,0x20,
-0x00,0x44,0x00,0x41,0x00,0x4d,0x00,0x41,0x00,0x47,0x00,0x45,0x00,0x53,0x00,0x2c,
-0x00,0x20,0x00,0x57,0x00,0x48,0x00,0x45,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x52,
-0x00,0x20,0x00,0x49,0x00,0x4e,0x00,0x20,0x00,0x41,0x00,0x4e,0x00,0x20,0x00,0x41,
-0x00,0x43,0x00,0x54,0x00,0x49,0x00,0x4f,0x00,0x4e,0x00,0x20,0x00,0x4f,0x00,0x46,
-0x00,0x20,0x00,0x43,0x00,0x4f,0x00,0x4e,0x00,0x54,0x00,0x52,0x00,0x41,0x00,0x43,
-0x00,0x54,0x00,0x2c,0x00,0x20,0x00,0x54,0x00,0x4f,0x00,0x52,0x00,0x54,0x00,0x20,
-0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x4f,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x52,
-0x00,0x57,0x00,0x49,0x00,0x53,0x00,0x45,0x00,0x2c,0x00,0x20,0x00,0x41,0x00,0x52,
-0x00,0x49,0x00,0x53,0x00,0x49,0x00,0x4e,0x00,0x47,0x00,0x20,0x00,0x46,0x00,0x52,
-0x00,0x4f,0x00,0x4d,0x00,0x2c,0x00,0x20,0x00,0x4f,0x00,0x55,0x00,0x54,0x00,0x20,
-0x00,0x4f,0x00,0x46,0x00,0x20,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x20,0x00,0x55,
-0x00,0x53,0x00,0x45,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x49,0x00,0x4e,
-0x00,0x41,0x00,0x42,0x00,0x49,0x00,0x4c,0x00,0x49,0x00,0x54,0x00,0x59,0x00,0x20,
-0x00,0x54,0x00,0x4f,0x00,0x20,0x00,0x55,0x00,0x53,0x00,0x45,0x00,0x20,0x00,0x54,
-0x00,0x48,0x00,0x45,0x00,0x20,0x00,0x46,0x00,0x4f,0x00,0x4e,0x00,0x54,0x00,0x20,
-0x00,0x53,0x00,0x4f,0x00,0x46,0x00,0x54,0x00,0x57,0x00,0x41,0x00,0x52,0x00,0x45,
-0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x46,0x00,0x52,0x00,0x4f,0x00,0x4d,
-0x00,0x20,0x00,0x4f,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x52,0x00,0x20,0x00,0x44,
-0x00,0x45,0x00,0x41,0x00,0x4c,0x00,0x49,0x00,0x4e,0x00,0x47,0x00,0x53,0x00,0x20,
-0x00,0x49,0x00,0x4e,0x00,0x20,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x20,0x00,0x46,
-0x00,0x4f,0x00,0x4e,0x00,0x54,0x00,0x20,0x00,0x53,0x00,0x4f,0x00,0x46,0x00,0x54,
-0x00,0x57,0x00,0x41,0x00,0x52,0x00,0x45,0x00,0x2e,0x00,0x0a,0x00,0x0a,0x00,0x45,
-0x00,0x78,0x00,0x63,0x00,0x65,0x00,0x70,0x00,0x74,0x00,0x20,0x00,0x61,0x00,0x73,
-0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x61,0x00,0x69,0x00,0x6e,
-0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x20,0x00,0x74,0x00,0x68,
-0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x6e,0x00,0x6f,0x00,0x74,0x00,0x69,0x00,0x63,
-0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x6e,
-0x00,0x61,0x00,0x6d,0x00,0x65,0x00,0x73,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,
-0x00,0x47,0x00,0x6e,0x00,0x6f,0x00,0x6d,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x74,
-0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x47,0x00,0x6e,0x00,0x6f,0x00,0x6d,0x00,0x65,
-0x00,0x20,0x00,0x46,0x00,0x6f,0x00,0x75,0x00,0x6e,0x00,0x64,0x00,0x61,0x00,0x74,
-0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x2c,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,
-0x00,0x20,0x00,0x42,0x00,0x69,0x00,0x74,0x00,0x73,0x00,0x74,0x00,0x72,0x00,0x65,
-0x00,0x61,0x00,0x6d,0x00,0x20,0x00,0x49,0x00,0x6e,0x00,0x63,0x00,0x2e,0x00,0x2c,
-0x00,0x20,0x00,0x73,0x00,0x68,0x00,0x61,0x00,0x6c,0x00,0x6c,0x00,0x20,0x00,0x6e,
-0x00,0x6f,0x00,0x74,0x00,0x20,0x00,0x62,0x00,0x65,0x00,0x20,0x00,0x75,0x00,0x73,
-0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x20,0x00,0x61,0x00,0x64,
-0x00,0x76,0x00,0x65,0x00,0x72,0x00,0x74,0x00,0x69,0x00,0x73,0x00,0x69,0x00,0x6e,
-0x00,0x67,0x00,0x20,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x6f,0x00,0x74,0x00,0x68,
-0x00,0x65,0x00,0x72,0x00,0x77,0x00,0x69,0x00,0x73,0x00,0x65,0x00,0x20,0x00,0x74,
-0x00,0x6f,0x00,0x20,0x00,0x70,0x00,0x72,0x00,0x6f,0x00,0x6d,0x00,0x6f,0x00,0x74,
-0x00,0x65,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x73,0x00,0x61,
-0x00,0x6c,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x75,0x00,0x73,0x00,0x65,0x00,0x20,
-0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x6f,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x72,
-0x00,0x20,0x00,0x64,0x00,0x65,0x00,0x61,0x00,0x6c,0x00,0x69,0x00,0x6e,0x00,0x67,
-0x00,0x73,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x69,
-0x00,0x73,0x00,0x20,0x00,0x46,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x53,
-0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x20,
-0x00,0x77,0x00,0x69,0x00,0x74,0x00,0x68,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,
-0x00,0x70,0x00,0x72,0x00,0x69,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x77,0x00,0x72,
-0x00,0x69,0x00,0x74,0x00,0x74,0x00,0x65,0x00,0x6e,0x00,0x20,0x00,0x61,0x00,0x75,
-0x00,0x74,0x00,0x68,0x00,0x6f,0x00,0x72,0x00,0x69,0x00,0x7a,0x00,0x61,0x00,0x74,
-0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x66,0x00,0x72,0x00,0x6f,0x00,0x6d,
-0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x47,0x00,0x6e,0x00,0x6f,
-0x00,0x6d,0x00,0x65,0x00,0x20,0x00,0x46,0x00,0x6f,0x00,0x75,0x00,0x6e,0x00,0x64,
-0x00,0x61,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x6f,0x00,0x72,
-0x00,0x20,0x00,0x42,0x00,0x69,0x00,0x74,0x00,0x73,0x00,0x74,0x00,0x72,0x00,0x65,
-0x00,0x61,0x00,0x6d,0x00,0x20,0x00,0x49,0x00,0x6e,0x00,0x63,0x00,0x2e,0x00,0x2c,
-0x00,0x20,0x00,0x72,0x00,0x65,0x00,0x73,0x00,0x70,0x00,0x65,0x00,0x63,0x00,0x74,
-0x00,0x69,0x00,0x76,0x00,0x65,0x00,0x6c,0x00,0x79,0x00,0x2e,0x00,0x20,0x00,0x46,
-0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x66,0x00,0x75,0x00,0x72,0x00,0x74,0x00,0x68,
-0x00,0x65,0x00,0x72,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x66,0x00,0x6f,0x00,0x72,
-0x00,0x6d,0x00,0x61,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x2c,0x00,0x20,
-0x00,0x63,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x61,0x00,0x63,0x00,0x74,0x00,0x3a,
-0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x73,0x00,0x20,0x00,0x61,
-0x00,0x74,0x00,0x20,0x00,0x67,0x00,0x6e,0x00,0x6f,0x00,0x6d,0x00,0x65,0x00,0x20,
-0x00,0x64,0x00,0x6f,0x00,0x74,0x00,0x20,0x00,0x6f,0x00,0x72,0x00,0x67,0x00,0x2e,
-0x00,0x20,0x00,0x0a,0x00,0x00,0x46,0x6f,0x6e,0x74,0x73,0x20,0x61,0x72,0x65,0x20,
-0x28,0x63,0x29,0x20,0x42,0x69,0x74,0x73,0x74,0x72,0x65,0x61,0x6d,0x20,0x28,0x73,
-0x65,0x65,0x20,0x62,0x65,0x6c,0x6f,0x77,0x29,0x2e,0x20,0x44,0x65,0x6a,0x61,0x56,
-0x75,0x20,0x63,0x68,0x61,0x6e,0x67,0x65,0x73,0x20,0x61,0x72,0x65,0x20,0x69,0x6e,
-0x20,0x70,0x75,0x62,0x6c,0x69,0x63,0x20,0x64,0x6f,0x6d,0x61,0x69,0x6e,0x2e,0x0a,
-0x0a,0x42,0x69,0x74,0x73,0x74,0x72,0x65,0x61,0x6d,0x20,0x56,0x65,0x72,0x61,0x20,
-0x46,0x6f,0x6e,0x74,0x73,0x20,0x43,0x6f,0x70,0x79,0x72,0x69,0x67,0x68,0x74,0x0a,
-0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,
-0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x0a,0x0a,
-0x43,0x6f,0x70,0x79,0x72,0x69,0x67,0x68,0x74,0x20,0x28,0x63,0x29,0x20,0x32,0x30,
-0x30,0x33,0x20,0x62,0x79,0x20,0x42,0x69,0x74,0x73,0x74,0x72,0x65,0x61,0x6d,0x2c,
-0x20,0x49,0x6e,0x63,0x2e,0x20,0x41,0x6c,0x6c,0x20,0x52,0x69,0x67,0x68,0x74,0x73,
-0x20,0x52,0x65,0x73,0x65,0x72,0x76,0x65,0x64,0x2e,0x20,0x42,0x69,0x74,0x73,0x74,
-0x72,0x65,0x61,0x6d,0x20,0x56,0x65,0x72,0x61,0x20,0x69,0x73,0x20,0x61,0x20,0x74,
-0x72,0x61,0x64,0x65,0x6d,0x61,0x72,0x6b,0x20,0x6f,0x66,0x20,0x42,0x69,0x74,0x73,
-0x74,0x72,0x65,0x61,0x6d,0x2c,0x20,0x49,0x6e,0x63,0x2e,0x0a,0x0a,0x50,0x65,0x72,
-0x6d,0x69,0x73,0x73,0x69,0x6f,0x6e,0x20,0x69,0x73,0x20,0x68,0x65,0x72,0x65,0x62,
-0x79,0x20,0x67,0x72,0x61,0x6e,0x74,0x65,0x64,0x2c,0x20,0x66,0x72,0x65,0x65,0x20,
-0x6f,0x66,0x20,0x63,0x68,0x61,0x72,0x67,0x65,0x2c,0x20,0x74,0x6f,0x20,0x61,0x6e,
-0x79,0x20,0x70,0x65,0x72,0x73,0x6f,0x6e,0x20,0x6f,0x62,0x74,0x61,0x69,0x6e,0x69,
-0x6e,0x67,0x20,0x61,0x20,0x63,0x6f,0x70,0x79,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,
-0x20,0x66,0x6f,0x6e,0x74,0x73,0x20,0x61,0x63,0x63,0x6f,0x6d,0x70,0x61,0x6e,0x79,
-0x69,0x6e,0x67,0x20,0x74,0x68,0x69,0x73,0x20,0x6c,0x69,0x63,0x65,0x6e,0x73,0x65,
-0x20,0x28,0x22,0x46,0x6f,0x6e,0x74,0x73,0x22,0x29,0x20,0x61,0x6e,0x64,0x20,0x61,
-0x73,0x73,0x6f,0x63,0x69,0x61,0x74,0x65,0x64,0x20,0x64,0x6f,0x63,0x75,0x6d,0x65,
-0x6e,0x74,0x61,0x74,0x69,0x6f,0x6e,0x20,0x66,0x69,0x6c,0x65,0x73,0x20,0x28,0x74,
-0x68,0x65,0x20,0x22,0x46,0x6f,0x6e,0x74,0x20,0x53,0x6f,0x66,0x74,0x77,0x61,0x72,
-0x65,0x22,0x29,0x2c,0x20,0x74,0x6f,0x20,0x72,0x65,0x70,0x72,0x6f,0x64,0x75,0x63,
-0x65,0x20,0x61,0x6e,0x64,0x20,0x64,0x69,0x73,0x74,0x72,0x69,0x62,0x75,0x74,0x65,
-0x20,0x74,0x68,0x65,0x20,0x46,0x6f,0x6e,0x74,0x20,0x53,0x6f,0x66,0x74,0x77,0x61,
-0x72,0x65,0x2c,0x20,0x69,0x6e,0x63,0x6c,0x75,0x64,0x69,0x6e,0x67,0x20,0x77,0x69,
-0x74,0x68,0x6f,0x75,0x74,0x20,0x6c,0x69,0x6d,0x69,0x74,0x61,0x74,0x69,0x6f,0x6e,
-0x20,0x74,0x68,0x65,0x20,0x72,0x69,0x67,0x68,0x74,0x73,0x20,0x74,0x6f,0x20,0x75,
-0x73,0x65,0x2c,0x20,0x63,0x6f,0x70,0x79,0x2c,0x20,0x6d,0x65,0x72,0x67,0x65,0x2c,
-0x20,0x70,0x75,0x62,0x6c,0x69,0x73,0x68,0x2c,0x20,0x64,0x69,0x73,0x74,0x72,0x69,
-0x62,0x75,0x74,0x65,0x2c,0x20,0x61,0x6e,0x64,0x2f,0x6f,0x72,0x20,0x73,0x65,0x6c,
-0x6c,0x20,0x63,0x6f,0x70,0x69,0x65,0x73,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,
-0x46,0x6f,0x6e,0x74,0x20,0x53,0x6f,0x66,0x74,0x77,0x61,0x72,0x65,0x2c,0x20,0x61,
-0x6e,0x64,0x20,0x74,0x6f,0x20,0x70,0x65,0x72,0x6d,0x69,0x74,0x20,0x70,0x65,0x72,
-0x73,0x6f,0x6e,0x73,0x20,0x74,0x6f,0x20,0x77,0x68,0x6f,0x6d,0x20,0x74,0x68,0x65,
-0x20,0x46,0x6f,0x6e,0x74,0x20,0x53,0x6f,0x66,0x74,0x77,0x61,0x72,0x65,0x20,0x69,
-0x73,0x20,0x66,0x75,0x72,0x6e,0x69,0x73,0x68,0x65,0x64,0x20,0x74,0x6f,0x20,0x64,
-0x6f,0x20,0x73,0x6f,0x2c,0x20,0x73,0x75,0x62,0x6a,0x65,0x63,0x74,0x20,0x74,0x6f,
-0x20,0x74,0x68,0x65,0x20,0x66,0x6f,0x6c,0x6c,0x6f,0x77,0x69,0x6e,0x67,0x20,0x63,
-0x6f,0x6e,0x64,0x69,0x74,0x69,0x6f,0x6e,0x73,0x3a,0x0a,0x0a,0x54,0x68,0x65,0x20,
-0x61,0x62,0x6f,0x76,0x65,0x20,0x63,0x6f,0x70,0x79,0x72,0x69,0x67,0x68,0x74,0x20,
-0x61,0x6e,0x64,0x20,0x74,0x72,0x61,0x64,0x65,0x6d,0x61,0x72,0x6b,0x20,0x6e,0x6f,
-0x74,0x69,0x63,0x65,0x73,0x20,0x61,0x6e,0x64,0x20,0x74,0x68,0x69,0x73,0x20,0x70,
-0x65,0x72,0x6d,0x69,0x73,0x73,0x69,0x6f,0x6e,0x20,0x6e,0x6f,0x74,0x69,0x63,0x65,
-0x20,0x73,0x68,0x61,0x6c,0x6c,0x20,0x62,0x65,0x20,0x69,0x6e,0x63,0x6c,0x75,0x64,
-0x65,0x64,0x20,0x69,0x6e,0x20,0x61,0x6c,0x6c,0x20,0x63,0x6f,0x70,0x69,0x65,0x73,
-0x20,0x6f,0x66,0x20,0x6f,0x6e,0x65,0x20,0x6f,0x72,0x20,0x6d,0x6f,0x72,0x65,0x20,
-0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x46,0x6f,0x6e,0x74,0x20,0x53,0x6f,0x66,0x74,
-0x77,0x61,0x72,0x65,0x20,0x74,0x79,0x70,0x65,0x66,0x61,0x63,0x65,0x73,0x2e,0x0a,
-0x0a,0x54,0x68,0x65,0x20,0x46,0x6f,0x6e,0x74,0x20,0x53,0x6f,0x66,0x74,0x77,0x61,
-0x72,0x65,0x20,0x6d,0x61,0x79,0x20,0x62,0x65,0x20,0x6d,0x6f,0x64,0x69,0x66,0x69,
-0x65,0x64,0x2c,0x20,0x61,0x6c,0x74,0x65,0x72,0x65,0x64,0x2c,0x20,0x6f,0x72,0x20,
-0x61,0x64,0x64,0x65,0x64,0x20,0x74,0x6f,0x2c,0x20,0x61,0x6e,0x64,0x20,0x69,0x6e,
-0x20,0x70,0x61,0x72,0x74,0x69,0x63,0x75,0x6c,0x61,0x72,0x20,0x74,0x68,0x65,0x20,
-0x64,0x65,0x73,0x69,0x67,0x6e,0x73,0x20,0x6f,0x66,0x20,0x67,0x6c,0x79,0x70,0x68,
-0x73,0x20,0x6f,0x72,0x20,0x63,0x68,0x61,0x72,0x61,0x63,0x74,0x65,0x72,0x73,0x20,
-0x69,0x6e,0x20,0x74,0x68,0x65,0x20,0x46,0x6f,0x6e,0x74,0x73,0x20,0x6d,0x61,0x79,
-0x20,0x62,0x65,0x20,0x6d,0x6f,0x64,0x69,0x66,0x69,0x65,0x64,0x20,0x61,0x6e,0x64,
-0x20,0x61,0x64,0x64,0x69,0x74,0x69,0x6f,0x6e,0x61,0x6c,0x20,0x67,0x6c,0x79,0x70,
-0x68,0x73,0x20,0x6f,0x72,0x20,0x20,0x6f,0x72,0x20,0x63,0x68,0x61,0x72,0x61,0x63,
-0x74,0x65,0x72,0x73,0x20,0x6d,0x61,0x79,0x20,0x62,0x65,0x20,0x61,0x64,0x64,0x65,
-0x64,0x20,0x74,0x6f,0x20,0x74,0x68,0x65,0x20,0x46,0x6f,0x6e,0x74,0x73,0x2c,0x20,
-0x6f,0x6e,0x6c,0x79,0x20,0x69,0x66,0x20,0x74,0x68,0x65,0x20,0x66,0x6f,0x6e,0x74,
-0x73,0x20,0x61,0x72,0x65,0x20,0x72,0x65,0x6e,0x61,0x6d,0x65,0x64,0x20,0x74,0x6f,
-0x20,0x6e,0x61,0x6d,0x65,0x73,0x20,0x6e,0x6f,0x74,0x20,0x63,0x6f,0x6e,0x74,0x61,
-0x69,0x6e,0x69,0x6e,0x67,0x20,0x65,0x69,0x74,0x68,0x65,0x72,0x20,0x74,0x68,0x65,
-0x20,0x77,0x6f,0x72,0x64,0x73,0x20,0x22,0x42,0x69,0x74,0x73,0x74,0x72,0x65,0x61,
-0x6d,0x22,0x20,0x6f,0x72,0x20,0x74,0x68,0x65,0x20,0x77,0x6f,0x72,0x64,0x20,0x22,
-0x56,0x65,0x72,0x61,0x22,0x2e,0x0a,0x0a,0x54,0x68,0x69,0x73,0x20,0x4c,0x69,0x63,
-0x65,0x6e,0x73,0x65,0x20,0x62,0x65,0x63,0x6f,0x6d,0x65,0x73,0x20,0x6e,0x75,0x6c,
-0x6c,0x20,0x61,0x6e,0x64,0x20,0x76,0x6f,0x69,0x64,0x20,0x74,0x6f,0x20,0x74,0x68,
-0x65,0x20,0x65,0x78,0x74,0x65,0x6e,0x74,0x20,0x61,0x70,0x70,0x6c,0x69,0x63,0x61,
-0x62,0x6c,0x65,0x20,0x74,0x6f,0x20,0x46,0x6f,0x6e,0x74,0x73,0x20,0x6f,0x72,0x20,
-0x46,0x6f,0x6e,0x74,0x20,0x53,0x6f,0x66,0x74,0x77,0x61,0x72,0x65,0x20,0x74,0x68,
-0x61,0x74,0x20,0x68,0x61,0x73,0x20,0x62,0x65,0x65,0x6e,0x20,0x6d,0x6f,0x64,0x69,
-0x66,0x69,0x65,0x64,0x20,0x61,0x6e,0x64,0x20,0x69,0x73,0x20,0x64,0x69,0x73,0x74,
-0x72,0x69,0x62,0x75,0x74,0x65,0x64,0x20,0x75,0x6e,0x64,0x65,0x72,0x20,0x74,0x68,
-0x65,0x20,0x22,0x42,0x69,0x74,0x73,0x74,0x72,0x65,0x61,0x6d,0x20,0x56,0x65,0x72,
-0x61,0x22,0x20,0x6e,0x61,0x6d,0x65,0x73,0x2e,0x0a,0x0a,0x54,0x68,0x65,0x20,0x46,
-0x6f,0x6e,0x74,0x20,0x53,0x6f,0x66,0x74,0x77,0x61,0x72,0x65,0x20,0x6d,0x61,0x79,
-0x20,0x62,0x65,0x20,0x73,0x6f,0x6c,0x64,0x20,0x61,0x73,0x20,0x70,0x61,0x72,0x74,
-0x20,0x6f,0x66,0x20,0x61,0x20,0x6c,0x61,0x72,0x67,0x65,0x72,0x20,0x73,0x6f,0x66,
-0x74,0x77,0x61,0x72,0x65,0x20,0x70,0x61,0x63,0x6b,0x61,0x67,0x65,0x20,0x62,0x75,
-0x74,0x20,0x6e,0x6f,0x20,0x63,0x6f,0x70,0x79,0x20,0x6f,0x66,0x20,0x6f,0x6e,0x65,
-0x20,0x6f,0x72,0x20,0x6d,0x6f,0x72,0x65,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,
-0x46,0x6f,0x6e,0x74,0x20,0x53,0x6f,0x66,0x74,0x77,0x61,0x72,0x65,0x20,0x74,0x79,
-0x70,0x65,0x66,0x61,0x63,0x65,0x73,0x20,0x6d,0x61,0x79,0x20,0x62,0x65,0x20,0x73,
-0x6f,0x6c,0x64,0x20,0x62,0x79,0x20,0x69,0x74,0x73,0x65,0x6c,0x66,0x2e,0x0a,0x0a,
-0x54,0x48,0x45,0x20,0x46,0x4f,0x4e,0x54,0x20,0x53,0x4f,0x46,0x54,0x57,0x41,0x52,
-0x45,0x20,0x49,0x53,0x20,0x50,0x52,0x4f,0x56,0x49,0x44,0x45,0x44,0x20,0x22,0x41,
-0x53,0x20,0x49,0x53,0x22,0x2c,0x20,0x57,0x49,0x54,0x48,0x4f,0x55,0x54,0x20,0x57,
-0x41,0x52,0x52,0x41,0x4e,0x54,0x59,0x20,0x4f,0x46,0x20,0x41,0x4e,0x59,0x20,0x4b,
-0x49,0x4e,0x44,0x2c,0x20,0x45,0x58,0x50,0x52,0x45,0x53,0x53,0x20,0x4f,0x52,0x20,
-0x49,0x4d,0x50,0x4c,0x49,0x45,0x44,0x2c,0x20,0x49,0x4e,0x43,0x4c,0x55,0x44,0x49,
-0x4e,0x47,0x20,0x42,0x55,0x54,0x20,0x4e,0x4f,0x54,0x20,0x4c,0x49,0x4d,0x49,0x54,
-0x45,0x44,0x20,0x54,0x4f,0x20,0x41,0x4e,0x59,0x20,0x57,0x41,0x52,0x52,0x41,0x4e,
-0x54,0x49,0x45,0x53,0x20,0x4f,0x46,0x20,0x4d,0x45,0x52,0x43,0x48,0x41,0x4e,0x54,
-0x41,0x42,0x49,0x4c,0x49,0x54,0x59,0x2c,0x20,0x46,0x49,0x54,0x4e,0x45,0x53,0x53,
-0x20,0x46,0x4f,0x52,0x20,0x41,0x20,0x50,0x41,0x52,0x54,0x49,0x43,0x55,0x4c,0x41,
-0x52,0x20,0x50,0x55,0x52,0x50,0x4f,0x53,0x45,0x20,0x41,0x4e,0x44,0x20,0x4e,0x4f,
-0x4e,0x49,0x4e,0x46,0x52,0x49,0x4e,0x47,0x45,0x4d,0x45,0x4e,0x54,0x20,0x4f,0x46,
-0x20,0x43,0x4f,0x50,0x59,0x52,0x49,0x47,0x48,0x54,0x2c,0x20,0x50,0x41,0x54,0x45,
-0x4e,0x54,0x2c,0x20,0x54,0x52,0x41,0x44,0x45,0x4d,0x41,0x52,0x4b,0x2c,0x20,0x4f,
-0x52,0x20,0x4f,0x54,0x48,0x45,0x52,0x20,0x52,0x49,0x47,0x48,0x54,0x2e,0x20,0x49,
-0x4e,0x20,0x4e,0x4f,0x20,0x45,0x56,0x45,0x4e,0x54,0x20,0x53,0x48,0x41,0x4c,0x4c,
-0x20,0x42,0x49,0x54,0x53,0x54,0x52,0x45,0x41,0x4d,0x20,0x4f,0x52,0x20,0x54,0x48,
-0x45,0x20,0x47,0x4e,0x4f,0x4d,0x45,0x20,0x46,0x4f,0x55,0x4e,0x44,0x41,0x54,0x49,
-0x4f,0x4e,0x20,0x42,0x45,0x20,0x4c,0x49,0x41,0x42,0x4c,0x45,0x20,0x46,0x4f,0x52,
-0x20,0x41,0x4e,0x59,0x20,0x43,0x4c,0x41,0x49,0x4d,0x2c,0x20,0x44,0x41,0x4d,0x41,
-0x47,0x45,0x53,0x20,0x4f,0x52,0x20,0x4f,0x54,0x48,0x45,0x52,0x20,0x4c,0x49,0x41,
-0x42,0x49,0x4c,0x49,0x54,0x59,0x2c,0x20,0x49,0x4e,0x43,0x4c,0x55,0x44,0x49,0x4e,
-0x47,0x20,0x41,0x4e,0x59,0x20,0x47,0x45,0x4e,0x45,0x52,0x41,0x4c,0x2c,0x20,0x53,
-0x50,0x45,0x43,0x49,0x41,0x4c,0x2c,0x20,0x49,0x4e,0x44,0x49,0x52,0x45,0x43,0x54,
-0x2c,0x20,0x49,0x4e,0x43,0x49,0x44,0x45,0x4e,0x54,0x41,0x4c,0x2c,0x20,0x4f,0x52,
-0x20,0x43,0x4f,0x4e,0x53,0x45,0x51,0x55,0x45,0x4e,0x54,0x49,0x41,0x4c,0x20,0x44,
-0x41,0x4d,0x41,0x47,0x45,0x53,0x2c,0x20,0x57,0x48,0x45,0x54,0x48,0x45,0x52,0x20,
-0x49,0x4e,0x20,0x41,0x4e,0x20,0x41,0x43,0x54,0x49,0x4f,0x4e,0x20,0x4f,0x46,0x20,
-0x43,0x4f,0x4e,0x54,0x52,0x41,0x43,0x54,0x2c,0x20,0x54,0x4f,0x52,0x54,0x20,0x4f,
-0x52,0x20,0x4f,0x54,0x48,0x45,0x52,0x57,0x49,0x53,0x45,0x2c,0x20,0x41,0x52,0x49,
-0x53,0x49,0x4e,0x47,0x20,0x46,0x52,0x4f,0x4d,0x2c,0x20,0x4f,0x55,0x54,0x20,0x4f,
-0x46,0x20,0x54,0x48,0x45,0x20,0x55,0x53,0x45,0x20,0x4f,0x52,0x20,0x49,0x4e,0x41,
-0x42,0x49,0x4c,0x49,0x54,0x59,0x20,0x54,0x4f,0x20,0x55,0x53,0x45,0x20,0x54,0x48,
-0x45,0x20,0x46,0x4f,0x4e,0x54,0x20,0x53,0x4f,0x46,0x54,0x57,0x41,0x52,0x45,0x20,
-0x4f,0x52,0x20,0x46,0x52,0x4f,0x4d,0x20,0x4f,0x54,0x48,0x45,0x52,0x20,0x44,0x45,
-0x41,0x4c,0x49,0x4e,0x47,0x53,0x20,0x49,0x4e,0x20,0x54,0x48,0x45,0x20,0x46,0x4f,
-0x4e,0x54,0x20,0x53,0x4f,0x46,0x54,0x57,0x41,0x52,0x45,0x2e,0x0a,0x0a,0x45,0x78,
-0x63,0x65,0x70,0x74,0x20,0x61,0x73,0x20,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,
-0x64,0x20,0x69,0x6e,0x20,0x74,0x68,0x69,0x73,0x20,0x6e,0x6f,0x74,0x69,0x63,0x65,
-0x2c,0x20,0x74,0x68,0x65,0x20,0x6e,0x61,0x6d,0x65,0x73,0x20,0x6f,0x66,0x20,0x47,
-0x6e,0x6f,0x6d,0x65,0x2c,0x20,0x74,0x68,0x65,0x20,0x47,0x6e,0x6f,0x6d,0x65,0x20,
-0x46,0x6f,0x75,0x6e,0x64,0x61,0x74,0x69,0x6f,0x6e,0x2c,0x20,0x61,0x6e,0x64,0x20,
-0x42,0x69,0x74,0x73,0x74,0x72,0x65,0x61,0x6d,0x20,0x49,0x6e,0x63,0x2e,0x2c,0x20,
-0x73,0x68,0x61,0x6c,0x6c,0x20,0x6e,0x6f,0x74,0x20,0x62,0x65,0x20,0x75,0x73,0x65,
-0x64,0x20,0x69,0x6e,0x20,0x61,0x64,0x76,0x65,0x72,0x74,0x69,0x73,0x69,0x6e,0x67,
-0x20,0x6f,0x72,0x20,0x6f,0x74,0x68,0x65,0x72,0x77,0x69,0x73,0x65,0x20,0x74,0x6f,
-0x20,0x70,0x72,0x6f,0x6d,0x6f,0x74,0x65,0x20,0x74,0x68,0x65,0x20,0x73,0x61,0x6c,
-0x65,0x2c,0x20,0x75,0x73,0x65,0x20,0x6f,0x72,0x20,0x6f,0x74,0x68,0x65,0x72,0x20,
-0x64,0x65,0x61,0x6c,0x69,0x6e,0x67,0x73,0x20,0x69,0x6e,0x20,0x74,0x68,0x69,0x73,
-0x20,0x46,0x6f,0x6e,0x74,0x20,0x53,0x6f,0x66,0x74,0x77,0x61,0x72,0x65,0x20,0x77,
-0x69,0x74,0x68,0x6f,0x75,0x74,0x20,0x70,0x72,0x69,0x6f,0x72,0x20,0x77,0x72,0x69,
-0x74,0x74,0x65,0x6e,0x20,0x61,0x75,0x74,0x68,0x6f,0x72,0x69,0x7a,0x61,0x74,0x69,
-0x6f,0x6e,0x20,0x66,0x72,0x6f,0x6d,0x20,0x74,0x68,0x65,0x20,0x47,0x6e,0x6f,0x6d,
-0x65,0x20,0x46,0x6f,0x75,0x6e,0x64,0x61,0x74,0x69,0x6f,0x6e,0x20,0x6f,0x72,0x20,
-0x42,0x69,0x74,0x73,0x74,0x72,0x65,0x61,0x6d,0x20,0x49,0x6e,0x63,0x2e,0x2c,0x20,
-0x72,0x65,0x73,0x70,0x65,0x63,0x74,0x69,0x76,0x65,0x6c,0x79,0x2e,0x20,0x46,0x6f,
-0x72,0x20,0x66,0x75,0x72,0x74,0x68,0x65,0x72,0x20,0x69,0x6e,0x66,0x6f,0x72,0x6d,
-0x61,0x74,0x69,0x6f,0x6e,0x2c,0x20,0x63,0x6f,0x6e,0x74,0x61,0x63,0x74,0x3a,0x20,
-0x66,0x6f,0x6e,0x74,0x73,0x20,0x61,0x74,0x20,0x67,0x6e,0x6f,0x6d,0x65,0x20,0x64,
-0x6f,0x74,0x20,0x6f,0x72,0x67,0x2e,0x20,0x0a,0x00,0x00,0x68,0x00,0x74,0x00,0x74,
-0x00,0x70,0x00,0x3a,0x00,0x2f,0x00,0x2f,0x00,0x64,0x00,0x65,0x00,0x6a,0x00,0x61,
-0x00,0x76,0x00,0x75,0x00,0x2e,0x00,0x73,0x00,0x6f,0x00,0x75,0x00,0x72,0x00,0x63,
-0x00,0x65,0x00,0x66,0x00,0x6f,0x00,0x72,0x00,0x67,0x00,0x65,0x00,0x2e,0x00,0x6e,
-0x00,0x65,0x00,0x74,0x00,0x2f,0x00,0x77,0x00,0x69,0x00,0x6b,0x00,0x69,0x00,0x2f,
-0x00,0x69,0x00,0x6e,0x00,0x64,0x00,0x65,0x00,0x78,0x00,0x2e,0x00,0x70,0x00,0x68,
-0x00,0x70,0x00,0x2f,0x00,0x4c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,
-0x00,0x65,0x00,0x00,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x64,0x65,0x6a,0x61,0x76,
-0x75,0x2e,0x73,0x6f,0x75,0x72,0x63,0x65,0x66,0x6f,0x72,0x67,0x65,0x2e,0x6e,0x65,
-0x74,0x2f,0x77,0x69,0x6b,0x69,0x2f,0x69,0x6e,0x64,0x65,0x78,0x2e,0x70,0x68,0x70,
-0x2f,0x4c,0x69,0x63,0x65,0x6e,0x73,0x65,0x00,0x4c,0x69,0x67,0x61,0x74,0x75,0x72,
-0x65,0x73,0x00,0x4c,0x69,0x67,0x61,0x74,0x75,0x72,0x65,0x73,0x00,0x4c,0x69,0x67,
-0x61,0x74,0x75,0x72,0x65,0x6e,0x00,0x4c,0x65,0x67,0x61,0x74,0x75,0x72,0x65,0x00,
-0x4c,0x69,0x67,0x61,0x74,0x75,0x72,0x65,0x6e,0x00,0x43,0x75,0x72,0x73,0x69,0x76,
-0x65,0x20,0x63,0x6f,0x6e,0x6e,0x65,0x63,0x74,0x69,0x6f,0x6e,0x00,0x43,0x6f,0x6e,
-0x6e,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x64,0x65,0x73,0x20,0x43,0x75,0x72,0x73,
-0x69,0x76,0x65,0x73,0x00,0x43,0x75,0x72,0x73,0x69,0x65,0x76,0x65,0x20,0x76,0x65,
-0x72,0x62,0x69,0x6e,0x64,0x69,0x6e,0x67,0x00,0x46,0x72,0x61,0x63,0x74,0x69,0x6f,
-0x6e,0x73,0x00,0x46,0x72,0x61,0x63,0x74,0x69,0x6f,0x6e,0x73,0x00,0x42,0x72,0x65,
-0x75,0x6b,0x65,0x6e,0x00,0x41,0x6c,0x6c,0x20,0x54,0x79,0x70,0x6f,0x67,0x72,0x61,
-0x70,0x68,0x69,0x63,0x20,0x46,0x65,0x61,0x74,0x75,0x72,0x65,0x73,0x00,0x46,0x6f,
-0x6e,0x63,0x74,0x69,0x6f,0x6e,0x73,0x20,0x74,0x79,0x70,0x6f,0x67,0x72,0x61,0x70,
-0x68,0x69,0x71,0x75,0x65,0x73,0x00,0x41,0x6c,0x6c,0x65,0x20,0x74,0x79,0x70,0x6f,
-0x67,0x72,0x61,0x66,0x69,0x73,0x63,0x68,0x65,0x6e,0x20,0x4d,0x9a,0x67,0x6c,0x69,
-0x63,0x68,0x6b,0x65,0x69,0x74,0x65,0x6e,0x00,0x46,0x75,0x6e,0x7a,0x69,0x6f,0x6e,
-0x69,0x20,0x54,0x69,0x70,0x6f,0x67,0x72,0x61,0x66,0x69,0x63,0x68,0x65,0x00,0x41,
-0x6c,0x6c,0x65,0x20,0x74,0x79,0x70,0x6f,0x67,0x72,0x61,0x66,0x69,0x73,0x63,0x68,
-0x65,0x20,0x6b,0x65,0x6e,0x6d,0x65,0x72,0x6b,0x65,0x6e,0x00,0x52,0x65,0x71,0x75,
-0x69,0x72,0x65,0x64,0x20,0x4c,0x69,0x67,0x61,0x74,0x75,0x72,0x65,0x73,0x00,0x4c,
-0x69,0x67,0x61,0x74,0x75,0x72,0x65,0x73,0x20,0x52,0x65,0x71,0x75,0x69,0x73,0x65,
-0x73,0x00,0x56,0x65,0x72,0x65,0x69,0x73,0x74,0x65,0x20,0x6c,0x69,0x67,0x61,0x74,
-0x75,0x72,0x65,0x6e,0x00,0x43,0x6f,0x6d,0x6d,0x6f,0x6e,0x20,0x4c,0x69,0x67,0x61,
-0x74,0x75,0x72,0x65,0x73,0x00,0x4c,0x69,0x67,0x61,0x74,0x75,0x72,0x65,0x73,0x20,
-0x55,0x73,0x75,0x65,0x6c,0x6c,0x65,0x73,0x00,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x65,
-0x20,0x4c,0x69,0x67,0x61,0x74,0x75,0x72,0x65,0x6e,0x00,0x4c,0x65,0x67,0x61,0x74,
-0x75,0x72,0x65,0x20,0x70,0x69,0x9d,0x20,0x43,0x6f,0x6d,0x75,0x6e,0x69,0x00,0x47,
-0x65,0x6d,0x65,0x65,0x6e,0x73,0x63,0x68,0x61,0x70,0x70,0x65,0x6c,0x69,0x6a,0x6b,
-0x65,0x20,0x4c,0x69,0x67,0x61,0x74,0x75,0x72,0x65,0x6e,0x00,0x52,0x61,0x72,0x65,
-0x20,0x4c,0x69,0x67,0x61,0x74,0x75,0x72,0x65,0x73,0x00,0x4c,0x69,0x67,0x61,0x74,
-0x75,0x72,0x65,0x73,0x20,0x52,0x61,0x72,0x65,0x73,0x00,0x53,0x65,0x6c,0x74,0x65,
-0x6e,0x65,0x20,0x4c,0x69,0x67,0x61,0x74,0x75,0x72,0x65,0x6e,0x00,0x4c,0x65,0x67,
-0x61,0x74,0x75,0x72,0x65,0x20,0x52,0x61,0x72,0x65,0x00,0x5a,0x65,0x6c,0x64,0x7a,
-0x61,0x6d,0x65,0x20,0x6c,0x69,0x67,0x61,0x74,0x75,0x72,0x65,0x6e,0x00,0x43,0x75,
-0x72,0x73,0x69,0x76,0x65,0x00,0x50,0x6c,0x65,0x69,0x6e,0x65,0x6d,0x65,0x6e,0x74,
-0x20,0x63,0x6f,0x6e,0x6e,0x65,0x63,0x74,0x8e,0x65,0x73,0x00,0x43,0x75,0x72,0x73,
-0x69,0x65,0x66,0x00,0x44,0x69,0x61,0x67,0x6f,0x6e,0x61,0x6c,0x20,0x46,0x72,0x61,
-0x63,0x74,0x69,0x6f,0x6e,0x73,0x00,0x46,0x72,0x61,0x63,0x74,0x69,0x6f,0x6e,0x73,
-0x20,0x65,0x6e,0x20,0x44,0x69,0x61,0x67,0x6f,0x6e,0x61,0x6c,0x65,0x00,0x44,0x69,
-0x61,0x67,0x6f,0x6e,0x61,0x6c,0x65,0x72,0x20,0x42,0x72,0x75,0x63,0x68,0x00,0x46,
-0x72,0x61,0x7a,0x69,0x6f,0x6e,0x69,0x20,0x44,0x69,0x61,0x67,0x6f,0x6e,0x61,0x6c,
-0x69,0x00,0x44,0x69,0x61,0x67,0x6f,0x6e,0x61,0x6c,0x65,0x20,0x62,0x72,0x65,0x75,
-0x6b,0x65,0x6e,0x00,0x41,0x6c,0x6c,0x20,0x54,0x79,0x70,0x65,0x20,0x46,0x65,0x61,
-0x74,0x75,0x72,0x65,0x73,0x00,0x54,0x6f,0x75,0x74,0x65,0x73,0x20,0x66,0x6f,0x6e,
-0x63,0x74,0x69,0x6f,0x6e,0x73,0x20,0x74,0x79,0x70,0x6f,0x67,0x72,0x61,0x70,0x68,
-0x69,0x71,0x75,0x65,0x73,0x00,0x41,0x6c,0x6c,0x65,0x20,0x41,0x75,0x73,0x7a,0x65,
-0x69,0x63,0x68,0x6e,0x75,0x6e,0x67,0x73,0x61,0x72,0x74,0x65,0x6e,0x00,0x54,0x75,
-0x74,0x74,0x65,0x20,0x6c,0x65,0x20,0x46,0x75,0x6e,0x7a,0x69,0x6f,0x6e,0x69,0x00,
-0x41,0x6c,0x6c,0x65,0x20,0x74,0x79,0x70,0x65,0x6b,0x65,0x6e,0x6d,0x65,0x72,0x6b,
-0x65,0x6e,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xab,0x00,0x5a,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x0c,0x31,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,
-0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,
-0x00,0x0d,0x00,0x0e,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,
-0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,0x00,0x1b,0x00,0x1c,
-0x00,0x1d,0x00,0x1e,0x00,0x1f,0x00,0x20,0x00,0x21,0x00,0x22,0x00,0x23,0x00,0x24,
-0x00,0x25,0x00,0x26,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x2a,0x00,0x2b,0x00,0x2c,
-0x00,0x2d,0x00,0x2e,0x00,0x2f,0x00,0x30,0x00,0x31,0x00,0x32,0x00,0x33,0x00,0x34,
-0x00,0x35,0x00,0x36,0x00,0x37,0x00,0x38,0x00,0x39,0x00,0x3a,0x00,0x3b,0x00,0x3c,
-0x00,0x3d,0x00,0x3e,0x00,0x3f,0x00,0x40,0x00,0x41,0x00,0x42,0x00,0x43,0x00,0x44,
-0x00,0x45,0x00,0x46,0x00,0x47,0x00,0x48,0x00,0x49,0x00,0x4a,0x00,0x4b,0x00,0x4c,
-0x00,0x4d,0x00,0x4e,0x00,0x4f,0x00,0x50,0x00,0x51,0x00,0x52,0x00,0x53,0x00,0x54,
-0x00,0x55,0x00,0x56,0x00,0x57,0x00,0x58,0x00,0x59,0x00,0x5a,0x00,0x5b,0x00,0x5c,
-0x00,0x5d,0x00,0x5e,0x00,0x5f,0x00,0x60,0x00,0x61,0x00,0xac,0x00,0xa3,0x00,0x84,
-0x00,0x85,0x00,0xbd,0x00,0x96,0x00,0xe8,0x00,0x86,0x00,0x8e,0x00,0x8b,0x00,0x9d,
-0x00,0xa9,0x00,0xa4,0x01,0x02,0x00,0x8a,0x00,0xda,0x00,0x83,0x00,0x93,0x00,0xf2,
-0x00,0xf3,0x00,0x8d,0x00,0x97,0x00,0x88,0x00,0xc3,0x00,0xde,0x00,0xf1,0x00,0x9e,
-0x00,0xaa,0x00,0xf5,0x00,0xf4,0x00,0xf6,0x00,0xa2,0x00,0xad,0x00,0xc9,0x00,0xc7,
-0x00,0xae,0x00,0x62,0x00,0x63,0x00,0x90,0x00,0x64,0x00,0xcb,0x00,0x65,0x00,0xc8,
-0x00,0xca,0x00,0xcf,0x00,0xcc,0x00,0xcd,0x00,0xce,0x00,0xe9,0x00,0x66,0x00,0xd3,
-0x00,0xd0,0x00,0xd1,0x00,0xaf,0x00,0x67,0x00,0xf0,0x00,0x91,0x00,0xd6,0x00,0xd4,
-0x00,0xd5,0x00,0x68,0x00,0xeb,0x00,0xed,0x00,0x89,0x00,0x6a,0x00,0x69,0x00,0x6b,
-0x00,0x6d,0x00,0x6c,0x00,0x6e,0x00,0xa0,0x00,0x6f,0x00,0x71,0x00,0x70,0x00,0x72,
-0x00,0x73,0x00,0x75,0x00,0x74,0x00,0x76,0x00,0x77,0x00,0xea,0x00,0x78,0x00,0x7a,
-0x00,0x79,0x00,0x7b,0x00,0x7d,0x00,0x7c,0x00,0xb8,0x00,0xa1,0x00,0x7f,0x00,0x7e,
-0x00,0x80,0x00,0x81,0x00,0xec,0x00,0xee,0x00,0xba,0x01,0x03,0x01,0x04,0x01,0x05,
-0x01,0x06,0x01,0x07,0x01,0x08,0x00,0xfd,0x00,0xfe,0x01,0x09,0x01,0x0a,0x01,0x0b,
-0x01,0x0c,0x00,0xff,0x01,0x00,0x01,0x0d,0x01,0x0e,0x01,0x0f,0x01,0x01,0x01,0x10,
-0x01,0x11,0x01,0x12,0x01,0x13,0x01,0x14,0x01,0x15,0x01,0x16,0x01,0x17,0x01,0x18,
-0x01,0x19,0x01,0x1a,0x01,0x1b,0x00,0xf8,0x00,0xf9,0x01,0x1c,0x01,0x1d,0x01,0x1e,
-0x01,0x1f,0x01,0x20,0x01,0x21,0x01,0x22,0x01,0x23,0x01,0x24,0x01,0x25,0x01,0x26,
-0x01,0x27,0x01,0x28,0x01,0x29,0x01,0x2a,0x01,0x2b,0x00,0xfa,0x00,0xd7,0x01,0x2c,
-0x01,0x2d,0x01,0x2e,0x01,0x2f,0x01,0x30,0x01,0x31,0x01,0x32,0x01,0x33,0x01,0x34,
-0x01,0x35,0x01,0x36,0x01,0x37,0x01,0x38,0x01,0x39,0x01,0x3a,0x00,0xe2,0x00,0xe3,
-0x01,0x3b,0x01,0x3c,0x01,0x3d,0x01,0x3e,0x01,0x3f,0x01,0x40,0x01,0x41,0x01,0x42,
-0x01,0x43,0x01,0x44,0x01,0x45,0x01,0x46,0x01,0x47,0x01,0x48,0x01,0x49,0x00,0xb0,
-0x00,0xb1,0x01,0x4a,0x01,0x4b,0x01,0x4c,0x01,0x4d,0x01,0x4e,0x01,0x4f,0x01,0x50,
-0x01,0x51,0x01,0x52,0x01,0x53,0x00,0xfb,0x00,0xfc,0x00,0xe4,0x00,0xe5,0x01,0x54,
-0x01,0x55,0x01,0x56,0x01,0x57,0x01,0x58,0x01,0x59,0x01,0x5a,0x01,0x5b,0x01,0x5c,
-0x01,0x5d,0x01,0x5e,0x01,0x5f,0x01,0x60,0x01,0x61,0x01,0x62,0x01,0x63,0x01,0x64,
-0x01,0x65,0x01,0x66,0x01,0x67,0x01,0x68,0x01,0x69,0x00,0xbb,0x01,0x6a,0x01,0x6b,
-0x01,0x6c,0x01,0x6d,0x00,0xe6,0x00,0xe7,0x01,0x6e,0x01,0x6f,0x01,0x70,0x01,0x71,
-0x01,0x72,0x01,0x73,0x01,0x74,0x01,0x75,0x01,0x76,0x01,0x77,0x01,0x78,0x01,0x79,
-0x01,0x7a,0x01,0x7b,0x01,0x7c,0x01,0x7d,0x01,0x7e,0x01,0x7f,0x01,0x80,0x00,0xa6,
-0x01,0x81,0x01,0x82,0x01,0x83,0x01,0x84,0x01,0x85,0x01,0x86,0x01,0x87,0x01,0x88,
-0x01,0x89,0x01,0x8a,0x01,0x8b,0x01,0x8c,0x01,0x8d,0x01,0x8e,0x01,0x8f,0x01,0x90,
-0x01,0x91,0x01,0x92,0x01,0x93,0x01,0x94,0x01,0x95,0x01,0x96,0x01,0x97,0x01,0x98,
-0x01,0x99,0x01,0x9a,0x01,0x9b,0x01,0x9c,0x01,0x9d,0x01,0x9e,0x01,0x9f,0x01,0xa0,
-0x01,0xa1,0x01,0xa2,0x01,0xa3,0x01,0xa4,0x01,0xa5,0x01,0xa6,0x01,0xa7,0x01,0xa8,
-0x01,0xa9,0x01,0xaa,0x01,0xab,0x01,0xac,0x01,0xad,0x01,0xae,0x01,0xaf,0x01,0xb0,
-0x01,0xb1,0x01,0xb2,0x01,0xb3,0x01,0xb4,0x01,0xb5,0x01,0xb6,0x01,0xb7,0x01,0xb8,
-0x01,0xb9,0x01,0xba,0x01,0xbb,0x01,0xbc,0x01,0xbd,0x01,0xbe,0x01,0xbf,0x01,0xc0,
-0x01,0xc1,0x01,0xc2,0x01,0xc3,0x01,0xc4,0x01,0xc5,0x01,0xc6,0x01,0xc7,0x01,0xc8,
-0x01,0xc9,0x01,0xca,0x01,0xcb,0x01,0xcc,0x01,0xcd,0x01,0xce,0x01,0xcf,0x01,0xd0,
-0x01,0xd1,0x01,0xd2,0x01,0xd3,0x01,0xd4,0x01,0xd5,0x01,0xd6,0x01,0xd7,0x01,0xd8,
-0x01,0xd9,0x01,0xda,0x01,0xdb,0x01,0xdc,0x01,0xdd,0x01,0xde,0x01,0xdf,0x01,0xe0,
-0x01,0xe1,0x01,0xe2,0x01,0xe3,0x01,0xe4,0x01,0xe5,0x01,0xe6,0x01,0xe7,0x01,0xe8,
-0x01,0xe9,0x01,0xea,0x01,0xeb,0x01,0xec,0x01,0xed,0x01,0xee,0x01,0xef,0x01,0xf0,
-0x01,0xf1,0x01,0xf2,0x01,0xf3,0x01,0xf4,0x01,0xf5,0x01,0xf6,0x01,0xf7,0x01,0xf8,
-0x01,0xf9,0x01,0xfa,0x01,0xfb,0x01,0xfc,0x01,0xfd,0x01,0xfe,0x01,0xff,0x02,0x00,
-0x02,0x01,0x02,0x02,0x02,0x03,0x02,0x04,0x02,0x05,0x02,0x06,0x02,0x07,0x02,0x08,
-0x02,0x09,0x02,0x0a,0x02,0x0b,0x02,0x0c,0x02,0x0d,0x02,0x0e,0x02,0x0f,0x02,0x10,
-0x02,0x11,0x02,0x12,0x02,0x13,0x02,0x14,0x02,0x15,0x02,0x16,0x02,0x17,0x02,0x18,
-0x02,0x19,0x02,0x1a,0x02,0x1b,0x02,0x1c,0x02,0x1d,0x02,0x1e,0x02,0x1f,0x02,0x20,
-0x02,0x21,0x02,0x22,0x02,0x23,0x02,0x24,0x02,0x25,0x02,0x26,0x02,0x27,0x02,0x28,
-0x02,0x29,0x02,0x2a,0x02,0x2b,0x02,0x2c,0x02,0x2d,0x02,0x2e,0x02,0x2f,0x02,0x30,
-0x02,0x31,0x02,0x32,0x02,0x33,0x02,0x34,0x02,0x35,0x02,0x36,0x02,0x37,0x02,0x38,
-0x02,0x39,0x02,0x3a,0x02,0x3b,0x02,0x3c,0x02,0x3d,0x02,0x3e,0x02,0x3f,0x02,0x40,
-0x02,0x41,0x02,0x42,0x02,0x43,0x02,0x44,0x02,0x45,0x02,0x46,0x02,0x47,0x02,0x48,
-0x02,0x49,0x02,0x4a,0x02,0x4b,0x02,0x4c,0x02,0x4d,0x02,0x4e,0x02,0x4f,0x02,0x50,
-0x02,0x51,0x02,0x52,0x02,0x53,0x02,0x54,0x02,0x55,0x02,0x56,0x02,0x57,0x02,0x58,
-0x02,0x59,0x02,0x5a,0x02,0x5b,0x02,0x5c,0x02,0x5d,0x02,0x5e,0x02,0x5f,0x02,0x60,
-0x02,0x61,0x02,0x62,0x02,0x63,0x02,0x64,0x02,0x65,0x02,0x66,0x02,0x67,0x02,0x68,
-0x02,0x69,0x02,0x6a,0x02,0x6b,0x02,0x6c,0x02,0x6d,0x02,0x6e,0x02,0x6f,0x02,0x70,
-0x02,0x71,0x02,0x72,0x02,0x73,0x02,0x74,0x02,0x75,0x02,0x76,0x02,0x77,0x02,0x78,
-0x02,0x79,0x02,0x7a,0x02,0x7b,0x02,0x7c,0x02,0x7d,0x02,0x7e,0x02,0x7f,0x02,0x80,
-0x02,0x81,0x02,0x82,0x02,0x83,0x02,0x84,0x02,0x85,0x02,0x86,0x02,0x87,0x02,0x88,
-0x02,0x89,0x02,0x8a,0x02,0x8b,0x02,0x8c,0x02,0x8d,0x02,0x8e,0x02,0x8f,0x02,0x90,
-0x02,0x91,0x02,0x92,0x02,0x93,0x02,0x94,0x02,0x95,0x02,0x96,0x02,0x97,0x02,0x98,
-0x02,0x99,0x02,0x9a,0x02,0x9b,0x02,0x9c,0x02,0x9d,0x02,0x9e,0x02,0x9f,0x02,0xa0,
-0x02,0xa1,0x02,0xa2,0x02,0xa3,0x02,0xa4,0x02,0xa5,0x00,0xd8,0x00,0xe1,0x02,0xa6,
-0x02,0xa7,0x02,0xa8,0x02,0xa9,0x02,0xaa,0x02,0xab,0x02,0xac,0x02,0xad,0x02,0xae,
-0x02,0xaf,0x02,0xb0,0x02,0xb1,0x02,0xb2,0x02,0xb3,0x02,0xb4,0x02,0xb5,0x00,0xdb,
-0x00,0xdc,0x00,0xdd,0x00,0xe0,0x00,0xd9,0x00,0xdf,0x02,0xb6,0x02,0xb7,0x02,0xb8,
-0x02,0xb9,0x02,0xba,0x02,0xbb,0x02,0xbc,0x02,0xbd,0x02,0xbe,0x02,0xbf,0x02,0xc0,
-0x02,0xc1,0x02,0xc2,0x02,0xc3,0x02,0xc4,0x02,0xc5,0x02,0xc6,0x02,0xc7,0x02,0xc8,
-0x02,0xc9,0x02,0xca,0x02,0xcb,0x02,0xcc,0x02,0xcd,0x02,0xce,0x02,0xcf,0x02,0xd0,
-0x02,0xd1,0x02,0xd2,0x02,0xd3,0x02,0xd4,0x02,0xd5,0x02,0xd6,0x02,0xd7,0x02,0xd8,
-0x02,0xd9,0x02,0xda,0x02,0xdb,0x02,0xdc,0x02,0xdd,0x02,0xde,0x02,0xdf,0x02,0xe0,
-0x02,0xe1,0x02,0xe2,0x02,0xe3,0x02,0xe4,0x02,0xe5,0x02,0xe6,0x02,0xe7,0x02,0xe8,
-0x02,0xe9,0x02,0xea,0x02,0xeb,0x02,0xec,0x02,0xed,0x02,0xee,0x02,0xef,0x02,0xf0,
-0x02,0xf1,0x02,0xf2,0x02,0xf3,0x02,0xf4,0x02,0xf5,0x02,0xf6,0x02,0xf7,0x02,0xf8,
-0x02,0xf9,0x02,0xfa,0x02,0xfb,0x02,0xfc,0x02,0xfd,0x02,0xfe,0x02,0xff,0x03,0x00,
-0x03,0x01,0x03,0x02,0x03,0x03,0x03,0x04,0x03,0x05,0x03,0x06,0x03,0x07,0x03,0x08,
-0x03,0x09,0x03,0x0a,0x03,0x0b,0x03,0x0c,0x03,0x0d,0x03,0x0e,0x03,0x0f,0x03,0x10,
-0x03,0x11,0x03,0x12,0x03,0x13,0x03,0x14,0x03,0x15,0x03,0x16,0x03,0x17,0x03,0x18,
-0x03,0x19,0x03,0x1a,0x03,0x1b,0x03,0x1c,0x03,0x1d,0x03,0x1e,0x03,0x1f,0x03,0x20,
-0x03,0x21,0x03,0x22,0x03,0x23,0x03,0x24,0x03,0x25,0x03,0x26,0x03,0x27,0x03,0x28,
-0x03,0x29,0x03,0x2a,0x03,0x2b,0x03,0x2c,0x03,0x2d,0x03,0x2e,0x03,0x2f,0x03,0x30,
-0x03,0x31,0x03,0x32,0x03,0x33,0x03,0x34,0x03,0x35,0x03,0x36,0x03,0x37,0x03,0x38,
-0x03,0x39,0x03,0x3a,0x03,0x3b,0x03,0x3c,0x03,0x3d,0x03,0x3e,0x03,0x3f,0x03,0x40,
-0x03,0x41,0x03,0x42,0x03,0x43,0x03,0x44,0x03,0x45,0x00,0x9f,0x03,0x46,0x03,0x47,
-0x03,0x48,0x03,0x49,0x03,0x4a,0x03,0x4b,0x03,0x4c,0x03,0x4d,0x03,0x4e,0x03,0x4f,
-0x03,0x50,0x03,0x51,0x03,0x52,0x03,0x53,0x03,0x54,0x03,0x55,0x03,0x56,0x03,0x57,
-0x03,0x58,0x03,0x59,0x03,0x5a,0x03,0x5b,0x00,0x9b,0x03,0x5c,0x03,0x5d,0x03,0x5e,
-0x03,0x5f,0x03,0x60,0x03,0x61,0x03,0x62,0x03,0x63,0x03,0x64,0x03,0x65,0x03,0x66,
-0x03,0x67,0x03,0x68,0x03,0x69,0x03,0x6a,0x03,0x6b,0x03,0x6c,0x03,0x6d,0x03,0x6e,
-0x03,0x6f,0x03,0x70,0x03,0x71,0x03,0x72,0x03,0x73,0x03,0x74,0x03,0x75,0x03,0x76,
-0x03,0x77,0x03,0x78,0x03,0x79,0x03,0x7a,0x03,0x7b,0x03,0x7c,0x03,0x7d,0x03,0x7e,
-0x03,0x7f,0x03,0x80,0x03,0x81,0x03,0x82,0x03,0x83,0x03,0x84,0x03,0x85,0x03,0x86,
-0x03,0x87,0x03,0x88,0x03,0x89,0x03,0x8a,0x03,0x8b,0x03,0x8c,0x03,0x8d,0x03,0x8e,
-0x03,0x8f,0x03,0x90,0x03,0x91,0x03,0x92,0x03,0x93,0x03,0x94,0x03,0x95,0x03,0x96,
-0x03,0x97,0x03,0x98,0x03,0x99,0x03,0x9a,0x03,0x9b,0x03,0x9c,0x03,0x9d,0x03,0x9e,
-0x03,0x9f,0x03,0xa0,0x03,0xa1,0x03,0xa2,0x03,0xa3,0x03,0xa4,0x03,0xa5,0x03,0xa6,
-0x03,0xa7,0x03,0xa8,0x03,0xa9,0x03,0xaa,0x03,0xab,0x03,0xac,0x03,0xad,0x03,0xae,
-0x03,0xaf,0x03,0xb0,0x03,0xb1,0x03,0xb2,0x03,0xb3,0x03,0xb4,0x03,0xb5,0x03,0xb6,
-0x03,0xb7,0x03,0xb8,0x03,0xb9,0x03,0xba,0x03,0xbb,0x03,0xbc,0x03,0xbd,0x03,0xbe,
-0x03,0xbf,0x03,0xc0,0x03,0xc1,0x03,0xc2,0x03,0xc3,0x03,0xc4,0x03,0xc5,0x03,0xc6,
-0x03,0xc7,0x03,0xc8,0x03,0xc9,0x03,0xca,0x03,0xcb,0x03,0xcc,0x03,0xcd,0x03,0xce,
-0x03,0xcf,0x03,0xd0,0x03,0xd1,0x03,0xd2,0x03,0xd3,0x03,0xd4,0x03,0xd5,0x03,0xd6,
-0x03,0xd7,0x03,0xd8,0x03,0xd9,0x03,0xda,0x03,0xdb,0x03,0xdc,0x03,0xdd,0x03,0xde,
-0x03,0xdf,0x03,0xe0,0x03,0xe1,0x03,0xe2,0x03,0xe3,0x03,0xe4,0x03,0xe5,0x03,0xe6,
-0x03,0xe7,0x03,0xe8,0x03,0xe9,0x03,0xea,0x03,0xeb,0x03,0xec,0x03,0xed,0x03,0xee,
-0x03,0xef,0x03,0xf0,0x03,0xf1,0x03,0xf2,0x03,0xf3,0x03,0xf4,0x03,0xf5,0x03,0xf6,
-0x03,0xf7,0x03,0xf8,0x03,0xf9,0x03,0xfa,0x03,0xfb,0x03,0xfc,0x03,0xfd,0x03,0xfe,
-0x03,0xff,0x04,0x00,0x04,0x01,0x04,0x02,0x04,0x03,0x04,0x04,0x04,0x05,0x04,0x06,
-0x04,0x07,0x04,0x08,0x04,0x09,0x04,0x0a,0x04,0x0b,0x04,0x0c,0x04,0x0d,0x04,0x0e,
-0x04,0x0f,0x04,0x10,0x04,0x11,0x04,0x12,0x04,0x13,0x04,0x14,0x04,0x15,0x04,0x16,
-0x04,0x17,0x04,0x18,0x04,0x19,0x04,0x1a,0x04,0x1b,0x04,0x1c,0x04,0x1d,0x04,0x1e,
-0x04,0x1f,0x04,0x20,0x04,0x21,0x04,0x22,0x04,0x23,0x04,0x24,0x04,0x25,0x04,0x26,
-0x04,0x27,0x04,0x28,0x04,0x29,0x04,0x2a,0x04,0x2b,0x04,0x2c,0x04,0x2d,0x04,0x2e,
-0x04,0x2f,0x04,0x30,0x04,0x31,0x04,0x32,0x04,0x33,0x04,0x34,0x04,0x35,0x04,0x36,
-0x04,0x37,0x04,0x38,0x04,0x39,0x04,0x3a,0x04,0x3b,0x04,0x3c,0x04,0x3d,0x04,0x3e,
-0x04,0x3f,0x04,0x40,0x04,0x41,0x04,0x42,0x04,0x43,0x04,0x44,0x04,0x45,0x04,0x46,
-0x04,0x47,0x04,0x48,0x04,0x49,0x04,0x4a,0x04,0x4b,0x04,0x4c,0x04,0x4d,0x04,0x4e,
-0x04,0x4f,0x04,0x50,0x04,0x51,0x04,0x52,0x04,0x53,0x04,0x54,0x04,0x55,0x04,0x56,
-0x04,0x57,0x04,0x58,0x04,0x59,0x04,0x5a,0x04,0x5b,0x04,0x5c,0x04,0x5d,0x04,0x5e,
-0x04,0x5f,0x04,0x60,0x04,0x61,0x04,0x62,0x04,0x63,0x04,0x64,0x04,0x65,0x04,0x66,
-0x04,0x67,0x04,0x68,0x04,0x69,0x04,0x6a,0x04,0x6b,0x04,0x6c,0x04,0x6d,0x04,0x6e,
-0x04,0x6f,0x04,0x70,0x04,0x71,0x04,0x72,0x04,0x73,0x04,0x74,0x04,0x75,0x04,0x76,
-0x04,0x77,0x04,0x78,0x04,0x79,0x04,0x7a,0x04,0x7b,0x04,0x7c,0x04,0x7d,0x04,0x7e,
-0x04,0x7f,0x04,0x80,0x04,0x81,0x04,0x82,0x04,0x83,0x04,0x84,0x04,0x85,0x04,0x86,
-0x04,0x87,0x04,0x88,0x04,0x89,0x04,0x8a,0x04,0x8b,0x04,0x8c,0x04,0x8d,0x04,0x8e,
-0x04,0x8f,0x04,0x90,0x04,0x91,0x04,0x92,0x04,0x93,0x04,0x94,0x04,0x95,0x04,0x96,
-0x04,0x97,0x04,0x98,0x04,0x99,0x04,0x9a,0x04,0x9b,0x04,0x9c,0x04,0x9d,0x04,0x9e,
-0x04,0x9f,0x04,0xa0,0x04,0xa1,0x04,0xa2,0x04,0xa3,0x04,0xa4,0x04,0xa5,0x04,0xa6,
-0x04,0xa7,0x04,0xa8,0x04,0xa9,0x04,0xaa,0x04,0xab,0x04,0xac,0x04,0xad,0x04,0xae,
-0x04,0xaf,0x04,0xb0,0x04,0xb1,0x04,0xb2,0x04,0xb3,0x04,0xb4,0x04,0xb5,0x04,0xb6,
-0x04,0xb7,0x04,0xb8,0x04,0xb9,0x04,0xba,0x04,0xbb,0x04,0xbc,0x04,0xbd,0x04,0xbe,
-0x04,0xbf,0x04,0xc0,0x04,0xc1,0x04,0xc2,0x04,0xc3,0x04,0xc4,0x04,0xc5,0x04,0xc6,
-0x04,0xc7,0x04,0xc8,0x04,0xc9,0x04,0xca,0x04,0xcb,0x04,0xcc,0x04,0xcd,0x04,0xce,
-0x04,0xcf,0x04,0xd0,0x04,0xd1,0x04,0xd2,0x04,0xd3,0x04,0xd4,0x04,0xd5,0x04,0xd6,
-0x04,0xd7,0x04,0xd8,0x04,0xd9,0x04,0xda,0x04,0xdb,0x04,0xdc,0x04,0xdd,0x04,0xde,
-0x04,0xdf,0x04,0xe0,0x04,0xe1,0x04,0xe2,0x04,0xe3,0x04,0xe4,0x04,0xe5,0x04,0xe6,
-0x04,0xe7,0x04,0xe8,0x04,0xe9,0x04,0xea,0x04,0xeb,0x04,0xec,0x04,0xed,0x04,0xee,
-0x04,0xef,0x04,0xf0,0x04,0xf1,0x04,0xf2,0x04,0xf3,0x04,0xf4,0x04,0xf5,0x04,0xf6,
-0x04,0xf7,0x04,0xf8,0x04,0xf9,0x04,0xfa,0x04,0xfb,0x04,0xfc,0x04,0xfd,0x04,0xfe,
-0x04,0xff,0x05,0x00,0x05,0x01,0x05,0x02,0x05,0x03,0x05,0x04,0x05,0x05,0x05,0x06,
-0x05,0x07,0x05,0x08,0x05,0x09,0x05,0x0a,0x05,0x0b,0x05,0x0c,0x05,0x0d,0x05,0x0e,
-0x05,0x0f,0x05,0x10,0x05,0x11,0x05,0x12,0x05,0x13,0x05,0x14,0x05,0x15,0x05,0x16,
-0x05,0x17,0x05,0x18,0x05,0x19,0x05,0x1a,0x05,0x1b,0x05,0x1c,0x05,0x1d,0x05,0x1e,
-0x05,0x1f,0x05,0x20,0x05,0x21,0x05,0x22,0x05,0x23,0x05,0x24,0x05,0x25,0x05,0x26,
-0x05,0x27,0x05,0x28,0x05,0x29,0x05,0x2a,0x05,0x2b,0x05,0x2c,0x05,0x2d,0x05,0x2e,
-0x05,0x2f,0x05,0x30,0x05,0x31,0x05,0x32,0x05,0x33,0x05,0x34,0x05,0x35,0x05,0x36,
-0x05,0x37,0x05,0x38,0x05,0x39,0x05,0x3a,0x05,0x3b,0x05,0x3c,0x05,0x3d,0x05,0x3e,
-0x05,0x3f,0x05,0x40,0x05,0x41,0x05,0x42,0x05,0x43,0x05,0x44,0x05,0x45,0x05,0x46,
-0x05,0x47,0x05,0x48,0x05,0x49,0x05,0x4a,0x05,0x4b,0x05,0x4c,0x05,0x4d,0x05,0x4e,
-0x05,0x4f,0x05,0x50,0x05,0x51,0x05,0x52,0x05,0x53,0x05,0x54,0x05,0x55,0x05,0x56,
-0x05,0x57,0x05,0x58,0x05,0x59,0x05,0x5a,0x05,0x5b,0x05,0x5c,0x05,0x5d,0x05,0x5e,
-0x05,0x5f,0x05,0x60,0x05,0x61,0x05,0x62,0x05,0x63,0x05,0x64,0x05,0x65,0x05,0x66,
-0x05,0x67,0x05,0x68,0x05,0x69,0x05,0x6a,0x05,0x6b,0x05,0x6c,0x05,0x6d,0x05,0x6e,
-0x05,0x6f,0x05,0x70,0x05,0x71,0x05,0x72,0x05,0x73,0x05,0x74,0x05,0x75,0x05,0x76,
-0x05,0x77,0x05,0x78,0x05,0x79,0x05,0x7a,0x05,0x7b,0x05,0x7c,0x05,0x7d,0x05,0x7e,
-0x05,0x7f,0x05,0x80,0x05,0x81,0x05,0x82,0x05,0x83,0x05,0x84,0x05,0x85,0x05,0x86,
-0x05,0x87,0x05,0x88,0x05,0x89,0x05,0x8a,0x05,0x8b,0x05,0x8c,0x05,0x8d,0x05,0x8e,
-0x05,0x8f,0x05,0x90,0x05,0x91,0x05,0x92,0x05,0x93,0x05,0x94,0x05,0x95,0x05,0x96,
-0x05,0x97,0x05,0x98,0x05,0x99,0x05,0x9a,0x05,0x9b,0x05,0x9c,0x05,0x9d,0x05,0x9e,
-0x05,0x9f,0x05,0xa0,0x05,0xa1,0x05,0xa2,0x05,0xa3,0x05,0xa4,0x05,0xa5,0x05,0xa6,
-0x05,0xa7,0x05,0xa8,0x05,0xa9,0x05,0xaa,0x05,0xab,0x05,0xac,0x05,0xad,0x05,0xae,
-0x05,0xaf,0x05,0xb0,0x05,0xb1,0x05,0xb2,0x05,0xb3,0x05,0xb4,0x05,0xb5,0x05,0xb6,
-0x05,0xb7,0x05,0xb8,0x05,0xb9,0x05,0xba,0x05,0xbb,0x05,0xbc,0x05,0xbd,0x05,0xbe,
-0x05,0xbf,0x05,0xc0,0x05,0xc1,0x05,0xc2,0x05,0xc3,0x05,0xc4,0x05,0xc5,0x05,0xc6,
-0x05,0xc7,0x05,0xc8,0x05,0xc9,0x05,0xca,0x05,0xcb,0x05,0xcc,0x05,0xcd,0x05,0xce,
-0x05,0xcf,0x05,0xd0,0x05,0xd1,0x05,0xd2,0x05,0xd3,0x05,0xd4,0x05,0xd5,0x05,0xd6,
-0x05,0xd7,0x05,0xd8,0x05,0xd9,0x05,0xda,0x05,0xdb,0x05,0xdc,0x05,0xdd,0x05,0xde,
-0x05,0xdf,0x05,0xe0,0x05,0xe1,0x05,0xe2,0x05,0xe3,0x05,0xe4,0x05,0xe5,0x05,0xe6,
-0x05,0xe7,0x05,0xe8,0x05,0xe9,0x05,0xea,0x05,0xeb,0x05,0xec,0x05,0xed,0x05,0xee,
-0x05,0xef,0x05,0xf0,0x05,0xf1,0x05,0xf2,0x05,0xf3,0x05,0xf4,0x05,0xf5,0x05,0xf6,
-0x05,0xf7,0x05,0xf8,0x05,0xf9,0x05,0xfa,0x05,0xfb,0x05,0xfc,0x05,0xfd,0x05,0xfe,
-0x05,0xff,0x06,0x00,0x06,0x01,0x06,0x02,0x06,0x03,0x06,0x04,0x06,0x05,0x06,0x06,
-0x06,0x07,0x06,0x08,0x06,0x09,0x06,0x0a,0x06,0x0b,0x06,0x0c,0x06,0x0d,0x06,0x0e,
-0x06,0x0f,0x06,0x10,0x06,0x11,0x06,0x12,0x06,0x13,0x06,0x14,0x06,0x15,0x06,0x16,
-0x06,0x17,0x06,0x18,0x06,0x19,0x06,0x1a,0x06,0x1b,0x06,0x1c,0x06,0x1d,0x06,0x1e,
-0x06,0x1f,0x06,0x20,0x06,0x21,0x06,0x22,0x06,0x23,0x06,0x24,0x06,0x25,0x06,0x26,
-0x06,0x27,0x06,0x28,0x06,0x29,0x06,0x2a,0x06,0x2b,0x06,0x2c,0x06,0x2d,0x06,0x2e,
-0x06,0x2f,0x06,0x30,0x06,0x31,0x06,0x32,0x06,0x33,0x06,0x34,0x06,0x35,0x06,0x36,
-0x06,0x37,0x06,0x38,0x06,0x39,0x06,0x3a,0x06,0x3b,0x06,0x3c,0x06,0x3d,0x06,0x3e,
-0x06,0x3f,0x06,0x40,0x06,0x41,0x06,0x42,0x06,0x43,0x06,0x44,0x06,0x45,0x06,0x46,
-0x06,0x47,0x06,0x48,0x06,0x49,0x06,0x4a,0x06,0x4b,0x06,0x4c,0x06,0x4d,0x06,0x4e,
-0x06,0x4f,0x06,0x50,0x06,0x51,0x06,0x52,0x06,0x53,0x06,0x54,0x06,0x55,0x06,0x56,
-0x06,0x57,0x06,0x58,0x06,0x59,0x06,0x5a,0x06,0x5b,0x06,0x5c,0x06,0x5d,0x06,0x5e,
-0x06,0x5f,0x06,0x60,0x06,0x61,0x06,0x62,0x06,0x63,0x06,0x64,0x06,0x65,0x06,0x66,
-0x06,0x67,0x06,0x68,0x06,0x69,0x06,0x6a,0x06,0x6b,0x06,0x6c,0x06,0x6d,0x06,0x6e,
-0x06,0x6f,0x06,0x70,0x06,0x71,0x06,0x72,0x06,0x73,0x06,0x74,0x06,0x75,0x06,0x76,
-0x06,0x77,0x06,0x78,0x06,0x79,0x06,0x7a,0x06,0x7b,0x06,0x7c,0x06,0x7d,0x06,0x7e,
-0x06,0x7f,0x06,0x80,0x06,0x81,0x06,0x82,0x06,0x83,0x06,0x84,0x06,0x85,0x06,0x86,
-0x06,0x87,0x06,0x88,0x06,0x89,0x06,0x8a,0x06,0x8b,0x06,0x8c,0x06,0x8d,0x06,0x8e,
-0x06,0x8f,0x06,0x90,0x06,0x91,0x06,0x92,0x06,0x93,0x06,0x94,0x06,0x95,0x06,0x96,
-0x06,0x97,0x06,0x98,0x06,0x99,0x06,0x9a,0x06,0x9b,0x06,0x9c,0x06,0x9d,0x06,0x9e,
-0x06,0x9f,0x06,0xa0,0x06,0xa1,0x06,0xa2,0x06,0xa3,0x06,0xa4,0x06,0xa5,0x06,0xa6,
-0x06,0xa7,0x06,0xa8,0x06,0xa9,0x06,0xaa,0x06,0xab,0x06,0xac,0x06,0xad,0x06,0xae,
-0x06,0xaf,0x06,0xb0,0x06,0xb1,0x06,0xb2,0x06,0xb3,0x06,0xb4,0x06,0xb5,0x06,0xb6,
-0x06,0xb7,0x06,0xb8,0x06,0xb9,0x06,0xba,0x06,0xbb,0x06,0xbc,0x06,0xbd,0x06,0xbe,
-0x06,0xbf,0x06,0xc0,0x06,0xc1,0x06,0xc2,0x06,0xc3,0x06,0xc4,0x06,0xc5,0x06,0xc6,
-0x06,0xc7,0x06,0xc8,0x06,0xc9,0x06,0xca,0x06,0xcb,0x06,0xcc,0x06,0xcd,0x06,0xce,
-0x06,0xcf,0x06,0xd0,0x06,0xd1,0x06,0xd2,0x06,0xd3,0x06,0xd4,0x06,0xd5,0x06,0xd6,
-0x06,0xd7,0x06,0xd8,0x06,0xd9,0x06,0xda,0x06,0xdb,0x06,0xdc,0x06,0xdd,0x06,0xde,
-0x06,0xdf,0x06,0xe0,0x06,0xe1,0x06,0xe2,0x06,0xe3,0x06,0xe4,0x06,0xe5,0x06,0xe6,
-0x06,0xe7,0x06,0xe8,0x06,0xe9,0x06,0xea,0x06,0xeb,0x06,0xec,0x06,0xed,0x06,0xee,
-0x06,0xef,0x06,0xf0,0x06,0xf1,0x06,0xf2,0x06,0xf3,0x06,0xf4,0x06,0xf5,0x06,0xf6,
-0x06,0xf7,0x06,0xf8,0x06,0xf9,0x06,0xfa,0x06,0xfb,0x06,0xfc,0x06,0xfd,0x06,0xfe,
-0x06,0xff,0x07,0x00,0x07,0x01,0x07,0x02,0x07,0x03,0x07,0x04,0x07,0x05,0x07,0x06,
-0x07,0x07,0x07,0x08,0x07,0x09,0x07,0x0a,0x07,0x0b,0x07,0x0c,0x07,0x0d,0x07,0x0e,
-0x07,0x0f,0x07,0x10,0x07,0x11,0x07,0x12,0x07,0x13,0x07,0x14,0x07,0x15,0x07,0x16,
-0x07,0x17,0x07,0x18,0x07,0x19,0x07,0x1a,0x07,0x1b,0x07,0x1c,0x07,0x1d,0x07,0x1e,
-0x07,0x1f,0x07,0x20,0x07,0x21,0x07,0x22,0x07,0x23,0x07,0x24,0x07,0x25,0x07,0x26,
-0x07,0x27,0x07,0x28,0x07,0x29,0x07,0x2a,0x07,0x2b,0x07,0x2c,0x07,0x2d,0x07,0x2e,
-0x07,0x2f,0x07,0x30,0x07,0x31,0x07,0x32,0x07,0x33,0x07,0x34,0x07,0x35,0x07,0x36,
-0x07,0x37,0x07,0x38,0x07,0x39,0x07,0x3a,0x07,0x3b,0x07,0x3c,0x07,0x3d,0x07,0x3e,
-0x07,0x3f,0x07,0x40,0x07,0x41,0x07,0x42,0x07,0x43,0x07,0x44,0x07,0x45,0x07,0x46,
-0x07,0x47,0x07,0x48,0x07,0x49,0x07,0x4a,0x07,0x4b,0x07,0x4c,0x07,0x4d,0x07,0x4e,
-0x07,0x4f,0x07,0x50,0x07,0x51,0x07,0x52,0x07,0x53,0x07,0x54,0x07,0x55,0x07,0x56,
-0x07,0x57,0x07,0x58,0x07,0x59,0x07,0x5a,0x07,0x5b,0x07,0x5c,0x07,0x5d,0x07,0x5e,
-0x07,0x5f,0x07,0x60,0x07,0x61,0x07,0x62,0x07,0x63,0x07,0x64,0x07,0x65,0x07,0x66,
-0x07,0x67,0x07,0x68,0x07,0x69,0x07,0x6a,0x07,0x6b,0x07,0x6c,0x07,0x6d,0x07,0x6e,
-0x07,0x6f,0x07,0x70,0x07,0x71,0x07,0x72,0x07,0x73,0x07,0x74,0x07,0x75,0x07,0x76,
-0x07,0x77,0x07,0x78,0x07,0x79,0x07,0x7a,0x07,0x7b,0x07,0x7c,0x07,0x7d,0x07,0x7e,
-0x07,0x7f,0x07,0x80,0x07,0x81,0x07,0x82,0x07,0x83,0x07,0x84,0x07,0x85,0x07,0x86,
-0x07,0x87,0x07,0x88,0x07,0x89,0x07,0x8a,0x07,0x8b,0x07,0x8c,0x07,0x8d,0x07,0x8e,
-0x07,0x8f,0x07,0x90,0x07,0x91,0x07,0x92,0x07,0x93,0x07,0x94,0x07,0x95,0x00,0xb2,
-0x00,0xb3,0x07,0x96,0x07,0x97,0x07,0x98,0x00,0xb6,0x00,0xb7,0x00,0xc4,0x07,0x99,
-0x00,0xb4,0x00,0xb5,0x00,0xc5,0x07,0x9a,0x00,0x82,0x00,0xc2,0x00,0x87,0x07,0x9b,
-0x07,0x9c,0x07,0x9d,0x00,0xab,0x07,0x9e,0x00,0xc6,0x07,0x9f,0x07,0xa0,0x07,0xa1,
-0x07,0xa2,0x07,0xa3,0x07,0xa4,0x07,0xa5,0x07,0xa6,0x00,0xbe,0x00,0xbf,0x07,0xa7,
-0x07,0xa8,0x07,0xa9,0x07,0xaa,0x07,0xab,0x07,0xac,0x07,0xad,0x07,0xae,0x07,0xaf,
-0x00,0xbc,0x07,0xb0,0x07,0xb1,0x07,0xb2,0x07,0xb3,0x07,0xb4,0x07,0xb5,0x07,0xb6,
-0x07,0xb7,0x07,0xb8,0x07,0xb9,0x07,0xba,0x07,0xbb,0x07,0xbc,0x07,0xbd,0x07,0xbe,
-0x07,0xbf,0x07,0xc0,0x07,0xc1,0x07,0xc2,0x07,0xc3,0x07,0xc4,0x07,0xc5,0x07,0xc6,
-0x07,0xc7,0x07,0xc8,0x07,0xc9,0x07,0xca,0x07,0xcb,0x07,0xcc,0x07,0xcd,0x07,0xce,
-0x07,0xcf,0x07,0xd0,0x07,0xd1,0x07,0xd2,0x07,0xd3,0x07,0xd4,0x07,0xd5,0x07,0xd6,
-0x07,0xd7,0x07,0xd8,0x07,0xd9,0x07,0xda,0x07,0xdb,0x07,0xdc,0x07,0xdd,0x07,0xde,
-0x07,0xdf,0x07,0xe0,0x07,0xe1,0x07,0xe2,0x07,0xe3,0x07,0xe4,0x07,0xe5,0x07,0xe6,
-0x07,0xe7,0x07,0xe8,0x07,0xe9,0x00,0xf7,0x07,0xea,0x07,0xeb,0x07,0xec,0x07,0xed,
-0x07,0xee,0x07,0xef,0x07,0xf0,0x07,0xf1,0x07,0xf2,0x07,0xf3,0x07,0xf4,0x07,0xf5,
-0x07,0xf6,0x07,0xf7,0x07,0xf8,0x07,0xf9,0x07,0xfa,0x07,0xfb,0x07,0xfc,0x07,0xfd,
-0x07,0xfe,0x07,0xff,0x08,0x00,0x08,0x01,0x08,0x02,0x08,0x03,0x08,0x04,0x08,0x05,
-0x08,0x06,0x08,0x07,0x08,0x08,0x08,0x09,0x08,0x0a,0x00,0x8c,0x08,0x0b,0x08,0x0c,
-0x08,0x0d,0x08,0x0e,0x08,0x0f,0x08,0x10,0x08,0x11,0x08,0x12,0x08,0x13,0x08,0x14,
-0x08,0x15,0x08,0x16,0x08,0x17,0x08,0x18,0x08,0x19,0x08,0x1a,0x08,0x1b,0x08,0x1c,
-0x08,0x1d,0x08,0x1e,0x08,0x1f,0x08,0x20,0x08,0x21,0x08,0x22,0x08,0x23,0x08,0x24,
-0x08,0x25,0x08,0x26,0x08,0x27,0x08,0x28,0x08,0x29,0x08,0x2a,0x08,0x2b,0x08,0x2c,
-0x08,0x2d,0x08,0x2e,0x08,0x2f,0x08,0x30,0x08,0x31,0x08,0x32,0x08,0x33,0x08,0x34,
-0x08,0x35,0x08,0x36,0x08,0x37,0x08,0x38,0x08,0x39,0x08,0x3a,0x08,0x3b,0x08,0x3c,
-0x08,0x3d,0x08,0x3e,0x08,0x3f,0x08,0x40,0x08,0x41,0x08,0x42,0x08,0x43,0x08,0x44,
-0x08,0x45,0x08,0x46,0x08,0x47,0x08,0x48,0x08,0x49,0x08,0x4a,0x08,0x4b,0x08,0x4c,
-0x08,0x4d,0x08,0x4e,0x08,0x4f,0x08,0x50,0x08,0x51,0x08,0x52,0x08,0x53,0x08,0x54,
-0x08,0x55,0x08,0x56,0x08,0x57,0x08,0x58,0x08,0x59,0x08,0x5a,0x08,0x5b,0x08,0x5c,
-0x08,0x5d,0x08,0x5e,0x08,0x5f,0x08,0x60,0x08,0x61,0x08,0x62,0x08,0x63,0x08,0x64,
-0x08,0x65,0x08,0x66,0x08,0x67,0x08,0x68,0x08,0x69,0x08,0x6a,0x08,0x6b,0x08,0x6c,
-0x08,0x6d,0x08,0x6e,0x08,0x6f,0x08,0x70,0x08,0x71,0x08,0x72,0x08,0x73,0x08,0x74,
-0x08,0x75,0x08,0x76,0x08,0x77,0x08,0x78,0x08,0x79,0x08,0x7a,0x08,0x7b,0x08,0x7c,
-0x08,0x7d,0x08,0x7e,0x08,0x7f,0x08,0x80,0x08,0x81,0x08,0x82,0x00,0x98,0x08,0x83,
-0x08,0x84,0x08,0x85,0x00,0xa8,0x08,0x86,0x08,0x87,0x08,0x88,0x08,0x89,0x08,0x8a,
-0x08,0x8b,0x08,0x8c,0x08,0x8d,0x00,0x9a,0x08,0x8e,0x00,0x99,0x00,0xef,0x08,0x8f,
-0x08,0x90,0x00,0xbc,0x08,0x91,0x08,0x92,0x08,0x93,0x00,0xc3,0x00,0xa5,0x08,0x94,
-0x08,0x95,0x08,0x96,0x00,0x92,0x08,0x97,0x08,0x98,0x08,0x99,0x08,0x9a,0x08,0x9b,
-0x08,0x9c,0x08,0x9d,0x08,0x9e,0x08,0x9f,0x08,0xa0,0x08,0xa1,0x08,0xa2,0x00,0x9c,
-0x08,0xa3,0x08,0xa4,0x08,0xa5,0x08,0xa6,0x08,0xa7,0x08,0xa8,0x08,0xa9,0x08,0xaa,
-0x08,0xab,0x08,0xac,0x08,0xad,0x08,0xae,0x08,0xaf,0x08,0xb0,0x08,0xb1,0x08,0xb2,
-0x08,0xb3,0x08,0xb4,0x08,0xb5,0x00,0xa7,0x08,0xb6,0x08,0xb7,0x08,0xb8,0x08,0xb9,
-0x08,0xba,0x08,0xbb,0x08,0xbc,0x08,0xbd,0x08,0xbe,0x08,0xbf,0x08,0xc0,0x08,0xc1,
-0x08,0xc2,0x08,0xc3,0x08,0xc4,0x08,0xc5,0x08,0xc6,0x08,0xc7,0x08,0xc8,0x08,0xc9,
-0x08,0xca,0x08,0xcb,0x08,0xcc,0x00,0x8f,0x08,0xcd,0x08,0xce,0x08,0xcf,0x00,0x94,
-0x00,0x95,0x08,0xd0,0x08,0xd1,0x08,0xd2,0x08,0xd3,0x08,0xd4,0x08,0xd5,0x08,0xd6,
-0x08,0xd7,0x08,0xd8,0x08,0xd9,0x08,0xda,0x08,0xdb,0x08,0xdc,0x08,0xdd,0x08,0xde,
-0x08,0xdf,0x08,0xe0,0x08,0xe1,0x08,0xe2,0x08,0xe3,0x08,0xe4,0x08,0xe5,0x08,0xe6,
-0x08,0xe7,0x08,0xe8,0x08,0xe9,0x08,0xea,0x08,0xeb,0x08,0xec,0x08,0xed,0x08,0xee,
-0x08,0xef,0x08,0xf0,0x08,0xf1,0x08,0xf2,0x08,0xf3,0x08,0xf4,0x08,0xf5,0x08,0xf6,
-0x08,0xf7,0x08,0xf8,0x08,0xf9,0x08,0xfa,0x08,0xfb,0x08,0xfc,0x08,0xfd,0x08,0xfe,
-0x08,0xff,0x09,0x00,0x09,0x01,0x09,0x02,0x09,0x03,0x09,0x04,0x09,0x05,0x09,0x06,
-0x09,0x07,0x09,0x08,0x09,0x09,0x09,0x0a,0x09,0x0b,0x09,0x0c,0x09,0x0d,0x09,0x0e,
-0x09,0x0f,0x09,0x10,0x09,0x11,0x09,0x12,0x09,0x13,0x09,0x14,0x09,0x15,0x09,0x16,
-0x09,0x17,0x09,0x18,0x09,0x19,0x09,0x1a,0x09,0x1b,0x09,0x1c,0x09,0x1d,0x09,0x1e,
-0x09,0x1f,0x09,0x20,0x09,0x21,0x09,0x22,0x09,0x23,0x09,0x24,0x09,0x25,0x09,0x26,
-0x09,0x27,0x09,0x28,0x09,0x29,0x09,0x2a,0x09,0x2b,0x09,0x2c,0x09,0x2d,0x09,0x2e,
-0x09,0x2f,0x09,0x30,0x09,0x31,0x09,0x32,0x09,0x33,0x09,0x34,0x09,0x35,0x09,0x36,
-0x09,0x37,0x09,0x38,0x09,0x39,0x09,0x3a,0x09,0x3b,0x09,0x3c,0x09,0x3d,0x09,0x3e,
-0x09,0x3f,0x09,0x40,0x09,0x41,0x09,0x42,0x09,0x43,0x09,0x44,0x09,0x45,0x09,0x46,
-0x09,0x47,0x09,0x48,0x09,0x49,0x09,0x4a,0x09,0x4b,0x09,0x4c,0x09,0x4d,0x09,0x4e,
-0x09,0x4f,0x09,0x50,0x09,0x51,0x09,0x52,0x09,0x53,0x09,0x54,0x09,0x55,0x09,0x56,
-0x09,0x57,0x09,0x58,0x09,0x59,0x09,0x5a,0x09,0x5b,0x09,0x5c,0x09,0x5d,0x09,0x5e,
-0x09,0x5f,0x09,0x60,0x09,0x61,0x09,0x62,0x09,0x63,0x09,0x64,0x09,0x65,0x09,0x66,
-0x00,0xb9,0x09,0x67,0x09,0x68,0x09,0x69,0x09,0x6a,0x09,0x6b,0x09,0x6c,0x09,0x6d,
-0x09,0x6e,0x09,0x6f,0x09,0x70,0x09,0x71,0x09,0x72,0x09,0x73,0x09,0x74,0x09,0x75,
-0x09,0x76,0x09,0x77,0x09,0x78,0x09,0x79,0x09,0x7a,0x09,0x7b,0x09,0x7c,0x09,0x7d,
-0x09,0x7e,0x09,0x7f,0x09,0x80,0x09,0x81,0x09,0x82,0x09,0x83,0x09,0x84,0x09,0x85,
-0x09,0x86,0x09,0x87,0x09,0x88,0x09,0x89,0x09,0x8a,0x09,0x8b,0x09,0x8c,0x09,0x8d,
-0x09,0x8e,0x09,0x8f,0x09,0x90,0x09,0x91,0x09,0x92,0x09,0x93,0x09,0x94,0x09,0x95,
-0x09,0x96,0x09,0x97,0x09,0x98,0x09,0x99,0x09,0x9a,0x09,0x9b,0x09,0x9c,0x09,0x9d,
-0x09,0x9e,0x09,0x9f,0x09,0xa0,0x09,0xa1,0x09,0xa2,0x09,0xa3,0x09,0xa4,0x09,0xa5,
-0x09,0xa6,0x09,0xa7,0x09,0xa8,0x09,0xa9,0x09,0xaa,0x09,0xab,0x09,0xac,0x09,0xad,
-0x09,0xae,0x09,0xaf,0x09,0xb0,0x09,0xb1,0x09,0xb2,0x09,0xb3,0x09,0xb4,0x09,0xb5,
-0x09,0xb6,0x09,0xb7,0x09,0xb8,0x09,0xb9,0x09,0xba,0x09,0xbb,0x09,0xbc,0x09,0xbd,
-0x09,0xbe,0x09,0xbf,0x09,0xc0,0x09,0xc1,0x09,0xc2,0x09,0xc3,0x09,0xc4,0x09,0xc5,
-0x09,0xc6,0x09,0xc7,0x09,0xc8,0x09,0xc9,0x09,0xca,0x09,0xcb,0x09,0xcc,0x09,0xcd,
-0x09,0xce,0x09,0xcf,0x09,0xd0,0x09,0xd1,0x09,0xd2,0x09,0xd3,0x09,0xd4,0x09,0xd5,
-0x09,0xd6,0x09,0xd7,0x09,0xd8,0x09,0xd9,0x09,0xda,0x09,0xdb,0x09,0xdc,0x09,0xdd,
-0x09,0xde,0x09,0xdf,0x09,0xe0,0x09,0xe1,0x09,0xe2,0x09,0xe3,0x09,0xe4,0x09,0xe5,
-0x09,0xe6,0x09,0xe7,0x09,0xe8,0x09,0xe9,0x09,0xea,0x09,0xeb,0x09,0xec,0x09,0xed,
-0x09,0xee,0x09,0xef,0x09,0xf0,0x09,0xf1,0x09,0xf2,0x09,0xf3,0x09,0xf4,0x09,0xf5,
-0x09,0xf6,0x09,0xf7,0x09,0xf8,0x09,0xf9,0x09,0xfa,0x09,0xfb,0x09,0xfc,0x09,0xfd,
-0x09,0xfe,0x09,0xff,0x0a,0x00,0x0a,0x01,0x0a,0x02,0x0a,0x03,0x0a,0x04,0x0a,0x05,
-0x0a,0x06,0x0a,0x07,0x0a,0x08,0x0a,0x09,0x0a,0x0a,0x0a,0x0b,0x0a,0x0c,0x0a,0x0d,
-0x0a,0x0e,0x0a,0x0f,0x0a,0x10,0x0a,0x11,0x0a,0x12,0x0a,0x13,0x0a,0x14,0x0a,0x15,
-0x0a,0x16,0x0a,0x17,0x0a,0x18,0x0a,0x19,0x0a,0x1a,0x0a,0x1b,0x0a,0x1c,0x0a,0x1d,
-0x0a,0x1e,0x0a,0x1f,0x0a,0x20,0x0a,0x21,0x0a,0x22,0x0a,0x23,0x0a,0x24,0x0a,0x25,
-0x0a,0x26,0x0a,0x27,0x0a,0x28,0x0a,0x29,0x0a,0x2a,0x0a,0x2b,0x0a,0x2c,0x0a,0x2d,
-0x0a,0x2e,0x0a,0x2f,0x0a,0x30,0x0a,0x31,0x0a,0x32,0x0a,0x33,0x0a,0x34,0x0a,0x35,
-0x0a,0x36,0x0a,0x37,0x0a,0x38,0x0a,0x39,0x0a,0x3a,0x0a,0x3b,0x0a,0x3c,0x0a,0x3d,
-0x0a,0x3e,0x0a,0x3f,0x0a,0x40,0x0a,0x41,0x0a,0x42,0x0a,0x43,0x0a,0x44,0x0a,0x45,
-0x0a,0x46,0x0a,0x47,0x0a,0x48,0x0a,0x49,0x0a,0x4a,0x0a,0x4b,0x0a,0x4c,0x0a,0x4d,
-0x0a,0x4e,0x0a,0x4f,0x0a,0x50,0x0a,0x51,0x0a,0x52,0x0a,0x53,0x0a,0x54,0x0a,0x55,
-0x0a,0x56,0x0a,0x57,0x0a,0x58,0x0a,0x59,0x0a,0x5a,0x0a,0x5b,0x0a,0x5c,0x0a,0x5d,
-0x0a,0x5e,0x0a,0x5f,0x0a,0x60,0x0a,0x61,0x0a,0x62,0x0a,0x63,0x0a,0x64,0x0a,0x65,
-0x0a,0x66,0x0a,0x67,0x0a,0x68,0x0a,0x69,0x0a,0x6a,0x0a,0x6b,0x0a,0x6c,0x0a,0x6d,
-0x0a,0x6e,0x0a,0x6f,0x0a,0x70,0x0a,0x71,0x0a,0x72,0x0a,0x73,0x0a,0x74,0x0a,0x75,
-0x0a,0x76,0x0a,0x77,0x0a,0x78,0x0a,0x79,0x0a,0x7a,0x0a,0x7b,0x0a,0x7c,0x0a,0x7d,
-0x0a,0x7e,0x0a,0x7f,0x0a,0x80,0x0a,0x81,0x0a,0x82,0x0a,0x83,0x0a,0x84,0x0a,0x85,
-0x0a,0x86,0x0a,0x87,0x0a,0x88,0x0a,0x89,0x0a,0x8a,0x0a,0x8b,0x0a,0x8c,0x0a,0x8d,
-0x0a,0x8e,0x0a,0x8f,0x0a,0x90,0x0a,0x91,0x0a,0x92,0x0a,0x93,0x0a,0x94,0x0a,0x95,
-0x0a,0x96,0x0a,0x97,0x0a,0x98,0x0a,0x99,0x0a,0x9a,0x0a,0x9b,0x0a,0x9c,0x0a,0x9d,
-0x0a,0x9e,0x0a,0x9f,0x0a,0xa0,0x0a,0xa1,0x0a,0xa2,0x0a,0xa3,0x0a,0xa4,0x0a,0xa5,
-0x0a,0xa6,0x0a,0xa7,0x0a,0xa8,0x0a,0xa9,0x0a,0xaa,0x0a,0xab,0x0a,0xac,0x0a,0xad,
-0x0a,0xae,0x0a,0xaf,0x0a,0xb0,0x0a,0xb1,0x0a,0xb2,0x0a,0xb3,0x0a,0xb4,0x0a,0xb5,
-0x0a,0xb6,0x0a,0xb7,0x0a,0xb8,0x0a,0xb9,0x0a,0xba,0x0a,0xbb,0x0a,0xbc,0x0a,0xbd,
-0x0a,0xbe,0x0a,0xbf,0x0a,0xc0,0x0a,0xc1,0x0a,0xc2,0x0a,0xc3,0x0a,0xc4,0x0a,0xc5,
-0x0a,0xc6,0x0a,0xc7,0x0a,0xc8,0x0a,0xc9,0x0a,0xca,0x0a,0xcb,0x0a,0xcc,0x0a,0xcd,
-0x0a,0xce,0x0a,0xcf,0x0a,0xd0,0x0a,0xd1,0x0a,0xd2,0x0a,0xd3,0x0a,0xd4,0x0a,0xd5,
-0x0a,0xd6,0x0a,0xd7,0x0a,0xd8,0x0a,0xd9,0x0a,0xda,0x0a,0xdb,0x0a,0xdc,0x0a,0xdd,
-0x0a,0xde,0x0a,0xdf,0x0a,0xe0,0x0a,0xe1,0x0a,0xe2,0x0a,0xe3,0x0a,0xe4,0x0a,0xe5,
-0x0a,0xe6,0x0a,0xe7,0x0a,0xe8,0x0a,0xe9,0x0a,0xea,0x0a,0xeb,0x0a,0xec,0x0a,0xed,
-0x0a,0xee,0x0a,0xef,0x0a,0xf0,0x0a,0xf1,0x0a,0xf2,0x0a,0xf3,0x0a,0xf4,0x0a,0xf5,
-0x0a,0xf6,0x0a,0xf7,0x0a,0xf8,0x0a,0xf9,0x0a,0xfa,0x0a,0xfb,0x0a,0xfc,0x0a,0xfd,
-0x0a,0xfe,0x0a,0xff,0x0b,0x00,0x0b,0x01,0x0b,0x02,0x0b,0x03,0x0b,0x04,0x0b,0x05,
-0x0b,0x06,0x0b,0x07,0x0b,0x08,0x0b,0x09,0x0b,0x0a,0x0b,0x0b,0x00,0xc0,0x00,0xc1,
-0x0b,0x0c,0x0b,0x0d,0x0b,0x0e,0x0b,0x0f,0x0b,0x10,0x0b,0x11,0x0b,0x12,0x0b,0x13,
-0x0b,0x14,0x0b,0x15,0x0b,0x16,0x0b,0x17,0x0b,0x18,0x0b,0x19,0x0b,0x1a,0x0b,0x1b,
-0x0b,0x1c,0x0b,0x1d,0x0b,0x1e,0x0b,0x1f,0x0b,0x20,0x0b,0x21,0x0b,0x22,0x0b,0x23,
-0x0b,0x24,0x0b,0x25,0x0b,0x26,0x0b,0x27,0x0b,0x28,0x0b,0x29,0x0b,0x2a,0x0b,0x2b,
-0x0b,0x2c,0x0b,0x2d,0x0b,0x2e,0x0b,0x2f,0x0b,0x30,0x0b,0x31,0x0b,0x32,0x0b,0x33,
-0x0b,0x34,0x0b,0x35,0x0b,0x36,0x0b,0x37,0x0b,0x38,0x0b,0x39,0x0b,0x3a,0x0b,0x3b,
-0x0b,0x3c,0x0b,0x3d,0x0b,0x3e,0x0b,0x3f,0x0b,0x40,0x0b,0x41,0x0b,0x42,0x0b,0x43,
-0x0b,0x44,0x0b,0x45,0x0b,0x46,0x0b,0x47,0x0b,0x48,0x0b,0x49,0x0b,0x4a,0x0b,0x4b,
-0x0b,0x4c,0x0b,0x4d,0x0b,0x4e,0x0b,0x4f,0x0b,0x50,0x0b,0x51,0x0b,0x52,0x0b,0x53,
-0x0b,0x54,0x0b,0x55,0x0b,0x56,0x0b,0x57,0x0b,0x58,0x0b,0x59,0x0b,0x5a,0x0b,0x5b,
-0x0b,0x5c,0x0b,0x5d,0x0b,0x5e,0x0b,0x5f,0x0b,0x60,0x0b,0x61,0x0b,0x62,0x0b,0x63,
-0x0b,0x64,0x0b,0x65,0x0b,0x66,0x0b,0x67,0x0b,0x68,0x0b,0x69,0x0b,0x6a,0x0b,0x6b,
-0x0b,0x6c,0x0b,0x6d,0x0b,0x6e,0x0b,0x6f,0x0b,0x70,0x0b,0x71,0x0b,0x72,0x0b,0x73,
-0x0b,0x74,0x0b,0x75,0x0b,0x76,0x0b,0x77,0x0b,0x78,0x0b,0x79,0x0b,0x7a,0x0b,0x7b,
-0x0b,0x7c,0x0b,0x7d,0x0b,0x7e,0x0b,0x7f,0x0b,0x80,0x0b,0x81,0x0b,0x82,0x0b,0x83,
-0x0b,0x84,0x0b,0x85,0x0b,0x86,0x0b,0x87,0x0b,0x88,0x0b,0x89,0x0b,0x8a,0x0b,0x8b,
-0x0b,0x8c,0x0b,0x8d,0x0b,0x8e,0x0b,0x8f,0x0b,0x90,0x0b,0x91,0x0b,0x92,0x0b,0x93,
-0x0b,0x94,0x0b,0x95,0x0b,0x96,0x0b,0x97,0x0b,0x98,0x0b,0x99,0x0b,0x9a,0x0b,0x9b,
-0x0b,0x9c,0x0b,0x9d,0x0b,0x9e,0x0b,0x9f,0x0b,0xa0,0x0b,0xa1,0x0b,0xa2,0x0b,0xa3,
-0x0b,0xa4,0x0b,0xa5,0x0b,0xa6,0x0b,0xa7,0x0b,0xa8,0x0b,0xa9,0x0b,0xaa,0x0b,0xab,
-0x0b,0xac,0x0b,0xad,0x0b,0xae,0x0b,0xaf,0x0b,0xb0,0x0b,0xb1,0x0b,0xb2,0x0b,0xb3,
-0x0b,0xb4,0x0b,0xb5,0x0b,0xb6,0x0b,0xb7,0x0b,0xb8,0x0b,0xb9,0x0b,0xba,0x0b,0xbb,
-0x0b,0xbc,0x0b,0xbd,0x0b,0xbe,0x0b,0xbf,0x0b,0xc0,0x0b,0xc1,0x0b,0xc2,0x0b,0xc3,
-0x0b,0xc4,0x0b,0xc5,0x0b,0xc6,0x0b,0xc7,0x0b,0xc8,0x0b,0xc9,0x0b,0xca,0x0b,0xcb,
-0x0b,0xcc,0x0b,0xcd,0x0b,0xce,0x0b,0xcf,0x0b,0xd0,0x0b,0xd1,0x0b,0xd2,0x0b,0xd3,
-0x0b,0xd4,0x0b,0xd5,0x0b,0xd6,0x0b,0xd7,0x0b,0xd8,0x0b,0xd9,0x0b,0xda,0x0b,0xdb,
-0x0b,0xdc,0x0b,0xdd,0x0b,0xde,0x0b,0xdf,0x0b,0xe0,0x0b,0xe1,0x0b,0xe2,0x0b,0xe3,
-0x0b,0xe4,0x0b,0xe5,0x0b,0xe6,0x0b,0xe7,0x0b,0xe8,0x0b,0xe9,0x0b,0xea,0x0b,0xeb,
-0x0b,0xec,0x0b,0xed,0x0b,0xee,0x0b,0xef,0x0b,0xf0,0x0b,0xf1,0x0b,0xf2,0x0b,0xf3,
-0x0b,0xf4,0x0b,0xf5,0x0b,0xf6,0x0b,0xf7,0x0b,0xf8,0x0b,0xf9,0x0b,0xfa,0x0b,0xfb,
-0x0b,0xfc,0x0b,0xfd,0x0b,0xfe,0x0b,0xff,0x0c,0x00,0x0c,0x01,0x0c,0x02,0x0c,0x03,
-0x0c,0x04,0x0c,0x05,0x0c,0x06,0x0c,0x07,0x0c,0x08,0x0c,0x09,0x0c,0x0a,0x0c,0x0b,
-0x0c,0x0c,0x0c,0x0d,0x0c,0x0e,0x0c,0x0f,0x0c,0x10,0x0c,0x11,0x0c,0x12,0x0c,0x13,
-0x0c,0x14,0x0c,0x15,0x0c,0x16,0x0c,0x17,0x0c,0x18,0x0c,0x19,0x0c,0x1a,0x0c,0x1b,
-0x0c,0x1c,0x0c,0x1d,0x0c,0x1e,0x0c,0x1f,0x0c,0x20,0x0c,0x21,0x0c,0x22,0x0c,0x23,
-0x0c,0x24,0x0c,0x25,0x0c,0x26,0x0c,0x27,0x0c,0x28,0x0c,0x29,0x0c,0x2a,0x0c,0x2b,
-0x0c,0x2c,0x0c,0x2d,0x0c,0x2e,0x0c,0x2f,0x09,0x73,0x66,0x74,0x68,0x79,0x70,0x68,
-0x65,0x6e,0x07,0x41,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x07,0x61,0x6d,0x61,0x63,0x72,
-0x6f,0x6e,0x06,0x41,0x62,0x72,0x65,0x76,0x65,0x06,0x61,0x62,0x72,0x65,0x76,0x65,
-0x07,0x41,0x6f,0x67,0x6f,0x6e,0x65,0x6b,0x07,0x61,0x6f,0x67,0x6f,0x6e,0x65,0x6b,
-0x0b,0x43,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x0b,0x63,0x63,0x69,
-0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x0a,0x43,0x64,0x6f,0x74,0x61,0x63,0x63,
-0x65,0x6e,0x74,0x0a,0x63,0x64,0x6f,0x74,0x61,0x63,0x63,0x65,0x6e,0x74,0x06,0x44,
-0x63,0x61,0x72,0x6f,0x6e,0x06,0x64,0x63,0x61,0x72,0x6f,0x6e,0x06,0x44,0x63,0x72,
-0x6f,0x61,0x74,0x07,0x45,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x07,0x65,0x6d,0x61,0x63,
-0x72,0x6f,0x6e,0x06,0x45,0x62,0x72,0x65,0x76,0x65,0x06,0x65,0x62,0x72,0x65,0x76,
-0x65,0x0a,0x45,0x64,0x6f,0x74,0x61,0x63,0x63,0x65,0x6e,0x74,0x0a,0x65,0x64,0x6f,
-0x74,0x61,0x63,0x63,0x65,0x6e,0x74,0x07,0x45,0x6f,0x67,0x6f,0x6e,0x65,0x6b,0x07,
-0x65,0x6f,0x67,0x6f,0x6e,0x65,0x6b,0x06,0x45,0x63,0x61,0x72,0x6f,0x6e,0x06,0x65,
-0x63,0x61,0x72,0x6f,0x6e,0x0b,0x47,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,
-0x78,0x0b,0x67,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x0a,0x47,0x64,
-0x6f,0x74,0x61,0x63,0x63,0x65,0x6e,0x74,0x0a,0x67,0x64,0x6f,0x74,0x61,0x63,0x63,
-0x65,0x6e,0x74,0x0c,0x47,0x63,0x6f,0x6d,0x6d,0x61,0x61,0x63,0x63,0x65,0x6e,0x74,
-0x0c,0x67,0x63,0x6f,0x6d,0x6d,0x61,0x61,0x63,0x63,0x65,0x6e,0x74,0x0b,0x48,0x63,
-0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x0b,0x68,0x63,0x69,0x72,0x63,0x75,
-0x6d,0x66,0x6c,0x65,0x78,0x04,0x48,0x62,0x61,0x72,0x04,0x68,0x62,0x61,0x72,0x06,
-0x49,0x74,0x69,0x6c,0x64,0x65,0x06,0x69,0x74,0x69,0x6c,0x64,0x65,0x07,0x49,0x6d,
-0x61,0x63,0x72,0x6f,0x6e,0x07,0x69,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x06,0x49,0x62,
-0x72,0x65,0x76,0x65,0x06,0x69,0x62,0x72,0x65,0x76,0x65,0x07,0x49,0x6f,0x67,0x6f,
-0x6e,0x65,0x6b,0x07,0x69,0x6f,0x67,0x6f,0x6e,0x65,0x6b,0x02,0x49,0x4a,0x02,0x69,
-0x6a,0x0b,0x4a,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x0b,0x6a,0x63,
-0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x0c,0x4b,0x63,0x6f,0x6d,0x6d,0x61,
-0x61,0x63,0x63,0x65,0x6e,0x74,0x0c,0x6b,0x63,0x6f,0x6d,0x6d,0x61,0x61,0x63,0x63,
-0x65,0x6e,0x74,0x0c,0x6b,0x67,0x72,0x65,0x65,0x6e,0x6c,0x61,0x6e,0x64,0x69,0x63,
-0x06,0x4c,0x61,0x63,0x75,0x74,0x65,0x06,0x6c,0x61,0x63,0x75,0x74,0x65,0x0c,0x4c,
-0x63,0x6f,0x6d,0x6d,0x61,0x61,0x63,0x63,0x65,0x6e,0x74,0x0c,0x6c,0x63,0x6f,0x6d,
-0x6d,0x61,0x61,0x63,0x63,0x65,0x6e,0x74,0x06,0x4c,0x63,0x61,0x72,0x6f,0x6e,0x06,
-0x6c,0x63,0x61,0x72,0x6f,0x6e,0x04,0x4c,0x64,0x6f,0x74,0x04,0x6c,0x64,0x6f,0x74,
-0x06,0x4e,0x61,0x63,0x75,0x74,0x65,0x06,0x6e,0x61,0x63,0x75,0x74,0x65,0x0c,0x4e,
-0x63,0x6f,0x6d,0x6d,0x61,0x61,0x63,0x63,0x65,0x6e,0x74,0x0c,0x6e,0x63,0x6f,0x6d,
-0x6d,0x61,0x61,0x63,0x63,0x65,0x6e,0x74,0x06,0x4e,0x63,0x61,0x72,0x6f,0x6e,0x06,
-0x6e,0x63,0x61,0x72,0x6f,0x6e,0x0b,0x6e,0x61,0x70,0x6f,0x73,0x74,0x72,0x6f,0x70,
-0x68,0x65,0x03,0x45,0x6e,0x67,0x03,0x65,0x6e,0x67,0x07,0x4f,0x6d,0x61,0x63,0x72,
-0x6f,0x6e,0x07,0x6f,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x06,0x4f,0x62,0x72,0x65,0x76,
-0x65,0x06,0x6f,0x62,0x72,0x65,0x76,0x65,0x0d,0x4f,0x68,0x75,0x6e,0x67,0x61,0x72,
-0x75,0x6d,0x6c,0x61,0x75,0x74,0x0d,0x6f,0x68,0x75,0x6e,0x67,0x61,0x72,0x75,0x6d,
-0x6c,0x61,0x75,0x74,0x06,0x52,0x61,0x63,0x75,0x74,0x65,0x06,0x72,0x61,0x63,0x75,
-0x74,0x65,0x0c,0x52,0x63,0x6f,0x6d,0x6d,0x61,0x61,0x63,0x63,0x65,0x6e,0x74,0x0c,
-0x72,0x63,0x6f,0x6d,0x6d,0x61,0x61,0x63,0x63,0x65,0x6e,0x74,0x06,0x52,0x63,0x61,
-0x72,0x6f,0x6e,0x06,0x72,0x63,0x61,0x72,0x6f,0x6e,0x06,0x53,0x61,0x63,0x75,0x74,
-0x65,0x06,0x73,0x61,0x63,0x75,0x74,0x65,0x0b,0x53,0x63,0x69,0x72,0x63,0x75,0x6d,
-0x66,0x6c,0x65,0x78,0x0b,0x73,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,
-0x0c,0x54,0x63,0x6f,0x6d,0x6d,0x61,0x61,0x63,0x63,0x65,0x6e,0x74,0x0c,0x74,0x63,
-0x6f,0x6d,0x6d,0x61,0x61,0x63,0x63,0x65,0x6e,0x74,0x06,0x54,0x63,0x61,0x72,0x6f,
-0x6e,0x06,0x74,0x63,0x61,0x72,0x6f,0x6e,0x04,0x54,0x62,0x61,0x72,0x04,0x74,0x62,
-0x61,0x72,0x06,0x55,0x74,0x69,0x6c,0x64,0x65,0x06,0x75,0x74,0x69,0x6c,0x64,0x65,
-0x07,0x55,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x07,0x75,0x6d,0x61,0x63,0x72,0x6f,0x6e,
-0x06,0x55,0x62,0x72,0x65,0x76,0x65,0x06,0x75,0x62,0x72,0x65,0x76,0x65,0x05,0x55,
-0x72,0x69,0x6e,0x67,0x05,0x75,0x72,0x69,0x6e,0x67,0x0d,0x55,0x68,0x75,0x6e,0x67,
-0x61,0x72,0x75,0x6d,0x6c,0x61,0x75,0x74,0x0d,0x75,0x68,0x75,0x6e,0x67,0x61,0x72,
-0x75,0x6d,0x6c,0x61,0x75,0x74,0x07,0x55,0x6f,0x67,0x6f,0x6e,0x65,0x6b,0x07,0x75,
-0x6f,0x67,0x6f,0x6e,0x65,0x6b,0x0b,0x57,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,
-0x65,0x78,0x0b,0x77,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x0b,0x59,
-0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x0b,0x79,0x63,0x69,0x72,0x63,
-0x75,0x6d,0x66,0x6c,0x65,0x78,0x06,0x5a,0x61,0x63,0x75,0x74,0x65,0x06,0x7a,0x61,
-0x63,0x75,0x74,0x65,0x0a,0x5a,0x64,0x6f,0x74,0x61,0x63,0x63,0x65,0x6e,0x74,0x0a,
-0x7a,0x64,0x6f,0x74,0x61,0x63,0x63,0x65,0x6e,0x74,0x05,0x6c,0x6f,0x6e,0x67,0x73,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x38,0x30,0x07,0x75,0x6e,0x69,0x30,0x31,0x38,0x31,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x38,0x32,0x07,0x75,0x6e,0x69,0x30,0x31,0x38,0x33,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x38,0x34,0x07,0x75,0x6e,0x69,0x30,0x31,0x38,0x35,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x38,0x36,0x07,0x75,0x6e,0x69,0x30,0x31,0x38,0x37,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x38,0x38,0x07,0x75,0x6e,0x69,0x30,0x31,0x38,0x39,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x38,0x41,0x07,0x75,0x6e,0x69,0x30,0x31,0x38,0x42,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x38,0x43,0x07,0x75,0x6e,0x69,0x30,0x31,0x38,0x44,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x38,0x45,0x07,0x75,0x6e,0x69,0x30,0x31,0x38,0x46,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x39,0x30,0x07,0x75,0x6e,0x69,0x30,0x31,0x39,0x31,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x39,0x33,0x07,0x75,0x6e,0x69,0x30,0x31,0x39,0x34,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x39,0x35,0x07,0x75,0x6e,0x69,0x30,0x31,0x39,0x36,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x39,0x37,0x07,0x75,0x6e,0x69,0x30,0x31,0x39,0x38,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x39,0x39,0x07,0x75,0x6e,0x69,0x30,0x31,0x39,0x41,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x39,0x42,0x07,0x75,0x6e,0x69,0x30,0x31,0x39,0x43,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x39,0x44,0x07,0x75,0x6e,0x69,0x30,0x31,0x39,0x45,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x39,0x46,0x05,0x4f,0x68,0x6f,0x72,0x6e,0x05,0x6f,
-0x68,0x6f,0x72,0x6e,0x07,0x75,0x6e,0x69,0x30,0x31,0x41,0x32,0x07,0x75,0x6e,0x69,
-0x30,0x31,0x41,0x33,0x07,0x75,0x6e,0x69,0x30,0x31,0x41,0x34,0x07,0x75,0x6e,0x69,
-0x30,0x31,0x41,0x35,0x07,0x75,0x6e,0x69,0x30,0x31,0x41,0x36,0x07,0x75,0x6e,0x69,
-0x30,0x31,0x41,0x37,0x07,0x75,0x6e,0x69,0x30,0x31,0x41,0x38,0x07,0x75,0x6e,0x69,
-0x30,0x31,0x41,0x39,0x07,0x75,0x6e,0x69,0x30,0x31,0x41,0x41,0x07,0x75,0x6e,0x69,
-0x30,0x31,0x41,0x42,0x07,0x75,0x6e,0x69,0x30,0x31,0x41,0x43,0x07,0x75,0x6e,0x69,
-0x30,0x31,0x41,0x44,0x07,0x75,0x6e,0x69,0x30,0x31,0x41,0x45,0x05,0x55,0x68,0x6f,
-0x72,0x6e,0x05,0x75,0x68,0x6f,0x72,0x6e,0x07,0x75,0x6e,0x69,0x30,0x31,0x42,0x31,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x42,0x32,0x07,0x75,0x6e,0x69,0x30,0x31,0x42,0x33,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x42,0x34,0x07,0x75,0x6e,0x69,0x30,0x31,0x42,0x35,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x42,0x36,0x07,0x75,0x6e,0x69,0x30,0x31,0x42,0x37,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x42,0x38,0x07,0x75,0x6e,0x69,0x30,0x31,0x42,0x39,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x42,0x41,0x07,0x75,0x6e,0x69,0x30,0x31,0x42,0x42,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x42,0x43,0x07,0x75,0x6e,0x69,0x30,0x31,0x42,0x44,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x42,0x45,0x07,0x75,0x6e,0x69,0x30,0x31,0x42,0x46,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x43,0x30,0x07,0x75,0x6e,0x69,0x30,0x31,0x43,0x31,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x43,0x32,0x07,0x75,0x6e,0x69,0x30,0x31,0x43,0x33,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x43,0x34,0x07,0x75,0x6e,0x69,0x30,0x31,0x43,0x35,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x43,0x36,0x07,0x75,0x6e,0x69,0x30,0x31,0x43,0x37,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x43,0x38,0x07,0x75,0x6e,0x69,0x30,0x31,0x43,0x39,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x43,0x41,0x07,0x75,0x6e,0x69,0x30,0x31,0x43,0x42,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x43,0x43,0x07,0x75,0x6e,0x69,0x30,0x31,0x43,0x44,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x43,0x45,0x07,0x75,0x6e,0x69,0x30,0x31,0x43,0x46,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x44,0x30,0x07,0x75,0x6e,0x69,0x30,0x31,0x44,0x31,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x44,0x32,0x07,0x75,0x6e,0x69,0x30,0x31,0x44,0x33,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x44,0x34,0x07,0x75,0x6e,0x69,0x30,0x31,0x44,0x35,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x44,0x36,0x07,0x75,0x6e,0x69,0x30,0x31,0x44,0x37,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x44,0x38,0x07,0x75,0x6e,0x69,0x30,0x31,0x44,0x39,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x44,0x41,0x07,0x75,0x6e,0x69,0x30,0x31,0x44,0x42,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x44,0x43,0x07,0x75,0x6e,0x69,0x30,0x31,0x44,0x44,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x44,0x45,0x07,0x75,0x6e,0x69,0x30,0x31,0x44,0x46,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x45,0x30,0x07,0x75,0x6e,0x69,0x30,0x31,0x45,0x31,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x45,0x32,0x07,0x75,0x6e,0x69,0x30,0x31,0x45,0x33,
-0x07,0x75,0x6e,0x69,0x30,0x31,0x45,0x34,0x07,0x75,0x6e,0x69,0x30,0x31,0x45,0x35,
-0x06,0x47,0x63,0x61,0x72,0x6f,0x6e,0x06,0x67,0x63,0x61,0x72,0x6f,0x6e,0x07,0x75,
-0x6e,0x69,0x30,0x31,0x45,0x38,0x07,0x75,0x6e,0x69,0x30,0x31,0x45,0x39,0x07,0x75,
-0x6e,0x69,0x30,0x31,0x45,0x41,0x07,0x75,0x6e,0x69,0x30,0x31,0x45,0x42,0x07,0x75,
-0x6e,0x69,0x30,0x31,0x45,0x43,0x07,0x75,0x6e,0x69,0x30,0x31,0x45,0x44,0x07,0x75,
-0x6e,0x69,0x30,0x31,0x45,0x45,0x07,0x75,0x6e,0x69,0x30,0x31,0x45,0x46,0x07,0x75,
-0x6e,0x69,0x30,0x31,0x46,0x30,0x07,0x75,0x6e,0x69,0x30,0x31,0x46,0x31,0x07,0x75,
-0x6e,0x69,0x30,0x31,0x46,0x32,0x07,0x75,0x6e,0x69,0x30,0x31,0x46,0x33,0x07,0x75,
-0x6e,0x69,0x30,0x31,0x46,0x34,0x07,0x75,0x6e,0x69,0x30,0x31,0x46,0x35,0x07,0x75,
-0x6e,0x69,0x30,0x31,0x46,0x36,0x07,0x75,0x6e,0x69,0x30,0x31,0x46,0x37,0x07,0x75,
-0x6e,0x69,0x30,0x31,0x46,0x38,0x07,0x75,0x6e,0x69,0x30,0x31,0x46,0x39,0x0a,0x41,
-0x72,0x69,0x6e,0x67,0x61,0x63,0x75,0x74,0x65,0x0a,0x61,0x72,0x69,0x6e,0x67,0x61,
-0x63,0x75,0x74,0x65,0x07,0x41,0x45,0x61,0x63,0x75,0x74,0x65,0x07,0x61,0x65,0x61,
-0x63,0x75,0x74,0x65,0x0b,0x4f,0x73,0x6c,0x61,0x73,0x68,0x61,0x63,0x75,0x74,0x65,
-0x0b,0x6f,0x73,0x6c,0x61,0x73,0x68,0x61,0x63,0x75,0x74,0x65,0x07,0x75,0x6e,0x69,
-0x30,0x32,0x30,0x30,0x07,0x75,0x6e,0x69,0x30,0x32,0x30,0x31,0x07,0x75,0x6e,0x69,
-0x30,0x32,0x30,0x32,0x07,0x75,0x6e,0x69,0x30,0x32,0x30,0x33,0x07,0x75,0x6e,0x69,
-0x30,0x32,0x30,0x34,0x07,0x75,0x6e,0x69,0x30,0x32,0x30,0x35,0x07,0x75,0x6e,0x69,
-0x30,0x32,0x30,0x36,0x07,0x75,0x6e,0x69,0x30,0x32,0x30,0x37,0x07,0x75,0x6e,0x69,
-0x30,0x32,0x30,0x38,0x07,0x75,0x6e,0x69,0x30,0x32,0x30,0x39,0x07,0x75,0x6e,0x69,
-0x30,0x32,0x30,0x41,0x07,0x75,0x6e,0x69,0x30,0x32,0x30,0x42,0x07,0x75,0x6e,0x69,
-0x30,0x32,0x30,0x43,0x07,0x75,0x6e,0x69,0x30,0x32,0x30,0x44,0x07,0x75,0x6e,0x69,
-0x30,0x32,0x30,0x45,0x07,0x75,0x6e,0x69,0x30,0x32,0x30,0x46,0x07,0x75,0x6e,0x69,
-0x30,0x32,0x31,0x30,0x07,0x75,0x6e,0x69,0x30,0x32,0x31,0x31,0x07,0x75,0x6e,0x69,
-0x30,0x32,0x31,0x32,0x07,0x75,0x6e,0x69,0x30,0x32,0x31,0x33,0x07,0x75,0x6e,0x69,
-0x30,0x32,0x31,0x34,0x07,0x75,0x6e,0x69,0x30,0x32,0x31,0x35,0x07,0x75,0x6e,0x69,
-0x30,0x32,0x31,0x36,0x07,0x75,0x6e,0x69,0x30,0x32,0x31,0x37,0x0c,0x53,0x63,0x6f,
-0x6d,0x6d,0x61,0x61,0x63,0x63,0x65,0x6e,0x74,0x0c,0x73,0x63,0x6f,0x6d,0x6d,0x61,
-0x61,0x63,0x63,0x65,0x6e,0x74,0x07,0x75,0x6e,0x69,0x30,0x32,0x31,0x41,0x07,0x75,
-0x6e,0x69,0x30,0x32,0x31,0x42,0x07,0x75,0x6e,0x69,0x30,0x32,0x31,0x43,0x07,0x75,
-0x6e,0x69,0x30,0x32,0x31,0x44,0x07,0x75,0x6e,0x69,0x30,0x32,0x31,0x45,0x07,0x75,
-0x6e,0x69,0x30,0x32,0x31,0x46,0x07,0x75,0x6e,0x69,0x30,0x32,0x32,0x30,0x07,0x75,
-0x6e,0x69,0x30,0x32,0x32,0x31,0x07,0x75,0x6e,0x69,0x30,0x32,0x32,0x32,0x07,0x75,
-0x6e,0x69,0x30,0x32,0x32,0x33,0x07,0x75,0x6e,0x69,0x30,0x32,0x32,0x34,0x07,0x75,
-0x6e,0x69,0x30,0x32,0x32,0x35,0x07,0x75,0x6e,0x69,0x30,0x32,0x32,0x36,0x07,0x75,
-0x6e,0x69,0x30,0x32,0x32,0x37,0x07,0x75,0x6e,0x69,0x30,0x32,0x32,0x38,0x07,0x75,
-0x6e,0x69,0x30,0x32,0x32,0x39,0x07,0x75,0x6e,0x69,0x30,0x32,0x32,0x41,0x07,0x75,
-0x6e,0x69,0x30,0x32,0x32,0x42,0x07,0x75,0x6e,0x69,0x30,0x32,0x32,0x43,0x07,0x75,
-0x6e,0x69,0x30,0x32,0x32,0x44,0x07,0x75,0x6e,0x69,0x30,0x32,0x32,0x45,0x07,0x75,
-0x6e,0x69,0x30,0x32,0x32,0x46,0x07,0x75,0x6e,0x69,0x30,0x32,0x33,0x30,0x07,0x75,
-0x6e,0x69,0x30,0x32,0x33,0x31,0x07,0x75,0x6e,0x69,0x30,0x32,0x33,0x32,0x07,0x75,
-0x6e,0x69,0x30,0x32,0x33,0x33,0x07,0x75,0x6e,0x69,0x30,0x32,0x33,0x34,0x07,0x75,
-0x6e,0x69,0x30,0x32,0x33,0x35,0x07,0x75,0x6e,0x69,0x30,0x32,0x33,0x36,0x08,0x64,
-0x6f,0x74,0x6c,0x65,0x73,0x73,0x6a,0x07,0x75,0x6e,0x69,0x30,0x32,0x33,0x38,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x33,0x39,0x07,0x75,0x6e,0x69,0x30,0x32,0x33,0x41,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x33,0x42,0x07,0x75,0x6e,0x69,0x30,0x32,0x33,0x43,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x33,0x44,0x07,0x75,0x6e,0x69,0x30,0x32,0x33,0x45,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x33,0x46,0x07,0x75,0x6e,0x69,0x30,0x32,0x34,0x30,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x34,0x31,0x07,0x75,0x6e,0x69,0x30,0x32,0x35,0x30,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x35,0x31,0x07,0x75,0x6e,0x69,0x30,0x32,0x35,0x32,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x35,0x33,0x07,0x75,0x6e,0x69,0x30,0x32,0x35,0x34,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x35,0x35,0x07,0x75,0x6e,0x69,0x30,0x32,0x35,0x36,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x35,0x37,0x07,0x75,0x6e,0x69,0x30,0x32,0x35,0x38,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x35,0x39,0x07,0x75,0x6e,0x69,0x30,0x32,0x35,0x41,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x35,0x42,0x07,0x75,0x6e,0x69,0x30,0x32,0x35,0x43,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x35,0x44,0x07,0x75,0x6e,0x69,0x30,0x32,0x35,0x45,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x35,0x46,0x07,0x75,0x6e,0x69,0x30,0x32,0x36,0x30,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x36,0x31,0x07,0x75,0x6e,0x69,0x30,0x32,0x36,0x32,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x36,0x33,0x07,0x75,0x6e,0x69,0x30,0x32,0x36,0x34,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x36,0x35,0x07,0x75,0x6e,0x69,0x30,0x32,0x36,0x36,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x36,0x37,0x07,0x75,0x6e,0x69,0x30,0x32,0x36,0x38,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x36,0x39,0x07,0x75,0x6e,0x69,0x30,0x32,0x36,0x41,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x36,0x42,0x07,0x75,0x6e,0x69,0x30,0x32,0x36,0x43,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x36,0x44,0x07,0x75,0x6e,0x69,0x30,0x32,0x36,0x45,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x36,0x46,0x07,0x75,0x6e,0x69,0x30,0x32,0x37,0x30,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x37,0x31,0x07,0x75,0x6e,0x69,0x30,0x32,0x37,0x32,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x37,0x33,0x07,0x75,0x6e,0x69,0x30,0x32,0x37,0x34,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x37,0x35,0x07,0x75,0x6e,0x69,0x30,0x32,0x37,0x36,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x37,0x37,0x07,0x75,0x6e,0x69,0x30,0x32,0x37,0x38,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x37,0x39,0x07,0x75,0x6e,0x69,0x30,0x32,0x37,0x41,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x37,0x42,0x07,0x75,0x6e,0x69,0x30,0x32,0x37,0x43,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x37,0x44,0x07,0x75,0x6e,0x69,0x30,0x32,0x37,0x45,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x37,0x46,0x07,0x75,0x6e,0x69,0x30,0x32,0x38,0x30,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x38,0x31,0x07,0x75,0x6e,0x69,0x30,0x32,0x38,0x32,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x38,0x33,0x07,0x75,0x6e,0x69,0x30,0x32,0x38,0x34,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x38,0x35,0x07,0x75,0x6e,0x69,0x30,0x32,0x38,0x36,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x38,0x37,0x07,0x75,0x6e,0x69,0x30,0x32,0x38,0x38,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x38,0x39,0x07,0x75,0x6e,0x69,0x30,0x32,0x38,0x41,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x38,0x42,0x07,0x75,0x6e,0x69,0x30,0x32,0x38,0x43,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x38,0x44,0x07,0x75,0x6e,0x69,0x30,0x32,0x38,0x45,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x38,0x46,0x07,0x75,0x6e,0x69,0x30,0x32,0x39,0x30,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x39,0x31,0x07,0x75,0x6e,0x69,0x30,0x32,0x39,0x32,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x39,0x33,0x07,0x75,0x6e,0x69,0x30,0x32,0x39,0x34,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x39,0x35,0x07,0x75,0x6e,0x69,0x30,0x32,0x39,0x36,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x39,0x37,0x07,0x75,0x6e,0x69,0x30,0x32,0x39,0x38,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x39,0x39,0x07,0x75,0x6e,0x69,0x30,0x32,0x39,0x41,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x39,0x42,0x07,0x75,0x6e,0x69,0x30,0x32,0x39,0x43,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x39,0x44,0x07,0x75,0x6e,0x69,0x30,0x32,0x39,0x45,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x39,0x46,0x07,0x75,0x6e,0x69,0x30,0x32,0x41,0x30,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x41,0x31,0x07,0x75,0x6e,0x69,0x30,0x32,0x41,0x32,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x41,0x33,0x07,0x75,0x6e,0x69,0x30,0x32,0x41,0x34,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x41,0x35,0x07,0x75,0x6e,0x69,0x30,0x32,0x41,0x36,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x41,0x37,0x07,0x75,0x6e,0x69,0x30,0x32,0x41,0x38,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x41,0x39,0x07,0x75,0x6e,0x69,0x30,0x32,0x41,0x41,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x41,0x42,0x07,0x75,0x6e,0x69,0x30,0x32,0x41,0x43,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x41,0x44,0x07,0x75,0x6e,0x69,0x30,0x32,0x41,0x45,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x41,0x46,0x07,0x75,0x6e,0x69,0x30,0x32,0x42,0x30,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x42,0x31,0x07,0x75,0x6e,0x69,0x30,0x32,0x42,0x32,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x42,0x33,0x07,0x75,0x6e,0x69,0x30,0x32,0x42,0x34,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x42,0x35,0x07,0x75,0x6e,0x69,0x30,0x32,0x42,0x36,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x42,0x37,0x07,0x75,0x6e,0x69,0x30,0x32,0x42,0x38,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x42,0x39,0x07,0x75,0x6e,0x69,0x30,0x32,0x42,0x41,0x07,
-0x75,0x6e,0x69,0x30,0x32,0x42,0x42,0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x39,0x32,
-0x39,0x09,0x61,0x66,0x69,0x69,0x36,0x34,0x39,0x33,0x37,0x07,0x75,0x6e,0x69,0x30,
-0x32,0x42,0x45,0x07,0x75,0x6e,0x69,0x30,0x32,0x42,0x46,0x07,0x75,0x6e,0x69,0x30,
-0x32,0x43,0x30,0x07,0x75,0x6e,0x69,0x30,0x32,0x43,0x31,0x07,0x75,0x6e,0x69,0x30,
-0x32,0x43,0x32,0x07,0x75,0x6e,0x69,0x30,0x32,0x43,0x33,0x07,0x75,0x6e,0x69,0x30,
-0x32,0x43,0x34,0x07,0x75,0x6e,0x69,0x30,0x32,0x43,0x35,0x07,0x75,0x6e,0x69,0x30,
-0x32,0x43,0x38,0x07,0x75,0x6e,0x69,0x30,0x32,0x43,0x39,0x07,0x75,0x6e,0x69,0x30,
-0x32,0x43,0x41,0x07,0x75,0x6e,0x69,0x30,0x32,0x43,0x42,0x07,0x75,0x6e,0x69,0x30,
-0x32,0x43,0x43,0x07,0x75,0x6e,0x69,0x30,0x32,0x43,0x44,0x07,0x75,0x6e,0x69,0x30,
-0x32,0x43,0x45,0x07,0x75,0x6e,0x69,0x30,0x32,0x43,0x46,0x07,0x75,0x6e,0x69,0x30,
-0x32,0x44,0x30,0x07,0x75,0x6e,0x69,0x30,0x32,0x44,0x31,0x07,0x75,0x6e,0x69,0x30,
-0x32,0x44,0x32,0x07,0x75,0x6e,0x69,0x30,0x32,0x44,0x33,0x07,0x75,0x6e,0x69,0x30,
-0x32,0x44,0x34,0x07,0x75,0x6e,0x69,0x30,0x32,0x44,0x35,0x07,0x75,0x6e,0x69,0x30,
-0x32,0x44,0x36,0x07,0x75,0x6e,0x69,0x30,0x32,0x44,0x37,0x07,0x75,0x6e,0x69,0x30,
-0x32,0x44,0x45,0x07,0x75,0x6e,0x69,0x30,0x32,0x44,0x46,0x07,0x75,0x6e,0x69,0x30,
-0x32,0x45,0x30,0x07,0x75,0x6e,0x69,0x30,0x32,0x45,0x31,0x07,0x75,0x6e,0x69,0x30,
-0x32,0x45,0x32,0x07,0x75,0x6e,0x69,0x30,0x32,0x45,0x33,0x07,0x75,0x6e,0x69,0x30,
-0x32,0x45,0x34,0x07,0x75,0x6e,0x69,0x30,0x32,0x45,0x35,0x07,0x75,0x6e,0x69,0x30,
-0x32,0x45,0x36,0x07,0x75,0x6e,0x69,0x30,0x32,0x45,0x37,0x07,0x75,0x6e,0x69,0x30,
-0x32,0x45,0x38,0x07,0x75,0x6e,0x69,0x30,0x32,0x45,0x39,0x07,0x75,0x6e,0x69,0x30,
-0x32,0x45,0x43,0x07,0x75,0x6e,0x69,0x30,0x32,0x45,0x44,0x07,0x75,0x6e,0x69,0x30,
-0x32,0x45,0x45,0x07,0x75,0x6e,0x69,0x30,0x32,0x46,0x33,0x07,0x75,0x6e,0x69,0x30,
-0x32,0x46,0x37,0x09,0x67,0x72,0x61,0x76,0x65,0x63,0x6f,0x6d,0x62,0x09,0x61,0x63,
-0x75,0x74,0x65,0x63,0x6f,0x6d,0x62,0x07,0x75,0x6e,0x69,0x30,0x33,0x30,0x32,0x09,
-0x74,0x69,0x6c,0x64,0x65,0x63,0x6f,0x6d,0x62,0x07,0x75,0x6e,0x69,0x30,0x33,0x30,
-0x34,0x07,0x75,0x6e,0x69,0x30,0x33,0x30,0x35,0x07,0x75,0x6e,0x69,0x30,0x33,0x30,
-0x36,0x07,0x75,0x6e,0x69,0x30,0x33,0x30,0x37,0x07,0x75,0x6e,0x69,0x30,0x33,0x30,
-0x38,0x0d,0x68,0x6f,0x6f,0x6b,0x61,0x62,0x6f,0x76,0x65,0x63,0x6f,0x6d,0x62,0x07,
-0x75,0x6e,0x69,0x30,0x33,0x30,0x41,0x07,0x75,0x6e,0x69,0x30,0x33,0x30,0x42,0x07,
-0x75,0x6e,0x69,0x30,0x33,0x30,0x43,0x07,0x75,0x6e,0x69,0x30,0x33,0x30,0x44,0x07,
-0x75,0x6e,0x69,0x30,0x33,0x30,0x45,0x07,0x75,0x6e,0x69,0x30,0x33,0x30,0x46,0x07,
-0x75,0x6e,0x69,0x30,0x33,0x31,0x30,0x07,0x75,0x6e,0x69,0x30,0x33,0x31,0x31,0x07,
-0x75,0x6e,0x69,0x30,0x33,0x31,0x32,0x07,0x75,0x6e,0x69,0x30,0x33,0x31,0x33,0x07,
-0x75,0x6e,0x69,0x30,0x33,0x31,0x34,0x07,0x75,0x6e,0x69,0x30,0x33,0x31,0x35,0x07,
-0x75,0x6e,0x69,0x30,0x33,0x31,0x36,0x07,0x75,0x6e,0x69,0x30,0x33,0x31,0x37,0x07,
-0x75,0x6e,0x69,0x30,0x33,0x31,0x38,0x07,0x75,0x6e,0x69,0x30,0x33,0x31,0x39,0x07,
-0x75,0x6e,0x69,0x30,0x33,0x31,0x41,0x07,0x75,0x6e,0x69,0x30,0x33,0x31,0x42,0x07,
-0x75,0x6e,0x69,0x30,0x33,0x31,0x43,0x07,0x75,0x6e,0x69,0x30,0x33,0x31,0x44,0x07,
-0x75,0x6e,0x69,0x30,0x33,0x31,0x45,0x07,0x75,0x6e,0x69,0x30,0x33,0x31,0x46,0x07,
-0x75,0x6e,0x69,0x30,0x33,0x32,0x30,0x07,0x75,0x6e,0x69,0x30,0x33,0x32,0x31,0x07,
-0x75,0x6e,0x69,0x30,0x33,0x32,0x32,0x0c,0x64,0x6f,0x74,0x62,0x65,0x6c,0x6f,0x77,
-0x63,0x6f,0x6d,0x62,0x07,0x75,0x6e,0x69,0x30,0x33,0x32,0x34,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x32,0x35,0x07,0x75,0x6e,0x69,0x30,0x33,0x32,0x36,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x32,0x37,0x07,0x75,0x6e,0x69,0x30,0x33,0x32,0x38,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x32,0x39,0x07,0x75,0x6e,0x69,0x30,0x33,0x32,0x41,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x32,0x42,0x07,0x75,0x6e,0x69,0x30,0x33,0x32,0x43,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x32,0x44,0x07,0x75,0x6e,0x69,0x30,0x33,0x32,0x45,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x32,0x46,0x07,0x75,0x6e,0x69,0x30,0x33,0x33,0x30,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x33,0x31,0x07,0x75,0x6e,0x69,0x30,0x33,0x33,0x32,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x33,0x33,0x07,0x75,0x6e,0x69,0x30,0x33,0x33,0x34,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x33,0x35,0x07,0x75,0x6e,0x69,0x30,0x33,0x33,0x36,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x33,0x37,0x07,0x75,0x6e,0x69,0x30,0x33,0x33,0x38,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x33,0x39,0x07,0x75,0x6e,0x69,0x30,0x33,0x33,0x41,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x33,0x42,0x07,0x75,0x6e,0x69,0x30,0x33,0x33,0x43,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x33,0x44,0x07,0x75,0x6e,0x69,0x30,0x33,0x33,0x45,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x33,0x46,0x07,0x75,0x6e,0x69,0x30,0x33,0x34,0x30,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x34,0x31,0x07,0x75,0x6e,0x69,0x30,0x33,0x34,0x32,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x34,0x33,0x07,0x75,0x6e,0x69,0x30,0x33,0x34,0x34,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x34,0x35,0x07,0x75,0x6e,0x69,0x30,0x33,0x34,0x36,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x34,0x37,0x07,0x75,0x6e,0x69,0x30,0x33,0x34,0x38,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x34,0x39,0x07,0x75,0x6e,0x69,0x30,0x33,0x34,0x41,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x34,0x42,0x07,0x75,0x6e,0x69,0x30,0x33,0x34,0x43,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x34,0x44,0x07,0x75,0x6e,0x69,0x30,0x33,0x34,0x45,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x35,0x31,0x07,0x75,0x6e,0x69,0x30,0x33,0x35,0x32,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x35,0x33,0x07,0x75,0x6e,0x69,0x30,0x33,0x35,0x37,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x35,0x38,0x07,0x75,0x6e,0x69,0x30,0x33,0x35,0x43,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x35,0x44,0x07,0x75,0x6e,0x69,0x30,0x33,0x36,0x30,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x36,0x31,0x07,0x75,0x6e,0x69,0x30,0x33,0x36,0x32,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x37,0x34,0x07,0x75,0x6e,0x69,0x30,0x33,0x37,0x35,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x37,0x41,0x07,0x75,0x6e,0x69,0x30,0x33,0x37,0x45,0x05,0x74,0x6f,0x6e,
-0x6f,0x73,0x0d,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73,0x74,0x6f,0x6e,0x6f,0x73,
-0x0a,0x41,0x6c,0x70,0x68,0x61,0x74,0x6f,0x6e,0x6f,0x73,0x09,0x61,0x6e,0x6f,0x74,
-0x65,0x6c,0x65,0x69,0x61,0x0c,0x45,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x74,0x6f,0x6e,
-0x6f,0x73,0x08,0x45,0x74,0x61,0x74,0x6f,0x6e,0x6f,0x73,0x09,0x49,0x6f,0x74,0x61,
-0x74,0x6f,0x6e,0x6f,0x73,0x0c,0x4f,0x6d,0x69,0x63,0x72,0x6f,0x6e,0x74,0x6f,0x6e,
-0x6f,0x73,0x0c,0x55,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x74,0x6f,0x6e,0x6f,0x73,0x0a,
-0x4f,0x6d,0x65,0x67,0x61,0x74,0x6f,0x6e,0x6f,0x73,0x11,0x69,0x6f,0x74,0x61,0x64,
-0x69,0x65,0x72,0x65,0x73,0x69,0x73,0x74,0x6f,0x6e,0x6f,0x73,0x05,0x41,0x6c,0x70,
-0x68,0x61,0x04,0x42,0x65,0x74,0x61,0x05,0x47,0x61,0x6d,0x6d,0x61,0x07,0x75,0x6e,
-0x69,0x30,0x33,0x39,0x34,0x07,0x45,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x04,0x5a,0x65,
-0x74,0x61,0x03,0x45,0x74,0x61,0x05,0x54,0x68,0x65,0x74,0x61,0x04,0x49,0x6f,0x74,
-0x61,0x05,0x4b,0x61,0x70,0x70,0x61,0x06,0x4c,0x61,0x6d,0x62,0x64,0x61,0x02,0x4d,
-0x75,0x02,0x4e,0x75,0x02,0x58,0x69,0x07,0x4f,0x6d,0x69,0x63,0x72,0x6f,0x6e,0x02,
-0x50,0x69,0x03,0x52,0x68,0x6f,0x05,0x53,0x69,0x67,0x6d,0x61,0x03,0x54,0x61,0x75,
-0x07,0x55,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x03,0x50,0x68,0x69,0x03,0x43,0x68,0x69,
-0x03,0x50,0x73,0x69,0x0c,0x49,0x6f,0x74,0x61,0x64,0x69,0x65,0x72,0x65,0x73,0x69,
-0x73,0x0f,0x55,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x64,0x69,0x65,0x72,0x65,0x73,0x69,
-0x73,0x0a,0x61,0x6c,0x70,0x68,0x61,0x74,0x6f,0x6e,0x6f,0x73,0x0c,0x65,0x70,0x73,
-0x69,0x6c,0x6f,0x6e,0x74,0x6f,0x6e,0x6f,0x73,0x08,0x65,0x74,0x61,0x74,0x6f,0x6e,
-0x6f,0x73,0x09,0x69,0x6f,0x74,0x61,0x74,0x6f,0x6e,0x6f,0x73,0x14,0x75,0x70,0x73,
-0x69,0x6c,0x6f,0x6e,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73,0x74,0x6f,0x6e,0x6f,
-0x73,0x05,0x61,0x6c,0x70,0x68,0x61,0x04,0x62,0x65,0x74,0x61,0x05,0x67,0x61,0x6d,
-0x6d,0x61,0x05,0x64,0x65,0x6c,0x74,0x61,0x07,0x65,0x70,0x73,0x69,0x6c,0x6f,0x6e,
-0x04,0x7a,0x65,0x74,0x61,0x03,0x65,0x74,0x61,0x05,0x74,0x68,0x65,0x74,0x61,0x04,
-0x69,0x6f,0x74,0x61,0x05,0x6b,0x61,0x70,0x70,0x61,0x06,0x6c,0x61,0x6d,0x62,0x64,
-0x61,0x07,0x75,0x6e,0x69,0x30,0x33,0x42,0x43,0x02,0x6e,0x75,0x02,0x78,0x69,0x07,
-0x6f,0x6d,0x69,0x63,0x72,0x6f,0x6e,0x03,0x72,0x68,0x6f,0x06,0x73,0x69,0x67,0x6d,
-0x61,0x31,0x05,0x73,0x69,0x67,0x6d,0x61,0x03,0x74,0x61,0x75,0x07,0x75,0x70,0x73,
-0x69,0x6c,0x6f,0x6e,0x03,0x70,0x68,0x69,0x03,0x63,0x68,0x69,0x03,0x70,0x73,0x69,
-0x05,0x6f,0x6d,0x65,0x67,0x61,0x0c,0x69,0x6f,0x74,0x61,0x64,0x69,0x65,0x72,0x65,
-0x73,0x69,0x73,0x0f,0x75,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x64,0x69,0x65,0x72,0x65,
-0x73,0x69,0x73,0x0c,0x6f,0x6d,0x69,0x63,0x72,0x6f,0x6e,0x74,0x6f,0x6e,0x6f,0x73,
-0x0c,0x75,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x74,0x6f,0x6e,0x6f,0x73,0x0a,0x6f,0x6d,
-0x65,0x67,0x61,0x74,0x6f,0x6e,0x6f,0x73,0x07,0x75,0x6e,0x69,0x30,0x33,0x44,0x30,
-0x06,0x74,0x68,0x65,0x74,0x61,0x31,0x08,0x55,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x31,
-0x07,0x75,0x6e,0x69,0x30,0x33,0x44,0x33,0x07,0x75,0x6e,0x69,0x30,0x33,0x44,0x34,
-0x04,0x70,0x68,0x69,0x31,0x06,0x6f,0x6d,0x65,0x67,0x61,0x31,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x44,0x37,0x07,0x75,0x6e,0x69,0x30,0x33,0x44,0x38,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x44,0x39,0x07,0x75,0x6e,0x69,0x30,0x33,0x44,0x41,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x44,0x42,0x07,0x75,0x6e,0x69,0x30,0x33,0x44,0x43,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x44,0x44,0x07,0x75,0x6e,0x69,0x30,0x33,0x44,0x45,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x44,0x46,0x07,0x75,0x6e,0x69,0x30,0x33,0x45,0x30,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x45,0x31,0x07,0x75,0x6e,0x69,0x30,0x33,0x45,0x32,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x45,0x33,0x07,0x75,0x6e,0x69,0x30,0x33,0x45,0x34,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x45,0x35,0x07,0x75,0x6e,0x69,0x30,0x33,0x45,0x36,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x45,0x37,0x07,0x75,0x6e,0x69,0x30,0x33,0x45,0x38,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x45,0x39,0x07,0x75,0x6e,0x69,0x30,0x33,0x45,0x41,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x45,0x42,0x07,0x75,0x6e,0x69,0x30,0x33,0x45,0x43,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x45,0x44,0x07,0x75,0x6e,0x69,0x30,0x33,0x45,0x45,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x45,0x46,0x07,0x75,0x6e,0x69,0x30,0x33,0x46,0x30,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x46,0x31,0x07,0x75,0x6e,0x69,0x30,0x33,0x46,0x32,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x46,0x33,0x07,0x75,0x6e,0x69,0x30,0x33,0x46,0x34,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x46,0x35,0x07,0x75,0x6e,0x69,0x30,0x33,0x46,0x36,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x46,0x37,0x07,0x75,0x6e,0x69,0x30,0x33,0x46,0x38,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x46,0x39,0x07,0x75,0x6e,0x69,0x30,0x33,0x46,0x41,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x46,0x42,0x07,0x75,0x6e,0x69,0x30,0x33,0x46,0x43,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x46,0x44,0x07,0x75,0x6e,0x69,0x30,0x33,0x46,0x45,0x07,0x75,0x6e,0x69,
-0x30,0x33,0x46,0x46,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x30,0x09,0x61,0x66,0x69,
-0x69,0x31,0x30,0x30,0x32,0x33,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,0x35,0x31,
-0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,0x35,0x32,0x09,0x61,0x66,0x69,0x69,0x31,
-0x30,0x30,0x35,0x33,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,0x35,0x34,0x09,0x61,
-0x66,0x69,0x69,0x31,0x30,0x30,0x35,0x35,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,
-0x35,0x36,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,0x35,0x37,0x09,0x61,0x66,0x69,
-0x69,0x31,0x30,0x30,0x35,0x38,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,0x35,0x39,
-0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,0x36,0x30,0x09,0x61,0x66,0x69,0x69,0x31,
-0x30,0x30,0x36,0x31,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x44,0x09,0x61,0x66,0x69,
-0x69,0x31,0x30,0x30,0x36,0x32,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x31,0x34,0x35,
-0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,0x31,0x37,0x09,0x61,0x66,0x69,0x69,0x31,
-0x30,0x30,0x31,0x38,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,0x31,0x39,0x09,0x61,
-0x66,0x69,0x69,0x31,0x30,0x30,0x32,0x30,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,
-0x32,0x31,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,0x32,0x32,0x09,0x61,0x66,0x69,
-0x69,0x31,0x30,0x30,0x32,0x34,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,0x32,0x35,
-0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,0x32,0x36,0x09,0x61,0x66,0x69,0x69,0x31,
-0x30,0x30,0x32,0x37,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,0x32,0x38,0x09,0x61,
-0x66,0x69,0x69,0x31,0x30,0x30,0x32,0x39,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,
-0x33,0x30,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,0x33,0x31,0x09,0x61,0x66,0x69,
-0x69,0x31,0x30,0x30,0x33,0x32,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,0x33,0x33,
-0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,0x33,0x34,0x09,0x61,0x66,0x69,0x69,0x31,
-0x30,0x30,0x33,0x35,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,0x33,0x36,0x09,0x61,
-0x66,0x69,0x69,0x31,0x30,0x30,0x33,0x37,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,
-0x33,0x38,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,0x33,0x39,0x09,0x61,0x66,0x69,
-0x69,0x31,0x30,0x30,0x34,0x30,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,0x34,0x31,
-0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,0x34,0x32,0x09,0x61,0x66,0x69,0x69,0x31,
-0x30,0x30,0x34,0x33,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,0x34,0x34,0x09,0x61,
-0x66,0x69,0x69,0x31,0x30,0x30,0x34,0x35,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,
-0x34,0x36,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,0x34,0x37,0x09,0x61,0x66,0x69,
-0x69,0x31,0x30,0x30,0x34,0x38,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,0x34,0x39,
-0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,0x36,0x35,0x09,0x61,0x66,0x69,0x69,0x31,
-0x30,0x30,0x36,0x36,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,0x36,0x37,0x09,0x61,
-0x66,0x69,0x69,0x31,0x30,0x30,0x36,0x38,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,
-0x36,0x39,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,0x37,0x30,0x09,0x61,0x66,0x69,
-0x69,0x31,0x30,0x30,0x37,0x32,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,0x37,0x33,
-0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,0x37,0x34,0x09,0x61,0x66,0x69,0x69,0x31,
-0x30,0x30,0x37,0x35,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,0x37,0x36,0x09,0x61,
-0x66,0x69,0x69,0x31,0x30,0x30,0x37,0x37,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,
-0x37,0x38,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,0x37,0x39,0x09,0x61,0x66,0x69,
-0x69,0x31,0x30,0x30,0x38,0x30,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,0x38,0x31,
-0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,0x38,0x32,0x09,0x61,0x66,0x69,0x69,0x31,
-0x30,0x30,0x38,0x33,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,0x38,0x34,0x09,0x61,
-0x66,0x69,0x69,0x31,0x30,0x30,0x38,0x35,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,
-0x38,0x36,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,0x38,0x37,0x09,0x61,0x66,0x69,
-0x69,0x31,0x30,0x30,0x38,0x38,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,0x38,0x39,
-0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,0x39,0x30,0x09,0x61,0x66,0x69,0x69,0x31,
-0x30,0x30,0x39,0x31,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,0x39,0x32,0x09,0x61,
-0x66,0x69,0x69,0x31,0x30,0x30,0x39,0x33,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,
-0x39,0x34,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,0x39,0x35,0x09,0x61,0x66,0x69,
-0x69,0x31,0x30,0x30,0x39,0x36,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,0x39,0x37,
-0x07,0x75,0x6e,0x69,0x30,0x34,0x35,0x30,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,
-0x37,0x31,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,0x39,0x39,0x09,0x61,0x66,0x69,
-0x69,0x31,0x30,0x31,0x30,0x30,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x31,0x30,0x31,
-0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x31,0x30,0x32,0x09,0x61,0x66,0x69,0x69,0x31,
-0x30,0x31,0x30,0x33,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x31,0x30,0x34,0x09,0x61,
-0x66,0x69,0x69,0x31,0x30,0x31,0x30,0x35,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x31,
-0x30,0x36,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x31,0x30,0x37,0x09,0x61,0x66,0x69,
-0x69,0x31,0x30,0x31,0x30,0x38,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x31,0x30,0x39,
-0x07,0x75,0x6e,0x69,0x30,0x34,0x35,0x44,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x31,
-0x31,0x30,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x31,0x39,0x33,0x07,0x75,0x6e,0x69,
-0x30,0x34,0x36,0x30,0x07,0x75,0x6e,0x69,0x30,0x34,0x36,0x31,0x09,0x61,0x66,0x69,
-0x69,0x31,0x30,0x31,0x34,0x36,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x31,0x39,0x34,
-0x07,0x75,0x6e,0x69,0x30,0x34,0x36,0x34,0x07,0x75,0x6e,0x69,0x30,0x34,0x36,0x35,
-0x07,0x75,0x6e,0x69,0x30,0x34,0x36,0x36,0x07,0x75,0x6e,0x69,0x30,0x34,0x36,0x37,
-0x07,0x75,0x6e,0x69,0x30,0x34,0x36,0x38,0x07,0x75,0x6e,0x69,0x30,0x34,0x36,0x39,
-0x07,0x75,0x6e,0x69,0x30,0x34,0x36,0x41,0x07,0x75,0x6e,0x69,0x30,0x34,0x36,0x42,
-0x07,0x75,0x6e,0x69,0x30,0x34,0x36,0x43,0x07,0x75,0x6e,0x69,0x30,0x34,0x36,0x44,
-0x07,0x75,0x6e,0x69,0x30,0x34,0x36,0x45,0x07,0x75,0x6e,0x69,0x30,0x34,0x36,0x46,
-0x07,0x75,0x6e,0x69,0x30,0x34,0x37,0x30,0x07,0x75,0x6e,0x69,0x30,0x34,0x37,0x31,
-0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x31,0x34,0x37,0x09,0x61,0x66,0x69,0x69,0x31,
-0x30,0x31,0x39,0x35,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x31,0x34,0x38,0x09,0x61,
-0x66,0x69,0x69,0x31,0x30,0x31,0x39,0x36,0x07,0x75,0x6e,0x69,0x30,0x34,0x37,0x36,
-0x07,0x75,0x6e,0x69,0x30,0x34,0x37,0x37,0x07,0x75,0x6e,0x69,0x30,0x34,0x37,0x38,
-0x07,0x75,0x6e,0x69,0x30,0x34,0x37,0x39,0x07,0x75,0x6e,0x69,0x30,0x34,0x37,0x41,
-0x07,0x75,0x6e,0x69,0x30,0x34,0x37,0x42,0x07,0x75,0x6e,0x69,0x30,0x34,0x37,0x43,
-0x07,0x75,0x6e,0x69,0x30,0x34,0x37,0x44,0x07,0x75,0x6e,0x69,0x30,0x34,0x37,0x45,
-0x07,0x75,0x6e,0x69,0x30,0x34,0x37,0x46,0x07,0x75,0x6e,0x69,0x30,0x34,0x38,0x30,
-0x07,0x75,0x6e,0x69,0x30,0x34,0x38,0x31,0x07,0x75,0x6e,0x69,0x30,0x34,0x38,0x32,
-0x07,0x75,0x6e,0x69,0x30,0x34,0x38,0x33,0x07,0x75,0x6e,0x69,0x30,0x34,0x38,0x34,
-0x07,0x75,0x6e,0x69,0x30,0x34,0x38,0x35,0x07,0x75,0x6e,0x69,0x30,0x34,0x38,0x36,
-0x07,0x75,0x6e,0x69,0x30,0x34,0x38,0x38,0x07,0x75,0x6e,0x69,0x30,0x34,0x38,0x39,
-0x07,0x75,0x6e,0x69,0x30,0x34,0x38,0x41,0x07,0x75,0x6e,0x69,0x30,0x34,0x38,0x42,
-0x07,0x75,0x6e,0x69,0x30,0x34,0x38,0x43,0x07,0x75,0x6e,0x69,0x30,0x34,0x38,0x44,
-0x07,0x75,0x6e,0x69,0x30,0x34,0x38,0x45,0x07,0x75,0x6e,0x69,0x30,0x34,0x38,0x46,
-0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x30,0x35,0x30,0x09,0x61,0x66,0x69,0x69,0x31,
-0x30,0x30,0x39,0x38,0x07,0x75,0x6e,0x69,0x30,0x34,0x39,0x32,0x07,0x75,0x6e,0x69,
-0x30,0x34,0x39,0x33,0x07,0x75,0x6e,0x69,0x30,0x34,0x39,0x34,0x07,0x75,0x6e,0x69,
-0x30,0x34,0x39,0x35,0x07,0x75,0x6e,0x69,0x30,0x34,0x39,0x36,0x07,0x75,0x6e,0x69,
-0x30,0x34,0x39,0x37,0x07,0x75,0x6e,0x69,0x30,0x34,0x39,0x38,0x07,0x75,0x6e,0x69,
-0x30,0x34,0x39,0x39,0x07,0x75,0x6e,0x69,0x30,0x34,0x39,0x41,0x07,0x75,0x6e,0x69,
-0x30,0x34,0x39,0x42,0x07,0x75,0x6e,0x69,0x30,0x34,0x39,0x43,0x07,0x75,0x6e,0x69,
-0x30,0x34,0x39,0x44,0x07,0x75,0x6e,0x69,0x30,0x34,0x39,0x45,0x07,0x75,0x6e,0x69,
-0x30,0x34,0x39,0x46,0x07,0x75,0x6e,0x69,0x30,0x34,0x41,0x30,0x07,0x75,0x6e,0x69,
-0x30,0x34,0x41,0x31,0x07,0x75,0x6e,0x69,0x30,0x34,0x41,0x32,0x07,0x75,0x6e,0x69,
-0x30,0x34,0x41,0x33,0x07,0x75,0x6e,0x69,0x30,0x34,0x41,0x34,0x07,0x75,0x6e,0x69,
-0x30,0x34,0x41,0x35,0x07,0x75,0x6e,0x69,0x30,0x34,0x41,0x36,0x07,0x75,0x6e,0x69,
-0x30,0x34,0x41,0x37,0x07,0x75,0x6e,0x69,0x30,0x34,0x41,0x38,0x07,0x75,0x6e,0x69,
-0x30,0x34,0x41,0x39,0x07,0x75,0x6e,0x69,0x30,0x34,0x41,0x41,0x07,0x75,0x6e,0x69,
-0x30,0x34,0x41,0x42,0x07,0x75,0x6e,0x69,0x30,0x34,0x41,0x43,0x07,0x75,0x6e,0x69,
-0x30,0x34,0x41,0x44,0x07,0x75,0x6e,0x69,0x30,0x34,0x41,0x45,0x07,0x75,0x6e,0x69,
-0x30,0x34,0x41,0x46,0x07,0x75,0x6e,0x69,0x30,0x34,0x42,0x30,0x07,0x75,0x6e,0x69,
-0x30,0x34,0x42,0x31,0x07,0x75,0x6e,0x69,0x30,0x34,0x42,0x32,0x07,0x75,0x6e,0x69,
-0x30,0x34,0x42,0x33,0x07,0x75,0x6e,0x69,0x30,0x34,0x42,0x34,0x07,0x75,0x6e,0x69,
-0x30,0x34,0x42,0x35,0x07,0x75,0x6e,0x69,0x30,0x34,0x42,0x36,0x07,0x75,0x6e,0x69,
-0x30,0x34,0x42,0x37,0x07,0x75,0x6e,0x69,0x30,0x34,0x42,0x38,0x07,0x75,0x6e,0x69,
-0x30,0x34,0x42,0x39,0x07,0x75,0x6e,0x69,0x30,0x34,0x42,0x41,0x07,0x75,0x6e,0x69,
-0x30,0x34,0x42,0x42,0x07,0x75,0x6e,0x69,0x30,0x34,0x42,0x43,0x07,0x75,0x6e,0x69,
-0x30,0x34,0x42,0x44,0x07,0x75,0x6e,0x69,0x30,0x34,0x42,0x45,0x07,0x75,0x6e,0x69,
-0x30,0x34,0x42,0x46,0x07,0x75,0x6e,0x69,0x30,0x34,0x43,0x30,0x07,0x75,0x6e,0x69,
-0x30,0x34,0x43,0x31,0x07,0x75,0x6e,0x69,0x30,0x34,0x43,0x32,0x07,0x75,0x6e,0x69,
-0x30,0x34,0x43,0x33,0x07,0x75,0x6e,0x69,0x30,0x34,0x43,0x34,0x07,0x75,0x6e,0x69,
-0x30,0x34,0x43,0x35,0x07,0x75,0x6e,0x69,0x30,0x34,0x43,0x36,0x07,0x75,0x6e,0x69,
-0x30,0x34,0x43,0x37,0x07,0x75,0x6e,0x69,0x30,0x34,0x43,0x38,0x07,0x75,0x6e,0x69,
-0x30,0x34,0x43,0x39,0x07,0x75,0x6e,0x69,0x30,0x34,0x43,0x41,0x07,0x75,0x6e,0x69,
-0x30,0x34,0x43,0x42,0x07,0x75,0x6e,0x69,0x30,0x34,0x43,0x43,0x07,0x75,0x6e,0x69,
-0x30,0x34,0x43,0x44,0x07,0x75,0x6e,0x69,0x30,0x34,0x43,0x45,0x07,0x75,0x6e,0x69,
-0x30,0x34,0x44,0x30,0x07,0x75,0x6e,0x69,0x30,0x34,0x44,0x31,0x07,0x75,0x6e,0x69,
-0x30,0x34,0x44,0x32,0x07,0x75,0x6e,0x69,0x30,0x34,0x44,0x33,0x07,0x75,0x6e,0x69,
-0x30,0x34,0x44,0x34,0x07,0x75,0x6e,0x69,0x30,0x34,0x44,0x35,0x07,0x75,0x6e,0x69,
-0x30,0x34,0x44,0x36,0x07,0x75,0x6e,0x69,0x30,0x34,0x44,0x37,0x07,0x75,0x6e,0x69,
-0x30,0x34,0x44,0x38,0x09,0x61,0x66,0x69,0x69,0x31,0x30,0x38,0x34,0x36,0x07,0x75,
-0x6e,0x69,0x30,0x34,0x44,0x41,0x07,0x75,0x6e,0x69,0x30,0x34,0x44,0x42,0x07,0x75,
-0x6e,0x69,0x30,0x34,0x44,0x43,0x07,0x75,0x6e,0x69,0x30,0x34,0x44,0x44,0x07,0x75,
-0x6e,0x69,0x30,0x34,0x44,0x45,0x07,0x75,0x6e,0x69,0x30,0x34,0x44,0x46,0x07,0x75,
-0x6e,0x69,0x30,0x34,0x45,0x30,0x07,0x75,0x6e,0x69,0x30,0x34,0x45,0x31,0x07,0x75,
-0x6e,0x69,0x30,0x34,0x45,0x32,0x07,0x75,0x6e,0x69,0x30,0x34,0x45,0x33,0x07,0x75,
-0x6e,0x69,0x30,0x34,0x45,0x34,0x07,0x75,0x6e,0x69,0x30,0x34,0x45,0x35,0x07,0x75,
-0x6e,0x69,0x30,0x34,0x45,0x36,0x07,0x75,0x6e,0x69,0x30,0x34,0x45,0x37,0x07,0x75,
-0x6e,0x69,0x30,0x34,0x45,0x38,0x07,0x75,0x6e,0x69,0x30,0x34,0x45,0x39,0x07,0x75,
-0x6e,0x69,0x30,0x34,0x45,0x41,0x07,0x75,0x6e,0x69,0x30,0x34,0x45,0x42,0x07,0x75,
-0x6e,0x69,0x30,0x34,0x45,0x43,0x07,0x75,0x6e,0x69,0x30,0x34,0x45,0x44,0x07,0x75,
-0x6e,0x69,0x30,0x34,0x45,0x45,0x07,0x75,0x6e,0x69,0x30,0x34,0x45,0x46,0x07,0x75,
-0x6e,0x69,0x30,0x34,0x46,0x30,0x07,0x75,0x6e,0x69,0x30,0x34,0x46,0x31,0x07,0x75,
-0x6e,0x69,0x30,0x34,0x46,0x32,0x07,0x75,0x6e,0x69,0x30,0x34,0x46,0x33,0x07,0x75,
-0x6e,0x69,0x30,0x34,0x46,0x34,0x07,0x75,0x6e,0x69,0x30,0x34,0x46,0x35,0x07,0x75,
-0x6e,0x69,0x30,0x34,0x46,0x36,0x07,0x75,0x6e,0x69,0x30,0x34,0x46,0x37,0x07,0x75,
-0x6e,0x69,0x30,0x34,0x46,0x38,0x07,0x75,0x6e,0x69,0x30,0x34,0x46,0x39,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x30,0x30,0x07,0x75,0x6e,0x69,0x30,0x35,0x30,0x31,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x30,0x32,0x07,0x75,0x6e,0x69,0x30,0x35,0x30,0x33,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x30,0x34,0x07,0x75,0x6e,0x69,0x30,0x35,0x30,0x35,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x30,0x36,0x07,0x75,0x6e,0x69,0x30,0x35,0x30,0x37,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x30,0x38,0x07,0x75,0x6e,0x69,0x30,0x35,0x30,0x39,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x30,0x41,0x07,0x75,0x6e,0x69,0x30,0x35,0x30,0x42,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x30,0x43,0x07,0x75,0x6e,0x69,0x30,0x35,0x30,0x44,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x30,0x45,0x07,0x75,0x6e,0x69,0x30,0x35,0x30,0x46,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x33,0x31,0x07,0x75,0x6e,0x69,0x30,0x35,0x33,0x32,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x33,0x33,0x07,0x75,0x6e,0x69,0x30,0x35,0x33,0x34,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x33,0x35,0x07,0x75,0x6e,0x69,0x30,0x35,0x33,0x36,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x33,0x37,0x07,0x75,0x6e,0x69,0x30,0x35,0x33,0x38,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x33,0x39,0x07,0x75,0x6e,0x69,0x30,0x35,0x33,0x41,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x33,0x42,0x07,0x75,0x6e,0x69,0x30,0x35,0x33,0x43,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x33,0x44,0x07,0x75,0x6e,0x69,0x30,0x35,0x33,0x45,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x33,0x46,0x07,0x75,0x6e,0x69,0x30,0x35,0x34,0x30,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x34,0x31,0x07,0x75,0x6e,0x69,0x30,0x35,0x34,0x32,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x34,0x33,0x07,0x75,0x6e,0x69,0x30,0x35,0x34,0x34,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x34,0x35,0x07,0x75,0x6e,0x69,0x30,0x35,0x34,0x36,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x34,0x37,0x07,0x75,0x6e,0x69,0x30,0x35,0x34,0x38,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x34,0x39,0x07,0x75,0x6e,0x69,0x30,0x35,0x34,0x41,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x34,0x42,0x07,0x75,0x6e,0x69,0x30,0x35,0x34,0x43,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x34,0x44,0x07,0x75,0x6e,0x69,0x30,0x35,0x34,0x45,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x34,0x46,0x07,0x75,0x6e,0x69,0x30,0x35,0x35,0x30,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x35,0x31,0x07,0x75,0x6e,0x69,0x30,0x35,0x35,0x32,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x35,0x33,0x07,0x75,0x6e,0x69,0x30,0x35,0x35,0x34,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x35,0x35,0x07,0x75,0x6e,0x69,0x30,0x35,0x35,0x36,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x35,0x39,0x07,0x75,0x6e,0x69,0x30,0x35,0x35,0x41,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x35,0x42,0x07,0x75,0x6e,0x69,0x30,0x35,0x35,0x43,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x35,0x44,0x07,0x75,0x6e,0x69,0x30,0x35,0x35,0x45,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x35,0x46,0x07,0x75,0x6e,0x69,0x30,0x35,0x36,0x31,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x36,0x32,0x07,0x75,0x6e,0x69,0x30,0x35,0x36,0x33,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x36,0x34,0x07,0x75,0x6e,0x69,0x30,0x35,0x36,0x35,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x36,0x36,0x07,0x75,0x6e,0x69,0x30,0x35,0x36,0x37,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x36,0x38,0x07,0x75,0x6e,0x69,0x30,0x35,0x36,0x39,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x36,0x41,0x07,0x75,0x6e,0x69,0x30,0x35,0x36,0x42,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x36,0x43,0x07,0x75,0x6e,0x69,0x30,0x35,0x36,0x44,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x36,0x45,0x07,0x75,0x6e,0x69,0x30,0x35,0x36,0x46,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x37,0x30,0x07,0x75,0x6e,0x69,0x30,0x35,0x37,0x31,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x37,0x32,0x07,0x75,0x6e,0x69,0x30,0x35,0x37,0x33,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x37,0x34,0x07,0x75,0x6e,0x69,0x30,0x35,0x37,0x35,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x37,0x36,0x07,0x75,0x6e,0x69,0x30,0x35,0x37,0x37,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x37,0x38,0x07,0x75,0x6e,0x69,0x30,0x35,0x37,0x39,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x37,0x41,0x07,0x75,0x6e,0x69,0x30,0x35,0x37,0x42,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x37,0x43,0x07,0x75,0x6e,0x69,0x30,0x35,0x37,0x44,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x37,0x45,0x07,0x75,0x6e,0x69,0x30,0x35,0x37,0x46,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x38,0x30,0x07,0x75,0x6e,0x69,0x30,0x35,0x38,0x31,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x38,0x32,0x07,0x75,0x6e,0x69,0x30,0x35,0x38,0x33,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x38,0x34,0x07,0x75,0x6e,0x69,0x30,0x35,0x38,0x35,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x38,0x36,0x07,0x75,0x6e,0x69,0x30,0x35,0x38,0x37,0x07,0x75,
-0x6e,0x69,0x30,0x35,0x38,0x39,0x07,0x75,0x6e,0x69,0x30,0x35,0x38,0x41,0x09,0x61,
-0x66,0x69,0x69,0x35,0x37,0x33,0x38,0x38,0x07,0x75,0x6e,0x69,0x30,0x36,0x31,0x35,
-0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x34,0x30,0x33,0x09,0x61,0x66,0x69,0x69,0x35,
-0x37,0x34,0x30,0x37,0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x34,0x30,0x39,0x09,0x61,
-0x66,0x69,0x69,0x35,0x37,0x34,0x31,0x30,0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x34,
-0x31,0x31,0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x34,0x31,0x32,0x09,0x61,0x66,0x69,
-0x69,0x35,0x37,0x34,0x31,0x33,0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x34,0x31,0x34,
-0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x34,0x31,0x35,0x09,0x61,0x66,0x69,0x69,0x35,
-0x37,0x34,0x31,0x36,0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x34,0x31,0x37,0x09,0x61,
-0x66,0x69,0x69,0x35,0x37,0x34,0x31,0x38,0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x34,
-0x31,0x39,0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x34,0x32,0x30,0x09,0x61,0x66,0x69,
-0x69,0x35,0x37,0x34,0x32,0x31,0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x34,0x32,0x32,
-0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x34,0x32,0x33,0x09,0x61,0x66,0x69,0x69,0x35,
-0x37,0x34,0x32,0x34,0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x34,0x32,0x35,0x09,0x61,
-0x66,0x69,0x69,0x35,0x37,0x34,0x32,0x36,0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x34,
-0x32,0x37,0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x34,0x32,0x38,0x09,0x61,0x66,0x69,
-0x69,0x35,0x37,0x34,0x32,0x39,0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x34,0x33,0x30,
-0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x34,0x33,0x31,0x09,0x61,0x66,0x69,0x69,0x35,
-0x37,0x34,0x33,0x32,0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x34,0x33,0x33,0x09,0x61,
-0x66,0x69,0x69,0x35,0x37,0x34,0x33,0x34,0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x34,
-0x34,0x30,0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x34,0x34,0x31,0x09,0x61,0x66,0x69,
-0x69,0x35,0x37,0x34,0x34,0x32,0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x34,0x34,0x33,
-0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x34,0x34,0x34,0x09,0x61,0x66,0x69,0x69,0x35,
-0x37,0x34,0x34,0x35,0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x34,0x34,0x36,0x09,0x61,
-0x66,0x69,0x69,0x35,0x37,0x34,0x37,0x30,0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x34,
-0x34,0x38,0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x34,0x34,0x39,0x09,0x61,0x66,0x69,
-0x69,0x35,0x37,0x34,0x35,0x30,0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x34,0x35,0x31,
-0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x34,0x35,0x32,0x09,0x61,0x66,0x69,0x69,0x35,
-0x37,0x34,0x35,0x33,0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x34,0x35,0x34,0x09,0x61,
-0x66,0x69,0x69,0x35,0x37,0x34,0x35,0x35,0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x34,
-0x35,0x36,0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x34,0x35,0x37,0x09,0x61,0x66,0x69,
-0x69,0x35,0x37,0x34,0x35,0x38,0x07,0x75,0x6e,0x69,0x30,0x36,0x35,0x33,0x07,0x75,
-0x6e,0x69,0x30,0x36,0x35,0x34,0x07,0x75,0x6e,0x69,0x30,0x36,0x35,0x35,0x09,0x61,
-0x66,0x69,0x69,0x35,0x37,0x33,0x39,0x32,0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x33,
-0x39,0x33,0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x33,0x39,0x34,0x09,0x61,0x66,0x69,
-0x69,0x35,0x37,0x33,0x39,0x35,0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x33,0x39,0x36,
-0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x33,0x39,0x37,0x09,0x61,0x66,0x69,0x69,0x35,
-0x37,0x33,0x39,0x38,0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x33,0x39,0x39,0x09,0x61,
-0x66,0x69,0x69,0x35,0x37,0x34,0x30,0x30,0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x34,
-0x30,0x31,0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x33,0x38,0x31,0x07,0x75,0x6e,0x69,
-0x30,0x36,0x36,0x42,0x07,0x75,0x6e,0x69,0x30,0x36,0x36,0x43,0x09,0x61,0x66,0x69,
-0x69,0x36,0x33,0x31,0x36,0x37,0x07,0x75,0x6e,0x69,0x30,0x36,0x36,0x45,0x07,0x75,
-0x6e,0x69,0x30,0x36,0x36,0x46,0x07,0x75,0x6e,0x69,0x30,0x36,0x37,0x34,0x09,0x61,
-0x66,0x69,0x69,0x35,0x37,0x35,0x31,0x31,0x07,0x75,0x6e,0x69,0x30,0x36,0x37,0x41,
-0x07,0x75,0x6e,0x69,0x30,0x36,0x37,0x42,0x07,0x75,0x6e,0x69,0x30,0x36,0x37,0x43,
-0x07,0x75,0x6e,0x69,0x30,0x36,0x37,0x44,0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x35,
-0x30,0x36,0x07,0x75,0x6e,0x69,0x30,0x36,0x37,0x46,0x07,0x75,0x6e,0x69,0x30,0x36,
-0x38,0x30,0x07,0x75,0x6e,0x69,0x30,0x36,0x38,0x31,0x07,0x75,0x6e,0x69,0x30,0x36,
-0x38,0x32,0x07,0x75,0x6e,0x69,0x30,0x36,0x38,0x33,0x07,0x75,0x6e,0x69,0x30,0x36,
-0x38,0x34,0x07,0x75,0x6e,0x69,0x30,0x36,0x38,0x35,0x09,0x61,0x66,0x69,0x69,0x35,
-0x37,0x35,0x30,0x37,0x07,0x75,0x6e,0x69,0x30,0x36,0x38,0x37,0x09,0x61,0x66,0x69,
-0x69,0x35,0x37,0x35,0x31,0x33,0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x35,0x30,0x38,
-0x07,0x75,0x6e,0x69,0x30,0x36,0x41,0x31,0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x35,
-0x30,0x35,0x07,0x75,0x6e,0x69,0x30,0x36,0x41,0x36,0x07,0x75,0x6e,0x69,0x30,0x36,
-0x41,0x39,0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x35,0x30,0x39,0x09,0x61,0x66,0x69,
-0x69,0x35,0x37,0x35,0x31,0x34,0x07,0x75,0x6e,0x69,0x30,0x36,0x42,0x46,0x07,0x75,
-0x6e,0x69,0x30,0x36,0x43,0x43,0x07,0x75,0x6e,0x69,0x30,0x36,0x46,0x30,0x07,0x75,
-0x6e,0x69,0x30,0x36,0x46,0x31,0x07,0x75,0x6e,0x69,0x30,0x36,0x46,0x32,0x07,0x75,
-0x6e,0x69,0x30,0x36,0x46,0x33,0x07,0x75,0x6e,0x69,0x30,0x36,0x46,0x34,0x07,0x75,
-0x6e,0x69,0x30,0x36,0x46,0x35,0x07,0x75,0x6e,0x69,0x30,0x36,0x46,0x36,0x07,0x75,
-0x6e,0x69,0x30,0x36,0x46,0x37,0x07,0x75,0x6e,0x69,0x30,0x36,0x46,0x38,0x07,0x75,
-0x6e,0x69,0x30,0x36,0x46,0x39,0x07,0x75,0x6e,0x69,0x31,0x44,0x30,0x32,0x07,0x75,
-0x6e,0x69,0x31,0x44,0x30,0x38,0x07,0x75,0x6e,0x69,0x31,0x44,0x30,0x39,0x07,0x75,
-0x6e,0x69,0x31,0x44,0x31,0x34,0x07,0x75,0x6e,0x69,0x31,0x44,0x31,0x36,0x07,0x75,
-0x6e,0x69,0x31,0x44,0x31,0x37,0x07,0x75,0x6e,0x69,0x31,0x44,0x31,0x44,0x07,0x75,
-0x6e,0x69,0x31,0x44,0x31,0x45,0x07,0x75,0x6e,0x69,0x31,0x44,0x31,0x46,0x07,0x75,
-0x6e,0x69,0x31,0x44,0x34,0x33,0x07,0x75,0x6e,0x69,0x31,0x44,0x34,0x34,0x07,0x75,
-0x6e,0x69,0x31,0x44,0x34,0x35,0x07,0x75,0x6e,0x69,0x31,0x44,0x34,0x36,0x07,0x75,
-0x6e,0x69,0x31,0x44,0x34,0x37,0x07,0x75,0x6e,0x69,0x31,0x44,0x34,0x38,0x07,0x75,
-0x6e,0x69,0x31,0x44,0x34,0x39,0x07,0x75,0x6e,0x69,0x31,0x44,0x34,0x41,0x07,0x75,
-0x6e,0x69,0x31,0x44,0x34,0x42,0x07,0x75,0x6e,0x69,0x31,0x44,0x34,0x43,0x07,0x75,
-0x6e,0x69,0x31,0x44,0x34,0x44,0x07,0x75,0x6e,0x69,0x31,0x44,0x34,0x45,0x07,0x75,
-0x6e,0x69,0x31,0x44,0x34,0x46,0x07,0x75,0x6e,0x69,0x31,0x44,0x35,0x30,0x07,0x75,
-0x6e,0x69,0x31,0x44,0x35,0x31,0x07,0x75,0x6e,0x69,0x31,0x44,0x35,0x32,0x07,0x75,
-0x6e,0x69,0x31,0x44,0x35,0x33,0x07,0x75,0x6e,0x69,0x31,0x44,0x35,0x34,0x07,0x75,
-0x6e,0x69,0x31,0x44,0x35,0x35,0x07,0x75,0x6e,0x69,0x31,0x44,0x35,0x36,0x07,0x75,
-0x6e,0x69,0x31,0x44,0x35,0x37,0x07,0x75,0x6e,0x69,0x31,0x44,0x35,0x38,0x07,0x75,
-0x6e,0x69,0x31,0x44,0x35,0x39,0x07,0x75,0x6e,0x69,0x31,0x44,0x35,0x41,0x07,0x75,
-0x6e,0x69,0x31,0x44,0x35,0x42,0x07,0x75,0x6e,0x69,0x31,0x44,0x37,0x37,0x07,0x75,
-0x6e,0x69,0x31,0x44,0x37,0x42,0x07,0x75,0x6e,0x69,0x31,0x44,0x38,0x35,0x07,0x75,
-0x6e,0x69,0x31,0x44,0x39,0x42,0x07,0x75,0x6e,0x69,0x31,0x44,0x39,0x43,0x07,0x75,
-0x6e,0x69,0x31,0x44,0x39,0x44,0x07,0x75,0x6e,0x69,0x31,0x44,0x39,0x45,0x07,0x75,
-0x6e,0x69,0x31,0x44,0x39,0x46,0x07,0x75,0x6e,0x69,0x31,0x44,0x41,0x30,0x07,0x75,
-0x6e,0x69,0x31,0x44,0x41,0x31,0x07,0x75,0x6e,0x69,0x31,0x44,0x41,0x32,0x07,0x75,
-0x6e,0x69,0x31,0x44,0x41,0x33,0x07,0x75,0x6e,0x69,0x31,0x44,0x41,0x34,0x07,0x75,
-0x6e,0x69,0x31,0x44,0x41,0x35,0x07,0x75,0x6e,0x69,0x31,0x44,0x41,0x36,0x07,0x75,
-0x6e,0x69,0x31,0x44,0x41,0x37,0x07,0x75,0x6e,0x69,0x31,0x44,0x41,0x38,0x07,0x75,
-0x6e,0x69,0x31,0x44,0x41,0x39,0x07,0x75,0x6e,0x69,0x31,0x44,0x41,0x41,0x07,0x75,
-0x6e,0x69,0x31,0x44,0x41,0x42,0x07,0x75,0x6e,0x69,0x31,0x44,0x41,0x43,0x07,0x75,
-0x6e,0x69,0x31,0x44,0x41,0x44,0x07,0x75,0x6e,0x69,0x31,0x44,0x41,0x45,0x07,0x75,
-0x6e,0x69,0x31,0x44,0x41,0x46,0x07,0x75,0x6e,0x69,0x31,0x44,0x42,0x30,0x07,0x75,
-0x6e,0x69,0x31,0x44,0x42,0x31,0x07,0x75,0x6e,0x69,0x31,0x44,0x42,0x32,0x07,0x75,
-0x6e,0x69,0x31,0x44,0x42,0x33,0x07,0x75,0x6e,0x69,0x31,0x44,0x42,0x34,0x07,0x75,
-0x6e,0x69,0x31,0x44,0x42,0x35,0x07,0x75,0x6e,0x69,0x31,0x44,0x42,0x36,0x07,0x75,
-0x6e,0x69,0x31,0x44,0x42,0x37,0x07,0x75,0x6e,0x69,0x31,0x44,0x42,0x39,0x07,0x75,
-0x6e,0x69,0x31,0x44,0x42,0x41,0x07,0x75,0x6e,0x69,0x31,0x44,0x42,0x42,0x07,0x75,
-0x6e,0x69,0x31,0x44,0x42,0x43,0x07,0x75,0x6e,0x69,0x31,0x44,0x42,0x44,0x07,0x75,
-0x6e,0x69,0x31,0x44,0x42,0x45,0x07,0x75,0x6e,0x69,0x31,0x44,0x42,0x46,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x30,0x30,0x07,0x75,0x6e,0x69,0x31,0x45,0x30,0x31,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x30,0x32,0x07,0x75,0x6e,0x69,0x31,0x45,0x30,0x33,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x30,0x34,0x07,0x75,0x6e,0x69,0x31,0x45,0x30,0x35,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x30,0x36,0x07,0x75,0x6e,0x69,0x31,0x45,0x30,0x37,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x30,0x38,0x07,0x75,0x6e,0x69,0x31,0x45,0x30,0x39,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x30,0x41,0x07,0x75,0x6e,0x69,0x31,0x45,0x30,0x42,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x30,0x43,0x07,0x75,0x6e,0x69,0x31,0x45,0x30,0x44,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x30,0x45,0x07,0x75,0x6e,0x69,0x31,0x45,0x30,0x46,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x31,0x30,0x07,0x75,0x6e,0x69,0x31,0x45,0x31,0x31,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x31,0x32,0x07,0x75,0x6e,0x69,0x31,0x45,0x31,0x33,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x31,0x34,0x07,0x75,0x6e,0x69,0x31,0x45,0x31,0x35,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x31,0x36,0x07,0x75,0x6e,0x69,0x31,0x45,0x31,0x37,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x31,0x38,0x07,0x75,0x6e,0x69,0x31,0x45,0x31,0x39,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x31,0x41,0x07,0x75,0x6e,0x69,0x31,0x45,0x31,0x42,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x31,0x43,0x07,0x75,0x6e,0x69,0x31,0x45,0x31,0x44,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x31,0x45,0x07,0x75,0x6e,0x69,0x31,0x45,0x31,0x46,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x32,0x30,0x07,0x75,0x6e,0x69,0x31,0x45,0x32,0x31,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x32,0x32,0x07,0x75,0x6e,0x69,0x31,0x45,0x32,0x33,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x32,0x34,0x07,0x75,0x6e,0x69,0x31,0x45,0x32,0x35,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x32,0x36,0x07,0x75,0x6e,0x69,0x31,0x45,0x32,0x37,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x32,0x38,0x07,0x75,0x6e,0x69,0x31,0x45,0x32,0x39,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x32,0x41,0x07,0x75,0x6e,0x69,0x31,0x45,0x32,0x42,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x32,0x43,0x07,0x75,0x6e,0x69,0x31,0x45,0x32,0x44,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x32,0x45,0x07,0x75,0x6e,0x69,0x31,0x45,0x32,0x46,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x33,0x30,0x07,0x75,0x6e,0x69,0x31,0x45,0x33,0x31,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x33,0x32,0x07,0x75,0x6e,0x69,0x31,0x45,0x33,0x33,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x33,0x34,0x07,0x75,0x6e,0x69,0x31,0x45,0x33,0x35,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x33,0x36,0x07,0x75,0x6e,0x69,0x31,0x45,0x33,0x37,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x33,0x38,0x07,0x75,0x6e,0x69,0x31,0x45,0x33,0x39,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x33,0x41,0x07,0x75,0x6e,0x69,0x31,0x45,0x33,0x42,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x33,0x43,0x07,0x75,0x6e,0x69,0x31,0x45,0x33,0x44,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x33,0x45,0x07,0x75,0x6e,0x69,0x31,0x45,0x33,0x46,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x34,0x30,0x07,0x75,0x6e,0x69,0x31,0x45,0x34,0x31,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x34,0x32,0x07,0x75,0x6e,0x69,0x31,0x45,0x34,0x33,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x34,0x34,0x07,0x75,0x6e,0x69,0x31,0x45,0x34,0x35,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x34,0x36,0x07,0x75,0x6e,0x69,0x31,0x45,0x34,0x37,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x34,0x38,0x07,0x75,0x6e,0x69,0x31,0x45,0x34,0x39,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x34,0x41,0x07,0x75,0x6e,0x69,0x31,0x45,0x34,0x42,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x34,0x43,0x07,0x75,0x6e,0x69,0x31,0x45,0x34,0x44,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x34,0x45,0x07,0x75,0x6e,0x69,0x31,0x45,0x34,0x46,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x35,0x30,0x07,0x75,0x6e,0x69,0x31,0x45,0x35,0x31,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x35,0x32,0x07,0x75,0x6e,0x69,0x31,0x45,0x35,0x33,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x35,0x34,0x07,0x75,0x6e,0x69,0x31,0x45,0x35,0x35,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x35,0x36,0x07,0x75,0x6e,0x69,0x31,0x45,0x35,0x37,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x35,0x38,0x07,0x75,0x6e,0x69,0x31,0x45,0x35,0x39,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x35,0x41,0x07,0x75,0x6e,0x69,0x31,0x45,0x35,0x42,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x35,0x43,0x07,0x75,0x6e,0x69,0x31,0x45,0x35,0x44,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x35,0x45,0x07,0x75,0x6e,0x69,0x31,0x45,0x35,0x46,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x36,0x30,0x07,0x75,0x6e,0x69,0x31,0x45,0x36,0x31,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x36,0x32,0x07,0x75,0x6e,0x69,0x31,0x45,0x36,0x33,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x36,0x34,0x07,0x75,0x6e,0x69,0x31,0x45,0x36,0x35,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x36,0x36,0x07,0x75,0x6e,0x69,0x31,0x45,0x36,0x37,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x36,0x38,0x07,0x75,0x6e,0x69,0x31,0x45,0x36,0x39,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x36,0x41,0x07,0x75,0x6e,0x69,0x31,0x45,0x36,0x42,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x36,0x43,0x07,0x75,0x6e,0x69,0x31,0x45,0x36,0x44,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x36,0x45,0x07,0x75,0x6e,0x69,0x31,0x45,0x36,0x46,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x37,0x30,0x07,0x75,0x6e,0x69,0x31,0x45,0x37,0x31,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x37,0x32,0x07,0x75,0x6e,0x69,0x31,0x45,0x37,0x33,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x37,0x34,0x07,0x75,0x6e,0x69,0x31,0x45,0x37,0x35,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x37,0x36,0x07,0x75,0x6e,0x69,0x31,0x45,0x37,0x37,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x37,0x38,0x07,0x75,0x6e,0x69,0x31,0x45,0x37,0x39,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x37,0x41,0x07,0x75,0x6e,0x69,0x31,0x45,0x37,0x42,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x37,0x43,0x07,0x75,0x6e,0x69,0x31,0x45,0x37,0x44,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x37,0x45,0x07,0x75,0x6e,0x69,0x31,0x45,0x37,0x46,0x06,0x57,
-0x67,0x72,0x61,0x76,0x65,0x06,0x77,0x67,0x72,0x61,0x76,0x65,0x06,0x57,0x61,0x63,
-0x75,0x74,0x65,0x06,0x77,0x61,0x63,0x75,0x74,0x65,0x09,0x57,0x64,0x69,0x65,0x72,
-0x65,0x73,0x69,0x73,0x09,0x77,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x38,0x36,0x07,0x75,0x6e,0x69,0x31,0x45,0x38,0x37,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x38,0x38,0x07,0x75,0x6e,0x69,0x31,0x45,0x38,0x39,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x38,0x41,0x07,0x75,0x6e,0x69,0x31,0x45,0x38,0x42,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x38,0x43,0x07,0x75,0x6e,0x69,0x31,0x45,0x38,0x44,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x38,0x45,0x07,0x75,0x6e,0x69,0x31,0x45,0x38,0x46,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x39,0x30,0x07,0x75,0x6e,0x69,0x31,0x45,0x39,0x31,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x39,0x32,0x07,0x75,0x6e,0x69,0x31,0x45,0x39,0x33,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x39,0x34,0x07,0x75,0x6e,0x69,0x31,0x45,0x39,0x35,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x39,0x36,0x07,0x75,0x6e,0x69,0x31,0x45,0x39,0x37,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x39,0x38,0x07,0x75,0x6e,0x69,0x31,0x45,0x39,0x39,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x39,0x41,0x07,0x75,0x6e,0x69,0x31,0x45,0x39,0x42,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x41,0x30,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x31,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x41,0x32,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x33,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x41,0x34,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x35,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x41,0x36,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x37,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x41,0x38,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x39,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x41,0x41,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x42,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x41,0x43,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x44,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x41,0x45,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x46,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x42,0x30,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x31,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x42,0x32,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x33,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x42,0x34,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x35,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x42,0x36,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x37,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x42,0x38,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x39,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x42,0x41,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x42,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x42,0x43,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x44,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x42,0x45,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x46,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x43,0x30,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x31,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x43,0x32,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x33,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x43,0x34,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x35,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x43,0x36,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x37,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x43,0x38,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x39,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x43,0x41,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x42,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x43,0x43,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x44,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x43,0x45,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x46,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x44,0x30,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x31,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x44,0x32,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x33,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x44,0x34,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x35,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x44,0x36,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x37,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x44,0x38,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x39,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x44,0x41,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x42,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x44,0x43,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x44,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x44,0x45,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x46,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x45,0x30,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x31,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x45,0x32,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x33,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x45,0x34,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x35,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x45,0x36,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x37,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x45,0x38,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x39,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x45,0x41,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x42,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x45,0x43,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x44,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x45,0x45,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x46,0x07,0x75,
-0x6e,0x69,0x31,0x45,0x46,0x30,0x07,0x75,0x6e,0x69,0x31,0x45,0x46,0x31,0x06,0x59,
-0x67,0x72,0x61,0x76,0x65,0x06,0x79,0x67,0x72,0x61,0x76,0x65,0x07,0x75,0x6e,0x69,
-0x31,0x45,0x46,0x34,0x07,0x75,0x6e,0x69,0x31,0x45,0x46,0x35,0x07,0x75,0x6e,0x69,
-0x31,0x45,0x46,0x36,0x07,0x75,0x6e,0x69,0x31,0x45,0x46,0x37,0x07,0x75,0x6e,0x69,
-0x31,0x45,0x46,0x38,0x07,0x75,0x6e,0x69,0x31,0x45,0x46,0x39,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x30,0x30,0x07,0x75,0x6e,0x69,0x31,0x46,0x30,0x31,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x30,0x32,0x07,0x75,0x6e,0x69,0x31,0x46,0x30,0x33,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x30,0x34,0x07,0x75,0x6e,0x69,0x31,0x46,0x30,0x35,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x30,0x36,0x07,0x75,0x6e,0x69,0x31,0x46,0x30,0x37,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x30,0x38,0x07,0x75,0x6e,0x69,0x31,0x46,0x30,0x39,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x30,0x41,0x07,0x75,0x6e,0x69,0x31,0x46,0x30,0x42,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x30,0x43,0x07,0x75,0x6e,0x69,0x31,0x46,0x30,0x44,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x30,0x45,0x07,0x75,0x6e,0x69,0x31,0x46,0x30,0x46,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x31,0x30,0x07,0x75,0x6e,0x69,0x31,0x46,0x31,0x31,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x31,0x32,0x07,0x75,0x6e,0x69,0x31,0x46,0x31,0x33,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x31,0x34,0x07,0x75,0x6e,0x69,0x31,0x46,0x31,0x35,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x31,0x38,0x07,0x75,0x6e,0x69,0x31,0x46,0x31,0x39,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x31,0x41,0x07,0x75,0x6e,0x69,0x31,0x46,0x31,0x42,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x31,0x43,0x07,0x75,0x6e,0x69,0x31,0x46,0x31,0x44,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x32,0x30,0x07,0x75,0x6e,0x69,0x31,0x46,0x32,0x31,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x32,0x32,0x07,0x75,0x6e,0x69,0x31,0x46,0x32,0x33,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x32,0x34,0x07,0x75,0x6e,0x69,0x31,0x46,0x32,0x35,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x32,0x36,0x07,0x75,0x6e,0x69,0x31,0x46,0x32,0x37,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x32,0x38,0x07,0x75,0x6e,0x69,0x31,0x46,0x32,0x39,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x32,0x41,0x07,0x75,0x6e,0x69,0x31,0x46,0x32,0x42,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x32,0x43,0x07,0x75,0x6e,0x69,0x31,0x46,0x32,0x44,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x32,0x45,0x07,0x75,0x6e,0x69,0x31,0x46,0x32,0x46,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x33,0x30,0x07,0x75,0x6e,0x69,0x31,0x46,0x33,0x31,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x33,0x32,0x07,0x75,0x6e,0x69,0x31,0x46,0x33,0x33,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x33,0x34,0x07,0x75,0x6e,0x69,0x31,0x46,0x33,0x35,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x33,0x36,0x07,0x75,0x6e,0x69,0x31,0x46,0x33,0x37,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x33,0x38,0x07,0x75,0x6e,0x69,0x31,0x46,0x33,0x39,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x33,0x41,0x07,0x75,0x6e,0x69,0x31,0x46,0x33,0x42,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x33,0x43,0x07,0x75,0x6e,0x69,0x31,0x46,0x33,0x44,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x33,0x45,0x07,0x75,0x6e,0x69,0x31,0x46,0x33,0x46,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x34,0x30,0x07,0x75,0x6e,0x69,0x31,0x46,0x34,0x31,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x34,0x32,0x07,0x75,0x6e,0x69,0x31,0x46,0x34,0x33,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x34,0x34,0x07,0x75,0x6e,0x69,0x31,0x46,0x34,0x35,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x34,0x38,0x07,0x75,0x6e,0x69,0x31,0x46,0x34,0x39,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x34,0x41,0x07,0x75,0x6e,0x69,0x31,0x46,0x34,0x42,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x34,0x43,0x07,0x75,0x6e,0x69,0x31,0x46,0x34,0x44,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x35,0x30,0x07,0x75,0x6e,0x69,0x31,0x46,0x35,0x31,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x35,0x32,0x07,0x75,0x6e,0x69,0x31,0x46,0x35,0x33,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x35,0x34,0x07,0x75,0x6e,0x69,0x31,0x46,0x35,0x35,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x35,0x36,0x07,0x75,0x6e,0x69,0x31,0x46,0x35,0x37,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x35,0x39,0x07,0x75,0x6e,0x69,0x31,0x46,0x35,0x42,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x35,0x44,0x07,0x75,0x6e,0x69,0x31,0x46,0x35,0x46,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x36,0x30,0x07,0x75,0x6e,0x69,0x31,0x46,0x36,0x31,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x36,0x32,0x07,0x75,0x6e,0x69,0x31,0x46,0x36,0x33,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x36,0x34,0x07,0x75,0x6e,0x69,0x31,0x46,0x36,0x35,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x36,0x36,0x07,0x75,0x6e,0x69,0x31,0x46,0x36,0x37,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x36,0x38,0x07,0x75,0x6e,0x69,0x31,0x46,0x36,0x39,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x36,0x41,0x07,0x75,0x6e,0x69,0x31,0x46,0x36,0x42,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x36,0x43,0x07,0x75,0x6e,0x69,0x31,0x46,0x36,0x44,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x36,0x45,0x07,0x75,0x6e,0x69,0x31,0x46,0x36,0x46,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x37,0x30,0x07,0x75,0x6e,0x69,0x31,0x46,0x37,0x31,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x37,0x32,0x07,0x75,0x6e,0x69,0x31,0x46,0x37,0x33,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x37,0x34,0x07,0x75,0x6e,0x69,0x31,0x46,0x37,0x35,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x37,0x36,0x07,0x75,0x6e,0x69,0x31,0x46,0x37,0x37,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x37,0x38,0x07,0x75,0x6e,0x69,0x31,0x46,0x37,0x39,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x37,0x41,0x07,0x75,0x6e,0x69,0x31,0x46,0x37,0x42,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x37,0x43,0x07,0x75,0x6e,0x69,0x31,0x46,0x37,0x44,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x38,0x30,0x07,0x75,0x6e,0x69,0x31,0x46,0x38,0x31,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x38,0x32,0x07,0x75,0x6e,0x69,0x31,0x46,0x38,0x33,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x38,0x34,0x07,0x75,0x6e,0x69,0x31,0x46,0x38,0x35,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x38,0x36,0x07,0x75,0x6e,0x69,0x31,0x46,0x38,0x37,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x38,0x38,0x07,0x75,0x6e,0x69,0x31,0x46,0x38,0x39,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x38,0x41,0x07,0x75,0x6e,0x69,0x31,0x46,0x38,0x42,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x38,0x43,0x07,0x75,0x6e,0x69,0x31,0x46,0x38,0x44,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x38,0x45,0x07,0x75,0x6e,0x69,0x31,0x46,0x38,0x46,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x39,0x30,0x07,0x75,0x6e,0x69,0x31,0x46,0x39,0x31,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x39,0x32,0x07,0x75,0x6e,0x69,0x31,0x46,0x39,0x33,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x39,0x34,0x07,0x75,0x6e,0x69,0x31,0x46,0x39,0x35,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x39,0x36,0x07,0x75,0x6e,0x69,0x31,0x46,0x39,0x37,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x39,0x38,0x07,0x75,0x6e,0x69,0x31,0x46,0x39,0x39,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x39,0x41,0x07,0x75,0x6e,0x69,0x31,0x46,0x39,0x42,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x39,0x43,0x07,0x75,0x6e,0x69,0x31,0x46,0x39,0x44,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x39,0x45,0x07,0x75,0x6e,0x69,0x31,0x46,0x39,0x46,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x41,0x30,0x07,0x75,0x6e,0x69,0x31,0x46,0x41,0x31,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x41,0x32,0x07,0x75,0x6e,0x69,0x31,0x46,0x41,0x33,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x41,0x34,0x07,0x75,0x6e,0x69,0x31,0x46,0x41,0x35,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x41,0x36,0x07,0x75,0x6e,0x69,0x31,0x46,0x41,0x37,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x41,0x38,0x07,0x75,0x6e,0x69,0x31,0x46,0x41,0x39,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x41,0x41,0x07,0x75,0x6e,0x69,0x31,0x46,0x41,0x42,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x41,0x43,0x07,0x75,0x6e,0x69,0x31,0x46,0x41,0x44,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x41,0x45,0x07,0x75,0x6e,0x69,0x31,0x46,0x41,0x46,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x42,0x30,0x07,0x75,0x6e,0x69,0x31,0x46,0x42,0x31,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x42,0x32,0x07,0x75,0x6e,0x69,0x31,0x46,0x42,0x33,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x42,0x34,0x07,0x75,0x6e,0x69,0x31,0x46,0x42,0x36,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x42,0x37,0x07,0x75,0x6e,0x69,0x31,0x46,0x42,0x38,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x42,0x39,0x07,0x75,0x6e,0x69,0x31,0x46,0x42,0x41,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x42,0x42,0x07,0x75,0x6e,0x69,0x31,0x46,0x42,0x43,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x42,0x44,0x07,0x75,0x6e,0x69,0x31,0x46,0x42,0x45,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x42,0x46,0x07,0x75,0x6e,0x69,0x31,0x46,0x43,0x30,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x43,0x31,0x07,0x75,0x6e,0x69,0x31,0x46,0x43,0x32,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x43,0x33,0x07,0x75,0x6e,0x69,0x31,0x46,0x43,0x34,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x43,0x36,0x07,0x75,0x6e,0x69,0x31,0x46,0x43,0x37,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x43,0x38,0x07,0x75,0x6e,0x69,0x31,0x46,0x43,0x39,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x43,0x41,0x07,0x75,0x6e,0x69,0x31,0x46,0x43,0x42,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x43,0x43,0x07,0x75,0x6e,0x69,0x31,0x46,0x43,0x44,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x43,0x45,0x07,0x75,0x6e,0x69,0x31,0x46,0x43,0x46,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x44,0x30,0x07,0x75,0x6e,0x69,0x31,0x46,0x44,0x31,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x44,0x32,0x07,0x75,0x6e,0x69,0x31,0x46,0x44,0x33,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x44,0x36,0x07,0x75,0x6e,0x69,0x31,0x46,0x44,0x37,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x44,0x38,0x07,0x75,0x6e,0x69,0x31,0x46,0x44,0x39,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x44,0x41,0x07,0x75,0x6e,0x69,0x31,0x46,0x44,0x42,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x44,0x44,0x07,0x75,0x6e,0x69,0x31,0x46,0x44,0x45,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x44,0x46,0x07,0x75,0x6e,0x69,0x31,0x46,0x45,0x30,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x45,0x31,0x07,0x75,0x6e,0x69,0x31,0x46,0x45,0x32,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x45,0x33,0x07,0x75,0x6e,0x69,0x31,0x46,0x45,0x34,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x45,0x35,0x07,0x75,0x6e,0x69,0x31,0x46,0x45,0x36,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x45,0x37,0x07,0x75,0x6e,0x69,0x31,0x46,0x45,0x38,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x45,0x39,0x07,0x75,0x6e,0x69,0x31,0x46,0x45,0x41,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x45,0x42,0x07,0x75,0x6e,0x69,0x31,0x46,0x45,0x43,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x45,0x44,0x07,0x75,0x6e,0x69,0x31,0x46,0x45,0x45,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x45,0x46,0x07,0x75,0x6e,0x69,0x31,0x46,0x46,0x32,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x46,0x33,0x07,0x75,0x6e,0x69,0x31,0x46,0x46,0x34,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x46,0x36,0x07,0x75,0x6e,0x69,0x31,0x46,0x46,0x37,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x46,0x38,0x07,0x75,0x6e,0x69,0x31,0x46,0x46,0x39,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x46,0x41,0x07,0x75,0x6e,0x69,0x31,0x46,0x46,0x42,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x46,0x43,0x07,0x75,0x6e,0x69,0x31,0x46,0x46,0x44,0x07,0x75,0x6e,0x69,
-0x31,0x46,0x46,0x45,0x07,0x75,0x6e,0x69,0x32,0x30,0x30,0x30,0x07,0x75,0x6e,0x69,
-0x32,0x30,0x30,0x31,0x07,0x75,0x6e,0x69,0x32,0x30,0x30,0x32,0x07,0x75,0x6e,0x69,
-0x32,0x30,0x30,0x33,0x07,0x75,0x6e,0x69,0x32,0x30,0x30,0x34,0x07,0x75,0x6e,0x69,
-0x32,0x30,0x30,0x35,0x07,0x75,0x6e,0x69,0x32,0x30,0x30,0x36,0x07,0x75,0x6e,0x69,
-0x32,0x30,0x30,0x37,0x07,0x75,0x6e,0x69,0x32,0x30,0x30,0x38,0x07,0x75,0x6e,0x69,
-0x32,0x30,0x30,0x39,0x07,0x75,0x6e,0x69,0x32,0x30,0x30,0x41,0x07,0x75,0x6e,0x69,
-0x32,0x30,0x31,0x30,0x07,0x75,0x6e,0x69,0x32,0x30,0x31,0x31,0x0a,0x66,0x69,0x67,
-0x75,0x72,0x65,0x64,0x61,0x73,0x68,0x09,0x61,0x66,0x69,0x69,0x30,0x30,0x32,0x30,
-0x38,0x07,0x75,0x6e,0x69,0x32,0x30,0x31,0x36,0x0d,0x75,0x6e,0x64,0x65,0x72,0x73,
-0x63,0x6f,0x72,0x65,0x64,0x62,0x6c,0x0d,0x71,0x75,0x6f,0x74,0x65,0x72,0x65,0x76,
-0x65,0x72,0x73,0x65,0x64,0x07,0x75,0x6e,0x69,0x32,0x30,0x31,0x46,0x07,0x75,0x6e,
-0x69,0x32,0x30,0x32,0x33,0x0e,0x6f,0x6e,0x65,0x64,0x6f,0x74,0x65,0x6e,0x6c,0x65,
-0x61,0x64,0x65,0x72,0x0e,0x74,0x77,0x6f,0x64,0x6f,0x74,0x65,0x6e,0x6c,0x65,0x61,
-0x64,0x65,0x72,0x07,0x75,0x6e,0x69,0x32,0x30,0x32,0x37,0x07,0x75,0x6e,0x69,0x32,
-0x30,0x33,0x31,0x06,0x6d,0x69,0x6e,0x75,0x74,0x65,0x06,0x73,0x65,0x63,0x6f,0x6e,
-0x64,0x07,0x75,0x6e,0x69,0x32,0x30,0x33,0x34,0x07,0x75,0x6e,0x69,0x32,0x30,0x33,
-0x35,0x07,0x75,0x6e,0x69,0x32,0x30,0x33,0x36,0x07,0x75,0x6e,0x69,0x32,0x30,0x33,
-0x37,0x07,0x75,0x6e,0x69,0x32,0x30,0x33,0x38,0x07,0x75,0x6e,0x69,0x32,0x30,0x33,
-0x42,0x09,0x65,0x78,0x63,0x6c,0x61,0x6d,0x64,0x62,0x6c,0x07,0x75,0x6e,0x69,0x32,
-0x30,0x33,0x44,0x07,0x75,0x6e,0x69,0x32,0x30,0x33,0x45,0x07,0x75,0x6e,0x69,0x32,
-0x30,0x33,0x46,0x07,0x75,0x6e,0x69,0x32,0x30,0x34,0x30,0x07,0x75,0x6e,0x69,0x32,
-0x30,0x34,0x31,0x07,0x75,0x6e,0x69,0x32,0x30,0x34,0x32,0x07,0x75,0x6e,0x69,0x32,
-0x30,0x34,0x33,0x07,0x75,0x6e,0x69,0x32,0x30,0x34,0x35,0x07,0x75,0x6e,0x69,0x32,
-0x30,0x34,0x36,0x07,0x75,0x6e,0x69,0x32,0x30,0x34,0x37,0x07,0x75,0x6e,0x69,0x32,
-0x30,0x34,0x38,0x07,0x75,0x6e,0x69,0x32,0x30,0x34,0x39,0x07,0x75,0x6e,0x69,0x32,
-0x30,0x34,0x41,0x07,0x75,0x6e,0x69,0x32,0x30,0x34,0x42,0x07,0x75,0x6e,0x69,0x32,
-0x30,0x34,0x43,0x07,0x75,0x6e,0x69,0x32,0x30,0x34,0x44,0x07,0x75,0x6e,0x69,0x32,
-0x30,0x34,0x45,0x07,0x75,0x6e,0x69,0x32,0x30,0x34,0x46,0x07,0x75,0x6e,0x69,0x32,
-0x30,0x35,0x30,0x07,0x75,0x6e,0x69,0x32,0x30,0x35,0x31,0x07,0x75,0x6e,0x69,0x32,
-0x30,0x35,0x32,0x07,0x75,0x6e,0x69,0x32,0x30,0x35,0x33,0x07,0x75,0x6e,0x69,0x32,
-0x30,0x35,0x34,0x07,0x75,0x6e,0x69,0x32,0x30,0x35,0x35,0x07,0x75,0x6e,0x69,0x32,
-0x30,0x35,0x36,0x07,0x75,0x6e,0x69,0x32,0x30,0x35,0x37,0x07,0x75,0x6e,0x69,0x32,
-0x30,0x35,0x38,0x07,0x75,0x6e,0x69,0x32,0x30,0x35,0x39,0x07,0x75,0x6e,0x69,0x32,
-0x30,0x35,0x41,0x07,0x75,0x6e,0x69,0x32,0x30,0x35,0x42,0x07,0x75,0x6e,0x69,0x32,
-0x30,0x35,0x43,0x07,0x75,0x6e,0x69,0x32,0x30,0x35,0x44,0x07,0x75,0x6e,0x69,0x32,
-0x30,0x35,0x45,0x07,0x75,0x6e,0x69,0x32,0x30,0x37,0x30,0x07,0x75,0x6e,0x69,0x32,
-0x30,0x37,0x31,0x07,0x75,0x6e,0x69,0x32,0x30,0x37,0x34,0x07,0x75,0x6e,0x69,0x32,
-0x30,0x37,0x35,0x07,0x75,0x6e,0x69,0x32,0x30,0x37,0x36,0x07,0x75,0x6e,0x69,0x32,
-0x30,0x37,0x37,0x07,0x75,0x6e,0x69,0x32,0x30,0x37,0x38,0x07,0x75,0x6e,0x69,0x32,
-0x30,0x37,0x39,0x07,0x75,0x6e,0x69,0x32,0x30,0x37,0x41,0x07,0x75,0x6e,0x69,0x32,
-0x30,0x37,0x42,0x07,0x75,0x6e,0x69,0x32,0x30,0x37,0x43,0x07,0x75,0x6e,0x69,0x32,
-0x30,0x37,0x44,0x07,0x75,0x6e,0x69,0x32,0x30,0x37,0x45,0x07,0x75,0x6e,0x69,0x32,
-0x30,0x37,0x46,0x07,0x75,0x6e,0x69,0x32,0x30,0x38,0x30,0x07,0x75,0x6e,0x69,0x32,
-0x30,0x38,0x31,0x07,0x75,0x6e,0x69,0x32,0x30,0x38,0x32,0x07,0x75,0x6e,0x69,0x32,
-0x30,0x38,0x33,0x07,0x75,0x6e,0x69,0x32,0x30,0x38,0x34,0x07,0x75,0x6e,0x69,0x32,
-0x30,0x38,0x35,0x07,0x75,0x6e,0x69,0x32,0x30,0x38,0x36,0x07,0x75,0x6e,0x69,0x32,
-0x30,0x38,0x37,0x07,0x75,0x6e,0x69,0x32,0x30,0x38,0x38,0x07,0x75,0x6e,0x69,0x32,
-0x30,0x38,0x39,0x07,0x75,0x6e,0x69,0x32,0x30,0x38,0x41,0x07,0x75,0x6e,0x69,0x32,
-0x30,0x38,0x42,0x07,0x75,0x6e,0x69,0x32,0x30,0x38,0x43,0x07,0x75,0x6e,0x69,0x32,
-0x30,0x38,0x44,0x07,0x75,0x6e,0x69,0x32,0x30,0x38,0x45,0x07,0x75,0x6e,0x69,0x32,
-0x30,0x41,0x30,0x0d,0x63,0x6f,0x6c,0x6f,0x6e,0x6d,0x6f,0x6e,0x65,0x74,0x61,0x72,
-0x79,0x07,0x75,0x6e,0x69,0x32,0x30,0x41,0x32,0x04,0x6c,0x69,0x72,0x61,0x07,0x75,
-0x6e,0x69,0x32,0x30,0x41,0x35,0x07,0x75,0x6e,0x69,0x32,0x30,0x41,0x36,0x06,0x70,
-0x65,0x73,0x65,0x74,0x61,0x07,0x75,0x6e,0x69,0x32,0x30,0x41,0x38,0x07,0x75,0x6e,
-0x69,0x32,0x30,0x41,0x39,0x09,0x61,0x66,0x69,0x69,0x35,0x37,0x36,0x33,0x36,0x04,
-0x64,0x6f,0x6e,0x67,0x04,0x45,0x75,0x72,0x6f,0x07,0x75,0x6e,0x69,0x32,0x30,0x41,
-0x44,0x07,0x75,0x6e,0x69,0x32,0x30,0x41,0x45,0x07,0x75,0x6e,0x69,0x32,0x30,0x41,
-0x46,0x07,0x75,0x6e,0x69,0x32,0x30,0x42,0x31,0x07,0x75,0x6e,0x69,0x32,0x30,0x42,
-0x34,0x07,0x75,0x6e,0x69,0x32,0x30,0x42,0x35,0x07,0x75,0x6e,0x69,0x32,0x31,0x30,
-0x30,0x07,0x75,0x6e,0x69,0x32,0x31,0x30,0x33,0x07,0x75,0x6e,0x69,0x32,0x31,0x30,
-0x34,0x09,0x61,0x66,0x69,0x69,0x36,0x31,0x32,0x34,0x38,0x07,0x75,0x6e,0x69,0x32,
-0x31,0x30,0x36,0x07,0x75,0x6e,0x69,0x32,0x31,0x30,0x39,0x07,0x75,0x6e,0x69,0x32,
-0x31,0x30,0x45,0x07,0x75,0x6e,0x69,0x32,0x31,0x30,0x46,0x08,0x49,0x66,0x72,0x61,
-0x6b,0x74,0x75,0x72,0x09,0x61,0x66,0x69,0x69,0x36,0x31,0x32,0x38,0x39,0x09,0x61,
-0x66,0x69,0x69,0x36,0x31,0x33,0x35,0x32,0x07,0x75,0x6e,0x69,0x32,0x31,0x31,0x37,
-0x0b,0x77,0x65,0x69,0x65,0x72,0x73,0x74,0x72,0x61,0x73,0x73,0x08,0x52,0x66,0x72,
-0x61,0x6b,0x74,0x75,0x72,0x07,0x75,0x6e,0x69,0x32,0x31,0x31,0x44,0x0c,0x70,0x72,
-0x65,0x73,0x63,0x72,0x69,0x70,0x74,0x69,0x6f,0x6e,0x07,0x75,0x6e,0x69,0x32,0x31,
-0x32,0x30,0x07,0x75,0x6e,0x69,0x32,0x31,0x32,0x31,0x07,0x75,0x6e,0x69,0x32,0x31,
-0x32,0x36,0x07,0x75,0x6e,0x69,0x32,0x31,0x32,0x37,0x07,0x75,0x6e,0x69,0x32,0x31,
-0x32,0x41,0x07,0x75,0x6e,0x69,0x32,0x31,0x32,0x42,0x09,0x65,0x73,0x74,0x69,0x6d,
-0x61,0x74,0x65,0x64,0x07,0x75,0x6e,0x69,0x32,0x31,0x33,0x32,0x07,0x75,0x6e,0x69,
-0x32,0x31,0x33,0x34,0x05,0x61,0x6c,0x65,0x70,0x68,0x07,0x75,0x6e,0x69,0x32,0x31,
-0x33,0x42,0x07,0x75,0x6e,0x69,0x32,0x31,0x34,0x42,0x08,0x6f,0x6e,0x65,0x74,0x68,
-0x69,0x72,0x64,0x09,0x74,0x77,0x6f,0x74,0x68,0x69,0x72,0x64,0x73,0x07,0x75,0x6e,
-0x69,0x32,0x31,0x35,0x35,0x07,0x75,0x6e,0x69,0x32,0x31,0x35,0x36,0x07,0x75,0x6e,
-0x69,0x32,0x31,0x35,0x37,0x07,0x75,0x6e,0x69,0x32,0x31,0x35,0x38,0x07,0x75,0x6e,
-0x69,0x32,0x31,0x35,0x39,0x07,0x75,0x6e,0x69,0x32,0x31,0x35,0x41,0x09,0x6f,0x6e,
-0x65,0x65,0x69,0x67,0x68,0x74,0x68,0x0c,0x74,0x68,0x72,0x65,0x65,0x65,0x69,0x67,
-0x68,0x74,0x68,0x73,0x0b,0x66,0x69,0x76,0x65,0x65,0x69,0x67,0x68,0x74,0x68,0x73,
-0x0c,0x73,0x65,0x76,0x65,0x6e,0x65,0x69,0x67,0x68,0x74,0x68,0x73,0x07,0x75,0x6e,
-0x69,0x32,0x31,0x35,0x46,0x07,0x75,0x6e,0x69,0x32,0x31,0x36,0x30,0x07,0x75,0x6e,
-0x69,0x32,0x31,0x36,0x31,0x07,0x75,0x6e,0x69,0x32,0x31,0x36,0x32,0x07,0x75,0x6e,
-0x69,0x32,0x31,0x36,0x33,0x07,0x75,0x6e,0x69,0x32,0x31,0x36,0x34,0x07,0x75,0x6e,
-0x69,0x32,0x31,0x36,0x35,0x07,0x75,0x6e,0x69,0x32,0x31,0x36,0x36,0x07,0x75,0x6e,
-0x69,0x32,0x31,0x36,0x37,0x07,0x75,0x6e,0x69,0x32,0x31,0x36,0x38,0x07,0x75,0x6e,
-0x69,0x32,0x31,0x36,0x39,0x07,0x75,0x6e,0x69,0x32,0x31,0x36,0x41,0x07,0x75,0x6e,
-0x69,0x32,0x31,0x36,0x42,0x07,0x75,0x6e,0x69,0x32,0x31,0x36,0x43,0x07,0x75,0x6e,
-0x69,0x32,0x31,0x36,0x44,0x07,0x75,0x6e,0x69,0x32,0x31,0x36,0x45,0x07,0x75,0x6e,
-0x69,0x32,0x31,0x36,0x46,0x07,0x75,0x6e,0x69,0x32,0x31,0x37,0x30,0x07,0x75,0x6e,
-0x69,0x32,0x31,0x37,0x31,0x07,0x75,0x6e,0x69,0x32,0x31,0x37,0x32,0x07,0x75,0x6e,
-0x69,0x32,0x31,0x37,0x33,0x07,0x75,0x6e,0x69,0x32,0x31,0x37,0x34,0x07,0x75,0x6e,
-0x69,0x32,0x31,0x37,0x35,0x07,0x75,0x6e,0x69,0x32,0x31,0x37,0x36,0x07,0x75,0x6e,
-0x69,0x32,0x31,0x37,0x37,0x07,0x75,0x6e,0x69,0x32,0x31,0x37,0x38,0x07,0x75,0x6e,
-0x69,0x32,0x31,0x37,0x39,0x07,0x75,0x6e,0x69,0x32,0x31,0x37,0x41,0x07,0x75,0x6e,
-0x69,0x32,0x31,0x37,0x42,0x07,0x75,0x6e,0x69,0x32,0x31,0x37,0x43,0x07,0x75,0x6e,
-0x69,0x32,0x31,0x37,0x44,0x07,0x75,0x6e,0x69,0x32,0x31,0x37,0x45,0x07,0x75,0x6e,
-0x69,0x32,0x31,0x37,0x46,0x07,0x75,0x6e,0x69,0x32,0x31,0x38,0x30,0x07,0x75,0x6e,
-0x69,0x32,0x31,0x38,0x31,0x07,0x75,0x6e,0x69,0x32,0x31,0x38,0x32,0x07,0x75,0x6e,
-0x69,0x32,0x31,0x38,0x33,0x09,0x61,0x72,0x72,0x6f,0x77,0x6c,0x65,0x66,0x74,0x07,
-0x61,0x72,0x72,0x6f,0x77,0x75,0x70,0x0a,0x61,0x72,0x72,0x6f,0x77,0x72,0x69,0x67,
-0x68,0x74,0x09,0x61,0x72,0x72,0x6f,0x77,0x64,0x6f,0x77,0x6e,0x09,0x61,0x72,0x72,
-0x6f,0x77,0x62,0x6f,0x74,0x68,0x09,0x61,0x72,0x72,0x6f,0x77,0x75,0x70,0x64,0x6e,
-0x07,0x75,0x6e,0x69,0x32,0x31,0x39,0x36,0x07,0x75,0x6e,0x69,0x32,0x31,0x39,0x37,
-0x07,0x75,0x6e,0x69,0x32,0x31,0x39,0x38,0x07,0x75,0x6e,0x69,0x32,0x31,0x39,0x39,
-0x07,0x75,0x6e,0x69,0x32,0x31,0x39,0x41,0x07,0x75,0x6e,0x69,0x32,0x31,0x39,0x42,
-0x07,0x75,0x6e,0x69,0x32,0x31,0x39,0x43,0x07,0x75,0x6e,0x69,0x32,0x31,0x39,0x44,
-0x07,0x75,0x6e,0x69,0x32,0x31,0x39,0x45,0x07,0x75,0x6e,0x69,0x32,0x31,0x39,0x46,
-0x07,0x75,0x6e,0x69,0x32,0x31,0x41,0x30,0x07,0x75,0x6e,0x69,0x32,0x31,0x41,0x31,
-0x07,0x75,0x6e,0x69,0x32,0x31,0x41,0x32,0x07,0x75,0x6e,0x69,0x32,0x31,0x41,0x33,
-0x07,0x75,0x6e,0x69,0x32,0x31,0x41,0x34,0x07,0x75,0x6e,0x69,0x32,0x31,0x41,0x35,
-0x07,0x75,0x6e,0x69,0x32,0x31,0x41,0x36,0x07,0x75,0x6e,0x69,0x32,0x31,0x41,0x37,
-0x0c,0x61,0x72,0x72,0x6f,0x77,0x75,0x70,0x64,0x6e,0x62,0x73,0x65,0x07,0x75,0x6e,
-0x69,0x32,0x31,0x42,0x30,0x07,0x75,0x6e,0x69,0x32,0x31,0x42,0x31,0x07,0x75,0x6e,
-0x69,0x32,0x31,0x42,0x32,0x07,0x75,0x6e,0x69,0x32,0x31,0x42,0x33,0x07,0x75,0x6e,
-0x69,0x32,0x31,0x42,0x34,0x0e,0x63,0x61,0x72,0x72,0x69,0x61,0x67,0x65,0x72,0x65,
-0x74,0x75,0x72,0x6e,0x07,0x75,0x6e,0x69,0x32,0x31,0x42,0x36,0x07,0x75,0x6e,0x69,
-0x32,0x31,0x42,0x37,0x07,0x75,0x6e,0x69,0x32,0x31,0x42,0x38,0x07,0x75,0x6e,0x69,
-0x32,0x31,0x42,0x39,0x07,0x75,0x6e,0x69,0x32,0x31,0x42,0x41,0x07,0x75,0x6e,0x69,
-0x32,0x31,0x42,0x42,0x07,0x75,0x6e,0x69,0x32,0x31,0x42,0x43,0x07,0x75,0x6e,0x69,
-0x32,0x31,0x42,0x44,0x07,0x75,0x6e,0x69,0x32,0x31,0x42,0x45,0x07,0x75,0x6e,0x69,
-0x32,0x31,0x42,0x46,0x07,0x75,0x6e,0x69,0x32,0x31,0x43,0x30,0x07,0x75,0x6e,0x69,
-0x32,0x31,0x43,0x31,0x07,0x75,0x6e,0x69,0x32,0x31,0x43,0x32,0x07,0x75,0x6e,0x69,
-0x32,0x31,0x43,0x33,0x07,0x75,0x6e,0x69,0x32,0x31,0x43,0x34,0x07,0x75,0x6e,0x69,
-0x32,0x31,0x43,0x35,0x07,0x75,0x6e,0x69,0x32,0x31,0x43,0x36,0x07,0x75,0x6e,0x69,
-0x32,0x31,0x43,0x37,0x07,0x75,0x6e,0x69,0x32,0x31,0x43,0x38,0x07,0x75,0x6e,0x69,
-0x32,0x31,0x43,0x39,0x07,0x75,0x6e,0x69,0x32,0x31,0x43,0x41,0x07,0x75,0x6e,0x69,
-0x32,0x31,0x43,0x42,0x07,0x75,0x6e,0x69,0x32,0x31,0x43,0x43,0x0c,0x61,0x72,0x72,
-0x6f,0x77,0x64,0x62,0x6c,0x6c,0x65,0x66,0x74,0x0a,0x61,0x72,0x72,0x6f,0x77,0x64,
-0x62,0x6c,0x75,0x70,0x0d,0x61,0x72,0x72,0x6f,0x77,0x64,0x62,0x6c,0x72,0x69,0x67,
-0x68,0x74,0x0c,0x61,0x72,0x72,0x6f,0x77,0x64,0x62,0x6c,0x64,0x6f,0x77,0x6e,0x0c,
-0x61,0x72,0x72,0x6f,0x77,0x64,0x62,0x6c,0x62,0x6f,0x74,0x68,0x09,0x75,0x6e,0x69,
-0x76,0x65,0x72,0x73,0x61,0x6c,0x07,0x75,0x6e,0x69,0x32,0x32,0x30,0x31,0x0b,0x65,
-0x78,0x69,0x73,0x74,0x65,0x6e,0x74,0x69,0x61,0x6c,0x07,0x75,0x6e,0x69,0x32,0x32,
-0x30,0x34,0x08,0x65,0x6d,0x70,0x74,0x79,0x73,0x65,0x74,0x08,0x67,0x72,0x61,0x64,
-0x69,0x65,0x6e,0x74,0x07,0x65,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x0a,0x6e,0x6f,0x74,
-0x65,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x07,0x75,0x6e,0x69,0x32,0x32,0x30,0x41,0x08,
-0x73,0x75,0x63,0x68,0x74,0x68,0x61,0x74,0x07,0x75,0x6e,0x69,0x32,0x32,0x30,0x43,
-0x07,0x75,0x6e,0x69,0x32,0x32,0x30,0x44,0x07,0x75,0x6e,0x69,0x32,0x32,0x30,0x45,
-0x07,0x75,0x6e,0x69,0x32,0x32,0x31,0x30,0x07,0x75,0x6e,0x69,0x32,0x32,0x31,0x33,
-0x07,0x75,0x6e,0x69,0x32,0x32,0x31,0x34,0x07,0x75,0x6e,0x69,0x32,0x32,0x31,0x36,
-0x0c,0x61,0x73,0x74,0x65,0x72,0x69,0x73,0x6b,0x6d,0x61,0x74,0x68,0x07,0x75,0x6e,
-0x69,0x32,0x32,0x31,0x38,0x07,0x75,0x6e,0x69,0x32,0x32,0x31,0x42,0x07,0x75,0x6e,
-0x69,0x32,0x32,0x31,0x43,0x0c,0x70,0x72,0x6f,0x70,0x6f,0x72,0x74,0x69,0x6f,0x6e,
-0x61,0x6c,0x0a,0x6f,0x72,0x74,0x68,0x6f,0x67,0x6f,0x6e,0x61,0x6c,0x05,0x61,0x6e,
-0x67,0x6c,0x65,0x07,0x75,0x6e,0x69,0x32,0x32,0x32,0x31,0x07,0x75,0x6e,0x69,0x32,
-0x32,0x32,0x32,0x07,0x75,0x6e,0x69,0x32,0x32,0x32,0x33,0x07,0x75,0x6e,0x69,0x32,
-0x32,0x32,0x34,0x07,0x75,0x6e,0x69,0x32,0x32,0x32,0x35,0x07,0x75,0x6e,0x69,0x32,
-0x32,0x32,0x36,0x0a,0x6c,0x6f,0x67,0x69,0x63,0x61,0x6c,0x61,0x6e,0x64,0x09,0x6c,
-0x6f,0x67,0x69,0x63,0x61,0x6c,0x6f,0x72,0x0c,0x69,0x6e,0x74,0x65,0x72,0x73,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x05,0x75,0x6e,0x69,0x6f,0x6e,0x07,0x75,0x6e,0x69,0x32,
-0x32,0x32,0x43,0x07,0x75,0x6e,0x69,0x32,0x32,0x32,0x44,0x09,0x74,0x68,0x65,0x72,
-0x65,0x66,0x6f,0x72,0x65,0x07,0x75,0x6e,0x69,0x32,0x32,0x33,0x35,0x07,0x75,0x6e,
-0x69,0x32,0x32,0x33,0x36,0x07,0x75,0x6e,0x69,0x32,0x32,0x33,0x37,0x07,0x75,0x6e,
-0x69,0x32,0x32,0x33,0x38,0x07,0x75,0x6e,0x69,0x32,0x32,0x33,0x39,0x07,0x75,0x6e,
-0x69,0x32,0x32,0x33,0x41,0x07,0x75,0x6e,0x69,0x32,0x32,0x33,0x42,0x07,0x73,0x69,
-0x6d,0x69,0x6c,0x61,0x72,0x07,0x75,0x6e,0x69,0x32,0x32,0x33,0x44,0x07,0x75,0x6e,
-0x69,0x32,0x32,0x34,0x31,0x07,0x75,0x6e,0x69,0x32,0x32,0x34,0x32,0x07,0x75,0x6e,
-0x69,0x32,0x32,0x34,0x33,0x07,0x75,0x6e,0x69,0x32,0x32,0x34,0x34,0x09,0x63,0x6f,
-0x6e,0x67,0x72,0x75,0x65,0x6e,0x74,0x07,0x75,0x6e,0x69,0x32,0x32,0x34,0x36,0x07,
-0x75,0x6e,0x69,0x32,0x32,0x34,0x37,0x07,0x75,0x6e,0x69,0x32,0x32,0x34,0x39,0x07,
-0x75,0x6e,0x69,0x32,0x32,0x34,0x41,0x07,0x75,0x6e,0x69,0x32,0x32,0x34,0x42,0x07,
-0x75,0x6e,0x69,0x32,0x32,0x34,0x43,0x07,0x75,0x6e,0x69,0x32,0x32,0x34,0x44,0x07,
-0x75,0x6e,0x69,0x32,0x32,0x34,0x45,0x07,0x75,0x6e,0x69,0x32,0x32,0x34,0x46,0x07,
-0x75,0x6e,0x69,0x32,0x32,0x35,0x30,0x07,0x75,0x6e,0x69,0x32,0x32,0x35,0x31,0x07,
-0x75,0x6e,0x69,0x32,0x32,0x35,0x32,0x07,0x75,0x6e,0x69,0x32,0x32,0x35,0x33,0x07,
-0x75,0x6e,0x69,0x32,0x32,0x35,0x34,0x07,0x75,0x6e,0x69,0x32,0x32,0x35,0x35,0x07,
-0x75,0x6e,0x69,0x32,0x32,0x35,0x36,0x07,0x75,0x6e,0x69,0x32,0x32,0x35,0x37,0x07,
-0x75,0x6e,0x69,0x32,0x32,0x35,0x38,0x07,0x75,0x6e,0x69,0x32,0x32,0x35,0x39,0x07,
-0x75,0x6e,0x69,0x32,0x32,0x35,0x41,0x07,0x75,0x6e,0x69,0x32,0x32,0x35,0x42,0x07,
-0x75,0x6e,0x69,0x32,0x32,0x35,0x43,0x07,0x75,0x6e,0x69,0x32,0x32,0x35,0x44,0x07,
-0x75,0x6e,0x69,0x32,0x32,0x35,0x45,0x07,0x75,0x6e,0x69,0x32,0x32,0x35,0x46,0x0b,
-0x65,0x71,0x75,0x69,0x76,0x61,0x6c,0x65,0x6e,0x63,0x65,0x07,0x75,0x6e,0x69,0x32,
-0x32,0x36,0x32,0x07,0x75,0x6e,0x69,0x32,0x32,0x36,0x33,0x07,0x75,0x6e,0x69,0x32,
-0x32,0x36,0x36,0x07,0x75,0x6e,0x69,0x32,0x32,0x36,0x37,0x07,0x75,0x6e,0x69,0x32,
-0x32,0x36,0x38,0x07,0x75,0x6e,0x69,0x32,0x32,0x36,0x39,0x07,0x75,0x6e,0x69,0x32,
-0x32,0x36,0x41,0x07,0x75,0x6e,0x69,0x32,0x32,0x36,0x42,0x07,0x75,0x6e,0x69,0x32,
-0x32,0x36,0x44,0x07,0x75,0x6e,0x69,0x32,0x32,0x36,0x45,0x07,0x75,0x6e,0x69,0x32,
-0x32,0x36,0x46,0x07,0x75,0x6e,0x69,0x32,0x32,0x37,0x30,0x07,0x75,0x6e,0x69,0x32,
-0x32,0x37,0x31,0x07,0x75,0x6e,0x69,0x32,0x32,0x37,0x32,0x07,0x75,0x6e,0x69,0x32,
-0x32,0x37,0x33,0x07,0x75,0x6e,0x69,0x32,0x32,0x37,0x34,0x07,0x75,0x6e,0x69,0x32,
-0x32,0x37,0x35,0x07,0x75,0x6e,0x69,0x32,0x32,0x37,0x36,0x07,0x75,0x6e,0x69,0x32,
-0x32,0x37,0x37,0x07,0x75,0x6e,0x69,0x32,0x32,0x37,0x38,0x07,0x75,0x6e,0x69,0x32,
-0x32,0x37,0x39,0x07,0x75,0x6e,0x69,0x32,0x32,0x37,0x41,0x07,0x75,0x6e,0x69,0x32,
-0x32,0x37,0x42,0x07,0x75,0x6e,0x69,0x32,0x32,0x37,0x43,0x07,0x75,0x6e,0x69,0x32,
-0x32,0x37,0x44,0x07,0x75,0x6e,0x69,0x32,0x32,0x37,0x45,0x07,0x75,0x6e,0x69,0x32,
-0x32,0x37,0x46,0x07,0x75,0x6e,0x69,0x32,0x32,0x38,0x30,0x07,0x75,0x6e,0x69,0x32,
-0x32,0x38,0x31,0x0c,0x70,0x72,0x6f,0x70,0x65,0x72,0x73,0x75,0x62,0x73,0x65,0x74,
-0x0e,0x70,0x72,0x6f,0x70,0x65,0x72,0x73,0x75,0x70,0x65,0x72,0x73,0x65,0x74,0x09,
-0x6e,0x6f,0x74,0x73,0x75,0x62,0x73,0x65,0x74,0x07,0x75,0x6e,0x69,0x32,0x32,0x38,
-0x35,0x0c,0x72,0x65,0x66,0x6c,0x65,0x78,0x73,0x75,0x62,0x73,0x65,0x74,0x0e,0x72,
-0x65,0x66,0x6c,0x65,0x78,0x73,0x75,0x70,0x65,0x72,0x73,0x65,0x74,0x07,0x75,0x6e,
-0x69,0x32,0x32,0x38,0x38,0x07,0x75,0x6e,0x69,0x32,0x32,0x38,0x39,0x07,0x75,0x6e,
-0x69,0x32,0x32,0x38,0x41,0x07,0x75,0x6e,0x69,0x32,0x32,0x38,0x42,0x0a,0x63,0x69,
-0x72,0x63,0x6c,0x65,0x70,0x6c,0x75,0x73,0x07,0x75,0x6e,0x69,0x32,0x32,0x39,0x36,
-0x0e,0x63,0x69,0x72,0x63,0x6c,0x65,0x6d,0x75,0x6c,0x74,0x69,0x70,0x6c,0x79,0x07,
-0x75,0x6e,0x69,0x32,0x32,0x39,0x38,0x07,0x75,0x6e,0x69,0x32,0x32,0x41,0x34,0x0d,
-0x70,0x65,0x72,0x70,0x65,0x6e,0x64,0x69,0x63,0x75,0x6c,0x61,0x72,0x07,0x75,0x6e,
-0x69,0x32,0x32,0x43,0x34,0x07,0x64,0x6f,0x74,0x6d,0x61,0x74,0x68,0x07,0x75,0x6e,
-0x69,0x32,0x32,0x43,0x36,0x05,0x68,0x6f,0x75,0x73,0x65,0x07,0x75,0x6e,0x69,0x32,
-0x33,0x30,0x36,0x07,0x75,0x6e,0x69,0x32,0x33,0x30,0x38,0x07,0x75,0x6e,0x69,0x32,
-0x33,0x30,0x39,0x07,0x75,0x6e,0x69,0x32,0x33,0x30,0x41,0x07,0x75,0x6e,0x69,0x32,
-0x33,0x30,0x42,0x0d,0x72,0x65,0x76,0x6c,0x6f,0x67,0x69,0x63,0x61,0x6c,0x6e,0x6f,
-0x74,0x07,0x75,0x6e,0x69,0x32,0x33,0x31,0x31,0x07,0x75,0x6e,0x69,0x32,0x33,0x31,
-0x38,0x07,0x75,0x6e,0x69,0x32,0x33,0x31,0x39,0x0a,0x69,0x6e,0x74,0x65,0x67,0x72,
-0x61,0x6c,0x74,0x70,0x0a,0x69,0x6e,0x74,0x65,0x67,0x72,0x61,0x6c,0x62,0x74,0x07,
-0x75,0x6e,0x69,0x32,0x33,0x32,0x35,0x07,0x75,0x6e,0x69,0x32,0x33,0x32,0x38,0x09,
-0x61,0x6e,0x67,0x6c,0x65,0x6c,0x65,0x66,0x74,0x0a,0x61,0x6e,0x67,0x6c,0x65,0x72,
-0x69,0x67,0x68,0x74,0x07,0x75,0x6e,0x69,0x32,0x33,0x37,0x44,0x07,0x75,0x6e,0x69,
-0x32,0x33,0x41,0x45,0x07,0x75,0x6e,0x69,0x32,0x33,0x43,0x46,0x07,0x75,0x6e,0x69,
-0x32,0x34,0x32,0x32,0x07,0x75,0x6e,0x69,0x32,0x34,0x32,0x33,0x07,0x75,0x6e,0x69,
-0x32,0x34,0x36,0x30,0x07,0x75,0x6e,0x69,0x32,0x34,0x36,0x31,0x07,0x75,0x6e,0x69,
-0x32,0x34,0x36,0x32,0x07,0x75,0x6e,0x69,0x32,0x34,0x36,0x33,0x07,0x75,0x6e,0x69,
-0x32,0x34,0x36,0x34,0x07,0x75,0x6e,0x69,0x32,0x34,0x36,0x35,0x07,0x75,0x6e,0x69,
-0x32,0x34,0x36,0x36,0x07,0x75,0x6e,0x69,0x32,0x34,0x36,0x37,0x07,0x75,0x6e,0x69,
-0x32,0x34,0x36,0x38,0x07,0x75,0x6e,0x69,0x32,0x34,0x36,0x39,0x07,0x75,0x70,0x62,
-0x6c,0x6f,0x63,0x6b,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x31,0x07,0x75,0x6e,0x69,
-0x32,0x35,0x38,0x32,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x33,0x07,0x64,0x6e,0x62,
-0x6c,0x6f,0x63,0x6b,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x35,0x07,0x75,0x6e,0x69,
-0x32,0x35,0x38,0x36,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x37,0x05,0x62,0x6c,0x6f,
-0x63,0x6b,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x39,0x07,0x75,0x6e,0x69,0x32,0x35,
-0x38,0x41,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x42,0x07,0x6c,0x66,0x62,0x6c,0x6f,
-0x63,0x6b,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x44,0x07,0x75,0x6e,0x69,0x32,0x35,
-0x38,0x45,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x46,0x07,0x72,0x74,0x62,0x6c,0x6f,
-0x63,0x6b,0x07,0x6c,0x74,0x73,0x68,0x61,0x64,0x65,0x05,0x73,0x68,0x61,0x64,0x65,
-0x07,0x64,0x6b,0x73,0x68,0x61,0x64,0x65,0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x34,
-0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x36,
-0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x37,0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x38,
-0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x39,0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x41,
-0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x42,0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x43,
-0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x44,0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x45,
-0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x46,0x09,0x66,0x69,0x6c,0x6c,0x65,0x64,0x62,
-0x6f,0x78,0x06,0x48,0x32,0x32,0x30,0x37,0x33,0x07,0x75,0x6e,0x69,0x32,0x35,0x41,
-0x32,0x07,0x75,0x6e,0x69,0x32,0x35,0x41,0x33,0x07,0x75,0x6e,0x69,0x32,0x35,0x41,
-0x34,0x07,0x75,0x6e,0x69,0x32,0x35,0x41,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,0x41,
-0x36,0x07,0x75,0x6e,0x69,0x32,0x35,0x41,0x37,0x07,0x75,0x6e,0x69,0x32,0x35,0x41,
-0x38,0x07,0x75,0x6e,0x69,0x32,0x35,0x41,0x39,0x06,0x48,0x31,0x38,0x35,0x34,0x33,
-0x06,0x48,0x31,0x38,0x35,0x35,0x31,0x0a,0x66,0x69,0x6c,0x6c,0x65,0x64,0x72,0x65,
-0x63,0x74,0x07,0x75,0x6e,0x69,0x32,0x35,0x41,0x44,0x07,0x75,0x6e,0x69,0x32,0x35,
-0x41,0x45,0x07,0x75,0x6e,0x69,0x32,0x35,0x41,0x46,0x07,0x75,0x6e,0x69,0x32,0x35,
-0x42,0x30,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x31,0x07,0x74,0x72,0x69,0x61,0x67,
-0x75,0x70,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x33,0x07,0x75,0x6e,0x69,0x32,0x35,
-0x42,0x34,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,
-0x42,0x36,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x37,0x07,0x75,0x6e,0x69,0x32,0x35,
-0x42,0x38,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x39,0x07,0x74,0x72,0x69,0x61,0x67,
-0x72,0x74,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x42,0x07,0x74,0x72,0x69,0x61,0x67,
-0x64,0x6e,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x44,0x07,0x75,0x6e,0x69,0x32,0x35,
-0x42,0x45,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x46,0x07,0x75,0x6e,0x69,0x32,0x35,
-0x43,0x30,0x07,0x75,0x6e,0x69,0x32,0x35,0x43,0x31,0x07,0x75,0x6e,0x69,0x32,0x35,
-0x43,0x32,0x07,0x75,0x6e,0x69,0x32,0x35,0x43,0x33,0x07,0x74,0x72,0x69,0x61,0x67,
-0x6c,0x66,0x07,0x75,0x6e,0x69,0x32,0x35,0x43,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,
-0x43,0x36,0x07,0x75,0x6e,0x69,0x32,0x35,0x43,0x37,0x07,0x75,0x6e,0x69,0x32,0x35,
-0x43,0x38,0x07,0x75,0x6e,0x69,0x32,0x35,0x43,0x39,0x06,0x63,0x69,0x72,0x63,0x6c,
-0x65,0x07,0x75,0x6e,0x69,0x32,0x35,0x43,0x43,0x07,0x75,0x6e,0x69,0x32,0x35,0x43,
-0x44,0x07,0x75,0x6e,0x69,0x32,0x35,0x43,0x45,0x06,0x48,0x31,0x38,0x35,0x33,0x33,
-0x07,0x75,0x6e,0x69,0x32,0x35,0x44,0x30,0x07,0x75,0x6e,0x69,0x32,0x35,0x44,0x31,
-0x07,0x75,0x6e,0x69,0x32,0x35,0x44,0x32,0x07,0x75,0x6e,0x69,0x32,0x35,0x44,0x33,
-0x07,0x75,0x6e,0x69,0x32,0x35,0x44,0x34,0x07,0x75,0x6e,0x69,0x32,0x35,0x44,0x35,
-0x07,0x75,0x6e,0x69,0x32,0x35,0x44,0x36,0x07,0x75,0x6e,0x69,0x32,0x35,0x44,0x37,
-0x09,0x69,0x6e,0x76,0x62,0x75,0x6c,0x6c,0x65,0x74,0x09,0x69,0x6e,0x76,0x63,0x69,
-0x72,0x63,0x6c,0x65,0x07,0x75,0x6e,0x69,0x32,0x35,0x44,0x41,0x07,0x75,0x6e,0x69,
-0x32,0x35,0x44,0x42,0x07,0x75,0x6e,0x69,0x32,0x35,0x44,0x43,0x07,0x75,0x6e,0x69,
-0x32,0x35,0x44,0x44,0x07,0x75,0x6e,0x69,0x32,0x35,0x44,0x45,0x07,0x75,0x6e,0x69,
-0x32,0x35,0x44,0x46,0x07,0x75,0x6e,0x69,0x32,0x35,0x45,0x30,0x07,0x75,0x6e,0x69,
-0x32,0x35,0x45,0x31,0x07,0x75,0x6e,0x69,0x32,0x35,0x45,0x32,0x07,0x75,0x6e,0x69,
-0x32,0x35,0x45,0x33,0x07,0x75,0x6e,0x69,0x32,0x35,0x45,0x34,0x07,0x75,0x6e,0x69,
-0x32,0x35,0x45,0x35,0x0a,0x6f,0x70,0x65,0x6e,0x62,0x75,0x6c,0x6c,0x65,0x74,0x07,
-0x75,0x6e,0x69,0x32,0x35,0x45,0x37,0x07,0x75,0x6e,0x69,0x32,0x35,0x45,0x38,0x07,
-0x75,0x6e,0x69,0x32,0x35,0x45,0x39,0x07,0x75,0x6e,0x69,0x32,0x35,0x45,0x41,0x07,
-0x75,0x6e,0x69,0x32,0x35,0x45,0x42,0x07,0x75,0x6e,0x69,0x32,0x35,0x45,0x43,0x07,
-0x75,0x6e,0x69,0x32,0x35,0x45,0x44,0x07,0x75,0x6e,0x69,0x32,0x35,0x45,0x45,0x07,
-0x75,0x6e,0x69,0x32,0x35,0x45,0x46,0x07,0x75,0x6e,0x69,0x32,0x35,0x46,0x30,0x07,
-0x75,0x6e,0x69,0x32,0x35,0x46,0x31,0x07,0x75,0x6e,0x69,0x32,0x35,0x46,0x32,0x07,
-0x75,0x6e,0x69,0x32,0x35,0x46,0x33,0x07,0x75,0x6e,0x69,0x32,0x35,0x46,0x34,0x07,
-0x75,0x6e,0x69,0x32,0x35,0x46,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,0x46,0x36,0x07,
-0x75,0x6e,0x69,0x32,0x35,0x46,0x37,0x07,0x75,0x6e,0x69,0x32,0x35,0x46,0x38,0x07,
-0x75,0x6e,0x69,0x32,0x35,0x46,0x39,0x07,0x75,0x6e,0x69,0x32,0x35,0x46,0x41,0x07,
-0x75,0x6e,0x69,0x32,0x35,0x46,0x42,0x07,0x75,0x6e,0x69,0x32,0x35,0x46,0x43,0x07,
-0x75,0x6e,0x69,0x32,0x35,0x46,0x44,0x07,0x75,0x6e,0x69,0x32,0x35,0x46,0x45,0x07,
-0x75,0x6e,0x69,0x32,0x35,0x46,0x46,0x07,0x75,0x6e,0x69,0x32,0x36,0x30,0x30,0x07,
-0x75,0x6e,0x69,0x32,0x36,0x30,0x31,0x07,0x75,0x6e,0x69,0x32,0x36,0x30,0x32,0x07,
-0x75,0x6e,0x69,0x32,0x36,0x30,0x33,0x07,0x75,0x6e,0x69,0x32,0x36,0x30,0x34,0x07,
-0x75,0x6e,0x69,0x32,0x36,0x30,0x35,0x07,0x75,0x6e,0x69,0x32,0x36,0x30,0x36,0x07,
-0x75,0x6e,0x69,0x32,0x36,0x30,0x37,0x07,0x75,0x6e,0x69,0x32,0x36,0x30,0x38,0x07,
-0x75,0x6e,0x69,0x32,0x36,0x30,0x39,0x07,0x75,0x6e,0x69,0x32,0x36,0x30,0x41,0x07,
-0x75,0x6e,0x69,0x32,0x36,0x30,0x42,0x07,0x75,0x6e,0x69,0x32,0x36,0x30,0x43,0x07,
-0x75,0x6e,0x69,0x32,0x36,0x30,0x44,0x07,0x75,0x6e,0x69,0x32,0x36,0x30,0x45,0x07,
-0x75,0x6e,0x69,0x32,0x36,0x30,0x46,0x07,0x75,0x6e,0x69,0x32,0x36,0x31,0x30,0x07,
-0x75,0x6e,0x69,0x32,0x36,0x31,0x31,0x07,0x75,0x6e,0x69,0x32,0x36,0x31,0x32,0x07,
-0x75,0x6e,0x69,0x32,0x36,0x31,0x33,0x07,0x75,0x6e,0x69,0x32,0x36,0x31,0x34,0x07,
-0x75,0x6e,0x69,0x32,0x36,0x31,0x35,0x07,0x75,0x6e,0x69,0x32,0x36,0x31,0x36,0x07,
-0x75,0x6e,0x69,0x32,0x36,0x31,0x37,0x07,0x75,0x6e,0x69,0x32,0x36,0x31,0x38,0x07,
-0x75,0x6e,0x69,0x32,0x36,0x31,0x39,0x07,0x75,0x6e,0x69,0x32,0x36,0x31,0x41,0x07,
-0x75,0x6e,0x69,0x32,0x36,0x31,0x42,0x07,0x75,0x6e,0x69,0x32,0x36,0x31,0x43,0x07,
-0x75,0x6e,0x69,0x32,0x36,0x31,0x44,0x07,0x75,0x6e,0x69,0x32,0x36,0x31,0x45,0x07,
-0x75,0x6e,0x69,0x32,0x36,0x31,0x46,0x07,0x75,0x6e,0x69,0x32,0x36,0x32,0x30,0x07,
-0x75,0x6e,0x69,0x32,0x36,0x32,0x31,0x07,0x75,0x6e,0x69,0x32,0x36,0x32,0x32,0x07,
-0x75,0x6e,0x69,0x32,0x36,0x32,0x33,0x07,0x75,0x6e,0x69,0x32,0x36,0x32,0x34,0x07,
-0x75,0x6e,0x69,0x32,0x36,0x32,0x35,0x07,0x75,0x6e,0x69,0x32,0x36,0x32,0x36,0x07,
-0x75,0x6e,0x69,0x32,0x36,0x32,0x37,0x07,0x75,0x6e,0x69,0x32,0x36,0x32,0x38,0x07,
-0x75,0x6e,0x69,0x32,0x36,0x32,0x39,0x07,0x75,0x6e,0x69,0x32,0x36,0x32,0x41,0x07,
-0x75,0x6e,0x69,0x32,0x36,0x32,0x42,0x07,0x75,0x6e,0x69,0x32,0x36,0x32,0x43,0x07,
-0x75,0x6e,0x69,0x32,0x36,0x32,0x44,0x07,0x75,0x6e,0x69,0x32,0x36,0x32,0x45,0x07,
-0x75,0x6e,0x69,0x32,0x36,0x32,0x46,0x07,0x75,0x6e,0x69,0x32,0x36,0x33,0x30,0x07,
-0x75,0x6e,0x69,0x32,0x36,0x33,0x31,0x07,0x75,0x6e,0x69,0x32,0x36,0x33,0x32,0x07,
-0x75,0x6e,0x69,0x32,0x36,0x33,0x33,0x07,0x75,0x6e,0x69,0x32,0x36,0x33,0x34,0x07,
-0x75,0x6e,0x69,0x32,0x36,0x33,0x35,0x07,0x75,0x6e,0x69,0x32,0x36,0x33,0x36,0x07,
-0x75,0x6e,0x69,0x32,0x36,0x33,0x37,0x07,0x75,0x6e,0x69,0x32,0x36,0x33,0x38,0x07,
-0x75,0x6e,0x69,0x32,0x36,0x33,0x39,0x09,0x73,0x6d,0x69,0x6c,0x65,0x66,0x61,0x63,
-0x65,0x0c,0x69,0x6e,0x76,0x73,0x6d,0x69,0x6c,0x65,0x66,0x61,0x63,0x65,0x03,0x73,
-0x75,0x6e,0x07,0x75,0x6e,0x69,0x32,0x36,0x33,0x44,0x07,0x75,0x6e,0x69,0x32,0x36,
-0x33,0x45,0x07,0x75,0x6e,0x69,0x32,0x36,0x33,0x46,0x06,0x66,0x65,0x6d,0x61,0x6c,
-0x65,0x07,0x75,0x6e,0x69,0x32,0x36,0x34,0x31,0x04,0x6d,0x61,0x6c,0x65,0x07,0x75,
-0x6e,0x69,0x32,0x36,0x34,0x33,0x07,0x75,0x6e,0x69,0x32,0x36,0x34,0x34,0x07,0x75,
-0x6e,0x69,0x32,0x36,0x34,0x35,0x07,0x75,0x6e,0x69,0x32,0x36,0x34,0x36,0x07,0x75,
-0x6e,0x69,0x32,0x36,0x34,0x37,0x07,0x75,0x6e,0x69,0x32,0x36,0x34,0x38,0x07,0x75,
-0x6e,0x69,0x32,0x36,0x34,0x39,0x07,0x75,0x6e,0x69,0x32,0x36,0x34,0x41,0x07,0x75,
-0x6e,0x69,0x32,0x36,0x34,0x42,0x07,0x75,0x6e,0x69,0x32,0x36,0x34,0x43,0x07,0x75,
-0x6e,0x69,0x32,0x36,0x34,0x44,0x07,0x75,0x6e,0x69,0x32,0x36,0x34,0x45,0x07,0x75,
-0x6e,0x69,0x32,0x36,0x34,0x46,0x07,0x75,0x6e,0x69,0x32,0x36,0x35,0x30,0x07,0x75,
-0x6e,0x69,0x32,0x36,0x35,0x31,0x07,0x75,0x6e,0x69,0x32,0x36,0x35,0x32,0x07,0x75,
-0x6e,0x69,0x32,0x36,0x35,0x33,0x07,0x75,0x6e,0x69,0x32,0x36,0x35,0x34,0x07,0x75,
-0x6e,0x69,0x32,0x36,0x35,0x35,0x07,0x75,0x6e,0x69,0x32,0x36,0x35,0x36,0x07,0x75,
-0x6e,0x69,0x32,0x36,0x35,0x37,0x07,0x75,0x6e,0x69,0x32,0x36,0x35,0x38,0x07,0x75,
-0x6e,0x69,0x32,0x36,0x35,0x39,0x07,0x75,0x6e,0x69,0x32,0x36,0x35,0x41,0x07,0x75,
-0x6e,0x69,0x32,0x36,0x35,0x42,0x07,0x75,0x6e,0x69,0x32,0x36,0x35,0x43,0x07,0x75,
-0x6e,0x69,0x32,0x36,0x35,0x44,0x07,0x75,0x6e,0x69,0x32,0x36,0x35,0x45,0x07,0x75,
-0x6e,0x69,0x32,0x36,0x35,0x46,0x05,0x73,0x70,0x61,0x64,0x65,0x07,0x75,0x6e,0x69,
-0x32,0x36,0x36,0x31,0x07,0x75,0x6e,0x69,0x32,0x36,0x36,0x32,0x04,0x63,0x6c,0x75,
-0x62,0x07,0x75,0x6e,0x69,0x32,0x36,0x36,0x34,0x05,0x68,0x65,0x61,0x72,0x74,0x07,
-0x64,0x69,0x61,0x6d,0x6f,0x6e,0x64,0x07,0x75,0x6e,0x69,0x32,0x36,0x36,0x37,0x07,
-0x75,0x6e,0x69,0x32,0x36,0x36,0x38,0x07,0x75,0x6e,0x69,0x32,0x36,0x36,0x39,0x0b,
-0x6d,0x75,0x73,0x69,0x63,0x61,0x6c,0x6e,0x6f,0x74,0x65,0x0e,0x6d,0x75,0x73,0x69,
-0x63,0x61,0x6c,0x6e,0x6f,0x74,0x65,0x64,0x62,0x6c,0x07,0x75,0x6e,0x69,0x32,0x36,
-0x36,0x43,0x07,0x75,0x6e,0x69,0x32,0x36,0x36,0x44,0x07,0x75,0x6e,0x69,0x32,0x36,
-0x36,0x45,0x07,0x75,0x6e,0x69,0x32,0x36,0x36,0x46,0x07,0x75,0x6e,0x69,0x32,0x36,
-0x37,0x30,0x07,0x75,0x6e,0x69,0x32,0x36,0x37,0x31,0x07,0x75,0x6e,0x69,0x32,0x36,
-0x37,0x32,0x07,0x75,0x6e,0x69,0x32,0x36,0x37,0x33,0x07,0x75,0x6e,0x69,0x32,0x36,
-0x37,0x34,0x07,0x75,0x6e,0x69,0x32,0x36,0x37,0x35,0x07,0x75,0x6e,0x69,0x32,0x36,
-0x37,0x36,0x07,0x75,0x6e,0x69,0x32,0x36,0x37,0x37,0x07,0x75,0x6e,0x69,0x32,0x36,
-0x37,0x38,0x07,0x75,0x6e,0x69,0x32,0x36,0x37,0x39,0x07,0x75,0x6e,0x69,0x32,0x36,
-0x37,0x41,0x07,0x75,0x6e,0x69,0x32,0x36,0x37,0x42,0x07,0x75,0x6e,0x69,0x32,0x36,
-0x37,0x43,0x07,0x75,0x6e,0x69,0x32,0x36,0x37,0x44,0x07,0x75,0x6e,0x69,0x32,0x36,
-0x37,0x45,0x07,0x75,0x6e,0x69,0x32,0x36,0x37,0x46,0x07,0x75,0x6e,0x69,0x32,0x36,
-0x38,0x30,0x07,0x75,0x6e,0x69,0x32,0x36,0x38,0x31,0x07,0x75,0x6e,0x69,0x32,0x36,
-0x38,0x32,0x07,0x75,0x6e,0x69,0x32,0x36,0x38,0x33,0x07,0x75,0x6e,0x69,0x32,0x36,
-0x38,0x34,0x07,0x75,0x6e,0x69,0x32,0x36,0x38,0x35,0x07,0x75,0x6e,0x69,0x32,0x36,
-0x38,0x36,0x07,0x75,0x6e,0x69,0x32,0x36,0x38,0x37,0x07,0x75,0x6e,0x69,0x32,0x36,
-0x38,0x38,0x07,0x75,0x6e,0x69,0x32,0x36,0x38,0x39,0x07,0x75,0x6e,0x69,0x32,0x36,
-0x38,0x41,0x07,0x75,0x6e,0x69,0x32,0x36,0x38,0x42,0x07,0x75,0x6e,0x69,0x32,0x36,
-0x38,0x43,0x07,0x75,0x6e,0x69,0x32,0x36,0x38,0x44,0x07,0x75,0x6e,0x69,0x32,0x36,
-0x38,0x45,0x07,0x75,0x6e,0x69,0x32,0x36,0x38,0x46,0x07,0x75,0x6e,0x69,0x32,0x36,
-0x39,0x30,0x07,0x75,0x6e,0x69,0x32,0x36,0x39,0x31,0x07,0x75,0x6e,0x69,0x32,0x36,
-0x39,0x32,0x07,0x75,0x6e,0x69,0x32,0x36,0x39,0x33,0x07,0x75,0x6e,0x69,0x32,0x36,
-0x39,0x34,0x07,0x75,0x6e,0x69,0x32,0x36,0x39,0x35,0x07,0x75,0x6e,0x69,0x32,0x36,
-0x39,0x36,0x07,0x75,0x6e,0x69,0x32,0x36,0x39,0x37,0x07,0x75,0x6e,0x69,0x32,0x36,
-0x39,0x38,0x07,0x75,0x6e,0x69,0x32,0x36,0x39,0x39,0x07,0x75,0x6e,0x69,0x32,0x36,
-0x39,0x41,0x07,0x75,0x6e,0x69,0x32,0x36,0x39,0x42,0x07,0x75,0x6e,0x69,0x32,0x36,
-0x39,0x43,0x07,0x75,0x6e,0x69,0x32,0x36,0x41,0x30,0x07,0x75,0x6e,0x69,0x32,0x36,
-0x41,0x31,0x07,0x75,0x6e,0x69,0x32,0x36,0x42,0x30,0x07,0x75,0x6e,0x69,0x32,0x36,
-0x42,0x31,0x07,0x75,0x6e,0x69,0x32,0x37,0x30,0x31,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x30,0x32,0x07,0x75,0x6e,0x69,0x32,0x37,0x30,0x33,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x30,0x34,0x07,0x75,0x6e,0x69,0x32,0x37,0x30,0x36,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x30,0x37,0x07,0x75,0x6e,0x69,0x32,0x37,0x30,0x38,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x30,0x39,0x07,0x75,0x6e,0x69,0x32,0x37,0x30,0x43,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x30,0x44,0x07,0x75,0x6e,0x69,0x32,0x37,0x30,0x45,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x30,0x46,0x07,0x75,0x6e,0x69,0x32,0x37,0x31,0x30,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x31,0x31,0x07,0x75,0x6e,0x69,0x32,0x37,0x31,0x32,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x31,0x33,0x07,0x75,0x6e,0x69,0x32,0x37,0x31,0x34,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x31,0x35,0x07,0x75,0x6e,0x69,0x32,0x37,0x31,0x36,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x31,0x37,0x07,0x75,0x6e,0x69,0x32,0x37,0x31,0x38,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x31,0x39,0x07,0x75,0x6e,0x69,0x32,0x37,0x31,0x41,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x31,0x42,0x07,0x75,0x6e,0x69,0x32,0x37,0x31,0x43,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x31,0x44,0x07,0x75,0x6e,0x69,0x32,0x37,0x31,0x45,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x31,0x46,0x07,0x75,0x6e,0x69,0x32,0x37,0x32,0x30,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x32,0x31,0x07,0x75,0x6e,0x69,0x32,0x37,0x32,0x32,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x32,0x33,0x07,0x75,0x6e,0x69,0x32,0x37,0x32,0x34,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x32,0x35,0x07,0x75,0x6e,0x69,0x32,0x37,0x32,0x36,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x32,0x37,0x07,0x75,0x6e,0x69,0x32,0x37,0x32,0x39,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x32,0x41,0x07,0x75,0x6e,0x69,0x32,0x37,0x32,0x42,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x32,0x43,0x07,0x75,0x6e,0x69,0x32,0x37,0x32,0x44,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x32,0x45,0x07,0x75,0x6e,0x69,0x32,0x37,0x32,0x46,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x33,0x30,0x07,0x75,0x6e,0x69,0x32,0x37,0x33,0x31,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x33,0x32,0x07,0x75,0x6e,0x69,0x32,0x37,0x33,0x33,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x33,0x34,0x07,0x75,0x6e,0x69,0x32,0x37,0x33,0x35,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x33,0x36,0x07,0x75,0x6e,0x69,0x32,0x37,0x33,0x37,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x33,0x38,0x07,0x75,0x6e,0x69,0x32,0x37,0x33,0x39,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x33,0x41,0x07,0x75,0x6e,0x69,0x32,0x37,0x33,0x42,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x33,0x43,0x07,0x75,0x6e,0x69,0x32,0x37,0x33,0x44,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x33,0x45,0x07,0x75,0x6e,0x69,0x32,0x37,0x33,0x46,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x34,0x30,0x07,0x75,0x6e,0x69,0x32,0x37,0x34,0x31,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x34,0x32,0x07,0x75,0x6e,0x69,0x32,0x37,0x34,0x33,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x34,0x34,0x07,0x75,0x6e,0x69,0x32,0x37,0x34,0x35,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x34,0x36,0x07,0x75,0x6e,0x69,0x32,0x37,0x34,0x37,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x34,0x38,0x07,0x75,0x6e,0x69,0x32,0x37,0x34,0x39,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x34,0x41,0x07,0x75,0x6e,0x69,0x32,0x37,0x34,0x42,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x34,0x44,0x07,0x75,0x6e,0x69,0x32,0x37,0x34,0x46,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x35,0x30,0x07,0x75,0x6e,0x69,0x32,0x37,0x35,0x31,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x35,0x32,0x07,0x75,0x6e,0x69,0x32,0x37,0x35,0x36,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x35,0x38,0x07,0x75,0x6e,0x69,0x32,0x37,0x35,0x39,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x35,0x41,0x07,0x75,0x6e,0x69,0x32,0x37,0x35,0x42,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x35,0x43,0x07,0x75,0x6e,0x69,0x32,0x37,0x35,0x44,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x35,0x45,0x07,0x75,0x6e,0x69,0x32,0x37,0x36,0x31,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x36,0x32,0x07,0x75,0x6e,0x69,0x32,0x37,0x36,0x33,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x36,0x34,0x07,0x75,0x6e,0x69,0x32,0x37,0x36,0x35,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x36,0x36,0x07,0x75,0x6e,0x69,0x32,0x37,0x36,0x37,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x36,0x38,0x07,0x75,0x6e,0x69,0x32,0x37,0x36,0x39,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x36,0x41,0x07,0x75,0x6e,0x69,0x32,0x37,0x36,0x42,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x36,0x43,0x07,0x75,0x6e,0x69,0x32,0x37,0x36,0x44,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x36,0x45,0x07,0x75,0x6e,0x69,0x32,0x37,0x36,0x46,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x37,0x30,0x07,0x75,0x6e,0x69,0x32,0x37,0x37,0x31,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x37,0x32,0x07,0x75,0x6e,0x69,0x32,0x37,0x37,0x33,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x37,0x34,0x07,0x75,0x6e,0x69,0x32,0x37,0x37,0x35,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x37,0x36,0x07,0x75,0x6e,0x69,0x32,0x37,0x37,0x37,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x37,0x38,0x07,0x75,0x6e,0x69,0x32,0x37,0x37,0x39,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x37,0x41,0x07,0x75,0x6e,0x69,0x32,0x37,0x37,0x42,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x37,0x43,0x07,0x75,0x6e,0x69,0x32,0x37,0x37,0x44,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x37,0x45,0x07,0x75,0x6e,0x69,0x32,0x37,0x37,0x46,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x38,0x30,0x07,0x75,0x6e,0x69,0x32,0x37,0x38,0x31,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x38,0x32,0x07,0x75,0x6e,0x69,0x32,0x37,0x38,0x33,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x38,0x34,0x07,0x75,0x6e,0x69,0x32,0x37,0x38,0x35,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x38,0x36,0x07,0x75,0x6e,0x69,0x32,0x37,0x38,0x37,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x38,0x38,0x07,0x75,0x6e,0x69,0x32,0x37,0x38,0x39,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x38,0x41,0x07,0x75,0x6e,0x69,0x32,0x37,0x38,0x42,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x38,0x43,0x07,0x75,0x6e,0x69,0x32,0x37,0x38,0x44,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x38,0x45,0x07,0x75,0x6e,0x69,0x32,0x37,0x38,0x46,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x39,0x30,0x07,0x75,0x6e,0x69,0x32,0x37,0x39,0x31,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x39,0x32,0x07,0x75,0x6e,0x69,0x32,0x37,0x39,0x33,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x39,0x34,0x07,0x75,0x6e,0x69,0x32,0x37,0x39,0x38,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x39,0x39,0x07,0x75,0x6e,0x69,0x32,0x37,0x39,0x41,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x39,0x42,0x07,0x75,0x6e,0x69,0x32,0x37,0x39,0x43,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x39,0x44,0x07,0x75,0x6e,0x69,0x32,0x37,0x39,0x45,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x39,0x46,0x07,0x75,0x6e,0x69,0x32,0x37,0x41,0x30,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x41,0x31,0x07,0x75,0x6e,0x69,0x32,0x37,0x41,0x32,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x41,0x33,0x07,0x75,0x6e,0x69,0x32,0x37,0x41,0x34,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x41,0x35,0x07,0x75,0x6e,0x69,0x32,0x37,0x41,0x36,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x41,0x37,0x07,0x75,0x6e,0x69,0x32,0x37,0x41,0x38,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x41,0x39,0x07,0x75,0x6e,0x69,0x32,0x37,0x41,0x41,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x41,0x42,0x07,0x75,0x6e,0x69,0x32,0x37,0x41,0x43,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x41,0x44,0x07,0x75,0x6e,0x69,0x32,0x37,0x41,0x45,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x41,0x46,0x07,0x75,0x6e,0x69,0x32,0x37,0x42,0x31,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x42,0x32,0x07,0x75,0x6e,0x69,0x32,0x37,0x42,0x33,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x42,0x34,0x07,0x75,0x6e,0x69,0x32,0x37,0x42,0x35,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x42,0x36,0x07,0x75,0x6e,0x69,0x32,0x37,0x42,0x37,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x42,0x38,0x07,0x75,0x6e,0x69,0x32,0x37,0x42,0x39,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x42,0x41,0x07,0x75,0x6e,0x69,0x32,0x37,0x42,0x42,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x42,0x43,0x07,0x75,0x6e,0x69,0x32,0x37,0x42,0x44,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x42,0x45,0x07,0x75,0x6e,0x69,0x32,0x37,0x45,0x30,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x45,0x38,0x07,0x75,0x6e,0x69,0x32,0x37,0x45,0x39,0x07,0x75,0x6e,0x69,0x32,0x37,
-0x45,0x41,0x07,0x75,0x6e,0x69,0x32,0x37,0x45,0x42,0x07,0x75,0x6e,0x69,0x32,0x39,
-0x45,0x42,0x07,0x75,0x6e,0x69,0x32,0x41,0x30,0x43,0x07,0x75,0x6e,0x69,0x32,0x41,
-0x30,0x44,0x07,0x75,0x6e,0x69,0x32,0x41,0x30,0x45,0x07,0x75,0x6e,0x69,0x32,0x42,
-0x31,0x32,0x07,0x75,0x6e,0x69,0x32,0x42,0x31,0x33,0x07,0x75,0x6e,0x69,0x45,0x30,
-0x30,0x30,0x07,0x75,0x6e,0x69,0x45,0x30,0x30,0x31,0x07,0x75,0x6e,0x69,0x45,0x30,
-0x30,0x32,0x07,0x75,0x6e,0x69,0x45,0x30,0x30,0x33,0x07,0x75,0x6e,0x69,0x45,0x30,
-0x30,0x34,0x07,0x75,0x6e,0x69,0x45,0x30,0x30,0x35,0x07,0x75,0x6e,0x69,0x45,0x30,
-0x30,0x36,0x07,0x75,0x6e,0x69,0x45,0x30,0x30,0x37,0x07,0x75,0x6e,0x69,0x45,0x30,
-0x30,0x38,0x07,0x75,0x6e,0x69,0x45,0x30,0x30,0x39,0x07,0x75,0x6e,0x69,0x45,0x30,
-0x30,0x41,0x07,0x75,0x6e,0x69,0x45,0x30,0x30,0x42,0x07,0x75,0x6e,0x69,0x45,0x30,
-0x30,0x43,0x07,0x75,0x6e,0x69,0x45,0x30,0x30,0x44,0x07,0x75,0x6e,0x69,0x45,0x30,
-0x30,0x45,0x07,0x75,0x6e,0x69,0x45,0x30,0x30,0x46,0x07,0x75,0x6e,0x69,0x45,0x30,
-0x31,0x30,0x07,0x75,0x6e,0x69,0x45,0x30,0x31,0x31,0x07,0x75,0x6e,0x69,0x45,0x30,
-0x31,0x32,0x07,0x75,0x6e,0x69,0x45,0x30,0x31,0x33,0x07,0x75,0x6e,0x69,0x45,0x30,
-0x31,0x34,0x07,0x75,0x6e,0x69,0x46,0x42,0x30,0x30,0x07,0x75,0x6e,0x69,0x46,0x42,
-0x30,0x33,0x07,0x75,0x6e,0x69,0x46,0x42,0x30,0x34,0x07,0x75,0x6e,0x69,0x46,0x42,
-0x30,0x35,0x07,0x75,0x6e,0x69,0x46,0x42,0x30,0x36,0x07,0x75,0x6e,0x69,0x46,0x42,
-0x31,0x33,0x07,0x75,0x6e,0x69,0x46,0x42,0x31,0x34,0x07,0x75,0x6e,0x69,0x46,0x42,
-0x31,0x35,0x07,0x75,0x6e,0x69,0x46,0x42,0x31,0x36,0x07,0x75,0x6e,0x69,0x46,0x42,
-0x31,0x37,0x07,0x75,0x6e,0x69,0x46,0x42,0x35,0x32,0x07,0x75,0x6e,0x69,0x46,0x42,
-0x35,0x33,0x07,0x75,0x6e,0x69,0x46,0x42,0x35,0x34,0x07,0x75,0x6e,0x69,0x46,0x42,
-0x35,0x35,0x07,0x75,0x6e,0x69,0x46,0x42,0x35,0x36,0x07,0x75,0x6e,0x69,0x46,0x42,
-0x35,0x37,0x07,0x75,0x6e,0x69,0x46,0x42,0x35,0x38,0x07,0x75,0x6e,0x69,0x46,0x42,
-0x35,0x39,0x07,0x75,0x6e,0x69,0x46,0x42,0x35,0x41,0x07,0x75,0x6e,0x69,0x46,0x42,
-0x35,0x42,0x07,0x75,0x6e,0x69,0x46,0x42,0x35,0x43,0x07,0x75,0x6e,0x69,0x46,0x42,
-0x35,0x44,0x07,0x75,0x6e,0x69,0x46,0x42,0x35,0x45,0x07,0x75,0x6e,0x69,0x46,0x42,
-0x35,0x46,0x07,0x75,0x6e,0x69,0x46,0x42,0x36,0x30,0x07,0x75,0x6e,0x69,0x46,0x42,
-0x36,0x31,0x07,0x75,0x6e,0x69,0x46,0x42,0x36,0x32,0x07,0x75,0x6e,0x69,0x46,0x42,
-0x36,0x33,0x07,0x75,0x6e,0x69,0x46,0x42,0x36,0x34,0x07,0x75,0x6e,0x69,0x46,0x42,
-0x36,0x35,0x07,0x75,0x6e,0x69,0x46,0x42,0x36,0x36,0x07,0x75,0x6e,0x69,0x46,0x42,
-0x36,0x37,0x07,0x75,0x6e,0x69,0x46,0x42,0x36,0x38,0x07,0x75,0x6e,0x69,0x46,0x42,
-0x36,0x39,0x07,0x75,0x6e,0x69,0x46,0x42,0x36,0x41,0x07,0x75,0x6e,0x69,0x46,0x42,
-0x36,0x42,0x07,0x75,0x6e,0x69,0x46,0x42,0x36,0x43,0x07,0x75,0x6e,0x69,0x46,0x42,
-0x36,0x44,0x07,0x75,0x6e,0x69,0x46,0x42,0x36,0x45,0x07,0x75,0x6e,0x69,0x46,0x42,
-0x36,0x46,0x07,0x75,0x6e,0x69,0x46,0x42,0x37,0x30,0x07,0x75,0x6e,0x69,0x46,0x42,
-0x37,0x31,0x07,0x75,0x6e,0x69,0x46,0x42,0x37,0x32,0x07,0x75,0x6e,0x69,0x46,0x42,
-0x37,0x33,0x07,0x75,0x6e,0x69,0x46,0x42,0x37,0x34,0x07,0x75,0x6e,0x69,0x46,0x42,
-0x37,0x35,0x07,0x75,0x6e,0x69,0x46,0x42,0x37,0x36,0x07,0x75,0x6e,0x69,0x46,0x42,
-0x37,0x37,0x07,0x75,0x6e,0x69,0x46,0x42,0x37,0x38,0x07,0x75,0x6e,0x69,0x46,0x42,
-0x37,0x39,0x07,0x75,0x6e,0x69,0x46,0x42,0x37,0x41,0x07,0x75,0x6e,0x69,0x46,0x42,
-0x37,0x42,0x07,0x75,0x6e,0x69,0x46,0x42,0x37,0x43,0x07,0x75,0x6e,0x69,0x46,0x42,
-0x37,0x44,0x07,0x75,0x6e,0x69,0x46,0x42,0x37,0x45,0x07,0x75,0x6e,0x69,0x46,0x42,
-0x37,0x46,0x07,0x75,0x6e,0x69,0x46,0x42,0x38,0x30,0x07,0x75,0x6e,0x69,0x46,0x42,
-0x38,0x31,0x07,0x75,0x6e,0x69,0x46,0x42,0x38,0x41,0x07,0x75,0x6e,0x69,0x46,0x42,
-0x38,0x42,0x07,0x75,0x6e,0x69,0x46,0x42,0x38,0x43,0x07,0x75,0x6e,0x69,0x46,0x42,
-0x38,0x44,0x07,0x75,0x6e,0x69,0x46,0x42,0x38,0x45,0x07,0x75,0x6e,0x69,0x46,0x42,
-0x38,0x46,0x07,0x75,0x6e,0x69,0x46,0x42,0x39,0x30,0x07,0x75,0x6e,0x69,0x46,0x42,
-0x39,0x31,0x07,0x75,0x6e,0x69,0x46,0x42,0x39,0x32,0x07,0x75,0x6e,0x69,0x46,0x42,
-0x39,0x33,0x07,0x75,0x6e,0x69,0x46,0x42,0x39,0x34,0x07,0x75,0x6e,0x69,0x46,0x42,
-0x39,0x35,0x07,0x75,0x6e,0x69,0x46,0x42,0x39,0x45,0x07,0x75,0x6e,0x69,0x46,0x42,
-0x39,0x46,0x07,0x75,0x6e,0x69,0x46,0x42,0x45,0x38,0x07,0x75,0x6e,0x69,0x46,0x42,
-0x45,0x39,0x07,0x75,0x6e,0x69,0x46,0x42,0x46,0x43,0x07,0x75,0x6e,0x69,0x46,0x42,
-0x46,0x44,0x07,0x75,0x6e,0x69,0x46,0x42,0x46,0x45,0x07,0x75,0x6e,0x69,0x46,0x42,
-0x46,0x46,0x07,0x75,0x6e,0x69,0x46,0x45,0x37,0x30,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x37,0x31,0x07,0x75,0x6e,0x69,0x46,0x45,0x37,0x32,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x37,0x33,0x07,0x75,0x6e,0x69,0x46,0x45,0x37,0x34,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x37,0x36,0x07,0x75,0x6e,0x69,0x46,0x45,0x37,0x37,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x37,0x38,0x07,0x75,0x6e,0x69,0x46,0x45,0x37,0x39,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x37,0x41,0x07,0x75,0x6e,0x69,0x46,0x45,0x37,0x42,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x37,0x43,0x07,0x75,0x6e,0x69,0x46,0x45,0x37,0x44,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x37,0x45,0x07,0x75,0x6e,0x69,0x46,0x45,0x37,0x46,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x38,0x30,0x07,0x75,0x6e,0x69,0x46,0x45,0x38,0x31,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x38,0x32,0x07,0x75,0x6e,0x69,0x46,0x45,0x38,0x33,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x38,0x34,0x07,0x75,0x6e,0x69,0x46,0x45,0x38,0x35,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x38,0x36,0x07,0x75,0x6e,0x69,0x46,0x45,0x38,0x37,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x38,0x38,0x07,0x75,0x6e,0x69,0x46,0x45,0x38,0x39,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x38,0x41,0x07,0x75,0x6e,0x69,0x46,0x45,0x38,0x42,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x38,0x43,0x07,0x75,0x6e,0x69,0x46,0x45,0x38,0x44,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x38,0x45,0x07,0x75,0x6e,0x69,0x46,0x45,0x38,0x46,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x39,0x30,0x07,0x75,0x6e,0x69,0x46,0x45,0x39,0x31,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x39,0x32,0x07,0x75,0x6e,0x69,0x46,0x45,0x39,0x33,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x39,0x34,0x07,0x75,0x6e,0x69,0x46,0x45,0x39,0x35,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x39,0x36,0x07,0x75,0x6e,0x69,0x46,0x45,0x39,0x37,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x39,0x38,0x07,0x75,0x6e,0x69,0x46,0x45,0x39,0x39,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x39,0x41,0x07,0x75,0x6e,0x69,0x46,0x45,0x39,0x42,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x39,0x43,0x07,0x75,0x6e,0x69,0x46,0x45,0x39,0x44,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x39,0x45,0x07,0x75,0x6e,0x69,0x46,0x45,0x39,0x46,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x41,0x30,0x07,0x75,0x6e,0x69,0x46,0x45,0x41,0x31,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x41,0x32,0x07,0x75,0x6e,0x69,0x46,0x45,0x41,0x33,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x41,0x34,0x07,0x75,0x6e,0x69,0x46,0x45,0x41,0x35,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x41,0x36,0x07,0x75,0x6e,0x69,0x46,0x45,0x41,0x37,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x41,0x38,0x07,0x75,0x6e,0x69,0x46,0x45,0x41,0x39,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x41,0x41,0x07,0x75,0x6e,0x69,0x46,0x45,0x41,0x42,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x41,0x43,0x07,0x75,0x6e,0x69,0x46,0x45,0x41,0x44,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x41,0x45,0x07,0x75,0x6e,0x69,0x46,0x45,0x41,0x46,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x42,0x30,0x07,0x75,0x6e,0x69,0x46,0x45,0x42,0x31,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x42,0x32,0x07,0x75,0x6e,0x69,0x46,0x45,0x42,0x33,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x42,0x34,0x07,0x75,0x6e,0x69,0x46,0x45,0x42,0x35,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x42,0x36,0x07,0x75,0x6e,0x69,0x46,0x45,0x42,0x37,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x42,0x38,0x07,0x75,0x6e,0x69,0x46,0x45,0x42,0x39,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x42,0x41,0x07,0x75,0x6e,0x69,0x46,0x45,0x42,0x42,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x42,0x43,0x07,0x75,0x6e,0x69,0x46,0x45,0x42,0x44,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x42,0x45,0x07,0x75,0x6e,0x69,0x46,0x45,0x42,0x46,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x43,0x30,0x07,0x75,0x6e,0x69,0x46,0x45,0x43,0x31,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x43,0x32,0x07,0x75,0x6e,0x69,0x46,0x45,0x43,0x33,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x43,0x34,0x07,0x75,0x6e,0x69,0x46,0x45,0x43,0x35,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x43,0x36,0x07,0x75,0x6e,0x69,0x46,0x45,0x43,0x37,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x43,0x38,0x07,0x75,0x6e,0x69,0x46,0x45,0x43,0x39,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x43,0x41,0x07,0x75,0x6e,0x69,0x46,0x45,0x43,0x42,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x43,0x43,0x07,0x75,0x6e,0x69,0x46,0x45,0x43,0x44,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x43,0x45,0x07,0x75,0x6e,0x69,0x46,0x45,0x43,0x46,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x44,0x30,0x07,0x75,0x6e,0x69,0x46,0x45,0x44,0x31,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x44,0x32,0x07,0x75,0x6e,0x69,0x46,0x45,0x44,0x33,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x44,0x34,0x07,0x75,0x6e,0x69,0x46,0x45,0x44,0x35,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x44,0x36,0x07,0x75,0x6e,0x69,0x46,0x45,0x44,0x37,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x44,0x38,0x07,0x75,0x6e,0x69,0x46,0x45,0x44,0x39,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x44,0x41,0x07,0x75,0x6e,0x69,0x46,0x45,0x44,0x42,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x44,0x43,0x07,0x75,0x6e,0x69,0x46,0x45,0x44,0x44,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x44,0x45,0x07,0x75,0x6e,0x69,0x46,0x45,0x44,0x46,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x45,0x30,0x07,0x75,0x6e,0x69,0x46,0x45,0x45,0x31,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x45,0x32,0x07,0x75,0x6e,0x69,0x46,0x45,0x45,0x33,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x45,0x34,0x07,0x75,0x6e,0x69,0x46,0x45,0x45,0x35,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x45,0x36,0x07,0x75,0x6e,0x69,0x46,0x45,0x45,0x37,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x45,0x38,0x07,0x75,0x6e,0x69,0x46,0x45,0x45,0x39,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x45,0x41,0x07,0x75,0x6e,0x69,0x46,0x45,0x45,0x42,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x45,0x43,0x07,0x75,0x6e,0x69,0x46,0x45,0x45,0x44,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x45,0x45,0x07,0x75,0x6e,0x69,0x46,0x45,0x45,0x46,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x46,0x30,0x07,0x75,0x6e,0x69,0x46,0x45,0x46,0x31,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x46,0x32,0x07,0x75,0x6e,0x69,0x46,0x45,0x46,0x33,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x46,0x34,0x07,0x75,0x6e,0x69,0x46,0x45,0x46,0x35,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x46,0x36,0x07,0x75,0x6e,0x69,0x46,0x45,0x46,0x37,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x46,0x38,0x07,0x75,0x6e,0x69,0x46,0x45,0x46,0x39,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x46,0x41,0x07,0x75,0x6e,0x69,0x46,0x45,0x46,0x42,0x07,0x75,0x6e,0x69,0x46,0x45,
-0x46,0x43,0x07,0x75,0x6e,0x69,0x46,0x45,0x46,0x46,0x07,0x75,0x6e,0x69,0x46,0x46,
-0x46,0x44,0x09,0x64,0x6c,0x4c,0x74,0x63,0x61,0x72,0x6f,0x6e,0x08,0x44,0x69,0x65,
-0x72,0x65,0x73,0x69,0x73,0x05,0x41,0x63,0x75,0x74,0x65,0x05,0x54,0x69,0x6c,0x64,
-0x65,0x05,0x47,0x72,0x61,0x76,0x65,0x0a,0x43,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,
-0x65,0x78,0x05,0x43,0x61,0x72,0x6f,0x6e,0x0c,0x75,0x6e,0x69,0x30,0x33,0x31,0x31,
-0x2e,0x63,0x61,0x73,0x65,0x05,0x42,0x72,0x65,0x76,0x65,0x09,0x44,0x6f,0x74,0x61,
-0x63,0x63,0x65,0x6e,0x74,0x0c,0x48,0x75,0x6e,0x67,0x61,0x72,0x75,0x6d,0x6c,0x61,
-0x75,0x74,0x0b,0x44,0x6f,0x75,0x62,0x6c,0x65,0x61,0x63,0x75,0x74,0x65,0x0a,0x61,
-0x72,0x61,0x62,0x69,0x63,0x5f,0x64,0x6f,0x74,0x0c,0x61,0x72,0x61,0x62,0x69,0x63,
-0x5f,0x32,0x64,0x6f,0x74,0x73,0x0c,0x61,0x72,0x61,0x62,0x69,0x63,0x5f,0x33,0x64,
-0x6f,0x74,0x73,0x0e,0x61,0x72,0x61,0x62,0x69,0x63,0x5f,0x33,0x64,0x6f,0x74,0x73,
-0x5f,0x61,0x0e,0x61,0x72,0x61,0x62,0x69,0x63,0x5f,0x32,0x64,0x6f,0x74,0x73,0x5f,
-0x61,0x0c,0x61,0x72,0x61,0x62,0x69,0x63,0x5f,0x34,0x64,0x6f,0x74,0x73,0x0c,0x75,
-0x6e,0x69,0x30,0x36,0x36,0x45,0x2e,0x66,0x69,0x6e,0x61,0x0c,0x75,0x6e,0x69,0x30,
-0x36,0x36,0x45,0x2e,0x69,0x6e,0x69,0x74,0x0c,0x75,0x6e,0x69,0x30,0x36,0x36,0x45,
-0x2e,0x6d,0x65,0x64,0x69,0x0c,0x75,0x6e,0x69,0x30,0x36,0x41,0x31,0x2e,0x66,0x69,
-0x6e,0x61,0x0c,0x75,0x6e,0x69,0x30,0x36,0x41,0x31,0x2e,0x69,0x6e,0x69,0x74,0x0c,
-0x75,0x6e,0x69,0x30,0x36,0x41,0x31,0x2e,0x6d,0x65,0x64,0x69,0x0c,0x75,0x6e,0x69,
-0x30,0x36,0x36,0x46,0x2e,0x66,0x69,0x6e,0x61,0x0c,0x75,0x6e,0x69,0x30,0x36,0x36,
-0x46,0x2e,0x69,0x6e,0x69,0x74,0x0c,0x75,0x6e,0x69,0x30,0x36,0x36,0x46,0x2e,0x6d,
-0x65,0x64,0x69,0x0c,0x75,0x6e,0x69,0x30,0x36,0x42,0x41,0x2e,0x69,0x6e,0x69,0x74,
-0x0c,0x75,0x6e,0x69,0x30,0x36,0x42,0x41,0x2e,0x6d,0x65,0x64,0x69,0x0b,0x61,0x72,
-0x61,0x62,0x69,0x63,0x5f,0x72,0x69,0x6e,0x67,0x0c,0x75,0x6e,0x69,0x30,0x36,0x37,
-0x43,0x2e,0x66,0x69,0x6e,0x61,0x0c,0x75,0x6e,0x69,0x30,0x36,0x37,0x43,0x2e,0x69,
-0x6e,0x69,0x74,0x0c,0x75,0x6e,0x69,0x30,0x36,0x37,0x43,0x2e,0x6d,0x65,0x64,0x69,
-0x0c,0x75,0x6e,0x69,0x30,0x36,0x37,0x44,0x2e,0x66,0x69,0x6e,0x61,0x0c,0x75,0x6e,
-0x69,0x30,0x36,0x37,0x44,0x2e,0x69,0x6e,0x69,0x74,0x0c,0x75,0x6e,0x69,0x30,0x36,
-0x37,0x44,0x2e,0x6d,0x65,0x64,0x69,0x0c,0x75,0x6e,0x69,0x30,0x36,0x38,0x31,0x2e,
-0x66,0x69,0x6e,0x61,0x0c,0x75,0x6e,0x69,0x30,0x36,0x38,0x31,0x2e,0x69,0x6e,0x69,
-0x74,0x0c,0x75,0x6e,0x69,0x30,0x36,0x38,0x31,0x2e,0x6d,0x65,0x64,0x69,0x0c,0x75,
-0x6e,0x69,0x30,0x36,0x38,0x32,0x2e,0x66,0x69,0x6e,0x61,0x0c,0x75,0x6e,0x69,0x30,
-0x36,0x38,0x32,0x2e,0x69,0x6e,0x69,0x74,0x0c,0x75,0x6e,0x69,0x30,0x36,0x38,0x32,
-0x2e,0x6d,0x65,0x64,0x69,0x0c,0x75,0x6e,0x69,0x30,0x36,0x38,0x35,0x2e,0x66,0x69,
-0x6e,0x61,0x0c,0x75,0x6e,0x69,0x30,0x36,0x38,0x35,0x2e,0x69,0x6e,0x69,0x74,0x0c,
-0x75,0x6e,0x69,0x30,0x36,0x38,0x35,0x2e,0x6d,0x65,0x64,0x69,0x0c,0x75,0x6e,0x69,
-0x30,0x36,0x42,0x46,0x2e,0x66,0x69,0x6e,0x61,0x0c,0x75,0x6e,0x69,0x30,0x36,0x42,
-0x46,0x2e,0x69,0x6e,0x69,0x74,0x0c,0x75,0x6e,0x69,0x30,0x36,0x42,0x46,0x2e,0x6d,
-0x65,0x64,0x69,0x0e,0x61,0x72,0x61,0x62,0x69,0x63,0x5f,0x67,0x61,0x66,0x5f,0x62,
-0x61,0x72,0x07,0x45,0x6e,0x67,0x2e,0x61,0x6c,0x74,0x0f,0x75,0x6e,0x69,0x30,0x32,
-0x36,0x38,0x2e,0x64,0x6f,0x74,0x6c,0x65,0x73,0x73,0x0f,0x75,0x6e,0x69,0x30,0x32,
-0x39,0x44,0x2e,0x64,0x6f,0x74,0x6c,0x65,0x73,0x73,0x0b,0x75,0x6e,0x69,0x30,0x33,
-0x30,0x38,0x30,0x33,0x30,0x34,0x0b,0x75,0x6e,0x69,0x30,0x33,0x30,0x34,0x30,0x33,
-0x30,0x38,0x0b,0x75,0x6e,0x69,0x30,0x33,0x30,0x37,0x30,0x33,0x30,0x34,0x0b,0x75,
-0x6e,0x69,0x30,0x33,0x30,0x38,0x30,0x33,0x30,0x31,0x0b,0x75,0x6e,0x69,0x30,0x33,
-0x30,0x38,0x30,0x33,0x30,0x30,0x0b,0x75,0x6e,0x69,0x30,0x33,0x30,0x34,0x30,0x33,
-0x30,0x31,0x0b,0x75,0x6e,0x69,0x30,0x33,0x30,0x34,0x30,0x33,0x30,0x30,0x0b,0x75,
-0x6e,0x69,0x30,0x33,0x30,0x33,0x30,0x33,0x30,0x34,0x0b,0x75,0x6e,0x69,0x30,0x33,
-0x30,0x38,0x30,0x33,0x30,0x43,0x0b,0x75,0x6e,0x69,0x30,0x33,0x30,0x33,0x30,0x33,
-0x30,0x38,0x0b,0x75,0x6e,0x69,0x30,0x33,0x30,0x43,0x30,0x33,0x30,0x37,0x0b,0x75,
-0x6e,0x69,0x30,0x33,0x30,0x33,0x30,0x33,0x30,0x31,0x0b,0x75,0x6e,0x69,0x30,0x33,
-0x30,0x32,0x30,0x33,0x30,0x31,0x0b,0x75,0x6e,0x69,0x30,0x33,0x30,0x32,0x30,0x33,
-0x30,0x30,0x0b,0x75,0x6e,0x69,0x30,0x33,0x30,0x32,0x30,0x33,0x30,0x33,0x0b,0x75,
-0x6e,0x69,0x30,0x33,0x30,0x36,0x30,0x33,0x30,0x33,0x0b,0x75,0x6e,0x69,0x30,0x33,
-0x30,0x36,0x30,0x33,0x30,0x31,0x0b,0x75,0x6e,0x69,0x30,0x33,0x30,0x36,0x30,0x33,
-0x30,0x30,0x0b,0x75,0x6e,0x69,0x30,0x33,0x30,0x36,0x30,0x33,0x30,0x39,0x0b,0x75,
-0x6e,0x69,0x30,0x33,0x30,0x32,0x30,0x33,0x30,0x39,0x0b,0x75,0x6e,0x69,0x30,0x33,
-0x30,0x31,0x30,0x33,0x30,0x37,0x00,0x00,0xb8,0x02,0x80,0x40,0xff,0xfb,0xfe,0x03,
-0xfa,0x14,0x03,0xf9,0x25,0x03,0xf8,0x32,0x03,0xf7,0x96,0x03,0xf6,0x0e,0x03,0xf5,
-0xfe,0x03,0xf4,0xfe,0x03,0xf3,0x25,0x03,0xf2,0x0e,0x03,0xf1,0x96,0x03,0xf0,0x25,
-0x03,0xef,0x8a,0x41,0x05,0xef,0xfe,0x03,0xee,0x96,0x03,0xed,0x96,0x03,0xec,0xfa,
-0x03,0xeb,0xfa,0x03,0xea,0xfe,0x03,0xe9,0x3a,0x03,0xe8,0x42,0x03,0xe7,0xfe,0x03,
-0xe6,0x32,0x03,0xe5,0xe4,0x53,0x05,0xe5,0x96,0x03,0xe4,0x8a,0x41,0x05,0xe4,0x53,
-0x03,0xe3,0xe2,0x2f,0x05,0xe3,0xfa,0x03,0xe2,0x2f,0x03,0xe1,0xfe,0x03,0xe0,0xfe,
-0x03,0xdf,0x32,0x03,0xde,0x14,0x03,0xdd,0x96,0x03,0xdc,0xfe,0x03,0xdb,0x12,0x03,
-0xda,0x7d,0x03,0xd9,0xbb,0x03,0xd8,0xfe,0x03,0xd6,0x8a,0x41,0x05,0xd6,0x7d,0x03,
-0xd5,0xd4,0x47,0x05,0xd5,0x7d,0x03,0xd4,0x47,0x03,0xd3,0xd2,0x1b,0x05,0xd3,0xfe,
-0x03,0xd2,0x1b,0x03,0xd1,0xfe,0x03,0xd0,0xfe,0x03,0xcf,0xfe,0x03,0xce,0xfe,0x03,
-0xcd,0x96,0x03,0xcc,0xcb,0x1e,0x05,0xcc,0xfe,0x03,0xcb,0x1e,0x03,0xca,0x32,0x03,
-0xc9,0xfe,0x03,0xc6,0x85,0x11,0x05,0xc6,0x1c,0x03,0xc5,0x16,0x03,0xc4,0xfe,0x03,
-0xc3,0xfe,0x03,0xc2,0xfe,0x03,0xc1,0xfe,0x03,0xc0,0xfe,0x03,0xbf,0xfe,0x03,0xbe,
-0xfe,0x03,0xbd,0xfe,0x03,0xbc,0xfe,0x03,0xbb,0xfe,0x03,0xba,0x11,0x03,0xb9,0x86,
-0x25,0x05,0xb9,0xfe,0x03,0xb8,0xb7,0xbb,0x05,0xb8,0xfe,0x03,0xb7,0xb6,0x5d,0x05,
-0xb7,0xbb,0x03,0xb7,0x80,0x04,0xb6,0xb5,0x25,0x05,0xb6,0x5d,0x40,0xff,0x03,0xb6,
-0x40,0x04,0xb5,0x25,0x03,0xb4,0xfe,0x03,0xb3,0x96,0x03,0xb2,0xfe,0x03,0xb1,0xfe,
-0x03,0xb0,0xfe,0x03,0xaf,0xfe,0x03,0xae,0x64,0x03,0xad,0x0e,0x03,0xac,0xab,0x25,
-0x05,0xac,0x64,0x03,0xab,0xaa,0x12,0x05,0xab,0x25,0x03,0xaa,0x12,0x03,0xa9,0x8a,
-0x41,0x05,0xa9,0xfa,0x03,0xa8,0xfe,0x03,0xa7,0xfe,0x03,0xa6,0xfe,0x03,0xa5,0x12,
-0x03,0xa4,0xfe,0x03,0xa3,0xa2,0x0e,0x05,0xa3,0x32,0x03,0xa2,0x0e,0x03,0xa1,0x64,
-0x03,0xa0,0x8a,0x41,0x05,0xa0,0x96,0x03,0x9f,0xfe,0x03,0x9e,0x9d,0x0c,0x05,0x9e,
-0xfe,0x03,0x9d,0x0c,0x03,0x9c,0x9b,0x19,0x05,0x9c,0x64,0x03,0x9b,0x9a,0x10,0x05,
-0x9b,0x19,0x03,0x9a,0x10,0x03,0x99,0x0a,0x03,0x98,0xfe,0x03,0x97,0x96,0x0d,0x05,
-0x97,0xfe,0x03,0x96,0x0d,0x03,0x95,0x8a,0x41,0x05,0x95,0x96,0x03,0x94,0x93,0x0e,
-0x05,0x94,0x28,0x03,0x93,0x0e,0x03,0x92,0xfa,0x03,0x91,0x90,0xbb,0x05,0x91,0xfe,
-0x03,0x90,0x8f,0x5d,0x05,0x90,0xbb,0x03,0x90,0x80,0x04,0x8f,0x8e,0x25,0x05,0x8f,
-0x5d,0x03,0x8f,0x40,0x04,0x8e,0x25,0x03,0x8d,0xfe,0x03,0x8c,0x8b,0x2e,0x05,0x8c,
-0xfe,0x03,0x8b,0x2e,0x03,0x8a,0x86,0x25,0x05,0x8a,0x41,0x03,0x89,0x88,0x0b,0x05,
-0x89,0x14,0x03,0x88,0x0b,0x03,0x87,0x86,0x25,0x05,0x87,0x64,0x03,0x86,0x85,0x11,
-0x05,0x86,0x25,0x03,0x85,0x11,0x03,0x84,0xfe,0x03,0x83,0x82,0x11,0x05,0x83,0xfe,
-0x03,0x82,0x11,0x03,0x81,0xfe,0x03,0x80,0xfe,0x03,0x7f,0xfe,0x03,0x40,0xff,0x7e,
-0x7d,0x7d,0x05,0x7e,0xfe,0x03,0x7d,0x7d,0x03,0x7c,0x64,0x03,0x7b,0x54,0x15,0x05,
-0x7b,0x25,0x03,0x7a,0xfe,0x03,0x79,0xfe,0x03,0x78,0x0e,0x03,0x77,0x0c,0x03,0x76,
-0x0a,0x03,0x75,0xfe,0x03,0x74,0xfa,0x03,0x73,0xfa,0x03,0x72,0xfa,0x03,0x71,0xfa,
-0x03,0x70,0xfe,0x03,0x6f,0xfe,0x03,0x6e,0xfe,0x03,0x6c,0x21,0x03,0x6b,0xfe,0x03,
-0x6a,0x11,0x42,0x05,0x6a,0x53,0x03,0x69,0xfe,0x03,0x68,0x7d,0x03,0x67,0x11,0x42,
-0x05,0x66,0xfe,0x03,0x65,0xfe,0x03,0x64,0xfe,0x03,0x63,0xfe,0x03,0x62,0xfe,0x03,
-0x61,0x3a,0x03,0x60,0xfa,0x03,0x5e,0x0c,0x03,0x5d,0xfe,0x03,0x5b,0xfe,0x03,0x5a,
-0xfe,0x03,0x59,0x58,0x0a,0x05,0x59,0xfa,0x03,0x58,0x0a,0x03,0x57,0x16,0x19,0x05,
-0x57,0x32,0x03,0x56,0xfe,0x03,0x55,0x54,0x15,0x05,0x55,0x42,0x03,0x54,0x15,0x03,
-0x53,0x01,0x10,0x05,0x53,0x18,0x03,0x52,0x14,0x03,0x51,0x4a,0x13,0x05,0x51,0xfe,
-0x03,0x50,0x0b,0x03,0x4f,0xfe,0x03,0x4e,0x4d,0x10,0x05,0x4e,0xfe,0x03,0x4d,0x10,
-0x03,0x4c,0xfe,0x03,0x4b,0x4a,0x13,0x05,0x4b,0xfe,0x03,0x4a,0x49,0x10,0x05,0x4a,
-0x13,0x03,0x49,0x1d,0x0d,0x05,0x49,0x10,0x03,0x48,0x0d,0x03,0x47,0xfe,0x03,0x46,
-0x96,0x03,0x45,0x96,0x03,0x44,0xfe,0x03,0x43,0x02,0x2d,0x05,0x43,0xfa,0x03,0x42,
-0xbb,0x03,0x41,0x4b,0x03,0x40,0xfe,0x03,0x3f,0xfe,0x03,0x3e,0x3d,0x12,0x05,0x3e,
-0x14,0x03,0x3d,0x3c,0x0f,0x05,0x3d,0x12,0x03,0x3c,0x3b,0x0d,0x05,0x3c,0x40,0xff,
-0x0f,0x03,0x3b,0x0d,0x03,0x3a,0xfe,0x03,0x39,0xfe,0x03,0x38,0x37,0x14,0x05,0x38,
-0xfa,0x03,0x37,0x36,0x10,0x05,0x37,0x14,0x03,0x36,0x35,0x0b,0x05,0x36,0x10,0x03,
-0x35,0x0b,0x03,0x34,0x1e,0x03,0x33,0x0d,0x03,0x32,0x31,0x0b,0x05,0x32,0xfe,0x03,
-0x31,0x0b,0x03,0x30,0x2f,0x0b,0x05,0x30,0x0d,0x03,0x2f,0x0b,0x03,0x2e,0x2d,0x09,
-0x05,0x2e,0x10,0x03,0x2d,0x09,0x03,0x2c,0x32,0x03,0x2b,0x2a,0x25,0x05,0x2b,0x64,
-0x03,0x2a,0x29,0x12,0x05,0x2a,0x25,0x03,0x29,0x12,0x03,0x28,0x27,0x25,0x05,0x28,
-0x41,0x03,0x27,0x25,0x03,0x26,0x25,0x0b,0x05,0x26,0x0f,0x03,0x25,0x0b,0x03,0x24,
-0xfe,0x03,0x23,0xfe,0x03,0x22,0x0f,0x03,0x21,0x01,0x10,0x05,0x21,0x12,0x03,0x20,
-0x64,0x03,0x1f,0xfa,0x03,0x1e,0x1d,0x0d,0x05,0x1e,0x64,0x03,0x1d,0x0d,0x03,0x1c,
-0x11,0x42,0x05,0x1c,0xfe,0x03,0x1b,0xfa,0x03,0x1a,0x42,0x03,0x19,0x11,0x42,0x05,
-0x19,0xfe,0x03,0x18,0x64,0x03,0x17,0x16,0x19,0x05,0x17,0xfe,0x03,0x16,0x01,0x10,
-0x05,0x16,0x19,0x03,0x15,0xfe,0x03,0x14,0xfe,0x03,0x13,0xfe,0x03,0x12,0x11,0x42,
-0x05,0x12,0xfe,0x03,0x11,0x02,0x2d,0x05,0x11,0x42,0x03,0x10,0x7d,0x03,0x0f,0x64,
-0x03,0x0e,0xfe,0x03,0x0d,0x0c,0x16,0x05,0x0d,0xfe,0x03,0x0c,0x01,0x10,0x05,0x0c,
-0x16,0x03,0x0b,0xfe,0x03,0x0a,0x10,0x03,0x09,0xfe,0x03,0x08,0x02,0x2d,0x05,0x08,
-0xfe,0x03,0x07,0x14,0x03,0x06,0x64,0x03,0x04,0x01,0x10,0x05,0x04,0xfe,0x03,0x40,
-0x15,0x03,0x02,0x2d,0x05,0x03,0xfe,0x03,0x02,0x01,0x10,0x05,0x02,0x2d,0x03,0x01,
-0x10,0x03,0x00,0xfe,0x03,0x01,0xb8,0x01,0x64,0x85,0x8d,0x01,0x2b,0x2b,0x2b,0x2b,
-0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,
-0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,
-0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,
-0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,
-0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,
-0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,
-0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,
-0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,
-0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,
-0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,
-0x2b,0x00,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,
-0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,
-0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,
-0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,
-0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,
-0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,
-0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,
-0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,
-0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,
-0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x1d,
-0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x06,0x00,0x75,0x01,0x80,
-0x00,0x06,0x01,0x3e,0x00,0x03,0x00,0x03,0x00,0x0a,0x00,0x05,0x00,0x04,0x00,0x0b,
-0x00,0x08,0x00,0x06,0x00,0x05,0x00,0x0a,0x00,0x09,0x00,0x0b,0x00,0x0b,0x00,0x0b,
-0x11,0x0b,0x00,0x0c,0x00,0x0c,0x1f,0x0b,0x00,0x0d,0x00,0x0d,0x00,0x0b,0x00,0x0e,
-0x00,0x0e,0x00,0x04,0x00,0x0f,0x00,0x0f,0x00,0x07,0x00,0x10,0x00,0x10,0x00,0x04,
-0x00,0x12,0x00,0x11,0x00,0x07,0x00,0x1c,0x00,0x13,0x00,0x03,0x00,0x1d,0x00,0x1d,
-0x00,0x07,0x00,0x1e,0x00,0x1e,0x00,0x0b,0x00,0x1f,0x00,0x1f,0x12,0x0b,0x00,0x20,
-0x00,0x20,0x00,0x0b,0x00,0x21,0x00,0x21,0x1e,0x0b,0x00,0x23,0x00,0x22,0x00,0x0b,
-0x00,0x3e,0x00,0x3e,0x12,0x0b,0x00,0x3f,0x00,0x3f,0x00,0x0b,0x00,0x40,0x00,0x40,
-0x1e,0x0b,0x00,0x43,0x00,0x41,0x00,0x0b,0x00,0x5e,0x00,0x5e,0x12,0x0b,0x00,0x5f,
-0x00,0x5f,0x00,0x0b,0x00,0x60,0x00,0x60,0x1e,0x0b,0x00,0x61,0x00,0x61,0x00,0x0b,
-0x00,0x62,0x00,0x62,0x00,0x07,0x00,0x63,0x00,0x63,0x00,0x0b,0x00,0x67,0x00,0x64,
-0x00,0x05,0x00,0x6b,0x00,0x68,0x00,0x0b,0x00,0x71,0x00,0x6d,0x00,0x0b,0x00,0x73,
-0x00,0x72,0x00,0x05,0x00,0x75,0x00,0x74,0x00,0x03,0x00,0x76,0x00,0x76,0x00,0x0b,
-0x00,0x7a,0x00,0x78,0x00,0x0b,0x00,0x7b,0x00,0x7b,0x00,0x03,0x00,0x81,0x00,0x7d,
-0x00,0x0b,0x00,0x99,0x00,0x99,0x00,0x0b,0x00,0xb9,0x00,0xb9,0x00,0x0b,0x02,0x6e,
-0x02,0x6d,0x00,0x0b,0x02,0x83,0x02,0x76,0x00,0x0b,0x02,0x93,0x02,0x86,0x00,0x0b,
-0x02,0x9f,0x02,0x99,0x00,0x0b,0x02,0xa2,0x02,0xa1,0x00,0x0b,0x02,0xf5,0x02,0xa3,
-0x80,0x0b,0x02,0xf7,0x02,0xf6,0x00,0x0b,0x02,0xfb,0x02,0xf8,0x80,0x0b,0x02,0xfd,
-0x02,0xfc,0x00,0x0b,0x03,0x01,0x02,0xff,0x00,0x0b,0x03,0x03,0x03,0x03,0x00,0x0b,
-0x03,0x6e,0x03,0x6e,0x00,0x0b,0x03,0xfe,0x03,0xfb,0x80,0x0b,0x04,0x00,0x03,0xff,
-0x00,0x0b,0x04,0xd5,0x04,0xd5,0x00,0x0b,0x04,0xd6,0x04,0xd6,0x00,0x07,0x04,0xd7,
-0x04,0xd7,0x80,0x02,0x04,0xfe,0x04,0xd8,0x00,0x01,0x05,0x09,0x04,0xff,0x80,0x02,
-0x05,0x13,0x05,0x0a,0x00,0x06,0x05,0x14,0x05,0x14,0x00,0x05,0x05,0x16,0x05,0x15,
-0x00,0x06,0x05,0x33,0x05,0x17,0x00,0x01,0x05,0x3d,0x05,0x34,0x00,0x03,0x07,0x2b,
-0x07,0x2b,0x00,0x0b,0x07,0x2f,0x07,0x2d,0x00,0x0b,0x07,0x3c,0x07,0x3a,0x00,0x0b,
-0x07,0x49,0x07,0x47,0x00,0x0b,0x07,0x59,0x07,0x57,0x00,0x0b,0x07,0x65,0x07,0x64,
-0x00,0x0b,0x07,0x70,0x07,0x66,0x00,0x0a,0x07,0x88,0x07,0x71,0x00,0x0b,0x07,0x8d,
-0x07,0x89,0x00,0x05,0x07,0x91,0x07,0x8e,0x00,0x0b,0x07,0x92,0x07,0x92,0x11,0x0b,
-0x07,0x93,0x07,0x93,0x1f,0x0b,0x07,0x9c,0x07,0x94,0x00,0x0b,0x07,0x9d,0x07,0x9d,
-0x00,0x07,0x07,0x9e,0x07,0x9e,0x11,0x0b,0x07,0x9f,0x07,0x9f,0x1f,0x0b,0x07,0xb7,
-0x07,0xa0,0x00,0x0b,0x07,0xb8,0x07,0xb8,0x00,0x03,0x07,0xbf,0x07,0xba,0x00,0x03,
-0x07,0xc1,0x07,0xc0,0x00,0x04,0x07,0xc2,0x07,0xc2,0x00,0x0b,0x07,0xc3,0x07,0xc3,
-0x11,0x0b,0x07,0xc4,0x07,0xc4,0x1f,0x0b,0x07,0xcf,0x07,0xc6,0x00,0x03,0x07,0xd1,
-0x07,0xd0,0x00,0x04,0x07,0xd2,0x07,0xd2,0x00,0x0b,0x07,0xd3,0x07,0xd3,0x11,0x0b,
-0x07,0xd4,0x07,0xd4,0x1f,0x0b,0x07,0xe7,0x07,0xd5,0x00,0x05,0x07,0xed,0x07,0xe8,
-0x00,0x0b,0x07,0xf4,0x07,0xf2,0x00,0x0b,0x07,0xfa,0x07,0xf7,0x00,0x0b,0x07,0xfc,
-0x07,0xfc,0x00,0x0b,0x07,0xff,0x07,0xff,0x00,0x05,0x08,0x00,0x08,0x00,0x00,0x0b,
-0x08,0x11,0x08,0x03,0x00,0x0b,0x08,0x82,0x08,0x36,0x00,0x0b,0x08,0x83,0x08,0x83,
-0x00,0x04,0x08,0x84,0x08,0x84,0x00,0x05,0x08,0xfd,0x08,0x85,0x00,0x0b,0x08,0xfe,
-0x08,0xfe,0x11,0x0b,0x08,0xff,0x08,0xff,0x1f,0x0b,0x09,0x00,0x09,0x00,0x11,0x0b,
-0x09,0x01,0x09,0x01,0x1f,0x0b,0x09,0x09,0x09,0x02,0x00,0x0b,0x09,0x0a,0x09,0x0a,
-0x11,0x0b,0x09,0x0b,0x09,0x0b,0x1f,0x0b,0x0a,0xf4,0x09,0x0c,0x00,0x0b,0x0b,0xe5,
-0x0b,0x16,0x00,0x01,0x0b,0xe6,0x0b,0xe6,0x00,0x02,0x0b,0xe7,0x0b,0xe7,0x00,0x01,
-0x0b,0xf3,0x0b,0xe9,0x80,0x00,0x0c,0x04,0x0b,0xfa,0x00,0x02,0x0c,0x17,0x0c,0x06,
-0x00,0x02,0xff,0xff,0xff,0xff,0x00,0x00};
diff --git a/client/gui/gui.cpp b/client/gui/gui.cpp
deleted file mode 100644
index 4bf7ac89..00000000
--- a/client/gui/gui.cpp
+++ /dev/null
@@ -1,1418 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
-/*
- Copyright (C) 2010 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-
-#include <limits.h>
-#include <stdlib.h>
-
-#include "gui.h"
-#include "screen.h"
-#include "utils.h"
-#include "debug.h"
-#include "red_pixmap_sw.h"
-#include "resource_provider.h"
-
-#include "CEGUISystem.h"
-#include "CEGUIWindowManager.h"
-#include "CEGUIWindow.h"
-#include "CEGUIFontManager.h"
-#include "CEGUIExceptions.h"
-#include "CEGUIScheme.h"
-#include "elements/CEGUIPushButton.h"
-#include "elements/CEGUIEditbox.h"
-#include "elements/CEGUITabControl.h"
-#include "elements/CEGUIListbox.h"
-#include "elements/CEGUIListboxTextItem.h"
-
-#define MAIN_GUI_WIDTH 640
-#define MAIN_GUI_HEIGHT 480
-#define BUTTON_WIDTH 90
-#define BUTTON_HEIGHT 22
-#define GUI_SPACE 10
-#define GUI_LABEL_WIDTH 65
-#define GUI_LABEL_HEIGHT 22
-#define GUI_PORT_WIDTH 50
-#define GUI_TEXT_BOX_HEIGHT GUI_LABEL_HEIGHT
-
-#define LOGIN_DIALOG_WIDTH 400
-#define LOGIN_DIALOG_HEIGHT 300
-#define LOGIN_DIALOG_V_START 150
-
-#define CONNECTING_DIALOG_WIDTH 400
-#define CONNECTING_DIALOG_HEIGHT 300
-
-#define MESSAGE_BOX_WIDTH 380
-#define MESSAGE_BOX_HEIGHT 150
-
-#define CONNECT_OPTION_DIALOG_WIDTH LOGIN_DIALOG_WIDTH
-#define CONNECT_OPTION_DIALOG_HEIGHT LOGIN_DIALOG_HEIGHT
-
-static inline void set_win_pos(CEGUI::Window* win, int x, int y)
-{
- win->setPosition(CEGUI::UVector2(cegui_absdim((float)x), cegui_absdim((float)y)));
-}
-
-static inline void set_win_size(CEGUI::Window* win, int width, int height)
-{
- win->setSize(CEGUI::UVector2(cegui_absdim((float)width), cegui_absdim((float)height)));
-}
-
-static void add_bottom_button(CEGUI::Window* parent, const char *str,
- CEGUI::SubscriberSlot subscriber,
- int& position)
-{
- CEGUI::Window* button = CEGUI::WindowManager::getSingleton().createWindow("TaharezLook/Button");
- int win_width = (int)parent->getWidth().asAbsolute(1);
- int win_height = (int)parent->getHeight().asAbsolute(1);
- int y_pos = win_height - BUTTON_HEIGHT - GUI_SPACE;
-
- position += BUTTON_WIDTH + GUI_SPACE;
- set_win_pos(button, win_width - position, y_pos);
- set_win_size(button, BUTTON_WIDTH, BUTTON_HEIGHT);
- button->setText(str);
- button->subscribeEvent(CEGUI::PushButton::EventClicked, subscriber);
- button->setInheritsAlpha(false);
- //button->setTooltipText("tool tip");
- parent->addChildWindow(button);
-}
-
-#ifdef GUI_DEMO
-
-class SampleTabFactory: public GUI::TabFactory {
-public:
-
- class MyListItem : public CEGUI::ListboxTextItem {
- public:
- MyListItem (const CEGUI::String& text)
- : CEGUI::ListboxTextItem(text)
- {
- setSelectionBrushImage("TaharezLook", "MultiListSelectionBrush");
- }
- };
-
- class SampleTab: public GUI::Tab {
- public:
- SampleTab(int id, int width, int height)
- {
- string_printf(_name, "SampleTab-%d", id);
- CEGUI::WindowManager& winMgr = CEGUI::WindowManager::getSingleton();
- _root_window = winMgr.createWindow("TaharezLook/StaticText");
- set_win_pos(_root_window, 0, 0);
- set_win_size(_root_window, width, height);
- _root_window->setText("Tab of SampleTabFactory");
-
- if (id != 1) {
- return;
- }
-
- _list = (CEGUI::Listbox*)winMgr.createWindow("TaharezLook/Listbox");
- set_win_pos(_list, 10, 10);
- set_win_size(_list, 200, 100);
- _list->setMultiselectEnabled(false);
- _list->addItem(new MyListItem("Item-1"));
- _list->addItem(new MyListItem("Item-2"));
- _list->addItem(new MyListItem("Item-3"));
- _list->addItem(new MyListItem("Item-4"));
- _list->addItem(new MyListItem("Item-5"));
- _list->addItem(new MyListItem("Item-6"));
-
- _list->subscribeEvent(CEGUI::Listbox::EventSelectionChanged,
- CEGUI::Event::Subscriber(&SampleTab::handle_list_selection,
- this));
-
- _root_window->addChildWindow(_list);
-
- _label = winMgr.createWindow("TaharezLook/StaticText");
- set_win_pos(_label, 220, 10);
- set_win_size(_label, 200, 22);
- _root_window->addChildWindow(_label);
-
- _list->setItemSelectState((size_t)0, true);
-
- }
-
- virtual ~SampleTab()
- {
- CEGUI::WindowManager::getSingleton().destroyWindow(_root_window);
- }
-
- virtual CEGUI::Window& get_root_window()
- {
- return *_root_window;
- }
-
- virtual const std::string& get_name()
- {
- return _name;
- }
-
- bool handle_list_selection(const CEGUI::EventArgs& e)
- {
- DBG(0, "changed");
- CEGUI::ListboxItem* selection = _list->getFirstSelectedItem();
- if (selection) {
- _label->setText(selection->getText());
- return true;
- }
-
- if (_list->getItemCount()) {
- _list->setItemSelectState((size_t)_list->getItemCount() - 1, true);
- }
-
- return true;
- }
-
- private:
- std::string _name;
- CEGUI::Window* _root_window;
- CEGUI::Listbox* _list;
- CEGUI::Window* _label;
- };
-
- SampleTabFactory(int id)
- : GUI::TabFactory(id)
- , _id (id)
- {
- }
-
- GUI::Tab* create_tab(bool connected, int width, int height)
- {
- if (!connected && _id % 2 == 0) {
- return NULL;
- }
- return new SampleTab(_id, width, height);
- }
-
-private:
- int _id;
-};
-
-#endif
-
-class GUI::Dialog {
-public:
- Dialog(GUI& gui, bool close_on_message_click = false)
- : _gui (gui)
- , _root (NULL)
- , _message_box (NULL)
- , _box_response (NULL)
- , _close_on_message_click (close_on_message_click)
- {
- }
-
- virtual ~Dialog()
- {
- if (gui_system().getGUISheet() == _root) {
- gui_system().setGUISheet(NULL);
- }
-
- CEGUI::WindowManager::getSingleton().destroyWindow(_root);
- }
-
- CEGUI::Window& root_window() { return *_root;}
- Application& application() { return _gui.get_application();}
- CEGUI::System& gui_system() { return _gui.gui_system();}
-
- void set_dialog(Dialog* dialog) { _gui.set_dialog(dialog);}
- void dettach() { _gui.dettach_dialog(this);}
- TabFactorys& get_factoris() { return _gui._tab_factorys;}
-
- bool message_box(MessageType type, const char *text, const ButtonsList& buttons,
- BoxResponse* response_handler);
- void error_box(const char* error_message);
-
- void pre_destroy();
-
-private:
- void handle_message_click(int id);
- void set_opaque(CEGUI::Window* win);
-
- void dim();
- void undim();
-
-protected:
- GUI& _gui;
- CEGUI::Window* _root;
-
-private:
- class BottonAction {
- public:
- BottonAction(Dialog& dialog, int id)
- : _dialog (dialog)
- , _id (id)
- {
- }
-
- bool operator () (const CEGUI::EventArgs& e)
- {
- _dialog.handle_message_click(_id);
- return true;
- }
-
- private:
- Dialog& _dialog;
- int _id;
- };
-
- CEGUI::Window* _message_box;
- BoxResponse* _box_response;
-
- class UndimInfo {
- public:
- UndimInfo(const CEGUI::String& name, float alpha, bool inherits)
- : _name (name)
- , _alpha (alpha)
- , _inherits (inherits)
- {
- }
-
- void restore()
- {
- try {
- CEGUI::Window* win = CEGUI::WindowManager::getSingleton().getWindow(_name);
- win->setAlpha(_alpha);
- win->setInheritsAlpha(_inherits);
- } catch (...) {
- }
- }
-
- private:
- CEGUI::String _name;
- float _alpha;
- bool _inherits;
-
- };
-
- std::list<UndimInfo*> _undim_info_list;
- bool _close_on_message_click;
-};
-
-
-void GUI::Dialog::set_opaque(CEGUI::Window* win)
-{
- float alpha = win->getAlpha();
- bool inherits = win->inheritsAlpha();
-
- if (alpha != 1 || !inherits ) {
- _undim_info_list.push_back(new UndimInfo(win->getName(), alpha, inherits));
- win->setInheritsAlpha(true);
- win->setAlpha(1);
- }
-
- size_t child_count = win->getChildCount();
- for (size_t i = 0; i < child_count; ++i) {
- CEGUI::Window* child = win->getChildAtIdx(i);
- set_opaque(child);
- }
-}
-
-void GUI::Dialog::dim()
-{
- set_opaque(_root);
- _root->setAlpha(0.5);
-}
-
-void GUI::Dialog::undim()
-{
- while (!_undim_info_list.empty()) {
- UndimInfo* inf = _undim_info_list.front();
- _undim_info_list.pop_front();
- inf->restore();
- delete inf;
- }
- _root->setAlpha(1);
-}
-
-bool GUI::Dialog::message_box(MessageType type, const char *text, const ButtonsList& buttons,
- BoxResponse* response_handler)
-{
- if (_message_box) {
- return false;
- }
-
- try {
- CEGUI::WindowManager& winMgr = CEGUI::WindowManager::getSingleton();
-
- CEGUI::Window* wnd = _message_box = winMgr.createWindow("TaharezLook/StaticText");
- int x_pos = (MAIN_GUI_WIDTH - MESSAGE_BOX_WIDTH) / 2;
- int y_pos = (MAIN_GUI_HEIGHT - MESSAGE_BOX_HEIGHT) / 3;
- set_win_pos(wnd, x_pos, y_pos);
- set_win_size(wnd, MESSAGE_BOX_WIDTH, MESSAGE_BOX_HEIGHT);
- wnd->setModalState(true);
- wnd->setInheritsAlpha(false);
- dim();
- _root->addChildWindow(wnd);
-
- CEGUI::Window* text_wnd = winMgr.createWindow("TaharezLook/StaticText");
- set_win_pos(text_wnd, GUI_SPACE, GUI_SPACE);
- set_win_size(text_wnd, MESSAGE_BOX_WIDTH - 2 * GUI_SPACE,
- MESSAGE_BOX_HEIGHT - 3 * GUI_SPACE - BUTTON_HEIGHT);
- text_wnd->setProperty("FrameEnabled", "false");
- text_wnd->setProperty("HorzFormatting", "WordWrapLeftAligned");
- text_wnd->setProperty("VertFormatting", "TopAligned");
- text_wnd->setText(text);
- //text_wnd->getTextRenderArea();
- wnd->addChildWindow(text_wnd);
-
- x_pos = 0;
-
- for (unsigned int i = 0; i < buttons.size(); i++) {
- add_bottom_button(wnd, buttons[i].text,
- CEGUI::Event::Subscriber(BottonAction(*this, buttons[i].id)),
- x_pos);
- }
-
- _box_response = response_handler;
- } catch (CEGUI::Exception& e) {
- LOG_ERROR("Exception: %s", e.getMessage().c_str());
- throw;
- }
-
- return true;
-}
-
-class BoxResponseEvent: public Event {
-public:
- BoxResponseEvent(GUI::BoxResponse* box_response, int id)
- : _box_response (box_response)
- , _id (id)
- {
- }
-
- virtual void response(AbstractProcessLoop &events_loop)
- {
- _box_response->response(_id);
- }
-
-private:
- GUI::BoxResponse* _box_response;
- int _id;
-};
-
-class BoxAbortEvent: public Event {
-public:
- BoxAbortEvent(GUI::BoxResponse* box_response)
- : _box_response (box_response)
- {
- }
-
- virtual void response(AbstractProcessLoop &events_loop)
- {
- _box_response->aborted();
- }
-
-private:
- GUI::BoxResponse* _box_response;
-};
-
-void GUI::Dialog::handle_message_click(int id)
-{
- DBG(0, "");
- ASSERT(_message_box);
- _message_box->setModalState(false);
- _root->removeChildWindow(_message_box);
- CEGUI::Window *win = _message_box;
- _message_box = NULL;
- CEGUI::WindowManager::getSingleton().destroyWindow(win);
- undim();
- if (_box_response) {
- AutoRef<BoxResponseEvent> event(new BoxResponseEvent(_box_response, id));
- _box_response = NULL;
- application().push_event(*event);
- }
-
-#ifdef USE_GUI
- if (_close_on_message_click) {
- application().hide_gui();
- }
-#endif
-}
-
-void GUI::Dialog::pre_destroy()
- {
- if (_box_response) {
- AutoRef<BoxAbortEvent> event(new BoxAbortEvent(_box_response));
- _box_response = NULL;
- application().push_event(*event);
- }
-}
-
-void GUI::Dialog::error_box(const char* message)
-{
- ASSERT(message && strlen(message) > 0);
- DBG(0, "%s", message);
- ButtonsList list(1);
- list[0].id = 0;
- list[0].text = res_get_string(STR_BUTTON_OK);
- message_box(INFO, message, list, NULL);
-}
-
-class TabDialog : public GUI::Dialog {
-public:
- TabDialog(GUI& gui, bool connected);
- virtual ~TabDialog();
-
-protected:
- CEGUI::Window* _main_win;
-
-private:
- typedef std::list<GUI::Tab*> Tabs;
- Tabs _tabs;
-};
-
-class MessageDialog : public GUI::Dialog {
-public:
- MessageDialog(GUI& gui);
- virtual ~MessageDialog() {}
-};
-
-class LoginDialog : public GUI::Dialog {
-public:
- LoginDialog(GUI& guip);
-
- bool handle_connect(const CEGUI::EventArgs& e);
- bool handle_quit(const CEGUI::EventArgs& e);
- bool handle_options(const CEGUI::EventArgs& e);
-
-private:
- static void set_port_text(CEGUI::Window* win, int port);
-
-private:
- CEGUI::Window* _host_box;
- CEGUI::Window* _port_box;
- CEGUI::Window* _sport_box;
- CEGUI::Window* _pass_box;
-};
-
-class PreLoginDialog: public TabDialog {
-public:
- PreLoginDialog(GUI& gui, LoginDialog* login_dialog);
- virtual ~PreLoginDialog() { delete _login_dialog;}
-
- bool handle_back(const CEGUI::EventArgs& e);
- bool handle_quit(const CEGUI::EventArgs& e);
-
-private:
- LoginDialog* _login_dialog;
-};
-
-PreLoginDialog::PreLoginDialog(GUI& gui, LoginDialog* login_dialog)
- : TabDialog(gui, false)
- , _login_dialog (login_dialog)
-{
- try {
-
- int position = 0;
- add_bottom_button(_main_win, res_get_string(STR_BUTTON_BACK),
- CEGUI::Event::Subscriber(&PreLoginDialog::handle_back, this),
- position);
- add_bottom_button(_main_win, res_get_string(STR_BUTTON_QUIT),
- CEGUI::Event::Subscriber(&PreLoginDialog::handle_quit, this),
- position);
-
- } catch (CEGUI::Exception& e) {
- LOG_ERROR("Exception: %s", e.getMessage().c_str());
- } catch (...) {
- throw;
- }
-}
-
-bool PreLoginDialog::handle_back(const CEGUI::EventArgs& e)
-{
- ASSERT(_login_dialog);
- LoginDialog* login_dialog = _login_dialog;
- _login_dialog = NULL;
- set_dialog(login_dialog);
- return true;
-}
-
-bool PreLoginDialog::handle_quit(const CEGUI::EventArgs& e)
-{
- DBG(0, "");
- application().quit();
- return true;
-}
-
-MessageDialog::MessageDialog(GUI& gui)
- : GUI::Dialog(gui, true)
-{
- try {
- CEGUI::WindowManager& winMgr = CEGUI::WindowManager::getSingleton();
- _root = winMgr.createWindow("DefaultWindow");
- set_win_size(_root, MAIN_GUI_WIDTH, MAIN_GUI_HEIGHT);
- } catch (CEGUI::Exception& e) {
- LOG_ERROR("Exception: %s", e.getMessage().c_str());
- throw;
- }
-}
-
-LoginDialog::LoginDialog(GUI& gui)
- : GUI::Dialog(gui)
-{
- try {
- CEGUI::WindowManager& winMgr = CEGUI::WindowManager::getSingleton();
- _root = winMgr.createWindow("DefaultWindow");
-
- CEGUI::Window* wnd = winMgr.createWindow("TaharezLook/StaticText");
- int x_pos = (MAIN_GUI_WIDTH - LOGIN_DIALOG_WIDTH) / 2;
- int y_pos = (MAIN_GUI_HEIGHT - LOGIN_DIALOG_HEIGHT) / 3;
- set_win_pos(wnd, x_pos, y_pos);
- set_win_size(wnd, LOGIN_DIALOG_WIDTH, LOGIN_DIALOG_HEIGHT);
- _root->addChildWindow(wnd);
-
- CEGUI::Window* host_label = winMgr.createWindow("TaharezLook/StaticText");
- host_label->setText(res_get_string(STR_LABEL_HOST));
- host_label->setProperty("FrameEnabled", "false");
- host_label->setProperty("BackgroundEnabled", "false");
- set_win_pos(host_label, GUI_SPACE, LOGIN_DIALOG_V_START);
- set_win_size(host_label, GUI_LABEL_WIDTH, GUI_LABEL_HEIGHT);
-
- wnd->addChildWindow(host_label);
-
- _host_box = winMgr.createWindow("TaharezLook/Editbox");
- set_win_pos(_host_box, GUI_LABEL_WIDTH + GUI_SPACE, LOGIN_DIALOG_V_START);
- int width = LOGIN_DIALOG_WIDTH - GUI_LABEL_WIDTH - 2 * GUI_SPACE;
- set_win_size(_host_box, width, GUI_LABEL_HEIGHT);
- _host_box->setText(application().get_host());
- wnd->addChildWindow(_host_box);
-
- CEGUI::Window* port_label = winMgr.createWindow("TaharezLook/StaticText");
- port_label->setText(res_get_string(STR_LABEL_PORT));
- port_label->setProperty("FrameEnabled", "false");
- port_label->setProperty("BackgroundEnabled", "false");
- y_pos = LOGIN_DIALOG_V_START + GUI_LABEL_HEIGHT + GUI_SPACE;
- set_win_pos(port_label, GUI_SPACE, y_pos);
- set_win_size(port_label, GUI_LABEL_WIDTH, GUI_LABEL_HEIGHT);
- wnd->addChildWindow(port_label);
-
- _port_box = winMgr.createWindow("TaharezLook/Editbox");
- set_win_pos(_port_box, GUI_SPACE + GUI_LABEL_WIDTH, y_pos);
- set_win_size(_port_box, GUI_PORT_WIDTH, GUI_TEXT_BOX_HEIGHT);
- set_port_text(_port_box, application().get_port());
- wnd->addChildWindow(_port_box);
-
- _sport_box = winMgr.createWindow("TaharezLook/Editbox");
- x_pos = LOGIN_DIALOG_WIDTH - GUI_SPACE - GUI_PORT_WIDTH;
- set_win_pos(_sport_box, x_pos, y_pos);
- set_win_size(_sport_box, GUI_PORT_WIDTH, GUI_TEXT_BOX_HEIGHT);
- set_port_text(_sport_box, application().get_sport());
- wnd->addChildWindow(_sport_box);
-
- CEGUI::Window* sport_label = winMgr.createWindow("TaharezLook/StaticText");
- sport_label->setText(res_get_string(STR_LABEL_SPORT));
- sport_label->setProperty("FrameEnabled", "false");
- sport_label->setProperty("BackgroundEnabled", "false");
- x_pos -= GUI_LABEL_WIDTH;
- set_win_pos(sport_label, x_pos, y_pos);
- set_win_size(sport_label, GUI_LABEL_WIDTH, GUI_LABEL_HEIGHT);
- wnd->addChildWindow(sport_label);
-
- CEGUI::Window* label = winMgr.createWindow("TaharezLook/StaticText");
- label->setText(res_get_string(STR_LABEL_PASSWORD));
- label->setProperty("FrameEnabled", "false");
- label->setProperty("BackgroundEnabled", "false");
- y_pos += GUI_LABEL_HEIGHT + GUI_SPACE;
- set_win_pos(label, GUI_SPACE, y_pos);
- set_win_size(label, GUI_LABEL_WIDTH, GUI_LABEL_HEIGHT);
- wnd->addChildWindow(label);
-
- _pass_box = winMgr.createWindow("TaharezLook/Editbox");
- x_pos = GUI_LABEL_WIDTH + GUI_SPACE;
- set_win_pos(_pass_box, x_pos, y_pos);
- width = LOGIN_DIALOG_WIDTH - GUI_LABEL_WIDTH - 2 * GUI_SPACE;
- set_win_size(_pass_box, width, GUI_TEXT_BOX_HEIGHT);
- ((CEGUI::Editbox*)_pass_box)->setTextMasked(true);
- ((CEGUI::Editbox*)_pass_box)->setMaskCodePoint(/*0x000026AB*/ 0x00002022 );
- _pass_box->setText(application().get_password().c_str());
- wnd->addChildWindow(_pass_box);
-
- x_pos = 0;
- add_bottom_button(wnd,
- res_get_string(STR_BUTTON_CONNECT),
- CEGUI::Event::Subscriber(&LoginDialog::handle_connect, this),
- x_pos);
- add_bottom_button(wnd,
- res_get_string(STR_BUTTON_QUIT),
- CEGUI::Event::Subscriber(&LoginDialog::handle_quit, this),
- x_pos);
- add_bottom_button(wnd,
- res_get_string(STR_BUTTON_OPTIONS),
- CEGUI::Event::Subscriber(&LoginDialog::handle_options, this),
- x_pos);
-
- } catch (CEGUI::Exception& e) {
- LOG_ERROR("Exception: %s", e.getMessage().c_str());
- throw;
- }
-}
-
-bool LoginDialog::handle_connect(const CEGUI::EventArgs& e)
-{
- const char* host_name = _host_box->getText().c_str();
-
- if (strlen(host_name) == 0) {
- error_box(res_get_string(STR_MESG_MISSING_HOST_NAME));
- return true;
- }
- int port = -1;
- int sport = -1;
-
- const char* port_str = _port_box->getText().c_str();
- if (strlen(port_str) != 0 && (port = str_to_port(port_str)) == -1) {
- error_box(res_get_string(STR_MESG_INVALID_PORT));
- return true;
- }
-
- const char* sport_str = _sport_box->getText().c_str();
- if (strlen(sport_str) != 0 && (sport = str_to_port(sport_str)) == -1) {
- error_box(res_get_string(STR_MESG_INVALID_SPORT));
- return true;
- }
-
- if (port == sport && port == -1) {
- error_box(res_get_string(STR_MESG_MISSING_PORT));
- return true;
- }
-
- DBG(0, "host %s port %d sport %d", host_name, port, sport);
- application().connect(host_name, port, sport, _pass_box->getText().c_str());
- return true;
-}
-
-bool LoginDialog::handle_quit(const CEGUI::EventArgs& e)
-{
- DBG(0, "");
- application().quit();
- return true;
-}
-
-bool LoginDialog::handle_options(const CEGUI::EventArgs& e)
-{
- dettach();
- set_dialog(new PreLoginDialog(_gui, this));
- return true;
-}
-
-void LoginDialog::set_port_text(CEGUI::Window* win, int port)
-{
- if (port == -1) {
- win->setText("");
- return;
- }
-
- char port_string[25];
- sprintf(port_string, "%d", port);
- win->setText(port_string);
-}
-
-class ConnectingDialog : public GUI::Dialog {
-public:
- ConnectingDialog(GUI& gui);
-
-private:
- bool handle_cancel(const CEGUI::EventArgs& e);
- bool handle_quit(const CEGUI::EventArgs& e);
-};
-
-bool ConnectingDialog::handle_cancel(const CEGUI::EventArgs& e)
-{
- DBG(0, "");
- application().disconnect();
- return true;
-}
-
-bool ConnectingDialog::handle_quit(const CEGUI::EventArgs& e)
-{
- DBG(0, "");
- application().quit();
- return true;
-}
-
-ConnectingDialog::ConnectingDialog(GUI& gui)
- : GUI::Dialog(gui)
-{
- try {
- CEGUI::WindowManager& winMgr = CEGUI::WindowManager::getSingleton();
- _root = winMgr.createWindow("DefaultWindow");
-
- CEGUI::Window* wnd = winMgr.createWindow("TaharezLook/StaticText");
- int x_pos = (MAIN_GUI_WIDTH - CONNECTING_DIALOG_WIDTH) / 2;
- int y_pos = (MAIN_GUI_HEIGHT - CONNECTING_DIALOG_HEIGHT) / 2;
- set_win_pos(wnd, x_pos, y_pos);
- set_win_size(wnd, CONNECTING_DIALOG_WIDTH, CONNECTING_DIALOG_HEIGHT);
- CEGUI::String text(res_get_string(STR_MESG_CONNECTING));
- wnd->setText(text + " " + application().get_host());
- wnd->setProperty("HorzFormatting", "LeftAligned");
- wnd->setProperty("VertFormatting", "TopAligned");
- _root->addChildWindow(wnd);
-
- x_pos = 0;
-
- add_bottom_button(wnd, res_get_string(STR_BUTTON_CANCEL),
- CEGUI::Event::Subscriber(&ConnectingDialog::handle_cancel, this),
- x_pos);
-
- if (_gui.is_disconnect_allowed()) {
- add_bottom_button(wnd, res_get_string(STR_BUTTON_QUIT),
- CEGUI::Event::Subscriber(&ConnectingDialog::handle_quit, this),
- x_pos);
- }
-
- } catch (CEGUI::Exception& e) {
- LOG_ERROR("Exception: %s", e.getMessage().c_str());
- throw;
- }
-}
-
-TabDialog::TabDialog(GUI& gui, bool connected)
- : GUI::Dialog(gui)
-{
- CEGUI::WindowManager& winMgr = CEGUI::WindowManager::getSingleton();
-
- try {
- _root = winMgr.createWindow("DefaultWindow");
-
- CEGUI::Window* wnd = _main_win = winMgr.createWindow("TaharezLook/StaticText");
- set_win_pos(wnd, 0, 0);
- set_win_size(wnd, MAIN_GUI_WIDTH, MAIN_GUI_HEIGHT);
- wnd->setAlpha(0.5);
- _root->addChildWindow(wnd);
-
- CEGUI::TabControl* tab_ctrl;
- tab_ctrl = static_cast<CEGUI::TabControl*>(winMgr.createWindow("TaharezLook/TabControl"));
- set_win_pos(tab_ctrl, GUI_SPACE, GUI_SPACE);
- int tab_width = MAIN_GUI_WIDTH - GUI_SPACE * 2;
- int tab_height = MAIN_GUI_HEIGHT - GUI_SPACE * 3 - BUTTON_HEIGHT;
- set_win_size(tab_ctrl, tab_width, tab_height);
- tab_ctrl->setInheritsAlpha(false);
- tab_ctrl->setTabHeight(cegui_absdim(22));
- tab_ctrl->setTabTextPadding(cegui_absdim(10));
- tab_height = (int)tab_ctrl->getTabHeight().asAbsolute(1);
- wnd->addChildWindow(tab_ctrl);
-
- GUI::TabFactorys& _tab_factorys = get_factoris();
- GUI::TabFactorys::iterator iter = _tab_factorys.begin();
-
- int tab_content_width = MAIN_GUI_WIDTH - GUI_SPACE * 4;
- int tab_content_height = MAIN_GUI_HEIGHT - GUI_SPACE * 5 - BUTTON_HEIGHT - tab_height;
-
- for (; iter != _tab_factorys.end(); iter++) {
-
- GUI::Tab* tab = (*iter)->create_tab(connected, tab_content_width,
- tab_content_height);
-
- if (!tab) {
- continue;
- }
-
- _tabs.push_front(tab);
- CEGUI::Window* gui_sheet = winMgr.createWindow("DefaultGUISheet");
- gui_sheet->setText(tab->get_name());
- set_win_pos(gui_sheet, GUI_SPACE, GUI_SPACE);
- set_win_size(gui_sheet, tab_content_width, tab_content_height);
- tab_ctrl->addTab(gui_sheet);
- CEGUI::Window& tab_window = tab->get_root_window();
- tab_window.setDestroyedByParent(false);
- gui_sheet->addChildWindow(&tab_window);
- }
-
- } catch (CEGUI::Exception& e) {
- LOG_ERROR("Exception: %s", e.getMessage().c_str());
- } catch (...) {
- throw;
- }
-}
-
-TabDialog::~TabDialog()
-{
- while (!_tabs.empty()) {
- GUI::Tab* tab = *_tabs.begin();
- _tabs.pop_front();
- delete tab;
- }
-}
-
-class SettingsDialog : public TabDialog {
-public:
- SettingsDialog(GUI& gui);
-
- bool handle_close(const CEGUI::EventArgs& e);
- bool handle_quit(const CEGUI::EventArgs& e);
- bool handle_disconnect(const CEGUI::EventArgs& e);
-};
-
-bool SettingsDialog::handle_close(const CEGUI::EventArgs& e)
-{
- DBG(0, "");
-#ifdef USE_GUI
- application().hide_gui();
-#endif
- return true;
-}
-
-bool SettingsDialog::handle_quit(const CEGUI::EventArgs& e)
-{
- DBG(0, "");
- application().quit();
- return true;
-}
-
-bool SettingsDialog::handle_disconnect(const CEGUI::EventArgs& e)
-{
- DBG(0, "");
- application().disconnect();
- return true;
-}
-
-SettingsDialog::SettingsDialog(GUI& gui)
- : TabDialog(gui, true)
-{
- try {
-
- int position = 0;
- add_bottom_button(_main_win, res_get_string(STR_BUTTON_CLOSE),
- CEGUI::Event::Subscriber(&SettingsDialog::handle_close, this),
- position);
- add_bottom_button(_main_win, res_get_string(STR_BUTTON_QUIT),
- CEGUI::Event::Subscriber(&SettingsDialog::handle_quit, this),
- position);
-
- if (_gui.is_disconnect_allowed()) {
- add_bottom_button(_main_win, res_get_string(STR_BUTTON_DISCONNECT),
- CEGUI::Event::Subscriber(&SettingsDialog::handle_disconnect, this),
- position);
- }
-
- } catch (CEGUI::Exception& e) {
- LOG_ERROR("Exception: %s", e.getMessage().c_str());
- } catch (...) {
- throw;
- }
-}
-
-GUI::GUI(Application& app, Application::State state)
- : ScreenLayer (SCREEN_LAYER_GUI, false)
- , _app (app)
- , _state (state)
- , _pixmap (new RedPixmapSw(MAIN_GUI_WIDTH, MAIN_GUI_HEIGHT, RedDrawable::RGB32, true, 0))
- , _renderer (new CEGUI::SoftRenderer(_pixmap->get_data(), MAIN_GUI_WIDTH, MAIN_GUI_HEIGHT,
- _pixmap->get_stride()))
- , _dialog (NULL)
- , _prev_time (Platform::get_monolithic_time())
-
-{
- LOG_INFO("");
- init_cegui();
-#ifdef GUI_DEMO
- register_tab_factory(*(new SampleTabFactory(2)));
- register_tab_factory(*(new SampleTabFactory(3)));
- register_tab_factory(*(new SampleTabFactory(1)));
- register_tab_factory(*(new SampleTabFactory(4)));
- register_tab_factory(*(new SampleTabFactory(5)));
-#endif
- create_dialog();
-}
-
-GUI::~GUI()
-{
- delete _dialog;
- detach();
- delete _gui_system;
- delete _renderer;
- delete _pixmap;
-}
-
-void GUI::init_cegui()
-{
- std::string log_file_name;
-
- Platform::get_app_data_dir(log_file_name, "spicec");
- Platform::path_append(log_file_name, "cegui.log");
-
- _gui_system = new CEGUI::System(_renderer, new CEGUIResourceProvider(),
- NULL, NULL, "", log_file_name);
-
- CEGUI::SchemeManager::getSingleton().loadScheme("TaharezLook.scheme");
- _gui_system->setDefaultMouseCursor("TaharezLook", "MouseArrow");
- _gui_system->setDefaultTooltip("TaharezLook/Tooltip");
-
- CEGUI::String font_name("DejaVuSans-10");
- CEGUI::Font* font;
-
- if (!CEGUI::FontManager::getSingleton().isFontPresent(font_name)) {
- font = CEGUI::FontManager::getSingleton().createFont(font_name + ".font");
- } else {
- font = CEGUI::FontManager::getSingleton().getFont(font_name);
- }
-
- //font->setProperty("PointSize", "10");
- CEGUI::System::getSingleton().setDefaultFont(font);
-}
-
-bool comp_factorys(GUI::TabFactory* f1, GUI::TabFactory* f2)
-{
- return f1->get_order() < f2->get_order();
-}
-
-void GUI::register_tab_factory(TabFactory& factory)
-{
- TabFactorys::iterator iter = _tab_factorys.begin();
-
- for (; iter != _tab_factorys.end(); iter++) {
- if ((*iter) == &factory) {
- return;
- }
- }
-
- _tab_factorys.push_back(&factory);
- _tab_factorys.sort(comp_factorys);
-}
-
-void GUI::unregister_tab_factory(TabFactory& factory)
-{
- TabFactorys::iterator iter = _tab_factorys.begin();
-
- for (; iter != _tab_factorys.end(); iter++) {
- if ((*iter) == &factory) {
- _tab_factorys.erase(iter);
- return;
- }
- }
-}
-
-void GUI::detach()
-{
- if (!screen()) {
- return;
- }
- clear_area();
- screen()->detach_layer(*this);
- set_dialog(NULL);
-}
-
-void GUI::conditional_update()
-{
- if (_gui_system->isRedrawRequested()) {
- invalidate();
- }
-}
-
-void GUI::update_layer_area()
-{
- if (!_dialog || !screen()) {
- clear_area();
- return;
- }
- SpicePoint screen_size = screen()->get_size();
-
- int dx = (screen_size.x - MAIN_GUI_WIDTH) / 2;
- int dy = (screen_size.y - MAIN_GUI_HEIGHT) / 2;
-
- DBG(0, "screen_size.x = %d screen_size.y = %d", screen_size.x, screen_size.y);
-
- _pixmap->set_origin(-dx, -dy);
- CEGUI::Window& root = _dialog->root_window();
- QRegion regin;
- region_init(&regin);
-
- for (unsigned int i = 0; i < root.getChildCount(); i++) {
-
- CEGUI::Window* child = root.getChildAtIdx(i);
- if (!child->isVisible()) {
- continue;
- }
-
- CEGUI::Rect area = child->getPixelRect();
- SpiceRect r;
- r.left = (int)area.d_left + dx;
- r.right = (int)area.d_right + dx;
- r.top = (int)area.d_top + dy;
- r.bottom = (int)area.d_bottom + dy;
- region_add(&regin, &r);
-
- }
- set_area(regin);
- region_destroy(&regin);
-}
-
-void GUI::copy_pixels(const QRegion& dest_region, RedDrawable& dest)
-{
- pixman_box32_t *rects;
- int num_rects;
-
- if (region_is_empty(&dest_region)) {
- return;
- }
-
- rects = pixman_region32_rectangles((pixman_region32_t *)&dest_region, &num_rects);
- for (int i = 0; i < num_rects; i++) {
- SpiceRect r;
-
- r.left = rects[i].x1;
- r.top = rects[i].y1;
- r.right = rects[i].x2;
- r.bottom = rects[i].y2;
- _pixmap->copy_pixels(dest, r.left, r.top, r);
- }
-
- _gui_system->renderGUI();
- for (int i = 0; i < num_rects; i++) {
- SpiceRect r;
-
- r.left = rects[i].x1;
- r.top = rects[i].y1;
- r.right = rects[i].x2;
- r.bottom = rects[i].y2;
- dest.copy_pixels(*_pixmap, r.left, r.top, r);
- }
-}
-
-void GUI::on_size_changed()
-{
- DBG(0, "");
- update_layer_area();
-}
-
-void GUI::set_dialog(Dialog* dialog)
-{
- if (_dialog) {
- _dialog->pre_destroy();
- delete _dialog;
- _dialog = NULL;
- }
-
- if (!dialog) {
- return;
- }
-
- _dialog = dialog;
- gui_system().setGUISheet(&_dialog->root_window());
- update_layer_area();
-}
-
-void GUI::dettach_dialog(Dialog* dialog)
-{
- if (!dialog || _dialog != dialog) {
- return;
- }
- gui_system().setGUISheet(NULL);
- _dialog = NULL;
- update_layer_area();
-}
-
-void GUI::create_dialog()
-{
- switch (_state) {
- case Application::DISCONNECTED:
- set_dialog(new LoginDialog(*this));
- break;
- case Application::VISIBILITY:
- set_dialog(new SettingsDialog(*this));
- break;
- case Application::CONNECTING:
- set_dialog(new ConnectingDialog(*this));
- break;
- case Application::CONNECTED:
- break;
- case Application::DISCONECTING:
- set_dialog(NULL);
- break;
- }
-}
-
-void GUI::set_state(Application::State state)
-{
- if (_state == state) {
- return;
- }
- _state = state;
- create_dialog();
-}
-
-bool GUI::prepare_dialog()
-{
- if (!_dialog) {
- create_dialog();
- }
-
- return !!_dialog;
-}
-
-void GUI::set_screen(RedScreen* in_screen)
-{
- detach();
- if (!in_screen) {
- _app.remove_key_handler(*this);
- return;
- }
- ASSERT(!screen());
- in_screen->attach_layer(*this);
- CEGUI::MouseCursor::getSingleton().hide();
- update_layer_area();
- _app.set_key_handler(*this);
-}
-
-void GUI::on_pointer_enter(int x, int y, unsigned int buttons_state)
-{
- CEGUI::MouseCursor::getSingleton().show();
- screen()->hide_cursor();
- _app.set_key_handler(*this);
- on_pointer_motion(x, y, buttons_state);
-}
-
-void GUI::on_pointer_motion(int x, int y, unsigned int buttons_state)
-{
- _gui_system->injectMousePosition(float(x + _pixmap->get_origin().x),
- float(y + _pixmap->get_origin().y));
- invalidate();
-}
-
-void GUI::on_mouse_button_press(int button, int buttons_state)
-{
- _app.set_key_handler(*this);
- switch (button) {
- case SPICE_MOUSE_BUTTON_LEFT:
- _gui_system->injectMouseButtonDown(CEGUI::LeftButton);
- break;
- case SPICE_MOUSE_BUTTON_MIDDLE:
- _gui_system->injectMouseButtonDown(CEGUI::MiddleButton);
- break;
- case SPICE_MOUSE_BUTTON_RIGHT:
- _gui_system->injectMouseButtonDown(CEGUI::RightButton);
- break;
- case SPICE_MOUSE_BUTTON_UP:
- _gui_system->injectMouseWheelChange(-1);
- break;
- case SPICE_MOUSE_BUTTON_DOWN:
- _gui_system->injectMouseWheelChange(1);
- break;
- default:
- THROW("invalid SpiceMouseButton %d", button);
- }
- conditional_update();
-}
-
-void GUI::on_mouse_button_release(int button, int buttons_state)
-{
- switch (button) {
- case SPICE_MOUSE_BUTTON_LEFT:
- _gui_system->injectMouseButtonUp(CEGUI::LeftButton);
- break;
- case SPICE_MOUSE_BUTTON_MIDDLE:
- _gui_system->injectMouseButtonUp(CEGUI::MiddleButton);
- break;
- case SPICE_MOUSE_BUTTON_RIGHT:
- _gui_system->injectMouseButtonUp(CEGUI::RightButton);
- break;
- case SPICE_MOUSE_BUTTON_UP:
- case SPICE_MOUSE_BUTTON_DOWN:
- break;
- default:
- THROW("invalid SpiceMouseButton %d", button);
- }
- conditional_update();
-}
-
-void GUI::on_pointer_leave()
-{
- CEGUI::MouseCursor::getSingleton().hide();
- invalidate();
-}
-
-#define KEY_CASE(a, b) \
- case a: \
- return CEGUI::Key::b
-
-static inline CEGUI::Key::Scan red_ket_cegui_scan(RedKey key)
-{
- switch (key) {
- KEY_CASE(REDKEY_ESCAPE, Escape);
- KEY_CASE(REDKEY_1, One);
- KEY_CASE(REDKEY_2, Two);
- KEY_CASE(REDKEY_3, Three);
- KEY_CASE(REDKEY_4, Four);
- KEY_CASE(REDKEY_5, Five);
- KEY_CASE(REDKEY_6, Six);
- KEY_CASE(REDKEY_7, Seven);
- KEY_CASE(REDKEY_8, Eight);
- KEY_CASE(REDKEY_9, Nine);
- KEY_CASE(REDKEY_0, Zero);
- KEY_CASE(REDKEY_MINUS, Minus);
- KEY_CASE(REDKEY_EQUALS, Equals);
- KEY_CASE(REDKEY_BACKSPACE, Backspace);
- KEY_CASE(REDKEY_TAB, Tab);
- KEY_CASE(REDKEY_Q, Q);
- KEY_CASE(REDKEY_W, W);
- KEY_CASE(REDKEY_E, E);
- KEY_CASE(REDKEY_R, R);
- KEY_CASE(REDKEY_T, T);
- KEY_CASE(REDKEY_Y, Y);
- KEY_CASE(REDKEY_U, U);
- KEY_CASE(REDKEY_I, I);
- KEY_CASE(REDKEY_O, O);
- KEY_CASE(REDKEY_P, P);
- KEY_CASE(REDKEY_L_BRACKET, LeftBracket);
- KEY_CASE(REDKEY_R_BRACKET, RightBracket);
- KEY_CASE(REDKEY_ENTER, Return);
- KEY_CASE(REDKEY_L_CTRL, LeftControl);
- KEY_CASE(REDKEY_A, A);
- KEY_CASE(REDKEY_S, S);
- KEY_CASE(REDKEY_D, D);
- KEY_CASE(REDKEY_F, F);
- KEY_CASE(REDKEY_G, G);
- KEY_CASE(REDKEY_H, H);
- KEY_CASE(REDKEY_J, J);
- KEY_CASE(REDKEY_K, K);
- KEY_CASE(REDKEY_L, L);
- KEY_CASE(REDKEY_SEMICOLON, Semicolon);
- KEY_CASE(REDKEY_QUOTE, Apostrophe);
-
- KEY_CASE(REDKEY_BACK_QUOTE, Grave);
- KEY_CASE(REDKEY_L_SHIFT, LeftShift);
- KEY_CASE(REDKEY_BACK_SLASH, Backslash);
- KEY_CASE(REDKEY_Z, Z);
- KEY_CASE(REDKEY_X, X);
- KEY_CASE(REDKEY_C, C);
- KEY_CASE(REDKEY_V, V);
- KEY_CASE(REDKEY_B, B);
- KEY_CASE(REDKEY_N, N);
- KEY_CASE(REDKEY_M, M);
- KEY_CASE(REDKEY_COMMA, Comma);
- KEY_CASE(REDKEY_PERIOD, Period);
- KEY_CASE(REDKEY_SLASH, Slash);
- KEY_CASE(REDKEY_R_SHIFT, RightShift);
- KEY_CASE(REDKEY_PAD_MULTIPLY, Multiply);
- KEY_CASE(REDKEY_L_ALT, LeftAlt);
- KEY_CASE(REDKEY_SPACE, Space);
- KEY_CASE(REDKEY_CAPS_LOCK, Capital);
- KEY_CASE(REDKEY_F1, F1);
- KEY_CASE(REDKEY_F2, F2);
- KEY_CASE(REDKEY_F3, F3);
- KEY_CASE(REDKEY_F4, F4);
- KEY_CASE(REDKEY_F5, F5);
- KEY_CASE(REDKEY_F6, F6);
- KEY_CASE(REDKEY_F7, F7);
- KEY_CASE(REDKEY_F8, F8);
- KEY_CASE(REDKEY_F9, F9);
- KEY_CASE(REDKEY_F10, F10);
- KEY_CASE(REDKEY_NUM_LOCK, NumLock);
- KEY_CASE(REDKEY_SCROLL_LOCK, ScrollLock);
- KEY_CASE(REDKEY_PAD_7, Numpad7);
- KEY_CASE(REDKEY_PAD_8, Numpad8);
- KEY_CASE(REDKEY_PAD_9, Numpad9);
- KEY_CASE(REDKEY_PAD_MINUS, Subtract);
- KEY_CASE(REDKEY_PAD_4, Numpad4);
- KEY_CASE(REDKEY_PAD_5, Numpad5);
- KEY_CASE(REDKEY_PAD_6, Numpad6);
- KEY_CASE(REDKEY_PAD_PLUS, Add);
- KEY_CASE(REDKEY_PAD_1, Numpad1);
- KEY_CASE(REDKEY_PAD_2, Numpad2);
- KEY_CASE(REDKEY_PAD_3, Numpad3);
- KEY_CASE(REDKEY_PAD_0, Numpad0);
- KEY_CASE(REDKEY_PAD_POINT, Decimal);
-
- KEY_CASE(REDKEY_EUROPEAN, OEM_102);
- KEY_CASE(REDKEY_F11, F11);
- KEY_CASE(REDKEY_F12, F12);
-
- KEY_CASE(REDKEY_JAPANESE_HIRAGANA_KATAKANA, Kana);
- KEY_CASE(REDKEY_JAPANESE_BACKSLASH, ABNT_C1);
- KEY_CASE(REDKEY_JAPANESE_HENKAN, Convert);
- KEY_CASE(REDKEY_JAPANESE_MUHENKAN, NoConvert);
- KEY_CASE(REDKEY_JAPANESE_YEN, Yen);
-
- //KEY_CASE(REDKEY_KOREAN_HANGUL_HANJA,
- //KEY_CASE(REDKEY_KOREAN_HANGUL,
-
- KEY_CASE(REDKEY_PAD_ENTER, NumpadEnter);
- KEY_CASE(REDKEY_R_CTRL, RightControl);
- KEY_CASE(REDKEY_FAKE_L_SHIFT, LeftShift);
- KEY_CASE(REDKEY_PAD_DIVIDE, Divide);
- KEY_CASE(REDKEY_FAKE_R_SHIFT, RightShift);
- KEY_CASE(REDKEY_CTRL_PRINT_SCREEN, SysRq);
- KEY_CASE(REDKEY_R_ALT, RightAlt);
- //KEY_CASE(REDKEY_CTRL_BREAK
- KEY_CASE(REDKEY_HOME, Home);
- KEY_CASE(REDKEY_UP, ArrowUp);
- KEY_CASE(REDKEY_PAGEUP, PageUp);
- KEY_CASE(REDKEY_LEFT, ArrowLeft);
- KEY_CASE(REDKEY_RIGHT, ArrowRight);
- KEY_CASE(REDKEY_END, End);
- KEY_CASE(REDKEY_DOWN, ArrowDown);
- KEY_CASE(REDKEY_PAGEDOWN, PageDown);
- KEY_CASE(REDKEY_INSERT, Insert);
- KEY_CASE(REDKEY_DELETE, Delete);
- KEY_CASE(REDKEY_LEFT_CMD, LeftWindows);
- KEY_CASE(REDKEY_RIGHT_CMD, RightWindows);
- KEY_CASE(REDKEY_MENU, AppMenu);
- KEY_CASE(REDKEY_PAUSE, Pause);
- default:
- return (CEGUI::Key::Scan)0;
- };
-}
-
-void GUI::on_key_down(RedKey key)
-{
- CEGUI::Key::Scan scan = red_ket_cegui_scan(key);
-
- if (scan == (CEGUI::Key::Scan)0) {
- return;
- }
-
- _gui_system->injectKeyDown(scan);
- conditional_update();
-}
-
-void GUI::on_key_up(RedKey key)
-{
- CEGUI::Key::Scan scan = red_ket_cegui_scan(key);
-
- if (scan == (CEGUI::Key::Scan)0) {
- return;
- }
-
- _gui_system->injectKeyUp(scan);
- conditional_update();
-}
-
-void GUI::on_char(uint32_t ch)
-{
- _gui_system->injectChar(ch);
- conditional_update();
-}
-
-void GUI::idle()
-{
- uint64_t now = Platform::get_monolithic_time();
- _gui_system->injectTimePulse(float(double(now) - double(_prev_time)) / (1000 * 1000 * 1000));
- _prev_time = now;
- conditional_update();
-}
-
-bool GUI::message_box(MessageType type, const char *text, const ButtonsList& buttons,
- BoxResponse* _response_handler)
-{
- if (!_dialog) {
- set_dialog(new MessageDialog(*this));
- }
- return _dialog->message_box(type, text, buttons, _response_handler);
-}
diff --git a/client/gui/gui.h b/client/gui/gui.h
deleted file mode 100644
index b93b42a2..00000000
--- a/client/gui/gui.h
+++ /dev/null
@@ -1,143 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
-/*
- Copyright (C) 2010 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifndef _H_GUI
-#define _H_GUI
-
-#include "softrenderer.h"
-#include "screen_layer.h"
-#include "inputs_handler.h"
-#include "application.h"
-
-class RedPixmapSw;
-
-class GUI : public ScreenLayer, public KeyHandler {
-public:
- class Dialog;
- class Tab;
- class TabFactory;
-
- typedef std::list<TabFactory*> TabFactorys;
-
- GUI(Application& app, Application::State state);
- virtual ~GUI();
-
- void set_screen(RedScreen* screen); //show and hide
-
- Application& get_application() { return _app;}
-#ifdef USE_GUI
- CEGUI::System& gui_system() { return *_gui_system;}
-#endif // USE_GUI
-
- void set_state(Application::State state);
- bool is_visible() { return !!_dialog;}
- bool prepare_dialog();
- bool is_disconnect_allowed() { return _app.is_disconnect_allowed();}
-
- virtual bool pointer_test(int x, int y) { return contains_point(x, y);}
- virtual void on_pointer_enter(int x, int y, unsigned int buttons_state);
- virtual void on_pointer_leave();
- virtual void on_pointer_motion(int x, int y, unsigned int buttons_state);
- virtual void on_mouse_button_press(int button, int buttons_state);
- virtual void on_mouse_button_release(int button, int buttons_state);
-
- virtual void on_key_down(RedKey key);
- virtual void on_key_up(RedKey key);
- virtual void on_char(uint32_t ch);
- virtual bool permit_focus_loss() { return false;}
-
- void idle();
-
- virtual void copy_pixels(const QRegion& dest_region, RedDrawable& dest_dc);
- virtual void on_size_changed();
-
- void register_tab_factory(TabFactory& factory);
- void unregister_tab_factory(TabFactory& factory);
-
- class BoxResponse {
- public:
- virtual ~BoxResponse() {}
- virtual void response(int response) = 0;
- virtual void aborted() = 0;
- };
-
- enum MessageType {
- QUESTION,
- INFO,
- WARNING,
- ERROR_MSG
- };
-
- struct ButtonInfo {
- int id;
- const char *text;
- };
-
- typedef std::vector<ButtonInfo> ButtonsList;
- bool message_box(MessageType type, const char *text, const ButtonsList& buttons,
- BoxResponse* _response_handler);
-
-private:
- TabFactorys& get_factoris() { return _tab_factorys;}
-
- void create_dialog();
- void detach();
- void update_layer_area();
- void init_cegui();
- void conditional_update();
- void set_dialog(Dialog* dialog);
- void dettach_dialog(Dialog* dialog);
-
-private:
- Application& _app;
- Application::State _state;
- RedPixmapSw* _pixmap;
-#ifdef USE_GUI
- CEGUI::SoftRenderer* _renderer;
- CEGUI::System* _gui_system;
-#endif // USE_GUI
- Dialog* _dialog;
- uint64_t _prev_time;
- TabFactorys _tab_factorys;
-
- friend class Dialog;
-};
-
-class GUI::Tab {
-public:
- virtual ~Tab() {}
-
-#ifdef USE_GUI
- virtual CEGUI::Window& get_root_window() = 0;
-#endif // USE_GUI
- virtual const std::string& get_name() = 0;
-};
-
-class GUI::TabFactory {
-public:
- TabFactory() : _order (-1) {}
- TabFactory(int order) : _order (order) {}
-
- virtual ~TabFactory() {}
- virtual Tab* create_tab(bool connected, int width, int hight) = 0;
- int get_order() { return _order;}
-
-private:
- int _order;
-};
-
-#endif
diff --git a/client/gui/resource_provider.cpp b/client/gui/resource_provider.cpp
deleted file mode 100644
index 3c0b897a..00000000
--- a/client/gui/resource_provider.cpp
+++ /dev/null
@@ -1,148 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
-/*
- Copyright (C) 2010 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-
-#include "resource_provider.h"
-#include "debug.h"
-#include "utils.h"
-
-#include "CEGUIExceptions.h"
-
-#include "taharez_look.scheme.c"
-#include "taharez_look.imageset.c"
-#include "taharez_look.tga.c"
-#include "commonwealth-10.font.c"
-#include "commonv2c.ttf.c"
-#include "taharez_look.looknfeel.c"
-#include "dejavu_sans-10.font.c"
-#include "dejavu_sans.ttf.c"
-
-//(echo "const unsigned char <struct name>[] =
-//{"; od -txC -v <in file name> | sed -e "s/^[0-9]*//" -e s"/ \([0-9a-f][0-9a-f]\)/0x\1,/g" -e"\$d"
-//| sed -e"\$s/,$/};/") > <out file name>.c
-
-void CEGUIResourceProvider::loadRawDataContainer(const CEGUI::String &filename,
- CEGUI::RawDataContainer &output,
- const CEGUI::String &resourceGroup)
-{
- DBG(0, "%s", filename.c_str());
- if (strcmp(filename.c_str(), "TaharezLook.scheme") == 0) {
- DBG(0, "size %d", sizeof(taharez_look_schem));
- output.setData((CEGUI::uint8*)taharez_look_schem);
- output.setSize(sizeof(taharez_look_schem));
- return;
- }
-
- if (strcmp(filename.c_str(), "TaharezLook.imageset") == 0) {
- DBG(0, "size %d", sizeof(taharez_look_imageset));
- output.setData((CEGUI::uint8*)taharez_look_imageset);
- output.setSize(sizeof(taharez_look_imageset));
- return;
- }
-
- if (strcmp(filename.c_str(), "TaharezLook.tga") == 0) {
- DBG(0, "size %d", sizeof(taharez_look_tga));
- output.setData((CEGUI::uint8*)taharez_look_tga);
- output.setSize(sizeof(taharez_look_tga));
- return;
- }
-
- if (strcmp(filename.c_str(), "Commonwealth-10.font") == 0) {
- DBG(0, "size %d", sizeof(commonwealth_10_font));
- output.setData((CEGUI::uint8*)commonwealth_10_font);
- output.setSize(sizeof(commonwealth_10_font));
- return;
- }
-
- if (strcmp(filename.c_str(), "Commonv2c.ttf") == 0) {
- DBG(0, "size %d", sizeof(commonv2c_ttf));
- output.setData((CEGUI::uint8*)commonv2c_ttf);
- output.setSize(sizeof(commonv2c_ttf));
- return;
- }
-
- if (strcmp(filename.c_str(), "TaharezLook.looknfeel") == 0) {
- DBG(0, "size %d", sizeof(taharez_look_looknfeel));
- output.setData((CEGUI::uint8*)taharez_look_looknfeel);
- output.setSize(sizeof(taharez_look_looknfeel));
- return;
- }
-
- if (strcmp(filename.c_str(), "DejaVuSans-10.font") == 0) {
- DBG(0, "size %d", sizeof(dejavu_sans_10_font));
- output.setData((CEGUI::uint8*)dejavu_sans_10_font);
- output.setSize(sizeof(dejavu_sans_10_font));
- return;
- }
-
- if (strcmp(filename.c_str(), "DejaVuSans.ttf") == 0) {
- DBG(0, "size %d", sizeof(dejavu_sans_ttf));
- output.setData((CEGUI::uint8*)dejavu_sans_ttf);
- output.setSize(sizeof(dejavu_sans_ttf));
- return;
- }
-
- throw CEGUI::GenericException("failed");
-}
-
-void CEGUIResourceProvider::unloadRawDataContainer(CEGUI::RawDataContainer& data)
-{
- data.setData(NULL);
- data.setSize(0);
-}
-
-struct ResString{
- int id;
- const char* str;
-} res_strings[] = {
- {STR_MESG_MISSING_HOST_NAME, "Missing host name"},
- {STR_MESG_INVALID_PORT, "Invalid port"},
- {STR_MESG_INVALID_SPORT, "Invalid sport"},
- {STR_MESG_MISSING_PORT, "Missing port"},
- {STR_MESG_CONNECTING, "Connecting to"},
- {STR_BUTTON_OK, "OK"},
- {STR_BUTTON_CANCEL, "Cancel"},
- {STR_BUTTON_CONNECT, "Connect"},
- {STR_BUTTON_QUIT, "Quit"},
- {STR_BUTTON_CLOSE, "Close"},
- {STR_BUTTON_DISCONNECT, "Disconnect"},
- {STR_BUTTON_OPTIONS, "Options"},
- {STR_BUTTON_BACK, "Back"},
- {STR_LABEL_HOST, "Host"},
- {STR_LABEL_PORT, "Port"},
- {STR_LABEL_SPORT, "Secure port"},
- {STR_LABEL_PASSWORD, "Password"},
- {0, NULL},
-};
-
-const char* res_get_string(int id)
-{
- ResString *string;
-
- for (string = res_strings; string->str; string++) {
- if (string->id == id) {
- return string->str;
- }
- }
-
- return NULL;
-}
diff --git a/client/gui/resource_provider.h b/client/gui/resource_provider.h
deleted file mode 100644
index c0d319b5..00000000
--- a/client/gui/resource_provider.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
-/*
- Copyright (C) 2010 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifndef _H_RESOURCE_PROVIDER
-#define _H_RESOURCE_PROVIDER
-
-/* CEGUI 0.6 bug, CEGUITexture.h doesn't include this, we need to */
-#include <cstddef>
-
-#include "CEGUIDefaultResourceProvider.h"
-
-class CEGUIResourceProvider: public CEGUI::ResourceProvider {
-public:
- virtual void loadRawDataContainer(const CEGUI::String &filename,
- CEGUI::RawDataContainer &output,
- const CEGUI::String &resourceGroup);
-
- virtual void unloadRawDataContainer(CEGUI::RawDataContainer& data);
-};
-
-enum {
- STR_INVALID,
- STR_MESG_MISSING_HOST_NAME,
- STR_MESG_INVALID_PORT,
- STR_MESG_INVALID_SPORT,
- STR_MESG_MISSING_PORT,
- STR_MESG_CONNECTING,
- STR_BUTTON_OK,
- STR_BUTTON_CANCEL,
- STR_BUTTON_CONNECT,
- STR_BUTTON_QUIT,
- STR_BUTTON_CLOSE,
- STR_BUTTON_DISCONNECT,
- STR_BUTTON_OPTIONS,
- STR_BUTTON_BACK,
- STR_LABEL_HOST,
- STR_LABEL_PORT,
- STR_LABEL_SPORT,
- STR_LABEL_PASSWORD,
-};
-
-//todo: move to x11/res.cpp and make x11/res.cpp cross-platform
-const char* res_get_string(int id);
-
-#endif
diff --git a/client/gui/softrenderer.cpp b/client/gui/softrenderer.cpp
deleted file mode 100644
index c888bc03..00000000
--- a/client/gui/softrenderer.cpp
+++ /dev/null
@@ -1,390 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
-/*
- Copyright (C) 2010 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "common.h"
-#include "utils.h"
-#include "debug.h"
-
-#include "softrenderer.h"
-#include "softtexture.h"
-
-#include "CEGUIExceptions.h"
-#include "CEGUIImageCodec.h"
-#include "CEGUIDynamicModule.h"
-#include "CEGUIEventArgs.h"
-
-#define S_(X) #X
-#define STRINGIZE(X) S_(X)
-
-namespace CEGUI {
-
-SoftRenderer::SoftRenderer(uint8_t* surface, uint width, uint height, uint stride,
- ImageCodec* codec)
- : _surface (surface)
- , _width (width)
- , _height (height)
- , _image_codec (codec)
- , _image_codec_module (NULL)
- , _queueing(true)
-{
- assert(stride == width * 4); //for now
- if (!_image_codec) {
- setupImageCodec();
- }
-}
-
-SoftRenderer::~SoftRenderer()
-{
- destroyAllTextures();
- cleanupImageCodec();
-}
-
-
-void SoftRenderer::reset_surface(uint8_t* surface, uint width, uint height, uint stride)
-{
- assert(stride == width * 4); //for now
- _surface = surface;
- _width = width;
- _height = height;
-
- EventArgs args;
- fireEvent(EventDisplaySizeChanged, args, EventNamespace);
-}
-
-#if defined(CEGUI_STATIC)
-extern "C" CEGUI::ImageCodec* createImageCodec(void);
-extern "C" void destroyImageCodec(CEGUI::ImageCodec*);
-#endif
-
-void SoftRenderer::setupImageCodec()
-{
-#if defined(CEGUI_STATIC)
- _destroy_image_codec = destroyImageCodec;
- _image_codec = createImageCodec();
-#else
- String _default_codec_name(STRINGIZE(TGAImageCodec/*CEGUI_DEFAULT_IMAGE_CODEC*/));
- DynamicModule* module = NULL;
-
- try {
- DynamicModule* module = new DynamicModule(String("CEGUI") + _default_codec_name);
-
- _destroy_image_codec = (void(*)(ImageCodec*))module->getSymbolAddress("destroyImageCodec");
-
- if (!_destroy_image_codec) {
- throw GenericException("Missing destroyImageCodec symbol");
- }
-
- ImageCodec* (*create_f)(void);
- create_f = (ImageCodec* (*)(void))module->getSymbolAddress("createImageCodec");
-
- if (!create_f) {
- throw GenericException("Missing createImageCodec symbol");
- }
-
- _image_codec = create_f();
- } catch (...) {
- delete module;
- throw;
- }
- _image_codec_module = module;
-#endif
-}
-
-void SoftRenderer::cleanupImageCodec()
-{
- _destroy_image_codec(_image_codec);
- delete _image_codec_module;
-}
-
-static inline uint8_t calac_pixel(uint64_t c1, uint64_t c2, uint64_t c3, uint64_t a_mul)
-{
- //(c' * c" * a' * a" + c"' * 255 ^ 3 - c"' * a' * a" * 255) / 255^4
-
- return uint8_t((c1 * c2 * a_mul + c3 * 255 * 255 * 255 - c3 * a_mul * 255) / (255 * 255 * 255));
-}
-
-inline void SoftRenderer::componnentAtPoint(int x_pos, int y_pos,
- int top_left, int top_right,
- int bottom_left, int bottom_right,
- uint64_t& comp)
-{
- int a = top_left + (((x_pos * (top_right - top_left)) + (1 << 15)) >> 16);
- int b = bottom_left + (((x_pos * (bottom_right - bottom_left)) + (1 << 15)) >> 16);
- comp = a + (((b - a) * y_pos + (1 << 15)) >> 16);
-}
-
-void SoftRenderer::colourAtPoint(int x, int x_max, int y, int y_max,
- const ColourIRect& colours,
- uint64_t& r, uint64_t& g,
- uint64_t& b, uint64_t& a)
-{
- int x_pos = (x << 16) / x_max;
- int y_pos = (y << 16) / y_max;
-
-
- componnentAtPoint(x_pos, y_pos, colours.top_left.r, colours.top_right.r,
- colours.bottom_left.r, colours.bottom_right.r, r);
- componnentAtPoint(x_pos, y_pos, colours.top_left.g, colours.top_right.g,
- colours.bottom_left.g, colours.bottom_right.g, g);
- componnentAtPoint(x_pos, y_pos, colours.top_left.b, colours.top_right.b,
- colours.bottom_left.b, colours.bottom_right.b, b);
- componnentAtPoint(x_pos, y_pos, colours.top_left.a, colours.top_right.a,
- colours.bottom_left.a, colours.bottom_right.a, a);
-}
-
-void SoftRenderer::renderQuadWithColourRect(const QuadInfo& quad)
-{
- uint32_t* src = quad.tex->_surf + quad.tex_src.top * (int)quad.tex->getWidth();
- src += quad.tex_src.left;
-
-
- int src_width = quad.tex_src.right - quad.tex_src.left;
- int src_height = quad.tex_src.bottom - quad.tex_src.top;
-
- int dest_width = quad.dest.right - quad.dest.left;
- int dest_height = quad.dest.bottom - quad.dest.top;
-
-
- uint32_t x_scale = (src_width << 16) / dest_width;
- uint32_t y_scale = (src_height << 16) / dest_height;
-
- uint32_t* line = (uint32_t*)_surface + quad.dest.top * _width;
- line += quad.dest.left;
-
- for (int i = 0; i < dest_height; line += _width, i++) {
- uint32_t* pix = line;
- uint32_t* src_line = src + (((i * y_scale) + (1 << 15)) >> 16) * (int)quad.tex->getWidth();
-
- for (int j = 0; j < dest_width; pix++, j++) {
- uint64_t r;
- uint64_t g;
- uint64_t b;
- uint64_t a;
-
- colourAtPoint(j, dest_width, i, dest_height, quad.colors, r, g, b, a);
-
- uint8_t* tex_pix = (uint8_t*)&src_line[(((j * x_scale)+ (1 << 15)) >> 16)];
- uint64_t a_mul = a * tex_pix[3];
-
- ((uint8_t *)pix)[0] = calac_pixel(tex_pix[0], b, ((uint8_t *)pix)[0], a_mul);
- ((uint8_t *)pix)[1] = calac_pixel(tex_pix[1], g, ((uint8_t *)pix)[1], a_mul);
- ((uint8_t *)pix)[2] = calac_pixel(tex_pix[2], r, ((uint8_t *)pix)[2], a_mul);
- }
- }
-}
-
-void SoftRenderer::renderQuad(const QuadInfo& quad)
-{
- if (!quad.colors.top_left.isSameColour(quad.colors.top_right) ||
- !quad.colors.top_left.isSameColour(quad.colors.bottom_left) ||
- !quad.colors.top_left.isSameColour(quad.colors.bottom_right)) {
- renderQuadWithColourRect(quad);
- return;
- }
-
-
- uint32_t* src = quad.tex->_surf + quad.tex_src.top * (int)quad.tex->getWidth();
- src += quad.tex_src.left;
-
-
- int src_width = quad.tex_src.right - quad.tex_src.left;
- int src_height = quad.tex_src.bottom - quad.tex_src.top;
-
- int dest_width = quad.dest.right - quad.dest.left;
- int dest_height = quad.dest.bottom - quad.dest.top;
-
-
- uint32_t x_scale = (src_width << 16) / dest_width;
- uint32_t y_scale = (src_height << 16) / dest_height;
-
- uint32_t* line = (uint32_t*)_surface + quad.dest.top * _width;
- line += quad.dest.left;
-
- uint64_t r = quad.colors.top_left.r;
- uint64_t g = quad.colors.top_left.g;
- uint64_t b = quad.colors.top_left.b;
- uint64_t a = quad.colors.top_left.a;
-
- for (int i = 0; i < dest_height; line += _width, i++) {
- uint32_t* pix = line;
- uint32_t* src_line = src + (((i * y_scale) + (1 << 15)) >> 16) * (int)quad.tex->getWidth();
-
- for (int j = 0; j < dest_width; pix++, j++) {
- uint8_t* tex_pix = (uint8_t*)&src_line[(((j * x_scale)+ (1 << 15)) >> 16)];
- uint64_t a_mul = a * tex_pix[3];
-
- ((uint8_t *)pix)[0] = calac_pixel(tex_pix[0], b, ((uint8_t *)pix)[0], a_mul);
- ((uint8_t *)pix)[1] = calac_pixel(tex_pix[1], g, ((uint8_t *)pix)[1], a_mul);
- ((uint8_t *)pix)[2] = calac_pixel(tex_pix[2], r, ((uint8_t *)pix)[2], a_mul);
- }
- }
-}
-
-inline void SoftRenderer::setRGB(ColourI& dest, const colour& src)
-{
- dest.r = uint8_t(src.getRed()* 255);
- dest.g = uint8_t(src.getGreen() * 255);
- dest.b = uint8_t(src.getBlue() * 255);
- dest.a = uint8_t(src.getAlpha() * 255);
-}
-
-void SoftRenderer::addQuad(const Rect& dest_rect, float z, const Texture* texture,
- const Rect& texture_rect, const ColourRect& colours,
- QuadSplitMode quad_split_mode)
-{
- if (dest_rect.d_right <= dest_rect.d_left || dest_rect.d_bottom <= dest_rect.d_top) {
- return;
- }
-
- if (texture_rect.d_right <= texture_rect.d_left ||
- texture_rect.d_bottom <= texture_rect.d_top) {
- return;
- }
-
- QuadInfo quad;
- quad.dest.top = (int)dest_rect.d_top;
- quad.dest.left = (int)dest_rect.d_left;
- quad.dest.bottom = (int)dest_rect.d_bottom;
- quad.dest.right = (int)dest_rect.d_right;
-
- quad.tex = (const SoftTexture*)texture;
-
- quad.tex_src.top = int(texture_rect.d_top * texture->getHeight());
- quad.tex_src.bottom = int(texture_rect.d_bottom * texture->getHeight());
- quad.tex_src.left = int(texture_rect.d_left * texture->getWidth());
- quad.tex_src.right = int(texture_rect.d_right * texture->getWidth());
-
- setRGB(quad.colors.top_left, colours.d_top_left);
- setRGB(quad.colors.top_right, colours.d_top_right);
- setRGB(quad.colors.bottom_left, colours.d_bottom_left);
- setRGB(quad.colors.bottom_right, colours.d_bottom_right);
-
- quad.z = z;
-
- if (!_queueing) {
- renderQuad(quad);
- return;
- }
-
- _queue.insert(quad);
-}
-
-void SoftRenderer::doRender()
-{
- QuadQueue::iterator iter = _queue.begin();
-
- for (; iter != _queue.end(); ++iter) {
- renderQuad(*iter);
- }
-}
-
-void SoftRenderer::clearRenderList()
-{
- _queue.clear();
-}
-
-void SoftRenderer::setQueueingEnabled(bool val)
-{
- _queueing = val;
-}
-
-bool SoftRenderer::isQueueingEnabled() const
-{
- return _queueing;
-}
-
-Texture* SoftRenderer::createTexture()
-{
- SoftTexture* texture = new SoftTexture(this);
- _textures.push_back(texture);
- return texture;
-}
-
-Texture* SoftRenderer::createTexture(const String& filename,
- const String& resourceGroup)
-{
- SoftTexture* texture = new SoftTexture(this, filename, resourceGroup);
- _textures.push_back(texture);
- return texture;
-}
-
-Texture* SoftRenderer::createTexture(float size)
-{
- SoftTexture* texture = new SoftTexture(this, (uint)size);
- _textures.push_back(texture);
- return texture;
-}
-
-void SoftRenderer::destroyTexture(Texture* texture)
-{
- if (!texture) {
- return;
- }
- SoftTexture* soft_texture = (SoftTexture*)texture;
- _textures.remove(soft_texture);
- delete soft_texture;
-}
-
-void SoftRenderer::destroyAllTextures()
-{
- while (!_textures.empty()) {
- SoftTexture* texture = *_textures.begin();
- _textures.pop_front();
- delete texture;
- }
-}
-
-uint SoftRenderer::getMaxTextureSize() const
-{
- return 1 << 16;
-}
-
-float SoftRenderer::getWidth() const
-{
- return (float)_width;
-}
-
-float SoftRenderer::getHeight() const
-{
- return (float)_height;
-}
-
-Size SoftRenderer::getSize() const
-{
- return Size((float)_width, (float)_height);
-}
-
-Rect SoftRenderer::getRect() const
-{
- return Rect(0, 0, (float)_width, (float)_height);
-}
-
-uint SoftRenderer::getHorzScreenDPI() const
-{
- return 96;
-}
-
-uint SoftRenderer::getVertScreenDPI() const
-{
- return 96;
-}
-
-}
diff --git a/client/gui/softrenderer.h b/client/gui/softrenderer.h
deleted file mode 100644
index b97f9d59..00000000
--- a/client/gui/softrenderer.h
+++ /dev/null
@@ -1,148 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
-/*
- Copyright (C) 2010 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifndef _directfbrenderer_h_
-#define _directfbrenderer_h_
-
-#include <stdint.h>
-#include <list>
-#include <set>
-/* CEGUI 0.6 bug, CEGUITexture.h doesn't include this, we need to */
-#include <cstddef>
-
-#include "CEGUIRenderer.h"
-#include "CEGUIColourRect.h"
-#include "CEGUIRect.h"
-
-
-namespace CEGUI
-{
- class SoftTexture;
- class ImageCodec;
-
- class SoftRenderer : public Renderer
- {
- public:
- SoftRenderer(uint8_t* surface, uint width, uint height, uint stride,
- ImageCodec* codec = NULL);
- virtual ~SoftRenderer();
-
- void reset_surface(uint8_t* surface, uint width, uint height, uint stride);
-
- virtual void addQuad(const Rect& dest_rect, float z, const Texture* tex,
- const Rect& texture_rect, const ColourRect& colours,
- QuadSplitMode quad_split_mode);
- virtual void doRender();
- virtual void clearRenderList();
- virtual void setQueueingEnabled(bool setting);
- virtual bool isQueueingEnabled() const;
-
- virtual Texture* createTexture();
- virtual Texture* createTexture(const String& filename,
- const String& resourceGroup);
- virtual Texture* createTexture(float size);
- virtual void destroyTexture(Texture* texture);
- virtual void destroyAllTextures();
- virtual uint getMaxTextureSize() const;
-
- virtual float getWidth() const;
- virtual float getHeight() const;
- virtual Size getSize() const;
- virtual Rect getRect() const;
-
- virtual uint getHorzScreenDPI() const;
- virtual uint getVertScreenDPI() const;
-
- ImageCodec* getImageCodec() { return _image_codec;}
-
- private:
- void setupImageCodec();
- void cleanupImageCodec();
- struct QuadInfo;
- void renderQuad(const QuadInfo& quad);
- void renderQuadWithColourRect(const QuadInfo& quad);
-
- class ColourI {
- public:
-
- bool isSameColour(const ColourI& other) const
- {
- return other.r == r && other.g == g && other.b == b && other.a == a;
- }
-
- uint8_t r;
- uint8_t g;
- uint8_t b;
- uint8_t a;
- };
-
- static inline void setRGB(ColourI& dest, const colour& src);
- static inline void componnentAtPoint(int x_pos, int y_pos,
- int top_left, int top_right,
- int bottom_left, int bottom_right,
- uint64_t& comp);
-
- struct ColourIRect {
- ColourI top_left;
- ColourI top_right;
- ColourI bottom_left;
- ColourI bottom_right;
- };
-
- static void colourAtPoint(int x, int x_max, int y, int y_max,
- const ColourIRect& colours,
- uint64_t& r, uint64_t& g,
- uint64_t& b, uint64_t& a);
-
- private:
- uint8_t* _surface;
- int _width;
- int _height;
- ImageCodec* _image_codec;
- DynamicModule* _image_codec_module;
- void (*_destroy_image_codec)(ImageCodec*);
- bool _queueing;
-
- struct RectI {
- int left;
- int top;
- int right;
- int bottom;
- };
-
- struct QuadInfo {
- RectI dest;
- const SoftTexture* tex;
- RectI tex_src;
- ColourIRect colors;
- float z;
-
- bool operator < (const QuadInfo& other) const
- {
- return z > other.z;
- }
- };
-
- typedef std::multiset<QuadInfo> QuadQueue;
- QuadQueue _queue;
-
- typedef std::list<SoftTexture *> TexturesList;
- TexturesList _textures;
- };
-}
-
-#endif
diff --git a/client/gui/softtexture.cpp b/client/gui/softtexture.cpp
deleted file mode 100644
index d9ce9a07..00000000
--- a/client/gui/softtexture.cpp
+++ /dev/null
@@ -1,139 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
-/*
- Copyright (C) 2010 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "common.h"
-
-#include "softtexture.h"
-#include "softrenderer.h"
-
-#include "CEGUIImageCodec.h"
-#include "CEGUISystem.h"
-#include "CEGUIExceptions.h"
-
-namespace CEGUI
-{
-
-
-SoftTexture::SoftTexture(Renderer* owner)
- : Texture (owner)
- , _surf (NULL)
- , _width (0)
- , _height (0)
-{
-
-}
-
-SoftTexture::SoftTexture(Renderer* owner, uint size)
- : Texture (owner)
- , _surf (new uint32[size * size])
- , _width (size)
- , _height (size)
-{
-
-}
-
-SoftTexture::SoftTexture(Renderer* owner, const String& filename,
- const String& resourceGroup)
- : Texture (owner)
- , _surf (NULL)
- , _width (0)
- , _height (0)
-{
- loadFromFile(filename, resourceGroup);
-}
-
-
-SoftTexture::~SoftTexture()
-{
- freeSurf();
-}
-
-void SoftTexture::freeSurf()
-{
- _width = _height = 0;
- delete[] _surf;
- _surf = NULL;
-}
-
-void SoftTexture::loadFromFile(const String& filename, const String& resourceGroup)
-{
- freeSurf();
- SoftRenderer* renderer = static_cast<SoftRenderer*>(getRenderer());
- RawDataContainer texture_file;
- ResourceProvider* resource_provider = System::getSingleton().getResourceProvider();
- resource_provider->loadRawDataContainer(filename, texture_file, resourceGroup);
- ImageCodec *codec = renderer->getImageCodec();
- Texture* res = codec->load(texture_file, this);
- resource_provider->unloadRawDataContainer(texture_file);
- if (!res) {
- throw RendererException("load from file failed");
- }
-}
-
-void SoftTexture::loadFromMemory(const void* buffPtr, uint buffWidth,
- uint buffHeight,
- PixelFormat pixelFormat)
-{
- freeSurf();
- _surf = new uint32[buffWidth * buffHeight];
- _width = buffWidth;
- _height = buffHeight;
-
- switch (pixelFormat) {
- case PF_RGBA: {
- const uint32_t *src = static_cast<const uint32_t *>(buffPtr);
- uint32* line = _surf;
- uint32* end_line = _surf + _width * _height;
- for (int i = 0; line != end_line; line += _width, i++) {
- uint32* pixel = line;
- uint32* end_pixel = pixel + _width;
- for (; pixel != end_pixel; pixel++, src++) {
- ((uint8_t*)pixel)[0] = ((uint8_t*)src)[2];
- ((uint8_t*)pixel)[1] = ((uint8_t*)src)[1];
- ((uint8_t*)pixel)[2] = ((uint8_t*)src)[0];
- ((uint8_t*)pixel)[3] = ((uint8_t*)src)[3];
- }
- }
- break;
- }
- case PF_RGB: {
- const uint8_t *src = static_cast<const uint8_t *>(buffPtr);
- uint32* line = _surf;
- uint32* end_line = _surf + _width * _height;
- for (int i = 0; line != end_line; line += _width, i++) {
- uint8* pixel = (uint8*)line;
- uint8* end_pixel = (uint8*)(line + _width);
- for (; pixel != end_pixel; pixel += 4, src += 3) {
- pixel[2] = src[0];
- pixel[1] = src[1];
- pixel[0] = src[2];
- pixel[3] = 0xff;
- }
- }
- break;
- }
- default:
- throw RendererException("invalid pixel format");
- }
-}
-
-
-}
diff --git a/client/gui/softtexture.h b/client/gui/softtexture.h
deleted file mode 100644
index 668ca4f1..00000000
--- a/client/gui/softtexture.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
-/*
- Copyright (C) 2010 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifndef _softtexture_h_
-#define _softtexture_h_
-
-#include <stdint.h>
-/* CEGUI 0.6 bug, CEGUITexture.h doesn't include this, we need to */
-#include <cstddef>
-
-#include "CEGUIBase.h"
-#include "CEGUITexture.h"
-
-namespace CEGUI
-{
- class SoftTexture : public Texture
- {
- public:
- SoftTexture(Renderer* owner);
- SoftTexture(Renderer* owner, uint size);
- SoftTexture(Renderer* owner, const String& filename,
- const String& resourceGroup);
- virtual ~SoftTexture();
-
- virtual ushort getWidth(void) const { return _width;}
- virtual ushort getHeight(void) const { return _height;}
-
- virtual void loadFromFile(const String& filename, const String& resourceGroup);
- virtual void loadFromMemory(const void* buffPtr, uint buffWidth, uint buffHeight,
- PixelFormat pixelFormat);
-
- private:
- void freeSurf();
-
- private:
- uint32_t* _surf;
- ushort _width;
- ushort _height;
-
- friend class SoftRenderer;
- };
-}
-
-#endif
diff --git a/client/gui/taharez_look.imageset.c b/client/gui/taharez_look.imageset.c
deleted file mode 100644
index adaf7b85..00000000
--- a/client/gui/taharez_look.imageset.c
+++ /dev/null
@@ -1,1238 +0,0 @@
-const unsigned char taharez_look_imageset[] = {
-0x3c,0x3f,0x78,0x6d,0x6c,0x20,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x31,
-0x2e,0x30,0x22,0x20,0x3f,0x3e,0x0a,0x3c,0x49,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,
-0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x22,0x20,0x49,0x6d,0x61,0x67,0x65,0x66,0x69,0x6c,0x65,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2e,0x74,0x67,0x61,0x22,0x20,
-0x4e,0x61,0x74,0x69,0x76,0x65,0x48,0x6f,0x72,0x7a,0x52,0x65,0x73,0x3d,0x22,0x38,
-0x30,0x30,0x22,0x20,0x4e,0x61,0x74,0x69,0x76,0x65,0x56,0x65,0x72,0x74,0x52,0x65,
-0x73,0x3d,0x22,0x36,0x30,0x30,0x22,0x20,0x41,0x75,0x74,0x6f,0x53,0x63,0x61,0x6c,
-0x65,0x64,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x43,0x6c,0x69,0x65,
-0x6e,0x74,0x42,0x72,0x75,0x73,0x68,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x32,
-0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x32,0x22,0x20,0x57,0x69,0x64,0x74,0x68,
-0x3d,0x22,0x36,0x34,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x36,0x34,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,
-0x4e,0x61,0x6d,0x65,0x3d,0x22,0x47,0x65,0x6e,0x65,0x72,0x69,0x63,0x42,0x72,0x75,
-0x73,0x68,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x39,0x22,0x20,0x59,0x50,0x6f,
-0x73,0x3d,0x22,0x37,0x31,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x22,
-0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x22,0x20,0x2f,0x3e,0x0a,0x09,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x57,0x69,0x6e,
-0x64,0x6f,0x77,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x58,0x50,0x6f,
-0x73,0x3d,0x22,0x36,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x39,0x35,0x22,0x20,
-0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,
-0x3d,0x22,0x32,0x32,0x22,0x20,0x58,0x4f,0x66,0x66,0x73,0x65,0x74,0x3d,0x22,0x34,
-0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,
-0x65,0x3d,0x22,0x57,0x69,0x6e,0x64,0x6f,0x77,0x52,0x69,0x67,0x68,0x74,0x45,0x64,
-0x67,0x65,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x33,0x34,0x22,0x20,0x59,0x50,
-0x6f,0x73,0x3d,0x22,0x39,0x35,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,
-0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x32,0x32,0x22,0x20,0x58,0x4f,
-0x66,0x66,0x73,0x65,0x74,0x3d,0x22,0x2d,0x35,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x57,0x69,0x6e,0x64,
-0x6f,0x77,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,
-0x22,0x39,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x36,0x38,0x22,0x20,0x57,0x69,
-0x64,0x74,0x68,0x3d,0x22,0x32,0x33,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,
-0x22,0x31,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,
-0x61,0x6d,0x65,0x3d,0x22,0x57,0x69,0x6e,0x64,0x6f,0x77,0x42,0x6f,0x74,0x74,0x6f,
-0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x39,0x22,0x20,
-0x59,0x50,0x6f,0x73,0x3d,0x22,0x31,0x34,0x33,0x22,0x20,0x57,0x69,0x64,0x74,0x68,
-0x3d,0x22,0x32,0x33,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x22,
-0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,
-0x3d,0x22,0x57,0x69,0x6e,0x64,0x6f,0x77,0x54,0x6f,0x70,0x4c,0x65,0x66,0x74,0x22,
-0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x32,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,
-0x36,0x38,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x35,0x22,0x20,0x48,0x65,
-0x69,0x67,0x68,0x74,0x3d,0x22,0x32,0x34,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x57,0x69,0x6e,0x64,0x6f,
-0x77,0x54,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,
-0x22,0x33,0x34,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x36,0x38,0x22,0x20,0x57,
-0x69,0x64,0x74,0x68,0x3d,0x22,0x35,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,
-0x22,0x32,0x34,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,
-0x4e,0x61,0x6d,0x65,0x3d,0x22,0x57,0x69,0x6e,0x64,0x6f,0x77,0x42,0x6f,0x74,0x74,
-0x6f,0x6d,0x4c,0x65,0x66,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x32,0x22,
-0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x31,0x32,0x30,0x22,0x20,0x57,0x69,0x64,0x74,
-0x68,0x3d,0x22,0x35,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x32,0x34,
-0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,
-0x65,0x3d,0x22,0x57,0x69,0x6e,0x64,0x6f,0x77,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x52,
-0x69,0x67,0x68,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x33,0x34,0x22,0x20,
-0x59,0x50,0x6f,0x73,0x3d,0x22,0x31,0x32,0x30,0x22,0x20,0x57,0x69,0x64,0x74,0x68,
-0x3d,0x22,0x35,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x32,0x34,0x22,
-0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,
-0x3d,0x22,0x42,0x75,0x74,0x74,0x6f,0x6e,0x4c,0x65,0x66,0x74,0x4e,0x6f,0x72,0x6d,
-0x61,0x6c,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x36,0x38,0x22,0x20,0x59,0x50,
-0x6f,0x73,0x3d,0x22,0x32,0x30,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,
-0x32,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x36,0x22,0x20,0x2f,
-0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,
-0x42,0x75,0x74,0x74,0x6f,0x6e,0x4d,0x69,0x64,0x64,0x6c,0x65,0x4e,0x6f,0x72,0x6d,
-0x61,0x6c,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x38,0x32,0x22,0x20,0x59,0x50,
-0x6f,0x73,0x3d,0x22,0x32,0x30,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,
-0x32,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x36,0x22,0x20,0x2f,
-0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,
-0x42,0x75,0x74,0x74,0x6f,0x6e,0x52,0x69,0x67,0x68,0x74,0x4e,0x6f,0x72,0x6d,0x61,
-0x6c,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x39,0x36,0x22,0x20,0x59,0x50,0x6f,
-0x73,0x3d,0x22,0x32,0x30,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x32,
-0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x36,0x22,0x20,0x2f,0x3e,
-0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x42,
-0x75,0x74,0x74,0x6f,0x6e,0x4c,0x65,0x66,0x74,0x50,0x75,0x73,0x68,0x65,0x64,0x22,
-0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x36,0x38,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,
-0x22,0x33,0x38,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x32,0x22,0x20,
-0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x42,0x75,0x74,
-0x74,0x6f,0x6e,0x4d,0x69,0x64,0x64,0x6c,0x65,0x50,0x75,0x73,0x68,0x65,0x64,0x22,
-0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x38,0x32,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,
-0x22,0x33,0x38,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x32,0x22,0x20,
-0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x42,0x75,0x74,
-0x74,0x6f,0x6e,0x52,0x69,0x67,0x68,0x74,0x50,0x75,0x73,0x68,0x65,0x64,0x22,0x20,
-0x58,0x50,0x6f,0x73,0x3d,0x22,0x39,0x36,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,
-0x33,0x38,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x32,0x22,0x20,0x48,
-0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x42,0x75,0x74,0x74,
-0x6f,0x6e,0x4c,0x65,0x66,0x74,0x48,0x69,0x67,0x68,0x6c,0x69,0x67,0x68,0x74,0x22,
-0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x36,0x38,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,
-0x22,0x35,0x36,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x32,0x22,0x20,
-0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x42,0x75,0x74,
-0x74,0x6f,0x6e,0x4d,0x69,0x64,0x64,0x6c,0x65,0x48,0x69,0x67,0x68,0x6c,0x69,0x67,
-0x68,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x38,0x32,0x22,0x20,0x59,0x50,
-0x6f,0x73,0x3d,0x22,0x35,0x36,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,
-0x32,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x36,0x22,0x20,0x2f,
-0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,
-0x42,0x75,0x74,0x74,0x6f,0x6e,0x52,0x69,0x67,0x68,0x74,0x48,0x69,0x67,0x68,0x6c,
-0x69,0x67,0x68,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x39,0x36,0x22,0x20,
-0x59,0x50,0x6f,0x73,0x3d,0x22,0x35,0x36,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,
-0x22,0x31,0x32,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x36,0x22,
-0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,
-0x3d,0x22,0x43,0x68,0x65,0x63,0x6b,0x62,0x6f,0x78,0x4e,0x6f,0x72,0x6d,0x61,0x6c,
-0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x31,0x30,0x22,0x20,0x59,0x50,0x6f,
-0x73,0x3d,0x22,0x32,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x32,0x22,
-0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x32,0x22,0x20,0x2f,0x3e,0x0a,
-0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x43,0x68,
-0x65,0x63,0x6b,0x62,0x6f,0x78,0x48,0x6f,0x76,0x65,0x72,0x22,0x20,0x58,0x50,0x6f,
-0x73,0x3d,0x22,0x31,0x31,0x30,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x33,0x30,
-0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x32,0x22,0x20,0x48,0x65,0x69,
-0x67,0x68,0x74,0x3d,0x22,0x31,0x32,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x43,0x68,0x65,0x63,0x6b,0x62,
-0x6f,0x78,0x4d,0x61,0x72,0x6b,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x31,
-0x30,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x31,0x36,0x22,0x20,0x57,0x69,0x64,
-0x74,0x68,0x3d,0x22,0x31,0x32,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,
-0x31,0x32,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,
-0x61,0x6d,0x65,0x3d,0x22,0x52,0x61,0x64,0x69,0x6f,0x42,0x75,0x74,0x74,0x6f,0x6e,
-0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x32,
-0x34,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x32,0x22,0x20,0x57,0x69,0x64,0x74,
-0x68,0x3d,0x22,0x31,0x32,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,
-0x32,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,
-0x6d,0x65,0x3d,0x22,0x52,0x61,0x64,0x69,0x6f,0x42,0x75,0x74,0x74,0x6f,0x6e,0x48,
-0x6f,0x76,0x65,0x72,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x32,0x34,0x22,
-0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x33,0x30,0x22,0x20,0x57,0x69,0x64,0x74,0x68,
-0x3d,0x22,0x31,0x32,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x32,
-0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,
-0x65,0x3d,0x22,0x52,0x61,0x64,0x69,0x6f,0x42,0x75,0x74,0x74,0x6f,0x6e,0x4d,0x61,
-0x72,0x6b,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x32,0x34,0x22,0x20,0x59,
-0x50,0x6f,0x73,0x3d,0x22,0x31,0x36,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,
-0x31,0x32,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x32,0x22,0x20,
-0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,
-0x22,0x54,0x69,0x74,0x6c,0x65,0x62,0x61,0x72,0x4c,0x65,0x66,0x74,0x22,0x20,0x58,
-0x50,0x6f,0x73,0x3d,0x22,0x36,0x38,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x32,
-0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x38,0x22,0x20,0x48,0x65,0x69,0x67,
-0x68,0x74,0x3d,0x22,0x31,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x69,0x74,0x6c,0x65,0x62,0x61,
-0x72,0x4d,0x69,0x64,0x64,0x6c,0x65,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x37,
-0x38,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x32,0x22,0x20,0x57,0x69,0x64,0x74,
-0x68,0x3d,0x22,0x38,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x36,
-0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,
-0x65,0x3d,0x22,0x54,0x69,0x74,0x6c,0x65,0x62,0x61,0x72,0x52,0x69,0x67,0x68,0x74,
-0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x38,0x38,0x22,0x20,0x59,0x50,0x6f,0x73,
-0x3d,0x22,0x32,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x38,0x22,0x20,0x48,
-0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4e,0x65,0x77,0x54,
-0x69,0x74,0x6c,0x65,0x62,0x61,0x72,0x4c,0x65,0x66,0x74,0x22,0x20,0x58,0x50,0x6f,
-0x73,0x3d,0x22,0x36,0x31,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x31,0x32,0x37,
-0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x33,0x22,0x20,0x48,0x65,0x69,
-0x67,0x68,0x74,0x3d,0x22,0x31,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4e,0x65,0x77,0x54,0x69,0x74,
-0x6c,0x65,0x62,0x61,0x72,0x4d,0x69,0x64,0x64,0x6c,0x65,0x22,0x20,0x58,0x50,0x6f,
-0x73,0x3d,0x22,0x37,0x37,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x31,0x32,0x37,
-0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x32,0x22,0x20,0x48,0x65,0x69,
-0x67,0x68,0x74,0x3d,0x22,0x31,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4e,0x65,0x77,0x54,0x69,0x74,
-0x6c,0x65,0x62,0x61,0x72,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,
-0x3d,0x22,0x39,0x32,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x31,0x32,0x37,0x22,
-0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x32,0x22,0x20,0x48,0x65,0x69,0x67,
-0x68,0x74,0x3d,0x22,0x31,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x53,0x79,0x73,0x41,0x72,0x65,0x61,
-0x4d,0x69,0x64,0x64,0x6c,0x65,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x30,
-0x37,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x31,0x32,0x37,0x22,0x20,0x57,0x69,
-0x64,0x74,0x68,0x3d,0x22,0x31,0x32,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,
-0x22,0x31,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,
-0x4e,0x61,0x6d,0x65,0x3d,0x22,0x53,0x79,0x73,0x41,0x72,0x65,0x61,0x52,0x69,0x67,
-0x68,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x32,0x32,0x22,0x20,0x59,
-0x50,0x6f,0x73,0x3d,0x22,0x31,0x32,0x37,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,
-0x22,0x31,0x33,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x36,0x22,
-0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,
-0x3d,0x22,0x53,0x74,0x61,0x74,0x69,0x63,0x4c,0x65,0x66,0x74,0x22,0x20,0x58,0x50,
-0x6f,0x73,0x3d,0x22,0x34,0x31,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x38,0x39,
-0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x36,0x22,0x20,0x48,0x65,0x69,0x67,
-0x68,0x74,0x3d,0x22,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x53,0x74,0x61,0x74,0x69,0x63,0x52,0x69,
-0x67,0x68,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x36,0x33,0x22,0x20,0x59,
-0x50,0x6f,0x73,0x3d,0x22,0x38,0x39,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,
-0x36,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x36,0x22,0x20,0x2f,0x3e,
-0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x53,
-0x74,0x61,0x74,0x69,0x63,0x54,0x6f,0x70,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,
-0x35,0x32,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x37,0x38,0x22,0x20,0x57,0x69,
-0x64,0x74,0x68,0x3d,0x22,0x36,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,
-0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,
-0x6d,0x65,0x3d,0x22,0x53,0x74,0x61,0x74,0x69,0x63,0x42,0x6f,0x74,0x74,0x6f,0x6d,
-0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x35,0x32,0x22,0x20,0x59,0x50,0x6f,0x73,
-0x3d,0x22,0x31,0x30,0x30,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x36,0x22,
-0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x53,0x74,0x61,
-0x74,0x69,0x63,0x54,0x6f,0x70,0x4c,0x65,0x66,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,
-0x3d,0x22,0x34,0x31,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x37,0x38,0x22,0x20,
-0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x36,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,
-0x3d,0x22,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,
-0x4e,0x61,0x6d,0x65,0x3d,0x22,0x53,0x74,0x61,0x74,0x69,0x63,0x54,0x6f,0x70,0x52,
-0x69,0x67,0x68,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x36,0x33,0x22,0x20,
-0x59,0x50,0x6f,0x73,0x3d,0x22,0x37,0x38,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,
-0x22,0x36,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x36,0x22,0x20,0x2f,
-0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,
-0x53,0x74,0x61,0x74,0x69,0x63,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,
-0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x34,0x31,0x22,0x20,0x59,0x50,0x6f,0x73,
-0x3d,0x22,0x31,0x30,0x30,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x36,0x22,
-0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x53,0x74,0x61,
-0x74,0x69,0x63,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x22,0x20,
-0x58,0x50,0x6f,0x73,0x3d,0x22,0x36,0x33,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,
-0x31,0x30,0x30,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x36,0x22,0x20,0x48,
-0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x53,0x74,0x61,0x74,0x69,
-0x63,0x42,0x61,0x63,0x6b,0x64,0x72,0x6f,0x70,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,
-0x22,0x35,0x32,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x38,0x39,0x22,0x20,0x57,
-0x69,0x64,0x74,0x68,0x3d,0x22,0x36,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,
-0x22,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,
-0x61,0x6d,0x65,0x3d,0x22,0x50,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x42,0x61,0x72,
-0x4c,0x65,0x66,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x37,0x31,0x22,0x20,
-0x59,0x50,0x6f,0x73,0x3d,0x22,0x37,0x34,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,
-0x22,0x37,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x32,0x22,0x20,
-0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,
-0x22,0x50,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x42,0x61,0x72,0x4d,0x69,0x64,0x64,
-0x6c,0x65,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x38,0x30,0x22,0x20,0x59,0x50,
-0x6f,0x73,0x3d,0x22,0x37,0x34,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x36,
-0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x32,0x22,0x20,0x2f,0x3e,
-0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x50,
-0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x42,0x61,0x72,0x52,0x69,0x67,0x68,0x74,0x22,
-0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x38,0x38,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,
-0x22,0x37,0x34,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x36,0x22,0x20,0x48,
-0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x32,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x50,0x72,0x6f,0x67,
-0x72,0x65,0x73,0x73,0x42,0x61,0x72,0x44,0x69,0x6d,0x53,0x65,0x67,0x6d,0x65,0x6e,
-0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x39,0x36,0x22,0x20,0x59,0x50,0x6f,
-0x73,0x3d,0x22,0x37,0x34,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x38,0x22,
-0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x32,0x22,0x20,0x2f,0x3e,0x0a,
-0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x50,0x72,
-0x6f,0x67,0x72,0x65,0x73,0x73,0x42,0x61,0x72,0x4c,0x69,0x74,0x53,0x65,0x67,0x6d,
-0x65,0x6e,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x30,0x36,0x22,0x20,
-0x59,0x50,0x6f,0x73,0x3d,0x22,0x37,0x34,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,
-0x22,0x38,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x32,0x22,0x20,
-0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,
-0x22,0x45,0x64,0x69,0x74,0x42,0x6f,0x78,0x4c,0x65,0x66,0x74,0x22,0x20,0x58,0x50,
-0x6f,0x73,0x3d,0x22,0x34,0x31,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x31,0x30,
-0x38,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x34,0x22,0x20,0x48,0x65,0x69,
-0x67,0x68,0x74,0x3d,0x22,0x31,0x38,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x45,0x64,0x69,0x74,0x42,0x6f,
-0x78,0x4d,0x69,0x64,0x64,0x6c,0x65,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x34,
-0x37,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x31,0x30,0x38,0x22,0x20,0x57,0x69,
-0x64,0x74,0x68,0x3d,0x22,0x34,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,
-0x31,0x38,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,
-0x61,0x6d,0x65,0x3d,0x22,0x45,0x64,0x69,0x74,0x42,0x6f,0x78,0x52,0x69,0x67,0x68,
-0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x35,0x33,0x22,0x20,0x59,0x50,0x6f,
-0x73,0x3d,0x22,0x31,0x30,0x38,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x34,
-0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x38,0x22,0x20,0x2f,0x3e,
-0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x45,
-0x64,0x69,0x74,0x42,0x6f,0x78,0x43,0x61,0x72,0x61,0x74,0x22,0x20,0x58,0x50,0x6f,
-0x73,0x3d,0x22,0x36,0x30,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x31,0x30,0x38,
-0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x34,0x22,0x20,0x48,0x65,0x69,0x67,
-0x68,0x74,0x3d,0x22,0x31,0x38,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x53,0x70,0x69,0x6e,0x6e,0x65,0x72,
-0x55,0x70,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,
-0x36,0x38,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x31,0x31,0x30,0x22,0x20,0x57,
-0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x30,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,
-0x3d,0x22,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,
-0x4e,0x61,0x6d,0x65,0x3d,0x22,0x53,0x70,0x69,0x6e,0x6e,0x65,0x72,0x44,0x6f,0x77,
-0x6e,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x36,
-0x38,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x31,0x31,0x38,0x22,0x20,0x57,0x69,
-0x64,0x74,0x68,0x3d,0x22,0x31,0x30,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,
-0x22,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,
-0x61,0x6d,0x65,0x3d,0x22,0x53,0x70,0x69,0x6e,0x6e,0x65,0x72,0x55,0x70,0x48,0x6f,
-0x76,0x65,0x72,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x38,0x32,0x22,0x20,0x59,
-0x50,0x6f,0x73,0x3d,0x22,0x31,0x31,0x30,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,
-0x22,0x31,0x30,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x36,0x22,0x20,
-0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,
-0x22,0x53,0x70,0x69,0x6e,0x6e,0x65,0x72,0x44,0x6f,0x77,0x6e,0x48,0x6f,0x76,0x65,
-0x72,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x38,0x32,0x22,0x20,0x59,0x50,0x6f,
-0x73,0x3d,0x22,0x31,0x31,0x38,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,
-0x30,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x36,0x22,0x20,0x2f,0x3e,
-0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x54,
-0x65,0x78,0x74,0x53,0x65,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x42,0x72,0x75,0x73,
-0x68,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x38,0x22,0x20,0x59,0x50,0x6f,0x73,
-0x3d,0x22,0x37,0x30,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x36,0x22,
-0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x36,0x22,0x20,0x2f,0x3e,0x0a,
-0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x56,0x65,
-0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x54,0x6f,0x70,0x22,0x20,0x58,0x50,0x6f,
-0x73,0x3d,0x22,0x31,0x38,0x32,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x32,0x22,
-0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x32,0x30,0x22,0x20,0x48,0x65,0x69,0x67,
-0x68,0x74,0x3d,0x22,0x38,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,
-0x6c,0x6c,0x4d,0x69,0x64,0x64,0x6c,0x65,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,
-0x31,0x38,0x32,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x31,0x32,0x22,0x20,0x57,
-0x69,0x64,0x74,0x68,0x3d,0x22,0x32,0x30,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,
-0x3d,0x22,0x38,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,
-0x4e,0x61,0x6d,0x65,0x3d,0x22,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,
-0x42,0x6f,0x74,0x74,0x6f,0x6d,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x38,
-0x32,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x32,0x32,0x22,0x20,0x57,0x69,0x64,
-0x74,0x68,0x3d,0x22,0x32,0x30,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,
-0x38,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,
-0x6d,0x65,0x3d,0x22,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x42,0x61,
-0x72,0x53,0x65,0x67,0x6d,0x65,0x6e,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,
-0x32,0x30,0x36,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x32,0x22,0x20,0x57,0x69,
-0x64,0x74,0x68,0x3d,0x22,0x34,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,
-0x31,0x30,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,
-0x61,0x6d,0x65,0x3d,0x22,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x54,
-0x68,0x75,0x6d,0x62,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x58,0x50,0x6f,0x73,
-0x3d,0x22,0x32,0x31,0x34,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x32,0x22,0x20,
-0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x38,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,
-0x3d,0x22,0x32,0x34,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,
-0x6c,0x54,0x68,0x75,0x6d,0x62,0x48,0x6f,0x76,0x65,0x72,0x22,0x20,0x58,0x50,0x6f,
-0x73,0x3d,0x22,0x32,0x32,0x34,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x32,0x22,
-0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x38,0x22,0x20,0x48,0x65,0x69,0x67,0x68,
-0x74,0x3d,0x22,0x32,0x34,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,
-0x6c,0x6c,0x55,0x70,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x58,0x50,0x6f,0x73,
-0x3d,0x22,0x31,0x39,0x36,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x33,0x32,0x22,
-0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x32,0x22,0x20,0x48,0x65,0x69,0x67,
-0x68,0x74,0x3d,0x22,0x31,0x32,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x56,0x65,0x72,0x74,0x53,0x63,0x72,
-0x6f,0x6c,0x6c,0x44,0x6f,0x77,0x6e,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x58,
-0x50,0x6f,0x73,0x3d,0x22,0x31,0x38,0x32,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,
-0x33,0x32,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x32,0x22,0x20,0x48,
-0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x32,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x56,0x65,0x72,0x74,
-0x53,0x63,0x72,0x6f,0x6c,0x6c,0x55,0x70,0x48,0x6f,0x76,0x65,0x72,0x22,0x20,0x58,
-0x50,0x6f,0x73,0x3d,0x22,0x31,0x39,0x36,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,
-0x34,0x36,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x32,0x22,0x20,0x48,
-0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x32,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x56,0x65,0x72,0x74,
-0x53,0x63,0x72,0x6f,0x6c,0x6c,0x44,0x6f,0x77,0x6e,0x48,0x6f,0x76,0x65,0x72,0x22,
-0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x38,0x32,0x22,0x20,0x59,0x50,0x6f,0x73,
-0x3d,0x22,0x34,0x36,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x32,0x22,
-0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x32,0x22,0x20,0x2f,0x3e,0x0a,
-0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4d,0x69,
-0x6e,0x69,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x42,0x61,0x72,0x53,
-0x65,0x67,0x6d,0x65,0x6e,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x32,0x30,
-0x37,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x36,0x30,0x22,0x20,0x57,0x69,0x64,
-0x74,0x68,0x3d,0x22,0x34,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,
-0x30,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,
-0x6d,0x65,0x3d,0x22,0x4d,0x69,0x6e,0x69,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,
-0x6c,0x6c,0x54,0x68,0x75,0x6d,0x62,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x58,
-0x50,0x6f,0x73,0x3d,0x22,0x32,0x31,0x34,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,
-0x35,0x39,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x37,0x22,0x20,0x48,0x65,
-0x69,0x67,0x68,0x74,0x3d,0x22,0x32,0x32,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4d,0x69,0x6e,0x69,0x56,
-0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x54,0x68,0x75,0x6d,0x62,0x54,0x6f,
-0x70,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x32,
-0x31,0x34,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x35,0x39,0x22,0x20,0x57,0x69,
-0x64,0x74,0x68,0x3d,0x22,0x37,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,
-0x35,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,
-0x6d,0x65,0x3d,0x22,0x4d,0x69,0x6e,0x69,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,
-0x6c,0x6c,0x54,0x68,0x75,0x6d,0x62,0x4d,0x69,0x64,0x64,0x6c,0x65,0x4e,0x6f,0x72,
-0x6d,0x61,0x6c,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x32,0x31,0x34,0x22,0x20,
-0x59,0x50,0x6f,0x73,0x3d,0x22,0x36,0x35,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,
-0x22,0x37,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x35,0x22,0x20,0x2f,
-0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,
-0x4d,0x69,0x6e,0x69,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x54,0x68,
-0x75,0x6d,0x62,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,
-0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x32,0x31,0x34,0x22,0x20,0x59,0x50,0x6f,0x73,
-0x3d,0x22,0x37,0x36,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x37,0x22,0x20,
-0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x35,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4d,0x69,0x6e,0x69,
-0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x54,0x68,0x75,0x6d,0x62,0x54,
-0x6f,0x70,0x48,0x6f,0x76,0x65,0x72,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x32,
-0x32,0x33,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x35,0x39,0x22,0x20,0x57,0x69,
-0x64,0x74,0x68,0x3d,0x22,0x37,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,
-0x35,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,
-0x6d,0x65,0x3d,0x22,0x4d,0x69,0x6e,0x69,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,
-0x6c,0x6c,0x54,0x68,0x75,0x6d,0x62,0x4d,0x69,0x64,0x64,0x6c,0x65,0x48,0x6f,0x76,
-0x65,0x72,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x32,0x32,0x33,0x22,0x20,0x59,
-0x50,0x6f,0x73,0x3d,0x22,0x36,0x35,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,
-0x37,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x35,0x22,0x20,0x2f,0x3e,
-0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4d,
-0x69,0x6e,0x69,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x54,0x68,0x75,
-0x6d,0x62,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x48,0x6f,0x76,0x65,0x72,0x22,0x20,0x58,
-0x50,0x6f,0x73,0x3d,0x22,0x32,0x32,0x33,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,
-0x37,0x36,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x37,0x22,0x20,0x48,0x65,
-0x69,0x67,0x68,0x74,0x3d,0x22,0x35,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4d,0x69,0x6e,0x69,0x56,0x65,
-0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x54,0x68,0x75,0x6d,0x62,0x48,0x6f,0x76,
-0x65,0x72,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x32,0x32,0x33,0x22,0x20,0x59,
-0x50,0x6f,0x73,0x3d,0x22,0x35,0x39,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,
-0x37,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x32,0x32,0x22,0x20,0x2f,
-0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,
-0x4d,0x69,0x6e,0x69,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x55,0x70,
-0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x39,
-0x34,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x36,0x30,0x22,0x20,0x57,0x69,0x64,
-0x74,0x68,0x3d,0x22,0x31,0x30,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,
-0x39,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,
-0x6d,0x65,0x3d,0x22,0x4d,0x69,0x6e,0x69,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,
-0x6c,0x6c,0x44,0x6f,0x77,0x6e,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x58,0x50,
-0x6f,0x73,0x3d,0x22,0x31,0x38,0x32,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x35,
-0x39,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x30,0x22,0x20,0x48,0x65,
-0x69,0x67,0x68,0x74,0x3d,0x22,0x39,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4d,0x69,0x6e,0x69,0x56,0x65,
-0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x55,0x70,0x48,0x6f,0x76,0x65,0x72,0x22,
-0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x39,0x34,0x22,0x20,0x59,0x50,0x6f,0x73,
-0x3d,0x22,0x37,0x30,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x30,0x22,
-0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x39,0x22,0x20,0x2f,0x3e,0x0a,0x09,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4d,0x69,0x6e,
-0x69,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x44,0x6f,0x77,0x6e,0x48,
-0x6f,0x76,0x65,0x72,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x38,0x32,0x22,
-0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x36,0x39,0x22,0x20,0x57,0x69,0x64,0x74,0x68,
-0x3d,0x22,0x31,0x30,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x39,0x22,
-0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,
-0x3d,0x22,0x56,0x65,0x72,0x74,0x53,0x6c,0x69,0x64,0x65,0x72,0x42,0x6f,0x64,0x79,
-0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x32,0x33,0x34,0x22,0x20,0x59,0x50,0x6f,
-0x73,0x3d,0x22,0x32,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x39,0x22,0x20,
-0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x34,0x38,0x22,0x20,0x2f,0x3e,0x0a,0x09,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x56,0x65,0x72,
-0x74,0x53,0x6c,0x69,0x64,0x65,0x72,0x54,0x68,0x75,0x6d,0x62,0x4e,0x6f,0x72,0x6d,
-0x61,0x6c,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x32,0x31,0x37,0x22,0x20,0x59,
-0x50,0x6f,0x73,0x3d,0x22,0x32,0x38,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,
-0x31,0x35,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x36,0x22,0x20,0x2f,
-0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,
-0x56,0x65,0x72,0x74,0x53,0x6c,0x69,0x64,0x65,0x72,0x54,0x68,0x75,0x6d,0x62,0x48,
-0x6f,0x76,0x65,0x72,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x32,0x31,0x37,0x22,
-0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x33,0x36,0x22,0x20,0x57,0x69,0x64,0x74,0x68,
-0x3d,0x22,0x31,0x35,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x36,0x22,
-0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,
-0x3d,0x22,0x4d,0x69,0x6e,0x69,0x48,0x6f,0x72,0x7a,0x53,0x63,0x72,0x6f,0x6c,0x6c,
-0x42,0x61,0x72,0x53,0x65,0x67,0x6d,0x65,0x6e,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,
-0x3d,0x22,0x32,0x34,0x34,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x38,0x30,0x22,
-0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x30,0x22,0x20,0x48,0x65,0x69,0x67,
-0x68,0x74,0x3d,0x22,0x34,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4d,0x69,0x6e,0x69,0x48,0x6f,0x72,0x7a,
-0x53,0x63,0x72,0x6f,0x6c,0x6c,0x54,0x68,0x75,0x6d,0x62,0x4e,0x6f,0x72,0x6d,0x61,
-0x6c,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x32,0x33,0x33,0x22,0x20,0x59,0x50,
-0x6f,0x73,0x3d,0x22,0x38,0x37,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x32,
-0x32,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x37,0x22,0x20,0x2f,0x3e,
-0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4d,
-0x69,0x6e,0x69,0x48,0x6f,0x72,0x7a,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x54,0x68,0x75,
-0x6d,0x62,0x4c,0x65,0x66,0x74,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x58,0x50,
-0x6f,0x73,0x3d,0x22,0x32,0x33,0x33,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x38,
-0x37,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x35,0x22,0x20,0x48,0x65,0x69,
-0x67,0x68,0x74,0x3d,0x22,0x37,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4d,0x69,0x6e,0x69,0x48,0x6f,0x72,
-0x7a,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x54,0x68,0x75,0x6d,0x62,0x4d,0x69,0x64,0x64,
-0x6c,0x65,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,
-0x32,0x33,0x39,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x38,0x37,0x22,0x20,0x57,
-0x69,0x64,0x74,0x68,0x3d,0x22,0x35,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,
-0x22,0x37,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,
-0x61,0x6d,0x65,0x3d,0x22,0x4d,0x69,0x6e,0x69,0x48,0x6f,0x72,0x7a,0x53,0x63,0x72,
-0x6f,0x6c,0x6c,0x54,0x68,0x75,0x6d,0x62,0x52,0x69,0x67,0x68,0x74,0x4e,0x6f,0x72,
-0x6d,0x61,0x6c,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x32,0x35,0x30,0x22,0x20,
-0x59,0x50,0x6f,0x73,0x3d,0x22,0x38,0x37,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,
-0x22,0x35,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x37,0x22,0x20,0x2f,
-0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,
-0x4d,0x69,0x6e,0x69,0x48,0x6f,0x72,0x7a,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x54,0x68,
-0x75,0x6d,0x62,0x48,0x6f,0x76,0x65,0x72,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,
-0x32,0x33,0x33,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x39,0x36,0x22,0x20,0x57,
-0x69,0x64,0x74,0x68,0x3d,0x22,0x32,0x32,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,
-0x3d,0x22,0x37,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,
-0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4d,0x69,0x6e,0x69,0x48,0x6f,0x72,0x7a,0x53,0x63,
-0x72,0x6f,0x6c,0x6c,0x54,0x68,0x75,0x6d,0x62,0x4c,0x65,0x66,0x74,0x48,0x6f,0x76,
-0x65,0x72,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x32,0x33,0x33,0x22,0x20,0x59,
-0x50,0x6f,0x73,0x3d,0x22,0x39,0x36,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,
-0x35,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x37,0x22,0x20,0x2f,0x3e,
-0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4d,
-0x69,0x6e,0x69,0x48,0x6f,0x72,0x7a,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x54,0x68,0x75,
-0x6d,0x62,0x4d,0x69,0x64,0x64,0x6c,0x65,0x48,0x6f,0x76,0x65,0x72,0x22,0x20,0x58,
-0x50,0x6f,0x73,0x3d,0x22,0x32,0x33,0x39,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,
-0x39,0x36,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x35,0x22,0x20,0x48,0x65,
-0x69,0x67,0x68,0x74,0x3d,0x22,0x37,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4d,0x69,0x6e,0x69,0x48,0x6f,
-0x72,0x7a,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x54,0x68,0x75,0x6d,0x62,0x52,0x69,0x67,
-0x68,0x74,0x48,0x6f,0x76,0x65,0x72,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x32,
-0x35,0x30,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x39,0x36,0x22,0x20,0x57,0x69,
-0x64,0x74,0x68,0x3d,0x22,0x35,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,
-0x37,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,
-0x6d,0x65,0x3d,0x22,0x4d,0x69,0x6e,0x69,0x48,0x6f,0x72,0x7a,0x53,0x63,0x72,0x6f,
-0x6c,0x6c,0x4c,0x65,0x66,0x74,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x58,0x50,
-0x6f,0x73,0x3d,0x22,0x32,0x34,0x36,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x35,
-0x35,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x39,0x22,0x20,0x48,0x65,0x69,
-0x67,0x68,0x74,0x3d,0x22,0x31,0x30,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4d,0x69,0x6e,0x69,0x48,0x6f,
-0x72,0x7a,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x52,0x69,0x67,0x68,0x74,0x4e,0x6f,0x72,
-0x6d,0x61,0x6c,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x32,0x34,0x35,0x22,0x20,
-0x59,0x50,0x6f,0x73,0x3d,0x22,0x36,0x37,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,
-0x22,0x39,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x30,0x22,0x20,
-0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,
-0x22,0x4d,0x69,0x6e,0x69,0x48,0x6f,0x72,0x7a,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x4c,
-0x65,0x66,0x74,0x48,0x6f,0x76,0x65,0x72,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,
-0x32,0x33,0x36,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x35,0x35,0x22,0x20,0x57,
-0x69,0x64,0x74,0x68,0x3d,0x22,0x39,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,
-0x22,0x31,0x30,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,
-0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4d,0x69,0x6e,0x69,0x48,0x6f,0x72,0x7a,0x53,0x63,
-0x72,0x6f,0x6c,0x6c,0x52,0x69,0x67,0x68,0x74,0x48,0x6f,0x76,0x65,0x72,0x22,0x20,
-0x58,0x50,0x6f,0x73,0x3d,0x22,0x32,0x33,0x35,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,
-0x22,0x36,0x37,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x39,0x22,0x20,0x48,
-0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x30,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4c,0x69,0x73,0x74,
-0x62,0x6f,0x78,0x4c,0x65,0x66,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x34,
-0x31,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x38,0x39,0x22,0x20,0x57,0x69,0x64,
-0x74,0x68,0x3d,0x22,0x37,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x36,
-0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,
-0x65,0x3d,0x22,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,0x52,0x69,0x67,0x68,0x74,0x22,
-0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x36,0x32,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,
-0x22,0x38,0x39,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x37,0x22,0x20,0x48,
-0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4c,0x69,0x73,0x74,0x62,
-0x6f,0x78,0x54,0x6f,0x70,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x35,0x32,0x22,
-0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x37,0x38,0x22,0x20,0x57,0x69,0x64,0x74,0x68,
-0x3d,0x22,0x36,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x37,0x22,0x20,
-0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,
-0x22,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x22,0x20,
-0x58,0x50,0x6f,0x73,0x3d,0x22,0x35,0x32,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,
-0x39,0x39,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x36,0x22,0x20,0x48,0x65,
-0x69,0x67,0x68,0x74,0x3d,0x22,0x37,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4c,0x69,0x73,0x74,0x62,0x6f,
-0x78,0x54,0x6f,0x70,0x4c,0x65,0x66,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,
-0x34,0x31,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x37,0x38,0x22,0x20,0x57,0x69,
-0x64,0x74,0x68,0x3d,0x22,0x37,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,
-0x37,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,
-0x6d,0x65,0x3d,0x22,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,0x54,0x6f,0x70,0x52,0x69,
-0x67,0x68,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x36,0x32,0x22,0x20,0x59,
-0x50,0x6f,0x73,0x3d,0x22,0x37,0x38,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,
-0x37,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x37,0x22,0x20,0x2f,0x3e,
-0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4c,
-0x69,0x73,0x74,0x62,0x6f,0x78,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,
-0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x34,0x31,0x22,0x20,0x59,0x50,0x6f,0x73,
-0x3d,0x22,0x39,0x39,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x37,0x22,0x20,
-0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x37,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4c,0x69,0x73,0x74,
-0x62,0x6f,0x78,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x22,0x20,
-0x58,0x50,0x6f,0x73,0x3d,0x22,0x36,0x32,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,
-0x39,0x39,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x37,0x22,0x20,0x48,0x65,
-0x69,0x67,0x68,0x74,0x3d,0x22,0x37,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4c,0x69,0x73,0x74,0x62,0x6f,
-0x78,0x42,0x61,0x63,0x6b,0x64,0x72,0x6f,0x70,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,
-0x22,0x35,0x32,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x38,0x39,0x22,0x20,0x57,
-0x69,0x64,0x74,0x68,0x3d,0x22,0x36,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,
-0x22,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,
-0x61,0x6d,0x65,0x3d,0x22,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,0x53,0x65,0x6c,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x42,0x72,0x75,0x73,0x68,0x22,0x20,0x58,0x50,0x6f,0x73,
-0x3d,0x22,0x38,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x37,0x30,0x22,0x20,0x57,
-0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x36,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,
-0x3d,0x22,0x31,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x43,0x6f,0x6d,0x62,0x6f,0x62,0x6f,0x78,0x45,
-0x64,0x69,0x74,0x4c,0x65,0x66,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,
-0x33,0x38,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x32,0x22,0x20,0x57,0x69,0x64,
-0x74,0x68,0x3d,0x22,0x38,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,
-0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,
-0x6d,0x65,0x3d,0x22,0x43,0x6f,0x6d,0x62,0x6f,0x62,0x6f,0x78,0x45,0x64,0x69,0x74,
-0x4d,0x69,0x64,0x64,0x6c,0x65,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x34,
-0x38,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x32,0x22,0x20,0x57,0x69,0x64,0x74,
-0x68,0x3d,0x22,0x38,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x36,
-0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,
-0x65,0x3d,0x22,0x43,0x6f,0x6d,0x62,0x6f,0x62,0x6f,0x78,0x4c,0x69,0x73,0x74,0x42,
-0x75,0x74,0x74,0x6f,0x6e,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x58,0x50,0x6f,
-0x73,0x3d,0x22,0x31,0x35,0x38,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x32,0x22,
-0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x36,0x22,0x20,0x48,0x65,0x69,0x67,
-0x68,0x74,0x3d,0x22,0x31,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x43,0x6f,0x6d,0x62,0x6f,0x62,0x6f,
-0x78,0x4c,0x69,0x73,0x74,0x42,0x75,0x74,0x74,0x6f,0x6e,0x48,0x6f,0x76,0x65,0x72,
-0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x35,0x38,0x22,0x20,0x59,0x50,0x6f,
-0x73,0x3d,0x22,0x32,0x30,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x36,
-0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x36,0x22,0x20,0x2f,0x3e,
-0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x43,
-0x6f,0x6d,0x62,0x6f,0x62,0x6f,0x78,0x4c,0x69,0x73,0x74,0x4c,0x65,0x66,0x74,0x22,
-0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x33,0x38,0x22,0x20,0x59,0x50,0x6f,0x73,
-0x3d,0x22,0x34,0x38,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x38,0x22,0x20,
-0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x38,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x43,0x6f,0x6d,0x62,
-0x6f,0x62,0x6f,0x78,0x4c,0x69,0x73,0x74,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x58,
-0x50,0x6f,0x73,0x3d,0x22,0x31,0x35,0x38,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,
-0x34,0x38,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x38,0x22,0x20,0x48,0x65,
-0x69,0x67,0x68,0x74,0x3d,0x22,0x38,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x43,0x6f,0x6d,0x62,0x6f,0x62,
-0x6f,0x78,0x4c,0x69,0x73,0x74,0x54,0x6f,0x70,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,
-0x22,0x31,0x34,0x38,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x34,0x38,0x22,0x20,
-0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x38,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,
-0x3d,0x22,0x38,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,
-0x4e,0x61,0x6d,0x65,0x3d,0x22,0x43,0x6f,0x6d,0x62,0x6f,0x62,0x6f,0x78,0x4c,0x69,
-0x73,0x74,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,
-0x31,0x34,0x38,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x35,0x38,0x22,0x20,0x57,
-0x69,0x64,0x74,0x68,0x3d,0x22,0x38,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,
-0x22,0x38,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,
-0x61,0x6d,0x65,0x3d,0x22,0x43,0x6f,0x6d,0x62,0x6f,0x62,0x6f,0x78,0x4c,0x69,0x73,
-0x74,0x54,0x6f,0x70,0x4c,0x65,0x66,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,
-0x31,0x33,0x38,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x33,0x38,0x22,0x20,0x57,
-0x69,0x64,0x74,0x68,0x3d,0x22,0x38,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,
-0x22,0x38,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,
-0x61,0x6d,0x65,0x3d,0x22,0x43,0x6f,0x6d,0x62,0x6f,0x62,0x6f,0x78,0x4c,0x69,0x73,
-0x74,0x54,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,
-0x22,0x31,0x35,0x38,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x33,0x38,0x22,0x20,
-0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x38,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,
-0x3d,0x22,0x38,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,
-0x4e,0x61,0x6d,0x65,0x3d,0x22,0x43,0x6f,0x6d,0x62,0x6f,0x62,0x6f,0x78,0x4c,0x69,
-0x73,0x74,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x22,0x20,0x58,0x50,
-0x6f,0x73,0x3d,0x22,0x31,0x33,0x38,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x35,
-0x38,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x38,0x22,0x20,0x48,0x65,0x69,
-0x67,0x68,0x74,0x3d,0x22,0x38,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x43,0x6f,0x6d,0x62,0x6f,0x62,0x6f,
-0x78,0x4c,0x69,0x73,0x74,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,
-0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x35,0x38,0x22,0x20,0x59,0x50,0x6f,
-0x73,0x3d,0x22,0x35,0x38,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x38,0x22,
-0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x38,0x22,0x20,0x2f,0x3e,0x0a,0x09,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x43,0x6f,0x6d,
-0x62,0x6f,0x62,0x6f,0x78,0x4c,0x69,0x73,0x74,0x42,0x61,0x63,0x6b,0x64,0x72,0x6f,
-0x70,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x34,0x38,0x22,0x20,0x59,0x50,
-0x6f,0x73,0x3d,0x22,0x34,0x38,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x38,
-0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x38,0x22,0x20,0x2f,0x3e,0x0a,
-0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x43,0x6f,
-0x6d,0x62,0x6f,0x62,0x6f,0x78,0x53,0x65,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x42,
-0x72,0x75,0x73,0x68,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x38,0x22,0x20,0x59,
-0x50,0x6f,0x73,0x3d,0x22,0x37,0x30,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,
-0x31,0x36,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x36,0x22,0x20,
-0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,
-0x22,0x43,0x6f,0x6d,0x62,0x6f,0x62,0x6f,0x78,0x44,0x69,0x76,0x69,0x64,0x65,0x72,
-0x4c,0x65,0x66,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x33,0x38,0x22,
-0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x36,0x38,0x22,0x20,0x57,0x69,0x64,0x74,0x68,
-0x3d,0x22,0x31,0x34,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x22,
-0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,
-0x3d,0x22,0x43,0x6f,0x6d,0x62,0x6f,0x62,0x6f,0x78,0x44,0x69,0x76,0x69,0x64,0x65,
-0x72,0x4d,0x69,0x64,0x64,0x6c,0x65,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,
-0x35,0x34,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x36,0x38,0x22,0x20,0x57,0x69,
-0x64,0x74,0x68,0x3d,0x22,0x38,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,
-0x31,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,
-0x6d,0x65,0x3d,0x22,0x43,0x6f,0x6d,0x62,0x6f,0x62,0x6f,0x78,0x44,0x69,0x76,0x69,
-0x64,0x65,0x72,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,
-0x31,0x36,0x34,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x36,0x38,0x22,0x20,0x57,
-0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x34,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,
-0x3d,0x22,0x31,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,
-0x4e,0x61,0x6d,0x65,0x3d,0x22,0x48,0x65,0x61,0x64,0x65,0x72,0x42,0x61,0x72,0x42,
-0x61,0x63,0x6b,0x64,0x72,0x6f,0x70,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x58,
-0x50,0x6f,0x73,0x3d,0x22,0x32,0x33,0x30,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,
-0x31,0x36,0x33,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x30,0x22,0x20,
-0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x32,0x22,0x20,0x2f,0x3e,0x0a,0x09,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x48,0x65,0x61,
-0x64,0x65,0x72,0x42,0x61,0x72,0x42,0x61,0x63,0x6b,0x64,0x72,0x6f,0x70,0x48,0x6f,
-0x76,0x65,0x72,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x32,0x33,0x30,0x22,0x20,
-0x59,0x50,0x6f,0x73,0x3d,0x22,0x31,0x36,0x33,0x22,0x20,0x57,0x69,0x64,0x74,0x68,
-0x3d,0x22,0x31,0x30,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x32,
-0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,
-0x65,0x3d,0x22,0x48,0x65,0x61,0x64,0x65,0x72,0x42,0x61,0x72,0x53,0x70,0x6c,0x69,
-0x74,0x74,0x65,0x72,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x58,0x50,0x6f,0x73,
-0x3d,0x22,0x32,0x32,0x35,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x39,0x32,0x22,
-0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x33,0x22,0x20,0x48,0x65,0x69,0x67,0x68,
-0x74,0x3d,0x22,0x31,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x48,0x65,0x61,0x64,0x65,0x72,0x42,0x61,
-0x72,0x53,0x70,0x6c,0x69,0x74,0x74,0x65,0x72,0x48,0x6f,0x76,0x65,0x72,0x22,0x20,
-0x58,0x50,0x6f,0x73,0x3d,0x22,0x32,0x30,0x30,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,
-0x22,0x39,0x32,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x33,0x22,0x20,0x48,
-0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x48,0x65,0x61,0x64,
-0x65,0x72,0x42,0x61,0x72,0x53,0x6f,0x72,0x74,0x55,0x70,0x22,0x20,0x58,0x50,0x6f,
-0x73,0x3d,0x22,0x32,0x33,0x33,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x31,0x37,
-0x38,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x38,0x22,0x20,0x48,0x65,0x69,
-0x67,0x68,0x74,0x3d,0x22,0x38,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x48,0x65,0x61,0x64,0x65,0x72,0x42,
-0x61,0x72,0x53,0x6f,0x72,0x74,0x44,0x6f,0x77,0x6e,0x22,0x20,0x58,0x50,0x6f,0x73,
-0x3d,0x22,0x32,0x34,0x34,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x31,0x37,0x38,
-0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x38,0x22,0x20,0x48,0x65,0x69,0x67,
-0x68,0x74,0x3d,0x22,0x38,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,0x73,
-0x74,0x4c,0x65,0x66,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x37,0x30,
-0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x39,0x32,0x22,0x20,0x57,0x69,0x64,0x74,
-0x68,0x3d,0x22,0x37,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x36,0x22,
-0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,
-0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,0x73,0x74,0x52,0x69,0x67,0x68,0x74,
-0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x39,0x31,0x22,0x20,0x59,0x50,0x6f,
-0x73,0x3d,0x22,0x39,0x32,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x37,0x22,
-0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4d,0x75,0x6c,
-0x74,0x69,0x4c,0x69,0x73,0x74,0x54,0x6f,0x70,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,
-0x22,0x31,0x38,0x31,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x38,0x31,0x22,0x20,
-0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x36,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,
-0x3d,0x22,0x37,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,
-0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,0x73,0x74,0x42,
-0x6f,0x74,0x74,0x6f,0x6d,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x38,0x31,
-0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x31,0x30,0x32,0x22,0x20,0x57,0x69,0x64,
-0x74,0x68,0x3d,0x22,0x36,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x37,
-0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,
-0x65,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,0x73,0x74,0x54,0x6f,0x70,0x4c,
-0x65,0x66,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x37,0x30,0x22,0x20,
-0x59,0x50,0x6f,0x73,0x3d,0x22,0x38,0x31,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,
-0x22,0x37,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x37,0x22,0x20,0x2f,
-0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,
-0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,0x73,0x74,0x54,0x6f,0x70,0x52,0x69,0x67,0x68,
-0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x39,0x31,0x22,0x20,0x59,0x50,
-0x6f,0x73,0x3d,0x22,0x38,0x31,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x37,
-0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x37,0x22,0x20,0x2f,0x3e,0x0a,
-0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4d,0x75,
-0x6c,0x74,0x69,0x4c,0x69,0x73,0x74,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,
-0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x37,0x30,0x22,0x20,0x59,0x50,
-0x6f,0x73,0x3d,0x22,0x31,0x30,0x32,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,
-0x37,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x37,0x22,0x20,0x2f,0x3e,
-0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4d,
-0x75,0x6c,0x74,0x69,0x4c,0x69,0x73,0x74,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,
-0x67,0x68,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x39,0x31,0x22,0x20,
-0x59,0x50,0x6f,0x73,0x3d,0x22,0x31,0x30,0x32,0x22,0x20,0x57,0x69,0x64,0x74,0x68,
-0x3d,0x22,0x37,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x37,0x22,0x20,
-0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,
-0x22,0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,0x73,0x74,0x42,0x61,0x63,0x6b,0x64,0x72,
-0x6f,0x70,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x38,0x31,0x22,0x20,0x59,
-0x50,0x6f,0x73,0x3d,0x22,0x39,0x32,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,
-0x36,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x36,0x22,0x20,0x2f,0x3e,
-0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4d,
-0x75,0x6c,0x74,0x69,0x4c,0x69,0x73,0x74,0x53,0x65,0x6c,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x42,0x72,0x75,0x73,0x68,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x39,0x22,
-0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x37,0x31,0x22,0x20,0x57,0x69,0x64,0x74,0x68,
-0x3d,0x22,0x31,0x34,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x34,
-0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,
-0x65,0x3d,0x22,0x41,0x6c,0x74,0x50,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x4c,0x65,
-0x66,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x37,0x31,0x22,0x20,0x59,0x50,
-0x6f,0x73,0x3d,0x22,0x38,0x38,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x38,
-0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x32,0x22,0x20,0x2f,0x3e,
-0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x41,
-0x6c,0x74,0x50,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x4d,0x69,0x64,0x64,0x6c,0x65,
-0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x38,0x31,0x22,0x20,0x59,0x50,0x6f,0x73,
-0x3d,0x22,0x38,0x38,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x38,0x22,0x20,
-0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x32,0x22,0x20,0x2f,0x3e,0x0a,0x09,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x41,0x6c,0x74,
-0x50,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x58,
-0x50,0x6f,0x73,0x3d,0x22,0x39,0x31,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x38,
-0x38,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x38,0x22,0x20,0x48,0x65,0x69,
-0x67,0x68,0x74,0x3d,0x22,0x31,0x32,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x41,0x6c,0x74,0x50,0x72,0x6f,
-0x67,0x72,0x65,0x73,0x73,0x51,0x75,0x61,0x72,0x74,0x65,0x72,0x22,0x20,0x58,0x50,
-0x6f,0x73,0x3d,0x22,0x31,0x30,0x32,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x38,
-0x39,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x33,0x22,0x20,0x48,0x65,0x69,
-0x67,0x68,0x74,0x3d,0x22,0x34,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x41,0x6c,0x74,0x50,0x72,0x6f,0x67,
-0x72,0x65,0x73,0x73,0x48,0x61,0x6c,0x66,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,
-0x31,0x30,0x39,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x38,0x39,0x22,0x20,0x57,
-0x69,0x64,0x74,0x68,0x3d,0x22,0x34,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,
-0x22,0x35,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,
-0x61,0x6d,0x65,0x3d,0x22,0x41,0x6c,0x74,0x50,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,
-0x4c,0x69,0x67,0x68,0x74,0x31,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x30,
-0x30,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x39,0x37,0x22,0x20,0x57,0x69,0x64,
-0x74,0x68,0x3d,0x22,0x34,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x38,
-0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,
-0x65,0x3d,0x22,0x41,0x6c,0x74,0x50,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x4c,0x69,
-0x67,0x68,0x74,0x32,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x30,0x36,0x22,
-0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x39,0x37,0x22,0x20,0x57,0x69,0x64,0x74,0x68,
-0x3d,0x22,0x34,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x38,0x22,0x20,
-0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,
-0x22,0x41,0x6c,0x74,0x50,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x4c,0x69,0x67,0x68,
-0x74,0x33,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x31,0x32,0x22,0x20,0x59,
-0x50,0x6f,0x73,0x3d,0x22,0x39,0x37,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,
-0x34,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x38,0x22,0x20,0x2f,0x3e,
-0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x41,
-0x6c,0x74,0x50,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x4c,0x69,0x67,0x68,0x74,0x34,
-0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x31,0x38,0x22,0x20,0x59,0x50,0x6f,
-0x73,0x3d,0x22,0x39,0x37,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x34,0x22,
-0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x38,0x22,0x20,0x2f,0x3e,0x0a,0x09,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x41,0x6c,0x74,
-0x50,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x4c,0x69,0x67,0x68,0x74,0x35,0x22,0x20,
-0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x32,0x34,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,
-0x22,0x39,0x37,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x34,0x22,0x20,0x48,
-0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x38,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x41,0x6c,0x74,0x50,0x72,
-0x6f,0x67,0x72,0x65,0x73,0x73,0x4c,0x69,0x67,0x68,0x74,0x36,0x22,0x20,0x58,0x50,
-0x6f,0x73,0x3d,0x22,0x31,0x33,0x30,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x39,
-0x37,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x34,0x22,0x20,0x48,0x65,0x69,
-0x67,0x68,0x74,0x3d,0x22,0x38,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x41,0x6c,0x74,0x50,0x72,0x6f,0x67,
-0x72,0x65,0x73,0x73,0x4c,0x69,0x67,0x68,0x74,0x37,0x22,0x20,0x58,0x50,0x6f,0x73,
-0x3d,0x22,0x31,0x33,0x36,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x39,0x37,0x22,
-0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x34,0x22,0x20,0x48,0x65,0x69,0x67,0x68,
-0x74,0x3d,0x22,0x38,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x41,0x6c,0x74,0x50,0x72,0x6f,0x67,0x72,0x65,
-0x73,0x73,0x4c,0x69,0x67,0x68,0x74,0x38,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,
-0x31,0x34,0x32,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x39,0x37,0x22,0x20,0x57,
-0x69,0x64,0x74,0x68,0x3d,0x22,0x34,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,
-0x22,0x38,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,
-0x61,0x6d,0x65,0x3d,0x22,0x41,0x6c,0x74,0x50,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,
-0x4c,0x69,0x67,0x68,0x74,0x39,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x34,
-0x38,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x39,0x37,0x22,0x20,0x57,0x69,0x64,
-0x74,0x68,0x3d,0x22,0x34,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x38,
-0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,
-0x65,0x3d,0x22,0x41,0x6c,0x74,0x50,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x4c,0x69,
-0x67,0x68,0x74,0x31,0x30,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x35,0x34,
-0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x39,0x37,0x22,0x20,0x57,0x69,0x64,0x74,
-0x68,0x3d,0x22,0x34,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x38,0x22,
-0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,
-0x3d,0x22,0x43,0x6c,0x6f,0x73,0x65,0x42,0x75,0x74,0x74,0x6f,0x6e,0x4e,0x6f,0x72,
-0x6d,0x61,0x6c,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x34,0x31,0x22,0x20,0x59,
-0x50,0x6f,0x73,0x3d,0x22,0x31,0x32,0x38,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,
-0x22,0x31,0x36,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x36,0x22,
-0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,
-0x3d,0x22,0x43,0x6c,0x6f,0x73,0x65,0x42,0x75,0x74,0x74,0x6f,0x6e,0x48,0x6f,0x76,
-0x65,0x72,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x34,0x31,0x22,0x20,0x59,0x50,
-0x6f,0x73,0x3d,0x22,0x31,0x34,0x36,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,
-0x31,0x36,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x36,0x22,0x20,
-0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,
-0x22,0x43,0x6c,0x6f,0x73,0x65,0x42,0x75,0x74,0x74,0x6f,0x6e,0x50,0x72,0x65,0x73,
-0x73,0x65,0x64,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x34,0x31,0x22,0x20,0x59,
-0x50,0x6f,0x73,0x3d,0x22,0x31,0x36,0x34,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,
-0x22,0x31,0x36,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x36,0x22,
-0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,
-0x3d,0x22,0x4e,0x65,0x77,0x43,0x6c,0x6f,0x73,0x65,0x42,0x75,0x74,0x74,0x6f,0x6e,
-0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x39,0x30,
-0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x31,0x34,0x36,0x22,0x20,0x57,0x69,0x64,
-0x74,0x68,0x3d,0x22,0x31,0x30,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,
-0x31,0x30,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,
-0x61,0x6d,0x65,0x3d,0x22,0x4e,0x65,0x77,0x43,0x6c,0x6f,0x73,0x65,0x42,0x75,0x74,
-0x74,0x6f,0x6e,0x48,0x6f,0x76,0x65,0x72,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,
-0x39,0x30,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x31,0x34,0x36,0x22,0x20,0x57,
-0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x30,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,
-0x3d,0x22,0x31,0x30,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4e,0x65,0x77,0x43,0x6c,0x6f,0x73,0x65,0x42,
-0x75,0x74,0x74,0x6f,0x6e,0x50,0x72,0x65,0x73,0x73,0x65,0x64,0x22,0x20,0x58,0x50,
-0x6f,0x73,0x3d,0x22,0x39,0x30,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x31,0x34,
-0x36,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x30,0x22,0x20,0x48,0x65,
-0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x30,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,
-0x4c,0x69,0x6e,0x65,0x45,0x64,0x69,0x74,0x62,0x6f,0x78,0x4c,0x65,0x66,0x74,0x22,
-0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x34,0x31,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,
-0x22,0x38,0x39,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x36,0x22,0x20,0x48,
-0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,
-0x4c,0x69,0x6e,0x65,0x45,0x64,0x69,0x74,0x62,0x6f,0x78,0x52,0x69,0x67,0x68,0x74,
-0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x36,0x33,0x22,0x20,0x59,0x50,0x6f,0x73,
-0x3d,0x22,0x38,0x39,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x36,0x22,0x20,
-0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4d,0x75,0x6c,0x74,
-0x69,0x4c,0x69,0x6e,0x65,0x45,0x64,0x69,0x74,0x62,0x6f,0x78,0x54,0x6f,0x70,0x22,
-0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x35,0x32,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,
-0x22,0x37,0x38,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x36,0x22,0x20,0x48,
-0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,
-0x4c,0x69,0x6e,0x65,0x45,0x64,0x69,0x74,0x62,0x6f,0x78,0x42,0x6f,0x74,0x74,0x6f,
-0x6d,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x35,0x32,0x22,0x20,0x59,0x50,0x6f,
-0x73,0x3d,0x22,0x31,0x30,0x30,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x36,
-0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x36,0x22,0x20,0x2f,0x3e,0x0a,
-0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4d,0x75,
-0x6c,0x74,0x69,0x4c,0x69,0x6e,0x65,0x45,0x64,0x69,0x74,0x62,0x6f,0x78,0x54,0x6f,
-0x70,0x4c,0x65,0x66,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x34,0x31,0x22,
-0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x37,0x38,0x22,0x20,0x57,0x69,0x64,0x74,0x68,
-0x3d,0x22,0x36,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x36,0x22,0x20,
-0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,
-0x22,0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,0x6e,0x65,0x45,0x64,0x69,0x74,0x62,0x6f,
-0x78,0x54,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,
-0x22,0x36,0x33,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x37,0x38,0x22,0x20,0x57,
-0x69,0x64,0x74,0x68,0x3d,0x22,0x36,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,
-0x22,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,
-0x61,0x6d,0x65,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,0x6e,0x65,0x45,0x64,
-0x69,0x74,0x62,0x6f,0x78,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x22,
-0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x34,0x31,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,
-0x22,0x31,0x30,0x30,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x36,0x22,0x20,
-0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4d,0x75,0x6c,0x74,
-0x69,0x4c,0x69,0x6e,0x65,0x45,0x64,0x69,0x74,0x62,0x6f,0x78,0x42,0x6f,0x74,0x74,
-0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x36,
-0x33,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x31,0x30,0x30,0x22,0x20,0x57,0x69,
-0x64,0x74,0x68,0x3d,0x22,0x36,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,
-0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,
-0x6d,0x65,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,0x6e,0x65,0x45,0x64,0x69,
-0x74,0x62,0x6f,0x78,0x42,0x61,0x63,0x6b,0x64,0x72,0x6f,0x70,0x22,0x20,0x58,0x50,
-0x6f,0x73,0x3d,0x22,0x35,0x32,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x38,0x39,
-0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x36,0x22,0x20,0x48,0x65,0x69,0x67,
-0x68,0x74,0x3d,0x22,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,0x6e,
-0x65,0x45,0x64,0x69,0x74,0x62,0x6f,0x78,0x53,0x65,0x6c,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x42,0x72,0x75,0x73,0x68,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x39,0x22,
-0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x37,0x31,0x22,0x20,0x57,0x69,0x64,0x74,0x68,
-0x3d,0x22,0x31,0x34,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x34,
-0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,
-0x65,0x3d,0x22,0x4d,0x6f,0x75,0x73,0x65,0x54,0x61,0x72,0x67,0x65,0x74,0x22,0x20,
-0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x38,0x32,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,
-0x22,0x31,0x32,0x37,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x37,0x22,
-0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x37,0x22,0x20,0x58,0x4f,0x66,
-0x66,0x73,0x65,0x74,0x3d,0x22,0x2d,0x38,0x22,0x20,0x59,0x4f,0x66,0x66,0x73,0x65,
-0x74,0x3d,0x22,0x2d,0x38,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4d,0x6f,0x75,0x73,0x65,0x41,0x72,0x72,
-0x6f,0x77,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x33,0x38,0x22,0x20,0x59,
-0x50,0x6f,0x73,0x3d,0x22,0x31,0x32,0x37,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,
-0x22,0x33,0x31,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x32,0x35,0x22,
-0x20,0x58,0x4f,0x66,0x66,0x73,0x65,0x74,0x3d,0x22,0x30,0x22,0x20,0x59,0x4f,0x66,
-0x66,0x73,0x65,0x74,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4d,0x6f,0x75,0x73,0x65,0x4d,
-0x6f,0x76,0x65,0x43,0x75,0x72,0x73,0x6f,0x72,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,
-0x22,0x32,0x30,0x31,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x31,0x32,0x37,0x22,
-0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x38,0x22,0x20,0x48,0x65,0x69,0x67,
-0x68,0x74,0x3d,0x22,0x31,0x38,0x22,0x20,0x58,0x4f,0x66,0x66,0x73,0x65,0x74,0x3d,
-0x22,0x2d,0x38,0x22,0x20,0x59,0x4f,0x66,0x66,0x73,0x65,0x74,0x3d,0x22,0x2d,0x38,
-0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,
-0x65,0x3d,0x22,0x4d,0x6f,0x75,0x73,0x65,0x4e,0x6f,0x53,0x6f,0x43,0x75,0x72,0x73,
-0x6f,0x72,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x32,0x32,0x31,0x22,0x20,0x59,
-0x50,0x6f,0x73,0x3d,0x22,0x31,0x32,0x37,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,
-0x22,0x38,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x38,0x22,0x20,
-0x58,0x4f,0x66,0x66,0x73,0x65,0x74,0x3d,0x22,0x2d,0x33,0x22,0x20,0x59,0x4f,0x66,
-0x66,0x73,0x65,0x74,0x3d,0x22,0x2d,0x38,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4d,0x6f,0x75,0x73,0x65,
-0x45,0x73,0x57,0x65,0x43,0x75,0x72,0x73,0x6f,0x72,0x22,0x20,0x58,0x50,0x6f,0x73,
-0x3d,0x22,0x31,0x38,0x32,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x31,0x35,0x30,
-0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x38,0x22,0x20,0x48,0x65,0x69,
-0x67,0x68,0x74,0x3d,0x22,0x38,0x22,0x20,0x58,0x4f,0x66,0x66,0x73,0x65,0x74,0x3d,
-0x22,0x2d,0x38,0x22,0x20,0x59,0x4f,0x66,0x66,0x73,0x65,0x74,0x3d,0x22,0x2d,0x33,
-0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,
-0x65,0x3d,0x22,0x4d,0x6f,0x75,0x73,0x65,0x4e,0x65,0x53,0x77,0x43,0x75,0x72,0x73,
-0x6f,0x72,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x32,0x30,0x31,0x22,0x20,0x59,
-0x50,0x6f,0x73,0x3d,0x22,0x31,0x34,0x37,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,
-0x22,0x31,0x34,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x34,0x22,
-0x20,0x58,0x4f,0x66,0x66,0x73,0x65,0x74,0x3d,0x22,0x2d,0x37,0x22,0x20,0x59,0x4f,
-0x66,0x66,0x73,0x65,0x74,0x3d,0x22,0x2d,0x37,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4d,0x6f,0x75,0x73,
-0x65,0x4e,0x77,0x53,0x65,0x43,0x75,0x72,0x73,0x6f,0x72,0x22,0x20,0x58,0x50,0x6f,
-0x73,0x3d,0x22,0x32,0x33,0x30,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x31,0x32,
-0x36,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x34,0x22,0x20,0x48,0x65,
-0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x34,0x22,0x20,0x58,0x4f,0x66,0x66,0x73,0x65,
-0x74,0x3d,0x22,0x2d,0x37,0x22,0x20,0x59,0x4f,0x66,0x66,0x73,0x65,0x74,0x3d,0x22,
-0x2d,0x37,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,
-0x61,0x6d,0x65,0x3d,0x22,0x4d,0x6f,0x75,0x73,0x65,0x54,0x65,0x78,0x74,0x42,0x61,
-0x72,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x37,0x33,0x22,0x20,0x59,0x50,
-0x6f,0x73,0x3d,0x22,0x31,0x32,0x37,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,
-0x37,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x38,0x22,0x20,0x58,
-0x4f,0x66,0x66,0x73,0x65,0x74,0x3d,0x22,0x2d,0x32,0x22,0x20,0x59,0x4f,0x66,0x66,
-0x73,0x65,0x74,0x3d,0x22,0x2d,0x39,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x62,0x48,0x6f,0x72,
-0x69,0x7a,0x6f,0x6e,0x74,0x61,0x6c,0x46,0x69,0x6c,0x6c,0x65,0x72,0x22,0x20,0x58,
-0x50,0x6f,0x73,0x3d,0x22,0x31,0x39,0x37,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,
-0x32,0x30,0x31,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x37,0x22,0x20,0x48,
-0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x62,0x43,0x6f,
-0x6e,0x74,0x65,0x6e,0x74,0x50,0x61,0x6e,0x65,0x55,0x70,0x70,0x65,0x72,0x4c,0x65,
-0x66,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x34,0x31,0x22,0x20,0x59,0x50,
-0x6f,0x73,0x3d,0x22,0x37,0x38,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x37,
-0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x37,0x22,0x20,0x2f,0x3e,0x0a,
-0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,
-0x62,0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x50,0x61,0x6e,0x65,0x55,0x70,0x70,0x65,
-0x72,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x35,0x32,0x22,0x20,0x59,0x50,0x6f,
-0x73,0x3d,0x22,0x37,0x38,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x36,0x22,
-0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x37,0x22,0x20,0x2f,0x3e,0x0a,0x09,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x62,
-0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x50,0x61,0x6e,0x65,0x55,0x70,0x70,0x65,0x72,
-0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x36,0x32,0x22,
-0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x37,0x38,0x22,0x20,0x57,0x69,0x64,0x74,0x68,
-0x3d,0x22,0x37,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x37,0x22,0x20,
-0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,
-0x22,0x54,0x61,0x62,0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x50,0x61,0x6e,0x65,0x4c,
-0x65,0x66,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x34,0x31,0x22,0x20,0x59,
-0x50,0x6f,0x73,0x3d,0x22,0x38,0x39,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,
-0x37,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x36,0x22,0x20,0x2f,0x3e,
-0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x54,
-0x61,0x62,0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x50,0x61,0x6e,0x65,0x52,0x69,0x67,
-0x68,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x36,0x32,0x22,0x20,0x59,0x50,
-0x6f,0x73,0x3d,0x22,0x38,0x39,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x37,
-0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x36,0x22,0x20,0x2f,0x3e,0x0a,
-0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,
-0x62,0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x50,0x61,0x6e,0x65,0x4c,0x6f,0x77,0x65,
-0x72,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x35,0x32,0x22,0x20,0x59,0x50,0x6f,
-0x73,0x3d,0x22,0x39,0x39,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x36,0x22,
-0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x37,0x22,0x20,0x2f,0x3e,0x0a,0x09,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x62,
-0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x50,0x61,0x6e,0x65,0x4c,0x6f,0x77,0x65,0x72,
-0x4c,0x65,0x66,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x34,0x31,0x22,0x20,
-0x59,0x50,0x6f,0x73,0x3d,0x22,0x39,0x39,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,
-0x22,0x37,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x37,0x22,0x20,0x2f,
-0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,
-0x54,0x61,0x62,0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x50,0x61,0x6e,0x65,0x4c,0x6f,
-0x77,0x65,0x72,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,
-0x36,0x32,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x39,0x39,0x22,0x20,0x57,0x69,
-0x64,0x74,0x68,0x3d,0x22,0x37,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,
-0x37,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,
-0x6d,0x65,0x3d,0x22,0x54,0x61,0x62,0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x50,0x61,
-0x6e,0x65,0x4d,0x69,0x64,0x64,0x6c,0x65,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,
-0x35,0x32,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x38,0x39,0x22,0x20,0x57,0x69,
-0x64,0x74,0x68,0x3d,0x22,0x36,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,
-0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,
-0x6d,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x53,0x63,0x72,
-0x6f,0x6c,0x6c,0x4c,0x65,0x66,0x74,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x58,
-0x50,0x6f,0x73,0x3d,0x22,0x39,0x37,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x31,
-0x30,0x38,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x36,0x22,0x20,0x48,
-0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x37,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,
-0x75,0x74,0x74,0x6f,0x6e,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x52,0x69,0x67,0x68,0x74,
-0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x31,
-0x32,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x31,0x30,0x38,0x22,0x20,0x57,0x69,
-0x64,0x74,0x68,0x3d,0x22,0x31,0x36,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,
-0x22,0x31,0x37,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,
-0x4e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x53,
-0x63,0x72,0x6f,0x6c,0x6c,0x4c,0x65,0x66,0x74,0x48,0x6f,0x76,0x65,0x72,0x22,0x20,
-0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x32,0x37,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,
-0x22,0x31,0x30,0x38,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x36,0x22,
-0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x37,0x22,0x20,0x2f,0x3e,0x0a,
-0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,
-0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x52,0x69,0x67,
-0x68,0x74,0x48,0x6f,0x76,0x65,0x72,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,
-0x34,0x32,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x31,0x30,0x38,0x22,0x20,0x57,
-0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x36,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,
-0x3d,0x22,0x31,0x37,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,
-0x4c,0x65,0x66,0x74,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x58,0x50,0x6f,0x73,
-0x3d,0x22,0x34,0x31,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x38,0x39,0x22,0x20,
-0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x37,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,
-0x3d,0x22,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,
-0x4e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x52,
-0x69,0x67,0x68,0x74,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x58,0x50,0x6f,0x73,
-0x3d,0x22,0x36,0x32,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x38,0x39,0x22,0x20,
-0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x37,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,
-0x3d,0x22,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,
-0x4e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x55,
-0x70,0x70,0x65,0x72,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x58,0x50,0x6f,0x73,
-0x3d,0x22,0x35,0x32,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x37,0x38,0x22,0x20,
-0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x36,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,
-0x3d,0x22,0x37,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,
-0x4e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x4c,
-0x6f,0x77,0x65,0x72,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x58,0x50,0x6f,0x73,
-0x3d,0x22,0x35,0x32,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x39,0x39,0x22,0x20,
-0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x36,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,
-0x3d,0x22,0x37,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,
-0x4e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x55,
-0x70,0x70,0x65,0x72,0x4c,0x65,0x66,0x74,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,
-0x58,0x50,0x6f,0x73,0x3d,0x22,0x34,0x31,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,
-0x37,0x38,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x37,0x22,0x20,0x48,0x65,
-0x69,0x67,0x68,0x74,0x3d,0x22,0x37,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,
-0x74,0x6f,0x6e,0x55,0x70,0x70,0x65,0x72,0x4c,0x65,0x66,0x74,0x32,0x4e,0x6f,0x72,
-0x6d,0x61,0x6c,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x38,0x36,0x22,0x20,
-0x59,0x50,0x6f,0x73,0x3d,0x22,0x31,0x36,0x34,0x22,0x20,0x57,0x69,0x64,0x74,0x68,
-0x3d,0x22,0x37,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x37,0x22,0x20,
-0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,
-0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x55,0x70,0x70,0x65,0x72,0x52,
-0x69,0x67,0x68,0x74,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x58,0x50,0x6f,0x73,
-0x3d,0x22,0x36,0x32,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x37,0x38,0x22,0x20,
-0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x37,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,
-0x3d,0x22,0x37,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,
-0x4e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x4c,
-0x6f,0x77,0x65,0x72,0x4c,0x65,0x66,0x74,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,
-0x58,0x50,0x6f,0x73,0x3d,0x22,0x34,0x31,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,
-0x39,0x39,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x37,0x22,0x20,0x48,0x65,
-0x69,0x67,0x68,0x74,0x3d,0x22,0x37,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,
-0x74,0x6f,0x6e,0x4c,0x6f,0x77,0x65,0x72,0x52,0x69,0x67,0x68,0x74,0x4e,0x6f,0x72,
-0x6d,0x61,0x6c,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x36,0x32,0x22,0x20,0x59,
-0x50,0x6f,0x73,0x3d,0x22,0x39,0x39,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,
-0x37,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x37,0x22,0x20,0x2f,0x3e,
-0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x54,
-0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x4c,0x6f,0x77,0x65,0x72,0x52,0x69,0x67,
-0x68,0x74,0x32,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,
-0x22,0x31,0x38,0x37,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x31,0x39,0x35,0x22,
-0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x37,0x22,0x20,0x48,0x65,0x69,0x67,0x68,
-0x74,0x3d,0x22,0x37,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,
-0x4d,0x69,0x64,0x64,0x6c,0x65,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x58,0x50,
-0x6f,0x73,0x3d,0x22,0x35,0x32,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x38,0x39,
-0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x36,0x22,0x20,0x48,0x65,0x69,0x67,
-0x68,0x74,0x3d,0x22,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,
-0x6e,0x4c,0x65,0x66,0x74,0x53,0x65,0x6c,0x65,0x63,0x74,0x65,0x64,0x22,0x20,0x58,
-0x50,0x6f,0x73,0x3d,0x22,0x34,0x31,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x38,
-0x39,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x37,0x22,0x20,0x48,0x65,0x69,
-0x67,0x68,0x74,0x3d,0x22,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,
-0x6f,0x6e,0x52,0x69,0x67,0x68,0x74,0x53,0x65,0x6c,0x65,0x63,0x74,0x65,0x64,0x22,
-0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x36,0x32,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,
-0x22,0x38,0x39,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x37,0x22,0x20,0x48,
-0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,
-0x74,0x74,0x6f,0x6e,0x55,0x70,0x70,0x65,0x72,0x53,0x65,0x6c,0x65,0x63,0x74,0x65,
-0x64,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x35,0x32,0x22,0x20,0x59,0x50,0x6f,
-0x73,0x3d,0x22,0x37,0x38,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x36,0x22,
-0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x37,0x22,0x20,0x2f,0x3e,0x0a,0x09,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x62,
-0x42,0x75,0x74,0x74,0x6f,0x6e,0x4c,0x6f,0x77,0x65,0x72,0x53,0x65,0x6c,0x65,0x63,
-0x74,0x65,0x64,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x35,0x32,0x22,0x20,0x59,
-0x50,0x6f,0x73,0x3d,0x22,0x38,0x39,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,
-0x36,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x36,0x22,0x20,0x2f,0x3e,
-0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x54,
-0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x55,0x70,0x70,0x65,0x72,0x4c,0x65,0x66,
-0x74,0x53,0x65,0x6c,0x65,0x63,0x74,0x65,0x64,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,
-0x22,0x34,0x31,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x37,0x38,0x22,0x20,0x57,
-0x69,0x64,0x74,0x68,0x3d,0x22,0x37,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,
-0x22,0x37,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,
-0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x55,0x70,
-0x70,0x65,0x72,0x52,0x69,0x67,0x68,0x74,0x53,0x65,0x6c,0x65,0x63,0x74,0x65,0x64,
-0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x36,0x32,0x22,0x20,0x59,0x50,0x6f,0x73,
-0x3d,0x22,0x37,0x38,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x37,0x22,0x20,
-0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x37,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,
-0x75,0x74,0x74,0x6f,0x6e,0x4c,0x6f,0x77,0x65,0x72,0x4c,0x65,0x66,0x74,0x53,0x65,
-0x6c,0x65,0x63,0x74,0x65,0x64,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x34,0x31,
-0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x39,0x39,0x22,0x20,0x57,0x69,0x64,0x74,
-0x68,0x3d,0x22,0x37,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x37,0x22,
-0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,
-0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x4c,0x6f,0x77,0x65,0x72,
-0x52,0x69,0x67,0x68,0x74,0x53,0x65,0x6c,0x65,0x63,0x74,0x65,0x64,0x22,0x20,0x58,
-0x50,0x6f,0x73,0x3d,0x22,0x36,0x32,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x39,
-0x39,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x37,0x22,0x20,0x48,0x65,0x69,
-0x67,0x68,0x74,0x3d,0x22,0x37,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,
-0x6f,0x6e,0x4d,0x69,0x64,0x64,0x6c,0x65,0x53,0x65,0x6c,0x65,0x63,0x74,0x65,0x64,
-0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x35,0x32,0x22,0x20,0x59,0x50,0x6f,0x73,
-0x3d,0x22,0x38,0x39,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x36,0x22,0x20,
-0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x6f,0x6f,0x6c,
-0x74,0x69,0x70,0x54,0x6f,0x70,0x4c,0x65,0x66,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,
-0x3d,0x22,0x36,0x31,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x31,0x36,0x30,0x22,
-0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x34,0x22,0x20,0x48,0x65,0x69,0x67,0x68,
-0x74,0x3d,0x22,0x34,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x6f,0x6f,0x6c,0x74,0x69,0x70,0x54,0x6f,
-0x70,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x38,0x35,
-0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x31,0x36,0x30,0x22,0x20,0x57,0x69,0x64,
-0x74,0x68,0x3d,0x22,0x35,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x34,
-0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,
-0x65,0x3d,0x22,0x54,0x6f,0x6f,0x6c,0x74,0x69,0x70,0x42,0x6f,0x74,0x74,0x6f,0x6d,
-0x4c,0x65,0x66,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x36,0x31,0x22,0x20,
-0x59,0x50,0x6f,0x73,0x3d,0x22,0x31,0x38,0x34,0x22,0x20,0x57,0x69,0x64,0x74,0x68,
-0x3d,0x22,0x34,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x35,0x22,0x20,
-0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,
-0x22,0x54,0x6f,0x6f,0x6c,0x74,0x69,0x70,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,
-0x67,0x68,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x38,0x35,0x22,0x20,0x59,
-0x50,0x6f,0x73,0x3d,0x22,0x31,0x38,0x34,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,
-0x22,0x35,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x35,0x22,0x20,0x2f,
-0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,
-0x54,0x6f,0x6f,0x6c,0x74,0x69,0x70,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,
-0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x36,0x31,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,
-0x22,0x31,0x37,0x31,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x34,0x22,0x20,
-0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x6f,0x6f,0x6c,
-0x74,0x69,0x70,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x58,0x50,
-0x6f,0x73,0x3d,0x22,0x38,0x35,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x31,0x37,
-0x31,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x35,0x22,0x20,0x48,0x65,0x69,
-0x67,0x68,0x74,0x3d,0x22,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x6f,0x6f,0x6c,0x74,0x69,0x70,
-0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x37,
-0x32,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x31,0x36,0x30,0x22,0x20,0x57,0x69,
-0x64,0x74,0x68,0x3d,0x22,0x36,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,
-0x34,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,
-0x6d,0x65,0x3d,0x22,0x54,0x6f,0x6f,0x6c,0x74,0x69,0x70,0x42,0x6f,0x74,0x74,0x6f,
-0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x37,0x32,0x22,
-0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x31,0x38,0x34,0x22,0x20,0x57,0x69,0x64,0x74,
-0x68,0x3d,0x22,0x36,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x35,0x22,
-0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,
-0x3d,0x22,0x54,0x6f,0x6f,0x6c,0x74,0x69,0x70,0x4d,0x69,0x64,0x64,0x6c,0x65,0x22,
-0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x37,0x32,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,
-0x22,0x31,0x37,0x31,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x36,0x22,0x20,
-0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4d,0x65,0x6e,0x75,
-0x54,0x6f,0x70,0x4c,0x65,0x66,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,
-0x36,0x36,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x32,0x30,0x34,0x22,0x20,0x57,
-0x69,0x64,0x74,0x68,0x3d,0x22,0x32,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,
-0x22,0x32,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,
-0x61,0x6d,0x65,0x3d,0x22,0x4d,0x65,0x6e,0x75,0x54,0x6f,0x70,0x52,0x69,0x67,0x68,
-0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x37,0x35,0x22,0x20,0x59,0x50,
-0x6f,0x73,0x3d,0x22,0x32,0x30,0x34,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,
-0x33,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x32,0x22,0x20,0x2f,0x3e,
-0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4d,
-0x65,0x6e,0x75,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x22,0x20,0x58,
-0x50,0x6f,0x73,0x3d,0x22,0x31,0x36,0x36,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,
-0x32,0x31,0x33,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x32,0x22,0x20,0x48,
-0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x33,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4d,0x65,0x6e,0x75,0x42,
-0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,
-0x3d,0x22,0x31,0x37,0x35,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x32,0x31,0x33,
-0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x33,0x22,0x20,0x48,0x65,0x69,0x67,
-0x68,0x74,0x3d,0x22,0x33,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4d,0x65,0x6e,0x75,0x4c,0x65,0x66,0x74,
-0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x36,0x36,0x22,0x20,0x59,0x50,0x6f,
-0x73,0x3d,0x22,0x32,0x30,0x39,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x32,
-0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x22,0x20,0x2f,0x3e,0x0a,
-0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4d,0x65,
-0x6e,0x75,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,
-0x37,0x35,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x32,0x30,0x39,0x22,0x20,0x57,
-0x69,0x64,0x74,0x68,0x3d,0x22,0x33,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,
-0x22,0x31,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,
-0x61,0x6d,0x65,0x3d,0x22,0x4d,0x65,0x6e,0x75,0x54,0x6f,0x70,0x22,0x20,0x58,0x50,
-0x6f,0x73,0x3d,0x22,0x31,0x37,0x31,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x32,
-0x30,0x34,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x22,0x20,0x48,0x65,
-0x69,0x67,0x68,0x74,0x3d,0x22,0x32,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x4d,0x65,0x6e,0x75,0x42,0x6f,
-0x74,0x74,0x6f,0x6d,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x37,0x31,0x22,
-0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x32,0x31,0x33,0x22,0x20,0x57,0x69,0x64,0x74,
-0x68,0x3d,0x22,0x31,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x33,0x22,
-0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,
-0x3d,0x22,0x4d,0x65,0x6e,0x75,0x4d,0x69,0x64,0x64,0x6c,0x65,0x22,0x20,0x58,0x50,
-0x6f,0x73,0x3d,0x22,0x31,0x37,0x31,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x32,
-0x30,0x39,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x22,0x20,0x48,0x65,
-0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x50,0x6f,0x70,0x75,0x70,0x4d,
-0x65,0x6e,0x75,0x46,0x72,0x61,0x6d,0x65,0x54,0x6f,0x70,0x4c,0x65,0x66,0x74,0x22,
-0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x38,0x36,0x22,0x20,0x59,0x50,0x6f,0x73,
-0x3d,0x22,0x32,0x30,0x34,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x32,0x22,
-0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x32,0x22,0x20,0x2f,0x3e,0x0a,0x09,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x50,0x6f,0x70,
-0x75,0x70,0x4d,0x65,0x6e,0x75,0x46,0x72,0x61,0x6d,0x65,0x54,0x6f,0x70,0x52,0x69,
-0x67,0x68,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x39,0x35,0x22,0x20,
-0x59,0x50,0x6f,0x73,0x3d,0x22,0x32,0x30,0x34,0x22,0x20,0x57,0x69,0x64,0x74,0x68,
-0x3d,0x22,0x34,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x32,0x22,0x20,
-0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,
-0x22,0x50,0x6f,0x70,0x75,0x70,0x4d,0x65,0x6e,0x75,0x46,0x72,0x61,0x6d,0x65,0x42,
-0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,
-0x22,0x31,0x38,0x36,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x32,0x31,0x33,0x22,
-0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x32,0x22,0x20,0x48,0x65,0x69,0x67,0x68,
-0x74,0x3d,0x22,0x34,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x50,0x6f,0x70,0x75,0x70,0x4d,0x65,0x6e,0x75,
-0x46,0x72,0x61,0x6d,0x65,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,
-0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x39,0x35,0x22,0x20,0x59,0x50,0x6f,
-0x73,0x3d,0x22,0x32,0x31,0x33,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x34,
-0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x34,0x22,0x20,0x2f,0x3e,0x0a,
-0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x50,0x6f,
-0x70,0x75,0x70,0x4d,0x65,0x6e,0x75,0x46,0x72,0x61,0x6d,0x65,0x4c,0x65,0x66,0x74,
-0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x38,0x36,0x22,0x20,0x59,0x50,0x6f,
-0x73,0x3d,0x22,0x32,0x30,0x39,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x32,
-0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x22,0x20,0x2f,0x3e,0x0a,
-0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x50,0x6f,
-0x70,0x75,0x70,0x4d,0x65,0x6e,0x75,0x46,0x72,0x61,0x6d,0x65,0x52,0x69,0x67,0x68,
-0x74,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x39,0x35,0x22,0x20,0x59,0x50,
-0x6f,0x73,0x3d,0x22,0x32,0x30,0x39,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,
-0x34,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x22,0x20,0x2f,0x3e,
-0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x50,
-0x6f,0x70,0x75,0x70,0x4d,0x65,0x6e,0x75,0x46,0x72,0x61,0x6d,0x65,0x54,0x6f,0x70,
-0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x39,0x31,0x22,0x20,0x59,0x50,0x6f,
-0x73,0x3d,0x22,0x32,0x30,0x34,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,
-0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x32,0x22,0x20,0x2f,0x3e,0x0a,
-0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x50,0x6f,
-0x70,0x75,0x70,0x4d,0x65,0x6e,0x75,0x46,0x72,0x61,0x6d,0x65,0x42,0x6f,0x74,0x74,
-0x6f,0x6d,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x39,0x31,0x22,0x20,0x59,
-0x50,0x6f,0x73,0x3d,0x22,0x32,0x31,0x33,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,
-0x22,0x31,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x34,0x22,0x20,0x2f,
-0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,
-0x50,0x6f,0x70,0x75,0x70,0x4d,0x65,0x6e,0x75,0x4d,0x69,0x64,0x64,0x6c,0x65,0x22,
-0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x39,0x31,0x22,0x20,0x59,0x50,0x6f,0x73,
-0x3d,0x22,0x32,0x30,0x39,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x22,
-0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x22,0x20,0x2f,0x3e,0x0a,0x09,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x50,0x6f,0x70,
-0x75,0x70,0x4d,0x65,0x6e,0x75,0x41,0x72,0x72,0x6f,0x77,0x52,0x69,0x67,0x68,0x74,
-0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x37,0x39,0x22,0x20,0x59,0x50,0x6f,
-0x73,0x3d,0x22,0x32,0x30,0x34,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x35,
-0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x35,0x22,0x20,0x2f,0x3e,0x0a,
-0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x50,0x6f,
-0x70,0x75,0x70,0x4d,0x65,0x6e,0x75,0x41,0x72,0x72,0x6f,0x77,0x4c,0x65,0x66,0x74,
-0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x37,0x39,0x22,0x20,0x59,0x50,0x6f,
-0x73,0x3d,0x22,0x32,0x31,0x30,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x35,
-0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x35,0x22,0x20,0x2f,0x3e,0x0a,
-0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x72,
-0x65,0x65,0x4c,0x69,0x73,0x74,0x43,0x6c,0x6f,0x73,0x65,0x64,0x22,0x20,0x58,0x50,
-0x6f,0x73,0x3d,0x22,0x31,0x37,0x35,0x22,0x20,0x59,0x50,0x6f,0x73,0x3d,0x22,0x31,
-0x31,0x31,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,0x37,0x22,0x20,0x48,0x65,
-0x69,0x67,0x68,0x74,0x3d,0x22,0x31,0x31,0x22,0x20,0x58,0x4f,0x66,0x66,0x73,0x65,
-0x74,0x3d,0x22,0x38,0x22,0x20,0x59,0x4f,0x66,0x66,0x73,0x65,0x74,0x3d,0x22,0x32,
-0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x4e,0x61,0x6d,
-0x65,0x3d,0x22,0x54,0x72,0x65,0x65,0x4c,0x69,0x73,0x74,0x4f,0x70,0x65,0x6e,0x65,
-0x64,0x22,0x20,0x58,0x50,0x6f,0x73,0x3d,0x22,0x31,0x36,0x34,0x22,0x20,0x59,0x50,
-0x6f,0x73,0x3d,0x22,0x31,0x31,0x31,0x22,0x20,0x57,0x69,0x64,0x74,0x68,0x3d,0x22,
-0x31,0x31,0x22,0x20,0x48,0x65,0x69,0x67,0x68,0x74,0x3d,0x22,0x37,0x22,0x20,0x58,
-0x4f,0x66,0x66,0x73,0x65,0x74,0x3d,0x22,0x38,0x22,0x20,0x59,0x4f,0x66,0x66,0x73,
-0x65,0x74,0x3d,0x22,0x32,0x22,0x2f,0x3e,0x0a,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,
-0x73,0x65,0x74,0x3e,0x0a};
diff --git a/client/gui/taharez_look.looknfeel.c b/client/gui/taharez_look.looknfeel.c
deleted file mode 100644
index 23549ada..00000000
--- a/client/gui/taharez_look.looknfeel.c
+++ /dev/null
@@ -1,15117 +0,0 @@
-const unsigned char taharez_look_looknfeel[] = {
-0x3c,0x3f,0x78,0x6d,0x6c,0x20,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x31,
-0x2e,0x30,0x22,0x20,0x3f,0x3e,0x0a,0x3c,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x21,0x2d,0x2d,0x0a,0x20,0x20,0x20,0x20,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x42,0x75,0x74,0x74,0x6f,0x6e,0x0a,0x20,0x20,
-0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x2d,0x2d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,
-0x42,0x75,0x74,0x74,0x6f,0x6e,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,
-0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4e,0x6f,0x72,0x6d,0x61,
-0x6c,0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x69,0x6e,0x69,
-0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x46,0x46,0x46,0x46,0x46,
-0x46,0x46,0x46,0x22,0x20,0x72,0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,
-0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,
-0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x48,
-0x6f,0x76,0x65,0x72,0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,
-0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x46,0x46,
-0x46,0x46,0x46,0x46,0x46,0x46,0x22,0x20,0x72,0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,
-0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,
-0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,
-0x3d,0x22,0x50,0x75,0x73,0x68,0x65,0x64,0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,
-0x75,0x72,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,
-0x3d,0x22,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x22,0x20,0x72,0x65,0x64,0x72,
-0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,
-0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x54,0x65,
-0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,
-0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,
-0x22,0x20,0x72,0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,
-0x22,0x74,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,
-0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x56,0x65,0x72,0x74,
-0x4c,0x61,0x62,0x65,0x6c,0x46,0x6f,0x72,0x6d,0x61,0x74,0x74,0x69,0x6e,0x67,0x22,
-0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x43,
-0x65,0x6e,0x74,0x72,0x65,0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,
-0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,
-0x65,0x3d,0x22,0x48,0x6f,0x72,0x7a,0x4c,0x61,0x62,0x65,0x6c,0x46,0x6f,0x72,0x6d,
-0x61,0x74,0x74,0x69,0x6e,0x67,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,
-0x61,0x6c,0x75,0x65,0x3d,0x22,0x43,0x65,0x6e,0x74,0x72,0x65,0x41,0x6c,0x69,0x67,
-0x6e,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,
-0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4e,0x6f,0x72,0x6d,0x61,0x6c,
-0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,
-0x6c,0x75,0x65,0x3d,0x22,0x22,0x20,0x72,0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,
-0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,
-0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,
-0x22,0x48,0x6f,0x76,0x65,0x72,0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x69,0x6e,0x69,
-0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x22,0x20,0x72,0x65,0x64,
-0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,
-0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,
-0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x50,0x75,0x73,0x68,0x65,0x64,0x49,0x6d,0x61,
-0x67,0x65,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,
-0x3d,0x22,0x22,0x20,0x72,0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,
-0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,
-0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,
-0x73,0x61,0x62,0x6c,0x65,0x64,0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x69,0x6e,0x69,
-0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x22,0x20,0x72,0x65,0x64,
-0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,
-0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,
-0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x56,0x65,0x72,0x74,0x49,0x6d,0x61,0x67,0x65,
-0x46,0x6f,0x72,0x6d,0x61,0x74,0x74,0x69,0x6e,0x67,0x22,0x20,0x69,0x6e,0x69,0x74,
-0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,0x74,0x63,
-0x68,0x65,0x64,0x22,0x20,0x72,0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,
-0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,
-0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x48,
-0x6f,0x72,0x7a,0x49,0x6d,0x61,0x67,0x65,0x46,0x6f,0x72,0x6d,0x61,0x74,0x74,0x69,
-0x6e,0x67,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,
-0x3d,0x22,0x53,0x74,0x72,0x65,0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x72,0x65,0x64,
-0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,
-0x65,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x54,0x65,0x78,0x74,0x43,0x6f,0x6d,0x70,
-0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,
-0x74,0x45,0x64,0x67,0x65,0x22,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,
-0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x3e,0x3c,
-0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,
-0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,
-0x64,0x74,0x68,0x22,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,
-0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,
-0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,
-0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,
-0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x56,0x65,0x72,0x74,0x4c,0x61,0x62,0x65,0x6c,
-0x46,0x6f,0x72,0x6d,0x61,0x74,0x74,0x69,0x6e,0x67,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,0x50,0x72,0x6f,0x70,0x65,0x72,
-0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x48,0x6f,0x72,0x7a,0x4c,0x61,0x62,
-0x65,0x6c,0x46,0x6f,0x72,0x6d,0x61,0x74,0x74,0x69,0x6e,0x67,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x54,
-0x65,0x78,0x74,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x46,0x72,0x61,0x6d,
-0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,
-0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x3e,0x3c,0x41,0x62,0x73,
-0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,
-0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,
-0x67,0x65,0x22,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,
-0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,
-0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x3e,0x3c,0x55,0x6e,
-0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,
-0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,
-0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,
-0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x42,0x75,0x74,0x74,0x6f,0x6e,0x4c,0x65,0x66,
-0x74,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,
-0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3d,0x22,0x42,0x75,0x74,0x74,0x6f,0x6e,0x52,0x69,0x67,0x68,0x74,0x4e,0x6f,0x72,
-0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x42,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x22,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x42,
-0x75,0x74,0x74,0x6f,0x6e,0x4d,0x69,0x64,0x64,0x6c,0x65,0x4e,0x6f,0x72,0x6d,0x61,
-0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,
-0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,
-0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,
-0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,
-0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,
-0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,
-0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,
-0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,
-0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,
-0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,
-0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,
-0x3d,0x22,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,0x50,0x72,0x6f,
-0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x56,0x65,0x72,0x74,
-0x49,0x6d,0x61,0x67,0x65,0x46,0x6f,0x72,0x6d,0x61,0x74,0x74,0x69,0x6e,0x67,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,0x50,
-0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x48,0x6f,
-0x72,0x7a,0x49,0x6d,0x61,0x67,0x65,0x46,0x6f,0x72,0x6d,0x61,0x74,0x74,0x69,0x6e,
-0x67,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,
-0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,
-0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x68,0x6f,
-0x76,0x65,0x72,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,
-0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,
-0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,
-0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,
-0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,
-0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,
-0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,
-0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,
-0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,
-0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,
-0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3d,0x22,0x42,0x75,0x74,0x74,0x6f,0x6e,0x4c,0x65,0x66,0x74,0x48,0x69,0x67,0x68,
-0x6c,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,
-0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,
-0x42,0x75,0x74,0x74,0x6f,0x6e,0x52,0x69,0x67,0x68,0x74,0x48,0x69,0x67,0x68,0x6c,
-0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,
-0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,
-0x42,0x75,0x74,0x74,0x6f,0x6e,0x4d,0x69,0x64,0x64,0x6c,0x65,0x48,0x69,0x67,0x68,
-0x6c,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,
-0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,
-0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,
-0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,
-0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,
-0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,
-0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,
-0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,
-0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,
-0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,
-0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x48,0x6f,0x76,0x65,0x72,0x49,0x6d,0x61,0x67,0x65,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,
-0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x56,
-0x65,0x72,0x74,0x49,0x6d,0x61,0x67,0x65,0x46,0x6f,0x72,0x6d,0x61,0x74,0x74,0x69,
-0x6e,0x67,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,
-0x61,0x74,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,
-0x22,0x48,0x6f,0x72,0x7a,0x49,0x6d,0x61,0x67,0x65,0x46,0x6f,0x72,0x6d,0x61,0x74,
-0x74,0x69,0x6e,0x67,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,
-0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,
-0x22,0x70,0x75,0x73,0x68,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,
-0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,
-0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,
-0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,
-0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,
-0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,
-0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,
-0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,
-0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,
-0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,
-0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,
-0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x3d,0x22,0x42,0x75,0x74,0x74,0x6f,0x6e,0x4c,0x65,0x66,0x74,
-0x50,0x75,0x73,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,
-0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,
-0x22,0x42,0x75,0x74,0x74,0x6f,0x6e,0x52,0x69,0x67,0x68,0x74,0x50,0x75,0x73,0x68,
-0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x42,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x42,0x75,
-0x74,0x74,0x6f,0x6e,0x4d,0x69,0x64,0x64,0x6c,0x65,0x50,0x75,0x73,0x68,0x65,0x64,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,
-0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,
-0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,
-0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,
-0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,
-0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,
-0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,
-0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,
-0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,
-0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,
-0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,
-0x22,0x50,0x75,0x73,0x68,0x65,0x64,0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x56,0x65,0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,0x50,0x72,0x6f,0x70,
-0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x56,0x65,0x72,0x74,0x49,
-0x6d,0x61,0x67,0x65,0x46,0x6f,0x72,0x6d,0x61,0x74,0x74,0x69,0x6e,0x67,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,0x50,0x72,
-0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x48,0x6f,0x72,
-0x7a,0x49,0x6d,0x61,0x67,0x65,0x46,0x6f,0x72,0x6d,0x61,0x74,0x74,0x69,0x6e,0x67,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,
-0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4e,0x6f,0x72,0x6d,0x61,
-0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,
-0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6e,0x6f,0x72,0x6d,0x61,0x6c,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x50,0x72,0x6f,0x70,0x65,0x72,
-0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x54,
-0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,
-0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,
-0x3d,0x22,0x48,0x6f,0x76,0x65,0x72,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,
-0x68,0x6f,0x76,0x65,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6c,0x61,0x62,0x65,
-0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x50,
-0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x48,0x6f,
-0x76,0x65,0x72,0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,
-0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x50,0x75,0x73,0x68,0x65,0x64,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,
-0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x3d,0x22,0x70,0x75,0x73,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,
-0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,
-0x6f,0x6c,0x6f,0x75,0x72,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x50,0x75,0x73,0x68,0x65,0x64,0x54,0x65,0x78,0x74,0x43,0x6f,
-0x6c,0x6f,0x75,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x50,0x75,0x73,
-0x68,0x65,0x64,0x4f,0x66,0x66,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x68,
-0x6f,0x76,0x65,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x50,0x72,
-0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x48,0x6f,0x76,
-0x65,0x72,0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,
-0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x20,0x74,0x6f,0x70,0x4c,
-0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x74,
-0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,
-0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,
-0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x52,
-0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,
-0x6c,0x61,0x62,0x65,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,
-0x6f,0x75,0x72,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,
-0x3d,0x22,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x54,0x65,0x78,0x74,0x43,0x6f,
-0x6c,0x6f,0x75,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,
-0x6b,0x3e,0x0a,0x0a,0x20,0x20,0x20,0x20,0x3c,0x21,0x2d,0x2d,0x0a,0x20,0x20,0x20,
-0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x52,0x61,0x64,0x69,0x6f,0x42,0x75,
-0x74,0x74,0x6f,0x6e,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,
-0x20,0x2d,0x2d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,
-0x4c,0x6f,0x6f,0x6b,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x52,0x61,0x64,0x69,0x6f,0x42,0x75,0x74,0x74,
-0x6f,0x6e,0x22,0x3e,0x0a,0x09,0x09,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,
-0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,
-0x22,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,
-0x72,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,
-0x22,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x22,0x20,0x72,0x65,0x64,0x72,0x61,
-0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,
-0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x48,0x6f,0x76,0x65,0x72,0x54,0x65,0x78,0x74,0x43,0x6f,
-0x6c,0x6f,0x75,0x72,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,
-0x75,0x65,0x3d,0x22,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x22,0x20,0x72,0x65,
-0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,
-0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,
-0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,
-0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x50,0x75,0x73,0x68,0x65,0x64,0x54,0x65,
-0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,
-0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,
-0x22,0x20,0x72,0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,
-0x22,0x74,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,
-0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,0x61,
-0x62,0x6c,0x65,0x64,0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,
-0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x46,0x46,
-0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x72,0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,
-0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,
-0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x6c,0x61,
-0x62,0x65,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x54,0x65,0x78,0x74,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,
-0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x3d,0x22,0x52,0x61,0x64,0x69,0x6f,0x42,0x75,0x74,0x74,0x6f,0x6e,0x4e,
-0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,
-0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,
-0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x41,0x64,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x62,
-0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,
-0x22,0x33,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,
-0x65,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,
-0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,
-0x67,0x65,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,
-0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,
-0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,
-0x65,0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x43,0x65,0x6e,0x74,0x72,0x65,0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x54,0x65,0x78,0x74,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,
-0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,
-0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,
-0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,
-0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,
-0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,
-0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,
-0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,
-0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,
-0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,
-0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,
-0x52,0x61,0x64,0x69,0x6f,0x42,0x75,0x74,0x74,0x6f,0x6e,0x4e,0x6f,0x72,0x6d,0x61,
-0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,
-0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x43,0x65,0x6e,0x74,0x72,0x65,0x41,0x6c,
-0x69,0x67,0x6e,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,
-0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,
-0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,
-0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x68,0x6f,0x76,0x65,0x72,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,
-0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,
-0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,
-0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,
-0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,
-0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,
-0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,
-0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,
-0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,
-0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,
-0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,
-0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,
-0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x52,0x61,0x64,0x69,0x6f,0x42,
-0x75,0x74,0x74,0x6f,0x6e,0x48,0x6f,0x76,0x65,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x56,0x65,0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x43,0x65,0x6e,0x74,0x72,0x65,0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,
-0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x73,0x65,0x6c,
-0x65,0x63,0x74,0x5f,0x6d,0x61,0x72,0x6b,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,
-0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,
-0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,
-0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,
-0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,
-0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,
-0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,
-0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,
-0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,
-0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x52,0x61,0x64,0x69,0x6f,0x42,0x75,
-0x74,0x74,0x6f,0x6e,0x4d,0x61,0x72,0x6b,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,
-0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x43,
-0x65,0x6e,0x74,0x72,0x65,0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,
-0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,
-0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,
-0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,
-0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x54,0x65,0x78,
-0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,
-0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,
-0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,
-0x48,0x6f,0x76,0x65,0x72,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x68,0x6f,
-0x76,0x65,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,
-0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x50,0x72,0x6f,
-0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x48,0x6f,0x76,0x65,
-0x72,0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,
-0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x3d,0x22,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x20,0x74,0x6f,0x70,0x4c,0x65,
-0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x74,0x6f,
-0x70,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,
-0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,
-0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,
-0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6c,
-0x61,0x62,0x65,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,
-0x75,0x72,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,
-0x22,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,
-0x6f,0x75,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,
-0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x53,0x65,0x6c,0x65,
-0x63,0x74,0x65,0x64,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x3d,0x22,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,
-0x73,0x65,0x6c,0x65,0x63,0x74,0x5f,0x6d,0x61,0x72,0x6b,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,
-0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,
-0x6f,0x6c,0x6f,0x75,0x72,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x54,0x65,0x78,0x74,0x43,0x6f,
-0x6c,0x6f,0x75,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x53,0x65,0x6c,
-0x65,0x63,0x74,0x65,0x64,0x48,0x6f,0x76,0x65,0x72,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x3d,0x22,0x68,0x6f,0x76,0x65,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x73,
-0x65,0x6c,0x65,0x63,0x74,0x5f,0x6d,0x61,0x72,0x6b,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,
-0x22,0x6c,0x61,0x62,0x65,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,
-0x6c,0x6f,0x75,0x72,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,
-0x65,0x3d,0x22,0x48,0x6f,0x76,0x65,0x72,0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,
-0x75,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x53,0x65,0x6c,0x65,0x63,
-0x74,0x65,0x64,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x3d,0x22,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x20,0x74,0x6f,0x70,0x4c,0x65,0x66,
-0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x74,0x6f,0x70,
-0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,
-0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,
-0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,
-0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x73,0x65,
-0x6c,0x65,0x63,0x74,0x5f,0x6d,0x61,0x72,0x6b,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x20,0x74,0x6f,0x70,0x4c,0x65,0x66,0x74,
-0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x74,0x6f,0x70,0x52,
-0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,
-0x62,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,
-0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,
-0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6c,0x61,0x62,
-0x65,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,
-0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,
-0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,
-0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,
-0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x3e,0x0a,
-0x0a,0x20,0x20,0x20,0x20,0x3c,0x21,0x2d,0x2d,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x43,0x68,0x65,0x63,0x6b,0x62,0x6f,0x78,0x0a,0x20,
-0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x2d,0x2d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x2f,0x43,0x68,0x65,0x63,0x6b,0x62,0x6f,0x78,0x22,0x3e,0x0a,0x09,0x09,0x3c,0x50,
-0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,
-0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x54,0x65,
-0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,
-0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,
-0x22,0x20,0x72,0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,
-0x22,0x74,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,
-0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x48,0x6f,0x76,0x65,
-0x72,0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x69,0x6e,0x69,
-0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x46,0x46,0x46,0x46,0x46,
-0x46,0x46,0x46,0x22,0x20,0x72,0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,
-0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,
-0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x50,
-0x75,0x73,0x68,0x65,0x64,0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,
-0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x46,
-0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x22,0x20,0x72,0x65,0x64,0x72,0x61,0x77,0x4f,
-0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,
-0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,
-0x65,0x3d,0x22,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x54,0x65,0x78,0x74,0x43,
-0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,
-0x6c,0x75,0x65,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x72,
-0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,
-0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x54,0x65,0x78,0x74,0x43,0x6f,
-0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,
-0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x43,0x68,0x65,0x63,0x6b,
-0x62,0x6f,0x78,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,
-0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,
-0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x41,0x64,0x64,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,
-0x6c,0x75,0x65,0x3d,0x22,0x33,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,
-0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,
-0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,
-0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,
-0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,
-0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,
-0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,
-0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x43,0x65,0x6e,0x74,0x72,0x65,0x41,0x6c,0x69,0x67,0x6e,0x65,
-0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,
-0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x41,0x6c,0x69,0x67,
-0x6e,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x54,0x65,0x78,0x74,0x43,0x6f,0x6d,0x70,0x6f,0x6e,
-0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x6e,0x6f,0x72,
-0x6d,0x61,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,
-0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,
-0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,
-0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,
-0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,
-0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,
-0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,
-0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,
-0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x3d,0x22,0x43,0x68,0x65,0x63,0x6b,0x62,0x6f,0x78,0x4e,0x6f,0x72,0x6d,
-0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x46,0x6f,0x72,0x6d,
-0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x43,0x65,0x6e,0x74,0x72,0x65,0x41,
-0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,
-0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,
-0x74,0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,
-0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x68,0x6f,0x76,0x65,0x72,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,
-0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,
-0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,
-0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,
-0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,
-0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,
-0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,
-0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,
-0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,
-0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,
-0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,
-0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,
-0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x43,0x68,0x65,0x63,0x6b,
-0x62,0x6f,0x78,0x48,0x6f,0x76,0x65,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,
-0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x43,
-0x65,0x6e,0x74,0x72,0x65,0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,
-0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x73,0x65,0x6c,0x65,0x63,
-0x74,0x5f,0x6d,0x61,0x72,0x6b,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,
-0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,
-0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,
-0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,
-0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,
-0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,
-0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,
-0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,
-0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,
-0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,
-0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x43,0x68,0x65,0x63,0x6b,0x62,0x6f,0x78,0x4d,
-0x61,0x72,0x6b,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x46,0x6f,0x72,
-0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x43,0x65,0x6e,0x74,0x72,0x65,
-0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,
-0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,
-0x66,0x74,0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,
-0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x3d,0x22,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,
-0x6c,0x61,0x62,0x65,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,
-0x6f,0x75,0x72,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,
-0x3d,0x22,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,
-0x75,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x48,0x6f,0x76,0x65,0x72,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,
-0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x68,0x6f,0x76,0x65,0x72,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,
-0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x48,0x6f,0x76,0x65,0x72,0x54,0x65,0x78,0x74,
-0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,
-0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,
-0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,
-0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,
-0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,
-0x6c,0x6f,0x75,0x72,0x73,0x20,0x74,0x6f,0x70,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,
-0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x74,0x6f,0x70,0x52,0x69,0x67,0x68,
-0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,
-0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,
-0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,
-0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,
-0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x50,0x72,0x6f,
-0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,0x61,
-0x62,0x6c,0x65,0x64,0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,
-0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,
-0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,
-0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x53,0x65,0x6c,0x65,0x63,0x74,0x65,0x64,0x4e,
-0x6f,0x72,0x6d,0x61,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6e,0x6f,
-0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x73,0x65,0x6c,0x65,0x63,
-0x74,0x5f,0x6d,0x61,0x72,0x6b,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6c,0x61,0x62,
-0x65,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,
-0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4e,
-0x6f,0x72,0x6d,0x61,0x6c,0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,
-0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,
-0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,
-0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x53,0x65,0x6c,0x65,0x63,0x74,0x65,0x64,
-0x48,0x6f,0x76,0x65,0x72,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x68,0x6f,
-0x76,0x65,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,
-0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x73,0x65,0x6c,0x65,0x63,0x74,
-0x5f,0x6d,0x61,0x72,0x6b,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6c,0x61,0x62,0x65,
-0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x50,
-0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x48,0x6f,
-0x76,0x65,0x72,0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,
-0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x53,0x65,0x6c,0x65,0x63,0x74,0x65,0x64,0x44,0x69,
-0x73,0x61,0x62,0x6c,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6e,
-0x6f,0x72,0x6d,0x61,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,
-0x6f,0x75,0x72,0x73,0x20,0x74,0x6f,0x70,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,
-0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x74,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,
-0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,
-0x6f,0x6d,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,
-0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,
-0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,
-0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x73,0x65,0x6c,0x65,0x63,0x74,0x5f,
-0x6d,0x61,0x72,0x6b,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,
-0x75,0x72,0x73,0x20,0x74,0x6f,0x70,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,
-0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x74,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x3d,
-0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,
-0x6d,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,
-0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,
-0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x50,0x72,0x6f,0x70,0x65,
-0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,0x61,0x62,0x6c,
-0x65,0x64,0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x57,
-0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x3e,0x0a,0x0a,0x20,0x20,0x20,0x20,
-0x3c,0x21,0x2d,0x2d,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x2f,0x45,0x64,0x69,0x74,0x62,0x6f,0x78,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x0a,0x20,0x20,0x20,0x20,0x2d,0x2d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,
-0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x45,0x64,0x69,0x74,0x62,
-0x6f,0x78,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,
-0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,
-0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x54,0x65,0x78,
-0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,
-0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x22,
-0x20,0x72,0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,
-0x74,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,
-0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x53,0x65,0x6c,0x65,0x63,
-0x74,0x65,0x64,0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x69,
-0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x46,0x46,0x30,
-0x30,0x30,0x30,0x30,0x30,0x22,0x20,0x72,0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,
-0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,
-0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,
-0x22,0x41,0x63,0x74,0x69,0x76,0x65,0x53,0x65,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,
-0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,
-0x61,0x6c,0x75,0x65,0x3d,0x22,0x46,0x46,0x36,0x30,0x37,0x46,0x46,0x46,0x22,0x20,
-0x72,0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,
-0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,
-0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x49,0x6e,0x61,0x63,0x74,0x69,
-0x76,0x65,0x53,0x65,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x43,0x6f,0x6c,0x6f,0x75,
-0x72,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,
-0x22,0x46,0x46,0x38,0x30,0x38,0x30,0x38,0x30,0x22,0x20,0x72,0x65,0x64,0x72,0x61,
-0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,
-0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4d,0x6f,0x75,0x73,0x65,
-0x43,0x75,0x72,0x73,0x6f,0x72,0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x76,0x61,0x6c,
-0x75,0x65,0x3d,0x22,0x73,0x65,0x74,0x3a,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,
-0x6f,0x6f,0x6b,0x20,0x69,0x6d,0x61,0x67,0x65,0x3a,0x4d,0x6f,0x75,0x73,0x65,0x54,
-0x65,0x78,0x74,0x42,0x61,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x54,0x65,0x78,0x74,0x41,0x72,0x65,0x61,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,
-0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,
-0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x35,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,
-0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,
-0x22,0x35,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,
-0x65,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,
-0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x2e,0x30,0x22,0x20,0x6f,0x66,0x66,0x73,
-0x65,0x74,0x3d,0x22,0x2d,0x35,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,
-0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,
-0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,
-0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x2e,0x30,
-0x22,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x3d,0x22,0x2d,0x35,0x22,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,
-0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,
-0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,
-0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,
-0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,
-0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,
-0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,
-0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,
-0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,
-0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,
-0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x45,
-0x64,0x69,0x74,0x42,0x6f,0x78,0x4c,0x65,0x66,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,
-0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x3d,0x22,0x45,0x64,0x69,0x74,0x42,0x6f,0x78,0x52,0x69,0x67,0x68,
-0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x42,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x45,0x64,0x69,
-0x74,0x42,0x6f,0x78,0x4d,0x69,0x64,0x64,0x6c,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x46,0x72,0x61,
-0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x73,0x65,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,
-0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,
-0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,
-0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,
-0x67,0x65,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,
-0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x2e,0x30,0x22,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,
-0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,
-0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x2e,0x30,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x3d,0x22,0x54,0x65,0x78,0x74,0x53,0x65,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,
-0x42,0x72,0x75,0x73,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x46,
-0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,
-0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,
-0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,
-0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,
-0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,
-0x3d,0x22,0x43,0x61,0x72,0x61,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,
-0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,
-0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,
-0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,
-0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,
-0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3d,0x22,0x45,0x64,0x69,0x74,0x42,0x6f,0x78,0x43,0x61,0x72,0x61,0x74,0x22,0x20,
-0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,
-0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,
-0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x2e,0x30,0x22,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,
-0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x45,0x64,0x69,0x74,0x42,0x6f,0x78,0x43,0x61,
-0x72,0x61,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x46,0x6f,0x72,
-0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,0x74,0x63,
-0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,
-0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,0x74,0x63,
-0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,
-0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x45,0x6e,
-0x61,0x62,0x6c,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x63,0x6f,
-0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,
-0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x52,0x65,0x61,0x64,
-0x4f,0x6e,0x6c,0x79,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x63,0x6f,0x6e,
-0x74,0x61,0x69,0x6e,0x65,0x72,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,0x61,0x62,
-0x6c,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x63,0x6f,0x6e,0x74,
-0x61,0x69,0x6e,0x65,0x72,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x20,0x74,0x6f,0x70,0x4c,
-0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x74,
-0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,
-0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,
-0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x52,
-0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,
-0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,
-0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,
-0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x41,0x63,0x74,0x69,0x76,0x65,0x53,0x65,0x6c,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x73,
-0x65,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x43,0x6f,0x6c,0x6f,0x75,0x72,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x41,0x63,0x74,0x69,0x76,0x65,0x53,0x65,0x6c,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,
-0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,
-0x65,0x3d,0x22,0x49,0x6e,0x61,0x63,0x74,0x69,0x76,0x65,0x53,0x65,0x6c,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x73,0x65,0x6c,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,
-0x6c,0x6f,0x75,0x72,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,
-0x65,0x3d,0x22,0x49,0x6e,0x61,0x63,0x74,0x69,0x76,0x65,0x53,0x65,0x6c,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,
-0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x57,0x69,0x64,
-0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x3e,0x0a,0x0a,0x20,0x20,0x20,0x20,0x3c,0x21,
-0x2d,0x2d,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x54,
-0x69,0x74,0x6c,0x65,0x62,0x61,0x72,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,
-0x20,0x20,0x20,0x20,0x2d,0x2d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,
-0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x54,0x69,0x74,0x6c,0x65,0x62,
-0x61,0x72,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,
-0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,
-0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x43,0x61,0x70,0x74,0x69,0x6f,0x6e,0x43,0x6f,
-0x6c,0x6f,0x75,0x72,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,
-0x75,0x65,0x3d,0x22,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x22,0x20,0x72,0x65,
-0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,
-0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x6d,0x61,0x69,0x6e,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,
-0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,
-0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,
-0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,
-0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,
-0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x2e,
-0x30,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,
-0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,
-0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,
-0x6c,0x65,0x3d,0x22,0x31,0x2e,0x30,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,
-0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4e,0x65,0x77,
-0x54,0x69,0x74,0x6c,0x65,0x62,0x61,0x72,0x4c,0x65,0x66,0x74,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x56,0x65,0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x53,0x74,0x72,0x65,0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,
-0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,
-0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,
-0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,
-0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,
-0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,
-0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,
-0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,
-0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,
-0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x3d,0x22,0x53,0x79,0x73,0x41,0x72,0x65,0x61,0x52,0x69,0x67,
-0x68,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,
-0x69,0x64,0x74,0x68,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,
-0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x41,0x64,0x64,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3d,0x22,0x53,0x79,0x73,0x41,0x72,0x65,0x61,0x4d,0x69,0x64,0x64,0x6c,0x65,0x22,
-0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,
-0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,
-0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,
-0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,
-0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x2e,0x30,0x22,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x3d,0x22,0x4e,0x65,0x77,0x54,0x69,0x74,0x6c,0x65,0x62,0x61,0x72,
-0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x46,
-0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,
-0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,
-0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,
-0x74,0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,
-0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,
-0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,
-0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,
-0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,
-0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,
-0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,
-0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,
-0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,
-0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3d,0x22,0x53,0x79,0x73,0x41,0x72,0x65,0x61,0x52,0x69,0x67,0x68,0x74,0x22,0x20,
-0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,
-0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,
-0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x2e,0x30,0x22,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x3d,0x22,0x53,0x79,0x73,0x41,0x72,0x65,0x61,0x4d,0x69,0x64,0x64,
-0x6c,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x46,0x6f,0x72,0x6d,
-0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,0x74,0x63,0x68,
-0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,
-0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x41,0x6c,
-0x69,0x67,0x6e,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,
-0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,
-0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,
-0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,
-0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,
-0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,
-0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,
-0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x2e,0x30,
-0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,
-0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,
-0x65,0x3d,0x22,0x31,0x2e,0x30,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,
-0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,
-0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x53,0x79,0x73,0x41,
-0x72,0x65,0x61,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,
-0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,
-0x74,0x72,0x65,0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,
-0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,
-0x69,0x67,0x68,0x74,0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,
-0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,
-0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4e,0x65,0x77,0x54,0x69,0x74,0x6c,0x65,
-0x62,0x61,0x72,0x4c,0x65,0x66,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,
-0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,
-0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,
-0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,
-0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,
-0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,
-0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,
-0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x53,0x79,0x73,0x41,0x72,0x65,0x61,
-0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,
-0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x41,
-0x64,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x3d,0x22,0x53,0x79,0x73,0x41,0x72,0x65,0x61,0x4d,0x69,0x64,0x64,
-0x6c,0x65,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,
-0x69,0x64,0x74,0x68,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,
-0x6f,0x70,0x3d,0x22,0x41,0x64,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3d,0x22,0x4e,0x65,0x77,0x54,0x69,0x74,0x6c,0x65,0x62,0x61,0x72,0x52,0x69,0x67,
-0x68,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,
-0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,
-0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,
-0x61,0x67,0x65,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,
-0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,
-0x67,0x65,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,
-0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,
-0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x2e,
-0x30,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,
-0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4e,0x65,0x77,0x54,0x69,0x74,0x6c,0x65,0x62,
-0x61,0x72,0x4d,0x69,0x64,0x64,0x6c,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,
-0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,
-0x74,0x72,0x65,0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,
-0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,
-0x74,0x72,0x65,0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,
-0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x63,0x61,0x70,0x74,0x69,0x6f,0x6e,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x54,0x65,0x78,0x74,
-0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x3d,0x22,0x4e,0x65,0x77,0x54,0x69,0x74,0x6c,0x65,0x62,0x61,0x72,0x4c,
-0x65,0x66,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,
-0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,
-0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,
-0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,
-0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,
-0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,
-0x65,0x3d,0x22,0x31,0x22,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x3d,0x22,0x2d,0x37,
-0x35,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,
-0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,
-0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,
-0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,
-0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x50,0x72,0x6f,
-0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x43,0x61,0x70,0x74,
-0x69,0x6f,0x6e,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,
-0x65,0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x43,0x65,0x6e,0x74,0x72,0x65,0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x54,0x65,0x78,0x74,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,
-0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x41,0x63,0x74,0x69,0x76,0x65,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x3d,0x22,0x6d,0x61,0x69,0x6e,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x63,
-0x61,0x70,0x74,0x69,0x6f,0x6e,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x49,0x6e,0x61,0x63,0x74,0x69,0x76,0x65,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,
-0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x3d,0x22,0x6d,0x61,0x69,0x6e,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,
-0x63,0x61,0x70,0x74,0x69,0x6f,0x6e,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,
-0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6d,0x61,0x69,0x6e,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x20,0x74,0x6f,0x70,0x4c,0x65,0x66,
-0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x74,0x6f,0x70,
-0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,
-0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,
-0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,
-0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x63,0x61,
-0x70,0x74,0x69,0x6f,0x6e,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,
-0x6f,0x75,0x72,0x73,0x20,0x74,0x6f,0x70,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,
-0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x74,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,
-0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,
-0x6f,0x6d,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,
-0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,
-0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,
-0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x57,0x69,0x64,0x67,0x65,0x74,
-0x4c,0x6f,0x6f,0x6b,0x3e,0x0a,0x0a,0x20,0x20,0x20,0x20,0x3c,0x21,0x2d,0x2d,0x0a,
-0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x46,0x72,0x61,0x6d,
-0x65,0x57,0x69,0x6e,0x64,0x6f,0x77,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,
-0x20,0x20,0x20,0x20,0x2d,0x2d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,
-0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x46,0x72,0x61,0x6d,0x65,0x57,
-0x69,0x6e,0x64,0x6f,0x77,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,
-0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x43,0x6c,0x69,0x65,0x6e,0x74,
-0x41,0x72,0x65,0x61,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x69,0x6e,0x69,0x74,
-0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x46,0x46,0x31,0x34,0x31,0x42,
-0x33,0x38,0x22,0x20,0x72,0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,
-0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x4c,0x69,0x6e,
-0x6b,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,
-0x3d,0x22,0x43,0x61,0x70,0x74,0x69,0x6f,0x6e,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,
-0x20,0x77,0x69,0x64,0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,
-0x74,0x69,0x74,0x6c,0x65,0x62,0x61,0x72,0x5f,0x5f,0x22,0x20,0x74,0x61,0x72,0x67,
-0x65,0x74,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x3d,0x22,0x43,0x61,0x70,0x74,
-0x69,0x6f,0x6e,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,
-0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x46,0x46,0x46,0x46,0x46,0x46,0x46,
-0x46,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,
-0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x4c,0x69,0x6e,0x6b,0x44,0x65,0x66,0x69,0x6e,
-0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x69,0x74,0x6c,
-0x65,0x62,0x61,0x72,0x46,0x6f,0x6e,0x74,0x22,0x20,0x77,0x69,0x64,0x67,0x65,0x74,
-0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x74,0x69,0x74,0x6c,0x65,0x62,0x61,
-0x72,0x5f,0x5f,0x22,0x20,0x74,0x61,0x72,0x67,0x65,0x74,0x50,0x72,0x6f,0x70,0x65,
-0x72,0x74,0x79,0x3d,0x22,0x46,0x6f,0x6e,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4e,0x53,0x53,0x69,0x7a,0x69,0x6e,0x67,0x43,0x75,
-0x72,0x73,0x6f,0x72,0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,
-0x3d,0x22,0x73,0x65,0x74,0x3a,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,
-0x6b,0x20,0x69,0x6d,0x61,0x67,0x65,0x3a,0x4d,0x6f,0x75,0x73,0x65,0x4e,0x6f,0x53,
-0x6f,0x43,0x75,0x72,0x73,0x6f,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x45,0x57,0x53,0x69,0x7a,0x69,0x6e,0x67,0x43,0x75,0x72,0x73,
-0x6f,0x72,0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,
-0x73,0x65,0x74,0x3a,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x3a,0x4d,0x6f,0x75,0x73,0x65,0x45,0x73,0x57,0x65,0x43,
-0x75,0x72,0x73,0x6f,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,
-0x3d,0x22,0x4e,0x57,0x53,0x45,0x53,0x69,0x7a,0x69,0x6e,0x67,0x43,0x75,0x72,0x73,
-0x6f,0x72,0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,
-0x73,0x65,0x74,0x3a,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x3a,0x4d,0x6f,0x75,0x73,0x65,0x4e,0x77,0x53,0x65,0x43,
-0x75,0x72,0x73,0x6f,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,
-0x3d,0x22,0x4e,0x45,0x53,0x57,0x53,0x69,0x7a,0x69,0x6e,0x67,0x43,0x75,0x72,0x73,
-0x6f,0x72,0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,
-0x73,0x65,0x74,0x3a,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x3a,0x4d,0x6f,0x75,0x73,0x65,0x4e,0x65,0x53,0x77,0x43,
-0x75,0x72,0x73,0x6f,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,
-0x3d,0x22,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x4d,0x69,0x6e,0x53,0x69,0x7a,0x65,
-0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x7b,0x7b,0x30,0x2e,0x31,0x2c,0x30,
-0x7d,0x2c,0x7b,0x30,0x2e,0x31,0x2c,0x30,0x7d,0x7d,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,
-0x61,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x43,0x6c,0x69,0x65,0x6e,0x74,0x57,0x69,
-0x74,0x68,0x54,0x69,0x74,0x6c,0x65,0x57,0x69,0x74,0x68,0x46,0x72,0x61,0x6d,0x65,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x3d,0x22,0x57,0x69,0x6e,0x64,0x6f,0x77,0x54,0x6f,0x70,0x4c,0x65,0x66,
-0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,
-0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,
-0x22,0x20,0x3e,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x44,0x69,0x6d,0x20,0x77,0x69,
-0x64,0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x74,0x69,0x74,
-0x6c,0x65,0x62,0x61,0x72,0x5f,0x5f,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,
-0x6f,0x6e,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,
-0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,
-0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,
-0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x3d,0x22,0x57,0x69,0x6e,0x64,0x6f,0x77,0x54,0x6f,0x70,0x52,0x69,
-0x67,0x68,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,
-0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,
-0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,
-0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,
-0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,
-0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,
-0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x57,0x69,0x6e,0x64,0x6f,0x77,0x42,0x6f,
-0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,
-0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,
-0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,
-0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,
-0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4e,0x61,
-0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x20,0x6e,0x61,0x6d,0x65,
-0x3d,0x22,0x43,0x6c,0x69,0x65,0x6e,0x74,0x57,0x69,0x74,0x68,0x54,0x69,0x74,0x6c,
-0x65,0x4e,0x6f,0x46,0x72,0x61,0x6d,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,
-0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,
-0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,
-0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,
-0x44,0x69,0x6d,0x20,0x77,0x69,0x64,0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,
-0x74,0x6f,0x5f,0x74,0x69,0x74,0x6c,0x65,0x62,0x61,0x72,0x5f,0x5f,0x22,0x20,0x64,
-0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,
-0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,
-0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,
-0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,
-0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,
-0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x44,0x69,0x6d,
-0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x42,0x6f,0x74,0x74,
-0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,
-0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4e,
-0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x20,0x6e,0x61,0x6d,
-0x65,0x3d,0x22,0x43,0x6c,0x69,0x65,0x6e,0x74,0x4e,0x6f,0x54,0x69,0x74,0x6c,0x65,
-0x57,0x69,0x74,0x68,0x46,0x72,0x61,0x6d,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,
-0x67,0x65,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x57,0x69,0x6e,
-0x64,0x6f,0x77,0x54,0x6f,0x70,0x4c,0x65,0x66,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,
-0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x3d,0x22,0x57,0x69,0x6e,0x64,0x6f,0x77,0x54,0x6f,0x70,0x45,0x64,0x67,
-0x65,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,
-0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,
-0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,
-0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,
-0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,
-0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x57,0x69,0x6e,0x64,0x6f,
-0x77,0x54,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,
-0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,
-0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,
-0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,
-0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,
-0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,
-0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,
-0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,
-0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x57,0x69,
-0x6e,0x64,0x6f,0x77,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,
-0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,
-0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,
-0x61,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x43,0x6c,0x69,0x65,0x6e,0x74,0x4e,0x6f,
-0x54,0x69,0x74,0x6c,0x65,0x4e,0x6f,0x46,0x72,0x61,0x6d,0x65,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,
-0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,
-0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,
-0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,
-0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,
-0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,
-0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,
-0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,
-0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,
-0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,
-0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4e,0x61,0x6d,0x65,0x64,
-0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,
-0x68,0x69,0x6c,0x64,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x54,0x69,0x74,0x6c,0x65,0x62,0x61,0x72,0x22,
-0x20,0x6e,0x61,0x6d,0x65,0x53,0x75,0x66,0x66,0x69,0x78,0x3d,0x22,0x5f,0x5f,0x61,
-0x75,0x74,0x6f,0x5f,0x74,0x69,0x74,0x6c,0x65,0x62,0x61,0x72,0x5f,0x5f,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,
-0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,
-0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,
-0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,
-0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,
-0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,
-0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,
-0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,
-0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,
-0x20,0x3e,0x3c,0x46,0x6f,0x6e,0x74,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x4c,0x69,0x6e,0x65,0x53,0x70,0x61,0x63,0x69,0x6e,0x67,0x22,0x20,0x70,0x61,
-0x64,0x64,0x69,0x6e,0x67,0x3d,0x22,0x38,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,
-0x65,0x3d,0x22,0x41,0x6c,0x77,0x61,0x79,0x73,0x4f,0x6e,0x54,0x6f,0x70,0x22,0x20,
-0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x46,0x61,0x6c,0x73,0x65,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x43,0x68,0x69,0x6c,0x64,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x68,0x69,0x6c,0x64,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x2f,0x53,0x79,0x73,0x74,0x65,0x6d,0x42,0x75,0x74,0x74,0x6f,0x6e,0x22,
-0x20,0x6e,0x61,0x6d,0x65,0x53,0x75,0x66,0x66,0x69,0x78,0x3d,0x22,0x5f,0x5f,0x61,
-0x75,0x74,0x6f,0x5f,0x63,0x6c,0x6f,0x73,0x65,0x62,0x75,0x74,0x74,0x6f,0x6e,0x5f,
-0x5f,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,
-0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,
-0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,
-0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,
-0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,
-0x22,0x53,0x79,0x73,0x41,0x72,0x65,0x61,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x64,
-0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,
-0x70,0x3d,0x22,0x41,0x64,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x3d,0x22,0x53,0x79,0x73,0x41,0x72,0x65,0x61,0x4d,0x69,0x64,0x64,
-0x6c,0x65,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,
-0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,
-0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,
-0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,
-0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,
-0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x62,0x73,0x6f,0x6c,
-0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x2e,
-0x35,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x4d,0x75,0x6c,
-0x74,0x69,0x70,0x6c,0x79,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x44,0x69,0x6d,0x20,0x77,
-0x69,0x64,0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x74,0x69,
-0x74,0x6c,0x65,0x62,0x61,0x72,0x5f,0x5f,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,
-0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,
-0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,
-0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x3d,0x22,0x4e,0x65,0x77,0x43,0x6c,0x6f,0x73,0x65,0x42,0x75,
-0x74,0x74,0x6f,0x6e,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x64,0x69,0x6d,0x65,
-0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x57,0x69,
-0x64,0x67,0x65,0x74,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x3d,0x22,0x4e,0x65,0x77,0x43,0x6c,0x6f,0x73,0x65,0x42,0x75,0x74,
-0x74,0x6f,0x6e,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,
-0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3d,0x22,0x4e,0x65,0x77,0x43,0x6c,0x6f,0x73,0x65,0x42,0x75,0x74,0x74,0x6f,0x6e,
-0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,
-0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,
-0x65,0x3d,0x22,0x41,0x6c,0x77,0x61,0x79,0x73,0x4f,0x6e,0x54,0x6f,0x70,0x22,0x20,
-0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x54,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,
-0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4e,0x6f,0x72,0x6d,
-0x61,0x6c,0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,
-0x73,0x65,0x74,0x3a,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x3a,0x4e,0x65,0x77,0x43,0x6c,0x6f,0x73,0x65,0x42,0x75,
-0x74,0x74,0x6f,0x6e,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,
-0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x48,0x6f,0x76,0x65,0x72,
-0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x73,0x65,
-0x74,0x3a,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x3a,0x4e,0x65,0x77,0x43,0x6c,0x6f,0x73,0x65,0x42,0x75,0x74,0x74,
-0x6f,0x6e,0x48,0x6f,0x76,0x65,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,
-0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x50,0x75,0x73,0x68,0x65,0x64,0x49,0x6d,
-0x61,0x67,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x73,0x65,0x74,0x3a,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x3a,0x4e,0x65,0x77,0x43,0x6c,0x6f,0x73,0x65,0x42,0x75,0x74,0x74,0x6f,0x6e,
-0x50,0x72,0x65,0x73,0x73,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x43,0x68,0x69,0x6c,0x64,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x77,0x69,0x74,0x68,0x74,
-0x69,0x74,0x6c,0x65,0x5f,0x66,0x72,0x61,0x6d,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x46,0x72,0x61,0x6d,0x65,0x43,
-0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,
-0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,
-0x65,0x22,0x20,0x3e,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x44,0x69,0x6d,0x20,0x77,
-0x69,0x64,0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x74,0x69,
-0x74,0x6c,0x65,0x62,0x61,0x72,0x5f,0x5f,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,
-0x69,0x6f,0x6e,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,
-0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,
-0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,
-0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,
-0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,
-0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,
-0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x57,
-0x69,0x6e,0x64,0x6f,0x77,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x43,0x6f,0x72,0x6e,
-0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3d,0x22,0x57,0x69,0x6e,0x64,0x6f,0x77,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,
-0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x57,0x69,0x6e,
-0x64,0x6f,0x77,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,
-0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,
-0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x3d,0x22,0x57,0x69,0x6e,0x64,0x6f,0x77,0x52,0x69,0x67,0x68,
-0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,
-0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,
-0x22,0x57,0x69,0x6e,0x64,0x6f,0x77,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,
-0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,
-0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,
-0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,
-0x65,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,
-0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x57,0x69,0x6e,0x64,
-0x6f,0x77,0x54,0x6f,0x70,0x4c,0x65,0x66,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,
-0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,
-0x57,0x69,0x64,0x67,0x65,0x74,0x44,0x69,0x6d,0x20,0x77,0x69,0x64,0x67,0x65,0x74,
-0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x74,0x69,0x74,0x6c,0x65,0x62,0x61,
-0x72,0x5f,0x5f,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,
-0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,
-0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,
-0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,
-0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x57,0x69,0x6e,
-0x64,0x6f,0x77,0x54,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x64,0x69,0x6d,
-0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,
-0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,
-0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,
-0x65,0x69,0x67,0x68,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,
-0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,
-0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x57,0x69,0x6e,0x64,0x6f,0x77,0x42,0x6f,
-0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,
-0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,
-0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,
-0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x47,0x65,0x6e,0x65,0x72,0x69,0x63,
-0x42,0x72,0x75,0x73,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,
-0x72,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,
-0x43,0x6c,0x69,0x65,0x6e,0x74,0x41,0x72,0x65,0x61,0x43,0x6f,0x6c,0x6f,0x75,0x72,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,0x74,0x63,0x68,0x65,0x64,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,0x74,0x63,0x68,0x65,0x64,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,
-0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x6e,0x6f,0x74,
-0x69,0x74,0x6c,0x65,0x5f,0x66,0x72,0x61,0x6d,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x46,0x72,0x61,0x6d,0x65,0x43,
-0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,
-0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,
-0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,
-0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,
-0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,
-0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,
-0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,
-0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,
-0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x54,0x6f,0x70,0x4c,0x65,0x66,0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x57,0x69,
-0x6e,0x64,0x6f,0x77,0x54,0x6f,0x70,0x4c,0x65,0x66,0x74,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,
-0x52,0x69,0x67,0x68,0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x57,0x69,0x6e,0x64,0x6f,
-0x77,0x54,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,
-0x6d,0x4c,0x65,0x66,0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x57,0x69,0x6e,0x64,0x6f,
-0x77,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,
-0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x57,0x69,
-0x6e,0x64,0x6f,0x77,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x57,0x69,0x6e,0x64,0x6f,0x77,0x4c,
-0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,
-0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3d,0x22,0x57,0x69,0x6e,0x64,0x6f,0x77,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,
-0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x57,0x69,0x6e,
-0x64,0x6f,0x77,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,
-0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x57,0x69,0x6e,0x64,0x6f,0x77,0x54,0x6f,
-0x70,0x4c,0x65,0x66,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,
-0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x3d,0x22,0x57,0x69,0x6e,0x64,0x6f,0x77,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,
-0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,
-0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,
-0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,
-0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,
-0x74,0x68,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,
-0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x3d,0x22,0x57,0x69,0x6e,0x64,0x6f,0x77,0x54,0x6f,0x70,0x52,0x69,
-0x67,0x68,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,
-0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,
-0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,
-0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,
-0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,
-0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,
-0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,
-0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,
-0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,
-0x57,0x69,0x6e,0x64,0x6f,0x77,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,
-0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,
-0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,
-0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,
-0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,
-0x22,0x47,0x65,0x6e,0x65,0x72,0x69,0x63,0x42,0x72,0x75,0x73,0x68,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,
-0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x43,0x6c,0x69,0x65,0x6e,0x74,0x41,0x72,
-0x65,0x61,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,
-0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,
-0x74,0x72,0x65,0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,
-0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,
-0x74,0x72,0x65,0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,
-0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x77,0x69,0x74,0x68,0x74,0x69,0x74,0x6c,0x65,0x5f,0x6e,
-0x6f,0x66,0x72,0x61,0x6d,0x65,0x5f,0x63,0x6c,0x69,0x65,0x6e,0x74,0x5f,0x61,0x72,
-0x65,0x61,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,
-0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,
-0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,
-0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x57,
-0x69,0x64,0x67,0x65,0x74,0x44,0x69,0x6d,0x20,0x77,0x69,0x64,0x67,0x65,0x74,0x3d,
-0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x74,0x69,0x74,0x6c,0x65,0x62,0x61,0x72,
-0x5f,0x5f,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,
-0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,
-0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,
-0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,
-0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,
-0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,
-0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x47,0x65,0x6e,
-0x65,0x72,0x69,0x63,0x42,0x72,0x75,0x73,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,
-0x6f,0x6c,0x6f,0x75,0x72,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x43,0x6c,0x69,0x65,0x6e,0x74,0x41,0x72,0x65,0x61,0x43,0x6f,
-0x6c,0x6f,0x75,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x46,0x6f,
-0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,0x74,
-0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,0x6f,
-0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,0x74,
-0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,
-0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,
-0x22,0x6e,0x6f,0x74,0x69,0x74,0x6c,0x65,0x5f,0x6e,0x6f,0x66,0x72,0x61,0x6d,0x65,
-0x5f,0x63,0x6c,0x69,0x65,0x6e,0x74,0x5f,0x61,0x72,0x65,0x61,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,
-0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,
-0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,
-0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,
-0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,
-0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,
-0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,
-0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,
-0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,
-0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,
-0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x47,0x65,0x6e,
-0x65,0x72,0x69,0x63,0x42,0x72,0x75,0x73,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,
-0x6f,0x6c,0x6f,0x75,0x72,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x43,0x6c,0x69,0x65,0x6e,0x74,0x41,0x72,0x65,0x61,0x43,0x6f,
-0x6c,0x6f,0x75,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x46,0x6f,
-0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,0x74,
-0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,0x6f,
-0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,0x74,
-0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,
-0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,
-0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x41,
-0x63,0x74,0x69,0x76,0x65,0x57,0x69,0x74,0x68,0x54,0x69,0x74,0x6c,0x65,0x57,0x69,
-0x74,0x68,0x46,0x72,0x61,0x6d,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,
-0x77,0x69,0x74,0x68,0x74,0x69,0x74,0x6c,0x65,0x5f,0x66,0x72,0x61,0x6d,0x65,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x49,0x6e,0x61,
-0x63,0x74,0x69,0x76,0x65,0x57,0x69,0x74,0x68,0x54,0x69,0x74,0x6c,0x65,0x57,0x69,
-0x74,0x68,0x46,0x72,0x61,0x6d,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,
-0x77,0x69,0x74,0x68,0x74,0x69,0x74,0x6c,0x65,0x5f,0x66,0x72,0x61,0x6d,0x65,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,
-0x61,0x62,0x6c,0x65,0x64,0x57,0x69,0x74,0x68,0x54,0x69,0x74,0x6c,0x65,0x57,0x69,
-0x74,0x68,0x46,0x72,0x61,0x6d,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,
-0x77,0x69,0x74,0x68,0x74,0x69,0x74,0x6c,0x65,0x5f,0x66,0x72,0x61,0x6d,0x65,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x20,0x74,
-0x6f,0x70,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,
-0x22,0x20,0x74,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,
-0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,
-0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,
-0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,
-0x46,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,
-0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,
-0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x41,0x63,0x74,0x69,0x76,0x65,
-0x57,0x69,0x74,0x68,0x54,0x69,0x74,0x6c,0x65,0x4e,0x6f,0x46,0x72,0x61,0x6d,0x65,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,
-0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x77,0x69,0x74,0x68,0x74,0x69,0x74,
-0x6c,0x65,0x5f,0x6e,0x6f,0x66,0x72,0x61,0x6d,0x65,0x5f,0x63,0x6c,0x69,0x65,0x6e,
-0x74,0x5f,0x61,0x72,0x65,0x61,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x49,0x6e,0x61,0x63,0x74,0x69,0x76,0x65,0x57,0x69,0x74,0x68,
-0x54,0x69,0x74,0x6c,0x65,0x4e,0x6f,0x46,0x72,0x61,0x6d,0x65,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,
-0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x3d,0x22,0x77,0x69,0x74,0x68,0x74,0x69,0x74,0x6c,0x65,0x5f,0x6e,
-0x6f,0x66,0x72,0x61,0x6d,0x65,0x5f,0x63,0x6c,0x69,0x65,0x6e,0x74,0x5f,0x61,0x72,
-0x65,0x61,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,
-0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,
-0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,
-0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x57,0x69,0x74,0x68,0x54,0x69,0x74,0x6c,
-0x65,0x4e,0x6f,0x46,0x72,0x61,0x6d,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,
-0x22,0x77,0x69,0x74,0x68,0x74,0x69,0x74,0x6c,0x65,0x5f,0x6e,0x6f,0x66,0x72,0x61,
-0x6d,0x65,0x5f,0x63,0x6c,0x69,0x65,0x6e,0x74,0x5f,0x61,0x72,0x65,0x61,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x20,0x74,0x6f,
-0x70,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,
-0x20,0x74,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,
-0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x3d,
-0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,
-0x6d,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,
-0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,
-0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,
-0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x41,0x63,0x74,0x69,0x76,0x65,0x4e,
-0x6f,0x54,0x69,0x74,0x6c,0x65,0x57,0x69,0x74,0x68,0x46,0x72,0x61,0x6d,0x65,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,
-0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6e,0x6f,0x74,0x69,0x74,0x6c,0x65,0x5f,
-0x66,0x72,0x61,0x6d,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,
-0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,
-0x65,0x3d,0x22,0x49,0x6e,0x61,0x63,0x74,0x69,0x76,0x65,0x4e,0x6f,0x54,0x69,0x74,
-0x6c,0x65,0x57,0x69,0x74,0x68,0x46,0x72,0x61,0x6d,0x65,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x3d,0x22,0x6e,0x6f,0x74,0x69,0x74,0x6c,0x65,0x5f,0x66,0x72,0x61,0x6d,
-0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,
-0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,
-0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,
-0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x4e,0x6f,0x54,0x69,0x74,0x6c,0x65,0x57,0x69,
-0x74,0x68,0x46,0x72,0x61,0x6d,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,
-0x6e,0x6f,0x74,0x69,0x74,0x6c,0x65,0x5f,0x66,0x72,0x61,0x6d,0x65,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x20,0x74,0x6f,0x70,
-0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,
-0x74,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,
-0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x3d,0x22,
-0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,
-0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,
-0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,
-0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,
-0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x41,0x63,0x74,0x69,0x76,0x65,0x4e,0x6f,
-0x54,0x69,0x74,0x6c,0x65,0x4e,0x6f,0x46,0x72,0x61,0x6d,0x65,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,
-0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x3d,0x22,0x6e,0x6f,0x74,0x69,0x74,0x6c,0x65,0x5f,0x6e,0x6f,0x66,
-0x72,0x61,0x6d,0x65,0x5f,0x63,0x6c,0x69,0x65,0x6e,0x74,0x5f,0x61,0x72,0x65,0x61,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x49,0x6e,
-0x61,0x63,0x74,0x69,0x76,0x65,0x4e,0x6f,0x54,0x69,0x74,0x6c,0x65,0x4e,0x6f,0x46,
-0x72,0x61,0x6d,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6e,0x6f,0x74,
-0x69,0x74,0x6c,0x65,0x5f,0x6e,0x6f,0x66,0x72,0x61,0x6d,0x65,0x5f,0x63,0x6c,0x69,
-0x65,0x6e,0x74,0x5f,0x61,0x72,0x65,0x61,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,
-0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x4e,0x6f,
-0x54,0x69,0x74,0x6c,0x65,0x4e,0x6f,0x46,0x72,0x61,0x6d,0x65,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,
-0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x3d,0x22,0x6e,0x6f,0x74,0x69,0x74,0x6c,0x65,0x5f,0x6e,0x6f,0x66,
-0x72,0x61,0x6d,0x65,0x5f,0x63,0x6c,0x69,0x65,0x6e,0x74,0x5f,0x61,0x72,0x65,0x61,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x20,
-0x74,0x6f,0x70,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,
-0x46,0x22,0x20,0x74,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,
-0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,
-0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,
-0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,
-0x37,0x46,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x3e,
-0x0a,0x0a,0x20,0x20,0x20,0x20,0x3c,0x21,0x2d,0x2d,0x0a,0x20,0x20,0x20,0x20,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x47,0x72,0x6f,0x75,0x70,0x42,0x6f,0x78,0x0a,
-0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x2d,0x2d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,
-0x6b,0x2f,0x47,0x72,0x6f,0x75,0x70,0x42,0x6f,0x78,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,
-0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x46,
-0x72,0x61,0x6d,0x65,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x22,0x20,0x69,0x6e,0x69,
-0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x74,0x6c,0x3a,0x46,0x46,
-0x46,0x46,0x46,0x46,0x46,0x46,0x20,0x74,0x72,0x3a,0x46,0x46,0x46,0x46,0x46,0x46,
-0x46,0x46,0x20,0x62,0x6c,0x3a,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x20,0x62,
-0x72,0x3a,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x22,0x20,0x72,0x65,0x64,0x72,
-0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,
-0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x42,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,
-0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,
-0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x74,0x6c,0x3a,0x46,0x46,0x44,0x46,0x44,0x46,
-0x44,0x46,0x20,0x74,0x72,0x3a,0x46,0x46,0x44,0x46,0x44,0x46,0x44,0x46,0x20,0x62,
-0x6c,0x3a,0x46,0x46,0x44,0x46,0x44,0x46,0x44,0x46,0x20,0x62,0x72,0x3a,0x46,0x46,
-0x44,0x46,0x44,0x46,0x44,0x46,0x22,0x20,0x72,0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,
-0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,
-0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,
-0x65,0x3d,0x22,0x42,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x54,0x65,0x78,
-0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,
-0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x74,0x6c,0x3a,0x46,0x46,0x30,0x30,0x30,
-0x30,0x30,0x30,0x20,0x74,0x72,0x3a,0x46,0x46,0x30,0x30,0x30,0x30,0x30,0x30,0x20,
-0x62,0x6c,0x3a,0x46,0x46,0x30,0x30,0x30,0x30,0x30,0x30,0x20,0x62,0x72,0x3a,0x46,
-0x46,0x30,0x30,0x30,0x30,0x30,0x30,0x22,0x20,0x72,0x65,0x64,0x72,0x61,0x77,0x4f,
-0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,
-0x0a,0x0a,0x09,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,
-0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,
-0x22,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,
-0x6f,0x75,0x72,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,
-0x65,0x3d,0x22,0x46,0x46,0x38,0x38,0x38,0x38,0x38,0x38,0x22,0x20,0x72,0x65,0x64,
-0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,
-0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,
-0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x54,0x65,0x78,
-0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,
-0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x22,
-0x20,0x72,0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,
-0x74,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,
-0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x65,0x78,0x74,0x42,
-0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,
-0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x46,0x46,0x38,0x38,0x38,0x38,0x38,
-0x38,0x22,0x20,0x72,0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,
-0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x43,0x68,0x69,0x6c,0x64,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x44,0x65,0x66,0x61,0x75,0x6c,0x74,0x57,0x69,0x6e,0x64,0x6f,0x77,0x22,0x20,
-0x6e,0x61,0x6d,0x65,0x53,0x75,0x66,0x66,0x69,0x78,0x3d,0x22,0x5f,0x5f,0x61,0x75,
-0x74,0x6f,0x5f,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x70,0x61,0x6e,0x65,0x5f,0x5f,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,
-0x75,0x65,0x3d,0x22,0x38,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,
-0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x62,0x73,0x6f,0x6c,
-0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x32,0x30,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,
-0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x6f,0x66,0x66,
-0x73,0x65,0x74,0x3d,0x22,0x30,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,
-0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,
-0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x62,0x73,0x6f,0x6c,
-0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x38,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,
-0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,
-0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,
-0x65,0x3d,0x22,0x31,0x22,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x3d,0x22,0x30,0x22,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,
-0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,
-0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,
-0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x38,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,
-0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,
-0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x43,0x68,0x69,0x6c,
-0x64,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,
-0x22,0x6c,0x61,0x62,0x65,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x54,0x65,0x78,0x74,0x43,0x6f,0x6d,0x70,0x6f,0x6e,
-0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,
-0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,
-0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,
-0x3d,0x22,0x31,0x35,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,
-0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,
-0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,
-0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,
-0x31,0x22,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x3d,0x22,0x30,0x22,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,
-0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,
-0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x3d,0x22,0x30,
-0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,
-0x67,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x46,
-0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x41,
-0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,
-0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,
-0x74,0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x54,0x65,0x78,0x74,0x43,
-0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,
-0x3d,0x22,0x66,0x72,0x61,0x6d,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,
-0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,
-0x74,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,
-0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,
-0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x31,0x31,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,
-0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,
-0x3d,0x22,0x31,0x22,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x3d,0x22,0x30,0x22,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,
-0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,
-0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x3d,
-0x22,0x30,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,
-0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x4c,0x65,0x66,0x74,
-0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,
-0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x3d,0x22,0x53,0x74,0x61,0x74,0x69,0x63,0x54,0x6f,0x70,0x4c,
-0x65,0x66,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x43,0x6f,0x72,
-0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x3d,0x22,0x53,0x74,0x61,0x74,0x69,0x63,0x54,0x6f,0x70,0x52,0x69,0x67,0x68,
-0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x43,0x6f,0x72,
-0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x3d,0x22,0x53,0x74,0x61,0x74,0x69,0x63,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x4c,
-0x65,0x66,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,
-0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,
-0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x3d,0x22,0x53,0x74,0x61,0x74,0x69,0x63,0x42,0x6f,0x74,0x74,
-0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,
-0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,
-0x22,0x53,0x74,0x61,0x74,0x69,0x63,0x4c,0x65,0x66,0x74,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,
-0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x3d,0x22,0x53,0x74,0x61,0x74,0x69,0x63,0x54,0x6f,0x70,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,
-0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,
-0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x53,0x74,0x61,0x74,0x69,0x63,0x52,0x69,
-0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x53,
-0x74,0x61,0x74,0x69,0x63,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x56,0x65,0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x53,0x74,0x72,0x65,0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x53,0x74,0x72,0x65,0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x46,0x72,
-0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x62,0x67,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x62,0x73,0x6f,0x6c,
-0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x31,0x33,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,
-0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,
-0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x46,0x6f,0x6e,0x74,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x6f,0x72,0x7a,0x45,0x78,0x74,0x65,0x6e,0x74,
-0x22,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3d,0x22,0x35,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,
-0x74,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x46,0x6f,
-0x6e,0x74,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x69,0x6e,0x65,
-0x53,0x70,0x61,0x63,0x69,0x6e,0x67,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x3d,0x22,0x53,0x74,0x61,0x74,0x69,0x63,0x42,0x61,0x63,0x6b,0x64,0x72,
-0x6f,0x70,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x52,0x65,
-0x63,0x74,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,
-0x22,0x42,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x54,0x65,0x78,0x74,0x43,
-0x6f,0x6c,0x6f,0x75,0x72,0x73,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,
-0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,
-0x65,0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,
-0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,
-0x65,0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,
-0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,
-0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,
-0x22,0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,
-0x22,0x66,0x72,0x61,0x6d,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6c,0x61,0x62,
-0x65,0x6c,0x5f,0x62,0x67,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6c,0x61,0x62,0x65,
-0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x50,
-0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4e,0x6f,
-0x72,0x6d,0x61,0x6c,0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,
-0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,
-0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,
-0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,
-0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x66,0x72,0x61,0x6d,0x65,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x5f,0x62,0x67,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x50,0x72,
-0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,
-0x61,0x62,0x6c,0x65,0x64,0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,
-0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,
-0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x3e,0x0a,0x0a,0x20,
-0x20,0x20,0x20,0x3c,0x21,0x2d,0x2d,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,
-0x6f,0x6f,0x6b,0x2f,0x50,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x42,0x61,0x72,0x0a,
-0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x2d,0x2d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,
-0x6b,0x2f,0x50,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x42,0x61,0x72,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,
-0x65,0x61,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x50,0x72,0x6f,0x67,0x72,0x65,0x73,
-0x73,0x41,0x72,0x65,0x61,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x50,0x72,
-0x6f,0x67,0x72,0x65,0x73,0x73,0x42,0x61,0x72,0x4c,0x65,0x66,0x74,0x22,0x20,0x64,
-0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,
-0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x44,0x69,0x76,0x69,0x64,
-0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,
-0x75,0x65,0x3d,0x22,0x32,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,
-0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,
-0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,
-0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,
-0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,
-0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,
-0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x50,0x72,0x6f,0x67,0x72,0x65,0x73,
-0x73,0x42,0x61,0x72,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,
-0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x44,
-0x69,0x76,0x69,0x64,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x62,0x73,
-0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,
-0x32,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,
-0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,
-0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,
-0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,
-0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,
-0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,
-0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4e,0x61,0x6d,0x65,
-0x64,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x66,0x72,0x61,0x6d,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x46,0x72,0x61,0x6d,0x65,0x43,
-0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,
-0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,
-0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,
-0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,
-0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,
-0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,
-0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,
-0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,
-0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x50,0x72,0x6f,0x67,0x72,0x65,0x73,
-0x73,0x42,0x61,0x72,0x4c,0x65,0x66,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,
-0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x3d,0x22,0x50,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x42,0x61,0x72,0x52,0x69,
-0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x42,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x22,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x50,
-0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x42,0x61,0x72,0x4d,0x69,0x64,0x64,0x6c,0x65,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x69,0x6c,0x65,0x64,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x46,
-0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,
-0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,
-0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x70,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x5f,
-0x6c,0x69,0x67,0x68,0x74,0x73,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,
-0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,
-0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,
-0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,
-0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,
-0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,
-0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,
-0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,
-0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,
-0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,
-0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x50,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,
-0x42,0x61,0x72,0x4c,0x69,0x74,0x53,0x65,0x67,0x6d,0x65,0x6e,0x74,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x54,0x69,0x6c,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,
-0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x3d,0x22,0x66,0x72,0x61,0x6d,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,
-0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,
-0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,
-0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,
-0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x66,0x72,0x61,0x6d,0x65,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x20,0x74,0x6f,0x70,
-0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,
-0x74,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,
-0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x3d,0x22,
-0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,
-0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,
-0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,
-0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,
-0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,0x50,
-0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,
-0x70,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x5f,0x6c,0x69,0x67,0x68,0x74,0x73,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,
-0x61,0x62,0x6c,0x65,0x64,0x50,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,
-0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x3d,0x22,0x70,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x5f,0x6c,
-0x69,0x67,0x68,0x74,0x73,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,
-0x6f,0x75,0x72,0x73,0x20,0x74,0x6f,0x70,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,
-0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x74,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,
-0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,
-0x6f,0x6d,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,
-0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,
-0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,
-0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x57,0x69,0x64,0x67,0x65,0x74,
-0x4c,0x6f,0x6f,0x6b,0x3e,0x0a,0x0a,0x20,0x20,0x20,0x20,0x3c,0x21,0x2d,0x2d,0x0a,
-0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x41,0x6c,0x74,0x65,
-0x72,0x6e,0x61,0x74,0x65,0x50,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x42,0x61,0x72,
-0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x2d,0x2d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,
-0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x2f,0x41,0x6c,0x74,0x50,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x42,0x61,
-0x72,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4e,0x61,0x6d,
-0x65,0x64,0x41,0x72,0x65,0x61,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x50,0x72,0x6f,
-0x67,0x72,0x65,0x73,0x73,0x41,0x72,0x65,0x61,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,
-0x67,0x65,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x41,0x6c,0x74,
-0x50,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x4c,0x65,0x66,0x74,0x22,0x20,0x64,0x69,
-0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,
-0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,
-0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,
-0x3d,0x22,0x32,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,
-0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,
-0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,
-0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,
-0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,
-0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x41,0x6c,0x74,0x50,0x72,0x6f,
-0x67,0x72,0x65,0x73,0x73,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,
-0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,
-0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,
-0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,
-0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,
-0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x6f,0x66,0x66,0x73,0x65,
-0x74,0x3d,0x22,0x2d,0x34,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,
-0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4e,0x61,0x6d,0x65,
-0x64,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x66,0x72,0x61,0x6d,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x46,0x72,0x61,0x6d,0x65,0x43,
-0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,
-0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,
-0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,
-0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,
-0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,
-0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,
-0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,
-0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,
-0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x41,0x6c,0x74,0x50,0x72,0x6f,0x67,
-0x72,0x65,0x73,0x73,0x4c,0x65,0x66,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,
-0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x3d,0x22,0x41,0x6c,0x74,0x50,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x52,0x69,
-0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x42,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x22,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x41,
-0x6c,0x74,0x50,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x4d,0x69,0x64,0x64,0x6c,0x65,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,
-0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x70,0x72,0x6f,0x67,0x72,
-0x65,0x73,0x73,0x5f,0x6c,0x69,0x67,0x68,0x74,0x73,0x22,0x20,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,
-0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x55,
-0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,
-0x22,0x30,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,
-0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,
-0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,
-0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,
-0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,
-0x30,0x2e,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,
-0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,
-0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,
-0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x41,0x6c,0x74,
-0x50,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x4c,0x69,0x67,0x68,0x74,0x31,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,0x74,0x63,0x68,0x65,0x64,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x54,0x69,0x6c,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,
-0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,
-0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,
-0x3d,0x22,0x30,0x2e,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,
-0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,
-0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,
-0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,
-0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,
-0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,
-0x65,0x3d,0x22,0x30,0x2e,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,
-0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,
-0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,
-0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,
-0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,
-0x41,0x6c,0x74,0x50,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x4c,0x69,0x67,0x68,0x74,
-0x32,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,
-0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,0x74,0x63,0x68,0x65,
-0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,
-0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x69,0x6c,0x65,0x64,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,
-0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,
-0x61,0x6c,0x65,0x3d,0x22,0x30,0x2e,0x32,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,
-0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,
-0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,
-0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,
-0x63,0x61,0x6c,0x65,0x3d,0x22,0x30,0x2e,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,
-0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x3d,0x22,0x41,0x6c,0x74,0x50,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x4c,0x69,
-0x67,0x68,0x74,0x33,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x46,0x6f,
-0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,0x74,
-0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,0x6f,
-0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x69,0x6c,0x65,0x64,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,
-0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,
-0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,
-0x67,0x65,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,
-0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x30,0x2e,0x33,0x22,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,
-0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,
-0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,
-0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,
-0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x30,0x2e,0x31,0x22,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,
-0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,
-0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,
-0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,
-0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x3d,0x22,0x41,0x6c,0x74,0x50,0x72,0x6f,0x67,0x72,0x65,0x73,
-0x73,0x4c,0x69,0x67,0x68,0x74,0x34,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,
-0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,
-0x72,0x65,0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,
-0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x69,
-0x6c,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,
-0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,
-0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,
-0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,
-0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x30,0x2e,0x34,0x22,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,
-0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,
-0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,
-0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,
-0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x30,0x2e,0x31,0x22,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,
-0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,
-0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,
-0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,
-0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x41,0x6c,0x74,0x50,0x72,0x6f,0x67,
-0x72,0x65,0x73,0x73,0x4c,0x69,0x67,0x68,0x74,0x35,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x56,0x65,0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x53,0x74,0x72,0x65,0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x54,0x69,0x6c,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,
-0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,
-0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,
-0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x30,0x2e,
-0x35,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,
-0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,
-0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,
-0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,
-0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x30,
-0x2e,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,
-0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,
-0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,
-0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,
-0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x41,0x6c,0x74,0x50,
-0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x4c,0x69,0x67,0x68,0x74,0x36,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x54,0x69,0x6c,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,
-0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,
-0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x55,
-0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,
-0x22,0x30,0x2e,0x36,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,
-0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,
-0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,
-0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,
-0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,
-0x3d,0x22,0x30,0x2e,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,
-0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,
-0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,
-0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x41,
-0x6c,0x74,0x50,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x4c,0x69,0x67,0x68,0x74,0x37,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,0x74,0x63,0x68,0x65,0x64,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x69,0x6c,0x65,0x64,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,
-0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,
-0x6c,0x65,0x3d,0x22,0x30,0x2e,0x37,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,
-0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,
-0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,
-0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,
-0x61,0x6c,0x65,0x3d,0x22,0x30,0x2e,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,
-0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,
-0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3d,0x22,0x41,0x6c,0x74,0x50,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x4c,0x69,0x67,
-0x68,0x74,0x38,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x46,0x6f,0x72,
-0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,0x74,0x63,
-0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,
-0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x69,0x6c,0x65,0x64,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,
-0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,
-0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,
-0x65,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,
-0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x30,0x2e,0x38,0x22,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,
-0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,
-0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,
-0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,
-0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x30,0x2e,0x31,0x22,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,
-0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x3d,0x22,0x41,0x6c,0x74,0x50,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,
-0x4c,0x69,0x67,0x68,0x74,0x39,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,
-0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,
-0x65,0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,
-0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x69,0x6c,
-0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,
-0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,
-0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,
-0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,
-0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x30,0x2e,0x39,0x22,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,
-0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,
-0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,
-0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x30,0x2e,0x31,0x22,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,
-0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,
-0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,
-0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,
-0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x41,0x6c,0x74,0x50,0x72,0x6f,0x67,0x72,
-0x65,0x73,0x73,0x4c,0x69,0x67,0x68,0x74,0x31,0x30,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x56,0x65,0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x53,0x74,0x72,0x65,0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x54,0x69,0x6c,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,
-0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,
-0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,
-0x22,0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,
-0x22,0x66,0x72,0x61,0x6d,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,
-0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x3d,0x22,0x66,0x72,0x61,0x6d,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x20,0x74,0x6f,0x70,0x4c,0x65,0x66,
-0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x74,0x6f,0x70,
-0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,
-0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,
-0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,
-0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,0x50,0x72,0x6f,0x67,
-0x72,0x65,0x73,0x73,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x70,0x72,0x6f,
-0x67,0x72,0x65,0x73,0x73,0x5f,0x6c,0x69,0x67,0x68,0x74,0x73,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,
-0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,
-0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,0x61,0x62,0x6c,
-0x65,0x64,0x50,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x3d,0x22,0x70,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x5f,0x6c,0x69,0x67,0x68,
-0x74,0x73,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,
-0x73,0x20,0x74,0x6f,0x70,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,
-0x46,0x37,0x46,0x22,0x20,0x74,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,
-0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x4c,
-0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,
-0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,
-0x37,0x46,0x37,0x46,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,
-0x6b,0x3e,0x0a,0x0a,0x20,0x20,0x20,0x20,0x3c,0x21,0x2d,0x2d,0x0a,0x20,0x20,0x20,
-0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x56,0x55,0x4d,0x65,0x74,0x65,0x72,
-0x20,0x28,0x70,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x20,0x62,0x61,0x72,0x29,0x0a,
-0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x2d,0x2d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,
-0x6b,0x2f,0x56,0x55,0x4d,0x65,0x74,0x65,0x72,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x56,0x65,0x72,0x74,0x69,0x63,0x61,0x6c,0x50,0x72,0x6f,0x67,
-0x72,0x65,0x73,0x73,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x54,0x72,0x75,
-0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4e,
-0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x50,
-0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x41,0x72,0x65,0x61,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,
-0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,
-0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x30,0x22,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,
-0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x30,0x22,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,
-0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,
-0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,
-0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,
-0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,
-0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,
-0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,
-0x70,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x5f,0x6c,0x69,0x67,0x68,0x74,0x73,0x22,
-0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,
-0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,
-0x63,0x61,0x6c,0x65,0x3d,0x22,0x30,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,
-0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,
-0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x30,0x2e,
-0x35,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,
-0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,
-0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,
-0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,
-0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,
-0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x30,0x2e,0x35,0x22,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3d,0x22,0x54,0x65,0x78,0x74,0x53,0x65,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x42,
-0x72,0x75,0x73,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,
-0x73,0x20,0x74,0x6f,0x70,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x30,0x30,0x46,
-0x46,0x30,0x30,0x22,0x20,0x74,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,
-0x46,0x30,0x30,0x46,0x46,0x30,0x30,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x4c,
-0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x30,0x30,0x46,0x46,0x30,0x30,0x22,0x20,0x62,
-0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x30,0x30,
-0x46,0x46,0x30,0x30,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x46,0x6f,
-0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x69,0x6c,0x65,0x64,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,0x74,0x63,0x68,0x65,0x64,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,
-0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,
-0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,
-0x67,0x65,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,
-0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x30,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x55,0x6e,
-0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,
-0x30,0x2e,0x32,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,
-0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,
-0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,
-0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,
-0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,
-0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x30,0x2e,0x33,0x22,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x3d,0x22,0x54,0x65,0x78,0x74,0x53,0x65,0x6c,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x42,0x72,0x75,0x73,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,
-0x75,0x72,0x73,0x20,0x74,0x6f,0x70,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x46,
-0x46,0x46,0x46,0x30,0x30,0x22,0x20,0x74,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x3d,
-0x22,0x46,0x46,0x46,0x46,0x46,0x46,0x30,0x30,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,
-0x6d,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x46,0x46,0x46,0x46,0x30,0x30,0x22,
-0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,
-0x46,0x46,0x46,0x46,0x30,0x30,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,
-0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x69,0x6c,
-0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,
-0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,0x74,0x63,0x68,
-0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,
-0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,
-0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,
-0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,
-0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x30,0x22,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,
-0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,
-0x3d,0x22,0x30,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,
-0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,
-0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,
-0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,
-0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,
-0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x30,0x2e,0x32,0x22,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x3d,0x22,0x54,0x65,0x78,0x74,0x53,0x65,0x6c,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x42,0x72,0x75,0x73,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,
-0x75,0x72,0x73,0x20,0x74,0x6f,0x70,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x46,
-0x46,0x30,0x30,0x30,0x30,0x22,0x20,0x74,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x3d,
-0x22,0x46,0x46,0x46,0x46,0x30,0x30,0x30,0x30,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,
-0x6d,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x46,0x46,0x30,0x30,0x30,0x30,0x22,
-0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,
-0x46,0x46,0x30,0x30,0x30,0x30,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,
-0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x69,0x6c,
-0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,
-0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,0x74,0x63,0x68,
-0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,
-0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x45,0x6e,0x61,
-0x62,0x6c,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,0x61,0x62,
-0x6c,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,
-0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x45,0x6e,0x61,0x62,0x6c,0x65,
-0x64,0x50,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,
-0x3d,0x22,0x70,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x5f,0x6c,0x69,0x67,0x68,0x74,
-0x73,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,
-0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,
-0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,
-0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x50,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,
-0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x70,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,
-0x5f,0x6c,0x69,0x67,0x68,0x74,0x73,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,
-0x6f,0x6c,0x6f,0x75,0x72,0x73,0x20,0x74,0x6f,0x70,0x4c,0x65,0x66,0x74,0x3d,0x22,
-0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x74,0x6f,0x70,0x52,0x69,0x67,
-0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,
-0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,
-0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x3d,
-0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x57,0x69,0x64,0x67,
-0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x3e,0x0a,0x0a,0x20,0x20,0x20,0x20,0x3c,0x21,0x2d,
-0x2d,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x53,0x6c,
-0x69,0x64,0x65,0x72,0x54,0x68,0x75,0x6d,0x62,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x0a,0x20,0x20,0x20,0x20,0x2d,0x2d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x57,
-0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x53,0x6c,0x69,0x64,
-0x65,0x72,0x54,0x68,0x75,0x6d,0x62,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,
-0x3d,0x22,0x56,0x65,0x72,0x74,0x46,0x72,0x65,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,
-0x65,0x3d,0x22,0x54,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x6e,0x6f,0x72,0x6d,0x61,0x6c,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,
-0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,
-0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,
-0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,
-0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,
-0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,
-0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x2e,0x30,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,
-0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x2e,0x30,0x22,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x3d,0x22,0x56,0x65,0x72,0x74,0x53,0x6c,0x69,0x64,0x65,0x72,0x54,
-0x68,0x75,0x6d,0x62,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x56,0x65,0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x53,0x74,0x72,0x65,0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x53,0x74,0x72,0x65,0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,
-0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,
-0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x68,0x6f,0x76,0x65,0x72,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,
-0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,
-0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,
-0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,
-0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,
-0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,
-0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,
-0x3d,0x22,0x31,0x2e,0x30,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,
-0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,
-0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,
-0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x2e,0x30,0x22,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,
-0x22,0x56,0x65,0x72,0x74,0x53,0x6c,0x69,0x64,0x65,0x72,0x54,0x68,0x75,0x6d,0x62,
-0x48,0x6f,0x76,0x65,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x46,
-0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,
-0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,
-0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,
-0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,
-0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,
-0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,
-0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6e,
-0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,
-0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,
-0x65,0x3d,0x22,0x48,0x6f,0x76,0x65,0x72,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,
-0x22,0x68,0x6f,0x76,0x65,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x50,0x75,0x73,0x68,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x3d,0x22,0x68,0x6f,0x76,0x65,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,
-0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,
-0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x20,0x74,0x6f,0x70,
-0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,
-0x74,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,
-0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x3d,0x22,
-0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,
-0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,
-0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,
-0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x3e,0x0a,0x0a,0x20,
-0x20,0x20,0x20,0x3c,0x21,0x2d,0x2d,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,
-0x6f,0x6f,0x6b,0x2f,0x53,0x6c,0x69,0x64,0x65,0x72,0x0a,0x20,0x20,0x20,0x20,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x2d,0x2d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,
-0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x20,0x6e,0x61,0x6d,0x65,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x53,0x6c,0x69,
-0x64,0x65,0x72,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,
-0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x56,0x65,
-0x72,0x74,0x69,0x63,0x61,0x6c,0x53,0x6c,0x69,0x64,0x65,0x72,0x22,0x20,0x76,0x61,
-0x6c,0x75,0x65,0x3d,0x22,0x54,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4d,0x6f,0x75,0x73,0x65,0x42,0x75,0x74,0x74,0x6f,
-0x6e,0x44,0x6f,0x77,0x6e,0x41,0x75,0x74,0x6f,0x52,0x65,0x70,0x65,0x61,0x74,0x22,
-0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x54,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,
-0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x57,0x61,0x6e,0x74,0x73,0x4d,0x75,
-0x6c,0x74,0x69,0x43,0x6c,0x69,0x63,0x6b,0x45,0x76,0x65,0x6e,0x74,0x73,0x22,0x20,
-0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x46,0x61,0x6c,0x73,0x65,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4e,0x61,0x6d,0x65,0x64,0x41,
-0x72,0x65,0x61,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x68,0x75,0x6d,0x62,0x54,
-0x72,0x61,0x63,0x6b,0x41,0x72,0x65,0x61,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,
-0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,
-0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,
-0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,
-0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,
-0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,
-0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,
-0x65,0x3d,0x22,0x31,0x2e,0x30,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,
-0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,
-0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,
-0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x2e,0x30,
-0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,
-0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4e,0x61,0x6d,0x65,0x64,
-0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,
-0x68,0x69,0x6c,0x64,0x20,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,
-0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x53,0x6c,0x69,0x64,0x65,0x72,0x54,0x68,
-0x75,0x6d,0x62,0x22,0x20,0x6e,0x61,0x6d,0x65,0x53,0x75,0x66,0x66,0x69,0x78,0x3d,
-0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x74,0x68,0x75,0x6d,0x62,0x5f,0x5f,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,
-0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,
-0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,
-0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,
-0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,
-0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,
-0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x2e,0x30,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,
-0x68,0x74,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x56,0x65,0x72,
-0x74,0x53,0x6c,0x69,0x64,0x65,0x72,0x54,0x68,0x75,0x6d,0x62,0x4e,0x6f,0x72,0x6d,
-0x61,0x6c,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,
-0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,
-0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x43,0x68,
-0x69,0x6c,0x64,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,
-0x65,0x3d,0x22,0x6d,0x61,0x69,0x6e,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,
-0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,
-0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,
-0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x33,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,
-0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,
-0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,
-0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x2e,0x30,
-0x22,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x3d,0x22,0x2d,0x36,0x22,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,
-0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,
-0x2e,0x30,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,
-0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,
-0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x56,0x65,0x72,0x74,0x53,0x6c,0x69,0x64,
-0x65,0x72,0x42,0x6f,0x64,0x79,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,
-0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,
-0x65,0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,
-0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,
-0x65,0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,
-0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,
-0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,
-0x22,0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,
-0x22,0x6d,0x61,0x69,0x6e,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,
-0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,
-0x65,0x3d,0x22,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x3d,0x22,0x6d,0x61,0x69,0x6e,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x20,0x74,0x6f,0x70,0x4c,0x65,0x66,0x74,0x3d,
-0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x74,0x6f,0x70,0x52,0x69,
-0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,
-0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,
-0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,
-0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,
-0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x57,0x69,0x64,
-0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x3e,0x0a,0x0a,0x20,0x20,0x20,0x20,0x3c,0x21,
-0x2d,0x2d,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x48,
-0x6f,0x72,0x69,0x7a,0x6f,0x6e,0x74,0x61,0x6c,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x62,
-0x61,0x72,0x54,0x68,0x75,0x6d,0x62,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,
-0x20,0x20,0x20,0x20,0x2d,0x2d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,
-0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x48,0x6f,0x72,0x69,0x7a,0x6f,
-0x6e,0x74,0x61,0x6c,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x54,0x68,0x75,
-0x6d,0x62,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,
-0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x48,0x6f,0x72,
-0x7a,0x46,0x72,0x65,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x54,0x72,
-0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x46,0x72,0x61,0x6d,0x65,
-0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,
-0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,
-0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,
-0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,
-0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,
-0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,
-0x2e,0x30,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,
-0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,
-0x61,0x6c,0x65,0x3d,0x22,0x31,0x2e,0x30,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x69,
-0x6e,0x69,0x48,0x6f,0x72,0x7a,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x54,0x68,0x75,0x6d,
-0x62,0x4c,0x65,0x66,0x74,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,
-0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,
-0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x69,0x6e,0x69,0x48,0x6f,0x72,0x7a,0x53,0x63,
-0x72,0x6f,0x6c,0x6c,0x54,0x68,0x75,0x6d,0x62,0x52,0x69,0x67,0x68,0x74,0x4e,0x6f,
-0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,
-0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,
-0x4d,0x69,0x6e,0x69,0x48,0x6f,0x72,0x7a,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x54,0x68,
-0x75,0x6d,0x62,0x4d,0x69,0x64,0x64,0x6c,0x65,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,
-0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x68,0x6f,0x76,0x65,0x72,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x46,
-0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,
-0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,
-0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,
-0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,
-0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,
-0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,
-0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,
-0x65,0x3d,0x22,0x31,0x2e,0x30,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,
-0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,
-0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,
-0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x2e,0x30,0x22,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,
-0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3d,0x22,0x4d,0x69,0x6e,0x69,0x48,0x6f,0x72,0x7a,0x53,0x63,0x72,0x6f,0x6c,0x6c,
-0x54,0x68,0x75,0x6d,0x62,0x4c,0x65,0x66,0x74,0x48,0x6f,0x76,0x65,0x72,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x69,0x6e,0x69,0x48,0x6f,0x72,
-0x7a,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x54,0x68,0x75,0x6d,0x62,0x52,0x69,0x67,0x68,
-0x74,0x48,0x6f,0x76,0x65,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,
-0x6e,0x64,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3d,0x22,0x4d,0x69,0x6e,0x69,0x48,0x6f,0x72,0x7a,0x53,0x63,0x72,0x6f,0x6c,0x6c,
-0x54,0x68,0x75,0x6d,0x62,0x4d,0x69,0x64,0x64,0x6c,0x65,0x48,0x6f,0x76,0x65,0x72,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,
-0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,
-0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,
-0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,
-0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x48,0x6f,0x76,0x65,
-0x72,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,
-0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x68,0x6f,0x76,0x65,0x72,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x50,0x75,0x73,
-0x68,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6e,0x6f,0x72,0x6d,
-0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,
-0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,
-0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,
-0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,
-0x22,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,
-0x6f,0x6c,0x6f,0x75,0x72,0x73,0x20,0x74,0x6f,0x70,0x4c,0x65,0x66,0x74,0x3d,0x22,
-0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x74,0x6f,0x70,0x52,0x69,0x67,
-0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,
-0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,
-0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x3d,
-0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x57,0x69,0x64,0x67,
-0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x3e,0x0a,0x0a,0x20,0x20,0x20,0x20,0x3c,0x21,0x2d,
-0x2d,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x48,0x6f,
-0x72,0x69,0x7a,0x6f,0x6e,0x74,0x61,0x6c,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,
-0x72,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x2d,0x2d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,
-0x6b,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,
-0x6f,0x6f,0x6b,0x2f,0x48,0x6f,0x72,0x69,0x7a,0x6f,0x6e,0x74,0x61,0x6c,0x53,0x63,
-0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x20,0x6e,0x61,0x6d,
-0x65,0x3d,0x22,0x54,0x68,0x75,0x6d,0x62,0x54,0x72,0x61,0x63,0x6b,0x41,0x72,0x65,
-0x61,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x3d,0x22,0x4d,0x69,0x6e,0x69,0x48,0x6f,0x72,0x7a,0x53,0x63,0x72,
-0x6f,0x6c,0x6c,0x4c,0x65,0x66,0x74,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x64,
-0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,
-0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,
-0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,
-0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,
-0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x2e,
-0x30,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,
-0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,
-0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x69,0x6e,
-0x69,0x48,0x6f,0x72,0x7a,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x52,0x69,0x67,0x68,0x74,
-0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,
-0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,
-0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,
-0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,
-0x67,0x65,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,
-0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x2e,0x30,0x22,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x68,0x69,0x6c,0x64,0x20,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x2f,0x49,0x6d,0x61,0x67,0x65,0x42,0x75,0x74,0x74,0x6f,0x6e,0x22,0x20,
-0x6e,0x61,0x6d,0x65,0x53,0x75,0x66,0x66,0x69,0x78,0x3d,0x22,0x5f,0x5f,0x61,0x75,
-0x74,0x6f,0x5f,0x69,0x6e,0x63,0x62,0x74,0x6e,0x5f,0x5f,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,
-0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,
-0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,
-0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,
-0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,
-0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x69,0x6e,0x69,0x48,0x6f,0x72,0x7a,0x53,
-0x63,0x72,0x6f,0x6c,0x6c,0x52,0x69,0x67,0x68,0x74,0x4e,0x6f,0x72,0x6d,0x61,0x6c,
-0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,
-0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,
-0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,
-0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,
-0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,
-0x6f,0x72,0x7a,0x41,0x6c,0x69,0x67,0x6e,0x6d,0x65,0x6e,0x74,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,
-0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x76,0x61,0x6c,
-0x75,0x65,0x3d,0x22,0x73,0x65,0x74,0x3a,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,
-0x6f,0x6f,0x6b,0x20,0x69,0x6d,0x61,0x67,0x65,0x3a,0x4d,0x69,0x6e,0x69,0x48,0x6f,
-0x72,0x7a,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x52,0x69,0x67,0x68,0x74,0x4e,0x6f,0x72,
-0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x48,0x6f,0x76,0x65,0x72,0x49,0x6d,0x61,0x67,0x65,0x22,0x20,
-0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x73,0x65,0x74,0x3a,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x20,0x69,0x6d,0x61,0x67,0x65,0x3a,0x4d,0x69,0x6e,
-0x69,0x48,0x6f,0x72,0x7a,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x52,0x69,0x67,0x68,0x74,
-0x48,0x6f,0x76,0x65,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x50,0x75,0x73,0x68,0x65,0x64,0x49,0x6d,0x61,0x67,
-0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x73,0x65,0x74,0x3a,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x20,0x69,0x6d,0x61,0x67,0x65,0x3a,
-0x4d,0x69,0x6e,0x69,0x48,0x6f,0x72,0x7a,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x52,0x69,
-0x67,0x68,0x74,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x43,0x68,0x69,0x6c,0x64,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x68,0x69,0x6c,0x64,0x20,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x2f,0x49,0x6d,0x61,0x67,0x65,0x42,0x75,0x74,0x74,0x6f,0x6e,0x22,0x20,0x6e,0x61,
-0x6d,0x65,0x53,0x75,0x66,0x66,0x69,0x78,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,
-0x5f,0x64,0x65,0x63,0x62,0x74,0x6e,0x5f,0x5f,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,
-0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,
-0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,
-0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x3d,0x22,0x4d,0x69,0x6e,0x69,0x48,0x6f,0x72,0x7a,0x53,0x63,0x72,
-0x6f,0x6c,0x6c,0x4c,0x65,0x66,0x74,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x64,
-0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,
-0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,
-0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,
-0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4e,0x6f,0x72,0x6d,0x61,
-0x6c,0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x73,
-0x65,0x74,0x3a,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x3a,0x4d,0x69,0x6e,0x69,0x48,0x6f,0x72,0x7a,0x53,0x63,0x72,
-0x6f,0x6c,0x6c,0x4c,0x65,0x66,0x74,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,
-0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x48,0x6f,
-0x76,0x65,0x72,0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,
-0x22,0x73,0x65,0x74,0x3a,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x3a,0x4d,0x69,0x6e,0x69,0x48,0x6f,0x72,0x7a,0x53,
-0x63,0x72,0x6f,0x6c,0x6c,0x4c,0x65,0x66,0x74,0x48,0x6f,0x76,0x65,0x72,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x50,
-0x75,0x73,0x68,0x65,0x64,0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,
-0x65,0x3d,0x22,0x73,0x65,0x74,0x3a,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x20,0x69,0x6d,0x61,0x67,0x65,0x3a,0x4d,0x69,0x6e,0x69,0x48,0x6f,0x72,
-0x7a,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x4c,0x65,0x66,0x74,0x4e,0x6f,0x72,0x6d,0x61,
-0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x43,0x68,0x69,0x6c,0x64,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x43,0x68,0x69,0x6c,0x64,0x20,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x48,0x6f,0x72,0x69,0x7a,0x6f,0x6e,
-0x74,0x61,0x6c,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x54,0x68,0x75,0x6d,
-0x62,0x22,0x20,0x6e,0x61,0x6d,0x65,0x53,0x75,0x66,0x66,0x69,0x78,0x3d,0x22,0x5f,
-0x5f,0x61,0x75,0x74,0x6f,0x5f,0x74,0x68,0x75,0x6d,0x62,0x5f,0x5f,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,
-0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,
-0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,
-0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,
-0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,
-0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,
-0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,
-0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,
-0x6c,0x65,0x3d,0x22,0x30,0x2e,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,
-0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,
-0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,
-0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,
-0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,
-0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,
-0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x4d,0x69,0x6e,0x53,0x69,0x7a,0x65,0x22,0x20,
-0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x7b,0x7b,0x30,0x2c,0x32,0x35,0x7d,0x2c,0x7b,
-0x30,0x2c,0x30,0x7d,0x7d,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x43,0x68,0x69,0x6c,0x64,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x6d,0x61,0x69,0x6e,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,
-0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x69,0x6e,0x69,0x48,0x6f,0x72,0x7a,
-0x53,0x63,0x72,0x6f,0x6c,0x6c,0x4c,0x65,0x66,0x74,0x4e,0x6f,0x72,0x6d,0x61,0x6c,
-0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,
-0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,
-0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,
-0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,
-0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x2e,0x30,
-0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,
-0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,
-0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x3d,0x22,0x4d,0x69,0x6e,0x69,0x48,0x6f,0x72,0x7a,0x53,0x63,0x72,0x6f,
-0x6c,0x6c,0x52,0x69,0x67,0x68,0x74,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x64,
-0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,
-0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,
-0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,
-0x2e,0x30,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,
-0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,
-0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x69,0x6e,0x69,
-0x48,0x6f,0x72,0x7a,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x42,0x61,0x72,0x53,0x65,0x67,
-0x6d,0x65,0x6e,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x46,0x6f,
-0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x43,0x65,0x6e,0x74,0x72,
-0x65,0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,
-0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,
-0x74,0x72,0x65,0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,
-0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,
-0x65,0x3d,0x22,0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x3d,0x22,0x6d,0x61,0x69,0x6e,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,
-0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6d,0x61,0x69,0x6e,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x20,0x74,0x6f,0x70,0x4c,0x65,0x66,
-0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x74,0x6f,0x70,
-0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,
-0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,
-0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,
-0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x57,
-0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x3e,0x0a,0x0a,0x20,0x20,0x20,0x20,
-0x3c,0x21,0x2d,0x2d,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x2f,0x56,0x65,0x72,0x74,0x69,0x63,0x61,0x6c,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x62,
-0x61,0x72,0x54,0x68,0x75,0x6d,0x62,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,
-0x20,0x20,0x20,0x20,0x2d,0x2d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,
-0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x56,0x65,0x72,0x74,0x69,0x63,
-0x61,0x6c,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x54,0x68,0x75,0x6d,0x62,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,
-0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x56,0x65,0x72,0x74,0x46,
-0x72,0x65,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x54,0x72,0x75,0x65,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,
-0x65,0x3d,0x22,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,
-0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,
-0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,
-0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,
-0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,
-0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,
-0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x2e,0x30,
-0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,
-0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,
-0x65,0x3d,0x22,0x31,0x2e,0x30,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,
-0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x69,0x6e,0x69,0x56,
-0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x54,0x68,0x75,0x6d,0x62,0x54,0x6f,
-0x70,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,
-0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x3d,0x22,0x4d,0x69,0x6e,0x69,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,
-0x6c,0x54,0x68,0x75,0x6d,0x62,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x4e,0x6f,0x72,0x6d,
-0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x42,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x69,
-0x6e,0x69,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x54,0x68,0x75,0x6d,
-0x62,0x4d,0x69,0x64,0x64,0x6c,0x65,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,
-0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x68,0x6f,0x76,0x65,0x72,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x46,0x72,0x61,
-0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,
-0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,
-0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,
-0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,
-0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,
-0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,
-0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,
-0x22,0x31,0x2e,0x30,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,
-0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,
-0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,
-0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x2e,0x30,0x22,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,
-0x69,0x6e,0x69,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x54,0x68,0x75,
-0x6d,0x62,0x54,0x6f,0x70,0x48,0x6f,0x76,0x65,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,
-0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,
-0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x69,0x6e,0x69,0x56,0x65,0x72,0x74,0x53,0x63,
-0x72,0x6f,0x6c,0x6c,0x54,0x68,0x75,0x6d,0x62,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x48,
-0x6f,0x76,0x65,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,
-0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,
-0x4d,0x69,0x6e,0x69,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x54,0x68,
-0x75,0x6d,0x62,0x4d,0x69,0x64,0x64,0x6c,0x65,0x48,0x6f,0x76,0x65,0x72,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,
-0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,
-0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,
-0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,
-0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,
-0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x48,0x6f,0x76,0x65,0x72,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,
-0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x68,0x6f,0x76,0x65,0x72,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x50,0x75,0x73,0x68,0x65,
-0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,
-0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6e,0x6f,0x72,0x6d,0x61,0x6c,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,
-0x73,0x61,0x62,0x6c,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6e,
-0x6f,0x72,0x6d,0x61,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,
-0x6f,0x75,0x72,0x73,0x20,0x74,0x6f,0x70,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,
-0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x74,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,
-0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,
-0x6f,0x6d,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,
-0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,
-0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,
-0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x57,0x69,0x64,0x67,0x65,0x74,
-0x4c,0x6f,0x6f,0x6b,0x3e,0x0a,0x0a,0x20,0x20,0x20,0x20,0x3c,0x21,0x2d,0x2d,0x0a,
-0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x56,0x65,0x72,0x74,
-0x69,0x63,0x61,0x6c,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x0a,0x20,0x20,
-0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x2d,0x2d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,
-0x56,0x65,0x72,0x74,0x69,0x63,0x61,0x6c,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,
-0x72,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,
-0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x56,0x65,0x72,0x74,
-0x69,0x63,0x61,0x6c,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x22,0x20,0x76,
-0x61,0x6c,0x75,0x65,0x3d,0x22,0x54,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,
-0x61,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x68,0x75,0x6d,0x62,0x54,0x72,0x61,
-0x63,0x6b,0x41,0x72,0x65,0x61,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,
-0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,
-0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,
-0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,
-0x69,0x6e,0x69,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x55,0x70,0x4e,
-0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,
-0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,
-0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,
-0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x2e,0x30,
-0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,
-0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,
-0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,
-0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x2e,0x30,0x22,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,
-0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,
-0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,
-0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x69,0x6e,0x69,
-0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x44,0x6f,0x77,0x6e,0x4e,0x6f,
-0x72,0x6d,0x61,0x6c,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,
-0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,
-0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4e,0x61,0x6d,0x65,0x64,0x41,
-0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x68,
-0x69,0x6c,0x64,0x20,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x49,0x6d,0x61,0x67,0x65,0x42,0x75,0x74,0x74,
-0x6f,0x6e,0x22,0x20,0x6e,0x61,0x6d,0x65,0x53,0x75,0x66,0x66,0x69,0x78,0x3d,0x22,
-0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x69,0x6e,0x63,0x62,0x74,0x6e,0x5f,0x5f,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,
-0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,
-0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,
-0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,
-0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,
-0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,
-0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,
-0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,
-0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x69,0x6e,0x69,0x56,
-0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x44,0x6f,0x77,0x6e,0x4e,0x6f,0x72,
-0x6d,0x61,0x6c,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,
-0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,
-0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x56,0x65,0x72,0x74,0x41,0x6c,0x69,0x67,0x6e,0x6d,0x65,0x6e,0x74,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x41,0x6c,0x69,0x67,
-0x6e,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x49,0x6d,0x61,0x67,0x65,0x22,
-0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x73,0x65,0x74,0x3a,0x54,0x61,0x68,0x61,
-0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x20,0x69,0x6d,0x61,0x67,0x65,0x3a,0x4d,0x69,
-0x6e,0x69,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x44,0x6f,0x77,0x6e,
-0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,
-0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x48,0x6f,0x76,0x65,0x72,0x49,0x6d,0x61,0x67,
-0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x73,0x65,0x74,0x3a,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x20,0x69,0x6d,0x61,0x67,0x65,0x3a,
-0x4d,0x69,0x6e,0x69,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x44,0x6f,
-0x77,0x6e,0x48,0x6f,0x76,0x65,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,
-0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x50,0x75,0x73,0x68,0x65,0x64,0x49,0x6d,
-0x61,0x67,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x73,0x65,0x74,0x3a,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x3a,0x4d,0x69,0x6e,0x69,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,
-0x44,0x6f,0x77,0x6e,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x43,0x68,0x69,0x6c,0x64,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x68,0x69,0x6c,0x64,0x20,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,
-0x6b,0x2f,0x49,0x6d,0x61,0x67,0x65,0x42,0x75,0x74,0x74,0x6f,0x6e,0x22,0x20,0x6e,
-0x61,0x6d,0x65,0x53,0x75,0x66,0x66,0x69,0x78,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,
-0x6f,0x5f,0x64,0x65,0x63,0x62,0x74,0x6e,0x5f,0x5f,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,
-0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,
-0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,
-0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,
-0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,
-0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,
-0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x69,0x6e,0x69,0x56,0x65,0x72,0x74,0x53,0x63,
-0x72,0x6f,0x6c,0x6c,0x55,0x70,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x64,0x69,
-0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,
-0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4e,0x6f,0x72,0x6d,0x61,0x6c,
-0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x73,0x65,
-0x74,0x3a,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x3a,0x4d,0x69,0x6e,0x69,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,
-0x6c,0x6c,0x55,0x70,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,
-0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x48,0x6f,0x76,0x65,0x72,
-0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x73,0x65,
-0x74,0x3a,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x3a,0x4d,0x69,0x6e,0x69,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,
-0x6c,0x6c,0x55,0x70,0x48,0x6f,0x76,0x65,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,
-0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x50,0x75,0x73,0x68,0x65,0x64,
-0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x73,0x65,
-0x74,0x3a,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x3a,0x4d,0x69,0x6e,0x69,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,
-0x6c,0x6c,0x55,0x70,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x43,0x68,0x69,0x6c,0x64,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x68,0x69,0x6c,0x64,0x20,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,
-0x6b,0x2f,0x56,0x65,0x72,0x74,0x69,0x63,0x61,0x6c,0x53,0x63,0x72,0x6f,0x6c,0x6c,
-0x62,0x61,0x72,0x54,0x68,0x75,0x6d,0x62,0x22,0x20,0x6e,0x61,0x6d,0x65,0x53,0x75,
-0x66,0x66,0x69,0x78,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x74,0x68,0x75,
-0x6d,0x62,0x5f,0x5f,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,
-0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,
-0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,
-0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,
-0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,
-0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,
-0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,
-0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x30,0x2e,0x31,0x22,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,
-0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x4d,0x69,
-0x6e,0x53,0x69,0x7a,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x7b,0x7b,
-0x30,0x2c,0x30,0x7d,0x2c,0x7b,0x30,0x2c,0x32,0x35,0x7d,0x7d,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x43,0x68,0x69,0x6c,0x64,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,
-0x6d,0x61,0x69,0x6e,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,
-0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,
-0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,
-0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,
-0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x69,0x6e,0x69,0x56,0x65,0x72,0x74,
-0x53,0x63,0x72,0x6f,0x6c,0x6c,0x55,0x70,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,
-0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,
-0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,
-0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,
-0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x2e,0x30,0x22,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,
-0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,
-0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,
-0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,
-0x22,0x31,0x2e,0x30,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,
-0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,
-0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x69,0x6e,0x69,0x56,0x65,0x72,
-0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x44,0x6f,0x77,0x6e,0x4e,0x6f,0x72,0x6d,0x61,
-0x6c,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,
-0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,
-0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,
-0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3d,0x22,0x4d,0x69,0x6e,0x69,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,
-0x42,0x61,0x72,0x53,0x65,0x67,0x6d,0x65,0x6e,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x56,0x65,0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x53,0x74,0x72,0x65,0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x43,0x65,0x6e,0x74,0x72,0x65,0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,
-0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,
-0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,
-0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6d,0x61,0x69,0x6e,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,0x61,0x62,
-0x6c,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6d,0x61,0x69,0x6e,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x20,
-0x74,0x6f,0x70,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,
-0x46,0x22,0x20,0x74,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,
-0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,
-0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,
-0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,
-0x37,0x46,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x3e,
-0x0a,0x0a,0x20,0x20,0x20,0x20,0x3c,0x21,0x2d,0x2d,0x0a,0x20,0x20,0x20,0x20,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,0x0a,0x20,
-0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x2d,0x2d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x2f,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x49,0x74,0x65,0x6d,0x52,0x65,0x6e,0x64,0x65,0x72,0x69,0x6e,
-0x67,0x41,0x72,0x65,0x61,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,
-0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,
-0x4c,0x65,0x66,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,
-0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,
-0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4c,0x69,
-0x73,0x74,0x62,0x6f,0x78,0x54,0x6f,0x70,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,
-0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,
-0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,
-0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,
-0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3d,0x22,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,0x52,0x69,0x67,0x68,0x74,0x22,0x20,
-0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,
-0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,
-0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,
-0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,
-0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x3d,0x22,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,0x42,0x6f,0x74,0x74,0x6f,0x6d,
-0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,
-0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4e,0x61,0x6d,0x65,0x64,0x41,
-0x72,0x65,0x61,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x49,0x74,0x65,0x6d,0x52,0x65,
-0x6e,0x64,0x65,0x72,0x69,0x6e,0x67,0x41,0x72,0x65,0x61,0x48,0x53,0x63,0x72,0x6f,
-0x6c,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,
-0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x3d,0x22,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,0x4c,0x65,0x66,
-0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,
-0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,
-0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4c,0x69,0x73,0x74,0x62,
-0x6f,0x78,0x54,0x6f,0x70,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,
-0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,
-0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,
-0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,
-0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,
-0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4c,
-0x69,0x73,0x74,0x62,0x6f,0x78,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x64,0x69,0x6d,
-0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,
-0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,
-0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,
-0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,
-0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,
-0x6d,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,
-0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x44,
-0x69,0x6d,0x20,0x77,0x69,0x64,0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,
-0x6f,0x5f,0x68,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x5f,0x5f,0x22,0x20,
-0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,
-0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,
-0x61,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x49,0x74,0x65,0x6d,0x52,0x65,0x6e,0x64,
-0x65,0x72,0x69,0x6e,0x67,0x41,0x72,0x65,0x61,0x56,0x53,0x63,0x72,0x6f,0x6c,0x6c,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x3d,0x22,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,0x4c,0x65,0x66,0x74,0x22,
-0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,
-0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,
-0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,
-0x54,0x6f,0x70,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,
-0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,
-0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,
-0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,
-0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,
-0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,
-0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x44,0x69,0x6d,0x20,
-0x77,0x69,0x64,0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x76,
-0x73,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x5f,0x5f,0x22,0x20,0x64,0x69,0x6d,
-0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,
-0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,
-0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,
-0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,
-0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,
-0x6d,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,
-0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,
-0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,
-0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,
-0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x22,0x20,0x64,
-0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,
-0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,
-0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x49,0x74,0x65,0x6d,0x52,0x65,0x6e,0x64,0x65,
-0x72,0x69,0x6e,0x67,0x41,0x72,0x65,0x61,0x48,0x56,0x53,0x63,0x72,0x6f,0x6c,0x6c,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x3d,0x22,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,0x4c,0x65,0x66,0x74,0x22,
-0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,
-0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,
-0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,
-0x54,0x6f,0x70,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,
-0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,
-0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,
-0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,
-0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,
-0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,
-0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x44,0x69,0x6d,0x20,
-0x77,0x69,0x64,0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x76,
-0x73,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x5f,0x5f,0x22,0x20,0x64,0x69,0x6d,
-0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,
-0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,
-0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,
-0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,
-0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,
-0x6d,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,
-0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x44,
-0x69,0x6d,0x20,0x77,0x69,0x64,0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,
-0x6f,0x5f,0x68,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x5f,0x5f,0x22,0x20,
-0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,
-0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x68,0x69,0x6c,0x64,0x20,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x2f,0x48,0x6f,0x72,0x69,0x7a,0x6f,0x6e,0x74,0x61,0x6c,0x53,0x63,0x72,0x6f,0x6c,
-0x6c,0x62,0x61,0x72,0x22,0x20,0x6e,0x61,0x6d,0x65,0x53,0x75,0x66,0x66,0x69,0x78,
-0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x68,0x73,0x63,0x72,0x6f,0x6c,0x6c,
-0x62,0x61,0x72,0x5f,0x5f,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,
-0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,
-0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,
-0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,
-0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,
-0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x6f,
-0x66,0x66,0x73,0x65,0x74,0x3d,0x22,0x2d,0x31,0x32,0x22,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,
-0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,
-0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x31,0x32,0x22,0x20,0x2f,0x3e,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x41,0x6c,0x69,0x67,
-0x6e,0x6d,0x65,0x6e,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,
-0x6f,0x6d,0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x43,0x68,0x69,0x6c,0x64,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x68,0x69,0x6c,0x64,0x20,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x2f,0x56,0x65,0x72,0x74,0x69,0x63,0x61,0x6c,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x62,
-0x61,0x72,0x22,0x20,0x6e,0x61,0x6d,0x65,0x53,0x75,0x66,0x66,0x69,0x78,0x3d,0x22,
-0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x76,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,
-0x72,0x5f,0x5f,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,
-0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,
-0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,
-0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,
-0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,
-0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,
-0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x31,0x32,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,
-0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,
-0x22,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x3d,0x22,0x2d,0x31,0x32,0x22,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x41,0x6c,0x69,0x67,0x6e,
-0x6d,0x65,0x6e,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,
-0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x43,0x68,0x69,0x6c,0x64,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x6d,0x61,0x69,0x6e,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x46,
-0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,
-0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,
-0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,
-0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,
-0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,
-0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,
-0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,
-0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,
-0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,
-0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,
-0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x4c,0x65,0x66,0x74,0x43,0x6f,0x72,
-0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x3d,0x22,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,0x54,0x6f,0x70,0x4c,0x65,0x66,
-0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x54,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x43,0x6f,0x72,0x6e,0x65,
-0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,
-0x22,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,0x54,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x43,0x6f,0x72,0x6e,
-0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3d,0x22,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x4c,
-0x65,0x66,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,
-0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,
-0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x3d,0x22,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,0x42,0x6f,0x74,
-0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,
-0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3d,0x22,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,0x4c,0x65,0x66,0x74,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,
-0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,
-0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,0x52,
-0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4c,0x69,0x73,
-0x74,0x62,0x6f,0x78,0x54,0x6f,0x70,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,
-0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x3d,0x22,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,0x42,0x6f,0x74,0x74,0x6f,0x6d,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x42,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x22,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,
-0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4c,0x69,0x73,0x74,
-0x62,0x6f,0x78,0x42,0x61,0x63,0x6b,0x64,0x72,0x6f,0x70,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x46,0x72,
-0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x3d,0x22,0x6d,0x61,0x69,0x6e,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,
-0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,
-0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6d,0x61,0x69,0x6e,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x20,0x74,0x6f,0x70,0x4c,0x65,
-0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x74,0x6f,
-0x70,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,
-0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,
-0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,
-0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,
-0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x3e,0x0a,0x0a,0x20,0x20,0x20,
-0x20,0x3c,0x21,0x2d,0x2d,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,
-0x6b,0x2f,0x43,0x6f,0x6d,0x62,0x6f,0x44,0x72,0x6f,0x70,0x4c,0x69,0x73,0x74,0x0a,
-0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x2d,0x2d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,
-0x6b,0x2f,0x43,0x6f,0x6d,0x62,0x6f,0x44,0x72,0x6f,0x70,0x4c,0x69,0x73,0x74,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4e,0x61,0x6d,0x65,0x64,
-0x41,0x72,0x65,0x61,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x49,0x74,0x65,0x6d,0x52,
-0x65,0x6e,0x64,0x65,0x72,0x69,0x6e,0x67,0x41,0x72,0x65,0x61,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,
-0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,
-0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,
-0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,
-0x43,0x6f,0x6d,0x62,0x6f,0x62,0x6f,0x78,0x4c,0x69,0x73,0x74,0x4c,0x65,0x66,0x74,
-0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,
-0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,
-0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,
-0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x43,0x6f,0x6d,0x62,0x6f,0x62,
-0x6f,0x78,0x4c,0x69,0x73,0x74,0x54,0x6f,0x70,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,
-0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,
-0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,
-0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,
-0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x3d,0x22,0x43,0x6f,0x6d,0x62,0x6f,0x62,0x6f,0x78,0x4c,0x69,0x73,0x74,0x52,
-0x69,0x67,0x68,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,
-0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,
-0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,
-0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,
-0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,
-0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x43,0x6f,0x6d,0x62,0x6f,0x62,0x6f,
-0x78,0x4c,0x69,0x73,0x74,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x22,0x20,0x64,0x69,0x6d,
-0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,
-0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x49,0x74,0x65,0x6d,0x52,0x65,0x6e,0x64,0x65,0x72,0x69,
-0x6e,0x67,0x41,0x72,0x65,0x61,0x48,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,
-0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,
-0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,
-0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,
-0x22,0x43,0x6f,0x6d,0x62,0x6f,0x62,0x6f,0x78,0x4c,0x69,0x73,0x74,0x4c,0x65,0x66,
-0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,
-0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,
-0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x43,0x6f,0x6d,0x62,0x6f,
-0x62,0x6f,0x78,0x4c,0x69,0x73,0x74,0x54,0x6f,0x70,0x22,0x20,0x64,0x69,0x6d,0x65,
-0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,
-0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,
-0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x3d,0x22,0x43,0x6f,0x6d,0x62,0x6f,0x62,0x6f,0x78,0x4c,0x69,0x73,0x74,
-0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,
-0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,
-0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,
-0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,
-0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,
-0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,
-0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x44,0x69,0x6d,0x20,0x77,0x69,0x64,
-0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x68,0x73,0x63,0x72,
-0x6f,0x6c,0x6c,0x62,0x61,0x72,0x5f,0x5f,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,
-0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,
-0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,
-0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,
-0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4e,0x61,
-0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x20,0x6e,0x61,0x6d,0x65,
-0x3d,0x22,0x49,0x74,0x65,0x6d,0x52,0x65,0x6e,0x64,0x65,0x72,0x69,0x6e,0x67,0x41,
-0x72,0x65,0x61,0x56,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,
-0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x43,0x6f,
-0x6d,0x62,0x6f,0x62,0x6f,0x78,0x4c,0x69,0x73,0x74,0x4c,0x65,0x66,0x74,0x22,0x20,
-0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,
-0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x43,0x6f,0x6d,0x62,0x6f,0x62,0x6f,0x78,
-0x4c,0x69,0x73,0x74,0x54,0x6f,0x70,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,
-0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,
-0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,
-0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,
-0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,
-0x44,0x69,0x6d,0x20,0x77,0x69,0x64,0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,
-0x74,0x6f,0x5f,0x76,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x5f,0x5f,0x22,
-0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,
-0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,
-0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,
-0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,
-0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x3d,0x22,0x43,0x6f,0x6d,0x62,0x6f,0x62,0x6f,0x78,0x4c,0x69,0x73,0x74,
-0x42,0x6f,0x74,0x74,0x6f,0x6d,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,
-0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,
-0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,
-0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4e,0x61,0x6d,0x65,
-0x64,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,
-0x49,0x74,0x65,0x6d,0x52,0x65,0x6e,0x64,0x65,0x72,0x69,0x6e,0x67,0x41,0x72,0x65,
-0x61,0x48,0x56,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,
-0x67,0x65,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x43,0x6f,0x6d,
-0x62,0x6f,0x62,0x6f,0x78,0x4c,0x69,0x73,0x74,0x4c,0x65,0x66,0x74,0x22,0x20,0x64,
-0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,
-0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x43,0x6f,0x6d,0x62,0x6f,0x62,0x6f,0x78,0x4c,
-0x69,0x73,0x74,0x54,0x6f,0x70,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,
-0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,
-0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,
-0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,
-0x74,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,
-0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x44,
-0x69,0x6d,0x20,0x77,0x69,0x64,0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,
-0x6f,0x5f,0x76,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x5f,0x5f,0x22,0x20,
-0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,
-0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,
-0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,
-0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,
-0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,
-0x65,0x74,0x44,0x69,0x6d,0x20,0x77,0x69,0x64,0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,
-0x61,0x75,0x74,0x6f,0x5f,0x68,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x5f,
-0x5f,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,
-0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x68,0x69,0x6c,0x64,
-0x20,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,
-0x6f,0x6f,0x6b,0x2f,0x48,0x6f,0x72,0x69,0x7a,0x6f,0x6e,0x74,0x61,0x6c,0x53,0x63,
-0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x22,0x20,0x6e,0x61,0x6d,0x65,0x53,0x75,0x66,
-0x66,0x69,0x78,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x68,0x73,0x63,0x72,
-0x6f,0x6c,0x6c,0x62,0x61,0x72,0x5f,0x5f,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,
-0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,
-0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,
-0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,
-0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,
-0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,
-0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,
-0x22,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x3d,0x22,0x2d,0x31,0x32,0x22,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,
-0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x31,0x32,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x41,
-0x6c,0x69,0x67,0x6e,0x6d,0x65,0x6e,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,
-0x6f,0x74,0x74,0x6f,0x6d,0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x43,0x68,0x69,0x6c,0x64,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x68,0x69,0x6c,0x64,
-0x20,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,
-0x6f,0x6f,0x6b,0x2f,0x56,0x65,0x72,0x74,0x69,0x63,0x61,0x6c,0x53,0x63,0x72,0x6f,
-0x6c,0x6c,0x62,0x61,0x72,0x22,0x20,0x6e,0x61,0x6d,0x65,0x53,0x75,0x66,0x66,0x69,
-0x78,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x76,0x73,0x63,0x72,0x6f,0x6c,
-0x6c,0x62,0x61,0x72,0x5f,0x5f,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,
-0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,
-0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,
-0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,
-0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,
-0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x31,0x32,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,
-0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,
-0x3d,0x22,0x31,0x22,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x3d,0x22,0x2d,0x31,0x32,
-0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,
-0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x41,0x6c,
-0x69,0x67,0x6e,0x6d,0x65,0x6e,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,
-0x67,0x68,0x74,0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x43,0x68,0x69,0x6c,0x64,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,
-0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x6d,0x61,
-0x69,0x6e,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,
-0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,
-0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,
-0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,
-0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,
-0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,
-0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,
-0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,
-0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,
-0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x4c,0x65,0x66,0x74,
-0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,
-0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x3d,0x22,0x43,0x6f,0x6d,0x62,0x6f,0x62,0x6f,0x78,0x4c,0x69,
-0x73,0x74,0x54,0x6f,0x70,0x4c,0x65,0x66,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x52,0x69,
-0x67,0x68,0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x43,0x6f,0x6d,0x62,0x6f,0x62,0x6f,
-0x78,0x4c,0x69,0x73,0x74,0x54,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,
-0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x43,
-0x6f,0x6d,0x62,0x6f,0x62,0x6f,0x78,0x4c,0x69,0x73,0x74,0x42,0x6f,0x74,0x74,0x6f,
-0x6d,0x4c,0x65,0x66,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,
-0x68,0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,
-0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x43,0x6f,0x6d,0x62,0x6f,0x62,0x6f,0x78,
-0x4c,0x69,0x73,0x74,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x43,0x6f,0x6d,0x62,0x6f,0x62,0x6f,
-0x78,0x4c,0x69,0x73,0x74,0x4c,0x65,0x66,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,
-0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x3d,0x22,0x43,0x6f,0x6d,0x62,0x6f,0x62,0x6f,0x78,0x4c,0x69,0x73,0x74,
-0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x43,0x6f,
-0x6d,0x62,0x6f,0x62,0x6f,0x78,0x4c,0x69,0x73,0x74,0x54,0x6f,0x70,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,
-0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x43,0x6f,0x6d,0x62,0x6f,0x62,0x6f,
-0x78,0x4c,0x69,0x73,0x74,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x61,0x63,
-0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,
-0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x43,0x6f,0x6d,0x62,0x6f,0x62,0x6f,0x78,0x4c,
-0x69,0x73,0x74,0x42,0x61,0x63,0x6b,0x64,0x72,0x6f,0x70,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x46,0x72,
-0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x3d,0x22,0x6d,0x61,0x69,0x6e,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,
-0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,
-0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6d,0x61,0x69,0x6e,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x20,0x74,0x6f,0x70,0x4c,0x65,
-0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x74,0x6f,
-0x70,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,
-0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,
-0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,
-0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,
-0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x3e,0x0a,0x0a,0x20,0x20,0x20,
-0x20,0x3c,0x21,0x2d,0x2d,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,
-0x6b,0x2f,0x43,0x6f,0x6d,0x62,0x6f,0x45,0x64,0x69,0x74,0x62,0x6f,0x78,0x0a,0x20,
-0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x2d,0x2d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x2f,0x43,0x6f,0x6d,0x62,0x6f,0x45,0x64,0x69,0x74,0x62,0x6f,0x78,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,
-0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,
-0x3d,0x22,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,
-0x75,0x72,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,
-0x3d,0x22,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x22,0x20,0x72,0x65,0x64,0x72,
-0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,
-0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x53,0x65,0x6c,0x65,0x63,0x74,0x65,0x64,0x54,0x65,
-0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,
-0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x46,0x46,0x30,0x30,0x30,0x30,0x30,0x30,
-0x22,0x20,0x72,0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,
-0x22,0x74,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,
-0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x41,0x63,0x74,0x69,
-0x76,0x65,0x53,0x65,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x43,0x6f,0x6c,0x6f,0x75,
-0x72,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,
-0x22,0x46,0x46,0x36,0x30,0x37,0x46,0x46,0x46,0x22,0x20,0x72,0x65,0x64,0x72,0x61,
-0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,
-0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x49,0x6e,0x61,0x63,0x74,0x69,0x76,0x65,0x53,0x65,0x6c,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x69,0x6e,
-0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x46,0x46,0x38,0x30,
-0x38,0x30,0x38,0x30,0x22,0x20,0x72,0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,
-0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4d,0x6f,0x75,0x73,0x65,0x43,0x75,0x72,0x73,0x6f,
-0x72,0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x73,
-0x65,0x74,0x3a,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x3a,0x4d,0x6f,0x75,0x73,0x65,0x54,0x65,0x78,0x74,0x42,0x61,
-0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4e,
-0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,
-0x65,0x78,0x74,0x41,0x72,0x65,0x61,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,
-0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,
-0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x35,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,
-0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,
-0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x35,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,
-0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,
-0x3d,0x22,0x31,0x2e,0x30,0x22,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x3d,0x22,0x2d,
-0x35,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,
-0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,
-0x67,0x65,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,
-0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x2e,0x30,0x22,0x20,0x6f,0x66,0x66,
-0x73,0x65,0x74,0x3d,0x22,0x2d,0x35,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,
-0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x63,0x6f,0x6e,0x74,0x61,
-0x69,0x6e,0x65,0x72,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x46,0x72,0x61,0x6d,0x65,
-0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,
-0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,
-0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,
-0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,
-0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,
-0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,
-0x2e,0x30,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,
-0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,
-0x61,0x6c,0x65,0x3d,0x22,0x31,0x2e,0x30,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x43,0x6f,
-0x6d,0x62,0x6f,0x62,0x6f,0x78,0x45,0x64,0x69,0x74,0x4c,0x65,0x66,0x74,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x42,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,
-0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x43,0x6f,0x6d,0x62,0x6f,0x62,
-0x6f,0x78,0x45,0x64,0x69,0x74,0x4d,0x69,0x64,0x64,0x6c,0x65,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x46,
-0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,
-0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,
-0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x73,0x65,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,
-0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,
-0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,
-0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,
-0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,
-0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,
-0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x2e,0x30,0x22,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,
-0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,
-0x67,0x65,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,
-0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x2e,0x30,0x22,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x3d,0x22,0x54,0x65,0x78,0x74,0x53,0x65,0x6c,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x42,0x72,0x75,0x73,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,
-0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,
-0x72,0x65,0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,
-0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,
-0x72,0x65,0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,
-0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x43,0x61,0x72,0x61,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,
-0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,
-0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,
-0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,
-0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,
-0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x3d,0x22,0x45,0x64,0x69,0x74,0x42,0x6f,0x78,0x43,0x61,0x72,0x61,0x74,
-0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,
-0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,
-0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,
-0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x2e,0x30,0x22,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,
-0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,
-0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x45,0x64,0x69,0x74,0x42,0x6f,0x78,
-0x43,0x61,0x72,0x61,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x46,
-0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,
-0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,
-0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,
-0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,
-0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,
-0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,
-0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,
-0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x52,0x65,
-0x61,0x64,0x4f,0x6e,0x6c,0x79,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x63,
-0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,
-0x61,0x62,0x6c,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x63,0x6f,
-0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x20,0x74,0x6f,
-0x70,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,
-0x20,0x74,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,
-0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x3d,
-0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,
-0x6d,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,
-0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,
-0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,
-0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x41,0x63,0x74,0x69,0x76,0x65,0x53,
-0x65,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,
-0x22,0x73,0x65,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,
-0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x41,0x63,0x74,0x69,0x76,0x65,0x53,0x65,0x6c,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x49,0x6e,0x61,0x63,0x74,0x69,0x76,0x65,0x53,0x65,0x6c,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x73,
-0x65,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x43,0x6f,0x6c,0x6f,0x75,0x72,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x49,0x6e,0x61,0x63,0x74,0x69,0x76,0x65,0x53,0x65,0x6c,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x57,
-0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x3e,0x0a,0x0a,0x20,0x20,0x20,0x20,
-0x3c,0x21,0x2d,0x2d,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x2f,0x43,0x6f,0x6d,0x62,0x6f,0x62,0x6f,0x78,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x0a,0x20,0x20,0x20,0x20,0x2d,0x2d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x57,
-0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x43,0x6f,0x6d,0x62,
-0x6f,0x62,0x6f,0x78,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x4c,0x69,0x6e,0x6b,0x44,0x65,0x66,0x69,
-0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4e,0x6f,0x72,
-0x6d,0x61,0x6c,0x45,0x64,0x69,0x74,0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,
-0x72,0x22,0x20,0x77,0x69,0x64,0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,
-0x6f,0x5f,0x65,0x64,0x69,0x74,0x62,0x6f,0x78,0x5f,0x5f,0x22,0x20,0x74,0x61,0x72,
-0x67,0x65,0x74,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x3d,0x22,0x4e,0x6f,0x72,
-0x6d,0x61,0x6c,0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x69,
-0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x46,0x46,0x46,
-0x46,0x46,0x46,0x46,0x46,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x4c,0x69,0x6e,0x6b,0x44,
-0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,
-0x53,0x65,0x6c,0x65,0x63,0x74,0x65,0x64,0x45,0x64,0x69,0x74,0x54,0x65,0x78,0x74,
-0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x77,0x69,0x64,0x67,0x65,0x74,0x3d,0x22,
-0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x65,0x64,0x69,0x74,0x62,0x6f,0x78,0x5f,0x5f,
-0x22,0x20,0x74,0x61,0x72,0x67,0x65,0x74,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,
-0x3d,0x22,0x53,0x65,0x6c,0x65,0x63,0x74,0x65,0x64,0x54,0x65,0x78,0x74,0x43,0x6f,
-0x6c,0x6f,0x75,0x72,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,
-0x75,0x65,0x3d,0x22,0x46,0x46,0x30,0x30,0x30,0x30,0x30,0x30,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,
-0x74,0x79,0x4c,0x69,0x6e,0x6b,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,
-0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x41,0x63,0x74,0x69,0x76,0x65,0x45,0x64,0x69,
-0x74,0x53,0x65,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x43,0x6f,0x6c,0x6f,0x75,0x72,
-0x22,0x20,0x77,0x69,0x64,0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,
-0x5f,0x65,0x64,0x69,0x74,0x62,0x6f,0x78,0x5f,0x5f,0x22,0x20,0x74,0x61,0x72,0x67,
-0x65,0x74,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x3d,0x22,0x41,0x63,0x74,0x69,
-0x76,0x65,0x53,0x65,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x43,0x6f,0x6c,0x6f,0x75,
-0x72,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,
-0x22,0x46,0x46,0x36,0x30,0x36,0x30,0x46,0x46,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x4c,
-0x69,0x6e,0x6b,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x49,0x6e,0x61,0x63,0x74,0x69,0x76,0x65,0x45,0x64,0x69,0x74,
-0x53,0x65,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,
-0x20,0x77,0x69,0x64,0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,
-0x65,0x64,0x69,0x74,0x62,0x6f,0x78,0x5f,0x5f,0x22,0x20,0x74,0x61,0x72,0x67,0x65,
-0x74,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x3d,0x22,0x49,0x6e,0x61,0x63,0x74,
-0x69,0x76,0x65,0x53,0x65,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x43,0x6f,0x6c,0x6f,
-0x75,0x72,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,
-0x3d,0x22,0x46,0x46,0x38,0x30,0x38,0x30,0x38,0x30,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x68,0x69,0x6c,0x64,0x20,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x2f,0x43,0x6f,0x6d,0x62,0x6f,0x45,0x64,0x69,0x74,0x62,0x6f,0x78,0x22,0x20,0x6e,
-0x61,0x6d,0x65,0x53,0x75,0x66,0x66,0x69,0x78,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,
-0x6f,0x5f,0x65,0x64,0x69,0x74,0x62,0x6f,0x78,0x5f,0x5f,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,
-0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,
-0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,
-0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,
-0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,
-0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,
-0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,
-0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,
-0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x46,0x6f,0x6e,0x74,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,
-0x69,0x6e,0x65,0x53,0x70,0x61,0x63,0x69,0x6e,0x67,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x4d,0x75,
-0x6c,0x74,0x69,0x70,0x6c,0x79,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x62,
-0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,
-0x22,0x31,0x2e,0x35,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,
-0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x46,0x6f,0x6e,0x74,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,
-0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,
-0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,
-0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x46,0x6f,0x6e,0x74,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x69,0x6e,0x65,0x53,0x70,0x61,0x63,0x69,
-0x6e,0x67,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x4d,0x75,
-0x6c,0x74,0x69,0x70,0x6c,0x79,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,
-0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x31,0x2e,0x35,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,
-0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x46,0x6f,
-0x6e,0x74,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x43,0x68,0x69,0x6c,
-0x64,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x68,0x69,0x6c,
-0x64,0x20,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x2f,0x43,0x6f,0x6d,0x62,0x6f,0x44,0x72,0x6f,0x70,0x4c,0x69,
-0x73,0x74,0x22,0x20,0x6e,0x61,0x6d,0x65,0x53,0x75,0x66,0x66,0x69,0x78,0x3d,0x22,
-0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x64,0x72,0x6f,0x70,0x6c,0x69,0x73,0x74,0x5f,
-0x5f,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,
-0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,
-0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,
-0x20,0x3e,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x44,0x69,0x6d,0x20,0x77,0x69,0x64,
-0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x65,0x64,0x69,0x74,
-0x62,0x6f,0x78,0x5f,0x5f,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,
-0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,
-0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x55,
-0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,
-0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,
-0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,
-0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x43,0x68,0x69,
-0x6c,0x64,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x68,0x69,
-0x6c,0x64,0x20,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x49,0x6d,0x61,0x67,0x65,0x42,0x75,0x74,0x74,0x6f,
-0x6e,0x22,0x20,0x6e,0x61,0x6d,0x65,0x53,0x75,0x66,0x66,0x69,0x78,0x3d,0x22,0x5f,
-0x5f,0x61,0x75,0x74,0x6f,0x5f,0x62,0x75,0x74,0x74,0x6f,0x6e,0x5f,0x5f,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,
-0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,
-0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,
-0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,
-0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,
-0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,
-0x20,0x3e,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x44,0x69,0x6d,0x20,0x77,0x69,0x64,
-0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x65,0x64,0x69,0x74,
-0x62,0x6f,0x78,0x5f,0x5f,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,
-0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,
-0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x44,0x69,
-0x6d,0x20,0x77,0x69,0x64,0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,
-0x5f,0x65,0x64,0x69,0x74,0x62,0x6f,0x78,0x5f,0x5f,0x22,0x20,0x64,0x69,0x6d,0x65,
-0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x41,0x6c,0x69,
-0x67,0x6e,0x6d,0x65,0x6e,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,
-0x68,0x74,0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,
-0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4e,0x6f,0x72,0x6d,0x61,0x6c,
-0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x73,0x65,
-0x74,0x3a,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x3a,0x43,0x6f,0x6d,0x62,0x6f,0x62,0x6f,0x78,0x4c,0x69,0x73,0x74,
-0x42,0x75,0x74,0x74,0x6f,0x6e,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,
-0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x48,0x6f,0x76,
-0x65,0x72,0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,
-0x73,0x65,0x74,0x3a,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x3a,0x43,0x6f,0x6d,0x62,0x6f,0x62,0x6f,0x78,0x4c,0x69,
-0x73,0x74,0x42,0x75,0x74,0x74,0x6f,0x6e,0x48,0x6f,0x76,0x65,0x72,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,
-0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x50,0x75,
-0x73,0x68,0x65,0x64,0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,
-0x3d,0x22,0x73,0x65,0x74,0x3a,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,
-0x6b,0x20,0x69,0x6d,0x61,0x67,0x65,0x3a,0x43,0x6f,0x6d,0x62,0x6f,0x62,0x6f,0x78,
-0x4c,0x69,0x73,0x74,0x42,0x75,0x74,0x74,0x6f,0x6e,0x4e,0x6f,0x72,0x6d,0x61,0x6c,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x43,
-0x68,0x69,0x6c,0x64,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,
-0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,
-0x3d,0x22,0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,
-0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,0x61,0x62,0x6c,
-0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x57,0x69,0x64,
-0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x3e,0x0a,0x0a,0x20,0x20,0x20,0x20,0x3c,0x21,
-0x2d,0x2d,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x53,
-0x70,0x69,0x6e,0x6e,0x65,0x72,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,
-0x20,0x20,0x20,0x2d,0x2d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,
-0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x53,0x70,0x69,0x6e,0x6e,0x65,0x72,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x68,0x69,0x6c,
-0x64,0x20,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x2f,0x45,0x64,0x69,0x74,0x62,0x6f,0x78,0x22,0x20,0x6e,0x61,
-0x6d,0x65,0x53,0x75,0x66,0x66,0x69,0x78,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,
-0x5f,0x65,0x64,0x69,0x74,0x62,0x6f,0x78,0x5f,0x5f,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,
-0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,
-0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,
-0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,
-0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,
-0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,
-0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,
-0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,
-0x6c,0x55,0x70,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,
-0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,
-0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,
-0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,
-0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,
-0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,
-0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x43,
-0x68,0x69,0x6c,0x64,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,
-0x68,0x69,0x6c,0x64,0x20,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,
-0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x49,0x6d,0x61,0x67,0x65,0x42,0x75,0x74,
-0x74,0x6f,0x6e,0x22,0x20,0x6e,0x61,0x6d,0x65,0x53,0x75,0x66,0x66,0x69,0x78,0x3d,
-0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x69,0x6e,0x63,0x62,0x74,0x6e,0x5f,0x5f,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,
-0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,
-0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,
-0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,
-0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,
-0x68,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,
-0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x56,0x65,0x72,0x74,
-0x53,0x63,0x72,0x6f,0x6c,0x6c,0x55,0x70,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,
-0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,
-0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,
-0x3d,0x22,0x30,0x2e,0x35,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,
-0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,
-0x6f,0x72,0x7a,0x41,0x6c,0x69,0x67,0x6e,0x6d,0x65,0x6e,0x74,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,
-0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x76,0x61,0x6c,
-0x75,0x65,0x3d,0x22,0x73,0x65,0x74,0x3a,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,
-0x6f,0x6f,0x6b,0x20,0x69,0x6d,0x61,0x67,0x65,0x3a,0x56,0x65,0x72,0x74,0x53,0x63,
-0x72,0x6f,0x6c,0x6c,0x55,0x70,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,
-0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x48,0x6f,0x76,
-0x65,0x72,0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,
-0x73,0x65,0x74,0x3a,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x3a,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,
-0x55,0x70,0x48,0x6f,0x76,0x65,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,
-0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x50,0x75,0x73,0x68,0x65,0x64,0x49,0x6d,
-0x61,0x67,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x73,0x65,0x74,0x3a,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x3a,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x55,0x70,0x4e,0x6f,
-0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x43,0x68,0x69,0x6c,0x64,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x43,0x68,0x69,0x6c,0x64,0x20,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x49,0x6d,0x61,0x67,
-0x65,0x42,0x75,0x74,0x74,0x6f,0x6e,0x22,0x20,0x6e,0x61,0x6d,0x65,0x53,0x75,0x66,
-0x66,0x69,0x78,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x64,0x65,0x63,0x62,
-0x74,0x6e,0x5f,0x5f,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,
-0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,
-0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,
-0x67,0x65,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,
-0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x30,0x2e,0x35,0x22,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,
-0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,
-0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,
-0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x55,0x70,0x4e,0x6f,0x72,0x6d,
-0x61,0x6c,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,
-0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,
-0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,
-0x63,0x61,0x6c,0x65,0x3d,0x22,0x30,0x2e,0x35,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x41,0x6c,0x69,0x67,0x6e,0x6d,0x65,0x6e,0x74,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x41,0x6c,0x69,0x67,
-0x6e,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x49,0x6d,0x61,0x67,0x65,0x22,
-0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x73,0x65,0x74,0x3a,0x54,0x61,0x68,0x61,
-0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x20,0x69,0x6d,0x61,0x67,0x65,0x3a,0x56,0x65,
-0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x44,0x6f,0x77,0x6e,0x4e,0x6f,0x72,0x6d,
-0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,
-0x65,0x3d,0x22,0x48,0x6f,0x76,0x65,0x72,0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x76,
-0x61,0x6c,0x75,0x65,0x3d,0x22,0x73,0x65,0x74,0x3a,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x20,0x69,0x6d,0x61,0x67,0x65,0x3a,0x56,0x65,0x72,0x74,
-0x53,0x63,0x72,0x6f,0x6c,0x6c,0x44,0x6f,0x77,0x6e,0x48,0x6f,0x76,0x65,0x72,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,
-0x50,0x75,0x73,0x68,0x65,0x64,0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x76,0x61,0x6c,
-0x75,0x65,0x3d,0x22,0x73,0x65,0x74,0x3a,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,
-0x6f,0x6f,0x6b,0x20,0x69,0x6d,0x61,0x67,0x65,0x3a,0x56,0x65,0x72,0x74,0x53,0x63,
-0x72,0x6f,0x6c,0x6c,0x44,0x6f,0x77,0x6e,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x43,0x68,0x69,
-0x6c,0x64,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,
-0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,
-0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,
-0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x57,0x69,0x64,0x67,0x65,
-0x74,0x4c,0x6f,0x6f,0x6b,0x3e,0x0a,0x0a,0x20,0x20,0x20,0x20,0x3c,0x21,0x2d,0x2d,
-0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x53,0x74,0x61,
-0x74,0x69,0x63,0x53,0x68,0x61,0x72,0x65,0x64,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x28,0x53,0x68,0x61,0x72,0x65,0x64,0x20,0x69,0x6d,0x61,0x67,0x65,0x72,
-0x79,0x20,0x63,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x73,0x20,0x66,0x6f,0x72,
-0x20,0x73,0x74,0x61,0x74,0x69,0x63,0x20,0x77,0x69,0x64,0x67,0x65,0x74,0x73,0x29,
-0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x2d,0x2d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,
-0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x2f,0x53,0x74,0x61,0x74,0x69,0x63,0x53,0x68,0x61,0x72,0x65,0x64,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,
-0x66,0x72,0x61,0x6d,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,
-0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,
-0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,
-0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,
-0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,
-0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,
-0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,
-0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,
-0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x4c,
-0x65,0x66,0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x53,0x74,0x61,0x74,0x69,0x63,0x54,
-0x6f,0x70,0x4c,0x65,0x66,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,
-0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,
-0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x3d,0x22,0x53,0x74,0x61,0x74,0x69,0x63,0x54,0x6f,0x70,0x52,
-0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,
-0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,
-0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x3d,0x22,0x53,0x74,0x61,0x74,0x69,0x63,0x42,0x6f,0x74,0x74,
-0x6f,0x6d,0x4c,0x65,0x66,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,
-0x67,0x68,0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x53,0x74,0x61,0x74,0x69,0x63,0x42,
-0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,
-0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x3d,0x22,0x53,0x74,0x61,0x74,0x69,0x63,0x4c,0x65,0x66,0x74,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x53,0x74,0x61,0x74,0x69,0x63,0x52,
-0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x53,0x74,0x61,
-0x74,0x69,0x63,0x54,0x6f,0x70,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,
-0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3d,0x22,0x53,0x74,0x61,0x74,0x69,0x63,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x52,0x65,0x63,0x74,0x50,0x72,
-0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x46,0x72,0x61,
-0x6d,0x65,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x46,0x72,0x61,0x6d,
-0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,
-0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x53,0x74,0x61,0x74,0x69,0x63,0x4c,
-0x65,0x66,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,
-0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,
-0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,
-0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,
-0x22,0x53,0x74,0x61,0x74,0x69,0x63,0x54,0x6f,0x70,0x22,0x20,0x64,0x69,0x6d,0x65,
-0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,
-0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,
-0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,
-0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,
-0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,
-0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x3d,0x22,0x53,0x74,0x61,0x74,0x69,0x63,0x52,0x69,0x67,0x68,0x74,0x22,
-0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,
-0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,
-0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,
-0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,
-0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,
-0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,
-0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,
-0x53,0x74,0x61,0x74,0x69,0x63,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x22,0x20,0x64,0x69,
-0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x53,0x74,0x61,
-0x74,0x69,0x63,0x42,0x61,0x63,0x6b,0x64,0x72,0x6f,0x70,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x21,0x2d,0x2d,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x52,0x65,0x63,0x74,0x50,
-0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x42,0x61,
-0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x22,
-0x20,0x2f,0x3e,0x2d,0x2d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x20,
-0x74,0x6f,0x70,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x46,0x46,0x46,0x46,0x46,
-0x46,0x22,0x20,0x74,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x46,
-0x46,0x46,0x46,0x46,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,
-0x74,0x3d,0x22,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x22,0x20,0x62,0x6f,0x74,
-0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x46,0x46,0x46,0x46,
-0x46,0x46,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x46,0x6f,0x72,0x6d,
-0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,0x74,0x63,0x68,
-0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,
-0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,0x74,0x63,0x68,
-0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,
-0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,
-0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x62,
-0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x5f,0x6e,0x6f,0x66,0x72,0x61,0x6d,
-0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,
-0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,
-0x65,0x22,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,
-0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x3e,0x3c,0x41,0x62,0x73,0x6f,
-0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,
-0x64,0x67,0x65,0x22,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,
-0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x3e,
-0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,
-0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,
-0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x53,0x74,
-0x61,0x74,0x69,0x63,0x42,0x61,0x63,0x6b,0x64,0x72,0x6f,0x70,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x21,0x2d,0x2d,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x52,0x65,0x63,0x74,
-0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x42,
-0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,
-0x22,0x20,0x2f,0x3e,0x2d,0x2d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,
-0x20,0x74,0x6f,0x70,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x46,0x46,0x46,0x46,
-0x46,0x46,0x22,0x20,0x74,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,
-0x46,0x46,0x46,0x46,0x46,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,
-0x66,0x74,0x3d,0x22,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x22,0x20,0x62,0x6f,
-0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x46,0x46,0x46,
-0x46,0x46,0x46,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x46,0x6f,0x72,
-0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,0x74,0x63,
-0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,
-0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,0x74,0x63,
-0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,
-0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,
-0x6f,0x6b,0x3e,0x0a,0x0a,0x20,0x20,0x20,0x20,0x3c,0x21,0x2d,0x2d,0x0a,0x20,0x20,
-0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x53,0x74,0x61,0x74,0x69,0x63,
-0x49,0x6d,0x61,0x67,0x65,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,
-0x20,0x20,0x2d,0x2d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,
-0x74,0x4c,0x6f,0x6f,0x6b,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,
-0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x53,0x74,0x61,0x74,0x69,0x63,0x49,0x6d,
-0x61,0x67,0x65,0x22,0x3e,0x0a,0x09,0x09,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,
-0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,
-0x3d,0x22,0x49,0x6d,0x61,0x67,0x65,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x22,0x20,
-0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x74,0x6c,
-0x3a,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x20,0x74,0x72,0x3a,0x46,0x46,0x46,
-0x46,0x46,0x46,0x46,0x46,0x20,0x62,0x6c,0x3a,0x46,0x46,0x46,0x46,0x46,0x46,0x46,
-0x46,0x20,0x62,0x72,0x3a,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x22,0x20,0x72,
-0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,
-0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x09,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,
-0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,
-0x65,0x3d,0x22,0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x22,
-0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x74,
-0x6c,0x3a,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x20,0x74,0x72,0x3a,0x46,0x46,
-0x46,0x46,0x46,0x46,0x46,0x46,0x20,0x62,0x6c,0x3a,0x46,0x46,0x46,0x46,0x46,0x46,
-0x46,0x46,0x20,0x62,0x72,0x3a,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x22,0x20,
-0x72,0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,
-0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x09,0x3c,0x50,0x72,0x6f,0x70,0x65,
-0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x42,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x43,0x6f,
-0x6c,0x6f,0x75,0x72,0x73,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,
-0x6c,0x75,0x65,0x3d,0x22,0x74,0x6c,0x3a,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,
-0x20,0x74,0x72,0x3a,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x20,0x62,0x6c,0x3a,
-0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x20,0x62,0x72,0x3a,0x46,0x46,0x46,0x46,
-0x46,0x46,0x46,0x46,0x22,0x20,0x72,0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,
-0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,
-0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,
-0x56,0x65,0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,0x74,0x69,0x6e,0x67,0x22,0x20,
-0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x53,0x74,
-0x72,0x65,0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x72,0x65,0x64,0x72,0x61,0x77,0x4f,
-0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,
-0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,
-0x65,0x3d,0x22,0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,0x74,0x69,0x6e,
-0x67,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,
-0x22,0x53,0x74,0x72,0x65,0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x72,0x65,0x64,0x72,
-0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,
-0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x42,0x61,0x63,0x6b,
-0x67,0x72,0x6f,0x75,0x6e,0x64,0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,0x22,0x20,0x76,
-0x61,0x6c,0x75,0x65,0x3d,0x22,0x54,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,
-0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x46,0x72,0x61,0x6d,0x65,0x45,0x6e,0x61,0x62,
-0x6c,0x65,0x64,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x54,0x72,0x75,0x65,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,
-0x65,0x3d,0x22,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x74,0x68,0x66,0x72,0x61,
-0x6d,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,
-0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,
-0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x53,0x74,
-0x61,0x74,0x69,0x63,0x4c,0x65,0x66,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,
-0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,
-0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x53,0x74,0x61,0x74,0x69,0x63,0x54,0x6f,0x70,
-0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,
-0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x09,0x09,
-0x09,0x09,0x09,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,
-0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,
-0x09,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,
-0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,
-0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,
-0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,
-0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x09,0x09,0x09,0x09,
-0x09,0x09,0x09,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,
-0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x53,0x74,0x61,0x74,
-0x69,0x63,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,
-0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x09,
-0x09,0x09,0x09,0x09,0x09,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,
-0x6f,0x72,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x3c,0x2f,0x55,0x6e,0x69,0x66,
-0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,
-0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,
-0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x3e,
-0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,
-0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,
-0x74,0x22,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x3d,0x22,0x53,0x74,0x61,0x74,0x69,0x63,0x42,0x6f,0x74,0x74,0x6f,0x6d,
-0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,
-0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x3c,
-0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x09,0x09,
-0x09,0x09,0x09,0x09,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,
-0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x09,0x09,
-0x09,0x09,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x49,
-0x6d,0x61,0x67,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,
-0x52,0x65,0x63,0x74,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,
-0x65,0x3d,0x22,0x49,0x6d,0x61,0x67,0x65,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,0x50,
-0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x56,0x65,
-0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,0x74,0x69,0x6e,0x67,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,0x50,0x72,0x6f,0x70,
-0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x48,0x6f,0x72,0x7a,0x46,
-0x6f,0x72,0x6d,0x61,0x74,0x74,0x69,0x6e,0x67,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,
-0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x69,0x6d,0x61,0x67,0x65,0x5f,0x6e,0x6f,0x66,0x72,
-0x61,0x6d,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,
-0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x09,0x09,0x09,0x09,
-0x09,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,
-0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,
-0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,
-0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,
-0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,
-0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x09,0x09,0x09,0x09,0x09,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,
-0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,
-0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x09,0x09,0x09,0x09,0x3c,
-0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x50,0x72,0x6f,
-0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x49,0x6d,0x61,0x67,
-0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x52,0x65,0x63,
-0x74,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,
-0x49,0x6d,0x61,0x67,0x65,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x56,0x65,0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,0x50,0x72,0x6f,0x70,
-0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x56,0x65,0x72,0x74,0x46,
-0x6f,0x72,0x6d,0x61,0x74,0x74,0x69,0x6e,0x67,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,
-0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,
-0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,
-0x61,0x74,0x74,0x69,0x6e,0x67,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,
-0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,
-0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,
-0x22,0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,
-0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,
-0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,
-0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,
-0x3d,0x22,0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,0x46,0x72,0x61,0x6d,0x65,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,
-0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6c,0x6f,
-0x6f,0x6b,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,
-0x53,0x74,0x61,0x74,0x69,0x63,0x53,0x68,0x61,0x72,0x65,0x64,0x22,0x20,0x73,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x66,0x72,0x61,0x6d,0x65,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,
-0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,
-0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,0x61,0x62,0x6c,
-0x65,0x64,0x46,0x72,0x61,0x6d,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6c,0x6f,0x6f,0x6b,0x3d,0x22,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x53,0x74,0x61,0x74,0x69,0x63,0x53,
-0x68,0x61,0x72,0x65,0x64,0x22,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,
-0x66,0x72,0x61,0x6d,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,
-0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,
-0x65,0x3d,0x22,0x57,0x69,0x74,0x68,0x46,0x72,0x61,0x6d,0x65,0x45,0x6e,0x61,0x62,
-0x6c,0x65,0x64,0x42,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,
-0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6c,0x6f,0x6f,
-0x6b,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x53,
-0x74,0x61,0x74,0x69,0x63,0x53,0x68,0x61,0x72,0x65,0x64,0x22,0x20,0x73,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x3d,0x22,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x57,0x69,
-0x74,0x68,0x46,0x72,0x61,0x6d,0x65,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x42,
-0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6c,0x6f,0x6f,0x6b,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x53,0x74,0x61,0x74,0x69,
-0x63,0x53,0x68,0x61,0x72,0x65,0x64,0x22,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,
-0x3d,0x22,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,
-0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,
-0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4e,0x6f,0x46,0x72,0x61,0x6d,
-0x65,0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,0x42,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,
-0x6e,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x20,0x6c,0x6f,0x6f,0x6b,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,
-0x6f,0x6f,0x6b,0x2f,0x53,0x74,0x61,0x74,0x69,0x63,0x53,0x68,0x61,0x72,0x65,0x64,
-0x22,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x62,0x61,0x63,0x6b,0x67,
-0x72,0x6f,0x75,0x6e,0x64,0x5f,0x6e,0x6f,0x66,0x72,0x61,0x6d,0x65,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4e,0x6f,0x46,0x72,0x61,
-0x6d,0x65,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x42,0x61,0x63,0x6b,0x67,0x72,
-0x6f,0x75,0x6e,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x20,0x6c,0x6f,0x6f,0x6b,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x53,0x74,0x61,0x74,0x69,0x63,0x53,0x68,0x61,0x72,
-0x65,0x64,0x22,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x62,0x61,0x63,
-0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x5f,0x6e,0x6f,0x66,0x72,0x61,0x6d,0x65,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x57,0x69,0x74,
-0x68,0x46,0x72,0x61,0x6d,0x65,0x49,0x6d,0x61,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x3d,0x22,0x69,0x6d,0x61,0x67,0x65,0x5f,0x77,0x69,0x74,0x68,0x66,0x72,
-0x61,0x6d,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,
-0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,
-0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,
-0x22,0x4e,0x6f,0x46,0x72,0x61,0x6d,0x65,0x49,0x6d,0x61,0x67,0x65,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,
-0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x3d,0x22,0x69,0x6d,0x61,0x67,0x65,0x5f,0x6e,0x6f,0x66,0x72,
-0x61,0x6d,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,
-0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x57,0x69,0x64,0x67,0x65,
-0x74,0x4c,0x6f,0x6f,0x6b,0x3e,0x0a,0x0a,0x20,0x20,0x20,0x20,0x3c,0x21,0x2d,0x2d,
-0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x53,0x74,0x61,
-0x74,0x69,0x63,0x54,0x65,0x78,0x74,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,
-0x20,0x20,0x20,0x20,0x2d,0x2d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,
-0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x53,0x74,0x61,0x74,0x69,0x63,
-0x54,0x65,0x78,0x74,0x22,0x3e,0x0a,0x09,0x09,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,
-0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,
-0x65,0x3d,0x22,0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x22,
-0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x74,
-0x6c,0x3a,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x20,0x74,0x72,0x3a,0x46,0x46,
-0x46,0x46,0x46,0x46,0x46,0x46,0x20,0x62,0x6c,0x3a,0x46,0x46,0x46,0x46,0x46,0x46,
-0x46,0x46,0x20,0x62,0x72,0x3a,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x22,0x20,
-0x72,0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,
-0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x09,0x3c,0x50,0x72,0x6f,0x70,0x65,
-0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x42,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x43,0x6f,
-0x6c,0x6f,0x75,0x72,0x73,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,
-0x6c,0x75,0x65,0x3d,0x22,0x74,0x6c,0x3a,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,
-0x20,0x74,0x72,0x3a,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x20,0x62,0x6c,0x3a,
-0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x20,0x62,0x72,0x3a,0x46,0x46,0x46,0x46,
-0x46,0x46,0x46,0x46,0x22,0x20,0x72,0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,
-0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x46,0x72,0x61,0x6d,0x65,0x45,0x6e,0x61,0x62,0x6c,
-0x65,0x64,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x54,0x72,0x75,0x65,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,
-0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x42,0x61,0x63,0x6b,
-0x67,0x72,0x6f,0x75,0x6e,0x64,0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,0x22,0x20,0x76,
-0x61,0x6c,0x75,0x65,0x3d,0x22,0x54,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,
-0x61,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x57,0x69,0x74,0x68,0x46,0x72,0x61,0x6d,
-0x65,0x54,0x65,0x78,0x74,0x52,0x65,0x6e,0x64,0x65,0x72,0x41,0x72,0x65,0x61,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,
-0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x3d,0x22,0x53,0x74,0x61,0x74,0x69,0x63,0x4c,0x65,0x66,0x74,0x22,0x20,0x64,
-0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,
-0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x53,0x74,0x61,0x74,0x69,0x63,0x54,0x6f,0x70,
-0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,
-0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,
-0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,
-0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,
-0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,
-0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,
-0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x53,0x74,0x61,0x74,0x69,0x63,
-0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,
-0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,
-0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,
-0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,
-0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,
-0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,
-0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,
-0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x53,0x74,0x61,0x74,0x69,0x63,
-0x42,0x6f,0x74,0x74,0x6f,0x6d,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,
-0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,
-0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,
-0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4e,0x61,0x6d,0x65,
-0x64,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,
-0x57,0x69,0x74,0x68,0x46,0x72,0x61,0x6d,0x65,0x54,0x65,0x78,0x74,0x52,0x65,0x6e,
-0x64,0x65,0x72,0x41,0x72,0x65,0x61,0x48,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,
-0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,
-0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3d,0x22,0x53,0x74,0x61,0x74,0x69,0x63,0x4c,0x65,0x66,0x74,0x22,0x20,0x64,0x69,
-0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,
-0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,
-0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x3d,0x22,0x53,0x74,0x61,0x74,0x69,0x63,0x54,0x6f,0x70,0x22,
-0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,
-0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,
-0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,
-0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,
-0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,
-0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x53,0x74,0x61,0x74,0x69,0x63,0x52,
-0x69,0x67,0x68,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,
-0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,
-0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,
-0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,
-0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,
-0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x44,0x69,0x6d,0x20,0x77,0x69,0x64,0x67,
-0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x68,0x73,0x63,0x72,0x6f,
-0x6c,0x6c,0x62,0x61,0x72,0x5f,0x5f,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,
-0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,
-0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,
-0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,
-0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4e,0x61,0x6d,
-0x65,0x64,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x20,0x6e,0x61,0x6d,0x65,0x3d,
-0x22,0x57,0x69,0x74,0x68,0x46,0x72,0x61,0x6d,0x65,0x54,0x65,0x78,0x74,0x52,0x65,
-0x6e,0x64,0x65,0x72,0x41,0x72,0x65,0x61,0x56,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,
-0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x3d,0x22,0x53,0x74,0x61,0x74,0x69,0x63,0x4c,0x65,0x66,0x74,0x22,0x20,0x64,
-0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,
-0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x53,0x74,0x61,0x74,0x69,0x63,0x54,0x6f,0x70,
-0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,
-0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,
-0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,
-0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,
-0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,
-0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x44,0x69,0x6d,0x20,0x77,0x69,0x64,
-0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x76,0x73,0x63,0x72,
-0x6f,0x6c,0x6c,0x62,0x61,0x72,0x5f,0x5f,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,
-0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,
-0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,
-0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,
-0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,
-0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,
-0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,
-0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,
-0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x53,0x74,0x61,
-0x74,0x69,0x63,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,
-0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,
-0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,
-0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,
-0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4e,
-0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x20,0x6e,0x61,0x6d,
-0x65,0x3d,0x22,0x57,0x69,0x74,0x68,0x46,0x72,0x61,0x6d,0x65,0x54,0x65,0x78,0x74,
-0x52,0x65,0x6e,0x64,0x65,0x72,0x41,0x72,0x65,0x61,0x48,0x56,0x53,0x63,0x72,0x6f,
-0x6c,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,
-0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x3d,0x22,0x53,0x74,0x61,0x74,0x69,0x63,0x4c,0x65,0x66,0x74,
-0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,
-0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,
-0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,
-0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x53,0x74,0x61,0x74,0x69,0x63,
-0x54,0x6f,0x70,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,
-0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,
-0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,
-0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,
-0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,
-0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,
-0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x44,0x69,0x6d,0x20,
-0x77,0x69,0x64,0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x76,
-0x73,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x5f,0x5f,0x22,0x20,0x64,0x69,0x6d,
-0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,
-0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,
-0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,
-0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,
-0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,
-0x6d,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,
-0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x44,
-0x69,0x6d,0x20,0x77,0x69,0x64,0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,
-0x6f,0x5f,0x68,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x5f,0x5f,0x22,0x20,
-0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,
-0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,
-0x61,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4e,0x6f,0x46,0x72,0x61,0x6d,0x65,0x54,
-0x65,0x78,0x74,0x52,0x65,0x6e,0x64,0x65,0x72,0x41,0x72,0x65,0x61,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,
-0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,
-0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,
-0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,
-0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,
-0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,
-0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,
-0x67,0x65,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,
-0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x55,0x6e,
-0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,
-0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,
-0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4e,0x61,0x6d,0x65,
-0x64,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,
-0x4e,0x6f,0x46,0x72,0x61,0x6d,0x65,0x54,0x65,0x78,0x74,0x52,0x65,0x6e,0x64,0x65,
-0x72,0x41,0x72,0x65,0x61,0x48,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,
-0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,
-0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,
-0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,
-0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,
-0x65,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,
-0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,
-0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,
-0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,
-0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,
-0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,
-0x74,0x44,0x69,0x6d,0x20,0x77,0x69,0x64,0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,
-0x75,0x74,0x6f,0x5f,0x68,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x5f,0x5f,
-0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,
-0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4e,0x61,0x6d,0x65,0x64,0x41,
-0x72,0x65,0x61,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4e,0x6f,0x46,0x72,0x61,0x6d,
-0x65,0x54,0x65,0x78,0x74,0x52,0x65,0x6e,0x64,0x65,0x72,0x41,0x72,0x65,0x61,0x56,
-0x53,0x63,0x72,0x6f,0x6c,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,
-0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,
-0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,
-0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,
-0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,
-0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,
-0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,
-0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,
-0x65,0x74,0x44,0x69,0x6d,0x20,0x77,0x69,0x64,0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,
-0x61,0x75,0x74,0x6f,0x5f,0x76,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x5f,
-0x5f,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,
-0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,
-0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,
-0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,
-0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,
-0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4e,
-0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x20,0x6e,0x61,0x6d,
-0x65,0x3d,0x22,0x4e,0x6f,0x46,0x72,0x61,0x6d,0x65,0x54,0x65,0x78,0x74,0x52,0x65,
-0x6e,0x64,0x65,0x72,0x41,0x72,0x65,0x61,0x48,0x56,0x53,0x63,0x72,0x6f,0x6c,0x6c,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,
-0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,
-0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,
-0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,
-0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,
-0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,
-0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,
-0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,
-0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,
-0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x44,0x69,0x6d,0x20,
-0x77,0x69,0x64,0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x76,
-0x73,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x5f,0x5f,0x22,0x20,0x64,0x69,0x6d,
-0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,
-0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,
-0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,
-0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,
-0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,
-0x6d,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,
-0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x44,
-0x69,0x6d,0x20,0x77,0x69,0x64,0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,
-0x6f,0x5f,0x68,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x5f,0x5f,0x22,0x20,
-0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,
-0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x68,0x69,0x6c,0x64,0x20,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x2f,0x48,0x6f,0x72,0x69,0x7a,0x6f,0x6e,0x74,0x61,0x6c,0x53,0x63,0x72,0x6f,0x6c,
-0x6c,0x62,0x61,0x72,0x22,0x20,0x6e,0x61,0x6d,0x65,0x53,0x75,0x66,0x66,0x69,0x78,
-0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x68,0x73,0x63,0x72,0x6f,0x6c,0x6c,
-0x62,0x61,0x72,0x5f,0x5f,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,
-0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,
-0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,
-0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,
-0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,
-0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x6f,
-0x66,0x66,0x73,0x65,0x74,0x3d,0x22,0x2d,0x31,0x32,0x22,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,
-0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,
-0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x31,0x32,0x22,0x20,0x2f,0x3e,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x41,0x6c,0x69,0x67,
-0x6e,0x6d,0x65,0x6e,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,
-0x6f,0x6d,0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x43,0x68,0x69,0x6c,0x64,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x68,0x69,0x6c,0x64,0x20,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x2f,0x56,0x65,0x72,0x74,0x69,0x63,0x61,0x6c,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x62,
-0x61,0x72,0x22,0x20,0x6e,0x61,0x6d,0x65,0x53,0x75,0x66,0x66,0x69,0x78,0x3d,0x22,
-0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x76,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,
-0x72,0x5f,0x5f,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,
-0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,
-0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,
-0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,
-0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,
-0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,
-0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x31,0x32,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,
-0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,
-0x22,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x3d,0x22,0x2d,0x31,0x32,0x22,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x41,0x6c,0x69,0x67,0x6e,
-0x6d,0x65,0x6e,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,
-0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x43,0x68,0x69,0x6c,0x64,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,
-0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,
-0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,
-0x22,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,
-0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x45,0x6e,0x61,0x62,0x6c,0x65,
-0x64,0x46,0x72,0x61,0x6d,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x20,0x6c,0x6f,0x6f,0x6b,0x3d,0x22,0x54,0x61,0x68,0x61,
-0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x53,0x74,0x61,0x74,0x69,0x63,0x53,0x68,
-0x61,0x72,0x65,0x64,0x22,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x66,
-0x72,0x61,0x6d,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,
-0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,
-0x3d,0x22,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x46,0x72,0x61,0x6d,0x65,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,
-0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6c,
-0x6f,0x6f,0x6b,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x2f,0x53,0x74,0x61,0x74,0x69,0x63,0x53,0x68,0x61,0x72,0x65,0x64,0x22,0x20,0x73,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x66,0x72,0x61,0x6d,0x65,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x57,0x69,0x74,0x68,0x46,
-0x72,0x61,0x6d,0x65,0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,0x42,0x61,0x63,0x6b,0x67,
-0x72,0x6f,0x75,0x6e,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x20,0x6c,0x6f,0x6f,0x6b,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x53,0x74,0x61,0x74,0x69,0x63,0x53,0x68,0x61,
-0x72,0x65,0x64,0x22,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x62,0x61,
-0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,
-0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x57,0x69,0x74,0x68,0x46,0x72,0x61,0x6d,0x65,0x44,
-0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x42,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,
-0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,
-0x20,0x6c,0x6f,0x6f,0x6b,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x2f,0x53,0x74,0x61,0x74,0x69,0x63,0x53,0x68,0x61,0x72,0x65,0x64,0x22,
-0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x62,0x61,0x63,0x6b,0x67,0x72,
-0x6f,0x75,0x6e,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,
-0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,
-0x3d,0x22,0x4e,0x6f,0x46,0x72,0x61,0x6d,0x65,0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,
-0x42,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6c,0x6f,0x6f,0x6b,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x53,0x74,0x61,0x74,
-0x69,0x63,0x53,0x68,0x61,0x72,0x65,0x64,0x22,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x3d,0x22,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x5f,0x6e,0x6f,
-0x66,0x72,0x61,0x6d,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,
-0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,
-0x65,0x3d,0x22,0x4e,0x6f,0x46,0x72,0x61,0x6d,0x65,0x44,0x69,0x73,0x61,0x62,0x6c,
-0x65,0x64,0x42,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,
-0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6c,0x6f,0x6f,0x6b,
-0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x53,0x74,
-0x61,0x74,0x69,0x63,0x53,0x68,0x61,0x72,0x65,0x64,0x22,0x20,0x73,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x3d,0x22,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x5f,
-0x6e,0x6f,0x66,0x72,0x61,0x6d,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x57,
-0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x3e,0x0a,0x0a,0x20,0x20,0x20,0x20,
-0x3c,0x21,0x2d,0x2d,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x2f,0x4c,0x69,0x73,0x74,0x48,0x65,0x61,0x64,0x65,0x72,0x53,0x65,0x67,0x6d,0x65,
-0x6e,0x74,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x2d,
-0x2d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,
-0x6f,0x6b,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x2f,0x4c,0x69,0x73,0x74,0x48,0x65,0x61,0x64,0x65,0x72,0x53,
-0x65,0x67,0x6d,0x65,0x6e,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,
-0x22,0x53,0x69,0x7a,0x69,0x6e,0x67,0x43,0x75,0x72,0x73,0x6f,0x72,0x49,0x6d,0x61,
-0x67,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x73,0x65,0x74,0x3a,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3a,0x4d,0x6f,0x75,0x73,0x65,0x45,0x73,0x57,0x65,0x43,0x75,0x72,0x73,0x6f,0x72,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,
-0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4d,0x6f,0x76,
-0x69,0x6e,0x67,0x43,0x75,0x72,0x73,0x6f,0x72,0x49,0x6d,0x61,0x67,0x65,0x22,0x20,
-0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x73,0x65,0x74,0x3a,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x20,0x69,0x6d,0x61,0x67,0x65,0x3a,0x4d,0x6f,0x75,
-0x73,0x65,0x4d,0x6f,0x76,0x65,0x43,0x75,0x72,0x73,0x6f,0x72,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,
-0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x73,
-0x65,0x67,0x6d,0x65,0x6e,0x74,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,
-0x6f,0x75,0x72,0x73,0x20,0x74,0x6f,0x70,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,
-0x44,0x44,0x44,0x44,0x44,0x44,0x22,0x20,0x74,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,
-0x3d,0x22,0x46,0x46,0x44,0x44,0x44,0x44,0x44,0x44,0x22,0x20,0x62,0x6f,0x74,0x74,
-0x6f,0x6d,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x44,0x44,0x44,0x44,0x44,0x44,
-0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,
-0x46,0x44,0x44,0x44,0x44,0x44,0x44,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,
-0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,
-0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,
-0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,
-0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,
-0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,
-0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,
-0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,
-0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,
-0x22,0x48,0x65,0x61,0x64,0x65,0x72,0x42,0x61,0x72,0x53,0x70,0x6c,0x69,0x74,0x74,
-0x65,0x72,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,
-0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,
-0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,
-0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,
-0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,
-0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x48,0x65,0x61,
-0x64,0x65,0x72,0x42,0x61,0x72,0x42,0x61,0x63,0x6b,0x64,0x72,0x6f,0x70,0x4e,0x6f,
-0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x46,0x6f,
-0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,0x74,
-0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,0x6f,
-0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,0x74,
-0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,
-0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,
-0x22,0x73,0x65,0x67,0x6d,0x65,0x6e,0x74,0x5f,0x68,0x6f,0x76,0x65,0x72,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,
-0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,
-0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,
-0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,
-0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,
-0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,
-0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,
-0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,
-0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,
-0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x3d,0x22,0x48,0x65,0x61,0x64,0x65,0x72,0x42,0x61,0x72,0x53,
-0x70,0x6c,0x69,0x74,0x74,0x65,0x72,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x64,
-0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,
-0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,
-0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3d,0x22,0x48,0x65,0x61,0x64,0x65,0x72,0x42,0x61,0x72,0x42,0x61,0x63,0x6b,0x64,
-0x72,0x6f,0x70,0x48,0x6f,0x76,0x65,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,
-0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,
-0x74,0x72,0x65,0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,
-0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,
-0x74,0x72,0x65,0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,
-0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x73,0x70,0x6c,0x69,0x74,0x74,0x65,0x72,0x5f,0x6e,0x6f,
-0x72,0x6d,0x61,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,
-0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,
-0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,
-0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,
-0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,
-0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,
-0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,
-0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,
-0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x3d,0x22,0x48,0x65,0x61,0x64,0x65,0x72,0x42,0x61,0x72,0x53,0x70,
-0x6c,0x69,0x74,0x74,0x65,0x72,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x56,0x65,0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x53,0x74,0x72,0x65,0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,
-0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,
-0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x73,0x70,0x6c,0x69,
-0x74,0x74,0x65,0x72,0x5f,0x68,0x6f,0x76,0x65,0x72,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,
-0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,
-0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,
-0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,
-0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,
-0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,
-0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,
-0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,
-0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,
-0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,
-0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,
-0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,
-0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x48,0x65,0x61,0x64,0x65,
-0x72,0x42,0x61,0x72,0x53,0x70,0x6c,0x69,0x74,0x74,0x65,0x72,0x48,0x6f,0x76,0x65,
-0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,
-0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,0x74,0x63,0x68,0x65,
-0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,
-0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x41,0x6c,0x69,
-0x67,0x6e,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,
-0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,
-0x22,0x61,0x73,0x63,0x65,0x6e,0x64,0x5f,0x69,0x63,0x6f,0x6e,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,
-0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,
-0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,
-0x65,0x3d,0x22,0x33,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,
-0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,
-0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x33,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,
-0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x48,0x65,0x61,0x64,0x65,0x72,0x42,0x61,0x72,
-0x53,0x6f,0x72,0x74,0x55,0x70,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,
-0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x3d,0x22,0x48,0x65,0x61,0x64,0x65,0x72,0x42,0x61,0x72,0x53,0x6f,0x72,0x74,
-0x55,0x70,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,
-0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x48,0x65,0x61,
-0x64,0x65,0x72,0x42,0x61,0x72,0x53,0x6f,0x72,0x74,0x55,0x70,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,
-0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x64,0x65,0x73,0x63,0x65,0x6e,0x64,
-0x5f,0x69,0x63,0x6f,0x6e,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,
-0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,
-0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,
-0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x33,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,
-0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,
-0x6c,0x75,0x65,0x3d,0x22,0x33,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,
-0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,
-0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,
-0x48,0x65,0x61,0x64,0x65,0x72,0x42,0x61,0x72,0x53,0x6f,0x72,0x74,0x44,0x6f,0x77,
-0x6e,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,
-0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,
-0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x48,0x65,
-0x61,0x64,0x65,0x72,0x42,0x61,0x72,0x53,0x6f,0x72,0x74,0x44,0x6f,0x77,0x6e,0x22,
-0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,
-0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,
-0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,
-0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x48,0x65,0x61,0x64,0x65,0x72,
-0x42,0x61,0x72,0x53,0x6f,0x72,0x74,0x44,0x6f,0x77,0x6e,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,
-0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,
-0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x54,0x65,0x78,
-0x74,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,
-0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x48,0x65,
-0x61,0x64,0x65,0x72,0x42,0x61,0x72,0x53,0x6f,0x72,0x74,0x55,0x70,0x22,0x20,0x64,
-0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x41,
-0x64,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,
-0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x35,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,
-0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,
-0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,
-0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x55,0x6e,
-0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,
-0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,
-0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,
-0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,
-0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x46,
-0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x43,0x65,0x6e,0x74,
-0x72,0x65,0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x54,0x65,0x78,0x74,
-0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,
-0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,
-0x22,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,
-0x73,0x65,0x67,0x6d,0x65,0x6e,0x74,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x3d,0x22,0x73,0x70,0x6c,0x69,0x74,0x74,0x65,0x72,0x5f,0x6e,0x6f,
-0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x48,0x6f,
-0x76,0x65,0x72,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x73,0x65,0x67,0x6d,
-0x65,0x6e,0x74,0x5f,0x68,0x6f,0x76,0x65,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,
-0x73,0x70,0x6c,0x69,0x74,0x74,0x65,0x72,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,
-0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,
-0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,
-0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x53,0x70,0x6c,0x69,0x74,0x74,0x65,
-0x72,0x48,0x6f,0x76,0x65,0x72,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x73,
-0x65,0x67,0x6d,0x65,0x6e,0x74,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x3d,0x22,0x73,0x70,0x6c,0x69,0x74,0x74,0x65,0x72,0x5f,0x68,0x6f,0x76,
-0x65,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,
-0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,
-0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x72,0x61,0x67,
-0x47,0x68,0x6f,0x73,0x74,0x22,0x20,0x63,0x6c,0x69,0x70,0x70,0x65,0x64,0x3d,0x22,
-0x66,0x61,0x6c,0x73,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x20,0x70,0x72,0x69,0x6f,
-0x72,0x69,0x74,0x79,0x3d,0x22,0x31,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x73,0x65,0x67,
-0x6d,0x65,0x6e,0x74,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x20,0x74,0x6f,0x70,0x4c,0x65,
-0x66,0x74,0x3d,0x22,0x39,0x30,0x46,0x46,0x46,0x46,0x46,0x46,0x22,0x20,0x74,0x6f,
-0x70,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x39,0x30,0x46,0x46,0x46,0x46,0x46,0x46,
-0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x3d,0x22,0x39,0x30,
-0x46,0x46,0x46,0x46,0x46,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,
-0x67,0x68,0x74,0x3d,0x22,0x39,0x30,0x46,0x46,0x46,0x46,0x46,0x46,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x73,
-0x70,0x6c,0x69,0x74,0x74,0x65,0x72,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x20,0x74,0x6f,
-0x70,0x4c,0x65,0x66,0x74,0x3d,0x22,0x39,0x30,0x46,0x46,0x46,0x46,0x46,0x46,0x22,
-0x20,0x74,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x39,0x30,0x46,0x46,0x46,
-0x46,0x46,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x3d,
-0x22,0x39,0x30,0x46,0x46,0x46,0x46,0x46,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,
-0x6d,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x39,0x30,0x46,0x46,0x46,0x46,0x46,0x46,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,
-0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,
-0x6f,0x6c,0x6f,0x75,0x72,0x73,0x20,0x74,0x6f,0x70,0x4c,0x65,0x66,0x74,0x3d,0x22,
-0x39,0x30,0x46,0x46,0x46,0x46,0x46,0x46,0x22,0x20,0x74,0x6f,0x70,0x52,0x69,0x67,
-0x68,0x74,0x3d,0x22,0x39,0x30,0x46,0x46,0x46,0x46,0x46,0x46,0x22,0x20,0x62,0x6f,
-0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x3d,0x22,0x39,0x30,0x46,0x46,0x46,0x46,
-0x46,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x3d,
-0x22,0x39,0x30,0x46,0x46,0x46,0x46,0x46,0x46,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,
-0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,
-0x3d,0x22,0x41,0x73,0x63,0x65,0x6e,0x64,0x69,0x6e,0x67,0x53,0x6f,0x72,0x74,0x49,
-0x63,0x6f,0x6e,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x61,0x73,0x63,0x65,
-0x6e,0x64,0x5f,0x69,0x63,0x6f,0x6e,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x44,0x65,0x73,0x63,0x65,0x6e,0x64,0x69,0x6e,0x67,0x53,
-0x6f,0x72,0x74,0x49,0x63,0x6f,0x6e,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,
-0x64,0x65,0x73,0x63,0x65,0x6e,0x64,0x5f,0x69,0x63,0x6f,0x6e,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,
-0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,
-0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x47,0x68,0x6f,0x73,0x74,0x41,
-0x73,0x63,0x65,0x6e,0x64,0x69,0x6e,0x67,0x53,0x6f,0x72,0x74,0x49,0x63,0x6f,0x6e,
-0x22,0x20,0x63,0x6c,0x69,0x70,0x70,0x65,0x64,0x3d,0x22,0x66,0x61,0x6c,0x73,0x65,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x4c,0x61,0x79,0x65,0x72,0x20,0x70,0x72,0x69,0x6f,0x72,0x69,0x74,0x79,0x3d,0x22,
-0x31,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x61,0x73,0x63,0x65,0x6e,0x64,0x5f,0x69,0x63,
-0x6f,0x6e,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,
-0x73,0x20,0x74,0x6f,0x70,0x4c,0x65,0x66,0x74,0x3d,0x22,0x39,0x30,0x46,0x46,0x46,
-0x46,0x46,0x46,0x22,0x20,0x74,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x39,
-0x30,0x46,0x46,0x46,0x46,0x46,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x4c,
-0x65,0x66,0x74,0x3d,0x22,0x39,0x30,0x46,0x46,0x46,0x46,0x46,0x46,0x22,0x20,0x62,
-0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x39,0x30,0x46,0x46,
-0x46,0x46,0x46,0x46,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x47,0x68,0x6f,
-0x73,0x74,0x44,0x65,0x73,0x63,0x65,0x6e,0x64,0x69,0x6e,0x67,0x53,0x6f,0x72,0x74,
-0x49,0x63,0x6f,0x6e,0x22,0x20,0x63,0x6c,0x69,0x70,0x70,0x65,0x64,0x3d,0x22,0x66,
-0x61,0x6c,0x73,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x20,0x70,0x72,0x69,0x6f,0x72,0x69,
-0x74,0x79,0x3d,0x22,0x31,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x64,0x65,0x73,0x63,0x65,
-0x6e,0x64,0x5f,0x69,0x63,0x6f,0x6e,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,
-0x6f,0x6c,0x6f,0x75,0x72,0x73,0x20,0x74,0x6f,0x70,0x4c,0x65,0x66,0x74,0x3d,0x22,
-0x39,0x30,0x46,0x46,0x46,0x46,0x46,0x46,0x22,0x20,0x74,0x6f,0x70,0x52,0x69,0x67,
-0x68,0x74,0x3d,0x22,0x39,0x30,0x46,0x46,0x46,0x46,0x46,0x46,0x22,0x20,0x62,0x6f,
-0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x3d,0x22,0x39,0x30,0x46,0x46,0x46,0x46,
-0x46,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x3d,
-0x22,0x39,0x30,0x46,0x46,0x46,0x46,0x46,0x46,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,
-0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,
-0x3d,0x22,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x3d,0x22,0x73,0x65,0x67,0x6d,0x65,0x6e,0x74,0x5f,0x6e,0x6f,0x72,0x6d,0x61,
-0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,
-0x20,0x74,0x6f,0x70,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,
-0x37,0x46,0x22,0x20,0x74,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,
-0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,
-0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,
-0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,
-0x46,0x37,0x46,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x3d,0x22,0x73,0x70,0x6c,0x69,0x74,0x74,0x65,0x72,0x5f,0x6e,0x6f,
-0x72,0x6d,0x61,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,
-0x75,0x72,0x73,0x20,0x74,0x6f,0x70,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,
-0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x74,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x3d,
-0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,
-0x6d,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,
-0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,
-0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x20,0x74,0x6f,0x70,
-0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,
-0x74,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,
-0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x3d,0x22,
-0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,
-0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,
-0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,
-0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x3e,0x0a,0x0a,0x20,
-0x20,0x20,0x20,0x3c,0x21,0x2d,0x2d,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,
-0x6f,0x6f,0x6b,0x2f,0x4c,0x69,0x73,0x74,0x48,0x65,0x61,0x64,0x65,0x72,0x0a,0x20,
-0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x2d,0x2d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x2f,0x4c,0x69,0x73,0x74,0x48,0x65,0x61,0x64,0x65,0x72,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x53,0x65,0x67,0x6d,0x65,0x6e,0x74,0x57,0x69,0x64,
-0x67,0x65,0x74,0x54,0x79,0x70,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x4c,0x69,0x73,0x74,
-0x48,0x65,0x61,0x64,0x65,0x72,0x53,0x65,0x67,0x6d,0x65,0x6e,0x74,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x45,0x6e,
-0x61,0x62,0x6c,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,
-0x6f,0x6f,0x6b,0x3e,0x0a,0x0a,0x20,0x20,0x20,0x20,0x3c,0x21,0x2d,0x2d,0x0a,0x20,
-0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x4d,0x75,0x6c,0x74,0x69,
-0x43,0x6f,0x6c,0x75,0x6d,0x6e,0x4c,0x69,0x73,0x74,0x0a,0x20,0x20,0x20,0x20,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x2d,0x2d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,
-0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x20,0x6e,0x61,0x6d,0x65,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x4d,0x75,0x6c,
-0x74,0x69,0x43,0x6f,0x6c,0x75,0x6d,0x6e,0x4c,0x69,0x73,0x74,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,
-0x61,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x49,0x74,0x65,0x6d,0x52,0x65,0x6e,0x64,
-0x65,0x72,0x69,0x6e,0x67,0x41,0x72,0x65,0x61,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,
-0x67,0x65,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x75,0x6c,
-0x74,0x69,0x4c,0x69,0x73,0x74,0x4c,0x65,0x66,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,
-0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x57,0x69,0x64,
-0x67,0x65,0x74,0x44,0x69,0x6d,0x20,0x77,0x69,0x64,0x67,0x65,0x74,0x3d,0x22,0x5f,
-0x5f,0x61,0x75,0x74,0x6f,0x5f,0x6c,0x69,0x73,0x74,0x68,0x65,0x61,0x64,0x65,0x72,
-0x5f,0x5f,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x42,
-0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,
-0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,
-0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,
-0x74,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,
-0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,
-0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,
-0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,
-0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,0x73,0x74,0x52,0x69,0x67,0x68,0x74,0x22,0x20,
-0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,
-0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,
-0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,
-0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,
-0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,0x73,0x74,0x42,0x6f,0x74,0x74,
-0x6f,0x6d,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,
-0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,
-0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4e,0x61,0x6d,0x65,
-0x64,0x41,0x72,0x65,0x61,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x49,0x74,0x65,0x6d,
-0x52,0x65,0x6e,0x64,0x65,0x72,0x69,0x6e,0x67,0x41,0x72,0x65,0x61,0x48,0x53,0x63,
-0x72,0x6f,0x6c,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,
-0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,0x73,
-0x74,0x4c,0x65,0x66,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,
-0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,
-0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x44,0x69,
-0x6d,0x20,0x77,0x69,0x64,0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,
-0x5f,0x6c,0x69,0x73,0x74,0x68,0x65,0x61,0x64,0x65,0x72,0x5f,0x5f,0x22,0x20,0x64,
-0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,
-0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,
-0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,
-0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,
-0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,
-0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,
-0x4c,0x69,0x73,0x74,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,
-0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,
-0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,
-0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,
-0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,
-0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,
-0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,
-0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,
-0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x44,0x69,0x6d,
-0x20,0x77,0x69,0x64,0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,
-0x68,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x5f,0x5f,0x22,0x20,0x64,0x69,
-0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,
-0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x49,0x74,0x65,0x6d,0x52,0x65,0x6e,0x64,0x65,0x72,
-0x69,0x6e,0x67,0x41,0x72,0x65,0x61,0x56,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,
-0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,
-0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,0x73,0x74,0x4c,0x65,0x66,0x74,0x22,
-0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,
-0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,
-0x3e,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x44,0x69,0x6d,0x20,0x77,0x69,0x64,0x67,
-0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x6c,0x69,0x73,0x74,0x68,
-0x65,0x61,0x64,0x65,0x72,0x5f,0x5f,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,
-0x6f,0x6e,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,
-0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,
-0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,
-0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,
-0x64,0x67,0x65,0x74,0x44,0x69,0x6d,0x20,0x77,0x69,0x64,0x67,0x65,0x74,0x3d,0x22,
-0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x76,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,
-0x72,0x5f,0x5f,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,
-0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,
-0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,
-0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,
-0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,
-0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,
-0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,0x73,
-0x74,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,
-0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,
-0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,
-0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,
-0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4e,0x61,0x6d,
-0x65,0x64,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x20,0x6e,0x61,0x6d,0x65,0x3d,
-0x22,0x49,0x74,0x65,0x6d,0x52,0x65,0x6e,0x64,0x65,0x72,0x69,0x6e,0x67,0x41,0x72,
-0x65,0x61,0x48,0x56,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,
-0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x75,
-0x6c,0x74,0x69,0x4c,0x69,0x73,0x74,0x4c,0x65,0x66,0x74,0x22,0x20,0x64,0x69,0x6d,
-0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x57,0x69,
-0x64,0x67,0x65,0x74,0x44,0x69,0x6d,0x20,0x77,0x69,0x64,0x67,0x65,0x74,0x3d,0x22,
-0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x6c,0x69,0x73,0x74,0x68,0x65,0x61,0x64,0x65,
-0x72,0x5f,0x5f,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,
-0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,
-0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,
-0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,
-0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,
-0x44,0x69,0x6d,0x20,0x77,0x69,0x64,0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,
-0x74,0x6f,0x5f,0x76,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x5f,0x5f,0x22,
-0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,
-0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,
-0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,
-0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,
-0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,
-0x67,0x65,0x74,0x44,0x69,0x6d,0x20,0x77,0x69,0x64,0x67,0x65,0x74,0x3d,0x22,0x5f,
-0x5f,0x61,0x75,0x74,0x6f,0x5f,0x68,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,
-0x5f,0x5f,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,
-0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,
-0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x68,0x69,0x6c,
-0x64,0x20,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x2f,0x4c,0x69,0x73,0x74,0x48,0x65,0x61,0x64,0x65,0x72,0x22,
-0x20,0x6e,0x61,0x6d,0x65,0x53,0x75,0x66,0x66,0x69,0x78,0x3d,0x22,0x5f,0x5f,0x61,
-0x75,0x74,0x6f,0x5f,0x6c,0x69,0x73,0x74,0x68,0x65,0x61,0x64,0x65,0x72,0x5f,0x5f,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,
-0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,
-0x32,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,
-0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,
-0x6c,0x75,0x65,0x3d,0x22,0x32,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,
-0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,
-0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x6f,0x66,
-0x66,0x73,0x65,0x74,0x3d,0x22,0x2d,0x32,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,
-0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x46,0x6f,
-0x6e,0x74,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x69,0x6e,0x65,
-0x53,0x70,0x61,0x63,0x69,0x6e,0x67,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,
-0x70,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,0x70,0x6c,0x79,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x62,0x73,0x6f,0x6c,
-0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x31,0x2e,
-0x35,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x46,0x6f,0x6e,0x74,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x43,0x68,0x69,0x6c,0x64,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x43,0x68,0x69,0x6c,0x64,0x20,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x48,0x6f,0x72,0x69,0x7a,0x6f,
-0x6e,0x74,0x61,0x6c,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x22,0x20,0x6e,
-0x61,0x6d,0x65,0x53,0x75,0x66,0x66,0x69,0x78,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,
-0x6f,0x5f,0x68,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x5f,0x5f,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,
-0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,
-0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,
-0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,
-0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,
-0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,
-0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,
-0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x3d,0x22,
-0x2d,0x31,0x32,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,
-0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,
-0x65,0x3d,0x22,0x31,0x32,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,
-0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x56,0x65,0x72,0x74,0x41,0x6c,0x69,0x67,0x6e,0x6d,0x65,0x6e,0x74,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x41,0x6c,0x69,0x67,0x6e,
-0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x43,0x68,0x69,0x6c,0x64,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x43,0x68,0x69,0x6c,0x64,0x20,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x56,0x65,0x72,0x74,0x69,0x63,
-0x61,0x6c,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x22,0x20,0x6e,0x61,0x6d,
-0x65,0x53,0x75,0x66,0x66,0x69,0x78,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,
-0x76,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x5f,0x5f,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,
-0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,
-0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x57,0x69,
-0x64,0x67,0x65,0x74,0x44,0x69,0x6d,0x20,0x77,0x69,0x64,0x67,0x65,0x74,0x3d,0x22,
-0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x6c,0x69,0x73,0x74,0x68,0x65,0x61,0x64,0x65,
-0x72,0x5f,0x5f,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,
-0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,
-0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x31,0x32,0x22,0x20,
-0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,
-0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,
-0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x3d,0x22,0x2d,
-0x31,0x32,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,
-0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,
-0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x48,0x6f,0x72,0x7a,0x41,0x6c,0x69,0x67,0x6e,0x6d,0x65,0x6e,0x74,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x43,
-0x68,0x69,0x6c,0x64,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x6d,0x61,0x69,0x6e,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,
-0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,
-0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,
-0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,
-0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,
-0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,
-0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,
-0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,
-0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,
-0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,
-0x6f,0x70,0x4c,0x65,0x66,0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,
-0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x75,0x6c,0x74,
-0x69,0x4c,0x69,0x73,0x74,0x54,0x6f,0x70,0x4c,0x65,0x66,0x74,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,
-0x70,0x52,0x69,0x67,0x68,0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,
-0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x75,0x6c,0x74,
-0x69,0x4c,0x69,0x73,0x74,0x54,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,
-0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,
-0x75,0x6c,0x74,0x69,0x4c,0x69,0x73,0x74,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,
-0x66,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x43,
-0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,0x73,0x74,0x42,0x6f,
-0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,
-0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,0x73,0x74,0x4c,0x65,0x66,0x74,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,
-0x4c,0x69,0x73,0x74,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,
-0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,0x73,0x74,0x54,0x6f,0x70,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,
-0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,0x4c,
-0x69,0x73,0x74,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x61,0x63,0x6b,0x67,
-0x72,0x6f,0x75,0x6e,0x64,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,0x73,0x74,0x42,0x61,
-0x63,0x6b,0x64,0x72,0x6f,0x70,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,
-0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,
-0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x45,
-0x6e,0x61,0x62,0x6c,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6d,
-0x61,0x69,0x6e,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,
-0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,
-0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,
-0x22,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,
-0x3d,0x22,0x6d,0x61,0x69,0x6e,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,
-0x6c,0x6f,0x75,0x72,0x73,0x20,0x74,0x6f,0x70,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,
-0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x74,0x6f,0x70,0x52,0x69,0x67,0x68,
-0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,
-0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,
-0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,
-0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,
-0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x57,0x69,0x64,0x67,0x65,
-0x74,0x4c,0x6f,0x6f,0x6b,0x3e,0x0a,0x0a,0x20,0x20,0x20,0x20,0x3c,0x21,0x2d,0x2d,
-0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x4d,0x75,0x6c,
-0x74,0x69,0x4c,0x69,0x6e,0x65,0x45,0x64,0x69,0x74,0x62,0x6f,0x78,0x0a,0x20,0x20,
-0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x2d,0x2d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,
-0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,0x6e,0x65,0x45,0x64,0x69,0x74,0x62,0x6f,0x78,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,
-0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x54,0x65,0x78,0x74,0x43,
-0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,
-0x6c,0x75,0x65,0x3d,0x22,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x22,0x20,0x72,
-0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,
-0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,
-0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x53,0x65,0x6c,0x65,0x63,0x74,0x65,
-0x64,0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x69,0x6e,0x69,
-0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x46,0x46,0x30,0x30,0x30,
-0x30,0x30,0x30,0x22,0x20,0x72,0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,
-0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,
-0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x41,
-0x63,0x74,0x69,0x76,0x65,0x53,0x65,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x43,0x6f,
-0x6c,0x6f,0x75,0x72,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,
-0x75,0x65,0x3d,0x22,0x46,0x46,0x36,0x30,0x37,0x46,0x46,0x46,0x22,0x20,0x72,0x65,
-0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,
-0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,
-0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,
-0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x49,0x6e,0x61,0x63,0x74,0x69,0x76,0x65,
-0x53,0x65,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,
-0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x46,
-0x46,0x38,0x30,0x38,0x30,0x38,0x30,0x22,0x20,0x72,0x65,0x64,0x72,0x61,0x77,0x4f,
-0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,
-0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4d,0x6f,0x75,0x73,0x65,0x43,0x75,
-0x72,0x73,0x6f,0x72,0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,
-0x3d,0x22,0x73,0x65,0x74,0x3a,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,
-0x6b,0x20,0x69,0x6d,0x61,0x67,0x65,0x3a,0x4d,0x6f,0x75,0x73,0x65,0x54,0x65,0x78,
-0x74,0x42,0x61,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,
-0x22,0x53,0x65,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x42,0x72,0x75,0x73,0x68,0x49,
-0x6d,0x61,0x67,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x73,0x65,0x74,
-0x3a,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x3a,0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,0x6e,0x65,0x45,0x64,0x69,0x74,
-0x62,0x6f,0x78,0x53,0x65,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x42,0x72,0x75,0x73,
-0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4e,
-0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,
-0x65,0x78,0x74,0x41,0x72,0x65,0x61,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,
-0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,
-0x4c,0x69,0x6e,0x65,0x45,0x64,0x69,0x74,0x62,0x6f,0x78,0x4c,0x65,0x66,0x74,0x22,
-0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,
-0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,
-0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,
-0x6e,0x65,0x45,0x64,0x69,0x74,0x62,0x6f,0x78,0x54,0x6f,0x70,0x22,0x20,0x64,0x69,
-0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,
-0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,
-0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,
-0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,0x6e,0x65,0x45,
-0x64,0x69,0x74,0x62,0x6f,0x78,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x64,0x69,0x6d,
-0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,
-0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,
-0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,
-0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,
-0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,
-0x6d,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,
-0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,
-0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,
-0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,
-0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,0x6e,0x65,0x45,0x64,0x69,0x74,0x62,0x6f,0x78,
-0x42,0x6f,0x74,0x74,0x6f,0x6d,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,
-0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,
-0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,
-0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4e,0x61,0x6d,0x65,
-0x64,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,
-0x54,0x65,0x78,0x74,0x41,0x72,0x65,0x61,0x48,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,
-0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,0x6e,0x65,0x45,0x64,0x69,0x74,
-0x62,0x6f,0x78,0x4c,0x65,0x66,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,
-0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,
-0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,
-0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,
-0x22,0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,0x6e,0x65,0x45,0x64,0x69,0x74,0x62,0x6f,
-0x78,0x54,0x6f,0x70,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,
-0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,
-0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,
-0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,
-0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,
-0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,
-0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x75,
-0x6c,0x74,0x69,0x4c,0x69,0x6e,0x65,0x45,0x64,0x69,0x74,0x62,0x6f,0x78,0x52,0x69,
-0x67,0x68,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,
-0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,
-0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,
-0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,
-0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,
-0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x44,0x69,0x6d,0x20,0x77,0x69,0x64,0x67,0x65,
-0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x68,0x73,0x63,0x72,0x6f,0x6c,
-0x6c,0x62,0x61,0x72,0x5f,0x5f,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,
-0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,
-0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,
-0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4e,0x61,0x6d,0x65,
-0x64,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,
-0x54,0x65,0x78,0x74,0x41,0x72,0x65,0x61,0x56,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,
-0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,0x6e,0x65,0x45,0x64,0x69,0x74,
-0x62,0x6f,0x78,0x4c,0x65,0x66,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,
-0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,
-0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,
-0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,
-0x22,0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,0x6e,0x65,0x45,0x64,0x69,0x74,0x62,0x6f,
-0x78,0x54,0x6f,0x70,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,
-0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,
-0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,
-0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,
-0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,
-0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,
-0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x44,0x69,0x6d,
-0x20,0x77,0x69,0x64,0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,
-0x76,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x5f,0x5f,0x22,0x20,0x64,0x69,
-0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,
-0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,
-0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,
-0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,
-0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,
-0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,
-0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,
-0x22,0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,0x6e,0x65,0x45,0x64,0x69,0x74,0x62,0x6f,
-0x78,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,
-0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,
-0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,
-0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,
-0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4e,0x61,0x6d,
-0x65,0x64,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x20,0x6e,0x61,0x6d,0x65,0x3d,
-0x22,0x54,0x65,0x78,0x74,0x41,0x72,0x65,0x61,0x48,0x56,0x53,0x63,0x72,0x6f,0x6c,
-0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,0x6e,0x65,0x45,0x64,
-0x69,0x74,0x62,0x6f,0x78,0x4c,0x65,0x66,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,
-0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,0x6e,0x65,0x45,0x64,0x69,0x74,
-0x62,0x6f,0x78,0x54,0x6f,0x70,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,
-0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,
-0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,
-0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,
-0x74,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,
-0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x44,
-0x69,0x6d,0x20,0x77,0x69,0x64,0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,
-0x6f,0x5f,0x76,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x5f,0x5f,0x22,0x20,
-0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,
-0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,
-0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,
-0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,
-0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,
-0x65,0x74,0x44,0x69,0x6d,0x20,0x77,0x69,0x64,0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,
-0x61,0x75,0x74,0x6f,0x5f,0x68,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x5f,
-0x5f,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,
-0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x68,0x69,0x6c,0x64,
-0x20,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,
-0x6f,0x6f,0x6b,0x2f,0x48,0x6f,0x72,0x69,0x7a,0x6f,0x6e,0x74,0x61,0x6c,0x53,0x63,
-0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x22,0x20,0x6e,0x61,0x6d,0x65,0x53,0x75,0x66,
-0x66,0x69,0x78,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x68,0x73,0x63,0x72,
-0x6f,0x6c,0x6c,0x62,0x61,0x72,0x5f,0x5f,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,
-0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,
-0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,
-0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,
-0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,
-0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,
-0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,
-0x22,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x3d,0x22,0x2d,0x31,0x32,0x22,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,
-0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x31,0x32,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x41,
-0x6c,0x69,0x67,0x6e,0x6d,0x65,0x6e,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,
-0x6f,0x74,0x74,0x6f,0x6d,0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x43,0x68,0x69,0x6c,0x64,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x68,0x69,0x6c,0x64,
-0x20,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,
-0x6f,0x6f,0x6b,0x2f,0x56,0x65,0x72,0x74,0x69,0x63,0x61,0x6c,0x53,0x63,0x72,0x6f,
-0x6c,0x6c,0x62,0x61,0x72,0x22,0x20,0x6e,0x61,0x6d,0x65,0x53,0x75,0x66,0x66,0x69,
-0x78,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x76,0x73,0x63,0x72,0x6f,0x6c,
-0x6c,0x62,0x61,0x72,0x5f,0x5f,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,
-0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,
-0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,
-0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,
-0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,
-0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x31,0x32,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,
-0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,
-0x3d,0x22,0x31,0x22,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x3d,0x22,0x2d,0x31,0x32,
-0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,
-0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x41,0x6c,
-0x69,0x67,0x6e,0x6d,0x65,0x6e,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,
-0x67,0x68,0x74,0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x43,0x68,0x69,0x6c,0x64,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,
-0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x6d,0x61,
-0x69,0x6e,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,
-0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,
-0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,
-0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,
-0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,
-0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,
-0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,
-0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,
-0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,
-0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x4c,0x65,0x66,0x74,
-0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,
-0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,0x6e,0x65,0x45,
-0x64,0x69,0x74,0x62,0x6f,0x78,0x54,0x6f,0x70,0x4c,0x65,0x66,0x74,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,
-0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x75,0x6c,
-0x74,0x69,0x4c,0x69,0x6e,0x65,0x45,0x64,0x69,0x74,0x62,0x6f,0x78,0x54,0x6f,0x70,
-0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,
-0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,
-0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,0x6e,0x65,
-0x45,0x64,0x69,0x74,0x62,0x6f,0x78,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,
-0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x43,0x6f,
-0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,0x6e,0x65,0x45,0x64,0x69,
-0x74,0x62,0x6f,0x78,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,
-0x6e,0x65,0x45,0x64,0x69,0x74,0x62,0x6f,0x78,0x4c,0x65,0x66,0x74,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,
-0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,
-0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,0x6e,
-0x65,0x45,0x64,0x69,0x74,0x62,0x6f,0x78,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,
-0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,
-0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,0x6e,0x65,0x45,
-0x64,0x69,0x74,0x62,0x6f,0x78,0x54,0x6f,0x70,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,
-0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,0x6e,0x65,0x45,0x64,
-0x69,0x74,0x62,0x6f,0x78,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x61,0x63,
-0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,
-0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,0x6e,0x65,
-0x45,0x64,0x69,0x74,0x62,0x6f,0x78,0x42,0x61,0x63,0x6b,0x64,0x72,0x6f,0x70,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,
-0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x43,0x61,0x72,0x61,0x74,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,
-0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,
-0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,
-0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,
-0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,
-0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x45,0x64,0x69,0x74,0x42,0x6f,
-0x78,0x43,0x61,0x72,0x61,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,
-0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,
-0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,
-0x3d,0x22,0x31,0x2e,0x30,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,
-0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x45,
-0x64,0x69,0x74,0x42,0x6f,0x78,0x43,0x61,0x72,0x61,0x74,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x56,0x65,0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x53,0x74,0x72,0x65,0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x53,0x74,0x72,0x65,0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,
-0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,
-0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,
-0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6d,0x61,0x69,0x6e,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,
-0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,
-0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,
-0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x52,0x65,0x61,0x64,0x4f,0x6e,0x6c,0x79,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,
-0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6d,0x61,0x69,0x6e,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,0x61,0x62,
-0x6c,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6d,0x61,0x69,0x6e,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x20,
-0x74,0x6f,0x70,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,
-0x46,0x22,0x20,0x74,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,
-0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,
-0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,
-0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,
-0x37,0x46,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x3e,
-0x0a,0x0a,0x20,0x20,0x20,0x20,0x3c,0x21,0x2d,0x2d,0x0a,0x20,0x20,0x20,0x20,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x54,0x6f,0x6f,0x6c,0x74,0x69,0x70,0x0a,0x20,
-0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x2d,0x2d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x2f,0x54,0x6f,0x6f,0x6c,0x74,0x69,0x70,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x54,0x65,0x78,0x74,0x41,0x72,0x65,0x61,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,
-0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,
-0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,
-0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,
-0x54,0x6f,0x6f,0x6c,0x74,0x69,0x70,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,
-0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,
-0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,
-0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x6f,0x6f,0x6c,0x74,0x69,0x70,
-0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,
-0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,
-0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,
-0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,
-0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,
-0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,
-0x22,0x54,0x6f,0x6f,0x6c,0x74,0x69,0x70,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,
-0x65,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,
-0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,
-0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,
-0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,
-0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x6f,0x6f,0x6c,0x74,0x69,0x70,0x42,0x6f,0x74,
-0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,
-0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,
-0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,
-0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,
-0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4e,0x61,0x6d,
-0x65,0x64,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x6d,0x61,0x69,0x6e,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x46,0x72,0x61,0x6d,0x65,0x43,
-0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,
-0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,
-0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,
-0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,
-0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,
-0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,
-0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,
-0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,
-0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x54,0x6f,0x70,0x4c,0x65,0x66,0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x6f,
-0x6f,0x6c,0x74,0x69,0x70,0x54,0x6f,0x70,0x4c,0x65,0x66,0x74,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,
-0x70,0x52,0x69,0x67,0x68,0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,
-0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x6f,0x6f,0x6c,
-0x74,0x69,0x70,0x54,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,
-0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x6f,0x6f,
-0x6c,0x74,0x69,0x70,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x42,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x43,0x6f,0x72,0x6e,0x65,
-0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,
-0x22,0x54,0x6f,0x6f,0x6c,0x74,0x69,0x70,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,
-0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x6f,0x6f,
-0x6c,0x74,0x69,0x70,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,
-0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,
-0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x6f,0x6f,0x6c,0x74,0x69,0x70,0x52,0x69,
-0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,
-0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,
-0x54,0x6f,0x6f,0x6c,0x74,0x69,0x70,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,
-0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x6f,0x6f,0x6c,0x74,0x69,
-0x70,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x61,0x63,
-0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,
-0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x6f,0x6f,0x6c,0x74,0x69,0x70,0x4d,0x69,
-0x64,0x64,0x6c,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,
-0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,
-0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x6c,
-0x61,0x62,0x65,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x54,0x65,0x78,0x74,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,
-0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,
-0x65,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,
-0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x6f,0x6f,0x6c,
-0x74,0x69,0x70,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x64,0x69,0x6d,
-0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,
-0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x6f,0x6f,0x6c,0x74,0x69,0x70,
-0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,
-0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,
-0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,
-0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,
-0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,
-0x22,0x54,0x6f,0x6f,0x6c,0x74,0x69,0x70,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,
-0x65,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,
-0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,
-0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,
-0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,
-0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,
-0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3d,0x22,0x54,0x6f,0x6f,0x6c,0x74,0x69,0x70,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,
-0x64,0x67,0x65,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,
-0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,
-0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x20,0x74,0x6f,0x70,0x4c,0x65,0x66,0x74,0x3d,
-0x22,0x46,0x46,0x30,0x30,0x30,0x30,0x30,0x30,0x22,0x20,0x74,0x6f,0x70,0x52,0x69,
-0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x30,0x30,0x30,0x30,0x30,0x30,0x22,0x20,0x62,
-0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x30,0x30,0x30,
-0x30,0x30,0x30,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,
-0x3d,0x22,0x46,0x46,0x30,0x30,0x30,0x30,0x30,0x30,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x56,0x65,0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x43,0x65,0x6e,0x74,0x72,0x65,0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x43,0x65,0x6e,0x74,0x72,0x65,0x41,0x6c,0x69,0x67,0x6e,
-0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x54,0x65,0x78,0x74,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,
-0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,
-0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,
-0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x45,0x6e,0x61,0x62,0x6c,0x65,
-0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,
-0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6d,0x61,0x69,0x6e,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,
-0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,
-0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,
-0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,
-0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6d,0x61,0x69,0x6e,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,
-0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,
-0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x3e,0x0a,0x0a,0x20,0x20,
-0x20,0x20,0x3c,0x21,0x2d,0x2d,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x2f,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x61,0x62,0x6c,0x65,0x50,0x61,0x6e,
-0x65,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x2d,0x2d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,
-0x6b,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,
-0x6f,0x6f,0x6b,0x2f,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x61,0x62,0x6c,0x65,0x50,0x61,
-0x6e,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4e,0x61,
-0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x56,0x69,
-0x65,0x77,0x61,0x62,0x6c,0x65,0x41,0x72,0x65,0x61,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,
-0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,
-0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,
-0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,
-0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,
-0x61,0x6c,0x65,0x3d,0x22,0x31,0x2e,0x30,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,
-0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,
-0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,
-0x2e,0x30,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,
-0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,
-0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4e,0x61,0x6d,
-0x65,0x64,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x20,0x6e,0x61,0x6d,0x65,0x3d,
-0x22,0x56,0x69,0x65,0x77,0x61,0x62,0x6c,0x65,0x41,0x72,0x65,0x61,0x48,0x53,0x63,
-0x72,0x6f,0x6c,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,
-0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,
-0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,
-0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,
-0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,
-0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,
-0x2e,0x30,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,
-0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,
-0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,
-0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,
-0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,
-0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x44,0x69,0x6d,0x20,0x77,
-0x69,0x64,0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x68,0x73,
-0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x5f,0x5f,0x22,0x20,0x64,0x69,0x6d,0x65,
-0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,
-0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,
-0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x56,0x69,0x65,0x77,0x61,0x62,0x6c,0x65,0x41,0x72,0x65,0x61,
-0x56,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,
-0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,
-0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,
-0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,
-0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,
-0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,
-0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,
-0x67,0x65,0x74,0x44,0x69,0x6d,0x20,0x77,0x69,0x64,0x67,0x65,0x74,0x3d,0x22,0x5f,
-0x5f,0x61,0x75,0x74,0x6f,0x5f,0x76,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,
-0x5f,0x5f,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,
-0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,
-0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,
-0x6c,0x65,0x3d,0x22,0x31,0x2e,0x30,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,
-0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x56,0x69,0x65,0x77,0x61,0x62,0x6c,0x65,0x41,0x72,
-0x65,0x61,0x48,0x56,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,
-0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,
-0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,
-0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,
-0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,
-0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,
-0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x57,0x69,0x64,0x67,0x65,0x74,0x44,0x69,0x6d,0x20,0x77,0x69,0x64,0x67,0x65,0x74,
-0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x76,0x73,0x63,0x72,0x6f,0x6c,0x6c,
-0x62,0x61,0x72,0x5f,0x5f,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,
-0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,
-0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,
-0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,
-0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,
-0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,
-0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x44,0x69,0x6d,0x20,0x77,0x69,0x64,
-0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x68,0x73,0x63,0x72,
-0x6f,0x6c,0x6c,0x62,0x61,0x72,0x5f,0x5f,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,
-0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,
-0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,
-0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,
-0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4e,0x61,
-0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x43,0x68,0x69,0x6c,0x64,0x20,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x48,0x6f,0x72,0x69,0x7a,
-0x6f,0x6e,0x74,0x61,0x6c,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x22,0x20,
-0x6e,0x61,0x6d,0x65,0x53,0x75,0x66,0x66,0x69,0x78,0x3d,0x22,0x5f,0x5f,0x61,0x75,
-0x74,0x6f,0x5f,0x68,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x5f,0x5f,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,
-0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,
-0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,
-0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,
-0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,
-0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,
-0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x3d,
-0x22,0x2d,0x31,0x32,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,
-0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,
-0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,
-0x75,0x65,0x3d,0x22,0x31,0x32,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,
-0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x56,0x65,0x72,0x74,0x41,0x6c,0x69,0x67,0x6e,0x6d,0x65,0x6e,0x74,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x41,0x6c,0x69,0x67,
-0x6e,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x43,0x68,0x69,0x6c,0x64,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x43,0x68,0x69,0x6c,0x64,0x20,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x56,0x65,0x72,0x74,0x69,
-0x63,0x61,0x6c,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x22,0x20,0x6e,0x61,
-0x6d,0x65,0x53,0x75,0x66,0x66,0x69,0x78,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,
-0x5f,0x76,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x5f,0x5f,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,
-0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,
-0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,
-0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,
-0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,
-0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,
-0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,
-0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,
-0x6c,0x75,0x65,0x3d,0x22,0x31,0x32,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,
-0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,
-0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x6f,0x66,0x66,0x73,
-0x65,0x74,0x3d,0x22,0x2d,0x31,0x32,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,
-0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,
-0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x48,0x6f,0x72,0x7a,0x41,0x6c,0x69,0x67,0x6e,0x6d,0x65,0x6e,0x74,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x41,0x6c,0x69,0x67,0x6e,0x65,
-0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x43,0x68,0x69,0x6c,0x64,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,
-0x65,0x3d,0x22,0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,0x61,0x62,
-0x6c,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x57,0x69,
-0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x3e,0x0a,0x0a,0x20,0x20,0x20,0x20,0x3c,
-0x21,0x2d,0x2d,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,
-0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x0a,0x20,0x20,0x20,0x20,0x2d,0x2d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x57,
-0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x54,0x61,0x62,0x42,
-0x75,0x74,0x74,0x6f,0x6e,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,
-0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4e,0x6f,0x72,0x6d,0x61,0x6c,
-0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x69,0x6e,0x69,0x74,
-0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x46,0x46,0x43,0x30,0x43,0x30,
-0x43,0x30,0x22,0x20,0x72,0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,
-0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,
-0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x48,0x6f,
-0x76,0x65,0x72,0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x69,
-0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x46,0x46,0x45,
-0x30,0x45,0x30,0x45,0x30,0x22,0x20,0x72,0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,
-0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,
-0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,
-0x22,0x50,0x75,0x73,0x68,0x65,0x64,0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,
-0x72,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,
-0x22,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x22,0x20,0x72,0x65,0x64,0x72,0x61,
-0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,
-0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x53,0x65,0x6c,0x65,0x63,0x74,0x65,0x64,0x54,0x65,0x78,
-0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,
-0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x46,0x46,0x45,0x30,0x45,0x30,0x45,0x30,0x22,
-0x20,0x72,0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,
-0x74,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,
-0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,0x61,0x62,
-0x6c,0x65,0x64,0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x69,
-0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x46,0x46,0x37,
-0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x72,0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,
-0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x6c,0x61,0x62,
-0x65,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x54,0x65,0x78,0x74,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,
-0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,
-0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,
-0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,
-0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,
-0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,
-0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,
-0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,
-0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,
-0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x43,0x65,0x6e,
-0x74,0x72,0x65,0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x43,0x65,0x6e,0x74,0x72,0x65,0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x54,0x65,0x78,0x74,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,
-0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x74,0x6f,0x70,0x5f,0x6e,0x6f,0x72,0x6d,
-0x61,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,
-0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,
-0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,
-0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,
-0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,
-0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,
-0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,
-0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,
-0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,
-0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x4c,0x65,0x66,0x74,
-0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,
-0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x55,
-0x70,0x70,0x65,0x72,0x4c,0x65,0x66,0x74,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x54,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x61,
-0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x55,0x70,0x70,0x65,0x72,0x52,0x69,0x67,0x68,
-0x74,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x4c,
-0x65,0x66,0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,
-0x6f,0x6e,0x4c,0x6f,0x77,0x65,0x72,0x4c,0x65,0x66,0x74,0x4e,0x6f,0x72,0x6d,0x61,
-0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x43,0x6f,
-0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x4c,0x6f,0x77,
-0x65,0x72,0x52,0x69,0x67,0x68,0x74,0x32,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,
-0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,
-0x6e,0x4c,0x65,0x66,0x74,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,
-0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,
-0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x52,
-0x69,0x67,0x68,0x74,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,
-0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x55,0x70,0x70,0x65,
-0x72,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,
-0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x4c,0x6f,0x77,0x65,
-0x72,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x61,0x63,0x6b,0x67,0x72,0x6f,
-0x75,0x6e,0x64,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x4d,0x69,0x64,0x64,
-0x6c,0x65,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x46,0x72,0x61,0x6d,0x65,
-0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,
-0x65,0x3d,0x22,0x62,0x6f,0x74,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x46,0x72,0x61,
-0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,
-0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,
-0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,
-0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,
-0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,
-0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,
-0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,
-0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,
-0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,
-0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,
-0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x4c,0x65,0x66,0x74,0x43,0x6f,0x72,0x6e,0x65,
-0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,
-0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x55,0x70,0x70,0x65,0x72,0x4c,
-0x65,0x66,0x74,0x32,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x52,
-0x69,0x67,0x68,0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,
-0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,
-0x74,0x6f,0x6e,0x55,0x70,0x70,0x65,0x72,0x52,0x69,0x67,0x68,0x74,0x4e,0x6f,0x72,
-0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x43,
-0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x4c,0x6f,
-0x77,0x65,0x72,0x4c,0x65,0x66,0x74,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,
-0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,
-0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,
-0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x4c,0x6f,0x77,0x65,0x72,0x52,0x69,
-0x67,0x68,0x74,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,
-0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x4c,0x65,0x66,0x74,
-0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,
-0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,
-0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x52,0x69,0x67,0x68,0x74,0x4e,
-0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x61,
-0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x55,0x70,0x70,0x65,0x72,0x4e,0x6f,0x72,0x6d,
-0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x61,
-0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x4c,0x6f,0x77,0x65,0x72,0x4e,0x6f,0x72,0x6d,
-0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x42,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x61,
-0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x4d,0x69,0x64,0x64,0x6c,0x65,0x4e,0x6f,0x72,
-0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,
-0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,
-0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x74,0x6f,
-0x70,0x5f,0x68,0x6f,0x76,0x65,0x72,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,
-0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,
-0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,
-0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,
-0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,
-0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,
-0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,
-0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,
-0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,
-0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,
-0x70,0x4c,0x65,0x66,0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,
-0x74,0x74,0x6f,0x6e,0x55,0x70,0x70,0x65,0x72,0x4c,0x65,0x66,0x74,0x4e,0x6f,0x72,
-0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x43,0x6f,0x72,
-0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x55,0x70,0x70,0x65,
-0x72,0x52,0x69,0x67,0x68,0x74,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,
-0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x61,
-0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x4c,0x6f,0x77,0x65,0x72,0x4c,0x65,0x66,0x74,
-0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,
-0x67,0x68,0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,
-0x6f,0x6e,0x4c,0x6f,0x77,0x65,0x72,0x52,0x69,0x67,0x68,0x74,0x32,0x4e,0x6f,0x72,
-0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x61,0x62,
-0x42,0x75,0x74,0x74,0x6f,0x6e,0x4c,0x65,0x66,0x74,0x4e,0x6f,0x72,0x6d,0x61,0x6c,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,
-0x74,0x74,0x6f,0x6e,0x52,0x69,0x67,0x68,0x74,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,
-0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,
-0x6e,0x55,0x70,0x70,0x65,0x72,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,
-0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,
-0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,
-0x6e,0x4c,0x6f,0x77,0x65,0x72,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x61,
-0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,
-0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,
-0x6e,0x4d,0x69,0x64,0x64,0x6c,0x65,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,
-0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x62,0x6f,0x74,0x5f,0x68,0x6f,0x76,0x65,
-0x72,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,
-0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,
-0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,
-0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,
-0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,
-0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,
-0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,
-0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,
-0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x4c,0x65,0x66,0x74,0x43,
-0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x55,0x70,
-0x70,0x65,0x72,0x4c,0x65,0x66,0x74,0x32,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x54,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x61,
-0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x55,0x70,0x70,0x65,0x72,0x52,0x69,0x67,0x68,
-0x74,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x4c,
-0x65,0x66,0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,
-0x6f,0x6e,0x4c,0x6f,0x77,0x65,0x72,0x4c,0x65,0x66,0x74,0x4e,0x6f,0x72,0x6d,0x61,
-0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x43,0x6f,
-0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x4c,0x6f,0x77,
-0x65,0x72,0x52,0x69,0x67,0x68,0x74,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,
-0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,
-0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,
-0x4c,0x65,0x66,0x74,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,
-0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x52,0x69,
-0x67,0x68,0x74,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,
-0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x55,0x70,0x70,0x65,0x72,
-0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,
-0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x4c,0x6f,0x77,0x65,0x72,
-0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,
-0x6e,0x64,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x4d,0x69,0x64,0x64,0x6c,
-0x65,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x46,0x72,0x61,0x6d,0x65,0x43,
-0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,
-0x3d,0x22,0x74,0x6f,0x70,0x5f,0x73,0x65,0x6c,0x65,0x63,0x74,0x65,0x64,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x46,0x72,
-0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,
-0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,
-0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,
-0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,
-0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,
-0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,
-0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,
-0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,
-0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,
-0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,
-0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x4c,0x65,0x66,0x74,0x43,0x6f,0x72,0x6e,
-0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x55,0x70,0x70,0x65,0x72,
-0x4c,0x65,0x66,0x74,0x53,0x65,0x6c,0x65,0x63,0x74,0x65,0x64,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,
-0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x55,0x70,
-0x70,0x65,0x72,0x53,0x65,0x6c,0x65,0x63,0x74,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,
-0x52,0x69,0x67,0x68,0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,
-0x74,0x74,0x6f,0x6e,0x55,0x70,0x70,0x65,0x72,0x52,0x69,0x67,0x68,0x74,0x53,0x65,
-0x6c,0x65,0x63,0x74,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,
-0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,
-0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x4c,0x65,0x66,0x74,0x53,0x65,0x6c,
-0x65,0x63,0x74,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,
-0x64,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,
-0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x4d,0x69,0x64,0x64,0x6c,0x65,
-0x53,0x65,0x6c,0x65,0x63,0x74,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,
-0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x52,0x69,0x67,0x68,
-0x74,0x53,0x65,0x6c,0x65,0x63,0x74,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x46,0x72,0x61,0x6d,
-0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x62,0x6f,0x74,0x5f,0x73,0x65,0x6c,0x65,0x63,0x74,0x65,0x64,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,
-0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,
-0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,
-0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,
-0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,
-0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,
-0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,
-0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,
-0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,
-0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x4c,0x65,0x66,0x74,0x53,0x65,0x6c,0x65,
-0x63,0x74,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,
-0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,
-0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x4d,0x69,0x64,0x64,0x6c,0x65,0x53,
-0x65,0x6c,0x65,0x63,0x74,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,
-0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x52,0x69,0x67,0x68,0x74,
-0x53,0x65,0x6c,0x65,0x63,0x74,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,
-0x4c,0x65,0x66,0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,
-0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,
-0x74,0x6f,0x6e,0x4c,0x6f,0x77,0x65,0x72,0x4c,0x65,0x66,0x74,0x4e,0x6f,0x72,0x6d,
-0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x61,
-0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x4c,0x6f,0x77,0x65,0x72,0x4e,0x6f,0x72,0x6d,
-0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x43,
-0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x4c,0x6f,
-0x77,0x65,0x72,0x52,0x69,0x67,0x68,0x74,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,
-0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,
-0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x6f,0x70,0x4e,0x6f,0x72,0x6d,0x61,0x6c,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,
-0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x74,0x6f,0x70,0x5f,0x6e,0x6f,0x72,
-0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,
-0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x50,0x72,0x6f,
-0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4e,0x6f,0x72,0x6d,
-0x61,0x6c,0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x4e,0x6f,0x72,0x6d,0x61,
-0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,
-0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x62,0x6f,0x74,0x5f,0x6e,0x6f,
-0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x50,0x72,
-0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4e,0x6f,0x72,
-0x6d,0x61,0x6c,0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,
-0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x6f,0x70,0x48,0x6f,0x76,0x65,0x72,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,
-0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x74,0x6f,0x70,0x5f,0x68,0x6f,0x76,0x65,0x72,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x50,0x72,0x6f,0x70,0x65,0x72,
-0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x48,0x6f,0x76,0x65,0x72,0x54,0x65,
-0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,
-0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,
-0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,
-0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x48,0x6f,0x76,0x65,0x72,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,
-0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x3d,0x22,0x62,0x6f,0x74,0x5f,0x68,0x6f,0x76,0x65,0x72,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,
-0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x48,0x6f,0x76,0x65,0x72,0x54,0x65,0x78,0x74,
-0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,
-0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,
-0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,
-0x6f,0x70,0x53,0x65,0x6c,0x65,0x63,0x74,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x3d,0x22,0x74,0x6f,0x70,0x5f,0x73,0x65,0x6c,0x65,0x63,0x74,0x65,0x64,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,
-0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x53,0x65,0x6c,0x65,0x63,0x74,0x65,0x64,
-0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,
-0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,
-0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x53,0x65,0x6c,0x65,0x63,0x74,0x65,
-0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,
-0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x62,0x6f,0x74,0x5f,0x73,0x65,
-0x6c,0x65,0x63,0x74,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6c,0x61,0x62,
-0x65,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,
-0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x53,
-0x65,0x6c,0x65,0x63,0x74,0x65,0x64,0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,
-0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,
-0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,
-0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x6f,0x70,0x50,0x75,0x73,
-0x68,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x74,0x6f,0x70,0x5f,
-0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6c,0x61,0x62,
-0x65,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,
-0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x50,
-0x75,0x73,0x68,0x65,0x64,0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,
-0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,
-0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,
-0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x50,0x75,
-0x73,0x68,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x62,0x6f,0x74,
-0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6c,0x61,
-0x62,0x65,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,
-0x72,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,
-0x50,0x75,0x73,0x68,0x65,0x64,0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,
-0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,
-0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,
-0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x6f,0x70,0x44,0x69,0x73,0x61,
-0x62,0x6c,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x74,0x6f,0x70,
-0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,
-0x6f,0x6c,0x6f,0x75,0x72,0x73,0x20,0x74,0x6f,0x70,0x4c,0x65,0x66,0x74,0x3d,0x22,
-0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x74,0x6f,0x70,0x52,0x69,0x67,
-0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,
-0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,
-0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x3d,
-0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x50,0x72,
-0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,
-0x61,0x62,0x6c,0x65,0x64,0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,
-0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,
-0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,
-0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x44,0x69,
-0x73,0x61,0x62,0x6c,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x62,
-0x6f,0x74,0x5f,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x20,0x74,0x6f,0x70,0x4c,0x65,0x66,0x74,
-0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x74,0x6f,0x70,0x52,
-0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,
-0x62,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,
-0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,
-0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6c,0x61,0x62,
-0x65,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,
-0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,
-0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,
-0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,
-0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x3e,0x0a,
-0x0a,0x20,0x20,0x20,0x20,0x3c,0x21,0x2d,0x2d,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x54,0x61,0x62,0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,
-0x50,0x61,0x6e,0x65,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,
-0x20,0x2d,0x2d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,
-0x4c,0x6f,0x6f,0x6b,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x54,0x61,0x62,0x43,0x6f,0x6e,0x74,0x65,0x6e,
-0x74,0x50,0x61,0x6e,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,
-0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x45,0x6e,0x61,0x62,0x6c,0x65,
-0x54,0x6f,0x70,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,
-0x65,0x3d,0x22,0x30,0x22,0x20,0x72,0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,
-0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x20,0x6c,0x61,0x79,0x6f,0x75,
-0x74,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,
-0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x45,0x6e,0x61,0x62,0x6c,0x65,0x42,0x6f,0x74,0x74,0x6f,
-0x6d,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,
-0x22,0x30,0x22,0x20,0x72,0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,
-0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x20,0x6c,0x61,0x79,0x6f,0x75,0x74,0x4f,
-0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,
-0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x6e,
-0x6f,0x72,0x6d,0x61,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,
-0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,
-0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,
-0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,
-0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,
-0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,
-0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,
-0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,
-0x61,0x62,0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x50,0x61,0x6e,0x65,0x55,0x70,0x70,
-0x65,0x72,0x4c,0x65,0x66,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,
-0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,
-0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,0x70,0x6c,
-0x79,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x69,0x6d,
-0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x45,0x6e,0x61,0x62,0x6c,0x65,0x54,0x6f,0x70,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x4c,0x65,0x66,0x74,0x43,0x6f,0x72,0x6e,0x65,
-0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,
-0x22,0x54,0x61,0x62,0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x50,0x61,0x6e,0x65,0x55,
-0x70,0x70,0x65,0x72,0x4c,0x65,0x66,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,
-0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,
-0x22,0x54,0x61,0x62,0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x50,0x61,0x6e,0x65,0x55,
-0x70,0x70,0x65,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x43,0x6f,
-0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x3d,0x22,0x54,0x61,0x62,0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x50,0x61,
-0x6e,0x65,0x55,0x70,0x70,0x65,0x72,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x46,
-0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x46,0x72,0x61,0x6d,
-0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,
-0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,
-0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,
-0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,
-0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,
-0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x61,0x62,0x43,0x6f,0x6e,0x74,0x65,0x6e,
-0x74,0x50,0x61,0x6e,0x65,0x55,0x70,0x70,0x65,0x72,0x4c,0x65,0x66,0x74,0x22,0x20,
-0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,
-0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,
-0x22,0x4d,0x75,0x6c,0x74,0x69,0x70,0x6c,0x79,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,
-0x70,0x65,0x72,0x74,0x79,0x44,0x69,0x6d,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x45,
-0x6e,0x61,0x62,0x6c,0x65,0x54,0x6f,0x70,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,
-0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,
-0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,
-0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,
-0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,
-0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,
-0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,
-0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x3d,0x22,0x54,0x61,0x62,0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x50,0x61,
-0x6e,0x65,0x4c,0x6f,0x77,0x65,0x72,0x4c,0x65,0x66,0x74,0x22,0x20,0x64,0x69,0x6d,
-0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,
-0x72,0x20,0x6f,0x70,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,0x70,0x6c,0x79,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,
-0x74,0x79,0x44,0x69,0x6d,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x45,0x6e,0x61,0x62,
-0x6c,0x65,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,
-0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,
-0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x3d,0x22,0x54,0x61,0x62,0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x50,
-0x61,0x6e,0x65,0x4c,0x65,0x66,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x61,0x63,0x6b,0x67,0x72,0x6f,
-0x75,0x6e,0x64,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x3d,0x22,0x54,0x61,0x62,0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x50,0x61,0x6e,
-0x65,0x4d,0x69,0x64,0x64,0x6c,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,
-0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3d,0x22,0x54,0x61,0x62,0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x50,0x61,0x6e,0x65,
-0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,
-0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,
-0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,
-0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,
-0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,
-0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,
-0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,
-0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x61,0x62,
-0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x50,0x61,0x6e,0x65,0x4c,0x6f,0x77,0x65,0x72,
-0x4c,0x65,0x66,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,
-0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x4d,
-0x75,0x6c,0x74,0x69,0x70,0x6c,0x79,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x69,0x6d,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x45,0x6e,0x61,0x62,0x6c,0x65,0x42,0x6f,0x74,0x74,0x6f,
-0x6d,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,
-0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,
-0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,
-0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,
-0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,
-0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,
-0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,
-0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x43,0x6f,0x72,0x6e,
-0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3d,0x22,0x54,0x61,0x62,0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x50,0x61,0x6e,0x65,
-0x4c,0x6f,0x77,0x65,0x72,0x4c,0x65,0x66,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,
-0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x3d,0x22,0x54,0x61,0x62,0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x50,
-0x61,0x6e,0x65,0x4c,0x6f,0x77,0x65,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,
-0x52,0x69,0x67,0x68,0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x61,0x62,0x43,0x6f,
-0x6e,0x74,0x65,0x6e,0x74,0x50,0x61,0x6e,0x65,0x4c,0x6f,0x77,0x65,0x72,0x52,0x69,
-0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,
-0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,
-0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x45,0x6e,0x61,0x62,
-0x6c,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6e,0x6f,0x72,0x6d,
-0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,
-0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,
-0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,
-0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,
-0x22,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,
-0x6f,0x6c,0x6f,0x75,0x72,0x73,0x20,0x74,0x6f,0x70,0x4c,0x65,0x66,0x74,0x3d,0x22,
-0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x74,0x6f,0x70,0x52,0x69,0x67,
-0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,
-0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,
-0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x3d,
-0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x57,0x69,0x64,0x67,
-0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x3e,0x0a,0x0a,0x20,0x20,0x20,0x20,0x3c,0x21,0x2d,
-0x2d,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x54,0x61,
-0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x50,0x61,0x6e,0x65,0x0a,0x20,0x20,0x20,0x20,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x2d,0x2d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x20,0x6e,0x61,0x6d,0x65,
-0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x54,0x61,
-0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x50,0x61,0x6e,0x65,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,
-0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,
-0x45,0x6e,0x61,0x62,0x6c,0x65,0x54,0x6f,0x70,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,
-0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x31,0x22,0x20,0x72,0x65,0x64,0x72,
-0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,
-0x20,0x6c,0x61,0x79,0x6f,0x75,0x74,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,
-0x74,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,
-0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x45,0x6e,0x61,0x62,0x6c,
-0x65,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,
-0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x31,0x22,0x20,0x72,0x65,0x64,0x72,0x61,0x77,
-0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x20,0x6c,
-0x61,0x79,0x6f,0x75,0x74,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,
-0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x46,0x72,0x61,0x6d,0x65,
-0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,
-0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,
-0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,
-0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,
-0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,
-0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,
-0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,
-0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x3d,0x22,0x54,0x61,0x62,0x48,0x6f,0x72,0x69,0x7a,0x6f,0x6e,0x74,
-0x61,0x6c,0x46,0x69,0x6c,0x6c,0x65,0x72,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,
-0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,
-0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,
-0x70,0x6c,0x79,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,
-0x69,0x6d,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x45,0x6e,0x61,0x62,0x6c,0x65,0x54,
-0x6f,0x70,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,
-0x65,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x61,0x62,
-0x48,0x6f,0x72,0x69,0x7a,0x6f,0x6e,0x74,0x61,0x6c,0x46,0x69,0x6c,0x6c,0x65,0x72,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,
-0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,
-0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,
-0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x61,0x62,0x48,0x6f,
-0x72,0x69,0x7a,0x6f,0x6e,0x74,0x61,0x6c,0x46,0x69,0x6c,0x6c,0x65,0x72,0x22,0x20,
-0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,
-0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,
-0x22,0x4d,0x75,0x6c,0x74,0x69,0x70,0x6c,0x79,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,
-0x70,0x65,0x72,0x74,0x79,0x44,0x69,0x6d,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x45,
-0x6e,0x61,0x62,0x6c,0x65,0x54,0x6f,0x70,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,
-0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,
-0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,
-0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,
-0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,
-0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,
-0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,
-0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x3d,0x22,0x54,0x61,0x62,0x48,0x6f,0x72,0x69,0x7a,0x6f,0x6e,0x74,0x61,
-0x6c,0x46,0x69,0x6c,0x6c,0x65,0x72,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,
-0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,
-0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,0x70,0x6c,0x79,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x69,
-0x6d,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x45,0x6e,0x61,0x62,0x6c,0x65,0x42,0x6f,
-0x74,0x74,0x6f,0x6d,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,
-0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,
-0x61,0x67,0x65,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,
-0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,
-0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x46,0x72,0x61,0x6d,0x65,0x43,
-0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,
-0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,
-0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,
-0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,
-0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,
-0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,
-0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,
-0x61,0x62,0x48,0x6f,0x72,0x69,0x7a,0x6f,0x6e,0x74,0x61,0x6c,0x46,0x69,0x6c,0x6c,
-0x65,0x72,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,
-0x65,0x69,0x67,0x68,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x4d,0x75,0x6c,
-0x74,0x69,0x70,0x6c,0x79,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x69,0x6d,0x20,0x6e,0x61,0x6d,
-0x65,0x3d,0x22,0x45,0x6e,0x61,0x62,0x6c,0x65,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,
-0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,
-0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,
-0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x55,
-0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,
-0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,
-0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,
-0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x61,0x62,0x48,0x6f,0x72,
-0x69,0x7a,0x6f,0x6e,0x74,0x61,0x6c,0x46,0x69,0x6c,0x6c,0x65,0x72,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,
-0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,
-0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,
-0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,
-0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,0x61,0x62,0x6c,
-0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6e,0x6f,0x72,0x6d,0x61,
-0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,
-0x20,0x74,0x6f,0x70,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,
-0x37,0x46,0x22,0x20,0x74,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,
-0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,
-0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,
-0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,
-0x46,0x37,0x46,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,
-0x3e,0x0a,0x0a,0x20,0x20,0x20,0x20,0x3c,0x21,0x2d,0x2d,0x0a,0x20,0x20,0x20,0x20,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x54,0x61,0x68,0x61,
-0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x54,0x61,0x62,0x43,0x6f,0x6e,0x74,0x72,
-0x6f,0x6c,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x2d,
-0x2d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,
-0x6f,0x6b,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x2f,0x54,0x61,0x62,0x43,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,
-0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,
-0x74,0x6f,0x6e,0x54,0x79,0x70,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x54,0x61,0x62,0x42,
-0x75,0x74,0x74,0x6f,0x6e,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,
-0x3d,0x22,0x54,0x61,0x62,0x54,0x65,0x78,0x74,0x50,0x61,0x64,0x64,0x69,0x6e,0x67,
-0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x7b,0x30,0x2c,0x36,0x7d,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x68,0x69,0x6c,
-0x64,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,
-0x6f,0x6f,0x6b,0x2f,0x54,0x61,0x62,0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x50,0x61,
-0x6e,0x65,0x22,0x20,0x6e,0x61,0x6d,0x65,0x53,0x75,0x66,0x66,0x69,0x78,0x3d,0x22,
-0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x54,0x61,0x62,0x50,0x61,0x6e,0x65,0x5f,0x5f,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x3e,0x3c,0x41,0x62,0x73,0x6f,
-0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,
-0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,
-0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,
-0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,
-0x69,0x6d,0x20,0x77,0x69,0x64,0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,
-0x6f,0x5f,0x54,0x61,0x62,0x50,0x61,0x6e,0x65,0x5f,0x5f,0x22,0x20,0x6e,0x61,0x6d,
-0x65,0x3d,0x22,0x45,0x6e,0x61,0x62,0x6c,0x65,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,
-0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,
-0x70,0x6c,0x79,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x69,0x6d,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x62,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,
-0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x50,0x72,
-0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,
-0x67,0x68,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,
-0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,
-0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x69,0x6d,0x20,0x6e,0x61,0x6d,0x65,
-0x3d,0x22,0x54,0x61,0x62,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,
-0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,
-0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x43,0x68,0x69,0x6c,
-0x64,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x68,0x69,0x6c,
-0x64,0x20,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x2f,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x50,0x61,
-0x6e,0x65,0x22,0x20,0x6e,0x61,0x6d,0x65,0x53,0x75,0x66,0x66,0x69,0x78,0x3d,0x22,
-0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x54,0x61,0x62,0x50,0x61,0x6e,0x65,0x5f,0x5f,
-0x42,0x75,0x74,0x74,0x6f,0x6e,0x73,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,
-0x22,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,
-0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,
-0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,
-0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,
-0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,
-0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x69,0x6d,0x20,0x77,0x69,0x64,0x67,0x65,0x74,
-0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x54,0x61,0x62,0x50,0x61,0x6e,0x65,
-0x5f,0x5f,0x42,0x75,0x74,0x74,0x6f,0x6e,0x73,0x22,0x20,0x6e,0x61,0x6d,0x65,0x3d,
-0x22,0x45,0x6e,0x61,0x62,0x6c,0x65,0x54,0x6f,0x70,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,
-0x72,0x20,0x6f,0x70,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,0x70,0x6c,0x79,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,
-0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,
-0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,
-0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x69,0x6d,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x62,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,
-0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x3e,0x3c,0x50,
-0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x69,0x6d,0x20,0x6e,0x61,0x6d,0x65,0x3d,
-0x22,0x54,0x61,0x62,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x43,0x68,0x69,0x6c,0x64,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x43,0x68,0x69,0x6c,0x64,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x53,0x79,0x73,0x74,0x65,0x6d,0x42,
-0x75,0x74,0x74,0x6f,0x6e,0x22,0x20,0x6e,0x61,0x6d,0x65,0x53,0x75,0x66,0x66,0x69,
-0x78,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x54,0x61,0x62,0x50,0x61,0x6e,
-0x65,0x5f,0x5f,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x4c,0x65,0x66,0x74,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,
-0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,
-0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,
-0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x44,0x69,0x6d,0x20,0x77,0x69,0x64,0x67,
-0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x54,0x61,0x62,0x50,0x61,
-0x6e,0x65,0x5f,0x5f,0x42,0x75,0x74,0x74,0x6f,0x6e,0x73,0x22,0x20,0x64,0x69,0x6d,
-0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x44,0x69,0x6d,0x20,0x77,0x69,0x64,
-0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x54,0x61,0x62,0x50,
-0x61,0x6e,0x65,0x5f,0x5f,0x42,0x75,0x74,0x74,0x6f,0x6e,0x73,0x22,0x20,0x64,0x69,
-0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,
-0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,
-0x70,0x6c,0x79,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,
-0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,
-0x74,0x6f,0x6e,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x4c,0x65,0x66,0x74,0x4e,0x6f,0x72,
-0x6d,0x61,0x6c,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,
-0x57,0x69,0x64,0x74,0x68,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,
-0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x44,0x69,0x76,0x69,0x64,0x65,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x61,
-0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x4c,0x65,0x66,
-0x74,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,
-0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,
-0x65,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x57,0x69,0x64,0x67,0x65,0x74,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x44,0x69,0x6d,0x20,0x77,0x69,0x64,0x67,
-0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x54,0x61,0x62,0x50,0x61,
-0x6e,0x65,0x5f,0x5f,0x42,0x75,0x74,0x74,0x6f,0x6e,0x73,0x22,0x20,0x64,0x69,0x6d,
-0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,
-0x67,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,
-0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x41,0x6c,
-0x77,0x61,0x79,0x73,0x4f,0x6e,0x54,0x6f,0x70,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,
-0x3d,0x22,0x54,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,
-0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x49,0x6d,0x61,
-0x67,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x73,0x65,0x74,0x3a,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3a,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x53,0x63,0x72,0x6f,0x6c,0x6c,
-0x4c,0x65,0x66,0x74,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,
-0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x48,0x6f,0x76,0x65,0x72,
-0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x73,0x65,
-0x74,0x3a,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x3a,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x53,0x63,0x72,
-0x6f,0x6c,0x6c,0x4c,0x65,0x66,0x74,0x48,0x6f,0x76,0x65,0x72,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,
-0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x50,0x75,0x73,
-0x68,0x65,0x64,0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,
-0x22,0x73,0x65,0x74,0x3a,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x3a,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,
-0x53,0x63,0x72,0x6f,0x6c,0x6c,0x4c,0x65,0x66,0x74,0x48,0x6f,0x76,0x65,0x72,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x43,0x68,
-0x69,0x6c,0x64,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x68,
-0x69,0x6c,0x64,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x53,0x79,0x73,0x74,0x65,0x6d,0x42,0x75,0x74,0x74,
-0x6f,0x6e,0x22,0x20,0x6e,0x61,0x6d,0x65,0x53,0x75,0x66,0x66,0x69,0x78,0x3d,0x22,
-0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x54,0x61,0x62,0x50,0x61,0x6e,0x65,0x5f,0x5f,
-0x53,0x63,0x72,0x6f,0x6c,0x6c,0x52,0x69,0x67,0x68,0x74,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,
-0x68,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x44,
-0x69,0x6d,0x20,0x77,0x69,0x64,0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,
-0x6f,0x5f,0x54,0x61,0x62,0x50,0x61,0x6e,0x65,0x5f,0x5f,0x42,0x75,0x74,0x74,0x6f,
-0x6e,0x73,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,
-0x65,0x69,0x67,0x68,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,
-0x22,0x4d,0x75,0x6c,0x74,0x69,0x70,0x6c,0x79,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,
-0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,
-0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,
-0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x52,
-0x69,0x67,0x68,0x74,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x64,0x69,0x6d,0x65,
-0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,
-0x44,0x69,0x76,0x69,0x64,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x3d,0x22,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x53,0x63,
-0x72,0x6f,0x6c,0x6c,0x52,0x69,0x67,0x68,0x74,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,
-0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,
-0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,
-0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,
-0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x57,0x69,0x64,0x67,0x65,
-0x74,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,
-0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,
-0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,
-0x65,0x74,0x44,0x69,0x6d,0x20,0x77,0x69,0x64,0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,
-0x61,0x75,0x74,0x6f,0x5f,0x54,0x61,0x62,0x50,0x61,0x6e,0x65,0x5f,0x5f,0x53,0x63,
-0x72,0x6f,0x6c,0x6c,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,
-0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,
-0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,
-0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,
-0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,
-0x44,0x69,0x6d,0x20,0x77,0x69,0x64,0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,
-0x74,0x6f,0x5f,0x54,0x61,0x62,0x50,0x61,0x6e,0x65,0x5f,0x5f,0x42,0x75,0x74,0x74,
-0x6f,0x6e,0x73,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,
-0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,
-0x69,0x67,0x68,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,
-0x65,0x74,0x44,0x69,0x6d,0x20,0x77,0x69,0x64,0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,
-0x61,0x75,0x74,0x6f,0x5f,0x54,0x61,0x62,0x50,0x61,0x6e,0x65,0x5f,0x5f,0x42,0x75,
-0x74,0x74,0x6f,0x6e,0x73,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,
-0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x41,0x6c,0x77,0x61,0x79,0x73,0x4f,0x6e,0x54,0x6f,0x70,0x22,
-0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x54,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,
-0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4e,0x6f,0x72,
-0x6d,0x61,0x6c,0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,
-0x22,0x73,0x65,0x74,0x3a,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x3a,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,
-0x53,0x63,0x72,0x6f,0x6c,0x6c,0x52,0x69,0x67,0x68,0x74,0x4e,0x6f,0x72,0x6d,0x61,
-0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,
-0x3d,0x22,0x48,0x6f,0x76,0x65,0x72,0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x76,0x61,
-0x6c,0x75,0x65,0x3d,0x22,0x73,0x65,0x74,0x3a,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x20,0x69,0x6d,0x61,0x67,0x65,0x3a,0x54,0x61,0x62,0x42,0x75,
-0x74,0x74,0x6f,0x6e,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x52,0x69,0x67,0x68,0x74,0x48,
-0x6f,0x76,0x65,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x50,0x75,0x73,0x68,0x65,0x64,0x49,0x6d,0x61,0x67,0x65,
-0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x73,0x65,0x74,0x3a,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x20,0x69,0x6d,0x61,0x67,0x65,0x3a,0x54,
-0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x52,0x69,
-0x67,0x68,0x74,0x48,0x6f,0x76,0x65,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x43,0x68,0x69,0x6c,0x64,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,
-0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x45,0x6e,0x61,0x62,0x6c,0x65,
-0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,
-0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,
-0x3d,0x22,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x3e,
-0x0a,0x0a,0x20,0x20,0x20,0x20,0x3c,0x21,0x2d,0x2d,0x0a,0x20,0x20,0x20,0x20,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x4d,0x65,0x6e,0x75,0x49,0x74,0x65,0x6d,0x0a,
-0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x2d,0x2d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,
-0x6b,0x2f,0x4d,0x65,0x6e,0x75,0x49,0x74,0x65,0x6d,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,
-0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4e,
-0x6f,0x72,0x6d,0x61,0x6c,0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,
-0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x46,
-0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x22,0x20,0x72,0x65,0x64,0x72,0x61,0x77,0x4f,
-0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,
-0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,
-0x65,0x3d,0x22,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x54,0x65,0x78,0x74,0x43,
-0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,
-0x6c,0x75,0x65,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x72,
-0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,
-0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,
-0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x48,0x6f,0x76,0x65,0x72,0x43,0x6f,
-0x6c,0x6f,0x75,0x72,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,
-0x75,0x65,0x3d,0x22,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x22,0x20,0x72,0x65,
-0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,
-0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,
-0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,
-0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x50,0x75,0x73,0x68,0x65,0x64,0x43,0x6f,
-0x6c,0x6f,0x75,0x72,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,
-0x75,0x65,0x3d,0x22,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x22,0x20,0x72,0x65,
-0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,
-0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,
-0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,
-0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4f,0x70,0x65,0x6e,0x65,0x64,0x43,0x6f,
-0x6c,0x6f,0x75,0x72,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,
-0x75,0x65,0x3d,0x22,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x22,0x20,0x72,0x65,
-0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,
-0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,
-0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x57,0x61,
-0x6e,0x74,0x73,0x4d,0x75,0x6c,0x74,0x69,0x43,0x6c,0x69,0x63,0x6b,0x45,0x76,0x65,
-0x6e,0x74,0x73,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x46,0x61,0x6c,0x73,
-0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4e,
-0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x43,
-0x6f,0x6e,0x74,0x65,0x6e,0x74,0x53,0x69,0x7a,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,
-0x64,0x67,0x65,0x22,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,
-0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,
-0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,
-0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x46,0x6f,0x6e,0x74,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,
-0x6f,0x72,0x7a,0x45,0x78,0x74,0x65,0x6e,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,
-0x20,0x6f,0x70,0x3d,0x22,0x41,0x64,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,
-0x65,0x6e,0x75,0x4c,0x65,0x66,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,
-0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x41,0x64,0x64,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,
-0x65,0x6e,0x75,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,
-0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,
-0x65,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x46,0x6f,0x6e,0x74,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,
-0x69,0x67,0x68,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x46,0x6f,0x6e,0x74,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x69,0x6e,0x65,0x53,0x70,
-0x61,0x63,0x69,0x6e,0x67,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,
-0x22,0x41,0x64,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x65,0x6e,0x75,0x54,
-0x6f,0x70,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,
-0x65,0x69,0x67,0x68,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,
-0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x41,0x64,0x64,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x65,0x6e,0x75,0x42,
-0x6f,0x74,0x74,0x6f,0x6d,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,
-0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,
-0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,
-0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x46,0x6f,0x6e,0x74,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,
-0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4e,
-0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x20,0x6e,0x61,0x6d,
-0x65,0x3d,0x22,0x48,0x61,0x73,0x50,0x6f,0x70,0x75,0x70,0x43,0x6f,0x6e,0x74,0x65,
-0x6e,0x74,0x53,0x69,0x7a,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,
-0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,
-0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,
-0x64,0x67,0x65,0x22,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,
-0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x57,0x69,0x64,0x74,0x68,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x46,0x6f,0x6e,
-0x74,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x6f,0x72,0x7a,0x45,
-0x78,0x74,0x65,0x6e,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,
-0x22,0x41,0x64,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x65,0x6e,0x75,0x4c,
-0x65,0x66,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,
-0x57,0x69,0x64,0x74,0x68,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,
-0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x41,0x64,0x64,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x65,0x6e,0x75,0x52,
-0x69,0x67,0x68,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,
-0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,
-0x3d,0x22,0x41,0x64,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,
-0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x50,0x6f,0x70,0x75,
-0x70,0x4d,0x65,0x6e,0x75,0x41,0x72,0x72,0x6f,0x77,0x4c,0x65,0x66,0x74,0x22,0x20,
-0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,
-0x6f,0x70,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,0x70,0x6c,0x79,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,
-0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x33,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,
-0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,
-0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,
-0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,
-0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x46,
-0x6f,0x6e,0x74,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x46,0x6f,0x6e,0x74,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x69,0x6e,0x65,0x53,0x70,0x61,0x63,0x69,0x6e,
-0x67,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x41,0x64,0x64,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,
-0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x65,0x6e,0x75,0x54,0x6f,0x70,0x22,0x20,
-0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,
-0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,
-0x20,0x6f,0x70,0x3d,0x22,0x41,0x64,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,
-0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x65,0x6e,0x75,0x42,0x6f,0x74,0x74,0x6f,
-0x6d,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,
-0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,
-0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,
-0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x46,0x6f,0x6e,
-0x74,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4e,0x61,0x6d,0x65,0x64,
-0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x54,0x65,0x78,0x74,0x43,0x6f,0x6d,
-0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,
-0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,
-0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,
-0x22,0x4d,0x65,0x6e,0x75,0x4c,0x65,0x66,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,
-0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,
-0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x65,0x6e,0x75,0x54,0x6f,0x70,0x22,0x20,
-0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,
-0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,
-0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,
-0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,
-0x74,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,
-0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,
-0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x65,0x6e,0x75,0x52,0x69,0x67,0x68,
-0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,
-0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,
-0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,
-0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,
-0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,
-0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3d,0x22,0x4d,0x65,0x6e,0x75,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x22,0x20,0x64,0x69,
-0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x46,0x6f,0x72,
-0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x43,0x65,0x6e,0x74,0x72,0x65,
-0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,
-0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,
-0x66,0x74,0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x54,0x65,0x78,0x74,
-0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,
-0x65,0x3d,0x22,0x66,0x72,0x61,0x6d,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,
-0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,
-0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,
-0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,
-0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,
-0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,
-0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,
-0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,
-0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,
-0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,
-0x6f,0x70,0x4c,0x65,0x66,0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,
-0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x65,0x6e,0x75,
-0x54,0x6f,0x70,0x4c,0x65,0x66,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x52,0x69,0x67,0x68,
-0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,
-0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x65,0x6e,0x75,0x54,0x6f,0x70,0x52,0x69,
-0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x43,
-0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x3d,0x22,0x4d,0x65,0x6e,0x75,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x4c,
-0x65,0x66,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,
-0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,
-0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x65,0x6e,0x75,0x42,0x6f,0x74,0x74,0x6f,0x6d,
-0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,
-0x65,0x6e,0x75,0x4c,0x65,0x66,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,
-0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3d,0x22,0x4d,0x65,0x6e,0x75,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,
-0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x3d,0x22,0x4d,0x65,0x6e,0x75,0x54,0x6f,0x70,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,
-0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,
-0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x65,0x6e,0x75,0x42,0x6f,0x74,0x74,0x6f,
-0x6d,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x42,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4d,0x65,0x6e,
-0x75,0x4d,0x69,0x64,0x64,0x6c,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x46,0x72,0x61,0x6d,0x65,0x43,
-0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,
-0x3d,0x22,0x70,0x6f,0x70,0x75,0x70,0x5f,0x61,0x72,0x72,0x6f,0x77,0x5f,0x72,0x69,
-0x67,0x68,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,
-0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,
-0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,
-0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,
-0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,
-0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,
-0x64,0x74,0x68,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,
-0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,
-0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x3d,0x22,0x50,0x6f,0x70,0x75,0x70,0x4d,0x65,0x6e,0x75,0x41,0x72,0x72,0x6f,
-0x77,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,
-0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,
-0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,
-0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,
-0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,
-0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x50,0x6f,0x70,0x75,0x70,
-0x4d,0x65,0x6e,0x75,0x41,0x72,0x72,0x6f,0x77,0x52,0x69,0x67,0x68,0x74,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x43,0x65,0x6e,0x74,0x72,0x65,0x41,0x6c,0x69,0x67,0x6e,
-0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,
-0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x41,0x6c,
-0x69,0x67,0x6e,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,
-0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,
-0x3d,0x22,0x70,0x6f,0x70,0x75,0x70,0x5f,0x61,0x72,0x72,0x6f,0x77,0x5f,0x6c,0x65,
-0x66,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,
-0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,
-0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,
-0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,
-0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,
-0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,
-0x74,0x68,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,
-0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,
-0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,
-0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3d,0x22,0x50,0x6f,0x70,0x75,0x70,0x4d,0x65,0x6e,0x75,0x41,0x72,0x72,0x6f,0x77,
-0x4c,0x65,0x66,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,
-0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,
-0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,
-0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,
-0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,
-0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,
-0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x50,0x6f,0x70,0x75,0x70,0x4d,0x65,
-0x6e,0x75,0x41,0x72,0x72,0x6f,0x77,0x4c,0x65,0x66,0x74,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x56,0x65,0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x43,0x65,0x6e,0x74,0x72,0x65,0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x41,0x6c,0x69,0x67,0x6e,
-0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,
-0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x45,0x6e,0x61,
-0x62,0x6c,0x65,0x64,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x43,0x6f,0x6c,0x6f,0x75,0x72,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x54,0x65,0x78,0x74,0x43,
-0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x45,0x6e,
-0x61,0x62,0x6c,0x65,0x64,0x48,0x6f,0x76,0x65,0x72,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x3d,0x22,0x66,0x72,0x61,0x6d,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x43,0x6f,0x6c,0x6f,0x75,0x72,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x48,0x6f,0x76,0x65,0x72,0x43,0x6f,0x6c,0x6f,0x75,0x72,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,
-0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,
-0x6f,0x6c,0x6f,0x75,0x72,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x54,0x65,0x78,0x74,0x43,0x6f,
-0x6c,0x6f,0x75,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x45,0x6e,0x61,
-0x62,0x6c,0x65,0x64,0x50,0x75,0x73,0x68,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x3d,0x22,0x66,0x72,0x61,0x6d,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x43,0x6f,0x6c,0x6f,0x75,0x72,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x50,0x75,0x73,0x68,0x65,0x64,0x43,0x6f,0x6c,0x6f,0x75,
-0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x43,0x6f,0x6c,0x6f,0x75,0x72,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x54,0x65,0x78,0x74,0x43,
-0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x45,0x6e,
-0x61,0x62,0x6c,0x65,0x64,0x50,0x6f,0x70,0x75,0x70,0x4f,0x70,0x65,0x6e,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,
-0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x66,0x72,0x61,0x6d,0x65,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x50,0x72,0x6f,0x70,0x65,0x72,
-0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4f,0x70,0x65,0x6e,0x65,0x64,0x43,
-0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x50,0x72,0x6f,0x70,0x65,0x72,
-0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x54,
-0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,
-0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,
-0x3d,0x22,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x4e,0x6f,0x72,0x6d,0x61,0x6c,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,
-0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x50,0x72,0x6f,0x70,
-0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,0x61,0x62,
-0x6c,0x65,0x64,0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,
-0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x48,0x6f,
-0x76,0x65,0x72,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x66,0x72,0x61,0x6d,
-0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,
-0x20,0x74,0x6f,0x70,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,
-0x37,0x46,0x22,0x20,0x74,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,
-0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,
-0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,
-0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,
-0x46,0x37,0x46,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,
-0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x54,
-0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,
-0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,
-0x3d,0x22,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x50,0x75,0x73,0x68,0x65,0x64,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,
-0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x66,0x72,0x61,0x6d,0x65,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x20,0x74,0x6f,
-0x70,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,
-0x20,0x74,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,
-0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x3d,
-0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,
-0x6d,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,
-0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,
-0x6f,0x6c,0x6f,0x75,0x72,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x54,0x65,0x78,0x74,
-0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,
-0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,
-0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,
-0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x50,0x6f,0x70,0x75,0x70,0x4f,0x70,0x65,0x6e,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,
-0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x66,0x72,0x61,0x6d,0x65,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x20,0x74,0x6f,
-0x70,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,
-0x20,0x74,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,
-0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x3d,
-0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,
-0x6d,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,
-0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,
-0x6f,0x6c,0x6f,0x75,0x72,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x54,0x65,0x78,0x74,
-0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,
-0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,
-0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x50,
-0x6f,0x70,0x75,0x70,0x43,0x6c,0x6f,0x73,0x65,0x64,0x49,0x63,0x6f,0x6e,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,
-0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x70,0x6f,0x70,0x75,0x70,0x5f,0x61,0x72,0x72,
-0x6f,0x77,0x5f,0x72,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,
-0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x50,0x6f,0x70,0x75,0x70,0x4f,0x70,0x65,0x6e,0x49,
-0x63,0x6f,0x6e,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x70,0x6f,0x70,0x75,
-0x70,0x5f,0x61,0x72,0x72,0x6f,0x77,0x5f,0x6c,0x65,0x66,0x74,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,
-0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x3e,0x0a,
-0x0a,0x20,0x20,0x20,0x20,0x3c,0x21,0x2d,0x2d,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x50,0x6f,0x70,0x75,0x70,0x4d,0x65,0x6e,0x75,0x0a,
-0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x2d,0x2d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,
-0x6b,0x2f,0x50,0x6f,0x70,0x75,0x70,0x4d,0x65,0x6e,0x75,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,
-0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,
-0x42,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x43,0x6f,0x6c,0x6f,0x75,0x72,
-0x73,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,
-0x22,0x74,0x6c,0x3a,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x20,0x74,0x72,0x3a,
-0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x20,0x62,0x6c,0x3a,0x46,0x46,0x46,0x46,
-0x46,0x46,0x46,0x46,0x20,0x62,0x72,0x3a,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,
-0x22,0x20,0x72,0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,
-0x22,0x74,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,
-0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x42,0x6f,0x72,0x64,
-0x65,0x72,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,
-0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x6c,0x61,0x79,0x6f,0x75,0x74,
-0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4e,0x61,0x6d,0x65,0x64,
-0x41,0x72,0x65,0x61,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x49,0x74,0x65,0x6d,0x52,
-0x65,0x6e,0x64,0x65,0x72,0x41,0x72,0x65,0x61,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,
-0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3d,0x22,0x50,0x6f,0x70,0x75,0x70,0x4d,0x65,0x6e,0x75,0x46,0x72,0x61,0x6d,0x65,
-0x4c,0x65,0x66,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,
-0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,
-0x3d,0x22,0x41,0x64,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x69,0x6d,
-0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x42,0x6f,0x72,0x64,0x65,0x72,0x57,0x69,0x64,
-0x74,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,
-0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x50,0x6f,0x70,0x75,0x70,0x4d,0x65,0x6e,0x75,
-0x46,0x72,0x61,0x6d,0x65,0x54,0x6f,0x70,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,
-0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,
-0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x41,0x64,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,
-0x74,0x79,0x44,0x69,0x6d,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x42,0x6f,0x72,0x64,
-0x65,0x72,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,
-0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,
-0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,
-0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,
-0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x3d,0x22,0x50,0x6f,0x70,0x75,0x70,0x4d,0x65,0x6e,0x75,0x46,
-0x72,0x61,0x6d,0x65,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,
-0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x41,
-0x64,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,
-0x74,0x79,0x44,0x69,0x6d,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x42,0x6f,0x72,0x64,
-0x65,0x72,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,
-0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,
-0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,
-0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,
-0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,
-0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,
-0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,
-0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,
-0x22,0x50,0x6f,0x70,0x75,0x70,0x4d,0x65,0x6e,0x75,0x46,0x72,0x61,0x6d,0x65,0x42,
-0x6f,0x74,0x74,0x6f,0x6d,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,
-0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,
-0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x41,0x64,0x64,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,
-0x69,0x6d,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x42,0x6f,0x72,0x64,0x65,0x72,0x57,
-0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,
-0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,
-0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,
-0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,
-0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4e,0x61,
-0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,
-0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x66,0x72,0x61,0x6d,0x65,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x46,0x72,0x61,0x6d,
-0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,
-0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,
-0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,
-0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,
-0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,
-0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,
-0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,
-0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,
-0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,
-0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,
-0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,
-0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x54,0x6f,0x70,0x4c,0x65,0x66,0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,
-0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,
-0x50,0x6f,0x70,0x75,0x70,0x4d,0x65,0x6e,0x75,0x46,0x72,0x61,0x6d,0x65,0x54,0x6f,
-0x70,0x4c,0x65,0x66,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x43,
-0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x3d,0x22,0x50,0x6f,0x70,0x75,0x70,0x4d,0x65,0x6e,0x75,0x46,0x72,
-0x61,0x6d,0x65,0x54,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,
-0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x50,0x6f,0x70,
-0x75,0x70,0x4d,0x65,0x6e,0x75,0x46,0x72,0x61,0x6d,0x65,0x42,0x6f,0x74,0x74,0x6f,
-0x6d,0x4c,0x65,0x66,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,
-0x68,0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,
-0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x50,0x6f,0x70,0x75,0x70,0x4d,0x65,0x6e,
-0x75,0x46,0x72,0x61,0x6d,0x65,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,
-0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x50,0x6f,0x70,0x75,0x70,
-0x4d,0x65,0x6e,0x75,0x46,0x72,0x61,0x6d,0x65,0x4c,0x65,0x66,0x74,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,
-0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,
-0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x50,0x6f,0x70,0x75,0x70,0x4d,0x65,0x6e,
-0x75,0x46,0x72,0x61,0x6d,0x65,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,
-0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x3d,0x22,0x50,0x6f,0x70,0x75,0x70,0x4d,0x65,0x6e,0x75,0x46,0x72,0x61,
-0x6d,0x65,0x54,0x6f,0x70,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,
-0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,
-0x22,0x50,0x6f,0x70,0x75,0x70,0x4d,0x65,0x6e,0x75,0x46,0x72,0x61,0x6d,0x65,0x42,
-0x6f,0x74,0x74,0x6f,0x6d,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,
-0x64,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,
-0x22,0x50,0x6f,0x70,0x75,0x70,0x4d,0x65,0x6e,0x75,0x4d,0x69,0x64,0x64,0x6c,0x65,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,
-0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,
-0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,
-0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x66,0x72,0x61,0x6d,0x65,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x52,0x65,0x63,0x74,
-0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x42,
-0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,
-0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,
-0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,
-0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,
-0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,
-0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x66,0x72,0x61,0x6d,0x65,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x20,0x74,
-0x6f,0x70,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,
-0x22,0x20,0x74,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,
-0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,
-0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,
-0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,
-0x46,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,
-0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x3e,0x0a,
-0x0a,0x0a,0x20,0x20,0x20,0x20,0x3c,0x21,0x2d,0x2d,0x0a,0x20,0x20,0x20,0x20,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x4d,0x65,0x6e,0x75,0x62,0x61,0x72,0x0a,0x20,
-0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x2d,0x2d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x2f,0x4d,0x65,0x6e,0x75,0x62,0x61,0x72,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,
-0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x42,0x61,0x63,
-0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x22,0x20,
-0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x74,0x6c,
-0x3a,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x20,0x74,0x72,0x3a,0x46,0x46,0x46,
-0x46,0x46,0x46,0x46,0x46,0x20,0x62,0x6c,0x3a,0x46,0x46,0x46,0x46,0x46,0x46,0x46,
-0x46,0x20,0x62,0x72,0x3a,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x22,0x20,0x72,
-0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,
-0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,
-0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x42,0x6f,0x72,0x64,0x65,0x72,0x57,
-0x69,0x64,0x74,0x68,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,
-0x75,0x65,0x3d,0x22,0x35,0x22,0x20,0x6c,0x61,0x79,0x6f,0x75,0x74,0x4f,0x6e,0x57,
-0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,
-0x61,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x49,0x74,0x65,0x6d,0x52,0x65,0x6e,0x64,
-0x65,0x72,0x41,0x72,0x65,0x61,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,
-0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x50,
-0x6f,0x70,0x75,0x70,0x4d,0x65,0x6e,0x75,0x46,0x72,0x61,0x6d,0x65,0x4c,0x65,0x66,
-0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,
-0x64,0x74,0x68,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x41,
-0x64,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x69,0x6d,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x42,0x6f,0x72,0x64,0x65,0x72,0x57,0x69,0x64,0x74,0x68,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,
-0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,
-0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x3d,0x22,0x50,0x6f,0x70,0x75,0x70,0x4d,0x65,0x6e,0x75,0x46,0x72,0x61,
-0x6d,0x65,0x54,0x6f,0x70,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,
-0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,
-0x6f,0x70,0x3d,0x22,0x41,0x64,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,
-0x69,0x6d,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x42,0x6f,0x72,0x64,0x65,0x72,0x57,
-0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,
-0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,
-0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,
-0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x3d,0x22,0x50,0x6f,0x70,0x75,0x70,0x4d,0x65,0x6e,0x75,0x46,0x72,0x61,0x6d,
-0x65,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,
-0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,
-0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x41,0x64,0x64,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,
-0x69,0x6d,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x42,0x6f,0x72,0x64,0x65,0x72,0x57,
-0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,
-0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,
-0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,
-0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,
-0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,
-0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,
-0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,
-0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,
-0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x50,0x6f,
-0x70,0x75,0x70,0x4d,0x65,0x6e,0x75,0x46,0x72,0x61,0x6d,0x65,0x42,0x6f,0x74,0x74,
-0x6f,0x6d,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,
-0x65,0x69,0x67,0x68,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,
-0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x41,0x64,0x64,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x69,0x6d,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x42,0x6f,0x72,0x64,0x65,0x72,0x57,0x69,0x64,0x74,
-0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,
-0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,
-0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,
-0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4e,0x61,0x6d,0x65,0x64,
-0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x66,0x72,0x61,0x6d,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,
-0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,
-0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,
-0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,
-0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,
-0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,
-0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,
-0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,
-0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,
-0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x54,0x6f,0x70,0x4c,0x65,0x66,0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x50,0x6f,0x70,
-0x75,0x70,0x4d,0x65,0x6e,0x75,0x46,0x72,0x61,0x6d,0x65,0x54,0x6f,0x70,0x4c,0x65,
-0x66,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x43,0x6f,0x72,0x6e,
-0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3d,0x22,0x50,0x6f,0x70,0x75,0x70,0x4d,0x65,0x6e,0x75,0x46,0x72,0x61,0x6d,0x65,
-0x54,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,
-0x4c,0x65,0x66,0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,
-0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x50,0x6f,0x70,0x75,0x70,0x4d,
-0x65,0x6e,0x75,0x46,0x72,0x61,0x6d,0x65,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,
-0x66,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x43,
-0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x3d,0x22,0x50,0x6f,0x70,0x75,0x70,0x4d,0x65,0x6e,0x75,0x46,0x72,
-0x61,0x6d,0x65,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,
-0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x50,0x6f,0x70,0x75,0x70,0x4d,0x65,0x6e,
-0x75,0x46,0x72,0x61,0x6d,0x65,0x4c,0x65,0x66,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,
-0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x3d,0x22,0x50,0x6f,0x70,0x75,0x70,0x4d,0x65,0x6e,0x75,0x46,0x72,
-0x61,0x6d,0x65,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,
-0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,
-0x22,0x50,0x6f,0x70,0x75,0x70,0x4d,0x65,0x6e,0x75,0x46,0x72,0x61,0x6d,0x65,0x54,
-0x6f,0x70,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x50,0x6f,
-0x70,0x75,0x70,0x4d,0x65,0x6e,0x75,0x46,0x72,0x61,0x6d,0x65,0x42,0x6f,0x74,0x74,
-0x6f,0x6d,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x42,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x50,0x6f,
-0x70,0x75,0x70,0x4d,0x65,0x6e,0x75,0x4d,0x69,0x64,0x64,0x6c,0x65,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,
-0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,
-0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x3d,0x22,0x66,0x72,0x61,0x6d,0x65,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x52,0x65,0x63,0x74,0x50,0x72,0x6f,
-0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x42,0x61,0x63,0x6b,
-0x67,0x72,0x6f,0x75,0x6e,0x64,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,
-0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,
-0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x66,0x72,0x61,0x6d,0x65,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x20,0x74,0x6f,0x70,0x4c,
-0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x74,
-0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,
-0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,
-0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x52,
-0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,
-0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,
-0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x3e,0x0a,0x0a,0x20,0x20,
-0x20,0x20,0x3c,0x21,0x2d,0x2d,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x2f,0x4c,0x61,0x72,0x67,0x65,0x56,0x65,0x72,0x74,0x69,0x63,0x61,0x6c,
-0x53,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x54,0x68,0x75,0x6d,0x62,0x0a,0x20,
-0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x2d,0x2d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x2f,0x4c,0x61,0x72,0x67,0x65,0x56,0x65,0x72,0x74,0x69,0x63,0x61,0x6c,0x53,0x63,
-0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x54,0x68,0x75,0x6d,0x62,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,
-0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x56,0x65,0x72,0x74,0x46,0x72,0x65,0x65,0x22,
-0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x54,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,
-0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x6e,
-0x6f,0x72,0x6d,0x61,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,
-0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,
-0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,
-0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,
-0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,
-0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,
-0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x2e,0x30,0x22,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,
-0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,
-0x22,0x31,0x2e,0x30,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,
-0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,
-0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,
-0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x56,0x65,0x72,0x74,0x53,0x63,
-0x72,0x6f,0x6c,0x6c,0x54,0x68,0x75,0x6d,0x62,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,0x74,0x63,0x68,0x65,0x64,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,0x74,0x63,0x68,0x65,0x64,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,
-0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,
-0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x68,0x6f,0x76,0x65,
-0x72,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,
-0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,
-0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,
-0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,
-0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,
-0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,
-0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,
-0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x2e,0x30,0x22,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,
-0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x2e,0x30,
-0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,
-0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,
-0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x3d,0x22,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,
-0x54,0x68,0x75,0x6d,0x62,0x48,0x6f,0x76,0x65,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x56,0x65,0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x53,0x74,0x72,0x65,0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x53,0x74,0x72,0x65,0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,
-0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x3d,0x22,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,
-0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,
-0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,
-0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x48,0x6f,0x76,0x65,0x72,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,
-0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x3d,0x22,0x68,0x6f,0x76,0x65,0x72,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,
-0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,
-0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,
-0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x50,0x75,0x73,0x68,0x65,0x64,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,
-0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,
-0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,0x61,
-0x62,0x6c,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6e,0x6f,0x72,
-0x6d,0x61,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,
-0x72,0x73,0x20,0x74,0x6f,0x70,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,
-0x37,0x46,0x37,0x46,0x22,0x20,0x74,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,
-0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,
-0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,
-0x62,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,
-0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,
-0x6f,0x6b,0x3e,0x0a,0x0a,0x20,0x20,0x20,0x20,0x3c,0x21,0x2d,0x2d,0x0a,0x20,0x20,
-0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x4c,0x61,0x72,0x67,0x65,0x56,
-0x65,0x72,0x74,0x69,0x63,0x61,0x6c,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,
-0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x2d,0x2d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,
-0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x2f,0x4c,0x61,0x72,0x67,0x65,0x56,0x65,0x72,0x74,0x69,0x63,0x61,0x6c,
-0x53,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x56,0x65,0x72,0x74,0x69,0x63,0x61,0x6c,0x53,0x63,0x72,0x6f,
-0x6c,0x6c,0x62,0x61,0x72,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x54,0x72,
-0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,
-0x54,0x68,0x75,0x6d,0x62,0x54,0x72,0x61,0x63,0x6b,0x41,0x72,0x65,0x61,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,
-0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,
-0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,
-0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x30,0x2e,0x33,
-0x32,0x35,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,
-0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,
-0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x44,0x69,
-0x6d,0x20,0x77,0x69,0x64,0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,
-0x5f,0x64,0x65,0x63,0x62,0x74,0x6e,0x5f,0x5f,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,
-0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,
-0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x41,0x64,0x64,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3d,0x22,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x54,0x6f,0x70,0x22,
-0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,
-0x68,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,
-0x72,0x20,0x6f,0x70,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,0x70,0x6c,0x79,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,
-0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x2e,0x35,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,
-0x61,0x67,0x65,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x57,0x69,0x64,0x67,0x65,0x74,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x55,
-0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,
-0x22,0x31,0x2e,0x30,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,
-0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,
-0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,
-0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,
-0x31,0x2e,0x30,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,
-0x6d,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,
-0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x44,
-0x69,0x6d,0x20,0x77,0x69,0x64,0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,
-0x6f,0x5f,0x64,0x65,0x63,0x62,0x74,0x6e,0x5f,0x5f,0x22,0x20,0x64,0x69,0x6d,0x65,
-0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,
-0x22,0x41,0x64,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x3d,0x22,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x54,0x6f,0x70,
-0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,
-0x67,0x68,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x4d,
-0x75,0x6c,0x74,0x69,0x70,0x6c,0x79,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,
-0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x2e,0x35,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,
-0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,
-0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,
-0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x57,0x69,0x64,0x67,0x65,0x74,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,
-0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,
-0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,
-0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4e,
-0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x43,0x68,0x69,0x6c,0x64,0x20,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x49,0x6d,0x61,0x67,
-0x65,0x42,0x75,0x74,0x74,0x6f,0x6e,0x22,0x20,0x6e,0x61,0x6d,0x65,0x53,0x75,0x66,
-0x66,0x69,0x78,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x69,0x6e,0x63,0x62,
-0x74,0x6e,0x5f,0x5f,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,
-0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,
-0x65,0x3d,0x22,0x30,0x2e,0x32,0x35,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,
-0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,
-0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x62,0x73,
-0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,
-0x2d,0x31,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x4d,0x75,
-0x6c,0x74,0x69,0x70,0x6c,0x79,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x56,0x65,0x72,
-0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x54,0x6f,0x70,0x22,0x20,0x64,0x69,0x6d,0x65,
-0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,
-0x22,0x4d,0x75,0x6c,0x74,0x69,0x70,0x6c,0x79,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,
-0x75,0x65,0x3d,0x22,0x30,0x2e,0x35,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,
-0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,
-0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,
-0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,
-0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x30,0x2e,0x36,0x22,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,
-0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,
-0x22,0x30,0x2e,0x36,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,
-0x68,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x4d,0x75,0x6c,
-0x74,0x69,0x70,0x6c,0x79,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,
-0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x56,0x65,0x72,0x74,
-0x53,0x63,0x72,0x6f,0x6c,0x6c,0x55,0x70,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,
-0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,
-0x6f,0x70,0x3d,0x22,0x44,0x69,0x76,0x69,0x64,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x56,0x65,0x72,0x74,0x53,0x63,0x72,
-0x6f,0x6c,0x6c,0x55,0x70,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x64,0x69,0x6d,
-0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,
-0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x41,0x6c,
-0x69,0x67,0x6e,0x6d,0x65,0x6e,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,
-0x74,0x74,0x6f,0x6d,0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,
-0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4e,0x6f,0x72,0x6d,
-0x61,0x6c,0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,
-0x73,0x65,0x74,0x3a,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x3a,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,
-0x44,0x6f,0x77,0x6e,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,
-0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x48,0x6f,0x76,0x65,0x72,
-0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x73,0x65,
-0x74,0x3a,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x3a,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x44,0x6f,
-0x77,0x6e,0x48,0x6f,0x76,0x65,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,
-0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x50,0x75,0x73,0x68,0x65,0x64,0x49,0x6d,
-0x61,0x67,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x73,0x65,0x74,0x3a,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x3a,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x44,0x6f,0x77,0x6e,
-0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x43,0x68,0x69,0x6c,0x64,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x43,0x68,0x69,0x6c,0x64,0x20,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x49,0x6d,
-0x61,0x67,0x65,0x42,0x75,0x74,0x74,0x6f,0x6e,0x22,0x20,0x6e,0x61,0x6d,0x65,0x53,
-0x75,0x66,0x66,0x69,0x78,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x64,0x65,
-0x63,0x62,0x74,0x6e,0x5f,0x5f,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,
-0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,
-0x61,0x6c,0x65,0x3d,0x22,0x30,0x2e,0x32,0x35,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,
-0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x3d,0x22,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x54,
-0x6f,0x70,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,
-0x65,0x69,0x67,0x68,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,
-0x22,0x4d,0x75,0x6c,0x74,0x69,0x70,0x6c,0x79,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,
-0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x2e,0x35,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,
-0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,
-0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,
-0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x30,0x2e,0x36,0x22,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,
-0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,
-0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x30,
-0x2e,0x36,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,
-0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,
-0x70,0x6c,0x79,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,
-0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x56,0x65,0x72,0x74,0x53,0x63,
-0x72,0x6f,0x6c,0x6c,0x55,0x70,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x64,0x69,
-0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,
-0x3d,0x22,0x44,0x69,0x76,0x69,0x64,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,
-0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,
-0x6c,0x55,0x70,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,
-0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,
-0x67,0x65,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,
-0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x49,0x6d,0x61,
-0x67,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x73,0x65,0x74,0x3a,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3a,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x55,0x70,0x4e,0x6f,0x72,
-0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x48,0x6f,0x76,0x65,0x72,0x49,0x6d,0x61,0x67,0x65,0x22,0x20,
-0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x73,0x65,0x74,0x3a,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x20,0x69,0x6d,0x61,0x67,0x65,0x3a,0x56,0x65,0x72,
-0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x55,0x70,0x48,0x6f,0x76,0x65,0x72,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x50,
-0x75,0x73,0x68,0x65,0x64,0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,
-0x65,0x3d,0x22,0x73,0x65,0x74,0x3a,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x20,0x69,0x6d,0x61,0x67,0x65,0x3a,0x56,0x65,0x72,0x74,0x53,0x63,0x72,
-0x6f,0x6c,0x6c,0x55,0x70,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x43,0x68,0x69,0x6c,0x64,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x68,0x69,0x6c,0x64,0x20,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x2f,0x4c,0x61,0x72,0x67,0x65,0x56,0x65,0x72,0x74,0x69,0x63,0x61,0x6c,
-0x53,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x54,0x68,0x75,0x6d,0x62,0x22,0x20,
-0x6e,0x61,0x6d,0x65,0x53,0x75,0x66,0x66,0x69,0x78,0x3d,0x22,0x5f,0x5f,0x61,0x75,
-0x74,0x6f,0x5f,0x74,0x68,0x75,0x6d,0x62,0x5f,0x5f,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,
-0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,
-0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,
-0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,
-0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,
-0x22,0x30,0x2e,0x34,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,
-0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,
-0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x30,0x2e,0x34,0x22,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,
-0x6f,0x70,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,0x70,0x6c,0x79,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x3d,0x22,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x54,0x68,0x75,
-0x6d,0x62,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,
-0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x44,
-0x69,0x76,0x69,0x64,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x3d,0x22,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x54,0x68,
-0x75,0x6d,0x62,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,
-0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,
-0x65,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x43,0x68,0x69,0x6c,0x64,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x6d,0x61,0x69,0x6e,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x46,0x72,0x61,
-0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,
-0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,
-0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,
-0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,
-0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,
-0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,
-0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,
-0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,
-0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,
-0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,
-0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x56,0x65,0x72,0x74,0x53,
-0x63,0x72,0x6f,0x6c,0x6c,0x54,0x6f,0x70,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,
-0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x3d,0x22,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x42,0x6f,
-0x74,0x74,0x6f,0x6d,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,
-0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,
-0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x4d,0x69,0x64,0x64,0x6c,0x65,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,
-0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,
-0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,
-0x63,0x61,0x6c,0x65,0x3d,0x22,0x30,0x2e,0x34,0x35,0x22,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x44,0x69,
-0x6d,0x20,0x77,0x69,0x64,0x67,0x65,0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,
-0x5f,0x64,0x65,0x63,0x62,0x74,0x6e,0x5f,0x5f,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,
-0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,
-0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x41,0x64,0x64,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,
-0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x56,0x65,0x72,0x74,0x53,0x63,
-0x72,0x6f,0x6c,0x6c,0x54,0x6f,0x70,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,
-0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,
-0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,0x70,0x6c,0x79,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,
-0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x2e,0x35,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,
-0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,
-0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x57,0x69,0x64,0x67,0x65,0x74,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,
-0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,
-0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x2e,0x30,0x22,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,
-0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,
-0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,
-0x31,0x2e,0x30,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,
-0x6d,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,
-0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x57,0x69,0x64,0x67,0x65,0x74,0x44,0x69,0x6d,0x20,0x77,0x69,0x64,0x67,0x65,
-0x74,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x64,0x65,0x63,0x62,0x74,0x6e,
-0x5f,0x5f,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,
-0x65,0x69,0x67,0x68,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x41,0x64,0x64,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x3d,0x22,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x54,0x6f,0x70,
-0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,
-0x67,0x68,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,
-0x70,0x3d,0x22,0x4d,0x75,0x6c,0x74,0x69,0x70,0x6c,0x79,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,
-0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,
-0x3d,0x22,0x30,0x2e,0x35,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,
-0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,
-0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,
-0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x57,0x69,
-0x64,0x67,0x65,0x74,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,
-0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,
-0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3d,0x22,0x56,0x65,0x72,0x74,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x42,0x61,0x72,0x53,
-0x65,0x67,0x6d,0x65,0x6e,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,
-0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x69,0x6c,
-0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,
-0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x45,0x6e,0x61,
-0x62,0x6c,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6d,0x61,0x69,
-0x6e,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,
-0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,
-0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,
-0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,
-0x6d,0x61,0x69,0x6e,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,
-0x75,0x72,0x73,0x20,0x74,0x6f,0x70,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,
-0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x74,0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x3d,
-0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,
-0x6d,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,
-0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,
-0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,
-0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,
-0x6f,0x6f,0x6b,0x3e,0x0a,0x0a,0x20,0x20,0x20,0x20,0x3c,0x21,0x2d,0x2d,0x0a,0x20,
-0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x49,0x6d,0x61,0x67,0x65,
-0x42,0x75,0x74,0x74,0x6f,0x6e,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,
-0x20,0x20,0x20,0x2d,0x2d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,0x64,0x67,
-0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x49,0x6d,0x61,0x67,0x65,0x42,0x75,
-0x74,0x74,0x6f,0x6e,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,
-0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x49,
-0x6d,0x61,0x67,0x65,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,
-0x75,0x65,0x3d,0x22,0x22,0x20,0x72,0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,
-0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,
-0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,
-0x48,0x6f,0x76,0x65,0x72,0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x69,0x6e,0x69,0x74,
-0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x22,0x20,0x72,0x65,0x64,0x72,
-0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,
-0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x50,0x75,0x73,0x68,0x65,0x64,0x49,0x6d,0x61,0x67,
-0x65,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,
-0x22,0x22,0x20,0x72,0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,
-0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,
-0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,
-0x61,0x62,0x6c,0x65,0x64,0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x69,0x6e,0x69,0x74,
-0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x22,0x20,0x72,0x65,0x64,0x72,
-0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,
-0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x56,0x65,0x72,0x74,0x49,0x6d,0x61,0x67,0x65,0x46,
-0x6f,0x72,0x6d,0x61,0x74,0x74,0x69,0x6e,0x67,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,
-0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,0x74,0x63,0x68,
-0x65,0x64,0x22,0x20,0x72,0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,
-0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,
-0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x48,0x6f,
-0x72,0x7a,0x49,0x6d,0x61,0x67,0x65,0x46,0x6f,0x72,0x6d,0x61,0x74,0x74,0x69,0x6e,
-0x67,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,
-0x22,0x53,0x74,0x72,0x65,0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x72,0x65,0x64,0x72,
-0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,
-0x3d,0x22,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,
-0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,
-0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,
-0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,
-0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,
-0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,
-0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,
-0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,
-0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,
-0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x50,0x72,0x6f,0x70,0x65,0x72,
-0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x49,
-0x6d,0x61,0x67,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x46,0x6f,
-0x72,0x6d,0x61,0x74,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,
-0x65,0x3d,0x22,0x56,0x65,0x72,0x74,0x49,0x6d,0x61,0x67,0x65,0x46,0x6f,0x72,0x6d,
-0x61,0x74,0x74,0x69,0x6e,0x67,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,
-0x46,0x6f,0x72,0x6d,0x61,0x74,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x48,0x6f,0x72,0x7a,0x49,0x6d,0x61,0x67,0x65,0x46,0x6f,
-0x72,0x6d,0x61,0x74,0x74,0x69,0x6e,0x67,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,
-0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x68,0x6f,0x76,0x65,0x72,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,
-0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,
-0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,
-0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,
-0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,
-0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,
-0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,
-0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,
-0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,
-0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,
-0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,
-0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,
-0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x50,0x72,0x6f,0x70,
-0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x48,0x6f,0x76,0x65,0x72,
-0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x46,
-0x6f,0x72,0x6d,0x61,0x74,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x56,0x65,0x72,0x74,0x49,0x6d,0x61,0x67,0x65,0x46,0x6f,0x72,
-0x6d,0x61,0x74,0x74,0x69,0x6e,0x67,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,
-0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x48,0x6f,0x72,0x7a,0x49,0x6d,0x61,0x67,0x65,0x46,
-0x6f,0x72,0x6d,0x61,0x74,0x74,0x69,0x6e,0x67,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,
-0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x70,0x75,0x73,0x68,0x65,0x64,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,
-0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,
-0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,
-0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,
-0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,
-0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,
-0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,
-0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,
-0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,
-0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,
-0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x50,0x72,
-0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x50,0x75,0x73,
-0x68,0x65,0x64,0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,
-0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,
-0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x56,0x65,0x72,0x74,0x49,0x6d,0x61,0x67,0x65,
-0x46,0x6f,0x72,0x6d,0x61,0x74,0x74,0x69,0x6e,0x67,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,0x50,0x72,0x6f,0x70,0x65,0x72,
-0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x48,0x6f,0x72,0x7a,0x49,0x6d,0x61,
-0x67,0x65,0x46,0x6f,0x72,0x6d,0x61,0x74,0x74,0x69,0x6e,0x67,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,
-0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x64,0x69,0x73,0x61,0x62,0x6c,0x65,
-0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,
-0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,
-0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,
-0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,
-0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,
-0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,
-0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,
-0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,
-0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,
-0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,
-0x3d,0x22,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x49,0x6d,0x61,0x67,0x65,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,0x50,
-0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x56,0x65,
-0x72,0x74,0x49,0x6d,0x61,0x67,0x65,0x46,0x6f,0x72,0x6d,0x61,0x74,0x74,0x69,0x6e,
-0x67,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,
-0x74,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,
-0x48,0x6f,0x72,0x7a,0x49,0x6d,0x61,0x67,0x65,0x46,0x6f,0x72,0x6d,0x61,0x74,0x74,
-0x69,0x6e,0x67,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,
-0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4e,0x6f,
-0x72,0x6d,0x61,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6e,0x6f,0x72,
-0x6d,0x61,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,
-0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,
-0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,
-0x22,0x48,0x6f,0x76,0x65,0x72,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x68,
-0x6f,0x76,0x65,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,
-0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,
-0x3d,0x22,0x50,0x75,0x73,0x68,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,
-0x22,0x70,0x75,0x73,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x50,0x75,0x73,0x68,0x65,0x64,0x4f,0x66,0x66,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,
-0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x68,0x6f,0x76,0x65,0x72,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,
-0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,
-0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,0x61,0x62,0x6c,
-0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x64,0x69,0x73,0x61,0x62,
-0x6c,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,
-0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x57,0x69,0x64,0x67,0x65,
-0x74,0x4c,0x6f,0x6f,0x6b,0x3e,0x0a,0x0a,0x20,0x20,0x20,0x20,0x3c,0x21,0x2d,0x2d,
-0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x49,0x74,0x65,
-0x6d,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x0a,0x20,0x20,0x20,0x20,0x2d,0x2d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,
-0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x49,0x74,0x65,0x6d,0x4c,
-0x69,0x73,0x74,0x62,0x6f,0x78,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x20,0x6e,0x61,0x6d,0x65,
-0x3d,0x22,0x49,0x74,0x65,0x6d,0x52,0x65,0x6e,0x64,0x65,0x72,0x41,0x72,0x65,0x61,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x3d,0x22,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,0x4c,0x65,0x66,0x74,0x22,
-0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,
-0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,
-0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,
-0x54,0x6f,0x70,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,
-0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,
-0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,
-0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,
-0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,
-0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,
-0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4c,0x69,0x73,
-0x74,0x62,0x6f,0x78,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,
-0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,
-0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,
-0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,
-0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,
-0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,
-0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,
-0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,
-0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4c,0x69,
-0x73,0x74,0x62,0x6f,0x78,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x22,0x20,0x64,0x69,0x6d,
-0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,
-0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x49,0x74,0x65,0x6d,0x52,0x65,0x6e,0x64,0x65,0x72,0x41,
-0x72,0x65,0x61,0x48,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,
-0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4c,0x69,
-0x73,0x74,0x62,0x6f,0x78,0x4c,0x65,0x66,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,
-0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x3d,0x22,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,0x54,0x6f,0x70,0x22,0x20,0x64,
-0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,
-0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,
-0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,
-0x74,0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,
-0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,0x52,0x69,
-0x67,0x68,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,
-0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,
-0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,
-0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x6f,0x66,0x66,
-0x73,0x65,0x74,0x3d,0x22,0x2d,0x31,0x32,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,
-0x61,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x49,0x74,0x65,0x6d,0x52,0x65,0x6e,0x64,
-0x65,0x72,0x41,0x72,0x65,0x61,0x56,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,
-0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,
-0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,
-0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,
-0x22,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,0x4c,0x65,0x66,0x74,0x22,0x20,0x64,0x69,
-0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,
-0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,
-0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x3d,0x22,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,0x54,0x6f,0x70,
-0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,
-0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,
-0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,
-0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,
-0x6f,0x66,0x66,0x73,0x65,0x74,0x3d,0x22,0x2d,0x31,0x32,0x22,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,
-0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,
-0x6f,0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,
-0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,
-0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x3d,0x22,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,0x42,0x6f,0x74,
-0x74,0x6f,0x6d,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,
-0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,
-0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4e,0x61,0x6d,
-0x65,0x64,0x41,0x72,0x65,0x61,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x49,0x74,0x65,
-0x6d,0x52,0x65,0x6e,0x64,0x65,0x72,0x41,0x72,0x65,0x61,0x48,0x56,0x53,0x63,0x72,
-0x6f,0x6c,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,
-0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,0x4c,0x65,
-0x66,0x74,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,
-0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,
-0x65,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,
-0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4c,0x69,0x73,0x74,
-0x62,0x6f,0x78,0x54,0x6f,0x70,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,
-0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,
-0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,
-0x65,0x3d,0x22,0x31,0x22,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x3d,0x22,0x2d,0x31,
-0x32,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,
-0x67,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,
-0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,
-0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,
-0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x3d,0x22,0x2d,0x31,0x32,0x22,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,
-0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x68,0x69,0x6c,
-0x64,0x20,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x2f,0x48,0x6f,0x72,0x69,0x7a,0x6f,0x6e,0x74,0x61,0x6c,0x53,
-0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x22,0x20,0x6e,0x61,0x6d,0x65,0x53,0x75,
-0x66,0x66,0x69,0x78,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x68,0x73,0x63,
-0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x5f,0x5f,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,
-0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,
-0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,
-0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,
-0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,
-0x31,0x22,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x3d,0x22,0x2d,0x31,0x32,0x22,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,
-0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,
-0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x31,0x32,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,
-0x41,0x6c,0x69,0x67,0x6e,0x6d,0x65,0x6e,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x42,0x6f,0x74,0x74,0x6f,0x6d,0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x43,0x68,0x69,0x6c,
-0x64,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x68,0x69,0x6c,
-0x64,0x20,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x2f,0x56,0x65,0x72,0x74,0x69,0x63,0x61,0x6c,0x53,0x63,0x72,
-0x6f,0x6c,0x6c,0x62,0x61,0x72,0x22,0x20,0x6e,0x61,0x6d,0x65,0x53,0x75,0x66,0x66,
-0x69,0x78,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x76,0x73,0x63,0x72,0x6f,
-0x6c,0x6c,0x62,0x61,0x72,0x5f,0x5f,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,
-0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,
-0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,
-0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,
-0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,
-0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x31,
-0x32,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,
-0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,
-0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,
-0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,
-0x72,0x7a,0x41,0x6c,0x69,0x67,0x6e,0x6d,0x65,0x6e,0x74,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x43,0x68,0x69,
-0x6c,0x64,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,
-0x3d,0x22,0x6d,0x61,0x69,0x6e,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,
-0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,
-0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,
-0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,
-0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,
-0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,
-0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,
-0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,
-0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,
-0x4c,0x65,0x66,0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,
-0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4c,0x69,0x73,0x74,0x62,0x6f,
-0x78,0x54,0x6f,0x70,0x4c,0x65,0x66,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x52,0x69,0x67,
-0x68,0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,
-0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,0x54,
-0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x4c,
-0x65,0x66,0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,
-0x42,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,
-0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x43,0x6f,0x72,0x6e,0x65,0x72,0x22,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4c,0x69,0x73,
-0x74,0x62,0x6f,0x78,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,0x67,0x68,0x74,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,
-0x4c,0x65,0x66,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,
-0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,
-0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4c,
-0x69,0x73,0x74,0x62,0x6f,0x78,0x52,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,
-0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x3d,0x22,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,0x54,0x6f,0x70,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,
-0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x4c,0x69,0x73,0x74,0x62,0x6f,
-0x78,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,
-0x67,0x65,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x61,0x63,0x6b,0x67,0x72,0x6f,
-0x75,0x6e,0x64,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x3d,0x22,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,0x42,0x61,0x63,0x6b,0x64,0x72,
-0x6f,0x70,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x46,0x72,0x61,0x6d,0x65,0x43,0x6f,0x6d,0x70,0x6f,0x6e,
-0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x45,0x6e,0x61,0x62,0x6c,
-0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6d,0x61,0x69,0x6e,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,
-0x61,0x62,0x6c,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6d,0x61,
-0x69,0x6e,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,
-0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x57,0x69,0x64,0x67,0x65,0x74,
-0x4c,0x6f,0x6f,0x6b,0x3e,0x0a,0x0a,0x0a,0x20,0x20,0x20,0x20,0x3c,0x21,0x2d,0x2d,
-0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x4c,0x69,0x73,
-0x74,0x62,0x6f,0x78,0x49,0x74,0x65,0x6d,0x0a,0x20,0x20,0x20,0x20,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x0a,0x20,0x20,0x20,0x20,0x2d,0x2d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x57,0x69,
-0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x4c,0x69,0x73,0x74,0x62,
-0x6f,0x78,0x49,0x74,0x65,0x6d,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,
-0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x65,0x78,0x74,0x43,
-0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,
-0x6c,0x75,0x65,0x3d,0x22,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x22,0x20,0x72,
-0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,
-0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,
-0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x53,0x65,0x6c,0x65,0x63,0x74,0x65,
-0x64,0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x69,0x6e,0x69,
-0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x46,0x46,0x46,0x46,0x46,
-0x46,0x46,0x46,0x22,0x20,0x72,0x65,0x64,0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,
-0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x44,0x65,
-0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x53,
-0x65,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x42,0x72,0x75,0x73,0x68,0x22,0x20,0x69,
-0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,0x65,0x3d,0x22,0x73,0x65,0x74,
-0x3a,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x20,0x69,0x6d,0x61,
-0x67,0x65,0x3a,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,0x53,0x65,0x6c,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x42,0x72,0x75,0x73,0x68,0x22,0x20,0x72,0x65,0x64,0x72,0x61,0x77,
-0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,
-0x72,0x74,0x79,0x44,0x65,0x66,0x69,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x53,0x65,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x43,0x6f,0x6c,
-0x6f,0x75,0x72,0x22,0x20,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x56,0x61,0x6c,0x75,
-0x65,0x3d,0x22,0x46,0x46,0x34,0x34,0x34,0x34,0x41,0x41,0x22,0x20,0x72,0x65,0x64,
-0x72,0x61,0x77,0x4f,0x6e,0x57,0x72,0x69,0x74,0x65,0x3d,0x22,0x74,0x72,0x75,0x65,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,
-0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x53,0x65,0x6c,
-0x65,0x63,0x74,0x61,0x62,0x6c,0x65,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,
-0x54,0x72,0x75,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x20,0x6e,0x61,0x6d,0x65,
-0x3d,0x22,0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x53,0x69,0x7a,0x65,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,
-0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,
-0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,
-0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,
-0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,
-0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,
-0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x46,0x6f,0x6e,0x74,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x48,0x6f,0x72,0x7a,0x45,0x78,0x74,0x65,0x6e,0x74,0x22,0x20,0x70,0x61,0x64,
-0x64,0x69,0x6e,0x67,0x3d,0x22,0x36,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,
-0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x46,0x6f,0x6e,
-0x74,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x69,0x6e,0x65,0x53,
-0x70,0x61,0x63,0x69,0x6e,0x67,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x4e,0x61,0x6d,0x65,0x64,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x54,0x65,
-0x78,0x74,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,
-0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,
-0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,
-0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x62,0x73,
-0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,
-0x33,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,
-0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,
-0x3d,0x22,0x2d,0x33,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,
-0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,
-0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,
-0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x54,0x65,0x78,0x74,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,
-0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,
-0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x73,0x65,0x6c,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,
-0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,
-0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,
-0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,
-0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,
-0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,
-0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,
-0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,
-0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,
-0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,
-0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x50,0x72,0x6f,0x70,0x65,
-0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x53,0x65,0x6c,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x42,0x72,0x75,0x73,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,
-0x6c,0x6f,0x75,0x72,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,
-0x65,0x3d,0x22,0x53,0x65,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x43,0x6f,0x6c,0x6f,
-0x75,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x46,0x6f,0x72,0x6d,
-0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,0x74,0x63,0x68,
-0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,
-0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,0x74,0x63,0x68,
-0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,
-0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x45,0x6e,0x61,
-0x62,0x6c,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6c,0x61,0x62,
-0x65,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,
-0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,
-0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,
-0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,
-0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,
-0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,
-0x3d,0x22,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x43,0x6f,0x6c,0x6f,0x75,0x72,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,
-0x61,0x6d,0x65,0x3d,0x22,0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,
-0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,
-0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,
-0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x53,0x65,0x6c,0x65,0x63,0x74,0x65,0x64,
-0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,
-0x73,0x65,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,
-0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,
-0x6c,0x61,0x62,0x65,0x6c,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,
-0x6f,0x75,0x72,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,
-0x3d,0x22,0x53,0x65,0x6c,0x65,0x63,0x74,0x65,0x64,0x54,0x65,0x78,0x74,0x43,0x6f,
-0x6c,0x6f,0x75,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,
-0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,
-0x6d,0x61,0x67,0x65,0x72,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x53,0x65,0x6c,
-0x65,0x63,0x74,0x65,0x64,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,
-0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x3d,0x22,0x73,0x65,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6c,0x61,0x62,0x65,0x6c,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,
-0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x53,0x65,0x6c,0x65,0x63,0x74,0x65,0x64,
-0x54,0x65,0x78,0x74,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,
-0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x57,0x69,0x64,
-0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x3e,0x0a,0x0a,0x3c,0x21,0x2d,0x2d,0x0a,0x2f,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0a,0x09,0x54,0x61,0x68,0x61,
-0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x54,0x72,0x65,0x65,0x0a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
-0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2f,0x0a,0x2d,0x2d,0x3e,0x0a,0x3c,0x57,
-0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x54,0x72,0x65,0x65,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,
-0x65,0x72,0x74,0x79,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x53,0x65,0x6c,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x42,0x72,0x75,0x73,0x68,0x49,0x6d,0x61,0x67,0x65,0x22,0x20,
-0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x73,0x65,0x74,0x3a,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x20,0x69,0x6d,0x61,0x67,0x65,0x3a,0x47,0x65,0x6e,
-0x65,0x72,0x69,0x63,0x42,0x72,0x75,0x73,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x4e,0x6f,0x72,0x6d,0x61,0x6c,0x54,0x65,0x78,0x74,
-0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x46,
-0x46,0x30,0x30,0x30,0x30,0x30,0x30,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x53,0x65,0x6c,0x65,0x63,0x74,0x65,0x64,0x54,0x65,0x78,0x74,
-0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x46,
-0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x20,0x6e,0x61,
-0x6d,0x65,0x3d,0x22,0x41,0x63,0x74,0x69,0x76,0x65,0x53,0x65,0x6c,0x65,0x63,0x74,
-0x69,0x6f,0x6e,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,0x76,0x61,0x6c,0x75,0x65,
-0x3d,0x22,0x46,0x46,0x36,0x30,0x37,0x46,0x46,0x46,0x22,0x20,0x2f,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,
-0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x49,0x6e,0x61,0x63,0x74,0x69,0x76,0x65,0x53,
-0x65,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x22,0x20,
-0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x46,0x46,0x38,0x30,0x38,0x30,0x38,0x30,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4e,0x61,0x6d,
-0x65,0x64,0x41,0x72,0x65,0x61,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x49,0x74,0x65,
-0x6d,0x52,0x65,0x6e,0x64,0x65,0x72,0x69,0x6e,0x67,0x41,0x72,0x65,0x61,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,
-0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,
-0x65,0x66,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,
-0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,
-0x3d,0x22,0x57,0x69,0x6e,0x64,0x6f,0x77,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,
-0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,
-0x74,0x68,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,
-0x20,0x3e,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,
-0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,
-0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x57,0x69,0x6e,0x64,0x6f,0x77,
-0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,
-0x6f,0x6e,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,
-0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,
-0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x20,0x6f,0x70,
-0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x44,
-0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,
-0x22,0x57,0x69,0x6e,0x64,0x6f,0x77,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,
-0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x57,0x69,0x64,
-0x74,0x68,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,
-0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,0x6f,
-0x72,0x20,0x6f,0x70,0x3d,0x22,0x53,0x75,0x62,0x74,0x72,0x61,0x63,0x74,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x44,0x69,0x6d,0x20,0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,
-0x61,0x67,0x65,0x3d,0x22,0x57,0x69,0x6e,0x64,0x6f,0x77,0x42,0x6f,0x74,0x74,0x6f,
-0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x64,0x69,0x6d,0x65,0x6e,0x73,0x69,0x6f,0x6e,
-0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x4f,0x70,0x65,0x72,0x61,0x74,
-0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x55,0x6e,0x69,0x66,0x69,0x65,
-0x64,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4e,0x61,0x6d,0x65,0x64,
-0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,
-0x68,0x69,0x6c,0x64,0x20,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,
-0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x48,0x6f,0x72,0x69,0x7a,0x6f,0x6e,0x74,
-0x61,0x6c,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x22,0x20,0x6e,0x61,0x6d,
-0x65,0x53,0x75,0x66,0x66,0x69,0x78,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,
-0x68,0x73,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x5f,0x5f,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,
-0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,
-0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x35,0x22,0x20,0x2f,
-0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,
-0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,
-0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,
-0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,
-0x65,0x3d,0x22,0x31,0x22,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x3d,0x22,0x2d,0x32,
-0x35,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,
-0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,0x74,0x22,0x20,0x3e,0x3c,0x41,0x62,
-0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,
-0x22,0x31,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x56,
-0x65,0x72,0x74,0x41,0x6c,0x69,0x67,0x6e,0x6d,0x65,0x6e,0x74,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x43,
-0x68,0x69,0x6c,0x64,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x43,
-0x68,0x69,0x6c,0x64,0x20,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,
-0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x56,0x65,0x72,0x74,0x69,0x63,0x61,0x6c,
-0x53,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x22,0x20,0x6e,0x61,0x6d,0x65,0x53,
-0x75,0x66,0x66,0x69,0x78,0x3d,0x22,0x5f,0x5f,0x61,0x75,0x74,0x6f,0x5f,0x76,0x73,
-0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x5f,0x5f,0x22,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,
-0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,
-0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x2d,0x35,0x22,0x20,0x2f,0x3e,
-0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x20,0x3e,0x3c,0x41,0x62,0x73,
-0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,
-0x35,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x57,0x69,0x64,0x74,0x68,0x22,0x20,0x3e,0x3c,
-0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,
-0x65,0x3d,0x22,0x31,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,0x67,0x68,
-0x74,0x22,0x20,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,
-0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,
-0x3d,0x22,0x2d,0x31,0x30,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x48,0x65,0x69,
-0x67,0x68,0x74,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x48,
-0x6f,0x72,0x7a,0x41,0x6c,0x69,0x67,0x6e,0x6d,0x65,0x6e,0x74,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x41,0x6c,0x69,0x67,0x6e,0x65,0x64,0x22,
-0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x43,0x68,
-0x69,0x6c,0x64,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,
-0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,
-0x65,0x3d,0x22,0x4f,0x70,0x65,0x6e,0x54,0x72,0x65,0x65,0x42,0x75,0x74,0x74,0x6f,
-0x6e,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,
-0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,
-0x65,0x22,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,
-0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,
-0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x3e,0x3c,0x41,0x62,0x73,0x6f,
-0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,
-0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,
-0x64,0x67,0x65,0x22,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,
-0x20,0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,
-0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,
-0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x3e,
-0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,
-0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,
-0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,
-0x69,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x72,
-0x65,0x65,0x4c,0x69,0x73,0x74,0x43,0x6c,0x6f,0x73,0x65,0x64,0x22,0x20,0x2f,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x21,0x2d,0x2d,0x20,0x20,0x3c,0x56,0x65,0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,0x74,0x63,0x68,0x65,0x64,
-0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,
-0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x53,0x74,0x72,0x65,0x74,0x63,0x68,0x65,0x64,
-0x22,0x20,0x2f,0x3e,0x20,0x2d,0x2d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,
-0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,
-0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,
-0x65,0x72,0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6e,0x61,0x6d,0x65,0x3d,
-0x22,0x43,0x6c,0x6f,0x73,0x65,0x54,0x72,0x65,0x65,0x42,0x75,0x74,0x74,0x6f,0x6e,
-0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
-0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,
-0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x4c,0x65,0x66,0x74,0x45,0x64,0x67,0x65,
-0x22,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,
-0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,
-0x22,0x54,0x6f,0x70,0x45,0x64,0x67,0x65,0x22,0x3e,0x3c,0x41,0x62,0x73,0x6f,0x6c,
-0x75,0x74,0x65,0x44,0x69,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x22,0x30,0x22,
-0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,
-0x69,0x6d,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x52,0x69,0x67,0x68,0x74,0x45,0x64,
-0x67,0x65,0x22,0x3e,0x3c,0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,
-0x73,0x63,0x61,0x6c,0x65,0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,
-0x52,0x69,0x67,0x68,0x74,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,
-0x69,0x6d,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x44,0x69,0x6d,0x20,0x74,0x79,0x70,
-0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,0x6d,0x45,0x64,0x67,0x65,0x22,0x3e,0x3c,
-0x55,0x6e,0x69,0x66,0x69,0x65,0x64,0x44,0x69,0x6d,0x20,0x73,0x63,0x61,0x6c,0x65,
-0x3d,0x22,0x31,0x22,0x20,0x74,0x79,0x70,0x65,0x3d,0x22,0x42,0x6f,0x74,0x74,0x6f,
-0x6d,0x45,0x64,0x67,0x65,0x22,0x20,0x2f,0x3e,0x3c,0x2f,0x44,0x69,0x6d,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x2f,0x41,0x72,0x65,0x61,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x6d,0x61,0x67,0x65,0x20,0x69,
-0x6d,0x61,0x67,0x65,0x73,0x65,0x74,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x22,0x20,0x69,0x6d,0x61,0x67,0x65,0x3d,0x22,0x54,0x72,0x65,
-0x65,0x4c,0x69,0x73,0x74,0x4f,0x70,0x65,0x6e,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x56,0x65,0x72,0x74,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x53,0x74,0x72,0x65,0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x3c,0x48,0x6f,0x72,0x7a,0x46,0x6f,0x72,0x6d,0x61,0x74,0x20,0x74,0x79,0x70,0x65,
-0x3d,0x22,0x53,0x74,0x72,0x65,0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x2f,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,
-0x61,0x67,0x65,0x72,0x79,0x43,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x49,0x6d,0x61,0x67,0x65,0x72,
-0x79,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x45,0x6e,0x61,0x62,0x6c,0x65,0x64,0x22,0x3e,0x0a,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,0x79,
-0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6c,0x6f,0x6f,
-0x6b,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x53,
-0x74,0x61,0x74,0x69,0x63,0x53,0x68,0x61,0x72,0x65,0x64,0x22,0x20,0x73,0x65,0x63,
-0x74,0x69,0x6f,0x6e,0x3d,0x22,0x66,0x72,0x61,0x6d,0x65,0x22,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x20,0x74,0x6f,0x70,0x4c,0x65,
-0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x74,0x6f,
-0x70,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,
-0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,0x46,
-0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x52,0x69,
-0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x2f,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,0x72,
-0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,0x74,
-0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x3c,0x53,0x74,0x61,0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x20,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x44,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x22,0x3e,
-0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x4c,0x61,
-0x79,0x65,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x3c,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6c,0x6f,
-0x6f,0x6b,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,
-0x53,0x74,0x61,0x74,0x69,0x63,0x53,0x68,0x61,0x72,0x65,0x64,0x22,0x20,0x73,0x65,
-0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x66,0x72,0x61,0x6d,0x65,0x22,0x3e,0x0a,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x43,0x6f,0x6c,0x6f,0x75,0x72,0x73,0x20,0x74,0x6f,0x70,0x4c,
-0x65,0x66,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x74,
-0x6f,0x70,0x52,0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,
-0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x4c,0x65,0x66,0x74,0x3d,0x22,0x46,
-0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x52,
-0x69,0x67,0x68,0x74,0x3d,0x22,0x46,0x46,0x37,0x46,0x37,0x46,0x37,0x46,0x22,0x20,
-0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x3c,0x2f,0x53,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x4c,0x61,0x79,0x65,
-0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x53,0x74,0x61,
-0x74,0x65,0x49,0x6d,0x61,0x67,0x65,0x72,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,
-0x2f,0x57,0x69,0x64,0x67,0x65,0x74,0x4c,0x6f,0x6f,0x6b,0x3e,0x0a,0x0a,0x0a,0x3c,
-0x2f,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x3e,0x0a,0x0a,0x0a};
diff --git a/client/gui/taharez_look.scheme.c b/client/gui/taharez_look.scheme.c
deleted file mode 100644
index 319f238a..00000000
--- a/client/gui/taharez_look.scheme.c
+++ /dev/null
@@ -1,449 +0,0 @@
-const unsigned char taharez_look_schem[] = {
-0x3c,0x3f,0x78,0x6d,0x6c,0x20,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x31,
-0x2e,0x30,0x22,0x20,0x3f,0x3e,0x0a,0x3c,0x47,0x55,0x49,0x53,0x63,0x68,0x65,0x6d,
-0x65,0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,
-0x6f,0x6f,0x6b,0x22,0x3e,0x0a,0x09,0x3c,0x49,0x6d,0x61,0x67,0x65,0x73,0x65,0x74,
-0x20,0x4e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x22,0x20,0x46,0x69,0x6c,0x65,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2e,0x69,0x6d,0x61,0x67,0x65,0x73,
-0x65,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x46,0x6f,0x6e,0x74,0x20,0x4e,0x61,
-0x6d,0x65,0x3d,0x22,0x43,0x6f,0x6d,0x6d,0x6f,0x6e,0x77,0x65,0x61,0x6c,0x74,0x68,
-0x2d,0x31,0x30,0x22,0x20,0x46,0x69,0x6c,0x65,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x43,
-0x6f,0x6d,0x6d,0x6f,0x6e,0x77,0x65,0x61,0x6c,0x74,0x68,0x2d,0x31,0x30,0x2e,0x66,
-0x6f,0x6e,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x4c,0x6f,0x6f,0x6b,0x4e,0x46,
-0x65,0x65,0x6c,0x20,0x46,0x69,0x6c,0x65,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2e,0x6c,0x6f,0x6f,0x6b,0x6e,0x66,
-0x65,0x65,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x57,0x69,0x6e,0x64,0x6f,0x77,
-0x52,0x65,0x6e,0x64,0x65,0x72,0x65,0x72,0x53,0x65,0x74,0x20,0x46,0x69,0x6c,0x65,
-0x6e,0x61,0x6d,0x65,0x3d,0x22,0x43,0x45,0x47,0x55,0x49,0x46,0x61,0x6c,0x61,0x67,
-0x61,0x72,0x64,0x57,0x52,0x42,0x61,0x73,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,
-0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x4d,0x61,0x70,0x70,0x69,0x6e,0x67,0x20,
-0x57,0x69,0x6e,0x64,0x6f,0x77,0x54,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,
-0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x42,0x75,0x74,0x74,0x6f,0x6e,0x22,0x20,
-0x20,0x20,0x20,0x20,0x20,0x54,0x61,0x72,0x67,0x65,0x74,0x54,0x79,0x70,0x65,0x3d,
-0x22,0x43,0x45,0x47,0x55,0x49,0x2f,0x50,0x75,0x73,0x68,0x42,0x75,0x74,0x74,0x6f,
-0x6e,0x22,0x20,0x20,0x52,0x65,0x6e,0x64,0x65,0x72,0x65,0x72,0x3d,0x22,0x46,0x61,
-0x6c,0x61,0x67,0x61,0x72,0x64,0x2f,0x42,0x75,0x74,0x74,0x6f,0x6e,0x22,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x4c,0x6f,0x6f,0x6b,0x4e,0x46,0x65,0x65,0x6c,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x42,0x75,0x74,0x74,
-0x6f,0x6e,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,
-0x64,0x4d,0x61,0x70,0x70,0x69,0x6e,0x67,0x20,0x57,0x69,0x6e,0x64,0x6f,0x77,0x54,
-0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x2f,0x43,0x68,0x65,0x63,0x6b,0x62,0x6f,0x78,0x22,0x20,0x20,0x20,0x20,0x54,0x61,
-0x72,0x67,0x65,0x74,0x54,0x79,0x70,0x65,0x3d,0x22,0x43,0x45,0x47,0x55,0x49,0x2f,
-0x43,0x68,0x65,0x63,0x6b,0x62,0x6f,0x78,0x22,0x20,0x20,0x20,0x20,0x52,0x65,0x6e,
-0x64,0x65,0x72,0x65,0x72,0x3d,0x22,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x2f,
-0x54,0x6f,0x67,0x67,0x6c,0x65,0x42,0x75,0x74,0x74,0x6f,0x6e,0x22,0x20,0x4c,0x6f,
-0x6f,0x6b,0x4e,0x46,0x65,0x65,0x6c,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x2f,0x43,0x68,0x65,0x63,0x6b,0x62,0x6f,0x78,0x22,0x20,0x2f,
-0x3e,0x0a,0x09,0x3c,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x4d,0x61,0x70,0x70,
-0x69,0x6e,0x67,0x20,0x57,0x69,0x6e,0x64,0x6f,0x77,0x54,0x79,0x70,0x65,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x49,0x6d,0x61,0x67,
-0x65,0x42,0x75,0x74,0x74,0x6f,0x6e,0x22,0x20,0x54,0x61,0x72,0x67,0x65,0x74,0x54,
-0x79,0x70,0x65,0x3d,0x22,0x43,0x45,0x47,0x55,0x49,0x2f,0x50,0x75,0x73,0x68,0x42,
-0x75,0x74,0x74,0x6f,0x6e,0x22,0x20,0x20,0x52,0x65,0x6e,0x64,0x65,0x72,0x65,0x72,
-0x3d,0x22,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x2f,0x42,0x75,0x74,0x74,0x6f,
-0x6e,0x22,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x4c,0x6f,0x6f,0x6b,0x4e,0x46,0x65,
-0x65,0x6c,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,
-0x49,0x6d,0x61,0x67,0x65,0x42,0x75,0x74,0x74,0x6f,0x6e,0x22,0x20,0x2f,0x3e,0x0a,
-0x09,0x3c,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x4d,0x61,0x70,0x70,0x69,0x6e,
-0x67,0x20,0x57,0x69,0x6e,0x64,0x6f,0x77,0x54,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x52,0x61,0x64,0x69,0x6f,0x42,
-0x75,0x74,0x74,0x6f,0x6e,0x22,0x20,0x54,0x61,0x72,0x67,0x65,0x74,0x54,0x79,0x70,
-0x65,0x3d,0x22,0x43,0x45,0x47,0x55,0x49,0x2f,0x52,0x61,0x64,0x69,0x6f,0x42,0x75,
-0x74,0x74,0x6f,0x6e,0x22,0x20,0x52,0x65,0x6e,0x64,0x65,0x72,0x65,0x72,0x3d,0x22,
-0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x2f,0x54,0x6f,0x67,0x67,0x6c,0x65,0x42,
-0x75,0x74,0x74,0x6f,0x6e,0x22,0x20,0x4c,0x6f,0x6f,0x6b,0x4e,0x46,0x65,0x65,0x6c,
-0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x52,0x61,
-0x64,0x69,0x6f,0x42,0x75,0x74,0x74,0x6f,0x6e,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,
-0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x4d,0x61,0x70,0x70,0x69,0x6e,0x67,0x20,
-0x57,0x69,0x6e,0x64,0x6f,0x77,0x54,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,
-0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x46,0x72,0x61,0x6d,0x65,0x57,0x69,0x6e,
-0x64,0x6f,0x77,0x22,0x20,0x20,0x54,0x61,0x72,0x67,0x65,0x74,0x54,0x79,0x70,0x65,
-0x3d,0x22,0x43,0x45,0x47,0x55,0x49,0x2f,0x46,0x72,0x61,0x6d,0x65,0x57,0x69,0x6e,
-0x64,0x6f,0x77,0x22,0x20,0x52,0x65,0x6e,0x64,0x65,0x72,0x65,0x72,0x3d,0x22,0x46,
-0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x2f,0x46,0x72,0x61,0x6d,0x65,0x57,0x69,0x6e,
-0x64,0x6f,0x77,0x22,0x20,0x20,0x4c,0x6f,0x6f,0x6b,0x4e,0x46,0x65,0x65,0x6c,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x46,0x72,0x61,
-0x6d,0x65,0x57,0x69,0x6e,0x64,0x6f,0x77,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x46,
-0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x4d,0x61,0x70,0x70,0x69,0x6e,0x67,0x20,0x57,
-0x69,0x6e,0x64,0x6f,0x77,0x54,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x54,0x69,0x74,0x6c,0x65,0x62,0x61,0x72,0x22,
-0x20,0x20,0x20,0x20,0x20,0x54,0x61,0x72,0x67,0x65,0x74,0x54,0x79,0x70,0x65,0x3d,
-0x22,0x43,0x45,0x47,0x55,0x49,0x2f,0x54,0x69,0x74,0x6c,0x65,0x62,0x61,0x72,0x22,
-0x20,0x20,0x20,0x20,0x52,0x65,0x6e,0x64,0x65,0x72,0x65,0x72,0x3d,0x22,0x46,0x61,
-0x6c,0x61,0x67,0x61,0x72,0x64,0x2f,0x54,0x69,0x74,0x6c,0x65,0x62,0x61,0x72,0x22,
-0x20,0x20,0x20,0x20,0x20,0x4c,0x6f,0x6f,0x6b,0x4e,0x46,0x65,0x65,0x6c,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x54,0x69,0x74,0x6c,
-0x65,0x62,0x61,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x46,0x61,0x6c,0x61,0x67,
-0x61,0x72,0x64,0x4d,0x61,0x70,0x70,0x69,0x6e,0x67,0x20,0x57,0x69,0x6e,0x64,0x6f,
-0x77,0x54,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x2f,0x53,0x79,0x73,0x74,0x65,0x6d,0x42,0x75,0x74,0x74,0x6f,0x6e,0x22,
-0x20,0x54,0x61,0x72,0x67,0x65,0x74,0x54,0x79,0x70,0x65,0x3d,0x22,0x43,0x45,0x47,
-0x55,0x49,0x2f,0x50,0x75,0x73,0x68,0x42,0x75,0x74,0x74,0x6f,0x6e,0x22,0x20,0x20,
-0x52,0x65,0x6e,0x64,0x65,0x72,0x65,0x72,0x3d,0x22,0x46,0x61,0x6c,0x61,0x67,0x61,
-0x72,0x64,0x2f,0x53,0x79,0x73,0x74,0x65,0x6d,0x42,0x75,0x74,0x74,0x6f,0x6e,0x22,
-0x20,0x4c,0x6f,0x6f,0x6b,0x4e,0x46,0x65,0x65,0x6c,0x3d,0x22,0x54,0x61,0x68,0x61,
-0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x42,0x75,0x74,0x74,0x6f,0x6e,0x22,0x20,
-0x2f,0x3e,0x0a,0x09,0x3c,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x4d,0x61,0x70,
-0x70,0x69,0x6e,0x67,0x20,0x57,0x69,0x6e,0x64,0x6f,0x77,0x54,0x79,0x70,0x65,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x45,0x64,0x69,
-0x74,0x62,0x6f,0x78,0x22,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x54,
-0x61,0x72,0x67,0x65,0x74,0x54,0x79,0x70,0x65,0x3d,0x22,0x43,0x45,0x47,0x55,0x49,
-0x2f,0x45,0x64,0x69,0x74,0x62,0x6f,0x78,0x22,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x52,0x65,0x6e,0x64,0x65,0x72,0x65,0x72,0x3d,0x22,0x46,0x61,0x6c,
-0x61,0x67,0x61,0x72,0x64,0x2f,0x45,0x64,0x69,0x74,0x62,0x6f,0x78,0x22,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x4c,0x6f,0x6f,0x6b,0x4e,0x46,0x65,0x65,
-0x6c,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x45,
-0x64,0x69,0x74,0x62,0x6f,0x78,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x46,0x61,0x6c,
-0x61,0x67,0x61,0x72,0x64,0x4d,0x61,0x70,0x70,0x69,0x6e,0x67,0x20,0x57,0x69,0x6e,
-0x64,0x6f,0x77,0x54,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x2f,0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,0x6e,0x65,0x45,0x64,
-0x69,0x74,0x62,0x6f,0x78,0x22,0x20,0x54,0x61,0x72,0x67,0x65,0x74,0x54,0x79,0x70,
-0x65,0x3d,0x22,0x43,0x45,0x47,0x55,0x49,0x2f,0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,
-0x6e,0x65,0x45,0x64,0x69,0x74,0x62,0x6f,0x78,0x22,0x20,0x52,0x65,0x6e,0x64,0x65,
-0x72,0x65,0x72,0x3d,0x22,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x2f,0x4d,0x75,
-0x6c,0x74,0x69,0x4c,0x69,0x6e,0x65,0x45,0x64,0x69,0x74,0x62,0x6f,0x78,0x22,0x20,
-0x4c,0x6f,0x6f,0x6b,0x4e,0x46,0x65,0x65,0x6c,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x4d,0x75,0x6c,0x74,0x69,0x4c,0x69,0x6e,0x65,
-0x45,0x64,0x69,0x74,0x62,0x6f,0x78,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x46,0x61,
-0x6c,0x61,0x67,0x61,0x72,0x64,0x4d,0x61,0x70,0x70,0x69,0x6e,0x67,0x20,0x57,0x69,
-0x6e,0x64,0x6f,0x77,0x54,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x4d,0x65,0x6e,0x75,0x62,0x61,0x72,0x22,0x20,0x20,
-0x20,0x54,0x61,0x72,0x67,0x65,0x74,0x54,0x79,0x70,0x65,0x3d,0x22,0x43,0x45,0x47,
-0x55,0x49,0x2f,0x4d,0x65,0x6e,0x75,0x62,0x61,0x72,0x22,0x20,0x20,0x20,0x52,0x65,
-0x6e,0x64,0x65,0x72,0x65,0x72,0x3d,0x22,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,
-0x2f,0x4d,0x65,0x6e,0x75,0x62,0x61,0x72,0x22,0x20,0x20,0x20,0x4c,0x6f,0x6f,0x6b,
-0x4e,0x46,0x65,0x65,0x6c,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x2f,0x4d,0x65,0x6e,0x75,0x62,0x61,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x09,
-0x3c,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x4d,0x61,0x70,0x70,0x69,0x6e,0x67,
-0x20,0x57,0x69,0x6e,0x64,0x6f,0x77,0x54,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x50,0x6f,0x70,0x75,0x70,0x4d,0x65,
-0x6e,0x75,0x22,0x20,0x54,0x61,0x72,0x67,0x65,0x74,0x54,0x79,0x70,0x65,0x3d,0x22,
-0x43,0x45,0x47,0x55,0x49,0x2f,0x50,0x6f,0x70,0x75,0x70,0x4d,0x65,0x6e,0x75,0x22,
-0x20,0x52,0x65,0x6e,0x64,0x65,0x72,0x65,0x72,0x3d,0x22,0x46,0x61,0x6c,0x61,0x67,
-0x61,0x72,0x64,0x2f,0x50,0x6f,0x70,0x75,0x70,0x4d,0x65,0x6e,0x75,0x22,0x20,0x4c,
-0x6f,0x6f,0x6b,0x4e,0x46,0x65,0x65,0x6c,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x50,0x6f,0x70,0x75,0x70,0x4d,0x65,0x6e,0x75,0x22,
-0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x4d,0x61,
-0x70,0x70,0x69,0x6e,0x67,0x20,0x57,0x69,0x6e,0x64,0x6f,0x77,0x54,0x79,0x70,0x65,
-0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x4d,0x65,
-0x6e,0x75,0x49,0x74,0x65,0x6d,0x22,0x20,0x20,0x54,0x61,0x72,0x67,0x65,0x74,0x54,
-0x79,0x70,0x65,0x3d,0x22,0x43,0x45,0x47,0x55,0x49,0x2f,0x4d,0x65,0x6e,0x75,0x49,
-0x74,0x65,0x6d,0x22,0x20,0x20,0x52,0x65,0x6e,0x64,0x65,0x72,0x65,0x72,0x3d,0x22,
-0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x2f,0x4d,0x65,0x6e,0x75,0x49,0x74,0x65,
-0x6d,0x22,0x20,0x20,0x4c,0x6f,0x6f,0x6b,0x4e,0x46,0x65,0x65,0x6c,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x4d,0x65,0x6e,0x75,0x49,
-0x74,0x65,0x6d,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x46,0x61,0x6c,0x61,0x67,0x61,
-0x72,0x64,0x4d,0x61,0x70,0x70,0x69,0x6e,0x67,0x20,0x57,0x69,0x6e,0x64,0x6f,0x77,
-0x54,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,
-0x6b,0x2f,0x41,0x6c,0x74,0x65,0x72,0x6e,0x61,0x74,0x65,0x50,0x72,0x6f,0x67,0x72,
-0x65,0x73,0x73,0x42,0x61,0x72,0x22,0x20,0x54,0x61,0x72,0x67,0x65,0x74,0x54,0x79,
-0x70,0x65,0x3d,0x22,0x43,0x45,0x47,0x55,0x49,0x2f,0x50,0x72,0x6f,0x67,0x72,0x65,
-0x73,0x73,0x42,0x61,0x72,0x22,0x20,0x52,0x65,0x6e,0x64,0x65,0x72,0x65,0x72,0x3d,
-0x22,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x2f,0x50,0x72,0x6f,0x67,0x72,0x65,
-0x73,0x73,0x42,0x61,0x72,0x22,0x20,0x4c,0x6f,0x6f,0x6b,0x4e,0x46,0x65,0x65,0x6c,
-0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x41,0x6c,
-0x74,0x50,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x42,0x61,0x72,0x22,0x20,0x2f,0x3e,
-0x0a,0x09,0x3c,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x4d,0x61,0x70,0x70,0x69,
-0x6e,0x67,0x20,0x57,0x69,0x6e,0x64,0x6f,0x77,0x54,0x79,0x70,0x65,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x50,0x72,0x6f,0x67,0x72,
-0x65,0x73,0x73,0x42,0x61,0x72,0x22,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x54,0x61,0x72,0x67,0x65,0x74,0x54,0x79,0x70,0x65,0x3d,0x22,0x43,0x45,0x47,
-0x55,0x49,0x2f,0x50,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x42,0x61,0x72,0x22,0x20,
-0x52,0x65,0x6e,0x64,0x65,0x72,0x65,0x72,0x3d,0x22,0x46,0x61,0x6c,0x61,0x67,0x61,
-0x72,0x64,0x2f,0x50,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x42,0x61,0x72,0x22,0x20,
-0x4c,0x6f,0x6f,0x6b,0x4e,0x46,0x65,0x65,0x6c,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x50,0x72,0x6f,0x67,0x72,0x65,0x73,0x73,0x42,
-0x61,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,
-0x64,0x4d,0x61,0x70,0x70,0x69,0x6e,0x67,0x20,0x57,0x69,0x6e,0x64,0x6f,0x77,0x54,
-0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x2f,0x56,0x55,0x4d,0x65,0x74,0x65,0x72,0x22,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x54,0x61,0x72,0x67,0x65,0x74,0x54,0x79,0x70,
-0x65,0x3d,0x22,0x43,0x45,0x47,0x55,0x49,0x2f,0x50,0x72,0x6f,0x67,0x72,0x65,0x73,
-0x73,0x42,0x61,0x72,0x22,0x20,0x52,0x65,0x6e,0x64,0x65,0x72,0x65,0x72,0x3d,0x22,
-0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x2f,0x50,0x72,0x6f,0x67,0x72,0x65,0x73,
-0x73,0x42,0x61,0x72,0x22,0x20,0x4c,0x6f,0x6f,0x6b,0x4e,0x46,0x65,0x65,0x6c,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x56,0x55,0x4d,
-0x65,0x74,0x65,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x46,0x61,0x6c,0x61,0x67,
-0x61,0x72,0x64,0x4d,0x61,0x70,0x70,0x69,0x6e,0x67,0x20,0x57,0x69,0x6e,0x64,0x6f,
-0x77,0x54,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x2f,0x56,0x65,0x72,0x74,0x69,0x63,0x61,0x6c,0x53,0x63,0x72,0x6f,0x6c,
-0x6c,0x62,0x61,0x72,0x22,0x20,0x20,0x20,0x54,0x61,0x72,0x67,0x65,0x74,0x54,0x79,
-0x70,0x65,0x3d,0x22,0x43,0x45,0x47,0x55,0x49,0x2f,0x53,0x63,0x72,0x6f,0x6c,0x6c,
-0x62,0x61,0x72,0x22,0x20,0x52,0x65,0x6e,0x64,0x65,0x72,0x65,0x72,0x3d,0x22,0x46,
-0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x2f,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,
-0x72,0x22,0x20,0x4c,0x6f,0x6f,0x6b,0x4e,0x46,0x65,0x65,0x6c,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x56,0x65,0x72,0x74,0x69,0x63,
-0x61,0x6c,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x22,0x20,0x2f,0x3e,0x0a,
-0x09,0x3c,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x4d,0x61,0x70,0x70,0x69,0x6e,
-0x67,0x20,0x57,0x69,0x6e,0x64,0x6f,0x77,0x54,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x48,0x6f,0x72,0x69,0x7a,0x6f,
-0x6e,0x74,0x61,0x6c,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x22,0x20,0x54,
-0x61,0x72,0x67,0x65,0x74,0x54,0x79,0x70,0x65,0x3d,0x22,0x43,0x45,0x47,0x55,0x49,
-0x2f,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x22,0x20,0x52,0x65,0x6e,0x64,
-0x65,0x72,0x65,0x72,0x3d,0x22,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x2f,0x53,
-0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x22,0x20,0x4c,0x6f,0x6f,0x6b,0x4e,0x46,
-0x65,0x65,0x6c,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x2f,0x48,0x6f,0x72,0x69,0x7a,0x6f,0x6e,0x74,0x61,0x6c,0x53,0x63,0x72,0x6f,0x6c,
-0x6c,0x62,0x61,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x46,0x61,0x6c,0x61,0x67,
-0x61,0x72,0x64,0x4d,0x61,0x70,0x70,0x69,0x6e,0x67,0x20,0x57,0x69,0x6e,0x64,0x6f,
-0x77,0x54,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,
-0x6f,0x6b,0x2f,0x56,0x65,0x72,0x74,0x69,0x63,0x61,0x6c,0x53,0x63,0x72,0x6f,0x6c,
-0x6c,0x62,0x61,0x72,0x54,0x68,0x75,0x6d,0x62,0x22,0x20,0x20,0x20,0x54,0x61,0x72,
-0x67,0x65,0x74,0x54,0x79,0x70,0x65,0x3d,0x22,0x43,0x45,0x47,0x55,0x49,0x2f,0x54,
-0x68,0x75,0x6d,0x62,0x22,0x20,0x52,0x65,0x6e,0x64,0x65,0x72,0x65,0x72,0x3d,0x22,
-0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x2f,0x42,0x75,0x74,0x74,0x6f,0x6e,0x22,
-0x20,0x4c,0x6f,0x6f,0x6b,0x4e,0x46,0x65,0x65,0x6c,0x3d,0x22,0x54,0x61,0x68,0x61,
-0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x56,0x65,0x72,0x74,0x69,0x63,0x61,0x6c,
-0x53,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x54,0x68,0x75,0x6d,0x62,0x22,0x20,
-0x2f,0x3e,0x0a,0x09,0x3c,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x4d,0x61,0x70,
-0x70,0x69,0x6e,0x67,0x20,0x57,0x69,0x6e,0x64,0x6f,0x77,0x54,0x79,0x70,0x65,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x48,0x6f,0x72,
-0x69,0x7a,0x6f,0x6e,0x74,0x61,0x6c,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,
-0x54,0x68,0x75,0x6d,0x62,0x22,0x20,0x54,0x61,0x72,0x67,0x65,0x74,0x54,0x79,0x70,
-0x65,0x3d,0x22,0x43,0x45,0x47,0x55,0x49,0x2f,0x54,0x68,0x75,0x6d,0x62,0x22,0x20,
-0x52,0x65,0x6e,0x64,0x65,0x72,0x65,0x72,0x3d,0x22,0x46,0x61,0x6c,0x61,0x67,0x61,
-0x72,0x64,0x2f,0x42,0x75,0x74,0x74,0x6f,0x6e,0x22,0x20,0x4c,0x6f,0x6f,0x6b,0x4e,
-0x46,0x65,0x65,0x6c,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,
-0x6b,0x2f,0x48,0x6f,0x72,0x69,0x7a,0x6f,0x6e,0x74,0x61,0x6c,0x53,0x63,0x72,0x6f,
-0x6c,0x6c,0x62,0x61,0x72,0x54,0x68,0x75,0x6d,0x62,0x22,0x20,0x2f,0x3e,0x0a,0x09,
-0x3c,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x4d,0x61,0x70,0x70,0x69,0x6e,0x67,
-0x20,0x57,0x69,0x6e,0x64,0x6f,0x77,0x54,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x4c,0x61,0x72,0x67,0x65,0x56,0x65,
-0x72,0x74,0x69,0x63,0x61,0x6c,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x22,
-0x20,0x20,0x20,0x20,0x20,0x20,0x54,0x61,0x72,0x67,0x65,0x74,0x54,0x79,0x70,0x65,
-0x3d,0x22,0x43,0x45,0x47,0x55,0x49,0x2f,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,
-0x72,0x22,0x20,0x52,0x65,0x6e,0x64,0x65,0x72,0x65,0x72,0x3d,0x22,0x46,0x61,0x6c,
-0x61,0x67,0x61,0x72,0x64,0x2f,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x22,
-0x20,0x4c,0x6f,0x6f,0x6b,0x4e,0x46,0x65,0x65,0x6c,0x3d,0x22,0x54,0x61,0x68,0x61,
-0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x4c,0x61,0x72,0x67,0x65,0x56,0x65,0x72,
-0x74,0x69,0x63,0x61,0x6c,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x62,0x61,0x72,0x22,0x20,
-0x2f,0x3e,0x0a,0x09,0x3c,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x4d,0x61,0x70,
-0x70,0x69,0x6e,0x67,0x20,0x57,0x69,0x6e,0x64,0x6f,0x77,0x54,0x79,0x70,0x65,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x4c,0x61,0x72,
-0x67,0x65,0x56,0x65,0x72,0x74,0x69,0x63,0x61,0x6c,0x53,0x63,0x72,0x6f,0x6c,0x6c,
-0x62,0x61,0x72,0x54,0x68,0x75,0x6d,0x62,0x22,0x20,0x54,0x61,0x72,0x67,0x65,0x74,
-0x54,0x79,0x70,0x65,0x3d,0x22,0x43,0x45,0x47,0x55,0x49,0x2f,0x54,0x68,0x75,0x6d,
-0x62,0x22,0x20,0x20,0x20,0x20,0x20,0x52,0x65,0x6e,0x64,0x65,0x72,0x65,0x72,0x3d,
-0x22,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x2f,0x42,0x75,0x74,0x74,0x6f,0x6e,
-0x22,0x20,0x20,0x20,0x20,0x4c,0x6f,0x6f,0x6b,0x4e,0x46,0x65,0x65,0x6c,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x4c,0x61,0x72,0x67,
-0x65,0x56,0x65,0x72,0x74,0x69,0x63,0x61,0x6c,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x62,
-0x61,0x72,0x54,0x68,0x75,0x6d,0x62,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x46,0x61,
-0x6c,0x61,0x67,0x61,0x72,0x64,0x4d,0x61,0x70,0x70,0x69,0x6e,0x67,0x20,0x57,0x69,
-0x6e,0x64,0x6f,0x77,0x54,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x22,
-0x20,0x20,0x54,0x61,0x72,0x67,0x65,0x74,0x54,0x79,0x70,0x65,0x3d,0x22,0x43,0x45,
-0x47,0x55,0x49,0x2f,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x22,0x20,0x20,
-0x52,0x65,0x6e,0x64,0x65,0x72,0x65,0x72,0x3d,0x22,0x46,0x61,0x6c,0x61,0x67,0x61,
-0x72,0x64,0x2f,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x22,0x20,0x20,0x4c,
-0x6f,0x6f,0x6b,0x4e,0x46,0x65,0x65,0x6c,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x22,
-0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x4d,0x61,
-0x70,0x70,0x69,0x6e,0x67,0x20,0x57,0x69,0x6e,0x64,0x6f,0x77,0x54,0x79,0x70,0x65,
-0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x54,0x61,
-0x62,0x43,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x22,0x20,0x54,0x61,0x72,0x67,0x65,0x74,
-0x54,0x79,0x70,0x65,0x3d,0x22,0x43,0x45,0x47,0x55,0x49,0x2f,0x54,0x61,0x62,0x43,
-0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x22,0x20,0x52,0x65,0x6e,0x64,0x65,0x72,0x65,0x72,
-0x3d,0x22,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x2f,0x54,0x61,0x62,0x43,0x6f,
-0x6e,0x74,0x72,0x6f,0x6c,0x22,0x20,0x4c,0x6f,0x6f,0x6b,0x4e,0x46,0x65,0x65,0x6c,
-0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x54,0x61,
-0x62,0x43,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x46,
-0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x4d,0x61,0x70,0x70,0x69,0x6e,0x67,0x20,0x57,
-0x69,0x6e,0x64,0x6f,0x77,0x54,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x54,0x61,0x62,0x43,0x6f,0x6e,0x74,0x65,0x6e,
-0x74,0x50,0x61,0x6e,0x65,0x22,0x20,0x20,0x20,0x20,0x54,0x61,0x72,0x67,0x65,0x74,
-0x54,0x79,0x70,0x65,0x3d,0x22,0x44,0x65,0x66,0x61,0x75,0x6c,0x74,0x57,0x69,0x6e,
-0x64,0x6f,0x77,0x22,0x20,0x20,0x20,0x20,0x52,0x65,0x6e,0x64,0x65,0x72,0x65,0x72,
-0x3d,0x22,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x2f,0x44,0x65,0x66,0x61,0x75,
-0x6c,0x74,0x22,0x20,0x20,0x20,0x20,0x4c,0x6f,0x6f,0x6b,0x4e,0x46,0x65,0x65,0x6c,
-0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x54,0x61,
-0x62,0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x50,0x61,0x6e,0x65,0x22,0x20,0x2f,0x3e,
-0x0a,0x09,0x3c,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x4d,0x61,0x70,0x70,0x69,
-0x6e,0x67,0x20,0x57,0x69,0x6e,0x64,0x6f,0x77,0x54,0x79,0x70,0x65,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x54,0x61,0x62,0x42,0x75,
-0x74,0x74,0x6f,0x6e,0x50,0x61,0x6e,0x65,0x22,0x20,0x20,0x20,0x20,0x54,0x61,0x72,
-0x67,0x65,0x74,0x54,0x79,0x70,0x65,0x3d,0x22,0x44,0x65,0x66,0x61,0x75,0x6c,0x74,
-0x57,0x69,0x6e,0x64,0x6f,0x77,0x22,0x20,0x20,0x20,0x20,0x52,0x65,0x6e,0x64,0x65,
-0x72,0x65,0x72,0x3d,0x22,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x2f,0x44,0x65,
-0x66,0x61,0x75,0x6c,0x74,0x22,0x20,0x20,0x20,0x20,0x4c,0x6f,0x6f,0x6b,0x4e,0x46,
-0x65,0x65,0x6c,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x2f,0x54,0x61,0x62,0x42,0x75,0x74,0x74,0x6f,0x6e,0x50,0x61,0x6e,0x65,0x22,0x20,
-0x2f,0x3e,0x0a,0x09,0x3c,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x4d,0x61,0x70,
-0x70,0x69,0x6e,0x67,0x20,0x57,0x69,0x6e,0x64,0x6f,0x77,0x54,0x79,0x70,0x65,0x3d,
-0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x43,0x6f,0x6d,
-0x62,0x6f,0x44,0x72,0x6f,0x70,0x4c,0x69,0x73,0x74,0x22,0x20,0x54,0x61,0x72,0x67,
-0x65,0x74,0x54,0x79,0x70,0x65,0x3d,0x22,0x43,0x45,0x47,0x55,0x49,0x2f,0x43,0x6f,
-0x6d,0x62,0x6f,0x44,0x72,0x6f,0x70,0x4c,0x69,0x73,0x74,0x22,0x20,0x52,0x65,0x6e,
-0x64,0x65,0x72,0x65,0x72,0x3d,0x22,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x2f,
-0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,0x22,0x20,0x4c,0x6f,0x6f,0x6b,0x4e,0x46,0x65,
-0x65,0x6c,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,
-0x43,0x6f,0x6d,0x62,0x6f,0x44,0x72,0x6f,0x70,0x4c,0x69,0x73,0x74,0x22,0x20,0x2f,
-0x3e,0x0a,0x09,0x3c,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x4d,0x61,0x70,0x70,
-0x69,0x6e,0x67,0x20,0x57,0x69,0x6e,0x64,0x6f,0x77,0x54,0x79,0x70,0x65,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x43,0x6f,0x6d,0x62,
-0x6f,0x45,0x64,0x69,0x74,0x62,0x6f,0x78,0x22,0x20,0x20,0x54,0x61,0x72,0x67,0x65,
-0x74,0x54,0x79,0x70,0x65,0x3d,0x22,0x43,0x45,0x47,0x55,0x49,0x2f,0x45,0x64,0x69,
-0x74,0x62,0x6f,0x78,0x22,0x09,0x20,0x52,0x65,0x6e,0x64,0x65,0x72,0x65,0x72,0x3d,
-0x22,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x2f,0x45,0x64,0x69,0x74,0x62,0x6f,
-0x78,0x22,0x20,0x4c,0x6f,0x6f,0x6b,0x4e,0x46,0x65,0x65,0x6c,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x43,0x6f,0x6d,0x62,0x6f,0x45,
-0x64,0x69,0x74,0x62,0x6f,0x78,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x46,0x61,0x6c,
-0x61,0x67,0x61,0x72,0x64,0x4d,0x61,0x70,0x70,0x69,0x6e,0x67,0x20,0x57,0x69,0x6e,
-0x64,0x6f,0x77,0x54,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x2f,0x43,0x6f,0x6d,0x62,0x6f,0x62,0x6f,0x78,0x22,0x09,0x54,
-0x61,0x72,0x67,0x65,0x74,0x54,0x79,0x70,0x65,0x3d,0x22,0x43,0x45,0x47,0x55,0x49,
-0x2f,0x43,0x6f,0x6d,0x62,0x6f,0x62,0x6f,0x78,0x22,0x09,0x20,0x52,0x65,0x6e,0x64,
-0x65,0x72,0x65,0x72,0x3d,0x22,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x2f,0x44,
-0x65,0x66,0x61,0x75,0x6c,0x74,0x22,0x20,0x4c,0x6f,0x6f,0x6b,0x4e,0x46,0x65,0x65,
-0x6c,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x43,
-0x6f,0x6d,0x62,0x6f,0x62,0x6f,0x78,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x46,0x61,
-0x6c,0x61,0x67,0x61,0x72,0x64,0x4d,0x61,0x70,0x70,0x69,0x6e,0x67,0x20,0x57,0x69,
-0x6e,0x64,0x6f,0x77,0x54,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,0x22,0x20,0x20,
-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x54,0x61,0x72,0x67,0x65,0x74,0x54,
-0x79,0x70,0x65,0x3d,0x22,0x43,0x45,0x47,0x55,0x49,0x2f,0x4c,0x69,0x73,0x74,0x62,
-0x6f,0x78,0x22,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x52,0x65,
-0x6e,0x64,0x65,0x72,0x65,0x72,0x3d,0x22,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,
-0x2f,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,0x22,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x4c,0x6f,0x6f,0x6b,0x4e,0x46,0x65,0x65,0x6c,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x4c,0x69,0x73,0x74,0x62,
-0x6f,0x78,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,
-0x64,0x4d,0x61,0x70,0x70,0x69,0x6e,0x67,0x20,0x57,0x69,0x6e,0x64,0x6f,0x77,0x54,
-0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x2f,0x4c,0x69,0x73,0x74,0x48,0x65,0x61,0x64,0x65,0x72,0x22,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x20,0x54,0x61,0x72,0x67,0x65,0x74,0x54,0x79,0x70,0x65,0x3d,0x22,
-0x43,0x45,0x47,0x55,0x49,0x2f,0x4c,0x69,0x73,0x74,0x48,0x65,0x61,0x64,0x65,0x72,
-0x22,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x52,0x65,0x6e,0x64,0x65,0x72,0x65,
-0x72,0x3d,0x22,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x2f,0x4c,0x69,0x73,0x74,
-0x48,0x65,0x61,0x64,0x65,0x72,0x22,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x4c,
-0x6f,0x6f,0x6b,0x4e,0x46,0x65,0x65,0x6c,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x4c,0x69,0x73,0x74,0x48,0x65,0x61,0x64,0x65,0x72,
-0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x4d,
-0x61,0x70,0x70,0x69,0x6e,0x67,0x20,0x57,0x69,0x6e,0x64,0x6f,0x77,0x54,0x79,0x70,
-0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x4c,
-0x69,0x73,0x74,0x48,0x65,0x61,0x64,0x65,0x72,0x53,0x65,0x67,0x6d,0x65,0x6e,0x74,
-0x22,0x20,0x54,0x61,0x72,0x67,0x65,0x74,0x54,0x79,0x70,0x65,0x3d,0x22,0x43,0x45,
-0x47,0x55,0x49,0x2f,0x4c,0x69,0x73,0x74,0x48,0x65,0x61,0x64,0x65,0x72,0x53,0x65,
-0x67,0x6d,0x65,0x6e,0x74,0x22,0x20,0x52,0x65,0x6e,0x64,0x65,0x72,0x65,0x72,0x3d,
-0x22,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x2f,0x4c,0x69,0x73,0x74,0x48,0x65,
-0x61,0x64,0x65,0x72,0x53,0x65,0x67,0x6d,0x65,0x6e,0x74,0x22,0x20,0x4c,0x6f,0x6f,
-0x6b,0x4e,0x46,0x65,0x65,0x6c,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,
-0x6f,0x6f,0x6b,0x2f,0x4c,0x69,0x73,0x74,0x48,0x65,0x61,0x64,0x65,0x72,0x53,0x65,
-0x67,0x6d,0x65,0x6e,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x46,0x61,0x6c,0x61,
-0x67,0x61,0x72,0x64,0x4d,0x61,0x70,0x70,0x69,0x6e,0x67,0x20,0x57,0x69,0x6e,0x64,
-0x6f,0x77,0x54,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,
-0x6f,0x6f,0x6b,0x2f,0x4d,0x75,0x6c,0x74,0x69,0x43,0x6f,0x6c,0x75,0x6d,0x6e,0x4c,
-0x69,0x73,0x74,0x22,0x20,0x20,0x20,0x54,0x61,0x72,0x67,0x65,0x74,0x54,0x79,0x70,
-0x65,0x3d,0x22,0x43,0x45,0x47,0x55,0x49,0x2f,0x4d,0x75,0x6c,0x74,0x69,0x43,0x6f,
-0x6c,0x75,0x6d,0x6e,0x4c,0x69,0x73,0x74,0x22,0x20,0x20,0x20,0x52,0x65,0x6e,0x64,
-0x65,0x72,0x65,0x72,0x3d,0x22,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x2f,0x4d,
-0x75,0x6c,0x74,0x69,0x43,0x6f,0x6c,0x75,0x6d,0x6e,0x4c,0x69,0x73,0x74,0x22,0x20,
-0x20,0x20,0x4c,0x6f,0x6f,0x6b,0x4e,0x46,0x65,0x65,0x6c,0x3d,0x22,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x4d,0x75,0x6c,0x74,0x69,0x43,0x6f,
-0x6c,0x75,0x6d,0x6e,0x4c,0x69,0x73,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x46,
-0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x4d,0x61,0x70,0x70,0x69,0x6e,0x67,0x20,0x57,
-0x69,0x6e,0x64,0x6f,0x77,0x54,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x53,0x6c,0x69,0x64,0x65,0x72,0x22,0x20,0x20,
-0x20,0x20,0x20,0x20,0x54,0x61,0x72,0x67,0x65,0x74,0x54,0x79,0x70,0x65,0x3d,0x22,
-0x43,0x45,0x47,0x55,0x49,0x2f,0x53,0x6c,0x69,0x64,0x65,0x72,0x22,0x20,0x20,0x20,
-0x20,0x20,0x20,0x52,0x65,0x6e,0x64,0x65,0x72,0x65,0x72,0x3d,0x22,0x46,0x61,0x6c,
-0x61,0x67,0x61,0x72,0x64,0x2f,0x53,0x6c,0x69,0x64,0x65,0x72,0x22,0x20,0x20,0x4c,
-0x6f,0x6f,0x6b,0x4e,0x46,0x65,0x65,0x6c,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,
-0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x53,0x6c,0x69,0x64,0x65,0x72,0x22,0x20,0x2f,0x3e,
-0x0a,0x09,0x3c,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x4d,0x61,0x70,0x70,0x69,
-0x6e,0x67,0x20,0x57,0x69,0x6e,0x64,0x6f,0x77,0x54,0x79,0x70,0x65,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x53,0x6c,0x69,0x64,0x65,
-0x72,0x54,0x68,0x75,0x6d,0x62,0x22,0x20,0x54,0x61,0x72,0x67,0x65,0x74,0x54,0x79,
-0x70,0x65,0x3d,0x22,0x43,0x45,0x47,0x55,0x49,0x2f,0x54,0x68,0x75,0x6d,0x62,0x22,
-0x20,0x52,0x65,0x6e,0x64,0x65,0x72,0x65,0x72,0x3d,0x22,0x46,0x61,0x6c,0x61,0x67,
-0x61,0x72,0x64,0x2f,0x42,0x75,0x74,0x74,0x6f,0x6e,0x22,0x20,0x20,0x4c,0x6f,0x6f,
-0x6b,0x4e,0x46,0x65,0x65,0x6c,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,
-0x6f,0x6f,0x6b,0x2f,0x53,0x6c,0x69,0x64,0x65,0x72,0x54,0x68,0x75,0x6d,0x62,0x22,
-0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x4d,0x61,
-0x70,0x70,0x69,0x6e,0x67,0x20,0x57,0x69,0x6e,0x64,0x6f,0x77,0x54,0x79,0x70,0x65,
-0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x53,0x63,
-0x72,0x6f,0x6c,0x6c,0x61,0x62,0x6c,0x65,0x50,0x61,0x6e,0x65,0x22,0x20,0x54,0x61,
-0x72,0x67,0x65,0x74,0x54,0x79,0x70,0x65,0x3d,0x22,0x43,0x45,0x47,0x55,0x49,0x2f,
-0x53,0x63,0x72,0x6f,0x6c,0x6c,0x61,0x62,0x6c,0x65,0x50,0x61,0x6e,0x65,0x22,0x20,
-0x52,0x65,0x6e,0x64,0x65,0x72,0x65,0x72,0x3d,0x22,0x46,0x61,0x6c,0x61,0x67,0x61,
-0x72,0x64,0x2f,0x53,0x63,0x72,0x6f,0x6c,0x6c,0x61,0x62,0x6c,0x65,0x50,0x61,0x6e,
-0x65,0x22,0x20,0x4c,0x6f,0x6f,0x6b,0x4e,0x46,0x65,0x65,0x6c,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x53,0x63,0x72,0x6f,0x6c,0x6c,
-0x61,0x62,0x6c,0x65,0x50,0x61,0x6e,0x65,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x46,
-0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x4d,0x61,0x70,0x70,0x69,0x6e,0x67,0x20,0x57,
-0x69,0x6e,0x64,0x6f,0x77,0x54,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x53,0x70,0x69,0x6e,0x6e,0x65,0x72,0x22,0x20,
-0x54,0x61,0x72,0x67,0x65,0x74,0x54,0x79,0x70,0x65,0x3d,0x22,0x43,0x45,0x47,0x55,
-0x49,0x2f,0x53,0x70,0x69,0x6e,0x6e,0x65,0x72,0x22,0x20,0x52,0x65,0x6e,0x64,0x65,
-0x72,0x65,0x72,0x3d,0x22,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x2f,0x44,0x65,
-0x66,0x61,0x75,0x6c,0x74,0x22,0x20,0x4c,0x6f,0x6f,0x6b,0x4e,0x46,0x65,0x65,0x6c,
-0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x53,0x70,
-0x69,0x6e,0x6e,0x65,0x72,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x46,0x61,0x6c,0x61,
-0x67,0x61,0x72,0x64,0x4d,0x61,0x70,0x70,0x69,0x6e,0x67,0x20,0x57,0x69,0x6e,0x64,
-0x6f,0x77,0x54,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,
-0x6f,0x6f,0x6b,0x2f,0x54,0x6f,0x6f,0x6c,0x74,0x69,0x70,0x22,0x20,0x54,0x61,0x72,
-0x67,0x65,0x74,0x54,0x79,0x70,0x65,0x3d,0x22,0x43,0x45,0x47,0x55,0x49,0x2f,0x54,
-0x6f,0x6f,0x6c,0x74,0x69,0x70,0x22,0x20,0x52,0x65,0x6e,0x64,0x65,0x72,0x65,0x72,
-0x3d,0x22,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x2f,0x54,0x6f,0x6f,0x6c,0x74,
-0x69,0x70,0x22,0x20,0x4c,0x6f,0x6f,0x6b,0x4e,0x46,0x65,0x65,0x6c,0x3d,0x22,0x54,
-0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x54,0x6f,0x6f,0x6c,0x74,
-0x69,0x70,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,
-0x64,0x4d,0x61,0x70,0x70,0x69,0x6e,0x67,0x20,0x57,0x69,0x6e,0x64,0x6f,0x77,0x54,
-0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,
-0x2f,0x53,0x74,0x61,0x74,0x69,0x63,0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x54,0x61,
-0x72,0x67,0x65,0x74,0x54,0x79,0x70,0x65,0x3d,0x22,0x44,0x65,0x66,0x61,0x75,0x6c,
-0x74,0x57,0x69,0x6e,0x64,0x6f,0x77,0x22,0x20,0x52,0x65,0x6e,0x64,0x65,0x72,0x65,
-0x72,0x3d,0x22,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x2f,0x53,0x74,0x61,0x74,
-0x69,0x63,0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x4c,0x6f,0x6f,0x6b,0x4e,0x46,0x65,
-0x65,0x6c,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,
-0x53,0x74,0x61,0x74,0x69,0x63,0x49,0x6d,0x61,0x67,0x65,0x22,0x20,0x2f,0x3e,0x0a,
-0x09,0x3c,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x4d,0x61,0x70,0x70,0x69,0x6e,
-0x67,0x20,0x57,0x69,0x6e,0x64,0x6f,0x77,0x54,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,
-0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x53,0x74,0x61,0x74,0x69,0x63,
-0x54,0x65,0x78,0x74,0x22,0x20,0x20,0x54,0x61,0x72,0x67,0x65,0x74,0x54,0x79,0x70,
-0x65,0x3d,0x22,0x44,0x65,0x66,0x61,0x75,0x6c,0x74,0x57,0x69,0x6e,0x64,0x6f,0x77,
-0x22,0x20,0x52,0x65,0x6e,0x64,0x65,0x72,0x65,0x72,0x3d,0x22,0x46,0x61,0x6c,0x61,
-0x67,0x61,0x72,0x64,0x2f,0x53,0x74,0x61,0x74,0x69,0x63,0x54,0x65,0x78,0x74,0x22,
-0x20,0x20,0x4c,0x6f,0x6f,0x6b,0x4e,0x46,0x65,0x65,0x6c,0x3d,0x22,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x53,0x74,0x61,0x74,0x69,0x63,0x54,
-0x65,0x78,0x74,0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x46,0x61,0x6c,0x61,0x67,0x61,
-0x72,0x64,0x4d,0x61,0x70,0x70,0x69,0x6e,0x67,0x20,0x57,0x69,0x6e,0x64,0x6f,0x77,
-0x54,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,
-0x6b,0x2f,0x49,0x74,0x65,0x6d,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,0x22,0x20,0x54,
-0x61,0x72,0x67,0x65,0x74,0x54,0x79,0x70,0x65,0x3d,0x22,0x43,0x45,0x47,0x55,0x49,
-0x2f,0x49,0x74,0x65,0x6d,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,0x22,0x20,0x52,0x65,
-0x6e,0x64,0x65,0x72,0x65,0x72,0x3d,0x22,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,
-0x2f,0x49,0x74,0x65,0x6d,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,0x22,0x20,0x4c,0x6f,
-0x6f,0x6b,0x4e,0x46,0x65,0x65,0x6c,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x2f,0x49,0x74,0x65,0x6d,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,
-0x22,0x20,0x2f,0x3e,0x0a,0x09,0x3c,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x4d,
-0x61,0x70,0x70,0x69,0x6e,0x67,0x20,0x57,0x69,0x6e,0x64,0x6f,0x77,0x54,0x79,0x70,
-0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x4c,
-0x69,0x73,0x74,0x62,0x6f,0x78,0x49,0x74,0x65,0x6d,0x22,0x20,0x54,0x61,0x72,0x67,
-0x65,0x74,0x54,0x79,0x70,0x65,0x3d,0x22,0x43,0x45,0x47,0x55,0x49,0x2f,0x49,0x74,
-0x65,0x6d,0x45,0x6e,0x74,0x72,0x79,0x22,0x20,0x20,0x20,0x52,0x65,0x6e,0x64,0x65,
-0x72,0x65,0x72,0x3d,0x22,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x2f,0x49,0x74,
-0x65,0x6d,0x45,0x6e,0x74,0x72,0x79,0x22,0x20,0x20,0x20,0x4c,0x6f,0x6f,0x6b,0x4e,
-0x46,0x65,0x65,0x6c,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,
-0x6b,0x2f,0x4c,0x69,0x73,0x74,0x62,0x6f,0x78,0x49,0x74,0x65,0x6d,0x22,0x20,0x2f,
-0x3e,0x0a,0x09,0x3c,0x46,0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x4d,0x61,0x70,0x70,
-0x69,0x6e,0x67,0x20,0x57,0x69,0x6e,0x64,0x6f,0x77,0x54,0x79,0x70,0x65,0x3d,0x22,
-0x54,0x61,0x68,0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x47,0x72,0x6f,0x75,
-0x70,0x42,0x6f,0x78,0x22,0x20,0x54,0x61,0x72,0x67,0x65,0x74,0x54,0x79,0x70,0x65,
-0x3d,0x22,0x43,0x45,0x47,0x55,0x49,0x2f,0x47,0x72,0x6f,0x75,0x70,0x42,0x6f,0x78,
-0x22,0x20,0x20,0x20,0x52,0x65,0x6e,0x64,0x65,0x72,0x65,0x72,0x3d,0x22,0x46,0x61,
-0x6c,0x61,0x67,0x61,0x72,0x64,0x2f,0x44,0x65,0x66,0x61,0x75,0x6c,0x74,0x22,0x20,
-0x20,0x20,0x4c,0x6f,0x6f,0x6b,0x4e,0x46,0x65,0x65,0x6c,0x3d,0x22,0x54,0x61,0x68,
-0x61,0x72,0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x47,0x72,0x6f,0x75,0x70,0x42,0x6f,
-0x78,0x22,0x20,0x2f,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x46,0x61,0x6c,
-0x61,0x67,0x61,0x72,0x64,0x4d,0x61,0x70,0x70,0x69,0x6e,0x67,0x20,0x57,0x69,0x6e,
-0x64,0x6f,0x77,0x54,0x79,0x70,0x65,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,0x65,0x7a,
-0x4c,0x6f,0x6f,0x6b,0x2f,0x54,0x72,0x65,0x65,0x22,0x20,0x54,0x61,0x72,0x67,0x65,
-0x74,0x54,0x79,0x70,0x65,0x3d,0x22,0x43,0x45,0x47,0x55,0x49,0x2f,0x54,0x72,0x65,
-0x65,0x22,0x20,0x20,0x20,0x52,0x65,0x6e,0x64,0x65,0x72,0x65,0x72,0x3d,0x22,0x46,
-0x61,0x6c,0x61,0x67,0x61,0x72,0x64,0x2f,0x54,0x72,0x65,0x65,0x22,0x20,0x20,0x20,
-0x4c,0x6f,0x6f,0x6b,0x4e,0x46,0x65,0x65,0x6c,0x3d,0x22,0x54,0x61,0x68,0x61,0x72,
-0x65,0x7a,0x4c,0x6f,0x6f,0x6b,0x2f,0x54,0x72,0x65,0x65,0x22,0x20,0x2f,0x3e,0x0a,
-0x3c,0x2f,0x47,0x55,0x49,0x53,0x63,0x68,0x65,0x6d,0x65,0x3e,0x0a};
diff --git a/client/gui/taharez_look.tga.c b/client/gui/taharez_look.tga.c
deleted file mode 100644
index 2ccdb9c2..00000000
--- a/client/gui/taharez_look.tga.c
+++ /dev/null
@@ -1,16388 +0,0 @@
-const unsigned char taharez_look_tga[] = {
-0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,
-0x20,0x08,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0x00,0x45,0x3f,
-0x35,0x00,0x45,0x3f,0x35,0x00,0x45,0x3f,0x35,0x00,0x45,0x3f,0x35,0x00,0x45,0x3f,
-0x35,0x00,0x45,0x3f,0x35,0x00,0x45,0x3f,0x35,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0x00,0x45,0x3f,0x35,0x00,0x45,0x3f,0x35,0x00,0x45,0x3f,
-0x35,0x00,0x45,0x3f,0x35,0x00,0x45,0x3f,0x35,0x00,0x45,0x3f,0x35,0x00,0x45,0x3f,
-0x35,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0x00,0x45,0x3f,
-0x35,0x00,0x45,0x3f,0x35,0x00,0x45,0x3f,0x35,0x00,0x45,0x3f,0x35,0x00,0x45,0x3f,
-0x35,0x00,0x45,0x3f,0x35,0x00,0x45,0x3f,0x35,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0x00,0x6b,0x62,
-0x53,0x00,0x45,0x3f,0x35,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x45,0x3f,
-0x35,0x00,0x6b,0x62,0x53,0x00,0x45,0x3f,0x35,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0x00,0x45,0x3f,
-0x35,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x45,0x3f,0x35,0x00,0x45,0x3f,0x35,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0x00,0x45,0x3f,
-0x35,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x45,0x3f,0x35,0x00,0x45,0x3f,0x35,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0x00,0x45,0x3f,
-0x35,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x45,0x3f,0x35,0x00,0x45,0x3f,0x35,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x45,0x3f,0x35,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x45,0x3f,0x35,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0x3c,0x00,0xfc,0x65,0x0d,0x00,0xfc,0x65,0x06,0x00,0xfc,
-0x65,0x1d,0x00,0xfc,0x65,0x18,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0x18,0x00,0xfc,0x65,0x1c,0x00,0xfc,
-0x65,0x06,0x00,0xfc,0x65,0x0d,0x00,0xfc,0x65,0x37,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x45,0x3f,0x35,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0x97,0x00,0xfc,0x65,0xed,0x00,0xfc,0x65,0xeb,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0x18,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0x18,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xed,0x00,0xfc,0x65,0xed,0x00,0xfc,0x65,0x98,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0x98,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0x1c,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0x1d,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0x98,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0x1c,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0x47,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xed,0x00,0xfc,0x65,0x06,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0x06,0x00,0xfc,0x65,0xeb,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0x49,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0x17,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x45,0x3f,0x35,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0xa5,0x00,0xfc,0x65,0x96,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0x50,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0x49,0x00,0xfc,
-0x65,0x98,0x00,0xfc,0x65,0xed,0x00,0xfc,0x65,0x0d,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0x0d,0x00,0xfc,0x65,0xed,0x00,0xfc,0x65,0x98,0x00,0xfc,
-0x65,0x47,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0x49,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0x96,0x00,0xfc,0x65,0xa0,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x45,0x3f,0x35,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0xb8,0x00,0xfc,0x65,0x96,0x00,0xfc,0x65,0x8b,0x00,0xfc,
-0x65,0x6a,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0x49,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0x98,0x00,0xfc,0x65,0x37,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0x3c,0x00,0xfc,0x65,0x97,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0x50,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0x65,0x00,0xfc,
-0x65,0x84,0x00,0xfc,0x65,0x96,0x00,0xfc,0x65,0xb7,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x45,0x3f,0x35,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xe7,0x00,0xfc,0x65,0xd0,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0x65,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0x6a,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xd5,0x00,0xfc,0x65,0xe4,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x45,0x3f,0x35,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0x39,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0x48,0x00,0xfc,
-0x65,0xd5,0x00,0xfc,0x65,0x84,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0x8b,0x00,0xfc,0x65,0xd0,0x00,0xfc,
-0x65,0x48,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0x37,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x45,0x3f,0x35,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0x0e,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0x57,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xe4,0x00,0xfc,0x65,0x96,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0x96,0x00,0xfc,0x65,0xe7,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0x51,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0x0e,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0x00,0x6b,0x62,
-0x53,0x00,0x00,0x00,0x00,0x68,0x6b,0x62,0x53,0x00,0x00,0x00,0x00,0x68,0x00,0x00,
-0x00,0x68,0x00,0x00,0x00,0x68,0x6b,0x62,0x53,0x00,0x00,0x00,0x00,0x68,0xff,0xff,
-0xff,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x45,0x3f,0x35,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0x06,0x00,0xfc,
-0x65,0x9b,0x00,0xfc,0x65,0x96,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0x57,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0x51,0x00,0xfc,0x65,0x37,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0xb7,0x00,0xfc,0x65,0x96,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0x96,0x00,0xfc,0x65,0xb8,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0x39,0x00,0xfc,0x65,0x57,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0x51,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0x97,0x00,0xfc,0x65,0x95,0x00,0xfc,
-0x65,0x05,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0x7f,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,
-0x00,0x7f,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,
-0x00,0x7f,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0x00,0x00,0x00,
-0x00,0x68,0x00,0x00,0x00,0x97,0x6b,0x62,0x53,0x00,0x00,0x00,0x00,0x97,0x00,0x00,
-0x00,0x97,0x00,0x00,0x00,0x97,0x6b,0x62,0x53,0x00,0x00,0x00,0x00,0x97,0x00,0x00,
-0x00,0x68,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x45,0x3f,0x35,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0x86,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0x96,0x00,0xfc,0x65,0x57,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0x51,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xa0,0x00,0xfc,0x65,0x17,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0x1c,0x00,0xfc,0x65,0xa5,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0x57,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0x59,0x00,0xfc,0x65,0x96,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0x80,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0x00,0x00,0x00,
-0x00,0x97,0x45,0x3f,0x35,0xff,0x6b,0x62,0x53,0x00,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x6b,0x62,0x53,0x00,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0x97,0x00,0x00,0x00,0x68,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x45,0x3f,0x35,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0x9a,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0x59,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0x57,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0x96,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0x00,0x45,0x3f,
-0x35,0xff,0x6b,0x62,0x53,0xff,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x68,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0x0c,0x00,0xfc,
-0x65,0xb9,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0x96,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0x96,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xb3,0x00,0xfc,
-0x65,0x09,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0x00,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0x00,0x45,0x3f,
-0x35,0xff,0x6b,0x62,0x53,0xff,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x68,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0x9b,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0x97,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0x96,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0x96,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x45,0x3f,0x35,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0x12,0x00,0xfc,
-0x65,0xc7,0x00,0xfc,0x65,0x96,0x00,0xfc,0x65,0xb3,0x00,0xfc,0x65,0x96,0x00,0xfc,
-0x65,0x80,0x00,0xfc,0x65,0x95,0x00,0xfc,0x65,0x0e,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0x0e,0x00,0xfc,0x65,0x9b,0x00,0xfc,0x65,0x86,0x00,0xfc,
-0x65,0x9a,0x00,0xfc,0x65,0xb9,0x00,0xfc,0x65,0x9b,0x00,0xfc,0x65,0xc7,0x00,0xfc,
-0x65,0x12,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x68,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x45,0x3f,0x35,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0x12,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0x09,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0x05,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0x06,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0x0c,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0x12,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x68,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x45,0x3f,0x35,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x68,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x45,0x3f,0x35,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x45,0x3f,0x35,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0x00,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x68,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x45,0x3f,0x35,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0x00,0x00,
-0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x68,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,0x53,0x00,0x6b,0x62,
-0x53,0x00,0x6b,0x62,0x53,0x00,0x45,0x3f,0x35,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0x00,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0x00,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0x00,0x45,0x3f,0x35,0x00,0x45,0x3f,
-0x35,0x00,0x45,0x3f,0x35,0x00,0x45,0x3f,0x35,0x00,0x45,0x3f,0x35,0x00,0x45,0x3f,
-0x35,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0x00,0x45,0x3f,
-0x35,0x00,0x45,0x3f,0x35,0x00,0x45,0x3f,0x35,0x00,0x45,0x3f,0x35,0x00,0x45,0x3f,
-0x35,0x00,0x45,0x3f,0x35,0x00,0x45,0x3f,0x35,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x68,0x00,0x00,
-0x00,0x68,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x68,0x00,0x00,
-0x00,0x68,0x00,0x00,0x00,0x68,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0x68,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x68,0x00,0x00,
-0x00,0x68,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x68,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x68,0x00,0x00,
-0x00,0x68,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x68,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x64,0x77,0x78,0xff,0x00,0x00,
-0x00,0x68,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0x00,0x00,0x00,0xff,0x64,0x77,
-0x78,0xff,0x00,0x00,0x00,0x68,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0xff,0xff,0xff,0x00,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0x00,0x00,
-0x00,0xff,0x64,0x77,0x78,0xff,0x00,0x00,0x00,0x68,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0xff,0xff,0xff,0x00,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x68,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x6b,0x62,0x53,0xff,0x61,0x58,0x4b,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x61,0x58,0x4b,0xff,0x6b,0x62,0x53,0xff,0xff,0xff,0xff,0x00,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x61,0x58,
-0x4b,0xff,0x61,0x58,0x4b,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x68,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x61,0x58,0x4b,0xff,0x79,0x6f,0x5e,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0x79,0x6f,0x5e,0xff,0x61,0x58,0x4b,0xff,0xff,0xff,0xff,0x00,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x61,0x58,0x4b,0xff,0x79,0x6f,
-0x5e,0xff,0x79,0x6f,0x5e,0xff,0x61,0x58,0x4b,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x68,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x6b,0x62,0x53,0xff,0x61,0x58,0x4b,0xff,0x79,0x6f,0x5e,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x79,0x6f,
-0x5e,0xff,0x61,0x58,0x4b,0xff,0x6b,0x62,0x53,0xff,0xff,0xff,0xff,0x00,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x61,0x58,0x4b,0xff,0x79,0x6f,0x5e,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x79,0x6f,0x5e,0xff,0x61,0x58,0x4b,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x68,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x61,0x58,0x4b,0xff,0x79,0x6f,
-0x5e,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x79,0x6f,0x5e,0xff,0x61,0x58,
-0x4b,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0xff,0xff,0xff,0x00,0x6b,0x62,
-0x53,0xff,0x61,0x58,0x4b,0xff,0x79,0x6f,0x5e,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x79,0x6f,0x5e,0xff,0x61,0x58,
-0x4b,0xff,0x6b,0x62,0x53,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x68,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x61,0x58,
-0x4b,0xff,0x79,0x6f,0x5e,0xff,0x79,0x6f,0x5e,0xff,0x61,0x58,0x4b,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0xff,0xff,0xff,0x00,0x61,0x58,
-0x4b,0xff,0x79,0x6f,0x5e,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x79,0x6f,
-0x5e,0xff,0x61,0x58,0x4b,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x61,0x58,0x4b,0xff,0x61,0x58,0x4b,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0xff,0xff,0xff,0x00,0x6b,0x62,
-0x53,0xff,0x61,0x58,0x4b,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x61,0x58,
-0x4b,0xff,0x6b,0x62,0x53,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x6b,0x62,
-0x53,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0xff,0xff,0xff,0x00,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0x40,0x00,0xfc,0x65,0x40,0x00,0xfc,
-0x65,0x40,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0x40,0x00,0xfc,0x65,0x40,0x00,0xfc,
-0x65,0x40,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x4d,0x45,0x3b,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x4d,0x45,
-0x3b,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x68,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0xff,0xff,0xff,0x00,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0x40,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0x40,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x56,0x4f,0x42,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x56,0x4f,0x42,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,
-0xff,0x00,0xc7,0xec,0xef,0x00,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x68,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0x40,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0x40,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x63,0x5b,0x4b,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x86,0x7b,0x68,0xff,0xe1,0xd5,0xc1,0xff,0x56,0x4f,0x42,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x56,0x4f,
-0x42,0xff,0xe1,0xd5,0xc1,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x63,0x5b,0x4b,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,
-0xff,0x00,0xc7,0xec,0xef,0x00,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x68,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0x40,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0x40,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x71,0x66,0x56,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x86,0x7b,0x68,0xff,0x56,0x4f,0x42,0xff,0xe1,0xd5,0xc1,0xff,0x56,0x4f,
-0x42,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x56,0x4f,0x42,0xff,0xe1,0xd5,
-0xc1,0xff,0x56,0x4f,0x42,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x71,0x66,0x56,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x68,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0x40,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0x40,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x7f,0x74,0x61,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x56,0x4f,0x42,0xff,0xe1,0xd5,
-0xc1,0xff,0x56,0x4f,0x42,0xff,0x56,0x4f,0x42,0xff,0xe1,0xd5,0xc1,0xff,0x56,0x4f,
-0x42,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x7f,0x74,0x61,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x68,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0x40,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0x40,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x8e,0x81,0x6c,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x56,0x4f,
-0x42,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0x56,0x4f,0x42,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x8e,0x81,0x6c,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x68,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0x40,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0x40,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x9b,0x8d,0x76,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x56,0x4f,
-0x42,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0x56,0x4f,0x42,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x9b,0x8d,0x76,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x68,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0x40,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0x40,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xa7,0x99,0x7f,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x56,0x4f,0x42,0xff,0xe1,0xd5,
-0xc1,0xff,0x56,0x4f,0x42,0xff,0x56,0x4f,0x42,0xff,0xe1,0xd5,0xc1,0xff,0x56,0x4f,
-0x42,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0xa7,0x99,0x7f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x68,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0x40,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0x40,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb2,0xa2,0x88,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x86,0x7b,0x68,0xff,0x56,0x4f,0x42,0xff,0xe1,0xd5,0xc1,0xff,0x56,0x4f,
-0x42,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x56,0x4f,0x42,0xff,0xe1,0xd5,
-0xc1,0xff,0x56,0x4f,0x42,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0xb2,0xa2,0x88,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x53,0x4b,0x3f,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0x40,0x00,0xfc,0x65,0x40,0x00,0xfc,
-0x65,0x40,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0x40,0x00,0xfc,0x65,0x40,0x00,0xfc,
-0x65,0x40,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x86,0x7b,0x68,0xff,0xe1,0xd5,0xc1,0xff,0x56,0x4f,0x42,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x56,0x4f,
-0x42,0xff,0xe1,0xd5,0xc1,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x68,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x7f,0x74,0x61,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0xff,0xff,0xff,0x00,0x61,0x58,0x4b,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb1,0xa2,0x87,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0xb1,0xa2,0x87,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x01,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x68,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x96,0x8a,0x73,0xff,0x68,0x5e,
-0x4f,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0x97,0x89,0x73,0xff,0x68,0x5e,
-0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,
-0x8d,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x01,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x68,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0xab,0x9c,
-0x83,0xff,0x68,0x5e,0x4f,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0xb9,0xa9,
-0x8d,0xff,0xab,0x9c,0x83,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x6b,0x62,
-0x53,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x0c,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x68,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x68,0x5e,
-0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,
-0x4f,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x68,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x64,0x77,0x78,0xff,0x00,0x00,0x00,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x68,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x09,0x08,0x07,0x0a,0x16,0x14,
-0x10,0x16,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x23,0x20,0x1b,0x24,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x64,0x77,0x78,0xff,0x00,0x00,
-0x00,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,0xff,0xff,0xc3,0xfe,
-0xff,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x68,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x4f,0x48,0x3c,0x50,0x49,0x43,0x39,0x4a,0x8e,0x81,
-0x69,0x8f,0x6e,0x65,0x56,0x6e,0x3f,0x3a,0x32,0x40,0x74,0x69,0x56,0x74,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0x40,0x00,0xfc,0x65,0x40,0x00,0xfc,0x65,0x40,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x77,
-0x78,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xbb,0xab,0x8f,0xbb,0xd1,0xc7,0xb4,0xff,0xce,0xc1,
-0xa9,0xff,0xd8,0xca,0xb3,0xff,0xe2,0xd6,0xc2,0xe3,0x2c,0x29,0x23,0x2c,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0x40,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0x40,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x4d,0x45,0x3b,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x4d,0x45,
-0x3b,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xc4,0xb5,0x9a,0xc5,0xe8,0xdd,0xca,0xff,0xe6,0xdb,
-0xc8,0xff,0xe1,0xd5,0xc1,0xff,0x39,0x36,0x31,0x3a,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0x40,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0x40,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x56,0x4f,0x42,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x8c,0x83,0x70,0xff,0x8c,0x83,0x70,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x8c,0x83,0x70,0xff,0x8c,0x83,0x70,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x56,0x4f,0x42,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xc6,0xb7,0x9d,0xc7,0xe3,0xd7,0xc3,0xff,0xe1,0xd5,
-0xc1,0xff,0x8a,0x7f,0x6c,0xff,0x44,0x41,0x3a,0x44,0x0b,0x0a,0x09,0x0c,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0xff,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0x80,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0x40,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0x40,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0x80,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x63,0x5b,0x4b,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x8c,0x83,0x70,0xff,0xe1,0xd5,0xc1,0xff,0x8c,0x83,0x70,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x8c,0x83,
-0x70,0xff,0xe1,0xd5,0xc1,0xff,0x8c,0x83,0x70,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x63,0x5b,0x4b,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xc6,0xb7,0x9d,0xc7,0xe3,0xd7,0xc3,0xe3,0x52,0x4e,
-0x46,0x52,0x7f,0x74,0x64,0x81,0xe1,0xd5,0xc1,0xff,0x71,0x6b,0x61,0x72,0xff,0xff,
-0xff,0x00,0x23,0x21,0x1e,0x24,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0x80,0x00,0xfc,0x65,0x80,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0x40,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0x40,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0x80,0x00,0xfc,0x65,0x80,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x71,0x66,0x56,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x8c,0x83,0x70,0xff,0xe1,0xd5,0xc1,0xff,0x8c,0x83,
-0x70,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x8c,0x83,0x70,0xff,0xe1,0xd5,
-0xc1,0xff,0x8c,0x83,0x70,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x71,0x66,0x56,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xe1,0xd5,0xc1,0xe1,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xb9,0xa9,0x8d,0xb9,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xc5,0xb6,0x9c,0xc5,0x41,0x3e,0x38,0x42,0xff,0xff,
-0xff,0x00,0x6c,0x67,0x5d,0x6c,0xe1,0xd5,0xc1,0xff,0xc7,0xbd,0xab,0xff,0x54,0x4f,
-0x48,0xff,0xaa,0xa1,0x92,0xab,0x37,0x34,0x2f,0x38,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0x80,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0x40,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0x40,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0x80,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x7f,0x74,0x61,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x8c,0x83,0x70,0xff,0xe1,0xd5,
-0xc1,0xff,0x8c,0x83,0x70,0xff,0x8c,0x83,0x70,0xff,0xe1,0xd5,0xc1,0xff,0x8c,0x83,
-0x70,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x7f,0x74,0x61,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,
-0x8d,0xb9,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,
-0xc1,0xe1,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xb9,0xa9,0x8d,0xb9,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x37,0x32,0x2a,0x38,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x12,0x11,0x10,0x12,0x65,0x60,0x57,0x66,0xe1,0xd5,0xc1,0xe1,0xd8,0xcd,
-0xb9,0xff,0xdd,0xd2,0xbe,0xff,0x52,0x4e,0x46,0x52,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0x80,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0x80,0x00,0xfc,
-0x65,0x40,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0x40,0x00,0xfc,0x65,0x80,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0x80,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x8e,0x81,0x6c,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x8c,0x83,
-0x70,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0x8c,0x83,0x70,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x8e,0x81,0x6c,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0x6b,0x62,0x53,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x6b,0x62,0x53,0xff,0xe1,0xd5,
-0xc1,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xc9,0xa5,
-0x68,0xdd,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xe1,0xd5,
-0xc1,0xe1,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xe1,0x86,0x7b,0x68,0x87,0x86,0x7b,
-0x68,0x87,0x86,0x7b,0x68,0x87,0x86,0x7b,0x68,0x87,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,
-0xc1,0xe1,0x86,0x7b,0x68,0x87,0x86,0x7b,0x68,0x87,0x86,0x7b,0x68,0x87,0x86,0x7b,
-0x68,0x87,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xe1,0xb9,0xa9,
-0x8d,0xb9,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0x58,0x54,0x4c,0x58,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x20,0x1e,0x19,0x20,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0xff,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x9b,0x8d,0x76,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x8c,0x83,
-0x70,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0x8c,0x83,0x70,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x9b,0x8d,0x76,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xad,0x9f,
-0x84,0xff,0xad,0x9e,0x85,0xff,0xad,0x9f,0x84,0xff,0xad,0x9e,0x85,0xff,0xad,0x9f,
-0x84,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x6b,0x62,
-0x53,0xff,0xe1,0xd5,0xc1,0xff,0x6b,0x62,0x53,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x6b,0x62,0x53,0xff,0xe1,0xd5,0xc1,0xff,0x6b,0x62,
-0x53,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xbf,0xb0,
-0x97,0xc8,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x01,0x01,
-0x01,0x02,0x01,0x01,0x01,0xff,0x07,0x06,0x04,0xff,0x07,0x06,0x04,0xff,0x07,0x06,
-0x04,0xff,0x03,0x02,0x02,0xff,0x06,0x05,0x03,0xff,0x06,0x05,0x03,0xff,0x06,0x05,
-0x03,0x06,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xe1,0xd5,
-0xc1,0xe1,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xe1,0x86,0x7b,0x68,0x87,0xe1,0xd5,
-0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,
-0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0x86,0x7b,
-0x68,0x87,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xe1,0xb9,0xa9,
-0x8d,0xb9,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x89,0x81,0x75,0x89,0x98,0x90,
-0x83,0x99,0xd8,0xcd,0xb9,0xff,0xc9,0xbe,0xad,0xc9,0x69,0x64,0x5b,0x6a,0x12,0x11,
-0x10,0x12,0xff,0xff,0xff,0x00,0x79,0x71,0x62,0x7a,0x3c,0x36,0x2d,0x3c,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0x80,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0x80,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xa7,0x99,0x7f,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x8c,0x83,0x70,0xff,0xe1,0xd5,
-0xc1,0xff,0x8c,0x83,0x70,0xff,0x8c,0x83,0x70,0xff,0xe1,0xd5,0xc1,0xff,0x8c,0x83,
-0x70,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xa7,0x99,0x7f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x9c,0x8e,0x77,0xff,0x9b,0x8e,
-0x77,0xff,0x9b,0x8e,0x77,0xff,0x9c,0x8e,0x77,0xff,0x9b,0x8e,0x77,0xff,0x9c,0x8e,
-0x77,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x7b,0x70,0x5f,0xff,0x7b,0x70,0x5f,0xff,0x7b,0x71,0x5e,0xff,0x7b,0x70,
-0x5f,0xff,0x7b,0x71,0x5f,0xff,0x7b,0x71,0x5f,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x6b,0x62,0x53,0xff,0xe1,0xd5,0xc1,0xff,0x6b,0x62,0x53,0xff,0x00,0x00,
-0x00,0xff,0x6b,0x62,0x53,0xff,0xe1,0xd5,0xc1,0xff,0x6b,0x62,0x53,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xdf,0xde,0xde,0xe1,0xbf,0xb0,
-0x97,0xdc,0xc9,0xa5,0x68,0xe8,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xc9,0xa5,0x68,0xf1,0xc9,0xa5,0x68,0xe3,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x02,0x02,0x01,0x02,0x0d,0x0a,
-0x07,0x0e,0x27,0x21,0x16,0xff,0x24,0x1e,0x13,0xff,0x37,0x31,0x25,0xff,0x23,0x1e,
-0x16,0xff,0x0c,0x0a,0x06,0xff,0x2d,0x24,0x18,0xff,0x44,0x3b,0x2f,0xff,0x2d,0x24,
-0x18,0x2e,0x16,0x12,0x0c,0x16,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,
-0x8d,0xb9,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,
-0xc1,0xe1,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xb9,0xa9,0x8d,0xb9,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x27,0x25,0x22,0x28,0xff,0xff,
-0xff,0x00,0x5a,0x55,0x4d,0xff,0xd5,0xca,0xb7,0xff,0xd0,0xc4,0xb0,0xff,0x54,0x4e,
-0x45,0x54,0x8b,0x84,0x78,0x8b,0xdb,0xce,0xb9,0xdb,0x36,0x31,0x29,0x36,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb2,0xa2,0x88,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x8c,0x83,0x70,0xff,0xe1,0xd5,0xc1,0xff,0x8c,0x83,
-0x70,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x8c,0x83,0x70,0xff,0xe1,0xd5,
-0xc1,0xff,0x8c,0x83,0x70,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb2,0xa2,0x88,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x88,0x7d,0x69,0xff,0x88,0x7d,0x69,0xff,0x88,0x7d,
-0x69,0xff,0x88,0x7d,0x68,0xff,0x88,0x7c,0x69,0xff,0x89,0x7c,0x69,0xff,0x89,0x7d,
-0x69,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x92,0x86,
-0x70,0xff,0x92,0x85,0x70,0xff,0x92,0x85,0x70,0xff,0x92,0x85,0x70,0xff,0x92,0x85,
-0x70,0xff,0x92,0x86,0x70,0xff,0x92,0x86,0x70,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x6b,0x62,0x53,0xff,0xe1,0xd5,0xc1,0xff,0x6b,0x62,
-0x53,0xff,0xe1,0xd5,0xc1,0xff,0x6b,0x62,0x53,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xdf,0xde,0xde,0xee,0xf8,0xed,
-0xda,0xff,0xbf,0xb0,0x97,0xc8,0xc9,0xa5,0x68,0xd7,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xc9,0xa5,0x68,0xf1,0xbf,0xb0,0x97,0xe0,0xbf,0xb0,0x97,0xd1,0xc9,0xa5,
-0x68,0xdc,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x03,0x02,0x01,0x04,0x13,0x0f,0x0a,0x14,0x31,0x29,
-0x1d,0xff,0x4f,0x46,0x39,0xff,0x8d,0x84,0x76,0xff,0x73,0x6a,0x5c,0xff,0x42,0x3b,
-0x31,0xff,0x2f,0x26,0x19,0xff,0x5b,0x52,0x45,0xff,0xd1,0xc8,0xba,0xff,0x80,0x77,
-0x6a,0xff,0x1a,0x15,0x0e,0x1a,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xe1,0xd5,0xc1,0xe1,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xb9,0xa9,0x8d,0xb9,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x05,0x05,0x05,0x06,0x6d,0x67,0x5e,0x6e,0x87,0x7c,0x69,0x87,0xae,0xa4,
-0x92,0xff,0xe1,0xd5,0xc1,0xff,0xd7,0xca,0xb4,0xff,0x36,0x31,0x29,0x36,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0x80,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0x80,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x8c,0x83,0x70,0xff,0xe1,0xd5,0xc1,0xff,0x8c,0x83,0x70,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x8c,0x83,
-0x70,0xff,0xe1,0xd5,0xc1,0xff,0x8c,0x83,0x70,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x77,0x6d,0x5c,0xff,0x77,0x6d,0x5c,0xff,0x77,0x6d,0x5c,0xff,0x77,0x6d,
-0x5c,0xff,0x77,0x6d,0x5c,0xff,0x77,0x6d,0x5c,0xff,0x77,0x6d,0x5c,0xff,0x77,0x6c,
-0x5b,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xa9,0x9a,0x81,0xff,0xa9,0x9a,
-0x81,0xff,0xa9,0x9a,0x81,0xff,0xa9,0x9a,0x81,0xff,0xa9,0x9a,0x82,0xff,0xa9,0x9a,
-0x81,0xff,0xa9,0x9a,0x81,0xff,0xa9,0x9b,0x81,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x6b,0x62,0x53,0xff,0xe1,0xd5,
-0xc1,0xff,0x6b,0x62,0x53,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xdf,0xde,0xde,0xeb,0xf8,0xed,
-0xda,0xff,0xbf,0xb0,0x97,0xc8,0xc9,0xa5,0x68,0xd7,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xc9,0xa5,0x68,0xe7,0xbf,0xb0,
-0x97,0xde,0xbf,0xb0,0x97,0xe0,0xf8,0xed,0xda,0xff,0xf8,0xed,0xda,0xff,0xbf,0xb0,
-0x97,0xc8,0xbf,0xb0,0x97,0xc8,0xc9,0xa5,0x68,0xdc,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x04,0x03,0x02,0x04,0x18,0x13,0x0d,0x18,0x35,0x2d,0x20,0xff,0x5f,0x56,
-0x49,0xff,0x9e,0x95,0x87,0xff,0xa8,0x9f,0x91,0xff,0x89,0x80,0x72,0xff,0x35,0x2c,
-0x1f,0xff,0x73,0x6a,0x5c,0xff,0xda,0xd1,0xc3,0xff,0xda,0xd1,0xc3,0xff,0x8e,0x85,
-0x77,0xff,0x1a,0x15,0x0e,0x1a,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xba,0xaf,0x9c,0xbb,0xea,0xdf,
-0xcb,0xff,0xe1,0xd5,0xc1,0xff,0xda,0xce,0xb8,0xff,0x3a,0x35,0x2c,0x3a,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x8c,0x83,0x70,0xff,0x8c,0x83,0x70,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x8c,0x83,0x70,0xff,0x8c,0x83,0x70,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x6b,0x62,0x53,0xff,0xe1,0xd5,0xc1,0xff,0x6b,0x62,
-0x53,0xff,0xe1,0xd5,0xc1,0xff,0x6b,0x62,0x53,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xdf,0xde,0xde,0xfb,0xbf,0xb0,
-0x97,0xdc,0xc9,0xa5,0x68,0xe8,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xdf,0xde,0xde,0xdf,0xdf,0xde,0xde,0xdf,0xdf,0xde,0xde,0xe1,0xdf,0xde,
-0xde,0xe1,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x01,0x01,0x00,0x02,0x06,0x05,
-0x03,0x06,0x1e,0x18,0x10,0x1e,0x38,0x2f,0x22,0xff,0x6c,0x63,0x55,0xff,0xa7,0x9e,
-0x90,0xff,0xa8,0x9f,0x91,0xff,0x74,0x6b,0x5e,0xff,0x39,0x30,0x23,0xff,0x8a,0x81,
-0x74,0xff,0xda,0xd1,0xc3,0xff,0xda,0xd1,0xc3,0xff,0x8a,0x81,0x74,0xff,0x2f,0x26,
-0x19,0x30,0x1a,0x15,0x0e,0x1a,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x96,0x8d,0x7f,0x97,0xe0,0xd3,0xbc,0xe1,0xe5,0xda,
-0xc6,0xff,0xe2,0xd6,0xc2,0xff,0xcb,0xbd,0xa5,0xff,0x31,0x2c,0x25,0x32,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0xff,0x00,0xfc,
-0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,
-0x65,0x80,0x00,0xfc,0x65,0xff,0x00,0xfc,0x65,0x80,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb1,0xa2,0x87,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb1,0xa2,0x87,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xe1,0xd5,0xc1,0xff,0x6b,0x62,0x53,0xff,0x00,0x00,
-0x00,0xff,0x6b,0x62,0x53,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xbf,0xb0,
-0x97,0xc8,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x01,0x01,0x01,0x02,0x08,0x07,0x05,0x08,0x25,0x1e,
-0x14,0xff,0x3e,0x35,0x28,0xff,0x79,0x70,0x62,0xff,0xa8,0x9f,0x91,0xff,0xa2,0x99,
-0x8b,0xff,0x68,0x5f,0x51,0xff,0x2f,0x26,0x19,0xff,0xa2,0x99,0x8c,0xff,0xda,0xd1,
-0xc3,0xff,0xda,0xd1,0xc3,0xff,0x73,0x6a,0x5c,0xff,0x2f,0x26,0x19,0x30,0x19,0x14,
-0x0d,0x1a,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x1a,0x18,0x14,0x1a,0xa4,0x98,0x84,0xa5,0xba,0xaa,0x8e,0xbb,0x7a,0x70,
-0x60,0x7a,0x7c,0x74,0x66,0x7c,0xa4,0x95,0x7b,0xa5,0x07,0x07,0x06,0x08,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,
-0x8d,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xc9,0xa5,
-0x68,0xdd,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x02,0x01,0x01,0x02,0x0d,0x0a,0x07,0x0e,0x2a,0x23,0x18,0xff,0x45,0x3c,
-0x2f,0xff,0x86,0x7d,0x6f,0xff,0xa8,0x9f,0x91,0xff,0x99,0x90,0x82,0xff,0x5b,0x52,
-0x45,0xff,0x41,0x38,0x2b,0xff,0xb8,0xaf,0xa2,0xff,0xda,0xd1,0xc3,0xff,0xd1,0xc8,
-0xba,0xff,0x5b,0x52,0x45,0xff,0x2f,0x26,0x19,0x30,0x13,0x0f,0x0a,0x14,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x1d,0x1b,0x16,0x1e,0xff,0xff,0xff,0x00,0x30,0x2b,0x24,0x30,0x24,0x20,
-0x1a,0x24,0xff,0xff,0xff,0x00,0x19,0x16,0x13,0x1a,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xfc,0x65,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0xfc,0x65,0x80,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x02,0x02,
-0x01,0x02,0x11,0x0e,0x09,0x12,0x2f,0x27,0x1c,0xff,0x4f,0x46,0x39,0xff,0x92,0x89,
-0x7b,0xff,0xa8,0x9f,0x91,0xff,0x8f,0x86,0x79,0xff,0x52,0x49,0x3c,0xff,0x56,0x4d,
-0x40,0xff,0xcd,0xc4,0xb6,0xff,0xda,0xd1,0xc3,0xff,0xbe,0xb5,0xa7,0xff,0x4b,0x42,
-0x35,0xff,0x2d,0x24,0x18,0x2e,0x0c,0x0a,0x06,0x0c,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x03,0x03,0x02,0x04,0x16,0x12,
-0x0c,0x16,0x33,0x2a,0x1e,0xff,0x5c,0x53,0x45,0xff,0x9c,0x93,0x85,0xff,0xa8,0x9f,
-0x91,0xff,0x84,0x7b,0x6d,0xff,0x46,0x3d,0x30,0xff,0x6d,0x64,0x56,0xff,0xda,0xd1,
-0xc3,0xff,0xda,0xd1,0xc3,0xff,0xa8,0x9f,0x91,0xff,0x38,0x2f,0x22,0xff,0x27,0x20,
-0x15,0x28,0x08,0x06,0x04,0x08,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x13,0x10,
-0x0a,0x14,0x13,0x10,0x0a,0x14,0x13,0x10,0x0a,0x14,0x1b,0x16,0x0f,0x1c,0x37,0x2e,
-0x21,0xff,0x68,0x5f,0x52,0xff,0xa3,0x9a,0x8c,0xff,0xa8,0x9f,0x91,0xff,0x78,0x6f,
-0x61,0xff,0x3b,0x32,0x25,0xff,0x85,0x7c,0x6e,0xff,0xda,0xd1,0xc3,0xff,0xda,0xd1,
-0xc3,0xff,0x90,0x87,0x7a,0xff,0x2f,0x26,0x19,0x30,0x21,0x1b,0x12,0x22,0x02,0x02,
-0x01,0x02,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,
-0xc1,0xe1,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xb9,0xa9,0x8d,0xb9,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xb9,0xa9,0x8d,0xb9,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x55,0x4d,0x41,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x55,0x4d,0x41,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x14,0x10,0x0b,0x14,0x2f,0x26,
-0x19,0x30,0x61,0x58,0x4a,0xff,0x4c,0x43,0x36,0xff,0x39,0x30,0x23,0xff,0x75,0x6c,
-0x5f,0xff,0xa8,0x9f,0x91,0xff,0xa3,0x9a,0x8c,0xff,0x6b,0x62,0x54,0xff,0x31,0x28,
-0x1b,0xff,0x9c,0x93,0x86,0xff,0xda,0xd1,0xc3,0xff,0xda,0xd1,0xc3,0xff,0x79,0x70,
-0x62,0xff,0x2f,0x26,0x19,0x30,0x1b,0x16,0x0e,0x1c,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xb9,0xa9,
-0x8d,0xb9,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,
-0x8d,0xb9,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xb9,0xa9,0x8d,0xb9,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x5a,0x52,0x44,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x5a,0x52,
-0x44,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x0b,0x09,0x06,0x0c,0x2b,0x23,0x17,0x2c,0x63,0x5a,
-0x4d,0xff,0xa8,0x9f,0x91,0xff,0x9d,0x94,0x86,0xff,0x82,0x79,0x6b,0xff,0xa8,0x9f,
-0x91,0xff,0x9c,0x93,0x85,0xff,0x61,0x58,0x4b,0xff,0x3c,0x33,0x26,0xff,0xb3,0xaa,
-0x9c,0xff,0xda,0xd1,0xc3,0xff,0xd6,0xcd,0xbf,0xff,0x67,0x5e,0x50,0xff,0x2f,0x26,
-0x19,0x30,0x14,0x10,0x0b,0x14,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xff,0xff,
-0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x13,0x12,0x10,0x14,0x57,0x53,
-0x4b,0x58,0x93,0x8b,0x7e,0x93,0xc2,0xb8,0xa7,0xc3,0xe1,0xd5,0xc1,0xe1,0xc2,0xb8,
-0xa7,0xc3,0x93,0x8b,0x7e,0x93,0x57,0x53,0x4b,0x58,0x13,0x12,0x10,0x14,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,
-0x8d,0xb9,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xe1,0xb9,0xa9,0x8d,0xb9,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xe1,0xd5,
-0xc1,0xe1,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xe1,0xb9,0xa9,
-0x8d,0xb9,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x5f,0x57,0x49,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x5f,0x57,0x49,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x4d,0x45,0x3b,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x4d,0x45,
-0x3b,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0x6b,0x62,0x53,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x1f,0x19,0x11,0x20,0x4b,0x42,0x35,0xff,0x9f,0x96,
-0x88,0xff,0xa8,0x9f,0x91,0xff,0xa8,0x9f,0x91,0xff,0xa8,0x9f,0x91,0xff,0x92,0x89,
-0x7b,0xff,0x55,0x4c,0x3f,0xff,0x51,0x48,0x3a,0xff,0xc8,0xbf,0xb1,0xff,0xda,0xd1,
-0xc3,0xff,0xc3,0xba,0xac,0xff,0x51,0x48,0x3a,0xff,0x2e,0x25,0x18,0x2e,0x0f,0x0c,
-0x08,0x10,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xff,0xff,
-0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x3b,0x38,0x33,0x3c,0x8f,0x87,0x7b,0x8f,0x8a,0x82,
-0x76,0x8b,0x4e,0x4a,0x43,0x4e,0x1f,0x1d,0x1a,0x20,0xe1,0xd5,0xc1,0xe1,0x1f,0x1d,
-0x1a,0x20,0x4e,0x4a,0x43,0x4e,0x8a,0x82,0x76,0x8b,0x8f,0x87,0x7b,0x8f,0x3b,0x38,
-0x33,0x3c,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xe1,0xd5,
-0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,
-0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xb9,0xa9,0x8d,0xb9,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,
-0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,
-0xc1,0xe1,0xb9,0xa9,0x8d,0xb9,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x23,0x20,0x1b,0x24,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x16,0x14,0x10,0x16,0x09,0x08,0x07,0x0a,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x65,0x5c,
-0x4e,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x65,0x5c,0x4e,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x56,0x4f,0x42,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x56,0x4f,0x42,0xff,0x56,0x4f,0x42,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x56,0x4f,0x42,0xff,0x56,0x4f,0x42,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x56,0x4f,0x42,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0x6b,0x62,
-0x53,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x6b,0x62,
-0x53,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x15,0x11,0x0b,0x16,0x30,0x27,0x1a,0x30,0x80,0x77,0x69,0xff,0xa8,0x9f,
-0x91,0xff,0xa8,0x9f,0x91,0xff,0xa3,0x9a,0x8c,0xff,0x85,0x7c,0x6e,0xff,0x49,0x40,
-0x32,0xff,0x67,0x5e,0x50,0xff,0xd6,0xcd,0xbf,0xff,0xda,0xd1,0xc3,0xff,0xae,0xa5,
-0x97,0xff,0x3c,0x33,0x26,0xff,0x29,0x21,0x16,0x2a,0x09,0x07,0x05,0x0a,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xff,0xff,
-0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x3b,0x38,0x33,0x3c,0x83,0x7c,0x70,0x83,0x46,0x42,0x3c,0x46,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x46,0x42,0x3c,0x46,0x83,0x7c,
-0x70,0x83,0x3b,0x38,0x33,0x3c,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0x87,0x86,0x7b,0x68,0x87,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x86,0x7b,0x68,0x87,0x86,0x7b,0x68,0x87,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x74,0x69,0x56,0x74,0x3f,0x3a,
-0x32,0x40,0x6e,0x65,0x56,0x6e,0x8e,0x81,0x69,0x8f,0x49,0x43,0x39,0x4a,0x4f,0x48,
-0x3c,0x50,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,0x52,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x6b,0x62,0x52,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x63,0x5b,0x4b,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x56,0x4f,0x42,0xff,0xb9,0xa9,0x8d,0xff,0x56,0x4f,0x42,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x56,0x4f,
-0x42,0xff,0xb9,0xa9,0x8d,0xff,0x56,0x4f,0x42,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x63,0x5b,0x4b,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0x6b,0x62,0x53,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0x6b,0x62,0x53,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x6b,0x62,0x53,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x0d,0x0b,
-0x07,0x0e,0x2b,0x23,0x17,0x2c,0x66,0x5d,0x4f,0xff,0xa8,0x9f,0x91,0xff,0xa8,0x9f,
-0x91,0xff,0xa1,0x98,0x8a,0xff,0x7c,0x73,0x65,0xff,0x3d,0x34,0x27,0xff,0x7f,0x76,
-0x68,0xff,0xda,0xd1,0xc3,0xff,0xda,0xd1,0xc3,0xff,0x96,0x8d,0x80,0xff,0x2f,0x26,
-0x19,0x30,0x23,0x1c,0x13,0x24,0x04,0x03,0x02,0x04,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xff,0xff,
-0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x13,0x12,
-0x10,0x14,0x8f,0x87,0x7b,0x8f,0x46,0x42,0x3c,0x46,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x46,0x42,
-0x3c,0x46,0x8f,0x87,0x7b,0x8f,0x13,0x12,0x10,0x14,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xe1,0x86,0x7b,0x68,0x87,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,
-0x8d,0xb9,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xe1,0xd5,0xc1,0xe1,0x86,0x7b,0x68,0x87,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x2c,0x29,0x23,0x2c,0xe2,0xd6,
-0xc2,0xe3,0xd8,0xca,0xb3,0xff,0xce,0xc1,0xa9,0xff,0xd1,0xc7,0xb4,0xff,0xbb,0xab,
-0x8f,0xbb,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x72,0x68,0x57,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x72,0x68,0x57,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x71,0x66,0x56,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x56,0x4f,0x42,0xff,0xb9,0xa9,0x8d,0xff,0x56,0x4f,
-0x42,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x56,0x4f,0x42,0xff,0xb9,0xa9,
-0x8d,0xff,0x56,0x4f,0x42,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x71,0x66,0x56,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0x6b,0x62,0x53,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0x6b,0x62,0x53,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x6b,0x62,0x53,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x05,0x04,0x03,0x06,0x26,0x1f,
-0x15,0x26,0x52,0x49,0x3b,0xff,0x9e,0x95,0x87,0xff,0xa8,0x9f,0x91,0xff,0x9f,0x96,
-0x88,0xff,0x70,0x67,0x59,0xff,0x33,0x2a,0x1d,0xff,0x96,0x8d,0x80,0xff,0xda,0xd1,
-0xc3,0xff,0xda,0xd1,0xc3,0xff,0xce,0xc5,0xb7,0xff,0x2f,0x26,0x19,0xff,0x1c,0x17,
-0x0f,0x1c,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xff,0xff,
-0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x57,0x53,
-0x4b,0x58,0x8a,0x82,0x76,0x8b,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xff,0xff,
-0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x8a,0x82,0x76,0x8b,0x57,0x53,0x4b,0x58,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,
-0x8d,0xb9,0xe1,0xd5,0xc1,0xe1,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xe1,0x86,0x7b,0x68,0x87,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,
-0xc1,0xe1,0xb9,0xa9,0x8d,0xb9,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xe1,0xd5,0xc1,0xe1,0x86,0x7b,0x68,0x87,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x39,0x36,
-0x31,0x3a,0xe1,0xd5,0xc1,0xff,0xe6,0xdb,0xc8,0xff,0xe8,0xdd,0xca,0xff,0xc4,0xb5,
-0x9a,0xc5,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x78,0x6e,0x5c,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x78,0x6e,0x5c,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x7f,0x74,0x61,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x56,0x4f,0x42,0xff,0xb9,0xa9,
-0x8d,0xff,0x56,0x4f,0x42,0xff,0x56,0x4f,0x42,0xff,0xb9,0xa9,0x8d,0xff,0x56,0x4f,
-0x42,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x7f,0x74,0x61,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0x6b,0x62,0x53,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0x6b,0x62,
-0x53,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x6b,0x62,0x53,0xff,0xb9,0xa9,
-0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x01,0x01,0x00,0x02,0x1f,0x19,0x10,0x20,0x3c,0x33,
-0x26,0xff,0x8f,0x86,0x79,0xff,0xa8,0x9f,0x91,0xff,0x9a,0x91,0x83,0xff,0x63,0x5a,
-0x4d,0xff,0x38,0x2f,0x22,0xff,0xa8,0x9f,0x91,0xff,0xda,0xd1,0xc3,0xff,0xda,0xd1,
-0xc3,0xff,0xda,0xd1,0xc3,0xff,0xb0,0xa7,0x9a,0xff,0x2c,0x23,0x17,0xff,0x06,0x05,
-0x03,0x06,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xff,0xff,
-0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x93,0x8b,
-0x7e,0x93,0x4e,0x4a,0x43,0x4e,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,
-0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xff,0xff,
-0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x4e,0x4a,0x43,0x4e,0x93,0x8b,0x7e,0x93,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xe1,0xd5,
-0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xe1,0x86,0x7b,0x68,0x87,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,
-0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xb9,0xa9,0x8d,0xb9,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xe1,0xd5,0xc1,0xe1,0x86,0x7b,0x68,0x87,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x0b,0x0a,0x09,0x0c,0x44,0x41,
-0x3a,0x44,0x8a,0x7f,0x6c,0xff,0xe1,0xd5,0xc1,0xff,0xe3,0xd7,0xc3,0xff,0xc6,0xb7,
-0x9d,0xc7,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x7f,0x74,0x61,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x7f,0x74,0x61,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x8e,0x81,0x6c,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x56,0x4f,
-0x42,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x56,0x4f,0x42,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x8e,0x81,0x6c,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0x00,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0x6b,0x62,
-0x53,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0x6b,0x62,0x53,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x6b,0x62,
-0x53,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x01,0x01,0x01,0x02,0x17,0x13,0x0c,0x18,0x31,0x28,0x1b,0xff,0x7e,0x75,
-0x68,0xff,0xa8,0x9f,0x91,0xff,0x94,0x8b,0x7d,0xff,0x57,0x4e,0x41,0xff,0x4b,0x42,
-0x35,0xff,0xbe,0xb5,0xa7,0xff,0xda,0xd1,0xc3,0xff,0xda,0xd1,0xc3,0xff,0xda,0xd1,
-0xc3,0xff,0xda,0xd1,0xc3,0xff,0xa3,0x9a,0x8c,0xff,0x46,0x3d,0x30,0xff,0x06,0x05,
-0x03,0x06,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xff,0xff,
-0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xc2,0xb8,
-0xa7,0xc3,0x1f,0x1d,0x1a,0x20,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x1f,0x1d,0x1a,0x20,0xc2,0xb8,0xa7,0xc3,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xe1,0x86,0x7b,0x68,0x87,0x86,0x7b,0x68,0x87,0x86,0x7b,
-0x68,0x87,0x86,0x7b,0x68,0x87,0xe1,0xd5,0xc1,0xe1,0x86,0x7b,0x68,0x87,0x86,0x7b,
-0x68,0x87,0x86,0x7b,0x68,0x87,0x86,0x7b,0x68,0x87,0x86,0x7b,0x68,0x87,0xe1,0xd5,
-0xc1,0xe1,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xe1,0xb9,0xa9,0x8d,0xb9,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,
-0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x23,0x21,0x1e,0x24,0x05,0x05,0x05,0x06,0x71,0x6b,0x61,0x72,0xe1,0xd5,
-0xc1,0xff,0x7f,0x74,0x64,0x81,0x52,0x4e,0x46,0x52,0xe3,0xd7,0xc3,0xe3,0xc6,0xb7,
-0x9d,0xc7,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7a,0x66,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7a,0x66,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x9b,0x8d,0x76,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x56,0x4f,
-0x42,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x56,0x4f,0x42,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x9b,0x8d,0x76,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,0x8d,0xff,0x6b,0x62,0x53,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0x6b,0x62,0x53,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x6b,0x62,0x53,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x01,0x01,
-0x01,0x02,0x0f,0x0c,0x08,0x10,0x2c,0x23,0x18,0xff,0x6a,0x61,0x54,0xff,0xa8,0x9f,
-0x91,0xff,0x8c,0x83,0x75,0xff,0x4b,0x42,0x35,0xff,0x61,0x58,0x4b,0xff,0xd1,0xc8,
-0xba,0xff,0xda,0xd1,0xc3,0xff,0xda,0xd1,0xc3,0xff,0xda,0xd1,0xc3,0xff,0xda,0xd1,
-0xc3,0xff,0xda,0xd1,0xc3,0xff,0xda,0xd1,0xc3,0xff,0x42,0x39,0x2c,0xff,0x06,0x05,
-0x03,0x06,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xff,0xff,
-0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,
-0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,
-0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xff,0xff,0xff,0x00,0xe1,0xd5,
-0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,
-0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xe1,0x86,0x7b,0x68,0x87,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,
-0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,
-0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0x86,0x7b,0x68,0x87,0xe1,0xd5,
-0xc1,0xe1,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xe1,0xb9,0xa9,0x8d,0xb9,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,
-0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x37,0x34,
-0x2f,0x38,0xaa,0xa1,0x92,0xab,0x54,0x4f,0x48,0xff,0xc7,0xbd,0xab,0xff,0xe1,0xd5,
-0xc1,0xff,0x6c,0x67,0x5d,0x6c,0xff,0xff,0xff,0x00,0x41,0x3e,0x38,0x42,0xc5,0xb6,
-0x9c,0xc5,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x8c,0x80,0x6b,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x8c,0x80,0x6b,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xa7,0x99,0x7f,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x56,0x4f,0x42,0xff,0xb9,0xa9,
-0x8d,0xff,0x56,0x4f,0x42,0xff,0x56,0x4f,0x42,0xff,0xb9,0xa9,0x8d,0xff,0x56,0x4f,
-0x42,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xa7,0x99,0x7f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x6b,0x62,0x53,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x01,0x00,0x00,0x02,0x07,0x06,
-0x04,0x08,0x20,0x1b,0x12,0xff,0x50,0x47,0x3b,0xff,0x96,0x8d,0x7f,0xff,0x86,0x7d,
-0x70,0xff,0x41,0x38,0x2b,0xff,0x79,0x70,0x62,0xff,0xda,0xd1,0xc3,0xff,0xda,0xd1,
-0xc3,0xff,0xda,0xd1,0xc3,0xff,0xda,0xd1,0xc3,0xff,0xda,0xd1,0xc3,0xff,0xcf,0xc6,
-0xb8,0xff,0xd7,0xce,0xc0,0xff,0x7d,0x74,0x66,0xff,0x2f,0x26,0x19,0x30,0x05,0x04,
-0x03,0x06,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xff,0xff,
-0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xc2,0xb8,
-0xa7,0xc3,0x1f,0x1d,0x1a,0x20,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x1f,0x1d,0x1a,0x20,0xc2,0xb8,0xa7,0xc3,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xe1,0xd5,
-0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xe1,0x86,0x7b,0x68,0x87,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,
-0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xb9,0xa9,0x8d,0xb9,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xe1,0xd5,0xc1,0xe1,0x86,0x7b,0x68,0x87,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x52,0x4e,
-0x46,0x52,0xdd,0xd2,0xbe,0xff,0xd8,0xcd,0xb9,0xff,0xe1,0xd5,0xc1,0xe1,0x65,0x60,
-0x57,0x66,0x12,0x11,0x10,0x12,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x37,0x32,
-0x2a,0x38,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x92,0x86,0x70,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x92,0x86,0x70,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb2,0xa2,0x88,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x56,0x4f,0x42,0xff,0xb9,0xa9,0x8d,0xff,0x56,0x4f,
-0x42,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x56,0x4f,0x42,0xff,0xb9,0xa9,
-0x8d,0xff,0x56,0x4f,0x42,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb2,0xa2,0x88,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x03,0x02,0x01,0x04,0x12,0x0f,
-0x0b,0xff,0x31,0x2c,0x22,0xff,0x77,0x6f,0x62,0xff,0x76,0x6e,0x61,0xff,0x37,0x2e,
-0x21,0xff,0x8a,0x81,0x74,0xff,0xda,0xd1,0xc3,0xff,0xda,0xd1,0xc3,0xff,0xda,0xd1,
-0xc3,0xff,0xd3,0xca,0xbc,0xff,0xda,0xd1,0xc3,0xff,0xaa,0xa1,0x93,0xff,0x95,0x8c,
-0x7e,0xff,0x5d,0x54,0x47,0xff,0x2e,0x25,0x19,0x2e,0x15,0x11,0x0b,0x16,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xff,0xff,
-0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x93,0x8b,
-0x7e,0x93,0x4e,0x4a,0x43,0x4e,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,
-0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xff,0xff,
-0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x4e,0x4a,0x43,0x4e,0x93,0x8b,0x7e,0x93,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,
-0x8d,0xb9,0xe1,0xd5,0xc1,0xe1,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xe1,0x86,0x7b,0x68,0x87,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,
-0xc1,0xe1,0xb9,0xa9,0x8d,0xb9,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xe1,0xd5,0xc1,0xe1,0x86,0x7b,0x68,0x87,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x20,0x1e,0x19,0x20,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x58,0x54,
-0x4c,0x58,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xe1,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x99,0x8b,0x74,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x99,0x8b,0x74,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x56,0x4f,0x42,0xff,0xb9,0xa9,0x8d,0xff,0x56,0x4f,0x42,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x56,0x4f,
-0x42,0xff,0xb9,0xa9,0x8d,0xff,0x56,0x4f,0x42,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0x00,0xff,0xff,0xff,0x00,0x01,0x00,0x00,0x02,0x07,0x06,0x04,0x08,0x18,0x15,
-0x10,0xff,0x4c,0x46,0x3b,0xff,0x5d,0x55,0x49,0xff,0x33,0x2a,0x1d,0xff,0xa5,0x9c,
-0x8e,0xff,0xda,0xd1,0xc3,0xff,0xda,0xd1,0xc3,0xff,0xda,0xd1,0xc3,0xff,0xbc,0xb3,
-0xa5,0xff,0xa1,0x98,0x8a,0xff,0x7b,0x72,0x64,0xff,0x48,0x3f,0x32,0xff,0x34,0x2d,
-0x23,0xff,0x1c,0x17,0x0f,0x1c,0x0d,0x0a,0x07,0x0e,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xff,0xff,
-0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x57,0x53,
-0x4b,0x58,0x8a,0x82,0x76,0x8b,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xff,0xff,
-0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x8a,0x82,0x76,0x8b,0x57,0x53,0x4b,0x58,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xe1,0x86,0x7b,0x68,0x87,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,
-0x8d,0xb9,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xe1,0xd5,0xc1,0xe1,0x86,0x7b,0x68,0x87,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x3c,0x36,0x2d,0x3c,0x79,0x71,
-0x62,0x7a,0xff,0xff,0xff,0x00,0x12,0x11,0x10,0x12,0x69,0x64,0x5b,0x6a,0xc9,0xbe,
-0xad,0xc9,0xd8,0xcd,0xb9,0xd9,0x98,0x90,0x83,0x99,0x89,0x81,0x75,0x89,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x9f,0x91,0x79,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x9f,0x91,0x79,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x56,0x4f,0x42,0xff,0x56,0x4f,0x42,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x56,0x4f,0x42,0xff,0x56,0x4f,0x42,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0x00,0xff,0xff,0xff,0x00,0x01,0x00,0x00,0x02,0x08,0x07,0x05,0xff,0x22,0x1f,
-0x1a,0xff,0x45,0x3c,0x2f,0xff,0x47,0x3e,0x31,0xff,0xc2,0xb9,0xab,0xff,0xda,0xd1,
-0xc3,0xff,0xd3,0xca,0xbc,0xff,0xa4,0x9b,0x8e,0xff,0x8e,0x85,0x77,0xff,0x51,0x48,
-0x3a,0xff,0x44,0x3c,0x32,0xff,0x1f,0x19,0x11,0x20,0x17,0x13,0x0c,0x18,0x07,0x06,
-0x04,0x08,0x05,0x04,0x02,0x06,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xff,0xff,
-0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x13,0x12,
-0x10,0x14,0x8f,0x87,0x7b,0x8f,0x46,0x42,0x3c,0x46,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x46,0x42,
-0x3c,0x46,0x8f,0x87,0x7b,0x8f,0x13,0x12,0x10,0x14,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0x87,0x86,0x7b,0x68,0x87,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x86,0x7b,0x68,0x87,0x86,0x7b,0x68,0x87,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x36,0x31,0x29,0x36,0xdb,0xce,
-0xb9,0xdb,0x8b,0x84,0x78,0x8b,0x54,0x4e,0x45,0x54,0xd0,0xc4,0xb0,0xff,0xd5,0xca,
-0xb7,0xff,0x5a,0x55,0x4d,0x5a,0xff,0xff,0xff,0x00,0x27,0x25,0x22,0x28,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xa4,0x96,0x7d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xa4,0x96,0x7d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb1,0xa2,0x87,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb1,0xa2,0x87,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0x00,0xff,0xff,0xff,0x00,0x01,0x00,0x00,0x02,0x08,0x07,0x04,0xff,0x2c,0x25,
-0x1a,0xff,0x58,0x4f,0x42,0xff,0xd5,0xcc,0xbe,0xff,0xbd,0xb4,0xa6,0xff,0xa4,0x9b,
-0x8e,0xff,0x5e,0x55,0x48,0xff,0x50,0x47,0x3b,0xff,0x20,0x1a,0x11,0xff,0x1d,0x18,
-0x11,0xff,0x09,0x07,0x05,0x0a,0x08,0x06,0x04,0x08,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xff,0xff,
-0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x3b,0x38,0x33,0x3c,0x83,0x7c,0x70,0x83,0x46,0x42,0x3c,0x46,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x46,0x42,0x3c,0x46,0x83,0x7c,
-0x70,0x83,0x3b,0x38,0x33,0x3c,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xe1,0xd5,
-0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,
-0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xb9,0xa9,0x8d,0xb9,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,
-0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,
-0xc1,0xe1,0xb9,0xa9,0x8d,0xb9,0xff,0xff,0xff,0x00,0x36,0x31,0x29,0x36,0xd7,0xca,
-0xb4,0xff,0xe1,0xd5,0xc1,0xff,0xae,0xa4,0x92,0xff,0x87,0x7c,0x69,0x87,0x6d,0x67,
-0x5e,0x6e,0x05,0x05,0x05,0x06,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xaa,0x9b,0x81,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xaa,0x9b,0x81,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,
-0x8d,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0x00,0xff,0xff,0xff,0x00,0x02,0x02,0x01,0x02,0x12,0x0f,0x0a,0xff,0x45,0x3e,
-0x32,0xff,0xba,0xb1,0xa3,0xff,0x7b,0x72,0x64,0xff,0x5f,0x56,0x48,0xff,0x2b,0x24,
-0x19,0xff,0x20,0x1a,0x11,0x20,0x0d,0x0a,0x07,0x0e,0x0a,0x08,0x05,0x0a,0x01,0x01,
-0x00,0x02,0x01,0x01,0x00,0x02,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xff,0xff,
-0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x3b,0x38,0x33,0x3c,0x8f,0x87,0x7b,0x8f,0x8a,0x82,
-0x76,0x8b,0x4e,0x4a,0x43,0x4e,0x1f,0x1d,0x1a,0x20,0xe1,0xd5,0xc1,0xe1,0x1f,0x1d,
-0x1a,0x20,0x4e,0x4a,0x43,0x4e,0x8a,0x82,0x76,0x8b,0x8f,0x87,0x7b,0x8f,0x3b,0x38,
-0x33,0x3c,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,
-0x8d,0xb9,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xe1,0xb9,0xa9,0x8d,0xb9,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xe1,0xd5,
-0xc1,0xe1,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xe1,0xb9,0xa9,
-0x8d,0xb9,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x3a,0x35,0x2c,0x3a,0xda,0xce,
-0xb8,0xff,0xe1,0xd5,0xc1,0xff,0xea,0xdf,0xcb,0xff,0xba,0xaf,0x9c,0xbb,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xae,0x9f,0x85,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xae,0x9f,0x85,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0x00,0xff,0xff,0xff,0x00,0x03,0x03,0x02,0x04,0x1b,0x18,0x13,0xff,0x6c,0x64,
-0x58,0xff,0x46,0x3f,0x34,0xff,0x26,0x1f,0x14,0x26,0x15,0x11,0x0b,0x16,0x0d,0x0b,
-0x07,0x0e,0x01,0x01,0x01,0x02,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x13,0x12,0x10,0x14,0x57,0x53,
-0x4b,0x58,0x93,0x8b,0x7e,0x93,0xc2,0xb8,0xa7,0xc3,0xe1,0xd5,0xc1,0xe1,0xc2,0xb8,
-0xa7,0xc3,0x93,0x8b,0x7e,0x93,0x57,0x53,0x4b,0x58,0x13,0x12,0x10,0x14,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xb9,0xa9,
-0x8d,0xb9,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,
-0x8d,0xb9,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xb9,0xa9,0x8d,0xb9,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x31,0x2c,0x25,0x32,0xcb,0xbd,
-0xa5,0xff,0xe2,0xd6,0xc2,0xff,0xe5,0xda,0xc6,0xff,0xe0,0xd3,0xbc,0xe1,0x96,0x8d,
-0x7f,0x97,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb2,0xa3,0x88,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb2,0xa3,0x88,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0xff,0xff,0xff,0x00,0x03,0x03,0x02,0x04,0x20,0x1d,0x17,0xff,0x19,0x16,
-0x11,0xff,0x12,0x0f,0x0a,0x12,0x08,0x07,0x05,0x08,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,0xc1,0xe1,0xe1,0xd5,
-0xc1,0xe1,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xe1,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xb9,0xa9,0x8d,0xb9,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xb9,0xb9,0xa9,0x8d,0xb9,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x07,0x07,0x06,0x08,0xa4,0x95,
-0x7b,0xa5,0x7c,0x74,0x66,0x7c,0x7a,0x70,0x60,0x7a,0xba,0xaa,0x8e,0xbb,0xa4,0x98,
-0x84,0xa5,0x1a,0x18,0x14,0x1a,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb6,0xa7,0x8a,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb6,0xa7,0x8a,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,
-0x8d,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,
-0x8d,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,
-0x8d,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,0x8d,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,
-0x8d,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,
-0x8d,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,
-0x8d,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,0x8d,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,
-0x8d,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,
-0x8d,0x00,0xb9,0xa9,0x8d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0xff,0xff,0xff,0x00,0x03,0x03,0x02,0x04,0x03,0x03,0x02,0x04,0x03,0x03,
-0x02,0x04,0x02,0x01,0x01,0x02,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x19,0x16,
-0x13,0x1a,0xff,0xff,0xff,0x00,0x24,0x20,0x1a,0x24,0x30,0x2b,0x24,0x30,0xff,0xff,
-0xff,0x00,0x1d,0x1b,0x16,0x1e,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb6,0xa6,0x8a,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb6,0xa6,0x8a,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,
-0x8d,0x00,0xb9,0xa9,0x8d,0x00,0x45,0x3f,0x35,0x00,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0x00,0x00,0x00,
-0x00,0x00,0x45,0x3f,0x35,0x00,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0x00,0x45,0x3f,0x35,0x00,0x45,0x3f,
-0x35,0x00,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0x00,0x45,0x3f,0x35,0x00,0x45,0x3f,0x35,0x00,0x45,0x3f,
-0x35,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,
-0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x68,0x5e,0x4f,0xc0,0xe1,0xd5,0xc1,0xc0,0xe1,0xd5,0xc1,0xc0,0x68,0x5e,
-0x4f,0xc0,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0x00,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0x00,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x45,0x3f,0x35,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x68,0x5e,0x4f,0xc0,0xe1,0xd5,0xc1,0xc0,0xe1,0xd5,0xc1,0xc0,0x68,0x5e,
-0x4f,0xc0,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x4d,0x45,0x3b,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x4d,0x45,
-0x3b,0xff,0x00,0x00,0x00,0xff,0x4d,0x45,0x3b,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x4d,0x45,0x3b,0xff,0x00,0x00,
-0x00,0xff,0x4d,0x45,0x3b,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x4d,0x45,0x3b,0xff,0x00,0x00,0x00,0xff,0x4d,0x45,
-0x3b,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x4d,0x45,0x3b,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x45,0x3b,0x00,0x00,0x00,0x00,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xc0,0xe1,0xd5,0xc1,0xc0,0x68,0x5e,
-0x4f,0xc0,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x56,0x4f,0x42,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0xd8,0xc9,
-0xb0,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x56,0x4f,0x42,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xd8,0xc9,0xb0,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x56,0x4f,
-0x42,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x46,0x3d,0x30,0xff,0xfd,0xf9,0xee,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x56,0x4f,0x42,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xfd,0xf9,
-0xee,0xff,0x46,0x3d,0x30,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x56,0x4f,0x42,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x4f,0x42,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xd8,0xc9,
-0xb0,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xc0,0x68,0x5e,
-0x4f,0xc0,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x63,0x5b,0x4b,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0xd2,0xc2,0xa7,0xff,0xde,0xd1,
-0xba,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x63,0x5b,0x4b,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xde,0xd1,0xba,0xff,0xd2,0xc2,0xa7,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x63,0x5b,
-0x4b,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x46,0x3d,
-0x30,0xff,0xfc,0xf7,0xe8,0xff,0xfe,0xfb,0xf3,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x63,0x5b,0x4b,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xfe,0xfb,
-0xf3,0xff,0xfc,0xf7,0xe8,0xff,0x46,0x3d,0x30,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x63,0x5b,0x4b,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x5b,0x4b,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xde,0xd1,
-0xba,0xff,0xd2,0xc2,0xa7,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xc0,0x68,0x5e,
-0x4f,0xc0,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x71,0x66,0x56,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,
-0xba,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x71,0x66,0x56,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,0xba,0xff,0xb9,0xa9,
-0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x71,0x66,
-0x56,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x46,0x3d,0x30,0xff,0xf3,0xe9,
-0xcd,0xff,0xfe,0xfb,0xf3,0xff,0xfe,0xfb,0xf3,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x71,0x66,0x56,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xfe,0xfb,
-0xf3,0xff,0xfe,0xfb,0xf3,0xff,0xf3,0xe9,0xcd,0xff,0x46,0x3d,0x30,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x71,0x66,0x56,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71,0x66,0x56,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xde,0xd1,
-0xba,0xff,0xde,0xd1,0xba,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xc0,0x68,0x5e,
-0x4f,0xc0,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x7f,0x74,0x61,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,
-0xba,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x7f,0x74,0x61,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,0xba,0xff,0xe1,0xd5,
-0xc1,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x7f,0x74,
-0x61,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x46,0x3d,0x30,0xff,0xf3,0xe9,0xcd,0xff,0xfe,0xfc,
-0xf7,0xff,0xfe,0xfb,0xf3,0xff,0xfe,0xfb,0xf3,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x7f,0x74,0x61,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xfe,0xfb,
-0xf3,0xff,0xfe,0xfb,0xf3,0xff,0xfe,0xfc,0xf7,0xff,0xf3,0xe9,0xcd,0xff,0x46,0x3d,
-0x30,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x7f,0x74,0x61,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x74,0x61,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xde,0xd1,
-0xba,0xff,0xde,0xd1,0xba,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xc0,0x68,0x5e,
-0x4f,0xc0,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x8e,0x81,0x6c,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0xe1,0xd5,0xbf,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,
-0xba,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x8e,0x81,0x6c,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,
-0xba,0xff,0xe1,0xd5,0xbf,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x8e,0x81,
-0x6c,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x46,0x3d,0x30,0xff,0xf3,0xe9,0xcd,0xff,0xfe,0xfc,0xf6,0xff,0xfe,0xfb,
-0xf3,0xff,0xfe,0xfb,0xf3,0xff,0xfe,0xfb,0xf3,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x8e,0x81,0x6c,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xfe,0xfb,
-0xf3,0xff,0xfe,0xfb,0xf3,0xff,0xfe,0xfb,0xf3,0xff,0xfe,0xfc,0xf6,0xff,0xf3,0xe9,
-0xcd,0xff,0x46,0x3d,0x30,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x8e,0x81,0x6c,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0x81,0x6c,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xde,0xd1,
-0xba,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,0xba,0xff,0xe1,0xd5,0xbf,0xff,0xb9,0xa9,
-0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xc0,0x68,0x5e,
-0x4f,0xc0,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x9b,0x8d,0x76,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,
-0xba,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x9b,0x8d,0x76,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,
-0xba,0xff,0xde,0xd1,0xba,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x9b,0x8d,
-0x76,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x46,0x3d,
-0x30,0xff,0xfe,0xfc,0xf7,0xff,0xfe,0xfc,0xf7,0xff,0xfe,0xfb,0xf3,0xff,0xfe,0xfb,
-0xf3,0xff,0xfe,0xfb,0xf3,0xff,0xfe,0xfb,0xf3,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x9b,0x8d,0x76,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xfe,0xfb,
-0xf3,0xff,0xfe,0xfb,0xf3,0xff,0xfe,0xfb,0xf3,0xff,0xfe,0xfb,0xf3,0xff,0xfe,0xfc,
-0xf7,0xff,0xfe,0xfc,0xf7,0xff,0x46,0x3d,0x30,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x9b,0x8d,0x76,0xff,0x45,0x3f,0x35,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,0x8d,0x76,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x45,0x3f,0x35,0xff,0xe1,0xd5,0xc1,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xde,0xd1,
-0xba,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,0xba,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xc0,0x68,0x5e,
-0x4f,0xc0,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xa7,0x99,0x7f,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,
-0xba,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xa7,0x99,0x7f,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,
-0xba,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xa7,0x99,
-0x7f,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x46,0x3d,0x30,0xff,0xf3,0xe9,0xcd,0xff,0xfe,0xfc,0xf7,0xff,0xfe,0xfb,
-0xf3,0xff,0xfe,0xfb,0xf3,0xff,0xfe,0xfb,0xf3,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xa7,0x99,0x7f,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xfe,0xfb,
-0xf3,0xff,0xfe,0xfb,0xf3,0xff,0xfe,0xfb,0xf3,0xff,0xfe,0xfc,0xf7,0xff,0xf3,0xe9,
-0xcd,0xff,0x46,0x3d,0x30,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xa7,0x99,0x7f,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0x99,0x7f,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xde,0xd1,
-0xba,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,0xba,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,
-0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xc0,0x68,0x5e,
-0x4f,0xc0,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb2,0xa2,0x88,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,
-0xba,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb2,0xa2,0x88,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,
-0xba,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb2,0xa2,
-0x88,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x46,0x3d,0x30,0xff,0xf3,0xe9,0xcd,0xff,0xfe,0xfb,
-0xf3,0xff,0xfe,0xfb,0xf3,0xff,0xfe,0xfb,0xf3,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb2,0xa2,0x88,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xfe,0xfb,
-0xf3,0xff,0xfe,0xfb,0xf3,0xff,0xfe,0xfb,0xf3,0xff,0xf3,0xe9,0xcd,0xff,0x46,0x3d,
-0x30,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb2,0xa2,0x88,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb2,0xa2,0x88,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0xe1,0xd5,0xbf,0xff,0xde,0xd1,0xba,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,
-0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xde,0xd1,
-0xba,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,0xba,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xc0,0x68,0x5e,
-0x4f,0xc0,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,
-0xba,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,0xba,0xff,0xb9,0xa9,
-0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,
-0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x46,0x3d,0x30,0xff,0xf3,0xe9,
-0xcd,0xff,0xfe,0xfb,0xf3,0xff,0xfe,0xfb,0xf3,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xfe,0xfb,
-0xf3,0xff,0xfe,0xfb,0xf3,0xff,0xf3,0xe9,0xcd,0xff,0x46,0x3d,0x30,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0xa9,0x8d,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0x00,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,
-0xc1,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,
-0xba,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0x00,0xde,0xd1,
-0xba,0xff,0xde,0xd1,0xba,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xc0,0xe1,0xd5,0xc1,0xc0,0x68,0x5e,
-0x4f,0xc0,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0xd7,0xc7,0xae,0xff,0xde,0xd1,
-0xba,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xde,0xd1,0xba,0xff,0xd7,0xc7,0xae,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,
-0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x46,0x3d,
-0x30,0xff,0xfd,0xf9,0xed,0xff,0xfe,0xfb,0xf3,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xfe,0xfb,
-0xf3,0xff,0xfd,0xf9,0xed,0xff,0x46,0x3d,0x30,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0xa9,0x8d,0x00,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0xd2,0xc2,0xa7,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,
-0xba,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,
-0xba,0xff,0xde,0xd1,0xba,0xff,0xd7,0xc7,0xae,0xff,0x3b,0x35,0x2b,0xff,0xde,0xd1,
-0xba,0xff,0xd7,0xc7,0xae,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x68,0x5e,0x4f,0xc0,0xe1,0xd5,0xc1,0xc0,0xe1,0xd5,0xc1,0xc0,0x68,0x5e,
-0x4f,0xc0,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb1,0xa2,0x87,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x3b,0x35,0x2b,0xff,0xdd,0xcc,
-0xb6,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb1,0xa2,0x87,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xdd,0xcc,0xb6,0xff,0x3b,0x35,0x2b,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb1,0xa2,
-0x87,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x38,0x30,0x24,0xff,0xfe,0xfa,0xf1,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb1,0xa2,0x87,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xfe,0xfa,
-0xf1,0xff,0x38,0x30,0x24,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb1,0xa2,0x87,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb1,0xa2,0x87,0x00,0xff,0xff,
-0xff,0x00,0xd8,0xc9,0xb0,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,
-0xba,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,
-0xba,0xff,0xde,0xd1,0xba,0xff,0xde,0xd1,0xba,0xff,0xdd,0xcc,0xb6,0xff,0xdd,0xcc,
-0xb6,0xff,0x3b,0x35,0x2b,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x68,0x5e,0x4f,0xc0,0xe1,0xd5,0xc1,0xc0,0xe1,0xd5,0xc1,0xc0,0x68,0x5e,
-0x4f,0xc0,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xb1,0xa2,0x87,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb1,0xa2,
-0x87,0xff,0x00,0x00,0x00,0xff,0xb1,0xa2,0x87,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb1,0xa2,0x87,0xff,0x00,0x00,
-0x00,0xff,0xb1,0xa2,0x87,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb1,0xa2,0x87,0xff,0x00,0x00,0x00,0xff,0xb1,0xa2,
-0x87,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb1,0xa2,0x87,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0xb1,0xa2,0x87,0x00,0x00,0x00,0x00,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xb1,0xa2,
-0x87,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb1,0xa2,0x87,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0x00,0x00,0x00,0x00,0xff,0xb1,0xa2,0x87,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb1,0xa2,0x87,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0x00,0x00,0x00,0x00,0xff,0xb1,0xa2,0x87,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb1,0xa2,0x87,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0xff,0xb1,0xa2,0x87,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb1,0xa2,
-0x87,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0xb1,0xa2,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,
-0x8d,0x00,0xb9,0xa9,0x8d,0x00,0x45,0x3f,0x35,0x00,0x00,0x00,0x00,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,
-0x8d,0x00,0x45,0x3f,0x35,0x00,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,
-0x8d,0x00,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,
-0x8d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,
-0x8d,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,
-0x8d,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,0x8d,0x00,0xb9,0xa9,
-0x8d,0x00,0xb9,0xa9,0x8d,0x00,0x45,0x3f,0x35,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,
-0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,
-0x0d,0xff,0x0d,0x0d,0x0d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x13,0x0d,0x03,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x27,0x21,0x17,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x3b,0x35,0x2b,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x4f,0x49,0x3f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x63,0x5d,0x53,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x77,0x71,0x67,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x8b,0x85,0x7b,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x9f,0x99,0x8f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb3,0xad,0xa3,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xc7,0xc1,0xb7,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,
-0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,
-0x0d,0xff,0x0d,0x0d,0x0d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x39,0x30,0x21,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x4d,0x44,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x61,0x58,0x49,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x75,0x6c,0x5d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x89,0x80,0x71,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x9d,0x94,0x85,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb1,0xa8,0x99,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xc5,0xbc,0xad,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xd9,0xd0,0xc1,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xed,0xe4,0xd5,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,
-0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,
-0x0d,0xff,0x0d,0x0d,0x0d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x13,0x0d,0x03,0xff,0x39,0x30,0x21,0xff,0x87,0x77,
-0x5b,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x27,0x21,
-0x17,0xff,0x4d,0x44,0x35,0xff,0x9b,0x8b,0x6f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x3b,0x35,0x2b,0xff,0x61,0x58,0x49,0xff,0xaf,0x9f,
-0x83,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x4f,0x49,
-0x3f,0xff,0x75,0x6c,0x5d,0xff,0xc3,0xb3,0x97,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x63,0x5d,0x53,0xff,0x89,0x80,0x71,0xff,0xd7,0xc7,
-0xab,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x77,0x71,
-0x67,0xff,0x9d,0x94,0x85,0xff,0xeb,0xdb,0xbf,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x8b,0x85,0x7b,0xff,0xb1,0xa8,0x99,0xff,0xff,0xef,
-0xd3,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x9f,0x99,
-0x8f,0xff,0xc5,0xbc,0xad,0xff,0xff,0xff,0xe7,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb3,0xad,0xa3,0xff,0xd9,0xd0,0xc1,0xff,0xff,0xff,
-0xfb,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xc7,0xc1,
-0xb7,0xff,0xed,0xe4,0xd5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,
-0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,
-0x0d,0xff,0x0d,0x0d,0x0d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x13,0x0d,0x03,0xff,0x39,0x30,0x21,0xff,0x87,0x77,0x5b,0xff,0x87,0x77,
-0x5b,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x27,0x21,0x17,0xff,0x4d,0x44,
-0x35,0xff,0x9b,0x8b,0x6f,0xff,0x9b,0x8b,0x6f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x3b,0x35,0x2b,0xff,0x61,0x58,0x49,0xff,0xaf,0x9f,0x83,0xff,0xaf,0x9f,
-0x83,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x4f,0x49,0x3f,0xff,0x75,0x6c,
-0x5d,0xff,0xc3,0xb3,0x97,0xff,0xc3,0xb3,0x97,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x63,0x5d,0x53,0xff,0x89,0x80,0x71,0xff,0xd7,0xc7,0xab,0xff,0xd7,0xc7,
-0xab,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x77,0x71,0x67,0xff,0x9d,0x94,
-0x85,0xff,0xeb,0xdb,0xbf,0xff,0xeb,0xdb,0xbf,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x8b,0x85,0x7b,0xff,0xb1,0xa8,0x99,0xff,0xff,0xef,0xd3,0xff,0xff,0xef,
-0xd3,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x9f,0x99,0x8f,0xff,0xc5,0xbc,
-0xad,0xff,0xff,0xff,0xe7,0xff,0xff,0xff,0xe7,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb3,0xad,0xa3,0xff,0xd9,0xd0,0xc1,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,
-0xfb,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xc7,0xc1,0xb7,0xff,0xed,0xe4,
-0xd5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,
-0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,
-0x0d,0xff,0x0d,0x0d,0x0d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x13,0x0d,0x03,0xff,0x39,0x30,0x21,0xff,0x87,0x77,0x5b,0xff,0x87,0x77,
-0x5b,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x27,0x21,0x17,0xff,0x4d,0x44,
-0x35,0xff,0x9b,0x8b,0x6f,0xff,0x9b,0x8b,0x6f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x3b,0x35,0x2b,0xff,0x61,0x58,0x49,0xff,0xaf,0x9f,0x83,0xff,0xaf,0x9f,
-0x83,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x4f,0x49,0x3f,0xff,0x75,0x6c,
-0x5d,0xff,0xc3,0xb3,0x97,0xff,0xc3,0xb3,0x97,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x63,0x5d,0x53,0xff,0x89,0x80,0x71,0xff,0xd7,0xc7,0xab,0xff,0xd7,0xc7,
-0xab,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x77,0x71,0x67,0xff,0x9d,0x94,
-0x85,0xff,0xeb,0xdb,0xbf,0xff,0xeb,0xdb,0xbf,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x8b,0x85,0x7b,0xff,0xb1,0xa8,0x99,0xff,0xff,0xef,0xd3,0xff,0xff,0xef,
-0xd3,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x9f,0x99,0x8f,0xff,0xc5,0xbc,
-0xad,0xff,0xff,0xff,0xe7,0xff,0xff,0xff,0xe7,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb3,0xad,0xa3,0xff,0xd9,0xd0,0xc1,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,
-0xfb,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xc7,0xc1,0xb7,0xff,0xed,0xe4,
-0xd5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,
-0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,
-0x0d,0xff,0x0d,0x0d,0x0d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xe1,0xd5,0xc1,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0xe1,0xd5,0xc1,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,
-0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x13,0x0d,0x03,0xff,0x39,0x30,0x21,0xff,0x87,0x77,
-0x5b,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x27,0x21,
-0x17,0xff,0x4d,0x44,0x35,0xff,0x9b,0x8b,0x6f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x3b,0x35,0x2b,0xff,0x61,0x58,0x49,0xff,0xaf,0x9f,
-0x83,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x4f,0x49,
-0x3f,0xff,0x75,0x6c,0x5d,0xff,0xc3,0xb3,0x97,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x63,0x5d,0x53,0xff,0x89,0x80,0x71,0xff,0xd7,0xc7,
-0xab,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x77,0x71,
-0x67,0xff,0x9d,0x94,0x85,0xff,0xeb,0xdb,0xbf,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x8b,0x85,0x7b,0xff,0xb1,0xa8,0x99,0xff,0xff,0xef,
-0xd3,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x9f,0x99,
-0x8f,0xff,0xc5,0xbc,0xad,0xff,0xff,0xff,0xe7,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb3,0xad,0xa3,0xff,0xd9,0xd0,0xc1,0xff,0xff,0xff,
-0xfb,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xc7,0xc1,
-0xb7,0xff,0xed,0xe4,0xd5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,
-0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,
-0x0d,0xff,0x0d,0x0d,0x0d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xe1,0xd5,0xc1,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0xe1,0xd5,0xc1,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0x68,0x5e,0x4f,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x68,0x5e,0x4f,0xff,0xab,0x9c,0x83,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x39,0x30,0x21,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x4d,0x44,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x61,0x58,0x49,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x75,0x6c,0x5d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x89,0x80,0x71,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x9d,0x94,0x85,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb1,0xa8,0x99,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xc5,0xbc,0xad,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xd9,0xd0,0xc1,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xed,0xe4,0xd5,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,
-0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,
-0x0d,0xff,0x0d,0x0d,0x0d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,
-0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,0x4f,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x13,0x0d,0x03,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x27,0x21,0x17,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x3b,0x35,0x2b,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x4f,0x49,0x3f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x63,0x5d,0x53,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x77,0x71,0x67,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x8b,0x85,0x7b,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x9f,0x99,0x8f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb3,0xad,0xa3,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xc7,0xc1,0xb7,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,
-0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,
-0x0d,0xff,0x0d,0x0d,0x0d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,
-0x8d,0xff,0x68,0x5e,0x4f,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,
-0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,
-0x0d,0xff,0x0d,0x0d,0x0d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,
-0x35,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x6b,0x62,0x53,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,
-0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,
-0x0d,0xff,0x0d,0x0d,0x0d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,
-0x53,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,
-0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,
-0x0d,0xff,0x0d,0x0d,0x0d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x6b,0x62,0x53,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,
-0x53,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,
-0x8d,0xff,0x68,0x5e,0x4f,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,
-0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,
-0x4f,0xff,0xab,0x9c,0x83,0xff,0x68,0x5e,0x4f,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,
-0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb6,0xa6,0x8a,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb6,0xa6,0x8a,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,
-0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,
-0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,
-0x8d,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb6,0xa7,0x8a,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb6,0xa7,0x8a,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,
-0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb2,0xa3,0x88,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb2,0xa3,0x88,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xae,0x9f,0x85,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xae,0x9f,0x85,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x2e,0x2a,0x23,0xff,0x2e,0x2a,
-0x23,0xff,0x2e,0x2a,0x23,0xff,0x2e,0x2a,0x23,0xff,0x2e,0x2a,0x23,0xff,0x2e,0x2a,
-0x23,0xff,0x2e,0x2a,0x23,0xff,0x00,0x00,0x00,0xff,0x2e,0x2a,0x23,0xff,0x2e,0x2a,
-0x23,0xff,0x2e,0x2a,0x23,0xff,0x2e,0x2a,0x23,0xff,0x2e,0x2a,0x23,0xff,0x2e,0x2a,
-0x23,0xff,0x2e,0x2a,0x23,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xaa,0x9b,0x81,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xaa,0x9b,0x81,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x2e,0x2a,0x23,0xff,0x22,0x1f,
-0x1a,0xff,0x22,0x1f,0x1a,0xff,0x22,0x1f,0x1a,0xff,0x2e,0x2a,0x23,0xff,0x22,0x1f,
-0x1a,0xff,0x2e,0x2a,0x23,0xff,0x00,0x00,0x00,0xff,0x2e,0x2a,0x23,0xff,0x22,0x1f,
-0x1a,0xff,0x22,0x1f,0x1a,0xff,0x22,0x1f,0x1a,0xff,0x2e,0x2a,0x23,0xff,0x22,0x1f,
-0x1a,0xff,0x2e,0x2a,0x23,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0xe1,0xd5,0xc1,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xa4,0x96,0x7d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xa4,0x96,0x7d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x2e,0x2a,0x23,0xff,0x22,0x1f,
-0x1a,0xff,0x22,0x1f,0x1a,0xff,0x22,0x1f,0x1a,0xff,0x2e,0x2a,0x23,0xff,0x22,0x1f,
-0x1a,0xff,0x2e,0x2a,0x23,0xff,0x00,0x00,0x00,0xff,0x2e,0x2a,0x23,0xff,0x22,0x1f,
-0x1a,0xff,0x22,0x1f,0x1a,0xff,0x22,0x1f,0x1a,0xff,0x2e,0x2a,0x23,0xff,0x22,0x1f,
-0x1a,0xff,0x2e,0x2a,0x23,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0xe1,0xd5,0xc1,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x9f,0x91,0x79,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x9f,0x91,0x79,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x2e,0x2a,0x23,0xff,0x22,0x1f,
-0x1a,0xff,0x22,0x1f,0x1a,0xff,0x22,0x1f,0x1a,0xff,0x2e,0x2a,0x23,0xff,0x22,0x1f,
-0x1a,0xff,0x2e,0x2a,0x23,0xff,0x11,0x10,0x0d,0xff,0x2e,0x2a,0x23,0xff,0x22,0x1f,
-0x1a,0xff,0x22,0x1f,0x1a,0xff,0x22,0x1f,0x1a,0xff,0x2e,0x2a,0x23,0xff,0x22,0x1f,
-0x1a,0xff,0x2e,0x2a,0x23,0xff,0x11,0x10,0x0d,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,
-0x8d,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0xe1,0xd5,0xc1,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,
-0x53,0xff,0x6b,0x62,0x53,0xff,0x6b,0x62,0x53,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x99,0x8b,0x74,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x99,0x8b,0x74,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x11,0x10,0x0d,0xff,0x2e,0x2a,
-0x23,0xff,0x22,0x1f,0x1a,0xff,0x22,0x1f,0x1a,0xff,0x22,0x1f,0x1a,0xff,0x22,0x1f,
-0x1a,0xff,0x22,0x1f,0x1a,0xff,0x2e,0x2a,0x23,0xff,0x11,0x10,0x0d,0xff,0x2e,0x2a,
-0x23,0xff,0x22,0x1f,0x1a,0xff,0x22,0x1f,0x1a,0xff,0x22,0x1f,0x1a,0xff,0x22,0x1f,
-0x1a,0xff,0x22,0x1f,0x1a,0xff,0x2e,0x2a,0x23,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0xe1,0xd5,
-0xc1,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,
-0xc1,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x92,0x86,0x70,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x92,0x86,0x70,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,
-0x35,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x2e,0x2a,
-0x23,0xff,0x22,0x1f,0x1a,0xff,0x22,0x1f,0x1a,0xff,0x22,0x1f,0x1a,0xff,0x22,0x1f,
-0x1a,0xff,0x22,0x1f,0x1a,0xff,0x2e,0x2a,0x23,0xff,0x11,0x10,0x0d,0xff,0x2e,0x2a,
-0x23,0xff,0x22,0x1f,0x1a,0xff,0x22,0x1f,0x1a,0xff,0x22,0x1f,0x1a,0xff,0x22,0x1f,
-0x1a,0xff,0x22,0x1f,0x1a,0xff,0x2e,0x2a,0x23,0xff,0x11,0x10,0x0d,0xff,0x45,0x3f,
-0x35,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,
-0xc1,0xff,0xb9,0xa9,0x8d,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0xe1,0xd5,
-0xc1,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,
-0x35,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0xe1,0xd5,0xc1,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x8c,0x80,0x6b,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x8c,0x80,0x6b,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x11,0x10,
-0x0d,0xff,0x2e,0x2a,0x23,0xff,0x22,0x1f,0x1a,0xff,0x22,0x1f,0x1a,0xff,0x22,0x1f,
-0x1a,0xff,0x22,0x1f,0x1a,0xff,0x22,0x1f,0x1a,0xff,0x2e,0x2a,0x23,0xff,0x11,0x10,
-0x0d,0xff,0x2e,0x2a,0x23,0xff,0x22,0x1f,0x1a,0xff,0x22,0x1f,0x1a,0xff,0x22,0x1f,
-0x1a,0xff,0x22,0x1f,0x1a,0xff,0x22,0x1f,0x1a,0xff,0x2e,0x2a,0x23,0xff,0x00,0x00,
-0x00,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,
-0x35,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,0x8d,0xff,0x86,0x7b,0x68,0xff,0xb9,0xa9,
-0x8d,0xff,0xe1,0xd5,0xc1,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0xe1,0xd5,0xc1,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7a,0x66,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7a,0x66,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x2e,0x2a,0x23,0xff,0x2e,0x2a,0x23,0xff,0x2e,0x2a,0x23,0xff,0x2e,0x2a,
-0x23,0xff,0x2e,0x2a,0x23,0xff,0x2e,0x2a,0x23,0xff,0x2e,0x2a,0x23,0xff,0x00,0x00,
-0x00,0xff,0x2e,0x2a,0x23,0xff,0x2e,0x2a,0x23,0xff,0x2e,0x2a,0x23,0xff,0x2e,0x2a,
-0x23,0xff,0x2e,0x2a,0x23,0xff,0x2e,0x2a,0x23,0xff,0x2e,0x2a,0x23,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,
-0xc1,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x7f,0x74,0x61,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x7f,0x74,0x61,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,
-0xc1,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0xe1,0xd5,0xc1,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x78,0x6e,0x5c,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x78,0x6e,0x5c,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,
-0xc1,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0xe1,0xd5,0xc1,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x72,0x68,0x57,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x72,0x68,0x57,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,
-0xc1,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0xe1,0xd5,0xc1,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,
-0xc1,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0x86,0x7b,0x68,0xff,0xb9,0xa9,0x8d,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,0x52,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x6b,0x62,0x52,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,
-0xc1,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0xe1,0xd5,0xc1,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0x86,0x7b,0x68,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x65,0x5c,
-0x4e,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x65,0x5c,0x4e,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x68,0x5e,0x4f,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,
-0xc1,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0xe1,0xd5,0xc1,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0x86,0x7b,0x68,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x5f,0x57,0x49,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x5f,0x57,0x49,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0xd2,0xc6,
-0xb3,0xff,0xd2,0xc6,0xb3,0xff,0x68,0x5e,0x4f,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0xd2,0xc6,0xb3,0xff,0x68,0x5e,
-0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,
-0xc1,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0xe1,0xd5,0xc1,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,
-0xc1,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0x86,0x7b,0x68,0xff,0xb9,0xa9,0x8d,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x5a,0x52,0x44,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x5a,0x52,
-0x44,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x68,0x5e,0x4f,0xff,0xbb,0xb1,0x9f,0xff,0xbb,0xb1,0x9f,0xff,0x68,0x5e,
-0x4f,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0xbb,0xb1,
-0x9f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,
-0x53,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,
-0xc1,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0xe1,0xd5,0xc1,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x55,0x4d,0x41,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x55,0x4d,0x41,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xa1,0x97,0x88,0xff,0x68,0x5e,0x4f,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xa1,0x97,
-0x88,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x47,0x42,
-0x37,0xff,0x4b,0x45,0x3a,0xff,0x4f,0x48,0x3d,0xff,0x53,0x4c,0x41,0xff,0x59,0x51,
-0x44,0xff,0x5e,0x56,0x49,0xff,0x63,0x5b,0x4d,0xff,0x68,0x60,0x51,0xff,0x6e,0x64,
-0x55,0xff,0x73,0x69,0x59,0xff,0x78,0x6d,0x5d,0xff,0x7c,0x72,0x60,0xff,0x80,0x76,
-0x63,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x80,0x76,0x63,0xff,0x80,0x76,
-0x63,0xff,0x80,0x76,0x63,0xff,0x80,0x76,0x63,0xff,0x80,0x76,0x63,0xff,0x80,0x76,
-0x63,0xff,0x80,0x76,0x63,0xff,0x80,0x76,0x63,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x86,0x7b,0x68,0xff,0x83,0x79,0x66,0xff,0x80,0x76,0x63,0xff,0x7c,0x72,
-0x60,0xff,0x78,0x6d,0x5d,0xff,0x73,0x69,0x59,0xff,0x6e,0x64,0x55,0xff,0x68,0x60,
-0x51,0xff,0x63,0x5b,0x4d,0xff,0x5e,0x56,0x49,0xff,0x59,0x51,0x44,0xff,0x53,0x4c,
-0x41,0xff,0x4f,0x48,0x3d,0xff,0x4b,0x45,0x3a,0xff,0x47,0x42,0x37,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,
-0x53,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,
-0xc1,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0xe1,0xd5,0xc1,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x86,0x7d,0x6e,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x85,0x7c,
-0x6e,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,
-0x53,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,
-0xc1,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0xe1,0xd5,0xc1,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
-0x00,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x04,0x04,0x04,0xff,0x0e,0x0e,0x0e,0xff,0x16,0x16,
-0x16,0xff,0x07,0x07,0x07,0xff,0x04,0x04,0x04,0xff,0x00,0x00,0x00,0xff,0x01,0x01,
-0x01,0xff,0x04,0x04,0x04,0xff,0x03,0x03,0x03,0xff,0x0d,0x0d,0x0d,0xff,0x03,0x03,
-0x03,0xff,0x01,0x01,0x01,0xff,0x00,0x00,0x00,0xff,0x02,0x02,0x02,0xff,0x07,0x07,
-0x07,0xff,0x30,0x2e,0x2b,0xff,0x49,0x44,0x3c,0xff,0x26,0x20,0x1b,0xff,0x2b,0x28,
-0x23,0xff,0x2b,0x2b,0x2a,0xff,0x22,0x22,0x22,0xff,0x10,0x10,0x10,0xff,0x1c,0x1c,
-0x1c,0xff,0x1e,0x1e,0x1e,0xff,0x10,0x10,0x10,0xff,0x05,0x05,0x05,0xff,0x13,0x13,
-0x13,0xff,0x09,0x09,0x09,0xff,0x07,0x07,0x07,0xff,0x14,0x14,0x14,0xff,0x07,0x07,
-0x07,0xff,0x0f,0x0f,0x0f,0xff,0x08,0x08,0x08,0xff,0x09,0x09,0x09,0xff,0x09,0x09,
-0x09,0xff,0x02,0x02,0x02,0xff,0x04,0x04,0x04,0xff,0x06,0x06,0x06,0xff,0x0c,0x0a,
-0x09,0xff,0x10,0x0b,0x09,0xff,0x23,0x21,0x1e,0xff,0x1b,0x1b,0x1a,0xff,0x07,0x07,
-0x07,0xff,0x12,0x12,0x12,0xff,0x04,0x04,0x04,0xff,0x09,0x09,0x09,0xff,0x12,0x12,
-0x12,0xff,0x0a,0x0a,0x0a,0xff,0x25,0x25,0x25,0xff,0x11,0x11,0x11,0xff,0x09,0x09,
-0x09,0xff,0x07,0x07,0x07,0xff,0x06,0x06,0x06,0xff,0x14,0x14,0x14,0xff,0x1f,0x1f,
-0x1f,0xff,0x15,0x15,0x15,0xff,0x05,0x05,0x05,0xff,0x04,0x04,0x04,0xff,0x1a,0x1a,
-0x1a,0xff,0x08,0x08,0x08,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x03,0x03,
-0x03,0xff,0x0d,0x0d,0x0d,0xff,0x04,0x04,0x04,0xff,0x0e,0x0e,0x0e,0xff,0xff,0xff,
-0xff,0x00,0x6b,0x64,0x56,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x6b,0x63,
-0x57,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,
-0x53,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,
-0xc1,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0xe1,0xd5,0xc1,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x03,0x03,0x03,0xff,0x09,0x09,0x09,0xff,0x26,0x26,
-0x26,0xff,0x0a,0x0a,0x0a,0xff,0x0f,0x0f,0x0f,0xff,0x03,0x03,0x03,0xff,0x03,0x03,
-0x03,0xff,0x05,0x05,0x05,0xff,0x11,0x11,0x11,0xff,0x18,0x18,0x18,0xff,0x07,0x07,
-0x07,0xff,0x1e,0x1e,0x1e,0xff,0x1a,0x1a,0x1a,0xff,0x09,0x09,0x09,0xff,0x17,0x17,
-0x16,0xff,0x1e,0x1d,0x19,0xff,0x44,0x3f,0x36,0xff,0x3a,0x35,0x2d,0xff,0x09,0x08,
-0x07,0xff,0x03,0x03,0x03,0xff,0x04,0x04,0x04,0xff,0x06,0x06,0x06,0xff,0x1a,0x1a,
-0x1a,0xff,0x05,0x05,0x05,0xff,0x00,0x00,0x00,0xff,0x07,0x07,0x07,0xff,0x01,0x01,
-0x01,0xff,0x0b,0x0b,0x0b,0xff,0x1a,0x1a,0x1a,0xff,0x0b,0x0b,0x0b,0xff,0x08,0x08,
-0x08,0xff,0x10,0x10,0x10,0xff,0x08,0x08,0x08,0xff,0x07,0x07,0x07,0xff,0x00,0x00,
-0x00,0xff,0x01,0x01,0x01,0xff,0x0d,0x0d,0x0d,0xff,0x1d,0x1d,0x1d,0xff,0x19,0x17,
-0x15,0xff,0x29,0x25,0x1e,0xff,0x2f,0x2d,0x29,0xff,0x22,0x22,0x21,0xff,0x0b,0x0b,
-0x0b,0xff,0x02,0x02,0x02,0xff,0x00,0x00,0x00,0xff,0x04,0x04,0x04,0xff,0x01,0x01,
-0x01,0xff,0x0d,0x0d,0x0d,0xff,0x27,0x27,0x27,0xff,0x07,0x07,0x07,0xff,0x01,0x01,
-0x01,0xff,0x07,0x07,0x07,0xff,0x05,0x05,0x05,0xff,0x00,0x00,0x00,0xff,0x05,0x05,
-0x05,0xff,0x00,0x00,0x00,0xff,0x07,0x07,0x07,0xff,0x14,0x14,0x14,0xff,0x04,0x04,
-0x04,0xff,0x02,0x02,0x02,0xff,0x04,0x04,0x04,0xff,0x1b,0x1b,0x1b,0xff,0x23,0x23,
-0x23,0xff,0x06,0x06,0x06,0xff,0x03,0x03,0x03,0xff,0x09,0x09,0x09,0xff,0xff,0xff,
-0xff,0x00,0x55,0x4e,0x43,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x54,0x4e,
-0x42,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,
-0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,
-0x53,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,
-0xc1,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0xe1,0xd5,0xc1,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x13,0x13,0x13,0xff,0x0e,0x0e,0x0e,0xff,0x17,0x17,
-0x17,0xff,0x06,0x06,0x06,0xff,0x0e,0x0e,0x0e,0xff,0x08,0x08,0x08,0xff,0x0d,0x0d,
-0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x11,0x11,0x11,0xff,0x1e,0x1e,0x1e,0xff,0x0f,0x0f,
-0x0f,0xff,0x1c,0x1c,0x1c,0xff,0x0d,0x0d,0x0d,0xff,0x0c,0x0c,0x0c,0xff,0x1a,0x1a,
-0x19,0xff,0x2a,0x28,0x25,0xff,0x33,0x2e,0x25,0xff,0x27,0x22,0x1a,0xff,0x11,0x10,
-0x0e,0xff,0x12,0x12,0x12,0xff,0x14,0x14,0x14,0xff,0x08,0x08,0x08,0xff,0x08,0x08,
-0x08,0xff,0x00,0x00,0x00,0xff,0x10,0x10,0x10,0xff,0x1c,0x1c,0x1c,0xff,0x0f,0x0f,
-0x0f,0xff,0x02,0x02,0x02,0xff,0x0e,0x0e,0x0e,0xff,0x12,0x12,0x12,0xff,0x08,0x08,
-0x08,0xff,0x03,0x03,0x03,0xff,0x08,0x08,0x08,0xff,0x1a,0x1a,0x1a,0xff,0x09,0x09,
-0x09,0xff,0x12,0x12,0x12,0xff,0x23,0x23,0x23,0xff,0x17,0x17,0x17,0xff,0x0f,0x0e,
-0x0c,0xff,0x39,0x34,0x2d,0xff,0x3e,0x3b,0x37,0xff,0x27,0x26,0x26,0xff,0x24,0x24,
-0x24,0xff,0x11,0x11,0x11,0xff,0x07,0x07,0x07,0xff,0x13,0x13,0x13,0xff,0x05,0x05,
-0x05,0xff,0x0b,0x0b,0x0b,0xff,0x0e,0x0e,0x0e,0xff,0x02,0x02,0x02,0xff,0x09,0x09,
-0x09,0xff,0x28,0x28,0x28,0xff,0x19,0x19,0x19,0xff,0x09,0x09,0x09,0xff,0x13,0x13,
-0x13,0xff,0x08,0x08,0x08,0xff,0x0c,0x0c,0x0c,0xff,0x0b,0x0b,0x0b,0xff,0x02,0x02,
-0x02,0xff,0x10,0x10,0x10,0xff,0x02,0x02,0x02,0xff,0x08,0x08,0x08,0xff,0x0f,0x0f,
-0x0f,0xff,0x04,0x04,0x04,0xff,0x13,0x13,0x13,0xff,0x0e,0x0e,0x0e,0xff,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0x68,0x5e,0x4f,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0x86,0x7b,0x68,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,
-0x53,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,
-0xc1,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0xe1,0xd5,0xc1,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x13,0x13,0x13,0xff,0x05,0x05,0x05,0xff,0x05,0x05,
-0x05,0xff,0x06,0x06,0x06,0xff,0x06,0x06,0x06,0xff,0x0e,0x0e,0x0e,0xff,0x08,0x08,
-0x08,0xff,0x07,0x07,0x07,0xff,0x1e,0x1e,0x1e,0xff,0x28,0x28,0x28,0xff,0x17,0x17,
-0x17,0xff,0x0c,0x0c,0x0c,0xff,0x07,0x07,0x07,0xff,0x0a,0x0a,0x0a,0xff,0x0e,0x0e,
-0x0e,0xff,0x2e,0x2c,0x29,0xff,0x32,0x2c,0x25,0xff,0x3e,0x39,0x30,0xff,0x40,0x3d,
-0x39,0xff,0x1d,0x1c,0x1c,0xff,0x08,0x08,0x08,0xff,0x07,0x07,0x07,0xff,0x07,0x07,
-0x07,0xff,0x0a,0x0a,0x0a,0xff,0x24,0x24,0x24,0xff,0x18,0x18,0x18,0xff,0x21,0x21,
-0x21,0xff,0x13,0x13,0x13,0xff,0x26,0x26,0x26,0xff,0x2e,0x2e,0x2e,0xff,0x1f,0x1f,
-0x1f,0xff,0x04,0x04,0x04,0xff,0x03,0x03,0x03,0xff,0x17,0x17,0x17,0xff,0x16,0x16,
-0x16,0xff,0x19,0x19,0x19,0xff,0x12,0x12,0x12,0xff,0x17,0x17,0x17,0xff,0x09,0x09,
-0x07,0xff,0x37,0x32,0x2b,0xff,0x36,0x34,0x30,0xff,0x12,0x12,0x11,0xff,0x15,0x15,
-0x15,0xff,0x1a,0x1a,0x1a,0xff,0x0f,0x0f,0x0f,0xff,0x17,0x17,0x17,0xff,0x09,0x09,
-0x09,0xff,0x13,0x13,0x13,0xff,0x04,0x04,0x04,0xff,0x04,0x04,0x04,0xff,0x0c,0x0c,
-0x0c,0xff,0x2b,0x2b,0x2b,0xff,0x12,0x12,0x12,0xff,0x01,0x01,0x01,0xff,0x07,0x07,
-0x07,0xff,0x03,0x03,0x03,0xff,0x09,0x09,0x09,0xff,0x10,0x10,0x10,0xff,0x0a,0x0a,
-0x0a,0xff,0x1f,0x1f,0x1f,0xff,0x0b,0x0b,0x0b,0xff,0x1b,0x1b,0x1b,0xff,0x2c,0x2c,
-0x2c,0xff,0x14,0x14,0x14,0xff,0x13,0x13,0x13,0xff,0x05,0x05,0x05,0xff,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,
-0x4f,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,
-0x8d,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0x86,0x7b,0x68,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,
-0x53,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,
-0xc1,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x0c,0x0c,0x0c,0xff,0x0e,0x0e,0x0e,0xff,0x10,0x10,
-0x10,0xff,0x1b,0x1b,0x1b,0xff,0x0b,0x0b,0x0b,0xff,0x06,0x06,0x06,0xff,0x08,0x08,
-0x08,0xff,0x06,0x06,0x06,0xff,0x1c,0x1c,0x1c,0xff,0x11,0x11,0x11,0xff,0x09,0x09,
-0x09,0xff,0x08,0x08,0x08,0xff,0x02,0x02,0x02,0xff,0x04,0x04,0x04,0xff,0x02,0x01,
-0x01,0xff,0x10,0x0e,0x0c,0xff,0x16,0x11,0x0b,0xff,0x20,0x1b,0x12,0xff,0x26,0x23,
-0x1e,0xff,0x09,0x09,0x08,0xff,0x09,0x09,0x09,0xff,0x11,0x11,0x11,0xff,0x07,0x07,
-0x07,0xff,0x07,0x07,0x07,0xff,0x10,0x10,0x10,0xff,0x07,0x07,0x07,0xff,0x09,0x09,
-0x09,0xff,0x05,0x05,0x05,0xff,0x07,0x07,0x07,0xff,0x10,0x10,0x10,0xff,0x1e,0x1e,
-0x1e,0xff,0x0c,0x0c,0x0c,0xff,0x06,0x06,0x06,0xff,0x1f,0x1f,0x1f,0xff,0x25,0x25,
-0x25,0xff,0x0f,0x0f,0x0f,0xff,0x05,0x05,0x05,0xff,0x19,0x19,0x19,0xff,0x14,0x13,
-0x12,0xff,0x42,0x3e,0x38,0xff,0x1d,0x1c,0x1a,0xff,0x00,0x00,0x00,0xff,0x0a,0x0a,
-0x0a,0xff,0x1a,0x1a,0x1a,0xff,0x0f,0x0f,0x0f,0xff,0x12,0x12,0x12,0xff,0x11,0x11,
-0x11,0xff,0x1f,0x1f,0x1f,0xff,0x0b,0x0b,0x0b,0xff,0x14,0x14,0x14,0xff,0x17,0x17,
-0x17,0xff,0x1c,0x1c,0x1c,0xff,0x16,0x16,0x16,0xff,0x04,0x04,0x04,0xff,0x08,0x08,
-0x08,0xff,0x07,0x07,0x07,0xff,0x0f,0x0f,0x0f,0xff,0x0e,0x0e,0x0e,0xff,0x05,0x05,
-0x05,0xff,0x0e,0x0e,0x0e,0xff,0x04,0x04,0x04,0xff,0x15,0x15,0x15,0xff,0x26,0x26,
-0x26,0xff,0x1c,0x1c,0x1c,0xff,0x0c,0x0c,0x0c,0xff,0x0e,0x0e,0x0e,0xff,0xff,0xff,
-0xff,0x00,0x55,0x4e,0x43,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x54,0x4e,
-0x42,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,
-0x8d,0xff,0x68,0x5e,0x4f,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,
-0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,
-0x53,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0xe1,0xd5,0xc1,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x0e,0x0e,0x0e,0xff,0x03,0x03,0x03,0xff,0x06,0x06,
-0x06,0xff,0x16,0x16,0x16,0xff,0x14,0x14,0x14,0xff,0x12,0x12,0x12,0xff,0x1d,0x1d,
-0x1d,0xff,0x09,0x09,0x09,0xff,0x0d,0x0d,0x0d,0xff,0x11,0x11,0x11,0xff,0x14,0x14,
-0x14,0xff,0x17,0x17,0x17,0xff,0x0b,0x0b,0x0b,0xff,0x01,0x01,0x01,0xff,0x0d,0x0d,
-0x0d,0xff,0x14,0x12,0x0f,0xff,0x31,0x2b,0x23,0xff,0x2c,0x27,0x1d,0xff,0x1b,0x18,
-0x13,0xff,0x07,0x07,0x06,0xff,0x13,0x13,0x13,0xff,0x13,0x13,0x13,0xff,0x0a,0x0a,
-0x0a,0xff,0x16,0x16,0x16,0xff,0x0a,0x0a,0x0a,0xff,0x0c,0x0c,0x0c,0xff,0x0b,0x0b,
-0x0b,0xff,0x11,0x11,0x11,0xff,0x07,0x07,0x07,0xff,0x10,0x10,0x10,0xff,0x23,0x23,
-0x23,0xff,0x1e,0x1e,0x1e,0xff,0x0a,0x0a,0x0a,0xff,0x0d,0x0d,0x0d,0xff,0x1a,0x1a,
-0x1a,0xff,0x0d,0x0d,0x0d,0xff,0x03,0x03,0x03,0xff,0x08,0x08,0x08,0xff,0x07,0x06,
-0x05,0xff,0x34,0x2f,0x29,0xff,0x24,0x21,0x1d,0xff,0x09,0x08,0x08,0xff,0x0a,0x0a,
-0x0a,0xff,0x0a,0x0a,0x0a,0xff,0x06,0x06,0x06,0xff,0x13,0x13,0x13,0xff,0x07,0x07,
-0x07,0xff,0x06,0x06,0x06,0xff,0x00,0x00,0x00,0xff,0x08,0x08,0x08,0xff,0x10,0x10,
-0x10,0xff,0x0d,0x0d,0x0d,0xff,0x1f,0x1f,0x1f,0xff,0x09,0x09,0x09,0xff,0x15,0x15,
-0x15,0xff,0x13,0x13,0x13,0xff,0x1c,0x1c,0x1c,0xff,0x13,0x13,0x13,0xff,0x08,0x08,
-0x08,0xff,0x03,0x03,0x03,0xff,0x04,0x04,0x04,0xff,0x18,0x18,0x18,0xff,0x14,0x14,
-0x14,0xff,0x0c,0x0c,0x0c,0xff,0x0e,0x0e,0x0e,0xff,0x03,0x03,0x03,0xff,0xff,0xff,
-0xff,0x00,0x6b,0x64,0x56,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x6b,0x63,
-0x57,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0xb9,0xa9,
-0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,
-0x53,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,
-0x35,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0xe1,0xd5,0xc1,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0xb9,0xa9,0x8d,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x04,0x04,0x04,0xff,0x06,0x06,0x06,0xff,0x12,0x12,
-0x12,0xff,0x1b,0x1b,0x1b,0xff,0x10,0x10,0x10,0xff,0x23,0x23,0x23,0xff,0x22,0x22,
-0x22,0xff,0x0a,0x0a,0x0a,0xff,0x06,0x06,0x06,0xff,0x08,0x08,0x08,0xff,0x15,0x15,
-0x15,0xff,0x10,0x10,0x10,0xff,0x16,0x16,0x16,0xff,0x11,0x11,0x11,0xff,0x2f,0x2f,
-0x2f,0xff,0x1b,0x19,0x16,0xff,0x2c,0x26,0x1d,0xff,0x1c,0x16,0x0d,0xff,0x12,0x0f,
-0x0b,0xff,0x03,0x03,0x02,0xff,0x0e,0x0e,0x0e,0xff,0x24,0x24,0x24,0xff,0x0f,0x0f,
-0x0f,0xff,0x06,0x06,0x06,0xff,0x01,0x01,0x01,0xff,0x0a,0x0a,0x0a,0xff,0x13,0x13,
-0x13,0xff,0x09,0x09,0x09,0xff,0x00,0x00,0x00,0xff,0x05,0x05,0x05,0xff,0x0b,0x0b,
-0x0b,0xff,0x10,0x10,0x10,0xff,0x13,0x13,0x13,0xff,0x15,0x15,0x15,0xff,0x1b,0x1b,
-0x1b,0xff,0x0b,0x0b,0x0b,0xff,0x02,0x02,0x02,0xff,0x08,0x08,0x08,0xff,0x10,0x0f,
-0x0e,0xff,0x4f,0x4a,0x43,0xff,0x46,0x42,0x3e,0xff,0x0e,0x0e,0x0d,0xff,0x0e,0x0e,
-0x0e,0xff,0x0a,0x0a,0x0a,0xff,0x03,0x03,0x03,0xff,0x06,0x06,0x06,0xff,0x01,0x01,
-0x01,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x03,0x03,
-0x03,0xff,0x07,0x07,0x07,0xff,0x13,0x13,0x13,0xff,0x0a,0x0a,0x0a,0xff,0x1d,0x1d,
-0x1d,0xff,0x0f,0x0f,0x0f,0xff,0x0c,0x0c,0x0c,0xff,0x03,0x03,0x03,0xff,0x01,0x01,
-0x01,0xff,0x01,0x01,0x01,0xff,0x06,0x06,0x06,0xff,0x17,0x17,0x17,0xff,0x14,0x14,
-0x14,0xff,0x07,0x07,0x07,0xff,0x04,0x04,0x04,0xff,0x06,0x06,0x06,0xff,0xff,0xff,
-0xff,0x00,0x86,0x7d,0x6e,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x85,0x7c,
-0x6e,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x68,0x5e,
-0x4f,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,
-0x53,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6b,0x62,0x53,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0x86,0x7b,0x68,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x03,0x03,0x03,0xff,0x11,0x11,
-0x11,0xff,0x15,0x15,0x15,0xff,0x07,0x07,0x07,0xff,0x1d,0x1d,0x1d,0xff,0x1b,0x1b,
-0x1b,0xff,0x0e,0x0e,0x0e,0xff,0x0d,0x0d,0x0d,0xff,0x07,0x07,0x07,0xff,0x0e,0x0e,
-0x0e,0xff,0x09,0x09,0x09,0xff,0x07,0x07,0x07,0xff,0x03,0x03,0x03,0xff,0x0c,0x0c,
-0x0c,0xff,0x15,0x13,0x0f,0xff,0x4c,0x47,0x3d,0xff,0x2b,0x26,0x1e,0xff,0x13,0x12,
-0x0f,0xff,0x00,0x00,0x00,0xff,0x01,0x01,0x01,0xff,0x17,0x17,0x17,0xff,0x15,0x15,
-0x15,0xff,0x08,0x08,0x08,0xff,0x0b,0x0b,0x0b,0xff,0x16,0x16,0x16,0xff,0x0b,0x0b,
-0x0b,0xff,0x01,0x01,0x01,0xff,0x00,0x00,0x00,0xff,0x03,0x03,0x03,0xff,0x0c,0x0c,
-0x0c,0xff,0x16,0x16,0x16,0xff,0x10,0x10,0x10,0xff,0x0c,0x0c,0x0c,0xff,0x16,0x16,
-0x16,0xff,0x16,0x16,0x16,0xff,0x05,0x05,0x05,0xff,0x04,0x04,0x04,0xff,0x09,0x08,
-0x07,0xff,0x3a,0x35,0x2e,0xff,0x2c,0x29,0x24,0xff,0x14,0x14,0x13,0xff,0x1f,0x1f,
-0x1f,0xff,0x0c,0x0c,0x0c,0xff,0x00,0x00,0x00,0xff,0x01,0x01,0x01,0xff,0x05,0x05,
-0x05,0xff,0x03,0x03,0x03,0xff,0x01,0x01,0x01,0xff,0x00,0x00,0x00,0xff,0x06,0x06,
-0x06,0xff,0x10,0x10,0x10,0xff,0x07,0x07,0x07,0xff,0x00,0x00,0x00,0xff,0x0b,0x0b,
-0x0b,0xff,0x17,0x17,0x17,0xff,0x1e,0x1e,0x1e,0xff,0x08,0x08,0x08,0xff,0x01,0x01,
-0x01,0xff,0x0a,0x0a,0x0a,0xff,0x0d,0x0d,0x0d,0xff,0x0b,0x0b,0x0b,0xff,0x17,0x17,
-0x17,0xff,0x05,0x05,0x05,0xff,0x00,0x00,0x00,0xff,0x03,0x03,0x03,0xff,0xff,0xff,
-0xff,0x00,0xa1,0x97,0x88,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0xa1,0x97,
-0x88,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0x86,0x7b,0x68,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x05,0x05,0x05,0xff,0x04,0x04,0x04,0xff,0x07,0x07,
-0x07,0xff,0x09,0x09,0x09,0xff,0x04,0x04,0x04,0xff,0x10,0x10,0x10,0xff,0x15,0x15,
-0x15,0xff,0x16,0x16,0x16,0xff,0x0f,0x0f,0x0f,0xff,0x05,0x05,0x05,0xff,0x06,0x06,
-0x06,0xff,0x0e,0x0e,0x0e,0xff,0x09,0x09,0x09,0xff,0x14,0x14,0x14,0xff,0x09,0x08,
-0x08,0xff,0x15,0x13,0x0e,0xff,0x47,0x41,0x38,0xff,0x35,0x2f,0x26,0xff,0x31,0x2f,
-0x2c,0xff,0x0c,0x0c,0x0c,0xff,0x05,0x05,0x05,0xff,0x14,0x14,0x14,0xff,0x0c,0x0c,
-0x0c,0xff,0x05,0x05,0x05,0xff,0x20,0x20,0x20,0xff,0x29,0x29,0x29,0xff,0x0a,0x0a,
-0x0a,0xff,0x00,0x00,0x00,0xff,0x03,0x03,0x03,0xff,0x11,0x11,0x11,0xff,0x18,0x18,
-0x18,0xff,0x0c,0x0c,0x0c,0xff,0x07,0x07,0x07,0xff,0x10,0x10,0x10,0xff,0x09,0x09,
-0x09,0xff,0x05,0x05,0x05,0xff,0x02,0x02,0x02,0xff,0x0b,0x0b,0x0b,0xff,0x12,0x12,
-0x11,0xff,0x3a,0x36,0x2f,0xff,0x32,0x2e,0x29,0xff,0x1b,0x1a,0x1a,0xff,0x0f,0x0f,
-0x0f,0xff,0x0b,0x0b,0x0b,0xff,0x03,0x03,0x03,0xff,0x0b,0x0b,0x0b,0xff,0x19,0x19,
-0x19,0xff,0x13,0x13,0x13,0xff,0x0e,0x0e,0x0e,0xff,0x07,0x07,0x07,0xff,0x0c,0x0c,
-0x0c,0xff,0x06,0x06,0x06,0xff,0x05,0x05,0x05,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x05,0x05,0x05,0xff,0x0c,0x0c,0x0c,0xff,0x07,0x07,0x07,0xff,0x06,0x06,
-0x06,0xff,0x16,0x16,0x16,0xff,0x1c,0x1c,0x1c,0xff,0x0b,0x0b,0x0b,0xff,0x1c,0x1c,
-0x1c,0xff,0x0e,0x0e,0x0e,0xff,0x05,0x05,0x05,0xff,0x04,0x04,0x04,0xff,0xff,0xff,
-0xff,0x00,0xbb,0xb1,0x9f,0xff,0x68,0x5e,0x4f,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x68,0x5e,0x4f,0xff,0xbb,0xb0,0x9f,0xff,0xbc,0xb1,0xa0,0xff,0x68,0x5e,
-0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0xb9,0xa9,0x8d,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x27,0x27,0x27,0xff,0x10,0x10,0x10,0xff,0x0c,0x0c,
-0x0c,0xff,0x15,0x15,0x15,0xff,0x0c,0x0c,0x0c,0xff,0x09,0x09,0x09,0xff,0x11,0x11,
-0x11,0xff,0x1a,0x1a,0x1a,0xff,0x22,0x22,0x22,0xff,0x18,0x18,0x18,0xff,0x07,0x07,
-0x07,0xff,0x04,0x04,0x04,0xff,0x0d,0x0d,0x0d,0xff,0x32,0x32,0x32,0xff,0x24,0x24,
-0x24,0xff,0x26,0x23,0x20,0xff,0x35,0x2e,0x26,0xff,0x21,0x1c,0x13,0xff,0x1a,0x18,
-0x14,0xff,0x0e,0x0e,0x0e,0xff,0x02,0x02,0x02,0xff,0x0a,0x0a,0x0a,0xff,0x0c,0x0c,
-0x0c,0xff,0x13,0x13,0x13,0xff,0x29,0x29,0x29,0xff,0x16,0x16,0x16,0xff,0x02,0x02,
-0x02,0xff,0x01,0x01,0x01,0xff,0x00,0x00,0x00,0xff,0x03,0x03,0x03,0xff,0x0b,0x0b,
-0x0b,0xff,0x0a,0x0a,0x0a,0xff,0x0a,0x0a,0x0a,0xff,0x05,0x05,0x05,0xff,0x01,0x01,
-0x01,0xff,0x00,0x00,0x00,0xff,0x01,0x01,0x01,0xff,0x0a,0x0a,0x0a,0xff,0x1c,0x1b,
-0x1a,0xff,0x3f,0x3b,0x35,0xff,0x3b,0x37,0x31,0xff,0x12,0x11,0x10,0xff,0x03,0x03,
-0x03,0xff,0x03,0x03,0x03,0xff,0x0b,0x0b,0x0b,0xff,0x18,0x18,0x18,0xff,0x0c,0x0c,
-0x0c,0xff,0x0a,0x0a,0x0a,0xff,0x23,0x23,0x23,0xff,0x18,0x18,0x18,0xff,0x15,0x15,
-0x15,0xff,0x0b,0x0b,0x0b,0xff,0x1a,0x1a,0x1a,0xff,0x08,0x08,0x08,0xff,0x07,0x07,
-0x07,0xff,0x07,0x07,0x07,0xff,0x06,0x06,0x06,0xff,0x08,0x08,0x08,0xff,0x02,0x02,
-0x02,0xff,0x0e,0x0e,0x0e,0xff,0x17,0x17,0x17,0xff,0x06,0x06,0x06,0xff,0x0f,0x0f,
-0x0f,0xff,0x28,0x28,0x28,0xff,0x27,0x27,0x27,0xff,0x10,0x10,0x10,0xff,0xff,0xff,
-0xff,0x00,0x68,0x5e,0x4f,0xff,0xd2,0xc7,0xb3,0xff,0x68,0x5e,0x4f,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0xd1,0xc7,
-0xb3,0xff,0xd1,0xc6,0xb3,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x21,0x21,0x21,0xff,0x06,0x06,0x06,0xff,0x0d,0x0d,
-0x0d,0xff,0x0f,0x0f,0x0f,0xff,0x0b,0x0b,0x0b,0xff,0x08,0x08,0x08,0xff,0x05,0x05,
-0x05,0xff,0x08,0x08,0x08,0xff,0x07,0x07,0x07,0xff,0x0a,0x0a,0x0a,0xff,0x0a,0x0a,
-0x0a,0xff,0x05,0x05,0x05,0xff,0x16,0x16,0x16,0xff,0x23,0x23,0x23,0xff,0x0f,0x0f,
-0x0f,0xff,0x18,0x15,0x12,0xff,0x3c,0x36,0x2e,0xff,0x41,0x3c,0x34,0xff,0x1c,0x1a,
-0x17,0xff,0x15,0x15,0x15,0xff,0x0d,0x0d,0x0d,0xff,0x0c,0x0c,0x0c,0xff,0x09,0x09,
-0x09,0xff,0x11,0x11,0x11,0xff,0x1b,0x1b,0x1b,0xff,0x12,0x12,0x12,0xff,0x04,0x04,
-0x04,0xff,0x02,0x02,0x02,0xff,0x02,0x02,0x02,0xff,0x08,0x08,0x08,0xff,0x15,0x15,
-0x15,0xff,0x10,0x10,0x10,0xff,0x0e,0x0e,0x0e,0xff,0x08,0x08,0x08,0xff,0x02,0x02,
-0x02,0xff,0x00,0x00,0x00,0xff,0x05,0x05,0x05,0xff,0x04,0x04,0x04,0xff,0x1b,0x1a,
-0x1a,0xff,0x39,0x36,0x32,0xff,0x46,0x42,0x3c,0xff,0x21,0x20,0x1f,0xff,0x11,0x11,
-0x11,0xff,0x07,0x07,0x07,0xff,0x12,0x12,0x12,0xff,0x0b,0x0b,0x0b,0xff,0x03,0x03,
-0x03,0xff,0x04,0x04,0x04,0xff,0x14,0x14,0x14,0xff,0x07,0x07,0x07,0xff,0x06,0x06,
-0x06,0xff,0x0c,0x0c,0x0c,0xff,0x1e,0x1e,0x1e,0xff,0x18,0x18,0x18,0xff,0x23,0x23,
-0x23,0xff,0x20,0x20,0x20,0xff,0x16,0x16,0x16,0xff,0x1a,0x1a,0x1a,0xff,0x08,0x08,
-0x08,0xff,0x02,0x02,0x02,0xff,0x06,0x06,0x06,0xff,0x07,0x07,0x07,0xff,0x0a,0x0a,
-0x0a,0xff,0x1d,0x1d,0x1d,0xff,0x21,0x21,0x21,0xff,0x06,0x06,0x06,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0x68,0x5e,
-0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x15,0x15,0x15,0xff,0x00,0x00,0x00,0xff,0x07,0x07,
-0x07,0xff,0x10,0x10,0x10,0xff,0x0c,0x0c,0x0c,0xff,0x01,0x01,0x01,0xff,0x07,0x07,
-0x07,0xff,0x14,0x14,0x14,0xff,0x0b,0x0b,0x0b,0xff,0x21,0x21,0x21,0xff,0x2c,0x2c,
-0x2c,0xff,0x17,0x17,0x17,0xff,0x14,0x14,0x14,0xff,0x0c,0x0c,0x0c,0xff,0x07,0x07,
-0x07,0xff,0x10,0x0e,0x0c,0xff,0x38,0x33,0x2b,0xff,0x37,0x32,0x2b,0xff,0x10,0x10,
-0x0e,0xff,0x0a,0x0a,0x0a,0xff,0x18,0x18,0x18,0xff,0x09,0x09,0x09,0xff,0x01,0x01,
-0x01,0xff,0x05,0x05,0x05,0xff,0x04,0x04,0x04,0xff,0x0b,0x0b,0x0b,0xff,0x02,0x02,
-0x02,0xff,0x0b,0x0b,0x0b,0xff,0x10,0x10,0x10,0xff,0x19,0x19,0x19,0xff,0x14,0x14,
-0x14,0xff,0x08,0x08,0x08,0xff,0x13,0x13,0x13,0xff,0x1d,0x1d,0x1d,0xff,0x14,0x14,
-0x14,0xff,0x08,0x08,0x08,0xff,0x1c,0x1c,0x1c,0xff,0x0a,0x0a,0x0a,0xff,0x1f,0x1f,
-0x1e,0xff,0x32,0x30,0x2d,0xff,0x39,0x35,0x30,0xff,0x0d,0x0c,0x0b,0xff,0x0a,0x0a,
-0x0a,0xff,0x02,0x02,0x02,0xff,0x06,0x06,0x06,0xff,0x04,0x04,0x04,0xff,0x01,0x01,
-0x01,0xff,0x03,0x03,0x03,0xff,0x09,0x09,0x09,0xff,0x04,0x04,0x04,0xff,0x01,0x01,
-0x01,0xff,0x04,0x04,0x04,0xff,0x12,0x12,0x12,0xff,0x0c,0x0c,0x0c,0xff,0x08,0x08,
-0x08,0xff,0x08,0x08,0x08,0xff,0x0d,0x0d,0x0d,0xff,0x0e,0x0e,0x0e,0xff,0x04,0x04,
-0x04,0xff,0x06,0x06,0x06,0xff,0x02,0x02,0x02,0xff,0x01,0x01,0x01,0xff,0x07,0x07,
-0x07,0xff,0x0a,0x0a,0x0a,0xff,0x15,0x15,0x15,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x21,0x21,0x21,0xff,0x01,0x01,0x01,0xff,0x00,0x00,
-0x00,0xff,0x10,0x10,0x10,0xff,0x21,0x21,0x21,0xff,0x09,0x09,0x09,0xff,0x10,0x10,
-0x10,0xff,0x08,0x08,0x08,0xff,0x0d,0x0d,0x0d,0xff,0x11,0x11,0x11,0xff,0x0d,0x0d,
-0x0d,0xff,0x10,0x10,0x10,0xff,0x08,0x08,0x08,0xff,0x05,0x05,0x05,0xff,0x09,0x08,
-0x08,0xff,0x1a,0x17,0x13,0xff,0x34,0x2e,0x26,0xff,0x21,0x1d,0x15,0xff,0x18,0x17,
-0x16,0xff,0x08,0x08,0x08,0xff,0x16,0x16,0x16,0xff,0x04,0x04,0x04,0xff,0x00,0x00,
-0x00,0xff,0x01,0x01,0x01,0xff,0x06,0x06,0x06,0xff,0x1b,0x1b,0x1b,0xff,0x08,0x08,
-0x08,0xff,0x05,0x05,0x05,0xff,0x0a,0x0a,0x0a,0xff,0x0d,0x0d,0x0d,0xff,0x07,0x07,
-0x07,0xff,0x06,0x06,0x06,0xff,0x03,0x03,0x03,0xff,0x12,0x12,0x12,0xff,0x17,0x17,
-0x17,0xff,0x0f,0x0f,0x0f,0xff,0x27,0x27,0x27,0xff,0x09,0x09,0x09,0xff,0x07,0x07,
-0x07,0xff,0x19,0x18,0x17,0xff,0x46,0x41,0x3c,0xff,0x1b,0x1a,0x18,0xff,0x03,0x03,
-0x03,0xff,0x01,0x01,0x01,0xff,0x0c,0x0c,0x0c,0xff,0x12,0x12,0x12,0xff,0x0a,0x0a,
-0x0a,0xff,0x08,0x08,0x08,0xff,0x03,0x03,0x03,0xff,0x06,0x06,0x06,0xff,0x00,0x00,
-0x00,0xff,0x02,0x02,0x02,0xff,0x0b,0x0b,0x0b,0xff,0x07,0x07,0x07,0xff,0x00,0x00,
-0x00,0xff,0x02,0x02,0x02,0xff,0x14,0x14,0x14,0xff,0x16,0x16,0x16,0xff,0x09,0x09,
-0x09,0xff,0x10,0x10,0x10,0xff,0x08,0x08,0x08,0xff,0x06,0x06,0x06,0xff,0x1a,0x1a,
-0x1a,0xff,0x0d,0x0d,0x0d,0xff,0x21,0x21,0x21,0xff,0x01,0x01,0x01,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,
-0x4f,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0x68,0x5e,0x4f,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x06,0x06,0x06,0xff,0x08,0x08,0x08,0xff,0x07,0x07,
-0x07,0xff,0x21,0x21,0x21,0xff,0x2e,0x2e,0x2e,0xff,0x0e,0x0e,0x0e,0xff,0x1b,0x1b,
-0x1b,0xff,0x0c,0x0c,0x0c,0xff,0x1e,0x1e,0x1e,0xff,0x09,0x09,0x09,0xff,0x09,0x09,
-0x09,0xff,0x1d,0x1d,0x1d,0xff,0x07,0x07,0x07,0xff,0x02,0x02,0x02,0xff,0x07,0x07,
-0x06,0xff,0x21,0x1d,0x18,0xff,0x27,0x22,0x1a,0xff,0x19,0x14,0x0e,0xff,0x0a,0x09,
-0x08,0xff,0x07,0x07,0x07,0xff,0x1f,0x1f,0x1f,0xff,0x14,0x14,0x14,0xff,0x03,0x03,
-0x03,0xff,0x00,0x00,0x00,0xff,0x04,0x04,0x04,0xff,0x14,0x14,0x14,0xff,0x07,0x07,
-0x07,0xff,0x07,0x07,0x07,0xff,0x15,0x15,0x15,0xff,0x07,0x07,0x07,0xff,0x0d,0x0d,
-0x0d,0xff,0x16,0x16,0x16,0xff,0x0b,0x0b,0x0b,0xff,0x15,0x15,0x15,0xff,0x0a,0x0a,
-0x0a,0xff,0x02,0x02,0x02,0xff,0x0c,0x0c,0x0c,0xff,0x04,0x04,0x04,0xff,0x0b,0x0b,
-0x0b,0xff,0x14,0x14,0x13,0xff,0x42,0x3e,0x38,0xff,0x47,0x44,0x40,0xff,0x13,0x13,
-0x12,0xff,0x03,0x03,0x03,0xff,0x0b,0x0b,0x0b,0xff,0x0b,0x0b,0x0b,0xff,0x15,0x15,
-0x15,0xff,0x09,0x09,0x09,0xff,0x06,0x06,0x06,0xff,0x19,0x19,0x19,0xff,0x06,0x06,
-0x06,0xff,0x07,0x07,0x07,0xff,0x15,0x15,0x15,0xff,0x12,0x12,0x12,0xff,0x04,0x04,
-0x04,0xff,0x06,0x06,0x06,0xff,0x16,0x16,0x16,0xff,0x0a,0x0a,0x0a,0xff,0x00,0x00,
-0x00,0xff,0x06,0x06,0x06,0xff,0x02,0x02,0x02,0xff,0x06,0x06,0x06,0xff,0x1b,0x1b,
-0x1b,0xff,0x06,0x06,0x06,0xff,0x06,0x06,0x06,0xff,0x08,0x08,0x08,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x0c,0x0c,0x0c,0xff,0x06,0x06,
-0x06,0xff,0x11,0x11,0x11,0xff,0x10,0x10,0x10,0xff,0x01,0x01,0x01,0xff,0x0a,0x0a,
-0x0a,0xff,0x03,0x03,0x03,0xff,0x13,0x13,0x13,0xff,0x05,0x05,0x05,0xff,0x0b,0x0b,
-0x0b,0xff,0x0b,0x0b,0x0b,0xff,0x02,0x02,0x02,0xff,0x01,0x01,0x01,0xff,0x0f,0x0e,
-0x0e,0xff,0x33,0x30,0x2c,0xff,0x21,0x1e,0x1a,0xff,0x2b,0x28,0x23,0xff,0x10,0x10,
-0x0f,0xff,0x02,0x02,0x02,0xff,0x0c,0x0c,0x0c,0xff,0x18,0x18,0x18,0xff,0x06,0x06,
-0x06,0xff,0x00,0x00,0x00,0xff,0x02,0x02,0x02,0xff,0x03,0x03,0x03,0xff,0x01,0x01,
-0x01,0xff,0x04,0x04,0x04,0xff,0x08,0x08,0x08,0xff,0x0c,0x0c,0x0c,0xff,0x20,0x20,
-0x20,0xff,0x10,0x10,0x0f,0xff,0x00,0x00,0x00,0xff,0x05,0x05,0x05,0xff,0x04,0x04,
-0x04,0xff,0x09,0x09,0x09,0xff,0x0e,0x0e,0x0e,0xff,0x04,0x04,0x04,0xff,0x04,0x04,
-0x04,0xff,0x0e,0x0e,0x0d,0xff,0x30,0x2d,0x28,0xff,0x50,0x4d,0x47,0xff,0x1a,0x1a,
-0x19,0xff,0x03,0x03,0x03,0xff,0x09,0x09,0x09,0xff,0x04,0x04,0x04,0xff,0x15,0x15,
-0x15,0xff,0x05,0x05,0x05,0xff,0x04,0x04,0x04,0xff,0x0f,0x0f,0x0f,0xff,0x05,0x05,
-0x05,0xff,0x0c,0x0c,0x0c,0xff,0x0d,0x0d,0x0d,0xff,0x0a,0x0a,0x0a,0xff,0x05,0x05,
-0x05,0xff,0x05,0x05,0x05,0xff,0x07,0x07,0x07,0xff,0x02,0x02,0x02,0xff,0x02,0x02,
-0x02,0xff,0x07,0x07,0x07,0xff,0x02,0x02,0x02,0xff,0x00,0x00,0x00,0xff,0x07,0x07,
-0x07,0xff,0x03,0x03,0x03,0xff,0x00,0x00,0x00,0xff,0x0c,0x0c,0x0c,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0xab,0x9d,
-0x82,0xff,0xab,0x9d,0x82,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xab,0x9c,0x83,0xff,0x68,0x5e,
-0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,
-0x35,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x68,0x5e,0x4f,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0x68,0x5e,
-0x4f,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x04,0x04,0x04,0xff,0x05,0x05,0x05,0xff,0x04,0x04,
-0x04,0xff,0x04,0x04,0x04,0xff,0x01,0x01,0x01,0xff,0x04,0x04,0x04,0xff,0x10,0x10,
-0x10,0xff,0x07,0x07,0x07,0xff,0x06,0x06,0x06,0xff,0x07,0x07,0x07,0xff,0x10,0x10,
-0x10,0xff,0x0d,0x0d,0x0d,0xff,0x09,0x09,0x09,0xff,0x06,0x06,0x06,0xff,0x08,0x07,
-0x07,0xff,0x36,0x32,0x2b,0xff,0x38,0x33,0x2c,0xff,0x40,0x3c,0x36,0xff,0x0c,0x0c,
-0x0b,0xff,0x00,0x00,0x00,0xff,0x02,0x02,0x02,0xff,0x0a,0x0a,0x0a,0xff,0x03,0x03,
-0x03,0xff,0x09,0x09,0x09,0xff,0x0f,0x0f,0x0f,0xff,0x05,0x05,0x05,0xff,0x0c,0x0c,
-0x0c,0xff,0x17,0x16,0x15,0xff,0x17,0x16,0x15,0xff,0x1d,0x1b,0x19,0xff,0x27,0x26,
-0x23,0xff,0x18,0x17,0x14,0xff,0x0d,0x0c,0x0b,0xff,0x0d,0x0c,0x0b,0xff,0x0e,0x0d,
-0x0b,0xff,0x0a,0x09,0x08,0xff,0x11,0x11,0x10,0xff,0x09,0x09,0x08,0xff,0x0f,0x0f,
-0x0e,0xff,0x1c,0x1c,0x1c,0xff,0x15,0x13,0x12,0xff,0x38,0x34,0x2f,0xff,0x11,0x10,
-0x0f,0xff,0x06,0x06,0x06,0xff,0x18,0x18,0x18,0xff,0x06,0x06,0x06,0xff,0x08,0x08,
-0x08,0xff,0x02,0x02,0x02,0xff,0x0a,0x0a,0x0a,0xff,0x0f,0x0f,0x0f,0xff,0x02,0x02,
-0x02,0xff,0x07,0x07,0x07,0xff,0x13,0x13,0x13,0xff,0x1d,0x1d,0x1d,0xff,0x16,0x16,
-0x16,0xff,0x05,0x05,0x05,0xff,0x02,0x02,0x02,0xff,0x09,0x09,0x09,0xff,0x07,0x07,
-0x07,0xff,0x02,0x02,0x02,0xff,0x06,0x06,0x06,0xff,0x01,0x01,0x01,0xff,0x0b,0x0b,
-0x0b,0xff,0x0d,0x0d,0x0d,0xff,0x04,0x04,0x04,0xff,0x05,0x05,0x05,0xff,0xff,0xff,
-0xff,0x00,0x68,0x5e,0x4f,0xff,0x97,0x89,0x73,0xff,0x97,0x89,0x73,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x96,0x89,
-0x73,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0x68,0x5e,0x4f,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x0a,0x0a,0x0a,0xff,0x0c,0x0c,0x0c,0xff,0x0a,0x0a,
-0x0a,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x07,0x07,
-0x07,0xff,0x0f,0x0f,0x0f,0xff,0x16,0x16,0x16,0xff,0x1e,0x1e,0x1e,0xff,0x1c,0x1c,
-0x1c,0xff,0x15,0x15,0x15,0xff,0x09,0x09,0x09,0xff,0x18,0x18,0x18,0xff,0x0c,0x0b,
-0x0a,0xff,0x2b,0x27,0x20,0xff,0x25,0x20,0x18,0xff,0x2b,0x28,0x24,0xff,0x09,0x09,
-0x08,0xff,0x02,0x02,0x02,0xff,0x0c,0x0c,0x0c,0xff,0x17,0x17,0x17,0xff,0x16,0x16,
-0x16,0xff,0x23,0x23,0x23,0xff,0x25,0x25,0x24,0xff,0x22,0x21,0x20,0xff,0x2f,0x2d,
-0x2a,0xff,0x36,0x32,0x2d,0xff,0x2a,0x26,0x20,0xff,0x21,0x1c,0x16,0xff,0x31,0x2d,
-0x26,0xff,0x32,0x2e,0x28,0xff,0x3d,0x3a,0x33,0xff,0x3e,0x3a,0x34,0xff,0x2a,0x25,
-0x1f,0xff,0x36,0x32,0x2c,0xff,0x4b,0x48,0x43,0xff,0x27,0x25,0x20,0xff,0x23,0x21,
-0x1d,0xff,0x38,0x37,0x34,0xff,0x1d,0x1c,0x1a,0xff,0x39,0x35,0x2f,0xff,0x1d,0x1c,
-0x19,0xff,0x05,0x05,0x05,0xff,0x06,0x06,0x06,0xff,0x03,0x03,0x03,0xff,0x0d,0x0d,
-0x0d,0xff,0x03,0x03,0x03,0xff,0x07,0x07,0x07,0xff,0x1b,0x1b,0x1b,0xff,0x09,0x09,
-0x09,0xff,0x0b,0x0b,0x0b,0xff,0x11,0x11,0x11,0xff,0x07,0x07,0x07,0xff,0x04,0x04,
-0x04,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x0b,0x0b,0x0b,0xff,0x14,0x14,
-0x14,0xff,0x0b,0x0b,0x0b,0xff,0x19,0x19,0x19,0xff,0x0c,0x0c,0x0c,0xff,0x0d,0x0d,
-0x0d,0xff,0x07,0x07,0x07,0xff,0x0a,0x0a,0x0a,0xff,0x0c,0x0c,0x0c,0xff,0xff,0xff,
-0xff,0x00,0x7f,0x74,0x61,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x7f,0x74,
-0x61,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x13,0x13,0x13,0xff,0x1b,0x1b,0x1b,0xff,0x1f,0x1f,
-0x1f,0xff,0x09,0x09,0x09,0xff,0x04,0x04,0x04,0xff,0x00,0x00,0x00,0xff,0x03,0x03,
-0x03,0xff,0x09,0x09,0x09,0xff,0x15,0x15,0x15,0xff,0x18,0x18,0x18,0xff,0x0c,0x0c,
-0x0c,0xff,0x14,0x14,0x14,0xff,0x0e,0x0e,0x0e,0xff,0x22,0x22,0x22,0xff,0x0b,0x0b,
-0x09,0xff,0x1f,0x1b,0x14,0xff,0x15,0x11,0x0a,0xff,0x11,0x0f,0x0d,0xff,0x06,0x06,
-0x06,0xff,0x05,0x05,0x05,0xff,0x02,0x02,0x02,0xff,0x0a,0x0a,0x0a,0xff,0x03,0x03,
-0x03,0xff,0x0d,0x0d,0x0d,0xff,0x18,0x17,0x15,0xff,0x38,0x35,0x30,0xff,0x4e,0x49,
-0x41,0xff,0x6e,0x68,0x5e,0xff,0x5f,0x59,0x50,0xff,0x33,0x2d,0x25,0xff,0x29,0x24,
-0x1d,0xff,0x20,0x1b,0x13,0xff,0x2b,0x27,0x1f,0xff,0x36,0x31,0x2a,0xff,0x32,0x2d,
-0x25,0xff,0x4b,0x45,0x3d,0xff,0x4d,0x47,0x3f,0xff,0x35,0x30,0x27,0xff,0x42,0x3c,
-0x34,0xff,0x55,0x51,0x49,0xff,0x40,0x3e,0x3a,0xff,0x3a,0x36,0x30,0xff,0x12,0x10,
-0x0d,0xff,0x03,0x02,0x02,0xff,0x06,0x06,0x06,0xff,0x00,0x00,0x00,0xff,0x0a,0x0a,
-0x0a,0xff,0x02,0x02,0x02,0xff,0x0b,0x0b,0x0b,0xff,0x1c,0x1c,0x1c,0xff,0x0d,0x0d,
-0x0d,0xff,0x13,0x13,0x13,0xff,0x20,0x20,0x20,0xff,0x07,0x07,0x07,0xff,0x02,0x02,
-0x02,0xff,0x00,0x00,0x00,0xff,0x04,0x04,0x04,0xff,0x0c,0x0c,0x0c,0xff,0x12,0x12,
-0x12,0xff,0x02,0x02,0x02,0xff,0x10,0x10,0x10,0xff,0x0a,0x0a,0x0a,0xff,0x07,0x07,
-0x07,0xff,0x04,0x04,0x04,0xff,0x13,0x13,0x13,0xff,0x1b,0x1b,0x1b,0xff,0xff,0xff,
-0xff,0x00,0x68,0x5e,0x4f,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x68,0x5f,
-0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0x68,0x5e,0x4f,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x55,0x55,0x55,0xff,0x31,0x2d,0x29,0xf9,0x68,0x68,
-0x67,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x0d,0x0d,0x0d,0xff,0x11,0x11,0x11,0xff,0x0c,0x0c,
-0x0c,0xff,0x08,0x08,0x08,0xff,0x0e,0x0e,0x0e,0xff,0x06,0x06,0x06,0xff,0x0c,0x0c,
-0x0c,0xff,0x10,0x10,0x10,0xff,0x08,0x08,0x08,0xff,0x0b,0x0b,0x0b,0xff,0x02,0x02,
-0x02,0xff,0x0b,0x0b,0x0b,0xff,0x18,0x18,0x18,0xff,0x2a,0x29,0x29,0xff,0x17,0x15,
-0x13,0xff,0x2c,0x27,0x1f,0xff,0x2e,0x29,0x21,0xff,0x1e,0x1c,0x1a,0xff,0x0b,0x0a,
-0x0a,0xff,0x0e,0x0e,0x0e,0xff,0x0a,0x0a,0x0a,0xff,0x14,0x14,0x14,0xff,0x0a,0x0a,
-0x0a,0xff,0x1a,0x1a,0x18,0xff,0x1c,0x19,0x14,0xff,0x48,0x42,0x3b,0xff,0x5a,0x54,
-0x4c,0xff,0x51,0x4c,0x45,0xff,0x3e,0x3a,0x34,0xff,0x1e,0x1c,0x18,0xff,0x0e,0x0d,
-0x0b,0xff,0x17,0x15,0x11,0xff,0x1c,0x19,0x15,0xff,0x25,0x23,0x1f,0xff,0x1a,0x18,
-0x13,0xff,0x1f,0x1c,0x17,0xff,0x28,0x25,0x1f,0xff,0x34,0x30,0x2a,0xff,0x3b,0x36,
-0x2e,0xff,0x41,0x3c,0x35,0xff,0x36,0x33,0x2f,0xff,0x2a,0x27,0x24,0xff,0x09,0x07,
-0x06,0xff,0x10,0x0f,0x0d,0xff,0x1d,0x1c,0x1b,0xff,0x0c,0x0c,0x0c,0xff,0x1c,0x1c,
-0x1c,0xff,0x10,0x10,0x10,0xff,0x1b,0x1b,0x1b,0xff,0x13,0x13,0x13,0xff,0x17,0x17,
-0x17,0xff,0x15,0x15,0x15,0xff,0x14,0x14,0x14,0xff,0x05,0x05,0x05,0xff,0x07,0x07,
-0x07,0xff,0x03,0x03,0x03,0xff,0x07,0x07,0x07,0xff,0x0c,0x0c,0x0c,0xff,0x15,0x15,
-0x15,0xff,0x0c,0x0c,0x0c,0xff,0x1b,0x1b,0x1b,0xff,0x0c,0x0c,0x0c,0xff,0x09,0x09,
-0x09,0xff,0x05,0x05,0x05,0xff,0x0d,0x0d,0x0d,0xff,0x11,0x11,0x11,0xff,0xff,0xff,
-0xff,0x00,0x53,0x4b,0x3f,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x53,0x4b,
-0x40,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0x00,0x00,
-0x00,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x2c,0x2c,0x2c,0xff,0x54,0x52,0x4f,0xff,0x21,0x1f,0x19,0xff,0x2c,0x29,
-0x25,0xff,0x4b,0x4b,0x4a,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x2e,0x2e,0x2e,0xff,0x05,0x05,0x05,0xff,0x0d,0x0d,
-0x0d,0xff,0x19,0x19,0x19,0xff,0x0d,0x0d,0x0d,0xff,0x03,0x03,0x03,0xff,0x09,0x09,
-0x09,0xff,0x1d,0x1d,0x1d,0xff,0x07,0x07,0x07,0xff,0x05,0x05,0x05,0xff,0x0c,0x0c,
-0x0c,0xff,0x0d,0x0d,0x0d,0xff,0x0f,0x0f,0x0f,0xff,0x15,0x15,0x15,0xff,0x1f,0x1d,
-0x1b,0xff,0x40,0x3a,0x32,0xff,0x28,0x23,0x1b,0xff,0x09,0x08,0x07,0xff,0x05,0x05,
-0x05,0xff,0x04,0x04,0x04,0xff,0x03,0x03,0x03,0xff,0x05,0x05,0x05,0xff,0x0c,0x0b,
-0x0a,0xff,0x24,0x22,0x1e,0xff,0x31,0x2d,0x25,0xff,0x52,0x4c,0x44,0xff,0x34,0x30,
-0x2b,0xff,0x12,0x10,0x0e,0xff,0x12,0x11,0x10,0xff,0x13,0x12,0x11,0xff,0x03,0x03,
-0x03,0xff,0x05,0x04,0x04,0xff,0x06,0x05,0x05,0xff,0x15,0x15,0x14,0xff,0x06,0x06,
-0x05,0xff,0x03,0x03,0x02,0xff,0x05,0x04,0x03,0xff,0x0d,0x0d,0x0b,0xff,0x0c,0x0a,
-0x08,0xff,0x0b,0x0a,0x08,0xff,0x11,0x10,0x0e,0xff,0x1b,0x18,0x14,0xff,0x14,0x11,
-0x0e,0xff,0x17,0x13,0x0d,0xff,0x23,0x21,0x1d,0xff,0x0c,0x0c,0x0b,0xff,0x0c,0x0c,
-0x0c,0xff,0x09,0x09,0x09,0xff,0x1b,0x1b,0x1b,0xff,0x0e,0x0e,0x0e,0xff,0x0a,0x0a,
-0x0a,0xff,0x0a,0x0a,0x0a,0xff,0x05,0x05,0x05,0xff,0x09,0x09,0x09,0xff,0x03,0x03,
-0x03,0xff,0x01,0x01,0x01,0xff,0x0b,0x0b,0x0b,0xff,0x0e,0x0e,0x0e,0xff,0x08,0x08,
-0x08,0xff,0x01,0x01,0x01,0xff,0x08,0x08,0x08,0xff,0x0f,0x0f,0x0f,0xff,0x15,0x15,
-0x15,0xff,0x17,0x17,0x17,0xff,0x2e,0x2e,0x2e,0xff,0x05,0x05,0x05,0xff,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,
-0x35,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x60,0x5f,0x5f,0xff,0x26,0x22,0x1c,0xff,0x26,0x23,0x1d,0xff,0x26,0x22,
-0x1c,0xff,0x68,0x66,0x64,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x09,0x09,0x09,0xff,0x00,0x00,0x00,0xff,0x04,0x04,
-0x04,0xff,0x0e,0x0e,0x0e,0xff,0x05,0x05,0x05,0xff,0x07,0x07,0x07,0xff,0x09,0x09,
-0x09,0xff,0x13,0x13,0x13,0xff,0x08,0x08,0x08,0xff,0x0d,0x0d,0x0d,0xff,0x27,0x27,
-0x27,0xff,0x1d,0x1d,0x1d,0xff,0x19,0x19,0x19,0xff,0x0d,0x0d,0x0d,0xff,0x0f,0x0e,
-0x0d,0xff,0x47,0x42,0x3a,0xff,0x32,0x2e,0x27,0xff,0x11,0x10,0x0f,0xff,0x1d,0x1d,
-0x1d,0xff,0x0b,0x0b,0x0a,0xff,0x15,0x14,0x13,0xff,0x11,0x10,0x0e,0xff,0x27,0x25,
-0x22,0xff,0x37,0x33,0x2d,0xff,0x2c,0x28,0x22,0xff,0x20,0x1d,0x1a,0xff,0x07,0x07,
-0x06,0xff,0x02,0x02,0x02,0xff,0x05,0x05,0x05,0xff,0x07,0x07,0x07,0xff,0x01,0x01,
-0x01,0xff,0x06,0x06,0x06,0xff,0x05,0x05,0x05,0xff,0x19,0x18,0x18,0xff,0x08,0x08,
-0x08,0xff,0x00,0x00,0x00,0xff,0x03,0x03,0x03,0xff,0x0e,0x0e,0x0e,0xff,0x05,0x04,
-0x04,0xff,0x03,0x03,0x03,0xff,0x0e,0x0e,0x0e,0xff,0x17,0x16,0x13,0xff,0x32,0x2d,
-0x27,0xff,0x41,0x39,0x2f,0xff,0x44,0x3f,0x38,0xff,0x2c,0x29,0x26,0xff,0x11,0x10,
-0x0f,0xff,0x01,0x00,0x00,0xff,0x0c,0x0c,0x0c,0xff,0x21,0x21,0x21,0xff,0x11,0x11,
-0x11,0xff,0x0d,0x0d,0x0d,0xff,0x07,0x07,0x07,0xff,0x1c,0x1c,0x1c,0xff,0x07,0x07,
-0x07,0xff,0x02,0x02,0x02,0xff,0x11,0x11,0x11,0xff,0x0f,0x0f,0x0f,0xff,0x04,0x04,
-0x04,0xff,0x05,0x05,0x05,0xff,0x06,0x06,0x06,0xff,0x15,0x15,0x15,0xff,0x09,0x09,
-0x09,0xff,0x08,0x08,0x08,0xff,0x09,0x09,0x09,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,
-0x35,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x68,0x66,0x64,0xff,0x2a,0x26,0x20,0xff,0x2a,0x26,0x21,0xff,0x2a,0x26,
-0x20,0xff,0x44,0x41,0x3c,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x05,0x05,0x05,0xff,0x03,0x03,0x03,0xff,0x00,0x00,
-0x00,0xff,0x02,0x02,0x02,0xff,0x02,0x02,0x02,0xff,0x08,0x08,0x08,0xff,0x0a,0x0a,
-0x0a,0xff,0x0b,0x0b,0x0b,0xff,0x1b,0x1b,0x1b,0xff,0x16,0x16,0x16,0xff,0x1f,0x1f,
-0x1f,0xff,0x14,0x14,0x14,0xff,0x12,0x12,0x12,0xff,0x0b,0x0b,0x0a,0xff,0x18,0x16,
-0x14,0xff,0x45,0x40,0x39,0xff,0x36,0x31,0x2c,0xff,0x24,0x22,0x20,0xff,0x40,0x3e,
-0x3c,0xff,0x30,0x2d,0x28,0xff,0x3a,0x35,0x2f,0xff,0x2d,0x28,0x21,0xff,0x1c,0x18,
-0x14,0xff,0x18,0x16,0x14,0xff,0x0a,0x09,0x08,0xff,0x03,0x03,0x02,0xff,0x02,0x02,
-0x02,0xff,0x0a,0x0a,0x0a,0xff,0x0c,0x0c,0x0c,0xff,0x03,0x03,0x03,0xff,0x06,0x06,
-0x06,0xff,0x19,0x19,0x19,0xff,0x11,0x11,0x11,0xff,0x06,0x06,0x06,0xff,0x03,0x03,
-0x03,0xff,0x01,0x01,0x01,0xff,0x0a,0x0a,0x0a,0xff,0x0c,0x0c,0x0c,0xff,0x01,0x01,
-0x01,0xff,0x01,0x01,0x01,0xff,0x10,0x10,0x10,0xff,0x0e,0x0e,0x0e,0xff,0x1d,0x1b,
-0x19,0xff,0x47,0x41,0x39,0xff,0x40,0x39,0x30,0xff,0x28,0x22,0x1a,0xff,0x28,0x23,
-0x1e,0xff,0x0f,0x0c,0x0b,0xff,0x04,0x03,0x03,0xff,0x25,0x24,0x23,0xff,0x13,0x12,
-0x11,0xff,0x1c,0x1b,0x1a,0xff,0x17,0x16,0x16,0xff,0x18,0x18,0x17,0xff,0x09,0x09,
-0x08,0xff,0x12,0x11,0x11,0xff,0x1a,0x1a,0x1a,0xff,0x0e,0x0e,0x0e,0xff,0x05,0x05,
-0x05,0xff,0x05,0x05,0x05,0xff,0x08,0x08,0x08,0xff,0x05,0x05,0x05,0xff,0x05,0x05,
-0x05,0xff,0x15,0x15,0x15,0xff,0x05,0x05,0x05,0xff,0x03,0x03,0x03,0xff,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x2d,0x2d,
-0x2d,0xff,0x33,0x2f,0x28,0xff,0x2f,0x2b,0x23,0xff,0x2f,0x2a,0x24,0xff,0x2f,0x2b,
-0x23,0xff,0x2f,0x2b,0x24,0xff,0x4c,0x4c,0x4c,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x07,0x06,0x06,0xff,0x17,0x17,0x16,0xff,0x06,0x06,
-0x05,0xff,0x02,0x02,0x02,0xff,0x14,0x14,0x13,0xff,0x11,0x11,0x11,0xff,0x0f,0x0e,
-0x0d,0xff,0x0e,0x0e,0x0d,0xff,0x15,0x14,0x13,0xff,0x0e,0x0d,0x0c,0xff,0x0f,0x0e,
-0x0d,0xff,0x15,0x14,0x12,0xff,0x2a,0x28,0x26,0xff,0x30,0x2e,0x29,0xff,0x3b,0x36,
-0x2e,0xff,0x3d,0x36,0x2c,0xff,0x3c,0x36,0x2d,0xff,0x37,0x31,0x2a,0xff,0x42,0x3e,
-0x37,0xff,0x4c,0x48,0x43,0xff,0x33,0x30,0x2c,0xff,0x1f,0x1d,0x1a,0xff,0x09,0x08,
-0x07,0xff,0x09,0x09,0x09,0xff,0x05,0x05,0x05,0xff,0x09,0x09,0x09,0xff,0x06,0x06,
-0x06,0xff,0x04,0x04,0x04,0xff,0x03,0x03,0x03,0xff,0x05,0x05,0x05,0xff,0x00,0x00,
-0x00,0xff,0x13,0x13,0x13,0xff,0x2d,0x2d,0x2d,0xff,0x0a,0x0a,0x0a,0xff,0x01,0x01,
-0x01,0xff,0x09,0x09,0x09,0xff,0x33,0x33,0x33,0xff,0x24,0x24,0x24,0xff,0x0b,0x0b,
-0x0b,0xff,0x0c,0x0c,0x0c,0xff,0x19,0x19,0x19,0xff,0x0f,0x0f,0x0f,0xff,0x00,0x00,
-0x00,0xff,0x28,0x24,0x21,0xff,0x4a,0x45,0x3e,0xff,0x2c,0x28,0x22,0xff,0x12,0x10,
-0x0d,0xff,0x16,0x13,0x10,0xff,0x19,0x15,0x13,0xff,0x51,0x4c,0x46,0xff,0x3a,0x36,
-0x2f,0xff,0x33,0x2e,0x29,0xff,0x37,0x33,0x2f,0xff,0x1f,0x1d,0x19,0xff,0x21,0x1f,
-0x1d,0xff,0x34,0x33,0x31,0xff,0x1f,0x1e,0x1c,0xff,0x0b,0x0a,0x09,0xff,0x0a,0x09,
-0x08,0xff,0x15,0x15,0x15,0xff,0x25,0x24,0x23,0xff,0x0a,0x09,0x08,0xff,0x04,0x03,
-0x03,0xff,0x0f,0x0e,0x0d,0xff,0x07,0x06,0x06,0xff,0x17,0x17,0x16,0xff,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x52,0x52,
-0x52,0xff,0x33,0x2f,0x27,0xff,0x33,0x2f,0x28,0xff,0x34,0x2f,0x28,0xff,0x33,0x2f,
-0x28,0xff,0x33,0x2f,0x27,0xff,0x6c,0x6c,0x6a,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x2c,0x29,0x23,0xff,0x3b,0x37,0x32,0xff,0x21,0x1e,
-0x19,0xff,0x18,0x17,0x14,0xff,0x2f,0x2c,0x28,0xff,0x16,0x14,0x11,0xff,0x2f,0x2c,
-0x26,0xff,0x3b,0x36,0x2f,0xff,0x32,0x2e,0x26,0xff,0x27,0x22,0x1a,0xff,0x27,0x22,
-0x19,0xff,0x38,0x33,0x2a,0xff,0x5a,0x54,0x4b,0xff,0x4d,0x48,0x3f,0xff,0x51,0x4b,
-0x41,0xff,0x49,0x43,0x3a,0xff,0x26,0x22,0x1c,0xff,0x23,0x20,0x1d,0xff,0x1c,0x1b,
-0x1a,0xff,0x29,0x29,0x28,0xff,0x0e,0x0d,0x0d,0xff,0x0b,0x0a,0x0a,0xff,0x00,0x00,
-0x00,0xff,0x06,0x06,0x06,0xff,0x13,0x13,0x13,0xff,0x20,0x20,0x20,0xff,0x1c,0x1c,
-0x1c,0xff,0x06,0x06,0x06,0xff,0x05,0x05,0x05,0xff,0x14,0x14,0x14,0xff,0x0a,0x0a,
-0x0a,0xff,0x0c,0x0c,0x0c,0xff,0x1a,0x1a,0x1a,0xff,0x08,0x08,0x08,0xff,0x07,0x07,
-0x07,0xff,0x0b,0x0b,0x0b,0xff,0x2e,0x2e,0x2e,0xff,0x1f,0x1f,0x1f,0xff,0x27,0x27,
-0x27,0xff,0x21,0x21,0x21,0xff,0x12,0x12,0x12,0xff,0x1e,0x1e,0x1e,0xff,0x0f,0x0e,
-0x0d,0xff,0x2d,0x2a,0x26,0xff,0x37,0x32,0x2a,0xff,0x32,0x2f,0x2a,0xff,0x0f,0x0f,
-0x0e,0xff,0x10,0x10,0x0f,0xff,0x04,0x03,0x03,0xff,0x1c,0x1b,0x19,0xff,0x28,0x25,
-0x20,0xff,0x38,0x34,0x2e,0xff,0x42,0x3e,0x37,0xff,0x4c,0x47,0x3f,0xff,0x5a,0x55,
-0x4b,0xff,0x39,0x33,0x2a,0xff,0x35,0x30,0x27,0xff,0x3d,0x38,0x30,0xff,0x28,0x24,
-0x1d,0xff,0x0f,0x0d,0x0a,0xff,0x1a,0x17,0x11,0xff,0x12,0x0e,0x08,0xff,0x22,0x1f,
-0x19,0xff,0x36,0x32,0x2d,0xff,0x2c,0x29,0x23,0xff,0x3b,0x37,0x32,0xff,0xff,0xff,
-0xff,0x00,0x53,0x4b,0x3f,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x53,0x4b,
-0x40,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6a,0x69,
-0x68,0xff,0x39,0x33,0x2b,0xff,0x39,0x33,0x2b,0xff,0x38,0x34,0x2b,0xff,0x39,0x33,
-0x2b,0xff,0x39,0x33,0x2b,0xff,0x69,0x67,0x62,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x21,0x1c,0x16,0xff,0x25,0x20,0x19,0xff,0x3d,0x38,
-0x31,0xff,0x3f,0x3a,0x34,0xff,0x39,0x34,0x2c,0xff,0x20,0x1c,0x15,0xff,0x3f,0x3b,
-0x33,0xff,0x2f,0x2b,0x24,0xff,0x30,0x2b,0x25,0xff,0x2d,0x29,0x23,0xff,0x2d,0x29,
-0x25,0xff,0x20,0x1d,0x1b,0xff,0x33,0x30,0x2c,0xff,0x24,0x20,0x1b,0xff,0x38,0x32,
-0x2a,0xff,0x3c,0x37,0x31,0xff,0x0d,0x0c,0x0b,0xff,0x0e,0x0e,0x0e,0xff,0x15,0x15,
-0x15,0xff,0x0c,0x0c,0x0c,0xff,0x0b,0x0b,0x0b,0xff,0x19,0x19,0x19,0xff,0x08,0x08,
-0x08,0xff,0x0a,0x0a,0x0a,0xff,0x12,0x12,0x12,0xff,0x0c,0x0c,0x0c,0xff,0x11,0x11,
-0x11,0xff,0x03,0x03,0x03,0xff,0x06,0x06,0x06,0xff,0x0f,0x0f,0x0f,0xff,0x10,0x10,
-0x10,0xff,0x07,0x07,0x07,0xff,0x08,0x08,0x08,0xff,0x15,0x15,0x15,0xff,0x15,0x15,
-0x15,0xff,0x06,0x06,0x06,0xff,0x09,0x09,0x09,0xff,0x0b,0x0b,0x0b,0xff,0x28,0x28,
-0x28,0xff,0x16,0x16,0x16,0xff,0x0d,0x0d,0x0d,0xff,0x1c,0x1c,0x1c,0xff,0x0d,0x0d,
-0x0c,0xff,0x26,0x23,0x1f,0xff,0x28,0x23,0x1b,0xff,0x35,0x31,0x29,0xff,0x22,0x20,
-0x1e,0xff,0x1b,0x1a,0x1a,0xff,0x14,0x14,0x14,0xff,0x1b,0x1b,0x1b,0xff,0x0d,0x0c,
-0x0b,0xff,0x12,0x11,0x10,0xff,0x27,0x25,0x23,0xff,0x29,0x27,0x23,0xff,0x43,0x40,
-0x3b,0xff,0x2b,0x28,0x22,0xff,0x33,0x2f,0x2a,0xff,0x59,0x55,0x4f,0xff,0x44,0x3f,
-0x39,0xff,0x21,0x1e,0x17,0xff,0x29,0x25,0x1d,0xff,0x24,0x20,0x18,0xff,0x35,0x31,
-0x29,0xff,0x38,0x33,0x2b,0xff,0x21,0x1c,0x16,0xff,0x25,0x20,0x19,0xff,0xff,0xff,
-0xff,0x00,0x68,0x5e,0x4f,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x68,0x5f,
-0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x70,0x6e,
-0x6b,0xff,0x3d,0x38,0x2f,0xff,0x3e,0x38,0x2f,0xff,0x3e,0x38,0x2f,0xff,0x3e,0x38,
-0x2f,0xff,0x3d,0x38,0x2f,0xff,0x56,0x52,0x4c,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x0e,0x0d,0x0b,0xff,0x0d,0x0c,0x0a,0xff,0x20,0x1e,
-0x1c,0xff,0x16,0x14,0x12,0xff,0x18,0x16,0x14,0xff,0x0e,0x0d,0x0a,0xff,0x1d,0x1c,
-0x19,0xff,0x1c,0x1b,0x19,0xff,0x20,0x1f,0x1d,0xff,0x09,0x08,0x08,0xff,0x0e,0x0e,
-0x0d,0xff,0x10,0x0f,0x0f,0xff,0x10,0x10,0x10,0xff,0x0b,0x09,0x07,0xff,0x29,0x24,
-0x1e,0xff,0x31,0x2d,0x29,0xff,0x18,0x18,0x17,0xff,0x0d,0x0d,0x0d,0xff,0x0e,0x0e,
-0x0e,0xff,0x06,0x06,0x06,0xff,0x15,0x15,0x15,0xff,0x0e,0x0e,0x0e,0xff,0x01,0x01,
-0x01,0xff,0x05,0x05,0x05,0xff,0x03,0x03,0x03,0xff,0x04,0x04,0x04,0xff,0x0a,0x0a,
-0x0a,0xff,0x09,0x09,0x09,0xff,0x17,0x17,0x17,0xff,0x0c,0x0c,0x0c,0xff,0x08,0x08,
-0x08,0xff,0x08,0x08,0x08,0xff,0x06,0x06,0x06,0xff,0x06,0x06,0x06,0xff,0x08,0x08,
-0x08,0xff,0x02,0x02,0x02,0xff,0x02,0x02,0x02,0xff,0x09,0x09,0x09,0xff,0x17,0x17,
-0x17,0xff,0x0b,0x0b,0x0b,0xff,0x14,0x14,0x14,0xff,0x10,0x10,0x10,0xff,0x0f,0x0e,
-0x0e,0xff,0x1e,0x1c,0x18,0xff,0x40,0x3b,0x34,0xff,0x4a,0x44,0x3c,0xff,0x22,0x1f,
-0x1b,0xff,0x0f,0x0e,0x0d,0xff,0x19,0x19,0x19,0xff,0x20,0x20,0x20,0xff,0x05,0x05,
-0x05,0xff,0x00,0x00,0x00,0xff,0x08,0x07,0x07,0xff,0x03,0x02,0x02,0xff,0x0d,0x0d,
-0x0c,0xff,0x08,0x08,0x07,0xff,0x0d,0x0d,0x0c,0xff,0x1e,0x1d,0x1b,0xff,0x1e,0x1d,
-0x1b,0xff,0x1f,0x1e,0x1c,0xff,0x2a,0x28,0x25,0xff,0x1c,0x1a,0x17,0xff,0x26,0x24,
-0x22,0xff,0x28,0x26,0x24,0xff,0x0e,0x0d,0x0b,0xff,0x0d,0x0c,0x0a,0xff,0xff,0xff,
-0xff,0x00,0x7f,0x74,0x61,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x7f,0x74,
-0x61,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xa4,0xa4,0xa4,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xa5,0xa5,0xa5,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xa4,0xa4,0xa4,0xff,0x00,0x00,0x00,0xff,0xa4,0xa4,0xa4,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x48,0x42,0x36,0xff,0x48,0x42,0x36,0xff,0x48,0x42,0x36,0xff,0x48,0x42,
-0x36,0xff,0x48,0x42,0x36,0xff,0x48,0x42,0x36,0xff,0x48,0x42,0x36,0xff,0x48,0x42,
-0x36,0xff,0x48,0x42,0x36,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x03,0x63,0x60,
-0x59,0xff,0x42,0x3d,0x33,0xff,0x43,0x3d,0x33,0xff,0x43,0x3d,0x32,0xff,0x43,0x3d,
-0x33,0xff,0x42,0x3d,0x33,0xff,0x4a,0x44,0x3a,0xff,0xff,0xff,0xff,0x06,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x0c,0x0c,0x0c,0xff,0x15,0x15,0x15,0xff,0x09,0x09,
-0x09,0xff,0x04,0x04,0x04,0xff,0x04,0x04,0x04,0xff,0x02,0x02,0x02,0xff,0x03,0x03,
-0x03,0xff,0x0a,0x0a,0x0a,0xff,0x1a,0x1a,0x1a,0xff,0x07,0x07,0x07,0xff,0x06,0x06,
-0x06,0xff,0x08,0x08,0x08,0xff,0x08,0x08,0x07,0xff,0x1f,0x1c,0x18,0xff,0x28,0x23,
-0x1d,0xff,0x12,0x11,0x0f,0xff,0x07,0x07,0x07,0xff,0x0a,0x0a,0x0a,0xff,0x1d,0x1d,
-0x1d,0xff,0x0b,0x0b,0x0b,0xff,0x0c,0x0c,0x0c,0xff,0x01,0x01,0x01,0xff,0x06,0x06,
-0x06,0xff,0x14,0x14,0x14,0xff,0x05,0x05,0x05,0xff,0x09,0x09,0x09,0xff,0x04,0x04,
-0x04,0xff,0x04,0x04,0x04,0xff,0x12,0x12,0x12,0xff,0x04,0x04,0x04,0xff,0x04,0x04,
-0x04,0xff,0x15,0x15,0x15,0xff,0x1a,0x1a,0x1a,0xff,0x11,0x11,0x11,0xff,0x12,0x12,
-0x12,0xff,0x0a,0x0a,0x0a,0xff,0x0b,0x0b,0x0b,0xff,0x02,0x02,0x02,0xff,0x04,0x04,
-0x04,0xff,0x01,0x01,0x01,0xff,0x0a,0x0a,0x0a,0xff,0x19,0x19,0x19,0xff,0x26,0x26,
-0x26,0xff,0x1d,0x1c,0x1a,0xff,0x30,0x2b,0x25,0xff,0x4f,0x48,0x40,0xff,0x2f,0x2b,
-0x26,0xff,0x07,0x06,0x05,0xff,0x0e,0x0e,0x0e,0xff,0x17,0x17,0x17,0xff,0x05,0x05,
-0x05,0xff,0x02,0x02,0x02,0xff,0x00,0x00,0x00,0xff,0x02,0x02,0x02,0xff,0x0f,0x0f,
-0x0f,0xff,0x11,0x11,0x11,0xff,0x1d,0x1d,0x1d,0xff,0x0a,0x0a,0x0a,0xff,0x11,0x11,
-0x11,0xff,0x1f,0x1f,0x1f,0xff,0x27,0x27,0x27,0xff,0x1c,0x1c,0x1c,0xff,0x10,0x10,
-0x10,0xff,0x0c,0x0c,0x0c,0xff,0x0c,0x0c,0x0c,0xff,0x15,0x15,0x15,0xff,0xff,0xff,
-0xff,0x00,0x96,0x8a,0x73,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x97,0x8a,0x73,0xff,0x97,0x89,0x73,0xff,0x68,0x5e,
-0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x5b,0x5b,
-0x5b,0xff,0xa4,0xa4,0xa4,0xff,0xa3,0xa3,0xa3,0xff,0xa5,0xa5,0xa5,0xff,0xa4,0xa4,
-0xa4,0xff,0xa5,0xa5,0xa5,0xff,0xa5,0xa5,0xa5,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xa5,0xa5,0xa5,0xff,0x5c,0x5c,0x5c,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x5c,0x5c,0x5c,0xff,0xa5,0xa5,
-0xa5,0xff,0xa4,0xa4,0xa4,0xff,0x00,0x00,0x00,0xff,0xa4,0xa4,0xa4,0xff,0xa4,0xa4,
-0xa4,0xff,0xa5,0xa5,0xa5,0xff,0x5b,0x5b,0x5b,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,
-0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0x68,0x5e,0x4f,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0x26,0x22,0x1c,0xff,0x26,0x22,0x1c,0xff,0x26,0x22,0x1c,0xff,0x26,0x22,
-0x1c,0xff,0x26,0x22,0x1c,0xff,0x26,0x22,0x1c,0xff,0x26,0x22,0x1c,0xff,0x26,0x22,
-0x1c,0xff,0x26,0x22,0x1c,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xfe,0xfe,0xfe,0x20,0x47,0x42,
-0x37,0xff,0x48,0x41,0x36,0xff,0x48,0x42,0x36,0xff,0x47,0x41,0x37,0xff,0x48,0x42,
-0x36,0xff,0x48,0x41,0x36,0xff,0x47,0x42,0x37,0xff,0x3a,0x39,0x39,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x08,0x08,0x08,0xff,0x11,0x11,0x11,0xff,0x07,0x07,
-0x07,0xff,0x15,0x15,0x15,0xff,0x05,0x05,0x05,0xff,0x01,0x01,0x01,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x0a,0x0a,0x0a,0xff,0x00,0x00,0x00,0xff,0x04,0x04,
-0x04,0xff,0x09,0x09,0x09,0xff,0x10,0x0f,0x0e,0xff,0x49,0x45,0x3e,0xff,0x4f,0x49,
-0x41,0xff,0x22,0x21,0x1f,0xff,0x15,0x15,0x15,0xff,0x0a,0x0a,0x0a,0xff,0x0b,0x0b,
-0x0b,0xff,0x0d,0x0d,0x0d,0xff,0x15,0x15,0x15,0xff,0x09,0x09,0x09,0xff,0x19,0x19,
-0x19,0xff,0x29,0x29,0x29,0xff,0x0f,0x0f,0x0f,0xff,0x0b,0x0b,0x0b,0xff,0x04,0x04,
-0x04,0xff,0x02,0x02,0x02,0xff,0x08,0x08,0x08,0xff,0x01,0x01,0x01,0xff,0x00,0x00,
-0x00,0xff,0x09,0x09,0x09,0xff,0x0e,0x0e,0x0e,0xff,0x0d,0x0d,0x0d,0xff,0x06,0x06,
-0x06,0xff,0x0c,0x0c,0x0c,0xff,0x19,0x19,0x19,0xff,0x0c,0x0c,0x0c,0xff,0x0a,0x0a,
-0x0a,0xff,0x05,0x05,0x05,0xff,0x04,0x04,0x04,0xff,0x05,0x05,0x05,0xff,0x0b,0x0b,
-0x0b,0xff,0x08,0x07,0x06,0xff,0x1e,0x1a,0x15,0xff,0x47,0x42,0x38,0xff,0x34,0x30,
-0x2a,0xff,0x0e,0x0d,0x0c,0xff,0x1b,0x1b,0x1b,0xff,0x0a,0x0a,0x0a,0xff,0x02,0x02,
-0x02,0xff,0x07,0x07,0x07,0xff,0x02,0x02,0x02,0xff,0x04,0x04,0x04,0xff,0x0f,0x0f,
-0x0f,0xff,0x0d,0x0d,0x0d,0xff,0x1e,0x1e,0x1e,0xff,0x10,0x10,0x10,0xff,0x16,0x16,
-0x16,0xff,0x0c,0x0c,0x0c,0xff,0x0f,0x0f,0x0f,0xff,0x1f,0x1f,0x1f,0xff,0x10,0x10,
-0x10,0xff,0x05,0x05,0x05,0xff,0x08,0x08,0x08,0xff,0x11,0x11,0x11,0xff,0xff,0xff,
-0xff,0x00,0x68,0x5e,0x4f,0xff,0xab,0x9c,0x83,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0xab,0x9d,
-0x83,0xff,0xab,0x9c,0x83,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x5b,0x5b,0x5b,0xff,0xa4,0xa4,
-0xa4,0xff,0x5c,0x5c,0x5c,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x5c,0x5c,0x5c,0xff,0xa4,0xa4,0xa4,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x5c,0x5c,0x5c,0xff,0xa3,0xa3,0xa3,0xff,0x5c,0x5c,
-0x5c,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x5b,0x5b,0x5b,0xff,0xa5,0xa5,0xa5,0xff,0x5c,0x5c,0x5c,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xf1,0xea,0xdf,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xf1,0xea,
-0xdf,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x39,0x39,0x39,0xff,0x4d,0x46,
-0x3b,0xff,0x4d,0x47,0x3a,0xff,0x4d,0x46,0x3b,0xff,0x4d,0x46,0x3b,0xff,0x4d,0x46,
-0x3b,0xff,0x4d,0x47,0x3a,0xff,0x4d,0x46,0x3b,0xff,0x5c,0x5b,0x5b,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x18,0x18,0x18,0xff,0x03,0x03,0x03,0xff,0x07,0x07,
-0x07,0xff,0x1d,0x1d,0x1d,0xff,0x06,0x06,0x06,0xff,0x07,0x07,0x07,0xff,0x00,0x00,
-0x00,0xff,0x05,0x05,0x05,0xff,0x10,0x10,0x10,0xff,0x06,0x06,0x06,0xff,0x03,0x03,
-0x03,0xff,0x03,0x03,0x03,0xff,0x0b,0x0a,0x08,0xff,0x43,0x3e,0x36,0xff,0x51,0x4c,
-0x43,0xff,0x17,0x15,0x13,0xff,0x10,0x0f,0x0f,0xff,0x0c,0x0c,0x0c,0xff,0x0a,0x0a,
-0x0a,0xff,0x19,0x19,0x19,0xff,0x0d,0x0d,0x0d,0xff,0x03,0x03,0x03,0xff,0x0e,0x0e,
-0x0e,0xff,0x14,0x14,0x14,0xff,0x11,0x11,0x11,0xff,0x08,0x08,0x08,0xff,0x06,0x06,
-0x06,0xff,0x04,0x04,0x04,0xff,0x05,0x05,0x05,0xff,0x00,0x00,0x00,0xff,0x04,0x04,
-0x04,0xff,0x10,0x10,0x10,0xff,0x06,0x06,0x06,0xff,0x03,0x03,0x03,0xff,0x05,0x05,
-0x05,0xff,0x14,0x14,0x14,0xff,0x10,0x10,0x10,0xff,0x22,0x22,0x22,0xff,0x2c,0x2c,
-0x2c,0xff,0x16,0x16,0x16,0xff,0x14,0x14,0x14,0xff,0x0c,0x0c,0x0c,0xff,0x0b,0x0b,
-0x0b,0xff,0x06,0x06,0x05,0xff,0x23,0x20,0x1b,0xff,0x40,0x3b,0x32,0xff,0x1e,0x1b,
-0x15,0xff,0x10,0x10,0x0f,0xff,0x1b,0x1b,0x1b,0xff,0x07,0x07,0x07,0xff,0x08,0x08,
-0x08,0xff,0x08,0x08,0x08,0xff,0x01,0x01,0x01,0xff,0x02,0x02,0x02,0xff,0x07,0x07,
-0x07,0xff,0x0a,0x0a,0x0a,0xff,0x1e,0x1e,0x1e,0xff,0x17,0x17,0x17,0xff,0x1c,0x1c,
-0x1c,0xff,0x07,0x07,0x07,0xff,0x18,0x18,0x18,0xff,0x2a,0x2a,0x2a,0xff,0x15,0x15,
-0x15,0xff,0x08,0x08,0x08,0xff,0x18,0x18,0x18,0xff,0x03,0x03,0x03,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,
-0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xa4,0xa4,0xa4,0xff,0x5c,0x5c,
-0x5c,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xa4,0xa4,0xa4,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xa3,0xa3,0xa3,0xff,0x5b,0x5b,0x5b,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x5b,0x5b,0x5b,0xff,0xa5,0xa5,0xa5,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,
-0x35,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,
-0x4f,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xf1,0xea,0xdf,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xf1,0xea,
-0xdf,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x4f,0x4e,0x4e,0xff,0x53,0x4b,
-0x3f,0xff,0x53,0x4b,0x3f,0xff,0x52,0x4b,0x3f,0xff,0x53,0x4b,0x3f,0xff,0x52,0x4b,
-0x3f,0xff,0x53,0x4b,0x3f,0xff,0x53,0x4b,0x3f,0xff,0x70,0x6f,0x6d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x05,0x05,0x05,0xff,0x07,0x07,0x07,0xff,0x0a,0x0a,
-0x0a,0xff,0x15,0x15,0x15,0xff,0x0d,0x0d,0x0d,0xff,0x1b,0x1b,0x1b,0xff,0x08,0x08,
-0x08,0xff,0x07,0x07,0x07,0xff,0x08,0x08,0x08,0xff,0x07,0x07,0x07,0xff,0x0a,0x0a,
-0x0a,0xff,0x04,0x03,0x02,0xff,0x17,0x14,0x0f,0xff,0x3a,0x35,0x2d,0xff,0x52,0x4d,
-0x45,0xff,0x20,0x1d,0x19,0xff,0x0b,0x0a,0x09,0xff,0x05,0x05,0x05,0xff,0x07,0x07,
-0x07,0xff,0x11,0x11,0x11,0xff,0x0d,0x0d,0x0d,0xff,0x05,0x05,0x05,0xff,0x07,0x07,
-0x07,0xff,0x11,0x11,0x11,0xff,0x08,0x08,0x08,0xff,0x01,0x01,0x01,0xff,0x05,0x05,
-0x05,0xff,0x04,0x04,0x04,0xff,0x0e,0x0e,0x0e,0xff,0x05,0x05,0x05,0xff,0x02,0x02,
-0x02,0xff,0x04,0x04,0x04,0xff,0x03,0x03,0x03,0xff,0x00,0x00,0x00,0xff,0x06,0x06,
-0x06,0xff,0x05,0x05,0x05,0xff,0x03,0x03,0x03,0xff,0x1b,0x1b,0x1b,0xff,0x0f,0x0f,
-0x0f,0xff,0x07,0x07,0x07,0xff,0x1a,0x1a,0x1a,0xff,0x23,0x23,0x23,0xff,0x18,0x18,
-0x18,0xff,0x09,0x09,0x08,0xff,0x2b,0x28,0x23,0xff,0x37,0x33,0x2b,0xff,0x16,0x14,
-0x11,0xff,0x24,0x24,0x22,0xff,0x0f,0x0f,0x0f,0xff,0x10,0x10,0x10,0xff,0x22,0x22,
-0x22,0xff,0x17,0x17,0x17,0xff,0x07,0x07,0x07,0xff,0x07,0x07,0x07,0xff,0x07,0x07,
-0x07,0xff,0x0c,0x0c,0x0c,0xff,0x25,0x25,0x25,0xff,0x15,0x15,0x15,0xff,0x24,0x24,
-0x24,0xff,0x14,0x14,0x14,0xff,0x2b,0x2b,0x2b,0xff,0x32,0x32,0x32,0xff,0x1c,0x1c,
-0x1c,0xff,0x04,0x04,0x04,0xff,0x05,0x05,0x05,0xff,0x07,0x07,0x07,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xa4,0xa4,0xa4,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xa4,0xa4,0xa4,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xa5,0xa5,0xa5,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xa5,0xa5,0xa5,0xff,0xa4,0xa4,
-0xa4,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,0x4f,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xf1,0xea,0xdf,0xff,0xf1,0xea,
-0xdf,0xff,0x26,0x22,0x1c,0xff,0x26,0x22,0x1c,0xff,0x26,0x22,0x1c,0xff,0x26,0x22,
-0x1c,0xff,0x26,0x22,0x1c,0xff,0x26,0x22,0x1c,0xff,0x26,0x22,0x1c,0xff,0x26,0x22,
-0x1c,0xff,0x26,0x22,0x1c,0xff,0xf1,0xea,0xdf,0xff,0xf1,0xea,0xdf,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x60,0x5f,0x5e,0xff,0x58,0x50,
-0x43,0xff,0x58,0x50,0x43,0xff,0x57,0x50,0x43,0xff,0x58,0x51,0x42,0xff,0x57,0x50,
-0x43,0xff,0x58,0x50,0x43,0xff,0x58,0x50,0x43,0xff,0x79,0x77,0x73,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x21,0x21,0x21,0xff,0x10,0x10,
-0x10,0xff,0x0a,0x0a,0x0a,0xff,0x0a,0x0a,0x0a,0xff,0x0c,0x0c,0x0c,0xff,0x04,0x04,
-0x04,0xff,0x0f,0x0f,0x0f,0xff,0x06,0x06,0x06,0xff,0x05,0x05,0x05,0xff,0x13,0x13,
-0x13,0xff,0x0b,0x0b,0x0a,0xff,0x1e,0x1b,0x16,0xff,0x2e,0x29,0x21,0xff,0x31,0x2c,
-0x24,0xff,0x18,0x15,0x12,0xff,0x0f,0x0e,0x0e,0xff,0x04,0x04,0x04,0xff,0x02,0x02,
-0x02,0xff,0x08,0x08,0x08,0xff,0x0c,0x0c,0x0c,0xff,0x05,0x05,0x05,0xff,0x01,0x01,
-0x01,0xff,0x04,0x04,0x04,0xff,0x01,0x01,0x01,0xff,0x08,0x08,0x08,0xff,0x12,0x12,
-0x12,0xff,0x04,0x04,0x04,0xff,0x05,0x05,0x05,0xff,0x0c,0x0c,0x0c,0xff,0x10,0x10,
-0x10,0xff,0x06,0x06,0x06,0xff,0x0d,0x0d,0x0d,0xff,0x0a,0x0a,0x0a,0xff,0x1a,0x1a,
-0x1a,0xff,0x06,0x06,0x06,0xff,0x0d,0x0d,0x0d,0xff,0x25,0x25,0x25,0xff,0x0c,0x0c,
-0x0c,0xff,0x01,0x01,0x01,0xff,0x07,0x07,0x07,0xff,0x0a,0x0a,0x0a,0xff,0x07,0x07,
-0x07,0xff,0x09,0x09,0x08,0xff,0x2b,0x28,0x25,0xff,0x22,0x1d,0x15,0xff,0x0d,0x0a,
-0x05,0xff,0x21,0x20,0x1d,0xff,0x09,0x09,0x08,0xff,0x0b,0x0b,0x0b,0xff,0x09,0x09,
-0x09,0xff,0x07,0x07,0x07,0xff,0x13,0x13,0x13,0xff,0x16,0x16,0x16,0xff,0x06,0x06,
-0x06,0xff,0x03,0x03,0x03,0xff,0x0b,0x0b,0x0b,0xff,0x05,0x05,0x05,0xff,0x0e,0x0e,
-0x0e,0xff,0x0c,0x0c,0x0c,0xff,0x13,0x13,0x13,0xff,0x0f,0x0f,0x0f,0xff,0x04,0x04,
-0x04,0xff,0x01,0x01,0x01,0xff,0x00,0x00,0x00,0xff,0x21,0x21,0x21,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xa4,0xa4,0xa4,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xa4,0xa4,0xa4,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xa5,0xa5,0xa5,0xff,0xa5,0xa5,0xa5,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x48,0x42,0x36,0xff,0x48,0x42,0x36,0xff,0x48,0x42,0x36,0xff,0x48,0x42,
-0x36,0xff,0x48,0x42,0x36,0xff,0x48,0x42,0x36,0xff,0x48,0x42,0x36,0xff,0x48,0x42,
-0x36,0xff,0x48,0x42,0x36,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x6d,0x6c,0x6a,0xff,0x5d,0x55,
-0x47,0xff,0x5d,0x55,0x47,0xff,0x5d,0x55,0x47,0xff,0x5d,0x55,0x47,0xff,0x5d,0x55,
-0x47,0xff,0x5d,0x55,0x47,0xff,0x5d,0x55,0x47,0xff,0x7b,0x77,0x70,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x01,0x01,0x01,0xff,0x18,0x18,0x18,0xff,0x1a,0x1a,
-0x1a,0xff,0x15,0x15,0x15,0xff,0x08,0x08,0x08,0xff,0x0f,0x0f,0x0f,0xff,0x0e,0x0e,
-0x0e,0xff,0x18,0x18,0x18,0xff,0x11,0x11,0x11,0xff,0x06,0x06,0x06,0xff,0x12,0x12,
-0x11,0xff,0x11,0x10,0x0e,0xff,0x13,0x11,0x0e,0xff,0x30,0x2b,0x24,0xff,0x20,0x1c,
-0x16,0xff,0x12,0x10,0x0e,0xff,0x1f,0x1f,0x1f,0xff,0x0b,0x0b,0x0b,0xff,0x04,0x04,
-0x04,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,0x0d,0xff,0x0b,0x0b,0x0b,0xff,0x08,0x08,
-0x08,0xff,0x01,0x01,0x01,0xff,0x04,0x04,0x04,0xff,0x05,0x05,0x05,0xff,0x07,0x07,
-0x07,0xff,0x00,0x00,0x00,0xff,0x03,0x03,0x03,0xff,0x19,0x19,0x19,0xff,0x1d,0x1d,
-0x1d,0xff,0x06,0x06,0x06,0xff,0x03,0x03,0x03,0xff,0x04,0x04,0x04,0xff,0x13,0x13,
-0x13,0xff,0x0a,0x0a,0x0a,0xff,0x11,0x11,0x11,0xff,0x14,0x14,0x14,0xff,0x0d,0x0d,
-0x0d,0xff,0x07,0x07,0x07,0xff,0x10,0x10,0x10,0xff,0x13,0x13,0x13,0xff,0x11,0x11,
-0x11,0xff,0x03,0x03,0x03,0xff,0x0e,0x0d,0x0b,0xff,0x18,0x14,0x0e,0xff,0x1b,0x17,
-0x11,0xff,0x25,0x24,0x21,0xff,0x11,0x11,0x11,0xff,0x11,0x11,0x11,0xff,0x02,0x02,
-0x02,0xff,0x01,0x01,0x01,0xff,0x04,0x04,0x04,0xff,0x09,0x09,0x09,0xff,0x05,0x05,
-0x05,0xff,0x0f,0x0f,0x0f,0xff,0x12,0x12,0x12,0xff,0x1f,0x1f,0x1f,0xff,0x1f,0x1f,
-0x1f,0xff,0x11,0x11,0x11,0xff,0x0a,0x0a,0x0a,0xff,0x12,0x12,0x12,0xff,0x05,0x05,
-0x05,0xff,0x03,0x03,0x03,0xff,0x01,0x01,0x01,0xff,0x18,0x18,0x18,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xa5,0xa5,0xa5,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xa5,0xa5,0xa5,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xa4,0xa4,0xa4,0xff,0xa4,0xa4,
-0xa4,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,0x4f,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x77,0x75,0x72,0xff,0x63,0x5a,
-0x4b,0xff,0x62,0x5a,0x4b,0xff,0x63,0x5a,0x4c,0xff,0x63,0x5a,0x4b,0xff,0x63,0x5a,
-0x4c,0xff,0x62,0x5a,0x4b,0xff,0x63,0x5a,0x4b,0xff,0x7a,0x75,0x6d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x03,0x03,0x03,0xff,0x0f,0x0f,
-0x0f,0xff,0x1d,0x1d,0x1d,0xff,0x0b,0x0b,0x0b,0xff,0x0c,0x0c,0x0c,0xff,0x05,0x05,
-0x05,0xff,0x07,0x07,0x07,0xff,0x05,0x05,0x05,0xff,0x01,0x01,0x01,0xff,0x0d,0x0d,
-0x0c,0xff,0x24,0x22,0x20,0xff,0x23,0x1f,0x1a,0xff,0x3b,0x36,0x2d,0xff,0x23,0x20,
-0x1a,0xff,0x11,0x11,0x0f,0xff,0x17,0x17,0x17,0xff,0x11,0x11,0x11,0xff,0x03,0x03,
-0x03,0xff,0x0c,0x0c,0x0c,0xff,0x10,0x10,0x10,0xff,0x0d,0x0d,0x0d,0xff,0x02,0x02,
-0x02,0xff,0x04,0x04,0x04,0xff,0x18,0x18,0x18,0xff,0x17,0x17,0x17,0xff,0x11,0x11,
-0x11,0xff,0x03,0x03,0x03,0xff,0x05,0x05,0x05,0xff,0x19,0x19,0x19,0xff,0x0d,0x0d,
-0x0d,0xff,0x03,0x03,0x03,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x05,0x05,
-0x05,0xff,0x0b,0x0b,0x0b,0xff,0x0d,0x0d,0x0d,0xff,0x16,0x16,0x16,0xff,0x10,0x10,
-0x10,0xff,0x08,0x08,0x08,0xff,0x07,0x07,0x07,0xff,0x04,0x04,0x04,0xff,0x09,0x09,
-0x09,0xff,0x00,0x00,0x00,0xff,0x0a,0x09,0x09,0xff,0x15,0x13,0x10,0xff,0x2f,0x2b,
-0x26,0xff,0x25,0x24,0x21,0xff,0x12,0x12,0x11,0xff,0x18,0x18,0x18,0xff,0x09,0x09,
-0x09,0xff,0x06,0x06,0x06,0xff,0x08,0x08,0x08,0xff,0x14,0x14,0x14,0xff,0x0f,0x0f,
-0x0f,0xff,0x06,0x06,0x06,0xff,0x0d,0x0d,0x0d,0xff,0x1c,0x1c,0x1c,0xff,0x22,0x22,
-0x22,0xff,0x07,0x07,0x07,0xff,0x01,0x01,0x01,0xff,0x05,0x05,0x05,0xff,0x00,0x00,
-0x00,0xff,0x0a,0x0a,0x0a,0xff,0x00,0x00,0x00,0xff,0x03,0x03,0x03,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0xab,0x9d,
-0x82,0xff,0xab,0x9d,0x82,0xff,0x68,0x5e,0x4f,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0xab,0x9c,0x83,0xff,0x68,0x5e,
-0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xa5,0xa5,0xa5,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xa5,0xa5,0xa5,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xa5,0xa5,0xa5,0xff,0xa5,0xa5,0xa5,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xa5,0xa5,0xa5,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,
-0x4f,0xff,0xab,0x9c,0x83,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x7d,0x7b,0x77,0xff,0x68,0x5f,
-0x50,0xff,0x68,0x5f,0x4f,0xff,0x68,0x5f,0x4f,0xff,0x68,0x5f,0x4f,0xff,0x68,0x5f,
-0x4f,0xff,0x68,0x5f,0x4f,0xff,0x68,0x5f,0x50,0xff,0x79,0x73,0x67,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x0d,0x0d,0x0d,0xff,0x07,0x07,0x07,0xff,0x0f,0x0f,
-0x0f,0xff,0x0c,0x0c,0x0c,0xff,0x0c,0x0c,0x0c,0xff,0x0c,0x0c,0x0c,0xff,0x06,0x06,
-0x06,0xff,0x07,0x07,0x07,0xff,0x02,0x02,0x02,0xff,0x04,0x04,0x04,0xff,0x18,0x18,
-0x18,0xff,0x2b,0x2b,0x2a,0xff,0x26,0x23,0x1e,0xff,0x32,0x2d,0x24,0xff,0x22,0x1f,
-0x1a,0xff,0x13,0x13,0x12,0xff,0x0f,0x0f,0x0f,0xff,0x11,0x11,0x11,0xff,0x0a,0x0a,
-0x0a,0xff,0x14,0x14,0x14,0xff,0x0d,0x0d,0x0d,0xff,0x14,0x14,0x14,0xff,0x08,0x08,
-0x08,0xff,0x0b,0x0b,0x0b,0xff,0x21,0x21,0x21,0xff,0x19,0x19,0x19,0xff,0x15,0x15,
-0x15,0xff,0x03,0x03,0x03,0xff,0x01,0x01,0x01,0xff,0x08,0x08,0x08,0xff,0x04,0x04,
-0x04,0xff,0x09,0x09,0x09,0xff,0x02,0x02,0x02,0xff,0x06,0x06,0x06,0xff,0x03,0x03,
-0x03,0xff,0x0e,0x0e,0x0e,0xff,0x07,0x07,0x07,0xff,0x10,0x10,0x10,0xff,0x10,0x10,
-0x10,0xff,0x11,0x11,0x11,0xff,0x05,0x05,0x05,0xff,0x06,0x06,0x06,0xff,0x17,0x17,
-0x17,0xff,0x12,0x12,0x11,0xff,0x31,0x2f,0x2b,0xff,0x3b,0x36,0x30,0xff,0x4a,0x45,
-0x40,0xff,0x20,0x1e,0x1c,0xff,0x19,0x19,0x19,0xff,0x18,0x18,0x18,0xff,0x0f,0x0f,
-0x0f,0xff,0x06,0x06,0x06,0xff,0x07,0x07,0x07,0xff,0x0a,0x0a,0x0a,0xff,0x08,0x08,
-0x08,0xff,0x06,0x06,0x06,0xff,0x19,0x19,0x19,0xff,0x15,0x15,0x15,0xff,0x21,0x21,
-0x21,0xff,0x0a,0x0a,0x0a,0xff,0x05,0x05,0x05,0xff,0x05,0x05,0x05,0xff,0x0a,0x0a,
-0x0a,0xff,0x29,0x29,0x29,0xff,0x0d,0x0d,0x0d,0xff,0x07,0x07,0x07,0xff,0xff,0xff,
-0xff,0x00,0x68,0x5e,0x4f,0xff,0x97,0x89,0x73,0xff,0x97,0x89,0x73,0xff,0x68,0x5e,
-0x4f,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0x96,0x89,
-0x73,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xa4,0xa4,0xa4,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x5c,0x5c,0x5c,0xff,0xa5,0xa5,0xa5,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xa5,0xa5,0xa5,0xff,0x5b,0x5b,0x5b,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x5b,0x5b,0x5b,0xff,0xa3,0xa3,0xa3,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x68,0x5e,0x4f,0xff,0x96,0x89,0x73,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,
-0x35,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x81,0x7e,0x77,0xff,0x6d,0x64,
-0x54,0xff,0x6d,0x64,0x54,0xff,0x6e,0x64,0x54,0xff,0x6e,0x64,0x53,0xff,0x6e,0x64,
-0x54,0xff,0x6d,0x64,0x54,0xff,0x6d,0x64,0x54,0xff,0x78,0x70,0x63,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x15,0x15,0x15,0xff,0x18,0x18,0x18,0xff,0x11,0x11,
-0x11,0xff,0x04,0x04,0x04,0xff,0x03,0x03,0x03,0xff,0x04,0x04,0x04,0xff,0x0d,0x0d,
-0x0d,0xff,0x04,0x04,0x04,0xff,0x00,0x00,0x00,0xff,0x06,0x06,0x06,0xff,0x04,0x04,
-0x04,0xff,0x0f,0x0e,0x0e,0xff,0x2c,0x29,0x24,0xff,0x42,0x3d,0x35,0xff,0x28,0x25,
-0x20,0xff,0x0c,0x0c,0x0b,0xff,0x12,0x12,0x12,0xff,0x0a,0x0a,0x0a,0xff,0x04,0x04,
-0x04,0xff,0x05,0x05,0x05,0xff,0x03,0x03,0x03,0xff,0x19,0x19,0x19,0xff,0x19,0x19,
-0x19,0xff,0x15,0x15,0x15,0xff,0x0b,0x0b,0x0b,0xff,0x06,0x06,0x06,0xff,0x16,0x16,
-0x16,0xff,0x05,0x05,0x05,0xff,0x00,0x00,0x00,0xff,0x07,0x07,0x07,0xff,0x03,0x03,
-0x03,0xff,0x05,0x05,0x05,0xff,0x06,0x06,0x06,0xff,0x17,0x17,0x17,0xff,0x0a,0x0a,
-0x0a,0xff,0x0d,0x0d,0x0d,0xff,0x09,0x09,0x09,0xff,0x09,0x09,0x09,0xff,0x04,0x04,
-0x04,0xff,0x07,0x07,0x07,0xff,0x09,0x09,0x09,0xff,0x02,0x02,0x02,0xff,0x16,0x16,
-0x16,0xff,0x11,0x10,0x10,0xff,0x1a,0x17,0x13,0xff,0x36,0x31,0x29,0xff,0x4a,0x46,
-0x40,0xff,0x0f,0x0f,0x0e,0xff,0x07,0x07,0x07,0xff,0x0c,0x0c,0x0c,0xff,0x0d,0x0d,
-0x0d,0xff,0x02,0x02,0x02,0xff,0x04,0x04,0x04,0xff,0x08,0x08,0x08,0xff,0x03,0x03,
-0x03,0xff,0x07,0x07,0x07,0xff,0x1f,0x1f,0x1f,0xff,0x19,0x19,0x19,0xff,0x16,0x16,
-0x16,0xff,0x09,0x09,0x09,0xff,0x0c,0x0c,0x0c,0xff,0x0b,0x0b,0x0b,0xff,0x06,0x06,
-0x06,0xff,0x1a,0x1a,0x1a,0xff,0x15,0x15,0x15,0xff,0x18,0x18,0x18,0xff,0xff,0xff,
-0xff,0x00,0x7f,0x74,0x61,0xff,0x68,0x5e,0x4f,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x7f,0x74,
-0x61,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xa4,0xa4,0xa4,0xff,0x5c,0x5c,
-0x5c,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x5c,0x5c,
-0x5c,0xff,0xa5,0xa5,0xa5,0xff,0x5b,0x5b,0x5b,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x5c,0x5c,0x5c,0xff,0xa4,0xa4,0xa4,0xff,0x5b,0x5b,
-0x5b,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x5c,0x5c,0x5c,0xff,0xa4,0xa4,0xa4,0xff,0x5c,0x5c,0x5c,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x7f,0x74,0x61,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,
-0x35,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x26,0x22,0x1c,0xff,0x26,0x22,0x1c,0xff,0x26,0x22,0x1c,0xff,0x26,0x22,
-0x1c,0xff,0x26,0x22,0x1c,0xff,0x26,0x22,0x1c,0xff,0x26,0x22,0x1c,0xff,0x26,0x22,
-0x1c,0xff,0x26,0x22,0x1c,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x84,0x7f,0x76,0xff,0x73,0x69,
-0x58,0xff,0x73,0x69,0x58,0xff,0x73,0x69,0x58,0xff,0x73,0x69,0x58,0xff,0x73,0x69,
-0x58,0xff,0x73,0x69,0x58,0xff,0x73,0x69,0x58,0xff,0x78,0x70,0x60,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x04,0x04,0x04,0xff,0x05,0x05,0x05,0xff,0x05,0x05,
-0x05,0xff,0x06,0x06,0x06,0xff,0x02,0x02,0x02,0xff,0x05,0x05,0x05,0xff,0x17,0x17,
-0x17,0xff,0x08,0x08,0x08,0xff,0x08,0x08,0x08,0xff,0x1e,0x1e,0x1e,0xff,0x08,0x08,
-0x08,0xff,0x10,0x10,0x0f,0xff,0x2d,0x2b,0x26,0xff,0x3e,0x38,0x30,0xff,0x36,0x32,
-0x2d,0xff,0x0a,0x09,0x08,0xff,0x07,0x07,0x07,0xff,0x0a,0x0a,0x0a,0xff,0x0f,0x0f,
-0x0f,0xff,0x04,0x04,0x04,0xff,0x04,0x04,0x04,0xff,0x19,0x19,0x19,0xff,0x17,0x17,
-0x17,0xff,0x0a,0x0a,0x0a,0xff,0x02,0x02,0x02,0xff,0x07,0x07,0x07,0xff,0x22,0x22,
-0x22,0xff,0x14,0x14,0x14,0xff,0x08,0x08,0x08,0xff,0x16,0x16,0x16,0xff,0x0a,0x0a,
-0x0a,0xff,0x0a,0x0a,0x0a,0xff,0x02,0x02,0x02,0xff,0x09,0x09,0x09,0xff,0x12,0x12,
-0x12,0xff,0x17,0x17,0x17,0xff,0x16,0x16,0x16,0xff,0x16,0x16,0x16,0xff,0x07,0x07,
-0x07,0xff,0x0d,0x0d,0x0d,0xff,0x1f,0x1f,0x1f,0xff,0x0d,0x0d,0x0d,0xff,0x20,0x20,
-0x20,0xff,0x1a,0x19,0x19,0xff,0x23,0x21,0x1d,0xff,0x67,0x62,0x5a,0xff,0x47,0x43,
-0x3d,0xff,0x0a,0x09,0x08,0xff,0x00,0x00,0x00,0xff,0x08,0x08,0x08,0xff,0x08,0x08,
-0x08,0xff,0x02,0x02,0x02,0xff,0x02,0x02,0x02,0xff,0x08,0x08,0x08,0xff,0x02,0x02,
-0x02,0xff,0x0b,0x0b,0x0b,0xff,0x0a,0x0a,0x0a,0xff,0x0a,0x0a,0x0a,0xff,0x0e,0x0e,
-0x0e,0xff,0x0b,0x0b,0x0b,0xff,0x1c,0x1c,0x1c,0xff,0x09,0x09,0x09,0xff,0x02,0x02,
-0x02,0xff,0x05,0x05,0x05,0xff,0x04,0x04,0x04,0xff,0x05,0x05,0x05,0xff,0xff,0xff,
-0xff,0x00,0x68,0x5e,0x4f,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5f,
-0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x5c,0x5c,0x5c,0xff,0xa5,0xa5,
-0xa5,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xa5,0xa5,0xa5,0xff,0xa5,0xa5,
-0xa5,0xff,0xa3,0xa3,0xa3,0xff,0xa4,0xa4,0xa4,0xff,0xa4,0xa4,0xa4,0xff,0xa3,0xa3,
-0xa3,0xff,0x5c,0x5c,0x5c,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x5b,0x5b,0x5b,0xff,0xa4,0xa4,
-0xa4,0xff,0xa4,0xa4,0xa4,0xff,0xa4,0xa4,0xa4,0xff,0x00,0x00,0x00,0xff,0xa4,0xa4,
-0xa4,0xff,0xa5,0xa5,0xa5,0xff,0x5c,0x5c,0x5c,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,
-0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5f,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x80,0x74,0xff,0x79,0x6e,
-0x5c,0xff,0x79,0x6e,0x5c,0xff,0x78,0x6e,0x5c,0xff,0x78,0x6e,0x5c,0xff,0x78,0x6e,
-0x5c,0xff,0x79,0x6e,0x5c,0xff,0x79,0x6e,0x5c,0xff,0x7c,0x71,0x61,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x02,0x02,0x02,0xff,0x03,0x03,0x03,0xff,0x00,0x00,
-0x00,0xff,0x02,0x02,0x02,0xff,0x00,0x00,0x00,0xff,0x03,0x03,0x03,0xff,0x0c,0x0c,
-0x0c,0xff,0x0c,0x0c,0x0c,0xff,0x10,0x10,0x10,0xff,0x20,0x20,0x20,0xff,0x07,0x07,
-0x07,0xff,0x0e,0x0e,0x0d,0xff,0x19,0x17,0x12,0xff,0x3d,0x37,0x2e,0xff,0x4b,0x46,
-0x3f,0xff,0x1b,0x19,0x16,0xff,0x06,0x06,0x05,0xff,0x04,0x04,0x04,0xff,0x05,0x05,
-0x05,0xff,0x08,0x08,0x08,0xff,0x01,0x01,0x01,0xff,0x06,0x06,0x06,0xff,0x0c,0x0c,
-0x0c,0xff,0x03,0x03,0x03,0xff,0x06,0x06,0x06,0xff,0x04,0x04,0x04,0xff,0x10,0x10,
-0x10,0xff,0x18,0x18,0x18,0xff,0x0b,0x0b,0x0b,0xff,0x09,0x09,0x09,0xff,0x07,0x07,
-0x07,0xff,0x0a,0x0a,0x0a,0xff,0x01,0x01,0x01,0xff,0x02,0x02,0x02,0xff,0x05,0x05,
-0x05,0xff,0x0a,0x0a,0x0a,0xff,0x17,0x17,0x17,0xff,0x11,0x11,0x11,0xff,0x0b,0x0b,
-0x0b,0xff,0x1d,0x1d,0x1d,0xff,0x2a,0x2a,0x2a,0xff,0x07,0x07,0x07,0xff,0x10,0x10,
-0x10,0xff,0x17,0x17,0x17,0xff,0x1b,0x19,0x17,0xff,0x58,0x52,0x4c,0xff,0x1e,0x1a,
-0x15,0xff,0x02,0x01,0x00,0xff,0x05,0x05,0x05,0xff,0x16,0x16,0x16,0xff,0x12,0x12,
-0x12,0xff,0x0b,0x0b,0x0b,0xff,0x15,0x15,0x15,0xff,0x1c,0x1c,0x1c,0xff,0x0b,0x0b,
-0x0b,0xff,0x16,0x16,0x16,0xff,0x14,0x14,0x14,0xff,0x15,0x15,0x15,0xff,0x16,0x16,
-0x16,0xff,0x06,0x06,0x06,0xff,0x0c,0x0c,0x0c,0xff,0x04,0x04,0x04,0xff,0x10,0x10,
-0x10,0xff,0x08,0x08,0x08,0xff,0x02,0x02,0x02,0xff,0x03,0x03,0x03,0xff,0xff,0xff,
-0xff,0x00,0x53,0x4b,0x3f,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x53,0x4b,
-0x40,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xa4,0xa4,
-0xa4,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xa4,0xa4,0xa4,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xa3,0xa3,0xa3,0xff,0x00,0x00,0x00,0xff,0xa4,0xa4,
-0xa4,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,
-0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x53,0x4b,0x40,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,
-0xc1,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x88,0x80,0x72,0xff,0x7e,0x73,
-0x60,0xff,0x7d,0x73,0x60,0xff,0x7e,0x72,0x60,0xff,0x7d,0x73,0x60,0xff,0x7e,0x72,
-0x60,0xff,0x7d,0x73,0x60,0xff,0x7e,0x73,0x60,0xff,0x7f,0x76,0x63,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x04,0x04,0x04,0xff,0x12,0x12,0x12,0xff,0x03,0x03,
-0x03,0xff,0x00,0x00,0x00,0xff,0x05,0x05,0x05,0xff,0x0e,0x0e,0x0e,0xff,0x14,0x14,
-0x14,0xff,0x0e,0x0e,0x0e,0xff,0x03,0x03,0x03,0xff,0x06,0x06,0x06,0xff,0x07,0x07,
-0x07,0xff,0x1c,0x1c,0x1c,0xff,0x12,0x11,0x0f,0xff,0x37,0x32,0x29,0xff,0x47,0x41,
-0x38,0xff,0x26,0x23,0x1e,0xff,0x07,0x07,0x06,0xff,0x04,0x04,0x04,0xff,0x07,0x07,
-0x07,0xff,0x19,0x19,0x19,0xff,0x07,0x07,0x07,0xff,0x0d,0x0d,0x0d,0xff,0x24,0x24,
-0x24,0xff,0x12,0x12,0x12,0xff,0x06,0x06,0x06,0xff,0x0f,0x0f,0x0f,0xff,0x1b,0x1b,
-0x1b,0xff,0x25,0x25,0x25,0xff,0x21,0x21,0x21,0xff,0x10,0x10,0x10,0xff,0x07,0x07,
-0x07,0xff,0x15,0x15,0x15,0xff,0x05,0x05,0x05,0xff,0x07,0x07,0x07,0xff,0x0f,0x0f,
-0x0f,0xff,0x02,0x02,0x02,0xff,0x0f,0x0f,0x0f,0xff,0x20,0x20,0x20,0xff,0x19,0x19,
-0x19,0xff,0x0f,0x0f,0x0f,0xff,0x1a,0x1a,0x1a,0xff,0x0d,0x0d,0x0d,0xff,0x0c,0x0c,
-0x0c,0xff,0x0c,0x0b,0x0b,0xff,0x1f,0x1c,0x18,0xff,0x40,0x3a,0x32,0xff,0x19,0x14,
-0x0f,0xff,0x04,0x03,0x01,0xff,0x01,0x01,0x00,0xff,0x0c,0x0c,0x0c,0xff,0x15,0x15,
-0x15,0xff,0x10,0x10,0x10,0xff,0x14,0x14,0x14,0xff,0x0a,0x0a,0x0a,0xff,0x00,0x00,
-0x00,0xff,0x04,0x04,0x04,0xff,0x07,0x07,0x07,0xff,0x13,0x13,0x13,0xff,0x1a,0x1a,
-0x1a,0xff,0x0a,0x0a,0x0a,0xff,0x03,0x03,0x03,0xff,0x06,0x06,0x06,0xff,0x22,0x22,
-0x22,0xff,0x09,0x09,0x09,0xff,0x04,0x04,0x04,0xff,0x12,0x12,0x12,0xff,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xe1,0xd5,
-0xc1,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x68,0x5e,
-0x4f,0xff,0x68,0x5e,0x4f,0xff,0x68,0x5e,0x4f,0xff,0x68,0x5e,0x4f,0xff,0x68,0x5e,
-0x4f,0xff,0x68,0x5e,0x4f,0xff,0x68,0x5e,0x4f,0xff,0x68,0x5e,0x4f,0xff,0x68,0x5e,
-0x4f,0xff,0x68,0x5e,0x4f,0xff,0x68,0x5e,0x4f,0xff,0x68,0x5e,0x4f,0xff,0x68,0x5e,
-0x4f,0xff,0x68,0x5e,0x4f,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0x26,0x22,0x1c,0xff,0x26,0x22,0x1c,0xff,0x26,0x22,0x1c,0xff,0x26,0x22,
-0x1c,0xff,0x26,0x22,0x1c,0xff,0x26,0x22,0x1c,0xff,0x26,0x22,0x1c,0xff,0x26,0x22,
-0x1c,0xff,0x26,0x22,0x1c,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x89,0x80,0x70,0xff,0x84,0x77,
-0x64,0xff,0x83,0x78,0x64,0xff,0x83,0x78,0x64,0xff,0x84,0x78,0x64,0xff,0x83,0x78,
-0x64,0xff,0x83,0x78,0x64,0xff,0x84,0x77,0x64,0xff,0x82,0x7a,0x66,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x03,0x03,0x03,0xff,0x11,0x11,0x11,0xff,0x03,0x03,
-0x03,0xff,0x03,0x03,0x03,0xff,0x0a,0x0a,0x0a,0xff,0x06,0x06,0x06,0xff,0x08,0x08,
-0x08,0xff,0x10,0x10,0x10,0xff,0x04,0x04,0x04,0xff,0x02,0x02,0x02,0xff,0x0b,0x0b,
-0x0b,0xff,0x08,0x08,0x08,0xff,0x0a,0x0a,0x08,0xff,0x33,0x2e,0x28,0xff,0x4c,0x45,
-0x3b,0xff,0x26,0x21,0x1a,0xff,0x08,0x06,0x05,0xff,0x0b,0x0b,0x0b,0xff,0x09,0x09,
-0x09,0xff,0x06,0x06,0x06,0xff,0x00,0x00,0x00,0xff,0x02,0x02,0x02,0xff,0x18,0x18,
-0x18,0xff,0x13,0x13,0x13,0xff,0x04,0x04,0x04,0xff,0x04,0x04,0x04,0xff,0x0d,0x0d,
-0x0d,0xff,0x18,0x18,0x18,0xff,0x0d,0x0d,0x0d,0xff,0x0f,0x0f,0x0f,0xff,0x10,0x10,
-0x10,0xff,0x1a,0x1a,0x1a,0xff,0x06,0x06,0x06,0xff,0x15,0x15,0x15,0xff,0x24,0x24,
-0x24,0xff,0x09,0x09,0x09,0xff,0x02,0x02,0x02,0xff,0x0a,0x0a,0x0a,0xff,0x0c,0x0c,
-0x0c,0xff,0x00,0x00,0x00,0xff,0x0a,0x0a,0x0a,0xff,0x16,0x16,0x16,0xff,0x09,0x09,
-0x09,0xff,0x07,0x06,0x06,0xff,0x2a,0x26,0x22,0xff,0x36,0x30,0x28,0xff,0x2d,0x29,
-0x23,0xff,0x09,0x08,0x07,0xff,0x07,0x07,0x07,0xff,0x15,0x15,0x15,0xff,0x1e,0x1e,
-0x1e,0xff,0x0a,0x0a,0x0a,0xff,0x04,0x04,0x04,0xff,0x03,0x03,0x03,0xff,0x00,0x00,
-0x00,0xff,0x02,0x02,0x02,0xff,0x09,0x09,0x09,0xff,0x0e,0x0e,0x0e,0xff,0x08,0x08,
-0x08,0xff,0x08,0x08,0x08,0xff,0x00,0x00,0x00,0xff,0x07,0x07,0x07,0xff,0x25,0x25,
-0x25,0xff,0x07,0x07,0x07,0xff,0x03,0x03,0x03,0xff,0x11,0x11,0x11,0xff,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xe1,0xd5,
-0xc1,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x68,0x5e,0x4f,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x8c,0x81,0x6e,0xff,0x88,0x7d,
-0x68,0xff,0x88,0x7d,0x68,0xff,0x89,0x7d,0x68,0xff,0x89,0x7c,0x68,0xff,0x89,0x7d,
-0x68,0xff,0x88,0x7d,0x68,0xff,0x88,0x7d,0x68,0xff,0x89,0x7d,0x68,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x0b,0x0b,0x0b,0xff,0x0b,0x0b,0x0b,0xff,0x02,0x02,
-0x02,0xff,0x03,0x03,0x03,0xff,0x08,0x08,0x08,0xff,0x06,0x06,0x06,0xff,0x01,0x01,
-0x01,0xff,0x08,0x08,0x08,0xff,0x00,0x00,0x00,0xff,0x10,0x10,0x10,0xff,0x2a,0x2a,
-0x2a,0xff,0x0a,0x0a,0x0a,0xff,0x04,0x03,0x03,0xff,0x26,0x22,0x1f,0xff,0x6d,0x67,
-0x5d,0xff,0x5a,0x53,0x4a,0xff,0x1e,0x1b,0x16,0xff,0x0c,0x0c,0x0b,0xff,0x18,0x18,
-0x18,0xff,0x06,0x06,0x06,0xff,0x00,0x00,0x00,0xff,0x0d,0x0d,0x0d,0xff,0x1e,0x1e,
-0x1e,0xff,0x15,0x15,0x15,0xff,0x06,0x06,0x06,0xff,0x00,0x00,0x00,0xff,0x0a,0x0a,
-0x0a,0xff,0x23,0x23,0x23,0xff,0x0a,0x0a,0x0a,0xff,0x0a,0x0a,0x0a,0xff,0x1a,0x1a,
-0x1a,0xff,0x10,0x10,0x10,0xff,0x0e,0x0e,0x0e,0xff,0x2e,0x2e,0x2e,0xff,0x1a,0x1a,
-0x1a,0xff,0x06,0x06,0x06,0xff,0x0b,0x0b,0x0b,0xff,0x16,0x16,0x16,0xff,0x22,0x22,
-0x22,0xff,0x08,0x08,0x08,0xff,0x00,0x00,0x00,0xff,0x06,0x06,0x06,0xff,0x01,0x01,
-0x01,0xff,0x07,0x07,0x06,0xff,0x37,0x34,0x2f,0xff,0x57,0x51,0x49,0xff,0x38,0x35,
-0x2f,0xff,0x0d,0x0d,0x0c,0xff,0x14,0x14,0x14,0xff,0x11,0x11,0x11,0xff,0x1a,0x1a,
-0x1a,0xff,0x10,0x10,0x10,0xff,0x06,0x06,0x06,0xff,0x0f,0x0f,0x0f,0xff,0x05,0x05,
-0x05,0xff,0x00,0x00,0x00,0xff,0x02,0x02,0x02,0xff,0x05,0x05,0x05,0xff,0x06,0x06,
-0x06,0xff,0x19,0x19,0x19,0xff,0x0b,0x0b,0x0b,0xff,0x04,0x04,0x04,0xff,0x19,0x19,
-0x19,0xff,0x09,0x09,0x09,0xff,0x0b,0x0b,0x0b,0xff,0x0b,0x0b,0x0b,0xff,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xe1,0xd5,
-0xc1,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,
-0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x68,0x5e,0x4f,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x90,0x83,0x6e,0xff,0x8e,0x82,
-0x6c,0xff,0x8e,0x82,0x6c,0xff,0x8e,0x82,0x6c,0xff,0x8e,0x81,0x6d,0xff,0x8e,0x82,
-0x6c,0xff,0x8e,0x82,0x6c,0xff,0x8e,0x82,0x6c,0xff,0x8e,0x81,0x6c,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x06,0x06,0x06,0xff,0x02,0x02,0x02,0xff,0x00,0x00,
-0x00,0xff,0x05,0x05,0x05,0xff,0x13,0x13,0x13,0xff,0x12,0x12,0x12,0xff,0x0a,0x0a,
-0x0a,0xff,0x11,0x11,0x11,0xff,0x0a,0x0a,0x0a,0xff,0x1c,0x1c,0x1c,0xff,0x12,0x12,
-0x12,0xff,0x00,0x00,0x00,0xff,0x03,0x03,0x03,0xff,0x0e,0x0d,0x0b,0xff,0x4a,0x45,
-0x3d,0xff,0x47,0x41,0x37,0xff,0x1b,0x16,0x0f,0xff,0x03,0x02,0x01,0xff,0x06,0x06,
-0x06,0xff,0x00,0x00,0x00,0xff,0x07,0x07,0x07,0xff,0x16,0x16,0x16,0xff,0x17,0x17,
-0x17,0xff,0x2c,0x2c,0x2c,0xff,0x23,0x23,0x23,0xff,0x06,0x06,0x06,0xff,0x00,0x00,
-0x00,0xff,0x09,0x09,0x09,0xff,0x07,0x07,0x07,0xff,0x04,0x04,0x04,0xff,0x0e,0x0e,
-0x0e,0xff,0x17,0x17,0x17,0xff,0x14,0x14,0x14,0xff,0x0f,0x0f,0x0f,0xff,0x10,0x10,
-0x10,0xff,0x1d,0x1d,0x1d,0xff,0x23,0x23,0x23,0xff,0x11,0x11,0x11,0xff,0x09,0x09,
-0x09,0xff,0x01,0x01,0x01,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x0e,0x0d,0x0c,0xff,0x39,0x35,0x2f,0xff,0x57,0x51,0x48,0xff,0x25,0x23,
-0x1f,0xff,0x17,0x17,0x16,0xff,0x23,0x23,0x23,0xff,0x08,0x08,0x08,0xff,0x04,0x04,
-0x04,0xff,0x05,0x05,0x05,0xff,0x07,0x07,0x07,0xff,0x0f,0x0f,0x0f,0xff,0x09,0x09,
-0x09,0xff,0x02,0x02,0x02,0xff,0x08,0x08,0x08,0xff,0x0a,0x0a,0x0a,0xff,0x03,0x03,
-0x03,0xff,0x0b,0x0b,0x0b,0xff,0x0e,0x0e,0x0e,0xff,0x08,0x08,0x08,0xff,0x1e,0x1e,
-0x1e,0xff,0x0e,0x0e,0x0e,0xff,0x06,0x06,0x06,0xff,0x02,0x02,0x02,0xff,0xff,0xff,
-0xff,0x00,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xe1,0xd5,
-0xc1,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x68,0x5e,
-0x4f,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x92,0x86,0x72,0xff,0x93,0x87,
-0x71,0xff,0x93,0x86,0x70,0xff,0x93,0x86,0x70,0xff,0x94,0x86,0x71,0xff,0x93,0x86,
-0x70,0xff,0x93,0x86,0x70,0xff,0x93,0x87,0x71,0xff,0x93,0x87,0x70,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x01,0x01,0x01,0xff,0x00,0x00,0x00,0xff,0x05,0x05,
-0x05,0xff,0x00,0x00,0x00,0xff,0x04,0x04,0x04,0xff,0x0a,0x0a,0x0a,0xff,0x0f,0x0f,
-0x0f,0xff,0x0b,0x0b,0x0b,0xff,0x06,0x06,0x06,0xff,0x21,0x21,0x21,0xff,0x0f,0x0f,
-0x0f,0xff,0x06,0x06,0x06,0xff,0x0e,0x0e,0x0e,0xff,0x13,0x13,0x12,0xff,0x45,0x41,
-0x39,0xff,0x4a,0x44,0x3c,0xff,0x2d,0x27,0x1f,0xff,0x05,0x04,0x03,0xff,0x00,0x00,
-0x00,0xff,0x01,0x01,0x01,0xff,0x01,0x01,0x01,0xff,0x0a,0x0a,0x0a,0xff,0x03,0x03,
-0x03,0xff,0x0f,0x0f,0x0f,0xff,0x0f,0x0f,0x0f,0xff,0x05,0x05,0x05,0xff,0x04,0x04,
-0x04,0xff,0x11,0x11,0x11,0xff,0x1e,0x1e,0x1e,0xff,0x15,0x15,0x15,0xff,0x12,0x12,
-0x12,0xff,0x18,0x18,0x18,0xff,0x26,0x26,0x26,0xff,0x0a,0x0a,0x0a,0xff,0x17,0x17,
-0x17,0xff,0x19,0x19,0x19,0xff,0x0a,0x0a,0x0a,0xff,0x02,0x02,0x02,0xff,0x06,0x06,
-0x06,0xff,0x06,0x06,0x06,0xff,0x01,0x01,0x01,0xff,0x04,0x04,0x04,0xff,0x08,0x07,
-0x07,0xff,0x2d,0x2b,0x27,0xff,0x44,0x3f,0x38,0xff,0x3a,0x35,0x2f,0xff,0x14,0x12,
-0x11,0xff,0x1b,0x1b,0x1b,0xff,0x1b,0x1b,0x1b,0xff,0x07,0x07,0x07,0xff,0x02,0x02,
-0x02,0xff,0x11,0x11,0x11,0xff,0x14,0x14,0x14,0xff,0x0e,0x0e,0x0e,0xff,0x02,0x02,
-0x02,0xff,0x05,0x05,0x05,0xff,0x15,0x15,0x15,0xff,0x08,0x08,0x08,0xff,0x04,0x04,
-0x04,0xff,0x0c,0x0c,0x0c,0xff,0x0a,0x0a,0x0a,0xff,0x06,0x06,0x06,0xff,0x1c,0x1c,
-0x1c,0xff,0x0f,0x0f,0x0f,0xff,0x01,0x01,0x01,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0x53,0x4b,0x3f,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x53,0x4b,
-0x40,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,
-0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x53,0x4b,0x40,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x68,0x5e,0x4f,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0xb9,0xa9,
-0x8d,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x97,0x8b,0x78,0xfe,0x98,0x8b,
-0x74,0xff,0x98,0x8b,0x75,0xff,0x98,0x8b,0x74,0xff,0x98,0x8b,0x74,0xff,0x98,0x8b,
-0x74,0xff,0x98,0x8b,0x75,0xff,0x98,0x8b,0x74,0xff,0x98,0x8c,0x75,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x05,0x05,0x05,0xff,0x05,0x05,0x05,0xff,0x16,0x16,
-0x16,0xff,0x09,0x09,0x09,0xff,0x03,0x03,0x03,0xff,0x13,0x13,0x13,0xff,0x16,0x16,
-0x16,0xff,0x16,0x16,0x16,0xff,0x04,0x04,0x04,0xff,0x08,0x08,0x08,0xff,0x07,0x07,
-0x07,0xff,0x08,0x08,0x08,0xff,0x0a,0x0a,0x0a,0xff,0x12,0x11,0x11,0xff,0x2d,0x2a,
-0x25,0xff,0x24,0x21,0x1d,0xff,0x2c,0x28,0x22,0xff,0x0b,0x0a,0x09,0xff,0x03,0x03,
-0x03,0xff,0x03,0x03,0x03,0xff,0x02,0x02,0x02,0xff,0x0d,0x0d,0x0d,0xff,0x06,0x06,
-0x06,0xff,0x10,0x10,0x10,0xff,0x12,0x12,0x12,0xff,0x0e,0x0e,0x0e,0xff,0x14,0x14,
-0x14,0xff,0x20,0x20,0x20,0xff,0x11,0x11,0x11,0xff,0x08,0x08,0x08,0xff,0x0d,0x0d,
-0x0d,0xff,0x0e,0x0e,0x0e,0xff,0x27,0x27,0x27,0xff,0x0c,0x0c,0x0c,0xff,0x16,0x16,
-0x16,0xff,0x1a,0x1a,0x1a,0xff,0x06,0x06,0x06,0xff,0x05,0x05,0x05,0xff,0x13,0x13,
-0x13,0xff,0x06,0x06,0x06,0xff,0x07,0x07,0x07,0xff,0x12,0x12,0x12,0xff,0x13,0x13,
-0x12,0xff,0x1e,0x19,0x14,0xff,0x23,0x1d,0x15,0xff,0x22,0x1f,0x19,0xff,0x1d,0x1c,
-0x1b,0xff,0x18,0x18,0x18,0xff,0x0d,0x0d,0x0d,0xff,0x0f,0x0f,0x0f,0xff,0x07,0x07,
-0x07,0xff,0x17,0x17,0x17,0xff,0x0f,0x0f,0x0f,0xff,0x1e,0x1e,0x1e,0xff,0x07,0x07,
-0x07,0xff,0x00,0x00,0x00,0xff,0x09,0x09,0x09,0xff,0x08,0x08,0x08,0xff,0x12,0x12,
-0x12,0xff,0x22,0x22,0x22,0xff,0x1a,0x1a,0x1a,0xff,0x05,0x05,0x05,0xff,0x11,0x11,
-0x11,0xff,0x13,0x13,0x13,0xff,0x05,0x05,0x05,0xff,0x05,0x05,0x05,0xff,0xff,0xff,
-0xff,0x00,0x68,0x5e,0x4f,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5f,
-0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x68,0x5e,
-0x4f,0xff,0x68,0x5e,0x4f,0xff,0x68,0x5e,0x4f,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,
-0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5f,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0x86,0x7b,
-0x68,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x68,0x5e,0x4f,0xff,0x86,0x7b,0x68,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x9e,0x92,0x7a,0xff,0x9d,0x90,
-0x78,0xff,0x9e,0x90,0x78,0xff,0x9e,0x8f,0x78,0xff,0x9e,0x8f,0x78,0xff,0x9e,0x8f,
-0x78,0xff,0x9e,0x90,0x78,0xff,0x9d,0x90,0x78,0xff,0x9d,0x90,0x78,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x09,0x09,
-0x09,0xff,0x10,0x10,0x10,0xff,0x08,0x08,0x08,0xff,0x14,0x14,0x14,0xff,0x0b,0x0b,
-0x0b,0xff,0x11,0x11,0x11,0xff,0x08,0x08,0x08,0xff,0x02,0x02,0x02,0xff,0x01,0x01,
-0x01,0xff,0x01,0x01,0x01,0xff,0x0a,0x0a,0x0a,0xff,0x22,0x21,0x21,0xff,0x3a,0x37,
-0x32,0xff,0x2b,0x27,0x21,0xff,0x22,0x1f,0x18,0xff,0x0e,0x0d,0x0c,0xff,0x0d,0x0d,
-0x0d,0xff,0x07,0x07,0x07,0xff,0x06,0x06,0x06,0xff,0x19,0x19,0x19,0xff,0x06,0x06,
-0x06,0xff,0x04,0x04,0x04,0xff,0x03,0x03,0x03,0xff,0x02,0x02,0x02,0xff,0x03,0x03,
-0x03,0xff,0x0d,0x0d,0x0d,0xff,0x13,0x13,0x13,0xff,0x10,0x10,0x10,0xff,0x05,0x05,
-0x05,0xff,0x05,0x05,0x05,0xff,0x08,0x08,0x08,0xff,0x00,0x00,0x00,0xff,0x04,0x04,
-0x04,0xff,0x06,0x06,0x06,0xff,0x04,0x04,0x04,0xff,0x0c,0x0c,0x0c,0xff,0x0b,0x0b,
-0x0b,0xff,0x04,0x04,0x04,0xff,0x10,0x10,0x10,0xff,0x1b,0x1a,0x1a,0xff,0x42,0x3f,
-0x3c,0xff,0x2b,0x25,0x1d,0xff,0x22,0x1d,0x16,0xff,0x09,0x08,0x07,0xff,0x07,0x07,
-0x06,0xff,0x04,0x04,0x04,0xff,0x01,0x01,0x01,0xff,0x0c,0x0c,0x0c,0xff,0x0a,0x0a,
-0x0a,0xff,0x1e,0x1e,0x1e,0xff,0x09,0x09,0x09,0xff,0x15,0x15,0x15,0xff,0x02,0x02,
-0x02,0xff,0x06,0x06,0x06,0xff,0x15,0x15,0x15,0xff,0x23,0x23,0x23,0xff,0x18,0x18,
-0x18,0xff,0x16,0x16,0x16,0xff,0x07,0x07,0x07,0xff,0x07,0x07,0x07,0xff,0x1c,0x1c,
-0x1c,0xff,0x11,0x11,0x11,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0x7f,0x74,0x61,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0x7f,0x74,
-0x61,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,
-0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x68,0x5e,0x4f,0xff,0x7f,0x74,0x61,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xa2,0x96,0x80,0xff,0xa2,0x94,
-0x7c,0xff,0xa3,0x94,0x7c,0xff,0xa3,0x94,0x7b,0xff,0xa2,0x94,0x7c,0xff,0xa3,0x94,
-0x7b,0xff,0xa3,0x94,0x7c,0xff,0xa2,0x94,0x7c,0xff,0xa2,0x94,0x7c,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x08,0x08,0x08,0xff,0x03,0x03,0x03,0xff,0x05,0x05,
-0x05,0xff,0x07,0x07,0x07,0xff,0x00,0x00,0x00,0xff,0x06,0x06,0x06,0xff,0x02,0x02,
-0x02,0xff,0x07,0x07,0x07,0xff,0x10,0x10,0x10,0xff,0x05,0x05,0x05,0xff,0x02,0x02,
-0x02,0xff,0x09,0x09,0x09,0xff,0x17,0x17,0x17,0xff,0x29,0x29,0x29,0xff,0x1a,0x18,
-0x14,0xff,0x1f,0x1b,0x14,0xff,0x2d,0x2a,0x23,0xff,0x14,0x13,0x12,0xff,0x0f,0x0f,
-0x0f,0xff,0x0f,0x0f,0x0f,0xff,0x04,0x04,0x04,0xff,0x06,0x06,0x06,0xff,0x01,0x01,
-0x01,0xff,0x01,0x01,0x01,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x03,0x03,
-0x03,0xff,0x15,0x15,0x15,0xff,0x1c,0x1c,0x1c,0xff,0x1a,0x1a,0x1a,0xff,0x0f,0x0f,
-0x0f,0xff,0x14,0x14,0x14,0xff,0x08,0x08,0x08,0xff,0x00,0x00,0x00,0xff,0x06,0x06,
-0x06,0xff,0x00,0x00,0x00,0xff,0x0b,0x0b,0x0b,0xff,0x23,0x23,0x23,0xff,0x0f,0x0f,
-0x0f,0xff,0x05,0x05,0x05,0xff,0x1b,0x1b,0x1b,0xff,0x2d,0x2c,0x2a,0xff,0x54,0x50,
-0x4a,0xff,0x26,0x21,0x1b,0xff,0x2e,0x2a,0x25,0xff,0x0a,0x09,0x08,0xff,0x00,0x00,
-0x00,0xff,0x01,0x01,0x01,0xff,0x08,0x08,0x08,0xff,0x26,0x26,0x26,0xff,0x16,0x16,
-0x16,0xff,0x0a,0x0a,0x0a,0xff,0x0a,0x0a,0x0a,0xff,0x19,0x19,0x19,0xff,0x08,0x08,
-0x08,0xff,0x09,0x09,0x09,0xff,0x0d,0x0d,0x0d,0xff,0x26,0x26,0x26,0xff,0x1c,0x1c,
-0x1c,0xff,0x22,0x22,0x22,0xff,0x06,0x06,0x06,0xff,0x03,0x03,0x03,0xff,0x0f,0x0f,
-0x0f,0xff,0x1a,0x1a,0x1a,0xff,0x08,0x08,0x08,0xff,0x03,0x03,0x03,0xff,0xff,0xff,
-0xff,0x00,0x96,0x8a,0x73,0xff,0x68,0x5e,0x4f,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x68,0x5e,0x4f,0xff,0x97,0x8a,0x73,0xff,0x97,0x89,0x73,0xff,0x68,0x5e,
-0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,
-0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0x97,0x8a,
-0x73,0xff,0x97,0x89,0x73,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0xb9,0xa9,0x8d,0xff,0x86,0x7b,0x68,0xff,0x68,0x5e,0x4f,0xff,0x68,0x5e,
-0x4f,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,
-0x8d,0xff,0x68,0x5e,0x4f,0xff,0x68,0x5e,0x4f,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xa6,0x9b,0x86,0xff,0xa7,0x99,
-0x80,0xff,0xa7,0x99,0x7f,0xff,0xa7,0x99,0x7f,0xff,0xa7,0x99,0x7f,0xff,0xa7,0x99,
-0x7f,0xff,0xa7,0x99,0x7f,0xff,0xa7,0x99,0x80,0xff,0xa6,0x98,0x81,0xfe,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x13,0x13,0x13,0xff,0x16,0x16,0x16,0xff,0x1c,0x1c,
-0x1c,0xff,0x17,0x17,0x17,0xff,0x05,0x05,0x05,0xff,0x08,0x08,0x08,0xff,0x07,0x07,
-0x07,0xff,0x05,0x05,0x05,0xff,0x04,0x04,0x04,0xff,0x02,0x02,0x02,0xff,0x0d,0x0d,
-0x0d,0xff,0x18,0x18,0x18,0xff,0x12,0x12,0x12,0xff,0x26,0x26,0x26,0xff,0x1a,0x18,
-0x15,0xff,0x37,0x32,0x2b,0xff,0x4b,0x46,0x3e,0xff,0x21,0x1f,0x1d,0xff,0x19,0x18,
-0x18,0xff,0x09,0x09,0x09,0xff,0x01,0x01,0x01,0xff,0x01,0x01,0x01,0xff,0x04,0x04,
-0x04,0xff,0x05,0x05,0x05,0xff,0x00,0x00,0x00,0xff,0x01,0x01,0x01,0xff,0x0e,0x0e,
-0x0e,0xff,0x17,0x17,0x17,0xff,0x0a,0x0a,0x0a,0xff,0x16,0x16,0x16,0xff,0x16,0x16,
-0x16,0xff,0x0f,0x0f,0x0f,0xff,0x0e,0x0e,0x0e,0xff,0x07,0x07,0x07,0xff,0x11,0x11,
-0x11,0xff,0x07,0x07,0x07,0xff,0x14,0x14,0x14,0xff,0x24,0x24,0x24,0xff,0x1e,0x1e,
-0x1e,0xff,0x0b,0x0b,0x0b,0xff,0x09,0x09,0x09,0xff,0x21,0x21,0x1f,0xff,0x40,0x3c,
-0x36,0xff,0x12,0x10,0x0d,0xff,0x1d,0x1a,0x17,0xff,0x08,0x07,0x07,0xff,0x02,0x02,
-0x02,0xff,0x05,0x05,0x05,0xff,0x09,0x09,0x09,0xff,0x12,0x12,0x12,0xff,0x0c,0x0c,
-0x0c,0xff,0x04,0x04,0x04,0xff,0x15,0x15,0x15,0xff,0x0a,0x0a,0x0a,0xff,0x01,0x01,
-0x01,0xff,0x02,0x02,0x02,0xff,0x05,0x05,0x05,0xff,0x18,0x18,0x18,0xff,0x0d,0x0d,
-0x0d,0xff,0x1e,0x1e,0x1e,0xff,0x09,0x09,0x09,0xff,0x0d,0x0d,0x0d,0xff,0x1a,0x1a,
-0x1a,0xff,0x24,0x24,0x24,0xff,0x13,0x13,0x13,0xff,0x16,0x16,0x16,0xff,0xff,0xff,
-0xff,0x00,0x68,0x5e,0x4f,0xff,0xab,0x9c,0x83,0xff,0x68,0x5e,0x4f,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0xab,0x9d,
-0x83,0xff,0xab,0x9c,0x83,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,
-0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x68,0x5e,0x4f,0xff,0xab,0x9d,0x83,0xff,0xab,0x9c,0x83,0xff,0x68,0x5e,
-0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0xb9,0xa9,0x8d,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xa9,0x9e,0x8b,0xff,0xac,0x9d,
-0x83,0xff,0xac,0x9d,0x84,0xff,0xac,0x9d,0x84,0xff,0xac,0x9d,0x84,0xff,0xac,0x9d,
-0x84,0xff,0xac,0x9d,0x84,0xff,0xac,0x9d,0x83,0xff,0xad,0x9f,0x85,0xfc,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x08,0x08,0x08,0xff,0x11,0x11,0x11,0xff,0x0d,0x0d,
-0x0d,0xff,0x15,0x15,0x15,0xff,0x05,0x05,0x05,0xff,0x07,0x07,0x07,0xff,0x07,0x07,
-0x07,0xff,0x0c,0x0c,0x0c,0xff,0x03,0x03,0x03,0xff,0x04,0x04,0x04,0xff,0x0d,0x0d,
-0x0d,0xff,0x1c,0x1c,0x1c,0xff,0x17,0x17,0x17,0xff,0x2b,0x2b,0x2b,0xff,0x2e,0x2d,
-0x2b,0xff,0x47,0x42,0x3a,0xff,0x54,0x4f,0x47,0xff,0x21,0x1e,0x1c,0xff,0x0b,0x0b,
-0x0b,0xff,0x01,0x01,0x01,0xff,0x0b,0x0b,0x0b,0xff,0x0b,0x0b,0x0b,0xff,0x15,0x15,
-0x15,0xff,0x19,0x19,0x19,0xff,0x08,0x08,0x08,0xff,0x13,0x13,0x13,0xff,0x2b,0x2b,
-0x2b,0xff,0x12,0x12,0x12,0xff,0x09,0x09,0x09,0xff,0x20,0x20,0x20,0xff,0x19,0x19,
-0x19,0xff,0x11,0x11,0x11,0xff,0x15,0x15,0x15,0xff,0x03,0x03,0x03,0xff,0x04,0x04,
-0x04,0xff,0x03,0x03,0x03,0xff,0x12,0x12,0x12,0xff,0x08,0x08,0x08,0xff,0x0b,0x0b,
-0x0b,0xff,0x16,0x16,0x16,0xff,0x0b,0x0b,0x0b,0xff,0x26,0x24,0x21,0xff,0x2c,0x29,
-0x23,0xff,0x0a,0x08,0x06,0xff,0x08,0x06,0x05,0xff,0x01,0x01,0x01,0xff,0x00,0x00,
-0x00,0xff,0x07,0x07,0x07,0xff,0x15,0x15,0x15,0xff,0x0f,0x0f,0x0f,0xff,0x19,0x19,
-0x19,0xff,0x09,0x09,0x09,0xff,0x10,0x10,0x10,0xff,0x04,0x04,0x04,0xff,0x07,0x07,
-0x07,0xff,0x06,0x06,0x06,0xff,0x0d,0x0d,0x0d,0xff,0x18,0x18,0x18,0xff,0x04,0x04,
-0x04,0xff,0x06,0x06,0x06,0xff,0x00,0x00,0x00,0xff,0x0a,0x0a,0x0a,0xff,0x2a,0x2a,
-0x2a,0xff,0x22,0x22,0x22,0xff,0x08,0x08,0x08,0xff,0x11,0x11,0x11,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,
-0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,
-0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0xb9,0xa9,0x8d,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x68,0x5e,
-0x4f,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,0x4f,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xa9,0xa0,0x8f,0xff,0xb0,0xa2,
-0x87,0xff,0xb1,0xa1,0x87,0xff,0xb1,0xa2,0x86,0xff,0xb1,0xa1,0x87,0xff,0xb1,0xa2,
-0x86,0xff,0xb1,0xa1,0x87,0xff,0xb0,0xa2,0x87,0xff,0xb1,0xa2,0x8a,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x05,0x05,0x05,0xff,0x0a,0x0a,0x0a,0xff,0x06,0x06,
-0x05,0xff,0x05,0x05,0x05,0xff,0x05,0x04,0x04,0xff,0x0d,0x0d,0x0d,0xff,0x0e,0x0e,
-0x0d,0xff,0x05,0x05,0x05,0xff,0x06,0x06,0x06,0xff,0x0a,0x0a,0x0a,0xff,0x05,0x05,
-0x05,0xff,0x08,0x08,0x08,0xff,0x06,0x06,0x06,0xff,0x0c,0x0c,0x0c,0xff,0x0c,0x0c,
-0x0a,0xff,0x2a,0x26,0x1f,0xff,0x46,0x41,0x39,0xff,0x2d,0x2b,0x26,0xff,0x12,0x12,
-0x11,0xff,0x0f,0x0f,0x0f,0xff,0x16,0x16,0x16,0xff,0x0d,0x0d,0x0d,0xff,0x08,0x08,
-0x08,0xff,0x17,0x17,0x17,0xff,0x1a,0x1a,0x1a,0xff,0x29,0x29,0x29,0xff,0x21,0x21,
-0x21,0xff,0x0e,0x0e,0x0e,0xff,0x02,0x02,0x02,0xff,0x11,0x11,0x11,0xff,0x2a,0x2a,
-0x2a,0xff,0x24,0x24,0x24,0xff,0x14,0x14,0x14,0xff,0x03,0x03,0x03,0xff,0x00,0x00,
-0x00,0xff,0x02,0x02,0x02,0xff,0x0d,0x0d,0x0d,0xff,0x03,0x03,0x03,0xff,0x04,0x04,
-0x04,0xff,0x11,0x11,0x11,0xff,0x1a,0x19,0x18,0xff,0x43,0x40,0x3a,0xff,0x24,0x22,
-0x1e,0xff,0x07,0x06,0x06,0xff,0x03,0x03,0x02,0xff,0x01,0x01,0x01,0xff,0x00,0x00,
-0x00,0xff,0x03,0x03,0x03,0xff,0x10,0x10,0x10,0xff,0x08,0x08,0x08,0xff,0x0a,0x0a,
-0x0a,0xff,0x00,0x00,0x00,0xff,0x08,0x08,0x08,0xff,0x01,0x01,0x01,0xff,0x09,0x09,
-0x09,0xff,0x12,0x12,0x12,0xff,0x14,0x14,0x14,0xff,0x12,0x12,0x12,0xff,0x02,0x02,
-0x02,0xff,0x00,0x00,0x00,0xff,0x03,0x03,0x03,0xff,0x06,0x06,0x06,0xff,0x1f,0x1f,
-0x1f,0xff,0x0e,0x0e,0x0e,0xff,0x05,0x05,0x05,0xff,0x0a,0x0a,0x0a,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x68,0x5e,0x4f,0xff,0x68,0x5e,
-0x4f,0xff,0x68,0x5e,0x4f,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0xb9,0xa9,0x8d,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xa7,0x9e,0x90,0xff,0xb5,0xa5,
-0x8b,0xff,0xb5,0xa5,0x8a,0xff,0xb5,0xa6,0x8b,0xff,0xb6,0xa6,0x8b,0xff,0xb5,0xa6,
-0x8b,0xff,0xb5,0xa5,0x8a,0xff,0xb5,0xa5,0x8b,0xff,0xb5,0xa5,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x24,0x22,0x20,0xff,0x0b,0x0a,0x09,0xff,0x0d,0x0c,
-0x0a,0xff,0x08,0x07,0x06,0xff,0x09,0x08,0x06,0xff,0x0a,0x09,0x08,0xff,0x18,0x17,
-0x16,0xff,0x14,0x13,0x12,0xff,0x16,0x15,0x13,0xff,0x0e,0x0d,0x0c,0xff,0x02,0x01,
-0x00,0xff,0x04,0x04,0x03,0xff,0x06,0x06,0x06,0xff,0x16,0x16,0x15,0xff,0x0c,0x0c,
-0x0a,0xff,0x33,0x2f,0x29,0xff,0x4f,0x4a,0x42,0xff,0x3d,0x3a,0x35,0xff,0x14,0x13,
-0x13,0xff,0x1e,0x1e,0x1e,0xff,0x0f,0x0f,0x0f,0xff,0x08,0x08,0x08,0xff,0x06,0x06,
-0x06,0xff,0x17,0x17,0x17,0xff,0x21,0x21,0x21,0xff,0x24,0x24,0x24,0xff,0x12,0x12,
-0x12,0xff,0x18,0x18,0x18,0xff,0x10,0x10,0x10,0xff,0x01,0x01,0x01,0xff,0x13,0x13,
-0x13,0xff,0x08,0x08,0x08,0xff,0x08,0x08,0x08,0xff,0x01,0x01,0x01,0xff,0x04,0x04,
-0x04,0xff,0x02,0x02,0x02,0xff,0x0f,0x0f,0x0f,0xff,0x07,0x07,0x07,0xff,0x06,0x06,
-0x06,0xff,0x06,0x06,0x06,0xff,0x19,0x18,0x17,0xff,0x19,0x15,0x11,0xff,0x0a,0x08,
-0x06,0xff,0x02,0x02,0x02,0xff,0x01,0x01,0x01,0xff,0x05,0x05,0x05,0xff,0x04,0x04,
-0x03,0xff,0x0c,0x0c,0x0c,0xff,0x17,0x17,0x17,0xff,0x07,0x07,0x07,0xff,0x0f,0x0f,
-0x0e,0xff,0x0c,0x0c,0x0b,0xff,0x14,0x13,0x13,0xff,0x0a,0x0a,0x09,0xff,0x06,0x06,
-0x05,0xff,0x08,0x08,0x07,0xff,0x09,0x08,0x08,0xff,0x12,0x11,0x10,0xff,0x0a,0x09,
-0x09,0xff,0x0b,0x0b,0x0a,0xff,0x14,0x13,0x12,0xff,0x06,0x06,0x05,0xff,0x0b,0x0b,
-0x0a,0xff,0x1e,0x1d,0x1b,0xff,0x24,0x22,0x20,0xff,0x0b,0x0a,0x09,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x86,0x7b,
-0x68,0xff,0xb9,0xa9,0x8d,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x68,0x5e,
-0x4f,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xa0,0x9a,0x8e,0xff,0xb9,0xa9,
-0x8e,0xff,0xba,0xa9,0x8e,0xff,0xb9,0xa9,0x8e,0xff,0xba,0xaa,0x8e,0xff,0xb9,0xa9,
-0x8e,0xff,0xba,0xa9,0x8e,0xff,0xb9,0xa9,0x8e,0xff,0xb6,0xa9,0x91,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x3d,0x39,0x33,0xff,0x34,0x31,0x2b,0xff,0x2d,0x29,
-0x23,0xff,0x22,0x1e,0x18,0xff,0x1c,0x18,0x12,0xff,0x19,0x15,0x10,0xff,0x2d,0x2a,
-0x24,0xff,0x46,0x42,0x3c,0xff,0x36,0x33,0x2c,0xff,0x29,0x26,0x20,0xff,0x14,0x10,
-0x0b,0xff,0x19,0x15,0x11,0xff,0x11,0x0e,0x0c,0xff,0x1f,0x1d,0x19,0xff,0x27,0x25,
-0x20,0xff,0x4e,0x49,0x41,0xff,0x47,0x41,0x38,0xff,0x3f,0x3b,0x34,0xff,0x0e,0x0d,
-0x0b,0xff,0x0d,0x0d,0x0c,0xff,0x10,0x0f,0x0e,0xff,0x08,0x08,0x07,0xff,0x13,0x13,
-0x12,0xff,0x27,0x27,0x26,0xff,0x1c,0x1c,0x1c,0xff,0x0d,0x0d,0x0d,0xff,0x0a,0x0a,
-0x0a,0xff,0x12,0x12,0x12,0xff,0x1b,0x1b,0x1b,0xff,0x10,0x10,0x10,0xff,0x2c,0x2c,
-0x2c,0xff,0x0e,0x0e,0x0e,0xff,0x09,0x09,0x09,0xff,0x07,0x07,0x07,0xff,0x11,0x11,
-0x11,0xff,0x08,0x08,0x08,0xff,0x13,0x13,0x13,0xff,0x07,0x07,0x07,0xff,0x09,0x09,
-0x09,0xff,0x12,0x11,0x11,0xff,0x33,0x32,0x2f,0xff,0x19,0x17,0x15,0xff,0x05,0x05,
-0x05,0xff,0x08,0x07,0x07,0xff,0x04,0x04,0x03,0xff,0x11,0x11,0x10,0xff,0x0e,0x0d,
-0x0d,0xff,0x22,0x20,0x1f,0xff,0x32,0x31,0x2f,0xff,0x10,0x0f,0x0d,0xff,0x1f,0x1d,
-0x1a,0xff,0x1c,0x19,0x16,0xff,0x14,0x11,0x0d,0xff,0x29,0x27,0x22,0xff,0x2b,0x28,
-0x24,0xff,0x21,0x1e,0x1a,0xff,0x1f,0x1a,0x15,0xff,0x38,0x33,0x2e,0xff,0x36,0x31,
-0x2c,0xff,0x3e,0x39,0x34,0xff,0x2f,0x2c,0x26,0xff,0x22,0x1e,0x17,0xff,0x1b,0x17,
-0x12,0xff,0x48,0x44,0x3e,0xff,0x3d,0x39,0x33,0xff,0x34,0x31,0x2b,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x86,0x7b,
-0x68,0xff,0xb9,0xa9,0x8d,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x68,0x5e,
-0x4f,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,0x4f,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x97,0x92,0x89,0xff,0xbe,0xae,
-0x91,0xff,0xbe,0xae,0x91,0xff,0xbe,0xad,0x90,0xff,0xbe,0xad,0x91,0xff,0xbe,0xad,
-0x90,0xff,0xbe,0xae,0x91,0xff,0xbe,0xae,0x91,0xff,0xb5,0xa9,0x96,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x55,0x4f,0x46,0xff,0x52,0x4c,0x43,0xff,0x58,0x52,
-0x49,0xff,0x54,0x4f,0x46,0xff,0x5f,0x59,0x4f,0xff,0x5d,0x57,0x4e,0xff,0x53,0x4d,
-0x44,0xff,0x59,0x54,0x4a,0xff,0x3d,0x38,0x30,0xff,0x38,0x32,0x29,0xff,0x28,0x22,
-0x1a,0xff,0x41,0x3b,0x33,0xff,0x3f,0x39,0x32,0xff,0x47,0x43,0x3a,0xff,0x42,0x3e,
-0x37,0xff,0x4a,0x44,0x39,0xff,0x57,0x50,0x44,0xff,0x68,0x62,0x58,0xff,0x3f,0x3b,
-0x34,0xff,0x32,0x2e,0x29,0xff,0x44,0x41,0x3c,0xff,0x31,0x2e,0x2a,0xff,0x28,0x25,
-0x22,0xff,0x26,0x24,0x22,0xff,0x12,0x12,0x11,0xff,0x06,0x06,0x05,0xff,0x08,0x07,
-0x07,0xff,0x12,0x12,0x12,0xff,0x0a,0x0a,0x0a,0xff,0x05,0x05,0x05,0xff,0x1e,0x1e,
-0x1e,0xff,0x10,0x10,0x10,0xff,0x0a,0x0a,0x0a,0xff,0x08,0x08,0x08,0xff,0x06,0x06,
-0x06,0xff,0x00,0x00,0x00,0xff,0x04,0x04,0x04,0xff,0x04,0x04,0x04,0xff,0x08,0x08,
-0x08,0xff,0x17,0x17,0x16,0xff,0x3d,0x39,0x34,0xff,0x36,0x33,0x2f,0xff,0x14,0x13,
-0x11,0xff,0x1b,0x1a,0x17,0xff,0x10,0x0e,0x0a,0xff,0x20,0x1e,0x1b,0xff,0x17,0x15,
-0x13,0xff,0x36,0x33,0x2e,0xff,0x41,0x3d,0x36,0xff,0x25,0x21,0x1b,0xff,0x2b,0x26,
-0x1f,0xff,0x2c,0x27,0x20,0xff,0x27,0x22,0x1a,0xff,0x56,0x51,0x48,0xff,0x57,0x52,
-0x4a,0xff,0x34,0x2f,0x26,0xff,0x2f,0x29,0x21,0xff,0x52,0x4c,0x44,0xff,0x44,0x3e,
-0x36,0xff,0x4a,0x44,0x3c,0xff,0x2e,0x29,0x23,0xff,0x3a,0x35,0x2d,0xff,0x1b,0x15,
-0x11,0xff,0x3a,0x34,0x2d,0xff,0x55,0x4f,0x46,0xff,0x52,0x4c,0x43,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x68,0x5e,0x4f,0xff,0xab,0x9d,0x82,0xff,0xab,0x9d,0x82,0xff,0x68,0x5e,
-0x4f,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,
-0x4f,0xff,0xab,0x9c,0x83,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x86,0x7b,
-0x68,0xff,0xb9,0xa9,0x8d,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x68,0x5e,
-0x4f,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,0x4f,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x8b,0x88,0x81,0xff,0xc2,0xb2,
-0x94,0xff,0xc2,0xb1,0x94,0xff,0xc2,0xb2,0x94,0xff,0xc2,0xb1,0x94,0xff,0xc2,0xb2,
-0x94,0xff,0xc2,0xb1,0x94,0xff,0xc2,0xb2,0x94,0xff,0xb1,0xa8,0x97,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x2d,0x29,0x24,0xff,0x40,0x3d,0x37,0xff,0x45,0x41,
-0x3c,0xff,0x3a,0x36,0x30,0xff,0x37,0x33,0x2d,0xff,0x3d,0x39,0x33,0xff,0x36,0x32,
-0x2c,0xff,0x1f,0x1c,0x16,0xff,0x12,0x10,0x0d,0xff,0x2a,0x26,0x20,0xff,0x28,0x24,
-0x1d,0xff,0x43,0x3e,0x37,0xff,0x3b,0x37,0x2f,0xff,0x25,0x22,0x1b,0xff,0x1b,0x19,
-0x15,0xff,0x3a,0x35,0x2c,0xff,0x5f,0x57,0x4b,0xff,0x56,0x4e,0x43,0xff,0x60,0x5a,
-0x51,0xff,0x53,0x4d,0x45,0xff,0x53,0x4e,0x46,0xff,0x5e,0x59,0x51,0xff,0x3e,0x39,
-0x32,0xff,0x34,0x30,0x2a,0xff,0x35,0x31,0x2c,0xff,0x30,0x2d,0x29,0xff,0x17,0x14,
-0x11,0xff,0x21,0x1f,0x1e,0xff,0x0c,0x0b,0x0b,0xff,0x08,0x08,0x08,0xff,0x0f,0x0f,
-0x0f,0xff,0x1c,0x1c,0x1c,0xff,0x09,0x09,0x09,0xff,0x07,0x07,0x07,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x07,0x07,0x07,0xff,0x0f,0x0f,0x0f,0xff,0x04,0x04,
-0x04,0xff,0x15,0x14,0x13,0xff,0x56,0x51,0x4a,0xff,0x3e,0x39,0x32,0xff,0x21,0x1d,
-0x17,0xff,0x2c,0x28,0x21,0xff,0x22,0x1d,0x16,0xff,0x36,0x31,0x2a,0xff,0x40,0x3b,
-0x33,0xff,0x5e,0x59,0x50,0xff,0x46,0x40,0x37,0xff,0x43,0x3d,0x34,0xff,0x38,0x32,
-0x29,0xff,0x39,0x34,0x2c,0xff,0x3b,0x36,0x2d,0xff,0x44,0x3f,0x37,0xff,0x48,0x43,
-0x3b,0xff,0x2d,0x29,0x22,0xff,0x25,0x21,0x1a,0xff,0x38,0x34,0x2d,0xff,0x32,0x2e,
-0x27,0xff,0x3a,0x36,0x30,0xff,0x39,0x36,0x30,0xff,0x40,0x3d,0x36,0xff,0x1b,0x18,
-0x12,0xff,0x1b,0x17,0x11,0xff,0x2d,0x29,0x24,0xff,0x40,0x3d,0x37,0xff,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x4d,0x45,0x3b,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x4d,0x45,0x3b,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x97,0x89,
-0x73,0xff,0x97,0x89,0x73,0xff,0x68,0x5e,0x4f,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x68,0x5e,0x4f,0xff,0x96,0x89,0x73,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x86,0x7b,
-0x68,0xff,0xb9,0xa9,0x8d,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x68,0x5e,
-0x4f,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,0x4f,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x7b,0x79,0x75,0xff,0xc6,0xb5,
-0x97,0xff,0xc6,0xb5,0x96,0xff,0xc6,0xb5,0x97,0xff,0xc6,0xb5,0x97,0xff,0xc6,0xb5,
-0x97,0xff,0xc6,0xb5,0x96,0xff,0xc6,0xb5,0x97,0xff,0xa9,0xa1,0x94,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x08,0x07,0x07,0xff,0x0e,0x0d,0x0d,0xff,0x22,0x22,
-0x21,0xff,0x24,0x23,0x23,0xff,0x0e,0x0e,0x0d,0xff,0x0b,0x0a,0x09,0xff,0x0c,0x0b,
-0x0b,0xff,0x02,0x02,0x01,0xff,0x05,0x05,0x05,0xff,0x09,0x08,0x07,0xff,0x04,0x04,
-0x03,0xff,0x14,0x13,0x12,0xff,0x1f,0x1f,0x1d,0xff,0x19,0x18,0x16,0xff,0x0f,0x0e,
-0x0d,0xff,0x1e,0x1b,0x18,0xff,0x4c,0x47,0x3e,0xff,0x36,0x30,0x27,0xff,0x48,0x44,
-0x3f,0xff,0x2b,0x28,0x23,0xff,0x21,0x1d,0x18,0xff,0x3d,0x39,0x33,0xff,0x36,0x32,
-0x2b,0xff,0x41,0x3c,0x34,0xff,0x44,0x3e,0x36,0xff,0x43,0x3e,0x37,0xff,0x23,0x1e,
-0x17,0xff,0x31,0x2d,0x27,0xff,0x31,0x2e,0x2a,0xff,0x34,0x33,0x30,0xff,0x10,0x0f,
-0x0e,0xff,0x0a,0x09,0x09,0xff,0x06,0x06,0x06,0xff,0x18,0x18,0x18,0xff,0x06,0x06,
-0x06,0xff,0x03,0x03,0x03,0xff,0x10,0x0f,0x0f,0xff,0x0e,0x0e,0x0d,0xff,0x04,0x03,
-0x02,0xff,0x0d,0x0b,0x09,0xff,0x45,0x40,0x39,0xff,0x3e,0x39,0x30,0xff,0x3b,0x36,
-0x2d,0xff,0x3d,0x38,0x31,0xff,0x2e,0x2a,0x23,0xff,0x1d,0x19,0x13,0xff,0x1d,0x1a,
-0x14,0xff,0x3c,0x39,0x34,0xff,0x26,0x23,0x1f,0xff,0x34,0x32,0x2f,0xff,0x31,0x2f,
-0x2c,0xff,0x12,0x11,0x10,0xff,0x11,0x10,0x0e,0xff,0x13,0x12,0x11,0xff,0x15,0x14,
-0x13,0xff,0x0d,0x0d,0x0c,0xff,0x05,0x05,0x04,0xff,0x11,0x11,0x10,0xff,0x1d,0x1c,
-0x1b,0xff,0x23,0x23,0x22,0xff,0x13,0x12,0x11,0xff,0x0b,0x0b,0x0a,0xff,0x04,0x04,
-0x03,0xff,0x05,0x04,0x03,0xff,0x08,0x07,0x07,0xff,0x0e,0x0d,0x0d,0xff,0xff,0xff,
-0xff,0x00,0x56,0x4f,0x42,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x56,0x4f,
-0x42,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x7f,0x74,0x61,0xff,0x68,0x5e,
-0x4f,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x7f,0x74,0x61,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x86,0x7b,
-0x68,0xff,0xb9,0xa9,0x8d,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x68,0x5e,
-0x4f,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,0x4f,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x69,0x67,0x65,0xff,0xca,0xb8,
-0x99,0xff,0xc9,0xb8,0x9a,0xff,0xc9,0xb8,0x9a,0xff,0xc9,0xb8,0x99,0xff,0xc9,0xb8,
-0x9a,0xff,0xc9,0xb8,0x9a,0xff,0xca,0xb8,0x99,0xff,0x9b,0x96,0x8c,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x08,0x08,0x08,0xff,0x00,0x00,0x00,0xff,0x05,0x05,
-0x05,0xff,0x07,0x07,0x07,0xff,0x09,0x09,0x09,0xff,0x0e,0x0e,0x0e,0xff,0x0e,0x0e,
-0x0e,0xff,0x08,0x08,0x08,0xff,0x14,0x14,0x14,0xff,0x0a,0x0a,0x0a,0xff,0x0b,0x0b,
-0x0b,0xff,0x10,0x10,0x10,0xff,0x1a,0x1a,0x1a,0xff,0x24,0x24,0x24,0xff,0x1f,0x1e,
-0x1d,0xff,0x20,0x1e,0x1a,0xff,0x2b,0x27,0x1f,0xff,0x2b,0x27,0x1f,0xff,0x3d,0x3c,
-0x39,0xff,0x26,0x26,0x25,0xff,0x11,0x11,0x10,0xff,0x12,0x11,0x10,0xff,0x07,0x06,
-0x05,0xff,0x10,0x0f,0x0d,0xff,0x17,0x16,0x14,0xff,0x12,0x10,0x0e,0xff,0x13,0x10,
-0x0c,0xff,0x35,0x32,0x2c,0xff,0x42,0x3d,0x37,0xff,0x59,0x56,0x4e,0xff,0x25,0x23,
-0x1e,0xff,0x0f,0x0e,0x0c,0xff,0x07,0x07,0x06,0xff,0x0b,0x0b,0x0a,0xff,0x05,0x04,
-0x03,0xff,0x0a,0x09,0x08,0xff,0x24,0x23,0x20,0xff,0x27,0x24,0x1e,0xff,0x1c,0x18,
-0x11,0xff,0x10,0x0b,0x07,0xff,0x15,0x12,0x0f,0xff,0x0c,0x0b,0x09,0xff,0x17,0x15,
-0x13,0xff,0x1f,0x1d,0x1c,0xff,0x1a,0x1a,0x19,0xff,0x0e,0x0d,0x0c,0xff,0x0a,0x0a,
-0x09,0xff,0x0b,0x0b,0x0a,0xff,0x03,0x03,0x02,0xff,0x0e,0x0e,0x0d,0xff,0x1f,0x1f,
-0x1f,0xff,0x09,0x09,0x09,0xff,0x09,0x09,0x09,0xff,0x21,0x21,0x21,0xff,0x1a,0x1a,
-0x1a,0xff,0x13,0x13,0x13,0xff,0x0c,0x0c,0x0c,0xff,0x15,0x15,0x15,0xff,0x09,0x09,
-0x09,0xff,0x0a,0x0a,0x0a,0xff,0x06,0x06,0x06,0xff,0x05,0x05,0x05,0xff,0x05,0x05,
-0x05,0xff,0x03,0x03,0x03,0xff,0x08,0x08,0x08,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0x63,0x5b,0x4b,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x63,0x5b,
-0x4b,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5f,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x86,0x7b,
-0x68,0xff,0xb9,0xa9,0x8d,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x68,0x5e,
-0x4f,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,0x4f,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x53,0x53,0x51,0xff,0xcd,0xbb,
-0x9c,0xff,0xcd,0xbb,0x9c,0xff,0xcd,0xbb,0x9c,0xff,0xcd,0xbb,0x9c,0xff,0xcd,0xbb,
-0x9c,0xff,0xcd,0xbb,0x9c,0xff,0xcd,0xbb,0x9c,0xff,0x85,0x82,0x7d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x09,0x09,0x09,0xff,0x01,0x01,0x01,0xff,0x05,0x05,
-0x05,0xff,0x02,0x02,0x02,0xff,0x0f,0x0f,0x0f,0xff,0x0d,0x0d,0x0d,0xff,0x05,0x05,
-0x05,0xff,0x05,0x05,0x05,0xff,0x08,0x08,0x08,0xff,0x09,0x09,0x09,0xff,0x1c,0x1c,
-0x1c,0xff,0x0c,0x0c,0x0c,0xff,0x03,0x03,0x03,0xff,0x07,0x07,0x07,0xff,0x0b,0x0a,
-0x0a,0xff,0x15,0x13,0x10,0xff,0x17,0x14,0x10,0xff,0x37,0x32,0x2c,0xff,0x1a,0x19,
-0x17,0xff,0x06,0x06,0x06,0xff,0x0d,0x0d,0x0d,0xff,0x1d,0x1d,0x1d,0xff,0x06,0x06,
-0x06,0xff,0x07,0x07,0x07,0xff,0x06,0x06,0x06,0xff,0x03,0x03,0x03,0xff,0x0d,0x0d,
-0x0c,0xff,0x17,0x16,0x16,0xff,0x17,0x15,0x13,0xff,0x42,0x3f,0x37,0xff,0x2a,0x25,
-0x1c,0xff,0x1b,0x17,0x12,0xff,0x21,0x1e,0x1a,0xff,0x20,0x1d,0x17,0xff,0x25,0x21,
-0x1a,0xff,0x3d,0x38,0x31,0xff,0x4c,0x47,0x3f,0xff,0x27,0x24,0x1f,0xff,0x16,0x14,
-0x11,0xff,0x23,0x20,0x1b,0xff,0x26,0x22,0x1e,0xff,0x07,0x07,0x06,0xff,0x07,0x07,
-0x07,0xff,0x0c,0x0c,0x0c,0xff,0x07,0x07,0x07,0xff,0x09,0x09,0x09,0xff,0x1d,0x1d,
-0x1d,0xff,0x0f,0x0f,0x0f,0xff,0x02,0x02,0x02,0xff,0x01,0x01,0x01,0xff,0x0d,0x0d,
-0x0d,0xff,0x0c,0x0c,0x0c,0xff,0x05,0x05,0x05,0xff,0x15,0x15,0x15,0xff,0x06,0x06,
-0x06,0xff,0x07,0x07,0x07,0xff,0x0f,0x0f,0x0f,0xff,0x0c,0x0c,0x0c,0xff,0x04,0x04,
-0x04,0xff,0x14,0x14,0x14,0xff,0x18,0x18,0x18,0xff,0x10,0x10,0x10,0xff,0x12,0x12,
-0x12,0xff,0x0a,0x0a,0x0a,0xff,0x09,0x09,0x09,0xff,0x01,0x01,0x01,0xff,0xff,0xff,
-0xff,0x00,0x71,0x66,0x56,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x71,0x66,
-0x56,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,
-0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x53,0x4b,0x3f,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x53,0x4b,0x40,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x86,0x7b,
-0x68,0xff,0xb9,0xa9,0x8d,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x68,0x5e,
-0x4f,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,0x4f,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x3a,0x3a,0x3a,0xff,0xd0,0xbe,
-0x9f,0xff,0xd0,0xbe,0x9f,0xff,0xd0,0xbe,0x9f,0xff,0xd0,0xbf,0x9f,0xff,0xd0,0xbe,
-0x9f,0xff,0xd0,0xbe,0x9f,0xff,0xd0,0xbe,0x9f,0xff,0x65,0x64,0x61,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x0d,0x0d,0x0d,0xff,0x08,0x08,0x08,0xff,0x15,0x15,
-0x15,0xff,0x08,0x08,0x08,0xff,0x0d,0x0d,0x0d,0xff,0x05,0x05,0x05,0xff,0x09,0x09,
-0x09,0xff,0x19,0x19,0x19,0xff,0x19,0x19,0x19,0xff,0x07,0x07,0x07,0xff,0x0e,0x0e,
-0x0e,0xff,0x0c,0x0c,0x0c,0xff,0x02,0x02,0x02,0xff,0x03,0x03,0x03,0xff,0x01,0x01,
-0x01,0xff,0x0c,0x0a,0x08,0xff,0x1a,0x15,0x0e,0xff,0x3c,0x36,0x2e,0xff,0x1b,0x19,
-0x17,0xff,0x0d,0x0c,0x0c,0xff,0x15,0x15,0x15,0xff,0x22,0x22,0x22,0xff,0x0b,0x0b,
-0x0b,0xff,0x1d,0x1d,0x1d,0xff,0x0b,0x0b,0x0b,0xff,0x04,0x04,0x04,0xff,0x03,0x03,
-0x03,0xff,0x09,0x09,0x09,0xff,0x05,0x05,0x05,0xff,0x21,0x1f,0x1b,0xff,0x1e,0x19,
-0x13,0xff,0x1c,0x17,0x14,0xff,0x3d,0x39,0x32,0xff,0x37,0x32,0x29,0xff,0x3b,0x35,
-0x2c,0xff,0x52,0x4c,0x43,0xff,0x36,0x32,0x2c,0xff,0x0d,0x0c,0x0a,0xff,0x12,0x12,
-0x11,0xff,0x3d,0x39,0x34,0xff,0x29,0x26,0x21,0xff,0x0a,0x0a,0x09,0xff,0x23,0x23,
-0x23,0xff,0x27,0x27,0x27,0xff,0x1e,0x1e,0x1e,0xff,0x05,0x05,0x05,0xff,0x18,0x18,
-0x18,0xff,0x16,0x16,0x16,0xff,0x07,0x07,0x07,0xff,0x09,0x09,0x09,0xff,0x14,0x14,
-0x14,0xff,0x0b,0x0b,0x0b,0xff,0x09,0x09,0x09,0xff,0x1e,0x1e,0x1e,0xff,0x0b,0x0b,
-0x0b,0xff,0x04,0x04,0x04,0xff,0x16,0x16,0x16,0xff,0x13,0x13,0x13,0xff,0x04,0x04,
-0x04,0xff,0x04,0x04,0x04,0xff,0x05,0x05,0x05,0xff,0x04,0x04,0x04,0xff,0x06,0x06,
-0x06,0xff,0x07,0x07,0x07,0xff,0x0d,0x0d,0x0d,0xff,0x08,0x08,0x08,0xff,0xff,0xff,
-0xff,0x00,0x7f,0x74,0x61,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x7f,0x74,
-0x61,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0xb9,0xa9,
-0x8d,0xff,0x68,0x5e,0x4f,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,
-0x4f,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,
-0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x1c,0x19,0x15,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x1c,0x19,0x15,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x86,0x7b,
-0x68,0xff,0xb9,0xa9,0x8d,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x68,0x5e,
-0x4f,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,0x4f,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xfe,0xfe,0xfe,0x20,0xd4,0xc1,
-0xa1,0xff,0xd3,0xc1,0xa1,0xff,0xd3,0xc1,0xa1,0xff,0xd4,0xc1,0xa1,0xff,0xd3,0xc1,
-0xa1,0xff,0xd3,0xc1,0xa1,0xff,0xd4,0xc1,0xa1,0xff,0x3c,0x3b,0x3b,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x0d,0x0d,0x0d,0xff,0x04,0x04,0x04,0xff,0x05,0x05,
-0x05,0xff,0x00,0x00,0x00,0xff,0x03,0x03,0x03,0xff,0x05,0x05,0x05,0xff,0x0e,0x0e,
-0x0e,0xff,0x13,0x13,0x13,0xff,0x1a,0x1a,0x1a,0xff,0x0e,0x0e,0x0e,0xff,0x15,0x15,
-0x15,0xff,0x19,0x19,0x19,0xff,0x07,0x07,0x07,0xff,0x0c,0x0c,0x0c,0xff,0x08,0x08,
-0x08,0xff,0x1d,0x1b,0x18,0xff,0x39,0x34,0x2b,0xff,0x34,0x2e,0x26,0xff,0x21,0x1e,
-0x1b,0xff,0x15,0x14,0x14,0xff,0x16,0x16,0x16,0xff,0x1e,0x1e,0x1e,0xff,0x0b,0x0b,
-0x0b,0xff,0x1d,0x1d,0x1d,0xff,0x1c,0x1c,0x1c,0xff,0x17,0x17,0x17,0xff,0x08,0x08,
-0x08,0xff,0x15,0x15,0x15,0xff,0x09,0x09,0x09,0xff,0x0a,0x0a,0x09,0xff,0x23,0x21,
-0x1e,0xff,0x2c,0x28,0x24,0xff,0x46,0x41,0x3c,0xff,0x4a,0x46,0x3f,0xff,0x34,0x2f,
-0x29,0xff,0x24,0x20,0x1c,0xff,0x10,0x0e,0x0c,0xff,0x05,0x05,0x05,0xff,0x1b,0x1a,
-0x19,0xff,0x3b,0x37,0x31,0xff,0x10,0x0f,0x0d,0xff,0x09,0x09,0x09,0xff,0x29,0x29,
-0x29,0xff,0x19,0x19,0x19,0xff,0x23,0x23,0x23,0xff,0x11,0x11,0x11,0xff,0x29,0x29,
-0x29,0xff,0x1d,0x1d,0x1d,0xff,0x07,0x07,0x07,0xff,0x0c,0x0c,0x0c,0xff,0x1e,0x1e,
-0x1e,0xff,0x18,0x18,0x18,0xff,0x0d,0x0d,0x0d,0xff,0x0e,0x0e,0x0e,0xff,0x03,0x03,
-0x03,0xff,0x02,0x02,0x02,0xff,0x0e,0x0e,0x0e,0xff,0x0b,0x0b,0x0b,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x02,0x02,0x02,0xff,0x08,0x08,
-0x08,0xff,0x0f,0x0f,0x0f,0xff,0x0d,0x0d,0x0d,0xff,0x04,0x04,0x04,0xff,0xff,0xff,
-0xff,0x00,0x8e,0x81,0x6c,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x8e,0x81,
-0x6c,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x68,0x5e,
-0x4f,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x68,0x5e,0x4f,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,
-0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x86,0x7b,0x68,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x43,0x3e,0x34,0xff,0x6b,0x62,
-0x53,0xff,0x6a,0x62,0x53,0xff,0x43,0x3e,0x34,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x86,0x7b,
-0x68,0xff,0xb9,0xa9,0x8d,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x68,0x5e,
-0x4f,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,0x4f,0xff,0x45,0x3f,0x35,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x03,0xc2,0xb5,
-0xa1,0xff,0xd6,0xc4,0xa4,0xff,0xd6,0xc4,0xa3,0xff,0xd6,0xc4,0xa3,0xff,0xd6,0xc4,
-0xa3,0xff,0xd6,0xc4,0xa4,0xff,0xd4,0xc1,0xa4,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x26,0x26,0x26,0xff,0x0b,0x0b,0x0b,0xff,0x02,0x02,
-0x02,0xff,0x00,0x00,0x00,0xff,0x02,0x02,0x02,0xff,0x0a,0x0a,0x0a,0xff,0x09,0x09,
-0x09,0xff,0x10,0x10,0x10,0xff,0x0e,0x0e,0x0e,0xff,0x0a,0x0a,0x0a,0xff,0x0b,0x0b,
-0x0b,0xff,0x16,0x16,0x16,0xff,0x09,0x09,0x09,0xff,0x03,0x03,0x03,0xff,0x04,0x04,
-0x04,0xff,0x1a,0x19,0x17,0xff,0x3c,0x37,0x2e,0xff,0x2b,0x26,0x1d,0xff,0x33,0x31,
-0x2c,0xff,0x15,0x15,0x15,0xff,0x12,0x12,0x12,0xff,0x09,0x09,0x09,0xff,0x00,0x00,
-0x00,0xff,0x07,0x07,0x07,0xff,0x13,0x13,0x13,0xff,0x14,0x14,0x14,0xff,0x07,0x07,
-0x07,0xff,0x19,0x19,0x19,0xff,0x16,0x16,0x16,0xff,0x0b,0x0b,0x0b,0xff,0x14,0x14,
-0x13,0xff,0x12,0x11,0x10,0xff,0x20,0x1e,0x1c,0xff,0x1d,0x1c,0x19,0xff,0x0a,0x09,
-0x08,0xff,0x03,0x03,0x02,0xff,0x06,0x06,0x06,0xff,0x0a,0x0a,0x0a,0xff,0x1d,0x1c,
-0x1b,0xff,0x2b,0x27,0x20,0xff,0x05,0x04,0x03,0xff,0x01,0x01,0x01,0xff,0x0c,0x0c,
-0x0c,0xff,0x0a,0x0a,0x0a,0xff,0x1c,0x1c,0x1c,0xff,0x0b,0x0b,0x0b,0xff,0x10,0x10,
-0x10,0xff,0x11,0x11,0x11,0xff,0x08,0x08,0x08,0xff,0x03,0x03,0x03,0xff,0x05,0x05,
-0x05,0xff,0x04,0x04,0x04,0xff,0x07,0x07,0x07,0xff,0x1c,0x1c,0x1c,0xff,0x0d,0x0d,
-0x0d,0xff,0x08,0x08,0x08,0xff,0x13,0x13,0x13,0xff,0x17,0x17,0x17,0xff,0x07,0x07,
-0x07,0xff,0x00,0x00,0x00,0xff,0x02,0x02,0x02,0xff,0x01,0x01,0x01,0xff,0x03,0x03,
-0x03,0xff,0x0e,0x0e,0x0e,0xff,0x26,0x26,0x26,0xff,0x0b,0x0b,0x0b,0xff,0xff,0xff,
-0xff,0x00,0x9b,0x8d,0x76,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x9b,0x8d,
-0x76,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,
-0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x86,0x7b,
-0x68,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x43,0x3e,0x34,0xff,0x43,0x3d,
-0x34,0xff,0x45,0x3f,0x35,0xff,0x43,0x3d,0x34,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x86,0x7b,
-0x68,0xff,0xb9,0xa9,0x8d,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x68,0x5e,
-0x4f,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xa6,0x9f,
-0x94,0xff,0xd8,0xc6,0xa5,0xff,0xd8,0xc6,0xa5,0xff,0xd9,0xc6,0xa5,0xff,0xd8,0xc6,
-0xa5,0xff,0xd8,0xc6,0xa5,0xff,0xcb,0xbd,0xa4,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x08,0x08,0x08,0xff,0x06,0x06,0x06,0xff,0x02,0x02,
-0x02,0xff,0x00,0x00,0x00,0xff,0x08,0x08,0x08,0xff,0x16,0x16,0x16,0xff,0x04,0x04,
-0x04,0xff,0x06,0x06,0x06,0xff,0x06,0x06,0x06,0xff,0x05,0x05,0x05,0xff,0x03,0x03,
-0x03,0xff,0x0f,0x0f,0x0f,0xff,0x13,0x13,0x13,0xff,0x0b,0x0b,0x0b,0xff,0x19,0x19,
-0x19,0xff,0x38,0x36,0x34,0xff,0x57,0x51,0x48,0xff,0x33,0x2e,0x25,0xff,0x36,0x33,
-0x2f,0xff,0x1d,0x1d,0x1d,0xff,0x24,0x24,0x24,0xff,0x0d,0x0d,0x0d,0xff,0x01,0x01,
-0x01,0xff,0x02,0x02,0x02,0xff,0x09,0x09,0x09,0xff,0x05,0x05,0x05,0xff,0x01,0x01,
-0x01,0xff,0x10,0x10,0x10,0xff,0x0b,0x0b,0x0b,0xff,0x0f,0x0f,0x0f,0xff,0x06,0x06,
-0x06,0xff,0x06,0x06,0x06,0xff,0x1f,0x1e,0x1e,0xff,0x0f,0x0f,0x0e,0xff,0x02,0x02,
-0x02,0xff,0x04,0x04,0x04,0xff,0x15,0x15,0x15,0xff,0x19,0x19,0x19,0xff,0x13,0x12,
-0x11,0xff,0x2b,0x27,0x21,0xff,0x11,0x0e,0x0d,0xff,0x0a,0x09,0x09,0xff,0x0b,0x0b,
-0x0b,0xff,0x03,0x03,0x03,0xff,0x0c,0x0c,0x0c,0xff,0x0b,0x0b,0x0b,0xff,0x05,0x05,
-0x05,0xff,0x04,0x04,0x04,0xff,0x09,0x09,0x09,0xff,0x03,0x03,0x03,0xff,0x07,0x07,
-0x07,0xff,0x00,0x00,0x00,0xff,0x06,0x06,0x06,0xff,0x21,0x21,0x21,0xff,0x0b,0x0b,
-0x0b,0xff,0x0a,0x0a,0x0a,0xff,0x07,0x07,0x07,0xff,0x10,0x10,0x10,0xff,0x0c,0x0c,
-0x0c,0xff,0x06,0x06,0x06,0xff,0x07,0x07,0x07,0xff,0x05,0x05,0x05,0xff,0x08,0x08,
-0x08,0xff,0x05,0x05,0x05,0xff,0x08,0x08,0x08,0xff,0x06,0x06,0x06,0xff,0xff,0xff,
-0xff,0x00,0xa7,0x99,0x7f,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xa7,0x99,
-0x7f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,
-0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x1b,0x19,0x15,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x1b,0x19,0x15,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0xb9,0xa9,0x8d,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x83,0x80,
-0x7b,0xff,0xdb,0xc8,0xa7,0xff,0xdb,0xc8,0xa7,0xff,0xdb,0xc8,0xa7,0xff,0xdb,0xc8,
-0xa7,0xff,0xdb,0xc8,0xa7,0xff,0xb6,0xac,0x9d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x01,0x01,0x01,0xff,0x15,0x15,0x15,0xff,0x0d,0x0d,
-0x0d,0xff,0x07,0x07,0x07,0xff,0x16,0x16,0x16,0xff,0x1d,0x1d,0x1d,0xff,0x0b,0x0b,
-0x0b,0xff,0x03,0x03,0x03,0xff,0x05,0x05,0x05,0xff,0x09,0x09,0x09,0xff,0x0c,0x0c,
-0x0c,0xff,0x0e,0x0e,0x0e,0xff,0x0b,0x0b,0x0b,0xff,0x0c,0x0c,0x0c,0xff,0x08,0x08,
-0x08,0xff,0x20,0x1f,0x1d,0xff,0x5c,0x56,0x4e,0xff,0x30,0x2b,0x22,0xff,0x24,0x21,
-0x1d,0xff,0x12,0x12,0x11,0xff,0x11,0x11,0x11,0xff,0x13,0x13,0x13,0xff,0x0b,0x0b,
-0x0b,0xff,0x03,0x03,0x03,0xff,0x03,0x03,0x03,0xff,0x01,0x01,0x01,0xff,0x07,0x07,
-0x07,0xff,0x22,0x22,0x22,0xff,0x14,0x14,0x14,0xff,0x16,0x16,0x16,0xff,0x04,0x04,
-0x04,0xff,0x07,0x07,0x07,0xff,0x22,0x22,0x22,0xff,0x09,0x09,0x09,0xff,0x03,0x03,
-0x03,0xff,0x02,0x02,0x02,0xff,0x07,0x07,0x07,0xff,0x12,0x12,0x12,0xff,0x15,0x14,
-0x13,0xff,0x3b,0x36,0x2f,0xff,0x32,0x2f,0x2b,0xff,0x22,0x22,0x22,0xff,0x18,0x18,
-0x18,0xff,0x09,0x09,0x09,0xff,0x11,0x11,0x11,0xff,0x0b,0x0b,0x0b,0xff,0x05,0x05,
-0x05,0xff,0x07,0x07,0x07,0xff,0x0b,0x0b,0x0b,0xff,0x15,0x15,0x15,0xff,0x1e,0x1e,
-0x1e,0xff,0x0b,0x0b,0x0b,0xff,0x03,0x03,0x03,0xff,0x13,0x13,0x13,0xff,0x0a,0x0a,
-0x0a,0xff,0x06,0x06,0x06,0xff,0x08,0x08,0x08,0xff,0x15,0x15,0x15,0xff,0x0a,0x0a,
-0x0a,0xff,0x06,0x06,0x06,0xff,0x03,0x03,0x03,0xff,0x06,0x06,0x06,0xff,0x10,0x10,
-0x10,0xff,0x09,0x09,0x09,0xff,0x01,0x01,0x01,0xff,0x15,0x15,0x15,0xff,0xff,0xff,
-0xff,0x00,0xb2,0xa2,0x88,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb2,0xa2,
-0x88,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x53,0x4b,0x3f,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x53,0x4b,0x40,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0xb9,0xa9,0x8d,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x68,0x5e,
-0x4f,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,0x4f,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x5a,0x59,
-0x58,0xff,0xdb,0xc8,0xa7,0xff,0xdb,0xc8,0xa7,0xff,0xdb,0xc8,0xa7,0xff,0xdb,0xc8,
-0xa7,0xff,0xdb,0xc8,0xa7,0xff,0x90,0x8b,0x85,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x03,0x03,0x03,0xff,0x08,0x08,0x08,0xff,0x02,0x02,
-0x02,0xff,0x08,0x08,0x08,0xff,0x05,0x05,0x05,0xff,0x10,0x10,0x10,0xff,0x1d,0x1d,
-0x1d,0xff,0x08,0x08,0x08,0xff,0x0b,0x0b,0x0b,0xff,0x15,0x15,0x15,0xff,0x0d,0x0d,
-0x0d,0xff,0x04,0x04,0x04,0xff,0x01,0x01,0x01,0xff,0x0f,0x0f,0x0f,0xff,0x0c,0x0c,
-0x0c,0xff,0x14,0x12,0x10,0xff,0x3c,0x36,0x2e,0xff,0x2e,0x28,0x20,0xff,0x20,0x1c,
-0x18,0xff,0x1e,0x1d,0x1d,0xff,0x0e,0x0e,0x0e,0xff,0x0c,0x0c,0x0c,0xff,0x18,0x18,
-0x18,0xff,0x11,0x11,0x11,0xff,0x03,0x03,0x03,0xff,0x03,0x03,0x03,0xff,0x05,0x05,
-0x05,0xff,0x19,0x19,0x19,0xff,0x0a,0x0a,0x0a,0xff,0x13,0x13,0x13,0xff,0x03,0x03,
-0x03,0xff,0x03,0x03,0x03,0xff,0x13,0x13,0x13,0xff,0x08,0x08,0x08,0xff,0x0e,0x0e,
-0x0e,0xff,0x0c,0x0c,0x0c,0xff,0x04,0x04,0x04,0xff,0x09,0x09,0x09,0xff,0x0a,0x09,
-0x08,0xff,0x29,0x24,0x1d,0xff,0x39,0x36,0x32,0xff,0x28,0x27,0x27,0xff,0x0c,0x0c,
-0x0c,0xff,0x00,0x00,0x00,0xff,0x07,0x07,0x07,0xff,0x0c,0x0c,0x0c,0xff,0x08,0x08,
-0x08,0xff,0x11,0x11,0x11,0xff,0x0c,0x0c,0x0c,0xff,0x16,0x16,0x16,0xff,0x13,0x13,
-0x13,0xff,0x11,0x11,0x11,0xff,0x07,0x07,0x07,0xff,0x0c,0x0c,0x0c,0xff,0x1f,0x1f,
-0x1f,0xff,0x16,0x16,0x16,0xff,0x10,0x10,0x10,0xff,0x09,0x09,0x09,0xff,0x01,0x01,
-0x01,0xff,0x04,0x04,0x04,0xff,0x03,0x03,0x03,0xff,0x0b,0x0b,0x0b,0xff,0x0a,0x0a,
-0x0a,0xff,0x01,0x01,0x01,0xff,0x03,0x03,0x03,0xff,0x08,0x08,0x08,0xff,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5f,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x68,0x5e,0x4f,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0xb9,0xa9,0x8d,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,
-0x00,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x2e,0x2e,
-0x2d,0xff,0xd9,0xc6,0xa8,0xff,0xdb,0xc8,0xa7,0xff,0xdb,0xc8,0xa7,0xff,0xdb,0xc8,
-0xa7,0xff,0xdb,0xc8,0xa7,0xff,0x53,0x52,0x51,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x10,0x10,0x10,0xff,0x18,0x18,0x18,0xff,0x0c,0x0c,
-0x0c,0xff,0x22,0x22,0x22,0xff,0x09,0x09,0x09,0xff,0x0d,0x0d,0x0d,0xff,0x1c,0x1c,
-0x1c,0xff,0x06,0x06,0x06,0xff,0x08,0x08,0x08,0xff,0x07,0x07,0x07,0xff,0x0d,0x0d,
-0x0d,0xff,0x05,0x05,0x05,0xff,0x0c,0x0c,0x0c,0xff,0x38,0x38,0x38,0xff,0x1f,0x1f,
-0x1f,0xff,0x12,0x11,0x10,0xff,0x43,0x3d,0x35,0xff,0x41,0x3b,0x34,0xff,0x1e,0x1b,
-0x16,0xff,0x12,0x11,0x11,0xff,0x17,0x17,0x17,0xff,0x0b,0x0b,0x0b,0xff,0x08,0x08,
-0x08,0xff,0x0b,0x0b,0x0b,0xff,0x06,0x06,0x06,0xff,0x04,0x04,0x04,0xff,0x01,0x01,
-0x01,0xff,0x08,0x08,0x08,0xff,0x04,0x04,0x04,0xff,0x13,0x13,0x13,0xff,0x04,0x04,
-0x04,0xff,0x01,0x01,0x01,0xff,0x06,0x06,0x06,0xff,0x0a,0x0a,0x0a,0xff,0x0e,0x0e,
-0x0e,0xff,0x0b,0x0b,0x0b,0xff,0x02,0x02,0x02,0xff,0x07,0x06,0x06,0xff,0x12,0x11,
-0x0f,0xff,0x31,0x2c,0x26,0xff,0x2f,0x2d,0x2a,0xff,0x0f,0x0e,0x0e,0xff,0x01,0x01,
-0x01,0xff,0x04,0x04,0x04,0xff,0x00,0x00,0x00,0xff,0x03,0x03,0x03,0xff,0x04,0x04,
-0x04,0xff,0x0e,0x0e,0x0e,0xff,0x03,0x03,0x03,0xff,0x0c,0x0c,0x0c,0xff,0x0f,0x0f,
-0x0f,0xff,0x15,0x15,0x15,0xff,0x10,0x10,0x10,0xff,0x0d,0x0d,0x0d,0xff,0x16,0x16,
-0x16,0xff,0x04,0x04,0x04,0xff,0x04,0x04,0x04,0xff,0x04,0x04,0x04,0xff,0x01,0x01,
-0x01,0xff,0x01,0x01,0x01,0xff,0x03,0x03,0x03,0xff,0x13,0x13,0x13,0xff,0x12,0x12,
-0x12,0xff,0x07,0x07,0x07,0xff,0x10,0x10,0x10,0xff,0x18,0x18,0x18,0xff,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x68,0x5e,0x4f,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x7f,0x74,0x61,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,
-0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x68,0x5e,0x4f,0xff,0x7f,0x74,0x61,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x68,0x5e,
-0x4f,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x1b,0x19,0x15,0xff,0x45,0x3f,
-0x35,0xff,0x45,0x3f,0x35,0xff,0x1b,0x19,0x15,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0xb9,0xa9,0x8d,0xff,0x86,0x7b,0x68,0xff,0x68,0x5e,0x4f,0xff,0x68,0x5e,
-0x4f,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xe1,0xd5,0xc1,0xff,0xb9,0xa9,
-0x8d,0xff,0x68,0x5e,0x4f,0xff,0x68,0x5e,0x4f,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xab,0xa4,0x98,0xff,0xdb,0xc8,0xa7,0xff,0xdb,0xc8,0xa7,0xff,0xdb,0xc8,
-0xa7,0xff,0xcf,0xc1,0xa7,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x12,0x12,0x12,0xff,0x0c,0x0c,0x0c,0xff,0x07,0x07,
-0x07,0xff,0x1c,0x1c,0x1c,0xff,0x0b,0x0b,0x0b,0xff,0x0c,0x0c,0x0c,0xff,0x0f,0x0f,
-0x0f,0xff,0x0c,0x0c,0x0c,0xff,0x19,0x19,0x19,0xff,0x06,0x06,0x06,0xff,0x06,0x06,
-0x06,0xff,0x09,0x09,0x09,0xff,0x08,0x08,0x08,0xff,0x25,0x25,0x25,0xff,0x0b,0x0b,
-0x0b,0xff,0x0a,0x09,0x08,0xff,0x36,0x31,0x2a,0xff,0x30,0x2b,0x26,0xff,0x33,0x2f,
-0x2c,0xff,0x12,0x11,0x11,0xff,0x0c,0x0c,0x0c,0xff,0x11,0x11,0x11,0xff,0x03,0x03,
-0x03,0xff,0x08,0x08,0x08,0xff,0x0d,0x0d,0x0d,0xff,0x03,0x03,0x03,0xff,0x04,0x04,
-0x04,0xff,0x0f,0x0f,0x0f,0xff,0x06,0x06,0x06,0xff,0x06,0x06,0x06,0xff,0x01,0x01,
-0x01,0xff,0x00,0x00,0x00,0xff,0x06,0x06,0x06,0xff,0x0a,0x0a,0x0a,0xff,0x06,0x06,
-0x06,0xff,0x03,0x03,0x03,0xff,0x07,0x07,0x07,0xff,0x0f,0x0f,0x0f,0xff,0x0b,0x0a,
-0x08,0xff,0x17,0x13,0x0d,0xff,0x0f,0x0e,0x0c,0xff,0x06,0x06,0x06,0xff,0x08,0x08,
-0x08,0xff,0x12,0x12,0x12,0xff,0x04,0x04,0x04,0xff,0x07,0x07,0x07,0xff,0x09,0x09,
-0x09,0xff,0x0d,0x0d,0x0d,0xff,0x07,0x07,0x07,0xff,0x0d,0x0d,0x0d,0xff,0x0d,0x0d,
-0x0d,0xff,0x1d,0x1d,0x1d,0xff,0x0a,0x0a,0x0a,0xff,0x0b,0x0b,0x0b,0xff,0x23,0x23,
-0x23,0xff,0x0f,0x0f,0x0f,0xff,0x04,0x04,0x04,0xff,0x01,0x01,0x01,0xff,0x06,0x06,
-0x06,0xff,0x04,0x04,0x04,0xff,0x06,0x06,0x06,0xff,0x18,0x18,0x18,0xff,0x0a,0x0a,
-0x0a,0xff,0x03,0x03,0x03,0xff,0x12,0x12,0x12,0xff,0x0c,0x0c,0x0c,0xff,0xff,0xff,
-0xff,0x00,0xb1,0xa2,0x87,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb1,0xa2,
-0x87,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x68,0x5e,
-0x4f,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,
-0x4f,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,
-0x4f,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x96,0x8a,0x73,0xff,0x68,0x5e,
-0x4f,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0x97,0x8a,
-0x73,0xff,0x97,0x89,0x73,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x45,0x3f,0x35,0xff,0x68,0x5e,0x4f,0xff,0x45,0x3f,
-0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x43,0x3e,0x34,0xff,0x43,0x3d,
-0x34,0xff,0x43,0x3e,0x34,0xff,0x43,0x3d,0x34,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x68,0x5e,0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0x00,0x00,0x00,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x71,0x6f,0x6c,0xff,0xdb,0xc8,0xa7,0xff,0xdb,0xc8,0xa7,0xff,0xdb,0xc8,
-0xa7,0xff,0xa6,0xa0,0x94,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x09,0x09,0x09,0xff,0x11,0x11,0x11,0xff,0x0f,0x0f,
-0x0f,0xff,0x16,0x16,0x16,0xff,0x14,0x14,0x14,0xff,0x06,0x06,0x06,0xff,0x02,0x02,
-0x02,0xff,0x02,0x02,0x02,0xff,0x06,0x06,0x06,0xff,0x03,0x03,0x03,0xff,0x03,0x03,
-0x03,0xff,0x05,0x05,0x05,0xff,0x02,0x02,0x02,0xff,0x0d,0x0d,0x0d,0xff,0x04,0x04,
-0x04,0xff,0x16,0x14,0x11,0xff,0x47,0x42,0x39,0xff,0x4d,0x47,0x40,0xff,0x3e,0x3a,
-0x35,0xff,0x1b,0x1b,0x1a,0xff,0x19,0x19,0x19,0xff,0x1e,0x1e,0x1e,0xff,0x0f,0x0f,
-0x0f,0xff,0x16,0x16,0x16,0xff,0x14,0x14,0x14,0xff,0x03,0x03,0x03,0xff,0x04,0x04,
-0x04,0xff,0x06,0x06,0x06,0xff,0x06,0x06,0x06,0xff,0x06,0x06,0x06,0xff,0x00,0x00,
-0x00,0xff,0x07,0x07,0x07,0xff,0x15,0x15,0x15,0xff,0x16,0x16,0x16,0xff,0x09,0x09,
-0x09,0xff,0x05,0x05,0x05,0xff,0x14,0x14,0x14,0xff,0x16,0x16,0x16,0xff,0x0c,0x0b,
-0x09,0xff,0x1b,0x16,0x10,0xff,0x23,0x21,0x1e,0xff,0x1b,0x1b,0x1a,0xff,0x06,0x06,
-0x06,0xff,0x08,0x08,0x08,0xff,0x05,0x05,0x05,0xff,0x15,0x15,0x15,0xff,0x0a,0x0a,
-0x0a,0xff,0x04,0x04,0x04,0xff,0x0d,0x0d,0x0d,0xff,0x07,0x07,0x07,0xff,0x07,0x07,
-0x07,0xff,0x1c,0x1c,0x1c,0xff,0x09,0x09,0x09,0xff,0x04,0x04,0x04,0xff,0x13,0x13,
-0x13,0xff,0x1c,0x1c,0x1c,0xff,0x11,0x11,0x11,0xff,0x09,0x09,0x09,0xff,0x1f,0x1f,
-0x1f,0xff,0x15,0x15,0x15,0xff,0x04,0x04,0x04,0xff,0x06,0x06,0x06,0xff,0x00,0x00,
-0x00,0xff,0x04,0x04,0x04,0xff,0x09,0x09,0x09,0xff,0x11,0x11,0x11,0xff,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,
-0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0xb9,0xa9,
-0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0xab,0x9c,
-0x83,0xff,0x68,0x5e,0x4f,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x68,0x5e,0x4f,0xff,0xab,0x9d,0x83,0xff,0xab,0x9c,0x83,0xff,0x68,0x5e,
-0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x86,0x7b,
-0x68,0xff,0x45,0x3f,0x35,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x45,0x3f,0x35,0xff,0x68,0x5e,0x4f,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x43,0x3e,0x34,0xff,0x6b,0x62,
-0x53,0xff,0x6a,0x62,0x53,0xff,0x43,0x3e,0x34,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x68,0x5e,0x4f,0xff,0x86,0x7b,
-0x68,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
-0x00,0xff,0x68,0x5e,0x4f,0xff,0x86,0x7b,0x68,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x2d,0x2d,0x2c,0xff,0xc0,0xb5,0xa1,0xff,0xdb,0xc8,0xa7,0xff,0xd7,0xc5,
-0xa6,0xff,0x51,0x50,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x04,0x04,0x04,0xff,0x0e,0x0e,0x0e,0xff,0x16,0x16,
-0x16,0xff,0x07,0x07,0x07,0xff,0x04,0x04,0x04,0xff,0x00,0x00,0x00,0xff,0x01,0x01,
-0x01,0xff,0x04,0x04,0x04,0xff,0x03,0x03,0x03,0xff,0x0d,0x0d,0x0d,0xff,0x03,0x03,
-0x03,0xff,0x01,0x01,0x01,0xff,0x00,0x00,0x00,0xff,0x02,0x02,0x02,0xff,0x07,0x07,
-0x07,0xff,0x30,0x2e,0x2b,0xff,0x49,0x44,0x3c,0xff,0x26,0x20,0x1b,0xff,0x2b,0x28,
-0x23,0xff,0x2b,0x2b,0x2a,0xff,0x22,0x22,0x22,0xff,0x10,0x10,0x10,0xff,0x1c,0x1c,
-0x1c,0xff,0x1e,0x1e,0x1e,0xff,0x10,0x10,0x10,0xff,0x05,0x05,0x05,0xff,0x13,0x13,
-0x13,0xff,0x09,0x09,0x09,0xff,0x07,0x07,0x07,0xff,0x14,0x14,0x14,0xff,0x07,0x07,
-0x07,0xff,0x0f,0x0f,0x0f,0xff,0x08,0x08,0x08,0xff,0x09,0x09,0x09,0xff,0x09,0x09,
-0x09,0xff,0x02,0x02,0x02,0xff,0x04,0x04,0x04,0xff,0x06,0x06,0x06,0xff,0x0c,0x0a,
-0x09,0xff,0x10,0x0b,0x09,0xff,0x23,0x21,0x1e,0xff,0x1b,0x1b,0x1a,0xff,0x07,0x07,
-0x07,0xff,0x12,0x12,0x12,0xff,0x04,0x04,0x04,0xff,0x09,0x09,0x09,0xff,0x12,0x12,
-0x12,0xff,0x0a,0x0a,0x0a,0xff,0x25,0x25,0x25,0xff,0x11,0x11,0x11,0xff,0x09,0x09,
-0x09,0xff,0x07,0x07,0x07,0xff,0x06,0x06,0x06,0xff,0x14,0x14,0x14,0xff,0x1f,0x1f,
-0x1f,0xff,0x15,0x15,0x15,0xff,0x05,0x05,0x05,0xff,0x04,0x04,0x04,0xff,0x1a,0x1a,
-0x1a,0xff,0x08,0x08,0x08,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x03,0x03,
-0x03,0xff,0x0d,0x0d,0x0d,0xff,0x04,0x04,0x04,0xff,0x0e,0x0e,0x0e,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,
-0x8d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,0x8d,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xb9,0xa9,0x8d,0xff,0x00,0x00,0x00,0xff,0xb9,0xa9,
-0x8d,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,
-0x4f,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,0x8d,0xff,0xb9,0xa9,
-0x8d,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x68,0x5e,0x4f,0xff,0x68,0x5e,
-0x4f,0xff,0x68,0x5e,0x4f,0xff,0x68,0x5e,0x4f,0xff,0x68,0x5e,0x4f,0xff,0x68,0x5e,
-0x4f,0xff,0x68,0x5e,0x4f,0xff,0x68,0x5e,0x4f,0xff,0x68,0x5e,0x4f,0xff,0x68,0x5e,
-0x4f,0xff,0x68,0x5e,0x4f,0xff,0x68,0x5e,0x4f,0xff,0x68,0x5e,0x4f,0xff,0x68,0x5e,
-0x4f,0xff,0x68,0x5e,0x4f,0xff,0x45,0x3f,0x35,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x1c,0x19,0x15,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0x1c,0x19,0x15,0xff,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0x86,0x7b,0x68,0xff,0xb9,0xa9,
-0x8d,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x86,0x7b,0x68,0xff,0x86,0x7b,
-0x68,0xff,0x86,0x7b,0x68,0xff,0xb9,0xa9,0x8d,0xff,0x68,0x5e,0x4f,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x60,0x5f,0x5d,0xff,0xd9,0xc8,0xac,0xf9,0x95,0x91,
-0x89,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0x03,0x03,0x03,0xff,0x09,0x09,0x09,0xff,0x26,0x26,
-0x26,0xff,0x0a,0x0a,0x0a,0xff,0x0f,0x0f,0x0f,0xff,0x03,0x03,0x03,0xff,0x03,0x03,
-0x03,0xff,0x05,0x05,0x05,0xff,0x11,0x11,0x11,0xff,0x18,0x18,0x18,0xff,0x07,0x07,
-0x07,0xff,0x1e,0x1e,0x1e,0xff,0x1a,0x1a,0x1a,0xff,0x09,0x09,0x09,0xff,0x17,0x17,
-0x16,0xff,0x1e,0x1d,0x19,0xff,0x44,0x3f,0x36,0xff,0x3a,0x35,0x2d,0xff,0x09,0x08,
-0x07,0xff,0x03,0x03,0x03,0xff,0x04,0x04,0x04,0xff,0x06,0x06,0x06,0xff,0x1a,0x1a,
-0x1a,0xff,0x05,0x05,0x05,0xff,0x00,0x00,0x00,0xff,0x07,0x07,0x07,0xff,0x01,0x01,
-0x01,0xff,0x0b,0x0b,0x0b,0xff,0x1a,0x1a,0x1a,0xff,0x0b,0x0b,0x0b,0xff,0x08,0x08,
-0x08,0xff,0x10,0x10,0x10,0xff,0x08,0x08,0x08,0xff,0x07,0x07,0x07,0xff,0x00,0x00,
-0x00,0xff,0x01,0x01,0x01,0xff,0x0d,0x0d,0x0d,0xff,0x1d,0x1d,0x1d,0xff,0x19,0x17,
-0x15,0xff,0x29,0x25,0x1e,0xff,0x2f,0x2d,0x29,0xff,0x22,0x22,0x21,0xff,0x0b,0x0b,
-0x0b,0xff,0x02,0x02,0x02,0xff,0x00,0x00,0x00,0xff,0x04,0x04,0x04,0xff,0x01,0x01,
-0x01,0xff,0x0d,0x0d,0x0d,0xff,0x27,0x27,0x27,0xff,0x07,0x07,0x07,0xff,0x01,0x01,
-0x01,0xff,0x07,0x07,0x07,0xff,0x05,0x05,0x05,0xff,0x00,0x00,0x00,0xff,0x05,0x05,
-0x05,0xff,0x00,0x00,0x00,0xff,0x07,0x07,0x07,0xff,0x14,0x14,0x14,0xff,0x04,0x04,
-0x04,0xff,0x02,0x02,0x02,0xff,0x04,0x04,0x04,0xff,0x1b,0x1b,0x1b,0xff,0x23,0x23,
-0x23,0xff,0x06,0x06,0x06,0xff,0x03,0x03,0x03,0xff,0x09,0x09,0x09,0xff,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,
-0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x52,0x55,0x45,0x56,0x49,
-0x53,0x49,0x4f,0x4e,0x2d,0x58,0x46,0x49,0x4c,0x45,0x2e,0x00};
diff --git a/client/hot_keys.cpp b/client/hot_keys.cpp
deleted file mode 100644
index 763ba2ca..00000000
--- a/client/hot_keys.cpp
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-#include "hot_keys.h"
-#include "utils.h"
-#include "debug.h"
-
-HotKeysParser::HotKeysParser(const std::string& hotkeys, const CommandsMap& commands_map)
-{
- DBG(0, "hotkeys = %s", hotkeys.c_str());
-
- std::istringstream is(hotkeys);
- std::string hotkey;
- while (std::getline(is, hotkey, ',')) {
- add_hotkey(hotkey, commands_map);
- }
-}
-
-void HotKeysParser::parse_keys(int command_id, const std::string& hotkey)
-{
- HotkeySet& keys = _hot_keys[command_id];
- std::istringstream is(hotkey);
- std::string key;
- while (std::getline(is, key, '+')) {
- add_key(keys, key.c_str());
- }
-}
-
-void HotKeysParser::add_key(HotkeySet& keys, const char* key)
-{
- ASSERT(key != NULL);
-
- static const struct {
- const char* name;
- RedKey main;
- RedKey alter;
- } keyboard[] = {
- { "alt", REDKEY_R_ALT, REDKEY_L_ALT },
- { "ralt", REDKEY_R_ALT, REDKEY_INVALID },
- { "rightalt", REDKEY_R_ALT, REDKEY_INVALID },
- { "right-alt", REDKEY_R_ALT, REDKEY_INVALID },
- { "lalt", REDKEY_L_ALT, REDKEY_INVALID },
- { "leftalt", REDKEY_L_ALT, REDKEY_INVALID },
- { "left-alt", REDKEY_L_ALT, REDKEY_INVALID },
- { "ctrl", REDKEY_R_CTRL, REDKEY_L_CTRL },
- { "rctrl", REDKEY_R_CTRL, REDKEY_INVALID },
- { "rightctrl", REDKEY_R_CTRL, REDKEY_INVALID },
- { "right-ctrl", REDKEY_R_CTRL, REDKEY_INVALID },
- { "lctrl", REDKEY_L_CTRL, REDKEY_INVALID },
- { "leftctrl", REDKEY_L_CTRL, REDKEY_INVALID },
- { "left-ctrl", REDKEY_L_CTRL, REDKEY_INVALID },
- { "shift", REDKEY_R_SHIFT, REDKEY_L_SHIFT },
- { "rshift", REDKEY_R_SHIFT, REDKEY_INVALID },
- { "rightshift", REDKEY_R_SHIFT, REDKEY_INVALID },
- { "right-shift", REDKEY_R_SHIFT, REDKEY_INVALID },
- { "lshift", REDKEY_L_SHIFT, REDKEY_INVALID },
- { "leftshift", REDKEY_L_SHIFT, REDKEY_INVALID },
- { "left-shift", REDKEY_L_SHIFT, REDKEY_INVALID },
- { "cmd", REDKEY_RIGHT_CMD, REDKEY_LEFT_CMD },
- { "rcmd", REDKEY_RIGHT_CMD, REDKEY_INVALID },
- { "rightcmd", REDKEY_RIGHT_CMD, REDKEY_INVALID },
- { "right-cmd", REDKEY_RIGHT_CMD, REDKEY_INVALID },
- { "lcmd", REDKEY_LEFT_CMD, REDKEY_INVALID },
- { "leftcmd", REDKEY_LEFT_CMD, REDKEY_INVALID },
- { "left-cmd", REDKEY_LEFT_CMD, REDKEY_INVALID },
- { "win", REDKEY_RIGHT_CMD, REDKEY_LEFT_CMD },
- { "rwin", REDKEY_RIGHT_CMD, REDKEY_INVALID },
- { "rightwin", REDKEY_RIGHT_CMD, REDKEY_INVALID },
- { "right-win", REDKEY_RIGHT_CMD, REDKEY_INVALID },
- { "lwin", REDKEY_LEFT_CMD, REDKEY_INVALID },
- { "leftwin", REDKEY_LEFT_CMD, REDKEY_INVALID },
- { "left-win", REDKEY_LEFT_CMD, REDKEY_INVALID },
- { "esc", REDKEY_ESCAPE, REDKEY_INVALID },
- { "escape", REDKEY_ESCAPE, REDKEY_INVALID },
- { "ins", REDKEY_INSERT, REDKEY_INVALID },
- { "insert", REDKEY_INSERT, REDKEY_INVALID },
- { "del", REDKEY_DELETE, REDKEY_INVALID },
- { "delete", REDKEY_DELETE, REDKEY_INVALID },
- { "pgup", REDKEY_PAGEUP, REDKEY_INVALID },
- { "pageup", REDKEY_PAGEUP, REDKEY_INVALID },
- { "pgdn", REDKEY_PAGEDOWN, REDKEY_INVALID },
- { "pagedown", REDKEY_PAGEDOWN, REDKEY_INVALID },
- { "home", REDKEY_HOME, REDKEY_INVALID },
- { "end", REDKEY_END, REDKEY_INVALID },
- { "space", REDKEY_SPACE, REDKEY_INVALID },
- { "enter", REDKEY_ENTER, REDKEY_INVALID },
- { "tab", REDKEY_TAB, REDKEY_INVALID },
- { "f1", REDKEY_F1, REDKEY_INVALID },
- { "f2", REDKEY_F2, REDKEY_INVALID },
- { "f3", REDKEY_F3, REDKEY_INVALID },
- { "f4", REDKEY_F4, REDKEY_INVALID },
- { "f5", REDKEY_F5, REDKEY_INVALID },
- { "f6", REDKEY_F6, REDKEY_INVALID },
- { "f7", REDKEY_F7, REDKEY_INVALID },
- { "f8", REDKEY_F8, REDKEY_INVALID },
- { "f9", REDKEY_F9, REDKEY_INVALID },
- { "f10", REDKEY_F10, REDKEY_INVALID },
- { "f11", REDKEY_F11, REDKEY_INVALID },
- { "f12", REDKEY_F12, REDKEY_INVALID }
- };
-
- for (unsigned i = 0; i < (sizeof(keyboard) / sizeof(keyboard[0])); ++i) {
- if (strcasecmp(key, keyboard[i].name) == 0) {
- HotkeyKey hotkey;
- hotkey.main = keyboard[i].main;
- hotkey.alter = keyboard[i].alter;
- DBG(0, "keys = %s", keyboard[i].name);
- keys.push_back(hotkey);
- return;
- }
- }
- THROW("unknown key name %s", key);
-}
-
-void HotKeysParser::add_hotkey(const std::string& hotkey, const CommandsMap& commands_map)
-{
- std::string::size_type key_start = hotkey.find('=', 0);
- if (key_start == std::string::npos) {
- THROW("unable to parse hot keys");
- }
- std::string command_name = hotkey.substr(0, key_start);
-
- if (commands_map.find(command_name) == commands_map.end()) {
- THROW("invalid action bname %s", command_name.c_str());
- }
- int command_id = commands_map.find(command_name)->second;
- std::string keys = hotkey.substr(key_start + 1);
- parse_keys(command_id, keys);
-}
diff --git a/client/hot_keys.h b/client/hot_keys.h
deleted file mode 100644
index e78390d3..00000000
--- a/client/hot_keys.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_HOT_KEYS
-#define _H_HOT_KEYS
-
-#include "common.h"
-#include "red_key.h"
-
-typedef std::map<std::string, int> CommandsMap;
-
-struct HotkeyKey {
- RedKey main;
- RedKey alter;
-};
-
-typedef std::vector<HotkeyKey> HotkeySet;
-typedef std::map<int, HotkeySet> HotKeys;
-
-class HotKeysParser {
-public:
- HotKeysParser(const std::string& hotkeys, const CommandsMap& commands_map);
- const HotKeys& get() { return _hot_keys;}
-
-private:
- void add_hotkey(const std::string& hotkey, const CommandsMap& commands_map);
- void parse_keys(int command_id, const std::string& hotkey);
- void add_key(HotkeySet& keys, const char* key);
-
-private:
- HotKeys _hot_keys;
-};
-
-#endif
diff --git a/client/inputs_channel.cpp b/client/inputs_channel.cpp
deleted file mode 100644
index c148effd..00000000
--- a/client/inputs_channel.cpp
+++ /dev/null
@@ -1,614 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-#include "inputs_channel.h"
-#include "utils.h"
-#include "debug.h"
-#include "red_client.h"
-#include "application.h"
-#include "display_channel.h"
-
-#define SYNC_REMOTE_MODIFIERS
-
-class SetInputsHandlerEvent: public Event {
-public:
- SetInputsHandlerEvent(InputsChannel& channel) : _channel (channel) {}
-
- class AttachFunc: public ForEachChannelFunc {
- public:
- AttachFunc(InputsChannel& channel)
- : _channel (channel)
- {
- }
-
- virtual bool operator() (RedChannel& channel)
- {
- if (channel.get_type() == SPICE_CHANNEL_DISPLAY) {
- static_cast<DisplayChannel&>(channel).attach_inputs(&_channel);
- }
- return true;
- }
-
- public:
- InputsChannel& _channel;
- };
-
- virtual void response(AbstractProcessLoop& events_loop)
- {
- static_cast<Application*>(events_loop.get_owner())->set_key_handler(_channel);
- static_cast<Application*>(events_loop.get_owner())->set_mouse_handler(_channel);
- AttachFunc func(_channel);
- _channel.get_client().for_each_channel(func);
- }
-
-private:
- InputsChannel& _channel;
-};
-
-class KeyModifiersEvent: public Event {
-public:
- KeyModifiersEvent(InputsChannel& channel) : _channel (channel) {}
-
- virtual void response(AbstractProcessLoop& events_loop)
- {
- Lock lock(_channel._update_modifiers_lock);
- _channel._active_modifiers_event = false;
- _channel.set_local_modifiers();
- }
-
-private:
- InputsChannel& _channel;
-};
-
-class RemoveInputsHandlerEvent: public SyncEvent {
-public:
- RemoveInputsHandlerEvent(InputsChannel& channel) : _channel (channel) {}
-
- class DetachFunc: public ForEachChannelFunc {
- public:
- virtual bool operator() (RedChannel& channel)
- {
- if (channel.get_type() == SPICE_CHANNEL_DISPLAY) {
- static_cast<DisplayChannel&>(channel).detach_inputs();
- }
- return true;
- }
- };
-
- virtual void do_response(AbstractProcessLoop& events_loop)
- {
- static_cast<Application*>(events_loop.get_owner())->remove_key_handler(_channel);
- static_cast<Application*>(events_loop.get_owner())->remove_mouse_handler(_channel);
- DetachFunc detach_func;
- _channel.get_client().for_each_channel(detach_func);
- }
-
-private:
- InputsChannel& _channel;
-};
-
-class MotionMessage: public RedChannel::OutMessage, public RedPeer::OutMessage {
-public:
- MotionMessage(InputsChannel& channel);
- virtual RedPeer::OutMessage& peer_message();
- virtual void release();
-
-private:
- InputsChannel& _channel;
-};
-
-MotionMessage::MotionMessage(InputsChannel& channel)
- : RedChannel::OutMessage()
- , RedPeer::OutMessage(SPICE_MSGC_INPUTS_MOUSE_MOTION)
- , _channel (channel)
-{
-}
-
-void MotionMessage::release()
-{
- delete this;
-}
-
-RedPeer::OutMessage& MotionMessage::peer_message()
-{
-
- _channel.marshall_motion_event(_marshaller);
-
- return *this;
-}
-
-class PositionMessage: public RedChannel::OutMessage, public RedPeer::OutMessage {
-public:
- PositionMessage(InputsChannel& channel);
- virtual RedPeer::OutMessage& peer_message();
- virtual void release();
-
-private:
- InputsChannel& _channel;
-};
-
-PositionMessage::PositionMessage(InputsChannel& channel)
- : RedChannel::OutMessage()
- , RedPeer::OutMessage(SPICE_MSGC_INPUTS_MOUSE_POSITION)
- , _channel (channel)
-{
-}
-
-void PositionMessage::release()
-{
- delete this;
-}
-
-RedPeer::OutMessage& PositionMessage::peer_message()
-{
- _channel.marshall_position_event(_marshaller);
- return *this;
-}
-
-class InputsMessHandler: public MessageHandlerImp<InputsChannel, SPICE_CHANNEL_INPUTS> {
-public:
- InputsMessHandler(InputsChannel& channel)
- : MessageHandlerImp<InputsChannel, SPICE_CHANNEL_INPUTS>(channel) {}
-};
-
-InputsChannel::InputsChannel(RedClient& client, uint32_t id)
- : RedChannel(client, SPICE_CHANNEL_INPUTS, id, new InputsMessHandler(*this))
- , _mouse_buttons_state (0)
- , _mouse_dx (0)
- , _mouse_dy (0)
- , _mouse_x (~0)
- , _mouse_y (~0)
- , _display_id (-1)
- , _active_motion (false)
- , _motion_count (0)
- , _active_modifiers_event (false)
-{
- InputsMessHandler* handler = static_cast<InputsMessHandler*>(get_message_handler());
- handler->set_handler(SPICE_MSG_MIGRATE, &InputsChannel::handle_migrate);
- handler->set_handler(SPICE_MSG_SET_ACK, &InputsChannel::handle_set_ack);
- handler->set_handler(SPICE_MSG_PING, &InputsChannel::handle_ping);
- handler->set_handler(SPICE_MSG_WAIT_FOR_CHANNELS, &InputsChannel::handle_wait_for_channels);
- handler->set_handler(SPICE_MSG_DISCONNECTING, &InputsChannel::handle_disconnect);
- handler->set_handler(SPICE_MSG_NOTIFY, &InputsChannel::handle_notify);
-
- handler->set_handler(SPICE_MSG_INPUTS_INIT, &InputsChannel::handle_init);
- handler->set_handler(SPICE_MSG_INPUTS_KEY_MODIFIERS, &InputsChannel::handle_modifiers);
- handler->set_handler(SPICE_MSG_INPUTS_MOUSE_MOTION_ACK, &InputsChannel::handle_motion_ack);
-}
-
-InputsChannel::~InputsChannel()
-{
-}
-
-void InputsChannel::on_connect()
-{
- _motion_count = _mouse_dx = _mouse_dy = _mouse_buttons_state = _modifiers = 0;
- _mouse_x = _mouse_y = ~0;
- _display_id = -1;
-}
-
-void InputsChannel::on_disconnect()
-{
- AutoRef<RemoveInputsHandlerEvent> remove_handler_event(new RemoveInputsHandlerEvent(*this));
- get_client().push_event(*remove_handler_event);
- (*remove_handler_event)->wait();
-}
-
-void InputsChannel::handle_init(RedPeer::InMessage* message)
-{
- SpiceMsgInputsInit* init = (SpiceMsgInputsInit*)message->data();
- _modifiers = init->keyboard_modifiers;
- AutoRef<SetInputsHandlerEvent> set_handler_event(new SetInputsHandlerEvent(*this));
- get_client().push_event(*set_handler_event);
-}
-
-void InputsChannel::handle_modifiers(RedPeer::InMessage* message)
-{
- SpiceMsgInputsKeyModifiers* init = (SpiceMsgInputsKeyModifiers*)message->data();
- _modifiers = init->modifiers;
- Lock lock(_update_modifiers_lock);
- if (_active_modifiers_event) {
- return;
- }
- _active_modifiers_event = true;
- AutoRef<KeyModifiersEvent> modifiers_event(new KeyModifiersEvent(*this));
- get_client().push_event(*modifiers_event);
-}
-
-void InputsChannel::handle_motion_ack(RedPeer::InMessage* message)
-{
- Lock lock(_motion_lock);
- if (_motion_count < SPICE_INPUT_MOTION_ACK_BUNCH) {
- LOG_WARN("invalid motion count");
- _motion_count = 0;
- } else {
- _motion_count -= SPICE_INPUT_MOTION_ACK_BUNCH;
- }
- if (!_active_motion && (_mouse_dx || _mouse_dy || _display_id != -1)) {
- _active_motion = true;
- _motion_count++;
- switch (get_client().get_mouse_mode()) {
- case SPICE_MOUSE_MODE_CLIENT:
- post_message(new PositionMessage(*this));
- break;
- case SPICE_MOUSE_MODE_SERVER:
- post_message(new MotionMessage(*this));
- break;
- default:
- THROW("invalid mouse mode");
- }
- }
-}
-
-void InputsChannel::marshall_motion_event(SpiceMarshaller *marshaller)
-{
- SpiceMsgcMouseMotion motion;
-
- Lock lock(_motion_lock);
- motion.buttons_state = _mouse_buttons_state;
- motion.dx = _mouse_dx;
- motion.dy = _mouse_dy;
- _mouse_dx = _mouse_dy = 0;
- _active_motion = false;
-
- _marshallers->msgc_inputs_mouse_motion(marshaller, &motion);
-}
-
-void InputsChannel::marshall_position_event(SpiceMarshaller *marshaller)
-{
- SpiceMsgcMousePosition position;
- Lock lock(_motion_lock);
- position.buttons_state = _mouse_buttons_state;
- position.x = _mouse_x;
- position.y = _mouse_y;
- position.display_id = _display_id;
- _mouse_x = _mouse_y = ~0;
- _display_id = -1;
- _active_motion = false;
- _marshallers->msgc_inputs_mouse_position(marshaller, &position);
-}
-
-void InputsChannel::on_mouse_motion(int dx, int dy, int buttons_state)
-{
- Lock lock(_motion_lock);
- _mouse_buttons_state = buttons_state;
- _mouse_dx += dx;
- _mouse_dy += dy;
- if (!_active_motion && _motion_count < SPICE_INPUT_MOTION_ACK_BUNCH * 2) {
- _active_motion = true;
- _motion_count++;
- post_message(new MotionMessage(*this));
- }
-}
-
-void InputsChannel::on_mouse_position(int x, int y, int buttons_state, int display_id)
-{
- Lock lock(_motion_lock);
- _mouse_buttons_state = buttons_state;
- _mouse_x = x;
- _mouse_y = y;
- _display_id = display_id;
- if (!_active_motion && _motion_count < SPICE_INPUT_MOTION_ACK_BUNCH * 2) {
- _active_motion = true;
- _motion_count++;
- post_message(new PositionMessage(*this));
- }
-}
-
-void InputsChannel::on_migrate()
-{
- _motion_count = _active_motion ? 1 : 0;
-}
-
-void InputsChannel::on_mouse_down(int button, int buttons_state)
-{
- Message* message;
-
- message = new Message(SPICE_MSGC_INPUTS_MOUSE_PRESS);
- SpiceMsgcMousePress event;
- event.button = button;
- event.buttons_state = buttons_state;
- _marshallers->msgc_inputs_mouse_press(message->marshaller(), &event);
-
- post_message(message);
-}
-
-void InputsChannel::on_mouse_up(int button, int buttons_state)
-{
- Message* message;
-
- message = new Message(SPICE_MSGC_INPUTS_MOUSE_RELEASE);
- SpiceMsgcMouseRelease event;
- event.button = button;
- event.buttons_state = buttons_state;
- _marshallers->msgc_inputs_mouse_release(message->marshaller(), &event);
- post_message(message);
-}
-
-InputsChannel::KeyInfo InputsChannel::_scan_table[REDKEY_NUM_KEYS];
-
-uint32_t InputsChannel::get_make_scan_code(RedKey key)
-{
- return _scan_table[key].make_scan;
-}
-
-uint32_t InputsChannel::get_break_scan_code(RedKey key)
-{
- return _scan_table[key].break_scan;
-}
-
-void InputsChannel::on_key_down(RedKey key)
-{
- uint32_t scan_code = get_make_scan_code(key);
- if (!scan_code) {
- LOG_WARN("no make code for %d", key);
- return;
- }
-
- Message* message = new Message(SPICE_MSGC_INPUTS_KEY_DOWN);
- SpiceMsgcKeyDown event;
- event.code = scan_code;
- _marshallers->msgc_inputs_key_down(message->marshaller(), &event);
-
- post_message(message);
-}
-
-void InputsChannel::on_key_up(RedKey key)
-{
- uint32_t scan_code = get_break_scan_code(key);
- if (!scan_code) {
- LOG_WARN("no break code for %d", key);
- return;
- }
-
- Message* message = new Message(SPICE_MSGC_INPUTS_KEY_UP);
- SpiceMsgcKeyUp event;
- event.code = scan_code;
- _marshallers->msgc_inputs_key_up(message->marshaller(), &event);
- post_message(message);
-}
-
-void InputsChannel::set_local_modifiers()
-{
- unsigned int modifiers = 0;
-
- if (_modifiers & SPICE_KEYBOARD_MODIFIER_FLAGS_SCROLL_LOCK) {
- modifiers |= Platform::SCROLL_LOCK_MODIFIER;
- }
-
- if (_modifiers & SPICE_KEYBOARD_MODIFIER_FLAGS_NUM_LOCK) {
- modifiers |= Platform::NUM_LOCK_MODIFIER;
- }
-
- if (_modifiers & SPICE_KEYBOARD_MODIFIER_FLAGS_CAPS_LOCK) {
- modifiers |= Platform::CAPS_LOCK_MODIFIER;
- }
-
- Platform::set_keyboard_lock_modifiers(modifiers);
-}
-
-void InputsChannel::on_focus_in()
-{
- Lock lock(_update_modifiers_lock);
- _active_modifiers_event = false;
- _on_focus_modifiers = Platform::get_keyboard_lock_modifiers();
-
-#ifdef SYNC_REMOTE_MODIFIERS
- Message* message = new Message(SPICE_MSGC_INPUTS_KEY_MODIFIERS);
- SpiceMsgcKeyModifiers modifiers;
- modifiers.modifiers = _on_focus_modifiers;
- _marshallers->msgc_inputs_key_modifiers(message->marshaller(), &modifiers);
- post_message(message);
-#else
- set_local_modifiers();
-#endif
-}
-
-void InputsChannel::on_focus_out()
-{
- Lock lock(_update_modifiers_lock);
- _active_modifiers_event = true;
-#ifndef SYNC_REMOTE_MODIFIERS
- _modifiers = _on_focus_modifiers;
- set_local_modifiers();
-#endif
-}
-
-void InputsChannel::init_scan_code(int index)
-{
- ASSERT((index & 0x80) == 0);
- _scan_table[index].make_scan = index;
- _scan_table[index].break_scan = index | 0x80;
-}
-
-void InputsChannel::init_korean_scan_code(int index)
-{
- _scan_table[index].make_scan = index;
- _scan_table[index].break_scan = index;
-}
-
-void InputsChannel::init_escape_scan_code(int index)
-{
- ASSERT(((index - REDKEY_ESCAPE_BASE) & 0x80) == 0);
- _scan_table[index].make_scan = 0xe0 | ((index - REDKEY_ESCAPE_BASE) << 8);
- _scan_table[index].break_scan = _scan_table[index].make_scan | 0x8000;
-}
-
-void InputsChannel::init_pause_scan_code()
-{
- _scan_table[REDKEY_PAUSE].make_scan = 0x451de1;
- _scan_table[REDKEY_PAUSE].break_scan = 0xc59de1;
-}
-
-void InputsChannel::init_scan_table()
-{
- memset(_scan_table, 0, sizeof(_scan_table));
- init_scan_code(REDKEY_ESCAPE);
- init_scan_code(REDKEY_1);
- init_scan_code(REDKEY_2);
- init_scan_code(REDKEY_3);
- init_scan_code(REDKEY_4);
- init_scan_code(REDKEY_5);
- init_scan_code(REDKEY_6);
- init_scan_code(REDKEY_7);
- init_scan_code(REDKEY_8);
- init_scan_code(REDKEY_9);
- init_scan_code(REDKEY_0);
- init_scan_code(REDKEY_MINUS);
- init_scan_code(REDKEY_EQUALS);
- init_scan_code(REDKEY_BACKSPACE);
- init_scan_code(REDKEY_TAB);
- init_scan_code(REDKEY_Q);
- init_scan_code(REDKEY_W);
- init_scan_code(REDKEY_E);
- init_scan_code(REDKEY_R);
- init_scan_code(REDKEY_T);
- init_scan_code(REDKEY_Y);
- init_scan_code(REDKEY_U);
- init_scan_code(REDKEY_I);
- init_scan_code(REDKEY_O);
- init_scan_code(REDKEY_P);
- init_scan_code(REDKEY_L_BRACKET);
- init_scan_code(REDKEY_R_BRACKET);
- init_scan_code(REDKEY_ENTER);
- init_scan_code(REDKEY_L_CTRL);
- init_scan_code(REDKEY_A);
- init_scan_code(REDKEY_S);
- init_scan_code(REDKEY_D);
- init_scan_code(REDKEY_F);
- init_scan_code(REDKEY_G);
- init_scan_code(REDKEY_H);
- init_scan_code(REDKEY_J);
- init_scan_code(REDKEY_K);
- init_scan_code(REDKEY_L);
- init_scan_code(REDKEY_SEMICOLON);
- init_scan_code(REDKEY_QUOTE);
- init_scan_code(REDKEY_BACK_QUOTE);
- init_scan_code(REDKEY_L_SHIFT);
- init_scan_code(REDKEY_BACK_SLASH);
- init_scan_code(REDKEY_Z);
- init_scan_code(REDKEY_X);
- init_scan_code(REDKEY_C);
- init_scan_code(REDKEY_V);
- init_scan_code(REDKEY_B);
- init_scan_code(REDKEY_N);
- init_scan_code(REDKEY_M);
- init_scan_code(REDKEY_COMMA);
- init_scan_code(REDKEY_PERIOD);
- init_scan_code(REDKEY_SLASH);
- init_scan_code(REDKEY_R_SHIFT);
- init_scan_code(REDKEY_PAD_MULTIPLY);
- init_scan_code(REDKEY_L_ALT);
- init_scan_code(REDKEY_SPACE);
- init_scan_code(REDKEY_CAPS_LOCK);
- init_scan_code(REDKEY_F1);
- init_scan_code(REDKEY_F2);
- init_scan_code(REDKEY_F3);
- init_scan_code(REDKEY_F4);
- init_scan_code(REDKEY_F5);
- init_scan_code(REDKEY_F6);
- init_scan_code(REDKEY_F7);
- init_scan_code(REDKEY_F8);
- init_scan_code(REDKEY_F9);
- init_scan_code(REDKEY_F10);
- init_scan_code(REDKEY_NUM_LOCK);
- init_scan_code(REDKEY_SCROLL_LOCK);
- init_scan_code(REDKEY_PAD_7);
- init_scan_code(REDKEY_PAD_8);
- init_scan_code(REDKEY_PAD_9);
- init_scan_code(REDKEY_PAD_MINUS);
- init_scan_code(REDKEY_PAD_4);
- init_scan_code(REDKEY_PAD_5);
- init_scan_code(REDKEY_PAD_6);
- init_scan_code(REDKEY_PAD_PLUS);
- init_scan_code(REDKEY_PAD_1);
- init_scan_code(REDKEY_PAD_2);
- init_scan_code(REDKEY_PAD_3);
- init_scan_code(REDKEY_PAD_0);
- init_scan_code(REDKEY_PAD_POINT);
-
- init_scan_code(REDKEY_EUROPEAN);
- init_scan_code(REDKEY_F11);
- init_scan_code(REDKEY_F12);
-
- init_scan_code(REDKEY_JAPANESE_HIRAGANA_KATAKANA);
- init_scan_code(REDKEY_JAPANESE_BACKSLASH);
- init_scan_code(REDKEY_JAPANESE_HENKAN);
- init_scan_code(REDKEY_JAPANESE_MUHENKAN);
- init_scan_code(REDKEY_JAPANESE_YEN);
-
- init_korean_scan_code(REDKEY_KOREAN_HANGUL);
- init_korean_scan_code(REDKEY_KOREAN_HANGUL_HANJA);
-
- init_escape_scan_code(REDKEY_ESCAPE_BASE);
- init_escape_scan_code(REDKEY_PAD_ENTER);
- init_escape_scan_code(REDKEY_R_CTRL);
- init_escape_scan_code(REDKEY_MUTE);
- init_escape_scan_code(REDKEY_FAKE_L_SHIFT);
- init_escape_scan_code(REDKEY_VOLUME_DOWN);
- init_escape_scan_code(REDKEY_VOLUME_UP);
- init_escape_scan_code(REDKEY_PAD_DIVIDE);
- init_escape_scan_code(REDKEY_FAKE_R_SHIFT);
- init_escape_scan_code(REDKEY_CTRL_PRINT_SCREEN);
- init_escape_scan_code(REDKEY_R_ALT);
- init_escape_scan_code(REDKEY_CTRL_BREAK);
- init_escape_scan_code(REDKEY_HOME);
- init_escape_scan_code(REDKEY_UP);
- init_escape_scan_code(REDKEY_PAGEUP);
- init_escape_scan_code(REDKEY_LEFT);
- init_escape_scan_code(REDKEY_RIGHT);
- init_escape_scan_code(REDKEY_END);
- init_escape_scan_code(REDKEY_DOWN);
- init_escape_scan_code(REDKEY_PAGEDOWN);
- init_escape_scan_code(REDKEY_INSERT);
- init_escape_scan_code(REDKEY_DELETE);
- init_escape_scan_code(REDKEY_LEFT_CMD);
- init_escape_scan_code(REDKEY_RIGHT_CMD);
- init_escape_scan_code(REDKEY_MENU);
-
- init_pause_scan_code();
-}
-
-class InitGlobals {
-public:
- InitGlobals()
- {
- InputsChannel::init_scan_table();
- }
-};
-
-static InitGlobals init_globals;
-
-class InputsFactory: public ChannelFactory {
-public:
- InputsFactory() : ChannelFactory(SPICE_CHANNEL_INPUTS) {}
- virtual RedChannel* construct(RedClient& client, uint32_t id)
- {
- return new InputsChannel(client, id);
- }
-};
-
-static InputsFactory factory;
-
-ChannelFactory& InputsChannel::Factory()
-{
- return factory;
-}
diff --git a/client/inputs_channel.h b/client/inputs_channel.h
deleted file mode 100644
index cff3f904..00000000
--- a/client/inputs_channel.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_INPUTS_CHANNEL
-#define _H_INPUTS_CHANNEL
-
-#include "red_channel.h"
-#include "inputs_handler.h"
-
-class ChannelFactory;
-
-class InputsChannel: public RedChannel, public KeyHandler, public MouseHandler {
-public:
- InputsChannel(RedClient& client, uint32_t id);
- virtual ~InputsChannel();
-
- virtual void on_mouse_motion(int dx, int dy, int buttons_state);
- virtual void on_mouse_down(int button, int buttons_state);
- virtual void on_mouse_up(int button, int buttons_state);
- virtual void on_key_down(RedKey key);
- virtual void on_key_up(RedKey key);
- virtual void on_focus_in();
- virtual void on_focus_out();
-
- void on_mouse_position(int x, int y, int buttons_state, int display_id);
-
- static ChannelFactory& Factory();
-
-protected:
- virtual void on_connect();
- virtual void on_disconnect();
- virtual void on_migrate();
-
-private:
- void marshall_motion_event(SpiceMarshaller *marshaller);
- void marshall_position_event(SpiceMarshaller *marshaller);
- void set_local_modifiers();
-
- void handle_init(RedPeer::InMessage* message);
- void handle_modifiers(RedPeer::InMessage* message);
- void handle_motion_ack(RedPeer::InMessage* message);
-
- static uint32_t get_make_scan_code(RedKey key);
- static uint32_t get_break_scan_code(RedKey key);
- static void init_scan_code(int index);
- static void init_korean_scan_code(int index);
- static void init_escape_scan_code(int index);
- static void init_pause_scan_code();
- static void init_scan_table();
-
-private:
- Mutex _motion_lock;
- int _mouse_buttons_state;
- int _mouse_dx;
- int _mouse_dy;
- unsigned int _mouse_x;
- unsigned int _mouse_y;
- int _display_id;
- bool _active_motion;
- int _motion_count;
- uint32_t _modifiers;
- uint32_t _on_focus_modifiers;
- Mutex _update_modifiers_lock;
- bool _active_modifiers_event;
-
- struct KeyInfo {
- uint32_t make_scan;
- uint32_t break_scan;
- };
-
- static KeyInfo _scan_table[REDKEY_NUM_KEYS];
-
- friend class InitGlobals;
- friend class MotionMessage;
- friend class PositionMessage;
- friend class KeyModifiersEvent;
- friend class SetInputsHandlerEvent;
- friend class RemoveInputsHandlerEvent;
-};
-
-
-#endif
diff --git a/client/inputs_handler.h b/client/inputs_handler.h
deleted file mode 100644
index 060a4adc..00000000
--- a/client/inputs_handler.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_INPUTS_HANDLER
-#define _H_INPUTS_HANDLER
-
-#include "red_key.h"
-
-class KeyHandler {
-public:
- virtual ~KeyHandler() {}
- virtual void on_key_down(RedKey key) {}
- virtual void on_key_up(RedKey key) {}
- virtual void on_char(uint32_t ch) {}
- virtual void on_focus_in() {}
- virtual void on_focus_out() {}
- virtual bool permit_focus_loss() { return true;}
-};
-
-class MouseHandler {
-public:
- virtual ~MouseHandler() {}
- virtual void on_mouse_motion(int dx, int dy, int buttons_state) {}
- virtual void on_mouse_down(int button, int buttons_state) {}
- virtual void on_mouse_up(int button, int buttons_state) {}
-};
-
-#endif
diff --git a/client/jpeg_decoder.cpp b/client/jpeg_decoder.cpp
deleted file mode 100644
index c85902f5..00000000
--- a/client/jpeg_decoder.cpp
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-#include "jpeg_decoder.h"
-#include "debug.h"
-#include "utils.h"
-
-#if !defined(jpeg_boolean)
-#define jpeg_boolean boolean
-#endif
-
-static void op_begin_decode(SpiceJpegDecoder *decoder,
- uint8_t* data,
- int data_size,
- int* out_width,
- int* out_height)
-{
- JpegDecoder* _decoder = static_cast<JpegDecoder*>(decoder);
- _decoder->begin_decode(data, data_size, *out_width, *out_height);
-}
-
-static void op_decode(SpiceJpegDecoder *decoder,
- uint8_t* dest,
- int stride,
- int format)
-{
- JpegDecoder* _decoder = static_cast<JpegDecoder*>(decoder);
- _decoder->decode(dest, stride, format);
-}
-
-extern "C" {
-
- static void jpeg_decoder_init_source(j_decompress_ptr cinfo)
- {
- }
-
- static SPICE_GNUC_NORETURN jpeg_boolean jpeg_decoder_fill_input_buffer(j_decompress_ptr cinfo)
- {
- PANIC("no more data for jpeg");
- }
-
- static void jpeg_decoder_skip_input_data(j_decompress_ptr cinfo, long num_bytes)
- {
- ASSERT(num_bytes < (long)cinfo->src->bytes_in_buffer);
- cinfo->src->next_input_byte += num_bytes;
- cinfo->src->bytes_in_buffer -= num_bytes;
- }
-
- static void jpeg_decoder_term_source (j_decompress_ptr cinfo)
- {
- return;
- }
-}
-
-
-JpegDecoder::JpegDecoder()
- : _data (NULL)
- , _data_size (0)
-{
- _cinfo.err = jpeg_std_error(&_jerr);
- jpeg_create_decompress(&_cinfo);
-
- _cinfo.src = &_jsrc;
- _cinfo.src->init_source = jpeg_decoder_init_source;
- _cinfo.src->fill_input_buffer = jpeg_decoder_fill_input_buffer;
- _cinfo.src->skip_input_data = jpeg_decoder_skip_input_data;
- _cinfo.src->resync_to_restart = jpeg_resync_to_restart;
- _cinfo.src->term_source = jpeg_decoder_term_source;
-
- static SpiceJpegDecoderOps decoder_ops = {
- op_begin_decode,
- op_decode,
- };
-
- ops = &decoder_ops;
-}
-
-JpegDecoder::~JpegDecoder()
-{
- jpeg_destroy_decompress(&_cinfo);
-}
-
-void JpegDecoder::begin_decode(uint8_t* data, int data_size, int& out_width, int& out_height)
-{
- ASSERT(data);
- ASSERT(data_size);
-
- if (_data) {
- jpeg_abort_decompress(&_cinfo);
- }
-
- _data = data;
- _data_size = data_size;
-
- _cinfo.src->next_input_byte = _data;
- _cinfo.src->bytes_in_buffer = _data_size;
-
- jpeg_read_header(&_cinfo, TRUE);
-
- _cinfo.out_color_space = JCS_RGB;
- _width = _cinfo.image_width;
- _height = _cinfo.image_height;
-
- out_width = _width;
- out_height = _height;
-}
-
-void JpegDecoder::decode(uint8_t *dest, int stride, int format)
-{
- uint8_t* scan_line = new uint8_t[_width*3];
- RGBConverter* rgb_converter;
-
- switch (format) {
- case SPICE_BITMAP_FMT_24BIT:
- rgb_converter = &_rgb2bgr;
- break;
- case SPICE_BITMAP_FMT_32BIT:
- rgb_converter = &_rgb2bgrx;
- break;
- default:
- THROW("bad bitmap format, %d", format);
- }
-
- jpeg_start_decompress(&_cinfo);
-
- for (int row = 0; row < _height; row++) {
- jpeg_read_scanlines(&_cinfo, &scan_line, 1);
- rgb_converter->convert(scan_line, dest, _width);
- dest += stride;
- }
-
- delete [] scan_line;
-
- jpeg_finish_decompress(&_cinfo);
-}
diff --git a/client/jpeg_decoder.h b/client/jpeg_decoder.h
deleted file mode 100644
index ae76f504..00000000
--- a/client/jpeg_decoder.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
-/*
- Copyright (C) 2010 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_JPEG_DECODER
-#define _H_JPEG_DECODER
-
-#include "common.h"
-#include "red_canvas_base.h"
-
-#if defined(WIN32) && !defined(__MINGW32__)
-/* We need some hacks to avoid warnings from the jpeg headers */
-#define XMD_H
-#undef FAR
-#endif
-
-extern "C" {
-#include <jpeglib.h>
-#ifdef HAVE_STDLIB_H
-/* on mingw, there is a hack,
- and we also include config.h from spice-common, which redefine it */
-#undef HAVE_STDLIB_H
-#endif
-}
-
-class RGBConverter {
-public:
- virtual ~RGBConverter() {}
- virtual void convert(uint8_t* src, uint8_t* dest, int width) = 0;
-};
-
-class RGBToBGRConverter : public RGBConverter {
-public:
- void convert(uint8_t* src, uint8_t* dest, int width)
- {
- for (int x = 0; x < width; x++) {
- *dest++ = src[2];
- *dest++ = src[1];
- *dest++ = src[0];
- src += 3;
- }
- }
-};
-
-class RGBToBGRXConverter : public RGBConverter {
-public:
- void convert(uint8_t* src, uint8_t* dest, int width)
- {
- for (int x = 0; x < width; x++) {
- *dest++ = src[2];
- *dest++ = src[1];
- *dest++ = src[0];
- *dest++ = 0;
- src += 3;
- }
- }
-};
-
-class JpegDecoder : public SpiceJpegDecoder {
-public:
- JpegDecoder();
- ~JpegDecoder();
-
- void begin_decode(uint8_t* data, int data_size, int& out_width, int& out_height);
- /* format is SPICE_BITMAP_FMT_<X> for the dest; currently, only
- x=32BIT and x=24BIT are supported */
- void decode(uint8_t* dest, int stride, int format);
-
-private:
- struct jpeg_decompress_struct _cinfo;
- struct jpeg_error_mgr _jerr;
- struct jpeg_source_mgr _jsrc;
-
- uint8_t* _data;
- int _data_size;
- int _width;
- int _height;
-
- RGBToBGRConverter _rgb2bgr;
- RGBToBGRXConverter _rgb2bgrx;
-};
-#endif
diff --git a/client/menu.cpp b/client/menu.cpp
deleted file mode 100644
index ebbd323a..00000000
--- a/client/menu.cpp
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-#include "menu.h"
-#include "utils.h"
-#include "debug.h"
-
-Menu::Menu(CommandTarget& target, const std::string& name, int id)
- : _refs (1)
- , _target (target)
- , _name (name)
- , _id (id)
-{
-}
-
-Menu::~Menu()
-{
- clear();
-}
-
-void Menu::add_item(MenuItem& item)
-{
- int pos = _items.size();
- _items.resize(pos + 1);
- _items[pos] = item;
-}
-
-void Menu::add_command(const std::string& name, int cmd_id, int state)
-{
- MenuCommand* cmd = new MenuCommand(name, cmd_id, state);
- MenuItem item;
- item.type = MENU_ITEM_TYPE_COMMAND;
- item.obj = cmd;
- add_item(item);
-}
-
-void Menu::add_separator()
-{
- MenuItem item;
- item.type = MENU_ITEM_TYPE_SEPARATOR;
- item.obj = NULL;
- add_item(item);
-}
-
-void Menu::add_sub(Menu* menu)
-{
- ASSERT(menu);
- MenuItem item;
- item.type = MENU_ITEM_TYPE_MENU;
- item.obj = menu->ref();
- add_item(item);
-}
-
-void Menu::remove_command(int cmd_id)
-{
- for (unsigned int i = 0; i < _items.size(); i++) {
- if (_items[i].type == MENU_ITEM_TYPE_COMMAND &&
- ((MenuCommand*)_items[i].obj)->get_cmd_id() == cmd_id) {
- delete (MenuCommand*)_items[i].obj;
- _items.erase(_items.begin() + i);
- return;
- }
- }
-}
-
-void Menu::remove_sub(Menu* menu)
-{
- for (unsigned int i = 0; i < _items.size(); i++) {
- if (_items[i].type == MENU_ITEM_TYPE_MENU && (Menu*)_items[i].obj == menu) {
- ((Menu*)_items[i].obj)->unref();
- _items.erase(_items.begin() + i);
- return;
- }
- }
-}
-
-Menu::ItemType Menu::item_type_at(int pos)
-{
- if (pos >= (int)_items.size()) {
- return MENU_ITEM_TYPE_INVALID;
- }
- return _items[pos].type;
-}
-
-void Menu::command_at(int pos, std::string& name, int& cmd_id, int& state)
-{
- if (_items[pos].type != MENU_ITEM_TYPE_COMMAND) {
- THROW("incorrect item type");
- }
- MenuCommand* cmd = (MenuCommand*)_items[pos].obj;
- name = cmd->get_name();
- cmd_id = cmd->get_cmd_id();
- state = cmd->get_state();
-}
-
-Menu* Menu::sub_at(int pos)
-{
- if (_items[pos].type != MENU_ITEM_TYPE_MENU) {
- THROW("incorrect item type");
- }
- return ((Menu*)_items[pos].obj)->ref();
-}
-
-Menu* Menu::find_sub(int id)
-{
- Menu* sub;
-
- if (_id == id) {
- return ref();
- }
- for (unsigned int i = 0; i < _items.size(); i++) {
- if (_items[i].type == MENU_ITEM_TYPE_MENU && (sub = ((Menu*)_items[i].obj)->find_sub(id))) {
- return sub;
- }
- }
- return NULL;
-}
-
-void Menu::clear()
-{
- for (unsigned int i = 0; i < _items.size(); i++) {
- if (_items[i].type == MENU_ITEM_TYPE_COMMAND) {
- delete (MenuCommand*)_items[i].obj;
- } else if (_items[i].type == MENU_ITEM_TYPE_MENU) {
- ((Menu*)_items[i].obj)->unref();
- }
- }
- _items.clear();
-}
diff --git a/client/menu.h b/client/menu.h
deleted file mode 100644
index 280cf388..00000000
--- a/client/menu.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_MENU
-#define _H_MENU
-
-class CommandTarget {
-public:
- virtual void do_command(int command) = 0;
- virtual ~CommandTarget() {}
-};
-
-class Menu {
-public:
- Menu(CommandTarget& target, const std::string& name, int id = 0);
-
- enum ItemType {
- MENU_ITEM_TYPE_INVALID,
- MENU_ITEM_TYPE_COMMAND,
- MENU_ITEM_TYPE_MENU,
- MENU_ITEM_TYPE_SEPARATOR,
- };
-
- enum ItemState {
- MENU_ITEM_STATE_CHECKED = 1 << 0,
- MENU_ITEM_STATE_DIM = 1 << 1,
- };
-
- Menu* ref() { _refs++; return this;}
- void unref() { if (!--_refs) delete this;}
-
- void set_name(const std::string& name) { _name = name;}
- const std::string& get_name() { return _name;}
- CommandTarget& get_target() { return _target;}
- int get_id() { return _id;}
-
- void add_command(const std::string& name, int cmd_id, int state = 0);
- void add_separator();
- void add_sub(Menu* sub);
-
- void remove_command(int cmd_id);
- void remove_sub(Menu* menu);
-
- ItemType item_type_at(int pos);
- void command_at(int pos, std::string& name, int& cmd_id, int& state);
- Menu* sub_at(int pos);
- Menu* find_sub(int id);
-
- void clear();
-
-private:
- virtual ~Menu();
-
- class MenuCommand {
- public:
- MenuCommand(const std::string& name, int cmd_id, int state)
- : _name (name)
- , _cmd_id (cmd_id)
- , _state (state)
- {
- }
-
- const std::string& get_name() { return _name;}
- int get_cmd_id() { return _cmd_id;}
- int get_state() { return _state;}
-
- private:
- std::string _name;
- int _cmd_id;
- int _state;
- };
-
- struct MenuItem {
- ItemType type;
- void *obj;
- };
-
- void add_item(MenuItem& item);
-
-private:
- int _refs;
- CommandTarget& _target;
- std::string _name;
- std::vector<MenuItem> _items;
- int _id;
-};
-
-#endif
diff --git a/client/mjpeg_decoder.cpp b/client/mjpeg_decoder.cpp
deleted file mode 100644
index 28d4f082..00000000
--- a/client/mjpeg_decoder.cpp
+++ /dev/null
@@ -1,277 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
-/*
- Copyright (C) 2010 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-#include "debug.h"
-#include "utils.h"
-#include "mjpeg_decoder.h"
-
-#if !defined(jpeg_boolean)
-#define jpeg_boolean boolean
-#endif
-
-enum {
- STATE_READ_HEADER,
- STATE_START_DECOMPRESS,
- STATE_READ_SCANLINES,
- STATE_FINISH_DECOMPRESS
-};
-
-extern "C" {
-
- static void init_source(j_decompress_ptr cinfo)
- {
- }
-
- static jpeg_boolean fill_input_buffer(j_decompress_ptr cinfo)
- {
- return FALSE;
- }
-
- void mjpeg_skip_input_data(j_decompress_ptr cinfo, long num_bytes)
- {
- MJpegDecoder *decoder = (MJpegDecoder *)cinfo;
- if (num_bytes > 0) {
- if (cinfo->src->bytes_in_buffer >= (size_t)num_bytes) {
- cinfo->src->next_input_byte += (size_t) num_bytes;
- cinfo->src->bytes_in_buffer -= (size_t) num_bytes;
- } else {
- decoder->_extra_skip = num_bytes - cinfo->src->bytes_in_buffer;
- cinfo->src->bytes_in_buffer = 0;
- }
- }
- }
-
- static void term_source (j_decompress_ptr cinfo)
- {
- return;
- }
-}
-
-MJpegDecoder::MJpegDecoder(int width, int height,
- int stride,
- uint8_t *frame,
- bool back_compat) :
- _data(NULL)
- , _data_size(0)
- , _data_start(0)
- , _data_end(0)
- , _extra_skip(0)
- , _width(width)
- , _height(height)
- , _stride(stride)
- , _frame(frame)
- , _back_compat(back_compat)
- , _y(0)
- , _state(0)
-{
- memset(&_cinfo, 0, sizeof(_cinfo));
- _cinfo.err = jpeg_std_error (&_jerr);
- jpeg_create_decompress (&_cinfo);
-
- _cinfo.src = &_jsrc;
- _cinfo.src->init_source = init_source;
- _cinfo.src->fill_input_buffer = fill_input_buffer;
- _cinfo.src->skip_input_data = mjpeg_skip_input_data;
- _cinfo.src->resync_to_restart = jpeg_resync_to_restart;
- _cinfo.src->term_source = term_source;
-
- _scanline = new uint8_t[width * 3];
-}
-
-MJpegDecoder::~MJpegDecoder()
-{
- jpeg_destroy_decompress(&_cinfo);
- delete [] _scanline;
- if (_data) {
- delete [] _data;
- }
-}
-
-void MJpegDecoder::convert_scanline(void)
-{
- uint32_t *row;
- uint32_t c;
- uint8_t *s;
- unsigned x;
-
- ASSERT(_width % 2 == 0);
- ASSERT(_height % 2 == 0);
-
- row = (uint32_t *)(_frame + _y * _stride);
- s = _scanline;
-
-
- if (_back_compat) {
- /* We need to check for the old major and for backwards compat
- a) swap r and b (done)
- b) to-yuv with right values and then from-yuv with old wrong values (TODO)
- */
- for (x = 0; x < _width; x++) {
- c = s[2] << 16 | s[1] << 8 | s[0];
- s += 3;
- *row++ = c;
- }
- } else {
- for (x = 0; x < _width; x++) {
- c = s[0] << 16 | s[1] << 8 | s[2];
- s += 3;
- *row++ = c;
- }
- }
-}
-
-void MJpegDecoder::append_data(uint8_t *data, size_t length)
-{
- uint8_t *new_data;
- size_t data_len;
-
- if (length == 0) {
- return;
- }
-
- if (_data_size - _data_end < length) {
- /* Can't fits in tail, need to make space */
-
- data_len = _data_end - _data_start;
- if (_data_size - data_len < length) {
- /* Can't fit at all, grow a bit */
- _data_size = _data_size + length * 2;
- new_data = new uint8_t[_data_size];
- memcpy (new_data, _data + _data_start, data_len);
- delete [] _data;
- _data = new_data;
- } else {
- /* Just needs to compact */
- memmove (_data, _data + _data_start, data_len);
- }
- _data_start = 0;
- _data_end = data_len;
- }
-
- memcpy (_data + _data_end, data, length);
- _data_end += length;
-}
-
-bool MJpegDecoder::decode_data(uint8_t *data, size_t length)
-{
- bool got_picture;
- int res;
-
- got_picture = false;
-
- if (_extra_skip > 0) {
- if (_extra_skip >= length) {
- _extra_skip -= length;
- return false;
- } else {
- data += _extra_skip;
- length -= _extra_skip;
- _extra_skip = 0;
- }
- }
-
- if (_data_end - _data_start == 0) {
- /* No current data, pass in without copy */
-
- _jsrc.next_input_byte = data;
- _jsrc.bytes_in_buffer = length;
- } else {
- /* Need to combine the new and old data */
- append_data(data, length);
-
- _jsrc.next_input_byte = _data + _data_start;
- _jsrc.bytes_in_buffer = _data_end - _data_start;
- }
-
- switch (_state) {
- case STATE_READ_HEADER:
- res = jpeg_read_header(&_cinfo, TRUE);
- if (res == JPEG_SUSPENDED) {
- break;
- }
-
- _cinfo.do_fancy_upsampling = FALSE;
- _cinfo.do_block_smoothing = FALSE;
- _cinfo.out_color_space = JCS_RGB;
-
- PANIC_ON(_cinfo.image_width != _width);
- PANIC_ON(_cinfo.image_height != _height);
-
- _state = STATE_START_DECOMPRESS;
-
- /* fall through */
- case STATE_START_DECOMPRESS:
- res = jpeg_start_decompress (&_cinfo);
-
- if (!res) {
- break;
- }
-
- _state = STATE_READ_SCANLINES;
-
- /* fall through */
- case STATE_READ_SCANLINES:
- res = 0;
- while (_y < _height) {
- res = jpeg_read_scanlines(&_cinfo, &_scanline, 1);
-
- if (res == 0) {
- break;
- }
-
- convert_scanline();
- _y++;
- }
- if (res == 0) {
- break;
- }
-
- _state = STATE_FINISH_DECOMPRESS;
-
- /* fall through */
- case STATE_FINISH_DECOMPRESS:
- res = jpeg_finish_decompress (&_cinfo);
-
- if (!res) {
- break;
- }
-
- _y = 0;
- _state = STATE_READ_HEADER;
- got_picture = true;
-
- break;
- }
-
- if (_jsrc.next_input_byte == data) {
- /* We read directly from the user, store remaining data in
- buffer for next time */
- size_t read_size = _jsrc.next_input_byte - data;
-
- append_data(data + read_size, length - read_size);
- } else {
- _data_start = _jsrc.next_input_byte - _data;
- _data_end = _data_start + _jsrc.bytes_in_buffer;
- }
-
- return got_picture;
-}
diff --git a/client/mjpeg_decoder.h b/client/mjpeg_decoder.h
deleted file mode 100644
index 8455e0d1..00000000
--- a/client/mjpeg_decoder.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
-/*
- Copyright (C) 2010 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_MJPEG_DECODER
-#define _H_MJPEG_DECODER
-
-#include "common.h"
-
-#ifdef WIN32
-/* We need some hacks to avoid warnings from the jpeg headers */
-#define XMD_H
-#undef FAR
-#endif
-extern "C" {
-#include <jpeglib.h>
-}
-
-extern "C" {
- void mjpeg_skip_input_data(j_decompress_ptr cinfo, long num_bytes);
-}
-
-class MJpegDecoder {
-public:
- MJpegDecoder(int width, int height, int stride,
- uint8_t *frame, bool back_compat);
- ~MJpegDecoder();
-
- bool decode_data(uint8_t *data, size_t length);
-
-private:
-
- friend void mjpeg_skip_input_data(j_decompress_ptr cinfo, long num_bytes);
-
- void convert_scanline(void);
- void append_data(uint8_t *data, size_t length);
-
- struct jpeg_decompress_struct _cinfo;
- struct jpeg_error_mgr _jerr;
- struct jpeg_source_mgr _jsrc;
-
- uint8_t *_data;
- size_t _data_size;
- size_t _data_start;
- size_t _data_end;
- size_t _extra_skip;
-
- unsigned _width;
- unsigned _height;
- int _stride;
- uint8_t *_frame;
- bool _back_compat;
-
- unsigned _y;
- uint8_t *_scanline;
-
- int _state;
-};
-
-#endif
diff --git a/client/monitor.h b/client/monitor.h
deleted file mode 100644
index bbaaf17c..00000000
--- a/client/monitor.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_MONITOR
-#define _H_MONITOR
-
-#include "common/draw.h"
-
-class Monitor {
-public:
- Monitor(int id);
-
- int get_id() { return _id;}
- bool is_free() { return _free;}
- void set_free() {_free = true;}
- void set_used() {_free = false;}
-
- void set_mode(int width, int height);
- void restore();
- virtual int get_depth() = 0;
- virtual SpicePoint get_position() = 0;
- virtual SpicePoint get_size() const = 0;
- virtual bool is_out_of_sync() = 0;
- virtual int get_screen_id() = 0;
-
- static bool is_self_change();
-
-protected:
- virtual ~Monitor() {}
- virtual void do_set_mode(int width, int height) = 0;
- virtual void do_restore() = 0;
-
-private:
- int _id;
- bool _free;
-
-protected:
- static uint32_t self_monitors_change;
-
- friend class Platform;
-};
-
-#endif
diff --git a/client/pixels_source.h b/client/pixels_source.h
deleted file mode 100644
index 55841a65..00000000
--- a/client/pixels_source.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_PIXELS_SOURCE
-#define _H_PIXELS_SOURCE
-
-#include "common/draw.h"
-
-#define PIXELES_SOURCE_OPAQUE_SIZE (20 * sizeof(void*))
-
-class PixelsSource {
-public:
- PixelsSource();
- virtual ~PixelsSource();
-
- virtual SpicePoint get_size() = 0;
- void set_origin(int x, int y) { _origin.x = x; _origin.y = y;}
- const SpicePoint& get_origin() { return _origin;}
-
-protected:
- const uint8_t* get_opaque() const { return _opaque;}
-
-private:
- SpicePoint _origin;
- uint8_t _opaque[PIXELES_SOURCE_OPAQUE_SIZE];
-
- friend class RedDrawable;
-};
-
-class ImageFromRes: public PixelsSource {
-public:
- ImageFromRes(int res_id);
- virtual ~ImageFromRes();
- virtual SpicePoint get_size();
-};
-
-class AlphaImageFromRes: public PixelsSource {
-public:
- AlphaImageFromRes(int res_id);
- virtual ~AlphaImageFromRes();
- virtual SpicePoint get_size();
-};
-
-#endif
diff --git a/client/platform.h b/client/platform.h
deleted file mode 100644
index 7b543e9c..00000000
--- a/client/platform.h
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_PLATFORM
-#define _H_PLATFORM
-
-#include "cursor.h"
-#include "process_loop.h"
-#include "event_sources.h"
-#include "process_loop.h"
-
-class WaveRecordAbstract;
-class WavePlaybackAbstract;
-class Icon;
-
-class Monitor;
-typedef std::list<Monitor*> MonitorsList;
-
-class Platform {
-public:
- static void init();
- static void set_process_loop(ProcessLoop& main_process_loop);
- static void msleep(unsigned int millisec);
- static void yield();
- static uint64_t get_monolithic_time();
- static void get_temp_dir(std::string& path);
- static void get_app_data_dir(std::string& path, const std::string& app_name);
- static void path_append(std::string& path, const std::string& partial_path);
- static uint64_t get_process_id();
- static uint64_t get_thread_id();
- static SPICE_GNUC_PRINTF(1, 2) void term_printf(const char* format, ...);
- static void error_beep();
-
- static const MonitorsList& init_monitors();
- static void destroy_monitors();
- static bool is_monitors_pos_valid();
-
- static void send_quit_request();
-
- enum ThreadPriority {
- PRIORITY_INVALID,
- PRIORITY_TIME_CRITICAL,
- PRIORITY_HIGH,
- PRIORITY_ABOVE_NORMAL,
- PRIORITY_NORMAL,
- PRIORITY_BELOW_NORMAL,
- PRIORITY_LOW,
- PRIORITY_IDLE,
- };
-
- static void set_thread_priority(void *thread, ThreadPriority priority);
-
- class RecordClient;
- static WaveRecordAbstract* create_recorder(RecordClient& client,
- uint32_t samples_per_sec,
- uint32_t bits_per_sample,
- uint32_t channels,
- uint32_t frame_size);
- static WavePlaybackAbstract* create_player(uint32_t samples_per_sec,
- uint32_t bits_per_sample,
- uint32_t channels,
- uint32_t frame_size);
-
- enum {
- SCROLL_LOCK_MODIFIER_SHIFT,
- NUM_LOCK_MODIFIER_SHIFT,
- CAPS_LOCK_MODIFIER_SHIFT,
-
- SCROLL_LOCK_MODIFIER = (1 << SCROLL_LOCK_MODIFIER_SHIFT),
- NUM_LOCK_MODIFIER = (1 << NUM_LOCK_MODIFIER_SHIFT),
- CAPS_LOCK_MODIFIER = (1 << CAPS_LOCK_MODIFIER_SHIFT),
- };
-
- static uint32_t get_keyboard_lock_modifiers();
- static void set_keyboard_lock_modifiers(uint32_t modifiers);
-
- enum {
- L_SHIFT_MODIFIER_SHIFT,
- R_SHIFT_MODIFIER_SHIFT,
- L_CTRL_MODIFIER_SHIFT,
- R_CTRL_MODIFIER_SHIFT,
- L_ALT_MODIFIER_SHIFT,
- R_ALT_MODIFIER_SHIFT,
-
- L_SHIFT_MODIFIER = (1 << L_SHIFT_MODIFIER_SHIFT),
- R_SHIFT_MODIFIER = (1 << R_SHIFT_MODIFIER_SHIFT),
- L_CTRL_MODIFIER = (1 << L_CTRL_MODIFIER_SHIFT),
- R_CTRL_MODIFIER = (1 << R_CTRL_MODIFIER_SHIFT),
- L_ALT_MODIFIER = (1 << L_ALT_MODIFIER_SHIFT),
- R_ALT_MODIFIER = (1 << R_ALT_MODIFIER_SHIFT),
- };
-
- static uint32_t get_keyboard_modifiers();
-
- static void reset_cursor_pos();
-
- static LocalCursor* create_local_cursor(CursorData* cursor_data);
- static LocalCursor* create_inactive_cursor();
- static LocalCursor* create_default_cursor();
-
- static Icon* load_icon(int id);
-
- class EventListener;
- static void set_event_listener(EventListener* listener);
-
- class DisplayModeListener;
- static void set_display_mode_listner(DisplayModeListener* listener);
-
- class ClipboardListener;
- static void set_clipboard_listener(ClipboardListener* listener);
-
- static bool on_clipboard_grab(uint32_t *types, uint32_t type_count);
- static bool on_clipboard_notify(uint32_t type, const uint8_t* data, int32_t size);
- static bool on_clipboard_request(uint32_t type);
- static void on_clipboard_release();
-
- enum { owner_none, owner_guest, owner_client };
-
- static void set_clipboard_owner(int new_owner);
- static int get_clipboard_owner() { return _clipboard_owner; }
-
-private:
- static void set_clipboard_owner_unlocked(int new_owner);
-
- static int _clipboard_owner;
-};
-
-class Platform::EventListener {
-public:
- virtual ~EventListener() {}
- virtual void on_app_activated() = 0;
- virtual void on_app_deactivated() = 0;
- virtual void on_monitors_change() = 0;
-};
-
-class Platform::ClipboardListener {
-public:
- virtual ~ClipboardListener() {}
- virtual void on_clipboard_grab(uint32_t *types, uint32_t type_count) = 0;
- virtual void on_clipboard_request(uint32_t type) = 0;
- virtual void on_clipboard_notify(uint32_t type, uint8_t* data, int32_t size) = 0;
- virtual void on_clipboard_release() = 0;
-};
-
-class Platform::RecordClient {
-public:
- virtual ~RecordClient() {}
- virtual void add_event_source(EventSources::File& evnet_source) = 0;
- virtual void remove_event_source(EventSources::File& evnet_source) = 0;
- virtual void add_event_source(EventSources::Trigger& evnet_source) = 0;
- virtual void remove_event_source(EventSources::Trigger& evnet_source) = 0;
- virtual void push_frame(uint8_t *frame) = 0;
-};
-
-class Platform::DisplayModeListener {
-public:
- virtual ~DisplayModeListener() {}
- virtual void on_display_mode_change() = 0;
-};
-
-class NamedPipe {
-public:
- typedef unsigned long ListenerRef;
- typedef unsigned long ConnectionRef;
- static const ConnectionRef INVALID_CONNECTION = ~0;
-
- class ConnectionInterface {
- public:
- ConnectionInterface() : _opaque (INVALID_CONNECTION) {}
- virtual ~ConnectionInterface() {}
- virtual void bind(ConnectionRef conn_ref) = 0;
- virtual void on_data() = 0;
-
- protected:
- ConnectionRef _opaque;
- };
-
- class ListenerInterface {
- public:
- virtual ~ListenerInterface() {}
- virtual ConnectionInterface &create() = 0;
- };
-
- static ListenerRef create(const char *name, ListenerInterface& listener_interface);
- static void destroy(ListenerRef listener_ref);
- static void destroy_connection(ConnectionRef conn_ref);
- static int32_t read(ConnectionRef conn_ref, uint8_t *buf, int32_t size);
- static int32_t write(ConnectionRef conn_ref, const uint8_t *buf, int32_t size);
-};
-
-#endif
diff --git a/client/playback_channel.cpp b/client/playback_channel.cpp
deleted file mode 100644
index 9f8c334c..00000000
--- a/client/playback_channel.cpp
+++ /dev/null
@@ -1,364 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-#include "red_client.h"
-#include "audio_channels.h"
-#include "audio_devices.h"
-
-//#define WAVE_CAPTURE
-#ifdef WAVE_CAPTURE
-
-#include <fcntl.h>
-
-#define WAVE_BUF_SIZE (1024 * 1024 * 20)
-
-typedef struct __attribute__ ((__packed__)) ChunkHeader {
- uint32_t id;
- uint32_t size;
-} ChunkHeader;
-
-typedef struct __attribute__ ((__packed__)) FormatInfo {
- uint16_t compression_code;
- uint16_t num_channels;
- uint32_t sample_rate;
- uint32_t average_bytes_per_second;
- uint16_t block_align;
- uint16_t bits_per_sample;
- //uint16_t extra_format_bytes;
- //uint8_t extra[0];
-} FormatInfo;
-
-static uint8_t* wave_buf = NULL;
-static uint8_t* wave_now = NULL;
-static uint8_t* wave_end = NULL;
-static bool wave_blocked = false;
-
-static void write_all(int fd, uint8_t* data, uint32_t size)
-{
- while (size) {
- int n = write(fd, data, size);
- if (n == -1) {
- if (errno != EINTR) {
- throw Exception(fmt("%s: failed") % __FUNCTION__);
- }
- } else {
- data += n;
- size -= n;
- }
- }
-}
-
-static void write_wave()
-{
- static uint32_t file_id = 0;
- char file_name[100];
- ChunkHeader header;
- FormatInfo format;
-
- if (wave_buf == wave_now) {
- return;
- }
-
- sprintf(file_name, "/tmp/%u.wav", ++file_id);
- int fd = open(file_name, O_CREAT | O_TRUNC | O_WRONLY, 0644);
- if (fd == -1) {
- DBG(0, fmt("open file %s failed") % file_name);
- return;
- }
-
- memcpy((char *)&header.id, "RIFF", 4);
- header.size = 4;
- write_all(fd, (uint8_t *)&header, sizeof(header));
- write_all(fd, (uint8_t *)"WAVE", 4);
-
- memcpy((char *)&header.id, "fmt ", 4);
- header.size = sizeof(format);
- write_all(fd, (uint8_t *)&header, sizeof(header));
-
- format.compression_code = 1;
- format.num_channels = 2;
- format.sample_rate = 44100;
- format.average_bytes_per_second = format.sample_rate * 4;
- format.block_align = 4;
- format.bits_per_sample = 16;
- write_all(fd, (uint8_t *)&format, sizeof(format));
-
- memcpy((char *)&header.id, "data", 4);
- header.size = wave_now - wave_buf;
- write_all(fd, (uint8_t *)&header, sizeof(header));
- write_all(fd, wave_buf, header.size);
- close(fd);
-}
-
-static void init_wave()
-{
- if (!wave_buf) {
- wave_buf = new uint8_t[WAVE_BUF_SIZE];
- }
- wave_now = wave_buf;
- wave_end = wave_buf + WAVE_BUF_SIZE;
-}
-
-static void start_wave()
-{
- wave_blocked = false;
- wave_now = wave_buf;
-}
-
-static void put_wave_data(uint8_t *data, uint32_t size)
-{
- if (wave_blocked || size > wave_end - wave_now) {
- wave_blocked = true;
- return;
- }
- memcpy((void *)wave_now, (void *)data, size);
- wave_now += size;
-}
-
-static void end_wave()
-{
- write_wave();
-}
-
-#endif
-
-class PlaybackHandler: public MessageHandlerImp<PlaybackChannel, SPICE_CHANNEL_PLAYBACK> {
-public:
- PlaybackHandler(PlaybackChannel& channel)
- : MessageHandlerImp<PlaybackChannel, SPICE_CHANNEL_PLAYBACK>(channel) {}
-};
-
-PlaybackChannel::PlaybackChannel(RedClient& client, uint32_t id)
- : RedChannel(client, SPICE_CHANNEL_PLAYBACK, id, new PlaybackHandler(*this),
- Platform::PRIORITY_HIGH)
- , _wave_player (NULL)
- , _mode (SPICE_AUDIO_DATA_MODE_INVALID)
- , _codec(NULL)
- , _playing (false)
-{
-#ifdef WAVE_CAPTURE
- init_wave();
-#endif
- PlaybackHandler* handler = static_cast<PlaybackHandler*>(get_message_handler());
-
- handler->set_handler(SPICE_MSG_MIGRATE, &PlaybackChannel::handle_migrate);
- handler->set_handler(SPICE_MSG_SET_ACK, &PlaybackChannel::handle_set_ack);
- handler->set_handler(SPICE_MSG_PING, &PlaybackChannel::handle_ping);
- handler->set_handler(SPICE_MSG_WAIT_FOR_CHANNELS, &PlaybackChannel::handle_wait_for_channels);
- handler->set_handler(SPICE_MSG_DISCONNECTING, &PlaybackChannel::handle_disconnect);
- handler->set_handler(SPICE_MSG_NOTIFY, &PlaybackChannel::handle_notify);
-
- handler->set_handler(SPICE_MSG_PLAYBACK_MODE, &PlaybackChannel::handle_mode);
-
- if (snd_codec_is_capable(SPICE_AUDIO_DATA_MODE_CELT_0_5_1, SND_CODEC_ANY_FREQUENCY))
- set_capability(SPICE_PLAYBACK_CAP_CELT_0_5_1);
- if (snd_codec_is_capable(SPICE_AUDIO_DATA_MODE_OPUS, SND_CODEC_ANY_FREQUENCY))
- set_capability(SPICE_PLAYBACK_CAP_OPUS);
-}
-
-void PlaybackChannel::clear()
-{
- if (_wave_player) {
- _playing = false;
- _wave_player->stop();
- delete _wave_player;
- _wave_player = NULL;
- }
- _mode = SPICE_AUDIO_DATA_MODE_INVALID;
-
- snd_codec_destroy(&_codec);
-}
-
-void PlaybackChannel::on_disconnect()
-{
- clear();
-}
-
-PlaybackChannel::~PlaybackChannel(void)
-{
- clear();
-}
-
-bool PlaybackChannel::abort(void)
-{
- return (!_wave_player || _wave_player->abort()) && RedChannel::abort();
-}
-
-void PlaybackChannel::set_data_handler()
-{
- PlaybackHandler* handler = static_cast<PlaybackHandler*>(get_message_handler());
-
- if (_mode == SPICE_AUDIO_DATA_MODE_RAW) {
- handler->set_handler(SPICE_MSG_PLAYBACK_DATA, &PlaybackChannel::handle_raw_data);
- } else if (snd_codec_is_capable(_mode, SND_CODEC_ANY_FREQUENCY)) {
- handler->set_handler(SPICE_MSG_PLAYBACK_DATA, &PlaybackChannel::handle_compressed_data);
- } else {
- THROW("invalid mode");
- }
-
-}
-
-void PlaybackChannel::handle_mode(RedPeer::InMessage* message)
-{
- SpiceMsgPlaybackMode* playback_mode = (SpiceMsgPlaybackMode*)message->data();
- if (playback_mode->mode != SPICE_AUDIO_DATA_MODE_RAW
- && !snd_codec_is_capable(playback_mode->mode, SND_CODEC_ANY_FREQUENCY) ) {
- THROW("invalid mode");
- }
-
- _mode = playback_mode->mode;
- if (_playing) {
- set_data_handler();
- return;
- }
-
- PlaybackHandler* handler = static_cast<PlaybackHandler*>(get_message_handler());
- handler->set_handler(SPICE_MSG_PLAYBACK_START, &PlaybackChannel::handle_start);
-}
-
-void PlaybackChannel::null_handler(RedPeer::InMessage* message)
-{
-}
-
-void PlaybackChannel::disable()
-{
- PlaybackHandler* handler = static_cast<PlaybackHandler*>(get_message_handler());
-
- handler->set_handler(SPICE_MSG_PLAYBACK_START, &PlaybackChannel::null_handler);
- handler->set_handler(SPICE_MSG_PLAYBACK_STOP, &PlaybackChannel::null_handler);
- handler->set_handler(SPICE_MSG_PLAYBACK_MODE, &PlaybackChannel::null_handler);
- handler->set_handler(SPICE_MSG_PLAYBACK_DATA, &PlaybackChannel::null_handler);
-}
-
-void PlaybackChannel::handle_start(RedPeer::InMessage* message)
-{
- PlaybackHandler* handler = static_cast<PlaybackHandler*>(get_message_handler());
- SpiceMsgPlaybackStart* start = (SpiceMsgPlaybackStart*)message->data();
-
- handler->set_handler(SPICE_MSG_PLAYBACK_START, NULL);
- handler->set_handler(SPICE_MSG_PLAYBACK_STOP, &PlaybackChannel::handle_stop);
-
-#ifdef WAVE_CAPTURE
- start_wave();
-#endif
- if (!_wave_player) {
- if (start->format != SPICE_AUDIO_FMT_S16) {
- THROW("unexpected format");
- }
- if (start->channels != 2) {
- THROW("unexpected number of channels");
- }
- int bits_per_sample = 16;
- int frame_size = SND_CODEC_MAX_FRAME_SIZE;
-
- if (_mode != SPICE_AUDIO_DATA_MODE_RAW) {
- if (snd_codec_create(&_codec, _mode, start->frequency, SND_CODEC_DECODE) != SND_CODEC_OK)
- THROW("create decoder");
- frame_size = snd_codec_frame_size(_codec);
- }
-
- try {
- _wave_player = Platform::create_player(start->frequency, bits_per_sample,
- start->channels, frame_size);
- } catch (...) {
- LOG_WARN("create player failed");
- //todo: support disconnecting single channel
- disable();
- return;
- }
-
- _frame_bytes = frame_size * start->channels * bits_per_sample / 8;
- }
- _playing = true;
- _frame_count = 0;
- set_data_handler();
-}
-
-void PlaybackChannel::handle_stop(RedPeer::InMessage* message)
-{
- PlaybackHandler* handler = static_cast<PlaybackHandler*>(get_message_handler());
-
- handler->set_handler(SPICE_MSG_PLAYBACK_STOP, NULL);
- handler->set_handler(SPICE_MSG_PLAYBACK_DATA, NULL);
- handler->set_handler(SPICE_MSG_PLAYBACK_START, &PlaybackChannel::handle_start);
-
-#ifdef WAVE_CAPTURE
- end_wave();
-#endif
- _wave_player->stop();
- _playing = false;
-}
-
-void PlaybackChannel::handle_raw_data(RedPeer::InMessage* message)
-{
- SpiceMsgPlaybackPacket* packet = (SpiceMsgPlaybackPacket*)message->data();
- uint8_t* data = packet->data;
- uint32_t size = packet->data_size;
-#ifdef WAVE_CAPTURE
- put_wave_data(data, size);
- return;
-#endif
- if (size != _frame_bytes) {
- //for now throw on unexpected size (based on current server imp).
- // will probably be replaced by supporting flexible data size in the player imp
- THROW("unexpected frame size");
- }
- if ((_frame_count++ % 1000) == 0) {
- get_client().set_mm_time(packet->time - _wave_player->get_delay_ms());
- }
- _wave_player->write(data);
-}
-
-void PlaybackChannel::handle_compressed_data(RedPeer::InMessage* message)
-{
- SpiceMsgPlaybackPacket* packet = (SpiceMsgPlaybackPacket*)message->data();
- uint8_t* data = packet->data;
- uint32_t size = packet->data_size;
- int pcm_size = _frame_bytes;
- uint8_t pcm[_frame_bytes];
-
- if (snd_codec_decode(_codec, data, size, pcm, &pcm_size) != SND_CODEC_OK)
- THROW("decode failed");
-#ifdef WAVE_CAPTURE
- put_wave_data(pcm, _frame_bytes);
- return;
-#endif
- if ((_frame_count++ % 1000) == 0) {
- get_client().set_mm_time(packet->time - _wave_player->get_delay_ms());
- }
- _wave_player->write((uint8_t *)pcm);
-}
-
-class PlaybackFactory: public ChannelFactory {
-public:
- PlaybackFactory() : ChannelFactory(SPICE_CHANNEL_PLAYBACK) {}
- virtual RedChannel* construct(RedClient& client, uint32_t id)
- {
- return new PlaybackChannel(client, id);
- }
-};
-
-static PlaybackFactory factory;
-
-ChannelFactory& PlaybackChannel::Factory()
-{
- return factory;
-}
diff --git a/client/process_loop.cpp b/client/process_loop.cpp
deleted file mode 100644
index 9cd530e2..00000000
--- a/client/process_loop.cpp
+++ /dev/null
@@ -1,406 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-#include "process_loop.h"
-#include "debug.h"
-#include "platform.h"
-#include "utils.h"
-
-SyncEvent::SyncEvent()
- : _err (false)
- , _ready (false)
-{
-}
-
-SyncEvent::~SyncEvent()
-{
-}
-
-void SyncEvent::response(AbstractProcessLoop& events_loop)
-{
- try {
- do_response(events_loop);
- } catch (Exception& e) {
- LOG_WARN("unhandled exception: %s", e.what());
- _err = true;
- } catch (...) {
- _err = true;
- }
- Lock lock(_mutex);
- _ready = true;
- _condition.notify_one();
-}
-
-void SyncEvent::wait()
-{
-#ifdef RED_DEBUG
- ASSERT(_process_loop && !_process_loop->is_same_thread(pthread_self()));
-#endif
- Lock lock(_mutex);
- while (!_ready) {
- _condition.wait(lock);
- }
-}
-
-class ProcessLoop::QuitEvent: public Event {
-public:
- QuitEvent(int error_code) : _error_code(error_code) {}
- virtual void response(AbstractProcessLoop& events_loop);
-private:
- int _error_code;
-};
-
-void ProcessLoop::QuitEvent::response(AbstractProcessLoop& events_loop)
-{
- events_loop.do_quit(_error_code);
-}
-
-/* EventsQueue */
-
-EventsQueue::EventsQueue(AbstractProcessLoop& owner)
- : _events_gen (0)
- , _owner (owner)
-{
-}
-
-EventsQueue::~EventsQueue()
-{
- clear_queue();
-}
-
-void EventsQueue::clear_queue()
-{
- Lock lock(_events_lock);
- while (!_events.empty()) {
- Event* event = _events.front();
- _events.pop_front();
- event->unref();
- }
-}
-
-int EventsQueue::push_event(Event* event)
-{
- Lock lock(_events_lock);
- _events.push_back(event);
- event->set_generation(_events_gen);
- event->ref();
-#ifdef RED_DEBUG
- event->set_process_loop(&_owner);
-#endif
- return _events.size();
-}
-
-void EventsQueue::process_events()
-{
- _events_gen++;
-
- for (;;) {
- Event* event;
- Lock lock(_events_lock);
- if (_events.empty()) {
- return;
- }
- event = _events.front();
- if (event->get_generation() == _events_gen) {
- return;
- }
- _events.pop_front();
-
- lock.unlock();
- event->response(_owner);
- event->unref();
- }
-}
-
-bool EventsQueue::is_empty()
-{
- Lock lock(_events_lock);
- return _events.empty();
-}
-
-/* Timers Queue */
-
-Timer::Timer()
- : _is_armed (false)
-{
-}
-
-Timer::~Timer()
-{
-}
-
-void Timer::arm(uint32_t msec)
-{
- _interval = msec;
- _expiration = get_now();
- calc_next_expiration_time();
- _is_armed = true;
-}
-
-void Timer::disarm()
-{
- _is_armed = false;
-}
-
-#define TIMER_COMPENSATION
-
-void Timer::calc_next_expiration_time(uint64_t now)
-{
-#ifndef TIMER_COMPENSATION
- _expiratoin = now;
-#endif
- calc_next_expiration_time();
-#ifdef TIMER_COMPENSATION
- if (_expiration <= now) {
- _expiration = now;
- calc_next_expiration_time();
- }
-#endif
-}
-
-uint64_t Timer::get_now()
-{
- return (Platform::get_monolithic_time() / 1000 / 1000);
-}
-
-TimersQueue::TimersQueue(AbstractProcessLoop& owner)
- : _owner (owner)
-{
-}
-
-TimersQueue::~TimersQueue()
-{
- clear_queue();
-}
-
-void TimersQueue::clear_queue()
-{
- RecurciveLock lock(_timers_lock);
- TimersSet::iterator iter;
- for (iter = _armed_timers.begin(); iter != _armed_timers.end(); iter++) {
- (*iter)->disarm();
- }
- _armed_timers.clear();
-}
-
-void TimersQueue::activate_interval_timer(Timer* timer, unsigned int millisec)
-{
- RecurciveLock lock(_timers_lock);
- timer->ref();
- deactivate_interval_timer(timer);
- timer->arm(millisec);
- _armed_timers.insert(timer);
-}
-
-void TimersQueue::deactivate_interval_timer(Timer* timer)
-{
- RecurciveLock lock(_timers_lock);
- if (timer->is_armed()) {
-#ifdef RED_DEBUG
- int ret =
-#endif
- _armed_timers.erase(timer);
- ASSERT(ret);
- timer->disarm();
- timer->unref();
- }
-}
-
-unsigned int TimersQueue::get_soonest_timeout()
-{
- RecurciveLock lock(_timers_lock);
- TimersSet::iterator iter;
- iter = _armed_timers.begin();
- if (iter == _armed_timers.end()) {
- return INFINITE;
- }
-
- uint64_t now = Timer::get_now();
- uint64_t next_time = (*iter)->get_expiration();
-
- if (next_time <= now) {
- return 0;
- }
- return (int)(next_time - now);
-}
-
-
-void TimersQueue::timers_action()
-{
- RecurciveLock lock(_timers_lock);
- uint64_t now = Timer::get_now();
- TimersSet::iterator iter;
-
- while (((iter = _armed_timers.begin()) != _armed_timers.end()) &&
- ((*iter)->get_expiration() <= now)) {
- Timer* timer = *iter;
- _armed_timers.erase(iter);
- timer->calc_next_expiration_time(now);
- _armed_timers.insert(timer);
- timer->response(_owner);
- }
-}
-
-ProcessLoop::ProcessLoop(void* owner)
- : _events_queue (*this)
- , _timers_queue (*this)
- , _owner (owner)
- , _quitting (false)
- , _exit_code (0)
- , _started (false)
-{
- _event_sources.add_trigger(_wakeup_trigger);
-}
-
-ProcessLoop::~ProcessLoop()
-{
- _event_sources.remove_trigger(_wakeup_trigger);
-}
-
-int ProcessLoop::run()
-{
- _thread = pthread_self();
- _started = true;
- on_start_running();
- for (;;) {
- if (_event_sources.wait_events(_timers_queue.get_soonest_timeout())) {
- _quitting = true;
- break;
- }
- _timers_queue.timers_action();
- process_events_queue();
- if (_quitting) {
- break;
- }
- }
-
- return _exit_code;
-}
-
-void ProcessLoop::do_quit(int error_code)
-{
- ASSERT(!_started || pthread_equal(pthread_self(), _thread));
- if (_quitting) {
- return;
- }
- _quitting = true;
- _exit_code = error_code;
-}
-
-void ProcessLoop::quit(int error_code)
-{
- AutoRef<QuitEvent> quit_event(new QuitEvent(error_code));
- push_event(*quit_event);
-}
-
-void ProcessLoop::process_events_queue()
-{
- ASSERT(!_started || pthread_equal(pthread_self(), _thread));
- _events_queue.process_events();
- if (!_events_queue.is_empty()) {
- wakeup();
- }
-}
-
-void ProcessLoop::wakeup()
-{
- _wakeup_trigger.trigger();
-}
-
-void ProcessLoop::add_trigger(EventSources::Trigger& trigger)
-{
- ASSERT(!_started || pthread_equal(pthread_self(), _thread));
- _event_sources.add_trigger(trigger);
-}
-
-void ProcessLoop::remove_trigger(EventSources::Trigger& trigger)
-{
- ASSERT(!_started || pthread_equal(pthread_self(), _thread));
- _event_sources.remove_trigger(trigger);
-}
-
-void ProcessLoop::add_socket(EventSources::Socket& socket)
-{
- ASSERT(!_started || pthread_equal(pthread_self(), _thread));
- _event_sources.add_socket(socket);
-}
-
-void ProcessLoop::remove_socket(EventSources::Socket& socket)
-{
- ASSERT(!_started || pthread_equal(pthread_self(), _thread));
- _event_sources.remove_socket(socket);
-}
-
-void ProcessLoop::add_file(EventSources::File& file)
-{
- ASSERT(!_started || pthread_equal(pthread_self(), _thread));
- _event_sources.add_file(file);
-}
-
-void ProcessLoop::remove_file(EventSources::File& file)
-{
- ASSERT(!_started || pthread_equal(pthread_self(), _thread));
- _event_sources.remove_file(file);
-}
-
-void ProcessLoop::add_handle(EventSources::Handle& handle)
-{
- ASSERT(!_started || pthread_equal(pthread_self(), _thread));
- _event_sources.add_handle(handle);
-}
-
-void ProcessLoop::remove_handle(EventSources::Handle& handle)
-{
- ASSERT(!_started || pthread_equal(pthread_self(), _thread));
- _event_sources.remove_handle(handle);
-}
-
-void ProcessLoop::push_event(Event* event)
-{
- int queue_size = _events_queue.push_event(event);
- if (queue_size == 1) { // queue was empty before the push
- wakeup();
- }
-}
-
-void ProcessLoop::activate_interval_timer(Timer* timer, unsigned int millisec)
-{
- _timers_queue.activate_interval_timer(timer, millisec);
-
- if (_started && !pthread_equal(pthread_self(), _thread)) {
- wakeup();
- }
-}
-
-void ProcessLoop::deactivate_interval_timer(Timer* timer)
-{
- _timers_queue.deactivate_interval_timer(timer);
-}
-
-unsigned ProcessLoop::get_soonest_timeout()
-{
- return _timers_queue.get_soonest_timeout();
-}
-
-void ProcessLoop::timers_action()
-{
- _timers_queue.timers_action();
-}
diff --git a/client/process_loop.h b/client/process_loop.h
deleted file mode 100644
index 33ca2d13..00000000
--- a/client/process_loop.h
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_PROCESS_LOOP
-#define _H_PROCESS_LOOP
-
-#include "common.h"
-
-#include <set>
-
-#include "event_sources.h"
-#include "threads.h"
-
-class AbstractProcessLoop {
-public:
- virtual ~AbstractProcessLoop() {}
- virtual int run() = 0;
- virtual void do_quit(int error_code) = 0;
- virtual void* get_owner() = 0;
- virtual bool is_same_thread(pthread_t thread) = 0;
-};
-
-class EventBase {
-public:
- EventBase() : _refs (1) {}
-
- virtual void response(AbstractProcessLoop& events_loop) = 0;
-
- EventBase* ref() { ++_refs; return this;}
- void unref() {if (--_refs == 0) delete this;}
-
-protected:
- virtual ~EventBase() {}
-
-private:
- AtomicCount _refs;
-};
-
-class EventsQueue;
-
-class Event: public EventBase {
-#ifdef RED_DEBUG
-public:
- Event() : _process_loop (NULL) {}
-
-private:
- void set_process_loop(AbstractProcessLoop* process_loop) { _process_loop = process_loop;}
-
-protected:
- AbstractProcessLoop* _process_loop;
-#endif
-
-private:
- void set_generation(uint32_t gen) { _generation = gen;}
- uint32_t get_generation() { return _generation;}
-
-private:
- uint32_t _generation;
-
- friend class EventsQueue;
-};
-
-class EventsQueue {
-public:
- EventsQueue(AbstractProcessLoop& owner);
- virtual ~EventsQueue();
- /* return the size of the queue (post-push) */
- int push_event(Event* event);
- void process_events();
- bool is_empty();
-
-private:
- void clear_queue();
-
-private:
- std::list<Event*> _events;
- Mutex _events_lock;
- uint32_t _events_gen;
-
- AbstractProcessLoop& _owner;
-};
-
-class SyncEvent: public Event {
-public:
- SyncEvent();
-
- void wait();
- bool success() { return !_err;}
-
- virtual void do_response(AbstractProcessLoop& events_loop) {}
-
-protected:
- virtual ~SyncEvent();
-
-private:
- virtual void response(AbstractProcessLoop& events_loop);
-
-private:
- Mutex _mutex;
- Condition _condition;
- bool _err;
- bool _ready;
-};
-
-class TimersQueue;
-
-class Timer: public EventBase {
-public:
- Timer();
- bool is_armed() {return _is_armed;}
-
-protected:
- virtual ~Timer();
-
-private:
- void arm(uint32_t msec);
- void disarm();
- uint64_t get_expiration() const { return _expiration;}
- void calc_next_expiration_time() { _expiration += _interval;}
- void calc_next_expiration_time(uint64_t now);
-
- static uint64_t get_now();
-
-private:
- bool _is_armed;
- uint32_t _interval;
- uint64_t _expiration;
-
- class Compare {
- public:
- bool operator () (const Timer* timer1, const Timer* timer2) const
- {
- if (timer1->get_expiration() < timer2->get_expiration()) {
- return true;
- } else if (timer1->get_expiration() > timer2->get_expiration()) {
- return false;
- } else { // elements must be unique (for insertion into set)
- return timer1 < timer2;
- }
- }
- };
-
- friend class TimersQueue;
-};
-
-class TimersQueue {
-public:
- TimersQueue(AbstractProcessLoop& owner);
- virtual ~TimersQueue();
-
- void activate_interval_timer(Timer* timer, unsigned int millisec);
- void deactivate_interval_timer(Timer* timer);
-
- unsigned int get_soonest_timeout();
- void timers_action();
-
-private:
- void clear_queue();
-
-private:
- typedef std::set<Timer*, Timer::Compare> TimersSet;
- TimersSet _armed_timers;
- RecurciveMutex _timers_lock;
- AbstractProcessLoop& _owner;
-};
-
-class ProcessLoop: public AbstractProcessLoop {
-public:
- class QuitEvent;
- ProcessLoop(void* owner);
- virtual ~ProcessLoop();
- int run();
-
- void quit(int error_code);
-
- /* Event sources to track. Note: the following methods are not thread safe, thus,
- they mustn't be called from other thread than the process loop thread. */
- void add_trigger(EventSources::Trigger& trigger);
- void remove_trigger(EventSources::Trigger& trigger);
- void add_socket(EventSources::Socket& socket);
- void remove_socket(EventSources::Socket& socket);
- void add_file(EventSources::File& file);
- void remove_file(EventSources::File& file);
- void add_handle(EventSources::Handle& handle);
- void remove_handle(EventSources::Handle& handle);
-
- /* events queue */
- void push_event(Event* event);
-
- void activate_interval_timer(Timer* timer, unsigned int millisec);
- void deactivate_interval_timer(Timer* timer);
-
- void process_events_queue();
- /* can be used for handling timers in modal loop state in Windows (mainly,
- for updating the screen) */
- unsigned int get_soonest_timeout();
- void timers_action();
-
- void* get_owner() { return _owner;}
-
- bool is_same_thread(pthread_t thread) { return _started && pthread_equal(_thread, thread);}
-
-protected:
- class WakeupTrigger: public EventSources::Trigger {
- public:
- virtual void on_event() {}
- };
-
- virtual void on_start_running() {}
- void wakeup();
- void do_quit(int error_code);
-
- friend class QuitEvent; // allowing access to quit
-
-private:
- EventSources _event_sources;
- EventsQueue _events_queue;
- TimersQueue _timers_queue;
-
- WakeupTrigger _wakeup_trigger;
-
- void* _owner;
-
- bool _quitting;
- int _exit_code;
- bool _started;
- pthread_t _thread;
-};
-
-#endif
diff --git a/client/read_write_mutex.h b/client/read_write_mutex.h
deleted file mode 100644
index 107474ee..00000000
--- a/client/read_write_mutex.h
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_READ_WRITE_MUTEX
-#define _H_READ_WRITE_MUTEX
-
-#include "threads.h"
-
-class ReadWriteMutex {
-public:
- ReadWriteMutex()
- {
- _state.read_count = 0;
- _state.write = false;
- _state.write_waiting = false;
- }
-
- virtual ~ReadWriteMutex()
- {
- }
-
- void read_lock()
- {
- Lock lock(_state_mutex);
-
- while (_state.write || _state.write_waiting) {
- _read_cond.wait(lock);
- }
-
- ++_state.read_count;
- }
-
- bool try_read_lock()
- {
- Lock lock(_state_mutex);
- if (_state.write || _state.write_waiting) {
- return false;
- } else {
- ++_state.read_count;
- return true;
- }
- }
-
- void read_unlock()
- {
- Lock lock(_state_mutex);
- --_state.read_count;
-
- if (!_state.read_count) { // last reader
- _state.write_waiting = false;
- release_waiters();
- }
- }
-
- void write_lock()
- {
- Lock lock(_state_mutex);
-
- while (_state.read_count || _state.write) {
- _state.write_waiting = true;
- _write_cond.wait(lock);
- }
- _state.write = true;
- }
-
- bool try_write_lock()
- {
- Lock lock(_state_mutex);
-
- if (_state.read_count || _state.write) {
- return false;
- } else {
- _state.write = true;
- return true;
- }
- }
-
- void write_unlock()
- {
- Lock lock(_state_mutex);
- _state.write = false;
- _state.write_waiting = false;
- release_waiters();
- }
-
-private:
- void release_waiters()
- {
- _write_cond.notify_one();
- _read_cond.notify_all();
- }
-
-private:
- struct {
- unsigned int read_count;
- bool write;
- bool write_waiting;
- } _state;
-
- Mutex _state_mutex;
- Condition _read_cond;
- Condition _write_cond;
-};
-
-#endif
diff --git a/client/record_channel.cpp b/client/record_channel.cpp
deleted file mode 100644
index 047cdd0b..00000000
--- a/client/record_channel.cpp
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-#include "red_client.h"
-#include "audio_channels.h"
-#include "audio_devices.h"
-
-#define NUM_SAMPLES_MESSAGES 4
-
-
-static uint32_t get_mm_time()
-{
- return uint32_t(Platform::get_monolithic_time() / (1000 * 1000));
-}
-
-class RecordSamplesMessage: public RedChannel::OutMessage {
-public:
- RecordSamplesMessage(RecordChannel& channel);
- virtual ~RecordSamplesMessage();
-
- virtual RedPeer::OutMessage& peer_message() { return *_message;}
- virtual void release();
-
-private:
- RecordChannel& _channel;
- RedPeer::OutMessage *_message;
-};
-
-RecordSamplesMessage::RecordSamplesMessage(RecordChannel& channel)
- : _channel (channel)
- , _message (new Message(SPICE_MSGC_RECORD_DATA))
-{
-}
-
-RecordSamplesMessage::~RecordSamplesMessage()
-{
- delete _message;
-}
-
-void RecordSamplesMessage::release()
-{
- _channel.release_message(this);
-}
-
-class RecordHandler: public MessageHandlerImp<RecordChannel, SPICE_CHANNEL_RECORD> {
-public:
- RecordHandler(RecordChannel& channel)
- : MessageHandlerImp<RecordChannel, SPICE_CHANNEL_RECORD>(channel) {}
-};
-
-RecordChannel::RecordChannel(RedClient& client, uint32_t id)
- : RedChannel(client, SPICE_CHANNEL_RECORD, id, new RecordHandler(*this))
- , _wave_recorder (NULL)
- , _mode (SPICE_AUDIO_DATA_MODE_INVALID)
- , _codec(NULL)
-{
- for (int i = 0; i < NUM_SAMPLES_MESSAGES; i++) {
- _messages.push_front(new RecordSamplesMessage(*this));
- }
-
- RecordHandler* handler = static_cast<RecordHandler*>(get_message_handler());
-
- handler->set_handler(SPICE_MSG_MIGRATE, &RecordChannel::handle_migrate);
- handler->set_handler(SPICE_MSG_SET_ACK, &RecordChannel::handle_set_ack);
- handler->set_handler(SPICE_MSG_PING, &RecordChannel::handle_ping);
- handler->set_handler(SPICE_MSG_WAIT_FOR_CHANNELS, &RecordChannel::handle_wait_for_channels);
- handler->set_handler(SPICE_MSG_DISCONNECTING, &RecordChannel::handle_disconnect);
- handler->set_handler(SPICE_MSG_NOTIFY, &RecordChannel::handle_notify);
-
- handler->set_handler(SPICE_MSG_RECORD_START, &RecordChannel::handle_start);
-
- if (snd_codec_is_capable(SPICE_AUDIO_DATA_MODE_CELT_0_5_1, SND_CODEC_ANY_FREQUENCY))
- set_capability(SPICE_RECORD_CAP_CELT_0_5_1);
- if (snd_codec_is_capable(SPICE_AUDIO_DATA_MODE_OPUS, SND_CODEC_ANY_FREQUENCY))
- set_capability(SPICE_RECORD_CAP_OPUS);
-}
-
-RecordChannel::~RecordChannel(void)
-{
- while (!_messages.empty()) {
- RecordSamplesMessage *mes;
- mes = *_messages.begin();
- _messages.pop_front();
- delete mes;
- }
- clear();
-}
-
-bool RecordChannel::abort(void)
-{
- return (!_wave_recorder || _wave_recorder->abort()) && RedChannel::abort();
-}
-
-void RecordChannel::set_desired_mode(int frequency)
-{
- if (snd_codec_is_capable(SPICE_AUDIO_DATA_MODE_OPUS, frequency) &&
- test_capability(SPICE_RECORD_CAP_OPUS))
- _mode = SPICE_AUDIO_DATA_MODE_OPUS;
- else if (snd_codec_is_capable(SPICE_AUDIO_DATA_MODE_CELT_0_5_1, frequency) &&
- test_capability(SPICE_RECORD_CAP_CELT_0_5_1))
- _mode = SPICE_AUDIO_DATA_MODE_CELT_0_5_1;
- else
- _mode = SPICE_AUDIO_DATA_MODE_RAW;
-}
-
-void RecordChannel::send_record_mode()
-{
- Message* message = new Message(SPICE_MSGC_RECORD_MODE);
- SpiceMsgcRecordMode mode;
- mode.time = get_mm_time();
- mode.mode = _mode;
- _marshallers->msgc_record_mode(message->marshaller(), &mode);
- post_message(message);
-}
-
-void RecordChannel::on_disconnect()
-{
- clear();
-}
-
-void RecordChannel::send_start_mark()
-{
- Message* message = new Message(SPICE_MSGC_RECORD_START_MARK);
- SpiceMsgcRecordStartMark start_mark;
- start_mark.time = get_mm_time();
- _marshallers->msgc_record_start_mark(message->marshaller(), &start_mark);
- post_message(message);
-}
-
-void RecordChannel::handle_start(RedPeer::InMessage* message)
-{
- RecordHandler* handler = static_cast<RecordHandler*>(get_message_handler());
- SpiceMsgRecordStart* start = (SpiceMsgRecordStart*)message->data();
-
- handler->set_handler(SPICE_MSG_RECORD_START, NULL);
- handler->set_handler(SPICE_MSG_RECORD_STOP, &RecordChannel::handle_stop);
- ASSERT(!_wave_recorder);
-
- // for now support only one setting
- if (start->format != SPICE_AUDIO_FMT_S16) {
- THROW("unexpected format");
- }
- if (start->channels != 2) {
- THROW("unexpected number of channels");
- }
-
- set_desired_mode(start->frequency);
-
- int frame_size = SND_CODEC_MAX_FRAME_SIZE;
- if (_mode != SPICE_AUDIO_DATA_MODE_RAW) {
- if (snd_codec_create(&_codec, _mode, start->frequency, SND_CODEC_ENCODE) != SND_CODEC_OK)
- THROW("create encoder failed");
- frame_size = snd_codec_frame_size(_codec);
- }
-
- int bits_per_sample = 16;
- try {
- _wave_recorder = Platform::create_recorder(*this, start->frequency,
- bits_per_sample,
- start->channels,
- frame_size);
- } catch (...) {
- LOG_WARN("create recorder failed");
- return;
- }
-
- _frame_bytes = frame_size * bits_per_sample * start->channels / 8;
-
- send_record_mode();
- send_start_mark();
- _wave_recorder->start();
-}
-
-void RecordChannel::clear()
-{
- if (_wave_recorder) {
- _wave_recorder->stop();
- delete _wave_recorder;
- _wave_recorder = NULL;
- }
- snd_codec_destroy(&_codec);
-}
-
-void RecordChannel::handle_stop(RedPeer::InMessage* message)
-{
- RecordHandler* handler = static_cast<RecordHandler*>(get_message_handler());
- handler->set_handler(SPICE_MSG_RECORD_START, &RecordChannel::handle_start);
- handler->set_handler(SPICE_MSG_RECORD_STOP, NULL);
- if (!_wave_recorder) {
- return;
- }
- clear();
-}
-
-RecordSamplesMessage* RecordChannel::get_message()
-{
- Lock lock(_messages_lock);
- if (_messages.empty()) {
- return NULL;
- }
-
- RecordSamplesMessage* ret = *_messages.begin();
- _messages.pop_front();
- return ret;
-}
-
-void RecordChannel::release_message(RecordSamplesMessage *message)
-{
- Lock lock(_messages_lock);
- _messages.push_front(message);
-}
-
-void RecordChannel::add_event_source(EventSources::File& event_source)
-{
- get_process_loop().add_file(event_source);
-}
-
-void RecordChannel::remove_event_source(EventSources::File& event_source)
-{
- get_process_loop().remove_file(event_source);
-}
-
-void RecordChannel::add_event_source(EventSources::Trigger& event_source)
-{
- get_process_loop().add_trigger(event_source);
-}
-
-void RecordChannel::remove_event_source(EventSources::Trigger& event_source)
-{
- get_process_loop().remove_trigger(event_source);
-}
-
-void RecordChannel::push_frame(uint8_t *frame)
-{
- RecordSamplesMessage *message;
- if (!(message = get_message())) {
- DBG(0, "blocked");
- return;
- }
- int n;
-
-
- if (_mode == SPICE_AUDIO_DATA_MODE_RAW) {
- n = _frame_bytes;
- } else {
- n = sizeof(compressed_buf);
- if (snd_codec_encode(_codec, frame, _frame_bytes, compressed_buf, &n) != SND_CODEC_OK)
- THROW("encode failed");
- frame = compressed_buf;
- }
-
- RedPeer::OutMessage& peer_message = message->peer_message();
- peer_message.reset(SPICE_MSGC_RECORD_DATA);
- SpiceMsgcRecordPacket packet;
- packet.time = get_mm_time();
- _marshallers->msgc_record_data(peer_message.marshaller(), &packet);
- spice_marshaller_add(peer_message.marshaller(), frame, n);
- post_message(message);
-}
-
-class RecordFactory: public ChannelFactory {
-public:
- RecordFactory() : ChannelFactory(SPICE_CHANNEL_RECORD) {}
- virtual RedChannel* construct(RedClient& client, uint32_t id)
- {
- return new RecordChannel(client, id);
- }
-};
-
-static RecordFactory factory;
-
-ChannelFactory& RecordChannel::Factory()
-{
- return factory;
-}
diff --git a/client/red_canvas_base.h b/client/red_canvas_base.h
deleted file mode 100644
index 15060552..00000000
--- a/client/red_canvas_base.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- Copyright (C) 2011 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifndef _H_RED_CANVAS_BASE
-#define _H_RED_CANVAS_BASE
-
-#define SPICE_CANVAS_INTERNAL
-#define SW_CANVAS_CACHE
-#include "common/canvas_base.h"
-#undef SW_CANVAS_CACHE
-#undef SPICE_CANVAS_INTERNAL
-
-#endif
diff --git a/client/red_channel.cpp b/client/red_channel.cpp
deleted file mode 100644
index f5857324..00000000
--- a/client/red_channel.cpp
+++ /dev/null
@@ -1,887 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-#include "red_channel.h"
-#include "red_client.h"
-#include "application.h"
-#include "debug.h"
-#include "utils.h"
-
-#include "openssl/rsa.h"
-#include "openssl/evp.h"
-#include "openssl/x509.h"
-
-void MigrationDisconnectSrcEvent::response(AbstractProcessLoop& events_loop)
-{
- static_cast<RedChannel*>(events_loop.get_owner())->do_migration_disconnect_src();
-}
-
-void MigrationConnectTargetEvent::response(AbstractProcessLoop& events_loop)
-{
- static_cast<RedChannel*>(events_loop.get_owner())->do_migration_connect_target();
-}
-
-RedChannelBase::RedChannelBase(uint8_t type, uint8_t id, const ChannelCaps& common_caps,
- const ChannelCaps& caps)
- : RedPeer()
- , _type (type)
- , _id (id)
- , _common_caps (common_caps)
- , _caps (caps)
-{
-}
-
-RedChannelBase::~RedChannelBase()
-{
-}
-
-static const char *spice_link_error_string(int err)
-{
- switch (err) {
- case SPICE_LINK_ERR_OK: return "no error";
- case SPICE_LINK_ERR_ERROR: return "general error";
- case SPICE_LINK_ERR_INVALID_MAGIC: return "invalid magic";
- case SPICE_LINK_ERR_INVALID_DATA: return "invalid data";
- case SPICE_LINK_ERR_VERSION_MISMATCH: return "version mismatch";
- case SPICE_LINK_ERR_NEED_SECURED: return "need secured connection";
- case SPICE_LINK_ERR_NEED_UNSECURED: return "need unsecured connection";
- case SPICE_LINK_ERR_PERMISSION_DENIED: return "permission denied";
- case SPICE_LINK_ERR_BAD_CONNECTION_ID: return "bad connection id";
- case SPICE_LINK_ERR_CHANNEL_NOT_AVAILABLE: return "channel not available";
- }
- return "";
-}
-
-void RedChannelBase::link(uint32_t connection_id, const std::string& password,
- int protocol)
-{
- SpiceLinkHeader header;
- SpiceLinkMess link_mess;
- SpiceLinkReply* reply;
- uint32_t link_res;
- uint32_t i;
-
- BIO *bioKey;
- uint8_t *buffer, *p;
- uint32_t expected_major;
-
- header.magic = SPICE_MAGIC;
- header.size = sizeof(link_mess);
- if (protocol == 1) {
- /* protocol 1 == major 1, old 0.4 protocol, last active minor */
- expected_major = header.major_version = 1;
- header.minor_version = 3;
- } else if (protocol == 2) {
- /* protocol 2 == current */
- expected_major = header.major_version = SPICE_VERSION_MAJOR;
- header.minor_version = SPICE_VERSION_MINOR;
- } else {
- THROW("unsupported protocol version specified");
- }
- link_mess.connection_id = connection_id;
- link_mess.channel_type = _type;
- link_mess.channel_id = _id;
- link_mess.num_common_caps = get_common_caps().size();
- link_mess.num_channel_caps = get_caps().size();
- link_mess.caps_offset = sizeof(link_mess);
- header.size += (link_mess.num_common_caps + link_mess.num_channel_caps) * sizeof(uint32_t);
-
- buffer =
- new uint8_t[sizeof(header) + sizeof(link_mess) +
- _common_caps.size() * sizeof(uint32_t) +
- _caps.size() * sizeof(uint32_t)];
- p = buffer;
-
- memcpy(p, (uint8_t*)&header, sizeof(header));
- p += sizeof(header);
- memcpy(p, (uint8_t*)&link_mess, sizeof(link_mess));
- p += sizeof(link_mess);
- for (i = 0; i < _common_caps.size(); i++) {
- *(uint32_t *)p = _common_caps[i];
- p += sizeof(uint32_t);
- }
-
- for (i = 0; i < _caps.size(); i++) {
- *(uint32_t *)p = _caps[i];
- p += sizeof(uint32_t);
- }
-
- send(buffer, p - buffer);
- delete [] buffer;
-
- receive((uint8_t*)&header, sizeof(header));
-
- if (header.magic != SPICE_MAGIC) {
- THROW_ERR(SPICEC_ERROR_CODE_CONNECT_FAILED, "bad magic");
- }
-
- if (header.major_version != expected_major) {
- THROW_ERR(SPICEC_ERROR_CODE_VERSION_MISMATCH,
- "version mismatch: expect %u got %u",
- expected_major,
- header.major_version);
- }
-
- _remote_major = header.major_version;
- _remote_minor = header.minor_version;
-
- AutoArray<uint8_t> reply_buf(new uint8_t[header.size]);
- receive(reply_buf.get(), header.size);
-
- reply = (SpiceLinkReply *)reply_buf.get();
-
- if (reply->error != SPICE_LINK_ERR_OK) {
- THROW_ERR(SPICEC_ERROR_CODE_CONNECT_FAILED, "connect error %u - %s",
- reply->error, spice_link_error_string(reply->error));
- }
-
- uint32_t num_caps = reply->num_channel_caps + reply->num_common_caps;
- if ((uint8_t *)(reply + 1) > reply_buf.get() + header.size ||
- (uint8_t *)reply + reply->caps_offset + num_caps * sizeof(uint32_t) >
- reply_buf.get() + header.size) {
- THROW_ERR(SPICEC_ERROR_CODE_CONNECT_FAILED, "access violation");
- }
-
- uint32_t *caps = (uint32_t *)((uint8_t *)reply + reply->caps_offset);
-
- _remote_common_caps.clear();
- for (i = 0; i < reply->num_common_caps; i++, caps++) {
- _remote_common_caps.resize(i + 1);
- _remote_common_caps[i] = *caps;
- }
-
- _remote_caps.clear();
- for (i = 0; i < reply->num_channel_caps; i++, caps++) {
- _remote_caps.resize(i + 1);
- _remote_caps[i] = *caps;
- }
-
- bioKey = BIO_new(BIO_s_mem());
- if (bioKey != NULL) {
- EVP_PKEY *pubkey;
- int nRSASize;
- RSA *rsa;
-
- BIO_write(bioKey, reply->pub_key, SPICE_TICKET_PUBKEY_BYTES);
- pubkey = d2i_PUBKEY_bio(bioKey, NULL);
- rsa = pubkey->pkey.rsa;
- nRSASize = RSA_size(rsa);
- AutoArray<unsigned char> bufEncrypted(new unsigned char[nRSASize]);
-
- /*
- The use of RSA encryption limit the potential maximum password length.
- for RSA_PKCS1_OAEP_PADDING it is RSA_size(rsa) - 41.
- */
- if (RSA_public_encrypt(password.length() + 1, (unsigned char *)password.c_str(),
- (uint8_t *)bufEncrypted.get(),
- rsa, RSA_PKCS1_OAEP_PADDING) > 0) {
- send((uint8_t*)bufEncrypted.get(), nRSASize);
- } else {
- EVP_PKEY_free(pubkey);
- BIO_free(bioKey);
- THROW("could not encrypt password");
- }
-
- memset(bufEncrypted.get(), 0, nRSASize);
- EVP_PKEY_free(pubkey);
- } else {
- THROW("Could not initiate BIO");
- }
-
- BIO_free(bioKey);
-
- receive((uint8_t*)&link_res, sizeof(link_res));
- if (link_res != SPICE_LINK_ERR_OK) {
- int error_code = (link_res == SPICE_LINK_ERR_PERMISSION_DENIED) ?
- SPICEC_ERROR_CODE_CONNECT_FAILED : SPICEC_ERROR_CODE_CONNECT_FAILED;
- THROW_ERR(error_code, "connect failed %u", link_res);
- }
-}
-
-void RedChannelBase::connect(const ConnectionOptions& options, uint32_t connection_id,
- const char* host, std::string password)
-{
- int protocol = options.protocol;
-
- if (protocol == 0) { /* AUTO, try major 2 first */
- protocol = 2;
- }
-
- retry:
- try {
- if (options.allow_unsecure()) {
- try {
- RedPeer::connect_unsecure(host, options.unsecure_port);
- link(connection_id, password, protocol);
- return;
- } catch (Exception& e) {
- // On protocol version mismatch, don't connect_secure with the same version
- if (e.get_error_code() == SPICEC_ERROR_CODE_VERSION_MISMATCH ||
- !options.allow_secure()) {
- throw;
- }
- RedPeer::close();
- }
- }
- ASSERT(options.allow_secure());
- RedPeer::connect_secure(options, host);
- link(connection_id, password, protocol);
- } catch (Exception& e) {
- // On protocol version mismatch, retry with older version
- if (e.get_error_code() == SPICEC_ERROR_CODE_VERSION_MISMATCH &&
- protocol == 2 && options.protocol == 0) {
- RedPeer::cleanup();
- protocol = 1;
- goto retry;
- }
- throw;
- }
-}
-
-void RedChannelBase::set_capability(ChannelCaps& caps, uint32_t cap)
-{
- uint32_t word_index = cap / 32;
-
- if (caps.size() < word_index + 1) {
- caps.resize(word_index + 1);
- }
- caps[word_index] |= 1 << (cap % 32);
-}
-
-void RedChannelBase::set_common_capability(uint32_t cap)
-{
- set_capability(_common_caps, cap);
-}
-
-void RedChannelBase::set_capability(uint32_t cap)
-{
- set_capability(_caps, cap);
-}
-
-bool RedChannelBase::test_capability(const ChannelCaps& caps, uint32_t cap)
-{
- uint32_t word_index = cap / 32;
-
- if (caps.size() < word_index + 1) {
- return false;
- }
-
- return (caps[word_index] & (1 << (cap % 32))) != 0;
-}
-
-bool RedChannelBase::test_common_capability(uint32_t cap)
-{
- return test_capability(_remote_common_caps, cap);
-}
-
-bool RedChannelBase::test_capability(uint32_t cap)
-{
- return test_capability(_remote_caps, cap);
-}
-
-void RedChannelBase::swap(RedChannelBase* other)
-{
- int tmp_ver;
-
- RedPeer::swap(other);
- tmp_ver = _remote_major;
- _remote_major = other->_remote_major;
- other->_remote_major = tmp_ver;
-
- tmp_ver = _remote_minor;
- _remote_minor = other->_remote_minor;
- other->_remote_minor = tmp_ver;
-}
-
-SendTrigger::SendTrigger(RedChannel& channel)
- : _channel (channel)
-{
-}
-
-void SendTrigger::on_event()
-{
- _channel.on_send_trigger();
-}
-
-SPICE_GNUC_NORETURN void AbortTrigger::on_event()
-{
- THROW("abort");
-}
-
-RedChannel::RedChannel(RedClient& client, uint8_t type, uint8_t id,
- RedChannel::MessageHandler* handler,
- Platform::ThreadPriority worker_priority)
- : RedChannelBase(type, id, ChannelCaps(), ChannelCaps())
- , _marshallers (NULL)
- , _client (client)
- , _state (PASSIVE_STATE)
- , _action (WAIT_ACTION)
- , _error (SPICEC_ERROR_CODE_SUCCESS)
- , _wait_for_threads (true)
- , _socket_in_loop (false)
- , _worker (NULL)
- , _worker_priority (worker_priority)
- , _message_handler (handler)
- , _outgoing_message (NULL)
- , _incomming_header_pos (0)
- , _incomming_message (NULL)
- , _message_ack_count (0)
- , _message_ack_window (0)
- , _loop (this)
- , _send_trigger (*this)
- , _disconnect_stamp (0)
- , _disconnect_reason (SPICE_LINK_ERR_OK)
-{
- _loop.add_trigger(_send_trigger);
- _loop.add_trigger(_abort_trigger);
-}
-
-RedChannel::~RedChannel()
-{
- ASSERT(_state == TERMINATED_STATE || _state == PASSIVE_STATE);
- delete _worker;
-}
-
-void* RedChannel::worker_main(void *data)
-{
- try {
- RedChannel* channel = static_cast<RedChannel*>(data);
- channel->set_state(DISCONNECTED_STATE);
- Platform::set_thread_priority(NULL, channel->get_worker_priority());
- channel->run();
- } catch (Exception& e) {
- LOG_ERROR("unhandled exception: %s", e.what());
- } catch (std::exception& e) {
- LOG_ERROR("unhandled exception: %s", e.what());
- } catch (...) {
- LOG_ERROR("unhandled exception");
- }
- return NULL;
-}
-
-void RedChannel::post_message(RedChannel::OutMessage* message)
-{
- Lock lock(_outgoing_lock);
- _outgoing_messages.push_back(message);
- lock.unlock();
- _send_trigger.trigger();
-}
-
-RedPeer::CompoundInMessage *RedChannel::receive()
-{
- CompoundInMessage *message = RedChannelBase::receive();
- on_message_received();
- return message;
-}
-
-RedChannel::OutMessage* RedChannel::get_outgoing_message()
-{
- if (_state != CONNECTED_STATE || _outgoing_messages.empty()) {
- return NULL;
- }
- RedChannel::OutMessage* message = _outgoing_messages.front();
- _outgoing_messages.pop_front();
- return message;
-}
-
-class AutoMessage {
-public:
- AutoMessage(RedChannel::OutMessage* message) : _message (message) {}
- ~AutoMessage() {if (_message) _message->release();}
- void set(RedChannel::OutMessage* message) { _message = message;}
- RedChannel::OutMessage* get() { return _message;}
- RedChannel::OutMessage* release();
-
-private:
- RedChannel::OutMessage* _message;
-};
-
-RedChannel::OutMessage* AutoMessage::release()
-{
- RedChannel::OutMessage* ret = _message;
- _message = NULL;
- return ret;
-}
-
-void RedChannel::start()
-{
- ASSERT(!_worker);
- _worker = new Thread(RedChannel::worker_main, this);
- Lock lock(_state_lock);
- while (_state == PASSIVE_STATE) {
- _state_cond.wait(lock);
- }
-}
-
-void RedChannel::set_state(int state)
-{
- Lock lock(_state_lock);
- _state = state;
- _state_cond.notify_all();
-}
-
-void RedChannel::connect()
-{
- Lock lock(_action_lock);
-
- if (_state != DISCONNECTED_STATE && _state != PASSIVE_STATE) {
- return;
- }
- _action = CONNECT_ACTION;
- _action_cond.notify_one();
-}
-
-void RedChannel::disconnect()
-{
- clear_outgoing_messages();
-
- Lock lock(_action_lock);
- if (_state != CONNECTING_STATE && _state != CONNECTED_STATE) {
- return;
- }
- _action = DISCONNECT_ACTION;
- RedPeer::disconnect();
- _action_cond.notify_one();
-}
-
-void RedChannel::disconnect_migration_src()
-{
- clear_outgoing_messages();
-
- Lock lock(_action_lock);
- if (_state == CONNECTING_STATE || _state == CONNECTED_STATE) {
- AutoRef<MigrationDisconnectSrcEvent> migrate_event(new MigrationDisconnectSrcEvent());
- _loop.push_event(*migrate_event);
- }
-}
-
-void RedChannel::connect_migration_target()
-{
- LOG_INFO("");
- AutoRef<MigrationConnectTargetEvent> migrate_event(new MigrationConnectTargetEvent());
- _loop.push_event(*migrate_event);
-}
-
-void RedChannel::do_migration_disconnect_src()
-{
- if (_socket_in_loop) {
- _socket_in_loop = false;
- _loop.remove_socket(*this);
- }
-
- clear_outgoing_messages();
- if (_outgoing_message) {
- _outgoing_message->release();
- _outgoing_message = NULL;
- }
- _incomming_header_pos = 0;
- if (_incomming_message) {
- _incomming_message->unref();
- _incomming_message = NULL;
- }
-
- on_disconnect_mig_src();
- get_client().migrate_channel(*this);
- get_client().on_channel_disconnect_mig_src_completed(*this);
-}
-
-void RedChannel::do_migration_connect_target()
-{
- LOG_INFO("");
- ASSERT(get_client().get_protocol() != 0);
- if (get_client().get_protocol() == 1) {
- _marshallers = spice_message_marshallers_get1();
- } else {
- _marshallers = spice_message_marshallers_get();
- }
- _loop.add_socket(*this);
- _socket_in_loop = true;
- on_connect_mig_target();
- set_state(CONNECTED_STATE);
- on_event();
-}
-
-void RedChannel::clear_outgoing_messages()
-{
- Lock lock(_outgoing_lock);
- while (!_outgoing_messages.empty()) {
- RedChannel::OutMessage* message = _outgoing_messages.front();
- _outgoing_messages.pop_front();
- message->release();
- }
-}
-
-void RedChannel::run()
-{
- for (;;) {
- Lock lock(_action_lock);
- if (_action == WAIT_ACTION) {
- _action_cond.wait(lock);
- }
- int action = _action;
- _action = WAIT_ACTION;
- lock.unlock();
- switch (action) {
- case CONNECT_ACTION:
- try {
- get_client().get_sync_info(get_type(), get_id(), _sync_info);
- on_connecting();
- set_state(CONNECTING_STATE);
- ConnectionOptions con_options(_client.get_connection_options(get_type()),
- _client.get_port(),
- _client.get_sport(),
- _client.get_protocol(),
- _client.get_host_auth_options(),
- _client.get_connection_ciphers());
- RedChannelBase::connect(con_options, _client.get_connection_id(),
- _client.get_host().c_str(),
- _client.get_password().c_str());
- /* If automatic protocol, remember the first connect protocol type */
- if (_client.get_protocol() == 0) {
- if (get_peer_major() == 1) {
- _client.set_protocol(1);
- } else {
- /* Major is 2 or unstable high value, use 2 */
- _client.set_protocol(2);
- }
- }
- /* Initialize when we know the remote major version */
- if (_client.get_peer_major() == 1) {
- _marshallers = spice_message_marshallers_get1();
- } else {
- _marshallers = spice_message_marshallers_get();
- }
- on_connect();
- set_state(CONNECTED_STATE);
- _loop.add_socket(*this);
- _socket_in_loop = true;
- on_event();
- _loop.run();
- } catch (RedPeer::DisconnectedException&) {
- _error = SPICEC_ERROR_CODE_SUCCESS;
- } catch (Exception& e) {
- LOG_WARN("%s", e.what());
- _error = e.get_error_code();
- } catch (std::exception& e) {
- LOG_WARN("%s", e.what());
- _error = SPICEC_ERROR_CODE_ERROR;
- }
- if (_socket_in_loop) {
- _socket_in_loop = false;
- _loop.remove_socket(*this);
- }
- if (_outgoing_message) {
- _outgoing_message->release();
- _outgoing_message = NULL;
- }
- _incomming_header_pos = 0;
- if (_incomming_message) {
- _incomming_message->unref();
- _incomming_message = NULL;
- }
- case DISCONNECT_ACTION:
- close();
- on_disconnect();
- set_state(DISCONNECTED_STATE);
- _client.on_channel_disconnected(*this);
- continue;
- case QUIT_ACTION:
- set_state(TERMINATED_STATE);
- return;
- }
- }
-}
-
-bool RedChannel::abort()
-{
- clear_outgoing_messages();
- Lock lock(_action_lock);
- if (_state == TERMINATED_STATE) {
- if (_wait_for_threads) {
- _wait_for_threads = false;
- _worker->join();
- }
- return true;
- }
-
- _action = QUIT_ACTION;
- _action_cond.notify_one();
- lock.unlock();
- RedPeer::disconnect();
- _abort_trigger.trigger();
-
- for (;;) {
- Lock state_lock(_state_lock);
- if (_state == TERMINATED_STATE) {
- break;
- }
- uint64_t timout = 1000 * 1000 * 100; // 100ms
- if (!_state_cond.timed_wait(state_lock, timout)) {
- return false;
- }
- }
- if (_wait_for_threads) {
- _wait_for_threads = false;
- _worker->join();
- }
- return true;
-}
-
-void RedChannel::send_messages()
-{
- if (_outgoing_message) {
- return;
- }
-
- for (;;) {
- Lock lock(_outgoing_lock);
- AutoMessage message(get_outgoing_message());
- if (!message.get()) {
- return;
- }
- RedPeer::OutMessage& peer_message = message.get()->peer_message();
- uint32_t n = send(peer_message);
- if (n != peer_message.message_size()) {
- _outgoing_message = message.release();
- _outgoing_pos = n;
- return;
- }
- }
-}
-
-void RedChannel::on_send_trigger()
-{
- send_messages();
-}
-
-void RedChannel::on_message_received()
-{
- if (_message_ack_count && !--_message_ack_count) {
- post_message(new Message(SPICE_MSGC_ACK));
- _message_ack_count = _message_ack_window;
- }
-}
-
-void RedChannel::on_message_complition(uint64_t serial)
-{
- Lock lock(*_sync_info.lock);
- *_sync_info.message_serial = serial;
- _sync_info.condition->notify_all();
-}
-
-void RedChannel::receive_messages()
-{
- for (;;) {
- uint32_t n = RedPeer::receive((uint8_t*)&_incomming_header, sizeof(SpiceDataHeader));
- if (n != sizeof(SpiceDataHeader)) {
- _incomming_header_pos = n;
- return;
- }
- AutoRef<CompoundInMessage> message(new CompoundInMessage(_incomming_header.serial,
- _incomming_header.type,
- _incomming_header.size,
- _incomming_header.sub_list));
- n = RedPeer::receive((*message)->data(), (*message)->compound_size());
- if (n != (*message)->compound_size()) {
- _incomming_message = message.release();
- _incomming_message_pos = n;
- return;
- }
- on_message_received();
- _message_handler->handle_message(*(*message));
- on_message_complition((*message)->serial());
- }
-}
-
-void RedChannel::on_event()
-{
- if (_outgoing_message) {
- RedPeer::OutMessage& peer_message = _outgoing_message->peer_message();
-
- _outgoing_pos += do_send(peer_message, _outgoing_pos);
- if (_outgoing_pos == peer_message.message_size()) {
- _outgoing_message->release();
- _outgoing_message = NULL;
- }
- }
- send_messages();
-
- if (_incomming_header_pos) {
- _incomming_header_pos += RedPeer::receive(((uint8_t*)&_incomming_header) +
- _incomming_header_pos,
- sizeof(SpiceDataHeader) - _incomming_header_pos);
- if (_incomming_header_pos != sizeof(SpiceDataHeader)) {
- return;
- }
- _incomming_header_pos = 0;
- _incomming_message = new CompoundInMessage(_incomming_header.serial,
- _incomming_header.type,
- _incomming_header.size,
- _incomming_header.sub_list);
- _incomming_message_pos = 0;
- }
-
- if (_incomming_message) {
- _incomming_message_pos += RedPeer::receive(_incomming_message->data() +
- _incomming_message_pos,
- _incomming_message->compound_size() -
- _incomming_message_pos);
- if (_incomming_message_pos != _incomming_message->compound_size()) {
- return;
- }
- AutoRef<CompoundInMessage> message(_incomming_message);
- _incomming_message = NULL;
- on_message_received();
- _message_handler->handle_message(*(*message));
- on_message_complition((*message)->serial());
- }
- receive_messages();
-}
-
-void RedChannel::send_migrate_flush_mark()
-{
- if (_outgoing_message) {
- RedPeer::OutMessage& peer_message = _outgoing_message->peer_message();
- do_send(peer_message, _outgoing_pos);
- _outgoing_message->release();
- _outgoing_message = NULL;
- }
- Lock lock(_outgoing_lock);
- for (;;) {
- AutoMessage message(get_outgoing_message());
- if (!message.get()) {
- break;
- }
- send(message.get()->peer_message());
- }
- lock.unlock();
- std::auto_ptr<RedPeer::OutMessage> message(new RedPeer::OutMessage(SPICE_MSGC_MIGRATE_FLUSH_MARK));
- send(*message);
-}
-
-void RedChannel::handle_migrate(RedPeer::InMessage* message)
-{
- DBG(0, "channel type %u id %u", get_type(), get_id());
- _socket_in_loop = false;
- _loop.remove_socket(*this);
- SpiceMsgMigrate* migrate = (SpiceMsgMigrate*)message->data();
- if (migrate->flags & SPICE_MIGRATE_NEED_FLUSH) {
- send_migrate_flush_mark();
- }
- AutoRef<CompoundInMessage> data_message;
- if (migrate->flags & SPICE_MIGRATE_NEED_DATA_TRANSFER) {
- data_message.reset(receive());
- }
- _client.migrate_channel(*this);
- if (migrate->flags & SPICE_MIGRATE_NEED_DATA_TRANSFER) {
- if ((*data_message)->type() != SPICE_MSG_MIGRATE_DATA) {
- THROW("expect SPICE_MSG_MIGRATE_DATA");
- }
- std::auto_ptr<RedPeer::OutMessage> message(new RedPeer::OutMessage(SPICE_MSGC_MIGRATE_DATA));
- spice_marshaller_add(message->marshaller(), (*data_message)->data(), (*data_message)->size());
- send(*message);
- }
- _loop.add_socket(*this);
- _socket_in_loop = true;
- on_migrate();
- set_state(CONNECTED_STATE);
- on_event();
-}
-
-void RedChannel::handle_set_ack(RedPeer::InMessage* message)
-{
- SpiceMsgSetAck* ack = (SpiceMsgSetAck*)message->data();
- _message_ack_window = _message_ack_count = ack->window;
- Message *response = new Message(SPICE_MSGC_ACK_SYNC);
- SpiceMsgcAckSync sync;
- sync.generation = ack->generation;
- _marshallers->msgc_ack_sync(response->marshaller(), &sync);
- post_message(response);
-}
-
-void RedChannel::handle_ping(RedPeer::InMessage* message)
-{
- SpiceMsgPing *ping = (SpiceMsgPing *)message->data();
- Message *pong = new Message(SPICE_MSGC_PONG);
- _marshallers->msgc_pong(pong->marshaller(), ping);
- post_message(pong);
-}
-
-void RedChannel::handle_disconnect(RedPeer::InMessage* message)
-{
- SpiceMsgDisconnect *disconnect = (SpiceMsgDisconnect *)message->data();
- _disconnect_stamp = disconnect->time_stamp;
- _disconnect_reason = disconnect->reason;
-}
-
-void RedChannel::handle_notify(RedPeer::InMessage* message)
-{
- SpiceMsgNotify *notify = (SpiceMsgNotify *)message->data();
- const char *severity;
- const char *visibility;
- char *message_str = (char *)"";
- const char *message_prefix = "";
-
- static const char* severity_strings[] = {"info", "warn", "error"};
- static const char* visibility_strings[] = {"!", "!!", "!!!"};
-
-
- if (notify->severity > SPICE_NOTIFY_SEVERITY_ERROR) {
- THROW("bad severity");
- }
- severity = severity_strings[notify->severity];
-
- if (notify->visibilty > SPICE_NOTIFY_VISIBILITY_HIGH) {
- THROW("bad visibility");
- }
- visibility = visibility_strings[notify->visibilty];
-
-
- if (notify->message_len) {
- if ((message->size() - sizeof(*notify) < notify->message_len)) {
- THROW("access violation");
- }
- message_str = new char[notify->message_len + 1];
- memcpy(message_str, notify->message, notify->message_len);
- message_str[notify->message_len] = 0;
- message_prefix = ": ";
- }
-
-
- LOG_INFO("remote channel %u:%u %s%s #%u%s%s",
- get_type(), get_id(),
- severity, visibility,
- notify->what,
- message_prefix, message_str);
- if (notify->message_len) {
- delete [] message_str;
- }
-}
-
-void RedChannel::handle_wait_for_channels(RedPeer::InMessage* message)
-{
- SpiceMsgWaitForChannels *wait = (SpiceMsgWaitForChannels *)message->data();
- if (message->size() < sizeof(*wait) + wait->wait_count * sizeof(wait->wait_list[0])) {
- THROW("access violation");
- }
- _client.wait_for_channels(wait->wait_count, wait->wait_list);
-}
diff --git a/client/red_channel.h b/client/red_channel.h
deleted file mode 100644
index 3cf51602..00000000
--- a/client/red_channel.h
+++ /dev/null
@@ -1,353 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_REDCHANNEL
-#define _H_REDCHANNEL
-
-#include "common/client_demarshallers.h"
-#include "common/client_marshallers.h"
-
-#include "common.h"
-#include "utils.h"
-#include "threads.h"
-#include "red_peer.h"
-#include "platform.h"
-#include "process_loop.h"
-
-enum {
- PASSIVE_STATE,
- DISCONNECTED_STATE,
- CONNECTING_STATE,
- CONNECTED_STATE,
- TERMINATED_STATE,
-};
-
-enum {
- WAIT_ACTION,
- CONNECT_ACTION,
- DISCONNECT_ACTION,
- QUIT_ACTION,
-};
-
-class RedClient;
-class RedChannel;
-
-typedef std::vector<uint32_t> ChannelCaps;
-
-class RedChannelBase: public RedPeer {
-public:
- RedChannelBase(uint8_t type, uint8_t id, const ChannelCaps& common_caps,
- const ChannelCaps& caps);
-
- virtual ~RedChannelBase();
-
- uint8_t get_type() { return _type;}
- uint8_t get_id() { return _id;}
-
- void connect(const ConnectionOptions& options, uint32_t connection_id, const char *host,
- std::string password);
-
- const ChannelCaps& get_common_caps() { return _common_caps;}
- const ChannelCaps& get_caps() {return _caps;}
-
- uint32_t get_peer_major() { return _remote_major;}
- uint32_t get_peer_minor() { return _remote_minor;}
-
- virtual void swap(RedChannelBase* other);
-
-protected:
- void set_common_capability(uint32_t cap);
- void set_capability(uint32_t cap);
- bool test_common_capability(uint32_t cap);
- bool test_capability(uint32_t cap);
-
-private:
- void set_capability(ChannelCaps& caps, uint32_t cap);
- bool test_capability(const ChannelCaps& caps, uint32_t cap);
- void link(uint32_t connection_id, const std::string& password, int protocol);
-
-private:
- uint8_t _type;
- uint8_t _id;
-
- ChannelCaps _common_caps;
- ChannelCaps _caps;
-
- ChannelCaps _remote_common_caps;
- ChannelCaps _remote_caps;
-
- uint32_t _remote_major;
- uint32_t _remote_minor;
-};
-
-class SendTrigger: public EventSources::Trigger {
-public:
- SendTrigger(RedChannel& channel);
-
- virtual void on_event();
-
-private:
- RedChannel& _channel;
-};
-
-class AbortTrigger: public EventSources::Trigger {
-public:
- virtual void on_event();
-};
-
-class MigrationDisconnectSrcEvent: public Event {
-public:
- virtual void response(AbstractProcessLoop& events_loop);
-};
-
-class MigrationConnectTargetEvent: public Event {
-public:
- virtual void response(AbstractProcessLoop& events_loop);
-};
-
-struct SyncInfo {
- Mutex* lock;
- Condition* condition;
- uint64_t* message_serial;
-};
-
-class RedChannel: public RedChannelBase {
-public:
- class MessageHandler;
- class OutMessage;
-
- RedChannel(RedClient& client, uint8_t type, uint8_t id, MessageHandler* handler,
- Platform::ThreadPriority worker_priority = Platform::PRIORITY_NORMAL);
- virtual ~RedChannel();
- void start();
-
- virtual void connect();
- virtual void disconnect();
- virtual bool abort();
-
- virtual void disconnect_migration_src();
- virtual void connect_migration_target();
-
- virtual CompoundInMessage *receive();
-
- virtual void post_message(RedChannel::OutMessage* message);
- int get_connection_error() { return _error;}
- Platform::ThreadPriority get_worker_priority() { return _worker_priority;}
-
-protected:
- RedClient& get_client() { return _client;}
- ProcessLoop& get_process_loop() { return _loop;}
- MessageHandler* get_message_handler() { return _message_handler.get();}
- virtual void on_connecting() {}
- virtual void on_connect() {}
- virtual void on_disconnect() {}
- virtual void on_migrate() {}
- virtual void on_disconnect_mig_src() { on_disconnect();}
- virtual void on_connect_mig_target() { on_connect();}
- void handle_migrate(RedPeer::InMessage* message);
- void handle_set_ack(RedPeer::InMessage* message);
- void handle_ping(RedPeer::InMessage* message);
- void handle_wait_for_channels(RedPeer::InMessage* message);
- void handle_disconnect(RedPeer::InMessage* message);
- void handle_notify(RedPeer::InMessage* message);
-
- SpiceMessageMarshallers *_marshallers;
-
-private:
- void set_state(int state);
- void run();
- void send_migrate_flush_mark();
- void send_messages();
- void receive_messages();
- void on_send_trigger();
- virtual void on_event();
- void on_message_received();
- void on_message_complition(uint64_t serial);
- void do_migration_disconnect_src();
- void do_migration_connect_target();
-
- static void* worker_main(void *);
-
- RedChannel::OutMessage* get_outgoing_message();
- void clear_outgoing_messages();
-
-private:
- RedClient& _client;
- int _state;
- int _action;
- int _error;
- bool _wait_for_threads;
- bool _socket_in_loop;
-
- Thread* _worker;
- Platform::ThreadPriority _worker_priority;
- std::auto_ptr<MessageHandler> _message_handler;
- Mutex _state_lock;
- Condition _state_cond;
- Mutex _action_lock;
- Condition _action_cond;
- SyncInfo _sync_info;
-
- Mutex _outgoing_lock;
- std::list<RedChannel::OutMessage*> _outgoing_messages;
- RedChannel::OutMessage* _outgoing_message;
- uint32_t _outgoing_pos;
-
- SpiceDataHeader _incomming_header;
- uint32_t _incomming_header_pos;
- RedPeer::CompoundInMessage* _incomming_message;
- uint32_t _incomming_message_pos;
-
- uint32_t _message_ack_count;
- uint32_t _message_ack_window;
-
- ProcessLoop _loop;
- SendTrigger _send_trigger;
- AbortTrigger _abort_trigger;
-
- uint64_t _disconnect_stamp;
- uint64_t _disconnect_reason;
-
- friend class SendTrigger;
- friend class MigrationDisconnectSrcEvent;
- friend class MigrationConnectTargetEvent;
-};
-
-
-class RedChannel::OutMessage {
-public:
- OutMessage() {}
- virtual ~OutMessage() {}
-
- virtual RedPeer::OutMessage& peer_message() = 0;
- virtual void release() = 0;
-};
-
-class Message: public RedChannel::OutMessage, public RedPeer::OutMessage {
-public:
- Message(uint32_t type)
- : RedChannel::OutMessage()
- , RedPeer::OutMessage(type)
- {
- }
-
- virtual RedPeer::OutMessage& peer_message() { return *this;}
- virtual void release() {delete this;}
-};
-
-
-class RedChannel::MessageHandler {
-public:
- MessageHandler() {}
- virtual ~MessageHandler() {}
- virtual void handle_message(RedPeer::CompoundInMessage& message) = 0;
-};
-
-
-template <class HandlerClass, unsigned int channel_id>
-class MessageHandlerImp: public RedChannel::MessageHandler {
-public:
- MessageHandlerImp(HandlerClass& obj);
- ~MessageHandlerImp() { delete [] _handlers; };
- virtual void handle_message(RedPeer::CompoundInMessage& message);
- typedef void (HandlerClass::*Handler)(RedPeer::InMessage* message);
- void set_handler(unsigned int id, Handler handler);
-
-private:
- HandlerClass& _obj;
- unsigned int _max_messages;
- spice_parse_channel_func_t _parser;
- Handler *_handlers;
-};
-
-template <class HandlerClass, unsigned int channel_id>
-MessageHandlerImp<HandlerClass, channel_id>::MessageHandlerImp(HandlerClass& obj)
- : _obj (obj)
- , _parser (NULL)
-{
- /* max_messages is always from current as its larger than for backwards compat */
- spice_get_server_channel_parser(channel_id, &_max_messages);
- _handlers = new Handler[_max_messages + 1];
- memset(_handlers, 0, sizeof(Handler) * (_max_messages + 1));
-}
-
-template <class HandlerClass, unsigned int channel_id>
-void MessageHandlerImp<HandlerClass, channel_id>::handle_message(RedPeer::CompoundInMessage&
- message)
-{
- uint8_t *msg;
- uint8_t *parsed;
- uint16_t type;
- uint32_t size;
- size_t parsed_size;
- message_destructor_t parsed_free;
-
- if (_parser == NULL) {
- /* We need to do this lazily rather than at constuction because we
- don't know the major until we've connected */
- if (_obj.get_peer_major() == 1) {
- _parser = spice_get_server_channel_parser1(channel_id, NULL);
- } else {
- _parser = spice_get_server_channel_parser(channel_id, NULL);
- }
- }
-
- if (message.sub_list()) {
- SpiceSubMessageList *sub_list;
- sub_list = (SpiceSubMessageList *)(message.data() + message.sub_list());
- for (int i = 0; i < sub_list->size; i++) {
- SpiceSubMessage *sub = (SpiceSubMessage *)(message.data() + sub_list->sub_messages[i]);
- msg = (uint8_t *)(sub + 1);
- type = sub->type;
- size = sub->size;
- parsed = _parser(msg, msg + size, type, _obj.get_peer_minor(), &parsed_size, &parsed_free);
-
- if (parsed == NULL) {
- THROW("failed to parse message type %d", type);
- }
-
- RedPeer::InMessage sub_message(type, parsed_size, parsed);
- (_obj.*_handlers[type])(&sub_message);
-
- parsed_free(parsed);
- }
- }
-
- msg = message.data();
- type = message.type();
- size = message.size();
- parsed = _parser(msg, msg + size, type, _obj.get_peer_minor(), &parsed_size, &parsed_free);
-
- if (parsed == NULL) {
- THROW("failed to parse message channel %d type %d", channel_id, type);
- }
-
- RedPeer::InMessage main_message(type, parsed_size, parsed);
- (_obj.*_handlers[type])(&main_message);
- parsed_free(parsed);
-}
-
-template <class HandlerClass, unsigned int channel_id>
-void MessageHandlerImp<HandlerClass, channel_id>::set_handler(unsigned int id, Handler handler)
-{
- if (id > _max_messages) {
- THROW("bad handler id");
- }
- _handlers[id] = handler;
-}
-
-#endif
diff --git a/client/red_client.cpp b/client/red_client.cpp
deleted file mode 100644
index 6a712919..00000000
--- a/client/red_client.cpp
+++ /dev/null
@@ -1,1410 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <algorithm>
-#include <math.h>
-#include "common/client_marshallers.h"
-
-#include "common.h"
-#include "red_client.h"
-#include "application.h"
-#include "process_loop.h"
-#include "utils.h"
-#include "debug.h"
-
-#ifndef INFINITY
-#define INFINITY HUGE
-#endif
-
-#ifdef __GNUC__
-typedef struct __attribute__ ((__packed__)) OldRedMigrationBegin {
-#else
-typedef struct __declspec(align(1)) OldRedMigrationBegin {
-#endif
- uint16_t port;
- uint16_t sport;
- char host[0];
-} OldRedMigrationBegin;
-
-class MouseModeEvent: public Event {
-public:
- MouseModeEvent(RedClient& client)
- : _client (client)
- {
- }
-
- class SetModeFunc: public ForEachChannelFunc {
- public:
- SetModeFunc(bool capture_mode)
- : _capture_mode (capture_mode)
- {
- }
-
- virtual bool operator() (RedChannel& channel)
- {
- if (channel.get_type() == SPICE_CHANNEL_DISPLAY) {
- static_cast<DisplayChannel&>(channel).set_capture_mode(_capture_mode);
- }
- return true;
- }
-
- public:
- bool _capture_mode;
- };
-
- virtual void response(AbstractProcessLoop& events_loop)
- {
- bool capture_mode = _client.get_mouse_mode() == SPICE_MOUSE_MODE_SERVER;
- if (!capture_mode) {
- _client.get_application().release_mouse_capture();
- }
-
- SetModeFunc func(capture_mode);
- _client.for_each_channel(func);
- }
-
-private:
- RedClient& _client;
-};
-
-uint32_t default_agent_caps[] = {
- (1 << VD_AGENT_CAP_MOUSE_STATE) |
- (1 << VD_AGENT_CAP_MONITORS_CONFIG) |
- (1 << VD_AGENT_CAP_REPLY)
- };
-
-void ClipboardGrabEvent::response(AbstractProcessLoop& events_loop)
-{
- static_cast<RedClient*>(events_loop.get_owner())->send_agent_clipboard_message(
- VD_AGENT_CLIPBOARD_GRAB, _type_count * sizeof(uint32_t), _types);
- Platform::set_clipboard_owner(Platform::owner_client);
-}
-
-void ClipboardRequestEvent::response(AbstractProcessLoop& events_loop)
-{
- if (Platform::get_clipboard_owner() != Platform::owner_guest) {
- LOG_WARN("received clipboard req from client while clipboard is not owned by guest");
- Platform::on_clipboard_notify(VD_AGENT_CLIPBOARD_NONE, NULL, 0);
- return;
- }
-
- VDAgentClipboardRequest request = {_type};
- static_cast<RedClient*>(events_loop.get_owner())->send_agent_clipboard_message(
- VD_AGENT_CLIPBOARD_REQUEST, sizeof(request), &request);
-}
-
-void ClipboardNotifyEvent::response(AbstractProcessLoop& events_loop)
-{
- static_cast<RedClient*>(events_loop.get_owner())->send_agent_clipboard_notify_message(
- _type, _data, _size);
-}
-
-void ClipboardReleaseEvent::response(AbstractProcessLoop& events_loop)
-{
- if (Platform::get_clipboard_owner() != Platform::owner_client)
- return;
-
- static_cast<RedClient*>(events_loop.get_owner())->send_agent_clipboard_message(
- VD_AGENT_CLIPBOARD_RELEASE, 0, NULL);
-}
-
-void MigrateEndEvent::response(AbstractProcessLoop& events_loop)
-{
- static_cast<RedClient*>(events_loop.get_owner())->send_migrate_end();
-}
-
-Migrate::Migrate(RedClient& client)
- : _client (client)
- , _running (false)
- , _aborting (false)
- , _connected (false)
- , _thread (NULL)
- , _pending_con (0)
- , _protocol (0)
-{
-}
-
-Migrate::~Migrate()
-{
- ASSERT(!_thread);
- delete_channels();
-}
-
-void Migrate::delete_channels()
-{
- while (!_channels.empty()) {
- MigChannels::iterator iter = _channels.begin();
- delete *iter;
- _channels.erase(iter);
- }
-}
-
-void Migrate::clear_channels()
-{
- Lock lock(_lock);
- ASSERT(!_running);
- delete_channels();
-}
-
-void Migrate::add_channel(MigChannel* channel)
-{
- Lock lock(_lock);
- _channels.push_back(channel);
-}
-
-void Migrate::swap_peer(RedChannelBase& other)
-{
- DBG(0, "channel type %u id %u", other.get_type(), other.get_id());
- try {
- Lock lock(_lock);
- MigChannels::iterator iter = _channels.begin();
-
- if (_running) {
- THROW("swap and running");
- }
-
- if (!_connected) {
- THROW("not connected");
- }
-
- for (; iter != _channels.end(); ++iter) {
- MigChannel* curr = *iter;
- if (curr->get_type() == other.get_type() && curr->get_id() == other.get_id()) {
- if (!curr->is_valid()) {
- THROW("invalid");
- }
- other.swap(curr);
- curr->set_valid(false);
- if (!--_pending_con) {
- lock.unlock();
- _client.set_target(_host.c_str(), _port, _sport, _protocol);
- abort();
- }
- return;
- }
- }
- THROW("no channel");
- } catch (...) {
- abort();
- throw;
- }
-}
-
-void Migrate::connect_one(MigChannel& channel, const RedPeer::ConnectionOptions& options,
- uint32_t connection_id)
-{
- if (_aborting) {
- DBG(0, "aborting");
- THROW("aborting");
- }
- channel.connect(options, connection_id, _host.c_str(), _password);
- ++_pending_con;
- channel.set_valid(true);
- if (_protocol == 0) {
- if (channel.get_peer_major() == 1) {
- _protocol = 1;
- } else {
- _protocol = 2;
- }
- }
-}
-
-void Migrate::run()
-{
- uint32_t connection_id;
- RedPeer::ConnectionOptions::Type conn_type;
-
- DBG(0, "");
- try {
- conn_type = _client.get_connection_options(SPICE_CHANNEL_MAIN);
- RedPeer::ConnectionOptions con_opt(conn_type, _port, _sport,
- _client.get_protocol(),
- _auth_options, _con_ciphers);
- MigChannels::iterator iter = _channels.begin();
- connection_id = _client.get_connection_id();
- connect_one(**iter, con_opt, connection_id);
-
- for (++iter; iter != _channels.end(); ++iter) {
- conn_type = _client.get_connection_options((*iter)->get_type());
- con_opt = RedPeer::ConnectionOptions(conn_type, _port, _sport,
- _protocol,
- _auth_options, _con_ciphers);
- connect_one(**iter, con_opt, connection_id);
- }
- _connected = true;
- DBG(0, "connected");
- } catch (...) {
- close_channels();
- }
-
- Lock lock(_lock);
- _cond.notify_one();
- if (_connected) {
- Message* message = new Message(SPICE_MSGC_MAIN_MIGRATE_CONNECTED);
- _client.post_message(message);
- } else {
- Message* message = new Message(SPICE_MSGC_MAIN_MIGRATE_CONNECT_ERROR);
- _client.post_message(message);
- }
- _running = false;
-}
-
-void* Migrate::worker_main(void *data)
-{
- Migrate* mig = (Migrate*)data;
- mig->run();
- return NULL;
-}
-
-void Migrate::start(const SpiceMsgMainMigrationBegin* migrate)
-{
- uint32_t peer_major;
- uint32_t peer_minor;
-
- DBG(0, "");
- abort();
- peer_major = _client.get_peer_major();
- peer_minor = _client.get_peer_minor();
- if ((peer_major == 1) && (peer_minor < 1)) {
- LOG_INFO("server minor version incompatible for destination authentication"
- "(missing dest pubkey in SpiceMsgMainMigrationBegin)");
- OldRedMigrationBegin* old_migrate = (OldRedMigrationBegin*)migrate;
- _host.assign(old_migrate->host);
- _port = old_migrate->port ? old_migrate->port : -1;
- _sport = old_migrate->sport ? old_migrate->sport : -1;;
- _auth_options = _client.get_host_auth_options();
- } else {
- _host.assign((char *)migrate->dst_info.host_data);
- _port = migrate->dst_info.port ? migrate->dst_info.port : -1;
- _sport = migrate->dst_info.sport ? migrate->dst_info.sport : -1;
- if ((peer_major == 1) || (peer_major == 2 && peer_minor < 1)) {
- _auth_options.type_flags = SPICE_SSL_VERIFY_OP_PUBKEY;
- _auth_options.host_pubkey.assign(migrate->dst_info.pub_key_data, migrate->dst_info.pub_key_data +
- migrate->dst_info.pub_key_size);
- } else {
- _auth_options.type_flags = SPICE_SSL_VERIFY_OP_SUBJECT;
- _auth_options.CA_file = _client.get_host_auth_options().CA_file;
- if (migrate->dst_info.cert_subject_size != 0) {
- _auth_options.host_subject.assign(migrate->dst_info.cert_subject_data,
- migrate->dst_info.cert_subject_data +
- migrate->dst_info.cert_subject_size);
- }
- }
- }
-
- _con_ciphers = _client.get_connection_ciphers();
- _password = _client._password;
- Lock lock(_lock);
- _running = true;
- lock.unlock();
- _thread = new Thread(Migrate::worker_main, this);
-}
-
-void Migrate::disconnect_channels()
-{
- MigChannels::iterator iter = _channels.begin();
-
- for (; iter != _channels.end(); ++iter) {
- (*iter)->disconnect();
- (*iter)->set_valid(false);
- }
-}
-
-void Migrate::close_channels()
-{
- MigChannels::iterator iter = _channels.begin();
-
- for (; iter != _channels.end(); ++iter) {
- (*iter)->close();
- (*iter)->set_valid(false);
- (*iter)->enable();
- }
-}
-
-bool Migrate::abort()
-{
- Lock lock(_lock);
- if (_aborting) {
- return false;
- }
- _aborting = true;
- for (;;) {
- disconnect_channels();
- if (!_running) {
- break;
- }
- uint64_t timout = 1000 * 1000 * 10; /*10ms*/
- _cond.timed_wait(lock, timout);
- }
- close_channels();
- _pending_con = 0;
- _connected = false;
- _aborting = false;
- if (_thread) {
- _thread->join();
- delete _thread;
- _thread = NULL;
- }
- return true;
-}
-
-#define AGENT_TIMEOUT (1000 * 30)
-
-void AgentTimer::response(AbstractProcessLoop& events_loop)
-{
- Application* app = static_cast<Application*>(events_loop.get_owner());
- app->deactivate_interval_timer(this);
-
- LOG_WARN("timeout while waiting for agent response");
- _client->send_main_attach_channels();
-}
-
-class MainChannelLoop: public MessageHandlerImp<RedClient, SPICE_CHANNEL_MAIN> {
-public:
- MainChannelLoop(RedClient& client): MessageHandlerImp<RedClient, SPICE_CHANNEL_MAIN>(client) {}
-};
-
-RedClient::RedClient(Application& application)
- : RedChannel(*this, SPICE_CHANNEL_MAIN, 0, new MainChannelLoop(*this))
- , _application (application)
- , _port (-1)
- , _sport (-1)
- , _protocol (0)
- , _connection_id (0)
- , _mouse_mode (SPICE_MOUSE_MODE_SERVER)
- , _notify_disconnect (false)
- , _auto_display_res (false)
- , _agent_reply_wait_type (VD_AGENT_END_MESSAGE)
- , _aborting (false)
- , _msg_attach_channels_sent(false)
- , _agent_connected (false)
- , _agent_mon_config_sent (false)
- , _agent_disp_config_sent (false)
- , _agent_msg (new VDAgentMessage)
- , _agent_msg_data (NULL)
- , _agent_msg_pos (0)
- , _agent_out_msg (NULL)
- , _agent_out_msg_size (0)
- , _agent_out_msg_pos (0)
- , _agent_tokens (0)
- , _agent_timer (new AgentTimer(this))
- , _agent_caps_size(0)
- , _agent_caps(NULL)
- , _migrate (*this)
- , _glz_window (_glz_debug)
- , _during_migration (false)
-{
- Platform::set_clipboard_listener(this);
- MainChannelLoop* message_loop = static_cast<MainChannelLoop*>(get_message_handler());
- uint32_t default_caps_size = SPICE_N_ELEMENTS(default_agent_caps);
-
- _agent_caps_size = VD_AGENT_CAPS_SIZE;
- ASSERT(VD_AGENT_CAPS_SIZE >= default_caps_size);
- _agent_caps = new uint32_t[_agent_caps_size];
- memcpy(_agent_caps, default_agent_caps, default_caps_size);
- message_loop->set_handler(SPICE_MSG_MIGRATE, &RedClient::handle_migrate);
- message_loop->set_handler(SPICE_MSG_SET_ACK, &RedClient::handle_set_ack);
- message_loop->set_handler(SPICE_MSG_PING, &RedClient::handle_ping);
- message_loop->set_handler(SPICE_MSG_WAIT_FOR_CHANNELS, &RedClient::handle_wait_for_channels);
- message_loop->set_handler(SPICE_MSG_DISCONNECTING, &RedClient::handle_disconnect);
- message_loop->set_handler(SPICE_MSG_NOTIFY, &RedClient::handle_notify);
-
- message_loop->set_handler(SPICE_MSG_MAIN_MIGRATE_BEGIN, &RedClient::handle_migrate_begin);
- message_loop->set_handler(SPICE_MSG_MAIN_MIGRATE_CANCEL, &RedClient::handle_migrate_cancel);
- message_loop->set_handler(SPICE_MSG_MAIN_MIGRATE_END, &RedClient::handle_migrate_end);
- message_loop->set_handler(SPICE_MSG_MAIN_MIGRATE_SWITCH_HOST,
- &RedClient::handle_migrate_switch_host);
- message_loop->set_handler(SPICE_MSG_MAIN_INIT, &RedClient::handle_init);
- message_loop->set_handler(SPICE_MSG_MAIN_CHANNELS_LIST, &RedClient::handle_channels);
- message_loop->set_handler(SPICE_MSG_MAIN_MOUSE_MODE, &RedClient::handle_mouse_mode);
- message_loop->set_handler(SPICE_MSG_MAIN_MULTI_MEDIA_TIME, &RedClient::handle_mm_time);
-
- message_loop->set_handler(SPICE_MSG_MAIN_AGENT_CONNECTED, &RedClient::handle_agent_connected);
- message_loop->set_handler(SPICE_MSG_MAIN_AGENT_DISCONNECTED, &RedClient::handle_agent_disconnected);
- message_loop->set_handler(SPICE_MSG_MAIN_AGENT_DATA, &RedClient::handle_agent_data);
- message_loop->set_handler(SPICE_MSG_MAIN_AGENT_TOKEN, &RedClient::handle_agent_tokens);
-
- set_capability(SPICE_MAIN_CAP_SEMI_SEAMLESS_MIGRATE);
- start();
-}
-
-RedClient::~RedClient()
-{
- ASSERT(_channels.empty());
- _application.deactivate_interval_timer(*_agent_timer);
- delete _agent_msg;
- delete[] _agent_caps;
-}
-
-void RedClient::set_target(const std::string& host, int port, int sport, int protocol)
-{
- if (protocol != get_protocol()) {
- LOG_INFO("old protocol %d, new protocol %d", get_protocol(), protocol);
- }
-
- _port = port;
- _sport = sport;
- _host.assign(host);
- set_protocol(protocol);
-}
-
-void RedClient::push_event(Event* event)
-{
- _application.push_event(event);
-}
-
-void RedClient::activate_interval_timer(Timer* timer, unsigned int millisec)
-{
- _application.activate_interval_timer(timer, millisec);
-}
-
-void RedClient::deactivate_interval_timer(Timer* timer)
-{
- _application.deactivate_interval_timer(timer);
-}
-
-void RedClient::on_connecting()
-{
- _notify_disconnect = true;
-}
-
-void RedClient::on_connect()
-{
- AutoRef<ConnectedEvent> event(new ConnectedEvent());
- push_event(*event);
- _migrate.add_channel(new MigChannel(SPICE_CHANNEL_MAIN, 0, get_common_caps(),
- get_caps()));
-}
-
-void RedClient::on_disconnect()
-{
- _migrate.abort();
- _connection_id = 0;
- _application.deactivate_interval_timer(*_agent_timer);
- // todo: if migration remains not seemless, we shouldn't
- // resend monitors and display setting to the agent
- _agent_mon_config_sent = false;
- _agent_disp_config_sent = false;
- delete[] _agent_msg_data;
- _agent_msg_data = NULL;
- _agent_msg_pos = 0;
- _agent_tokens = 0;
- AutoRef<SyncEvent> sync_event(new SyncEvent());
- get_client().push_event(*sync_event);
- (*sync_event)->wait();
-}
-
-void RedClient::on_disconnect_mig_src()
-{
- _application.deactivate_interval_timer(*_agent_timer);
- delete[] _agent_msg_data;
- _agent_msg_data = NULL;
- _agent_msg_pos = 0;
- _agent_tokens = 0;
-}
-
-void RedClient::delete_channels()
-{
- Lock lock(_channels_lock);
- _pending_mig_disconnect_channels.clear();
- while (!_channels.empty()) {
- RedChannel *channel = *_channels.begin();
- _channels.pop_front();
- delete channel;
- }
-}
-
-void RedClient::for_each_channel(ForEachChannelFunc& func)
-{
- Lock lock(_channels_lock);
- Channels::iterator iter = _channels.begin();
- for (; iter != _channels.end() && func(**iter) ;iter++);
-}
-
-
-void RedClient::on_mouse_capture_trigger(RedScreen& screen)
-{
- _application.capture_mouse();
-}
-
-RedPeer::ConnectionOptions::Type RedClient::get_connection_options(uint32_t channel_type)
-{
- return _con_opt_map[channel_type];
-}
-
-void RedClient::connect()
-{
- connect(false);
-}
-
-void RedClient::connect(bool wait_main_disconnect)
-{
- // assumption: read _connection_id is atomic
- if (_connection_id) {
- if (!wait_main_disconnect) {
- return;
- }
- }
-
- while (!abort_channels() || _connection_id) {
- _application.process_events_queue();
- Platform::msleep(100);
- }
-
- _pixmap_cache.clear();
- _glz_window.clear();
- memset(_sync_info, 0, sizeof(_sync_info));
- _aborting = false;
- _migrate.clear_channels();
- delete_channels();
- enable();
-
- _con_opt_map.clear();
- PeerConnectionOptMap::const_iterator iter = _application.get_con_opt_map().begin();
- PeerConnectionOptMap::const_iterator end = _application.get_con_opt_map().end();
- for (; iter != end; iter++) {
- _con_opt_map[(*iter).first] = (*iter).second;
- }
-
- _host_auth_opt = _application.get_host_auth_opt();
- _con_ciphers = _application.get_connection_ciphers();
- RedChannel::connect();
-}
-
-void RedClient::disconnect()
-{
- _migrate.abort();
- _msg_attach_channels_sent = false;
- RedChannel::disconnect();
-}
-
-void RedClient::disconnect_channels()
-{
- Lock lock(_channels_lock);
- Channels::iterator iter = _channels.begin();
- for (; iter != _channels.end(); ++iter) {
- (*iter)->RedPeer::disconnect();
- }
-}
-
-void RedClient::on_channel_disconnected(RedChannel& channel)
-{
- Lock lock(_notify_lock);
- if (_notify_disconnect) {
- _notify_disconnect = false;
- int connection_error = channel.get_connection_error();
- AutoRef<DisconnectedEvent> disconn_event(new DisconnectedEvent(connection_error));
- push_event(*disconn_event);
- }
- disconnect_channels();
- RedPeer::disconnect();
-}
-
-bool RedClient::abort_channels()
-{
- Lock lock(_channels_lock);
- Channels::iterator iter = _channels.begin();
-
- for (; iter != _channels.end(); ++iter) {
- if (!(*iter)->abort()) {
- return false;
- }
- }
- return true;
-}
-
-bool RedClient::abort()
-{
- if (!_aborting) {
- Platform::set_clipboard_listener(NULL);
- Lock lock(_sync_lock);
- _aborting = true;
- _sync_condition.notify_all();
- }
- _pixmap_cache.abort();
- _glz_window.abort();
- if (RedChannel::abort() && abort_channels()) {
- delete_channels();
- _migrate.abort();
- return true;
- } else {
- return false;
- }
-}
-
-void RedClient::handle_migrate_begin(RedPeer::InMessage* message)
-{
- LOG_INFO("");
- SpiceMsgMainMigrationBegin* migrate = (SpiceMsgMainMigrationBegin*)message->data();
- //add mig channels
- _migrate.start(migrate);
-}
-
-void RedClient::handle_migrate_cancel(RedPeer::InMessage* message)
-{
- LOG_INFO("");
- _migrate.abort();
-}
-
-void RedClient::handle_migrate_end(RedPeer::InMessage* message)
-{
- LOG_INFO("");
-
- Lock lock(_channels_lock);
- ASSERT(_pending_mig_disconnect_channels.empty());
- Channels::iterator iter = _channels.begin();
- for (; iter != _channels.end(); ++iter) {
- (*iter)->disconnect_migration_src();
- _pending_mig_disconnect_channels.push_back(*iter);
- }
- RedChannel::disconnect_migration_src();
- _pending_mig_disconnect_channels.push_back(this);
- _during_migration = true;
-}
-
-void RedClient::on_channel_disconnect_mig_src_completed(RedChannel& channel)
-{
- Lock lock(_channels_lock);
- Channels::iterator pending_iter = std::find(_pending_mig_disconnect_channels.begin(),
- _pending_mig_disconnect_channels.end(),
- &channel);
-
- LOG_INFO("");
- if (pending_iter == _pending_mig_disconnect_channels.end()) {
- THROW("unexpected channel");
- }
-
- _pending_mig_disconnect_channels.erase(pending_iter);
- /* clean shared data when all channels have disconnected */
- if (_pending_mig_disconnect_channels.empty()) {
- _pixmap_cache.clear();
- _glz_window.clear();
- memset(_sync_info, 0, sizeof(_sync_info));
- LOG_INFO("calling main to connect and wait for handle_init to tell all the other channels to connect");
- RedChannel::connect_migration_target();
- AutoRef<MigrateEndEvent> mig_end_event(new MigrateEndEvent());
- get_process_loop().push_event(*mig_end_event);
- }
-}
-
-void RedClient::send_migrate_end()
-{
- Message* message = new Message(SPICE_MSGC_MAIN_MIGRATE_END);
- post_message(message);
-}
-
-ChannelFactory* RedClient::find_factory(uint32_t type)
-{
- Factorys::iterator iter = _factorys.begin();
- for (; iter != _factorys.end(); ++iter) {
- if ((*iter)->type() == type) {
- return *iter;
- }
- }
- LOG_WARN("no factory for %u", type);
- return NULL;
-}
-
-void RedClient::create_channel(uint32_t type, uint32_t id)
-{
- ChannelFactory* factory = find_factory(type);
- if (!factory) {
- return;
- }
- RedChannel* channel = factory->construct(*this, id);
- ASSERT(channel);
- Lock lock(_channels_lock);
- _channels.push_back(channel);
- channel->start();
- channel->connect();
- _migrate.add_channel(new MigChannel(type, id, channel->get_common_caps(), channel->get_caps()));
-}
-
-void RedClient::send_agent_monitors_config()
-{
- AutoRef<MonitorsQuery > qury(new MonitorsQuery());
- push_event(*qury);
- (*qury)->wait();
- if (!(*qury)->success()) {
- THROW(" monitors query failed");
- }
-
- double min_distance = INFINITY;
- int dx = 0;
- int dy = 0;
- int i;
-
- std::vector<MonitorInfo>& monitors = (*qury)->get_monitors();
- std::vector<MonitorInfo>::iterator iter = monitors.begin();
- for (; iter != monitors.end(); iter++) {
- double distance = sqrt(pow((double)(*iter).position.x, 2) + pow((double)(*iter).position.y,
- 2));
- if (distance < min_distance) {
- min_distance = distance;
- dx = -(*iter).position.x;
- dy = -(*iter).position.y;
- }
- }
-
- Message* message = new Message(SPICE_MSGC_MAIN_AGENT_DATA);
- VDAgentMessage* msg = (VDAgentMessage*)
- spice_marshaller_reserve_space(message->marshaller(), sizeof(VDAgentMessage));
- msg->protocol = VD_AGENT_PROTOCOL;
- msg->type = VD_AGENT_MONITORS_CONFIG;
- msg->opaque = 0;
- msg->size = sizeof(VDAgentMonitorsConfig) + monitors.size() * sizeof(VDAgentMonConfig);
-
- VDAgentMonitorsConfig* mon_config = (VDAgentMonitorsConfig*)
- spice_marshaller_reserve_space(message->marshaller(),
- sizeof(VDAgentMonitorsConfig) + monitors.size() * sizeof(VDAgentMonConfig));
- mon_config->num_of_monitors = monitors.size();
- mon_config->flags = 0;
- if (Platform::is_monitors_pos_valid()) {
- mon_config->flags = VD_AGENT_CONFIG_MONITORS_FLAG_USE_POS;
- }
- for (iter = monitors.begin(), i = 0; iter != monitors.end(); iter++, i++) {
- mon_config->monitors[i].depth = (*iter).depth;
- mon_config->monitors[i].width = (*iter).size.x;
- mon_config->monitors[i].height = (*iter).size.y;
- mon_config->monitors[i].x = (*iter).position.x + dx;
- mon_config->monitors[i].y = (*iter).position.y + dy;
- }
- ASSERT(_agent_tokens)
- _agent_tokens--;
- post_message(message);
- _agent_mon_config_sent = true;
- _agent_reply_wait_type = VD_AGENT_MONITORS_CONFIG;
-}
-
-void RedClient::send_agent_announce_capabilities(bool request)
-{
- Message* message = new Message(SPICE_MSGC_MAIN_AGENT_DATA);
- VDAgentMessage* msg = (VDAgentMessage*)
- spice_marshaller_reserve_space(message->marshaller(),
- sizeof(VDAgentMessage));
- VDAgentAnnounceCapabilities* caps;
-
- msg->protocol = VD_AGENT_PROTOCOL;
- msg->type = VD_AGENT_ANNOUNCE_CAPABILITIES;
- msg->opaque = 0;
- msg->size = sizeof(VDAgentAnnounceCapabilities) + VD_AGENT_CAPS_BYTES;
-
- caps = (VDAgentAnnounceCapabilities*)
- spice_marshaller_reserve_space(message->marshaller(), msg->size);
-
- caps->request = request;
- memset(caps->caps, 0, VD_AGENT_CAPS_BYTES);
- VD_AGENT_SET_CAPABILITY(caps->caps, VD_AGENT_CAP_MOUSE_STATE);
- VD_AGENT_SET_CAPABILITY(caps->caps, VD_AGENT_CAP_MONITORS_CONFIG);
- VD_AGENT_SET_CAPABILITY(caps->caps, VD_AGENT_CAP_REPLY);
- VD_AGENT_SET_CAPABILITY(caps->caps, VD_AGENT_CAP_DISPLAY_CONFIG);
- VD_AGENT_SET_CAPABILITY(caps->caps, VD_AGENT_CAP_CLIPBOARD_BY_DEMAND);
- ASSERT(_agent_tokens)
- _agent_tokens--;
- post_message(message);
-}
-
-void RedClient::send_agent_display_config()
-{
- Message* message = new Message(SPICE_MSGC_MAIN_AGENT_DATA);
- VDAgentMessage* msg = (VDAgentMessage*)
- spice_marshaller_reserve_space(message->marshaller(), sizeof(VDAgentMessage));
- VDAgentDisplayConfig* disp_config;
-
- DBG(0,"");
- msg->protocol = VD_AGENT_PROTOCOL;
- msg->type = VD_AGENT_DISPLAY_CONFIG;
- msg->opaque = 0;
- msg->size = sizeof(VDAgentDisplayConfig);
-
- disp_config = (VDAgentDisplayConfig*)
- spice_marshaller_reserve_space(message->marshaller(), sizeof(VDAgentDisplayConfig));
-
- disp_config->flags = 0;
- disp_config->depth = 0;
- if (_display_setting._disable_wallpaper) {
- disp_config->flags |= VD_AGENT_DISPLAY_CONFIG_FLAG_DISABLE_WALLPAPER;
- }
-
- if (_display_setting._disable_font_smooth) {
- disp_config->flags |= VD_AGENT_DISPLAY_CONFIG_FLAG_DISABLE_FONT_SMOOTH;
- }
-
- if (_display_setting._disable_animation) {
- disp_config->flags |= VD_AGENT_DISPLAY_CONFIG_FLAG_DISABLE_ANIMATION;
- }
-
- if (_display_setting._set_color_depth) {
- disp_config->flags |= VD_AGENT_DISPLAY_CONFIG_FLAG_SET_COLOR_DEPTH;
- disp_config->depth = _display_setting._color_depth;
- }
-
- ASSERT(_agent_tokens)
- _agent_tokens--;
- post_message(message);
- _agent_disp_config_sent = true;
-
- if (!_display_setting.is_empty()) {
- _agent_reply_wait_type = VD_AGENT_DISPLAY_CONFIG;
- }
-}
-
-#define MIN_DISPLAY_PIXMAP_CACHE (1024 * 1024 * 20)
-#define MAX_DISPLAY_PIXMAP_CACHE (1024 * 1024 * 80)
-#define MIN_MEM_FOR_OTHERS (1024 * 1024 * 40)
-
-// tmp till the pci mem will be shared by the qxls
-#define MIN_GLZ_WINDOW_SIZE (1024 * 1024 * 12)
-#define MAX_GLZ_WINDOW_SIZE MIN((LZ_MAX_WINDOW_SIZE * 4), 1024 * 1024 * 64)
-
-void RedClient::calc_pixmap_cach_and_glz_window_size(uint32_t display_channels_hint,
- uint32_t pci_mem_hint)
-{
-#ifdef WIN32
- display_channels_hint = MAX(1, display_channels_hint);
- uint64_t max_cache_size = display_channels_hint * MAX_DISPLAY_PIXMAP_CACHE;
- uint64_t min_cache_size = display_channels_hint * MIN_DISPLAY_PIXMAP_CACHE;
-
- MEMORYSTATUSEX mem_status;
- mem_status.dwLength = sizeof(mem_status);
-
- if (!GlobalMemoryStatusEx(&mem_status)) {
- THROW("get mem status failed %u", GetLastError());
- }
-
- //ullTotalPageFile is physical memory plus the size of the page file, minus a small overhead
- uint64_t free_mem = mem_status.ullAvailPageFile;
- if (free_mem < (min_cache_size + MIN_MEM_FOR_OTHERS + MIN_GLZ_WINDOW_SIZE)) {
- THROW_ERR(SPICEC_ERROR_CODE_NOT_ENOUGH_MEMORY, "low memory condition");
- }
- free_mem -= MIN_MEM_FOR_OTHERS;
- _glz_window_size = MIN(MAX_GLZ_WINDOW_SIZE, pci_mem_hint / 2);
- _glz_window_size = (int)MIN(free_mem / 3, _glz_window_size);
- _glz_window_size = MAX(MIN_GLZ_WINDOW_SIZE, _glz_window_size);
- free_mem -= _glz_window_size;
- _pixmap_cache_size = MIN(free_mem, mem_status.ullAvailVirtual);
- _pixmap_cache_size = MIN(free_mem, max_cache_size);
-#else
- //for now
- _glz_window_size = (int)MIN(MAX_GLZ_WINDOW_SIZE, pci_mem_hint / 2);
- _glz_window_size = MAX(MIN_GLZ_WINDOW_SIZE, _glz_window_size);
- _pixmap_cache_size = MAX_DISPLAY_PIXMAP_CACHE;
-#endif
-
- _pixmap_cache_size /= 4;
- _glz_window_size /= 4;
-}
-
-void RedClient::on_display_mode_change()
-{
-#ifdef USE_OPENGL
- Lock lock(_channels_lock);
- Channels::iterator iter = _channels.begin();
- for (; iter != _channels.end(); ++iter) {
- if ((*iter)->get_type() == SPICE_CHANNEL_DISPLAY) {
- ((DisplayChannel *)(*iter))->recreate_ogl_context();
- }
- }
-#endif
-}
-
-void RedClient::do_send_agent_clipboard()
-{
- uint32_t size;
-
- while (_agent_tokens &&
- (size = MIN(VD_AGENT_MAX_DATA_SIZE,
- _agent_out_msg_size - _agent_out_msg_pos))) {
- Message* message = new Message(SPICE_MSGC_MAIN_AGENT_DATA);
- void* data = spice_marshaller_reserve_space(message->marshaller(), size);
- memcpy(data, (uint8_t*)_agent_out_msg + _agent_out_msg_pos, size);
- _agent_tokens--;
- post_message(message);
- _agent_out_msg_pos += size;
- if (_agent_out_msg_pos == _agent_out_msg_size) {
- delete[] (uint8_t *)_agent_out_msg;
- _agent_out_msg = NULL;
- _agent_out_msg_size = 0;
- _agent_out_msg_pos = 0;
- }
- }
-}
-
-void RedClient::send_agent_clipboard_message(uint32_t message_type, uint32_t size, void* data)
-{
- if (!_agent_connected)
- return;
-
- if (!VD_AGENT_HAS_CAPABILITY(_agent_caps, _agent_caps_size,
- VD_AGENT_CAP_CLIPBOARD_BY_DEMAND))
- return;
-
- Message* message = new Message(SPICE_MSGC_MAIN_AGENT_DATA);
- VDAgentMessage* msg = (VDAgentMessage*)
- spice_marshaller_reserve_space(message->marshaller(), sizeof(VDAgentMessage) + size);
- msg->protocol = VD_AGENT_PROTOCOL;
- msg->type = message_type;
- msg->opaque = 0;
- msg->size = size;
- if (size && data) {
- memcpy(msg->data, data, size);
- }
- ASSERT(_agent_tokens)
- _agent_tokens--;
- post_message(message);
-}
-
-void RedClient::on_clipboard_grab(uint32_t *types, uint32_t type_count)
-{
- AutoRef<ClipboardGrabEvent> event(new ClipboardGrabEvent(types, type_count));
- get_process_loop().push_event(*event);
-}
-
-void RedClient::on_clipboard_request(uint32_t type)
-{
- AutoRef<ClipboardRequestEvent> event(new ClipboardRequestEvent(type));
- get_process_loop().push_event(*event);
-}
-
-void RedClient::on_clipboard_notify(uint32_t type, uint8_t* data, int32_t size)
-{
- AutoRef<ClipboardNotifyEvent> event(new ClipboardNotifyEvent(type, data, size));
- get_process_loop().push_event(*event);
-}
-
-void RedClient::on_clipboard_release()
-{
- AutoRef<ClipboardReleaseEvent> event(new ClipboardReleaseEvent());
- get_process_loop().push_event(*event);
-}
-
-void RedClient::send_agent_clipboard_notify_message(uint32_t type, uint8_t *data, uint32_t size)
-{
- ASSERT(data || !size);
- if (!_agent_connected) {
- return;
- }
- if (!VD_AGENT_HAS_CAPABILITY(_agent_caps, _agent_caps_size,
- VD_AGENT_CAP_CLIPBOARD_BY_DEMAND))
- return;
- if (_agent_out_msg) {
- DBG(0, "clipboard change is already pending");
- return;
- }
- if (Platform::get_clipboard_owner() != Platform::owner_client) {
- LOG_WARN("received clipboard data from client while clipboard is not owned by client");
- type = VD_AGENT_CLIPBOARD_NONE;
- size = 0;
- }
- _agent_out_msg_pos = 0;
- _agent_out_msg_size = sizeof(VDAgentMessage) + sizeof(VDAgentClipboard) + size;
- _agent_out_msg = (VDAgentMessage*)new uint8_t[_agent_out_msg_size];
- _agent_out_msg->protocol = VD_AGENT_PROTOCOL;
- _agent_out_msg->type = VD_AGENT_CLIPBOARD;
- _agent_out_msg->opaque = 0;
- _agent_out_msg->size = sizeof(VDAgentClipboard) + size;
- VDAgentClipboard* clipboard = (VDAgentClipboard*)_agent_out_msg->data;
- clipboard->type = type;
- memcpy(clipboard->data, data, size);
- if (_agent_tokens) {
- do_send_agent_clipboard();
- }
-}
-
-void RedClient::set_mouse_mode(uint32_t supported_modes, uint32_t current_mode)
-{
- if (current_mode != _mouse_mode) {
- _mouse_mode = current_mode;
- Lock lock(_channels_lock);
- Channels::iterator iter = _channels.begin();
- for (; iter != _channels.end(); ++iter) {
- if ((*iter)->get_type() == SPICE_CHANNEL_CURSOR) {
- ((CursorChannel *)(*iter))->on_mouse_mode_change();
- }
- }
- AutoRef<MouseModeEvent> event(new MouseModeEvent(*this));
- push_event(*event);
- }
- // FIXME: use configured mouse mode (currently, use client mouse mode if supported by server)
- if ((supported_modes & SPICE_MOUSE_MODE_CLIENT) && (current_mode != SPICE_MOUSE_MODE_CLIENT)) {
- Message* message = new Message(SPICE_MSGC_MAIN_MOUSE_MODE_REQUEST);
- SpiceMsgcMainMouseModeRequest mouse_mode_request;
- mouse_mode_request.mode = SPICE_MOUSE_MODE_CLIENT;
- _marshallers->msgc_main_mouse_mode_request(message->marshaller(),
- &mouse_mode_request);
-
- post_message(message);
- }
-}
-
-/* returns true if we should wait for a response from the agent */
-bool RedClient::init_guest_display()
-{
- if (_agent_connected) {
- if (_auto_display_res) {
- send_agent_monitors_config();
- }
-
- if (_auto_display_res || !_display_setting.is_empty()) {
- _application.activate_interval_timer(*_agent_timer, AGENT_TIMEOUT);
- } else {
- return false;
- }
- } else {
- if (_auto_display_res || !_display_setting.is_empty()) {
- LOG_WARN("no agent running, display options have been ignored");
- }
- return false;
- }
- return true;
-}
-
-void RedClient::handle_init(RedPeer::InMessage* message)
-{
- SpiceMsgMainInit *init = (SpiceMsgMainInit *)message->data();
- LOG_INFO("");
- _connection_id = init->session_id;
- set_mm_time(init->multi_media_time);
- if (!_during_migration) {
- calc_pixmap_cach_and_glz_window_size(init->display_channels_hint, init->ram_hint);
- }
- set_mouse_mode(init->supported_mouse_modes, init->current_mouse_mode);
- _agent_tokens = init->agent_tokens;
- _agent_connected = !!init->agent_connected;
- if (_agent_connected) {
- Message* msg = new Message(SPICE_MSGC_MAIN_AGENT_START);
- SpiceMsgcMainAgentStart agent_start;
- agent_start.num_tokens = ~0;
- _marshallers->msgc_main_agent_start(msg->marshaller(), &agent_start);
- post_message(msg);
- send_agent_announce_capabilities(true);
- }
-
- if (!_during_migration) {
- if (!init_guest_display()) {
- send_main_attach_channels();
- }
- } else {
- LOG_INFO("connecting all channels after migration");
- Channels::iterator iter = _channels.begin();
- for (; iter != _channels.end(); ++iter) {
- (*iter)->connect_migration_target();
- }
- _during_migration = false;
- }
-}
-
-void RedClient::handle_channels(RedPeer::InMessage* message)
-{
- SpiceMsgChannels *init = (SpiceMsgChannels *)message->data();
- SpiceChannelId* channels = init->channels;
- for (unsigned int i = 0; i < init->num_of_channels; i++) {
- create_channel(channels[i].type, channels[i].id);
- }
-}
-
-void RedClient::handle_mouse_mode(RedPeer::InMessage* message)
-{
- SpiceMsgMainMouseMode *mouse_mode = (SpiceMsgMainMouseMode *)message->data();
- set_mouse_mode(mouse_mode->supported_modes, mouse_mode->current_mode);
-}
-
-void RedClient::handle_mm_time(RedPeer::InMessage* message)
-{
- SpiceMsgMainMultiMediaTime *mm_time = (SpiceMsgMainMultiMediaTime *)message->data();
- set_mm_time(mm_time->time);
-}
-
-void RedClient::handle_agent_connected(RedPeer::InMessage* message)
-{
- DBG(0, "");
- _agent_connected = true;
- Message* msg = new Message(SPICE_MSGC_MAIN_AGENT_START);
- SpiceMsgcMainAgentStart agent_start;
- agent_start.num_tokens = ~0;
- _marshallers->msgc_main_agent_start(msg->marshaller(), &agent_start);
- post_message(msg);
- send_agent_announce_capabilities(false);
-
- if (_auto_display_res && !_agent_mon_config_sent) {
- send_agent_monitors_config();
- }
-}
-
-void RedClient::handle_agent_disconnected(RedPeer::InMessage* message)
-{
- DBG(0, "");
- _agent_connected = false;
-}
-
-void RedClient::send_main_attach_channels(void)
-{
- if (_msg_attach_channels_sent)
- return;
-
- post_message(new Message(SPICE_MSGC_MAIN_ATTACH_CHANNELS));
- _msg_attach_channels_sent = true;
-}
-
-void RedClient::on_agent_announce_capabilities(
- VDAgentAnnounceCapabilities* caps, uint32_t msg_size)
-{
- uint32_t caps_size = VD_AGENT_CAPS_SIZE_FROM_MSG_SIZE(msg_size);
-
- if (_agent_caps_size != caps_size) {
- delete[] _agent_caps;
- _agent_caps = new uint32_t[caps_size];
- ASSERT(_agent_caps != NULL);
- _agent_caps_size = caps_size;
- }
- memcpy(_agent_caps, caps->caps, sizeof(_agent_caps[0]) * caps_size);
-
- if (caps->request) {
- send_agent_announce_capabilities(false);
- }
- if (VD_AGENT_HAS_CAPABILITY(caps->caps, caps_size,
- VD_AGENT_CAP_DISPLAY_CONFIG) && !_agent_disp_config_sent) {
- // not sending the color depth through send_agent_monitors_config, since
- // it applies only for attached screens.
- send_agent_display_config();
- } else if (!_auto_display_res) {
- /* some agents don't support monitors/displays agent messages, so
- * we'll never reach on_agent_reply which sends this
- * ATTACH_CHANNELS message which is needed for client startup to go
- * on.
- */
- if (!_display_setting.is_empty()) {
- LOG_WARN("display options have been requested, but the agent doesn't support these options");
- }
- send_main_attach_channels();
- _application.deactivate_interval_timer(*_agent_timer);
- }
-}
-
-void RedClient::on_agent_reply(VDAgentReply* reply)
-{
- DBG(0, "agent reply type: %d", reply->type);
- switch (reply->error) {
- case VD_AGENT_SUCCESS:
- break;
- case VD_AGENT_ERROR:
- THROW_ERR(SPICEC_ERROR_CODE_AGENT_ERROR, "vdagent error");
- default:
- THROW("unknown vdagent error");
- }
- switch (reply->type) {
- case VD_AGENT_MONITORS_CONFIG:
- case VD_AGENT_DISPLAY_CONFIG:
- if (_agent_reply_wait_type == reply->type) {
- send_main_attach_channels();
- _application.deactivate_interval_timer(*_agent_timer);
- _agent_reply_wait_type = VD_AGENT_END_MESSAGE;
- }
- break;
- default:
- THROW("unexpected vdagent reply type");
- }
-}
-
-void RedClient::handle_agent_data(RedPeer::InMessage* message)
-{
- uint32_t msg_size = message->size();
- uint8_t* msg_pos = message->data();
- uint32_t n;
-
- DBG(0, "");
- while (msg_size) {
- if (_agent_msg_pos < sizeof(VDAgentMessage)) {
- n = MIN(sizeof(VDAgentMessage) - _agent_msg_pos, msg_size);
- memcpy((uint8_t*)_agent_msg + _agent_msg_pos, msg_pos, n);
- _agent_msg_pos += n;
- msg_size -= n;
- msg_pos += n;
- if (_agent_msg_pos == sizeof(VDAgentMessage)) {
- DBG(0, "agent msg start: msg_size=%d, protocol=%d, type=%d",
- _agent_msg->size, _agent_msg->protocol, _agent_msg->type);
- if (_agent_msg->protocol != VD_AGENT_PROTOCOL) {
- THROW("Invalid protocol %u", _agent_msg->protocol);
- }
- _agent_msg_data = new uint8_t[_agent_msg->size];
- }
- }
- if (_agent_msg_pos >= sizeof(VDAgentMessage)) {
- n = MIN(sizeof(VDAgentMessage) + _agent_msg->size - _agent_msg_pos, msg_size);
- memcpy(_agent_msg_data + _agent_msg_pos - sizeof(VDAgentMessage), msg_pos, n);
- _agent_msg_pos += n;
- msg_size -= n;
- msg_pos += n;
- }
- if (_agent_msg_pos == sizeof(VDAgentMessage) + _agent_msg->size) {
- DBG(0, "agent msg end");
- dispatch_agent_message(_agent_msg, _agent_msg_data);
- delete[] _agent_msg_data;
- _agent_msg_data = NULL;
- _agent_msg_pos = 0;
- }
- }
-}
-
-void RedClient::dispatch_agent_message(VDAgentMessage* msg, void* data)
-{
- switch (msg->type) {
- case VD_AGENT_ANNOUNCE_CAPABILITIES: {
- on_agent_announce_capabilities((VDAgentAnnounceCapabilities*)data, msg->size);
- break;
- }
- case VD_AGENT_REPLY: {
- on_agent_reply((VDAgentReply*)data);
- break;
- }
- case VD_AGENT_CLIPBOARD: {
- if (Platform::get_clipboard_owner() != Platform::owner_guest) {
- LOG_WARN("received clipboard data from guest while clipboard is not owned by guest");
- Platform::on_clipboard_notify(VD_AGENT_CLIPBOARD_NONE, NULL, 0);
- break;
- }
-
- VDAgentClipboard* clipboard = (VDAgentClipboard*)data;
- Platform::on_clipboard_notify(clipboard->type, clipboard->data,
- msg->size - sizeof(VDAgentClipboard));
- break;
- }
- case VD_AGENT_CLIPBOARD_GRAB:
- Platform::on_clipboard_grab((uint32_t *)data,
- msg->size / sizeof(uint32_t));
- break;
- case VD_AGENT_CLIPBOARD_REQUEST:
- if (Platform::get_clipboard_owner() != Platform::owner_client) {
- LOG_WARN("received clipboard req from guest while clipboard is not owned by client");
- on_clipboard_notify(VD_AGENT_CLIPBOARD_NONE, NULL, 0);
- break;
- }
-
- if (!Platform::on_clipboard_request(((VDAgentClipboardRequest*)data)->type)) {
- on_clipboard_notify(VD_AGENT_CLIPBOARD_NONE, NULL, 0);
- }
- break;
- case VD_AGENT_CLIPBOARD_RELEASE:
- if (Platform::get_clipboard_owner() != Platform::owner_guest) {
- LOG_INFO("received clipboard release from guest while clipboard is not owned by guest");
- break;
- }
-
- Platform::on_clipboard_release();
- break;
- default:
- DBG(0, "Unsupported message type %u size %u", msg->type, msg->size);
- }
-}
-
-void RedClient::handle_agent_tokens(RedPeer::InMessage* message)
-{
- SpiceMsgMainAgentTokens *token = (SpiceMsgMainAgentTokens *)message->data();
- _agent_tokens += token->num_tokens;
- if (_agent_out_msg_pos < _agent_out_msg_size) {
- do_send_agent_clipboard();
- }
-}
-
-void RedClient::handle_migrate_switch_host(RedPeer::InMessage* message)
-{
- SpiceMsgMainMigrationSwitchHost* migrate = (SpiceMsgMainMigrationSwitchHost*)message->data();
- char* host = (char *)migrate->host_data;
- char* subject = NULL;
-
- if (host[migrate->host_size - 1] != '\0') {
- THROW("host is not a null-terminated string");
- }
-
- if (migrate->cert_subject_size) {
- subject = (char *)migrate->cert_subject_data;
- if (subject[migrate->cert_subject_size - 1] != '\0') {
- THROW("cert subject is not a null-terminated string");
- }
- }
-
- AutoRef<SwitchHostEvent> switch_event(new SwitchHostEvent(host,
- migrate->port,
- migrate->sport,
- subject));
- push_event(*switch_event);
-}
-
-
-void RedClient::migrate_channel(RedChannel& channel)
-{
- DBG(0, "channel type %u id %u", channel.get_type(), channel.get_id());
- _migrate.swap_peer(channel);
-}
-
-void RedClient::get_sync_info(uint8_t channel_type, uint8_t channel_id, SyncInfo& info)
-{
- info.lock = &_sync_lock;
- info.condition = &_sync_condition;
- info.message_serial = &_sync_info[channel_type][channel_id];
-}
-
-void RedClient::wait_for_channels(int wait_list_size, SpiceWaitForChannel* wait_list)
-{
- for (int i = 0; i < wait_list_size; i++) {
- if (wait_list[i].channel_type >= SPICE_END_CHANNEL) {
- THROW("invalid channel type %u", wait_list[i].channel_type);
- }
- uint64_t& sync_cell = _sync_info[wait_list[i].channel_type][wait_list[i].channel_id];
-#ifndef RED64
- Lock lock(_sync_lock);
-#endif
- if (sync_cell >= wait_list[i].message_serial) {
- continue;
- }
-#ifdef RED64
- Lock lock(_sync_lock);
-#endif
- for (;;) {
- if (sync_cell >= wait_list[i].message_serial) {
- break;
- }
- if (_aborting) {
- THROW("aborting");
- }
- _sync_condition.wait(lock);
- continue;
- }
- }
-}
-
-void RedClient::set_mm_time(uint32_t time)
-{
- Lock lock(_mm_clock_lock);
- _mm_clock_last_update = Platform::get_monolithic_time();
- _mm_time = time;
-}
-
-uint32_t RedClient::get_mm_time()
-{
- Lock lock(_mm_clock_lock);
- return uint32_t((Platform::get_monolithic_time() - _mm_clock_last_update) / 1000 / 1000 +
- _mm_time);
-}
-
-void RedClient::register_channel_factory(ChannelFactory& factory)
-{
- _factorys.push_back(&factory);
-}
diff --git a/client/red_client.h b/client/red_client.h
deleted file mode 100644
index c4b418a2..00000000
--- a/client/red_client.h
+++ /dev/null
@@ -1,387 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_REDCLIENT
-#define _H_REDCLIENT
-
-#include <list>
-#include "common/messages.h"
-
-#include "common.h"
-#include "red_peer.h"
-#include "red_channel.h"
-#include "display_channel.h"
-#include "inputs_channel.h"
-#include "cursor_channel.h"
-#include "audio_channels.h"
-#include <spice/vd_agent.h>
-#include "process_loop.h"
-
-class Application;
-
-class MigChannel: public RedChannelBase {
-public:
- MigChannel(uint32_t type, uint32_t id, const ChannelCaps& common_caps, const ChannelCaps& caps)
- : RedChannelBase(type, id, common_caps, caps)
- , _valid(false) {}
- bool is_valid() { return _valid;}
- void set_valid(bool val) { _valid = val;}
-
-private:
- bool _valid;
-};
-
-class Migrate {
-public:
- Migrate(RedClient& client);
- ~Migrate();
-
- void start(const SpiceMsgMainMigrationBegin* migrate);
- bool abort();
- void add_channel(MigChannel* channel);
- void clear_channels();
- void swap_peer(RedChannelBase& other);
-
-private:
- void connect_one(MigChannel& channel, const RedPeer::ConnectionOptions& options,
- uint32_t connection_id);
- void disconnect_channels();
- void close_channels();
- void delete_channels();
- void run();
- static void* worker_main(void *data);
-
-private:
- RedClient& _client;
- typedef std::list<MigChannel*> MigChannels;
- MigChannels _channels;
- bool _running;
- bool _aborting;
- bool _connected;
- std::string _password;
- std::string _host;
- int _port;
- int _sport;
- RedPeer::HostAuthOptions _auth_options;
- std::string _con_ciphers;
- Thread* _thread;
- Mutex _lock;
- Condition _cond;
- int _pending_con;
- int _protocol;
-};
-
-class ChannelFactory {
-public:
- ChannelFactory(uint32_t type) : _type (type) {}
- virtual ~ChannelFactory() {}
-
- uint32_t type() { return _type;}
- virtual RedChannel* construct(RedClient& client, uint32_t id) = 0;
-
-private:
- uint32_t _type;
-};
-
-class GlzDecoderWindowDebug: public GlzDecoderDebug {
-public:
- virtual SPICE_GNUC_NORETURN void error(const std::string& str)
- {
- throw Exception(str);
- }
-
- virtual void warn(const std::string& str)
- {
- LOG_WARN("%s", str.c_str());
- }
-
- virtual void info(const std::string& str)
- {
- LOG_INFO("%s", str.c_str());
- }
-};
-
-class RedClient;
-
-class AgentTimer: public Timer {
-public:
- virtual void response(AbstractProcessLoop& events_loop);
- AgentTimer(RedClient *client) : _client(client) {};
-private:
- RedClient *_client;
-};
-
-typedef std::map< int, RedPeer::ConnectionOptions::Type> PeerConnectionOptMap;
-
-class ForEachChannelFunc {
-public:
- virtual bool operator() (RedChannel& channel) = 0;
-};
-
-class DisplaySetting {
-public:
- DisplaySetting() : _disable_wallpaper (false)
- , _disable_font_smooth (false)
- , _disable_animation (false)
- , _set_color_depth (false)
- {}
-
- bool is_empty() {return !(_disable_wallpaper || _disable_font_smooth ||
- _disable_animation || _set_color_depth);}
-
-public:
- bool _disable_wallpaper;
- bool _disable_font_smooth;
- bool _disable_animation;
- bool _set_color_depth;
- uint32_t _color_depth;
-};
-
-class ClipboardGrabEvent : public Event {
-public:
- ClipboardGrabEvent(uint32_t *types, uint32_t type_count)
- {
- _types = new uint32_t [type_count];
- memcpy(_types, types, type_count * sizeof(uint32_t));
- _type_count = type_count;
- }
- ~ClipboardGrabEvent()
- {
- delete[] _types;
- }
-
- virtual void response(AbstractProcessLoop& events_loop);
-
-private:
- uint32_t *_types;
- uint32_t _type_count;
-};
-
-class ClipboardRequestEvent : public Event {
-public:
- ClipboardRequestEvent(uint32_t type) : _type (type) {}
- virtual void response(AbstractProcessLoop& events_loop);
-
-private:
- uint32_t _type;
-};
-
-class ClipboardNotifyEvent : public Event {
-public:
- ClipboardNotifyEvent(uint32_t type, uint8_t *data, uint32_t size)
- {
- _type = type;
- _data = new uint8_t [size];
- memcpy(_data, data, size);
- _size = size;
- }
- ~ClipboardNotifyEvent()
- {
- delete[] _data;
- }
-
- virtual void response(AbstractProcessLoop& events_loop);
-
-private:
- uint32_t _type;
- uint8_t *_data;
- uint32_t _size;
-};
-
-class ClipboardReleaseEvent : public Event {
-public:
- ClipboardReleaseEvent() {}
- virtual void response(AbstractProcessLoop& events_loop);
-};
-
-class MigrateEndEvent: public Event {
-public:
- virtual void response(AbstractProcessLoop& events_loop);
-};
-
-class RedClient: public RedChannel,
- public Platform::ClipboardListener {
-public:
- friend class RedChannel;
- friend class Migrate;
- friend class ClipboardGrabEvent;
- friend class ClipboardRequestEvent;
- friend class ClipboardNotifyEvent;
- friend class ClipboardReleaseEvent;
- friend class MigrateEndEvent;
-
- RedClient(Application& application);
- ~RedClient();
-
- void register_channel_factory(ChannelFactory& factory);
-
- virtual void connect();
- virtual void disconnect();
- virtual bool abort();
-
- void connect(bool wait_main_disconnect);
-
- void push_event(Event* event);
- void activate_interval_timer(Timer* timer, unsigned int millisec);
- void deactivate_interval_timer(Timer* timer);
-
- void set_target(const std::string& host, int port, int sport, int protocol = 0);
- void set_password(const std::string& password) { _password = password;}
- void set_auto_display_res(bool auto_display_res) { _auto_display_res = auto_display_res;}
- void set_display_setting(DisplaySetting& setting) { _display_setting = setting;}
- const std::string& get_password() { return _password;}
- const std::string& get_host() { return _host;}
- int get_port() { return _port;}
- int get_sport() { return _sport;}
- int get_protocol() { return _protocol;}
- void set_protocol(int protocol) { _protocol = protocol;}
- virtual uint32_t get_connection_id() { return _connection_id;}
- uint32_t get_mouse_mode() { return _mouse_mode;}
- Application& get_application() { return _application;}
- bool is_auto_display_res() { return _auto_display_res;}
- RedPeer::ConnectionOptions::Type get_connection_options(uint32_t channel_type);
- RedPeer::HostAuthOptions& get_host_auth_options() { return _host_auth_opt;}
- const std::string& get_connection_ciphers() { return _con_ciphers;}
- void get_sync_info(uint8_t channel_type, uint8_t channel_id, SyncInfo& info);
- void wait_for_channels(int wait_list_size, SpiceWaitForChannel* wait_list);
- PixmapCache& get_pixmap_cache() {return _pixmap_cache;}
- uint64_t get_pixmap_cache_size() { return _pixmap_cache_size;}
- void on_display_mode_change();
- void on_clipboard_grab(uint32_t *types, uint32_t type_count);
- void on_clipboard_request(uint32_t type);
- void on_clipboard_notify(uint32_t type, uint8_t* data, int32_t size);
- void on_clipboard_release();
-
- void for_each_channel(ForEachChannelFunc& func);
- void on_mouse_capture_trigger(RedScreen& screen);
-
- GlzDecoderWindow& get_glz_window() {return _glz_window;}
- int get_glz_window_size() { return _glz_window_size;}
-
- void set_mm_time(uint32_t time);
- uint32_t get_mm_time();
- void send_main_attach_channels(void);
-
-protected:
- virtual void on_connecting();
- virtual void on_connect();
- virtual void on_disconnect();
- virtual void on_connect_mig_target() {}
- virtual void on_disconnect_mig_src();
-
-private:
- void on_channel_disconnected(RedChannel& channel);
- void on_channel_disconnect_mig_src_completed(RedChannel& channel);
- void send_migrate_end();
- void migrate_channel(RedChannel& channel);
- void send_agent_announce_capabilities(bool request);
- void send_agent_monitors_config();
- void send_agent_display_config();
- void calc_pixmap_cach_and_glz_window_size(uint32_t display_channels_hint,
- uint32_t pci_mem_hint);
- void set_mouse_mode(uint32_t supported_modes, uint32_t current_mode);
-
- void handle_migrate_begin(RedPeer::InMessage* message);
- void handle_migrate_cancel(RedPeer::InMessage* message);
- void handle_migrate_end(RedPeer::InMessage* message);
- void handle_init(RedPeer::InMessage* message);
- void handle_channels(RedPeer::InMessage* message);
- void handle_mouse_mode(RedPeer::InMessage* message);
- void handle_mm_time(RedPeer::InMessage* message);
- void handle_agent_connected(RedPeer::InMessage* message);
- void handle_agent_disconnected(RedPeer::InMessage* message);
- void handle_agent_data(RedPeer::InMessage* message);
- void handle_agent_tokens(RedPeer::InMessage* message);
- void handle_migrate_switch_host(RedPeer::InMessage* message);
- void dispatch_agent_message(VDAgentMessage* msg, void* data);
-
- bool init_guest_display();
- void on_agent_reply(VDAgentReply* reply);
- void on_agent_announce_capabilities(VDAgentAnnounceCapabilities* caps,
- uint32_t msg_size);
- void do_send_agent_clipboard();
- void send_agent_clipboard_message(uint32_t message_type, uint32_t size = 0, void* data = NULL);
- void send_agent_clipboard_notify_message(uint32_t type, uint8_t *data, uint32_t size);
-
- ChannelFactory* find_factory(uint32_t type);
- void create_channel(uint32_t type, uint32_t id);
- void disconnect_channels();
- void delete_channels();
- bool abort_channels();
-
-private:
- Application& _application;
-
- std::string _host;
- int _port;
- int _sport;
- int _protocol;
- std::string _password;
- uint32_t _connection_id;
- uint32_t _mouse_mode;
- Mutex _notify_lock;
- bool _notify_disconnect;
- bool _auto_display_res;
- DisplaySetting _display_setting;
- uint32_t _agent_reply_wait_type;
-
- bool _aborting;
- bool _msg_attach_channels_sent;
-
- bool _agent_connected;
- bool _agent_mon_config_sent;
- bool _agent_disp_config_sent;
- //FIXME: rename to in/out, extract all agent stuff?
- VDAgentMessage* _agent_msg;
- uint8_t* _agent_msg_data;
- uint32_t _agent_msg_pos;
- VDAgentMessage* _agent_out_msg;
- uint32_t _agent_out_msg_size;
- uint32_t _agent_out_msg_pos;
- uint32_t _agent_tokens;
- AutoRef<AgentTimer> _agent_timer;
- uint32_t _agent_caps_size;
- uint32_t *_agent_caps;
-
- PeerConnectionOptMap _con_opt_map;
- RedPeer::HostAuthOptions _host_auth_opt;
- std::string _con_ciphers;
- Migrate _migrate;
- Mutex _channels_lock;
- typedef std::list<ChannelFactory*> Factorys;
- Factorys _factorys;
- typedef std::list<RedChannel*> Channels;
- Channels _channels;
- Channels _pending_mig_disconnect_channels;
- PixmapCache _pixmap_cache;
- uint64_t _pixmap_cache_size;
- Mutex _sync_lock;
- Condition _sync_condition;
- uint64_t _sync_info[SPICE_END_CHANNEL][256];
-
- GlzDecoderWindowDebug _glz_debug;
- GlzDecoderWindow _glz_window;
- unsigned int _glz_window_size; // in pixels
-
- Mutex _mm_clock_lock;
- uint64_t _mm_clock_last_update;
- uint32_t _mm_time;
-
- bool _during_migration;
-};
-
-#endif
diff --git a/client/red_drawable.h b/client/red_drawable.h
deleted file mode 100644
index 8ad3d4c4..00000000
--- a/client/red_drawable.h
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_RED_DRAWABLE
-#define _H_RED_DRAWABLE
-
-#include "common/pixman_utils.h"
-#include "pixels_source.h"
-#include "utils.h"
-
-typedef uint32_t rgb32_t;
-
-static inline rgb32_t rgb32_make(uint8_t r, uint8_t g, uint8_t b)
-{
- return (rgb32_t(r) << 16) | (rgb32_t(g) << 8) | b;
-}
-
-static inline uint8_t rgb32_get_red(rgb32_t color)
-{
- return color >> 16;
-}
-
-static inline uint8_t rgb32_get_green(rgb32_t color)
-{
- return color >> 8;
-}
-
-static inline uint8_t rgb32_get_blue(rgb32_t color)
-{
- return color;
-}
-
-class RedDrawable: public PixelsSource {
-public:
- RedDrawable() {}
- virtual ~RedDrawable() {}
-
- enum Format {
- ARGB32,
- RGB32,
- RGB16_555,
- RGB16_565,
- A1,
- };
-
- static int format_copy_compatible(Format src, Format dest) {
- return src == dest || (src == ARGB32 && dest == RGB32);
- }
-
- static int format_to_bpp(Format format) {
- if (format == RedDrawable::A1) {
- return 1;
- } else if (format == RGB16_555 || format == RGB16_565) {
- return 16;
- } else {
- return 32;
- }
- }
-
- static pixman_format_code_t format_to_pixman(Format format) {
- switch (format) {
- case RedDrawable::ARGB32:
- return PIXMAN_a8r8g8b8;
- case RedDrawable::RGB32:
- return PIXMAN_x8r8g8b8;
- case RedDrawable::RGB16_555:
- return PIXMAN_x1r5g5b5;
- case RedDrawable::RGB16_565:
- return PIXMAN_r5g6b5;
- case RedDrawable::A1:
- return PIXMAN_a1;
- default:
- THROW("unsupported format %d", format);
- }
- }
-
- static Format format_from_surface(uint32_t format) {
- switch (format) {
- case SPICE_SURFACE_FMT_16_555:
- return RedDrawable::RGB16_555;
- case SPICE_SURFACE_FMT_16_565:
- return RedDrawable::RGB16_565;
- case SPICE_SURFACE_FMT_32_xRGB:
- return RedDrawable::RGB32;
- case SPICE_SURFACE_FMT_32_ARGB:
- return RedDrawable::ARGB32;
- default:
- THROW("Unsupported RedPixman format");
- }
- }
-
- enum CombineOP {
- OP_COPY,
- OP_AND,
- OP_XOR,
- };
-
- virtual RedDrawable::Format get_format() = 0;
- void copy_pixels(const PixelsSource& src, int src_x, int src_y, const SpiceRect& dest);
- void blend_pixels(const PixelsSource& src, int src_x, int src_y, const SpiceRect& dest);
- void combine_pixels(const PixelsSource& src, int src_x, int src_y, const SpiceRect& dest,
- CombineOP op);
- void fill_rect(const SpiceRect& rect, rgb32_t color);
- void frame_rect(const SpiceRect& rect, rgb32_t color);
- void erase_rect(const SpiceRect& rect, rgb32_t color);
-};
-
-#endif
diff --git a/client/red_gdi_canvas.cpp b/client/red_gdi_canvas.cpp
deleted file mode 100644
index 09a15532..00000000
--- a/client/red_gdi_canvas.cpp
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#ifdef __MINGW32__
-#undef HAVE_STDLIB_H
-#endif
-#include <config.h>
-#endif
-
-#ifdef WIN32
-#include <winsock2.h>
-#endif
-#include <stdint.h>
-
-#include "common/region.h"
-#define SPICE_CANVAS_INTERNAL
-#define SW_CANVAS_CACHE
-#include "common/gdi_canvas.c"
-#undef SW_CANVAS_CACHE
-#undef SPICE_CANVAS_INTERNAL
-
-#include "common.h"
-#include "red_gdi_canvas.h"
-#include "utils.h"
-#include "debug.h"
-#include "red_pixmap_gdi.h"
-
-GDICanvas::GDICanvas(int width, int height, uint32_t format,
- PixmapCache& pixmap_cache, PaletteCache& palette_cache,
- GlzDecoderWindow &glz_decoder_window, SurfacesCache &csurfaces)
- : Canvas (pixmap_cache, palette_cache, glz_decoder_window, csurfaces)
- , _pixmap (0)
-{
- _pixmap = new RedPixmapGdi(width, height,
- RedDrawable::format_from_surface(format),
- true);
- if (!(_canvas = gdi_canvas_create(width, height, _pixmap->get_dc(),
- &_pixmap->get_mutex(),
- format, &pixmap_cache.base,
- &palette_cache.base,
- &csurfaces,
- &glz_decoder(),
- &jpeg_decoder(),
- &zlib_decoder()))) {
- THROW("create canvas failed");
- }
-}
-
-GDICanvas::~GDICanvas()
-{
- _canvas->ops->destroy(_canvas);
- _canvas = NULL;
- delete _pixmap;
- _pixmap = NULL;
-}
-
-void GDICanvas::copy_pixels(const QRegion& region, RedDrawable& dest_dc)
-{
- pixman_box32_t *rects;
- int num_rects;
-
- rects = pixman_region32_rectangles((pixman_region32_t *)&region, &num_rects);
- for (int i = 0; i < num_rects; i++) {
- SpiceRect r;
-
- r.left = rects[i].x1;
- r.top = rects[i].y1;
- r.right = rects[i].x2;
- r.bottom = rects[i].y2;
- dest_dc.copy_pixels(*_pixmap, r.left, r.top, r);
- }
-}
-
-void GDICanvas::copy_pixels(const QRegion& region, RedDrawable* dest_dc, const PixmapHeader* pixmap)
-{
- copy_pixels(region, *dest_dc);
-}
-
-
-CanvasType GDICanvas::get_pixmap_type()
-{
- return CANVAS_TYPE_GDI;
-}
diff --git a/client/red_gdi_canvas.h b/client/red_gdi_canvas.h
deleted file mode 100644
index dbebe331..00000000
--- a/client/red_gdi_canvas.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_GDICANVAS
-#define _H_GDICANVAS
-
-#include "canvas.h"
-#define SPICE_CANVAS_INTERNAL
-#define SW_CANVAS_CACHE
-#include "common/gdi_canvas.h"
-#undef SW_CANVAS_CACHE
-#undef SPICE_CANVAS_INTERNAL
-#include "red_pixmap_gdi.h"
-
-class RedPixmap;
-
-
-class GDICanvas: public Canvas {
-public:
- GDICanvas(int width, int height, uint32_t format,
- PixmapCache& pixmap_cache, PaletteCache& palette_cache,
- GlzDecoderWindow &glz_decoder_window, SurfacesCache &csurfaces);
- virtual ~GDICanvas();
-
- virtual void thread_touch() {}
- virtual void copy_pixels(const QRegion& region, RedDrawable* dc,
- const PixmapHeader* pixmap);
- virtual void copy_pixels(const QRegion& region, RedDrawable& dc);
-
- virtual CanvasType get_pixmap_type();
-
-private:
- RedPixmapGdi *_pixmap;
- RedPixmapGdi *_helper_pixmap;
- HDC _dc;
- HBITMAP _prev_bitmap;
-};
-
-#endif
diff --git a/client/red_gl_canvas.cpp b/client/red_gl_canvas.cpp
deleted file mode 100644
index e8c3f1e8..00000000
--- a/client/red_gl_canvas.cpp
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdint.h>
-#include <GL/glx.h>
-#include "common/region.h"
-
-#define SPICE_CANVAS_INTERNAL
-#define SW_CANVAS_CACHE
-#include "common/gl_canvas.c"
-#undef SW_CANVAS_CACHE
-#undef SPICE_CANVAS_INTERNAL
-
-#include "common.h"
-#include "red_gl_canvas.h"
-#include "utils.h"
-#include "debug.h"
-#include "red_pixmap_gl.h"
-
-GCanvas::GCanvas(int width, int height, uint32_t format, RedWindow *win,
- RenderType rendertype,
- PixmapCache& pixmap_cache, PaletteCache& palette_cache,
- GlzDecoderWindow &glz_decoder_window, SurfacesCache &csurfaces)
- : Canvas(pixmap_cache, palette_cache, glz_decoder_window, csurfaces)
- , _pixmap (0)
- , _textures_lost (false)
-{
- _pixmap = new RedPixmapGL(width, height,
- RedDrawable::format_from_surface(format),
- true, win, rendertype);
- if (!(_canvas = gl_canvas_create(width, height,
- SPICE_SURFACE_FMT_DEPTH(format),
- &pixmap_cache.base,
- &palette_cache.base,
- &csurfaces,
- &glz_decoder(),
- &jpeg_decoder(),
- &zlib_decoder()))) {
- THROW("create canvas failed");
- }
-}
-
-GCanvas::~GCanvas()
-{
- gl_canvas_set_textures_lost (_canvas, (int)_textures_lost);
- _canvas->ops->destroy(_canvas);
- _canvas = NULL;
- delete _pixmap;
- _pixmap = NULL;
-}
-
-void GCanvas::copy_pixels(const QRegion& region, RedDrawable& dest_dc)
-{
- pixman_box32_t *rects;
- int num_rects;
-
- pre_gl_copy();
- rects = pixman_region32_rectangles((pixman_region32_t *)&region, &num_rects);
- for (int i = 0; i < num_rects; i++) {
- SpiceRect r;
-
- r.left = rects[i].x1;
- r.top = rects[i].y1;
- r.right = rects[i].x2;
- r.bottom = rects[i].y2;
-
- dest_dc.copy_pixels(*_pixmap, r.left, r.top, r);
- }
- post_gl_copy();
-}
-
-void GCanvas::copy_pixels(const QRegion& region, RedDrawable* dest_dc, const PixmapHeader* pixmap)
-{
- copy_pixels(region, *dest_dc);
-}
-
-void GCanvas::touched_bbox(const SpiceRect *bbox)
-{
- _pixmap->update_texture(bbox);
-}
-
-CanvasType GCanvas::get_pixmap_type()
-{
- return CANVAS_TYPE_GL;
-}
-
-void GCanvas::textures_lost()
-{
- _textures_lost = true;
- _pixmap->textures_lost();
-}
-
-void GCanvas::touch_context()
-{
- _pixmap->touch_context();
-}
-
-void GCanvas::pre_gl_copy()
-{
- _pixmap->pre_copy();
-}
-
-void GCanvas::post_gl_copy()
-{
- _pixmap->past_copy();
-}
diff --git a/client/red_gl_canvas.h b/client/red_gl_canvas.h
deleted file mode 100644
index e78b1cc8..00000000
--- a/client/red_gl_canvas.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_GCANVAS
-#define _H_GCANVAS
-
-#include "canvas.h"
-#define SPICE_CANVAS_INTERNAL
-#define SW_CANVAS_CACHE
-#include "common/sw_canvas.h"
-#include "common/gl_canvas.h"
-#undef SW_CANVAS_CACHE
-#undef SPICE_CANVAS_INTERNAL
-
-#include "red_pixmap_gl.h"
-#include "red_window.h"
-
-class RedPixmapGL;
-
-class GCanvas: public Canvas {
-public:
- GCanvas(int width, int height, uint32_t format, RedWindow *win,
- RenderType rendertype,
- PixmapCache& pixmap_cache, PaletteCache& palette_cache,
- GlzDecoderWindow &glz_decoder_window, SurfacesCache &csurfaces);
- virtual ~GCanvas();
-
- void set_mode();
- void clear();
- void thread_touch() {}
- void copy_pixels(const QRegion& region, RedDrawable* dc,
- const PixmapHeader* pixmap);
- void copy_pixels(const QRegion& region, RedDrawable& dc);
- virtual void textures_lost();
- virtual CanvasType get_pixmap_type();
- virtual void touch_context();
- virtual void pre_gl_copy();
- virtual void post_gl_copy();
- void touched_bbox(const SpiceRect *bbox);
-
-private:
- void create_pixmap(int width, int height, RedWindow *win,
- RenderType rendertype);
- void destroy_pixmap();
- void destroy();
-
-private:
- RedPixmapGL *_pixmap;
- bool _textures_lost;
-};
-
-#endif
diff --git a/client/red_key.h b/client/red_key.h
deleted file mode 100644
index 3789c9a0..00000000
--- a/client/red_key.h
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_RED_KEY
-#define _H_RED_KEY
-
-enum RedKey {
- REDKEY_INVALID,
- REDKEY_ESCAPE,
- REDKEY_1,
- REDKEY_2,
- REDKEY_3,
- REDKEY_4,
- REDKEY_5,
- REDKEY_6,
- REDKEY_7,
- REDKEY_8,
- REDKEY_9,
- REDKEY_0,
- REDKEY_MINUS,
- REDKEY_EQUALS,
- REDKEY_BACKSPACE,
- REDKEY_TAB,
- REDKEY_Q,
- REDKEY_W,
- REDKEY_E,
- REDKEY_R,
- REDKEY_T,
- REDKEY_Y,
- REDKEY_U,
- REDKEY_I,
- REDKEY_O,
- REDKEY_P,
- REDKEY_L_BRACKET,
- REDKEY_R_BRACKET,
- REDKEY_ENTER,
- REDKEY_L_CTRL,
- REDKEY_A,
- REDKEY_S,
- REDKEY_D,
- REDKEY_F,
- REDKEY_G,
- REDKEY_H,
- REDKEY_J,
- REDKEY_K,
- REDKEY_L,
- REDKEY_SEMICOLON,
- REDKEY_QUOTE,
-
- REDKEY_BACK_QUOTE,
- REDKEY_L_SHIFT,
- REDKEY_BACK_SLASH,
- REDKEY_Z,
- REDKEY_X,
- REDKEY_C,
- REDKEY_V,
- REDKEY_B,
- REDKEY_N,
- REDKEY_M,
- REDKEY_COMMA,
- REDKEY_PERIOD,
- REDKEY_SLASH,
- REDKEY_R_SHIFT,
- REDKEY_PAD_MULTIPLY,
- REDKEY_L_ALT,
- REDKEY_SPACE,
- REDKEY_CAPS_LOCK,
- REDKEY_F1,
- REDKEY_F2,
- REDKEY_F3,
- REDKEY_F4,
- REDKEY_F5,
- REDKEY_F6,
- REDKEY_F7,
- REDKEY_F8,
- REDKEY_F9,
- REDKEY_F10,
- REDKEY_NUM_LOCK,
- REDKEY_SCROLL_LOCK,
- REDKEY_PAD_7,
- REDKEY_PAD_8,
- REDKEY_PAD_9,
- REDKEY_PAD_MINUS,
- REDKEY_PAD_4,
- REDKEY_PAD_5,
- REDKEY_PAD_6,
- REDKEY_PAD_PLUS,
- REDKEY_PAD_1,
- REDKEY_PAD_2,
- REDKEY_PAD_3,
- REDKEY_PAD_0,
- REDKEY_PAD_POINT,
-
- REDKEY_EUROPEAN = 0x56,
- REDKEY_F11,
- REDKEY_F12,
-
- REDKEY_JAPANESE_HIRAGANA_KATAKANA = 0x70,
- REDKEY_JAPANESE_BACKSLASH = 0x73,
- REDKEY_JAPANESE_HENKAN = 0x79,
- REDKEY_JAPANESE_MUHENKAN = 0x7B,
- REDKEY_JAPANESE_YEN = 0x7D,
-
- REDKEY_KOREAN_HANGUL_HANJA = 0xf1,
- REDKEY_KOREAN_HANGUL = 0xf2,
-
- REDKEY_ESCAPE_BASE = 0x100,
- REDKEY_PAD_ENTER = REDKEY_ESCAPE_BASE + 0x1c,
- REDKEY_R_CTRL = REDKEY_ESCAPE_BASE + 0x1d,
- REDKEY_MUTE = REDKEY_ESCAPE_BASE + 0x20,
- REDKEY_FAKE_L_SHIFT = REDKEY_ESCAPE_BASE + 0x2a,
- REDKEY_VOLUME_DOWN = REDKEY_ESCAPE_BASE + 0x2e,
- REDKEY_VOLUME_UP = REDKEY_ESCAPE_BASE + 0x30,
- REDKEY_PAD_DIVIDE = REDKEY_ESCAPE_BASE + 0x35,
- REDKEY_FAKE_R_SHIFT = REDKEY_ESCAPE_BASE + 0x36,
- REDKEY_CTRL_PRINT_SCREEN = REDKEY_ESCAPE_BASE + 0x37,
- REDKEY_R_ALT = REDKEY_ESCAPE_BASE + 0x38,
- REDKEY_CTRL_BREAK = REDKEY_ESCAPE_BASE + 0x46,
- REDKEY_HOME = REDKEY_ESCAPE_BASE + 0x47,
- REDKEY_UP = REDKEY_ESCAPE_BASE + 0x48,
- REDKEY_PAGEUP = REDKEY_ESCAPE_BASE + 0x49,
- REDKEY_LEFT = REDKEY_ESCAPE_BASE + 0x4b,
- REDKEY_RIGHT = REDKEY_ESCAPE_BASE + 0x4d,
- REDKEY_END = REDKEY_ESCAPE_BASE + 0x4f,
- REDKEY_DOWN = REDKEY_ESCAPE_BASE + 0x50,
- REDKEY_PAGEDOWN = REDKEY_ESCAPE_BASE + 0x51,
- REDKEY_INSERT = REDKEY_ESCAPE_BASE + 0x52,
- REDKEY_DELETE = REDKEY_ESCAPE_BASE + 0x53,
- REDKEY_LEFT_CMD = REDKEY_ESCAPE_BASE + 0x5b,
- REDKEY_RIGHT_CMD = REDKEY_ESCAPE_BASE + 0x5c,
- REDKEY_MENU = REDKEY_ESCAPE_BASE + 0x5d,
-
- REDKEY_PAUSE,
-
- REDKEY_NUM_KEYS
-};
-
-#endif
diff --git a/client/red_peer.cpp b/client/red_peer.cpp
deleted file mode 100644
index d2a60987..00000000
--- a/client/red_peer.cpp
+++ /dev/null
@@ -1,463 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#ifdef WIN32
-#include <winsock2.h>
-#endif
-#include <openssl/x509.h>
-#include <openssl/x509v3.h>
-#include <spice/protocol.h>
-#include "common/ssl_verify.h"
-
-#include "common.h"
-#include "red_peer.h"
-#include "utils.h"
-#include "debug.h"
-#include "platform_utils.h"
-
-static void SPICE_GNUC_NORETURN ssl_error()
-{
- unsigned long last_error = ERR_peek_last_error();
-
- ERR_print_errors_fp(stderr);
- THROW_ERR(SPICEC_ERROR_CODE_SSL_ERROR, "SSL Error: %s", ERR_error_string(last_error, NULL));
-}
-
-RedPeer::RedPeer()
- : _peer (INVALID_SOCKET)
- , _shut (false)
- , _ctx (NULL)
- , _ssl (NULL)
-{
-}
-
-RedPeer::~RedPeer()
-{
- cleanup();
-}
-
-void RedPeer::cleanup()
-{
- if (_ssl) {
- SSL_free(_ssl);
- _ssl = NULL;
- }
-
- if (_ctx) {
- SSL_CTX_free(_ctx);
- _ctx = NULL;
- }
-
- if (_peer != INVALID_SOCKET) {
- closesocket(_peer);
- _peer = INVALID_SOCKET;
- }
-}
-
-void RedPeer::connect_to_peer(const char* host, int portnr)
-{
- struct addrinfo ai, *result = NULL, *e;
- char uaddr[INET6_ADDRSTRLEN+1];
- char uport[33], port[33];
- int err = 0, rc, no_delay = 1;
- ASSERT(_ctx == NULL && _ssl == NULL && _peer == INVALID_SOCKET);
- try {
- memset(&ai,0, sizeof(ai));
- ai.ai_flags = AI_CANONNAME;
-#ifdef AI_ADDRCONFIG
- ai.ai_flags |= AI_ADDRCONFIG;
-#endif
- ai.ai_family = PF_UNSPEC;
- ai.ai_socktype = SOCK_STREAM;
- snprintf(port, sizeof(port), "%d", portnr);
- rc = getaddrinfo(host, port, &ai, &result);
- if (rc != 0) {
- THROW_ERR(SPICEC_ERROR_CODE_GETHOSTBYNAME_FAILED, "cannot resolve host address %s", host);
- }
- Lock lock(_lock);
- _peer = INVALID_SOCKET;
- for (e = result; e != NULL; e = e->ai_next) {
- if ((_peer = socket(e->ai_family, e->ai_socktype, e->ai_protocol)) == INVALID_SOCKET) {
- int err = sock_error();
- THROW_ERR(SPICEC_ERROR_CODE_SOCKET_FAILED, "failed to create socket: %s (%d)",
- sock_err_message(err), err);
- }
- if (setsockopt(_peer, IPPROTO_TCP, TCP_NODELAY, (const char*)&no_delay, sizeof(no_delay)) ==
- SOCKET_ERROR) {
- LOG_WARN("set TCP_NODELAY failed");
- }
-
- getnameinfo((struct sockaddr*)e->ai_addr, e->ai_addrlen,
- uaddr,INET6_ADDRSTRLEN, uport,32,
- NI_NUMERICHOST | NI_NUMERICSERV);
- DBG(0, "Trying %s %s", uaddr, uport);
-
- if (::connect(_peer, e->ai_addr, e->ai_addrlen) == SOCKET_ERROR) {
- err = sock_error();
- LOG_INFO("Connect failed: %s (%d)",
- sock_err_message(err), err);
- closesocket(_peer);
- _peer = INVALID_SOCKET;
- continue;
- }
- DBG(0, "Connected to %s %s", uaddr, uport);
- break;
- }
- lock.unlock();
- freeaddrinfo(result);
- if (_peer == INVALID_SOCKET) {
- THROW_ERR(SPICEC_ERROR_CODE_CONNECT_FAILED, "failed to connect: %s (%d)",
- sock_err_message(err), err);
- }
- _serial = 0;
- } catch (...) {
- Lock lock(_lock);
- cleanup();
- throw;
- }
-}
-
-void RedPeer::connect_unsecure(const char* host, int portnr)
-{
- connect_to_peer(host, portnr);
- ASSERT(_ctx == NULL && _ssl == NULL && _peer != INVALID_SOCKET);
- LOG_INFO("Connected to %s %d", host, portnr);
-}
-
-void RedPeer::connect_secure(const ConnectionOptions& options, const char* host)
-{
- int return_code;
- SPICE_SSL_VERIFY_OP auth_flags;
- SpiceOpenSSLVerify* verify = NULL;
- int portnr = options.secure_port;
-
- connect_to_peer(host, portnr);
- ASSERT(_ctx == NULL && _ssl == NULL && _peer != INVALID_SOCKET);
- LOG_INFO("Connected to %s %d", host, portnr);
-
- try {
-#if OPENSSL_VERSION_NUMBER >= 0x10000000L
- const SSL_METHOD *ssl_method = TLSv1_method();
-#else
- SSL_METHOD *ssl_method = TLSv1_method();
-#endif
- _ctx = SSL_CTX_new(ssl_method);
- if (_ctx == NULL) {
- ssl_error();
- }
-
- auth_flags = options.host_auth.type_flags;
- if ((auth_flags & SPICE_SSL_VERIFY_OP_HOSTNAME) ||
- (auth_flags & SPICE_SSL_VERIFY_OP_SUBJECT)) {
- std::string CA_file = options.host_auth.CA_file;
- ASSERT(!CA_file.empty());
-
- return_code = SSL_CTX_load_verify_locations(_ctx, CA_file.c_str(), NULL);
- if (return_code != 1) {
- if (auth_flags & SPICE_SSL_VERIFY_OP_PUBKEY) {
- LOG_WARN("SSL_CTX_load_verify_locations failed, CA_file=%s. "
- "only pubkey authentication is active", CA_file.c_str());
- auth_flags = SPICE_SSL_VERIFY_OP_PUBKEY;
- }
- else {
- LOG_ERROR("SSL_CTX_load_verify_locations failed CA_file=%s", CA_file.c_str());
- ssl_error();
- }
- }
- }
-
- return_code = SSL_CTX_set_cipher_list(_ctx, options.ciphers.c_str());
- if (return_code != 1) {
- LOG_ERROR("SSL_CTX_set_cipher_list failed, ciphers=%s", options.ciphers.c_str());
- ssl_error();
- }
-
- _ssl = SSL_new(_ctx);
- if (!_ssl) {
- THROW("create ssl failed");
- }
-
- verify = spice_openssl_verify_new(
- _ssl, auth_flags,
- host,
- (char*)&options.host_auth.host_pubkey[0],
- options.host_auth.host_pubkey.size(),
- options.host_auth.host_subject.c_str());
-
- BIO* sbio = BIO_new_socket(_peer, BIO_NOCLOSE);
- if (!sbio) {
- THROW("alloc new socket bio failed");
- }
-
- SSL_set_bio(_ssl, sbio, sbio);
-
- return_code = SSL_connect(_ssl);
- if (return_code <= 0) {
- int ssl_error_code = SSL_get_error(_ssl, return_code);
- LOG_ERROR("failed to connect w/SSL, ssl_error %s",
- ERR_error_string(ssl_error_code, NULL));
- ssl_error();
- }
- } catch (...) {
- Lock lock(_lock);
- spice_openssl_verify_free(verify);
- cleanup();
- throw;
- }
-
- spice_openssl_verify_free(verify);
-}
-
-void RedPeer::shutdown()
-{
- if (_peer != INVALID_SOCKET) {
- if (_ssl) {
- SSL_shutdown(_ssl);
- }
- ::shutdown(_peer, SHUT_RDWR);
- }
- _shut = true;
-}
-
-void RedPeer::disconnect()
-{
- Lock lock(_lock);
- shutdown();
-}
-
-void RedPeer::close()
-{
- Lock lock(_lock);
- if (_peer != INVALID_SOCKET) {
- if (_ctx) {
- SSL_free(_ssl);
- _ssl = NULL;
- SSL_CTX_free(_ctx);
- _ctx = NULL;
- }
-
- closesocket(_peer);
- _peer = INVALID_SOCKET;
- }
-}
-
-void RedPeer::swap(RedPeer* other)
-{
- Lock lock(_lock);
- SOCKET temp_peer = _peer;
- SSL_CTX *temp_ctx = _ctx;
- SSL *temp_ssl = _ssl;
-
- _peer = other->_peer;
- other->_peer = temp_peer;
-
- if (_ctx) {
- _ctx = other->_ctx;
- _ssl = other->_ssl;
-
- other->_ctx = temp_ctx;
- other->_ssl = temp_ssl;
- }
-
- if (_shut) {
- shutdown();
- }
-}
-
-uint32_t RedPeer::receive(uint8_t *buf, uint32_t size)
-{
- uint8_t *pos = buf;
- while (size) {
- int now;
- if (_ctx == NULL) {
- if ((now = recv(_peer, (char *)pos, size, 0)) <= 0) {
- int err = sock_error();
- if (now == SOCKET_ERROR && err == WOULDBLOCK_ERR) {
- break;
- }
-
- if (now == 0 || err == SHUTDOWN_ERR) {
- throw RedPeer::DisconnectedException();
- }
-
- if (err == INTERRUPTED_ERR) {
- continue;
- }
- THROW_ERR(SPICEC_ERROR_CODE_RECV_FAILED, "%s (%d)", sock_err_message(err), err);
- }
- size -= now;
- pos += now;
- } else {
- if ((now = SSL_read(_ssl, pos, size)) <= 0) {
- int ssl_error = SSL_get_error(_ssl, now);
-
- if (ssl_error == SSL_ERROR_WANT_READ) {
- break;
- }
-
- if (ssl_error == SSL_ERROR_SYSCALL) {
- int err = sock_error();
- if (now == -1) {
- if (err == WOULDBLOCK_ERR) {
- break;
- }
- if (err == INTERRUPTED_ERR) {
- continue;
- }
- }
- if (now == 0 || (now == -1 && err == SHUTDOWN_ERR)) {
- throw RedPeer::DisconnectedException();
- }
- THROW_ERR(SPICEC_ERROR_CODE_SEND_FAILED, "%s (%d)", sock_err_message(err), err);
- } else if (ssl_error == SSL_ERROR_ZERO_RETURN) {
- throw RedPeer::DisconnectedException();
- }
- THROW_ERR(SPICEC_ERROR_CODE_RECV_FAILED, "ssl error %d", ssl_error);
- }
- size -= now;
- pos += now;
- }
- }
- return pos - buf;
-}
-
-RedPeer::CompoundInMessage* RedPeer::receive()
-{
- SpiceDataHeader header;
- AutoRef<CompoundInMessage> message;
-
- receive((uint8_t*)&header, sizeof(SpiceDataHeader));
- message.reset(new CompoundInMessage(header.serial, header.type, header.size, header.sub_list));
- receive((*message)->data(), (*message)->compound_size());
- return message.release();
-}
-
-uint32_t RedPeer::send(uint8_t *buf, uint32_t size)
-{
- uint8_t *pos = buf;
- while (size) {
- int now;
-
- if (_ctx == NULL) {
- if ((now = ::send(_peer, (char *)pos, size, 0)) == SOCKET_ERROR) {
- int err = sock_error();
- if (err == WOULDBLOCK_ERR) {
- break;
- }
- if (err == SHUTDOWN_ERR) {
- throw RedPeer::DisconnectedException();
- }
- if (err == INTERRUPTED_ERR) {
- continue;
- }
- THROW_ERR(SPICEC_ERROR_CODE_SEND_FAILED, "%s (%d)", sock_err_message(err), err);
- }
- size -= now;
- pos += now;
- } else {
- if ((now = SSL_write(_ssl, pos, size)) <= 0) {
- int ssl_error = SSL_get_error(_ssl, now);
-
- if (ssl_error == SSL_ERROR_WANT_WRITE) {
- break;
- }
- if (ssl_error == SSL_ERROR_SYSCALL) {
- int err = sock_error();
- if (now == -1) {
- if (err == WOULDBLOCK_ERR) {
- break;
- }
- if (err == INTERRUPTED_ERR) {
- continue;
- }
- }
- if (now == 0 || (now == -1 && err == SHUTDOWN_ERR)) {
- throw RedPeer::DisconnectedException();
- }
- THROW_ERR(SPICEC_ERROR_CODE_SEND_FAILED, "%s (%d)", sock_err_message(err), err);
- } else if (ssl_error == SSL_ERROR_ZERO_RETURN) {
- throw RedPeer::DisconnectedException();
- }
- THROW_ERR(SPICEC_ERROR_CODE_SEND_FAILED, "ssl error %d", ssl_error);
- }
- size -= now;
- pos += now;
- }
- }
- return pos - buf;
-}
-
-uint32_t RedPeer::do_send(RedPeer::OutMessage& message, uint32_t skip_bytes)
-{
- uint8_t *data;
- int free_data;
- size_t len;
- uint32_t res;
-
- data = spice_marshaller_linearize(message.marshaller(), skip_bytes,
- &len, &free_data);
-
- res = send(data, len);
-
- if (free_data) {
- free(data);
- }
- return res;
-}
-
-uint32_t RedPeer::send(RedPeer::OutMessage& message)
-{
-
- message.header().serial = ++_serial;
- message.header().size = message.message_size() - sizeof(SpiceDataHeader);
-
- return do_send(message, 0);
-}
-
-RedPeer::OutMessage::OutMessage(uint32_t type)
- : _marshaller (spice_marshaller_new())
-{
- SpiceDataHeader *header;
- header = (SpiceDataHeader *)
- spice_marshaller_reserve_space(_marshaller, sizeof(SpiceDataHeader));
- spice_marshaller_set_base(_marshaller, sizeof(SpiceDataHeader));
-
- header->type = type;
- header->sub_list = 0;
-}
-
-void RedPeer::OutMessage::reset(uint32_t type)
-{
- spice_marshaller_reset(_marshaller);
-
- SpiceDataHeader *header;
- header = (SpiceDataHeader *)
- spice_marshaller_reserve_space(_marshaller, sizeof(SpiceDataHeader));
- spice_marshaller_set_base(_marshaller, sizeof(SpiceDataHeader));
-
- header->type = type;
- header->sub_list = 0;
-}
-
-RedPeer::OutMessage::~OutMessage()
-{
- spice_marshaller_destroy(_marshaller);
-}
diff --git a/client/red_peer.h b/client/red_peer.h
deleted file mode 100644
index b0faa9d7..00000000
--- a/client/red_peer.h
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_REDPEER
-#define _H_REDPEER
-
-#include <openssl/ssl.h>
-#include <openssl/err.h>
-
-#include <spice/protocol.h>
-#include "common/marshaller.h"
-#include "common/ssl_verify.h"
-
-#include "common.h"
-#include "process_loop.h"
-#include "threads.h"
-#include "platform_utils.h"
-#include "debug.h"
-
-class RedPeer: protected EventSources::Socket {
-public:
- RedPeer();
- virtual ~RedPeer();
-
- class InMessage;
- class CompoundInMessage;
- class OutMessage;
- class DisconnectedException {};
-
- class HostAuthOptions {
- public:
-
- typedef std::vector<uint8_t> PublicKey;
- typedef std::pair<std::string, std::string> CertFieldValuePair;
- typedef std::list<CertFieldValuePair> CertFieldValueList;
-
- HostAuthOptions() : type_flags(SPICE_SSL_VERIFY_OP_NONE) {}
-
- public:
-
- SPICE_SSL_VERIFY_OP type_flags;
-
- PublicKey host_pubkey;
- std::string host_subject;
- std::string CA_file;
- };
-
- class ConnectionOptions {
- public:
-
- enum Type {
- CON_OP_INVALID,
- CON_OP_SECURE,
- CON_OP_UNSECURE,
- CON_OP_BOTH,
- };
-
- ConnectionOptions(Type in_type, int in_port, int in_sport,
- int in_protocol,
- const HostAuthOptions& in_host_auth,
- const std::string& in_ciphers)
- : type (in_type)
- , unsecure_port (in_port)
- , secure_port (in_sport)
- , protocol (in_protocol)
- , host_auth (in_host_auth)
- , ciphers (in_ciphers)
- {
- }
-
- virtual ~ConnectionOptions() {}
-
- bool allow_secure() const
- {
- return (type == CON_OP_BOTH || type == CON_OP_SECURE) && secure_port != -1;
- }
-
- bool allow_unsecure() const
- {
- return (type == CON_OP_BOTH || type == CON_OP_UNSECURE) && unsecure_port != -1;
- }
-
- public:
- Type type;
- int unsecure_port;
- int secure_port;
- int protocol; // 0 == auto
- HostAuthOptions host_auth; // for secure connection
- std::string ciphers;
- };
-
- void connect_unsecure(const char* host, int port);
- void connect_secure(const ConnectionOptions& options, const char* host);
-
- void disconnect();
- void swap(RedPeer* other);
- void close();
- void enable() { _shut = false;}
-
- virtual CompoundInMessage* receive();
- uint32_t do_send(OutMessage& message, uint32_t skip_bytes);
- uint32_t send(OutMessage& message);
-
- uint32_t receive(uint8_t* buf, uint32_t size);
- uint32_t send(uint8_t* buf, uint32_t size);
-
-protected:
- virtual void on_event() {}
- virtual int get_socket() { return _peer;}
- void cleanup();
-
-private:
- void connect_to_peer(const char* host, int port);
- void shutdown();
-
-private:
- SOCKET _peer;
- Mutex _lock;
- bool _shut;
- uint64_t _serial;
-
- SSL_CTX *_ctx;
- SSL *_ssl;
-};
-
-class RedPeer::InMessage {
-public:
- InMessage(uint16_t type, uint32_t size, uint8_t * data)
- : _type (type)
- , _size (size)
- , _data (data)
- {
- }
-
- virtual ~InMessage() {}
-
- uint16_t type() { return _type;}
- uint8_t* data() { return _data;}
- virtual uint32_t size() { return _size;}
-
-protected:
- uint16_t _type;
- uint32_t _size;
- uint8_t* _data;
-};
-
-class RedPeer::CompoundInMessage: public RedPeer::InMessage {
-public:
- CompoundInMessage(uint64_t _serial, uint16_t type, uint32_t size, uint32_t sub_list)
- : InMessage(type, size, new uint8_t[size])
- , _refs (1)
- , _serial (_serial)
- , _sub_list (sub_list)
- {
- }
-
- RedPeer::InMessage* ref() { _refs++; return this;}
- void unref() {if (!--_refs) delete this;}
-
- uint64_t serial() { return _serial;}
- uint32_t sub_list() { return _sub_list;}
-
- virtual uint32_t size() { return _sub_list ? _sub_list : _size;}
- uint32_t compound_size() {return _size;}
-
-protected:
- virtual ~CompoundInMessage() { delete[] _data;}
-
-private:
- int _refs;
- uint64_t _serial;
- uint32_t _sub_list;
-};
-
-class RedPeer::OutMessage {
-public:
- OutMessage(uint32_t type);
- virtual ~OutMessage();
-
- SpiceMarshaller *marshaller() { return _marshaller;}
- void reset(uint32_t type);
-
-private:
- uint32_t message_size() { return spice_marshaller_get_total_size(_marshaller);}
- uint8_t* base() { return spice_marshaller_get_ptr(_marshaller);}
- SpiceDataHeader& header() { return *(SpiceDataHeader *)base();}
-
-protected:
- SpiceMarshaller *_marshaller;
-
- friend class RedPeer;
- friend class RedChannel;
-};
-
-#endif
diff --git a/client/red_pixmap.h b/client/red_pixmap.h
deleted file mode 100644
index 3f12855e..00000000
--- a/client/red_pixmap.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_RED_PIXMAP
-#define _H_RED_PIXMAP
-
-#include "red_drawable.h"
-#include "utils.h"
-
-class RedPixmap: public RedDrawable {
-public:
- RedPixmap(int width, int height, Format format, bool top_bottom);
- virtual ~RedPixmap();
-
- virtual SpicePoint get_size() { SpicePoint pt = {_width, _height}; return pt;}
-
- int get_width() { return _width;}
- int get_height() { return _height;}
- int get_stride() { return _stride;}
- uint8_t* get_data() { return _data;}
- bool is_big_endian_bits();
- virtual RedDrawable::Format get_format() { return _format; }
-
- bool equal(const RedPixmap &other, const SpiceRect &rect) const {
- spice_debug("l:%d r:%d t:%d b:%d", rect.left, rect.right, rect.top, rect.bottom);
- for (int x = rect.left; x < rect.right; ++x)
- for (int y = rect.top; y < rect.bottom; ++y) {
- for (int i = 0; i < 3; i++) { // ignore alpha
- int p = x * 4 + y * _stride + i;
- if (other._data[p] != _data[p]) {
- spice_printerr("equal fails at (+%d+%d) +%d+%d:%d in %dx%d",
- rect.left, rect.top, x-rect.left, y-rect.top, i,
- _width-rect.left, _height-rect.top);
- if (getenv("DIFFBP"))
- SPICE_BREAKPOINT();
- return false;
- }
- }
- }
- return true;
- }
-
-protected:
- Format _format;
- int _width;
- int _height;
- int _stride;
- bool _top_bottom;
- uint8_t* _data;
-};
-
-#endif
diff --git a/client/red_pixmap_gl.h b/client/red_pixmap_gl.h
deleted file mode 100644
index 88d14a1c..00000000
--- a/client/red_pixmap_gl.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_RED_PIXMAP_GL
-#define _H_RED_PIXMAP_GL
-
-#include "red_pixmap.h"
-#include "red_window.h"
-
-enum RenderType {
- RENDER_TYPE_PBUFF,
- RENDER_TYPE_FBO,
-};
-
-class RedPixmapGL: public RedPixmap {
-public:
- RedPixmapGL(int width, int height, Format format, bool top_bottom,
- RedWindow *win, RenderType rendertype);
-
- void textures_lost();
- void touch_context();
- void update_texture(const SpiceRect *bbox);
- void pre_copy();
- void past_copy();
- ~RedPixmapGL();
-
-private:
- RedGlContext _glcont;
- GLint _prev_tex;
- GLint _prev_matrix_mode;
- bool _tex_enabled;
- bool _textures_lost;
-};
-
-#endif
diff --git a/client/red_pixmap_sw.h b/client/red_pixmap_sw.h
deleted file mode 100644
index 0c96a1f7..00000000
--- a/client/red_pixmap_sw.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_RED_PIXMAP_SW
-#define _H_RED_PIXMAP_SW
-
-#include "red_pixmap.h"
-#include "red_window.h"
-
-class RedPixmapSw: public RedPixmap {
-public:
- RedPixmapSw(int width, int height, Format format, bool top_bottom, RedWindow *window);
- ~RedPixmapSw();
-};
-
-#endif
diff --git a/client/red_sw_canvas.cpp b/client/red_sw_canvas.cpp
deleted file mode 100644
index d18af0f9..00000000
--- a/client/red_sw_canvas.cpp
+++ /dev/null
@@ -1,112 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdint.h>
-#ifdef WIN32
-#include <winsock2.h>
-#endif
-
-#include "common/region.h"
-#define SPICE_CANVAS_INTERNAL
-#define SW_CANVAS_CACHE
-#include "common/sw_canvas.c"
-#undef SW_CANVAS_CACHE
-#undef SPICE_CANVAS_INTERNAL
-
-#include "common.h"
-#include "red_window.h"
-#include "red_sw_canvas.h"
-#include "utils.h"
-#include "debug.h"
-#include "red_pixmap_sw.h"
-
-SCanvas::SCanvas(bool onscreen,
- int width, int height, uint32_t format, RedWindow *win,
- PixmapCache& pixmap_cache, PaletteCache& palette_cache,
- GlzDecoderWindow &glz_decoder_window, SurfacesCache& csurfaces)
- : Canvas (pixmap_cache, palette_cache, glz_decoder_window, csurfaces)
- , _pixmap (0)
-{
- if (onscreen) {
- _pixmap = new RedPixmapSw(width, height,
- RedDrawable::format_from_surface(format),
- true, win);
- _canvas = canvas_create_for_data(width, height, format,
- _pixmap->get_data(),
- _pixmap->get_stride(),
- &pixmap_cache.base,
- &palette_cache.base,
- &csurfaces,
- &glz_decoder(),
- &jpeg_decoder(),
- &zlib_decoder());
- } else {
- _canvas = canvas_create(width, height, format,
- &pixmap_cache.base,
- &palette_cache.base,
- &csurfaces,
- &glz_decoder(),
- &jpeg_decoder(),
- &zlib_decoder());
- }
- if (_canvas == NULL) {
- THROW("create canvas failed");
- }
-}
-
-SCanvas::~SCanvas()
-{
- _canvas->ops->destroy(_canvas);
- _canvas = NULL;
- if (_pixmap) {
- delete _pixmap;
- _pixmap = NULL;
- }
-}
-
-void SCanvas::copy_pixels(const QRegion& region, RedDrawable& dest_dc)
-{
- pixman_box32_t *rects;
- int num_rects;
-
- ASSERT(_pixmap != NULL);
-
- rects = pixman_region32_rectangles((pixman_region32_t *)&region, &num_rects);
- for (int i = 0; i < num_rects; i++) {
- SpiceRect r;
-
- r.left = rects[i].x1;
- r.top = rects[i].y1;
- r.right = rects[i].x2;
- r.bottom = rects[i].y2;
- dest_dc.copy_pixels(*_pixmap, r.left, r.top, r);
- }
-}
-
-void SCanvas::copy_pixels(const QRegion& region, RedDrawable* dest_dc, const PixmapHeader* pixmap)
-{
- copy_pixels(region, *dest_dc);
-}
-
-CanvasType SCanvas::get_pixmap_type()
-{
- return CANVAS_TYPE_SW;
-}
diff --git a/client/red_sw_canvas.h b/client/red_sw_canvas.h
deleted file mode 100644
index a192c47b..00000000
--- a/client/red_sw_canvas.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_CCANVAS
-#define _H_CCANVAS
-
-#include "canvas.h"
-#define SPICE_CANVAS_INTERNAL
-#define SW_CANVAS_CACHE
-#include "common/sw_canvas.h"
-#undef SW_CANVAS_CACHE
-#undef SPICE_CANVAS_INTERNAL
-
-class RedPixmap;
-
-class SCanvas: public Canvas {
-public:
- SCanvas(bool onscreen,
- int width, int height, uint32_t format, RedWindow *win,
- PixmapCache& pixmap_cache, PaletteCache& palette_cache,
- GlzDecoderWindow &glz_decoder_window, SurfacesCache &csurfaces);
- virtual ~SCanvas();
-
- virtual void thread_touch() {}
- virtual void copy_pixels(const QRegion& region, RedDrawable* dc,
- const PixmapHeader* pixmap);
- virtual void copy_pixels(const QRegion& region, RedDrawable& dc);
-
- virtual CanvasType get_pixmap_type();
-
-private:
- RedPixmap *_pixmap;
-};
-
-#endif
diff --git a/client/red_window.h b/client/red_window.h
deleted file mode 100644
index bf59d8b8..00000000
--- a/client/red_window.h
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_RED_WINDOW
-#define _H_RED_WINDOW
-
-#include "red_drawable.h"
-#include <spice/protocol.h>
-#include "red_key.h"
-#include "red_window_p.h"
-#include "cursor.h"
-
-class Menu;
-class Icon;
-
-class RedWindow: public RedDrawable, private RedWindow_p {
-public:
- class Listener;
-
- enum {
- DEFAULT_SCREEN = -1,
- };
-
- RedWindow(RedWindow::Listener& listener, int screen_id = DEFAULT_SCREEN);
- virtual ~RedWindow();
-
- void move_and_resize(int x, int y, int width, int height);
- void resize(int width, int height);
- void move(int x, int y);
- void position_after(RedWindow *after);
- void raise();
- void show(int screen_id);
- void external_show();
- void hide();
- void minimize();
- void activate();
- void set_title(std::string& title);
- void set_icon(Icon *icon);
- virtual RedDrawable::Format get_format();
-
- enum Type {
- TYPE_INVALID,
- TYPE_NORMAL,
- TYPE_FULLSCREEN,
- };
- void set_type(Type type) { _type = type;}
- SpicePoint get_position();
- virtual SpicePoint get_size();
- bool get_mouse_anchor_point(SpicePoint& pt);
-
- void set_mouse_position(int x, int y);
- void set_cursor(LocalCursor* local_cursor);
- void hide_cursor();
- void show_cursor();
- void capture_mouse();
- void release_mouse();
- void start_key_interception();
- void stop_key_interception();
- int set_menu(Menu* menu);
-
-#ifdef USE_OPENGL
- void untouch_context();
- RedGlContext create_context_gl();
- RedPbuffer create_pbuff(int width, int height);
- void set_render_pbuff(RedPbuffer pbuff);
- void set_render_fbo(GLuint fbo);
- void set_gl_context(RedGlContext context);
-
- void set_type_gl();
- void unset_type_gl();
-
- void swap_gl();
-#endif
-
- int get_screen_num();
-
- static void init();
- static void cleanup();
-
- Listener& get_listener() { return _listener;}
-
-private:
- void on_focus_in();
- void on_focus_out();
- void on_pointer_enter(int x, int y, unsigned int buttons_state);
- void on_pointer_leave();
-
- void do_start_key_interception();
- void do_stop_key_interception();
-
-private:
- Listener& _listener;
- SpicePoint _window_size;
- Type _type;
- LocalCursor* _local_cursor;
- bool _cursor_visible;
- bool _trace_key_interception;
- bool _key_interception_on;
- Menu* _menu;
-
- friend class RedWindow_p;
-};
-
-class RedWindow::Listener {
-public:
- virtual ~Listener() {}
- virtual void on_exposed_rect(const SpiceRect& area) = 0;
-
- virtual void on_pointer_enter(int x, int y, unsigned int buttons_state) = 0;
- virtual void on_pointer_motion(int x, int y, unsigned int buttons_state) = 0;
- virtual void on_pointer_leave() = 0;
- virtual void on_mouse_button_press(SpiceMouseButton button, unsigned int buttons_state) = 0;
- virtual void on_mouse_button_release(SpiceMouseButton button, unsigned int buttons_state) = 0;
-
- virtual void on_key_press(RedKey key) = 0;
- virtual void on_key_release(RedKey key) = 0;
- virtual void on_char(uint32_t ch) = 0;
-
- virtual void on_deactivate() = 0;
- virtual void on_activate() = 0;
-
- virtual void on_start_key_interception() = 0;
- virtual void on_stop_key_interception() = 0;
- virtual void enter_modal_loop() = 0;
- virtual void exit_modal_loop() = 0;
-
- virtual void pre_migrate() { }
- virtual void post_migrate() { }
-};
-
-/*class REGION {
- void get_bbox(SpiceRect& bbox) const;
- bool contains_point(int x, int y) const;
-
-};*/
-
-template <class REGION>
-static bool find_anchor_point(const REGION& region, SpicePoint& pt)
-{
- static const unsigned int lookup_size = 20;
- unsigned int width;
- unsigned int height;
- SpiceRect bbox;
-
- region.get_bbox(bbox);
- width = bbox.right - bbox.left;
- height = bbox.bottom - bbox.top;
-
- int div = 2;
-
- for (;;) {
- unsigned int h_unit;
- unsigned int v_unit;
-
- if ((v_unit = height / div) * 2 < lookup_size || (h_unit = width / div) * 2 < lookup_size) {
- return false;
- }
-
- for (unsigned int y = v_unit; y < v_unit * div; y += v_unit * 2) {
- for (unsigned int x = h_unit; x < h_unit * div; x += h_unit * 2) {
- if (!region.contains_point(bbox.left + x, bbox.top + y)) {
- continue;
- }
-
- SpiceRect r;
- r.left = bbox.left + x - lookup_size / 2;
- r.right = r.left + lookup_size;
- r.top = bbox.top + y - lookup_size / 2;
- r.bottom = r.top + lookup_size;
-
- if (!region.contains_point(r.left, r.top) ||
- !region.contains_point(r.right, r.top) ||
- !region.contains_point(r.left, r.bottom) ||
- !region.contains_point(r.right, r.bottom)) {
- continue;
- }
- pt.x = bbox.left + x;
- pt.y = bbox.top + y;
- return true;
- }
- }
- div *= 2;
- }
-}
-
-#endif
diff --git a/client/screen.cpp b/client/screen.cpp
deleted file mode 100644
index ce14edd1..00000000
--- a/client/screen.cpp
+++ /dev/null
@@ -1,944 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-#include "screen.h"
-#include "application.h"
-#include "screen_layer.h"
-#include "utils.h"
-#include "debug.h"
-#include "monitor.h"
-#include "red_pixmap_sw.h"
-#include "resource.h"
-#include "icon.h"
-
-class UpdateEvent: public Event {
-public:
- UpdateEvent(int screen) : _screen (screen) {}
-
- virtual void response(AbstractProcessLoop& events_loop)
- {
- Application* app = static_cast<Application*>(events_loop.get_owner());
- RedScreen* screen = app->find_screen(_screen);
- if (screen) {
- screen->update();
- }
- }
-
-private:
- int _screen;
-};
-
-class LayerChangedEvent: public Event {
-public:
- LayerChangedEvent (int screen) : _screen (screen) {}
-
- virtual void response(AbstractProcessLoop& events_loop)
- {
- Application* app = static_cast<Application*>(events_loop.get_owner());
- RedScreen* screen = app->find_screen(_screen);
- if (screen) {
- Lock lock(screen->_layer_changed_lock);
- screen->_active_layer_change_event = false;
- lock.unlock();
- if (screen->_pointer_on_screen) {
- screen->update_pointer_layer();
- }
- }
- }
-
-private:
- int _screen;
-};
-
-
-void UpdateTimer::response(AbstractProcessLoop& events_loop)
-{
- _screen->periodic_update();
-}
-
-RedScreen::RedScreen(Application& owner, int id, const std::string& name, int width, int height)
- : _owner (owner)
- , _id (id)
- , _refs (1)
- , _window (*this)
- , _active (false)
- , _full_screen (false)
- , _out_of_sync (false)
- , _frame_area (false)
- , _periodic_update (false)
- , _key_interception (false)
- , _update_by_timer (true)
- , _size_locked (false)
- , _menu_needs_update (false)
- , _force_update_timer (0)
- , _update_timer (new UpdateTimer(this))
- , _composit_area (NULL)
- , _update_mark (1)
- , _monitor (NULL)
- , _default_cursor (NULL)
- , _inactive_cursor (NULL)
- , _pixel_format_index (0)
- , _update_interrupt_trigger (NULL)
- , _pointer_layer (NULL)
- , _mouse_captured (false)
- , _active_layer_change_event (false)
- , _pointer_on_screen (false)
-{
- region_init(&_dirty_region);
- set_name(name);
- _size.x = width;
- _size.y = height;
- _origin.x = _origin.y = 0;
- create_composit_area();
- _window.resize(_size.x, _size.y);
- save_position();
- if ((_default_cursor = Platform::create_default_cursor()) == NULL) {
- THROW("create default cursor failed");
- }
- if ((_inactive_cursor = Platform::create_inactive_cursor()) == NULL) {
- THROW("create inactive cursor failed");
- }
- _window.set_cursor(_default_cursor);
- update_menu();
- AutoRef<Icon> icon(Platform::load_icon(RED_ICON_RES_ID));
- _window.set_icon(*icon);
- _window.start_key_interception();
-}
-
-RedScreen::~RedScreen()
-{
- bool captured = is_mouse_captured();
- _window.stop_key_interception();
- relase_mouse();
- destroy_composit_area();
- _owner.deactivate_interval_timer(*_update_timer);
- _owner.on_screen_destroyed(_id, captured);
- region_destroy(&_dirty_region);
- if (_default_cursor) {
- _default_cursor->unref();
- }
-
- if (_inactive_cursor) {
- _inactive_cursor->unref();
- }
-}
-
-void RedScreen::show(bool activate, RedScreen* pos)
-{
- _window.position_after((pos) ? &pos->_window : NULL);
- show();
- if (activate) {
- _window.activate();
- }
-}
-
-RedScreen* RedScreen::ref()
-{
- ++_refs;
- return this;
-}
-
-void RedScreen::unref()
-{
- if (!--_refs) {
- delete this;
- }
-}
-
-void RedScreen::destroy_composit_area()
-{
- if (_composit_area) {
- delete _composit_area;
- _composit_area = NULL;
- }
-}
-
-void RedScreen::create_composit_area()
-{
- destroy_composit_area();
- _composit_area = new RedPixmapSw(_size.x, _size.y, _window.get_format(),
- false, &_window);
-}
-
-void RedScreen::adjust_window_rect(int x, int y)
-{
- _window.move_and_resize(x, y, _size.x, _size.y);
-}
-
-void RedScreen::resize(int width, int height)
-{
- RecurciveLock lock(_update_lock);
- _size.x = width;
- _size.y = height;
- create_composit_area();
- if (_full_screen) {
- __show_full_screen();
- } else {
- bool cuptur = is_mouse_captured();
- if (cuptur) {
- relase_mouse();
- }
- _window.resize(_size.x, _size.y);
- if (_active && cuptur) {
- capture_mouse();
- }
- }
- notify_new_size();
-}
-
-void RedScreen::lock_size()
-{
- ASSERT(!_size_locked);
- _size_locked = true;
-}
-
-void RedScreen::unlock_size()
-{
- _size_locked = false;
- _owner.on_screen_unlocked(*this);
-}
-
-void RedScreen::set_name(const std::string& name)
-{
- if (!name.empty()) {
- string_printf(_name, name.c_str(), _id);
- }
- _window.set_title(_name);
-}
-
-void RedScreen::on_layer_changed(ScreenLayer& layer)
-{
- Lock lock(_layer_changed_lock);
- if (_active_layer_change_event) {
- return;
- }
- _active_layer_change_event = true;
- AutoRef<LayerChangedEvent> change_event(new LayerChangedEvent(_id));
- _owner.push_event(*change_event);
-}
-
-void RedScreen::attach_layer(ScreenLayer& layer)
-{
- RecurciveLock lock(_update_lock);
- int order = layer.z_order();
-
- if ((int)_layers.size() < order + 1) {
- _layers.resize(order + 1);
- }
- if (_layers[order]) {
- THROW("layer in use");
- }
- layer.set_screen(this);
- _layers[order] = &layer;
- ref();
- lock.unlock();
- layer.invalidate();
- if (_pointer_on_screen) {
- update_pointer_layer();
- }
-}
-
-void RedScreen::detach_layer(ScreenLayer& layer)
-{
- bool need_pointer_layer_update = false;
- if (_pointer_layer == &layer) {
- _pointer_layer->on_pointer_leave();
- _pointer_layer = NULL;
- need_pointer_layer_update = true;
- }
-
- RecurciveLock lock(_update_lock);
-
- int order = layer.z_order();
-
- if ((int)_layers.size() < order + 1 || _layers[order] != &layer) {
- THROW("not found");
- }
- QRegion layer_area;
- region_clone(&layer_area, &layer.area());
- _layers[order]->set_screen(NULL);
- _layers[order] = NULL;
- lock.unlock();
- invalidate(layer_area);
- region_destroy(&layer_area);
- unref();
- if (need_pointer_layer_update && !update_pointer_layer()) {
- _window.set_cursor(_inactive_cursor);
- }
-}
-
-void RedScreen::composit_to_screen(RedDrawable& win_dc, const QRegion& region)
-{
- pixman_box32_t *rects;
- int num_rects;
-
- rects = pixman_region32_rectangles((pixman_region32_t *)&region, &num_rects);
- for (int i = 0; i < num_rects; i++) {
- SpiceRect r;
-
- r.left = rects[i].x1;
- r.top = rects[i].y1;
- r.right = rects[i].x2;
- r.bottom = rects[i].y2;
- win_dc.copy_pixels(*_composit_area, r.left, r.top, r);
- }
-}
-
-void RedScreen::notify_new_size()
-{
- for (int i = 0; i < (int)_layers.size(); i++) {
- if (!_layers[i]) {
- continue;
- }
- _layers[i]->on_size_changed();
- }
-}
-
-inline void RedScreen::begin_update(QRegion& direct_rgn, QRegion& composit_rgn,
- QRegion& frame_rgn)
-{
- region_init(&composit_rgn);
- RecurciveLock lock(_update_lock);
- region_clone(&direct_rgn, &_dirty_region);
- region_clear(&_dirty_region);
- _update_mark++;
- lock.unlock();
-
- QRegion rect_rgn;
- SpiceRect r;
- r.top = r.left = 0;
- r.right = _size.x;
- r.bottom = _size.y;
- region_init(&rect_rgn);
- region_add(&rect_rgn, &r);
-
- if (_frame_area) {
- region_clone(&frame_rgn, &direct_rgn);
- region_exclude(&frame_rgn, &rect_rgn);
- }
- region_and(&direct_rgn, &rect_rgn);
- region_destroy(&rect_rgn);
-
- for (int i = _layers.size() - 1; i >= 0; i--) {
- ScreenLayer* layer;
-
- if (!(layer = _layers[i])) {
- continue;
- }
- layer->begin_update(direct_rgn, composit_rgn);
- }
-}
-
-inline void RedScreen::update_done()
-{
- for (unsigned int i = 0; i < _layers.size(); i++) {
- ScreenLayer* layer;
-
- if (!(layer = _layers[i])) {
- continue;
- }
- layer->on_update_completion(_update_mark - 1);
- }
-#ifdef USE_OPENGL
- _window.swap_gl();
-#endif
-}
-
-inline void RedScreen::update_composit(QRegion& composit_rgn)
-{
- erase_background(*_composit_area, composit_rgn);
- for (int i = 0; i < (int)_layers.size(); i++) {
- ScreenLayer* layer;
-
- if (!(layer = _layers[i])) {
- continue;
- }
- QRegion& dest_region = layer->composit_area();
- region_or(&composit_rgn, &dest_region);
- layer->copy_pixels(dest_region, *_composit_area);
- }
-}
-
-inline void RedScreen::draw_direct(RedDrawable& win_dc, QRegion& direct_rgn, QRegion& composit_rgn,
- QRegion& frame_rgn)
-{
- erase_background(win_dc, direct_rgn);
-
- if (_frame_area) {
- erase_background(win_dc, frame_rgn);
- region_destroy(&frame_rgn);
- }
-
- for (int i = 0; i < (int)_layers.size(); i++) {
- ScreenLayer* layer;
-
- if (!(layer = _layers[i])) {
- continue;
- }
- QRegion& dest_region = layer->direct_area();
- layer->copy_pixels(dest_region, win_dc);
- }
-}
-
-void RedScreen::periodic_update()
-{
- bool need_update;
- RecurciveLock lock(_update_lock);
- if (is_dirty()) {
- need_update = true;
- } else {
- if (!_force_update_timer) {
- _owner.deactivate_interval_timer(*_update_timer);
- _periodic_update = false;
- }
- need_update = false;
- }
- lock.unlock();
-
- if (need_update) {
- if (update_by_interrupt()) {
- interrupt_update();
- } else {
- update();
- }
- }
-}
-
-void RedScreen::activate_timer()
-{
- RecurciveLock lock(_update_lock);
- if (_periodic_update) {
- return;
- }
- _periodic_update = true;
- lock.unlock();
- _owner.activate_interval_timer(*_update_timer, 1000 / 30);
-}
-
-void RedScreen::update()
-{
- if (is_out_of_sync()) {
- return;
- }
-
- QRegion direct_rgn;
- QRegion composit_rgn;
- QRegion frame_rgn;
-
- begin_update(direct_rgn, composit_rgn, frame_rgn);
- update_composit(composit_rgn);
- draw_direct(_window, direct_rgn, composit_rgn, frame_rgn);
- composit_to_screen(_window, composit_rgn);
- update_done();
- region_destroy(&direct_rgn);
- region_destroy(&composit_rgn);
-
- if (_update_by_timer) {
- activate_timer();
- }
-}
-
-bool RedScreen::_invalidate(const SpiceRect& rect, bool urgent, uint64_t& update_mark)
-{
- RecurciveLock lock(_update_lock);
- bool update_triger = !is_dirty() && (urgent || !_periodic_update);
- region_add(&_dirty_region, &rect);
- update_mark = _update_mark;
- return update_triger;
-}
-
-uint64_t RedScreen::invalidate(const SpiceRect& rect, bool urgent)
-{
- uint64_t update_mark;
- if (_invalidate(rect, urgent, update_mark)) {
- if (!urgent && _update_by_timer) {
- activate_timer();
- } else {
- if (update_by_interrupt()) {
- interrupt_update();
- } else {
- AutoRef<UpdateEvent> update_event(new UpdateEvent(_id));
- _owner.push_event(*update_event);
- }
- }
- }
- return update_mark;
-}
-
-void RedScreen::invalidate(const QRegion &region)
-{
- pixman_box32_t *rects, *end;
- int num_rects;
-
- rects = pixman_region32_rectangles((pixman_region32_t *)&region, &num_rects);
- end = rects + num_rects;
-
- while (rects != end) {
- SpiceRect r;
-
- r.left = rects->x1;
- r.top = rects->y1;
- r.right = rects->x2;
- r.bottom = rects->y2;
- rects++;
-
- invalidate(r, false);
- }
-}
-
-inline void RedScreen::erase_background(RedDrawable& dc, const QRegion& composit_rgn)
-{
- pixman_box32_t *rects;
- int num_rects;
-
- rects = pixman_region32_rectangles((pixman_region32_t *)&composit_rgn, &num_rects);
- for (int i = 0; i < num_rects; i++) {
- SpiceRect r;
-
- r.left = rects[i].x1;
- r.top = rects[i].y1;
- r.right = rects[i].x2;
- r.bottom = rects[i].y2;
-
- dc.fill_rect(r, 0);
- }
-}
-
-void RedScreen::reset_mouse_pos()
-{
- _window.set_mouse_position(_mouse_anchor_point.x, _mouse_anchor_point.y);
-}
-
-void RedScreen::capture_mouse()
-{
- if (_mouse_captured || !_window.get_mouse_anchor_point(_mouse_anchor_point)) {
- return;
- }
-
- if (_pointer_layer) {
- _pointer_layer->on_pointer_leave();
- _pointer_layer = NULL;
- }
- _pointer_on_screen = false;
- _mouse_captured = true;
- _window.hide_cursor();
- reset_mouse_pos();
- _window.capture_mouse();
-}
-
-void RedScreen::relase_mouse()
-{
- if (!_mouse_captured) {
- return;
- }
- _mouse_captured = false;
- _window.release_mouse();
- update_pointer_layer();
-}
-
-void RedScreen::set_cursor(LocalCursor* cursor)
-{
- if (_mouse_captured) {
- return;
- }
-
- _window.set_cursor(cursor);
-}
-
-void RedScreen::hide_cursor()
-{
- _window.hide_cursor();
-}
-
-ScreenLayer* RedScreen::find_pointer_layer()
-{
- for (int i = _layers.size() - 1; i >= 0; i--) {
- ScreenLayer* layer;
-
- if (!(layer = _layers[i])) {
- continue;
- }
-
- if (layer->pointer_test(_pointer_pos.x, _pointer_pos.y)) {
- return layer;
- }
- }
- return NULL;
-}
-
-bool RedScreen::update_pointer_layer()
-{
- ASSERT(!_mouse_captured);
-
- ScreenLayer* now = find_pointer_layer();
-
- if (now == _pointer_layer) {
- return false;
- }
-
- if (_pointer_layer) {
- _pointer_layer->on_pointer_leave();
- }
-
- _pointer_layer = find_pointer_layer();
-
- if (_pointer_layer) {
- _pointer_layer->on_pointer_enter(_pointer_pos.x, _pointer_pos.y, _mouse_botton_state);
- } else {
- set_cursor(_inactive_cursor);
- }
-
- return true;
-}
-
-void RedScreen::on_pointer_enter(int x, int y, unsigned int buttons_state)
-{
- if (_mouse_captured) {
- return;
- }
-
- _pointer_on_screen = true;
- _pointer_pos.x = x;
- _pointer_pos.y = y;
- _mouse_botton_state = buttons_state;
-
- ScreenLayer* layer = find_pointer_layer();
- if (!layer) {
- set_cursor(_inactive_cursor);
- return;
- }
-
- _pointer_layer = layer;
- _pointer_layer->on_pointer_enter(_pointer_pos.x, _pointer_pos.y, buttons_state);
-
- if (_full_screen) {
- /* allowing enterance to key interception mode without
- requiring the user to press the window
- */
- activate();
- }
-}
-
-void RedScreen::on_mouse_motion(int x, int y, unsigned int buttons_state)
-{
- if (x != _mouse_anchor_point.x || y != _mouse_anchor_point.y) {
- _owner.on_mouse_motion(x - _mouse_anchor_point.x,
- y - _mouse_anchor_point.y,
- buttons_state);
- reset_mouse_pos();
- }
-}
-
-void RedScreen::on_pointer_motion(int x, int y, unsigned int buttons_state)
-{
- if (_mouse_captured) {
- on_mouse_motion(x, y, buttons_state);
- return;
- }
-
- _pointer_pos.x = x;
- _pointer_pos.y = y;
- _mouse_botton_state = buttons_state;
-
- if (update_pointer_layer() || !_pointer_layer) {
- return;
- }
-
- _pointer_layer->on_pointer_motion(x, y, buttons_state);
-}
-
-void RedScreen::on_mouse_button_press(SpiceMouseButton button, unsigned int buttons_state)
-{
- if (_mouse_captured) {
- _owner.on_mouse_down(button, buttons_state);
- return;
- }
-
- if (!_pointer_layer) {
- return;
- }
-
- _pointer_layer->on_mouse_button_press(button, buttons_state);
-}
-
-void RedScreen::on_mouse_button_release(SpiceMouseButton button, unsigned int buttons_state)
-{
- if (_mouse_captured) {
- _owner.on_mouse_up(button, buttons_state);
- return;
- }
-
- if (!_pointer_layer) {
- return;
- }
- _pointer_layer->on_mouse_button_release(button, buttons_state);
-}
-
-void RedScreen::on_pointer_leave()
-{
-// ASSERT(!_mouse_captured);
-
- if (_pointer_layer) {
- _pointer_layer->on_pointer_leave();
- _pointer_layer = NULL;
- }
- _pointer_on_screen = false;
-}
-
-void RedScreen::on_key_press(RedKey key)
-{
- _owner.on_key_down(key);
-}
-
-void RedScreen::on_key_release(RedKey key)
-{
- _owner.on_key_up(key);
-}
-
-void RedScreen::on_char(uint32_t ch)
-{
- _owner.on_char(ch);
-}
-
-void RedScreen::on_deactivate()
-{
- relase_mouse();
- _active = false;
- _owner.on_deactivate_screen(this);
-}
-
-void RedScreen::on_activate()
-{
- _active = true;
- _owner.on_activate_screen(this);
-}
-
-void RedScreen::on_start_key_interception()
-{
- _key_interception = true;
- _owner.on_start_screen_key_interception(this);
-}
-
-void RedScreen::on_stop_key_interception()
-{
- _key_interception = false;
- _owner.on_stop_screen_key_interception(this);
-}
-
-void RedScreen::enter_modal_loop()
-{
- _force_update_timer++;
- activate_timer();
-}
-
-void RedScreen::exit_modal_loop()
-{
- ASSERT(_force_update_timer > 0)
- _force_update_timer--;
-}
-
-void RedScreen::pre_migrate()
-{
- for (int i = 0; i < (int)_layers.size(); i++) {
- if (!_layers[i]) {
- continue;
- }
- _layers[i]->pre_migrate();
- }
-}
-
-void RedScreen::post_migrate()
-{
- for (int i = 0; i < (int)_layers.size(); i++) {
- if (!_layers[i]) {
- continue;
- }
- _layers[i]->post_migrate();
- }
-}
-
-void RedScreen::exit_full_screen()
-{
- if (!_full_screen) {
- return;
- }
- RecurciveLock lock(_update_lock);
- _window.hide();
- region_clear(&_dirty_region);
- _window.set_type(RedWindow::TYPE_NORMAL);
- adjust_window_rect(_save_pos.x, _save_pos.y);
- _origin.x = _origin.y = 0;
- _window.set_origin(0, 0);
- show();
- if (_menu_needs_update) {
- update_menu();
- }
- _full_screen = false;
- _out_of_sync = false;
- _frame_area = false;
-}
-
-void RedScreen::save_position()
-{
- _save_pos = _window.get_position();
-}
-
-void RedScreen::__show_full_screen()
-{
- if (!_monitor) {
- hide();
- return;
- }
- SpicePoint position = _monitor->get_position();
- SpicePoint monitor_size = _monitor->get_size();
- _frame_area = false;
- region_clear(&_dirty_region);
- _window.set_type(RedWindow::TYPE_FULLSCREEN);
- _window.move_and_resize(position.x, position.y, monitor_size.x, monitor_size.y);
-
- if (!(_out_of_sync = _monitor->is_out_of_sync())) {
- ASSERT(monitor_size.x >= _size.x);
- ASSERT(monitor_size.y >= _size.y);
- _origin.x = (monitor_size.x - _size.x) / 2;
- _origin.y = (monitor_size.y - _size.y) / 2;
- _frame_area = monitor_size.x != _size.x || monitor_size.y != _size.y;
- } else {
- _origin.x = _origin.y = 0;
- }
- _window.set_origin(_origin.x, _origin.y);
- show();
-}
-
-void RedScreen::show_full_screen()
-{
- if (_full_screen) {
- return;
- }
- RecurciveLock lock(_update_lock);
-#ifndef WIN32
- /* performing hide during resolution changes resulted in
- missing WM_KEYUP events */
- hide();
-#endif
- save_position();
- _full_screen = true;
- __show_full_screen();
-}
-
-void RedScreen::minimize()
-{
- _window.minimize();
-}
-
-void RedScreen::position_full_screen(const SpicePoint& position)
-{
- if (!_full_screen) {
- return;
- }
-
- _window.move(position.x, position.y);
-}
-
-void RedScreen::hide()
-{
- _window.hide();
-}
-
-void RedScreen::show()
-{
- RecurciveLock lock(_update_lock);
- _window.show(_monitor ? _monitor->get_screen_id() : 0);
-}
-
-void RedScreen::activate()
-{
- _window.activate();
-}
-
-void RedScreen::external_show()
-{
- DBG(0, "Entry");
- _window.external_show();
-}
-
-void RedScreen::update_menu()
-{
- AutoRef<Menu> menu(_owner.get_app_menu());
- int ret = _window.set_menu(*menu);
- _menu_needs_update = (ret != 0); /* try again if menu update failed */
-}
-
-void RedScreen::on_exposed_rect(const SpiceRect& area)
-{
- if (is_out_of_sync()) {
- _window.fill_rect(area, rgb32_make(0xff, 0xff, 0xff));
- return;
- }
- invalidate(area, false);
-}
-
-int RedScreen::get_screen_id()
-{
- return _monitor ? _monitor->get_screen_id() : 0;
-}
-
-#ifdef USE_OPENGL
-void RedScreen::untouch_context()
-{
- _window.untouch_context();
-}
-
-bool RedScreen::need_recreate_context_gl()
-{
- if (_full_screen) {
- return true;
- }
- return false;
-}
-
-#endif
-
-void RedScreen::set_update_interrupt_trigger(EventSources::Trigger *trigger)
-{
- _update_interrupt_trigger = trigger;
-}
-
-bool RedScreen::update_by_interrupt()
-{
- return _update_interrupt_trigger != NULL;
-}
-
-void RedScreen::interrupt_update()
-{
- _update_interrupt_trigger->trigger();
-}
-
-#ifdef USE_OPENGL
-void RedScreen::set_type_gl()
-{
- _window.set_type_gl();
-}
-
-void RedScreen::unset_type_gl()
-{
- _window.unset_type_gl();
-}
-#endif // USE_OPENGL
diff --git a/client/screen.h b/client/screen.h
deleted file mode 100644
index 4093006f..00000000
--- a/client/screen.h
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_SCREEN
-#define _H_SCREEN
-
-#include "common/region.h"
-
-#include "common.h"
-#include "red_key.h"
-#ifdef USE_OPENGL
-#include "GL/gl.h"
-#endif // USE_OPENGL
-
-#include "red_window.h"
-#include "platform.h"
-#include "process_loop.h"
-#include "threads.h"
-#include "utils.h"
-
-class Application;
-class ScreenLayer;
-class Monitor;
-class RedScreen;
-
-enum {
- SCREEN_LAYER_DISPLAY,
- SCREEN_LAYER_CURSOR,
- SCREEN_LAYER_GUI_BARIER,
- SCREEN_LAYER_GUI,
- SCREEN_LAYER_INFO,
-};
-
-class UpdateTimer: public Timer {
-public:
- UpdateTimer(RedScreen* screen) : _screen (screen) {}
- virtual void response(AbstractProcessLoop& events_loop);
-private:
- RedScreen* _screen;
-};
-
-class RedScreen: public RedWindow::Listener {
-public:
- RedScreen(Application& owner, int id, const std::string& name, int width, int height);
-
- RedScreen* ref();
- void unref();
-
- void attach_layer(ScreenLayer& layer);
- void detach_layer(ScreenLayer& layer);
- void on_layer_changed(ScreenLayer& layer);
- /* When resizing on full screen mode, the monitor must be configured
- * correctly before calling resize*/
- void resize(int width, int height);
- void set_name(const std::string& name);
- uint64_t invalidate(const SpiceRect& rect, bool urgent);
- void invalidate(const QRegion &region);
- void capture_mouse();
- void relase_mouse();
- bool is_mouse_captured() { return _mouse_captured;}
- bool intercepts_sys_key() { return _key_interception;}
- SpicePoint get_size() { return _size;}
- bool has_monitor() { return _monitor != 0;}
- void lock_size();
- void unlock_size();
- bool is_size_locked() { return _size_locked;}
- void set_monitor(Monitor *monitor) { _monitor = monitor;}
- Monitor* get_monitor() { return _monitor;}
- RedWindow* get_window() { return &_window;}
- bool is_out_of_sync() { return _out_of_sync;}
- void set_cursor(LocalCursor* cursor);
- void hide_cursor();
- void exit_full_screen();
- void minimize();
- void show(bool activate, RedScreen* pos);
- void show_full_screen();
- void position_full_screen(const SpicePoint& position);
- void hide();
- void show();
- void activate();
- void external_show();
- void update_menu();
-
- int get_id() { return _id;}
- int get_screen_id();
-
-#ifdef USE_OPENGL
- void untouch_context();
- bool need_recreate_context_gl();
- void set_type_gl();
- void unset_type_gl();
-#endif
- void set_update_interrupt_trigger(EventSources::Trigger *trigger);
- bool update_by_interrupt();
- void interrupt_update();
-
- void update();
-
-private:
- friend class UpdateEvent;
- friend class UpdateTimer;
-
- virtual ~RedScreen();
- void create_composit_area();
-
- void destroy_composit_area();
- void erase_background(RedDrawable& dc, const QRegion& region);
- void notify_new_size();
- void adjust_window_rect(int x, int y);
- void save_position();
- void __show_full_screen();
-
- bool _invalidate(const SpiceRect& rect, bool urgent, uint64_t& update_mark);
- void begin_update(QRegion& direct_rgn, QRegion& composit_rgn, QRegion& frame_rgn);
- void update_composit(QRegion& composit_rgn);
- void draw_direct(RedDrawable& win_dc, QRegion& direct_rgn, QRegion& composit_rgn,
- QRegion& frame_rgn);
- void activate_timer();
- void update_done();
- void periodic_update();
- bool is_dirty() {return !region_is_empty(&_dirty_region);}
- void composit_to_screen(RedDrawable& win_dc, const QRegion& region);
-
- void reset_mouse_pos();
- ScreenLayer* find_pointer_layer();
- bool update_pointer_layer();
-
- virtual void on_exposed_rect(const SpiceRect& area);
- virtual void on_pointer_enter(int x, int y, unsigned int buttons_state);
- virtual void on_pointer_motion(int x, int y, unsigned int buttons_state);
- virtual void on_pointer_leave();
- void on_mouse_motion(int x, int y, unsigned int buttons_state);
- virtual void on_mouse_button_press(SpiceMouseButton button, unsigned int buttons_state);
- virtual void on_mouse_button_release(SpiceMouseButton button, unsigned int buttons_state);
-
- virtual void on_key_press(RedKey key);
- virtual void on_key_release(RedKey key);
- virtual void on_char(uint32_t ch);
-
- virtual void on_deactivate();
- virtual void on_activate();
-
- virtual void on_start_key_interception();
- virtual void on_stop_key_interception();
- virtual void enter_modal_loop();
- virtual void exit_modal_loop();
-
- virtual void pre_migrate();
- virtual void post_migrate();
-
-private:
- Application& _owner;
- int _id;
- AtomicCount _refs;
- std::string _name;
- RedWindow _window;
- std::vector<ScreenLayer*> _layers;
- QRegion _dirty_region;
- RecurciveMutex _update_lock;
- bool _active;
- bool _full_screen;
- bool _out_of_sync;
- bool _frame_area;
- bool _periodic_update;
- bool _key_interception;
- bool _update_by_timer;
- bool _size_locked;
- bool _menu_needs_update;
- int _force_update_timer;
- AutoRef<UpdateTimer> _update_timer;
- RedDrawable* _composit_area;
- uint64_t _update_mark;
-
- SpicePoint _size;
- SpicePoint _origin;
- SpicePoint _mouse_anchor_point;
- SpicePoint _save_pos;
- Monitor* _monitor;
-
- LocalCursor* _default_cursor;
- LocalCursor* _inactive_cursor;
-
- int _pixel_format_index;
- EventSources::Trigger *_update_interrupt_trigger;
-
- ScreenLayer* _pointer_layer;
- bool _mouse_captured;
- Mutex _layer_changed_lock;
- bool _active_layer_change_event;
- bool _pointer_on_screen;
- SpicePoint _pointer_pos;
- unsigned int _mouse_botton_state;
-
- friend class LayerChangedEvent;
-};
-
-#endif
diff --git a/client/screen_layer.cpp b/client/screen_layer.cpp
deleted file mode 100644
index 3638509d..00000000
--- a/client/screen_layer.cpp
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-#include "screen_layer.h"
-#include "utils.h"
-#include "screen.h"
-#include "application.h"
-#include "debug.h"
-
-class AttachLayerEvent: public SyncEvent {
-public:
- AttachLayerEvent(ScreenLayer& layer, int screen_id)
- : _layer (layer)
- , _screen_id (screen_id)
- {
- }
-
- virtual void do_response(AbstractProcessLoop& events_loop);
-
-private:
- ScreenLayer& _layer;
- int _screen_id;
-};
-
-void AttachLayerEvent::do_response(AbstractProcessLoop& events_loop)
-{
- Application* app = (Application*)(events_loop.get_owner());
- AutoRef<RedScreen> screen(app->get_screen(_screen_id));
- (*screen)->attach_layer(_layer);
-}
-
-class DetachLayerEvent: public SyncEvent {
-public:
- DetachLayerEvent(ScreenLayer& _layer) : _layer (_layer) {}
-
- virtual void do_response(AbstractProcessLoop& events_loop);
-
-private:
- ScreenLayer& _layer;
-};
-
-void DetachLayerEvent::do_response(AbstractProcessLoop& events_loop)
-{
- _layer.screen()->detach_layer(_layer);
-}
-
-ScreenLayer::ScreenLayer(int z_order, bool opaque)
- : _screen (NULL)
- , _z_order (z_order)
- , _opaque (opaque)
- , _using_ogl (false)
-{
- region_init(&_area);
- region_init(&_direct_area);
- region_init(&_composit_area);
-}
-
-ScreenLayer::~ScreenLayer()
-{
- ASSERT(!_screen);
- region_destroy(&_area);
- region_destroy(&_direct_area);
- region_destroy(&_composit_area);
-}
-
-uint64_t ScreenLayer::invalidate_rect(const SpiceRect& r, bool urgent)
-{
- return _screen->invalidate(r, urgent);
-}
-
-uint64_t ScreenLayer::invalidate(const SpiceRect& r, bool urgent)
-{
- if (!_screen) {
- return 0;
- }
- return invalidate_rect(r, urgent);
-}
-
-void ScreenLayer::invalidate(const QRegion& region)
-{
- pixman_box32_t *rects, *end;
- int num_rects;
-
- if (!_screen) {
- return;
- }
-
- rects = pixman_region32_rectangles((pixman_region32_t *)&region, &num_rects);
- end = rects + num_rects;
-
- while (rects != end) {
- SpiceRect r;
-
- r.left = rects->x1;
- r.top = rects->y1;
- r.right = rects->x2;
- r.bottom = rects->y2;
- rects++;
-
- invalidate_rect(r, false);
- }
-}
-
-void ScreenLayer::invalidate()
-{
- invalidate(_area);
-}
-
-void ScreenLayer::notify_changed()
-{
- if (_screen) {
- _screen->on_layer_changed(*this);
- }
-}
-
-void ScreenLayer::set_area(const QRegion& area)
-{
- Lock lock(_area_lock);
- invalidate();
- region_destroy(&_area);
- region_clone(&_area, &area);
- invalidate();
- notify_changed();
-}
-
-void ScreenLayer::clear_area()
-{
- Lock lock(_area_lock);
- invalidate();
- region_clear(&_area);
- notify_changed();
-}
-
-void ScreenLayer::set_rect_area(const SpiceRect& r)
-{
- Lock lock(_area_lock);
- invalidate();
- region_clear(&_area);
- region_add(&_area, &r);
- invalidate();
- notify_changed();
-}
-
-void ScreenLayer::offset_area(int dx, int dy)
-{
- Lock lock(_area_lock);
- invalidate();
- region_offset(&_area, dx, dy);
- invalidate();
- notify_changed();
-}
-
-void ScreenLayer::add_rect_area(const SpiceRect& r)
-{
- Lock lock(_area_lock);
- region_add(&_area, &r);
- notify_changed();
-}
-
-void ScreenLayer::remove_rect_area(const SpiceRect& r)
-{
- Lock lock(_area_lock);
- invalidate();
- region_remove(&_area, &r);
- notify_changed();
-}
-
-void ScreenLayer::begin_update(QRegion& direct_rgn, QRegion& composit_rgn)
-{
- Lock lock(_area_lock);
- region_destroy(&_direct_area);
- region_clone(&_direct_area, &_area);
- region_and(&_direct_area, &direct_rgn);
-
- region_destroy(&_composit_area);
- region_clone(&_composit_area, &_area);
- region_and(&_composit_area, &composit_rgn);
-
- region_exclude(&direct_rgn, &_direct_area);
- if (_opaque) {
- region_exclude(&composit_rgn, &_composit_area);
- } else {
- region_or(&composit_rgn, &_direct_area);
- region_or(&_composit_area, &_direct_area);
- region_clear(&_direct_area);
- }
-}
-
-bool ScreenLayer::contains_point(int x, int y)
-{
- Lock lock(_area_lock);
- return !!region_contains_point(&_area, x, y);
-}
-
-void ScreenLayer::attach_to_screen(Application& application, int screen_id)
-{
- if (_screen) {
- return;
- }
- AutoRef<AttachLayerEvent> event(new AttachLayerEvent(*this, screen_id));
- application.push_event(*event);
- (*event)->wait();
- if (!(*event)->success()) {
- THROW("attach failed");
- }
- ASSERT(_screen);
-}
-
-void ScreenLayer::detach_from_screen(Application& application)
-{
- if (!_screen) {
- return;
- }
- AutoRef<DetachLayerEvent> event(new DetachLayerEvent(*this));
- application.push_event(*event);
- (*event)->wait();
- if (!(*event)->success()) {
- THROW("detach failed");
- }
- ASSERT(!_screen);
-}
diff --git a/client/screen_layer.h b/client/screen_layer.h
deleted file mode 100644
index 1168b245..00000000
--- a/client/screen_layer.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_SCREEN_LAYER
-#define _H_SCREEN_LAYER
-
-#include "common/region.h"
-#include "threads.h"
-
-class RedScreen;
-class Application;
-
-class ScreenLayer {
-public:
- ScreenLayer(int z_order, bool opaque);
- virtual ~ScreenLayer();
-
- void attach_to_screen(Application& application, int screen_id);
- void detach_from_screen(Application& application);
-
- void set_screen(RedScreen* screen) { _screen = screen;}
- RedScreen* screen() { return _screen; }
- int z_order() { return _z_order;}
- void set_area(const QRegion& area);
- void offset_area(int dx, int dy);
- void clear_area();
- void set_rect_area(const SpiceRect& r);
- void add_rect_area(const SpiceRect& r);
- void remove_rect_area(const SpiceRect& r);
- void begin_update(QRegion& direct_rgn, QRegion& composit_rgn);
- void invalidate();
- uint64_t invalidate(const SpiceRect& r, bool urgent = false);
- void invalidate(const QRegion& r);
- bool contains_point(int x, int y);
-
- virtual void copy_pixels(const QRegion& dest_region, RedDrawable& dest_dc) {}
-
- void set_using_ogl(bool val) {_using_ogl = val;}
- bool using_ogl() {return _using_ogl;}
- virtual void on_size_changed() {}
-
- virtual void pre_migrate() { }
- virtual void post_migrate() { }
-
- QRegion& area() { return _area;}
- QRegion& direct_area() { return _direct_area;}
- QRegion& composit_area() { return _composit_area;}
-
- virtual void on_update_completion(uint64_t mark) {}
-
- virtual bool pointer_test(int x, int y) { return false;}
- virtual void on_pointer_enter(int x, int y, unsigned int buttons_state) {}
- virtual void on_pointer_motion(int x, int y, unsigned int buttons_state) {}
- virtual void on_pointer_leave() {}
- virtual void on_mouse_button_press(int button, int buttons_state) {}
- virtual void on_mouse_button_release(int button, int buttons_state) {}
-
-private:
- uint64_t invalidate_rect(const SpiceRect& r, bool urgent);
- void notify_changed();
-
-private:
- RedScreen* _screen;
- int _z_order;
- bool _opaque;
- bool _using_ogl;
- Mutex _area_lock;
- QRegion _area;
- QRegion _direct_area;
- QRegion _composit_area;
-};
-
-#endif
diff --git a/client/shared_cache.hpp b/client/shared_cache.hpp
deleted file mode 100644
index 450116c5..00000000
--- a/client/shared_cache.hpp
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_SHARED_CACHE
-#define _H_SHARED_CACHE
-
-#include "utils.h"
-#include "threads.h"
-
-/*class SharedCache::Treat {
- T* get(T*);
- void release(T*);
- const char* name();
-};*/
-
-template <class T, class Treat, int HASH_SIZE, class Base = EmptyBase>
-class SharedCache : public Base {
-public:
- SharedCache()
- : _aborting (false)
- {
- memset(_hash, 0, sizeof(_hash));
- }
-
- ~SharedCache()
- {
- clear();
- }
-
- void add(uint64_t id, T* data, bool is_lossy = FALSE)
- {
- Lock lock(_lock);
- Item** item = &_hash[key(id)];
-
- while (*item) {
- if ((*item)->id == id) {
- (*item)->refs++;
- return;
- }
- item = &(*item)->next;
- }
- *item = new Item(id, data, is_lossy);
- _new_item_cond.notify_all();
- }
-
- T* get(uint64_t id)
- {
- Lock lock(_lock);
- Item* item = _hash[key(id)];
-
- for (;;) {
- if (!item) {
- if (_aborting) {
- THROW("%s aborting", Treat::name());
- }
- _new_item_cond.wait(lock);
- item = _hash[key(id)];
- continue;
- }
-
- if (item->id != id) {
- item = item->next;
- continue;
- }
-
- return Treat::get(item->data);
- }
- }
-
- T* get_lossless(uint64_t id)
- {
- Lock lock(_lock);
- Item* item = _hash[key(id)];
-
- for (;;) {
- if (!item) {
- if (_aborting) {
- THROW("%s aborting", Treat::name());
- }
- _new_item_cond.wait(lock);
- item = _hash[key(id)];
- continue;
- }
-
- if (item->id != id) {
- item = item->next;
- continue;
- }
- break;
- }
-
- // item has been retreived. Now checking if lossless
- for (;;) {
- if (item->lossy) {
- if (_aborting) {
- THROW("%s aborting", Treat::name());
- }
- _replace_data_cond.wait(lock);
- continue;
- }
-
- return Treat::get(item->data);
- }
- }
-
- void replace(uint64_t id, T* data, bool is_lossy = FALSE)
- {
- Lock lock(_lock);
- Item* item = _hash[key(id)];
-
- for (;;) {
- if (!item) {
- if (_aborting) {
- THROW("%s aborting", Treat::name());
- }
- _new_item_cond.wait(lock);
- item = _hash[key(id)];
- continue;
- }
-
- if (item->id != id) {
- item = item->next;
- continue;
- }
-
- item->replace(data, is_lossy);
- break;
- }
- _replace_data_cond.notify_all();
- }
-
- void remove(uint64_t id)
- {
- Lock lock(_lock);
- Item** item = &_hash[key(id)];
-
- while (*item) {
- if ((*item)->id == id) {
- if (!--(*item)->refs) {
- Item *rm_item = *item;
- *item = rm_item->next;
- delete rm_item;
- }
- return;
- }
- item = &(*item)->next;
- }
- THROW("%s id %" PRIu64 ", not found", Treat::name(), id);
- }
-
- void clear()
- {
- Lock lock(_lock);
- for (int i = 0; i < HASH_SIZE; i++) {
- while (_hash[i]) {
- Item *item = _hash[i];
- _hash[i] = item->next;
- delete item;
- }
- }
- }
-
- void abort()
- {
- Lock lock(_lock);
- _aborting = true;
- _new_item_cond.notify_all();
- }
-
-private:
- inline uint32_t key(uint64_t id) {return uint32_t(id) % HASH_SIZE;}
-
-private:
- class Item {
- public:
- Item(uint64_t in_id, T* data, bool is_lossy = FALSE)
- : id (in_id)
- , refs (1)
- , next (NULL)
- , data (Treat::get(data))
- , lossy (is_lossy) {}
-
- ~Item()
- {
- Treat::release(data);
- }
-
- void replace(T* new_data, bool is_lossy = FALSE)
- {
- Treat::release(data);
- data = Treat::get(new_data);
- lossy = is_lossy;
- }
-
- uint64_t id;
- int refs;
- Item* next;
- T* data;
- bool lossy;
- };
-
- Item* _hash[HASH_SIZE];
- Mutex _lock;
- Condition _new_item_cond;
- Condition _replace_data_cond;
- bool _aborting;
-};
-
-#endif
diff --git a/client/smartcard_channel.cpp b/client/smartcard_channel.cpp
deleted file mode 100644
index 720b879f..00000000
--- a/client/smartcard_channel.cpp
+++ /dev/null
@@ -1,553 +0,0 @@
-/*
- Copyright (C) 2010 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <spice/enums.h>
-#include "common/mutex.h"
-
-#include "red_client.h"
-
-extern "C" {
-#include <vscard_common.h>
-#include <vreader.h>
-#include <vcard_emul.h>
-#include <vevent.h>
-}
-
-#include "smartcard_channel.h"
-
-#define APDUBufSize 270
-
-#define MAX_ATR_LEN 40
-
-//#define DEBUG_SMARTCARD
-
-#ifdef DEBUG_SMARTCARD
-void PrintByteArray(uint8_t *arrBytes, unsigned int nSize)
-{
- int i;
-
- for (i=0; i < nSize; i++) {
- DBG(0, "%X ", arrBytes[i]);
- }
- DBG(0, "\n");
-}
-#define DEBUG_PRINT_BYTE_ARRAY(arrBytes, nSize) PrintByteArray(arrBytes, nSize)
-#else
-#define DEBUG_PRINT_BYTE_ARRAY(arrBytes, nSize)
-#endif
-
-SmartCardChannel* g_smartcard_channel = NULL; // used for insert/remove of virtual card. Can be
- // changed if we let Application store the SmartCard instance.
-
-class SmartCardHandler: public MessageHandlerImp<SmartCardChannel, SPICE_CHANNEL_SMARTCARD> {
-public:
- SmartCardHandler(SmartCardChannel& channel)
- : MessageHandlerImp<SmartCardChannel, SPICE_CHANNEL_SMARTCARD>(channel) {}
-};
-
-
-SmartCardChannel::SmartCardChannel(RedClient& client, uint32_t id)
- : RedChannel(client, SPICE_CHANNEL_SMARTCARD, id, new SmartCardHandler(*this))
- , _next_sync_vevent(VEVENT_LAST)
-{
- SmartCardHandler* handler = static_cast<SmartCardHandler*>(get_message_handler());
-
- g_smartcard_channel = this;
- handler->set_handler(SPICE_MSG_SMARTCARD_DATA,
- &SmartCardChannel::handle_smartcard_data);
-}
-
-ReaderData* SmartCardChannel::reader_data_from_vreader(VReader* vreader)
-{
- if (vreader == NULL) {
- assert(_readers_by_vreader.size() > 0);
- return _readers_by_vreader.begin()->second;
- }
- if (_readers_by_vreader.count(vreader) > 0) {
- return _readers_by_vreader.find(vreader)->second;
- }
- assert(_unallocated_readers_by_vreader.count(vreader) > 0);
- return _unallocated_readers_by_vreader.find(vreader)->second;
-}
-
-ReaderData* SmartCardChannel::reader_data_from_reader_id(uint32_t reader_id)
-{
- if (_readers_by_id.count(reader_id) > 0) {
- return _readers_by_id.find(reader_id)->second;
- }
- return NULL;
-}
-
-/** On VEVENT_READER_INSERT we call this, send a VSC_ReaderAdd, and wait for a VSC_ReaderAddResponse
- */
-void SmartCardChannel::add_unallocated_reader(VReader* vreader, const char* name)
-{
- ReaderData* data = new ReaderData();
-
- data->vreader = vreader;
- data->reader_id = VSCARD_UNDEFINED_READER_ID;
- data->name = spice_strdup(name);
- _unallocated_readers_by_vreader.insert(std::pair<VReader*, ReaderData*>(vreader, data));
- LOG_INFO("adding unallocated reader %p", data);
-}
-
-/** called upon the VSC_ReaderAddResponse
- */
-ReaderData* SmartCardChannel::add_reader(uint32_t reader_id)
-{
- ReaderData* data;
- size_t unallocated = _unallocated_readers_by_vreader.size();
-
- assert(unallocated > 0);
- data = _unallocated_readers_by_vreader.begin()->second;
- data->reader_id = reader_id;
- LOG_INFO("adding %p->%d", data, reader_id);
- _readers_by_vreader.insert(
- std::pair<VReader*, ReaderData*>(data->vreader, data));
- assert(_readers_by_vreader.count(data->vreader) == 1);
- _readers_by_id.insert(std::pair<uint32_t, ReaderData*>(reader_id, data));
- assert(_readers_by_id.count(reader_id) == 1);
- _unallocated_readers_by_vreader.erase(_unallocated_readers_by_vreader.begin());
- assert(_unallocated_readers_by_vreader.size() == unallocated - 1);
- assert(_unallocated_readers_by_vreader.count(data->vreader) == 0);
- return data;
-}
-
-void* SmartCardChannel::cac_card_events_thread_entry(void* data)
-{
- static_cast<SmartCardChannel*>(data)->cac_card_events_thread_main();
- return NULL;
-}
-
-VEventEvent::VEventEvent(SmartCardChannel* smartcard_channel, VEvent* vevent)
- : _smartcard_channel(smartcard_channel)
- , _vreader(vevent->reader)
- , _vevent(vevent)
-{
-}
-
-VEventEvent::~VEventEvent()
-{
- vevent_delete(_vevent);
-}
-
-void ReaderAddEvent::response(AbstractProcessLoop& events_loop)
-{
- static int num = 0;
- char name[20];
-
- sprintf(name, "test%4d", num++);
- _smartcard_channel->add_unallocated_reader(_vreader, name);
- _smartcard_channel->send_reader_added(name);
-}
-
-void ReaderRemoveEvent::response(AbstractProcessLoop& events_loop)
-{
- ReaderData* data;
-
- data = _smartcard_channel->reader_data_from_vreader(_vreader);
- _smartcard_channel->send_reader_removed(data->reader_id);
- _smartcard_channel->remove_reader(data);
-}
-
-void CardInsertEvent::response(AbstractProcessLoop& events_loop)
-{
- ReaderData* data = _smartcard_channel->reader_data_from_vreader(
- _vreader);
-
- if (data->reader_id == VSCARD_UNDEFINED_READER_ID) {
- data->card_insert_pending = true;
- } else {
- _smartcard_channel->send_atr(_vreader);
- }
-}
-
-void CardRemoveEvent::response(AbstractProcessLoop& events_loop)
-{
- ReaderData* data = _smartcard_channel->reader_data_from_vreader(
- _vreader);
-
- ASSERT(data->reader_id != VSCARD_UNDEFINED_READER_ID);
- _smartcard_channel->send_message(data->reader_id, VSC_CardRemove, NULL, 0);
-}
-
-void SmartCardChannel::remove_reader(ReaderData* data)
-{
- // TODO - untested code (caccard doesn't produce these events yet)
- if (_readers_by_vreader.count(data->vreader) > 0) {
- _readers_by_vreader.erase(_readers_by_vreader.find(data->vreader));
- _readers_by_id.erase(_readers_by_id.find(data->reader_id));
- } else {
- _unallocated_readers_by_vreader.erase(
- _unallocated_readers_by_vreader.find(data->vreader));
- }
- free(data->name);
- delete data;
-}
-
-/* Sync events need to be sent one by one, waiting for VSC_Error
- * messages from the server in between. */
-void SmartCardChannel::push_sync_event(VEventType type, Event *event)
-{
- event->ref();
- _sync_events.push_back(SmartCardEvent(type, event));
- if (_next_sync_vevent != VEVENT_LAST) {
- return;
- }
- send_next_sync_event();
-}
-
-void SmartCardChannel::send_next_sync_event()
-{
- if (_sync_events.empty()) {
- _next_sync_vevent = VEVENT_LAST;
- return;
- }
- SmartCardEvent sync_event = _sync_events.front();
- _sync_events.pop_front();
- get_client().push_event(sync_event.second);
- sync_event.second->unref();
- _next_sync_vevent = sync_event.first;
-}
-
-void SmartCardChannel::handle_reader_add_response(VSCMsgHeader *vheader,
- VSCMsgError *error)
-{
- ReaderData* data;
-
- if (error->code == VSC_SUCCESS) {
- data = add_reader(vheader->reader_id);
- if (data->card_insert_pending) {
- data->card_insert_pending = false;
- send_atr(data->vreader);
- }
- } else {
- LOG_WARN("VSC Error: reader %d, code %d",
- vheader->reader_id, error->code);
- }
-}
-
-void SmartCardChannel::handle_error_message(VSCMsgHeader *vheader,
- VSCMsgError *error)
-{
- switch (_next_sync_vevent) {
- case VEVENT_READER_INSERT:
- handle_reader_add_response(vheader, error);
- break;
- case VEVENT_CARD_INSERT:
- case VEVENT_CARD_REMOVE:
- case VEVENT_READER_REMOVE:
- break;
- default:
- LOG_WARN("Unexpected Error message: %d", error->code);
- }
- send_next_sync_event();
-}
-
-void SmartCardChannel::cac_card_events_thread_main()
-{
- VEvent *vevent = NULL;
- bool cont = true;
-
- while (cont) {
- vevent = vevent_wait_next_vevent();
- if (vevent == NULL) {
- break;
- }
- switch (vevent->type) {
- case VEVENT_READER_INSERT:
- LOG_INFO("VEVENT_READER_INSERT");
- {
- AutoRef<ReaderAddEvent> event(new ReaderAddEvent(this, vevent));
- push_sync_event(vevent->type, *event);
- }
- break;
- case VEVENT_READER_REMOVE:
- LOG_INFO("VEVENT_READER_REMOVE");
- {
- AutoRef<ReaderRemoveEvent> event(new ReaderRemoveEvent(this, vevent));
- push_sync_event(vevent->type, *event);
- }
- break;
- case VEVENT_CARD_INSERT:
- LOG_INFO("VEVENT_CARD_INSERT");
- {
- AutoRef<CardInsertEvent> event(new CardInsertEvent(this, vevent));
- push_sync_event(vevent->type, *event);
- }
- break;
- case VEVENT_CARD_REMOVE:
- LOG_INFO("VEVENT_CARD_REMOVE");
- {
- AutoRef<CardRemoveEvent> event(new CardRemoveEvent(this, vevent));
- push_sync_event(vevent->type, *event);
- }
- break;
- case VEVENT_LAST:
- cont = false;
- default:
- /* anything except VEVENT_LAST and default
- * gets to VEventEvent which does vevent_delete in VEventEvent~ */
- vevent_delete(vevent);
- }
- }
-}
-
-void virtual_card_insert()
-{
- if (g_smartcard_channel == NULL) {
- return;
- }
- g_smartcard_channel->virtual_card_insert();
-}
-
-void SmartCardChannel::virtual_card_insert()
-{
- if (_readers_by_id.size() == 0) {
- return;
- }
- vcard_emul_force_card_insert(_readers_by_id.begin()->second->vreader);
-}
-
-void virtual_card_remove()
-{
- if (g_smartcard_channel == NULL) {
- return;
- }
- g_smartcard_channel->virtual_card_remove();
-}
-
-void SmartCardChannel::virtual_card_remove()
-{
- if (_readers_by_id.size() == 0) {
- return;
- }
- vcard_emul_force_card_remove(_readers_by_id.begin()->second->vreader);
-}
-
-#define CERTIFICATES_DEFAULT_DB "/etc/pki/nssdb"
-#define CERTIFICATES_ARGS_TEMPLATE "db=\"%s\" use_hw=no soft=(,Virtual Card,CAC,,%s,%s,%s)"
-
-SmartcardOptions::SmartcardOptions() :
-dbname(CERTIFICATES_DEFAULT_DB),
-enable(false)
-{
-}
-
-static VCardEmulError init_vcard_local_certs(const char* dbname, const char* cert1,
- const char* cert2, const char* cert3)
-{
- char emul_args[200];
- VCardEmulOptions *options = NULL;
-
- snprintf(emul_args, sizeof(emul_args) - 1, CERTIFICATES_ARGS_TEMPLATE,
- dbname, cert1, cert2, cert3);
- options = vcard_emul_options(emul_args);
- if (options == NULL) {
- LOG_WARN("not using certificates due to initialization error");
- }
- return vcard_emul_init(options);
-}
-
-static bool g_vcard_inited = false;
-
-void smartcard_init(const SmartcardOptions* options)
-{
- if (g_vcard_inited) {
- return;
- }
- if (options->certs.size() == 3) {
- const char* dbname = options->dbname.c_str();
- if (init_vcard_local_certs(dbname, options->certs[0].c_str(),
- options->certs[1].c_str(), options->certs[2].c_str()) != VCARD_EMUL_OK) {
- throw Exception("smartcard: emulated card initialization failed (check certs/db)");
- }
- } else {
- if (options->certs.size() > 0) {
- LOG_WARN("Ignoring smartcard certificates - must be exactly three for virtual card emulation");
- }
- if (vcard_emul_init(NULL) != VCARD_EMUL_OK) {
- throw Exception("smartcard: vcard initialization failed (check hardware/drivers)");
- }
- }
- g_vcard_inited = true;
-}
-
-void SmartCardChannel::on_connect()
-{
- _event_thread = new Thread(SmartCardChannel::cac_card_events_thread_entry, this);
-}
-
-void SmartCardChannel::on_disconnect()
-{
- VEvent *stop_event;
-
- if (_event_thread == NULL) {
- return;
- }
- stop_event = vevent_new(VEVENT_LAST, NULL, NULL);
- vevent_queue_vevent(stop_event);
- _event_thread->join();
- delete _event_thread;
- _event_thread = NULL;
-}
-
-
-void SmartCardChannel::send_reader_removed(uint32_t reader_id)
-{
- send_message(reader_id, VSC_ReaderRemove, NULL, 0);
-}
-
-void SmartCardChannel::send_reader_added(const char* reader_name)
-{
- send_message(VSCARD_UNDEFINED_READER_ID,
- VSC_ReaderAdd, (uint8_t*)reader_name, strlen(reader_name));
-}
-
-void SmartCardChannel::send_atr(VReader* vreader)
-{
- unsigned char atr[ MAX_ATR_LEN];
- int atr_len = MAX_ATR_LEN;
- uint32_t reader_id = reader_data_from_vreader(vreader)->reader_id;
-
- assert(reader_id != VSCARD_UNDEFINED_READER_ID);
- vreader_power_on(vreader, atr, &atr_len);
- DBG(0, "ATR: ");
- DEBUG_PRINT_BYTE_ARRAY(atr, atr_len);
- send_message(reader_id, VSC_ATR, (uint8_t*)atr, atr_len);
-}
-
-void SmartCardChannel::send_message(uint32_t reader_id, VSCMsgType type, uint8_t* data, uint32_t len)
-{
- VSCMsgHeader mhHeader;
- Message* msg = new Message(SPICE_MSGC_SMARTCARD_DATA);
- SpiceMarshaller* m = msg->marshaller();
-
- mhHeader.type = type;
- mhHeader.length = len;
- mhHeader.reader_id = reader_id;
- spice_marshaller_add(m, (uint8_t*)&mhHeader, sizeof(mhHeader));
- spice_marshaller_add(m, data, len);
- post_message(msg);
-}
-
-VSCMessageEvent::VSCMessageEvent(SmartCardChannel* smartcard_channel,
- VSCMsgHeader* vheader)
- : _smartcard_channel(smartcard_channel)
- , _vheader(NULL)
-{
- _vheader = (VSCMsgHeader*)spice_memdup(vheader,
- sizeof(VSCMsgHeader) + vheader->length);
- ASSERT(_vheader);
-}
-
-VSCMessageEvent::~VSCMessageEvent()
-{
- free(_vheader);
-}
-
-void VSCMessageEvent::response(AbstractProcessLoop& loop)
-{
- static int recv_count = 0;
- int dwSendLength;
- int dwRecvLength;
- uint8_t* pbSendBuffer = _vheader->data;
- uint8_t pbRecvBuffer[APDUBufSize+sizeof(uint32_t)];
- VReaderStatus reader_status;
- uint32_t rv;
-
- switch (_vheader->type) {
- case VSC_APDU:
- break;
- case VSC_Error:
- _smartcard_channel->handle_error_message(
- _vheader,
- (VSCMsgError*)_vheader->data);
- return;
- case VSC_Init:
- break;
- default:
- LOG_WARN("unhandled VSC %d of length %d, reader %d",
- _vheader->type, _vheader->length, _vheader->reader_id);
- return;
- }
-
- /* Transmit recieved APDU */
- dwSendLength = _vheader->length;
- dwRecvLength = sizeof(pbRecvBuffer);
-
- DBG(0, " %3d: recv APDU: ", recv_count++);
- DEBUG_PRINT_BYTE_ARRAY(pbSendBuffer, _vheader->length);
-
- ReaderData* reader_data = _smartcard_channel->reader_data_from_reader_id(
- _vheader->reader_id);
- if (reader_data == NULL) {
- LOG_WARN("got message for non existant reader");
- return;
- }
-
- VReader* vreader = reader_data->vreader;
-
- reader_status = vreader_xfr_bytes(vreader,
- pbSendBuffer, dwSendLength,
- pbRecvBuffer, &dwRecvLength);
- if (reader_status == VREADER_OK) {
- DBG(0, " sent APDU: ");
- DEBUG_PRINT_BYTE_ARRAY(pbRecvBuffer, dwRecvLength);
- _smartcard_channel->send_message (
- _vheader->reader_id,
- VSC_APDU,
- pbRecvBuffer,
- dwRecvLength
- );
- } else {
- rv = reader_status; /* warning: not meaningful */
- _smartcard_channel->send_message (
- _vheader->reader_id,
- VSC_Error,
- (uint8_t*)&rv,
- sizeof (uint32_t)
- );
- }
-}
-
-void SmartCardChannel::handle_smartcard_data(RedPeer::InMessage* message)
-{
- VSCMsgHeader* mhHeader = (VSCMsgHeader*)(message->data());
-
- AutoRef<VSCMessageEvent> event(new VSCMessageEvent(this, mhHeader));
- get_client().push_event(*event);
-}
-
-class SmartCardFactory: public ChannelFactory {
-public:
- SmartCardFactory() : ChannelFactory(SPICE_CHANNEL_SMARTCARD) {}
- virtual RedChannel* construct(RedClient& client, uint32_t id)
- {
- return new SmartCardChannel(client, id);
- }
-};
-
-static SmartCardFactory factory;
-
-ChannelFactory& SmartCardChannel::Factory()
-{
- return factory;
-}
diff --git a/client/smartcard_channel.h b/client/smartcard_channel.h
deleted file mode 100644
index 0423bff0..00000000
--- a/client/smartcard_channel.h
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- Copyright (C) 2010 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifndef __SMART_CARD_H__
-#define __SMART_CARD_H__
-
-#include <map>
-
-#include <vreadert.h>
-#include <vscard_common.h>
-#include <eventt.h>
-
-#include "red_channel.h"
-#include "red_peer.h"
-
-class Application;
-
-struct SmartcardOptions {
- std::vector<std::string> certs;
- std::string dbname;
- bool enable;
- SmartcardOptions();
-};
-
-void smartcard_init(const SmartcardOptions* options);
-
-struct ReaderData {
- ReaderData() :
- vreader(NULL),
- reader_id(VSCARD_UNDEFINED_READER_ID),
- name(NULL),
- card_insert_pending(false)
- {}
- VReader *vreader;
- uint32_t reader_id;
- char* name;
- bool card_insert_pending;
-};
-
-void virtual_card_remove();
-void virtual_card_insert();
-
-class SmartCardChannel;
-
-class VEventEvent : public Event {
-public:
- VEventEvent(SmartCardChannel* smartcard_channel, VEvent* vevent);
- ~VEventEvent();
- SmartCardChannel* _smartcard_channel;
- VReader* _vreader;
- VEvent* _vevent;
-};
-
-class ReaderAddEvent: public VEventEvent {
-public:
- ReaderAddEvent(SmartCardChannel* smartcard_channel, VEvent* vevent)
- : VEventEvent(smartcard_channel, vevent) {}
- virtual void response(AbstractProcessLoop& events_loop);
-};
-
-class ReaderRemoveEvent: public VEventEvent {
-public:
- ReaderRemoveEvent(SmartCardChannel* smartcard_channel, VEvent* vevent)
- : VEventEvent(smartcard_channel, vevent) {}
- virtual void response(AbstractProcessLoop& events_loop);
-};
-
-class CardInsertEvent: public VEventEvent {
-public:
- CardInsertEvent(SmartCardChannel* smartcard_channel, VEvent* vevent)
- : VEventEvent(smartcard_channel, vevent) {}
- virtual void response(AbstractProcessLoop& events_loop);
-};
-
-class CardRemoveEvent: public VEventEvent {
-public:
- CardRemoveEvent(SmartCardChannel* smartcard_channel, VEvent* vevent)
- : VEventEvent(smartcard_channel, vevent) {}
- virtual void response(AbstractProcessLoop& events_loop);
-};
-
-class VSCMessageEvent: public Event {
-public:
- VSCMessageEvent(SmartCardChannel* smartcard_channel,
- VSCMsgHeader* vheader);
- ~VSCMessageEvent();
- SmartCardChannel* _smartcard_channel;
- VSCMsgHeader* _vheader;
- virtual void response(AbstractProcessLoop& events_loop);
-};
-
-typedef std::pair<VEventType, Event*> SmartCardEvent;
-
-class SmartCardChannel : public RedChannel {
-
-public:
- SmartCardChannel(RedClient& client, uint32_t id);
- void handle_smartcard_data(RedPeer::InMessage* message);
-
- void virtual_card_remove();
- void virtual_card_insert();
- static ChannelFactory& Factory();
-protected:
- virtual void on_connect();
- virtual void on_disconnect();
-
-private:
- static void* cac_card_events_thread_entry(void* data);
- void cac_card_events_thread_main();
- void send_message(uint32_t reader_id, VSCMsgType type, uint8_t* data, uint32_t len);
-
- Thread* _event_thread;
-
- Application* _app;
-
- VReaderList *_reader_list;
- typedef std::map<uint32_t, ReaderData*> readers_by_id_t;
- readers_by_id_t _readers_by_id;
- typedef std::map<VReader*, ReaderData*> readers_by_vreader_t;
- readers_by_vreader_t _readers_by_vreader;
- readers_by_vreader_t _unallocated_readers_by_vreader;
- VEventType _next_sync_vevent;
- std::list<SmartCardEvent> _sync_events;
-
- void push_sync_event(VEventType type, Event *event);
- void send_next_sync_event();
- void handle_reader_add_response(VSCMsgHeader *vheader, VSCMsgError *error);
- void handle_error_message(VSCMsgHeader *vheader, VSCMsgError *error);
-
- ReaderData* reader_data_from_vreader(VReader* vreader);
- ReaderData* reader_data_from_reader_id(uint32_t reader_id);
- void add_unallocated_reader(VReader* vreader, const char* name);
- ReaderData* add_reader(uint32_t reader_id);
- void remove_reader(ReaderData* data);
- void send_reader_added(const char* reader_name);
- void send_reader_removed(uint32_t reader_id);
- void send_atr(VReader* vreader);
-
- friend class ReaderAddEvent;
- friend class ReaderRemoveEvent;
- friend class CardInsertEvent;
- friend class CardRemoveEvent;
- friend class VSCMessageEvent;
-};
-
-#endif // __SMART_CARD_H__
diff --git a/client/tests/.gitignore b/client/tests/.gitignore
deleted file mode 100644
index 50954976..00000000
--- a/client/tests/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-controller_test/spice_controller
diff --git a/client/tests/controller_test/README.txt b/client/tests/controller_test/README.txt
deleted file mode 100644
index aa2536a7..00000000
--- a/client/tests/controller_test/README.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-To run the test:
-
-terminal 1:
-export SPICE_XPI_SOCKET=/tmp/SpiceController-0.uds
-spicec --controller
-
-terminal 2:
-./spice_controller <hostname> <port number>
-
-repeated enters to go between checks.
diff --git a/client/tests/controller_test/build b/client/tests/controller_test/build
deleted file mode 100755
index 995372f9..00000000
--- a/client/tests/controller_test/build
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/bash
-
-g++ -I ../../../../spice-protocol/ -o spice_controller controller_test.cpp
-
diff --git a/client/tests/controller_test/controller_test.cpp b/client/tests/controller_test/controller_test.cpp
deleted file mode 100644
index 82b3166f..00000000
--- a/client/tests/controller_test/controller_test.cpp
+++ /dev/null
@@ -1,206 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-#include <spice/controller_prot.h>
-
-#ifdef WIN32
-
-#include <windows.h>
-
-#define PIPE_NAME TEXT("\\\\.\\pipe\\SpiceController-%lu")
-
-static HANDLE pipe = INVALID_HANDLE_VALUE;
-
-#else
-
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <sys/un.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <errno.h>
-
-typedef void *LPVOID;
-typedef const void *LPCVOID;
-typedef unsigned long DWORD;
-typedef char TCHAR;
-
-#define PIPE_NAME "/tmp/SpiceController-%lu.uds"
-
-static int sock = -1;
-
-#endif
-
-#define PIPE_NAME_MAX_LEN 256
-
-void write_to_pipe(LPCVOID data, DWORD size)
-{
-#ifdef WIN32
- DWORD written;
- if (!WriteFile(pipe, data, size, &written, NULL) || written != size) {
- printf("Write to pipe failed %u\n", GetLastError());
- }
-#else
- if (send(sock, data, size, 0) != size) {
- printf("send failed, (%d) %s\n", errno, strerror(errno));
- }
-#endif
-}
-
-void send_init()
-{
- ControllerInit msg = {{CONTROLLER_MAGIC, CONTROLLER_VERSION, sizeof(msg)}, 0,
- CONTROLLER_FLAG_EXCLUSIVE};
- write_to_pipe((LPCVOID)&msg, sizeof(msg));
-}
-
-void send_msg(uint32_t id)
-{
- ControllerMsg msg = {id, sizeof(msg)};
- write_to_pipe((LPCVOID)&msg, sizeof(msg));
-}
-
-void send_value(uint32_t id, uint32_t value)
-{
- ControllerValue msg = {{id, sizeof(msg)}, value};
- write_to_pipe((LPCVOID)&msg, sizeof(msg));
-}
-
-void send_data(uint32_t id, uint8_t* data, size_t data_size)
-{
- size_t size = sizeof(ControllerData) + data_size;
- ControllerData* msg = (ControllerData*)malloc(size);
- msg->base.id = id;
- msg->base.size = (uint32_t)size;
- memcpy(msg->data, data, data_size);
- write_to_pipe((LPCVOID)msg, (DWORD)size);
- free(msg);
-}
-
-DWORD read_from_pipe(LPVOID data, DWORD size)
-{
- DWORD read;
-#ifdef WIN32
- if (!ReadFile(pipe, data, size, &read, NULL)) {
- printf("Read from pipe failed %u\n", GetLastError());
- }
-#else
- if (read = recv(sock, data, size, 0) && (read == -1 || read == 0)) {
- printf("recv failed, (%d) %s\n", errno, strerror(errno));
- }
-#endif
- return read;
-}
-
-#define HOST "localhost"
-#define PORT 5931
-#define SPORT 0
-#define PWD ""
-#define SECURE_CHANNELS "main,inputs,playback"
-#define DISABLED_CHANNELS "playback,record"
-#define TITLE "Hello from controller"
-#define HOTKEYS "toggle-fullscreen=shift+f1,release-cursor=shift+f2"
-#define MENU "0\r4864\rS&end Ctrl+Alt+Del\tCtrl+Alt+End\r0\r\n" \
- "0\r5120\r&Toggle full screen\tShift+F11\r0\r\n" \
- "0\r1\r&Special keys\r4\r\n" \
- "1\r5376\r&Send Shift+F11\r0\r\n" \
- "1\r5632\r&Send Shift+F12\r0\r\n" \
- "1\r5888\r&Send Ctrl+Alt+End\r0\r\n" \
- "0\r1\r-\r1\r\n" \
- "0\r2\rChange CD\r4\r\n" \
- "2\r3\rNo CDs\r0\r\n" \
- "2\r4\r[Eject]\r0\r\n" \
- "0\r5\r-\r1\r\n" \
- "0\r6\rPlay\r0\r\n" \
- "0\r7\rSuspend\r0\r\n" \
- "0\r8\rStop\r0\r\n"
-
-#define TLS_CIPHERS "NONE"
-#define CA_FILE "NONE"
-#define HOST_SUBJECT "NONE"
-
-int main(int argc, char *argv[])
-{
- int spicec_pid = (argc > 3 ? atoi(argv[3]) : 0);
- char* host = (argc > 1 ? argv[1] : (char*)HOST);
- int port = (argc > 2 ? atoi(argv[2]) : PORT);
- TCHAR pipe_name[PIPE_NAME_MAX_LEN];
- ControllerValue msg;
- DWORD read;
-
-#ifdef WIN32
- _snwprintf_s(pipe_name, PIPE_NAME_MAX_LEN, PIPE_NAME_MAX_LEN, PIPE_NAME, spicec_pid);
- printf("Creating Spice controller connection %S\n", pipe_name);
- pipe = CreateFile(pipe_name, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
- if (pipe == INVALID_HANDLE_VALUE) {
- printf("Could not open pipe %u\n", GetLastError());
- return -1;
- }
-#else
- snprintf(pipe_name, PIPE_NAME_MAX_LEN, PIPE_NAME, spicec_pid);
- printf("Creating a controller connection %s\n", pipe_name);
- struct sockaddr_un remote;
- if ((sock = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
- printf("Could not open socket, (%d) %s\n", errno, strerror(errno));
- return -1;
- }
- remote.sun_family = AF_UNIX;
- strcpy(remote.sun_path, pipe_name);
- if (connect(sock, (struct sockaddr *)&remote,
- strlen(remote.sun_path) + sizeof(remote.sun_family)) == -1) {
- printf("Socket connect failed, (%d) %s\n", errno, strerror(errno));
- close(sock);
- return -1;
- }
-#endif
- send_init();
- printf("Setting Spice parameters\n");
- send_data(CONTROLLER_HOST, (uint8_t*)host, strlen(host) + 1);
- send_value(CONTROLLER_PORT, port);
- send_value(CONTROLLER_SPORT, SPORT);
- send_data(CONTROLLER_PASSWORD, (uint8_t*)PWD, sizeof(PWD));
- //send_data(CONTROLLER_SECURE_CHANNELS, (uint8_t*)SECURE_CHANNELS, sizeof(SECURE_CHANNELS));
- send_data(CONTROLLER_DISABLE_CHANNELS, (uint8_t*)DISABLED_CHANNELS, sizeof(DISABLED_CHANNELS));
- //send_data(CONTROLLER_TLS_CIPHERS, (uint8_t*)TLS_CIPHERS, sizeof(TLS_CIPHERS));
- //send_data(CONTROLLER_CA_FILE, (uint8_t*)CA_FILE, sizeof(CA_FILE));
- //send_data(CONTROLLER_HOST_SUBJECT, (uint8_t*)HOST_SUBJECT, sizeof(HOST_SUBJECT));
- send_data(CONTROLLER_SET_TITLE, (uint8_t*)TITLE, sizeof(TITLE));
- send_data(CONTROLLER_HOTKEYS, (uint8_t*)HOTKEYS, sizeof(HOTKEYS));
-
- send_data(CONTROLLER_CREATE_MENU, (uint8_t*)MENU, sizeof(MENU));
-
- printf("Smartcard...\n");
- getchar();
- send_value(CONTROLLER_ENABLE_SMARTCARD, 1);
-
- send_value(CONTROLLER_FULL_SCREEN, /*CONTROLLER_SET_FULL_SCREEN |*/ CONTROLLER_AUTO_DISPLAY_RES);
- printf("Show...\n");
- getchar();
- send_msg(CONTROLLER_SHOW);
-
- printf("Connect...\n");
- getchar();
- send_msg(CONTROLLER_CONNECT);
-
- printf("Hide...\n");
- getchar();
- send_msg(CONTROLLER_HIDE);
-
- printf("Show...\n");
- getchar();
- send_msg(CONTROLLER_SHOW);
-
- //send_msg(CONTROLLER_DELETE_MENU);
- //send_msg(CONTROLLER_HIDE);
- while ((read = read_from_pipe(&msg, sizeof(msg))) == sizeof(msg)) {
- printf("Received id %u, size %u, value %u\n", msg.base.id, msg.base.size, msg.value);
- }
- printf("Press <Enter> to close connection\n");
- getchar();
-#ifdef WIN32
- CloseHandle(pipe);
-#else
- close(sock);
-#endif
- return 0;
-}
diff --git a/client/tests/controller_test/controller_test.sln b/client/tests/controller_test/controller_test.sln
deleted file mode 100644
index f2747572..00000000
--- a/client/tests/controller_test/controller_test.sln
+++ /dev/null
@@ -1,20 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 10.00
-# Visual Studio 2008
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "controller_test", "controller_test.vcproj", "{6DFCEAF5-D081-46F0-AE15-42C5D3240CFD}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Win32 = Debug|Win32
- Release|Win32 = Release|Win32
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {6DFCEAF5-D081-46F0-AE15-42C5D3240CFD}.Debug|Win32.ActiveCfg = Debug|Win32
- {6DFCEAF5-D081-46F0-AE15-42C5D3240CFD}.Debug|Win32.Build.0 = Debug|Win32
- {6DFCEAF5-D081-46F0-AE15-42C5D3240CFD}.Release|Win32.ActiveCfg = Release|Win32
- {6DFCEAF5-D081-46F0-AE15-42C5D3240CFD}.Release|Win32.Build.0 = Release|Win32
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
diff --git a/client/tests/controller_test/controller_test.vcproj b/client/tests/controller_test/controller_test.vcproj
deleted file mode 100644
index a71fa5ab..00000000
--- a/client/tests/controller_test/controller_test.vcproj
+++ /dev/null
@@ -1,198 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="controller_test"
- ProjectGUID="{6DFCEAF5-D081-46F0-AE15-42C5D3240CFD}"
- RootNamespace="controller_test"
- Keyword="Win32Proj"
- TargetFrameworkVersion="131072"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(SolutionDir)$(ConfigurationName)"
- IntermediateDirectory="$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="..\..\windows;..\..\..\..\spice-protocol"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="1"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="false"
- DebugInformationFormat="4"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="2"
- GenerateDebugInformation="true"
- SubSystem="1"
- RandomizedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(SolutionDir)$(ConfigurationName)"
- IntermediateDirectory="$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="..\..\windows;..\..\..\..\spice-protocol"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="false"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="1"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- RandomizedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath=".\controller_test.cpp"
- >
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
- >
- </Filter>
- <Filter
- Name="Resource Files"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
- >
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/client/threads.cpp b/client/threads.cpp
deleted file mode 100644
index e255beed..00000000
--- a/client/threads.cpp
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-#include "threads.h"
-#include "utils.h"
-#include "debug.h"
-#ifdef WIN32
-#include <sys/timeb.h>
-#endif
-#ifdef HAVE_SYS_TIME_H
-#include <sys/time.h>
-#endif
-#ifdef __MINGW32__
-//workaround for what I think is a mingw bug: it has a prototype for
-//_ftime_s in its headers, but no symbol for it at link time.
-//The #define from common.h cannot be used since it breaks other mingw
-//headers if any are included after the #define.
-#define _ftime_s _ftime
-#endif
-
-Thread::Thread(thread_main_t thread_main, void* opaque)
-{
- int r = pthread_create(&_thread, NULL, thread_main, opaque);
- if (r) {
- THROW("failed %d", r);
- }
-}
-
-void Thread::join()
-{
- pthread_join(_thread, NULL);
-}
-
-static inline void rel_time(struct timespec& time, uint64_t delta_nano)
-{
-#ifdef WIN32
- struct _timeb now;
- _ftime_s(&now);
- time.tv_sec = (long)now.time;
- time.tv_nsec = now.millitm * 1000 * 1000;
-#elif defined(HAVE_CLOCK_GETTIME)
- clock_gettime(CLOCK_MONOTONIC, &time);
-#else
- struct timeval tv;
- gettimeofday(&tv,NULL);
- time.tv_sec = tv.tv_sec;
- time.tv_nsec = tv.tv_usec*1000;
-#endif
- delta_nano += (uint64_t)time.tv_sec * 1000 * 1000 * 1000;
- delta_nano += time.tv_nsec;
- time.tv_sec = long(delta_nano / (1000 * 1000 * 1000));
- time.tv_nsec = long(delta_nano % (1000 * 1000 * 1000));
-}
-
-void Lock::timed_lock(uint64_t timout_nano)
-{
- struct timespec time;
- int r;
-
- rel_time(time, timout_nano);
- if ((r = pthread_mutex_timedlock(_mutex.get(), &time))) {
- _locked = false;
- if (r != ETIMEDOUT) {
- THROW("failed %d", r);
- }
- return;
- }
- _locked = true;
-}
-
-Condition::Condition()
-{
-#ifdef WIN32
- pthread_cond_init(&_condition, NULL);
-#else
- pthread_condattr_t attr;
- pthread_condattr_init(&attr);
- int r;
- if ((r = pthread_condattr_setclock(&attr, CLOCK_MONOTONIC))) {
- THROW("set clock failed %d", r);
- }
- pthread_cond_init(&_condition, &attr);
- pthread_condattr_destroy(&attr);
-#endif
-}
-
-bool Condition::timed_wait(Lock& lock, uint64_t nano)
-{
- struct timespec time;
- rel_time(time, nano);
- int r = pthread_cond_timedwait(&_condition, lock.get(), &time);
- if (r) {
- if (r != ETIMEDOUT) {
- THROW("failed %d", r);
- }
- return false;
- }
- return true;
-}
-
-Mutex::Mutex(Type type)
-{
- pthread_mutexattr_t attr;
-
- pthread_mutexattr_init(&attr);
- if (type == NORMAL) {
- pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_NORMAL);
- } else if (type == RECURSIVE) {
- pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
- } else {
- THROW("invalid type %d", type);
- }
-
- int r;
- if ((r = pthread_mutex_init(&_mutex, &attr))) {
- THROW("int failed %d", r);
- }
- pthread_mutexattr_destroy(&attr);
-}
-
-Mutex::~Mutex()
-{
- pthread_mutex_destroy(&_mutex);
-}
diff --git a/client/threads.h b/client/threads.h
deleted file mode 100644
index 5bfd38b0..00000000
--- a/client/threads.h
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_THREADS
-#define _H_THREADS
-
-#include "pthread.h"
-#include "atomic_count.h"
-
-class Thread {
-public:
- typedef void* (*thread_main_t)(void*);
-
- Thread(thread_main_t thread_main, void* opaque);
- void join();
-
-private:
- pthread_t _thread;
-};
-
-class Mutex {
-public:
- enum Type {
- NORMAL,
- RECURSIVE,
- };
-
- Mutex(Type = NORMAL);
- virtual ~Mutex();
-
-private:
- friend class Lock;
- pthread_mutex_t* get() {return &_mutex;}
-
-private:
- pthread_mutex_t _mutex;
-};
-
-class Lock {
-public:
- Lock(Mutex& mutex)
- : _locked (true)
- , _mutex (mutex)
- {
- pthread_mutex_lock(_mutex.get());
- }
-
- Lock(Mutex& mutex, uint64_t timout_nano)
- : _mutex (mutex)
- {
- if (!pthread_mutex_trylock(_mutex.get())) {
- _locked = true;
- return;
- }
- timed_lock(timout_nano);
- }
-
- ~Lock()
- {
- unlock();
- }
-
- void unlock()
- {
- if (_locked) {
- pthread_mutex_unlock(_mutex.get());
- _locked = false;
- }
- }
-
- bool is_locked() { return _locked;}
-
-private:
- friend class Condition;
- pthread_mutex_t* get() {return _mutex.get();}
- void timed_lock(uint64_t timout_nano);
-
-private:
- bool _locked;
- Mutex& _mutex;
-};
-
-class RecurciveMutex: public Mutex {
-public:
- RecurciveMutex() : Mutex(Mutex::RECURSIVE) {}
-};
-
-typedef Lock RecurciveLock;
-class Condition {
-public:
- Condition();
-
- ~Condition()
- {
- pthread_cond_destroy(&_condition);
- }
-
- void notify_one()
- {
- pthread_cond_signal(&_condition);
- }
-
- void notify_all()
- {
- pthread_cond_broadcast(&_condition);
- }
-
- void wait(Lock& lock)
- {
- pthread_cond_wait(&_condition, lock.get());
- }
-
- bool timed_wait(Lock& lock, uint64_t nano);
-
-private:
- pthread_cond_t _condition;
-};
-
-
-#endif
diff --git a/client/utils.h b/client/utils.h
deleted file mode 100644
index d8d69626..00000000
--- a/client/utils.h
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_UTILS
-#define _H_UTILS
-
-#include "common.h"
-#include "common/log.h"
-#include <spice/error_codes.h>
-#include <spice/macros.h>
-
-class Exception: public std::exception {
-public:
- Exception(const std::string& str, int error_code) : _mess (str), _erro_code (error_code) {}
- Exception(const std::string& str) : _mess (str) { _erro_code = SPICEC_ERROR_CODE_ERROR;}
- virtual ~Exception() throw () {}
- virtual const char* what() const throw () {return _mess.c_str();}
- int get_error_code() {return _erro_code;}
-
-private:
- std::string _mess;
- int _erro_code;
-};
-
-#define THROW(format, ...) { \
- std::string exption_string; \
- string_printf(exption_string, format, ## __VA_ARGS__ ); \
- spice_warning(format, ## __VA_ARGS__ ); \
- throw Exception(exption_string); \
-}
-
-#define THROW_ERR(err, format, ...) { \
- std::string exption_string; \
- string_printf(exption_string, format, ## __VA_ARGS__ ); \
- spice_warning(format, ## __VA_ARGS__ ); \
- throw Exception(exption_string, err); \
-}
-
-#define SPICE_BREAKPOINT() do{ \
- __asm__ __volatile__ ("int $03"); \
-}while(0)
-
-template <class T>
-class AutoRef {
-public:
- AutoRef() : _obj (NULL) {}
- AutoRef(T* obj) : _obj (obj) {}
- ~AutoRef() { if (_obj) _obj->unref();}
- T* operator * () {return _obj;}
-
- void reset(T* obj)
- {
- if (_obj) {
- _obj->unref();
- }
- _obj = obj;
- }
-
- T* release()
- {
- T* ret = _obj;
- _obj = NULL;
- return ret;
- }
-
-private:
- T* _obj;
-};
-
-static inline int test_bit(const void* addr, int bit)
-{
- return !!(((uint32_t*)addr)[bit >> 5] & (1 << (bit & 0x1f)));
-}
-
-static inline int test_bit_be(const void* addr, int bit)
-{
- return !!(((uint8_t*)addr)[bit >> 3] & (0x80 >> (bit & 0x07)));
-}
-
-static inline void set_bit(const void* addr, int bit)
-{
- ((uint8_t*)addr)[bit >> 5] |= (0x1 << (bit & 0x1f));
-}
-
-static inline void set_bit_be(const void* addr, int bit)
-{
- ((uint8_t*)addr)[bit >> 3] |= (0x80 >> (bit & 0x07));
-}
-
-int str_to_port(const char *str);
-
-void string_vprintf(std::string& str, const char* format, va_list ap);
-SPICE_GNUC_PRINTF(2, 3) void string_printf(std::string& str, const char *format, ...);
-
-template<class T>
-class FreeObject {
-public:
- void operator () (T p) { delete p;}
-};
-
-template<class T, class FreeRes = FreeObject<T> >
-class _AutoRes {
-public:
- _AutoRes() : _res (NULL) {}
- _AutoRes(T* res) : _res (res) {}
- ~_AutoRes() { set(NULL); }
-
- void set(T* res) {if (_res) _free_res(_res); _res = res; }
- T* get() {return _res;}
- T* operator -> () { return _res;}
- T* release() {T* tmp = _res; _res = NULL; return tmp; }
- bool valid() { return !!_res; }
-
-private:
- _AutoRes(const _AutoRes&);
- _AutoRes& operator = (const _AutoRes&);
-
-private:
- T* _res;
- FreeRes _free_res;
-};
-
-template<class T>
-class AutoArray {
-public:
- AutoArray() : _array (NULL) {}
- AutoArray(T* array) : _array (array) {}
- ~AutoArray() { delete[] _array;}
-
- void set(T* array) { delete[] _array; _array = array;}
- T* get() {return _array;}
- T* release() {T* tmp = _array; _array = NULL; return tmp; }
- T& operator [] (int i) {return _array[i];}
-
-private:
- T* _array;
-};
-
-class EmptyBase {
-};
-
-#endif
diff --git a/client/windows/event_sources_p.cpp b/client/windows/event_sources_p.cpp
deleted file mode 100644
index bbf48d9a..00000000
--- a/client/windows/event_sources_p.cpp
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-#include "event_sources.h"
-#include "debug.h"
-#include "utils.h"
-
-bool EventSources_p::process_system_events()
-{
- MSG msg;
- while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
-
- if (msg.message == WM_QUIT) {
- return true;
- }
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- return false;
-}
-
-void EventSources_p::add_event(HANDLE event, EventSource* source)
-{
- int size = _events.size();
- _events.resize(size + 1);
- _handles.resize(size + 1);
- _events[size] = source;
- _handles[size] = event;
-}
-
-void EventSources_p::remove_event(EventSource* source)
-{
- int size = _events.size();
- for (int i = 0; i < size; i++) {
- if (_events[i] == source) {
- for (i++; i < size; i++) {
- _events[i - 1] = _events[i];
- _handles[i - 1] = _handles[i];
- }
- _events.resize(size - 1);
- _handles.resize(size - 1);
- return;
- }
- }
- THROW("event not found");
-}
-
-EventSources::EventSources()
-{
-}
-
-EventSources::~EventSources()
-{
-}
-
-bool EventSources::wait_events(int timeout_ms)
-{
- if (_handles.empty()) {
- if (WaitMessage()) {
- return process_system_events();
- } else {
- THROW("wait failed %d", GetLastError());
- }
- }
-
- DWORD wait_res = MsgWaitForMultipleObjectsEx(_handles.size(), &_handles[0], timeout_ms,
- QS_ALLINPUT, 0);
- if (wait_res == WAIT_TIMEOUT) {
- return false;
- }
-
- if (wait_res == WAIT_FAILED) {
- THROW("wait failed %d", GetLastError());
- }
-
- size_t event_index = wait_res - WAIT_OBJECT_0;
- if (event_index == _handles.size()) {
- return process_system_events();
- } else if ((event_index >= 0) && (event_index < _handles.size())) {
- _events[event_index]->action();
- return false;
- } else {
- THROW("invalid event id");
- }
-}
-
-void EventSources::add_socket(Socket& socket)
-{
- HANDLE event = CreateEvent(NULL, FALSE, FALSE, NULL);
- if (!event) {
- THROW("create event failed");
- }
- if (WSAEventSelect(socket.get_socket(), event,
- FD_READ | FD_WRITE | FD_CLOSE) == SOCKET_ERROR) {
- CloseHandle(event);
- THROW("event select failed");
- }
- add_event(event, &socket);
-}
-
-void EventSources::remove_socket(Socket& socket)
-{
- int size = _events.size();
- for (int i = 0; i < size; i++) {
- if (_events[i] == &socket) {
- if (WSAEventSelect(socket.get_socket(), NULL, 0) == SOCKET_ERROR) {
- THROW("event select failed");
- }
- u_long arg = 0;
- if (ioctlsocket(socket.get_socket(), FIONBIO, &arg) == SOCKET_ERROR) {
- THROW("set blocking mode failed");
- }
- CloseHandle(_handles[i]);
- for (i++; i < size; i++) {
- _events[i - 1] = _events[i];
- _handles[i - 1] = _handles[i];
- }
- _events.resize(size - 1);
- _handles.resize(size - 1);
- return;
- }
- }
- THROW("socket not found");
-}
-
-void EventSources::add_handle(Handle& handle)
-{
- add_event(handle.get_handle(), &handle);
-}
-
-void EventSources::remove_handle(Handle& handle)
-{
- remove_event(&handle);
-}
-
-Handle_p::Handle_p()
-{
- if (!(_event = CreateEvent(NULL, FALSE, FALSE, NULL))) {
- THROW("create event failed");
- }
-}
-
-Handle_p::~Handle_p()
-{
- CloseHandle(_event);
-}
-
-void EventSources::add_trigger(Trigger& trigger)
-{
- add_event(trigger.get_handle(), &trigger);
-}
-
-void EventSources::remove_trigger(Trigger& trigger)
-{
- remove_event(&trigger);
-}
-
-
-EventSources::Trigger::Trigger()
-{
-}
-
-EventSources::Trigger::~Trigger()
-{
-}
-
-
-void EventSources::Trigger::trigger()
-{
- if (!SetEvent(_event)) {
- THROW("set event failed");
- }
-}
-
-void EventSources::Trigger::reset()
-{
- if (!ResetEvent(_event)) {
- THROW("set event failed");
- }
-}
-
-void EventSources::Trigger::action()
-{
- on_event();
-}
-
-void EventSources::add_file(File& file)
-{
-}
-
-void EventSources::remove_file(File& file)
-{
-}
diff --git a/client/windows/event_sources_p.h b/client/windows/event_sources_p.h
deleted file mode 100644
index 14cc8161..00000000
--- a/client/windows/event_sources_p.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_EVENT_SOURCES_P
-#define _H_EVENT_SOURCES_P
-
-#include "common.h"
-
-#include <vector>
-
-class EventSource;
-class Handle_p;
-
-class EventSources_p {
-protected:
- /* return true if quit should be performed */
- bool process_system_events();
- void add_event(HANDLE event, EventSource* source);
- void remove_event(EventSource* source);
-public:
- std::vector<EventSource*> _events;
- std::vector<HANDLE> _handles;
-};
-
-class Handle_p {
-public:
- Handle_p();
- virtual ~Handle_p();
- HANDLE get_handle() { return _event;}
-protected:
- HANDLE _event;
-};
-
-class Trigger_p: public Handle_p {
-};
-
-#endif
diff --git a/client/windows/generate.bat b/client/windows/generate.bat
deleted file mode 100644
index 27d8487b..00000000
--- a/client/windows/generate.bat
+++ /dev/null
@@ -1,2 +0,0 @@
-python ..\..\spice-common\spice_codegen.py --generate-demarshallers --client --include messages.h ..\..\spice-common\spice.proto ..\generated_demarshallers.c
-python ..\..\spice-common\spice_codegen.py --generate-marshallers -P --include messages.h --include client_marshallers.h --client ..\..\spice-common\spice.proto ..\generated_marshallers.c
diff --git a/client/windows/generate1.bat b/client/windows/generate1.bat
deleted file mode 100644
index 97da9be8..00000000
--- a/client/windows/generate1.bat
+++ /dev/null
@@ -1,2 +0,0 @@
-python ..\..\spice-common\spice_codegen.py --generate-demarshallers --client --include messages.h --prefix 1 --ptrsize 8 ..\..\spice-common\spice1.proto ..\generated_demarshallers1.c
-python ..\..\spice-common\spice_codegen.py --generate-marshallers -P --include messages.h --include client_marshallers.h --client --prefix 1 --ptrsize 8 ..\..\spice-common\spice1.proto ..\generated_marshallers1.c
diff --git a/client/windows/getopt.h b/client/windows/getopt.h
deleted file mode 100644
index df07082a..00000000
--- a/client/windows/getopt.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * getopt.h - cpp wrapper for my_getopt to make it look like getopt.
- * Copyright 1997, 2000, 2001, 2002, Benjamin Sittler
- *
- * Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation
- * files (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy,
- * modify, merge, publish, distribute, sublicense, and/or sell copies
- * of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-#ifndef MY_WRAPPER_GETOPT_H_INCLUDED
-#define MY_WRAPPER_GETOPT_H_INCLUDED
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "my_getopt.h"
-
-#undef getopt
-#define getopt my_getopt
-#undef getopt_long
-#define getopt_long my_getopt_long
-#undef getopt_long_only
-#define getopt_long_only my_getopt_long_only
-#undef _getopt_internal
-#define _getopt_internal _my_getopt_internal
-#undef opterr
-#define opterr my_opterr
-#undef optind
-#define optind my_optind
-#undef optopt
-#define optopt my_optopt
-#undef optarg
-#define optarg my_optarg
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* MY_WRAPPER_GETOPT_H_INCLUDED */
diff --git a/client/windows/main.cpp b/client/windows/main.cpp
deleted file mode 100644
index 7a833055..00000000
--- a/client/windows/main.cpp
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-#include <fstream>
-#include <windows.h>
-extern "C" {
-#include "pthread.h"
-}
-
-#include "application.h"
-#include "debug.h"
-#include "utils.h"
-
-HINSTANCE instance = NULL;
-
-static void init_winsock()
-{
- WSADATA wsaData;
- int res;
-
- if ((res = WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0) {
- THROW("WSAStartup failed %d", res);
- }
-}
-
-#ifdef __MINGW32__
-// XXX: for mingw32 we can do both actually, but it seems easier
-// to just use the autoconf provided PACKAGE_VERSION.
-static void init_version_string()
-{
-}
-#else
-const char* PACKAGE_VERSION = "???";
-static char _version_string[40];
-
-static void init_version_string()
-{
- DWORD handle;
- DWORD verrsion_inf_size = GetFileVersionInfoSizeA(__argv[0], &handle);
- if (verrsion_inf_size == 0) {
- return;
- }
- AutoArray<uint8_t> info_buf (new uint8_t[verrsion_inf_size]);
- if (!GetFileVersionInfoA(__argv[0], handle, verrsion_inf_size, info_buf.get())) {
- return;
- }
- UINT size;
- VS_FIXEDFILEINFO *file_info;
- if (!VerQueryValueA(info_buf.get(), "\\", (VOID**)&file_info, &size) ||
- size < sizeof(VS_FIXEDFILEINFO)) {
- return;
- }
- sprintf(_version_string, "%d.%d.%d.%d",
- (int)(file_info->dwFileVersionMS >> 16),
- (int)(file_info->dwFileVersionMS & 0x0ffff),
- (int)(file_info->dwFileVersionLS >> 16),
- (int)(file_info->dwFileVersionLS & 0x0ffff));
- PACKAGE_VERSION = _version_string;
-}
-#endif
-
-int WINAPI WinMain(HINSTANCE hInstance,
- HINSTANCE hPrevInstance,
- LPSTR lpCmdLine,
- int nCmdShow)
-{
- int exit_val;
-
- instance = hInstance;
-
- try {
- init_version_string();
- pthread_win32_process_attach_np();
- init_winsock();
- exit_val = Application::main(__argc, __argv, PACKAGE_VERSION);
- LOG_INFO("Spice client terminated (exitcode = %d)", exit_val);
- } catch (Exception& e) {
- LOG_ERROR("unhandle exception: %s", e.what());
- exit_val = e.get_error_code();
- } catch (std::exception& e) {
- LOG_ERROR("unhandle exception: %s", e.what());
- exit_val = SPICEC_ERROR_CODE_ERROR;
- } catch (...) {
- LOG_ERROR("unhandled exception");
- exit_val = SPICEC_ERROR_CODE_ERROR;
- }
-
- spice_log_cleanup();
- pthread_win32_process_detach_np();
-
- return exit_val;
-}
diff --git a/client/windows/my_getopt.cpp b/client/windows/my_getopt.cpp
deleted file mode 100644
index 5237b8e8..00000000
--- a/client/windows/my_getopt.cpp
+++ /dev/null
@@ -1,281 +0,0 @@
-/*
- * my_getopt.c - my re-implementation of getopt.
- * Copyright 1997, 2000, 2001, 2002, 2006, Benjamin Sittler
- *
- * Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation
- * files (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy,
- * modify, merge, publish, distribute, sublicense, and/or sell copies
- * of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-#include <sys/types.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include "my_getopt.h"
-
-int my_optind=1, my_opterr=1, my_optopt=0;
-char *my_optarg=0;
-
-/* reset argument parser to start-up values */
-int my_getopt_reset(void)
-{
- my_optind = 1;
- my_opterr = 1;
- my_optopt = 0;
- my_optarg = 0;
- return 0;
-}
-
-/* this is the plain old UNIX getopt, with GNU-style extensions. */
-/* if you're porting some piece of UNIX software, this is all you need. */
-/* this supports GNU-style permution and optional arguments */
-
-int my_getopt(int argc, char * argv[], const char *opts)
-{
- static int charind=0;
- char mode, colon_mode;
- int off = 0, opt = -1;
-
- if(getenv("POSIXLY_CORRECT")) colon_mode = mode = '+';
- else {
- if((colon_mode = *opts) == ':') off ++;
- if(((mode = opts[off]) == '+') || (mode == '-')) {
- off++;
- if((colon_mode != ':') && ((colon_mode = opts[off]) == ':'))
- off ++;
- }
- }
- my_optarg = 0;
- if(charind) {
- const char *s;
- my_optopt = argv[my_optind][charind];
- for(s=opts+off; *s; s++) if(my_optopt == *s) {
- charind++;
- if((*(++s) == ':') || ((my_optopt == 'W') && (*s == ';'))) {
- if(argv[my_optind][charind]) {
- my_optarg = &(argv[my_optind++][charind]);
- charind = 0;
- } else if(*(++s) != ':') {
- charind = 0;
- if(++my_optind >= argc) {
- if(my_opterr) fprintf(stderr,
- "%s: option requires an argument -- %c\n",
- argv[0], my_optopt);
- opt = (colon_mode == ':') ? ':' : '?';
- goto my_getopt_ok;
- }
- my_optarg = argv[my_optind++];
- }
- }
- opt = my_optopt;
- goto my_getopt_ok;
- }
- if(my_opterr) fprintf(stderr,
- "%s: illegal option -- %c\n",
- argv[0], my_optopt);
- opt = '?';
- if(argv[my_optind][++charind] == '\0') {
- my_optind++;
- charind = 0;
- }
- my_getopt_ok:
- if(charind && ! argv[my_optind][charind]) {
- my_optind++;
- charind = 0;
- }
- } else if((my_optind >= argc) ||
- ((argv[my_optind][0] == '-') &&
- (argv[my_optind][1] == '-') &&
- (argv[my_optind][2] == '\0'))) {
- my_optind++;
- opt = -1;
- } else if((argv[my_optind][0] != '-') ||
- (argv[my_optind][1] == '\0')) {
- char *tmp;
- int i, j, k;
-
- if(mode == '+') opt = -1;
- else if(mode == '-') {
- my_optarg = argv[my_optind++];
- charind = 0;
- opt = 1;
- } else {
- for(i=j=my_optind; i<argc; i++) if((argv[i][0] == '-') &&
- (argv[i][1] != '\0')) {
- my_optind=i;
- opt=my_getopt(argc, argv, opts);
- while(i > j) {
- tmp=argv[--i];
- for(k=i; k+1<my_optind; k++) argv[k]=argv[k+1];
- argv[--my_optind]=tmp;
- }
- break;
- }
- if(i == argc) opt = -1;
- }
- } else {
- charind++;
- opt = my_getopt(argc, argv, opts);
- }
- if (my_optind > argc) my_optind = argc;
- return opt;
-}
-
-/* this is the extended getopt_long{,_only}, with some GNU-like
- * extensions. Implements _getopt_internal in case any programs
- * expecting GNU libc getopt call it.
- */
-
-int _my_getopt_internal(int argc, char * argv[], const char *shortopts,
- const struct option *longopts, int *longind,
- int long_only)
-{
- char mode, colon_mode = *shortopts;
- int shortoff = 0, opt = -1;
-
- if(getenv("POSIXLY_CORRECT")) colon_mode = mode = '+';
- else {
- if((colon_mode = *shortopts) == ':') shortoff ++;
- if(((mode = shortopts[shortoff]) == '+') || (mode == '-')) {
- shortoff++;
- if((colon_mode != ':') && ((colon_mode = shortopts[shortoff]) == ':'))
- shortoff ++;
- }
- }
- my_optarg = 0;
- if((my_optind >= argc) ||
- ((argv[my_optind][0] == '-') &&
- (argv[my_optind][1] == '-') &&
- (argv[my_optind][2] == '\0'))) {
- my_optind++;
- opt = -1;
- } else if((argv[my_optind][0] != '-') ||
- (argv[my_optind][1] == '\0')) {
- char *tmp;
- int i, j, k;
-
- opt = -1;
- if(mode == '+') return -1;
- else if(mode == '-') {
- my_optarg = argv[my_optind++];
- return 1;
- }
- for(i=j=my_optind; i<argc; i++) if((argv[i][0] == '-') &&
- (argv[i][1] != '\0')) {
- my_optind=i;
- opt=_my_getopt_internal(argc, argv, shortopts,
- longopts, longind,
- long_only);
- while(i > j) {
- tmp=argv[--i];
- for(k=i; k+1<my_optind; k++)
- argv[k]=argv[k+1];
- argv[--my_optind]=tmp;
- }
- break;
- }
- } else if((!long_only) && (argv[my_optind][1] != '-'))
- opt = my_getopt(argc, argv, shortopts);
- else {
- int charind, offset;
- int found = 0, ind, hits = 0;
-
- if(((my_optopt = argv[my_optind][1]) != '-') && ! argv[my_optind][2]) {
- int c;
-
- ind = shortoff;
- while((c = shortopts[ind++])) {
- if(((shortopts[ind] == ':') ||
- ((c == 'W') && (shortopts[ind] == ';'))) &&
- (shortopts[++ind] == ':'))
- ind ++;
- if(my_optopt == c) return my_getopt(argc, argv, shortopts);
- }
- }
- offset = 2 - (argv[my_optind][1] != '-');
- for(charind = offset;
- (argv[my_optind][charind] != '\0') &&
- (argv[my_optind][charind] != '=');
- charind++);
- for(ind = 0; longopts[ind].name && !hits; ind++)
- if((strlen(longopts[ind].name) == (size_t) (charind - offset)) &&
- (strncmp(longopts[ind].name,
- argv[my_optind] + offset, charind - offset) == 0))
- found = ind, hits++;
- if(!hits) for(ind = 0; longopts[ind].name; ind++)
- if(strncmp(longopts[ind].name,
- argv[my_optind] + offset, charind - offset) == 0)
- found = ind, hits++;
- if(hits == 1) {
- opt = 0;
-
- if(argv[my_optind][charind] == '=') {
- if(longopts[found].has_arg == 0) {
- opt = '?';
- if(my_opterr) fprintf(stderr,
- "%s: option `--%s' doesn't allow an argument\n",
- argv[0], longopts[found].name);
- } else {
- my_optarg = argv[my_optind] + ++charind;
- charind = 0;
- }
- } else if(longopts[found].has_arg == 1) {
- if(++my_optind >= argc) {
- opt = (colon_mode == ':') ? ':' : '?';
- if(my_opterr) fprintf(stderr,
- "%s: option `--%s' requires an argument\n",
- argv[0], longopts[found].name);
- } else my_optarg = argv[my_optind];
- }
- if(!opt) {
- if (longind) *longind = found;
- if(!longopts[found].flag) opt = longopts[found].val;
- else *(longopts[found].flag) = longopts[found].val;
- }
- my_optind++;
- } else if(!hits) {
- if(offset == 1) opt = my_getopt(argc, argv, shortopts);
- else {
- opt = '?';
- if(my_opterr) fprintf(stderr,
- "%s: unrecognized option `%s'\n",
- argv[0], argv[my_optind++]);
- }
- } else {
- opt = '?';
- if(my_opterr) fprintf(stderr,
- "%s: option `%s' is ambiguous\n",
- argv[0], argv[my_optind++]);
- }
- }
- if (my_optind > argc) my_optind = argc;
- return opt;
-}
-
-int my_getopt_long(int argc, char * argv[], const char *shortopts,
- const struct option *longopts, int *longind)
-{
- return _my_getopt_internal(argc, argv, shortopts, longopts, longind, 0);
-}
-
-int my_getopt_long_only(int argc, char * argv[], const char *shortopts,
- const struct option *longopts, int *longind)
-{
- return _my_getopt_internal(argc, argv, shortopts, longopts, longind, 1);
-}
diff --git a/client/windows/my_getopt.h b/client/windows/my_getopt.h
deleted file mode 100644
index c75101a1..00000000
--- a/client/windows/my_getopt.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * my_getopt.h - interface to my re-implementation of getopt.
- * Copyright 1997, 2000, 2001, 2002, 2006, Benjamin Sittler
- *
- * Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation
- * files (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy,
- * modify, merge, publish, distribute, sublicense, and/or sell copies
- * of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-#ifndef MY_GETOPT_H_INCLUDED
-#define MY_GETOPT_H_INCLUDED
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* reset argument parser to start-up values */
-extern int my_getopt_reset(void);
-
-/* UNIX-style short-argument parser */
-extern int my_getopt(int argc, char * argv[], const char *opts);
-
-extern int my_optind, my_opterr, my_optopt;
-extern char *my_optarg;
-
-struct option {
- const char *name;
- int has_arg;
- int *flag;
- int val;
-};
-
-/* human-readable values for has_arg */
-#undef no_argument
-#define no_argument 0
-#undef required_argument
-#define required_argument 1
-#undef optional_argument
-#define optional_argument 2
-
-/* GNU-style long-argument parsers */
-extern int my_getopt_long(int argc, char * argv[], const char *shortopts,
- const struct option *longopts, int *longind);
-
-extern int my_getopt_long_only(int argc, char * argv[], const char *shortopts,
- const struct option *longopts, int *longind);
-
-extern int _my_getopt_internal(int argc, char * argv[], const char *shortopts,
- const struct option *longopts, int *longind,
- int long_only);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* MY_GETOPT_H_INCLUDED */
diff --git a/client/windows/named_pipe.cpp b/client/windows/named_pipe.cpp
deleted file mode 100644
index c8131120..00000000
--- a/client/windows/named_pipe.cpp
+++ /dev/null
@@ -1,232 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-#include "named_pipe.h"
-#include "utils.h"
-#include "debug.h"
-
-#define PIPE_TIMEOUT 5000
-#define PIPE_MAX_NAME_LEN 256
-#define PIPE_PREFIX TEXT("\\\\.\\pipe\\")
-
-PipeBuffer::PipeBuffer(HANDLE pipe, ProcessLoop& process_loop)
- : _handler (NULL)
- , _pipe (pipe)
- , _start (0)
- , _end (0)
- , _pending (false)
- , _process_loop(process_loop)
-{
- ZeroMemory(&_overlap, sizeof(_overlap));
- _overlap.hEvent = this->get_handle();
- _process_loop.add_handle(*this);
-}
-
-PipeBuffer::~PipeBuffer()
-{
- _process_loop.remove_handle(*this);
-}
-
-DWORD PipeBuffer::get_overlapped_bytes()
-{
- DWORD bytes = 0;
-
- if (!GetOverlappedResult(_pipe, &_overlap, &bytes, FALSE) || bytes == 0) {
- _pending = false;
- _handler->on_data();
- }
- return bytes;
-}
-
-int32_t PipeReader::read(uint8_t *buf, int32_t size)
-{
- ASSERT(buf && size >= 0);
-
- if (_start < _end) {
- int32_t bytes_read = 0;
- bytes_read = MIN(_end - _start, (uint32_t)size);
- CopyMemory(buf, _data + _start, bytes_read);
- _start += bytes_read;
- if (_start == _end) {
- _start = _end = 0;
- }
- return bytes_read;
- }
- if (_pending) {
- return 0;
- }
- if (!ReadFile(_pipe, _data + _end, sizeof(_data) - _end, NULL, &_overlap) &&
- GetLastError() != ERROR_IO_PENDING) {
- DBG(0, "ReadFile() failed %u", GetLastError());
- return -1;
- }
- _pending = true;
- return 0;
-}
-
-void PipeReader::on_event()
-{
- ASSERT(_pending);
- DWORD bytes = get_overlapped_bytes();
-
- if (!bytes) {
- return;
- }
- _end += bytes;
- _pending = false;
- _handler->on_data();
-}
-
-int32_t PipeWriter::write(const uint8_t *buf, int32_t size)
-{
- int32_t bytes_written = 0;
- ASSERT(buf && size >= 0);
-
- if (!_pending && _start == _end) {
- _start = _end = 0;
- }
- if (_end < sizeof(_data)) {
- bytes_written = MIN(sizeof(_data) - _end, (uint32_t)size);
- CopyMemory(_data + _end, buf, bytes_written);
- _end += bytes_written;
- }
- if (!_pending && _start < _end) {
- if (!WriteFile(_pipe, _data + _start, _end - _start, NULL, &_overlap) &&
- GetLastError() != ERROR_IO_PENDING) {
- DBG(0, "WriteFile() failed %u", GetLastError());
- return -1;
- }
- _pending = true;
- }
- return bytes_written;
-}
-
-void PipeWriter::on_event()
-{
- ASSERT(_pending);
- DWORD bytes = get_overlapped_bytes();
- if (!bytes) {
- return;
- }
- _start += bytes;
- _pending = false;
- if (_start == sizeof(_data)) {
- _handler->on_data();
- }
-}
-
-WinConnection::WinConnection(HANDLE pipe, ProcessLoop& process_loop)
- : _pipe (pipe)
- , _writer (pipe, process_loop)
- , _reader (pipe, process_loop)
-{
-}
-
-WinConnection::~WinConnection()
-{
- if (!DisconnectNamedPipe(_pipe)) {
- DBG(0, "DisconnectNamedPipe failed %d", GetLastError());
- }
- CloseHandle(_pipe);
-}
-
-int32_t WinConnection::read(uint8_t *buf, int32_t size)
-{
- return _reader.read(buf, size);
-}
-
-int32_t WinConnection::write(const uint8_t *buf, int32_t size)
-{
- return _writer.write(buf, size);
-}
-
-void WinConnection::set_handler(NamedPipe::ConnectionInterface* handler)
-{
- _reader.set_handler(handler);
- _writer.set_handler(handler);
-}
-
-WinListener::WinListener(const char *name, NamedPipe::ListenerInterface &listener_interface,
- ProcessLoop& process_loop)
- : _listener_interface (listener_interface)
- , _pipe (0)
- , _process_loop (process_loop)
-{
- _pipename = new TCHAR[PIPE_MAX_NAME_LEN];
- swprintf_s(_pipename, PIPE_MAX_NAME_LEN, L"%s%S", PIPE_PREFIX, name);
- ZeroMemory(&_overlap, sizeof(_overlap));
- _overlap.hEvent = this->get_handle();
- _process_loop.add_handle(*this);
- create_pipe();
-}
-
-WinListener::~WinListener()
-{
- CancelIo(_pipe);
- _process_loop.remove_handle(*this);
- delete[] _pipename;
-}
-
-void WinListener::on_event()
-{
- DWORD bytes;
-
- if (!GetOverlappedResult(_pipe, &_overlap, &bytes, FALSE)) {
- DBG(0, "GetOverlappedResult() failed %u", GetLastError());
- return;
- }
- DBG(0, "Pipe connected 0x%p", _pipe);
- WinConnection *con = new WinConnection(_pipe, _process_loop);
- NamedPipe::ConnectionInterface &con_interface = _listener_interface.create();
- con->set_handler(&con_interface);
- con_interface.bind((NamedPipe::ConnectionRef)con);
- create_pipe();
-}
-
-void WinListener::create_pipe()
-{
- _pipe = CreateNamedPipe(_pipename, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
- PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
- PIPE_UNLIMITED_INSTANCES, PIPE_BUF_SIZE, PIPE_BUF_SIZE,
- PIPE_TIMEOUT, NULL);
- if (_pipe == INVALID_HANDLE_VALUE) {
- THROW("CreateNamedPipe() failed %u", GetLastError());
- }
- if (ConnectNamedPipe(_pipe, &_overlap)) {
- THROW("ConnectNamedPipe() is not pending");
- }
- switch (GetLastError()) {
- case ERROR_IO_PENDING:
- DBG(0, "Pipe waits for connection");
- break;
- case ERROR_PIPE_CONNECTED: {
- DBG(0, "Pipe already connected");
- WinConnection *con = new WinConnection(_pipe, _process_loop);
- NamedPipe::ConnectionInterface &con_interface = _listener_interface.create();
- con->set_handler(&con_interface);
- con_interface.bind((NamedPipe::ConnectionRef)con);
- create_pipe();
- break;
- }
- default:
- THROW("ConnectNamedPipe() failed %u", GetLastError());
- }
-}
diff --git a/client/windows/named_pipe.h b/client/windows/named_pipe.h
deleted file mode 100644
index 10d5ced9..00000000
--- a/client/windows/named_pipe.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_NAMED_PIPE
-#define _H_NAMED_PIPE
-
-#include <windows.h>
-#include "process_loop.h"
-#include "event_sources.h"
-#include "platform.h"
-
-#define PIPE_BUF_SIZE 8192
-
-class WinConnection;
-
-class PipeBuffer: public EventSources::Handle {
-public:
- PipeBuffer(HANDLE pipe, ProcessLoop& process_loop);
- ~PipeBuffer();
- void set_handler(NamedPipe::ConnectionInterface* handler) { _handler = handler;}
- DWORD get_overlapped_bytes();
-
-protected:
- NamedPipe::ConnectionInterface *_handler;
- OVERLAPPED _overlap;
- HANDLE _pipe;
- uint32_t _start;
- uint32_t _end;
- uint8_t _data[PIPE_BUF_SIZE];
- bool _pending;
- ProcessLoop& _process_loop;
-};
-
-class PipeReader: public PipeBuffer {
-public:
- PipeReader(HANDLE pipe, ProcessLoop& process_loop) : PipeBuffer(pipe, process_loop) {}
- int32_t read(uint8_t *buf, int32_t size);
- void on_event();
-};
-
-class PipeWriter: public PipeBuffer {
-public:
- PipeWriter(HANDLE pipe, ProcessLoop& process_loop) : PipeBuffer(pipe, process_loop) {}
- int32_t write(const uint8_t *buf, int32_t size);
- void on_event();
-};
-
-class WinConnection {
-public:
- WinConnection(HANDLE pipe, ProcessLoop& process_loop);
- ~WinConnection();
- int32_t read(uint8_t *buf, int32_t size);
- int32_t write(const uint8_t *buf, int32_t size);
- void set_handler(NamedPipe::ConnectionInterface* handler);
-
-private:
- HANDLE _pipe;
- PipeWriter _writer;
- PipeReader _reader;
-};
-
-class WinListener: public EventSources::Handle {
-public:
- WinListener(const char *name, NamedPipe::ListenerInterface &listener_interface,
- ProcessLoop& process_loop);
- ~WinListener();
- void on_event();
-
-private:
- void create_pipe();
-
-private:
- TCHAR *_pipename;
- NamedPipe::ListenerInterface &_listener_interface;
- OVERLAPPED _overlap;
- HANDLE _pipe;
- ProcessLoop& _process_loop;
-};
-
-#endif
diff --git a/client/windows/pixels_source.cpp b/client/windows/pixels_source.cpp
deleted file mode 100644
index 3ddf5569..00000000
--- a/client/windows/pixels_source.cpp
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-#include "pixels_source.h"
-#include "pixels_source_p.h"
-#include "platform_utils.h"
-#include "threads.h"
-#include "debug.h"
-
-
-static SpicePoint get_bitmap_size(HDC dc)
-{
- BITMAP bitmap_info;
- SpicePoint size;
-
- GetObject(GetCurrentObject(dc, OBJ_BITMAP), sizeof(bitmap_info), &bitmap_info);
-
- size.x = bitmap_info.bmWidth;
- size.y = bitmap_info.bmHeight;
- return size;
-}
-
-PixelsSource::PixelsSource()
-{
- ASSERT(sizeof(_opaque) >= sizeof(PixelsSource_p));
- _origin.x = _origin.y = 0;
- memset(_opaque, 0, sizeof(_opaque));
- PixelsSource_p* p_data = (PixelsSource_p*)_opaque;
- p_data->_mutex = new RecurciveMutex();
-}
-
-PixelsSource::~PixelsSource()
-{
- PixelsSource_p* p_data = (PixelsSource_p*)_opaque;
- delete p_data->_mutex;
-}
-
-struct ResImage_p {
- PixelsSource_p source_p;
- HBITMAP prev_bitmap;
-};
-
-
-ImageFromRes::ImageFromRes(int res_id)
-{
- AutoDC dc(create_compatible_dc());
- ((ResImage_p*)get_opaque())->prev_bitmap = (HBITMAP)SelectObject(dc.get(),
- get_bitmap_res(res_id));
- ((ResImage_p*)get_opaque())->source_p.dc = dc.release();
-}
-
-ImageFromRes::~ImageFromRes()
-{
- HDC dc = ((ResImage_p*)get_opaque())->source_p.dc;
- if (dc) {
- HGDIOBJ bitmap = SelectObject(dc, ((ResImage_p*)get_opaque())->prev_bitmap);
- DeleteObject(bitmap);
- DeleteDC(dc);
- }
-}
-
-SpicePoint ImageFromRes::get_size()
-{
- ResImage_p* p_data = (ResImage_p*)get_opaque();
- Lock lock(*p_data->source_p._mutex);
- return get_bitmap_size(p_data->source_p.dc);
-}
-
-AlphaImageFromRes::AlphaImageFromRes(int res_id)
-{
- AutoDC dc(create_compatible_dc());
- ((ResImage_p*)get_opaque())->prev_bitmap = (HBITMAP)SelectObject(dc.get(),
- get_alpha_bitmap_res(res_id));
- ((ResImage_p*)get_opaque())->source_p.dc = dc.release();
-}
-
-AlphaImageFromRes::~AlphaImageFromRes()
-{
- HDC dc = ((ResImage_p*)get_opaque())->source_p.dc;
- if (dc) {
- HGDIOBJ bitmap = SelectObject(dc, ((ResImage_p*)get_opaque())->prev_bitmap);
- DeleteObject(bitmap);
- DeleteDC(dc);
- }
-}
-
-SpicePoint AlphaImageFromRes::get_size()
-{
- ResImage_p* p_data = (ResImage_p*)get_opaque();
- Lock lock(*p_data->source_p._mutex);
- return get_bitmap_size(p_data->source_p.dc);
-}
diff --git a/client/windows/platform.cpp b/client/windows/platform.cpp
deleted file mode 100644
index fc51a12d..00000000
--- a/client/windows/platform.cpp
+++ /dev/null
@@ -1,1213 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-
-#include <shlobj.h>
-#include <io.h>
-#include <conio.h>
-#include <fcntl.h>
-
-#include "platform.h"
-#include "win_platform.h"
-#include "utils.h"
-#include "threads.h"
-#include "debug.h"
-#include "monitor.h"
-#include "record.h"
-#include "playback.h"
-#include "cursor.h"
-#include "named_pipe.h"
-
-#ifndef DISABLE_CXIMAGE
-#define USE_CXIMAGE
-#endif
-
-#ifdef USE_CXIMAGE
-#include "ximage.h"
-#endif
-#include <spice/vd_agent.h>
-
-extern HINSTANCE instance;
-
-class DefaultEventListener: public Platform::EventListener {
-public:
- virtual void on_app_activated() {}
- virtual void on_app_deactivated() {}
- virtual void on_monitors_change() {}
-};
-
-static DefaultEventListener default_event_listener;
-static Platform::EventListener* event_listener = &default_event_listener;
-static HWND platform_win = NULL;
-static ProcessLoop* main_loop = NULL;
-
-class DefaultClipboardListener: public Platform::ClipboardListener {
-public:
- virtual void on_clipboard_grab(uint32_t *types, uint32_t type_count) {}
- virtual void on_clipboard_request(uint32_t type) {}
- virtual void on_clipboard_notify(uint32_t type, uint8_t* data, int32_t size) {}
- virtual void on_clipboard_release() {}
-};
-
-static DefaultClipboardListener default_clipboard_listener;
-static Platform::ClipboardListener* clipboard_listener = &default_clipboard_listener;
-
-// The next window in the clipboard viewer chain, which is refered in all clipboard events.
-static HWND next_clipboard_viewer_win = NULL;
-static HANDLE clipboard_event = NULL;
-
-static const int CLIPBOARD_TIMEOUT_MS = 10000;
-
-static const int CLIPBOARD_FORMAT_MAX_TYPES = 16;
-
-typedef struct ClipboardFormat {
- uint32_t format;
- uint32_t types[CLIPBOARD_FORMAT_MAX_TYPES];
-} ClipboardFormat;
-
-static ClipboardFormat clipboard_formats[] = {
- {CF_UNICODETEXT, {VD_AGENT_CLIPBOARD_UTF8_TEXT, 0}},
- //FIXME: support more image types
- {CF_DIB, {VD_AGENT_CLIPBOARD_IMAGE_PNG, VD_AGENT_CLIPBOARD_IMAGE_BMP, 0}},
-};
-
-#define clipboard_formats_count (sizeof(clipboard_formats) / sizeof(clipboard_formats[0]))
-
-#ifdef USE_CXIMAGE
-typedef struct ImageType {
- uint32_t type;
- DWORD cximage_format;
-} ImageType;
-
-static ImageType image_types[] = {
- {VD_AGENT_CLIPBOARD_IMAGE_PNG, CXIMAGE_FORMAT_PNG},
- {VD_AGENT_CLIPBOARD_IMAGE_BMP, CXIMAGE_FORMAT_BMP},
-};
-#endif
-
-static std::set<uint32_t> grab_types;
-
-static const unsigned long MODAL_LOOP_TIMER_ID = 1;
-static const int MODAL_LOOP_DEFAULT_TIMEOUT = 100;
-static bool modal_loop_active = false;
-static bool set_modal_loop_timer();
-
-void Platform::send_quit_request()
-{
- ASSERT(main_loop);
- main_loop->quit(0);
-}
-
-static uint32_t get_clipboard_type(uint32_t format) {
- uint32_t* types = NULL;
-
- for (size_t i = 0; i < clipboard_formats_count && !types; i++) {
- if (clipboard_formats[i].format == format) {
- types = clipboard_formats[i].types;
- }
- }
- if (!types) {
- return VD_AGENT_CLIPBOARD_NONE;
- }
- for (uint32_t* ptype = types; *ptype; ptype++) {
- if (grab_types.find(*ptype) != grab_types.end()) {
- return *ptype;
- }
- }
- return VD_AGENT_CLIPBOARD_NONE;
-}
-
-static uint32_t get_clipboard_format(uint32_t type) {
- for (size_t i = 0; i < clipboard_formats_count; i++) {
- for (uint32_t* ptype = clipboard_formats[i].types; *ptype; ptype++) {
- if (*ptype == type) {
- return clipboard_formats[i].format;
- }
- }
- }
- return 0;
-}
-
-static int get_available_clipboard_types(uint32_t** types)
-{
- int count = 0;
-
- *types = new uint32_t[clipboard_formats_count * CLIPBOARD_FORMAT_MAX_TYPES];
- for (size_t i = 0; i < clipboard_formats_count; i++) {
- if (IsClipboardFormatAvailable(clipboard_formats[i].format)) {
- for (uint32_t* ptype = clipboard_formats[i].types; *ptype; ptype++) {
- (*types)[count++] = *ptype;
- }
- }
- }
- if (!count) {
- delete[] *types;
- *types = NULL;
- }
- return count;
-}
-
-#ifdef USE_CXIMAGE
-static DWORD get_cximage_format(uint32_t type)
-{
- for (size_t i = 0; i < sizeof(image_types) / sizeof(image_types[0]); i++) {
- if (image_types[i].type == type) {
- return image_types[i].cximage_format;
- }
- }
- return 0;
-}
-#endif
-
-static LRESULT CALLBACK PlatformWinProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
-{
- switch (message) {
- case WM_TIMER:
- if (modal_loop_active) {
- main_loop->timers_action();
- if (!set_modal_loop_timer()) {
- LOG_WARN("failed to set modal loop timer");
- }
- } else {
- LOG_WARN("received WM_TIMER not inside a modal loop");
- }
- break;
- case WM_ACTIVATEAPP:
- if (wParam) {
- event_listener->on_app_activated();
- } else {
- event_listener->on_app_deactivated();
- }
- break;
- case WM_DISPLAYCHANGE:
- event_listener->on_monitors_change();
- break;
- case WM_CHANGECBCHAIN:
- if (next_clipboard_viewer_win == (HWND)wParam) {
- next_clipboard_viewer_win = (HWND)lParam;
- } else if (next_clipboard_viewer_win) {
- SendMessage(next_clipboard_viewer_win, message, wParam, lParam);
- }
- break;
- case WM_DRAWCLIPBOARD:
- if (platform_win != GetClipboardOwner()) {
- int type_count;
- uint32_t* types;
- Platform::set_clipboard_owner(Platform::owner_none);
- if ((type_count = get_available_clipboard_types(&types))) {
- clipboard_listener->on_clipboard_grab(types, type_count);
- delete[] types;
- } else {
- LOG_INFO("Unsupported clipboard format");
- }
- }
- if (next_clipboard_viewer_win) {
- SendMessage(next_clipboard_viewer_win, message, wParam, lParam);
- }
- break;
- case WM_RENDERFORMAT: {
- // In delayed rendering, Windows requires us to SetClipboardData before we return from
- // handling WM_RENDERFORMAT. Therefore, we try our best by sending CLIPBOARD_REQUEST to the
- // agent, while waiting alertably for a while (hoping for good) for receiving CLIPBOARD data
- // or CLIPBOARD_RELEASE from the agent, which both will signal clipboard_event.
- uint32_t type = get_clipboard_type(wParam);
- if (!type) {
- LOG_INFO("Unsupported clipboard format %u", wParam);
- break;
- }
- clipboard_listener->on_clipboard_request(type);
- DWORD start_tick = GetTickCount();
- while (WaitForSingleObjectEx(clipboard_event, 1000, TRUE) != WAIT_OBJECT_0 &&
- GetTickCount() < start_tick + CLIPBOARD_TIMEOUT_MS);
- break;
- }
- default:
- return DefWindowProc(hWnd, message, wParam, lParam);
- }
- return 0;
-}
-
-static void create_message_wind()
-{
- WNDCLASSEX wclass;
- ATOM class_atom;
- DWORD err;
-
- const LPCWSTR class_name = L"spicec_platform_wclass";
-
- wclass.cbSize = sizeof(WNDCLASSEX);
- wclass.style = 0;
- wclass.lpfnWndProc = PlatformWinProc;
- wclass.cbClsExtra = 0;
- wclass.cbWndExtra = 0;
- wclass.hInstance = instance;
- wclass.hIcon = NULL;
- wclass.hCursor = NULL;
- wclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
- wclass.lpszMenuName = NULL;
- wclass.lpszClassName = class_name;
- wclass.hIconSm = NULL;
-
- if ((class_atom = RegisterClassEx(&wclass)) == 0) {
- THROW("register class failed");
- }
-
- if (!(platform_win = CreateWindow(class_name, L"", 0, 0, 0, 0, 0, NULL, NULL, instance, NULL))) {
- THROW("create message window failed");
- }
- SetLastError(0);
- if (!(next_clipboard_viewer_win = SetClipboardViewer(platform_win)) && (err = GetLastError())) {
- THROW("set clipboard viewer failed %u", err);
- }
- if (!(clipboard_event = CreateEvent(NULL, FALSE, FALSE, NULL))) {
- THROW("create clipboard event failed");
- }
-}
-
-NamedPipe::ListenerRef NamedPipe::create(const char *name, ListenerInterface& listener_interface)
-{
- ASSERT(main_loop && main_loop->is_same_thread(pthread_self()));
- return (ListenerRef)(new WinListener(name, listener_interface, *main_loop));
-}
-
-void NamedPipe::destroy(ListenerRef listener_ref)
-{
- ASSERT(main_loop && main_loop->is_same_thread(pthread_self()));
- delete (WinListener *)listener_ref;
-}
-
-void NamedPipe::destroy_connection(ConnectionRef conn_ref)
-{
- ASSERT(main_loop && main_loop->is_same_thread(pthread_self()));
- delete (WinConnection *)conn_ref;
-}
-
-int32_t NamedPipe::read(ConnectionRef conn_ref, uint8_t *buf, int32_t size)
-{
- return ((WinConnection *)conn_ref)->read(buf, size);
-}
-
-int32_t NamedPipe::write(ConnectionRef conn_ref, const uint8_t *buf, int32_t size)
-{
- return ((WinConnection *)conn_ref)->write(buf, size);
-}
-
-void Platform::msleep(unsigned int msec)
-{
- Sleep(msec);
-}
-
-void Platform::yield()
-{
- Sleep(0);
-}
-
-void Platform::set_thread_priority(void* thread, Platform::ThreadPriority in_priority)
-{
- ASSERT(thread == NULL);
- int priority;
-
- switch (in_priority) {
- case PRIORITY_TIME_CRITICAL:
- priority = THREAD_PRIORITY_TIME_CRITICAL;
- break;
- case PRIORITY_HIGH:
- priority = THREAD_PRIORITY_HIGHEST;
- break;
- case PRIORITY_ABOVE_NORMAL:
- priority = THREAD_PRIORITY_ABOVE_NORMAL;
- break;
- case PRIORITY_NORMAL:
- priority = THREAD_PRIORITY_NORMAL;
- break;
- case PRIORITY_BELOW_NORMAL:
- priority = THREAD_PRIORITY_BELOW_NORMAL;
- break;
- case PRIORITY_LOW:
- priority = THREAD_PRIORITY_LOWEST;
- break;
- case PRIORITY_IDLE:
- priority = THREAD_PRIORITY_IDLE;
- break;
- default:
- THROW("invalid priority %d", in_priority);
- }
- SetThreadPriority(GetCurrentThread(), priority);
-}
-
-void Platform::set_event_listener(EventListener* listener)
-{
- event_listener = listener ? listener : &default_event_listener;
-}
-
-uint64_t Platform::get_monolithic_time()
-{
- return uint64_t(GetTickCount()) * 1000 * 1000;
-}
-
-void Platform::get_temp_dir(std::string& path)
-{
- DWORD len = GetTempPathA(0, NULL);
- if (len <= 0) {
- throw Exception("get temp patch failed");
- }
- char* tmp_path = new char[len + 1];
- GetTempPathA(len, tmp_path);
- path = tmp_path;
- delete[] tmp_path;
-}
-
-uint64_t Platform::get_process_id()
-{
- static uint64_t pid = GetCurrentProcessId();
- return pid;
-}
-
-uint64_t Platform::get_thread_id()
-{
- return GetCurrentThreadId();
-}
-
-void Platform::error_beep()
-{
- MessageBeep(MB_ICONERROR);
-}
-
-class WinMonitor: public Monitor {
-public:
- WinMonitor(int id, const wchar_t* name, const wchar_t* string);
-
- virtual int get_depth() { return _depth;}
- virtual SpicePoint get_position();
- virtual SpicePoint get_size() const { SpicePoint size = {_width, _height}; return size;}
- virtual bool is_out_of_sync() { return _out_of_sync;}
- virtual int get_screen_id() { return 0;}
-
-protected:
- virtual ~WinMonitor();
- virtual void do_set_mode(int width, int height);
- virtual void do_restore();
-
-private:
- void update_position();
- bool change_display_settings(int width, int height, int depth);
- bool best_display_setting(uint32_t width, uint32_t height, uint32_t depth);
-
-private:
- std::wstring _dev_name;
- std::wstring _dev_string;
- bool _active;
- SpicePoint _position;
- int _width;
- int _height;
- int _depth;
- bool _out_of_sync;
-};
-
-WinMonitor::WinMonitor(int id, const wchar_t* name, const wchar_t* string)
- : Monitor(id)
- , _dev_name (name)
- , _dev_string (string)
- , _active (false)
- , _out_of_sync (false)
-{
- update_position();
-}
-
-WinMonitor::~WinMonitor()
-{
- do_restore();
-}
-
-void WinMonitor::update_position()
-{
- DEVMODE mode;
- mode.dmSize = sizeof(DEVMODE);
- mode.dmDriverExtra = 0;
- EnumDisplaySettings(_dev_name.c_str(), ENUM_CURRENT_SETTINGS, &mode);
- _position.x = mode.dmPosition.x;
- _position.y = mode.dmPosition.y;
- _width = mode.dmPelsWidth;
- _height = mode.dmPelsHeight;
- _depth = mode.dmBitsPerPel;
-}
-
-SpicePoint WinMonitor::get_position()
-{
- update_position();
- return _position;
-}
-
-bool WinMonitor::change_display_settings(int width, int height, int depth)
-{
- DEVMODE mode;
- mode.dmSize = sizeof(DEVMODE);
- mode.dmDriverExtra = 0;
- mode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL;
- mode.dmPelsWidth = width;
- mode.dmPelsHeight = height;
- mode.dmBitsPerPel = depth;
-
- return ChangeDisplaySettingsEx(_dev_name.c_str(), &mode, NULL, CDS_FULLSCREEN, NULL)
- == DISP_CHANGE_SUCCESSFUL;
-}
-
-bool WinMonitor::best_display_setting(uint32_t width, uint32_t height, uint32_t depth)
-{
- DEVMODE mode;
- DWORD mode_id = 0;
- uint32_t mod_waste = ~0;
- DWORD mod_width = 0;
- DWORD mod_height = 0;
- DWORD mod_depth = 0;
- DWORD mod_frequency = 0;
-
- mode.dmSize = sizeof(DEVMODE);
- mode.dmDriverExtra = 0;
- while (EnumDisplaySettings(_dev_name.c_str(), mode_id++, &mode)) {
- // Workaround for
- // Lenovo T61p, Nvidia Quadro FX 570M and
- // Lenovo T61, Nvidia Quadro NVS 140M
- //
- // with dual monitors configuration
- //
- // we get strange values from EnumDisplaySettings 640x480x4 frequency 1
- // and calling ChangeDisplaySettingsEx with that configuration result with
- // machine that is stucked for a long period of time
- if (mode.dmDisplayFrequency == 1) {
- continue;
- }
-
- if (mode.dmPelsWidth >= width && mode.dmPelsHeight >= height) {
- bool replace = false;
- uint32_t curr_waste = mode.dmPelsWidth * mode.dmPelsHeight - width * height;
- if (curr_waste < mod_waste) {
- replace = true;
- } else if (curr_waste == mod_waste) {
- if (mod_depth == mode.dmBitsPerPel) {
- replace = mode.dmDisplayFrequency > mod_frequency;
- } else if (mod_depth != depth && mode.dmBitsPerPel > mod_depth) {
- replace = true;
- }
- }
- if (replace) {
- mod_waste = curr_waste;
- mod_width = mode.dmPelsWidth;
- mod_height = mode.dmPelsHeight;
- mod_depth = mode.dmBitsPerPel;
- mod_frequency = mode.dmDisplayFrequency;
- }
- }
- }
- if (mod_waste == ~0u) {
- return false;
- }
- mode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY;
- mode.dmPelsWidth = mod_width;
- mode.dmPelsHeight = mod_height;
- mode.dmBitsPerPel = mod_depth;
- mode.dmDisplayFrequency = mod_frequency;
-
- return ChangeDisplaySettingsEx(_dev_name.c_str(), &mode, NULL, CDS_FULLSCREEN, NULL)
- == DISP_CHANGE_SUCCESSFUL;
-}
-
-void WinMonitor::do_set_mode(int width, int height)
-{
- update_position();
- if (width == _width && height == _height) {
- _out_of_sync = false;
- return;
- }
- self_monitors_change++;
- if (!change_display_settings(width, height, 32) && !best_display_setting(width, height, 32)) {
- _out_of_sync = true;
- } else {
- _out_of_sync = false;
- }
- self_monitors_change--;
- _active = true;
- update_position();
-}
-
-void WinMonitor::do_restore()
-{
- if (_active) {
- _active = false;
- self_monitors_change++;
- ChangeDisplaySettingsEx(_dev_name.c_str(), NULL, NULL, 0, NULL);
- self_monitors_change--;
- update_position();
- }
-}
-
-static MonitorsList monitors;
-static Monitor* primary_monitor = NULL;
-
-const MonitorsList& Platform::init_monitors()
-{
- ASSERT(monitors.empty());
-
- int id = 0;
- Monitor* mon;
- DISPLAY_DEVICE device_info;
- DWORD device_id = 0;
- device_info.cb = sizeof(device_info);
- while (EnumDisplayDevices(NULL, device_id, &device_info, 0)) {
- if ((device_info.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP) &&
- !(device_info.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER)) {
- mon = new WinMonitor(id++, device_info.DeviceName, device_info.DeviceString);
- monitors.push_back(mon);
- if (device_info.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) {
- primary_monitor = mon;
- }
- }
- device_id++;
- }
- return monitors;
-}
-
-void Platform::destroy_monitors()
-{
- primary_monitor = NULL;
- while (!monitors.empty()) {
- Monitor* monitor = monitors.front();
- monitors.pop_front();
- delete monitor;
- }
-}
-
-bool Platform::is_monitors_pos_valid()
-{
- return true;
-}
-
-void Platform::get_app_data_dir(std::string& path, const std::string& app_name)
-{
- char app_data_path[MAX_PATH];
- HRESULT res = SHGetFolderPathA(NULL, CSIDL_APPDATA, NULL, 0, app_data_path);
- if (res != S_OK) {
- throw Exception("get user app data dir failed");
- }
-
- path = app_data_path;
- path_append(path, app_name);
-
- if (!CreateDirectoryA(path.c_str(), NULL) && GetLastError() != ERROR_ALREADY_EXISTS) {
- throw Exception("create user app data dir failed");
- }
-}
-
-void Platform::path_append(std::string& path, const std::string& partial_path)
-{
- path += "\\";
- path += partial_path;
-}
-
-static void cleanup()
-{
- ChangeClipboardChain(platform_win, next_clipboard_viewer_win);
- CloseHandle(clipboard_event);
-}
-
-void Platform::init()
-{
- create_message_wind();
- atexit(cleanup);
-}
-
-void Platform::set_process_loop(ProcessLoop& main_process_loop)
-{
- main_loop = &main_process_loop;
-}
-
-WaveRecordAbstract* Platform::create_recorder(RecordClient& client,
- uint32_t samples_per_sec,
- uint32_t bits_per_sample,
- uint32_t channels)
-{
- return new WaveRecorder(client, samples_per_sec, bits_per_sample, channels);
-}
-
-WavePlaybackAbstract* Platform::create_player(uint32_t samples_per_sec,
- uint32_t bits_per_sample,
- uint32_t channels)
-{
- return new WavePlayer(samples_per_sec, bits_per_sample, channels);
-}
-
-static void toggle_modifier(int key)
-{
- INPUT inputs[2];
- memset(inputs, 0, sizeof(inputs));
- inputs[0].type = inputs[1].type = INPUT_KEYBOARD;
- inputs[0].ki.wVk = inputs[1].ki.wVk = key;
- inputs[1].ki.dwFlags = KEYEVENTF_KEYUP;
- SendInput(2, inputs, sizeof(INPUT));
-}
-
-uint32_t Platform::get_keyboard_lock_modifiers()
-{
- uint32_t modifiers = 0;
- if ((GetKeyState(VK_SCROLL) & 1)) {
- modifiers |= SCROLL_LOCK_MODIFIER;
- }
- if ((GetKeyState(VK_NUMLOCK) & 1)) {
- modifiers |= NUM_LOCK_MODIFIER;
- }
- if ((GetKeyState(VK_CAPITAL) & 1)) {
- modifiers |= CAPS_LOCK_MODIFIER;
- }
- return modifiers;
-}
-
-void Platform::set_keyboard_lock_modifiers(uint32_t modifiers)
-{
- if (((modifiers >> SCROLL_LOCK_MODIFIER_SHIFT) & 1) != (GetKeyState(VK_SCROLL) & 1)) {
- toggle_modifier(VK_SCROLL);
- }
-
- if (((modifiers >> Platform::NUM_LOCK_MODIFIER_SHIFT) & 1) != (GetKeyState(VK_NUMLOCK) & 1)) {
- toggle_modifier(VK_NUMLOCK);
- }
-
- if (((modifiers >> CAPS_LOCK_MODIFIER_SHIFT) & 1) != (GetKeyState(VK_CAPITAL) & 1)) {
- toggle_modifier(VK_CAPITAL);
- }
-}
-
-typedef struct KeyboardModifier {
- int vkey;
- int bit;
-} KeyboardModifier;
-
-static const KeyboardModifier KEYBOARD_MODIFIERS[] = {
- {VK_LSHIFT, Platform::L_SHIFT_MODIFIER},
- {VK_RSHIFT, Platform::R_SHIFT_MODIFIER},
- {VK_LCONTROL, Platform::L_CTRL_MODIFIER},
- {VK_RCONTROL, Platform::R_CTRL_MODIFIER},
- {VK_LMENU, Platform::L_ALT_MODIFIER},
- {VK_RMENU, Platform::R_ALT_MODIFIER}};
-
-uint32_t Platform::get_keyboard_modifiers()
-{
- uint32_t modifiers_state = 0;
- int num_modifiers = sizeof(KEYBOARD_MODIFIERS)/sizeof(KEYBOARD_MODIFIERS[0]);
-
- for (int i = 0; i < num_modifiers; i++) {
- short key_state = GetAsyncKeyState(KEYBOARD_MODIFIERS[i].vkey);
- modifiers_state |= (key_state & 0x8000) ? KEYBOARD_MODIFIERS[i].bit : 0;
- }
-
- return modifiers_state;
-}
-
-void Platform::reset_cursor_pos()
-{
- if (!primary_monitor) {
- return;
- }
- SpicePoint pos = primary_monitor->get_position();
- SpicePoint size = primary_monitor->get_size();
- SetCursorPos(pos.x + size.x / 2, pos.y + size.y / 2);
-}
-
-class WinBaseLocalCursor: public LocalCursor {
-public:
- WinBaseLocalCursor() : _handle (0) {}
- void set(Window window) { SetCursor(_handle);}
-
-protected:
- HCURSOR _handle;
-};
-
-class WinLocalCursor: public WinBaseLocalCursor {
-public:
- WinLocalCursor(CursorData* cursor_data);
- ~WinLocalCursor();
-
-private:
- bool _shared;
-};
-
-WinLocalCursor::WinLocalCursor(CursorData* cursor_data)
- : _shared (false)
-{
- const SpiceCursorHeader& header = cursor_data->header();
- const uint8_t* data = cursor_data->data();
- int cur_size;
- int bits = get_size_bits(header, cur_size);
- if (!bits) {
- THROW("invalid curosr type");
- }
- if (header.type == SPICE_CURSOR_TYPE_MONO) {
- _handle = CreateCursor(NULL, header.hot_spot_x, header.hot_spot_y,
- header.width, header.height, data, data + cur_size);
- return;
- }
- ICONINFO icon;
- icon.fIcon = FALSE;
- icon.xHotspot = header.hot_spot_x;
- icon.yHotspot = header.hot_spot_y;
- icon.hbmColor = icon.hbmMask = NULL;
- HDC hdc = GetDC(NULL);
-
- switch (header.type) {
- case SPICE_CURSOR_TYPE_ALPHA:
- case SPICE_CURSOR_TYPE_COLOR32:
- case SPICE_CURSOR_TYPE_COLOR16: {
- BITMAPV5HEADER bmp_hdr;
- ZeroMemory(&bmp_hdr, sizeof(bmp_hdr));
- bmp_hdr.bV5Size = sizeof(bmp_hdr);
- bmp_hdr.bV5Width = header.width;
- bmp_hdr.bV5Height = -header.height;
- bmp_hdr.bV5Planes = 1;
- bmp_hdr.bV5BitCount = bits;
- bmp_hdr.bV5Compression = BI_BITFIELDS;
- if (bits == 32) {
- bmp_hdr.bV5RedMask = 0x00FF0000;
- bmp_hdr.bV5GreenMask = 0x0000FF00;
- bmp_hdr.bV5BlueMask = 0x000000FF;
- } else if (bits == 16) {
- bmp_hdr.bV5RedMask = 0x00007C00;
- bmp_hdr.bV5GreenMask = 0x000003E0;
- bmp_hdr.bV5BlueMask = 0x0000001F;
- }
- if (header.type == SPICE_CURSOR_TYPE_ALPHA) {
- bmp_hdr.bV5AlphaMask = 0xFF000000;
- }
- void* bmp_pixels = NULL;
- icon.hbmColor = CreateDIBSection(hdc, (BITMAPINFO *)&bmp_hdr, DIB_RGB_COLORS, &bmp_pixels,
- NULL, 0);
- memcpy(bmp_pixels, data, cur_size);
- icon.hbmMask = CreateBitmap(header.width, header.height, 1, 1,
- (header.type == SPICE_CURSOR_TYPE_ALPHA) ? NULL :
- (CONST VOID *)(data + cur_size));
- break;
- }
- case SPICE_CURSOR_TYPE_COLOR4: {
- BITMAPINFO* bmp_info;
- bmp_info = (BITMAPINFO *)new uint8_t[sizeof(BITMAPINFO) + (sizeof(RGBQUAD) << bits)];
- ZeroMemory(bmp_info, sizeof(BITMAPINFO));
- bmp_info->bmiHeader.biSize = sizeof(bmp_info->bmiHeader);
- bmp_info->bmiHeader.biWidth = header.width;
- bmp_info->bmiHeader.biHeight = -header.height;
- bmp_info->bmiHeader.biPlanes = 1;
- bmp_info->bmiHeader.biBitCount = bits;
- bmp_info->bmiHeader.biCompression = BI_RGB;
- memcpy(bmp_info->bmiColors, data + cur_size, sizeof(RGBQUAD) << bits);
- icon.hbmColor = CreateDIBitmap(hdc, &bmp_info->bmiHeader, CBM_INIT, data,
- bmp_info, DIB_RGB_COLORS);
- icon.hbmMask = CreateBitmap(header.width, header.height, 1, 1,
- (CONST VOID *)(data + cur_size + (sizeof(uint32_t) << bits)));
- delete[] (uint8_t *)bmp_info;
- break;
- }
- case SPICE_CURSOR_TYPE_COLOR24:
- case SPICE_CURSOR_TYPE_COLOR8:
- default:
- LOG_WARN("unsupported cursor type %d", header.type);
- _handle = LoadCursor(NULL, IDC_ARROW);
- _shared = true;
- ReleaseDC(NULL, hdc);
- return;
- }
-
- ReleaseDC(NULL, hdc);
-
- if (icon.hbmColor && icon.hbmMask) {
- _handle = CreateIconIndirect(&icon);
- }
- if (icon.hbmMask) {
- DeleteObject(icon.hbmMask);
- }
- if (icon.hbmColor) {
- DeleteObject(icon.hbmColor);
- }
-}
-
-WinLocalCursor::~WinLocalCursor()
-{
- if (_handle && !_shared) {
- DestroyCursor(_handle);
- }
-}
-
-LocalCursor* Platform::create_local_cursor(CursorData* cursor_data)
-{
- return new WinLocalCursor(cursor_data);
-}
-
-class WinInactiveCursor: public WinBaseLocalCursor {
-public:
- WinInactiveCursor() { _handle = LoadCursor(NULL, IDC_NO);}
-};
-
-LocalCursor* Platform::create_inactive_cursor()
-{
- return new WinInactiveCursor();
-}
-
-class WinDefaultCursor: public WinBaseLocalCursor {
-public:
- WinDefaultCursor() { _handle = LoadCursor(NULL, IDC_ARROW);}
-};
-
-LocalCursor* Platform::create_default_cursor()
-{
- return new WinDefaultCursor();
-}
-
-void Platform::set_display_mode_listner(DisplayModeListener* listener)
-{
-}
-
-Icon* Platform::load_icon(int id)
-{
- HICON icon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(id));
- if (!icon) {
- return NULL;
- }
- return new WinIcon(icon);
-}
-
-void WinPlatform::enter_modal_loop()
-{
- if (modal_loop_active) {
- LOG_INFO("modal loop already active");
- return;
- }
-
- if (set_modal_loop_timer()) {
- modal_loop_active = true;
- } else {
- LOG_WARN("failed to create modal loop timer");
- }
-}
-
-static bool set_modal_loop_timer()
-{
- unsigned timeout = main_loop->get_soonest_timeout();
- if (timeout == INFINITE) {
- timeout = MODAL_LOOP_DEFAULT_TIMEOUT; /* for cases timeouts are added after
- the enterance to the loop*/
- }
-
- if (!SetTimer(platform_win, MODAL_LOOP_TIMER_ID, timeout, NULL)) {
- return false;
- }
- return true;
-}
-
-void WinPlatform::exit_modal_loop()
-{
- if (!modal_loop_active) {
- LOG_INFO("not inside the loop");
- return;
- }
- KillTimer(platform_win, MODAL_LOOP_TIMER_ID);
- modal_loop_active = false;
-}
-
-int Platform::_clipboard_owner = Platform::owner_none;
-
-void Platform::set_clipboard_owner_unlocked(int new_owner)
-{
- set_clipboard_owner(new_owner);
-}
-
-void Platform::set_clipboard_owner(int new_owner)
-{
- const char * const owner_str[] = { "none", "guest", "client" };
-
- if (new_owner == owner_none) {
- clipboard_listener->on_clipboard_release();
-
- /* FIXME clear cached clipboard type info and data */
- }
- _clipboard_owner = new_owner;
- LOG_INFO("new clipboard owner: %s", owner_str[new_owner]);
-}
-
-bool Platform::on_clipboard_grab(uint32_t *types, uint32_t type_count)
-{
- std::set<uint32_t> grab_formats;
-
- grab_types.clear();
- for (uint32_t i = 0; i < type_count; i++) {
- uint32_t format = get_clipboard_format(types[i]);
- //On first supported type, open and empty the clipboard
- if (format && grab_formats.empty()) {
- if (!OpenClipboard(platform_win)) {
- return false;
- }
- EmptyClipboard();
- }
- //For all supported type set delayed rendering
- if (format) {
- grab_types.insert(types[i]);
- if (grab_formats.insert(format).second) {
- SetClipboardData(format, NULL);
- }
- }
- }
- if (grab_formats.empty()) {
- LOG_INFO("No supported clipboard types in client grab");
- return false;
- }
- CloseClipboard();
-
- set_clipboard_owner(owner_guest);
- return true;
-}
-
-void Platform::set_clipboard_listener(ClipboardListener* listener)
-{
- clipboard_listener = listener ? listener : &default_clipboard_listener;
-}
-
-static HGLOBAL utf8_alloc(LPCSTR data, int size)
-{
- HGLOBAL handle;
- LPVOID buf;
- int len;
-
- // Received utf8 string is not null-terminated
- if (!(len = MultiByteToWideChar(CP_UTF8, 0, data, size, NULL, 0))) {
- return NULL;
- }
- len++;
- // Allocate and lock clipboard memory
- if (!(handle = GlobalAlloc(GMEM_DDESHARE, len * sizeof(WCHAR)))) {
- return NULL;
- }
- if (!(buf = GlobalLock(handle))) {
- GlobalFree(handle);
- return NULL;
- }
- // Translate data and set clipboard content
- if (!(MultiByteToWideChar(CP_UTF8, 0, data, size, (LPWSTR)buf, len))) {
- GlobalUnlock(handle);
- GlobalFree(handle);
- return NULL;
- }
- ((LPWSTR)buf)[len - 1] = L'\0';
- GlobalUnlock(handle);
- return handle;
-}
-
-bool Platform::on_clipboard_notify(uint32_t type, const uint8_t* data, int32_t size)
-{
- HANDLE clip_data;
- UINT format;
- bool ret = false;
-
- if (type == VD_AGENT_CLIPBOARD_NONE) {
- SetEvent(clipboard_event);
- return true;
- }
- switch (type) {
- case VD_AGENT_CLIPBOARD_UTF8_TEXT:
- clip_data = utf8_alloc((LPCSTR)data, size);
- break;
-#ifdef USE_CXIMAGE
- case VD_AGENT_CLIPBOARD_IMAGE_PNG:
- case VD_AGENT_CLIPBOARD_IMAGE_BMP: {
- DWORD cximage_format = get_cximage_format(type);
- ASSERT(cximage_format);
- CxImage image((BYTE *)data, size, cximage_format);
- clip_data = image.CopyToHandle();
- break;
- }
-#endif
- default:
- LOG_INFO("Unsupported clipboard type %u", type);
- return true;
- }
-
- format = get_clipboard_format(type);
- if (SetClipboardData(format, clip_data)) {
- SetEvent(clipboard_event);
- return true;
- }
- // We retry clipboard open-empty-set-close only when there is a timeout in WM_RENDERFORMAT
- if (!OpenClipboard(platform_win)) {
- return false;
- }
- EmptyClipboard();
- ret = !!SetClipboardData(format, clip_data);
- CloseClipboard();
- return ret;
-}
-
-bool Platform::on_clipboard_request(uint32_t type)
-{
- UINT format = get_clipboard_format(type);
- HANDLE clip_data;
- LPCWSTR clip_buf;
- uint8_t* new_data = NULL;
- long new_size;
-
- bool ret = false;
-
- if (!format || !IsClipboardFormatAvailable(format) || !OpenClipboard(platform_win)) {
- return false;
- }
- if (!(clip_data = GetClipboardData(format))) {
- CloseClipboard();
- return false;
- }
-
- switch (type) {
- case VD_AGENT_CLIPBOARD_UTF8_TEXT: {
- if (!(clip_buf = (LPCWSTR)GlobalLock(clip_data))) {
- break;
- }
- size_t len = wcslen((wchar_t*)clip_buf);
- new_size = WideCharToMultiByte(CP_UTF8, 0, clip_buf, len, NULL, 0, NULL, NULL);
- if (!new_size) {
- GlobalUnlock(clip_data);
- break;
- }
- new_data = new uint8_t[new_size];
- if (WideCharToMultiByte(CP_UTF8, 0, clip_buf, len, (LPSTR)new_data, new_size,
- NULL, NULL)) {
- clipboard_listener->on_clipboard_notify(type, new_data, new_size);
- ret = true;
- }
- delete[] (uint8_t *)new_data;
- GlobalUnlock(clip_data);
- break;
- }
-#ifdef USE_CXIMAGE
- case VD_AGENT_CLIPBOARD_IMAGE_PNG:
- case VD_AGENT_CLIPBOARD_IMAGE_BMP: {
- DWORD cximage_format = get_cximage_format(type);
- ASSERT(cximage_format);
- CxImage image;
- if (!image.CreateFromHANDLE(clip_data)) {
- LOG_INFO("Image create from handle failed");
- break;
- }
- if (!image.Encode(new_data, new_size, cximage_format)) {
- LOG_INFO("Image encode to type %u failed", type);
- break;
- }
- LOG_INFO("Image encoded to %u bytes", new_size);
- clipboard_listener->on_clipboard_notify(type, new_data, new_size);
- image.FreeMemory(new_data);
- ret = true;
- break;
- }
-#endif
- default:
- LOG_INFO("Unsupported clipboard type %u", type);
- }
-
- CloseClipboard();
- return ret;
-}
-
-void Platform::on_clipboard_release()
-{
- SetEvent(clipboard_event);
- set_clipboard_owner(owner_none);
-}
-
-static bool has_console = false;
-static BOOL parent_console;
-
-static void create_console()
-{
- static Mutex console_mutex;
-
- Lock lock(console_mutex);
-
- if (has_console) {
- return;
- }
-
- parent_console = AttachConsole(-1 /* parent */);
-
- if (!parent_console) {
- AllocConsole();
- }
-
- HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
- int hConHandle = _open_osfhandle((intptr_t)h, _O_TEXT);
- FILE * fp;
- /* _open_osfhandle can fail, for instance this will fail:
- start /wait spicec.exe --help | more
- however this actually works:
- cmd /c spicec --help | more
- */
- if (hConHandle != -1) {
- fp = _fdopen(hConHandle, "w");
- *stdout = *fp;
- }
-
- h = GetStdHandle(STD_INPUT_HANDLE);
- hConHandle = _open_osfhandle((intptr_t)h, _O_TEXT);
- if (hConHandle != -1) {
- fp = _fdopen(hConHandle, "r");
- *stdin = *fp;
- }
-
- h = GetStdHandle(STD_ERROR_HANDLE);
- hConHandle = _open_osfhandle((intptr_t)h, _O_TEXT);
- if (hConHandle != -1) {
- fp = _fdopen(hConHandle, "w");
- *stderr = *fp;
- }
-
- has_console = true;
-
- HWND consol_window = GetConsoleWindow();
-
- if (consol_window && !parent_console) {
- SetForegroundWindow(consol_window);
- }
-}
-
-class ConsoleWait {
-public:
- ~ConsoleWait()
- {
- if (has_console && !parent_console) {
- Platform::term_printf("\n\nPress any key to exit...");
- _getch();
- }
- }
-
-} console_wait;
-
-
-void Platform::term_printf(const char* format, ...)
-{
- if (!has_console) {
- create_console();
- }
-
- va_list ap;
- va_start(ap, format);
- vprintf(format, ap);
- va_end(ap);
-}
diff --git a/client/windows/platform_utils.cpp b/client/windows/platform_utils.cpp
deleted file mode 100644
index a4c9c417..00000000
--- a/client/windows/platform_utils.cpp
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-#include <map>
-#include "platform_utils.h"
-#include "utils.h"
-#include "threads.h"
-
-void string_vprintf(std::string& str, const char* format, va_list ap)
-{
- int buf_size = 256;
- for (;;) {
- AutoArray<char> buf(new char[buf_size]);
- int r = vsnprintf_s(buf.get(), buf_size, buf_size - 1, format, ap);
- if (r != -1) {
- str = buf.get();
- return;
- }
- buf_size *= 2;
- }
-}
-
-HDC create_compatible_dc()
-{
- HDC dc = CreateCompatibleDC(NULL);
- if (!dc) {
- THROW("create compatible DC failed");
- }
- return dc;
-}
-
-HBITMAP get_bitmap_res(int id)
-{
- HBITMAP bitmap = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(id));
- if (!bitmap) {
- THROW("get bitmap #%d failed", id);
- }
- return bitmap;
-}
-
-HBITMAP get_alpha_bitmap_res(int id)
-{
- AutoGDIObject bitmap(LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(id), IMAGE_BITMAP, 0, 0,
- LR_DEFAULTCOLOR | LR_CREATEDIBSECTION | LR_SHARED));
- if (!bitmap.valid()) {
- THROW("get alpha bitmap #%d failed", id);
- }
-
- BITMAP src_info;
- GetObject(bitmap.get(), sizeof(src_info), &src_info);
- if (src_info.bmBitsPixel != 32 || src_info.bmPlanes != 1) {
- THROW("invalid format #%d ", id);
- }
-
- LONG src_size = src_info.bmHeight * src_info.bmWidthBytes;
- AutoArray<uint8_t> src_pixels(new uint8_t[src_size]);
- LONG ncopy = GetBitmapBits((HBITMAP)bitmap.get(), src_size, src_pixels.get());
- if (ncopy != src_size) {
- THROW("get vitmap bits failed, %u", GetLastError());
- }
-
- AutoDC auto_dc(create_compatible_dc());
- BITMAPINFO dest_info;
- uint8_t* dest;
- dest_info.bmiHeader.biSize = sizeof(dest_info.bmiHeader);
- dest_info.bmiHeader.biWidth = src_info.bmWidth;
- dest_info.bmiHeader.biHeight = -src_info.bmHeight;
- dest_info.bmiHeader.biPlanes = 1;
- dest_info.bmiHeader.biBitCount = 32;
- dest_info.bmiHeader.biCompression = BI_RGB;
- dest_info.bmiHeader.biSizeImage = 0;
- dest_info.bmiHeader.biXPelsPerMeter = dest_info.bmiHeader.biYPelsPerMeter = 0;
- dest_info.bmiHeader.biClrUsed = 0;
- dest_info.bmiHeader.biClrImportant = 0;
-
- HBITMAP ret = CreateDIBSection(auto_dc.get(), &dest_info, 0, (VOID**)&dest, NULL, 0);
- if (!ret) {
- THROW("create bitmap failed, %u", GetLastError());
- }
-
- uint8_t* src_line = src_pixels.get();
- for (int i = 0; i < src_info.bmHeight; i++, src_line += src_info.bmWidthBytes) {
- uint8_t* src = src_line;
- for (int j = 0; j < src_info.bmWidth; j++) {
- dest[3] = src[3];
- double alpha = (double)dest[3] / 0xff;
- dest[2] = (uint8_t)(alpha * src[2]);
- dest[1] = (uint8_t)(alpha * src[1]);
- dest[0] = (uint8_t)(alpha * src[0]);
- src += 4;
- dest += 4;
- }
- }
- return ret;
-}
-
-static std::map<int, const char*> errors_map;
-static Mutex errors_map_mutex;
-
-const char* sys_err_to_str(int error)
-{
- Lock lock(errors_map_mutex);
- if (errors_map.find(error) == errors_map.end()) {
- LPSTR msg;
- if (!FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS, NULL, error,
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
- (LPSTR)&msg, 0, NULL)) {
- const int BUF_SIZE = 20;
- msg = new char[BUF_SIZE];
- _snprintf(msg, BUF_SIZE, "errno %d", error);
- } else {
- char* new_line;
- if ((new_line = strrchr(msg, '\r'))) {
- *new_line = 0;
- }
- }
- errors_map[error] = msg;
- }
- return errors_map[error];
-}
-
-int inet_aton(const char* ip, struct in_addr* in_addr)
-{
- unsigned long addr = inet_addr(ip);
-
- if (addr == INADDR_NONE) {
- return 0;
- }
- in_addr->S_un.S_addr = addr;
- return 1;
-}
diff --git a/client/windows/platform_utils.h b/client/windows/platform_utils.h
deleted file mode 100644
index a652feda..00000000
--- a/client/windows/platform_utils.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_PLATFORM_UTILS
-#define _H_PLATFORM_UTILS
-
-#include <winsock.h>
-#include <winsock2.h>
-#include <ws2tcpip.h>
-#include "utils.h"
-
-#define mb() __asm {lock add [esp], 0}
-
-template<class T, class FreeRes = FreeObject<T>, intptr_t invalid = 0 >
-class AutoRes {
-public:
- AutoRes() : res(invalid) {}
- AutoRes(T inRes) : res(inRes) {}
- ~AutoRes() { set(invalid); }
-
- void set(T inRes) {if (res != invalid) free_res(res); res = inRes; }
- T get() {return res;}
- T release() {T tmp = res; res = invalid; return tmp; }
- bool valid() { return res != invalid; }
-
-private:
- AutoRes(const AutoRes&);
- AutoRes& operator = (const AutoRes&);
-
-private:
- T res;
- FreeRes free_res;
-};
-
-class Delete_DC {
-public:
- void operator () (HDC dc) { DeleteDC(dc);}
-};
-
-typedef AutoRes<HDC, Delete_DC> AutoDC;
-
-class Delete_Object {
-public:
- void operator () (HGDIOBJ obj) { DeleteObject(obj);}
-};
-typedef AutoRes<HGDIOBJ, Delete_Object> AutoGDIObject;
-
-class DeleteOGLContext {
-public:
- void operator () (HGLRC ctx) { wglDeleteContext(ctx);}
-};
-
-typedef AutoRes<HGLRC, DeleteOGLContext> AutoOGLCtx;
-
-HDC create_compatible_dc();
-HBITMAP get_bitmap_res(int id);
-HBITMAP get_alpha_bitmap_res(int id);
-
-class WindowDC {
-public:
- WindowDC(HWND window): _window (window), _dc (GetDC(window)) {}
- ~WindowDC() { ReleaseDC(_window, _dc);}
- HDC operator * () { return _dc;}
-
-private:
- HWND _window;
- HDC _dc;
-};
-
-typedef AutoRes<HDC, Delete_DC> AutoReleaseDC;
-
-const char* sys_err_to_str(int error);
-
-#define SHUT_WR SD_SEND
-#define SHUT_RD SD_RECEIVE
-#define SHUT_RDWR SD_BOTH
-#define MSG_NOSIGNAL 0
-
-#define SHUTDOWN_ERR WSAESHUTDOWN
-#define INTERRUPTED_ERR WSAEINTR
-#define WOULDBLOCK_ERR WSAEWOULDBLOCK
-#define sock_error() WSAGetLastError()
-#define sock_err_message(err) sys_err_to_str(err)
-int inet_aton(const char* ip, struct in_addr* in_addr);
-
-#endif
diff --git a/client/windows/playback.cpp b/client/windows/playback.cpp
deleted file mode 100644
index 87ed26a0..00000000
--- a/client/windows/playback.cpp
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-#include "playback.h"
-#include "utils.h"
-#include "debug.h"
-
-
-#define RING_SIZE_MS 380
-#define START_MARK_MS 300
-#define LOW_MARK_MS 40
-
-
-WavePlayer::WavePlayer(uint32_t samples_per_sec, uint32_t bits_per_sample, uint32_t channels)
- : _wave_out (NULL)
- , _samples_per_ms (samples_per_sec / 1000)
- , _ring (NULL)
- , _head (0)
- , _in_use (0)
- , _paused (true)
-{
- WAVEFORMATEX info;
- uint32_t sample_bytes;
-
- info.wFormatTag = WAVE_FORMAT_PCM;
- info.nChannels = channels;
- info.nSamplesPerSec = samples_per_sec;
- sample_bytes = info.nBlockAlign = channels * bits_per_sample / 8;
- info.nAvgBytesPerSec = samples_per_sec * info.nBlockAlign;
- info.wBitsPerSample = bits_per_sample;
-
- if (waveOutOpen(&_wave_out, WAVE_MAPPER, &info, 0, 0, CALLBACK_NULL)
- != MMSYSERR_NOERROR) {
- throw Exception("can not open playback device");
- }
-
- int frame_size = WavePlaybackAbstract::FRAME_SIZE;
- _ring_size = (samples_per_sec * RING_SIZE_MS / 1000) / frame_size;
- _start_mark = (samples_per_sec * START_MARK_MS / 1000) / frame_size;
- _frame_bytes = frame_size * channels * bits_per_sample / 8;
- _ring_item_size = sizeof(WAVEHDR) + _frame_bytes + sample_bytes;
-
- try {
- _ring = new uint8_t[_ring_size * _ring_item_size];
- init_ring(sample_bytes);
- } catch (...) {
- delete[] _ring;
- waveOutClose(_wave_out);
- throw;
- }
- waveOutPause(_wave_out);
-}
-
-WavePlayer::~WavePlayer()
-{
- waveOutReset(_wave_out);
- reclaim();
- waveOutClose(_wave_out);
- delete[] _ring;
-}
-
-void WavePlayer::init_ring(uint32_t sample_bytes)
-{
- uint8_t* ptr = _ring;
- uint8_t* end = ptr + _ring_size * _ring_item_size;
- for (; ptr != end; ptr += _ring_item_size) {
- WAVEHDR* buf = (WAVEHDR*)ptr;
- memset(ptr, 0, _ring_item_size);
- buf->dwBufferLength = _frame_bytes;
- ULONG_PTR ptr = (ULONG_PTR)(buf + 1);
- ptr = (ptr + sample_bytes - 1) / sample_bytes * sample_bytes;
- buf->lpData = (LPSTR)ptr;
- }
-}
-
-inline WAVEHDR* WavePlayer::wave_hader(uint32_t position)
-{
- ASSERT(position < _ring_size);
- return (WAVEHDR*)(_ring + position * _ring_item_size);
-}
-
-inline void WavePlayer::move_head()
-{
- _head = (_head + 1) % _ring_size;
- _in_use--;
-}
-
-void WavePlayer::reclaim()
-{
- while (_in_use) {
- WAVEHDR* front_buf = wave_hader(_head);
- if (!(front_buf->dwFlags & WHDR_DONE)) {
- break;
- }
- MMRESULT err = waveOutUnprepareHeader(_wave_out, front_buf, sizeof(WAVEHDR));
- if (err != MMSYSERR_NOERROR) {
- LOG_WARN("waveOutUnprepareHeader failed %u", err);
- }
- front_buf->dwFlags &= ~WHDR_DONE;
- move_head();
- }
-}
-
-WAVEHDR* WavePlayer::get_buff()
-{
- reclaim();
- if (_in_use == _ring_size) {
- return NULL;
- }
-
- WAVEHDR* buff = wave_hader((_head + _in_use) % _ring_size);
- ++_in_use;
- return buff;
-}
-
-bool WavePlayer::write(uint8_t* frame)
-{
- WAVEHDR* buff = get_buff();
- if (buff) {
- memcpy(buff->lpData, frame, _frame_bytes);
- MMRESULT err;
- err = waveOutPrepareHeader(_wave_out, buff, sizeof(WAVEHDR));
-
- if (err != MMSYSERR_NOERROR) {
- THROW("waveOutPrepareHeader filed %d", err);
- }
- err = waveOutWrite(_wave_out, buff, sizeof(WAVEHDR));
- if (err != MMSYSERR_NOERROR) {
- THROW("waveOutWrite filed %d", err);
- }
- }
- if (_paused && _in_use == _start_mark) {
- _paused = false;
- waveOutRestart(_wave_out);
- }
- return true;
-}
-
-void WavePlayer::drain()
-{
-}
-
-void WavePlayer::stop()
-{
- drain();
- waveOutReset(_wave_out);
- waveOutPause(_wave_out);
- _paused = true;
- reclaim();
-}
-
-bool WavePlayer::abort()
-{
- return true;
-}
-
-uint32_t WavePlayer::get_delay_ms()
-{
- return _in_use * WavePlaybackAbstract::FRAME_SIZE / _samples_per_ms;
-}
diff --git a/client/windows/playback.h b/client/windows/playback.h
deleted file mode 100644
index 6493eff4..00000000
--- a/client/windows/playback.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_WINDOWS_AUDIO_PLAYBACK
-#define _H_WINDOWS_AUDIO_PLAYBACK
-
-#include "audio_devices.h"
-
-class WavePlayer: public WavePlaybackAbstract {
-public:
- WavePlayer(uint32_t samples_per_sec, uint32_t bits_per_sample, uint32_t channels);
- virtual ~WavePlayer();
-
- virtual bool write(uint8_t* frame);
- virtual bool abort();
- virtual void stop();
- virtual uint32_t get_delay_ms();
-
-private:
- WAVEHDR* wave_hader(uint32_t position);
- void move_head();
- WAVEHDR* get_buff();
- void reclaim();
- void drain();
- void init_ring(uint32_t sample_bytes);
-
-private:
- HWAVEOUT _wave_out;
- uint32_t _samples_per_ms;
- uint32_t _frame_bytes;
- uint32_t _start_mark;
- uint32_t _ring_item_size;
- uint8_t* _ring;
- uint32_t _ring_size;
- uint32_t _head;
- uint32_t _in_use;
- bool _paused;
-};
-
-#endif
diff --git a/client/windows/record.cpp b/client/windows/record.cpp
deleted file mode 100644
index a2e5f393..00000000
--- a/client/windows/record.cpp
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-#include "record.h"
-#include "utils.h"
-#include "debug.h"
-
-#define RING_SIZE_MS 500
-
-static void CALLBACK in_proc(HWAVEIN handle, UINT msg, DWORD user_data, DWORD param1,
- DWORD param2)
-{
- WaveRecorder* recorder = (WaveRecorder*)user_data;
- recorder->trigger();
-}
-
-WaveRecorder::WaveRecorder(Platform::RecordClient& client, uint32_t samples_per_sec,
- uint32_t bits_per_sample, uint32_t channels)
- : _client (client)
- , _ring (NULL)
- , _head (0)
- , _in_use (0)
- , _frame (NULL)
-{
- WAVEFORMATEX info;
- uint32_t frame_align;
-
- info.wFormatTag = WAVE_FORMAT_PCM;
- info.nChannels = channels;
- info.nSamplesPerSec = samples_per_sec;
- info.nBlockAlign = frame_align = channels * bits_per_sample / 8;
- info.nAvgBytesPerSec = samples_per_sec * info.nBlockAlign;
- info.wBitsPerSample = bits_per_sample;
-
-
- if (waveInOpen(&_wave_in, WAVE_MAPPER, &info, (DWORD_PTR)in_proc, (DWORD_PTR)this,
- CALLBACK_FUNCTION) != MMSYSERR_NOERROR) {
- throw Exception("cannot open playback device");
- }
-
- try {
- const int frame_size = WavePlaybackAbstract::FRAME_SIZE;
- uint32_t frame_bytes = frame_size * channels * bits_per_sample / 8;
-
- _frame = new uint8_t[frame_bytes];
- _frame_pos = _frame;
- _frame_end = _frame + frame_bytes;
- init_ring(samples_per_sec, frame_bytes, frame_align);
- _client.add_event_source(*this);
- } catch (...) {
- delete[] _ring;
- delete[] _frame;
- waveInClose(_wave_in);
- throw;
- }
-}
-
-WaveRecorder::~WaveRecorder()
-{
- waveInReset(_wave_in);
- reclaim();
- _client.remove_event_source(*this);
- waveInClose(_wave_in);
- delete[] _ring;
- delete[] _frame;
-}
-
-void WaveRecorder::init_ring(uint32_t samples_per_sec, uint32_t frame_bytes, uint32_t frame_align)
-{
- const int frame_size = WavePlaybackAbstract::FRAME_SIZE;
-
- _ring_size = (samples_per_sec * RING_SIZE_MS / 1000) / frame_size;
- _ring_item_size = sizeof(WAVEHDR) + frame_bytes + frame_align;
-
- int ring_bytes = _ring_size * _ring_item_size;
- _ring = new uint8_t[ring_bytes];
-
- uint8_t* ptr = _ring;
- uint8_t* end = ptr + ring_bytes;
- for (; ptr != end; ptr += _ring_item_size) {
- WAVEHDR* buf = (WAVEHDR*)ptr;
- memset(ptr, 0, _ring_item_size);
- buf->dwBufferLength = frame_bytes;
- ULONG_PTR ptr = (ULONG_PTR)(buf + 1);
- ptr = (ptr + frame_align - 1) / frame_align * frame_align;
- buf->lpData = (LPSTR)(buf + 1);
- }
-}
-
-void WaveRecorder::start()
-{
- _frame_pos = _frame;
- waveInReset(_wave_in);
- push_frames();
- waveInStart(_wave_in);
-}
-
-inline WAVEHDR* WaveRecorder::wave_hader(uint32_t position)
-{
- ASSERT(position < _ring_size);
- return (WAVEHDR*)(_ring + position * _ring_item_size);
-}
-
-inline void WaveRecorder::move_head()
-{
- _head = (_head + 1) % _ring_size;
- _in_use--;
-}
-
-void WaveRecorder::push_frames()
-{
- while (_in_use != _ring_size) {
- WAVEHDR* buff = wave_hader((_head + _in_use) % _ring_size);
- ++_in_use;
-
- MMRESULT err = waveInPrepareHeader(_wave_in, buff, sizeof(WAVEHDR));
- if (err != MMSYSERR_NOERROR) {
- THROW("waveInPrepareHeader filed %d", err);
- }
- err = waveInAddBuffer(_wave_in, buff, sizeof(WAVEHDR));
- if (err != MMSYSERR_NOERROR) {
- THROW("waveInAddBuffer filed %d", err);
- }
- }
-}
-
-void WaveRecorder::on_event()
-{
- while (_in_use) {
- WAVEHDR* front_buf = wave_hader(_head);
- if (!(front_buf->dwFlags & WHDR_DONE)) {
- break;
- }
- waveInUnprepareHeader(_wave_in, front_buf, sizeof(WAVEHDR));
- front_buf->dwFlags &= ~WHDR_DONE;
- int n = front_buf->dwBytesRecorded;
- front_buf->dwBytesRecorded = 0;
- uint8_t* ptr = (uint8_t*)front_buf->lpData;
- while (n) {
- int now = MIN(n, _frame_end - _frame_pos);
- memcpy(_frame_pos, ptr, now);
- if ((_frame_pos += n) == _frame_end) {
- _client.push_frame(_frame);
- _frame_pos = _frame;
- }
- n -= now;
- ptr += now;
- }
- move_head();
- push_frames();
- }
-}
-
-void WaveRecorder::reclaim()
-{
- while (_in_use) {
- WAVEHDR* front_buf = wave_hader(_head);
- if (!(front_buf->dwFlags & WHDR_DONE)) {
- break;
- }
- waveInUnprepareHeader(_wave_in, front_buf, sizeof(WAVEHDR));
- front_buf->dwFlags &= ~WHDR_DONE;
- front_buf->dwBytesRecorded = 0;
- move_head();
- }
-}
-
-void WaveRecorder::stop()
-{
- waveInReset(_wave_in);
- reclaim();
-}
-
-bool WaveRecorder::abort()
-{
- return true;
-}
diff --git a/client/windows/record.h b/client/windows/record.h
deleted file mode 100644
index 73264197..00000000
--- a/client/windows/record.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_WINDOWS_RECORD
-#define _H_WINDOWS_RECORD
-
-#include "audio_devices.h"
-#include "platform.h"
-
-class WaveRecorder: public WaveRecordAbstract, public EventSources::Trigger {
-public:
- WaveRecorder(Platform::RecordClient& client, uint32_t samples_per_sec,
- uint32_t bits_per_sample, uint32_t channels);
- virtual ~WaveRecorder();
-
- virtual void start();
- virtual void stop();
- virtual bool abort();
-
- virtual void on_event();
-
-private:
- void init_ring(uint32_t samples_per_sec, uint32_t frame_bytes, uint32_t frame_align);
- WAVEHDR* wave_hader(uint32_t position);
- void move_head();
-
- void reclaim();
- void push_frames();
-
-private:
- Platform::RecordClient& _client;
- HWAVEIN _wave_in;
- uint8_t* _ring;
- uint32_t _ring_item_size;
- uint32_t _ring_size;
- uint32_t _head;
- uint32_t _in_use;
- uint8_t* _frame;
- uint8_t* _frame_pos;
- uint8_t* _frame_end;
-};
-
-#endif
diff --git a/client/windows/red_drawable.cpp b/client/windows/red_drawable.cpp
deleted file mode 100644
index 65c1aa6c..00000000
--- a/client/windows/red_drawable.cpp
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-#include "red_drawable.h"
-#include "pixels_source_p.h"
-#include "utils.h"
-#include "threads.h"
-
-static const uint64_t lock_timout = 1000 * 1000 * 10; /*10ms*/
-
-void RedDrawable::copy_pixels(const PixelsSource& src, int src_x, int src_y, const SpiceRect& dest)
-{
- PixelsSource_p* dest_p_data = (PixelsSource_p*)get_opaque();
- PixelsSource_p* src_p_data = (PixelsSource_p*)src.get_opaque();
-
- for (;;) {
- Lock lock(*dest_p_data->_mutex);
- Lock timed_lock(*src_p_data->_mutex, lock_timout);
- if (!timed_lock.is_locked()) {
- continue;
- }
- BitBlt(dest_p_data->dc, dest.left + _origin.x, dest.top + _origin.y,
- dest.right - dest.left, dest.bottom - dest.top,
- src_p_data->dc, src_x + src._origin.x,
- src_y + src._origin.y, SRCCOPY);
- return;
- }
-}
-
-void RedDrawable::blend_pixels(const PixelsSource& src, int src_x, int src_y, const SpiceRect& dest)
-{
- static BLENDFUNCTION blend_func = { AC_SRC_OVER, 0, 0xff, AC_SRC_ALPHA};
-
- int width = dest.right - dest.left;
- int height = dest.bottom - dest.top;
- PixelsSource_p* dest_p_data = (PixelsSource_p*)get_opaque();
- PixelsSource_p* src_p_data = (PixelsSource_p*)src.get_opaque();
- for (;;) {
- RecurciveLock lock(*dest_p_data->_mutex);
- RecurciveLock timed_lock(*src_p_data->_mutex, lock_timout);
- if (!timed_lock.is_locked()) {
- continue;
- }
- AlphaBlend(dest_p_data->dc, dest.left + _origin.x, dest.top + _origin.y, width, height,
- src_p_data->dc, src_x + src._origin.x, src_y + src._origin.y, width, height,
- blend_func);
- return;
- }
-}
-
-void RedDrawable::combine_pixels(const PixelsSource& src, int src_x, int src_y, const SpiceRect& dest,
- CombineOP op)
-{
- DWORD rop;
- switch (op) {
- case OP_COPY:
- rop = SRCCOPY;
- break;
- case OP_AND:
- rop = SRCAND;
- break;
- case OP_XOR:
- rop = SRCINVERT;
- break;
- default:
- THROW("invalid op %d", op);
- }
-
- PixelsSource_p* dest_p_data = (PixelsSource_p*)get_opaque();
- PixelsSource_p* src_p_data = (PixelsSource_p*)src.get_opaque();
- for (;;) {
- RecurciveLock lock(*dest_p_data->_mutex);
- RecurciveLock timed_lock(*src_p_data->_mutex, lock_timout);
- if (!timed_lock.is_locked()) {
- continue;
- }
- BitBlt(dest_p_data->dc, dest.left + _origin.x, dest.top + _origin.y,
- dest.right - dest.left, dest.bottom - dest.top,
- src_p_data->dc, src_x + src._origin.x,
- src_y + src._origin.y, rop);
- return;
- }
-}
-
-void RedDrawable::erase_rect(const SpiceRect& rect, rgb32_t color)
-{
- RECT r;
- r.left = rect.left + _origin.x;
- r.right = rect.right + _origin.x;
- r.top = rect.top + _origin.y;
- r.bottom = rect.bottom + _origin.y;
-
- PixelsSource_p* dest_p_data = (PixelsSource_p*)get_opaque();
- RecurciveLock lock(*dest_p_data->_mutex);
- FillRect(dest_p_data->dc, &r, (HBRUSH)GetStockObject(BLACK_BRUSH));
-}
-
-void RedDrawable::fill_rect(const SpiceRect& rect, rgb32_t color)
-{
- RECT r;
- r.left = rect.left + _origin.x;
- r.right = rect.right + _origin.x;
- r.top = rect.top + _origin.y;
- r.bottom = rect.bottom + _origin.y;
-
- HBRUSH brush = CreateSolidBrush(RGB(rgb32_get_red(color),
- rgb32_get_green(color),
- rgb32_get_blue(color)));
- for (;;) {
- PixelsSource_p* dest_p_data = (PixelsSource_p*)get_opaque();
- RecurciveLock lock(*dest_p_data->_mutex);
- FillRect(dest_p_data->dc, &r, brush);
- break;
- }
- DeleteObject(brush);
-}
-
-void RedDrawable::frame_rect(const SpiceRect& rect, rgb32_t color)
-{
- RECT r;
- r.left = rect.left + _origin.x;
- r.right = rect.right + _origin.x;
- r.top = rect.top + _origin.y;
- r.bottom = rect.bottom + _origin.y;
- HBRUSH brush = CreateSolidBrush(RGB(rgb32_get_red(color),
- rgb32_get_green(color),
- rgb32_get_blue(color)));
- for (;;) {
- PixelsSource_p* dest_p_data = (PixelsSource_p*)get_opaque();
- RecurciveLock lock(*dest_p_data->_mutex);
- FrameRect(dest_p_data->dc, &r, brush);
- break;
- }
- DeleteObject(brush);
-}
diff --git a/client/windows/red_pixmap_gdi.cpp b/client/windows/red_pixmap_gdi.cpp
deleted file mode 100644
index 132ee6cc..00000000
--- a/client/windows/red_pixmap_gdi.cpp
+++ /dev/null
@@ -1,121 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-#include "red_pixmap_gdi.h"
-#include "red_pixmap.h"
-#include "debug.h"
-#include "utils.h"
-#include "pixels_source_p.h"
-#include "platform_utils.h"
-
-struct RedPixmap_p {
- PixelsSource_p pixels_source_p;
- HBITMAP prev_bitmap;
-};
-
-RedPixmapGdi::RedPixmapGdi(int width, int height, RedDrawable::Format format, bool top_bottom)
- : RedPixmap(width, height, format, top_bottom)
-{
- DWORD *pixel_format;
- ASSERT(format == RedDrawable::ARGB32 || format == RedDrawable::RGB32
- || format == RedDrawable::RGB16_555 || format == RedDrawable::RGB16_565
- || format == RedDrawable::A1);
- ASSERT(sizeof(RedPixmap_p) <= PIXELES_SOURCE_OPAQUE_SIZE);
-
- struct {
- BITMAPINFO inf;
- RGBQUAD palette[255];
- } bitmap_info;
-
- memset(&bitmap_info, 0, sizeof(bitmap_info));
- bitmap_info.inf.bmiHeader.biSize = sizeof(bitmap_info.inf.bmiHeader);
- bitmap_info.inf.bmiHeader.biWidth = _width;
- bitmap_info.inf.bmiHeader.biHeight = top_bottom ? -_height : _height;
-
- bitmap_info.inf.bmiHeader.biPlanes = 1;
- bitmap_info.inf.bmiHeader.biBitCount = RedDrawable::format_to_bpp(format);
- if (format == RedDrawable::RGB16_565) {
- bitmap_info.inf.bmiHeader.biCompression = BI_BITFIELDS;
-
- } else {
- bitmap_info.inf.bmiHeader.biCompression = BI_RGB;
- }
- switch (format) {
- case RedDrawable::A1:
- bitmap_info.inf.bmiColors[0].rgbRed = 0;
- bitmap_info.inf.bmiColors[0].rgbGreen = 0;
- bitmap_info.inf.bmiColors[0].rgbBlue = 0;
-#ifndef __MINGW32__
- // inf.bmiColors is [1] in mingw/include/wingdi.h
- bitmap_info.inf.bmiColors[1].rgbRed = 0xff;
- bitmap_info.inf.bmiColors[1].rgbGreen = 0xff;
- bitmap_info.inf.bmiColors[1].rgbBlue = 0xff;
-#endif
- break;
- case RedDrawable::RGB16_565:
- pixel_format = (DWORD *)bitmap_info.inf.bmiColors;
- pixel_format[0] = 0xf800;
- pixel_format[1] = 0x07e0;
- pixel_format[2] = 0x001f;
- break;
- case RedDrawable::ARGB32:
- case RedDrawable::RGB32:
- case RedDrawable::RGB16_555:
- break;
- }
- AutoDC dc(create_compatible_dc());
- AutoGDIObject bitmap(CreateDIBSection(dc.get(), &bitmap_info.inf, 0,
- (VOID **)&_data, NULL, 0));
- if (!bitmap.valid()) {
- THROW("create compatible bitmap failed");
- }
- memset(_data, 1, 1);
- ((RedPixmap_p*)get_opaque())->prev_bitmap = (HBITMAP)SelectObject(dc.get(), bitmap.release());
- ((RedPixmap_p*)get_opaque())->pixels_source_p.dc = dc.release();
-}
-
-HDC RedPixmapGdi::get_dc()
-{
- return ((RedPixmap_p*)get_opaque())->pixels_source_p.dc;
-}
-
-void *RedPixmapGdi::get_memptr()
-{
- return _data;
-}
-
-RedPixmapGdi::~RedPixmapGdi()
-{
- HDC dc = ((RedPixmap_p*)get_opaque())->pixels_source_p.dc;
- if (dc) {
- HBITMAP prev_bitmap = ((RedPixmap_p*)get_opaque())->prev_bitmap;
- HBITMAP bitmap = (HBITMAP)SelectObject(dc, prev_bitmap);
- DeleteObject(bitmap);
- DeleteDC(dc);
- }
-}
-
-RecurciveMutex& RedPixmapGdi::get_mutex()
-{
- RedPixmap_p* p_data = (RedPixmap_p*)get_opaque();
- return *p_data->pixels_source_p._mutex;
-}
diff --git a/client/windows/red_pixmap_sw.cpp b/client/windows/red_pixmap_sw.cpp
deleted file mode 100644
index fac40a06..00000000
--- a/client/windows/red_pixmap_sw.cpp
+++ /dev/null
@@ -1,120 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-#include "red_pixmap_sw.h"
-#include "red_pixmap.h"
-#include "debug.h"
-#include "utils.h"
-#include "pixels_source_p.h"
-#include "platform_utils.h"
-
-struct RedPixmap_p {
- PixelsSource_p pixels_source_p;
- HBITMAP prev_bitmap;
-};
-
-RedPixmapSw::RedPixmapSw(int width, int height, RedDrawable::Format format,
- bool top_bottom, RedWindow *win)
- : RedPixmap(width, height, format, top_bottom)
-{
- DWORD *pixel_format;
- ASSERT(format == RedDrawable::ARGB32 || format == RedDrawable::RGB32
- || format == RedDrawable::RGB16_555 || format == RedDrawable::RGB16_565
- || format == RedDrawable::A1);
- ASSERT(sizeof(RedPixmap_p) <= PIXELES_SOURCE_OPAQUE_SIZE);
-
- struct {
- BITMAPINFO inf;
- RGBQUAD palette[255];
- } bitmap_info;
-
- memset(&bitmap_info, 0, sizeof(bitmap_info));
- bitmap_info.inf.bmiHeader.biSize = sizeof(bitmap_info.inf.bmiHeader);
- bitmap_info.inf.bmiHeader.biWidth = _width;
- bitmap_info.inf.bmiHeader.biHeight = top_bottom ? -_height : _height;
-
-/*#ifdef USE_OPENGL
- // -----------------------------------------------------------------------------
- // ensure valid access to additional stride.
- // apparently glReadPixels validate ((ptr of last line) + GL_PACK_ROW_LENGTH + 1).
- // seen on "ATI Radeon HD 2400 PRO" "2.0.6479 Release"
- if (top_bottom) {
- bitmap_info.inf.bmiHeader.biHeight--;
- } else {
- bitmap_info.inf.bmiHeader.biHeight++;
- }
- //------------------------------------------------------------------------------
-#endif*/
-
- bitmap_info.inf.bmiHeader.biPlanes = 1;
- bitmap_info.inf.bmiHeader.biBitCount = RedDrawable::format_to_bpp(format);
- if (format == RedDrawable::RGB16_565) {
- bitmap_info.inf.bmiHeader.biCompression = BI_BITFIELDS;
- } else {
- bitmap_info.inf.bmiHeader.biCompression = BI_RGB;
- }
- switch (format) {
- case RedDrawable::A1:
- bitmap_info.inf.bmiColors[0].rgbRed = 0;
- bitmap_info.inf.bmiColors[0].rgbGreen = 0;
- bitmap_info.inf.bmiColors[0].rgbBlue = 0;
-#ifndef __MINGW32__
- // inf.bmiColors is [1] in mingw/include/wingdi.h
- bitmap_info.inf.bmiColors[1].rgbRed = 0xff;
- bitmap_info.inf.bmiColors[1].rgbGreen = 0xff;
- bitmap_info.inf.bmiColors[1].rgbBlue = 0xff;
-#endif
- break;
- case RedDrawable::RGB16_565:
- pixel_format = (DWORD *)bitmap_info.inf.bmiColors;
- pixel_format[0] = 0xf800;
- pixel_format[1] = 0x07e0;
- pixel_format[2] = 0x001f;
- break;
- case RedDrawable::ARGB32:
- case RedDrawable::RGB32:
- case RedDrawable::RGB16_555:
- break;
- }
- AutoDC dc(create_compatible_dc());
- AutoGDIObject bitmap(CreateDIBSection(dc.get(), &bitmap_info.inf, 0,
- (VOID **)&_data, NULL, 0));
- if (!bitmap.valid()) {
- THROW("create compatible bitmap failed");
- }
-/*#ifdef USE_OPENGL
- SetWindowOrgEx(dc.get(), 0, -1, NULL); // compensate for one pad line
-#endif*/
- ((RedPixmap_p*)get_opaque())->prev_bitmap = (HBITMAP)SelectObject(dc.get(), bitmap.release());
- ((RedPixmap_p*)get_opaque())->pixels_source_p.dc = dc.release();
-}
-
-RedPixmapSw::~RedPixmapSw()
-{
- HDC dc = ((RedPixmap_p*)get_opaque())->pixels_source_p.dc;
- if (dc) {
- HBITMAP prev_bitmap = ((RedPixmap_p*)get_opaque())->prev_bitmap;
- HBITMAP bitmap = (HBITMAP)SelectObject(dc, prev_bitmap);
- DeleteObject(bitmap);
- DeleteDC(dc);
- }
-}
diff --git a/client/windows/red_window.cpp b/client/windows/red_window.cpp
deleted file mode 100644
index fcb033bf..00000000
--- a/client/windows/red_window.cpp
+++ /dev/null
@@ -1,1106 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-#include "red_window.h"
-#include "pixels_source_p.h"
-#include "utils.h"
-#include "debug.h"
-#include <spice/protocol.h>
-#include "menu.h"
-#include "win_platform.h"
-#include "platform_utils.h"
-
-#include <list>
-
-#define NATIVE_CAPTION_STYLE (WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX)
-
-extern HINSTANCE instance;
-
-static ATOM class_atom = 0;
-static const LPCWSTR win_class_name = L"redc_wclass";
-static HWND focus_window = NULL;
-static HHOOK low_keyboard_hook = NULL;
-static bool low_keyboard_hook_on = false;
-static HHOOK msg_filter_hook = NULL;
-typedef std::list<RedKey> KeysList;
-static KeysList filtered_up_keys;
-
-static LRESULT CALLBACK MessageFilterProc(int nCode, WPARAM wParam, LPARAM lParam);
-
-static inline int to_red_mouse_state(WPARAM wParam)
-{
- return ((wParam & MK_LBUTTON) ? SPICE_MOUSE_BUTTON_MASK_LEFT : 0) |
- ((wParam & MK_MBUTTON) ? SPICE_MOUSE_BUTTON_MASK_MIDDLE : 0) |
- ((wParam & MK_RBUTTON) ? SPICE_MOUSE_BUTTON_MASK_RIGHT : 0);
-}
-
-// Return true if VK_RCONTROL is followed by a VK_RMENU with the same timestamp.
-static bool is_fake_ctrl(UINT message, WPARAM wParam, LPARAM lParam)
-{
- if ((wParam == VK_CONTROL) && ((HIWORD (lParam) & KF_EXTENDED) == 0)) {
- UINT next_peek;
- if (message == WM_KEYDOWN) {
- next_peek = WM_KEYDOWN;
- } else if (message == WM_SYSKEYUP) {
- next_peek = WM_KEYUP;
- } else {
- next_peek = WM_NULL;
- }
- if (next_peek != WM_NULL) {
- MSG next_msg;
- LONG time = GetMessageTime();
- BOOL msg_exist = PeekMessage(&next_msg, NULL,
- next_peek, next_peek, PM_NOREMOVE);
- if ((msg_exist == TRUE) && ((LONG)next_msg.time == time) &&
- (next_msg.wParam == VK_MENU) &&
- (HIWORD (next_msg.lParam) & KF_EXTENDED)) {
- return true;
- }
- }
- }
- return false;
-}
-
-static inline RedKey translate_key(UINT message, WPARAM wParam, LPARAM lParam)
-{
- uint32_t scan = HIWORD(lParam) & 0xff;
- if (scan == 0) {
- return REDKEY_INVALID;
- }
- switch (wParam) {
- case VK_PAUSE:
- return REDKEY_PAUSE;
- case VK_SNAPSHOT:
- return REDKEY_CTRL_PRINT_SCREEN;
- case VK_NUMLOCK:
- return REDKEY_NUM_LOCK;
- case VK_HANGUL:
- return REDKEY_KOREAN_HANGUL;
- case VK_HANJA:
- return REDKEY_KOREAN_HANGUL_HANJA;
- case VK_PROCESSKEY:
- if (scan == 0xf1) {
- return REDKEY_INVALID; // prevent double key (VK_PROCESSKEY + VK_HANJA)
- } else if (scan == 0xf2) {
- return REDKEY_KOREAN_HANGUL;
- }
- break;
- case VK_CONTROL:
- // Ignore the fake right ctrl message which is send when alt-gr is
- // pressed when using a non-US keyboard layout.
- if (is_fake_ctrl(message, wParam, lParam)) {
- return REDKEY_INVALID;
- }
- break;
- default:
- break;
- }
- // TODO: always use virtual key
- bool extended = ((HIWORD (lParam) & KF_EXTENDED) != 0);
- if (extended) {
- scan += REDKEY_ESCAPE_BASE;
- }
- return (RedKey)scan;
-}
-
-static inline void send_filtered_keys(RedWindow* window)
-{
- KeysList::iterator iter;
-
- for (iter = filtered_up_keys.begin(); iter != filtered_up_keys.end(); iter++) {
- window->get_listener().on_key_release(*iter);
- }
- filtered_up_keys.clear();
-}
-
-static inline bool is_high_surrogate(uint32_t val)
-{
- return val >= 0xd800 && val <= 0xdbff;
-}
-
-static inline bool is_low_surrogate(uint32_t val)
-{
- return val >= 0xdc00 && val <= 0xdfff;
-}
-
-static uint32_t utf16_to_utf32(uint16_t*& utf16, int& len)
-{
- if (!len) {
- return 0;
- }
-
- uint32_t val = utf16[0];
-
- if (!is_high_surrogate(val)) {
- utf16++;
- len--;
- return val;
- }
-
- if (len < 2) {
- THROW("partial char");
- }
-
- uint32_t val2 = utf16[1];
-
- if (!is_low_surrogate(val2)) {
- THROW("invalid sequence");
- }
-
- utf16 += 2;
- len -= 2;
-
- return (((val & 0x3ff) << 10) | (val2 & 0x3ff)) + 0x10000;
-}
-
-LRESULT CALLBACK RedWindow_p::WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
-{
- RedWindow* window = (RedWindow*)GetWindowLongPtr(hWnd, GWLP_USERDATA);
- ASSERT(window);
-
- switch (message) {
- case WM_PAINT: {
- PAINTSTRUCT ps;
-
- BeginPaint(hWnd, &ps);
- SpicePoint origin = window->get_origin();
- SpiceRect r;
- r.left = ps.rcPaint.left - origin.x;
- r.top = ps.rcPaint.top - origin.y;
- r.right = ps.rcPaint.right - origin.x;
- r.bottom = ps.rcPaint.bottom - origin.y;
- window->get_listener().on_exposed_rect(r);
- EndPaint(hWnd, &ps);
- break;
- }
- case WM_MOUSEMOVE: {
- SpicePoint origin = window->get_origin();
- int x = LOWORD(lParam) - origin.x;
- int y = HIWORD(lParam) - origin.y;
- unsigned int buttons_state = to_red_mouse_state(wParam);
- if (!window->_pointer_in_window) {
- window->on_pointer_enter(x, y, buttons_state);
- } else {
- window->get_listener().on_pointer_motion(x, y, buttons_state);
- }
- break;
- }
- case WM_MOUSELEAVE:
- window->on_pointer_leave();
- break;
- case WM_SETFOCUS:
- window->on_focus_in();
- break;
- case WM_KILLFOCUS:
- window->on_focus_out();
- break;
- case WM_LBUTTONDOWN:
- window->get_listener().on_mouse_button_press(SPICE_MOUSE_BUTTON_LEFT,
- to_red_mouse_state(wParam));
- break;
- case WM_LBUTTONUP:
- window->get_listener().on_mouse_button_release(SPICE_MOUSE_BUTTON_LEFT,
- to_red_mouse_state(wParam));
- break;
- case WM_RBUTTONDOWN:
- window->get_listener().on_mouse_button_press(SPICE_MOUSE_BUTTON_RIGHT,
- to_red_mouse_state(wParam));
- break;
- case WM_RBUTTONUP:
- window->get_listener().on_mouse_button_release(SPICE_MOUSE_BUTTON_RIGHT,
- to_red_mouse_state(wParam));
- break;
- case WM_MBUTTONDOWN:
- window->get_listener().on_mouse_button_press(SPICE_MOUSE_BUTTON_MIDDLE,
- to_red_mouse_state(wParam));
- break;
- case WM_MBUTTONUP:
- window->get_listener().on_mouse_button_release(SPICE_MOUSE_BUTTON_MIDDLE,
- to_red_mouse_state(wParam));
- break;
- case WM_MOUSEWHEEL:
- if (HIWORD(wParam) & 0x8000) {
- window->get_listener().on_mouse_button_press(SPICE_MOUSE_BUTTON_DOWN,
- to_red_mouse_state(wParam));
- window->get_listener().on_mouse_button_release(SPICE_MOUSE_BUTTON_DOWN,
- to_red_mouse_state(wParam));
- } else {
- window->get_listener().on_mouse_button_press(SPICE_MOUSE_BUTTON_UP,
- to_red_mouse_state(wParam));
- window->get_listener().on_mouse_button_release(SPICE_MOUSE_BUTTON_UP,
- to_red_mouse_state(wParam));
- }
- break;
- case WM_SYSKEYDOWN:
- case WM_KEYDOWN: {
- RedKey key = translate_key(message, wParam, lParam);
- window->get_listener().on_key_press(key);
-
- BYTE key_state[256];
- WCHAR buff[10];
- uint16_t* str_buf = (uint16_t*)buff;
- GetKeyboardState(key_state);
- int n = ToUnicode(wParam, HIWORD(lParam) & 0xff, key_state, buff, 10, 0);
- if (n > 0) {
- uint32_t utf32;
- while ((utf32 = utf16_to_utf32(str_buf, n)) != 0) {
- window->get_listener().on_char(utf32);
- }
- }
-
- // Allow Windows to translate Alt-F4 to WM_CLOSE message.
- if (!window->_key_interception_on) {
- return DefWindowProc(hWnd, message, wParam, lParam);
- }
- break;
- }
- case WM_SYSKEYUP:
- case WM_KEYUP: {
- RedKey key = translate_key(message, wParam, lParam);
- window->get_listener().on_key_release(key);
- break;
- }
- case WM_DESTROY:
- PostQuitMessage(0);
- break;
- case WM_GETMINMAXINFO: {
- MINMAXINFO* info = (MINMAXINFO*)lParam;
- info->ptMaxSize.x = window->_window_size.x;
- info->ptMaxSize.y = window->_window_size.y;
- info->ptMinTrackSize = info->ptMaxSize;
- info->ptMaxTrackSize = info->ptMaxSize;
- info->ptMaxPosition.x = info->ptMaxPosition.y = 0;
- break;
- }
- case WM_SYSCOMMAND:
- if (window->prossec_menu_commands(wParam & ~0x0f)) {
- break;
- }
- return DefWindowProc(hWnd, message, wParam, lParam);
- case WM_ENTERSIZEMOVE:
- case WM_ENTERMENULOOP:
- ASSERT(filtered_up_keys.empty());
- DBG(0, "enter modal");
- window->get_listener().enter_modal_loop();
- WinPlatform::enter_modal_loop();
- if (msg_filter_hook) {
- LOG_WARN("entering modal loop while filter hook is active");
- UnhookWindowsHookEx(msg_filter_hook);
- }
- msg_filter_hook = SetWindowsHookEx(WH_MSGFILTER, MessageFilterProc,
- GetModuleHandle(NULL), GetCurrentThreadId());
- return DefWindowProc(hWnd, message, wParam, lParam);
- case WM_EXITSIZEMOVE:
- case WM_EXITMENULOOP:
- DBG(0, "exit modal");
- window->get_listener().exit_modal_loop();
- WinPlatform::exit_modal_loop();
- UnhookWindowsHookEx(msg_filter_hook);
- msg_filter_hook = NULL;
- send_filtered_keys(window);
- return DefWindowProc(hWnd, message, wParam, lParam);
- case WM_SETCURSOR:
- if (!window->_pointer_in_window) {
- return DefWindowProc(hWnd, message, wParam, lParam);
- }
- break;
- case WM_SIZE:
- if (wParam == SIZE_MINIMIZED) {
- window->on_minimized();
- } else if (wParam == SIZE_RESTORED || wParam == SIZE_MAXIMIZED) {
- window->on_restored();
- }
- break;
- case WM_WINDOWPOSCHANGING:
- window->on_pos_changing(*window);
- return DefWindowProc(hWnd, message, wParam, lParam);
- default:
- return DefWindowProc(hWnd, message, wParam, lParam);
- }
- return 0;
-}
-
-static ATOM register_class(HINSTANCE instance)
-{
- WNDCLASSEX wclass;
-
- wclass.cbSize = sizeof(WNDCLASSEX);
- wclass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
- wclass.lpfnWndProc = DefWindowProc;
- wclass.cbClsExtra = 0;
- wclass.cbWndExtra = 0;
- wclass.hInstance = instance;
- wclass.hIcon = NULL;
- wclass.hCursor = LoadCursor(NULL, IDC_ARROW);
- wclass.hbrBackground = NULL;
- wclass.lpszMenuName = NULL;
- wclass.lpszClassName = win_class_name;
- wclass.hIconSm = NULL;
- return RegisterClassEx(&wclass);
-}
-
-RedWindow_p::RedWindow_p()
- : _win (NULL)
- , _modal_refs (0)
- , _no_taskmgr_dll (NULL)
- , _no_taskmgr_hook (NULL)
- , _focused (false)
- , _pointer_in_window (false)
- , _minimized (false)
- , _valid_pos (false)
- , _sys_menu (NULL)
-{
-}
-
-void RedWindow_p::create(RedWindow& red_window, PixelsSource_p& pixels_source)
-{
- HWND window;
- if (!(window = CreateWindow(win_class_name, L"", NATIVE_CAPTION_STYLE, CW_USEDEFAULT,
- 0, CW_USEDEFAULT, 0, NULL, NULL, NULL, NULL))) {
- THROW("create window failed");
- }
- HDC dc = GetDC(window);
- if (!dc) {
- THROW("get dc failed");
- }
- _win = window;
- pixels_source.dc = dc;
-
- int depth = GetDeviceCaps(dc, BITSPIXEL);
- switch (depth) {
- case 16:
- _format = RedDrawable::RGB16_555;
- break;
- case 32:
- default:
- _format = RedDrawable::RGB32;
- break;
- }
- SetWindowLongPtr(window, GWLP_USERDATA, (LONG_PTR)&red_window);
- SetWindowLongPtr(window, GWLP_WNDPROC, (LONG_PTR)WindowProc);
-}
-
-void RedWindow_p::destroy(PixelsSource_p& pixels_source)
-{
- if (!_win) {
- return;
- }
-
- ReleaseDC(_win, pixels_source.dc);
- SetWindowLongPtr(_win, GWLP_WNDPROC, (LONG_PTR)DefWindowProc);
- SetWindowLongPtr(_win, GWLP_USERDATA, (LONG_PTR)NULL);
- DestroyWindow(_win);
-}
-
-RedDrawable::Format RedWindow::get_format()
-{
- return _format;
-}
-
-
-void RedWindow_p::on_pos_changing(RedWindow& red_window)
-{
- if (_minimized || IsIconic(_win)) {
- return;
- }
- SpicePoint pos = red_window.get_position();
- _x = pos.x;
- _y = pos.y;
- _valid_pos = true;
-}
-
-void RedWindow_p::on_minimized()
-{
- _minimized = true;
-}
-
-void RedWindow_p::on_restored()
-{
- if (!_minimized) {
- return;
- }
- _minimized = false;
- if (!_valid_pos) {
- return;
- }
- _valid_pos = false;
- SetWindowPos(_win, NULL, _x, _y, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER);
-}
-
-bool RedWindow_p::prossec_menu_commands(int cmd)
-{
- CommandMap::iterator iter = _commands_map.find(cmd);
- if (iter == _commands_map.end()) {
- return false;
- }
- (*iter).second.menu->get_target().do_command((*iter).second.command);
- return true;
-}
-
-RedWindow::RedWindow(RedWindow::Listener& listener, int screen_id)
- : _listener (listener)
- , _type (TYPE_NORMAL)
- , _local_cursor (NULL)
- , _cursor_visible (true)
- , _trace_key_interception (false)
- , _key_interception_on (false)
- , _menu (NULL)
-{
- RECT win_rect;
-
- create(*this, *(PixelsSource_p*)get_opaque());
- GetWindowRect(_win, &win_rect);
- _window_size.x = win_rect.right - win_rect.left;
- _window_size.y = win_rect.bottom - win_rect.top;
-}
-
-RedWindow::~RedWindow()
-{
- release_menu(_menu);
- destroy(*(PixelsSource_p*)get_opaque());
- if (_local_cursor) {
- _local_cursor->unref();
- }
-}
-
-void RedWindow::set_title(std::string& title)
-{
- int len = MultiByteToWideChar(CP_UTF8, 0, title.c_str(), title.length(), NULL, 0) + 1;
- WCHAR* wtitle = new WCHAR[len * sizeof(WCHAR)];
-
- if (wtitle && MultiByteToWideChar(CP_UTF8, 0, title.c_str(), title.length(), wtitle, len)) {
- wtitle[len - 1] = L'\0';
- SetWindowText(_win, wtitle);
- }
- delete []wtitle;
-}
-
-void RedWindow::set_icon(Icon* icon)
-{
- if (!icon) {
- return;
- }
- WinIcon* w_icon = (WinIcon *)icon;
- SendMessage(_win, WM_SETICON, (WPARAM)ICON_SMALL, (LPARAM)w_icon->get_handle());
- SendMessage(_win, WM_SETICON, (WPARAM)ICON_BIG, (LPARAM)w_icon->get_handle());
-}
-
-void RedWindow::raise()
-{
- SetWindowPos(_win, NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
-}
-
-void RedWindow::position_after(RedWindow *win)
-{
- HWND after = NULL;
-
- if (win) {
- after = win->_win;
- }
- SetWindowPos(_win, after, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
-}
-
-static LONG to_native_style(RedWindow::Type type)
-{
- LONG win_style;
-
- switch (type) {
- case RedWindow::TYPE_NORMAL:
- win_style = NATIVE_CAPTION_STYLE;
- break;
- case RedWindow::TYPE_FULLSCREEN:
- win_style = 0;
- break;
- default:
- THROW("invalid type %d", type);
- }
- return win_style;
-}
-
-void RedWindow::show(int screen_id)
-{
- if (IsIconic(_win)) {
- ShowWindow(_win, SW_RESTORE);
- }
-
- const UINT set_pos_flags = SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW |
- SWP_FRAMECHANGED;
- HWND pos;
-
- SetWindowLong(_win, GWL_STYLE, to_native_style(_type));
- switch (_type) {
- case TYPE_NORMAL:
- pos = HWND_NOTOPMOST;
- break;
- case TYPE_FULLSCREEN:
- pos = HWND_TOPMOST;
- break;
- default:
- THROW("invalid type %d", _type);
- }
- SetWindowPos(_win, pos, 0, 0, 0, 0, set_pos_flags);
-}
-
-void RedWindow::external_show()
-{
- LONG_PTR style = ::GetWindowLongPtr(_win, GWL_STYLE);
- if ((style & WS_MINIMIZE) == WS_MINIMIZE) {
- ShowWindow(_win, SW_RESTORE);
- } else {
- // Handle the case when hide() was called and the window is not
- // visible. Since we're not the active window, the call just set the
- // windows' style and doesn't show the window.
- if ((style & WS_VISIBLE) != WS_VISIBLE) {
- show(0);
- }
- // We're not the active the window, so we must be attached to the
- // calling thread's message queue before focus is grabbed.
- HWND front = GetForegroundWindow();
- if (front != NULL) {
- DWORD thread = GetWindowThreadProcessId(front, NULL);
- AttachThreadInput(thread, GetCurrentThreadId(), TRUE);
- SetFocus(_win);
- AttachThreadInput(thread, GetCurrentThreadId(), FALSE);
- }
- }
-}
-
-void RedWindow::hide()
-{
- ShowWindow(_win, SW_HIDE);
-}
-
-static void client_to_window_size(HWND win, int width, int height, SpicePoint& win_size,
- RedWindow::Type type)
-{
- RECT area;
-
- SetRect(&area, 0, 0, width, height);
- AdjustWindowRectEx(&area, to_native_style(type), FALSE, GetWindowLong(win, GWL_EXSTYLE));
- win_size.x = area.right - area.left;
- win_size.y = area.bottom - area.top;
-}
-
-void RedWindow::move_and_resize(int x, int y, int width, int height)
-{
- client_to_window_size(_win, width, height, _window_size, _type);
- SetWindowPos(_win, NULL, x, y, _window_size.x, _window_size.y, SWP_NOACTIVATE | SWP_NOZORDER);
- if (_minimized) {
- _valid_pos = true;
- _x = x;
- _y = y;
- }
-}
-
-void RedWindow::move(int x, int y)
-{
- SetWindowPos(_win, NULL, x, y, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER);
- if (_minimized) {
- _valid_pos = true;
- _x = x;
- _y = y;
- }
-}
-
-void RedWindow::resize(int width, int height)
-{
- client_to_window_size(_win, width, height, _window_size, _type);
- SetWindowPos(_win, NULL, 0, 0, _window_size.x, _window_size.y,
- SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER);
-}
-
-void RedWindow::activate()
-{
- SetActiveWindow(_win);
- SetFocus(_win);
-}
-
-void RedWindow::minimize()
-{
- ShowWindow(_win, SW_SHOWMINIMIZED);
-}
-
-void RedWindow::set_mouse_position(int x, int y)
-{
- POINT pt;
- pt.x = x + get_origin().x;
- pt.y = y + get_origin().y;
- ClientToScreen(_win, &pt);
- SetCursorPos(pt.x, pt.y);
-}
-
-class Region_p {
-public:
- Region_p(HRGN region) : _region (region) {}
- ~Region_p() {}
-
- void get_bbox(SpiceRect& bbox) const
- {
- RECT box;
-
- if (GetRgnBox(_region, &box) == 0) {
- THROW("get region bbox failed");
- }
- bbox.left = box.left;
- bbox.right = box.right;
- bbox.top = box.top;
- bbox.bottom = box.bottom;
- }
-
- bool contains_point(int x, int y) const
- {
- return !!PtInRegion(_region, x, y);
- }
-
-private:
- HRGN _region;
-};
-
-bool RedWindow::get_mouse_anchor_point(SpicePoint& pt)
-{
- AutoGDIObject region(CreateRectRgn(0, 0, 0, 0));
- WindowDC win_dc(_win);
-
- GetRandomRgn(*win_dc, (HRGN)region.get(), SYSRGN);
- SpicePoint anchor;
- Region_p region_p((HRGN)region.get());
- if (!find_anchor_point(region_p, anchor)) {
- return false;
- }
- POINT screen_pt;
- screen_pt.x = anchor.x;
- screen_pt.y = anchor.y;
- ScreenToClient(_win, &screen_pt);
- pt.x = screen_pt.x - get_origin().x;
- pt.y = screen_pt.y - get_origin().y;
- return true;
-}
-
-void RedWindow::capture_mouse()
-{
- RECT client_rect;
- POINT origin;
-
- origin.x = origin.y = 0;
- ClientToScreen(_win, &origin);
- GetClientRect(_win, &client_rect);
- OffsetRect(&client_rect, origin.x, origin.y);
- ClipCursor(&client_rect);
-}
-
-void RedWindow::release_mouse()
-{
- ClipCursor(NULL);
-}
-
-void RedWindow::set_cursor(LocalCursor* local_cursor)
-{
- ASSERT(local_cursor);
- if (_local_cursor) {
- _local_cursor->unref();
- }
- _local_cursor = local_cursor->ref();
- if (_pointer_in_window) {
- _local_cursor->set(_win);
- while (ShowCursor(TRUE) < 0);
- }
- _cursor_visible = true;
-}
-
-void RedWindow::hide_cursor()
-{
- if (_cursor_visible) {
- if (_pointer_in_window) {
- while (ShowCursor(FALSE) > -1);
- }
- _cursor_visible = false;
- }
-}
-
-void RedWindow::show_cursor()
-{
- if (!_cursor_visible) {
- if (_pointer_in_window) {
- while (ShowCursor(TRUE) < 0);
- }
- _cursor_visible = true;
- }
-}
-
-SpicePoint RedWindow::get_position()
-{
- SpicePoint position;
- if (_minimized || IsIconic(_win)) {
- if (_valid_pos) {
- position.x = _x;
- position.y = _y;
- } else {
- position.x = position.y = 0;
- }
- } else {
- RECT window_rect;
- GetWindowRect(_win, &window_rect);
- position.x = window_rect.left;
- position.y = window_rect.top;
- }
- return position;
-}
-
-SpicePoint RedWindow::get_size()
-{
- RECT client_rect;
- GetClientRect(_win, &client_rect);
- SpicePoint pt = {client_rect.right - client_rect.left, client_rect.bottom - client_rect.top};
- return pt;
-}
-
-static LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
-{
- if (low_keyboard_hook_on && focus_window && nCode == HC_ACTION) {
- KBDLLHOOKSTRUCT *hooked = (KBDLLHOOKSTRUCT*)lParam;
- DWORD dwMsg = (hooked->flags << 24) | (hooked->scanCode << 16) | 1;
-
- if (hooked->vkCode == VK_NUMLOCK || hooked->vkCode == VK_RSHIFT) {
- dwMsg &= ~(1 << 24);
- SendMessage(focus_window, wParam, hooked->vkCode, dwMsg);
- }
- switch (hooked->vkCode) {
- case VK_CAPITAL:
- case VK_SCROLL:
- case VK_NUMLOCK:
- case VK_LSHIFT:
- case VK_RSHIFT:
- case VK_LCONTROL:
- case VK_RCONTROL:
- case VK_LMENU:
- case VK_RMENU:
- break;
- default:
- SendMessage(focus_window, wParam, hooked->vkCode, dwMsg);
- return 1;
- }
- }
- return CallNextHookEx(NULL, nCode, wParam, lParam);
-}
-
-void RedWindow::do_start_key_interception()
-{
- low_keyboard_hook_on = true;
- _key_interception_on = true;
- _listener.on_start_key_interception();
-}
-
-void RedWindow::do_stop_key_interception()
-{
- low_keyboard_hook_on = false;
- _key_interception_on = false;
- _listener.on_stop_key_interception();
-}
-
-void RedWindow::start_key_interception()
-{
- if (_trace_key_interception) {
- return;
- }
- _trace_key_interception = true;
- if (_focused && _pointer_in_window) {
- do_start_key_interception();
- }
-}
-
-void RedWindow::stop_key_interception()
-{
- if (!_trace_key_interception) {
- return;
- }
- _trace_key_interception = false;
- if (_key_interception_on) {
- do_stop_key_interception();
- }
-}
-
-void RedWindow::init()
-{
- if (!(class_atom = register_class(instance))) {
- THROW("register class failed");
- }
- low_keyboard_hook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc,
- GetModuleHandle(NULL), 0);
-}
-
-void RedWindow::cleanup()
-{
- UnhookWindowsHookEx(low_keyboard_hook);
-}
-
-#ifdef USE_OPENGL
-
-void RedWindow::touch_context_draw()
-{
-}
-
-void RedWindow::touch_context_copy()
-{
-}
-
-void RedWindow::untouch_context()
-{
-}
-
-#endif
-
-void RedWindow::on_focus_in()
-{
- _focused = true;
- focus_window = _win;
- get_listener().on_activate();
- if (_pointer_in_window && _trace_key_interception) {
- do_start_key_interception();
- }
-}
-
-void RedWindow::on_focus_out()
-{
- if (!_focused) {
- return;
- }
-
- _focused = false;
- focus_window = NULL;
-
- if (_key_interception_on) {
- do_stop_key_interception();
- }
- get_listener().on_deactivate();
-}
-
-void RedWindow::on_pointer_enter(int x, int y, unsigned int buttons_state)
-{
- if (_pointer_in_window) {
- return;
- }
-
- if (_cursor_visible) {
- if (_local_cursor) {
- _local_cursor->set(_win);
- }
- while (ShowCursor(TRUE) < 0);
- } else {
- while (ShowCursor(FALSE) > -1);
- }
- _pointer_in_window = true;
- _listener.on_pointer_enter(x, y, buttons_state);
-
- TRACKMOUSEEVENT tme;
- tme.cbSize = sizeof(TRACKMOUSEEVENT);
- tme.dwFlags = TME_LEAVE;
- tme.hwndTrack = _win;
- if (!TrackMouseEvent(&tme)) {
- THROW("track mouse event failed");
- }
- if (_focused && _trace_key_interception) {
- do_start_key_interception();
- }
-}
-
-void RedWindow::on_pointer_leave()
-{
- if (!_pointer_in_window) {
- return;
- }
- if (!_cursor_visible) {
- while (ShowCursor(TRUE) < 0);
- }
- _pointer_in_window = false;
- _listener.on_pointer_leave();
- if (_key_interception_on) {
- do_stop_key_interception();
- }
-}
-
-static void insert_separator(HMENU menu)
-{
- MENUITEMINFO item_info;
- item_info.cbSize = sizeof(item_info);
- item_info.fMask = MIIM_TYPE;
- item_info.fType = MFT_SEPARATOR;
- item_info.dwTypeData = NULL;
- item_info.dwItemData = 0;
- InsertMenuItem(menu, GetMenuItemCount(menu), TRUE, &item_info);
-}
-
-static void utf8_to_wchar(const std::string& src, std::wstring& dest)
-{
- int len = MultiByteToWideChar(CP_UTF8, 0, src.c_str(), -1, NULL, 0);
- if (!len) {
- THROW("fail to conver utf8 to wchar");
- }
- dest.resize(len);
- MultiByteToWideChar(CP_UTF8, 0, src.c_str(), -1, (wchar_t *)dest.c_str(), len);
-}
-
-static void insert_command(HMENU menu, const std::string& name, int id, int state)
-{
- MENUITEMINFO item_info;
- item_info.cbSize = sizeof(item_info);
- item_info.fMask = MIIM_ID | MIIM_STRING | MIIM_STATE;
- item_info.fType = MFT_STRING;
- std::wstring wname;
- utf8_to_wchar(name, wname);
- item_info.cch = wname.size();
- item_info.dwTypeData = (wchar_t *)wname.c_str();
- item_info.wID = id;
- item_info.fState = MFS_ENABLED;
- if (state & Menu::MENU_ITEM_STATE_CHECKED) {
- item_info.fState |= MFS_CHECKED;
- }
- if (state & Menu::MENU_ITEM_STATE_DIM) {
- item_info.fState |= MFS_DISABLED;
- }
- InsertMenuItem(menu, GetMenuItemCount(menu), TRUE, &item_info);
-}
-
-static HMENU insert_sub_menu(HMENU menu, const std::string& name)
-{
- MENUITEMINFO item_info;
- item_info.cbSize = sizeof(item_info);
- item_info.fMask = MIIM_TYPE | MIIM_SUBMENU;
- item_info.fType = MFT_STRING;
- std::wstring wname;
- utf8_to_wchar(name, wname);
- item_info.cch = wname.size();
- item_info.dwTypeData = (wchar_t *)wname.c_str();
- item_info.hSubMenu = CreateMenu();
- InsertMenuItem(menu, GetMenuItemCount(menu), TRUE, &item_info);
- return item_info.hSubMenu;
-}
-
-static int next_free_id = 1;
-static const int last_id = 0x0f00;
-
-static std::list<int> free_sys_menu_id;
-
-static int alloc_sys_cmd_id()
-{
- if (!free_sys_menu_id.empty()) {
- int ret = *free_sys_menu_id.begin();
- free_sys_menu_id.pop_front();
- return ret;
- }
- if (next_free_id == last_id) {
- THROW("failed");
- }
-
- return next_free_id++ << 4;
-}
-
-static void free_sys_cmd_id(int id)
-{
- free_sys_menu_id.push_back(id);
-}
-
-static void insert_menu(Menu* menu, HMENU native, CommandMap& _commands_map)
-{
- int pos = 0;
-
- for (;; pos++) {
- Menu::ItemType type = menu->item_type_at(pos);
- switch (type) {
- case Menu::MENU_ITEM_TYPE_COMMAND: {
- std::string name;
- int command_id;
- int state;
- menu->command_at(pos, name, command_id, state);
- int sys_command = alloc_sys_cmd_id();
- _commands_map[sys_command] = CommandInfo(menu, command_id);
- insert_command(native, name, sys_command, state);
- break;
- }
- case Menu::MENU_ITEM_TYPE_MENU: {
- AutoRef<Menu> sub_menu(menu->sub_at(pos));
- HMENU native_sub = insert_sub_menu(native, (*sub_menu)->get_name());
- insert_menu(*sub_menu, native_sub, _commands_map);
- break;
- }
- case Menu::MENU_ITEM_TYPE_SEPARATOR:
- insert_separator(native);
- break;
- case Menu::MENU_ITEM_TYPE_INVALID:
- return;
- }
- }
-}
-
-void RedWindow_p::release_menu(Menu* menu)
-{
- if (menu) {
- while (!_commands_map.empty()) {
- free_sys_cmd_id((*_commands_map.begin()).first);
- _commands_map.erase(_commands_map.begin());
- }
- GetSystemMenu(_win, TRUE);
- _sys_menu = NULL;
- menu->unref();
- return;
- }
-}
-
-int RedWindow::set_menu(Menu* menu)
-{
- release_menu(_menu);
- _menu = NULL;
-
- if (!menu) {
- return 0;
- }
-
- _sys_menu = GetSystemMenu(_win, FALSE);
- if (! _sys_menu) {
- return -1;
- }
-
- _menu = menu->ref();
-
- insert_separator(_sys_menu);
- insert_menu(_menu, _sys_menu, _commands_map);
-
- return 0;
-}
-
-static LRESULT CALLBACK MessageFilterProc(int nCode, WPARAM wParam, LPARAM lParam)
-{
- if (nCode >= 0)
- {
- MSG* msg = (MSG*)lParam;
-
- switch (msg->message) {
- case WM_SYSKEYUP:
- case WM_KEYUP: {
- RedKey key = translate_key(msg->message, wParam, lParam);
- filtered_up_keys.push_back(key);
- break;
- }
- default:
- break;
- }
- }
- return CallNextHookEx(NULL, nCode, wParam, lParam);
-}
diff --git a/client/windows/red_window_p.h b/client/windows/red_window_p.h
deleted file mode 100644
index 73d74e38..00000000
--- a/client/windows/red_window_p.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_RED_WINDOW_P
-#define _H_RED_WINDOW_P
-
-#include <map>
-#include <red_drawable.h>
-
-class RedWindow;
-class Menu;
-struct PixelsSource_p;
-
-typedef HWND Window;
-
-class CommandInfo {
-public:
- CommandInfo() : menu (0), command (0) {}
- CommandInfo(Menu* in_menu, int in_command) : menu (in_menu), command (in_command) {}
-
- Menu* menu;
- int command;
-};
-
-typedef std::map<int, CommandInfo> CommandMap;
-
-class RedWindow_p {
-public:
- RedWindow_p();
-
- void create(RedWindow& red_window, PixelsSource_p& pixels_source);
- void destroy(PixelsSource_p& pixels_source);
- void release_menu(Menu* menu);
- void on_minimized();
- void on_restored();
- void on_pos_changing(RedWindow& red_window);
- bool prossec_menu_commands(int cmd);
-
- static LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
-
-protected:
- HWND _win;
- RedDrawable::Format _format;
- uint32_t _modal_refs;
- HMODULE _no_taskmgr_dll;
- HHOOK _no_taskmgr_hook;
- bool _focused;
- bool _pointer_in_window;
- bool _minimized;
- bool _valid_pos;
- int _x;
- int _y;
- CommandMap _commands_map;
- HMENU _sys_menu;
-};
-
-#endif
diff --git a/client/windows/redc.rc b/client/windows/redc.rc
deleted file mode 100644
index ec9a9b24..00000000
--- a/client/windows/redc.rc
+++ /dev/null
@@ -1,137 +0,0 @@
-// Microsoft Visual C++ generated resource script.
-//
-#include "resource.h"
-
-#define APSTUDIO_READONLY_SYMBOLS
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 2 resource.
-//
-#include "windef.h"
-
-/////////////////////////////////////////////////////////////////////////////
-#undef APSTUDIO_READONLY_SYMBOLS
-
-/////////////////////////////////////////////////////////////////////////////
-// English (U.S.) resources
-
-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
-#ifdef _WIN32
-LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
-#pragma code_page(1252)
-#endif //_WIN32
-
-#ifdef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// TEXTINCLUDE
-//
-
-1 TEXTINCLUDE
-BEGIN
- "resource.h\0"
-END
-
-2 TEXTINCLUDE
-BEGIN
- "#include ""afxres.h""\r\n"
- "\0"
-END
-
-3 TEXTINCLUDE
-BEGIN
- "\r\n"
- "\0"
-END
-
-#endif // APSTUDIO_INVOKED
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Bitmap
-//
-
-ALT_IMAGE_RES_ID BITMAP "sticky_alt.bmp"
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Version
-//
-
-VS_VERSION_INFO VERSIONINFO
- FILEVERSION 0,9,0,0
- PRODUCTVERSION 0,9,0,0
- FILEFLAGSMASK 0x17L
-#ifdef _DEBUG
- FILEFLAGS 0x1L
-#else
- FILEFLAGS 0x0L
-#endif
- FILEOS 0x4L
- FILETYPE 0x1L
- FILESUBTYPE 0x0L
-BEGIN
- BLOCK "StringFileInfo"
- BEGIN
- BLOCK "000904b0"
- BEGIN
- VALUE "CompanyName", "Red Hat Inc."
- VALUE "FileDescription", "Spice client"
- VALUE "FileVersion", "0, 9, 0, 0"
- VALUE "InternalName", "spicec"
- VALUE "LegalCopyright", "Copyright (c) 2009 Red Hat, Inc. and/or its affiliates"
- VALUE "OriginalFilename", "spicec.exe"
- VALUE "ProductName", "Red Hat Spice"
- VALUE "ProductVersion", "0, 9, 0, 0"
- END
- END
- BLOCK "VarFileInfo"
- BEGIN
- VALUE "Translation", 0x9, 1200
- END
-END
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Icon
-//
-
-// Icon with lowest ID value placed first to ensure application icon
-// remains consistent on all systems.
-RED_ICON_RES_ID ICON "spice.ico"
-#endif // English (U.S.) resources
-/////////////////////////////////////////////////////////////////////////////
-
-
-/////////////////////////////////////////////////////////////////////////////
-// Neutral (Sys. Default) resources
-
-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEUSD)
-#ifdef _WIN32
-LANGUAGE LANG_NEUTRAL, SUBLANG_SYS_DEFAULT
-#pragma code_page(1255)
-#endif //_WIN32
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// RT_MANIFEST
-//
-
-1 RT_MANIFEST "spicec.exe.manifest"
-#endif // Neutral (Sys. Default) resources
-/////////////////////////////////////////////////////////////////////////////
-
-
-
-#ifndef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 3 resource.
-//
-
-
-/////////////////////////////////////////////////////////////////////////////
-#endif // not APSTUDIO_INVOKED
-
diff --git a/client/windows/redc.sln b/client/windows/redc.sln
deleted file mode 100644
index 3ee71232..00000000
--- a/client/windows/redc.sln
+++ /dev/null
@@ -1,26 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 10.00
-# Visual Studio 2008
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "redc", "redc.vcproj", "{4F03BAF9-DFBC-4CA7-B860-8929555981AE}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Win32 = Debug|Win32
- Debug|x64 = Debug|x64
- Release|Win32 = Release|Win32
- Release|x64 = Release|x64
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {4F03BAF9-DFBC-4CA7-B860-8929555981AE}.Debug|Win32.ActiveCfg = Debug|Win32
- {4F03BAF9-DFBC-4CA7-B860-8929555981AE}.Debug|Win32.Build.0 = Debug|Win32
- {4F03BAF9-DFBC-4CA7-B860-8929555981AE}.Debug|x64.ActiveCfg = Debug|x64
- {4F03BAF9-DFBC-4CA7-B860-8929555981AE}.Debug|x64.Build.0 = Debug|x64
- {4F03BAF9-DFBC-4CA7-B860-8929555981AE}.Release|Win32.ActiveCfg = Release|Win32
- {4F03BAF9-DFBC-4CA7-B860-8929555981AE}.Release|Win32.Build.0 = Release|Win32
- {4F03BAF9-DFBC-4CA7-B860-8929555981AE}.Release|x64.ActiveCfg = Release|x64
- {4F03BAF9-DFBC-4CA7-B860-8929555981AE}.Release|x64.Build.0 = Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
diff --git a/client/windows/redc.vcproj b/client/windows/redc.vcproj
deleted file mode 100644
index 3d5bae34..00000000
--- a/client/windows/redc.vcproj
+++ /dev/null
@@ -1,1007 +0,0 @@
-<?xml version="1.0" encoding="windows-1255"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="redc"
- ProjectGUID="{4F03BAF9-DFBC-4CA7-B860-8929555981AE}"
- RootNamespace="redc"
- Keyword="Win32Proj"
- TargetFrameworkVersion="131072"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(REDC_BUILD_DIR)$(ConfigurationName)"
- IntermediateDirectory="$(REDC_BUILD_DIR)$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- CommandLine=""
- />
- <Tool
- Name="VCCustomBuildTool"
- Description=""
- CommandLine=""
- AdditionalDependencies=""
- Outputs=""
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories=".;..;&quot;$(SPICE_PROTOCOL_DIR)&quot;;&quot;$(SPICE_COMMON_DIR)&quot;;&quot;$(SPICE_COMMON_DIR)\common&quot;;&quot;$(SPICE_LIBS)\include&quot;;&quot;$(SPICE_LIBS)\include\pixman-1&quot;;&quot;$(SPICE_LIBS)\include\CEGUI-0.6.2&quot;;&quot;$(SPICE_LIBS)\include\CxImage&quot;"
- PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;RED_DEBUG;_WIN32_WINNT=0x0500;USE_GUI;USE_GLZ;PTW32_STATIC_LIB;CEGUI_STATIC;HAVE_STRING_H"
- MinimalRebuild="false"
- BasicRuntimeChecks="3"
- RuntimeLibrary="1"
- UsePrecompiledHeader="0"
- PrecompiledHeaderThrough=""
- WarningLevel="3"
- WarnAsError="false"
- Detect64BitPortabilityProblems="false"
- DebugInformationFormat="4"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="pixman-1D.lib libeay32MTd.lib ssleay32MTd.lib ws2_32.lib msimg32.lib winmm.lib libcelt_0_5_1D.lib pthreadVC2d.lib version.lib CEGUIBase_Static_d.lib CEGUITGAImageCodec_Static_d.lib CEGUIExpatParser_Static_d.lib freetype2311MT_D.lib libexpatMT_D.lib pcre_D.lib CEGUIFalagardWRBase_Static_d.lib libjpeg-static-mt-debug.lib zlibwapiD.lib png_d.lib cximage_d.lib"
- OutputFile="$(OutDir)\spicec.exe"
- LinkIncremental="2"
- AdditionalLibraryDirectories="&quot;$(SPICE_LIBS)\lib&quot;"
- IgnoreAllDefaultLibraries="false"
- IgnoreDefaultLibraryNames=""
- GenerateDebugInformation="true"
- SubSystem="2"
- RandomizedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(REDC_BUILD_DIR)$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(REDC_BUILD_DIR)$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- CommandLine=""
- />
- <Tool
- Name="VCCustomBuildTool"
- Description=""
- CommandLine=""
- AdditionalDependencies=""
- Outputs=""
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories=".;..;&quot;$(SPICE_PROTOCOL_DIR)&quot;;&quot;$(SPICE_COMMON_DIR)&quot;;&quot;$(SPICE_COMMON_DIR)\common&quot;;&quot;$(SPICE_LIBS)\include&quot;;&quot;$(SPICE_LIBS)\include\pixman-1&quot;;&quot;$(SPICE_LIBS)\include\CEGUI-0.6.2&quot;;&quot;$(SPICE_LIBS)\include\CxImage&quot;"
- PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;RED_DEBUG;_WIN32_WINNT=0x0500;USE_GUI;USE_GLZ;PTW32_STATIC_LIB;CEGUI_STATIC;HAVE_STRING_H"
- MinimalRebuild="false"
- BasicRuntimeChecks="3"
- RuntimeLibrary="1"
- UsePrecompiledHeader="0"
- PrecompiledHeaderThrough=""
- WarningLevel="3"
- WarnAsError="false"
- Detect64BitPortabilityProblems="false"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="pixman-1D.lib libeay32MTd.lib ssleay32MTd.lib ws2_32.lib msimg32.lib winmm.lib zlibwapiD.lib version.lib pthreadVC2D.lib libjpeg-static-mt-debug.lib libcelt_0_5_1D.lib CEGUIBase_Static_d.lib CEGUIExpatParser_Static_d.lib CEGUIFalagardWRBase_Static_d.lib CEGUITGAImageCodec_Static_d.lib freetype2311MT.lib libexpatMT.lib pcre.lib png_d.lib cximage_d.lib"
- OutputFile="$(OutDir)\spicec.exe"
- LinkIncremental="2"
- AdditionalLibraryDirectories="&quot;$(SPICE_LIBS)\lib64&quot;"
- IgnoreAllDefaultLibraries="false"
- IgnoreDefaultLibraryNames=""
- GenerateDebugInformation="true"
- SubSystem="2"
- RandomizedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="17"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(REDC_BUILD_DIR)$(ConfigurationName)"
- IntermediateDirectory="$(REDC_BUILD_DIR)$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- CommandLine=""
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=".;..;&quot;$(SPICE_PROTOCOL_DIR)&quot;;&quot;$(SPICE_COMMON_DIR)&quot;;&quot;$(SPICE_COMMON_DIR)\common&quot;;&quot;$(SPICE_LIBS)\include&quot;;&quot;$(SPICE_LIBS)\include\pixman-1&quot;;&quot;$(SPICE_LIBS)\include\CEGUI-0.6.2&quot;;&quot;$(SPICE_LIBS)\include\CxImage&quot;"
- PreprocessorDefinitions="WIN32;_WINDOWS;_WIN32_WINNT=0x0500;USE_GUI;USE_GLZ;PTW32_STATIC_LIB;CEGUI_STATIC;HAVE_STRING_H"
- RuntimeLibrary="0"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- WarnAsError="false"
- Detect64BitPortabilityProblems="false"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="pixman-1.lib libeay32MT.lib ssleay32MT.lib ws2_32.lib msimg32.lib winmm.lib libcelt_0_5_1.lib pthreadVC2.lib version.lib CEGUIBase_Static.lib CEGUITGAImageCodec_Static.lib CEGUIExpatParser_Static.lib freetype2311MT.lib libexpatMT.lib pcre.lib CEGUIFalagardWRBase_Static.lib libjpeg-static-mt.lib zlibwapi.lib png.lib cximage.lib"
- OutputFile="$(OutDir)\spicec.exe"
- LinkIncremental="1"
- AdditionalLibraryDirectories="&quot;$(SPICE_LIBS)\lib&quot;"
- IgnoreDefaultLibraryNames=""
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- RandomizedBaseAddress="2"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(REDC_BUILD_DIR)$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(REDC_BUILD_DIR)$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- UseOfMFC="0"
- CharacterSet="1"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- CommandLine=""
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=".;..;&quot;$(SPICE_PROTOCOL_DIR)&quot;;&quot;$(SPICE_COMMON_DIR)&quot;;&quot;$(SPICE_COMMON_DIR)\common&quot;;&quot;$(SPICE_LIBS)\include&quot;;&quot;$(SPICE_LIBS)\include\pixman-1&quot;;&quot;$(SPICE_LIBS)\include\CEGUI-0.6.2&quot;;&quot;$(SPICE_LIBS)\include\CxImage&quot;"
- PreprocessorDefinitions="WIN32;_WINDOWS;_WIN32_WINNT=0x0500;USE_GUI;USE_GLZ;PTW32_STATIC_LIB;CEGUI_STATIC;HAVE_STRING_H"
- RuntimeLibrary="0"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- WarnAsError="false"
- Detect64BitPortabilityProblems="false"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="pixman-1.lib libeay32MT.lib ssleay32MT.lib ws2_32.lib msimg32.lib winmm.lib zlibwapi.lib version.lib pthreadVC2.lib libjpeg-static-mt.lib libcelt_0_5_1.lib CEGUIBase_Static.lib CEGUIExpatParser_Static.lib CEGUIFalagardWRBase_Static.lib CEGUITGAImageCodec_Static.lib freetype2311MT.lib libexpatMT.lib pcre.lib png.lib cximage.lib"
- OutputFile="$(OutDir)\spicec.exe"
- LinkIncremental="1"
- AdditionalLibraryDirectories="&quot;$(SPICE_LIBS)\lib64&quot;"
- IgnoreAllDefaultLibraries="false"
- IgnoreDefaultLibraryNames=""
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- RandomizedBaseAddress="2"
- DataExecutionPrevention="0"
- TargetMachine="17"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\application.cpp"
- >
- </File>
- <File
- RelativePath="..\canvas.cpp"
- >
- </File>
- <File
- RelativePath="$(SPICE_COMMON_DIR)\common\canvas_utils.c"
- >
- </File>
- <File
- RelativePath="..\client_net_socket.cpp"
- >
- </File>
- <File
- RelativePath="..\cmd_line_parser.cpp"
- >
- </File>
- <File
- RelativePath="..\controller.cpp"
- >
- </File>
- <File
- RelativePath="..\cursor.cpp"
- >
- </File>
- <File
- RelativePath="..\cursor_channel.cpp"
- >
- </File>
- <File
- RelativePath="..\display_channel.cpp"
- >
- </File>
- <File
- RelativePath=".\event_sources_p.cpp"
- >
- </File>
- <File
- RelativePath="..\foreign_menu.cpp"
- >
- </File>
- <File
- RelativePath="..\generated_demarshallers.c"
- >
- </File>
- <File
- RelativePath="..\generated_demarshallers1.c"
- >
- </File>
- <File
- RelativePath="..\generated_marshallers.c"
- >
- </File>
- <File
- RelativePath="..\generated_marshallers1.c"
- >
- </File>
- <File
- RelativePath="..\glz_decoder.cpp"
- >
- </File>
- <File
- RelativePath="..\glz_decoder_window.cpp"
- >
- </File>
- <File
- RelativePath="..\gui\gui.cpp"
- >
- </File>
- <File
- RelativePath="..\hot_keys.cpp"
- >
- </File>
- <File
- RelativePath="..\inputs_channel.cpp"
- >
- </File>
- <File
- RelativePath="..\jpeg_decoder.cpp"
- >
- </File>
- <File
- RelativePath="$(SPICE_COMMON_DIR)\common\lines.c"
- >
- </File>
- <File
- RelativePath="$(SPICE_COMMON_DIR)\common\log.c"
- >
- </File>
- <File
- RelativePath="$(SPICE_COMMON_DIR)\common\lz.c"
- >
- </File>
- <File
- RelativePath=".\main.cpp"
- >
- </File>
- <File
- RelativePath="$(SPICE_COMMON_DIR)\common\marshaller.c"
- >
- </File>
- <File
- RelativePath="$(SPICE_COMMON_DIR)\common\mem.c"
- >
- </File>
- <File
- RelativePath="..\menu.cpp"
- >
- </File>
- <File
- RelativePath="..\mjpeg_decoder.cpp"
- >
- </File>
- <File
- RelativePath="..\monitor.cpp"
- >
- </File>
- <File
- RelativePath=".\my_getopt.cpp"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- ObjectFile="$(IntDir)\$(InputName)1.obj"
- XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- ObjectFile="$(IntDir)\$(InputName)1.obj"
- XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- ObjectFile="$(IntDir)\$(InputName)1.obj"
- XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- >
- <Tool
- Name="VCCLCompilerTool"
- ObjectFile="$(IntDir)\$(InputName)1.obj"
- XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath=".\named_pipe.cpp"
- >
- </File>
- <File
- RelativePath=".\pixels_source.cpp"
- >
- </File>
- <File
- RelativePath="$(SPICE_COMMON_DIR)\common\pixman_utils.c"
- >
- </File>
- <File
- RelativePath=".\platform.cpp"
- >
- </File>
- <File
- RelativePath=".\platform_utils.cpp"
- >
- </File>
- <File
- RelativePath=".\playback.cpp"
- >
- </File>
- <File
- RelativePath="..\playback_channel.cpp"
- >
- </File>
- <File
- RelativePath="..\process_loop.cpp"
- >
- </File>
- <File
- RelativePath="$(SPICE_COMMON_DIR)\common\quic.c"
- >
- </File>
- <File
- RelativePath=".\record.cpp"
- >
- </File>
- <File
- RelativePath="..\record_channel.cpp"
- >
- </File>
- <File
- RelativePath="..\red_channel.cpp"
- >
- </File>
- <File
- RelativePath="..\red_client.cpp"
- >
- </File>
- <File
- RelativePath=".\red_drawable.cpp"
- >
- </File>
- <File
- RelativePath="..\red_gdi_canvas.cpp"
- >
- </File>
- <File
- RelativePath="..\red_peer.cpp"
- >
- </File>
- <File
- RelativePath=".\red_pixmap.cpp"
- >
- </File>
- <File
- RelativePath=".\red_pixmap_gdi.cpp"
- >
- </File>
- <File
- RelativePath=".\red_pixmap_sw.cpp"
- >
- </File>
- <File
- RelativePath="..\red_sw_canvas.cpp"
- >
- </File>
- <File
- RelativePath=".\red_window.cpp"
- >
- </File>
- <File
- RelativePath="$(SPICE_COMMON_DIR)\common\region.c"
- >
- </File>
- <File
- RelativePath="..\gui\resource_provider.cpp"
- >
- </File>
- <File
- RelativePath="$(SPICE_COMMON_DIR)\common\rop3.c"
- >
- </File>
- <File
- RelativePath="..\screen.cpp"
- >
- </File>
- <File
- RelativePath="..\screen_layer.cpp"
- >
- </File>
- <File
- RelativePath="..\gui\softrenderer.cpp"
- >
- </File>
- <File
- RelativePath="..\gui\softtexture.cpp"
- >
- </File>
- <File
- RelativePath="$(SPICE_COMMON_DIR)\common\ssl_verify.c"
- >
- </File>
- <File
- RelativePath="..\threads.cpp"
- >
- </File>
- <File
- RelativePath="..\utils.cpp"
- >
- </File>
- <File
- RelativePath="..\zlib_decoder.cpp"
- >
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
- >
- <File
- RelativePath="..\application.h"
- >
- </File>
- <File
- RelativePath=".\atomic_count.h"
- >
- </File>
- <File
- RelativePath="..\cache.hpp"
- >
- </File>
- <File
- RelativePath="..\canvas.h"
- >
- </File>
- <File
- RelativePath="$(SPICE_COMMON_DIR)\common\client_demarshallers.h"
- >
- </File>
- <File
- RelativePath="..\client_net_socket.h"
- >
- </File>
- <File
- RelativePath="..\controller.h"
- >
- </File>
- <File
- RelativePath="..\cursor.h"
- >
- </File>
- <File
- RelativePath="..\cursor_channel.h"
- >
- </File>
- <File
- RelativePath="..\debug.h"
- >
- </File>
- <File
- RelativePath="..\display_channel.h"
- >
- </File>
- <File
- RelativePath="..\event_sources.h"
- >
- </File>
- <File
- RelativePath=".\event_sources_p.h"
- >
- </File>
- <File
- RelativePath="..\foreign_menu.h"
- >
- </File>
- <File
- RelativePath="$(SPICE_COMMON_DIR)\common\gdi_canvas.h"
- >
- </File>
- <File
- RelativePath=".\getopt.h"
- >
- </File>
- <File
- RelativePath="..\glz_decoded_image.h"
- >
- </File>
- <File
- RelativePath="..\glz_decoder.h"
- >
- </File>
- <File
- RelativePath="..\glz_decoder_config.h"
- >
- </File>
- <File
- RelativePath="..\glz_decoder_window.h"
- >
- </File>
- <File
- RelativePath="..\gui\gui.h"
- >
- </File>
- <File
- RelativePath="..\hot_keys.h"
- >
- </File>
- <File
- RelativePath="..\icon.h"
- >
- </File>
- <File
- RelativePath="..\inputs_channel.h"
- >
- </File>
- <File
- RelativePath="..\inputs_handler.h"
- >
- </File>
- <File
- RelativePath="..\jpeg_decoder.h"
- >
- </File>
- <File
- RelativePath="..\menu.h"
- >
- </File>
- <File
- RelativePath="..\mjpeg_decoder.h"
- >
- </File>
- <File
- RelativePath="..\monitor.h"
- >
- </File>
- <File
- RelativePath=".\named_pipe.h"
- >
- </File>
- <File
- RelativePath=".\pixels_source_p.h"
- >
- </File>
- <File
- RelativePath="..\platform.h"
- >
- </File>
- <File
- RelativePath=".\platform_utils.h"
- >
- </File>
- <File
- RelativePath=".\playback.h"
- >
- </File>
- <File
- RelativePath="..\process_loop.h"
- >
- </File>
- <File
- RelativePath=".\record.h"
- >
- </File>
- <File
- RelativePath="..\red_channel.h"
- >
- </File>
- <File
- RelativePath="..\red_client.h"
- >
- </File>
- <File
- RelativePath="..\red_drawable.h"
- >
- </File>
- <File
- RelativePath="..\red_gdi_canvas.h"
- >
- </File>
- <File
- RelativePath="..\red_key.h"
- >
- </File>
- <File
- RelativePath="..\red_peer.h"
- >
- </File>
- <File
- RelativePath="..\red_sw_canvas.h"
- >
- </File>
- <File
- RelativePath="..\red_window.h"
- >
- </File>
- <File
- RelativePath=".\resource.h"
- >
- </File>
- <File
- RelativePath="..\gui\resource_provider.h"
- >
- </File>
- <File
- RelativePath="..\screen.h"
- >
- </File>
- <File
- RelativePath="..\screen_layer.h"
- >
- </File>
- <File
- RelativePath="..\shared_cache.hpp"
- >
- </File>
- <File
- RelativePath="..\gui\softrenderer.h"
- >
- </File>
- <File
- RelativePath="..\gui\softtexture.h"
- >
- </File>
- <File
- RelativePath="$(SPICE_COMMON_DIR)\common\ssl_verify.h"
- >
- </File>
- <File
- RelativePath="..\threads.h"
- >
- </File>
- <File
- RelativePath="..\utils.h"
- >
- </File>
- <File
- RelativePath=".\win_platform.h"
- >
- </File>
- <File
- RelativePath="..\zlib_decoder.h"
- >
- </File>
- </Filter>
- <Filter
- Name="Resource Files"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
- >
- <File
- RelativePath=".\redc.rc"
- >
- </File>
- <File
- RelativePath=".\spice.ico"
- >
- </File>
- <File
- RelativePath=".\spicec.exe.manifest"
- >
- </File>
- <File
- RelativePath=".\sticky_alt.bmp"
- >
- </File>
- </Filter>
- <File
- RelativePath="$(SPICE_COMMON_DIR)\spice.proto"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCustomBuildTool"
- Description="Generating demarshaller"
- CommandLine="generate.bat&#x0D;&#x0A;"
- AdditionalDependencies=""
- Outputs="$(ProjectDir)/../generated_demarshallers.cpp;$(ProjectDir)/../generated_marshallers.cpp"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- >
- <Tool
- Name="VCCustomBuildTool"
- Description="Generating demarshaller"
- CommandLine="generate.bat&#x0D;&#x0A;"
- AdditionalDependencies=""
- Outputs="$(ProjectDir)/../generated_demarshallers.cpp;$(ProjectDir)/../generated_marshallers.cpp"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCustomBuildTool"
- Description="Generating demarshaller"
- CommandLine="generate.bat&#x0D;&#x0A;"
- Outputs="$(ProjectDir)/../generated_demarshallers.cpp;$(ProjectDir)/../generated_marshallers.cpp"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- >
- <Tool
- Name="VCCustomBuildTool"
- Description="Generating demarshaller"
- CommandLine="generate.bat&#x0D;&#x0A;"
- Outputs="$(ProjectDir)/../generated_demarshallers.cpp;$(ProjectDir)/../generated_marshallers.cpp"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="$(SPICE_COMMON_DIR)\spice1.proto"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCustomBuildTool"
- Description="Generating old demarshaller"
- CommandLine="generate1.bat&#x0D;&#x0A;"
- AdditionalDependencies=""
- Outputs="$(ProjectDir)/../generated_demarshallers1.cpp;$(ProjectDir)/../generated_marshallers1.cpp"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- >
- <Tool
- Name="VCCustomBuildTool"
- Description="Generating old demarshaller"
- CommandLine="generate1.bat&#x0D;&#x0A;"
- AdditionalDependencies=""
- Outputs="$(ProjectDir)/../generated_demarshallers1.cpp;$(ProjectDir)/../generated_marshallers1.cpp"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCustomBuildTool"
- Description="Generating old demarshaller"
- CommandLine="generate1.bat&#x0D;&#x0A;"
- Outputs="$(ProjectDir)/../generated_demarshallers1.cpp;$(ProjectDir)/../generated_marshallers1.cpp"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- >
- <Tool
- Name="VCCustomBuildTool"
- Description="Generating old demarshaller"
- CommandLine="generate1.bat&#x0D;&#x0A;"
- Outputs="$(ProjectDir)/../generated_demarshallers1.cpp;$(ProjectDir)/../generated_marshallers1.cpp"
- />
- </FileConfiguration>
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/client/windows/resource.h b/client/windows/resource.h
deleted file mode 100644
index c3549be6..00000000
--- a/client/windows/resource.h
+++ /dev/null
@@ -1,18 +0,0 @@
-//{{NO_DEPENDENCIES}}
-// Microsoft Visual C++ generated include file.
-// Used by redc.rc
-//
-#define RED_ICON_RES_ID 5
-#define IDI_ICON_APPLICATION 103
-#define ALT_IMAGE_RES_ID 104
-
-// Next default values for new objects
-//
-#ifdef APSTUDIO_INVOKED
-#ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE 106
-#define _APS_NEXT_COMMAND_VALUE 40001
-#define _APS_NEXT_CONTROL_VALUE 1001
-#define _APS_NEXT_SYMED_VALUE 101
-#endif
-#endif
diff --git a/client/windows/spice.ico b/client/windows/spice.ico
deleted file mode 100644
index ae9200c3..00000000
--- a/client/windows/spice.ico
+++ /dev/null
Binary files differ
diff --git a/client/windows/spicec.exe.manifest b/client/windows/spicec.exe.manifest
deleted file mode 100644
index b7d1d0a4..00000000
--- a/client/windows/spicec.exe.manifest
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
- <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
- <security>
- <requestedPrivileges>
- <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
- </requestedPrivileges>
- </security>
- </trustInfo>
-</assembly>
diff --git a/client/windows/stdint.h b/client/windows/stdint.h
deleted file mode 100644
index 30131610..00000000
--- a/client/windows/stdint.h
+++ /dev/null
@@ -1,393 +0,0 @@
-/* ISO C9x 7.18 Integer types <stdint.h>
-
- * Based on ISO/IEC SC22/WG14 9899 Committee draft (SC22 N2794)
-
- *
-
- * THIS SOFTWARE IS NOT COPYRIGHTED
-
- *
-
- * Contributor: Danny Smith <danny_r_smith_2001@yahoo.co.nz>
-
- *
-
- * This source code is offered for use in the public domain. You may
-
- * use, modify or distribute it freely.
-
- *
-
- * This code is distributed in the hope that it will be useful but
-
- * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
-
- * DISCLAIMED. This includes but is not limited to warranties of
-
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
- *
-
- * Date: 2000-12-02
-
- */
-
-
-
-
-
-#ifndef _STDINT_H
-
-#define _STDINT_H
-
-#define __need_wint_t
-
-#define __need_wchar_t
-
-#include <stddef.h>
-
-
-
-#ifdef _WIN32_WCE
-
-typedef _int64 int64_t;
-
-typedef unsigned _int64 uint64_t;
-
-#else
-
-typedef long long int64_t;
-
-typedef unsigned long long uint64_t;
-
-#endif /* _WIN32_WCE */
-
-
-
-/* 7.18.1.1 Exact-width integer types */
-
-typedef signed char int8_t;
-
-typedef unsigned char uint8_t;
-
-typedef short int16_t;
-
-typedef unsigned short uint16_t;
-
-typedef int int32_t;
-
-typedef unsigned uint32_t;
-
-
-
-/* 7.18.1.2 Minimum-width integer types */
-
-typedef signed char int_least8_t;
-
-typedef unsigned char uint_least8_t;
-
-typedef short int_least16_t;
-
-typedef unsigned short uint_least16_t;
-
-typedef int int_least32_t;
-
-typedef unsigned uint_least32_t;
-
-#ifndef _WIN32_WCE
-
-typedef long long int_least64_t;
-
-typedef unsigned long long uint_least64_t;
-
-#endif
-
-
-
-/* 7.18.1.3 Fastest minimum-width integer types
-
- * Not actually guaranteed to be fastest for all purposes
-
- * Here we use the exact-width types for 8 and 16-bit ints.
-
- */
-
-typedef char int_fast8_t;
-
-typedef unsigned char uint_fast8_t;
-
-typedef short int_fast16_t;
-
-typedef unsigned short uint_fast16_t;
-
-typedef int int_fast32_t;
-
-typedef unsigned int uint_fast32_t;
-
-#ifndef _WIN32_WCE
-
-typedef long long int_fast64_t;
-
-typedef unsigned long long uint_fast64_t;
-
-#endif
-
-
-
-/* 7.18.1.4 Integer types capable of holding object pointers */
-
-#ifndef _WIN64
-
-typedef int intptr_t;
-
-typedef unsigned uintptr_t;
-
-#endif
-
-/* 7.18.1.5 Greatest-width integer types */
-
-#ifndef _WIN32_WCE
-
-typedef long long intmax_t;
-
-typedef unsigned long long uintmax_t;
-
-#endif
-
-
-
-/* 7.18.2 Limits of specified-width integer types */
-
-#if !defined ( __cplusplus) || defined (__STDC_LIMIT_MACROS)
-
-
-
-/* 7.18.2.1 Limits of exact-width integer types */
-
-#define INT8_MIN (-128)
-
-#define INT16_MIN (-32768)
-
-#define INT32_MIN (-2147483647 - 1)
-
-#define INT64_MIN (-9223372036854775807LL - 1)
-
-
-
-#define INT8_MAX 127
-
-#define INT16_MAX 32767
-
-#define INT32_MAX 2147483647
-
-#define INT64_MAX 9223372036854775807LL
-
-
-
-#define UINT8_MAX 0xff /* 255U */
-
-#define UINT16_MAX 0xffff /* 65535U */
-
-#define UINT32_MAX 0xffffffff /* 4294967295U */
-
-#define UINT64_MAX 0xffffffffffffffffULL /* 18446744073709551615ULL */
-
-
-
-/* 7.18.2.2 Limits of minimum-width integer types */
-
-#define INT_LEAST8_MIN INT8_MIN
-
-#define INT_LEAST16_MIN INT16_MIN
-
-#define INT_LEAST32_MIN INT32_MIN
-
-#define INT_LEAST64_MIN INT64_MIN
-
-
-
-#define INT_LEAST8_MAX INT8_MAX
-
-#define INT_LEAST16_MAX INT16_MAX
-
-#define INT_LEAST32_MAX INT32_MAX
-
-#define INT_LEAST64_MAX INT64_MAX
-
-
-
-#define UINT_LEAST8_MAX UINT8_MAX
-
-#define UINT_LEAST16_MAX UINT16_MAX
-
-#define UINT_LEAST32_MAX UINT32_MAX
-
-#define UINT_LEAST64_MAX UINT64_MAX
-
-
-
-/* 7.18.2.3 Limits of fastest minimum-width integer types */
-
-#define INT_FAST8_MIN INT8_MIN
-
-#define INT_FAST16_MIN INT16_MIN
-
-#define INT_FAST32_MIN INT32_MIN
-
-#define INT_FAST64_MIN INT64_MIN
-
-
-
-#define INT_FAST8_MAX INT8_MAX
-
-#define INT_FAST16_MAX INT16_MAX
-
-#define INT_FAST32_MAX INT32_MAX
-
-#define INT_FAST64_MAX INT64_MAX
-
-
-
-#define UINT_FAST8_MAX UINT8_MAX
-
-#define UINT_FAST16_MAX UINT16_MAX
-
-#define UINT_FAST32_MAX UINT32_MAX
-
-#define UINT_FAST64_MAX UINT64_MAX
-
-
-
-/* 7.18.2.4 Limits of integer types capable of holding
-
- object pointers */
-
-#define INTPTR_MIN INT32_MIN
-
-#define INTPTR_MAX INT32_MAX
-
-#define UINTPTR_MAX UINT32_MAX
-
-
-
-/* 7.18.2.5 Limits of greatest-width integer types */
-
-#define INTMAX_MIN INT64_MIN
-
-#define INTMAX_MAX INT64_MAX
-
-#define UINTMAX_MAX UINT64_MAX
-
-
-
-/* 7.18.3 Limits of other integer types */
-
-#define PTRDIFF_MIN INT32_MIN
-
-#define PTRDIFF_MAX INT32_MAX
-
-
-
-#define SIG_ATOMIC_MIN INT32_MIN
-
-#define SIG_ATOMIC_MAX INT32_MAX
-
-
-#undef SIZE_MAX
-#define SIZE_MAX UINT32_MAX
-
-
-
-#ifndef WCHAR_MIN /* also in wchar.h */
-
-#define WCHAR_MIN 0
-
-#define WCHAR_MAX 0xffff /* UINT16_MAX */
-
-#endif
-
-
-
-/*
-
- * wint_t is unsigned short for compatibility with MS runtime
-
- */
-
-#define WINT_MIN 0
-
-#define WINT_MAX 0xffff /* UINT16_MAX */
-
-
-
-#endif /* !defined ( __cplusplus) || defined __STDC_LIMIT_MACROS */
-
-
-
-
-
-/* 7.18.4 Macros for integer constants */
-
-#if !defined ( __cplusplus) || defined (__STDC_CONSTANT_MACROS)
-
-
-
-/* 7.18.4.1 Macros for minimum-width integer constants
-
-
-
- Accoding to Douglas Gwyn <gwyn@arl.mil>:
-
- "This spec was changed in ISO/IEC 9899:1999 TC1; in ISO/IEC
-
- 9899:1999 as initially published, the expansion was required
-
- to be an integer constant of precisely matching type, which
-
- is impossible to accomplish for the shorter types on most
-
- platforms, because C99 provides no standard way to designate
-
- an integer constant with width less than that of type int.
-
- TC1 changed this to require just an integer constant
-
- *expression* with *promoted* type."
-
-*/
-
-
-
-#define INT8_C(val) ((int8_t) + (val))
-
-#define UINT8_C(val) ((uint8_t) + (val##U))
-
-#define INT16_C(val) ((int16_t) + (val))
-
-#define UINT16_C(val) ((uint16_t) + (val##U))
-
-
-
-#define INT32_C(val) val##L
-
-#define UINT32_C(val) val##UL
-
-#define INT64_C(val) val##LL
-
-#define UINT64_C(val) val##ULL
-
-
-
-/* 7.18.4.2 Macros for greatest-width integer constants */
-
-#define INTMAX_C(val) INT64_C(val)
-
-#define UINTMAX_C(val) UINT64_C(val)
-
-
-
-#endif /* !defined ( __cplusplus) || defined __STDC_CONSTANT_MACROS */
-
-
-
-#endif
diff --git a/client/windows/sticky_alt.bmp b/client/windows/sticky_alt.bmp
deleted file mode 100644
index 4013472b..00000000
--- a/client/windows/sticky_alt.bmp
+++ /dev/null
Binary files differ
diff --git a/client/x11/.gitignore b/client/x11/.gitignore
deleted file mode 100644
index 2f08d7eb..00000000
--- a/client/x11/.gitignore
+++ /dev/null
@@ -1,11 +0,0 @@
-*.la
-*.lo
-*.loT
-*.o
-.deps
-.dirstamp
-.libs
-Makefile
-Makefile.in
-setup
-spicec
diff --git a/client/x11/atomic_count.h b/client/x11/atomic_count.h
deleted file mode 100644
index 02bb08d4..00000000
--- a/client/x11/atomic_count.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_ATOMIC_COUNT
-#define _H_ATOMIC_COUNT
-
-#include <stdint.h>
-
-class AtomicCount {
-public:
- AtomicCount(uint32_t count = 0) : _count (count) {}
-
- uint32_t operator ++ ()
- {
- return __sync_add_and_fetch(&_count, 1);
- }
-
- uint32_t operator -- ()
- {
- return __sync_sub_and_fetch(&_count, 1);
- }
-
- operator uint32_t () { return _count;}
-
-private:
- uint32_t _count;
-};
-
-#endif
diff --git a/client/x11/event_sources_p.cpp b/client/x11/event_sources_p.cpp
deleted file mode 100644
index 5f9f4523..00000000
--- a/client/x11/event_sources_p.cpp
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <sys/select.h>
-#include <sys/fcntl.h>
-
-#include "event_sources.h"
-#include "debug.h"
-#include "utils.h"
-
-static void set_non_blocking(int fd)
-{
- int flags;
- if ((flags = ::fcntl(fd, F_GETFL)) == -1) {
- THROW("failed to set socket non block: %s", strerror(errno));
- }
-
- if (::fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1) {
- THROW("failed to set socket non block: %s", strerror(errno));
- }
-}
-
-static void set_blocking(int fd)
-{
- int flags;
- if ((flags = ::fcntl(fd, F_GETFL)) == -1) {
- THROW("failed to clear socket non block: %s", strerror(errno));
- }
-
- if (::fcntl(fd, F_SETFL, flags & ~O_NONBLOCK) == -1) {
- THROW("failed to clear socket non block: %s", strerror(errno));
- }
-}
-
-EventSources::EventSources()
-{
-}
-
-EventSources::~EventSources()
-{
-}
-
-void EventSources_p::add_event(int fd, EventSource* source)
-{
- int size = _events.size();
- _events.resize(size + 1);
- _fds.resize(size + 1);
- _events[size] = source;
- _fds[size] = fd;
-}
-
-void EventSources_p::remove_event(EventSource* source)
-{
- int size = _events.size();
- for (int i = 0; i < size; i++) {
- if (_events[i] == source) {
- for (i++; i < size; i++) {
- _events[i - 1] = _events[i];
- _fds[i - 1] = _fds[i];
- }
- _events.resize(size - 1);
- _fds.resize(size - 1);
- return;
- }
- }
- THROW("event not found");
-}
-
-bool EventSources::wait_events(int timeout_msec)
-{
- int maxfd = 0;
- fd_set rfds;
- struct timeval tv;
- struct timeval *tvp;
- int ready;
-
- FD_ZERO(&rfds);
-
- int size = _events.size();
- for (int i = 0; i < size; i++) {
- maxfd = MAX(maxfd, _fds[i]);
- FD_SET(_fds[i], &rfds);
- }
-
- if (timeout_msec == INFINITE) {
- tvp = NULL;
- } else {
- tv.tv_sec = timeout_msec / 1000;
- tv.tv_usec = (timeout_msec % 1000) * 1000;
- tvp = &tv;
- }
-
- /* Right now we only use read polling in spice */
- ready = ::select(maxfd+1, &rfds, NULL, NULL, tvp);
-
- if (ready == -1) {
- if (errno == EINTR) {
- return false;
- }
- THROW("wait error select failed");
- } else if (ready == 0) {
- return false;
- }
-
- for (unsigned int i = 0; i < _events.size(); i++) {
- if (FD_ISSET(_fds[i], &rfds)) {
- _events[i]->action();
- /* The action may have removed / added event sources changing
- our array, so leave the loop and handle other events the next
- time we are called */
- return false;
- }
- }
- return false;
-}
-
-void EventSources::add_trigger(Trigger& trigger)
-{
- add_event(trigger.get_fd(), &trigger);
-}
-
-void EventSources::remove_trigger(Trigger& trigger)
-{
- remove_event(&trigger);
-}
-
-EventSources::Trigger::Trigger()
-{
- int fd[2];
- if (::pipe(fd) == -1) {
- THROW("create pipe failed");
- }
- _event_fd = fd[0];
- _event_write_fd = fd[1];
- set_non_blocking(_event_fd);
-}
-
-EventSources::Trigger::~Trigger()
-{
- close(_event_fd);
- close(_event_write_fd);
-}
-
-void EventSources::Trigger::trigger()
-{
- Lock lock(_lock);
- if (_pending_int) {
- return;
- }
- _pending_int = true;
- const uint8_t val = 1;
- if (::write(_event_write_fd, &val, sizeof(val)) != sizeof(val)) {
- THROW("write event failed");
- }
-}
-
-bool Trigger_p::reset_event()
-{
- Lock lock(_lock);
- if (!_pending_int) {
- return false;
- }
- uint8_t val;
- if (::read(_event_fd, &val, sizeof(val)) != sizeof(val)) {
- THROW("event read error");
- }
- _pending_int = false;
- return true;
-}
-
-void EventSources::Trigger::reset()
-{
- reset_event();
-}
-
-void EventSources::Trigger::action()
-{
- if (reset_event()) {
- on_event();
- }
-}
-
-void EventSources::add_socket(Socket& socket)
-{
- add_event(socket.get_socket(), &socket);
- set_non_blocking(socket.get_socket());
-}
-
-void EventSources::remove_socket(Socket& socket)
-{
- remove_event(&socket);
- int fd = socket.get_socket();
- set_blocking(fd);
-}
-
-void EventSources::add_file(File& file)
-{
- add_event(file.get_fd(), &file);
-}
-
-void EventSources::remove_file(File& file)
-{
- remove_event(&file);
-}
-
-void EventSources::add_handle(Handle& file)
-{
-}
-
-void EventSources::remove_handle(Handle& file)
-{
-}
diff --git a/client/x11/event_sources_p.h b/client/x11/event_sources_p.h
deleted file mode 100644
index 4b826bb8..00000000
--- a/client/x11/event_sources_p.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_EVENT_SOURCES_P
-#define _H_EVENT_SOURCES_P
-
-#include "common.h"
-#include "threads.h"
-
-#define INFINITE -1
-
-class EventSource;
-
-class EventSources_p {
-protected:
- void add_event(int fd, EventSource* source);
- void remove_event(EventSource* source);
-
-public:
- std::vector<EventSource*> _events;
- std::vector<int> _fds;
-};
-
-class Trigger_p {
-public:
- Trigger_p() : _pending_int (false) {}
- int get_fd() { return _event_fd;}
- bool reset_event();
-
-public:
- int _event_fd;
- int _event_write_fd;
- bool _pending_int;
- Mutex _lock;
-};
-
-class Handle_p {
-};
-
-#endif
diff --git a/client/x11/images/alt_image.c b/client/x11/images/alt_image.c
deleted file mode 100644
index cf5d6cb8..00000000
--- a/client/x11/images/alt_image.c
+++ /dev/null
@@ -1,735 +0,0 @@
-static const struct {
- int width;
- int height;
- uint8_t pixel_data[17496];
-} _alt_image = { 81, 54, {
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x16,0x16,0x16,0x2d,0x39,0x39,0x39,0x70,0x48,0x48,0x48,0x8e,0x58,0x58,0x58,0xae,0x68,0x68,0x68,0xcd,
- 0x78,0x78,0x78,0xec,0x82,0x82,0x82,0xff,0x81,0x81,0x81,0xfe,0x80,0x80,0x80,0xfd,0x80,0x80,0x80,0xfc,0x7f,0x7f,0x7f,0xfb,
- 0x7f,0x7f,0x7f,0xfa,0x7e,0x7e,0x7e,0xf9,0x7e,0x7e,0x7e,0xf8,0x7e,0x7e,0x7e,0xf8,0x7d,0x7d,0x7d,0xf7,0x7d,0x7d,0x7d,0xf6,
- 0x7c,0x7c,0x7c,0xf5,0x7c,0x7c,0x7c,0xf4,0x7b,0x7b,0x7b,0xf3,0x7b,0x7b,0x7b,0xf2,0x7a,0x7a,0x7a,0xf1,0x7a,0x7a,0x7a,0xf0,
- 0x79,0x79,0x79,0xef,0x79,0x79,0x79,0xee,0x78,0x78,0x78,0xed,0x78,0x78,0x78,0xec,0x77,0x77,0x77,0xeb,0x77,0x77,0x77,0xea,
- 0x76,0x76,0x76,0xe9,0x76,0x76,0x76,0xe8,0x75,0x75,0x75,0xe7,0x75,0x75,0x75,0xe6,0x74,0x74,0x74,0xe5,0x74,0x74,0x74,0xe4,
- 0x74,0x74,0x74,0xe4,0x73,0x73,0x73,0xe3,0x73,0x73,0x73,0xe2,0x72,0x72,0x72,0xe1,0x72,0x72,0x72,0xe0,0x71,0x71,0x71,0xdf,
- 0x71,0x71,0x71,0xde,0x70,0x70,0x70,0xdd,0x70,0x70,0x70,0xdc,0x6f,0x6f,0x6f,0xdb,0x6f,0x6f,0x6f,0xda,0x6e,0x6e,0x6e,0xd9,
- 0x6e,0x6e,0x6e,0xd8,0x6d,0x6d,0x6d,0xd7,0x6d,0x6d,0x6d,0xd6,0x6c,0x6c,0x6c,0xd5,0x6c,0x6c,0x6c,0xd4,0x6b,0x6b,0x6b,0xd3,
- 0x6b,0x6b,0x6b,0xd2,0x6a,0x6a,0x6a,0xd1,0x6a,0x6a,0x6a,0xd1,0x69,0x69,0x69,0xcf,0x61,0x61,0x61,0xc0,0x60,0x60,0x60,0xca,
- 0x64,0x64,0x64,0xe2,0x5b,0x5b,0x5b,0xd3,0x52,0x52,0x52,0xc2,0x47,0x47,0x47,0xad,0x33,0x33,0x33,0x87,0x19,0x19,0x19,0x55,
- 0x0b,0x0b,0x0b,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x11,0x11,0x23,0x53,0x53,0x53,0xa4,0x80,0x80,0x80,0xfd,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x79,0x79,0x79,0xff,0x64,0x64,0x64,0xff,0x3f,0x3f,0x3f,0xc4,0x1c,0x1c,0x1c,0x5d,
- 0x02,0x02,0x02,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x0a,0x0a,0x15,0x4c,0x4c,0x4c,0x96,0x7f,0x7f,0x7f,0xfa,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x81,0x81,0x81,0xff,0x70,0x70,0x70,0xff,0x4d,0x4d,0x4d,0xf1,0x2c,0x2c,0x2c,0x95,0x03,0x03,0x03,0x0a,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x02,
- 0x62,0x62,0x62,0xc2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x7b,0x7b,0x7b,0xff,0x54,0x54,0x54,0xff,0x3b,0x3b,0x3b,0xc5,0x04,0x04,0x04,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x3e,0x3e,0x7b,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x83,0x7f,0x80,0xee,0x88,0x7d,0x7e,0xce,0x88,0x7c,0x7c,0xc2,0x8a,0x7a,0x7c,0xb7,
- 0x8c,0x7a,0x7b,0xac,0x8d,0x79,0x7a,0xa5,0x8c,0x79,0x7a,0xa5,0x8d,0x79,0x7b,0xa6,0x8c,0x79,0x7b,0xa6,0x8c,0x79,0x7b,0xa6,
- 0x8c,0x79,0x7b,0xa7,0x8c,0x79,0x7b,0xa7,0x8c,0x79,0x7a,0xa7,0x8c,0x79,0x7a,0xa7,0x8c,0x79,0x7b,0xa8,0x8c,0x79,0x7b,0xa8,
- 0x8d,0x79,0x7b,0xa9,0x8c,0x79,0x7b,0xa9,0x8c,0x79,0x7b,0xa9,0x8c,0x7a,0x7b,0xaa,0x8c,0x79,0x7b,0xaa,0x8c,0x79,0x7b,0xaa,
- 0x8c,0x7a,0x7b,0xab,0x8c,0x79,0x7b,0xab,0x8c,0x79,0x7b,0xab,0x8c,0x7a,0x7b,0xac,0x8c,0x79,0x7b,0xac,0x8b,0x79,0x7b,0xac,
- 0x8c,0x7a,0x7b,0xad,0x8b,0x79,0x7b,0xad,0x8b,0x79,0x7b,0xad,0x8b,0x7a,0x7b,0xae,0x8b,0x79,0x7b,0xae,0x8c,0x7a,0x7c,0xaf,
- 0x8c,0x7a,0x7b,0xaf,0x8c,0x7a,0x7b,0xaf,0x8b,0x7a,0x7b,0xaf,0x8c,0x7a,0x7c,0xb0,0x8b,0x7a,0x7b,0xb0,0x8b,0x7a,0x7b,0xb0,
- 0x8c,0x7a,0x7c,0xb1,0x8b,0x7a,0x7b,0xb1,0x8b,0x7a,0x7b,0xb1,0x8b,0x7a,0x7c,0xb2,0x8b,0x7a,0x7c,0xb2,0x8a,0x7a,0x7b,0xb2,
- 0x8b,0x7a,0x7c,0xb3,0x8a,0x7a,0x7c,0xb3,0x8a,0x7a,0x7b,0xb3,0x8b,0x7a,0x7c,0xb4,0x8b,0x7a,0x7c,0xb4,0x8b,0x7a,0x7c,0xb5,
- 0x8b,0x7a,0x7c,0xb5,0x8b,0x7a,0x7c,0xb5,0x8b,0x7a,0x7c,0xb6,0x8a,0x7a,0x7c,0xb6,0x8a,0x7b,0x7c,0xbc,0x8c,0x7e,0x80,0xcc,
- 0x8d,0x80,0x82,0xd8,0x8c,0x82,0x83,0xe0,0x8c,0x83,0x84,0xe7,0x89,0x83,0x84,0xf1,0x82,0x82,0x82,0xfe,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x7b,0x7b,0x7b,0xff,0x4f,0x4f,0x4f,0xff,
- 0x3a,0x3a,0x3a,0xc3,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x1b,0x1b,0x36,0x7f,0x7f,0x7f,0xfb,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x83,0x80,0x80,0xf3,0x89,0x7c,0x7d,0xc5,0x8c,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8c,0x79,0x7b,0xac,0x87,0x7d,0x7e,0xcd,0x83,0x81,0x81,0xf2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x69,0x69,0x69,0xff,0x4d,0x4d,0x4d,0xff,0x1c,0x1c,0x1c,0x5f,0x00,0x00,0x00,0x00,
- 0x02,0x02,0x02,0x04,0x6f,0x6f,0x6f,0xdb,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x83,0x81,0x81,0xf7,
- 0x8c,0x7a,0x7b,0xad,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8c,0x79,0x7b,0xa7,0x86,0x7f,0x7f,0xe1,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x81,0x81,0x81,0xff,
- 0x50,0x50,0x50,0xff,0x44,0x44,0x44,0xe4,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x81,0x81,0x81,0xfe,0x89,0x7b,0x7c,0xbc,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8c,0x79,0x7b,0xa9,0x83,0x81,0x81,0xf6,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x5c,0x5c,0x5c,0xff,0x4d,0x4d,0x4d,0xff,0x0b,0x0b,0x0b,0x26,
- 0x33,0x33,0x33,0x65,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x85,0x7f,0x7f,0xe2,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x86,0x7e,0x7f,0xda,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x68,0x68,0x68,0xff,0x4d,0x4d,0x4d,0xff,0x1d,0x1d,0x1d,0x61,0x4f,0x4f,0x4f,0x9b,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x87,0x7d,0x7e,0xce,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x7a,0x69,0x6b,0xb0,0x4c,0x40,0x42,0xcf,0x4c,0x40,0x42,0xcf,0x4c,0x40,0x42,0xcf,
- 0x4c,0x40,0x42,0xcf,0x4c,0x40,0x42,0xcf,0x4c,0x40,0x42,0xcf,0x82,0x6f,0x71,0xac,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x88,0x7b,0x7d,0xc4,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x75,0x75,0x75,0xff,0x4d,0x4d,0x4d,0xff,0x2f,0x2f,0x2f,0x9d,
- 0x6a,0x6a,0x6a,0xd0,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8a,0x7b,0x7d,0xbc,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x75,0x64,0x67,0xb4,0x6f,0x5f,0x60,0xb8,0x6f,0x5f,0x60,0xb8,0x6f,0x5f,0x60,0xb8,
- 0x6f,0x5f,0x60,0xb8,0x6f,0x5f,0x60,0xb8,0x6f,0x5f,0x60,0xb8,0x6f,0x5f,0x60,0xb8,0x7c,0x6a,0x6c,0xb0,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,
- 0x2e,0x28,0x28,0xe2,0x95,0x92,0x95,0xf4,0x95,0x92,0x95,0xf4,0x95,0x92,0x95,0xf4,0x95,0x92,0x95,0xf4,0x95,0x92,0x95,0xf4,
- 0xb2,0xab,0xad,0xe1,0x9f,0x90,0x92,0xbd,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8c,0x7a,0x7b,0xaf,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x80,0x80,0x80,0xff,0x4e,0x4e,0x4e,0xff,0x41,0x41,0x41,0xd9,0x7f,0x7f,0x7f,0xfb,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x8c,0x7a,0x7b,0xaa,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x89,0x75,0x77,0xa7,0x32,0x2a,0x2b,0xdf,
- 0x51,0x4c,0x4e,0xe8,0x6b,0x68,0x69,0xed,0x6b,0x68,0x69,0xed,0x6b,0x68,0x69,0xed,0x6b,0x68,0x69,0xed,0x6b,0x68,0x69,0xed,
- 0x6b,0x68,0x69,0xed,0x78,0x73,0x74,0xe4,0xa3,0x96,0x98,0xc3,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x80,0x6e,0x70,0xac,0x80,0x6e,0x70,0xac,
- 0x80,0x6e,0x70,0xac,0x80,0x6e,0x70,0xac,0x80,0x6e,0x70,0xac,0x80,0x6e,0x70,0xac,0x87,0x74,0x76,0xa8,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x83,0x80,0x80,0xf5,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x53,0x53,0x53,0xff,0x4d,0x4d,0x4d,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x6f,0x60,0x61,0xb7,0x2e,0x27,0x28,0xe1,0x87,0x83,0x86,0xf2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb7,0xb1,0xb3,0xe3,
- 0x93,0x80,0x82,0xac,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,
- 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x4d,0x48,0x48,0xe7,0x57,0x53,0x54,0xe9,0x57,0x53,0x54,0xe9,0x57,0x53,0x54,0xe9,
- 0x57,0x53,0x54,0xe9,0x81,0x76,0x78,0xcf,0x99,0x88,0x8a,0xb5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x80,0x80,0xf1,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4d,0x4d,0x4d,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x53,0x48,0x48,0xca,0x3b,0x35,0x36,0xe4,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xae,0xa9,0xab,0xe9,0xa0,0x91,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x83,0x80,0x80,0xf1,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4d,0x4d,0x4d,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8c,0x78,0x7a,0xa5,0x37,0x2f,0x30,0xdc,0x5d,0x58,0x59,0xea,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xa4,0xa1,0xa4,0xef,
- 0xae,0xa4,0xa6,0xd1,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,
- 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x80,0x80,0xf1,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4d,0x4d,0x4d,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x78,0x67,0x69,0xb2,0x2e,0x27,0x28,0xe1,0x7e,0x7a,0x7d,0xf0,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x9a,0x9b,0xf4,0xb9,0xb2,0xb4,0xe1,0x8e,0x7b,0x7e,0xa8,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x83,0x81,0x81,0xf2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4d,0x4d,0x4d,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x5b,0x4e,0x4f,0xc4,0x33,0x2d,0x2e,0xe2,0x98,0x96,0x98,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0xb0,0xab,0xad,0xe7,0x9b,0x8c,0x8e,0xb9,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,
- 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x81,0x81,0xf2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4c,0x4c,0x4c,0xfe,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x3e,0x35,0x36,0xd7,0x52,0x4e,0x4f,0xe8,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xa7,0xa3,0xa6,0xee,0xaa,0x9f,0xa0,0xcc,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x83,0x81,0x81,0xf2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4c,0x4c,0x4c,0xfe,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x80,0x6d,0x6f,0xad,
- 0x2e,0x27,0x28,0xe1,0x75,0x71,0x72,0xee,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9f,0x9d,0x9f,0xf3,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9e,0x9b,0x9d,0xf3,0xb6,0xaf,0xb2,0xdd,0x8d,0x79,0x7b,0xa6,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,
- 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x89,0x75,0x77,0xa7,0x7a,0x69,0x6b,0xb0,0x7a,0x69,0x6b,0xb0,
- 0x7a,0x68,0x6a,0xb1,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0xaa,0xa5,0xa8,0xec,0xa2,0x98,0x9b,0xd5,0x7a,0x69,0x6b,0xb0,0x7a,0x69,0x6b,0xb0,0x7a,0x69,0x6b,0xb0,
- 0x7a,0x69,0x6b,0xb0,0x7a,0x69,0x6b,0xb0,0x8b,0x78,0x7a,0xa6,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x81,0x81,0xf2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4c,0x4c,0x4c,0xfe,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x63,0x55,0x56,0xbf,0x2f,0x29,0x29,0xe2,0x94,0x91,0x94,0xf4,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xaf,0xab,0xac,0xe8,0x80,0x7d,0x7f,0xf0,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb3,0xae,0xaf,0xe6,0x98,0x87,0x8a,0xb4,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,
- 0x7a,0x68,0x6a,0xb1,0x2e,0x27,0x28,0xe1,0x5b,0x56,0x56,0xe9,0x5e,0x59,0x59,0xea,0x5e,0x59,0x59,0xea,0x8d,0x8a,0x8c,0xf3,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x88,0x84,0x87,0xf2,
- 0x5e,0x59,0x59,0xea,0x5e,0x59,0x59,0xea,0x5e,0x59,0x59,0xea,0x5e,0x59,0x59,0xea,0x5e,0x59,0x59,0xea,0x9c,0x8f,0x90,0xc3,
- 0x94,0x82,0x83,0xae,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x83,0x81,0x81,0xf2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4c,0x4c,0x4c,0xfe,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x46,0x3c,0x3d,0xd2,
- 0x4a,0x45,0x45,0xe6,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xa2,0x9e,0xa1,0xf1,
- 0xba,0xb3,0xb6,0xe2,0x4f,0x4a,0x4a,0xe4,0x93,0x90,0x92,0xf4,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0xaa,0xa5,0xa8,0xec,0xa7,0x9a,0x9c,0xc7,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,
- 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x7a,0x68,0x6a,0xb1,0x2e,0x27,0x28,0xe1,0x95,0x92,0x95,0xf4,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb8,0xb2,0xb4,0xe3,0x9c,0x8d,0x8e,0xb9,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x81,0x81,0xf2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4c,0x4c,0x4c,0xfd,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x87,0x73,0x75,0xa9,0x30,0x29,0x2a,0xe0,0x6a,0x67,0x69,0xed,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xaa,0xa6,0xa8,0xeb,0xb8,0xb0,0xb4,0xdf,0x4d,0x42,0x43,0xd0,0x75,0x71,0x72,0xee,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xa0,0x9d,0x9f,0xf2,0xb4,0xab,0xae,0xd9,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,
- 0x7a,0x68,0x6a,0xb1,0x2e,0x27,0x28,0xe1,0x95,0x92,0x95,0xf4,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb8,0xb2,0xb4,0xe3,
- 0x9c,0x8d,0x8e,0xb9,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x83,0x81,0x81,0xf2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4c,0x4c,0x4c,0xfd,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x6b,0x5c,0x5e,0xba,0x2e,0x27,0x28,0xe1,
- 0x8d,0x8a,0x8c,0xf3,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb4,0xae,0xb0,0xe6,
- 0xac,0xa2,0xa3,0xcf,0x66,0x57,0x59,0xbe,0x55,0x51,0x52,0xe9,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb5,0xb0,0xb2,0xe4,0x93,0x82,0x84,0xaf,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,
- 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x7a,0x68,0x6a,0xb1,0x2e,0x27,0x28,0xe1,0x95,0x92,0x95,0xf4,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb8,0xb2,0xb4,0xe3,0x9c,0x8d,0x8e,0xb9,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x81,0x81,0xf2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4c,0x4c,0x4c,0xfd,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x4e,0x43,0x44,0xcd,0x40,0x3a,0x3c,0xe5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9d,0x9b,0x9d,0xf4,0xba,0xb4,0xb6,0xe1,0x9e,0x8f,0x93,0xbd,0x80,0x6e,0x70,0xad,0x38,0x31,0x31,0xe3,
- 0x9a,0x97,0x9a,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xac,0xa7,0xaa,0xea,
- 0xa2,0x95,0x98,0xc2,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,
- 0x7a,0x68,0x6a,0xb1,0x2e,0x27,0x28,0xe1,0x95,0x92,0x95,0xf4,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb8,0xb2,0xb4,0xe3,
- 0x9c,0x8d,0x8e,0xb9,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x82,0x80,0x81,0xf2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4c,0x4c,0x4c,0xfd,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8b,0x77,0x79,0xa6,0x33,0x2c,0x2c,0xde,0x61,0x5d,0x5f,0xeb,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xa6,0xa2,0xa4,0xee,0xba,0xb4,0xb6,0xe1,
- 0x92,0x7f,0x81,0xac,0x8d,0x79,0x7a,0xa5,0x3c,0x33,0x34,0xd9,0x85,0x82,0x84,0xf1,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xa2,0xa0,0xa1,0xf0,0xb0,0xa7,0xa9,0xd4,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,
- 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x86,0x73,0x74,0xaa,0x66,0x57,0x59,0xbe,0xa9,0xa3,0xa6,0xe7,
- 0xad,0xa9,0xaa,0xe9,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0xa6,0xa2,0xa4,0xee,0xad,0xa9,0xaa,0xe9,0xad,0xa9,0xaa,0xe9,0xad,0xa9,0xaa,0xe9,0xad,0xa9,0xaa,0xe9,
- 0xad,0xa9,0xaa,0xe9,0xad,0xa9,0xaa,0xe9,0xb9,0xb3,0xb5,0xe2,0x9c,0x8d,0x8e,0xb9,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x82,0x80,0x81,0xf2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4c,0x4c,0x4c,0xfc,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x73,0x63,0x64,0xb5,0x2e,0x27,0x28,0xe1,0x83,0x7f,0x82,0xf1,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0xae,0xaa,0xac,0xe8,0xb2,0xa9,0xac,0xd8,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x57,0x4a,0x4b,0xc7,
- 0x66,0x62,0x64,0xec,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9c,0x99,0x9c,0xf5,
- 0xb8,0xb2,0xb4,0xe2,0x91,0x7e,0x80,0xaa,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x93,0x80,0x83,0xae,0x92,0x81,0x83,0xaf,0x3f,0x39,0x3a,0xe5,0x84,0x81,0x83,0xf1,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xae,0xa4,0xa6,0xd1,
- 0x94,0x82,0x84,0xaf,0x94,0x82,0x84,0xaf,0x94,0x82,0x84,0xaf,0x94,0x82,0x84,0xaf,0x94,0x82,0x84,0xaf,0x94,0x82,0x84,0xaf,
- 0x8e,0x7b,0x7d,0xa8,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x82,0x80,0x81,0xf2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4c,0x4c,0x4c,0xfc,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x56,0x49,0x4b,0xc8,0x38,0x32,0x32,0xe3,0x9a,0x97,0x9a,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb7,0xb1,0xb3,0xe3,0xa7,0x9a,0x9b,0xc7,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x72,0x62,0x63,0xb6,0x48,0x42,0x44,0xe6,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xae,0xaa,0xac,0xe8,0x9e,0x8f,0x91,0xbc,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,
- 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x82,0x80,0x81,0xf2,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4c,0x4c,0x4c,0xfc,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x3a,0x31,0x32,0xda,0x59,0x54,0x55,0xe9,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0xa1,0x9e,0xa0,0xf1,0xba,0xb4,0xb6,0xe1,0x99,0x88,0x8a,0xb5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x89,0x75,0x77,0xa7,
- 0x32,0x2b,0x2c,0xe0,0x95,0x92,0x95,0xf4,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0xa6,0xa2,0xa4,0xee,0xac,0xa1,0xa4,0xcf,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x83,0x80,0x81,0xf3,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4c,0x4c,0x4c,0xfc,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x7a,0x69,0x6b,0xb0,0x2e,0x27,0x28,0xe1,0x7a,0x77,0x78,0xef,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xaa,0xa6,0xa8,0xec,0xb8,0xb1,0xb4,0xdf,0x8e,0x7b,0x7c,0xa7,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x48,0x3e,0x3f,0xd0,0x78,0x75,0x76,0xef,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9c,0x9b,0x9c,0xf4,0xb8,0xb1,0xb4,0xe0,0x8e,0x7b,0x7d,0xa7,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,
- 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x80,0x81,0xf3,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4b,0x4b,0x4b,0xfb,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x5e,0x51,0x52,0xc3,
- 0x32,0x2c,0x2c,0xe2,0x97,0x95,0x97,0xf4,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0xb3,0xae,0xaf,0xe6,0xac,0xa2,0xa4,0xcf,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x63,0x55,0x56,0xbf,0x58,0x53,0x54,0xe9,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0xb2,0xad,0xaf,0xe7,0x9a,0x89,0x8c,0xb7,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x83,0x80,0x81,0xf3,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4b,0x4b,0x4b,0xfb,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x41,0x38,0x39,0xd5,0x4f,0x4a,0x4c,0xe7,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9d,0x9b,0x9d,0xf4,0xba,0xb3,0xb6,0xe2,0x9f,0x91,0x93,0xbe,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x7e,0x6c,0x6e,0xaf,0x39,0x33,0x34,0xe3,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xa8,0xa4,0xa6,0xed,0xa8,0x9c,0x9f,0xca,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,
- 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x80,0x81,0xf3,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4b,0x4b,0x4b,0xfb,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x70,0x72,0xab,0x2e,0x28,0x28,0xe1,
- 0x71,0x6d,0x6e,0xed,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9c,0x9b,0x9c,0xf4,
- 0xa3,0xa0,0xa2,0xf0,0x54,0x4b,0x4c,0xd4,0x48,0x3e,0x3f,0xd0,0x48,0x3e,0x3f,0xd0,0x48,0x3e,0x3f,0xd0,0x48,0x3e,0x3f,0xd0,
- 0x48,0x3e,0x3f,0xd0,0x2e,0x28,0x28,0xe1,0x88,0x85,0x86,0xf2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9f,0x9c,0x9e,0xf3,0xb6,0xae,0xb0,0xdc,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x83,0x80,0x80,0xf3,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4b,0x4b,0x4b,0xfb,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x67,0x58,0x59,0xbd,0x2f,0x28,0x29,0xe1,0x90,0x8d,0x90,0xf3,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x97,0x95,0x97,0xf5,0x97,0x95,0x97,0xf5,
- 0x97,0x95,0x97,0xf5,0x97,0x95,0x97,0xf5,0x97,0x95,0x97,0xf5,0x97,0x95,0x97,0xf5,0x97,0x95,0x97,0xf5,0x9a,0x97,0x9a,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb4,0xae,0xb0,0xe5,
- 0x96,0x85,0x88,0xb2,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,
- 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x80,0x80,0xf3,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4b,0x4b,0x4b,0xfa,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x49,0x3e,0x40,0xd0,0x47,0x40,0x42,0xe6,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xaa,0xa6,0xa8,0xeb,0xa5,0x98,0x99,0xc5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8b,0x78,0x7a,0xa6,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x83,0x80,0x80,0xf3,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4b,0x4b,0x4b,0xfa,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x88,0x75,0x77,0xa7,0x31,0x2a,0x2b,0xe0,0x67,0x63,0x64,0xec,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xa1,0x9e,0xa0,0xf1,
- 0xb3,0xaa,0xac,0xd7,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,
- 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8c,0x78,0x7a,0xa5,0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0xad,0xa8,0xaa,0xea,0xac,0xa1,0xa3,0xce,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x80,0x80,0xf3,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4b,0x4b,0x4b,0xfa,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x6e,0x5e,0x5f,0xb8,0x2e,0x27,0x28,0xe1,0x89,0x86,0x88,0xf2,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe3,0x93,0x80,0x82,0xad,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x34,0x2d,0x2d,0xdd,0x7f,0x7c,0x7d,0xf0,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xa7,0xa3,0xa5,0xed,0xad,0xa3,0xa5,0xd0,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x83,0x80,0x80,0xf3,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4b,0x4b,0x4b,0xfa,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x51,0x46,0x47,0xcb,0x3c,0x37,0x37,0xe4,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0xad,0xa9,0xaa,0xe9,0xa1,0x92,0x94,0xbf,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,
- 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x3d,0x35,0x35,0xd7,0x74,0x70,0x73,0xee,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9f,0x9c,0x9f,0xf2,0xb6,0xaf,0xb1,0xdd,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x80,0x80,0xf3,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4b,0x4b,0x4b,0xfa,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8c,0x78,0x7a,0xa5,0x35,0x2d,0x2e,0xdd,0x5e,0x59,0x5b,0xea,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9e,0x9b,0x9d,0xf3,0xb0,0xab,0xad,0xe8,0xb0,0xab,0xad,0xe8,
- 0xb0,0xab,0xad,0xe8,0xb0,0xab,0xad,0xe8,0xb0,0xab,0xad,0xe8,0xb0,0xab,0xad,0xe8,0xb0,0xab,0xad,0xe8,0xb0,0xab,0xad,0xe8,
- 0xb0,0xab,0xad,0xe8,0xb0,0xab,0xad,0xe8,0xaf,0xa9,0xac,0xe9,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xa4,0xa0,0xa3,0xef,0xb0,0xa5,0xa8,0xd2,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x48,0x3d,0x3e,0xd1,0x6a,0x65,0x67,0xec,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xa1,0x9e,0xa0,0xf1,
- 0x6d,0x61,0x64,0xce,0x6b,0x5c,0x5e,0xba,0x6c,0x5d,0x5e,0xba,0x6c,0x5d,0x5e,0xba,0x7c,0x6a,0x6d,0xb0,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x83,0x80,0x80,0xf3,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4b,0x4b,0x4b,0xf9,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x76,0x65,0x67,0xb3,
- 0x2e,0x27,0x28,0xe1,0x80,0x7d,0x7f,0xf0,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0xa6,0xa2,0xa5,0xee,0xba,0xb4,0xb6,0xe1,0x93,0x81,0x83,0xae,0x8f,0x7c,0x7e,0xa9,0x8f,0x7c,0x7e,0xa9,0x8f,0x7c,0x7e,0xa9,
- 0x8f,0x7c,0x7e,0xa9,0x8f,0x7c,0x7e,0xa9,0x8f,0x7c,0x7e,0xa9,0x8f,0x7c,0x7e,0xa9,0x8f,0x7c,0x7e,0xa9,0x8f,0x7c,0x7e,0xa9,
- 0x42,0x3a,0x3a,0xda,0x85,0x82,0x85,0xf2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9c,0x99,0x9c,0xf5,0xb8,0xb1,0xb4,0xe1,0x8f,0x7c,0x7e,0xa9,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,
- 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x53,0x47,0x48,0xca,0x5e,0x59,0x5c,0xea,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x8b,0x88,0x8a,0xf2,0x71,0x6e,0x70,0xee,
- 0x6f,0x6b,0x6b,0xed,0x8b,0x84,0x84,0xdc,0xa2,0x94,0x96,0xc1,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x80,0x80,0xf3,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4b,0x4b,0x4b,0xf9,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x5a,0x4c,0x4e,0xc6,0x35,0x2f,0x2f,0xe3,0x99,0x97,0x99,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xae,0xaa,0xac,0xe8,0xb1,0xa9,0xac,0xd7,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x57,0x4a,0x4b,0xc7,0x66,0x62,0x64,0xec,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb0,0xab,0xad,0xe8,0x9d,0x8e,0x91,0xbb,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x75,0x64,0x66,0xb4,0x4d,0x48,0x4a,0xe7,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xaa,0xa6,0xa8,0xec,0xb0,0xa7,0xa9,0xd4,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x83,0x81,0x81,0xf4,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4b,0x4b,0x4b,0xf9,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x3c,0x34,0x35,0xd8,
- 0x55,0x50,0x51,0xe8,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0xb8,0xb2,0xb4,0xe3,0xa4,0x98,0x9a,0xc5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x72,0x62,0x63,0xb6,0x47,0x41,0x43,0xe6,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0xa6,0xa2,0xa5,0xee,0xac,0xa0,0xa3,0xcd,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,
- 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x41,0x38,0x39,0xd6,0x8d,0x8b,0x8d,0xf3,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0xaa,0xa6,0xa8,0xec,0xb0,0xa7,0xa9,0xd4,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x81,0x81,0xf4,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4b,0x4b,0x4b,0xf9,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x7e,0x6c,0x6e,0xae,0x2e,0x27,0x28,0xe1,0x76,0x72,0x75,0xee,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xa2,0x9e,0xa1,0xf1,0xba,0xb4,0xb6,0xe1,0x98,0x87,0x8a,0xb4,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8a,0x76,0x78,0xa7,0x32,0x2b,0x2b,0xe0,0x94,0x91,0x94,0xf4,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9d,0x9b,0x9d,0xf4,0xb8,0xb0,0xb2,0xde,
- 0x8e,0x7a,0x7c,0xa6,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x77,0x66,0x68,0xb3,
- 0x64,0x5e,0x60,0xe5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xaa,0xa6,0xa8,0xec,0xb0,0xa7,0xa9,0xd4,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x83,0x81,0x81,0xf4,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x54,0x54,0x54,0xff,0x4a,0x4a,0x4a,0xf8,
- 0x7e,0x7e,0x7e,0xf9,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8c,0x7a,0x7b,0xaa,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x62,0x54,0x55,0xc1,0x30,0x2a,0x2b,0xe2,
- 0x96,0x93,0x95,0xf4,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xaa,0xa6,0xa8,0xeb,
- 0xb8,0xb0,0xb3,0xde,0x8e,0x7a,0x7c,0xa6,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x49,0x3e,0x40,0xd0,0x76,0x73,0x75,0xef,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0xb2,0xad,0xaf,0xe6,0x99,0x88,0x8a,0xb5,0x8d,0x79,0x7a,0xa5,0x73,0x63,0x64,0xb6,
- 0x2e,0x28,0x28,0xe2,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0xb6,0xb0,0xb2,0xe5,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x87,0x74,0x76,0xaa,0x7f,0x77,0x7b,0xdc,0x9e,0x9b,0x9d,0xf3,
- 0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,0x9b,0x98,0x9b,0xf5,
- 0x9b,0x98,0x9b,0xf5,0xaa,0xa6,0xa8,0xec,0xb0,0xa7,0xa9,0xd4,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x83,0x81,0x81,0xf6,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x53,0x53,0x53,0xff,0x4a,0x4a,0x4a,0xf8,0x66,0x66,0x66,0xc9,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x89,0x7b,0x7c,0xbb,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x7e,0x6c,0x6e,0xaf,0x85,0x78,0x7a,0xc2,0xb2,0xad,0xaf,0xe6,0xb2,0xad,0xaf,0xe6,0xb2,0xad,0xaf,0xe6,
- 0xb2,0xad,0xaf,0xe6,0xb2,0xad,0xaf,0xe6,0xb8,0xb2,0xb4,0xe3,0xac,0xa1,0xa3,0xce,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x80,0x6d,0x6f,0xad,0x8d,0x80,0x82,0xc7,
- 0xb2,0xad,0xaf,0xe6,0xb2,0xad,0xaf,0xe6,0xb2,0xad,0xaf,0xe6,0xb2,0xad,0xaf,0xe6,0xb2,0xad,0xaf,0xe6,0xb6,0xb0,0xb2,0xe3,
- 0xa6,0x99,0x9d,0xc8,0x8d,0x79,0x7a,0xa5,0x87,0x73,0x75,0xa9,0x75,0x64,0x66,0xb5,0xb2,0xad,0xaf,0xe6,0xb2,0xad,0xaf,0xe6,
- 0xb2,0xad,0xaf,0xe6,0xb2,0xad,0xaf,0xe6,0xb2,0xad,0xaf,0xe6,0xb9,0xb3,0xb5,0xe2,0xa0,0x92,0x94,0xbe,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x97,0x86,0x88,0xb2,0xa6,0x9a,0x9d,0xcb,0xa6,0x9d,0xa1,0xd7,0xac,0xa5,0xa7,0xe1,
- 0xb1,0xac,0xae,0xe6,0xb2,0xad,0xaf,0xe6,0xb2,0xad,0xaf,0xe6,0xb2,0xad,0xaf,0xe6,0xb6,0xb1,0xb2,0xe4,0xb0,0xa7,0xa9,0xd4,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8c,0x79,0x7b,0xa9,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x81,0x81,0x81,0xff,0x4e,0x4e,0x4e,0xff,0x4a,0x4a,0x4a,0xf8,
- 0x4b,0x4b,0x4b,0x94,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x8a,0x7f,0x80,0xd8,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8a,0x7a,0x7c,0xb7,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x79,0x79,0x79,0xff,0x4d,0x4d,0x4d,0xff,0x4a,0x4a,0x4a,0xf8,0x48,0x48,0x48,0xae,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x83,0x82,0x82,0xfb,0x8c,0x79,0x7b,0xab,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x86,0x7f,0x7f,0xde,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x71,0x71,0x71,0xff,0x4d,0x4d,0x4d,0xff,0x46,0x46,0x46,0xe8,
- 0x25,0x25,0x25,0x6a,0x80,0x80,0x80,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x84,0x7f,0x7f,0xe7,
- 0x8b,0x7a,0x7b,0xb0,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,0x8d,0x79,0x7a,0xa5,
- 0x8b,0x7a,0x7b,0xaf,0x85,0x7e,0x7f,0xdb,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x68,0x68,0x68,0xff,0x4d,0x4d,0x4d,0xff,0x39,0x39,0x39,0xc0,0x0a,0x0a,0x0a,0x23,0x66,0x66,0x66,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x81,0x80,0x81,0xfb,0x85,0x7f,0x80,0xe5,0x86,0x7d,0x7e,0xd7,
- 0x88,0x7c,0x7d,0xca,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,
- 0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,
- 0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,
- 0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,
- 0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,
- 0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,
- 0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,
- 0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,
- 0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,
- 0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x89,0x7c,0x7d,0xc7,0x88,0x7c,0x7d,0xc6,0x88,0x7c,0x7d,0xc8,
- 0x87,0x7d,0x7e,0xce,0x86,0x7d,0x7e,0xd4,0x85,0x7f,0x80,0xe6,0x81,0x81,0x81,0xfe,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x7b,0x7b,0x7b,0xff,0x51,0x51,0x51,0xff,0x4d,0x4d,0x4d,0xff,0x2d,0x2d,0x2d,0x98,
- 0x00,0x00,0x00,0x00,0x46,0x46,0x46,0xe7,0x79,0x79,0x79,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x7d,0x7d,0x7d,0xff,0x54,0x54,0x54,0xff,
- 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x21,0x21,0x21,0x70,0x00,0x00,0x00,0x00,0x1c,0x1c,0x1c,0x5e,0x55,0x55,0x55,0xff,
- 0x75,0x75,0x75,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x7f,0x7f,0x7f,0xff,0x57,0x57,0x57,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x48,0x48,0x48,0xf1,0x0c,0x0c,0x0c,0x28,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x39,0x39,0xbd,0x4d,0x4d,0x4d,0xff,0x60,0x60,0x60,0xff,0x7d,0x7d,0x7d,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,0x82,0x82,0x82,0xff,
- 0x82,0x82,0x82,0xff,0x76,0x76,0x76,0xff,0x62,0x62,0x62,0xff,0x50,0x50,0x50,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,
- 0x4a,0x4a,0x4a,0xf8,0x13,0x13,0x13,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x0b,0x0b,0x27,
- 0x45,0x45,0x45,0xe6,0x4d,0x4d,0x4d,0xff,0x4e,0x4e,0x4e,0xff,0x57,0x57,0x57,0xff,0x5e,0x5e,0x5e,0xff,0x66,0x66,0x66,0xff,
- 0x6d,0x6d,0x6d,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,
- 0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,
- 0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,
- 0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,
- 0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,
- 0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,
- 0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,
- 0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,
- 0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,
- 0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6e,0x6e,0x6e,0xff,0x6c,0x6c,0x6c,0xff,
- 0x68,0x68,0x68,0xff,0x65,0x65,0x65,0xff,0x61,0x61,0x61,0xff,0x54,0x54,0x54,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,
- 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4c,0x4c,0x4c,0xfc,0x18,0x18,0x18,0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x03,0x0c,0x29,0x29,0x29,0x89,0x4b,0x4b,0x4b,0xf9,
- 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,
- 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,
- 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,
- 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,
- 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,
- 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,
- 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,
- 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,
- 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,
- 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,
- 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,
- 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4c,0x4c,0x4c,0xfc,0x36,0x36,0x36,0xb4,0x15,0x15,0x15,0x46,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x0b,0x0b,0x25,0x25,0x25,0x25,0x7b,0x30,0x30,0x30,0xa1,0x3c,0x3c,0x3c,0xc8,
- 0x47,0x47,0x47,0xee,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,
- 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,
- 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,
- 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,
- 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,
- 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,
- 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,
- 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,
- 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,
- 0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,0x4d,0x4d,0x4d,0xff,
- 0x4c,0x4c,0x4c,0xfd,0x47,0x47,0x47,0xec,0x42,0x42,0x42,0xdd,0x3e,0x3e,0x3e,0xce,0x38,0x38,0x38,0xbc,0x23,0x23,0x23,0x75,
- 0x07,0x07,0x07,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}
-};
diff --git a/client/x11/images/red_icon.c b/client/x11/images/red_icon.c
deleted file mode 100644
index 143d4e2d..00000000
--- a/client/x11/images/red_icon.c
+++ /dev/null
@@ -1,275 +0,0 @@
-static const struct {
- int width;
- int height;
- uint8_t pixmap[4096];
- uint8_t mask[128];
-} _red_icon = { 32, 32, {
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0xd3,0xd3,0xd3,0x00,0x1a,0x1a,0x1a,0x07,0x1a,0x1a,0x1a,0x49,
- 0x1a,0x1a,0x1a,0x98,0x1f,0x1f,0x1f,0xc2,0x2d,0x2d,0x2d,0xdd,0x34,0x34,0x34,0xf4,
- 0x3c,0x3c,0x3c,0xf5,0x45,0x45,0x45,0xe0,0x4f,0x4f,0x4f,0xcc,0x5b,0x5b,0x5b,0xac,
- 0x83,0x83,0x83,0x6d,0xe7,0xe7,0xe7,0x36,0xff,0xff,0xff,0x2c,0xff,0xff,0xff,0x27,
- 0xff,0xff,0xff,0x1f,0xff,0xff,0xff,0x16,0xff,0xff,0xff,0x0a,0xff,0xff,0xff,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd3,0xd3,0xd3,0x00,
- 0x1a,0x1a,0x1a,0x19,0x1a,0x1a,0x1a,0x97,0x1a,0x1a,0x1a,0xf2,0x1a,0x1a,0x1a,0xff,
- 0x26,0x26,0x26,0xff,0x32,0x32,0x32,0xff,0x3d,0x3d,0x3d,0xff,0x47,0x47,0x47,0xff,
- 0x4f,0x4f,0x4f,0xff,0x55,0x55,0x55,0xff,0x5a,0x5a,0x5a,0xff,0x5c,0x5c,0x5c,0xff,
- 0x5c,0x5c,0x5c,0xff,0x5d,0x5d,0x5d,0xf6,0x71,0x71,0x71,0xb3,0xc9,0xc9,0xc9,0x51,
- 0xff,0xff,0xff,0x35,0xff,0xff,0xff,0x2b,0xff,0xff,0xff,0x20,0xff,0xff,0xff,0x13,
- 0xff,0xff,0xff,0x03,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x1a,0x1a,0x08,0x1a,0x1a,0x1a,0x84,
- 0x1a,0x1a,0x1a,0xf5,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x28,0x28,0x28,0xff,
- 0x37,0x37,0x37,0xff,0x43,0x43,0x43,0xff,0x4f,0x4f,0x4f,0xff,0x5a,0x5a,0x5a,0xff,
- 0x63,0x63,0x63,0xff,0x6a,0x6a,0x6a,0xff,0x6f,0x6f,0x6f,0xff,0x72,0x72,0x72,0xff,
- 0x72,0x72,0x72,0xff,0x70,0x70,0x70,0xff,0x6c,0x6c,0x6c,0xff,0x67,0x67,0x67,0xf8,
- 0x80,0x80,0x80,0xa8,0xeb,0xeb,0xeb,0x46,0xff,0xff,0xff,0x33,0xff,0xff,0xff,0x25,
- 0xff,0xff,0xff,0x16,0xff,0xff,0xff,0x04,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x1a,0x1a,0x1a,0x18,0x1a,0x1a,0x1a,0xc8,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x27,0x27,0x27,0xff,0x37,0x37,0x37,0xff,
- 0x45,0x45,0x45,0xff,0x53,0x53,0x53,0xff,0x60,0x60,0x60,0xff,0x6c,0x6c,0x6c,0xff,
- 0x76,0x76,0x76,0xff,0x7f,0x7f,0x7f,0xff,0x84,0x84,0x84,0xff,0x88,0x88,0x88,0xff,
- 0x88,0x88,0x88,0xff,0x86,0x86,0x86,0xff,0x80,0x80,0x80,0xff,0x79,0x79,0x79,0xff,
- 0x6f,0x6f,0x6f,0xff,0x71,0x71,0x71,0xda,0xd1,0xd1,0xd1,0x57,0xff,0xff,0xff,0x36,
- 0xff,0xff,0xff,0x26,0xff,0xff,0xff,0x15,0xff,0xff,0xff,0x02,0xff,0xff,0xff,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x1a,0x1a,0x1a,0x2d,0x1a,0x1a,0x1a,0xe3,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x21,0x21,0x21,0xff,0x32,0x32,0x32,0xff,0x42,0x42,0x42,0xff,
- 0x53,0x53,0x53,0xff,0x62,0x62,0x62,0xff,0x6f,0x6f,0x6f,0xff,0x7d,0x7d,0x7d,0xff,
- 0x88,0x88,0x88,0xff,0x92,0x92,0x92,0xff,0x9a,0x9a,0x9a,0xff,0x9d,0x9d,0x9d,0xff,
- 0x9e,0x9e,0x9e,0xff,0x9b,0x9b,0x9b,0xff,0x95,0x95,0x95,0xff,0x8c,0x8c,0x8c,0xff,
- 0x81,0x81,0x81,0xff,0x75,0x75,0x75,0xff,0x6c,0x6c,0x6c,0xec,0xb5,0xb5,0xb5,0x66,
- 0xff,0xff,0xff,0x34,0xff,0xff,0xff,0x22,0xff,0xff,0xff,0x10,0xff,0xff,0xff,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x1a,0x1a,0x18,
- 0x1a,0x1a,0x1a,0xe3,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x2a,0x2a,0x2a,0xff,0x3c,0x3c,0x3c,0xff,0x4d,0x4d,0x4d,0xff,
- 0x5d,0x5d,0x5d,0xff,0x6e,0x6e,0x6e,0xff,0x7e,0x7e,0x7e,0xff,0x8c,0x8c,0x8c,0xff,
- 0x9a,0x9a,0x9a,0xff,0xa5,0xa5,0xa5,0xff,0xae,0xae,0xae,0xff,0xb3,0xb3,0xb3,0xff,
- 0xb4,0xb4,0xb4,0xff,0xb0,0xb0,0xb0,0xff,0xa9,0xa9,0xa9,0xff,0x9e,0x9e,0x9e,0xff,
- 0x91,0x91,0x91,0xff,0x83,0x83,0x83,0xff,0x74,0x74,0x74,0xff,0x6a,0x6a,0x6a,0xec,
- 0xcd,0xcd,0xcd,0x52,0xff,0xff,0xff,0x2d,0xff,0xff,0xff,0x1a,0xff,0xff,0xff,0x05,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x1a,0x1a,0x08,0x1a,0x1a,0x1a,0xc8,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1e,0x1e,0x1e,0xff,0x31,0x31,0x31,0xff,0x43,0x43,0x43,0xff,0x55,0x55,0x55,0xff,
- 0x66,0x66,0x66,0xff,0x77,0x77,0x77,0xff,0x88,0x88,0x88,0xff,0x99,0x99,0x99,0xff,
- 0xa9,0xa9,0xa9,0xff,0xb6,0xb6,0xb6,0xff,0xc1,0xc1,0xc1,0xff,0xc8,0xc8,0xc8,0xff,
- 0xca,0xca,0xca,0xff,0xc5,0xc5,0xc5,0xff,0xbb,0xbb,0xbb,0xff,0xae,0xae,0xae,0xff,
- 0x9f,0x9f,0x9f,0xff,0x8f,0x8f,0x8f,0xff,0x7e,0x7e,0x7e,0xff,0x6d,0x6d,0x6d,0xff,
- 0x67,0x67,0x67,0xd8,0xe7,0xe7,0xe7,0x3b,0xff,0xff,0xff,0x21,0xff,0xff,0xff,0x0d,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x1a,0x1a,0x84,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x23,0x23,0x23,0xff,0x36,0x36,0x36,0xff,0x48,0x48,0x48,0xff,0x5b,0x5b,0x5b,0xff,
- 0x6d,0x6d,0x6d,0xff,0x7f,0x7f,0x7f,0xff,0x91,0x91,0x91,0xff,0xa3,0xa3,0xa3,0xff,
- 0xb4,0xb4,0xb4,0xff,0xc4,0xc4,0xc4,0xff,0xd3,0xd3,0xd3,0xff,0xde,0xde,0xde,0xff,
- 0xe0,0xe0,0xe0,0xff,0xd7,0xd7,0xd7,0xff,0xca,0xca,0xca,0xff,0xba,0xba,0xba,0xff,
- 0xa9,0xa9,0xa9,0xff,0x98,0x98,0x98,0xff,0x86,0x86,0x86,0xff,0x73,0x73,0x73,0xff,
- 0x61,0x61,0x61,0xff,0x6e,0x6e,0x6e,0xa0,0xff,0xff,0xff,0x27,0xff,0xff,0xff,0x12,
- 0x00,0x00,0x00,0x00,0x1a,0x1a,0x1a,0x19,0x1a,0x1a,0x1a,0xf5,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x26,0x26,0x26,0xff,0x3e,0x3e,0x41,0xff,0x5f,0x5f,0x65,0xff,0x5d,0x5d,0x5d,0xff,
- 0x6f,0x6f,0x6f,0xff,0x82,0x82,0x82,0xff,0x9b,0x9f,0x9b,0xff,0xad,0xae,0xad,0xff,
- 0xba,0xba,0xba,0xff,0xcc,0xcc,0xcc,0xff,0xdf,0xdf,0xdf,0xff,0xf0,0xf0,0xf0,0xff,
- 0xf6,0xf6,0xf6,0xff,0xe5,0xe5,0xe5,0xff,0xd3,0xd3,0xd3,0xff,0xc1,0xc1,0xc1,0xff,
- 0xae,0xae,0xae,0xff,0x9b,0x9b,0x9b,0xff,0x89,0x89,0x89,0xff,0x76,0x76,0x76,0xff,
- 0x65,0x65,0x65,0xff,0x53,0x53,0x53,0xf7,0xb1,0xb1,0xb1,0x3e,0xff,0xff,0xff,0x14,
- 0x00,0x00,0x00,0x00,0x1a,0x1a,0x1a,0x97,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x25,0x25,0x25,0xff,0x6a,0x6a,0x86,0xff,0xa7,0xa7,0xc0,0xff,0x5e,0x5e,0x5f,0xff,
- 0x6f,0x6f,0x6f,0xff,0x82,0x82,0x82,0xff,0xb0,0xc4,0xb0,0xff,0xcc,0xd5,0xcc,0xff,
- 0xb9,0xb9,0xb9,0xff,0xcc,0xcc,0xcc,0xff,0xdd,0xdd,0xdd,0xff,0xf1,0xf0,0xf0,0xff,
- 0xfe,0xfb,0xfb,0xff,0xe6,0xe5,0xe5,0xff,0xd2,0xd2,0xd2,0xff,0xc0,0xc0,0xc0,0xff,
- 0xae,0xae,0xae,0xff,0x9b,0x9b,0x9b,0xff,0x88,0x88,0x88,0xff,0x76,0x76,0x76,0xff,
- 0x64,0x64,0x64,0xff,0x52,0x52,0x52,0xff,0x52,0x52,0x52,0xa8,0xff,0xff,0xff,0x14,
- 0x1a,0x1a,0x1a,0x07,0x1a,0x1a,0x1a,0xf2,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x27,0x27,0x2f,0xff,0x9a,0x9a,0xe3,0xff,0xca,0xca,0xff,0xff,0x84,0x84,0x8f,0xff,
- 0x6c,0x6c,0x6c,0xff,0x7f,0x8a,0x7f,0xff,0xc1,0xf6,0xc1,0xff,0xe2,0xfe,0xe2,0xff,
- 0xc0,0xc3,0xc0,0xff,0xc2,0xc2,0xc2,0xff,0xd0,0xd0,0xd0,0xff,0xf2,0xe8,0xe8,0xff,
- 0xff,0xf4,0xf4,0xff,0xee,0xe8,0xe8,0xff,0xc8,0xc8,0xc8,0xff,0xb8,0xb8,0xb8,0xff,
- 0xa8,0xa8,0xa8,0xff,0x96,0x96,0x96,0xff,0x85,0x85,0x85,0xff,0x73,0x73,0x73,0xff,
- 0x61,0x61,0x61,0xff,0x4e,0x4e,0x4e,0xff,0x3e,0x3e,0x3e,0xf4,0xbf,0xbf,0xbf,0x18,
- 0x1a,0x1a,0x1a,0x49,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x3e,0x3e,0x7a,0xff,0x9b,0x9b,0xff,0xff,0xbb,0xbb,0xff,0xff,0xc2,0xc2,0xe5,0xff,
- 0x6f,0x6f,0x72,0xff,0x7e,0xb6,0x7e,0xff,0xb4,0xff,0xb4,0xff,0xd3,0xff,0xd3,0xff,
- 0xda,0xe8,0xda,0xff,0xb5,0xb5,0xb5,0xff,0xce,0xc4,0xc4,0xff,0xff,0xe3,0xe3,0xff,
- 0xff,0xe9,0xe9,0xff,0xff,0xed,0xed,0xff,0xcb,0xc6,0xc6,0xff,0xab,0xab,0xab,0xff,
- 0x9d,0x9d,0x9d,0xff,0x8d,0x8d,0x8d,0xff,0x7d,0x7d,0x7d,0xff,0x6c,0x6c,0x6c,0xff,
- 0x5b,0x5b,0x5b,0xff,0x49,0x49,0x49,0xff,0x37,0x37,0x37,0xff,0x3b,0x3b,0x3b,0x51,
- 0x1a,0x1a,0x1a,0x98,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x2a,0xff,
- 0x5a,0x5a,0xe5,0xff,0x88,0x88,0xff,0xff,0xaa,0xaa,0xff,0xff,0xc7,0xc7,0xff,0xff,
- 0x9b,0xa1,0xac,0xff,0x73,0xf5,0x73,0xff,0x9e,0xff,0x9e,0xff,0xc0,0xff,0xc0,0xff,
- 0xdd,0xff,0xdd,0xff,0xc0,0xc6,0xc0,0xff,0xe4,0xbc,0xbc,0xff,0xff,0xd2,0xd2,0xff,
- 0xff,0xda,0xda,0xff,0xff,0xe1,0xe1,0xff,0xee,0xdb,0xdb,0xff,0xa0,0x9e,0x9e,0xff,
- 0x8f,0x8f,0x8f,0xff,0x81,0x81,0x81,0xff,0x72,0x72,0x72,0xff,0x62,0x62,0x62,0xff,
- 0x52,0x52,0x52,0xff,0x41,0x41,0x41,0xff,0x30,0x30,0x30,0xff,0x1f,0x1f,0x1f,0x99,
- 0x1a,0x1a,0x1a,0xc1,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x22,0x22,0x7d,0xff,
- 0x53,0x53,0xff,0xff,0x72,0x72,0xff,0xff,0x96,0x96,0xff,0xff,0xb7,0xb7,0xff,0xff,
- 0xd0,0xd0,0xfc,0xff,0x74,0xd2,0x7c,0xff,0x84,0xff,0x84,0xff,0xaa,0xff,0xaa,0xff,
- 0xca,0xff,0xca,0xff,0xde,0xf5,0xdd,0xff,0xec,0xb4,0xb2,0xff,0xff,0xbe,0xbe,0xff,
- 0xff,0xc8,0xc8,0xff,0xff,0xd1,0xd1,0xff,0xff,0xda,0xda,0xff,0xbe,0xb1,0xb1,0xff,
- 0x7f,0x7f,0x7f,0xff,0x72,0x72,0x72,0xff,0x65,0x65,0x65,0xff,0x56,0x56,0x56,0xff,
- 0x47,0x47,0x47,0xff,0x37,0x37,0x37,0xff,0x26,0x26,0x26,0xff,0x1a,0x1a,0x1a,0xc1,
- 0x1a,0x1a,0x1a,0xda,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x15,0x15,0x2c,0xff,0x24,0x24,0xe9,0xff,
- 0x42,0x42,0xff,0xff,0x5f,0x5f,0xff,0xff,0x81,0x81,0xff,0xff,0xa3,0xa3,0xff,0xff,
- 0xc1,0xc1,0xff,0xff,0xb1,0xc6,0xcb,0xff,0x67,0xf1,0x68,0xff,0x8e,0xff,0x8e,0xff,
- 0xb2,0xff,0xb2,0xff,0xd1,0xff,0xd1,0xff,0xda,0xd0,0xc3,0xff,0xfc,0xa4,0xa4,0xff,
- 0xff,0xb3,0xb3,0xff,0xff,0xbe,0xbe,0xff,0xff,0xc9,0xc9,0xff,0xfa,0xd2,0xd2,0xff,
- 0x82,0x7d,0x7d,0xff,0x62,0x62,0x62,0xff,0x55,0x55,0x55,0xff,0x48,0x48,0x48,0xff,
- 0x3a,0x3a,0x3a,0xff,0x2b,0x2b,0x2b,0xff,0x1b,0x1b,0x1b,0xff,0x1a,0x1a,0x1a,0xda,
- 0x1a,0x1a,0x1a,0xf3,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x08,0x08,0x82,0xff,0x16,0x16,0xff,0xff,
- 0x32,0x32,0xff,0xff,0x4e,0x4e,0xff,0xff,0x6a,0x6a,0xff,0xff,0x8c,0x8c,0xff,0xff,
- 0xad,0xad,0xff,0xff,0xc9,0xc9,0xff,0xff,0x7c,0xc3,0x8a,0xff,0x6e,0xff,0x6e,0xff,
- 0x96,0xff,0x96,0xff,0xba,0xff,0xba,0xff,0xda,0xff,0xda,0xff,0xd8,0xa2,0x9b,0xff,
- 0xff,0x99,0x99,0xff,0xff,0xa7,0xa7,0xff,0xff,0xb5,0xb5,0xff,0xff,0xc2,0xc2,0xff,
- 0xc7,0xa7,0xa7,0xff,0x52,0x52,0x52,0xff,0x45,0x45,0x45,0xff,0x39,0x39,0x39,0xff,
- 0x2c,0x2c,0x2c,0xff,0x1c,0x1c,0x1c,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xf3,
- 0x1a,0x1a,0x1a,0xf3,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x13,0x13,0x2e,0xff,0x01,0x01,0xee,0xff,0x05,0x05,0xff,0xff,
- 0x21,0x21,0xff,0xff,0x3d,0x3d,0xff,0xff,0x59,0x59,0xff,0xff,0x75,0x75,0xff,0xff,
- 0x96,0x96,0xff,0xff,0xb6,0xb6,0xff,0xff,0xc1,0xc6,0xea,0xff,0x57,0xd9,0x5c,0xff,
- 0x75,0xff,0x75,0xff,0x9d,0xff,0x9d,0xff,0xc2,0xff,0xc2,0xff,0xd5,0xde,0xc9,0xff,
- 0xec,0x7f,0x7d,0xff,0xff,0x8d,0x8d,0xff,0xff,0x9d,0x9d,0xff,0xff,0xac,0xac,0xff,
- 0xff,0xbc,0xbc,0xff,0x7b,0x6a,0x6a,0xff,0x34,0x34,0x34,0xff,0x28,0x28,0x28,0xff,
- 0x1b,0x1b,0x1b,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xf3,
- 0x1a,0x1a,0x1a,0xda,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x08,0x08,0x87,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,
- 0x10,0x10,0xff,0xff,0x2d,0x2d,0xff,0xff,0x49,0x49,0xff,0xff,0x65,0x65,0xff,0xff,
- 0x81,0x81,0xff,0xff,0x9e,0x9e,0xff,0xff,0xbd,0xbd,0xff,0xff,0x88,0xb6,0xa1,0xff,
- 0x4d,0xfc,0x4d,0xff,0x7c,0xff,0x7c,0xff,0xa5,0xff,0xa5,0xff,0xcc,0xff,0xcc,0xff,
- 0xc6,0x9d,0x90,0xff,0xff,0x70,0x70,0xff,0xff,0x82,0x82,0xff,0xff,0x93,0x93,0xff,
- 0xff,0xa5,0xa5,0xff,0xe0,0xa3,0xa3,0xff,0x2e,0x2a,0x2a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xda,
- 0x1a,0x1a,0x1a,0xc1,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x13,0x13,0x32,0xff,0x00,0x00,0xf0,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,
- 0x00,0x00,0xff,0xff,0x1c,0x1c,0xff,0xff,0x38,0x38,0xff,0xff,0x54,0x54,0xff,0xff,
- 0x70,0x70,0xff,0xff,0x8d,0x8d,0xff,0xff,0xa9,0xa9,0xff,0xff,0xc4,0xc4,0xfe,0xff,
- 0x4c,0xbc,0x59,0xff,0x55,0xff,0x55,0xff,0x83,0xff,0x83,0xff,0xaf,0xff,0xaf,0xff,
- 0xd2,0xf5,0xd1,0xff,0xd1,0x61,0x5d,0xff,0xff,0x63,0x63,0xff,0xff,0x75,0x75,0xff,
- 0xff,0x8a,0x8a,0xff,0xff,0xa0,0xa0,0xff,0x8c,0x67,0x67,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xc1,
- 0x1a,0x1a,0x1a,0x98,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x08,0x08,0x8c,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,
- 0x00,0x00,0xff,0xff,0x0b,0x0b,0xff,0xff,0x27,0x27,0xff,0xff,0x44,0x44,0xff,0xff,
- 0x60,0x60,0xff,0xff,0x7c,0x7c,0xff,0xff,0x98,0x98,0xff,0xff,0xb4,0xb4,0xff,0xff,
- 0xa5,0xb8,0xc9,0xff,0x34,0xe3,0x37,0xff,0x60,0xff,0x60,0xff,0x8e,0xff,0x8e,0xff,
- 0xbd,0xff,0xbd,0xff,0xbc,0xb0,0x98,0xff,0xf5,0x44,0x44,0xff,0xff,0x5e,0x5e,0xff,
- 0xff,0x76,0x76,0xff,0xff,0x8e,0x8e,0xff,0xfd,0xa5,0xa5,0xff,0x46,0x38,0x38,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0x98,
- 0x1a,0x1a,0x1a,0x49,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x12,0x12,0x34,0xff,
- 0x00,0x00,0xdd,0xff,0x00,0x00,0xe9,0xff,0x00,0x00,0xe9,0xff,0x00,0x00,0xea,0xff,
- 0x00,0x00,0xea,0xff,0x00,0x00,0xeb,0xff,0x15,0x15,0xeb,0xff,0x2f,0x2f,0xec,0xff,
- 0x49,0x49,0xed,0xff,0x63,0x63,0xed,0xff,0x7e,0x7e,0xee,0xff,0x98,0x98,0xee,0xff,
- 0xb4,0xb4,0xef,0xff,0x5f,0xa4,0x72,0xff,0x45,0xfd,0x45,0xff,0x75,0xfe,0x75,0xff,
- 0xa3,0xfe,0xa3,0xff,0xd2,0xff,0xd2,0xff,0xa9,0x67,0x5b,0xff,0xd5,0x40,0x40,0xff,
- 0xd5,0x54,0x54,0xff,0xd7,0x69,0x69,0xff,0xd9,0x7e,0x7e,0xff,0x9d,0x6c,0x6c,0xff,
- 0x1d,0x1c,0x1c,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0x49,
- 0x1a,0x1a,0x1a,0x07,0x1a,0x1a,0x1a,0xf2,0x1a,0x1a,0x1a,0xff,0x19,0x19,0x19,0xff,
- 0x18,0x18,0x18,0xff,0x17,0x17,0x18,0xff,0x17,0x17,0x18,0xff,0x17,0x17,0x19,0xff,
- 0x14,0x1a,0x16,0xff,0x12,0x1e,0x15,0xff,0x12,0x1f,0x15,0xff,0x13,0x1e,0x16,0xff,
- 0x13,0x20,0x16,0xff,0x13,0x1f,0x15,0xff,0x14,0x21,0x16,0xff,0x14,0x22,0x16,0xff,
- 0x14,0x22,0x16,0xff,0x14,0x22,0x15,0xff,0x16,0x24,0x16,0xff,0x1a,0x25,0x1a,0xff,
- 0x1d,0x25,0x1d,0xff,0x20,0x25,0x20,0xff,0x1f,0x21,0x1f,0xff,0x19,0x19,0x19,0xff,
- 0x19,0x19,0x19,0xff,0x19,0x19,0x19,0xff,0x18,0x18,0x18,0xff,0x18,0x18,0x18,0xff,
- 0x19,0x19,0x19,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xf2,0x1a,0x1a,0x1a,0x07,
- 0x00,0x00,0x6e,0x00,0x1a,0x1a,0x1a,0x97,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0x97,0xd3,0xd3,0xd3,0x00,
- 0x00,0x00,0x00,0x00,0x1a,0x1a,0x1a,0x19,0x1a,0x1a,0x1a,0xf5,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xf5,0x1a,0x1a,0x1a,0x19,0xff,0xff,0xff,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x00,0x1a,0x1a,0x1a,0x84,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0x84,0xd3,0xd3,0xd3,0x00,0x98,0x88,0x88,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x1a,0x1a,0x1a,0x08,0x1a,0x1a,0x1a,0xc8,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xc8,0x1a,0x1a,0x1a,0x08,0xa4,0x6d,0x6d,0x00,0x73,0x58,0x58,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x1a,0x1a,0x18,
- 0x1a,0x1a,0x1a,0xe3,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xe3,
- 0x1a,0x1a,0x1a,0x18,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x1a,0x1a,0x1a,0x2d,0x1a,0x1a,0x1a,0xe3,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xe3,0x1a,0x1a,0x1a,0x2d,
- 0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x1a,0x1a,0x1a,0x18,0x1a,0x1a,0x1a,0xc8,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xc8,0x1a,0x1a,0x1a,0x18,0xff,0xff,0xff,0x00,
- 0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x1a,0x1a,0x08,0x1a,0x1a,0x1a,0x84,
- 0x1a,0x1a,0x1a,0xf5,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xf5,
- 0x1a,0x1a,0x1a,0x84,0x1a,0x1a,0x1a,0x08,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,
- 0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x1a,0x1a,0x1a,0x19,0x1a,0x1a,0x1a,0x97,0x1a,0x1a,0x1a,0xf2,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,
- 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xf2,0x1a,0x1a,0x1a,0x97,0x1a,0x1a,0x1a,0x19,
- 0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x1a,0x1a,0x07,0x1a,0x1a,0x1a,0x49,
- 0x1a,0x1a,0x1a,0x98,0x1a,0x1a,0x1a,0xc1,0x1a,0x1a,0x1a,0xda,0x1a,0x1a,0x1a,0xf3,
- 0x1a,0x1a,0x1a,0xf3,0x1a,0x1a,0x1a,0xda,0x1a,0x1a,0x1a,0xc1,0x1a,0x1a,0x1a,0x98,
- 0x1a,0x1a,0x1a,0x49,0x1a,0x1a,0x1a,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
-
- {0x00,0x0f,0xf0,0x00,0x00,0x7f,0xfe,0x00,0x01,0xff,0xff,0x80,
- 0x03,0xff,0xff,0xc0,0x07,0xff,0xff,0xe0,0x0f,0xff,0xff,0xf0,
- 0x1f,0xff,0xff,0xf8,0x3f,0xff,0xff,0xfc,0x3f,0xff,0xff,0xfc,
- 0x7f,0xff,0xff,0xfe,0x7f,0xff,0xff,0xfe,0x7f,0xff,0xff,0xfe,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xfe,
- 0x7f,0xff,0xff,0xfe,0x7f,0xff,0xff,0xfe,0x3f,0xff,0xff,0xfc,
- 0x3f,0xff,0xff,0xfc,0x1f,0xff,0xff,0xf8,0x0f,0xff,0xff,0xf0,
- 0x07,0xff,0xff,0xe0,0x03,0xff,0xff,0xc0,0x01,0xff,0xff,0x80,
- 0x00,0x7f,0xfe,0x00,0x00,0x0f,0xf0,0x00}
-};
diff --git a/client/x11/main.cpp b/client/x11/main.cpp
deleted file mode 100644
index f95b3a21..00000000
--- a/client/x11/main.cpp
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-#include "application.h"
-
-static void cleanup()
-{
- spice_log_cleanup();
-}
-
-const char * version_str = VERSION;
-
-int main(int argc, char** argv)
-{
- int exit_val;
-
- atexit(cleanup);
- try {
- exit_val = Application::main(argc, argv, version_str);
- LOG_INFO("Spice client terminated (exitcode = %d)", exit_val);
- } catch (Exception& e) {
- LOG_ERROR("unhandled exception: %s", e.what());
- exit_val = e.get_error_code();
- } catch (std::exception& e) {
- LOG_ERROR("unhandled exception: %s", e.what());
- exit_val = SPICEC_ERROR_CODE_ERROR;
- } catch (...) {
- LOG_ERROR("unhandled exception");
- exit_val = SPICEC_ERROR_CODE_ERROR;
- }
-
- return exit_val;
-}
diff --git a/client/x11/named_pipe.cpp b/client/x11/named_pipe.cpp
deleted file mode 100644
index ad6b2e5c..00000000
--- a/client/x11/named_pipe.cpp
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-#include "named_pipe.h"
-#include "utils.h"
-#include "debug.h"
-
-Session::Session(int fd, ProcessLoop& events_loop)
- : _fd_client(fd)
- , _events_loop(events_loop)
-{
-}
-
-void Session::on_event()
-{
- _conn_interface->on_data();
-}
-
-void Session::bind(NamedPipe::ConnectionInterface* conn_interface)
-{
- _conn_interface = conn_interface;
- _events_loop.add_socket(*this);
-}
-
-Session::~Session()
-{
- _events_loop.remove_socket(*this);
- close(_fd_client);
-}
-
-int32_t Session::write(const uint8_t *buf, int32_t size)
-{
- const uint8_t *pos = buf;
-
- while (size) {
- int now;
- if ((now = send(_fd_client, (char *)pos, size, 0)) == -1) {
- if (errno == EAGAIN) {
- break;
- }
- if (errno == EINTR) {
- continue;
- }
- DBG(0, "send error errno=%d, %s", errno, strerror(errno));
- return -1;
- }
- size -= now;
- pos += now;
- }
- return (pos - buf);
-}
-
-int32_t Session::read(uint8_t *buf, int32_t size)
-{
- uint8_t *pos = buf;
- while (size) {
- int now;
- if ((now = recv(_fd_client, (char *)pos, size, 0)) <= 0) {
- if (now == 0) {
- DBG(0, "read error, connection shutdown");
- return -1;
- }
- if (errno == EAGAIN) {
- break;
- }
- if (errno == EINTR) {
- continue;
- }
- DBG(0, "read error errno=%d, %s", errno, strerror(errno));
- return -1;
- }
- size -= now;
- pos += now;
- }
- return (pos - buf);
-}
-
-int LinuxListener::create_socket(const char *socket_name)
-{
- int listen_socket;
- struct sockaddr_un local;
-
- if ((listen_socket = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
- DBG(0, "create socket error, errno=%d, %s", errno, strerror(errno));
- return -1;
- }
-
- _name = socket_name;
-
- local.sun_family = AF_UNIX;
- strcpy(local.sun_path, socket_name);
- unlink(local.sun_path);
- if (bind(listen_socket, (struct sockaddr *)&local,
- strlen(local.sun_path) + sizeof(local.sun_family)) == -1) {
- DBG(0, "bind error, errno=%d, %s", errno, strerror(errno));
- return -1;
- }
- if (listen(listen_socket, 10) == -1) {
- DBG(0, "listen error, errno=%d, %s", errno, strerror(errno));
- return -1;
- }
- return listen_socket;
-}
-
-LinuxListener::LinuxListener(const char *name, NamedPipe::ListenerInterface &listener_interface,
- ProcessLoop& events_loop)
- : _listener_interface (listener_interface)
- , _events_loop (events_loop)
-{
- _listen_socket = create_socket(name);
- if (_listen_socket <= 0) {
- THROW("Listener creation failed %d", _listen_socket);
- }
- _events_loop.add_socket(*this);
-
- DBG(0, "listening socket - %s, added to events_loop", name);
-}
-
-LinuxListener::~LinuxListener()
-{
- _events_loop.remove_socket(*this);
- close(_listen_socket);
- unlink(_name.c_str());
-}
-
-void LinuxListener::on_event()
-{
- for (;;) {
- int fd_client;
- Session *conn;
- struct sockaddr_un remote;
- socklen_t len = sizeof(remote);
-
- if ((fd_client = accept(_listen_socket, (struct sockaddr *)&remote, &len)) == -1) {
- if (errno == EAGAIN) {
- break;
- }
- if (errno == EINTR) {
- continue;
- }
- THROW("errno=%d, %s", errno, strerror(errno));
- }
-
- conn = new Session(fd_client, _events_loop);
- DBG(0, "New connection created, fd: %d", fd_client);
- NamedPipe::ConnectionInterface &conn_interface = _listener_interface.create();
- conn->bind(&conn_interface);
- conn_interface.bind((NamedPipe::ConnectionRef)conn);
- }
-}
diff --git a/client/x11/named_pipe.h b/client/x11/named_pipe.h
deleted file mode 100644
index 379cbffe..00000000
--- a/client/x11/named_pipe.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_NAMED_PIPE
-#define _H_NAMED_PIPE
-
-#include "platform.h"
-#include "x_platform.h"
-#include "process_loop.h"
-
-class Session: public EventSources::Socket {
-public:
- Session(int fd, ProcessLoop& events_loop);
- virtual ~Session();
- void bind(NamedPipe::ConnectionInterface* conn_interface);
-
-public:
- virtual void on_event();
- virtual int get_socket() {return _fd_client;}
- int32_t write(const uint8_t *buf, int32_t size);
- int32_t read(uint8_t *buf, int32_t size);
-
-private:
- NamedPipe::ConnectionInterface *_conn_interface;
- int _fd_client;
- ProcessLoop &_events_loop;
-};
-
-class LinuxListener: public EventSources::Socket {
-public:
- LinuxListener(const char *name, NamedPipe::ListenerInterface &listener_interface,
- ProcessLoop& events_loop);
- virtual ~LinuxListener();
- void on_event();
- virtual int get_socket() {return _listen_socket;}
-
-private:
- int create_socket(const char *socket_name);
-
-private:
- NamedPipe::ListenerInterface &_listener_interface;
- int _listen_socket;
- std::string _name;
- ProcessLoop &_events_loop;
-};
-
-#endif
diff --git a/client/x11/pixels_source.cpp b/client/x11/pixels_source.cpp
deleted file mode 100644
index 71ea9ff4..00000000
--- a/client/x11/pixels_source.cpp
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-#include "x_platform.h"
-#include "pixels_source.h"
-#include "pixels_source_p.h"
-#include "utils.h"
-#include "debug.h"
-#include "res.h"
-
-
-static void create_pixmap(const PixmapHeader* pixmap, PixelsSource_p& pixels_source,
- pixman_format_code_t format)
-{
- pixman_image_t *pixman_image;
-
- pixman_image = pixman_image_create_bits(format,
- pixmap->width, pixmap->height,
- (uint32_t *)pixmap->data,
- pixmap->stride);
- if (pixman_image == NULL) {
- THROW("surf create failed");
- }
-
- pixels_source.type = PIXELS_SOURCE_TYPE_PIXMAP;
- pixels_source.pixmap.pixman_image = pixman_image;
- pixels_source.pixmap.x_image = NULL;
- pixels_source.pixmap.shminfo = NULL;
- if (format == PIXMAN_a8r8g8b8) {
- pixels_source.pixmap.format = RedDrawable::ARGB32;
- } else {
- pixels_source.pixmap.format = RedDrawable::RGB32;
- }
-}
-
-PixelsSource::PixelsSource()
-{
- _origin.x = _origin.y = 0;
- memset(_opaque, 0, sizeof(_opaque));
-}
-
-PixelsSource::~PixelsSource()
-{
-}
-
-ImageFromRes::ImageFromRes(int res_id)
-{
- const PixmapHeader* pixmap = res_get_image(res_id);
- if (!pixmap) {
- THROW("no image %d", res_id);
- }
- create_pixmap(pixmap, *(PixelsSource_p*)get_opaque(), PIXMAN_x8r8g8b8);
-}
-
-ImageFromRes::~ImageFromRes()
-{
- pixman_image_unref(((PixelsSource_p*)get_opaque())->pixmap.pixman_image);
-}
-
-SpicePoint ImageFromRes::get_size()
-{
- pixman_image_t *image = ((PixelsSource_p*)get_opaque())->pixmap.pixman_image;
- SpicePoint pt;
- pt.x = pixman_image_get_width(image);
- pt.y = pixman_image_get_height(image);
- return pt;
-}
-
-AlphaImageFromRes::AlphaImageFromRes(int res_id)
-{
- const PixmapHeader* pixmap = res_get_image(res_id);
- if (!pixmap) {
- THROW("no image %d", res_id);
- }
- create_pixmap(pixmap, *(PixelsSource_p*)get_opaque(), PIXMAN_a8r8g8b8);
-}
-
-AlphaImageFromRes::~AlphaImageFromRes()
-{
- pixman_image_unref(((PixelsSource_p*)get_opaque())->pixmap.pixman_image);
-}
-
-SpicePoint AlphaImageFromRes::get_size()
-{
- pixman_image_t *image = ((PixelsSource_p*)get_opaque())->pixmap.pixman_image;
- SpicePoint pt;
- pt.x = pixman_image_get_width(image);
- pt.y = pixman_image_get_height(image);
- return pt;
-}
diff --git a/client/x11/pixels_source_p.h b/client/x11/pixels_source_p.h
deleted file mode 100644
index 84311211..00000000
--- a/client/x11/pixels_source_p.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_PIXELE_SOURSR_P
-#define _H_PIXELE_SOURSR_P
-
-#include <X11/X.h>
-#ifdef USE_OPENGL
-#include <GL/glu.h>
-#endif // USE_OPENGL
-#include <X11/Xdefs.h>
-#include <X11/Xutil.h> // required by Xshm.h, but not included by it
-#include <X11/extensions/XShm.h>
-#include "red_window.h"
-#ifdef USE_OPENGL
-#include "red_pixmap_gl.h"
-#endif // USE_OPENGL
-
-#include "common/pixman_utils.h"
-
-enum {
- PIXELS_SOURCE_TYPE_INVALID,
- PIXELS_SOURCE_TYPE_X_DRAWABLE,
- PIXELS_SOURCE_TYPE_PIXMAP,
-#ifdef USE_OPENGL
- PIXELS_SOURCE_TYPE_GL_TEXTURE,
- PIXELS_SOURCE_TYPE_GL_DRAWABLE,
-#endif // USE_OPENGL
-};
-
-struct PixelsSource_p {
- int type;
- union {
- struct {
- XImage* x_image;
- XShmSegmentInfo *shminfo;
- pixman_image_t* pixman_image;
- RedDrawable::Format format;
- } pixmap;
-
- struct {
- Drawable drawable;
- int screen;
- GC gc;
- int width, height;
-#ifdef USE_OPENGL
- RenderType rendertype;
- union {
- GLXPbuffer pbuff;
- GLuint fbo;
- };
- RedGlContext context;
-#endif // USE_OPENGL
- } x_drawable;
-
-#ifdef USE_OPENGL
- struct {
- RenderType rendertype;
- Win win;
- GLuint tex;
- GLuint stencil_tex;
- GLuint rbo;
- int width, height;
- int width_powed, height_powed;
- union {
- GLXPbuffer pbuff;
- GLuint fbo;
- };
- RedGlContext context;
- } gl;
-#endif // USE_OPENGL
- };
-};
-
-struct RedDrawable_p {
- PixelsSource_p source;
-};
-
-#endif
diff --git a/client/x11/platform.cpp b/client/x11/platform.cpp
deleted file mode 100644
index 6a374835..00000000
--- a/client/x11/platform.cpp
+++ /dev/null
@@ -1,3815 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-
-#include <X11/Xlib.h>
-#include <X11/Xutil.h>
-#include <X11/Xatom.h>
-#include <X11/XKBlib.h>
-#include <X11/Xresource.h>
-#include <X11/cursorfont.h>
-#include <X11/extensions/Xrandr.h>
-#include <X11/extensions/render.h>
-#include <X11/extensions/XKB.h>
-#include <X11/extensions/Xrender.h>
-#include <X11/extensions/XShm.h>
-#include <X11/extensions/Xfixes.h>
-#include <unistd.h>
-#include <sys/socket.h>
-#include <sys/resource.h>
-#include <sys/types.h>
-#include <sys/syscall.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <set>
-#include <values.h>
-#include <signal.h>
-#include <sys/shm.h>
-#ifdef HAVE_SYS_TIME_H
-#include <sys/time.h>
-#endif
-
-#include <spice/vd_agent.h>
-#include "common/rect.h"
-
-#include "platform.h"
-#include "application.h"
-#include "utils.h"
-#include "x_platform.h"
-#include "debug.h"
-#include "monitor.h"
-#include "record.h"
-#include "playback.h"
-#include "resource.h"
-#include "res.h"
-#include "cursor.h"
-#include "process_loop.h"
-
-#define DWORD uint32_t
-#define BOOL bool
-#include "named_pipe.h"
-
-//#define X_DEBUG_SYNC(display) do { XLockDisplay(display); XSync(display, False); XUnlockDisplay(display); } while(0)
-#define X_DEBUG_SYNC(display)
-#ifdef HAVE_XRANDR12
-#define USE_XRANDR_1_2
-#endif
-
-#ifdef HAVE_XINERAMA
-#include <X11/extensions/Xinerama.h>
-#define USE_XINERAMA_1_0
-#endif
-
-static Display* x_display = NULL;
-static bool x_shm_avail = false;
-static XVisualInfo **vinfo = NULL;
-static RedDrawable::Format *screen_format = NULL;
-#ifdef USE_OPENGL
-static GLXFBConfig **fb_config = NULL;
-#endif // USE_OPENGL
-static XIM x_input_method = NULL;
-static XIC x_input_context = NULL;
-
-static Window platform_win = 0;
-static XContext win_proc_context;
-static ProcessLoop* main_loop = NULL;
-static int focus_count = 0;
-
-static bool using_xrandr_1_0 = false;
-#ifdef USE_XRANDR_1_2
-static bool using_xrandr_1_2 = false;
-#endif
-
-static int xrandr_event_base;
-static int xrandr_error_base;
-static int xrandr_major = 0;
-static int xrandr_minor = 0;
-
-static bool using_xrender_0_5 = false;
-
-static bool using_xfixes_1_0 = false;
-
-static int xfixes_event_base;
-static int xfixes_error_base;
-
-#ifdef USE_XINERAMA_1_0
-static bool using_xinerama_1_0 = false;
-#endif
-
-static unsigned int caps_lock_mask = 0;
-static unsigned int num_lock_mask = 0;
-
-//FIXME: nicify
-struct clipboard_format_info {
- uint32_t type;
- const char *atom_names[16];
- Atom atoms[16];
- int atom_count;
-};
-
-static struct clipboard_format_info clipboard_formats[] = {
- { VD_AGENT_CLIPBOARD_UTF8_TEXT, { "UTF8_STRING",
- "text/plain;charset=UTF-8", "text/plain;charset=utf-8", NULL }, { 0 }, 0},
- { VD_AGENT_CLIPBOARD_IMAGE_PNG, { "image/png", NULL }, { 0 }, 0},
- { VD_AGENT_CLIPBOARD_IMAGE_BMP, { "image/bmp", "image/x-bmp",
- "image/x-MS-bmp", "image/x-win-bitmap", NULL }, { 0 }, 0},
- { VD_AGENT_CLIPBOARD_IMAGE_TIFF, { "image/tiff", NULL }, { 0 }, 0},
- { VD_AGENT_CLIPBOARD_IMAGE_JPG, { "image/jpeg", NULL }, { 0 }, 0},
-};
-
-#define clipboard_format_count ((int)(sizeof(clipboard_formats)/sizeof(clipboard_formats[0])))
-
-struct selection_request {
- XEvent event;
- selection_request *next;
-};
-
-static int expected_targets_notifies = 0;
-static bool waiting_for_property_notify = false;
-static uint8_t* clipboard_data = NULL;
-static uint32_t clipboard_data_size = 0;
-static uint32_t clipboard_data_space = 0;
-static Atom clipboard_request_target = None;
-static selection_request *next_selection_request = NULL;
-static int clipboard_type_count = 0;
-static uint32_t clipboard_agent_types[256];
-static Atom clipboard_x11_targets[256];
-static Mutex clipboard_lock;
-static Atom clipboard_prop;
-static Atom incr_atom;
-static Atom targets_atom;
-static Atom multiple_atom;
-static Bool handle_x_error = false;
-static int x_error_code;
-
-static void handle_selection_request();
-
-class DefaultEventListener: public Platform::EventListener {
-public:
- virtual void on_app_activated() {}
- virtual void on_app_deactivated() {}
- virtual void on_monitors_change() {}
-};
-
-static DefaultEventListener default_event_listener;
-static Platform::EventListener* event_listener = &default_event_listener;
-
-class DefaultDisplayModeListener: public Platform::DisplayModeListener {
-public:
- void on_display_mode_change() {}
-};
-
-static DefaultDisplayModeListener default_display_mode_listener;
-static Platform::DisplayModeListener* display_mode_listener = &default_display_mode_listener;
-
-class DefaultClipboardListener: public Platform::ClipboardListener {
-public:
- void on_clipboard_grab(uint32_t *types, uint32_t type_count) {}
- void on_clipboard_request(uint32_t type) {}
- void on_clipboard_notify(uint32_t type, uint8_t* data, int32_t size) {}
- void on_clipboard_release() {}
-};
-
-static DefaultClipboardListener default_clipboard_listener;
-static Platform::ClipboardListener* clipboard_listener = &default_clipboard_listener;
-
-static void handle_x_errors_start(void)
-{
- handle_x_error = True;
- x_error_code = 0;
-}
-
-static int handle_x_errors_stop(void)
-{
- handle_x_error = False;
- return x_error_code;
-}
-
-static const char *atom_name(Atom atom)
-{
- const char *name;
-
- if (atom == None)
- return "None";
-
- XLockDisplay(x_display);
- handle_x_errors_start();
- name = XGetAtomName(x_display, atom);
- if (handle_x_errors_stop()) {
- name = "Bad Atom";
- }
- XUnlockDisplay(x_display);
-
- return name;
-}
-
-static uint32_t get_clipboard_type(Atom target) {
- int i, j;
-
- if (target == None)
- return VD_AGENT_CLIPBOARD_NONE;
-
- for (i = 0; i < clipboard_format_count; i++) {
- for (j = 0; j < clipboard_formats[i].atom_count; i++) {
- if (clipboard_formats[i].atoms[j] == target) {
- return clipboard_formats[i].type;
- }
- }
- }
-
- LOG_WARN("unexpected selection type %s", atom_name(target));
- return VD_AGENT_CLIPBOARD_NONE;
-}
-
-static Atom get_clipboard_target(uint32_t type) {
- int i;
-
- for (i = 0; i < clipboard_type_count; i++)
- if (clipboard_agent_types[i] == type)
- return clipboard_x11_targets[i];
-
- LOG_WARN("client requested unavailable type %u", type);
- return None;
-}
-
-NamedPipe::ListenerRef NamedPipe::create(const char *name, ListenerInterface& listener_interface)
-{
- ASSERT(main_loop && main_loop->is_same_thread(pthread_self()));
- return (ListenerRef)(new LinuxListener(name, listener_interface, *main_loop));
-}
-
-void NamedPipe::destroy(ListenerRef listener_ref)
-{
- ASSERT(main_loop && main_loop->is_same_thread(pthread_self()));
- delete (LinuxListener *)listener_ref;
-}
-
-void NamedPipe::destroy_connection(ConnectionRef conn_ref)
-{
- ASSERT(main_loop && main_loop->is_same_thread(pthread_self()));
- delete (Session *)conn_ref;
-}
-
-int32_t NamedPipe::read(ConnectionRef conn_ref, uint8_t* buf, int32_t size)
-{
- if (((Session *)conn_ref) != NULL) {
- return ((Session *)conn_ref)->read(buf, size);
- }
- return -1;
-}
-
-int32_t NamedPipe::write(ConnectionRef conn_ref, const uint8_t* buf, int32_t size)
-{
- if (((Session *)conn_ref) != NULL) {
- return ((Session *)conn_ref)->write(buf, size);
- }
- return -1;
-}
-
-class XEventHandler: public EventSources::File {
-public:
- XEventHandler(Display& x_display, XContext& win_proc_context);
- virtual void on_event();
- virtual int get_fd() {return _x_fd;}
-
-private:
- Display& _x_display;
- XContext& _win_proc_context;
- int _x_fd;
-};
-
-XEventHandler::XEventHandler(Display& x_display, XContext& win_proc_context)
- : _x_display (x_display)
- , _win_proc_context (win_proc_context)
-{
- if ((_x_fd = ConnectionNumber(&x_display)) == -1) {
- THROW("get x fd failed");
- }
-}
-
-void XEventHandler::on_event()
-{
- XLockDisplay(x_display);
- while (XPending(&_x_display)) {
- XPointer proc_pointer;
- XEvent event;
-
- XNextEvent(&_x_display, &event);
- if (event.xany.window == None) {
- continue;
- }
-
- if (XFilterEvent(&event, None)) {
- continue;
- }
-
- if (XFindContext(&_x_display, event.xany.window, _win_proc_context, &proc_pointer)) {
- /* When XIM + ibus is in use XIM creates an invisible window for
- its own purposes, we sometimes get a _GTK_LOAD_ICONTHEMES
- ClientMessage event on this window -> skip logging. */
- if (event.type != ClientMessage) {
- LOG_WARN(
- "Event on window without a win proc, type: %d, window: %u",
- event.type, (unsigned int)event.xany.window);
- }
- continue;
- }
- XUnlockDisplay(x_display);
- ((XPlatform::win_proc_t)proc_pointer)(event);
- XLockDisplay(x_display);
- }
- XUnlockDisplay(x_display);
-}
-
-Display* XPlatform::get_display()
-{
- return x_display;
-}
-
-bool XPlatform::is_x_shm_avail()
-{
- return x_shm_avail;
-}
-
-XImage *XPlatform::create_x_shm_image(RedDrawable::Format format,
- int width, int height, int depth,
- Visual *visual,
- XShmSegmentInfo **shminfo_out)
-{
- XImage *image;
- XShmSegmentInfo *shminfo;
-
- /* We need to lock the display early, and force any pending requests to
- be processed, to make sure that any errors reported by
- handle_x_errors_stop() are actually ours */
- XLockDisplay(XPlatform::get_display());
- XSync(XPlatform::get_display(), False);
-
- shminfo = new XShmSegmentInfo;
- shminfo->shmid = -1;
- shminfo->shmaddr = NULL;
-
- image = XShmCreateImage(XPlatform::get_display(),
- format == RedDrawable::A1 ? NULL : visual,
- format == RedDrawable::A1 ? 1 : depth,
- format == RedDrawable::A1 ? XYBitmap : ZPixmap,
- NULL, shminfo, width, height);
- if (image == NULL) {
- x_shm_avail = false;
- goto err1;
- }
-
- shminfo->shmid = shmget(IPC_PRIVATE, height * image->bytes_per_line,
- IPC_CREAT | 0777);
- if (shminfo->shmid < 0) {
- /* EINVAL indicates, most likely, that the segment we asked for
- * is bigger than SHMMAX, so we don't treat it as a permanent
- * error. ENOSPC and ENOMEM may also indicate this, but
- * more likely are permanent errors.
- */
- if (errno != EINVAL) {
- x_shm_avail = false;
- }
- goto err2;
- }
-
- shminfo->shmaddr = (char *)shmat(shminfo->shmid, 0, 0);
- if (!shminfo->shmaddr) {
- /* Failure in shmat is almost certainly permanent. Most likely error is
- * EMFILE, which would mean that we've exceeded the per-process
- * Shm segment limit.
- */
- x_shm_avail = false;
-
- goto err2;
- }
-
- shminfo->readOnly = False;
- if (!XShmAttach(XPlatform::get_display(), shminfo)) {
- x_shm_avail = false;
- goto err2;
- }
-
- handle_x_errors_start();
-
- /* Ensure the xserver has attached the xshm segment */
- XSync (XPlatform::get_display(), False);
-
- if (handle_x_errors_stop()) {
- x_shm_avail = false;
- goto err2;
- }
-
- /* Mark segment as released so that it will be destroyed when
- the xserver releases the segment. This way we won't leak
- the segment if the client crashes. */
- shmctl(shminfo->shmid, IPC_RMID, 0);
-
- XUnlockDisplay(XPlatform::get_display());
-
- image->data = (char *)shminfo->shmaddr;
-
- *shminfo_out = shminfo;
- return image;
-
-err2:
- XDestroyImage(image);
- if (shminfo->shmaddr != NULL) {
- shmdt(shminfo->shmaddr);
- }
- if (shminfo->shmid != -1) {
- shmctl(shminfo->shmid, IPC_RMID, 0);
- }
-
-err1:
- XUnlockDisplay(XPlatform::get_display());
- delete shminfo;
- return NULL;
-}
-
-XImage *XPlatform::create_x_image(RedDrawable::Format format,
- int width, int height, int depth,
- Visual *visual,
- XShmSegmentInfo **shminfo_out)
-{
- XImage *image = NULL;
- uint8_t *data;
- size_t stride;
-
- *shminfo_out = NULL;
-
- if (XPlatform::is_x_shm_avail()) {
- image = XPlatform::create_x_shm_image(format, width, height,
- depth, visual,
- shminfo_out);
- }
-
- if (image != NULL) {
- return image;
- }
-
- stride = SPICE_ALIGN(width * RedDrawable::format_to_bpp (format), 32) / 8;
- /* Must use malloc here, not new, because XDestroyImage will free() it */
- data = (uint8_t *)malloc(height * stride);
- if (data == NULL) {
- THROW("Out of memory");
- }
-
- XLockDisplay(XPlatform::get_display());
- if (format == RedDrawable::A1) {
- image = XCreateImage(XPlatform::get_display(),
- NULL, 1, XYBitmap,
- 0, (char *)data, width, height, 32, stride);
- } else {
- image = XCreateImage(XPlatform::get_display(),
- visual, depth, ZPixmap,
- 0, (char *)data, width, height, 32, stride);
- }
- XUnlockDisplay(XPlatform::get_display());
-
- return image;
-}
-
-
-void XPlatform::free_x_image(XImage *image,
- XShmSegmentInfo *shminfo)
-{
- if (shminfo) {
- XLockDisplay(XPlatform::get_display());
- XShmDetach(XPlatform::get_display(), shminfo);
- }
- if (image) {
- XDestroyImage(image);
- }
- if (shminfo) {
- XSync(XPlatform::get_display(), False);
- shmdt(shminfo->shmaddr);
- XUnlockDisplay(XPlatform::get_display());
- delete shminfo;
- }
-}
-
-
-XVisualInfo** XPlatform::get_vinfo()
-{
- return vinfo;
-}
-
-RedDrawable::Format XPlatform::get_screen_format(int screen)
-{
- return screen_format[screen];
-}
-
-#ifdef USE_OPENGL
-GLXFBConfig** XPlatform::get_fbconfig()
-{
- return fb_config;
-}
-#endif // USE_OPENGL
-
-XIC XPlatform::get_input_context()
-{
- return x_input_context;
-}
-
-void XPlatform::set_win_proc(Window win, win_proc_t proc)
-{
- int res;
-
- XLockDisplay(x_display);
- res = XSaveContext(x_display, win, win_proc_context, (XPointer)proc);
- XUnlockDisplay(x_display);
- if (res) {
- THROW("set win proc failed");
- }
-}
-
-void XPlatform::cleare_win_proc(Window win)
-{
- XLockDisplay(x_display);
- XDeleteContext(x_display, win, win_proc_context);
- XUnlockDisplay(x_display);
-}
-
-void Platform::send_quit_request()
-{
- ASSERT(main_loop);
- main_loop->quit(0);
-}
-
-uint64_t Platform::get_monolithic_time()
-{
-#ifdef HAVE_CLOCK_GETTIME
- struct timespec time_space;
- clock_gettime(CLOCK_MONOTONIC, &time_space);
- return uint64_t(time_space.tv_sec) * 1000 * 1000 * 1000 + uint64_t(time_space.tv_nsec);
-#else
- struct timeval tv;
- gettimeofday(&tv, NULL);
- return uint64_t(tv.tv_sec) * 1000 * 1000 * 1000 + uint64_t(tv.tv_usec) * 1000;
-#endif
-}
-
-void Platform::get_temp_dir(std::string& path)
-{
- path = "/tmp/";
-}
-
-uint64_t Platform::get_process_id()
-{
- static uint64_t pid = uint64_t(getpid());
- return pid;
-}
-
-uint64_t Platform::get_thread_id()
-{
- return uint64_t(syscall(SYS_gettid));
-}
-
-void Platform::error_beep()
-{
- if (!x_display) {
- return;
- }
-
- XBell(x_display, 0);
- XFlush(x_display);
-}
-
-void Platform::msleep(unsigned int millisec)
-{
- usleep(millisec * 1000);
-}
-
-void Platform::yield()
-{
- POSIX_YIELD_FUNC;
-}
-
-void Platform::term_printf(const char* format, ...)
-{
- va_list ap;
- va_start(ap, format);
- vprintf(format, ap);
- va_end(ap);
-}
-
-void Platform::set_thread_priority(void* thread, Platform::ThreadPriority in_priority)
-{
- ASSERT(thread == NULL);
- int priority;
-
- switch (in_priority) {
- case PRIORITY_TIME_CRITICAL:
- priority = -20;
- break;
- case PRIORITY_HIGH:
- priority = -2;
- break;
- case PRIORITY_ABOVE_NORMAL:
- priority = -1;
- break;
- case PRIORITY_NORMAL:
- priority = 0;
- break;
- case PRIORITY_BELOW_NORMAL:
- priority = 1;
- break;
- case PRIORITY_LOW:
- priority = 2;
- break;
- case PRIORITY_IDLE:
- priority = 19;
- break;
- default:
- THROW("invalid priority %d", in_priority);
- }
-
- pid_t tid = syscall(SYS_gettid);
- if (setpriority(PRIO_PROCESS, tid, priority) == -1) {
- DBG(0, "setpriority failed %s", strerror(errno));
- }
-}
-
-void Platform::set_event_listener(EventListener* listener)
-{
- event_listener = listener ? listener : &default_event_listener;
-}
-
-void Platform::set_display_mode_listner(DisplayModeListener* listener)
-{
- display_mode_listener = listener ? listener : &default_display_mode_listener;
-}
-
-#ifdef USE_XRANDR_1_2
-class FreeScreenResources {
-public:
- void operator () (XRRScreenResources* res) { XRRFreeScreenResources(res);}
-};
-typedef _AutoRes<XRRScreenResources, FreeScreenResources> AutoScreenRes;
-
-class FreeOutputInfo {
-public:
- void operator () (XRROutputInfo* output_info) { XRRFreeOutputInfo(output_info);}
-};
-
-typedef _AutoRes<XRROutputInfo, FreeOutputInfo> AutoOutputInfo;
-
-class FreeCrtcInfo {
-public:
- void operator () (XRRCrtcInfo* crtc_info) { XRRFreeCrtcInfo(crtc_info);}
-};
-typedef _AutoRes<XRRCrtcInfo, FreeCrtcInfo> AutoCrtcInfo;
-
-static XRRModeInfo* find_mod(XRRScreenResources* res, RRMode mode)
-{
- for (int i = 0; i < res->nmode; i++) {
- if (res->modes[i].id == mode) {
- return &res->modes[i];
- }
- }
- return NULL;
-}
-
-#endif
-
-//#define SHOW_SCREEN_INFO
-#ifdef SHOW_SCREEN_INFO
-
-static float mode_refresh(XRRModeInfo *mode_info)
-{
- if (!mode_info->hTotal || !mode_info->vTotal) {
- return 0;
- }
-
- return ((float)mode_info->dotClock / ((float)mode_info->hTotal * (float)mode_info->vTotal));
-}
-
-static void show_scren_info()
-{
- int screen = DefaultScreen(x_display);
- Window root_window = RootWindow(x_display, screen);
-
- int minWidth;
- int minHeight;
- int maxWidth;
- int maxHeight;
-
- XLockDisplay(x_display);
- AutoScreenRes res(XRRGetScreenResources(x_display, root_window));
- XUnlockDisplay(x_display);
-
- if (!res.valid()) {
- throw Exception(fmt("%s: get screen resources failed") % __FUNCTION__);
- }
-
- XLockDisplay(x_display);
- XRRGetScreenSizeRange(x_display, root_window, &minWidth, &minHeight,
- &maxWidth, &maxHeight);
- printf("screen: min %dx%d max %dx%d\n", minWidth, minHeight,
- maxWidth, maxHeight);
-
- int i, j;
-
- for (i = 0; i < res->noutput; i++) {
- AutoOutputInfo output_info(XRRGetOutputInfo(x_display, res.get(), res->outputs[i]));
-
- printf("output %s", output_info->name);
- if (output_info->crtc == None) {
- printf(" crtc None");
- } else {
- printf(" crtc 0x%lx", output_info->crtc);
- }
- switch (output_info->connection) {
- case RR_Connected:
- printf(" Connected");
- break;
- case RR_Disconnected:
- printf(" Disconnected");
- break;
- case RR_UnknownConnection:
- printf(" UnknownConnection");
- break;
- }
- printf(" ncrtc %u nclone %u nmode %u\n",
- output_info->ncrtc,
- output_info->nclone,
- output_info->nmode);
- for (j = 0; j < output_info->nmode; j++) {
- XRRModeInfo* mode = find_mod(res.get(), output_info->modes[j]);
- printf("\t%lu:", output_info->modes[j]);
- if (!mode) {
- printf(" ???\n");
- continue;
- }
- printf(" %s %ux%u %f\n", mode->name, mode->width, mode->height, mode_refresh(mode));
- }
- }
-
- for (i = 0; i < res->ncrtc; i++) {
- AutoCrtcInfo crtc_info(XRRGetCrtcInfo(x_display, res.get(), res->crtcs[i]));
- printf("crtc: 0x%lx x %d y %d width %u height %u mode %lu\n",
- res->crtcs[i],
- crtc_info->x, crtc_info->y,
- crtc_info->width, crtc_info->height, crtc_info->mode);
- }
- XUnlockDisplay(x_display);
-}
-
-#endif
-
-enum RedScreenRotation {
- RED_SCREEN_ROTATION_0,
- RED_SCREEN_ROTATION_90,
- RED_SCREEN_ROTATION_180,
- RED_SCREEN_ROTATION_270,
-};
-
-enum RedSubpixelOrder {
- RED_SUBPIXEL_ORDER_UNKNOWN,
- RED_SUBPIXEL_ORDER_H_RGB,
- RED_SUBPIXEL_ORDER_H_BGR,
- RED_SUBPIXEL_ORDER_V_RGB,
- RED_SUBPIXEL_ORDER_V_BGR,
- RED_SUBPIXEL_ORDER_NONE,
-};
-
-static void root_win_proc(XEvent& event);
-static void process_monitor_configure_events(Window root);
-
-class XMonitor;
-typedef std::list<XMonitor*> XMonitorsList;
-
-class XScreen {
-public:
- XScreen(Display* display, int screen);
- virtual ~XScreen() {}
-
- virtual void publish_monitors(MonitorsList& monitors) = 0;
-
- Display* get_display() {return _display;}
- int get_screen() {return _screen;}
-
- void set_broken() {_broken = true;}
- bool is_broken() const {return _broken;}
- int get_width() const {return _width;}
- void set_width(int width) {_width = width;}
- int get_height() const { return _height;}
- void set_height(int height) {_height = height;}
- SpicePoint get_position() const {return _position;}
-
-private:
- Display* _display;
- int _screen;
- SpicePoint _position;
- int _width;
- int _height;
- bool _broken;
-};
-
-XScreen::XScreen(Display* display, int screen)
- : _display (display)
- , _screen (screen)
- , _broken (false)
-{
- int root = RootWindow(display, screen);
-
- XWindowAttributes attrib;
-
- XLockDisplay(display);
- XGetWindowAttributes(display, root, &attrib);
- XUnlockDisplay(display);
-
- _position.x = attrib.x;
- _position.y = attrib.y;
- _width = attrib.width;
- _height = attrib.height;
-}
-
-class StaticScreen: public XScreen, public Monitor {
-public:
- StaticScreen(Display* display, int screen, int& next_mon_id)
- : XScreen(display, screen)
- , Monitor(next_mon_id++)
- , _out_of_sync (false)
- {
- }
-
- virtual void publish_monitors(MonitorsList& monitors)
- {
- monitors.push_back(this);
- }
-
- virtual int get_depth() { return XPlatform::get_vinfo()[0]->depth;}
- virtual SpicePoint get_position() { return XScreen::get_position();}
- virtual SpicePoint get_size() const { SpicePoint pt = {get_width(), get_height()}; return pt;}
- virtual bool is_out_of_sync() { return _out_of_sync;}
- virtual int get_screen_id() { return get_screen();}
-
-protected:
- virtual void do_set_mode(int width, int height)
- {
- _out_of_sync = width > get_width() || height > get_height();
- }
-
- virtual void do_restore() {}
-
-private:
- bool _out_of_sync;
-};
-
-class DynamicScreen: public XScreen, public Monitor {
-public:
- DynamicScreen(Display* display, int screen, int& next_mon_id);
- virtual ~DynamicScreen();
-
- void publish_monitors(MonitorsList& monitors);
- virtual int get_depth() { return XPlatform::get_vinfo()[0]->depth;}
- virtual SpicePoint get_position() { return XScreen::get_position();}
- virtual SpicePoint get_size() const { SpicePoint pt = {get_width(), get_height()}; return pt;}
- virtual bool is_out_of_sync() { return _out_of_sync;}
- virtual int get_screen_id() { return get_screen();}
-
-protected:
- virtual void do_set_mode(int width, int height);
- virtual void do_restore();
-
-private:
- bool set_screen_size(int size_index);
-
-private:
- int _saved_width;
- int _saved_height;
- bool _out_of_sync;
-};
-
-static void intern_clipboard_atoms()
-{
- int i, j;
- static bool interned = false;
- if (interned) return;
-
- XLockDisplay(x_display);
- clipboard_prop = XInternAtom(x_display, "CLIPBOARD", False);
- incr_atom = XInternAtom(x_display, "INCR", False);
- multiple_atom = XInternAtom(x_display, "MULTIPLE", False);
- targets_atom = XInternAtom(x_display, "TARGETS", False);
- for(i = 0; i < clipboard_format_count; i++) {
- for(j = 0; clipboard_formats[i].atom_names[j]; j++) {
- clipboard_formats[i].atoms[j] =
- XInternAtom(x_display, clipboard_formats[i].atom_names[j],
- False);
- }
- clipboard_formats[i].atom_count = j;
- }
-
- XUnlockDisplay(x_display);
-
- interned = true;
-}
-
-DynamicScreen::DynamicScreen(Display* display, int screen, int& next_mon_id)
- : XScreen(display, screen)
- , Monitor(next_mon_id++)
- , _saved_width (get_width())
- , _saved_height (get_height())
- , _out_of_sync (false)
-{
- if (platform_win != 0)
- return;
-
- X_DEBUG_SYNC(display);
- //FIXME: replace RootWindow() in other refs as well?
- XLockDisplay(display);
- platform_win = XCreateSimpleWindow(display, RootWindow(display, screen), 0, 0, 1, 1, 0, 0, 0);
- XUnlockDisplay(display);
-
- LOG_INFO("platform_win: %u", (unsigned int)platform_win);
- intern_clipboard_atoms();
- XSelectInput(display, platform_win, StructureNotifyMask);
- XRRSelectInput(display, platform_win, RRScreenChangeNotifyMask);
- if (using_xfixes_1_0) {
- XFixesSelectSelectionInput(display, platform_win, clipboard_prop,
- XFixesSetSelectionOwnerNotifyMask|
- XFixesSelectionWindowDestroyNotifyMask|
- XFixesSelectionClientCloseNotifyMask);
- }
-
- Monitor::self_monitors_change++;
- process_monitor_configure_events(platform_win);
- Monitor::self_monitors_change--;
-
- XPlatform::set_win_proc(platform_win, root_win_proc);
- X_DEBUG_SYNC(display);
-}
-
-DynamicScreen::~DynamicScreen()
-{
- restore();
-}
-
-void DynamicScreen::publish_monitors(MonitorsList& monitors)
-{
- monitors.push_back(this);
-}
-
-class SizeInfo {
-public:
- SizeInfo(int int_index, XRRScreenSize* in_size) : index (int_index), size (in_size) {}
-
- int index;
- XRRScreenSize* size;
-};
-
-class SizeCompare {
-public:
- bool operator () (const SizeInfo& size1, const SizeInfo& size2) const
- {
- int area1 = size1.size->width * size1.size->height;
- int area2 = size2.size->width * size2.size->height;
- return area1 < area2 || (area1 == area2 && size1.index < size2.index);
- }
-};
-
-void DynamicScreen::do_set_mode(int width, int height)
-{
- int num_sizes;
-
- X_DEBUG_SYNC(get_display());
-
- XLockDisplay(get_display());
- XRRScreenSize* sizes = XRRSizes(get_display(), get_screen(), &num_sizes);
- XUnlockDisplay(get_display());
-
- typedef std::set<SizeInfo, SizeCompare> SizesSet;
- SizesSet sizes_set;
-
- for (int i = 0; i < num_sizes; i++) {
- if (sizes[i].width >= width && sizes[i].height >= height) {
- sizes_set.insert(SizeInfo(i, &sizes[i]));
- }
- }
- _out_of_sync = true;
- if (!sizes_set.empty() && set_screen_size((*sizes_set.begin()).index)) {
- _out_of_sync = false;
- }
- X_DEBUG_SYNC(get_display());
-}
-
-void DynamicScreen::do_restore()
-{
- X_DEBUG_SYNC(get_display());
- if (is_broken() || (get_width() == _saved_width && get_height() == _saved_height)) {
- return;
- }
- int num_sizes;
-
- XLockDisplay(get_display());
- XRRScreenSize* sizes = XRRSizes(get_display(), get_screen(), &num_sizes);
- XUnlockDisplay(get_display());
-
- for (int i = 0; i < num_sizes; i++) {
- if (sizes[i].width == _saved_width && sizes[i].height == _saved_height) {
- set_screen_size(i);
- return;
- }
- }
- X_DEBUG_SYNC(get_display());
- LOG_WARN("can't find startup mode");
-}
-
-bool DynamicScreen::set_screen_size(int size_index)
-{
- X_DEBUG_SYNC(get_display());
- Window root_window = RootWindow(get_display(), get_screen());
- XRRScreenConfiguration* config;
-
- XLockDisplay(get_display());
- config = XRRGetScreenInfo(get_display(), root_window);
- XUnlockDisplay(get_display());
-
- if (!config) {
- LOG_WARN("get screen info failed");
- return false;
- }
- Rotation rotation;
- XRRConfigCurrentConfiguration(config, &rotation);
-
- Monitor::self_monitors_change++;
- XLockDisplay(get_display());
- /*what status*/
- XRRSetScreenConfig(get_display(), config, root_window, size_index, rotation, CurrentTime);
- XUnlockDisplay(get_display());
- process_monitor_configure_events(platform_win);
- Monitor::self_monitors_change--;
- XRRFreeScreenConfigInfo(config);
- X_DEBUG_SYNC(get_display());
-
- int num_sizes;
-
- XLockDisplay(get_display());
- XRRScreenSize* sizes = XRRSizes(get_display(), get_screen(), &num_sizes);
- XUnlockDisplay(get_display());
-
- if (num_sizes <= size_index) {
- THROW("invalid sizes size");
- }
- set_width(sizes[size_index].width);
- set_height(sizes[size_index].height);
- return true;
-}
-
-#ifdef USE_XINERAMA_1_0
-
-class XineramaMonitor;
-typedef std::list<XineramaMonitor*> XineramaMonitorsList;
-
-class XineramaScreen : public XScreen {
-public:
- XineramaScreen(Display* display, int screen, int& next_mon_id, XineramaScreenInfo* xin_screens,
- int num_xin_screens);
- virtual ~XineramaScreen();
-
- void publish_monitors(MonitorsList& monitors);
-
-private:
- XineramaMonitorsList _monitors;
-};
-
-class XineramaMonitor : public Monitor {
-public:
- XineramaMonitor(int id, XineramaScreenInfo& xin_screen);
-
- virtual void do_set_mode(int width, int height);
- virtual void do_restore() {}
- virtual int get_depth() { return 32;}
- virtual SpicePoint get_position() { return _position;}
- virtual SpicePoint get_size() const { return _size;}
- virtual bool is_out_of_sync() { return _out_of_sync;}
- virtual int get_screen_id() { return 0;}
-
-private:
- SpicePoint _position;
- SpicePoint _size;
- bool _out_of_sync;
-};
-
-XineramaScreen::XineramaScreen(Display* display, int screen, int& next_mon_id,
- XineramaScreenInfo* xin_screens, int num_xin_screens)
- : XScreen(display, screen)
-{
- X_DEBUG_SYNC(display);
- for (int i = 0; i < num_xin_screens; i++) {
- _monitors.push_back(new XineramaMonitor(next_mon_id++, xin_screens[i]));
- }
- Window root_window = RootWindow(display, screen);
- XSelectInput(display, root_window, StructureNotifyMask);
- XRRSelectInput(display, root_window, RRScreenChangeNotifyMask); // TODO: this fails if we don't have RR extension (but do have XINERAMA)
- XPlatform::set_win_proc(root_window, root_win_proc); // Xlib: extension "RANDR" missing on display ":3.0".
- X_DEBUG_SYNC(display);
-}
-
-XineramaScreen::~XineramaScreen()
-{
- while (!_monitors.empty()) {
- XineramaMonitor* monitor = _monitors.front();
- _monitors.pop_front();
- delete monitor;
- }
-}
-
-void XineramaScreen::publish_monitors(MonitorsList& monitors)
-{
- XineramaMonitorsList::iterator iter = _monitors.begin();
- for (; iter != _monitors.end(); iter++) {
- monitors.push_back(*iter);
- }
-}
-
-XineramaMonitor::XineramaMonitor(int id, XineramaScreenInfo& screen_info)
- : Monitor(id)
- , _out_of_sync (false)
-{
- _position.x = screen_info.x_org;
- _position.y = screen_info.y_org;
- _size.x = screen_info.width;
- _size.y = screen_info.height;
-}
-
-
-void XineramaMonitor::do_set_mode(int width, int height)
-{
- _out_of_sync = width > _size.x || height > _size.y;
-}
-
-#endif
-
-#ifdef USE_XRANDR_1_2
-
-class MultyMonScreen: public XScreen {
-public:
- MultyMonScreen(Display* display, int screen, int& next_mon_id);
- virtual ~MultyMonScreen();
-
- virtual void publish_monitors(MonitorsList& monitors);
-
- void disable();
- void enable();
- void restore();
-
- bool set_monitor_mode(XMonitor& monitor, const XRRModeInfo& mode_info);
-
-private:
- void set_size(int width, int height);
- void get_trans_size(int& width, int& hight);
- SpicePoint get_trans_top_left();
- SpicePoint get_trans_bottom_right();
- bool changed();
-
- XMonitor* crtc_overlap_test(int x, int y, int width, int height);
- void monitors_cleanup();
-
-private:
- int _min_width;
- int _min_height;
- int _max_width;
- int _max_height;
- int _saved_width;
- int _saved_height;
- int _saved_width_mm;
- int _saved_height_mm;
- XMonitorsList _monitors;
-};
-
-#define MAX_TRANS_DEPTH 3
-
-class XMonitor: public Monitor {
-public:
- XMonitor(MultyMonScreen& container, int id, RRCrtc crtc);
- virtual ~XMonitor();
-
- virtual int get_depth();
- virtual SpicePoint get_position();
- virtual SpicePoint get_size() const;
- virtual bool is_out_of_sync();
- virtual int get_screen_id() { return _container.get_screen();}
-
- void add_clone(XMonitor *clone);
- void revert();
- void disable();
- void enable();
-
- void set_mode(const XRRModeInfo& mode);
- const SpiceRect& get_prev_area();
- SpiceRect& get_trans_area();
- void pin() { _pin_count++;}
- void unpin() { ASSERT(_pin_count > 0); _pin_count--;}
- bool is_pinned() {return !!_pin_count;}
- void commit_trans_position();
- void set_pusher(XMonitor& pusher) { _pusher = &pusher;}
- XMonitor* get_pusher() { return _pusher;}
- void push_trans();
- void begin_trans();
- bool mode_changed();
- bool position_changed();
-
- static void inc_change_ref() { Monitor::self_monitors_change++;}
- static void dec_change_ref() { Monitor::self_monitors_change--;}
-
-protected:
- virtual void do_set_mode(int width, int height);
- virtual void do_restore();
-
-private:
- void update_position();
- bool find_mode_in_outputs(RRMode mode, int start_index, XRRScreenResources* res);
- bool find_mode_in_clones(RRMode mode, XRRScreenResources* res);
- XRRModeInfo* find_mode(unsigned int width, unsigned int height, XRRScreenResources* res);
-
-private:
- MultyMonScreen& _container;
- RRCrtc _crtc;
- XMonitorsList _clones;
- SpicePoint _position;
- SpicePoint _size;
- RRMode _mode;
- Rotation _rotation;
- int _noutput;
- RROutput* _outputs;
-
- SpicePoint _saved_position;
- SpicePoint _saved_size;
- RRMode _saved_mode;
- Rotation _saved_rotation;
-
- bool _out_of_sync;
- RedScreenRotation _red_rotation;
- RedSubpixelOrder _subpixel_order;
-
- int _trans_depth;
- SpiceRect _trans_area[MAX_TRANS_DEPTH];
- int _pin_count;
- XMonitor* _pusher;
-};
-
-MultyMonScreen::MultyMonScreen(Display* display, int screen, int& next_mon_id)
- : XScreen(display, screen)
- , _saved_width (get_width())
- , _saved_height (get_height())
- , _saved_width_mm (DisplayWidthMM(display, screen))
- , _saved_height_mm (DisplayHeightMM(display, screen))
-{
- X_DEBUG_SYNC(get_display());
- Window root_window = RootWindow(display, screen);
-
- XLockDisplay(display);
- XRRGetScreenSizeRange(display, root_window, &_min_width, &_min_height,
- &_max_width, &_max_height);
- AutoScreenRes res(XRRGetScreenResources(display, root_window));
- XUnlockDisplay(display);
-
- if (!res.valid()) {
- THROW("get screen resources failed");
- }
-
-#ifdef SHOW_SCREEN_INFO
- show_scren_info();
-#endif
- XLockDisplay(display);
- try {
- for (int i = 0; i < res->ncrtc; i++) {
- AutoCrtcInfo crtc_info(XRRGetCrtcInfo(display, res.get(), res->crtcs[i]));
-
- if (!crtc_info.valid()) {
- THROW("get crtc info failed");
- }
-
- if (crtc_info->mode == None) {
- continue;
- }
-
- ASSERT(crtc_info->noutput);
-
- XMonitor* clone_mon = crtc_overlap_test(crtc_info->x, crtc_info->y,
- crtc_info->width, crtc_info->height);
-
- if (clone_mon) {
- clone_mon->add_clone(new XMonitor(*this, next_mon_id++, res->crtcs[i]));
- continue;
- }
-
- _monitors.push_back(new XMonitor(*this, next_mon_id++, res->crtcs[i]));
- }
- XUnlockDisplay(display);
- } catch (...) {
- XUnlockDisplay(display);
- monitors_cleanup();
- throw;
- }
-
- if (platform_win != 0)
- return;
-
- XLockDisplay(display);
- platform_win = XCreateSimpleWindow(display, RootWindow(display, screen), 0, 0, 1, 1, 0, 0, 0);
- XUnlockDisplay(display);
-
- LOG_INFO("platform_win: %u", (unsigned int)platform_win);
- intern_clipboard_atoms();
- XSelectInput(display, platform_win, StructureNotifyMask);
- X_DEBUG_SYNC(get_display());
- XRRSelectInput(display, platform_win, RRScreenChangeNotifyMask);
- X_DEBUG_SYNC(get_display());
- if (using_xfixes_1_0) {
- XFixesSelectSelectionInput(display, platform_win, clipboard_prop,
- XFixesSetSelectionOwnerNotifyMask|
- XFixesSelectionWindowDestroyNotifyMask|
- XFixesSelectionClientCloseNotifyMask);
- }
-
- XMonitor::inc_change_ref();
- process_monitor_configure_events(platform_win);
- XMonitor::dec_change_ref();
-
- XPlatform::set_win_proc(platform_win, root_win_proc);
- X_DEBUG_SYNC(get_display());
-}
-
-MultyMonScreen::~MultyMonScreen()
-{
- restore();
- monitors_cleanup();
-}
-
-XMonitor* MultyMonScreen::crtc_overlap_test(int x, int y, int width, int height)
-{
- XMonitorsList::iterator iter = _monitors.begin();
- for (; iter != _monitors.end(); iter++) {
- XMonitor* mon = *iter;
-
- SpicePoint pos = mon->get_position();
- SpicePoint size = mon->get_size();
-
- if (x == pos.x && y == pos.y && width == size.x && height == size.y) {
- return mon;
- }
-
- if (x < pos.x + size.x && x + width > pos.x && y < pos.y + size.y && y + height > pos.y) {
- THROW("unsupported partial overlap");
- }
- }
- return NULL;
-}
-
-void MultyMonScreen::publish_monitors(MonitorsList& monitors)
-{
- XMonitorsList::iterator iter = _monitors.begin();
- for (; iter != _monitors.end(); iter++) {
- monitors.push_back(*iter);
- }
-}
-
-void MultyMonScreen::monitors_cleanup()
-{
- while (!_monitors.empty()) {
- XMonitor* monitor = _monitors.front();
- _monitors.pop_front();
- delete monitor;
- }
-}
-
-void MultyMonScreen::disable()
-{
- XMonitorsList::iterator iter = _monitors.begin();
- for (; iter != _monitors.end(); iter++) {
- (*iter)->disable();
- }
-}
-
-void MultyMonScreen::enable()
-{
- XMonitorsList::iterator iter = _monitors.begin();
- for (; iter != _monitors.end(); iter++) {
- (*iter)->enable();
- }
-}
-
-void MultyMonScreen::set_size(int width, int height)
-{
- X_DEBUG_SYNC(get_display());
- Window root_window = RootWindow(get_display(), get_screen());
- set_width(width);
- int width_mm = (int)((double)_saved_width_mm / _saved_width * width);
- set_height(height);
- int height_mm = (int)((double)_saved_height_mm / _saved_height * height);
- XLockDisplay(get_display());
- XRRSetScreenSize(get_display(), root_window, width, height, width_mm, height_mm);
- XUnlockDisplay(get_display());
- X_DEBUG_SYNC(get_display());
-}
-
-bool MultyMonScreen::changed()
-{
- if (get_width() != _saved_width || get_height() != _saved_height) {
- return true;
- }
-
- XMonitorsList::iterator iter = _monitors.begin();
- for (; iter != _monitors.end(); iter++) {
- if ((*iter)->mode_changed() || (*iter)->position_changed()) {
- return true;
- }
- }
- return false;
-}
-
-void MultyMonScreen::restore()
-{
- if (is_broken() || !changed()) {
- return;
- }
- X_DEBUG_SYNC(get_display());
- XMonitor::inc_change_ref();
- disable();
- set_size(_saved_width, _saved_height);
- XMonitorsList::iterator iter = _monitors.begin();
- for (; iter != _monitors.end(); iter++) {
- (*iter)->revert();
- }
- enable();
- process_monitor_configure_events(platform_win);
- XMonitor::dec_change_ref();
- X_DEBUG_SYNC(get_display());
-}
-
-SpicePoint MultyMonScreen::get_trans_top_left()
-{
- SpicePoint position;
- position.y = position.x = MAXINT;
-
- XMonitorsList::iterator iter = _monitors.begin();
- for (; iter != _monitors.end(); iter++) {
- SpiceRect& area = (*iter)->get_trans_area();
- position.x = MIN(position.x, area.left);
- position.y = MIN(position.y, area.top);
- }
- return position;
-}
-
-SpicePoint MultyMonScreen::get_trans_bottom_right()
-{
- SpicePoint position;
- position.y = position.x = MININT;
-
- XMonitorsList::iterator iter = _monitors.begin();
- for (; iter != _monitors.end(); iter++) {
- SpiceRect& area = (*iter)->get_trans_area();
- position.x = MAX(position.x, area.right);
- position.y = MAX(position.y, area.bottom);
- }
- return position;
-}
-
-void MultyMonScreen::get_trans_size(int& width, int& height)
-{
- ASSERT(get_trans_top_left().x == 0 && get_trans_top_left().y == 0);
- SpicePoint bottom_right = get_trans_bottom_right();
- ASSERT(bottom_right.x > 0 && bottom_right.y > 0);
- width = bottom_right.x;
- height = bottom_right.y;
-}
-
-#endif
-
-/*class Variant {
- static void get_area_in_front(const SpiceRect& base, int size, SpiceRect& area)
- static int get_push_distance(const SpiceRect& fix_area, const SpiceRect& other)
- static int get_head(const SpiceRect& area)
- static int get_tail(const SpiceRect& area)
- static void move_head(SpiceRect& area, int delta)
- static int get_pull_distance(const SpiceRect& fix_area, const SpiceRect& other)
- static void offset(SpiceRect& area, int delta)
- static void shrink(SpiceRect& area, int delta)
- static int get_distance(const SpiceRect& area, const SpiceRect& other_area)
- static bool is_on_tail(const SpiceRect& area, const SpiceRect& other_area)
- static bool is_on_perpendiculars(const SpiceRect& area, const SpiceRect& other_area)
-}*/
-
-#ifdef USE_XRANDR_1_2
-
-class SortRightToLeft {
-public:
- bool operator () (XMonitor* mon1, XMonitor* mon2) const
- {
- return mon1->get_trans_area().right > mon2->get_trans_area().right;
- }
-};
-
-typedef std::multiset<XMonitor*, SortRightToLeft> PushLeftSet;
-
-class LeftVariant {
-public:
-
- static void get_area_in_front(const SpiceRect& base, int size, SpiceRect& area)
- {
- area.right = base.left;
- area.left = area.right - size;
- area.bottom = base.bottom;
- area.top = base.top;
- }
-
- static int get_push_distance(const SpiceRect& fix_area, const SpiceRect& other)
- {
- return other.right - fix_area.left;
- }
-
- static int get_head(const SpiceRect& area)
- {
- return area.left;
- }
-
- static int get_tail(const SpiceRect& area)
- {
- return area.right;
- }
-
- static void move_head(SpiceRect& area, int delta)
- {
- area.left -= delta;
- ASSERT(area.right >= area.left);
- }
-
- static int get_pull_distance(const SpiceRect& fix_area, const SpiceRect& other)
- {
- return other.left - fix_area.right;
- }
-
- static void offset(SpiceRect& area, int delta)
- {
- rect_offset(area, -delta, 0);
- }
-
- static void shrink(SpiceRect& area, int delta)
- {
- area.right -= delta;
- ASSERT(area.right > area.left);
- }
-
- static int get_distance(const SpiceRect& area, const SpiceRect& other_area)
- {
- return other_area.left - area.left;
- }
-
- static bool is_on_tail(const SpiceRect& area, const SpiceRect& other_area)
- {
- return area.right == other_area.left && other_area.top < area.bottom &&
- other_area.bottom > area.top;
- }
-
- static bool is_on_perpendiculars(const SpiceRect& area, const SpiceRect& other_area)
- {
- return (other_area.bottom == area.top || other_area.top == area.bottom) &&
- other_area.left < area.right && other_area.right > area.left;
- }
-};
-
-class SortLeftToRight {
-public:
- bool operator () (XMonitor* mon1, XMonitor* mon2) const
- {
- return mon1->get_trans_area().left < mon2->get_trans_area().left;
- }
-};
-
-typedef std::multiset<XMonitor*, SortLeftToRight> PushRightSet;
-
-class RightVariant {
-public:
-
- static void get_area_in_front(const SpiceRect& base, int size, SpiceRect& area)
- {
- area.left = base.right;
- area.right = area.left + size;
- area.top = base.top;
- area.bottom = base.bottom;
- }
-
- static int get_push_distance(const SpiceRect& fix_area, const SpiceRect& other)
- {
- return fix_area.right - other.left;
- }
-
- static int get_head(const SpiceRect& area)
- {
- return area.right;
- }
-
- static int get_tail(const SpiceRect& area)
- {
- return area.left;
- }
-
- static void move_head(SpiceRect& area, int delta)
- {
- area.right += delta;
- ASSERT(area.right >= area.left);
- }
-
- static int get_pull_distance(const SpiceRect& fix_area, const SpiceRect& other)
- {
- return fix_area.left - other.right;
- }
-
- static void offset(SpiceRect& area, int delta)
- {
- rect_offset(area, delta, 0);
- }
-
- static bool is_on_tail(const SpiceRect& area, const SpiceRect& other_area)
- {
- return other_area.right == area.left && other_area.top < area.bottom &&
- other_area.bottom > area.top;
- }
-
- static bool is_on_perpendiculars(const SpiceRect& area, const SpiceRect& other_area)
- {
- return (other_area.bottom == area.top || other_area.top == area.bottom) &&
- other_area.left < area.right && other_area.right > area.left;
- }
-};
-
-class SortBottomToTop {
-public:
- bool operator () (XMonitor* mon1, XMonitor* mon2) const
- {
- return mon1->get_trans_area().bottom > mon2->get_trans_area().bottom;
- }
-};
-
-typedef std::multiset<XMonitor*, SortBottomToTop> PushTopSet;
-
-class TopVariant {
-public:
- static void get_area_in_front(const SpiceRect& base, int size, SpiceRect& area)
- {
- area.left = base.left;
- area.right = base.right;
- area.bottom = base.top;
- area.top = area.bottom - size;
- }
-
- static int get_push_distance(const SpiceRect& fix_area, const SpiceRect& other)
- {
- return other.bottom - fix_area.top;
- }
-
- static int get_head(const SpiceRect& area)
- {
- return area.top;
- }
-
- static int get_tail(const SpiceRect& area)
- {
- return area.bottom;
- }
-
- static void move_head(SpiceRect& area, int delta)
- {
- area.top -= delta;
- ASSERT(area.bottom >= area.top);
- }
-
- static int get_pull_distance(const SpiceRect& fix_area, const SpiceRect& other)
- {
- return other.top - fix_area.bottom;
- }
-
- static void offset(SpiceRect& area, int delta)
- {
- rect_offset(area, 0, -delta);
- }
-
- static void shrink(SpiceRect& area, int delta)
- {
- area.bottom -= delta;
- ASSERT(area.bottom > area.top);
- }
-
- static int get_distance(const SpiceRect& area, const SpiceRect& other_area)
- {
- return other_area.top - area.top;
- }
-
- static bool is_on_tail(const SpiceRect& area, const SpiceRect& other_area)
- {
- return area.bottom == other_area.top && other_area.left < area.right &&
- other_area.right > area.left;
- }
-
- static bool is_on_perpendiculars(const SpiceRect& area, const SpiceRect& other_area)
- {
- return (other_area.right == area.left || other_area.left == area.right) &&
- other_area.top < area.bottom && other_area.bottom > area.top;
- }
-};
-
-class SortTopToBottom {
-public:
- bool operator () (XMonitor* mon1, XMonitor* mon2) const
- {
- return mon1->get_trans_area().top < mon2->get_trans_area().top;
- }
-};
-
-typedef std::multiset<XMonitor*, SortTopToBottom> PushBottomSet;
-
-class BottomVariant {
-public:
-
- static void get_area_in_front(const SpiceRect& base, int size, SpiceRect& area)
- {
- area.left = base.left;
- area.right = base.right;
- area.top = base.bottom;
- area.bottom = area.top + size;
- }
-
- static int get_push_distance(const SpiceRect& fix_area, const SpiceRect& other)
- {
- return fix_area.bottom - other.top;
- }
-
- static int get_head(const SpiceRect& area)
- {
- return area.bottom;
- }
-
- static int get_tail(const SpiceRect& area)
- {
- return area.top;
- }
-
- static void move_head(SpiceRect& area, int delta)
- {
- area.bottom += delta;
- ASSERT(area.bottom >= area.top);
- }
-
- static int get_pull_distance(const SpiceRect& fix_area, const SpiceRect& other)
- {
- return fix_area.top - other.bottom;
- }
-
- static void offset(SpiceRect& area, int delta)
- {
- rect_offset(area, 0, delta);
- }
-
- static bool is_on_tail(const SpiceRect& area, const SpiceRect& other_area)
- {
- return other_area.bottom == area.top && other_area.left < area.right &&
- other_area.right > area.left;
- }
-
- static bool is_on_perpendiculars(const SpiceRect& area, const SpiceRect& other_area)
- {
- return (other_area.right == area.left || other_area.left == area.right) &&
- other_area.top < area.bottom && other_area.bottom > area.top;
- }
-};
-
-volatile int wait_for_me = false;
-
-template <class Variant>
-static void bounce_back(XMonitor& monitor, const XMonitorsList& monitors, int head, int distance)
-{
- ASSERT(distance > 0);
- while (wait_for_me);
-
- for (XMonitorsList::const_iterator iter = monitors.begin(); iter != monitors.end(); iter++) {
- SpiceRect& area = (*iter)->get_trans_area();
- if (Variant::get_tail(area) == head && (*iter)->get_pusher() == &monitor) {
- Variant::offset(area, -distance);
- bounce_back<Variant>(**iter, monitors, Variant::get_head(area) + distance, distance);
- //todo: pull_back monitors on perpendiculars
- }
- }
-}
-
-template <class Variant, class SortList, class SortListIter>
-static int push(XMonitor& pusher, XMonitor& monitor, const XMonitorsList& monitors, int delta)
-{
- monitor.pin();
- monitor.set_pusher(pusher);
-
- SortList sort;
- XMonitorsList::const_iterator iter = monitors.begin();
- for (; iter != monitors.end(); iter++) {
- if (*iter == &monitor) {
- continue;
- }
- sort.insert(*iter);
- }
-
- SpiceRect area_to_clear;
- Variant::get_area_in_front(monitor.get_trans_area(), delta, area_to_clear);
-
- SortListIter sort_iter = sort.begin();
-
- for (; sort_iter != sort.end(); sort_iter++) {
- const SpiceRect& other_area = (*sort_iter)->get_trans_area();
-
- if (rect_intersects(area_to_clear, other_area)) {
- int distance = Variant::get_push_distance(area_to_clear, other_area);
- ASSERT(distance > 0);
- if (!(*sort_iter)->is_pinned()) {
- distance = distance - push<Variant, SortList, SortListIter>(monitor, **sort_iter,
- monitors, distance);
- }
-
- if (distance) {
- delta -= distance;
- bounce_back<Variant>(monitor, monitors, Variant::get_head(area_to_clear), distance);
- Variant::move_head(area_to_clear, -distance);
- }
- }
- }
- Variant::offset(monitor.get_trans_area(), delta);
-
- const SpiceRect& area = monitor.get_prev_area();
- for (iter = monitors.begin(); iter != monitors.end(); iter++) {
- if ((*iter)->is_pinned()) {
- continue;
- }
-
- const SpiceRect& other_area = (*iter)->get_prev_area();
- if (Variant::is_on_perpendiculars(area, other_area)) {
- int current_distance = Variant::get_pull_distance(monitor.get_trans_area(),
- (*iter)->get_trans_area());
- int base_distance = Variant::get_pull_distance(area, other_area);
- int distance = current_distance - base_distance;
- if (distance > 0) {
- push<Variant, SortList, SortListIter>(monitor, **iter, monitors, distance);
- }
- } else if (Variant::is_on_tail(area, other_area)) {
- int distance = Variant::get_pull_distance(monitor.get_trans_area(),
- (*iter)->get_trans_area());
- ASSERT(distance >= 0);
- push<Variant, SortList, SortListIter>(monitor, **iter, monitors, distance);
- }
- }
- return delta;
-}
-
-template <class Variant>
-static void pin(XMonitor& monitor, const XMonitorsList& monitors)
-{
- const SpiceRect& area = monitor.get_trans_area();
-
- for (XMonitorsList::const_iterator iter = monitors.begin(); iter != monitors.end(); iter++) {
- const SpiceRect& other_area = (*iter)->get_trans_area();
- if ((*iter)->is_pinned()) {
- continue;
- }
- if (Variant::is_on_tail(other_area, area) ||
- Variant::is_on_perpendiculars(area, other_area)) {
- (*iter)->pin();
- pin<Variant>(**iter, monitors);
- }
- }
-}
-
-template <class Variant, class SortList, class SortListIter>
-static void shrink(XMonitor& monitor, const XMonitorsList& monitors, int delta)
-{
- monitor.pin();
- pin<Variant>(monitor, monitors);
- ASSERT(delta > 0);
-
- SortList sort;
- XMonitorsList::const_iterator iter = monitors.begin();
- for (; iter != monitors.end(); iter++) {
- if (*iter == &monitor) {
- continue;
- }
- sort.insert(*iter);
- }
-
- const SpiceRect area = monitor.get_trans_area();
- Variant::shrink(monitor.get_trans_area(), delta);
- for (SortListIter sort_iter = sort.begin(); sort_iter != sort.end(); sort_iter++) {
- const SpiceRect& other_area = (*sort_iter)->get_trans_area();
- if (Variant::is_on_perpendiculars(area, other_area)) {
- int distance = Variant::get_distance(area, other_area);
- if (distance > 0) {
- distance = MIN(distance, delta);
- push<Variant, SortList, SortListIter>(monitor, **sort_iter, monitors, distance);
- }
- } else if (Variant::is_on_tail(area, other_area)) {
- push<Variant, SortList, SortListIter>(monitor, **sort_iter, monitors, delta);
- }
- }
-}
-
-template <class Variant, class SortList, class SortListIter>
-static void expand(XMonitor& monitor, const XMonitorsList& monitors, int delta)
-{
- monitor.pin();
- ASSERT(delta > 0);
-
- SortList sort;
- XMonitorsList::const_iterator iter = monitors.begin();
- for (; iter != monitors.end(); iter++) {
- if (*iter == &monitor) {
- continue;
- }
- sort.insert(*iter);
- }
-
- SpiceRect area_to_clear;
- Variant::get_area_in_front(monitor.get_trans_area(), delta, area_to_clear);
-
- for (SortListIter sort_iter = sort.begin(); sort_iter != sort.end(); sort_iter++) {
- const SpiceRect& other_area = (*sort_iter)->get_trans_area();
-
- if (rect_intersects(area_to_clear, other_area)) {
- int distance = Variant::get_push_distance(area_to_clear, other_area);
- ASSERT(distance > 0);
- ASSERT(!(*sort_iter)->is_pinned());
-#ifdef RED_DEBUG
- int actual =
-#endif
- push<Variant, SortList, SortListIter>(monitor, **sort_iter, monitors, distance);
- ASSERT(actual == distance);
- }
- }
- Variant::move_head(monitor.get_trans_area(), delta);
-}
-
-bool MultyMonScreen::set_monitor_mode(XMonitor& monitor, const XRRModeInfo& mode_info)
-{
- if (is_broken()) {
- return false;
- }
-
- SpicePoint size = monitor.get_size();
- int dx = mode_info.width - size.x;
- int dy = mode_info.height - size.y;
-
- XMonitorsList::iterator iter = _monitors.begin();
-
- for (; iter != _monitors.end(); iter++) {
- (*iter)->begin_trans();
- }
-
- if (dx > 0) {
- expand<RightVariant, PushRightSet, PushRightSet::iterator>(monitor, _monitors, dx);
- } else if (dx < 0) {
- shrink<LeftVariant, PushLeftSet, PushLeftSet::iterator>(monitor, _monitors, -dx);
- }
-
- for (iter = _monitors.begin(); iter != _monitors.end(); iter++) {
- (*iter)->push_trans();
- }
-
- if (dy > 0) {
- expand<BottomVariant, PushBottomSet, PushBottomSet::iterator>(monitor, _monitors, dy);
- } else if (dy < 0) {
- shrink<TopVariant, PushTopSet, PushTopSet::iterator>(monitor, _monitors, -dy);
- }
-
- int screen_width;
- int screen_height;
-
- get_trans_size(screen_width, screen_height);
-
- if (screen_width > _max_width || screen_height > _max_height) {
- return false;
- }
-
- screen_width = MAX(screen_width, _min_width);
- screen_height = MAX(screen_height, _min_height);
-
- XMonitor::inc_change_ref();
- disable();
- for (iter = _monitors.begin(); iter != _monitors.end(); iter++) {
- (*iter)->commit_trans_position();
- }
- X_DEBUG_SYNC(get_display());
- monitor.set_mode(mode_info);
- set_size(screen_width, screen_height);
- enable();
- process_monitor_configure_events(platform_win);
- XMonitor::dec_change_ref();
- X_DEBUG_SYNC(get_display());
- return true;
-}
-
-XMonitor::XMonitor(MultyMonScreen& container, int id, RRCrtc crtc)
- : Monitor(id)
- , _container (container)
- , _crtc (crtc)
- , _out_of_sync (false)
-{
- update_position();
- _saved_position = _position;
- _saved_size = _size;
- _saved_mode = _mode;
- _saved_rotation = _rotation;
-}
-
-XMonitor::~XMonitor()
-{
- while (!_clones.empty()) {
- XMonitor* clone = _clones.front();
- _clones.pop_front();
- delete clone;
- }
- delete[] _outputs;
-}
-
-void XMonitor::update_position()
-{
- Display* display = _container.get_display();
- X_DEBUG_SYNC(display);
- Window root_window = RootWindow(display, _container.get_screen());
-
- XLockDisplay(display);
- AutoScreenRes res(XRRGetScreenResources(display, root_window));
- XUnlockDisplay(display);
-
- if (!res.valid()) {
- THROW("get screen resources failed");
- }
-
- XLockDisplay(display);
- AutoCrtcInfo crtc_info(XRRGetCrtcInfo(display, res.get(), _crtc));
- XUnlockDisplay(display);
-
- ASSERT(crtc_info->noutput);
-
- _position.x = crtc_info->x;
- _position.y = crtc_info->y;
- _size.x = crtc_info->width;
- _size.y = crtc_info->height;
-
- switch (crtc_info->rotation & 0xf) {
- case RR_Rotate_0:
- _red_rotation = RED_SCREEN_ROTATION_0;
- break;
- case RR_Rotate_90:
- _red_rotation = RED_SCREEN_ROTATION_90;
- break;
- case RR_Rotate_180:
- _red_rotation = RED_SCREEN_ROTATION_180;
- break;
- case RR_Rotate_270:
- _red_rotation = RED_SCREEN_ROTATION_270;
- break;
- default:
- THROW("invalid rotation");
- }
-
- if (crtc_info->noutput > 1) {
- //todo: set valid subpixel order in case all outputs share the same type
- _subpixel_order = RED_SUBPIXEL_ORDER_UNKNOWN;
- } else {
- XLockDisplay(display);
- AutoOutputInfo output_info(XRRGetOutputInfo(display, res.get(), crtc_info->outputs[0]));
- XUnlockDisplay(display);
-
- switch (output_info->subpixel_order) {
- case SubPixelUnknown:
- _subpixel_order = RED_SUBPIXEL_ORDER_UNKNOWN;
- break;
- case SubPixelHorizontalRGB:
- _subpixel_order = RED_SUBPIXEL_ORDER_H_RGB;
- break;
- case SubPixelHorizontalBGR:
- _subpixel_order = RED_SUBPIXEL_ORDER_H_BGR;
- break;
- case SubPixelVerticalRGB:
- _subpixel_order = RED_SUBPIXEL_ORDER_V_RGB;
- break;
- case SubPixelVerticalBGR:
- _subpixel_order = RED_SUBPIXEL_ORDER_V_BGR;
- break;
- case SubPixelNone:
- _subpixel_order = RED_SUBPIXEL_ORDER_NONE;
- break;
- default:
- THROW("invalid subpixel order");
- }
- }
-
- _mode = crtc_info->mode;
- _rotation = crtc_info->rotation;
- _noutput = crtc_info->noutput;
- _outputs = new RROutput[_noutput];
- memcpy(_outputs, crtc_info->outputs, _noutput * sizeof(RROutput));
- X_DEBUG_SYNC(display);
-}
-
-bool XMonitor::find_mode_in_outputs(RRMode mode, int start_index, XRRScreenResources* res)
-{
- int i, j;
- bool retval = true;
-
- X_DEBUG_SYNC(_container.get_display());
- XLockDisplay(_container.get_display());
- for (i = start_index; i < _noutput; i++) {
- AutoOutputInfo output_info(XRRGetOutputInfo(_container.get_display(), res, _outputs[i]));
- for (j = 0; j < output_info->nmode; j++) {
- if (output_info->modes[j] == mode) {
- break;
- }
- }
- if (j == output_info->nmode) {
- retval = false;
- break;
- }
- }
- XUnlockDisplay(_container.get_display());
- X_DEBUG_SYNC(_container.get_display());
- return retval;
-}
-
-bool XMonitor::find_mode_in_clones(RRMode mode, XRRScreenResources* res)
-{
- XMonitorsList::iterator iter = _clones.begin();
- for (; iter != _clones.end(); iter++) {
- if (!(*iter)->find_mode_in_outputs(mode, 0, res)) {
- return false;
- }
- }
- return true;
-}
-
-class ModeInfo {
-public:
- ModeInfo(int int_index, XRRModeInfo* in_info) : index (int_index), info (in_info) {}
-
- int index;
- XRRModeInfo* info;
-};
-
-class ModeCompare {
-public:
- bool operator () (const ModeInfo& mode1, const ModeInfo& mode2) const
- {
- int area1 = mode1.info->width * mode1.info->height;
- int area2 = mode2.info->width * mode2.info->height;
- return area1 < area2 || (area1 == area2 && mode1.index < mode2.index);
- }
-};
-
-XRRModeInfo* XMonitor::find_mode(unsigned int width, unsigned int height, XRRScreenResources* res)
-{
- typedef std::set<ModeInfo, ModeCompare> ModesSet;
- ModesSet modes_set;
- X_DEBUG_SYNC(_container.get_display());
-
- XLockDisplay(_container.get_display());
- AutoOutputInfo output_info(XRRGetOutputInfo(_container.get_display(), res, _outputs[0]));
- XUnlockDisplay(_container.get_display());
-
- for (int i = 0; i < output_info->nmode; i++) {
- XRRModeInfo* mode_inf = find_mod(res, output_info->modes[i]);
- if (mode_inf->width >= width && mode_inf->height >= height) {
- modes_set.insert(ModeInfo(i, mode_inf));
- }
- }
-
- while (!modes_set.empty()) {
- ModesSet::iterator iter = modes_set.begin();
-
- if (!find_mode_in_outputs((*iter).info->id, 1, res)) {
- modes_set.erase(iter);
- continue;
- }
-
- if (!find_mode_in_clones((*iter).info->id, res)) {
- modes_set.erase(iter);
- continue;
- }
- return (*iter).info;
- }
- X_DEBUG_SYNC(_container.get_display());
- return NULL;
-}
-
-void XMonitor::do_set_mode(int width, int height)
-{
- if (width == _size.x && height == _size.y) {
- _out_of_sync = false;
- return;
- }
- Display* display = _container.get_display();
- X_DEBUG_SYNC(display);
- Window root_window = RootWindow(display, _container.get_screen());
-
- XLockDisplay(display);
- AutoScreenRes res(XRRGetScreenResources(display, root_window));
- XUnlockDisplay(display);
-
- if (!res.valid()) {
- THROW("get screen resource failed");
- }
- XRRModeInfo* mode_info = find_mode(width, height, res.get());
-
- if (!mode_info || !_container.set_monitor_mode(*this, *mode_info)) {
- _out_of_sync = true;
- X_DEBUG_SYNC(display);
- return;
- }
- _out_of_sync = false;
-}
-
-void XMonitor::revert()
-{
- _position = _saved_position;
- _size = _saved_size;
- _mode = _saved_mode;
- _rotation = _saved_rotation;
- XMonitorsList::iterator iter = _clones.begin();
- for (; iter != _clones.end(); iter++) {
- (*iter)->revert();
- }
-}
-
-void XMonitor::disable()
-{
- Display* display = _container.get_display();
- X_DEBUG_SYNC(display);
- Window root_window = RootWindow(display, _container.get_screen());
-
- XLockDisplay(display);
- AutoScreenRes res(XRRGetScreenResources(display, root_window));
- XUnlockDisplay(display);
-
- if (!res.valid()) {
- THROW("get screen resources failed");
- }
- XLockDisplay(display);
- XRRSetCrtcConfig(display, res.get(), _crtc, CurrentTime,
- 0, 0, None, RR_Rotate_0, NULL, 0);
- XUnlockDisplay(display);
-
- XMonitorsList::iterator iter = _clones.begin();
- for (; iter != _clones.end(); iter++) {
- (*iter)->disable();
- }
- XFlush(x_display);
- X_DEBUG_SYNC(display);
-}
-
-void XMonitor::enable()
-{
- Display* display = _container.get_display();
- X_DEBUG_SYNC(display);
- Window root_window = RootWindow(display, _container.get_screen());
-
- XLockDisplay(display);
- AutoScreenRes res(XRRGetScreenResources(display, root_window));
- XUnlockDisplay(display);
-
- if (!res.valid()) {
- THROW("get screen resources failed");
- }
- XLockDisplay(display);
- XRRSetCrtcConfig(display, res.get(), _crtc, CurrentTime,
- _position.x, _position.y,
- _mode, _rotation,
- _outputs, _noutput);
- XUnlockDisplay(display);
-
- XMonitorsList::iterator iter = _clones.begin();
- for (; iter != _clones.end(); iter++) {
- (*iter)->enable();
- }
- XFlush(x_display);
- X_DEBUG_SYNC(display);
-}
-
-bool XMonitor::mode_changed()
-{
- return _size.x != _saved_size.x || _size.y != _saved_size.y ||
- _mode != _saved_mode || _rotation != _saved_rotation;
-}
-
-bool XMonitor::position_changed()
-{
- return _position.x != _saved_position.x || _position.y != _saved_position.y;
-}
-
-void XMonitor::do_restore()
-{
- if (!mode_changed()) {
- return;
- }
- _container.restore();
-}
-
-int XMonitor::get_depth()
-{
- return XPlatform::get_vinfo()[0]->depth;
-}
-
-SpicePoint XMonitor::get_position()
-{
- return _position;
-}
-
-SpicePoint XMonitor::get_size() const
-{
- return _size;
-}
-
-bool XMonitor::is_out_of_sync()
-{
- return _out_of_sync;
-}
-
-void XMonitor::add_clone(XMonitor *clone)
-{
- _clones.push_back(clone);
-}
-
-const SpiceRect& XMonitor::get_prev_area()
-{
- return _trans_area[_trans_depth - 1];
-}
-
-SpiceRect& XMonitor::get_trans_area()
-{
- return _trans_area[_trans_depth];
-}
-
-void XMonitor::push_trans()
-{
- _trans_depth++;
- ASSERT(_trans_depth < MAX_TRANS_DEPTH);
- _trans_area[_trans_depth] = _trans_area[_trans_depth - 1];
- _pin_count = 0;
- _pusher = NULL;
-}
-
-void XMonitor::begin_trans()
-{
- _trans_area[0].left = _position.x;
- _trans_area[0].right = _trans_area[0].left + _size.x;
- _trans_area[0].top = _position.y;
- _trans_area[0].bottom = _trans_area[0].top + _size.y;
- _trans_area[1] = _trans_area[0];
- _trans_depth = 1;
- _pin_count = 0;
- _pusher = NULL;
-}
-
-void XMonitor::commit_trans_position()
-{
- _position.x = _trans_area[_trans_depth].left;
- _position.y = _trans_area[_trans_depth].top;
- XMonitorsList::iterator iter = _clones.begin();
- for (; iter != _clones.end(); iter++) {
- (*iter)->_position = _position;
- }
-}
-
-void XMonitor::set_mode(const XRRModeInfo& mode)
-{
- _mode = mode.id;
- _size.x = mode.width;
- _size.y = mode.height;
- XMonitorsList::iterator iter = _clones.begin();
- for (; iter != _clones.end(); iter++) {
- (*iter)->set_mode(mode);
- }
-}
-
-#endif
-
-#ifdef USE_XINERAMA_1_0
-
-static XineramaScreenInfo* init_xinerama_screens(int* num_xin_screens)
-{
- XineramaScreenInfo* xin_screens = NULL;
-
- if (using_xinerama_1_0 && ScreenCount(x_display) == 1) {
- int ncrtc = 0;
-#ifdef USE_XRANDR_1_2
- if (using_xrandr_1_2) {
- AutoScreenRes res(XRRGetScreenResources(x_display, RootWindow(x_display, 0)));
- if (res.valid()) {
- ncrtc = res->ncrtc;
- }
- }
-#endif
- if (ncrtc < 2) {
- xin_screens = XineramaQueryScreens(x_display, num_xin_screens);
- }
- }
- if (xin_screens && *num_xin_screens < 2) {
- XFree(xin_screens);
- return NULL;
- }
- return xin_screens;
-}
-
-#endif
-
-static MonitorsList monitors;
-static Monitor* primary_monitor = NULL;
-
-typedef std::list<XScreen*> ScreenList;
-static ScreenList screens;
-
-const MonitorsList& Platform::init_monitors()
-{
- int next_mon_id = 0;
- ASSERT(screens.empty());
-
-#ifdef USE_XINERAMA_1_0
- int num_xin_screens;
- XineramaScreenInfo* xin_screens = init_xinerama_screens(&num_xin_screens);
- if (xin_screens) {
- screens.push_back(new XineramaScreen(x_display, 0, next_mon_id, xin_screens, num_xin_screens));
- XFree(xin_screens);
- } else
-#endif
-#ifdef USE_XRANDR_1_2
- if (using_xrandr_1_2) {
- for (int i = 0; i < ScreenCount(x_display); i++) {
- screens.push_back(new MultyMonScreen(x_display, i, next_mon_id));
- }
- } else
-#endif
- if (using_xrandr_1_0) {
- for (int i = 0; i < ScreenCount(x_display); i++) {
- screens.push_back(new DynamicScreen(x_display, i, next_mon_id));
- }
- } else {
- for (int i = 0; i < ScreenCount(x_display); i++) {
- screens.push_back(new StaticScreen(x_display, i, next_mon_id));
- }
- }
-
- ASSERT(monitors.empty());
- ScreenList::iterator iter = screens.begin();
- for (; iter != screens.end(); iter++) {
- (*iter)->publish_monitors(monitors);
- }
- MonitorsList::iterator mon_iter = monitors.begin();
- for (; mon_iter != monitors.end(); mon_iter++) {
- Monitor *mon = *mon_iter;
- if (mon->get_id() == 0) {
- primary_monitor = mon;
- break;
- }
- }
- return monitors;
-}
-
-void Platform::destroy_monitors()
-{
- primary_monitor = NULL;
- monitors.clear();
- while (!screens.empty()) {
- XScreen* screen = screens.front();
- screens.pop_front();
- delete screen;
- }
-}
-
-bool Platform::is_monitors_pos_valid()
-{
- return (ScreenCount(x_display) == 1);
-}
-
-void Platform::get_app_data_dir(std::string& path, const std::string& app_name)
-{
- const char* home_dir = getenv("HOME");
-
- if (!home_dir || strlen(home_dir) == 0) {
- throw Exception("get home dir failed");
- }
-
- path = home_dir;
- std::string::iterator end = path.end();
-
- while (end != path.begin() && *(end - 1) == '/') {
- path.erase(--end);
- }
-
- path += "/.";
- path += app_name;
-
- if (mkdir(path.c_str(), 0700) == -1 && errno != EEXIST) {
- throw Exception("create appdata dir failed");
- }
-}
-
-void Platform::path_append(std::string& path, const std::string& partial_path)
-{
- path += "/";
- path += partial_path;
-}
-
-static void ensure_clipboard_data_space(uint32_t size)
-{
- if (size > clipboard_data_space) {
- free(clipboard_data);
- clipboard_data = (uint8_t *)malloc(size);
- assert(clipboard_data);
- clipboard_data_space = size;
- }
-}
-
-static void send_selection_notify(Atom prop, int process_next_req)
-{
- XEvent res, *event = &next_selection_request->event;
- selection_request *old_request;
-
- res.xselection.property = prop;
- res.xselection.type = SelectionNotify;
- res.xselection.display = event->xselectionrequest.display;
- res.xselection.requestor = event->xselectionrequest.requestor;
- res.xselection.selection = event->xselectionrequest.selection;
- res.xselection.target = event->xselectionrequest.target;
- res.xselection.time = event->xselectionrequest.time;
- XSendEvent(x_display, event->xselectionrequest.requestor, 0, 0, &res);
- XFlush(x_display);
-
- old_request = next_selection_request;
- next_selection_request = next_selection_request->next;
- delete old_request;
-
- if (process_next_req)
- handle_selection_request();
-}
-
-static void print_targets(const char *action, Atom *atoms, int c)
-{
- int i;
-
- LOG_INFO("%s %d targets:", action, c);
- for (i = 0; i < c; i++)
- LOG_INFO("%s", atom_name(atoms[i]));
-}
-
-static void send_targets(XEvent& request_event)
-{
- Atom targets[256] = { targets_atom, };
- int i, j, k, target_count = 1;
-
- for (i = 0; i < clipboard_type_count; i++) {
- for (j = 0; j < clipboard_format_count; j++) {
- if (clipboard_formats[j].type != clipboard_agent_types[i]) {
- continue;
- }
- for (k = 0; k < clipboard_formats[j].atom_count; k++) {
- targets[target_count] = clipboard_formats[j].atoms[k];
- target_count++;
- if (target_count == sizeof(targets)/sizeof(Atom)) {
- LOG_WARN("sendtargets: too many targets");
- goto exit_loop;
- }
- }
- }
- }
-exit_loop:
-
- Window requestor_win = request_event.xselectionrequest.requestor;
- Atom prop = request_event.xselectionrequest.property;
- if (prop == None)
- prop = request_event.xselectionrequest.target;
-
- XChangeProperty(x_display, requestor_win, prop, XA_ATOM, 32,
- PropModeReplace, (unsigned char *)&targets,
- target_count);
- print_targets("sent", targets, target_count);
- send_selection_notify(prop, 1);
-}
-
-static int get_selection(XEvent &event, Atom type, Atom prop, int format,
- unsigned char **data_ret, bool incr)
-{
- Bool del = incr ? True: False;
- Atom type_ret;
- int res, format_ret, ret_val = -1;
- unsigned long len, remain;
- unsigned char *data = NULL;
-
- if (incr) {
- if (event.xproperty.atom != prop) {
- LOG_WARN("PropertyNotify parameters mismatch");
- goto exit;
- }
- } else {
- if (event.xselection.property == None) {
- LOG_INFO("XConvertSelection refused by clipboard owner");
- goto exit;
- }
-
- if (event.xselection.requestor != platform_win ||
- event.xselection.selection != clipboard_prop ||
- event.xselection.property != prop) {
- LOG_WARN("SelectionNotify parameters mismatch");
- goto exit;
- }
- }
-
- /* Warning we are running with the clipboard_lock held!! That is ok, as
- there is no code holding XLockDisplay which calls code taking
- the clipboard_lock!! */
- XLockDisplay(x_display);
- res = XGetWindowProperty(x_display, platform_win, prop, 0,
- LONG_MAX, del, type, &type_ret, &format_ret, &len,
- &remain, &data);
- XUnlockDisplay(x_display);
- if (res != Success) {
- LOG_WARN("XGetWindowProperty failed");
- goto exit;
- }
-
- if (!incr) {
- if (type_ret == incr_atom) {
- if (waiting_for_property_notify) {
- LOG_WARN("received an incr property notify while still reading another incr property");
- goto exit;
- }
- XSelectInput(x_display, platform_win, PropertyChangeMask);
- XDeleteProperty(x_display, platform_win, prop);
- XFlush(x_display);
- waiting_for_property_notify = true;
- ensure_clipboard_data_space(*(uint32_t*)data);
- XFree(data);
- return 0; /* Wait for more data */
- }
- XDeleteProperty(x_display, platform_win, prop);
- XFlush(x_display);
- }
-
- if (type_ret != type) {
- LOG_WARN("expected property type: %s, got: %s", atom_name(type),
- atom_name(type_ret));
- goto exit;
- }
-
- if (format_ret != format) {
- LOG_WARN("expected %d bit format, got %d bits", format, format_ret);
- goto exit;
- }
-
- /* Convert len to bytes */
- switch(format) {
- case 8:
- break;
- case 16:
- len *= sizeof(short);
- break;
- case 32:
- len *= sizeof(long);
- break;
- }
-
- if (incr) {
- if (len) {
- if (clipboard_data_size + len > clipboard_data_space) {
- clipboard_data_space = clipboard_data_size + len;
- clipboard_data = (uint8_t *)realloc(clipboard_data, clipboard_data_space);
- assert(clipboard_data);
- }
- memcpy(clipboard_data + clipboard_data_size, data, len);
- clipboard_data_size += len;
- LOG_INFO("Appended %d bytes to buffer", len);
- XFree(data);
- return 0; /* Wait for more data */
- }
- len = clipboard_data_size;
- *data_ret = clipboard_data;
- } else {
- if (len > 0)
- *data_ret = data;
- else
- *data_ret = NULL;
- }
-
- if (len > 0)
- ret_val = len;
- else
- LOG_WARN("property contains no data (zero length)");
-
-exit:
- if ((incr || ret_val == -1) && data)
- XFree(data);
-
- if (incr) {
- clipboard_data_size = 0;
- waiting_for_property_notify = false;
- }
-
- return ret_val;
-}
-
-static void get_selection_free(unsigned char *data, bool incr)
-{
- if (incr) {
- /* If the clipboard was large return the memory to the system */
- if (clipboard_data_space > 512 * 1024) {
- free(clipboard_data);
- clipboard_data = NULL;
- clipboard_data_space = 0;
- }
- } else if (data)
- XFree(data);
-}
-
-static Atom atom_lists_overlap(Atom *atoms1, Atom *atoms2, int l1, int l2)
-{
- int i, j;
-
- for (i = 0; i < l1; i++)
- for (j = 0; j < l2; j++)
- if (atoms1[i] == atoms2[j])
- return atoms1[i];
-
- return 0;
-}
-
-static void handle_targets_notify(XEvent& event, bool incr)
-{
- int i, len;
- Lock lock(clipboard_lock);
- Atom atom, *atoms = NULL;
-
- if (!expected_targets_notifies) {
- LOG_WARN("unexpected selection notify TARGETS");
- return;
- }
- expected_targets_notifies--;
-
- /* If we have more targets_notifies pending, ignore this one, we
- are only interested in the targets list of the current owner
- (which is the last one we've requested a targets list from) */
- if (expected_targets_notifies)
- return;
-
- len = get_selection(event, XA_ATOM, targets_atom, 32,
- (unsigned char **)&atoms, incr);
- if (len == 0 || len == -1) /* waiting for more data or error? */
- return;
-
- /* bytes -> atoms */
- len /= sizeof(Atom);
- print_targets("received", atoms, len);
-
- clipboard_type_count = 0;
- for (i = 0; i < clipboard_format_count; i++) {
- atom = atom_lists_overlap(clipboard_formats[i].atoms, atoms,
- clipboard_formats[i].atom_count, len);
- if (atom) {
- clipboard_agent_types[clipboard_type_count] =
- clipboard_formats[i].type;
- clipboard_x11_targets[clipboard_type_count] = atom;
- clipboard_type_count++;
- if (clipboard_type_count ==
- sizeof(clipboard_agent_types)/sizeof(uint32_t)) {
- LOG_WARN("handle_targets_notify: too many matching types");
- break;
- }
- }
- }
-
- if (clipboard_type_count)
- clipboard_listener->on_clipboard_grab(clipboard_agent_types,
- clipboard_type_count);
-
- get_selection_free((unsigned char *)atoms, incr);
-}
-
-static void handle_selection_notify(XEvent& event, bool incr)
-{
- int len = -1;
- uint32_t type = get_clipboard_type(clipboard_request_target);
- unsigned char *data = NULL;
-
- if (clipboard_request_target == None)
- LOG_INFO("SelectionNotify received without a target");
- else if (!incr &&
- event.xselection.target != clipboard_request_target &&
- event.xselection.target != incr_atom)
- LOG_WARN("Requested %s target got %s",
- atom_name(clipboard_request_target),
- atom_name(event.xselection.target));
- else
- len = get_selection(event, clipboard_request_target, clipboard_prop,
- 8, &data, incr);
-
- if (len == 0) /* waiting for more data? */
- return;
- if (len == -1) {
- type = VD_AGENT_CLIPBOARD_NONE;
- len = 0;
- }
-
- clipboard_listener->on_clipboard_notify(type, data, len);
- clipboard_request_target = None;
- get_selection_free(data, incr);
-}
-
-static void handle_selection_request()
-{
- XEvent *event;
- uint32_t type = VD_AGENT_CLIPBOARD_NONE;
-
- if (!next_selection_request)
- return;
-
- event = &next_selection_request->event;
-
- if (Platform::get_clipboard_owner() != Platform::owner_guest) {
- LOG_INFO("received selection request event for target %s, "
- "while clipboard not owned by guest",
- atom_name(event->xselectionrequest.target));
- send_selection_notify(None, 1);
- return;
- }
-
- if (event->xselectionrequest.target == multiple_atom) {
- LOG_WARN("multiple target not supported");
- send_selection_notify(None, 1);
- return;
- }
-
- if (event->xselectionrequest.target == targets_atom) {
- send_targets(*event);
- return;
- }
-
- type = get_clipboard_type(event->xselectionrequest.target);
- if (type == VD_AGENT_CLIPBOARD_NONE) {
- send_selection_notify(None, 1);
- return;
- }
-
- clipboard_listener->on_clipboard_request(type);
-}
-
-static void root_win_proc(XEvent& event)
-{
-
-#ifdef USE_XRANDR_1_2
- ASSERT(using_xrandr_1_0 || using_xrandr_1_2);
-#else
- ASSERT(using_xrandr_1_0);
-#endif
- if (event.type == ConfigureNotify || event.type - xrandr_event_base == RRScreenChangeNotify) {
- XRRUpdateConfiguration(&event);
- if (event.type - xrandr_event_base == RRScreenChangeNotify) {
- display_mode_listener->on_display_mode_change();
- }
-
- if (Monitor::is_self_change()) {
- return;
- }
-
- ScreenList::iterator iter = screens.begin();
- for (; iter != screens.end(); iter++) {
- (*iter)->set_broken();
- }
- event_listener->on_monitors_change();
- return;
- }
- if (event.type == XFixesSelectionNotify + xfixes_event_base) {
- XFixesSelectionNotifyEvent* selection_event = (XFixesSelectionNotifyEvent *)&event;
- switch (selection_event->subtype) {
- case XFixesSetSelectionOwnerNotify:
- break;
- /* Treat ... as a SelectionOwnerNotify None */
- case XFixesSelectionWindowDestroyNotify:
- case XFixesSelectionClientCloseNotify:
- selection_event->owner = None;
- break;
- default:
- LOG_INFO("Unsupported selection event %u", selection_event->subtype);
- return;
- }
- LOG_INFO("XFixesSetSelectionOwnerNotify %u",
- (unsigned int)selection_event->owner);
-
- /* Ignore becoming the owner ourselves */
- if (selection_event->owner == platform_win)
- return;
-
- /* If the clipboard owner is changed we no longer own it */
- Platform::set_clipboard_owner(Platform::owner_none);
- if (selection_event->owner == None)
- return;
-
- /* Request the supported targets from the new owner */
- XConvertSelection(x_display, clipboard_prop, targets_atom,
- targets_atom, platform_win, CurrentTime);
- XFlush(x_display);
- expected_targets_notifies++;
- return;
- }
- switch (event.type) {
- case SelectionRequest: {
- Lock lock(clipboard_lock);
- struct selection_request *req, *new_req;
-
- new_req = new selection_request;
- assert(new_req);
-
- new_req->event = event;
- new_req->next = NULL;
-
- if (!next_selection_request) {
- next_selection_request = new_req;
- handle_selection_request();
- break;
- }
-
- /* maybe we should limit the selection_request stack depth ? */
- req = next_selection_request;
- while (req->next)
- req = req->next;
-
- req->next = new_req;
- break;
- }
- case SelectionClear:
- /* Do nothing the clipboard ownership will get updated through
- the XFixesSetSelectionOwnerNotify event */
- break;
- case SelectionNotify:
- if (event.xselection.target == targets_atom)
- handle_targets_notify(event, false);
- else
- handle_selection_notify(event, false);
- break;
- case PropertyNotify:
- if (!waiting_for_property_notify || event.xproperty.state != PropertyNewValue) {
- break;
- }
- if (event.xproperty.atom == targets_atom)
- handle_targets_notify(event, true);
- else
- handle_selection_notify(event, true);
- break;
- default:
- return;
- }
-}
-
-static void process_monitor_configure_events(Window root)
-{
- XEvent event;
-
- XLockDisplay(x_display);
- XSync(x_display, False);
-
- while (XCheckTypedWindowEvent(x_display, root, ConfigureNotify, &event)) {
- XUnlockDisplay(x_display);
- root_win_proc(event);
- XLockDisplay(x_display);
- }
-
- while (XCheckTypedWindowEvent(x_display, root, xrandr_event_base + RRScreenChangeNotify,
- &event)) {
- XUnlockDisplay(x_display);
- root_win_proc(event);
- XLockDisplay(x_display);
- }
-
- XUnlockDisplay(x_display);
-}
-
-static void cleanup(void)
-{
- int i;
-
- DBG(0, "");
- if (!Monitor::is_self_change()) {
- Platform::destroy_monitors();
- }
- if (vinfo) {
- for (i = 0; i < ScreenCount(x_display); ++i) {
- XFree(vinfo[i]);
- }
- delete[] vinfo;
- vinfo = NULL;
- }
-#ifdef USE_OPENGL
- if (fb_config) {
- for (i = 0; i < ScreenCount(x_display); ++i) {
- if (fb_config[i]) {
- XFree(fb_config[i]);
- }
- }
- delete fb_config;
- fb_config = NULL;
- }
-#endif // USE_OPENGL
-}
-
-static void quit_handler(int sig)
-{
- LOG_INFO("signal %d", sig);
- Platform::send_quit_request();
-}
-
-static void abort_handler(int sig)
-{
- LOG_INFO("signal %d", sig);
- Platform::destroy_monitors();
-}
-
-static void init_xrandr()
-{
- Bool xrandr_ext = XRRQueryExtension(x_display, &xrandr_event_base, &xrandr_error_base);
- if (xrandr_ext) {
- XRRQueryVersion(x_display, &xrandr_major, &xrandr_minor);
- if (xrandr_major < 1) {
- return;
- }
-#ifdef USE_XRANDR_1_2
- if (xrandr_major == 1 && xrandr_minor < 2) {
- using_xrandr_1_0 = true;
- return;
- }
- using_xrandr_1_2 = true;
-#else
- using_xrandr_1_0 = true;
-#endif
- }
-}
-
-static void init_xrender()
-{
- int event_base;
- int error_base;
- int major;
- int minor;
-
- using_xrender_0_5 = XRenderQueryExtension(x_display, &event_base, &error_base) &&
- XRenderQueryVersion(x_display, &major, &minor) && (major > 0 || minor >= 5);
-}
-
-static void init_xinerama()
-{
-#ifdef USE_XINERAMA_1_0
- int event_base;
- int error_base;
- int major;
- int minor;
-
- using_xinerama_1_0 = XineramaQueryExtension(x_display, &event_base, &error_base) &&
- XineramaQueryVersion(x_display, &major, &minor) && major >= 1 && minor >= 0 &&
- XineramaIsActive(x_display);
-#endif
-}
-
-static void init_xfixes()
-{
- int major;
- int minor;
-
- using_xfixes_1_0 = XFixesQueryExtension(x_display, &xfixes_event_base, &xfixes_error_base) &&
- XFixesQueryVersion(x_display, &major, &minor) && major >= 1;
-}
-
-static void init_kbd()
-{
- int xkb_major = XkbMajorVersion;
- int xkb_minor = XkbMinorVersion;
- int opcode;
- int event;
- int error;
-
- if (!XkbLibraryVersion(&xkb_major, &xkb_minor) ||
- !XkbQueryExtension(x_display, &opcode, &event, &error, &xkb_major, &xkb_minor)) {
- return;
- }
- caps_lock_mask = XkbKeysymToModifiers(x_display, XK_Caps_Lock);
- num_lock_mask = XkbKeysymToModifiers(x_display, XK_Num_Lock);
-}
-
-static void init_XIM()
-{
- char app_name[20];
- strcpy(app_name, "spicec");
-
- XSetLocaleModifiers("");
- x_input_method = XOpenIM(x_display, NULL, app_name, app_name);
-
- if (!x_input_method) {
- return;
- }
-
- x_input_context = XCreateIC(x_input_method, XNInputStyle, XIMPreeditNone | XIMStatusNone, NULL);
-
- if (!x_input_context) {
- THROW("create IC failed");
- }
-}
-
-static int x_error_handler(Display* display, XErrorEvent* error_event)
-{
- char error_str[256];
- char request_str[256];
- char number_str[32];
-
- if (handle_x_error) {
- if (error_event->error_code) {
- x_error_code = error_event->error_code;
- }
- return 0;
- }
-
- char* display_name = XDisplayString(display);
- XGetErrorText(display, error_event->error_code, error_str, sizeof(error_str));
-
- if (error_event->request_code < 128) {
- snprintf(number_str, sizeof(number_str), "%d", error_event->request_code);
- XGetErrorDatabaseText(display, "XRequest", number_str, "",
- request_str, sizeof(request_str));
- } else {
- snprintf(request_str, sizeof(request_str), "%d", error_event->request_code);
- }
-
- LOG_ERROR("x error on display %s error %s minor %u request %s",
- display_name,
- error_str,
- (uint32_t)error_event->minor_code,
- request_str);
- _exit(-1);
- return 0;
-}
-
-static SPICE_GNUC_NORETURN int x_io_error_handler(Display* display)
-{
- LOG_ERROR("x io error on %s", XDisplayString(display));
- _exit(-1);
-}
-
-static XVisualInfo* get_x_vis_info(int screen)
-{
- XVisualInfo vtemplate;
- int count;
-
- Visual* visual = DefaultVisualOfScreen(ScreenOfDisplay(x_display, screen));
- vtemplate.screen = screen;
- vtemplate.visualid = XVisualIDFromVisual(visual);
- return XGetVisualInfo(x_display, VisualIDMask | VisualScreenMask, &vtemplate, &count);
-}
-
-void Platform::init()
-{
-#ifdef USE_OPENGL
- int err, ev;
- int threads_enable;
-#endif // USE_OPENGL
- int major, minor;
- Bool pixmaps;
-
- DBG(0, "");
-
- setlocale(LC_ALL, "");
-
-#ifdef USE_OPENGL
- threads_enable = XInitThreads();
-#else
- XInitThreads();
-#endif
-
- if (!(x_display = XOpenDisplay(NULL))) {
- THROW("open X display failed");
- }
-
- if (XShmQueryExtension (x_display) &&
- XShmQueryVersion (x_display, &major, &minor, &pixmaps)) {
- x_shm_avail = true;
- }
-
- vinfo = new XVisualInfo *[ScreenCount(x_display)];
- memset(vinfo, 0, sizeof(XVisualInfo *) * ScreenCount(x_display));
- screen_format = new RedDrawable::Format[ScreenCount(x_display)];
- memset(screen_format, 0, sizeof(RedDrawable::Format) * ScreenCount(x_display));
-#ifdef USE_OPENGL
- fb_config = new GLXFBConfig *[ScreenCount(x_display)];
- memset(fb_config, 0, sizeof(GLXFBConfig *) * ScreenCount(x_display));
-
- if (threads_enable && glXQueryExtension(x_display, &err, &ev)) {
- int num_configs;
- int attrlist[] = {
- GLX_RENDER_TYPE, GLX_RGBA_BIT,
- GLX_DOUBLEBUFFER, True,
- GLX_DRAWABLE_TYPE, GLX_PBUFFER_BIT | GLX_WINDOW_BIT,
- GLX_X_VISUAL_TYPE, GLX_TRUE_COLOR,
- GLX_RED_SIZE, 8,
- GLX_GREEN_SIZE, 8,
- GLX_BLUE_SIZE, 8,
- GLX_ALPHA_SIZE, 8,
- GLX_STENCIL_SIZE, 0,
- GLX_DEPTH_SIZE, 0,
- None
- };
-
- for (int i = 0; i < ScreenCount(x_display); ++i) {
- fb_config[i] = glXChooseFBConfig(x_display, i, attrlist, &num_configs);
- if (fb_config[i] != NULL) {
- ASSERT(num_configs > 0);
- vinfo[i] = glXGetVisualFromFBConfig(x_display, fb_config[i][0]);
- }
-
- if (vinfo[i] == NULL) {
- if (fb_config[i]) {
- XFree(fb_config[i]);
- fb_config[i] = NULL;
- }
- vinfo[i] = get_x_vis_info(i);
- }
- }
- } else
-#else // !USE_OPENGL
- {
- for (int i = 0; i < ScreenCount(x_display); ++i) {
- vinfo[i] = get_x_vis_info(i);
- }
- }
-#endif // USE_OPENGL
-
- for (int i = 0; i < ScreenCount(x_display); ++i) {
- if (vinfo[i] == NULL) {
- THROW("Unable to find a visual for screen");
- }
- if ((vinfo[i]->depth == 32 || vinfo[i]->depth == 24) &&
- vinfo[i]->red_mask == 0xff0000 &&
- vinfo[i]->green_mask == 0x00ff00 &&
- vinfo[i]->blue_mask == 0x0000ff) {
- screen_format[i] = RedDrawable::RGB32;
- } else if (vinfo[i]->depth == 16 &&
- vinfo[i]->red_mask == 0xf800 &&
- vinfo[i]->green_mask == 0x7e0 &&
- vinfo[i]->blue_mask == 0x1f) {
- screen_format[i] = RedDrawable::RGB16_565;
- } else if (vinfo[i]->depth == 15 &&
- vinfo[i]->red_mask == 0x7c00 &&
- vinfo[i]->green_mask == 0x3e0 &&
- vinfo[i]->blue_mask == 0x1f) {
- screen_format[i] = RedDrawable::RGB16_555;
- } else {
- THROW("Unsupported visual for screen");
- }
- }
-
- XSetErrorHandler(x_error_handler);
- XSetIOErrorHandler(x_io_error_handler);
-
- win_proc_context = XUniqueContext();
-
- init_kbd();
- init_xrandr();
- init_xrender();
- init_xfixes();
- init_XIM();
- init_xinerama();
-
- struct sigaction act;
- memset(&act, 0, sizeof(act));
- sigfillset(&act.sa_mask);
-
- act.sa_handler = quit_handler;
- sigaction(SIGINT, &act, NULL);
- sigaction(SIGHUP, &act, NULL);
- sigaction(SIGTERM, &act, NULL);
- sigaction(SIGQUIT, &act, NULL);
-
- act.sa_handler = SIG_IGN;
- sigaction(SIGPIPE, &act, NULL);
-
- act.sa_flags = SA_RESETHAND;
- act.sa_handler = abort_handler;
- sigaction(SIGABRT, &act, NULL);
- sigaction(SIGILL, &act, NULL);
- sigaction(SIGSEGV, &act, NULL);
- sigaction(SIGFPE, &act, NULL);
-
- atexit(cleanup);
-}
-
-void Platform::set_process_loop(ProcessLoop& main_process_loop)
-{
- main_loop = &main_process_loop;
- XEventHandler *x_event_handler;
- x_event_handler = new XEventHandler(*x_display, win_proc_context);
- main_loop->add_file(*x_event_handler);
-}
-
-uint32_t Platform::get_keyboard_lock_modifiers()
-{
- XKeyboardState keyboard_state;
- uint32_t modifiers = 0;
-
- XLockDisplay(x_display);
- XGetKeyboardControl(x_display, &keyboard_state);
- XUnlockDisplay(x_display);
-
- if (keyboard_state.led_mask & 0x01) {
- modifiers |= CAPS_LOCK_MODIFIER;
- }
- if (keyboard_state.led_mask & 0x02) {
- modifiers |= NUM_LOCK_MODIFIER;
- }
- if (keyboard_state.led_mask & 0x04) {
- modifiers |= SCROLL_LOCK_MODIFIER;
- }
- return modifiers;
-}
-
-enum XLed {
- X11_CAPS_LOCK_LED = 1,
- X11_NUM_LOCK_LED,
- X11_SCROLL_LOCK_LED,
-};
-
-static void set_keyboard_led(XLed led, int set)
-{
- switch (led) {
- case X11_CAPS_LOCK_LED:
- if (caps_lock_mask) {
- XkbLockModifiers(x_display, XkbUseCoreKbd, caps_lock_mask, set ? caps_lock_mask : 0);
- XFlush(x_display);
- }
- return;
- case X11_NUM_LOCK_LED:
- if (num_lock_mask) {
- XkbLockModifiers(x_display, XkbUseCoreKbd, num_lock_mask, set ? num_lock_mask : 0);
- XFlush(x_display);
- }
- return;
- case X11_SCROLL_LOCK_LED:
- XKeyboardControl keyboard_control;
- keyboard_control.led_mode = set ? LedModeOn : LedModeOff;
- keyboard_control.led = led;
- XChangeKeyboardControl(x_display, KBLed | KBLedMode, &keyboard_control);
- XFlush(x_display);
- return;
- }
-}
-
-void Platform::set_keyboard_lock_modifiers(uint32_t modifiers)
-{
- uint32_t now = get_keyboard_lock_modifiers();
-
- if ((now & CAPS_LOCK_MODIFIER) != (modifiers & CAPS_LOCK_MODIFIER)) {
- set_keyboard_led(X11_CAPS_LOCK_LED, !!(modifiers & CAPS_LOCK_MODIFIER));
- }
- if ((now & NUM_LOCK_MODIFIER) != (modifiers & NUM_LOCK_MODIFIER)) {
- set_keyboard_led(X11_NUM_LOCK_LED, !!(modifiers & NUM_LOCK_MODIFIER));
- }
- if ((now & SCROLL_LOCK_MODIFIER) != (modifiers & SCROLL_LOCK_MODIFIER)) {
- set_keyboard_led(X11_SCROLL_LOCK_LED, !!(modifiers & SCROLL_LOCK_MODIFIER));
- }
-}
-
-static uint32_t key_bit(char* keymap, int key, uint32_t bit)
-{
- KeyCode key_code = XKeysymToKeycode(x_display, key);
- return (((keymap[key_code >> 3] >> (key_code & 7)) & 1) ? bit : 0);
-}
-
-uint32_t Platform::get_keyboard_modifiers()
-{
- char keymap[32];
- uint32_t mods;
-
- XLockDisplay(x_display);
- XQueryKeymap(x_display, keymap);
- mods = key_bit(keymap, XK_Shift_L, L_SHIFT_MODIFIER) |
- key_bit(keymap, XK_Shift_R, R_SHIFT_MODIFIER) |
- key_bit(keymap, XK_Control_L, L_CTRL_MODIFIER) |
- key_bit(keymap, XK_Control_R, R_CTRL_MODIFIER) |
- key_bit(keymap, XK_Alt_L, L_ALT_MODIFIER) |
- key_bit(keymap, XK_Alt_R, R_ALT_MODIFIER);
- XUnlockDisplay(x_display);
-
- return mods;
-}
-
-void Platform::reset_cursor_pos()
-{
- if (!primary_monitor) {
- return;
- }
- SpicePoint pos = primary_monitor->get_position();
- SpicePoint size = primary_monitor->get_size();
- Window root_window = RootWindow(x_display, DefaultScreen(x_display));
- XWarpPointer(x_display, None, root_window, 0, 0, 0, 0, pos.x + size.x / 2, pos.y + size.y / 2);
- XFlush(x_display);
-}
-
-WaveRecordAbstract* Platform::create_recorder(RecordClient& client,
- uint32_t samples_per_sec,
- uint32_t bits_per_sample,
- uint32_t channels,
- uint32_t frame_size)
-{
- return new WaveRecorder(client, samples_per_sec, bits_per_sample, channels, frame_size);
-}
-
-WavePlaybackAbstract* Platform::create_player(uint32_t samples_per_sec,
- uint32_t bits_per_sample,
- uint32_t channels,
- uint32_t frame_size)
-{
- return new WavePlayer(samples_per_sec, bits_per_sample, channels, frame_size);
-}
-
-void XPlatform::on_focus_in()
-{
- if (focus_count++ == 0) {
- event_listener->on_app_activated();
- }
-}
-
-void XPlatform::on_focus_out()
-{
- ASSERT(focus_count > 0);
- if (--focus_count == 0) {
- event_listener->on_app_deactivated();
- }
-}
-
-class XBaseLocalCursor: public LocalCursor {
-public:
- XBaseLocalCursor() : _handle (0) {}
- ~XBaseLocalCursor();
- void set(Window window);
-
-protected:
- Cursor _handle;
-};
-
-void XBaseLocalCursor::set(Window window)
-{
- if (_handle) {
- XDefineCursor(x_display, window, _handle);
- XFlush(x_display);
- }
-}
-
-XBaseLocalCursor::~XBaseLocalCursor()
-{
- if (_handle) {
- XFreeCursor(x_display, _handle);
- }
-}
-
-class XLocalCursor: public XBaseLocalCursor {
-public:
- XLocalCursor(CursorData* cursor_data);
-};
-
-static inline uint8_t get_pix_mask(const uint8_t* data, int offset, int pix_index)
-{
- return data[offset + (pix_index >> 3)] & (0x80 >> (pix_index % 8));
-}
-
-static inline uint32_t get_pix_hack(int pix_index, int width)
-{
- return (((pix_index % width) ^ (pix_index / width)) & 1) ? 0xc0303030 : 0x30505050;
-}
-
-XLocalCursor::XLocalCursor(CursorData* cursor_data)
-{
- const SpiceCursorHeader& header = cursor_data->header();
- const uint8_t* data = cursor_data->data();
- int cur_size = header.width * header.height;
- uint8_t pix_mask;
- uint32_t pix;
- uint16_t i;
- int size;
-
- if (!get_size_bits(header, size)) {
- THROW("invalid cursor type");
- }
-
- uint32_t* cur_data = new uint32_t[cur_size];
-
- switch (header.type) {
- case SPICE_CURSOR_TYPE_ALPHA:
- break;
- case SPICE_CURSOR_TYPE_COLOR32:
- memcpy(cur_data, data, cur_size * sizeof(uint32_t));
- for (i = 0; i < cur_size; i++) {
- pix_mask = get_pix_mask(data, size, i);
- if (pix_mask && *((uint32_t*)data + i) == 0xffffff) {
- cur_data[i] = get_pix_hack(i, header.width);
- } else {
- cur_data[i] |= (pix_mask ? 0 : 0xff000000);
- }
- }
- break;
- case SPICE_CURSOR_TYPE_COLOR16:
- for (i = 0; i < cur_size; i++) {
- pix_mask = get_pix_mask(data, size, i);
- pix = *((uint16_t*)data + i);
- if (pix_mask && pix == 0x7fff) {
- cur_data[i] = get_pix_hack(i, header.width);
- } else {
- cur_data[i] = ((pix & 0x1f) << 3) | ((pix & 0x3e0) << 6) | ((pix & 0x7c00) << 9) |
- (pix_mask ? 0 : 0xff000000);
- }
- }
- break;
- case SPICE_CURSOR_TYPE_MONO:
- for (i = 0; i < cur_size; i++) {
- pix_mask = get_pix_mask(data, 0, i);
- pix = get_pix_mask(data, size, i);
- if (pix_mask && pix) {
- cur_data[i] = get_pix_hack(i, header.width);
- } else {
- cur_data[i] = (pix ? 0xffffff : 0) | (pix_mask ? 0 : 0xff000000);
- }
- }
- break;
- case SPICE_CURSOR_TYPE_COLOR4:
- for (i = 0; i < cur_size; i++) {
- pix_mask = get_pix_mask(data, size + (sizeof(uint32_t) << 4), i);
- int idx = (i & 1) ? (data[i >> 1] & 0x0f) : ((data[i >> 1] & 0xf0) >> 4);
- pix = *((uint32_t*)(data + size) + idx);
- if (pix_mask && pix == 0xffffff) {
- cur_data[i] = get_pix_hack(i, header.width);
- } else {
- cur_data[i] = pix | (pix_mask ? 0 : 0xff000000);
- }
- }
- break;
- case SPICE_CURSOR_TYPE_COLOR24:
- case SPICE_CURSOR_TYPE_COLOR8:
- default:
- LOG_WARN("unsupported cursor type %d", header.type);
- XLockDisplay(x_display);
- _handle = XCreateFontCursor(x_display, XC_arrow);
- XUnlockDisplay(x_display);
- delete[] cur_data;
- return;
- }
-
- XImage image;
- memset(&image, 0, sizeof(image));
- image.width = header.width;
- image.height = header.height;
- image.data = (header.type == SPICE_CURSOR_TYPE_ALPHA ? (char*)data : (char*)cur_data);
- image.byte_order = LSBFirst;
- image.bitmap_unit = 32;
- image.bitmap_bit_order = LSBFirst;
- image.bitmap_pad = 8;
- image.bytes_per_line = header.width << 2;
- image.depth = 32;
- image.format = ZPixmap;
- image.bits_per_pixel = 32;
- image.red_mask = 0x00ff0000;
- image.green_mask = 0x0000ff00;
- image.blue_mask = 0x000000ff;
- if (!XInitImage(&image)) {
- THROW("init image failed");
- }
-
- Window root_window = RootWindow(x_display, DefaultScreen(x_display));
- XGCValues gc_vals;
- gc_vals.function = GXcopy;
- gc_vals.foreground = ~0;
- gc_vals.background = 0;
- gc_vals.plane_mask = AllPlanes;
-
- XLockDisplay(x_display);
- Pixmap pixmap = XCreatePixmap(x_display, root_window, header.width, header.height, 32);
- GC gc = XCreateGC(x_display, pixmap, GCFunction | GCForeground | GCBackground | GCPlaneMask,
- &gc_vals);
-
- XPutImage(x_display, pixmap, gc, &image, 0, 0, 0, 0, header.width, header.height);
- XFreeGC(x_display, gc);
-
- XRenderPictFormat *xformat = XRenderFindStandardFormat(x_display, PictStandardARGB32);
- Picture picture = XRenderCreatePicture(x_display, pixmap, xformat, 0, NULL);
- _handle = XRenderCreateCursor(x_display, picture, header.hot_spot_x, header.hot_spot_y);
- XUnlockDisplay(x_display);
-
- XRenderFreePicture(x_display, picture);
- XFreePixmap(x_display, pixmap);
- delete[] cur_data;
-}
-
-LocalCursor* Platform::create_local_cursor(CursorData* cursor_data)
-{
- ASSERT(using_xrender_0_5);
- return new XLocalCursor(cursor_data);
-}
-
-class XInactiveCursor: public XBaseLocalCursor {
-public:
- XInactiveCursor() { _handle = XCreateFontCursor(x_display, XC_X_cursor);}
-};
-
-LocalCursor* Platform::create_inactive_cursor()
-{
- return new XInactiveCursor();
-}
-
-class XDefaultCursor: public XBaseLocalCursor {
-public:
- XDefaultCursor()
- {
- XLockDisplay(x_display);
- _handle = XCreateFontCursor(x_display, XC_top_left_arrow);
- XUnlockDisplay(x_display);
- }
-};
-
-LocalCursor* Platform::create_default_cursor()
-{
- return new XDefaultCursor();
-}
-
-bool Platform::on_clipboard_grab(uint32_t *types, uint32_t type_count)
-{
- Lock lock(clipboard_lock);
-
- if (type_count > sizeof(clipboard_agent_types)/sizeof(uint32_t)) {
- LOG_WARN("on_clipboard_grab: too many types");
- type_count = sizeof(clipboard_agent_types)/sizeof(uint32_t);
- }
-
- memcpy(clipboard_agent_types, types, type_count * sizeof(uint32_t));
- clipboard_type_count = type_count;
-
- XSetSelectionOwner(x_display, clipboard_prop, platform_win, CurrentTime);
- XFlush(x_display);
-
- set_clipboard_owner_unlocked(owner_guest);
- return true;
-}
-
-int Platform::_clipboard_owner = Platform::owner_none;
-
-void Platform::set_clipboard_owner(int new_owner)
-{
- Lock lock(clipboard_lock);
- set_clipboard_owner_unlocked(new_owner);
-}
-
-void Platform::set_clipboard_owner_unlocked(int new_owner)
-{
- const char * const owner_str[] = { "none", "guest", "client" };
-
- /* Clear pending requests and clipboard data */
- {
- if (next_selection_request) {
- LOG_INFO("selection requests pending upon clipboard owner change, clearing");
- while (next_selection_request)
- send_selection_notify(None, 0);
- }
-
- clipboard_data_size = 0;
- clipboard_request_target = None;
- waiting_for_property_notify = false;
-
- /* Clear cached clipboard type info when there is no new owner
- (otherwise the new owner will already have set new type info) */
- if (new_owner == owner_none)
- clipboard_type_count = 0;
- }
- if (new_owner == owner_none)
- clipboard_listener->on_clipboard_release();
-
- _clipboard_owner = new_owner;
- LOG_INFO("new clipboard owner: %s", owner_str[new_owner]);
-}
-
-void Platform::set_clipboard_listener(ClipboardListener* listener)
-{
- clipboard_listener = listener ? listener : &default_clipboard_listener;
-}
-
-bool Platform::on_clipboard_notify(uint32_t type, const uint8_t* data, int32_t size)
-{
- Lock lock(clipboard_lock);
- Atom prop;
- XEvent *event;
- uint32_t type_from_event;
-
- if (!next_selection_request) {
- LOG_INFO("received clipboard data without an outstanding"
- "selection request, ignoring");
- return true;
- }
-
- if (type == VD_AGENT_CLIPBOARD_NONE) {
- send_selection_notify(None, 1);
- return true;
- }
-
- event = &next_selection_request->event;
- type_from_event = get_clipboard_type(event->xselectionrequest.target);
- if (type_from_event != type) {
- LOG_WARN("expecting type %u clipboard data got %u",
- type_from_event, type);
- send_selection_notify(None, 1);
- return false;
- }
-
- prop = event->xselectionrequest.property;
- if (prop == None)
- prop = event->xselectionrequest.target;
- /* FIXME: use INCR for large data transfers */
- XChangeProperty(x_display, event->xselectionrequest.requestor, prop,
- event->xselectionrequest.target, 8, PropModeReplace,
- data, size);
- send_selection_notify(prop, 1);
- return true;
-}
-
-bool Platform::on_clipboard_request(uint32_t type)
-{
- Window owner;
- Lock lock(clipboard_lock);
- Atom target = get_clipboard_target(type);
-
- if (target == None)
- return false;
-
- XLockDisplay(x_display);
- owner = XGetSelectionOwner(x_display, clipboard_prop);
- XUnlockDisplay(x_display);
- if (owner == None) {
- LOG_INFO("No owner for the selection");
- return false;
- }
-
- if (clipboard_request_target) {
- LOG_INFO("XConvertSelection request is already pending");
- return false;
- }
- clipboard_request_target = target;
- XConvertSelection(x_display, clipboard_prop, target, clipboard_prop, platform_win, CurrentTime);
- XFlush(x_display);
- return true;
-}
-
-void Platform::on_clipboard_release()
-{
- XEvent event;
- Window owner;
-
- XLockDisplay(x_display);
- owner = XGetSelectionOwner(x_display, clipboard_prop);
- XUnlockDisplay(x_display);
- if (owner != platform_win) {
- LOG_INFO("Platform::on_clipboard_release() called while not selection owner");
- return;
- }
- /* Note there is a small race window here where another x11 app could
- acquire selection ownership and we kick it off again, nothing we
- can do about that :( */
- XSetSelectionOwner(x_display, clipboard_prop, None, CurrentTime);
-
- /* Make sure we process the XFixesSetSelectionOwnerNotify event caused
- by this, so we don't end up changing the clipboard owner to none, after
- it has already been re-owned because this event is still pending. */
- XLockDisplay(x_display);
- XSync(x_display, False);
- while (XCheckTypedEvent(x_display,
- XFixesSelectionNotify + xfixes_event_base,
- &event)) {
- XUnlockDisplay(x_display);
- root_win_proc(event);
- XLockDisplay(x_display);
- }
- XUnlockDisplay(x_display);
-
- /* Note no need to do a set_clipboard_owner(owner_none) here, as that is
- already done by processing the XFixesSetSelectionOwnerNotify event. */
-}
diff --git a/client/x11/platform_utils.cpp b/client/x11/platform_utils.cpp
deleted file mode 100644
index 6ae30a46..00000000
--- a/client/x11/platform_utils.cpp
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdarg.h>
-#include "utils.h"
-
-void string_vprintf(std::string& str, const char* format, va_list ap)
-{
- va_list ap_test;
- va_copy(ap_test, ap);
- int len = vsnprintf(NULL, 0, format, ap_test) + 1;
- va_end(ap_test);
- AutoArray<char> buf(new char[len]);
- vsnprintf(buf.get(), len, format, ap);
- str = buf.get();
-}
diff --git a/client/x11/platform_utils.h b/client/x11/platform_utils.h
deleted file mode 100644
index 03a24892..00000000
--- a/client/x11/platform_utils.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_PLATFORM_UTILS
-#define _H_PLATFORM_UTILS
-
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <netinet/tcp.h>
-#include <netdb.h>
-
-typedef int SOCKET;
-
-#define INVALID_SOCKET -1
-#define SOCKET_ERROR -1
-#define closesocket(sock) ::close(sock)
-#define SHUTDOWN_ERR EPIPE
-#define INTERRUPTED_ERR EINTR
-#define WOULDBLOCK_ERR EAGAIN
-#define sock_error() errno
-#define sock_err_message(err) strerror(err)
-
-#endif
diff --git a/client/x11/playback.cpp b/client/x11/playback.cpp
deleted file mode 100644
index 83946aac..00000000
--- a/client/x11/playback.cpp
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "playback.h"
-#include "utils.h"
-#include "debug.h"
-
-#define REING_SIZE_MS 300
-
-WavePlayer::WavePlayer(uint32_t samples_per_sec, uint32_t bits_per_sample, uint32_t channels, uint32_t frame_size)
- : _pcm (NULL)
- , _hw_params (NULL)
- , _sw_params (NULL)
-{
- if (!init(samples_per_sec, bits_per_sample, channels, frame_size)) {
- cleanup();
- THROW("failed");
- }
-}
-
-void WavePlayer::cleanup()
-{
- if (_pcm) {
- snd_pcm_close(_pcm);
- }
-
- if (_hw_params) {
- snd_pcm_hw_params_free(_hw_params);
- }
-
- if (_sw_params) {
- snd_pcm_sw_params_free(_sw_params);
- }
-}
-
-WavePlayer::~WavePlayer()
-{
- cleanup();
-}
-
-bool WavePlayer::init(uint32_t samples_per_sec,
- uint32_t bits_per_sample,
- uint32_t channels,
- uint32_t frame_size)
-{
- const char* pcm_device = "default";
- snd_pcm_format_t format;
- int err;
-
- switch (bits_per_sample) {
- case 8:
- format = SND_PCM_FORMAT_S8;
- break;
- case 16:
- format = SND_PCM_FORMAT_S16_LE;
- break;
- default:
- return false;
- }
- _samples_per_ms = samples_per_sec / 1000;
- _frame_size = frame_size;
-
- if ((err = snd_pcm_open(&_pcm, pcm_device, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK)) < 0) {
- LOG_ERROR("cannot open audio playback device %s %s", pcm_device, snd_strerror(err));
- return false;
- }
-
- if ((err = snd_pcm_hw_params_malloc(&_hw_params)) < 0) {
- LOG_ERROR("cannot allocate hardware parameter structure %s", snd_strerror(err));
- return false;
- }
-
- if ((err = snd_pcm_sw_params_malloc(&_sw_params)) < 0) {
- LOG_ERROR("cannot allocate software parameter structure %s", snd_strerror(err));
- return false;
- }
-
- if ((err = snd_pcm_hw_params_any(_pcm, _hw_params)) < 0) {
- LOG_ERROR("cannot initialize hardware parameter structure %s", snd_strerror(err));
- return false;
- }
-
- if ((err = snd_pcm_hw_params_set_rate_resample(_pcm, _hw_params, 1)) < 0) {
- LOG_ERROR("cannot set rate resample %s", snd_strerror(err));
- return false;
- }
-
- if ((err = snd_pcm_hw_params_set_access(_pcm, _hw_params,
- SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) {
- LOG_ERROR("cannot set access type %s", snd_strerror(err));
- return false;
- }
-
- if ((err = snd_pcm_hw_params_set_rate(_pcm, _hw_params, samples_per_sec, 0)) < 0) {
- LOG_ERROR("cannot set sample rate %s", snd_strerror(err));
- return false;
- }
-
- if ((err = snd_pcm_hw_params_set_channels(_pcm, _hw_params, channels)) < 0) {
- LOG_ERROR("cannot set channel count %s", snd_strerror(err));
- return false;
- }
-
- if ((err = snd_pcm_hw_params_set_format(_pcm, _hw_params, format)) < 0) {
- LOG_ERROR("cannot set sample format %s", snd_strerror(err));
- return false;
- }
-
- snd_pcm_uframes_t buffer_size;
- buffer_size = (samples_per_sec * REING_SIZE_MS / 1000) / frame_size * frame_size;
-
- if ((err = snd_pcm_hw_params_set_buffer_size_near(_pcm, _hw_params, &buffer_size)) < 0) {
- LOG_ERROR("cannot set buffer size %s", snd_strerror(err));
- return false;
- }
-
- int direction = 1;
- snd_pcm_uframes_t period_size = (samples_per_sec * 20 / 1000) / frame_size * frame_size;
- if ((err = snd_pcm_hw_params_set_period_size_near(_pcm, _hw_params, &period_size,
- &direction)) < 0) {
- LOG_ERROR("cannot set period size %s", snd_strerror(err));
- return false;
- }
-
- if ((err = snd_pcm_hw_params(_pcm, _hw_params)) < 0) {
- LOG_ERROR("cannot set parameters %s", snd_strerror(err));
- return false;
- }
-
- if ((err = snd_pcm_sw_params_current(_pcm, _sw_params)) < 0) {
- LOG_ERROR("cannot obtain sw parameters %s", snd_strerror(err));
- return false;
- }
-
- err = snd_pcm_hw_params_get_buffer_size(_hw_params, &buffer_size);
- if (err < 0) {
- LOG_ERROR("unable to get buffer size for playback: %s", snd_strerror(err));
- return false;
- }
-
- direction = 0;
- err = snd_pcm_hw_params_get_period_size(_hw_params, &period_size, &direction);
- if (err < 0) {
- LOG_ERROR("unable to get period size for playback: %s", snd_strerror(err));
- return false;
- }
-
- err = snd_pcm_sw_params_set_start_threshold(_pcm, _sw_params,
- (buffer_size / period_size) * period_size);
- if (err < 0) {
- LOG_ERROR("unable to set start threshold mode for playback: %s", snd_strerror(err));
- return false;
- }
-
- if ((err = snd_pcm_sw_params(_pcm, _sw_params)) < 0) {
- LOG_ERROR("cannot set software parameters %s", snd_strerror(err));
- return false;
- }
-
- if ((err = snd_pcm_prepare(_pcm)) < 0) {
- LOG_ERROR("cannot prepare pcm device %s", snd_strerror(err));
- return false;
- }
-
- return true;
-}
-
-bool WavePlayer::write(uint8_t* frame)
-{
- snd_pcm_sframes_t ret = snd_pcm_writei(_pcm, frame, _frame_size);
- if (ret < 0) {
- if (ret == -EAGAIN) {
- return false;
- }
- DBG(0, "err %s", snd_strerror(-ret));
- if (snd_pcm_recover(_pcm, ret, 1) == 0) {
- snd_pcm_writei(_pcm, frame, _frame_size);
- }
- }
- return true;
-}
-
-void WavePlayer::stop()
-{
- snd_pcm_drain(_pcm);
- snd_pcm_prepare(_pcm);
-}
-
-bool WavePlayer::abort()
-{
- return true;
-}
-
-uint32_t WavePlayer::get_delay_ms()
-{
- ASSERT(_pcm);
-
- snd_pcm_sframes_t delay;
-
- if (snd_pcm_delay(_pcm, &delay) < 0) {
- return 0;
- }
- return delay / _samples_per_ms;
-}
diff --git a/client/x11/playback.h b/client/x11/playback.h
deleted file mode 100644
index c0b8c52e..00000000
--- a/client/x11/playback.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_LINUX_PLAYBACK
-#define _H_LINUX_PLAYBACK
-
-#include <alsa/asoundlib.h>
-
-#include "common.h"
-#include "audio_devices.h"
-
-class WavePlayer: public WavePlaybackAbstract {
-public:
- WavePlayer(uint32_t samples_per_sec, uint32_t bits_per_sample, uint32_t channels, uint32_t frame_size);
- virtual ~WavePlayer();
-
- virtual bool write(uint8_t* frame);
- virtual bool abort();
- virtual void stop();
- virtual uint32_t get_delay_ms();
-
-private:
- bool init(uint32_t samples_per_sec, uint32_t bits_per_sample, uint32_t channel, uint32_t frame_size);
- void cleanup();
-
-private:
- snd_pcm_t* _pcm;
- snd_pcm_hw_params_t* _hw_params;
- snd_pcm_sw_params_t* _sw_params;
- uint32_t _samples_per_ms;
- uint32_t _frame_size;
-};
-
-#endif
diff --git a/client/x11/record.cpp b/client/x11/record.cpp
deleted file mode 100644
index 6bc9f604..00000000
--- a/client/x11/record.cpp
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "record.h"
-#include "utils.h"
-#include "debug.h"
-
-
-class WaveRecorder::EventTrigger: public EventSources::File {
-public:
- EventTrigger(WaveRecorder& recorder, int fd);
- virtual void on_event();
- virtual int get_fd() { return _fd;}
-
-private:
- WaveRecorder& _recorder;
- int _fd;
-};
-
-WaveRecorder::EventTrigger::EventTrigger(WaveRecorder& recorder, int fd)
- : _recorder (recorder)
- , _fd (fd)
-{
-}
-
-void WaveRecorder::EventTrigger::on_event()
-{
- _recorder.on_event();
-}
-
-WaveRecorder::WaveRecorder(Platform::RecordClient& client,
- uint32_t samples_per_sec,
- uint32_t bits_per_sample,
- uint32_t channels,
- uint32_t frame_size)
- : _client (client)
- , _pcm (NULL)
- , _hw_params (NULL)
- , _sw_params (NULL)
- , _sample_bytes (bits_per_sample * channels / 8)
- , _frame (new uint8_t[_sample_bytes * frame_size])
- , _frame_pos (_frame)
- , _frame_end (_frame + _sample_bytes * frame_size)
- , _event_trigger (NULL)
-{
- if (!init(samples_per_sec, bits_per_sample, channels, frame_size)) {
- cleanup();
- THROW("failed");
- }
-}
-
-WaveRecorder::~WaveRecorder()
-{
- cleanup();
- delete[] _frame;
-}
-
-void WaveRecorder::cleanup()
-{
- if (_event_trigger) {
- _client.remove_event_source(*_event_trigger);
- delete _event_trigger;
- }
-
- if (_sw_params) {
- snd_pcm_sw_params_free(_sw_params);
- }
-
- if (_hw_params) {
- snd_pcm_hw_params_free(_hw_params);
- }
-
- if (_pcm) {
- snd_pcm_close(_pcm);
- }
-}
-
-bool WaveRecorder::init(uint32_t samples_per_sec,
- uint32_t bits_per_sample,
- uint32_t channels,
- uint32_t frame_size)
-{
- const char* pcm_device = "default";
- snd_pcm_format_t format;
- int err;
-
- _frame_size = frame_size;
-
- switch (bits_per_sample) {
- case 8:
- format = SND_PCM_FORMAT_S8;
- break;
- case 16:
- format = SND_PCM_FORMAT_S16_LE;
- break;
- default:
- return false;
- }
-
- if ((err = snd_pcm_open(&_pcm, pcm_device, SND_PCM_STREAM_CAPTURE, SND_PCM_NONBLOCK)) < 0) {
- LOG_ERROR("cannot open audio record device %s %s", pcm_device, snd_strerror(err));
- return false;
- }
-
- if ((err = snd_pcm_hw_params_malloc(&_hw_params)) < 0) {
- LOG_ERROR("cannot allocate hardware parameter structure %s", snd_strerror(err));
- return false;
- }
-
- if ((err = snd_pcm_sw_params_malloc(&_sw_params)) < 0) {
- LOG_ERROR("cannot allocate software parameter structure %s", snd_strerror(err));
- return false;
- }
-
- if ((err = snd_pcm_hw_params_any(_pcm, _hw_params)) < 0) {
- LOG_ERROR("cannot initialize hardware parameter structure %s", snd_strerror(err));
- return false;
- }
-
- if ((err = snd_pcm_hw_params_set_rate_resample(_pcm, _hw_params, 1)) < 0) {
- LOG_ERROR("cannot set rate resample %s", snd_strerror(err));
- return false;
- }
-
- if ((err = snd_pcm_hw_params_set_access(_pcm, _hw_params, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) {
- LOG_ERROR("cannot set access type %s", snd_strerror(err));
- return false;
- }
-
- if ((err = snd_pcm_hw_params_set_rate(_pcm, _hw_params, samples_per_sec, 0)) < 0) {
- LOG_ERROR("cannot set sample rate %s", snd_strerror(err));
- return false;
- }
-
- if ((err = snd_pcm_hw_params_set_channels(_pcm, _hw_params, channels)) < 0) {
- LOG_ERROR("cannot set channel count %s", snd_strerror(err));
- return false;
- }
-
- if ((err = snd_pcm_hw_params_set_format(_pcm, _hw_params, format)) < 0) {
- LOG_ERROR("cannot set sample format %s", snd_strerror(err));
- return false;
- }
-
- int direction = 0;
- snd_pcm_uframes_t buffer_size = (samples_per_sec * 160 / 1000) / frame_size * frame_size;
-
- if ((err = snd_pcm_hw_params_set_buffer_size_near(_pcm, _hw_params, &buffer_size)) < 0) {
- LOG_ERROR("cannot set buffer size %s", snd_strerror(err));
- return false;
- }
-
- snd_pcm_uframes_t period_size = frame_size;
- if ((err = snd_pcm_hw_params_set_period_size_near(_pcm, _hw_params, &period_size,
- &direction)) < 0) {
- LOG_ERROR("cannot set period size near %s", snd_strerror(err));
- return false;
- }
-
- if ((err = snd_pcm_hw_params(_pcm, _hw_params)) < 0) {
- LOG_ERROR("cannot set parameters %s", snd_strerror(err));
- return false;
- }
-
- if ((err = snd_pcm_sw_params_current(_pcm, _sw_params)) < 0) {
- LOG_ERROR("cannot get current sw parameters %s", snd_strerror(err));
- return false;
- }
-
- if ((err = snd_pcm_sw_params_set_start_threshold(_pcm, _sw_params, frame_size)) < 0) {
- LOG_ERROR("cannot set start threshold %s", snd_strerror(err));
- return false;
- }
-
- if ((err = snd_pcm_sw_params(_pcm, _sw_params)) < 0) {
- LOG_ERROR("cannot set sw parameters %s", snd_strerror(err));
- return false;
- }
-
- struct pollfd pfd;
- if ((err = snd_pcm_poll_descriptors(_pcm, &pfd, 1)) < 0) {
- LOG_ERROR("cannot get poll ID %s", snd_strerror(err));
- return false;
- }
- _event_trigger = new WaveRecorder::EventTrigger(*this, pfd.fd);
- _client.add_event_source(*_event_trigger);
- return true;
-}
-
-void WaveRecorder::start()
-{
- _frame_pos = _frame;
- snd_pcm_prepare(_pcm);
- snd_pcm_start(_pcm);
- snd_pcm_nonblock(_pcm, 1);
-}
-
-void WaveRecorder::stop()
-{
- snd_pcm_drop(_pcm);
- snd_pcm_prepare(_pcm);
-}
-
-bool WaveRecorder::abort()
-{
- return true;
-}
-
-void WaveRecorder::on_event()
-{
- for (;;) {
- snd_pcm_sframes_t size = (_frame_end - _frame_pos) / _sample_bytes;
- size = snd_pcm_readi(_pcm, _frame_pos, size);
- if (size < 0) {
- if (snd_pcm_recover(_pcm, size, 1) == 0) {
- continue;
- }
- return;
- }
- _frame_pos += size * _sample_bytes;
- if (_frame_pos == _frame_end) {
- _client.push_frame(_frame);
- _frame_pos = _frame;
- }
- }
-}
diff --git a/client/x11/record.h b/client/x11/record.h
deleted file mode 100644
index fc46948b..00000000
--- a/client/x11/record.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_LINUX_RECORD
-#define _H_LINUX_RECORD
-
-#include <alsa/asoundlib.h>
-
-#include "common.h"
-#include "audio_devices.h"
-#include "platform.h"
-
-class WaveRecorder: public WaveRecordAbstract {
-public:
- WaveRecorder(Platform::RecordClient& client,
- uint32_t samples_per_sec,
- uint32_t bits_per_sample,
- uint32_t channels,
- uint32_t frame_size);
- virtual ~WaveRecorder();
-
- virtual void start();
- virtual void stop();
- virtual bool abort();
-
-private:
- bool init(uint32_t samples_per_sec,
- uint32_t bits_per_sample,
- uint32_t channels,
- uint32_t frame_size);
- void cleanup();
- void on_event();
-
-private:
- Platform::RecordClient& _client;
- snd_pcm_t* _pcm;
- snd_pcm_hw_params_t* _hw_params;
- snd_pcm_sw_params_t* _sw_params;
- uint32_t _sample_bytes;
- uint32_t _frame_size;
- uint8_t* _frame;
- uint8_t* _frame_pos;
- uint8_t* _frame_end;
- class EventTrigger;
- EventTrigger* _event_trigger;
-};
-
-#endif
diff --git a/client/x11/red_drawable.cpp b/client/x11/red_drawable.cpp
deleted file mode 100644
index 19532c74..00000000
--- a/client/x11/red_drawable.cpp
+++ /dev/null
@@ -1,796 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-#include "red_drawable.h"
-#include "pixels_source_p.h"
-#include "debug.h"
-#include "x_platform.h"
-#include "utils.h"
-
-#ifdef USE_OPENGL
-#include "common/gl_utils.h"
-#include <GL/gl.h>
-#include <GL/glu.h>
-#include <GL/glext.h>
-
-static inline void copy_to_gldrawable_from_gltexture(const RedDrawable_p* dest,
- const SpiceRect& area,
- const SpicePoint& offset,
- const PixelsSource_p* source,
- int src_x, int src_y)
-{
- float text_x1, text_x2;
- float text_y1, text_y2;
- int vertex_x1, vertex_x2;
- int vertex_y1, vertex_y2;
- GLXPbuffer pbuffer;
- GLXContext context;
- RenderType rendertype;
- Window win;
-
- text_x1 = (float)src_x / source->gl.width_powed;
- text_x2 = text_x1 + (float)(area.right - area.left) / source->gl.width_powed;
-
- text_y1 = ((float)source->gl.height - (area.bottom - area.top) - src_y) /
- source->gl.height_powed;
- text_y2 = text_y1 + (float)(area.bottom - area.top) / source->gl.height_powed;
-
- vertex_x1 = area.left + offset.x;
- vertex_y1 = dest->source.x_drawable.height - (area.top + offset.y) - (area.bottom - area.top);
- vertex_x2 = vertex_x1 + (area.right - area.left);
- vertex_y2 = vertex_y1 + (area.bottom - area.top);
-
- glEnable(GL_TEXTURE_2D);
-
- rendertype = source->gl.rendertype;
- if (rendertype == RENDER_TYPE_FBO) {
- glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
- } else {
- win = source->gl.win;
- context = source->gl.context;
- glXMakeCurrent(XPlatform::get_display(), win, context);
- }
-
- glBindTexture(GL_TEXTURE_2D, source->gl.tex);
-
- glBegin(GL_QUADS);
- glTexCoord2f(text_x1, text_y1);
- glVertex2i(vertex_x1, vertex_y1);
- glTexCoord2f(text_x1, text_y2);
- glVertex2i(vertex_x1, vertex_y2);
- glTexCoord2f(text_x2, text_y2);
- glVertex2i(vertex_x2, vertex_y2);
- glTexCoord2f(text_x2, text_y1);
- glVertex2i(vertex_x2, vertex_y1);
- glEnd();
-
- if (rendertype == RENDER_TYPE_FBO) {
- GLuint fbo;
-
- glFlush();
- fbo = source->gl.fbo;
- glBindFramebuffer(GL_FRAMEBUFFER_EXT, fbo);
- } else {
- pbuffer = source->gl.pbuff;
- glXMakeCurrent(XPlatform::get_display(), pbuffer, context);
- }
-}
-
-static inline void copy_to_gldrawable_from_pixmap(const RedDrawable_p* dest,
- const SpiceRect& area,
- const SpicePoint& offset,
- const PixelsSource_p* source,
- int src_x, int src_y)
-{
- uint8_t *addr;
- GLXContext context = NULL;
- GLXPbuffer pbuffer;
- RenderType rendertype;
- Window win;
-
- rendertype = dest->source.x_drawable.rendertype;
- if (rendertype == RENDER_TYPE_FBO) {
- glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
- glBindTexture(GL_TEXTURE_2D, 0);
- } else {
- context = dest->source.x_drawable.context;
- win = dest->source.x_drawable.drawable;
- glXMakeCurrent(XPlatform::get_display(), win, context);
- glDisable(GL_TEXTURE_2D);
- }
-
- glPixelStorei(GL_UNPACK_ROW_LENGTH, pixman_image_get_stride(source->pixmap.pixman_image) / 4);
-
- glPixelZoom(1, -1);
- addr = (uint8_t *)pixman_image_get_data(source->pixmap.pixman_image);
- addr += (src_x * 4 + src_y * pixman_image_get_stride(source->pixmap.pixman_image));
- glWindowPos2i(area.left + offset.x, dest->source.x_drawable.height -
- (area.top + offset.y)); //+ (area.bottom - area.top)));
- glDrawPixels(area.right - area.left, area.bottom - area.top,
- GL_BGRA, GL_UNSIGNED_BYTE, addr);
-
- if (rendertype == RENDER_TYPE_FBO) {
- GLuint fbo;
-
- fbo = dest->source.x_drawable.fbo;
- glBindFramebuffer(GL_FRAMEBUFFER_EXT, fbo);
- } else {
- pbuffer = dest->source.x_drawable.pbuff;
- glXMakeCurrent(XPlatform::get_display(), pbuffer, context);
- }
-}
-#endif // USE_OPENGL
-
-static inline void copy_to_drawable_from_drawable(const RedDrawable_p* dest,
- const SpiceRect& area,
- const SpicePoint& offset,
- const PixelsSource_p* source,
- int src_x, int src_y)
-{
- XGCValues gc_vals;
- gc_vals.function = GXcopy;
-
- XChangeGC(XPlatform::get_display(), dest->source.x_drawable.gc, GCFunction, &gc_vals);
- XCopyArea(XPlatform::get_display(), source->x_drawable.drawable,
- dest->source.x_drawable.drawable, dest->source.x_drawable.gc,
- src_x, src_y,
- area.right - area.left, area.bottom - area.top,
- area.left + offset.x, area.top + offset.y);
-}
-
-static XImage *create_temp_image(int screen, int width, int height,
- pixman_image_t **pixman_image_out,
- XShmSegmentInfo **shminfo_out)
-{
- XImage *image;
- XShmSegmentInfo *shminfo;
- RedDrawable::Format format;
- pixman_image_t *pixman_image;
- XVisualInfo *vinfo;
-
- image = NULL;
- shminfo = NULL;
-
- vinfo = XPlatform::get_vinfo()[screen];
- format = XPlatform::get_screen_format(screen);
-
- image = XPlatform::create_x_image(format, width, height, vinfo->depth,
- vinfo->visual, &shminfo);
-
- pixman_image = pixman_image_create_bits(RedDrawable::format_to_pixman(format),
- width, height,
- (uint32_t *)image->data, image->bytes_per_line);
- if (pixman_image == NULL) {
- THROW("surf create failed");
- }
- *pixman_image_out = pixman_image;
- *shminfo_out = shminfo;
- return image;
-}
-
-static void free_temp_image(XImage *image, XShmSegmentInfo *shminfo, pixman_image_t *pixman_image)
-{
- XPlatform::free_x_image(image, shminfo);
- pixman_image_unref(pixman_image);
-}
-
-
-static inline void copy_to_drawable_from_pixmap(const RedDrawable_p* dest,
- const SpiceRect& area,
- const SpicePoint& offset,
- const PixelsSource_p* source,
- int src_x, int src_y)
-{
- pixman_image_t *src_surface = source->pixmap.pixman_image;
- XGCValues gc_vals;
- gc_vals.function = GXcopy;
- RedDrawable::Format screen_format;
- XImage *image;
- XShmSegmentInfo *shminfo;
- pixman_image_t *pixman_image;
- int screen;
-
- screen = dest->source.x_drawable.screen;
- screen_format = XPlatform::get_screen_format(screen);
-
- XChangeGC(XPlatform::get_display(), dest->source.x_drawable.gc, GCFunction, &gc_vals);
-
- if (source->pixmap.x_image != NULL &&
- RedDrawable::format_copy_compatible(source->pixmap.format, screen_format)) {
- if (source->pixmap.shminfo) {
- XShmPutImage(XPlatform::get_display(), dest->source.x_drawable.drawable,
- dest->source.x_drawable.gc, source->pixmap.x_image,
- src_x, src_y, area.left + offset.x, area.top + offset.y,
- area.right - area.left, area.bottom - area.top, false);
- } else {
- XPutImage(XPlatform::get_display(), dest->source.x_drawable.drawable,
- dest->source.x_drawable.gc, source->pixmap.x_image, src_x,
- src_y, area.left + offset.x, area.top + offset.y,
- area.right - area.left, area.bottom - area.top);
- }
- } else {
- image = create_temp_image(screen,
- area.right - area.left, area.bottom - area.top,
- &pixman_image, &shminfo);
-
- pixman_image_composite32(PIXMAN_OP_SRC,
- src_surface, NULL, pixman_image,
- src_x + offset.x,
- src_y + offset.y,
- 0, 0,
- 0, 0,
- area.right - area.left,
- area.bottom - area.top);
-
- if (shminfo) {
- XShmPutImage(XPlatform::get_display(), dest->source.x_drawable.drawable,
- dest->source.x_drawable.gc, image,
- 0, 0, area.left + offset.x, area.top + offset.y,
- area.right - area.left, area.bottom - area.top, false);
- } else {
- XPutImage(XPlatform::get_display(), dest->source.x_drawable.drawable,
- dest->source.x_drawable.gc, image,
- 0, 0, area.left + offset.x, area.top + offset.y,
- area.right - area.left, area.bottom - area.top);
- }
-
- free_temp_image(image, shminfo, pixman_image);
- }
- XFlush(XPlatform::get_display());
-}
-
-static inline void copy_to_x_drawable(const RedDrawable_p* dest,
- const SpiceRect& area,
- const SpicePoint& offset,
- const PixelsSource_p* source,
- int src_x, int src_y)
-{
- switch (source->type) {
- case PIXELS_SOURCE_TYPE_X_DRAWABLE:
- copy_to_drawable_from_drawable(dest, area, offset, source, src_x, src_y);
- break;
- case PIXELS_SOURCE_TYPE_PIXMAP:
- copy_to_drawable_from_pixmap(dest, area, offset, source, src_x, src_y);
- break;
- default:
- THROW("invalid source type %d", source->type);
- }
-}
-
-#ifdef USE_OPENGL
-static inline void copy_to_gl_drawable(const RedDrawable_p* dest,
- const SpiceRect& area,
- const SpicePoint& offset,
- const PixelsSource_p* source,
- int src_x, int src_y)
-{
- switch (source->type) {
- case PIXELS_SOURCE_TYPE_GL_TEXTURE:
- copy_to_gldrawable_from_gltexture(dest, area, offset, source, src_x, src_y);
- break;
- case PIXELS_SOURCE_TYPE_PIXMAP:
- copy_to_gldrawable_from_pixmap(dest, area, offset, source, src_x, src_y);
- break;
- default:
- THROW("invalid source type %d", source->type);
- }
-}
-#endif // USE_OPENGL
-
-static inline void copy_to_pixmap_from_drawable(const RedDrawable_p* dest,
- const SpiceRect& area,
- const SpicePoint& offset,
- const PixelsSource_p* source,
- int src_x, int src_y)
-{
- LOG_WARN("not implemented");
-}
-
-static inline void copy_to_pixmap_from_pixmap(const RedDrawable_p* dest,
- const SpiceRect& area,
- const SpicePoint& offset,
- const PixelsSource_p* source,
- int src_x, int src_y)
-{
- pixman_image_t *dest_surface = dest->source.pixmap.pixman_image;
- pixman_image_t *src_surface = source->pixmap.pixman_image;
-
- pixman_image_composite32(PIXMAN_OP_SRC,
- src_surface, NULL, dest_surface,
- src_x + offset.x,
- src_y + offset.y,
- 0, 0,
- area.left + offset.x,
- area.top + offset.y,
- area.right - area.left,
- area.bottom - area.top);
-}
-
-#ifdef USE_OPENGL
-static inline void copy_to_pixmap_from_gltexture(const RedDrawable_p* dest,
- const SpiceRect& area,
- const SpicePoint& offset,
- const PixelsSource_p* source,
- int src_x, int src_y)
-{
- int y, height;
- GLXContext context = NULL;
- GLXPbuffer pbuffer;
- Window win;
- RenderType rendertype;
-
- y = source->gl.height - src_y;
- height = area.bottom - area.top;
-
- rendertype = source->gl.rendertype;
- if (rendertype == RENDER_TYPE_FBO) {
- glBindFramebuffer(GL_FRAMEBUFFER_EXT, source->gl.fbo);
- glBindTexture(GL_TEXTURE_2D, 0);
- } else {
- context = source->gl.context;
- pbuffer = source->gl.pbuff;
- glXMakeCurrent(XPlatform::get_display(), pbuffer, context);
- glDisable(GL_TEXTURE_2D);
- }
- glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
- glPixelStorei(GL_PACK_ROW_LENGTH,
- pixman_image_get_stride(dest->source.pixmap.pixman_image) / 4);
-
- while (height > 0) {
- glReadPixels(src_x, y - height, area.right - area.left, 1,
- GL_BGRA, GL_UNSIGNED_BYTE,
- (uint8_t *)pixman_image_get_data(dest->source.pixmap.pixman_image) +
- (area.left + offset.x) * 4 +
- (area.top + offset.y + height - 1) *
- pixman_image_get_stride(dest->source.pixmap.pixman_image));
- height--;
- }
- if (rendertype != RENDER_TYPE_FBO) {
- win = source->gl.win;
- glXMakeCurrent(XPlatform::get_display(), win, context);
- }
-}
-#endif // USE_OPENGL
-
-static inline void copy_to_pixmap(const RedDrawable_p* dest,
- const SpiceRect& area,
- const SpicePoint& offset,
- const PixelsSource_p* source,
- int src_x, int src_y)
-{
- switch (source->type) {
-#ifdef USE_OPENGL
- case PIXELS_SOURCE_TYPE_GL_TEXTURE:
- copy_to_pixmap_from_gltexture(dest, area, offset, source, src_x, src_y);
- break;
-#endif // USE_OPENGL
- case PIXELS_SOURCE_TYPE_X_DRAWABLE:
- copy_to_pixmap_from_drawable(dest, area, offset, source, src_x, src_y);
- break;
- case PIXELS_SOURCE_TYPE_PIXMAP:
- copy_to_pixmap_from_pixmap(dest, area, offset, source, src_x, src_y);
- break;
- default:
- THROW("invalid source type %d", source->type);
- }
-}
-
-void RedDrawable::copy_pixels(const PixelsSource& src, int src_x, int src_y, const SpiceRect& area)
-{
- PixelsSource_p* source = (PixelsSource_p*)src.get_opaque();
- RedDrawable_p* dest = (RedDrawable_p*)get_opaque();
- switch (dest->source.type) {
-#ifdef USE_OPENGL
- case PIXELS_SOURCE_TYPE_GL_DRAWABLE:
- copy_to_gl_drawable(dest, area, _origin, source, src_x + src._origin.x,
- src_y + src._origin.y);
- break;
-#endif // USE_OPENGL
- case PIXELS_SOURCE_TYPE_X_DRAWABLE:
- copy_to_x_drawable(dest, area, _origin, source, src_x + src._origin.x,
- src_y + src._origin.y);
- break;
- case PIXELS_SOURCE_TYPE_PIXMAP:
- copy_to_pixmap(dest, area, _origin, source, src_x + src._origin.x, src_y + src._origin.y);
- break;
- default:
- THROW("invalid dest type %d", dest->source.type);
- }
-}
-
-static inline void blend_to_drawable(const RedDrawable_p* dest,
- const SpiceRect& area,
- const SpicePoint& offset,
- const PixelsSource_p* source,
- int src_x, int src_y)
-{
- LOG_WARN("not implemented");
-}
-
-static inline void blend_to_pixmap_from_drawable(const RedDrawable_p* dest,
- const SpiceRect& area,
- const SpicePoint& offset,
- const PixelsSource_p* source,
- int src_x, int src_y)
-{
- LOG_WARN("not implemented");
-}
-
-static inline void blend_to_pixmap_from_pixmap(const RedDrawable_p* dest,
- const SpiceRect& area,
- const SpicePoint& offset,
- const PixelsSource_p* source,
- int src_x, int src_y)
-{
- pixman_image_t *dest_surface = dest->source.pixmap.pixman_image;
- pixman_image_t *src_surface = source->pixmap.pixman_image;
-
- pixman_image_composite32 (PIXMAN_OP_ATOP,
- src_surface, NULL, dest_surface,
- src_x + offset.x,
- src_y + offset.y,
- 0, 0,
- area.left + offset.x,
- area.top + offset.y,
- area.right - area.left,
- area.bottom - area.top);
-}
-
-static inline void blend_to_pixmap(const RedDrawable_p* dest,
- const SpiceRect& area,
- const SpicePoint& offset,
- const PixelsSource_p* source,
- int src_x, int src_y)
-{
- switch (source->type) {
- case PIXELS_SOURCE_TYPE_X_DRAWABLE:
- blend_to_pixmap_from_drawable(dest, area, offset, source, src_x, src_y);
- break;
- case PIXELS_SOURCE_TYPE_PIXMAP:
- blend_to_pixmap_from_pixmap(dest, area, offset, source, src_x, src_y);
- break;
- default:
- THROW("invalid source type %d", source->type);
- }
-}
-
-void RedDrawable::blend_pixels(const PixelsSource& src, int src_x, int src_y, const SpiceRect& area)
-{
- PixelsSource_p* source = (PixelsSource_p*)src.get_opaque();
- RedDrawable_p* dest = (RedDrawable_p*)get_opaque();
- switch (dest->source.type) {
- case PIXELS_SOURCE_TYPE_X_DRAWABLE:
- blend_to_drawable(dest, area, _origin, source, src_x + src._origin.x,
- src_y + src._origin.y);
- break;
- case PIXELS_SOURCE_TYPE_PIXMAP:
- blend_to_pixmap(dest, area, _origin, source, src_x + src._origin.x, src_y + src._origin.y);
- break;
- default:
- THROW("invalid dest type %d", dest->source.type);
- }
-}
-
-static inline void combine_to_drawable(const RedDrawable_p* dest,
- const SpiceRect& area,
- const SpicePoint& offset,
- const PixelsSource_p* source,
- int src_x, int src_y,
- RedDrawable::CombineOP op)
-{
- LOG_WARN("not implemented");
-}
-
-static inline void combine_to_pixmap_from_drawable(const RedDrawable_p* dest,
- const SpiceRect& area,
- const SpicePoint& offset,
- const PixelsSource_p* source,
- int src_x, int src_y,
- RedDrawable::CombineOP op)
-{
- LOG_WARN("not implemented");
-}
-
-static inline void combine_to_pixmap_from_pixmap(const RedDrawable_p* dest,
- const SpiceRect& area,
- const SpicePoint& offset,
- const PixelsSource_p* source,
- int src_x, int src_y,
- RedDrawable::CombineOP op)
-{
- pixman_image_t *dest_surface = dest->source.pixmap.pixman_image;
- pixman_image_t *src_surface = source->pixmap.pixman_image;
-
- SpiceROP rop;
- switch (op) {
- case RedDrawable::OP_COPY:
- rop = SPICE_ROP_COPY;
- break;
- case RedDrawable::OP_AND:
- rop = SPICE_ROP_AND;
- break;
- case RedDrawable::OP_XOR:
- rop = SPICE_ROP_XOR;
- break;
- default:
- THROW("invalid op %d", op);
- }
-
-
- if (pixman_image_get_depth (src_surface) == 1) {
- pixman_color_t white = { 0xffff, 0xffff, 0xffff, 0xffff };
- pixman_image_t *solid;
- pixman_image_t *temp;
-
- /* Create a temporary rgb32 image that is black where mask is 0
- and white where mask is 1 */
- temp = pixman_image_create_bits(pixman_image_get_depth(dest_surface) == 24 ?
- PIXMAN_x8r8g8b8 : PIXMAN_a8r8g8b8,
- area.right - area.left,
- area.bottom - area.top, NULL, 0);
- solid = pixman_image_create_solid_fill(&white);
- pixman_image_composite32(PIXMAN_OP_SRC,
- solid, src_surface, temp,
- 0, 0,
- src_x + offset.x,
- src_y + offset.y,
- 0, 0,
- area.right - area.left,
- area.bottom - area.top);
- pixman_image_unref(solid);
-
- /* ROP the temp image on the destination */
- spice_pixman_blit_rop(dest_surface,
- temp,
- 0,
- 0,
- area.left + offset.x,
- area.top + offset.y,
- area.right - area.left,
- area.bottom - area.top,
- rop);
- pixman_image_unref(temp);
-
- } else {
- spice_pixman_blit_rop(dest_surface,
- src_surface,
- src_x + offset.x,
- src_y + offset.y,
- area.left + offset.x,
- area.top + offset.y,
- area.right - area.left,
- area.bottom - area.top,
- rop);
- }
-}
-
-static inline void combine_to_pixmap(const RedDrawable_p* dest,
- const SpiceRect& area,
- const SpicePoint& offset,
- const PixelsSource_p* source,
- int src_x, int src_y,
- RedDrawable::CombineOP op)
-{
- switch (source->type) {
- case PIXELS_SOURCE_TYPE_X_DRAWABLE:
- combine_to_pixmap_from_drawable(dest, area, offset, source, src_x, src_y, op);
- break;
- case PIXELS_SOURCE_TYPE_PIXMAP:
- combine_to_pixmap_from_pixmap(dest, area, offset, source, src_x, src_y, op);
- break;
- default:
- THROW("invalid source type %d", source->type);
- }
-}
-
-void RedDrawable::combine_pixels(const PixelsSource& src, int src_x, int src_y, const SpiceRect& area,
- CombineOP op)
-{
- PixelsSource_p* source = (PixelsSource_p*)src.get_opaque();
- RedDrawable_p* dest = (RedDrawable_p*)get_opaque();
- switch (dest->source.type) {
- case PIXELS_SOURCE_TYPE_X_DRAWABLE:
- combine_to_drawable(dest, area, _origin, source, src_x + src._origin.x,
- src_y + src._origin.y, op);
- break;
- case PIXELS_SOURCE_TYPE_PIXMAP:
- combine_to_pixmap(dest, area, _origin, source, src_x + src._origin.x,
- src_y + src._origin.y, op);
- break;
- default:
- THROW("invalid dest type %d", dest->source.type);
- }
-}
-
-void RedDrawable::erase_rect(const SpiceRect& area, rgb32_t color)
-{
- LOG_WARN("not implemented");
-}
-
-static inline void fill_drawable(RedDrawable_p* dest, const SpiceRect& area, rgb32_t color,
- const SpicePoint& offset)
-{
- Drawable drawable = dest->source.x_drawable.drawable;
- GC gc = dest->source.x_drawable.gc;
-
- XLockDisplay(XPlatform::get_display());
- Colormap color_map = DefaultColormap(XPlatform::get_display(),
- DefaultScreen(XPlatform::get_display()));
- XColor x_color;
- x_color.red = (uint16_t)rgb32_get_red(color) << 8;
- x_color.green = (uint16_t)rgb32_get_green(color) << 8;
- x_color.blue = (uint16_t)rgb32_get_blue(color) << 8;
- x_color.flags = DoRed | DoGreen | DoBlue;
- //todo: optimize color map
- if (!XAllocColor(XPlatform::get_display(), color_map, &x_color)) {
- LOG_WARN("color map failed");
- }
- XUnlockDisplay(XPlatform::get_display());
-
- XGCValues gc_vals;
- gc_vals.foreground = x_color.pixel;
- gc_vals.function = GXcopy;
- gc_vals.fill_style = FillSolid;
- XChangeGC(XPlatform::get_display(), gc, GCFunction | GCForeground | GCFillStyle, &gc_vals);
- XFillRectangle(XPlatform::get_display(), drawable,
- gc, area.left + offset.x, area.top + offset.y,
- area.right - area.left, area.bottom - area.top);
-}
-
-#ifdef USE_OPENGL
-static inline void fill_gl_drawable(RedDrawable_p* dest, const SpiceRect& area, rgb32_t color,
- const SpicePoint& offset)
-{
- int vertex_x1, vertex_x2;
- int vertex_y1, vertex_y2;
- GLXContext context;
-
- context = glXGetCurrentContext();
- if (!context) {
- return;
- }
-
- vertex_x1 = area.left + offset.x;
- vertex_y1 = dest->source.x_drawable.height - (area.top + offset.y) - (area.bottom - area.top);
-
- vertex_x2 = vertex_x1 + (area.right - area.left);
- vertex_y2 = vertex_y1 + (area.bottom - area.top);
-
- glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
-
- glColor3f(rgb32_get_red(color), rgb32_get_green(color),
- rgb32_get_blue(color));
-
- glBegin(GL_QUADS);
- glVertex2i(vertex_x1, vertex_y1);
- glVertex2i(vertex_x1, vertex_y2);
- glVertex2i(vertex_x2, vertex_y2);
- glVertex2i(vertex_x2, vertex_y1);
- glEnd();
- glFlush();
-
- glColor3f(1, 1, 1);
-}
-#endif // USE_OPENGL
-
-static inline void fill_pixmap(RedDrawable_p* dest, const SpiceRect& area, rgb32_t color,
- const SpicePoint& offset)
-{
- pixman_image_t *dest_surface = dest->source.pixmap.pixman_image;
-
- spice_pixman_fill_rect(dest_surface,
- area.left + offset.x, area.top + offset.y,
- area.right - area.left,
- area.bottom - area.top,
- color);
-}
-
-void RedDrawable::fill_rect(const SpiceRect& area, rgb32_t color)
-{
- RedDrawable_p* dest = (RedDrawable_p*)get_opaque();
- switch (dest->source.type) {
-#ifdef USE_OPENGL
- case PIXELS_SOURCE_TYPE_GL_DRAWABLE:
- fill_gl_drawable(dest, area, color, _origin);
- break;
-#endif // USE_OPENGL
- case PIXELS_SOURCE_TYPE_X_DRAWABLE:
- fill_drawable(dest, area, color, _origin);
- break;
- case PIXELS_SOURCE_TYPE_PIXMAP:
- fill_pixmap(dest, area, color, _origin);
- break;
- default:
- THROW("invalid dest type %d", dest->source.type);
- }
-}
-
-static inline void frame_drawable(RedDrawable_p* dest, const SpiceRect& area, rgb32_t color,
- const SpicePoint& offset)
-{
- Drawable drawable = dest->source.x_drawable.drawable;
- GC gc = dest->source.x_drawable.gc;
-
- XLockDisplay(XPlatform::get_display());
- Colormap color_map = DefaultColormap(XPlatform::get_display(),
- DefaultScreen(XPlatform::get_display()));
- XColor x_color;
- x_color.red = (uint16_t)rgb32_get_red(color) << 8;
- x_color.green = (uint16_t)rgb32_get_green(color) << 8;
- x_color.blue = (uint16_t)rgb32_get_blue(color) << 8;
- x_color.flags = DoRed | DoGreen | DoBlue;
- //todo: optimize color map
- if (!XAllocColor(XPlatform::get_display(), color_map, &x_color)) {
- LOG_WARN("color map failed");
- }
- XUnlockDisplay(XPlatform::get_display());
-
- XGCValues gc_vals;
- gc_vals.foreground = x_color.pixel;
- gc_vals.function = GXcopy;
- gc_vals.fill_style = FillSolid;
- XChangeGC(XPlatform::get_display(), gc, GCFunction | GCForeground | GCFillStyle, &gc_vals);
- XFillRectangle(XPlatform::get_display(), drawable,
- gc, area.left + offset.x, area.top + offset.y,
- area.right - area.left, area.bottom - area.top);
-}
-
-static inline void frame_pixmap(RedDrawable_p* dest, const SpiceRect& area, rgb32_t color,
- const SpicePoint& offset)
-{
- pixman_image_t *dest_surface = dest->source.pixmap.pixman_image;
-
- spice_pixman_fill_rect(dest_surface,
- area.left + offset.x, area.top + offset.y,
- area.right - area.left,
- 1,
- color);
- spice_pixman_fill_rect(dest_surface,
- area.left + offset.x, area.bottom + offset.y,
- area.right - area.left,
- 1,
- color);
- spice_pixman_fill_rect(dest_surface,
- area.left + offset.x, area.top + offset.y,
- 1,
- area.bottom - area.top,
- color);
- spice_pixman_fill_rect(dest_surface,
- area.right + offset.x, area.top + offset.y,
- 1,
- area.bottom - area.top,
- color);
-}
-
-void RedDrawable::frame_rect(const SpiceRect& area, rgb32_t color)
-{
- RedDrawable_p* dest = (RedDrawable_p*)get_opaque();
- switch (dest->source.type) {
- case PIXELS_SOURCE_TYPE_X_DRAWABLE:
- frame_drawable(dest, area, color, _origin);
- break;
- case PIXELS_SOURCE_TYPE_PIXMAP:
- frame_pixmap(dest, area, color, _origin);
- break;
- default:
- THROW("invalid dest type %d", dest->source.type);
- }
-}
diff --git a/client/x11/red_pixmap.cpp b/client/x11/red_pixmap.cpp
deleted file mode 100644
index af30f526..00000000
--- a/client/x11/red_pixmap.cpp
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-#include "red_pixmap.h"
-#include "debug.h"
-#include "utils.h"
-
-RedPixmap::RedPixmap(int width, int height, RedPixmap::Format format,
- bool top_bottom)
- : _format (format)
- , _width (width)
- , _height (height)
- , _stride (SPICE_ALIGN(width * format_to_bpp(format), 32) / 8)
- , _top_bottom (top_bottom)
- , _data (NULL)
-{
-}
-
-RedPixmap::~RedPixmap()
-{
-}
-
-bool RedPixmap::is_big_endian_bits()
-{
- return false;
-}
diff --git a/client/x11/red_pixmap_gl.cpp b/client/x11/red_pixmap_gl.cpp
deleted file mode 100644
index 7978a40b..00000000
--- a/client/x11/red_pixmap_gl.cpp
+++ /dev/null
@@ -1,314 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <GL/gl.h>
-#include <GL/glu.h>
-#include <GL/glext.h>
-#include <X11/Xlib.h>
-#include "common/gl_utils.h"
-
-#include "common.h"
-#include "red_pixmap_gl.h"
-#include "debug.h"
-#include "utils.h"
-#include "pixels_source_p.h"
-#include "x_platform.h"
-#include "red_window_p.h"
-
-
-RedPixmapGL::RedPixmapGL(int width, int height, RedDrawable::Format format,
- bool top_bottom, RedWindow *win,
- RenderType rendertype)
- : RedPixmap(width, height, format, top_bottom)
-{
- GLuint fbo = 0;
- GLuint tex = 0;
- GLuint stencil_tex = 0;
- GLuint rbo = 0;
- Win xwin;
- //GLint max_texture_size;
-
- ASSERT(format == RedDrawable::ARGB32 || format == RedDrawable::RGB32 || format == RedDrawable::A1);
- ASSERT(sizeof(RedDrawable_p) <= PIXELES_SOURCE_OPAQUE_SIZE);
-
- ((PixelsSource_p*)get_opaque())->type = PIXELS_SOURCE_TYPE_GL_TEXTURE;
-
- _glcont = win->create_context_gl();
- if (!_glcont) {
- THROW("glXCreateContext failed");
- }
-
- win->set_gl_context(_glcont);
-
- xwin = ((RedWindow_p*)win)->get_window();
-
- /*glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max_texture_size);
- if (width > max_texture_size || height > max_texture_size) {
- throw Exception(fmt("%s: unsuported max %|| width %|| height %||")
- % __FUNCTION__
- % max_texture_size
- % width
- % height);
- }*/
-
- if (rendertype == RENDER_TYPE_FBO) {
- int w = gl_get_to_power_two(width);
- int h = gl_get_to_power_two(height);
-
- glXMakeCurrent(XPlatform::get_display(), xwin, _glcont);
- if (!gluCheckExtension((GLubyte *)"GL_EXT_framebuffer_object",
- glGetString(GL_EXTENSIONS))) {
- glXMakeCurrent(XPlatform::get_display(), 0, 0);
- glXDestroyContext(XPlatform::get_display(), _glcont);
- THROW("no GL_EXT_framebuffer_object extension");
- }
-
- glGenTextures(1, &tex);
- glBindTexture(GL_TEXTURE_2D, tex);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glBindTexture(GL_TEXTURE_2D, 0);
-
- glGenRenderbuffers(1, &rbo);
- glBindRenderbuffer(GL_RENDERBUFFER, rbo);
- glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, w, h);
- glBindRenderbuffer(GL_RENDERBUFFER, 0);
-
- glGenFramebuffers(1, &fbo);
- glBindFramebuffer(GL_FRAMEBUFFER, fbo);
- glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
- glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo);
-
- GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
- if (status != GL_FRAMEBUFFER_COMPLETE)
- THROW("bad fbo status: %d\n", status);
-
- ((PixelsSource_p*)get_opaque())->gl.fbo = fbo;
- win->set_render_fbo(fbo);
-
- } else if (rendertype == RENDER_TYPE_PBUFF) {
- GLXPbuffer pbuff;
-
- pbuff = win->create_pbuff(gl_get_to_power_two(width),
- gl_get_to_power_two(height));
- if (!pbuff) {
- glXDestroyContext(XPlatform::get_display(), _glcont);
- THROW("pbuff creation failed");
- }
- glXMakeCurrent(XPlatform::get_display(), pbuff, _glcont);
- glEnable(GL_TEXTURE_2D);
- glGenTextures(1, &tex);
- glBindTexture(GL_TEXTURE_2D, tex);
-
- glTexImage2D(GL_TEXTURE_2D, 0, 4, gl_get_to_power_two(width),
- gl_get_to_power_two(height), 0, GL_BGRA, GL_UNSIGNED_BYTE,
- NULL);
-
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-
- glBindTexture(GL_TEXTURE_2D, 0);
- ((PixelsSource_p*)get_opaque())->gl.pbuff = pbuff;
- win->set_render_pbuff(pbuff);
- } else {
- abort();
- }
-
- ((PixelsSource_p*)get_opaque())->gl.stencil_tex = stencil_tex;
- ((PixelsSource_p*)get_opaque())->gl.tex = tex;
- ((PixelsSource_p*)get_opaque())->gl.width = width;
- ((PixelsSource_p*)get_opaque())->gl.height = height;
- ((PixelsSource_p*)get_opaque())->gl.width_powed = gl_get_to_power_two(width);
- ((PixelsSource_p*)get_opaque())->gl.height_powed = gl_get_to_power_two(height);
- ((PixelsSource_p*)get_opaque())->gl.win = xwin;
- ((PixelsSource_p*)get_opaque())->gl.rendertype = rendertype;
- ((PixelsSource_p*)get_opaque())->gl.context = _glcont;
-
- _textures_lost = false;
-
- GLC_ERROR_TEST_FINISH;
-}
-
-void RedPixmapGL::textures_lost()
-{
- _textures_lost = true;
-}
-
-void RedPixmapGL::touch_context()
-{
- Win win;
- GLXPbuffer pbuff;
- RenderType rendertype;
-
- rendertype = ((PixelsSource_p*)get_opaque())->gl.rendertype;
- if (rendertype == RENDER_TYPE_FBO) {
- win = ((PixelsSource_p*)get_opaque())->gl.win;
- if (_glcont) {
- glXMakeCurrent(XPlatform::get_display(), win, _glcont);
- }
- } else {
- pbuff = ((PixelsSource_p*)get_opaque())->gl.pbuff;
- glXMakeCurrent(XPlatform::get_display(), pbuff, _glcont);
- }
- GLC_ERROR_TEST_FLUSH;
-}
-
-void RedPixmapGL::update_texture(const SpiceRect *bbox)
-{
- RenderType rendertype;
- GLuint tex;
- int height;
-
- rendertype = ((PixelsSource_p*)get_opaque())->gl.rendertype;
-
- if (rendertype == RENDER_TYPE_PBUFF) {
- int tex_x, tex_y;
- int vertex_x1, vertex_x2;
- int vertex_y1, vertex_y2;
- int is_enabled;
- GLint prev_tex;
-
- height = ((PixelsSource_p*)get_opaque())->gl.height;
-
- tex = ((PixelsSource_p*)get_opaque())->gl.tex;
-
- tex_x = bbox->left;
- tex_y = height - bbox->bottom;
- vertex_x1 = bbox->left;
- vertex_y1 = height - bbox->bottom;
- vertex_x2 = vertex_x1 + (bbox->right - bbox->left);
- vertex_y2 = vertex_y1 + (bbox->bottom - bbox->top);
-
- is_enabled = glIsEnabled(GL_TEXTURE_2D);
- if (!is_enabled) {
- glEnable(GL_TEXTURE_2D);
- } else {
- glGetIntegerv(GL_TEXTURE_BINDING_2D, &prev_tex);
- }
- glBindTexture(GL_TEXTURE_2D, tex);
- glCopyTexSubImage2D(GL_TEXTURE_2D, 0, tex_x, tex_y, vertex_x1,
- vertex_y1, vertex_x2 - vertex_x1,
- vertex_y2 - vertex_y1);
- if (!is_enabled) {
- glBindTexture(GL_TEXTURE_2D, 0);
- glDisable(GL_TEXTURE_2D);
- } else {
- glBindTexture(GL_TEXTURE_2D, prev_tex);
- }
- }
- GLC_ERROR_TEST_FLUSH;
-}
-
-void RedPixmapGL::pre_copy()
-{
- glFlush();
-
- glPushAttrib(GL_ENABLE_BIT | GL_COLOR_BUFFER_BIT | GL_TEXTURE_BIT |
- GL_TRANSFORM_BIT);
-
- glMatrixMode(GL_TEXTURE);
- glPushMatrix();
- glLoadIdentity();
-
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glLoadIdentity();
- gluOrtho2D(0, ((PixelsSource_p*)get_opaque())->gl.width, 0,
- ((PixelsSource_p*)get_opaque())->gl.height);
-
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
- glLoadIdentity();
- glViewport(0, 0, ((PixelsSource_p*)get_opaque())->gl.width,
- ((PixelsSource_p*)get_opaque())->gl.height);
-
-
- glDisable(GL_TEXTURE_GEN_S);
- glDisable(GL_TEXTURE_GEN_T);
- glDisable(GL_BLEND);
- glDisable(GL_ALPHA_TEST);
- glDisable(GL_COLOR_LOGIC_OP);
- glDisable(GL_STENCIL_TEST);
-
- glColor3f(1, 1, 1);
-}
-
-void RedPixmapGL::past_copy()
-{
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- glMatrixMode(GL_TEXTURE);
- glPopMatrix();
-
- glPopAttrib();
- glFlush();
-}
-
-RedPixmapGL::~RedPixmapGL()
-{
- GLXPbuffer pbuff;
- GLuint fbo, rbo;
- RenderType rendertype;
- GLuint tex;
- GLuint stencil_tex;
-
- rendertype = ((PixelsSource_p*)get_opaque())->gl.rendertype;
- if (rendertype == RENDER_TYPE_FBO) {
- fbo = ((PixelsSource_p*)get_opaque())->gl.fbo;
- rbo = ((PixelsSource_p*)get_opaque())->gl.rbo;
- spice_debug("deletefbo %u", fbo);
- if (fbo) {
- glDeleteFramebuffers(1, &fbo);
- }
- if (rbo) {
- glDeleteRenderbuffers(1, &rbo);
- }
- } else {
- pbuff = ((PixelsSource_p*)get_opaque())->gl.pbuff;
- glXDestroyPbuffer(XPlatform::get_display(), pbuff);
- }
-
- /*
- * GL textures might be destroyed by res change.
- */
- if (!_textures_lost) {
- tex = ((PixelsSource_p*)get_opaque())->gl.tex;
- stencil_tex = ((PixelsSource_p*)get_opaque())->gl.stencil_tex;
- if (tex) {
- glDeleteTextures(1, &tex);
- }
- if (stencil_tex) {
- glDeleteTextures(1, &stencil_tex);
- }
- if (_glcont) {
- glXDestroyContext(XPlatform::get_display(), _glcont);
- }
- }
-
- /*
- * Both tex and stenctil_tex are textures and therefore they are destroyed
- * when the context is gone, so we dont free them here as they might have
- * already been destroyed.
- */
- GLC_ERROR_TEST_FINISH;
-}
diff --git a/client/x11/red_pixmap_sw.cpp b/client/x11/red_pixmap_sw.cpp
deleted file mode 100644
index 3fd86778..00000000
--- a/client/x11/red_pixmap_sw.cpp
+++ /dev/null
@@ -1,93 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-#include "red_pixmap_sw.h"
-#include "debug.h"
-#include "utils.h"
-#include "pixels_source_p.h"
-#include "x_platform.h"
-
-RedPixmapSw::RedPixmapSw(int width, int height, RedDrawable::Format format,
- bool top_bottom, RedWindow *win)
- : RedPixmap(width, height, format, top_bottom)
-{
- ASSERT(format == RedDrawable::ARGB32 || format == RedDrawable::RGB32 ||
- format == RedDrawable::RGB16_555 || format == RedDrawable::RGB16_565 ||
- format == RedDrawable::A1);
- ASSERT(sizeof(RedDrawable_p) <= PIXELES_SOURCE_OPAQUE_SIZE);
- pixman_image_t *pixman_image;
- XImage *image;
- XShmSegmentInfo *shminfo;
- _data = NULL;
- XVisualInfo *vinfo;
- int screen_num;
- RedDrawable::Format screen_format;
-
- screen_num = win ? win->get_screen_num() : 0;
- vinfo = XPlatform::get_vinfo()[screen_num];
- screen_format = XPlatform::get_screen_format(screen_num);
-
- image = NULL;
- shminfo = NULL;
-
- /* Only create XImage if same format as screen (needs re-verifying at
- draw time!) */
- if (RedDrawable::format_copy_compatible(format, screen_format) ||
- format == A1) {
- image = XPlatform::create_x_image(format, width, height,
- vinfo->depth, vinfo->visual,
- &shminfo);
- _stride = image->bytes_per_line;
- _data = (uint8_t *)image->data;
- } else {
- _data = new uint8_t[height * _stride];
- }
-
- pixman_image = pixman_image_create_bits(RedDrawable::format_to_pixman(format),
- _width, _height,
- (uint32_t *)_data, _stride);
- if (pixman_image == NULL) {
- THROW("surf create failed");
- }
-
- ((PixelsSource_p*)get_opaque())->type = PIXELS_SOURCE_TYPE_PIXMAP;
- ((PixelsSource_p*)get_opaque())->pixmap.shminfo = shminfo;
- ((PixelsSource_p*)get_opaque())->pixmap.x_image = image;
- ((PixelsSource_p*)get_opaque())->pixmap.pixman_image = pixman_image;
- ((PixelsSource_p*)get_opaque())->pixmap.format = format;
-}
-
-RedPixmapSw::~RedPixmapSw()
-{
- ASSERT(((PixelsSource_p*)get_opaque())->type == PIXELS_SOURCE_TYPE_PIXMAP);
-
- XShmSegmentInfo *shminfo = ((PixelsSource_p*)get_opaque())->pixmap.shminfo;
- XImage *image = ((PixelsSource_p*)get_opaque())->pixmap.x_image;
-
- pixman_image_unref(((PixelsSource_p*)get_opaque())->pixmap.pixman_image);
-
- if (image) {
- XPlatform::free_x_image(image, shminfo);
- } else {
- delete[] _data;
- }
-}
diff --git a/client/x11/red_window.cpp b/client/x11/red_window.cpp
deleted file mode 100644
index 7e16fcd2..00000000
--- a/client/x11/red_window.cpp
+++ /dev/null
@@ -1,2251 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-#include <X11/Xlib.h>
-#include <X11/Xresource.h>
-#include <X11/keysymdef.h>
-#include <X11/Xatom.h>
-#include <X11/XKBlib.h>
-
-#ifdef USE_OPENGL
-#include <GL/gl.h>
-#include <GL/glu.h>
-#include <GL/glx.h>
-#include <GL/glext.h>
-#endif // USE_OPENGL
-#include <stdio.h>
-
-#include <spice/protocol.h>
-#include "common/region.h"
-
-#ifdef USE_OPENGL
-#include "common/gl_utils.h"
-#include "red_pixmap_gl.h"
-#endif // USE_OPENGL
-
-#include "red_window.h"
-#include "utils.h"
-#include "debug.h"
-#include "platform.h"
-#include "x_platform.h"
-#include "pixels_source_p.h"
-#include "x_icon.h"
-
-#define X_RETRIES 10
-#define X_RETRY_DELAY_MICRO (1000 * 100)
-#define RAISE_RETRIES X_RETRIES
-#define Z_POSITION_RETRIES X_RETRIES
-#define GET_POSITION_RETRIES X_RETRIES
-#define GET_VIS_REGION_RETRIES X_RETRIES
-#define MOUSE_GRAB_RETRIES X_RETRIES
-
-static Display* x_display = NULL;
-static XContext user_data_context;
-static bool using_evdev = false;
-static XIC x_input_context = NULL;
-
-static Atom wm_protocol_atom;
-static Atom wm_delete_window_atom;
-
-static Atom wm_desktop;
-static Atom wm_current_desktop;
-
-static Atom wm_state;
-static Atom wm_state_above;
-static Atom wm_state_fullscreen;
-
-static Atom wm_user_time;
-
-static RedWindow* focus_window;
-static unsigned long focus_serial = 0;
-
-#define USE_X11_KEYCODE
-
-#ifdef USE_X11_KEYCODE
-
-enum EvdevKeyCode {
- EVDEV_KEYCODE_ESCAPE = 9,
- EVDEV_KEYCODE_1,
- EVDEV_KEYCODE_2,
- EVDEV_KEYCODE_3,
- EVDEV_KEYCODE_4,
- EVDEV_KEYCODE_5,
- EVDEV_KEYCODE_6,
- EVDEV_KEYCODE_7,
- EVDEV_KEYCODE_8,
- EVDEV_KEYCODE_9,
- EVDEV_KEYCODE_0,
- EVDEV_KEYCODE_MINUS,
- EVDEV_KEYCODE_EQUAL,
- EVDEV_KEYCODE_BACK_SPACE,
- EVDEV_KEYCODE_TAB,
- EVDEV_KEYCODE_Q,
- EVDEV_KEYCODE_W,
- EVDEV_KEYCODE_E,
- EVDEV_KEYCODE_R,
- EVDEV_KEYCODE_T,
- EVDEV_KEYCODE_Y,
- EVDEV_KEYCODE_U,
- EVDEV_KEYCODE_I,
- EVDEV_KEYCODE_O,
- EVDEV_KEYCODE_P,
- EVDEV_KEYCODE_L_BRACKET,
- EVDEV_KEYCODE_R_BRACKET,
- EVDEV_KEYCODE_RETURN,
- EVDEV_KEYCODE_L_CONTROL,
- EVDEV_KEYCODE_A,
- EVDEV_KEYCODE_S,
- EVDEV_KEYCODE_D,
- EVDEV_KEYCODE_F,
- EVDEV_KEYCODE_G,
- EVDEV_KEYCODE_H,
- EVDEV_KEYCODE_J,
- EVDEV_KEYCODE_K,
- EVDEV_KEYCODE_L,
- EVDEV_KEYCODE_SEMICOLON,
- EVDEV_KEYCODE_APOSTROPH,
- EVDEV_KEYCODE_BACKQUAT,
- EVDEV_KEYCODE_L_SHIFT,
- EVDEV_KEYCODE_BACKSLASH,
- EVDEV_KEYCODE_Z,
- EVDEV_KEYCODE_X,
- EVDEV_KEYCODE_C,
- EVDEV_KEYCODE_V,
- EVDEV_KEYCODE_B,
- EVDEV_KEYCODE_N,
- EVDEV_KEYCODE_M,
- EVDEV_KEYCODE_COMMA,
- EVDEV_KEYCODE_PERIOD,
- EVDEV_KEYCODE_SLASH,
- EVDEV_KEYCODE_R_SHIFT,
- EVDEV_KEYCODE_PAD_MULTIPLY,
- EVDEV_KEYCODE_L_ALT,
- EVDEV_KEYCODE_SPACE,
- EVDEV_KEYCODE_CAPS_LOCK,
- EVDEV_KEYCODE_F1,
- EVDEV_KEYCODE_F2,
- EVDEV_KEYCODE_F3,
- EVDEV_KEYCODE_F4,
- EVDEV_KEYCODE_F5,
- EVDEV_KEYCODE_F6,
- EVDEV_KEYCODE_F7,
- EVDEV_KEYCODE_F8,
- EVDEV_KEYCODE_F9,
- EVDEV_KEYCODE_F10,
- EVDEV_KEYCODE_NUM_LOCK,
- EVDEV_KEYCODE_SCROLL_LOCK,
- EVDEV_KEYCODE_PAD_7,
- EVDEV_KEYCODE_PAD_8,
- EVDEV_KEYCODE_PAD_9,
- EVDEV_KEYCODE_PAD_SUBTRACT,
- EVDEV_KEYCODE_PAD_4,
- EVDEV_KEYCODE_PAD_5,
- EVDEV_KEYCODE_PAD_6,
- EVDEV_KEYCODE_PAD_ADD,
- EVDEV_KEYCODE_PAD_1,
- EVDEV_KEYCODE_PAD_2,
- EVDEV_KEYCODE_PAD_3,
- EVDEV_KEYCODE_PAD_0,
- EVDEV_KEYCODE_PAD_DEL,
- EVDEV_KEYCODE_EUROPEAN = 94,
- EVDEV_KEYCODE_F11,
- EVDEV_KEYCODE_F12,
- EVDEV_KEYCODE_JAPANESE_BACKSLASH,
- EVDEV_KEYCODE_JAPANESE_HENKAN = 100,
- EVDEV_KEYCODE_JAPANESE_HIRAGANA_KATAKANA,
- EVDEV_KEYCODE_JAPANESE_MUHENKAN,
- EVDEV_KEYCODE_PAD_ENTER = 104,
- EVDEV_KEYCODE_R_CONTROL,
- EVDEV_KEYCODE_PAD_DEVIDE,
- EVDEV_KEYCODE_PRINT,
- EVDEV_KEYCODE_R_ALT,
- EVDEV_KEYCODE_HOME = 110,
- EVDEV_KEYCODE_UP,
- EVDEV_KEYCODE_PAGE_UP,
- EVDEV_KEYCODE_LEFT,
- EVDEV_KEYCODE_RIGHT,
- EVDEV_KEYCODE_END,
- EVDEV_KEYCODE_DOWN,
- EVDEV_KEYCODE_PAGE_DOWN,
- EVDEV_KEYCODE_INSERT,
- EVDEV_KEYCODE_DELETE,
- EVDEV_KEYCODE_MUTE = 121,
- EVDEV_KEYCODE_VOLUME_DOWN = 122,
- EVDEV_KEYCODE_VOLUME_UP = 123,
- EVDEV_KEYCODE_PAUSE = 127,
- EVDEV_KEYCODE_HANGUL = 130,
- EVDEV_KEYCODE_HANGUL_HANJA,
- EVDEV_KEYCODE_YEN,
- EVDEV_KEYCODE_L_COMMAND,
- EVDEV_KEYCODE_R_COMMAND,
- EVDEV_KEYCODE_MENU,
-};
-
-enum KbdKeyCode {
- KBD_KEYCODE_ESCAPE = 9,
- KBD_KEYCODE_1,
- KBD_KEYCODE_2,
- KBD_KEYCODE_3,
- KBD_KEYCODE_4,
- KBD_KEYCODE_5,
- KBD_KEYCODE_6,
- KBD_KEYCODE_7,
- KBD_KEYCODE_8,
- KBD_KEYCODE_9,
- KBD_KEYCODE_0,
- KBD_KEYCODE_MINUS,
- KBD_KEYCODE_EQUAL,
- KBD_KEYCODE_BACK_SPACE,
- KBD_KEYCODE_TAB,
- KBD_KEYCODE_Q,
- KBD_KEYCODE_W,
- KBD_KEYCODE_E,
- KBD_KEYCODE_R,
- KBD_KEYCODE_T,
- KBD_KEYCODE_Y,
- KBD_KEYCODE_U,
- KBD_KEYCODE_I,
- KBD_KEYCODE_O,
- KBD_KEYCODE_P,
- KBD_KEYCODE_L_BRACKET,
- KBD_KEYCODE_R_BRACKET,
- KBD_KEYCODE_RETURN,
- KBD_KEYCODE_L_CONTROL,
- KBD_KEYCODE_A,
- KBD_KEYCODE_S,
- KBD_KEYCODE_D,
- KBD_KEYCODE_F,
- KBD_KEYCODE_G,
- KBD_KEYCODE_H,
- KBD_KEYCODE_J,
- KBD_KEYCODE_K,
- KBD_KEYCODE_L,
- KBD_KEYCODE_SEMICOLON,
- KBD_KEYCODE_APOSTROPH,
- KBD_KEYCODE_BACKQUAT,
- KBD_KEYCODE_L_SHIFT,
- KBD_KEYCODE_BACKSLASH,
- KBD_KEYCODE_Z,
- KBD_KEYCODE_X,
- KBD_KEYCODE_C,
- KBD_KEYCODE_V,
- KBD_KEYCODE_B,
- KBD_KEYCODE_N,
- KBD_KEYCODE_M,
- KBD_KEYCODE_COMMA,
- KBD_KEYCODE_PERIOD,
- KBD_KEYCODE_SLASH,
- KBD_KEYCODE_R_SHIFT,
- KBD_KEYCODE_PAD_MULTIPLY,
- KBD_KEYCODE_L_ALT,
- KBD_KEYCODE_SPACE,
- KBD_KEYCODE_CAPS_LOCK,
- KBD_KEYCODE_F1,
- KBD_KEYCODE_F2,
- KBD_KEYCODE_F3,
- KBD_KEYCODE_F4,
- KBD_KEYCODE_F5,
- KBD_KEYCODE_F6,
- KBD_KEYCODE_F7,
- KBD_KEYCODE_F8,
- KBD_KEYCODE_F9,
- KBD_KEYCODE_F10,
- KBD_KEYCODE_NUM_LOCK,
- KBD_KEYCODE_SCROLL_LOCK,
- KBD_KEYCODE_PAD_7,
- KBD_KEYCODE_PAD_8,
- KBD_KEYCODE_PAD_9,
- KBD_KEYCODE_PAD_SUBTRACT,
- KBD_KEYCODE_PAD_4,
- KBD_KEYCODE_PAD_5,
- KBD_KEYCODE_PAD_6,
- KBD_KEYCODE_PAD_ADD,
- KBD_KEYCODE_PAD_1,
- KBD_KEYCODE_PAD_2,
- KBD_KEYCODE_PAD_3,
- KBD_KEYCODE_PAD_0,
- KBD_KEYCODE_PAD_DEL,
- KBD_KEYCODE_EUROPEAN = 94,
- KBD_KEYCODE_F11,
- KBD_KEYCODE_F12,
- KBD_KEYCODE_HOME,
- KBD_KEYCODE_UP,
- KBD_KEYCODE_PAGE_UP,
- KBD_KEYCODE_LEFT,
- KBD_KEYCODE_RIGHT = 102,
- KBD_KEYCODE_END,
- KBD_KEYCODE_DOWN,
- KBD_KEYCODE_PAGE_DOWN,
- KBD_KEYCODE_INSERT,
- KBD_KEYCODE_DELETE,
- KBD_KEYCODE_PAD_ENTER,
- KBD_KEYCODE_R_CONTROL,
- KBD_KEYCODE_PAUSE,
- KBD_KEYCODE_PRINT,
- KBD_KEYCODE_PAD_DEVIDE,
- KBD_KEYCODE_R_ALT,
- KBD_KEYCODE_L_COMMAND = 115,
- KBD_KEYCODE_R_COMMAND,
- KBD_KEYCODE_MENU,
- KBD_KEYCODE_JAPANESE_HENKAN = 129,
- KBD_KEYCODE_JAPANESE_MUHENKAN = 131,
- KBD_KEYCODE_YEN = 133,
- KBD_KEYCODE_JAPANESE_HIRAGANA_KATAKANA = 208,
- KBD_KEYCODE_HANGUL_HANJA,
- KBD_KEYCODE_HANGUL,
- KBD_KEYCODE_JAPANESE_BACKSLASH,
-};
-
-static void query_keyboard()
-{
- XLockDisplay(x_display);
- XkbDescPtr kbd_desk = XkbGetKeyboard(x_display, XkbAllComponentsMask, XkbUseCoreKbd);
- XUnlockDisplay(x_display);
- if (!kbd_desk) {
- LOG_WARN("get keyboard failed");
- return;
- }
-
- XLockDisplay(x_display);
- char* keycodes = XGetAtomName(x_display, kbd_desk->names->keycodes);
- XUnlockDisplay(x_display);
-
- if (keycodes) {
- if (strstr(keycodes, "evdev")) {
- using_evdev = true;
- }
- XFree(keycodes);
- } else {
- LOG_WARN("get name failed");
- }
- XkbFreeClientMap(kbd_desk, XkbAllComponentsMask, True);
-}
-
-static RedKey keycode_map[256];
-
-#define INIT_MAP \
- KEYMAP(KEYCODE_ESCAPE, REDKEY_ESCAPE); \
- KEYMAP(KEYCODE_1, REDKEY_1); \
- KEYMAP(KEYCODE_2, REDKEY_2); \
- KEYMAP(KEYCODE_3, REDKEY_3); \
- KEYMAP(KEYCODE_4, REDKEY_4); \
- KEYMAP(KEYCODE_5, REDKEY_5); \
- KEYMAP(KEYCODE_6, REDKEY_6); \
- KEYMAP(KEYCODE_7, REDKEY_7); \
- KEYMAP(KEYCODE_8, REDKEY_8); \
- KEYMAP(KEYCODE_9, REDKEY_9); \
- KEYMAP(KEYCODE_0, REDKEY_0); \
- KEYMAP(KEYCODE_MINUS, REDKEY_MINUS); \
- KEYMAP(KEYCODE_EQUAL, REDKEY_EQUALS); \
- KEYMAP(KEYCODE_BACK_SPACE, REDKEY_BACKSPACE); \
- KEYMAP(KEYCODE_TAB, REDKEY_TAB); \
- KEYMAP(KEYCODE_Q, REDKEY_Q); \
- KEYMAP(KEYCODE_W, REDKEY_W); \
- KEYMAP(KEYCODE_E, REDKEY_E); \
- KEYMAP(KEYCODE_R, REDKEY_R); \
- KEYMAP(KEYCODE_T, REDKEY_T); \
- KEYMAP(KEYCODE_Y, REDKEY_Y); \
- KEYMAP(KEYCODE_U, REDKEY_U); \
- KEYMAP(KEYCODE_I, REDKEY_I); \
- KEYMAP(KEYCODE_O, REDKEY_O); \
- KEYMAP(KEYCODE_P, REDKEY_P); \
- KEYMAP(KEYCODE_L_BRACKET, REDKEY_L_BRACKET); \
- KEYMAP(KEYCODE_R_BRACKET, REDKEY_R_BRACKET); \
- KEYMAP(KEYCODE_RETURN, REDKEY_ENTER); \
- KEYMAP(KEYCODE_L_CONTROL, REDKEY_L_CTRL); \
- KEYMAP(KEYCODE_A, REDKEY_A); \
- KEYMAP(KEYCODE_S, REDKEY_S); \
- KEYMAP(KEYCODE_D, REDKEY_D); \
- KEYMAP(KEYCODE_F, REDKEY_F); \
- KEYMAP(KEYCODE_G, REDKEY_G); \
- KEYMAP(KEYCODE_H, REDKEY_H); \
- KEYMAP(KEYCODE_J, REDKEY_J); \
- KEYMAP(KEYCODE_K, REDKEY_K); \
- KEYMAP(KEYCODE_L, REDKEY_L); \
- KEYMAP(KEYCODE_SEMICOLON, REDKEY_SEMICOLON); \
- KEYMAP(KEYCODE_APOSTROPH, REDKEY_QUOTE); \
- KEYMAP(KEYCODE_BACKQUAT, REDKEY_BACK_QUOTE); \
- KEYMAP(KEYCODE_L_SHIFT, REDKEY_L_SHIFT); \
- KEYMAP(KEYCODE_BACKSLASH, REDKEY_BACK_SLASH); \
- KEYMAP(KEYCODE_Z, REDKEY_Z); \
- KEYMAP(KEYCODE_X, REDKEY_X); \
- KEYMAP(KEYCODE_C, REDKEY_C); \
- KEYMAP(KEYCODE_V, REDKEY_V); \
- KEYMAP(KEYCODE_B, REDKEY_B); \
- KEYMAP(KEYCODE_N, REDKEY_N); \
- KEYMAP(KEYCODE_M, REDKEY_M); \
- KEYMAP(KEYCODE_COMMA, REDKEY_COMMA); \
- KEYMAP(KEYCODE_PERIOD, REDKEY_PERIOD); \
- KEYMAP(KEYCODE_SLASH, REDKEY_SLASH); \
- KEYMAP(KEYCODE_R_SHIFT, REDKEY_R_SHIFT); \
- KEYMAP(KEYCODE_PAD_MULTIPLY, REDKEY_PAD_MULTIPLY); \
- KEYMAP(KEYCODE_L_ALT, REDKEY_L_ALT); \
- KEYMAP(KEYCODE_SPACE, REDKEY_SPACE); \
- KEYMAP(KEYCODE_CAPS_LOCK, REDKEY_CAPS_LOCK); \
- KEYMAP(KEYCODE_F1, REDKEY_F1); \
- KEYMAP(KEYCODE_F2, REDKEY_F2); \
- KEYMAP(KEYCODE_F3, REDKEY_F3); \
- KEYMAP(KEYCODE_F4, REDKEY_F4); \
- KEYMAP(KEYCODE_F5, REDKEY_F5); \
- KEYMAP(KEYCODE_F6, REDKEY_F6); \
- KEYMAP(KEYCODE_F7, REDKEY_F7); \
- KEYMAP(KEYCODE_F8, REDKEY_F8); \
- KEYMAP(KEYCODE_F9, REDKEY_F9); \
- KEYMAP(KEYCODE_F10, REDKEY_F10); \
- KEYMAP(KEYCODE_NUM_LOCK, REDKEY_NUM_LOCK); \
- KEYMAP(KEYCODE_SCROLL_LOCK, REDKEY_SCROLL_LOCK); \
- KEYMAP(KEYCODE_PAD_7, REDKEY_PAD_7); \
- KEYMAP(KEYCODE_PAD_8, REDKEY_PAD_8); \
- KEYMAP(KEYCODE_PAD_9, REDKEY_PAD_9); \
- KEYMAP(KEYCODE_PAD_SUBTRACT, REDKEY_PAD_MINUS); \
- KEYMAP(KEYCODE_PAD_4, REDKEY_PAD_4); \
- KEYMAP(KEYCODE_PAD_5, REDKEY_PAD_5); \
- KEYMAP(KEYCODE_PAD_6, REDKEY_PAD_6); \
- KEYMAP(KEYCODE_PAD_ADD, REDKEY_PAD_PLUS); \
- KEYMAP(KEYCODE_PAD_1, REDKEY_PAD_1); \
- KEYMAP(KEYCODE_PAD_2, REDKEY_PAD_2); \
- KEYMAP(KEYCODE_PAD_3, REDKEY_PAD_3); \
- KEYMAP(KEYCODE_PAD_0, REDKEY_PAD_0); \
- KEYMAP(KEYCODE_PAD_DEL, REDKEY_PAD_POINT); \
- KEYMAP(KEYCODE_EUROPEAN, REDKEY_EUROPEAN); \
- KEYMAP(KEYCODE_F11, REDKEY_F11); \
- KEYMAP(KEYCODE_F12, REDKEY_F12); \
- KEYMAP(KEYCODE_JAPANESE_BACKSLASH, REDKEY_JAPANESE_BACKSLASH); \
- KEYMAP(KEYCODE_JAPANESE_HENKAN, REDKEY_JAPANESE_HENKAN); \
- KEYMAP(KEYCODE_JAPANESE_HIRAGANA_KATAKANA, REDKEY_JAPANESE_HIRAGANA_KATAKANA); \
- KEYMAP(KEYCODE_JAPANESE_MUHENKAN, REDKEY_JAPANESE_MUHENKAN); \
- KEYMAP(KEYCODE_PAD_ENTER, REDKEY_PAD_ENTER); \
- KEYMAP(KEYCODE_R_CONTROL, REDKEY_R_CTRL); \
- KEYMAP(KEYCODE_PAD_DEVIDE, REDKEY_PAD_DIVIDE); \
- KEYMAP(KEYCODE_PRINT, REDKEY_CTRL_PRINT_SCREEN); \
- KEYMAP(KEYCODE_R_ALT, REDKEY_R_ALT); \
- KEYMAP(KEYCODE_HOME, REDKEY_HOME); \
- KEYMAP(KEYCODE_UP, REDKEY_UP); \
- KEYMAP(KEYCODE_PAGE_UP, REDKEY_PAGEUP); \
- KEYMAP(KEYCODE_LEFT, REDKEY_LEFT); \
- KEYMAP(KEYCODE_RIGHT, REDKEY_RIGHT); \
- KEYMAP(KEYCODE_END, REDKEY_END); \
- KEYMAP(KEYCODE_DOWN, REDKEY_DOWN); \
- KEYMAP(KEYCODE_PAGE_DOWN, REDKEY_PAGEDOWN); \
- KEYMAP(KEYCODE_INSERT, REDKEY_INSERT); \
- KEYMAP(KEYCODE_DELETE, REDKEY_DELETE); \
- KEYMAP(KEYCODE_PAUSE, REDKEY_PAUSE); \
- \
- KEYMAP(KEYCODE_YEN, REDKEY_JAPANESE_YEN); \
- KEYMAP(KEYCODE_L_COMMAND, REDKEY_LEFT_CMD); \
- KEYMAP(KEYCODE_R_COMMAND, REDKEY_RIGHT_CMD); \
- KEYMAP(KEYCODE_MENU, REDKEY_MENU); \
- KEYMAP(KEYCODE_HANGUL, REDKEY_KOREAN_HANGUL); \
- KEYMAP(KEYCODE_HANGUL_HANJA, REDKEY_KOREAN_HANGUL_HANJA);
-
-static void init_evdev_map()
-{
- #define KEYMAP(key_code, red_key) keycode_map[EVDEV_##key_code] = red_key
- INIT_MAP;
- KEYMAP(KEYCODE_MUTE, REDKEY_MUTE);
- KEYMAP(KEYCODE_VOLUME_DOWN, REDKEY_VOLUME_DOWN);
- KEYMAP(KEYCODE_VOLUME_UP, REDKEY_VOLUME_UP);
- #undef KEYMAP
-}
-
-static void init_kbd_map()
-{
- #define KEYMAP(key_code, red_key) keycode_map[KBD_##key_code] = red_key
- INIT_MAP;
- #undef KEYMAP
-}
-
-static void init_key_map()
-{
- query_keyboard();
- memset(keycode_map, 0, sizeof(keycode_map));
- if (using_evdev) {
- LOG_INFO("using evdev mapping");
- init_evdev_map();
- } else {
- LOG_INFO("using kbd mapping");
- init_kbd_map();
- }
-}
-
-static inline RedKey to_red_key_code(unsigned int keycode)
-{
- if (keycode > 255) {
- return REDKEY_INVALID;
- }
- return keycode_map[keycode];
-}
-
-#else
-
-static RedKey key_table_0xff[256]; //miscellany
-
-static RedKey key_table_0x00[256]; //Latin 1
-
-static RedKey key_table_0xfe[256]; //Keyboard (XKB) Extension
-
-#define INIT_KEY(x, red) key_table_0xff[x & 0xff] = red;
-
-static void init_key_table_0xff()
-{
- for (int i = 0; i < sizeof(key_table_0xff) / sizeof(key_table_0xff[0]); i++) {
- key_table_0xff[i] = REDKEY_INVALID;
- }
-
- INIT_KEY(XK_Escape, REDKEY_ESCAPE);
- INIT_KEY(XK_BackSpace, REDKEY_BACKSPACE);
- INIT_KEY(XK_Tab, REDKEY_TAB);
- INIT_KEY(XK_Return, REDKEY_ENTER);
- INIT_KEY(XK_Control_L, REDKEY_L_CTRL);
- INIT_KEY(XK_Shift_L, REDKEY_L_SHIFT);
- INIT_KEY(XK_Shift_R, REDKEY_R_SHIFT);
- INIT_KEY(XK_KP_Multiply, REDKEY_PAD_MULTIPLY);
- INIT_KEY(XK_Alt_L, REDKEY_L_ALT);
- INIT_KEY(XK_Caps_Lock, REDKEY_CAPS_LOCK);
- INIT_KEY(XK_F1, REDKEY_F1);
- INIT_KEY(XK_F2, REDKEY_F2);
- INIT_KEY(XK_F3, REDKEY_F3);
- INIT_KEY(XK_F4, REDKEY_F4);
- INIT_KEY(XK_F5, REDKEY_F5);
- INIT_KEY(XK_F6, REDKEY_F6);
- INIT_KEY(XK_F7, REDKEY_F7);
- INIT_KEY(XK_F8, REDKEY_F8);
- INIT_KEY(XK_F9, REDKEY_F9);
- INIT_KEY(XK_F10, REDKEY_F10);
-
- INIT_KEY(XK_Num_Lock, REDKEY_NUM_LOCK);
- INIT_KEY(XK_Scroll_Lock, REDKEY_SCROLL_LOCK);
- INIT_KEY(XK_KP_7, REDKEY_PAD_7);
- INIT_KEY(XK_KP_Home, REDKEY_PAD_7);
- INIT_KEY(XK_KP_8, REDKEY_PAD_8);
- INIT_KEY(XK_KP_Up, REDKEY_PAD_8);
- INIT_KEY(XK_KP_9, REDKEY_PAD_9);
- INIT_KEY(XK_KP_Page_Up, REDKEY_PAD_9);
- INIT_KEY(XK_KP_Subtract, REDKEY_PAD_MINUS);
- INIT_KEY(XK_KP_4, REDKEY_PAD_4);
- INIT_KEY(XK_KP_Left, REDKEY_PAD_4);
- INIT_KEY(XK_KP_5, REDKEY_PAD_5);
- INIT_KEY(XK_KP_Begin, REDKEY_PAD_5);
- INIT_KEY(XK_KP_6, REDKEY_PAD_6);
- INIT_KEY(XK_KP_Right, REDKEY_PAD_6);
- INIT_KEY(XK_KP_Add, REDKEY_PAD_PLUS);
- INIT_KEY(XK_KP_1, REDKEY_PAD_1);
- INIT_KEY(XK_KP_End, REDKEY_PAD_1);
- INIT_KEY(XK_KP_2, REDKEY_PAD_2);
- INIT_KEY(XK_KP_Down, REDKEY_PAD_2);
- INIT_KEY(XK_KP_3, REDKEY_PAD_3);
- INIT_KEY(XK_KP_Page_Down, REDKEY_PAD_3);
- INIT_KEY(XK_KP_0, REDKEY_PAD_0);
- INIT_KEY(XK_KP_Insert, REDKEY_PAD_0);
- INIT_KEY(XK_KP_Decimal, REDKEY_PAD_POINT);
- INIT_KEY(XK_KP_Delete, REDKEY_PAD_POINT);
- INIT_KEY(XK_F11, REDKEY_F11);
- INIT_KEY(XK_F12, REDKEY_F12);
-
- INIT_KEY(XK_KP_Enter, REDKEY_PAD_ENTER);
- INIT_KEY(XK_Control_R, REDKEY_R_CTRL);
- INIT_KEY(XK_KP_Divide, REDKEY_PAD_DIVIDE);
- INIT_KEY(XK_Print, REDKEY_CTRL_PRINT_SCREEN);
-
- INIT_KEY(XK_Home, REDKEY_HOME);
- INIT_KEY(XK_Up, REDKEY_UP);
- INIT_KEY(XK_Page_Up, REDKEY_PAGEUP);
- INIT_KEY(XK_Left, REDKEY_LEFT);
- INIT_KEY(XK_Right, REDKEY_RIGHT);
- INIT_KEY(XK_End, REDKEY_END);
-
- INIT_KEY(XK_Down, REDKEY_DOWN);
- INIT_KEY(XK_Page_Down, REDKEY_PAGEDOWN);
- INIT_KEY(XK_Insert, REDKEY_INSERT);
- INIT_KEY(XK_Delete, REDKEY_DELETE);
- INIT_KEY(XK_Super_L, REDKEY_LEFT_CMD);
- INIT_KEY(XK_Super_R, REDKEY_RIGHT_CMD);
- INIT_KEY(XK_Menu, REDKEY_MENU);
- INIT_KEY(XK_Pause, REDKEY_CTRL_BREAK);
-}
-
-#undef INIT_KEY
-#define INIT_KEY(x, red) key_table_0x00[x & 0xff] = red;
-
-static void init_key_table_0x00()
-{
- for (int i = 0; i < sizeof(key_table_0x00) / sizeof(key_table_0x00[0]); i++) {
- key_table_0x00[i] = REDKEY_INVALID;
- }
-
- INIT_KEY(XK_1, REDKEY_1);
- INIT_KEY(XK_2, REDKEY_2);
- INIT_KEY(XK_3, REDKEY_3);
- INIT_KEY(XK_4, REDKEY_4);
- INIT_KEY(XK_5, REDKEY_5);
- INIT_KEY(XK_6, REDKEY_6);
- INIT_KEY(XK_7, REDKEY_7);
- INIT_KEY(XK_8, REDKEY_8);
- INIT_KEY(XK_9, REDKEY_9);
- INIT_KEY(XK_0, REDKEY_0);
- INIT_KEY(XK_minus, REDKEY_MINUS);
- INIT_KEY(XK_equal, REDKEY_EQUALS);
- INIT_KEY(XK_q, REDKEY_Q);
- INIT_KEY(XK_w, REDKEY_W);
- INIT_KEY(XK_e, REDKEY_E);
- INIT_KEY(XK_r, REDKEY_R);
- INIT_KEY(XK_t, REDKEY_T);
- INIT_KEY(XK_y, REDKEY_Y);
- INIT_KEY(XK_u, REDKEY_U);
- INIT_KEY(XK_i, REDKEY_I);
- INIT_KEY(XK_o, REDKEY_O);
- INIT_KEY(XK_p, REDKEY_P);
- INIT_KEY(XK_bracketleft, REDKEY_L_BRACKET);
- INIT_KEY(XK_bracketright, REDKEY_R_BRACKET);
- INIT_KEY(XK_a, REDKEY_A);
- INIT_KEY(XK_s, REDKEY_S);
- INIT_KEY(XK_e, REDKEY_E);
- INIT_KEY(XK_d, REDKEY_D);
- INIT_KEY(XK_f, REDKEY_F);
- INIT_KEY(XK_g, REDKEY_G);
- INIT_KEY(XK_h, REDKEY_H);
- INIT_KEY(XK_j, REDKEY_J);
- INIT_KEY(XK_k, REDKEY_K);
- INIT_KEY(XK_l, REDKEY_L);
- INIT_KEY(XK_semicolon, REDKEY_SEMICOLON);
- INIT_KEY(XK_quoteright, REDKEY_QUOTE);
- INIT_KEY(XK_quoteleft, REDKEY_BACK_QUOTE);
- INIT_KEY(XK_backslash, REDKEY_BACK_SLASH);
- INIT_KEY(XK_z, REDKEY_Z);
- INIT_KEY(XK_x, REDKEY_X);
- INIT_KEY(XK_c, REDKEY_C);
- INIT_KEY(XK_v, REDKEY_V);
- INIT_KEY(XK_b, REDKEY_B);
- INIT_KEY(XK_n, REDKEY_N);
- INIT_KEY(XK_m, REDKEY_M);
- INIT_KEY(XK_comma, REDKEY_COMMA);
- INIT_KEY(XK_period, REDKEY_PERIOD);
- INIT_KEY(XK_slash, REDKEY_SLASH);
- INIT_KEY(XK_space, REDKEY_SPACE);
-}
-
-#undef INIT_KEY
-#define INIT_KEY(x, red) key_table_0xfe[x & 0xff] = red;
-
-static void init_key_table_0xfe()
-{
- for (int i = 0; i < sizeof(key_table_0xfe) / sizeof(key_table_0xfe[0]); i++) {
- key_table_0xfe[i] = REDKEY_INVALID;
- }
-
- INIT_KEY(XK_ISO_Level3_Shift, REDKEY_R_ALT);
-}
-
-static inline RedKey to_red_key_code(unsigned int keycode)
-{
- XLockDisplay(x_display);
- KeySym sym = XKeycodeToKeysym(x_display, keycode, 0);
- XUnlockDisplay(x_display);
- RedKey red_key;
-
- if (sym == NoSymbol) {
- DBG(0, "no symbol for %d", keycode);
- }
-
- switch (sym >> 8) {
- case 0x00:
- red_key = key_table_0x00[sym & 0xff];
- break;
- case 0xff:
- red_key = key_table_0xff[sym & 0xff];
- break;
- case 0xfe:
- red_key = key_table_0xfe[sym & 0xff];
- break;
- default:
- DBG(0, "unsupported key set %lu", (sym >> 8));
- return REDKEY_INVALID;
- }
-
- if (red_key == REDKEY_INVALID) {
- DBG(0, "no valid key mapping for keycode %u", keycode);
- }
- return red_key;
-}
-
-#endif
-
-static inline int to_red_buttons_state(unsigned int state)
-{
- return ((state & Button1Mask) ? SPICE_MOUSE_BUTTON_MASK_LEFT : 0) |
- ((state & Button2Mask) ? SPICE_MOUSE_BUTTON_MASK_MIDDLE : 0) |
- ((state & Button3Mask) ? SPICE_MOUSE_BUTTON_MASK_RIGHT : 0);
-}
-
-static inline SpiceMouseButton to_red_button(unsigned int botton, unsigned int& state, bool press)
-{
- unsigned int mask = 0;
- SpiceMouseButton ret;
-
- switch (botton) {
- case Button1:
- mask = SPICE_MOUSE_BUTTON_MASK_LEFT;
- ret = SPICE_MOUSE_BUTTON_LEFT;
- break;
- case Button2:
- mask = SPICE_MOUSE_BUTTON_MASK_MIDDLE;
- ret = SPICE_MOUSE_BUTTON_MIDDLE;
- break;
- case Button3:
- mask = SPICE_MOUSE_BUTTON_MASK_RIGHT;
- ret = SPICE_MOUSE_BUTTON_RIGHT;
- break;
- case Button4:
- ret = SPICE_MOUSE_BUTTON_UP;
- break;
- case Button5:
- ret = SPICE_MOUSE_BUTTON_DOWN;
- break;
- default:
- ret = SPICE_MOUSE_BUTTON_INVALID;
- }
- if (press) {
- state |= mask;
- } else {
- state &= ~mask;
- }
- return ret;
-}
-
-void RedWindow_p::handle_key_press_event(RedWindow& window, XKeyEvent* event)
-{
- static int buf_size = 0;
- static wchar_t* utf32_buf = NULL;
-
- KeySym key_sym;
- Status status;
- int len;
-
- window.get_listener().on_key_press(to_red_key_code(event->keycode));
-
- if (x_input_context != NULL) {
- for (;;) {
- XLockDisplay(x_display);
- len = XwcLookupString(x_input_context, event, utf32_buf, buf_size, &key_sym, &status);
- XUnlockDisplay(x_display);
- if (status != XBufferOverflow) {
- break;
- }
-
- if (utf32_buf) {
- delete [] utf32_buf;
- }
- utf32_buf = new wchar_t[len];
- buf_size = len;
- }
-
- switch (status) {
- case XLookupChars:
- case XLookupBoth: {
- uint32_t* now = (uint32_t*)utf32_buf;
- uint32_t* end = now + len;
-
- for (; now < end; now++) {
- window.get_listener().on_char(*now);
- }
- break;
- }
-
- case XLookupNone:
- case XLookupKeySym:
- break;
- default:
- THROW("unexpected status %d", status);
- }
- } else { /* no XIM */
- unsigned char buffer[16];
- int i;
-
- XLockDisplay(x_display);
- len = XLookupString(event, (char *)buffer, sizeof(buffer), NULL, NULL);
- XUnlockDisplay(x_display);
- for (i = 0; i < len; i++) {
- window.get_listener().on_char((uint32_t)buffer[i]);
- }
- }
-}
-
-void RedWindow_p::win_proc(XEvent& event)
-{
- XPointer window_pointer;
- RedWindow* red_window;
- int res;
-
- XLockDisplay(x_display);
- res = XFindContext(x_display, event.xany.window, user_data_context, &window_pointer);
- XUnlockDisplay(x_display);
- if (res) {
- THROW("no user data");
- }
- red_window = (RedWindow*)window_pointer;
- switch (event.type) {
- case MotionNotify: {
- SpicePoint size = red_window->get_size();
- if (event.xmotion.x >= 0 && event.xmotion.y >= 0 &&
- event.xmotion.x < size.x && event.xmotion.y < size.y) {
- SpicePoint origin = red_window->get_origin();
- red_window->get_listener().on_pointer_motion(event.xmotion.x - origin.x,
- event.xmotion.y - origin.y,
- to_red_buttons_state(event.xmotion.state));
- }
- break;
- }
- case KeyPress:
- red_window->handle_key_press_event(*red_window, &event.xkey);
- red_window->_last_event_time = event.xkey.time;
- XChangeProperty(x_display, red_window->_win, wm_user_time,
- XA_CARDINAL, 32, PropModeReplace,
- (unsigned char *)&event.xkey.time, 1);
- break;
- case KeyRelease: {
- RedKey key = to_red_key_code(event.xkey.keycode);
- XEvent next_event;
- XLockDisplay(x_display);
- Bool check = XCheckWindowEvent(x_display, red_window->_win, ~long(0), &next_event);
- XUnlockDisplay(x_display);
- if (check) {
- XPutBackEvent(x_display, &next_event);
- if ((next_event.type == KeyPress) &&
- (event.xkey.keycode == next_event.xkey.keycode) &&
- (event.xkey.time == next_event.xkey.time)) {
- break;
- }
- }
- if (key != REDKEY_KOREAN_HANGUL && key != REDKEY_KOREAN_HANGUL_HANJA) {
- red_window->get_listener().on_key_release(key);
- }
- break;
- }
- case ButtonPress: {
- unsigned int state = to_red_buttons_state(event.xbutton.state);
- SpiceMouseButton button = to_red_button(event.xbutton.button, state, true);
- if (button == SPICE_MOUSE_BUTTON_INVALID) {
- DBG(0, "ButtonPress: invalid button %u", event.xbutton.button);
- break;
- }
- red_window->get_listener().on_mouse_button_press(button, state);
- red_window->_last_event_time = event.xkey.time;
- XChangeProperty(x_display, red_window->_win, wm_user_time,
- XA_CARDINAL, 32, PropModeReplace,
- (unsigned char *)&event.xbutton.time, 1);
- break;
- }
- case ButtonRelease: {
- unsigned int state = to_red_buttons_state(event.xbutton.state);
- SpiceMouseButton button = to_red_button(event.xbutton.button, state, false);
- if (button == SPICE_MOUSE_BUTTON_INVALID) {
- DBG(0, "ButtonRelease: invalid button %u", event.xbutton.button);
- break;
- }
- red_window->get_listener().on_mouse_button_release(button, state);
- break;
- }
- case Expose: {
- SpicePoint origin;
- SpiceRect area;
-
- origin = red_window->get_origin();
- area.left = event.xexpose.x - origin.x;
- area.right = area.left + event.xexpose.width;
- area.top = event.xexpose.y - origin.y;
- area.bottom = area.top + event.xexpose.height;
- red_window->get_listener().on_exposed_rect(area);
- break;
- }
- case FocusIn:
- /* Ignore focus events caused by grabbed (hotkeys) */
- if (event.xfocus.mode == NotifyWhileGrabbed) {
- break;
- }
-
- if (event.xany.serial < focus_serial) {
- DBG(0, "Ignored FocusIn win=%p (serial=%d, Last foucs serial=%d)",
- red_window, event.xany.serial, focus_serial);
- break;
- }
-
- if (!red_window->_ignore_foucs) {
- RedWindow* prev_focus_window = focus_window;
- focus_window = red_window;
- focus_serial = event.xany.serial;
- if (prev_focus_window && (red_window != prev_focus_window)) {
- prev_focus_window->on_focus_out();
- }
- red_window->on_focus_in();
- } else {
- red_window->_shadow_foucs_state = true;
- memcpy(&red_window->_shadow_focus_event, &event, sizeof(XEvent));
- }
- break;
- case FocusOut:
- /* Ignore focus events caused by grabbed (hotkeys) */
- if (event.xfocus.mode == NotifyWhileGrabbed) {
- break;
- }
-
- if (event.xany.serial <= focus_serial) {
- DBG(0, "Ignored FocusOut win=%p (serial=%d, Last foucs serial=%d)",
- red_window, event.xany.serial, focus_serial);
- break;
- }
-
- if (!red_window->_ignore_foucs) {
- focus_serial = event.xany.serial;
- if (red_window != focus_window) {
- break;
- }
- focus_window = NULL;
- red_window->on_focus_out();
- } else {
- red_window->_shadow_foucs_state = false;
- memcpy(&red_window->_shadow_focus_event, &event, sizeof(XEvent));
- }
- break;
- case ConfigureNotify:
- break;
- case ClientMessage:
- if (event.xclient.message_type == wm_protocol_atom) {
- ASSERT(event.xclient.format == 32);
- if ((Atom)event.xclient.data.l[0] == wm_delete_window_atom) {
- DBG(0, "wm_delete_window");
- Platform::send_quit_request();
- }
- }
- break;
- case DestroyNotify:
- break;
- case MapNotify:
- red_window->set_visibale(true);
- break;
- case UnmapNotify:
- red_window->set_visibale(false);
- break;
- case EnterNotify:
- if (!red_window->_ignore_pointer) {
- SpicePoint origin = red_window->get_origin();
- red_window->on_pointer_enter(event.xcrossing.x - origin.x, event.xcrossing.y - origin.y,
- to_red_buttons_state(event.xcrossing.state));
- } else {
- red_window->_shadow_pointer_state = true;
- memcpy(&red_window->_shadow_pointer_event, &event, sizeof(XEvent));
- }
- break;
- case LeaveNotify:
- if (!red_window->_ignore_pointer) {
- red_window->on_pointer_leave();
- } else {
- red_window->_shadow_pointer_state = false;
- memcpy(&red_window->_shadow_pointer_event, &event, sizeof(XEvent));
- }
- break;
- }
-}
-
-void RedWindow_p::sync(bool shadowed)
-{
- XEvent event;
-
- if (shadowed) {
- _ignore_foucs = true;
- _ignore_pointer = true;
- _shadow_foucs_state = _focused;
- _shadow_pointer_state = _pointer_in_window;
- _shadow_focus_event.xany.serial = 0;
- }
-
- XLockDisplay(x_display);
- XSync(x_display, False);
- while (XCheckWindowEvent(x_display, _win, ~long(0), &event)) {
- XUnlockDisplay(x_display);
- win_proc(event);
- XLockDisplay(x_display);
- }
- XUnlockDisplay(x_display);
-
- if (!shadowed) {
- return;
- }
- _ignore_foucs = false;
- _ignore_pointer = false;
- if (_shadow_foucs_state != _focused) {
- DBG(0, "put back shadowed focus event");
- XPutBackEvent(x_display, &_shadow_focus_event);
- } else if (_shadow_focus_event.xany.serial > 0) {
- focus_serial = _shadow_focus_event.xany.serial;
- }
- if (_shadow_pointer_state != _pointer_in_window) {
- DBG(0, "put back shadowed pointer event");
- XPutBackEvent(x_display, &_shadow_pointer_event);
- }
-}
-
-void RedWindow_p::wait_for_reparent()
-{
- XEvent event;
- for (int i = 0; i < 50; i++) {
- XLockDisplay(x_display);
- bool check = XCheckTypedWindowEvent(x_display, _win, ReparentNotify, &event);
- XUnlockDisplay(x_display);
- if (check) {
- return;
- }
- usleep(20 * 1000);
- // HDG: why?? this makes no sense
- XLockDisplay(x_display);
- XSync(x_display, False);
- XUnlockDisplay(x_display);
- }
- DBG(0, "failed");
-}
-
-void RedWindow_p::wait_for_map()
-{
- bool wait_parent = _expect_parent;
- while (!_visibale) {
- XEvent event;
- XLockDisplay(x_display);
- XWindowEvent(x_display, _win, ~0, &event);
- XUnlockDisplay(x_display);
- switch (event.type) {
- case ReparentNotify:
- wait_parent = false;
- break;
- case MapNotify:
- _visibale = true;
- break;
- default:
- //todo: post state messages to app message queue instead of
- // calling win_proc
- win_proc(event);
- }
- }
-
- if (wait_parent) {
- wait_for_reparent();
- }
-}
-
-void RedWindow_p::wait_for_unmap()
-{
- bool wait_parent = _expect_parent;
- while (_visibale) {
- XEvent event;
- XLockDisplay(x_display);
- XWindowEvent(x_display, _win, ~0, &event);
- XUnlockDisplay(x_display);
- switch (event.type) {
- case ReparentNotify:
- wait_parent = false;
- break;
- case UnmapNotify:
- _visibale = false;
- break;
- //default:
- // win_proc(event);
- }
- }
-
- if (wait_parent) {
- wait_for_reparent();
- }
-}
-
-void RedWindow_p::set_minmax(PixelsSource_p& pix_source)
-{
- //todo: auto res
- XSizeHints* size_hints = XAllocSizeHints();
- ASSERT(size_hints);
- size_hints->flags = PMinSize | PMaxSize;
- if (_red_window->_type == RedWindow::TYPE_FULLSCREEN) {
- /* Some window managers won't allow full screen mode with a fixed
- width / height */
- size_hints->min_width = 1;
- size_hints->max_width = 65535;
- size_hints->min_height = 1;
- size_hints->max_height = 65535;
- } else {
- size_hints->min_width = size_hints->max_width = _width;
- size_hints->min_height = size_hints->max_height = _height;
- }
- XSetWMNormalHints(x_display, _win, size_hints);
- XFree(size_hints);
- pix_source.x_drawable.height = _height;
- pix_source.x_drawable.width = _width;
-}
-
-Cursor RedWindow_p::create_invisible_cursor(Window window)
-{
- XColor color;
- char data[1] = {0};
- Window root_window = RootWindow(x_display, DefaultScreen(x_display));
- XLockDisplay(x_display);
- Pixmap blank = XCreateBitmapFromData(x_display, root_window, data, 1, 1);
- Cursor cursor = XCreatePixmapCursor(x_display, blank, blank, &color, &color, 0, 0);
- XUnlockDisplay(x_display);
- XFreePixmap(x_display, blank);
- return cursor;
-}
-
-RedWindow_p::RedWindow_p()
- : _win (None)
- , _show_pos_valid (false)
- , _icon (NULL)
- , _focused (false)
- , _ignore_foucs (false)
- , _pointer_in_window (false)
- , _ignore_pointer (false)
- ,_width (200)
- ,_height (200)
- ,_last_event_time (0)
-{
-}
-
-void RedWindow_p::destroy(RedWindow& red_window, PixelsSource_p& pix_source)
-{
- XEvent event;
-
- if (_win == None) {
- return;
- }
-
- if (focus_window == &red_window) {
- focus_window = NULL;
- red_window.on_focus_out();
- }
-
- XPlatform::cleare_win_proc(_win);
- XSelectInput(x_display, _win, 0);
-
- XLockDisplay(x_display);
- XSync(x_display, False);
- while (XCheckWindowEvent(x_display, _win, ~long(0), &event));
- XUnlockDisplay(x_display);
-
- Window window = _win;
- _win = None;
- XFreeCursor(x_display, _invisible_cursor);
- _invisible_cursor = None;
- XDeleteContext(x_display, window, user_data_context);
- XDestroyWindow(x_display, window);
- XFreeColormap(x_display, _colormap);
- XFreeGC(x_display, pix_source.x_drawable.gc);
- pix_source.x_drawable.gc = NULL;
- pix_source.x_drawable.drawable = None;
- if (_icon) {
- _icon->unref();
- }
-}
-
-void RedWindow_p::create(RedWindow& red_window, PixelsSource_p& pix_source,
- int x, int y, int in_screen)
-{
- Window window = None;
- Cursor cursor = None;
- GC gc = NULL;
-
- Window root_window = RootWindow(x_display, in_screen);
- XSetWindowAttributes win_attributes;
-
- unsigned long mask = CWBorderPixel | CWEventMask;
- win_attributes.border_pixel = 1;
- win_attributes.event_mask = StructureNotifyMask | SubstructureNotifyMask | ExposureMask |
- KeyPressMask | KeyReleaseMask | ButtonPressMask |
- ButtonReleaseMask | PointerMotionMask | FocusChangeMask |
- EnterWindowMask | LeaveWindowMask;
-
- XLockDisplay(x_display);
- _colormap = XCreateColormap(x_display, root_window, XPlatform::get_vinfo()[in_screen]->visual,
- AllocNone);
- win_attributes.colormap = _colormap;
- mask |= CWColormap;
- window = XCreateWindow(x_display, root_window, x, y,
- _width, _height, 0, XPlatform::get_vinfo()[in_screen]->depth,
- InputOutput, XPlatform::get_vinfo()[in_screen]->visual, mask,
- &win_attributes);
- XUnlockDisplay(x_display);
-
- if (!window) {
- THROW("create X window failed");
- }
-
- try {
- int res;
- XClassHint *class_hint;
-
- XLockDisplay(x_display);
- res = XSaveContext(x_display, window, user_data_context, (XPointer)&red_window);
- XUnlockDisplay(x_display);
- if (res) {
- THROW("set win usr data failed");
- }
-
- XSetWMProtocols(x_display, window, &wm_delete_window_atom, 1);
- class_hint = XAllocClassHint();
- if (!class_hint) {
- THROW("allocating class hint failed");
- }
- class_hint->res_name = (char *)"spicec";
- class_hint->res_class = (char *)"spicec";
- XSetClassHint(x_display, window, class_hint);
- XFree(class_hint);
-
- XGCValues gc_vals;
- XLockDisplay(x_display);
- gc = XCreateGC(x_display, window, 0, &gc_vals);
- XUnlockDisplay(x_display);
- if (!gc) {
- THROW("create gc failed");
- }
-
- cursor = create_invisible_cursor(window);
- if (!cursor) {
- THROW("create invisible cursor failed");
- }
-
- XPlatform::set_win_proc(window, win_proc);
- } catch (...) {
- if (gc) {
- XFreeGC(x_display, gc);
- }
-
- XDeleteContext(x_display, window, user_data_context);
- XDestroyWindow(x_display, window);
- if (cursor != None) {
- XFreeCursor(x_display, cursor);
- }
-
- throw;
- }
- _screen = in_screen;
- _win = window;
- _invisible_cursor = cursor;
- _show_pos.x = x;
- _show_pos.y = y;
- _visibale = false;
- _expect_parent = false;
- _red_window = &red_window;
- pix_source.type = PIXELS_SOURCE_TYPE_X_DRAWABLE;
- pix_source.x_drawable.drawable = window;
- pix_source.x_drawable.screen = _screen;
- pix_source.x_drawable.gc = gc;
- set_minmax(pix_source);
- sync();
-}
-
-void RedWindow_p::migrate(RedWindow& red_window, PixelsSource_p& pix_source, int to_screen)
-{
- if (to_screen == _screen) {
- return;
- }
- XTextProperty text_pro;
- XLockDisplay(x_display);
- bool valid_title = XGetWMName(x_display, _win, &text_pro) && text_pro.value;
- XUnlockDisplay(x_display);
- destroy(red_window, pix_source);
- create(red_window, pix_source, _show_pos.x, _show_pos.y, to_screen);
- if (valid_title) {
- XSetWMName(x_display, _win, &text_pro);
- XFree(text_pro.value); //???
- }
- if (_icon) {
- AutoRef<Icon> red(_icon->ref());
- red_window.set_icon(_icon);
- }
-}
-
-void RedWindow_p::move_to_current_desktop()
-{
- Window root = RootWindow(x_display, _screen);
- Atom actual_type_return;
- int actual_format_return;
- unsigned long bytes_after_return;
- unsigned long nitems_return;
- unsigned char *prop_return;
- long desktop = ~long(0);
- int status;
-
- XLockDisplay(x_display);
- status = XGetWindowProperty(x_display, root, wm_current_desktop, 0, 1, False, AnyPropertyType,
- &actual_type_return, &actual_format_return, &nitems_return,
- &bytes_after_return, &prop_return);
- if ((status == Success) && (actual_type_return != None) && (actual_format_return == 32)) {
- desktop = *(uint32_t *)prop_return;
- } else {
- DBG(0, "get current desktop failed");
- }
- if (status == Success)
- XFree(prop_return);
- XUnlockDisplay(x_display);
-
- XEvent xevent;
- xevent.type = ClientMessage;
- xevent.xclient.window = _win;
- xevent.xclient.message_type = wm_desktop;
- xevent.xclient.format = 32;
- xevent.xclient.data.l[0] = desktop;
- xevent.xclient.data.l[1] = 0;
- xevent.xclient.data.l[2] = 0;
- xevent.xclient.data.l[3] = 0;
- xevent.xclient.data.l[4] = 0;
- if (!XSendEvent(x_display, root, False, SubstructureNotifyMask | SubstructureRedirectMask,
- &xevent)) {
- DBG(0, "failed");
- }
-}
-
-RedWindow::RedWindow(RedWindow::Listener& listener, int screen)
- : _listener (listener)
- , _type (TYPE_NORMAL)
- , _local_cursor (NULL)
- , _cursor_visible (true)
- , _trace_key_interception (false)
- , _key_interception_on (false)
- , _menu (NULL)
-{
- ASSERT(x_display);
- create(*this, *(PixelsSource_p*)get_opaque(), 0, 0,
- (screen == DEFAULT_SCREEN) ? DefaultScreen(x_display) : screen);
-}
-
-RedWindow::~RedWindow()
-{
- destroy(*this, *(PixelsSource_p*)get_opaque());
- if (_local_cursor) {
- _local_cursor->unref();
- }
-}
-
-void RedWindow::set_title(std::string& title)
-{
- XTextProperty text_prop;
- char *name = const_cast<char *>(title.c_str());
- int r;
- if (_win) {
- XLockDisplay(x_display);
- r = Xutf8TextListToTextProperty(x_display, &name, 1, XUTF8StringStyle, &text_prop);
- XUnlockDisplay(x_display);
- if (r == Success) {
- XSetWMName(x_display, _win, &text_prop);
- XFree(text_prop.value);
- } else {
- LOG_WARN("XwcTextListToTextProperty Error %d", r);
- }
- }
-}
-
-void RedWindow::set_icon(Icon* icon)
-{
- if (_icon) {
- _icon->unref();
- _icon = NULL;
- }
- if (!icon) {
- return;
- }
- _icon = icon->ref();
-
- XWMHints* wm_hints;
- if (_win == None || !(wm_hints = XAllocWMHints())) {
- return;
- }
-
- try {
- XIcon* xicon = (XIcon*)icon;
- xicon->get_pixmaps(_screen, wm_hints->icon_pixmap, wm_hints->icon_mask);
- wm_hints->flags = IconPixmapHint | IconMaskHint;
- XSetWMHints(x_display, _win, wm_hints);
- } catch (...) {
- }
- XFree(wm_hints);
-}
-
-static XErrorHandler old_error_handler = NULL;
-static unsigned char x_error = Success;
-
-static int x_error_handler(Display* display, XErrorEvent* error_event)
-{
- x_error = error_event->error_code;
- if (error_event->error_code == BadWindow) {
- return 0;
- }
- ASSERT(old_error_handler);
- XSetErrorHandler(old_error_handler);
- old_error_handler(display, error_event);
- old_error_handler = NULL;
- return 0;
-}
-
-class AutoXErrorHandler {
-public:
- AutoXErrorHandler()
- {
- ASSERT(old_error_handler == NULL);
- XLockDisplay(x_display);
- XSync(x_display, False);
- x_error = Success;
- old_error_handler = XSetErrorHandler(x_error_handler);
- XUnlockDisplay(x_display);
- }
-
- ~AutoXErrorHandler()
- {
- if (old_error_handler) {
- XLockDisplay(x_display);
- XSetErrorHandler(old_error_handler);
- XUnlockDisplay(x_display);
- old_error_handler = NULL;
- }
- }
-};
-
-static Window get_window_for_reposition(Window window)
-{
- for (;;) {
- Window root;
- Window parent;
- Window* childrens;
- unsigned int num_childrens;
- int res;
-
- XLockDisplay(x_display);
- res = XQueryTree(x_display, window, &root, &parent, &childrens, &num_childrens);
- XUnlockDisplay(x_display);
- if (!res) {
- return None;
- }
-
- if (childrens) {
- XFree(childrens);
- }
-
- if (parent == root) {
- break;
- }
- window = parent;
- }
- return window;
-}
-
-void RedWindow::raise()
-{
- AutoXErrorHandler auto_error_handler;
- int raise_retries = RAISE_RETRIES;
- for (;; --raise_retries) {
- Window window = get_window_for_reposition(_win);
- if (window != None) {
- x_error = Success;
- XRaiseWindow(x_display, window);
- if (x_error == Success) {
- break;
- }
- if (x_error != BadWindow) {
- THROW("XRaiseWindow failed");
- }
- }
-
- if (!raise_retries) {
- THROW("failed");
- }
- usleep(X_RETRY_DELAY_MICRO);
- }
- if (raise_retries < RAISE_RETRIES) {
- DBG(0, "retries %d", (RAISE_RETRIES - raise_retries));
- }
- sync();
-}
-
-void RedWindow::position_after(RedWindow *after)
-{
- if (!after || after->_screen != _screen) {
- raise();
- return;
- }
-
- AutoXErrorHandler auto_error_handler;
- int position_retries = Z_POSITION_RETRIES;
- for (;; --position_retries) {
- Window sibling = get_window_for_reposition(after->get_window());
- Window self = get_window_for_reposition(_win);
- if (sibling != None && self != None) {
- XWindowChanges changes;
- changes.sibling = sibling;
- changes.stack_mode = Below;
- x_error = Success;
- XConfigureWindow(x_display, self, CWSibling | CWStackMode, &changes);
- if (x_error == Success) {
- break;
- }
- if (x_error != BadWindow) {
- THROW("XConfigureWindow failed");
- }
- }
-
- if (!position_retries) {
- THROW("failed");
- }
- usleep(X_RETRY_DELAY_MICRO);
- }
- if (position_retries < Z_POSITION_RETRIES) {
- DBG(0, "retries %d", (Z_POSITION_RETRIES - position_retries));
- }
-}
-
-void RedWindow::show(int screen_id)
-{
- if (_visibale) {
- return;
- }
-
- bool wait_parent;
-
- if (screen_id != _screen) {
- _listener.pre_migrate();
- migrate(*this, *(PixelsSource_p*)get_opaque(), screen_id);
- _listener.post_migrate();
- }
-
- /* We must update min/max for fullscreen / normal switching */
- set_minmax(*(PixelsSource_p*)get_opaque());
-
- if (_type == TYPE_FULLSCREEN) {
- Atom state[2];
- state[0] = wm_state_above;
- state[1] = wm_state_fullscreen;
- XChangeProperty(x_display, _win, wm_state, XA_ATOM, 32, PropModeReplace,
- (unsigned char*)state, 2);
- wait_parent = false;
- } else {
- XDeleteProperty(x_display, _win, wm_state);
- wait_parent = true;
- }
- if (_last_event_time != 0)
- XChangeProperty(x_display, _win, wm_user_time, XA_CARDINAL, 32,
- PropModeReplace, (unsigned char *)&_last_event_time, 1);
- XMapWindow(x_display, _win);
- move_to_current_desktop();
- _expect_parent = wait_parent;
- wait_for_map();
- if (_show_pos_valid) {
- move(_show_pos.x, _show_pos.y);
- }
-}
-
-static bool get_prop_32(Window win, Atom prop, uint32_t &val)
-{
- Atom actual_type_return;
- int actual_format_return;
- unsigned long bytes_after_return;
- unsigned long nitems_return;
- unsigned char *prop_return;
- bool retval = false;
-
- XLockDisplay(x_display);
- if (XGetWindowProperty(x_display, win, prop, 0, 1, False, AnyPropertyType,
- &actual_type_return, &actual_format_return,
- &nitems_return, &bytes_after_return, &prop_return) == Success &&
- nitems_return == 1 &&
- actual_type_return != None &&
- actual_format_return == 32) {
- val = *(uint32_t *)prop_return;
- retval = true;
- }
- XUnlockDisplay(x_display);
-
- return retval;
-}
-
-void RedWindow::external_show()
-{
- Atom atom;
-
- DBG(0, "");
- show(_screen);
- raise();
- activate();
-
- XLockDisplay(x_display);
- atom = XInternAtom(x_display, "_NET_ACTIVE_WINDOW", true);
- XUnlockDisplay(x_display);
- if (atom != None) {
- Window root;
- XEvent xev;
- long eventmask;
-
- xev.xclient.type = ClientMessage;
- xev.xclient.serial = 0;
- xev.xclient.send_event = True;
- xev.xclient.window = _win;
- xev.xclient.message_type = atom;
-
- xev.xclient.format = 32;
- xev.xclient.data.l[0] = 1;
-
- uint32_t user_time;
- if (get_prop_32(_win, wm_user_time, user_time)) {
- xev.xclient.data.l[1] = user_time;
- } else {
- xev.xclient.data.l[1] = 0;
- }
- xev.xclient.data.l[2] = 0;
- xev.xclient.data.l[3] = 0;
- xev.xclient.data.l[4] = 0;
-
- root = RootWindow(x_display, _screen),
- eventmask = SubstructureRedirectMask | SubstructureNotifyMask;
-
- XSendEvent(x_display, root, False, eventmask, &xev);
- }
-}
-
-void RedWindow::hide()
-{
- if (!_visibale) {
- return;
- }
- on_pointer_leave();
- on_focus_out();
- XUnmapWindow(x_display, _win);
- _show_pos = get_position();
- _show_pos_valid = true;
- wait_for_unmap();
- ASSERT(!_focused);
- ASSERT(!_pointer_in_window);
- _expect_parent = false;
-}
-
-static void send_expose(Window window, int width, int height)
-{
- XExposeEvent event;
- event.type = Expose;
- event.display = x_display;
- event.window = window;
- event.x = 0;
- event.y = 0;
- event.width = width;
- event.height = height;
- event.count = 0;
- XSendEvent(x_display, window, False, ExposureMask, (XEvent *)&event);
-}
-
-void RedWindow::move_and_resize(int x, int y, int width, int height)
-{
- _width = width;
- _height = height;
- set_minmax(*(PixelsSource_p*)get_opaque());
- XMoveResizeWindow(x_display, _win, x, y, width, height);
- _show_pos.x = x;
- _show_pos.y = y;
- _show_pos_valid = true;
- if (_visibale) {
- send_expose(_win, width, height);
- }
-}
-
-void RedWindow::move(int x, int y)
-{
- XMoveWindow(x_display, _win, x, y);
- _show_pos.x = x;
- _show_pos.y = y;
- _show_pos_valid = true;
-}
-
-void RedWindow::resize(int width, int height)
-{
- _width = width;
- _height = height;
- set_minmax(*(PixelsSource_p*)get_opaque());
- XResizeWindow(x_display, _win, width, height);
- if (_visibale) {
- send_expose(_win, width, height);
- }
-}
-
-void RedWindow::activate()
-{
- //todo: use _NET_ACTIVE_WINDOW
- XSetInputFocus(x_display, _win, RevertToParent, CurrentTime);
- /* kwin won't raise on focus */
- XRaiseWindow(x_display, _win);
-}
-
-void RedWindow::minimize()
-{
- XIconifyWindow(x_display, _win, _screen);
- sync();
-}
-
-static bool __get_position(Window window, SpicePoint& pos)
-{
- pos.x = pos.y = 0;
- for (;;) {
- XWindowAttributes attrib;
- Window root;
- Window parent;
- Window* childrens;
- unsigned int num_childrens;
- int res;
-
- XLockDisplay(x_display);
- res = XGetWindowAttributes(x_display, window, &attrib);
- XUnlockDisplay(x_display);
- if (!res) {
- return false;
- }
- pos.x += attrib.x;
- pos.y += attrib.y;
-
- XLockDisplay(x_display);
- res = XQueryTree(x_display, window, &root, &parent, &childrens, &num_childrens);
- XUnlockDisplay(x_display);
- if (!res) {
- return false;
- }
-
- if (childrens) {
- XFree(childrens);
- }
-
- if (parent == None) {
- break;
- }
- window = parent;
- }
- return true;
-}
-
-SpicePoint RedWindow::get_position()
-{
- SpicePoint pos;
-
- AutoXErrorHandler auto_error_handler;
- int get_position_retries = GET_POSITION_RETRIES;
- for (;; --get_position_retries) {
- if (__get_position(_win, pos)) {
- break;
- }
- if (!get_position_retries) {
- THROW("failed");
- }
- usleep(X_RETRY_DELAY_MICRO);
- }
-
- if (get_position_retries < GET_POSITION_RETRIES) {
- DBG(0, "retries %d", (GET_POSITION_RETRIES - get_position_retries));
- }
- return pos;
-}
-
-void RedWindow::do_start_key_interception()
-{
- // Working with KDE: XGrabKeyboard generate focusout and focusin events
- // while we have the focus. This behavior trigger infinite recursive. for
- // that reason we temporary disable focus event handling. Same happens
- // LeaveNotify and EnterNotify.
-
- if (getenv("SPICE_NOGRAB"))
- return;
-
- ASSERT(_focused);
- XLockDisplay(x_display);
- XGrabKeyboard(x_display, _win, True, GrabModeAsync, GrabModeAsync, CurrentTime);
-
- XUnlockDisplay(x_display);
- sync(true);
- _listener.on_start_key_interception();
- _key_interception_on = true;
-}
-
-void RedWindow::do_stop_key_interception()
-{
- XLockDisplay(x_display);
- XUngrabKeyboard(x_display, CurrentTime);
- XUnlockDisplay(x_display);
- sync(true);
- _key_interception_on = false;
- _listener.on_stop_key_interception();
-}
-
-void RedWindow::start_key_interception()
-{
- if (_trace_key_interception) {
- return;
- }
- _trace_key_interception = true;
- if (_pointer_in_window && _focused) {
- do_start_key_interception();
- }
-}
-
-void RedWindow::stop_key_interception()
-{
- if (!_trace_key_interception) {
- return;
- }
- _trace_key_interception = false;
- if (_key_interception_on) {
- do_stop_key_interception();
- }
-}
-
-void RedWindow::set_cursor(LocalCursor* local_cursor)
-{
- ASSERT(local_cursor);
- if (_local_cursor) {
- _local_cursor->unref();
- }
- _local_cursor = local_cursor->ref();
- _local_cursor->set(_win);
- _cursor_visible = true;
-}
-
-void RedWindow::show_cursor()
-{
- if (!_cursor_visible) {
- if (_local_cursor) {
- _local_cursor->set(_win);
- }
- _cursor_visible = true;
- }
-}
-
-void RedWindow::hide_cursor()
-{
- if (_cursor_visible) {
- XDefineCursor(x_display, _win, _invisible_cursor);
- _cursor_visible = false;
- }
-}
-
-void RedWindow::release_mouse()
-{
- XLockDisplay(x_display);
- XUngrabPointer(x_display, CurrentTime);
- XUnlockDisplay(x_display);
- sync(true);
-}
-
-void RedWindow::capture_mouse()
-{
- if (getenv("SPICE_NOGRAB"))
- return;
-
- int grab_retries = MOUSE_GRAB_RETRIES;
- XLockDisplay(x_display);
- XSync(x_display, False);
- XUnlockDisplay(x_display);
- for (;; --grab_retries) {
- XLockDisplay(x_display);
- int result = XGrabPointer(x_display, _win, True, 0,
- GrabModeAsync, GrabModeAsync,
- _win, None, CurrentTime);
- XUnlockDisplay(x_display);
- if (result == GrabSuccess) {
- break;
- }
-
- if (!grab_retries) {
- THROW("grab pointer failed (%d)", result);
- }
- usleep(X_RETRY_DELAY_MICRO);
- DBG(0, "grab failed result=%d", result);
- }
- sync();
-}
-
-void RedWindow::set_mouse_position(int x, int y)
-{
- XWarpPointer(x_display, None, _win, 0, 0, 0, 0, x + get_origin().x, y + get_origin().y);
-}
-
-SpicePoint RedWindow::get_size()
-{
- XWindowAttributes attrib;
- XLockDisplay(x_display);
- XGetWindowAttributes(x_display, _win, &attrib);
- XUnlockDisplay(x_display);
- SpicePoint size;
- size.x = attrib.width;
- size.y = attrib.height;
- return size;
-}
-
-static void window_area_from_attributes(SpiceRect& area, XWindowAttributes& attrib)
-{
- area.left = attrib.x;
- area.right = area.left + attrib.width;
- area.top = attrib.y;
- area.bottom = area.top + attrib.height;
-}
-
-#define FAIL_ON_BAD_WINDOW(error, format, ...) \
- if (error) { \
- if ((x_error) == BadWindow) { \
- return NULL; \
- } \
- THROW(format, ## __VA_ARGS__); \
- }
-
-
-static QRegion *get_visibale_region(Window window)
-{
- QRegion* region = new QRegion;
- region_init(region);
- XWindowAttributes attrib;
- int res;
-
- XLockDisplay(x_display);
- res = XGetWindowAttributes(x_display, window, &attrib);
- XUnlockDisplay(x_display);
- if (!res) {
- return NULL;
- }
-
- if (attrib.map_state != IsViewable) {
- DBG(0, "not viewable");
- return region;
- }
-
- SpiceRect window_area;
- window_area_from_attributes(window_area, attrib);
- window_area.right -= window_area.left;
- window_area.bottom -= window_area.top;
- window_area.top = window_area.left = 0;
- region_add(region, &window_area);
- Window prev = None;
- Window root;
- Window parent;
- Window* childrens;
- unsigned int num_childrens;
-
- AutoXErrorHandler auto_error_handler;
- for (;;) {
- int res;
-
- XLockDisplay(x_display);
- res = XQueryTree(x_display, window, &root, &parent, &childrens,
- &num_childrens);
- XUnlockDisplay(x_display);
- FAIL_ON_BAD_WINDOW(!res,
- "%s: query X tree failed", __FUNCTION__);
- for (int i = num_childrens - 1; i >= 0 && childrens[i] != prev; i--) {
-
- XLockDisplay(x_display);
- res = XGetWindowAttributes(x_display, childrens[i], &attrib);
- XUnlockDisplay(x_display);
- FAIL_ON_BAD_WINDOW(!res,
- "%s: get win attributes failed", __FUNCTION__);
-
- if (attrib.map_state == IsViewable) {
- window_area_from_attributes(window_area, attrib);
- window_area.left -= attrib.border_width;
- window_area.right += attrib.border_width;
- window_area.top -= attrib.border_width;
- window_area.bottom += attrib.border_width;
- region_remove(region, &window_area);
- }
- }
-
- if (childrens) {
- XFree(childrens);
- }
-
- XLockDisplay(x_display);
- res = XGetWindowAttributes(x_display, window, &attrib);
- XUnlockDisplay(x_display);
- FAIL_ON_BAD_WINDOW(!res,
- "%s: get win attributes failed", __FUNCTION__);
- window_area_from_attributes(window_area, attrib);
- region_offset(region, window_area.left, window_area.top);
-
- if (parent == None) {
- break;
- }
-
- XLockDisplay(x_display);
- res = XGetWindowAttributes(x_display, parent, &attrib);
- XUnlockDisplay(x_display);
- FAIL_ON_BAD_WINDOW(!res,
- "%s: get win attributes failed", __FUNCTION__);
- window_area_from_attributes(window_area, attrib);
- window_area.right -= window_area.left;
- window_area.bottom -= window_area.top;
- window_area.top = window_area.left = 0;
-
- QRegion parent_region;
- region_init(&parent_region);
- region_add(&parent_region, &window_area);
- region_and(region, &parent_region);
- region_destroy(&parent_region);
-
- prev = window;
- window = parent;
- }
-
- //todo: intersect with monitors
- return region;
-}
-
-class Region_p {
-public:
- Region_p(QRegion* region) : _region (region) {}
- ~Region_p() { delete _region;}
-
- void get_bbox(SpiceRect& bbox) const
- {
- if (region_is_empty(_region)) {
- bbox.left = bbox.right = bbox.top = bbox.bottom = 0;
- } else {
- bbox.left = _region->extents.x1;
- bbox.top = _region->extents.y1;
- bbox.right = _region->extents.x2;
- bbox.bottom = _region->extents.y2;
- }
- }
-
- bool contains_point(int x, int y) const
- {
- return region_contains_point(_region, x, y);
- }
-
-private:
- QRegion* _region;
-};
-
-bool RedWindow::get_mouse_anchor_point(SpicePoint& pt)
-{
- QRegion* vis_region;
- int vis_region_retries = GET_VIS_REGION_RETRIES;
-
- while (!(vis_region = get_visibale_region(_win))) {
- if (!vis_region_retries) {
- THROW("get visible region failed");
- }
- --vis_region_retries;
- usleep(X_RETRY_DELAY_MICRO);
- }
-
- if (vis_region_retries < GET_VIS_REGION_RETRIES) {
- DBG(0, "retries %d", (GET_VIS_REGION_RETRIES - vis_region_retries));
- }
-
- Region_p region(vis_region);
- if (!find_anchor_point(region, pt)) {
- return false;
- }
- SpicePoint position = get_position();
- pt.x -= (position.x + get_origin().x);
- pt.y -= (position.y + get_origin().y);
- return true;
-}
-
-#ifdef USE_OPENGL
-RedGlContext RedWindow::create_context_gl()
-{
- if (XPlatform::get_fbconfig()[_screen]) {
- XLockDisplay(x_display);
- RedGlContext context = glXCreateContext(x_display, XPlatform::get_vinfo()[_screen], NULL, GL_TRUE);
- XUnlockDisplay(x_display);
- return context;
- }
- return NULL;
-}
-
-RedPbuffer RedWindow::create_pbuff(int width, int height)
-{
- GLXPbuffer pbuff;
- GLXFBConfig** fb_config;
-
- int pbuf_attr[] = { GLX_PRESERVED_CONTENTS, True,
- GLX_PBUFFER_WIDTH, width,
- GLX_PBUFFER_HEIGHT, height,
- GLX_LARGEST_PBUFFER, False,
- 0, 0 };
-
- fb_config = XPlatform::get_fbconfig();
- XLockDisplay(XPlatform::get_display());
- pbuff = glXCreatePbuffer(XPlatform::get_display(), fb_config[_screen][0],
- pbuf_attr);
- XUnlockDisplay(XPlatform::get_display());
-
- return pbuff;
-}
-
-void RedWindow::untouch_context()
-{
- glXMakeCurrent(x_display, 0, 0);
-}
-
-void RedWindow::swap_gl()
-{
- PixelsSource_p *pix_source = (PixelsSource_p*)get_opaque();
- RedGlContext context = pix_source->x_drawable.context;
-
- if (!context)
- return;
-
- glXMakeCurrent(x_display, get_window(), context);
- glXSwapBuffers(x_display, get_window());
-}
-
-void RedWindow::set_type_gl()
-{
- PixelsSource_p *pix_source = (PixelsSource_p*)get_opaque();
-
- pix_source->type = PIXELS_SOURCE_TYPE_GL_DRAWABLE;
-}
-
-void RedWindow::unset_type_gl()
-{
- PixelsSource_p *pix_source = (PixelsSource_p*)get_opaque();
-
- pix_source->type = PIXELS_SOURCE_TYPE_X_DRAWABLE;
-}
-
-void RedWindow::set_gl_context(RedGlContext context)
-{
- PixelsSource_p *pix_source = (PixelsSource_p*)get_opaque();
-
- pix_source->x_drawable.context = context;
-}
-
-void RedWindow::set_render_pbuff(RedPbuffer pbuff)
-{
- PixelsSource_p *pix_source = (PixelsSource_p*)get_opaque();
-
- pix_source->x_drawable.rendertype = RENDER_TYPE_PBUFF;
- pix_source->x_drawable.pbuff = pbuff;
-}
-
-void RedWindow::set_render_fbo(GLuint fbo)
-{
- PixelsSource_p *pix_source = (PixelsSource_p*)get_opaque();
-
- pix_source->x_drawable.rendertype = RENDER_TYPE_FBO;
- pix_source->x_drawable.fbo = fbo;
-}
-#endif // USE_OPENGL
-
-int RedWindow::get_screen_num()
-{
- return _screen;
-}
-
-RedDrawable::Format RedWindow::get_format()
-{
- return XPlatform::get_screen_format(_screen);
-}
-
-void RedWindow::on_focus_in()
-{
- if (_focused) {
- return;
- }
- _focused = true;
- if (x_input_context) {
- XLockDisplay(x_display);
- XwcResetIC(x_input_context);
- XUnlockDisplay(x_display);
- }
- XPlatform::on_focus_in();
- get_listener().on_activate();
- if (_trace_key_interception && _pointer_in_window) {
- do_start_key_interception();
- }
-}
-
-void RedWindow::on_focus_out()
-{
- if (!_focused) {
- return;
- }
- _focused = false;
- if (_key_interception_on) {
- do_stop_key_interception();
- }
- get_listener().on_deactivate();
- XPlatform::on_focus_out();
-}
-
-void RedWindow::on_pointer_enter(int x, int y, unsigned int buttons_state)
-{
- if (_pointer_in_window) {
- return;
- }
- _pointer_in_window = true;
- _listener.on_pointer_enter(x, y, buttons_state);
- if (_focused && _trace_key_interception) {
- do_start_key_interception();
- }
-}
-
-void RedWindow::on_pointer_leave()
-{
- if (!_pointer_in_window) {
- return;
- }
- _pointer_in_window = false;
- _listener.on_pointer_leave();
- if (_key_interception_on) {
- do_stop_key_interception();
- }
-}
-
-int RedWindow::set_menu(Menu* menu)
-{
- return 0;
-}
-
-void RedWindow::init()
-{
- x_display = XPlatform::get_display();
- x_input_context = XPlatform::get_input_context();
- ASSERT(x_display);
- user_data_context = XUniqueContext();
-
- wm_protocol_atom = XInternAtom(x_display, "WM_PROTOCOLS", False);
- wm_delete_window_atom = XInternAtom(x_display, "WM_DELETE_WINDOW", False);
-
- wm_desktop = XInternAtom(x_display, "_NET_WM_DESKTOP", False);
- wm_current_desktop = XInternAtom(x_display, "_NET_CURRENT_DESKTOP", False);
-
- wm_state = XInternAtom(x_display, "_NET_WM_STATE", False);
- wm_state_above = XInternAtom(x_display, "_NET_WM_STATE_ABOVE", False);
- wm_state_fullscreen = XInternAtom(x_display, "_NET_WM_STATE_FULLSCREEN", False);
-
- wm_user_time = XInternAtom(x_display, "_NET_WM_USER_TIME", False);
-
-#ifdef USE_X11_KEYCODE
- init_key_map();
-#else
- init_key_table_0xff();
- init_key_table_0x00();
- init_key_table_0xfe();
-#endif
-}
-
-void RedWindow::cleanup()
-{
-}
diff --git a/client/x11/red_window_p.h b/client/x11/red_window_p.h
deleted file mode 100644
index 4856be05..00000000
--- a/client/x11/red_window_p.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_RED_WINDOW_P
-#define _H_RED_WINDOW_P
-
-#ifdef USE_OPENGL
-#include <GL/glx.h>
-#endif // USE_OPENGL
-#include <X11/Xdefs.h>
-#include <X11/Xlib.h>
-
-typedef Window Win;
-#ifdef USE_OPENGL
-typedef GLXContext RedGlContext;
-typedef GLXPbuffer RedPbuffer;
-#endif // USE_OPENGL
-
-class RedWindow;
-class Icon;
-struct PixelsSource_p;
-
-class RedWindow_p {
-public:
- RedWindow_p();
-
- void migrate(RedWindow& red_window, PixelsSource_p& pix_source, int dest_screen);
- void create(RedWindow& red_window, PixelsSource_p& pix_source,
- int x, int y, int in_screen);
- void destroy(RedWindow& red_window, PixelsSource_p& pix_source);
- void set_minmax(PixelsSource_p& pix_source);
- void wait_for_reparent();
- void wait_for_map();
- void wait_for_unmap();
- void sync(bool shadowed = false);
- void set_visibale(bool vis) { _visibale = vis;}
- void move_to_current_desktop();
- Window get_window() {return _win;}
-
- static void win_proc(XEvent& event);
- static Cursor create_invisible_cursor(Window window);
-
-#ifdef USE_OPENGL
- void set_glx(int width, int height);
-#endif // USE_OPENGL
- static void handle_key_press_event(RedWindow& red_window, XKeyEvent* event);
-
-protected:
- int _screen;
- Window _win;
- Cursor _invisible_cursor;
- bool _visibale;
- bool _expect_parent;
- SpicePoint _show_pos;
- bool _show_pos_valid;
- Icon* _icon;
- bool _focused;
- bool _ignore_foucs;
- bool _shadow_foucs_state;
- XEvent _shadow_focus_event;
- bool _pointer_in_window;
- bool _ignore_pointer;
- bool _shadow_pointer_state;
- XEvent _shadow_pointer_event;
- Colormap _colormap;
- RedWindow *_red_window;
- int _width;
- int _height;
- Time _last_event_time;
-};
-
-#endif
diff --git a/client/x11/res.cpp b/client/x11/res.cpp
deleted file mode 100644
index efbd8de1..00000000
--- a/client/x11/res.cpp
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-#include "resource.h"
-
-#include "images/alt_image.c"
-
-static const PixmapHeader alt_image = {
- (uint8_t *)_alt_image.pixel_data,
- _alt_image.width,
- _alt_image.height,
- _alt_image.width * 4,
-};
-
-typedef struct ResImage {
- int id;
- const PixmapHeader* image;
-} ResImage;
-
-static const ResImage res_image_map[] = {
- { ALT_IMAGE_RES_ID, &alt_image},
- {0, NULL},
-};
-
-const PixmapHeader *res_get_image(int id)
-{
- const ResImage *now = res_image_map;
- for (; now->image; now++) {
- if (now->id == id) {
- return now->image;
- }
- }
- return NULL;
-}
-
-#include "images/red_icon.c"
-
-static const IconHeader red_icon = {
- _red_icon.width,
- _red_icon.height,
- (uint8_t *)_red_icon.pixmap,
- (uint8_t *)_red_icon.mask,
-};
-
-typedef struct ResIcon {
- int id;
- const IconHeader* icon;
-} ResIcon;
-
-static const ResIcon res_icon_map[] = {
- { RED_ICON_RES_ID, &red_icon},
- {0, NULL},
-};
-
-const IconHeader *res_get_icon(int id)
-{
- const ResIcon *now = res_icon_map;
- for (; now->icon; now++) {
- if (now->id == id) {
- return now->icon;
- }
- }
- return NULL;
-}
diff --git a/client/x11/x_icon.cpp b/client/x11/x_icon.cpp
deleted file mode 100644
index edd983f1..00000000
--- a/client/x11/x_icon.cpp
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "x_icon.h"
-#include "platform.h"
-#include "x_platform.h"
-#include "res.h"
-#include "utils.h"
-#include "debug.h"
-
-typedef std::map<int, XIcon*> IconsMap;
-static IconsMap res_icons;
-
-XIcon::XIcon(int id, const IconHeader *icon)
- : _id (id)
- , _raw_icon (icon)
-{
- res_icons[id] = this;
-}
-
-XIcon::~XIcon()
-{
- Display* x_display = XPlatform::get_display();
- while (!_screen_icons.empty()) {
- std::map<int, ScreenIcon>::iterator iter = _screen_icons.begin();
- XFreePixmap(x_display, (*iter).second.pixmap);
- XFreePixmap(x_display, (*iter).second.mask);
- _screen_icons.erase(iter);
- }
- IconsMap::iterator iter = res_icons.find(_id);
- res_icons.erase(iter);
-}
-
-void XIcon::get_pixmaps(int screen, Pixmap& out_pixmap, Pixmap& out_mask)
-{
- std::map<int, ScreenIcon>::iterator iter = _screen_icons.find(screen);
- if (iter != _screen_icons.end()) {
- out_pixmap = (*iter).second.pixmap;
- out_mask = (*iter).second.mask;
- return;
- }
-
- Display* x_display = XPlatform::get_display();
- Window root_window = RootWindow(x_display, screen);
-
- Pixmap pixmap = None;
- Pixmap mask = None;
- GC gc = NULL;
- try {
- XLockDisplay(x_display);
- pixmap = XCreatePixmap(x_display, root_window, _raw_icon->width, _raw_icon->height, 24);
- XUnlockDisplay(x_display);
- if (pixmap == None) {
- THROW("create pixmap failed");
- }
-
- XWindowAttributes attr;
-
- XLockDisplay(x_display);
- XGetWindowAttributes(x_display, root_window, &attr);
- XUnlockDisplay(x_display);
-
- XImage image;
- memset(&image, 0, sizeof(image));
- image.width = _raw_icon->width;
- image.height = _raw_icon->height;
- image.data = (char*)_raw_icon->pixmap;
- image.byte_order = LSBFirst;
- image.bitmap_unit = 32;
- image.bitmap_bit_order = LSBFirst;
- image.bitmap_pad = 32;
- image.bytes_per_line = _raw_icon->width * 4;
- image.depth = 24;
- image.format = ZPixmap;
- image.bits_per_pixel = 32;
- image.red_mask = 0x00ff0000;
- image.green_mask = 0x0000ff00;
- image.blue_mask = 0x000000ff;
-
- if (!XInitImage(&image)) {
- THROW("init image failed");
- }
-
- XGCValues gc_vals;
- gc_vals.function = GXcopy;
- gc_vals.foreground = ~0;
- gc_vals.background = 0;
- gc_vals.plane_mask = AllPlanes;
-
- XLockDisplay(x_display);
- gc = XCreateGC(x_display, pixmap, GCFunction | GCForeground | GCBackground | GCPlaneMask,
- &gc_vals);
- XPutImage(x_display, pixmap, gc, &image, 0, 0, 0, 0, image.width, image.height);
- // HDG: why ?? XFlush should suffice
- XSync(x_display, False);
- XFreeGC(x_display, gc);
- gc = NULL;
-
- mask = XCreatePixmap(x_display, root_window, _raw_icon->width, _raw_icon->height, 1);
- XUnlockDisplay(x_display);
- if (mask == None) {
- THROW("create mask failed");
- }
-
- memset(&image, 0, sizeof(image));
- image.width = _raw_icon->width;
- image.height = _raw_icon->height;
- image.data = (char*)_raw_icon->mask;
- image.byte_order = LSBFirst;
- image.bitmap_unit = 8;
- image.bitmap_bit_order = MSBFirst;
- image.bitmap_pad = 8;
- image.bytes_per_line = _raw_icon->width / 8;
- image.depth = 1;
- image.format = XYBitmap;
- if (!XInitImage(&image)) {
- THROW("init image failed");
- }
-
- XLockDisplay(x_display);
- gc = XCreateGC(x_display, mask, GCFunction | GCForeground | GCBackground | GCPlaneMask,
- &gc_vals);
- XPutImage(x_display, mask, gc, &image, 0, 0, 0, 0, image.width, image.height);
- // HDG: why ?? XFlush should suffice
- XSync(x_display, False);
- XUnlockDisplay(x_display);
- XFreeGC(x_display, gc);
- } catch (...) {
- if (gc) {
- XFreeGC(x_display, gc);
- }
- if (mask) {
- XFreePixmap(x_display, mask);
- }
- if (pixmap) {
- XFreePixmap(x_display, pixmap);
- }
- throw;
- }
- _screen_icons[screen] = ScreenIcon(pixmap, mask);
- out_pixmap = pixmap;
- out_mask = mask;
-}
-
-Icon* Platform::load_icon(int id)
-{
- IconsMap::iterator iter = res_icons.find(id);
- if (iter != res_icons.end()) {
- return (*iter).second->ref();
- }
-
- const IconHeader *icon = res_get_icon(id);
- if (!icon) {
- return NULL;
- }
- XIcon *xicon = new XIcon(id, icon);
- return xicon->ref();
-}
diff --git a/client/x11/x_icon.h b/client/x11/x_icon.h
deleted file mode 100644
index b8b5e96d..00000000
--- a/client/x11/x_icon.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_X_ICON
-#define _H_X_ICON
-
-#include <X11/Xlib.h>
-#include <map>
-
-#include "common.h"
-
-#include "icon.h"
-
-class XIcon: public Icon {
-public:
- XIcon(int id, const IconHeader *icon);
-
- void get_pixmaps(int screen, Pixmap& pixmap, Pixmap& mask);
-
-protected:
- virtual ~XIcon();
-
-private:
- int _id;
- const IconHeader* _raw_icon;
-
- class ScreenIcon {
- public:
- ScreenIcon(Pixmap in_pixmap, Pixmap in_mask) : pixmap (in_pixmap), mask (in_mask) {}
- ScreenIcon() : pixmap (None), mask (None) {}
-
- Pixmap pixmap;
- Pixmap mask;
- };
- std::map<int, ScreenIcon> _screen_icons;
-};
-
-#endif
diff --git a/client/x11/x_platform.h b/client/x11/x_platform.h
deleted file mode 100644
index 39a2d1c3..00000000
--- a/client/x11/x_platform.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_XPLATFORM
-#define _H_XPLATFORM
-
-#include "red_drawable.h"
-#include <X11/Xdefs.h>
-#include <X11/Xutil.h>
-#include <X11/extensions/XShm.h>
-
-class XPlatform {
-public:
- static Display* get_display();
- static XVisualInfo** get_vinfo();
- static RedDrawable::Format get_screen_format(int screen);
- static XIC get_input_context();
-#ifdef USE_OPENGL
- static GLXFBConfig** get_fbconfig();
-#endif // USE_OPENGL
-
- typedef void (*win_proc_t)(XEvent& event);
- static void set_win_proc(Window win, win_proc_t proc);
- static void cleare_win_proc(Window win);
-
- static void on_focus_in();
- static void on_focus_out();
-
- static bool is_x_shm_avail();
- static XImage *create_x_shm_image(RedDrawable::Format format,
- int width, int height, int depth,
- Visual *visual,
- XShmSegmentInfo **shminfo_out);
- static XImage *create_x_image(RedDrawable::Format format,
- int width, int height, int depth,
- Visual *visual,
- XShmSegmentInfo **shminfo_out);
- static void free_x_image(XImage *image,
- XShmSegmentInfo *shminfo);
-};
-
-#endif
diff --git a/client/zlib_decoder.cpp b/client/zlib_decoder.cpp
deleted file mode 100644
index f5741d3e..00000000
--- a/client/zlib_decoder.cpp
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- Copyright (C) 2010 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common.h"
-#include "zlib_decoder.h"
-#include "debug.h"
-#include "utils.h"
-
-static void op_decode(SpiceZlibDecoder *decoder,
- uint8_t *data,
- int data_size,
- uint8_t *dest,
- int dest_size)
-{
- ZlibDecoder* _decoder = static_cast<ZlibDecoder*>(decoder);
- _decoder->decode(data, data_size, dest, dest_size);
-}
-
-ZlibDecoder::ZlibDecoder()
-{
- int z_ret;
-
- _z_strm.zalloc = Z_NULL;
- _z_strm.zfree = Z_NULL;
- _z_strm.opaque = Z_NULL;
- _z_strm.next_in = Z_NULL;
- _z_strm.avail_in = 0;
- z_ret = inflateInit(&_z_strm);
- if (z_ret != Z_OK) {
- THROW("zlib decoder init failed, error %d", z_ret);
- }
-
- static SpiceZlibDecoderOps decoder_ops = {
- op_decode,
- };
-
- ops = &decoder_ops;
-}
-
-ZlibDecoder::~ZlibDecoder()
-{
- inflateEnd(&_z_strm);
-}
-
-
-void ZlibDecoder::decode(uint8_t *data, int data_size, uint8_t *dest, int dest_size)
-{
- int z_ret;
-
- inflateReset(&_z_strm);
- _z_strm.next_in = data;
- _z_strm.avail_in = data_size;
- _z_strm.next_out = dest;
- _z_strm.avail_out = dest_size;
-
- z_ret = inflate(&_z_strm, Z_FINISH);
-
- if (z_ret != Z_STREAM_END) {
- THROW("zlib inflate failed, error %d", z_ret);
- }
-}
diff --git a/configure.ac b/configure.ac
index cedeb401..ff13ee3a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,4 +1,4 @@
-AC_PREREQ([2.57])
+AC_PREREQ([2.69])
# Follow the libtool manual for the so version:
# http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
@@ -11,403 +11,212 @@ AC_PREREQ([2.57])
# - If any interfaces have been removed or changed since the last public release,
# then set age to 0.
#
-m4_define([SPICE_CURRENT], [10])
-m4_define([SPICE_REVISION], [0])
-m4_define([SPICE_AGE], [9])
+dnl TODO see server/spice-char.h TODO comment for API breakage
+m4_define([SPICE_CURRENT], [15])
+m4_define([SPICE_REVISION], [3])
+m4_define([SPICE_AGE], [14])
AC_INIT(spice, [m4_esyscmd(build-aux/git-version-gen .tarball-version)],
[spice-devel@lists.freedesktop.org], spice)
+major=`echo $PACKAGE_VERSION | cut -d. -f1`
+minor=`echo $PACKAGE_VERSION | cut -d. -f2`
+micro=`echo $PACKAGE_VERSION | cut -d. -f3`
+git=`echo $PACKAGE_VERSION | cut -d. -f4`
+if test x"$git" != x ; then
+ micro=$(($micro+1))
+fi
+SPICE_SERVER_VERSION=`printf "0x%02x%02x%02x" $major $minor $micro`
+AC_SUBST(SPICE_SERVER_VERSION)
+
AC_CONFIG_MACRO_DIR([m4])
-AM_CONFIG_HEADER([config.h])
+AC_CONFIG_HEADERS([config.h])
AC_CONFIG_AUX_DIR(.)
-# For automake >= 1.12
-m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
+AX_PTHREAD
-AM_INIT_AUTOMAKE([dist-bzip2 no-dist-gzip subdir-objects])
+AM_INIT_AUTOMAKE([dist-bzip2 no-dist-gzip subdir-objects foreign])
AM_MAINTAINER_MODE
AC_PROG_CC
-AC_PROG_CC_C99
if test x"$ac_cv_prog_cc_c99" = xno; then
AC_MSG_ERROR([C99 compiler is required.])
fi
-AC_PROG_CXX
AC_PROG_INSTALL
AC_CANONICAL_HOST
-AC_PROG_LIBTOOL
+LT_INIT([disable-static])
AM_PROG_CC_C_O
AC_C_BIGENDIAN
-AC_PATH_PROGS(PYTHON, python2 python)
PKG_PROG_PKG_CONFIG
-AC_CHECK_HEADERS([sys/time.h])
-AC_CHECK_HEADERS([execinfo.h])
-AC_CHECK_HEADERS([linux/sockios.h])
+AC_PROG_CXX
+AC_LANG_PUSH([C++])
+m4_ifndef([AX_CXX_COMPILE_STDCXX_11], [m4_fatal([Missing AX_CXX_COMPILE_STDCXX_11, install autoconf-archive])])
+AX_CXX_COMPILE_STDCXX_11
+AX_APPEND_COMPILE_FLAGS([-fno-exceptions -fno-check-new])
+AC_LANG_POP([C++])
+
+AC_CHECK_HEADERS([sys/time.h execinfo.h linux/sockios.h pthread_np.h])
+AC_CHECK_DECL([TCP_KEEPIDLE], [have_tcp_keepidle="yes"],,
+ [#include <netinet/tcp.h>])
+AS_IF([test "x$have_tcp_keepidle" = "xyes"],
+ [AC_DEFINE([HAVE_TCP_KEEPIDLE],1,[Define to 1 if <netinet/tcp.h> has a TCP_KEEPIDLE definition])],
+)
AC_FUNC_ALLOCA
-AC_DEFINE([__STDC_FORMAT_MACROS],[],[Force definition of format macros for C++])
-
SPICE_LT_VERSION=m4_format("%d:%d:%d", SPICE_CURRENT, SPICE_REVISION, SPICE_AGE)
AC_SUBST(SPICE_LT_VERSION)
# Check for the CPU we are using
-#
-AC_MSG_CHECKING(for x86, x86-64 or armv6+ platform)
case $host_cpu in
- i386|i486|i586|i686|i786|k6|k7|armv6|armv6l|armv6hl|armv7|armv7l|armv7hl)
- variant=32
- ;;
x86_64)
- variant=64
- ;;
+ ;;
*)
- AC_MSG_RESULT(no)
- echo Only x86 and x86-64 are supported
- exit 1
+ SPICE_WARNING([spice-server on non-x86_64 architectures has not been extensively tested])
esac
-AC_MSG_RESULT($variant bit)
-AM_CONDITIONAL([X86_64], [test "$variant" = 64])
AC_MSG_CHECKING([for native Win32])
-case "$host" in
- *-*-mingw*)
- os_win32=yes
- ;;
- *)
- os_win32=no
- ;;
+case "$host_os" in
+ *mingw*|*cygwin*)
+ os_win32=yes
+ dnl AI_ADDRCONFIG and possibly some other code require at least Vista
+ AC_DEFINE([_WIN32_WINNT], [0x600], [Minimal Win32 version])
+ ;;
+ *)
+ os_win32=no
+ ;;
esac
AC_MSG_RESULT([$os_win32])
-
-case $host in
- *-*-linux*)
- os_linux=yes
- ;;
-esac
+AM_CONDITIONAL([OS_WIN32],[test "$os_win32" = "yes"])
dnl =========================================================================
-dnl Check OS target
-
-AC_MSG_CHECKING([for some Win32 platform])
-case "$host" in
- *-*-mingw*|*-*-cygwin*)
- platform_win32=yes
- ;;
- *)
- platform_win32=no
- ;;
-esac
-AC_MSG_RESULT([$platform_win32])
-if test "$platform_win32" = yes; then
- red_target=windows
-else
- red_target=x11
+dnl Check optional features
+SPICE_CHECK_SMARTCARD
+
+AC_ARG_ENABLE(gstreamer,
+ AS_HELP_STRING([--enable-gstreamer=@<:@auto/1.0/yes/no@:>@],
+ [Enable GStreamer support]),,
+ [enable_gstreamer="auto"])
+
+if test "x$enable_gstreamer" != "xno" && test "x$enable_gstreamer" != "x0.10"; then
+ SPICE_CHECK_GSTREAMER(GSTREAMER_1_0, 1.0, [gstreamer-1.0 gstreamer-base-1.0 gstreamer-app-1.0 gstreamer-video-1.0],
+ [enable_gstreamer="1.0"
+ SPICE_CHECK_GSTREAMER_ELEMENTS($GST_INSPECT_1_0, [gst-plugins-base 1.0], [appsrc videoconvert appsink])
+ SPICE_CHECK_GSTREAMER_ELEMENTS($GST_INSPECT_1_0, [gstreamer-libav 1.0], [avenc_mjpeg])
+ SPICE_CHECK_GSTREAMER_ELEMENTS($GST_INSPECT_1_0, [gst-plugins-good 1.0], [vp8enc vp9enc])
+ SPICE_CHECK_GSTREAMER_ELEMENTS($GST_INSPECT_1_0, [gst-plugins-ugly 1.0], [x264enc])
+ ],
+ [if test "x$enable_gstreamer" = "x1.0"; then
+ AC_MSG_ERROR([GStreamer 1.0 support requested but not found. You may set GSTREAMER_1_0_CFLAGS and GSTREAMER_1_0_LIBS to avoid the need to call pkg-config.])
+ fi
+ ])
fi
-AM_CONDITIONAL(OS_WIN32, test "$os_win32" = "yes")
-AM_CONDITIONAL(OS_UNIX, test "$os_win32" != "yes")
-AM_CONDITIONAL(OS_LINUX, test "$os_linux" = "yes")
+AM_CONDITIONAL(HAVE_GSTREAMER, test "x$have_gstreamer_1_0" = "xyes")
+AM_CONDITIONAL(HAVE_GSTREAMER_1_0, test "x$have_gstreamer_1_0" = "xyes")
-dnl =========================================================================
-dnl Check optional features
-AC_ARG_ENABLE(gui,
-[ --enable-gui Enable start dialog with CEGUI],,
-[enable_gui="no"])
-AS_IF([test x"$enable_gui" != "xno"], [enable_gui="yes"])
-AM_CONDITIONAL(SUPPORT_GUI, test "x$enable_gui" != "xno")
-
-AC_ARG_ENABLE(opengl,
-[ --enable-opengl Enable opengl requirement / support (not recommended)],,
-[enable_opengl="no"])
-AS_IF([test x"$enable_opengl" != "xno"], [enable_opengl="yes"])
-AM_CONDITIONAL(SUPPORT_GL, test "x$enable_opengl" = "xyes")
-
-AC_ARG_ENABLE(smartcard,
-[ --enable-smartcard Enable network redirection],,
-[enable_smartcard="no"])
-AS_IF([test x"$enable_smartcard" != "xno"], [enable_smartcard="yes"])
-AM_CONDITIONAL(SUPPORT_SMARTCARD, test "x$enable_smartcard" != "xno")
-if test "x$enable_smartcard" = "xyes"; then
- AC_DEFINE([USE_SMARTCARD], [1], [Define if supporting smartcard proxying])
+AS_IF([test "x$enable_gstreamer" = "xyes"],
+ [AC_MSG_ERROR("GStreamer support requested but not found")],
+ [test "x$enable_gstreamer" = "xauto"],
+ [enable_gstreamer="no"
+])
+AS_IF([test x"$missing_gstreamer_elements" = xyes],
+ [SPICE_WARNING([The GStreamer video encoder can be built but may not work.])
+])
+
+if test "x$have_gstreamer_1_0" = "xyes"; then
+ PKG_CHECK_MODULES(ORC, orc-0.4)
+ AC_SUBST(ORC_CFLAGS)
+ AC_SUBST(ORC_LIBS)
fi
-AC_ARG_ENABLE(client,
-[ --enable-client Enable spice client],,
-[enable_client="no"])
-AS_IF([test x"$enable_client" != "xno"], [enable_client="yes"])
-AM_CONDITIONAL(SUPPORT_CLIENT, test "x$enable_client" = "xyes")
+AC_ARG_ENABLE([tests],
+ AS_HELP_STRING([--enable-tests],
+ [Enable tests @<:@default=yes@:>@]),
+ [],
+ enable_tests="yes")
+AM_CONDITIONAL(ENABLE_TESTS, test "x$enable_tests" = "xyes")
+
+dnl Check for the presence of Valgrind and do the plumbing to allow
+dnl the running of "make check-valgrind".
+AX_VALGRIND_DFLT(memcheck, on)
+AX_VALGRIND_DFLT(helgrind, off)
+AX_VALGRIND_DFLT(drd, off)
+AX_VALGRIND_DFLT(sgcheck, off)
-AC_ARG_ENABLE(automated_tests,
-[ --enable-automated-tests Enable automated tests using spicy-screenshot (part of spice--gtk)],,
-[enable_automated_tests="no"])
-AS_IF([test x"$enable_automated_tests" != "xno"], [enable_automated_tests="yes"])
-AM_CONDITIONAL(SUPPORT_AUTOMATED_TESTS, test "x$enable_automated_tests" != "xno")
+AX_VALGRIND_CHECK
+SPICE_CHECK_LZ4
+SPICE_CHECK_SASL
+AM_CONDITIONAL(HAVE_SASL, test "x$have_sasl" = "xyes")
dnl =========================================================================
dnl Check deps
+m4_define([SPICE_PROTOCOL_MIN_VER],[0.14.3])
+m4_include([subprojects/spice-common/m4/common.m4])
-AC_CONFIG_SUBDIRS([spice-common])
-COMMON_CFLAGS='-I ${top_srcdir}/spice-common/ -I ${top_builddir}/spice-common/ -I ${top_srcdir}/spice-common/spice-protocol/'
-AC_SUBST(COMMON_CFLAGS)
-
-AC_CHECK_LIBM
+LT_LIB_M
AC_SUBST(LIBM)
-AC_CHECK_LIB(rt, clock_gettime,
- AC_DEFINE([HAVE_CLOCK_GETTIME], 1, [Defined if we have clock_gettime()])
- LIBRT=-lrt
- )
+AC_CHECK_LIB(rt, clock_gettime, LIBRT="-lrt")
AC_SUBST(LIBRT)
-if test "$red_target" = "windows"; then
- SPICE_NONPKGCONFIG_LIBS+=" -lpthreadGC2 -lversion -lmsimg32 $LIBM"
-else
- SPICE_NONPKGCONFIG_LIBS+=" -pthread $LIBM $LIBRT"
-fi
-
-dnl The client needs a yield function
-AC_MSG_CHECKING(for posix yield function)
-for yield_func in pthread_yield pthread_yield_np sched_yield \
- thr_yield; do
- spice_save_CPPFLAGS="$CPPFLAGS"
- CPPFLAGS="$CPPFLAGS $SPICE_NONPKGCONFIG_LIBS"
- AC_TRY_LINK([#include <pthread.h>],
- [$yield_func()],
- [posix_yield_func="$yield_func"
- break])
- CPPFLAGS="$spice_save_CPPFLAGS"
-done
-if test x"$posix_yield_func" = xnone; then
- AC_MSG_ERROR([No posix yield function found])
-else
- AC_MSG_RESULT($posix_yield_func)
- posix_yield_func="$posix_yield_func()"
-fi
-AC_DEFINE_UNQUOTED([POSIX_YIELD_FUNC],$posix_yield_func,[The POSIX RT yield function])
+AS_VAR_APPEND([SPICE_NONPKGCONFIG_LIBS], [" -pthread $LIBM $LIBRT"])
+AS_IF([test "x$os_win32" = "xyes"], [
+ AS_VAR_APPEND([SPICE_NONPKGCONFIG_LIBS], [" -lws2_32"])
+])
SPICE_REQUIRES=""
-if test "x$enable_gui" = "xyes" && test "x$enable_client" = "xyes" ; then
- PKG_CHECK_MODULES(CEGUI06, CEGUI-0.6 >= 0.6.0 CEGUI-0.6 < 0.7.0,
- [
- AC_SUBST(CEGUI06_CFLAGS)
- AC_SUBST(CEGUI06_LIBS)
- AC_DEFINE([USE_GUI], [1], [Define to build with CEGUI support])
- ],
- [
- PKG_CHECK_MODULES(CEGUI, CEGUI >= 0.6.0 CEGUI < 0.7.0)
- AC_SUBST(CEGUI_CFLAGS)
- AC_SUBST(CEGUI_LIBS)
- AC_DEFINE([USE_GUI], [1], [Define to build with CEGUI support])
- ])
-fi
-
-if test "x$enable_smartcard" = "xyes"; then
- PKG_CHECK_MODULES(CAC_CARD, libcacard >= 0.1.2)
- SMARTCARD_LIBS="$CAC_CARD_LIBS"
- SMARTCARD_CFLAGS="$CAC_CARD_CFLAGS"
- AC_SUBST(SMARTCARD_LIBS)
- AC_SUBST(SMARTCARD_CFLAGS)
- SPICE_REQUIRES+=" libcacard >= 0.1.2"
-fi
+AS_IF([test x"$have_smartcard" = "xyes"], [
+ AS_VAR_APPEND([SPICE_REQUIRES], [" libcacard >= 2.5.1"])
+])
+GLIB2_REQUIRED=2.38
+GLIB2_ENCODED_VERSION="GLIB_VERSION_2_38"
+PKG_CHECK_MODULES([GLIB2], [glib-2.0 >= $GLIB2_REQUIRED])
+GLIB2_CFLAGS="$GLIB2_CFLAGS -DGLIB_VERSION_MIN_REQUIRED=$GLIB2_ENCODED_VERSION \
+ -DGLIB_VERSION_MAX_ALLOWED=GLIB_VERSION_2_60"
+AS_VAR_APPEND([SPICE_REQUIRES], [" glib-2.0 >= $GLIB2_REQUIRED"])
-PKG_CHECK_MODULES([GLIB2], [glib-2.0 >= 2.22])
-SPICE_REQUIRES+=" glib-2.0 >= 2.22"
+#used only by tests
+AS_IF([test "x$os_win32" != "xyes"],
+ [PKG_CHECK_MODULES([GIO_UNIX], [gio-unix-2.0 >= $GLIB2_REQUIRED])])
-PKG_CHECK_MODULES(PIXMAN, pixman-1 >= 0.17.7)
+PIXMAN_REQUIRED=0.17.7
+PKG_CHECK_MODULES(PIXMAN, pixman-1 >= $PIXMAN_REQUIRED)
AC_SUBST(PIXMAN_CFLAGS)
AC_SUBST(PIXMAN_LIBS)
-SPICE_REQUIRES+=" pixman-1 >= 0.17.7"
-
-AC_ARG_ENABLE(celt051,
- [ --disable-celt051 Disable celt051 audio codec (enabled by default)],,
- [enable_celt051="yes"])
-
-if test "x$enable_celt051" = "xyes"; then
- PKG_CHECK_MODULES(CELT051, celt051 >= 0.5.1.1, SPICE_REQUIRES+=" celt051 >= 0.5.1.1")
-fi
+AS_VAR_APPEND([SPICE_REQUIRES], [" pixman-1 >= $PIXMAN_REQUIRED"])
-if test ! -e client/generated_marshallers.cpp; then
-AC_MSG_CHECKING([for pyparsing python module])
-echo "import pyparsing" | ${PYTHON} - >/dev/null 2>&1
-if test $? -ne 0 ; then
- AC_MSG_RESULT([not found])
- AC_MSG_ERROR([pyparsing python module is required to compile this package])
-fi
-AC_MSG_RESULT([found])
-fi
-
-PKG_CHECK_MODULES(SSL, openssl)
+PKG_CHECK_MODULES(SSL, openssl >= 1.0.0)
AC_SUBST(SSL_CFLAGS)
AC_SUBST(SSL_LIBS)
-SPICE_REQUIRES+=" openssl"
-
-# These are commented out because the gl libraries on RHEL 5 do not have pkgconfig files
-#
-# PKG_CHECK_MODULES(GL, gl glu)
-# AC_SUBST(GL_CFLAGS)
-# AC_SUBST(GL_LIBS)
-# SPICE_REQUIRES+=" gl glu"
-
-if test "x$enable_opengl" = "xyes"; then
- AC_CHECK_LIB(GL, glBlendFunc, GL_LIBS="$GL_LIBS -lGL", enable_opengl=no)
- AC_CHECK_LIB(GLU, gluSphere, GL_LIBS="$GL_LIBS -lGLU", enable_opengl=no)
- AC_DEFINE([USE_OPENGL], [1], [Define to build with OpenGL support])
- AC_DEFINE([GL_GLEXT_PROTOTYPES], [], [Enable GLExt prototypes])
-
- if test "x$enable_opengl" = "xno"; then
- AC_MSG_ERROR([GL libraries not available])
- fi
-fi
-
-AC_SUBST(GL_CFLAGS)
-AC_SUBST(GL_LIBS)
-SPICE_NONPKGCONFIG_LIBS+=" $GL_LIBS"
-
-if test "x$red_target" = "xx11" && test "x$enable_client" = "xyes" ; then
- if test "$os_linux" = yes; then
- PKG_CHECK_MODULES(ALSA, alsa)
- AC_SUBST(ALSA_CFLAGS)
- AC_SUBST(ALSA_LIBS)
- fi
-
- PKG_CHECK_MODULES(XRANDR, xrandr)
- PKG_CHECK_MODULES(XFIXES, xfixes)
- PKG_CHECK_MODULES(MISC_X, x11 xext xrender)
- AC_SUBST(XRANDR_CFLAGS)
- AC_SUBST(XRANDR_LIBS)
- AC_SUBST(MISC_X_CFLAGS)
- AC_SUBST(MISC_X_LIBS)
-
- PKG_CHECK_MODULES(XRANDR12,
- xrandr >= 1.2,
- have_xrandr12=yes,
- have_xrandr12=no)
-else
- have_xrandr12=no
-fi
-
-AM_CONDITIONAL([HAVE_XRANDR12], [test "x$have_xrandr12" = "xyes"])
-if test "x$have_xrandr12" = "xyes" ; then
- AC_DEFINE([HAVE_XRANDR12], [], [Define if we have XRANDR 12])
-fi
-
-# Add parameter for libXinerama
-AC_ARG_ENABLE([xinerama],
- [AS_HELP_STRING([--disable-xinerama],
- [disable Xinerama library @<:@default=no@:>@])])
-
-if test "x$enable_xinerama" != "xno"; then
- PKG_CHECK_MODULES(XINERAMA,
- xinerama >= 1.0,
- have_xinerama=yes,
- have_xinerama=no)
-else
- have_xinerama=no
-fi
-
-if test "x$enable_xinerama" = "xyes" && test "x$have_xinerama" = "xno"; then
- AC_MSG_ERROR([Requested Xinerama library was not found])
-fi
-
-AM_CONDITIONAL([HAVE_XINERAMA], [test "x$have_xinerama" = "xyes"])
-if test "x$have_xinerama" = "xyes" ; then
- AC_DEFINE([HAVE_XINERAMA], [], [Define if we have Xinerama])
- AC_SUBST(XINERAMA_CFLAGS)
- AC_SUBST(XINERAMA_LIBS)
- SPICE_REQUIRES+=" xinerama"
-fi
-
-# Add parameter for (partial) static linkage of spice client.
-# this is used to achive single binary package for all (?) distros.
-AC_ARG_ENABLE(static-linkage,
-[ --enable-static-linkage will generate spice client binary with static linkage to external libraries ],,
-[enable_static_linkage="no"])
-AS_IF([test x"$enable_static_linkage" != "xno"],
-[SPICEC_STATIC_LINKAGE_BSTATIC=["-Wl,-Bstatic"]])
+AS_VAR_APPEND([SPICE_REQUIRES], [" openssl"])
+
+save_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $SSL_CFLAGS"
+AC_CHECK_DECLS([SSL_CTX_set_ecdh_auto], [], [], [
+AC_INCLUDES_DEFAULT
+#include <openssl/err.h>
+#include <openssl/ssl.h>
+])
+CFLAGS="$save_CFLAGS"
AC_CHECK_LIB(jpeg, jpeg_destroy_decompress,
AC_MSG_CHECKING([for jpeglib.h])
- AC_TRY_CPP(
-[#include <stdio.h>
+ AC_PREPROC_IFELSE([AC_LANG_SOURCE([[#include <stdio.h>
#undef PACKAGE
#undef VERSION
#undef HAVE_STDLIB_H
-#include <jpeglib.h>],
- JPEG_LIBS='-ljpeg'
- AC_MSG_RESULT($jpeg_ok),
- AC_MSG_ERROR([jpeglib.h not found])),
+#include <jpeglib.h>]])],[JPEG_LIBS='-ljpeg'
+ AC_MSG_RESULT($jpeg_ok)],[AC_MSG_ERROR(jpeglib.h not found)]),
AC_MSG_ERROR([libjpeg not found]))
AC_SUBST(JPEG_LIBS)
AC_CHECK_LIB(z, deflate, Z_LIBS='-lz', AC_MSG_ERROR([zlib not found]))
AC_SUBST(Z_LIBS)
-dnl Cyrus SASL, check from gtk-vnc
-AC_ARG_WITH([sasl],
- [AS_HELP_STRING([--with-sasl],
- [use cyrus SASL for authentication @<:@default=check@:>@])],
- [],
- [with_sasl=check])
-
-SASL_CFLAGS=
-SASL_LIBS=
-enable_sasl=no
-if test "x$with_sasl" != "xno"; then
- if test "x$with_sasl" != "xyes" && test "x$with_sasl" != "xcheck"; then
- SASL_CFLAGS="-I$with_sasl"
- SASL_LIBS="-L$with_sasl"
- fi
- fail=0
- old_cflags="$CFLAGS"
- old_libs="$LIBS"
- CFLAGS="$CFLAGS $SASL_CFLAGS"
- LIBS="$LIBS $SASL_LIBS"
- AC_CHECK_HEADER([sasl/sasl.h],[],[
- if test "x$with_sasl" != "xcheck" ; then
- with_sasl=no
- else
- fail=1
- fi])
- if test "x$with_sasl" != "xno" ; then
- AC_CHECK_LIB([sasl2], [sasl_client_init],[with_sasl2=yes],[with_sasl2=no])
- fi
- if test "x$with_sasl2" = "xno" && test "x$with_sasl" != "xno" ; then
- AC_CHECK_LIB([sasl], [sasl_client_init],[with_sasl=yes],[with_sasl=no])
- fi
- if test "x$with_sasl2" = "xyes"; then
- SASL_LIBS="$SASL_LIBS -lsasl2"
- elif test "x$with_sasl" = "xyes"; then
- SASL_LIBS="$SASL_LIBS -lsasl"
- else
- AC_MSG_ERROR([Missing required Cyrus SASL development package])
- fi
- CFLAGS="$old_cflags"
- LIBS="$old_libs"
- if test "x$with_sasl2" = "xyes" || test "x$with_sasl" = "xyes" ; then
- AC_DEFINE_UNQUOTED([HAVE_SASL], 1,
- [whether Cyrus SASL is available for authentication])
- enable_sasl=yes
- fi
-fi
-AM_CONDITIONAL([HAVE_SASL], [test "x$with_sasl2" = "xyes" || test "x$with_sasl" = "xyes"])
-AC_SUBST([SASL_CFLAGS])
-AC_SUBST([SASL_LIBS])
-
-if test "x$enable_automated_tests" = "xyes"; then
- AC_MSG_CHECKING([for spicy-screenshot])
- spicy-screenshot --help >/dev/null 2>&1
- if test $? -ne 0 ; then
- AC_MSG_RESULT([not found])
- AC_MSG_ERROR([spicy-screenshot was not found, this module is part of spice-gtk and is required to compile this package])
- fi
- AC_MSG_RESULT([found])
-fi
-
AC_ARG_ENABLE([manual],
AS_HELP_STRING([--enable-manual=@<:@auto/yes/no@:>@],
@@ -427,43 +236,22 @@ AM_CONDITIONAL([BUILD_MANUAL], [test -n "$ASCIIDOC" || test -n "$A2X"])
AM_CONDITIONAL([BUILD_HTML_MANUAL], [test -n "$ASCIIDOC"])
AM_CONDITIONAL([BUILD_CHUNKED_MANUAL], [test -n "$A2X"])
+AC_ARG_ENABLE([statistics],
+ AS_HELP_STRING([--enable-statistics=@<:@yes/no@:>@],
+ [Build SPICE with statistic code enabled @<:@default=no@:>@]))
+AS_IF([test "$enable_statistics" = "yes"],
+ [AC_DEFINE([RED_STATISTICS], [1], [Enable SPICE statistics])])
dnl ===========================================================================
dnl check compiler flags
+AC_LANG_PUSH([C++])
SPICE_COMPILE_WARNINGS
+AC_LANG_POP([C++])
LIBVIRT_LINKER_RELRO
LIBVIRT_LINKER_NO_INDIRECT
-# use ximage.h for win32 build if it is found (no package for mingw32 atm)
-if test $os_win32 == "yes" ; then
- AC_MSG_CHECKING([for cximage])
- AC_TRY_CPP(
-[#include <ximage.h>
-int main()
-{
- return CXIMAGE_FORMAT_RAW;
-)}
-],[
- AC_MSG_RESULT([found])
- have_cximage="yes"
-]
-,[AC_MSG_RESULT([missing])
- CXIMAGE_CFLAGS='-DDISABLE_CXIMAGE'
- have_cximage="no"
- ]
-)
-fi
-AC_SUBST(CXIMAGE_CFLAGS)
-
-# check for windres for mingw32 builds
-if test $os_win32 == "yes" ; then
- AC_CHECK_PROGS(WINDRES,i686-pc-mingw32-windres mingw-windres mingw32-windres,false)
- AC_SUBST(WINDRES)
-fi
-
AC_SUBST(WARN_CFLAGS)
-AC_SUBST(CFLAGS_CFLAGS)
dnl =========================================================================
dnl -fvisibility stuff
@@ -494,62 +282,42 @@ AC_CACHE_CHECK([if -Wl,--version-script works], [spice_cv_ld_version_script],
AM_CONDITIONAL([HAVE_LD_VERSION_SCRIPT],
[test x"$spice_cv_ld_version_script" = xyes])
+AC_DEFINE([SPICE_USE_SAFER_CONTAINEROF], [1], [Enable more type safe version of SPICE_CONTAINEROF])
+
AC_SUBST(SPICE_REQUIRES)
AC_SUBST(SPICE_NONPKGCONFIG_CFLAGS)
AC_SUBST(SPICE_NONPKGCONFIG_LIBS)
-AC_SUBST([SPICEC_STATIC_LINKAGE_BSTATIC])
+AM_SILENT_RULES([yes])
-m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
-
-AC_OUTPUT([
+AC_CONFIG_FILES([
Makefile
spice-server.pc
server/Makefile
+server/spice-version.h
server/tests/Makefile
-client/Makefile
docs/Makefile
docs/manual/Makefile
+tools/Makefile
])
+AC_OUTPUT
dnl ==========================================================================
-echo "
+AC_MSG_NOTICE([
Spice $VERSION
==============
prefix: ${prefix}
- c compiler: ${CC}
- c++ compiler: ${CXX}
- python: ${PYTHON}
-
- Build Spice client: ${enable_client}
-" ; if test "x$enable_client" == "xyes"; then echo "\
- Have XRANDR 1.2: ${have_xrandr12}
-
- Have Xinerama: ${have_xinerama}
-
- Red target: ${red_target}
-
- OpenGL: ${enable_opengl}
-
- GUI: ${enable_gui}
-" ; fi ; echo "\
- Smartcard: ${enable_smartcard}
-
- SASL support: ${enable_sasl}
-
- Automated tests: ${enable_automated_tests}
+ C compiler: ${CC}
+ C++ compiler: ${CXX}
+ LZ4 support: ${have_lz4}
+ Smartcard: ${have_smartcard}
+ GStreamer: ${enable_gstreamer}
+ SASL support: ${have_sasl}
Manual: ${have_asciidoc}
-"
-
-if test $os_win32 == "yes" ; then
-echo \
-" Copy & Paste Images: ${have_cximage}
-"
-fi
-echo \
-" Now type 'make' to build $PACKAGE
-"
+ Now type 'make' to build $PACKAGE
+])
+SPICE_PRINT_MESSAGES
diff --git a/docs/Makefile.am b/docs/Makefile.am
index 18e785f0..1c96bcae 100644
--- a/docs/Makefile.am
+++ b/docs/Makefile.am
@@ -1,3 +1,41 @@
+NULL =
+ASCIIDOC_FLAGS = -a icons -a toc
+
+EXTRA_DIST = \
+ meson.build \
+ spice_for_newbies.html \
+ spice_for_newbies.txt \
+ spice_protocol.html \
+ spice_protocol.txt \
+ spice_style.html \
+ spice_style.txt \
+ spice_threading_model.html \
+ spice_threading_model.txt \
+ vd_interfaces.html \
+ vd_interfaces.txt \
+ images/newbies/g_cmd_flow.png \
+ images/newbies/g_sub.png \
+ images/newbies/cli_bsc_stc.png \
+ images/newbies/srv_stc.png \
+ images/newbies/a_cmd_flow.png \
+ $(NULL)
+
+HTML_FILES = \
+ spice_for_newbies.html \
+ spice_protocol.html \
+ spice_style.html \
+ spice_threading_model.html \
+ vd_interfaces.html \
+ $(NULL)
+
if BUILD_MANUAL
SUBDIRS = manual
+
+all-local: $(HTML_FILES)
+
+%.html: %.txt
+ $(AM_V_GEN) $(ASCIIDOC) -n $(ASCIIDOC_FLAGS) -o $@ $<
endif
+
+clean-local:
+ rm -f $(HTML_FILES)
diff --git a/docs/Spice_for_newbies.odt b/docs/Spice_for_newbies.odt
deleted file mode 100644
index 1b05ee69..00000000
--- a/docs/Spice_for_newbies.odt
+++ /dev/null
Binary files differ
diff --git a/docs/Spice_protocol.odt b/docs/Spice_protocol.odt
deleted file mode 100644
index 02a17a45..00000000
--- a/docs/Spice_protocol.odt
+++ /dev/null
Binary files differ
diff --git a/docs/Spice_style.odt b/docs/Spice_style.odt
deleted file mode 100644
index efdcd1a6..00000000
--- a/docs/Spice_style.odt
+++ /dev/null
Binary files differ
diff --git a/docs/Vd_interfaces.odt b/docs/Vd_interfaces.odt
deleted file mode 100644
index 71da117d..00000000
--- a/docs/Vd_interfaces.odt
+++ /dev/null
Binary files differ
diff --git a/docs/how_to_release.md b/docs/how_to_release.md
new file mode 100644
index 00000000..bfce1416
--- /dev/null
+++ b/docs/how_to_release.md
@@ -0,0 +1,39 @@
+How to do a SPICE server release
+================================
+
+Some notes to prepare a release, not really strict but better to have in order
+to avoid forgetting something.
+
+* Update `configure.ac` and `meson.build` according to libtool rules
+* Update `CHANGELOG.md` with list of changes done since last release
+* Send a merge request with such changes, handle the review
+* Try to build an RPM package from `make dist` output (see below notes
+ on how to build a source tarball)
+* `git push` for the above MR
+* `git push` for the version tag created (for instance you can use
+ `git push origin v0.14.3` or `git push --tags`)
+* Send an email to spice-devel mailing list
+* Sign generated tarball (to create a detached signature run
+ `gpg2 -sb spice-release.tar.bz2`)
+* On Gitlab update tags (https://gitlab.freedesktop.org/spice/spice/-/tags)
+ * Add ChangeLog information
+ * Upload tarball and relative signature
+* Upload tarball and relative signature to
+ https://www.spice-space.org/download/releases/ (sftp to
+ `spice-uploader@spice-web.osci.io:/var/www/www.spice-space.org/download/releases/`)
+* Update file `download.rst` in
+ https://gitlab.freedesktop.org/spice/spice-space-pages
+* Create a merge request for `spice-space-pages`
+
+How to build a source tarball
+-----------------------------
+
+1. `git tag -a v0.14.3 -m 'spice-server 0.14.3'` (replace the version)
+2. `git clone https://gitlab.freedesktop.org/spice/spice.git`
+3. `cd spice`
+4. `./autogen.sh --disable-dependency-tracking`
+5. `(cd subprojects/spice-common && make gitignore)`
+6. `make dist`
+
+Step 4 is to avoid a problem with `.deps` directories, step 5 to avoid
+the directory to be dirty due to missing `.gitignore` files.
diff --git a/docs/images/newbies/a_cmd_flow.png b/docs/images/newbies/a_cmd_flow.png
new file mode 100644
index 00000000..5ce2a275
--- /dev/null
+++ b/docs/images/newbies/a_cmd_flow.png
Binary files differ
diff --git a/docs/images/newbies/cli_bsc_stc.png b/docs/images/newbies/cli_bsc_stc.png
new file mode 100644
index 00000000..4951162b
--- /dev/null
+++ b/docs/images/newbies/cli_bsc_stc.png
Binary files differ
diff --git a/docs/images/newbies/g_cmd_flow.png b/docs/images/newbies/g_cmd_flow.png
new file mode 100644
index 00000000..5c0ecf75
--- /dev/null
+++ b/docs/images/newbies/g_cmd_flow.png
Binary files differ
diff --git a/docs/images/newbies/g_sub.png b/docs/images/newbies/g_sub.png
new file mode 100644
index 00000000..398e856e
--- /dev/null
+++ b/docs/images/newbies/g_sub.png
Binary files differ
diff --git a/docs/images/newbies/srv_stc.png b/docs/images/newbies/srv_stc.png
new file mode 100644
index 00000000..d5c3e4df
--- /dev/null
+++ b/docs/images/newbies/srv_stc.png
Binary files differ
diff --git a/docs/manual/Makefile.am b/docs/manual/Makefile.am
index ead5f469..b4d5cc0a 100644
--- a/docs/manual/Makefile.am
+++ b/docs/manual/Makefile.am
@@ -3,12 +3,13 @@ SUFFIXES = .html
ASCIIDOC_FLAGS = -a icons -a toc
EXTRA_DIST = \
+ meson.build \
images/icons/important.png \
images/icons/note.png \
- images/spicec01.png \
manual.html \
manual.chunked \
manual.txt \
+ manual.conf \
$(NULL)
.txt.html:
diff --git a/docs/manual/images/spicec01.png b/docs/manual/images/spicec01.png
deleted file mode 100644
index e2cf8c5d..00000000
--- a/docs/manual/images/spicec01.png
+++ /dev/null
Binary files differ
diff --git a/docs/manual/manual.txt b/docs/manual/manual.txt
index 5b19c11c..3dce22d9 100644
--- a/docs/manual/manual.txt
+++ b/docs/manual/manual.txt
@@ -169,7 +169,7 @@ Client mouse::
Not captured and is used as the effective pointing device. To enable
client mouse, the VDI host application must register an absolute
pointing device (e.g. USB tablet in QEMU). This mode is appropriate
-for WAN or or for a loaded server, since cursor has smooth motion and
+for WAN or for a loaded server, since cursor has smooth motion and
responsiveness. However, the cursor might lose synchronization
(position and shape) for a while.
@@ -196,7 +196,7 @@ client OS and the guest OS.
Bidirectional Audio::
Spice supports audio playback and recording. Playback is compressed
-using the CELT algorithm
+using the OPUS algorithm
Lip-sync::
between video and audio. Available only when video streaming is
@@ -240,23 +240,32 @@ population. I assume that you have a locally stored ISO of your
favourite operating system so you can use it for installation.
[source,sh]
-host$ sudo qemu-kvm -boot order=dc -vga qxl \
- -spice port=3001,disable-ticketing -soundhw ac97 \
+host$ qemu-kvm -machine vmport=off \
+ -boot order=dc -vga qxl \
+ -spice port=3001,disable-ticketing -soundhw hda \
-device virtio-serial -chardev spicevmc,id=vdagent,debug=0,name=vdagent \
-device virtserialport,chardev=vdagent,name=com.redhat.spice.0 \
-cdrom /path/to/your.iso /path/to/your.img
Let's take a brief look at the qemu options that were used. The option
-`-boot order=dc` specifies that the guest system should try to boot
-from the first cdrom and then fallback to the first disk, `-vga qxl`
-specifies that qemu uses a qxl graphics device.
+`-machine vmport=off` disables VMWare IO port emulation, which is
+necessary for server mode mouse to work properly with spice. The option `-boot
+order=dc` specifies that the guest system should try to boot from the first
+cdrom and then fallback to the first disk, `-vga qxl` specifies that qemu uses
+a qxl graphics device.
The Spice `port` option defines what port will be used for
communication with the client. The Spice option `disable-ticketing` is
specifying that ticketing (simple authentication method) is not
used. The virtio and chardev devices are required by the guest agent.
+The `-soundhw hda` option provides an audio device for the guest to use for
+audio playback and recording. In order for spice audio to work properly, qemu
+must use the 'spice' audio driver. Depending on how qemu was built, however,
+this might not be the default audio driver. To ensure qemu uses the spice audio
+driver, you can set the environment variable `QEMU_AUDIO_DRV=spice`.
+
Basic configuration
-------------------
@@ -313,7 +322,7 @@ You should also add a QXL video device
[source,xml]
<video>
- <model type='qxl'>
+ <model type='qxl'/>
</video>
After stopping and restarting the virtual machine `$vmname`, it should
@@ -351,10 +360,6 @@ the machine which is running our qemu instance.
[source,sh]
client$ remote-viewer spice://myhost:3001
-.Established connection to Windows 2008 guest
-image::images/spicec01.png[]
-
-
Ticketing
=========
@@ -536,9 +541,150 @@ remote-viewer, you can select which USB devices to redirect in
established. There are also various command line redirection options
which are described when running remote-viewer with `--help-spice`.
+To get USB redirection working on Windows clients, you need to install
+http://www.spice-space.org/download/windows/usbdk/[UsbDk]
+
+[[videostreaming]]
+Video Streaming
+===============
+
+SPICE streaming allows sending an encoded video stream of the guest
+desktop to the client. The encoding can be done from the host (inside
+SPICE server) or from the guest, with the help of the SPICE streaming
+agent.
+
+The streaming agent is a daemon/service running in the guest OS so it must be
+installed if it does not yet exist on the guest system. It relies on a
+dedicated spiceport char device to achieve communication between the guest and
+the host. This device must be added to the virtual machine as described below
+for the streaming agent to work in the guest.
+
+Guest Video Encoding: Agent Configuration
+-----------------------------------------
+
+.Using virt-manager
+
+The needed device can be added from the virtual machine
+details. Click on "Add hardware" and then add a "Channel" device with
+type "Spice port (spiceport)". The port should be named
+`org.spice-space.stream.0`, and the channel should also be
+`org.spice-space.stream.0`.
+
+.Using libvirt
+
+Two distinct devices must be added:
+
+* http://libvirt.org/formatdomain.html#elementsControllers[a virtio serial
+ device] if there is not one yet in the domain definition
+* http://libvirt.org/formatdomain.html#elementsCharSpiceport[a spiceport channel]
+
+[source,xml]
+<devices>
+ <controller type='virtio-serial' index='0'/>
+ <channel type='spiceport'>
+ <source channel='org.spice-space.stream.0'/>
+ <target type='virtio' name='org.spice-space.stream.0'/>
+ </channel>
+</devices>
+
+.Using QEMU
+
+Adding the following parameters to your QEMU command line will enable
+the needed devices for agent support in the guest OS:
+
+[source,sh]
+-device virtserialport,bus=virtio-serial0.0,nr=1,chardev=charchannel1,id=channel1,name=org.spice-space.stream.0 \
+-chardev spiceport,name=org.spice-space.stream.0,id=charchannel1
+
+
+Host Video Encoding
+-------------------
+
+For host video encoding, SPICE natively supports MJPEG encoding. For
+using further codecs, SPICE server must be compiled with GStreamer
+support.
+
+.Setting
+
+SPICE video streaming parameter can take three values:
+
+- `off`: no video detection is performed,
+- `all`: any fast-refreshing window can be encoded into a video stream,
+- `filter`: SPICE server adds additional filters to decide if video
+ streaming should be activated (at the moment, only small window
+ surfaces are skipped),
+
+.Using libvirt
+
+The `streaming` tag must be added to Spice `graphics`:
+
+[source,xml]
+
+<graphics type='spice' autoport='yes'>
+ <streaming mode='off|all|filter'/>
+</graphics>
+
+.Using QEMU
+
+Adding the following parameters to your QEMU command line will enable
+SPICE server video encoding:
+
+[source,sh]
+-spice ...,streaming-video=off|all|filter,...
+
+CAC smartcard redirection
+=========================
+
+Spice has a dedicated channel for smartcard redirection, using
+libcacard, which currently supports limited CAC emulation.
+
+You may consider redirecting your USB card reader instead. This is
+easier to setup but will prevent from sharing the smartcard with both
+the client and the remote simultaneously.
+
+libcacard is actually emulating a simple CAC card, sharing the card
+and its certificates. It can successfully be used with the coolkey
+PKCS#11 module.
+
+Configuration
+-------------
+
+.Using virt-manager
+
+In the hardware details, click on "Add Hardware", then select
+"Smartcard". Add a "passthrough" device type.
+
+.Using libvirt
+
+Setup a "passthrough" smartcard of type "spicevmc" on a CCID
+controller:
+
+[source,xml]
+<controller type='ccid' index='0'/>
+<smartcard mode='passthrough' type='spicevmc'>
+ <address type='ccid' controller='0' slot='0'/>
+</smartcard>
+
+.Using QEMU
+
+With the qemu command line, you must add a USB CCID device, and a
+"ccid-card-passthru" associated with a "spicevmc" channel with the
+name "smartcard":
+
+[source,sh]
+-device usb-ccid -chardev spicevmc,name=smartcard,id=ccid -device ccid-card-passthru,chardev=ccid
+
+Client
+------
+
+In order for the client certificates to be shared with the remote, you
+need a NSS database configured to access the smartcard. Please look
+for instructions on coolkey or NSS setup and make sure you certficates
+can be listed with certutil.
+
[NOTE]
-You may need additional services running in the client, such as the
-Spice USB Clerk service on Windows.
+Most Spice clients disable smartcard support by default, and
+need `--spice-smartcard` or similar configuration.
Multiple monitor support
========================
@@ -565,7 +711,7 @@ Configuration
To add an additional QXL device for Windows guests, simply go to your
virtual machine details. Check that you already have a "Video QXL"
-device, if notclick on "Add Hardware", and add a "Video" device with
+device, if not, click on "Add Hardware", and add a "Video" device with
model "QXL". This can also work with Linux guests if your are willing
to configure X.Org to use Xinerama (instead of XRandR).
@@ -583,10 +729,10 @@ QXL:
[source,xml]
<video>
- <model type='qxl'>
+ <model type='qxl'/>
</video>
<video>
- <model type='qxl'>
+ <model type='qxl'/>
</video>
@@ -602,9 +748,8 @@ that is already there:
Client
------
-You can enable additional displays either from the "Display/Displays"
-menu in remote-viewer, or from your guest OS display configuration
-tool.
+You can enable additional displays from the "View -> Displays"
+menu in remote-viewer.
TLS
===
@@ -663,7 +808,7 @@ up to libvirt:
****
TODO proof-read the following section:
-*****
+****
[source,sh]
host$ virsh domdisplay
@@ -793,17 +938,20 @@ ticket was passed to the client.
Folder sharing
==============
-The Spice client can share a folder with the remote guest. By default,
-the client will share the XDG Public Share directory (ie '~/Public' if
-you use a regular system). You may specify a different folder with
-`--spice-share-dir` client option.
+The Spice client can share a folder with the remote guest. By default folder
+sharing is disabled. Use the remote-viewer "File" -> "Preferences" menu
+to enable it. The default shared directory is the XDG Public Share directory
+(ie '~/Public' if you use a regular system). You may specify a different folder
+with `--spice-shared-dir` client option.
Configuration
-------------
.Using virt-manager
-It's currently not possible to configure folder sharing with virt-manager.
+In the hardware details, click on "Add Hardware", then select
+"Channel". Add a "Spice port" device type with the
+"org.spice-space.webdav.0" name.
.Using libvirt
@@ -833,9 +981,8 @@ Guest configuration
.Windows
In a Windows guest, you must then install
-http://elmarco.fedorapeople.org/spice-webdavd-x86-0.1.24.msi[spice-webdavd]
-service, and register the drive (by running 'map-drive.bat' from
-'Program Files/Spice webdav').
+https://www.spice-space.org/download/windows/spice-webdavd/[spice-webdavd]
+service.
.Linux
@@ -845,6 +992,92 @@ folder will show up in GNOME Files network places (or Nautilus). It
can then be mounted and browsed in traditional applications thanks to
`gvfs-fuse`.
+[[virgl]]
+GL acceleration (virgl)
+=======================
+
+OpenGL acceleration is currently local only (it has to go through a Unix socket)
+and it needs guest support. It's currently limited to recent linux
+distributions (for example Fedora 24).
+
+Host-side, you need qemu 2.6, libvirt 1.3.3 and spice 0.13.1, as well as a 4.4
+Linux kernel and Mesa 11.1.
+
+Client-side, you need spice-gtk 0.31.
+
+Guest-side, you need Mesa 11.1 and a 4.4 Linux kernel.
+
+Configuration
+-------------
+
+.Using libvirt
+
+You need to add a virtio-gpu video device to your virtual machine instead of QXL.
+[source,xml]
+<video>
+ <model type='virtio' heads='1'>
+ <acceleration accel3d='yes'/>
+ </model>
+</video>
+
+Then you need to enable OpenGL on your SPICE graphics node:
+[source,xml]
+<graphics type='spice' autoport='no'>
+ <gl enable='yes'/>
+</graphics>
+
+You don't need any port/address as they won't be usable with
+GL.
+
+.Using QEMU
+
+You need to add a virtio-gpu device on QEMU command line,
+as well as enable GL with SPICE. port/tls-port/addr arguments
+won't be used in this setup. You need to configure a Unix socket to
+connect to the VM display.
+
+[source,sh]
+-device virtio-vga,virgl=on -spice gl=on,unix,addr=/run/user/1000/spice.sock
+
+Connecting to the guest
+-----------------------
+
+Connecting to the guest when virgl is in use is slightly different
+than usual
+
+.If libvirt is being used
+
+[source,sh]
+client$ virt-viewer -a $vmname
+
+.If a Unix socket has been set on QEMU command line
+
+[source,sh]
+client$ remote-viewer spice+unix:///run/user/1000/spice.sock
+
+[[gvtg]]
+Intel's GVTg
+============
+
+Intel GVTg allows you to share your host GPU with the guest so that it can
+accelerate graphic and media operations.
+
+Configuration
+-------------
+
+To configure your host and the vGPU device, follow
+https://www.kraxel.org/blog/2018/04/vgpu-display-support-finally-merged-upstream/[this blog post]
+
+For spice configuration you have two main options:
+
+1. Use locally, connect and configure spice similar to <<virgl, virGL>> spice configuration
+(set vfio display=on)
+2. Use remotley, connect and configure spice similar to <<videostreaming, spice-streaming-agent>>
+(set vfio display=off)
+
+* For remote connection you may want to accelerate your video encoding using the configured
+Intel's vGPU, check for Gstreamer's Intel accelerated codec options.
+
QEMU Spice reference
====================
@@ -907,9 +1140,6 @@ The recommended way of getting all the needed drivers installed is to
use the all-in-one Spice guest tools installer which can be found on
http://spice-space.org/download/windows/spice-guest-tools/[spice-space.org].
-To get USB redirection working on Windows, you need to install USB
-Clerk (TODO: add link)
-
If you want to manually install them, the QXL driver can be downloaded
from http://spice-space.org/download/windows/qxl/[this location] ,
agent builds can be found
@@ -953,8 +1183,8 @@ required Spice components.
Client requirements
~~~~~~~~~~~~~~~~~~~
-See the http://cgit.freedesktop.org/spice/spice-gtk/tree/README[README
-file in spice-gtk] for the list of dependencies.
+See the https://gitlab.freedesktop.org/spice/spice-gtk/raw/master/README.md
+[README file in spice-gtk] for the list of dependencies.
Host requirements
~~~~~~~~~~~~~~~~~
@@ -994,7 +1224,7 @@ export INST_ROOT="/opt/spice"; mkdir $INST_ROOT
export PKG_CONFIG_PATH=$INST_ROOT/lib/pkgconfig:$PKG_CONFIG_PATH
cd $BUILD_ROOT
-git clone git://cgit.freedesktop.org/spice/spice
+git clone https://gitlab.freedesktop.org/spice/spice.git
cd $BUILD_ROOT/spice
./configure --prefix=$INST_ROOT
make
@@ -1026,13 +1256,121 @@ You should now be able to access the qemu-system-x86_64 Spice binary.
:numbered!:
+Debugging
+=========
+
+Server side
+-----------
+
+If the virtual machine was started using QEMU directly, SPICE server logs will be output to
+your console stdout.
+
+When using libvirt, logs are located in `/var/log/libvirt/qemu/` for the qemu
+system instance (`qemu:///system`), and in `~/.cache/libvirt/qemu/log` for the
+qemu session instance (`qemu:///session`).
+
+It's possible to get more verbose output by setting the `G_MESSAGES_DEBUG`
+environment variable to `Spice` or `all` before starting QEMU as described in
+https://developer.gnome.org/glib/stable/glib-running.html[GLib documentation].
+
+When using libvirt, the environment variable needs to be set from the XML
+domain definition as described in
+https://libvirt.org/drvqemu.html#qemucommand[libvirt documentation].
+
+
+Client side
+-----------
+
+remote-viewer can be started with `SPICE_DEBUG=1` in the environment, or with
+`--spice-debug` in order to get it to output more logs on stdout. `SPICE_DEBUG`
+should work with any application using spice-gtk (virt-manager, gnome-boxes, ...).
+
+Guest side
+----------
+
+.QXL KMS driver
+
+On recent Linux kernels using the QXL kms driver, booting the kernel with the
+`drm.debug=0xf` parameter. `journalctl -k`/`dmesg` will then contain debug
+logs for the QXL kms driver. This can also be changed at runtime by echo'ing
+this value to `/sys/module/drm/parameters/debug`.
+
+
+.qxl.guestdebug QEMU parameter
+
+It's also possible to get some host-side debugging logs from the guest QXL driver.
+The driver reads a guestdebug parameter from the rom, which can be set when starting
+the VM. This can be enabled with `-global qxl-vga.guestdebug=3`, or `-global
+qxl.guestdebug=3` for secondary devices.
+
+The corresponding libvirt XML is:
+
+[source,xml]
+-------------------------------------------------
+<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
+ ....
+ <qemu:commandline>
+ <qemu:arg value='-global'/>
+ <qemu:arg value='qxl-vga.guestdebug=3'/>
+ </qemu:commandline>
+</domain>
+-------------------------------------------------
+
+(don't forget to add the
+`xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'` attribute to the
+toplevel `<domain>` node)
+
+
+You can go up to 12 (or more, look for DEBUG_PRINT in the driver), you get really a lot of debug information. Interesting values are:
+
+ * 3 - will give you all the highlevel commands (DrvCopyBits, DrvBitBlt, etc.)
+ * 6 - will also show QXLGetBitMap
+ * 11 - will show caching of images (this is a driver cache, not to be confused with the cache shared between server and client).
+
+
+.qxl.cmdlog QEMU parameter
+
+This will dump all the commands passing through the ringbuffer on the device
+side. It is driver and hence guest agnostic. This can be enabled with
+`-global qxl-vga.cmdlog=1`, or `-global qxl.cmdlog=1` for secondary devices.
+See the section above for the libvirt XML to use.
+
+
+Agent
+~~~~~
+
+On Linux, `journalctl -t spice-vdagentd -t spice-vdagent` will display the agent log messages.
+spice-vdagent can also be restarted by hand with the `-d` argument in order to display more logs.
+
+On Windows, the agent logs can be found in `C:\WINDOWS\TEMP\VDAGENT.LOG` and
+`C:\WINDOWS\TEMP\VDSERVICE.LOG`
+
+
+Recording/replaying SPICE server traffic
+----------------------------------------
+
+Since spice-server 0.12.6, it's possible to record display traffic sent by the
+SPICE server in order to replay it afterwards for a client without needing to
+start a VM. This is achieved by setting the environment variable
+`SPICE_WORKER_RECORD_FILENAME` to the filename to write the traffic to before starting
+QEMU.
+
+Once the recording session is done, the `spice-server-replay` tool can be used
+to replay the previously recorded SPICE session, for example:
+
+[source,sh]
+-------------------------------------------------
+spice-server-replay -p 5900 -c "remote-viewer spice://localhost:5900" recorded-session.spice
+-------------------------------------------------
+
+
[appendix]
Manual authors
==============
The following people have contributed to this manual:
-Arnon Giloba +
+Arnon Gilboa +
Christophe Fergeau +
Lubos Kocman +
Marc-André Lureau +
@@ -1040,7 +1378,7 @@ Yaniv Kamay
[[glossary]]
Glossary
-========
+--------
[glossary]
Host::
diff --git a/docs/manual/meson.build b/docs/manual/meson.build
new file mode 100644
index 00000000..4218b546
--- /dev/null
+++ b/docs/manual/meson.build
@@ -0,0 +1,18 @@
+txt = files('manual.txt')
+
+if asciidoc.found()
+ custom_target('manual.html',
+ input : txt,
+ output : 'manual.html',
+ build_by_default : true,
+ command : [asciidoc, '-n', asciidoc_args, '-o', '@OUTPUT@', '@INPUT@'])
+endif
+
+a2x = find_program('a2x', required : false)
+if a2x.found()
+ custom_target('manual.chunked',
+ input : txt,
+ output : 'manual.chunked',
+ build_by_default : true,
+ command : [a2x, '-f', 'chunked', '-D', meson.current_build_dir(), asciidoc_args, '@INPUT@'])
+endif
diff --git a/docs/meson.build b/docs/meson.build
new file mode 100644
index 00000000..ce0334c0
--- /dev/null
+++ b/docs/meson.build
@@ -0,0 +1,20 @@
+asciidoc_files = ['spice_for_newbies',
+ 'spice_protocol',
+ 'spice_style',
+ 'spice_threading_model',
+ 'vd_interfaces']
+
+if get_option('manual')
+ asciidoc = find_program('asciidoc', required : false)
+ if asciidoc.found()
+ asciidoc_args = ['-a', 'data-uri', '-a', 'icons', '-a', 'toc']
+ foreach doc : asciidoc_files
+ custom_target('@0@.html'.format(doc),
+ input : '@0@.txt'.format(doc),
+ output : '@0@.html'.format(doc),
+ build_by_default: true,
+ command : [asciidoc, '-n', asciidoc_args, '-o', '@OUTPUT@', '@INPUT@'])
+ endforeach
+ endif
+ subdir('manual')
+endif
diff --git a/docs/spice_for_newbies.txt b/docs/spice_for_newbies.txt
new file mode 100644
index 00000000..b9cc73c7
--- /dev/null
+++ b/docs/spice_for_newbies.txt
@@ -0,0 +1,421 @@
+= Spice for Newbies
+:revnumber: v1.0
+:revdate: 01.01.2009
+:revremark: Draft 1
+:imagesdir: ./images/newbies
+
+Copyright (C) 2009 Red Hat, Inc. +
+Licensed under a Creative Commons Attribution-Share Alike 3.0 +
+United States License (see http://creativecommons.org/licenses/by-sa/3.0/us/legalcode). +
+
+:toc:
+
+== Introduction
+
+Spice is an open remote computing solution, providing client access to remote
+machine display and devices (e.g., keyboard, mouse, audio, usb). Spice achieves
+a user experience similar to an interaction with a local machine, while trying
+to offload most of the intensive CPU and GPU tasks to the client. Spice is
+suitable for both LAN and WAN usage, without compromising on the user
+experience.
+
+== Basic Architecture
+
+Spice basic building blocks are the Spice protocol, Spice server and Spice
+client. Spice-related components include the QXL device and guest QXL driver.
+
+. Graphic Commands Flow
++
+.Graphic Commands Flow
+image::g_cmd_flow.png[align="center"]
++
+The above figure shows the basic Spice architecture and guest-to-client data
+flow of graphic commands, when using libspice with QEMU. libspice can be used by
+any other VDIfootnote:svdi[Spice VD Interfaces documentation] compatible
+host application as well. Graphic commands data flow starts by a user
+application requesting the OS graphic engine (X or GDI) to perform a rendering
+operation. The graphic engine passes the commands to the QXL driver, which
+translates the OS commands to QXL commands and pushes them into a command ring.
+The command ring resides in the device memory. libspice pulls the commands from
+the ring and adds them to graphic commands tree. The graphic commands tree
+contains the set of commands, whose execution will reproduce the display
+content. The tree is used by libspice to optimize commands transmission to the
+client by dropping commands hidden by other commands. The commands tree is also
+used for video stream detection. libspice also maintains a queue of commands to
+be sent to the client, for updating its display. When a command is pulled from
+the queue for transmission to the client, it is translated into Spice protocol
+messages. Commands removed from the tree, are removed from the send queue as
+well. When a command is no longer required by libspice, it is pushed into the
+device release ring. The driver uses this ring for releasing commands resources.
+When a client receives a graphic command it uses the command to update the
+display.
++
+. Agent Commands Flow
++
+.Agent Commands Flow
+image::a_cmd_flow.png[align="center"]
++
+Spice agent is a software module executed in the guest. Spice server and client
+use the agent for tasks that need to be performed in the guest context, such as
+configuring the guest display settings. The figure above shows the Spice client
+and server communication with the agent using VDIPort device and guest driver.
+Messages can be generated by the client (e.g., configuration of the guest
+display settings), the server (e.g., mouse motion), and the agent (e.g.,
+configuration ack). The driver communicates with the device using its input and
+output rings. Client and server generated messages are written to the same write
+queue in the server and are later written to the device output ring. Messages
+are read from the device input ring to the server read buffer. The message port
+determines whether the message should be handled by the server or forwarded to
+the client.
+
+== Spice Client
+
+Spice cross-platform (Linux & Windows) client is the interface for the end user.
+
+. Client Basic Structure
++
+.Client Basic Structure
+image::cli_bsc_stc.png[align="center"]
++
+. Client Classes
++
+Following is an introduction to the key classes of the Spice client. For having
+a clean cross-platform structure, Spice defines generic interfaces, keeping
+their platform-specific implementation in parallel directories. One such generic
+interface is the Platform class, defining many low-level services such as timer
+and cursor operations.
++
+*Application* is the main class, which contains and controls the client,
+monitors and screens. It handles general application functionality such as
+parsing command line arguments, running the main message loop, handling events
+(connection, disconnection, error, etc.), redirection of mouse events to input
+handler, toggling full screen mode, etc.
++
+.. Channels
++
+The client and server communicate via channels. Each channel type is dedicated
+to a specific type of data. Each channel uses a dedicated TCP socket, and it can
+be secured (using SSL) or unsecured. On the client side each channel has a
+dedicated thread, so different QoS can be given to each one by differentiating
+their thread priority.
++
+*RedClient* serves as the main channel. It owns all the other instantiated channels and controls
+them (creating channels using their factory, connecting, disconnecting, etc.), and handles control,
+configuration and migration (using the Migrate class).
++
+The ancestors of all the channels are:
++
+* RedPeer - socket wrapper for secured and unsecured communication, providing infrastructures such
+ as connect, disconnect, close, send, receive, and socket swapping for migration. It defines
+generic message classes: InMessages, CompoundInMessage and OutMessage. All messages include type,
+size and data.
+* RedChannelBase - inherits RedPeer, provides the basic functionality for establishing channel
+ connectivity with the server and support for channel capability exchange with the server.
+* RedChannel - inherits RedChannelBase. This class is the parent of all instantiated channels.
+ Handles sending outgoing messages and dispatching incoming messages. RedChannel thread runs an
+event loop with various event sources (e.g., send and abort triggers). The channel socket is added
+as an event source for triggering Spice messages sending and receiving.
++
+The available channels are:
++
+* Main - implemented by RedClient (see above).
+* DisplayChannel - handles graphic commands, images and video streams.
+* InputsChannel - keyboard and mouse inputs.
+* CursorChannel - pointer device position, visibility and cursor shape.
+* PlaybackChannel - audio received from the server to be played by the client .
+* RecordChannel - audio captured on the client side.
++
+ChannelFactory is the base class for all channel factories. Each channel registers its specific
+factory for enabling RedClient to create channels by channel type.
++
+.. Screens and Windows
++
+* ScreenLayer - screen layer is attached to specific screen, providing operations on rectangle areas
+ (set, clear, update, invalidate, etc.). Layers are z-ordered (e.g., cursor is above display).
+* RedScreen - implements the screen logic and controls the window, using the screen layers (e.g.,
+ display, cursor) for displaying its content
+* RedDrawable - platform-specific implementation of basic pixmap. It supports basic rendering
+ operations (e.g., copy, blend, combine).
+* RedWindow_p - platform-specific window data and methods.
+* RedWindow - inherits RedDrawable and RedWindow_p. Cross-platform implementation of basic window
+ state and functionality (e.g., show, hide, move, minimize, set title, set cursor etc.).
++
+. Spice Server
++
+Spice server is implemented in libspice, a Virtual Device Interface (VDI) pluggable library. VDI
+provides a standard way to publish interfaces of virtual devices by a software component. This
+enables other software components to interact with these devices. For more information, refer to
+footnote:svdi[]. From one side, the server communicates with a remote client using the Spice
+protocol. From the other side, it interacts with the VDI host application (e.g., QEMU).
+For display remoting purposes the server maintains a commands queue and a tree for managing the
+current objects dependencies and hidings. QXL commands are processed and translated to Spice
+protocol commands sent to the client.
+Spice always attempts to pass the rendering tasks to the client, thus leveraging its hardware
+acceleration abilities. Rendering on the host side, by software or GPU, is done as a last result.
+The Spice server keeps guest graphic commands that compose the current image. It releases a command
+only when it is completely covered by other commands and there are no dependencies on it, or when we
+need to render the command to the frame buffer. The two main reasons that trigger drawing to the
+frame buffer are (1) Running out of resources; (2) The guest needs to read from the frame buffer.
++
+.. Server Structure
++
+.Sever Structure
+image::srv_stc.png[align="center"]
++
+The server communicates with the client via channels. Each channel type is dedicated to a specific
+type of data. Each channel uses a dedicated TCP socket, and it can be secured (using SSL) or
+unsecured. The server channels are analogous of the client channels: Main, Inputs, Display, Cursor,
+Playback, and Record (for more information see Channels 2.3.2.1)
++
+The main and input channels are controlled by handler functions (implemented in reds.c). The display
+and cursor channels are handled by a red worker thread per display. The audio playback and record
+channels have their own handlers (snd_worker.c). Libspice and the VDI host application (e.g. QEMU)
+communicate via interfaces defined for each functionality (e.g., QXL, agent, keyboard, mouse,
+tablet, playback, record), as detailed in footnote:svdi[].
++
+As shown in the above figures, spice server consists of the following major components:
++
+... Red Server (reds.c)
++
+The server itself, which listens for client connections, accepts them and communicates with them.
+Reds is responsible for:
++
+* Channels
+** Owns and manages the channels (register, unregister, shutdown)
+** Informs the client about active channels, so that client can create them
+** Main and input channel handling
+** Links establishment (both main and the others)
+** Socket operations and connections management
+* Handles SSL and ticketing
+* VDI interfaces (e.g., core, migration, keyboard, mouse, tablet, agent) addition and removal
+* Migration process coordination
+* Handling of user commands (e.g., from Qemu monitor)
+* Communication with guest agent
+* Statistics
++
+... Graphics subsystem
++
+.Graphics subsystem
+image::g_sub.png[align="center"]
++
+Unlike other subsystems in Spice server, the graphics subsystem runs in parallel to the server
+execution, on a dedicated thread (i.e, red worker).This structure enables independency between QEMU
+flow and the processing and rendering of incoming graphic commands, which can consume a lot of CPU
+resources. The figure above shows Spice server graphics subsystem structure. Red server initiates a
+dispatcher on a new QXL interface (i.e., VDI). The dispatcher creates red worker for that interface.
+The commands processed by the worker can originate from three sources: (1) Synchronized QXL device
+commands, (2) red server commands, both (1 and 2) delivered by the dispatcher using a socket (i.e.,
+socket pair), (3) asynchronous QXL device commands, pulled by the worker from the QXL device rings
+using the interface.
++
+*_Red Worker (red_worker.c)_*
++
+Spice server holds a different instance of the red worker thread for each QXL device instance. The
+responsibilities of the red_worker are:
++
+* Processing QXL device commands (e.g. draw, update, cursor)
+* Handling messages received from the dispatcher
+* Channel pipes and pipe items
+* Display and cursor channels
+* Image compression (using quic, lz, glzencoding and jpeg)
+* Video streaming - identification, encoding and stream creation
+* Cache - client shared pixmap cache, cursor cache, palette cache
+* Graphic items removal optimization - using item tree, containers, shadows, excluded regions,
+ opaque items
+* Cairo and OpenGL (pbuf and pixmap) renderers - canvas, surfaces etc.
+* Ring operations
+
++
+*_Red Dispatcher (red_dispatcher.c)_*
++
+* Dispatcher, one per QXL device instance
+* Encapsulates the worker internals from the QXL device and reds
+* Initiates a worker for a QXL device instance and creates a worker thread
+* Dispatches the worker using a socketpair channel
+* QXL devices use the QXLWorker interface, implemented and attached by the red dispatcher, which
+ translates the device calls to messages transmitted through the red worker pipe. This way keeps
+the two separated and logically independent.
+* Reds uses the interface defined in red_dispatcher.h for dispatcher functions such as dispatcher
+ initialization, image compression change, video streaming state change, mouse mode setting and
+renderer addition.
++
+. Spice Protocol
++
+Spice protocol is used for client-server communication, i.e., for transferring graphical objects,
+keyboard and mouse events, cursor information, audio playback and record chunks, and control
+commands. Detailed documentation of the Spice protocol can be found in
+footnote:spice_remote[Spice remote computing protocol definition].
++
+. QXL Device
++
+Spice server supports QXL VDI interface. When libspice is used with QEMU, a specific QEMU QXL PCI
+device can be used for improving the remote display performance and enhancing the graphic
+capabilities of the guest graphic system. QXL device requires guest QXL drivers for full
+functionality. However, standard VGA is supported when no driver exists. This mode also enables
+active display from the virtual machine (VM) boot stage. The device interacts with the driver using
+command and cursor rings, interrupts for display and cursor events, and I/O ports. Other
+responsibilities of the device include:
++
+* Initializing and map the device ROM, RAM and VRAM to physical memory
+* Mapping the I/O ports and handle reads and writes for managing: area updates, command and cursor
+ notifications, IRQ updates, mode set, device reset, logging, etc.
+* Rings - initialize and maintain command and cursor rings, get commands and cursor commands from
+ rings and wait for notifications. Maintain resources ring.
+* Communicating with the corresponding red worker using the QXLWorker interface, implemented and
+ attached by red dispatcher, which translates the device calls to messages written to and read from
+the red worker pipe.
+* Registering the QXLInterface for enabling the worker to communicate with the device. The interface
+ includes PCI information and functions for attaching a worker, getting display and cursor commands
+from rings, display and cursor notifications, mode change notification, etc.
+* Defining supported qxl modes and enabling modification of the current mode, including vga mode,
+ where all monitors mirror a single device (vga clients)
+* Handle display initialization, update, resize andrefresh in VGA mode
++
+. QXL Guest Drivers
++
+Platform-specific guest drivers are used to enable and communicate with the QXL device(s). The
+Windows drivers consist of a display driver that works with the graphics device interface (GDI)
+calls and structures, and a miniport driver that handles memory mapping, ports, and interrupts.
++
+. Spice Agent
++
+Spice agent is an optional component for enhancing user experience and performing guest-oriented
+tasks. For example, the agent injects mouse position and state to the guest when using client mouse
+mode. It also enabled copy/paste of text and images between the guest and the client. In addition,
+it is used for configuration of the guest display settings. The agent consists of a system service
+and a user process. There is a windows and a linux implementation.
+
+== Features
+
+. Graphic Commands
++
+Spice supports transmission and handling of 2D graphic commands (3D support is soon to come), as
+opposed to frame buffer updates, which are used in many other remote desktop solutions. The QXL
+device commands are generic and platform-independent, so both Windows and X drivers use them
+natively.
++
+. Hardware Acceleration
++
+The basic Spice client rendering is performed using Cairo, which is a cross-platform,
+device-independent library. Cairo provides vector graphics primitives for 2-dimensional drawing.
+Hardware acceleration is an additional rendering mode in which the rendering is performed on
+hardware by the client GPU and not by software, using the client CPU. Hardware acceleration is
+implemented using OpenGL (experimental) in Linux, and GDI in Windows. . Hardware acceleration
+advantages are:
++
+* High performance rendering - using OpenGL the Spice client is able to render much faster than
+ before. Heavy software operations such as stretching (used by video streaming) are much faster
+when preformed by hardware than by software. Therefore, Spice achieves a much smoother user
+experience.
+* Reducing client CPU usage - the client enjoys more CPU time, which can be used for other tasks
+ like audio.
++
+Unlike Cairo, which is an independent software library, OpenGL is a hardware library that depends on
+the driver and hardware implementation. As a result, Spice might suffer from incorrect rendering,
+heavy CPU usage, or client or host crash in the worst case. In addition, although OpenGL is a
+global standard, the implementation of hardware and drivers changes dramatically between vendors.
+Thus, on different GPUs, Spice might display different rendering output, and different performance
+might be detected. In addition, there are devices which do not support OpenGL at all.
++
+The server also uses OpenGL for hardware acceleration, sharing the same code as the Linux client.
++
+. Image Compression
++
+Spice offers several image compression algorithms, which can be chosen on server initiation, and
+dynamically at run-time. Quic is Spice proprietary image compression utility which is based on the
+SFALIC algorithm footnote:sfalic[Starosolski&#44; R.:
+http://sun.aei.polsl.pl/~rstaros/papers/s2006-spe-sfalic.pdf[Simple Fast and Adaptive Lossless Image
+Compression Algorithm], Software-Practice and Experience, 2007, 37(1):65-91, DOI 10.1002/spe.746.].
+The LZ (LZSS) footnote:lzss[Lempel-Ziv-Storer-Szymanski: &ldquo;Data compression via textual
+substitution&rdquo; published in Journal of the ACM (pp. 928-951)] algorithm, adjusted to images, is
+another option. Both Quic and LZ are local algorithms, i.e., they encode each image independently.
+Global LZ (GLZ) is another Spice proprietary, that uses LZ with an history-based global dictionary.
+GLZ takes advantage of repeating patterns among images for shrinking the traffic and save bandwidth,
+which is critical in a WAN environment. Spice also offers an automatic mode for compression
+selection per-image, where the choice between LZ/GLZ and Quic is heuristically based on the image
+properties. Conceptually, artificial images are compressed better by LZ/GLZ, and real images are
+compressed better by Quic.
++
+. Video Compression
++
+Spice uses lossless compression for images sent to the client, and not lossy compression, in order
+to avoid disruption of important display objects . However, since (1) video streams can be major
+consumers of bandwith, as each video frame is an independent image, and (2) their content is mostly
+uncritical, Spice employs lossy video compression for such streams: Spice server heuristically
+identifies video areas by identifying regions that are updated with high rate. These areas updates
+are sent to the client as video streams coded using the loss-prone Motion JPEG algorithm (M-JPEG).
+This mechanism saves a lot of traffic, improving Spice performance, especially in WAN. Nevertheless,
+in some circumstances the heuristic behavior might cause low quality images (e.g., when identifying
+updated text area as a video stream). Video streaming can be chosen on server initiation and can be
+changed dynamically on run-time..
++
+. Caching
++
+Spice implements client image caching in order to avoid redundant transmissions to the client.
+Caching applies to any kind of image data sent to the client, including pixmaps, palettes and
+cursors. Each image arrives from the driver with a unique id and a cache hint. Non-identical images
+have different ids, while identical images share the same id. The cache hint recommends the server
+to cache the image. Pixmap cache is shared among all the displays. Cache is defined per connection
+and synchronized between the server and the client, i.e., in each moment the server knows exactly
+which images are in the client cache. Moreover, the server is the one to decide whether an item
+should be added or removed from the cache. The client cache size is set by the client and
+transferred to the server through the display channel initialization message. The server monitors
+the current cache capacity and when it lacks space it removes the least recently used cache items
+until there is enough available cache space. The server sends an invalidate command with these items
+and the client removes them.
++
+. Mouse Modes
++
+Spice supports two mouse modes, server and client. The mode can change dynamically and is negotiated
+between the client and the server.
++
+* Server mouse - use the QEMU ps/2 mouse emulation for enabling mouse in the guest. Upon user click
+ inside the Spice client window, client mouse is captured and set invisible. The client sends mouse
+moves as delta coordinates to the server. Therefore, client mouse is returned to the window center
+after each move. In this mode, the server controls mouse position on display, so it is always
+synchronized between the client and the guest. However, it might be problematic on WAN or a loaded
+server, where mouse cursor might have some latency or non-responsiveness.
+* Client mouse - client mouse is used as the effective pointing device. It is not captured and guest
+ cursor is set invisible. The client sends mouse moves as absolute coordinates to the server. Guest
+agent scales the coordinates for the guest virtual desktop and injects the appropriate cursor
+position. For a single monitor, client mouse can be used even without an agent if VDI host
+application registers an absolute pointing device (e.g., USB tablet in QEMU). In this case. the
+Spice server scales the coordinates. Client mode is appropriate for WAN or loaded server, since
+cursor has smooth motion and responsiveness. However, the cursor might loss sync (position and
+shape) for a while. The client mouse cursor is updated according to the guest mouse cursor.
++
+. Multiple Monitors
++
+Spice supports any number of monitors, constrained only by the guest, client, and server
+limitations. The number of monitors and their RAM size is set when launching the VM. Spice supports
+automatic configuration of the guest monitors resolution and display settings, according to the
+client machine settings. This is implemented by a client command to the guest agent.
++
+. 2-way Audio and Lip-sync
++
+Spice supports audio playback and recording. Playback is compressed using the OPUS algorithm.
+Lip-sync between video and audio is achieved by time-stamping the video frames in the QXL device and
+injecting them in the client side, synchronized with the audio, which is independent.
++
+. Hardware Cursor
++
+The QXL device supports cursor hardware acceleration. Separating the cursor from the display enables
+prioritizing the cursor for better responsiveness. In addition, it reduces the network traffic.
++
+. Live Migration
++
+VM migration between servers is seamless to a connected client. The complete connection state,
+including the open channels and cursor, is saved on the source and restored on the destination.
++
+. WAN optimizations
++
+The server sends an initial ping message to determine latency and bandwidth. If they are worst then
+a threshold, the server tells the guest to reduce guest side features, currently implemented only in
+windows guests, reducing bit depth and disabling animations and wallpaper, and additionally images
+are compressed using lossless jpeg and zlib-glz. If an image is required for another operation such
+as or it is resent in lossless encoding.
++
+. Copy and Paste
++
+When a guest agent is running there is support for copying and pasting text and images in both
+directions between the client and the guest.
diff --git a/docs/spice_protocol.txt b/docs/spice_protocol.txt
new file mode 100644
index 00000000..fc795bb7
--- /dev/null
+++ b/docs/spice_protocol.txt
@@ -0,0 +1,2730 @@
+= Spice Protocol
+:revnumber: v1.0
+:revdate: 01.01.2009
+:revremark: Draft 1
+
+Copyright (C) 2009 Red Hat, Inc. +
+Licensed under a Creative Commons Attribution-Share Alike 3.0 +
+United States License (see
+http://creativecommons.org/licenses/by-sa/3.0/us/legalcode) +
+
+:toc:
+
+== Introduction
+
+Spice protocol defines a set of protocol messages for accessing, controlling,
+and receiving inputs from remote computing devices (e.g., keyboard, video,
+mouse) across networks, and sending output to them. A controlled device can
+reside on either side, client and/or server. In addition, the protocol defines
+a set of calls for supporting migration of a remote server from one network
+address to another. Encryption of transported data, with one exception, was
+kept out of the protocol for maximum flexibility in choosing an encryption
+method. Spice uses simple messaging and does not depend on any RPC standard or
+a specific transport layer.
+
+Spice communication session is split into multiple communication channels
+(e.g., every channel is a remote device) in order to have the ability to
+control communication and execution of messages according to the channel type
+(e.g. QoS encryption), and to add and remove communication channels during run
+time (which is supported by spice protocol definition). The following
+communication channels are defined in the current protocol definition: a). the
+main channel serves as the main spice session connection b). display channel
+for receiving remote display updates c). inputs channel for sending mouse and
+keyboard events d). cursor channel for receiving pointer shape and position e).
+Playback channel for receiving audio stream, and f). Record channel for sending
+audio capture. More channel types will be added as the protocol evolves. Spice
+also defines a set of protocol definitions for synchronizing channels`
+execution on the remote site.
+
+== Common Protocol definition
+
+. Endianness
++
+Unless stated otherwise, all data structures are packed and byte and bit order
+is in little endian format.
++
+. Data types
++
+.. UINT8 – 8 bits unsigned integer
+.. INT16 – 16 bits signed integer
+.. UINT16 – 16 bits unsigned integer
+.. UINT32 – 32 bits unsigned integer
+.. INT32 - 32 bits signed integer
+.. UINT64 – 64 bits unsigned integer
+.. SPICE_ADDRESS - 64 bits unsigned integer, value is the offset of the addressed
+data from the beginning of spice protocol message body (i.e., data following
+SpiceDataHeader or SpicedSubMessage).
+.. SPICE_FIXED28_4 – 32 bits fixed point number. 28 high bits are signed integer. Low
+4 bits is unsigned integer numerator of a fraction with denominator 16.
+.. POINT
++
+INT32 x +
+INT32 y +
++
+.. POINT16
++
+INT16 x +
+INT16 y +
++
+.. RECT
++
+INT32 top +
+INT32 left +
+INT32 bottom +
+INT32 right +
++
+.. POINTFIX
++
+SPICE_FIXED28_4 x +
+SPICE_FIXED28_4 y +
++
+. Protocol Magic number UINT8[4]
++
+SPICE_MAGIC = { 0x52, 0x45, 0x44, 0x51} // "REDQ"
++
+. Protocol version
++
+Protocol version defined as two UINT32 values, major protocol version and
+minor protocol version. Server and client having the same major version must
+keep compatibility regardless of minor version (i.e., incrementing the major
+version brakes compatibility). Major protocol version with "huge" value are
+reserved for development purposes and are considered unsupported and
+unreliable. "huge" values are defined as having bit 31 set. The minor protocol
+version is incremented on every protocol change that does not break
+compatibility. It is set to zero on major protocol version increment.
++
+.. Current Protocol version
++
+[source,c]
+----
+SPICE_VERSION_MAJOR = 2
+SPICE_VERSION_MINOR = 2
+----
++
+. Compatibility – UINT32[]
++
+In order to allow some degree of flexibility in client and server
+implementation and in order to improve compatibility, spice protocol supports
+bidirectional exchange of channels compatibilities. Compatibilities are
+expressed in UINT32 vector that is split into two groups: common
+compatibilities and channels compatibilities. Common compatibilities stands for
+compatibilities shared by all channels, and channels compatibilities stands
+for channel specific compatibilities. Splitting the vector into two types
+allows us to add channel compatibilities independently. Each compatibility is
+expressed using one or more bits in the compatibilities vector.
+For example capability 0 will be the low bit of the first (index 0) UINT32.
++
+. Channel types – UINT8
++
+[source,c]
+----
+SPICE_CHANNEL_MAIN = 1
+SPICE_CHANNEL_DISPLAY = 2
+SPICE_CHANNEL_INPUTS = 3
+SPICE_CHANNEL_CURSOR = 4
+SPICE_CHANNEL_PLAYBACK = 5
+SPICE_CHANNEL_RECORD = 6
+SPICE_CHANNEL_TUNNEL = 7 // obsolete
+SPICE_CHANNEL_SMARTCARD = 8
+SPICE_CHANNEL_USBREDIR = 9
+SPICE_CHANNEL_PORT = 10
+SPICE_CHANNEL_WEBDAV = 11
+----
++
+. Error codes UINT32
++
+[source,c]
+----
+SPICE_LINK_ERR_OK = 0
+SPICE_LINK_ERR_ERROR = 1
+SPICE_LINK_ERR_INVALID_MAGIC = 2
+SPICE_LINK_ERR_INVALID_DATA = 3
+SPICE_LINK_ERR_VERSION_MISMATCH = 4
+SPICE_LINK_ERR_NEED_SECURED = 5
+SPICE_LINK_ERR_NEED_UNSECURED = 6
+SPICE_LINK_ERR_PERMISSION_DENIED = 7
+SPICE_LINK_ERR_BAD_CONNECTION_ID = 8
+SPICE_LINK_ERR_CHANNEL_NOT_AVAILABLE = 9
+----
++
+. Warning codes
++
+[source,c]
+----
+SPICE_WARN_GENERAL = 0
+----
++
+. Information codes
++
+[source,c]
+----
+SPICE_INFO_GENERAL = 0
+----
++
+. public key buffer size.
++
+[source,c]
+----
+SPICE_TICKET_PUBKEY_BYTES = 162 /* size needed for holding 1024 bit RSA public
+key in X.509 SubjectPublicKeyInfo format. */
+----
++
+. Channel link: establishing a channel connection.
++
+.. Connection process
++
+The channel connection process is initiated by the client. The client sends
+SpiceLinkMess. In response, the server sends SpiceLinkReply. When the client
+receives SpiceLinkReply, it examines the error code and in case there is no
+error it encrypts its password with public key received in SpiceLinkReply and
+sends it to the server. The server receive the password and sends the link
+result to the client. The client examines the link result, and in case the
+result equals to SPICE_LINK_ERR_OK, a valid connection is established.
++
+Channel connection for channel types other then SPICE_CHANNEL_MAIN is allowed
+only after the client has active SPICE_CHANNEL_MAIN channel connection. Only one
+SPICE_CHANNEL_MAIN connection is allowed, and this channel connection establishes
+spice session with the remote server.
++
+.. Ticketing
++
+Ticketing is a mechanism implemented in spice to ensure connections are opened
+only from authorized sources. To enable this mechanism a ticket is set in spice
+server consisting of a password and time validity. After time validity passes,
+the whole ticket is expired. The ticket is encrypted. To encrypt, server
+generates a 1024 bit RSA key and send the public part to the client (via
+RedLinkInfo). Client uses this key to encrypt the password and send it back to
+server (after SpiceLinkMess). Server decrypt the password, compare it to ticket
+and ensure it was received within the allowed time-frame.
++
+.. SpiceLinkMess definition.
++
+[cols="2*"]
+|===
+|UINT32 magic
+|value of this fields must be equal to SPICE_MAGIC
+
+|UINT32 major_version
+| value of this fields must be equal to SPICE_VERSION_MAJOR
+
+|UINT32 minor_version
+|value of this fields must be equal to SPICE_VERSION_MINOR
+
+|UINT32 size
+|number of bytes following this field to the end of this message.
+
+|UINT32 connection_id
+|In case of a new session (i.e., channel type is SPICE_CHANNEL_MAIN) this field
+is set to zero, and in response the server will allocate session id and will
+send it via the SpiceLinkReply message. In case of all other channel types, this
+field will be equal to the allocated session id.
+
+|UINT8 channel_type
+|one of SPICE_CHANNEL_?
+
+|UINT8 channel_id
+|channel id to connect to. This enables having multiple channels of the same
+type.
+
+|UINT32 num_common_caps
+|number of common client channel capabilities words
+
+|UINT32 num_channel_caps
+|number of specific client channel capabilities words
+
+|UINT32 caps_offset
+|location of the start of the capabilities vector given by the bytes offset
+from the “ size” member (i.e., from the address of the “connection_id” member).
+|===
++
+.. SpiceLinkReply definition
++
+[cols="2*"]
+|===
+|UINT32 magic
+|value of this field must be equal to SPICE_MAGIC
+
+|UINT32 major_version
+|server major protocol version.
+
+|UINT32 minor_version
+|server minor protocol version.
+
+|UINT32 size
+|number of bytes following this field to the end of this message.
+
+|UINT32 error
+|Error codes (i.e., SPICE_LINK_ERR_?)
+
+|UINT8[SPICE_TICKET_PUBKEY_BYTES] pub_key
+|1024 bit RSA public key in X.509 SubjectPublicKeyInfo format.
+
+|UINT32 num_common_caps
+|number of common server channel capabilities words
+
+|UINT32 num_channel_caps
+|number of specific server channel capabilities words
+
+|UINT32 caps_offset
+|location of the start of the capabilities vector given by the bytes offset
+from the “ size” member (i.e., from the address of
+the “connection_id” member)
+|===
++
+.. Encrypted Password
++
+Client sends RSA encrypted password, with public key received from server (in
+SpiceLinkReply). Format is EME-OAEP as described in PKCS#1 v2.0 with SHA-1, MGF1
+and an empty encoding parameter.
++
+.. Link Result UINT32
++
+The server sends link result error code (i.e., SPICE_LINK_ERR_?)
++
+. Protocol message definition
++
+All messages transmitted after the link stage have a common message layout. It
+begins with SpiceDataHeader which describes one main message and an optional sub
+messages list.
++
+.. SpiceDataHeader
++
+[cols="2*"]
+|===
+|UINT64 serial
+|serial number of the message within the channel. Serial numbers start with a
+value of 1 and are incremented on every message transmitted.
+
+|UINT16 type
+|message type can be one that is accepted by all channel (e.g., SPICE_MSG_MIGRATE),
+or specific to a channel type (e.g., SPICE_MSG_DISPLAY_MODE for display channel).
+
+|UINT32 size
+|size of the message body in bytes. In case sub_list (see below) is not zero
+then the actual main message size is sub_list. The message body follows
+SpiceDataHeader
+
+|UINT32 sub_list
+|optional sub-messages list. If this field is not zero then sub_list is the
+offset in bytes to SpiceSubMessageList from the end of SpiceDataHeader. All
+sub-messages need to be executed before the main message, and in the order they
+appear in the sub-messageslist.
+|===
++
+.. SpiceSubMessageList
++
+[cols="2*"]
+|===
+|UINT16 size
+|number of sub-messages in this list.
+
+|UINT32[] sub_messages
+|array of offsets to sub message, offset is number of bytes from the end of
+SpiceDataHeader to start of SpicedSubMessage.
+|===
++
+.. SpicedSubMessage
++
+[cols="2*"]
+|===
+|UINT16 type
+|message type can be one that is accepted by all channel (e.g., SPICE_MSG_MIGRATE),
+or specific to a channel type (e.g., SPICE_MSG_DISPLAY_MODE for display channel).
+
+|UINT32 size
+|size of the message body in bytes. The message body follows SpicedSubMessage.
+|===
++
+. Common messages and messaging naming convention
++
+Messages types and message body structures are prefixed according to the
+source of the message. The prefixes for messages sent from the server to the
+client are SPICE_MSG for types and SpiceMsg for structures. For messages sent from the
+client the prefixes are SPICE_MSGC and SpiceMsgc.
++
+. Server messages that are common to all channels
++
+[source,c]
+----
+SPICE_MSG_MIGRATE = 1
+SPICE_MSG_MIGRATE_DATA = 2
+SPICE_MSG_SET_ACK = 3
+SPICE_MSG_PING = 4
+SPICE_MSG_WAIT_FOR_CHANNELS = 5
+SPICE_MSG_DISCONNECTING = 6
+SPICE_MSG_NOTIFY = 7
+
+SPICE_MSG_FIRST_AVAIL = 101
+----
++
+Specific channel server messages start from SPICE_MSG_FIRST_AVAIL. All
+message types from SPICE_MSG_NOTIFY + 1 to SPICE_MSG_FIRST_AVAIL – 1 are reserved
+for further use.
++
+. Client messages that are common to all channels
++
+[source,c]
+----
+SPICE_MSGC_ACK_SYNC = 1
+SPICE_MSGC_ACK = 2
+SPICE_MSGC_PONG = 3
+SPICE_MSGC_MIGRATE_FLUSH_MARK = 4
+SPICE_MSGC_MIGRATE_DATA = 5
+SPICE_MSGC_DISCONNECTING = 6
+
+SPICE_MSGC_FIRST_AVAIL = 101
+----
++
+Specific channel client messages start from SPICE_MSGC_FIRST_AVAIL. All
+message types from SPICE_MSGC_ACK_SYNC+ 1 to SPICE_MSGC_FIRST_AVAIL – 1 are
+reserved for further use.
++
+. Messages acknowledgment.
++
+Spice provides a set of messages for requesting an acknowledgment on every one
+or more messages that the client consumes. In order to request acknowledgment
+messages, the server sends SPICE_MSG_SET_ACK with the requested acknowledgment
+frequency – after how many received messages the client sends acknowledgment. .
+In response, the client sends SPICE_MSGC_ACK_SYNC. From this point, for every
+requested number of messages that the client receive, it will send a SPICE_MSGC_ACK
+message.
++
+.. SPICE_MSG_SET_ACK, SpiceMsgSetAck
++
+[cols="2*"]
+|===
+|UINT32 generation
+|the generation of the acknowledgment sequence. This value will be sent back by
+SPICE_MSGC_ACK_SYNC. It is used for acknowledgment accounting synchronization.
+
+|UINT32 window
+|the window size. Spice client will send acknowledgment for every “window”
+messages. Zero window size will disable messages acknowledgment.
+|===
++
+.. SPICE_MSGC_ACK_SYNC, UINT32
++
+[cols="2*"]
+|===
+|UINT32
+|Spice client sends SpiceMsgSetAck.generation in response to SPICE_MSG_SET_ACK
+|===
++
+.. SPICE_MSGC_ACK, VOID
++
+Spice client sends SPICE_MSGC_ACK message for every SpiceMsgSetAck.window messages it
+consumes.
++
+. Ping
++
+Spice protocol provides ping messages for debugging purpose. Spice server sends
+SPICE_MSG_PING and the client responses with SPICE_MSGC_PONG. The server can measure round
+trip time by subtracting current time with the time that is returned in
+SPICE_MSGC_PONG message.
++
+.. SPICE_MSG_PING, SpiceMsgPing
++
+[cols="2*"]
+|===
+|UINT32 id
+|the id of this message
+
+|UINT64 time
+|time stamp of this message
+|===
++
+.. SPICE_MSGC_PONG, SpiceMsgPing
++
+[cols="2*"]
+|===
+|UINT32 id
+|Spice client copies it from SpiceMsgPing.id
+
+|UINT64 time
+|Spice client copies it from SpiceMsgPing.time
+|===
++
+. Channel migration
++
+Spice supports migration of Spice server. The following common messages
+combined with specific main channel messages is used for migrating channels
+connections between spice servers. We will refer these servers as source and
+destination. Main channel is used for initiating and controlling the migration
+process. The following describes the actual channel migration process.
++
+Channel migration process starts with sending SPICE_MSG_MIGRATE message from the
+server. The client receives the message, examine the attached flags and: if the
+server requests messages flush (i.e., SPICE_MIGRATE_NEED_FLUSH flag is on), the
+client sends SPICE_MSGC_MIGRATE_FLUSH_MARK message to the server. This procedure can
+be used to ensure safe delivery of all mid air messages before performing the
+migration action. if the server requests data transfer (i.e.,
+SPICE_MIGRATE_NEED_DATA_TRANSFER flag is on), the client expects to receive one
+last message from the server before migrating to destination. This message type
+must be SPICE_MSG_MIGRATE_DATA type. The content of the received message will be
+transmitted to the destination on connection swap.
++
+Afterward, the client swaps communication channels (i.e., starts using the
+connection with the destination server). The client can close connection with
+the source server only after all other channels also have finished the
+migration process. If the server side has requested data transfer, the client
+first transmits SPICE_MSGC_MIGRATE_DATA message containing the data received on
+SPICE_MSG_MIGRATE_DATA.
++
+.. Migration flags
++
+[source,c]
+----
+SPICE_MIGRATE_NEED_FLUSH = 1
+SPICE_MIGRATE_NEED_DATA_TRANSFER = 2
+----
++
+.. SPICE_MSG_MIGRATE, SpiceMsgMigrate
++
+[cols="2*"]
+|===
+|UINT32 flags
+|combination of SPICE migration flags.
+|===
++
+... SPICE_MSG_MIGRATE_DATA, UINT8[]
++
+Server migrate data, body of this message is variable length raw data that is
+determined by each channel type independently
++
+... SPICE_MSGC_MIGRATE_FLUSH_MARK, VOID
++
+This messages mark completion of client communication channel flushing.
++
+.. SPICE_MSGC_MIGRATE_DATA, UINT8[]
++
+Post migration data, sent by client to the destination, containing the data
+sent by the source using the SPICE_MSG_MIGRATE_DATA message.
++
+[[channel_sync]]
+. Channel synchronization
++
+Spice provides mechanism for synchronizing channels message execution on the
+client side. The server sends SPICE_MSG_WAIT_FOR_CHANNELS message which contains a
+list of channels messages to wait for (i.e., SpiceMsgWaitForChannels). The Spice
+client will wait for completion of all the messages that are in that list
+before executing any more messages.
++
+.. SpiceWaitForChannel
++
+[cols="2*"]
+|===
+|UINT8 type
+|channel type (e.g., SPICE_CHANNEL_INPUTS)
+
+|UINT8 id
+|channel id.
+
+|UIN64 serial
+|message serial id (i.e, SpiceDataHeader.serial) to wait for
+|===
++
+... SPICE_MSG_WAIT_FOR_CHANNELS, SpiceMsgWaitForChannels
++
+[cols="2*"]
+|===
+|UINT8 wait_count
+|number of items in wait_list
+
+|SpiceWaitForChannel[] wait_list
+|list of channels to wait for.
+|===
++
+. Disconnect reason
++
+The following messages are used for notification about orderly disconnection
+of the server or client.
++
+.. SPICE_MSG_DISCONNECTING, SpiceMsgDisconnect
++
+[cols="2*"]
+|===
+|UINT64 time_stamp
+|time stamp of disconnect action on the server.
+
+|UINT32 reason
+|disconnect reason, SPICE_LINK_ERR_?
+|===
++
+.. SPICE_MSGC_DISCONNECTING, SpiceMsgDisconnect
++
+[cols="2*"]
+|===
+|UINT64 time_stamp
+|time stamp of disconnect action on the client.
+
+|UINT32 reason
+|disconnect reason, SPICE_LINK_ERR_?
+|===
++
+. Server notification
++
+Spice protocol defines message for delivering notifications to the client using
+SPICE_MSG_NOTIFY message. Messages are categorized by severity and visibility. The
+later can be used as hint for the way the message is displayed to the user. For
+example high visibility notifications will trigger message box and low
+visibility notifications will be directed to the log.
++
+.. SPICE_MSG_NOTIFY, SpiceMsgNotify
++
+[cols="2*"]
+|===
+|UINT64 time_stamp
+|server side time stamp of this message.
+
+|UINT32 severity
+|one of SPICE_NOTIFY_SEVERITY_?
+
+|UINT32 visibility
+|one of SPICE_NOTIFY_VISIBILITY_?
+
+|UINT32 what
+|one of SPICE_LINK_ERR_?, SPICE_WARN_? Or SPICE_INFO_?, depending on severity.
+
+|UINT32 message_len
+|size of message
+
+|UINT8[] message
+|message string in UTF8.
+
+|UINT8 0
+|string zero termination
+|===
+
+== Main Channel definition
+
+. Server messages
++
+[source,c]
+----
+SPICE_MSG_MAIN_MIGRATE_BEGIN = 101
+SPICE_MSG_MAIN_MIGRATE_CANCEL = 102
+SPICE_MSG_MAIN_INIT = 103
+SPICE_MSG_MAIN_CHANNELS_LIST = 104
+SPICE_MSG_MAIN_MOUSE_MODE = 105
+SPICE_MSG_MAIN_MULTI_MEDIA_TIME = 106
+
+SPICE_MSG_MAIN_AGENT_CONNECTED = 107
+SPICE_MSG_MAIN_AGENT_DISCONNECTED = 108
+SPICE_MSG_MAIN_AGENT_DATA = 109
+SPICE_MSG_MAIN_AGENT_TOKEN = 110
+----
++
+. Client messages
++
+[source,c]
+----
+SPICE_MSGC_MAIN_CLIENT_INFO = 101
+SPICE_MSGC_MAIN_MIGRATE_CONNECTED = 102
+SPICE_MSGC_MAIN_MIGRATE_CONNECT_ERROR = 103
+SPICE_MSGC_MAIN_ATTACH_CHANNELS = 104
+SPICE_MSGC_MAIN_MOUSE_MODE_REQUEST = 105
+
+SPICE_MSGC_MAIN_AGENT_START = 106
+SPICE_MSGC_MAIN_AGENT_DATA = 107
+SPICE_MSGC_MAIN_AGENT_TOKEN = 108
+----
++
+. Migration control
++
+Spice migration control is performed using the main channel messages. Spice
+server initiates migration process by sending SPICE_MSG_MAIN_MIGRATE_BEGIN message.
+Once the client has completed its pre-migrate procedure it notifies the server
+by transmitting SPICE_MSGC_MAIN_MIGRATE_CONNECTED message. In case of pre-migrate
+procedure error, the client sends SPICE_MSGC_MAIN_MIGRATE_CONNECT_ERROR. Once the server
+receives SPICE_MSGC_MAIN_MIGRATE_CONNECTED he can commence the migration process. The
+server can send SPICE_MSG_MAIN_MIGRATE_CANCEL in order to instruct the client to
+cancel the migration process.
++
+.. SPICE_MSG_MAIN_MIGRATE_BEGIN, SpiceMsgMainMigrationBegin
++
+[cols="2*"]
+|===
+|UINT16 port
+|port of destination server
+
+|UINT16 sport
+|secure port of destination server
+
+|UINT8[] host_name
+|host name of destination server
+|===
++
+.. SPICE_MSG_MAIN_MIGRATE_CANCEL, VOID
++
+Instruct the client to cancel migration process
++
+.. SPICE_MSGC_MAIN_MIGRATE_CONNECTED, VOID
++
+Notify the server of successful completion of the pre-migrate stage
++
+.. SPICE_MSGC_MAIN_MIGRATE_CONNECT_ERROR, VOID
++
+Notify the server of pre-migrate stage error
++
+[[mouse_modes]]
+. Mouse modes
++
+Spice protocol specifies two mouse modes, client mode and server mode. In
+client mode, the affective mouse is the client side mouse: the client sends
+mouse position within the display and the server sends mouse shape messages. In
+server mode, the client sends relative mouse movements and the server sends
+position and shape commands. Spice main channel is used for mouse mode control.
++
+.. Modes
++
+[source,c]
+----
+SPICE_MOUSE_MODE_SERVER = 1
+SPICE_MOUSE_MODE_CLIENT = 2
+----
++
+.. SPICE_MSG_MAIN_MOUSE_MODE, SpiceMsgMainMouseMode
++
+Spice server sends this message on every mouse mode change
++
+[cols="2*"]
+|===
+|UINT32 supported_modes
+|current supported mouse mode, this is any combination of SPICE_MOUSE_MODE_?
+
+|UINT32 current_mode
+|the current mouse mode. Can be one of SPICE_MOUSE_MODE_?
+|===
++
+.. SPICE_MSGC_MAIN_MOUSE_MODE_REQUEST, UINT32
++
+Spice client sends this message to request specific mouse mode. It is not
+guarantied that the server will accept the request. Only on receiving
+SPICE_MSG_MAIN_MOUSE_MODE message, the client can know of actual mouse mode change.
++
+[cols="2*"]
+|===
+|UINT32
+|requested mode, one of SPICE_MOUSE_MODE_?
+|===
++
+. Main channel init message
++
+Spice server must send SpiceMsgMainInit as the first transmitted message t and is
+disallowed to send it at any other point.
++
+.. SPICE_MSG_MAIN_INIT, SpiceMsgMainInit
++
+[cols="2*"]
+|===
+|UINT32 session_id
+|session id is generated by the server. This id will be send on every new
+channel connection within this session (i.e., in SpiceLinkMess.connection_id).
+
+|UINT32 display_channels_hint
+|optional hint of expected number of display channels. Zero is defined as an
+invalid value
+
+|UINT32 supported_mouse_modes
+|supported mouse modes. This is any combination of SPICE_MOUSE_MODE_?
+
+|UINT32 current_mouse_mode
+|the current mouse mode, one of SPICE_MOUSE_MODE_?
+
+|UINT32 agent_connected
+|current state of Spice agent (see <<spice_agent,This Section>>), 0 and 1 stand
+for disconnected and connected state respectively.
+
+|UINT32 agent_tokens
+|number of available tokens for sending messages to Spice agent.
+
+|UINT32 multi_media_time
+|current server multimedia time. The multimedia time is used for synchronizing
+video (for more information see <<multimedia_time,Multimedia time>>)
+
+|UINT32 ram_hint
+|optional hint for help in determining global LZ compression dictionary size
+(for more information see section <<spice_image,Spice Image>> in “Display
+Channel”).
+|===
++
+. Server side channels notification
++
+In order to have the ability to dynamically attach to the server side channels,
+Spice protocol includes SPICE_MSG_MAIN_CHANNELS_LIST message. This massage informs
+the client of available channels in the server side. In response to this
+message the client can decide to link with the new available channel(s). The
+server must receive SPICE_MSGC_MAIN_ATTACH_CHANNELS before sending any
+SPICE_MSG_MAIN_CHANNELS_LIST message.
++
+.. SPICE_MSG_MAIN_CHANNELS_LIST, SpiceMsgChannels
++
+[cols="2*"]
+|===
+|UINT32 num_of_channels
+|number of channels in this list
+
+|SpiceChannelId[] channels
+|vector of “num_of_channels” channel ids
+|===
++
+.. SpiceChannelId
++
+[cols="2*"]
+|===
+|UINT8 type
+|channel type, one of SPICE_CHANNEL_? channel types, except for SPICE_CHANNEL_MAIN
+
+|UINT8 id
+|channel id
+|===
++
+[[multimedia_time]]
+. Multimedia time
++
+Spice defines messages for setting multimedia time for synchronization of video
+and audio streams. Two methods for updating multimedia time are supported. The
+first method uses the time stamp of data that arrives on the playback
+channel.The second method uses the main channel SPICE_MSG_MAIN_MULTI_MEDIA_TIME
+message. The latter method is used when no active playback channel exist.
++
+.. SPICE_MSG_MAIN_MULTI_MEDIA_TIME, UINT32
++
+[cols="2*"]
+|===
+|UINT32
+|multimedia time
+|===
++
+[[spice_agent]]
+. Spice agent
++
+Spice protocol defines a set of messages for bidirectional communication
+channel between Spice client and spice client agent on the remote server. Spice
+provides a communication channel only, the actual transferred data content is
+opaque to the protocol. This channel can be used for various purposes, for
+example, client-guest clipboard sharing, authentication and display
+configuration.
++
+Spice client receives notifications of remote site agent connection as part of
+the SPICE_MSG_MAIN_INIT message or by a specific server SPICE_MSG_MAIN_AGENT_CONNECTED.
+Remote agent disconnection notification is delivered by
+SPICE_MSG_MAIN_AGENT_DISCONNECTED message. A bidirectional tokens mechanism is used
+in order to prevent blocking of the main channel with agent messages (e.g., in
+case the agent stops consuming the data). Each side is not allowed to send more
+messages than the tokens allocated to it by the other side. The number of
+tokens that are allocated for the client is initialized from SPICE_MSG_MAIN_INIT
+message, and farther allocation of tokens is done using SPICE_MSG_MAIN_AGENT_TOKEN.
+Server tokens initial count is delivered in SPICE_MSGC_MAIN_AGENT_START message. This
+message must be the first agent related message that the client sends to the
+server. Farther tokens allocation for the server is done using
+SPICE_MSGC_MAIN_AGENT_TOKEN. Actual data packets are delivered using
+SPICE_MSG_MAIN_AGENT_DATA and SPICE_MSGC_MAIN_AGENT_DATA.
++
+.. Although agent messages are opaque for the protocol, agent data stream is
+defined by Spice protocol in order to delineate messages. Still, the
+client-server communication is independent from the agent channel, e.g., agent
+protocol conflicts don't affect the rest of the channels. Agent stream is
+defined as a run of messages having the following format:
++
+[cols="2*"]
+|===
+|UINT32 protocol
+|unique protocol of this message. The protocol id must be registered in order
+to prevent conflicts.
+
+|UINT32 type
+|protocol dependent message type.
+
+|UINT64 opaque
+|protocol dependent opaque data.
+
+|UINT32 size
+|size of data in bytes.
+
+|UINT8 data[0]
+|data of this message.
+|===
++
+Client and server must continue processing unknown protocols messages or
+messages having unknown type (i.e., receive and dump).
++
+.. SPICE_MSG_MAIN_AGENT_CONNECTED, VOID
+.. SPICE_MSG_MAIN_AGENT_DISCONNECTED, UINT32
++
+[cols="2*"]
+|===
+|UINT32
+|disconnect error code SPICE_LINK_ERR_?
+|===
++
+.. SPICE_AGENT_MAX_DATA_SIZE = 2048
+.. SPICE_MSG_MAIN_AGENT_DATA, UINT8[]
++
+Agent packet is the entire message body (i.e. SpiceDataHeader.size). The maximum
+packet size is SPICE_AGENT_MAX_DATA_SIZE.
++
+.. SPICE_MSG_MAIN_AGENT_TOKEN, UINT32
++
+[cols="2*"]
+|===
+|UINT32
+|allocated tokens count for the client
+|===
++
+.. SPICE_MSGC_MAIN_AGENT_START, UINT32
++
+[cols="2*"]
+|===
+|UINT32
+|allocated tokens count for the server
+|===
++
+.. SPICE_MSGC_MAIN_AGENT_DATA, UINT8[]
++
+Agent packet is the entire message body (i.e. SpiceDataHeader.size). The maximum
+packet size is SPICE_AGENT_MAX_DATA_SIZE.
++
+.. SPICE_MSGC_MAIN_AGENT_TOKEN, UINT32
++
+[cols="2*"]
+|===
+|UINT32
+|allocated tokens count for the server
+|===
+
+== Inputs channel definition
+
+Spice Inputs channel controls the server mouse and the keyboard.
+
+. Client messages
++
+[source,c]
+----
+SPICE_MSGC_INPUTS_KEY_DOWN = 101
+SPICE_MSGC_INPUTS_KEY_UP = 102
+SPICE_MSGC_INPUTS_KEY_MODIFIERS = 103
+
+SPICE_MSGC_INPUTS_MOUSE_MOTION = 111
+SPICE_MSGC_INPUTS_MOUSE_POSITION = 112
+SPICE_MSGC_INPUTS_MOUSE_PRESS = 113
+SPICE_MSGC_INPUTS_MOUSE_RELEASE = 114
+----
++
+. Server Messages
++
+[source,c]
+----
+SPICE_MSG_INPUTS_INIT = 101
+SPICE_MSG_INPUTS_KEY_MODIFIERS = 102
+
+SPICE_MSG_INPUTS_MOUSE_MOTION_ACK = 111
+----
++
+. Keyboard messages
++
+Spice supports sending keyboard key events and keyboard leds synchronization.
+The client sends key event using SPICE_MSGC_INPUTS_KEY_DOWN and SPICE_MSGC_INPUTS_KEY_UP
+messages. Key value is expressed using PC AT scan code (see
+<<key_code,KeyCode>>). Keyboard leds synchronization is done by sending
+SPICE_MSG_INPUTS_KEY_MODIFIERS message by the server or by sending
+SPICE_MSGC_INPUTS_KEY_MODIFIERS by the client, these messages contain keyboard leds
+state. Keyboard modifiers is also sent by the server using SPICE_MSG_INPUTS_INIT,
+this message must be sent as the first server message and the server mustn't
+send it at any other point.
++
+.. Keyboard led bits
++
+[source,c]
+----
+SPICE_SCROLL_LOCK_MODIFIER = 1
+SPICE_NUM_LOCK_MODIFIER = 2
+SPICE_CAPS_LOCK_MODIFIER = 4
+----
++
+.. SPICE_MSG_INPUTS_INIT, UINT32
++
+[cols="2*"]
+|===
+|UINT32
+|any combination of keyboard led bits. If bit is set then the led is on.
+|===
++
+.. SPICE_MSG_INPUTS_KEY_MODIFIERS, UINT32
++
+[cols="2*"]
+|===
+|UINT32
+|any combination of keyboard led bits. If bit is set then the led is on.
+|===
++
+.. SPICE_MSGC_INPUTS_KEY_MODIFIERS, UINT32
++
+[cols="2*"]
+|===
+|UINT32
+|any combination of keyboard led bits. If bit is set then the led is on.
+|===
++
+[[key_code]]
+.. KeyCode
++
+[cols="2*"]
+|===
+|UINT8[4]
+|the value of key code is a PC AT scan code. The code is composed by up to four
+bytes for supporting extended codes. A code is terminated by a zero byte.
+|===
++
+.. SPICE_MSGC_INPUTS_KEY_DOWN, KeyCode
++
+[cols="2*"]
+|===
+|KeyCode
+|client sends this message to notify of key press event.
+|===
++
+.. SPICE_MSGC_INPUTS_KEY_UP, KeyCode
++
+KeyCode – client sends this message to notify of key release event.
++
+. Mouse messages
++
+spice support two modes of mouse operation: client mouse and server mouse (for
+more information see <<mouse_modes,mouse modes>>). in server mouse mode the
+client sends mouse motion message (i.e., msgc_inputs_mouse_motion), and in
+client mouse mode it sends position message (i.e., msgc_inputs_mouse_position).
+position message holds the position of the client mouse on the display and the
+id of the display channel, which is derived from SpiceLinkMess.channel_id. in
+order to prevent flood of mouse motion/position events, the server sends
+red_inputs_mouse_motion_ack message on every red_motion_ack_bunch messages it
+receive. this mechanism allows the client to keep track on the server's
+messages consumption rate and to change the event pushing policy according to
+it. mouse button events are sent to the server using msgc_inputs_mouse_press
+and msgc_inputs_mouse_release messages.
++
+.. Spice Button ID
++
+[source,c]
+----
+SPICE_MOUSE_BUTTON_LEFT = 1, left button
+SPICE_MOUSE_BUTTON_MIDDLE = 2, middle button
+SPICE_MOUSE_BUTTON_RIGHT = 3, right button
+SPICE_MOUSE_BUTTON_UP = 4, scroll up button
+SPICE_MOUSE_BUTTON_DOWN = 5, scroll down button
+----
++
+.. Buttons masks
++
+[source,c]
+----
+SPICE_MOUSE_BUTTON_MASK_LEFT = 1, left button mask
+SPICE_MOUSE_BUTTON_MASK_MIDDLE = 2, middle button mask
+SPICE_MOUSE_BUTTON_MASK_RIGHT = 4, right button mask
+----
++
+.. SPICE_INPUT_MOTION_ACK_BUNCH
++
+[source,c]
+----
+SPICE_INPUT_MOTION_ACK_BUNCH = 4
+----
++
+.. SPICE_MSGC_INPUTS_MOUSE_MOTION, SpiceMsgcMouseMotion
++
+[cols="2*"]
+|===
+|INT32 dx
+|number of pixels the mouse had moved on x axis
+
+|INT32 dy
+|number of pixels the mouse had moved on y axis
+
+|UINT32 buttons_state
+|any combination of buttons mask. Set bit describe pressed button and clear bit
+describe unpressed button.
+
+|===
++
+.. SPICE_MSGC_INPUTS_MOUSE_POSITION, SpiceMsgcMousePosition
++
+[cols="2*"]
+|===
+|UINT32 x
+|position on x axis
+
+|UINT32 y
+|position on y axis
+
+|UINT32 buttons_state
+|any combination of buttons mask. Set bit describe pressed button and clear bit
+describe unpressed button.
+
+|UINT8 display_id
+|id of the display that client mouse is on.
+|===
++
+.. SPICE_MSGC_INPUTS_MOUSE_PRESS, SpiceMsgcMousePress
++
+[cols="2*"]
+|===
+|UINT32 button
+|one of SPICE_MOUSE_?BUTTON
+
+|UINT32 buttons_state
+|any combination of buttons masks. Set bit describes pressed button, and clear
+bit describes unpressed button.
+|===
++
+.. SPICE_MSGC_INPUTS_MOUSE_RELEASE, SpiceMsgcMouseRelease
++
+[cols="2*"]
+|===
+|UINT32 button
+|one of SPICE_MOUSE_?BUTTON
+
+|UINT32 buttons_state
+|any combination of buttons mask. Set bit describes pressed button and clear
+bit describes unpressed button.
+|===
+
+== Display channel definition
+
+Spice protocol defines a set of messages for supporting rendering of the remote
+display area on the client display. The protocol supports rendering of graphics
+primitives (e.g., lines, images) and video streams. The protocol also supports
+caching of images and color palettes on the client side. Spice display channel
+supports several images compression methods for reducing network traffic.
+
+. Server messages
++
+[source,c]
+----
+SPICE_MSG_DISPLAY_MODE = 101
+SPICE_MSG_DISPLAY_MARK = 102
+SPICE_MSG_DISPLAY_RESET = 103
+SPICE_MSG_DISPLAY_COPY_BITS = 104
+
+SPICE_MSG_DISPLAY_INVAL_LIST = 105
+SPICE_MSG_DISPLAY_INVAL_ALL_PIXMAPS = 106
+SPICE_MSG_DISPLAY_INVAL_PALETTE = 107
+SPICE_MSG_DISPLAY_INVAL_ALL_PALETTES = 108
+
+SPICE_MSG_DISPLAY_STREAM_CREATE = 122
+SPICE_MSG_DISPLAY_STREAM_DATA = 123
+SPICE_MSG_DISPLAY_STREAM_CLIP = 124
+SPICE_MSG_DISPLAY_STREAM_DESTROY = 125
+SPICE_MSG_DISPLAY_STREAM_DESTROY_ALL = 126
+
+SPICE_MSG_DISPLAY_DRAW_FILL = 302
+SPICE_MSG_DISPLAY_DRAW_OPAQUE = 303
+SPICE_MSG_DISPLAY_DRAW_COPY = 304
+SPICE_MSG_DISPLAY_DRAW_BLEND = 305
+SPICE_MSG_DISPLAY_DRAW_BLACKNESS = 306
+SPICE_MSG_DISPLAY_DRAW_WHITENESS = 307
+SPICE_MSG_DISPLAY_DRAW_INVERS = 308
+SPICE_MSG_DISPLAY_DRAW_ROP3 = 309
+SPICE_MSG_DISPLAY_DRAW_STROKE = 310
+SPICE_MSG_DISPLAY_DRAW_TEXT = 311
+SPICE_MSG_DISPLAY_DRAW_TRANSPARENT = 312
+SPICE_MSG_DISPLAY_DRAW_ALPHA_BLEND = 313
+----
++
+. Client messages
++
+[source,c]
+----
+SPICE_MSGC_DISPLAY_INIT = 101
+----
++
+. Operation flow
++
+Spice server sends to the client a mode message using SPICE_MSG_DISPLAY_MODE for
+specifying the current draw area size and format. In response the client
+creates a draw area for rendering all the followed rendering commands sent by
+the server. The client will expose the new remote display area content (i.e.,
+after mode command) only after it receives a mark command (i.e.,
+SPICE_MSG_DISPLAY_MARK) from the server. The server can send a reset command using
+SPICE_MSG_DISPLAY_RESET to instruct the client to drop its draw area and palette
+cache. Sending mode message is allowed only while no active draw area exists
+on the client side. Sending reset message is allowed only while active draw
+area exists on client side. Sending mark message is allowed only once, between
+mode and reset messages. Draw commands, copy bits command and stream commands
+are allowed only if the client have an active display area (i.e., between
+SPICE_MSG_DISPLAY_MODE to SPICE_MSG_DISPLAY_RESET).
++
+On channel connection, the client optionally sends an init message, using
+SPICE_MSGC_DISPLAY_INIT, in order to enable image caching and global dictionary
+compression. The message includes the cache id and its size and the size of the
+dictionary compression window. These sizes and id are determined by the client.
+It is disallowed to send more then one init message.
++
+Color pallets cache are manged by the server.
+Items cache insertion commands are sent as part of the rendering commands.
+Cache items removal are sent explicitly using SPICE_MSG_DISPLAY_INVAL_LIST or
+SPICE_MSG_DISPLAY_INVAL_LIST server messages. Resetting client caches is done by
+sending SPICE_MSG_DISPLAY_INVAL_ALL_PIXMAPS or SPICE_MSG_DISPLAY_INVAL_ALL_PALETTES server
+messages.
++
+. Draw area control
++
+.. SPICE_MSG_DISPLAY_MODE, SpiceMsgDisplayMode
++
+[cols="2*"]
+|===
+|UINT32 width
+|width of the display area
+
+|UINT32 height
+|height of the display area
+
+|UINT32 depth
+|color depth of the display area. Valid values are 16bpp or 32bpp.
+|===
++
+.. SPICE_MSG_DISPLAY_MARK, VOID
++
+Mark the beginning of the display area visibility
++
+.. SPICE_MSG_DISPLAY_RESET, VOID
++
+Drop current display area of the channel and reset palette cache
++
+. Raster operation descriptor
++
+The following defines a set of flags for describing raster operations that can
+be applied on a source image, source brush, destination and the result during a
+rendering operation. Combination of those flags defines the necessary steps
+that are needed to be preformed during a rendering operation. In the
+following definitions of rendering commands this combination is referred to by
+'rop_descriptor'.
++
+[source,c]
+----
+SPICE_ROPD_INVERS_SRC = 1
+----
++
+Source Image need to be inverted before rendering
++
+[source,c]
+----
+SPICE_ROPD_INVERS_BRUSH = 2
+----
++
+SpiceBrush need to be inverted before rendering
++
+[source,c]
+----
+SPICE_ROPD_INVERS_DEST = 4
+----
++
+Destination area need to be inverted before rendering
++
+[source,c]
+----
+SPICE_ROPD_OP_PUT = 8
+----
++
+SpiceCopy operation should be used.
++
+[source,c]
+----
+SPICE_ROPD_OP_OR = 16
+----
++
+OR operation should be used.
++
+[source,c]
+----
+SPICE_ROPD_OP_AND = 32
+----
++
+AND operation should be used.
++
+[source,c]
+----
+SPICE_ROPD_OP_XOR = 64
+----
++
+XOR operation should be used.
++
+[source,c]
+----
+SPICE_ROPD_OP_BLACKNESS = 128
+----
++
+Destination pixel should be replaced by black
++
+[source,c]
+----
+SPICE_ROPD_OP_WHITENESS = 256
+----
++
+Destination pixel should be replaced by white
++
+[source,c]
+----
+SPICE_ROPD_OP_INVERS = 512
+----
++
+Destination pixel should be inverted
++
+[source,c]
+----
+SPICE_ROPD_INVERS_RES = 1024
+----
++
+Result of the operation needs to be inverted
++
+OP_PUT, OP_OR, OP_AND, OP_XOR, OP_BLACKNESS, OP_WHITENESS, and OP_INVERS are
+mutually exclusive
++
+OP_BLACKNESS, OP_WHITENESS, and OP_INVERS are exclusive
++
+. Raw raster image
++
+The following section describes Spice raw raster image (Pixmap). Pixmap is one
+of several ways to transfer images in Spice protocol (for more information see
+<<spice_image,Spice Image>>).
++
+.. Pixmap format types
++
+[source,c]
+----
+PIXMAP_FORMAT_1BIT_LE = 1
+----
++
+1 bit per pixel and bits order is little endian. Each pixel value is an index
+in a color table. The color table size is 2.
++
+[source,c]
+----
+PIXMAP_FORMAT_1BIT_BE = 2
+----
++
+1 bit per pixel and bits order is big endian. Each pixel value is index in a
+color table. The color table size is 2.
++
+[source,c]
+----
+PIXMAP_FORMAT_4BIT_LE = 3
+----
++
+4 bits per pixel and nibble order inside a byte is little endian. Each pixel
+value is an index in a color table. The color table size is 16.
++
+[source,c]
+----
+PIXMAP_FORMAT_4BIT_BE = 4
+----
++
+4 bits per pixel and nibble order inside a byte is big endian. Each pixel value
+is an index in a color table. The color table size is 16.
++
+[source,c]
+----
+PIXMAP_FORMAT_8BIT = 5
+----
++
+8 bits per pixel. Each pixel value is an index in a color table. The color
+table size is 256.
++
+[source,c]
+----
+PIXMAP_FORMAT_16BIT = 6
+----
++
+pixel format is 16 bits RGB555.
++
+[source,c]
+----
+PIXMAP_FORMAT_24BIT = 7
+----
++
+pixel format is 24 bits RGB888.
++
+[source,c]
+----
+PIXMAP_FORMAT_32BIT = 8
+----
++
+pixel format is 32 bits RGB888.
++
+[source,c]
+----
+PIXMAP_FORMAT_RGBA = 9
+----
++
+pixel format is 32 bits ARGB8888.
++
+.. SpicePalette
++
+[cols="2*"]
+|===
+|UINT64 id
+|unique id of the palette
+
+|UINT16 table_size
+|number of entries in the color table
+
+|UINT32[] color_table
+|each entry is RGB555 or RGB888 color depending on the current display area
+mode. If display area mode color depth is 32, the effective format is RGB888.
+If display area mode color depth is 16 the effective format is RGB555.
+|===
++
+.. Pixmap flags
++
+[source,c]
+----
+PIXMAP_FLAG_PAL_CACHE_ME = 1
+----
++
+Instruct the client to add the palette to cache
++
+[source,c]
+----
+PIXMAP_FLAG_PAL_FROM_CACHE = 2
+----
++
+Instruct the client to retrieve palette from cache.
++
+[source,c]
+----
+PIXMAP_FLAG_TOP_DOWN = 4
+----
++
+Pixmap lines are ordered from top to bottom (i.e., line 0 is the highest line).
++
+.. Pixmap
++
+[cols="2*"]
+|===
+|UINT8 format
+|one of PIXMAP_FORMAT_?
+
+|UINT8 flags
+|combination of PIXMAP_FLAG_?
+
+|UINT32 width
+|width of the pixmap
+
+|UINT32 height
+|height of the pixmap
+
+|UINT32 stride
+|number of bytes to add for moving from the beginning of line n to the
+beginning of line n+1
+
+a|
+[source,c]
+----
+union {
+ SPICE_ADDRESS palette;
+ UINT64 palette_id;
+}
+----
+|address of the color palette (must be zero if no color table is required for format) *or* id of the palette (valid if FLAG_PAL_FROM_CACHE is set).
+
+|SPICE_ADDRESS data
+|address of line 0 of the pixmap.
+|===
++
+. LZ with palette
++
+This section describes a data structure that is combination of a color palette
+and a compressed pixmap data. The pixmap is compressed using our implementation
+of LZSS algorithm (see next section). Each decoded pixel value is an index in
+the color palette.
++
+.. LZPalette Flags
++
+[source,c]
+----
+LZPALETTE_FLAG_PAL_CACHE_ME = 1
+----
++
+Instruct the client to add the palette to the cache
++
+[source,c]
+----
+LZPALETTE_FLAG_PAL_FROM_CACHE = 2
+----
++
+Instruct the client to retrieve palette from the cache.
++
+[source,c]
+----
+LZPALETTE_FLAG_TOP_DOWN = 4
+----
++
+pixmap lines are ordered from top to bottom (i.e. line 0 is the highest line).
++
+.. LZPalette
++
+[cols="2*"]
+|===
+|UINT8 flags
+|combination of LZPALETTE_FLAG_?
+
+|UINT32 data_size
+|size of compressed data
+
+a|
+[source,c]
+----
+union {
+ SPICE_ADDRESS palette;
+ UINT64 palette_id;
+}
+----
+|address of the color palette (see SpicePalette section in “Raw raster image”)[zero value
+is disallowed] *or* id of the palette (valid if FLAG_PAL_FROM_CACHE).
+
+|UINT8[] data
+|compressed pixmap
+|===
++
+[[spice_image]]
+. Spice Image
++
+The following section describes Spice image. Spice image is used in various
+commands and data structures for representing a raster image. Spice image
+supports several compression types in addition to the raw mode: Quic, LZ and
+GLZ. Quic is a predictive coding algorithm. It is a generalization of SFALIC
+from gray-scale to color images withe addition of RLE encoding. By LZ we refer
+to the our implementation of the LZSS algorithm, which was adjusted for images
+in different formats. By GLZ we refer to an extension of LZ that allows it to
+use a dictionary that is based on a set of images and not just on the image
+being compressed.
++
+.. Image types
++
+[source,c]
+----
+IMAGE_TYPE_PIXMAP = 0
+SPICE_IMAGE_TYPE_QUIC = 1
+SPICE_IMAGE_TYPE_LZ_PLT = 100
+SPICE_IMAGE_TYPE_LZ_RGB = 101
+SPICE_IMAGE_TYPE_GLZ_RGB = 102
+SPICE_IMAGE_TYPE_FROM_CACHE = 103
+----
++
+.. Image flags
++
+IMAGE_FLAG_CACHE_ME = 1, this flag instruct the client to add the image to
+image cache, cache key is SpiceImageDescriptor.id (see below).
++
+.. SpiceImageDescriptor
++
+[cols="2*"]
+|===
+|UINT64 id
+|unique id of the image
+
+|UINT8 type
+|type of the image. One of IMAGE_TYPE_?
+
+|UINT8 flags
+|any combination of IMAGE_FLAG_?
+
+|UINT32 width
+|width of the image
+
+|UINT32 height
+|height of the image
+|===
++
+.. Image data
++
+Image data follows SpiceImageDescriptor and its content depends on
+SpiceImageDescriptor.type:
++
+* In case of PIXMAP – content is Pixmap.
+* In case of QUIC – content is Quic compressed image. Data begins with the
+size of the compressed data, represented by UINT32, followed by the compressed
+data.
+* In case of LZ_PLT – content is LZPalette.
+* In case of LZ_RGB – content is LZ_RGB – LZ encoding of an RGB image. Data
+begins with the size of the compressed data, represented by UINT32, followed
+by the compressed data.
+* In case of GLZ_RGB – content is GLZ_RGB – GLZ encoding of an RGB image. Data
+begins with the size of the compressed data, represented by UINT32, , followed
+by the compressed data.
+* In case of FROM_CACHE – No image data. The client should use
+SpiceImageDescriptor.id to retrieve the relevant image from cache.
++
+. Glyph SpiceString
++
+Glyph string defines an array of glyphs for rendering. Glyphs in a string can
+be in A1, A4 or A8 format (i.e., 1bpp, 4bpp, or 8bpp alpha mask). Every glyph
+contains its rendering position on the destination draw area.
++
+.. SpiceRasterGlyph
++
+[cols="2*"]
+|===
+|POINT render_pos
+|location of the glyph on the draw area
+
+|POINT glyph_origin
+|origin of the glyph. The origin is relative to the upper left corner of the
+draw area. Positive value on x axis advances leftward and positive value on y
+axis advances upward.
+
+|UINT16 width
+|glyph's width
+
+|UINT16 height
+|glyph's height
+
+|UINT8[] data
+|alpha mask of the glyph. Actual mask data depends on the glyph string's flags.
+If the format is A1 then the line stride is ALIGN(width, 8) / 8. If the format
+is A4, the line stride is ALIGN(width, 2) / 2. If the format is A8, the line
+stride is width.
+|===
++
+.. Glyph SpiceString flags
++
+[source,c]
+----
+GLYPH_STRING_FLAG_RASTER_A1 = 1
+----
++
+Glyphs type is 1bpp alpha value (i.e., 0 is transparent 1 is opaque)
++
+[source,c]
+----
+GLYPH_STRING_FLAG_RASTER_A4 = 2
+----
++
+Glyphs type is 4bpp alpha value (i.e., 0 is transparent 16 is opaque)
++
+[source,c]
+----
+GLYPH_STRING_FLAG_RASTER_A8 = 4
+----
++
+Glyphs type is 4bpp alpha value (i.e., 0 is transparent 256 is opaque)
++
+[source,c]
+----
+GLYPH_STRING_FLAG_RASTER_TOP_DOWN = 8
+----
++
+Line 0 is the top line of the mask
++
+.. GlyphString
++
+[cols="2*"]
+|===
+|UINT16 length
+|number of glyphs
+
+|UINT16 flags
+|combination of GLYPH_STRING_FLAG_?
+
+|UINT8[] data
+|glyphs
+|===
++
+. Data Types
++
+.. RectList
++
+[cols="2*"]
+|===
+|UINT32 count
+|number of RECT items in rects
+
+|RECT[] rects
+|array of <count> RECT
+|===
++
+.. Path segment flags
++
+[source,c]
+----
+PATH_SEGMENT_FLAG_BEGIN = 1
+----
++
+this segment begins a new path
++
+[source,c]
+----
+PATH_SEGMENT_FLAG_END = 2
+----
++
+this segment ends the current path
++
+[source,c]
+----
+PATH_SEGMENT_FLAG_CLOSE = 8
+----
++
+this segment closes the path and is invalid if PATH_SEGMENT_FLAG_END is not set
++
+[source,c]
+----
+PATH_SEGMENT_FLAG_BEZIER = 16
+----
++
+this segment content is a Bezier curve
++
+.. SpicePathSeg
++
+[cols="2*"]
+|===
+|UINT32 flags
+|any combination of PATH_SEGMENT_FLAG_?
+
+|UINT32 count
+|number of points in the segment
+
+|POINTFIX[] points
+|segment points
+|===
++
+.. PathSegList
++
+List of SpicePathSeg items. End of the list is reached if the sum of all previous
+PathSegs' sizes is equal to list_size. Address of next segment is the address
+of SpicePathSeg.points[SpicePathSeg.count]
++
+[cols="2*"]
+|===
+|UINT32 list_size
+|total size of in bytes of all PathSegs in the list,
+|===
++
+SpicePathSeg seg0 – first path segment.
++
+.. SpiceClip types
++
+[source,c]
+----
+SPICE_CLIP_TYPE_NONE = 0
+----
++
+no clipping
++
+[source,c]
+----
+SPICE_CLIP_TYPE_RECTS = 1
+----
++
+data is RectList and union of all rectangles in RectList is the effective clip
++
+[source,c]
+----
+SPICE_CLIP_TYPE_PATH = 2
+----
++
+data is PathSegList and the figure described by PathSegList is the effective
+clip
++
+.. SpiceClip
++
+[cols="2*"]
+|===
+|UIN32 type
+|one of CLIP_TYPE_?
+
+|SPICE_ADDRESS data
+|address of clip data. The content depends on <type>
+|===
++
+.. Mask flags
++
+[source,c]
+----
+MASK_FLAG_INVERS = 1, the effective mask is the inverse of the mask
+----
++
+.. Mask
++
+[cols="2*"]
+|===
+|UINT8 flags | flags of the mask, combination of MASK_FLAG_?
+
+|POINT position | origin of the mask in bitmap coordinates
+
+|SPICE_ADDRESS bitmap | address of the mask's image, the format of the image must be
+1bpp. If the bitmap is zero then no masking operation needs to be preformed.
+|===
++
+In all rendering commands, the mask must be big enough to cover the destination
+rectangle
++
+.. SpiceBrush types
++
+[source,c]
+----
+SPICE_BRUSH_TYPE_NONE = 0 /* the brush is invalid */
+SPICE_BRUSH_TYPE_SOLID = 1 /* the brush is solid RGB color */
+SPICE_BRUSH_TYPE_PATTERN = 2 /* the brush is a pattern */
+----
++
+.. SpicePattern
++
+[cols="2*"]
+|===
+|SPICE_ADDRESS image
+|address of the pattern's Image
+
+|POINT position
+|origin coordinates of the pattern in the image
+|===
++
+.. SpiceBrush
++
+[cols="2*"]
+|===
+|UINT32 type
+|one of BRUSH_TYPE_?
+|===
++
+[source,c]
+----
+Union {
+ UINT32 color; */ RGB color. The format of the color depends on current
+draw area mode.*/
+ SpicePattern pattern;
+}
+----
++
+.. Image scale mode
++
+The following defines the method for scaling image
++
+[source,c]
+----
+SPICE_IMAGE_SCALE_MODE_INTERPOLATE = 0
+----
++
+The client is allowed to INTERPOLATE pixel color.
++
+[source,c]
+----
+SPICE_IMAGE_SCALE_MODE_NEAREST = 1
+----
++
+The client must use the nearest pixel.
++
+.. LineAtrr flags
++
+[source,c]
+----
+LINE_ATTR_FLAG_START_WITH_GAP = 4
+----
++
+first style segment if gap (i.e., foreground)
++
+[source,c]
+----
+LINE_ATTR_FLAG_STYLED = 8
+----
++
+style member of LineAtrr is valid and contains effective line style for the
+rendering operation.
++
+.. LineAtrr join style
++
+[source,c]
+----
+LINE_ATTR_JOIN_ROUND = 0
+LINE_ATTR_JOIN_BEVEL = 1
+LINE_ATTR_JOIN_MITER = 2
+----
++
+.. LineAtrr cap style
++
+[source,c]
+----
+LINE_ATTR_CAP_ROUND = 0
+LINE_ATTR_CAP_SQUARE = 1
+LINE_ATTR_CAP_BUTT = 2
+----
++
+.. SpiceLineAttr
++
+[cols="2*"]
+|===
+|UINT8 flags
+|combination of LINE_ATTR_?
+
+|UINT8 join_style
+|one of LINE_ATTR_JOIN_?
+
+|UINT8 cap_style
+|one of LINE_ATTR_CAP_?
+
+|UINT8 style_num_segments
+|number of style segments in line style
+
+|SPICE_FIXED28_4 width
+|width of the line in pixels
+
+|SPICE_FIXED28_4 miter_limit
+|miter limit in pixels
+
+| SPICE_ADDRESS style
+|address of line style line style is array of SPICE_FIXED28_4. The array defines
+segments that each represents length of foreground or background pixels in the
+style. If FLAG_START_WITH_GAP is defined then the first segment in the style is
+background, otherwise it is foreground. Renderer uses this array of segments
+repeatedly during rendering operation.
+|===
++
+. Rendering command
++
+.. SpiceMsgDisplayBase
++
+Common field to all rendering command
++
+[cols="2*"]
+|===
+|RECT bounding_box
+|the affected area on the display area
+
+|SpiceClip clip
+|the effective clip to set before rendering a command
+|===
++
+.. SPICE_MSG_DISPLAY_COPY_BITS
++
+[source,c]
+----
+SpiceMsgDisplayBase
+POINT source_position
+----
++
+SpiceCopy bits from the draw area to bounding_box on the draw area. Source area left
+top corner is source_position and its height and width is equal to bounding_box
+height and width. Source and destination rectangles can overlap.
++
+.. SPICE_MSG_DISPLAY_DRAW_FILL
++
+[source,c]
+----
+SpiceMsgDisplayBase
+SpiceBrush brush
+UINT16 rop_descriptor
+Mask mask
+----
++
+SpiceFill bounding_box using brush as the fill pattern and rop_descriptor
+instructions. If the mask is valid, it will limit the modified area (i.e., only
+pixels on the destination area that their corresponding bits are set will be
+affected).
++
+.. SPICE_MSG_DISPLAY_DRAW_OPAQUE
++
+[source,c]
+----
+SpiceMsgDisplayBase
+SPICE_ADDRESS source_image
+RECT source_area
+SpiceBrush brush
+UINT16 rop_descriptor
+UINT8 scale_mode
+Mask mask
+----
++
+Combine pixels from source_area in source_image with the brush's pattern using
+rop_descriptor instructions. The result image will be rendered into
+bounding_box. In case scaling of source image is required it will be performed
+according to scale_mode and before the combination with brush pixels. If mask
+is valid it will limit the modified area.
++
+.. SPICE_MSG_DISPLAY_DRAW_COPY
++
+[source,c]
+----
+SpiceMsgDisplayBase
+SPICE_ADDRESS source_image
+RECT source_area
+UINT16 rop_descriptor
+UINT8 scale_mode
+Mask mask
+----
++
+SpiceCopy pixels from source_area in source_image to bounding_box using
+rop_descriptor instructions. In case scaling of source image is required it
+will be performed according to scale_mode and before the copying to the draw
+area. If mask is valid it will limit the modified area.
++
+.. SPICE_MSG_DISPLAY_DRAW_BLEND
++
+[source,c]
+----
+SpiceMsgDisplayBase
+SPICE_ADDRESS source_image
+RECT source_area
+UINT16 rop_descriptor
+UINT8 scale_mode
+Mask mask
+----
++
+Mixing pixels from source_area in source_image with bounding_box pixels on the
+draw area using rop_descriptor instructions. In case scaling of source image is
+required it will be performed according to scale_mode and before the mixing
+with the draw area. If mask is valid it will limit the modified area.
++
+.. SPICE_MSG_DISPLAY_DRAW_BLACKNESS
++
+[source,c]
+----
+SpiceMsgDisplayBase
+Mask mask
+----
++
+SpiceFill bounding_box with black pixels. If mask is valid it will limit the
+modified area.
++
+.. SPICE_MSG_DISPLAY_DRAW_WHITENESS
++
+[source,c]
+----
+SpiceMsgDisplayBase
+Mask mask
+----
++
+SpiceFill bounding_box with white pixels. If mask is valid it will limit the
+modified area.
++
+.. SPICE_MSG_DISPLAY_DRAW_INVERS
++
+[source,c]
+----
+SpiceMsgDisplayBase
+Mask mask
+----
++
+Inverse all pixels in bounding_box. If mask is valid it will limit the modified
+area.
++
+.. SPICE_MSG_DISPLAY_DRAW_ROP3
++
+[source,c]
+----
+SpiceMsgDisplayBase
+SPICE_ADDRESS source_image
+RECT source_area
+SpiceBrush brush
+UINT8 rop3
+UINT8 scale_mode
+Mask mask
+----
++
+Mix pixels from source_area in source_image, bounding_box pixels in the draw
+area, and the brush pattern. The method for mixing three pixels into the
+destination area (i.e., bounding_box) is defined by rop3 (i.e., ternary raster
+operations). In case scaling of source image is required it will be performed
+according to scale_mode and before the mixing. If mask is valid it will limit
+the modified area.
++
+.. SPICE_MSG_DISPLAY_DRAW_TRANSPARENT
++
+[source,c]
+----
+SpiceMsgDisplayBase
+SPICE_ADDRESS source_image
+RECT source_area
+UINT32 transparent_color
+UINT32 transparent _true_color
+----
++
+SpiceCopy pixels from source_area on source_image to bounding_box on the draw area.
+In case scaling of source image is required it will use SPICE_IMAGE_SCALE_MODE_NEAREST.
+Pixels with value equal to the transparent color will be masked out.
+SpiceTransparent color is provided in two forms: true color (i.e., RGB888) and the
+color in the original format (i.e., before compression) .
++
+.. SPICE_MSG_DISPLAY_DRAW_ALPHA_BLEND
++
+[source,c]
+----
+SpiceMsgDisplayBase
+UINT8 alpha
+SPICE_ADDRESS source_image
+RECT source_area
+----
++
+Alpha blend source_area of source_image on bounding_box of draw area using
+alpha value or alternatively per pixel alpha value. In case scaling of source
+image is required, it will use SPICE_IMAGE_SCALE_MODE_INTERPOLATE mode. Alpha value is
+defined as 0 is full transparency and 255 is full opacity. Format of source
+image can be pre-multiplied ARGB8888 for per pixel alpha value.
++
+New RGB color is defined as:
++
+[source,c]
+----
+color' = (source_color * alpha) / 255
+alpha' = (source_alpha * alpha) / 255
+new_color = color' + ((255 - alpha' ) * destination_color) / 255
+----
++
+.. SPICE_MSG_DISPLAY_DRAW_STROKE
++
+[source,c]
+----
+SpiceMsgDisplayBase
+SPICE_ADDRESS path – address of the PathSegList that defines the path to render
+SpiceLineAttr attr
+Bush brush
+UINT16 fore_mode - foreground rop_descriptor
+UINT16 back_mode – background rop_descriptor
+----
++
+Render path using brush line attribute and rop descriptors. If the line is
+styled (i.e., LINE_ATTR_FLAG_STYLED is set in attr.falgs) then background
+(i.e., inverse of the style) is drawn using back_mode and the foreground is
+drawn using fore_mode. If the line is not styled, the entire path is rendered
+using fore_mode.
++
+.. SPICE_MSG_DISPLAY_DRAW_TEXT
++
+[source,c]
+----
+SpiceMsgDisplayBase
+SPICE_ADDRESS string – address of GlyphString
+RECT back_area
+SpiceBrush fore_brush
+SpiceBrush back_brush
+UINT16 fore_mode
+UINT16 back_mode
+----
++
+Render string of glyph on the display area using brush fore_brush and the
+rop_descriptor fore_mode. If back_area is not empty the renderer fill back_area
+on the display area prior to rendering the glyph string. back_area is filled
+using back_brush and the rop_descriptor back_mode.
++
+. Video streaming commands
++
+Spice supports the creation of video streams by the server for rendering video
+content on the client display area. Unlike other rendering commands, the
+stream data can be compressed using lossy or video specific compression
+algorithms. It is not required to render video frames as they arrive and it is
+also allowed to drop video frames. This enables using video frames buffering
+for having smoother playback and audio synchronization. Audio synchronization
+is achieved by using time stamp that is attached to audio and video streams.
+By using video streaming the network traffic can be dramatically reduced. When
+the stream is created, the server sends create message using
+SPICE_MSG_DISPLAY_STREAM_CREATE. After the server creates a stream he can send data
+using SPICE_MSG_DISPLAY_STREAM_DATA, or set new stream clipping by sending clip
+message using SPICE_MSG_DISPLAY_STREAM_CLIP. Once the server no longer needs the
+stream, he can send destroy command using SPICE_MSG_DISPLAY_STREAM_DESTROY. The
+server can also destroy all active streams by sending destroy all message using
+SPICE_MSG_DISPLAY_STREAM_DESTROY_ALL.
++
+.. Stream flags
++
+[source,c]
+----
+STREAM_FLAG_TOP_DOWN = 1 /* stream frame line order is from top to bottom */
+----
++
+.. Codec types
++
+[source,c]
+----
+STREAM_CODEC_TYPE_MJPEG = 1 /* this stream uses motion JPEG codec */
+----
++
+.. SPICE_MSG_DISPLAY_STREAM_CREATE, SpiceMsgDisplayStreamCreate
++
+[cols="2*"]
+|===
+|UINT32 id
+|id of the new stream. It is the server's responsibility to manage stream ids
+
+|UINT32 flags
+|flags of the stream, any combination of STREAM_FLAG_?
+
+|UINT32 codec_type
+|type of codec used for this stream, one of STREAM_CODEC_TYPE_?
+
+|UINT64 reserved
+|must be zero
+
+|UINT32 stream_width
+|width of the source frame.
+
+|UINT32 stream_height
+|height of the source frame
+
+|UINT32 source_width
+|actual frame width to use, must be less or equal to stream_width.
+
+|UINT32 source_height
+|actual frame height to use, must be less or equal to stream_height.
+
+|RECT destination
+|area to render into on the client display area
+
+|SpiceClip clip
+|clipping of the stream
+|===
++
+.. SPICE_MSG_DISPLAY_STREAM_DATA, SpiceMsgDisplayStreamData
++
+[cols="2*"]
+|===
+|UINT32 id
+|stream id (i.e., SpiceMsgDisplayStreamCreate.id)
+
+|UINT32 multimedia_time
+|frame time stamp
+
+|UINT32 data_size
+|stream data size to consume in bytes
+
+|UINT32 pad_size
+|additional data padding in bytes
+
+|UINT8[] data
+|stream data depending on SpiceMsgDisplayStreamCreate.codec_type. Size of data is (
+data_size + pad_size)
+|===
++
+.. SPICE_MSG_DISPLAY_STREAM_CLIP, SpiceMsgDisplayStreamClip
++
+[cols="2*"]
+|===
+|UINT32 id
+|stream id (i.e., SpiceMsgDisplayStreamCreate.id)
+|===
++
+SpiceClip clip – new clipping of the stream
++
+.. SPICE_MSG_DISPLAY_STREAM_DESTROY, UINT32
++
+[cols="2*"]
+|===
+|UINT32
+|id of stream to destroy
+|===
++
+.. SPICE_MSG_DISPLAY_STREAM_DESTROY_ALL, VOID
++
+Destroy all active streams
++
+. Cache control
++
+.. Resource type
++
+[source,c]
+----
+SPICE_RES_TYPE_PIXMAP = 1
+----
++
+.. SpiceResourceID
++
+[cols="2*"]
+|===
+|UINT8 type
+|type of the resource, one of SPICE_RES_TYPE_?
+
+|UINT64 id
+|id of the resource
+|===
++
+.. SpiceResourceList
++
+[cols="2*"]
+|===
+|UINT16 count
+|number of items in resources
+
+|SpiceResourceID[] resources
+|list of resources id
+|===
++
+.. SPICE_MSG_DISPLAY_INVAL_LIST, SpiceResourceList
++
+[cols="2*"]
+|===
+|SpiceResourceList
+|list of resources to remove from cache
+|===
++
+.. SPICE_MSG_DISPLAY_INVAL_ALL_PIXMAPS, SpiceMsgWaitForChannels
++
+Remove all images from the image cache. The client must use SpiceMsgWaitForChannels
+(for more info see <<channel_sync,Channel synchronization>>) to synchronize
+with other channels before clearing the cache.
++
+.. SPICE_MSG_DISPLAY_INVAL_PALETTE, UINT64
++
+[cols="2*"]
+|===
+|UINT64 id of palette
+|client needs to remove palette with that id from the cache
+|===
++
+.. SPICE_MSG_DISPLAY_INVAL_ALL_PALETTES, VOID
++
+Remove all palettes from palette cache
+
+== Cursor channel definition
+
+Spice protocol defines a set of messages for controlling cursor shape and
+position on the remote display area, cursor position messages are irrelevant
+for client mouse mode (see <<mouse_modes,Mouse Modes>>). Spice protocol also
+defines a set of messages for managing cursor shape cache on the client site.
+Client must strictly obey all such instructions. The server sends
+SPICE_MSG_CURSOR_INIT to set current pointer state (i.e., shape, position, visibility
+etc.) and to clear shape cache. After the server sends init message it can send
+any other cursor command except for SPICE_MSG_CURSOR_INIT. The server can send
+SPICE_MSG_CURSOR_RESET message - this will disable the cursor and reset the cursor
+cache. After this message the only valid message the server can send is
+SPICE_MSG_CURSOR_INIT. The relevant remote display area for a cursor channel is the
+one of the display channel that has the same channel id (i.e.,
+SpiceLinkMess.channel_id).
+
+. Server messages
++
+[source,c]
+----
+SPICE_MSG_CURSOR_INIT = 101
+SPICE_MSG_CURSOR_RESET = 102
+SPICE_MSG_CURSOR_SET = 103
+SPICE_MSG_CURSOR_MOVE = 104
+SPICE_MSG_CURSOR_HIDE = 105
+SPICE_MSG_CURSOR_TRAIL = 106
+SPICE_MSG_CURSOR_INVAL_ONE = 107
+SPICE_MSG_CURSOR_INVAL_ALL = 108
+----
++
+.. Cursors types
++
+[source,c]
+----
+SPICE_CURSOR_TYPE_ALPHA = 0
+SPICE_CURSOR_TYPE_MONO = 1
+SPICE_CURSOR_TYPE_COLOR4 = 2
+SPICE_CURSOR_TYPE_COLOR8 = 3
+SPICE_CURSOR_TYPE_COLOR16 = 4
+SPICE_CURSOR_TYPE_COLOR24 = 5
+SPICE_CURSOR_TYPE_COLOR32 = 6
+----
++
+.. SpiceCursorHeader
++
+[cols="2*"]
+|===
+|UINT64 unique
+|unique identifier of the corresponding cursor shape. It is used for storing
+and retrieving cursors from the cursor cache.
+
+|UINT16 type
+|type of the shape, one of CURSOR_TYPE_?
+
+|UINT16 width
+|width of the shape
+
+|UINT16 height
+|height of the shape
+
+|UINT16 hot_spot_x
+|position of hot spot on x axis
+
+|UINT16 hot_spot_y
+|position of hot spot on y axis
+|===
++
+.. Cursor flags
++
+[source,c]
+----
+CURSOR_FLAGS_NONE = 1
+----
++
+set when SpiceCursor (see below) is invalid
++
+[source,c]
+----
+CURSOR_CURSOR_FLAGS _CACHE_ME = 2
+----
++
+set when the client should add this shape to the shapes cache. The client will
+use SpiceCursorHeader.unique as cache key.
++
+[source,c]
+----
+CURSOR_FLAGS_FROM_CACHE = 4
+----
++
+set when the client should retrieve the cursor shape, using SpiceCursorHeader.unique
+as key, from the shapes cache. In this case all fields of SpiceCursorHeader except
+for 'unique' are invalid.
++
+.. SpiceCursor
++
+[cols="2*"]
+|===
+|UINT32 flags
+|any valid combination of SPICE_CURSOR_FLAGS_?
+
+|SpiceCursorHeader header
+|
+
+|UINT8[] data
+|actual cursor shape data, the size is determine by width, height and type from
+SpiceCursorHeader. Next we will describe in detail the shape data format according
+to cursor type:
+
+|ALPHA, alpha shape
+|data contains pre-multiplied ARGB8888 pixmap. Line stride is <width * 4>.
+
+|MONO, monochrome shape
+|data contains two bitmaps with size <width> * <height>. The first bitmap is
+AND mask and the second is XOR mask. Line stride is ALIGN(<width>, 8) / 8.
+Bits order within every byte is big endian.
+
+|COLOR4, 4 bits per pixel shape
+|First data region is pixmap: the stride of the pixmap is ALIGN(width , 2) / 2;
+every nibble is translated to a color usingthe color palette; Nibble order is
+big endian. Second data region contain 16 colors palette: each entry is 32 bit
+RGB color. Third region is a bitmap mask: line stride is ALIGN(<width>, 8) /
+8; bits order within every byte is big endian.
+
+|COLOR4, 8 bits per pixel shape
+|First data region is pixmap: the stride of the pixmap is <width>; every byte
+is translated to color using the color palette. Second data region contain 256
+colors palette: each entry is 32 bit RGB color. Third region is a bitmap mask:
+line stride is ALIGN(<width>, 8) / 8; bits order within every byte is big
+endian.
+
+|COLOR16, 16 bits per pixel shape
+|First data region is pixmap: the stride of the pixmap is <width * 2>; every
+UINT16 is RGB_555. Second region is a bitmap mask: line stride is
+ALIGN(<width>, 8) / 8; bits order within every byte is big endian.
+
+|COLOR24, 24 bits per pixel shape
+|First data region is pixmap: the stride of the pixmap is <width * 3>; every
+UINT8[3] is RGB_888. Second region is a bitmap mask: line stride is
+ALIGN(<width>, 8) / 8; bits order within every byte is big endian.
+
+|COLOR32, 32 bits per pixel shape
+|First data region is pixmap: the stride of the pixmap is <width * 4>,;every
+UINT32 is RGB_888. Second region is a bitmap mask: line stride is
+ALIGN(<width>, 8) / 8; bits order within every byte is big endian.
+|===
++
+For more deatails on drawing the cursor shape see <<cursor_shape, this
+section>>
++
+.. SPICE_MSG_CURSOR_INIT, SpiceMsgCursorInit
++
+[cols="2*"]
+|===
+|POINT16 position
+|position of mouse pointer on the relevant display area. Not relevant in
+client mode.
+
+|UINT16 trail_length
+|number of cursors in the trail excluding main cursor.
+
+|UINT16 trail_frequency
+|millisecond interval between trail updates.
+
+|UIN8 visible
+|if 1, the cursor is visible. If 0, the cursor is invisible.
+
+|SpiceCursor cursor
+|current cursor shape
+|===
++
+.. SPICE_MSG_CURSOR_RESET, VOID
++
+.. SPICE_MSG_CURSOR_SET, SpiceMsgCursorSet
++
+[cols="2*"]
+|===
+|POINT16 position
+|position of mouse pointer on the relevant display area. not relevant in client
+mode.
+
+|UINT8 visible
+|if 1, the cursor is visible. If 0, the cursor is invisible.
+
+|SpiceCursor cursor
+|current cursor shape
+|===
++
+.. SPICE_MSG_CURSOR_MOVE, POINT16
++
+[cols="2*"]
+|===
+|POINT16
+|new mouse position. Not relevant in client mode. This message also implicitly
+sets cursor visibility to 1.
+|===
++
+.. SPICE_MSG_CURSOR_HIDE, VOID
++
+Hide pointer on the relevant display area.
++
+.. SPICE_MSG_CURSOR_TRAIL
++
+[cols="2*"]
+|===
+|UINT16 length
+|number of cursors in the trail excluding main cursor.
+
+|UINT16 frequency
+|millisecond interval between trail updates
+|===
++
+.. SPICE_MSG_CURSOR_INVAL_ONE, UINT64
++
+[cols="2*"]
+|===
+|UINT64
+|id of cursor shape to remove from the cursor cache
+|===
++
+.. SPICE_MSG_CURSOR_INVAL_ALL, VOLD
++
+Clear cursor cache
++
+[[cursor_shape]]
+. Drawing the cursor shape according to the cursor type
++
+This section is relevant only for server mouse mode. Cursor shape positioning
+on the display area is done by placing cursor hot spot on the current cursor
+position.
++
+.. Alpha - no spacial handling, just bland the shape on the display area.
++
+.. Monochrome
++
+For each cleared bit in the AND mask clear the corresponding bits in the
+relevant pixel on the display area
+For each set bit in the XOR mask reverse the
+corresponding bits in the relevant pixel on the display area
++
+.. Color
++
+If the source color is black and mask bit is set, NOP.
+Else, if the source color is white and the mask bit is set, reverse all bits in
+the relevant pixel on the display area.
+Else, put source color.
+
+== Playback channel definition
+
+Spice supports sending audio streams for playback on the client side. An audio
+stream is sent by the server in an audio packet using SPICE_MSG_PLAYBACK_DATA
+message. The content of the audio packet is controlled by the playback mode
+that the server sends using SPICE_MSG_PLAYBACK_MODE message. The server can start and
+stop the stream using SPICE_MSG_PLAYBACK_START and SPICE_MSG_PLAYBACK_STOP messages.
+Sending audio packet is allowed only between start and stop messages. Sending
+start message is allowed only in stop state and after at least one mode message
+was sent. Sending a stop message is allowed only during a start state.
+
+. Server messages
++
+[source,c]
+----
+SPICE_MSG_PLAYBACK_DATA = 101
+SPICE_MSG_PLAYBACK_MODE = 102
+SPICE_MSG_PLAYBACK_START = 103
+SPICE_MSG_PLAYBACK_STOP = 104
+----
++
+. Audio format
++
+[source,c]
+----
+SPICE_AUDIO_FMT_S16 = 1 /* each channel sample is a 16 bit
+signed integer */
+----
++
+. Playback data mode
++
+Two types of data mode are available: (1) raw PCM data, (2) compressed data
+in CELT 0_5_1 format (obsolete) and (3) compressed data in OPUS format.
++
+[source,c]
+----
+SPICE_AUDIO_DATA_MODE_RAW = 1
+SPICE_AUDIO_DATA_MODE_CELT_0_5_1 = 2
+SPICE_AUDIO_DATA_MODE_OPUS = 3
+----
++
+. Playback channel capabilities
++
+[source,c]
+----
+SPICE_PLAYBACK_CAP_CELT_0_5_1 = 0
+SPICE_PLAYBACK_CAP_VOLUME = 1
+SPICE_PLAYBACK_CAP_LATENCY = 2
+SPICE_PLAYBACK_CAP_OPUS = 3
+----
++
+Spice client needs to declare support of OPUS in channel capabilities in
+order to allow the server to send playback packets in OPUS format.
++
+. SPICE_MSG_PLAYBACK_MODE, SpiceMsgPlaybackMode
++
+[cols="2*"]
+|===
+|UINT32 time
+|server time stamp
+
+|UINT32 mode
+|one of SPICE_AUDIO_DATA_MODE_?
+
+|UINT8[] data
+|specific data, content depend on mode
+|===
++
+. SPICE_MSG_PLAYBACK_START, SpiceMsgRecordStart
++
+[cols="2*"]
+|===
+|UINT32 channels
+|number of audio channels
+
+|UINT32 format
+|one of SPICE_AUDIO_FMT_?
+
+|UINT32 frequency
+|channel samples per second
+|===
++
+. SPICE_MSG_PLAYBACK_DATA, SpiceMsgPlaybackPacket
++
+[cols="2*"]
+|===
+|UINT32 time
+|server time stamp
+
+|UINT8[] data
+|playback data , content depend on mode
+|===
++
+. SPICE_MSG_PLAYBACK_STOP, VOID
++
+Stop current audio playback
+
+== Record Channel definition
+
+Spice supports transmitting of audio captured streams from the client to the
+server. Spice server starts audio capturing using SPICE_MSG_RECORD_START message.
+This message instructs the client to start transmitting captured audio . In
+response, the client sends time stamp of the stream start using
+SPICE_MSGC_RECORD_START_MARK. After the client sends start mark it can start
+transmitting audio stream data using SPICE_MSGC_RECORD_DATA. One mode message must be
+sent by the client before any other message using SPICE_MSGC_RECORD_MODE. This, in
+order to inform the server on what type of data will be transferred. Mode
+message can also be transmitted at any other time in order to switch the data
+type delivered by SPICE_MSGC_RECORD_DATA. The Server can send SPICE_MSG_RECORD_STOP for
+stopping captured audio streaming. Sending a start message is allowed only
+while the stream is in stop state. Sending a stop message and data messages is
+allowed only while the stream is in start state. Sending mark message is
+allowed only between start message and the first data message.
+
+. Server messages
++
+[source,c]
+----
+SPICE_MSG_RECORD_START = 101
+SPICE_MSG_RECORD_STOP = 102
+----
++
+. Client messages
++
+[source,c]
+----
+SPICE_MSGC_RECORD_DATA = 101
+SPICE_MSGC_RECORD_MODE = 102
+SPICE_MSGC_RECORD_START_MARK = 103
+----
++
+. Audio format
++
+[source,c]
+----
+SPICE_AUDIO_FMT_S16 = 1 /* each channel sample is a 16 bit signed integer */
+----
++
+. Record data mode
++
+Two types of data mode are available: (1) raw PCM data (2) compressed data in
+CELT 0.5.1 format (obsolete) (3) compressed data in OPUS format.
++
+[source,c]
+----
+SPICE_AUDIO_DATA_MODE_RAW = 1
+SPICE_AUDIO_DATA_MODE_CELT_0_5_1 = 2
+SPICE_AUDIO_DATA_MODE_OPUS = 3
+----
++
+. Record channel capabilities
++
+[source,c]
+----
+SPICE_RECORD_CAP_CELT_0_5_1 = 0
+SPICE_RECORD_CAP_VOLUME = 1
+SPICE_RECORD_CAP_OPUS = 2
+----
++
+Spice server needs to declare support of OPUS in channel capabilities in
+order to allow the client to send recorded packets in OPUS format.
++
+. SPICE_MSGC_RECORD_MODE, SpiceMsgcRecordMode
++
+[cols="2*"]
+|===
+|UINT32 time
+|client time stamp
+
+|UINT32 mode
+|one of SPICE_AUDIO_DATA_MODE_?
+
+|UINT8[] data
+|specific data, content depend on mode
+|===
++
+. SPICE_MSG_RECORD_START, SpiceMsgRecordStart
++
+[cols="2*"]
+|===
+|UINT32 channel
+|number of audio channels
+
+|UINT32 format
+|one of SPICE_AUDIO_FMT_?
+
+|UINT32 frequency
+|channel samples per second
+|===
++
+. SPICE_MSGC_RECORD_START_MARK, UINT32
++
+[cols="2*"]
+|===
+|UINT32
+|client time stamp of stream start
+|===
++
+. SPICE_MSGC_RECORD_DATA, SpiceMsgcRecordPacket
++
+[cols="2*"]
+|===
+|UINT32 time
+|client time stamp
+
+|UINT8[] data
+|recorded data , content depend on mode
+|===
++
+. SPICE_MSG_RECORD_STOP, VOID
++
+Stop current audio capture
diff --git a/docs/spice_style.txt b/docs/spice_style.txt
new file mode 100644
index 00000000..89a550fb
--- /dev/null
+++ b/docs/spice_style.txt
@@ -0,0 +1,465 @@
+Spice project coding style and coding conventions
+=================================================
+
+Copyright (C) 2009-2018 Red Hat, Inc.
+Licensed under a Creative Commons Attribution-Share Alike 3.0
+United States License (see http://creativecommons.org/licenses/by-sa/3.0/us/legalcode).
+
+
+Source Files
+------------
+
+Names
+~~~~~
+
+Use lower case and separate words using dashes (e.g., file-name.c, header.h).
+
+Use standard file extension for C source and header files.
+
+Line width
+~~~~~~~~~~
+
+No more than 100 characters on a single line
+
+Tabs
+~~~~
+
+Tabs are not allowed, use 4 spaces instead
+
+White spaces
+~~~~~~~~~~~~
+
+Trailing white spaces are not allowed
+
+New Line
+~~~~~~~~
+
+Use Unix style line ending (i.e., LF)
+
+New line (i.e., EOL) must be the last char in the file
+
+Comparing
+---------
+
+Use right-hand comparison style.
+
+Examples: +
+ use `(var == 7)` instead of `(7 == var)` +
+ use `(function(var) > 7)` instead of `(7 < function(var))`
+
+boolean type
+------------
+Where possible prefer the usage of `bool` type to store boolean.
+
+If not technically possible (ie libJPEG uses `boolean` while GLib uses `gboolean`) uses proper library type.
+
+Constants should be consistent with the type used so `true` and `false` for `bool` type.
+
+true, false and NULL
+--------------------
+
+Use `true`, `false` and `NULL` instead of 1 and 0 in order to improve code readability.
+
+Static storage initialization
+-----------------------------
+
+To improve code readability, explicitly initialize variables that depend on default initialization with zero/null.
+
+FIXME and TODO
+--------------
+
+Comments that are prefixed with `FIXME` describe a bug that need to be fixed. Generally, it is not allowed to commit new code having `FIXME` comment. Committing `FIXME` is allowed only for existing bugs. Comments that are prefixed with `TODO` describe further features, optimization or code improvements, and they are allowed to be committed along with the relevant code.
+
+ASSERT
+------
+
+Use it freely. ASSERT helps testing function arguments and function results validity. ASSERT helps detecting bugs and improve code readability and stability.
+
+sizeof
+------
+
+Apply function style to `sizeof` (i.e., use `sizeof(x)`)
+
+const
+-----
+
+Use const keyword when applicable to improve code reliability and celerity.
+
+goto
+----
+
+Using goto is allowed in C code for error handling. In any other case it will be used only as a special exception.
+
+switch
+------
+
+If a switch case falls through (i.e. does not end with a `break`), annotate it with a `/* fall through */` comment. Some compilers will emit a warning otherwise.
+
+Defining Constant values
+------------------------
+
+Use defines for constant values for improving readability and ease of changes. Alternatively, use global `const` variables.
+
+Short functions
+---------------
+
+Try to split code to short functions, each having simple functionality, in order to improve code readability and re-usability. Prefix with inline short functions or functions that were splitted for readability reason.
+
+Return on if
+------------
+
+Try to return immediately on if in places that can reduce indentation level.
+
+Example:
+
+prefer
+[source,c]
+----
+void function(int *n)
+{
+ if (!n) {
+ return;
+ }
+ ...
+}
+----
+over
+
+[source,c]
+----
+void function(int *n)
+{
+ if (!n) {
+ return;
+ } else {
+ ...
+ }
+}
+----
+
+Names
+-----
+
+* Don't underestimate the importance of name choosing. Good names make the code more easy to understand and reduce the required level of code documentation. When choosing names, prefer long meaningful names over short vague name.
+* Variable and Function names - use lower case and separate words using underscore (e.g., sample_variable_name)
+* Structures, class and enum names - one or more words, each word start with upper case (e.g., Name, SampleStructName)
+* Defines and enum items names - uppercase words separated using underscores (e.g., NAME, SAMPLE_DEFINE_NAME)
+
+Type prefix
+~~~~~~~~~~~
+In the code there are some common prefixes for types, `Red` and `Spice`.
+As a basic rule `Spice` refers to types in the public external headers while `Red` is used for internal types.
+
+Common abbreviations
+~~~~~~~~~~~~~~~~~~~~
+`ccc` CursorChannelClient
+
+`dc` DisplayChannel
+
+`dcc` DisplayChannelClient
+
+`dpi` drawable pipe item
+
+`rcc` RedChannelClient
+
+`sif` spice interface
+
+`sin` spice instance
+
+Optimization
+------------
+
+Keep optimization to fast path code. Prefer safe, clear and easy to maintain coding for code that is not on the fast path.
+
+Spacing
+-------
+
+Use spacing for improving code readability.
+
+[source,c]
+for (i = 0; i < 10; ++i) {
+ some_func(var, i * i + *ptr, &var, sizeof(var));
+}
+
+Indentation
+-----------
+
+[[function_indentation]]
+Function Indentation
+~~~~~~~~~~~~~~~~~~~~
+
+* No spaces between function name to left bracket.
+* Curly bracket start on new line.
+* Functions must be padded with empty lines on both sides
++
+[source,c]
+void function(type1 arg1, type2 arg2, type2 arg3)
+{
+ ...
+}
++
+* In case of a new line in arguments list, align it to the first argument type.
++
+[source,c]
+----
+void function(type1 arg1,
+ type2 arg2,
+ type3 arg3)
+----
++
+Or
++
+[source,c]
+----
+void function(type1 arg1, type2 arg2,
+ type3 arg3)
+----
++
+* New line is acceptable in arguments list and before function name, like
++
+[source,c]
+----
+void
+function(type1 arg1, type2 arg2,
+ type3 arg3)
+----
+
+Branching indentation
+~~~~~~~~~~~~~~~~~~~~~
+
+* Add space after a branch keyword and after the right bracket.
+* Curly bracket starts on the same line the branch starts.
+* Place curly brackets after all control flow constructs even where optional. This convention reduces branching bugs that are difficult to detect. It also makes it easier to add logging messages during debugging since it eliminates the need to add the brackets.
++
+[source,c]
+----
+if (condition) {
+ ...
+} else if (condition) {
+ ...
+} else {
+ ...
+}
+----
++
+In case of long condition statement, prefer having additional temporary variable over multiple line condition statement.
++
+In case of new line in condition statement.
++
+[source,c]
+----
+if (long_name && very_long_name && very_long ||
+ var_name) {
+----
++
+or indent under the round bracket using spaces
++
+[source,c]
+----
+if (long_name && very_long_name && long_name ||
+ var_name) {
+----
++
+Break function arguments list in long condition statement according to <<function_indentation, Function Indentation>> section.
++
+[source,c]
+----
+while (condition) {
+ ...
+}
+
+do {
+ ...
+} while (condition);
+
+for (i = x; i < y; i++) {
+ ...
+}
+
+
+switch (x) {
+case A: {
+ ...
+ break;
+}
+case B:
+ ...
+ ...
+ break;
+default:
+ ...
+}
+----
+
+Types indentation
+~~~~~~~~~~~~~~~~~
+
+[source,c]
+----
+struct StructName {
+ type1 name1;
+ type2 name2;
+
+ ...
+};
+
+enum {
+ A,
+ B,
+ C = 10,
+ D,
+};
+
+union {
+ type1 name1;
+ type2 name2;
+ ...
+} u;
+----
+
+Vertical indentation
+~~~~~~~~~~~~~~~~~~~~
+
+Use one space no tabs and no vertical alignment.
+[source,c]
+----
+long var_name_1 = 7;
+int var_name_2 = 1111l;
+unsigned long long_var_name_1 = 666;
+char long_var_name_1 = 'a';
+
+void f1(int a, char ch);
+unsigned long f2(int a, char ch);
+----
+
+Multi line macro indentation
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+[source,c]
+#define MACRO_NAME(a, b, c) { \
+ int ab = a + c; \
+ int ac = a + b; \
+ int bc = b + c; \
+ f(ab, ac, bc); \
+}
+
+Multi line array indentation
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+[source,c]
+char *array[] = {
+ "item_1",
+ "item_2",
+ "item_3",
+};
+
+Headers
+-------
+
+Headers should be protected against multiple inclusion using a macro that contains the header file name in uppercase, with all characters that are invalid in C replaced with an underscore '_':
+
+[source,c]
+----
+#ifndef MY_MODULE_H
+#define MY_MODULE_H
+
+...
+
+#endif // MY_MODULE_H
+----
+
+The macro may include additional information, e.g. a component. For example a file generally referenced as foo/bar.h could use a FOO_BAR_H macro.
+
+Historically, some headers added underscores liberally, e.g. MY_MODULE_H_. This is neither necessary nor discouraged, although as a reminder, a leading underscore followed by a capital letter is reserved for the implementation and should not be used, so _MY_MODULE_H is, technically speaking, invalid C.
+
+Alternatively (recommended on newer code) you can use the `pragma once` directive, as:
+
+[source,c]
+----
+#pragma once
+
+...
+----
+
+Header inclusion
+----------------
+
+Headers should be included in this order
+
+[source,c]
+----
+#include <system_headers.h>
+#include <no_spice_no_system_libraries.h>
+#include <spice_protocol.h>
+#include <spice_common.h>
+
+#include "spice_server.h"
+----
+
+(note the empty line between no spice-server and spice-server headers)
+
+Also in source (no header) files you must include `config.h` at the beginning so should start (beside comments and copyright) with
+
+[source,c]
+----
+#include <config.h>
+
+#include <system_headers.h>
+#include <no_spice_no_system_libraries.h>
+#include <spice_protocol.h>
+#include <spice_common.h>
+
+#include "spice_server.h"
+----
+
+C++
+---
+C\++ style follows C style if not specified otherwise.
+The C+\+11 dialect is assumed by default. No attempts will be made to
+restrict the code to older variants of C+\+.
+For compatibility reasons don't use more recent C++ dialects.
+
+Method names
+~~~~~~~~~~~~
+
+Method names should use lower case and separate words with
+underscores.
+
+
+Namespaces
+~~~~~~~~~~
+
+Namespaces should use lower case and separate words with underscores.
+Namespace blocks should not increase indentation.
+Namespaces can be nested. Namespace closing brackets for nested
+namespaces can be placed together on the same line, but for
+readability reasons the closure should specify the namespace with a
+comment.
+
+[source,cpp]
+----
+namespace spice {
+namespace streaming_agent {
+
+class ClassInsideNamespace {
+...
+};
+
+}} // namespace spice::streaming_agent
+----
+
+The `using namespace` construct should never be used in headers. It should
+be used sparingly in source files, and only within the body of short
+functions.
+
+Preferred alternatives to `using namespace` include:
+
+* using declarations
++
+[source,cpp]
+using spice::streaming_agent::some_class;
++
+* namespace aliases
++
+[source,cpp]
+namespace ssa = spice::streaming_agent;
diff --git a/docs/spice_threading_model.txt b/docs/spice_threading_model.txt
new file mode 100644
index 00000000..1101f5d0
--- /dev/null
+++ b/docs/spice_threading_model.txt
@@ -0,0 +1,80 @@
+How does SPICE handle threading
+===============================
+
+Lots of code runs in a single thread.
+
+Qemu usually calls SPICE from its main thread except on callbacks to code
+already running in different threads.
+
+Channels (RedChannel/RedChannelClient code) run mostly on a single
+thread except RedChannels on creation and destruction which MUST be
+done in the main thread.
+Lots of channels run in the main thread but currently CursorChannel and
+DisplayChannel are run from within a thread created by RedWorker.
+Note that different CursorChannel/DisplayChannel (they differ by id) run in
+separate RedWorker threads (currently a single RedWorker thread runs a pair
+of CursorChannel and DisplayChannel).
+
+RedChannelClient runs in the RedChannel thread. Creation is done in the same
+thread while destruction can happen in different threads.
+
+A RedClient instance groups the various RedChannelClient connected to
+the same remote SPICE client.
+These RedChannelClient instances can run in separate threads:
+MainChannelClient and most of the other RedChannelClient will be
+running in the main thread, while the CursorChannelClient and the
+DisplayChannelClient usually will be running from a different thread.
+
+Another important aspect of dealing with multiple threads are the dispatchers.
+Dispatchers are used to send messages/request from one thread to another.
+The main dispatcher is used to send requests to the main thread.
+The Qxl uses a dispatcher to send requests to the RedWorker which will forward
+to DisplayChannel/CursorChannel.
+
+One aspect to take into consideration is the event scheduling. SPICE uses some
+`SpiceCoreInterface` to handle events. As the events will be handled from a
+thread based on the core interface you have to use the correct core. Each
+channel has an associated core interface which can be retrieved using
+`RedChannel::get_core_interface`. There's also a main core interface you can get
+using `reds_get_core_interface`. `reds_core_timer_*` and `reds_core_watch_*`
+functions use the main core interface.
+Even though multiple channel types run in the main thread and so could use
+directly the main code interface, for coherence, rule simplicity and to allows
+the code to be moved in a separate thread easily if needed, it's advisable to
+use the channel core interface (that will be the main core interface in this
+case).
+Currently character devices and not channel code runs in the main thread.
+
+Reference counting and ownership
+--------------------------------
+-> pointer
+
+=> pointer with owning (mostly GObject ref counting)
+
+RedChannelClient::client -> RedClient
+
+RedClient::channels => RedChannelClient
+
+RedClient::mcc -> MainChannelClient
+
+RedChannelClient::channel => RedChannel
+
+RedChannel::clients -> RedChannelClient
+
+The RedClient represents a connection from a remote SPICE client,
+RedClient::channels corresponding to the connections for the individual
+channels. Their lifetime is tied to the TCP connection to this remote client.
+When a disconnection is detected, the corresponding RedChannelClient are
+removed from RedClient::channels and RedChannel::clients (the main owner of
+RedChannelClient is RedClient).
+When MainChannelClient is disconnected, all RedChannelClients connected to the
+same RedClient are automatically disconnected.
+
+Who owns RedClient? RedClient is released when the MainChannelClient attached
+to it is disconnected. In this case a request is scheduled in the main thread
+(even if MainChannelClient runs on the main thread too) and
+reds_client_disconnect is called which calls RedClient::destroy which uses
+RedClient::unref to free the object.
+
+Where is the MainChannelClient freed? On disconnection like other channel
+clients, currently before RedClient which will have a dangling pointer.
diff --git a/docs/vd_interfaces.txt b/docs/vd_interfaces.txt
new file mode 100644
index 00000000..d38cb781
--- /dev/null
+++ b/docs/vd_interfaces.txt
@@ -0,0 +1,643 @@
+= VD Interfaces
+:revnumber: v1.0
+:revdate: 01.01.2009
+:revremark: Draft 1
+
+Copyright (C) 2009 Red Hat, Inc. +
+Licensed under a Creative Commons Attribution-Share Alike 3.0 +
+United States License (see
+http://creativecommons.org/licenses/by-sa/3.0/us/legalcode). +
+
+:toc:
+
+== Introduction
+
+Virtual Device Interfaces (VDI) provide a standard way to publish interfaces of
+virtual devices by a software component. This enables other software components
+to interact with these devices. This also enables other software components to
+interact with these devices. Going forward, the first component will be called
+the back-end and the second component will be called the front-end. An example
+for using Virtual Device Interfaces is as part of a virtual machine system,
+where the back-end will be the hardware emulation layer. The back-end will
+expose interfaces like display port, mouse input etc. The front-end will plug
+into the display output and will render its output according to it's specific
+implementation. The front-end will also plug into the mouse input and send
+mouse events to be processed by the back-end. In addition many other interface
+types can be exposed by the back-end. Another example of back-end is a remote
+display system in a physical machine environment. Here, the back-and is
+implemented using known techniques for interacting with the native OS for the
+purpose of receiving display updates and pushing inputs. The back-end exposes
+interfaces like display output, mouse input etc. The front-end can be exactly
+the same as in the previous example.
+
+By using VDI one back-end can use many types of front-ends without any special
+code modification. It is also possible for the back-end to dynamically switch
+front-ends, and improve back-end usability and flexibility. The use of
+front-ends by many back-ends allows for a better sharing of development,
+maintenance, and overall product quality.
+
+== Basic operation
+
+Back-end to front-end interaction is initiated by back-end. Back-end uses
+VDI_init symbol to pass its Core interface to the front-end. In addition to
+core interface, back-end also passes options argument to the front-end. Options
+argument is a string holding initialization argument specific to front-end
+implementation. Core interface, like every other interface in VDI, is
+represented as a data structure containing data members and member functions.
+Every interface starts with a common base structure “VDInterface”. The common
+structure contains information for identifying the type of the interface and
+the instance within the type group (i.e. The actual unique is {type, id}). Core
+interface provides basic functionality for attaching with other interfaces that
+the back-end implements. Core interface provides methods for receiving
+interface change events (i.e. interface added event and removing interface
+event) and for enumerating registers. Using these services, the front-end can
+find and interact with other interfaces that back-end publishes. The front-end
+uses VDI type for knowing what functionality the interface provides and the
+means to interact with the interface (i.e interface specific logic function and
+data members).
+
+== Front-end public symbols
+
+VDI defines a minimal set of external symbols for enabling back-end to initiate
+with the front-end. The back-end can load front-end and retrieve front-end
+external symbols dynamically at run-time using native platform services.
+Alternatively, the front-end static or shared library can be linked to the
+back-end during back-end build process.
+
+[source,c]
+----
+int VDI_init(const char *args, CoreInterface *core)
+----
+
+Front-and initialization function. The first parameter is options argument, the
+content of which depends on the specific front-end. The second parameter is
+core interface that provides the basic communication channel between front-end
+and back-end, core interface will be explained later on. VDI_init return value
+is VDI_ERROR_?
+
+[source,c]
+----
+const char **VDI_get_usage()
+----
+
+This function return array of strings in human readable form for displaying the
+available options argument that can be pass in args parameter of VDI_init call.
+
+== Front-end termination
+
+No explicit symbol is defined for front-end termination. Removing core
+interface by back-end implicitly instructs front end to terminate itself.
+
+== Common Definition
+
+[source,c]
+----
+VDI_ERROR_OK = 0
+VDI_ERROR_ERROR = -1
+VM_INTERFACE_VERSION = 2 /*Current VDI version, front-end an back-end must have
+the same VDI version for proper operation. */
+----
+----
+VDIObjectRef – opaque object reference that passes between back-end and
+front-end
+----
+[source,c]
+----
+VDI_INVALID_OBJECT_REF = 0
+----
+== Base structure of VD interface.
+
+The following is definition of VD Interface, all VDI interfaces are derived
+from VD Interface.
+
+[source,c]
+----
+UINT32 version; /* VDI version must be VM_INTERFACE_VERSION */
+CONST CHAR *type; /* type of the interface */
+UNSIGNED INT id; /* unique id of the interface */
+CONST CHAR *description; /* interface human readable interface description*
+UINT32 major_version; /* interface major version. Front-end and back-end
+interfaces having different major_version are not compatible. */
+UINT32 minor_version; /* interface minor version. Minor version increments on
+changes that add functionality but do not break compatible and will be reset on
+major version increment. */
+----
+
+== Core Interface
+
+Core interface is the main interface for front-end to back-end communication.
+It is not allowed to have more the one interface with this type. Removal of
+Core interface by the back-end is explicit front-end termination.
+
+. VDInterface members value
++
+----
+type = “core”
+major_version = 1
+minor_version = 0
+id = 0
+----
++
+. Types
++
+[source,c]
+----
+VDI_CHANGE_NEW = 0
+VDI_CHANGE_REMOVING = 1
+----
++
+[source,c]
+----
+void (*vdi_interface_change_notifier_t)(void *opaque, VDInterface *interface,
+VDInterfaceChangeType change)
+----
++
+Callback for receiving notification event on adding and removing VDI
+interfaces.
++
+* opaque – back-end passes front-end's opaque value that was passed during
+notifier registration.
+* interface - the relevant interface
+* change – type of change VDI_CHANGE_NEW or VDI_CHANGE_REMOVING
+
++
+[source,c]
+----
+void (*timer_callback_t)(void *opaque)
+----
++
+Callback for receiving timer event.
++
+* opaque – back-end passes front-end's opaque value that was passed during
+timer registration.
+
++
+----
+VDI_LOG_LEVEL_ERROR = 1
+VDI_LOG_LEVEL_WARN = 2
+VDI_LOG_LEVEL_INFO = 3
+----
++
+[source,c]
+----
+VDInterface specific extension
+VDInterface *(* next)(CoreInterface *core, VDInterface *prev)
+----
++
+Get next interface – return interface following prev. If prev is NULL return
+first interface. If next return NULL then prev is the last interface. The
+function is used for interfaces discovery.
++
+[source,c]
+----
+VDIObjectRef (*register_change_notifier)(CoreInterface *core, void *opaque,
+vdi_interface_change_notifier_t in_notifier)
+----
++
+Register in_notifier to be called on interface change events. opaque will be
+pushed back by back-end in notify call. On success the function return notifier
+object ref otherwise VDI_INVALID_OBJECT_REF is returned.
++
+[source,c]
+----
+void (*unregister_change_notifiers)(CoreInterface *core, VDObjectRef notifier)
+----
++
+Unregister interface change notifier hat was registered using
+register_change_notifiers.
++
+[source,c]
+----
+VDIObjectRef (*create_timer)(CoreInterface *core, timer_callback_t callback,
+void* opaque)
+----
++
+Create timer object. The timer handler will call callback on time expiration.
+opaque will be pushed back by back-end in callback call. On success the
+function return timer object ref otherwise VDI_INVALID_OBJECT_REF is returned
++
+[source,c]
+----
+void (*arm_timer)(CoreInterface *core, VDIObjectRef timer, uint32_t ms)
+----
++
+Schedule timer object to fire it's callback after ms. Timer is VDI ref object
+returned by create_timer and ms is time in millisecond.
++
+[source,c]
+----
+void (*disarm_timer)(CoreInterface *core, VDIObjectRef timer)
+----
++
+Cancel previous arm_timer scheduling. Timer is VDI ref object returned by
+create_timer
++
+[source,c]
+----
+void (*destroy_timer)(CoreInterface *core, VDIObjectRef timer)
+----
++
+Destroy timer object. Timer is vdi ref object returned by create_timer.
++
+[source,c]
+----
+int (*set_file_handlers)(CoreInterface *core, int fd, void (*on_read)(void *),
+void (*on_write)(void *), void *opaque)
+----
++
+Request notification on file descriptor for non blocking operation. Fd is the
+target file descriptor. Back-end will call on_read, if not NULL, on read events
+passing opaque as first argument. Back-end will call on_write, if not NULL, on
+write events passing opaque as first argument. On success VDI_ERROR_OK is
+return.
++
+[source,c]
+----
+void (*term_printf)(CoreInterface *core, const char* format, ...)
+----
++
+Send message to back-end interactive terminal if exist. format is printf
+format, following format are variable arguments list that are format
+arguments.
++
+[source,c]
+----
+void (*log)(CoreInterface *core, LogLevel level, const char* component, const
+char* format, ...)
+----
++
+Send message to be logged using back-end logging service. Level is one of
+VDI_LOG_LEVEL_?. Component is component name that will be attached as prefix
+to the message. Format is printf format, following format are variable
+arguments list that are format arguments.
+Callback
+
+== Other interfaces
+
+Core interface is the only interface that is an integral part of VDI
+specifications. Any other interface can be defined independently of this
+specification. It's required that both the back-and the front-end know specific
+interface definitions for proper operation. The only restriction for defining
+new interface is to ensure the uniqueness of VD Interface type. The following
+interfaces are known VD interfaces that discussed here as a reference for
+better understanding of the specification.
+
+== Keyboard interface
+
+Keyboard interface exposes standard keyboard functionally. It enables pushing
+scan-code set 1 codes and getting keyboard LED information by query or change
+notifications mechanism.
+
+. VDInterface members value
++
+[source,c]
+----
+type = “keyboard”
+major_version = 1
+minor_version = 0
+id = keyboard instance id
+----
++
+. Types
++
+[source,c]
+----
+VDI_KEYBOARD_LED_SCROLL_LOCK 0
+VDI_KEYBOARD_LED_NUM_LOCK 1
+VDI_KEYBOARD_LED_CAPS_LOCK 2
+----
++
+[source,c]
+----
+void (*keyboard_leads_notifier_t)(void *opaque, uint8_t leds)
+----
++
+Callback for receiving notification event on keyboard LED changes.
++
+* opaque – back-end passed front-end's opaque value that was passed during
+notifier registration.
+* leds – current LED state mask. LED X is on if bit VDI_KEYBOARD_LED_X is set.
+
++
+. VDInterface specific extension
++
+[source,c]
+----
+void (*push_scan_freg)(KeyboardInterface *keyboard, uint8_t frag)
+----
++
+Push scan-code code fragment to the keyboard. Frag is part of scan code.
+For example calling:
++
+[source,c]
+----
+push_scan_freg(0xe0);
+push_scan_freg(0x1d);
+----
++
+will result with Right CTRL.
++
+[source,c]
+----
+uint8_t (*get_leds)(KeyboardInterface *keyboard)
+----
++
+Get current keyboard lads mask. Return lads mask
++
+[source,c]
+----
+VDIObjectRef (*register_leds_notifier)(KeyboardInterface *keyboard,
+keyboard_leads_notifier_t notifier, void *opaque)
+----
++
+Register for LED notification. Back-end will call notifier on every keyboard
+LED change. Opaque will be pushed back as notifier argument. On success, the
+function return notifier object ref otherwise VDI_INVALID_OBJECT_REF is
+returned.
++
+[source,c]
+----
+void (*unregister_leds_notifier)(KeyboardInterface *keyboard, VDObjectRef
+notifier)
+----
++
+Unregister LED change notifier that was registered using
+register_leds_notifier.
+
+== Mouse interface
+
+Mouse interface for pushing mouse motion and mouse buttons state events.
+
+. VDInterface members value
++
+[source,c]
+----
+type = “mouse”
+major_version = 1
+minor_version = 0
+id = mouse instance id
+----
++
+. Types
++
+[source,c]
+----
+VDI_MOUSE_BUTTON_LEFT 0
+VDI_MOUSE_BUTTON_RIGHT 1
+VDI_MOUSE_BUTTON_MIDEL 2
+----
++
+. VDInterface specific extension
++
+[source,c]
+----
+void (*motion)(MouseInterface* mouse, int dx, int dy, int dz, uint32_t
+buttons_state)
+----
++
+Push mouse motion and buttons state. dx and dy are mouse motion in pixels in x
+and y axis, positive dx is rightward motion and positive dy is downward motion.
+dz is scroll wheel ticks, positive value is scroll down. buttons_state is
+buttons state mask. Button X is press if bit VDI_MOUSE_BUTTON_X is set.
++
+[source,c]
+----
+void (*buttons)(MouseInterface* mouse, uint32_t buttons_state)
+----
++
+Push mouse buttons state. buttons_state is the same as in the motion call
+
+== Tablet interface
+
+Tablet interface for supporting absolute mouse pointing.
+
+. Interface members value
++
+[source,c]
+----
+type = “tablet”
+major_version = 1
+minor_version = 0
+id = tablet instance id
+----
++
+. Types
++
+[source,c]
+----
+VDI_TABLET_BUTTON_LEFT 0
+VDI_TABLET_BUTTON_RIGHT 1
+VDI_TABLET_BUTTON_MIDEL 2
+----
++
+. VDInterface specific extension
++
+[source,c]
+----
+void (*set_logical_size)(TabletInterface* tablet, int width, int height)
+----
++
+Set logical dimension of the tablet. The logical dimension will be used by the
+tablet device for mapping position to local coordinate system.
++
+[source,c]
+----
+void (*position)(TabletInterface* tablet, int x, int y, uint32_t buttons_state)
+----
++
+Push mouse position and mouse button state. {x, y} position is relative to the
+upper left corner. Positive value on x axis advances rightward and positive
+value on y axis advances downward. buttons_state is buttons state mask. Button
+X is press if bit VDI_TABLET_BUTTON_X is set.
++
+[source,c]
+----
+void (*wheel)(TabletInterface* tablet, int wheel_motion, uint32_t
+buttons_state)
+----
++
+Push scroll wheel motion and buttons state. wheel_motion is scroll sicks.
+positive wheel_motion is for scroll down. buttons_state is as in “position”
++
+[source,c]
+----
+void (*buttons)(TabletInterface* tablet, uint32_t buttons_state)
+----
++
+Push buttons state. buttons_state is as in “position”
+
+== Playback interface
+
+Playback interface for receiving audio stream for playback. Playback use fix
+audio configuration, channels = 2, frequency = 44100 and channel sample
+format signed 16bit.
+
+. VDInterface members value
++
+[source,c]
+----
+type = “playback”
+major_version = 1
+minor_version = 0
+id = playback instance id
+----
++
+. PlaybackPlug
++
+[source,c]
+----
+uint32_t major_version
+----
++
+plug major version. Changing major version breaks compatibility.
++
+[source,c]
+----
+uint32_t minor_version
+----
++
+interface minor version. Minor version increments on changes that add
+functionality but do not break compatible and will be reset on major version
+increment.
++
+[source,c]
+----
+void (*start)(PlaybackPlug *plug)
+----
++
+back-end will call this callback while staring audio playback
++
+[source,c]
+----
+void (*stop)(PlaybackPlug *plug)
+----
++
+back-end will call this callback while stopping audio playback
++
+[source,c]
+----
+void (*get_frame)(PlaybackPlug *plug, uint32_t **frame, uint32_t *samples)
+----
++
+back-end will call this callback for getting audio frame. On return *frame will
+point to audio frame capable of holding *samples samples (i.e frame size is
+samples * 4). The frame will be pushed back filled with audio samples by the
+back-end. If no frame is available *frame will be NULL.
++
+[source,c]
+----
+void (*put_frame)(PlaybackPlug *plug, uint32_t *frame)
+----
++
+back-end will call this callback to deliver audio frame for playback. Frame is
+one that was returns by get_frame. This call also moves frame ownership back to
+the front-end.
+
+. VDInterface specific extension
++
+[source,c]
+----
+VDIObjectRef (*plug)(PlaybackInterface *playback, PlaybackPlug* plug, int
+*active)
+----
++
+Attach playback plug to playback interface instance. Plug is the plug to
+attach. On return, active will be 0 if playback is stopped and 1 if playback is
+running. On success, the function return object ref otherwise
+VDI_INVALID_OBJECT_REF is returned.
++
+[source,c]
+----
+void (*unplug)(PlaybackInterface *playback, VDIObjectRef)
+----
++
+Unplug playback that was plugged using plug.
+
+== Record interface
+
+Record interface for pushing audio capture to back-end. Record use fix audio
+configuration, channels = 2, frequency = 44100 and channel sample format
+signed 16bit.
+
+. VDInterface members value
++
+[source,c]
+----
+type = “record”
+major_version = 1
+minor_version = 0
+id = record instance id
+----
+
+. RecordPlug
++
+[source,c]
+----
+uint32_t minor_version
+----
++
+plug major version. Changing major version breaks compatibility.
++
+[source,c]
+----
+uint32_t major_version
+----
++
+interface minor version. Minor version increments on changes that add
+functionality but do not break compatible and will be reset on major version
+increment.
++
+[source,c]
+----
+void (*start)(RecordPlug *plug)
+----
++
+back-end will call this callback for staring audio capture
++
+[source,c]
+----
+void (*stop)(RecordPlug *plug)
+----
++
+back-end will call this callback to stop audio capture
++
+[source,c]
+----
+uint32_t (*read)(RecordPlug *plug, uint32_t num_samples, uint32_t *samples)
+----
++
+back-end will call this callback to receive audio capture samples. num_samples
+is the requested number samples. Samples is buffer for receiving samples (i.e
+samples size is num_samples * 4). Read return number of samples returned.
+
+. VDInterface specific extension
++
+[source,c]
+----
+VDIObjectRef (*plug)(RecordInterface *recorder, RecordPlug* plug, int *active)
+----
++
+Attach record plug to interface instance. Plug is the plug to attach. On
+return, active will be 0 if record is stopped and 1 if record is running. On
+success, the function return object ref otherwise VDI_INVALID_OBJECT_REF is
+returned.
++
+[source,c]
+----
+void (*unplug)(RecordInterface *recorder, VDIObjectRef)
+----
++
+Unplug record plug that was plugged using plug.
+
+== Additional registered interfaces
+
+* QXL interface "qxl" – QXL interface enable front-end to plug into QXL display
+device in order to receive QXL and to render it's output locally or remotely.
+* VDI port interface "vdi_port" – interface for plugging, reading and writing
+to vdi_port. vdi_port is used for communication with an agent residing on gust
+machine.
+* Migration interface "migration" - interface for integrating with back-end
+migration process. This interface enable registering for pre and post migration
+hooks.
+* Qemu terminal interface "qemu_terminal" – interface for integrating with
+QEMU style terminal.
diff --git a/doxygen.cfg b/doxygen.cfg
new file mode 100644
index 00000000..f7e1152e
--- /dev/null
+++ b/doxygen.cfg
@@ -0,0 +1,2536 @@
+# Doxyfile 1.8.15
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the configuration
+# file that follow. The default is UTF-8 which is also the encoding used for all
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the
+# iconv built into libc) for the transcoding. See
+# https://www.gnu.org/software/libiconv/ for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+PROJECT_NAME = "SPICE server"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER =
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF =
+
+# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
+# in the documentation. The maximum height of the logo should not exceed 55
+# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
+# the logo to the output directory.
+
+PROJECT_LOGO =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY =
+
+# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
+
+CREATE_SUBDIRS = NO
+
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
+# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
+# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
+# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
+# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
+# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
+# Ukrainian and Vietnamese.
+# The default value is: English.
+
+OUTPUT_LANGUAGE = English
+
+# The OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all generated output in the proper direction.
+# Possible values are: None, LTR, RTL and Context.
+# The default value is: None.
+
+OUTPUT_TEXT_DIRECTION = None
+
+# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+# The default value is: YES.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF = "The $name class" \
+ "The $name widget" \
+ "The $name file" \
+ is \
+ provides \
+ specifies \
+ contains \
+ represents \
+ a \
+ an \
+ the
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
+# description.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
+
+FULL_PATH_NAMES = YES
+
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
+
+STRIP_FROM_PATH =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF = YES
+
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
+
+INHERIT_DOCS = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
+# page for each member. If set to NO, the documentation of a member will be part
+# of the file/class/namespace that contains it.
+# The default value is: NO.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE = 4
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines (in the resulting output). You can put ^^ in the value part of an
+# alias to insert a newline as if a physical newline was in the original file.
+# When you need a literal { or } or , in the value part of an alias you have to
+# escape them by means of a backslash (\), this can lead to conflicts with the
+# commands \{ and \} for these it is advised to use the version @{ and @} or use
+# a double escape (\\{ and \\})
+
+ALIASES =
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
+
+TCL_SUBST =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL = NO
+
+# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice
+# sources only. Doxygen will then generate output that is more tailored for that
+# language. For instance, namespaces will be presented as modules, types will be
+# separated into more groups, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_SLICE = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice,
+# Fortran (fixed format Fortran: FortranFixed, free formatted Fortran:
+# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser
+# tries to guess whether the code is fixed or free formatted code, this is the
+# default for Fortran type files), VHDL, tcl. For instance to make doxygen treat
+# .inc files as Fortran files (default is PHP), and .f files as C (default is
+# Fortran), use: inc=Fortran f=C.
+#
+# Note: For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
+
+EXTENSION_MAPPING =
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See https://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT = YES
+
+# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up
+# to that level are automatically included in the table of contents, even if
+# they do not have an id attribute.
+# Note: This feature currently applies only to Markdown headings.
+# Minimum value: 0, maximum value: 99, default value: 0.
+# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
+
+TOC_INCLUDE_HEADINGS = 0
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by putting a % sign in front of the word or
+# globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# If one adds a struct or class to a group and this option is enabled, then also
+# any nested class or struct is added to the same group. By default this option
+# is disabled and one has to add nested compounds explicitly via \ingroup.
+# The default value is: NO.
+
+GROUP_NESTED_COMPOUNDS = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE = NO
+
+# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE = NO
+
+# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO,
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. If set to YES, local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO, only methods in the interface are
+# included.
+# The default value is: NO.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO, these classes will be included in the various overviews. This option
+# has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO, these declarations will be
+# included in the documentation.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO, these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
+
+HIDE_IN_BODY_DOCS = NO
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+INTERNAL_DOCS = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES, upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+# The default value is: system dependent.
+
+CASE_SENSE_NAMES = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES, the
+# scope will be hidden.
+# The default value is: NO.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
+# append additional text to a page's title, such as Class Reference. If set to
+# YES the compound reference will be hidden.
+# The default value is: NO.
+
+HIDE_COMPOUND_REFERENCE= NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES = NO
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order.
+# The default value is: YES.
+
+SORT_MEMBER_DOCS = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
+# list. This list is created by putting \todo commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
+# list. This list is created by putting \test commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
+
+ENABLED_SECTIONS =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES, the
+# list will mention the files that were used to generate the documentation.
+# The default value is: YES.
+
+SHOW_USED_FILES = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. See also \cite for info how to create references.
+
+CITE_BIB_FILES =
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
+
+QUIET = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS = YES
+
+# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
+
+WARN_IF_UNDOCUMENTED = YES
+
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO, doxygen will only warn about wrong or incomplete
+# parameter documentation, but not about the absence of documentation. If
+# EXTRACT_ALL is set to YES then this flag will automatically be disabled.
+# The default value is: NO.
+
+WARN_NO_PARAMDOC = NO
+
+# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
+# a warning is encountered.
+# The default value is: NO.
+
+WARN_AS_ERROR = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
+
+WARN_LOGFILE = doxy.log
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
+# Note: If this tag is empty the current directory is searched.
+
+INPUT = $(SRCDIR)/server
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: https://www.gnu.org/software/libiconv/) for the list of
+# possible encodings.
+# The default value is: UTF-8.
+
+INPUT_ENCODING = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# read by doxygen.
+#
+# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
+# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
+# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
+# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08,
+# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf, *.qsf and *.ice.
+
+FILE_PATTERNS = *.c \
+ *.cc \
+ *.cxx \
+ *.cpp \
+ *.c++ \
+ *.java \
+ *.ii \
+ *.ixx \
+ *.ipp \
+ *.i++ \
+ *.inl \
+ *.idl \
+ *.ddl \
+ *.odl \
+ *.h \
+ *.hh \
+ *.hxx \
+ *.hpp \
+ *.h++ \
+ *.cs \
+ *.d \
+ *.php \
+ *.php4 \
+ *.php5 \
+ *.phtml \
+ *.inc \
+ *.m \
+ *.markdown \
+ *.md \
+ *.mm \
+ *.dox \
+ *.py \
+ *.pyw \
+ *.f90 \
+ *.f95 \
+ *.f03 \
+ *.f08 \
+ *.f \
+ *.for \
+ *.tcl \
+ *.vhd \
+ *.vhdl \
+ *.ucf \
+ *.qsf \
+ *.ice
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE = NO
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE =
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
+
+EXCLUDE_SYMBOLS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
+
+EXAMPLE_PATTERNS = *
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
+
+FILTER_SOURCE_FILES = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
+
+SOURCE_BROWSER = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
+
+INLINE_SOURCES = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# entity all documented functions referencing it will be listed.
+# The default value is: NO.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
+
+REFERENCES_RELATION = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see https://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
+
+VERBATIM_HEADERS = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
+
+ALPHABETICAL_INDEX = YES
+
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
+# The default value is: YES.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_OUTPUT = doxygen_doc
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefore more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list). For an example see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the style sheet and background images according to
+# this color. Hue is specified as an angle on a colorwheel, see
+# https://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use grayscales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to YES can help to show when doxygen was last run and thus if the
+# documentation is up to date.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP = NO
+
+# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML
+# documentation will contain a main index with vertical navigation menus that
+# are dynamically created via Javascript. If disabled, the navigation index will
+# consists of multiple levels of tabs that are statically embedded in every HTML
+# page. Disable this option to support browsers that do not have Javascript,
+# like the Qt help browser.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_MENUS = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see: https://developer.apple.com/xcode/), introduced with OSX
+# 10.5 (Leopard). To create a documentation set, doxygen will generate a
+# Makefile in the HTML output directory. Running make will produce the docset in
+# that directory and running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy
+# genXcode/_index.html for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET = NO
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME = "Doxygen generated docs"
+
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID = org.doxygen.Project
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# (see: https://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# Windows.
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_HTMLHELP = NO
+
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_FILE =
+
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler (hhc.exe). If non-empty,
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+HHC_LOCATION =
+
+# The GENERATE_CHI flag controls if a separate .chi index file is generated
+# (YES) or that it should be included in the master .chm file (NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+GENERATE_CHI = NO
+
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_INDEX_ENCODING =
+
+# The BINARY_TOC flag controls whether a binary table of contents is generated
+# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
+# enables the Previous and Next buttons.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+TOC_EXPAND = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see: http://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see: http://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-
+# folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER = doc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME =
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# http://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS =
+
+# The QHG_LOCATION tag can be used to specify the location of Qt's
+# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
+# generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+DISABLE_INDEX = NO
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine-tune the look of the index. As an example, the default style
+# sheet generated by doxygen has an example that shows how to put an image at
+# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
+# the same information as the tab index, you could consider setting
+# DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_TREEVIEW = NO
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+ENUM_VALUES_PER_LINE = 4
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+TREEVIEW_WIDTH = 250
+
+# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+EXT_LINKS_IN_WINDOW = NO
+
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_FONTSIZE = 10
+
+# Use the FORMULA_TRANSPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_TRANSPARENT = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# https://www.mathjax.org) which uses client side Javascript for the rendering
+# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX = NO
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. See the MathJax site (see:
+# http://docs.mathjax.org/en/latest/output.html) for more details.
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility), NativeMML (i.e. MathML) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from https://www.mathjax.org before deployment.
+# The default value is: https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH = https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use <access key> + S
+# (what the <access key> is depends on the OS and browser, but it is typically
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SEARCHENGINE = YES
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using Javascript. There
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
+# setting. When disabled, doxygen will generate a PHP script for searching and
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
+# and searching needs to be provided by external tools. See the section
+# "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: https://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: https://xapian.org/). See the section "External Indexing and
+# Searching" for details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
+# The default value is: YES.
+
+GENERATE_LATEX = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_OUTPUT = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when not enabling USE_PDFLATEX the default is latex when enabling
+# USE_PDFLATEX the default is pdflatex and when in the later case latex is
+# chosen this is overwritten by pdflatex. For specific output languages the
+# default can have been set differently, this depends on the implementation of
+# the output language.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_CMD_NAME =
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# Note: This tag is used in the Makefile / make.bat.
+# See also: LATEX_MAKEINDEX_CMD for the part in the generated output file
+# (.tex).
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# The LATEX_MAKEINDEX_CMD tag can be used to specify the command name to
+# generate index for LaTeX.
+# Note: This tag is used in the generated output file (.tex).
+# See also: MAKEINDEX_CMD_NAME for the part in the Makefile / make.bat.
+# The default value is: \makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_MAKEINDEX_CMD = \makeindex
+
+# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+COMPACT_LATEX = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PAPER_TYPE = a4
+
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. The package can be specified just
+# by its name or with the correct syntax as to be used with the LaTeX
+# \usepackage command. To get the times font for instance you can specify :
+# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}
+# To use the option intlimits with the amsmath package you can specify:
+# EXTRA_PACKAGES=[intlimits]{amsmath}
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+EXTRA_PACKAGES =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
+# generated LaTeX document. The header should contain everything until the first
+# chapter. If it is left blank doxygen will generate a standard header. See
+# section "Doxygen usage" for information on how to let doxygen write the
+# default header to a separate file.
+#
+# Note: Only use a user-defined header if you know what you are doing! The
+# following commands have a special meaning inside the header: $title,
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
+# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
+# string, for the replacement values of the other commands the user is referred
+# to HTML_HEADER.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
+# generated LaTeX document. The footer should contain everything after the last
+# chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer.
+#
+# Note: Only use a user-defined footer if you know what you are doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_FOOTER =
+
+# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# LaTeX style sheets that are included after the standard style sheets created
+# by doxygen. Using this option one can overrule certain style aspects. Doxygen
+# will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list).
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_STYLESHEET =
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_FILES =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PDF_HYPERLINKS = YES
+
+# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES, to get a
+# higher quality PDF documentation.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+USE_PDFLATEX = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help. This option is also used
+# when generating formulas in HTML.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BATCHMODE = NO
+
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HIDE_INDICES = NO
+
+# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
+# code with syntax highlighting in the LaTeX output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_SOURCE_CODE = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# https://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BIB_STYLE = plain
+
+# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_TIMESTAMP = NO
+
+# The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute)
+# path from which the emoji images will be read. If a relative path is entered,
+# it will be relative to the LATEX_OUTPUT directory. If left blank the
+# LATEX_OUTPUT directory will be used.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EMOJI_DIRECTORY =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_HYPERLINKS = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# configuration file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's configuration file. A template extensions file can be
+# generated using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_EXTENSIONS_FILE =
+
+# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
+# with syntax highlighting in the RTF output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_SOURCE_CODE = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_EXTENSION = .3
+
+# The MAN_SUBDIR tag determines the name of the directory created within
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
+# MAN_EXTENSION with the initial . removed.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_SUBDIR =
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_OUTPUT = xml
+
+# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_PROGRAMLISTING = YES
+
+# If the XML_NS_MEMB_FILE_SCOPE tag is set to YES, doxygen will include
+# namespace members in file scope as well, matching the HTML output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_NS_MEMB_FILE_SCOPE = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
+
+GENERATE_DOCBOOK = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT = docbook
+
+# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
+# program listings (including syntax highlighting and cross-referencing
+# information) to the DOCBOOK output. Note that enabling this will significantly
+# increase the size of the DOCBOOK output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_PROGRAMLISTING = NO
+
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
+# AutoGen Definitions (see http://autogen.sourceforge.net/) file that captures
+# the structure of the code including all documentation. Note that this feature
+# is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO, the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
+# in the source code. If set to NO, only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+MACRO_EXPANSION = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_ONLY_PREDEF = NO
+
+# If the SEARCH_INCLUDES tag is set to YES, the include files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+PREDEFINED =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_AS_DEFINED =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all references to function-like macros that are alone on a line, have
+# an all uppercase name, and do not end with a semicolon. Such function macros
+# are typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have a unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
+# the class index. If set to NO, only the inherited external classes will be
+# listed.
+# The default value is: NO.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
+
+EXTERNAL_GROUPS = YES
+
+# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of 'which perl').
+# The default file (with absolute path) is: /usr/bin/perl.
+
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
+# powerful graphs.
+# The default value is: YES.
+
+CLASS_DIAGRAMS = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see:
+# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH =
+
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
+
+DIA_PATH =
+
+# If set to YES the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: NO.
+
+HAVE_DOT = YES
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS = 0
+
+# When you want a differently looking font in the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTNAME = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTSIZE = 10
+
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH =
+
+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
+# each documented class showing the direct and indirect inheritance relations.
+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+COLLABORATION_GRAPH = YES
+
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GROUP_GRAPHS = YES
+
+# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LOOK = NO
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LIMIT_NUM_FIELDS = 10
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+TEMPLATE_RELATIONS = NO
+
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDE_GRAPH = YES
+
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDED_BY_GRAPH = YES
+
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command. Disabling a call graph can be
+# accomplished by means of the command \hidecallgraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALL_GRAPH = NO
+
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command. Disabling a caller graph can be
+# accomplished by means of the command \hidecallergraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALLER_GRAPH = NO
+
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GRAPHICAL_HIERARCHY = YES
+
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DIRECTORY_GRAPH = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. For an explanation of the image formats see the section
+# output formats in the documentation of the dot tool (Graphviz (see:
+# http://www.graphviz.org/)).
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo,
+# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
+# png:gdiplus:gdiplus.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_IMAGE_FORMAT = svg
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG = NO
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS =
+
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
+
+DIAFILE_DIRS =
+
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file. If left blank, it is assumed
+# PlantUML is not used or called during a preprocessing step. Doxygen will
+# generate a warning when it encounters a \startuml command in this case and
+# will not generate output for the diagram.
+
+PLANTUML_JAR_PATH =
+
+# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a
+# configuration file for plantuml.
+
+PLANTUML_CFG_FILE =
+
+# When using plantuml, the specified paths are searched for files specified by
+# the !include statement in a plantuml block.
+
+PLANTUML_INCLUDE_PATH =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_GRAPH_MAX_NODES = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+MAX_DOT_GRAPH_DEPTH = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_TRANSPARENT = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_MULTI_TARGETS = NO
+
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_CLEANUP = YES
diff --git a/doxygen.sh b/doxygen.sh
new file mode 100755
index 00000000..46f47ff4
--- /dev/null
+++ b/doxygen.sh
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+set -e # exit on errors
+
+SRCDIR=`dirname $0`
+test -z "$SRCDIR" && SRCDIR=.
+cd "$SRCDIR"
+
+export SRCDIR
+rm -rf doxygen_doc
+doxygen doxygen.cfg
+echo Timestamp > doxygen_doc/spice.tag
diff --git a/m4/ax_pthread.m4 b/m4/ax_pthread.m4
new file mode 100644
index 00000000..e5858e50
--- /dev/null
+++ b/m4/ax_pthread.m4
@@ -0,0 +1,522 @@
+# ===========================================================================
+# https://www.gnu.org/software/autoconf-archive/ax_pthread.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+# AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+#
+# DESCRIPTION
+#
+# This macro figures out how to build C programs using POSIX threads. It
+# sets the PTHREAD_LIBS output variable to the threads library and linker
+# flags, and the PTHREAD_CFLAGS output variable to any special C compiler
+# flags that are needed. (The user can also force certain compiler
+# flags/libs to be tested by setting these environment variables.)
+#
+# Also sets PTHREAD_CC and PTHREAD_CXX to any special C compiler that is
+# needed for multi-threaded programs (defaults to the value of CC
+# respectively CXX otherwise). (This is necessary on e.g. AIX to use the
+# special cc_r/CC_r compiler alias.)
+#
+# NOTE: You are assumed to not only compile your program with these flags,
+# but also to link with them as well. For example, you might link with
+# $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
+# $PTHREAD_CXX $CXXFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
+#
+# If you are only building threaded programs, you may wish to use these
+# variables in your default LIBS, CFLAGS, and CC:
+#
+# LIBS="$PTHREAD_LIBS $LIBS"
+# CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+# CXXFLAGS="$CXXFLAGS $PTHREAD_CFLAGS"
+# CC="$PTHREAD_CC"
+# CXX="$PTHREAD_CXX"
+#
+# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant
+# has a nonstandard name, this macro defines PTHREAD_CREATE_JOINABLE to
+# that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
+#
+# Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the
+# PTHREAD_PRIO_INHERIT symbol is defined when compiling with
+# PTHREAD_CFLAGS.
+#
+# ACTION-IF-FOUND is a list of shell commands to run if a threads library
+# is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it
+# is not found. If ACTION-IF-FOUND is not specified, the default action
+# will define HAVE_PTHREAD.
+#
+# Please let the authors know if this macro fails on any platform, or if
+# you have any other suggestions or comments. This macro was based on work
+# by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help
+# from M. Frigo), as well as ac_pthread and hb_pthread macros posted by
+# Alejandro Forero Cuervo to the autoconf macro repository. We are also
+# grateful for the helpful feedback of numerous users.
+#
+# Updated for Autoconf 2.68 by Daniel Richard G.
+#
+# LICENSE
+#
+# Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
+# Copyright (c) 2011 Daniel Richard G. <skunk@iSKUNK.ORG>
+# Copyright (c) 2019 Marc Stevens <marc.stevens@cwi.nl>
+#
+# This program is free software: you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation, either version 3 of the License, or (at your
+# option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+# Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception, the respective Autoconf Macro's copyright owner
+# gives unlimited permission to copy, distribute and modify the configure
+# scripts that are the output of Autoconf when processing the Macro. You
+# need not follow the terms of the GNU General Public License when using
+# or distributing such scripts, even though portions of the text of the
+# Macro appear in them. The GNU General Public License (GPL) does govern
+# all other use of the material that constitutes the Autoconf Macro.
+#
+# This special exception to the GPL applies to versions of the Autoconf
+# Macro released by the Autoconf Archive. When you make and distribute a
+# modified version of the Autoconf Macro, you may extend this special
+# exception to the GPL to apply to your modified version as well.
+
+#serial 30
+
+AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD])
+AC_DEFUN([AX_PTHREAD], [
+AC_REQUIRE([AC_CANONICAL_TARGET])
+AC_REQUIRE([AC_PROG_CC])
+AC_REQUIRE([AC_PROG_SED])
+AC_LANG_PUSH([C])
+ax_pthread_ok=no
+
+# We used to check for pthread.h first, but this fails if pthread.h
+# requires special compiler flags (e.g. on Tru64 or Sequent).
+# It gets checked for in the link test anyway.
+
+# First of all, check if the user has set any of the PTHREAD_LIBS,
+# etcetera environment variables, and if threads linking works using
+# them:
+if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then
+ ax_pthread_save_CC="$CC"
+ ax_pthread_save_CFLAGS="$CFLAGS"
+ ax_pthread_save_LIBS="$LIBS"
+ AS_IF([test "x$PTHREAD_CC" != "x"], [CC="$PTHREAD_CC"])
+ AS_IF([test "x$PTHREAD_CXX" != "x"], [CXX="$PTHREAD_CXX"])
+ CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+ LIBS="$PTHREAD_LIBS $LIBS"
+ AC_MSG_CHECKING([for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS])
+ AC_LINK_IFELSE([AC_LANG_CALL([], [pthread_join])], [ax_pthread_ok=yes])
+ AC_MSG_RESULT([$ax_pthread_ok])
+ if test "x$ax_pthread_ok" = "xno"; then
+ PTHREAD_LIBS=""
+ PTHREAD_CFLAGS=""
+ fi
+ CC="$ax_pthread_save_CC"
+ CFLAGS="$ax_pthread_save_CFLAGS"
+ LIBS="$ax_pthread_save_LIBS"
+fi
+
+# We must check for the threads library under a number of different
+# names; the ordering is very important because some systems
+# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
+# libraries is broken (non-POSIX).
+
+# Create a list of thread flags to try. Items with a "," contain both
+# C compiler flags (before ",") and linker flags (after ","). Other items
+# starting with a "-" are C compiler flags, and remaining items are
+# library names, except for "none" which indicates that we try without
+# any flags at all, and "pthread-config" which is a program returning
+# the flags for the Pth emulation library.
+
+ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
+
+# The ordering *is* (sometimes) important. Some notes on the
+# individual items follow:
+
+# pthreads: AIX (must check this before -lpthread)
+# none: in case threads are in libc; should be tried before -Kthread and
+# other compiler flags to prevent continual compiler warnings
+# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
+# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64
+# (Note: HP C rejects this with "bad form for `-t' option")
+# -pthreads: Solaris/gcc (Note: HP C also rejects)
+# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
+# doesn't hurt to check since this sometimes defines pthreads and
+# -D_REENTRANT too), HP C (must be checked before -lpthread, which
+# is present but should not be used directly; and before -mthreads,
+# because the compiler interprets this as "-mt" + "-hreads")
+# -mthreads: Mingw32/gcc, Lynx/gcc
+# pthread: Linux, etcetera
+# --thread-safe: KAI C++
+# pthread-config: use pthread-config program (for GNU Pth library)
+
+case $target_os in
+
+ freebsd*)
+
+ # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
+ # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
+
+ ax_pthread_flags="-kthread lthread $ax_pthread_flags"
+ ;;
+
+ hpux*)
+
+ # From the cc(1) man page: "[-mt] Sets various -D flags to enable
+ # multi-threading and also sets -lpthread."
+
+ ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags"
+ ;;
+
+ openedition*)
+
+ # IBM z/OS requires a feature-test macro to be defined in order to
+ # enable POSIX threads at all, so give the user a hint if this is
+ # not set. (We don't define these ourselves, as they can affect
+ # other portions of the system API in unpredictable ways.)
+
+ AC_EGREP_CPP([AX_PTHREAD_ZOS_MISSING],
+ [
+# if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS)
+ AX_PTHREAD_ZOS_MISSING
+# endif
+ ],
+ [AC_MSG_WARN([IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support.])])
+ ;;
+
+ solaris*)
+
+ # On Solaris (at least, for some versions), libc contains stubbed
+ # (non-functional) versions of the pthreads routines, so link-based
+ # tests will erroneously succeed. (N.B.: The stubs are missing
+ # pthread_cleanup_push, or rather a function called by this macro,
+ # so we could check for that, but who knows whether they'll stub
+ # that too in a future libc.) So we'll check first for the
+ # standard Solaris way of linking pthreads (-mt -lpthread).
+
+ ax_pthread_flags="-mt,-lpthread pthread $ax_pthread_flags"
+ ;;
+esac
+
+# Are we compiling with Clang?
+
+AC_CACHE_CHECK([whether $CC is Clang],
+ [ax_cv_PTHREAD_CLANG],
+ [ax_cv_PTHREAD_CLANG=no
+ # Note that Autoconf sets GCC=yes for Clang as well as GCC
+ if test "x$GCC" = "xyes"; then
+ AC_EGREP_CPP([AX_PTHREAD_CC_IS_CLANG],
+ [/* Note: Clang 2.7 lacks __clang_[a-z]+__ */
+# if defined(__clang__) && defined(__llvm__)
+ AX_PTHREAD_CC_IS_CLANG
+# endif
+ ],
+ [ax_cv_PTHREAD_CLANG=yes])
+ fi
+ ])
+ax_pthread_clang="$ax_cv_PTHREAD_CLANG"
+
+
+# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC)
+
+# Note that for GCC and Clang -pthread generally implies -lpthread,
+# except when -nostdlib is passed.
+# This is problematic using libtool to build C++ shared libraries with pthread:
+# [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25460
+# [2] https://bugzilla.redhat.com/show_bug.cgi?id=661333
+# [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555
+# To solve this, first try -pthread together with -lpthread for GCC
+
+AS_IF([test "x$GCC" = "xyes"],
+ [ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags"])
+
+# Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first
+
+AS_IF([test "x$ax_pthread_clang" = "xyes"],
+ [ax_pthread_flags="-pthread,-lpthread -pthread"])
+
+
+# The presence of a feature test macro requesting re-entrant function
+# definitions is, on some systems, a strong hint that pthreads support is
+# correctly enabled
+
+case $target_os in
+ darwin* | hpux* | linux* | osf* | solaris*)
+ ax_pthread_check_macro="_REENTRANT"
+ ;;
+
+ aix*)
+ ax_pthread_check_macro="_THREAD_SAFE"
+ ;;
+
+ *)
+ ax_pthread_check_macro="--"
+ ;;
+esac
+AS_IF([test "x$ax_pthread_check_macro" = "x--"],
+ [ax_pthread_check_cond=0],
+ [ax_pthread_check_cond="!defined($ax_pthread_check_macro)"])
+
+
+if test "x$ax_pthread_ok" = "xno"; then
+for ax_pthread_try_flag in $ax_pthread_flags; do
+
+ case $ax_pthread_try_flag in
+ none)
+ AC_MSG_CHECKING([whether pthreads work without any flags])
+ ;;
+
+ *,*)
+ PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"`
+ PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"`
+ AC_MSG_CHECKING([whether pthreads work with "$PTHREAD_CFLAGS" and "$PTHREAD_LIBS"])
+ ;;
+
+ -*)
+ AC_MSG_CHECKING([whether pthreads work with $ax_pthread_try_flag])
+ PTHREAD_CFLAGS="$ax_pthread_try_flag"
+ ;;
+
+ pthread-config)
+ AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no])
+ AS_IF([test "x$ax_pthread_config" = "xno"], [continue])
+ PTHREAD_CFLAGS="`pthread-config --cflags`"
+ PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
+ ;;
+
+ *)
+ AC_MSG_CHECKING([for the pthreads library -l$ax_pthread_try_flag])
+ PTHREAD_LIBS="-l$ax_pthread_try_flag"
+ ;;
+ esac
+
+ ax_pthread_save_CFLAGS="$CFLAGS"
+ ax_pthread_save_LIBS="$LIBS"
+ CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+ LIBS="$PTHREAD_LIBS $LIBS"
+
+ # Check for various functions. We must include pthread.h,
+ # since some functions may be macros. (On the Sequent, we
+ # need a special flag -Kthread to make this header compile.)
+ # We check for pthread_join because it is in -lpthread on IRIX
+ # while pthread_create is in libc. We check for pthread_attr_init
+ # due to DEC craziness with -lpthreads. We check for
+ # pthread_cleanup_push because it is one of the few pthread
+ # functions on Solaris that doesn't have a non-functional libc stub.
+ # We try pthread_create on general principles.
+
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>
+# if $ax_pthread_check_cond
+# error "$ax_pthread_check_macro must be defined"
+# endif
+ static void *some_global = NULL;
+ static void routine(void *a)
+ {
+ /* To avoid any unused-parameter or
+ unused-but-set-parameter warning. */
+ some_global = a;
+ }
+ static void *start_routine(void *a) { return a; }],
+ [pthread_t th; pthread_attr_t attr;
+ pthread_create(&th, 0, start_routine, 0);
+ pthread_join(th, 0);
+ pthread_attr_init(&attr);
+ pthread_cleanup_push(routine, 0);
+ pthread_cleanup_pop(0) /* ; */])],
+ [ax_pthread_ok=yes],
+ [])
+
+ CFLAGS="$ax_pthread_save_CFLAGS"
+ LIBS="$ax_pthread_save_LIBS"
+
+ AC_MSG_RESULT([$ax_pthread_ok])
+ AS_IF([test "x$ax_pthread_ok" = "xyes"], [break])
+
+ PTHREAD_LIBS=""
+ PTHREAD_CFLAGS=""
+done
+fi
+
+
+# Clang needs special handling, because older versions handle the -pthread
+# option in a rather... idiosyncratic way
+
+if test "x$ax_pthread_clang" = "xyes"; then
+
+ # Clang takes -pthread; it has never supported any other flag
+
+ # (Note 1: This will need to be revisited if a system that Clang
+ # supports has POSIX threads in a separate library. This tends not
+ # to be the way of modern systems, but it's conceivable.)
+
+ # (Note 2: On some systems, notably Darwin, -pthread is not needed
+ # to get POSIX threads support; the API is always present and
+ # active. We could reasonably leave PTHREAD_CFLAGS empty. But
+ # -pthread does define _REENTRANT, and while the Darwin headers
+ # ignore this macro, third-party headers might not.)
+
+ # However, older versions of Clang make a point of warning the user
+ # that, in an invocation where only linking and no compilation is
+ # taking place, the -pthread option has no effect ("argument unused
+ # during compilation"). They expect -pthread to be passed in only
+ # when source code is being compiled.
+ #
+ # Problem is, this is at odds with the way Automake and most other
+ # C build frameworks function, which is that the same flags used in
+ # compilation (CFLAGS) are also used in linking. Many systems
+ # supported by AX_PTHREAD require exactly this for POSIX threads
+ # support, and in fact it is often not straightforward to specify a
+ # flag that is used only in the compilation phase and not in
+ # linking. Such a scenario is extremely rare in practice.
+ #
+ # Even though use of the -pthread flag in linking would only print
+ # a warning, this can be a nuisance for well-run software projects
+ # that build with -Werror. So if the active version of Clang has
+ # this misfeature, we search for an option to squash it.
+
+ AC_CACHE_CHECK([whether Clang needs flag to prevent "argument unused" warning when linking with -pthread],
+ [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG],
+ [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown
+ # Create an alternate version of $ac_link that compiles and
+ # links in two steps (.c -> .o, .o -> exe) instead of one
+ # (.c -> exe), because the warning occurs only in the second
+ # step
+ ax_pthread_save_ac_link="$ac_link"
+ ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g'
+ ax_pthread_link_step=`AS_ECHO(["$ac_link"]) | sed "$ax_pthread_sed"`
+ ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)"
+ ax_pthread_save_CFLAGS="$CFLAGS"
+ for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do
+ AS_IF([test "x$ax_pthread_try" = "xunknown"], [break])
+ CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS"
+ ac_link="$ax_pthread_save_ac_link"
+ AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])],
+ [ac_link="$ax_pthread_2step_ac_link"
+ AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])],
+ [break])
+ ])
+ done
+ ac_link="$ax_pthread_save_ac_link"
+ CFLAGS="$ax_pthread_save_CFLAGS"
+ AS_IF([test "x$ax_pthread_try" = "x"], [ax_pthread_try=no])
+ ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try"
+ ])
+
+ case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in
+ no | unknown) ;;
+ *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;;
+ esac
+
+fi # $ax_pthread_clang = yes
+
+
+
+# Various other checks:
+if test "x$ax_pthread_ok" = "xyes"; then
+ ax_pthread_save_CFLAGS="$CFLAGS"
+ ax_pthread_save_LIBS="$LIBS"
+ CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+ LIBS="$PTHREAD_LIBS $LIBS"
+
+ # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
+ AC_CACHE_CHECK([for joinable pthread attribute],
+ [ax_cv_PTHREAD_JOINABLE_ATTR],
+ [ax_cv_PTHREAD_JOINABLE_ATTR=unknown
+ for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>],
+ [int attr = $ax_pthread_attr; return attr /* ; */])],
+ [ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break],
+ [])
+ done
+ ])
+ AS_IF([test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \
+ test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \
+ test "x$ax_pthread_joinable_attr_defined" != "xyes"],
+ [AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE],
+ [$ax_cv_PTHREAD_JOINABLE_ATTR],
+ [Define to necessary symbol if this constant
+ uses a non-standard name on your system.])
+ ax_pthread_joinable_attr_defined=yes
+ ])
+
+ AC_CACHE_CHECK([whether more special flags are required for pthreads],
+ [ax_cv_PTHREAD_SPECIAL_FLAGS],
+ [ax_cv_PTHREAD_SPECIAL_FLAGS=no
+ case $target_os in
+ solaris*)
+ ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS"
+ ;;
+ esac
+ ])
+ AS_IF([test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \
+ test "x$ax_pthread_special_flags_added" != "xyes"],
+ [PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS"
+ ax_pthread_special_flags_added=yes])
+
+ AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT],
+ [ax_cv_PTHREAD_PRIO_INHERIT],
+ [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <pthread.h>]],
+ [[int i = PTHREAD_PRIO_INHERIT;
+ return i;]])],
+ [ax_cv_PTHREAD_PRIO_INHERIT=yes],
+ [ax_cv_PTHREAD_PRIO_INHERIT=no])
+ ])
+ AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \
+ test "x$ax_pthread_prio_inherit_defined" != "xyes"],
+ [AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.])
+ ax_pthread_prio_inherit_defined=yes
+ ])
+
+ CFLAGS="$ax_pthread_save_CFLAGS"
+ LIBS="$ax_pthread_save_LIBS"
+
+ # More AIX lossage: compile with *_r variant
+ if test "x$GCC" != "xyes"; then
+ case $target_os in
+ aix*)
+ AS_CASE(["x/$CC"],
+ [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6],
+ [#handle absolute path differently from PATH based program lookup
+ AS_CASE(["x$CC"],
+ [x/*],
+ [
+ AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])
+ AS_IF([test "x${CXX}" != "x"], [AS_IF([AS_EXECUTABLE_P([${CXX}_r])],[PTHREAD_CXX="${CXX}_r"])])
+ ],
+ [
+ AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])
+ AS_IF([test "x${CXX}" != "x"], [AC_CHECK_PROGS([PTHREAD_CXX],[${CXX}_r],[$CXX])])
+ ]
+ )
+ ])
+ ;;
+ esac
+ fi
+fi
+
+test -n "$PTHREAD_CC" || PTHREAD_CC="$CC"
+test -n "$PTHREAD_CXX" || PTHREAD_CXX="$CXX"
+
+AC_SUBST([PTHREAD_LIBS])
+AC_SUBST([PTHREAD_CFLAGS])
+AC_SUBST([PTHREAD_CC])
+AC_SUBST([PTHREAD_CXX])
+
+# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
+if test "x$ax_pthread_ok" = "xyes"; then
+ ifelse([$1],,[AC_DEFINE([HAVE_PTHREAD],[1],[Define if you have POSIX threads libraries and header files.])],[$1])
+ :
+else
+ ax_pthread_ok=no
+ $2
+fi
+AC_LANG_POP
+])dnl AX_PTHREAD
diff --git a/m4/ax_valgrind_check.m4 b/m4/ax_valgrind_check.m4
new file mode 100644
index 00000000..ac62fff3
--- /dev/null
+++ b/m4/ax_valgrind_check.m4
@@ -0,0 +1,235 @@
+# ===========================================================================
+# https://www.gnu.org/software/autoconf-archive/ax_valgrind_check.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+# AX_VALGRIND_DFLT(memcheck|helgrind|drd|sgcheck, on|off)
+# AX_VALGRIND_CHECK()
+#
+# DESCRIPTION
+#
+# AX_VALGRIND_CHECK checks whether Valgrind is present and, if so, allows
+# running `make check` under a variety of Valgrind tools to check for
+# memory and threading errors.
+#
+# Defines VALGRIND_CHECK_RULES which should be substituted in your
+# Makefile; and $enable_valgrind which can be used in subsequent configure
+# output. VALGRIND_ENABLED is defined and substituted, and corresponds to
+# the value of the --enable-valgrind option, which defaults to being
+# enabled if Valgrind is installed and disabled otherwise. Individual
+# Valgrind tools can be disabled via --disable-valgrind-<tool>, the
+# default is configurable via the AX_VALGRIND_DFLT command or is to use
+# all commands not disabled via AX_VALGRIND_DFLT. All AX_VALGRIND_DFLT
+# calls must be made before the call to AX_VALGRIND_CHECK.
+#
+# If unit tests are written using a shell script and automake's
+# LOG_COMPILER system, the $(VALGRIND) variable can be used within the
+# shell scripts to enable Valgrind, as described here:
+#
+# https://www.gnu.org/software/gnulib/manual/html_node/Running-self_002dtests-under-valgrind.html
+#
+# Usage example:
+#
+# configure.ac:
+#
+# AX_VALGRIND_DFLT([sgcheck], [off])
+# AX_VALGRIND_CHECK
+#
+# Makefile.am:
+#
+# @VALGRIND_CHECK_RULES@
+# VALGRIND_SUPPRESSIONS_FILES = my-project.supp
+# EXTRA_DIST = my-project.supp
+#
+# This results in a "check-valgrind" rule being added to any Makefile.am
+# which includes "@VALGRIND_CHECK_RULES@" (assuming the module has been
+# configured with --enable-valgrind). Running `make check-valgrind` in
+# that directory will run the module's test suite (`make check`) once for
+# each of the available Valgrind tools (out of memcheck, helgrind and drd)
+# while the sgcheck will be skipped unless enabled again on the
+# commandline with --enable-valgrind-sgcheck. The results for each check
+# will be output to test-suite-$toolname.log. The target will succeed if
+# there are zero errors and fail otherwise.
+#
+# Alternatively, a "check-valgrind-$TOOL" rule will be added, for $TOOL in
+# memcheck, helgrind, drd and sgcheck. These are useful because often only
+# some of those tools can be ran cleanly on a codebase.
+#
+# The macro supports running with and without libtool.
+#
+# LICENSE
+#
+# Copyright (c) 2014, 2015, 2016 Philip Withnall <philip.withnall@collabora.co.uk>
+#
+# Copying and distribution of this file, with or without modification, are
+# permitted in any medium without royalty provided the copyright notice
+# and this notice are preserved. This file is offered as-is, without any
+# warranty.
+
+#serial 15
+
+dnl Configured tools
+m4_define([valgrind_tool_list], [[memcheck], [helgrind], [drd], [sgcheck]])
+m4_set_add_all([valgrind_exp_tool_set], [sgcheck])
+m4_foreach([vgtool], [valgrind_tool_list],
+ [m4_define([en_dflt_valgrind_]vgtool, [on])])
+
+AC_DEFUN([AX_VALGRIND_DFLT],[
+ m4_define([en_dflt_valgrind_$1], [$2])
+])dnl
+
+AC_DEFUN([AX_VALGRIND_CHECK],[
+ dnl Check for --enable-valgrind
+ AC_ARG_ENABLE([valgrind],
+ [AS_HELP_STRING([--enable-valgrind], [Whether to enable Valgrind on the unit tests])],
+ [enable_valgrind=$enableval],[enable_valgrind=])
+
+ AS_IF([test "$enable_valgrind" != "no"],[
+ # Check for Valgrind.
+ AC_CHECK_PROG([VALGRIND],[valgrind],[valgrind])
+ AS_IF([test "$VALGRIND" = ""],[
+ AS_IF([test "$enable_valgrind" = "yes"],[
+ AC_MSG_ERROR([Could not find valgrind; either install it or reconfigure with --disable-valgrind])
+ ],[
+ enable_valgrind=no
+ ])
+ ],[
+ enable_valgrind=yes
+ ])
+ ])
+
+ AM_CONDITIONAL([VALGRIND_ENABLED],[test "$enable_valgrind" = "yes"])
+ AC_SUBST([VALGRIND_ENABLED],[$enable_valgrind])
+
+ # Check for Valgrind tools we care about.
+ [valgrind_enabled_tools=]
+ m4_foreach([vgtool],[valgrind_tool_list],[
+ AC_ARG_ENABLE([valgrind-]vgtool,
+ m4_if(m4_defn([en_dflt_valgrind_]vgtool),[off],dnl
+[AS_HELP_STRING([--enable-valgrind-]vgtool, [Whether to use ]vgtool[ during the Valgrind tests])],dnl
+[AS_HELP_STRING([--disable-valgrind-]vgtool, [Whether to skip ]vgtool[ during the Valgrind tests])]),
+ [enable_valgrind_]vgtool[=$enableval],
+ [enable_valgrind_]vgtool[=])
+ AS_IF([test "$enable_valgrind" = "no"],[
+ enable_valgrind_]vgtool[=no],
+ [test "$enable_valgrind_]vgtool[" ]dnl
+m4_if(m4_defn([en_dflt_valgrind_]vgtool), [off], [= "yes"], [!= "no"]),[
+ AC_CACHE_CHECK([for Valgrind tool ]vgtool,
+ [ax_cv_valgrind_tool_]vgtool,[
+ ax_cv_valgrind_tool_]vgtool[=no
+ m4_set_contains([valgrind_exp_tool_set],vgtool,
+ [m4_define([vgtoolx],[exp-]vgtool)],
+ [m4_define([vgtoolx],vgtool)])
+ AS_IF([`$VALGRIND --tool=]vgtoolx[ --help >/dev/null 2>&1`],[
+ ax_cv_valgrind_tool_]vgtool[=yes
+ ])
+ ])
+ AS_IF([test "$ax_cv_valgrind_tool_]vgtool[" = "no"],[
+ AS_IF([test "$enable_valgrind_]vgtool[" = "yes"],[
+ AC_MSG_ERROR([Valgrind does not support ]vgtool[; reconfigure with --disable-valgrind-]vgtool)
+ ],[
+ enable_valgrind_]vgtool[=no
+ ])
+ ],[
+ enable_valgrind_]vgtool[=yes
+ ])
+ ])
+ AS_IF([test "$enable_valgrind_]vgtool[" = "yes"],[
+ valgrind_enabled_tools="$valgrind_enabled_tools ]m4_bpatsubst(vgtool,[^exp-])["
+ ])
+ AC_SUBST([ENABLE_VALGRIND_]vgtool,[$enable_valgrind_]vgtool)
+ ])
+ AC_SUBST([valgrind_tools],["]m4_join([ ], valgrind_tool_list)["])
+ AC_SUBST([valgrind_enabled_tools],[$valgrind_enabled_tools])
+
+[VALGRIND_CHECK_RULES='
+# Valgrind check
+#
+# Optional:
+# - VALGRIND_SUPPRESSIONS_FILES: Space-separated list of Valgrind suppressions
+# files to load. (Default: empty)
+# - VALGRIND_FLAGS: General flags to pass to all Valgrind tools.
+# (Default: --num-callers=30)
+# - VALGRIND_$toolname_FLAGS: Flags to pass to Valgrind $toolname (one of:
+# memcheck, helgrind, drd, sgcheck). (Default: various)
+
+# Optional variables
+VALGRIND_SUPPRESSIONS ?= $(addprefix --suppressions=,$(VALGRIND_SUPPRESSIONS_FILES))
+VALGRIND_FLAGS ?= --num-callers=30
+VALGRIND_memcheck_FLAGS ?= --leak-check=full --show-reachable=no
+VALGRIND_helgrind_FLAGS ?= --history-level=approx
+VALGRIND_drd_FLAGS ?=
+VALGRIND_sgcheck_FLAGS ?=
+
+# Internal use
+valgrind_log_files = $(addprefix test-suite-,$(addsuffix .log,$(valgrind_tools)))
+
+valgrind_memcheck_flags = --tool=memcheck $(VALGRIND_memcheck_FLAGS)
+valgrind_helgrind_flags = --tool=helgrind $(VALGRIND_helgrind_FLAGS)
+valgrind_drd_flags = --tool=drd $(VALGRIND_drd_FLAGS)
+valgrind_sgcheck_flags = --tool=exp-sgcheck $(VALGRIND_sgcheck_FLAGS)
+
+valgrind_quiet = $(valgrind_quiet_$(V))
+valgrind_quiet_ = $(valgrind_quiet_$(AM_DEFAULT_VERBOSITY))
+valgrind_quiet_0 = --quiet
+valgrind_v_use = $(valgrind_v_use_$(V))
+valgrind_v_use_ = $(valgrind_v_use_$(AM_DEFAULT_VERBOSITY))
+valgrind_v_use_0 = @echo " USE " $(patsubst check-valgrind-%,%,$''@):;
+
+# Support running with and without libtool.
+ifneq ($(LIBTOOL),)
+valgrind_lt = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=execute
+else
+valgrind_lt =
+endif
+
+# Use recursive makes in order to ignore errors during check
+check-valgrind:
+ifeq ($(VALGRIND_ENABLED),yes)
+ $(A''M_V_at)$(MAKE) $(AM_MAKEFLAGS) -k \
+ $(foreach tool, $(valgrind_enabled_tools), check-valgrind-$(tool))
+else
+ @echo "Need to reconfigure with --enable-valgrind"
+endif
+
+# Valgrind running
+VALGRIND_TESTS_ENVIRONMENT = \
+ $(TESTS_ENVIRONMENT) \
+ env VALGRIND=$(VALGRIND) \
+ G_SLICE=always-malloc,debug-blocks \
+ G_DEBUG=$${G_DEBUG:+$$G_DEBUG,}gc-friendly
+
+VALGRIND_LOG_COMPILER = \
+ $(valgrind_lt) \
+ $(VALGRIND) $(VALGRIND_SUPPRESSIONS) --error-exitcode=1 $(VALGRIND_FLAGS)
+
+define valgrind_tool_rule =
+check-valgrind-$(1):
+ifeq ($$(VALGRIND_ENABLED)-$$(ENABLE_VALGRIND_$(1)),yes-yes)
+ $$(valgrind_v_use)$$(MAKE) check-TESTS \
+ TESTS_ENVIRONMENT="$$(VALGRIND_TESTS_ENVIRONMENT)" \
+ LOG_COMPILER="$$(VALGRIND_LOG_COMPILER)" \
+ LOG_FLAGS="$$(valgrind_$(1)_flags)" \
+ TEST_SUITE_LOG=test-suite-$(1).log
+else ifeq ($$(VALGRIND_ENABLED),yes)
+ @echo "Need to reconfigure with --enable-valgrind-$(1)"
+else
+ @echo "Need to reconfigure with --enable-valgrind"
+endif
+endef
+
+$(foreach tool,$(valgrind_tools),$(eval $(call valgrind_tool_rule,$(tool))))
+
+A''M_DISTCHECK_CONFIGURE_FLAGS ?=
+A''M_DISTCHECK_CONFIGURE_FLAGS += --disable-valgrind
+
+MOSTLYCLEANFILES ?=
+MOSTLYCLEANFILES += $(valgrind_log_files)
+
+.PHONY: check-valgrind $(add-prefix check-valgrind-,$(valgrind_tools))
+']
+
+ AC_SUBST([VALGRIND_CHECK_RULES])
+ m4_ifdef([_AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE([VALGRIND_CHECK_RULES])])
+])
diff --git a/m4/manywarnings.m4 b/m4/manywarnings.m4
index 3e6dd215..38641001 100644
--- a/m4/manywarnings.m4
+++ b/m4/manywarnings.m4
@@ -1,5 +1,5 @@
-# manywarnings.m4 serial 7
-dnl Copyright (C) 2008-2014 Free Software Foundation, Inc.
+# manywarnings.m4 serial 8
+dnl Copyright (C) 2008-2016 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved.
@@ -62,10 +62,11 @@ AC_DEFUN([gl_MANYWARN_ALL_GCC],
CFLAGS="$CFLAGS -W -Werror"
AC_COMPILE_IFELSE(
[AC_LANG_PROGRAM(
- [[void f (void)
+ [[int f (void)
{
typedef struct { int a; int b; } s_t;
s_t s1 = { 0, };
+ return s1.b;
}
]],
[[]])],
@@ -103,14 +104,15 @@ AC_DEFUN([gl_MANYWARN_ALL_GCC],
gl_manywarn_set=
for gl_manywarn_item in \
+ -fno-common \
-W \
-Wabi \
-Waddress \
-Waggressive-loop-optimizations \
-Wall \
- -Warray-bounds \
-Wattributes \
-Wbad-function-cast \
+ -Wbool-compare \
-Wbuiltin-macro-redefined \
-Wcast-align \
-Wchar-subscripts \
@@ -122,9 +124,13 @@ AC_DEFUN([gl_MANYWARN_ALL_GCC],
-Wdate-time \
-Wdeprecated \
-Wdeprecated-declarations \
+ -Wdesignated-init \
-Wdisabled-optimization \
+ -Wdiscarded-array-qualifiers \
+ -Wdiscarded-qualifiers \
-Wdiv-by-zero \
-Wdouble-promotion \
+ -Wduplicated-cond \
-Wempty-body \
-Wendif-labels \
-Wenum-compare \
@@ -133,22 +139,31 @@ AC_DEFUN([gl_MANYWARN_ALL_GCC],
-Wformat-extra-args \
-Wformat-nonliteral \
-Wformat-security \
+ -Wformat-signedness \
-Wformat-y2k \
-Wformat-zero-length \
+ -Wframe-address \
-Wfree-nonheap-object \
+ -Whsa \
+ -Wignored-attributes \
-Wignored-qualifiers \
-Wimplicit \
-Wimplicit-function-declaration \
-Wimplicit-int \
+ -Wincompatible-pointer-types \
-Winit-self \
-Winline \
+ -Wint-conversion \
-Wint-to-pointer-cast \
-Winvalid-memory-model \
-Winvalid-pch \
-Wjump-misses-init \
+ -Wlogical-not-parentheses \
-Wlogical-op \
-Wmain \
-Wmaybe-uninitialized \
+ -Wmemset-transposed-args \
+ -Wmisleading-indentation \
-Wmissing-braces \
-Wmissing-declarations \
-Wmissing-field-initializers \
@@ -159,6 +174,9 @@ AC_DEFUN([gl_MANYWARN_ALL_GCC],
-Wnarrowing \
-Wnested-externs \
-Wnonnull \
+ -Wnonnull-compare \
+ -Wnull-dereference \
+ -Wodr \
-Wold-style-declaration \
-Wold-style-definition \
-Wopenmp-simd \
@@ -174,8 +192,13 @@ AC_DEFUN([gl_MANYWARN_ALL_GCC],
-Wpragmas \
-Wreturn-local-addr \
-Wreturn-type \
+ -Wscalar-storage-order \
-Wsequence-point \
-Wshadow \
+ -Wshift-count-negative \
+ -Wshift-count-overflow \
+ -Wshift-negative-value \
+ -Wsizeof-array-argument \
-Wsizeof-pointer-memaccess \
-Wstack-protector \
-Wstrict-aliasing \
@@ -185,10 +208,14 @@ AC_DEFUN([gl_MANYWARN_ALL_GCC],
-Wsuggest-attribute=format \
-Wsuggest-attribute=noreturn \
-Wsuggest-attribute=pure \
+ -Wsuggest-final-methods \
+ -Wsuggest-final-types \
-Wswitch \
+ -Wswitch-bool \
-Wswitch-default \
-Wsync-nand \
-Wsystem-headers \
+ -Wtautological-compare \
-Wtrampolines \
-Wtrigraphs \
-Wtype-limits \
@@ -217,9 +244,12 @@ AC_DEFUN([gl_MANYWARN_ALL_GCC],
gl_manywarn_set="$gl_manywarn_set $gl_manywarn_item"
done
- # gcc --help=warnings outputs an unusual form for this option; list
- # it here so that the above 'comm' command doesn't report a false match.
+ # gcc --help=warnings outputs an unusual form for these options; list
+ # them here so that the above 'comm' command doesn't report a false match.
+ gl_manywarn_set="$gl_manywarn_set -Warray-bounds=2"
gl_manywarn_set="$gl_manywarn_set -Wnormalized=nfc"
+ gl_manywarn_set="$gl_manywarn_set -Wshift-overflow=2"
+ gl_manywarn_set="$gl_manywarn_set -Wunused-const-variable=2"
# These are needed for older GCC versions.
if test -n "$GCC"; then
diff --git a/m4/spice-compile-warnings.m4 b/m4/spice-compile-warnings.m4
index 31f2a9c3..abe4a912 100644
--- a/m4/spice-compile-warnings.m4
+++ b/m4/spice-compile-warnings.m4
@@ -10,12 +10,7 @@ AC_DEFUN([SPICE_COMPILE_WARNINGS],[
AC_ARG_ENABLE([werror],
AS_HELP_STRING([--enable-werror], [Use -Werror (if supported)]),
[set_werror="$enableval"],
- [if test -d $srcdir/.git; then
- is_git_version=true
- set_werror=yes
- else
- set_werror=no
- fi])
+ [set_werror=no])
# List of warnings that are not relevant / wanted
@@ -23,6 +18,9 @@ AC_DEFUN([SPICE_COMPILE_WARNINGS],[
dontwarn="$dontwarn -Wc++-compat"
dontwarn="$dontwarn -Wabi"
dontwarn="$dontwarn -Wdeprecated"
+ # For older gcc versions, -Wenum-compare is "C++ and Objective-C++ only"
+ # For newer gcc versions, -Wenum-compare is "enabled by -Wall"
+ dontwarn="$dontwarn -Wenum-compare"
# Don't care about ancient C standard compat
dontwarn="$dontwarn -Wtraditional"
# Don't care about ancient C standard compat
@@ -48,9 +46,6 @@ AC_DEFUN([SPICE_COMPILE_WARNINGS],[
dontwarn="$dontwarn -Wformat-nonliteral"
dontwarn="$dontwarn -Wfloat-equal"
dontwarn="$dontwarn -Wdeclaration-after-statement"
- dontwarn="$dontwarn -Wcast-qual"
- dontwarn="$dontwarn -Wconversion"
- dontwarn="$dontwarn -Wsign-conversion"
dontwarn="$dontwarn -Wpacked"
dontwarn="$dontwarn -Wunused-macros"
dontwarn="$dontwarn -Woverlength-strings"
@@ -58,23 +53,37 @@ AC_DEFUN([SPICE_COMPILE_WARNINGS],[
dontwarn="$dontwarn -Winline"
dontwarn="$dontwarn -Wbad-function-cast"
dontwarn="$dontwarn -Wshadow"
+ dontwarn="$dontwarn -Wformat-signedness"
+ dontwarn="$dontwarn -Wnull-dereference"
+
+ # This causes an error to be detected in glib headers
+ dontwarn="$dontwarn -Wshift-overflow=2"
- # We want to enable thse, but need to sort out the
+ # We want to enable these, but need to sort out the
# decl mess with gtk/generated_*.c
- dontwarn="$dontwarn -Wmissing-prototypes"
dontwarn="$dontwarn -Wmissing-declarations"
# Stuff that C++ won't allow. Turn them back on later
- dontwarn="$dontwarn -Waggregate-return"
- dontwarn="$dontwarn -Wstrict-prototypes"
- dontwarn="$dontwarn -Wold-style-definition"
+ dontwarn="$dontwarn -Wdesignated-init"
+ dontwarn="$dontwarn -Wdiscarded-array-qualifiers"
+ dontwarn="$dontwarn -Wdiscarded-qualifiers"
+ dontwarn="$dontwarn -Wimplicit"
+ dontwarn="$dontwarn -Wimplicit-function-declaration"
+ dontwarn="$dontwarn -Wimplicit-int"
+ dontwarn="$dontwarn -Wincompatible-pointer-types"
+ dontwarn="$dontwarn -Wint-conversion"
+ dontwarn="$dontwarn -Wjump-misses-init"
+ dontwarn="$dontwarn -Wmissing-parameter-type"
+ dontwarn="$dontwarn -Wmissing-prototypes"
dontwarn="$dontwarn -Wnested-externs"
- dontwarn="$dontwarn -Wformat-zero-length"
+ dontwarn="$dontwarn -Wold-style-declaration"
+ dontwarn="$dontwarn -Wold-style-definition"
+ dontwarn="$dontwarn -Woverride-init"
+ dontwarn="$dontwarn -Wpointer-sign"
dontwarn="$dontwarn -Wpointer-to-int-cast"
- dontwarn="$dontwarn -Wjump-misses-init"
-
- # Issues in x11/platform_utils.cpp prevent us turning this on
- dontwarn="$dontwarn -Wmissing-format-attribute"
+ dontwarn="$dontwarn -Wstrict-prototypes"
+ dontwarn="$dontwarn -Wsuggest-final-methods"
+ dontwarn="$dontwarn -Wsuggest-final-types"
# Get all possible GCC warnings
gl_MANYWARN_ALL_GCC([maybewarn])
@@ -96,15 +105,6 @@ AC_DEFUN([SPICE_COMPILE_WARNINGS],[
# We can't enable this due to horrible spice_usb_device_get_description
# signature
gl_WARN_ADD([-Wno-format-nonliteral])
- # CEGui headers cause violation of this
- gl_WARN_ADD([-Wno-ignored-qualifiers])
-
-
-
-
- # GNULIB turns on -Wformat=2 which implies -Wformat-nonliteral,
- # so we need to manually re-exclude it.
- gl_WARN_ADD([-Wno-format-nonliteral])
# This should be < 1024 really. pixman_utils is the blackspot
# preventing lower usage
@@ -148,21 +148,29 @@ AC_DEFUN([SPICE_COMPILE_WARNINGS],[
then
gl_WARN_ADD([-Werror])
fi
- WARN_CXXFLAGS=$WARN_CFLAGS
- AC_SUBST([WARN_CXXFLAGS])
- # These are C-only warnings
- if test "x$enable_tunnel" != "xyes"; then
- # Slirp causes pain :-(
- gl_WARN_ADD([-Waggregate-return])
- fi
- gl_WARN_ADD([-Wstrict-prototypes])
- gl_WARN_ADD([-Wold-style-definition])
- gl_WARN_ADD([-Wnested-externs])
- gl_WARN_ADD([-Wformat-zero-length])
- gl_WARN_ADD([-Wpointer-to-int-cast])
- gl_WARN_ADD([-Wjump-misses-init])
+ save_CFLAGS="$WARN_CFLAGS"
+
+ # -Wno-suggest-final-methods and -Wno-suggest-final-types to avoid warnings for optimization
+ gl_WARN_ADD([-Wno-suggest-final-methods])
+ gl_WARN_ADD([-Wno-suggest-final-types])
+
+ # -Wno-array-bounds to avoid checks for array with 0 size
+ gl_WARN_ADD([-Wno-array-bounds])
+ gl_WARN_ADD([-Wno-stringop-overflow])
+
+ # -Wno-narrowing to allow cast from -1 to unsigned (used in some initialization)
+ gl_WARN_ADD([-Wno-narrowing])
+
+ gl_WARN_ADD([-Wno-missing-field-initializers])
+
+ # -Wshadow detects shadowing of arguments, globals and C++ attributes
+ gl_WARN_ADD([-Wshadow])
+
+ WARN_CXXFLAGS="$WARN_CFLAGS"
+ AC_SUBST([WARN_CXXFLAGS])
+ WARN_CFLAGS="$save_CFLAGS"
WARN_LDFLAGS=$WARN_CFLAGS
AC_SUBST([WARN_CFLAGS])
AC_SUBST([WARN_LDFLAGS])
diff --git a/maint.mk b/maint.mk
index fa2fe742..c32f8b6d 100644
--- a/maint.mk
+++ b/maint.mk
@@ -2,7 +2,7 @@
# This Makefile fragment tries to be general-purpose enough to be
# used by many projects via the gnulib maintainer-makefile module.
-## Copyright (C) 2001-2011 Free Software Foundation, Inc.
+## Copyright (C) 2001-2016 Free Software Foundation, Inc.
##
## This program is free software: you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
@@ -21,12 +21,27 @@
# ME := $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
ME := maint.mk
-# Diagnostic for continued use of deprecated variable.
-# Remove in 2013
-ifneq ($(build_aux),)
- $(error "$(ME): \
-set $$(_build-aux) relative to $$(srcdir) instead of $$(build_aux)")
-endif
+# Helper variables.
+_empty =
+_sp = $(_empty) $(_empty)
+
+# _equal,S1,S2
+# ------------
+# If S1 == S2, return S1, otherwise the empty string.
+_equal = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
+
+# member-check,VARIABLE,VALID-VALUES
+# ----------------------------------
+# Check that $(VARIABLE) is in the space-separated list of VALID-VALUES, and
+# return it. Die otherwise.
+member-check = \
+ $(strip \
+ $(if $($(1)), \
+ $(if $(findstring $(_sp),$($(1))), \
+ $(error invalid $(1): '$($(1))', expected $(2)), \
+ $(or $(findstring $(_sp)$($(1))$(_sp),$(_sp)$(2)$(_sp)), \
+ $(error invalid $(1): '$($(1))', expected $(2)))), \
+ $(error $(1) undefined)))
# Do not save the original name or timestamp in the .tar.gz file.
# Use --rsyncable if available.
@@ -52,18 +67,18 @@ _dot_escaped_srcdir = $(subst .,\.,$(srcdir))
# Post-process $(VC_LIST) output, prepending $(srcdir)/, but only
# when $(srcdir) is not ".".
ifeq ($(srcdir),.)
-_prepend_srcdir_prefix =
+ _prepend_srcdir_prefix =
else
-_prepend_srcdir_prefix = | sed 's|^|$(srcdir)/|'
+ _prepend_srcdir_prefix = | $(SED) 's|^|$(srcdir)/|'
endif
# In order to be able to consistently filter "."-relative names,
# (i.e., with no $(srcdir) prefix), this definition is careful to
# remove any $(srcdir) prefix, and to restore what it removes.
_sc_excl = \
- $(if $(exclude_file_name_regexp--$@),$(exclude_file_name_regexp--$@),^$$)
+ $(or $(exclude_file_name_regexp--$@),^$$)
VC_LIST_EXCEPT = \
- $(VC_LIST) | sed 's|^$(_dot_escaped_srcdir)/||' \
+ $(VC_LIST) | $(SED) 's|^$(_dot_escaped_srcdir)/||' \
| if test -f $(srcdir)/.x-$@; then grep -vEf $(srcdir)/.x-$@; \
else grep -Ev -e "$${VC_LIST_EXCEPT_DEFAULT-ChangeLog}"; fi \
| grep -Ev -e '($(VC_LIST_ALWAYS_EXCLUDE_REGEX)|$(_sc_excl))' \
@@ -78,32 +93,41 @@ VERSION_REGEXP = $(subst .,\.,$(VERSION))
PREV_VERSION_REGEXP = $(subst .,\.,$(PREV_VERSION))
ifeq ($(VC),$(GIT))
-this-vc-tag = v$(VERSION)
-this-vc-tag-regexp = v$(VERSION_REGEXP)
+ this-vc-tag = v$(VERSION)
+ this-vc-tag-regexp = v$(VERSION_REGEXP)
else
-tag-package = $(shell echo "$(PACKAGE)" | tr '[:lower:]' '[:upper:]')
-tag-this-version = $(subst .,_,$(VERSION))
-this-vc-tag = $(tag-package)-$(tag-this-version)
-this-vc-tag-regexp = $(this-vc-tag)
+ tag-package = $(shell echo "$(PACKAGE)" | tr '[:lower:]' '[:upper:]')
+ tag-this-version = $(subst .,_,$(VERSION))
+ this-vc-tag = $(tag-package)-$(tag-this-version)
+ this-vc-tag-regexp = $(this-vc-tag)
endif
my_distdir = $(PACKAGE)-$(VERSION)
# Old releases are stored here.
release_archive_dir ?= ../release
+# If RELEASE_TYPE is undefined, but RELEASE is, use its second word.
+# But overwrite VERSION.
+ifdef RELEASE
+ VERSION := $(word 1, $(RELEASE))
+ RELEASE_TYPE ?= $(word 2, $(RELEASE))
+endif
+
+# Validate and return $(RELEASE_TYPE), or die.
+RELEASE_TYPES = alpha beta stable
+release-type = $(call member-check,RELEASE_TYPE,$(RELEASE_TYPES))
+
# Override gnu_rel_host and url_dir_list in cfg.mk if these are not right.
# Use alpha.gnu.org for alpha and beta releases.
# Use ftp.gnu.org for stable releases.
gnu_ftp_host-alpha = alpha.gnu.org
gnu_ftp_host-beta = alpha.gnu.org
gnu_ftp_host-stable = ftp.gnu.org
-gnu_rel_host ?= $(gnu_ftp_host-$(RELEASE_TYPE))
+gnu_rel_host ?= $(gnu_ftp_host-$(release-type))
-ifeq ($(gnu_rel_host),ftp.gnu.org)
-url_dir_list ?= http://ftpmirror.gnu.org/$(PACKAGE)
-else
-url_dir_list ?= ftp://$(gnu_rel_host)/gnu/$(PACKAGE)
-endif
+url_dir_list ?= $(if $(call _equal,$(gnu_rel_host),ftp.gnu.org), \
+ http://ftpmirror.gnu.org/$(PACKAGE), \
+ ftp://$(gnu_rel_host)/gnu/$(PACKAGE))
# Override this in cfg.mk if you are using a different format in your
# NEWS file.
@@ -124,17 +148,18 @@ export LC_ALL = C
## Sanity checks. ##
## --------------- ##
-_cfg_mk := $(shell test -f $(srcdir)/cfg.mk && echo '$(srcdir)/cfg.mk')
+ifneq ($(_gl-Makefile),)
+_cfg_mk := $(wildcard $(srcdir)/cfg.mk)
-# Collect the names of rules starting with `sc_'.
-syntax-check-rules := $(sort $(shell sed -n 's/^\(sc_[a-zA-Z0-9_-]*\):.*/\1/p' \
- $(srcdir)/$(ME) $(_cfg_mk)))
+# Collect the names of rules starting with 'sc_'.
+syntax-check-rules := $(sort $(shell $(SED) -n \
+ 's/^\(sc_[a-zA-Z0-9_-]*\):.*/\1/p' $(srcdir)/$(ME) $(_cfg_mk)))
.PHONY: $(syntax-check-rules)
ifeq ($(shell $(VC_LIST) >/dev/null 2>&1; echo $$?),0)
-local-checks-available += $(syntax-check-rules)
+ local-checks-available += $(syntax-check-rules)
else
-local-checks-available += no-vc-detected
+ local-checks-available += no-vc-detected
no-vc-detected:
@echo "No version control files detected; skipping syntax check"
endif
@@ -165,6 +190,7 @@ local-check := \
$(filter-out $(local-checks-to-skip), $(local-checks-available)))
syntax-check: $(local-check)
+endif
# _sc_search_regexp
#
@@ -178,11 +204,20 @@ syntax-check: $(local-check)
# Regular expression (ERE) denoting either a forbidden construct
# or a required construct. Those arguments are exclusive.
#
+# exclude
+#
+# Regular expression (ERE) denoting lines to ignore that matched
+# a prohibit construct. For example, this can be used to exclude
+# comments that mention why the nearby code uses an alternative
+# construct instead of the simpler prohibited construct.
+#
# in_vc_files | in_files
#
-# grep-E-style regexp denoting the files to check. If no files
-# are specified the default are all the files that are under
-# version control.
+# grep-E-style regexp selecting the files to check. For in_vc_files,
+# the regexp is used to select matching files from the list of all
+# version-controlled files; for in_files, it's from the names printed
+# by "find $(srcdir)". When neither is specified, use all files that
+# are under version control.
#
# containing | non_containing
#
@@ -212,6 +247,17 @@ syntax-check: $(local-check)
# when filtering by name via in_files, we explicitly filter out matching
# names here as well.
+# Initialize each, so that envvar settings cannot interfere.
+export require =
+export prohibit =
+export exclude =
+export in_vc_files =
+export in_files =
+export containing =
+export non_containing =
+export halt =
+export with_grep_options =
+
# By default, _sc_search_regexp does not ignore case.
export ignore_case =
_ignore_case = $$(test -n "$$ignore_case" && printf %s -i || :)
@@ -221,15 +267,6 @@ define _sc_say_and_exit
{ printf '%s\n' "$(ME): $$msg" 1>&2; exit 1; };
endef
-# _sc_search_regexp used to be named _prohibit_regexp. However,
-# upgrading to the new definition and leaving the old name undefined
-# would usually convert each custom rule using $(_prohibit_regexp)
-# (usually defined in cfg.mk) into a no-op. This definition ensures
-# that people know right away if they're still using the old name.
-# FIXME: remove in 2012.
-_prohibit_regexp = \
- $(error '*** you need to s/_prohibit_regexp/_sc_search_regexp/, and adapt')
-
define _sc_search_regexp
dummy=; : so we do not need a semicolon before each use; \
\
@@ -240,6 +277,9 @@ define _sc_search_regexp
test -z "$$prohibit" && test -z "$$require" \
&& { msg='Should specify either prohibit or require' \
$(_sc_say_and_exit) } || :; \
+ test -z "$$prohibit" && test -n "$$exclude" \
+ && { msg='Use of exclude requires a prohibit pattern' \
+ $(_sc_say_and_exit) } || :; \
test -n "$$in_vc_files" && test -n "$$in_files" \
&& { msg='Cannot specify both in_vc_files and in_files' \
$(_sc_say_and_exit) } || :; \
@@ -249,7 +289,7 @@ define _sc_search_regexp
: Filter by file name; \
if test -n "$$in_files"; then \
files=$$(find $(srcdir) | grep -E "$$in_files" \
- | grep -Ev '$(exclude_file_name_regexp--$@)'); \
+ | grep -Ev '$(_sc_excl)'); \
else \
files=$$($(VC_LIST_EXCEPT)); \
if test -n "$$in_vc_files"; then \
@@ -267,6 +307,7 @@ define _sc_search_regexp
if test -n "$$files"; then \
if test -n "$$prohibit"; then \
grep $$with_grep_options $(_ignore_case) -nE "$$prohibit" $$files \
+ | grep -vE "$${exclude:-^$$}" \
&& { msg="$$halt" $(_sc_say_and_exit) } || :; \
else \
grep $$with_grep_options $(_ignore_case) -LE "$$require" $$files \
@@ -285,17 +326,17 @@ sc_avoid_if_before_free:
exit 1; } || :
sc_cast_of_argument_to_free:
- @prohibit='\<free *\( *\(' halt='don'\''t cast free argument' \
+ @prohibit='\<free *\( *\(' halt="don't cast free argument" \
$(_sc_search_regexp)
sc_cast_of_x_alloc_return_value:
@prohibit='\*\) *x(m|c|re)alloc\>' \
- halt='don'\''t cast x*alloc return value' \
+ halt="don't cast x*alloc return value" \
$(_sc_search_regexp)
sc_cast_of_alloca_return_value:
@prohibit='\*\) *alloca\>' \
- halt='don'\''t cast alloca return value' \
+ halt="don't cast alloca return value" \
$(_sc_search_regexp)
sc_space_tab:
@@ -303,7 +344,7 @@ sc_space_tab:
halt='found SPACE-TAB sequence; remove the SPACE' \
$(_sc_search_regexp)
-# Don't use *scanf or the old ato* functions in `real' code.
+# Don't use *scanf or the old ato* functions in "real" code.
# They provide no error checking mechanism.
# Instead, use strto* functions.
sc_prohibit_atoi_atof:
@@ -312,12 +353,20 @@ sc_prohibit_atoi_atof:
$(_sc_search_regexp)
# Use STREQ rather than comparing strcmp == 0, or != 0.
+sp_ = strcmp *\(.+\)
sc_prohibit_strcmp:
- @grep -nE '! *str''cmp *\(|\<str''cmp *\(.+\) *[!=]=' \
- $$($(VC_LIST_EXCEPT)) \
- | grep -vE ':# *define STRN?EQ\(' && \
- { echo '$(ME): replace str''cmp calls above with STREQ/STRNEQ' \
- 1>&2; exit 1; } || :
+ @prohibit='! *strcmp *\(|\<$(sp_) *[!=]=|[!=]= *$(sp_)' \
+ exclude='# *define STRN?EQ\(' \
+ halt='replace strcmp calls above with STREQ/STRNEQ' \
+ $(_sc_search_regexp)
+
+# Really. You don't want to use this function.
+# It may fail to NUL-terminate the destination,
+# and always NUL-pads out to the specified length.
+sc_prohibit_strncpy:
+ @prohibit='\<strncpy *\(' \
+ halt='do not use strncpy, period' \
+ $(_sc_search_regexp)
# Pass EXIT_*, not number, to usage, exit, and error (when exiting)
# Convert all uses automatically, via these two commands:
@@ -330,20 +379,21 @@ sc_prohibit_strcmp:
# | xargs --no-run-if-empty \
# perl -pi -e 's/(^|[^.])\b(exit ?)\(0\)/$1$2(EXIT_SUCCESS)/'
sc_prohibit_magic_number_exit:
- @prohibit='(^|[^.])\<(usage|exit) ?\([0-9]|\<error ?\([1-9][0-9]*,' \
- halt='use EXIT_* values rather than magic number' \
+ @prohibit='(^|[^.])\<(usage|exit|error) ?\(-?[0-9]+[,)]' \
+ exclude='exit \(77\)|error ?\(((0|77),|[^,]*)' \
+ halt='use EXIT_* values rather than magic number' \
$(_sc_search_regexp)
# Using EXIT_SUCCESS as the first argument to error is misleading,
-# since when that parameter is 0, error does not exit. Use `0' instead.
+# since when that parameter is 0, error does not exit. Use '0' instead.
sc_error_exit_success:
@prohibit='error *\(EXIT_SUCCESS,' \
in_vc_files='\.[chly]$$' \
halt='found error (EXIT_SUCCESS' \
$(_sc_search_regexp)
-# `FATAL:' should be fully upper-cased in error messages
-# `WARNING:' should be fully upper-cased, or fully lower-cased
+# "FATAL:" should be fully upper-cased in error messages
+# "WARNING:" should be fully upper-cased, or fully lower-cased
sc_error_message_warn_fatal:
@grep -nEA2 '[^rp]error *\(' $$($(VC_LIST_EXCEPT)) \
| grep -E '"Warning|"Fatal|"fatal' && \
@@ -387,17 +437,26 @@ sc_require_config_h:
halt='the above files do not include <config.h>' \
$(_sc_search_regexp)
+# Print each file name for which the first #include does not match
+# $(config_h_header). Like grep -m 1, this only looks at the first match.
+perl_config_h_first_ = \
+ -e 'BEGIN {$$ret = 0}' \
+ -e 'if (/^\# *include\b/) {' \
+ -e ' if (not m{^\# *include $(config_h_header)}) {' \
+ -e ' print "$$ARGV\n";' \
+ -e ' $$ret = 1;' \
+ -e ' }' \
+ -e ' \# Move on to next file after first include' \
+ -e ' close ARGV;' \
+ -e '}' \
+ -e 'END {exit $$ret}'
+
# You must include <config.h> before including any other header file.
# This can possibly be via a package-specific header, if given by cfg.mk.
sc_require_config_h_first:
- @if $(VC_LIST_EXCEPT) | grep -l '\.c$$' > /dev/null; then \
- fail=0; \
- for i in $$($(VC_LIST_EXCEPT) | grep '\.c$$'); do \
- grep '^# *include\>' $$i | sed 1q \
- | grep -E '^# *include $(config_h_header)' > /dev/null \
- || { echo $$i; fail=1; }; \
- done; \
- test $$fail = 1 && \
+ @if $(VC_LIST_EXCEPT) | grep '\.c$$' > /dev/null; then \
+ files=$$($(VC_LIST_EXCEPT) | grep '\.c$$') && \
+ perl -n $(perl_config_h_first_) $$files || \
{ echo '$(ME): the above files include some other header' \
'before <config.h>' 1>&2; exit 1; } || :; \
else :; \
@@ -413,8 +472,8 @@ sc_prohibit_HAVE_MBRTOWC:
# re: a regular expression that matches IFF something provided by $h is used.
define _sc_header_without_use
dummy=; : so we do not need a semicolon before each use; \
- h_esc=`echo '[<"]'"$$h"'[">]'|sed 's/\./\\\\./g'`; \
- if $(VC_LIST_EXCEPT) | grep -l '\.c$$' > /dev/null; then \
+ h_esc=`echo '[<"]'"$$h"'[">]'|$(SED) 's/\./\\\\./g'`; \
+ if $(VC_LIST_EXCEPT) | grep '\.c$$' > /dev/null; then \
files=$$(grep -l '^# *include '"$$h_esc" \
$$($(VC_LIST_EXCEPT) | grep '\.c$$')) && \
grep -LE "$$re" $$files | grep . && \
@@ -442,7 +501,8 @@ sc_prohibit_quotearg_without_use:
# Don't include quote.h unless you use one of its functions.
sc_prohibit_quote_without_use:
- @h='quote.h' re='\<quote(_n)? *\(' $(_sc_header_without_use)
+ @h='quote.h' re='\<quote((_n)? *\(|_quoting_options\>)' \
+ $(_sc_header_without_use)
# Don't include this header unless you use one of its functions.
sc_prohibit_long_options_without_use:
@@ -511,7 +571,7 @@ sc_prohibit_same_without_use:
sc_prohibit_hash_pjw_without_use:
@h='hash-pjw.h' \
- re='\<hash_pjw *\(' \
+ re='\<hash_pjw\>' \
$(_sc_header_without_use)
sc_prohibit_safe_read_without_use:
@@ -525,7 +585,7 @@ sc_prohibit_argmatch_without_use:
sc_prohibit_canonicalize_without_use:
@h='canonicalize.h' \
- re='CAN_(EXISTING|ALL_BUT_LAST|MISSING)|canonicalize_(mode_t|filename_mode)' \
+ re='CAN_(EXISTING|ALL_BUT_LAST|MISSING)|canonicalize_(mode_t|filename_mode|file_name)' \
$(_sc_header_without_use)
sc_prohibit_root_dev_ino_without_use:
@@ -535,7 +595,7 @@ sc_prohibit_root_dev_ino_without_use:
sc_prohibit_openat_without_use:
@h='openat.h' \
- re='\<(openat_(permissive|needs_fchdir|(save|restore)_fail)|l?(stat|ch(own|mod))at|(euid)?accessat)\>' \
+ re='\<(openat_(permissive|needs_fchdir|(save|restore)_fail)|l?(stat|ch(own|mod))at|(euid)?accessat|(FCHMOD|FCHOWN|STAT)AT_INLINE)\>' \
$(_sc_header_without_use)
# Prohibit the inclusion of c-ctype.h without an actual use.
@@ -545,8 +605,6 @@ sc_prohibit_c_ctype_without_use:
@h='c-ctype.h' re='\<c_($(ctype_re)) *\(' \
$(_sc_header_without_use)
-_empty =
-_sp = $(_empty) $(_empty)
# The following list was generated by running:
# man signal.h|col -b|perl -ne '/bsd_signal.*;/.../sigwaitinfo.*;/ and print' \
# | perl -lne '/^\s+(?:int|void).*?(\w+).*/ and print $1' | fmt
@@ -602,8 +660,7 @@ sc_prohibit_strings_without_use:
# Get the list of symbol names with this:
# perl -lne '/^# *define ([A-Z]\w+)\(/ and print $1' lib/intprops.h|fmt
_intprops_names = \
- TYPE_IS_INTEGER TYPE_TWOS_COMPLEMENT TYPE_ONES_COMPLEMENT \
- TYPE_SIGNED_MAGNITUDE TYPE_SIGNED TYPE_MINIMUM TYPE_MAXIMUM \
+ TYPE_IS_INTEGER TYPE_SIGNED TYPE_MINIMUM TYPE_MAXIMUM \
INT_BITS_STRLEN_BOUND INT_STRLEN_BOUND INT_BUFSIZE_BOUND \
INT_ADD_RANGE_OVERFLOW INT_SUBTRACT_RANGE_OVERFLOW \
INT_NEGATE_RANGE_OVERFLOW INT_MULTIPLY_RANGE_OVERFLOW \
@@ -660,15 +717,6 @@ sc_changelog:
$(_sc_search_regexp)
# Ensure that each .c file containing a "main" function also
-# calls set_program_name.
-sc_program_name:
- @require='set_program_name *\(m?argv\[0\]\);' \
- in_vc_files='\.c$$' \
- containing='\<main *(' \
- halt='the above files do not call set_program_name' \
- $(_sc_search_regexp)
-
-# Ensure that each .c file containing a "main" function also
# calls bindtextdomain.
sc_bindtextdomain:
@require='bindtextdomain *\(' \
@@ -696,11 +744,10 @@ sc_require_test_exit_idiom:
exit 1; } || :; \
fi
-exclude_file_name_regexp--sc_trailing_blank = \.ico$$|\.bmp$$|\.odt$$
-
sc_trailing_blank:
@prohibit='[ ]$$' \
halt='found trailing blank(s)' \
+ exclude='^Binary file .* matches$$' \
$(_sc_search_regexp)
# Match lines like the following, but where there is only one space
@@ -719,12 +766,10 @@ _gl_translatable_diag_func_re ?= error
# Look for diagnostics that aren't marked for translation.
# This won't find any for which error's format string is on a separate line.
sc_unmarked_diagnostics:
- @grep -nE \
- '\<$(_gl_translatable_diag_func_re) *\([^"]*"[^"]*[a-z]{3}' \
- $$($(VC_LIST_EXCEPT)) \
- | grep -Ev '(_|ngettext ?)\(' && \
- { echo '$(ME): found unmarked diagnostic(s)' 1>&2; \
- exit 1; } || :
+ @prohibit='\<$(_gl_translatable_diag_func_re) *\([^"]*"[^"]*[a-z]{3}' \
+ exclude='(_|ngettext ?)\(' \
+ halt='found unmarked diagnostic(s)' \
+ $(_sc_search_regexp)
# Avoid useless parentheses like those in this example:
# #if defined (SYMBOL) || defined (SYM2)
@@ -738,7 +783,7 @@ sc_useless_cpp_parens:
# #if HAVE_HEADER_H that you remove, be sure that your project explicitly
# requires the gnulib module that guarantees the usability of that header.
gl_assured_headers_ = \
- cd $(gnulib_dir)/lib && echo *.in.h|sed 's/\.in\.h//g'
+ cd $(gnulib_dir)/lib && echo *.in.h|$(SED) 's/\.in\.h//g'
# Convert the list of names to upper case, and replace each space with "|".
az_ = abcdefghijklmnopqrstuvwxyz
@@ -757,6 +802,11 @@ sc_prohibit_always_true_header_tests:
' with the corresponding gnulib module, they are always true') \
$(_sc_search_regexp)
+sc_prohibit_defined_have_decl_tests:
+ @prohibit='(#[ ]*ifn?def|\<defined)\>[ (]+HAVE_DECL_' \
+ halt='HAVE_DECL macros are always defined' \
+ $(_sc_search_regexp)
+
# ==================================================================
gl_other_headers_ ?= \
intprops.h \
@@ -784,7 +834,7 @@ define def_sym_regex
&& perl -lne '$(gl_extract_significant_defines_)' $$f; \
done; \
) | sort -u \
- | sed 's/^/^ *# *(define|undef) */;s/$$/\\>/'
+ | $(SED) 's/^/^ *# *(define|undef) */;s/$$/\\>/'
endef
# Don't define macros that we already get from gnulib header files.
@@ -849,7 +899,7 @@ sc_prohibit_cvs_keyword:
#
# This is a perl script that is expected to be the single-quoted argument
# to a command-line "-le". The remaining arguments are file names.
-# Print the name of each file that ends in exactly one newline byte.
+# Print the name of each file that does not end in exactly one newline byte.
# I.e., warn if there are blank lines (2 or more newlines), or if the
# last byte is not a newline. However, currently we don't complain
# about any file that contains exactly one byte.
@@ -903,8 +953,13 @@ perl_filename_lineno_text_ = \
-e ' print "$$ARGV:$$n:$$v\n";' \
-e ' }'
+prohibit_doubled_words_ = \
+ the then in an on if is it but for or at and do to
+# expand the regex before running the check to avoid using expensive captures
+prohibit_doubled_word_expanded_ = \
+ $(join $(prohibit_doubled_words_),$(addprefix \s+,$(prohibit_doubled_words_)))
prohibit_doubled_word_RE_ ?= \
- /\b(then?|[iao]n|i[fst]|but|f?or|at|and|[dt]o)\s+\1\b/gims
+ /\b(?:$(subst $(_sp),|,$(prohibit_doubled_word_expanded_)))\b/gims
prohibit_doubled_word_ = \
-e 'while ($(prohibit_doubled_word_RE_))' \
$(perl_filename_lineno_text_)
@@ -922,8 +977,15 @@ sc_prohibit_doubled_word:
# A regular expression matching undesirable combinations of words like
# "can not"; this matches them even when the two words appear on different
# lines, but not when there is an intervening delimiter like "#" or "*".
+# Similarly undesirable, "See @xref{...}", since an @xref should start
+# a sentence. Explicitly prohibit any prefix of "see" or "also".
+# Also prohibit a prefix matching "\w+ +".
+# @pxref gets the same see/also treatment and should be parenthesized;
+# presume it must *not* start a sentence.
+bad_xref_re_ ?= (?:[\w,:;] +|(?:see|also)\s+)\@xref\{
+bad_pxref_re_ ?= (?:[.!?]|(?:see|also))\s+\@pxref\{
prohibit_undesirable_word_seq_RE_ ?= \
- /\bcan\s+not\b/gims
+ /(?:\bcan\s+not\b|$(bad_xref_re_)|$(bad_pxref_re_))/gims
prohibit_undesirable_word_seq_ = \
-e 'while ($(prohibit_undesirable_word_seq_RE_))' \
$(perl_filename_lineno_text_)
@@ -938,6 +1000,14 @@ sc_prohibit_undesirable_word_seq:
| grep -vE '$(ignore_undesirable_word_sequence_RE_)' | grep . \
&& { echo '$(ME): undesirable word sequence' >&2; exit 1; } || :
+# Except for shell files and for loops, double semicolon is probably a mistake
+sc_prohibit_double_semicolon:
+ @prohibit='; *;[ {} \]*(/[/*]|$$)' \
+ in_vc_files='\.[chly]$$' \
+ exclude='\bfor *\(.*\)' \
+ halt="Double semicolon detected" \
+ $(_sc_search_regexp)
+
_ptm1 = use "test C1 && test C2", not "test C1 -''a C2"
_ptm2 = use "test C1 || test C2", not "test C1 -''o C2"
# Using test's -a and -o operators is not portable.
@@ -985,18 +1055,18 @@ sc_redundant_const:
$(_sc_search_regexp)
sc_const_long_option:
- @grep '^ *static.*struct option ' $$($(VC_LIST_EXCEPT)) \
- | grep -Ev 'const struct option|struct option const' && { \
- echo 1>&2 '$(ME): add "const" to the above declarations'; \
- exit 1; } || :
+ @prohibit='^ *static.*struct option ' \
+ exclude='const struct option|struct option const' \
+ halt='add "const" to the above declarations' \
+ $(_sc_search_regexp)
NEWS_hash = \
- $$(sed -n '/^\*.* $(PREV_VERSION_REGEXP) ([0-9-]*)/,$$p' \
+ $$($(SED) -n '/^\*.* $(PREV_VERSION_REGEXP) ([0-9-]*)/,$$p' \
$(srcdir)/NEWS \
| perl -0777 -pe \
's/^Copyright.+?Free\sSoftware\sFoundation,\sInc\.\n//ms' \
| md5sum - \
- | sed 's/ .*//')
+ | $(SED) 's/ .*//')
# Ensure that we don't accidentally insert an entry into an old NEWS block.
sc_immutable_NEWS:
@@ -1026,15 +1096,15 @@ update-NEWS-hash: NEWS
# setting this to ' && !/PRAGMA_SYSTEM_HEADER/'.
_makefile_at_at_check_exceptions ?=
sc_makefile_at_at_check:
- @perl -ne '/\@[A-Z_0-9]+\@/' \
- -e ' && !/([A-Z_0-9]+)\s+=.*\@\1\@$$/' \
+ @perl -ne '/\@\w+\@/' \
+ -e ' && !/(\w+)\s+=.*\@\1\@$$/' \
-e ''$(_makefile_at_at_check_exceptions) \
-e 'and (print "$$ARGV:$$.: $$_"), $$m=1; END {exit !$$m}' \
$$($(VC_LIST_EXCEPT) | grep -E '(^|/)(Makefile\.am|[^/]+\.mk)$$') \
&& { echo '$(ME): use $$(...), not @...@' 1>&2; exit 1; } || :
news-check: NEWS
- if sed -n $(news-check-lines-spec)p $(srcdir)/NEWS \
+ $(AM_V_GEN)if $(SED) -n $(news-check-lines-spec)p $< \
| grep -E $(news-check-regexp) >/dev/null; then \
:; \
else \
@@ -1058,30 +1128,34 @@ fix_po_file_diag = \
'you have changed the set of files with translatable diagnostics;\n\
apply the above patch\n'
-# Verify that all source files using _() are listed in po/POTFILES.in.
+# Generate a list of files in which to search for translatable strings.
+perl_translatable_files_list_ = \
+ -e 'foreach $$file (@ARGV) {' \
+ -e ' \# Consider only file extensions with one or two letters' \
+ -e ' $$file =~ /\...?$$/ or next;' \
+ -e ' \# Ignore m4 and mk files' \
+ -e ' $$file =~ /\.m[4k]$$/ and next;' \
+ -e ' \# Ignore a .c or .h file with a corresponding .l or .y file' \
+ -e ' $$file =~ /(.+)\.[ch]$$/ && (-e "$${1}.l" || -e "$${1}.y")' \
+ -e ' and next;' \
+ -e ' \# Skip unreadable files' \
+ -e ' -r $$file or next;' \
+ -e ' print "$$file ";' \
+ -e '}'
+
+# Verify that all source files using _() (more specifically, files that
+# match $(_gl_translatable_string_re)) are listed in po/POTFILES.in.
po_file ?= $(srcdir)/po/POTFILES.in
generated_files ?= $(srcdir)/lib/*.[ch]
+_gl_translatable_string_re ?= \b(N?_|gettext *)\([^)"]*("|$$)
sc_po_check:
@if test -f $(po_file); then \
grep -E -v '^(#|$$)' $(po_file) \
| grep -v '^src/false\.c$$' | sort > $@-1; \
- files=; \
- for file in $$($(VC_LIST_EXCEPT)) $(generated_files); do \
- test -r $$file || continue; \
- case $$file in \
- *.m4|*.mk) continue ;; \
- *.?|*.??) ;; \
- *) continue;; \
- esac; \
- case $$file in \
- *.[ch]) \
- base=`expr " $$file" : ' \(.*\)\..'`; \
- { test -f $$base.l || test -f $$base.y; } && continue;; \
- esac; \
- files="$$files $$file"; \
- done; \
- grep -E -l '\b(N?_|gettext *)\([^)"]*("|$$)' $$files \
- | sed 's|^$(_dot_escaped_srcdir)/||' | sort -u > $@-2; \
+ files=$$(perl $(perl_translatable_files_list_) \
+ $$($(VC_LIST_EXCEPT)) $(generated_files)); \
+ grep -E -l '$(_gl_translatable_string_re)' $$files \
+ | $(SED) 's|^$(_dot_escaped_srcdir)/||' | sort -u > $@-2; \
diff -u -L $(po_file) -L $(po_file) $@-1 $@-2 \
|| { printf '$(ME): '$(fix_po_file_diag) 1>&2; exit 1; }; \
rm -f $@-1 $@-2; \
@@ -1089,19 +1163,19 @@ sc_po_check:
# Sometimes it is useful to change the PATH environment variable
# in Makefiles. When doing so, it's better not to use the Unix-centric
-# path separator of `:', but rather the automake-provided `$(PATH_SEPARATOR)'.
-msg = '$(ME): Do not use `:'\'' above; use $$(PATH_SEPARATOR) instead'
+# path separator of ':', but rather the automake-provided '$(PATH_SEPARATOR)'.
+msg = 'Do not use ":" above; use $$(PATH_SEPARATOR) instead'
sc_makefile_path_separator_check:
@prohibit='PATH[=].*:' \
in_vc_files='akefile|\.mk$$' \
halt=$(msg) \
$(_sc_search_regexp)
-# Check that `make alpha' will not fail at the end of the process,
+# Check that 'make alpha' will not fail at the end of the process,
# i.e., when pkg-M.N.tar.xz already exists (either in "." or in ../release)
# and is read-only.
writable-files:
- if test -d $(release_archive_dir); then \
+ $(AM_V_GEN)if test -d $(release_archive_dir); then \
for file in $(DIST_ARCHIVES); do \
for p in ./ $(release_archive_dir)/; do \
test -e $$p$$file || continue; \
@@ -1127,7 +1201,7 @@ sc_copyright_check:
in_vc_files=$(sample-test) \
halt='out of date copyright in $(sample-test); update it' \
$(_sc_search_regexp)
- @require='Copyright @copyright\{\} .*'$$(date +%Y)' Free' \
+ @require='Copyright @copyright\{\} .*'$$(date +%Y) \
in_vc_files=$(texi) \
halt='out of date copyright in $(texi); update it' \
$(_sc_search_regexp)
@@ -1159,6 +1233,16 @@ sc_cross_check_PATH_usage_in_tests:
1>&2; exit 1; } || :; \
fi
+# BRE regex of file contents to identify a test script.
+_test_script_regex ?= \<init\.sh\>
+
+# In tests, use "compare expected actual", not the reverse.
+sc_prohibit_reversed_compare_failure:
+ @prohibit='\<compare [^ ]+ ([^ ]*exp|/dev/null)' \
+ containing='$(_test_script_regex)' \
+ halt='reversed compare arguments' \
+ $(_sc_search_regexp)
+
# #if HAVE_... will evaluate to false for any non numeric string.
# That would be flagged by using -Wundef, however gnulib currently
# tests many undefined macros, and so we can't enable that option.
@@ -1173,22 +1257,31 @@ sc_Wundef_boolean:
# not be constant, or might overflow a stack. In general, use PATH_MAX as
# a limit, not an array or alloca size.
sc_prohibit_path_max_allocation:
- @prohibit='(\balloca *\([^)]*|\[[^]]*)PATH_MAX' \
+ @prohibit='(\balloca *\([^)]*|\[[^]]*)\bPATH_MAX' \
halt='Avoid stack allocations of size PATH_MAX' \
$(_sc_search_regexp)
sc_vulnerable_makefile_CVE-2009-4029:
@prohibit='perm -777 -exec chmod a\+rwx|chmod 777 \$$\(distdir\)' \
- in_files=$$(find $(srcdir) -name Makefile.in) \
+ in_files='(^|/)Makefile\.in$$' \
halt=$$(printf '%s\n' \
'the above files are vulnerable; beware of running' \
' "make dist*" rules, and upgrade to fixed automake' \
' see http://bugzilla.redhat.com/542609 for details') \
$(_sc_search_regexp)
+sc_vulnerable_makefile_CVE-2012-3386:
+ @prohibit='chmod a\+w \$$\(distdir\)' \
+ in_files='(^|/)Makefile\.in$$' \
+ halt=$$(printf '%s\n' \
+ 'the above files are vulnerable; beware of running' \
+ ' "make distcheck", and upgrade to fixed automake' \
+ ' see http://bugzilla.redhat.com/CVE-2012-3386 for details') \
+ $(_sc_search_regexp)
+
vc-diff-check:
- (unset CDPATH; cd $(srcdir) && $(VC) diff) > vc-diffs || :
- if test -s vc-diffs; then \
+ $(AM_V_GEN)(unset CDPATH; cd $(srcdir) && $(VC) diff) > vc-diffs || :
+ $(AM_V_at)if test -s vc-diffs; then \
cat vc-diffs; \
echo "Some files are locally modified:" 1>&2; \
exit 1; \
@@ -1199,46 +1292,62 @@ vc-diff-check:
rel-files = $(DIST_ARCHIVES)
gnulib_dir ?= $(srcdir)/gnulib
-gnulib-version = $$(cd $(gnulib_dir) && git describe)
+gnulib-version = $$(cd $(gnulib_dir) \
+ && { git describe || git rev-parse --short=10 HEAD; } )
bootstrap-tools ?= autoconf,automake,gnulib
+gpgv = $$(gpgv2 --version >/dev/null && echo gpgv2 || echo gpgv)
# If it's not already specified, derive the GPG key ID from
# the signed tag we've just applied to mark this release.
-gpg_key_ID ?= \
- $$(git cat-file tag v$(VERSION) > .ann-sig \
- && gpgv .ann-sig - < /dev/null 2>&1 \
- | sed -n '/.*key ID \([0-9A-F]*\)/s//\1/p'; rm -f .ann-sig)
+gpg_key_ID ?= \
+ $$(cd $(srcdir) \
+ && git cat-file tag v$(VERSION) \
+ | $(gpgv) --status-fd 1 --keyring /dev/null - - 2>/dev/null \
+ | awk '/^\[GNUPG:\] ERRSIG / {print $$3; exit}')
translation_project_ ?= coordinator@translationproject.org
# Make info-gnu the default only for a stable release.
-ifeq ($(RELEASE_TYPE),stable)
- announcement_Cc_ ?= $(translation_project_), $(PACKAGE_BUGREPORT)
- announcement_mail_headers_ ?= \
- To: info-gnu@gnu.org \
- Cc: $(announcement_Cc_) \
- Mail-Followup-To: $(PACKAGE_BUGREPORT)
-else
- announcement_Cc_ ?= $(translation_project_)
- announcement_mail_headers_ ?= \
- To: $(PACKAGE_BUGREPORT) \
- Cc: $(announcement_Cc_)
-endif
-
+announcement_Cc_stable = $(translation_project_), $(PACKAGE_BUGREPORT)
+announcement_mail_headers_stable = \
+ To: info-gnu@gnu.org \
+ Cc: $(announcement_Cc_) \
+ Mail-Followup-To: $(PACKAGE_BUGREPORT)
+
+announcement_Cc_alpha = $(translation_project_)
+announcement_mail_headers_alpha = \
+ To: $(PACKAGE_BUGREPORT) \
+ Cc: $(announcement_Cc_)
+
+announcement_mail_Cc_beta = $(announcement_mail_Cc_alpha)
+announcement_mail_headers_beta = $(announcement_mail_headers_alpha)
+
+announcement_mail_Cc_ ?= $(announcement_mail_Cc_$(release-type))
+announcement_mail_headers_ ?= $(announcement_mail_headers_$(release-type))
announcement: NEWS ChangeLog $(rel-files)
- @$(srcdir)/$(_build-aux)/announce-gen \
+# Not $(AM_V_GEN) since the output of this command serves as
+# announcement message: it would start with " GEN announcement".
+ $(AM_V_at)$(srcdir)/$(_build-aux)/announce-gen \
--mail-headers='$(announcement_mail_headers_)' \
- --release-type=$(RELEASE_TYPE) \
+ --release-type=$(release-type) \
--package=$(PACKAGE) \
--prev=$(PREV_VERSION) \
--curr=$(VERSION) \
--gpg-key-id=$(gpg_key_ID) \
+ --srcdir=$(srcdir) \
--news=$(srcdir)/NEWS \
--bootstrap-tools=$(bootstrap-tools) \
- --gnulib-version=$(gnulib-version) \
+ $$(case ,$(bootstrap-tools), in (*,gnulib,*) \
+ echo --gnulib-version=$(gnulib-version);; esac) \
--no-print-checksums \
$(addprefix --url-dir=, $(url_dir_list))
+.PHONY: release-commit
+release-commit:
+ $(AM_V_GEN)cd $(srcdir) \
+ && $(_build-aux)/do-release-commit-and-tag \
+ -C $(abs_builddir) $(RELEASE)
+
## ---------------- ##
## Updating files. ##
## ---------------- ##
@@ -1247,16 +1356,22 @@ ftp-gnu = ftp://ftp.gnu.org/gnu
www-gnu = http://www.gnu.org
upload_dest_dir_ ?= $(PACKAGE)
+upload_command = \
+ $(srcdir)/$(_build-aux)/gnupload $(GNUPLOADFLAGS) \
+ --to $(gnu_rel_host):$(upload_dest_dir_) \
+ $(rel-files)
emit_upload_commands:
@echo =====================================
@echo =====================================
- @echo "$(srcdir)/$(_build-aux)/gnupload $(GNUPLOADFLAGS) \\"
- @echo " --to $(gnu_rel_host):$(upload_dest_dir_) \\"
- @echo " $(rel-files)"
+ @echo '$(upload_command)'
@echo '# send the ~/announce-$(my_distdir) e-mail'
@echo =====================================
@echo =====================================
+.PHONY: upload
+upload:
+ $(AM_V_GEN)$(upload_command)
+
define emit-commit-log
printf '%s\n' 'maint: post-release administrivia' '' \
'* NEWS: Add header line for next release.' \
@@ -1266,7 +1381,8 @@ endef
.PHONY: no-submodule-changes
no-submodule-changes:
- if test -d $(srcdir)/.git; then \
+ $(AM_V_GEN)if test -d $(srcdir)/.git \
+ && git --version >/dev/null 2>&1; then \
diff=$$(cd $(srcdir) && git submodule -q foreach \
git diff-index --name-only HEAD) \
|| exit 1; \
@@ -1284,10 +1400,12 @@ submodule-checks ?= no-submodule-changes public-submodule-commit
# cannot be built from a fresh clone.
.PHONY: public-submodule-commit
public-submodule-commit:
- $(AM_V_GEN)if test -d $(srcdir)/.git; then \
+ $(AM_V_GEN)if test -d $(srcdir)/.git \
+ && git --version >/dev/null 2>&1; then \
cd $(srcdir) && \
- git submodule --quiet foreach test '$$(git rev-parse $$sha1)' \
- = '$$(git merge-base origin $$sha1)' \
+ git submodule --quiet foreach \
+ 'test "$$(git rev-parse "$$sha1")" \
+ = "$$(git merge-base origin "$$sha1")"' \
|| { echo '$(ME): found non-public submodule commit' >&2; \
exit 1; }; \
else \
@@ -1302,19 +1420,23 @@ public-submodule-commit:
gl_public_submodule_commit ?= public-submodule-commit
check: $(gl_public_submodule_commit)
-.PHONY: alpha beta stable
+.PHONY: alpha beta stable release
ALL_RECURSIVE_TARGETS += alpha beta stable
alpha beta stable: $(local-check) writable-files $(submodule-checks)
- test $@ = stable \
+ $(AM_V_GEN)test $@ = stable \
&& { echo $(VERSION) | grep -E '^[0-9]+(\.[0-9]+)+$$' \
|| { echo "invalid version string: $(VERSION)" 1>&2; exit 1;};}\
|| :
- $(MAKE) vc-diff-check
- $(MAKE) news-check
- $(MAKE) distcheck
- $(MAKE) dist XZ_OPT=-9ev
- $(MAKE) $(release-prep-hook) RELEASE_TYPE=$@
- $(MAKE) -s emit_upload_commands RELEASE_TYPE=$@
+ $(AM_V_at)$(MAKE) vc-diff-check
+ $(AM_V_at)$(MAKE) news-check
+ $(AM_V_at)$(MAKE) distcheck
+ $(AM_V_at)$(MAKE) dist
+ $(AM_V_at)$(MAKE) $(release-prep-hook) RELEASE_TYPE=$@
+ $(AM_V_at)$(MAKE) -s emit_upload_commands RELEASE_TYPE=$@
+
+release:
+ $(AM_V_GEN)$(MAKE) _version
+ $(AM_V_GEN)$(MAKE) $(release-type)
# Override this in cfg.mk if you follow different procedures.
release-prep-hook ?= release-prep
@@ -1322,19 +1444,19 @@ release-prep-hook ?= release-prep
gl_noteworthy_news_ = * Noteworthy changes in release ?.? (????-??-??) [?]
.PHONY: release-prep
release-prep:
- case $$RELEASE_TYPE in alpha|beta|stable) ;; \
- *) echo "invalid RELEASE_TYPE: $$RELEASE_TYPE" 1>&2; exit 1;; esac
- $(MAKE) --no-print-directory -s announcement > ~/announce-$(my_distdir)
- if test -d $(release_archive_dir); then \
+ $(AM_V_GEN)$(MAKE) --no-print-directory -s announcement \
+ > ~/announce-$(my_distdir)
+ $(AM_V_at)if test -d $(release_archive_dir); then \
ln $(rel-files) $(release_archive_dir); \
chmod a-w $(rel-files); \
fi
- echo $(VERSION) > $(prev_version_file)
- $(MAKE) update-NEWS-hash
- perl -pi -e '$$. == 3 and print "$(gl_noteworthy_news_)\n\n\n"' NEWS
- $(emit-commit-log) > .ci-msg
- $(VC) commit -F .ci-msg -a
- rm .ci-msg
+ $(AM_V_at)echo $(VERSION) > $(prev_version_file)
+ $(AM_V_at)$(MAKE) update-NEWS-hash
+ $(AM_V_at)perl -pi \
+ -e '$$. == 3 and print "$(gl_noteworthy_news_)\n\n\n"' \
+ $(srcdir)/NEWS
+ $(AM_V_at)msg=$$($(emit-commit-log)) || exit 1; \
+ cd $(srcdir) && $(VC) commit -m "$$msg" -a
# Override this with e.g., -s $(srcdir)/some_other_name.texi
# if the default $(PACKAGE)-derived name doesn't apply.
@@ -1342,14 +1464,20 @@ gendocs_options_ ?=
.PHONY: web-manual
web-manual:
- @test -z "$(manual_title)" \
+ $(AM_V_GEN)test -z "$(manual_title)" \
&& { echo define manual_title in cfg.mk 1>&2; exit 1; } || :
- @cd '$(srcdir)/doc'; \
+ $(AM_V_at)cd '$(srcdir)/doc'; \
$(SHELL) ../$(_build-aux)/gendocs.sh $(gendocs_options_) \
-o '$(abs_builddir)/doc/manual' \
--email $(PACKAGE_BUGREPORT) $(PACKAGE) \
"$(PACKAGE_NAME) - $(manual_title)"
- @echo " *** Upload the doc/manual directory to web-cvs."
+ $(AM_V_at)echo " *** Upload the doc/manual directory to web-cvs."
+
+.PHONY: web-manual-update
+web-manual-update:
+ $(AM_V_GEN)cd $(srcdir) \
+ && $(_build-aux)/gnu-web-doc-update -C $(abs_builddir)
+
# Code Coverage
@@ -1375,6 +1503,31 @@ gen-coverage:
coverage: init-coverage build-coverage gen-coverage
+# Some projects carry local adjustments for gnulib modules via patches in
+# a gnulib patch directory whose default name is gl/ (defined in bootstrap
+# via local_gl_dir=gl). Those patches become stale as the originals evolve
+# in gnulib. Use this rule to refresh any stale patches. It applies each
+# patch to the original in $(gnulib_dir) and uses the temporary result to
+# generate a fuzz-free .diff file. If you customize the name of your local
+# gnulib patch directory via bootstrap.conf, this rule detects that name.
+# Run this from a non-VPATH (i.e., srcdir) build directory.
+.PHONY: refresh-gnulib-patches
+refresh-gnulib-patches:
+ gl=gl; \
+ if test -f bootstrap.conf; then \
+ t=$$(perl -lne '/^\s*local_gl_dir=(\S+)/ and $$d=$$1;' \
+ -e 'END{defined $$d and print $$d}' bootstrap.conf); \
+ test -n "$$t" && gl=$$t; \
+ fi; \
+ for diff in $$(cd $$gl; git ls-files | grep '\.diff$$'); do \
+ b=$$(printf %s "$$diff"|$(SED) 's/\.diff$$//'); \
+ VERSION_CONTROL=none \
+ patch "$(gnulib_dir)/$$b" "$$gl/$$diff" || exit 1; \
+ ( cd $(gnulib_dir) || exit 1; \
+ git diff "$$b" > "../$$gl/$$diff"; \
+ git checkout $$b ) || exit 1; \
+ done
+
# Update gettext files.
PACKAGE ?= $(shell basename $(PWD))
PO_DOMAIN ?= $(PACKAGE)
@@ -1386,7 +1539,8 @@ refresh-po:
wget --no-verbose --directory-prefix $(PODIR) --no-directories --recursive --level 1 --accept .po --accept .po.1 $(POURL) && \
echo 'en@boldquot' > $(PODIR)/LINGUAS && \
echo 'en@quot' >> $(PODIR)/LINGUAS && \
- ls $(PODIR)/*.po | sed 's/\.po//' | sed 's,$(PODIR)/,,' | sort >> $(PODIR)/LINGUAS
+ ls $(PODIR)/*.po | $(SED) 's/\.po//;s,$(PODIR)/,,' | \
+ sort >> $(PODIR)/LINGUAS
# Running indent once is not idempotent, but running it twice is.
INDENT_SOURCES ?= $(C_SOURCES)
@@ -1408,7 +1562,7 @@ update-copyright-env ?=
# in the file .x-update-copyright.
.PHONY: update-copyright
update-copyright:
- grep -l -w Copyright \
+ $(AM_V_GEN)grep -l -w Copyright \
$$(export VC_LIST_EXCEPT_DEFAULT=COPYING && $(VC_LIST_EXCEPT)) \
| $(update-copyright-env) xargs $(srcdir)/$(_build-aux)/$@
@@ -1440,28 +1594,28 @@ sc_tight_scope: tight-scope.mk
tight-scope.mk: $(ME)
@rm -f $@ $@-t
- @perl -ne '/^# TS-start/.../^# TS-end/ and print' $(ME) > $@-t
+ @perl -ne '/^# TS-start/.../^# TS-end/ and print' $(srcdir)/$(ME) > $@-t
@chmod a=r $@-t && mv $@-t $@
ifeq (a,b)
# TS-start
# Most functions should have static scope.
-# Any that don't must be marked with `extern', but `main'
-# and `usage' are exceptions: they're always extern, but
-# do not need to be marked. Symbols matching `__.*' are
+# Any that don't must be marked with 'extern', but 'main'
+# and 'usage' are exceptions: they're always extern, but
+# do not need to be marked. Symbols matching '__.*' are
# reserved by the compiler, so are automatically excluded below.
_gl_TS_unmarked_extern_functions ?= main usage
-_gl_TS_function_match ?= /^(?:$(_gl_TS_extern)) +.*?(\S+) *\(/
+_gl_TS_function_match ?= /^(?:$(_gl_TS_extern)) +.*?(\w+) *\(/
# If your project uses a macro like "XTERN", then put
# the following in cfg.mk to override this default:
# export _gl_TS_extern = extern|XTERN
_gl_TS_extern ?= extern
-# The second nm|grep checks for file-scope variables with `extern' scope.
+# The second nm|grep checks for file-scope variables with 'extern' scope.
# Without gnulib's progname module, you might put program_name here.
-# Symbols matching `__.*' are reserved by the compiler,
+# Symbols matching '__.*' are reserved by the compiler,
# so are automatically excluded below.
_gl_TS_unmarked_extern_vars ?=
@@ -1481,9 +1635,11 @@ _gl_TS_obj_files ?= *.$(OBJEXT)
# Files in which to search for the one-line style extern declarations.
# $(_gl_TS_dir)-relative.
_gl_TS_headers ?= $(noinst_HEADERS)
+_gl_TS_other_headers ?= *.h
.PHONY: _gl_tight_scope
_gl_tight_scope: $(bin_PROGRAMS)
+ sed_wrap='s/^/^_?/;s/$$/$$/'; \
t=exceptions-$$$$; \
trap 's=$$?; rm -f $$t; exit $$s' 0; \
for sig in 1 2 3 13 15; do \
@@ -1493,19 +1649,20 @@ _gl_tight_scope: $(bin_PROGRAMS)
test -f $$f && d= || d=$(srcdir)/; echo $$d$$f; done`; \
hdr=`for f in $(_gl_TS_headers); do \
test -f $$f && d= || d=$(srcdir)/; echo $$d$$f; done`; \
- ( printf '^%s$$\n' '__.*' $(_gl_TS_unmarked_extern_functions); \
+ ( printf '%s\n' '__.*' $(_gl_TS_unmarked_extern_functions); \
grep -h -A1 '^extern .*[^;]$$' $$src \
- | grep -vE '^(extern |--)' | sed 's/ .*//'; \
+ | grep -vE '^(extern |--|#)' | $(SED) 's/ .*//; /^$$/d'; \
perl -lne \
- '$(_gl_TS_function_match) and print "^$$1\$$"' $$hdr; \
- ) | sort -u > $$t; \
- nm -e $(_gl_TS_obj_files) | sed -n 's/.* T //p'|grep -Ev -f $$t \
+ '$(_gl_TS_function_match) and print $$1' $$hdr; \
+ ) | sort -u | $(SED) "$$sed_wrap" > $$t; \
+ nm -g $(_gl_TS_obj_files)|$(SED) -n 's/.* T //p'|grep -Ev -f $$t \
&& { echo the above functions should have static scope >&2; \
exit 1; } || : ; \
- ( printf '^%s$$\n' '__.*' $(_gl_TS_unmarked_extern_vars); \
- perl -lne '$(_gl_TS_var_match) and print "^$$1\$$"' $$hdr *.h \
- ) | sort -u > $$t; \
- nm -e $(_gl_TS_obj_files) | sed -n 's/.* [BCDGRS] //p' \
+ ( printf '%s\n' '__.*' main $(_gl_TS_unmarked_extern_vars); \
+ perl -lne '$(_gl_TS_var_match) and print $$1' \
+ $$hdr $(_gl_TS_other_headers) \
+ ) | sort -u | $(SED) "$$sed_wrap" > $$t; \
+ nm -g $(_gl_TS_obj_files) | $(SED) -n 's/.* [BCDGRS] //p' \
| sort -u | grep -Ev -f $$t \
&& { echo the above variables should have static scope >&2; \
exit 1; } || :
diff --git a/meson.build b/meson.build
new file mode 100644
index 00000000..b1237e61
--- /dev/null
+++ b/meson.build
@@ -0,0 +1,231 @@
+#
+# project definition
+#
+project('spice', 'c', 'cpp',
+ version : run_command('build-aux/git-version-gen', meson.source_root() + '/.tarball-version', check : true).stdout().strip(),
+ license : 'LGPLv2.1',
+ meson_version : '>= 0.49',
+ default_options : ['buildtype=debugoptimized',
+ 'warning_level=2'])
+
+meson.add_dist_script('build-aux/meson-dist', meson.project_version(), meson.source_root())
+
+message('Updating submodules')
+run_command('build-aux/meson/check-spice-common', check : true)
+
+#
+# soversion
+# The versioning is defined by the forumla (CURRENT-AGE.AGE.REVISION)
+#
+# XXX: KEEP IN SYNC WITH configure.ac file
+#
+# Follow the libtool manual for the so version:
+# http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
+# - If the library source code has changed at all since the last update,
+# then increment revision (‘c:r:a’ becomes ‘c:r+1:a’).
+# - If any interfaces have been added, removed, or changed since the last update,
+# increment current, and set revision to 0.
+# - If any interfaces have been added since the last public release,
+# then increment age.
+# - If any interfaces have been removed or changed since the last public release,
+# then set age to 0.
+#
+#
+spice_server_current = 15
+spice_server_revision = 3
+spice_server_age = 14
+spice_server_so_version = '@0@.@1@.@2@'.format(spice_server_current - spice_server_age,
+ spice_server_age,
+ spice_server_revision)
+message('libspice.so version: ' + spice_server_so_version)
+
+# some global vars
+spice_server_global_cflags = ['-DSPICE_SERVER_INTERNAL',
+ '-DG_LOG_DOMAIN="Spice"',
+ '-Wno-sign-compare',
+ '-Wno-unused-parameter']
+
+compiler = meson.get_compiler('c')
+cxx_compiler = meson.get_compiler('cpp')
+spice_server_config_data = configuration_data()
+spice_server_include = [include_directories('.')]
+spice_server_deps = [dependency('threads')]
+spice_server_link_args = []
+spice_server_requires = ''
+spice_protocol_version='0.14.3'
+
+#
+# Spice common subproject
+#
+spice_common = subproject('spice-common',
+ default_options : [
+ 'generate-code=server',
+ 'spice-protocol-version=@0@'.format(spice_protocol_version),
+ ])
+spice_server_config_data.merge_from(spice_common.get_variable('spice_common_config_data'))
+spice_server_deps += spice_common.get_variable('spice_common_server_dep')
+spice_protocol_version = spice_common.get_variable('spice_protocol_version')
+
+#
+# check for system headers
+#
+headers = ['sys/time.h',
+ 'execinfo.h',
+ 'linux/sockios.h',
+ 'pthread_np.h']
+
+foreach header : headers
+ if compiler.has_header(header)
+ spice_server_config_data.set('HAVE_@0@'.format(header.underscorify().to_upper()), '1')
+ endif
+endforeach
+
+# TCP_KEEPIDLE definition in netinet/tcp.h
+if compiler.has_header_symbol('netinet/tcp.h', 'TCP_KEEPIDLE')
+ spice_server_config_data.set('HAVE_TCP_KEEPIDLE', '1')
+endif
+
+#
+# check for mandatory dependencies
+#
+glib_version = '2.38'
+glib_version_info = '>= @0@'.format(glib_version)
+pixman_version = '>= 0.17.7'
+
+deps = {'glib-2.0' : glib_version_info,
+ 'pixman-1' : pixman_version,
+ 'openssl' : '>= 1.0.0'}
+
+foreach dep, version : deps
+ spice_server_deps += dependency(dep, version : version)
+endforeach
+
+# TODO: specify minimum version for jpeg and zlib?
+foreach dep : ['libjpeg', 'zlib']
+ spice_server_deps += dependency(dep)
+endforeach
+
+if host_machine.system() != 'windows'
+ foreach dep : ['rt', 'm']
+ spice_server_deps += compiler.find_library(dep)
+ endforeach
+else
+ foreach dep : ['ws2_32', 'shlwapi']
+ spice_server_deps += compiler.find_library(dep)
+ endforeach
+endif
+
+#
+# Non-mandatory/optional dependencies
+#
+optional_deps = {'opus' : '>= 0.9.14'}
+foreach dep, version : optional_deps
+ d = dependency(dep, required : get_option(dep), version : version)
+ if d.found()
+ spice_server_deps += d
+ spice_server_config_data.set('HAVE_@0@'.format(dep.underscorify().to_upper()), '1')
+ endif
+endforeach
+
+# gstreamer
+spice_server_has_gstreamer = false
+spice_server_gst_version = get_option('gstreamer')
+if spice_server_gst_version != 'no'
+ gst_deps = ['gstreamer', 'gstreamer-base', 'gstreamer-app', 'gstreamer-video']
+ foreach dep : gst_deps
+ dep = '@0@-@1@'.format(dep, spice_server_gst_version)
+ spice_server_deps += dependency(dep)
+ endforeach
+ spice_server_deps += dependency('orc-0.4')
+
+ gst_def = 'HAVE_GSTREAMER_1_0'
+ spice_server_config_data.set(gst_def, '1')
+ spice_server_has_gstreamer = true
+endif
+
+# lz4
+spice_server_has_lz4 = false
+if get_option('lz4')
+ lz4_dep = dependency('liblz4', required : false, version : '>= 129')
+ if not lz4_dep.found()
+ lz4_dep = dependency('liblz4', version : '>= 1.7.3')
+ endif
+
+ if compiler.has_function('LZ4_compress_fast_continue', dependencies : lz4_dep)
+ spice_server_config_data.set('HAVE_LZ4_COMPRESS_FAST_CONTINUE', '1')
+ endif
+
+ spice_server_deps += lz4_dep
+ spice_server_config_data.set('USE_LZ4', '1')
+ spice_server_has_lz4 = true
+endif
+
+# sasl
+spice_server_has_sasl = false
+if get_option('sasl')
+ spice_server_deps += dependency('libsasl2')
+ spice_server_config_data.set('HAVE_SASL', '1')
+ spice_server_has_sasl = true
+endif
+
+# smartcard check
+spice_server_has_smartcard = false
+smartcard_dep = dependency('libcacard', required : get_option('smartcard'), version : '>= 2.5.1')
+if smartcard_dep.found()
+ spice_server_deps += smartcard_dep
+ spice_server_config_data.set('USE_SMARTCARD', '1')
+ spice_server_has_smartcard = true
+ spice_server_requires += 'libcacard >= 2.5.1 '
+endif
+
+#
+# global C defines
+#
+glib_encoded_version = 'GLIB_VERSION_@0@'.format(glib_version.underscorify())
+spice_server_global_cflags += ['-DGLIB_VERSION_MIN_REQUIRED=@0@'.format(glib_encoded_version),
+ '-DGLIB_VERSION_MAX_ALLOWED=@0@'.format(glib_encoded_version)]
+
+add_project_arguments(compiler.get_supported_arguments(spice_server_global_cflags),
+ language : 'c')
+
+spice_server_global_cxxflags = spice_server_global_cflags
+spice_server_global_cxxflags += [
+ '-fno-exceptions',
+ '-Wno-suggest-final-methods',
+ '-Wno-suggest-final-types',
+ '-Wno-array-bounds',
+ '-Wno-stringop-overflow',
+ '-Wno-narrowing',
+ '-Wno-missing-field-initializers',
+ '-Wno-deprecated-declarations',
+ '-Wshadow',
+]
+add_project_arguments(cxx_compiler.get_supported_arguments(spice_server_global_cxxflags),
+ language : 'cpp')
+
+#
+# Subdirectories
+#
+subdir('server')
+subdir('tools')
+subdir('docs')
+
+#
+# write config.h
+#
+spice_server_config_data.set_quoted('VERSION', meson.project_version())
+spice_server_config_data.set('SPICE_USE_SAFER_CONTAINEROF', '1')
+
+if get_option('statistics')
+ spice_server_config_data.set('RED_STATISTICS', '1')
+endif
+
+# Minimal Win32 version
+if host_machine.system() == 'windows'
+ spice_server_config_data.set('_WIN32_WINNT', '0x600')
+endif
+
+configure_file(output : 'config.h',
+ configuration : spice_server_config_data)
+
+run_target('doxy', command : './doxygen.sh')
diff --git a/meson_options.txt b/meson_options.txt
new file mode 100644
index 00000000..c5fe31dc
--- /dev/null
+++ b/meson_options.txt
@@ -0,0 +1,53 @@
+option('gstreamer',
+ type : 'combo',
+ choices : ['1.0', 'no'],
+ description : 'Enable gstreamer support')
+
+option('lz4',
+ type : 'boolean',
+ value : true,
+ description: 'Enable lz4 compression support')
+
+option('sasl',
+ type : 'boolean',
+ value : true,
+ description : 'Use cyrus SASL authentication')
+
+option('opus',
+ type : 'feature',
+ description: 'Enable Opus audio codec')
+
+option('smartcard',
+ type : 'feature',
+ description : 'Enable smartcard support')
+
+option('alignment-checks',
+ type : 'boolean',
+ value : false,
+ description : 'Enable runtime checks for cast alignment')
+
+option('extra-checks',
+ type : 'boolean',
+ value: false,
+ description : 'Enable extra checks on code')
+
+option('statistics',
+ type : 'boolean',
+ value: false,
+ description : 'Build SPICE with statistic code enabled')
+
+option('manual',
+ type : 'boolean',
+ value : true,
+ description : 'Build SPICE manual')
+
+option('instrumentation',
+ type : 'combo',
+ value : 'no',
+ choices : ['recorder', 'agent', 'no'],
+ description: 'Enable instrumentation')
+
+option('tests',
+ type : 'boolean',
+ value : true,
+ description : 'Build the test binaries')
diff --git a/server/.gitignore b/server/.gitignore
index 0a0bfef0..d0d0503a 100644
--- a/server/.gitignore
+++ b/server/.gitignore
@@ -1,11 +1,6 @@
*.la
*.lo
*.loT
-*.o
-.deps
-.libs
-Makefile
-Makefile.in
-generated_demarshallers.c
-generated_marshallers.c
-generated_marshallers.h
+/spice-version.h
+/spice-server-enums.h
+/spice-server-enums.c
diff --git a/server/Makefile.am b/server/Makefile.am
index 34219c80..5260051b 100644
--- a/server/Makefile.am
+++ b/server/Makefile.am
@@ -1,20 +1,39 @@
NULL =
-SUBDIRS = . tests
+SUBDIRS = .
+
+if ENABLE_TESTS
+SUBDIRS += tests
+
+check-valgrind:
+ $(MAKE) -C tests check-valgrind
+endif
AM_CPPFLAGS = \
-DSPICE_SERVER_INTERNAL \
- -DRED_STATISTICS \
- $(COMMON_CFLAGS) \
+ $(SPICE_COMMON_CFLAGS) \
$(GLIB2_CFLAGS) \
+ $(LZ4_CFLAGS) \
$(PIXMAN_CFLAGS) \
$(SASL_CFLAGS) \
- $(SLIRP_CFLAGS) \
$(SMARTCARD_CFLAGS) \
+ $(GSTREAMER_0_10_CFLAGS) \
+ $(GSTREAMER_1_0_CFLAGS) \
$(SSL_CFLAGS) \
$(VISIBILITY_HIDDEN_CFLAGS) \
+ $(ORC_CFLAGS) \
+ $(NULL)
+
+AM_CFLAGS = \
$(WARN_CFLAGS) \
+ $(PTHREAD_CFLAGS) \
$(NULL)
+AM_CXXFLAGS = \
+ $(WARN_CXXFLAGS) \
+ $(PTHREAD_CXXFLAGS) \
+ $(NULL)
+
+noinst_LTLIBRARIES = libserver.la
lib_LTLIBRARIES = libspice-server.la
libspice_server_la_LDFLAGS = \
@@ -26,115 +45,200 @@ libspice_server_la_LDFLAGS = \
if HAVE_LD_VERSION_SCRIPT
libspice_server_la_LDFLAGS += \
- -Wl,--version-script=$(top_srcdir)/server/spice-server.syms
+ -Wl,--version-script=$(srcdir)/spice-server.syms
+EXTRA_libspice_server_la_DEPENDENCIES = $(srcdir)/spice-server.syms
endif
-libspice_server_la_LIBADD = \
- $(top_builddir)/spice-common/common/libspice-common.la \
- $(top_builddir)/spice-common/common/libspice-common-server.la \
- $(GL_LIBS) \
+libserver_la_LIBADD = \
+ $(SPICE_COMMON_DIR)/common/libspice-common.la \
+ $(SPICE_COMMON_DIR)/common/libspice-common-server.la \
$(GLIB2_LIBS) \
$(JPEG_LIBS) \
+ $(LZ4_LIBS) \
$(LIBRT) \
$(PIXMAN_LIBS) \
$(SASL_LIBS) \
- $(SLIRP_LIBS) \
+ $(GSTREAMER_0_10_LIBS) \
+ $(GSTREAMER_1_0_LIBS) \
$(SSL_LIBS) \
$(Z_LIBS) \
$(SPICE_NONPKGCONFIG_LIBS) \
+ $(ORC_LIBS) \
+ $(PTHREAD_LIBS) \
+ $(NULL)
+
+libspice_serverincludedir = $(includedir)/spice-server
+libspice_serverinclude_HEADERS = \
+ spice-audio.h \
+ spice-char.h \
+ spice-core.h \
+ spice-input.h \
+ spice-migration.h \
+ spice-qxl.h \
+ spice-server.h \
+ spice-version.h \
+ spice-replay.h \
+ spice.h \
$(NULL)
-libspice_server_la_SOURCES = \
+spice_built_sources = spice-server-enums.h spice-server-enums.c
+
+libserver_la_SOURCES = \
+ $(libspice_serverinclude_HEADERS) \
+ $(spice_built_sources) \
agent-msg-filter.c \
agent-msg-filter.h \
- char_device.c \
- char_device.h \
- demarshallers.h \
- glz_encoder.c \
- glz_encoder.h \
- glz_encoder_config.h \
- glz_encoder_dictionary.c \
- glz_encoder_dictionary.h \
- glz_encoder_dictionary_protected.h \
- inputs_channel.c \
- inputs_channel.h \
- jpeg_encoder.c \
- jpeg_encoder.h \
- main_channel.c \
- main_channel.h \
- mjpeg_encoder.c \
- mjpeg_encoder.h \
- red_bitmap_utils.h \
- red_channel.c \
- red_channel.h \
- red_client_cache.h \
- red_client_shared_cache.h \
- red_common.h \
- dispatcher.c \
+ cache-item.h \
+ char-device.cpp \
+ char-device.h \
+ common-graphics-channel.cpp \
+ common-graphics-channel.h \
+ cursor-channel.cpp \
+ cursor-channel-client.cpp \
+ cursor-channel-client.h \
+ cursor-channel.h \
+ utils.hpp \
+ safe-list.hpp \
+ dcc.cpp \
+ dcc.h \
+ dcc-private.h \
+ dcc-send.cpp \
+ dispatcher.cpp \
dispatcher.h \
- red_dispatcher.c \
- red_dispatcher.h \
- main_dispatcher.c \
- main_dispatcher.h \
- migration_protocol.h \
- red_memslots.c \
- red_memslots.h \
- red_parse_qxl.c \
- red_parse_qxl.h \
- red_time.h \
- red_worker.c \
- red_worker.h \
- reds.c \
+ display-channel.cpp \
+ display-channel.h \
+ display-channel-private.h \
+ display-limits.h \
+ event-loop.c \
+ glib-compat.h \
+ glz-encoder.c \
+ glz-encoder-dict.c \
+ glz-encoder-dict.h \
+ glz-encoder.h \
+ glz-encoder-priv.h \
+ image-cache.cpp \
+ image-cache.h \
+ image-encoders.cpp \
+ image-encoders.h \
+ inputs-channel.cpp \
+ inputs-channel-client.cpp \
+ inputs-channel-client.h \
+ inputs-channel.h \
+ jpeg-encoder.c \
+ jpeg-encoder.h \
+ main-channel.cpp \
+ main-channel-client.cpp \
+ main-channel-client.h \
+ main-channel.h \
+ main-dispatcher.cpp \
+ main-dispatcher.h \
+ memslot.c \
+ memslot.h \
+ migration-protocol.h \
+ mjpeg-encoder.c \
+ net-utils.c \
+ net-utils.h \
+ pixmap-cache.cpp \
+ pixmap-cache.h \
+ pop-visibility.h \
+ push-visibility.h \
+ red-channel.cpp \
+ red-channel-capabilities.c \
+ red-channel-capabilities.h \
+ red-channel-client.cpp \
+ red-channel-client.h \
+ red-channel.h \
+ red-client.cpp \
+ red-client.h \
+ red-common.h \
+ red-parse-qxl.cpp \
+ red-parse-qxl.h \
+ red-pipe-item.cpp \
+ red-pipe-item.h \
+ red-qxl.cpp \
+ red-qxl.h \
+ red-record-qxl.cpp \
+ red-record-qxl.h \
+ red-replay-qxl.cpp \
+ reds.cpp \
reds.h \
reds-private.h \
- reds_stream.c \
- reds_stream.h \
- reds_sw_canvas.c \
- reds_sw_canvas.h \
- snd_worker.c \
- snd_worker.h \
- spice-experimental.h \
- spice.h \
+ red-stream.cpp \
+ red-stream.h \
+ red-worker.cpp \
+ red-worker.h \
+ sound.cpp \
+ sound.h \
+ spice-bitmap-utils.c \
+ spice-bitmap-utils.h \
+ spicevmc.cpp \
+ spice-wrapped.h \
+ stat-file.c \
+ stat-file.h \
stat.h \
- spicevmc.c \
- spice_timer_queue.c \
- spice_timer_queue.h \
- zlib_encoder.c \
- zlib_encoder.h \
- spice_bitmap_utils.h \
- spice_bitmap_utils.c \
- spice_server_utils.h \
- spice_image_cache.h \
- spice_image_cache.c \
+ stream-channel.cpp \
+ stream-channel.h \
+ sys-socket.h \
+ sys-socket.c \
+ red-stream-device.cpp \
+ red-stream-device.h \
+ sw-canvas.c \
+ tree.cpp \
+ tree.h \
+ utils.c \
+ utils.h \
+ video-encoder.h \
+ video-stream.cpp \
+ video-stream.h \
+ websocket.c \
+ websocket.h \
+ zlib-encoder.c \
+ zlib-encoder.h \
$(NULL)
-if SUPPORT_GL
-libspice_server_la_SOURCES += \
- reds_gl_canvas.c \
- reds_gl_canvas.h \
+if HAVE_LZ4
+libserver_la_SOURCES += \
+ lz4-encoder.c \
+ lz4-encoder.h \
$(NULL)
endif
-if SUPPORT_SMARTCARD
-libspice_server_la_SOURCES += \
- smartcard.c \
- smartcard.h \
+if HAVE_SMARTCARD
+libserver_la_SOURCES += \
+ smartcard.cpp \
+ smartcard.h \
+ smartcard-channel-client.cpp \
+ smartcard-channel-client.h \
$(NULL)
endif
-libspice_serverincludedir = $(includedir)/spice-server
-libspice_serverinclude_HEADERS = \
- spice.h \
- spice-experimental.h \
+if HAVE_GSTREAMER
+libserver_la_SOURCES += \
+ gstreamer-encoder.c \
$(NULL)
+endif
+
+libspice_server_la_LIBADD = libserver.la
+libspice_server_la_SOURCES =
+## see https://www.gnu.org/software/automake/manual/html_node/Libtool-Convenience-Libraries.html
+## ("Libtool Convenience Libraries")
+nodist_EXTRA_libspice_server_la_SOURCES = dummy.cpp
+
+spice-server-enums.c: spice-server.h spice-server-enums.c.tmpl
+ $(AM_V_GEN)glib-mkenums --template $(srcdir)/spice-server-enums.c.tmpl $< > $@
+
+spice-server-enums.h: spice-server.h spice-server-enums.h.tmpl
+ $(AM_V_GEN)glib-mkenums --template $(srcdir)/spice-server-enums.h.tmpl $< > $@
EXTRA_DIST = \
- glz_encode_match_tmpl.c \
- glz_encode_tmpl.c \
+ meson.build \
+ spice-bitmap-utils.tmpl.c \
+ cache-item.tmpl.cpp \
+ glz-encode-match.tmpl.c \
+ glz-encode.tmpl.c \
spice-server.syms \
+ spice-server-enums.h.tmpl \
+ spice-server-enums.c.tmpl \
$(NULL)
BUILT_SOURCES = $(spice_built_sources)
-
-dist-hook:
- if test ./tests/test_spice_version.sh && ! test ./tests/test_spice_version.sh; then exit 1; fi
diff --git a/server/agent-msg-filter.c b/server/agent-msg-filter.c
index 567e03d0..e18e8fcf 100644
--- a/server/agent-msg-filter.c
+++ b/server/agent-msg-filter.c
@@ -17,31 +17,40 @@
Red Hat Authors:
hdegoede@redhat.com
*/
-#ifdef HAVE_CONFIG_H
#include <config.h>
-#endif
#include <string.h>
-#include "red_common.h"
+#include <spice/vd_agent.h>
+#include "red-common.h"
#include "agent-msg-filter.h"
-#include "red_dispatcher.h"
-void agent_msg_filter_init(struct AgentMsgFilter *filter,
- int copy_paste, int file_xfer, int discard_all)
+void agent_msg_filter_config(AgentMsgFilter *filter,
+ gboolean copy_paste, gboolean file_xfer,
+ gboolean use_client_monitors_config)
{
- memset(filter, 0, sizeof(*filter));
filter->copy_paste_enabled = copy_paste;
filter->file_xfer_enabled = file_xfer;
+ filter->use_client_monitors_config = use_client_monitors_config;
+}
+
+void agent_msg_filter_init(AgentMsgFilter *filter,
+ gboolean copy_paste, gboolean file_xfer,
+ gboolean use_client_monitors_config,
+ gboolean discard_all)
+{
+ memset(filter, 0, sizeof(*filter));
+ agent_msg_filter_config(filter, copy_paste, file_xfer,
+ use_client_monitors_config);
filter->discard_all = discard_all;
}
-int agent_msg_filter_process_data(struct AgentMsgFilter *filter,
- uint8_t *data, uint32_t len)
+AgentMsgFilterResult agent_msg_filter_process_data(AgentMsgFilter *filter,
+ const uint8_t *data, uint32_t len)
{
struct VDAgentMessage msg_header;
if (len > VD_AGENT_MAX_DATA_SIZE) {
- spice_printerr("invalid agent message: too large");
+ g_warning("invalid agent message: too large");
return AGENT_MSG_FILTER_PROTO_ERROR;
}
@@ -49,7 +58,7 @@ int agent_msg_filter_process_data(struct AgentMsgFilter *filter,
if (filter->msg_data_to_read) {
data_to_read:
if (len > filter->msg_data_to_read) {
- spice_printerr("invalid agent message: data exceeds size from header");
+ g_warning("invalid agent message: data exceeds size from header");
return AGENT_MSG_FILTER_PROTO_ERROR;
}
filter->msg_data_to_read -= len;
@@ -57,49 +66,48 @@ data_to_read:
}
if (len < sizeof(msg_header)) {
- spice_printerr("invalid agent message: incomplete header");
+ g_warning("invalid agent message: incomplete header");
return AGENT_MSG_FILTER_PROTO_ERROR;
}
memcpy(&msg_header, data, sizeof(msg_header));
+ msg_header.protocol = GUINT32_FROM_LE(msg_header.protocol);
+ msg_header.type = GUINT32_FROM_LE(msg_header.type);
+ msg_header.size = GUINT32_FROM_LE(msg_header.size);
len -= sizeof(msg_header);
if (msg_header.protocol != VD_AGENT_PROTOCOL) {
- spice_printerr("invalid agent protocol: %u", msg_header.protocol);
+ g_warning("invalid agent protocol: %u", msg_header.protocol);
return AGENT_MSG_FILTER_PROTO_ERROR;
}
if (filter->discard_all) {
filter->result = AGENT_MSG_FILTER_DISCARD;
} else {
+ // default, easier to set once
+ filter->result = AGENT_MSG_FILTER_OK;
switch (msg_header.type) {
case VD_AGENT_CLIPBOARD:
case VD_AGENT_CLIPBOARD_GRAB:
case VD_AGENT_CLIPBOARD_REQUEST:
case VD_AGENT_CLIPBOARD_RELEASE:
- if (filter->copy_paste_enabled) {
- filter->result = AGENT_MSG_FILTER_OK;
- } else {
+ if (!filter->copy_paste_enabled) {
filter->result = AGENT_MSG_FILTER_DISCARD;
}
break;
case VD_AGENT_FILE_XFER_START:
case VD_AGENT_FILE_XFER_STATUS:
case VD_AGENT_FILE_XFER_DATA:
- if (filter->file_xfer_enabled) {
- filter->result = AGENT_MSG_FILTER_OK;
- } else {
+ if (!filter->file_xfer_enabled) {
filter->result = AGENT_MSG_FILTER_DISCARD;
}
break;
case VD_AGENT_MONITORS_CONFIG:
- if (red_dispatcher_use_client_monitors_config()) {
+ if (filter->use_client_monitors_config) {
filter->result = AGENT_MSG_FILTER_MONITORS_CONFIG;
- } else {
- filter->result = AGENT_MSG_FILTER_OK;
}
break;
default:
- filter->result = AGENT_MSG_FILTER_OK;
+ break;
}
}
diff --git a/server/agent-msg-filter.h b/server/agent-msg-filter.h
index 92aabced..23d4301a 100644
--- a/server/agent-msg-filter.h
+++ b/server/agent-msg-filter.h
@@ -18,31 +18,49 @@
hdegoede@redhat.com
*/
-#ifndef _H_AGENT_MSG_FILTER
-#define _H_AGENT_MSG_FILTER
+#ifndef AGENT_MSG_FILTER_H_
+#define AGENT_MSG_FILTER_H_
-#include <spice/vd_agent.h>
+#include <inttypes.h>
+#include <glib.h>
+#include <spice/macros.h>
+
+SPICE_BEGIN_DECLS
/* Possible return values for agent_msg_filter_process_data */
-enum {
+typedef enum {
AGENT_MSG_FILTER_OK,
AGENT_MSG_FILTER_DISCARD,
AGENT_MSG_FILTER_PROTO_ERROR,
AGENT_MSG_FILTER_MONITORS_CONFIG,
- AGENT_MSG_FILTER_END
-};
+} AgentMsgFilterResult;
typedef struct AgentMsgFilter {
+ // bytes of message we still need to read
int msg_data_to_read;
- int result;
- int copy_paste_enabled;
- int file_xfer_enabled;
- int discard_all;
+ // status of current message, we need to store in case the same message is split into multiple
+ // chunks
+ AgentMsgFilterResult result;
+ gboolean copy_paste_enabled;
+ gboolean file_xfer_enabled;
+ // device should pass monitor information to reds instead of passing to agent,
+ // used for messages from the guest to the agent
+ gboolean use_client_monitors_config;
+ // discard all messages, used for example when device is disabled to discard
+ // pending data
+ gboolean discard_all;
} AgentMsgFilter;
-void agent_msg_filter_init(struct AgentMsgFilter *filter,
- int copy_paste, int file_xfer, int discard_all);
-int agent_msg_filter_process_data(struct AgentMsgFilter *filter,
- uint8_t *data, uint32_t len);
+void agent_msg_filter_init(AgentMsgFilter *filter,
+ gboolean copy_paste, gboolean file_xfer,
+ gboolean use_client_monitors_config,
+ gboolean discard_all);
+void agent_msg_filter_config(AgentMsgFilter *filter,
+ gboolean copy_paste, gboolean file_xfer,
+ gboolean use_client_monitors_config);
+AgentMsgFilterResult agent_msg_filter_process_data(AgentMsgFilter *filter,
+ const uint8_t *data, uint32_t len);
+
+SPICE_END_DECLS
-#endif
+#endif /* AGENT_MSG_FILTER_H_ */
diff --git a/client/red_types.h b/server/cache-item.h
index d5273390..e0e1f4c1 100644
--- a/client/red_types.h
+++ b/server/cache-item.h
@@ -1,5 +1,6 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
/*
- Copyright (C) 2009 Red Hat, Inc.
+ Copyright (C) 2014 Red Hat, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@@ -15,23 +16,18 @@
License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef _H_RED_TYPES
-#define _H_RED_TYPES
+#ifndef CACHE_ITEM_H_
+#define CACHE_ITEM_H_
-struct PixmapHeader {
- uint8_t* data;
- int width;
- int height;
- int stride;
-};
+#include <common/ring.h>
-struct IconHeader {
- int width;
- int height;
- uint8_t* pixmap;
- uint8_t* mask;
-};
+#include "red-pipe-item.h"
-class RedDrawable;
+struct RedCacheItem {
+ RingItem lru_link;
+ RedCacheItem *next;
+ size_t size;
+ uint64_t id;
+};
-#endif
+#endif /* CACHE_ITEM_H_ */
diff --git a/server/cache-item.tmpl.cpp b/server/cache-item.tmpl.cpp
new file mode 100644
index 00000000..781f3f53
--- /dev/null
+++ b/server/cache-item.tmpl.cpp
@@ -0,0 +1,140 @@
+/*
+ Copyright (C) 2009 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <config.h>
+
+#if defined(CLIENT_CURSOR_CACHE)
+
+#define CACHE_NAME cursor_cache
+#define CACHE_HASH_KEY CURSOR_CACHE_HASH_KEY
+#define CACHE_HASH_SIZE CURSOR_CACHE_HASH_SIZE
+#define FUNC_NAME(name) red_cursor_cache_##name
+#define VAR_NAME(name) cursor_cache_##name
+#define CHANNELCLIENT CursorChannelClient
+
+#elif defined(CLIENT_PALETTE_CACHE)
+
+#define CACHE_NAME palette_cache
+#define CACHE_HASH_KEY PALETTE_CACHE_HASH_KEY
+#define CACHE_HASH_SIZE PALETTE_CACHE_HASH_SIZE
+#define FUNC_NAME(name) red_palette_cache_##name
+#define VAR_NAME(name) palette_cache_##name
+#define CHANNELCLIENT DisplayChannelClient
+#else
+
+#error "no cache type."
+
+#endif
+
+static RedCacheItem *FUNC_NAME(find)(CHANNELCLIENT *channel_client, uint64_t id)
+{
+ RedCacheItem *item = channel_client->priv->CACHE_NAME[CACHE_HASH_KEY(id)];
+
+ while (item) {
+ if (item->id == id) {
+ ring_remove(&item->lru_link);
+ ring_add(&channel_client->priv->VAR_NAME(lru), &item->lru_link);
+ break;
+ }
+ item = item->next;
+ }
+ return item;
+}
+
+static void FUNC_NAME(remove)(CHANNELCLIENT *channel_client, RedCacheItem *item)
+{
+ RedCacheItem **now;
+ spice_assert(item);
+
+ now = &channel_client->priv->CACHE_NAME[CACHE_HASH_KEY(item->id)];
+ for (;;) {
+ spice_assert(*now);
+ if (*now == item) {
+ *now = item->next;
+ break;
+ }
+ now = &(*now)->next;
+ }
+ ring_remove(&item->lru_link);
+ channel_client->priv->VAR_NAME(available) += item->size;
+
+ // see "Optimization" comment on add function below
+ auto id = item->id;
+ RedCachePipeItem *pipe_item = reinterpret_cast<RedCachePipeItem*>(item);
+
+ new (pipe_item) RedCachePipeItem();
+ pipe_item->inval_one.id = id;
+ channel_client->pipe_add_tail(RedPipeItemPtr(pipe_item)); // for now
+}
+
+static int FUNC_NAME(add)(CHANNELCLIENT *channel_client, uint64_t id, size_t size)
+{
+ RedCacheItem *item;
+ int key;
+
+ /* Optimization: allocate memory in order to be able to store
+ * both cache item and pipe item to be able to reuse it when
+ * we need to remove cache telling client */
+ union RedCachePoolItem {
+ RedCacheItem cache_item;
+ RedCachePipeItem pipe_item;
+ };
+ item = (RedCacheItem *) g_new(RedCachePoolItem, 1);
+
+ channel_client->priv->VAR_NAME(available) -= size;
+ SPICE_VERIFY(SPICE_OFFSETOF(RedCacheItem, lru_link) == 0);
+ while (channel_client->priv->VAR_NAME(available) < 0) {
+ RedCacheItem *tail = SPICE_CONTAINEROF(ring_get_tail(&channel_client->priv->VAR_NAME(lru)),
+ RedCacheItem, lru_link);
+ if (!tail) {
+ channel_client->priv->VAR_NAME(available) += size;
+ g_free(item);
+ return FALSE;
+ }
+ FUNC_NAME(remove)(channel_client, tail);
+ }
+ item->next = channel_client->priv->CACHE_NAME[(key = CACHE_HASH_KEY(id))];
+ channel_client->priv->CACHE_NAME[key] = item;
+ ring_item_init(&item->lru_link);
+ ring_add(&channel_client->priv->VAR_NAME(lru), &item->lru_link);
+ item->id = id;
+ item->size = size;
+ return TRUE;
+}
+
+static void FUNC_NAME(reset)(CHANNELCLIENT *channel_client, long size)
+{
+ int i;
+
+ for (i = 0; i < CACHE_HASH_SIZE; i++) {
+ while (channel_client->priv->CACHE_NAME[i]) {
+ RedCacheItem *item = channel_client->priv->CACHE_NAME[i];
+ channel_client->priv->CACHE_NAME[i] = item->next;
+ g_free(item);
+ }
+ }
+ ring_init(&channel_client->priv->VAR_NAME(lru));
+ channel_client->priv->VAR_NAME(available) = size;
+}
+
+
+#undef CACHE_NAME
+#undef CACHE_HASH_KEY
+#undef CACHE_HASH_SIZE
+#undef FUNC_NAME
+#undef VAR_NAME
+#undef CHANNELCLIENT
diff --git a/server/char-device.cpp b/server/char-device.cpp
new file mode 100644
index 00000000..1be96c06
--- /dev/null
+++ b/server/char-device.cpp
@@ -0,0 +1,965 @@
+/* spice-server char device flow control code
+
+ Copyright (C) 2012-2015 Red Hat, Inc.
+
+ Red Hat Authors:
+ Yonit Halperin <yhalperi@redhat.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http:www.gnu.org/licenses/>.
+*/
+
+#include <config.h>
+
+#include <list>
+
+#include "char-device.h"
+#include "reds.h"
+#include "safe-list.hpp"
+
+#define CHAR_DEVICE_WRITE_TO_TIMEOUT 100
+#define RED_CHAR_DEVICE_WAIT_TOKENS_TIMEOUT 30000
+
+enum WriteBufferOrigin {
+ WRITE_BUFFER_ORIGIN_NONE,
+ WRITE_BUFFER_ORIGIN_CLIENT,
+ WRITE_BUFFER_ORIGIN_SERVER,
+ WRITE_BUFFER_ORIGIN_SERVER_NO_TOKEN,
+};
+
+struct RedCharDeviceWriteBufferPrivate {
+ RedCharDeviceClientOpaque *client; /* The client that sent the message to the device.
+ NULL if the server created the message */
+ WriteBufferOrigin origin;
+ uint32_t token_price;
+ uint32_t refs;
+};
+
+struct RedCharDeviceClient {
+ SPICE_CXX_GLIB_ALLOCATOR
+ using Queue = std::list<RedPipeItemPtr, red::Mallocator<RedPipeItemPtr> >;
+
+ RedCharDeviceClient(RedCharDevice *dev,
+ RedsState *reds,
+ RedCharDeviceClientOpaque *client,
+ bool do_flow_control,
+ uint32_t max_send_queue_size,
+ uint32_t num_client_tokens,
+ uint32_t num_send_tokens);
+ ~RedCharDeviceClient();
+
+ RedCharDevice *const dev;
+ RedCharDeviceClientOpaque *const client;
+ const bool do_flow_control;
+ uint64_t num_client_tokens;
+ uint64_t num_client_tokens_free; /* client messages that were consumed by the device */
+ uint64_t num_send_tokens; /* send to client */
+ SpiceTimer *wait_for_tokens_timer;
+ int wait_for_tokens_started;
+ Queue send_queue;
+ const uint32_t max_send_queue_size;
+};
+
+struct RedCharDevicePrivate {
+ SPICE_CXX_GLIB_ALLOCATOR
+
+ int running;
+ int active; /* has read/write been performed since the device was started */
+ int wait_for_migrate_data;
+
+ GQueue write_queue;
+ RedCharDeviceWriteBuffer *cur_write_buf;
+ uint8_t *cur_write_buf_pos;
+ SpiceTimer *write_to_dev_timer;
+ uint64_t num_self_tokens;
+
+ GList *clients; /* list of RedCharDeviceClient */
+
+ uint64_t client_tokens_interval; /* frequency of returning tokens to the client */
+ SpiceCharDeviceInstance *sin;
+
+ int during_read_from_device;
+ int during_write_to_device;
+
+ SpiceServer *reds;
+};
+
+static void red_char_device_write_buffer_unref(RedCharDeviceWriteBuffer *write_buf);
+
+void
+RedCharDevice::send_tokens_to_client(RedCharDeviceClientOpaque *client, uint32_t tokens)
+{
+ g_warn_if_reached();
+}
+
+static void red_char_device_write_buffer_free(RedCharDeviceWriteBuffer *buf)
+{
+ if (buf) {
+ g_free(buf->priv);
+ }
+ /* NOTE: do not free buf. buf was contained into a larger structure
+ * which contained both private and public part and was freed above */
+}
+
+static void write_buffers_queue_free(GQueue *write_queue)
+{
+ RedCharDeviceWriteBuffer *buf;
+ while ((buf = static_cast<RedCharDeviceWriteBuffer *>(g_queue_pop_tail(write_queue))))
+ red_char_device_write_buffer_free(buf);
+}
+
+static void red_char_device_client_free(RedCharDevice *dev,
+ RedCharDeviceClient *dev_client)
+{
+ GList *l, *next;
+
+ red_timer_remove(dev_client->wait_for_tokens_timer);
+ dev_client->wait_for_tokens_timer = nullptr;
+
+ dev_client->send_queue.clear();
+
+ /* remove write buffers that are associated with the client */
+ spice_debug("write_queue_is_empty %d", g_queue_is_empty(&dev->priv->write_queue) && !dev->priv->cur_write_buf);
+ l = g_queue_peek_head_link(&dev->priv->write_queue);
+ while (l) {
+ auto write_buf = static_cast<RedCharDeviceWriteBuffer *>(l->data);
+ next = l->next;
+
+ if (write_buf->priv->origin == WRITE_BUFFER_ORIGIN_CLIENT &&
+ write_buf->priv->client == dev_client->client) {
+ g_queue_delete_link(&dev->priv->write_queue, l);
+ red_char_device_write_buffer_unref(write_buf);
+ }
+ l = next;
+ }
+
+ if (dev->priv->cur_write_buf && dev->priv->cur_write_buf->priv->origin == WRITE_BUFFER_ORIGIN_CLIENT &&
+ dev->priv->cur_write_buf->priv->client == dev_client->client) {
+ dev->priv->cur_write_buf->priv->origin = WRITE_BUFFER_ORIGIN_NONE;
+ dev->priv->cur_write_buf->priv->client = nullptr;
+ }
+
+ dev->priv->clients = g_list_remove(dev->priv->clients, dev_client);
+ delete dev_client;
+}
+
+static void red_char_device_handle_client_overflow(RedCharDeviceClient *dev_client)
+{
+ RedCharDevice *dev = dev_client->dev;
+ dev->remove_client(dev_client->client);
+}
+
+static RedCharDeviceClient *red_char_device_client_find(RedCharDevice *dev,
+ RedCharDeviceClientOpaque *client)
+{
+ RedCharDeviceClient *dev_client;
+
+ GLIST_FOREACH(dev->priv->clients, RedCharDeviceClient, dev_client) {
+ if (dev_client->client == client) {
+ return dev_client;
+ }
+ }
+ return nullptr;
+}
+
+/***************************
+ * Reading from the device *
+ **************************/
+
+static void device_client_wait_for_tokens_timeout(RedCharDeviceClient *dev_client)
+{
+ red_char_device_handle_client_overflow(dev_client);
+}
+
+static int red_char_device_can_send_to_client(RedCharDeviceClient *dev_client)
+{
+ return !dev_client->do_flow_control || dev_client->num_send_tokens;
+}
+
+static uint64_t red_char_device_max_send_tokens(RedCharDevice *dev)
+{
+ RedCharDeviceClient *dev_client;
+ uint64_t max = 0;
+
+ GLIST_FOREACH(dev->priv->clients, RedCharDeviceClient, dev_client) {
+ if (!dev_client->do_flow_control) {
+ max = ~0;
+ break;
+ }
+
+ if (dev_client->num_send_tokens > max) {
+ max = dev_client->num_send_tokens;
+ }
+ }
+ return max;
+}
+
+static void red_char_device_add_msg_to_client_queue(RedCharDeviceClient *dev_client,
+ RedPipeItem *msg)
+{
+ if (dev_client->send_queue.size() >= dev_client->max_send_queue_size) {
+ red_char_device_handle_client_overflow(dev_client);
+ return;
+ }
+
+ dev_client->send_queue.push_front(RedPipeItemPtr(msg));
+ if (!dev_client->wait_for_tokens_started) {
+ red_timer_start(dev_client->wait_for_tokens_timer,
+ RED_CHAR_DEVICE_WAIT_TOKENS_TIMEOUT);
+ dev_client->wait_for_tokens_started = TRUE;
+ }
+}
+
+static void red_char_device_send_msg_to_clients(RedCharDevice *dev,
+ RedPipeItem *msg)
+{
+ RedCharDeviceClient *dev_client;
+
+ GLIST_FOREACH(dev->priv->clients, RedCharDeviceClient, dev_client) {
+ if (red_char_device_can_send_to_client(dev_client)) {
+ dev_client->num_send_tokens--;
+ spice_assert(dev_client->send_queue.empty());
+ dev->send_msg_to_client(msg, dev_client->client);
+
+ /* don't refer to dev_client anymore, it may have been released */
+ } else {
+ red_char_device_add_msg_to_client_queue(dev_client, msg);
+ }
+ }
+}
+
+static bool red_char_device_read_from_device(RedCharDevice *dev)
+{
+ uint64_t max_send_tokens;
+ int did_read = FALSE;
+
+ if (!dev->priv->running || dev->priv->wait_for_migrate_data || !dev->priv->sin) {
+ return FALSE;
+ }
+
+ /* There are 2 scenarios where we can get called recursively:
+ * 1) spice-vmc vmc_read triggering flush of throttled data, recalling wakeup
+ * (virtio)
+ * 2) in case of sending messages to the client, and unreferencing the
+ * msg, we trigger another read.
+ */
+ if (dev->priv->during_read_from_device++ > 0) {
+ return FALSE;
+ }
+
+ max_send_tokens = red_char_device_max_send_tokens(dev);
+ red::shared_ptr<RedCharDevice> hold_dev(dev);
+ /*
+ * Reading from the device only in case at least one of the clients have a free token.
+ * All messages will be discarded if no client is attached to the device
+ */
+ while ((max_send_tokens || (dev->priv->clients == nullptr)) && dev->priv->running) {
+ auto msg = dev->read_one_msg_from_device();
+ if (!msg) {
+ if (dev->priv->during_read_from_device > 1) {
+ dev->priv->during_read_from_device = 1;
+ continue; /* a wakeup might have been called during the read -
+ make sure it doesn't get lost */
+ }
+ break;
+ }
+ did_read = TRUE;
+ red_char_device_send_msg_to_clients(dev, msg.get());
+ max_send_tokens--;
+ }
+ dev->priv->during_read_from_device = 0;
+ if (dev->priv->running) {
+ dev->priv->active = dev->priv->active || did_read;
+ }
+ return did_read;
+}
+
+static void red_char_device_client_send_queue_push(RedCharDeviceClient *dev_client)
+{
+ while (!dev_client->send_queue.empty() &&
+ red_char_device_can_send_to_client(dev_client)) {
+ RedPipeItemPtr msg = std::move(dev_client->send_queue.back());
+ dev_client->send_queue.pop_back();
+ g_assert(msg);
+ dev_client->num_send_tokens--;
+ dev_client->dev->send_msg_to_client(msg.get(), dev_client->client);
+ }
+}
+
+static void
+red_char_device_send_to_client_tokens_absorb(RedCharDevice *dev,
+ RedCharDeviceClientOpaque *client,
+ uint32_t tokens,
+ bool reset)
+{
+ RedCharDeviceClient *dev_client;
+
+ dev_client = red_char_device_client_find(dev, client);
+
+ if (!dev_client) {
+ spice_error("client wasn't found dev %p client %p", dev, client);
+ return;
+ }
+
+ if (reset) {
+ dev_client->num_send_tokens = 0;
+ }
+ dev_client->num_send_tokens += tokens;
+
+ if (!dev_client->send_queue.empty()) {
+ spice_assert(dev_client->num_send_tokens == tokens);
+ red_char_device_client_send_queue_push(dev_client);
+ }
+
+ if (red_char_device_can_send_to_client(dev_client)) {
+ red_timer_cancel(dev_client->wait_for_tokens_timer);
+ dev_client->wait_for_tokens_started = FALSE;
+ red_char_device_read_from_device(dev_client->dev);
+ } else if (!dev_client->send_queue.empty()) {
+ red_timer_start(dev_client->wait_for_tokens_timer,
+ RED_CHAR_DEVICE_WAIT_TOKENS_TIMEOUT);
+ dev_client->wait_for_tokens_started = TRUE;
+ }
+}
+
+void RedCharDevice::send_to_client_tokens_add(RedCharDeviceClientOpaque *client,
+ uint32_t tokens)
+{
+ red_char_device_send_to_client_tokens_absorb(this, client, tokens, false);
+}
+
+void RedCharDevice::send_to_client_tokens_set(RedCharDeviceClientOpaque *client,
+ uint32_t tokens)
+{
+ red_char_device_send_to_client_tokens_absorb(this, client, tokens, true);
+}
+
+/**************************
+ * Writing to the device *
+***************************/
+
+static void red_char_device_client_tokens_add(RedCharDevice *dev,
+ RedCharDeviceClient *dev_client,
+ uint32_t num_tokens)
+{
+ if (!dev_client->do_flow_control) {
+ return;
+ }
+ if (num_tokens > 1) {
+ spice_debug("#tokens > 1 (=%u)", num_tokens);
+ }
+ dev_client->num_client_tokens_free += num_tokens;
+ if (dev_client->num_client_tokens_free >= dev->priv->client_tokens_interval) {
+ uint32_t tokens = dev_client->num_client_tokens_free;
+
+ dev_client->num_client_tokens += dev_client->num_client_tokens_free;
+ dev_client->num_client_tokens_free = 0;
+ dev->send_tokens_to_client(dev_client->client, tokens);
+ }
+}
+
+int RedCharDevice::write_to_device()
+{
+ SpiceCharDeviceInterface *sif;
+ int total = 0;
+ int n;
+
+ if (!priv->running || priv->wait_for_migrate_data || !priv->sin) {
+ return 0;
+ }
+
+ /* protect against recursion with red_char_device_wakeup */
+ if (priv->during_write_to_device++ > 0) {
+ return 0;
+ }
+
+ red::shared_ptr<RedCharDevice> hold_dev(this);
+
+ if (priv->write_to_dev_timer) {
+ red_timer_cancel(priv->write_to_dev_timer);
+ }
+
+ sif = spice_char_device_get_interface(priv->sin);
+ while (priv->running) {
+ uint32_t write_len;
+
+ if (!priv->cur_write_buf) {
+ priv->cur_write_buf =
+ static_cast<RedCharDeviceWriteBuffer *>(g_queue_pop_tail(&priv->write_queue));
+ if (!priv->cur_write_buf)
+ break;
+ priv->cur_write_buf_pos = priv->cur_write_buf->buf;
+ }
+
+ write_len = priv->cur_write_buf->buf + priv->cur_write_buf->buf_used -
+ priv->cur_write_buf_pos;
+ n = sif->write(priv->sin, priv->cur_write_buf_pos, write_len);
+ if (n <= 0) {
+ if (priv->during_write_to_device > 1) {
+ priv->during_write_to_device = 1;
+ continue; /* a wakeup might have been called during the write -
+ make sure it doesn't get lost */
+ }
+ break;
+ }
+ total += n;
+ write_len -= n;
+ if (!write_len) {
+ write_buffer_release(&priv->cur_write_buf);
+ continue;
+ }
+ priv->cur_write_buf_pos += n;
+ }
+ /* retry writing as long as the write queue is not empty */
+ if (priv->running) {
+ if (priv->cur_write_buf) {
+ if (priv->write_to_dev_timer) {
+ red_timer_start(priv->write_to_dev_timer,
+ CHAR_DEVICE_WRITE_TO_TIMEOUT);
+ }
+ } else {
+ spice_assert(g_queue_is_empty(&priv->write_queue));
+ }
+ priv->active = priv->active || total;
+ }
+ priv->during_write_to_device = 0;
+ return total;
+}
+
+void RedCharDevice::write_retry(RedCharDevice *dev)
+{
+ if (dev->priv->write_to_dev_timer) {
+ red_timer_cancel(dev->priv->write_to_dev_timer);
+ }
+ dev->write_to_device();
+}
+
+static RedCharDeviceWriteBuffer *
+red_char_device_write_buffer_get(RedCharDevice *dev, RedCharDeviceClientOpaque *client, int size,
+ WriteBufferOrigin origin, int migrated_data_tokens)
+{
+ RedCharDeviceWriteBuffer *ret;
+
+ if (origin == WRITE_BUFFER_ORIGIN_SERVER && !dev->priv->num_self_tokens) {
+ return nullptr;
+ }
+
+ struct RedCharDeviceWriteBufferFull {
+ RedCharDeviceWriteBufferPrivate priv;
+ RedCharDeviceWriteBuffer buffer;
+ } *write_buf;
+ write_buf = static_cast<struct RedCharDeviceWriteBufferFull *>(
+ g_malloc(sizeof(struct RedCharDeviceWriteBufferFull) + size));
+ memset(write_buf, 0, sizeof(*write_buf));
+ write_buf->priv.refs = 1;
+ ret = &write_buf->buffer;
+ ret->buf_size = size;
+ ret->priv = &write_buf->priv;
+
+ spice_assert(!ret->buf_used);
+
+ ret->priv->origin = origin;
+
+ if (origin == WRITE_BUFFER_ORIGIN_CLIENT) {
+ spice_assert(client);
+ RedCharDeviceClient *dev_client = red_char_device_client_find(dev, client);
+ if (dev_client) {
+ if (!migrated_data_tokens &&
+ dev_client->do_flow_control && !dev_client->num_client_tokens) {
+ g_warning("token violation: dev %p client %p", dev, client);
+ red_char_device_handle_client_overflow(dev_client);
+ goto error;
+ }
+ ret->priv->client = client;
+ if (!migrated_data_tokens && dev_client->do_flow_control) {
+ dev_client->num_client_tokens--;
+ }
+ } else {
+ /* it is possible that the client was removed due to send tokens underflow, but
+ * the caller still receive messages from the client */
+ g_warning("client not found: dev %p client %p", dev, client);
+ goto error;
+ }
+ } else if (origin == WRITE_BUFFER_ORIGIN_SERVER) {
+ dev->priv->num_self_tokens--;
+ }
+
+ ret->priv->token_price = migrated_data_tokens ? migrated_data_tokens : 1;
+ ret->priv->refs = 1;
+ return ret;
+error:
+ red_char_device_write_buffer_free(ret);
+ return nullptr;
+}
+
+RedCharDeviceWriteBuffer *RedCharDevice::write_buffer_get_client(RedCharDeviceClientOpaque *client,
+ int size)
+{
+ spice_assert(client);
+ return red_char_device_write_buffer_get(this, client, size, WRITE_BUFFER_ORIGIN_CLIENT, 0);
+}
+
+RedCharDeviceWriteBuffer *RedCharDevice::write_buffer_get_server(int size,
+ bool use_token)
+{
+ WriteBufferOrigin origin =
+ use_token ? WRITE_BUFFER_ORIGIN_SERVER : WRITE_BUFFER_ORIGIN_SERVER_NO_TOKEN;
+ return red_char_device_write_buffer_get(this, nullptr, size, origin, 0);
+}
+
+static RedCharDeviceWriteBuffer *red_char_device_write_buffer_ref(RedCharDeviceWriteBuffer *write_buf)
+{
+ spice_assert(write_buf);
+
+ write_buf->priv->refs++;
+ return write_buf;
+}
+
+static void red_char_device_write_buffer_unref(RedCharDeviceWriteBuffer *write_buf)
+{
+ spice_assert(write_buf);
+
+ write_buf->priv->refs--;
+ if (write_buf->priv->refs == 0)
+ red_char_device_write_buffer_free(write_buf);
+}
+
+void RedCharDevice::write_buffer_add(RedCharDeviceWriteBuffer *write_buf)
+{
+
+ /* caller shouldn't add buffers for client that was removed */
+ if (write_buf->priv->origin == WRITE_BUFFER_ORIGIN_CLIENT &&
+ !red_char_device_client_find(this, write_buf->priv->client)) {
+ g_warning("client not found: this %p client %p", this, write_buf->priv->client);
+ red_char_device_write_buffer_unref(write_buf);
+ return;
+ }
+
+ g_queue_push_head(&priv->write_queue, write_buf);
+ write_to_device();
+}
+
+void RedCharDevice::write_buffer_release(RedCharDevice *dev,
+ RedCharDeviceWriteBuffer **p_write_buf)
+{
+ RedCharDeviceWriteBuffer *write_buf = *p_write_buf;
+ if (!write_buf) {
+ return;
+ }
+ *p_write_buf = nullptr;
+
+ WriteBufferOrigin buf_origin = write_buf->priv->origin;
+ uint32_t buf_token_price = write_buf->priv->token_price;
+ RedCharDeviceClientOpaque *client = write_buf->priv->client;
+
+ if (!dev) {
+ g_warning("no device. write buffer is freed");
+ red_char_device_write_buffer_free(write_buf);
+ return;
+ }
+
+ spice_assert(dev->priv->cur_write_buf != write_buf);
+
+ red_char_device_write_buffer_unref(write_buf);
+ if (buf_origin == WRITE_BUFFER_ORIGIN_CLIENT) {
+ RedCharDeviceClient *dev_client;
+
+ spice_assert(client);
+ dev_client = red_char_device_client_find(dev, client);
+ /* when a client is removed, we remove all the buffers that are associated with it */
+ spice_assert(dev_client);
+ red_char_device_client_tokens_add(dev, dev_client, buf_token_price);
+ } else if (buf_origin == WRITE_BUFFER_ORIGIN_SERVER) {
+ dev->priv->num_self_tokens++;
+ dev->on_free_self_token();
+ }
+}
+
+/********************************
+ * char_device_state management *
+ ********************************/
+
+void RedCharDevice::reset_dev_instance(SpiceCharDeviceInstance *sin)
+{
+ spice_debug("sin %p, char device %p", sin, this);
+ priv->sin = sin;
+ if (sin) {
+ sin->st = this;
+ }
+ if (priv->reds) {
+ init_device_instance();
+ }
+}
+
+RedCharDeviceClient::RedCharDeviceClient(RedCharDevice *init_dev,
+ RedsState *reds,
+ RedCharDeviceClientOpaque *init_client,
+ bool init_do_flow_control,
+ uint32_t init_max_send_queue_size,
+ uint32_t init_num_client_tokens,
+ uint32_t init_num_send_tokens):
+ dev(init_dev),
+ client(init_client),
+ do_flow_control(init_do_flow_control),
+ max_send_queue_size(init_max_send_queue_size)
+{
+ if (do_flow_control) {
+ wait_for_tokens_timer =
+ reds_core_timer_add(reds, device_client_wait_for_tokens_timeout, this);
+ if (!wait_for_tokens_timer) {
+ spice_error("failed to create wait for tokens timer");
+ }
+ num_client_tokens = init_num_client_tokens;
+ num_send_tokens = init_num_send_tokens;
+ } else {
+ num_client_tokens = ~0;
+ num_send_tokens = ~0;
+ }
+}
+
+RedCharDeviceClient::~RedCharDeviceClient() = default;
+
+bool RedCharDevice::client_add(RedCharDeviceClientOpaque *client,
+ int do_flow_control,
+ uint32_t max_send_queue_size,
+ uint32_t num_client_tokens,
+ uint32_t num_send_tokens,
+ int wait_for_migrate_data)
+{
+ RedCharDeviceClient *dev_client;
+
+
+ spice_assert(client);
+
+ if (wait_for_migrate_data && (priv->clients != nullptr || priv->active)) {
+ spice_warning("can't restore device %p from migration data. The device "
+ "has already been active", this);
+ return FALSE;
+ }
+
+ priv->wait_for_migrate_data = wait_for_migrate_data;
+
+ spice_debug("char device %p, client %p", this, client);
+ dev_client = new RedCharDeviceClient(this,
+ priv->reds,
+ client,
+ !!do_flow_control,
+ max_send_queue_size,
+ num_client_tokens,
+ num_send_tokens);
+ priv->clients = g_list_prepend(priv->clients, dev_client);
+ /* Now that we have a client, forward any pending device data */
+ wakeup();
+ return TRUE;
+}
+
+void RedCharDevice::client_remove(RedCharDeviceClientOpaque *client)
+{
+ RedCharDeviceClient *dev_client;
+
+ spice_debug("char device %p, client %p", this, client);
+ dev_client = red_char_device_client_find(this, client);
+
+ if (!dev_client) {
+ spice_error("client wasn't found");
+ return;
+ }
+ red_char_device_client_free(this, dev_client);
+ if (priv->wait_for_migrate_data) {
+ spice_assert(priv->clients == nullptr);
+ priv->wait_for_migrate_data = FALSE;
+ red_char_device_read_from_device(this);
+ }
+}
+
+int RedCharDevice::client_exists(RedCharDeviceClientOpaque *client)
+{
+ return (red_char_device_client_find(this, client) != nullptr);
+}
+
+void RedCharDevice::start()
+{
+ spice_debug("char device %p", this);
+ priv->running = TRUE;
+ red::shared_ptr<RedCharDevice> hold_dev(this);
+ while (write_to_device() ||
+ red_char_device_read_from_device(this));
+}
+
+void RedCharDevice::stop()
+{
+ spice_debug("char device %p", this);
+ priv->running = FALSE;
+ priv->active = FALSE;
+ if (priv->write_to_dev_timer) {
+ red_timer_cancel(priv->write_to_dev_timer);
+ }
+}
+
+void RedCharDevice::reset()
+{
+ RedCharDeviceClient *dev_client;
+ RedCharDeviceWriteBuffer *buf;
+
+ priv->wait_for_migrate_data = FALSE;
+ spice_debug("char device %p", this);
+ while ((buf = static_cast<RedCharDeviceWriteBuffer *>(g_queue_pop_tail(&priv->write_queue)))) {
+ write_buffer_release(&buf);
+ }
+ write_buffer_release(&priv->cur_write_buf);
+
+ GLIST_FOREACH(priv->clients, RedCharDeviceClient, dev_client) {
+ spice_debug("send_queue_empty %d", dev_client->send_queue.empty());
+ dev_client->num_send_tokens += dev_client->send_queue.size();
+ dev_client->send_queue.clear();
+
+ /* If device is reset, we must reset the tokens counters as well as we
+ * don't hold any data from client and upon agent's reconnection we send
+ * SPICE_MSG_MAIN_AGENT_CONNECTED_TOKENS with all free tokens we have */
+ dev_client->num_client_tokens += dev_client->num_client_tokens_free;
+ dev_client->num_client_tokens_free = 0;
+ }
+}
+
+void RedCharDevice::wakeup()
+{
+ write_to_device();
+ red_char_device_read_from_device(this);
+}
+
+/*************
+ * Migration *
+ * **********/
+
+void RedCharDevice::migrate_data_marshall_empty(SpiceMarshaller *m)
+{
+ SpiceMigrateDataCharDevice *mig_data;
+
+ spice_debug("trace");
+ mig_data = reinterpret_cast<SpiceMigrateDataCharDevice *>(
+ spice_marshaller_reserve_space(m, sizeof(*mig_data)));
+ memset(mig_data, 0, sizeof(*mig_data));
+ mig_data->version = SPICE_MIGRATE_DATA_CHAR_DEVICE_VERSION;
+ mig_data->connected = FALSE;
+}
+
+static void migrate_data_marshaller_write_buffer_free(uint8_t *data, void *opaque)
+{
+ auto write_buf = static_cast<RedCharDeviceWriteBuffer *>(opaque);
+
+ red_char_device_write_buffer_unref(write_buf);
+}
+
+void RedCharDevice::migrate_data_marshall(SpiceMarshaller *m)
+{
+ RedCharDeviceClient *dev_client;
+ GList *item;
+ uint8_t *write_to_dev_sizes_ptr;
+ uint32_t write_to_dev_size;
+ uint32_t write_to_dev_tokens;
+ SpiceMarshaller *m2;
+
+ /* multi-clients are not supported */
+ spice_assert(g_list_length(priv->clients) == 1);
+ dev_client = static_cast<RedCharDeviceClient *>(g_list_last(priv->clients)->data);
+ /* FIXME: if there were more than one client before the marshalling,
+ * it is possible that the send_queue length > 0, and the send data
+ * should be migrated as well */
+ spice_assert(dev_client->send_queue.empty());
+ spice_marshaller_add_uint32(m, SPICE_MIGRATE_DATA_CHAR_DEVICE_VERSION);
+ spice_marshaller_add_uint8(m, 1); /* connected */
+ spice_marshaller_add_uint32(m, dev_client->num_client_tokens);
+ spice_marshaller_add_uint32(m, dev_client->num_send_tokens);
+ write_to_dev_sizes_ptr = spice_marshaller_reserve_space(m, sizeof(uint32_t)*2);
+ write_to_dev_size = 0;
+ write_to_dev_tokens = 0;
+
+ m2 = spice_marshaller_get_ptr_submarshaller(m);
+ if (priv->cur_write_buf) {
+ uint32_t buf_remaining = priv->cur_write_buf->buf + priv->cur_write_buf->buf_used -
+ priv->cur_write_buf_pos;
+ spice_marshaller_add_by_ref_full(m2, priv->cur_write_buf_pos, buf_remaining,
+ migrate_data_marshaller_write_buffer_free,
+ red_char_device_write_buffer_ref(priv->cur_write_buf)
+ );
+ write_to_dev_size += buf_remaining;
+ if (priv->cur_write_buf->priv->origin == WRITE_BUFFER_ORIGIN_CLIENT) {
+ spice_assert(priv->cur_write_buf->priv->client == dev_client->client);
+ write_to_dev_tokens += priv->cur_write_buf->priv->token_price;
+ }
+ }
+
+ for (item = g_queue_peek_tail_link(&priv->write_queue); item != nullptr; item = item->prev) {
+ auto write_buf = static_cast<RedCharDeviceWriteBuffer *>(item->data);
+
+ spice_marshaller_add_by_ref_full(m2, write_buf->buf, write_buf->buf_used,
+ migrate_data_marshaller_write_buffer_free,
+ red_char_device_write_buffer_ref(write_buf)
+ );
+ write_to_dev_size += write_buf->buf_used;
+ if (write_buf->priv->origin == WRITE_BUFFER_ORIGIN_CLIENT) {
+ spice_assert(write_buf->priv->client == dev_client->client);
+ write_to_dev_tokens += write_buf->priv->token_price;
+ }
+ }
+ spice_debug("migration data dev %p: write_queue size %u tokens %u",
+ this, write_to_dev_size, write_to_dev_tokens);
+ spice_marshaller_set_uint32(m, write_to_dev_sizes_ptr, write_to_dev_size);
+ spice_marshaller_set_uint32(m, write_to_dev_sizes_ptr + sizeof(uint32_t), write_to_dev_tokens);
+}
+
+bool RedCharDevice::restore(SpiceMigrateDataCharDevice *mig_data)
+{
+ RedCharDeviceClient *dev_client;
+ uint32_t client_tokens_window;
+
+ spice_assert(g_list_length(priv->clients) == 1 &&
+ priv->wait_for_migrate_data);
+
+ dev_client = static_cast<RedCharDeviceClient *>(g_list_last(priv->clients)->data);
+ if (mig_data->version > SPICE_MIGRATE_DATA_CHAR_DEVICE_VERSION) {
+ spice_error("dev %p error: migration data version %u is bigger than self %u",
+ this, mig_data->version, SPICE_MIGRATE_DATA_CHAR_DEVICE_VERSION);
+ return FALSE;
+ }
+ spice_assert(!priv->cur_write_buf && g_queue_is_empty(&priv->write_queue));
+ spice_assert(mig_data->connected);
+
+ client_tokens_window = dev_client->num_client_tokens; /* initial state of tokens */
+ dev_client->num_client_tokens = mig_data->num_client_tokens;
+ /* assumption: client_tokens_window stays the same across severs */
+ dev_client->num_client_tokens_free = client_tokens_window -
+ mig_data->num_client_tokens -
+ mig_data->write_num_client_tokens;
+ dev_client->num_send_tokens = mig_data->num_send_tokens;
+
+ if (mig_data->write_size > 0) {
+ if (mig_data->write_num_client_tokens) {
+ priv->cur_write_buf =
+ red_char_device_write_buffer_get(this, dev_client->client,
+ mig_data->write_size, WRITE_BUFFER_ORIGIN_CLIENT,
+ mig_data->write_num_client_tokens);
+ } else {
+ priv->cur_write_buf =
+ red_char_device_write_buffer_get(this, nullptr,
+ mig_data->write_size, WRITE_BUFFER_ORIGIN_SERVER, 0);
+ }
+ /* the first write buffer contains all the data that was saved for migration */
+ memcpy(priv->cur_write_buf->buf,
+ (reinterpret_cast<uint8_t *>(mig_data)) + mig_data->write_data_ptr -
+ sizeof(SpiceMigrateDataHeader),
+ mig_data->write_size);
+ priv->cur_write_buf->buf_used = mig_data->write_size;
+ priv->cur_write_buf_pos = priv->cur_write_buf->buf;
+ }
+ priv->wait_for_migrate_data = FALSE;
+ write_to_device();
+ red_char_device_read_from_device(this);
+ return TRUE;
+}
+
+SpiceServer* RedCharDevice::get_server()
+{
+ return priv->reds;
+}
+
+SpiceCharDeviceInterface *spice_char_device_get_interface(SpiceCharDeviceInstance *instance)
+{
+ return SPICE_UPCAST(SpiceCharDeviceInterface, instance->base.sif);
+}
+
+
+void RedCharDevice::init_device_instance()
+{
+ SpiceCharDeviceInterface *sif;
+
+ g_return_if_fail(priv->reds);
+
+ red_timer_remove(priv->write_to_dev_timer);
+ priv->write_to_dev_timer = nullptr;
+
+ if (priv->sin == nullptr) {
+ return;
+ }
+
+ sif = spice_char_device_get_interface(priv->sin);
+ if (sif->base.minor_version <= 2 ||
+ !(sif->flags & SPICE_CHAR_DEVICE_NOTIFY_WRITABLE)) {
+ priv->write_to_dev_timer = reds_core_timer_add(priv->reds,
+ RedCharDevice::write_retry,
+ this);
+ if (!priv->write_to_dev_timer) {
+ spice_error("failed creating char dev write timer");
+ }
+ }
+
+ priv->sin->st = this;
+}
+
+RedCharDevice::~RedCharDevice()
+{
+ red_timer_remove(priv->write_to_dev_timer);
+ priv->write_to_dev_timer = nullptr;
+
+ write_buffers_queue_free(&priv->write_queue);
+ red_char_device_write_buffer_free(priv->cur_write_buf);
+ priv->cur_write_buf = nullptr;
+
+ while (priv->clients != nullptr) {
+ auto dev_client = static_cast<RedCharDeviceClient *>(priv->clients->data);
+ red_char_device_client_free(this, dev_client);
+ }
+ priv->running = FALSE;
+}
+
+void
+RedCharDevice::port_event(uint8_t event)
+{
+}
+
+SPICE_GNUC_VISIBLE void spice_server_port_event(SpiceCharDeviceInstance *sin, uint8_t event)
+{
+ if (sin->st == nullptr) {
+ spice_warning("no RedCharDevice attached to instance %p", sin);
+ return;
+ }
+
+ sin->st->port_event(event);
+}
+
+SpiceCharDeviceInstance *RedCharDevice::get_device_instance()
+{
+ return priv->sin;
+}
+
+RedCharDevice::RedCharDevice(RedsState *reds, SpiceCharDeviceInstance *sin,
+ uint64_t client_tokens_interval, uint64_t num_self_tokens)
+{
+ priv->reds = reds;
+ priv->client_tokens_interval = client_tokens_interval;
+ priv->num_self_tokens = num_self_tokens;
+ reset_dev_instance(sin);
+
+ g_queue_init(&priv->write_queue);
+}
+
+int RedCharDevice::read(uint8_t *buf, int len)
+{
+ auto sif = spice_char_device_get_interface(priv->sin);
+
+ int ret = sif->read(priv->sin, buf, len);
+ if (ret > 0) {
+ priv->active = true;
+ }
+ return ret;
+}
diff --git a/server/char-device.h b/server/char-device.h
new file mode 100644
index 00000000..dce9ab8a
--- /dev/null
+++ b/server/char-device.h
@@ -0,0 +1,235 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef CHAR_DEVICE_H_
+#define CHAR_DEVICE_H_
+
+#include "spice-wrapped.h"
+#include "red-channel.h"
+#include "migration-protocol.h"
+#include "utils.hpp"
+
+#include "push-visibility.h"
+
+struct RedCharDevice;
+struct RedCharDevicePrivate;
+struct RedCharDeviceClientOpaque;
+
+/*
+ * Shared code for char devices, mainly for flow control.
+ *
+ * How to use the api:
+ * ==================
+ * device attached: create new object instantiating a RedCharDevice child class
+ * device detached: unreference/RedCharDevice::reset
+ *
+ * client connected and associated with a device: RedCharDevice::client_add
+ * client disconnected: RedCharDevice::client_remove
+ *
+ * Writing to the device
+ * ---------------------
+ * Write the data into RedCharDeviceWriteBuffer:
+ * call RedCharDevice::write_buffer_get_client/RedCharDevice::write_buffer_get_server
+ * in order to get an appropriate buffer.
+ * call RedCharDevice::write_buffer_add in order to push the buffer to the write queue.
+ * If you choose not to push the buffer to the device, call
+ * RedCharDevice::write_buffer_release
+ *
+ * reading from the device
+ * -----------------------
+ * The callback read_one_msg_from_device (see below) should be implemented
+ * (using sif->read).
+ * When the device is ready, this callback is called, and is expected to
+ * return one message which is addressed to the client, or NULL if the read
+ * hasn't completed.
+ *
+ * calls triggered from the device (qemu):
+ * --------------------------------------
+ * RedCharDevice::start
+ * RedCharDevice::stop
+ * RedCharDevice::wakeup (for reading from the device)
+ */
+/* refcounting is used to protect the char_dev from being deallocated in
+ * case object is unreferenced during a callback, and we might still access
+ * the char_dev afterwards.
+ */
+
+
+/*
+ * Note about multiple-clients:
+ * Multiclients are currently not supported in any of the character devices:
+ * spicevmc does not allow more than one client (and at least for usb, it should stay this way).
+ * smartcard code is not compatible with more than one reader.
+ * The server and guest agent code doesn't distinguish messages from different clients.
+ * In addition, its current flow control code (e.g., tokens handling) is wrong and doesn't
+ * take into account the different clients.
+ *
+ * Nonetheless, the following code introduces some support for multiple-clients:
+ * We track the number of tokens for all the clients, and we read from the device
+ * if one of the clients have enough tokens. For the clients that don't have tokens,
+ * we queue the messages, till they receive tokens, or till a timeout.
+ *
+ * TODO:
+ * At least for the agent, not all the messages from the device will be directed to all
+ * the clients (e.g., copy from guest to a specific client). Thus, support for
+ * client-specific-messages should be added.
+ * In addition, we should have support for clients that are being connected
+ * in the middle of a message transfer from the agent to the clients.
+ *
+ * */
+
+/* buffer that is used for writing to the device */
+struct RedCharDeviceWriteBufferPrivate;
+struct RedCharDeviceWriteBuffer {
+ uint32_t buf_size;
+ uint32_t buf_used;
+
+ RedCharDeviceWriteBufferPrivate *priv;
+ uint8_t buf[0];
+};
+
+
+class RedCharDevice: public red::shared_ptr_counted_weak
+{
+public:
+ RedCharDevice(RedsState *reds, SpiceCharDeviceInstance *sin,
+ uint64_t client_tokens_interval, uint64_t num_self_tokens);
+ ~RedCharDevice();
+
+ void reset_dev_instance(SpiceCharDeviceInstance *sin);
+ /* only one client is supported */
+ void migrate_data_marshall(SpiceMarshaller *m);
+ static void migrate_data_marshall_empty(SpiceMarshaller *m);
+
+ bool restore(SpiceMigrateDataCharDevice *mig_data);
+
+ /*
+ * Resets write/read queues, and moves that state to being stopped.
+ * This routine is a workaround for a bad tokens management in the vdagent
+ * protocol:
+ * The client tokens' are set only once, when the main channel is initialized.
+ * Instead, it would have been more appropriate to reset them upon AGENT_CONNECT.
+ * The client tokens are tracked as part of the RedCharDeviceClient. Thus,
+ * in order to be backward compatible with the client, we need to track the tokens
+ * event when the agent is detached. We don't destroy the char_device state, and
+ * instead we just reset it.
+ * In addition, there is a misshandling of AGENT_TOKENS message in spice-gtk: it
+ * overrides the amount of tokens, instead of adding the given amount.
+ */
+ void reset();
+
+ /* max_send_queue_size = how many messages we can read from the device and enqueue for this client,
+ * when we have tokens for other clients and no tokens for this one */
+ bool client_add(RedCharDeviceClientOpaque *client, int do_flow_control,
+ uint32_t max_send_queue_size, uint32_t num_client_tokens,
+ uint32_t num_send_tokens, int wait_for_migrate_data);
+
+ void client_remove(RedCharDeviceClientOpaque *client);
+ int client_exists(RedCharDeviceClientOpaque *client);
+
+ void start();
+ void stop();
+ SpiceServer* get_server();
+
+ /** Read from device **/
+
+ void wakeup();
+
+ void send_to_client_tokens_add(RedCharDeviceClientOpaque *client,
+ uint32_t tokens);
+
+
+ void send_to_client_tokens_set(RedCharDeviceClientOpaque *client,
+ uint32_t tokens);
+ /** Write to device **/
+
+ RedCharDeviceWriteBuffer *write_buffer_get_client(RedCharDeviceClientOpaque *client,
+ int size);
+
+ /* Returns NULL if use_token == true and no tokens are available */
+ RedCharDeviceWriteBuffer *write_buffer_get_server(int size, bool use_token);
+
+ /* Either add the buffer to the write queue or release it */
+ void write_buffer_add(RedCharDeviceWriteBuffer *write_buf);
+
+ /* Release a buffer allocated.
+ * This is static as potentially you can pass a null pointer for the object */
+ static void write_buffer_release(RedCharDevice *dev,
+ RedCharDeviceWriteBuffer **p_write_buf);
+
+ SpiceCharDeviceInstance *get_device_instance();
+
+ /**
+ * Read data from device
+ */
+ int read(uint8_t *buf, int len);
+
+ red::unique_link<RedCharDevicePrivate> priv;
+
+//protected:
+public:
+ /*
+ * Messages that are addressed to the client can be queued in case we have
+ * multiple clients and some of them don't have enough tokens.
+ */
+
+ /* reads from the device till reaching a msg that should be sent to the client,
+ * or till the reading fails */
+ virtual RedPipeItemPtr read_one_msg_from_device() = 0;
+
+ /* After this call, the message is unreferenced.
+ * Can be NULL. */
+ virtual void send_msg_to_client(RedPipeItem *msg, RedCharDeviceClientOpaque *client) {};
+
+ /* The cb is called when a predefined number of write buffers were consumed by the
+ * device */
+ virtual void send_tokens_to_client(RedCharDeviceClientOpaque *client, uint32_t tokens);
+
+ /* The cb is called when a server (self) message that was addressed to the device,
+ * has been completely written to it */
+ virtual void on_free_self_token() {};
+
+ /* This cb is called if it is recommended to remove the client
+ * due to slow flow or due to some other error.
+ * The called instance should disconnect the client, or at least the corresponding channel */
+ virtual void remove_client(RedCharDeviceClientOpaque *client) = 0;
+
+ /* This cb is called when device receives an event */
+ virtual void port_event(uint8_t event);
+
+private:
+ inline void write_buffer_release(RedCharDeviceWriteBuffer **p_write_buf)
+ {
+ write_buffer_release(this, p_write_buf);
+ }
+ int write_to_device();
+ void init_device_instance();
+
+ static void write_retry(RedCharDevice *dev);
+};
+
+/* api for specific char devices */
+
+red::shared_ptr<RedCharDevice>
+spicevmc_device_connect(RedsState *reds, SpiceCharDeviceInstance *sin, uint8_t channel_type);
+
+SpiceCharDeviceInterface *spice_char_device_get_interface(SpiceCharDeviceInstance *instance);
+
+#include "pop-visibility.h"
+
+#endif /* CHAR_DEVICE_H_ */
diff --git a/server/char_device.c b/server/char_device.c
deleted file mode 100644
index 660a7884..00000000
--- a/server/char_device.c
+++ /dev/null
@@ -1,980 +0,0 @@
-/* spice-server char device flow control code
-
- Copyright (C) 2012 Red Hat, Inc.
-
- Red Hat Authors:
- Yonit Halperin <yhalperi@redhat.com>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http:www.gnu.org/licenses/>.
-*/
-
-
-#include <config.h>
-#include "char_device.h"
-#include "red_channel.h"
-#include "reds.h"
-
-#define CHAR_DEVICE_WRITE_TO_TIMEOUT 100
-#define SPICE_CHAR_DEVICE_WAIT_TOKENS_TIMEOUT 30000
-
-typedef struct SpiceCharDeviceClientState SpiceCharDeviceClientState;
-struct SpiceCharDeviceClientState {
- RingItem link;
- SpiceCharDeviceState *dev;
- RedClient *client;
- int do_flow_control;
- uint64_t num_client_tokens;
- uint64_t num_client_tokens_free; /* client messages that were consumed by the device */
- uint64_t num_send_tokens; /* send to client */
- SpiceTimer *wait_for_tokens_timer;
- int wait_for_tokens_started;
- Ring send_queue;
- uint32_t send_queue_size;
- uint32_t max_send_queue_size;
-};
-
-struct SpiceCharDeviceState {
- int running;
- int active; /* has read/write been performed since the device was started */
- int wait_for_migrate_data;
- uint32_t refs;
-
- Ring write_queue;
- Ring write_bufs_pool;
- SpiceCharDeviceWriteBuffer *cur_write_buf;
- uint8_t *cur_write_buf_pos;
- SpiceTimer *write_to_dev_timer;
- uint64_t num_self_tokens;
-
- Ring clients; /* list of SpiceCharDeviceClientState */
- uint32_t num_clients;
-
- uint64_t client_tokens_interval; /* frequency of returning tokens to the client */
- SpiceCharDeviceInstance *sin;
-
- int during_read_from_device;
-
- SpiceCharDeviceCallbacks cbs;
- void *opaque;
-};
-
-enum {
- WRITE_BUFFER_ORIGIN_NONE,
- WRITE_BUFFER_ORIGIN_CLIENT,
- WRITE_BUFFER_ORIGIN_SERVER,
- WRITE_BUFFER_ORIGIN_SERVER_NO_TOKEN,
-};
-
-/* Holding references for avoiding access violation if the char device was
- * destroyed during a callback */
-static void spice_char_device_state_ref(SpiceCharDeviceState *char_dev);
-static void spice_char_device_state_unref(SpiceCharDeviceState *char_dev);
-
-static void spice_char_dev_write_retry(void *opaque);
-
-typedef struct SpiceCharDeviceMsgToClientItem {
- RingItem link;
- SpiceCharDeviceMsgToClient *msg;
-} SpiceCharDeviceMsgToClientItem;
-
-static void spice_char_device_write_buffer_free(SpiceCharDeviceWriteBuffer *buf)
-{
- if (--buf->refs == 0) {
- free(buf->buf);
- free(buf);
- }
-}
-
-static void write_buffers_queue_free(Ring *write_queue)
-{
- while (!ring_is_empty(write_queue)) {
- RingItem *item = ring_get_tail(write_queue);
- SpiceCharDeviceWriteBuffer *buf;
-
- ring_remove(item);
- buf = SPICE_CONTAINEROF(item, SpiceCharDeviceWriteBuffer, link);
- spice_char_device_write_buffer_free(buf);
- }
-}
-
-static void spice_char_device_write_buffer_pool_add(SpiceCharDeviceState *dev,
- SpiceCharDeviceWriteBuffer *buf)
-{
- if (buf->refs == 1) {
- buf->buf_used = 0;
- buf->origin = WRITE_BUFFER_ORIGIN_NONE;
- buf->client = NULL;
- ring_add(&dev->write_bufs_pool, &buf->link);
- } else {
- --buf->refs;
- }
-}
-
-static void spice_char_device_client_send_queue_free(SpiceCharDeviceState *dev,
- SpiceCharDeviceClientState *dev_client)
-{
- spice_debug("send_queue_empty %d", ring_is_empty(&dev_client->send_queue));
- while (!ring_is_empty(&dev_client->send_queue)) {
- RingItem *item = ring_get_tail(&dev_client->send_queue);
- SpiceCharDeviceMsgToClientItem *msg_item = SPICE_CONTAINEROF(item,
- SpiceCharDeviceMsgToClientItem,
- link);
-
- ring_remove(item);
- dev->cbs.unref_msg_to_client(msg_item->msg, dev->opaque);
- free(msg_item);
- }
- dev_client->num_send_tokens += dev_client->send_queue_size;
- dev_client->send_queue_size = 0;
-}
-
-static void spice_char_device_client_free(SpiceCharDeviceState *dev,
- SpiceCharDeviceClientState *dev_client)
-{
- RingItem *item, *next;
-
- if (dev_client->wait_for_tokens_timer) {
- core->timer_remove(dev_client->wait_for_tokens_timer);
- }
-
- spice_char_device_client_send_queue_free(dev, dev_client);
-
- /* remove write buffers that are associated with the client */
- spice_debug("write_queue_is_empty %d", ring_is_empty(&dev->write_queue) && !dev->cur_write_buf);
- RING_FOREACH_SAFE(item, next, &dev->write_queue) {
- SpiceCharDeviceWriteBuffer *write_buf;
-
- write_buf = SPICE_CONTAINEROF(item, SpiceCharDeviceWriteBuffer, link);
- if (write_buf->origin == WRITE_BUFFER_ORIGIN_CLIENT &&
- write_buf->client == dev_client->client) {
- ring_remove(item);
- spice_char_device_write_buffer_pool_add(dev, write_buf);
- }
- }
-
- if (dev->cur_write_buf && dev->cur_write_buf->origin == WRITE_BUFFER_ORIGIN_CLIENT &&
- dev->cur_write_buf->client == dev_client->client) {
- dev->cur_write_buf->origin = WRITE_BUFFER_ORIGIN_NONE;
- dev->cur_write_buf->client = NULL;
- }
-
- dev->num_clients--;
- ring_remove(&dev_client->link);
- free(dev_client);
-}
-
-static void spice_char_device_handle_client_overflow(SpiceCharDeviceClientState *dev_client)
-{
- SpiceCharDeviceState *dev = dev_client->dev;
- spice_printerr("dev %p client %p ", dev, dev_client);
- dev->cbs.remove_client(dev_client->client, dev->opaque);
-}
-
-static SpiceCharDeviceClientState *spice_char_device_client_find(SpiceCharDeviceState *dev,
- RedClient *client)
-{
- RingItem *item;
-
- RING_FOREACH(item, &dev->clients) {
- SpiceCharDeviceClientState *dev_client;
-
- dev_client = SPICE_CONTAINEROF(item, SpiceCharDeviceClientState, link);
- if (dev_client->client == client) {
- return dev_client;
- }
- }
- return NULL;
-}
-
-/***************************
- * Reading from the device *
- **************************/
-
-static void device_client_wait_for_tokens_timeout(void *opaque)
-{
- SpiceCharDeviceClientState *dev_client = opaque;
-
- spice_char_device_handle_client_overflow(dev_client);
-}
-
-static int spice_char_device_can_send_to_client(SpiceCharDeviceClientState *dev_client)
-{
- return !dev_client->do_flow_control || dev_client->num_send_tokens;
-}
-
-static uint64_t spice_char_device_max_send_tokens(SpiceCharDeviceState *dev)
-{
- RingItem *item;
- uint64_t max = 0;
-
- RING_FOREACH(item, &dev->clients) {
- SpiceCharDeviceClientState *dev_client;
-
- dev_client = SPICE_CONTAINEROF(item, SpiceCharDeviceClientState, link);
-
- if (!dev_client->do_flow_control) {
- max = ~0;
- break;
- }
-
- if (dev_client->num_send_tokens > max) {
- max = dev_client->num_send_tokens;
- }
- }
- return max;
-}
-
-static void spice_char_device_add_msg_to_client_queue(SpiceCharDeviceClientState *dev_client,
- SpiceCharDeviceMsgToClient *msg)
-{
- SpiceCharDeviceState *dev = dev_client->dev;
- SpiceCharDeviceMsgToClientItem *msg_item;
-
- if (dev_client->send_queue_size >= dev_client->max_send_queue_size) {
- spice_char_device_handle_client_overflow(dev_client);
- return;
- }
-
- msg_item = spice_new0(SpiceCharDeviceMsgToClientItem, 1);
- msg_item->msg = dev->cbs.ref_msg_to_client(msg, dev->opaque);
- ring_add(&dev_client->send_queue, &msg_item->link);
- dev_client->send_queue_size++;
- if (!dev_client->wait_for_tokens_started) {
- core->timer_start(dev_client->wait_for_tokens_timer,
- SPICE_CHAR_DEVICE_WAIT_TOKENS_TIMEOUT);
- dev_client->wait_for_tokens_started = TRUE;
- }
-}
-
-static void spice_char_device_send_msg_to_clients(SpiceCharDeviceState *dev,
- SpiceCharDeviceMsgToClient *msg)
-{
- RingItem *item, *next;
-
- RING_FOREACH_SAFE(item, next, &dev->clients) {
- SpiceCharDeviceClientState *dev_client;
-
- dev_client = SPICE_CONTAINEROF(item, SpiceCharDeviceClientState, link);
- if (spice_char_device_can_send_to_client(dev_client)) {
- dev_client->num_send_tokens--;
- spice_assert(ring_is_empty(&dev_client->send_queue));
- dev->cbs.send_msg_to_client(msg, dev_client->client, dev->opaque);
-
- /* don't refer to dev_client anymore, it may have been released */
- } else {
- spice_char_device_add_msg_to_client_queue(dev_client, msg);
- }
- }
-}
-
-static int spice_char_device_read_from_device(SpiceCharDeviceState *dev)
-{
- uint64_t max_send_tokens;
- int did_read = FALSE;
-
- if (!dev->running || dev->wait_for_migrate_data) {
- return FALSE;
- }
-
- /* There are 2 scenarios where we can get called recursively:
- * 1) spice-vmc vmc_read triggering flush of throttled data, recalling wakeup
- * (virtio)
- * 2) in case of sending messages to the client, and unreferencing the
- * msg, we trigger another read.
- */
- if (dev->during_read_from_device++ > 0) {
- return FALSE;
- }
-
- max_send_tokens = spice_char_device_max_send_tokens(dev);
- spice_char_device_state_ref(dev);
- /*
- * Reading from the device only in case at least one of the clients have a free token.
- * All messages will be discarded if no client is attached to the device
- */
- while ((max_send_tokens || ring_is_empty(&dev->clients)) && dev->running) {
- SpiceCharDeviceMsgToClient *msg;
-
- msg = dev->cbs.read_one_msg_from_device(dev->sin, dev->opaque);
- if (!msg) {
- if (dev->during_read_from_device > 1) {
- dev->during_read_from_device = 1;
- continue; /* a wakeup might have been called during the read -
- make sure it doesn't get lost */
- }
- break;
- }
- did_read = TRUE;
- spice_char_device_send_msg_to_clients(dev, msg);
- dev->cbs.unref_msg_to_client(msg, dev->opaque);
- max_send_tokens--;
- }
- dev->during_read_from_device = 0;
- if (dev->running) {
- dev->active = dev->active || did_read;
- }
- spice_char_device_state_unref(dev);
- return did_read;
-}
-
-static void spice_char_device_client_send_queue_push(SpiceCharDeviceClientState *dev_client)
-{
- RingItem *item;
- while ((item = ring_get_tail(&dev_client->send_queue)) &&
- spice_char_device_can_send_to_client(dev_client)) {
- SpiceCharDeviceMsgToClientItem *msg_item;
-
- msg_item = SPICE_CONTAINEROF(item, SpiceCharDeviceMsgToClientItem, link);
- ring_remove(item);
-
- dev_client->num_send_tokens--;
- dev_client->dev->cbs.send_msg_to_client(msg_item->msg,
- dev_client->client,
- dev_client->dev->opaque);
- dev_client->dev->cbs.unref_msg_to_client(msg_item->msg, dev_client->dev->opaque);
- dev_client->send_queue_size--;
- free(msg_item);
- }
-}
-
-static void spice_char_device_send_to_client_tokens_absorb(SpiceCharDeviceClientState *dev_client,
- uint32_t tokens)
-{
- dev_client->num_send_tokens += tokens;
-
- if (dev_client->send_queue_size) {
- spice_assert(dev_client->num_send_tokens == tokens);
- spice_char_device_client_send_queue_push(dev_client);
- }
-
- if (spice_char_device_can_send_to_client(dev_client)) {
- core->timer_cancel(dev_client->wait_for_tokens_timer);
- dev_client->wait_for_tokens_started = FALSE;
- spice_char_device_read_from_device(dev_client->dev);
- } else if (dev_client->send_queue_size) {
- core->timer_start(dev_client->wait_for_tokens_timer,
- SPICE_CHAR_DEVICE_WAIT_TOKENS_TIMEOUT);
- dev_client->wait_for_tokens_started = TRUE;
- }
-}
-
-void spice_char_device_send_to_client_tokens_add(SpiceCharDeviceState *dev,
- RedClient *client,
- uint32_t tokens)
-{
- SpiceCharDeviceClientState *dev_client;
-
- dev_client = spice_char_device_client_find(dev, client);
-
- if (!dev_client) {
- spice_error("client wasn't found dev %p client %p", dev, client);
- return;
- }
- spice_char_device_send_to_client_tokens_absorb(dev_client, tokens);
-}
-
-void spice_char_device_send_to_client_tokens_set(SpiceCharDeviceState *dev,
- RedClient *client,
- uint32_t tokens)
-{
- SpiceCharDeviceClientState *dev_client;
-
- dev_client = spice_char_device_client_find(dev, client);
-
- if (!dev_client) {
- spice_error("client wasn't found dev %p client %p", dev, client);
- return;
- }
-
- dev_client->num_send_tokens = 0;
- spice_char_device_send_to_client_tokens_absorb(dev_client, tokens);
-}
-
-/**************************
- * Writing to the device *
-***************************/
-
-static void spice_char_device_client_tokens_add(SpiceCharDeviceState *dev,
- SpiceCharDeviceClientState *dev_client,
- uint32_t num_tokens)
-{
- if (!dev_client->do_flow_control) {
- return;
- }
- if (num_tokens > 1) {
- spice_debug("#tokens > 1 (=%u)", num_tokens);
- }
- dev_client->num_client_tokens_free += num_tokens;
- if (dev_client->num_client_tokens_free >= dev->client_tokens_interval) {
- uint32_t tokens = dev_client->num_client_tokens_free;
-
- dev_client->num_client_tokens += dev_client->num_client_tokens_free;
- dev_client->num_client_tokens_free = 0;
- dev->cbs.send_tokens_to_client(dev_client->client,
- tokens,
- dev->opaque);
- }
-}
-
-static int spice_char_device_write_to_device(SpiceCharDeviceState *dev)
-{
- SpiceCharDeviceInterface *sif;
- int total = 0;
- int n;
-
- if (!dev->running || dev->wait_for_migrate_data) {
- return 0;
- }
-
- spice_char_device_state_ref(dev);
- core->timer_cancel(dev->write_to_dev_timer);
-
- sif = SPICE_CONTAINEROF(dev->sin->base.sif, SpiceCharDeviceInterface, base);
- while (dev->running) {
- uint32_t write_len;
-
- if (!dev->cur_write_buf) {
- RingItem *item = ring_get_tail(&dev->write_queue);
- if (!item) {
- break;
- }
- dev->cur_write_buf = SPICE_CONTAINEROF(item, SpiceCharDeviceWriteBuffer, link);
- dev->cur_write_buf_pos = dev->cur_write_buf->buf;
- ring_remove(item);
- }
-
- write_len = dev->cur_write_buf->buf + dev->cur_write_buf->buf_used -
- dev->cur_write_buf_pos;
- n = sif->write(dev->sin, dev->cur_write_buf_pos, write_len);
- if (n <= 0) {
- break;
- }
- total += n;
- write_len -= n;
- if (!write_len) {
- SpiceCharDeviceWriteBuffer *release_buf = dev->cur_write_buf;
- dev->cur_write_buf = NULL;
- spice_char_device_write_buffer_release(dev, release_buf);
- continue;
- }
- dev->cur_write_buf_pos += n;
- }
- /* retry writing as long as the write queue is not empty */
- if (dev->running) {
- if (dev->cur_write_buf) {
- core->timer_start(dev->write_to_dev_timer,
- CHAR_DEVICE_WRITE_TO_TIMEOUT);
- } else {
- spice_assert(ring_is_empty(&dev->write_queue));
- }
- dev->active = dev->active || total;
- }
- spice_char_device_state_unref(dev);
- return total;
-}
-
-static void spice_char_dev_write_retry(void *opaque)
-{
- SpiceCharDeviceState *dev = opaque;
-
- core->timer_cancel(dev->write_to_dev_timer);
- spice_char_device_write_to_device(dev);
-}
-
-static SpiceCharDeviceWriteBuffer *__spice_char_device_write_buffer_get(
- SpiceCharDeviceState *dev, RedClient *client,
- int size, int origin, int migrated_data_tokens)
-{
- RingItem *item;
- SpiceCharDeviceWriteBuffer *ret;
-
- if (origin == WRITE_BUFFER_ORIGIN_SERVER && !dev->num_self_tokens) {
- return NULL;
- }
-
- if ((item = ring_get_tail(&dev->write_bufs_pool))) {
- ret = SPICE_CONTAINEROF(item, SpiceCharDeviceWriteBuffer, link);
- ring_remove(item);
- } else {
- ret = spice_new0(SpiceCharDeviceWriteBuffer, 1);
- }
-
- spice_assert(!ret->buf_used);
-
- if (ret->buf_size < size) {
- ret->buf = spice_realloc(ret->buf, size);
- ret->buf_size = size;
- }
- ret->origin = origin;
-
- if (origin == WRITE_BUFFER_ORIGIN_CLIENT) {
- spice_assert(client);
- SpiceCharDeviceClientState *dev_client = spice_char_device_client_find(dev, client);
- if (dev_client) {
- if (!migrated_data_tokens &&
- dev_client->do_flow_control && !dev_client->num_client_tokens) {
- spice_printerr("token violation: dev %p client %p", dev, client);
- spice_char_device_handle_client_overflow(dev_client);
- goto error;
- }
- ret->client = client;
- if (!migrated_data_tokens && dev_client->do_flow_control) {
- dev_client->num_client_tokens--;
- }
- } else {
- /* it is possible that the client was removed due to send tokens underflow, but
- * the caller still receive messages from the client */
- spice_printerr("client not found: dev %p client %p", dev, client);
- goto error;
- }
- } else if (origin == WRITE_BUFFER_ORIGIN_SERVER) {
- dev->num_self_tokens--;
- }
-
- ret->token_price = migrated_data_tokens ? migrated_data_tokens : 1;
- ret->refs = 1;
- return ret;
-error:
- ring_add(&dev->write_bufs_pool, &ret->link);
- return NULL;
-}
-
-SpiceCharDeviceWriteBuffer *spice_char_device_write_buffer_get(SpiceCharDeviceState *dev,
- RedClient *client,
- int size)
-{
- return __spice_char_device_write_buffer_get(dev, client, size,
- client ? WRITE_BUFFER_ORIGIN_CLIENT : WRITE_BUFFER_ORIGIN_SERVER,
- 0);
-}
-
-SpiceCharDeviceWriteBuffer *spice_char_device_write_buffer_get_server_no_token(
- SpiceCharDeviceState *dev, int size)
-{
- return __spice_char_device_write_buffer_get(dev, NULL, size,
- WRITE_BUFFER_ORIGIN_SERVER_NO_TOKEN, 0);
-}
-
-static SpiceCharDeviceWriteBuffer *spice_char_device_write_buffer_ref(SpiceCharDeviceWriteBuffer *write_buf)
-{
- spice_assert(write_buf);
-
- write_buf->refs++;
- return write_buf;
-}
-
-void spice_char_device_write_buffer_add(SpiceCharDeviceState *dev,
- SpiceCharDeviceWriteBuffer *write_buf)
-{
- spice_assert(dev);
- /* caller shouldn't add buffers for client that was removed */
- if (write_buf->origin == WRITE_BUFFER_ORIGIN_CLIENT &&
- !spice_char_device_client_find(dev, write_buf->client)) {
- spice_printerr("client not found: dev %p client %p", dev, write_buf->client);
- spice_char_device_write_buffer_pool_add(dev, write_buf);
- return;
- }
-
- ring_add(&dev->write_queue, &write_buf->link);
- spice_char_device_write_to_device(dev);
-}
-
-void spice_char_device_write_buffer_release(SpiceCharDeviceState *dev,
- SpiceCharDeviceWriteBuffer *write_buf)
-{
- int buf_origin = write_buf->origin;
- uint32_t buf_token_price = write_buf->token_price;
- RedClient *client = write_buf->client;
-
- spice_assert(!ring_item_is_linked(&write_buf->link));
- if (!dev) {
- spice_printerr("no device. write buffer is freed");
- free(write_buf->buf);
- free(write_buf);
- return;
- }
-
- spice_assert(dev->cur_write_buf != write_buf);
-
- spice_char_device_write_buffer_pool_add(dev, write_buf);
- if (buf_origin == WRITE_BUFFER_ORIGIN_CLIENT) {
- SpiceCharDeviceClientState *dev_client;
-
- spice_assert(client);
- dev_client = spice_char_device_client_find(dev, client);
- /* when a client is removed, we remove all the buffers that are associated with it */
- spice_assert(dev_client);
- spice_char_device_client_tokens_add(dev, dev_client, buf_token_price);
- } else if (buf_origin == WRITE_BUFFER_ORIGIN_SERVER) {
- dev->num_self_tokens++;
- if (dev->cbs.on_free_self_token) {
- dev->cbs.on_free_self_token(dev->opaque);
- }
- }
-}
-
-/********************************
- * char_device_state management *
- ********************************/
-
-SpiceCharDeviceState *spice_char_device_state_create(SpiceCharDeviceInstance *sin,
- uint32_t client_tokens_interval,
- uint32_t self_tokens,
- SpiceCharDeviceCallbacks *cbs,
- void *opaque)
-{
- SpiceCharDeviceState *char_dev;
-
- spice_assert(sin);
- spice_assert(cbs->read_one_msg_from_device && cbs->ref_msg_to_client &&
- cbs->unref_msg_to_client && cbs->send_msg_to_client &&
- cbs->send_tokens_to_client && cbs->remove_client);
-
- char_dev = spice_new0(SpiceCharDeviceState, 1);
- char_dev->sin = sin;
- char_dev->cbs = *cbs;
- char_dev->opaque = opaque;
- char_dev->client_tokens_interval = client_tokens_interval;
- char_dev->num_self_tokens = self_tokens;
-
- ring_init(&char_dev->write_queue);
- ring_init(&char_dev->write_bufs_pool);
- ring_init(&char_dev->clients);
-
- char_dev->write_to_dev_timer = core->timer_add(spice_char_dev_write_retry, char_dev);
- if (!char_dev->write_to_dev_timer) {
- spice_error("failed creating char dev write timer");
- }
- char_dev->refs = 1;
- sin->st = char_dev;
- spice_debug("sin %p dev_state %p", sin, char_dev);
- return char_dev;
-}
-
-void spice_char_device_state_reset_dev_instance(SpiceCharDeviceState *state,
- SpiceCharDeviceInstance *sin)
-{
- spice_debug("sin %p dev_state %p", sin, state);
- state->sin = sin;
- sin->st = state;
-}
-
-void *spice_char_device_state_opaque_get(SpiceCharDeviceState *dev)
-{
- return dev->opaque;
-}
-
-static void spice_char_device_state_ref(SpiceCharDeviceState *char_dev)
-{
- char_dev->refs++;
-}
-
-static void spice_char_device_state_unref(SpiceCharDeviceState *char_dev)
-{
- /* The refs field protects the char_dev from being deallocated in
- * case spice_char_device_state_destroy has been called
- * during a callabck, and we might still access the char_dev afterwards.
- * spice_char_device_state_unref is always coupled with a preceding
- * spice_char_device_state_ref. Here, refs can turn 0
- * only when spice_char_device_state_destroy is called in between
- * the calls to spice_char_device_state_ref and spice_char_device_state_unref.*/
- if (!--char_dev->refs) {
- free(char_dev);
- }
-}
-
-void spice_char_device_state_destroy(SpiceCharDeviceState *char_dev)
-{
- reds_on_char_device_state_destroy(char_dev);
- core->timer_remove(char_dev->write_to_dev_timer);
- write_buffers_queue_free(&char_dev->write_queue);
- write_buffers_queue_free(&char_dev->write_bufs_pool);
- if (char_dev->cur_write_buf) {
- spice_char_device_write_buffer_free(char_dev->cur_write_buf);
- }
-
- while (!ring_is_empty(&char_dev->clients)) {
- RingItem *item = ring_get_tail(&char_dev->clients);
- SpiceCharDeviceClientState *dev_client;
-
- dev_client = SPICE_CONTAINEROF(item, SpiceCharDeviceClientState, link);
- spice_char_device_client_free(char_dev, dev_client);
- }
- char_dev->running = FALSE;
-
- spice_char_device_state_unref(char_dev);
-}
-
-int spice_char_device_client_add(SpiceCharDeviceState *dev,
- RedClient *client,
- int do_flow_control,
- uint32_t max_send_queue_size,
- uint32_t num_client_tokens,
- uint32_t num_send_tokens,
- int wait_for_migrate_data)
-{
- SpiceCharDeviceClientState *dev_client;
-
- spice_assert(dev);
- spice_assert(client);
-
- if (wait_for_migrate_data && (dev->num_clients > 0 || dev->active)) {
- spice_warning("can't restore device %p from migration data. The device "
- "has already been active", dev);
- return FALSE;
- }
-
- dev->wait_for_migrate_data = wait_for_migrate_data;
-
- spice_debug("dev_state %p client %p", dev, client);
- dev_client = spice_new0(SpiceCharDeviceClientState, 1);
- dev_client->dev = dev;
- dev_client->client = client;
- ring_init(&dev_client->send_queue);
- dev_client->send_queue_size = 0;
- dev_client->max_send_queue_size = max_send_queue_size;
- dev_client->do_flow_control = do_flow_control;
- if (do_flow_control) {
- dev_client->wait_for_tokens_timer = core->timer_add(device_client_wait_for_tokens_timeout,
- dev_client);
- if (!dev_client->wait_for_tokens_timer) {
- spice_error("failed to create wait for tokens timer");
- }
- dev_client->num_client_tokens = num_client_tokens;
- dev_client->num_send_tokens = num_send_tokens;
- } else {
- dev_client->num_client_tokens = ~0;
- dev_client->num_send_tokens = ~0;
- }
- ring_add(&dev->clients, &dev_client->link);
- dev->num_clients++;
- /* Now that we have a client, forward any pending device data */
- spice_char_device_wakeup(dev);
- return TRUE;
-}
-
-void spice_char_device_client_remove(SpiceCharDeviceState *dev,
- RedClient *client)
-{
- SpiceCharDeviceClientState *dev_client;
-
- spice_debug("dev_state %p client %p", dev, client);
- dev_client = spice_char_device_client_find(dev, client);
-
- if (!dev_client) {
- spice_error("client wasn't found");
- return;
- }
- spice_char_device_client_free(dev, dev_client);
- if (dev->wait_for_migrate_data) {
- spice_assert(dev->num_clients == 0);
- dev->wait_for_migrate_data = FALSE;
- spice_char_device_read_from_device(dev);
- }
-}
-
-int spice_char_device_client_exists(SpiceCharDeviceState *dev,
- RedClient *client)
-{
- return (spice_char_device_client_find(dev, client) != NULL);
-}
-
-void spice_char_device_start(SpiceCharDeviceState *dev)
-{
- spice_debug("dev_state %p", dev);
- dev->running = TRUE;
- spice_char_device_state_ref(dev);
- while (spice_char_device_write_to_device(dev) ||
- spice_char_device_read_from_device(dev));
- spice_char_device_state_unref(dev);
-}
-
-void spice_char_device_stop(SpiceCharDeviceState *dev)
-{
- spice_debug("dev_state %p", dev);
- dev->running = FALSE;
- dev->active = FALSE;
- core->timer_cancel(dev->write_to_dev_timer);
-}
-
-void spice_char_device_reset(SpiceCharDeviceState *dev)
-{
- RingItem *client_item;
-
- spice_char_device_stop(dev);
- dev->wait_for_migrate_data = FALSE;
- spice_debug("dev_state %p", dev);
- while (!ring_is_empty(&dev->write_queue)) {
- RingItem *item = ring_get_tail(&dev->write_queue);
- SpiceCharDeviceWriteBuffer *buf;
-
- ring_remove(item);
- buf = SPICE_CONTAINEROF(item, SpiceCharDeviceWriteBuffer, link);
- /* tracking the tokens */
- spice_char_device_write_buffer_release(dev, buf);
- }
- if (dev->cur_write_buf) {
- SpiceCharDeviceWriteBuffer *release_buf = dev->cur_write_buf;
-
- dev->cur_write_buf = NULL;
- spice_char_device_write_buffer_release(dev, release_buf);
- }
-
- RING_FOREACH(client_item, &dev->clients) {
- SpiceCharDeviceClientState *dev_client;
-
- dev_client = SPICE_CONTAINEROF(client_item, SpiceCharDeviceClientState, link);
- spice_char_device_client_send_queue_free(dev, dev_client);
- }
- dev->sin = NULL;
-}
-
-void spice_char_device_wakeup(SpiceCharDeviceState *dev)
-{
- spice_char_device_read_from_device(dev);
-}
-
-/*************
- * Migration *
- * **********/
-
-void spice_char_device_state_migrate_data_marshall_empty(SpiceMarshaller *m)
-{
- SpiceMigrateDataCharDevice *mig_data;
-
- spice_debug(NULL);
- mig_data = (SpiceMigrateDataCharDevice *)spice_marshaller_reserve_space(m,
- sizeof(*mig_data));
- memset(mig_data, 0, sizeof(*mig_data));
- mig_data->version = SPICE_MIGRATE_DATA_CHAR_DEVICE_VERSION;
- mig_data->connected = FALSE;
-}
-
-static void migrate_data_marshaller_write_buffer_free(uint8_t *data, void *opaque)
-{
- SpiceCharDeviceWriteBuffer *write_buf = (SpiceCharDeviceWriteBuffer *)opaque;
-
- spice_char_device_write_buffer_free(write_buf);
-}
-
-void spice_char_device_state_migrate_data_marshall(SpiceCharDeviceState *dev,
- SpiceMarshaller *m)
-{
- SpiceCharDeviceClientState *client_state;
- RingItem *item;
- uint32_t *write_to_dev_size_ptr;
- uint32_t *write_to_dev_tokens_ptr;
- SpiceMarshaller *m2;
-
- /* multi-clients are not supported */
- spice_assert(dev->num_clients == 1);
- client_state = SPICE_CONTAINEROF(ring_get_tail(&dev->clients),
- SpiceCharDeviceClientState,
- link);
- /* FIXME: if there were more than one client before the marshalling,
- * it is possible that the send_queue_size > 0, and the send data
- * should be migrated as well */
- spice_assert(client_state->send_queue_size == 0);
- spice_marshaller_add_uint32(m, SPICE_MIGRATE_DATA_CHAR_DEVICE_VERSION);
- spice_marshaller_add_uint8(m, 1); /* connected */
- spice_marshaller_add_uint32(m, client_state->num_client_tokens);
- spice_marshaller_add_uint32(m, client_state->num_send_tokens);
- write_to_dev_size_ptr = (uint32_t *)spice_marshaller_reserve_space(m, sizeof(uint32_t));
- write_to_dev_tokens_ptr = (uint32_t *)spice_marshaller_reserve_space(m, sizeof(uint32_t));
- *write_to_dev_size_ptr = 0;
- *write_to_dev_tokens_ptr = 0;
-
- m2 = spice_marshaller_get_ptr_submarshaller(m, 0);
- if (dev->cur_write_buf) {
- uint32_t buf_remaining = dev->cur_write_buf->buf + dev->cur_write_buf->buf_used -
- dev->cur_write_buf_pos;
- spice_marshaller_add_ref_full(m2, dev->cur_write_buf_pos, buf_remaining,
- migrate_data_marshaller_write_buffer_free,
- spice_char_device_write_buffer_ref(dev->cur_write_buf)
- );
- *write_to_dev_size_ptr += buf_remaining;
- if (dev->cur_write_buf->origin == WRITE_BUFFER_ORIGIN_CLIENT) {
- spice_assert(dev->cur_write_buf->client == client_state->client);
- (*write_to_dev_tokens_ptr) += dev->cur_write_buf->token_price;
- }
- }
-
- RING_FOREACH_REVERSED(item, &dev->write_queue) {
- SpiceCharDeviceWriteBuffer *write_buf;
-
- write_buf = SPICE_CONTAINEROF(item, SpiceCharDeviceWriteBuffer, link);
- spice_marshaller_add_ref_full(m2, write_buf->buf, write_buf->buf_used,
- migrate_data_marshaller_write_buffer_free,
- spice_char_device_write_buffer_ref(write_buf)
- );
- *write_to_dev_size_ptr += write_buf->buf_used;
- if (write_buf->origin == WRITE_BUFFER_ORIGIN_CLIENT) {
- spice_assert(write_buf->client == client_state->client);
- (*write_to_dev_tokens_ptr) += write_buf->token_price;
- }
- }
- spice_debug("migration data dev %p: write_queue size %u tokens %u",
- dev, *write_to_dev_size_ptr, *write_to_dev_tokens_ptr);
-}
-
-int spice_char_device_state_restore(SpiceCharDeviceState *dev,
- SpiceMigrateDataCharDevice *mig_data)
-{
- SpiceCharDeviceClientState *client_state;
- uint32_t client_tokens_window;
-
- spice_assert(dev->num_clients == 1 && dev->wait_for_migrate_data);
-
- client_state = SPICE_CONTAINEROF(ring_get_tail(&dev->clients),
- SpiceCharDeviceClientState,
- link);
- if (mig_data->version > SPICE_MIGRATE_DATA_CHAR_DEVICE_VERSION) {
- spice_error("dev %p error: migration data version %u is bigger than self %u",
- dev, mig_data->version, SPICE_MIGRATE_DATA_CHAR_DEVICE_VERSION);
- return FALSE;
- }
- spice_assert(!dev->cur_write_buf && ring_is_empty(&dev->write_queue));
- spice_assert(mig_data->connected);
-
- client_tokens_window = client_state->num_client_tokens; /* initial state of tokens */
- client_state->num_client_tokens = mig_data->num_client_tokens;
- /* assumption: client_tokens_window stays the same across severs */
- client_state->num_client_tokens_free = client_tokens_window -
- mig_data->num_client_tokens -
- mig_data->write_num_client_tokens;
- client_state->num_send_tokens = mig_data->num_send_tokens;
-
- if (mig_data->write_size > 0) {
- if (mig_data->write_num_client_tokens) {
- dev->cur_write_buf =
- __spice_char_device_write_buffer_get(dev, client_state->client,
- mig_data->write_size, WRITE_BUFFER_ORIGIN_CLIENT,
- mig_data->write_num_client_tokens);
- } else {
- dev->cur_write_buf =
- __spice_char_device_write_buffer_get(dev, NULL,
- mig_data->write_size, WRITE_BUFFER_ORIGIN_SERVER, 0);
- }
- /* the first write buffer contains all the data that was saved for migration */
- memcpy(dev->cur_write_buf->buf,
- ((uint8_t *)mig_data) + mig_data->write_data_ptr - sizeof(SpiceMigrateDataHeader),
- mig_data->write_size);
- dev->cur_write_buf->buf_used = mig_data->write_size;
- dev->cur_write_buf_pos = dev->cur_write_buf->buf;
- }
- dev->wait_for_migrate_data = FALSE;
- spice_char_device_write_to_device(dev);
- spice_char_device_read_from_device(dev);
- return TRUE;
-}
diff --git a/server/char_device.h b/server/char_device.h
deleted file mode 100644
index c17a40d4..00000000
--- a/server/char_device.h
+++ /dev/null
@@ -1,199 +0,0 @@
-#ifndef __CHAR_DEVICE_H__
-#define __CHAR_DEVICE_H__
-
-#include "spice.h"
-#include "red_channel.h"
-#include "migration_protocol.h"
-
-/*
- * Shared code for char devices, mainly for flow control.
- *
- * How to use the api:
- * ==================
- * device attached: call spice_char_device_state_create
- * device detached: call spice_char_device_state_destroy/reset
- *
- * client connected and assoicated with a device: spice_char_device_client_add
- * client disconnected: spice_char_device_client_remove
- *
- * Writing to the device
- * ---------------------
- * Write the data into SpiceCharDeviceWriteBuffer:
- * call spice_char_device_write_buffer_get in order to get an appropriate buffer.
- * call spice_char_device_write_buffer_add in order to push the buffer to the write queue.
- * If you choose not to push the buffer to the device, call
- * spice_char_device_write_buffer_release
- *
- * reading from the device
- * -----------------------
- * The callback read_one_msg_from_device (see below) should be implemented
- * (using sif->read).
- * When the device is ready, this callback is called, and is expected to
- * return one message which is addressed to the client, or NULL if the read
- * hasn't completed.
- *
- * calls triggered from the device (qemu):
- * --------------------------------------
- * spice_char_device_start
- * spice_char_device_stop
- * spice_char_device_wakeup (for reading from the device)
- */
-
-/*
- * Note about multiple-clients:
- * Multiclients are currently not supported in any of the character devices:
- * spicevmc does not allow more than one client (and at least for usb, it should stay this way).
- * smartcard code is not compatible with more than one reader.
- * The server and guest agent code doesn't distinguish messages from different clients.
- * In addition, its current flow control code (e.g., tokens handling) is wrong and doesn't
- * take into account the different clients.
- *
- * Nonetheless, the following code introduces some support for multiple-clients:
- * We track the number of tokens for all the clients, and we read from the device
- * if one of the clients have enough tokens. For the clients that don't have tokens,
- * we queue the messages, till they receive tokens, or till a timeout.
- *
- * TODO:
- * At least for the agent, not all the messages from the device will be directed to all
- * the clients (e.g., copy from guest to a specific client). Thus, support for
- * client-specific-messages should be added.
- * In addition, we should have support for clients that are being connected
- * in the middle of a message transfer from the agent to the clients.
- *
- * */
-
-/* buffer that is used for writing to the device */
-typedef struct SpiceCharDeviceWriteBuffer {
- RingItem link;
- int origin;
- RedClient *client; /* The client that sent the message to the device.
- NULL if the server created the message */
-
- uint8_t *buf;
- uint32_t buf_size;
- uint32_t buf_used;
- uint32_t token_price;
- uint32_t refs;
-} SpiceCharDeviceWriteBuffer;
-
-typedef void SpiceCharDeviceMsgToClient;
-
-typedef struct SpiceCharDeviceCallbacks {
- /*
- * Messages that are addressed to the client can be queued in case we have
- * multiple clients and some of them don't have enough tokens.
- */
-
- /* reads from the device till reaching a msg that should be sent to the client,
- * or till the reading fails */
- SpiceCharDeviceMsgToClient* (*read_one_msg_from_device)(SpiceCharDeviceInstance *sin,
- void *opaque);
- SpiceCharDeviceMsgToClient* (*ref_msg_to_client)(SpiceCharDeviceMsgToClient *msg,
- void *opaque);
- void (*unref_msg_to_client)(SpiceCharDeviceMsgToClient *msg,
- void *opaque);
- void (*send_msg_to_client)(SpiceCharDeviceMsgToClient *msg,
- RedClient *client,
- void *opaque); /* after this call, the message is unreferenced */
-
- /* The cb is called when a predefined number of write buffers were consumed by the
- * device */
- void (*send_tokens_to_client)(RedClient *client, uint32_t tokens, void *opaque);
-
- /* The cb is called when a server (self) message that was addressed to the device,
- * has been completely written to it */
- void (*on_free_self_token)(void *opaque);
-
- /* This cb is called if it is recommanded that a client will be removed
- * due to slow flow or due to some other error.
- * The called instance should disconnect the client, or at least the corresponding channel */
- void (*remove_client)(RedClient *client, void *opaque);
-} SpiceCharDeviceCallbacks;
-
-SpiceCharDeviceState *spice_char_device_state_create(SpiceCharDeviceInstance *sin,
- uint32_t client_tokens_interval,
- uint32_t self_tokens,
- SpiceCharDeviceCallbacks *cbs,
- void *opaque);
-
-void spice_char_device_state_reset_dev_instance(SpiceCharDeviceState *dev,
- SpiceCharDeviceInstance *sin);
-void spice_char_device_state_destroy(SpiceCharDeviceState *dev);
-
-void *spice_char_device_state_opaque_get(SpiceCharDeviceState *dev);
-
-/* only one client is supported */
-void spice_char_device_state_migrate_data_marshall(SpiceCharDeviceState *dev,
- SpiceMarshaller *m);
-void spice_char_device_state_migrate_data_marshall_empty(SpiceMarshaller *m);
-
-int spice_char_device_state_restore(SpiceCharDeviceState *dev,
- SpiceMigrateDataCharDevice *mig_data);
-
-/*
- * Resets write/read queues, and moves that state to being stopped.
- * This routine is a workaround for a bad tokens management in the vdagent
- * protocol:
- * The client tokens' are set only once, when the main channel is initialized.
- * Instead, it would have been more appropriate to reset them upon AGEN_CONNECT.
- * The client tokens are tracked as part of the SpiceCharDeviceClientState. Thus,
- * in order to be backwartd compatible with the client, we need to track the tokens
- * event when the agent is detached. We don't destroy the char_device state, and
- * instead we just reset it.
- * In addition, there is a misshandling of AGENT_TOKENS message in spice-gtk: it
- * overrides the amount of tokens, instead of adding the given amount.
- *
- * todo: change AGENT_CONNECT msg to contain tokens count.
- */
-void spice_char_device_reset(SpiceCharDeviceState *dev);
-
-/* max_send_queue_size = how many messages we can read from the device and enqueue for this client,
- * when we have tokens for other clients and no tokens for this one */
-int spice_char_device_client_add(SpiceCharDeviceState *dev,
- RedClient *client,
- int do_flow_control,
- uint32_t max_send_queue_size,
- uint32_t num_client_tokens,
- uint32_t num_send_tokens,
- int wait_for_migrate_data);
-
-void spice_char_device_client_remove(SpiceCharDeviceState *dev,
- RedClient *client);
-int spice_char_device_client_exists(SpiceCharDeviceState *dev,
- RedClient *client);
-
-void spice_char_device_start(SpiceCharDeviceState *dev);
-void spice_char_device_stop(SpiceCharDeviceState *dev);
-
-/** Read from device **/
-
-void spice_char_device_wakeup(SpiceCharDeviceState *dev);
-
-void spice_char_device_send_to_client_tokens_add(SpiceCharDeviceState *dev,
- RedClient *client,
- uint32_t tokens);
-
-
-void spice_char_device_send_to_client_tokens_set(SpiceCharDeviceState *dev,
- RedClient *client,
- uint32_t tokens);
-/** Write to device **/
-
-SpiceCharDeviceWriteBuffer *spice_char_device_write_buffer_get(SpiceCharDeviceState *dev,
- RedClient *client, int size);
-SpiceCharDeviceWriteBuffer *spice_char_device_write_buffer_get_server_no_token(
- SpiceCharDeviceState *dev, int size);
-
-/* Either add the buffer to the write queue or release it */
-void spice_char_device_write_buffer_add(SpiceCharDeviceState *dev,
- SpiceCharDeviceWriteBuffer *write_buf);
-void spice_char_device_write_buffer_release(SpiceCharDeviceState *dev,
- SpiceCharDeviceWriteBuffer *write_buf);
-
-/* api for specific char devices */
-
-SpiceCharDeviceState *spicevmc_device_connect(SpiceCharDeviceInstance *sin,
- uint8_t channel_type);
-void spicevmc_device_disconnect(SpiceCharDeviceInstance *char_device);
-
-#endif // __CHAR_DEVICE_H__
diff --git a/server/common-graphics-channel.cpp b/server/common-graphics-channel.cpp
new file mode 100644
index 00000000..f9ba511b
--- /dev/null
+++ b/server/common-graphics-channel.cpp
@@ -0,0 +1,67 @@
+/*
+ Copyright (C) 2009-2016 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+
+#include <fcntl.h>
+
+#include "common-graphics-channel.h"
+#include "dcc.h"
+#include "red-client.h"
+
+uint8_t *CommonGraphicsChannelClient::alloc_recv_buf(uint16_t type, uint32_t size)
+{
+ /* SPICE_MSGC_MIGRATE_DATA is the only client message whose size is dynamic */
+ if (type == SPICE_MSGC_MIGRATE_DATA) {
+ return static_cast<uint8_t *>(g_malloc(size));
+ }
+
+ if (size > sizeof(recv_buf)) {
+ spice_warning("unexpected message size %u (max is %zd)", size, sizeof(recv_buf));
+ return nullptr;
+ }
+ return recv_buf;
+}
+
+void CommonGraphicsChannelClient::release_recv_buf(uint16_t type, uint32_t size, uint8_t* msg)
+{
+ if (type == SPICE_MSGC_MIGRATE_DATA) {
+ g_free(msg);
+ }
+}
+
+bool CommonGraphicsChannelClient::config_socket()
+{
+ RedClient *client = get_client();
+ MainChannelClient *mcc = client->get_main();
+ RedStream *stream = get_stream();
+ gboolean is_low_bandwidth;
+
+ // TODO - this should be dynamic, not one time at channel creation
+ is_low_bandwidth = mcc->is_low_bandwidth();
+ if (!red_stream_set_auto_flush(stream, false)) {
+ /* FIXME: Using Nagle's Algorithm can lead to apparent delays, depending
+ * on the delayed ack timeout on the other side.
+ * Instead of using Nagle's, we need to implement message buffering on
+ * the application level.
+ * see: http://www.stuartcheshire.org/papers/NagleDelayedAck/
+ */
+ red_stream_set_no_delay(stream, !is_low_bandwidth);
+ }
+ // TODO: move wide/narrow ack setting to red_channel.
+ ack_set_client_window(is_low_bandwidth ? WIDE_CLIENT_ACK_WINDOW : NARROW_CLIENT_ACK_WINDOW);
+ return true;
+}
diff --git a/server/common-graphics-channel.h b/server/common-graphics-channel.h
new file mode 100644
index 00000000..16ebf148
--- /dev/null
+++ b/server/common-graphics-channel.h
@@ -0,0 +1,78 @@
+/*
+ Copyright (C) 2009-2016 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef COMMON_GRAPHICS_CHANNEL_H_
+#define COMMON_GRAPHICS_CHANNEL_H_
+
+#include "red-channel.h"
+#include "red-channel-client.h"
+
+#include "push-visibility.h"
+
+#define COMMON_CLIENT_TIMEOUT (NSEC_PER_SEC * 30)
+
+class CommonGraphicsChannel: public RedChannel
+{
+public:
+ bool get_during_target_migrate() const
+ {
+ return during_target_migrate;
+ }
+
+ void set_during_target_migrate(bool value)
+ {
+ during_target_migrate = value;
+ }
+protected:
+ using RedChannel::RedChannel;
+
+private:
+ bool during_target_migrate = false; /* TRUE when the client that is associated with the channel
+ is during migration. Turned off when the vm is started.
+ The flag is used to avoid sending messages that are artifacts
+ of the transition from stopped vm to loaded vm (e.g., recreation
+ of the primary surface) */
+};
+
+enum {
+ RED_PIPE_ITEM_TYPE_INVAL_ONE = RED_PIPE_ITEM_TYPE_CHANNEL_BASE,
+
+ RED_PIPE_ITEM_TYPE_COMMON_LAST
+};
+
+class CommonGraphicsChannelClient: public RedChannelClient
+{
+ enum { CHANNEL_RECEIVE_BUF_SIZE = 1024 };
+ uint8_t recv_buf[CHANNEL_RECEIVE_BUF_SIZE];
+
+public:
+ using RedChannelClient::RedChannelClient;
+
+protected:
+ virtual uint8_t *alloc_recv_buf(uint16_t type, uint32_t size) override;
+ virtual void release_recv_buf(uint16_t type, uint32_t size, uint8_t *msg) override;
+ virtual bool config_socket() override;
+};
+
+/* pipe item used to release a specific cached item on the client */
+struct RedCachePipeItem final: public RedPipeItemNum<RED_PIPE_ITEM_TYPE_INVAL_ONE> {
+ SpiceMsgDisplayInvalOne inval_one;
+};
+
+#include "pop-visibility.h"
+
+#endif /* COMMON_GRAPHICS_CHANNEL_H_ */
diff --git a/server/cursor-channel-client.cpp b/server/cursor-channel-client.cpp
new file mode 100644
index 00000000..1f86dd5f
--- /dev/null
+++ b/server/cursor-channel-client.cpp
@@ -0,0 +1,98 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009-2016 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+
+#include <common/generated_server_marshallers.h>
+
+#include "common-graphics-channel.h"
+#include "red-channel-client.h"
+#include "cache-item.h"
+#include "cursor-channel.h"
+#include "cursor-channel-client.h"
+
+#define CLIENT_CURSOR_CACHE_SIZE 256
+
+#define CURSOR_CACHE_HASH_SHIFT 8
+#define CURSOR_CACHE_HASH_SIZE (1 << CURSOR_CACHE_HASH_SHIFT)
+#define CURSOR_CACHE_HASH_MASK (CURSOR_CACHE_HASH_SIZE - 1)
+#define CURSOR_CACHE_HASH_KEY(id) ((id) & CURSOR_CACHE_HASH_MASK)
+#define CURSOR_CLIENT_TIMEOUT 30000000000ULL //nano
+
+struct CursorChannelClientPrivate
+{
+ SPICE_CXX_GLIB_ALLOCATOR
+
+ RedCacheItem *cursor_cache[CURSOR_CACHE_HASH_SIZE];
+ Ring cursor_cache_lru = { nullptr, nullptr };
+ long cursor_cache_available = 0;
+};
+
+#define CLIENT_CURSOR_CACHE
+#include "cache-item.tmpl.cpp"
+#undef CLIENT_CURSOR_CACHE
+
+void CursorChannelClient::reset_cursor_cache()
+{
+ red_cursor_cache_reset(this, CLIENT_CURSOR_CACHE_SIZE);
+}
+
+void CursorChannelClient::on_disconnect()
+{
+ reset_cursor_cache();
+}
+
+void CursorChannelClient::migrate()
+{
+ pipe_add_type(RED_PIPE_ITEM_TYPE_INVAL_CURSOR_CACHE);
+ RedChannelClient::migrate();
+}
+
+CursorChannelClient::CursorChannelClient(RedChannel *channel,
+ RedClient *client,
+ RedStream *stream,
+ RedChannelCapabilities *caps):
+ CommonGraphicsChannelClient(channel, client, stream, caps)
+{
+ ring_init(&priv->cursor_cache_lru);
+ priv->cursor_cache_available = CLIENT_CURSOR_CACHE_SIZE;
+}
+
+CursorChannelClient* cursor_channel_client_new(CursorChannel *cursor, RedClient *client, RedStream *stream,
+ int mig_target,
+ RedChannelCapabilities *caps)
+{
+ auto rcc =
+ red::make_shared<CursorChannelClient>(cursor, client, stream, caps);
+
+ if (!rcc->init()) {
+ return nullptr;
+ }
+ cursor->set_during_target_migrate(mig_target);
+
+ return rcc.get();
+}
+
+RedCacheItem* CursorChannelClient::cache_find(uint64_t id)
+{
+ return red_cursor_cache_find(this, id);
+}
+
+int CursorChannelClient::cache_add(uint64_t id, size_t size)
+{
+ return red_cursor_cache_add(this, id, size);
+}
diff --git a/server/cursor-channel-client.h b/server/cursor-channel-client.h
new file mode 100644
index 00000000..170d7380
--- /dev/null
+++ b/server/cursor-channel-client.h
@@ -0,0 +1,75 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009-2016 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef CURSOR_CHANNEL_CLIENT_H_
+#define CURSOR_CHANNEL_CLIENT_H_
+
+#include "cache-item.h"
+#include "red-common.h"
+#include "red-channel-client.h"
+#include "red-stream.h"
+#include "cursor-channel.h"
+#include "utils.hpp"
+
+#include "push-visibility.h"
+
+struct CursorChannelClientPrivate;
+
+class CursorChannelClient final: public CommonGraphicsChannelClient
+{
+public:
+ CursorChannelClient(RedChannel *channel,
+ RedClient *client,
+ RedStream *stream,
+ RedChannelCapabilities *caps);
+ void reset_cursor_cache();
+ RedCacheItem* cache_find(uint64_t id);
+ int cache_add(uint64_t id, size_t size);
+ CursorChannel* get_channel()
+ {
+ return static_cast<CursorChannel*>(CommonGraphicsChannelClient::get_channel());
+ }
+
+protected:
+ virtual void on_disconnect() override;
+ void send_item(RedPipeItem *pipe_item) override;
+ /**
+ * Migrate a client channel from a CursorChannel.
+ * This is the equivalent of RedChannel client migrate callback.
+ */
+ virtual void migrate() override;
+
+public:
+ red::unique_link<CursorChannelClientPrivate> priv;
+};
+
+CursorChannelClient* cursor_channel_client_new(CursorChannel *cursor,
+ RedClient *client,
+ RedStream *stream,
+ int mig_target,
+ RedChannelCapabilities *caps);
+
+enum {
+ RED_PIPE_ITEM_TYPE_CURSOR = RED_PIPE_ITEM_TYPE_COMMON_LAST,
+ RED_PIPE_ITEM_TYPE_CURSOR_INIT,
+ RED_PIPE_ITEM_TYPE_INVAL_CURSOR_CACHE,
+};
+
+#include "pop-visibility.h"
+
+#endif /* CURSOR_CHANNEL_CLIENT_H_ */
diff --git a/server/cursor-channel.cpp b/server/cursor-channel.cpp
new file mode 100644
index 00000000..beb004ea
--- /dev/null
+++ b/server/cursor-channel.cpp
@@ -0,0 +1,287 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+
+#include <glib.h>
+#include <common/generated_server_marshallers.h>
+
+#include "common-graphics-channel.h"
+#include "cursor-channel.h"
+#include "cursor-channel-client.h"
+#include "reds.h"
+
+struct RedCursorPipeItem: public RedPipeItemNum<RED_PIPE_ITEM_TYPE_CURSOR> {
+ explicit RedCursorPipeItem(const red::shared_ptr<const RedCursorCmd>& cmd);
+ red::shared_ptr<const RedCursorCmd> red_cursor;
+};
+
+RedCursorPipeItem::RedCursorPipeItem(const red::shared_ptr<const RedCursorCmd>& cmd):
+ red_cursor(cmd)
+{
+}
+
+static void cursor_fill(CursorChannelClient *ccc, RedCursorPipeItem *cursor,
+ SpiceCursor *red_cursor, SpiceMarshaller *m)
+{
+ if (!cursor) {
+ red_cursor->flags = SPICE_CURSOR_FLAGS_NONE;
+ return;
+ }
+
+ auto cursor_cmd = cursor->red_cursor.get();
+ *red_cursor = cursor_cmd->u.set.shape;
+
+ if (red_cursor->header.unique) {
+ if (ccc->cache_find(red_cursor->header.unique)) {
+ red_cursor->flags |= SPICE_CURSOR_FLAGS_FROM_CACHE;
+ return;
+ }
+ if (ccc->cache_add(red_cursor->header.unique, 1)) {
+ red_cursor->flags |= SPICE_CURSOR_FLAGS_CACHE_ME;
+ }
+ }
+
+ if (red_cursor->data_size) {
+ SpiceMarshaller *m2 = spice_marshaller_get_submarshaller(m);
+ cursor->add_to_marshaller(m2, red_cursor->data, red_cursor->data_size);
+ }
+}
+
+static void red_marshall_cursor_init(CursorChannelClient *ccc, SpiceMarshaller *base_marshaller)
+{
+ spice_assert(ccc);
+
+ CursorChannel *cursor_channel;
+ SpiceMsgCursorInit msg;
+
+ cursor_channel = ccc->get_channel();
+
+ ccc->init_send_data(SPICE_MSG_CURSOR_INIT);
+ msg.visible = cursor_channel->cursor_visible;
+ msg.position = cursor_channel->cursor_position;
+ msg.trail_length = cursor_channel->cursor_trail_length;
+ msg.trail_frequency = cursor_channel->cursor_trail_frequency;
+
+ cursor_fill(ccc, cursor_channel->item.get(), &msg.cursor, base_marshaller);
+ spice_marshall_msg_cursor_init(base_marshaller, &msg);
+}
+
+static void red_marshall_cursor(CursorChannelClient *ccc,
+ SpiceMarshaller *m,
+ RedCursorPipeItem *cursor_pipe_item)
+{
+ CursorChannel *cursor_channel = ccc->get_channel();
+ RedCursorPipeItem *item = cursor_pipe_item;
+
+ spice_return_if_fail(cursor_channel);
+
+ auto cmd = item->red_cursor.get();
+ switch (cmd->type) {
+ case QXL_CURSOR_MOVE:
+ {
+ SpiceMsgCursorMove cursor_move;
+ ccc->init_send_data(SPICE_MSG_CURSOR_MOVE);
+ cursor_move.position = cmd->u.position;
+ spice_marshall_msg_cursor_move(m, &cursor_move);
+ break;
+ }
+ case QXL_CURSOR_SET:
+ {
+ SpiceMsgCursorSet cursor_set;
+
+ ccc->init_send_data(SPICE_MSG_CURSOR_SET);
+ cursor_set.position = cmd->u.set.position;
+ cursor_set.visible = cursor_channel->cursor_visible;
+
+ cursor_fill(ccc, item, &cursor_set.cursor, m);
+ spice_marshall_msg_cursor_set(m, &cursor_set);
+ break;
+ }
+ case QXL_CURSOR_HIDE:
+ ccc->init_send_data(SPICE_MSG_CURSOR_HIDE);
+ break;
+ case QXL_CURSOR_TRAIL:
+ {
+ SpiceMsgCursorTrail cursor_trail;
+
+ ccc->init_send_data(SPICE_MSG_CURSOR_TRAIL);
+ cursor_trail.length = cmd->u.trail.length;
+ cursor_trail.frequency = cmd->u.trail.frequency;
+ spice_marshall_msg_cursor_trail(m, &cursor_trail);
+ }
+ break;
+ default:
+ spice_error("bad cursor command %d", cmd->type);
+ }
+}
+
+static inline void red_marshall_inval(RedChannelClient *rcc,
+ SpiceMarshaller *base_marshaller,
+ RedCachePipeItem *cache_item)
+{
+ rcc->init_send_data(SPICE_MSG_CURSOR_INVAL_ONE);
+
+ spice_marshall_msg_cursor_inval_one(base_marshaller, &cache_item->inval_one);
+}
+
+void CursorChannelClient::send_item(RedPipeItem *pipe_item)
+{
+ SpiceMarshaller *m = get_marshaller();
+ CursorChannelClient *ccc = this;
+
+ switch (pipe_item->type) {
+ case RED_PIPE_ITEM_TYPE_CURSOR:
+ red_marshall_cursor(ccc, m, static_cast<RedCursorPipeItem*>(pipe_item));
+ break;
+ case RED_PIPE_ITEM_TYPE_INVAL_ONE:
+ red_marshall_inval(this, m, static_cast<RedCachePipeItem*>(pipe_item));
+ break;
+ case RED_PIPE_ITEM_TYPE_CURSOR_INIT:
+ reset_cursor_cache();
+ red_marshall_cursor_init(this, m);
+ break;
+ case RED_PIPE_ITEM_TYPE_INVAL_CURSOR_CACHE:
+ reset_cursor_cache();
+ init_send_data(SPICE_MSG_CURSOR_INVAL_ALL);
+ break;
+ default:
+ spice_error("invalid pipe item type");
+ }
+
+ begin_send_message();
+}
+
+red::shared_ptr<CursorChannel>
+cursor_channel_new(RedsState *server, int id,
+ SpiceCoreInterfaceInternal *core,
+ Dispatcher *dispatcher)
+{
+ spice_debug("create cursor channel");
+ return red::make_shared<CursorChannel>(server, id, core, dispatcher);
+}
+
+void CursorChannel::process_cmd(red::shared_ptr<const RedCursorCmd> &&cursor_cmd)
+{
+ bool cursor_show = false;
+
+ spice_return_if_fail(cursor_cmd);
+
+ auto cursor_pipe_item = red::make_shared<RedCursorPipeItem>(cursor_cmd);
+
+ switch (cursor_cmd->type) {
+ case QXL_CURSOR_SET:
+ cursor_visible = !!cursor_cmd->u.set.visible;
+ item = cursor_pipe_item;
+ break;
+ case QXL_CURSOR_MOVE:
+ cursor_show = !cursor_visible;
+ cursor_visible = true;
+ cursor_position = cursor_cmd->u.position;
+ break;
+ case QXL_CURSOR_HIDE:
+ cursor_visible = false;
+ break;
+ case QXL_CURSOR_TRAIL:
+ cursor_trail_length = cursor_cmd->u.trail.length;
+ cursor_trail_frequency = cursor_cmd->u.trail.frequency;
+ break;
+ default:
+ spice_warning("invalid cursor command %u", cursor_cmd->type);
+ return;
+ }
+
+ if (is_connected() &&
+ (mouse_mode == SPICE_MOUSE_MODE_SERVER
+ || cursor_cmd->type != QXL_CURSOR_MOVE
+ || cursor_show)) {
+ pipes_add(cursor_pipe_item);
+ }
+}
+
+void CursorChannel::reset()
+{
+ item.reset();
+ cursor_visible = true;
+ cursor_position.x = cursor_position.y = 0;
+ cursor_trail_length = cursor_trail_frequency = 0;
+
+ if (is_connected()) {
+ pipes_add_type(RED_PIPE_ITEM_TYPE_INVAL_CURSOR_CACHE);
+ if (!get_during_target_migrate()) {
+ pipes_add_empty_msg(SPICE_MSG_CURSOR_RESET);
+ }
+ wait_all_sent(COMMON_CLIENT_TIMEOUT);
+ }
+}
+
+static void cursor_channel_init_client(CursorChannel *cursor, CursorChannelClient *client)
+{
+ spice_return_if_fail(cursor);
+
+ if (!cursor->is_connected()
+ || cursor->get_during_target_migrate()) {
+ spice_debug("during_target_migrate: skip init");
+ return;
+ }
+
+ if (client)
+ client->pipe_add_type(RED_PIPE_ITEM_TYPE_CURSOR_INIT);
+ else
+ cursor->pipes_add_type(RED_PIPE_ITEM_TYPE_CURSOR_INIT);
+}
+
+void CursorChannel::do_init()
+{
+ cursor_channel_init_client(this, nullptr);
+}
+
+void CursorChannel::set_mouse_mode(uint32_t mode)
+{
+ mouse_mode = mode;
+}
+
+/**
+ * Connect a new client to CursorChannel.
+ */
+void CursorChannel::on_connect(RedClient *client, RedStream *stream, int migration,
+ RedChannelCapabilities *caps)
+{
+ CursorChannelClient *ccc;
+
+ spice_debug("add cursor channel client");
+ ccc = cursor_channel_client_new(this, client, stream,
+ migration,
+ caps);
+ if (ccc == nullptr) {
+ return;
+ }
+
+ ccc->ack_zero_messages_window();
+ ccc->push_set_ack();
+
+ cursor_channel_init_client(this, ccc);
+}
+
+CursorChannel::~CursorChannel() = default;
+
+CursorChannel::CursorChannel(RedsState *reds, uint32_t id,
+ SpiceCoreInterfaceInternal *core, Dispatcher *dispatcher):
+ CommonGraphicsChannel(reds, SPICE_CHANNEL_CURSOR, id, RedChannel::HandleAcks, core, dispatcher)
+{
+ reds_register_channel(reds, this);
+}
diff --git a/server/cursor-channel.h b/server/cursor-channel.h
new file mode 100644
index 00000000..0461a942
--- /dev/null
+++ b/server/cursor-channel.h
@@ -0,0 +1,67 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef CURSOR_CHANNEL_H_
+#define CURSOR_CHANNEL_H_
+
+#include "common-graphics-channel.h"
+#include "red-parse-qxl.h"
+#include "dispatcher.h"
+
+#include "push-visibility.h"
+
+struct RedCursorPipeItem;
+
+/**
+ * This type it's a RedChannel class which implement cursor (mouse)
+ * movements.
+ */
+struct CursorChannel final: public CommonGraphicsChannel
+{
+ CursorChannel(RedsState *reds, uint32_t id,
+ SpiceCoreInterfaceInternal *core=nullptr, Dispatcher *dispatcher=nullptr);
+ ~CursorChannel();
+ void reset();
+ void do_init();
+ void process_cmd(red::shared_ptr<const RedCursorCmd> &&cursor_cmd);
+ void set_mouse_mode(uint32_t mode);
+ void on_connect(RedClient *client, RedStream *stream, int migration,
+ RedChannelCapabilities *caps) override;
+
+ red::shared_ptr<RedCursorPipeItem> item;
+ bool cursor_visible = true;
+ SpicePoint16 cursor_position;
+ uint16_t cursor_trail_length;
+ uint16_t cursor_trail_frequency;
+ uint32_t mouse_mode = SPICE_MOUSE_MODE_SERVER;
+};
+
+
+/**
+ * Create CursorChannel.
+ * Since CursorChannel is intended to be run in a separate thread,
+ * the function accepts a dispatcher parameter to allows some
+ * operations to be executed in the channel thread.
+ */
+red::shared_ptr<CursorChannel> cursor_channel_new(RedsState *server, int id,
+ SpiceCoreInterfaceInternal *core,
+ Dispatcher *dispatcher);
+
+#include "pop-visibility.h"
+
+#endif /* CURSOR_CHANNEL_H_ */
diff --git a/server/dcc-private.h b/server/dcc-private.h
new file mode 100644
index 00000000..842c14b2
--- /dev/null
+++ b/server/dcc-private.h
@@ -0,0 +1,74 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef DCC_PRIVATE_H_
+#define DCC_PRIVATE_H_
+
+#include "cache-item.h"
+#include "dcc.h"
+#include "image-encoders.h"
+#include "video-stream.h"
+#include "red-channel-client.h"
+
+#include "push-visibility.h"
+
+struct DisplayChannelClientPrivate
+{
+ SPICE_CXX_GLIB_ALLOCATOR
+
+ uint32_t id = 0;
+ SpiceImageCompression image_compression;
+ spice_wan_compression_t jpeg_state;
+ spice_wan_compression_t zlib_glz_state;
+
+ ImageEncoders encoders;
+
+ int expect_init = 0;
+
+ PixmapCache *pixmap_cache = nullptr;
+ uint32_t pixmap_cache_generation = 0;
+ int pending_pixmaps_sync = 0;
+
+ std::array<RedCacheItem *, PALETTE_CACHE_HASH_SIZE> palette_cache;
+ Ring palette_cache_lru = { nullptr, nullptr };
+ long palette_cache_available = CLIENT_PALETTE_CACHE_SIZE;
+
+ struct {
+ FreeList free_list;
+ std::array<uint64_t, MAX_DRAWABLE_PIXMAP_CACHE_ITEMS> pixmap_cache_items;
+ int num_pixmap_cache_items;
+ } send_data;
+
+ /* Host preferred video-codec order sorted with client preferred */
+ GArray *preferred_video_codecs;
+ /* Array with SPICE_VIDEO_CODEC_TYPE_ENUM_END elements, with the client
+ * preference order (index) as value */
+ GArray *client_preferred_video_codecs;
+
+ std::array<bool, NUM_SURFACES> surface_client_created;
+ std::array<QRegion, NUM_SURFACES> surface_client_lossy_region;
+
+ std::array<VideoStreamAgent, NUM_STREAMS> stream_agents;
+ uint32_t streams_max_latency;
+ uint64_t streams_max_bit_rate;
+ bool gl_draw_ongoing;
+};
+
+#include "pop-visibility.h"
+
+#endif /* DCC_PRIVATE_H_ */
diff --git a/server/dcc-send.cpp b/server/dcc-send.cpp
new file mode 100644
index 00000000..2c40a231
--- /dev/null
+++ b/server/dcc-send.cpp
@@ -0,0 +1,2405 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+
+#include <common/marshaller.h>
+#include <common/generated_server_marshallers.h>
+
+#include "dcc-private.h"
+#include "display-channel-private.h"
+#include "red-qxl.h"
+
+enum FillBitsType {
+ FILL_BITS_TYPE_INVALID,
+ FILL_BITS_TYPE_CACHE,
+ FILL_BITS_TYPE_SURFACE,
+ FILL_BITS_TYPE_COMPRESS_LOSSLESS,
+ FILL_BITS_TYPE_COMPRESS_LOSSY,
+ FILL_BITS_TYPE_BITMAP,
+};
+
+enum BitmapDataType {
+ BITMAP_DATA_TYPE_INVALID,
+ BITMAP_DATA_TYPE_CACHE,
+ BITMAP_DATA_TYPE_SURFACE,
+ BITMAP_DATA_TYPE_BITMAP,
+ BITMAP_DATA_TYPE_BITMAP_TO_CACHE,
+};
+
+struct BitmapData {
+ BitmapDataType type;
+ RedSurface *surface;
+ SpiceRect lossy_rect;
+};
+
+static int dcc_pixmap_cache_unlocked_hit(DisplayChannelClient *dcc, uint64_t id, int *lossy)
+{
+ PixmapCache *cache = dcc->priv->pixmap_cache;
+ NewCacheItem *item;
+ uint64_t serial;
+
+ serial = dcc->get_message_serial();
+ item = cache->hash_table[BITS_CACHE_HASH_KEY(id)];
+
+ while (item) {
+ if (item->id == id) {
+ ring_remove(&item->lru_link);
+ ring_add(&cache->lru, &item->lru_link);
+ spice_assert(dcc->priv->id < MAX_CACHE_CLIENTS);
+ item->sync[dcc->priv->id] = serial;
+ cache->sync[dcc->priv->id] = serial;
+ *lossy = item->lossy;
+ break;
+ }
+ item = item->next;
+ }
+
+ return !!item;
+}
+
+static int dcc_pixmap_cache_hit(DisplayChannelClient *dcc, uint64_t id, int *lossy)
+{
+ int hit;
+ PixmapCache *cache = dcc->priv->pixmap_cache;
+
+ pthread_mutex_lock(&cache->lock);
+ hit = dcc_pixmap_cache_unlocked_hit(dcc, id, lossy);
+ pthread_mutex_unlock(&cache->lock);
+ return hit;
+}
+
+/* set area=NULL for testing the whole surface */
+static bool is_surface_area_lossy(DisplayChannelClient *dcc, RedSurface *surface,
+ const SpiceRect *area, SpiceRect *out_lossy_area)
+{
+ QRegion *surface_lossy_region;
+ QRegion lossy_region;
+
+ surface_lossy_region = &dcc->priv->surface_client_lossy_region[surface->id];
+
+ if (!area) {
+ if (region_is_empty(surface_lossy_region)) {
+ return FALSE;
+ }
+ out_lossy_area->top = 0;
+ out_lossy_area->left = 0;
+ out_lossy_area->bottom = surface->context.height;
+ out_lossy_area->right = surface->context.width;
+ return TRUE;
+ }
+
+ region_init(&lossy_region);
+ region_add(&lossy_region, area);
+ region_and(&lossy_region, surface_lossy_region);
+ if (region_is_empty(&lossy_region)) {
+ return FALSE;
+ }
+ out_lossy_area->left = lossy_region.extents.x1;
+ out_lossy_area->top = lossy_region.extents.y1;
+ out_lossy_area->right = lossy_region.extents.x2;
+ out_lossy_area->bottom = lossy_region.extents.y2;
+ region_destroy(&lossy_region);
+ return TRUE;
+}
+
+static RedSurface*
+get_dependent_surface(const Drawable *drawable, uint32_t surface_id)
+{
+ for (auto surface : drawable->surface_deps) {
+ if (surface && surface->id == surface_id) {
+ return surface;
+ }
+ }
+ return nullptr;
+}
+
+/* returns if the bitmap was already sent lossy to the client. If the bitmap hasn't been sent yet
+ to the client, returns false. "area" is for surfaces. If area = NULL,
+ all the surface is considered. out_lossy_data will hold info about the bitmap, and its lossy
+ area in case it is lossy and part of a surface. */
+static bool is_bitmap_lossy(DisplayChannelClient *dcc, const Drawable *drawable,
+ const SpiceImage *image, SpiceRect *area,
+ BitmapData *out_data)
+{
+ out_data->type = BITMAP_DATA_TYPE_BITMAP;
+ if (image == nullptr) {
+ // self bitmap
+ return FALSE;
+ }
+
+ if ((image->descriptor.flags & SPICE_IMAGE_FLAGS_CACHE_ME)) {
+ int is_hit_lossy;
+
+ if (dcc_pixmap_cache_hit(dcc, image->descriptor.id, &is_hit_lossy)) {
+ out_data->type = BITMAP_DATA_TYPE_CACHE;
+ return is_hit_lossy;
+ }
+ out_data->type = BITMAP_DATA_TYPE_BITMAP_TO_CACHE;
+ }
+
+ if (image->descriptor.type != SPICE_IMAGE_TYPE_SURFACE) {
+ return FALSE;
+ }
+
+ // the surface should be in the dependent list
+ auto surface = get_dependent_surface(drawable, image->u.surface.surface_id);
+ if (!surface) {
+ return false;
+ }
+
+ out_data->type = BITMAP_DATA_TYPE_SURFACE;
+ out_data->surface = surface;
+
+ return is_surface_area_lossy(dcc, out_data->surface,
+ area, &out_data->lossy_rect);
+}
+
+static bool is_brush_lossy(DisplayChannelClient *dcc,
+ const Drawable *drawable, SpiceBrush *brush,
+ BitmapData *out_data)
+{
+ if (brush->type == SPICE_BRUSH_TYPE_PATTERN) {
+ return is_bitmap_lossy(dcc, drawable, brush->u.pattern.pat, nullptr,
+ out_data);
+ }
+ out_data->type = BITMAP_DATA_TYPE_INVALID;
+ return FALSE;
+}
+
+static RedChannelClient::Pipe::iterator get_pipe_tail(RedChannelClient::Pipe& pipe)
+{
+ return pipe.empty() ? pipe.end() : --pipe.end();
+}
+
+static void red_display_add_image_to_pixmap_cache(DisplayChannelClient *dcc,
+ SpiceImage *image, SpiceImage *io_image,
+ int is_lossy)
+{
+ DisplayChannel *display_channel G_GNUC_UNUSED = DCC_TO_DC(dcc);
+
+ if ((image->descriptor.flags & SPICE_IMAGE_FLAGS_CACHE_ME)) {
+ spice_assert(image->descriptor.width * image->descriptor.height > 0);
+ if (!(io_image->descriptor.flags & SPICE_IMAGE_FLAGS_CACHE_REPLACE_ME)) {
+ if (dcc_pixmap_cache_unlocked_add(dcc, image->descriptor.id,
+ image->descriptor.width * image->descriptor.height,
+ is_lossy)) {
+ io_image->descriptor.flags |= SPICE_IMAGE_FLAGS_CACHE_ME;
+ dcc->priv->send_data.pixmap_cache_items[dcc->priv->send_data.num_pixmap_cache_items++] =
+ image->descriptor.id;
+ stat_inc_counter(display_channel->priv->add_to_cache_counter, 1);
+ }
+ }
+ }
+
+ if (!(io_image->descriptor.flags & SPICE_IMAGE_FLAGS_CACHE_ME)) {
+ stat_inc_counter(display_channel->priv->non_cache_counter, 1);
+ }
+}
+
+static void marshal_sub_msg_inval_list(SpiceMarshaller *m,
+ FreeList *free_list)
+{
+ /* type + size + submessage */
+ spice_marshaller_add_uint16(m, SPICE_MSG_DISPLAY_INVAL_LIST);
+ spice_marshaller_add_uint32(m, sizeof(*free_list->res) +
+ free_list->res->count * sizeof(free_list->res->resources[0]));
+ spice_marshall_msg_display_inval_list(m, free_list->res);
+}
+
+static void marshal_sub_msg_inval_list_wait(SpiceMarshaller *m,
+ FreeList *free_list)
+{
+ /* type + size + submessage */
+ spice_marshaller_add_uint16(m, SPICE_MSG_WAIT_FOR_CHANNELS);
+ spice_marshaller_add_uint32(m, sizeof(free_list->wait.header) +
+ free_list->wait.header.wait_count * sizeof(free_list->wait.buf[0]));
+ spice_marshall_msg_wait_for_channels(m, &free_list->wait.header);
+}
+
+/* use legacy SpiceDataHeader (with sub_list) */
+static void send_free_list_legacy(DisplayChannelClient *dcc)
+{
+ FreeList *free_list = &dcc->priv->send_data.free_list;
+ SpiceMarshaller *marshaller;
+ int sub_list_len = 1;
+ SpiceMarshaller *wait_m = nullptr;
+ SpiceMarshaller *inval_m;
+ SpiceMarshaller *sub_list_m;
+
+ marshaller = dcc->get_marshaller();
+ inval_m = spice_marshaller_get_submarshaller(marshaller);
+
+ marshal_sub_msg_inval_list(inval_m, free_list);
+
+ if (free_list->wait.header.wait_count) {
+ wait_m = spice_marshaller_get_submarshaller(marshaller);
+ marshal_sub_msg_inval_list_wait(wait_m, free_list);
+ sub_list_len++;
+ }
+
+ sub_list_m = spice_marshaller_get_submarshaller(marshaller);
+ spice_marshaller_add_uint16(sub_list_m, sub_list_len);
+ if (wait_m) {
+ spice_marshaller_add_uint32(sub_list_m, spice_marshaller_get_offset(wait_m));
+ }
+ spice_marshaller_add_uint32(sub_list_m, spice_marshaller_get_offset(inval_m));
+ dcc->set_header_sub_list(spice_marshaller_get_offset(sub_list_m));
+}
+
+/* use mini header and SPICE_MSG_LIST */
+static void send_free_list(DisplayChannelClient *dcc)
+{
+ FreeList *free_list = &dcc->priv->send_data.free_list;
+ const int sub_list_len = 2;
+ SpiceMarshaller *urgent_marshaller;
+ SpiceMarshaller *wait_m;
+ SpiceMarshaller *inval_m;
+ uint32_t sub_arr_offset;
+ uint32_t wait_offset = 0;
+ uint32_t inval_offset = 0;
+ int i;
+
+ urgent_marshaller = dcc->switch_to_urgent_sender();
+ for (i = 0; i < dcc->priv->send_data.num_pixmap_cache_items; i++) {
+ int dummy;
+ /* When using the urgent marshaller, the serial number of the message that is
+ * going to be sent right after the SPICE_MSG_LIST, is increased by one.
+ * But all this message pixmaps cache references used its old serial.
+ * we use pixmap_cache_items to collect these pixmaps, and we update their serial
+ * by calling pixmap_cache_hit. */
+ dcc_pixmap_cache_hit(dcc, dcc->priv->send_data.pixmap_cache_items[i], &dummy);
+ }
+
+ if (!free_list->wait.header.wait_count) {
+ /* only one message, no need for a list */
+ dcc->init_send_data(SPICE_MSG_DISPLAY_INVAL_LIST);
+ spice_marshall_msg_display_inval_list(urgent_marshaller, free_list->res);
+ return;
+ }
+
+ dcc->init_send_data(SPICE_MSG_LIST);
+
+ /* append invalidate list */
+ inval_m = spice_marshaller_get_submarshaller(urgent_marshaller);
+ marshal_sub_msg_inval_list(inval_m, free_list);
+
+ /* append wait list */
+ wait_m = spice_marshaller_get_submarshaller(urgent_marshaller);
+ marshal_sub_msg_inval_list_wait(wait_m, free_list);
+
+ sub_arr_offset = sub_list_len * sizeof(uint32_t);
+
+ spice_marshaller_add_uint16(urgent_marshaller, sub_list_len);
+ inval_offset = spice_marshaller_get_offset(inval_m); // calc the offset before
+ // adding the sub list
+ // offsets array to the marshaller
+ /* adding the array of offsets */
+ wait_offset = spice_marshaller_get_offset(wait_m);
+ spice_marshaller_add_uint32(urgent_marshaller, wait_offset + sub_arr_offset);
+ spice_marshaller_add_uint32(urgent_marshaller, inval_offset + sub_arr_offset);
+}
+
+static void fill_base(SpiceMarshaller *base_marshaller, Drawable *drawable)
+{
+ SpiceMsgDisplayBase base;
+
+ base.surface_id = drawable->surface->id;
+ base.box = drawable->red_drawable->bbox;
+ base.clip = drawable->red_drawable->clip;
+
+ spice_marshall_DisplayBase(base_marshaller, &base);
+}
+
+static void marshaller_compress_buf_free(uint8_t *data, void *opaque)
+{
+ compress_buf_free(static_cast<RedCompressBuf *>(opaque));
+}
+
+static void marshaller_add_compressed(SpiceMarshaller *m,
+ RedCompressBuf *comp_buf, size_t size)
+{
+ size_t max = size;
+ size_t now;
+ do {
+ spice_return_if_fail(comp_buf);
+ now = MIN(sizeof(comp_buf->buf), max);
+ max -= now;
+ spice_marshaller_add_by_ref_full(m, comp_buf->buf.bytes, now,
+ marshaller_compress_buf_free, comp_buf);
+ comp_buf = comp_buf->send_next;
+ } while (max);
+}
+
+static void marshaller_unref_drawable(uint8_t *data, void *opaque)
+{
+ auto drawable = static_cast<Drawable *>(opaque);
+ drawable_unref(drawable);
+}
+
+/* if the number of times fill_bits can be called per one qxl_drawable increases -
+ MAX_LZ_DRAWABLE_INSTANCES must be increased as well */
+/* NOTE: 'simage' should be owned by the drawable. The drawable will be kept
+ * alive until the marshalled message has been sent. See comments below for
+ * more information */
+static FillBitsType fill_bits(DisplayChannelClient *dcc, SpiceMarshaller *m,
+ SpiceImage *simage, Drawable *drawable, int can_lossy)
+{
+ DisplayChannel *display = DCC_TO_DC(dcc);
+ SpiceImage image;
+ compress_send_data_t comp_send_data = {nullptr};
+ SpiceMarshaller *bitmap_palette_out, *lzplt_palette_out;
+
+ if (simage == nullptr) {
+ spice_assert(drawable->red_drawable->self_bitmap_image);
+ simage = drawable->red_drawable->self_bitmap_image;
+ }
+
+ image.descriptor = simage->descriptor;
+ image.descriptor.flags = 0;
+ if (simage->descriptor.flags & SPICE_IMAGE_FLAGS_HIGH_BITS_SET) {
+ image.descriptor.flags = SPICE_IMAGE_FLAGS_HIGH_BITS_SET;
+ }
+ pthread_mutex_lock(&dcc->priv->pixmap_cache->lock);
+
+ if ((simage->descriptor.flags & SPICE_IMAGE_FLAGS_CACHE_ME)) {
+ int lossy_cache_item;
+ if (dcc_pixmap_cache_unlocked_hit(dcc, image.descriptor.id, &lossy_cache_item)) {
+ dcc->priv->send_data.pixmap_cache_items[dcc->priv->send_data.num_pixmap_cache_items++] =
+ image.descriptor.id;
+ if (can_lossy || !lossy_cache_item) {
+ if (!display->priv->enable_jpeg || lossy_cache_item) {
+ image.descriptor.type = SPICE_IMAGE_TYPE_FROM_CACHE;
+ } else {
+ // making sure, in multiple monitor scenario, that lossy items that
+ // should have been replaced with lossless data by one display channel,
+ // will be retrieved as lossless by another display channel.
+ image.descriptor.type = SPICE_IMAGE_TYPE_FROM_CACHE_LOSSLESS;
+ }
+ spice_marshall_Image(m, &image,
+ &bitmap_palette_out, &lzplt_palette_out);
+ spice_assert(bitmap_palette_out == nullptr);
+ spice_assert(lzplt_palette_out == nullptr);
+ stat_inc_counter(display->priv->cache_hits_counter, 1);
+ pthread_mutex_unlock(&dcc->priv->pixmap_cache->lock);
+ return FILL_BITS_TYPE_CACHE;
+ }
+ pixmap_cache_unlocked_set_lossy(dcc->priv->pixmap_cache, simage->descriptor.id, FALSE);
+ image.descriptor.flags |= SPICE_IMAGE_FLAGS_CACHE_REPLACE_ME;
+ }
+ }
+
+ switch (simage->descriptor.type) {
+ case SPICE_IMAGE_TYPE_SURFACE: {
+ RedSurface *surface;
+
+ auto surface_id = simage->u.surface.surface_id;
+ surface = get_dependent_surface(drawable, surface_id);
+ if (!surface) {
+ spice_warning("Invalid surface in SPICE_IMAGE_TYPE_SURFACE");
+ pthread_mutex_unlock(&dcc->priv->pixmap_cache->lock);
+ return FILL_BITS_TYPE_SURFACE;
+ }
+
+ image.descriptor.type = SPICE_IMAGE_TYPE_SURFACE;
+ image.descriptor.flags = 0;
+ image.descriptor.width = surface->context.width;
+ image.descriptor.height = surface->context.height;
+
+ image.u.surface.surface_id = surface_id;
+ spice_marshall_Image(m, &image,
+ &bitmap_palette_out, &lzplt_palette_out);
+ spice_assert(bitmap_palette_out == nullptr);
+ spice_assert(lzplt_palette_out == nullptr);
+ pthread_mutex_unlock(&dcc->priv->pixmap_cache->lock);
+ return FILL_BITS_TYPE_SURFACE;
+ }
+ case SPICE_IMAGE_TYPE_BITMAP: {
+ SpiceBitmap *bitmap = &image.u.bitmap;
+#ifdef DUMP_BITMAP
+ dump_bitmap(&simage->u.bitmap);
+#endif
+ /* Images must be added to the cache only after they are compressed
+ in order to prevent starvation in the client between pixmap_cache and
+ global dictionary (in cases of multiple monitors) */
+ if (red_stream_get_family(dcc->get_stream()) == AF_UNIX ||
+ !dcc_compress_image(dcc, &image, &simage->u.bitmap,
+ drawable, can_lossy, &comp_send_data)) {
+ SpicePalette *palette;
+
+ red_display_add_image_to_pixmap_cache(dcc, simage, &image, FALSE);
+
+ *bitmap = simage->u.bitmap;
+ bitmap->flags = bitmap->flags & SPICE_BITMAP_FLAGS_TOP_DOWN;
+
+ palette = bitmap->palette;
+ dcc_palette_cache_palette(dcc, palette, &bitmap->flags);
+ spice_marshall_Image(m, &image,
+ &bitmap_palette_out, &lzplt_palette_out);
+ spice_assert(lzplt_palette_out == nullptr);
+
+ if (bitmap_palette_out && palette) {
+ spice_marshall_Palette(bitmap_palette_out, palette);
+ }
+
+ /* 'drawable' owns this bitmap data, so it must be kept
+ * alive until the message is sent. */
+ for (unsigned int i = 0; i < bitmap->data->num_chunks; i++) {
+ drawable->refs++;
+ spice_marshaller_add_by_ref_full(m, bitmap->data->chunk[i].data,
+ bitmap->data->chunk[i].len,
+ marshaller_unref_drawable, drawable);
+ }
+ pthread_mutex_unlock(&dcc->priv->pixmap_cache->lock);
+ return FILL_BITS_TYPE_BITMAP;
+ }
+ red_display_add_image_to_pixmap_cache(dcc, simage, &image, comp_send_data.is_lossy);
+
+ spice_marshall_Image(m, &image, &bitmap_palette_out, &lzplt_palette_out);
+ spice_assert(bitmap_palette_out == nullptr);
+
+ marshaller_add_compressed(m, comp_send_data.comp_buf,
+ comp_send_data.comp_buf_size);
+
+ if (lzplt_palette_out && comp_send_data.lzplt_palette) {
+ spice_marshall_Palette(lzplt_palette_out, comp_send_data.lzplt_palette);
+ }
+
+ spice_assert(!comp_send_data.is_lossy || can_lossy);
+ pthread_mutex_unlock(&dcc->priv->pixmap_cache->lock);
+ return (comp_send_data.is_lossy ? FILL_BITS_TYPE_COMPRESS_LOSSY :
+ FILL_BITS_TYPE_COMPRESS_LOSSLESS);
+ }
+ case SPICE_IMAGE_TYPE_QUIC:
+ red_display_add_image_to_pixmap_cache(dcc, simage, &image, FALSE);
+ image.u.quic = simage->u.quic;
+ spice_marshall_Image(m, &image,
+ &bitmap_palette_out, &lzplt_palette_out);
+ spice_assert(bitmap_palette_out == nullptr);
+ spice_assert(lzplt_palette_out == nullptr);
+ /* 'drawable' owns this image data, so it must be kept
+ * alive until the message is sent. */
+ for (unsigned int i = 0; i < image.u.quic.data->num_chunks; i++) {
+ drawable->refs++;
+ spice_marshaller_add_by_ref_full(m, image.u.quic.data->chunk[i].data,
+ image.u.quic.data->chunk[i].len,
+ marshaller_unref_drawable, drawable);
+ }
+ pthread_mutex_unlock(&dcc->priv->pixmap_cache->lock);
+ return FILL_BITS_TYPE_COMPRESS_LOSSLESS;
+ default:
+ spice_error("invalid image type %u", image.descriptor.type);
+ }
+ pthread_mutex_unlock(&dcc->priv->pixmap_cache->lock);
+ return FILL_BITS_TYPE_INVALID;
+}
+
+static void fill_mask(DisplayChannelClient *dcc, SpiceMarshaller *m,
+ SpiceImage *mask_bitmap, Drawable *drawable)
+{
+ if (mask_bitmap && m) {
+ if (dcc->priv->image_compression != SPICE_IMAGE_COMPRESSION_OFF) {
+ /* todo: pass compression argument */
+ SpiceImageCompression save_img_comp = dcc->priv->image_compression;
+ dcc->priv->image_compression = SPICE_IMAGE_COMPRESSION_OFF;
+ fill_bits(dcc, m, mask_bitmap, drawable, FALSE);
+ dcc->priv->image_compression = save_img_comp;
+ } else {
+ fill_bits(dcc, m, mask_bitmap, drawable, FALSE);
+ }
+ }
+}
+
+static void fill_attr(SpiceMarshaller *m, SpiceLineAttr *attr)
+{
+ int i;
+
+ if (m && attr->style_nseg) {
+ for (i = 0 ; i < attr->style_nseg; i++) {
+ spice_marshaller_add_uint32(m, attr->style[i]);
+ }
+ }
+}
+
+static void marshall_qxl_draw_fill(DisplayChannelClient *dcc,
+ SpiceMarshaller *base_marshaller,
+ RedDrawablePipeItem *dpi)
+{
+ Drawable *item = dpi->drawable;
+ RedDrawable *drawable = item->red_drawable.get();
+ SpiceMarshaller *brush_pat_out;
+ SpiceMarshaller *mask_bitmap_out;
+ SpiceFill fill;
+
+ dcc->init_send_data(SPICE_MSG_DISPLAY_DRAW_FILL);
+ fill_base(base_marshaller, item);
+ fill = drawable->u.fill;
+ spice_marshall_Fill(base_marshaller,
+ &fill,
+ &brush_pat_out,
+ &mask_bitmap_out);
+
+ if (brush_pat_out) {
+ fill_bits(dcc, brush_pat_out, fill.brush.u.pattern.pat, item, FALSE);
+ }
+
+ fill_mask(dcc, mask_bitmap_out, fill.mask.bitmap, item);
+}
+
+static void surface_lossy_region_update(DisplayChannelClient *dcc,
+ Drawable *item, int has_mask, int lossy)
+{
+ QRegion *surface_lossy_region;
+ RedDrawable *drawable;
+
+ if (has_mask && !lossy) {
+ return;
+ }
+
+ surface_lossy_region = &dcc->priv->surface_client_lossy_region[item->surface->id];
+ drawable = item->red_drawable.get();
+
+ if (drawable->clip.type == SPICE_CLIP_TYPE_RECTS ) {
+ QRegion clip_rgn;
+ QRegion draw_region;
+ region_init(&clip_rgn);
+ region_init(&draw_region);
+ region_add(&draw_region, &drawable->bbox);
+ region_add_clip_rects(&clip_rgn, drawable->clip.rects);
+ region_and(&draw_region, &clip_rgn);
+ if (lossy) {
+ region_or(surface_lossy_region, &draw_region);
+ } else {
+ region_exclude(surface_lossy_region, &draw_region);
+ }
+
+ region_destroy(&clip_rgn);
+ region_destroy(&draw_region);
+ } else { /* no clip */
+ if (!lossy) {
+ region_remove(surface_lossy_region, &drawable->bbox);
+ } else {
+ region_add(surface_lossy_region, &drawable->bbox);
+ }
+ }
+}
+
+static bool drawable_intersects_with_areas(Drawable *drawable, RedSurface *surfaces[],
+ SpiceRect *surface_areas[],
+ int num_surfaces)
+{
+ int i;
+ for (i = 0; i < num_surfaces; i++) {
+ if (surfaces[i] == drawable->surface) {
+ if (rect_intersects(surface_areas[i], &drawable->red_drawable->bbox)) {
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+
+static bool pipe_rendered_drawables_intersect_with_areas(DisplayChannelClient *dcc,
+ RedSurface *surfaces[],
+ SpiceRect *surface_areas[],
+ int num_surfaces)
+{
+ spice_assert(num_surfaces);
+
+ for (const auto &pipe_item : dcc->get_pipe()) {
+ Drawable *drawable;
+
+ if (pipe_item->type != RED_PIPE_ITEM_TYPE_DRAW)
+ continue;
+ drawable = static_cast<RedDrawablePipeItem*>(pipe_item.get())->drawable;
+
+ if (ring_item_is_linked(&drawable->list_link))
+ continue; // item hasn't been rendered
+
+ if (drawable_intersects_with_areas(drawable, surfaces, surface_areas, num_surfaces)) {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+static bool drawable_depends_on_areas(Drawable *drawable, RedSurface *surfaces[],
+ SpiceRect surface_areas[], int num_surfaces)
+{
+ int i;
+ int drawable_has_shadow;
+ SpiceRect shadow_rect = {0, 0, 0, 0};
+
+ RedDrawable *const red_drawable = drawable->red_drawable.get();
+ drawable_has_shadow = has_shadow(red_drawable);
+
+ if (drawable_has_shadow) {
+ int delta_x = red_drawable->u.copy_bits.src_pos.x - red_drawable->bbox.left;
+ int delta_y = red_drawable->u.copy_bits.src_pos.y - red_drawable->bbox.top;
+
+ shadow_rect.left = red_drawable->u.copy_bits.src_pos.x;
+ shadow_rect.top = red_drawable->u.copy_bits.src_pos.y;
+ shadow_rect.right = red_drawable->bbox.right + delta_x;
+ shadow_rect.bottom = red_drawable->bbox.bottom + delta_y;
+ }
+
+ for (i = 0; i < num_surfaces; i++) {
+ int x;
+
+ for (x = 0; x < 3; ++x) {
+ if (drawable->surface_deps[x] == surfaces[i]) {
+ if (rect_intersects(&surface_areas[i], &red_drawable->surfaces_rects[x])) {
+ return TRUE;
+ }
+ }
+ }
+
+ if (surfaces[i] == drawable->surface) {
+ if (drawable_has_shadow) {
+ if (rect_intersects(&surface_areas[i], &shadow_rect)) {
+ return TRUE;
+ }
+ }
+
+ // not dependent on dest
+ if (red_drawable->effect == QXL_EFFECT_OPAQUE) {
+ continue;
+ }
+
+ if (rect_intersects(&surface_areas[i], &red_drawable->bbox)) {
+ return TRUE;
+ }
+ }
+
+ }
+ return FALSE;
+}
+
+static void red_pipe_replace_rendered_drawables_with_images(DisplayChannelClient *dcc,
+ RedSurface *first_surface,
+ SpiceRect *first_area)
+{
+ RedSurface *resent_surfaces[MAX_PIPE_SIZE];
+ SpiceRect resent_areas[MAX_PIPE_SIZE]; // not pointers since drawables may be released
+ int num_resent;
+
+ resent_surfaces[0] = first_surface;
+ resent_areas[0] = *first_area;
+ num_resent = 1;
+
+ auto &pipe = dcc->get_pipe();
+
+ // going from the oldest to the newest
+ for (auto l = pipe.end(); l != pipe.begin(); ) {
+ --l;
+ RedPipeItem *pipe_item = l->get();
+
+ if (pipe_item->type != RED_PIPE_ITEM_TYPE_DRAW)
+ continue;
+ auto dpi = static_cast<RedDrawablePipeItem*>(pipe_item);
+ auto drawable = dpi->drawable;
+ if (ring_item_is_linked(&drawable->list_link))
+ continue; // item hasn't been rendered
+
+ // When a drawable command, X, depends on bitmaps that were resent,
+ // these bitmaps state at the client might not be synchronized with X
+ // (i.e., the bitmaps can be more futuristic w.r.t X). Thus, X shouldn't
+ // be rendered at the client, and we replace it with an image as well.
+ if (!drawable_depends_on_areas(drawable,
+ resent_surfaces,
+ resent_areas,
+ num_resent)) {
+ continue;
+ }
+
+ dcc_add_surface_area_image(dcc, drawable->surface,
+ &drawable->red_drawable->bbox, l, TRUE);
+ resent_surfaces[num_resent] = drawable->surface;
+ resent_areas[num_resent] = drawable->red_drawable->bbox;
+ num_resent++;
+
+ l = pipe.erase(l);
+ }
+}
+
+static void red_add_lossless_drawable_dependencies(DisplayChannelClient *dcc,
+ Drawable *item,
+ RedSurface *deps_surfaces[],
+ SpiceRect *deps_areas[],
+ int num_deps)
+{
+ DisplayChannel *display = DCC_TO_DC(dcc);
+ RedDrawable *drawable = item->red_drawable.get();
+ int sync_rendered = FALSE;
+ int i;
+
+ if (!ring_item_is_linked(&item->list_link)) {
+ /* drawable was already rendered, we may not be able to retrieve the lossless data
+ for the lossy areas */
+ sync_rendered = TRUE;
+
+ // checking if the drawable itself or one of the other commands
+ // that were rendered, affected the areas that need to be resent
+ if (!drawable_intersects_with_areas(item, deps_surfaces,
+ deps_areas, num_deps)) {
+ if (pipe_rendered_drawables_intersect_with_areas(dcc,
+ deps_surfaces,
+ deps_areas,
+ num_deps)) {
+ sync_rendered = TRUE;
+ }
+ } else {
+ sync_rendered = TRUE;
+ }
+ } else {
+ sync_rendered = FALSE;
+ for (i = 0; i < num_deps; i++) {
+ display_channel_draw_until(display, deps_areas[i], deps_surfaces[i], item);
+ }
+ }
+
+ if (!sync_rendered) {
+ // pushing the pipe item back to the pipe
+ dcc_append_drawable(dcc, item);
+ // the surfaces areas will be sent as DRAW_COPY commands, that
+ // will be executed before the current drawable
+ for (i = 0; i < num_deps; i++) {
+ dcc_add_surface_area_image(dcc, deps_surfaces[i], deps_areas[i],
+ get_pipe_tail(dcc->get_pipe()), FALSE);
+
+ }
+ } else {
+ RedSurface *drawable_surface[1];
+ SpiceRect *drawable_bbox[1];
+
+ drawable_surface[0] = item->surface;
+ drawable_bbox[0] = &drawable->bbox;
+
+ // check if the other rendered images in the pipe have updated the drawable bbox
+ if (pipe_rendered_drawables_intersect_with_areas(dcc,
+ drawable_surface,
+ drawable_bbox,
+ 1)) {
+ red_pipe_replace_rendered_drawables_with_images(dcc,
+ item->surface,
+ &drawable->bbox);
+ }
+
+ dcc_add_surface_area_image(dcc, item->surface, &drawable->bbox,
+ get_pipe_tail(dcc->get_pipe()), TRUE);
+ }
+}
+
+static void red_lossy_marshall_qxl_draw_fill(DisplayChannelClient *dcc,
+ SpiceMarshaller *m,
+ RedDrawablePipeItem *dpi)
+{
+ Drawable *item = dpi->drawable;
+ RedDrawable *drawable = item->red_drawable.get();
+
+ int dest_allowed_lossy = FALSE;
+ int dest_is_lossy = FALSE;
+ SpiceRect dest_lossy_area;
+ int brush_is_lossy;
+ BitmapData brush_bitmap_data;
+ uint16_t rop;
+
+ rop = drawable->u.fill.rop_descriptor;
+
+ dest_allowed_lossy = !((rop & SPICE_ROPD_OP_OR) ||
+ (rop & SPICE_ROPD_OP_AND) ||
+ (rop & SPICE_ROPD_OP_XOR));
+
+ brush_is_lossy = is_brush_lossy(dcc, item, &drawable->u.fill.brush,
+ &brush_bitmap_data);
+ if (!dest_allowed_lossy) {
+ dest_is_lossy = is_surface_area_lossy(dcc, item->surface, &drawable->bbox,
+ &dest_lossy_area);
+ }
+
+ if (!dest_is_lossy &&
+ !(brush_is_lossy && (brush_bitmap_data.type == BITMAP_DATA_TYPE_SURFACE))) {
+ int has_mask = !!drawable->u.fill.mask.bitmap;
+
+ marshall_qxl_draw_fill(dcc, m, dpi);
+ // either the brush operation is opaque, or the dest is not lossy
+ surface_lossy_region_update(dcc, item, has_mask, FALSE);
+ } else {
+ RedSurface *resend_surfaces[2];
+ SpiceRect *resend_areas[2];
+ int num_resend = 0;
+
+ if (dest_is_lossy) {
+ resend_surfaces[num_resend] = item->surface;
+ resend_areas[num_resend] = &dest_lossy_area;
+ num_resend++;
+ }
+
+ if (brush_is_lossy && (brush_bitmap_data.type == BITMAP_DATA_TYPE_SURFACE)) {
+ resend_surfaces[num_resend] = brush_bitmap_data.surface;
+ resend_areas[num_resend] = &brush_bitmap_data.lossy_rect;
+ num_resend++;
+ }
+
+ red_add_lossless_drawable_dependencies(dcc, item,
+ resend_surfaces, resend_areas, num_resend);
+ }
+}
+
+static FillBitsType red_marshall_qxl_draw_opaque(DisplayChannelClient *dcc,
+ SpiceMarshaller *base_marshaller,
+ RedDrawablePipeItem *dpi,
+ int src_allowed_lossy)
+{
+ Drawable *item = dpi->drawable;
+ RedDrawable *drawable = item->red_drawable.get();
+ SpiceMarshaller *brush_pat_out;
+ SpiceMarshaller *src_bitmap_out;
+ SpiceMarshaller *mask_bitmap_out;
+ SpiceOpaque opaque;
+ FillBitsType src_send_type;
+
+ dcc->init_send_data(SPICE_MSG_DISPLAY_DRAW_OPAQUE);
+ fill_base(base_marshaller, item);
+ opaque = drawable->u.opaque;
+ spice_marshall_Opaque(base_marshaller,
+ &opaque,
+ &src_bitmap_out,
+ &brush_pat_out,
+ &mask_bitmap_out);
+
+ src_send_type = fill_bits(dcc, src_bitmap_out, opaque.src_bitmap, item,
+ src_allowed_lossy);
+
+ if (brush_pat_out) {
+ fill_bits(dcc, brush_pat_out, opaque.brush.u.pattern.pat, item, FALSE);
+ }
+ fill_mask(dcc, mask_bitmap_out, opaque.mask.bitmap, item);
+
+ return src_send_type;
+}
+
+static void red_lossy_marshall_qxl_draw_opaque(DisplayChannelClient *dcc,
+ SpiceMarshaller *m,
+ RedDrawablePipeItem *dpi)
+{
+ Drawable *item = dpi->drawable;
+ RedDrawable *drawable = item->red_drawable.get();
+
+ int src_allowed_lossy;
+ int rop;
+ int src_is_lossy = FALSE;
+ int brush_is_lossy = FALSE;
+ BitmapData src_bitmap_data;
+ BitmapData brush_bitmap_data;
+
+ rop = drawable->u.opaque.rop_descriptor;
+ src_allowed_lossy = !((rop & SPICE_ROPD_OP_OR) ||
+ (rop & SPICE_ROPD_OP_AND) ||
+ (rop & SPICE_ROPD_OP_XOR));
+
+ brush_is_lossy = is_brush_lossy(dcc, item, &drawable->u.opaque.brush,
+ &brush_bitmap_data);
+
+ if (!src_allowed_lossy) {
+ src_is_lossy = is_bitmap_lossy(dcc, item, drawable->u.opaque.src_bitmap,
+ &drawable->u.opaque.src_area,
+ &src_bitmap_data);
+ }
+
+ if (!(brush_is_lossy && (brush_bitmap_data.type == BITMAP_DATA_TYPE_SURFACE)) &&
+ !(src_is_lossy && (src_bitmap_data.type == BITMAP_DATA_TYPE_SURFACE))) {
+ FillBitsType src_send_type;
+ int has_mask = !!drawable->u.opaque.mask.bitmap;
+
+ src_send_type = red_marshall_qxl_draw_opaque(dcc, m, dpi, src_allowed_lossy);
+ if (src_send_type == FILL_BITS_TYPE_COMPRESS_LOSSY) {
+ src_is_lossy = TRUE;
+ } else if (src_send_type == FILL_BITS_TYPE_COMPRESS_LOSSLESS) {
+ src_is_lossy = FALSE;
+ }
+
+ surface_lossy_region_update(dcc, item, has_mask, src_is_lossy);
+ } else {
+ RedSurface *resend_surfaces[2];
+ SpiceRect *resend_areas[2];
+ int num_resend = 0;
+
+ if (src_is_lossy && (src_bitmap_data.type == BITMAP_DATA_TYPE_SURFACE)) {
+ resend_surfaces[num_resend] = src_bitmap_data.surface;
+ resend_areas[num_resend] = &src_bitmap_data.lossy_rect;
+ num_resend++;
+ }
+
+ if (brush_is_lossy && (brush_bitmap_data.type == BITMAP_DATA_TYPE_SURFACE)) {
+ resend_surfaces[num_resend] = brush_bitmap_data.surface;
+ resend_areas[num_resend] = &brush_bitmap_data.lossy_rect;
+ num_resend++;
+ }
+
+ red_add_lossless_drawable_dependencies(dcc, item,
+ resend_surfaces, resend_areas, num_resend);
+ }
+}
+
+static FillBitsType red_marshall_qxl_draw_copy(DisplayChannelClient *dcc,
+ SpiceMarshaller *base_marshaller,
+ RedDrawablePipeItem *dpi,
+ int src_allowed_lossy)
+{
+ Drawable *item = dpi->drawable;
+ RedDrawable *drawable = item->red_drawable.get();
+ SpiceMarshaller *src_bitmap_out;
+ SpiceMarshaller *mask_bitmap_out;
+ SpiceCopy copy;
+ FillBitsType src_send_type;
+
+ dcc->init_send_data(SPICE_MSG_DISPLAY_DRAW_COPY);
+ fill_base(base_marshaller, item);
+ copy = drawable->u.copy;
+ spice_marshall_Copy(base_marshaller,
+ &copy,
+ &src_bitmap_out,
+ &mask_bitmap_out);
+
+ src_send_type = fill_bits(dcc, src_bitmap_out, copy.src_bitmap, item, src_allowed_lossy);
+ fill_mask(dcc, mask_bitmap_out, copy.mask.bitmap, item);
+
+ return src_send_type;
+}
+
+static void red_lossy_marshall_qxl_draw_copy(DisplayChannelClient *dcc,
+ SpiceMarshaller *base_marshaller,
+ RedDrawablePipeItem *dpi)
+{
+ Drawable *item = dpi->drawable;
+ RedDrawable *drawable = item->red_drawable.get();
+ int has_mask = !!drawable->u.copy.mask.bitmap;
+ int src_is_lossy;
+ BitmapData src_bitmap_data;
+ FillBitsType src_send_type;
+
+ src_is_lossy = is_bitmap_lossy(dcc, item, drawable->u.copy.src_bitmap,
+ &drawable->u.copy.src_area, &src_bitmap_data);
+
+ src_send_type = red_marshall_qxl_draw_copy(dcc, base_marshaller, dpi, TRUE);
+ if (src_send_type == FILL_BITS_TYPE_COMPRESS_LOSSY) {
+ src_is_lossy = TRUE;
+ } else if (src_send_type == FILL_BITS_TYPE_COMPRESS_LOSSLESS) {
+ src_is_lossy = FALSE;
+ }
+ surface_lossy_region_update(dcc, item, has_mask,
+ src_is_lossy);
+}
+
+static void red_marshall_qxl_draw_transparent(DisplayChannelClient *dcc,
+ SpiceMarshaller *base_marshaller,
+ RedDrawablePipeItem *dpi)
+{
+ Drawable *item = dpi->drawable;
+ RedDrawable *drawable = item->red_drawable.get();
+ SpiceMarshaller *src_bitmap_out;
+ SpiceTransparent transparent;
+
+ dcc->init_send_data(SPICE_MSG_DISPLAY_DRAW_TRANSPARENT);
+ fill_base(base_marshaller, item);
+ transparent = drawable->u.transparent;
+ spice_marshall_Transparent(base_marshaller,
+ &transparent,
+ &src_bitmap_out);
+ fill_bits(dcc, src_bitmap_out, transparent.src_bitmap, item, FALSE);
+}
+
+static void red_lossy_marshall_qxl_draw_transparent(DisplayChannelClient *dcc,
+ SpiceMarshaller *base_marshaller,
+ RedDrawablePipeItem *dpi)
+{
+ Drawable *item = dpi->drawable;
+ RedDrawable *drawable = item->red_drawable.get();
+ int src_is_lossy;
+ BitmapData src_bitmap_data;
+
+ src_is_lossy = is_bitmap_lossy(dcc, item, drawable->u.transparent.src_bitmap,
+ &drawable->u.transparent.src_area, &src_bitmap_data);
+
+ if (!src_is_lossy || (src_bitmap_data.type != BITMAP_DATA_TYPE_SURFACE)) {
+ red_marshall_qxl_draw_transparent(dcc, base_marshaller, dpi);
+ // don't update surface lossy region since transparent areas might be lossy
+ } else {
+ RedSurface *resend_surfaces[1];
+ SpiceRect *resend_areas[1];
+
+ resend_surfaces[0] = src_bitmap_data.surface;
+ resend_areas[0] = &src_bitmap_data.lossy_rect;
+
+ red_add_lossless_drawable_dependencies(dcc, item,
+ resend_surfaces, resend_areas, 1);
+ }
+}
+
+static FillBitsType red_marshall_qxl_draw_alpha_blend(DisplayChannelClient *dcc,
+ SpiceMarshaller *base_marshaller,
+ RedDrawablePipeItem *dpi,
+ int src_allowed_lossy)
+{
+ Drawable *item = dpi->drawable;
+ RedDrawable *drawable = item->red_drawable.get();
+ SpiceMarshaller *src_bitmap_out;
+ SpiceAlphaBlend alpha_blend;
+ FillBitsType src_send_type;
+
+ dcc->init_send_data(SPICE_MSG_DISPLAY_DRAW_ALPHA_BLEND);
+ fill_base(base_marshaller, item);
+ alpha_blend = drawable->u.alpha_blend;
+ spice_marshall_AlphaBlend(base_marshaller,
+ &alpha_blend,
+ &src_bitmap_out);
+ src_send_type = fill_bits(dcc, src_bitmap_out, alpha_blend.src_bitmap, item,
+ src_allowed_lossy);
+
+ return src_send_type;
+}
+
+static void red_lossy_marshall_qxl_draw_alpha_blend(DisplayChannelClient *dcc,
+ SpiceMarshaller *base_marshaller,
+ RedDrawablePipeItem *dpi)
+{
+ Drawable *item = dpi->drawable;
+ RedDrawable *drawable = item->red_drawable.get();
+ int src_is_lossy;
+ BitmapData src_bitmap_data;
+ FillBitsType src_send_type;
+
+ src_is_lossy = is_bitmap_lossy(dcc, item, drawable->u.alpha_blend.src_bitmap,
+ &drawable->u.alpha_blend.src_area, &src_bitmap_data);
+
+ src_send_type = red_marshall_qxl_draw_alpha_blend(dcc, base_marshaller, dpi, TRUE);
+
+ if (src_send_type == FILL_BITS_TYPE_COMPRESS_LOSSY) {
+ src_is_lossy = TRUE;
+ } else if (src_send_type == FILL_BITS_TYPE_COMPRESS_LOSSLESS) {
+ src_is_lossy = FALSE;
+ }
+
+ if (src_is_lossy) {
+ surface_lossy_region_update(dcc, item, FALSE, src_is_lossy);
+ } // else, the area stays lossy/lossless as the destination
+}
+
+static void red_marshall_qxl_copy_bits(RedChannelClient *rcc,
+ SpiceMarshaller *base_marshaller,
+ RedDrawablePipeItem *dpi)
+{
+ Drawable *item = dpi->drawable;
+ RedDrawable *drawable = item->red_drawable.get();
+ SpicePoint copy_bits;
+
+ rcc->init_send_data(SPICE_MSG_DISPLAY_COPY_BITS);
+ fill_base(base_marshaller, item);
+ copy_bits = drawable->u.copy_bits.src_pos;
+ spice_marshall_Point(base_marshaller,
+ &copy_bits);
+}
+
+static void red_lossy_marshall_qxl_copy_bits(DisplayChannelClient *dcc,
+ SpiceMarshaller *base_marshaller,
+ RedDrawablePipeItem *dpi)
+{
+ Drawable *item = dpi->drawable;
+ RedDrawable *drawable = item->red_drawable.get();
+ SpiceRect src_rect;
+ int horz_offset;
+ int vert_offset;
+ int src_is_lossy;
+ SpiceRect src_lossy_area;
+
+ red_marshall_qxl_copy_bits(dcc, base_marshaller, dpi);
+
+ horz_offset = drawable->u.copy_bits.src_pos.x - drawable->bbox.left;
+ vert_offset = drawable->u.copy_bits.src_pos.y - drawable->bbox.top;
+
+ src_rect.left = drawable->u.copy_bits.src_pos.x;
+ src_rect.top = drawable->u.copy_bits.src_pos.y;
+ src_rect.right = drawable->bbox.right + horz_offset;
+ src_rect.bottom = drawable->bbox.bottom + vert_offset;
+
+ src_is_lossy = is_surface_area_lossy(dcc, item->surface,
+ &src_rect, &src_lossy_area);
+
+ surface_lossy_region_update(dcc, item, FALSE, src_is_lossy);
+}
+
+static void red_marshall_qxl_draw_blend(DisplayChannelClient *dcc,
+ SpiceMarshaller *base_marshaller,
+ RedDrawablePipeItem *dpi)
+{
+ Drawable *item = dpi->drawable;
+ RedDrawable *drawable = item->red_drawable.get();
+ SpiceMarshaller *src_bitmap_out;
+ SpiceMarshaller *mask_bitmap_out;
+ SpiceBlend blend;
+
+ dcc->init_send_data(SPICE_MSG_DISPLAY_DRAW_BLEND);
+ fill_base(base_marshaller, item);
+ blend = drawable->u.blend;
+ spice_marshall_Blend(base_marshaller,
+ &blend,
+ &src_bitmap_out,
+ &mask_bitmap_out);
+
+ fill_bits(dcc, src_bitmap_out, blend.src_bitmap, item, FALSE);
+
+ fill_mask(dcc, mask_bitmap_out, blend.mask.bitmap, item);
+}
+
+static void red_lossy_marshall_qxl_draw_blend(DisplayChannelClient *dcc,
+ SpiceMarshaller *base_marshaller,
+ RedDrawablePipeItem *dpi)
+{
+ Drawable *item = dpi->drawable;
+ RedDrawable *drawable = item->red_drawable.get();
+ int src_is_lossy;
+ BitmapData src_bitmap_data;
+ int dest_is_lossy;
+ SpiceRect dest_lossy_area;
+
+ src_is_lossy = is_bitmap_lossy(dcc, item, drawable->u.blend.src_bitmap,
+ &drawable->u.blend.src_area, &src_bitmap_data);
+ dest_is_lossy = is_surface_area_lossy(dcc, item->surface,
+ &drawable->bbox, &dest_lossy_area);
+
+ if (!dest_is_lossy &&
+ (!src_is_lossy || (src_bitmap_data.type != BITMAP_DATA_TYPE_SURFACE))) {
+ red_marshall_qxl_draw_blend(dcc, base_marshaller, dpi);
+ } else {
+ RedSurface *resend_surfaces[2];
+ SpiceRect *resend_areas[2];
+ int num_resend = 0;
+
+ if (src_is_lossy && (src_bitmap_data.type == BITMAP_DATA_TYPE_SURFACE)) {
+ resend_surfaces[num_resend] = src_bitmap_data.surface;
+ resend_areas[num_resend] = &src_bitmap_data.lossy_rect;
+ num_resend++;
+ }
+
+ if (dest_is_lossy) {
+ resend_surfaces[num_resend] = item->surface;
+ resend_areas[num_resend] = &dest_lossy_area;
+ num_resend++;
+ }
+
+ red_add_lossless_drawable_dependencies(dcc, item,
+ resend_surfaces, resend_areas, num_resend);
+ }
+}
+
+static void red_marshall_qxl_draw_blackness(DisplayChannelClient *dcc,
+ SpiceMarshaller *base_marshaller,
+ RedDrawablePipeItem *dpi)
+{
+ Drawable *item = dpi->drawable;
+ RedDrawable *drawable = item->red_drawable.get();
+ SpiceMarshaller *mask_bitmap_out;
+ SpiceBlackness blackness;
+
+ dcc->init_send_data(SPICE_MSG_DISPLAY_DRAW_BLACKNESS);
+ fill_base(base_marshaller, item);
+ blackness = drawable->u.blackness;
+
+ spice_marshall_Blackness(base_marshaller,
+ &blackness,
+ &mask_bitmap_out);
+
+ fill_mask(dcc, mask_bitmap_out, blackness.mask.bitmap, item);
+}
+
+static void red_lossy_marshall_qxl_draw_blackness(DisplayChannelClient *dcc,
+ SpiceMarshaller *base_marshaller,
+ RedDrawablePipeItem *dpi)
+{
+ Drawable *item = dpi->drawable;
+ RedDrawable *drawable = item->red_drawable.get();
+ int has_mask = !!drawable->u.blackness.mask.bitmap;
+
+ red_marshall_qxl_draw_blackness(dcc, base_marshaller, dpi);
+
+ surface_lossy_region_update(dcc, item, has_mask, FALSE);
+}
+
+static void red_marshall_qxl_draw_whiteness(DisplayChannelClient *dcc,
+ SpiceMarshaller *base_marshaller,
+ RedDrawablePipeItem *dpi)
+{
+ Drawable *item = dpi->drawable;
+ RedDrawable *drawable = item->red_drawable.get();
+ SpiceMarshaller *mask_bitmap_out;
+ SpiceWhiteness whiteness;
+
+ dcc->init_send_data(SPICE_MSG_DISPLAY_DRAW_WHITENESS);
+ fill_base(base_marshaller, item);
+ whiteness = drawable->u.whiteness;
+
+ spice_marshall_Whiteness(base_marshaller,
+ &whiteness,
+ &mask_bitmap_out);
+
+ fill_mask(dcc, mask_bitmap_out, whiteness.mask.bitmap, item);
+}
+
+static void red_lossy_marshall_qxl_draw_whiteness(DisplayChannelClient *dcc,
+ SpiceMarshaller *base_marshaller,
+ RedDrawablePipeItem *dpi)
+{
+ Drawable *item = dpi->drawable;
+ RedDrawable *drawable = item->red_drawable.get();
+ int has_mask = !!drawable->u.whiteness.mask.bitmap;
+
+ red_marshall_qxl_draw_whiteness(dcc, base_marshaller, dpi);
+
+ surface_lossy_region_update(dcc, item, has_mask, FALSE);
+}
+
+static void red_marshall_qxl_draw_inverse(DisplayChannelClient *dcc,
+ SpiceMarshaller *base_marshaller,
+ Drawable *item)
+{
+ RedDrawable *drawable = item->red_drawable.get();
+ SpiceMarshaller *mask_bitmap_out;
+ SpiceInvers inverse;
+
+ dcc->init_send_data(SPICE_MSG_DISPLAY_DRAW_INVERS);
+ fill_base(base_marshaller, item);
+ inverse = drawable->u.invers;
+
+ spice_marshall_Invers(base_marshaller,
+ &inverse,
+ &mask_bitmap_out);
+
+ fill_mask(dcc, mask_bitmap_out, inverse.mask.bitmap, item);
+}
+
+static void red_lossy_marshall_qxl_draw_inverse(DisplayChannelClient *dcc,
+ SpiceMarshaller *base_marshaller,
+ Drawable *item)
+{
+ red_marshall_qxl_draw_inverse(dcc, base_marshaller, item);
+}
+
+static void red_marshall_qxl_draw_rop3(DisplayChannelClient *dcc,
+ SpiceMarshaller *base_marshaller,
+ RedDrawablePipeItem *dpi)
+{
+ Drawable *item = dpi->drawable;
+ RedDrawable *drawable = item->red_drawable.get();
+ SpiceRop3 rop3;
+ SpiceMarshaller *src_bitmap_out;
+ SpiceMarshaller *brush_pat_out;
+ SpiceMarshaller *mask_bitmap_out;
+
+ dcc->init_send_data(SPICE_MSG_DISPLAY_DRAW_ROP3);
+ fill_base(base_marshaller, item);
+ rop3 = drawable->u.rop3;
+ spice_marshall_Rop3(base_marshaller,
+ &rop3,
+ &src_bitmap_out,
+ &brush_pat_out,
+ &mask_bitmap_out);
+
+ fill_bits(dcc, src_bitmap_out, rop3.src_bitmap, item, FALSE);
+
+ if (brush_pat_out) {
+ fill_bits(dcc, brush_pat_out, rop3.brush.u.pattern.pat, item, FALSE);
+ }
+ fill_mask(dcc, mask_bitmap_out, rop3.mask.bitmap, item);
+}
+
+static void red_lossy_marshall_qxl_draw_rop3(DisplayChannelClient *dcc,
+ SpiceMarshaller *base_marshaller,
+ RedDrawablePipeItem *dpi)
+{
+ Drawable *item = dpi->drawable;
+ RedDrawable *drawable = item->red_drawable.get();
+ int src_is_lossy;
+ BitmapData src_bitmap_data;
+ int brush_is_lossy;
+ BitmapData brush_bitmap_data;
+ int dest_is_lossy;
+ SpiceRect dest_lossy_area;
+
+ src_is_lossy = is_bitmap_lossy(dcc, item, drawable->u.rop3.src_bitmap,
+ &drawable->u.rop3.src_area, &src_bitmap_data);
+ brush_is_lossy = is_brush_lossy(dcc, item, &drawable->u.rop3.brush,
+ &brush_bitmap_data);
+ dest_is_lossy = is_surface_area_lossy(dcc, item->surface,
+ &drawable->bbox, &dest_lossy_area);
+
+ if ((!src_is_lossy || (src_bitmap_data.type != BITMAP_DATA_TYPE_SURFACE)) &&
+ (!brush_is_lossy || (brush_bitmap_data.type != BITMAP_DATA_TYPE_SURFACE)) &&
+ !dest_is_lossy) {
+ int has_mask = !!drawable->u.rop3.mask.bitmap;
+ red_marshall_qxl_draw_rop3(dcc, base_marshaller, dpi);
+ surface_lossy_region_update(dcc, item, has_mask, FALSE);
+ } else {
+ RedSurface *resend_surfaces[3];
+ SpiceRect *resend_areas[3];
+ int num_resend = 0;
+
+ if (src_is_lossy && (src_bitmap_data.type == BITMAP_DATA_TYPE_SURFACE)) {
+ resend_surfaces[num_resend] = src_bitmap_data.surface;
+ resend_areas[num_resend] = &src_bitmap_data.lossy_rect;
+ num_resend++;
+ }
+
+ if (brush_is_lossy && (brush_bitmap_data.type == BITMAP_DATA_TYPE_SURFACE)) {
+ resend_surfaces[num_resend] = brush_bitmap_data.surface;
+ resend_areas[num_resend] = &brush_bitmap_data.lossy_rect;
+ num_resend++;
+ }
+
+ if (dest_is_lossy) {
+ resend_surfaces[num_resend] = item->surface;
+ resend_areas[num_resend] = &dest_lossy_area;
+ num_resend++;
+ }
+
+ red_add_lossless_drawable_dependencies(dcc, item,
+ resend_surfaces, resend_areas, num_resend);
+ }
+}
+
+static void red_marshall_qxl_draw_composite(DisplayChannelClient *dcc,
+ SpiceMarshaller *base_marshaller,
+ RedDrawablePipeItem *dpi)
+{
+ Drawable *item = dpi->drawable;
+ RedDrawable *drawable = item->red_drawable.get();
+ SpiceMarshaller *src_bitmap_out;
+ SpiceMarshaller *mask_bitmap_out;
+ SpiceComposite composite;
+
+ dcc->init_send_data(SPICE_MSG_DISPLAY_DRAW_COMPOSITE);
+ fill_base(base_marshaller, item);
+ composite = drawable->u.composite;
+ spice_marshall_Composite(base_marshaller,
+ &composite,
+ &src_bitmap_out,
+ &mask_bitmap_out);
+
+ fill_bits(dcc, src_bitmap_out, composite.src_bitmap, item, FALSE);
+ if (mask_bitmap_out) {
+ fill_bits(dcc, mask_bitmap_out, composite.mask_bitmap, item, FALSE);
+ }
+}
+
+static void red_lossy_marshall_qxl_draw_composite(DisplayChannelClient *dcc,
+ SpiceMarshaller *base_marshaller,
+ RedDrawablePipeItem *dpi)
+{
+ Drawable *item = dpi->drawable;
+ RedDrawable *drawable = item->red_drawable.get();
+ int src_is_lossy;
+ BitmapData src_bitmap_data;
+ int mask_is_lossy;
+ BitmapData mask_bitmap_data;
+ int dest_is_lossy;
+ SpiceRect dest_lossy_area;
+
+ src_is_lossy = is_bitmap_lossy(dcc, item, drawable->u.composite.src_bitmap,
+ nullptr, &src_bitmap_data);
+ mask_is_lossy = drawable->u.composite.mask_bitmap &&
+ is_bitmap_lossy(dcc, item, drawable->u.composite.mask_bitmap, nullptr, &mask_bitmap_data);
+
+ dest_is_lossy = is_surface_area_lossy(dcc, item->surface,
+ &drawable->bbox, &dest_lossy_area);
+
+ if ((!src_is_lossy || (src_bitmap_data.type != BITMAP_DATA_TYPE_SURFACE)) &&
+ (!mask_is_lossy || (mask_bitmap_data.type != BITMAP_DATA_TYPE_SURFACE)) &&
+ !dest_is_lossy) {
+ red_marshall_qxl_draw_composite(dcc, base_marshaller, dpi);
+ surface_lossy_region_update(dcc, item, FALSE, FALSE);
+ }
+ else {
+ RedSurface *resend_surfaces[3];
+ SpiceRect *resend_areas[3];
+ int num_resend = 0;
+
+ if (src_is_lossy && (src_bitmap_data.type == BITMAP_DATA_TYPE_SURFACE)) {
+ resend_surfaces[num_resend] = src_bitmap_data.surface;
+ resend_areas[num_resend] = &src_bitmap_data.lossy_rect;
+ num_resend++;
+ }
+
+ if (mask_is_lossy && (mask_bitmap_data.type == BITMAP_DATA_TYPE_SURFACE)) {
+ resend_surfaces[num_resend] = mask_bitmap_data.surface;
+ resend_areas[num_resend] = &mask_bitmap_data.lossy_rect;
+ num_resend++;
+ }
+
+ if (dest_is_lossy) {
+ resend_surfaces[num_resend] = item->surface;
+ resend_areas[num_resend] = &dest_lossy_area;
+ num_resend++;
+ }
+
+ red_add_lossless_drawable_dependencies(dcc, item,
+ resend_surfaces, resend_areas, num_resend);
+ }
+}
+
+static void red_marshall_qxl_draw_stroke(DisplayChannelClient *dcc,
+ SpiceMarshaller *base_marshaller,
+ RedDrawablePipeItem *dpi)
+{
+ Drawable *item = dpi->drawable;
+ RedDrawable *drawable = item->red_drawable.get();
+ SpiceStroke stroke;
+ SpiceMarshaller *brush_pat_out;
+ SpiceMarshaller *style_out;
+
+ dcc->init_send_data(SPICE_MSG_DISPLAY_DRAW_STROKE);
+ fill_base(base_marshaller, item);
+ stroke = drawable->u.stroke;
+ spice_marshall_Stroke(base_marshaller,
+ &stroke,
+ &style_out,
+ &brush_pat_out);
+
+ fill_attr(style_out, &stroke.attr);
+ if (brush_pat_out) {
+ fill_bits(dcc, brush_pat_out, stroke.brush.u.pattern.pat, item, FALSE);
+ }
+}
+
+static void red_lossy_marshall_qxl_draw_stroke(DisplayChannelClient *dcc,
+ SpiceMarshaller *base_marshaller,
+ RedDrawablePipeItem *dpi)
+{
+ Drawable *item = dpi->drawable;
+ RedDrawable *drawable = item->red_drawable.get();
+ int brush_is_lossy;
+ BitmapData brush_bitmap_data;
+ int dest_is_lossy = FALSE;
+ SpiceRect dest_lossy_area;
+ int rop;
+
+ brush_is_lossy = is_brush_lossy(dcc, item, &drawable->u.stroke.brush,
+ &brush_bitmap_data);
+
+ // back_mode is not used at the client. Ignoring.
+ rop = drawable->u.stroke.fore_mode;
+
+ // assuming that if the brush type is solid, the destination can
+ // be lossy, no matter what the rop is.
+ if (drawable->u.stroke.brush.type != SPICE_BRUSH_TYPE_SOLID &&
+ ((rop & SPICE_ROPD_OP_OR) || (rop & SPICE_ROPD_OP_AND) ||
+ (rop & SPICE_ROPD_OP_XOR))) {
+ dest_is_lossy = is_surface_area_lossy(dcc, item->surface,
+ &drawable->bbox, &dest_lossy_area);
+ }
+
+ if (!dest_is_lossy &&
+ (!brush_is_lossy || (brush_bitmap_data.type != BITMAP_DATA_TYPE_SURFACE)))
+ {
+ red_marshall_qxl_draw_stroke(dcc, base_marshaller, dpi);
+ } else {
+ RedSurface *resend_surfaces[2];
+ SpiceRect *resend_areas[2];
+ int num_resend = 0;
+
+ if (brush_is_lossy && (brush_bitmap_data.type == BITMAP_DATA_TYPE_SURFACE)) {
+ resend_surfaces[num_resend] = brush_bitmap_data.surface;
+ resend_areas[num_resend] = &brush_bitmap_data.lossy_rect;
+ num_resend++;
+ }
+
+ // TODO: use the path in order to resend smaller areas
+ if (dest_is_lossy) {
+ resend_surfaces[num_resend] = item->surface;
+ resend_areas[num_resend] = &dest_lossy_area;
+ num_resend++;
+ }
+
+ red_add_lossless_drawable_dependencies(dcc, item,
+ resend_surfaces, resend_areas, num_resend);
+ }
+}
+
+static void red_marshall_qxl_draw_text(DisplayChannelClient *dcc,
+ SpiceMarshaller *base_marshaller,
+ RedDrawablePipeItem *dpi)
+{
+ Drawable *item = dpi->drawable;
+ RedDrawable *drawable = item->red_drawable.get();
+ SpiceText text;
+ SpiceMarshaller *brush_pat_out;
+ SpiceMarshaller *back_brush_pat_out;
+
+ dcc->init_send_data(SPICE_MSG_DISPLAY_DRAW_TEXT);
+ fill_base(base_marshaller, item);
+ text = drawable->u.text;
+ spice_marshall_Text(base_marshaller,
+ &text,
+ &brush_pat_out,
+ &back_brush_pat_out);
+
+ if (brush_pat_out) {
+ fill_bits(dcc, brush_pat_out, text.fore_brush.u.pattern.pat, item, FALSE);
+ }
+ if (back_brush_pat_out) {
+ fill_bits(dcc, back_brush_pat_out, text.back_brush.u.pattern.pat, item, FALSE);
+ }
+}
+
+static void red_lossy_marshall_qxl_draw_text(DisplayChannelClient *dcc,
+ SpiceMarshaller *base_marshaller,
+ RedDrawablePipeItem *dpi)
+{
+ Drawable *item = dpi->drawable;
+ RedDrawable *drawable = item->red_drawable.get();
+ int fg_is_lossy;
+ BitmapData fg_bitmap_data;
+ int bg_is_lossy;
+ BitmapData bg_bitmap_data;
+ int dest_is_lossy = FALSE;
+ SpiceRect dest_lossy_area;
+ int rop = 0;
+
+ fg_is_lossy = is_brush_lossy(dcc, item, &drawable->u.text.fore_brush,
+ &fg_bitmap_data);
+ bg_is_lossy = is_brush_lossy(dcc, item, &drawable->u.text.back_brush,
+ &bg_bitmap_data);
+
+ // assuming that if the brush type is solid, the destination can
+ // be lossy, no matter what the rop is.
+ if (drawable->u.text.fore_brush.type != SPICE_BRUSH_TYPE_SOLID) {
+ rop = drawable->u.text.fore_mode;
+ }
+
+ if (drawable->u.text.back_brush.type != SPICE_BRUSH_TYPE_SOLID) {
+ rop |= drawable->u.text.back_mode;
+ }
+
+ if ((rop & SPICE_ROPD_OP_OR) || (rop & SPICE_ROPD_OP_AND) ||
+ (rop & SPICE_ROPD_OP_XOR)) {
+ dest_is_lossy = is_surface_area_lossy(dcc, item->surface,
+ &drawable->bbox, &dest_lossy_area);
+ }
+
+ if (!dest_is_lossy &&
+ (!fg_is_lossy || (fg_bitmap_data.type != BITMAP_DATA_TYPE_SURFACE)) &&
+ (!bg_is_lossy || (bg_bitmap_data.type != BITMAP_DATA_TYPE_SURFACE))) {
+ red_marshall_qxl_draw_text(dcc, base_marshaller, dpi);
+ } else {
+ RedSurface *resend_surface[3];
+ SpiceRect *resend_areas[3];
+ int num_resend = 0;
+
+ if (fg_is_lossy && (fg_bitmap_data.type == BITMAP_DATA_TYPE_SURFACE)) {
+ resend_surface[num_resend] = fg_bitmap_data.surface;
+ resend_areas[num_resend] = &fg_bitmap_data.lossy_rect;
+ num_resend++;
+ }
+
+ if (bg_is_lossy && (bg_bitmap_data.type == BITMAP_DATA_TYPE_SURFACE)) {
+ resend_surface[num_resend] = bg_bitmap_data.surface;
+ resend_areas[num_resend] = &bg_bitmap_data.lossy_rect;
+ num_resend++;
+ }
+
+ if (dest_is_lossy) {
+ resend_surface[num_resend] = item->surface;
+ resend_areas[num_resend] = &dest_lossy_area;
+ num_resend++;
+ }
+ red_add_lossless_drawable_dependencies(dcc, item,
+ resend_surface, resend_areas, num_resend);
+ }
+}
+
+static void red_release_video_encoder_buffer(uint8_t *data, void *opaque)
+{
+ auto buffer = static_cast<VideoBuffer *>(opaque);
+ buffer->free(buffer);
+}
+
+static bool red_marshall_stream_data(DisplayChannelClient *dcc,
+ SpiceMarshaller *base_marshaller,
+ Drawable *drawable)
+{
+ DisplayChannel *display = DCC_TO_DC(dcc);
+ VideoStream *stream = drawable->stream;
+ SpiceCopy *copy;
+ uint32_t frame_mm_time;
+ int is_sized;
+ VideoEncodeResults ret;
+
+ spice_assert(drawable->red_drawable->type == QXL_DRAW_COPY);
+
+ copy = &drawable->red_drawable->u.copy;
+ if (copy->src_bitmap->descriptor.type != SPICE_IMAGE_TYPE_BITMAP) {
+ return FALSE;
+ }
+
+ is_sized = (copy->src_area.right - copy->src_area.left != stream->width) ||
+ (copy->src_area.bottom - copy->src_area.top != stream->height) ||
+ !rect_is_equal(&drawable->red_drawable->bbox, &stream->dest_area);
+
+ if (is_sized &&
+ !dcc->test_remote_cap(SPICE_DISPLAY_CAP_SIZED_STREAM)) {
+ return FALSE;
+ }
+
+ int stream_id = display_channel_get_video_stream_id(display, stream);
+ VideoStreamAgent *agent = &dcc->priv->stream_agents[stream_id];
+ VideoBuffer *outbuf;
+ /* workaround for vga streams */
+ frame_mm_time = drawable->red_drawable->mm_time ?
+ drawable->red_drawable->mm_time :
+ reds_get_mm_time();
+ ret = !agent->video_encoder ? VIDEO_ENCODER_FRAME_UNSUPPORTED :
+ agent->video_encoder->encode_frame(agent->video_encoder,
+ frame_mm_time,
+ &copy->src_bitmap->u.bitmap,
+ &copy->src_area, stream->top_down,
+ drawable->red_drawable.get(),
+ &outbuf);
+ switch (ret) {
+ case VIDEO_ENCODER_FRAME_DROP:
+#ifdef STREAM_STATS
+ agent->stats.num_drops_fps++;
+#endif
+ return TRUE;
+ case VIDEO_ENCODER_FRAME_UNSUPPORTED:
+ return FALSE;
+ case VIDEO_ENCODER_FRAME_ENCODE_DONE:
+ break;
+ default:
+ spice_error("bad return value (%d) from VideoEncoder::encode_frame", ret);
+ return FALSE;
+ }
+
+ if (!is_sized) {
+ SpiceMsgDisplayStreamData stream_data;
+
+ dcc->init_send_data(SPICE_MSG_DISPLAY_STREAM_DATA);
+
+ stream_data.base.id = stream_id;
+ stream_data.base.multi_media_time = frame_mm_time;
+ stream_data.data_size = outbuf->size;
+
+ spice_marshall_msg_display_stream_data(base_marshaller, &stream_data);
+ } else {
+ SpiceMsgDisplayStreamDataSized stream_data;
+
+ dcc->init_send_data(SPICE_MSG_DISPLAY_STREAM_DATA_SIZED);
+
+ stream_data.base.id = stream_id;
+ stream_data.base.multi_media_time = frame_mm_time;
+ stream_data.data_size = outbuf->size;
+ stream_data.width = copy->src_area.right - copy->src_area.left;
+ stream_data.height = copy->src_area.bottom - copy->src_area.top;
+ stream_data.dest = drawable->red_drawable->bbox;
+
+ spice_debug("stream %d: sized frame: dest ==> ", stream_data.base.id);
+ rect_debug(&stream_data.dest);
+ spice_marshall_msg_display_stream_data_sized(base_marshaller, &stream_data);
+ }
+ spice_marshaller_add_by_ref_full(base_marshaller, outbuf->data, outbuf->size,
+ &red_release_video_encoder_buffer, outbuf);
+#ifdef STREAM_STATS
+ agent->stats.num_frames_sent++;
+ agent->stats.size_sent += outbuf->size;
+ agent->stats.end = frame_mm_time;
+#endif
+
+ return TRUE;
+}
+
+static inline void marshall_inval_palette(RedChannelClient *rcc,
+ SpiceMarshaller *base_marshaller,
+ RedCachePipeItem *cache_item)
+{
+ rcc->init_send_data(SPICE_MSG_DISPLAY_INVAL_PALETTE);
+
+ spice_marshall_msg_display_inval_palette(base_marshaller, &cache_item->inval_one);
+
+}
+
+static void display_channel_marshall_migrate_data_surfaces(DisplayChannelClient *dcc,
+ SpiceMarshaller *m,
+ int lossy)
+{
+ SpiceMarshaller *m2 = spice_marshaller_get_ptr_submarshaller(m);
+ uint32_t num_surfaces_created;
+ uint8_t *num_surfaces_created_ptr;
+ uint32_t i;
+
+ num_surfaces_created_ptr = spice_marshaller_reserve_space(m2, sizeof(uint32_t));
+ num_surfaces_created = 0;
+ for (i = 0; i < dcc->priv->surface_client_created.size(); i++) {
+ SpiceRect lossy_rect;
+
+ if (!dcc->priv->surface_client_created[i]) {
+ continue;
+ }
+ spice_marshaller_add_uint32(m2, i);
+ num_surfaces_created++;
+
+ if (!lossy) {
+ continue;
+ }
+ region_extents(&dcc->priv->surface_client_lossy_region[i], &lossy_rect);
+ spice_marshaller_add_int32(m2, lossy_rect.left);
+ spice_marshaller_add_int32(m2, lossy_rect.top);
+ spice_marshaller_add_int32(m2, lossy_rect.right);
+ spice_marshaller_add_int32(m2, lossy_rect.bottom);
+ }
+ spice_marshaller_set_uint32(m2, num_surfaces_created_ptr, num_surfaces_created);
+}
+
+static void display_channel_marshall_migrate_data(DisplayChannelClient *dcc,
+ SpiceMarshaller *base_marshaller)
+{
+ DisplayChannel *display_channel;
+ ImageEncoders *encoders = dcc_get_encoders(dcc);
+ SpiceMigrateDataDisplay display_data = {0,};
+ GlzEncDictRestoreData glz_dict_data;
+
+ display_channel = DCC_TO_DC(dcc);
+
+ dcc->init_send_data(SPICE_MSG_MIGRATE_DATA);
+ spice_marshaller_add_uint32(base_marshaller, SPICE_MIGRATE_DATA_DISPLAY_MAGIC);
+ spice_marshaller_add_uint32(base_marshaller, SPICE_MIGRATE_DATA_DISPLAY_VERSION);
+
+ spice_assert(dcc->priv->pixmap_cache);
+ SPICE_VERIFY(MIGRATE_DATA_DISPLAY_MAX_CACHE_CLIENTS == 4 &&
+ MIGRATE_DATA_DISPLAY_MAX_CACHE_CLIENTS == MAX_CACHE_CLIENTS);
+
+ display_data.message_serial = dcc->get_message_serial();
+ display_data.low_bandwidth_setting = dcc_is_low_bandwidth(dcc);
+
+ display_data.pixmap_cache_freezer = pixmap_cache_freeze(dcc->priv->pixmap_cache);
+ display_data.pixmap_cache_id = dcc->priv->pixmap_cache->id;
+ display_data.pixmap_cache_size = dcc->priv->pixmap_cache->size;
+ memcpy(display_data.pixmap_cache_clients, dcc->priv->pixmap_cache->sync,
+ sizeof(display_data.pixmap_cache_clients));
+
+ image_encoders_glz_get_restore_data(encoders, &display_data.glz_dict_id,
+ &glz_dict_data);
+ display_data.glz_dict_data = glz_dict_data;
+
+ /* all data besided the surfaces ref */
+ spice_marshaller_add(base_marshaller, reinterpret_cast<uint8_t *>(&display_data),
+ sizeof(display_data) - sizeof(uint32_t));
+ display_channel_marshall_migrate_data_surfaces(dcc, base_marshaller,
+ display_channel->priv->enable_jpeg);
+}
+
+static void display_channel_marshall_pixmap_sync(DisplayChannelClient *dcc,
+ SpiceMarshaller *base_marshaller)
+{
+ SpiceMsgWaitForChannels wait;
+ PixmapCache *pixmap_cache;
+
+ dcc->init_send_data(SPICE_MSG_WAIT_FOR_CHANNELS);
+ pixmap_cache = dcc->priv->pixmap_cache;
+
+ pthread_mutex_lock(&pixmap_cache->lock);
+
+ wait.wait_count = 1;
+ wait.wait_list[0].channel_type = SPICE_CHANNEL_DISPLAY;
+ wait.wait_list[0].channel_id = pixmap_cache->generation_initiator.client;
+ wait.wait_list[0].message_serial = pixmap_cache->generation_initiator.message;
+ dcc->priv->pixmap_cache_generation = pixmap_cache->generation;
+ dcc->priv->pending_pixmaps_sync = FALSE;
+
+ pthread_mutex_unlock(&pixmap_cache->lock);
+
+ spice_marshall_msg_wait_for_channels(base_marshaller, &wait);
+}
+
+static void dcc_pixmap_cache_reset(DisplayChannelClient *dcc, SpiceMsgWaitForChannels* sync_data)
+{
+ PixmapCache *cache = dcc->priv->pixmap_cache;
+ uint8_t wait_count;
+ uint64_t serial;
+ uint32_t i;
+
+ serial = dcc->get_message_serial();
+ pthread_mutex_lock(&cache->lock);
+ pixmap_cache_clear(cache);
+
+ dcc->priv->pixmap_cache_generation = ++cache->generation;
+ cache->generation_initiator.client = dcc->priv->id;
+ cache->generation_initiator.message = serial;
+ cache->sync[dcc->priv->id] = serial;
+
+ wait_count = 0;
+ for (i = 0; i < MAX_CACHE_CLIENTS; i++) {
+ if (cache->sync[i] && i != dcc->priv->id) {
+ sync_data->wait_list[wait_count].channel_type = SPICE_CHANNEL_DISPLAY;
+ sync_data->wait_list[wait_count].channel_id = i;
+ sync_data->wait_list[wait_count++].message_serial = cache->sync[i];
+ }
+ }
+ sync_data->wait_count = wait_count;
+ pthread_mutex_unlock(&cache->lock);
+}
+
+static void display_channel_marshall_reset_cache(DisplayChannelClient *dcc,
+ SpiceMarshaller *base_marshaller)
+{
+ SpiceMsgWaitForChannels wait;
+
+ dcc->init_send_data(SPICE_MSG_DISPLAY_INVAL_ALL_PIXMAPS);
+ dcc_pixmap_cache_reset(dcc, &wait);
+
+ spice_marshall_msg_display_inval_all_pixmaps(base_marshaller,
+ &wait);
+}
+
+static void red_marshall_image(DisplayChannelClient *dcc,
+ SpiceMarshaller *m,
+ RedImageItem *item)
+{
+ DisplayChannel *display;
+ SpiceImage red_image;
+ SpiceBitmap bitmap;
+ SpiceChunks *chunks;
+ QRegion *surface_lossy_region;
+ SpiceMsgDisplayDrawCopy copy;
+ SpiceMarshaller *src_bitmap_out, *mask_bitmap_out;
+ SpiceMarshaller *bitmap_palette_out, *lzplt_palette_out;
+
+ spice_assert(dcc && item);
+
+ display = DCC_TO_DC(dcc);
+ spice_assert(display);
+
+ QXL_SET_IMAGE_ID(&red_image, QXL_IMAGE_GROUP_RED, display_channel_generate_uid(display));
+ red_image.descriptor.type = SPICE_IMAGE_TYPE_BITMAP;
+ red_image.descriptor.flags = item->image_flags;
+ red_image.descriptor.width = item->width;
+ red_image.descriptor.height = item->height;
+
+ bitmap.format = item->image_format;
+ bitmap.flags = 0;
+ if (item->top_down) {
+ bitmap.flags |= SPICE_BITMAP_FLAGS_TOP_DOWN;
+ }
+ bitmap.x = item->width;
+ bitmap.y = item->height;
+ bitmap.stride = item->stride;
+ bitmap.palette = nullptr;
+ bitmap.palette_id = 0;
+
+ chunks = spice_chunks_new_linear(item->data, bitmap.stride * bitmap.y);
+ bitmap.data = chunks;
+
+ dcc->init_send_data(SPICE_MSG_DISPLAY_DRAW_COPY);
+
+ copy.base.surface_id = item->surface_id;
+ copy.base.box.left = item->pos.x;
+ copy.base.box.top = item->pos.y;
+ copy.base.box.right = item->pos.x + bitmap.x;
+ copy.base.box.bottom = item->pos.y + bitmap.y;
+ copy.base.clip.type = SPICE_CLIP_TYPE_NONE;
+ copy.data.rop_descriptor = SPICE_ROPD_OP_PUT;
+ copy.data.src_area.left = 0;
+ copy.data.src_area.top = 0;
+ copy.data.src_area.right = bitmap.x;
+ copy.data.src_area.bottom = bitmap.y;
+ copy.data.scale_mode = 0;
+ copy.data.src_bitmap = nullptr;
+ copy.data.mask.flags = 0;
+ copy.data.mask.pos.x = 0;
+ copy.data.mask.pos.y = 0;
+ copy.data.mask.bitmap = nullptr;
+
+ spice_marshall_msg_display_draw_copy(m, &copy,
+ &src_bitmap_out, &mask_bitmap_out);
+
+ compress_send_data_t comp_send_data = {nullptr};
+
+ int comp_succeeded = dcc_compress_image(dcc, &red_image, &bitmap, nullptr, item->can_lossy, &comp_send_data);
+
+ surface_lossy_region = &dcc->priv->surface_client_lossy_region[item->surface_id];
+ if (comp_succeeded) {
+ spice_marshall_Image(src_bitmap_out, &red_image,
+ &bitmap_palette_out, &lzplt_palette_out);
+
+ marshaller_add_compressed(src_bitmap_out,
+ comp_send_data.comp_buf, comp_send_data.comp_buf_size);
+
+ if (lzplt_palette_out && comp_send_data.lzplt_palette) {
+ spice_marshall_Palette(lzplt_palette_out, comp_send_data.lzplt_palette);
+ }
+
+ if (spice_image_descriptor_is_lossy(&red_image.descriptor)) {
+ region_add(surface_lossy_region, &copy.base.box);
+ } else {
+ region_remove(surface_lossy_region, &copy.base.box);
+ }
+ } else {
+ red_image.descriptor.type = SPICE_IMAGE_TYPE_BITMAP;
+ red_image.u.bitmap = bitmap;
+
+ spice_marshall_Image(src_bitmap_out, &red_image,
+ &bitmap_palette_out, &lzplt_palette_out);
+ item->add_to_marshaller(src_bitmap_out, item->data,
+ bitmap.y * bitmap.stride);
+ region_remove(surface_lossy_region, &copy.base.box);
+ }
+ spice_chunks_destroy(chunks);
+}
+
+static void marshall_lossy_qxl_drawable(DisplayChannelClient *dcc,
+ SpiceMarshaller *base_marshaller,
+ RedDrawablePipeItem *dpi)
+{
+ Drawable *item = dpi->drawable;
+ switch (item->red_drawable->type) {
+ case QXL_DRAW_FILL:
+ red_lossy_marshall_qxl_draw_fill(dcc, base_marshaller, dpi);
+ break;
+ case QXL_DRAW_OPAQUE:
+ red_lossy_marshall_qxl_draw_opaque(dcc, base_marshaller, dpi);
+ break;
+ case QXL_DRAW_COPY:
+ red_lossy_marshall_qxl_draw_copy(dcc, base_marshaller, dpi);
+ break;
+ case QXL_DRAW_TRANSPARENT:
+ red_lossy_marshall_qxl_draw_transparent(dcc, base_marshaller, dpi);
+ break;
+ case QXL_DRAW_ALPHA_BLEND:
+ red_lossy_marshall_qxl_draw_alpha_blend(dcc, base_marshaller, dpi);
+ break;
+ case QXL_COPY_BITS:
+ red_lossy_marshall_qxl_copy_bits(dcc, base_marshaller, dpi);
+ break;
+ case QXL_DRAW_BLEND:
+ red_lossy_marshall_qxl_draw_blend(dcc, base_marshaller, dpi);
+ break;
+ case QXL_DRAW_BLACKNESS:
+ red_lossy_marshall_qxl_draw_blackness(dcc, base_marshaller, dpi);
+ break;
+ case QXL_DRAW_WHITENESS:
+ red_lossy_marshall_qxl_draw_whiteness(dcc, base_marshaller, dpi);
+ break;
+ case QXL_DRAW_INVERS:
+ red_lossy_marshall_qxl_draw_inverse(dcc, base_marshaller, item);
+ break;
+ case QXL_DRAW_ROP3:
+ red_lossy_marshall_qxl_draw_rop3(dcc, base_marshaller, dpi);
+ break;
+ case QXL_DRAW_COMPOSITE:
+ red_lossy_marshall_qxl_draw_composite(dcc, base_marshaller, dpi);
+ break;
+ case QXL_DRAW_STROKE:
+ red_lossy_marshall_qxl_draw_stroke(dcc, base_marshaller, dpi);
+ break;
+ case QXL_DRAW_TEXT:
+ red_lossy_marshall_qxl_draw_text(dcc, base_marshaller, dpi);
+ break;
+ default:
+ spice_warn_if_reached();
+ }
+}
+
+static void marshall_lossless_qxl_drawable(DisplayChannelClient *dcc,
+ SpiceMarshaller *m,
+ RedDrawablePipeItem *dpi)
+{
+ Drawable *item = dpi->drawable;
+ RedDrawable *drawable = item->red_drawable.get();
+
+ switch (drawable->type) {
+ case QXL_DRAW_FILL:
+ marshall_qxl_draw_fill(dcc, m, dpi);
+ break;
+ case QXL_DRAW_OPAQUE:
+ red_marshall_qxl_draw_opaque(dcc, m, dpi, FALSE);
+ break;
+ case QXL_DRAW_COPY:
+ red_marshall_qxl_draw_copy(dcc, m, dpi, FALSE);
+ break;
+ case QXL_DRAW_TRANSPARENT:
+ red_marshall_qxl_draw_transparent(dcc, m, dpi);
+ break;
+ case QXL_DRAW_ALPHA_BLEND:
+ red_marshall_qxl_draw_alpha_blend(dcc, m, dpi, FALSE);
+ break;
+ case QXL_COPY_BITS:
+ red_marshall_qxl_copy_bits(dcc, m, dpi);
+ break;
+ case QXL_DRAW_BLEND:
+ red_marshall_qxl_draw_blend(dcc, m, dpi);
+ break;
+ case QXL_DRAW_BLACKNESS:
+ red_marshall_qxl_draw_blackness(dcc, m, dpi);
+ break;
+ case QXL_DRAW_WHITENESS:
+ red_marshall_qxl_draw_whiteness(dcc, m, dpi);
+ break;
+ case QXL_DRAW_INVERS:
+ red_marshall_qxl_draw_inverse(dcc, m, item);
+ break;
+ case QXL_DRAW_ROP3:
+ red_marshall_qxl_draw_rop3(dcc, m, dpi);
+ break;
+ case QXL_DRAW_STROKE:
+ red_marshall_qxl_draw_stroke(dcc, m, dpi);
+ break;
+ case QXL_DRAW_COMPOSITE:
+ red_marshall_qxl_draw_composite(dcc, m, dpi);
+ break;
+ case QXL_DRAW_TEXT:
+ red_marshall_qxl_draw_text(dcc, m, dpi);
+ break;
+ default:
+ spice_warn_if_reached();
+ }
+}
+
+static void marshall_qxl_drawable(DisplayChannelClient *dcc,
+ SpiceMarshaller *m,
+ RedDrawablePipeItem *dpi)
+{
+ spice_return_if_fail(dcc);
+
+ Drawable *item = dpi->drawable;
+ DisplayChannel *display = DCC_TO_DC(dcc);
+
+ spice_return_if_fail(display);
+ /* allow sized frames to be streamed, even if they where replaced by another frame, since
+ * newer frames might not cover sized frames completely if they are bigger */
+ if (item->stream && red_marshall_stream_data(dcc, m, item)) {
+ return;
+ }
+ if (display->priv->enable_jpeg)
+ marshall_lossy_qxl_drawable(dcc, m, dpi);
+ else
+ marshall_lossless_qxl_drawable(dcc, m, dpi);
+}
+
+static void marshall_stream_start(DisplayChannelClient *dcc,
+ SpiceMarshaller *base_marshaller,
+ VideoStreamAgent *agent)
+{
+ VideoStream *stream = agent->stream;
+
+ spice_assert(stream);
+ if (!agent->video_encoder) {
+ /* Without a video encoder nothing will be streamed */
+ return;
+ }
+ dcc->init_send_data(SPICE_MSG_DISPLAY_STREAM_CREATE);
+ SpiceMsgDisplayStreamCreate stream_create;
+ SpiceClipRects clip_rects;
+
+ stream_create.surface_id = 0;
+ stream_create.id = display_channel_get_video_stream_id(DCC_TO_DC(dcc), stream);
+ stream_create.flags = stream->top_down ? SPICE_STREAM_FLAGS_TOP_DOWN : 0;
+ stream_create.codec_type = agent->video_encoder->codec_type;
+
+ stream_create.src_width = stream->width;
+ stream_create.src_height = stream->height;
+ stream_create.stream_width = stream_create.src_width;
+ stream_create.stream_height = stream_create.src_height;
+ stream_create.dest = stream->dest_area;
+
+ if (stream->current) {
+ RedDrawable *red_drawable = stream->current->red_drawable.get();
+ stream_create.clip = red_drawable->clip;
+ } else {
+ stream_create.clip.type = SPICE_CLIP_TYPE_RECTS;
+ clip_rects.num_rects = 0;
+ stream_create.clip.rects = &clip_rects;
+ }
+
+ stream_create.stamp = 0;
+
+ spice_marshall_msg_display_stream_create(base_marshaller, &stream_create);
+}
+
+static void marshall_stream_clip(DisplayChannelClient *dcc,
+ SpiceMarshaller *base_marshaller,
+ VideoStreamClipItem *item)
+{
+ VideoStreamAgent *agent = item->stream_agent;
+
+ spice_return_if_fail(agent->stream);
+
+ dcc->init_send_data(SPICE_MSG_DISPLAY_STREAM_CLIP);
+ SpiceMsgDisplayStreamClip stream_clip;
+
+ stream_clip.id = display_channel_get_video_stream_id(DCC_TO_DC(dcc), agent->stream);
+ stream_clip.clip.type = item->clip_type;
+ stream_clip.clip.rects = item->rects.get();
+
+ spice_marshall_msg_display_stream_clip(base_marshaller, &stream_clip);
+}
+
+static void marshall_stream_end(DisplayChannelClient *dcc,
+ SpiceMarshaller *base_marshaller,
+ VideoStreamAgent* agent)
+{
+ SpiceMsgDisplayStreamDestroy destroy;
+
+ dcc->init_send_data(SPICE_MSG_DISPLAY_STREAM_DESTROY);
+ destroy.id = display_channel_get_video_stream_id(DCC_TO_DC(dcc), agent->stream);
+ video_stream_agent_stop(agent);
+ spice_marshall_msg_display_stream_destroy(base_marshaller, &destroy);
+}
+
+static void marshall_upgrade(DisplayChannelClient *dcc, SpiceMarshaller *m,
+ RedUpgradeItem *item)
+{
+ RedChannel *channel = dcc->get_channel();
+ RedDrawable *red_drawable;
+ SpiceMsgDisplayDrawCopy copy;
+ SpiceMarshaller *src_bitmap_out, *mask_bitmap_out;
+
+ spice_assert(channel && item && item->drawable);
+ dcc->init_send_data(SPICE_MSG_DISPLAY_DRAW_COPY);
+
+ red_drawable = item->drawable->red_drawable.get();
+ spice_assert(red_drawable->type == QXL_DRAW_COPY);
+ spice_assert(red_drawable->u.copy.rop_descriptor == SPICE_ROPD_OP_PUT);
+ spice_assert(red_drawable->u.copy.mask.bitmap == nullptr);
+
+ copy.base.surface_id = 0;
+ copy.base.box = red_drawable->bbox;
+ copy.base.clip.type = SPICE_CLIP_TYPE_RECTS;
+ copy.base.clip.rects = item->rects.get();
+ copy.data = red_drawable->u.copy;
+
+ spice_marshall_msg_display_draw_copy(m, &copy,
+ &src_bitmap_out, &mask_bitmap_out);
+
+ fill_bits(dcc, src_bitmap_out, copy.data.src_bitmap, item->drawable, FALSE);
+}
+
+static void marshall_surface_create(DisplayChannelClient *dcc,
+ SpiceMarshaller *base_marshaller,
+ SpiceMsgSurfaceCreate *surface_create)
+{
+ region_init(&dcc->priv->surface_client_lossy_region[surface_create->surface_id]);
+ dcc->init_send_data(SPICE_MSG_DISPLAY_SURFACE_CREATE);
+
+ spice_marshall_msg_display_surface_create(base_marshaller, surface_create);
+}
+
+static void marshall_surface_destroy(DisplayChannelClient *dcc,
+ SpiceMarshaller *base_marshaller, uint32_t surface_id)
+{
+ SpiceMsgSurfaceDestroy surface_destroy;
+
+ region_destroy(&dcc->priv->surface_client_lossy_region[surface_id]);
+ dcc->init_send_data(SPICE_MSG_DISPLAY_SURFACE_DESTROY);
+
+ surface_destroy.surface_id = surface_id;
+
+ spice_marshall_msg_display_surface_destroy(base_marshaller, &surface_destroy);
+}
+
+static void marshall_monitors_config(RedChannelClient *rcc, SpiceMarshaller *base_marshaller,
+ MonitorsConfig *monitors_config)
+{
+ int heads_size = sizeof(SpiceHead) * monitors_config->count;
+ int i;
+ auto msg = static_cast<SpiceMsgDisplayMonitorsConfig *>(
+ g_malloc0(sizeof(SpiceMsgDisplayMonitorsConfig) + heads_size));
+ int count = 0; // ignore monitors_config->count, it may contain zero width monitors, remove them now
+
+ rcc->init_send_data(SPICE_MSG_DISPLAY_MONITORS_CONFIG);
+ for (i = 0 ; i < monitors_config->count; ++i) {
+ if (monitors_config->heads[i].width == 0 || monitors_config->heads[i].height == 0) {
+ continue;
+ }
+ msg->heads[count].monitor_id = monitors_config->heads[i].id;
+ msg->heads[count].surface_id = monitors_config->heads[i].surface_id;
+ msg->heads[count].width = monitors_config->heads[i].width;
+ msg->heads[count].height = monitors_config->heads[i].height;
+ msg->heads[count].x = monitors_config->heads[i].x;
+ msg->heads[count].y = monitors_config->heads[i].y;
+ count++;
+ }
+ msg->count = count;
+ msg->max_allowed = monitors_config->max_allowed;
+ spice_marshall_msg_display_monitors_config(base_marshaller, msg);
+ g_free(msg);
+}
+
+static void marshall_stream_activate_report(RedChannelClient *rcc,
+ SpiceMarshaller *base_marshaller,
+ RedStreamActivateReportItem *report_item)
+{
+ SpiceMsgDisplayStreamActivateReport msg;
+
+ rcc->init_send_data(SPICE_MSG_DISPLAY_STREAM_ACTIVATE_REPORT);
+ msg.stream_id = report_item->stream_id;
+ msg.unique_id = report_item->report_id;
+ msg.max_window_size = RED_STREAM_CLIENT_REPORT_WINDOW;
+ msg.timeout_ms = RED_STREAM_CLIENT_REPORT_TIMEOUT;
+ spice_marshall_msg_display_stream_activate_report(base_marshaller, &msg);
+}
+
+static void marshall_gl_scanout(DisplayChannelClient *dcc,
+ SpiceMarshaller *m,
+ RedPipeItem *item)
+{
+ DisplayChannel *display_channel = DCC_TO_DC(dcc);
+ QXLInstance* qxl = display_channel->priv->qxl;
+
+ SpiceMsgDisplayGlScanoutUnix *scanout = red_qxl_get_gl_scanout(qxl);
+ if (scanout != nullptr) {
+ dcc->init_send_data(SPICE_MSG_DISPLAY_GL_SCANOUT_UNIX);
+ spice_marshall_msg_display_gl_scanout_unix(m, scanout);
+ }
+ red_qxl_put_gl_scanout(qxl, scanout);
+}
+
+static void marshall_gl_draw(RedChannelClient *rcc,
+ SpiceMarshaller *m,
+ RedPipeItem *item)
+{
+ auto p = static_cast<RedGlDrawItem*>(item);
+
+ rcc->init_send_data(SPICE_MSG_DISPLAY_GL_DRAW);
+ spice_marshall_msg_display_gl_draw(m, &p->draw);
+}
+
+
+static void begin_send_message(DisplayChannelClient *dcc)
+{
+ FreeList *free_list = &dcc->priv->send_data.free_list;
+
+ if (free_list->res->count) {
+ int sync_count = 0;
+ int i;
+
+ for (i = 0; i < MAX_CACHE_CLIENTS; i++) {
+ if (i != dcc->priv->id && free_list->sync[i] != 0) {
+ free_list->wait.header.wait_list[sync_count].channel_type = SPICE_CHANNEL_DISPLAY;
+ free_list->wait.header.wait_list[sync_count].channel_id = i;
+ free_list->wait.header.wait_list[sync_count++].message_serial = free_list->sync[i];
+ }
+ }
+ free_list->wait.header.wait_count = sync_count;
+
+ if (dcc->is_mini_header()) {
+ send_free_list(dcc);
+ } else {
+ send_free_list_legacy(dcc);
+ }
+ }
+ dcc->begin_send_message();
+}
+
+static void reset_send_data(DisplayChannelClient *dcc)
+{
+ dcc->priv->send_data.free_list.res->count = 0;
+ dcc->priv->send_data.num_pixmap_cache_items = 0;
+ memset(dcc->priv->send_data.free_list.sync, 0,
+ sizeof(dcc->priv->send_data.free_list.sync));
+}
+
+void DisplayChannelClient::send_item(RedPipeItem *pipe_item)
+{
+ DisplayChannelClient *dcc = this;
+ SpiceMarshaller *m = get_marshaller();
+
+ ::reset_send_data(dcc);
+ switch (pipe_item->type) {
+ case RED_PIPE_ITEM_TYPE_DRAW: {
+ auto dpi = static_cast<RedDrawablePipeItem*>(pipe_item);
+ marshall_qxl_drawable(this, m, dpi);
+ break;
+ }
+ case RED_PIPE_ITEM_TYPE_INVAL_ONE:
+ marshall_inval_palette(this, m, static_cast<RedCachePipeItem*>(pipe_item));
+ break;
+ case RED_PIPE_ITEM_TYPE_STREAM_CREATE: {
+ auto item = static_cast<StreamCreateDestroyItem*>(pipe_item);
+ marshall_stream_start(this, m, item->agent);
+ break;
+ }
+ case RED_PIPE_ITEM_TYPE_STREAM_CLIP:
+ marshall_stream_clip(this, m, static_cast<VideoStreamClipItem*>(pipe_item));
+ break;
+ case RED_PIPE_ITEM_TYPE_STREAM_DESTROY: {
+ auto item = static_cast<StreamCreateDestroyItem*>(pipe_item);
+ marshall_stream_end(this, m, item->agent);
+ break;
+ }
+ case RED_PIPE_ITEM_TYPE_UPGRADE:
+ marshall_upgrade(this, m, static_cast<RedUpgradeItem*>(pipe_item));
+ break;
+ case RED_PIPE_ITEM_TYPE_MIGRATE_DATA:
+ display_channel_marshall_migrate_data(this, m);
+ break;
+ case RED_PIPE_ITEM_TYPE_IMAGE:
+ red_marshall_image(this, m, static_cast<RedImageItem*>(pipe_item));
+ break;
+ case RED_PIPE_ITEM_TYPE_PIXMAP_SYNC:
+ display_channel_marshall_pixmap_sync(this, m);
+ break;
+ case RED_PIPE_ITEM_TYPE_PIXMAP_RESET:
+ display_channel_marshall_reset_cache(this, m);
+ break;
+ case RED_PIPE_ITEM_TYPE_INVAL_PALETTE_CACHE:
+ dcc_palette_cache_reset(dcc);
+ init_send_data(SPICE_MSG_DISPLAY_INVAL_ALL_PALETTES);
+ break;
+ case RED_PIPE_ITEM_TYPE_CREATE_SURFACE: {
+ auto surface_create = static_cast<RedSurfaceCreateItem*>(pipe_item);
+ marshall_surface_create(this, m, &surface_create->surface_create);
+ break;
+ }
+ case RED_PIPE_ITEM_TYPE_DESTROY_SURFACE: {
+ auto surface_destroy = static_cast<RedSurfaceDestroyItem*>(pipe_item);
+ marshall_surface_destroy(this, m, surface_destroy->surface_destroy.surface_id);
+ break;
+ }
+ case RED_PIPE_ITEM_TYPE_MONITORS_CONFIG: {
+ auto monconf_item = static_cast<RedMonitorsConfigItem*>(pipe_item);
+ marshall_monitors_config(this, m, monconf_item->monitors_config);
+ break;
+ }
+ case RED_PIPE_ITEM_TYPE_STREAM_ACTIVATE_REPORT: {
+ auto report_item =
+ static_cast<RedStreamActivateReportItem*>(pipe_item);
+ marshall_stream_activate_report(this, m, report_item);
+ break;
+ }
+ case RED_PIPE_ITEM_TYPE_GL_SCANOUT:
+ marshall_gl_scanout(this, m, pipe_item);
+ break;
+ case RED_PIPE_ITEM_TYPE_GL_DRAW:
+ marshall_gl_draw(this, m, pipe_item);
+ break;
+ default:
+ spice_warn_if_reached();
+ }
+
+ // a message is pending
+ if (send_message_pending()) {
+ ::begin_send_message(this);
+ }
+}
diff --git a/server/dcc.cpp b/server/dcc.cpp
new file mode 100644
index 00000000..01c16ab7
--- /dev/null
+++ b/server/dcc.cpp
@@ -0,0 +1,1215 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+
+#include <common/utils.h>
+#include "dcc-private.h"
+#include "display-channel.h"
+#include "display-channel-private.h"
+#include "red-client.h"
+#include "main-channel-client.h"
+#include <spice-server-enums.h>
+
+#define DISPLAY_CLIENT_SHORT_TIMEOUT 15000000000ULL //nano
+#define DISPLAY_FREE_LIST_DEFAULT_SIZE 128
+
+static void dcc_init_stream_agents(DisplayChannelClient *dcc);
+
+DisplayChannelClient::DisplayChannelClient(DisplayChannel *display,
+ RedClient *client, RedStream *stream,
+ RedChannelCapabilities *caps,
+ uint32_t id,
+ SpiceImageCompression image_compression,
+ spice_wan_compression_t jpeg_state,
+ spice_wan_compression_t zlib_glz_state):
+ CommonGraphicsChannelClient(display, client, stream, caps, true),
+ priv(new DisplayChannelClientPrivate)
+{
+
+ // XXX from display_channel_client_init, put somewhere else
+ ring_init(&priv->palette_cache_lru);
+ // todo: tune quality according to bandwidth
+ priv->encoders.jpeg_quality = 85;
+
+ priv->send_data.free_list.res = static_cast<SpiceResourceList *>(g_malloc(
+ sizeof(SpiceResourceList) + DISPLAY_FREE_LIST_DEFAULT_SIZE * sizeof(SpiceResourceID)));
+ priv->send_data.free_list.res_size = DISPLAY_FREE_LIST_DEFAULT_SIZE;
+
+
+ priv->image_compression = image_compression;
+ priv->jpeg_state = jpeg_state;
+ priv->zlib_glz_state = zlib_glz_state;
+
+
+ priv->id = id;
+
+ image_encoders_init(&priv->encoders, &DCC_TO_DC(this)->priv->encoder_shared_data);
+
+ dcc_init_stream_agents(this);
+}
+
+DisplayChannelClient::~DisplayChannelClient()
+{
+ g_clear_pointer(&priv->preferred_video_codecs, g_array_unref);
+ g_clear_pointer(&priv->client_preferred_video_codecs, g_array_unref);
+}
+
+RedSurfaceCreateItem::RedSurfaceCreateItem(uint32_t surface_id,
+ uint32_t width,
+ uint32_t height,
+ uint32_t format,
+ uint32_t flags)
+{
+ surface_create.surface_id = surface_id;
+ surface_create.width = width;
+ surface_create.height = height;
+ surface_create.flags = flags;
+ surface_create.format = format;
+}
+
+bool dcc_drawable_is_in_pipe(DisplayChannelClient *dcc, Drawable *drawable)
+{
+ RedDrawablePipeItem *dpi;
+ GList *l;
+
+ for (l = drawable->pipes; l != nullptr; l = l->next) {
+ dpi = static_cast<RedDrawablePipeItem *>(l->data);
+ if (dpi->dcc == dcc) {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+/*
+ * Return: true if wait_if_used == false, or otherwise, if all of the pipe items that
+ * are related to the surface have been cleared (or sent) from the pipe.
+ */
+bool dcc_clear_surface_drawables_from_pipe(DisplayChannelClient *dcc, RedSurface *surface,
+ bool wait_if_used)
+{
+ spice_return_val_if_fail(dcc != nullptr, TRUE);
+ /* removing the newest drawables that their destination is surface and
+ no other drawable depends on them */
+
+ auto &pipe = dcc->get_pipe();
+ for (auto l = pipe.begin(); l != pipe.end(); ) {
+ Drawable *drawable;
+ RedDrawablePipeItem *dpi = nullptr;
+ RedPipeItem *item = l->get();
+ auto item_pos = l;
+
+ ++l;
+ if (item->type == RED_PIPE_ITEM_TYPE_DRAW) {
+ dpi = static_cast<RedDrawablePipeItem*>(item);
+ drawable = dpi->drawable;
+ } else if (item->type == RED_PIPE_ITEM_TYPE_UPGRADE) {
+ drawable = static_cast<RedUpgradeItem*>(item)->drawable;
+ } else {
+ continue;
+ }
+
+ if (drawable->surface == surface) {
+ l = pipe.erase(item_pos);
+ continue;
+ }
+
+ auto depend_found =
+ std::find(std::begin(drawable->surface_deps), std::end(drawable->surface_deps),
+ surface) != std::end(drawable->surface_deps);
+ if (depend_found) {
+ spice_debug("surface %d dependent item found %p, %p", surface->id, drawable, item);
+ if (!wait_if_used) {
+ return true;
+ }
+ return dcc->wait_pipe_item_sent(item_pos, COMMON_CLIENT_TIMEOUT);
+ }
+ }
+
+ if (!wait_if_used) {
+ return true;
+ }
+
+ /*
+ * in case that the pipe didn't contain any item that is dependent on the surface, but
+ * there is one during sending. Use a shorter timeout, since it is just one item
+ */
+ return dcc->wait_outgoing_item(DISPLAY_CLIENT_SHORT_TIMEOUT);
+}
+
+void dcc_create_surface(DisplayChannelClient *dcc, RedSurface *surface)
+{
+ DisplayChannel *display;
+ uint32_t surface_id = surface->id;
+ uint32_t flags;
+
+ if (!dcc) {
+ return;
+ }
+
+ display = DCC_TO_DC(dcc);
+ flags = is_primary_surface(display, surface) ? SPICE_SURFACE_FLAGS_PRIMARY : 0;
+
+ /* don't send redundant create surface commands to client */
+ if (display->get_during_target_migrate() ||
+ dcc->priv->surface_client_created[surface_id]) {
+ return;
+ }
+ auto create = red::make_shared<RedSurfaceCreateItem>(surface_id, surface->context.width,
+ surface->context.height,
+ surface->context.format, flags);
+ dcc->priv->surface_client_created[surface_id] = TRUE;
+ dcc->pipe_add(create);
+}
+
+// adding the pipe item after pos. If pos == NULL, adding to head.
+void
+dcc_add_surface_area_image(DisplayChannelClient *dcc, RedSurface *surface,
+ SpiceRect *area, RedChannelClient::Pipe::iterator pipe_item_pos,
+ int can_lossy)
+{
+ DisplayChannel *display = DCC_TO_DC(dcc);
+ SpiceCanvas *canvas = surface->context.canvas;
+ int stride;
+ int width;
+ int height;
+ int bpp;
+ int all_set;
+
+ spice_assert(area);
+
+ width = area->right - area->left;
+ height = area->bottom - area->top;
+ bpp = SPICE_SURFACE_FMT_DEPTH(surface->context.format) / 8;
+ stride = width * bpp;
+
+ red::shared_ptr<RedImageItem> item(new (height * stride) RedImageItem());
+
+ item->surface_id = surface->id;
+ item->image_format =
+ spice_bitmap_from_surface_type(surface->context.format);
+ item->image_flags = 0;
+ item->pos.x = area->left;
+ item->pos.y = area->top;
+ item->width = width;
+ item->height = height;
+ item->stride = stride;
+ item->top_down = surface->context.top_down;
+ item->can_lossy = can_lossy;
+
+ canvas->ops->read_bits(canvas, item->data, stride, area);
+
+ /* For 32bit non-primary surfaces we need to keep any non-zero
+ high bytes as the surface may be used as source to an alpha_blend */
+ if (!is_primary_surface(display, surface) &&
+ item->image_format == SPICE_BITMAP_FMT_32BIT &&
+ rgb32_data_has_alpha(item->width, item->height, item->stride, item->data, &all_set)) {
+ if (all_set) {
+ item->image_flags |= SPICE_IMAGE_FLAGS_HIGH_BITS_SET;
+ } else {
+ item->image_format = SPICE_BITMAP_FMT_RGBA;
+ }
+ }
+
+ if (pipe_item_pos != dcc->get_pipe().end()) {
+ dcc->pipe_add_after_pos(item, pipe_item_pos);
+ } else {
+ dcc->pipe_add(item);
+ }
+}
+
+void dcc_push_surface_image(DisplayChannelClient *dcc, RedSurface *surface)
+{
+ SpiceRect area;
+
+ if (!dcc) {
+ return;
+ }
+
+ if (!surface) {
+ return;
+ }
+ area.top = area.left = 0;
+ area.right = surface->context.width;
+ area.bottom = surface->context.height;
+
+ /* not allowing lossy compression because probably, especially if it is a primary surface,
+ it combines both "picture-like" areas with areas that are more "artificial"*/
+ dcc_add_surface_area_image(dcc, surface, &area, dcc->get_pipe().end(), false);
+}
+
+static void add_drawable_surface_images(DisplayChannelClient *dcc, Drawable *drawable)
+{
+ DisplayChannel *display = DCC_TO_DC(dcc);
+
+ for (const auto surface : drawable->surface_deps) {
+ if (surface) {
+ if (dcc->priv->surface_client_created[surface->id]) {
+ continue;
+ }
+ dcc_create_surface(dcc, surface);
+ display_channel_current_flush(display, surface);
+ dcc_push_surface_image(dcc, surface);
+ }
+ }
+
+ const auto surface = drawable->surface;
+ if (dcc->priv->surface_client_created[surface->id]) {
+ return;
+ }
+
+ dcc_create_surface(dcc, surface);
+ display_channel_current_flush(display, surface);
+ dcc_push_surface_image(dcc, surface);
+}
+
+RedDrawablePipeItem::RedDrawablePipeItem(DisplayChannelClient *init_dcc, Drawable *init_drawable):
+ drawable(init_drawable),
+ dcc(init_dcc)
+{
+ drawable->pipes = g_list_prepend(drawable->pipes, this);
+ drawable->refs++;
+}
+
+RedDrawablePipeItem::~RedDrawablePipeItem()
+{
+ drawable->pipes = g_list_remove(drawable->pipes, this);
+ drawable_unref(drawable);
+}
+
+void dcc_prepend_drawable(DisplayChannelClient *dcc, Drawable *drawable)
+{
+ auto dpi = red::make_shared<RedDrawablePipeItem>(dcc, drawable);
+
+ add_drawable_surface_images(dcc, drawable);
+ dcc->pipe_add(dpi);
+}
+
+void dcc_append_drawable(DisplayChannelClient *dcc, Drawable *drawable)
+{
+ auto dpi = red::make_shared<RedDrawablePipeItem>(dcc, drawable);
+
+ add_drawable_surface_images(dcc, drawable);
+ dcc->pipe_add_tail(dpi);
+}
+
+void dcc_add_drawable_after(DisplayChannelClient *dcc, Drawable *drawable, RedPipeItem *pos)
+{
+ auto dpi = red::make_shared<RedDrawablePipeItem>(dcc, drawable);
+
+ add_drawable_surface_images(dcc, drawable);
+ dcc->pipe_add_after(dpi, pos);
+}
+
+static void dcc_init_stream_agents(DisplayChannelClient *dcc)
+{
+ int i;
+ DisplayChannel *display = DCC_TO_DC(dcc);
+
+ for (i = 0; i < dcc->priv->stream_agents.size(); i++) {
+ VideoStreamAgent *agent = &dcc->priv->stream_agents[i];
+ agent->stream = display_channel_get_nth_video_stream(display, i);
+ region_init(&agent->vis_region);
+ region_init(&agent->clip);
+ }
+}
+
+DisplayChannelClient *dcc_new(DisplayChannel *display,
+ RedClient *client, RedStream *stream,
+ int mig_target,
+ RedChannelCapabilities *caps,
+ SpiceImageCompression image_compression,
+ spice_wan_compression_t jpeg_state,
+ spice_wan_compression_t zlib_glz_state)
+
+{
+ auto dcc =
+ red::make_shared<DisplayChannelClient>(display, client, stream, caps,
+ display->priv->qxl->id, image_compression,
+ jpeg_state, zlib_glz_state);
+ if (!dcc->init()) {
+ return nullptr;
+ }
+ spice_debug("New display (client %p) dcc %p stream %p", client, dcc.get(), stream);
+ display->set_during_target_migrate(mig_target);
+
+ return dcc.get();
+}
+
+static void dcc_create_all_streams(DisplayChannelClient *dcc)
+{
+ Ring *ring = &DCC_TO_DC(dcc)->priv->streams;
+ RingItem *item = ring;
+
+ while ((item = ring_next(ring, item))) {
+ VideoStream *stream = SPICE_CONTAINEROF(item, VideoStream, link);
+ dcc_create_stream(dcc, stream);
+ }
+}
+
+/* TODO: this function is evil^Wsynchronous, fix */
+static bool display_channel_client_wait_for_init(DisplayChannelClient *dcc)
+{
+ dcc->priv->expect_init = TRUE;
+ uint64_t end_time = spice_get_monotonic_time_ns() + COMMON_CLIENT_TIMEOUT;
+ for (;;) {
+ dcc->receive();
+ if (!dcc->is_connected()) {
+ break;
+ }
+ if (dcc->priv->pixmap_cache && dcc->priv->encoders.glz_dict) {
+ dcc->priv->pixmap_cache_generation = dcc->priv->pixmap_cache->generation;
+ /* TODO: move common.id? if it's used for a per client structure.. */
+ spice_debug("creating encoder with id == %d", dcc->priv->id);
+ if (!image_encoders_glz_create(&dcc->priv->encoders, dcc->priv->id)) {
+ spice_critical("create global lz failed");
+ }
+ return TRUE;
+ }
+ if (spice_get_monotonic_time_ns() > end_time) {
+ spice_warning("timeout");
+ dcc->disconnect();
+ break;
+ }
+ usleep(DISPLAY_CLIENT_RETRY_INTERVAL);
+ }
+ return FALSE;
+}
+
+void dcc_start(DisplayChannelClient *dcc)
+{
+ DisplayChannel *display = DCC_TO_DC(dcc);
+
+ dcc->push_set_ack();
+
+ if (dcc->is_waiting_for_migrate_data())
+ return;
+
+ if (!display_channel_client_wait_for_init(dcc))
+ return;
+
+ red::shared_ptr<DisplayChannelClient> self(dcc);
+ dcc->ack_zero_messages_window();
+ auto surface0 = display->priv->surfaces[0];
+ if (surface0) {
+ display_channel_current_flush(display, surface0);
+ dcc->pipe_add_type(RED_PIPE_ITEM_TYPE_INVAL_PALETTE_CACHE);
+ dcc_create_surface(dcc, surface0);
+ dcc_push_surface_image(dcc, surface0);
+ dcc_push_monitors_config(dcc);
+ dcc->pipe_add_empty_msg(SPICE_MSG_DISPLAY_MARK);
+ dcc_create_all_streams(dcc);
+ }
+
+ if (red_stream_is_plain_unix(dcc->get_stream()) &&
+ dcc->test_remote_cap(SPICE_DISPLAY_CAP_GL_SCANOUT)) {
+ dcc->pipe_add(dcc_gl_scanout_item_new(dcc, nullptr, 0));
+ dcc_push_monitors_config(dcc);
+ }
+}
+
+static void dcc_destroy_stream_agents(DisplayChannelClient *dcc)
+{
+ for (auto& agent : dcc->priv->stream_agents) {
+ region_destroy(&agent.vis_region);
+ region_destroy(&agent.clip);
+ if (agent.video_encoder) {
+ agent.video_encoder->destroy(agent.video_encoder);
+ agent.video_encoder = nullptr;
+ }
+ }
+}
+
+static void dcc_stop(DisplayChannelClient *dcc)
+{
+ DisplayChannel *dc = DCC_TO_DC(dcc);
+
+ pixmap_cache_unref(dcc->priv->pixmap_cache);
+ dcc->priv->pixmap_cache = nullptr;
+ dcc_palette_cache_reset(dcc);
+ g_free(dcc->priv->send_data.free_list.res);
+ dcc_destroy_stream_agents(dcc);
+ image_encoders_free(&dcc->priv->encoders);
+
+ if (dcc->priv->gl_draw_ongoing) {
+ display_channel_gl_draw_done(dc);
+ }
+}
+
+void dcc_video_stream_agent_clip(DisplayChannelClient* dcc, VideoStreamAgent *agent)
+{
+ auto item = red::make_shared<VideoStreamClipItem>(agent);
+
+ dcc->pipe_add(item);
+}
+
+RedMonitorsConfigItem::~RedMonitorsConfigItem()
+{
+ monitors_config_unref(monitors_config);
+}
+
+RedMonitorsConfigItem::RedMonitorsConfigItem(MonitorsConfig *init_monitors_config)
+{
+ monitors_config = monitors_config_ref(init_monitors_config);
+}
+
+void dcc_push_monitors_config(DisplayChannelClient *dcc)
+{
+ DisplayChannel *dc = DCC_TO_DC(dcc);
+ MonitorsConfig *monitors_config = dc->priv->monitors_config;
+
+ if (monitors_config == nullptr) {
+ spice_warning("monitors_config is NULL");
+ return;
+ }
+
+ if (!dcc->test_remote_cap(SPICE_DISPLAY_CAP_MONITORS_CONFIG)) {
+ return;
+ }
+
+ auto mci = red::make_shared<RedMonitorsConfigItem>(monitors_config);
+ dcc->pipe_add(mci);
+}
+
+RedSurfaceDestroyItem::RedSurfaceDestroyItem(uint32_t surface_id)
+{
+ surface_destroy.surface_id = surface_id;
+}
+
+RedPipeItemPtr dcc_gl_scanout_item_new(RedChannelClient *rcc, void *data, int num)
+{
+ /* FIXME: on !unix peer, start streaming with a video codec */
+ if (!red_stream_is_plain_unix(rcc->get_stream()) ||
+ !rcc->test_remote_cap(SPICE_DISPLAY_CAP_GL_SCANOUT)) {
+ red_channel_warning(rcc->get_channel(),
+ "FIXME: client does not support GL scanout");
+ rcc->disconnect();
+ return RedPipeItemPtr();
+ }
+
+ return red::make_shared<RedGlScanoutUnixItem>();
+}
+
+XXX_CAST(RedChannelClient, DisplayChannelClient, DISPLAY_CHANNEL_CLIENT);
+
+RedPipeItemPtr dcc_gl_draw_item_new(RedChannelClient *rcc, void *data, int num)
+{
+ DisplayChannelClient *dcc = DISPLAY_CHANNEL_CLIENT(rcc);
+ auto draw = static_cast<const SpiceMsgDisplayGlDraw *>(data);
+
+ if (!red_stream_is_plain_unix(rcc->get_stream()) ||
+ !rcc->test_remote_cap(SPICE_DISPLAY_CAP_GL_SCANOUT)) {
+ red_channel_warning(rcc->get_channel(),
+ "FIXME: client does not support GL scanout");
+ rcc->disconnect();
+ return RedPipeItemPtr();
+ }
+
+ dcc->priv->gl_draw_ongoing = TRUE;
+ auto item = red::make_shared<RedGlDrawItem>();
+ item->draw = *draw;
+
+ return item;
+}
+
+void dcc_destroy_surface(DisplayChannelClient *dcc, uint32_t surface_id)
+{
+ DisplayChannel *display;
+
+ if (!dcc) {
+ return;
+ }
+
+ display = DCC_TO_DC(dcc);
+
+ if (display->get_during_target_migrate() ||
+ !dcc->priv->surface_client_created[surface_id]) {
+ return;
+ }
+
+ dcc->priv->surface_client_created[surface_id] = FALSE;
+ auto destroy = red::make_shared<RedSurfaceDestroyItem>(surface_id);
+ dcc->pipe_add(destroy);
+}
+
+#define MIN_DIMENSION_TO_QUIC 3
+/**
+ * quic doesn't handle:
+ * (1) palette
+ */
+static bool can_quic_compress(SpiceBitmap *bitmap)
+{
+ return !bitmap_fmt_is_plt(bitmap->format) &&
+ bitmap->x >= MIN_DIMENSION_TO_QUIC && bitmap->y >= MIN_DIMENSION_TO_QUIC;
+}
+/**
+ * lz/glz doesn't handle:
+ * (1) bitmaps with strides that are larger than the width of the image in bytes
+ * (2) unstable bitmaps
+ */
+static bool can_lz_compress(SpiceBitmap *bitmap)
+{
+ return !bitmap_has_extra_stride(bitmap) &&
+ !(bitmap->data->flags & SPICE_CHUNKS_FLAGS_UNSTABLE);
+}
+
+#define MIN_SIZE_TO_COMPRESS 54
+static SpiceImageCompression get_compression_for_bitmap(SpiceBitmap *bitmap,
+ SpiceImageCompression preferred_compression,
+ Drawable *drawable)
+{
+ if (bitmap->y * bitmap->stride < MIN_SIZE_TO_COMPRESS) { // TODO: change the size cond
+ return SPICE_IMAGE_COMPRESSION_OFF;
+ }
+ if (preferred_compression == SPICE_IMAGE_COMPRESSION_OFF) {
+ return SPICE_IMAGE_COMPRESSION_OFF;
+ }
+ if (preferred_compression == SPICE_IMAGE_COMPRESSION_QUIC) {
+ if (can_quic_compress(bitmap)) {
+ return SPICE_IMAGE_COMPRESSION_QUIC;
+ }
+ return SPICE_IMAGE_COMPRESSION_OFF;
+ }
+
+ if (preferred_compression == SPICE_IMAGE_COMPRESSION_AUTO_GLZ ||
+ preferred_compression == SPICE_IMAGE_COMPRESSION_AUTO_LZ) {
+ if (can_quic_compress(bitmap)) {
+ if (drawable == nullptr ||
+ drawable->copy_bitmap_graduality == BITMAP_GRADUAL_INVALID) {
+ if (bitmap_fmt_has_graduality(bitmap->format) &&
+ bitmap_get_graduality_level(bitmap) == BITMAP_GRADUAL_HIGH) {
+ return SPICE_IMAGE_COMPRESSION_QUIC;
+ }
+ } else if (drawable->copy_bitmap_graduality == BITMAP_GRADUAL_HIGH) {
+ return SPICE_IMAGE_COMPRESSION_QUIC;
+ }
+ if (!can_lz_compress(bitmap)) {
+ return SPICE_IMAGE_COMPRESSION_QUIC;
+ }
+ }
+ if (preferred_compression == SPICE_IMAGE_COMPRESSION_AUTO_LZ) {
+ preferred_compression = SPICE_IMAGE_COMPRESSION_LZ;
+ } else {
+ preferred_compression = SPICE_IMAGE_COMPRESSION_GLZ;
+ }
+ }
+
+ if (preferred_compression == SPICE_IMAGE_COMPRESSION_GLZ) {
+ if (drawable == nullptr || !bitmap_fmt_has_graduality(bitmap->format)) {
+ preferred_compression = SPICE_IMAGE_COMPRESSION_LZ;
+ }
+ }
+
+ if (preferred_compression == SPICE_IMAGE_COMPRESSION_LZ4) {
+ if (!bitmap_fmt_is_rgb(bitmap->format)) {
+ preferred_compression = SPICE_IMAGE_COMPRESSION_LZ;
+ }
+ }
+
+ if (preferred_compression == SPICE_IMAGE_COMPRESSION_LZ ||
+ preferred_compression == SPICE_IMAGE_COMPRESSION_LZ4 ||
+ preferred_compression == SPICE_IMAGE_COMPRESSION_GLZ) {
+ if (can_lz_compress(bitmap)) {
+ return preferred_compression;
+ }
+ return SPICE_IMAGE_COMPRESSION_OFF;
+ }
+
+ return SPICE_IMAGE_COMPRESSION_INVALID;
+}
+
+int dcc_compress_image(DisplayChannelClient *dcc,
+ SpiceImage *dest, SpiceBitmap *src, Drawable *drawable,
+ int can_lossy,
+ compress_send_data_t* o_comp_data)
+{
+ DisplayChannel *display_channel = DCC_TO_DC(dcc);
+ SpiceImageCompression image_compression;
+ stat_start_time_t start_time;
+ int success = FALSE;
+
+ stat_start_time_init(&start_time, &display_channel->priv->encoder_shared_data.off_stat);
+
+ image_compression = get_compression_for_bitmap(src, dcc->priv->image_compression, drawable);
+ switch (image_compression) {
+ case SPICE_IMAGE_COMPRESSION_OFF:
+ break;
+ case SPICE_IMAGE_COMPRESSION_QUIC:
+ if (can_lossy && display_channel->priv->enable_jpeg &&
+ (src->format != SPICE_BITMAP_FMT_RGBA || !bitmap_has_extra_stride(src))) {
+ success = image_encoders_compress_jpeg(&dcc->priv->encoders, dest, src, o_comp_data);
+ break;
+ }
+ success = image_encoders_compress_quic(&dcc->priv->encoders, dest, src, o_comp_data);
+ break;
+ case SPICE_IMAGE_COMPRESSION_GLZ:
+ success = image_encoders_compress_glz(&dcc->priv->encoders, dest, src,
+ drawable->red_drawable.get(), &drawable->glz_retention,
+ o_comp_data,
+ display_channel->priv->enable_zlib_glz_wrap);
+ if (success) {
+ break;
+ }
+ goto lz_compress;
+#ifdef USE_LZ4
+ case SPICE_IMAGE_COMPRESSION_LZ4:
+ if (dcc->test_remote_cap(SPICE_DISPLAY_CAP_LZ4_COMPRESSION)) {
+ success = image_encoders_compress_lz4(&dcc->priv->encoders, dest, src, o_comp_data);
+ break;
+ }
+#endif
+ /* fall through */
+ case SPICE_IMAGE_COMPRESSION_LZ:
+lz_compress:
+ success = image_encoders_compress_lz(&dcc->priv->encoders, dest, src, o_comp_data);
+ if (success && !bitmap_fmt_is_rgb(src->format)) {
+ dcc_palette_cache_palette(dcc, dest->u.lz_plt.palette, &(dest->u.lz_plt.flags));
+ }
+ break;
+ default:
+ spice_error("invalid image compression type %u", image_compression);
+ }
+
+ if (!success) {
+ uint64_t image_size = src->stride * uint64_t{src->y};
+ stat_compress_add(&display_channel->priv->encoder_shared_data.off_stat, start_time, image_size, image_size);
+ }
+
+ return success;
+}
+
+#define CLIENT_PALETTE_CACHE
+#include "cache-item.tmpl.cpp"
+#undef CLIENT_PALETTE_CACHE
+
+void dcc_palette_cache_palette(DisplayChannelClient *dcc, SpicePalette *palette,
+ uint8_t *flags)
+{
+ if (palette == nullptr) {
+ return;
+ }
+ if (palette->unique) {
+ if (red_palette_cache_find(dcc, palette->unique)) {
+ *flags |= SPICE_BITMAP_FLAGS_PAL_FROM_CACHE;
+ return;
+ }
+ if (red_palette_cache_add(dcc, palette->unique, 1)) {
+ *flags |= SPICE_BITMAP_FLAGS_PAL_CACHE_ME;
+ }
+ }
+}
+
+void dcc_palette_cache_reset(DisplayChannelClient *dcc)
+{
+ red_palette_cache_reset(dcc, CLIENT_PALETTE_CACHE_SIZE);
+}
+
+static void dcc_push_release(DisplayChannelClient *dcc, uint8_t type, uint64_t id,
+ uint64_t* sync_data)
+{
+ FreeList *free_list = &dcc->priv->send_data.free_list;
+ int i;
+
+ for (i = 0; i < MAX_CACHE_CLIENTS; i++) {
+ free_list->sync[i] = MAX(free_list->sync[i], sync_data[i]);
+ }
+
+ if (free_list->res->count == free_list->res_size) {
+ free_list->res = static_cast<SpiceResourceList *>(
+ g_realloc(free_list->res,
+ sizeof(*free_list->res) + free_list->res_size * sizeof(SpiceResourceID) * 2));
+ free_list->res_size *= 2;
+ }
+ free_list->res->resources[free_list->res->count].type = type;
+ free_list->res->resources[free_list->res->count++].id = id;
+}
+
+bool dcc_pixmap_cache_unlocked_add(DisplayChannelClient *dcc, uint64_t id,
+ uint32_t size, int lossy)
+{
+ PixmapCache *cache = dcc->priv->pixmap_cache;
+ NewCacheItem *item;
+ uint64_t serial;
+ int key;
+
+ spice_assert(size > 0);
+
+ item = g_new(NewCacheItem, 1);
+ serial = dcc->get_message_serial();
+
+ if (cache->generation != dcc->priv->pixmap_cache_generation) {
+ if (!dcc->priv->pending_pixmaps_sync) {
+ dcc->pipe_add_type(RED_PIPE_ITEM_TYPE_PIXMAP_SYNC);
+ dcc->priv->pending_pixmaps_sync = TRUE;
+ }
+ g_free(item);
+ return FALSE;
+ }
+
+ cache->available -= size;
+ while (cache->available < 0) {
+ NewCacheItem *tail;
+ NewCacheItem **now;
+
+ SPICE_VERIFY(SPICE_OFFSETOF(NewCacheItem, lru_link) == 0);
+ if (!(tail = SPICE_CONTAINEROF(ring_get_tail(&cache->lru), NewCacheItem, lru_link)) ||
+ tail->sync[dcc->priv->id] == serial) {
+ cache->available += size;
+ g_free(item);
+ return FALSE;
+ }
+
+ now = &cache->hash_table[BITS_CACHE_HASH_KEY(tail->id)];
+ for (;;) {
+ spice_assert(*now);
+ if (*now == tail) {
+ *now = tail->next;
+ break;
+ }
+ now = &(*now)->next;
+ }
+ ring_remove(&tail->lru_link);
+ cache->available += tail->size;
+ cache->sync[dcc->priv->id] = serial;
+ dcc_push_release(dcc, SPICE_RES_TYPE_PIXMAP, tail->id, tail->sync);
+ g_free(tail);
+ }
+ item->next = cache->hash_table[(key = BITS_CACHE_HASH_KEY(id))];
+ cache->hash_table[key] = item;
+ ring_item_init(&item->lru_link);
+ ring_add(&cache->lru, &item->lru_link);
+ item->id = id;
+ item->size = size;
+ item->lossy = lossy;
+ memset(item->sync, 0, sizeof(item->sync));
+ item->sync[dcc->priv->id] = serial;
+ cache->sync[dcc->priv->id] = serial;
+ return TRUE;
+}
+
+static bool dcc_handle_init(DisplayChannelClient *dcc, SpiceMsgcDisplayInit *init)
+{
+ gboolean success;
+ RedClient *client = dcc->get_client();
+
+ spice_return_val_if_fail(dcc->priv->expect_init, FALSE);
+ dcc->priv->expect_init = FALSE;
+
+ spice_return_val_if_fail(!dcc->priv->pixmap_cache, FALSE);
+ dcc->priv->pixmap_cache = pixmap_cache_get(client,
+ init->pixmap_cache_id,
+ init->pixmap_cache_size);
+ spice_return_val_if_fail(dcc->priv->pixmap_cache, FALSE);
+
+ success = image_encoders_get_glz_dictionary(&dcc->priv->encoders,
+ client,
+ init->glz_dictionary_id,
+ init->glz_dictionary_window_size);
+ spice_return_val_if_fail(success, FALSE);
+
+ return TRUE;
+}
+
+static bool dcc_handle_stream_report(DisplayChannelClient *dcc,
+ SpiceMsgcDisplayStreamReport *report)
+{
+ VideoStreamAgent *agent;
+
+ if (report->stream_id >= dcc->priv->stream_agents.size()) {
+ spice_warning("stream_report: invalid stream id %u",
+ report->stream_id);
+ return FALSE;
+ }
+
+ agent = &dcc->priv->stream_agents[report->stream_id];
+ if (!agent->video_encoder) {
+ spice_debug("stream_report: no encoder for stream id %u. "
+ "The stream has probably been destroyed",
+ report->stream_id);
+ return TRUE;
+ }
+
+ if (report->num_frames == 0 && report->num_drops == UINT32_MAX) {
+ spice_warning("stream_report: the client does not support stream %u",
+ report->stream_id);
+ /* Stop streaming the video so the client can see it */
+ agent->video_encoder->destroy(agent->video_encoder);
+ agent->video_encoder = nullptr;
+ return TRUE;
+ }
+
+ if (report->unique_id != agent->report_id) {
+ spice_warning("stream_report: unique id mismatch: local (%u) != msg (%u) "
+ "The old stream was probably replaced by a new one",
+ agent->report_id, report->unique_id);
+ return TRUE;
+ }
+
+ agent->video_encoder->client_stream_report(agent->video_encoder,
+ report->num_frames,
+ report->num_drops,
+ report->start_frame_mm_time,
+ report->end_frame_mm_time,
+ report->last_frame_delay,
+ report->audio_delay);
+ return TRUE;
+}
+
+static bool dcc_handle_preferred_compression(DisplayChannelClient *dcc,
+ SpiceMsgcDisplayPreferredCompression *pc)
+{
+ switch (pc->image_compression) {
+ case SPICE_IMAGE_COMPRESSION_AUTO_LZ:
+ case SPICE_IMAGE_COMPRESSION_AUTO_GLZ:
+ case SPICE_IMAGE_COMPRESSION_QUIC:
+#ifdef USE_LZ4
+ case SPICE_IMAGE_COMPRESSION_LZ4:
+#endif
+ case SPICE_IMAGE_COMPRESSION_LZ:
+ case SPICE_IMAGE_COMPRESSION_GLZ:
+ case SPICE_IMAGE_COMPRESSION_OFF:
+ dcc->priv->image_compression = static_cast<SpiceImageCompression>(pc->image_compression);
+ break;
+ default:
+ spice_warning("preferred-compression: unsupported image compression setting");
+ }
+ g_debug("Setting preferred compression to %s",
+ spice_image_compression_t_get_nick(dcc->priv->image_compression));
+ return TRUE;
+}
+
+/* TODO: Client preference should only be considered when host has video-codecs
+ * with the same priority value. At the moment, the video-codec GArray will be
+ * sorted following only the client's preference (@user_data)
+ *
+ * example:
+ * host encoding preference: gstreamer:mjpeg;gstreamer:vp8;gstreamer:h264
+ * client decoding preference: h264, vp9, mjpeg
+ * result: gstreamer:h264;gstreamer:mjpeg;gstreamer:vp8
+ */
+static gint sort_video_codecs_by_client_preference(gconstpointer a_pointer,
+ gconstpointer b_pointer,
+ gpointer user_data)
+{
+ auto a = static_cast<const RedVideoCodec *>(a_pointer);
+ auto b = static_cast<const RedVideoCodec *>(b_pointer);
+ auto client_pref = static_cast<GArray *>(user_data);
+
+ return (g_array_index(client_pref, gint, a->type) -
+ g_array_index(client_pref, gint, b->type));
+}
+
+static void dcc_update_preferred_video_codecs(DisplayChannelClient *dcc)
+{
+ GArray *video_codecs, *server_codecs;
+ char *codecs_str;
+
+ server_codecs = display_channel_get_video_codecs(DCC_TO_DC(dcc));
+ spice_return_if_fail(server_codecs != nullptr);
+
+ /* Copy current host preference */
+ video_codecs = g_array_sized_new(FALSE, FALSE, sizeof(RedVideoCodec), server_codecs->len);
+ g_array_append_vals(video_codecs, server_codecs->data, server_codecs->len);
+
+ /* Sort the copy of current host preference based on client's preference */
+ g_array_sort_with_data(video_codecs, sort_video_codecs_by_client_preference,
+ dcc->priv->client_preferred_video_codecs);
+ g_clear_pointer(&dcc->priv->preferred_video_codecs, g_array_unref);
+ dcc->priv->preferred_video_codecs = video_codecs;
+
+ codecs_str = video_codecs_to_string(video_codecs, " ");
+ spice_debug("Preferred video-codecs: %s", codecs_str);
+ g_free(codecs_str);
+}
+
+void dcc_video_codecs_update(DisplayChannelClient *dcc)
+{
+ /* Only worry about video-codecs update if client has sent
+ * SPICE_MSGC_DISPLAY_PREFERRED_VIDEO_CODEC_TYPE */
+ if (dcc->priv->client_preferred_video_codecs == nullptr) {
+ return;
+ }
+
+ /* New host preference */
+ dcc_update_preferred_video_codecs(dcc);
+}
+
+static int dcc_handle_preferred_video_codec_type(DisplayChannelClient *dcc,
+ SpiceMsgcDisplayPreferredVideoCodecType *msg)
+{
+ g_return_val_if_fail(msg->num_of_codecs > 0, TRUE);
+
+ g_clear_pointer(&dcc->priv->client_preferred_video_codecs, g_array_unref);
+ dcc->priv->client_preferred_video_codecs = video_stream_parse_preferred_codecs(msg);
+
+ /* New client preference */
+ dcc_update_preferred_video_codecs(dcc);
+ video_stream_detach_and_stop(DCC_TO_DC(dcc));
+
+ return TRUE;
+}
+
+GArray *dcc_get_preferred_video_codecs_for_encoding(DisplayChannelClient *dcc)
+{
+ if (dcc->priv->preferred_video_codecs != nullptr) {
+ return dcc->priv->preferred_video_codecs;
+ }
+ return display_channel_get_video_codecs(DCC_TO_DC(dcc));
+}
+
+static bool dcc_handle_gl_draw_done(DisplayChannelClient *dcc)
+{
+ DisplayChannel *display = DCC_TO_DC(dcc);
+
+ if (G_UNLIKELY(!dcc->priv->gl_draw_ongoing)) {
+ g_warning("unexpected DRAW_DONE received\n");
+ /* close client connection */
+ return FALSE;
+ }
+
+ dcc->priv->gl_draw_ongoing = FALSE;
+ display_channel_gl_draw_done(display);
+
+ return TRUE;
+}
+
+bool DisplayChannelClient::handle_message(uint16_t type, uint32_t size, void *msg)
+{
+ switch (type) {
+ case SPICE_MSGC_DISPLAY_INIT:
+ return dcc_handle_init(this, static_cast<SpiceMsgcDisplayInit *>(msg));
+ case SPICE_MSGC_DISPLAY_STREAM_REPORT:
+ return dcc_handle_stream_report(this, static_cast<SpiceMsgcDisplayStreamReport *>(msg));
+ case SPICE_MSGC_DISPLAY_PREFERRED_COMPRESSION:
+ return dcc_handle_preferred_compression(
+ this, static_cast<SpiceMsgcDisplayPreferredCompression *>(msg));
+ case SPICE_MSGC_DISPLAY_GL_DRAW_DONE:
+ return dcc_handle_gl_draw_done(this);
+ case SPICE_MSGC_DISPLAY_PREFERRED_VIDEO_CODEC_TYPE:
+ return dcc_handle_preferred_video_codec_type(
+ this, static_cast<SpiceMsgcDisplayPreferredVideoCodecType *>(msg));
+ default:
+ return RedChannelClient::handle_message(type, size, msg);
+ }
+}
+
+static int dcc_handle_migrate_glz_dictionary(DisplayChannelClient *dcc,
+ SpiceMigrateDataDisplay *migrate)
+{
+ GlzEncDictRestoreData glz_dict_data = migrate->glz_dict_data;
+ return image_encoders_restore_glz_dictionary(&dcc->priv->encoders,
+ dcc->get_client(),
+ migrate->glz_dict_id,
+ &glz_dict_data);
+}
+
+static bool restore_surface(DisplayChannelClient *dcc, uint32_t surface_id)
+{
+ /* we don't process commands till we receive the migration data, thus,
+ * we should have not sent any surface to the client. */
+ if (dcc->priv->surface_client_created[surface_id]) {
+ spice_warning("surface %u is already marked as client_created", surface_id);
+ return FALSE;
+ }
+ dcc->priv->surface_client_created[surface_id] = TRUE;
+ return TRUE;
+}
+
+static bool restore_surfaces_lossless(DisplayChannelClient *dcc,
+ MigrateDisplaySurfacesAtClientLossless *mig_surfaces)
+{
+ uint32_t i;
+
+ spice_debug("trace");
+ for (i = 0; i < mig_surfaces->num_surfaces; i++) {
+ uint32_t surface_id = mig_surfaces->surfaces[i].id;
+
+ if (!restore_surface(dcc, surface_id))
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static bool restore_surfaces_lossy(DisplayChannelClient *dcc,
+ MigrateDisplaySurfacesAtClientLossy *mig_surfaces)
+{
+ uint32_t i;
+
+ spice_debug("trace");
+ for (i = 0; i < mig_surfaces->num_surfaces; i++) {
+ uint32_t surface_id = mig_surfaces->surfaces[i].id;
+ SpiceMigrateDataRect *mig_lossy_rect;
+ SpiceRect lossy_rect;
+
+ if (!restore_surface(dcc, surface_id))
+ return FALSE;
+
+ mig_lossy_rect = &mig_surfaces->surfaces[i].lossy_rect;
+ lossy_rect.left = mig_lossy_rect->left;
+ lossy_rect.top = mig_lossy_rect->top;
+ lossy_rect.right = mig_lossy_rect->right;
+ lossy_rect.bottom = mig_lossy_rect->bottom;
+ region_init(&dcc->priv->surface_client_lossy_region[surface_id]);
+ region_add(&dcc->priv->surface_client_lossy_region[surface_id], &lossy_rect);
+ }
+ return TRUE;
+}
+
+bool DisplayChannelClient::handle_migrate_data(uint32_t size, void *message)
+{
+ DisplayChannelClient *dcc = this;
+ DisplayChannel *display = DCC_TO_DC(dcc);
+ int surfaces_restored = FALSE;
+ auto header = static_cast<SpiceMigrateDataHeader *>(message);
+ auto migrate_data = reinterpret_cast<SpiceMigrateDataDisplay *>(header + 1);
+ uint8_t *surfaces;
+ int i;
+
+ spice_return_val_if_fail(
+ size >= (sizeof(*migrate_data) + sizeof(SpiceMigrateDataHeader)), FALSE);
+ spice_return_val_if_fail(
+ migration_protocol_validate_header(header,
+ SPICE_MIGRATE_DATA_DISPLAY_MAGIC, SPICE_MIGRATE_DATA_DISPLAY_VERSION), FALSE);
+
+ /* size is set to -1 in order to keep the cache frozen until the original
+ * channel client that froze the cache on the src size receives the migrate
+ * data and unfreezes the cache by setting its size > 0 and by triggering
+ * pixmap_cache_reset */
+ dcc->priv->pixmap_cache = pixmap_cache_get(dcc->get_client(),
+ migrate_data->pixmap_cache_id, -1);
+ spice_return_val_if_fail(dcc->priv->pixmap_cache, FALSE);
+
+ pthread_mutex_lock(&dcc->priv->pixmap_cache->lock);
+ for (i = 0; i < MAX_CACHE_CLIENTS; i++) {
+ dcc->priv->pixmap_cache->sync[i] = MAX(dcc->priv->pixmap_cache->sync[i],
+ migrate_data->pixmap_cache_clients[i]);
+ }
+ pthread_mutex_unlock(&dcc->priv->pixmap_cache->lock);
+
+ if (migrate_data->pixmap_cache_freezer) {
+ /* activating the cache. The cache will start to be active after
+ * pixmap_cache_reset is called, when handling RED_PIPE_ITEM_TYPE_PIXMAP_RESET */
+ dcc->priv->pixmap_cache->size = migrate_data->pixmap_cache_size;
+ dcc->pipe_add_type(RED_PIPE_ITEM_TYPE_PIXMAP_RESET);
+ }
+
+ if (dcc_handle_migrate_glz_dictionary(dcc, migrate_data)) {
+ image_encoders_glz_create(&dcc->priv->encoders, dcc->priv->id);
+ } else {
+ spice_critical("restoring global lz dictionary failed");
+ }
+
+ dcc->is_low_bandwidth = migrate_data->low_bandwidth_setting;
+
+ if (migrate_data->low_bandwidth_setting) {
+ dcc->ack_set_client_window(WIDE_CLIENT_ACK_WINDOW);
+ if (dcc->priv->jpeg_state == SPICE_WAN_COMPRESSION_AUTO) {
+ display->priv->enable_jpeg = TRUE;
+ }
+ if (dcc->priv->zlib_glz_state == SPICE_WAN_COMPRESSION_AUTO) {
+ display->priv->enable_zlib_glz_wrap = TRUE;
+ }
+ }
+
+ surfaces = static_cast<uint8_t *>(message) + migrate_data->surfaces_at_client_ptr;
+ surfaces_restored = display->priv->enable_jpeg ?
+ restore_surfaces_lossy(dcc,
+ reinterpret_cast<MigrateDisplaySurfacesAtClientLossy *>(surfaces)) :
+ restore_surfaces_lossless(dcc,
+ reinterpret_cast<MigrateDisplaySurfacesAtClientLossless *>(surfaces));
+
+ spice_return_val_if_fail(surfaces_restored, FALSE);
+
+ dcc->pipe_add_type(RED_PIPE_ITEM_TYPE_INVAL_PALETTE_CACHE);
+ /* enable sending messages */
+ dcc->ack_zero_messages_window();
+ return TRUE;
+}
+
+VideoStreamAgent* dcc_get_video_stream_agent(DisplayChannelClient *dcc, int stream_id)
+{
+ return &dcc->priv->stream_agents[stream_id];
+}
+
+ImageEncoders* dcc_get_encoders(DisplayChannelClient *dcc)
+{
+ return &dcc->priv->encoders;
+}
+
+spice_wan_compression_t dcc_get_jpeg_state(DisplayChannelClient *dcc)
+{
+ return dcc->priv->jpeg_state;
+}
+
+spice_wan_compression_t dcc_get_zlib_glz_state(DisplayChannelClient *dcc)
+{
+ return dcc->priv->zlib_glz_state;
+}
+
+uint32_t dcc_get_max_stream_latency(DisplayChannelClient *dcc)
+{
+ return dcc->priv->streams_max_latency;
+}
+
+void dcc_set_max_stream_latency(DisplayChannelClient *dcc, uint32_t latency)
+{
+ dcc->priv->streams_max_latency = latency;
+}
+
+uint64_t dcc_get_max_stream_bit_rate(DisplayChannelClient *dcc)
+{
+ return dcc->priv->streams_max_bit_rate;
+}
+
+void dcc_set_max_stream_bit_rate(DisplayChannelClient *dcc, uint64_t rate)
+{
+ dcc->priv->streams_max_bit_rate = rate;
+}
+
+bool DisplayChannelClient::config_socket()
+{
+ RedClient *client = get_client();
+ MainChannelClient *mcc = client->get_main();
+
+ is_low_bandwidth = mcc->is_low_bandwidth();
+
+ return CommonGraphicsChannelClient::config_socket();
+}
+
+void DisplayChannelClient::on_disconnect()
+{
+ DisplayChannel *display;
+
+ spice_debug("trace");
+
+ display = DCC_TO_DC(this);
+
+ dcc_stop(this); // TODO: start/stop -> connect/disconnect?
+ display_channel_compress_stats_print(display);
+
+ // this was the last channel client
+ spice_debug("#draw=%d, #glz_draw=%d",
+ display->priv->drawable_count,
+ display->priv->encoder_shared_data.glz_drawable_count);
+}
+
+gboolean dcc_is_low_bandwidth(DisplayChannelClient *dcc)
+{
+ return dcc->is_low_bandwidth;
+}
diff --git a/server/dcc.h b/server/dcc.h
new file mode 100644
index 00000000..a8dd3bef
--- /dev/null
+++ b/server/dcc.h
@@ -0,0 +1,164 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef DCC_H_
+#define DCC_H_
+
+#include <array>
+
+#include "image-encoders.h"
+#include "image-cache.h"
+#include "pixmap-cache.h"
+#include "display-limits.h"
+#include "common-graphics-channel.h"
+#include "utils.hpp"
+
+#include "push-visibility.h"
+
+struct DisplayChannel;
+struct DisplayChannelClientPrivate;
+
+class DisplayChannelClient final: public CommonGraphicsChannelClient
+{
+protected:
+ ~DisplayChannelClient();
+public:
+ DisplayChannelClient(DisplayChannel *display,
+ RedClient *client, RedStream *stream,
+ RedChannelCapabilities *caps,
+ uint32_t id,
+ SpiceImageCompression image_compression,
+ spice_wan_compression_t jpeg_state,
+ spice_wan_compression_t zlib_glz_state);
+ virtual void disconnect() override;
+
+protected:
+ virtual bool handle_message(uint16_t type, uint32_t size, void *msg) override;
+ virtual bool config_socket() override;
+ virtual void on_disconnect() override;
+ virtual void send_item(RedPipeItem *item) override;
+ virtual bool handle_migrate_data(uint32_t size, void *message) override;
+ virtual void migrate() override;
+ virtual void handle_migrate_flush_mark() override;
+ virtual bool handle_migrate_data_get_serial(uint32_t size, void *message, uint64_t &serial) override;
+
+public:
+ red::unique_link<DisplayChannelClientPrivate> priv;
+
+ int is_low_bandwidth;
+};
+
+#define PALETTE_CACHE_HASH_SHIFT 8
+#define PALETTE_CACHE_HASH_SIZE (1 << PALETTE_CACHE_HASH_SHIFT)
+#define PALETTE_CACHE_HASH_MASK (PALETTE_CACHE_HASH_SIZE - 1)
+#define PALETTE_CACHE_HASH_KEY(id) ((id) & PALETTE_CACHE_HASH_MASK)
+#define CLIENT_PALETTE_CACHE_SIZE 128
+
+#define DISPLAY_CLIENT_MIGRATE_DATA_TIMEOUT (NSEC_PER_SEC * 10)
+#define DISPLAY_CLIENT_RETRY_INTERVAL 10000 //micro
+
+/* Each drawable can refer to at most 3 images: src, brush and mask */
+#define MAX_DRAWABLE_PIXMAP_CACHE_ITEMS 3
+
+#define WIDE_CLIENT_ACK_WINDOW 40
+#define NARROW_CLIENT_ACK_WINDOW 20
+
+#define MAX_PIPE_SIZE 50
+
+struct DisplayChannel;
+struct VideoStream;
+struct VideoStreamAgent;
+struct RedSurface;
+
+struct WaitForChannels {
+ SpiceMsgWaitForChannels header;
+ std::array<SpiceWaitForChannel, MAX_CACHE_CLIENTS> buf;
+};
+
+struct FreeList {
+ int res_size;
+ SpiceResourceList *res;
+ uint64_t sync[MAX_CACHE_CLIENTS];
+ WaitForChannels wait;
+};
+
+#define DCC_TO_DC(dcc) ((DisplayChannel*) dcc->get_channel())
+
+DisplayChannelClient* dcc_new (DisplayChannel *display,
+ RedClient *client,
+ RedStream *stream,
+ int mig_target,
+ RedChannelCapabilities *caps,
+ SpiceImageCompression image_compression,
+ spice_wan_compression_t jpeg_state,
+ spice_wan_compression_t zlib_glz_state);
+void dcc_start (DisplayChannelClient *dcc);
+bool dcc_handle_migrate_data (DisplayChannelClient *dcc,
+ uint32_t size, void *message);
+void dcc_push_monitors_config (DisplayChannelClient *dcc);
+void dcc_destroy_surface (DisplayChannelClient *dcc,
+ uint32_t surface_id);
+void dcc_video_stream_agent_clip (DisplayChannelClient* dcc,
+ VideoStreamAgent *agent);
+void dcc_create_stream (DisplayChannelClient *dcc,
+ VideoStream *stream);
+void dcc_palette_cache_reset (DisplayChannelClient *dcc);
+void dcc_palette_cache_palette (DisplayChannelClient *dcc,
+ SpicePalette *palette,
+ uint8_t *flags);
+bool dcc_pixmap_cache_unlocked_add (DisplayChannelClient *dcc,
+ uint64_t id, uint32_t size, int lossy);
+void dcc_prepend_drawable (DisplayChannelClient *dcc,
+ Drawable *drawable);
+void dcc_append_drawable (DisplayChannelClient *dcc,
+ Drawable *drawable);
+void dcc_add_drawable_after (DisplayChannelClient *dcc,
+ Drawable *drawable,
+ RedPipeItem *pos);
+bool dcc_drawable_is_in_pipe (DisplayChannelClient *dcc,
+ Drawable *drawable);
+
+int dcc_compress_image (DisplayChannelClient *dcc,
+ SpiceImage *dest, SpiceBitmap *src, Drawable *drawable,
+ int can_lossy,
+ compress_send_data_t* o_comp_data);
+
+void dcc_create_surface(DisplayChannelClient *dcc, struct RedSurface *surface);
+void dcc_push_surface_image(DisplayChannelClient *dcc, struct RedSurface *surface);
+bool dcc_clear_surface_drawables_from_pipe(DisplayChannelClient *dcc,
+ RedSurface *surface, bool wait_if_used);
+void dcc_add_surface_area_image(DisplayChannelClient *dcc, RedSurface *surface,
+ SpiceRect *area, RedChannelClient::Pipe::iterator pipe_item_pos,
+ int can_lossy);
+RedPipeItemPtr dcc_gl_scanout_item_new(RedChannelClient *rcc, void *data, int num);
+RedPipeItemPtr dcc_gl_draw_item_new(RedChannelClient *rcc, void *data, int num);
+VideoStreamAgent *dcc_get_video_stream_agent(DisplayChannelClient *dcc, int stream_id);
+ImageEncoders *dcc_get_encoders(DisplayChannelClient *dcc);
+spice_wan_compression_t dcc_get_jpeg_state (DisplayChannelClient *dcc);
+spice_wan_compression_t dcc_get_zlib_glz_state (DisplayChannelClient *dcc);
+uint32_t dcc_get_max_stream_latency(DisplayChannelClient *dcc);
+void dcc_set_max_stream_latency(DisplayChannelClient *dcc, uint32_t latency);
+uint64_t dcc_get_max_stream_bit_rate(DisplayChannelClient *dcc);
+void dcc_set_max_stream_bit_rate(DisplayChannelClient *dcc, uint64_t rate);
+gboolean dcc_is_low_bandwidth(DisplayChannelClient *dcc);
+GArray *dcc_get_preferred_video_codecs_for_encoding(DisplayChannelClient *dcc);
+void dcc_video_codecs_update(DisplayChannelClient *dcc);
+
+#include "pop-visibility.h"
+
+#endif /* DCC_H_ */
diff --git a/server/demarshallers.h b/server/demarshallers.h
deleted file mode 100644
index c3d770db..00000000
--- a/server/demarshallers.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- Copyright (C) 2010 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifndef _H_DEMARSHAL
-#define _H_DEMARSHAL
-
-typedef void (*message_destructor_t)(uint8_t *message);
-typedef uint8_t * (*spice_parse_channel_func_t)(uint8_t *message_start, uint8_t *message_end, uint16_t message_type, int minor,
- size_t *size_out, message_destructor_t *free_message);
-
-spice_parse_channel_func_t spice_get_client_channel_parser(uint32_t channel, unsigned int *max_message_type);
-
-#endif
diff --git a/server/dispatcher.c b/server/dispatcher.c
deleted file mode 100644
index 298f5f90..00000000
--- a/server/dispatcher.c
+++ /dev/null
@@ -1,281 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
-/*
- Copyright (C) 2009-2012 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <unistd.h>
-#include <errno.h>
-#include <assert.h>
-#include <string.h>
-#include <pthread.h>
-#include <fcntl.h>
-#include <poll.h>
-
-#define SPICE_LOG_DOMAIN "SpiceDispatcher"
-
-#include "common/mem.h"
-#include "common/spice_common.h"
-#include "dispatcher.h"
-
-//#define DEBUG_DISPATCHER
-
-#ifdef DEBUG_DISPATCHER
-#include <signal.h>
-#endif
-
-#define ACK 0xffffffff
-
-/*
- * read_safe
- * helper. reads until size bytes accumulated in buf, if an error other then
- * EINTR is encountered returns -1, otherwise returns 0.
- * @block if 1 the read will block (the fd is always blocking).
- * if 0 poll first, return immediately if no bytes available, otherwise
- * read size in blocking mode.
- */
-static int read_safe(int fd, uint8_t *buf, size_t size, int block)
-{
- int read_size = 0;
- int ret;
- struct pollfd pollfd = {.fd = fd, .events = POLLIN, .revents = 0};
-
- if (size == 0) {
- return 0;
- }
-
- if (!block) {
- while ((ret = poll(&pollfd, 1, 0)) == -1) {
- if (errno == EINTR) {
- spice_debug("EINTR in poll");
- continue;
- }
- spice_error("poll failed");
- return -1;
- }
- if (!(pollfd.revents & POLLIN)) {
- return 0;
- }
- }
- while (read_size < size) {
- ret = read(fd, buf + read_size, size - read_size);
- if (ret == -1) {
- if (errno == EINTR) {
- spice_debug("EINTR in read");
- continue;
- }
- return -1;
- }
- if (ret == 0) {
- spice_error("broken pipe on read");
- return -1;
- }
- read_size += ret;
- }
- return read_size;
-}
-
-/*
- * write_safe
- * @return -1 for error, otherwise number of written bytes. may be zero.
- */
-static int write_safe(int fd, uint8_t *buf, size_t size)
-{
- int written_size = 0;
- int ret;
-
- while (written_size < size) {
- ret = write(fd, buf + written_size, size - written_size);
- if (ret == -1) {
- if (errno != EINTR) {
- spice_debug("EINTR in write");
- return -1;
- }
- continue;
- }
- written_size += ret;
- }
- return written_size;
-}
-
-static int dispatcher_handle_single_read(Dispatcher *dispatcher)
-{
- int ret;
- uint32_t type;
- DispatcherMessage *msg = NULL;
- uint8_t *payload = dispatcher->payload;
- uint32_t ack = ACK;
-
- if ((ret = read_safe(dispatcher->recv_fd, (uint8_t*)&type, sizeof(type), 0)) == -1) {
- spice_printerr("error reading from dispatcher: %d", errno);
- return 0;
- }
- if (ret == 0) {
- /* no messsage */
- return 0;
- }
- msg = &dispatcher->messages[type];
- if (read_safe(dispatcher->recv_fd, payload, msg->size, 1) == -1) {
- spice_printerr("error reading from dispatcher: %d", errno);
- /* TODO: close socketpair? */
- return 0;
- }
- if (msg->handler) {
- msg->handler(dispatcher->opaque, (void *)payload);
- } else {
- spice_printerr("error: no handler for message type %d", type);
- }
- if (msg->ack == DISPATCHER_ACK) {
- if (write_safe(dispatcher->recv_fd,
- (uint8_t*)&ack, sizeof(ack)) == -1) {
- spice_printerr("error writing ack for message %d", type);
- /* TODO: close socketpair? */
- }
- } else if (msg->ack == DISPATCHER_ASYNC && dispatcher->handle_async_done) {
- dispatcher->handle_async_done(dispatcher->opaque, type,
- (void *)payload);
- }
- return 1;
-}
-
-/*
- * dispatcher_handle_recv_read
- * doesn't handle being in the middle of a message. all reads are blocking.
- */
-void dispatcher_handle_recv_read(Dispatcher *dispatcher)
-{
- while (dispatcher_handle_single_read(dispatcher)) {
- }
-}
-
-void dispatcher_send_message(Dispatcher *dispatcher, uint32_t message_type,
- void *payload)
-{
- DispatcherMessage *msg;
- uint32_t ack;
- int send_fd = dispatcher->send_fd;
-
- assert(dispatcher->max_message_type > message_type);
- assert(dispatcher->messages[message_type].handler);
- msg = &dispatcher->messages[message_type];
- pthread_mutex_lock(&dispatcher->lock);
- if (write_safe(send_fd, (uint8_t*)&message_type, sizeof(message_type)) == -1) {
- spice_printerr("error: failed to send message type for message %d",
- message_type);
- goto unlock;
- }
- if (write_safe(send_fd, payload, msg->size) == -1) {
- spice_printerr("error: failed to send message body for message %d",
- message_type);
- goto unlock;
- }
- if (msg->ack == DISPATCHER_ACK) {
- if (read_safe(send_fd, (uint8_t*)&ack, sizeof(ack), 1) == -1) {
- spice_printerr("error: failed to read ack");
- } else if (ack != ACK) {
- spice_printerr("error: got wrong ack value in dispatcher "
- "for message %d\n", message_type);
- /* TODO handling error? */
- }
- }
-unlock:
- pthread_mutex_unlock(&dispatcher->lock);
-}
-
-void dispatcher_register_async_done_callback(
- Dispatcher *dispatcher,
- dispatcher_handle_async_done handler)
-{
- assert(dispatcher->handle_async_done == NULL);
- dispatcher->handle_async_done = handler;
-}
-
-void dispatcher_register_handler(Dispatcher *dispatcher, uint32_t message_type,
- dispatcher_handle_message handler,
- size_t size, int ack)
-{
- DispatcherMessage *msg;
-
- assert(message_type < dispatcher->max_message_type);
- assert(dispatcher->messages[message_type].handler == 0);
- msg = &dispatcher->messages[message_type];
- msg->handler = handler;
- msg->size = size;
- msg->ack = ack;
- if (msg->size > dispatcher->payload_size) {
- dispatcher->payload = realloc(dispatcher->payload, msg->size);
- dispatcher->payload_size = msg->size;
- }
-}
-
-#ifdef DEBUG_DISPATCHER
-static void dummy_handler(int bla)
-{
-}
-
-static void setup_dummy_signal_handler(void)
-{
- static int inited = 0;
- struct sigaction act = {
- .sa_handler = &dummy_handler,
- };
- if (inited) {
- return;
- }
- inited = 1;
- /* handle SIGRTMIN+10 in order to test the loops for EINTR */
- if (sigaction(SIGRTMIN + 10, &act, NULL) == -1) {
- fprintf(stderr,
- "failed to set dummy sigaction for DEBUG_DISPATCHER\n");
- exit(1);
- }
-}
-#endif
-
-void dispatcher_init(Dispatcher *dispatcher, size_t max_message_type,
- void *opaque)
-{
- int channels[2];
-
-#ifdef DEBUG_DISPATCHER
- setup_dummy_signal_handler();
-#endif
- dispatcher->opaque = opaque;
- if (socketpair(AF_LOCAL, SOCK_STREAM, 0, channels) == -1) {
- spice_error("socketpair failed %s", strerror(errno));
- return;
- }
- pthread_mutex_init(&dispatcher->lock, NULL);
- dispatcher->recv_fd = channels[0];
- dispatcher->send_fd = channels[1];
- dispatcher->self = pthread_self();
-
- dispatcher->messages = spice_malloc0_n(max_message_type,
- sizeof(dispatcher->messages[0]));
- dispatcher->max_message_type = max_message_type;
-}
-
-void dispatcher_set_opaque(Dispatcher *dispatcher, void *opaque)
-{
- dispatcher->opaque = opaque;
-}
-
-int dispatcher_get_recv_fd(Dispatcher *dispatcher)
-{
- return dispatcher->recv_fd;
-}
diff --git a/server/dispatcher.cpp b/server/dispatcher.cpp
new file mode 100644
index 00000000..8be35283
--- /dev/null
+++ b/server/dispatcher.cpp
@@ -0,0 +1,325 @@
+/*
+ Copyright (C) 2009-2016 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+
+#include <cassert>
+#include <cerrno>
+#include <cstring>
+
+#include <fcntl.h>
+#include <pthread.h>
+#include <unistd.h>
+#ifndef _WIN32
+#include <poll.h>
+#endif
+
+#include "dispatcher.h"
+
+#define DISPATCHER_MESSAGE_TYPE_CUSTOM 0x7fffffffu
+
+/* structure to store message header information.
+ * That structure is sent through a socketpair so it's optimized
+ * to be transfered via sockets.
+ * Is also packaged to not leave holes in both 32 and 64 environments
+ * so memory instrumentation tools should not find uninitialised bytes.
+ */
+struct DispatcherMessage {
+ dispatcher_handle_message handler;
+ uint32_t size;
+ uint32_t type:31;
+ uint32_t ack:1;
+};
+
+struct DispatcherPrivate {
+ SPICE_CXX_GLIB_ALLOCATOR
+ explicit DispatcherPrivate(uint32_t init_max_message_type):
+ max_message_type(init_max_message_type)
+ {
+ }
+ ~DispatcherPrivate();
+ void send_message(const DispatcherMessage& msg, void *payload);
+ bool handle_single_read();
+ static void handle_event(int fd, int event, DispatcherPrivate* priv);
+
+ int recv_fd;
+ int send_fd;
+ pthread_mutex_t lock;
+ DispatcherMessage *messages;
+ const guint max_message_type;
+ void *payload; /* allocated as max of message sizes */
+ size_t payload_size; /* used to track realloc calls */
+ void *opaque;
+ dispatcher_handle_any_message any_handler;
+};
+
+DispatcherPrivate::~DispatcherPrivate()
+{
+ while (handle_single_read()) {
+ continue;
+ }
+ g_free(messages);
+ socket_close(send_fd);
+ socket_close(recv_fd);
+ pthread_mutex_destroy(&lock);
+ g_free(payload);
+}
+
+Dispatcher::~Dispatcher() = default;
+
+Dispatcher::Dispatcher(uint32_t max_message_type):
+ priv(new DispatcherPrivate(max_message_type))
+{
+ int channels[2];
+
+ if (socketpair(AF_LOCAL, SOCK_STREAM, 0, channels) == -1) {
+ spice_error("socketpair failed %s", strerror(errno));
+ return;
+ }
+ pthread_mutex_init(&priv->lock, nullptr);
+ priv->recv_fd = channels[0];
+ priv->send_fd = channels[1];
+
+ priv->messages = g_new0(DispatcherMessage, priv->max_message_type);
+}
+
+#define ACK 0xffffffff
+
+/*
+ * read_safe
+ * helper. reads until size bytes accumulated in buf, if an error other then
+ * EINTR is encountered returns -1, otherwise returns 0.
+ * @block if true the read will block (the fd is always blocking).
+ * if false poll first, return immediately if no bytes available, otherwise
+ * read size in blocking mode.
+ */
+static int read_safe(int fd, void *raw_buf, size_t size, bool block)
+{
+ int read_size = 0;
+ int ret;
+ auto buf = reinterpret_cast<uint8_t *>(raw_buf);
+
+ if (size == 0) {
+ return 0;
+ }
+
+ if (!block) {
+#ifndef _WIN32
+ struct pollfd pollfd = {.fd = fd, .events = POLLIN, .revents = 0};
+ while ((ret = poll(&pollfd, 1, 0)) == -1) {
+ if (errno == EINTR) {
+ spice_debug("EINTR in poll");
+ continue;
+ }
+ spice_error("poll failed");
+ return -1;
+ }
+ if (!(pollfd.revents & POLLIN)) {
+ return 0;
+ }
+#else
+ struct timeval tv = { 0, 0 };
+ fd_set fds;
+ FD_ZERO(&fds);
+ FD_SET(fd, &fds);
+ if (select(1, &fds, NULL, NULL, &tv) < 1) {
+ return 0;
+ }
+#endif
+ }
+ while (read_size < size) {
+ ret = socket_read(fd, buf + read_size, size - read_size);
+ if (ret == -1) {
+ if (errno == EINTR) {
+ spice_debug("EINTR in read");
+ continue;
+ }
+#ifdef _WIN32
+ // Windows turns this socket not-blocking
+ if (errno == EAGAIN) {
+ fd_set fds;
+ FD_ZERO(&fds);
+ FD_SET(fd, &fds);
+ select(1, &fds, NULL, NULL, NULL);
+ continue;
+ }
+#endif
+ return -1;
+ }
+ if (ret == 0) {
+ spice_error("broken pipe on read");
+ return -1;
+ }
+ read_size += ret;
+ }
+ return read_size;
+}
+
+/*
+ * write_safe
+ * @return -1 for error, otherwise number of written bytes. may be zero.
+ */
+static int write_safe(int fd, const void *raw_buf, size_t size)
+{
+ int written_size = 0;
+ int ret;
+ auto buf = reinterpret_cast<const uint8_t *>(raw_buf);
+
+ while (written_size < size) {
+ ret = socket_write(fd, buf + written_size, size - written_size);
+ if (ret == -1) {
+ if (errno != EINTR) {
+ return -1;
+ }
+ spice_debug("EINTR in write");
+ continue;
+ }
+ written_size += ret;
+ }
+ return written_size;
+}
+
+bool DispatcherPrivate::handle_single_read()
+{
+ int ret;
+ DispatcherMessage msg[1];
+ uint32_t ack = ACK;
+
+ if ((ret = read_safe(recv_fd, msg, sizeof(msg), false)) == -1) {
+ g_warning("error reading from dispatcher: %d", errno);
+ return false;
+ }
+ if (ret == 0) {
+ /* no message */
+ return false;
+ }
+ if (G_UNLIKELY(msg->size > payload_size)) {
+ payload = g_realloc(payload, msg->size);
+ payload_size = msg->size;
+ }
+ if (read_safe(recv_fd, payload, msg->size, true) == -1) {
+ g_warning("error reading from dispatcher: %d", errno);
+ /* TODO: close socketpair? */
+ return false;
+ }
+ if (any_handler && msg->type != DISPATCHER_MESSAGE_TYPE_CUSTOM) {
+ any_handler(opaque, msg->type, payload);
+ }
+ if (msg->handler) {
+ msg->handler(opaque, payload);
+ } else {
+ g_warning("error: no handler for message type %d", msg->type);
+ }
+ if (msg->ack) {
+ if (write_safe(recv_fd, &ack, sizeof(ack)) == -1) {
+ g_warning("error writing ack for message %d", msg->type);
+ /* TODO: close socketpair? */
+ }
+ }
+ return true;
+}
+
+/*
+ * handle_event
+ * doesn't handle being in the middle of a message. all reads are blocking.
+ */
+void DispatcherPrivate::handle_event(int fd, int event, DispatcherPrivate* priv)
+{
+ while (priv->handle_single_read()) {
+ }
+}
+
+void DispatcherPrivate::send_message(const DispatcherMessage& msg, void *msg_payload)
+{
+ uint32_t ack;
+
+ pthread_mutex_lock(&lock);
+ if (write_safe(send_fd, &msg, sizeof(msg)) == -1) {
+ g_warning("error: failed to send message header for message %d",
+ msg.type);
+ goto unlock;
+ }
+ if (write_safe(send_fd, msg_payload, msg.size) == -1) {
+ g_warning("error: failed to send message body for message %d",
+ msg.type);
+ goto unlock;
+ }
+ if (msg.ack) {
+ if (read_safe(send_fd, &ack, sizeof(ack), true) == -1) {
+ g_warning("error: failed to read ack");
+ } else if (ack != ACK) {
+ g_warning("error: got wrong ack value in dispatcher "
+ "for message %d\n", msg.type);
+ /* TODO handling error? */
+ }
+ }
+unlock:
+ pthread_mutex_unlock(&lock);
+}
+
+void Dispatcher::send_message(uint32_t message_type, void *payload)
+{
+ assert(priv->max_message_type > message_type);
+ assert(priv->messages[message_type].handler);
+ priv->send_message(priv->messages[message_type], payload);
+}
+
+void Dispatcher::send_message_custom(dispatcher_handle_message handler,
+ void *payload, uint32_t payload_size, bool ack)
+{
+ DispatcherMessage msg = {
+ .handler = handler,
+ .size = payload_size,
+ .type = DISPATCHER_MESSAGE_TYPE_CUSTOM,
+ .ack = ack,
+ };
+ priv->send_message(msg, payload);
+}
+
+void Dispatcher::register_handler(uint32_t message_type,
+ dispatcher_handle_message handler,
+ size_t size, bool ack)
+{
+ DispatcherMessage *msg;
+
+ assert(message_type < priv->max_message_type);
+ assert(priv->messages[message_type].handler == nullptr);
+ msg = &priv->messages[message_type];
+ msg->handler = handler;
+ msg->size = size;
+ msg->type = message_type;
+ msg->ack = ack;
+ if (msg->size > priv->payload_size) {
+ priv->payload = g_realloc(priv->payload, msg->size);
+ priv->payload_size = msg->size;
+ }
+}
+
+void Dispatcher::register_universal_handler(dispatcher_handle_any_message any_handler)
+{
+ priv->any_handler = any_handler;
+}
+
+SpiceWatch *Dispatcher::create_watch(SpiceCoreInterfaceInternal *core)
+{
+ return core->watch_new(priv->recv_fd,
+ SPICE_WATCH_EVENT_READ, DispatcherPrivate::handle_event, priv.get());
+}
+
+void Dispatcher::set_opaque(void *opaque)
+{
+ priv->opaque = opaque;
+}
diff --git a/server/dispatcher.h b/server/dispatcher.h
index 1b389bde..4143da48 100644
--- a/server/dispatcher.h
+++ b/server/dispatcher.h
@@ -1,106 +1,166 @@
-#ifndef DISPATCHER_H
-#define DISPATCHER_H
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
-#include <spice.h>
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
-typedef struct Dispatcher Dispatcher;
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
-typedef void (*dispatcher_handle_message)(void *opaque,
- void *payload);
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
-typedef void (*dispatcher_handle_async_done)(void *opaque,
- uint32_t message_type,
- void *payload);
-
-
-typedef struct DispatcherMessage {
- size_t size;
- int ack;
- dispatcher_handle_message handler;
-} DispatcherMessage;
-
-struct Dispatcher {
- SpiceCoreInterface *recv_core;
- int recv_fd;
- int send_fd;
- pthread_t self;
- pthread_mutex_t lock;
- DispatcherMessage *messages;
- int stage; /* message parser stage - sender has no stages */
- size_t max_message_type;
- void *payload; /* allocated as max of message sizes */
- size_t payload_size; /* used to track realloc calls */
- void *opaque;
- dispatcher_handle_async_done handle_async_done;
-};
+#ifndef DISPATCHER_H_
+#define DISPATCHER_H_
-/*
- * dispatcher_send_message
- * @message_type: message type
- * @payload: payload
- */
-void dispatcher_send_message(Dispatcher *dispatcher, uint32_t message_type,
- void *payload);
+#include <pthread.h>
-/*
- * dispatcher_init
- * @max_message_type: number of message types. Allows upfront allocation
- * of a DispatcherMessage list.
- * up front, and registration in any order wanted.
- */
-void dispatcher_init(Dispatcher *dispatcher, size_t max_message_type,
- void *opaque);
+#include "red-common.h"
+#include "utils.hpp"
-enum {
- DISPATCHER_NONE = 0,
- DISPATCHER_ACK,
- DISPATCHER_ASYNC
-};
-
-/*
- * dispatcher_register_handler
- * @dispatcher: dispatcher
- * @messsage_type: message type
- * @handler: message handler
- * @size: message size. Each type has a fixed associated size.
- * @ack: One of DISPATCHER_NONE, DISPATCHER_ACK, DISPATCHER_ASYNC.
- * DISPATCHER_NONE - only send the message
- * DISPATCHER_ACK - send an ack after the message
- * DISPATCHER_ASYNC - call send an ack. This is per message type - you can't send the
- * same message type with and without. Register two different
- * messages if that is what you want.
- */
-void dispatcher_register_handler(Dispatcher *dispatcher, uint32_t message_type,
- dispatcher_handle_message handler, size_t size,
- int ack);
+#include "push-visibility.h"
-/*
- * dispatcher_register_async_done_callback
- * @dispatcher: dispatcher
- * @handler: callback on the receiver side called *after* the
- * message callback in case ack == DISPATCHER_ASYNC.
- */
-void dispatcher_register_async_done_callback(
- Dispatcher *dispatcher,
- dispatcher_handle_async_done handler);
+struct Dispatcher;
+struct DispatcherPrivate;
+struct DispatcherMessage;
-/*
- * dispatcher_handle_recv_read
- * @dispatcher: Dispatcher instance
- */
-void dispatcher_handle_recv_read(Dispatcher *);
+/* The function signature for handlers of a specific message type */
+typedef void (*dispatcher_handle_message)(void *opaque,
+ void *payload);
-/*
- * dispatcher_get_recv_fd
- * @return: receive file descriptor of the dispatcher
+/* The signature for a function that handles all messages (see
+ * dispatcher_register_universal_handler()) */
+typedef void (*dispatcher_handle_any_message)(void *opaque,
+ uint32_t message_type,
+ void *payload);
+
+/**
+ * A Dispatcher provides inter-thread communication by serializing messages.
+ * Currently the Dispatcher uses a unix socket (socketpair) for dispatching the
+ * messages.
+ *
+ * Message types are identified by a unique integer value and must first be
+ * registered with the class (see register_handler()) before they
+ * can be sent. Sending threads can send a message using the
+ * send_message() function. The receiving thread can monitor the
+ * dispatcher's 'receive' file descriptor (see create_watch()) for
+ * activity and to process incoming messages.
*/
-int dispatcher_get_recv_fd(Dispatcher *);
+class Dispatcher: public red::shared_ptr_counted
+{
+public:
+ /**
+ * Create a new Dispatcher object
+ *
+ * @param max_message_type: indicates the number of unique message types that can
+ * be handled by this dispatcher. Each message type is
+ * identified by an integer value between 0 and
+ * max_message_type-1.
+ */
+ Dispatcher(uint32_t max_message_type);
+
+ /**
+ * Sends a message to the receiving thread. The message type must have been
+ * registered first (see register_handler()). @p payload must be a
+ * buffer of the same size as the size registered for @p message_type
+ *
+ * If the sent message is a message type requires an ACK, this function will
+ * block until it receives an ACK from the receiving thread.
+ *
+ * @param message_type: message type
+ * @param payload: payload
+ */
+ void send_message(uint32_t message_type, void *payload);
+
+ /**
+ * Sends a message to the receiving thread.
+ *
+ * If the sent message requires an ACK, this function will block until it
+ * receives an ACK from the receiving thread.
+ *
+ * @param handler: callback to handle message
+ * @param[in] payload: payload
+ * @param payload_size: size of payload
+ * @param ack: acknowledge required. Make message synchronous
+ */
+ void send_message_custom(dispatcher_handle_message handler,
+ void *payload, uint32_t payload_size, bool ack);
+
+ /**
+ * Sends a message to the receiving thread.
+ *
+ * If the sent message requires an ACK, this function will block until it
+ * receives an ACK from the receiving thread.
+ *
+ * @param handler: callback to handle message
+ * @param[in] payload: payload
+ * @param ack: acknowledge required. Make message synchronous
+ */
+ template <typename T> inline void
+ send_message_custom(void (*handler)(void *, T*), T *payload, bool ack)
+ {
+ send_message_custom((dispatcher_handle_message) handler,
+ payload, sizeof(*payload), ack);
+ }
+
+ /**
+ * This function registers a message type with the dispatcher, and registers
+ * @p handler as the function that will handle incoming messages of this type.
+ * If @p ack is true, the dispatcher will also send an ACK in response to the
+ * message after the message has been passed to the handler. You can only
+ * register a given message type once. For example, you cannot register two
+ * different handlers for the same message type with different @p ack values.
+ *
+ * @param message_type: message type
+ * @param handler: message handler
+ * @param size: message size. Each type has a fixed associated size.
+ * @param ack: whether the dispatcher should send an ACK to the sender
+ */
+ void register_handler(uint32_t message_type,
+ dispatcher_handle_message handler, size_t size,
+ bool ack);
+
+ /**
+ * Register a universal handler that will be called when *any* message is
+ * received by the dispatcher. When a message is received, this handler will be
+ * called first. If the received message type was registered via
+ * register_handler(), the message-specific handler will then be
+ * called. Only one universal handler can be registered. This feature can be
+ * used to record all messages to a file for replay and debugging.
+ *
+ * @param handler: a handler function
+ */
+ void register_universal_handler(dispatcher_handle_any_message handler);
+
+ /**
+ * Create a new watch to handle events for the dispatcher.
+ * You should release it before releasing the dispatcher.
+ *
+ * @return newly created watch
+ */
+ SpiceWatch *create_watch(SpiceCoreInterfaceInternal *core);
+
+ /**
+ * This @p opaque pointer is user-defined data that will be passed as the first
+ * argument to all handler functions.
+ *
+ * @param opaque: opaque to use for callbacks
+ */
+ void set_opaque(void *opaque);
+
+protected:
+ virtual ~Dispatcher();
+
+private:
+ red::unique_link<DispatcherPrivate> priv;
+};
-/*
- * dispatcher_set_opaque
- * @dispatcher: Dispatcher instance
- * @opaque: opaque to use for callbacks
- */
-void dispatcher_set_opaque(Dispatcher *dispatcher, void *opaque);
+#include "pop-visibility.h"
-#endif //DISPATCHER_H
+#endif /* DISPATCHER_H_ */
diff --git a/server/display-channel-private.h b/server/display-channel-private.h
new file mode 100644
index 00000000..04ac2c0d
--- /dev/null
+++ b/server/display-channel-private.h
@@ -0,0 +1,349 @@
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef DISPLAY_CHANNEL_PRIVATE_H_
+#define DISPLAY_CHANNEL_PRIVATE_H_
+
+#include "display-channel.h"
+
+#define TRACE_ITEMS_SHIFT 3
+#define NUM_TRACE_ITEMS (1 << TRACE_ITEMS_SHIFT)
+#define ITEMS_TRACE_MASK (NUM_TRACE_ITEMS - 1)
+
+struct DrawContext {
+ SpiceCanvas *canvas;
+ int canvas_draws_on_surface;
+ int top_down;
+ uint32_t width;
+ uint32_t height;
+ int32_t stride;
+ uint32_t format;
+ void *line_0;
+};
+
+struct RedSurface {
+ SPICE_CXX_GLIB_ALLOCATOR
+
+ uint32_t refs;
+ uint16_t id;
+ /* A Ring representing a hierarchical tree structure. This tree includes
+ * DrawItems, Containers, and Shadows. It is used to efficiently determine
+ * which drawables overlap, and to exclude regions of drawables that are
+ * obscured by other drawables */
+ Ring current;
+ /* A ring of pending Drawables associated with this surface. This ring is
+ * actually used for drawing. The ring is maintained in order of age, the
+ * tail being the oldest drawable. */
+ Ring current_list;
+ DrawContext context;
+
+ Ring depend_on_me;
+ QRegion draw_dirty_region;
+
+ //fix me - better handling here
+ /* 'create_cmd' holds surface data through a pointer to guest memory, it
+ * must be valid as long as the surface is valid */
+ red::shared_ptr<const RedSurfaceCmd> create_cmd;
+ /* QEMU expects the guest data for the command to be valid as long as the
+ * surface is valid */
+ red::shared_ptr<const RedSurfaceCmd> destroy_cmd;
+};
+
+struct MonitorsConfig {
+ int refs;
+ int count;
+ int max_allowed;
+ QXLHead heads[0];
+};
+
+#define NUM_DRAWABLES 1000
+struct _Drawable {
+ union {
+ alignas(Drawable) char raw_drawable[sizeof(Drawable)];
+ _Drawable *next;
+ } u;
+};
+
+struct DisplayChannelPrivate
+{
+ SPICE_CXX_GLIB_ALLOCATOR
+
+ DisplayChannel *pub;
+
+ QXLInstance *qxl;
+
+ uint32_t bits_unique;
+
+ MonitorsConfig *monitors_config;
+
+ uint32_t renderer;
+ SpiceImageCompression image_compression;
+ int enable_jpeg;
+ int enable_zlib_glz_wrap;
+
+ /* A ring of pending drawables for this DisplayChannel, regardless of which
+ * surface they're associated with. This list is mainly used to flush older
+ * drawables when we need to make room for new drawables. The ring is
+ * maintained in order of age, the tail being the oldest drawable */
+ Ring current_list;
+
+ uint32_t drawable_count;
+ std::array<_Drawable, NUM_DRAWABLES> drawables;
+ _Drawable *free_drawables;
+
+ int stream_video;
+ GArray *video_codecs;
+ uint32_t stream_count;
+ std::array<VideoStream, NUM_STREAMS> streams_buf;
+ VideoStream *free_streams;
+ Ring streams;
+ std::array<ItemTrace, NUM_TRACE_ITEMS> items_trace;
+ uint32_t next_item_trace;
+ uint64_t streams_size_total;
+
+ std::array<RedSurface *, NUM_SURFACES> surfaces;
+ uint32_t n_surfaces;
+ SpiceImageSurfaces image_surfaces;
+
+ ImageCache image_cache;
+
+ int gl_draw_async_count;
+
+/* TODO: some day unify this, make it more runtime.. */
+ stat_info_t add_stat;
+ stat_info_t exclude_stat;
+ stat_info_t __exclude_stat;
+#ifdef RED_WORKER_STAT
+ uint32_t add_count;
+ uint32_t add_with_shadow_count;
+#endif
+ RedStatCounter cache_hits_counter;
+ RedStatCounter add_to_cache_counter;
+ RedStatCounter non_cache_counter;
+ ImageEncoderSharedData encoder_shared_data;
+};
+
+#define FOREACH_DCC(_channel, _data) \
+ GLIST_FOREACH((_channel ? _channel->get_clients() : NULL), \
+ DisplayChannelClient, _data)
+
+enum {
+ RED_PIPE_ITEM_TYPE_DRAW = RED_PIPE_ITEM_TYPE_COMMON_LAST,
+ RED_PIPE_ITEM_TYPE_IMAGE,
+ RED_PIPE_ITEM_TYPE_STREAM_CREATE,
+ RED_PIPE_ITEM_TYPE_STREAM_CLIP,
+ RED_PIPE_ITEM_TYPE_STREAM_DESTROY,
+ RED_PIPE_ITEM_TYPE_UPGRADE,
+ RED_PIPE_ITEM_TYPE_MIGRATE_DATA,
+ RED_PIPE_ITEM_TYPE_PIXMAP_SYNC,
+ RED_PIPE_ITEM_TYPE_PIXMAP_RESET,
+ RED_PIPE_ITEM_TYPE_INVAL_PALETTE_CACHE,
+ RED_PIPE_ITEM_TYPE_CREATE_SURFACE,
+ RED_PIPE_ITEM_TYPE_DESTROY_SURFACE,
+ RED_PIPE_ITEM_TYPE_MONITORS_CONFIG,
+ RED_PIPE_ITEM_TYPE_STREAM_ACTIVATE_REPORT,
+ RED_PIPE_ITEM_TYPE_GL_SCANOUT,
+ RED_PIPE_ITEM_TYPE_GL_DRAW,
+};
+
+struct RedMonitorsConfigItem: public RedPipeItemNum<RED_PIPE_ITEM_TYPE_MONITORS_CONFIG> {
+ RedMonitorsConfigItem(MonitorsConfig *monitors_config);
+ ~RedMonitorsConfigItem();
+ MonitorsConfig *monitors_config;
+};
+
+void drawable_unref(Drawable *drawable);
+
+MonitorsConfig *monitors_config_ref(MonitorsConfig *config);
+void monitors_config_unref(MonitorsConfig *config);
+
+void display_channel_draw_until(DisplayChannel *display,
+ const SpiceRect *area,
+ RedSurface *surface,
+ Drawable *last);
+GArray* display_channel_get_video_codecs(DisplayChannel *display);
+int display_channel_get_stream_video(DisplayChannel *display);
+void display_channel_current_flush(DisplayChannel *display,
+ RedSurface *surface);
+uint32_t display_channel_generate_uid(DisplayChannel *display);
+
+int display_channel_get_video_stream_id(DisplayChannel *display, VideoStream *stream);
+VideoStream *display_channel_get_nth_video_stream(DisplayChannel *display, gint i);
+
+struct RedSurfaceDestroyItem: public RedPipeItemNum<RED_PIPE_ITEM_TYPE_DESTROY_SURFACE> {
+ RedSurfaceDestroyItem(uint32_t surface_id);
+ SpiceMsgSurfaceDestroy surface_destroy;
+};
+
+struct RedSurfaceCreateItem: public RedPipeItemNum<RED_PIPE_ITEM_TYPE_CREATE_SURFACE> {
+ RedSurfaceCreateItem(uint32_t surface_id,
+ uint32_t width,
+ uint32_t height,
+ uint32_t format,
+ uint32_t flags);
+ SpiceMsgSurfaceCreate surface_create;
+};
+
+struct RedGlScanoutUnixItem: public RedPipeItemNum<RED_PIPE_ITEM_TYPE_GL_SCANOUT> {
+};
+
+struct RedGlDrawItem: public RedPipeItemNum<RED_PIPE_ITEM_TYPE_GL_DRAW> {
+ SpiceMsgDisplayGlDraw draw;
+};
+
+struct RedImageItem final: public RedPipeItemNum<RED_PIPE_ITEM_TYPE_IMAGE> {
+ SpicePoint pos;
+ int width;
+ int height;
+ int stride;
+ int top_down;
+ int surface_id;
+ int image_format;
+ uint32_t image_flags;
+ int can_lossy;
+ uint8_t data[0];
+};
+
+struct RedDrawablePipeItem: public RedPipeItemNum<RED_PIPE_ITEM_TYPE_DRAW> {
+ RedDrawablePipeItem(DisplayChannelClient *dcc, Drawable *drawable);
+ ~RedDrawablePipeItem();
+ Drawable *const drawable;
+ DisplayChannelClient *const dcc;
+};
+
+/* This item is used to send a full quality image (lossless) of the area where the stream was.
+ * This to avoid the artifacts due to the lossy compression. */
+struct RedUpgradeItem: public RedPipeItemNum<RED_PIPE_ITEM_TYPE_UPGRADE> {
+ RedUpgradeItem(Drawable *drawable);
+ ~RedUpgradeItem();
+ Drawable *const drawable;
+ red::glib_unique_ptr<SpiceClipRects> rects;
+};
+
+struct RedStreamActivateReportItem:
+ public RedPipeItemNum<RED_PIPE_ITEM_TYPE_STREAM_ACTIVATE_REPORT>
+{
+ uint32_t stream_id;
+ uint32_t report_id;
+};
+
+static inline int is_equal_path(SpicePath *path1, SpicePath *path2)
+{
+ SpicePathSeg *seg1, *seg2;
+ int i, j;
+
+ if (path1->num_segments != path2->num_segments)
+ return FALSE;
+
+ for (i = 0; i < path1->num_segments; i++) {
+ seg1 = path1->segments[i];
+ seg2 = path2->segments[i];
+
+ if (seg1->flags != seg2->flags ||
+ seg1->count != seg2->count) {
+ return FALSE;
+ }
+ for (j = 0; j < seg1->count; j++) {
+ if (seg1->points[j].x != seg2->points[j].x ||
+ seg1->points[j].y != seg2->points[j].y) {
+ return FALSE;
+ }
+ }
+ }
+
+ return TRUE;
+}
+
+// partial imp
+static inline int is_equal_brush(SpiceBrush *b1, SpiceBrush *b2)
+{
+ return b1->type == b2->type &&
+ b1->type == SPICE_BRUSH_TYPE_SOLID &&
+ b1->u.color == b2->u.color;
+}
+
+// partial imp
+static inline int is_equal_line_attr(SpiceLineAttr *a1, SpiceLineAttr *a2)
+{
+ return a1->flags == a2->flags &&
+ a1->style_nseg == a2->style_nseg &&
+ a1->style_nseg == 0;
+}
+
+// partial imp
+static inline int is_same_geometry(Drawable *d1, Drawable *d2)
+{
+ if (d1->red_drawable->type != d2->red_drawable->type) {
+ return FALSE;
+ }
+
+ switch (d1->red_drawable->type) {
+ case QXL_DRAW_STROKE:
+ return is_equal_line_attr(&d1->red_drawable->u.stroke.attr,
+ &d2->red_drawable->u.stroke.attr) &&
+ is_equal_path(d1->red_drawable->u.stroke.path,
+ d2->red_drawable->u.stroke.path);
+ case QXL_DRAW_FILL:
+ return rect_is_equal(&d1->red_drawable->bbox, &d2->red_drawable->bbox);
+ default:
+ return FALSE;
+ }
+}
+
+static inline int is_same_drawable(Drawable *d1, Drawable *d2)
+{
+ if (!is_same_geometry(d1, d2)) {
+ return FALSE;
+ }
+
+ switch (d1->red_drawable->type) {
+ case QXL_DRAW_STROKE:
+ return is_equal_brush(&d1->red_drawable->u.stroke.brush,
+ &d2->red_drawable->u.stroke.brush);
+ case QXL_DRAW_FILL:
+ return is_equal_brush(&d1->red_drawable->u.fill.brush,
+ &d2->red_drawable->u.fill.brush);
+ default:
+ return FALSE;
+ }
+}
+
+static inline bool is_drawable_independent_from_surfaces(const Drawable *drawable)
+{
+ return std::all_of(drawable->surface_deps.begin(), drawable->surface_deps.end(), std::logical_not<RedSurface *>());
+}
+
+static inline bool has_shadow(const RedDrawable *drawable)
+{
+ return drawable->type == QXL_COPY_BITS;
+}
+
+static inline bool is_primary_surface(DisplayChannel *display, const RedSurface *surface)
+{
+ return surface->id == 0;
+}
+
+static inline void region_add_clip_rects(QRegion *rgn, SpiceClipRects *data)
+{
+ int i;
+
+ for (i = 0; i < data->num_rects; i++) {
+ region_add(rgn, data->rects + i);
+ }
+}
+
+#endif /* DISPLAY_CHANNEL_PRIVATE_H_ */
diff --git a/server/display-channel.cpp b/server/display-channel.cpp
new file mode 100644
index 00000000..4bd0cf41
--- /dev/null
+++ b/server/display-channel.cpp
@@ -0,0 +1,2522 @@
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+
+#include <common/sw_canvas.h>
+
+#include "display-channel-private.h"
+#include "red-qxl.h"
+
+DisplayChannel::~DisplayChannel()
+{
+ display_channel_destroy_surfaces(this);
+ image_cache_reset(&priv->image_cache);
+
+ if (spice_extra_checks) {
+ unsigned int count;
+ _Drawable *drawable;
+ VideoStream *stream;
+
+ count = 0;
+ for (drawable = priv->free_drawables; drawable; drawable = drawable->u.next) {
+ ++count;
+ }
+ spice_assert(count == priv->drawables.size());
+
+ count = 0;
+ for (stream = priv->free_streams; stream; stream = stream->next) {
+ ++count;
+ }
+ spice_assert(count == priv->streams_buf.size());
+ spice_assert(ring_is_empty(&priv->streams));
+
+ for (const auto &surface : priv->surfaces) {
+ spice_assert(!surface);
+ }
+ }
+
+ monitors_config_unref(priv->monitors_config);
+ g_array_unref(priv->video_codecs);
+}
+
+static void drawable_draw(DisplayChannel *display, Drawable *drawable);
+static Drawable *display_channel_drawable_try_new(DisplayChannel *display,
+ uint32_t process_commands_generation);
+static void display_channel_surface_draw(DisplayChannel *display, RedSurface *surface,
+ const SpiceRect *area);
+
+uint32_t display_channel_generate_uid(DisplayChannel *display)
+{
+ spice_return_val_if_fail(display != nullptr, 0);
+
+ return ++display->priv->bits_unique;
+}
+
+#define stat_start(stat, var) \
+ stat_start_time_t var; stat_start_time_init(&var, stat);
+
+void display_channel_compress_stats_reset(DisplayChannel *display)
+{
+ spice_return_if_fail(display);
+
+ image_encoder_shared_stat_reset(&display->priv->encoder_shared_data);
+}
+
+void display_channel_compress_stats_print(DisplayChannel *display)
+{
+#ifdef COMPRESS_STAT
+ uint32_t id;
+
+ spice_return_if_fail(display);
+
+ id = display->id();
+
+ spice_info("==> Compression stats for display %u", id);
+ image_encoder_shared_stat_print(&display->priv->encoder_shared_data);
+#endif
+}
+
+MonitorsConfig* monitors_config_ref(MonitorsConfig *monitors_config)
+{
+ monitors_config->refs++;
+
+ return monitors_config;
+}
+
+void monitors_config_unref(MonitorsConfig *monitors_config)
+{
+ if (!monitors_config) {
+ return;
+ }
+ if (--monitors_config->refs != 0) {
+ return;
+ }
+
+ spice_debug("freeing monitors config");
+ g_free(monitors_config);
+}
+
+static void monitors_config_debug(MonitorsConfig *mc)
+{
+ int i;
+
+ spice_debug("monitors config count:%d max:%d", mc->count, mc->max_allowed);
+ for (i = 0; i < mc->count; i++) {
+ spice_debug("head #%d +%d+%d %dx%d", i,
+ mc->heads[i].x, mc->heads[i].y,
+ mc->heads[i].width, mc->heads[i].height);
+ }
+}
+
+static MonitorsConfig* monitors_config_new(const QXLHead *heads, ssize_t nheads, ssize_t max)
+{
+ MonitorsConfig *mc;
+
+ mc = static_cast<MonitorsConfig *>(g_malloc(sizeof(MonitorsConfig) + nheads * sizeof(QXLHead)));
+ mc->refs = 1;
+ mc->count = nheads;
+ mc->max_allowed = max;
+ memcpy(mc->heads, heads, nheads * sizeof(QXLHead));
+ monitors_config_debug(mc);
+
+ return mc;
+}
+
+int display_channel_get_streams_timeout(DisplayChannel *display)
+{
+ int timeout = INT_MAX;
+ Ring *ring = &display->priv->streams;
+ RingItem *item = ring;
+
+ red_time_t now = spice_get_monotonic_time_ns();
+ while ((item = ring_next(ring, item))) {
+ VideoStream *stream;
+
+ stream = SPICE_CONTAINEROF(item, VideoStream, link);
+ red_time_t delta = (stream->last_time + RED_STREAM_TIMEOUT) - now;
+
+ if (delta < NSEC_PER_MILLISEC) {
+ return 0;
+ }
+ timeout = MIN(timeout, (unsigned int)(delta / NSEC_PER_MILLISEC));
+ }
+ return timeout;
+}
+
+void display_channel_set_stream_video(DisplayChannel *display, int stream_video)
+{
+ spice_return_if_fail(display);
+ spice_return_if_fail(stream_video != SPICE_STREAM_VIDEO_INVALID);
+
+ switch (stream_video) {
+ case SPICE_STREAM_VIDEO_ALL:
+ spice_debug("sv all");
+ break;
+ case SPICE_STREAM_VIDEO_FILTER:
+ spice_debug("sv filter");
+ break;
+ case SPICE_STREAM_VIDEO_OFF:
+ spice_debug("sv off");
+ break;
+ default:
+ spice_warn_if_reached();
+ return;
+ }
+
+ display->priv->stream_video = stream_video;
+}
+
+void display_channel_set_video_codecs(DisplayChannel *display, GArray *video_codecs)
+{
+ spice_return_if_fail(display);
+
+ g_clear_pointer(&display->priv->video_codecs, g_array_unref);
+ display->priv->video_codecs = g_array_ref(video_codecs);
+
+ DisplayChannelClient *dcc;
+
+ FOREACH_DCC(display, dcc) {
+ dcc_video_codecs_update(dcc);
+ }
+
+ video_stream_detach_and_stop(display);
+}
+
+GArray *display_channel_get_video_codecs(DisplayChannel *display)
+{
+ spice_return_val_if_fail(display, NULL);
+
+ return display->priv->video_codecs;
+}
+
+int display_channel_get_stream_video(DisplayChannel *display)
+{
+ return display->priv->stream_video;
+}
+
+static void stop_streams(DisplayChannel *display)
+{
+ Ring *ring = &display->priv->streams;
+ RingItem *item = ring_get_head(ring);
+
+ while (item) {
+ VideoStream *stream = SPICE_CONTAINEROF(item, VideoStream, link);
+ item = ring_next(ring, item);
+ if (!stream->current) {
+ video_stream_stop(display, stream);
+ } else {
+ spice_debug("attached stream");
+ }
+ }
+
+ display->priv->next_item_trace = 0;
+ display->priv->items_trace = {};
+}
+
+static void display_channel_surface_unref(DisplayChannel *display, RedSurface *surface)
+{
+ DisplayChannelClient *dcc;
+
+ if (--surface->refs != 0) {
+ return;
+ }
+
+ // only primary surface streams are supported
+ if (is_primary_surface(display, surface)) {
+ stop_streams(display);
+ }
+ spice_assert(surface->context.canvas);
+
+ surface->context.canvas->ops->destroy(surface->context.canvas);
+ surface->context.canvas = nullptr;
+ surface->create_cmd.reset();
+ surface->destroy_cmd.reset();
+
+ region_destroy(&surface->draw_dirty_region);
+ FOREACH_DCC(display, dcc) {
+ dcc_destroy_surface(dcc, surface->id);
+ }
+
+ spice_warn_if_fail(ring_is_empty(&surface->depend_on_me));
+ delete surface;
+}
+
+void display_channel_surface_id_unref(DisplayChannel *display, uint32_t surface_id)
+{
+ display_channel_surface_unref(display, display->priv->surfaces[surface_id]);
+ display->priv->surfaces[surface_id] = nullptr;
+}
+
+static void streams_update_visible_region(DisplayChannel *display, Drawable *drawable)
+{
+ Ring *ring;
+ RingItem *item;
+ DisplayChannelClient *dcc;
+
+ if (!display->is_connected()) {
+ return;
+ }
+
+ if (!is_primary_surface(display, drawable->surface)) {
+ return;
+ }
+
+ ring = &display->priv->streams;
+ item = ring_get_head(ring);
+
+ while (item) {
+ VideoStream *stream = SPICE_CONTAINEROF(item, VideoStream, link);
+ VideoStreamAgent *agent;
+
+ item = ring_next(ring, item);
+
+ if (stream->current == drawable) {
+ continue;
+ }
+
+ FOREACH_DCC(display, dcc) {
+ int stream_id = display_channel_get_video_stream_id(display, stream);
+ agent = dcc_get_video_stream_agent(dcc, stream_id);
+
+ if (region_intersects(&agent->vis_region, &drawable->tree_item.base.rgn)) {
+ region_exclude(&agent->vis_region, &drawable->tree_item.base.rgn);
+ region_exclude(&agent->clip, &drawable->tree_item.base.rgn);
+ dcc_video_stream_agent_clip(dcc, agent);
+ }
+ }
+ }
+}
+
+static void pipes_add_drawable(DisplayChannel *display, Drawable *drawable)
+{
+ DisplayChannelClient *dcc;
+
+ spice_warn_if_fail(drawable->pipes == nullptr);
+ FOREACH_DCC(display, dcc) {
+ dcc_prepend_drawable(dcc, drawable);
+ }
+}
+
+static void pipes_add_drawable_after(DisplayChannel *display,
+ Drawable *drawable, Drawable *pos_after)
+{
+ RedDrawablePipeItem *dpi_pos_after;
+ DisplayChannelClient *dcc;
+ int num_other_linked = 0;
+
+ for (GList *l = pos_after->pipes; l != nullptr; l = l->next) {
+ dpi_pos_after = static_cast<RedDrawablePipeItem *>(l->data);
+
+ num_other_linked++;
+ dcc_add_drawable_after(dpi_pos_after->dcc, drawable, dpi_pos_after);
+ }
+
+ if (num_other_linked == 0) {
+ pipes_add_drawable(display, drawable);
+ return;
+ }
+ if (num_other_linked != display->get_n_clients()) {
+ spice_debug("TODO: not O(n^2)");
+ FOREACH_DCC(display, dcc) {
+ int sent = 0;
+ for (GList *l = pos_after->pipes; l != nullptr; l = l->next) {
+ dpi_pos_after = static_cast<RedDrawablePipeItem *>(l->data);
+ if (dpi_pos_after->dcc == dcc) {
+ sent = 1;
+ break;
+ }
+ }
+
+ if (!sent) {
+ dcc_prepend_drawable(dcc, drawable);
+ }
+ }
+ }
+}
+
+static void current_add_drawable(DisplayChannel *display,
+ Drawable *drawable, RingItem *pos)
+{
+ RedSurface *surface;
+
+ surface = drawable->surface;
+ ring_add_after(&drawable->tree_item.base.siblings_link, pos);
+ ring_add(&display->priv->current_list, &drawable->list_link);
+ ring_add(&surface->current_list, &drawable->surface_list_link);
+ drawable->refs++;
+}
+
+/* Unrefs the drawable and removes it from any rings that it's in, as well as
+ * removing any associated shadow item */
+static void current_remove_drawable(DisplayChannel *display, Drawable *item)
+{
+ /* todo: move all to unref? */
+ video_stream_trace_add_drawable(display, item);
+ draw_item_remove_shadow(&item->tree_item);
+ ring_remove(&item->tree_item.base.siblings_link);
+ ring_remove(&item->list_link);
+ ring_remove(&item->surface_list_link);
+ drawable_unref(item);
+}
+
+static void drawable_remove_from_pipes(Drawable *drawable)
+{
+ RedDrawablePipeItem *dpi;
+
+ GLIST_FOREACH(drawable->pipes, RedDrawablePipeItem, dpi) {
+ RedChannelClient *rcc;
+
+ rcc = dpi->dcc;
+ rcc->pipe_remove_and_release(dpi);
+ }
+}
+
+/* This function should never be called for Shadow TreeItems */
+static void current_remove(DisplayChannel *display, TreeItem *item)
+{
+ TreeItem *now = item;
+
+ /* depth-first tree traversal, TODO: do a to tree_foreach()? */
+ for (;;) {
+ Container *container_of_now = now->container;
+ RingItem *ring_item;
+
+ if (now->type == TREE_ITEM_TYPE_DRAWABLE) {
+ Drawable *drawable = SPICE_CONTAINEROF(now, Drawable, tree_item.base);
+ ring_item = now->siblings_link.prev;
+ drawable_remove_from_pipes(drawable);
+ current_remove_drawable(display, drawable);
+ } else {
+ Container *now_as_container = CONTAINER(now);
+
+ spice_assert(now->type == TREE_ITEM_TYPE_CONTAINER);
+
+ if ((ring_item = ring_get_head(&now_as_container->items))) {
+ /* descend into the container's child ring and continue
+ * iterating and removing those children */
+ now = SPICE_CONTAINEROF(ring_item, TreeItem, siblings_link);
+ continue;
+ }
+ /* This item is a container but it has no children, so reset our
+ * iterator to the item's previous sibling and free this empty
+ * container */
+ ring_item = now->siblings_link.prev;
+ container_free(now_as_container);
+ }
+ if (now == item) {
+ /* This is true if the initial @item was a DRAWABLE, or if @item
+ * was a container and we've finished iterating over all of that
+ * container's children and returned back up to the parent and
+ * freed it (see below) */
+ return;
+ }
+
+ /* Increment the iterator to the next sibling. Note that if an item was
+ * removed above, ring_item will have been reset to the item before the
+ * item that was removed */
+ if ((ring_item = ring_next(&container_of_now->items, ring_item))) {
+ now = SPICE_CONTAINEROF(ring_item, TreeItem, siblings_link);
+ } else {
+ /* there is no next sibling, so move one level up the tree */
+ now = &container_of_now->base;
+ }
+ }
+}
+
+static void current_remove_all(DisplayChannel *display, RedSurface *surface)
+{
+ Ring *ring = &surface->current;
+ RingItem *ring_item;
+
+ while ((ring_item = ring_get_head(ring))) {
+ TreeItem *now = SPICE_CONTAINEROF(ring_item, TreeItem, siblings_link);
+ /* NOTE: current_remove() should never be called on Shadow type items
+ * or we will hit an assert. Fortunately, the 'current' ring is ordered
+ * in such a way that a DrawItem will always be placed before its
+ * associated Shadow in the tree. Since removing a DrawItem will also
+ * result in the associated Shadow item being removed from the tree,
+ * this loop will never call current_remove() on a Shadow item unless
+ * we change the order that items are inserted into the tree */
+ current_remove(display, now);
+ }
+}
+
+/* Replace an existing Drawable in the tree with a new drawable that is
+ * equivalent. The new drawable is also added to the pipe.
+ *
+ * This function can fail if the items aren't actually equivalent (e.g. either
+ * item has a shadow, they have different effects, etc)
+ */
+static bool current_add_equal(DisplayChannel *display, DrawItem *item, TreeItem *other)
+{
+ DrawItem *other_draw_item;
+ Drawable *drawable;
+ Drawable *other_drawable;
+
+ if (other->type != TREE_ITEM_TYPE_DRAWABLE) {
+ return FALSE;
+ }
+ other_draw_item = DRAW_ITEM(other);
+
+ if (item->shadow || other_draw_item->shadow || item->effect != other_draw_item->effect) {
+ return FALSE;
+ }
+
+ drawable = SPICE_CONTAINEROF(item, Drawable, tree_item);
+ other_drawable = SPICE_CONTAINEROF(other_draw_item, Drawable, tree_item);
+
+ if (item->effect == QXL_EFFECT_OPAQUE) {
+ /* check whether the new item can safely replace the other drawable at
+ * the same position in the pipe, or whether it should be added to the
+ * end of the queue */
+ int add_after = !!other_drawable->stream &&
+ is_drawable_independent_from_surfaces(drawable);
+ video_stream_maintenance(display, drawable, other_drawable);
+ current_add_drawable(display, drawable, &other->siblings_link);
+ other_drawable->refs++;
+ current_remove_drawable(display, other_drawable);
+ if (add_after) {
+ pipes_add_drawable_after(display, drawable, other_drawable);
+ } else {
+ pipes_add_drawable(display, drawable);
+ }
+ drawable_remove_from_pipes(other_drawable);
+ drawable_unref(other_drawable);
+ return TRUE;
+ }
+
+ switch (item->effect) {
+ case QXL_EFFECT_REVERT_ON_DUP:
+ if (is_same_drawable(drawable, other_drawable)) {
+
+ DisplayChannelClient *dcc;
+ GList *dpi_item;
+
+ other_drawable->refs++;
+ current_remove_drawable(display, other_drawable);
+
+ /* sending the drawable to clients that already received
+ * (or will receive) other_drawable */
+ dpi_item = g_list_first(other_drawable->pipes);
+ /* dpi contains a sublist of dcc's, ordered the same */
+ FOREACH_DCC(display, dcc) {
+ if (dpi_item && dcc == (static_cast<RedDrawablePipeItem *>(dpi_item->data))->dcc) {
+ dpi_item = dpi_item->next;
+ } else {
+ dcc_prepend_drawable(dcc, drawable);
+ }
+ }
+ /* not sending other_drawable where possible */
+ drawable_remove_from_pipes(other_drawable);
+
+ drawable_unref(other_drawable);
+ return TRUE;
+ }
+ break;
+ case QXL_EFFECT_OPAQUE_BRUSH:
+ if (is_same_geometry(drawable, other_drawable)) {
+ current_add_drawable(display, drawable, &other->siblings_link);
+ drawable_remove_from_pipes(other_drawable);
+ current_remove_drawable(display, other_drawable);
+ pipes_add_drawable(display, drawable);
+ return TRUE;
+ }
+ break;
+ case QXL_EFFECT_NOP_ON_DUP:
+ if (is_same_drawable(drawable, other_drawable)) {
+ return TRUE;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+/* This function excludes the given region from a single TreeItem. Both @rgn
+ * and @item may be modified.
+ *
+ * If there is overlap between @rgn and the @item region, remove the
+ * overlapping intersection from both @rgn and the item's region (NOTE: it's
+ * not clear to me why this is done - jjongsma)
+ *
+ * However, if the item is a DrawItem that has a shadow, we add an additional
+ * region to @rgn: the intersection of the shadow item's region with @rgn when
+ * @rgn is shifted over by the delta between the DrawItem and the Shadow.
+ * [WORKING THEORY: since the destination region for a COPY_BITS operation was
+ * excluded, we no longer need the source region that corresponds with that
+ * copy operation, so we can also exclude any drawables that affect that
+ * region. Not sure if that actually makes sense... ]
+ *
+ * If the item is a Shadow, we store the intersection between @rgn and the
+ * Shadow's region in Shadow::on_hold and remove that region from @rgn. This is
+ * done since a Shadow represents the source region for a COPY_BITS operation,
+ * and we need to make sure that this source region stays up-to-date until the
+ * copy operation is executed.
+ *
+ * Consider the following case:
+ * 1) the surface is fully black at the beginning
+ * 2) we add a new item to the tree which paints region A white
+ * 3) we add a new item to the tree which copies region A to region B
+ * 4) we add another new item to the tree painting region A blue.
+ *
+ * After all operations are completed, region A should be blue, and region B
+ * should be white. If there were no copy operation (step 3), we could simply
+ * eliminate step 2 when we add item 4 to the tree, since step 4 overwrites the
+ * same region with a different color. However, if we did eliminate step 2,
+ * region B would be black after all operations were completed. So these
+ * regions that would normally be excluded are put "on hold" if they are part
+ * of a source region for a copy operation.
+ *
+ * @display: the display channel
+ * @ring: a fallback toplevel ring???
+ * @item: the tree item to exclude from @rgn
+ * @rgn: the region to exclude
+ * @top_ring: ???
+ * @frame_candidate: ???
+ */
+static void __exclude_region(DisplayChannel *display, Ring *ring, TreeItem *item, QRegion *rgn,
+ Ring **top_ring, Drawable *frame_candidate)
+{
+ QRegion and_rgn;
+ stat_start(&display->priv->__exclude_stat, start_time);
+
+ region_clone(&and_rgn, rgn);
+ /* find intersection of the @rgn argument with the region of the @item arg */
+ region_and(&and_rgn, &item->rgn);
+ if (!region_is_empty(&and_rgn)) {
+ if (IS_DRAW_ITEM(item)) {
+ DrawItem *draw = DRAW_ITEM(item);
+
+ if (draw->effect == QXL_EFFECT_OPAQUE) {
+ /* remove the intersection from the original @rgn */
+ region_exclude(rgn, &and_rgn);
+ }
+
+ if (draw->shadow) {
+ /* @draw represents the destination of a COPY_BITS operation.
+ * @shadow represents the source item for the copy operation */
+ Shadow *shadow;
+ int32_t x = item->rgn.extents.x1;
+ int32_t y = item->rgn.extents.y1;
+
+ /* remove the intersection from the item's region */
+ region_exclude(&draw->base.rgn, &and_rgn);
+ shadow = draw->shadow;
+ /* shift the intersected region by the difference between the
+ * source and destination regions */
+ region_offset(&and_rgn, shadow->base.rgn.extents.x1 - x,
+ shadow->base.rgn.extents.y1 - y);
+ /* remove the shifted intersection region from the source
+ * (shadow) item's region. If the destination is excluded, we
+ * can also exclude the corresponding area from the source */
+ region_exclude(&shadow->base.rgn, &and_rgn);
+ /* find the intersection between the shifted intersection
+ * region and the Shadow's 'on_hold' region. This represents
+ * the portion of the Shadow's region that we just removed that
+ * is currently stored in on_hold. */
+ region_and(&and_rgn, &shadow->on_hold);
+ if (!region_is_empty(&and_rgn)) {
+ /* Since we removed a portion of the Shadow's region, we
+ * can also remove that portion from on_hold */
+ region_exclude(&shadow->on_hold, &and_rgn);
+ /* Since this region is no longer "on hold", add it back to
+ * the @rgn argument */
+ region_or(rgn, &and_rgn);
+ // in flat representation of current, shadow is always his owner next
+ if (!tree_item_contained_by(&shadow->base, *top_ring)) {
+ *top_ring = tree_item_container_items(&shadow->base, ring);
+ }
+ }
+ } else {
+ /* TODO: document the purpose of this code */
+ if (frame_candidate) {
+ Drawable *drawable = SPICE_CONTAINEROF(draw, Drawable, tree_item);
+ video_stream_maintenance(display, frame_candidate, drawable);
+ }
+ /* Remove the intersection from the DrawItem's region */
+ region_exclude(&draw->base.rgn, &and_rgn);
+ }
+ } else if (item->type == TREE_ITEM_TYPE_CONTAINER) {
+ /* excludes the intersection between 'rgn' and item->rgn from the
+ * item's region */
+ region_exclude(&item->rgn, &and_rgn);
+
+ if (region_is_empty(&item->rgn)) { //assume container removal will follow
+ Shadow *shadow;
+
+ /* exclude the intersection from the 'rgn' argument as well,
+ * but only if the item is now empty.
+ * TODO: explain why this is necessary */
+ region_exclude(rgn, &and_rgn);
+ if ((shadow = tree_item_find_shadow(item))) {
+ /* add the shadow's on_hold region back to the 'rgn' argument */
+ region_or(rgn, &shadow->on_hold);
+ if (!tree_item_contained_by(&shadow->base, *top_ring)) {
+ /* TODO: document why top_ring is set here */
+ *top_ring = tree_item_container_items(&shadow->base, ring);
+ }
+ }
+ }
+ } else {
+ Shadow *shadow;
+
+ spice_assert(item->type == TREE_ITEM_TYPE_SHADOW);
+ shadow = SHADOW(item);
+ /* Since a Shadow represents the source region for a COPY_BITS
+ * operation, we need to make sure that we don't remove existing
+ * drawables that draw to this source region. If we did, it would
+ * affect the copy operation. So we remove the intersection between
+ * @rgn and item->rgn from the @rgn argument to avoid excluding
+ * these drawables */
+ region_exclude(rgn, &and_rgn);
+ /* adds this intersection to on_hold */
+ region_or(&shadow->on_hold, &and_rgn);
+ }
+ }
+ /* clean up memory */
+ region_destroy(&and_rgn);
+ stat_add(&display->priv->__exclude_stat, start_time);
+}
+
+/* This function iterates through the given @ring starting at @ring_item and
+ * continuing until reaching @last. and calls __exclude_region() on each item.
+ * Any items that have an empty region as a result of the __exclude_region()
+ * call are removed from the tree.
+ *
+ * TODO: What is the intended use of this function?
+ *
+ * @ring: every time this function is called, @ring is a Surface's 'current'
+ * ring, or to the ring of children of a container within that ring.
+ * @ring_item: callers usually call this argument 'exclude_base'. We will
+ * iterate through the tree starting at this item
+ * @rgn: callers usually call this 'exclude_rgn' -- it appears to be the region
+ * we want to exclude from existing items in the tree. It is an in/out
+ * parameter and it may be modified as the result of calling this function
+ * @last: We will stop iterating at this item, and the function will return the
+ * next item after iteration is complete (which may be different than the
+ * passed value if that item was removed from the tree
+ * @frame_candidate: usually callers pass NULL, sometimes it's the drawable
+ * that's being added to the 'current' ring. TODO: What is its purpose?
+ */
+static void exclude_region(DisplayChannel *display, Ring *ring, RingItem *ring_item,
+ QRegion *rgn, TreeItem **last, Drawable *frame_candidate)
+{
+ Ring *top_ring;
+ stat_start(&display->priv->exclude_stat, start_time);
+
+ if (!ring_item) {
+ return;
+ }
+
+ top_ring = ring;
+
+ for (;;) {
+ TreeItem *now = SPICE_CONTAINEROF(ring_item, TreeItem, siblings_link);
+ Container *container = now->container;
+
+ spice_assert(!region_is_empty(&now->rgn));
+
+ /* check whether the ring_item item intersects the passed-in region */
+ if (region_intersects(rgn, &now->rgn)) {
+ /* remove the overlapping portions of region and now->rgn, among
+ * other things. See documentation for __exclude_region() */
+ __exclude_region(display, ring, now, rgn, &top_ring, frame_candidate);
+
+ if (region_is_empty(&now->rgn)) {
+ /* __exclude_region() does not remove the region of shadow-type
+ * items */
+ spice_assert(now->type != TREE_ITEM_TYPE_SHADOW);
+ ring_item = now->siblings_link.prev;
+ /* if __exclude_region() removed the entire region for this
+ * sibling item, remove it from the 'current' tree */
+ current_remove(display, now);
+ if (last && *last == now) {
+ /* the caller wanted to stop at this item, but this item
+ * has been removed, so we set @last to the next item */
+ SPICE_VERIFY(SPICE_OFFSETOF(TreeItem, siblings_link) == 0);
+ *last = reinterpret_cast<TreeItem *>(ring_next(ring, ring_item));
+ }
+ } else if (now->type == TREE_ITEM_TYPE_CONTAINER) {
+ /* if this sibling is a container type, descend into the
+ * container's child ring and continue iterating */
+ Container *now_container = CONTAINER(now);
+ if ((ring_item = ring_get_head(&now_container->items))) {
+ ring = &now_container->items;
+ spice_assert(SPICE_CONTAINEROF(ring_item, TreeItem, siblings_link)->container);
+ continue;
+ }
+ /* container had no children, so reset ring_item to the
+ * container itself */
+ ring_item = &now->siblings_link;
+ }
+
+ if (region_is_empty(rgn)) {
+ /* __exclude_region() removed the entire region from 'rgn', so
+ * no need to continue checking further items in the tree */
+ stat_add(&display->priv->exclude_stat, start_time);
+ return;
+ }
+ }
+
+ SPICE_VERIFY(SPICE_OFFSETOF(TreeItem, siblings_link) == 0);
+ /* if this is the last item to check, or if the current ring is
+ * completed, don't go any further */
+ while ((last && *last == reinterpret_cast<TreeItem *>(ring_item)) ||
+ !(ring_item = ring_next(ring, ring_item))) {
+ /* we're currently iterating the top ring, so we're done */
+ if (ring == top_ring) {
+ stat_add(&display->priv->exclude_stat, start_time);
+ return;
+ }
+ /* we're iterating through a container child ring, so climb one
+ * level up the heirarchy and continue iterating that ring */
+ ring_item = &container->base.siblings_link;
+ container = container->base.container;
+ ring = (container) ? &container->items : top_ring;
+ }
+ }
+}
+
+/* Add a drawable @item (with a shadow) to the current ring. The return value
+ * indicates whether the new item should be added to the pipe */
+static bool current_add_with_shadow(DisplayChannel *display, Ring *ring, Drawable *item)
+{
+ stat_start(&display->priv->add_stat, start_time);
+#ifdef RED_WORKER_STAT
+ ++display->priv->add_with_shadow_count;
+#endif
+
+ RedDrawable *red_drawable = item->red_drawable.get();
+ SpicePoint delta = {
+ .x = red_drawable->u.copy_bits.src_pos.x - red_drawable->bbox.left,
+ .y = red_drawable->u.copy_bits.src_pos.y - red_drawable->bbox.top
+ };
+
+ Shadow *shadow = shadow_new(&item->tree_item, &delta);
+ if (!shadow) {
+ stat_add(&display->priv->add_stat, start_time);
+ return FALSE;
+ }
+ // item and his shadow must initially be placed in the same container.
+ // for now putting them on root.
+
+ // only primary surface streams are supported
+ if (is_primary_surface(display, item->surface)) {
+ video_stream_detach_behind(display, &shadow->base.rgn, nullptr);
+ }
+
+ /* Prepend the shadow to the beginning of the current ring */
+ ring_add(ring, &shadow->base.siblings_link);
+ /* Prepend the draw item to the beginning of the current ring. NOTE: this
+ * means that the drawable is placed *before* its associated shadow in the
+ * tree. Changing this order will violate several unstated assumptions */
+ current_add_drawable(display, item, ring);
+ if (item->tree_item.effect == QXL_EFFECT_OPAQUE) {
+ QRegion exclude_rgn;
+ region_clone(&exclude_rgn, &item->tree_item.base.rgn);
+ /* Since the new drawable is opaque, remove overlapped regions from all
+ * items already in the tree. Start iterating through the tree
+ * starting with the shadow item to avoid excluding the new item
+ * itself */
+ exclude_region(display, ring, &shadow->base.siblings_link, &exclude_rgn, nullptr, nullptr);
+ region_destroy(&exclude_rgn);
+ streams_update_visible_region(display, item);
+ } else {
+ if (is_primary_surface(display, item->surface)) {
+ video_stream_detach_behind(display, &item->tree_item.base.rgn, item);
+ }
+ }
+ stat_add(&display->priv->add_stat, start_time);
+ return TRUE;
+}
+
+/* Add a @drawable (without a shadow) to the current ring.
+ * The return value indicates whether the new item should be added to the pipe */
+static bool current_add(DisplayChannel *display, Ring *ring, Drawable *drawable)
+{
+ DrawItem *item = &drawable->tree_item;
+ RingItem *now;
+ QRegion exclude_rgn;
+ RingItem *exclude_base = nullptr;
+ stat_start(&display->priv->add_stat, start_time);
+
+ spice_assert(!region_is_empty(&item->base.rgn));
+ region_init(&exclude_rgn);
+ now = ring_next(ring, ring);
+
+ /* check whether the new drawable region intersects any of the items
+ * already in the 'current' ring */
+ while (now) {
+ TreeItem *sibling = SPICE_CONTAINEROF(now, TreeItem, siblings_link);
+ int test_res;
+
+ if (!region_bounds_intersects(&item->base.rgn, &sibling->rgn)) {
+ /* the bounds of the two items are totally disjoint, so no need to
+ * check further. check the next item */
+ now = ring_next(ring, now);
+ continue;
+ }
+ /* bounds overlap, but check whether the regions actually overlap */
+ test_res = region_test(&item->base.rgn, &sibling->rgn, REGION_TEST_ALL);
+ if (!(test_res & REGION_TEST_SHARED)) {
+ /* there's no overlap of the regions between these two items. Move
+ * on to the next one. */
+ now = ring_next(ring, now);
+ continue;
+ }
+ if (sibling->type != TREE_ITEM_TYPE_SHADOW) {
+ /* there is an overlap between the two regions */
+ /* NOTE: Shadow types represent a source region for a COPY_BITS
+ * operation, they don't represent a region that will be drawn.
+ * Therefore, we don't check for overlap between the new
+ * DrawItem and any shadow items */
+ if (!(test_res & REGION_TEST_RIGHT_EXCLUSIVE) &&
+ !(test_res & REGION_TEST_LEFT_EXCLUSIVE) &&
+ current_add_equal(display, item, sibling)) {
+ /* the regions were equivalent, so we just replaced the other
+ * drawable with the new one */
+ stat_add(&display->priv->add_stat, start_time);
+ /* Caller doesn't need to add the new drawable to the pipe,
+ * since current_add_equal already added it to the pipe */
+ return FALSE;
+ }
+
+ if (!(test_res & REGION_TEST_RIGHT_EXCLUSIVE) && item->effect == QXL_EFFECT_OPAQUE) {
+ /* the new drawable is opaque and entirely contains the sibling item */
+ Shadow *shadow;
+ int skip = now == exclude_base;
+
+ if ((shadow = tree_item_find_shadow(sibling))) {
+ /* The sibling item was the destination of a COPY_BITS operation */
+ if (exclude_base) {
+ /* During a previous iteration through this loop, an
+ * obscured sibling item was removed from the tree, and
+ * exclude_base was set to the item immediately after
+ * the removed item (see below). This time through the
+ * loop, we encountered another sibling that was
+ * completely obscured, so we call exclude_region()
+ * using the previously saved item as our starting
+ * point. @exlude_rgn will be the union of any previous
+ * 'on_hold' regions from the shadows of previous
+ * iterations
+ *
+ * TODO: it's unclear to me why we only only call
+ * exclude_region() for the previous item if the next
+ * item is obscured and has a shadow. -jjongsma
+ */
+ TreeItem *next = sibling;
+ exclude_region(display, ring, exclude_base, &exclude_rgn, &next, nullptr);
+ if (next != sibling) {
+ /* the @next param is only changed if the given item
+ * was removed as a side-effect of calling
+ * exclude_region(), so update our loop variable */
+ now = next ? &next->siblings_link : nullptr;
+ exclude_base = nullptr;
+ continue;
+ }
+ }
+ /* Since the destination item (sibling) of the COPY_BITS
+ * operation is fully obscured, we no longer need the
+ * source item (shadow) anymore. shadow->on_hold represents
+ * a region that would normally have been excluded by a
+ * previous call to __exclude_region() (see documentation
+ * for that function), but was put on hold to make sure we
+ * kept the source region up to date. Now that we no longer
+ * need this source region, this "on hold" region can be
+ * safely excluded again. */
+ region_or(&exclude_rgn, &shadow->on_hold);
+ }
+ now = now->prev;
+ /* remove the obscured sibling from the 'current' tree, which
+ * will also remove its shadow (if any) */
+ current_remove(display, sibling);
+ /* advance the loop variable */
+ now = ring_next(ring, now);
+ if (shadow || skip) {
+ /* 'now' is currently set to the item immediately AFTER
+ * the obscured sibling that we just removed.
+ * TODO: document why this item is used as an
+ * 'exclude_base' */
+ exclude_base = now;
+ }
+ continue;
+ }
+
+ if (!(test_res & REGION_TEST_LEFT_EXCLUSIVE) && is_opaque_item(sibling)) {
+ /* the sibling item is opaque and entirely contains the new drawable */
+ Container *container;
+
+ /* The first time through, @exclude_base will be NULL, but
+ * subsequent loops may set it to something. In addition,
+ * @exclude_rgn starts out empty, but previous iterations of
+ * this loop may have added various Shadow::on_hold regions to
+ * it. */
+ if (exclude_base) {
+ exclude_region(display, ring, exclude_base, &exclude_rgn, nullptr, nullptr);
+ region_clear(&exclude_rgn);
+ exclude_base = nullptr;
+ }
+ if (sibling->type == TREE_ITEM_TYPE_CONTAINER) {
+ container = CONTAINER(sibling);
+ /* NOTE: here, ring is reset to the ring of the container's children */
+ ring = &container->items;
+ /* if the sibling item is a container, place the new
+ * drawable into that container */
+ item->base.container = container;
+ /* Start iterating over the container's children to see if
+ * any of them intersect this new drawable */
+ now = ring_next(ring, ring);
+ continue;
+ }
+ spice_assert(IS_DRAW_ITEM(sibling));
+ if (!DRAW_ITEM(sibling)->container_root) {
+ /* Create a new container to hold the sibling and the new
+ * drawable */
+ container = container_new(DRAW_ITEM(sibling));
+ if (!container) {
+ spice_warning("create new container failed");
+ region_destroy(&exclude_rgn);
+ return FALSE;
+ }
+ item->base.container = container;
+ /* reset 'ring' to the container's children ring, so that
+ * we can add the new drawable to this ring below */
+ ring = &container->items;
+ }
+ }
+ }
+ /* If we've gotten here, that means that:
+ * - the new item is not opaque
+ * - We just created a container to hold the new drawable and the
+ * sibling that encloses it
+ * - ??? */
+ if (!exclude_base) {
+ exclude_base = now;
+ }
+ break;
+ }
+ /* we've removed any obscured siblings and figured out which ring the new
+ * drawable needs to be added to, so let's add it. */
+ if (item->effect == QXL_EFFECT_OPAQUE) {
+ /* @exclude_rgn may contain the union of on_hold regions from any
+ * Shadows that were associated with DrawItems that were removed from
+ * the tree. Add the new item's region to that */
+ region_or(&exclude_rgn, &item->base.rgn);
+ exclude_region(display, ring, exclude_base, &exclude_rgn, nullptr, drawable);
+ video_stream_trace_update(display, drawable);
+ streams_update_visible_region(display, drawable);
+ /*
+ * Performing the insertion after exclude_region for
+ * safety (todo: Not sure if exclude_region can affect the drawable
+ * if it is added to the tree before calling exclude_region).
+ */
+ current_add_drawable(display, drawable, ring);
+ } else {
+ /*
+ * video_stream_detach_behind can affect the current tree since
+ * it may trigger calls to display_channel_draw. Thus, the
+ * drawable should be added to the tree before calling
+ * video_stream_detach_behind
+ */
+ current_add_drawable(display, drawable, ring);
+ if (is_primary_surface(display, drawable->surface)) {
+ video_stream_detach_behind(display, &drawable->tree_item.base.rgn, drawable);
+ }
+ }
+ region_destroy(&exclude_rgn);
+ stat_add(&display->priv->add_stat, start_time);
+ return TRUE;
+}
+
+static bool drawable_can_stream(DisplayChannel *display, Drawable *drawable)
+{
+ RedDrawable *red_drawable = drawable->red_drawable.get();
+ SpiceImage *image;
+
+ if (display->priv->stream_video == SPICE_STREAM_VIDEO_OFF) {
+ return FALSE;
+ }
+
+ if (!is_primary_surface(display, drawable->surface)) {
+ return FALSE;
+ }
+
+ if (drawable->tree_item.effect != QXL_EFFECT_OPAQUE ||
+ red_drawable->type != QXL_DRAW_COPY ||
+ red_drawable->u.copy.rop_descriptor != SPICE_ROPD_OP_PUT) {
+ return FALSE;
+ }
+
+ image = red_drawable->u.copy.src_bitmap;
+ if (image == nullptr ||
+ image->descriptor.type != SPICE_IMAGE_TYPE_BITMAP) {
+ return FALSE;
+ }
+
+ if (display->priv->stream_video == SPICE_STREAM_VIDEO_FILTER) {
+ SpiceRect* rect;
+ int size;
+
+ rect = &drawable->red_drawable->u.copy.src_area;
+ size = (rect->right - rect->left) * (rect->bottom - rect->top);
+ if (size < RED_STREAM_MIN_SIZE) {
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+#ifdef RED_WORKER_STAT
+static void display_channel_print_stats(DisplayChannel *display)
+{
+ stat_time_t total = display->priv->add_stat.total;
+ spice_debug("add with shadow count %u",
+ display->priv->add_with_shadow_count);
+ display->priv->add_with_shadow_count = 0;
+ spice_debug("add[%u] %f exclude[%u] %f __exclude[%u] %f",
+ display->priv->add_stat.count,
+ stat_cpu_time_to_sec(total),
+ display->priv->exclude_stat.count,
+ stat_cpu_time_to_sec(display->priv->exclude_stat.total),
+ display->priv->__exclude_stat.count,
+ stat_cpu_time_to_sec(display->priv->__exclude_stat.total));
+ spice_debug("add %f%% exclude %f%% exclude2 %f%% __exclude %f%%",
+ (double)(total - display->priv->exclude_stat.total) / total * 100,
+ (double)(display->priv->exclude_stat.total) / total * 100,
+ (double)(display->priv->exclude_stat.total -
+ display->priv->__exclude_stat.total) / display->priv->exclude_stat.total * 100,
+ (double)(display->priv->__exclude_stat.total) / display->priv->exclude_stat.total * 100);
+ stat_reset(&display->priv->add_stat);
+ stat_reset(&display->priv->exclude_stat);
+ stat_reset(&display->priv->__exclude_stat);
+}
+#endif
+
+static void drawable_ref_surface_deps(DisplayChannel *display, Drawable *drawable)
+{
+ for (int x = 0; x < 3; ++x) {
+ const int surface_id = drawable->red_drawable->surface_deps[x];
+ if (surface_id == -1) {
+ drawable->surface_deps[x] = nullptr;
+ continue;
+ }
+
+ RedSurface *surface = display->priv->surfaces[surface_id];
+ surface->refs++;
+ drawable->surface_deps[x] = surface;
+ }
+}
+
+static void surface_read_bits(DisplayChannel *display, RedSurface *surface,
+ const SpiceRect *area, uint8_t *dest, int dest_stride)
+{
+ SpiceCanvas *canvas;
+
+ canvas = surface->context.canvas;
+ canvas->ops->read_bits(canvas, dest, dest_stride, area);
+}
+
+static void handle_self_bitmap(DisplayChannel *display, Drawable *drawable)
+{
+ RedDrawable *red_drawable = drawable->red_drawable.get();
+ SpiceImage *image;
+ int32_t width;
+ int32_t height;
+ uint8_t *dest;
+ int dest_stride;
+ RedSurface *surface;
+ int bpp;
+ int all_set;
+
+ surface = drawable->surface;
+
+ bpp = SPICE_SURFACE_FMT_DEPTH(surface->context.format) / 8;
+ width = red_drawable->self_bitmap_area.right - red_drawable->self_bitmap_area.left;
+ height = red_drawable->self_bitmap_area.bottom - red_drawable->self_bitmap_area.top;
+ dest_stride = SPICE_ALIGN(width * bpp, 4);
+
+ image = g_new0(SpiceImage, 1);
+ image->descriptor.type = SPICE_IMAGE_TYPE_BITMAP;
+ image->descriptor.flags = 0;
+
+ QXL_SET_IMAGE_ID(image, QXL_IMAGE_GROUP_RED, display_channel_generate_uid(display));
+ image->u.bitmap.flags = surface->context.top_down ? SPICE_BITMAP_FLAGS_TOP_DOWN : 0;
+ image->u.bitmap.format = spice_bitmap_from_surface_type(surface->context.format);
+ image->u.bitmap.stride = dest_stride;
+ image->descriptor.width = image->u.bitmap.x = width;
+ image->descriptor.height = image->u.bitmap.y = height;
+ image->u.bitmap.palette = nullptr;
+
+ dest = static_cast<uint8_t *>(spice_malloc_n(height, dest_stride));
+ image->u.bitmap.data = spice_chunks_new_linear(dest, height * dest_stride);
+ image->u.bitmap.data->flags |= SPICE_CHUNKS_FLAGS_FREE;
+
+ display_channel_surface_draw(display, drawable->surface,
+ &red_drawable->self_bitmap_area);
+ surface_read_bits(display, drawable->surface,
+ &red_drawable->self_bitmap_area, dest, dest_stride);
+
+ /* For 32bit non-primary surfaces we need to keep any non-zero
+ high bytes as the surface may be used as source to an alpha_blend */
+ if (!is_primary_surface(display, drawable->surface) &&
+ image->u.bitmap.format == SPICE_BITMAP_FMT_32BIT &&
+ rgb32_data_has_alpha(width, height, dest_stride, dest, &all_set)) {
+ if (all_set) {
+ image->descriptor.flags |= SPICE_IMAGE_FLAGS_HIGH_BITS_SET;
+ } else {
+ image->u.bitmap.format = SPICE_BITMAP_FMT_RGBA;
+ }
+ }
+
+ red_drawable->self_bitmap_image = image;
+}
+
+static void surface_add_reverse_dependency(DisplayChannel *display, RedSurface *surface,
+ DependItem *depend_item, Drawable *drawable)
+{
+ if (!surface) {
+ depend_item->drawable = nullptr;
+ return;
+ }
+
+ depend_item->drawable = drawable;
+ ring_add(&surface->depend_on_me, &depend_item->ring_item);
+}
+
+static bool handle_surface_deps(DisplayChannel *display, Drawable *drawable)
+{
+ int x;
+
+ for (x = 0; x < 3; ++x) {
+ // surface self dependency is handled by shadows in "current", or by
+ // handle_self_bitmap
+ if (drawable->surface_deps[x] != drawable->surface) {
+ surface_add_reverse_dependency(display, drawable->surface_deps[x],
+ &drawable->depend_items[x], drawable);
+
+ if (drawable->surface_deps[x] && drawable->surface_deps[x]->id == 0) {
+ QRegion depend_region;
+ region_init(&depend_region);
+ region_add(&depend_region, &drawable->red_drawable->surfaces_rects[x]);
+ video_stream_detach_behind(display, &depend_region, nullptr);
+ }
+ }
+ }
+
+ return TRUE;
+}
+
+static void draw_depend_on_me(DisplayChannel *display, RedSurface *surface)
+{
+ RingItem *ring_item;
+
+ while ((ring_item = ring_get_tail(&surface->depend_on_me))) {
+ Drawable *drawable;
+ DependItem *depended_item = SPICE_CONTAINEROF(ring_item, DependItem, ring_item);
+ drawable = depended_item->drawable;
+ display_channel_surface_draw(display, drawable->surface,
+ &drawable->red_drawable->bbox);
+ }
+}
+
+static bool validate_drawable_bbox(DisplayChannel *display, RedDrawable *drawable)
+{
+ DrawContext *context;
+
+ /* surface_id must be validated before calling into
+ * validate_drawable_bbox
+ */
+ RedSurface *surface = display_channel_validate_surface(display, drawable->surface_id);
+ if (!surface) {
+ return FALSE;
+ }
+ context = &surface->context;
+
+ if (drawable->bbox.top < 0)
+ return FALSE;
+ if (drawable->bbox.left < 0)
+ return FALSE;
+ if (drawable->bbox.bottom < 0)
+ return FALSE;
+ if (drawable->bbox.right < 0)
+ return FALSE;
+ if (drawable->bbox.bottom > context->height)
+ return FALSE;
+ if (drawable->bbox.right > context->width)
+ return FALSE;
+
+ return TRUE;
+}
+
+/**
+ * @brief Get a new Drawable
+ *
+ * The Drawable returned is fully initialized.
+ *
+ * @return initialized Drawable or NULL on failure
+ */
+static Drawable *display_channel_get_drawable(DisplayChannel *display, uint8_t effect,
+ red::shared_ptr<RedDrawable> &&red_drawable,
+ uint32_t process_commands_generation)
+{
+ Drawable *drawable;
+
+ /* Validate all surface ids before updating counters
+ * to avoid invalid updates if we find an invalid id.
+ */
+ if (!validate_drawable_bbox(display, red_drawable.get())) {
+ return nullptr;
+ }
+ for (const auto surface_id : red_drawable->surface_deps) {
+ if (surface_id != -1 && !display_channel_validate_surface(display, surface_id)) {
+ return nullptr;
+ }
+ }
+
+ drawable = display_channel_drawable_try_new(display, process_commands_generation);
+ if (!drawable) {
+ return nullptr;
+ }
+
+ drawable->tree_item.effect = effect;
+
+ drawable->surface = display->priv->surfaces[red_drawable->surface_id];
+ drawable->surface->refs++;
+
+ drawable->red_drawable = red_drawable;
+
+ /*
+ surface->refs is affected by a drawable (that is
+ dependent on the surface) as long as the drawable is alive.
+ However, surface->depend_on_me is affected by a drawable only
+ as long as it is in the current tree (hasn't been rendered yet).
+ */
+ drawable_ref_surface_deps(display, drawable);
+
+ return drawable;
+}
+
+/**
+ * Add a Drawable to the items to draw.
+ * On failure the Drawable is not added.
+ */
+static void display_channel_add_drawable(DisplayChannel *display, Drawable *drawable)
+{
+ RedDrawable *red_drawable = drawable->red_drawable.get();
+
+ red_drawable->mm_time = reds_get_mm_time();
+
+ region_add(&drawable->tree_item.base.rgn, &red_drawable->bbox);
+
+ if (red_drawable->clip.type == SPICE_CLIP_TYPE_RECTS) {
+ QRegion rgn;
+
+ region_init(&rgn);
+ region_add_clip_rects(&rgn, red_drawable->clip.rects);
+ region_and(&drawable->tree_item.base.rgn, &rgn);
+ region_destroy(&rgn);
+ }
+
+ if (region_is_empty(&drawable->tree_item.base.rgn)) {
+ return;
+ }
+
+ if (red_drawable->self_bitmap) {
+ handle_self_bitmap(display, drawable);
+ }
+
+ draw_depend_on_me(display, drawable->surface);
+
+ if (!handle_surface_deps(display, drawable)) {
+ return;
+ }
+
+ Ring *ring = &drawable->surface->current;
+ int add_to_pipe;
+ if (has_shadow(red_drawable)) {
+ add_to_pipe = current_add_with_shadow(display, ring, drawable);
+ } else {
+ drawable->streamable = drawable_can_stream(display, drawable);
+ add_to_pipe = current_add(display, ring, drawable);
+ }
+
+ if (add_to_pipe)
+ pipes_add_drawable(display, drawable);
+
+#ifdef RED_WORKER_STAT
+ if ((++display->priv->add_count % 100) == 0)
+ display_channel_print_stats(display);
+#endif
+}
+
+void display_channel_process_draw(DisplayChannel *display,
+ red::shared_ptr<RedDrawable> &&red_drawable,
+ uint32_t process_commands_generation)
+{
+ Drawable *drawable =
+ display_channel_get_drawable(display, red_drawable->effect, std::move(red_drawable),
+ process_commands_generation);
+
+ if (!drawable) {
+ return;
+ }
+
+ display_channel_add_drawable(display, drawable);
+
+ drawable_unref(drawable);
+}
+
+bool display_channel_wait_for_migrate_data(DisplayChannel *display)
+{
+ uint64_t end_time = spice_get_monotonic_time_ns() + DISPLAY_CLIENT_MIGRATE_DATA_TIMEOUT;
+ RedChannelClient *rcc;
+ int ret = FALSE;
+ GList *clients = display->get_clients();
+
+ if (!display->is_waiting_for_migrate_data()) {
+ return FALSE;
+ }
+
+ spice_debug("trace");
+ spice_warn_if_fail(g_list_length(clients) == 1);
+
+ rcc = static_cast<RedChannelClient *>(g_list_nth_data(clients, 0));
+
+ red::shared_ptr<RedChannelClient> hold_rcc(rcc);
+ for (;;) {
+ rcc->receive();
+ if (!rcc->is_connected()) {
+ break;
+ }
+
+ if (!rcc->is_waiting_for_migrate_data()) {
+ ret = TRUE;
+ break;
+ }
+ if (spice_get_monotonic_time_ns() > end_time) {
+ spice_warning("timeout");
+ rcc->disconnect();
+ break;
+ }
+ usleep(DISPLAY_CLIENT_RETRY_INTERVAL);
+ }
+ return ret;
+}
+
+void display_channel_flush_all_surfaces(DisplayChannel *display)
+{
+ for (const auto& surface : display->priv->surfaces) {
+ if (surface) {
+ display_channel_current_flush(display, surface);
+ }
+ }
+}
+
+void display_channel_free_glz_drawables_to_free(DisplayChannel *display)
+{
+ DisplayChannelClient *dcc;
+
+ spice_return_if_fail(display);
+
+ FOREACH_DCC(display, dcc) {
+ image_encoders_free_glz_drawables_to_free(dcc_get_encoders(dcc));
+ }
+}
+
+void display_channel_free_glz_drawables(DisplayChannel *display)
+{
+ DisplayChannelClient *dcc;
+
+ spice_return_if_fail(display);
+
+ FOREACH_DCC(display, dcc) {
+ image_encoders_free_glz_drawables(dcc_get_encoders(dcc));
+ }
+}
+
+static bool free_one_drawable(DisplayChannel *display, int force_glz_free)
+{
+ RingItem *ring_item = ring_get_tail(&display->priv->current_list);
+ Drawable *drawable;
+ Container *container;
+
+ if (!ring_item) {
+ return FALSE;
+ }
+
+ drawable = SPICE_CONTAINEROF(ring_item, Drawable, list_link);
+ if (force_glz_free) {
+ glz_retention_free_drawables(&drawable->glz_retention);
+ }
+ drawable_draw(display, drawable);
+ container = drawable->tree_item.base.container;
+
+ current_remove_drawable(display, drawable);
+ container_cleanup(container);
+ return TRUE;
+}
+
+void display_channel_current_flush(DisplayChannel *display, RedSurface *surface)
+{
+ while (!ring_is_empty(&surface->current_list)) {
+ free_one_drawable(display, FALSE);
+ }
+ current_remove_all(display, surface);
+}
+
+void display_channel_free_some(DisplayChannel *display)
+{
+ int n = 0;
+ DisplayChannelClient *dcc;
+
+ spice_debug("#draw=%d, #glz_draw=%d", display->priv->drawable_count,
+ display->priv->encoder_shared_data.glz_drawable_count);
+ FOREACH_DCC(display, dcc) {
+ ImageEncoders *encoders = dcc_get_encoders(dcc);
+
+ // encoding using the dictionary is prevented since the following operations might
+ // change the dictionary
+ if (image_encoders_glz_encode_lock(encoders)) {
+ n = image_encoders_free_some_independent_glz_drawables(encoders);
+ }
+ }
+
+ while (!ring_is_empty(&display->priv->current_list) && n++ < RED_RELEASE_BUNCH_SIZE) {
+ free_one_drawable(display, TRUE);
+ }
+
+ FOREACH_DCC(display, dcc) {
+ ImageEncoders *encoders = dcc_get_encoders(dcc);
+
+ image_encoders_glz_encode_unlock(encoders);
+ }
+}
+
+static Drawable* drawable_try_new(DisplayChannel *display)
+{
+ if (!display->priv->free_drawables)
+ return nullptr;
+
+ void *buf = display->priv->free_drawables->u.raw_drawable;
+ display->priv->free_drawables = display->priv->free_drawables->u.next;
+ display->priv->drawable_count++;
+
+ memset(buf, 0, sizeof(display->priv->free_drawables->u.raw_drawable));
+ return new(buf) Drawable();
+}
+
+static void drawable_free(DisplayChannel *display, Drawable *drawable)
+{
+ drawable->~Drawable();
+ reinterpret_cast<_Drawable *>(drawable)->u.next = display->priv->free_drawables;
+ display->priv->free_drawables = reinterpret_cast<_Drawable *>(drawable);
+ display->priv->drawable_count--;
+}
+
+// initialize Drawable memory pool
+static void drawables_init(DisplayChannel *display)
+{
+ _Drawable *curr = nullptr;
+
+ for (auto& drawable : display->priv->drawables) {
+ drawable.u.next = curr;
+ curr = &drawable;
+ }
+ display->priv->free_drawables = curr;
+}
+
+/**
+ * Allocate a Drawable
+ *
+ * @return pointer to uninitialized Drawable or NULL on failure
+ */
+static Drawable *display_channel_drawable_try_new(DisplayChannel *display,
+ uint32_t process_commands_generation)
+{
+ Drawable *drawable;
+
+ while (!(drawable = drawable_try_new(display))) {
+ if (!free_one_drawable(display, FALSE))
+ return nullptr;
+ }
+
+ /* Pointer to the display from which the drawable is allocated. This
+ * pointer is safe to be retained as DisplayChannel lifespan is bigger than
+ * all drawables. */
+ drawable->display = display;
+ drawable->refs = 1;
+ drawable->creation_time = drawable->first_frame_time = spice_get_monotonic_time_ns();
+ ring_item_init(&drawable->list_link);
+ ring_item_init(&drawable->surface_list_link);
+ ring_item_init(&drawable->tree_item.base.siblings_link);
+ drawable->tree_item.base.type = TREE_ITEM_TYPE_DRAWABLE;
+ region_init(&drawable->tree_item.base.rgn);
+ glz_retention_init(&drawable->glz_retention);
+ drawable->process_commands_generation = process_commands_generation;
+
+ return drawable;
+}
+
+static void depended_item_remove(DependItem *item)
+{
+ spice_return_if_fail(item->drawable);
+ spice_return_if_fail(ring_item_is_linked(&item->ring_item));
+
+ item->drawable = nullptr;
+ ring_remove(&item->ring_item);
+}
+
+static void drawable_remove_dependencies(Drawable *drawable)
+{
+ int x;
+
+ for (x = 0; x < 3; ++x) {
+ RedSurface* surface = drawable->surface_deps[x];
+ if (surface && drawable->depend_items[x].drawable) {
+ depended_item_remove(&drawable->depend_items[x]);
+ }
+ }
+}
+
+static void drawable_unref_surface_deps(DisplayChannel *display, Drawable *drawable)
+{
+ for (const auto surface : drawable->surface_deps) {
+ if (surface == nullptr) {
+ continue;
+ }
+ display_channel_surface_unref(display, surface);
+ }
+}
+
+void drawable_unref(Drawable *drawable)
+{
+ DisplayChannel *display = drawable->display;
+
+ if (--drawable->refs != 0)
+ return;
+
+ spice_warn_if_fail(!drawable->tree_item.shadow);
+ spice_warn_if_fail(drawable->pipes == nullptr);
+
+ if (drawable->stream) {
+ video_stream_detach_drawable(drawable->stream);
+ }
+ region_destroy(&drawable->tree_item.base.rgn);
+
+ drawable_remove_dependencies(drawable);
+ drawable_unref_surface_deps(display, drawable);
+ display_channel_surface_unref(display, drawable->surface);
+
+ glz_retention_detach_drawables(&drawable->glz_retention);
+
+ drawable_free(display, drawable);
+}
+
+static void drawable_deps_draw(DisplayChannel *display, Drawable *drawable)
+{
+ int x;
+
+ for (x = 0; x < 3; ++x) {
+ RedSurface *surface = drawable->surface_deps[x];
+ if (surface && drawable->depend_items[x].drawable) {
+ depended_item_remove(&drawable->depend_items[x]);
+ display_channel_surface_draw(display, surface,
+ &drawable->red_drawable->surfaces_rects[x]);
+ }
+ }
+}
+
+static void drawable_draw(DisplayChannel *display, Drawable *drawable)
+{
+ RedSurface *surface;
+ SpiceCanvas *canvas;
+ SpiceClip clip = drawable->red_drawable->clip;
+
+ drawable_deps_draw(display, drawable);
+
+ surface = drawable->surface;
+ canvas = surface->context.canvas;
+ spice_return_if_fail(canvas);
+
+ image_cache_aging(&display->priv->image_cache);
+
+ region_add(&surface->draw_dirty_region, &drawable->red_drawable->bbox);
+
+ switch (drawable->red_drawable->type) {
+ case QXL_DRAW_FILL: {
+ SpiceFill fill = drawable->red_drawable->u.fill;
+ SpiceImage img1, img2;
+ image_cache_localize_brush(&display->priv->image_cache, &fill.brush, &img1);
+ image_cache_localize_mask(&display->priv->image_cache, &fill.mask, &img2);
+ canvas->ops->draw_fill(canvas, &drawable->red_drawable->bbox,
+ &clip, &fill);
+ break;
+ }
+ case QXL_DRAW_OPAQUE: {
+ SpiceOpaque opaque = drawable->red_drawable->u.opaque;
+ SpiceImage img1, img2, img3;
+ image_cache_localize_brush(&display->priv->image_cache, &opaque.brush, &img1);
+ image_cache_localize(&display->priv->image_cache, &opaque.src_bitmap, &img2, drawable);
+ image_cache_localize_mask(&display->priv->image_cache, &opaque.mask, &img3);
+ canvas->ops->draw_opaque(canvas, &drawable->red_drawable->bbox, &clip, &opaque);
+ break;
+ }
+ case QXL_DRAW_COPY: {
+ SpiceCopy copy = drawable->red_drawable->u.copy;
+ SpiceImage img1, img2;
+ image_cache_localize(&display->priv->image_cache, &copy.src_bitmap, &img1, drawable);
+ image_cache_localize_mask(&display->priv->image_cache, &copy.mask, &img2);
+ canvas->ops->draw_copy(canvas, &drawable->red_drawable->bbox,
+ &clip, &copy);
+ break;
+ }
+ case QXL_DRAW_TRANSPARENT: {
+ SpiceTransparent transparent = drawable->red_drawable->u.transparent;
+ SpiceImage img1;
+ image_cache_localize(&display->priv->image_cache, &transparent.src_bitmap, &img1, drawable);
+ canvas->ops->draw_transparent(canvas,
+ &drawable->red_drawable->bbox, &clip, &transparent);
+ break;
+ }
+ case QXL_DRAW_ALPHA_BLEND: {
+ SpiceAlphaBlend alpha_blend = drawable->red_drawable->u.alpha_blend;
+ SpiceImage img1;
+ image_cache_localize(&display->priv->image_cache, &alpha_blend.src_bitmap, &img1, drawable);
+ canvas->ops->draw_alpha_blend(canvas,
+ &drawable->red_drawable->bbox, &clip, &alpha_blend);
+ break;
+ }
+ case QXL_COPY_BITS: {
+ canvas->ops->copy_bits(canvas, &drawable->red_drawable->bbox,
+ &clip, &drawable->red_drawable->u.copy_bits.src_pos);
+ break;
+ }
+ case QXL_DRAW_BLEND: {
+ SpiceBlend blend = drawable->red_drawable->u.blend;
+ SpiceImage img1, img2;
+ image_cache_localize(&display->priv->image_cache, &blend.src_bitmap, &img1, drawable);
+ image_cache_localize_mask(&display->priv->image_cache, &blend.mask, &img2);
+ canvas->ops->draw_blend(canvas, &drawable->red_drawable->bbox,
+ &clip, &blend);
+ break;
+ }
+ case QXL_DRAW_BLACKNESS: {
+ SpiceBlackness blackness = drawable->red_drawable->u.blackness;
+ SpiceImage img1;
+ image_cache_localize_mask(&display->priv->image_cache, &blackness.mask, &img1);
+ canvas->ops->draw_blackness(canvas,
+ &drawable->red_drawable->bbox, &clip, &blackness);
+ break;
+ }
+ case QXL_DRAW_WHITENESS: {
+ SpiceWhiteness whiteness = drawable->red_drawable->u.whiteness;
+ SpiceImage img1;
+ image_cache_localize_mask(&display->priv->image_cache, &whiteness.mask, &img1);
+ canvas->ops->draw_whiteness(canvas,
+ &drawable->red_drawable->bbox, &clip, &whiteness);
+ break;
+ }
+ case QXL_DRAW_INVERS: {
+ SpiceInvers invers = drawable->red_drawable->u.invers;
+ SpiceImage img1;
+ image_cache_localize_mask(&display->priv->image_cache, &invers.mask, &img1);
+ canvas->ops->draw_invers(canvas,
+ &drawable->red_drawable->bbox, &clip, &invers);
+ break;
+ }
+ case QXL_DRAW_ROP3: {
+ SpiceRop3 rop3 = drawable->red_drawable->u.rop3;
+ SpiceImage img1, img2, img3;
+ image_cache_localize_brush(&display->priv->image_cache, &rop3.brush, &img1);
+ image_cache_localize(&display->priv->image_cache, &rop3.src_bitmap, &img2, drawable);
+ image_cache_localize_mask(&display->priv->image_cache, &rop3.mask, &img3);
+ canvas->ops->draw_rop3(canvas, &drawable->red_drawable->bbox,
+ &clip, &rop3);
+ break;
+ }
+ case QXL_DRAW_COMPOSITE: {
+ SpiceComposite composite = drawable->red_drawable->u.composite;
+ SpiceImage src, mask;
+ image_cache_localize(&display->priv->image_cache, &composite.src_bitmap, &src, drawable);
+ if (composite.mask_bitmap)
+ image_cache_localize(&display->priv->image_cache, &composite.mask_bitmap, &mask, drawable);
+ canvas->ops->draw_composite(canvas, &drawable->red_drawable->bbox,
+ &clip, &composite);
+ break;
+ }
+ case QXL_DRAW_STROKE: {
+ SpiceStroke stroke = drawable->red_drawable->u.stroke;
+ SpiceImage img1;
+ image_cache_localize_brush(&display->priv->image_cache, &stroke.brush, &img1);
+ canvas->ops->draw_stroke(canvas,
+ &drawable->red_drawable->bbox, &clip, &stroke);
+ break;
+ }
+ case QXL_DRAW_TEXT: {
+ SpiceText text = drawable->red_drawable->u.text;
+ SpiceImage img1, img2;
+ image_cache_localize_brush(&display->priv->image_cache, &text.fore_brush, &img1);
+ image_cache_localize_brush(&display->priv->image_cache, &text.back_brush, &img2);
+ canvas->ops->draw_text(canvas, &drawable->red_drawable->bbox,
+ &clip, &text);
+ break;
+ }
+ default:
+ spice_warning("invalid type");
+ }
+}
+
+static void surface_update_dest(RedSurface *surface, const SpiceRect *area)
+{
+ SpiceCanvas *canvas = surface->context.canvas;
+ int stride = surface->context.stride;
+ auto line_0 = static_cast<uint8_t *>(surface->context.line_0);
+
+ if (surface->context.canvas_draws_on_surface)
+ return;
+
+ int h = area->bottom - area->top;
+ if (h == 0)
+ return;
+
+ spice_return_if_fail(stride < 0);
+
+ uint8_t *dest = line_0 + (area->top * stride) + area->left * sizeof(uint32_t);
+ dest += (h - 1) * stride;
+ canvas->ops->read_bits(canvas, dest, -stride, area);
+}
+
+/* Draws all drawables associated with @surface, starting from the tail of the
+ * ring, and stopping after it draws @last */
+static void draw_until(DisplayChannel *display, RedSurface *surface, Drawable *last)
+{
+ RingItem *ring_item;
+ Container *container;
+ Drawable *now;
+
+ do {
+ ring_item = ring_get_tail(&surface->current_list);
+ now = SPICE_CONTAINEROF(ring_item, Drawable, surface_list_link);
+ now->refs++;
+ container = now->tree_item.base.container;
+ current_remove_drawable(display, now);
+ container_cleanup(container);
+ /* drawable_draw may call display_channel_draw for the surfaces 'now' depends on. Notice,
+ that it is valid to call display_channel_draw in this case and not display_channel_draw_till:
+ It is impossible that there was newer item then 'last' in one of the surfaces
+ that display_channel_draw is called for, Otherwise, 'now' would have already been rendered.
+ See the call for red_handle_depends_on_target_surface in red_process_draw */
+ drawable_draw(display, now);
+ drawable_unref(now);
+ } while (now != last);
+}
+
+/* Find the first Drawable in the @current ring that intersects the given
+ * @area, starting at item @from (or the head of the ring if @from is NULL).
+ *
+ * NOTE: this function expects @current to be a ring of Drawables, and more
+ * specifically an instance of Surface::current_list (not Surface::current) */
+static Drawable* current_find_intersects_rect(Ring *current, RingItem *from,
+ const SpiceRect *area)
+{
+ RingItem *it;
+ QRegion rgn;
+ Drawable *last = nullptr;
+
+ region_init(&rgn);
+ region_add(&rgn, area);
+
+ for (it = from ? from : ring_next(current, current); it != nullptr; it = ring_next(current, it)) {
+ Drawable *now = SPICE_CONTAINEROF(it, Drawable, surface_list_link);
+ if (region_intersects(&rgn, &now->tree_item.base.rgn)) {
+ last = now;
+ break;
+ }
+ }
+
+ region_destroy(&rgn);
+ return last;
+}
+
+/*
+ * Renders drawables for updating the requested area, but only drawables that are older
+ * than 'last' (exclusive).
+ * FIXME: merge with display_channel_draw()?
+ */
+void display_channel_draw_until(DisplayChannel *display, const SpiceRect *area, RedSurface *surface,
+ Drawable *last)
+{
+ Drawable *surface_last = nullptr;
+ Ring *ring;
+ RingItem *ring_item;
+ Drawable *now;
+
+ spice_return_if_fail(last);
+ spice_return_if_fail(ring_item_is_linked(&last->list_link));
+
+ if (surface != last->surface) {
+ // find the nearest older drawable from the appropriate surface
+ ring = &display->priv->current_list;
+ ring_item = &last->list_link;
+ while ((ring_item = ring_next(ring, ring_item))) {
+ now = SPICE_CONTAINEROF(ring_item, Drawable, list_link);
+ if (now->surface == surface) {
+ surface_last = now;
+ break;
+ }
+ }
+ } else {
+ ring_item = ring_next(&surface->current_list, &last->surface_list_link);
+ if (ring_item) {
+ surface_last = SPICE_CONTAINEROF(ring_item, Drawable, surface_list_link);
+ }
+ }
+
+ if (!surface_last)
+ return;
+
+ last = current_find_intersects_rect(&surface->current_list,
+ &surface_last->surface_list_link, area);
+ if (!last)
+ return;
+
+ draw_until(display, surface, last);
+ surface_update_dest(surface, area);
+}
+
+void display_channel_draw(DisplayChannel *display, const SpiceRect *area, int surface_id)
+{
+ RedSurface *surface;
+
+ spice_return_if_fail(surface_id >= 0 && surface_id < display->priv->surfaces.size());
+ spice_return_if_fail(area);
+ spice_return_if_fail(area->left >= 0 && area->top >= 0 &&
+ area->left < area->right && area->top < area->bottom);
+
+ surface = display->priv->surfaces[surface_id];
+
+ display_channel_surface_draw(display, surface, area);
+}
+
+static void display_channel_surface_draw(DisplayChannel *display, RedSurface *surface,
+ const SpiceRect *area)
+{
+ Drawable *last;
+
+ last = current_find_intersects_rect(&surface->current_list, nullptr, area);
+ if (last)
+ draw_until(display, surface, last);
+
+ surface_update_dest(surface, area);
+}
+
+static void region_to_qxlrects(QRegion *region, QXLRect *qxl_rects, uint32_t num_rects)
+{
+ SpiceRect *rects;
+ int i;
+
+ rects = g_new0(SpiceRect, num_rects);
+ region_ret_rects(region, rects, num_rects);
+ for (i = 0; i < num_rects; i++) {
+ qxl_rects[i].top = rects[i].top;
+ qxl_rects[i].left = rects[i].left;
+ qxl_rects[i].bottom = rects[i].bottom;
+ qxl_rects[i].right = rects[i].right;
+ }
+ g_free(rects);
+}
+
+void display_channel_update(DisplayChannel *display,
+ uint32_t surface_id, const QXLRect *area, uint32_t clear_dirty,
+ QXLRect **qxl_dirty_rects, uint32_t *num_dirty_rects)
+{
+ SpiceRect rect;
+
+ // Check that the request is valid, the surface_id comes directly from the guest
+ RedSurface *surface = display_channel_validate_surface(display, surface_id);
+ if (!surface) {
+ // just return, display_channel_validate_surface already logged a warning
+ return;
+ }
+
+ red_get_rect_ptr(&rect, area);
+ display_channel_surface_draw(display, surface, &rect);
+
+ if (*qxl_dirty_rects == nullptr) {
+ *num_dirty_rects = pixman_region32_n_rects(&surface->draw_dirty_region);
+ *qxl_dirty_rects = g_new0(QXLRect, *num_dirty_rects);
+ }
+
+ region_to_qxlrects(&surface->draw_dirty_region, *qxl_dirty_rects, *num_dirty_rects);
+ if (clear_dirty)
+ region_clear(&surface->draw_dirty_region);
+}
+
+static void clear_surface_drawables_from_pipes(DisplayChannel *display, RedSurface *surface,
+ int wait_if_used)
+{
+ DisplayChannelClient *dcc;
+
+ FOREACH_DCC(display, dcc) {
+ if (!dcc_clear_surface_drawables_from_pipe(dcc, surface, wait_if_used)) {
+ dcc->disconnect();
+ }
+ }
+}
+
+/* TODO: cleanup/refactor destroy functions */
+static void display_channel_destroy_surface(DisplayChannel *display, RedSurface *surface)
+{
+ draw_depend_on_me(display, surface);
+ /* note that draw_depend_on_me must be called before current_remove_all.
+ otherwise "current" will hold items that other drawables may depend on, and then
+ current_remove_all will remove them from the pipe. */
+ current_remove_all(display, surface);
+ clear_surface_drawables_from_pipes(display, surface, false);
+ display_channel_surface_unref(display, surface);
+}
+
+void display_channel_destroy_surface_wait(DisplayChannel *display, uint32_t surface_id)
+{
+ RedSurface *surface = display_channel_validate_surface(display, surface_id);
+ if (!surface) {
+ return;
+ }
+
+ draw_depend_on_me(display, surface);
+ /* note that draw_depend_on_me must be called before current_remove_all.
+ otherwise "current" will hold items that other drawables may depend on, and then
+ current_remove_all will remove them from the pipe. */
+ current_remove_all(display, surface);
+ clear_surface_drawables_from_pipes(display, surface, true);
+}
+
+/* called upon device reset */
+/* TODO: split me*/
+void display_channel_destroy_surfaces(DisplayChannel *display)
+{
+ spice_debug("trace");
+ //to handle better
+ for (auto& surface : display->priv->surfaces) {
+ if (surface) {
+ display_channel_destroy_surface_wait(display, surface->id);
+ if (surface) {
+ display_channel_surface_unref(display, surface);
+ surface = nullptr;
+ }
+ }
+ }
+ spice_warn_if_fail(ring_is_empty(&display->priv->streams));
+
+ if (display->is_connected()) {
+ display->pipes_add_type(RED_PIPE_ITEM_TYPE_INVAL_PALETTE_CACHE);
+ display->pipes_add_empty_msg(SPICE_MSG_DISPLAY_STREAM_DESTROY_ALL);
+ }
+
+ display_channel_free_glz_drawables(display);
+}
+
+static void send_create_surface(DisplayChannel *display, RedSurface *surface, int image_ready)
+{
+ DisplayChannelClient *dcc;
+
+ FOREACH_DCC(display, dcc) {
+ dcc_create_surface(dcc, surface);
+ if (image_ready) {
+ dcc_push_surface_image(dcc, surface);
+ }
+ }
+}
+
+static SpiceCanvas*
+create_canvas_for_surface(DisplayChannel *display, RedSurface *surface, uint32_t renderer)
+{
+ SpiceCanvas *canvas;
+
+ switch (renderer) {
+ case RED_RENDERER_SW:
+ canvas = canvas_create_for_data(surface->context.width, surface->context.height,
+ surface->context.format,
+ static_cast<uint8_t *>(surface->context.line_0),
+ surface->context.stride, &display->priv->image_cache.base,
+ &display->priv->image_surfaces, nullptr, nullptr, nullptr);
+ surface->context.top_down = TRUE;
+ surface->context.canvas_draws_on_surface = TRUE;
+ return canvas;
+ default:
+ spice_warn_if_reached();
+ };
+
+ return nullptr;
+}
+
+RedSurface*
+display_channel_create_surface(DisplayChannel *display, uint32_t surface_id, uint32_t width,
+ uint32_t height, int32_t stride, uint32_t format,
+ void *line_0, int data_is_valid, int send_client)
+{
+ RedSurface *surface = new RedSurface;
+
+ spice_warn_if_fail(!display->priv->surfaces[surface_id]);
+
+ surface->context.canvas_draws_on_surface = FALSE;
+ surface->context.width = width;
+ surface->context.height = height;
+ surface->context.format = format;
+ surface->context.stride = stride;
+ surface->context.line_0 = line_0;
+ if (!data_is_valid) {
+ auto data = static_cast<char *>(line_0);
+ if (stride < 0) {
+ data -= abs(stride) * (height - 1);
+ }
+ memset(data, 0, height*abs(stride));
+ }
+ g_warn_if_fail(!surface->create_cmd);
+ g_warn_if_fail(!surface->destroy_cmd);
+ surface->refs = 1;
+ surface->id = surface_id;
+
+ if (display->priv->renderer == RED_RENDERER_INVALID) {
+ int i;
+ RedsState *reds = display->get_server();
+ GArray *renderers = reds_get_renderers(reds);
+ for (i = 0; i < renderers->len; i++) {
+ uint32_t renderer = g_array_index(renderers, uint32_t, i);
+ surface->context.canvas = create_canvas_for_surface(display, surface, renderer);
+ if (surface->context.canvas) {
+ display->priv->renderer = renderer;
+ break;
+ }
+ }
+ } else {
+ surface->context.canvas = create_canvas_for_surface(display, surface, display->priv->renderer);
+ }
+
+ if (!surface->context.canvas) {
+ delete surface;
+ return nullptr;
+ }
+
+ // finish initialization
+ ring_init(&surface->current);
+ ring_init(&surface->current_list);
+ ring_init(&surface->depend_on_me);
+ region_init(&surface->draw_dirty_region);
+
+ if (display->priv->surfaces[surface_id]) {
+ display_channel_surface_unref(display, display->priv->surfaces[surface_id]);
+ }
+ display->priv->surfaces[surface_id] = surface;
+
+ if (send_client) {
+ send_create_surface(display, surface, data_is_valid);
+ }
+ return surface;
+}
+
+void DisplayChannelClient::handle_migrate_flush_mark()
+{
+ RedChannel *channel = get_channel();
+
+ channel->pipes_add_type(RED_PIPE_ITEM_TYPE_MIGRATE_DATA);
+}
+
+bool DisplayChannelClient::handle_migrate_data_get_serial(uint32_t size, void *message,
+ uint64_t &serial)
+{
+ SpiceMigrateDataDisplay *migrate_data;
+
+ migrate_data = reinterpret_cast<SpiceMigrateDataDisplay *>(static_cast<uint8_t *>(message) +
+ sizeof(SpiceMigrateDataHeader));
+
+ serial = migrate_data->message_serial;
+ return true;
+}
+
+static SpiceCanvas *image_surfaces_get(SpiceImageSurfaces *surfaces, uint32_t surface_id)
+{
+ DisplayChannelPrivate *p = SPICE_CONTAINEROF(surfaces, DisplayChannelPrivate, image_surfaces);
+ DisplayChannel *display = p->pub;
+
+ auto surface = display_channel_validate_surface(display, surface_id);
+
+ return surface ? surface->context.canvas : nullptr;
+}
+
+red::shared_ptr<DisplayChannel>
+display_channel_new(RedsState *reds, QXLInstance *qxl,
+ SpiceCoreInterfaceInternal *core, Dispatcher *dispatcher,
+ int migrate, int stream_video,
+ GArray *video_codecs,
+ uint32_t n_surfaces)
+{
+ /* FIXME: migrate is not used...? */
+ spice_debug("create display channel");
+ auto display =
+ red::make_shared<DisplayChannel>(reds, qxl, core, dispatcher, migrate, stream_video,
+ video_codecs, n_surfaces);
+ if (display) {
+ display_channel_set_stream_video(display.get(), stream_video);
+ }
+ return display;
+}
+
+DisplayChannel::DisplayChannel(RedsState *reds,
+ QXLInstance *qxl,
+ SpiceCoreInterfaceInternal *core,
+ Dispatcher *dispatcher,
+ int migrate, int stream_video,
+ GArray *video_codecs,
+ uint32_t n_surfaces):
+ CommonGraphicsChannel(reds, SPICE_CHANNEL_DISPLAY, qxl->id,
+ RedChannel::MigrateAll|RedChannel::HandleAcks, core, dispatcher)
+{
+ static const SpiceImageSurfacesOps image_surfaces_ops = {
+ image_surfaces_get,
+ };
+
+ priv->n_surfaces = MIN(n_surfaces, priv->surfaces.size());
+ priv->qxl = qxl;
+
+ /* must be manually allocated here since g_type_class_add_private() only
+ * supports structs smaller than 64k */
+ priv->image_compression = SPICE_IMAGE_COMPRESSION_AUTO_GLZ;
+ priv->pub = this;
+ priv->renderer = RED_RENDERER_INVALID;
+ priv->stream_video = SPICE_STREAM_VIDEO_OFF;
+
+ image_encoder_shared_init(&priv->encoder_shared_data);
+
+ ring_init(&priv->current_list);
+ drawables_init(this);
+ priv->image_surfaces.ops = &image_surfaces_ops;
+
+ image_cache_init(&priv->image_cache);
+ display_channel_init_video_streams(this);
+
+ display_channel_set_video_codecs(this, video_codecs);
+
+ spice_assert(priv->video_codecs);
+
+ stat_init(&priv->add_stat, "add", CLOCK_THREAD_CPUTIME_ID);
+ stat_init(&priv->exclude_stat, "exclude", CLOCK_THREAD_CPUTIME_ID);
+ stat_init(&priv->__exclude_stat, "__exclude", CLOCK_THREAD_CPUTIME_ID);
+ const RedStatNode *stat = get_stat_node();
+ stat_init_counter(&priv->cache_hits_counter, reds, stat,
+ "cache_hits", TRUE);
+ stat_init_counter(&priv->add_to_cache_counter, reds, stat,
+ "add_to_cache", TRUE);
+ stat_init_counter(&priv->non_cache_counter, reds, stat,
+ "non_cache", TRUE);
+
+ set_cap(SPICE_DISPLAY_CAP_MONITORS_CONFIG);
+ set_cap(SPICE_DISPLAY_CAP_PREF_COMPRESSION);
+ set_cap(SPICE_DISPLAY_CAP_PREF_VIDEO_CODEC_TYPE);
+ set_cap(SPICE_DISPLAY_CAP_STREAM_REPORT);
+
+ reds_register_channel(reds, this);
+}
+
+void display_channel_process_surface_cmd(DisplayChannel *display,
+ red::shared_ptr<const RedSurfaceCmd> &&surface_cmd,
+ bool loadvm)
+{
+ uint32_t surface_id;
+ RedSurface *surface;
+ uint8_t *data;
+
+ surface_id = surface_cmd->surface_id;
+ if SPICE_UNLIKELY(surface_id >= display->priv->n_surfaces) {
+ return;
+ }
+
+ surface = display->priv->surfaces[surface_id];
+
+ switch (surface_cmd->type) {
+ case QXL_SURFACE_CMD_CREATE: {
+ const RedSurfaceCreate *create = &surface_cmd->u.surface_create;
+ uint32_t height = create->height;
+ int32_t stride = create->stride;
+ int reloaded_surface = loadvm || (surface_cmd->flags & QXL_SURF_FLAG_KEEP_DATA);
+
+ if (surface) {
+ spice_warning("avoiding creating a surface twice");
+ break;
+ }
+ data = create->data;
+ if (stride < 0) {
+ /* No need to worry about overflow here, command should already be validated
+ * when it is read, specifically red_get_surface_cmd */
+ data -= static_cast<int32_t>(stride * (height - 1));
+ }
+ surface = display_channel_create_surface(display, surface_id, create->width,
+ height, stride, create->format, data,
+ reloaded_surface,
+ // reloaded surfaces will be sent on demand
+ !reloaded_surface);
+ if (surface) {
+ surface->create_cmd = surface_cmd;
+ }
+ break;
+ }
+ case QXL_SURFACE_CMD_DESTROY:
+ if (!surface) {
+ spice_warning("avoiding destroying a surface twice");
+ break;
+ }
+ surface->destroy_cmd = surface_cmd;
+ display_channel_destroy_surface(display, surface);
+ display->priv->surfaces[surface_id] = nullptr;
+ break;
+ default:
+ spice_warn_if_reached();
+ };
+}
+
+static void display_channel_update_compression(DisplayChannel *display, DisplayChannelClient *dcc)
+{
+ if (dcc_get_jpeg_state(dcc) == SPICE_WAN_COMPRESSION_AUTO) {
+ display->priv->enable_jpeg = dcc_is_low_bandwidth(dcc);
+ } else {
+ display->priv->enable_jpeg = (dcc_get_jpeg_state(dcc) == SPICE_WAN_COMPRESSION_ALWAYS);
+ }
+
+ if (dcc_get_zlib_glz_state(dcc) == SPICE_WAN_COMPRESSION_AUTO) {
+ display->priv->enable_zlib_glz_wrap = dcc_is_low_bandwidth(dcc);
+ } else {
+ display->priv->enable_zlib_glz_wrap = (dcc_get_zlib_glz_state(dcc) == SPICE_WAN_COMPRESSION_ALWAYS);
+ }
+ spice_debug("jpeg %s", display->priv->enable_jpeg ? "enabled" : "disabled");
+ spice_debug("zlib-over-glz %s", display->priv->enable_zlib_glz_wrap ? "enabled" : "disabled");
+}
+
+void display_channel_gl_scanout(DisplayChannel *display)
+{
+ display->pipes_new_add(dcc_gl_scanout_item_new, nullptr);
+}
+
+static void set_gl_draw_async_count(DisplayChannel *display, int num)
+{
+ display->priv->gl_draw_async_count = num;
+
+ if (num == 0) {
+ red_qxl_gl_draw_async_complete(display->priv->qxl);
+ }
+}
+
+void display_channel_gl_draw(DisplayChannel *display, SpiceMsgDisplayGlDraw *draw)
+{
+ int num;
+
+ spice_return_if_fail(display->priv->gl_draw_async_count == 0);
+
+ num = display->pipes_new_add(dcc_gl_draw_item_new, draw);
+ set_gl_draw_async_count(display, num);
+}
+
+void display_channel_gl_draw_done(DisplayChannel *display)
+{
+ set_gl_draw_async_count(display, display->priv->gl_draw_async_count - 1);
+}
+
+int display_channel_get_video_stream_id(DisplayChannel *display, VideoStream *stream)
+{
+ return static_cast<int>(stream - display->priv->streams_buf.data());
+}
+
+VideoStream *display_channel_get_nth_video_stream(DisplayChannel *display, gint i)
+{
+ return &display->priv->streams_buf[i];
+}
+
+RedSurface *display_channel_validate_surface(DisplayChannel *display, uint32_t surface_id)
+{
+ if SPICE_UNLIKELY(surface_id >= display->priv->n_surfaces) {
+ spice_warning("invalid surface_id %u", surface_id);
+ return nullptr;
+ }
+
+ RedSurface *surface = display->priv->surfaces[surface_id];
+ if (!surface) {
+ spice_warning("surface %d is NULL", surface_id);
+ return nullptr;
+ }
+ return surface;
+}
+
+void display_channel_push_monitors_config(DisplayChannel *display)
+{
+ DisplayChannelClient *dcc;
+
+ FOREACH_DCC(display, dcc) {
+ dcc_push_monitors_config(dcc);
+ }
+}
+
+void display_channel_update_monitors_config(DisplayChannel *display,
+ const QXLMonitorsConfig *config,
+ uint16_t count, uint16_t max_allowed)
+{
+
+ if (display->priv->monitors_config)
+ monitors_config_unref(display->priv->monitors_config);
+
+ display->priv->monitors_config =
+ monitors_config_new(config->heads, count, max_allowed);
+
+ display_channel_push_monitors_config(display);
+}
+
+void display_channel_set_monitors_config_to_primary(DisplayChannel *display)
+{
+ RedSurface *surface = display_channel_validate_surface(display, 0);
+
+ spice_return_if_fail(surface);
+
+ DrawContext *context = &surface->context;
+ uint16_t old_max = 1;
+
+ if (display->priv->monitors_config) {
+ old_max = display->priv->monitors_config->max_allowed;
+ monitors_config_unref(display->priv->monitors_config);
+ }
+
+ QXLHead head = { 0, };
+ head.width = context->width;
+ head.height = context->height;
+ display->priv->monitors_config = monitors_config_new(&head, 1, old_max);
+}
+
+void display_channel_reset_image_cache(DisplayChannel *self)
+{
+ image_cache_reset(&self->priv->image_cache);
+}
+
+void display_channel_debug_oom(DisplayChannel *display, const char *msg)
+{
+ spice_debug("%s #draw=%u, #glz_draw=%u current %u pipes %u",
+ msg,
+ display->priv->drawable_count,
+ display->priv->encoder_shared_data.glz_drawable_count,
+ ring_get_length(&display->priv->current_list),
+ display->sum_pipes_size());
+}
+
+static void guest_set_client_capabilities(DisplayChannel *display)
+{
+ RedChannelClient *rcc;
+ uint8_t caps[SPICE_CAPABILITIES_SIZE] = { 0 };
+ const int caps_available[] = {
+ SPICE_DISPLAY_CAP_SIZED_STREAM,
+ SPICE_DISPLAY_CAP_MONITORS_CONFIG,
+ SPICE_DISPLAY_CAP_COMPOSITE,
+ SPICE_DISPLAY_CAP_A8_SURFACE,
+ };
+ QXLInterface *qif = qxl_get_interface(display->priv->qxl);
+
+ if (!red_qxl_check_qxl_version(display->priv->qxl, 3, 2)) {
+ return;
+ }
+ if (!qif->set_client_capabilities) {
+ return;
+ }
+#define SET_CAP(a,c) \
+ ((a)[(c) / 8] |= (1 << ((c) % 8)))
+
+#define CLEAR_CAP(a,c) \
+ ((a)[(c) / 8] &= ~(1 << ((c) % 8)))
+
+ if ((display->get_n_clients() == 0)) {
+ red_qxl_set_client_capabilities(display->priv->qxl, FALSE, caps);
+ } else {
+ // Take least common denominator
+ for (const auto cap : caps_available) {
+ SET_CAP(caps, cap);
+ }
+ FOREACH_CLIENT(display, rcc) {
+ for (const auto cap : caps_available) {
+ if (!rcc->test_remote_cap(cap)) {
+ CLEAR_CAP(caps, cap);
+ }
+ }
+ }
+ red_qxl_set_client_capabilities(display->priv->qxl, TRUE, caps);
+ }
+}
+
+void display_channel_update_qxl_running(DisplayChannel *display, bool running)
+{
+ if (running) {
+ guest_set_client_capabilities(display);
+ }
+}
+
+void DisplayChannel::on_connect(RedClient *client,
+ RedStream *stream, int migration,
+ RedChannelCapabilities *caps)
+{
+ DisplayChannelClient *dcc;
+
+ spice_debug("connect new client");
+
+ SpiceServer *reds = get_server();
+ dcc = dcc_new(this, client, stream, migration, caps,
+ priv->image_compression, reds_get_jpeg_state(reds),
+ reds_get_zlib_glz_state(reds));
+ if (!dcc) {
+ return;
+ }
+ display_channel_update_compression(this, dcc);
+ guest_set_client_capabilities(this);
+ dcc_start(dcc);
+}
+
+void DisplayChannelClient::disconnect()
+{
+ DisplayChannel *display = DCC_TO_DC(this);
+
+ guest_set_client_capabilities(display);
+
+ RedChannelClient::disconnect();
+}
+
+void DisplayChannelClient::migrate()
+{
+ DisplayChannel *display = DCC_TO_DC(this);
+
+ /* We need to stop the streams, and to send upgrade_items to the client.
+ * Otherwise, (1) the client might display lossy regions that we don't track
+ * (streams are not part of the migration data) (2) streams_timeout may occur
+ * after the MIGRATE message has been sent. This can result in messages
+ * being sent to the client after MSG_MIGRATE and before MSG_MIGRATE_DATA (e.g.,
+ * STREAM_CLIP, STREAM_DESTROY, DRAW_COPY)
+ * No message besides MSG_MIGRATE_DATA should be sent after MSG_MIGRATE.
+ * Notice that detach_and_stop_streams won't lead to any dev ram changes, since
+ * handle_dev_stop already took care of releasing all the dev ram resources.
+ */
+ video_stream_detach_and_stop(display);
+ if (is_connected()) {
+ RedChannelClient::migrate();
+ }
+}
+
+void display_channel_set_image_compression(DisplayChannel *display,
+ SpiceImageCompression image_compression)
+{
+ display->priv->image_compression = image_compression;
+}
diff --git a/server/display-channel.h b/server/display-channel.h
new file mode 100644
index 00000000..c54df25c
--- /dev/null
+++ b/server/display-channel.h
@@ -0,0 +1,153 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef DISPLAY_CHANNEL_H_
+# define DISPLAY_CHANNEL_H_
+
+#include <setjmp.h>
+#include <common/rect.h>
+
+#include "reds.h"
+#include "red-parse-qxl.h"
+#include "red-channel.h"
+#include "main-channel.h"
+#include "spice-bitmap-utils.h"
+#include "tree.h"
+#include "video-stream.h"
+#include "dcc.h"
+#include "image-encoders.h"
+#include "common-graphics-channel.h"
+#include "utils.hpp"
+
+#include "push-visibility.h"
+
+struct DisplayChannelPrivate;
+struct RedSurface;
+
+struct DisplayChannel final: public CommonGraphicsChannel
+{
+ DisplayChannel(RedsState *reds,
+ QXLInstance *qxl,
+ SpiceCoreInterfaceInternal *core,
+ Dispatcher *dispatcher,
+ int migrate, int stream_video,
+ GArray *video_codecs,
+ uint32_t n_surfaces);
+ ~DisplayChannel();
+ void on_connect(RedClient *client, RedStream *stream, int migration,
+ RedChannelCapabilities *caps) override;
+ red::unique_link<DisplayChannelPrivate> priv;
+};
+
+struct DependItem {
+ Drawable *drawable;
+ RingItem ring_item;
+};
+
+struct Drawable {
+ uint32_t refs;
+ RingItem surface_list_link;
+ RingItem list_link;
+ DrawItem tree_item;
+ GList *pipes;
+ red::shared_ptr<RedDrawable> red_drawable;
+
+ GlzImageRetention glz_retention;
+
+ red_time_t creation_time;
+ red_time_t first_frame_time;
+ int frames_count;
+ int gradual_frames_count;
+ int last_gradual_frame;
+ VideoStream *stream;
+ int streamable;
+ BitmapGradualType copy_bitmap_graduality;
+ std::array<DependItem, 3> depend_items;
+
+ /* destination surface. This pointer is not NULL. A reference is hold */
+ RedSurface *surface;
+ /* dependency surfaces. They can be NULL. A reference is hold. */
+ std::array<RedSurface *, 3> surface_deps;
+
+ uint32_t process_commands_generation;
+ DisplayChannel *display;
+};
+
+red::shared_ptr<DisplayChannel>
+display_channel_new(RedsState *reds, QXLInstance *qxl,
+ SpiceCoreInterfaceInternal *core, Dispatcher *dispatcher,
+ int migrate, int stream_video,
+ GArray *video_codecs,
+ uint32_t n_surfaces);
+void display_channel_surface_id_unref(DisplayChannel *display, uint32_t surface_id);
+RedSurface *display_channel_create_surface(DisplayChannel *display, uint32_t surface_id,
+ uint32_t width, uint32_t height,
+ int32_t stride, uint32_t format, void *line_0,
+ int data_is_valid, int send_client);
+void display_channel_draw (DisplayChannel *display,
+ const SpiceRect *area,
+ int surface_id);
+void display_channel_update (DisplayChannel *display,
+ uint32_t surface_id,
+ const QXLRect *area,
+ uint32_t clear_dirty,
+ QXLRect **qxl_dirty_rects,
+ uint32_t *num_dirty_rects);
+void display_channel_free_some (DisplayChannel *display);
+void display_channel_set_stream_video (DisplayChannel *display,
+ int stream_video);
+void display_channel_set_video_codecs (DisplayChannel *display,
+ GArray *video_codecs);
+int display_channel_get_streams_timeout (DisplayChannel *display);
+void display_channel_compress_stats_print (DisplayChannel *display);
+void display_channel_compress_stats_reset (DisplayChannel *display);
+bool display_channel_wait_for_migrate_data (DisplayChannel *display);
+void display_channel_flush_all_surfaces (DisplayChannel *display);
+void display_channel_free_glz_drawables_to_free(DisplayChannel *display);
+void display_channel_free_glz_drawables (DisplayChannel *display);
+void display_channel_destroy_surface_wait (DisplayChannel *display,
+ uint32_t surface_id);
+void display_channel_destroy_surfaces (DisplayChannel *display);
+void display_channel_gl_scanout (DisplayChannel *display);
+void display_channel_gl_draw (DisplayChannel *display,
+ SpiceMsgDisplayGlDraw *draw);
+void display_channel_gl_draw_done (DisplayChannel *display);
+
+void display_channel_process_draw(DisplayChannel *display,
+ red::shared_ptr<RedDrawable> &&red_drawable,
+ uint32_t process_commands_generation);
+void display_channel_process_surface_cmd(DisplayChannel *display,
+ red::shared_ptr<const RedSurfaceCmd> &&surface_cmd,
+ bool loadvm);
+void display_channel_update_monitors_config(DisplayChannel *display, const QXLMonitorsConfig *config,
+ uint16_t count, uint16_t max_allowed);
+void display_channel_set_monitors_config_to_primary(DisplayChannel *display);
+void display_channel_push_monitors_config(DisplayChannel *display);
+
+RedSurface *display_channel_validate_surface(DisplayChannel *display, uint32_t surface_id);
+void display_channel_reset_image_cache(DisplayChannel *self);
+
+void display_channel_debug_oom(DisplayChannel *display, const char *msg);
+
+void display_channel_update_qxl_running(DisplayChannel *display, bool running);
+void display_channel_set_image_compression(DisplayChannel *display,
+ SpiceImageCompression image_compression);
+
+#include "pop-visibility.h"
+
+#endif /* DISPLAY_CHANNEL_H_ */
diff --git a/client/red_pixmap_gdi.h b/server/display-limits.h
index 828b76b9..d79d3211 100644
--- a/client/red_pixmap_gdi.h
+++ b/server/display-limits.h
@@ -1,6 +1,6 @@
/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
/*
- Copyright (C) 2009 Red Hat, Inc.
+ Copyright (C) 2009-2015 Red Hat, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@@ -16,20 +16,16 @@
License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef _H_RED_PIXMAP_GDI
-#define _H_RED_PIXMAP_GDI
+#ifndef DISPLAY_LIMITS_H_
+#define DISPLAY_LIMITS_H_
-#include "red_pixmap.h"
+/** Maximum number of surfaces a guest can create */
+#define NUM_SURFACES 1024
-class RecurciveMutex;
+/** Maximum number of streams created by spice-server */
+#define NUM_STREAMS 50
-class RedPixmapGdi: public RedPixmap {
-public:
- RedPixmapGdi(int width, int height, Format format, bool top_bottom);
- HDC get_dc();
- void *get_memptr();
- ~RedPixmapGdi();
- RecurciveMutex& get_mutex();
-};
+/** Maximum length of the device address string */
+#define MAX_DEVICE_ADDRESS_LEN 256
-#endif
+#endif /* DISPLAY_LIMITS_H_ */
diff --git a/server/event-loop.c b/server/event-loop.c
new file mode 100644
index 00000000..e5291b5a
--- /dev/null
+++ b/server/event-loop.c
@@ -0,0 +1,426 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+/*
+ * This file exports a global variable:
+ *
+ * const SpiceCoreInterfaceInternal event_loop_core;
+ */
+#include <config.h>
+
+#include "red-common.h"
+
+typedef struct SpiceCoreFuncs {
+ void (*timer_start)(SpiceTimer *timer, uint32_t ms);
+ void (*timer_cancel)(SpiceTimer *timer);
+ void (*timer_remove)(SpiceTimer *timer);
+ void (*watch_update_mask)(SpiceWatch *watch, int event_mask);
+ void (*watch_remove)(SpiceWatch *watch);
+} SpiceCoreFuncs;
+
+struct SpiceTimer {
+ const SpiceCoreFuncs *funcs;
+};
+
+struct SpiceWatch {
+ const SpiceCoreFuncs *funcs;
+};
+
+void red_timer_start(SpiceTimer *timer, uint32_t ms)
+{
+ if (timer) {
+ timer->funcs->timer_start(timer, ms);
+ }
+}
+
+void red_timer_cancel(SpiceTimer *timer)
+{
+ if (timer) {
+ timer->funcs->timer_cancel(timer);
+ }
+}
+
+void red_timer_remove(SpiceTimer *timer)
+{
+ if (timer) {
+ timer->funcs->timer_remove(timer);
+ }
+}
+
+void red_watch_update_mask(SpiceWatch *watch, int event_mask)
+{
+ if (watch) {
+ watch->funcs->watch_update_mask(watch, event_mask);
+ }
+}
+
+void red_watch_remove(SpiceWatch *watch)
+{
+ if (watch) {
+ watch->funcs->watch_remove(watch);
+ }
+}
+
+static const SpiceCoreFuncs glib_core_funcs;
+
+typedef struct SpiceTimerGlib {
+ SpiceTimer base;
+ GMainContext *context;
+ SpiceTimerFunc func;
+ void *opaque;
+ GSource *source;
+} SpiceTimerGlib;
+
+static SpiceTimer* timer_add(const SpiceCoreInterfaceInternal *iface,
+ SpiceTimerFunc func, void *opaque)
+{
+ SpiceTimerGlib *timer = g_new0(SpiceTimerGlib, 1);
+
+ timer->base.funcs = &glib_core_funcs;
+ timer->context = iface->main_context;
+ timer->func = func;
+ timer->opaque = opaque;
+
+ return &timer->base;
+}
+
+static gboolean timer_func(gpointer user_data)
+{
+ SpiceTimerGlib *timer = (SpiceTimerGlib*) user_data;
+
+ timer->func(timer->opaque);
+ /* timer might be free after func(), don't touch */
+
+ return FALSE;
+}
+
+static void timer_cancel(SpiceTimer *timer_base)
+{
+ SpiceTimerGlib *timer = SPICE_UPCAST(SpiceTimerGlib, timer_base);
+ if (timer->source) {
+ g_source_destroy(timer->source);
+ g_source_unref(timer->source);
+ timer->source = NULL;
+ }
+}
+
+static void timer_start(SpiceTimer *timer_base, uint32_t ms)
+{
+ timer_cancel(timer_base);
+
+ SpiceTimerGlib *timer = SPICE_UPCAST(SpiceTimerGlib, timer_base);
+
+ timer->source = g_timeout_source_new(ms);
+ spice_assert(timer->source != NULL);
+
+ g_source_set_callback(timer->source, timer_func, timer, NULL);
+
+ g_source_attach(timer->source, timer->context);
+}
+
+static void timer_remove(SpiceTimer *timer_base)
+{
+ timer_cancel(timer_base);
+
+ SpiceTimerGlib *timer = SPICE_UPCAST(SpiceTimerGlib, timer_base);
+ spice_assert(timer->source == NULL);
+ g_free(timer);
+}
+
+static GIOCondition spice_event_to_giocondition(int event_mask)
+{
+ int condition = 0;
+
+ if (event_mask & SPICE_WATCH_EVENT_READ)
+ condition |= G_IO_IN;
+ if (event_mask & SPICE_WATCH_EVENT_WRITE)
+ condition |= G_IO_OUT;
+
+ return (GIOCondition) condition;
+}
+
+static int giocondition_to_spice_event(GIOCondition condition)
+{
+ int event = 0;
+
+ if (condition & G_IO_IN)
+ event |= SPICE_WATCH_EVENT_READ;
+ if (condition & G_IO_OUT)
+ event |= SPICE_WATCH_EVENT_WRITE;
+
+ return event;
+}
+
+#ifdef _WIN32
+typedef struct SpiceWatchGlib {
+ SpiceWatch base;
+ GMainContext *context;
+ void *opaque;
+ GSource *source;
+ GIOChannel *channel;
+ SpiceWatchFunc func;
+} SpiceWatchGlib;
+
+static gboolean watch_func(GIOChannel *source, GIOCondition condition,
+ gpointer data)
+{
+ SpiceWatchGlib *watch = (SpiceWatchGlib*) data;
+ // this works also under Windows despite the name
+ int fd = g_io_channel_unix_get_fd(source);
+
+ watch->func(fd, giocondition_to_spice_event(condition), watch->opaque);
+
+ return TRUE;
+}
+
+static void watch_update_mask(SpiceWatch *watch_base, int event_mask)
+{
+ SpiceWatchGlib *watch = SPICE_UPCAST(SpiceWatchGlib, watch_base);
+ if (watch->source) {
+ g_source_destroy(watch->source);
+ g_source_unref(watch->source);
+ watch->source = NULL;
+ }
+
+ if (!event_mask)
+ return;
+
+ watch->source = g_io_create_watch(watch->channel, spice_event_to_giocondition(event_mask));
+ /* g_source_set_callback() documentation says:
+ * "The exact type of func depends on the type of source; ie. you should
+ * not count on func being called with data as its first parameter."
+ * In this case it is a GIOFunc. First cast to GIOFunc to make sure it is the right type.
+ * The other casts silence the warning from gcc */
+ g_source_set_callback(watch->source, (GSourceFunc)(void*)(GIOFunc)watch_func, watch, NULL);
+ g_source_attach(watch->source, watch->context);
+}
+
+static SpiceWatch *watch_add(const SpiceCoreInterfaceInternal *iface,
+ int fd, int event_mask, SpiceWatchFunc func, void *opaque)
+{
+ SpiceWatchGlib *watch;
+
+ spice_return_val_if_fail(fd != -1, NULL);
+ spice_return_val_if_fail(func != NULL, NULL);
+
+ watch = g_new0(SpiceWatchGlib, 1);
+ watch->base.funcs = &glib_core_funcs;
+ watch->context = iface->main_context;
+ watch->channel = g_io_channel_win32_new_socket(fd);
+ watch->func = func;
+ watch->opaque = opaque;
+
+ watch_update_mask(&watch->base, event_mask);
+
+ return &watch->base;
+}
+
+static void watch_remove(SpiceWatch *watch_base)
+{
+ SpiceWatchGlib *watch = SPICE_UPCAST(SpiceWatchGlib, watch_base);
+ watch_update_mask(watch_base, 0);
+ spice_assert(watch->source == NULL);
+
+ g_io_channel_unref(watch->channel);
+ g_free(watch);
+}
+
+#else
+
+typedef struct SpiceWatchGlib {
+ GSource source;
+ SpiceWatch spice_base;
+ gpointer unix_fd;
+ int fd;
+} SpiceWatchGlib;
+
+static gboolean
+spice_watch_check(GSource *source)
+{
+ SpiceWatchGlib *watch = SPICE_CONTAINEROF(source, SpiceWatchGlib, source);
+
+ return g_source_query_unix_fd(&watch->source, watch->unix_fd) != 0;
+}
+
+static gboolean
+spice_watch_dispatch(GSource *source,
+ GSourceFunc callback,
+ gpointer user_data)
+{
+ SpiceWatchGlib *watch = SPICE_CONTAINEROF(source, SpiceWatchGlib, source);
+ SpiceWatchFunc func = (SpiceWatchFunc)(void*) callback;
+ GIOCondition condition = g_source_query_unix_fd(&watch->source, watch->unix_fd);
+
+ func(watch->fd, giocondition_to_spice_event(condition), user_data);
+ /* timer might be free after func(), don't touch */
+
+ return G_SOURCE_CONTINUE;
+}
+
+static GSourceFuncs spice_watch_funcs = {
+ .check = spice_watch_check,
+ .dispatch = spice_watch_dispatch,
+};
+
+static void watch_update_mask(SpiceWatch *watch_base, int event_mask)
+{
+ SpiceWatchGlib *watch = SPICE_CONTAINEROF(watch_base, SpiceWatchGlib, spice_base);
+ GIOCondition condition = spice_event_to_giocondition(event_mask);
+
+ g_source_modify_unix_fd(&watch->source, watch->unix_fd, condition);
+}
+
+static SpiceWatch *watch_add(const SpiceCoreInterfaceInternal *iface,
+ int fd, int event_mask, SpiceWatchFunc func, void *opaque)
+{
+ SPICE_VERIFY(SPICE_OFFSETOF(SpiceWatchGlib, source) == 0);
+ SpiceWatchGlib *watch =
+ (SpiceWatchGlib *) g_source_new(&spice_watch_funcs, sizeof(SpiceWatchGlib));
+
+ spice_return_val_if_fail(fd != -1, NULL);
+ spice_return_val_if_fail(func != NULL, NULL);
+
+ watch->spice_base.funcs = &glib_core_funcs;
+ watch->fd = fd;
+
+ g_source_set_callback(&watch->source, (GSourceFunc)(void*) func, opaque, NULL);
+
+ g_source_attach(&watch->source, iface->main_context);
+
+ GIOCondition condition = spice_event_to_giocondition(event_mask);
+ watch->unix_fd = g_source_add_unix_fd(&watch->source, watch->fd, condition);
+
+ return &watch->spice_base;
+}
+
+static void watch_remove(SpiceWatch *watch_base)
+{
+ SpiceWatchGlib *watch = SPICE_CONTAINEROF(watch_base, SpiceWatchGlib, spice_base);
+
+ g_source_remove_unix_fd(&watch->source, watch->unix_fd);
+ g_source_destroy(&watch->source);
+ g_source_unref(&watch->source);
+}
+#endif
+
+static const SpiceCoreFuncs glib_core_funcs = {
+ .timer_start = timer_start,
+ .timer_cancel = timer_cancel,
+ .timer_remove = timer_remove,
+
+ .watch_update_mask = watch_update_mask,
+ .watch_remove = watch_remove,
+};
+
+const SpiceCoreInterfaceInternal event_loop_core = {
+ .timer_add = timer_add,
+ .watch_add = watch_add,
+};
+
+/*
+ * Adapter for SpiceCodeInterface
+ */
+
+static const SpiceCoreFuncs qemu_core_funcs;
+
+typedef struct SpiceTimerQemu {
+ SpiceTimer base;
+ SpiceCoreInterface *core;
+ SpiceTimer *qemu_timer;
+} SpiceTimerQemu;
+
+static SpiceTimer *adapter_timer_add(const SpiceCoreInterfaceInternal *iface, SpiceTimerFunc func, void *opaque)
+{
+ SpiceTimerQemu *timer = g_new0(SpiceTimerQemu, 1);
+
+ timer->base.funcs = &qemu_core_funcs;
+ timer->core = iface->public_interface;
+ timer->qemu_timer = timer->core->timer_add(func, opaque);
+ return &timer->base;
+}
+
+static void adapter_timer_start(SpiceTimer *timer_, uint32_t ms)
+{
+ SpiceTimerQemu *timer = SPICE_UPCAST(SpiceTimerQemu, timer_);
+ timer->core->timer_start(timer->qemu_timer, ms);
+}
+
+static void adapter_timer_cancel(SpiceTimer *timer_)
+{
+ SpiceTimerQemu *timer = SPICE_UPCAST(SpiceTimerQemu, timer_);
+ timer->core->timer_cancel(timer->qemu_timer);
+}
+
+static void adapter_timer_remove(SpiceTimer *timer_)
+{
+ SpiceTimerQemu *timer = SPICE_UPCAST(SpiceTimerQemu, timer_);
+ timer->core->timer_remove(timer->qemu_timer);
+ g_free(timer);
+}
+
+typedef struct SpiceWatchQemu {
+ SpiceWatch base;
+ SpiceCoreInterface *core;
+ SpiceWatch *qemu_watch;
+} SpiceWatchQemu;
+
+static SpiceWatch *adapter_watch_add(const SpiceCoreInterfaceInternal *iface,
+ int fd, int event_mask, SpiceWatchFunc func, void *opaque)
+{
+ // note: Qemu API is fine having a SOCKET on Windows
+ SpiceWatchQemu *watch = g_new0(SpiceWatchQemu, 1);
+
+ watch->base.funcs = &qemu_core_funcs;
+ watch->core = iface->public_interface;
+ watch->qemu_watch = watch->core->watch_add(fd, event_mask, func, opaque);
+ return &watch->base;
+}
+
+static void adapter_watch_update_mask(SpiceWatch *watch_, int event_mask)
+{
+ SpiceWatchQemu *watch = SPICE_UPCAST(SpiceWatchQemu, watch_);
+ watch->core->watch_update_mask(watch->qemu_watch, event_mask);
+}
+
+static void adapter_watch_remove(SpiceWatch *watch_)
+{
+ SpiceWatchQemu *watch = SPICE_UPCAST(SpiceWatchQemu, watch_);
+ watch->core->watch_remove(watch->qemu_watch);
+ g_free(watch);
+}
+
+static void adapter_channel_event(const SpiceCoreInterfaceInternal *iface, int event, SpiceChannelEventInfo *info)
+{
+ if (iface->public_interface->base.minor_version >= 3 && iface->public_interface->channel_event != NULL)
+ iface->public_interface->channel_event(event, info);
+}
+
+static const SpiceCoreFuncs qemu_core_funcs = {
+ .timer_start = adapter_timer_start,
+ .timer_cancel = adapter_timer_cancel,
+ .timer_remove = adapter_timer_remove,
+
+ .watch_update_mask = adapter_watch_update_mask,
+ .watch_remove = adapter_watch_remove,
+};
+
+const SpiceCoreInterfaceInternal core_interface_adapter = {
+ .timer_add = adapter_timer_add,
+ .watch_add = adapter_watch_add,
+ .channel_event = adapter_channel_event,
+};
diff --git a/server/glib-compat.h b/server/glib-compat.h
new file mode 100644
index 00000000..5f36d3e2
--- /dev/null
+++ b/server/glib-compat.h
@@ -0,0 +1,49 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2021 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef GLIB_COMPAT_H_
+#define GLIB_COMPAT_H_
+
+#include <glib.h>
+
+#if GLIB_VERSION_MIN_REQUIRED >= G_ENCODE_VERSION(2, 68)
+#error Time to remove this section
+#elif !GLIB_CHECK_VERSION(2,68,0)
+static inline void*
+g_memdup2(const void *ptr, size_t size)
+{
+ void *dst = NULL;
+
+ if (ptr && size != 0) {
+ dst = g_malloc(size);
+ memcpy(dst, ptr, size);
+ }
+ return dst;
+}
+#elif GLIB_VERSION_MAX_ALLOWED < G_ENCODE_VERSION(2, 68)
+static inline void*
+g_memdup2_compat(const void *ptr, size_t size)
+{
+ G_GNUC_BEGIN_IGNORE_DEPRECATIONS
+ return g_memdup2(ptr, size);
+ G_GNUC_END_IGNORE_DEPRECATIONS
+}
+#define g_memdup2 g_memdup2_compat
+#endif
+
+#endif /* GLIB_COMPAT_H_ */
diff --git a/server/glz_encode_match_tmpl.c b/server/glz-encode-match.tmpl.c
index b793e7f0..0c0487d7 100644
--- a/server/glz_encode_match_tmpl.c
+++ b/server/glz-encode-match.tmpl.c
@@ -14,9 +14,7 @@
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
-#ifdef HAVE_CONFIG_H
#include <config.h>
-#endif
#define SHORT_PIX_IMAGE_DIST_LEVEL_1 64 //(1 << 6)
#define SHORT_PIX_IMAGE_DIST_LEVEL_2 16384 // (1 << 14)
@@ -28,10 +26,10 @@
/* if image_distance = 0, pixel_distance is the distance between the matching pixels.
Otherwise, it is the offset from the beginning of the referred image */
#if defined(GLZ_ENCODE_MATCH) /* actually performing the encoding */
-static INLINE void encode_match(Encoder *encoder, uint32_t image_distance,
+static inline void encode_match(Encoder *encoder, uint32_t image_distance,
size_t pixel_distance, size_t len)
#elif defined(GLZ_ENCODE_SIZE) /* compute the size of the encoding except for the match length*/
-static INLINE int get_encode_ref_size(uint32_t image_distance, size_t pixel_distance)
+static inline int get_encode_ref_size(uint32_t image_distance, size_t pixel_distance)
#endif
{
#if defined(GLZ_ENCODE_SIZE)
diff --git a/server/glz_encode_tmpl.c b/server/glz-encode.tmpl.c
index 1402f953..92deb0e1 100644
--- a/server/glz_encode_tmpl.c
+++ b/server/glz-encode.tmpl.c
@@ -14,11 +14,9 @@
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
-#ifdef HAVE_CONFIG_H
#include <config.h>
-#endif
-#define DJB2_START 5381;
+#define DJB2_START 5381
#define DJB2_HASH(hash, c) (hash = ((hash << 5) + hash) ^ (c)) //|{hash = ((hash << 5) + hash) + c;}
/*
@@ -68,9 +66,8 @@
#ifdef LZ_RGB16
#define PIXEL rgb16_pixel_t
#define FNAME(name) glz_rgb16_##name
-#define GET_r(pix) (((pix) >> 10) & 0x1f)
-#define GET_g(pix) (((pix) >> 5) & 0x1f)
-#define GET_b(pix) ((pix) & 0x1f)
+#define GET_rgb(pix) ((pix) & 0x7fffu)
+#define SAME_PIXEL(p1, p2) (GET_rgb(p1) == GET_rgb(p2))
#define ENCODE_PIXEL(e, pix) {encode(e, (pix) >> 8); encode(e, (pix) & 0xff);}
#define MIN_REF_ENCODE_SIZE 2
#define MAX_REF_ENCODE_SIZE 3
@@ -89,24 +86,19 @@
#ifdef LZ_RGB24
#define PIXEL rgb24_pixel_t
#define FNAME(name) glz_rgb24_##name
-#define ENCODE_PIXEL(e, pix) {encode(e, (pix).b); encode(e, (pix).g); encode(e, (pix).r);}
-#define MIN_REF_ENCODE_SIZE 2
-#define MAX_REF_ENCODE_SIZE 2
#endif
#ifdef LZ_RGB32
#define PIXEL rgb32_pixel_t
#define FNAME(name) glz_rgb32_##name
-#define ENCODE_PIXEL(e, pix) {encode(e, (pix).b); encode(e, (pix).g); encode(e, (pix).r);}
-#define MIN_REF_ENCODE_SIZE 2
-#define MAX_REF_ENCODE_SIZE 2
#endif
#if defined(LZ_RGB24) || defined(LZ_RGB32)
-#define GET_r(pix) ((pix).r)
-#define GET_g(pix) ((pix).g)
-#define GET_b(pix) ((pix).b)
+#define ENCODE_PIXEL(e, pix) {encode(e, (pix).b); encode(e, (pix).g); encode(e, (pix).r);}
+#define MIN_REF_ENCODE_SIZE 2
+#define MAX_REF_ENCODE_SIZE 2
+#define SAME_PIXEL(p1, p2) ((p1).r == (p2).r && (p1).g == (p2).g && (p1).b == (p2).b)
#define HASH_FUNC(v, p) { \
v = DJB2_START; \
DJB2_HASH(v, p[0].r); \
@@ -122,36 +114,22 @@
}
#endif
-#if defined(LZ_RGB16) || defined(LZ_RGB24) || defined(LZ_RGB32)
-#define SAME_PIXEL(p1, p2) (GET_r(p1) == GET_r(p2) && GET_g(p1) == GET_g(p2) && \
- GET_b(p1) == GET_b(p2))
-
-#endif
-
-#ifndef LZ_PLT
-#define PIXEL_ID(pix_ptr, seg_ptr) \
- ((pix_ptr) - ((PIXEL *)(seg_ptr)->lines) + (seg_ptr)->pixels_so_far)
-#define PIXEL_DIST(src_pix_ptr, src_seg_ptr, ref_pix_ptr, ref_seg_ptr) \
- (PIXEL_ID(src_pix_ptr,src_seg_ptr) - PIXEL_ID(ref_pix_ptr, ref_seg_ptr))
-#else
#define PIXEL_ID(pix_ptr, seg_ptr, pix_per_byte) \
(((pix_ptr) - ((PIXEL *)(seg_ptr)->lines)) * pix_per_byte + (seg_ptr)->pixels_so_far)
+
#define PIXEL_DIST(src_pix_ptr, src_seg_ptr, ref_pix_ptr, ref_seg_ptr, pix_per_byte) \
((PIXEL_ID(src_pix_ptr,src_seg_ptr, pix_per_byte) - \
PIXEL_ID(ref_pix_ptr, ref_seg_ptr, pix_per_byte)) / pix_per_byte)
-#endif
/* returns the length of the match. 0 if no match.
if image_distance = 0, pixel_distance is the distance between the matching pixels.
Otherwise, it is the offset from the beginning of the referred image */
-static INLINE size_t FNAME(do_match)(SharedDictionary *dict,
+static inline size_t FNAME(do_match)(SharedDictionary *dict,
WindowImageSegment *ref_seg, const PIXEL *ref,
const PIXEL *ref_limit,
WindowImageSegment *ip_seg, const PIXEL *ip,
const PIXEL *ip_limit,
-#ifdef LZ_PLT
int pix_per_byte,
-#endif
size_t *o_image_dist, size_t *o_pix_distance)
{
int encode_size;
@@ -202,25 +180,12 @@ static INLINE size_t FNAME(do_match)(SharedDictionary *dict,
*o_image_dist = ip_seg->image->id - ref_seg->image->id;
if (!(*o_image_dist)) { // the ref is inside the same image - encode distance
-#ifndef LZ_PLT
- *o_pix_distance = PIXEL_DIST(ip, ip_seg, ref, ref_seg);
-#else
- // in bytes
*o_pix_distance = PIXEL_DIST(ip, ip_seg, ref, ref_seg, pix_per_byte);
-#endif
} else { // the ref is at different image - encode offset from the image start
-#ifndef LZ_PLT
- *o_pix_distance = PIXEL_DIST(ref, ref_seg,
- (PIXEL *)(dict->window.segs[ref_seg->image->first_seg].lines),
- &dict->window.segs[ref_seg->image->first_seg]
- );
-#else
- // in bytes
*o_pix_distance = PIXEL_DIST(ref, ref_seg,
(PIXEL *)(dict->window.segs[ref_seg->image->first_seg].lines),
&dict->window.segs[ref_seg->image->first_seg],
pix_per_byte);
-#endif
}
if ((*o_pix_distance == 0) || (*o_pix_distance >= MAX_PIXEL_LONG_DISTANCE) ||
@@ -275,6 +240,8 @@ static void FNAME(compress_seg)(Encoder *encoder, uint32_t seg_idx, PIXEL *from,
int copy = copied;
#ifdef LZ_PLT
int pix_per_byte = PLT_PIXELS_PER_BYTE[encoder->cur_image.type];
+#else
+ int pix_per_byte = 1;
#endif
#ifdef DEBUG_ENCODE
@@ -309,19 +276,15 @@ static void FNAME(compress_seg)(Encoder *encoder, uint32_t seg_idx, PIXEL *from,
if (LZ_EXPECT_CONDITIONAL(ip > (PIXEL *)(seg->lines))) {
if (SAME_PIXEL(ip[-1], ip[0]) && SAME_PIXEL(ip[0], ip[1]) && SAME_PIXEL(ip[1], ip[2])) {
- PIXEL x;
+ PIXEL x = ip[2];
+
pix_dist = 1;
image_dist = 0;
ip += 3;
- ref = anchor + 2;
- ref_limit = (PIXEL *)(seg->lines_end);
len = 3;
- x = *ref;
-
- while (ip < ip_bound) { // TODO: maybe separate a run from the same seg or from
- // different ones in order to spare ref < ref_limit
+ while (ip < ip_bound) {
if (!SAME_PIXEL(*ip, x)) {
ip++;
break;
@@ -355,9 +318,7 @@ static void FNAME(compress_seg)(Encoder *encoder, uint32_t seg_idx, PIXEL *from,
ref_limit = (PIXEL *)ref_seg->lines_end;
len = FNAME(do_match)(encoder->dict, ref_seg, ref, ref_limit, seg, ip, ip_bound,
-#ifdef LZ_PLT
pix_per_byte,
-#endif
&image_dist, &pix_dist);
#ifdef CHAINED_HASH
@@ -386,7 +347,7 @@ static void FNAME(compress_seg)(Encoder *encoder, uint32_t seg_idx, PIXEL *from,
match: // RLE or dictionary (both are encoded by distance from ref (-1) and length)
#ifdef DEBUG_ENCODE
- printf(", match(%d, %d, %d)", image_dist, pix_dist, len);
+ printf(", match(%zu, %zu, %zu)", image_dist, pix_dist, len);
n_encoded += len;
#endif
@@ -422,26 +383,21 @@ match: // RLE or dictionary (both are encoded by distance from ref (-1) a
/* update the hash at match boundary */
#if defined(LZ_RGB16) || defined(LZ_RGB24) || defined(LZ_RGB32)
- if (ip > anchor) {
+ if (ip > anchor)
#endif
+ {
HASH_FUNC(hval, ip);
UPDATE_HASH(encoder->dict, hval, seg_idx, ip - ((PIXEL *)seg->lines));
- ip++;
-#if defined(LZ_RGB16) || defined(LZ_RGB24) || defined(LZ_RGB32)
- } else {ip++;
}
-#endif
+ ip++;
#if defined(LZ_RGB24) || defined(LZ_RGB32)
- if (ip > anchor) {
+ if (ip > anchor)
#endif
+ {
HASH_FUNC(hval, ip);
UPDATE_HASH(encoder->dict, hval, seg_idx, ip - ((PIXEL *)seg->lines));
- ip++;
-#if defined(LZ_RGB24) || defined(LZ_RGB32)
- } else {
- ip++;
}
-#endif
+ ip++;
/* assuming literal copy */
encode_copy_count(encoder, MAX_COPY - 1);
continue;
@@ -561,10 +517,7 @@ static void FNAME(compress)(Encoder *encoder)
#undef ENCODE_PIXEL
#undef SAME_PIXEL
#undef HASH_FUNC
-#undef GET_r
-#undef GET_g
-#undef GET_b
-#undef GET_CODE
+#undef GET_rgb
#undef LZ_PLT
#undef LZ_RGB_ALPHA
#undef LZ_RGB16
diff --git a/server/glz_encoder_dictionary.c b/server/glz-encoder-dict.c
index df346d08..6a1da292 100644
--- a/server/glz_encoder_dictionary.c
+++ b/server/glz-encoder-dict.c
@@ -14,20 +14,21 @@
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
-#ifdef HAVE_CONFIG_H
#include <config.h>
-#endif
#include <pthread.h>
#include <string.h>
#include <stdio.h>
-#include "glz_encoder_dictionary.h"
-#include "glz_encoder_dictionary_protected.h"
+#include "glz-encoder.h"
+#include "glz-encoder-dict.h"
+#include "glz-encoder-priv.h"
+
+static void glz_enc_dictionary_reset(GlzEncDictContext *opaque_dict, GlzEncoderUsrContext *usr);
/* turning all used images to free ones. If they are alive, calling the free_image callback for
each one */
-static INLINE void __glz_dictionary_window_reset_images(SharedDictionary *dict)
+static inline void __glz_dictionary_window_reset_images(SharedDictionary *dict)
{
WindowImage *tmp;
@@ -45,7 +46,7 @@ static INLINE void __glz_dictionary_window_reset_images(SharedDictionary *dict)
}
/* allocate window fields (no reset)*/
-static int glz_dictionary_window_create(SharedDictionary *dict, uint32_t size)
+static bool glz_dictionary_window_create(SharedDictionary *dict, uint32_t size)
{
if (size > LZ_MAX_WINDOW_SIZE) {
return FALSE;
@@ -108,7 +109,7 @@ static void glz_dictionary_window_reset(SharedDictionary *dict)
__glz_dictionary_window_reset_images(dict);
}
-static INLINE void glz_dictionary_reset_hash(SharedDictionary *dict)
+static inline void glz_dictionary_reset_hash(SharedDictionary *dict)
{
memset(dict->htab, 0, sizeof(HashEntry) * HASH_SIZE * HASH_CHAIN_SIZE);
#ifdef CHAINED_HASH
@@ -116,7 +117,7 @@ static INLINE void glz_dictionary_reset_hash(SharedDictionary *dict)
#endif
}
-static INLINE void glz_dictionary_window_destroy(SharedDictionary *dict)
+static inline void glz_dictionary_window_destroy(SharedDictionary *dict)
{
__glz_dictionary_window_reset_images(dict);
@@ -139,7 +140,7 @@ static INLINE void glz_dictionary_window_destroy(SharedDictionary *dict)
}
/* logic removal only */
-static INLINE void glz_dictionary_window_kill_image(SharedDictionary *dict, WindowImage *image)
+static inline void glz_dictionary_window_kill_image(SharedDictionary *dict, WindowImage *image)
{
image->is_alive = FALSE;
}
@@ -196,11 +197,15 @@ GlzEncDictContext *glz_enc_dictionary_restore(GlzEncDictRestoreData *restore_dat
}
SharedDictionary *ret = (SharedDictionary *)glz_enc_dictionary_create(
restore_data->size, restore_data->max_encoders, usr);
+ if (!ret) {
+ return NULL;
+ }
ret->last_image_id = restore_data->last_image_id;
return ((GlzEncDictContext *)ret);
}
-void glz_enc_dictionary_reset(GlzEncDictContext *opaque_dict, GlzEncoderUsrContext *usr)
+/* NOTE - you should use this routine only when no encoder uses the dictionary. */
+static void glz_enc_dictionary_reset(GlzEncDictContext *opaque_dict, GlzEncoderUsrContext *usr)
{
SharedDictionary *dict = (SharedDictionary *)opaque_dict;
dict->cur_usr = usr;
@@ -255,13 +260,13 @@ void glz_enc_dictionary_remove_image(GlzEncDictContext *opaque_dict,
Mutators of the window. Should be called by the encoder before and after encoding.
***********************************************************************************/
-static INLINE int __get_pixels_num(LzImageType image_type, unsigned int num_lines, int stride)
+static inline int __get_pixels_num(LzImageType image_type, unsigned int num_lines, int stride)
{
if (IS_IMAGE_TYPE_RGB[image_type]) {
return num_lines * stride / RGB_BYTES_PER_PIXEL[image_type];
- } else {
- return num_lines * stride * PLT_PIXELS_PER_BYTE[image_type];
}
+
+ return num_lines * stride * PLT_PIXELS_PER_BYTE[image_type];
}
static void __glz_dictionary_window_segs_realloc(SharedDictionary *dict)
@@ -289,7 +294,7 @@ static void __glz_dictionary_window_segs_realloc(SharedDictionary *dict)
memcpy(new_segs, dict->window.segs,
sizeof(WindowImageSegment) * dict->window.segs_quota);
- // reseting the new elements
+ // resetting the new elements
for (i = dict->window.segs_quota, seg = new_segs + i; i < new_quota; i++, seg++) {
seg->image = NULL;
seg->lines = NULL;
@@ -356,7 +361,7 @@ static uint32_t __glz_dictionary_window_alloc_image_seg(SharedDictionary *dict)
}
/* moves image to free list and "kill" it. Calls the free_image callback if was alive. */
-static INLINE void __glz_dictionary_window_free_image(SharedDictionary *dict, WindowImage *image)
+static inline void __glz_dictionary_window_free_image(SharedDictionary *dict, WindowImage *image)
{
if (image->is_alive) {
dict->cur_usr->free_image(dict->cur_usr, image->usr_context);
@@ -367,7 +372,7 @@ static INLINE void __glz_dictionary_window_free_image(SharedDictionary *dict, Wi
}
/* moves all the segments that were associated with the images to the free segments */
-static INLINE void __glz_dictionary_window_free_image_segs(SharedDictionary *dict,
+static inline void __glz_dictionary_window_free_image_segs(SharedDictionary *dict,
WindowImage *image)
{
uint32_t old_free_head = dict->window.free_segs_head;
@@ -408,7 +413,7 @@ static WindowImage *glz_dictionary_window_get_new_head(SharedDictionary *dict, i
GLZ_ASSERT(dict->cur_usr, dict->window.used_segs_head != NULL_IMAGE_SEG_ID);
GLZ_ASSERT(dict->cur_usr, dict->window.used_segs_tail != NULL_IMAGE_SEG_ID);
- // used_segs_head is the latest logical head (the physical head may preceed it)
+ // used_segs_head is the latest logical head (the physical head may precede it)
cur_head = dict->window.segs[dict->window.used_segs_head].image;
cur_win_size = dict->window.segs[dict->window.used_segs_tail].pixels_num +
dict->window.segs[dict->window.used_segs_tail].pixels_so_far -
@@ -423,7 +428,7 @@ static WindowImage *glz_dictionary_window_get_new_head(SharedDictionary *dict, i
return cur_head;
}
-static INLINE int glz_dictionary_is_in_use(SharedDictionary *dict)
+static inline bool glz_dictionary_is_in_use(SharedDictionary *dict)
{
uint32_t i = 0;
for (i = 0; i < dict->max_encoders; i++) {
@@ -485,10 +490,14 @@ static WindowImage *glz_dictionary_window_add_image(SharedDictionary *dict, LzIm
{
unsigned int num_lines = num_first_lines;
unsigned int row;
- uint32_t seg_id, prev_seg_id;
+ uint32_t seg_id;
+ uint32_t prev_seg_id = 0;
uint8_t* lines = first_lines;
// alloc image info,update used head tail, if used_head null - update head
WindowImage *image = __glz_dictionary_window_alloc_image(dict);
+ if (!image) {
+ dict->cur_usr->error(dict->cur_usr, "glz-dictionary failed to allocate an image\n");
+ }
image->id = dict->last_image_id++;
image->size = image_size;
image->type = image_type;
diff --git a/server/glz_encoder_dictionary.h b/server/glz-encoder-dict.h
index eb57aa54..b5a76361 100644
--- a/server/glz_encoder_dictionary.h
+++ b/server/glz-encoder-dict.h
@@ -15,21 +15,26 @@
License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef _H_GLZ_ENCODER_DICTIONARY
-#define _H_GLZ_ENCODER_DICTIONARY
+#ifndef GLZ_ENCODER_DICT_H_
+#define GLZ_ENCODER_DICT_H_
#include <stdint.h>
-#include "glz_encoder_config.h"
+#include <spice/macros.h>
/*
Interface for maintaining lz dictionary that is shared among several encoders.
The interface for accessing the dictionary for encoding purposes is located in
- glz_encoder_dictionary_protected.h
+ glz-encoder-priv.h
*/
+SPICE_BEGIN_DECLS
+
typedef void GlzEncDictContext;
typedef void GlzEncDictImageContext;
+typedef void GlzUsrImageContext;
+typedef struct GlzEncoderUsrContext GlzEncoderUsrContext;
+
/* NOTE: DISPLAY_MIGRATE_DATA_VERSION should change in case GlzEncDictRestoreData changes*/
typedef struct GlzEncDictRestoreData {
uint32_t size;
@@ -58,12 +63,11 @@ void glz_enc_dictionary_get_restore_data(GlzEncDictContext *opaque_dict,
GlzEncDictContext *glz_enc_dictionary_restore(GlzEncDictRestoreData *restore_data,
GlzEncoderUsrContext *usr);
-/* NOTE - you should use this routine only when no encoder uses the dictionary. */
-void glz_enc_dictionary_reset(GlzEncDictContext *opaque_dict, GlzEncoderUsrContext *usr);
-
/* image: the context returned by the encoder when the image was encoded.
NOTE - you should use this routine only when no encoder uses the dictionary.*/
void glz_enc_dictionary_remove_image(GlzEncDictContext *opaque_dict,
GlzEncDictImageContext *image, GlzEncoderUsrContext *usr);
-#endif // _H_GLZ_ENCODER_DICTIONARY
+SPICE_END_DECLS
+
+#endif /* GLZ_ENCODER_DICT_H_ */
diff --git a/server/glz_encoder_dictionary_protected.h b/server/glz-encoder-priv.h
index ee1f8d8e..7757f232 100644
--- a/server/glz_encoder_dictionary_protected.h
+++ b/server/glz-encoder-priv.h
@@ -15,8 +15,13 @@
License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef _H_GLZ_ENCODER_DICTIONARY_PROTECTED
-#define _H_GLZ_ENCODER_DICTIONARY_PROTECTED
+#ifndef GLZ_ENCODER_PRIV_H_
+#define GLZ_ENCODER_PRIV_H_
+
+#include <pthread.h>
+#include <common/lz_common.h>
+
+#include "glz-encoder-dict.h"
/* Interface for using the dictionary for encoding.
Data structures are exposed for the encoder for efficiency
@@ -61,8 +66,8 @@ struct WindowImage {
An encoded match can refer to only one segment.*/
struct WindowImageSegment {
WindowImage *image;
- uint8_t *lines;
- uint8_t *lines_end;
+ void *lines;
+ void *lines_end;
uint32_t pixels_num; // Number of pixels in the segment
uint64_t pixels_so_far; // Total no. pixels passed through the window till this segment.
// NOTE - never use size delta independently. It should
@@ -71,7 +76,7 @@ struct WindowImageSegment {
};
-struct __attribute__ ((__packed__)) HashEntry {
+struct HashEntry {
uint32_t image_seg_idx;
uint32_t ref_pix_idx;
};
@@ -183,4 +188,16 @@ void glz_dictionary_post_encode(uint32_t encoder_id, GlzEncoderUsrContext *usr,
(dict)->window.encoders_heads[enc_id]].pixels_so_far <= \
ref_seg->pixels_so_far)))
-#endif // _H_GLZ_ENCODER_DICTIONARY_PROTECTED
+#ifdef DEBUG
+
+#define GLZ_ASSERT(usr, x) \
+ if (!(x)) (usr)->error(usr, "%s: ASSERT %s failed\n", __FUNCTION__, #x);
+
+#else
+
+#define GLZ_ASSERT(usr, x)
+
+#endif
+
+
+#endif /* GLZ_ENCODER_PRIV_H_ */
diff --git a/server/glz_encoder.c b/server/glz-encoder.c
index 1ec1f9bd..4309daea 100644
--- a/server/glz_encoder.c
+++ b/server/glz-encoder.c
@@ -14,14 +14,13 @@
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
-#ifdef HAVE_CONFIG_H
#include <config.h>
-#endif
+#include <glib.h>
#include <pthread.h>
#include <stdio.h>
-#include "glz_encoder.h"
-#include "glz_encoder_dictionary_protected.h"
+#include "glz-encoder.h"
+#include "glz-encoder-priv.h"
/* Holds a specific data for one encoder, and data that is relevant for the current image encoded */
@@ -49,7 +48,7 @@ typedef struct Encoder {
/**************************************************************************
* Handling writing the encoded image to the output buffer
***************************************************************************/
-static INLINE int more_io_bytes(Encoder *encoder)
+static inline int more_io_bytes(Encoder *encoder)
{
uint8_t *io_ptr;
int num_io_bytes = encoder->usr->more_space(encoder->usr, &io_ptr);
@@ -59,7 +58,7 @@ static INLINE int more_io_bytes(Encoder *encoder)
return num_io_bytes;
}
-static INLINE void encode(Encoder *encoder, uint8_t byte)
+static inline void encode(Encoder *encoder, uint8_t byte)
{
if (encoder->io.now == encoder->io.end) {
if (more_io_bytes(encoder) <= 0) {
@@ -72,7 +71,7 @@ static INLINE void encode(Encoder *encoder, uint8_t byte)
*(encoder->io.now++) = byte;
}
-static INLINE void encode_32(Encoder *encoder, unsigned int word)
+static inline void encode_32(Encoder *encoder, unsigned int word)
{
encode(encoder, (uint8_t)(word >> 24));
encode(encoder, (uint8_t)(word >> 16) & 0x0000ff);
@@ -80,26 +79,26 @@ static INLINE void encode_32(Encoder *encoder, unsigned int word)
encode(encoder, (uint8_t)(word & 0x0000ff));
}
-static INLINE void encode_64(Encoder *encoder, uint64_t word)
+static inline void encode_64(Encoder *encoder, uint64_t word)
{
encode_32(encoder, (uint32_t)(word >> 32));
- encode_32(encoder, (uint32_t)(word & 0xffffff));
+ encode_32(encoder, (uint32_t)(word & 0xffffffffU));
}
-static INLINE void encode_copy_count(Encoder *encoder, uint8_t copy_count)
+static inline void encode_copy_count(Encoder *encoder, uint8_t copy_count)
{
encode(encoder, copy_count);
encoder->io.last_copy = encoder->io.now - 1; // io_now cannot be the first byte of the buffer
}
-static INLINE void update_copy_count(Encoder *encoder, uint8_t copy_count)
+static inline void update_copy_count(Encoder *encoder, uint8_t copy_count)
{
GLZ_ASSERT(encoder->usr, encoder->io.last_copy);
*(encoder->io.last_copy) = copy_count;
}
// decrease the io ptr by 1
-static INLINE void compress_output_prev(Encoder *encoder)
+static inline void compress_output_prev(Encoder *encoder)
{
// io_now cannot be the first byte of the buffer
encoder->io.now--;
@@ -107,7 +106,7 @@ static INLINE void compress_output_prev(Encoder *encoder)
GLZ_ASSERT(encoder->usr, encoder->io.now == encoder->io.last_copy)
}
-static int encoder_reset(Encoder *encoder, uint8_t *io_ptr, uint8_t *io_ptr_end)
+static bool encoder_reset(Encoder *encoder, uint8_t *io_ptr, uint8_t *io_ptr_end)
{
GLZ_ASSERT(encoder->usr, io_ptr <= io_ptr_end);
encoder->io.bytes_count = io_ptr_end - io_ptr;
@@ -169,18 +168,18 @@ void glz_encoder_destroy(GlzEncoderContext *opaque_encoder)
typedef uint8_t BYTE;
-typedef struct __attribute__ ((__packed__)) one_byte_pixel_t {
+typedef struct one_byte_pixel_t {
BYTE a;
} one_byte_pixel_t;
-typedef struct __attribute__ ((__packed__)) rgb32_pixel_t {
+typedef struct rgb32_pixel_t {
BYTE b;
BYTE g;
BYTE r;
BYTE pad;
} rgb32_pixel_t;
-typedef struct __attribute__ ((__packed__)) rgb24_pixel_t {
+typedef struct rgb24_pixel_t {
BYTE b;
BYTE g;
BYTE r;
@@ -202,24 +201,24 @@ typedef uint16_t rgb16_pixel_t;
#define GLZ_ENCODE_SIZE
-#include "glz_encode_match_tmpl.c"
+#include "glz-encode-match.tmpl.c"
#define GLZ_ENCODE_MATCH
-#include "glz_encode_match_tmpl.c"
+#include "glz-encode-match.tmpl.c"
#define LZ_PLT
-#include "glz_encode_tmpl.c"
+#include "glz-encode.tmpl.c"
#define LZ_RGB16
-#include "glz_encode_tmpl.c"
+#include "glz-encode.tmpl.c"
#define LZ_RGB24
-#include "glz_encode_tmpl.c"
+#include "glz-encode.tmpl.c"
#define LZ_RGB32
-#include "glz_encode_tmpl.c"
+#include "glz-encode.tmpl.c"
#define LZ_RGB_ALPHA
-#include "glz_encode_tmpl.c"
+#include "glz-encode.tmpl.c"
int glz_encode(GlzEncoderContext *opaque_encoder,
diff --git a/server/glz_encoder.h b/server/glz-encoder.h
index 34c363a3..61da5ec4 100644
--- a/server/glz_encoder.h
+++ b/server/glz-encoder.h
@@ -15,15 +15,36 @@
License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef _H_GLZ_ENCODER
-#define _H_GLZ_ENCODER
+#ifndef GLZ_ENCODER_H_
+#define GLZ_ENCODER_H_
/* Manging the lz encoding using a dictionary that is shared among encoders */
-#include <stdint.h>
-#include "common/lz_common.h"
-#include "glz_encoder_dictionary.h"
-#include "glz_encoder_config.h"
+#include <common/lz_common.h>
+
+#include "red-common.h"
+#include "glz-encoder-dict.h"
+
+SPICE_BEGIN_DECLS
+
+struct GlzEncoderUsrContext {
+ SPICE_GNUC_PRINTF(2, 3) void (*error)(GlzEncoderUsrContext *usr, const char *fmt, ...);
+ SPICE_GNUC_PRINTF(2, 3) void (*warn)(GlzEncoderUsrContext *usr, const char *fmt, ...);
+ SPICE_GNUC_PRINTF(2, 3) void (*info)(GlzEncoderUsrContext *usr, const char *fmt, ...);
+ void *(*malloc)(GlzEncoderUsrContext *usr, int size);
+ void (*free)(GlzEncoderUsrContext *usr, void *ptr);
+
+ // get the next chunk of the image which is entered to the dictionary. If the image is down to
+ // top, return it from the last line to the first one (stride should always be positive)
+ int (*more_lines)(GlzEncoderUsrContext *usr, uint8_t **lines);
+
+ // get the next chunk of the compressed buffer.return number of bytes in the chunk.
+ int (*more_space)(GlzEncoderUsrContext *usr, uint8_t **io_ptr);
+
+ // called when an image is removed from the dictionary, due to the window size limit
+ void (*free_image)(GlzEncoderUsrContext *usr, GlzUsrImageContext *image);
+
+};
typedef void GlzEncoderContext;
@@ -42,7 +63,7 @@ void glz_encoder_destroy(GlzEncoderContext *opaque_encoder);
return: the number of bytes in the compressed data and sets o_enc_dict_context
- NOTE : currently supports only rgb images in which width*bytes_per_pixel = stride OR
+ NOTE : currently supports only rgb images in which width*bytes_per_pixel = stride OR
palette images in which stride equals the min number of bytes to hold a line.
The stride should be > 0
*/
@@ -51,5 +72,6 @@ int glz_encode(GlzEncoderContext *opaque_encoder, LzImageType type, int width, i
uint8_t *io_ptr, unsigned int num_io_bytes, GlzUsrImageContext *usr_context,
GlzEncDictImageContext **o_enc_dict_context);
+SPICE_END_DECLS
-#endif // _H_GLZ_ENCODER
+#endif /* GLZ_ENCODER_H_ */
diff --git a/server/glz_encoder_config.h b/server/glz_encoder_config.h
deleted file mode 100644
index 886c68ba..00000000
--- a/server/glz_encoder_config.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_GLZ_ENCODER_CONFIG
-#define _H_GLZ_ENCODER_CONFIG
-
-#include <spice/macros.h>
-#include "common/lz_common.h"
-
-typedef void GlzUsrImageContext;
-typedef struct GlzEncoderUsrContext GlzEncoderUsrContext;
-
-struct GlzEncoderUsrContext {
- SPICE_GNUC_PRINTF(2, 3) void (*error)(GlzEncoderUsrContext *usr, const char *fmt, ...);
- SPICE_GNUC_PRINTF(2, 3) void (*warn)(GlzEncoderUsrContext *usr, const char *fmt, ...);
- SPICE_GNUC_PRINTF(2, 3) void (*info)(GlzEncoderUsrContext *usr, const char *fmt, ...);
- void *(*malloc)(GlzEncoderUsrContext *usr, int size);
- void (*free)(GlzEncoderUsrContext *usr, void *ptr);
-
- // get the next chunk of the image which is entered to the dictionary. If the image is down to
- // top, return it from the last line to the first one (stride should always be positive)
- int (*more_lines)(GlzEncoderUsrContext *usr, uint8_t **lines);
-
- // get the next chunk of the compressed buffer.return number of bytes in the chunk.
- int (*more_space)(GlzEncoderUsrContext *usr, uint8_t **io_ptr);
-
- // called when an image is removed from the dictionary, due to the window size limit
- void (*free_image)(GlzEncoderUsrContext *usr, GlzUsrImageContext *image);
-
-};
-
-
-#ifdef DEBUG
-
-#define GLZ_ASSERT(usr, x) \
- if (!(x)) (usr)->error(usr, "%s: ASSERT %s failed\n", __FUNCTION__, #x);
-
-#else
-
-#define GLZ_ASSERT(usr, x)
-
-#endif
-
-#define INLINE inline
-
-
-#endif
diff --git a/server/gstreamer-encoder.c b/server/gstreamer-encoder.c
new file mode 100644
index 00000000..40882f69
--- /dev/null
+++ b/server/gstreamer-encoder.c
@@ -0,0 +1,1732 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2015 Jeremy White
+ Copyright (C) 2015-2016 Francois Gouget
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+
+#include <inttypes.h>
+#include <pthread.h>
+
+// ignore static constants variable not used
+#if defined(__GNUC__) && (__GNUC__ >= 6)
+# pragma GCC diagnostic push
+# pragma GCC diagnostic ignored "-Wunused-const-variable"
+#endif
+#include <gst/gst.h>
+#include <gst/app/gstappsrc.h>
+#include <gst/app/gstappsink.h>
+#include <gst/video/video.h>
+#include <orc/orcprogram.h>
+#if defined(__GNUC__) && (__GNUC__ >= 6)
+# pragma GCC diagnostic pop
+#endif
+
+#include "red-common.h"
+#include "video-encoder.h"
+#include "utils.h"
+
+
+#define SPICE_GST_DEFAULT_FPS 30
+
+typedef struct {
+ SpiceBitmapFmt spice_format;
+ uint32_t bpp;
+ char format[8];
+ GstVideoFormat gst_format;
+} SpiceFormatForGStreamer;
+
+#define FMT_DESC(spice_format, bpp, format, gst_format) \
+ { spice_format, bpp, format, gst_format }
+
+typedef struct SpiceGstVideoBuffer {
+ VideoBuffer base;
+ GstBuffer *gst_buffer;
+ GstMapInfo map;
+} SpiceGstVideoBuffer;
+
+typedef struct {
+ uint32_t mm_time;
+ uint32_t size;
+ uint64_t duration;
+} SpiceGstFrameInformation;
+
+typedef enum SpiceGstBitRateStatus {
+ SPICE_GST_BITRATE_DECREASING,
+ SPICE_GST_BITRATE_INCREASING,
+ SPICE_GST_BITRATE_STABLE,
+} SpiceGstBitRateStatus;
+
+typedef struct SpiceGstEncoder {
+ VideoEncoder base;
+
+ /* Callbacks to adjust the refcount of the bitmap being encoded. */
+ bitmap_ref_t bitmap_ref;
+ bitmap_unref_t bitmap_unref;
+
+ GAsyncQueue *unused_bitmap_opaques;
+
+ /* Rate control callbacks */
+ VideoEncoderRateControlCbs cbs;
+
+ /* Spice's initial bit rate estimation in bits per second. */
+ uint64_t starting_bit_rate;
+
+ /* ---------- Video characteristics ---------- */
+
+ uint32_t width;
+ uint32_t height;
+ const SpiceFormatForGStreamer *format;
+ SpiceBitmapFmt spice_format;
+
+ /* Number of consecutive frame encoding errors. */
+ uint32_t errors;
+
+ /* ---------- GStreamer pipeline ---------- */
+
+ /* Pointers to the GStreamer pipeline elements. If pipeline is NULL the
+ * other pointers are invalid.
+ */
+ GstElement *pipeline;
+ GstAppSink *appsink;
+ GstAppSrc *appsrc;
+ GstCaps *src_caps;
+ GstElement *gstenc;
+ GParamSpec *gstenc_bitrate_param;
+
+ /* True if the encoder's bitrate can be modified while playing. */
+ gboolean gstenc_bitrate_is_dynamic;
+
+ /* Pipeline parameters to modify before the next frame. */
+# define SPICE_GST_VIDEO_PIPELINE_STATE 0x1
+# define SPICE_GST_VIDEO_PIPELINE_BITRATE 0x2
+# define SPICE_GST_VIDEO_PIPELINE_CAPS 0x4
+ uint32_t set_pipeline;
+
+ /* Output buffer */
+ pthread_mutex_t outbuf_mutex;
+ pthread_cond_t outbuf_cond;
+ VideoBuffer *outbuf;
+
+ /* The video bit rate. */
+ uint64_t video_bit_rate;
+
+ /* Don't bother changing the GStreamer bit rate if close enough. */
+# define SPICE_GST_VIDEO_BITRATE_MARGIN 0.05
+
+
+ /* ---------- Encoded frame statistics ---------- */
+
+ /* Should be >= than FRAME_STATISTICS_COUNT. This is also used to
+ * annotate the client report debug traces with bit rate information.
+ */
+# define SPICE_GST_HISTORY_SIZE 60
+
+ /* A circular buffer containing the past encoded frames information. */
+ SpiceGstFrameInformation history[SPICE_GST_HISTORY_SIZE];
+
+ /* The indices of the oldest and newest frames in the history buffer. */
+ uint32_t history_first;
+ uint32_t history_last;
+
+ /* How many frames to take into account when computing the effective
+ * bit rate, average frame size, etc. This should be large enough so the
+ * I and P frames average out, and short enough for it to reflect the
+ * current situation.
+ */
+# define SPICE_GST_FRAME_STATISTICS_COUNT 21
+
+ /* The index of the oldest frame taken into account for the statistics. */
+ uint32_t stat_first;
+
+ /* Used to compute the average frame encoding time. */
+ uint64_t stat_duration_sum;
+
+ /* Used to compute the average frame size. */
+ uint64_t stat_size_sum;
+
+ /* Tracks the maximum frame size. */
+ uint32_t stat_size_max;
+
+
+ /* ---------- Encoder bit rate control ----------
+ *
+ * GStreamer encoders don't follow the specified video_bit_rate very
+ * closely. These fields are used to ensure we don't exceed the desired
+ * stream bit rate, regardless of the GStreamer encoder's output.
+ */
+
+ /* The bit rate target for the outgoing network stream. (bits per second) */
+ uint64_t bit_rate;
+
+ /* The minimum bit rate / bit rate increment. */
+# define SPICE_GST_MIN_BITRATE (128 * 1024)
+
+ /* The default bit rate. */
+# define SPICE_GST_DEFAULT_BITRATE (8 * 1024 * 1024)
+
+ /* The bit rate control is performed using a virtual buffer to allow
+ * short term variations: bursts are allowed until the virtual buffer is
+ * full. Then frames are dropped to limit the bit rate. VBUFFER_SIZE
+ * defines the size of the virtual buffer in milliseconds worth of data
+ * while vbuffer_size holds the limit in bytes for the current bit rate.
+ */
+# define SPICE_GST_VBUFFER_SIZE 300
+
+ int32_t vbuffer_size;
+ int32_t vbuffer_free;
+
+ /* When dropping frames, this is set to the minimum mm_time of the next
+ * frame to encode. Otherwise set to zero.
+ */
+ uint32_t next_frame_mm_time;
+
+ /* Defines the minimum allowed fps. */
+# define SPICE_GST_MAX_PERIOD (NSEC_PER_SEC / 3)
+
+ /* How big of a margin to take to cover for latency jitter. */
+# define SPICE_GST_LATENCY_MARGIN 0.1
+
+
+ /* ---------- Network bit rate control ----------
+ *
+ * State information for figuring out the optimal bit rate for the
+ * current network conditions.
+ */
+
+ /* The mm_time of the last bit rate change. */
+ uint32_t last_change;
+
+ /* How much to reduce the bit rate in case of network congestion. */
+# define SPICE_GST_BITRATE_CUT 2
+# define SPICE_GST_BITRATE_REDUCE (4.0 / 3.0)
+
+ /* Never increase the bit rate by more than this amount (bits per second). */
+# define SPICE_GST_BITRATE_MAX_STEP (1024 * 1024)
+
+ /* The maximum bit rate that one can maybe use without causing network
+ * congestion.
+ */
+ uint64_t max_bit_rate;
+
+ /* The last bit rate that let us recover from network congestion. */
+ uint64_t min_bit_rate;
+
+ /* Defines when the spread between max_bit_rate and min_bit_rate has been
+ * narrowed down enough. Note that this value should be large enough for
+ * min_bit_rate to allow recovery from network congestion in a reasonable
+ * time frame, and to absorb transient traffic spikes (potentially from
+ * other sources).
+ * This is also used as a multiplier for the video_bit_rate so it does
+ * not have to be changed too often.
+ */
+# define SPICE_GST_BITRATE_MARGIN SPICE_GST_BITRATE_REDUCE
+
+ /* Whether the bit rate was last decreased, increased or kept stable. */
+ SpiceGstBitRateStatus status;
+
+ /* The network bit rate control uses an AIMD scheme (Additive Increase,
+ * Multiplicative Decrease). The increment step depends on the spread
+ * between the minimum and maximum bit rates.
+ */
+ uint64_t bit_rate_step;
+
+ /* How often to increase the bit rate. */
+ uint32_t increase_interval;
+
+# define SPICE_GST_BITRATE_UP_INTERVAL (MSEC_PER_SEC * 2)
+# define SPICE_GST_BITRATE_UP_CLIENT_STABLE (MSEC_PER_SEC * 60 * 2)
+# define SPICE_GST_BITRATE_UP_SERVER_STABLE (MSEC_PER_SEC * 3600 * 4)
+# define SPICE_GST_BITRATE_UP_RESET_MAX (MSEC_PER_SEC * 30)
+
+
+ /* ---------- Client feedback ---------- */
+
+ /* TRUE if gst_encoder_client_stream_report() is being called. */
+ gboolean has_client_reports;
+
+ /* The margin is the amount of time between the reception of a piece of
+ * media data by the client and the time when it should be displayed.
+ * Increasing the bit rate increases the transmission time and thus
+ * reduces the margin.
+ */
+ int32_t last_video_margin;
+ int32_t max_video_margin;
+ uint32_t max_audio_margin;
+
+# define SPICE_GST_VIDEO_MARGIN_GOOD 0.75
+# define SPICE_GST_VIDEO_MARGIN_AVERAGE 0.5
+# define SPICE_GST_VIDEO_MARGIN_BAD 0.3
+
+# define SPICE_GST_VIDEO_DELTA_BAD 0.2
+# define SPICE_GST_VIDEO_DELTA_AVERAGE 0.15
+
+# define SPICE_GST_AUDIO_MARGIN_BAD 0.5
+# define SPICE_GST_AUDIO_VIDEO_RATIO 1.25
+
+
+ /* ---------- Server feedback ---------- */
+
+ /* How many frames were dropped by the server since the last encoded frame. */
+ uint32_t server_drops;
+} SpiceGstEncoder;
+
+
+/* ---------- The SpiceGstVideoBuffer implementation ---------- */
+
+static void spice_gst_video_buffer_free(VideoBuffer *video_buffer)
+{
+ SpiceGstVideoBuffer *buffer = (SpiceGstVideoBuffer*)video_buffer;
+ if (buffer->gst_buffer) {
+ gst_buffer_unmap(buffer->gst_buffer, &buffer->map);
+ gst_buffer_unref(buffer->gst_buffer);
+ }
+ g_free(buffer);
+}
+
+static SpiceGstVideoBuffer* create_gst_video_buffer(void)
+{
+ SpiceGstVideoBuffer *buffer = g_new0(SpiceGstVideoBuffer, 1);
+ buffer->base.free = spice_gst_video_buffer_free;
+ return buffer;
+}
+
+
+/* ---------- Miscellaneous SpiceGstEncoder helpers ---------- */
+
+static inline double get_mbps(uint64_t bit_rate)
+{
+ return (double)bit_rate / 1024 / 1024;
+}
+
+/* Returns the source frame rate which may change at any time so don't store
+ * the result.
+ */
+static uint32_t get_source_fps(const SpiceGstEncoder *encoder)
+{
+ return encoder->cbs.get_source_fps ?
+ encoder->cbs.get_source_fps(encoder->cbs.opaque) : SPICE_GST_DEFAULT_FPS;
+}
+
+static uint32_t get_network_latency(const SpiceGstEncoder *encoder)
+{
+ /* Assume that the network latency is symmetric */
+ return encoder->cbs.get_roundtrip_ms ?
+ encoder->cbs.get_roundtrip_ms(encoder->cbs.opaque) / 2 : 0;
+}
+
+static void set_pipeline_changes(SpiceGstEncoder *encoder, uint32_t flags)
+{
+ encoder->set_pipeline |= flags;
+}
+
+static void free_pipeline(SpiceGstEncoder *encoder)
+{
+ if (encoder->src_caps) {
+ gst_caps_unref(encoder->src_caps);
+ encoder->src_caps = NULL;
+ }
+ if (encoder->pipeline) {
+ gst_element_set_state(encoder->pipeline, GST_STATE_NULL);
+ gst_object_unref(encoder->appsrc);
+ gst_object_unref(encoder->gstenc);
+ gst_object_unref(encoder->appsink);
+ gst_object_unref(encoder->pipeline);
+ encoder->pipeline = NULL;
+ }
+}
+
+
+/* ---------- Encoded frame statistics ---------- */
+
+static inline uint32_t get_last_frame_mm_time(const SpiceGstEncoder *encoder)
+{
+ return encoder->history[encoder->history_last].mm_time;
+}
+
+/* Returns the current bit rate based on the last
+ * SPICE_GST_FRAME_STATISTICS_COUNT frames.
+ */
+static uint64_t get_effective_bit_rate(const SpiceGstEncoder *encoder)
+{
+ uint32_t next_mm_time = encoder->next_frame_mm_time ?
+ encoder->next_frame_mm_time :
+ get_last_frame_mm_time(encoder) +
+ MSEC_PER_SEC / get_source_fps(encoder);
+ uint32_t elapsed = next_mm_time - encoder->history[encoder->stat_first].mm_time;
+ return elapsed ? encoder->stat_size_sum * 8 * MSEC_PER_SEC / elapsed : 0;
+}
+
+static uint64_t get_average_encoding_time(const SpiceGstEncoder *encoder)
+{
+ uint32_t count = encoder->history_last +
+ (encoder->history_last < encoder->stat_first ? SPICE_GST_HISTORY_SIZE : 0) -
+ encoder->stat_first + 1;
+ return encoder->stat_duration_sum / count;
+}
+
+static uint32_t get_average_frame_size(const SpiceGstEncoder *encoder)
+{
+ uint32_t count = encoder->history_last +
+ (encoder->history_last < encoder->stat_first ? SPICE_GST_HISTORY_SIZE : 0) -
+ encoder->stat_first + 1;
+ return encoder->stat_size_sum / count;
+}
+
+/* Look for the largest frame and store it in stat_size_max to reduce how
+ * often we have to scan the history for the largest frame.
+ * Then all we need to keep things consistent is to:
+ * - Update stat_size_max when adding a larger frame to the history.
+ * - Reset stat_size_max to zero when the largest frame falls out of
+ * the history.
+ */
+static uint32_t get_maximum_frame_size(SpiceGstEncoder *encoder)
+{
+ if (encoder->stat_size_max == 0) {
+ uint32_t index = encoder->history_last;
+ while (1) {
+ encoder->stat_size_max = MAX(encoder->stat_size_max,
+ encoder->history[index].size);
+ if (index == encoder->stat_first) {
+ break;
+ }
+ index = (index ? index : SPICE_GST_HISTORY_SIZE) - 1;
+ }
+ }
+ return encoder->stat_size_max;
+}
+
+/* Returns the bit rate of the specified period. from and to must be the
+ * mm time of the first and last frame to consider.
+ */
+static uint64_t get_period_bit_rate(const SpiceGstEncoder *encoder,
+ uint32_t from, uint32_t to)
+{
+ uint32_t sum = 0;
+ uint32_t last_mm_time = 0;
+ uint32_t index = encoder->history_last;
+ while (1) {
+ if (encoder->history[index].mm_time == to) {
+ if (last_mm_time == 0) {
+ /* We don't know how much time elapsed between the period's
+ * last frame and the next so we cannot include it.
+ */
+ sum = 1;
+ last_mm_time = to;
+ } else {
+ sum = encoder->history[index].size + 1;
+ }
+
+ } else if (encoder->history[index].mm_time == from) {
+ sum += encoder->history[index].size;
+ return (sum - 1) * 8 * MSEC_PER_SEC / (last_mm_time - from);
+
+ } else if (sum > 0) {
+ sum += encoder->history[index].size;
+
+ } else {
+ last_mm_time = encoder->history[index].mm_time;
+ }
+
+ if (index == encoder->history_first) {
+ /* This period is outside the recorded history */
+ spice_debug("period (%u-%u) outside known history (%u-%u)",
+ from, to,
+ encoder->history[encoder->history_first].mm_time,
+ encoder->history[encoder->history_last].mm_time);
+ return 0;
+ }
+ index = (index ? index : SPICE_GST_HISTORY_SIZE) - 1;
+ }
+
+}
+
+static void add_frame(SpiceGstEncoder *encoder, uint32_t frame_mm_time,
+ uint64_t duration, uint32_t size)
+{
+ /* Update the statistics */
+ uint32_t count = encoder->history_last +
+ (encoder->history_last < encoder->stat_first ? SPICE_GST_HISTORY_SIZE : 0) -
+ encoder->stat_first + 1;
+ if (count == SPICE_GST_FRAME_STATISTICS_COUNT) {
+ encoder->stat_duration_sum -= encoder->history[encoder->stat_first].duration;
+ encoder->stat_size_sum -= encoder->history[encoder->stat_first].size;
+ if (encoder->stat_size_max == encoder->history[encoder->stat_first].size) {
+ encoder->stat_size_max = 0;
+ }
+ encoder->stat_first = (encoder->stat_first + 1) % SPICE_GST_HISTORY_SIZE;
+ }
+ encoder->stat_duration_sum += duration;
+ encoder->stat_size_sum += size;
+ if (encoder->stat_size_max > 0 && size > encoder->stat_size_max) {
+ encoder->stat_size_max = size;
+ }
+
+ /* Update the frame history */
+ encoder->history_last = (encoder->history_last + 1) % SPICE_GST_HISTORY_SIZE;
+ if (encoder->history_last == encoder->history_first) {
+ encoder->history_first = (encoder->history_first + 1) % SPICE_GST_HISTORY_SIZE;
+ }
+ encoder->history[encoder->history_last].mm_time = frame_mm_time;
+ encoder->history[encoder->history_last].duration = duration;
+ encoder->history[encoder->history_last].size = size;
+}
+
+
+/* ---------- Encoder bit rate control ---------- */
+
+static void set_gstenc_bitrate(SpiceGstEncoder *encoder);
+
+static void set_video_bit_rate(SpiceGstEncoder *encoder, uint64_t bit_rate)
+{
+ if (encoder->video_bit_rate != bit_rate &&
+ encoder->gstenc_bitrate_is_dynamic) {
+ encoder->video_bit_rate = bit_rate;
+ set_gstenc_bitrate(encoder);
+
+ } else if (i64abs((int64_t)(bit_rate - encoder->video_bit_rate)) >
+ encoder->video_bit_rate * SPICE_GST_VIDEO_BITRATE_MARGIN) {
+ encoder->video_bit_rate = bit_rate;
+ set_pipeline_changes(encoder, SPICE_GST_VIDEO_PIPELINE_BITRATE);
+ }
+}
+
+static uint32_t get_min_playback_delay(SpiceGstEncoder *encoder)
+{
+ /* Make sure the delay is large enough to send a large frame (typically
+ * an I frame) and an average frame. This also takes into account the
+ * frames dropped by the encoder bit rate control.
+ */
+ uint32_t size = get_maximum_frame_size(encoder) + get_average_frame_size(encoder);
+ uint32_t send_time = ((uint64_t)MSEC_PER_SEC * 8) * size / encoder->bit_rate;
+
+ /* Also factor in the network latency with a margin for jitter. */
+ uint32_t net_latency = get_network_latency(encoder) * (1.0 + SPICE_GST_LATENCY_MARGIN);
+
+ return send_time + net_latency + get_average_encoding_time(encoder) / NSEC_PER_MILLISEC;
+}
+
+static void update_client_playback_delay(SpiceGstEncoder *encoder)
+{
+ if (encoder->cbs.update_client_playback_delay) {
+ uint32_t min_delay = get_min_playback_delay(encoder);
+ encoder->cbs.update_client_playback_delay(encoder->cbs.opaque, min_delay);
+ }
+}
+
+static void update_next_frame_mm_time(SpiceGstEncoder *encoder)
+{
+ uint64_t period_ns = NSEC_PER_SEC / get_source_fps(encoder);
+ uint64_t min_delay_ns = get_average_encoding_time(encoder);
+ if (min_delay_ns > period_ns) {
+ spice_warning("your system seems to be too slow to encode this %dx%d@%d video in real time",
+ encoder->width, encoder->height, get_source_fps(encoder));
+ }
+
+ min_delay_ns = MIN(min_delay_ns, SPICE_GST_MAX_PERIOD);
+ if (encoder->vbuffer_free >= 0) {
+ encoder->next_frame_mm_time = get_last_frame_mm_time(encoder) +
+ min_delay_ns / NSEC_PER_MILLISEC;
+ return;
+ }
+
+ /* Figure out how many frames to drop to not exceed the current bit rate.
+ * Use nanoseconds to avoid precision loss.
+ */
+ uint64_t delay_ns = -encoder->vbuffer_free * 8 * NSEC_PER_SEC / encoder->bit_rate;
+ uint32_t drops = (delay_ns + period_ns - 1) / period_ns; /* round up */
+ spice_debug("drops=%u vbuffer %d/%d", drops, encoder->vbuffer_free,
+ encoder->vbuffer_size);
+
+ delay_ns = drops * period_ns + period_ns / 2;
+ if (delay_ns > SPICE_GST_MAX_PERIOD) {
+ /* Reduce the video bit rate so we don't have to drop so many frames. */
+ if (encoder->video_bit_rate > encoder->bit_rate * SPICE_GST_BITRATE_MARGIN) {
+ set_video_bit_rate(encoder, encoder->bit_rate * SPICE_GST_BITRATE_MARGIN);
+ } else {
+ set_video_bit_rate(encoder, encoder->bit_rate);
+ }
+ delay_ns = SPICE_GST_MAX_PERIOD;
+ }
+ encoder->next_frame_mm_time = get_last_frame_mm_time(encoder) +
+ MAX(delay_ns, min_delay_ns) / NSEC_PER_MILLISEC;
+
+ /* Drops mean a higher delay between encoded frames so update the
+ * playback delay.
+ */
+ update_client_playback_delay(encoder);
+}
+
+
+/* ---------- Network bit rate control ---------- */
+
+/* The maximum bit rate we will use for the current video.
+ *
+ * This is based on a 10x compression ratio which should be more than enough
+ * for even MJPEG to provide good quality.
+ */
+static uint64_t get_bit_rate_cap(const SpiceGstEncoder *encoder)
+{
+ uint32_t raw_frame_bits = encoder->width * encoder->height * encoder->format->bpp;
+ return raw_frame_bits * get_source_fps(encoder) / 10;
+}
+
+static void set_bit_rate(SpiceGstEncoder *encoder, uint64_t bit_rate)
+{
+ if (bit_rate == 0) {
+ /* Use the default value */
+ bit_rate = SPICE_GST_DEFAULT_BITRATE;
+ }
+ if (bit_rate == encoder->bit_rate) {
+ return;
+ }
+ if (bit_rate < SPICE_GST_MIN_BITRATE) {
+ /* Don't let the bit rate go too low... */
+ bit_rate = SPICE_GST_MIN_BITRATE;
+ } else if (bit_rate > encoder->bit_rate) {
+ /* or too high */
+ bit_rate = MIN(bit_rate, get_bit_rate_cap(encoder));
+ }
+
+ if (bit_rate < encoder->min_bit_rate) {
+ encoder->min_bit_rate = bit_rate;
+ encoder->bit_rate_step = 0;
+ } else if (encoder->status == SPICE_GST_BITRATE_DECREASING &&
+ bit_rate > encoder->bit_rate) {
+ encoder->min_bit_rate = encoder->bit_rate;
+ encoder->bit_rate_step = 0;
+ } else if (encoder->status != SPICE_GST_BITRATE_DECREASING &&
+ bit_rate < encoder->bit_rate) {
+ encoder->max_bit_rate = encoder->bit_rate - SPICE_GST_MIN_BITRATE;
+ encoder->bit_rate_step = 0;
+ }
+ encoder->increase_interval = SPICE_GST_BITRATE_UP_INTERVAL;
+
+ if (encoder->bit_rate_step == 0) {
+ encoder->bit_rate_step = MAX(SPICE_GST_MIN_BITRATE,
+ MIN(SPICE_GST_BITRATE_MAX_STEP,
+ (encoder->max_bit_rate - encoder->min_bit_rate) / 10));
+ encoder->status = (bit_rate < encoder->bit_rate) ? SPICE_GST_BITRATE_DECREASING : SPICE_GST_BITRATE_INCREASING;
+ if (encoder->max_bit_rate / SPICE_GST_BITRATE_MARGIN < encoder->min_bit_rate) {
+ /* We have sufficiently narrowed down the optimal bit rate range.
+ * Settle on the lower end to keep a safety margin and stop
+ * rocking the boat.
+ */
+ bit_rate = encoder->min_bit_rate;
+ encoder->status = SPICE_GST_BITRATE_STABLE;
+ encoder->increase_interval = encoder->has_client_reports ? SPICE_GST_BITRATE_UP_CLIENT_STABLE : SPICE_GST_BITRATE_UP_SERVER_STABLE;
+ set_video_bit_rate(encoder, bit_rate);
+ }
+ }
+ spice_debug("%u set_bit_rate(%.3fMbps) eff %.3f %.3f-%.3f %d",
+ get_last_frame_mm_time(encoder) - encoder->last_change,
+ get_mbps(bit_rate), get_mbps(get_effective_bit_rate(encoder)),
+ get_mbps(encoder->min_bit_rate),
+ get_mbps(encoder->max_bit_rate), encoder->status);
+
+ encoder->last_change = get_last_frame_mm_time(encoder);
+ encoder->bit_rate = bit_rate;
+ /* Adjust the vbuffer size without ever increasing vbuffer_free to avoid
+ * sudden bit rate increases.
+ */
+ int32_t new_size = bit_rate * SPICE_GST_VBUFFER_SIZE / MSEC_PER_SEC / 8;
+ if (new_size < encoder->vbuffer_size && encoder->vbuffer_free > 0) {
+ encoder->vbuffer_free = MAX(0, encoder->vbuffer_free + new_size - encoder->vbuffer_size);
+ }
+ encoder->vbuffer_size = new_size;
+ update_next_frame_mm_time(encoder);
+
+ /* Frames preceding the bit rate change are not relevant to the current
+ * situation anymore.
+ */
+ encoder->stat_first = encoder->history_last;
+ encoder->stat_duration_sum = encoder->history[encoder->history_last].duration;
+ encoder->stat_size_sum = encoder->stat_size_max = encoder->history[encoder->history_last].size;
+
+ if (bit_rate > encoder->video_bit_rate) {
+ set_video_bit_rate(encoder, bit_rate * SPICE_GST_BITRATE_MARGIN);
+ }
+}
+
+static void increase_bit_rate(SpiceGstEncoder *encoder)
+{
+ if (get_effective_bit_rate(encoder) < encoder->bit_rate) {
+ /* The GStreamer encoder currently uses less bandwidth than allowed.
+ * So increasing the limit again makes no sense.
+ */
+ return;
+ }
+
+ if (encoder->bit_rate == encoder->max_bit_rate &&
+ get_last_frame_mm_time(encoder) - encoder->last_change > SPICE_GST_BITRATE_UP_RESET_MAX) {
+ /* The maximum bit rate seems to be sustainable so it was probably
+ * set too low. Probe for the maximum bit rate again.
+ */
+ encoder->max_bit_rate = get_bit_rate_cap(encoder);
+ encoder->status = SPICE_GST_BITRATE_INCREASING;
+ }
+
+ uint64_t new_bit_rate = MIN(encoder->bit_rate + encoder->bit_rate_step,
+ encoder->max_bit_rate);
+ spice_debug("increase bit rate to %.3fMbps %.3f-%.3fMbps %d",
+ get_mbps(new_bit_rate), get_mbps(encoder->min_bit_rate),
+ get_mbps(encoder->max_bit_rate), encoder->status);
+ set_bit_rate(encoder, new_bit_rate);
+}
+
+
+/* ---------- Server feedback ---------- */
+
+/* A helper for gst_encoder_encode_frame()
+ *
+ * Checks how many frames got dropped since the last encoded frame and
+ * adjusts the bit rate accordingly.
+ */
+static inline gboolean handle_server_drops(SpiceGstEncoder *encoder,
+ uint32_t frame_mm_time)
+{
+ if (encoder->server_drops == 0) {
+ return FALSE;
+ }
+
+ spice_debug("server report: got %u drops in %ums after %ums",
+ encoder->server_drops,
+ frame_mm_time - get_last_frame_mm_time(encoder),
+ frame_mm_time - encoder->last_change);
+
+ /* The server dropped a frame so clearly the buffer is full. */
+ encoder->vbuffer_free = MIN(encoder->vbuffer_free, 0);
+ /* Add a 0 byte frame so the time spent dropping frames is not counted as
+ * time during which the buffer was refilling. This implies dropping this
+ * frame.
+ */
+ add_frame(encoder, frame_mm_time, 0, 0);
+
+ if (encoder->server_drops >= get_source_fps(encoder)) {
+ spice_debug("cut the bit rate");
+ uint64_t bit_rate = (encoder->bit_rate == encoder->min_bit_rate) ?
+ encoder->bit_rate / SPICE_GST_BITRATE_CUT :
+ MAX(encoder->min_bit_rate, encoder->bit_rate / SPICE_GST_BITRATE_CUT);
+ set_bit_rate(encoder, bit_rate);
+
+ } else {
+ spice_debug("reduce the bit rate");
+ uint64_t bit_rate = (encoder->bit_rate == encoder->min_bit_rate) ?
+ encoder->bit_rate / SPICE_GST_BITRATE_REDUCE :
+ MAX(encoder->min_bit_rate, encoder->bit_rate / SPICE_GST_BITRATE_REDUCE);
+ set_bit_rate(encoder, bit_rate);
+ }
+ encoder->server_drops = 0;
+ return TRUE;
+}
+
+/* A helper for gst_encoder_encode_frame() */
+static inline void server_increase_bit_rate(SpiceGstEncoder *encoder,
+ uint32_t frame_mm_time)
+{
+ /* Let gst_encoder_client_stream_report() deal with bit rate increases if
+ * we receive client reports.
+ */
+ if (!encoder->has_client_reports && encoder->server_drops == 0 &&
+ frame_mm_time - encoder->last_change >= encoder->increase_interval) {
+ increase_bit_rate(encoder);
+ }
+}
+
+
+/* ---------- GStreamer pipeline ---------- */
+
+/* See GStreamer's part-mediatype-video-raw.txt and
+ * section-types-definitions.html documents.
+ */
+static const SpiceFormatForGStreamer format_map[] = {
+ /* First item is invalid.
+ * It's located first so the loop catch invalid values.
+ */
+ FMT_DESC(SPICE_BITMAP_FMT_INVALID, 0, "", GST_VIDEO_FORMAT_UNKNOWN),
+ FMT_DESC(SPICE_BITMAP_FMT_RGBA, 32, "BGRA", GST_VIDEO_FORMAT_BGRA),
+ FMT_DESC(SPICE_BITMAP_FMT_16BIT, 16, "RGB15", GST_VIDEO_FORMAT_RGB15),
+ FMT_DESC(SPICE_BITMAP_FMT_32BIT, 32, "BGRx", GST_VIDEO_FORMAT_BGRx),
+ FMT_DESC(SPICE_BITMAP_FMT_24BIT, 24, "BGR", GST_VIDEO_FORMAT_BGR),
+};
+#define GSTREAMER_FORMAT_INVALID (&format_map[0])
+
+/* A helper for spice_gst_encoder_encode_frame() */
+static const SpiceFormatForGStreamer *map_format(SpiceBitmapFmt format)
+{
+ int i;
+ for (i = 0; i < G_N_ELEMENTS(format_map); i++) {
+ if (format_map[i].spice_format == format) {
+ return &format_map[i];
+ }
+ }
+
+ return GSTREAMER_FORMAT_INVALID;
+}
+
+static void set_appsrc_caps(SpiceGstEncoder *encoder)
+{
+ if (encoder->src_caps) {
+ gst_caps_unref(encoder->src_caps);
+ }
+ encoder->src_caps = gst_caps_new_simple(
+ "video/x-raw",
+ "format", G_TYPE_STRING, encoder->format->format,
+ "width", G_TYPE_INT, encoder->width,
+ "height", G_TYPE_INT, encoder->height,
+ "framerate", GST_TYPE_FRACTION, get_source_fps(encoder), 1,
+ NULL);
+ gst_app_src_set_caps(encoder->appsrc, encoder->src_caps);
+}
+
+static GstBusSyncReply handle_pipeline_message(GstBus *bus, GstMessage *msg, gpointer video_encoder)
+{
+ SpiceGstEncoder *encoder = (SpiceGstEncoder*) video_encoder;
+
+ if (GST_MESSAGE_TYPE(msg) == GST_MESSAGE_ERROR) {
+ GError *err = NULL;
+ gchar *debug_info = NULL;
+ gst_message_parse_error(msg, &err, &debug_info);
+ spice_warning("GStreamer error from element %s: %s",
+ GST_OBJECT_NAME(msg->src), err->message);
+ if (debug_info) {
+ spice_debug("debug details: %s", debug_info);
+ g_free(debug_info);
+ }
+ g_clear_error(&err);
+
+ /* Unblock the main thread */
+ pthread_mutex_lock(&encoder->outbuf_mutex);
+ encoder->outbuf = (VideoBuffer*)create_gst_video_buffer();
+ pthread_cond_signal(&encoder->outbuf_cond);
+ pthread_mutex_unlock(&encoder->outbuf_mutex);
+ }
+ return GST_BUS_PASS;
+}
+
+static GstFlowReturn new_sample(GstAppSink *gstappsink, gpointer video_encoder)
+{
+ SpiceGstEncoder *encoder = (SpiceGstEncoder*)video_encoder;
+ SpiceGstVideoBuffer *outbuf = create_gst_video_buffer();
+
+ GstSample *sample = gst_app_sink_pull_sample(encoder->appsink);
+ if (sample) {
+ outbuf->gst_buffer = gst_sample_get_buffer(sample);
+ gst_buffer_ref(outbuf->gst_buffer);
+ gst_sample_unref(sample);
+ if (gst_buffer_map(outbuf->gst_buffer, &outbuf->map, GST_MAP_READ)) {
+ outbuf->base.data = outbuf->map.data;
+ outbuf->base.size = gst_buffer_get_size(outbuf->gst_buffer);
+ }
+ }
+
+ /* Notify the main thread that the output buffer is ready */
+ pthread_mutex_lock(&encoder->outbuf_mutex);
+ encoder->outbuf = (VideoBuffer*)outbuf;
+ pthread_cond_signal(&encoder->outbuf_cond);
+ pthread_mutex_unlock(&encoder->outbuf_mutex);
+
+ return GST_FLOW_OK;
+}
+
+static const gchar* get_gst_codec_name(const SpiceGstEncoder *encoder)
+{
+ switch (encoder->base.codec_type)
+ {
+ case SPICE_VIDEO_CODEC_TYPE_MJPEG:
+ return "avenc_mjpeg";
+ case SPICE_VIDEO_CODEC_TYPE_VP8:
+ return "vp8enc";
+ case SPICE_VIDEO_CODEC_TYPE_H264:
+ return "x264enc";
+ case SPICE_VIDEO_CODEC_TYPE_VP9:
+ return "vp9enc";
+ default:
+ /* gstreamer_encoder_new() should have rejected this codec type */
+ spice_warning("unsupported codec type %d", encoder->base.codec_type);
+ return NULL;
+ }
+}
+
+/* At this time, only the following formats are supported by x264enc. */
+static const char valid_formats[][10] = {
+ { "Y444" },
+ { "Y42B" },
+ { "I420" },
+ { "YV12" },
+ { "NV12" },
+ { "GRAY8" },
+ { "Y444_10LE" },
+ { "I422_10LE" },
+ { "I420_10LE" },
+};
+
+static gpointer get_pref_format_once(gpointer data)
+{
+ const gchar *pref_format = getenv("SPICE_CONVERTER_PREFERRED_FORMAT");
+ int i;
+
+ if (pref_format) {
+ for (i = 0; i < G_N_ELEMENTS(valid_formats); i++) {
+ if (strcmp(valid_formats[i], pref_format) == 0) {
+ return g_strdup_printf("videoconvert ! video/x-raw,format=%s",
+ pref_format);
+ }
+ }
+ }
+ return g_strdup("videoconvert");
+}
+
+static gchar *get_gst_converter(void)
+{
+ static GOnce gst_once = G_ONCE_INIT;
+
+ g_once(&gst_once, get_pref_format_once, NULL);
+ return g_strdup(gst_once.retval);
+}
+
+static gboolean create_pipeline(SpiceGstEncoder *encoder)
+{
+ const gchar* gstenc_name = get_gst_codec_name(encoder);
+ if (!gstenc_name) {
+ return FALSE;
+ }
+ gchar* converter = get_gst_converter();
+ gchar* gstenc_opts;
+ switch (encoder->base.codec_type)
+ {
+ case SPICE_VIDEO_CODEC_TYPE_MJPEG:
+ gstenc_opts = g_strdup("");
+ break;
+ case SPICE_VIDEO_CODEC_TYPE_VP9:
+ case SPICE_VIDEO_CODEC_TYPE_VP8: {
+ /* See http://www.webmproject.org/docs/encoder-parameters/
+ * - Set mode/end-usage to get a constant bitrate to help with
+ * streaming.
+ * - min-quantizer ensures the bitrate does not get needlessly high.
+ * - resize-allowed would be useful for low bitrate situations but
+ * the decoder does not return a frame of the expected size so
+ * avoid it.
+ * - error-resilient minimises artifacts in case the client drops a
+ * frame.
+ * - Set lag-in-frames, deadline and cpu-used to match
+ * "Profile Realtime". max-latency/lag-in-frames ensures zero-frame
+ * latency, deadline turns on realtime behavior, cpu-used targets a
+ * 75% CPU usage while speed simply prioritizes encoding speed.
+ * - deadline is supposed to be set in microseconds but in practice
+ * it behaves like a boolean.
+ */
+ gstenc_opts = g_strdup_printf("end-usage=cbr min-quantizer=10 error-resilient=default lag-in-frames=0 deadline=1 cpu-used=4");
+ break;
+ }
+ case SPICE_VIDEO_CODEC_TYPE_H264:
+ /* - Set tune and sliced-threads to ensure a zero-frame latency
+ * - qp-min ensures the bitrate does not get needlessly high.
+ * - qp-max ensures the compression does not go so high that the video
+ * is unrecognizable. When that threshold is reached it is better to
+ * drop frames to lower the bit rate further.
+ * - Set speed-preset to get realtime speed.
+ * - Set intra-refresh to get more uniform compressed frame sizes,
+ * thus helping with streaming.
+ */
+ gstenc_opts = g_strdup("byte-stream=true aud=true qp-min=15 qp-max=35 tune=4 sliced-threads=true speed-preset=ultrafast intra-refresh=true");
+ break;
+ default:
+ /* gstreamer_encoder_new() should have rejected this codec type */
+ spice_warning("unsupported codec type %d", encoder->base.codec_type);
+ g_free(converter);
+ return FALSE;
+ }
+
+ GError *err = NULL;
+ gchar *desc = g_strdup_printf("appsrc is-live=true format=time do-timestamp=true name=src !"
+ " %s ! %s name=encoder %s ! appsink name=sink",
+ converter, gstenc_name, gstenc_opts);
+ spice_debug("GStreamer pipeline: %s", desc);
+ encoder->pipeline = gst_parse_launch_full(desc, NULL, GST_PARSE_FLAG_FATAL_ERRORS, &err);
+ g_free(converter);
+ g_free(gstenc_opts);
+ g_free(desc);
+ if (!encoder->pipeline || err) {
+ spice_warning("GStreamer error: %s", err->message);
+ g_clear_error(&err);
+ if (encoder->pipeline) {
+ gst_object_unref(encoder->pipeline);
+ encoder->pipeline = NULL;
+ }
+ return FALSE;
+ }
+ encoder->appsrc = GST_APP_SRC(gst_bin_get_by_name(GST_BIN(encoder->pipeline), "src"));
+ encoder->gstenc = gst_bin_get_by_name(GST_BIN(encoder->pipeline), "encoder");
+ encoder->appsink = GST_APP_SINK(gst_bin_get_by_name(GST_BIN(encoder->pipeline), "sink"));
+
+ GstAppSinkCallbacks appsink_cbs = {NULL, NULL, &new_sample, ._gst_reserved={NULL}};
+ gst_app_sink_set_callbacks(encoder->appsink, &appsink_cbs, encoder, NULL);
+
+ /* Hook into the bus so we can handle errors */
+ GstBus *bus = gst_element_get_bus(encoder->pipeline);
+ gst_bus_set_sync_handler(bus, handle_pipeline_message, encoder, NULL);
+ gst_object_unref(bus);
+
+ if (encoder->base.codec_type == SPICE_VIDEO_CODEC_TYPE_MJPEG) {
+ /* See https://bugzilla.gnome.org/show_bug.cgi?id=753257 */
+ spice_debug("removing the pipeline clock");
+ gst_pipeline_use_clock(GST_PIPELINE(encoder->pipeline), NULL);
+ }
+
+ /* Figure out which parameter controls the GStreamer encoder's bitrate */
+ GObjectClass *klass = G_OBJECT_GET_CLASS(encoder->gstenc);
+ encoder->gstenc_bitrate_param = g_object_class_find_property(klass, "bitrate");
+ if (encoder->gstenc_bitrate_param == NULL) {
+ encoder->gstenc_bitrate_param = g_object_class_find_property(klass, "target-bitrate");
+ }
+ if (encoder->gstenc_bitrate_param) {
+ encoder->gstenc_bitrate_is_dynamic = (encoder->gstenc_bitrate_param->flags & GST_PARAM_MUTABLE_PLAYING);
+ } else {
+ spice_warning("GStreamer error: could not find the %s bitrate parameter", gstenc_name);
+ }
+
+ set_pipeline_changes(encoder, SPICE_GST_VIDEO_PIPELINE_STATE |
+ SPICE_GST_VIDEO_PIPELINE_BITRATE |
+ SPICE_GST_VIDEO_PIPELINE_CAPS);
+
+ return TRUE;
+}
+
+/* A helper for configure_pipeline() */
+static void set_gstenc_bitrate(SpiceGstEncoder *encoder)
+{
+ GParamSpec *param = encoder->gstenc_bitrate_param;
+ if (!param) {
+ return;
+ }
+
+ uint64_t gst_bit_rate = encoder->video_bit_rate;
+ if (strstr(g_param_spec_get_blurb(param), "kbit")) {
+ gst_bit_rate = gst_bit_rate / 1024;
+ }
+
+ GObject * gobject = G_OBJECT(encoder->gstenc);
+ const gchar *prop = g_param_spec_get_name(param);
+ switch (param->value_type) {
+ case G_TYPE_INT: {
+ GParamSpecInt *range = G_PARAM_SPEC_INT(param);
+ gst_bit_rate = MAX(range->minimum, MIN(range->maximum, gst_bit_rate));
+ g_object_set(gobject, prop, (gint)gst_bit_rate, NULL);
+ break;
+ }
+ case G_TYPE_UINT: {
+ GParamSpecUInt *range = G_PARAM_SPEC_UINT(param);
+ gst_bit_rate = MAX(range->minimum, MIN(range->maximum, gst_bit_rate));
+ g_object_set(gobject, prop, (guint)gst_bit_rate, NULL);
+ break;
+ }
+ case G_TYPE_LONG: {
+ GParamSpecLong *range = G_PARAM_SPEC_LONG(param);
+ gst_bit_rate = MAX(range->minimum, MIN(range->maximum, gst_bit_rate));
+ g_object_set(gobject, prop, (glong)gst_bit_rate, NULL);
+ break;
+ }
+ case G_TYPE_ULONG: {
+ GParamSpecULong *range = G_PARAM_SPEC_ULONG(param);
+ gst_bit_rate = MAX(range->minimum, MIN(range->maximum, gst_bit_rate));
+ g_object_set(gobject, prop, (gulong)gst_bit_rate, NULL);
+ break;
+ }
+ case G_TYPE_INT64: {
+ GParamSpecInt64 *range = G_PARAM_SPEC_INT64(param);
+ gst_bit_rate = MAX(range->minimum, MIN(range->maximum, gst_bit_rate));
+ g_object_set(gobject, prop, (gint64)gst_bit_rate, NULL);
+ break;
+ }
+ case G_TYPE_UINT64: {
+ GParamSpecUInt64 *range = G_PARAM_SPEC_UINT64(param);
+ gst_bit_rate = MAX(range->minimum, MIN(range->maximum, gst_bit_rate));
+ g_object_set(gobject, prop, (guint64)gst_bit_rate, NULL);
+ break;
+ }
+ default:
+ spice_warning("the %s property has an unsupported type %" G_GSIZE_FORMAT,
+ prop, param->value_type);
+ }
+ spice_debug("setting the GStreamer %s to %" G_GUINT64_FORMAT, prop, gst_bit_rate);
+}
+
+/* A helper for spice_gst_encoder_encode_frame() */
+static gboolean configure_pipeline(SpiceGstEncoder *encoder)
+{
+ if (!encoder->pipeline && !create_pipeline(encoder)) {
+ return FALSE;
+ }
+ if (!encoder->set_pipeline) {
+ return TRUE;
+ }
+
+ /* If the pipeline state does not need to be changed it's because it is
+ * already in the PLAYING state. So first set it to the NULL state so it
+ * can be (re)configured.
+ */
+ if (!(encoder->set_pipeline & SPICE_GST_VIDEO_PIPELINE_STATE) &&
+ gst_element_set_state(encoder->pipeline, GST_STATE_NULL) == GST_STATE_CHANGE_FAILURE) {
+ spice_debug("GStreamer error: could not stop the pipeline");
+ free_pipeline(encoder);
+ return FALSE;
+ }
+
+ /* Configure the encoder bitrate */
+ if (encoder->set_pipeline & SPICE_GST_VIDEO_PIPELINE_BITRATE) {
+ set_gstenc_bitrate(encoder);
+ }
+
+ /* Set the source caps */
+ if (encoder->set_pipeline & SPICE_GST_VIDEO_PIPELINE_CAPS) {
+ set_appsrc_caps(encoder);
+ }
+
+ /* Start playing */
+ if (gst_element_set_state(encoder->pipeline, GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE) {
+ spice_warning("GStreamer error: unable to set the pipeline to the playing state");
+ free_pipeline(encoder);
+ return FALSE;
+ }
+
+ encoder->set_pipeline = 0;
+ return TRUE;
+}
+
+/* A helper for the *_copy() functions */
+static int is_chunk_stride_aligned(const SpiceBitmap *bitmap, uint32_t index)
+{
+ SpiceChunks *chunks = bitmap->data;
+ if (chunks->chunk[index].len % bitmap->stride != 0) {
+ /* A line straddles two chunks. This is not supported */
+ spice_warning("chunk %d/%d contains an incomplete line, cannot copy",
+ index, chunks->num_chunks);
+ return FALSE;
+ }
+ return TRUE;
+}
+
+typedef struct {
+ gint refs;
+ SpiceGstEncoder *encoder;
+ gpointer opaque;
+} BitmapWrapper;
+
+static void clear_zero_copy_queue(SpiceGstEncoder *encoder, gboolean unref_queue)
+{
+ gpointer bitmap_opaque;
+ while ((bitmap_opaque = g_async_queue_try_pop(encoder->unused_bitmap_opaques))) {
+ encoder->bitmap_unref(bitmap_opaque);
+ }
+ if (unref_queue) {
+ g_async_queue_unref(encoder->unused_bitmap_opaques);
+ }
+}
+
+static BitmapWrapper *bitmap_wrapper_new(SpiceGstEncoder *encoder, gpointer bitmap_opaque)
+{
+ BitmapWrapper *wrapper = g_new(BitmapWrapper, 1);
+ wrapper->refs = 1;
+ wrapper->encoder = encoder;
+ wrapper->opaque = bitmap_opaque;
+ encoder->bitmap_ref(bitmap_opaque);
+ return wrapper;
+}
+
+static void bitmap_wrapper_unref(gpointer data)
+{
+ BitmapWrapper *wrapper = (BitmapWrapper*) data;
+ if (g_atomic_int_dec_and_test(&wrapper->refs)) {
+ g_async_queue_push(wrapper->encoder->unused_bitmap_opaques, wrapper->opaque);
+ g_free(wrapper);
+ }
+}
+
+
+/* A helper for push_raw_frame() */
+static inline int zero_copy(SpiceGstEncoder *encoder,
+ const SpiceBitmap *bitmap, gpointer bitmap_opaque,
+ GstBuffer *buffer, uint32_t *chunk_index,
+ uint32_t *chunk_offset, uint32_t *len)
+{
+ const SpiceChunks *chunks = bitmap->data;
+ while (*chunk_index < chunks->num_chunks &&
+ *chunk_offset >= chunks->chunk[*chunk_index].len) {
+ if (!is_chunk_stride_aligned(bitmap, *chunk_index)) {
+ return FALSE;
+ }
+ *chunk_offset -= chunks->chunk[*chunk_index].len;
+ (*chunk_index)++;
+ }
+
+ int max_block_count = gst_buffer_get_max_memory();
+ if (chunks->num_chunks - *chunk_index > max_block_count) {
+ /* There are more chunks than we can fit memory objects in a
+ * buffer. This will cause the buffer to merge memory objects to
+ * fit the extra chunks, which means doing wasteful memory copies.
+ * So use the zero-copy approach for the first max_mem-1 chunks, and
+ * let push_raw_frame() deal with the rest.
+ */
+ max_block_count = *chunk_index + max_block_count - 1;
+ } else {
+ max_block_count = chunks->num_chunks;
+ }
+
+ BitmapWrapper *wrapper = NULL;
+ while (*len && *chunk_index < max_block_count) {
+ if (!is_chunk_stride_aligned(bitmap, *chunk_index)) {
+ return FALSE;
+ }
+ if (wrapper) {
+ g_atomic_int_inc(&wrapper->refs);
+ } else {
+ wrapper = bitmap_wrapper_new(encoder, bitmap_opaque);
+ }
+ uint32_t thislen = MIN(chunks->chunk[*chunk_index].len - *chunk_offset, *len);
+ GstMemory *mem = gst_memory_new_wrapped(GST_MEMORY_FLAG_READONLY,
+ chunks->chunk[*chunk_index].data,
+ chunks->chunk[*chunk_index].len,
+ *chunk_offset, thislen,
+ wrapper, bitmap_wrapper_unref);
+ gst_buffer_append_memory(buffer, mem);
+ *len -= thislen;
+ *chunk_offset = 0;
+ (*chunk_index)++;
+ }
+ return TRUE;
+}
+
+/* A helper for push_raw_frame() */
+static inline int line_copy(SpiceGstEncoder *encoder, const SpiceBitmap *bitmap,
+ uint32_t chunk_offset, uint32_t stream_stride,
+ uint32_t height, uint8_t *buffer)
+{
+ uint8_t *dst = buffer;
+ SpiceChunks *chunks = bitmap->data;
+ uint32_t chunk_index = 0;
+ for (int l = 0; l < height; l++) {
+ /* We may have to move forward by more than one chunk the first
+ * time around. This also protects us against 0-byte chunks.
+ */
+ while (chunk_offset >= chunks->chunk[chunk_index].len) {
+ if (!is_chunk_stride_aligned(bitmap, chunk_index)) {
+ return FALSE;
+ }
+ chunk_offset -= chunks->chunk[chunk_index].len;
+ chunk_index++;
+ }
+
+ /* Copy the line */
+ uint8_t *src = chunks->chunk[chunk_index].data + chunk_offset;
+ memcpy(dst, src, MIN(stream_stride, bitmap->stride));
+ dst += stream_stride;
+ chunk_offset += bitmap->stride;
+ }
+ spice_return_val_if_fail(dst - buffer == stream_stride * height, FALSE);
+ return TRUE;
+}
+
+/* A helper for push_raw_frame() */
+static inline int chunk_copy(SpiceGstEncoder *encoder, const SpiceBitmap *bitmap,
+ uint32_t chunk_index, uint32_t chunk_offset,
+ uint32_t len, uint8_t *dst)
+{
+ SpiceChunks *chunks = bitmap->data;
+ /* Skip chunks until we find the start of the frame */
+ while (chunk_index < chunks->num_chunks &&
+ chunk_offset >= chunks->chunk[chunk_index].len) {
+ if (!is_chunk_stride_aligned(bitmap, chunk_index)) {
+ return FALSE;
+ }
+ chunk_offset -= chunks->chunk[chunk_index].len;
+ chunk_index++;
+ }
+
+ /* We can copy the frame chunk by chunk */
+ while (len && chunk_index < chunks->num_chunks) {
+ if (!is_chunk_stride_aligned(bitmap, chunk_index)) {
+ return FALSE;
+ }
+ uint8_t *src = chunks->chunk[chunk_index].data + chunk_offset;
+ uint32_t thislen = MIN(chunks->chunk[chunk_index].len - chunk_offset, len);
+ memcpy(dst, src, thislen);
+ dst += thislen;
+ len -= thislen;
+ chunk_offset = 0;
+ chunk_index++;
+ }
+ spice_return_val_if_fail(len == 0, FALSE);
+ return TRUE;
+}
+
+/* A helper for push_raw_frame()
+ * Note: In case of error the buffer is unref-ed.
+ */
+static uint8_t *allocate_and_map_memory(gsize size, GstMapInfo *map, GstBuffer *buffer)
+{
+ GstMemory *mem = gst_allocator_alloc(NULL, size, NULL);
+ if (!mem) {
+ gst_buffer_unref(buffer);
+ return NULL;
+ }
+ if (!gst_memory_map(mem, map, GST_MAP_WRITE)) {
+ gst_memory_unref(mem);
+ gst_buffer_unref(buffer);
+ return NULL;
+ }
+ return map->data;
+}
+
+static void unmap_and_release_memory(GstMapInfo *map, GstBuffer *buffer)
+{
+ gst_memory_unmap(map->memory, map);
+ gst_memory_unref(map->memory);
+ gst_buffer_unref(buffer);
+}
+
+/* A helper for spice_gst_encoder_encode_frame() */
+static VideoEncodeResults
+push_raw_frame(SpiceGstEncoder *encoder,
+ const SpiceBitmap *bitmap,
+ const SpiceRect *src, int top_down,
+ gpointer bitmap_opaque)
+{
+ uint32_t height = src->bottom - src->top;
+ // GStreamer require the stream to be 4 bytes aligned
+ uint32_t stream_stride = GST_ROUND_UP_4((src->right - src->left) * encoder->format->bpp / 8);
+ uint32_t len = stream_stride * height;
+ GstBuffer *buffer = gst_buffer_new();
+ /* TODO Use GST_MAP_INFO_INIT once GStreamer 1.4.5 is no longer relevant */
+ GstMapInfo map = { .memory = NULL };
+
+ /* Note that we should not reorder the lines, even if top_down is false.
+ * It just changes the number of lines to skip at the start of the bitmap.
+ */
+ uint32_t skip_lines = top_down ? src->top : bitmap->y - (src->bottom - 0);
+ uint32_t chunk_offset = bitmap->stride * skip_lines;
+
+ if (stream_stride != bitmap->stride) {
+ /* We have to do a line-by-line copy because for each we have to
+ * leave out pixels on the left or right.
+ */
+ uint8_t *dst = allocate_and_map_memory(len, &map, buffer);
+ if (!dst) {
+ return VIDEO_ENCODER_FRAME_UNSUPPORTED;
+ }
+
+ chunk_offset += src->left * encoder->format->bpp / 8;
+ if (!line_copy(encoder, bitmap, chunk_offset, stream_stride, height, dst)) {
+ unmap_and_release_memory(&map, buffer);
+ return VIDEO_ENCODER_FRAME_UNSUPPORTED;
+ }
+ } else {
+ /* We can copy the bitmap chunk by chunk */
+ uint32_t chunk_index = 0;
+ if (!zero_copy(encoder, bitmap, bitmap_opaque, buffer, &chunk_index,
+ &chunk_offset, &len)) {
+ gst_buffer_unref(buffer);
+ return VIDEO_ENCODER_FRAME_UNSUPPORTED;
+ }
+ /* len now contains the remaining number of bytes to copy.
+ * However we must avoid any write to the GstBuffer object as it
+ * would cause a copy of the read-only memory objects we just added.
+ * Fortunately we can append extra writable memory objects instead.
+ */
+
+ if (len) {
+ uint8_t *dst = allocate_and_map_memory(len, &map, buffer);
+ if (!dst) {
+ return VIDEO_ENCODER_FRAME_UNSUPPORTED;
+ }
+ if (!chunk_copy(encoder, bitmap, chunk_index, chunk_offset,
+ len, dst)) {
+ unmap_and_release_memory(&map, buffer);
+ return VIDEO_ENCODER_FRAME_UNSUPPORTED;
+ }
+ }
+ }
+ if (map.memory) {
+ gst_memory_unmap(map.memory, &map);
+ gst_buffer_append_memory(buffer, map.memory);
+ }
+
+ GstFlowReturn ret = gst_app_src_push_buffer(encoder->appsrc, buffer);
+ if (ret != GST_FLOW_OK) {
+ spice_warning("GStreamer error: unable to push source buffer (%d)", ret);
+ return VIDEO_ENCODER_FRAME_UNSUPPORTED;
+ }
+
+ return VIDEO_ENCODER_FRAME_ENCODE_DONE;
+}
+
+/* A helper for spice_gst_encoder_encode_frame() */
+static VideoEncodeResults
+pull_compressed_buffer(SpiceGstEncoder *encoder, VideoBuffer **outbuf)
+{
+ pthread_mutex_lock(&encoder->outbuf_mutex);
+ while (!encoder->outbuf) {
+ pthread_cond_wait(&encoder->outbuf_cond, &encoder->outbuf_mutex);
+ }
+ *outbuf = encoder->outbuf;
+ encoder->outbuf = NULL;
+ pthread_mutex_unlock(&encoder->outbuf_mutex);
+
+ if ((*outbuf)->data) {
+ return VIDEO_ENCODER_FRAME_ENCODE_DONE;
+ }
+
+ spice_debug("failed to pull the compressed buffer");
+ (*outbuf)->free(*outbuf);
+ *outbuf = NULL;
+ return VIDEO_ENCODER_FRAME_UNSUPPORTED;
+}
+
+
+/* ---------- VideoEncoder's public API ---------- */
+
+static void spice_gst_encoder_destroy(VideoEncoder *video_encoder)
+{
+ SpiceGstEncoder *encoder = (SpiceGstEncoder*)video_encoder;
+
+ free_pipeline(encoder);
+ pthread_mutex_destroy(&encoder->outbuf_mutex);
+ pthread_cond_destroy(&encoder->outbuf_cond);
+
+ /* Unref any lingering bitmap opaque structures from past frames */
+ clear_zero_copy_queue(encoder, TRUE);
+
+ g_free(encoder);
+}
+
+static VideoEncodeResults
+spice_gst_encoder_encode_frame(VideoEncoder *video_encoder,
+ uint32_t frame_mm_time,
+ const SpiceBitmap *bitmap,
+ const SpiceRect *src, int top_down,
+ gpointer bitmap_opaque,
+ VideoBuffer **outbuf)
+{
+ SpiceGstEncoder *encoder = (SpiceGstEncoder*)video_encoder;
+ g_return_val_if_fail(outbuf != NULL, VIDEO_ENCODER_FRAME_UNSUPPORTED);
+ *outbuf = NULL;
+
+ /* Unref the last frame's bitmap_opaque structures if any */
+ clear_zero_copy_queue(encoder, FALSE);
+
+ uint32_t width = src->right - src->left;
+ uint32_t height = src->bottom - src->top;
+ if (width != encoder->width || height != encoder->height ||
+ encoder->spice_format != bitmap->format) {
+ spice_debug("video format change: width %d -> %d, height %d -> %d, format %d -> %d",
+ encoder->width, width, encoder->height, height,
+ encoder->spice_format, bitmap->format);
+ encoder->format = map_format((SpiceBitmapFmt) bitmap->format);
+ if (encoder->format == GSTREAMER_FORMAT_INVALID) {
+ spice_warning("unable to map format type %d", bitmap->format);
+ encoder->errors = 4;
+ return VIDEO_ENCODER_FRAME_UNSUPPORTED;
+ }
+ encoder->spice_format = (SpiceBitmapFmt) bitmap->format;
+ encoder->width = width;
+ encoder->height = height;
+ if (encoder->bit_rate == 0) {
+ encoder->history[0].mm_time = frame_mm_time;
+ encoder->max_bit_rate = get_bit_rate_cap(encoder);
+ encoder->min_bit_rate = SPICE_GST_MIN_BITRATE;
+ encoder->status = SPICE_GST_BITRATE_DECREASING;
+ set_bit_rate(encoder, encoder->starting_bit_rate);
+ encoder->vbuffer_free = 0; /* Slow start */
+ } else if (encoder->pipeline) {
+ set_pipeline_changes(encoder, SPICE_GST_VIDEO_PIPELINE_CAPS);
+ }
+ encoder->errors = 0;
+ } else if (encoder->errors >= 3) {
+ /* The pipeline keeps failing to handle the frames we send it, which
+ * is usually because they are too small (mouse pointer-sized).
+ * So give up until something changes.
+ */
+ if (encoder->errors == 3) {
+ spice_debug("%s cannot compress %dx%d:%dbpp frames",
+ get_gst_codec_name(encoder), encoder->width,
+ encoder->height, encoder->format->bpp);
+ encoder->errors++;
+ }
+ return VIDEO_ENCODER_FRAME_UNSUPPORTED;
+ }
+
+ if (handle_server_drops(encoder, frame_mm_time) ||
+ frame_mm_time < encoder->next_frame_mm_time) {
+ /* Drop the frame to limit the outgoing bit rate. */
+ return VIDEO_ENCODER_FRAME_DROP;
+ }
+
+ if (!configure_pipeline(encoder)) {
+ encoder->errors++;
+ return VIDEO_ENCODER_FRAME_UNSUPPORTED;
+ }
+
+ uint64_t start = spice_get_monotonic_time_ns();
+ VideoEncodeResults rc = push_raw_frame(encoder, bitmap, src, top_down, bitmap_opaque);
+ if (rc == VIDEO_ENCODER_FRAME_ENCODE_DONE) {
+ rc = pull_compressed_buffer(encoder, outbuf);
+ if (rc != VIDEO_ENCODER_FRAME_ENCODE_DONE) {
+ /* The input buffer will be stuck in the pipeline, preventing
+ * later ones from being processed. Furthermore something went
+ * wrong with this pipeline, so it may be safer to rebuild it
+ * from scratch.
+ */
+ free_pipeline(encoder);
+ encoder->errors++;
+ }
+ }
+
+ /* Unref the last frame's bitmap_opaque structures if any */
+ clear_zero_copy_queue(encoder, FALSE);
+
+ if (rc != VIDEO_ENCODER_FRAME_ENCODE_DONE) {
+ return rc;
+ }
+ uint32_t last_mm_time = get_last_frame_mm_time(encoder);
+ add_frame(encoder, frame_mm_time, spice_get_monotonic_time_ns() - start,
+ (*outbuf)->size);
+
+ int32_t refill = encoder->bit_rate * (frame_mm_time - last_mm_time) / MSEC_PER_SEC / 8;
+ encoder->vbuffer_free = MIN(encoder->vbuffer_free + refill,
+ encoder->vbuffer_size) - (*outbuf)->size;
+
+ server_increase_bit_rate(encoder, frame_mm_time);
+ update_next_frame_mm_time(encoder);
+
+ return rc;
+}
+
+static void spice_gst_encoder_client_stream_report(VideoEncoder *video_encoder,
+ uint32_t num_frames,
+ uint32_t num_drops,
+ uint32_t start_frame_mm_time,
+ uint32_t end_frame_mm_time,
+ int32_t video_margin,
+ uint32_t audio_margin)
+{
+ SpiceGstEncoder *encoder = (SpiceGstEncoder*)video_encoder;
+ encoder->has_client_reports = TRUE;
+
+ encoder->max_video_margin = MAX(encoder->max_video_margin, video_margin);
+ encoder->max_audio_margin = MAX(encoder->max_audio_margin, audio_margin);
+ int32_t margin_delta = video_margin - encoder->last_video_margin;
+ encoder->last_video_margin = video_margin;
+
+ uint64_t period_bit_rate = get_period_bit_rate(encoder, start_frame_mm_time, end_frame_mm_time);
+ spice_debug("client report: %u/%u drops in %ums margins video %3d/%3d audio %3u/%3u bw %.3f/%.3fMbps%s",
+ num_drops, num_frames, end_frame_mm_time - start_frame_mm_time,
+ video_margin, encoder->max_video_margin,
+ audio_margin, encoder->max_audio_margin,
+ get_mbps(period_bit_rate),
+ get_mbps(get_effective_bit_rate(encoder)),
+ start_frame_mm_time < encoder->last_change ? " obsolete" : "");
+ if (encoder->status == SPICE_GST_BITRATE_DECREASING &&
+ start_frame_mm_time < encoder->last_change) {
+ /* Some of this data predates the last bit rate reduction
+ * so it is obsolete.
+ */
+ return;
+ }
+
+ /* We normally arrange for even the largest frames to arrive a bit over
+ * one period before they should be displayed.
+ */
+ uint32_t min_margin = MSEC_PER_SEC / get_source_fps(encoder) +
+ get_network_latency(encoder) * SPICE_GST_LATENCY_MARGIN;
+
+ /* A low video margin indicates that the bit rate is too high. */
+ uint32_t score;
+ if (num_drops) {
+ score = 4;
+ } else if (margin_delta >= 0) {
+ /* The situation was bad but seems to be improving */
+ score = 0;
+ } else if (video_margin < min_margin * SPICE_GST_VIDEO_MARGIN_BAD ||
+ video_margin < encoder->max_video_margin * SPICE_GST_VIDEO_MARGIN_BAD) {
+ score = 3;
+ } else if (video_margin < min_margin ||
+ video_margin < encoder->max_video_margin * SPICE_GST_VIDEO_MARGIN_AVERAGE) {
+ score = 2;
+ } else if (video_margin < encoder->max_video_margin * SPICE_GST_VIDEO_MARGIN_GOOD) {
+ score = 1;
+ } else {
+ score = 0;
+ }
+ /* A fast dropping video margin is a compounding factor. */
+ if (margin_delta < -abs(encoder->max_video_margin) * SPICE_GST_VIDEO_DELTA_BAD) {
+ score += 2;
+ } else if (margin_delta < -abs(encoder->max_video_margin) * SPICE_GST_VIDEO_DELTA_AVERAGE) {
+ score += 1;
+ }
+
+ if (score > 3) {
+ spice_debug("score %u, cut the bit rate", score);
+ uint64_t bit_rate = (encoder->bit_rate == encoder->min_bit_rate) ?
+ encoder->bit_rate / SPICE_GST_BITRATE_CUT :
+ MAX(encoder->min_bit_rate, encoder->bit_rate / SPICE_GST_BITRATE_CUT);
+ set_bit_rate(encoder, bit_rate);
+
+ } else if (score == 3) {
+ spice_debug("score %u, reduce the bit rate", score);
+ uint64_t bit_rate = (encoder->bit_rate == encoder->min_bit_rate) ?
+ encoder->bit_rate / SPICE_GST_BITRATE_REDUCE :
+ MAX(encoder->min_bit_rate, encoder->bit_rate / SPICE_GST_BITRATE_REDUCE);
+ set_bit_rate(encoder, bit_rate);
+
+ } else if (score == 2) {
+ spice_debug("score %u, decrement the bit rate", score);
+ set_bit_rate(encoder, encoder->bit_rate - encoder->bit_rate_step);
+
+ } else if (audio_margin < encoder->max_audio_margin * SPICE_GST_AUDIO_MARGIN_BAD &&
+ audio_margin * SPICE_GST_AUDIO_VIDEO_RATIO < video_margin) {
+ /* The audio margin has decreased a lot while the video_margin
+ * remained higher. It may be that the video stream is starving the
+ * audio one of bandwidth. So reduce the bit rate.
+ */
+ spice_debug("free some bandwidth for the audio stream");
+ set_bit_rate(encoder, encoder->bit_rate - encoder->bit_rate_step);
+
+ } else if (score == 1 && period_bit_rate <= encoder->bit_rate &&
+ encoder->status == SPICE_GST_BITRATE_INCREASING) {
+ /* We only increase the bit rate when score == 0 so things got worse
+ * since the last increase, and not because of a transient bit rate
+ * peak.
+ */
+ spice_debug("degraded margin, decrement bit rate %.3f <= %.3fMbps",
+ get_mbps(period_bit_rate), get_mbps(encoder->bit_rate));
+ set_bit_rate(encoder, encoder->bit_rate - encoder->bit_rate_step);
+
+ } else if (score == 0 &&
+ get_last_frame_mm_time(encoder) - encoder->last_change >= encoder->increase_interval) {
+ /* The video margin is consistently high so increase the bit rate. */
+ increase_bit_rate(encoder);
+ }
+}
+
+static void spice_gst_encoder_notify_server_frame_drop(VideoEncoder *video_encoder)
+{
+ SpiceGstEncoder *encoder = (SpiceGstEncoder*)video_encoder;
+ if (encoder->server_drops == 0) {
+ spice_debug("server report: getting frame drops...");
+ }
+ encoder->server_drops++;
+}
+
+static uint64_t spice_gst_encoder_get_bit_rate(VideoEncoder *video_encoder)
+{
+ SpiceGstEncoder *encoder = (SpiceGstEncoder*)video_encoder;
+ return get_effective_bit_rate(encoder);
+}
+
+static void spice_gst_encoder_get_stats(VideoEncoder *video_encoder,
+ VideoEncoderStats *stats)
+{
+ SpiceGstEncoder *encoder = (SpiceGstEncoder*)video_encoder;
+ uint64_t raw_bit_rate = encoder->width * encoder->height * encoder->format->bpp * get_source_fps(encoder);
+
+ spice_return_if_fail(stats != NULL);
+ stats->starting_bit_rate = encoder->starting_bit_rate;
+ stats->cur_bit_rate = get_effective_bit_rate(encoder);
+
+ /* Use the compression level as a proxy for the quality */
+ stats->avg_quality = stats->cur_bit_rate ? 100.0 - raw_bit_rate / stats->cur_bit_rate : 0;
+ if (stats->avg_quality < 0) {
+ stats->avg_quality = 0;
+ }
+}
+
+/* Check if ORC library can work.
+ * ORC library is used quite extensively by GStreamer
+ * to generate code dynamically. If ORC cannot work, GStreamer
+ * will abort(3) the entire process.
+ */
+static bool orc_check(void)
+{
+ static bool orc_checked = false;
+ static bool orc_dynamic_code_ok = false;
+
+ if (SPICE_UNLIKELY(!orc_checked)) {
+ OrcCode *code = orc_code_new();
+ if (code) {
+ /* allocating 0 byte for code makes the function not crash
+ * but it does all the initializations and checks */
+ orc_code_allocate_codemem(code, 0);
+ orc_dynamic_code_ok = code->code != NULL;
+ orc_code_free(code);
+ }
+ orc_checked = true;
+ }
+ return orc_dynamic_code_ok;
+}
+
+VideoEncoder *gstreamer_encoder_new(SpiceVideoCodecType codec_type,
+ uint64_t starting_bit_rate,
+ VideoEncoderRateControlCbs *cbs,
+ bitmap_ref_t bitmap_ref,
+ bitmap_unref_t bitmap_unref)
+{
+ SPICE_VERIFY(SPICE_GST_FRAME_STATISTICS_COUNT <= SPICE_GST_HISTORY_SIZE);
+ spice_return_val_if_fail(codec_type == SPICE_VIDEO_CODEC_TYPE_MJPEG ||
+ codec_type == SPICE_VIDEO_CODEC_TYPE_VP8 ||
+ codec_type == SPICE_VIDEO_CODEC_TYPE_VP9 ||
+ codec_type == SPICE_VIDEO_CODEC_TYPE_H264, NULL);
+
+ GError *err = NULL;
+ if (!gst_init_check(NULL, NULL, &err)) {
+ spice_warning("GStreamer error: %s", err->message);
+ g_clear_error(&err);
+ return NULL;
+ }
+
+ // avoid aborting the process
+ if (!orc_check()) {
+ return NULL;
+ }
+
+ SpiceGstEncoder *encoder = g_new0(SpiceGstEncoder, 1);
+ encoder->base.destroy = spice_gst_encoder_destroy;
+ encoder->base.encode_frame = spice_gst_encoder_encode_frame;
+ encoder->base.client_stream_report = spice_gst_encoder_client_stream_report;
+ encoder->base.notify_server_frame_drop = spice_gst_encoder_notify_server_frame_drop;
+ encoder->base.get_bit_rate = spice_gst_encoder_get_bit_rate;
+ encoder->base.get_stats = spice_gst_encoder_get_stats;
+ encoder->base.codec_type = codec_type;
+ encoder->unused_bitmap_opaques = g_async_queue_new();
+
+ encoder->starting_bit_rate = starting_bit_rate;
+ encoder->cbs = *cbs;
+ encoder->bitmap_ref = bitmap_ref;
+ encoder->bitmap_unref = bitmap_unref;
+ encoder->format = GSTREAMER_FORMAT_INVALID;
+ pthread_mutex_init(&encoder->outbuf_mutex, NULL);
+ pthread_cond_init(&encoder->outbuf_cond, NULL);
+
+ /* All the other fields are initialized to zero by g_new0(). */
+
+ if (!create_pipeline(encoder)) {
+ /* Some GStreamer dependency is probably missing */
+ pthread_cond_destroy(&encoder->outbuf_cond);
+ pthread_mutex_destroy(&encoder->outbuf_mutex);
+ g_free(encoder);
+ encoder = NULL;
+ }
+ return (VideoEncoder*)encoder;
+}
diff --git a/server/image-cache.cpp b/server/image-cache.cpp
new file mode 100644
index 00000000..960e6ca9
--- /dev/null
+++ b/server/image-cache.cpp
@@ -0,0 +1,216 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+#include "image-cache.h"
+#include "red-parse-qxl.h"
+#include "display-channel.h"
+
+static ImageCacheItem *image_cache_find(ImageCache *cache, uint64_t id)
+{
+ ImageCacheItem *item = cache->hash_table[id % IMAGE_CACHE_HASH_SIZE];
+
+ while (item) {
+ if (item->id == id) {
+ return item;
+ }
+ item = item->next;
+ }
+ return nullptr;
+}
+
+static bool image_cache_hit(ImageCache *cache, uint64_t id)
+{
+ ImageCacheItem *item;
+ if (!(item = image_cache_find(cache, id))) {
+ return FALSE;
+ }
+#ifdef IMAGE_CACHE_AGE
+ item->age = cache->age;
+#endif
+ ring_remove(&item->lru_link);
+ ring_add(&cache->lru, &item->lru_link);
+ return TRUE;
+}
+
+static void image_cache_remove(ImageCache *cache, ImageCacheItem *item)
+{
+ ImageCacheItem **now;
+
+ now = &cache->hash_table[item->id % IMAGE_CACHE_HASH_SIZE];
+ for (;;) {
+ spice_assert(*now);
+ if (*now == item) {
+ *now = item->next;
+ break;
+ }
+ now = &(*now)->next;
+ }
+ ring_remove(&item->lru_link);
+ pixman_image_unref(item->image);
+ g_free(item);
+#ifndef IMAGE_CACHE_AGE
+ cache->num_items--;
+#endif
+}
+
+#define IMAGE_CACHE_MAX_ITEMS 2
+
+static void image_cache_put(SpiceImageCache *spice_cache, uint64_t id, pixman_image_t *image)
+{
+ ImageCache *cache = SPICE_UPCAST(ImageCache, spice_cache);
+ ImageCacheItem *item;
+
+#ifndef IMAGE_CACHE_AGE
+ if (cache->num_items == IMAGE_CACHE_MAX_ITEMS) {
+ SPICE_VERIFY(SPICE_OFFSETOF(ImageCacheItem, lru_link) == 0);
+ ImageCacheItem *tail =
+ SPICE_CONTAINEROF(ring_get_tail(&cache->lru), ImageCacheItem, lru_link);
+ spice_assert(tail);
+ image_cache_remove(cache, tail);
+ }
+#endif
+
+ item = g_new(ImageCacheItem, 1);
+ item->id = id;
+#ifdef IMAGE_CACHE_AGE
+ item->age = cache->age;
+#else
+ cache->num_items++;
+#endif
+ item->image = pixman_image_ref(image);
+ ring_item_init(&item->lru_link);
+
+ item->next = cache->hash_table[item->id % IMAGE_CACHE_HASH_SIZE];
+ cache->hash_table[item->id % IMAGE_CACHE_HASH_SIZE] = item;
+
+ ring_add(&cache->lru, &item->lru_link);
+}
+
+static pixman_image_t *image_cache_get(SpiceImageCache *spice_cache, uint64_t id)
+{
+ ImageCache *cache = SPICE_UPCAST(ImageCache, spice_cache);
+
+ ImageCacheItem *item = image_cache_find(cache, id);
+ if (!item) {
+ spice_error("not found");
+ }
+ return pixman_image_ref(item->image);
+}
+
+void image_cache_init(ImageCache *cache)
+{
+ static const SpiceImageCacheOps image_cache_ops = {
+ image_cache_put,
+ image_cache_get,
+ };
+
+ cache->base.ops = &image_cache_ops;
+ memset(cache->hash_table, 0, sizeof(cache->hash_table));
+ ring_init(&cache->lru);
+#ifdef IMAGE_CACHE_AGE
+ cache->age = 0;
+#else
+ cache->num_items = 0;
+#endif
+}
+
+void image_cache_reset(ImageCache *cache)
+{
+ ImageCacheItem *item;
+
+ SPICE_VERIFY(SPICE_OFFSETOF(ImageCacheItem, lru_link) == 0);
+ while ((item = SPICE_CONTAINEROF(ring_get_head(&cache->lru), ImageCacheItem, lru_link))) {
+ image_cache_remove(cache, item);
+ }
+#ifdef IMAGE_CACHE_AGE
+ cache->age = 0;
+#endif
+}
+
+#define IMAGE_CACHE_DEPTH 4
+
+void image_cache_aging(ImageCache *cache)
+{
+ SPICE_VERIFY(SPICE_OFFSETOF(ImageCacheItem, lru_link) == 0);
+#ifdef IMAGE_CACHE_AGE
+ ImageCacheItem *item;
+
+ cache->age++;
+ while ((item = (ImageCacheItem *)ring_get_tail(&cache->lru)) &&
+ cache->age - item->age > IMAGE_CACHE_DEPTH) {
+ image_cache_remove(cache, item);
+ }
+#endif
+}
+
+void image_cache_localize(ImageCache *cache, SpiceImage **image_ptr,
+ SpiceImage *image_store, Drawable *drawable)
+{
+ SpiceImage *image = *image_ptr;
+
+ if (image == nullptr) {
+ spice_assert(drawable != nullptr);
+ spice_assert(drawable->red_drawable->self_bitmap_image != nullptr);
+ *image_ptr = drawable->red_drawable->self_bitmap_image;
+ return;
+ }
+
+ if (image_cache_hit(cache, image->descriptor.id)) {
+ image_store->descriptor = image->descriptor;
+ image_store->descriptor.type = SPICE_IMAGE_TYPE_FROM_CACHE;
+ image_store->descriptor.flags = 0;
+ *image_ptr = image_store;
+ return;
+ }
+
+ switch (image->descriptor.type) {
+ case SPICE_IMAGE_TYPE_QUIC: {
+ image_store->descriptor = image->descriptor;
+ image_store->u.quic = image->u.quic;
+ *image_ptr = image_store;
+#ifdef IMAGE_CACHE_AGE
+ image_store->descriptor.flags |= SPICE_IMAGE_FLAGS_CACHE_ME;
+#else
+ if (image_store->descriptor.width * image->descriptor.height >= 640 * 480) {
+ image_store->descriptor.flags |= SPICE_IMAGE_FLAGS_CACHE_ME;
+ }
+#endif
+ break;
+ }
+ case SPICE_IMAGE_TYPE_BITMAP:
+ case SPICE_IMAGE_TYPE_SURFACE:
+ /* nothing */
+ break;
+ default:
+ spice_error("invalid image type");
+ }
+}
+
+void image_cache_localize_brush(ImageCache *cache, SpiceBrush *brush, SpiceImage *image_store)
+{
+ if (brush->type == SPICE_BRUSH_TYPE_PATTERN) {
+ image_cache_localize(cache, &brush->u.pattern.pat, image_store, nullptr);
+ }
+}
+
+void image_cache_localize_mask(ImageCache *cache, SpiceQMask *mask, SpiceImage *image_store)
+{
+ if (mask->bitmap) {
+ image_cache_localize(cache, &mask->bitmap, image_store, nullptr);
+ }
+}
diff --git a/server/image-cache.h b/server/image-cache.h
new file mode 100644
index 00000000..ba45a637
--- /dev/null
+++ b/server/image-cache.h
@@ -0,0 +1,67 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef IMAGE_CACHE_H_
+#define IMAGE_CACHE_H_
+
+#include <inttypes.h>
+#include <common/pixman_utils.h>
+#include <common/canvas_base.h>
+#include <common/ring.h>
+
+#include "push-visibility.h"
+
+/* FIXME: move back to display-channel.h (once structs are private) */
+struct Drawable;
+
+struct ImageCacheItem {
+ RingItem lru_link;
+ uint64_t id;
+#ifdef IMAGE_CACHE_AGE
+ uint32_t age;
+#endif
+ struct ImageCacheItem *next;
+ pixman_image_t *image;
+};
+
+#define IMAGE_CACHE_HASH_SIZE 1024
+
+struct ImageCache {
+ SpiceImageCache base;
+ ImageCacheItem *hash_table[IMAGE_CACHE_HASH_SIZE];
+ Ring lru;
+#ifdef IMAGE_CACHE_AGE
+ uint32_t age;
+#else
+ uint32_t num_items;
+#endif
+};
+
+void image_cache_init (ImageCache *cache);
+void image_cache_reset (ImageCache *cache);
+void image_cache_aging (ImageCache *cache);
+void image_cache_localize (ImageCache *cache, SpiceImage **image_ptr,
+ SpiceImage *image_store, Drawable *drawable);
+void image_cache_localize_brush (ImageCache *cache, SpiceBrush *brush,
+ SpiceImage *image_store);
+void image_cache_localize_mask (ImageCache *cache, SpiceQMask *mask,
+ SpiceImage *image_store);
+
+#include "pop-visibility.h"
+
+#endif /* IMAGE_CACHE_H_ */
diff --git a/server/image-encoders.cpp b/server/image-encoders.cpp
new file mode 100644
index 00000000..3b33bd81
--- /dev/null
+++ b/server/image-encoders.cpp
@@ -0,0 +1,1392 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+
+#include <glib.h>
+
+#include "image-encoders.h"
+#include "spice-bitmap-utils.h"
+#include "red-parse-qxl.h" // red_drawable_unref
+#include "pixmap-cache.h" // MAX_CACHE_CLIENTS
+
+#define ZLIB_DEFAULT_COMPRESSION_LEVEL 3
+
+#define ENCODER_MESSAGE_SIZE 512
+
+#define MAX_GLZ_DRAWABLE_INSTANCES 2
+
+#if 0
+#define COMPRESS_DEBUG(...) g_debug(__VA_ARGS__)
+#else
+#define COMPRESS_DEBUG(...) G_STMT_START { \
+ if (0) g_debug(__VA_ARGS__); \
+ } G_STMT_END
+#endif
+
+struct RedGlzDrawable;
+struct GlzDrawableInstanceItem;
+
+struct GlzSharedDictionary {
+ GlzEncDictContext *dict;
+ uint32_t refs;
+ uint8_t id;
+ pthread_rwlock_t encode_lock;
+ int migrate_freeze;
+ RedClient *client; // channel clients of the same client share the dict
+};
+
+/* for each qxl drawable, there may be several instances of lz drawables */
+/* TODO - reuse this stuff for the top level. I just added a second level of multiplicity
+ * at the Drawable by keeping a ring, so:
+ * Drawable -> (ring of) RedGlzDrawable -> (up to 2) GlzDrawableInstanceItem
+ * and it should probably (but need to be sure...) be
+ * Drawable -> ring of GlzDrawableInstanceItem.
+ */
+struct GlzDrawableInstanceItem {
+ RingItem glz_link;
+ RingItem free_link;
+ GlzEncDictImageContext *context;
+ RedGlzDrawable *glz_drawable;
+};
+
+struct RedGlzDrawable {
+ RingItem link; // ordered by the time it was encoded
+ RingItem drawable_link;
+ red::shared_ptr<RedDrawable> red_drawable;
+ GlzDrawableInstanceItem instances_pool[MAX_GLZ_DRAWABLE_INSTANCES];
+ Ring instances;
+ uint8_t instances_count;
+ gboolean has_drawable;
+ ImageEncoders *encoders;
+};
+
+#define LINK_TO_GLZ(ptr) SPICE_CONTAINEROF((ptr), RedGlzDrawable, \
+ drawable_link)
+#define DRAWABLE_FOREACH_GLZ_SAFE(drawable, link, next, glz) \
+ SAFE_FOREACH(link, next, drawable, &(drawable)->glz_retention.ring, glz, LINK_TO_GLZ(link))
+
+static void glz_drawable_instance_item_free(GlzDrawableInstanceItem *instance);
+static void encoder_data_init(EncoderData *data);
+static void encoder_data_reset(EncoderData *data);
+static void image_encoders_release_glz(ImageEncoders *enc);
+
+
+static SPICE_GNUC_NORETURN SPICE_GNUC_PRINTF(2, 3) void
+quic_usr_error(QuicUsrContext *usr, const char *fmt, ...)
+{
+ EncoderData *usr_data = &(SPICE_CONTAINEROF(usr, QuicData, usr)->data);
+ va_list ap;
+ char message_buf[ENCODER_MESSAGE_SIZE];
+
+ va_start(ap, fmt);
+ vsnprintf(message_buf, sizeof(message_buf), fmt, ap);
+ va_end(ap);
+ spice_critical("%s", message_buf);
+
+ longjmp(usr_data->jmp_env, 1);
+}
+
+static SPICE_GNUC_NORETURN SPICE_GNUC_PRINTF(2, 3) void
+lz_usr_error(LzUsrContext *usr, const char *fmt, ...)
+{
+ EncoderData *usr_data = &(SPICE_CONTAINEROF(usr, LzData, usr)->data);
+ va_list ap;
+ char message_buf[ENCODER_MESSAGE_SIZE];
+
+ va_start(ap, fmt);
+ vsnprintf(message_buf, sizeof(message_buf), fmt, ap);
+ va_end(ap);
+ spice_critical("%s", message_buf);
+
+ longjmp(usr_data->jmp_env, 1);
+}
+
+static SPICE_GNUC_PRINTF(2, 3) void
+glz_usr_error(GlzEncoderUsrContext *usr, const char *fmt, ...)
+{
+ va_list ap;
+ char message_buf[ENCODER_MESSAGE_SIZE];
+
+ va_start(ap, fmt);
+ vsnprintf(message_buf, sizeof(message_buf), fmt, ap);
+ va_end(ap);
+
+ spice_critical("%s", message_buf); // if global lz fails in the middle
+ // the consequences are not predictable since the window
+ // can turn to be unsynchronized between the server and
+ // and the client
+}
+
+static SPICE_GNUC_PRINTF(2, 3) void
+quic_usr_warn(QuicUsrContext *usr, const char *fmt, ...)
+{
+ va_list ap;
+ char message_buf[ENCODER_MESSAGE_SIZE];
+
+ va_start(ap, fmt);
+ vsnprintf(message_buf, sizeof(message_buf), fmt, ap);
+ va_end(ap);
+ spice_warning("%s", message_buf);
+}
+
+static SPICE_GNUC_PRINTF(2, 3) void
+lz_usr_warn(LzUsrContext *usr, const char *fmt, ...)
+{
+ va_list ap;
+ char message_buf[ENCODER_MESSAGE_SIZE];
+
+ va_start(ap, fmt);
+ vsnprintf(message_buf, sizeof(message_buf), fmt, ap);
+ va_end(ap);
+ spice_warning("%s", message_buf);
+}
+
+static SPICE_GNUC_PRINTF(2, 3) void
+glz_usr_warn(GlzEncoderUsrContext *usr, const char *fmt, ...)
+{
+ va_list ap;
+ char message_buf[ENCODER_MESSAGE_SIZE];
+
+ va_start(ap, fmt);
+ vsnprintf(message_buf, sizeof(message_buf), fmt, ap);
+ va_end(ap);
+ spice_warning("%s", message_buf);
+}
+
+static void *quic_usr_malloc(QuicUsrContext *usr, int size)
+{
+ return g_malloc(size);
+}
+
+static void *lz_usr_malloc(LzUsrContext *usr, int size)
+{
+ return g_malloc(size);
+}
+
+static void *glz_usr_malloc(GlzEncoderUsrContext *usr, int size)
+{
+ return g_malloc(size);
+}
+
+static void quic_usr_free(QuicUsrContext *usr, void *ptr)
+{
+ g_free(ptr);
+}
+
+static void lz_usr_free(LzUsrContext *usr, void *ptr)
+{
+ g_free(ptr);
+}
+
+static void glz_usr_free(GlzEncoderUsrContext *usr, void *ptr)
+{
+ g_free(ptr);
+}
+
+static void encoder_data_init(EncoderData *data)
+{
+ data->bufs_tail = g_new(RedCompressBuf, 1);
+ data->bufs_head = data->bufs_tail;
+ data->bufs_head->send_next = nullptr;
+}
+
+static void encoder_data_reset(EncoderData *data)
+{
+ RedCompressBuf *buf = data->bufs_head;
+ while (buf) {
+ RedCompressBuf *next = buf->send_next;
+ g_free(buf);
+ buf = next;
+ }
+ data->bufs_head = data->bufs_tail = nullptr;
+}
+
+/* Allocate more space for compressed buffer.
+ * The pointer returned in io_ptr is guaranteed to be aligned to 4 bytes.
+ */
+static int encoder_usr_more_space(EncoderData *enc_data, uint8_t **io_ptr)
+{
+ RedCompressBuf *buf;
+
+ buf = g_new(RedCompressBuf, 1);
+ enc_data->bufs_tail->send_next = buf;
+ enc_data->bufs_tail = buf;
+ buf->send_next = nullptr;
+ *io_ptr = buf->buf.bytes;
+ return sizeof(buf->buf);
+}
+
+static int quic_usr_more_space(QuicUsrContext *usr, uint32_t **io_ptr, int rows_completed)
+{
+ EncoderData *usr_data = &(SPICE_CONTAINEROF(usr, QuicData, usr)->data);
+ return encoder_usr_more_space(usr_data, reinterpret_cast<uint8_t **>(io_ptr)) /
+ sizeof(uint32_t);
+}
+
+static int lz_usr_more_space(LzUsrContext *usr, uint8_t **io_ptr)
+{
+ EncoderData *usr_data = &(SPICE_CONTAINEROF(usr, LzData, usr)->data);
+ return encoder_usr_more_space(usr_data, io_ptr);
+}
+
+static int glz_usr_more_space(GlzEncoderUsrContext *usr, uint8_t **io_ptr)
+{
+ EncoderData *usr_data = &(SPICE_CONTAINEROF(usr, GlzData, usr)->data);
+ return encoder_usr_more_space(usr_data, io_ptr);
+}
+
+static int jpeg_usr_more_space(JpegEncoderUsrContext *usr, uint8_t **io_ptr)
+{
+ EncoderData *usr_data = &(SPICE_CONTAINEROF(usr, JpegData, usr)->data);
+ return encoder_usr_more_space(usr_data, io_ptr);
+}
+
+#ifdef USE_LZ4
+static int lz4_usr_more_space(Lz4EncoderUsrContext *usr, uint8_t **io_ptr)
+{
+ EncoderData *usr_data = &(SPICE_CONTAINEROF(usr, Lz4Data, usr)->data);
+ return encoder_usr_more_space(usr_data, io_ptr);
+}
+#endif
+
+static int zlib_usr_more_space(ZlibEncoderUsrContext *usr, uint8_t **io_ptr)
+{
+ EncoderData *usr_data = &(SPICE_CONTAINEROF(usr, ZlibData, usr)->data);
+ return encoder_usr_more_space(usr_data, io_ptr);
+}
+
+static inline int encoder_usr_more_lines(EncoderData *enc_data, uint8_t **lines)
+{
+ struct SpiceChunk *chunk;
+
+ if (enc_data->u.lines_data.reverse) {
+ if (!(enc_data->u.lines_data.next >= 0)) {
+ return 0;
+ }
+ } else {
+ if (!(enc_data->u.lines_data.next < enc_data->u.lines_data.chunks->num_chunks)) {
+ return 0;
+ }
+ }
+
+ chunk = &enc_data->u.lines_data.chunks->chunk[enc_data->u.lines_data.next];
+ if (chunk->len % enc_data->u.lines_data.stride) {
+ return 0;
+ }
+
+ if (enc_data->u.lines_data.reverse) {
+ enc_data->u.lines_data.next--;
+ *lines = chunk->data + chunk->len - enc_data->u.lines_data.stride;
+ } else {
+ enc_data->u.lines_data.next++;
+ *lines = chunk->data;
+ }
+
+ return chunk->len / enc_data->u.lines_data.stride;
+}
+
+static int quic_usr_more_lines(QuicUsrContext *usr, uint8_t **lines)
+{
+ EncoderData *usr_data = &(SPICE_CONTAINEROF(usr, QuicData, usr)->data);
+ return encoder_usr_more_lines(usr_data, lines);
+}
+
+static int lz_usr_more_lines(LzUsrContext *usr, uint8_t **lines)
+{
+ EncoderData *usr_data = &(SPICE_CONTAINEROF(usr, LzData, usr)->data);
+ return encoder_usr_more_lines(usr_data, lines);
+}
+
+static int glz_usr_more_lines(GlzEncoderUsrContext *usr, uint8_t **lines)
+{
+ EncoderData *usr_data = &(SPICE_CONTAINEROF(usr, GlzData, usr)->data);
+ return encoder_usr_more_lines(usr_data, lines);
+}
+
+static int jpeg_usr_more_lines(JpegEncoderUsrContext *usr, uint8_t **lines)
+{
+ EncoderData *usr_data = &(SPICE_CONTAINEROF(usr, JpegData, usr)->data);
+ return encoder_usr_more_lines(usr_data, lines);
+}
+
+#ifdef USE_LZ4
+static int lz4_usr_more_lines(Lz4EncoderUsrContext *usr, uint8_t **lines)
+{
+ EncoderData *usr_data = &(SPICE_CONTAINEROF(usr, Lz4Data, usr)->data);
+ return encoder_usr_more_lines(usr_data, lines);
+}
+#endif
+
+static int zlib_usr_more_input(ZlibEncoderUsrContext *usr, uint8_t** input)
+{
+ EncoderData *usr_data = &(SPICE_CONTAINEROF(usr, ZlibData, usr)->data);
+ int buf_size;
+
+ if (!usr_data->u.compressed_data.next) {
+ spice_assert(usr_data->u.compressed_data.size_left == 0);
+ return 0;
+ }
+
+ *input = usr_data->u.compressed_data.next->buf.bytes;
+ buf_size = MIN(sizeof(usr_data->u.compressed_data.next->buf),
+ usr_data->u.compressed_data.size_left);
+
+ usr_data->u.compressed_data.next = usr_data->u.compressed_data.next->send_next;
+ usr_data->u.compressed_data.size_left -= buf_size;
+ return buf_size;
+}
+
+static void image_encoders_init_quic(ImageEncoders *enc)
+{
+ enc->quic_data.usr.error = quic_usr_error;
+ enc->quic_data.usr.warn = quic_usr_warn;
+ enc->quic_data.usr.info = quic_usr_warn;
+ enc->quic_data.usr.malloc = quic_usr_malloc;
+ enc->quic_data.usr.free = quic_usr_free;
+ enc->quic_data.usr.more_space = quic_usr_more_space;
+ enc->quic_data.usr.more_lines = quic_usr_more_lines;
+
+ enc->quic = quic_create(&enc->quic_data.usr);
+
+ if (!enc->quic) {
+ spice_critical("create quic failed");
+ }
+}
+
+static void image_encoders_init_lz(ImageEncoders *enc)
+{
+ enc->lz_data.usr.error = lz_usr_error;
+ enc->lz_data.usr.warn = lz_usr_warn;
+ enc->lz_data.usr.info = lz_usr_warn;
+ enc->lz_data.usr.malloc = lz_usr_malloc;
+ enc->lz_data.usr.free = lz_usr_free;
+ enc->lz_data.usr.more_space = lz_usr_more_space;
+ enc->lz_data.usr.more_lines = lz_usr_more_lines;
+
+ enc->lz = lz_create(&enc->lz_data.usr);
+
+ if (!enc->lz) {
+ spice_critical("create lz failed");
+ }
+}
+
+static void glz_usr_free_image(GlzEncoderUsrContext *usr, GlzUsrImageContext *image)
+{
+ GlzData *lz_data = SPICE_CONTAINEROF(usr, GlzData, usr);
+ auto glz_drawable_instance = static_cast<GlzDrawableInstanceItem *>(image);
+ ImageEncoders *drawable_enc = glz_drawable_instance->glz_drawable->encoders;
+ ImageEncoders *this_enc = SPICE_CONTAINEROF(lz_data, ImageEncoders, glz_data);
+ if (this_enc == drawable_enc) {
+ glz_drawable_instance_item_free(glz_drawable_instance);
+ } else {
+ /* The glz dictionary is shared between all DisplayChannelClient
+ * instances that belong to the same client, and glz_usr_free_image
+ * can be called by the dictionary code
+ * (glz_dictionary_window_remove_head). Thus this function can be
+ * called from any DisplayChannelClient thread, hence the need for
+ * this check.
+ */
+ pthread_mutex_lock(&drawable_enc->glz_drawables_inst_to_free_lock);
+ ring_add_before(&glz_drawable_instance->free_link,
+ &drawable_enc->glz_drawables_inst_to_free);
+ pthread_mutex_unlock(&drawable_enc->glz_drawables_inst_to_free_lock);
+ }
+}
+
+static void image_encoders_init_glz_data(ImageEncoders *enc)
+{
+ enc->glz_data.usr.error = glz_usr_error;
+ enc->glz_data.usr.warn = glz_usr_warn;
+ enc->glz_data.usr.info = glz_usr_warn;
+ enc->glz_data.usr.malloc = glz_usr_malloc;
+ enc->glz_data.usr.free = glz_usr_free;
+ enc->glz_data.usr.more_space = glz_usr_more_space;
+ enc->glz_data.usr.more_lines = glz_usr_more_lines;
+ enc->glz_data.usr.free_image = glz_usr_free_image;
+}
+
+static void image_encoders_init_jpeg(ImageEncoders *enc)
+{
+ enc->jpeg_data.usr.more_space = jpeg_usr_more_space;
+ enc->jpeg_data.usr.more_lines = jpeg_usr_more_lines;
+
+ enc->jpeg = jpeg_encoder_create(&enc->jpeg_data.usr);
+
+ if (!enc->jpeg) {
+ spice_critical("create jpeg encoder failed");
+ }
+}
+
+#ifdef USE_LZ4
+static inline void image_encoders_init_lz4(ImageEncoders *enc)
+{
+ enc->lz4_data.usr.more_space = lz4_usr_more_space;
+ enc->lz4_data.usr.more_lines = lz4_usr_more_lines;
+
+ enc->lz4 = lz4_encoder_create(&enc->lz4_data.usr);
+
+ if (!enc->lz4) {
+ spice_critical("create lz4 encoder failed");
+ }
+}
+#endif
+
+static void image_encoders_init_zlib(ImageEncoders *enc)
+{
+ enc->zlib_data.usr.more_space = zlib_usr_more_space;
+ enc->zlib_data.usr.more_input = zlib_usr_more_input;
+}
+
+void image_encoders_init(ImageEncoders *enc, ImageEncoderSharedData *shared_data)
+{
+ spice_assert(shared_data);
+ enc->shared_data = shared_data;
+
+ ring_init(&enc->glz_drawables);
+ ring_init(&enc->glz_drawables_inst_to_free);
+ pthread_mutex_init(&enc->glz_drawables_inst_to_free_lock, nullptr);
+
+ image_encoders_init_glz_data(enc);
+ image_encoders_init_quic(enc);
+ image_encoders_init_lz(enc);
+ image_encoders_init_jpeg(enc);
+#ifdef USE_LZ4
+ image_encoders_init_lz4(enc);
+#endif
+ image_encoders_init_zlib(enc);
+
+ // todo: tune level according to bandwidth
+ enc->zlib_level = ZLIB_DEFAULT_COMPRESSION_LEVEL;
+}
+
+void image_encoders_free(ImageEncoders *enc)
+{
+ image_encoders_release_glz(enc);
+ quic_destroy(enc->quic);
+ enc->quic = nullptr;
+ lz_destroy(enc->lz);
+ enc->lz = nullptr;
+ jpeg_encoder_destroy(enc->jpeg);
+ enc->jpeg = nullptr;
+#ifdef USE_LZ4
+ lz4_encoder_destroy(enc->lz4);
+ enc->lz4 = nullptr;
+#endif
+ if (enc->zlib != nullptr) {
+ zlib_encoder_destroy(enc->zlib);
+ enc->zlib = nullptr;
+ }
+ pthread_mutex_destroy(&enc->glz_drawables_inst_to_free_lock);
+}
+
+/* Remove from the to_free list and the instances_list.
+ When no instance is left - the RedGlzDrawable is released too. (and the qxl drawable too, if
+ it is not used by Drawable).
+ NOTE - 1) can be called only by the display channel that created the drawable
+ 2) it is assumed that the instance was already removed from the dictionary*/
+static void glz_drawable_instance_item_free(GlzDrawableInstanceItem *instance)
+{
+ RedGlzDrawable *glz_drawable;
+
+ spice_assert(instance);
+ spice_assert(instance->glz_drawable);
+
+ glz_drawable = instance->glz_drawable;
+
+ spice_assert(glz_drawable->instances_count > 0);
+
+ ring_remove(&instance->glz_link);
+ glz_drawable->instances_count--;
+
+ // when the remove callback is performed from the channel that the
+ // drawable belongs to, the instance is not added to the 'to_free' list
+ if (ring_item_is_linked(&instance->free_link)) {
+ ring_remove(&instance->free_link);
+ }
+
+ if (ring_is_empty(&glz_drawable->instances)) {
+ spice_assert(glz_drawable->instances_count == 0);
+
+ if (glz_drawable->has_drawable) {
+ ring_remove(&glz_drawable->drawable_link);
+ }
+ glz_drawable->red_drawable.reset();
+ glz_drawable->encoders->shared_data->glz_drawable_count--;
+ if (ring_item_is_linked(&glz_drawable->link)) {
+ ring_remove(&glz_drawable->link);
+ }
+ g_free(glz_drawable);
+ }
+}
+
+/*
+ * Releases all the instances of the drawable from the dictionary and the display channel client.
+ * The release of the last instance will also release the drawable itself and the qxl drawable
+ * if possible.
+ * NOTE - the caller should prevent encoding using the dictionary during this operation
+ */
+static void red_glz_drawable_free(RedGlzDrawable *glz_drawable)
+{
+ ImageEncoders *enc = glz_drawable->encoders;
+ RingItem *head_instance = ring_get_head(&glz_drawable->instances);
+ int cont = (head_instance != nullptr);
+
+ while (cont) {
+ if (glz_drawable->instances_count == 1) {
+ /* Last instance: glz_drawable_instance_item_free will free the glz_drawable */
+ cont = FALSE;
+ }
+ GlzDrawableInstanceItem *instance = SPICE_CONTAINEROF(head_instance,
+ GlzDrawableInstanceItem,
+ glz_link);
+ if (!ring_item_is_linked(&instance->free_link)) {
+ // the instance didn't get out from window yet
+ glz_enc_dictionary_remove_image(enc->glz_dict->dict,
+ instance->context,
+ &enc->glz_data.usr);
+ }
+ glz_drawable_instance_item_free(instance);
+
+ if (cont) {
+ head_instance = ring_get_head(&glz_drawable->instances);
+ }
+ }
+}
+
+gboolean image_encoders_glz_encode_lock(ImageEncoders *enc)
+{
+ if (enc->glz_dict) {
+ pthread_rwlock_wrlock(&enc->glz_dict->encode_lock);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void image_encoders_glz_encode_unlock(ImageEncoders *enc)
+{
+ if (enc->glz_dict) {
+ pthread_rwlock_unlock(&enc->glz_dict->encode_lock);
+ }
+}
+
+/*
+ * Remove from the global lz dictionary some glz_drawables that have no reference to
+ * Drawable (their qxl drawables are released too).
+ * NOTE - the caller should prevent encoding using the dictionary during the operation
+ */
+int image_encoders_free_some_independent_glz_drawables(ImageEncoders *enc)
+{
+ RingItem *ring_link;
+ int n = 0;
+
+ if (!enc) {
+ return 0;
+ }
+ ring_link = ring_get_head(&enc->glz_drawables);
+ while ((n < RED_RELEASE_BUNCH_SIZE) && (ring_link != nullptr)) {
+ RedGlzDrawable *glz_drawable = SPICE_CONTAINEROF(ring_link, RedGlzDrawable, link);
+ ring_link = ring_next(&enc->glz_drawables, ring_link);
+ if (!glz_drawable->has_drawable) {
+ red_glz_drawable_free(glz_drawable);
+ n++;
+ }
+ }
+ return n;
+}
+
+void image_encoders_free_glz_drawables_to_free(ImageEncoders* enc)
+{
+ RingItem *ring_link;
+
+ if (!enc->glz_dict) {
+ return;
+ }
+ pthread_mutex_lock(&enc->glz_drawables_inst_to_free_lock);
+ while ((ring_link = ring_get_head(&enc->glz_drawables_inst_to_free))) {
+ GlzDrawableInstanceItem *drawable_instance = SPICE_CONTAINEROF(ring_link,
+ GlzDrawableInstanceItem,
+ free_link);
+ glz_drawable_instance_item_free(drawable_instance);
+ }
+ pthread_mutex_unlock(&enc->glz_drawables_inst_to_free_lock);
+}
+
+/* Clear all lz drawables - enforce their removal from the global dictionary.
+ NOTE - prevents encoding using the dictionary during the operation*/
+void image_encoders_free_glz_drawables(ImageEncoders *enc)
+{
+ RingItem *ring_link;
+ GlzSharedDictionary *glz_dict = enc->glz_dict;
+
+ if (!glz_dict) {
+ return;
+ }
+
+ // assure no display channel is during global lz encoding
+ pthread_rwlock_wrlock(&glz_dict->encode_lock);
+ while ((ring_link = ring_get_head(&enc->glz_drawables))) {
+ RedGlzDrawable *drawable = SPICE_CONTAINEROF(ring_link, RedGlzDrawable, link);
+ // no need to lock the to_free list, since we assured no other thread is encoding and
+ // thus not other thread access the to_free list of the channel
+ red_glz_drawable_free(drawable);
+ }
+ pthread_rwlock_unlock(&glz_dict->encode_lock);
+}
+
+void glz_retention_free_drawables(GlzImageRetention *ret)
+{
+ RingItem *glz_item, *next_item;
+ RedGlzDrawable *glz;
+ SAFE_FOREACH(glz_item, next_item, TRUE, &ret->ring, glz, LINK_TO_GLZ(glz_item)) {
+ red_glz_drawable_free(glz);
+ }
+}
+
+void glz_retention_detach_drawables(GlzImageRetention *ret)
+{
+ RingItem *item, *next;
+
+ RING_FOREACH_SAFE(item, next, &ret->ring) {
+ SPICE_CONTAINEROF(item, RedGlzDrawable, drawable_link)->has_drawable = FALSE;
+ ring_remove(item);
+ }
+}
+
+static void image_encoders_freeze_glz(ImageEncoders *enc)
+{
+ pthread_rwlock_wrlock(&enc->glz_dict->encode_lock);
+ enc->glz_dict->migrate_freeze = TRUE;
+ pthread_rwlock_unlock(&enc->glz_dict->encode_lock);
+}
+
+void image_encoders_glz_get_restore_data(ImageEncoders *enc,
+ uint8_t *out_id, GlzEncDictRestoreData *out_data)
+{
+ spice_assert(enc->glz_dict);
+ image_encoders_freeze_glz(enc);
+ *out_id = enc->glz_dict->id;
+ glz_enc_dictionary_get_restore_data(enc->glz_dict->dict, out_data,
+ &enc->glz_data.usr);
+}
+
+static GlzSharedDictionary *glz_shared_dictionary_new(RedClient *client, uint8_t id,
+ GlzEncDictContext *dict)
+{
+ spice_return_val_if_fail(dict != nullptr, NULL);
+
+ auto shared_dict = g_new0(GlzSharedDictionary, 1);
+
+ shared_dict->dict = dict;
+ shared_dict->id = id;
+ shared_dict->refs = 1;
+ shared_dict->migrate_freeze = FALSE;
+ shared_dict->client = client;
+ pthread_rwlock_init(&shared_dict->encode_lock, nullptr);
+
+ return shared_dict;
+}
+
+static pthread_mutex_t glz_dictionary_list_lock = PTHREAD_MUTEX_INITIALIZER;
+static GList *glz_dictionary_list;
+
+static GlzSharedDictionary *find_glz_dictionary(RedClient *client, uint8_t dict_id)
+{
+ GList *l;
+ GlzSharedDictionary *ret = nullptr;
+
+ for (l = glz_dictionary_list; l != nullptr; l = l->next) {
+ auto dict = static_cast<GlzSharedDictionary *>(l->data);
+ if ((dict->client == client) && (dict->id == dict_id)) {
+ ret = dict;
+ break;
+ }
+ }
+
+ return ret;
+}
+
+#define MAX_LZ_ENCODERS MAX_CACHE_CLIENTS
+
+static GlzSharedDictionary *create_glz_dictionary(ImageEncoders *enc,
+ RedClient *client,
+ uint8_t id, int window_size)
+{
+ spice_debug("Lz Window %d Size=%d", id, window_size);
+
+ GlzEncDictContext *glz_dict =
+ glz_enc_dictionary_create(window_size, MAX_LZ_ENCODERS, &enc->glz_data.usr);
+
+ return glz_shared_dictionary_new(client, id, glz_dict);
+}
+
+gboolean image_encoders_get_glz_dictionary(ImageEncoders *enc,
+ RedClient *client,
+ uint8_t id, int window_size)
+{
+ GlzSharedDictionary *shared_dict;
+
+ spice_return_val_if_fail(!enc->glz_dict, FALSE);
+
+ pthread_mutex_lock(&glz_dictionary_list_lock);
+
+ shared_dict = find_glz_dictionary(client, id);
+ if (shared_dict) {
+ shared_dict->refs++;
+ } else {
+ shared_dict = create_glz_dictionary(enc, client, id, window_size);
+ if (shared_dict != nullptr) {
+ glz_dictionary_list = g_list_prepend(glz_dictionary_list, shared_dict);
+ }
+ }
+
+ pthread_mutex_unlock(&glz_dictionary_list_lock);
+ enc->glz_dict = shared_dict;
+ return shared_dict != nullptr;
+}
+
+static GlzSharedDictionary *restore_glz_dictionary(ImageEncoders *enc,
+ RedClient *client,
+ uint8_t id,
+ GlzEncDictRestoreData *restore_data)
+{
+ GlzEncDictContext *glz_dict =
+ glz_enc_dictionary_restore(restore_data, &enc->glz_data.usr);
+
+ return glz_shared_dictionary_new(client, id, glz_dict);
+}
+
+gboolean image_encoders_restore_glz_dictionary(ImageEncoders *enc,
+ RedClient *client,
+ uint8_t id,
+ GlzEncDictRestoreData *restore_data)
+{
+ GlzSharedDictionary *shared_dict = nullptr;
+
+ spice_return_val_if_fail(!enc->glz_dict, FALSE);
+
+ pthread_mutex_lock(&glz_dictionary_list_lock);
+
+ shared_dict = find_glz_dictionary(client, id);
+
+ if (shared_dict) {
+ shared_dict->refs++;
+ } else {
+ shared_dict = restore_glz_dictionary(enc, client, id, restore_data);
+ if(shared_dict != nullptr) {
+ glz_dictionary_list = g_list_prepend(glz_dictionary_list, shared_dict);
+ }
+ }
+
+ pthread_mutex_unlock(&glz_dictionary_list_lock);
+ enc->glz_dict = shared_dict;
+ return shared_dict != nullptr;
+}
+
+gboolean image_encoders_glz_create(ImageEncoders *enc, uint8_t id)
+{
+ enc->glz = glz_encoder_create(id, enc->glz_dict->dict, &enc->glz_data.usr);
+ return enc->glz != nullptr;
+}
+
+/* destroy encoder, and dictionary if no one uses it*/
+static void image_encoders_release_glz(ImageEncoders *enc)
+{
+ GlzSharedDictionary *shared_dict;
+
+ image_encoders_free_glz_drawables(enc);
+
+ glz_encoder_destroy(enc->glz);
+ enc->glz = nullptr;
+
+ if (!(shared_dict = enc->glz_dict)) {
+ return;
+ }
+
+ enc->glz_dict = nullptr;
+ pthread_mutex_lock(&glz_dictionary_list_lock);
+ if (--shared_dict->refs != 0) {
+ pthread_mutex_unlock(&glz_dictionary_list_lock);
+ return;
+ }
+ glz_dictionary_list = g_list_remove(glz_dictionary_list, shared_dict);
+ pthread_mutex_unlock(&glz_dictionary_list_lock);
+ glz_enc_dictionary_destroy(shared_dict->dict, &enc->glz_data.usr);
+ pthread_rwlock_destroy(&shared_dict->encode_lock);
+ g_free(shared_dict);
+}
+
+bool image_encoders_compress_quic(ImageEncoders *enc, SpiceImage *dest,
+ SpiceBitmap *src, compress_send_data_t* o_comp_data)
+{
+ QuicData *quic_data = &enc->quic_data;
+ QuicContext *quic = enc->quic;
+ volatile QuicImageType type;
+ int size, stride;
+ stat_start_time_t start_time;
+ stat_start_time_init(&start_time, &enc->shared_data->quic_stat);
+
+ COMPRESS_DEBUG("QUIC compress");
+
+ switch (src->format) {
+ case SPICE_BITMAP_FMT_32BIT:
+ type = QUIC_IMAGE_TYPE_RGB32;
+ break;
+ case SPICE_BITMAP_FMT_RGBA:
+ type = QUIC_IMAGE_TYPE_RGBA;
+ break;
+ case SPICE_BITMAP_FMT_16BIT:
+ type = QUIC_IMAGE_TYPE_RGB16;
+ break;
+ case SPICE_BITMAP_FMT_24BIT:
+ type = QUIC_IMAGE_TYPE_RGB24;
+ break;
+ default:
+ return FALSE;
+ }
+
+ encoder_data_init(&quic_data->data);
+
+ if (setjmp(quic_data->data.jmp_env)) {
+ encoder_data_reset(&quic_data->data);
+ return FALSE;
+ }
+
+ if (src->data->flags & SPICE_CHUNKS_FLAGS_UNSTABLE) {
+ spice_chunks_linearize(src->data);
+ }
+
+ quic_data->data.u.lines_data.chunks = src->data;
+ quic_data->data.u.lines_data.stride = src->stride;
+ if ((src->flags & SPICE_BITMAP_FLAGS_TOP_DOWN)) {
+ quic_data->data.u.lines_data.next = 0;
+ quic_data->data.u.lines_data.reverse = 0;
+ stride = src->stride;
+ } else {
+ quic_data->data.u.lines_data.next = src->data->num_chunks - 1;
+ quic_data->data.u.lines_data.reverse = 1;
+ stride = -src->stride;
+ }
+ size = quic_encode(quic, type, src->x, src->y, nullptr, 0, stride,
+ quic_data->data.bufs_head->buf.words,
+ G_N_ELEMENTS(quic_data->data.bufs_head->buf.words));
+
+ // the compressed buffer is bigger than the original data
+ if ((size << 2) > (src->y * src->stride)) {
+ longjmp(quic_data->data.jmp_env, 1);
+ }
+
+ dest->descriptor.type = SPICE_IMAGE_TYPE_QUIC;
+ dest->u.quic.data_size = size << 2;
+
+ o_comp_data->comp_buf = quic_data->data.bufs_head;
+ o_comp_data->comp_buf_size = size << 2;
+
+ stat_compress_add(&enc->shared_data->quic_stat, start_time, src->stride * src->y,
+ o_comp_data->comp_buf_size);
+ return TRUE;
+}
+
+static const LzImageType bitmap_fmt_to_lz_image_type[] = {
+ LZ_IMAGE_TYPE_INVALID,
+ LZ_IMAGE_TYPE_PLT1_LE,
+ LZ_IMAGE_TYPE_PLT1_BE,
+ LZ_IMAGE_TYPE_PLT4_LE,
+ LZ_IMAGE_TYPE_PLT4_BE,
+ LZ_IMAGE_TYPE_PLT8,
+ LZ_IMAGE_TYPE_RGB16,
+ LZ_IMAGE_TYPE_RGB24,
+ LZ_IMAGE_TYPE_RGB32,
+ LZ_IMAGE_TYPE_RGBA,
+ LZ_IMAGE_TYPE_A8
+};
+
+bool image_encoders_compress_lz(ImageEncoders *enc,
+ SpiceImage *dest, SpiceBitmap *src,
+ compress_send_data_t* o_comp_data)
+{
+ LzData *lz_data = &enc->lz_data;
+ LzContext *lz = enc->lz;
+ LzImageType type = bitmap_fmt_to_lz_image_type[src->format];
+ int size; // size of the compressed data
+
+ stat_start_time_t start_time;
+ stat_start_time_init(&start_time, &enc->shared_data->lz_stat);
+
+ COMPRESS_DEBUG("LZ LOCAL compress");
+
+ encoder_data_init(&lz_data->data);
+
+ if (setjmp(lz_data->data.jmp_env)) {
+ encoder_data_reset(&lz_data->data);
+ return FALSE;
+ }
+
+ lz_data->data.u.lines_data.chunks = src->data;
+ lz_data->data.u.lines_data.stride = src->stride;
+ lz_data->data.u.lines_data.next = 0;
+ lz_data->data.u.lines_data.reverse = 0;
+
+ size = lz_encode(lz, type, src->x, src->y,
+ !!(src->flags & SPICE_BITMAP_FLAGS_TOP_DOWN),
+ nullptr, 0, src->stride,
+ lz_data->data.bufs_head->buf.bytes,
+ sizeof(lz_data->data.bufs_head->buf));
+
+ // the compressed buffer is bigger than the original data
+ if (size > (src->y * src->stride)) {
+ longjmp(lz_data->data.jmp_env, 1);
+ }
+
+ if (bitmap_fmt_is_rgb(src->format)) {
+ dest->descriptor.type = SPICE_IMAGE_TYPE_LZ_RGB;
+ dest->u.lz_rgb.data_size = size;
+
+ o_comp_data->comp_buf = lz_data->data.bufs_head;
+ o_comp_data->comp_buf_size = size;
+ } else {
+ /* masks are 1BIT bitmaps without palettes, but they are not compressed
+ * (see fill_mask) */
+ spice_assert(src->palette);
+ dest->descriptor.type = SPICE_IMAGE_TYPE_LZ_PLT;
+ dest->u.lz_plt.data_size = size;
+ dest->u.lz_plt.flags = src->flags & SPICE_BITMAP_FLAGS_TOP_DOWN;
+ dest->u.lz_plt.palette = src->palette;
+ dest->u.lz_plt.palette_id = src->palette->unique;
+ o_comp_data->comp_buf = lz_data->data.bufs_head;
+ o_comp_data->comp_buf_size = size;
+
+ o_comp_data->lzplt_palette = dest->u.lz_plt.palette;
+ }
+
+ stat_compress_add(&enc->shared_data->lz_stat, start_time, src->stride * src->y,
+ o_comp_data->comp_buf_size);
+ return TRUE;
+}
+
+bool image_encoders_compress_jpeg(ImageEncoders *enc, SpiceImage *dest,
+ SpiceBitmap *src, compress_send_data_t* o_comp_data)
+{
+ JpegData *jpeg_data = &enc->jpeg_data;
+ LzData *lz_data = &enc->lz_data;
+ JpegEncoderContext *jpeg = enc->jpeg;
+ LzContext *lz = enc->lz;
+ volatile JpegEncoderImageType jpeg_in_type;
+ int jpeg_size = 0;
+ volatile int has_alpha = FALSE;
+ int alpha_lz_size = 0;
+ int comp_head_filled;
+ int comp_head_left;
+ int stride;
+ uint8_t *lz_out_start_byte;
+ stat_start_time_t start_time;
+ stat_start_time_init(&start_time, &enc->shared_data->jpeg_alpha_stat);
+
+ COMPRESS_DEBUG("JPEG compress");
+
+ switch (src->format) {
+ case SPICE_BITMAP_FMT_16BIT:
+ jpeg_in_type = JPEG_IMAGE_TYPE_RGB16;
+ break;
+ case SPICE_BITMAP_FMT_24BIT:
+ jpeg_in_type = JPEG_IMAGE_TYPE_BGR24;
+ break;
+ case SPICE_BITMAP_FMT_32BIT:
+ jpeg_in_type = JPEG_IMAGE_TYPE_BGRX32;
+ break;
+ case SPICE_BITMAP_FMT_RGBA:
+ jpeg_in_type = JPEG_IMAGE_TYPE_BGRX32;
+ has_alpha = TRUE;
+ break;
+ default:
+ return FALSE;
+ }
+
+ encoder_data_init(&jpeg_data->data);
+
+ if (setjmp(jpeg_data->data.jmp_env)) {
+ encoder_data_reset(&jpeg_data->data);
+ return FALSE;
+ }
+
+ if (src->data->flags & SPICE_CHUNKS_FLAGS_UNSTABLE) {
+ spice_chunks_linearize(src->data);
+ }
+
+ jpeg_data->data.u.lines_data.chunks = src->data;
+ jpeg_data->data.u.lines_data.stride = src->stride;
+ if ((src->flags & SPICE_BITMAP_FLAGS_TOP_DOWN)) {
+ jpeg_data->data.u.lines_data.next = 0;
+ jpeg_data->data.u.lines_data.reverse = 0;
+ stride = src->stride;
+ } else {
+ jpeg_data->data.u.lines_data.next = src->data->num_chunks - 1;
+ jpeg_data->data.u.lines_data.reverse = 1;
+ stride = -src->stride;
+ }
+ jpeg_size = jpeg_encode(jpeg, enc->jpeg_quality, jpeg_in_type,
+ src->x, src->y, nullptr,
+ 0, stride, jpeg_data->data.bufs_head->buf.bytes,
+ sizeof(jpeg_data->data.bufs_head->buf));
+
+ // the compressed buffer is bigger than the original data
+ if (jpeg_size > (src->y * src->stride)) {
+ longjmp(jpeg_data->data.jmp_env, 1);
+ }
+
+ if (!has_alpha) {
+ dest->descriptor.type = SPICE_IMAGE_TYPE_JPEG;
+ dest->u.jpeg.data_size = jpeg_size;
+
+ o_comp_data->comp_buf = jpeg_data->data.bufs_head;
+ o_comp_data->comp_buf_size = jpeg_size;
+ o_comp_data->is_lossy = TRUE;
+
+ stat_compress_add(&enc->shared_data->jpeg_stat, start_time, src->stride * src->y,
+ o_comp_data->comp_buf_size);
+ return TRUE;
+ }
+
+ lz_data->data.bufs_head = jpeg_data->data.bufs_tail;
+ lz_data->data.bufs_tail = lz_data->data.bufs_head;
+
+ comp_head_filled = jpeg_size % sizeof(lz_data->data.bufs_head->buf);
+ comp_head_left = sizeof(lz_data->data.bufs_head->buf) - comp_head_filled;
+ lz_out_start_byte = lz_data->data.bufs_head->buf.bytes + comp_head_filled;
+
+ lz_data->data.u.lines_data.chunks = src->data;
+ lz_data->data.u.lines_data.stride = src->stride;
+ lz_data->data.u.lines_data.next = 0;
+ lz_data->data.u.lines_data.reverse = 0;
+
+ alpha_lz_size = lz_encode(lz, LZ_IMAGE_TYPE_XXXA, src->x, src->y,
+ !!(src->flags & SPICE_BITMAP_FLAGS_TOP_DOWN),
+ nullptr, 0, src->stride,
+ lz_out_start_byte,
+ comp_head_left);
+
+ // the compressed buffer is bigger than the original data
+ if ((jpeg_size + alpha_lz_size) > (src->y * src->stride)) {
+ longjmp(jpeg_data->data.jmp_env, 1);
+ }
+
+ dest->descriptor.type = SPICE_IMAGE_TYPE_JPEG_ALPHA;
+ dest->u.jpeg_alpha.flags = 0;
+ if (src->flags & SPICE_BITMAP_FLAGS_TOP_DOWN) {
+ dest->u.jpeg_alpha.flags |= SPICE_JPEG_ALPHA_FLAGS_TOP_DOWN;
+ }
+
+ dest->u.jpeg_alpha.jpeg_size = jpeg_size;
+ dest->u.jpeg_alpha.data_size = jpeg_size + alpha_lz_size;
+
+ o_comp_data->comp_buf = jpeg_data->data.bufs_head;
+ o_comp_data->comp_buf_size = jpeg_size + alpha_lz_size;
+ o_comp_data->is_lossy = TRUE;
+ stat_compress_add(&enc->shared_data->jpeg_alpha_stat, start_time, src->stride * src->y,
+ o_comp_data->comp_buf_size);
+ return TRUE;
+}
+
+#ifdef USE_LZ4
+bool image_encoders_compress_lz4(ImageEncoders *enc, SpiceImage *dest,
+ SpiceBitmap *src, compress_send_data_t* o_comp_data)
+{
+ Lz4Data *lz4_data = &enc->lz4_data;
+ Lz4EncoderContext *lz4 = enc->lz4;
+ int lz4_size = 0;
+ stat_start_time_t start_time;
+ stat_start_time_init(&start_time, &enc->shared_data->lz4_stat);
+
+ COMPRESS_DEBUG("LZ4 compress");
+
+ encoder_data_init(&lz4_data->data);
+
+ if (setjmp(lz4_data->data.jmp_env)) {
+ encoder_data_reset(&lz4_data->data);
+ return FALSE;
+ }
+
+ if (src->data->flags & SPICE_CHUNKS_FLAGS_UNSTABLE) {
+ spice_chunks_linearize(src->data);
+ }
+
+ lz4_data->data.u.lines_data.chunks = src->data;
+ lz4_data->data.u.lines_data.stride = src->stride;
+ lz4_data->data.u.lines_data.next = 0;
+ lz4_data->data.u.lines_data.reverse = 0;
+
+ lz4_size = lz4_encode(lz4, src->y, src->stride, lz4_data->data.bufs_head->buf.bytes,
+ sizeof(lz4_data->data.bufs_head->buf),
+ src->flags & SPICE_BITMAP_FLAGS_TOP_DOWN, src->format);
+
+ // the compressed buffer is bigger than the original data
+ if (lz4_size > (src->y * src->stride)) {
+ longjmp(lz4_data->data.jmp_env, 1);
+ }
+
+ dest->descriptor.type = SPICE_IMAGE_TYPE_LZ4;
+ dest->u.lz4.data_size = lz4_size;
+
+ o_comp_data->comp_buf = lz4_data->data.bufs_head;
+ o_comp_data->comp_buf_size = lz4_size;
+
+ stat_compress_add(&enc->shared_data->lz4_stat, start_time, src->stride * src->y,
+ o_comp_data->comp_buf_size);
+ return TRUE;
+}
+#endif
+
+/* if already exists, returns it. Otherwise allocates and adds it (1) to the ring tail
+ in the channel (2) to the Drawable*/
+static RedGlzDrawable *get_glz_drawable(ImageEncoders *enc, RedDrawable *red_drawable,
+ GlzImageRetention *glz_retention)
+{
+ RedGlzDrawable *ret;
+ RingItem *item, *next;
+
+ // TODO - I don't really understand what's going on here, so doing the technical equivalent
+ // now that we have multiple glz_dicts, so the only way to go from dcc to drawable glz is to go
+ // over the glz_ring (unless adding some better data structure then a ring)
+ SAFE_FOREACH(item, next, TRUE, &glz_retention->ring, ret, LINK_TO_GLZ(item)) {
+ if (ret->encoders == enc) {
+ return ret;
+ }
+ }
+
+ ret = g_new0(RedGlzDrawable, 1);
+
+ ret->encoders = enc;
+ ret->red_drawable.reset(red_drawable);
+ ret->has_drawable = TRUE;
+ ret->instances_count = 0;
+ ring_init(&ret->instances);
+
+ ring_item_init(&ret->link);
+ ring_item_init(&ret->drawable_link);
+ ring_add_before(&ret->link, &enc->glz_drawables);
+ ring_add(&glz_retention->ring, &ret->drawable_link);
+ enc->shared_data->glz_drawable_count++;
+ return ret;
+}
+
+/* allocates new instance and adds it to instances in the given drawable.
+ NOTE - the caller should set the glz_instance returned by the encoder by itself.*/
+static GlzDrawableInstanceItem *add_glz_drawable_instance(RedGlzDrawable *glz_drawable)
+{
+ spice_assert(glz_drawable->instances_count < MAX_GLZ_DRAWABLE_INSTANCES);
+ // NOTE: We assume the additions are performed consecutively, without removals in the middle
+ GlzDrawableInstanceItem *ret = glz_drawable->instances_pool + glz_drawable->instances_count;
+ glz_drawable->instances_count++;
+
+ ring_item_init(&ret->free_link);
+ ring_item_init(&ret->glz_link);
+ ring_add(&glz_drawable->instances, &ret->glz_link);
+ ret->context = nullptr;
+ ret->glz_drawable = glz_drawable;
+
+ return ret;
+}
+
+#define MIN_GLZ_SIZE_FOR_ZLIB 100
+
+bool image_encoders_compress_glz(ImageEncoders *enc,
+ SpiceImage *dest, SpiceBitmap *src,
+ RedDrawable *red_drawable,
+ GlzImageRetention *glz_retention,
+ compress_send_data_t* o_comp_data,
+ gboolean enable_zlib_glz_wrap)
+{
+ stat_start_time_t start_time;
+ stat_start_time_init(&start_time, &enc->shared_data->zlib_glz_stat);
+ spice_assert(bitmap_fmt_is_rgb(src->format));
+ GlzData *glz_data = &enc->glz_data;
+ ZlibData *zlib_data;
+ LzImageType type = bitmap_fmt_to_lz_image_type[src->format];
+ RedGlzDrawable *glz_drawable;
+ GlzDrawableInstanceItem *glz_drawable_instance;
+ int glz_size;
+ int zlib_size;
+
+ COMPRESS_DEBUG("LZ global compress fmt=%d", src->format);
+
+ if ((src->x * src->y) >= glz_enc_dictionary_get_size(enc->glz_dict->dict)) {
+ return FALSE;
+ }
+
+ pthread_rwlock_rdlock(&enc->glz_dict->encode_lock);
+ /* using the global dictionary only if it is not frozen */
+ if (enc->glz_dict->migrate_freeze) {
+ pthread_rwlock_unlock(&enc->glz_dict->encode_lock);
+ return FALSE;
+ }
+
+ encoder_data_init(&glz_data->data);
+
+ glz_drawable = get_glz_drawable(enc, red_drawable, glz_retention);
+ glz_drawable_instance = add_glz_drawable_instance(glz_drawable);
+
+ glz_data->data.u.lines_data.chunks = src->data;
+ glz_data->data.u.lines_data.stride = src->stride;
+ glz_data->data.u.lines_data.next = 0;
+ glz_data->data.u.lines_data.reverse = 0;
+
+ glz_size = glz_encode(enc->glz, type, src->x, src->y,
+ (src->flags & SPICE_BITMAP_FLAGS_TOP_DOWN), nullptr, 0,
+ src->stride, glz_data->data.bufs_head->buf.bytes,
+ sizeof(glz_data->data.bufs_head->buf),
+ glz_drawable_instance,
+ &glz_drawable_instance->context);
+
+ stat_compress_add(&enc->shared_data->glz_stat, start_time, src->stride * src->y, glz_size);
+
+ if (!enable_zlib_glz_wrap || (glz_size < MIN_GLZ_SIZE_FOR_ZLIB)) {
+ goto glz;
+ }
+ if (enc->zlib == nullptr) {
+ enc->zlib = zlib_encoder_create(&enc->zlib_data.usr, ZLIB_DEFAULT_COMPRESSION_LEVEL);
+ if (enc->zlib == nullptr) {
+ g_warning("creating zlib encoder failed");
+ goto glz;
+ }
+ }
+ stat_start_time_init(&start_time, &enc->shared_data->zlib_glz_stat);
+ zlib_data = &enc->zlib_data;
+
+ encoder_data_init(&zlib_data->data);
+
+ zlib_data->data.u.compressed_data.next = glz_data->data.bufs_head;
+ zlib_data->data.u.compressed_data.size_left = glz_size;
+
+ zlib_size = zlib_encode(enc->zlib, enc->zlib_level,
+ glz_size, zlib_data->data.bufs_head->buf.bytes,
+ sizeof(zlib_data->data.bufs_head->buf));
+
+ // the compressed buffer is bigger than the original data
+ if (zlib_size >= glz_size) {
+ encoder_data_reset(&zlib_data->data);
+ goto glz;
+ } else {
+ encoder_data_reset(&glz_data->data);
+ }
+
+ dest->descriptor.type = SPICE_IMAGE_TYPE_ZLIB_GLZ_RGB;
+ dest->u.zlib_glz.glz_data_size = glz_size;
+ dest->u.zlib_glz.data_size = zlib_size;
+
+ o_comp_data->comp_buf = zlib_data->data.bufs_head;
+ o_comp_data->comp_buf_size = zlib_size;
+
+ stat_compress_add(&enc->shared_data->zlib_glz_stat, start_time, glz_size, zlib_size);
+ pthread_rwlock_unlock(&enc->glz_dict->encode_lock);
+ return TRUE;
+
+glz:
+ pthread_rwlock_unlock(&enc->glz_dict->encode_lock);
+
+ dest->descriptor.type = SPICE_IMAGE_TYPE_GLZ_RGB;
+ dest->u.lz_rgb.data_size = glz_size;
+
+ o_comp_data->comp_buf = glz_data->data.bufs_head;
+ o_comp_data->comp_buf_size = glz_size;
+
+ return TRUE;
+}
+
+void image_encoder_shared_init(ImageEncoderSharedData *shared_data)
+{
+ clockid_t stat_clock = CLOCK_THREAD_CPUTIME_ID;
+
+ stat_compress_init(&shared_data->off_stat, "off", stat_clock);
+ stat_compress_init(&shared_data->lz_stat, "lz", stat_clock);
+ stat_compress_init(&shared_data->glz_stat, "glz", stat_clock);
+ stat_compress_init(&shared_data->quic_stat, "quic", stat_clock);
+ stat_compress_init(&shared_data->jpeg_stat, "jpeg", stat_clock);
+ stat_compress_init(&shared_data->zlib_glz_stat, "zlib", stat_clock);
+ stat_compress_init(&shared_data->jpeg_alpha_stat, "jpeg_alpha", stat_clock);
+ stat_compress_init(&shared_data->lz4_stat, "lz4", stat_clock);
+}
+
+void image_encoder_shared_stat_reset(ImageEncoderSharedData *shared_data)
+{
+ stat_reset(&shared_data->off_stat);
+ stat_reset(&shared_data->quic_stat);
+ stat_reset(&shared_data->lz_stat);
+ stat_reset(&shared_data->glz_stat);
+ stat_reset(&shared_data->jpeg_stat);
+ stat_reset(&shared_data->zlib_glz_stat);
+ stat_reset(&shared_data->jpeg_alpha_stat);
+ stat_reset(&shared_data->lz4_stat);
+}
+
+#define STAT_FMT "%s\t%8u\t%13.8g\t%12.8g\t%12.8g"
+
+#ifdef COMPRESS_STAT
+static void stat_print_one(const char *name, const stat_info_t *stat)
+{
+ spice_info(STAT_FMT, name, stat->count,
+ stat_byte_to_mega(stat->orig_size),
+ stat_byte_to_mega(stat->comp_size),
+ stat_cpu_time_to_sec(stat->total));
+}
+
+static void stat_sum(stat_info_t *total, const stat_info_t *stat)
+{
+ total->count += stat->count;
+ total->orig_size += stat->orig_size;
+ total->comp_size += stat->comp_size;
+ total->total += stat->total;
+}
+#endif
+
+void image_encoder_shared_stat_print(const ImageEncoderSharedData *shared_data)
+{
+#ifdef COMPRESS_STAT
+ /* sum all statistics */
+ stat_info_t total = {
+ .count = 0,
+ .total = 0,
+ .orig_size = 0,
+ .comp_size = 0,
+ };
+ stat_sum(&total, &shared_data->off_stat);
+ stat_sum(&total, &shared_data->quic_stat);
+ stat_sum(&total, &shared_data->glz_stat);
+ stat_sum(&total, &shared_data->lz_stat);
+ stat_sum(&total, &shared_data->jpeg_stat);
+ stat_sum(&total, &shared_data->jpeg_alpha_stat);
+ stat_sum(&total, &shared_data->lz4_stat);
+
+ /* fix for zlib glz */
+ total.total += shared_data->zlib_glz_stat.total;
+ if (shared_data->zlib_glz_stat.count) {
+ total.comp_size = total.comp_size - shared_data->glz_stat.comp_size +
+ shared_data->zlib_glz_stat.comp_size;
+ }
+
+ spice_info("Method \t count \torig_size(MB)\tenc_size(MB)\tenc_time(s)");
+ stat_print_one("OFF ", &shared_data->off_stat);
+ stat_print_one("QUIC ", &shared_data->quic_stat);
+ stat_print_one("GLZ ", &shared_data->glz_stat);
+ stat_print_one("ZLIB GLZ ", &shared_data->zlib_glz_stat);
+ stat_print_one("LZ ", &shared_data->lz_stat);
+ stat_print_one("JPEG ", &shared_data->jpeg_stat);
+ stat_print_one("JPEG-RGBA", &shared_data->jpeg_alpha_stat);
+ stat_print_one("LZ4 ", &shared_data->lz4_stat);
+ spice_info("-------------------------------------------------------------------");
+ stat_print_one("Total ", &total);
+#endif
+}
diff --git a/server/image-encoders.h b/server/image-encoders.h
new file mode 100644
index 00000000..17c78188
--- /dev/null
+++ b/server/image-encoders.h
@@ -0,0 +1,225 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef IMAGE_ENCODERS_H_
+#define IMAGE_ENCODERS_H_
+
+#include <setjmp.h>
+#include <pthread.h>
+#include <common/quic.h>
+#include <common/lz.h>
+#include <common/ring.h>
+
+#include "stat.h"
+#include "red-parse-qxl.h"
+#include "glz-encoder.h"
+#include "jpeg-encoder.h"
+#ifdef USE_LZ4
+#include "lz4-encoder.h"
+#endif
+#include "zlib-encoder.h"
+
+SPICE_BEGIN_DECLS
+
+struct RedClient;
+
+typedef struct RedCompressBuf RedCompressBuf;
+typedef struct ImageEncoders ImageEncoders;
+typedef struct ImageEncoderSharedData ImageEncoderSharedData;
+typedef struct GlzSharedDictionary GlzSharedDictionary;
+typedef struct GlzImageRetention GlzImageRetention;
+
+void image_encoder_shared_init(ImageEncoderSharedData *shared_data);
+void image_encoder_shared_stat_reset(ImageEncoderSharedData *shared_data);
+void image_encoder_shared_stat_print(const ImageEncoderSharedData *shared_data);
+
+void image_encoders_init(ImageEncoders *enc, ImageEncoderSharedData *shared_data);
+void image_encoders_free(ImageEncoders *enc);
+int image_encoders_free_some_independent_glz_drawables(ImageEncoders *enc);
+void image_encoders_free_glz_drawables(ImageEncoders *enc);
+void image_encoders_free_glz_drawables_to_free(ImageEncoders* enc);
+gboolean image_encoders_glz_create(ImageEncoders *enc, uint8_t id);
+void image_encoders_glz_get_restore_data(ImageEncoders *enc,
+ uint8_t *out_id, GlzEncDictRestoreData *out_data);
+gboolean image_encoders_glz_encode_lock(ImageEncoders *enc);
+void image_encoders_glz_encode_unlock(ImageEncoders *enc);
+void glz_retention_free_drawables(GlzImageRetention *ret);
+void glz_retention_detach_drawables(GlzImageRetention *ret);
+
+#define RED_COMPRESS_BUF_SIZE (1024 * 64)
+struct RedCompressBuf {
+ RedCompressBuf *send_next;
+
+ /* This buffer provide space for compression algorithms.
+ * Some algorithms access the buffer as an array of 32 bit words
+ * so is defined to make sure is always aligned that way.
+ */
+ union {
+ uint8_t bytes[RED_COMPRESS_BUF_SIZE];
+ uint32_t words[RED_COMPRESS_BUF_SIZE / 4];
+ } buf;
+};
+
+static inline void compress_buf_free(RedCompressBuf *buf)
+{
+ g_free(buf);
+}
+
+gboolean image_encoders_get_glz_dictionary(ImageEncoders *enc,
+ struct RedClient *client,
+ uint8_t id, int window_size);
+gboolean image_encoders_restore_glz_dictionary(ImageEncoders *enc,
+ struct RedClient *client,
+ uint8_t id,
+ GlzEncDictRestoreData *restore_data);
+
+typedef struct {
+ RedCompressBuf *bufs_head;
+ RedCompressBuf *bufs_tail;
+ jmp_buf jmp_env;
+ union {
+ struct {
+ SpiceChunks *chunks;
+ int next;
+ int stride;
+ int reverse;
+ } lines_data;
+ struct {
+ RedCompressBuf* next;
+ int size_left;
+ } compressed_data; // for encoding data that was already compressed by another method
+ } u;
+} EncoderData;
+
+typedef struct {
+ QuicUsrContext usr;
+ EncoderData data;
+} QuicData;
+
+typedef struct {
+ LzUsrContext usr;
+ EncoderData data;
+} LzData;
+
+typedef struct {
+ JpegEncoderUsrContext usr;
+ EncoderData data;
+} JpegData;
+
+#ifdef USE_LZ4
+typedef struct {
+ Lz4EncoderUsrContext usr;
+ EncoderData data;
+} Lz4Data;
+#endif
+
+typedef struct {
+ ZlibEncoderUsrContext usr;
+ EncoderData data;
+} ZlibData;
+
+typedef struct {
+ GlzEncoderUsrContext usr;
+ EncoderData data;
+} GlzData;
+
+struct GlzImageRetention {
+ Ring ring;
+};
+
+static inline void glz_retention_init(GlzImageRetention *ret)
+{
+ ring_init(&ret->ring);
+}
+
+struct ImageEncoderSharedData {
+ uint32_t glz_drawable_count;
+
+ stat_info_t off_stat;
+ stat_info_t lz_stat;
+ stat_info_t glz_stat;
+ stat_info_t quic_stat;
+ stat_info_t jpeg_stat;
+ stat_info_t zlib_glz_stat;
+ stat_info_t jpeg_alpha_stat;
+ stat_info_t lz4_stat;
+};
+
+struct ImageEncoders {
+ ImageEncoderSharedData *shared_data;
+
+ QuicData quic_data;
+ QuicContext *quic;
+
+ LzData lz_data;
+ LzContext *lz;
+
+ int jpeg_quality;
+
+ JpegData jpeg_data;
+ JpegEncoderContext *jpeg;
+
+#ifdef USE_LZ4
+ Lz4Data lz4_data;
+ Lz4EncoderContext *lz4;
+#endif
+
+ int zlib_level;
+
+ ZlibData zlib_data;
+ ZlibEncoder *zlib;
+
+ /* global lz encoding entities */
+ GlzSharedDictionary *glz_dict;
+ GlzEncoderContext *glz;
+ GlzData glz_data;
+
+ Ring glz_drawables; // all the living lz drawable, ordered by encoding time
+ Ring glz_drawables_inst_to_free; // list of instances to be freed
+ pthread_mutex_t glz_drawables_inst_to_free_lock;
+};
+
+typedef struct compress_send_data_t {
+ RedCompressBuf *comp_buf;
+ uint32_t comp_buf_size;
+ SpicePalette *lzplt_palette;
+ gboolean is_lossy;
+} compress_send_data_t;
+
+bool image_encoders_compress_quic(ImageEncoders *enc, SpiceImage *dest,
+ SpiceBitmap *src, compress_send_data_t* o_comp_data);
+bool image_encoders_compress_lz(ImageEncoders *enc, SpiceImage *dest,
+ SpiceBitmap *src, compress_send_data_t* o_comp_data);
+bool image_encoders_compress_jpeg(ImageEncoders *enc, SpiceImage *dest,
+ SpiceBitmap *src, compress_send_data_t* o_comp_data);
+#ifdef USE_LZ4
+bool image_encoders_compress_lz4(ImageEncoders *enc, SpiceImage *dest,
+ SpiceBitmap *src, compress_send_data_t* o_comp_data);
+#endif
+bool image_encoders_compress_glz(ImageEncoders *enc, SpiceImage *dest,
+ SpiceBitmap *src,
+ RedDrawable *red_drawable,
+ GlzImageRetention *glz_retention,
+ compress_send_data_t* o_comp_data,
+ gboolean enable_zlib_glz_wrap);
+
+#define RED_RELEASE_BUNCH_SIZE 64
+
+SPICE_END_DECLS
+
+#endif /* IMAGE_ENCODERS_H_ */
diff --git a/server/inputs-channel-client.cpp b/server/inputs-channel-client.cpp
new file mode 100644
index 00000000..9d3a9131
--- /dev/null
+++ b/server/inputs-channel-client.cpp
@@ -0,0 +1,91 @@
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+
+#include "inputs-channel-client.h"
+#include "migration-protocol.h"
+#include "red-channel-client.h"
+
+uint8_t *InputsChannelClient::alloc_recv_buf(uint16_t type, uint32_t size)
+{
+ if (size > sizeof(recv_buf)) {
+ red_channel_warning(get_channel(), "error: too large incoming message");
+ return nullptr;
+ }
+
+ return recv_buf;
+}
+
+void InputsChannelClient::release_recv_buf(uint16_t type, uint32_t size, uint8_t *msg)
+{
+}
+
+void InputsChannelClient::on_disconnect()
+{
+ get_channel()->release_keys();
+}
+
+InputsChannelClient* inputs_channel_client_create(RedChannel *channel,
+ RedClient *client,
+ RedStream *stream,
+ RedChannelCapabilities *caps)
+{
+ auto rcc = red::make_shared<InputsChannelClient>(channel, client, stream, caps);
+ if (!rcc->init()) {
+ return nullptr;
+ }
+ return rcc.get();
+}
+
+bool InputsChannelClient::init()
+{
+ if (!RedChannelClient::init()) {
+ return false;
+ }
+ pipe_add_init();
+ return true;
+}
+
+void InputsChannelClient::send_migrate_data(SpiceMarshaller *m, RedPipeItem *item)
+{
+ init_send_data(SPICE_MSG_MIGRATE_DATA);
+
+ spice_marshaller_add_uint32(m, SPICE_MIGRATE_DATA_INPUTS_MAGIC);
+ spice_marshaller_add_uint32(m, SPICE_MIGRATE_DATA_INPUTS_VERSION);
+ spice_marshaller_add_uint16(m, motion_count);
+}
+
+void InputsChannelClient::handle_migrate_data(uint16_t new_motion_count)
+{
+ motion_count = new_motion_count;
+
+ for (; motion_count >= SPICE_INPUT_MOTION_ACK_BUNCH;
+ motion_count -= SPICE_INPUT_MOTION_ACK_BUNCH) {
+ pipe_add_type(RED_PIPE_ITEM_MOUSE_MOTION_ACK);
+ }
+}
+
+void InputsChannelClient::on_mouse_motion()
+{
+ InputsChannel *inputs_channel = get_channel();
+
+ if (++motion_count % SPICE_INPUT_MOTION_ACK_BUNCH == 0 &&
+ !inputs_channel->is_src_during_migrate()) {
+ pipe_add_type(RED_PIPE_ITEM_MOUSE_MOTION_ACK);
+ motion_count = 0;
+ }
+}
diff --git a/server/inputs-channel-client.h b/server/inputs-channel-client.h
new file mode 100644
index 00000000..6f13c680
--- /dev/null
+++ b/server/inputs-channel-client.h
@@ -0,0 +1,76 @@
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef INPUTS_CHANNEL_CLIENT_H_
+#define INPUTS_CHANNEL_CLIENT_H_
+
+#include "red-channel-client.h"
+#include "inputs-channel.h"
+
+#include "push-visibility.h"
+
+class InputsChannelClient final: public RedChannelClient
+{
+public:
+ virtual bool init() override;
+
+private:
+ using RedChannelClient::RedChannelClient;
+
+ InputsChannel* get_channel()
+ {
+ return static_cast<InputsChannel*>(RedChannelClient::get_channel());
+ }
+ virtual bool handle_message(uint16_t type, uint32_t size, void *message) override;
+ virtual uint8_t *alloc_recv_buf(uint16_t type, uint32_t size) override;
+ virtual void release_recv_buf(uint16_t type, uint32_t size, uint8_t *msg) override;
+ virtual void on_disconnect() override;
+ virtual void send_item(RedPipeItem *base) override;
+ virtual bool handle_migrate_data(uint32_t size, void *message) override;
+ virtual void migrate() override;
+ virtual void handle_migrate_flush_mark() override;
+ void send_migrate_data(SpiceMarshaller *m, RedPipeItem *item);
+ void on_mouse_motion();
+ void handle_migrate_data(uint16_t motion_count);
+ void pipe_add_init();
+
+ enum {
+ // approximate max receive message size
+ // The largest message from client is "key_scancode" which contains
+ // key pressed or released. 2K is more then enough.
+ RECEIVE_BUF_SIZE = 2048
+ };
+
+ uint8_t recv_buf[RECEIVE_BUF_SIZE];
+ uint16_t motion_count;
+};
+
+InputsChannelClient* inputs_channel_client_create(RedChannel *channel,
+ RedClient *client,
+ RedStream *stream,
+ RedChannelCapabilities *caps);
+
+#include "pop-visibility.h"
+
+enum {
+ RED_PIPE_ITEM_INPUTS_INIT = RED_PIPE_ITEM_TYPE_CHANNEL_BASE,
+ RED_PIPE_ITEM_MOUSE_MOTION_ACK,
+ RED_PIPE_ITEM_KEY_MODIFIERS,
+ RED_PIPE_ITEM_MIGRATE_DATA,
+};
+
+#endif /* INPUTS_CHANNEL_CLIENT_H_ */
diff --git a/server/inputs-channel.cpp b/server/inputs-channel.cpp
new file mode 100644
index 00000000..029dad4a
--- /dev/null
+++ b/server/inputs-channel.cpp
@@ -0,0 +1,587 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+
+#include <spice/macros.h>
+#include <spice/protocol.h>
+#include <spice/vd_agent.h>
+
+#include <common/marshaller.h>
+#include <common/messages.h>
+#include <common/generated_server_marshallers.h>
+#include <common/demarshallers.h>
+
+#include "spice-wrapped.h"
+#include "red-common.h"
+#include "reds.h"
+#include "red-stream.h"
+#include "red-channel.h"
+#include "red-channel-client.h"
+#include "red-client.h"
+#include "inputs-channel-client.h"
+#include "main-channel-client.h"
+#include "inputs-channel.h"
+#include "migration-protocol.h"
+#include "utils.h"
+
+struct SpiceKbdState {
+ uint8_t push_ext_type;
+
+ /* track key press state */
+ bool key[0x80];
+ bool key_ext[0x80];
+ InputsChannel *inputs;
+};
+
+static SpiceKbdState* spice_kbd_state_new(InputsChannel *inputs)
+{
+ auto st = g_new0(SpiceKbdState, 1);
+ st->inputs = inputs;
+ return st;
+}
+
+struct SpiceMouseState {
+ int dummy;
+};
+
+static SpiceMouseState* spice_mouse_state_new()
+{
+ return g_new0(SpiceMouseState, 1);
+}
+
+struct SpiceTabletState {
+ RedsState *reds;
+};
+
+static SpiceTabletState* spice_tablet_state_new(RedsState* reds)
+{
+ auto st = g_new0(SpiceTabletState, 1);
+ st->reds = reds;
+ return st;
+}
+
+static void spice_tablet_state_free(SpiceTabletState* st)
+{
+ g_free(st);
+}
+
+RedsState* spice_tablet_state_get_server(SpiceTabletState *st)
+{
+ return st->reds;
+}
+
+struct RedKeyModifiersPipeItem: public RedPipeItemNum<RED_PIPE_ITEM_KEY_MODIFIERS> {
+ explicit RedKeyModifiersPipeItem(uint8_t modifiers);
+ uint8_t modifiers;
+};
+
+struct RedInputsInitPipeItem: public RedPipeItemNum<RED_PIPE_ITEM_INPUTS_INIT> {
+ explicit RedInputsInitPipeItem(uint8_t modifiers);
+ uint8_t modifiers;
+};
+
+
+#define KEY_MODIFIERS_TTL (MSEC_PER_SEC * 2)
+
+#define SCAN_CODE_RELEASE 0x80
+#define SCROLL_LOCK_SCAN_CODE 0x46
+#define NUM_LOCK_SCAN_CODE 0x45
+#define CAPS_LOCK_SCAN_CODE 0x3a
+
+void InputsChannel::set_tablet_logical_size(int x_res, int y_res)
+{
+ SpiceTabletInterface *sif;
+
+ sif = SPICE_UPCAST(SpiceTabletInterface, tablet->base.sif);
+ sif->set_logical_size(tablet, x_res, y_res);
+}
+
+const VDAgentMouseState *InputsChannel::get_mouse_state()
+{
+ return &mouse_state;
+}
+
+// middle and right states are inverted
+// all buttons from SPICE_MOUSE_BUTTON_MASK_SIDE are mapped a bit higher
+// to avoid conflicting with some internal Qemu bit
+#define RED_MOUSE_STATE_TO_LOCAL(state) \
+ ((state & SPICE_MOUSE_BUTTON_MASK_LEFT) | \
+ ((state & (SPICE_MOUSE_BUTTON_MASK_MIDDLE|0xffe0)) << 1) | \
+ ((state & SPICE_MOUSE_BUTTON_MASK_RIGHT) >> 1))
+
+// mouse button constants are defined to be off-one between agent and SPICE protocol
+#define RED_MOUSE_BUTTON_STATE_TO_AGENT(state) ((state) << 1)
+
+void InputsChannel::activate_modifiers_watch()
+{
+ red_timer_start(key_modifiers_timer, KEY_MODIFIERS_TTL);
+}
+
+static void kbd_push_scan(SpiceKbdInstance *sin, uint8_t scan)
+{
+ SpiceKbdInterface *sif;
+
+ if (!sin) {
+ return;
+ }
+ sif = SPICE_UPCAST(SpiceKbdInterface, sin->base.sif);
+
+ /* track XT scan code set 1 key state */
+ if (scan >= 0xe0 && scan <= 0xe2) {
+ sin->st->push_ext_type = scan;
+ } else {
+ if (sin->st->push_ext_type == 0 || sin->st->push_ext_type == 0xe0) {
+ bool *state = sin->st->push_ext_type ? sin->st->key_ext : sin->st->key;
+ state[scan & 0x7f] = !(scan & SCAN_CODE_RELEASE);
+ }
+ sin->st->push_ext_type = 0;
+ }
+
+ sif->push_scan_freg(sin, scan);
+}
+
+static uint8_t scancode_to_modifier_flag(uint8_t scancode)
+{
+ switch (scancode & ~SCAN_CODE_RELEASE) {
+ case CAPS_LOCK_SCAN_CODE:
+ return SPICE_KEYBOARD_MODIFIER_FLAGS_CAPS_LOCK;
+ case NUM_LOCK_SCAN_CODE:
+ return SPICE_KEYBOARD_MODIFIER_FLAGS_NUM_LOCK;
+ case SCROLL_LOCK_SCAN_CODE:
+ return SPICE_KEYBOARD_MODIFIER_FLAGS_SCROLL_LOCK;
+ }
+ return 0;
+}
+
+void InputsChannel::sync_locks(uint8_t scan)
+{
+ uint8_t change_modifier = scancode_to_modifier_flag(scan);
+
+ if (scan & SCAN_CODE_RELEASE) { /* KEY_UP */
+ modifiers_pressed &= ~change_modifier;
+ } else { /* KEY_DOWN */
+ if (change_modifier && !(modifiers_pressed & change_modifier)) {
+ modifiers ^= change_modifier;
+ modifiers_pressed |= change_modifier;
+ activate_modifiers_watch();
+ }
+ }
+}
+
+static uint8_t kbd_get_leds(SpiceKbdInstance *sin)
+{
+ SpiceKbdInterface *sif;
+
+ if (!sin) {
+ return 0;
+ }
+ sif = SPICE_UPCAST(SpiceKbdInterface, sin->base.sif);
+ return sif->get_leds(sin);
+}
+
+RedKeyModifiersPipeItem::RedKeyModifiersPipeItem(uint8_t init_modifiers):
+ modifiers(init_modifiers)
+{
+}
+
+void InputsChannelClient::send_item(RedPipeItem *base)
+{
+ SpiceMarshaller *m = get_marshaller();
+
+ switch (base->type) {
+ case RED_PIPE_ITEM_KEY_MODIFIERS:
+ {
+ SpiceMsgInputsKeyModifiers key_modifiers;
+
+ init_send_data(SPICE_MSG_INPUTS_KEY_MODIFIERS);
+ key_modifiers.modifiers =
+ static_cast<RedKeyModifiersPipeItem*>(base)->modifiers;
+ spice_marshall_msg_inputs_key_modifiers(m, &key_modifiers);
+ break;
+ }
+ case RED_PIPE_ITEM_INPUTS_INIT:
+ {
+ SpiceMsgInputsInit inputs_init;
+
+ init_send_data(SPICE_MSG_INPUTS_INIT);
+ inputs_init.keyboard_modifiers =
+ static_cast<RedInputsInitPipeItem*>(base)->modifiers;
+ spice_marshall_msg_inputs_init(m, &inputs_init);
+ break;
+ }
+ case RED_PIPE_ITEM_MOUSE_MOTION_ACK:
+ init_send_data(SPICE_MSG_INPUTS_MOUSE_MOTION_ACK);
+ break;
+ case RED_PIPE_ITEM_MIGRATE_DATA:
+ get_channel()->src_during_migrate = FALSE;
+ send_migrate_data(m, base);
+ break;
+ default:
+ spice_warning("invalid pipe iten %d", base->type);
+ break;
+ }
+ begin_send_message();
+}
+
+bool InputsChannelClient::handle_message(uint16_t type, uint32_t size, void *message)
+{
+ InputsChannel *inputs_channel = get_channel();
+ uint32_t i;
+ RedsState *reds = inputs_channel->get_server();
+
+ switch (type) {
+ case SPICE_MSGC_INPUTS_KEY_DOWN: {
+ auto key_down = static_cast<SpiceMsgcKeyDown *>(message);
+ inputs_channel->sync_locks(key_down->code);
+ }
+ /* fallthrough */
+ case SPICE_MSGC_INPUTS_KEY_UP: {
+ auto key_up = static_cast<SpiceMsgcKeyUp *>(message);
+ for (i = 0; i < 4; i++) {
+ uint8_t code = (key_up->code >> (i * 8)) & 0xff;
+ if (code == 0) {
+ break;
+ }
+ kbd_push_scan(inputs_channel->keyboard, code);
+ inputs_channel->sync_locks(code);
+ }
+ break;
+ }
+ case SPICE_MSGC_INPUTS_KEY_SCANCODE: {
+ auto code = static_cast<uint8_t *>(message);
+ for (i = 0; i < size; i++) {
+ kbd_push_scan(inputs_channel->keyboard, code[i]);
+ inputs_channel->sync_locks(code[i]);
+ }
+ break;
+ }
+ case SPICE_MSGC_INPUTS_MOUSE_MOTION: {
+ SpiceMouseInstance *mouse = inputs_channel->mouse;
+ auto mouse_motion = static_cast<SpiceMsgcMouseMotion *>(message);
+
+ on_mouse_motion();
+ if (mouse && reds_get_mouse_mode(reds) == SPICE_MOUSE_MODE_SERVER) {
+ SpiceMouseInterface *sif;
+ sif = SPICE_UPCAST(SpiceMouseInterface, mouse->base.sif);
+ sif->motion(mouse,
+ mouse_motion->dx, mouse_motion->dy, 0,
+ RED_MOUSE_STATE_TO_LOCAL(mouse_motion->buttons_state));
+ }
+ break;
+ }
+ case SPICE_MSGC_INPUTS_MOUSE_POSITION: {
+ auto pos = static_cast<SpiceMsgcMousePosition *>(message);
+ SpiceTabletInstance *tablet = inputs_channel->tablet;
+
+ on_mouse_motion();
+ if (reds_get_mouse_mode(reds) != SPICE_MOUSE_MODE_CLIENT) {
+ break;
+ }
+ spice_assert((reds_config_get_agent_mouse(reds) && reds_has_vdagent(reds)) || tablet);
+ if (!reds_config_get_agent_mouse(reds) || !reds_has_vdagent(reds)) {
+ SpiceTabletInterface *sif;
+ sif = SPICE_UPCAST(SpiceTabletInterface, tablet->base.sif);
+ sif->position(tablet, pos->x, pos->y, RED_MOUSE_STATE_TO_LOCAL(pos->buttons_state));
+ break;
+ }
+ VDAgentMouseState *mouse_state = &inputs_channel->mouse_state;
+ mouse_state->x = pos->x;
+ mouse_state->y = pos->y;
+ mouse_state->buttons = RED_MOUSE_BUTTON_STATE_TO_AGENT(pos->buttons_state);
+ mouse_state->display_id = pos->display_id;
+ reds_handle_agent_mouse_event(reds, mouse_state);
+ break;
+ }
+ case SPICE_MSGC_INPUTS_MOUSE_PRESS: {
+ auto mouse_press = static_cast<SpiceMsgcMousePress *>(message);
+ int dz = 0;
+ if (mouse_press->button == SPICE_MOUSE_BUTTON_UP) {
+ dz = -1;
+ } else if (mouse_press->button == SPICE_MOUSE_BUTTON_DOWN) {
+ dz = 1;
+ }
+ if (reds_get_mouse_mode(reds) == SPICE_MOUSE_MODE_CLIENT) {
+ if (reds_config_get_agent_mouse(reds) && reds_has_vdagent(reds)) {
+ inputs_channel->mouse_state.buttons =
+ RED_MOUSE_BUTTON_STATE_TO_AGENT(mouse_press->buttons_state) |
+ (dz == -1 ? VD_AGENT_UBUTTON_MASK : 0) |
+ (dz == 1 ? VD_AGENT_DBUTTON_MASK : 0);
+ reds_handle_agent_mouse_event(reds, &inputs_channel->mouse_state);
+ } else if (inputs_channel->tablet) {
+ SpiceTabletInterface *sif;
+ sif = SPICE_CONTAINEROF(inputs_channel->tablet->base.sif,
+ SpiceTabletInterface, base);
+ sif->wheel(inputs_channel->tablet, dz,
+ RED_MOUSE_STATE_TO_LOCAL(mouse_press->buttons_state));
+ }
+ } else if (inputs_channel->mouse) {
+ SpiceMouseInterface *sif;
+ sif = SPICE_CONTAINEROF(inputs_channel->mouse->base.sif,
+ SpiceMouseInterface, base);
+ sif->motion(inputs_channel->mouse, 0, 0, dz,
+ RED_MOUSE_STATE_TO_LOCAL(mouse_press->buttons_state));
+ }
+ break;
+ }
+ case SPICE_MSGC_INPUTS_MOUSE_RELEASE: {
+ auto mouse_release = static_cast<SpiceMsgcMouseRelease *>(message);
+ if (reds_get_mouse_mode(reds) == SPICE_MOUSE_MODE_CLIENT) {
+ if (reds_config_get_agent_mouse(reds) && reds_has_vdagent(reds)) {
+ inputs_channel->mouse_state.buttons =
+ RED_MOUSE_BUTTON_STATE_TO_AGENT(mouse_release->buttons_state);
+ reds_handle_agent_mouse_event(reds, &inputs_channel->mouse_state);
+ } else if (inputs_channel->tablet) {
+ SpiceTabletInterface *sif;
+ sif = SPICE_CONTAINEROF(inputs_channel->tablet->base.sif,
+ SpiceTabletInterface, base);
+ sif->buttons(inputs_channel->tablet,
+ RED_MOUSE_STATE_TO_LOCAL(mouse_release->buttons_state));
+ }
+ } else if (inputs_channel->mouse) {
+ SpiceMouseInterface *sif;
+ sif = SPICE_CONTAINEROF(inputs_channel->mouse->base.sif,
+ SpiceMouseInterface, base);
+ sif->buttons(inputs_channel->mouse,
+ RED_MOUSE_STATE_TO_LOCAL(mouse_release->buttons_state));
+ }
+ break;
+ }
+ case SPICE_MSGC_INPUTS_KEY_MODIFIERS: {
+ auto modifiers = static_cast<SpiceMsgcKeyModifiers *>(message);
+ uint8_t leds;
+ SpiceKbdInstance *keyboard = inputs_channel->keyboard;
+
+ if (!keyboard) {
+ break;
+ }
+ leds = inputs_channel->modifiers;
+ if (!(inputs_channel->modifiers_pressed & SPICE_KEYBOARD_MODIFIER_FLAGS_SCROLL_LOCK) &&
+ ((modifiers->modifiers & SPICE_KEYBOARD_MODIFIER_FLAGS_SCROLL_LOCK) !=
+ (leds & SPICE_KEYBOARD_MODIFIER_FLAGS_SCROLL_LOCK))) {
+ kbd_push_scan(keyboard, SCROLL_LOCK_SCAN_CODE);
+ kbd_push_scan(keyboard, SCROLL_LOCK_SCAN_CODE | SCAN_CODE_RELEASE);
+ inputs_channel->modifiers ^= SPICE_KEYBOARD_MODIFIER_FLAGS_SCROLL_LOCK;
+ }
+ if (!(inputs_channel->modifiers_pressed & SPICE_KEYBOARD_MODIFIER_FLAGS_NUM_LOCK) &&
+ ((modifiers->modifiers & SPICE_KEYBOARD_MODIFIER_FLAGS_NUM_LOCK) !=
+ (leds & SPICE_KEYBOARD_MODIFIER_FLAGS_NUM_LOCK))) {
+ kbd_push_scan(keyboard, NUM_LOCK_SCAN_CODE);
+ kbd_push_scan(keyboard, NUM_LOCK_SCAN_CODE | SCAN_CODE_RELEASE);
+ inputs_channel->modifiers ^= SPICE_KEYBOARD_MODIFIER_FLAGS_NUM_LOCK;
+ }
+ if (!(inputs_channel->modifiers_pressed & SPICE_KEYBOARD_MODIFIER_FLAGS_CAPS_LOCK) &&
+ ((modifiers->modifiers & SPICE_KEYBOARD_MODIFIER_FLAGS_CAPS_LOCK) !=
+ (leds & SPICE_KEYBOARD_MODIFIER_FLAGS_CAPS_LOCK))) {
+ kbd_push_scan(keyboard, CAPS_LOCK_SCAN_CODE);
+ kbd_push_scan(keyboard, CAPS_LOCK_SCAN_CODE | SCAN_CODE_RELEASE);
+ inputs_channel->modifiers ^= SPICE_KEYBOARD_MODIFIER_FLAGS_CAPS_LOCK;
+ }
+ inputs_channel->activate_modifiers_watch();
+ break;
+ }
+ default:
+ return RedChannelClient::handle_message(type, size, message);
+ }
+ return TRUE;
+}
+
+void InputsChannel::release_keys()
+{
+ int i;
+ SpiceKbdState *st;
+
+ if (!keyboard) {
+ return;
+ }
+ st = keyboard->st;
+
+ for (i = 0; i < SPICE_N_ELEMENTS(st->key); i++) {
+ if (!st->key[i])
+ continue;
+
+ st->key[i] = FALSE;
+ kbd_push_scan(keyboard, i | SCAN_CODE_RELEASE);
+ }
+
+ for (i = 0; i < SPICE_N_ELEMENTS(st->key_ext); i++) {
+ if (!st->key_ext[i])
+ continue;
+
+ st->key_ext[i] = FALSE;
+ kbd_push_scan(keyboard, 0xe0);
+ kbd_push_scan(keyboard, i | SCAN_CODE_RELEASE);
+ }
+}
+
+RedInputsInitPipeItem::RedInputsInitPipeItem(uint8_t init_modifiers):
+ modifiers(init_modifiers)
+{
+}
+
+void InputsChannelClient::pipe_add_init()
+{
+ auto modifiers = kbd_get_leds(get_channel()->keyboard);
+ pipe_add_push(red::make_shared<RedInputsInitPipeItem>(modifiers));
+}
+
+void InputsChannel::on_connect(RedClient *client, RedStream *stream, int migration,
+ RedChannelCapabilities *caps)
+{
+ if (!red_stream_is_ssl(stream) && !client->during_migrate_at_target()) {
+ client->get_main()->push_notify("keyboard channel is insecure");
+ }
+
+ inputs_channel_client_create(this, client, stream, caps);
+}
+
+void InputsChannelClient::migrate()
+{
+ InputsChannel *inputs = get_channel();
+ inputs->src_during_migrate = true;
+ RedChannelClient::migrate();
+}
+
+void InputsChannel::push_keyboard_modifiers()
+{
+ if (!is_connected() || src_during_migrate) {
+ return;
+ }
+ pipes_add(red::make_shared<RedKeyModifiersPipeItem>(modifiers));
+}
+
+SPICE_GNUC_VISIBLE int spice_server_kbd_leds(SpiceKbdInstance *sin, int leds)
+{
+ InputsChannel *inputs_channel = sin->st->inputs;
+ if (inputs_channel) {
+ inputs_channel->modifiers = leds;
+ inputs_channel->push_keyboard_modifiers();
+ }
+ return 0;
+}
+
+void InputsChannel::key_modifiers_sender(InputsChannel *inputs)
+{
+ inputs->push_keyboard_modifiers();
+}
+
+void InputsChannelClient::handle_migrate_flush_mark()
+{
+ pipe_add_type(RED_PIPE_ITEM_MIGRATE_DATA);
+}
+
+bool InputsChannelClient::handle_migrate_data(uint32_t size, void *message)
+{
+ InputsChannel *inputs = get_channel();
+ SpiceMigrateDataHeader *header;
+ SpiceMigrateDataInputs *mig_data;
+
+ if (size < sizeof(SpiceMigrateDataHeader) + sizeof(SpiceMigrateDataInputs)) {
+ spice_warning("bad message size %u", size);
+ return FALSE;
+ }
+
+ header = static_cast<SpiceMigrateDataHeader *>(message);
+ mig_data = reinterpret_cast<SpiceMigrateDataInputs *>(header + 1);
+
+ if (!migration_protocol_validate_header(header,
+ SPICE_MIGRATE_DATA_INPUTS_MAGIC,
+ SPICE_MIGRATE_DATA_INPUTS_VERSION)) {
+ spice_error("bad header");
+ return FALSE;
+ }
+ InputsChannel::key_modifiers_sender(inputs);
+ handle_migrate_data(mig_data->motion_count);
+ return TRUE;
+}
+
+red::shared_ptr<InputsChannel> inputs_channel_new(RedsState *reds)
+{
+ return red::make_shared<InputsChannel>(reds);
+}
+
+InputsChannel::InputsChannel(RedsState *reds):
+ RedChannel(reds, SPICE_CHANNEL_INPUTS, 0, RedChannel::MigrateAll)
+{
+ SpiceCoreInterfaceInternal *core = get_core_interface();
+
+ set_cap(SPICE_INPUTS_CAP_KEY_SCANCODE);
+ reds_register_channel(reds, this);
+
+ key_modifiers_timer = core->timer_new(key_modifiers_sender, this);
+ if (!key_modifiers_timer) {
+ spice_error("key modifiers timer create failed");
+ }
+}
+
+InputsChannel::~InputsChannel()
+{
+ detach_tablet(tablet);
+ red_timer_remove(key_modifiers_timer);
+}
+
+int InputsChannel::set_keyboard(SpiceKbdInstance *new_keyboard)
+{
+ if (keyboard) {
+ red_channel_warning(this, "already have keyboard");
+ return -1;
+ }
+ keyboard = new_keyboard;
+ keyboard->st = spice_kbd_state_new(this);
+ return 0;
+}
+
+int InputsChannel::set_mouse(SpiceMouseInstance *new_mouse)
+{
+ if (mouse) {
+ red_channel_warning(this, "already have mouse");
+ return -1;
+ }
+ mouse = new_mouse;
+ mouse->st = spice_mouse_state_new();
+ return 0;
+}
+
+int InputsChannel::set_tablet(SpiceTabletInstance *new_tablet)
+{
+ if (tablet) {
+ red_channel_warning(this, "already have tablet");
+ return -1;
+ }
+ tablet = new_tablet;
+ tablet->st = spice_tablet_state_new(get_server());
+ return 0;
+}
+
+bool InputsChannel::has_tablet() const
+{
+ return tablet != nullptr;
+}
+
+void InputsChannel::detach_tablet(SpiceTabletInstance *old_tablet)
+{
+ if (old_tablet != nullptr && old_tablet == tablet) {
+ spice_tablet_state_free(old_tablet->st);
+ old_tablet->st = nullptr;
+ }
+ tablet = nullptr;
+}
+
+bool InputsChannel::is_src_during_migrate() const
+{
+ return src_during_migrate;
+}
diff --git a/server/inputs-channel.h b/server/inputs-channel.h
new file mode 100644
index 00000000..d8093ef9
--- /dev/null
+++ b/server/inputs-channel.h
@@ -0,0 +1,83 @@
+/*
+ Copyright (C) 2009 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef INPUTS_CHANNEL_H_
+#define INPUTS_CHANNEL_H_
+
+// Inputs channel, dealing with keyboard, mouse, tablet.
+// This include should only be used by reds.cpp and inputs-channel.cpp
+
+#include <stdint.h>
+#include <spice/vd_agent.h>
+
+#include "red-channel.h"
+
+#include "push-visibility.h"
+
+class InputsChannelClient;
+
+class InputsChannel final: public RedChannel
+{
+ friend class InputsChannelClient;
+ friend int spice_server_kbd_leds(SpiceKbdInstance *sin, int leds);
+
+public:
+ InputsChannel(RedsState *reds);
+
+ const VDAgentMouseState *get_mouse_state();
+ void set_tablet_logical_size(int x_res, int y_res);
+
+ int set_keyboard(SpiceKbdInstance *keyboard);
+ int set_mouse(SpiceMouseInstance *mouse);
+ int set_tablet(SpiceTabletInstance *tablet);
+ bool has_tablet() const;
+ void detach_tablet(SpiceTabletInstance *tablet);
+
+private:
+ VDAgentMouseState mouse_state;
+ bool src_during_migrate;
+ SpiceTimer *key_modifiers_timer;
+
+ // actual ideal modifier states, that the guest should have
+ uint8_t modifiers;
+ // current pressed modifiers
+ uint8_t modifiers_pressed;
+
+ SpiceKbdInstance *keyboard;
+ SpiceMouseInstance *mouse;
+ SpiceTabletInstance *tablet;
+
+private:
+ ~InputsChannel();
+
+ void on_connect(RedClient *client, RedStream *stream, int migration,
+ RedChannelCapabilities *caps) override;
+ bool is_src_during_migrate() const;
+ void release_keys();
+ void sync_locks(uint8_t scan);
+ void activate_modifiers_watch();
+ void push_keyboard_modifiers();
+ static void key_modifiers_sender(InputsChannel *inputs);
+};
+
+red::shared_ptr<InputsChannel> inputs_channel_new(RedsState *reds);
+
+RedsState *spice_tablet_state_get_server(SpiceTabletState *st);
+
+#include "pop-visibility.h"
+
+#endif /* INPUTS_CHANNEL_H_ */
diff --git a/server/inputs_channel.c b/server/inputs_channel.c
deleted file mode 100644
index 395b81fc..00000000
--- a/server/inputs_channel.c
+++ /dev/null
@@ -1,674 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <netinet/in.h> // IPPROTO_TCP
-#include <netinet/tcp.h> // TCP_NODELAY
-#include <fcntl.h>
-#include <stddef.h> // NULL
-#include <errno.h>
-#include <spice/macros.h>
-#include <spice/vd_agent.h>
-#include <spice/protocol.h>
-#include <stdbool.h>
-
-#include "common/marshaller.h"
-#include "common/messages.h"
-#include "common/generated_server_marshallers.h"
-
-#include "demarshallers.h"
-#include "spice.h"
-#include "red_common.h"
-#include "reds.h"
-#include "reds_stream.h"
-#include "red_channel.h"
-#include "main_channel.h"
-#include "inputs_channel.h"
-#include "migration_protocol.h"
-
-// TODO: RECEIVE_BUF_SIZE used to be the same for inputs_channel and main_channel
-// since it was defined once in reds.c which contained both.
-// Now that they are split we can give a more fitting value for inputs - what
-// should it be?
-#define REDS_AGENT_WINDOW_SIZE 10
-#define REDS_NUM_INTERNAL_AGENT_MESSAGES 1
-
-// approximate max receive message size
-#define RECEIVE_BUF_SIZE \
- (4096 + (REDS_AGENT_WINDOW_SIZE + REDS_NUM_INTERNAL_AGENT_MESSAGES) * SPICE_AGENT_MAX_DATA_SIZE)
-
-struct SpiceKbdState {
- bool push_ext;
-
- /* track key press state */
- bool key[0x7f];
- bool key_ext[0x7f];
-};
-
-struct SpiceMouseState {
- int dummy;
-};
-
-struct SpiceTabletState {
- int dummy;
-};
-
-typedef struct InputsChannelClient {
- RedChannelClient base;
- uint16_t motion_count;
-} InputsChannelClient;
-
-typedef struct InputsChannel {
- RedChannel base;
- uint8_t recv_buf[RECEIVE_BUF_SIZE];
- VDAgentMouseState mouse_state;
- int src_during_migrate;
-} InputsChannel;
-
-enum {
- PIPE_ITEM_INPUTS_INIT = PIPE_ITEM_TYPE_CHANNEL_BASE,
- PIPE_ITEM_MOUSE_MOTION_ACK,
- PIPE_ITEM_KEY_MODIFIERS,
- PIPE_ITEM_MIGRATE_DATA,
-};
-
-typedef struct InputsPipeItem {
- PipeItem base;
-} InputsPipeItem;
-
-typedef struct KeyModifiersPipeItem {
- PipeItem base;
- uint8_t modifiers;
-} KeyModifiersPipeItem;
-
-typedef struct InputsInitPipeItem {
- PipeItem base;
- uint8_t modifiers;
-} InputsInitPipeItem;
-
-static SpiceKbdInstance *keyboard = NULL;
-static SpiceMouseInstance *mouse = NULL;
-static SpiceTabletInstance *tablet = NULL;
-
-static SpiceTimer *key_modifiers_timer;
-
-static InputsChannel *g_inputs_channel = NULL;
-
-#define KEY_MODIFIERS_TTL (1000 * 2) /*2sec*/
-
-#define SCROLL_LOCK_SCAN_CODE 0x46
-#define NUM_LOCK_SCAN_CODE 0x45
-#define CAPS_LOCK_SCAN_CODE 0x3a
-
-int inputs_inited(void)
-{
- return !!g_inputs_channel;
-}
-
-int inputs_set_keyboard(SpiceKbdInstance *_keyboard)
-{
- if (keyboard) {
- spice_printerr("already have keyboard");
- return -1;
- }
- keyboard = _keyboard;
- keyboard->st = spice_new0(SpiceKbdState, 1);
- return 0;
-}
-
-int inputs_set_mouse(SpiceMouseInstance *_mouse)
-{
- if (mouse) {
- spice_printerr("already have mouse");
- return -1;
- }
- mouse = _mouse;
- mouse->st = spice_new0(SpiceMouseState, 1);
- return 0;
-}
-
-int inputs_set_tablet(SpiceTabletInstance *_tablet)
-{
- if (tablet) {
- spice_printerr("already have tablet");
- return -1;
- }
- tablet = _tablet;
- tablet->st = spice_new0(SpiceTabletState, 1);
- return 0;
-}
-
-int inputs_has_tablet(void)
-{
- return !!tablet;
-}
-
-void inputs_detach_tablet(SpiceTabletInstance *_tablet)
-{
- spice_printerr("");
- tablet = NULL;
-}
-
-void inputs_set_tablet_logical_size(int x_res, int y_res)
-{
- SpiceTabletInterface *sif;
-
- sif = SPICE_CONTAINEROF(tablet->base.sif, SpiceTabletInterface, base);
- sif->set_logical_size(tablet, x_res, y_res);
-}
-
-const VDAgentMouseState *inputs_get_mouse_state(void)
-{
- spice_assert(g_inputs_channel);
- return &g_inputs_channel->mouse_state;
-}
-
-static uint8_t *inputs_channel_alloc_msg_rcv_buf(RedChannelClient *rcc,
- uint16_t type,
- uint32_t size)
-{
- InputsChannel *inputs_channel = SPICE_CONTAINEROF(rcc->channel, InputsChannel, base);
-
- if (size > RECEIVE_BUF_SIZE) {
- spice_printerr("error: too large incoming message");
- return NULL;
- }
- return inputs_channel->recv_buf;
-}
-
-static void inputs_channel_release_msg_rcv_buf(RedChannelClient *rcc,
- uint16_t type,
- uint32_t size,
- uint8_t *msg)
-{
-}
-
-#define OUTGOING_OK 0
-#define OUTGOING_FAILED -1
-#define OUTGOING_BLOCKED 1
-
-#define RED_MOUSE_STATE_TO_LOCAL(state) \
- ((state & SPICE_MOUSE_BUTTON_MASK_LEFT) | \
- ((state & SPICE_MOUSE_BUTTON_MASK_MIDDLE) << 1) | \
- ((state & SPICE_MOUSE_BUTTON_MASK_RIGHT) >> 1))
-
-#define RED_MOUSE_BUTTON_STATE_TO_AGENT(state) \
- (((state & SPICE_MOUSE_BUTTON_MASK_LEFT) ? VD_AGENT_LBUTTON_MASK : 0) | \
- ((state & SPICE_MOUSE_BUTTON_MASK_MIDDLE) ? VD_AGENT_MBUTTON_MASK : 0) | \
- ((state & SPICE_MOUSE_BUTTON_MASK_RIGHT) ? VD_AGENT_RBUTTON_MASK : 0))
-
-static void activate_modifiers_watch(void)
-{
- core->timer_start(key_modifiers_timer, KEY_MODIFIERS_TTL);
-}
-
-static void kbd_push_scan(SpiceKbdInstance *sin, uint8_t scan)
-{
- SpiceKbdInterface *sif;
-
- if (!sin) {
- return;
- }
- sif = SPICE_CONTAINEROF(sin->base.sif, SpiceKbdInterface, base);
-
- /* track XT scan code set 1 key state */
- if (scan == 0xe0) {
- sin->st->push_ext = TRUE;
- } else {
- bool *state = sin->st->push_ext ? sin->st->key : sin->st->key_ext;
- sin->st->push_ext = FALSE;
- state[scan & 0x7f] = !(scan & 0x80);
- }
-
- sif->push_scan_freg(sin, scan);
-}
-
-static uint8_t kbd_get_leds(SpiceKbdInstance *sin)
-{
- SpiceKbdInterface *sif;
-
- if (!sin) {
- return 0;
- }
- sif = SPICE_CONTAINEROF(sin->base.sif, SpiceKbdInterface, base);
- return sif->get_leds(sin);
-}
-
-static PipeItem *inputs_key_modifiers_item_new(
- RedChannelClient *rcc, void *data, int num)
-{
- KeyModifiersPipeItem *item = spice_malloc(sizeof(KeyModifiersPipeItem));
-
- red_channel_pipe_item_init(rcc->channel, &item->base,
- PIPE_ITEM_KEY_MODIFIERS);
- item->modifiers = *(uint8_t *)data;
- return &item->base;
-}
-
-static void inputs_channel_send_migrate_data(RedChannelClient *rcc,
- SpiceMarshaller *m,
- PipeItem *item)
-{
- InputsChannelClient *icc = SPICE_CONTAINEROF(rcc, InputsChannelClient, base);
-
- g_inputs_channel->src_during_migrate = FALSE;
- red_channel_client_init_send_data(rcc, SPICE_MSG_MIGRATE_DATA, item);
-
- spice_marshaller_add_uint32(m, SPICE_MIGRATE_DATA_INPUTS_MAGIC);
- spice_marshaller_add_uint32(m, SPICE_MIGRATE_DATA_INPUTS_VERSION);
- spice_marshaller_add_uint16(m, icc->motion_count);
-}
-
-static void inputs_channel_release_pipe_item(RedChannelClient *rcc,
- PipeItem *base, int item_pushed)
-{
- free(base);
-}
-
-static void inputs_channel_send_item(RedChannelClient *rcc, PipeItem *base)
-{
- SpiceMarshaller *m = red_channel_client_get_marshaller(rcc);
-
- switch (base->type) {
- case PIPE_ITEM_KEY_MODIFIERS:
- {
- SpiceMsgInputsKeyModifiers key_modifiers;
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_INPUTS_KEY_MODIFIERS, base);
- key_modifiers.modifiers =
- SPICE_CONTAINEROF(base, KeyModifiersPipeItem, base)->modifiers;
- spice_marshall_msg_inputs_key_modifiers(m, &key_modifiers);
- break;
- }
- case PIPE_ITEM_INPUTS_INIT:
- {
- SpiceMsgInputsInit inputs_init;
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_INPUTS_INIT, base);
- inputs_init.keyboard_modifiers =
- SPICE_CONTAINEROF(base, InputsInitPipeItem, base)->modifiers;
- spice_marshall_msg_inputs_init(m, &inputs_init);
- break;
- }
- case PIPE_ITEM_MOUSE_MOTION_ACK:
- red_channel_client_init_send_data(rcc, SPICE_MSG_INPUTS_MOUSE_MOTION_ACK, base);
- break;
- case PIPE_ITEM_MIGRATE_DATA:
- inputs_channel_send_migrate_data(rcc, m, base);
- break;
- default:
- spice_warning("invalid pipe iten %d", base->type);
- break;
- }
- red_channel_client_begin_send_message(rcc);
-}
-
-static int inputs_channel_handle_parsed(RedChannelClient *rcc, uint32_t size, uint16_t type,
- void *message)
-{
- InputsChannel *inputs_channel = (InputsChannel *)rcc->channel;
- InputsChannelClient *icc = (InputsChannelClient *)rcc;
- uint8_t *buf = (uint8_t *)message;
- uint32_t i;
-
- spice_assert(g_inputs_channel == inputs_channel);
- switch (type) {
- case SPICE_MSGC_INPUTS_KEY_DOWN: {
- SpiceMsgcKeyDown *key_up = (SpiceMsgcKeyDown *)buf;
- if (key_up->code == CAPS_LOCK_SCAN_CODE || key_up->code == NUM_LOCK_SCAN_CODE ||
- key_up->code == SCROLL_LOCK_SCAN_CODE) {
- activate_modifiers_watch();
- }
- }
- case SPICE_MSGC_INPUTS_KEY_UP: {
- SpiceMsgcKeyDown *key_down = (SpiceMsgcKeyDown *)buf;
- for (i = 0; i < 4; i++) {
- uint8_t code = (key_down->code >> (i * 8)) & 0xff;
- if (code == 0) {
- break;
- }
- kbd_push_scan(keyboard, code);
- }
- break;
- }
- case SPICE_MSGC_INPUTS_KEY_SCANCODE: {
- uint8_t *code = (uint8_t *)buf;
- for (i = 0; i < size; i++) {
- kbd_push_scan(keyboard, code[i]);
- }
- break;
- }
- case SPICE_MSGC_INPUTS_MOUSE_MOTION: {
- SpiceMsgcMouseMotion *mouse_motion = (SpiceMsgcMouseMotion *)buf;
-
- if (++icc->motion_count % SPICE_INPUT_MOTION_ACK_BUNCH == 0 &&
- !g_inputs_channel->src_during_migrate) {
- red_channel_client_pipe_add_type(rcc, PIPE_ITEM_MOUSE_MOTION_ACK);
- icc->motion_count = 0;
- }
- if (mouse && reds_get_mouse_mode() == SPICE_MOUSE_MODE_SERVER) {
- SpiceMouseInterface *sif;
- sif = SPICE_CONTAINEROF(mouse->base.sif, SpiceMouseInterface, base);
- sif->motion(mouse,
- mouse_motion->dx, mouse_motion->dy, 0,
- RED_MOUSE_STATE_TO_LOCAL(mouse_motion->buttons_state));
- }
- break;
- }
- case SPICE_MSGC_INPUTS_MOUSE_POSITION: {
- SpiceMsgcMousePosition *pos = (SpiceMsgcMousePosition *)buf;
-
- if (++icc->motion_count % SPICE_INPUT_MOTION_ACK_BUNCH == 0 &&
- !g_inputs_channel->src_during_migrate) {
- red_channel_client_pipe_add_type(rcc, PIPE_ITEM_MOUSE_MOTION_ACK);
- icc->motion_count = 0;
- }
- if (reds_get_mouse_mode() != SPICE_MOUSE_MODE_CLIENT) {
- break;
- }
- spice_assert((reds_get_agent_mouse() && reds_has_vdagent()) || tablet);
- if (!reds_get_agent_mouse() || !reds_has_vdagent()) {
- SpiceTabletInterface *sif;
- sif = SPICE_CONTAINEROF(tablet->base.sif, SpiceTabletInterface, base);
- sif->position(tablet, pos->x, pos->y, RED_MOUSE_STATE_TO_LOCAL(pos->buttons_state));
- break;
- }
- VDAgentMouseState *mouse_state = &inputs_channel->mouse_state;
- mouse_state->x = pos->x;
- mouse_state->y = pos->y;
- mouse_state->buttons = RED_MOUSE_BUTTON_STATE_TO_AGENT(pos->buttons_state);
- mouse_state->display_id = pos->display_id;
- reds_handle_agent_mouse_event(mouse_state);
- break;
- }
- case SPICE_MSGC_INPUTS_MOUSE_PRESS: {
- SpiceMsgcMousePress *mouse_press = (SpiceMsgcMousePress *)buf;
- int dz = 0;
- if (mouse_press->button == SPICE_MOUSE_BUTTON_UP) {
- dz = -1;
- } else if (mouse_press->button == SPICE_MOUSE_BUTTON_DOWN) {
- dz = 1;
- }
- if (reds_get_mouse_mode() == SPICE_MOUSE_MODE_CLIENT) {
- if (reds_get_agent_mouse() && reds_has_vdagent()) {
- inputs_channel->mouse_state.buttons =
- RED_MOUSE_BUTTON_STATE_TO_AGENT(mouse_press->buttons_state) |
- (dz == -1 ? VD_AGENT_UBUTTON_MASK : 0) |
- (dz == 1 ? VD_AGENT_DBUTTON_MASK : 0);
- reds_handle_agent_mouse_event(&inputs_channel->mouse_state);
- } else if (tablet) {
- SpiceTabletInterface *sif;
- sif = SPICE_CONTAINEROF(tablet->base.sif, SpiceTabletInterface, base);
- sif->wheel(tablet, dz, RED_MOUSE_STATE_TO_LOCAL(mouse_press->buttons_state));
- }
- } else if (mouse) {
- SpiceMouseInterface *sif;
- sif = SPICE_CONTAINEROF(mouse->base.sif, SpiceMouseInterface, base);
- sif->motion(mouse, 0, 0, dz,
- RED_MOUSE_STATE_TO_LOCAL(mouse_press->buttons_state));
- }
- break;
- }
- case SPICE_MSGC_INPUTS_MOUSE_RELEASE: {
- SpiceMsgcMouseRelease *mouse_release = (SpiceMsgcMouseRelease *)buf;
- if (reds_get_mouse_mode() == SPICE_MOUSE_MODE_CLIENT) {
- if (reds_get_agent_mouse() && reds_has_vdagent()) {
- inputs_channel->mouse_state.buttons =
- RED_MOUSE_BUTTON_STATE_TO_AGENT(mouse_release->buttons_state);
- reds_handle_agent_mouse_event(&inputs_channel->mouse_state);
- } else if (tablet) {
- SpiceTabletInterface *sif;
- sif = SPICE_CONTAINEROF(tablet->base.sif, SpiceTabletInterface, base);
- sif->buttons(tablet, RED_MOUSE_STATE_TO_LOCAL(mouse_release->buttons_state));
- }
- } else if (mouse) {
- SpiceMouseInterface *sif;
- sif = SPICE_CONTAINEROF(mouse->base.sif, SpiceMouseInterface, base);
- sif->buttons(mouse,
- RED_MOUSE_STATE_TO_LOCAL(mouse_release->buttons_state));
- }
- break;
- }
- case SPICE_MSGC_INPUTS_KEY_MODIFIERS: {
- SpiceMsgcKeyModifiers *modifiers = (SpiceMsgcKeyModifiers *)buf;
- uint8_t leds;
-
- if (!keyboard) {
- break;
- }
- leds = kbd_get_leds(keyboard);
- if ((modifiers->modifiers & SPICE_KEYBOARD_MODIFIER_FLAGS_SCROLL_LOCK) !=
- (leds & SPICE_KEYBOARD_MODIFIER_FLAGS_SCROLL_LOCK)) {
- kbd_push_scan(keyboard, SCROLL_LOCK_SCAN_CODE);
- kbd_push_scan(keyboard, SCROLL_LOCK_SCAN_CODE | 0x80);
- }
- if ((modifiers->modifiers & SPICE_KEYBOARD_MODIFIER_FLAGS_NUM_LOCK) !=
- (leds & SPICE_KEYBOARD_MODIFIER_FLAGS_NUM_LOCK)) {
- kbd_push_scan(keyboard, NUM_LOCK_SCAN_CODE);
- kbd_push_scan(keyboard, NUM_LOCK_SCAN_CODE | 0x80);
- }
- if ((modifiers->modifiers & SPICE_KEYBOARD_MODIFIER_FLAGS_CAPS_LOCK) !=
- (leds & SPICE_KEYBOARD_MODIFIER_FLAGS_CAPS_LOCK)) {
- kbd_push_scan(keyboard, CAPS_LOCK_SCAN_CODE);
- kbd_push_scan(keyboard, CAPS_LOCK_SCAN_CODE | 0x80);
- }
- activate_modifiers_watch();
- break;
- }
- case SPICE_MSGC_DISCONNECTING:
- break;
- default:
- return red_channel_client_handle_message(rcc, size, type, message);
- }
- return TRUE;
-}
-
-static void inputs_release_keys(void)
-{
- int i;
- SpiceKbdState *st = keyboard->st;
-
- for (i = 0; i < SPICE_N_ELEMENTS(st->key); i++) {
- if (!st->key[i])
- continue;
-
- st->key[i] = FALSE;
- kbd_push_scan(keyboard, i | 0x80);
- }
-
- for (i = 0; i < SPICE_N_ELEMENTS(st->key_ext); i++) {
- if (!st->key_ext[i])
- continue;
-
- st->key_ext[i] = FALSE;
- kbd_push_scan(keyboard, 0xe0);
- kbd_push_scan(keyboard, i | 0x80);
- }
-}
-
-static void inputs_channel_on_disconnect(RedChannelClient *rcc)
-{
- if (!rcc) {
- return;
- }
- inputs_release_keys();
-}
-
-static void inputs_pipe_add_init(RedChannelClient *rcc)
-{
- InputsInitPipeItem *item = spice_malloc(sizeof(InputsInitPipeItem));
-
- red_channel_pipe_item_init(rcc->channel, &item->base,
- PIPE_ITEM_INPUTS_INIT);
- item->modifiers = kbd_get_leds(keyboard);
- red_channel_client_pipe_add_push(rcc, &item->base);
-}
-
-static int inputs_channel_config_socket(RedChannelClient *rcc)
-{
- int delay_val = 1;
- RedsStream *stream = red_channel_client_get_stream(rcc);
-
- if (setsockopt(stream->socket, IPPROTO_TCP, TCP_NODELAY,
- &delay_val, sizeof(delay_val)) == -1) {
- if (errno != ENOTSUP && errno != ENOPROTOOPT) {
- spice_printerr("setsockopt failed, %s", strerror(errno));
- return FALSE;
- }
- }
-
- return TRUE;
-}
-
-static void inputs_channel_hold_pipe_item(RedChannelClient *rcc, PipeItem *item)
-{
-}
-
-static void inputs_connect(RedChannel *channel, RedClient *client,
- RedsStream *stream, int migration,
- int num_common_caps, uint32_t *common_caps,
- int num_caps, uint32_t *caps)
-{
- InputsChannelClient *icc;
-
- spice_assert(g_inputs_channel);
- spice_assert(channel == &g_inputs_channel->base);
-
- if (!reds_stream_is_ssl(stream) && !red_client_during_migrate_at_target(client)) {
- main_channel_client_push_notify(red_client_get_main(client),
- "keyboard channel is insecure");
- }
-
- spice_printerr("inputs channel client create");
- icc = (InputsChannelClient*)red_channel_client_create(sizeof(InputsChannelClient),
- channel,
- client,
- stream,
- FALSE,
- num_common_caps, common_caps,
- num_caps, caps);
- if (!icc) {
- return;
- }
- icc->motion_count = 0;
- inputs_pipe_add_init(&icc->base);
-}
-
-static void inputs_migrate(RedChannelClient *rcc)
-{
- g_inputs_channel->src_during_migrate = TRUE;
- red_channel_client_default_migrate(rcc);
-}
-
-static void inputs_push_keyboard_modifiers(uint8_t modifiers)
-{
- if (!g_inputs_channel || !red_channel_is_connected(&g_inputs_channel->base) ||
- g_inputs_channel->src_during_migrate) {
- return;
- }
- red_channel_pipes_new_add_push(&g_inputs_channel->base,
- inputs_key_modifiers_item_new, (void*)&modifiers);
-}
-
-void inputs_on_keyboard_leds_change(void *opaque, uint8_t leds)
-{
- inputs_push_keyboard_modifiers(leds);
-}
-
-static void key_modifiers_sender(void *opaque)
-{
- inputs_push_keyboard_modifiers(kbd_get_leds(keyboard));
-}
-
-static int inputs_channel_handle_migrate_flush_mark(RedChannelClient *rcc)
-{
- red_channel_client_pipe_add_type(rcc, PIPE_ITEM_MIGRATE_DATA);
- return TRUE;
-}
-
-static int inputs_channel_handle_migrate_data(RedChannelClient *rcc,
- uint32_t size,
- void *message)
-{
- InputsChannelClient *icc = SPICE_CONTAINEROF(rcc, InputsChannelClient, base);
- SpiceMigrateDataHeader *header;
- SpiceMigrateDataInputs *mig_data;
-
- header = (SpiceMigrateDataHeader *)message;
- mig_data = (SpiceMigrateDataInputs *)(header + 1);
-
- if (!migration_protocol_validate_header(header,
- SPICE_MIGRATE_DATA_INPUTS_MAGIC,
- SPICE_MIGRATE_DATA_INPUTS_VERSION)) {
- spice_error("bad header");
- return FALSE;
- }
- key_modifiers_sender(NULL);
- icc->motion_count = mig_data->motion_count;
-
- for (; icc->motion_count >= SPICE_INPUT_MOTION_ACK_BUNCH;
- icc->motion_count -= SPICE_INPUT_MOTION_ACK_BUNCH) {
- red_channel_client_pipe_add_type(rcc, PIPE_ITEM_MOUSE_MOTION_ACK);
- }
- return TRUE;
-}
-
-void inputs_init(void)
-{
- ChannelCbs channel_cbs = { NULL, };
- ClientCbs client_cbs = { NULL, };
-
- spice_assert(!g_inputs_channel);
-
- channel_cbs.config_socket = inputs_channel_config_socket;
- channel_cbs.on_disconnect = inputs_channel_on_disconnect;
- channel_cbs.send_item = inputs_channel_send_item;
- channel_cbs.hold_item = inputs_channel_hold_pipe_item;
- channel_cbs.release_item = inputs_channel_release_pipe_item;
- channel_cbs.alloc_recv_buf = inputs_channel_alloc_msg_rcv_buf;
- channel_cbs.release_recv_buf = inputs_channel_release_msg_rcv_buf;
- channel_cbs.handle_migrate_data = inputs_channel_handle_migrate_data;
- channel_cbs.handle_migrate_flush_mark = inputs_channel_handle_migrate_flush_mark;
-
- g_inputs_channel = (InputsChannel *)red_channel_create_parser(
- sizeof(InputsChannel),
- core,
- SPICE_CHANNEL_INPUTS, 0,
- FALSE, /* handle_acks */
- spice_get_client_channel_parser(SPICE_CHANNEL_INPUTS, NULL),
- inputs_channel_handle_parsed,
- &channel_cbs,
- SPICE_MIGRATE_NEED_FLUSH | SPICE_MIGRATE_NEED_DATA_TRANSFER);
-
- if (!g_inputs_channel) {
- spice_error("failed to allocate Inputs Channel");
- }
-
- client_cbs.connect = inputs_connect;
- client_cbs.migrate = inputs_migrate;
- red_channel_register_client_cbs(&g_inputs_channel->base, &client_cbs);
-
- red_channel_set_cap(&g_inputs_channel->base, SPICE_INPUTS_CAP_KEY_SCANCODE);
- reds_register_channel(&g_inputs_channel->base);
-
- if (!(key_modifiers_timer = core->timer_add(key_modifiers_sender, NULL))) {
- spice_error("key modifiers timer create failed");
- }
-}
diff --git a/server/inputs_channel.h b/server/inputs_channel.h
deleted file mode 100644
index 672ca83a..00000000
--- a/server/inputs_channel.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _INPUTS_CHANNEL_H_
-#define _INPUTS_CHANNEL_H_
-
-// Inputs channel, dealing with keyboard, mouse, tablet.
-// This include should only be used by reds.c and inputs_channel.c
-
-#include <stdint.h>
-#include <spice/vd_agent.h>
-
-void inputs_init(void);
-int inputs_inited(void);
-int inputs_has_tablet(void);
-const VDAgentMouseState *inputs_get_mouse_state(void);
-void inputs_on_keyboard_leds_change(void *opaque, uint8_t leds);
-int inputs_set_keyboard(SpiceKbdInstance *_keyboard);
-int inputs_set_mouse(SpiceMouseInstance *_mouse);
-int inputs_set_tablet(SpiceTabletInstance *_tablet);
-void inputs_detach_tablet(SpiceTabletInstance *_tablet);
-void inputs_set_tablet_logical_size(int x_res, int y_res);
-
-#endif
diff --git a/server/jpeg_encoder.c b/server/jpeg-encoder.c
index 01732ffa..fee07105 100644
--- a/server/jpeg_encoder.c
+++ b/server/jpeg-encoder.c
@@ -14,15 +14,20 @@
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
-#ifdef HAVE_CONFIG_H
#include <config.h>
+
+#ifdef _WIN32
+/* Avoid conflicting types for INT32 */
+#define QGLOBAL_H
#endif
-#include "red_common.h"
-#include "jpeg_encoder.h"
+#include <stdio.h>
#include <jpeglib.h>
-typedef struct JpegEncoder {
+#include "red-common.h"
+#include "jpeg-encoder.h"
+
+struct JpegEncoderContext {
JpegEncoderUsrContext *usr;
struct jpeg_destination_mgr dest_mgr;
@@ -35,9 +40,11 @@ typedef struct JpegEncoder {
int height;
int stride;
unsigned int out_size;
- void (*convert_line_to_RGB24) (uint8_t *line, int width, uint8_t **out_line);
+ void (*convert_line_to_RGB24) (void *line, int width, uint8_t **out_line);
} cur_image;
-} JpegEncoder;
+};
+
+typedef struct JpegEncoderContext JpegEncoder;
/* jpeg destination manager callbacks */
@@ -82,7 +89,7 @@ JpegEncoderContext* jpeg_encoder_create(JpegEncoderUsrContext *usr)
return NULL;
}
- enc = spice_new0(JpegEncoder, 1);
+ enc = g_new0(JpegEncoder, 1);
enc->usr = usr;
@@ -95,18 +102,18 @@ JpegEncoderContext* jpeg_encoder_create(JpegEncoderUsrContext *usr)
jpeg_create_compress(&enc->cinfo);
enc->cinfo.client_data = enc;
enc->cinfo.dest = &enc->dest_mgr;
- return (JpegEncoderContext*)enc;
+ return enc;
}
void jpeg_encoder_destroy(JpegEncoderContext* encoder)
{
- jpeg_destroy_compress(&((JpegEncoder*)encoder)->cinfo);
- free(encoder);
+ jpeg_destroy_compress(&encoder->cinfo);
+ g_free(encoder);
}
-static void convert_RGB16_to_RGB24(uint8_t *line, int width, uint8_t **out_line)
+static void convert_RGB16_to_RGB24(void *line, int width, uint8_t **out_line)
{
- uint16_t *src_line = (uint16_t *)line;
+ uint16_t *src_line = (uint16_t *) line;
uint8_t *out_pix;
int x;
@@ -116,17 +123,18 @@ static void convert_RGB16_to_RGB24(uint8_t *line, int width, uint8_t **out_line)
for (x = 0; x < width; x++) {
uint16_t pixel = *src_line++;
+ pixel = GUINT16_FROM_LE(pixel);
*out_pix++ = ((pixel >> 7) & 0xf8) | ((pixel >> 12) & 0x7);
*out_pix++ = ((pixel >> 2) & 0xf8) | ((pixel >> 7) & 0x7);
*out_pix++ = ((pixel << 3) & 0xf8) | ((pixel >> 2) & 0x7);
}
}
-static void convert_BGR24_to_RGB24(uint8_t *line, int width, uint8_t **out_line)
+static void convert_BGR24_to_RGB24(void *in_line, int width, uint8_t **out_line)
{
int x;
uint8_t *out_pix;
-
+ uint8_t *line = (uint8_t *) in_line;
spice_assert(out_line && *out_line);
out_pix = *out_line;
@@ -139,9 +147,9 @@ static void convert_BGR24_to_RGB24(uint8_t *line, int width, uint8_t **out_line)
}
}
-static void convert_BGRX32_to_RGB24(uint8_t *line, int width, uint8_t **out_line)
+static void convert_BGRX32_to_RGB24(void *line, int width, uint8_t **out_line)
{
- uint32_t *src_line = (uint32_t *)line;
+ uint32_t *src_line = (uint32_t *) line;
uint8_t *out_pix;
int x;
@@ -151,17 +159,13 @@ static void convert_BGRX32_to_RGB24(uint8_t *line, int width, uint8_t **out_line
for (x = 0; x < width; x++) {
uint32_t pixel = *src_line++;
+ pixel = GUINT32_FROM_LE(pixel);
*out_pix++ = (pixel >> 16) & 0xff;
*out_pix++ = (pixel >> 8) & 0xff;
*out_pix++ = pixel & 0xff;
}
}
-static void convert_RGB24_to_RGB24(uint8_t *line, int width, uint8_t **out_line)
-{
- *out_line = line;
-}
-
#define FILL_LINES() { \
if (lines == lines_end) { \
@@ -182,9 +186,7 @@ static void do_jpeg_encode(JpegEncoder *jpeg, uint8_t *lines, unsigned int num_l
width = jpeg->cur_image.width;
stride = jpeg->cur_image.stride;
- if (jpeg->cur_image.type != JPEG_IMAGE_TYPE_RGB24) {
- RGB24_line = (uint8_t *)spice_malloc(width*3);
- }
+ RGB24_line = g_new(uint8_t, width*3);
lines_end = lines + (stride * num_lines);
@@ -195,17 +197,13 @@ static void do_jpeg_encode(JpegEncoder *jpeg, uint8_t *lines, unsigned int num_l
jpeg_write_scanlines(&jpeg->cinfo, row_pointer, 1);
}
- if (jpeg->cur_image.type != JPEG_IMAGE_TYPE_RGB24) {
- free(RGB24_line);
- }
+ g_free(RGB24_line);
}
-int jpeg_encode(JpegEncoderContext *jpeg, int quality, JpegEncoderImageType type,
+int jpeg_encode(JpegEncoderContext *enc, int quality, JpegEncoderImageType type,
int width, int height, uint8_t *lines, unsigned int num_lines, int stride,
uint8_t *io_ptr, unsigned int num_io_bytes)
{
- JpegEncoder *enc = (JpegEncoder *)jpeg;
-
enc->cur_image.type = type;
enc->cur_image.width = width;
enc->cur_image.height = height;
@@ -216,9 +214,6 @@ int jpeg_encode(JpegEncoderContext *jpeg, int quality, JpegEncoderImageType type
case JPEG_IMAGE_TYPE_RGB16:
enc->cur_image.convert_line_to_RGB24 = convert_RGB16_to_RGB24;
break;
- case JPEG_IMAGE_TYPE_RGB24:
- enc->cur_image.convert_line_to_RGB24 = convert_RGB24_to_RGB24;
- break;
case JPEG_IMAGE_TYPE_BGR24:
enc->cur_image.convert_line_to_RGB24 = convert_BGR24_to_RGB24;
break;
diff --git a/server/jpeg_encoder.h b/server/jpeg-encoder.h
index 690a0296..9a3325f2 100644
--- a/server/jpeg_encoder.h
+++ b/server/jpeg-encoder.h
@@ -27,22 +27,25 @@
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef _H_JPEG_ENCODER
-#define _H_JPEG_ENCODER
+
+#ifndef JPEG_ENCODER_H_
+#define JPEG_ENCODER_H_
#include <spice/types.h>
+#include <spice/macros.h>
+
+SPICE_BEGIN_DECLS
typedef enum {
JPEG_IMAGE_TYPE_INVALID,
JPEG_IMAGE_TYPE_RGB16,
/* in byte per color types, the notation is according to the order of the
colors in the memory */
- JPEG_IMAGE_TYPE_RGB24,
JPEG_IMAGE_TYPE_BGR24,
JPEG_IMAGE_TYPE_BGRX32,
} JpegEncoderImageType;
-typedef void* JpegEncoderContext;
+typedef struct JpegEncoderContext JpegEncoderContext;
typedef struct JpegEncoderUsrContext JpegEncoderUsrContext;
struct JpegEncoderUsrContext {
@@ -55,7 +58,10 @@ void jpeg_encoder_destroy(JpegEncoderContext *encoder);
/* returns the total size of the encoded data. Images must be supplied from the
top line to the bottom */
-int jpeg_encode(JpegEncoderContext *jpeg, int quality, JpegEncoderImageType type,
+int jpeg_encode(JpegEncoderContext *enc, int quality, JpegEncoderImageType type,
int width, int height, uint8_t *lines, unsigned int num_lines, int stride,
uint8_t *io_ptr, unsigned int num_io_bytes);
-#endif
+
+SPICE_END_DECLS
+
+#endif /* JPEG_ENCODER_H_ */
diff --git a/server/lz4-encoder.c b/server/lz4-encoder.c
new file mode 100644
index 00000000..3ff3b6b5
--- /dev/null
+++ b/server/lz4-encoder.c
@@ -0,0 +1,122 @@
+/*
+ Copyright (C) 2014 Flexible Software Solutions S.L.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+
+#include <lz4.h>
+#include "red-common.h"
+#include "lz4-encoder.h"
+
+typedef struct Lz4Encoder {
+ Lz4EncoderUsrContext *usr;
+} Lz4Encoder;
+
+Lz4EncoderContext* lz4_encoder_create(Lz4EncoderUsrContext *usr)
+{
+ Lz4Encoder *enc;
+ if (!usr->more_space || !usr->more_lines) {
+ return NULL;
+ }
+
+ enc = g_new0(Lz4Encoder, 1);
+ enc->usr = usr;
+
+ return (Lz4EncoderContext*)enc;
+}
+
+void lz4_encoder_destroy(Lz4EncoderContext* encoder)
+{
+ g_free(encoder);
+}
+
+int lz4_encode(Lz4EncoderContext *lz4, int height, int stride, uint8_t *io_ptr,
+ unsigned int num_io_bytes, int top_down, uint8_t format)
+{
+ Lz4Encoder *enc = (Lz4Encoder *)lz4;
+ uint8_t *lines;
+ int num_lines = 0;
+ int total_lines = 0;
+ int in_size, enc_size, out_size, already_copied;
+ uint8_t *in_buf, *compressed_lines;
+ uint8_t *out_buf = io_ptr;
+ LZ4_stream_t *stream = LZ4_createStream();
+
+ // Encode direction and format
+ *(out_buf++) = top_down ? 1 : 0;
+ *(out_buf++) = format;
+ num_io_bytes -= 2;
+ out_size = 2;
+
+ do {
+ num_lines = enc->usr->more_lines(enc->usr, &lines);
+ if (num_lines <= 0) {
+ spice_error("more lines failed");
+ LZ4_freeStream(stream);
+ return 0;
+ }
+ in_buf = lines;
+ in_size = stride * num_lines;
+ lines += in_size;
+ int bound_size = LZ4_compressBound(in_size);
+ compressed_lines = g_new(uint8_t, bound_size + 4);
+#ifdef HAVE_LZ4_COMPRESS_FAST_CONTINUE
+ enc_size = LZ4_compress_fast_continue(stream, (const char *) in_buf,
+ (char *) compressed_lines + 4, in_size,
+ bound_size, 1);
+#else
+ enc_size = LZ4_compress_continue(stream, (const char *) in_buf,
+ (char *) compressed_lines + 4, in_size);
+#endif
+ if (enc_size <= 0) {
+ spice_error("compress failed!");
+ g_free(compressed_lines);
+ LZ4_freeStream(stream);
+ return 0;
+ }
+ // compressed_lines is returned by malloc so is surely aligned
+ *SPICE_ALIGNED_CAST(uint32_t *, compressed_lines) = GUINT32_TO_BE(enc_size);
+
+ out_size += enc_size += 4;
+ already_copied = 0;
+ while (num_io_bytes < enc_size) {
+ memcpy(out_buf, compressed_lines + already_copied, num_io_bytes);
+ already_copied += num_io_bytes;
+ enc_size -= num_io_bytes;
+ num_io_bytes = enc->usr->more_space(enc->usr, &io_ptr);
+ if (num_io_bytes <= 0) {
+ spice_error("more space failed");
+ g_free(compressed_lines);
+ LZ4_freeStream(stream);
+ return 0;
+ }
+ out_buf = io_ptr;
+ }
+ memcpy(out_buf, compressed_lines + already_copied, enc_size);
+ out_buf += enc_size;
+ num_io_bytes -= enc_size;
+
+ g_free(compressed_lines);
+ total_lines += num_lines;
+ } while (total_lines < height);
+
+ LZ4_freeStream(stream);
+ if (total_lines != height) {
+ spice_error("too many lines");
+ out_size = 0;
+ }
+
+ return out_size;
+}
diff --git a/server/lz4-encoder.h b/server/lz4-encoder.h
new file mode 100644
index 00000000..ed119a1f
--- /dev/null
+++ b/server/lz4-encoder.h
@@ -0,0 +1,56 @@
+/*
+ Copyright (C) 2014 Flexible Software Solutions S.L.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS
+ IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#ifndef LZ4_ENCODER_H_
+#define LZ4_ENCODER_H_
+
+#include <spice/types.h>
+#include <spice/macros.h>
+
+SPICE_BEGIN_DECLS
+
+typedef void* Lz4EncoderContext;
+typedef struct Lz4EncoderUsrContext Lz4EncoderUsrContext;
+
+struct Lz4EncoderUsrContext {
+ int (*more_space)(Lz4EncoderUsrContext *usr, uint8_t **io_ptr);
+ int (*more_lines)(Lz4EncoderUsrContext *usr, uint8_t **lines);
+};
+
+Lz4EncoderContext* lz4_encoder_create(Lz4EncoderUsrContext *usr);
+void lz4_encoder_destroy(Lz4EncoderContext *encoder);
+
+/* returns the total size of the encoded data. */
+int lz4_encode(Lz4EncoderContext *lz4, int height, int stride, uint8_t *io_ptr,
+ unsigned int num_io_bytes, int top_down, uint8_t format);
+
+SPICE_END_DECLS
+
+#endif /* LZ4_ENCODER_H_ */
diff --git a/server/main-channel-client.cpp b/server/main-channel-client.cpp
new file mode 100644
index 00000000..01600064
--- /dev/null
+++ b/server/main-channel-client.cpp
@@ -0,0 +1,869 @@
+/*
+ Copyright (C) 2009-2016 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+
+#include <common/generated_server_marshallers.h>
+
+#include "main-channel-client.h"
+#include "main-channel.h"
+#include "red-channel-client.h"
+#include "red-client.h"
+#include "reds.h"
+
+#define NET_TEST_WARMUP_BYTES 0
+#define NET_TEST_BYTES (1024 * 250)
+
+enum NetTestStage {
+ NET_TEST_STAGE_INVALID,
+ NET_TEST_STAGE_WARMUP,
+ NET_TEST_STAGE_LATENCY,
+ NET_TEST_STAGE_RATE,
+ NET_TEST_STAGE_COMPLETE,
+};
+
+#define CLIENT_CONNECTIVITY_TIMEOUT (MSEC_PER_SEC * 30)
+
+// approximate max receive message size for main channel
+#define MAIN_CHANNEL_RECEIVE_BUF_SIZE \
+ (4096 + (REDS_AGENT_WINDOW_SIZE + REDS_NUM_INTERNAL_AGENT_MESSAGES) * SPICE_AGENT_MAX_DATA_SIZE)
+
+struct MainChannelClientPrivate {
+ SPICE_CXX_GLIB_ALLOCATOR
+
+ uint32_t connection_id;
+ uint32_t ping_id = 0;
+ uint32_t net_test_id = 0;
+ NetTestStage net_test_stage = NET_TEST_STAGE_INVALID;
+ uint64_t latency = 0;
+ uint64_t bitrate_per_sec = ~0;
+ int mig_wait_connect = 0;
+ int mig_connect_ok = 0;
+ int mig_wait_prev_complete = 0;
+ int mig_wait_prev_try_seamless = 0;
+ int init_sent = 0;
+ int seamless_mig_dst = 0;
+ bool initial_channels_list_sent = false;
+ uint8_t recv_buf[MAIN_CHANNEL_RECEIVE_BUF_SIZE];
+};
+
+struct RedPingPipeItem: public RedPipeItemNum<RED_PIPE_ITEM_TYPE_MAIN_PING> {
+ int size;
+};
+
+struct RedTokensPipeItem: public RedPipeItemNum<RED_PIPE_ITEM_TYPE_MAIN_AGENT_TOKEN> {
+ int tokens;
+};
+
+struct RedInitPipeItem: public RedPipeItemNum<RED_PIPE_ITEM_TYPE_MAIN_INIT> {
+ int connection_id;
+ int display_channels_hint;
+ int current_mouse_mode;
+ int is_client_mouse_allowed;
+ int multi_media_time;
+ int ram_hint;
+};
+
+struct RedNamePipeItem: public RedPipeItemNum<RED_PIPE_ITEM_TYPE_MAIN_NAME> {
+ SpiceMsgMainName msg;
+};
+
+struct RedUuidPipeItem: public RedPipeItemNum<RED_PIPE_ITEM_TYPE_MAIN_UUID> {
+ SpiceMsgMainUuid msg;
+};
+
+struct RedNotifyPipeItem: public RedPipeItemNum<RED_PIPE_ITEM_TYPE_MAIN_NOTIFY> {
+ red::glib_unique_ptr<char> msg;
+};
+
+struct RedMouseModePipeItem: public RedPipeItemNum<RED_PIPE_ITEM_TYPE_MAIN_MOUSE_MODE> {
+ SpiceMouseMode current_mode;
+ int is_client_mouse_allowed;
+};
+
+struct RedMultiMediaTimePipeItem: public RedPipeItemNum<RED_PIPE_ITEM_TYPE_MAIN_MULTI_MEDIA_TIME> {
+ uint32_t time;
+};
+
+struct RedRegisteredChannelPipeItem:
+ public RedPipeItemNum<RED_PIPE_ITEM_TYPE_MAIN_REGISTERED_CHANNEL>
+{
+ uint32_t channel_type;
+ uint32_t channel_id;
+};
+
+#define ZERO_BUF_SIZE 4096
+
+static const uint8_t zero_page[ZERO_BUF_SIZE] = {0};
+
+uint8_t *MainChannelClient::alloc_recv_buf(uint16_t type, uint32_t size)
+{
+ if (type == SPICE_MSGC_MAIN_AGENT_DATA) {
+ RedChannel *channel = get_channel();
+ return reds_get_agent_data_buffer(channel->get_server(), this, size);
+ }
+
+ if (size > sizeof(priv->recv_buf)) {
+ /* message too large, caller will log a message and close the connection */
+ return nullptr;
+ }
+
+ return priv->recv_buf;
+}
+
+void MainChannelClient::release_recv_buf(uint16_t type, uint32_t size, uint8_t *msg)
+{
+ if (type == SPICE_MSGC_MAIN_AGENT_DATA) {
+ RedChannel *channel = get_channel();
+ reds_release_agent_data_buffer(channel->get_server(), msg);
+ }
+}
+
+/*
+ * When the main channel is disconnected, disconnect the entire client.
+ */
+void MainChannelClient::on_disconnect()
+{
+ RedsState *reds = get_channel()->get_server();
+ reds_get_main_dispatcher(reds)->client_disconnect(get_client());
+}
+
+static void main_channel_client_push_ping(MainChannelClient *mcc, int size);
+
+static RedPipeItemPtr main_notify_item_new(const char *msg, int num)
+{
+ auto item = red::make_shared<RedNotifyPipeItem>();
+
+ item->msg.reset(g_strdup(msg));
+ return item;
+}
+
+void MainChannelClient::start_net_test(int test_rate)
+{
+ if (priv->net_test_id) {
+ return;
+ }
+
+ if (!test_rate) {
+ start_connectivity_monitoring(CLIENT_CONNECTIVITY_TIMEOUT);
+ return;
+ }
+
+ priv->net_test_id = priv->ping_id + 1;
+ priv->net_test_stage = NET_TEST_STAGE_WARMUP;
+
+ main_channel_client_push_ping(this, NET_TEST_WARMUP_BYTES);
+ main_channel_client_push_ping(this, 0);
+ main_channel_client_push_ping(this, NET_TEST_BYTES);
+}
+
+static RedPipeItemPtr red_ping_item_new(int size)
+{
+ auto item = red::make_shared<RedPingPipeItem>();
+
+ item->size = size;
+ return item;
+}
+
+static void main_channel_client_push_ping(MainChannelClient *mcc, int size)
+{
+ auto item = red_ping_item_new(size);
+ mcc->pipe_add_push(std::move(item));
+}
+
+static RedPipeItemPtr main_agent_tokens_item_new(uint32_t num_tokens)
+{
+ auto item = red::make_shared<RedTokensPipeItem>();
+
+ item->tokens = num_tokens;
+ return item;
+}
+
+
+void MainChannelClient::push_agent_tokens(uint32_t num_tokens)
+{
+ auto item = main_agent_tokens_item_new(num_tokens);
+
+ pipe_add_push(std::move(item));
+}
+
+void MainChannelClient::push_agent_data(red::shared_ptr<RedAgentDataPipeItem>&& item)
+{
+ pipe_add_push(item);
+}
+
+static RedPipeItemPtr
+main_init_item_new(int connection_id,
+ int display_channels_hint,
+ SpiceMouseMode current_mouse_mode,
+ int is_client_mouse_allowed,
+ int multi_media_time,
+ int ram_hint)
+{
+ auto item = red::make_shared<RedInitPipeItem>();
+
+ item->connection_id = connection_id;
+ item->display_channels_hint = display_channels_hint;
+ item->current_mouse_mode = current_mouse_mode;
+ item->is_client_mouse_allowed = is_client_mouse_allowed;
+ item->multi_media_time = multi_media_time;
+ item->ram_hint = ram_hint;
+ return item;
+}
+
+void MainChannelClient::push_init(int display_channels_hint,
+ SpiceMouseMode current_mouse_mode,
+ int is_client_mouse_allowed,
+ int multi_media_time, int ram_hint)
+{
+ auto item = main_init_item_new(priv->connection_id, display_channels_hint,
+ current_mouse_mode, is_client_mouse_allowed,
+ multi_media_time, ram_hint);
+ pipe_add_push(std::move(item));
+}
+
+static RedPipeItemPtr main_name_item_new(const char *name)
+{
+ auto item = new (strlen(name) + 1) RedNamePipeItem();
+ item->msg.name_len = strlen(name) + 1;
+ memcpy(&item->msg.name, name, item->msg.name_len);
+
+ return RedPipeItemPtr(item);
+}
+
+void MainChannelClient::push_name(const char *name)
+{
+ if (!test_remote_cap(SPICE_MAIN_CAP_NAME_AND_UUID))
+ return;
+
+ auto item = main_name_item_new(name);
+ pipe_add_push(std::move(item));
+}
+
+static RedPipeItemPtr main_uuid_item_new(const uint8_t uuid[16])
+{
+ auto item = red::make_shared<RedUuidPipeItem>();
+
+ memcpy(item->msg.uuid, uuid, sizeof(item->msg.uuid));
+
+ return item;
+}
+
+void MainChannelClient::push_uuid(const uint8_t uuid[16])
+{
+ if (!test_remote_cap(SPICE_MAIN_CAP_NAME_AND_UUID))
+ return;
+
+ auto item = main_uuid_item_new(uuid);
+ pipe_add_push(std::move(item));
+}
+
+void MainChannelClient::push_notify(const char *msg)
+{
+ auto item = main_notify_item_new(msg, 1);
+ pipe_add_push(std::move(item));
+}
+
+RedPipeItemPtr
+main_mouse_mode_item_new(SpiceMouseMode current_mode, int is_client_mouse_allowed)
+{
+ auto item = red::make_shared<RedMouseModePipeItem>();
+
+ item->current_mode = current_mode;
+ item->is_client_mouse_allowed = is_client_mouse_allowed;
+ return item;
+}
+
+RedPipeItemPtr
+main_multi_media_time_item_new(uint32_t mm_time)
+{
+ auto item = red::make_shared<RedMultiMediaTimePipeItem>();
+ item->time = mm_time;
+ return item;
+}
+
+RedPipeItemPtr
+registered_channel_item_new(RedChannel *channel)
+{
+ auto item = red::make_shared<RedRegisteredChannelPipeItem>();
+
+ item->channel_type = channel->type();
+ item->channel_id = channel->id();
+ return item;
+}
+
+void MainChannelClient::handle_migrate_connected(int success, int seamless)
+{
+ if (priv->mig_wait_connect) {
+ MainChannel *channel = get_channel();
+
+ priv->mig_wait_connect = FALSE;
+ priv->mig_connect_ok = success;
+ channel->on_migrate_connected(success, seamless);
+ } else {
+ if (success) {
+ pipe_add_empty_msg(SPICE_MSG_MAIN_MIGRATE_CANCEL);
+ }
+ }
+}
+
+void MainChannelClient::handle_migrate_dst_do_seamless(uint32_t src_version)
+{
+ RedChannel *channel = get_channel();
+ if (reds_on_migrate_dst_set_seamless(channel->get_server(), this, src_version)) {
+ priv->seamless_mig_dst = TRUE;
+ pipe_add_empty_msg(SPICE_MSG_MAIN_MIGRATE_DST_SEAMLESS_ACK);
+ } else {
+ pipe_add_empty_msg(SPICE_MSG_MAIN_MIGRATE_DST_SEAMLESS_NACK);
+ }
+}
+
+void MainChannelClient::handle_pong(SpiceMsgPing *ping, uint32_t size)
+{
+ uint64_t roundtrip;
+
+ roundtrip = spice_get_monotonic_time_ns() / NSEC_PER_MICROSEC - ping->timestamp;
+
+ if (ping->id != priv->net_test_id) {
+ /*
+ * channel client monitors the connectivity using ping-pong messages
+ */
+ RedChannelClient::handle_message(SPICE_MSGC_PONG, size, ping);
+ return;
+ }
+
+ switch (priv->net_test_stage) {
+ case NET_TEST_STAGE_WARMUP:
+ priv->net_test_id++;
+ priv->net_test_stage = NET_TEST_STAGE_LATENCY;
+ priv->latency = roundtrip;
+ break;
+ case NET_TEST_STAGE_LATENCY:
+ priv->net_test_id++;
+ priv->net_test_stage = NET_TEST_STAGE_RATE;
+ priv->latency = MIN(priv->latency, roundtrip);
+ break;
+ case NET_TEST_STAGE_RATE:
+ priv->net_test_id = 0;
+ if (roundtrip <= priv->latency) {
+ // probably high load on client or server result with incorrect values
+ red_channel_debug(get_channel(),
+ "net test: invalid values, latency %" G_GUINT64_FORMAT
+ " roundtrip %" G_GUINT64_FORMAT ". assuming high"
+ "bandwidth", priv->latency, roundtrip);
+ priv->latency = 0;
+ priv->net_test_stage = NET_TEST_STAGE_INVALID;
+ start_connectivity_monitoring(CLIENT_CONNECTIVITY_TIMEOUT);
+ break;
+ }
+ priv->bitrate_per_sec =
+ uint64_t{NET_TEST_BYTES * 8} * 1000000 / (roundtrip - priv->latency);
+ priv->net_test_stage = NET_TEST_STAGE_COMPLETE;
+ red_channel_debug(get_channel(),
+ "net test: latency %f ms, bitrate %" G_GUINT64_FORMAT " bps (%f Mbps)%s",
+ (double)priv->latency / 1000,
+ priv->bitrate_per_sec,
+ (double)priv->bitrate_per_sec / 1024 / 1024,
+ this->is_low_bandwidth() ? " LOW BANDWIDTH" : "");
+ start_connectivity_monitoring(CLIENT_CONNECTIVITY_TIMEOUT);
+ break;
+ default:
+ red_channel_warning(get_channel(),
+ "invalid net test stage, ping id %d test id %d stage %d",
+ ping->id,
+ priv->net_test_id,
+ priv->net_test_stage);
+ priv->net_test_stage = NET_TEST_STAGE_INVALID;
+ }
+}
+
+void MainChannelClient::handle_migrate_end()
+{
+ RedClient *client = get_client();
+ if (!client->during_migrate_at_target()) {
+ red_channel_warning(get_channel(),
+ "unexpected SPICE_MSGC_MIGRATE_END");
+ return;
+ }
+ if (!test_remote_cap(SPICE_MAIN_CAP_SEMI_SEAMLESS_MIGRATE)) {
+ red_channel_warning(get_channel(),
+ "unexpected SPICE_MSGC_MIGRATE_END, "
+ "client does not support semi-seamless migration");
+ return;
+ }
+ client->semi_seamless_migrate_complete();
+}
+
+void MainChannelClient::migrate_cancel_wait()
+{
+ if (priv->mig_wait_connect) {
+ priv->mig_wait_connect = FALSE;
+ priv->mig_connect_ok = FALSE;
+ }
+ priv->mig_wait_prev_complete = FALSE;
+}
+
+void MainChannelClient::migrate_dst_complete()
+{
+ if (priv->mig_wait_prev_complete) {
+ if (priv->mig_wait_prev_try_seamless) {
+ RedChannel *channel = get_channel();
+ spice_assert(channel->get_n_clients() == 1);
+ pipe_add_type(RED_PIPE_ITEM_TYPE_MAIN_MIGRATE_BEGIN_SEAMLESS);
+ } else {
+ pipe_add_type(RED_PIPE_ITEM_TYPE_MAIN_MIGRATE_BEGIN);
+ }
+ priv->mig_wait_connect = TRUE;
+ priv->mig_wait_prev_complete = FALSE;
+ }
+}
+
+gboolean MainChannelClient::migrate_src_complete(gboolean success)
+{
+ gboolean ret = FALSE;
+ bool semi_seamless_support = test_remote_cap(SPICE_MAIN_CAP_SEMI_SEAMLESS_MIGRATE);
+ if (semi_seamless_support && priv->mig_connect_ok) {
+ if (success) {
+ pipe_add_empty_msg(SPICE_MSG_MAIN_MIGRATE_END);
+ ret = TRUE;
+ } else {
+ pipe_add_empty_msg(SPICE_MSG_MAIN_MIGRATE_CANCEL);
+ }
+ } else {
+ if (success) {
+ pipe_add_type(RED_PIPE_ITEM_TYPE_MAIN_MIGRATE_SWITCH_HOST);
+ }
+ }
+ priv->mig_connect_ok = FALSE;
+ priv->mig_wait_connect = FALSE;
+
+ return ret;
+}
+
+
+MainChannelClient::MainChannelClient(MainChannel *channel,
+ RedClient *client,
+ RedStream *stream,
+ RedChannelCapabilities *caps,
+ uint32_t connection_id):
+ RedChannelClient(channel, client, stream, caps)
+{
+ priv->connection_id = connection_id;
+}
+
+MainChannelClient *main_channel_client_create(MainChannel *main_chan, RedClient *client,
+ RedStream *stream, uint32_t connection_id,
+ RedChannelCapabilities *caps)
+{
+ auto mcc =
+ red::make_shared<MainChannelClient>(main_chan, client, stream, caps, connection_id);
+ if (!mcc->init()) {
+ return nullptr;
+ }
+ return mcc.get();
+}
+
+bool MainChannelClient::is_network_info_initialized() const
+{
+ return priv->net_test_stage == NET_TEST_STAGE_COMPLETE;
+}
+
+bool MainChannelClient::is_low_bandwidth() const
+{
+ // TODO: configurable?
+ return priv->bitrate_per_sec < 10 * 1024 * 1024;
+}
+
+uint64_t MainChannelClient::get_bitrate_per_sec() const
+{
+ return priv->bitrate_per_sec;
+}
+
+uint64_t MainChannelClient::get_roundtrip_ms() const
+{
+ return priv->latency / 1000;
+}
+
+void MainChannelClient::migrate()
+{
+ RedChannel *channel = get_channel();
+ reds_on_main_channel_migrate(channel->get_server(), this);
+ RedChannelClient::migrate();
+}
+
+gboolean MainChannelClient::connect_semi_seamless()
+{
+ if (test_remote_cap(SPICE_MAIN_CAP_SEMI_SEAMLESS_MIGRATE)) {
+ RedClient *client = get_client();
+ if (client->during_migrate_at_target()) {
+ priv->mig_wait_prev_complete = TRUE;
+ priv->mig_wait_prev_try_seamless = FALSE;
+ } else {
+ pipe_add_type(RED_PIPE_ITEM_TYPE_MAIN_MIGRATE_BEGIN);
+ priv->mig_wait_connect = TRUE;
+ }
+ priv->mig_connect_ok = FALSE;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void MainChannelClient::connect_seamless()
+{
+ RedClient *client = get_client();
+ spice_assert(test_remote_cap(SPICE_MAIN_CAP_SEAMLESS_MIGRATE));
+ if (client->during_migrate_at_target()) {
+ priv->mig_wait_prev_complete = TRUE;
+ priv->mig_wait_prev_try_seamless = TRUE;
+ } else {
+ pipe_add_type(RED_PIPE_ITEM_TYPE_MAIN_MIGRATE_BEGIN_SEAMLESS);
+ priv->mig_wait_connect = TRUE;
+ }
+ priv->mig_connect_ok = FALSE;
+}
+
+uint32_t MainChannelClient::get_connection_id() const
+{
+ return priv->connection_id;
+}
+
+static uint32_t main_channel_client_next_ping_id(MainChannelClient *mcc)
+{
+ return ++mcc->priv->ping_id;
+}
+
+static void main_channel_marshall_channels(RedChannelClient *rcc,
+ SpiceMarshaller *m,
+ RedPipeItem *item)
+{
+ SpiceMsgChannels* channels_info;
+ RedChannel *channel = rcc->get_channel();
+
+ rcc->init_send_data(SPICE_MSG_MAIN_CHANNELS_LIST);
+ channels_info = reds_msg_channels_new(channel->get_server());
+ spice_marshall_msg_main_channels_list(m, channels_info);
+ g_free(channels_info);
+}
+
+static void main_channel_marshall_ping(MainChannelClient *mcc,
+ SpiceMarshaller *m,
+ RedPingPipeItem *item)
+{
+ SpiceMsgPing ping;
+ int size_left = item->size;
+
+ mcc->init_send_data(SPICE_MSG_PING);
+ ping.id = main_channel_client_next_ping_id(mcc);
+ ping.timestamp = spice_get_monotonic_time_ns() / NSEC_PER_MICROSEC;
+ spice_marshall_msg_ping(m, &ping);
+
+ while (size_left > 0) {
+ int now = MIN(ZERO_BUF_SIZE, size_left);
+ size_left -= now;
+ spice_marshaller_add_by_ref(m, zero_page, now);
+ }
+}
+
+static void main_channel_marshall_mouse_mode(RedChannelClient *rcc,
+ SpiceMarshaller *m,
+ RedMouseModePipeItem *item)
+{
+ SpiceMsgMainMouseMode mouse_mode;
+
+ rcc->init_send_data(SPICE_MSG_MAIN_MOUSE_MODE);
+ mouse_mode.supported_modes = SPICE_MOUSE_MODE_SERVER;
+ if (item->is_client_mouse_allowed) {
+ mouse_mode.supported_modes |= SPICE_MOUSE_MODE_CLIENT;
+ }
+ mouse_mode.current_mode = item->current_mode;
+ spice_marshall_msg_main_mouse_mode(m, &mouse_mode);
+}
+
+static void main_channel_marshall_agent_disconnected(RedChannelClient *rcc,
+ SpiceMarshaller *m,
+ RedPipeItem *item)
+{
+ SpiceMsgMainAgentDisconnect disconnect;
+
+ rcc->init_send_data(SPICE_MSG_MAIN_AGENT_DISCONNECTED);
+ disconnect.error_code = SPICE_LINK_ERR_OK;
+ spice_marshall_msg_main_agent_disconnected(m, &disconnect);
+}
+
+static void main_channel_marshall_tokens(RedChannelClient *rcc,
+ SpiceMarshaller *m, RedTokensPipeItem *item)
+{
+ SpiceMsgMainAgentTokens tokens;
+
+ rcc->init_send_data(SPICE_MSG_MAIN_AGENT_TOKEN);
+ tokens.num_tokens = item->tokens;
+ spice_marshall_msg_main_agent_token(m, &tokens);
+}
+
+static void main_channel_marshall_agent_data(RedChannelClient *rcc,
+ SpiceMarshaller *m,
+ RedAgentDataPipeItem *item)
+{
+ rcc->init_send_data(SPICE_MSG_MAIN_AGENT_DATA);
+ /* since pipe item owns the data, keep it alive until it's sent */
+ item->add_to_marshaller(m, item->data, item->len);
+}
+
+static void main_channel_marshall_migrate_data_item(RedChannelClient *rcc,
+ SpiceMarshaller *m,
+ RedPipeItem *item)
+{
+ RedChannel *channel = rcc->get_channel();
+ rcc->init_send_data(SPICE_MSG_MIGRATE_DATA);
+ // TODO: from reds split. ugly separation.
+ reds_marshall_migrate_data(channel->get_server(), m);
+}
+
+static void main_channel_marshall_init(RedChannelClient *rcc,
+ SpiceMarshaller *m,
+ RedInitPipeItem *item)
+{
+ SpiceMsgMainInit init; // TODO - remove this copy, make RedInitPipeItem reuse SpiceMsgMainInit
+ RedChannel *channel = rcc->get_channel();
+
+ rcc->init_send_data(SPICE_MSG_MAIN_INIT);
+ init.session_id = item->connection_id;
+ init.display_channels_hint = item->display_channels_hint;
+ init.current_mouse_mode = item->current_mouse_mode;
+ init.supported_mouse_modes = SPICE_MOUSE_MODE_SERVER;
+ if (item->is_client_mouse_allowed) {
+ init.supported_mouse_modes |= SPICE_MOUSE_MODE_CLIENT;
+ }
+ init.agent_connected = reds_has_vdagent(channel->get_server());
+ init.agent_tokens = REDS_AGENT_WINDOW_SIZE;
+ init.multi_media_time = item->multi_media_time;
+ init.ram_hint = item->ram_hint;
+ spice_marshall_msg_main_init(m, &init);
+}
+
+static void main_channel_marshall_notify(RedChannelClient *rcc,
+ SpiceMarshaller *m, RedNotifyPipeItem *item)
+{
+ SpiceMsgNotify notify;
+
+ rcc->init_send_data(SPICE_MSG_NOTIFY);
+ notify.time_stamp = spice_get_monotonic_time_ns(); // TODO - move to main_new_notify_item
+ notify.severity = SPICE_NOTIFY_SEVERITY_WARN;
+ notify.visibilty = SPICE_NOTIFY_VISIBILITY_HIGH;
+ notify.what = SPICE_WARN_GENERAL;
+ notify.message_len = strlen(item->msg.get());
+ spice_marshall_msg_notify(m, &notify);
+ spice_marshaller_add(m, reinterpret_cast<uint8_t *>(item->msg.get()), notify.message_len + 1);
+}
+
+static void main_channel_fill_migrate_dst_info(MainChannel *main_channel,
+ SpiceMigrationDstInfo *dst_info)
+{
+ const RedsMigSpice *mig_dst = main_channel->get_migration_target();
+ dst_info->port = mig_dst->port;
+ dst_info->sport = mig_dst->sport;
+ dst_info->host_size = strlen(mig_dst->host) + 1;
+ dst_info->host_data = reinterpret_cast<uint8_t *>(mig_dst->host);
+ if (mig_dst->cert_subject) {
+ dst_info->cert_subject_size = strlen(mig_dst->cert_subject) + 1;
+ dst_info->cert_subject_data = reinterpret_cast<uint8_t *>(mig_dst->cert_subject);
+ } else {
+ dst_info->cert_subject_size = 0;
+ dst_info->cert_subject_data = nullptr;
+ }
+}
+
+static void main_channel_marshall_migrate_begin(SpiceMarshaller *m, MainChannelClient *rcc,
+ RedPipeItem *item)
+{
+ MainChannel *channel = rcc->get_channel();
+ SpiceMsgMainMigrationBegin migrate;
+
+ rcc->init_send_data(SPICE_MSG_MAIN_MIGRATE_BEGIN);
+ main_channel_fill_migrate_dst_info(channel, &migrate.dst_info);
+ spice_marshall_msg_main_migrate_begin(m, &migrate);
+}
+
+static void main_channel_marshall_migrate_begin_seamless(SpiceMarshaller *m,
+ MainChannelClient *rcc,
+ RedPipeItem *item)
+{
+ MainChannel *channel = rcc->get_channel();
+ SpiceMsgMainMigrateBeginSeamless migrate_seamless;
+
+ rcc->init_send_data(SPICE_MSG_MAIN_MIGRATE_BEGIN_SEAMLESS);
+ main_channel_fill_migrate_dst_info(channel, &migrate_seamless.dst_info);
+ migrate_seamless.src_mig_version = SPICE_MIGRATION_PROTOCOL_VERSION;
+ spice_marshall_msg_main_migrate_begin_seamless(m, &migrate_seamless);
+}
+
+static void main_channel_marshall_multi_media_time(RedChannelClient *rcc,
+ SpiceMarshaller *m,
+ RedMultiMediaTimePipeItem *item)
+{
+ SpiceMsgMainMultiMediaTime time_mes;
+
+ rcc->init_send_data(SPICE_MSG_MAIN_MULTI_MEDIA_TIME);
+ time_mes.time = item->time;
+ spice_marshall_msg_main_multi_media_time(m, &time_mes);
+}
+
+static void main_channel_marshall_migrate_switch(SpiceMarshaller *m, MainChannelClient *rcc,
+ RedPipeItem *item)
+{
+ MainChannel *channel = rcc->get_channel();
+ SpiceMsgMainMigrationSwitchHost migrate;
+ const RedsMigSpice *mig_target;
+
+ rcc->init_send_data(SPICE_MSG_MAIN_MIGRATE_SWITCH_HOST);
+ mig_target = channel->get_migration_target();
+ migrate.port = mig_target->port;
+ migrate.sport = mig_target->sport;
+ migrate.host_size = strlen(mig_target->host) + 1;
+ migrate.host_data = reinterpret_cast<uint8_t *>(mig_target->host);
+ if (mig_target->cert_subject) {
+ migrate.cert_subject_size = strlen(mig_target->cert_subject) + 1;
+ migrate.cert_subject_data = reinterpret_cast<uint8_t *>(mig_target->cert_subject);
+ } else {
+ migrate.cert_subject_size = 0;
+ migrate.cert_subject_data = nullptr;
+ }
+ spice_marshall_msg_main_migrate_switch_host(m, &migrate);
+}
+
+static void main_channel_marshall_agent_connected(SpiceMarshaller *m,
+ RedChannelClient *rcc,
+ RedPipeItem *item)
+{
+ SpiceMsgMainAgentConnectedTokens connected;
+
+ rcc->init_send_data(SPICE_MSG_MAIN_AGENT_CONNECTED_TOKENS);
+ connected.num_tokens = REDS_AGENT_WINDOW_SIZE;
+ spice_marshall_msg_main_agent_connected_tokens(m, &connected);
+}
+
+static void main_channel_marshall_registered_channel(RedChannelClient *rcc,
+ SpiceMarshaller *m,
+ RedRegisteredChannelPipeItem *item)
+{
+ struct {
+ SpiceMsgChannels info;
+ SpiceChannelId ids[1];
+ } channels_info_buffer;
+ SpiceMsgChannels* channels_info = &channels_info_buffer.info;
+
+ rcc->init_send_data(SPICE_MSG_MAIN_CHANNELS_LIST);
+
+ channels_info->channels[0].type = item->channel_type;
+ channels_info->channels[0].id = item->channel_id;
+ channels_info->num_of_channels = 1;
+
+ spice_marshall_msg_main_channels_list(m, channels_info);
+}
+
+void MainChannelClient::send_item(RedPipeItem *item)
+{
+ SpiceMarshaller *m = get_marshaller();
+
+ /* In semi-seamless migration (dest side), the connection is started from scratch, and
+ * we ignore any pipe item that arrives before the INIT msg is sent.
+ * For seamless we don't send INIT, and the connection continues from the same place
+ * it stopped on the src side. */
+ if (!priv->init_sent &&
+ !priv->seamless_mig_dst &&
+ item->type != RED_PIPE_ITEM_TYPE_MAIN_INIT) {
+ red_channel_warning(get_channel(),
+ "Init msg for client %p was not sent yet "
+ "(client is probably during semi-seamless migration). Ignoring msg type %d",
+ get_client(), item->type);
+ return;
+ }
+ switch (item->type) {
+ case RED_PIPE_ITEM_TYPE_MAIN_CHANNELS_LIST:
+ main_channel_marshall_channels(this, m, item);
+ priv->initial_channels_list_sent = true;
+ break;
+ case RED_PIPE_ITEM_TYPE_MAIN_PING:
+ main_channel_marshall_ping(this, m,
+ static_cast<RedPingPipeItem*>(item));
+ break;
+ case RED_PIPE_ITEM_TYPE_MAIN_MOUSE_MODE:
+ main_channel_marshall_mouse_mode(this, m,
+ static_cast<RedMouseModePipeItem*>(item));
+ break;
+ case RED_PIPE_ITEM_TYPE_MAIN_AGENT_DISCONNECTED:
+ main_channel_marshall_agent_disconnected(this, m, item);
+ break;
+ case RED_PIPE_ITEM_TYPE_MAIN_AGENT_TOKEN:
+ main_channel_marshall_tokens(this, m,
+ static_cast<RedTokensPipeItem*>(item));
+ break;
+ case RED_PIPE_ITEM_TYPE_MAIN_AGENT_DATA:
+ main_channel_marshall_agent_data(this, m,
+ static_cast<RedAgentDataPipeItem*>(item));
+ break;
+ case RED_PIPE_ITEM_TYPE_MAIN_MIGRATE_DATA:
+ main_channel_marshall_migrate_data_item(this, m, item);
+ break;
+ case RED_PIPE_ITEM_TYPE_MAIN_INIT:
+ priv->init_sent = TRUE;
+ main_channel_marshall_init(this, m,
+ static_cast<RedInitPipeItem*>(item));
+ break;
+ case RED_PIPE_ITEM_TYPE_MAIN_NOTIFY:
+ main_channel_marshall_notify(this, m,
+ static_cast<RedNotifyPipeItem*>(item));
+ break;
+ case RED_PIPE_ITEM_TYPE_MAIN_MIGRATE_BEGIN:
+ main_channel_marshall_migrate_begin(m, this, item);
+ break;
+ case RED_PIPE_ITEM_TYPE_MAIN_MIGRATE_BEGIN_SEAMLESS:
+ main_channel_marshall_migrate_begin_seamless(m, this, item);
+ break;
+ case RED_PIPE_ITEM_TYPE_MAIN_MULTI_MEDIA_TIME:
+ main_channel_marshall_multi_media_time(this, m,
+ static_cast<RedMultiMediaTimePipeItem*>(item));
+ break;
+ case RED_PIPE_ITEM_TYPE_MAIN_MIGRATE_SWITCH_HOST:
+ main_channel_marshall_migrate_switch(m, this, item);
+ break;
+ case RED_PIPE_ITEM_TYPE_MAIN_NAME:
+ init_send_data(SPICE_MSG_MAIN_NAME);
+ spice_marshall_msg_main_name(m, &static_cast<RedNamePipeItem*>(item)->msg);
+ break;
+ case RED_PIPE_ITEM_TYPE_MAIN_UUID:
+ init_send_data(SPICE_MSG_MAIN_UUID);
+ spice_marshall_msg_main_uuid(m, &static_cast<RedUuidPipeItem*>(item)->msg);
+ break;
+ case RED_PIPE_ITEM_TYPE_MAIN_AGENT_CONNECTED_TOKENS:
+ main_channel_marshall_agent_connected(m, this, item);
+ break;
+ case RED_PIPE_ITEM_TYPE_MAIN_REGISTERED_CHANNEL:
+ /* The spice protocol requires that the server receive a ATTACH_CHANNELS
+ * message from the client before sending any CHANNEL_LIST message. If
+ * we've already sent our initial CHANNELS_LIST message, then it should be
+ * safe to send new ones for newly-registered channels. */
+ if (!priv->initial_channels_list_sent) {
+ return;
+ }
+ main_channel_marshall_registered_channel(this, m,
+ static_cast<RedRegisteredChannelPipeItem*>(item));
+ break;
+ default:
+ break;
+ };
+ begin_send_message();
+}
diff --git a/server/main-channel-client.h b/server/main-channel-client.h
new file mode 100644
index 00000000..0ea2286c
--- /dev/null
+++ b/server/main-channel-client.h
@@ -0,0 +1,131 @@
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef MAIN_CHANNEL_CLIENT_H_
+#define MAIN_CHANNEL_CLIENT_H_
+
+#include <common/messages.h>
+
+#include "red-channel-client.h"
+#include "main-channel.h"
+#include "utils.hpp"
+
+#include "push-visibility.h"
+
+struct MainChannelClientPrivate;
+
+MainChannelClient *main_channel_client_create(MainChannel *main_chan, RedClient *client,
+ RedStream *stream, uint32_t connection_id,
+ RedChannelCapabilities *caps);
+
+struct RedAgentDataPipeItem;
+
+class MainChannelClient final: public RedChannelClient
+{
+public:
+ void push_agent_tokens(uint32_t num_tokens);
+ void push_agent_data(red::shared_ptr<RedAgentDataPipeItem>&& item);
+ // TODO: huge. Consider making a reds_* interface for these functions
+ // and calling from main.
+ void push_init(int display_channels_hint, SpiceMouseMode current_mouse_mode,
+ int is_client_mouse_allowed, int multi_media_time,
+ int ram_hint);
+ void push_notify(const char *msg);
+ gboolean connect_semi_seamless();
+ void connect_seamless();
+ void handle_migrate_connected(int success, int seamless);
+ void handle_migrate_dst_do_seamless(uint32_t src_version);
+ void handle_migrate_end();
+ void migrate_cancel_wait();
+ void migrate_dst_complete();
+ gboolean migrate_src_complete(gboolean success);
+
+ /*
+ * return TRUE if network test had been completed successfully.
+ * If FALSE, bitrate_per_sec is set to MAX_UINT64 and the roundtrip is set to 0
+ */
+ bool is_network_info_initialized() const;
+ bool is_low_bandwidth() const;
+ uint64_t get_bitrate_per_sec() const;
+ uint64_t get_roundtrip_ms() const;
+
+ void push_name(const char *name);
+ void push_uuid(const uint8_t uuid[16]);
+
+ uint32_t get_connection_id() const;
+
+ MainChannelClient(MainChannel *channel,
+ RedClient *client,
+ RedStream *stream,
+ RedChannelCapabilities *caps,
+ uint32_t connection_id);
+
+ void handle_pong(SpiceMsgPing *ping, uint32_t size);
+ void start_net_test(int test_rate);
+ MainChannel* get_channel()
+ {
+ return static_cast<MainChannel*>(RedChannelClient::get_channel());
+ }
+
+protected:
+ virtual uint8_t *alloc_recv_buf(uint16_t type, uint32_t size) override;
+ virtual void release_recv_buf(uint16_t type, uint32_t size, uint8_t *msg) override;
+ virtual void on_disconnect() override;
+ virtual bool handle_message(uint16_t type, uint32_t size, void *message) override;
+ virtual void send_item(RedPipeItem *item) override;
+ virtual bool handle_migrate_data(uint32_t size, void *message) override;
+ virtual void migrate() override;
+ virtual void handle_migrate_flush_mark() override;
+
+public:
+ red::unique_link<MainChannelClientPrivate> priv;
+};
+
+enum {
+ RED_PIPE_ITEM_TYPE_MAIN_CHANNELS_LIST = RED_PIPE_ITEM_TYPE_CHANNEL_BASE,
+ RED_PIPE_ITEM_TYPE_MAIN_PING,
+ RED_PIPE_ITEM_TYPE_MAIN_MOUSE_MODE,
+ RED_PIPE_ITEM_TYPE_MAIN_AGENT_DISCONNECTED,
+ RED_PIPE_ITEM_TYPE_MAIN_AGENT_TOKEN,
+ RED_PIPE_ITEM_TYPE_MAIN_AGENT_DATA,
+ RED_PIPE_ITEM_TYPE_MAIN_MIGRATE_DATA,
+ RED_PIPE_ITEM_TYPE_MAIN_INIT,
+ RED_PIPE_ITEM_TYPE_MAIN_NOTIFY,
+ RED_PIPE_ITEM_TYPE_MAIN_MIGRATE_BEGIN,
+ RED_PIPE_ITEM_TYPE_MAIN_MIGRATE_BEGIN_SEAMLESS,
+ RED_PIPE_ITEM_TYPE_MAIN_MIGRATE_SWITCH_HOST,
+ RED_PIPE_ITEM_TYPE_MAIN_MULTI_MEDIA_TIME,
+ RED_PIPE_ITEM_TYPE_MAIN_NAME,
+ RED_PIPE_ITEM_TYPE_MAIN_UUID,
+ RED_PIPE_ITEM_TYPE_MAIN_AGENT_CONNECTED_TOKENS,
+ RED_PIPE_ITEM_TYPE_MAIN_REGISTERED_CHANNEL,
+};
+
+struct RedAgentDataPipeItem: public RedPipeItemNum<RED_PIPE_ITEM_TYPE_MAIN_AGENT_DATA> {
+ int len = 0;
+ uint8_t data[SPICE_AGENT_MAX_DATA_SIZE];
+};
+
+RedPipeItemPtr main_mouse_mode_item_new(SpiceMouseMode current_mode, int is_client_mouse_allowed);
+
+RedPipeItemPtr main_multi_media_time_item_new(uint32_t mm_time);
+
+RedPipeItemPtr registered_channel_item_new(RedChannel *channel);
+
+#include "pop-visibility.h"
+
+#endif /* MAIN_CHANNEL_CLIENT_H_ */
diff --git a/server/main-channel.cpp b/server/main-channel.cpp
new file mode 100644
index 00000000..e14a45d5
--- /dev/null
+++ b/server/main-channel.cpp
@@ -0,0 +1,320 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+
+#include "red-common.h"
+#include "reds.h"
+#include "red-channel-client.h"
+#include "red-client.h"
+#include "main-channel.h"
+#include "main-channel-client.h"
+
+XXX_CAST(RedChannelClient, MainChannelClient, MAIN_CHANNEL_CLIENT);
+
+RedClient *MainChannel::get_client_by_link_id(uint32_t connection_id)
+{
+ RedChannelClient *rcc;
+
+ FOREACH_CLIENT(this, rcc) {
+ MainChannelClient *mcc = MAIN_CHANNEL_CLIENT(rcc);
+ if (mcc->get_connection_id() == connection_id) {
+ return rcc->get_client();
+ }
+ }
+ return nullptr;
+}
+
+static void main_channel_push_channels(MainChannelClient *mcc)
+{
+ if (mcc->get_client()->during_migrate_at_target()) {
+ red_channel_warning(mcc->get_channel(),
+ "warning: ignoring unexpected SPICE_MSGC_MAIN_ATTACH_CHANNELS"
+ "during migration");
+ return;
+ }
+ mcc->pipe_add_type(RED_PIPE_ITEM_TYPE_MAIN_CHANNELS_LIST);
+}
+
+void MainChannel::push_mouse_mode(SpiceMouseMode current_mode,
+ int is_client_mouse_allowed)
+{
+ pipes_add(main_mouse_mode_item_new(current_mode, is_client_mouse_allowed));
+}
+
+void MainChannel::push_agent_connected()
+{
+ RedChannelClient *rcc;
+ FOREACH_CLIENT(this, rcc) {
+ if (rcc->test_remote_cap(SPICE_MAIN_CAP_AGENT_CONNECTED_TOKENS)) {
+ rcc->pipe_add_type(RED_PIPE_ITEM_TYPE_MAIN_AGENT_CONNECTED_TOKENS);
+ } else {
+ rcc->pipe_add_empty_msg(SPICE_MSG_MAIN_AGENT_CONNECTED);
+ }
+ }
+}
+
+void MainChannel::push_agent_disconnected()
+{
+ pipes_add_type(RED_PIPE_ITEM_TYPE_MAIN_AGENT_DISCONNECTED);
+}
+
+static void main_channel_push_migrate_data_item(MainChannel *main_chan)
+{
+ main_chan->pipes_add_type(RED_PIPE_ITEM_TYPE_MAIN_MIGRATE_DATA);
+}
+
+bool MainChannelClient::handle_migrate_data(uint32_t size, void *message)
+{
+ RedChannel *channel = get_channel();
+ MainChannelClient *mcc = this;
+ auto header = static_cast<SpiceMigrateDataHeader *>(message);
+
+ /* not supported with multi-clients */
+ spice_assert(channel->get_n_clients() == 1);
+
+ if (size < sizeof(SpiceMigrateDataHeader) + sizeof(SpiceMigrateDataMain)) {
+ red_channel_warning(channel, "bad message size %u", size);
+ return FALSE;
+ }
+ if (!migration_protocol_validate_header(header,
+ SPICE_MIGRATE_DATA_MAIN_MAGIC,
+ SPICE_MIGRATE_DATA_MAIN_VERSION)) {
+ spice_error("bad header");
+ return FALSE;
+ }
+ return reds_handle_migrate_data(channel->get_server(), mcc,
+ reinterpret_cast<SpiceMigrateDataMain *>(header + 1), size);
+}
+
+void MainChannel::push_multi_media_time(uint32_t time)
+{
+ pipes_add(main_multi_media_time_item_new(time));
+}
+
+static void main_channel_fill_mig_target(MainChannel *main_channel, RedsMigSpice *mig_target)
+{
+ spice_assert(mig_target);
+ g_free(main_channel->mig_target.host);
+ main_channel->mig_target.host = g_strdup(mig_target->host);
+ g_free(main_channel->mig_target.cert_subject);
+ if (mig_target->cert_subject) {
+ main_channel->mig_target.cert_subject = g_strdup(mig_target->cert_subject);
+ } else {
+ main_channel->mig_target.cert_subject = nullptr;
+ }
+ main_channel->mig_target.port = mig_target->port;
+ main_channel->mig_target.sport = mig_target->sport;
+}
+
+void
+MainChannel::registered_new_channel(RedChannel *channel)
+{
+ pipes_add(registered_channel_item_new(channel));
+}
+
+void MainChannel::migrate_switch(RedsMigSpice *new_mig_target)
+{
+ main_channel_fill_mig_target(this, new_mig_target);
+ pipes_add_type(RED_PIPE_ITEM_TYPE_MAIN_MIGRATE_SWITCH_HOST);
+}
+
+bool MainChannelClient::handle_message(uint16_t type, uint32_t size, void *message)
+{
+ RedChannel *channel = get_channel();
+ RedsState *reds = channel->get_server();
+
+ switch (type) {
+ case SPICE_MSGC_MAIN_AGENT_START: {
+ SpiceMsgcMainAgentStart *tokens;
+
+ tokens = static_cast<SpiceMsgcMainAgentStart *>(message);
+ reds_on_main_agent_start(reds, this, tokens->num_tokens);
+ break;
+ }
+ case SPICE_MSGC_MAIN_AGENT_DATA:
+ reds_on_main_agent_data(reds, this, message, size);
+ break;
+ case SPICE_MSGC_MAIN_AGENT_TOKEN: {
+ SpiceMsgcMainAgentTokens *tokens;
+
+ tokens = static_cast<SpiceMsgcMainAgentTokens *>(message);
+ reds_on_main_agent_tokens(reds, this, tokens->num_tokens);
+ break;
+ }
+ case SPICE_MSGC_MAIN_ATTACH_CHANNELS:
+ main_channel_push_channels(this);
+ break;
+ case SPICE_MSGC_MAIN_MIGRATE_CONNECTED:
+ this->handle_migrate_connected(TRUE, FALSE);
+ break;
+ case SPICE_MSGC_MAIN_MIGRATE_CONNECTED_SEAMLESS:
+ this->handle_migrate_connected(TRUE, TRUE);
+ break;
+ case SPICE_MSGC_MAIN_MIGRATE_CONNECT_ERROR:
+ this->handle_migrate_connected(FALSE, FALSE);
+ break;
+ case SPICE_MSGC_MAIN_MIGRATE_DST_DO_SEAMLESS:
+ this->handle_migrate_dst_do_seamless(
+ (static_cast<SpiceMsgcMainMigrateDstDoSeamless *>(message))->src_version);
+ break;
+ case SPICE_MSGC_MAIN_MIGRATE_END:
+ this->handle_migrate_end();
+ break;
+ case SPICE_MSGC_MAIN_MOUSE_MODE_REQUEST:
+ reds_on_main_mouse_mode_request(reds, message, size);
+ break;
+ case SPICE_MSGC_PONG:
+ handle_pong(static_cast<SpiceMsgPing *>(message), size);
+ break;
+ default:
+ return RedChannelClient::handle_message(type, size, message);
+ }
+ return TRUE;
+}
+
+void MainChannelClient::handle_migrate_flush_mark()
+{
+ MainChannel *channel = get_channel();
+ spice_debug("trace");
+ main_channel_push_migrate_data_item(channel);
+}
+
+MainChannelClient *main_channel_link(MainChannel *channel, RedClient *client,
+ RedStream *stream, uint32_t connection_id, int migration,
+ RedChannelCapabilities *caps)
+{
+ MainChannelClient *mcc;
+
+ spice_assert(channel);
+
+ // TODO - migration - I removed it from channel creation, now put it
+ // into usage somewhere (not an issue until we return migration to it's
+ // former glory)
+ mcc = main_channel_client_create(channel, client, stream, connection_id, caps);
+ return mcc;
+}
+
+red::shared_ptr<MainChannel> main_channel_new(RedsState *reds)
+{
+ return red::make_shared<MainChannel>(reds);
+}
+
+MainChannel::MainChannel(RedsState *reds):
+ RedChannel(reds, SPICE_CHANNEL_MAIN, 0, RedChannel::MigrateAll)
+{
+ set_cap(SPICE_MAIN_CAP_SEMI_SEAMLESS_MIGRATE);
+ set_cap(SPICE_MAIN_CAP_NAME_AND_UUID);
+ set_cap(SPICE_MAIN_CAP_AGENT_CONNECTED_TOKENS);
+ set_cap(SPICE_MAIN_CAP_SEAMLESS_MIGRATE);
+}
+
+static int main_channel_connect_semi_seamless(MainChannel *main_channel)
+{
+ RedChannelClient *rcc;
+
+ FOREACH_CLIENT(main_channel, rcc) {
+ MainChannelClient *mcc = MAIN_CHANNEL_CLIENT(rcc);
+ if (mcc->connect_semi_seamless())
+ main_channel->num_clients_mig_wait++;
+ }
+ return main_channel->num_clients_mig_wait;
+}
+
+static int main_channel_connect_seamless(MainChannel *main_channel)
+{
+ RedChannelClient *rcc;
+
+ spice_assert(main_channel->get_n_clients() == 1);
+
+ FOREACH_CLIENT(main_channel, rcc) {
+ MainChannelClient *mcc = MAIN_CHANNEL_CLIENT(rcc);
+ mcc->connect_seamless();
+ main_channel->num_clients_mig_wait++;
+ }
+ return main_channel->num_clients_mig_wait;
+}
+
+int MainChannel::migrate_connect(RedsMigSpice *new_mig_target, int try_seamless)
+{
+ main_channel_fill_mig_target(this, new_mig_target);
+ num_clients_mig_wait = 0;
+
+ if (!is_connected()) {
+ return 0;
+ }
+
+ if (!try_seamless) {
+ return main_channel_connect_semi_seamless(this);
+ }
+
+ RedChannelClient *rcc;
+ GList *clients = get_clients();
+
+ /* just test the first one */
+ rcc = static_cast<RedChannelClient *>(g_list_nth_data(clients, 0));
+
+ if (!rcc->test_remote_cap(SPICE_MAIN_CAP_SEAMLESS_MIGRATE)) {
+ return main_channel_connect_semi_seamless(this);
+ }
+
+ return main_channel_connect_seamless(this);
+}
+
+void MainChannel::migrate_cancel_wait()
+{
+ RedChannelClient *rcc;
+
+ FOREACH_CLIENT(this, rcc) {
+ MainChannelClient *mcc = MAIN_CHANNEL_CLIENT(rcc);
+ mcc->migrate_cancel_wait();
+ }
+ num_clients_mig_wait = 0;
+}
+
+int MainChannel::migrate_src_complete(int success)
+{
+ int semi_seamless_count = 0;
+ RedChannelClient *rcc;
+
+ if (!get_clients()) {
+ red_channel_warning(this, "no peer connected");
+ return 0;
+ }
+
+ FOREACH_CLIENT(this, rcc) {
+ MainChannelClient *mcc = MAIN_CHANNEL_CLIENT(rcc);
+ if (mcc->migrate_src_complete(success))
+ semi_seamless_count++;
+ }
+ return semi_seamless_count;
+}
+
+void MainChannel::on_migrate_connected(gboolean success, gboolean seamless)
+{
+ spice_assert(num_clients_mig_wait);
+ spice_assert(!seamless || num_clients_mig_wait == 1);
+ if (!--num_clients_mig_wait) {
+ reds_on_main_migrate_connected(get_server(),
+ seamless && success);
+ }
+}
+
+const RedsMigSpice* MainChannel::get_migration_target()
+{
+ return &mig_target;
+}
diff --git a/server/main-channel.h b/server/main-channel.h
new file mode 100644
index 00000000..0d46dedd
--- /dev/null
+++ b/server/main-channel.h
@@ -0,0 +1,86 @@
+/*
+ Copyright (C) 2009 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef MAIN_CHANNEL_H_
+#define MAIN_CHANNEL_H_
+
+#include <stdint.h>
+#include <spice/vd_agent.h>
+#include <common/marshaller.h>
+
+#include "red-channel.h"
+
+#include "push-visibility.h"
+
+// TODO: Defines used to calculate receive buffer size, and also by reds.c
+// other options: is to make a reds_main_consts.h, to duplicate defines.
+#define REDS_AGENT_WINDOW_SIZE 10
+#define REDS_NUM_INTERNAL_AGENT_MESSAGES 1
+
+struct RedsMigSpice {
+ char *host;
+ char *cert_subject;
+ int port;
+ int sport;
+};
+
+struct MainChannel;
+
+red::shared_ptr<MainChannel> main_channel_new(RedsState *reds);
+
+/* This is a 'clone' from the reds.h Channel.link callback to allow passing connect_id */
+MainChannelClient *main_channel_link(MainChannel *, RedClient *client, RedStream *stream,
+ uint32_t connection_id, int migration,
+ RedChannelCapabilities *caps);
+
+struct MainChannel final: public RedChannel
+{
+ RedClient *get_client_by_link_id(uint32_t connection_id);
+ void push_mouse_mode(SpiceMouseMode current_mode, int is_client_mouse_allowed);
+ void push_agent_connected();
+ void push_agent_disconnected();
+ void push_multi_media_time(uint32_t time);
+ /* tell MainChannel we have a new channel ready */
+ void registered_new_channel(RedChannel *channel);
+
+ /* switch host migration */
+ void migrate_switch(RedsMigSpice *mig_target);
+
+ /* semi seamless migration */
+
+ /* returns the number of clients that we are waiting for their connection.
+ * try_seamless = 'true' when the seamless-migration=on in qemu command line */
+ int migrate_connect(RedsMigSpice *mig_target, int try_seamless);
+ void migrate_cancel_wait();
+ const RedsMigSpice* get_migration_target();
+ /* returns the number of clients for which SPICE_MSG_MAIN_MIGRATE_END was sent*/
+ int migrate_src_complete(int success);
+ void on_migrate_connected(gboolean success, gboolean seamless);
+
+ MainChannel(RedsState *reds);
+
+ void on_connect(RedClient *client, RedStream *stream, int migration,
+ RedChannelCapabilities *caps) override {};
+
+ // TODO: add refs and release (after all clients completed migration in one way or the other?)
+ RedsMigSpice mig_target;
+ int num_clients_mig_wait;
+};
+
+#include "pop-visibility.h"
+
+#endif /* MAIN_CHANNEL_H_ */
diff --git a/server/main-dispatcher.cpp b/server/main-dispatcher.cpp
new file mode 100644
index 00000000..9112c908
--- /dev/null
+++ b/server/main-dispatcher.cpp
@@ -0,0 +1,204 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <config.h>
+
+#include <cerrno>
+#include <cstring>
+
+#include <pthread.h>
+#include <unistd.h>
+
+#include "red-common.h"
+#include "dispatcher.h"
+#include "main-dispatcher.h"
+#include "red-client.h"
+#include "reds.h"
+
+/*
+ * Main Dispatcher
+ * ===============
+ *
+ * Communication channel between any non main thread and the main thread.
+ *
+ * The main thread is that from which spice_server_init is called.
+ *
+ * Messages are single sized, sent from the non-main thread to the main-thread.
+ * No acknowledge is sent back. This prevents a possible deadlock with the main
+ * thread already waiting on a response for the existing red_dispatcher used
+ * by the worker thread.
+ *
+ * All events have three functions:
+ * main_dispatcher_<event_name> - non static, public function
+ * main_dispatcher_self_<event_name> - handler for main thread
+ * main_dispatcher_handle_<event_name> - handler for callback from main thread
+ * seperate from self because it may send an ack or do other work in the future.
+ */
+
+enum {
+ MAIN_DISPATCHER_CHANNEL_EVENT = 0,
+ MAIN_DISPATCHER_MIGRATE_SEAMLESS_DST_COMPLETE,
+ MAIN_DISPATCHER_SET_MM_TIME_LATENCY,
+ MAIN_DISPATCHER_CLIENT_DISCONNECT,
+
+ MAIN_DISPATCHER_NUM_MESSAGES
+};
+
+struct MainDispatcherChannelEventMessage {
+ int event;
+ SpiceChannelEventInfo *info;
+};
+
+struct MainDispatcherMigrateSeamlessDstCompleteMessage {
+ RedClient *client;
+};
+
+struct MainDispatcherMmTimeLatencyMessage {
+ RedClient *client;
+ uint32_t latency;
+};
+
+struct MainDispatcherClientDisconnectMessage {
+ RedClient *client;
+};
+
+/* channel_event - calls core->channel_event, must be done in main thread */
+static void main_dispatcher_handle_channel_event(void *opaque,
+ void *payload)
+{
+ auto reds = static_cast<RedsState *>(opaque);
+ auto channel_event = static_cast<MainDispatcherChannelEventMessage *>(payload);
+
+ reds_handle_channel_event(reds, channel_event->event, channel_event->info);
+}
+
+void MainDispatcher::channel_event(int event, SpiceChannelEventInfo *info)
+{
+ MainDispatcherChannelEventMessage msg = {0,};
+
+ if (pthread_self() == thread_id) {
+ reds_handle_channel_event(reds, event, info);
+ return;
+ }
+ msg.event = event;
+ msg.info = info;
+ send_message(MAIN_DISPATCHER_CHANNEL_EVENT, &msg);
+}
+
+
+static void main_dispatcher_handle_migrate_complete(void *opaque,
+ void *payload)
+{
+ auto reds = static_cast<RedsState *>(opaque);
+ auto mig_complete = static_cast<MainDispatcherMigrateSeamlessDstCompleteMessage *>(payload);
+
+ reds_on_client_seamless_migrate_complete(reds, mig_complete->client);
+ mig_complete->client->unref();
+}
+
+static void main_dispatcher_handle_mm_time_latency(void *opaque,
+ void *payload)
+{
+ auto reds = static_cast<RedsState *>(opaque);
+ auto msg = static_cast<MainDispatcherMmTimeLatencyMessage *>(payload);
+ reds_set_client_mm_time_latency(reds, msg->client, msg->latency);
+ msg->client->unref();
+}
+
+static void main_dispatcher_handle_client_disconnect(void *opaque,
+ void *payload)
+{
+ auto reds = static_cast<RedsState *>(opaque);
+ auto msg = static_cast<MainDispatcherClientDisconnectMessage *>(payload);
+
+ spice_debug("client=%p", msg->client);
+ reds_client_disconnect(reds, msg->client);
+ msg->client->unref();
+}
+
+void MainDispatcher::seamless_migrate_dst_complete(RedClient *client)
+{
+ MainDispatcherMigrateSeamlessDstCompleteMessage msg;
+
+ if (pthread_self() == thread_id) {
+ reds_on_client_seamless_migrate_complete(reds, client);
+ return;
+ }
+
+ msg.client = red::add_ref(client);
+ send_message(MAIN_DISPATCHER_MIGRATE_SEAMLESS_DST_COMPLETE, &msg);
+}
+
+void MainDispatcher::set_mm_time_latency(RedClient *client, uint32_t latency)
+{
+ MainDispatcherMmTimeLatencyMessage msg;
+
+ if (pthread_self() == thread_id) {
+ reds_set_client_mm_time_latency(reds, client, latency);
+ return;
+ }
+
+ msg.client = red::add_ref(client);
+ msg.latency = latency;
+ send_message(MAIN_DISPATCHER_SET_MM_TIME_LATENCY, &msg);
+}
+
+void MainDispatcher::client_disconnect(RedClient *client)
+{
+ MainDispatcherClientDisconnectMessage msg;
+
+ if (!client->is_disconnecting()) {
+ spice_debug("client %p", client);
+ msg.client = red::add_ref(client);
+ send_message(MAIN_DISPATCHER_CLIENT_DISCONNECT, &msg);
+ } else {
+ spice_debug("client %p already during disconnection", client);
+ }
+}
+
+/*
+ * FIXME:
+ * Reds routines shouldn't be exposed. Instead reds.cpp should register the callbacks,
+ * and the corresponding operations should be made only via main_dispatcher.
+ */
+MainDispatcher::MainDispatcher(RedsState *init_reds):
+ Dispatcher(MAIN_DISPATCHER_NUM_MESSAGES),
+ reds(init_reds),
+ thread_id(pthread_self())
+{
+ set_opaque(reds);
+
+ watch = create_watch(reds_get_core_interface(reds));
+ register_handler(MAIN_DISPATCHER_CHANNEL_EVENT,
+ main_dispatcher_handle_channel_event,
+ sizeof(MainDispatcherChannelEventMessage), false);
+ register_handler(MAIN_DISPATCHER_MIGRATE_SEAMLESS_DST_COMPLETE,
+ main_dispatcher_handle_migrate_complete,
+ sizeof(MainDispatcherMigrateSeamlessDstCompleteMessage), false);
+ register_handler(MAIN_DISPATCHER_SET_MM_TIME_LATENCY,
+ main_dispatcher_handle_mm_time_latency,
+ sizeof(MainDispatcherMmTimeLatencyMessage), false);
+ register_handler(MAIN_DISPATCHER_CLIENT_DISCONNECT,
+ main_dispatcher_handle_client_disconnect,
+ sizeof(MainDispatcherClientDisconnectMessage), false);
+}
+
+MainDispatcher::~MainDispatcher()
+{
+ red_watch_remove(watch);
+}
diff --git a/server/main-dispatcher.h b/server/main-dispatcher.h
new file mode 100644
index 00000000..f9b1ae62
--- /dev/null
+++ b/server/main-dispatcher.h
@@ -0,0 +1,52 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef MAIN_DISPATCHER_H_
+#define MAIN_DISPATCHER_H_
+
+#include "spice-wrapped.h"
+#include "dispatcher.h"
+#include "red-channel.h"
+
+#include "push-visibility.h"
+
+class MainDispatcher final: public Dispatcher
+{
+public:
+ MainDispatcher(RedsState *reds);
+
+ void channel_event(int event, SpiceChannelEventInfo *info);
+ void seamless_migrate_dst_complete(RedClient *client);
+ void set_mm_time_latency(RedClient *client, uint32_t latency);
+ /*
+ * Disconnecting the client is always executed asynchronously,
+ * in order to protect from expired references in the routines
+ * that triggered the client destruction.
+ */
+ void client_disconnect(RedClient *client);
+protected:
+ ~MainDispatcher();
+private:
+ RedsState *const reds;
+ SpiceWatch *watch = nullptr;
+ pthread_t thread_id;
+};
+
+#include "pop-visibility.h"
+
+#endif /* MAIN_DISPATCHER_H_ */
diff --git a/server/main_channel.c b/server/main_channel.c
deleted file mode 100644
index 54718baf..00000000
--- a/server/main_channel.c
+++ /dev/null
@@ -1,1366 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <inttypes.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <netinet/tcp.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-#include <limits.h>
-#include <time.h>
-#include <pthread.h>
-#include <sys/mman.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <ctype.h>
-
-#include "common/generated_server_marshallers.h"
-#include "common/messages.h"
-#include "common/ring.h"
-
-#include "demarshallers.h"
-#include "main_channel.h"
-#include "red_channel.h"
-#include "red_common.h"
-#include "reds.h"
-#include "migration_protocol.h"
-#include "main_dispatcher.h"
-
-#define ZERO_BUF_SIZE 4096
-
-#define NET_TEST_WARMUP_BYTES 0
-#define NET_TEST_BYTES (1024 * 250)
-
-#define PING_INTERVAL (1000 * 10)
-
-#define CLIENT_CONNECTIVITY_TIMEOUT (30*1000) // 30 seconds
-
-static uint8_t zero_page[ZERO_BUF_SIZE] = {0};
-
-enum {
- PIPE_ITEM_TYPE_MAIN_CHANNELS_LIST = PIPE_ITEM_TYPE_CHANNEL_BASE,
- PIPE_ITEM_TYPE_MAIN_PING,
- PIPE_ITEM_TYPE_MAIN_MOUSE_MODE,
- PIPE_ITEM_TYPE_MAIN_AGENT_DISCONNECTED,
- PIPE_ITEM_TYPE_MAIN_AGENT_TOKEN,
- PIPE_ITEM_TYPE_MAIN_AGENT_DATA,
- PIPE_ITEM_TYPE_MAIN_MIGRATE_DATA,
- PIPE_ITEM_TYPE_MAIN_INIT,
- PIPE_ITEM_TYPE_MAIN_NOTIFY,
- PIPE_ITEM_TYPE_MAIN_MIGRATE_BEGIN,
- PIPE_ITEM_TYPE_MAIN_MIGRATE_BEGIN_SEAMLESS,
- PIPE_ITEM_TYPE_MAIN_MIGRATE_SWITCH_HOST,
- PIPE_ITEM_TYPE_MAIN_MULTI_MEDIA_TIME,
- PIPE_ITEM_TYPE_MAIN_NAME,
- PIPE_ITEM_TYPE_MAIN_UUID,
- PIPE_ITEM_TYPE_MAIN_AGENT_CONNECTED_TOKENS,
-};
-
-typedef struct RedsOutItem RedsOutItem;
-struct RedsOutItem {
- PipeItem base;
-};
-
-typedef struct RefsPipeItem {
- PipeItem base;
- int *refs;
-} RefsPipeItem;
-
-typedef struct PingPipeItem {
- PipeItem base;
- int size;
-} PingPipeItem;
-
-typedef struct MouseModePipeItem {
- PipeItem base;
- int current_mode;
- int is_client_mouse_allowed;
-} MouseModePipeItem;
-
-typedef struct TokensPipeItem {
- PipeItem base;
- int tokens;
-} TokensPipeItem;
-
-typedef struct AgentDataPipeItem {
- PipeItem base;
- uint8_t* data;
- size_t len;
- spice_marshaller_item_free_func free_data;
- void *opaque;
-} AgentDataPipeItem;
-
-typedef struct InitPipeItem {
- PipeItem base;
- int connection_id;
- int display_channels_hint;
- int current_mouse_mode;
- int is_client_mouse_allowed;
- int multi_media_time;
- int ram_hint;
-} InitPipeItem;
-
-typedef struct NamePipeItem {
- PipeItem base;
- SpiceMsgMainName msg;
-} NamePipeItem;
-
-typedef struct UuidPipeItem {
- PipeItem base;
- SpiceMsgMainUuid msg;
-} UuidPipeItem;
-
-typedef struct NotifyPipeItem {
- PipeItem base;
- char *msg;
-} NotifyPipeItem;
-
-typedef struct MultiMediaTimePipeItem {
- PipeItem base;
- int time;
-} MultiMediaTimePipeItem;
-
-struct MainChannelClient {
- RedChannelClient base;
- uint32_t connection_id;
- uint32_t ping_id;
- uint32_t net_test_id;
- int net_test_stage;
- uint64_t latency;
- uint64_t bitrate_per_sec;
-#ifdef RED_STATISTICS
- SpiceTimer *ping_timer;
- int ping_interval;
-#endif
- int mig_wait_connect;
- int mig_connect_ok;
- int mig_wait_prev_complete;
- int mig_wait_prev_try_seamless;
- int init_sent;
- int seamless_mig_dst;
-};
-
-enum NetTestStage {
- NET_TEST_STAGE_INVALID,
- NET_TEST_STAGE_WARMUP,
- NET_TEST_STAGE_LATENCY,
- NET_TEST_STAGE_RATE,
- NET_TEST_STAGE_COMPLETE,
-};
-
-static void main_channel_release_pipe_item(RedChannelClient *rcc,
- PipeItem *base, int item_pushed);
-
-int main_channel_is_connected(MainChannel *main_chan)
-{
- return red_channel_is_connected(&main_chan->base);
-}
-
-/*
- * When the main channel is disconnected, disconnect the entire client.
- */
-static void main_channel_client_on_disconnect(RedChannelClient *rcc)
-{
- spice_printerr("rcc=%p", rcc);
- main_dispatcher_client_disconnect(rcc->client);
-}
-
-RedClient *main_channel_get_client_by_link_id(MainChannel *main_chan, uint32_t connection_id)
-{
- RingItem *link;
- MainChannelClient *mcc;
-
- RING_FOREACH(link, &main_chan->base.clients) {
- mcc = SPICE_CONTAINEROF(link, MainChannelClient, base.channel_link);
- if (mcc->connection_id == connection_id) {
- return mcc->base.client;
- }
- }
- return NULL;
-}
-
-static int main_channel_client_push_ping(MainChannelClient *mcc, int size);
-
-void main_channel_client_start_net_test(MainChannelClient *mcc, int test_rate)
-{
- if (!mcc || mcc->net_test_id) {
- return;
- }
- if (test_rate) {
- if (main_channel_client_push_ping(mcc, NET_TEST_WARMUP_BYTES)
- && main_channel_client_push_ping(mcc, 0)
- && main_channel_client_push_ping(mcc, NET_TEST_BYTES)) {
- mcc->net_test_id = mcc->ping_id - 2;
- mcc->net_test_stage = NET_TEST_STAGE_WARMUP;
- }
- } else {
- red_channel_client_start_connectivity_monitoring(&mcc->base, CLIENT_CONNECTIVITY_TIMEOUT);
- }
-}
-
-typedef struct MainMouseModeItemInfo {
- int current_mode;
- int is_client_mouse_allowed;
-} MainMouseModeItemInfo;
-
-static PipeItem *main_mouse_mode_item_new(RedChannelClient *rcc, void *data, int num)
-{
- MouseModePipeItem *item = spice_malloc(sizeof(MouseModePipeItem));
- MainMouseModeItemInfo *info = data;
-
- red_channel_pipe_item_init(rcc->channel, &item->base,
- PIPE_ITEM_TYPE_MAIN_MOUSE_MODE);
- item->current_mode = info->current_mode;
- item->is_client_mouse_allowed = info->is_client_mouse_allowed;
- return &item->base;
-}
-
-static PipeItem *main_ping_item_new(MainChannelClient *mcc, int size)
-{
- PingPipeItem *item = spice_malloc(sizeof(PingPipeItem));
-
- red_channel_pipe_item_init(mcc->base.channel, &item->base, PIPE_ITEM_TYPE_MAIN_PING);
- item->size = size;
- return &item->base;
-}
-
-static PipeItem *main_agent_tokens_item_new(RedChannelClient *rcc, uint32_t num_tokens)
-{
- TokensPipeItem *item = spice_malloc(sizeof(TokensPipeItem));
-
- red_channel_pipe_item_init(rcc->channel, &item->base,
- PIPE_ITEM_TYPE_MAIN_AGENT_TOKEN);
- item->tokens = num_tokens;
- return &item->base;
-}
-
-static PipeItem *main_agent_data_item_new(RedChannelClient *rcc, uint8_t* data, size_t len,
- spice_marshaller_item_free_func free_data,
- void *opaque)
-{
- AgentDataPipeItem *item = spice_malloc(sizeof(AgentDataPipeItem));
-
- red_channel_pipe_item_init(rcc->channel, &item->base,
- PIPE_ITEM_TYPE_MAIN_AGENT_DATA);
- item->data = data;
- item->len = len;
- item->free_data = free_data;
- item->opaque = opaque;
- return &item->base;
-}
-
-static PipeItem *main_init_item_new(MainChannelClient *mcc,
- int connection_id, int display_channels_hint, int current_mouse_mode,
- int is_client_mouse_allowed, int multi_media_time,
- int ram_hint)
-{
- InitPipeItem *item = spice_malloc(sizeof(InitPipeItem));
-
- red_channel_pipe_item_init(mcc->base.channel, &item->base,
- PIPE_ITEM_TYPE_MAIN_INIT);
- item->connection_id = connection_id;
- item->display_channels_hint = display_channels_hint;
- item->current_mouse_mode = current_mouse_mode;
- item->is_client_mouse_allowed = is_client_mouse_allowed;
- item->multi_media_time = multi_media_time;
- item->ram_hint = ram_hint;
- return &item->base;
-}
-
-static PipeItem *main_name_item_new(MainChannelClient *mcc, const char *name)
-{
- NamePipeItem *item = spice_malloc(sizeof(NamePipeItem) + strlen(name) + 1);
-
- red_channel_pipe_item_init(mcc->base.channel, &item->base,
- PIPE_ITEM_TYPE_MAIN_NAME);
- item->msg.name_len = strlen(name) + 1;
- memcpy(&item->msg.name, name, item->msg.name_len);
-
- return &item->base;
-}
-
-static PipeItem *main_uuid_item_new(MainChannelClient *mcc, const uint8_t uuid[16])
-{
- UuidPipeItem *item = spice_malloc(sizeof(UuidPipeItem));
-
- red_channel_pipe_item_init(mcc->base.channel, &item->base,
- PIPE_ITEM_TYPE_MAIN_UUID);
- memcpy(item->msg.uuid, uuid, sizeof(item->msg.uuid));
-
- return &item->base;
-}
-
-static PipeItem *main_notify_item_new(RedChannelClient *rcc, void *data, int num)
-{
- NotifyPipeItem *item = spice_malloc(sizeof(NotifyPipeItem));
- const char *msg = data;
-
- red_channel_pipe_item_init(rcc->channel, &item->base,
- PIPE_ITEM_TYPE_MAIN_NOTIFY);
- item->msg = spice_strdup(msg);
- return &item->base;
-}
-
-static PipeItem *main_multi_media_time_item_new(
- RedChannelClient *rcc, void *data, int num)
-{
- MultiMediaTimePipeItem *item, *info = data;
-
- item = spice_malloc(sizeof(MultiMediaTimePipeItem));
- red_channel_pipe_item_init(rcc->channel, &item->base,
- PIPE_ITEM_TYPE_MAIN_MULTI_MEDIA_TIME);
- item->time = info->time;
- return &item->base;
-}
-
-static void main_channel_push_channels(MainChannelClient *mcc)
-{
- if (red_client_during_migrate_at_target(mcc->base.client)) {
- spice_printerr("warning: ignoring unexpected SPICE_MSGC_MAIN_ATTACH_CHANNELS"
- "during migration");
- return;
- }
- red_channel_client_pipe_add_type(&mcc->base, PIPE_ITEM_TYPE_MAIN_CHANNELS_LIST);
-}
-
-static void main_channel_marshall_channels(RedChannelClient *rcc,
- SpiceMarshaller *m,
- PipeItem *item)
-{
- SpiceMsgChannels* channels_info;
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_MAIN_CHANNELS_LIST, item);
- channels_info = (SpiceMsgChannels *)spice_malloc(sizeof(SpiceMsgChannels)
- + reds_num_of_channels() * sizeof(SpiceChannelId));
- reds_fill_channels(channels_info);
- spice_marshall_msg_main_channels_list(m, channels_info);
- free(channels_info);
-}
-
-int main_channel_client_push_ping(MainChannelClient *mcc, int size)
-{
- PipeItem *item;
-
- if (mcc == NULL) {
- return FALSE;
- }
- item = main_ping_item_new(mcc, size);
- red_channel_client_pipe_add_push(&mcc->base, item);
- return TRUE;
-}
-
-static void main_channel_marshall_ping(RedChannelClient *rcc,
- SpiceMarshaller *m,
- PingPipeItem *item)
-{
- MainChannelClient *mcc = SPICE_CONTAINEROF(rcc, MainChannelClient, base);
- struct timespec time_space;
- SpiceMsgPing ping;
- int size_left = item->size;
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_PING, &item->base);
- ping.id = ++(mcc->ping_id);
- clock_gettime(CLOCK_MONOTONIC, &time_space);
- ping.timestamp = time_space.tv_sec * 1000000LL + time_space.tv_nsec / 1000LL;
- spice_marshall_msg_ping(m, &ping);
-
- while (size_left > 0) {
- int now = MIN(ZERO_BUF_SIZE, size_left);
- size_left -= now;
- spice_marshaller_add_ref(m, zero_page, now);
- }
-}
-
-void main_channel_push_mouse_mode(MainChannel *main_chan, int current_mode,
- int is_client_mouse_allowed)
-{
- MainMouseModeItemInfo info = {
- .current_mode=current_mode,
- .is_client_mouse_allowed=is_client_mouse_allowed,
- };
-
- red_channel_pipes_new_add_push(&main_chan->base,
- main_mouse_mode_item_new, &info);
-}
-
-static void main_channel_marshall_mouse_mode(RedChannelClient *rcc,
- SpiceMarshaller *m,
- MouseModePipeItem *item)
-{
- SpiceMsgMainMouseMode mouse_mode;
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_MAIN_MOUSE_MODE, &item->base);
- mouse_mode.supported_modes = SPICE_MOUSE_MODE_SERVER;
- if (item->is_client_mouse_allowed) {
- mouse_mode.supported_modes |= SPICE_MOUSE_MODE_CLIENT;
- }
- mouse_mode.current_mode = item->current_mode;
- spice_marshall_msg_main_mouse_mode(m, &mouse_mode);
-}
-
-void main_channel_push_agent_connected(MainChannel *main_chan)
-{
- if (red_channel_test_remote_cap(&main_chan->base, SPICE_MAIN_CAP_AGENT_CONNECTED_TOKENS)) {
- red_channel_pipes_add_type(&main_chan->base, PIPE_ITEM_TYPE_MAIN_AGENT_CONNECTED_TOKENS);
- } else {
- red_channel_pipes_add_empty_msg(&main_chan->base, SPICE_MSG_MAIN_AGENT_CONNECTED);
- }
-}
-
-static void main_channel_marshall_agent_connected(SpiceMarshaller *m,
- RedChannelClient *rcc,
- PipeItem *item)
-{
- SpiceMsgMainAgentConnectedTokens connected;
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_MAIN_AGENT_CONNECTED_TOKENS, item);
- connected.num_tokens = REDS_AGENT_WINDOW_SIZE;
- spice_marshall_msg_main_agent_connected_tokens(m, &connected);
-}
-
-void main_channel_push_agent_disconnected(MainChannel *main_chan)
-{
- red_channel_pipes_add_type(&main_chan->base, PIPE_ITEM_TYPE_MAIN_AGENT_DISCONNECTED);
-}
-
-static void main_channel_marshall_agent_disconnected(RedChannelClient *rcc,
- SpiceMarshaller *m,
- PipeItem *item)
-{
- SpiceMsgMainAgentDisconnect disconnect;
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_MAIN_AGENT_DISCONNECTED, item);
- disconnect.error_code = SPICE_LINK_ERR_OK;
- spice_marshall_msg_main_agent_disconnected(m, &disconnect);
-}
-
-void main_channel_client_push_agent_tokens(MainChannelClient *mcc, uint32_t num_tokens)
-{
- PipeItem *item = main_agent_tokens_item_new(&mcc->base, num_tokens);
-
- red_channel_client_pipe_add_push(&mcc->base, item);
-}
-
-static void main_channel_marshall_tokens(RedChannelClient *rcc,
- SpiceMarshaller *m, TokensPipeItem *item)
-{
- SpiceMsgMainAgentTokens tokens;
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_MAIN_AGENT_TOKEN, &item->base);
- tokens.num_tokens = item->tokens;
- spice_marshall_msg_main_agent_token(m, &tokens);
-}
-
-void main_channel_client_push_agent_data(MainChannelClient *mcc, uint8_t* data, size_t len,
- spice_marshaller_item_free_func free_data, void *opaque)
-{
- PipeItem *item;
-
- item = main_agent_data_item_new(&mcc->base, data, len, free_data, opaque);
- red_channel_client_pipe_add_push(&mcc->base, item);
-}
-
-static void main_channel_marshall_agent_data(RedChannelClient *rcc,
- SpiceMarshaller *m,
- AgentDataPipeItem *item)
-{
- red_channel_client_init_send_data(rcc, SPICE_MSG_MAIN_AGENT_DATA, &item->base);
- spice_marshaller_add_ref(m, item->data, item->len);
-}
-
-static void main_channel_push_migrate_data_item(MainChannel *main_chan)
-{
- red_channel_pipes_add_type(&main_chan->base, PIPE_ITEM_TYPE_MAIN_MIGRATE_DATA);
-}
-
-static void main_channel_marshall_migrate_data_item(RedChannelClient *rcc,
- SpiceMarshaller *m, PipeItem *item)
-{
- red_channel_client_init_send_data(rcc, SPICE_MSG_MIGRATE_DATA, item);
- reds_marshall_migrate_data(m); // TODO: from reds split. ugly separation.
-}
-
-static int main_channel_handle_migrate_data(RedChannelClient *rcc,
- uint32_t size, void *message)
-{
- MainChannelClient *mcc = SPICE_CONTAINEROF(rcc, MainChannelClient, base);
- SpiceMigrateDataHeader *header = (SpiceMigrateDataHeader *)message;
-
- /* not supported with multi-clients */
- spice_assert(rcc->channel->clients_num == 1);
-
- if (size < sizeof(SpiceMigrateDataHeader) + sizeof(SpiceMigrateDataMain)) {
- spice_printerr("bad message size %u", size);
- return FALSE;
- }
- if (!migration_protocol_validate_header(header,
- SPICE_MIGRATE_DATA_MAIN_MAGIC,
- SPICE_MIGRATE_DATA_MAIN_VERSION)) {
- spice_error("bad header");
- return FALSE;
- }
- return reds_handle_migrate_data(mcc, (SpiceMigrateDataMain *)(header + 1), size);
-}
-
-void main_channel_push_init(MainChannelClient *mcc,
- int display_channels_hint, int current_mouse_mode,
- int is_client_mouse_allowed, int multi_media_time,
- int ram_hint)
-{
- PipeItem *item;
-
- item = main_init_item_new(mcc,
- mcc->connection_id, display_channels_hint, current_mouse_mode,
- is_client_mouse_allowed, multi_media_time, ram_hint);
- red_channel_client_pipe_add_push(&mcc->base, item);
-}
-
-static void main_channel_marshall_init(RedChannelClient *rcc,
- SpiceMarshaller *m,
- InitPipeItem *item)
-{
- SpiceMsgMainInit init; // TODO - remove this copy, make InitPipeItem reuse SpiceMsgMainInit
-
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_MAIN_INIT, &item->base);
- init.session_id = item->connection_id;
- init.display_channels_hint = item->display_channels_hint;
- init.current_mouse_mode = item->current_mouse_mode;
- init.supported_mouse_modes = SPICE_MOUSE_MODE_SERVER;
- if (item->is_client_mouse_allowed) {
- init.supported_mouse_modes |= SPICE_MOUSE_MODE_CLIENT;
- }
- init.agent_connected = reds_has_vdagent();
- init.agent_tokens = REDS_AGENT_WINDOW_SIZE;
- init.multi_media_time = item->multi_media_time;
- init.ram_hint = item->ram_hint;
- spice_marshall_msg_main_init(m, &init);
-}
-
-void main_channel_push_name(MainChannelClient *mcc, const char *name)
-{
- PipeItem *item;
-
- if (!red_channel_client_test_remote_cap(&mcc->base,
- SPICE_MAIN_CAP_NAME_AND_UUID))
- return;
-
- item = main_name_item_new(mcc, name);
- red_channel_client_pipe_add_push(&mcc->base, item);
-}
-
-void main_channel_push_uuid(MainChannelClient *mcc, const uint8_t uuid[16])
-{
- PipeItem *item;
-
- if (!red_channel_client_test_remote_cap(&mcc->base,
- SPICE_MAIN_CAP_NAME_AND_UUID))
- return;
-
- item = main_uuid_item_new(mcc, uuid);
- red_channel_client_pipe_add_push(&mcc->base, item);
-}
-
-void main_channel_push_notify(MainChannel *main_chan, const char *msg)
-{
- red_channel_pipes_new_add_push(&main_chan->base,
- main_notify_item_new, (void *)msg);
-}
-
-void main_channel_client_push_notify(MainChannelClient *mcc, const char *msg)
-{
- PipeItem *item = main_notify_item_new(&mcc->base, (void *)msg, 1);
- red_channel_client_pipe_add_push(&mcc->base, item);
-}
-
-static uint64_t get_time_stamp(void)
-{
- struct timespec time_space;
- clock_gettime(CLOCK_MONOTONIC, &time_space);
- return time_space.tv_sec * 1000 * 1000 * 1000 + time_space.tv_nsec;
-}
-
-static void main_channel_marshall_notify(RedChannelClient *rcc,
- SpiceMarshaller *m, NotifyPipeItem *item)
-{
- SpiceMsgNotify notify;
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_NOTIFY, &item->base);
- notify.time_stamp = get_time_stamp(); // TODO - move to main_new_notify_item
- notify.severity = SPICE_NOTIFY_SEVERITY_WARN;
- notify.visibilty = SPICE_NOTIFY_VISIBILITY_HIGH;
- notify.what = SPICE_WARN_GENERAL;
- notify.message_len = strlen(item->msg);
- spice_marshall_msg_notify(m, &notify);
- spice_marshaller_add(m, (uint8_t *)item->msg, notify.message_len + 1);
-}
-
-static void main_channel_fill_migrate_dst_info(MainChannel *main_channel,
- SpiceMigrationDstInfo *dst_info)
-{
- RedsMigSpice *mig_dst = &main_channel->mig_target;
- dst_info->port = mig_dst->port;
- dst_info->sport = mig_dst->sport;
- dst_info->host_size = strlen(mig_dst->host) + 1;
- dst_info->host_data = (uint8_t *)mig_dst->host;
- if (mig_dst->cert_subject) {
- dst_info->cert_subject_size = strlen(mig_dst->cert_subject) + 1;
- dst_info->cert_subject_data = (uint8_t *)mig_dst->cert_subject;
- } else {
- dst_info->cert_subject_size = 0;
- dst_info->cert_subject_data = NULL;
- }
-}
-
-static void main_channel_marshall_migrate_begin(SpiceMarshaller *m, RedChannelClient *rcc,
- PipeItem *item)
-{
- SpiceMsgMainMigrationBegin migrate;
- MainChannel *main_ch;
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_MAIN_MIGRATE_BEGIN, item);
- main_ch = SPICE_CONTAINEROF(rcc->channel, MainChannel, base);
- main_channel_fill_migrate_dst_info(main_ch, &migrate.dst_info);
- spice_marshall_msg_main_migrate_begin(m, &migrate);
-}
-
-static void main_channel_marshall_migrate_begin_seamless(SpiceMarshaller *m,
- RedChannelClient *rcc,
- PipeItem *item)
-{
- SpiceMsgMainMigrateBeginSeamless migrate_seamless;
- MainChannel *main_ch;
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_MAIN_MIGRATE_BEGIN_SEAMLESS, item);
- main_ch = SPICE_CONTAINEROF(rcc->channel, MainChannel, base);
- main_channel_fill_migrate_dst_info(main_ch, &migrate_seamless.dst_info);
- migrate_seamless.src_mig_version = SPICE_MIGRATION_PROTOCOL_VERSION;
- spice_marshall_msg_main_migrate_begin_seamless(m, &migrate_seamless);
-}
-
-void main_channel_push_multi_media_time(MainChannel *main_chan, int time)
-{
- MultiMediaTimePipeItem info = {
- .time = time,
- };
-
- red_channel_pipes_new_add_push(&main_chan->base,
- main_multi_media_time_item_new, &info);
-}
-
-static void main_channel_fill_mig_target(MainChannel *main_channel, RedsMigSpice *mig_target)
-{
- spice_assert(mig_target);
- free(main_channel->mig_target.host);
- main_channel->mig_target.host = spice_strdup(mig_target->host);
- free(main_channel->mig_target.cert_subject);
- if (mig_target->cert_subject) {
- main_channel->mig_target.cert_subject = spice_strdup(mig_target->cert_subject);
- } else {
- main_channel->mig_target.cert_subject = NULL;
- }
- main_channel->mig_target.port = mig_target->port;
- main_channel->mig_target.sport = mig_target->sport;
-}
-
-void main_channel_migrate_switch(MainChannel *main_chan, RedsMigSpice *mig_target)
-{
- main_channel_fill_mig_target(main_chan, mig_target);
- red_channel_pipes_add_type(&main_chan->base, PIPE_ITEM_TYPE_MAIN_MIGRATE_SWITCH_HOST);
-}
-
-static void main_channel_marshall_migrate_switch(SpiceMarshaller *m, RedChannelClient *rcc,
- PipeItem *item)
-{
- SpiceMsgMainMigrationSwitchHost migrate;
- MainChannel *main_ch;
-
- spice_printerr("");
- red_channel_client_init_send_data(rcc, SPICE_MSG_MAIN_MIGRATE_SWITCH_HOST, item);
- main_ch = SPICE_CONTAINEROF(rcc->channel, MainChannel, base);
- migrate.port = main_ch->mig_target.port;
- migrate.sport = main_ch->mig_target.sport;
- migrate.host_size = strlen(main_ch->mig_target.host) + 1;
- migrate.host_data = (uint8_t *)main_ch->mig_target.host;
- if (main_ch->mig_target.cert_subject) {
- migrate.cert_subject_size = strlen(main_ch->mig_target.cert_subject) + 1;
- migrate.cert_subject_data = (uint8_t *)main_ch->mig_target.cert_subject;
- } else {
- migrate.cert_subject_size = 0;
- migrate.cert_subject_data = NULL;
- }
- spice_marshall_msg_main_migrate_switch_host(m, &migrate);
-}
-
-static void main_channel_marshall_multi_media_time(RedChannelClient *rcc,
- SpiceMarshaller *m,
- MultiMediaTimePipeItem *item)
-{
- SpiceMsgMainMultiMediaTime time_mes;
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_MAIN_MULTI_MEDIA_TIME, &item->base);
- time_mes.time = item->time;
- spice_marshall_msg_main_multi_media_time(m, &time_mes);
-}
-
-static void main_channel_send_item(RedChannelClient *rcc, PipeItem *base)
-{
- MainChannelClient *mcc = SPICE_CONTAINEROF(rcc, MainChannelClient, base);
- SpiceMarshaller *m = red_channel_client_get_marshaller(rcc);
-
- /* In semi-seamless migration (dest side), the connection is started from scratch, and
- * we ignore any pipe item that arrives before the INIT msg is sent.
- * For seamless we don't send INIT, and the connection continues from the same place
- * it stopped on the src side. */
- if (!mcc->init_sent && !mcc->seamless_mig_dst && base->type != PIPE_ITEM_TYPE_MAIN_INIT) {
- spice_printerr("Init msg for client %p was not sent yet "
- "(client is probably during semi-seamless migration). Ignoring msg type %d",
- rcc->client, base->type);
- main_channel_release_pipe_item(rcc, base, FALSE);
- return;
- }
- switch (base->type) {
- case PIPE_ITEM_TYPE_MAIN_CHANNELS_LIST:
- main_channel_marshall_channels(rcc, m, base);
- break;
- case PIPE_ITEM_TYPE_MAIN_PING:
- main_channel_marshall_ping(rcc, m,
- SPICE_CONTAINEROF(base, PingPipeItem, base));
- break;
- case PIPE_ITEM_TYPE_MAIN_MOUSE_MODE:
- {
- MouseModePipeItem *item =
- SPICE_CONTAINEROF(base, MouseModePipeItem, base);
- main_channel_marshall_mouse_mode(rcc, m, item);
- break;
- }
- case PIPE_ITEM_TYPE_MAIN_AGENT_DISCONNECTED:
- main_channel_marshall_agent_disconnected(rcc, m, base);
- break;
- case PIPE_ITEM_TYPE_MAIN_AGENT_TOKEN:
- main_channel_marshall_tokens(rcc, m,
- SPICE_CONTAINEROF(base, TokensPipeItem, base));
- break;
- case PIPE_ITEM_TYPE_MAIN_AGENT_DATA:
- main_channel_marshall_agent_data(rcc, m,
- SPICE_CONTAINEROF(base, AgentDataPipeItem, base));
- break;
- case PIPE_ITEM_TYPE_MAIN_MIGRATE_DATA:
- main_channel_marshall_migrate_data_item(rcc, m, base);
- break;
- case PIPE_ITEM_TYPE_MAIN_INIT:
- mcc->init_sent = TRUE;
- main_channel_marshall_init(rcc, m,
- SPICE_CONTAINEROF(base, InitPipeItem, base));
- break;
- case PIPE_ITEM_TYPE_MAIN_NOTIFY:
- main_channel_marshall_notify(rcc, m,
- SPICE_CONTAINEROF(base, NotifyPipeItem, base));
- break;
- case PIPE_ITEM_TYPE_MAIN_MIGRATE_BEGIN:
- main_channel_marshall_migrate_begin(m, rcc, base);
- break;
- case PIPE_ITEM_TYPE_MAIN_MIGRATE_BEGIN_SEAMLESS:
- main_channel_marshall_migrate_begin_seamless(m, rcc, base);
- break;
- case PIPE_ITEM_TYPE_MAIN_MULTI_MEDIA_TIME:
- main_channel_marshall_multi_media_time(rcc, m,
- SPICE_CONTAINEROF(base, MultiMediaTimePipeItem, base));
- break;
- case PIPE_ITEM_TYPE_MAIN_MIGRATE_SWITCH_HOST:
- main_channel_marshall_migrate_switch(m, rcc, base);
- break;
- case PIPE_ITEM_TYPE_MAIN_NAME:
- red_channel_client_init_send_data(rcc, SPICE_MSG_MAIN_NAME, base);
- spice_marshall_msg_main_name(m, &SPICE_CONTAINEROF(base, NamePipeItem, base)->msg);
- break;
- case PIPE_ITEM_TYPE_MAIN_UUID:
- red_channel_client_init_send_data(rcc, SPICE_MSG_MAIN_UUID, base);
- spice_marshall_msg_main_uuid(m, &SPICE_CONTAINEROF(base, UuidPipeItem, base)->msg);
- break;
- case PIPE_ITEM_TYPE_MAIN_AGENT_CONNECTED_TOKENS:
- main_channel_marshall_agent_connected(m, rcc, base);
- break;
- default:
- break;
- };
- red_channel_client_begin_send_message(rcc);
-}
-
-static void main_channel_release_pipe_item(RedChannelClient *rcc,
- PipeItem *base, int item_pushed)
-{
- switch (base->type) {
- case PIPE_ITEM_TYPE_MAIN_AGENT_DATA: {
- AgentDataPipeItem *data = (AgentDataPipeItem *)base;
-
- data->free_data(data->data, data->opaque);
- break;
- }
- case PIPE_ITEM_TYPE_MAIN_NOTIFY: {
- NotifyPipeItem *data = (NotifyPipeItem *)base;
- free(data->msg);
- break;
- }
- default:
- break;
- }
- free(base);
-}
-
-static void main_channel_client_handle_migrate_connected(MainChannelClient *mcc,
- int success,
- int seamless)
-{
- spice_printerr("client %p connected: %d seamless %d", mcc->base.client, success, seamless);
- if (mcc->mig_wait_connect) {
- MainChannel *main_channel = SPICE_CONTAINEROF(mcc->base.channel, MainChannel, base);
-
- mcc->mig_wait_connect = FALSE;
- mcc->mig_connect_ok = success;
- spice_assert(main_channel->num_clients_mig_wait);
- spice_assert(!seamless || main_channel->num_clients_mig_wait == 1);
- if (!--main_channel->num_clients_mig_wait) {
- reds_on_main_migrate_connected(seamless && success);
- }
- } else {
- if (success) {
- spice_printerr("client %p MIGRATE_CANCEL", mcc->base.client);
- red_channel_client_pipe_add_empty_msg(&mcc->base, SPICE_MSG_MAIN_MIGRATE_CANCEL);
- }
- }
-}
-
-void main_channel_client_handle_migrate_dst_do_seamless(MainChannelClient *mcc,
- uint32_t src_version)
-{
- if (reds_on_migrate_dst_set_seamless(mcc, src_version)) {
- mcc->seamless_mig_dst = TRUE;
- red_channel_client_pipe_add_empty_msg(&mcc->base,
- SPICE_MSG_MAIN_MIGRATE_DST_SEAMLESS_ACK);
- } else {
- red_channel_client_pipe_add_empty_msg(&mcc->base,
- SPICE_MSG_MAIN_MIGRATE_DST_SEAMLESS_NACK);
- }
-}
-
-void main_channel_client_handle_migrate_end(MainChannelClient *mcc)
-{
- if (!red_client_during_migrate_at_target(mcc->base.client)) {
- spice_printerr("unexpected SPICE_MSGC_MIGRATE_END");
- return;
- }
- if (!red_channel_client_test_remote_cap(&mcc->base,
- SPICE_MAIN_CAP_SEMI_SEAMLESS_MIGRATE)) {
- spice_printerr("unexpected SPICE_MSGC_MIGRATE_END, "
- "client does not support semi-seamless migration");
- return;
- }
- red_client_semi_seamless_migrate_complete(mcc->base.client);
-}
-
-void main_channel_migrate_dst_complete(MainChannelClient *mcc)
-{
- if (mcc->mig_wait_prev_complete) {
- if (mcc->mig_wait_prev_try_seamless) {
- spice_assert(mcc->base.channel->clients_num == 1);
- red_channel_client_pipe_add_type(&mcc->base,
- PIPE_ITEM_TYPE_MAIN_MIGRATE_BEGIN_SEAMLESS);
- } else {
- red_channel_client_pipe_add_type(&mcc->base, PIPE_ITEM_TYPE_MAIN_MIGRATE_BEGIN);
- }
- mcc->mig_wait_connect = TRUE;
- mcc->mig_wait_prev_complete = FALSE;
- }
-}
-
-static int main_channel_handle_parsed(RedChannelClient *rcc, uint32_t size, uint16_t type,
- void *message)
-{
- MainChannel *main_chan = SPICE_CONTAINEROF(rcc->channel, MainChannel, base);
- MainChannelClient *mcc = SPICE_CONTAINEROF(rcc, MainChannelClient, base);
-
- switch (type) {
- case SPICE_MSGC_MAIN_AGENT_START: {
- SpiceMsgcMainAgentStart *tokens;
-
- spice_printerr("agent start");
- if (!main_chan) {
- return FALSE;
- }
- tokens = (SpiceMsgcMainAgentStart *)message;
- reds_on_main_agent_start(mcc, tokens->num_tokens);
- break;
- }
- case SPICE_MSGC_MAIN_AGENT_DATA: {
- reds_on_main_agent_data(mcc, message, size);
- break;
- }
- case SPICE_MSGC_MAIN_AGENT_TOKEN: {
- SpiceMsgcMainAgentTokens *tokens;
-
- tokens = (SpiceMsgcMainAgentTokens *)message;
- reds_on_main_agent_tokens(mcc, tokens->num_tokens);
- break;
- }
- case SPICE_MSGC_MAIN_ATTACH_CHANNELS:
- main_channel_push_channels(mcc);
- break;
- case SPICE_MSGC_MAIN_MIGRATE_CONNECTED:
- main_channel_client_handle_migrate_connected(mcc,
- TRUE /* success */,
- FALSE /* seamless */);
- break;
- case SPICE_MSGC_MAIN_MIGRATE_CONNECTED_SEAMLESS:
- main_channel_client_handle_migrate_connected(mcc,
- TRUE /* success */,
- TRUE /* seamless */);
- break;
- case SPICE_MSGC_MAIN_MIGRATE_CONNECT_ERROR:
- main_channel_client_handle_migrate_connected(mcc, FALSE, FALSE);
- break;
- case SPICE_MSGC_MAIN_MIGRATE_DST_DO_SEAMLESS:
- main_channel_client_handle_migrate_dst_do_seamless(mcc,
- ((SpiceMsgcMainMigrateDstDoSeamless *)message)->src_version);
- break;
- case SPICE_MSGC_MAIN_MOUSE_MODE_REQUEST:
- reds_on_main_mouse_mode_request(message, size);
- break;
- case SPICE_MSGC_PONG: {
- SpiceMsgPing *ping = (SpiceMsgPing *)message;
- uint64_t roundtrip;
- struct timespec ts;
-
- clock_gettime(CLOCK_MONOTONIC, &ts);
- roundtrip = ts.tv_sec * 1000000LL + ts.tv_nsec / 1000LL - ping->timestamp;
-
- if (ping->id == mcc->net_test_id) {
- switch (mcc->net_test_stage) {
- case NET_TEST_STAGE_WARMUP:
- mcc->net_test_id++;
- mcc->net_test_stage = NET_TEST_STAGE_LATENCY;
- break;
- case NET_TEST_STAGE_LATENCY:
- mcc->net_test_id++;
- mcc->net_test_stage = NET_TEST_STAGE_RATE;
- mcc->latency = roundtrip;
- break;
- case NET_TEST_STAGE_RATE:
- mcc->net_test_id = 0;
- if (roundtrip <= mcc->latency) {
- // probably high load on client or server result with incorrect values
- mcc->latency = 0;
- mcc->net_test_stage = NET_TEST_STAGE_INVALID;
- spice_printerr("net test: invalid values, latency %" PRIu64
- " roundtrip %" PRIu64 ". assuming high"
- "bandwidth", mcc->latency, roundtrip);
- red_channel_client_start_connectivity_monitoring(&mcc->base,
- CLIENT_CONNECTIVITY_TIMEOUT);
- break;
- }
- mcc->bitrate_per_sec = (uint64_t)(NET_TEST_BYTES * 8) * 1000000
- / (roundtrip - mcc->latency);
- mcc->net_test_stage = NET_TEST_STAGE_COMPLETE;
- spice_printerr("net test: latency %f ms, bitrate %"PRIu64" bps (%f Mbps)%s",
- (double)mcc->latency / 1000,
- mcc->bitrate_per_sec,
- (double)mcc->bitrate_per_sec / 1024 / 1024,
- main_channel_client_is_low_bandwidth(mcc) ? " LOW BANDWIDTH" : "");
- red_channel_client_start_connectivity_monitoring(&mcc->base,
- CLIENT_CONNECTIVITY_TIMEOUT);
- break;
- default:
- spice_printerr("invalid net test stage, ping id %d test id %d stage %d",
- ping->id,
- mcc->net_test_id,
- mcc->net_test_stage);
- mcc->net_test_stage = NET_TEST_STAGE_INVALID;
- }
- break;
- } else {
- /*
- * channel client monitors the connectivity using ping-pong messages
- */
- red_channel_client_handle_message(rcc, size, type, message);
- }
-#ifdef RED_STATISTICS
- reds_update_stat_value(roundtrip);
-#endif
- break;
- }
- case SPICE_MSGC_DISCONNECTING:
- break;
- case SPICE_MSGC_MAIN_MIGRATE_END:
- main_channel_client_handle_migrate_end(mcc);
- break;
- default:
- return red_channel_client_handle_message(rcc, size, type, message);
- }
- return TRUE;
-}
-
-static uint8_t *main_channel_alloc_msg_rcv_buf(RedChannelClient *rcc,
- uint16_t type,
- uint32_t size)
-{
- MainChannel *main_chan = SPICE_CONTAINEROF(rcc->channel, MainChannel, base);
- MainChannelClient *mcc = SPICE_CONTAINEROF(rcc, MainChannelClient, base);
-
- if (type == SPICE_MSGC_MAIN_AGENT_DATA) {
- return reds_get_agent_data_buffer(mcc, size);
- } else {
- return main_chan->recv_buf;
- }
-}
-
-static void main_channel_release_msg_rcv_buf(RedChannelClient *rcc,
- uint16_t type,
- uint32_t size,
- uint8_t *msg)
-{
- if (type == SPICE_MSGC_MAIN_AGENT_DATA) {
- reds_release_agent_data_buffer(msg);
- }
-}
-
-static int main_channel_config_socket(RedChannelClient *rcc)
-{
- return TRUE;
-}
-
-static void main_channel_hold_pipe_item(RedChannelClient *rcc, PipeItem *item)
-{
-}
-
-static int main_channel_handle_migrate_flush_mark(RedChannelClient *rcc)
-{
- spice_debug(NULL);
- main_channel_push_migrate_data_item(SPICE_CONTAINEROF(rcc->channel,
- MainChannel, base));
- return TRUE;
-}
-
-#ifdef RED_STATISTICS
-static void do_ping_client(MainChannelClient *mcc,
- const char *opt, int has_interval, int interval)
-{
- spice_printerr("");
- if (!opt) {
- main_channel_client_push_ping(mcc, 0);
- } else if (!strcmp(opt, "on")) {
- if (has_interval && interval > 0) {
- mcc->ping_interval = interval * 1000;
- }
- core->timer_start(mcc->ping_timer, mcc->ping_interval);
- } else if (!strcmp(opt, "off")) {
- core->timer_cancel(mcc->ping_timer);
- } else {
- return;
- }
-}
-
-static void ping_timer_cb(void *opaque)
-{
- MainChannelClient *mcc = opaque;
-
- if (!red_channel_client_is_connected(&mcc->base)) {
- spice_printerr("not connected to peer, ping off");
- core->timer_cancel(mcc->ping_timer);
- return;
- }
- do_ping_client(mcc, NULL, 0, 0);
- core->timer_start(mcc->ping_timer, mcc->ping_interval);
-}
-#endif /* RED_STATISTICS */
-
-uint32_t main_channel_client_get_link_id(MainChannelClient *mcc)
-{
- return mcc->connection_id;
-}
-
-static MainChannelClient *main_channel_client_create(MainChannel *main_chan, RedClient *client,
- RedsStream *stream, uint32_t connection_id,
- int num_common_caps, uint32_t *common_caps,
- int num_caps, uint32_t *caps)
-{
- MainChannelClient *mcc = (MainChannelClient*)
- red_channel_client_create(sizeof(MainChannelClient), &main_chan->base,
- client, stream, FALSE, num_common_caps,
- common_caps, num_caps, caps);
- spice_assert(mcc != NULL);
- mcc->connection_id = connection_id;
- mcc->bitrate_per_sec = ~0;
-#ifdef RED_STATISTICS
- if (!(mcc->ping_timer = core->timer_add(ping_timer_cb, NULL))) {
- spice_error("ping timer create failed");
- }
- mcc->ping_interval = PING_INTERVAL;
-#endif
- return mcc;
-}
-
-MainChannelClient *main_channel_link(MainChannel *channel, RedClient *client,
- RedsStream *stream, uint32_t connection_id, int migration,
- int num_common_caps, uint32_t *common_caps, int num_caps,
- uint32_t *caps)
-{
- MainChannelClient *mcc;
-
- spice_assert(channel);
-
- // TODO - migration - I removed it from channel creation, now put it
- // into usage somewhere (not an issue until we return migration to it's
- // former glory)
- spice_printerr("add main channel client");
- mcc = main_channel_client_create(channel, client, stream, connection_id,
- num_common_caps, common_caps,
- num_caps, caps);
- return mcc;
-}
-
-int main_channel_getsockname(MainChannel *main_chan, struct sockaddr *sa, socklen_t *salen)
-{
- return main_chan ? getsockname(red_channel_get_first_socket(&main_chan->base), sa, salen) : -1;
-}
-
-int main_channel_getpeername(MainChannel *main_chan, struct sockaddr *sa, socklen_t *salen)
-{
- return main_chan ? getpeername(red_channel_get_first_socket(&main_chan->base), sa, salen) : -1;
-}
-
-// TODO: ? shouldn't it disonnect all clients? or shutdown all main_channels?
-void main_channel_close(MainChannel *main_chan)
-{
- int socketfd;
-
- if (main_chan && (socketfd = red_channel_get_first_socket(&main_chan->base)) != -1) {
- close(socketfd);
- }
-}
-
-int main_channel_client_is_network_info_initialized(MainChannelClient *mcc)
-{
- return mcc->net_test_stage == NET_TEST_STAGE_COMPLETE;
-}
-
-int main_channel_client_is_low_bandwidth(MainChannelClient *mcc)
-{
- // TODO: configurable?
- return mcc->bitrate_per_sec < 10 * 1024 * 1024;
-}
-
-uint64_t main_channel_client_get_bitrate_per_sec(MainChannelClient *mcc)
-{
- return mcc->bitrate_per_sec;
-}
-
-uint64_t main_channel_client_get_roundtrip_ms(MainChannelClient *mcc)
-{
- return mcc->latency / 1000;
-}
-
-static void main_channel_client_migrate(RedChannelClient *rcc)
-{
- reds_on_main_channel_migrate(SPICE_CONTAINEROF(rcc, MainChannelClient, base));
- red_channel_client_default_migrate(rcc);
-}
-
-MainChannel* main_channel_init(void)
-{
- RedChannel *channel;
- ChannelCbs channel_cbs = { NULL, };
- ClientCbs client_cbs = {NULL, };
-
- channel_cbs.config_socket = main_channel_config_socket;
- channel_cbs.on_disconnect = main_channel_client_on_disconnect;
- channel_cbs.send_item = main_channel_send_item;
- channel_cbs.hold_item = main_channel_hold_pipe_item;
- channel_cbs.release_item = main_channel_release_pipe_item;
- channel_cbs.alloc_recv_buf = main_channel_alloc_msg_rcv_buf;
- channel_cbs.release_recv_buf = main_channel_release_msg_rcv_buf;
- channel_cbs.handle_migrate_flush_mark = main_channel_handle_migrate_flush_mark;
- channel_cbs.handle_migrate_data = main_channel_handle_migrate_data;
-
- // TODO: set the migration flag of the channel
- channel = red_channel_create_parser(sizeof(MainChannel), core,
- SPICE_CHANNEL_MAIN, 0,
- FALSE, /* handle_acks */
- spice_get_client_channel_parser(SPICE_CHANNEL_MAIN, NULL),
- main_channel_handle_parsed,
- &channel_cbs,
- SPICE_MIGRATE_NEED_FLUSH | SPICE_MIGRATE_NEED_DATA_TRANSFER);
- spice_assert(channel);
- red_channel_set_cap(channel, SPICE_MAIN_CAP_SEMI_SEAMLESS_MIGRATE);
- red_channel_set_cap(channel, SPICE_MAIN_CAP_SEAMLESS_MIGRATE);
-
- client_cbs.migrate = main_channel_client_migrate;
- red_channel_register_client_cbs(channel, &client_cbs);
-
- return (MainChannel *)channel;
-}
-
-RedChannelClient* main_channel_client_get_base(MainChannelClient* mcc)
-{
- spice_assert(mcc);
- return &mcc->base;
-}
-
-static int main_channel_connect_semi_seamless(MainChannel *main_channel)
-{
- RingItem *client_link;
-
- RING_FOREACH(client_link, &main_channel->base.clients) {
- MainChannelClient * mcc = SPICE_CONTAINEROF(client_link, MainChannelClient,
- base.channel_link);
- if (red_channel_client_test_remote_cap(&mcc->base,
- SPICE_MAIN_CAP_SEMI_SEAMLESS_MIGRATE)) {
- if (red_client_during_migrate_at_target(mcc->base.client)) {
- spice_printerr("client %p: wait till previous migration completes", mcc->base.client);
- mcc->mig_wait_prev_complete = TRUE;
- mcc->mig_wait_prev_try_seamless = FALSE;
- } else {
- red_channel_client_pipe_add_type(&mcc->base,
- PIPE_ITEM_TYPE_MAIN_MIGRATE_BEGIN);
- mcc->mig_wait_connect = TRUE;
- }
- mcc->mig_connect_ok = FALSE;
- main_channel->num_clients_mig_wait++;
- }
- }
- return main_channel->num_clients_mig_wait;
-}
-
-static int main_channel_connect_seamless(MainChannel *main_channel)
-{
- RingItem *client_link;
-
- spice_assert(main_channel->base.clients_num == 1);
-
- RING_FOREACH(client_link, &main_channel->base.clients) {
- MainChannelClient * mcc = SPICE_CONTAINEROF(client_link, MainChannelClient,
- base.channel_link);
- spice_assert(red_channel_client_test_remote_cap(&mcc->base,
- SPICE_MAIN_CAP_SEAMLESS_MIGRATE));
- if (red_client_during_migrate_at_target(mcc->base.client)) {
- spice_printerr("client %p: wait till previous migration completes", mcc->base.client);
- mcc->mig_wait_prev_complete = TRUE;
- mcc->mig_wait_prev_try_seamless = TRUE;
- } else {
- red_channel_client_pipe_add_type(&mcc->base,
- PIPE_ITEM_TYPE_MAIN_MIGRATE_BEGIN_SEAMLESS);
- mcc->mig_wait_connect = TRUE;
- }
- mcc->mig_connect_ok = FALSE;
- main_channel->num_clients_mig_wait++;
- }
- return main_channel->num_clients_mig_wait;
-}
-
-int main_channel_migrate_connect(MainChannel *main_channel, RedsMigSpice *mig_target,
- int try_seamless)
-{
- main_channel_fill_mig_target(main_channel, mig_target);
- main_channel->num_clients_mig_wait = 0;
-
- if (!main_channel_is_connected(main_channel)) {
- return 0;
- }
-
- if (!try_seamless) {
- return main_channel_connect_semi_seamless(main_channel);
- } else {
- RingItem *client_item;
- MainChannelClient *mcc;
-
- client_item = ring_get_head(&main_channel->base.clients);
- mcc = SPICE_CONTAINEROF(client_item, MainChannelClient, base.channel_link);
-
- if (!red_channel_client_test_remote_cap(&mcc->base,
- SPICE_MAIN_CAP_SEAMLESS_MIGRATE)) {
- return main_channel_connect_semi_seamless(main_channel);
- } else {
- return main_channel_connect_seamless(main_channel);
- }
- }
-
-}
-
-void main_channel_migrate_cancel_wait(MainChannel *main_chan)
-{
- RingItem *client_link;
-
- RING_FOREACH(client_link, &main_chan->base.clients) {
- MainChannelClient *mcc;
-
- mcc = SPICE_CONTAINEROF(client_link, MainChannelClient, base.channel_link);
- if (mcc->mig_wait_connect) {
- spice_printerr("client %p cancel wait connect", mcc->base.client);
- mcc->mig_wait_connect = FALSE;
- mcc->mig_connect_ok = FALSE;
- }
- mcc->mig_wait_prev_complete = FALSE;
- }
- main_chan->num_clients_mig_wait = 0;
-}
-
-int main_channel_migrate_src_complete(MainChannel *main_chan, int success)
-{
- RingItem *client_link;
- int semi_seamless_count = 0;
-
- spice_printerr("");
-
- if (ring_is_empty(&main_chan->base.clients)) {
- spice_printerr("no peer connected");
- return 0;
- }
-
- RING_FOREACH(client_link, &main_chan->base.clients) {
- MainChannelClient *mcc;
- int semi_seamless_support;
-
- mcc = SPICE_CONTAINEROF(client_link, MainChannelClient, base.channel_link);
- semi_seamless_support = red_channel_client_test_remote_cap(&mcc->base,
- SPICE_MAIN_CAP_SEMI_SEAMLESS_MIGRATE);
- if (semi_seamless_support && mcc->mig_connect_ok) {
- if (success) {
- spice_printerr("client %p MIGRATE_END", mcc->base.client);
- red_channel_client_pipe_add_empty_msg(&mcc->base, SPICE_MSG_MAIN_MIGRATE_END);
- semi_seamless_count++;
- } else {
- spice_printerr("client %p MIGRATE_CANCEL", mcc->base.client);
- red_channel_client_pipe_add_empty_msg(&mcc->base, SPICE_MSG_MAIN_MIGRATE_CANCEL);
- }
- } else {
- if (success) {
- spice_printerr("client %p SWITCH_HOST", mcc->base.client);
- red_channel_client_pipe_add_type(&mcc->base, PIPE_ITEM_TYPE_MAIN_MIGRATE_SWITCH_HOST);
- }
- }
- mcc->mig_connect_ok = FALSE;
- mcc->mig_wait_connect = FALSE;
- }
- return semi_seamless_count;
-}
diff --git a/server/main_channel.h b/server/main_channel.h
deleted file mode 100644
index c8e9ade2..00000000
--- a/server/main_channel.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __MAIN_CHANNEL_H__
-#define __MAIN_CHANNEL_H__
-
-#include <stdint.h>
-#include <spice/vd_agent.h>
-#include "common/marshaller.h"
-#include "reds.h"
-#include "red_channel.h"
-
-// TODO: Defines used to calculate receive buffer size, and also by reds.c
-// other options: is to make a reds_main_consts.h, to duplicate defines.
-#define REDS_AGENT_WINDOW_SIZE 10
-#define REDS_NUM_INTERNAL_AGENT_MESSAGES 1
-
-// approximate max receive message size for main channel
-#define MAIN_CHANNEL_RECEIVE_BUF_SIZE \
- (4096 + (REDS_AGENT_WINDOW_SIZE + REDS_NUM_INTERNAL_AGENT_MESSAGES) * SPICE_AGENT_MAX_DATA_SIZE)
-
-typedef struct MainChannel {
- RedChannel base;
- uint8_t recv_buf[MAIN_CHANNEL_RECEIVE_BUF_SIZE];
- RedsMigSpice mig_target; // TODO: add refs and release (afrer all clients completed migration in one way or the other?)
- int num_clients_mig_wait;
-} MainChannel;
-
-
-MainChannel *main_channel_init(void);
-RedClient *main_channel_get_client_by_link_id(MainChannel *main_chan, uint32_t link_id);
-/* This is a 'clone' from the reds.h Channel.link callback to allow passing link_id */
-MainChannelClient *main_channel_link(MainChannel *, RedClient *client,
- RedsStream *stream, uint32_t link_id, int migration, int num_common_caps,
- uint32_t *common_caps, int num_caps, uint32_t *caps);
-void main_channel_close(MainChannel *main_chan); // not destroy, just socket close
-void main_channel_push_mouse_mode(MainChannel *main_chan, int current_mode, int is_client_mouse_allowed);
-void main_channel_push_agent_connected(MainChannel *main_chan);
-void main_channel_push_agent_disconnected(MainChannel *main_chan);
-void main_channel_client_push_agent_tokens(MainChannelClient *mcc, uint32_t num_tokens);
-void main_channel_client_push_agent_data(MainChannelClient *mcc, uint8_t* data, size_t len,
- spice_marshaller_item_free_func free_data, void *opaque);
-void main_channel_client_start_net_test(MainChannelClient *mcc, int test_rate);
-// TODO: huge. Consider making a reds_* interface for these functions
-// and calling from main.
-void main_channel_push_init(MainChannelClient *mcc, int display_channels_hint,
- int current_mouse_mode, int is_client_mouse_allowed, int multi_media_time,
- int ram_hint);
-void main_channel_push_notify(MainChannel *main_chan, const char *msg);
-void main_channel_client_push_notify(MainChannelClient *mcc, const char *msg);
-void main_channel_push_multi_media_time(MainChannel *main_chan, int time);
-int main_channel_getsockname(MainChannel *main_chan, struct sockaddr *sa, socklen_t *salen);
-int main_channel_getpeername(MainChannel *main_chan, struct sockaddr *sa, socklen_t *salen);
-uint32_t main_channel_client_get_link_id(MainChannelClient *mcc);
-
-/*
- * return TRUE if network test had been completed successfully.
- * If FALSE, bitrate_per_sec is set to MAX_UINT64 and the roundtrip is set to 0
- */
-int main_channel_client_is_network_info_initialized(MainChannelClient *mcc);
-int main_channel_client_is_low_bandwidth(MainChannelClient *mcc);
-uint64_t main_channel_client_get_bitrate_per_sec(MainChannelClient *mcc);
-uint64_t main_channel_client_get_roundtrip_ms(MainChannelClient *mcc);
-
-int main_channel_is_connected(MainChannel *main_chan);
-RedChannelClient* main_channel_client_get_base(MainChannelClient* mcc);
-
-/* switch host migration */
-void main_channel_migrate_switch(MainChannel *main_chan, RedsMigSpice *mig_target);
-
-/* semi seamless migration */
-
-/* returns the number of clients that we are waiting for their connection.
- * try_seamless = 'true' when the seamless-migration=on in qemu command line */
-int main_channel_migrate_connect(MainChannel *main_channel, RedsMigSpice *mig_target,
- int try_seamless);
-void main_channel_migrate_cancel_wait(MainChannel *main_chan);
-/* returns the number of clients for which SPICE_MSG_MAIN_MIGRATE_END was sent*/
-int main_channel_migrate_src_complete(MainChannel *main_chan, int success);
-void main_channel_migrate_dst_complete(MainChannelClient *mcc);
-void main_channel_push_name(MainChannelClient *mcc, const char *name);
-void main_channel_push_uuid(MainChannelClient *mcc, const uint8_t uuid[16]);
-
-#endif
diff --git a/server/main_dispatcher.c b/server/main_dispatcher.c
deleted file mode 100644
index dbe10374..00000000
--- a/server/main_dispatcher.c
+++ /dev/null
@@ -1,200 +0,0 @@
-#include <config.h>
-#include <unistd.h>
-#include <string.h>
-#include <errno.h>
-#include <pthread.h>
-
-#include "red_common.h"
-#include "dispatcher.h"
-#include "main_dispatcher.h"
-#include "red_channel.h"
-#include "reds.h"
-
-/*
- * Main Dispatcher
- * ===============
- *
- * Communication channel between any non main thread and the main thread.
- *
- * The main thread is that from which spice_server_init is called.
- *
- * Messages are single sized, sent from the non-main thread to the main-thread.
- * No acknowledge is sent back. This prevents a possible deadlock with the main
- * thread already waiting on a response for the existing red_dispatcher used
- * by the worker thread.
- *
- * All events have three functions:
- * main_dispatcher_<event_name> - non static, public function
- * main_dispatcher_self_<event_name> - handler for main thread
- * main_dispatcher_handle_<event_name> - handler for callback from main thread
- * seperate from self because it may send an ack or do other work in the future.
- */
-
-typedef struct {
- Dispatcher base;
- SpiceCoreInterface *core;
-} MainDispatcher;
-
-MainDispatcher main_dispatcher;
-
-enum {
- MAIN_DISPATCHER_CHANNEL_EVENT = 0,
- MAIN_DISPATCHER_MIGRATE_SEAMLESS_DST_COMPLETE,
- MAIN_DISPATCHER_SET_MM_TIME_LATENCY,
- MAIN_DISPATCHER_CLIENT_DISCONNECT,
-
- MAIN_DISPATCHER_NUM_MESSAGES
-};
-
-typedef struct MainDispatcherChannelEventMessage {
- int event;
- SpiceChannelEventInfo *info;
-} MainDispatcherChannelEventMessage;
-
-typedef struct MainDispatcherMigrateSeamlessDstCompleteMessage {
- RedClient *client;
-} MainDispatcherMigrateSeamlessDstCompleteMessage;
-
-typedef struct MainDispatcherMmTimeLatencyMessage {
- RedClient *client;
- uint32_t latency;
-} MainDispatcherMmTimeLatencyMessage;
-
-typedef struct MainDispatcherClientDisconnectMessage {
- RedClient *client;
-} MainDispatcherClientDisconnectMessage;
-
-/* channel_event - calls core->channel_event, must be done in main thread */
-static void main_dispatcher_self_handle_channel_event(
- int event,
- SpiceChannelEventInfo *info)
-{
- reds_handle_channel_event(event, info);
-}
-
-static void main_dispatcher_handle_channel_event(void *opaque,
- void *payload)
-{
- MainDispatcherChannelEventMessage *channel_event = payload;
-
- main_dispatcher_self_handle_channel_event(channel_event->event,
- channel_event->info);
-}
-
-void main_dispatcher_channel_event(int event, SpiceChannelEventInfo *info)
-{
- MainDispatcherChannelEventMessage msg = {0,};
-
- if (pthread_self() == main_dispatcher.base.self) {
- main_dispatcher_self_handle_channel_event(event, info);
- return;
- }
- msg.event = event;
- msg.info = info;
- dispatcher_send_message(&main_dispatcher.base, MAIN_DISPATCHER_CHANNEL_EVENT,
- &msg);
-}
-
-
-static void main_dispatcher_handle_migrate_complete(void *opaque,
- void *payload)
-{
- MainDispatcherMigrateSeamlessDstCompleteMessage *mig_complete = payload;
-
- reds_on_client_seamless_migrate_complete(mig_complete->client);
- red_client_unref(mig_complete->client);
-}
-
-static void main_dispatcher_handle_mm_time_latency(void *opaque,
- void *payload)
-{
- MainDispatcherMmTimeLatencyMessage *msg = payload;
- reds_set_client_mm_time_latency(msg->client, msg->latency);
- red_client_unref(msg->client);
-}
-
-static void main_dispatcher_handle_client_disconnect(void *opaque,
- void *payload)
-{
- MainDispatcherClientDisconnectMessage *msg = payload;
-
- spice_debug("client=%p", msg->client);
- reds_client_disconnect(msg->client);
- red_client_unref(msg->client);
-}
-
-void main_dispatcher_seamless_migrate_dst_complete(RedClient *client)
-{
- MainDispatcherMigrateSeamlessDstCompleteMessage msg;
-
- if (pthread_self() == main_dispatcher.base.self) {
- reds_on_client_seamless_migrate_complete(client);
- return;
- }
-
- msg.client = red_client_ref(client);
- dispatcher_send_message(&main_dispatcher.base, MAIN_DISPATCHER_MIGRATE_SEAMLESS_DST_COMPLETE,
- &msg);
-}
-
-void main_dispatcher_set_mm_time_latency(RedClient *client, uint32_t latency)
-{
- MainDispatcherMmTimeLatencyMessage msg;
-
- if (pthread_self() == main_dispatcher.base.self) {
- reds_set_client_mm_time_latency(client, latency);
- return;
- }
-
- msg.client = red_client_ref(client);
- msg.latency = latency;
- dispatcher_send_message(&main_dispatcher.base, MAIN_DISPATCHER_SET_MM_TIME_LATENCY,
- &msg);
-}
-
-void main_dispatcher_client_disconnect(RedClient *client)
-{
- MainDispatcherClientDisconnectMessage msg;
-
- if (!client->disconnecting) {
- spice_debug("client %p", client);
- msg.client = red_client_ref(client);
- dispatcher_send_message(&main_dispatcher.base, MAIN_DISPATCHER_CLIENT_DISCONNECT,
- &msg);
- } else {
- spice_debug("client %p already during disconnection", client);
- }
-}
-
-static void dispatcher_handle_read(int fd, int event, void *opaque)
-{
- Dispatcher *dispatcher = opaque;
-
- dispatcher_handle_recv_read(dispatcher);
-}
-
-/*
- * FIXME:
- * Reds routines shouldn't be exposed. Instead reds.c should register the callbacks,
- * and the corresponding operations should be made only via main_dispatcher.
- */
-void main_dispatcher_init(SpiceCoreInterface *core)
-{
- memset(&main_dispatcher, 0, sizeof(main_dispatcher));
- main_dispatcher.core = core;
- dispatcher_init(&main_dispatcher.base, MAIN_DISPATCHER_NUM_MESSAGES, &main_dispatcher.base);
- core->watch_add(main_dispatcher.base.recv_fd, SPICE_WATCH_EVENT_READ,
- dispatcher_handle_read, &main_dispatcher.base);
- dispatcher_register_handler(&main_dispatcher.base, MAIN_DISPATCHER_CHANNEL_EVENT,
- main_dispatcher_handle_channel_event,
- sizeof(MainDispatcherChannelEventMessage), 0 /* no ack */);
- dispatcher_register_handler(&main_dispatcher.base, MAIN_DISPATCHER_MIGRATE_SEAMLESS_DST_COMPLETE,
- main_dispatcher_handle_migrate_complete,
- sizeof(MainDispatcherMigrateSeamlessDstCompleteMessage), 0 /* no ack */);
- dispatcher_register_handler(&main_dispatcher.base, MAIN_DISPATCHER_SET_MM_TIME_LATENCY,
- main_dispatcher_handle_mm_time_latency,
- sizeof(MainDispatcherMmTimeLatencyMessage), 0 /* no ack */);
- dispatcher_register_handler(&main_dispatcher.base, MAIN_DISPATCHER_CLIENT_DISCONNECT,
- main_dispatcher_handle_client_disconnect,
- sizeof(MainDispatcherClientDisconnectMessage), 0 /* no ack */);
-}
diff --git a/server/main_dispatcher.h b/server/main_dispatcher.h
deleted file mode 100644
index 522c7f91..00000000
--- a/server/main_dispatcher.h
+++ /dev/null
@@ -1,19 +0,0 @@
-#ifndef MAIN_DISPATCHER_H
-#define MAIN_DISPATCHER_H
-
-#include <spice.h>
-#include "red_channel.h"
-
-void main_dispatcher_channel_event(int event, SpiceChannelEventInfo *info);
-void main_dispatcher_seamless_migrate_dst_complete(RedClient *client);
-void main_dispatcher_set_mm_time_latency(RedClient *client, uint32_t latency);
-/*
- * Disconnecting the client is always executed asynchronously,
- * in order to protect from expired references in the routines
- * that triggered the client destruction.
- */
-void main_dispatcher_client_disconnect(RedClient *client);
-
-void main_dispatcher_init(SpiceCoreInterface *core);
-
-#endif //MAIN_DISPATCHER_H
diff --git a/server/red_memslots.c b/server/memslot.c
index 1b3ec622..4d9d02ba 100644
--- a/server/red_memslots.c
+++ b/server/memslot.c
@@ -15,16 +15,13 @@
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
-#ifdef HAVE_CONFIG_H
#include <config.h>
-#endif
#include <inttypes.h>
-#include "red_common.h"
-#include "red_memslots.h"
+#include "memslot.h"
-static unsigned long __get_clean_virt(RedMemSlotInfo *info, QXLPHYSICAL addr)
+static uintptr_t __get_clean_virt(RedMemSlotInfo *info, QXLPHYSICAL addr)
{
return addr & info->memslot_clean_virt_mask;
}
@@ -40,7 +37,8 @@ static void print_memslots(RedMemSlotInfo *info)
!info->mem_slots[i][x].virt_end_addr) {
continue;
}
- printf("id %d, group %d, virt start %lx, virt end %lx, generation %u, delta %lx\n",
+ printf("id %d, group %d, virt start %" PRIxPTR ", virt end %" PRIxPTR ", generation %u,"
+ " delta %" PRIxPTR "\n",
x, i, info->mem_slots[i][x].virt_start_addr,
info->mem_slots[i][x].virt_end_addr, info->mem_slots[i][x].generation,
info->mem_slots[i][x].address_delta);
@@ -49,8 +47,8 @@ static void print_memslots(RedMemSlotInfo *info)
}
/* return 1 if validation successfull, 0 otherwise */
-int validate_virt(RedMemSlotInfo *info, unsigned long virt, int slot_id,
- uint32_t add_size, uint32_t group_id)
+int memslot_validate_virt(RedMemSlotInfo *info, uintptr_t virt, int slot_id,
+ uint32_t add_size, uint32_t group_id)
{
MemSlot *slot;
@@ -62,9 +60,10 @@ int validate_virt(RedMemSlotInfo *info, unsigned long virt, int slot_id,
if (virt < slot->virt_start_addr || (virt + add_size) > slot->virt_end_addr) {
print_memslots(info);
- spice_critical("virtual address out of range\n"
- " virt=0x%lx+0x%x slot_id=%d group_id=%d\n"
- " slot=0x%lx-0x%lx delta=0x%lx",
+ spice_warning("virtual address out of range"
+ " virt=0x%" G_GINTPTR_MODIFIER "x+0x%x slot_id=%d group_id=%d\n"
+ " slot=0x%" G_GINTPTR_MODIFIER "x-0x%" G_GINTPTR_MODIFIER "x"
+ " delta=0x%" G_GINTPTR_MODIFIER "x",
virt, add_size, slot_id, group_id,
slot->virt_start_addr, slot->virt_end_addr, slot->address_delta);
return 0;
@@ -72,61 +71,71 @@ int validate_virt(RedMemSlotInfo *info, unsigned long virt, int slot_id,
return 1;
}
+uintptr_t memslot_max_size_virt(RedMemSlotInfo *info,
+ uintptr_t virt, int slot_id,
+ uint32_t group_id)
+{
+ MemSlot *slot;
+
+ slot = &info->mem_slots[group_id][slot_id];
+
+ if (virt < slot->virt_start_addr || virt > slot->virt_end_addr) {
+ return 0;
+ }
+ return slot->virt_end_addr - virt;
+}
+
/*
- * return virtual address if successful, which may be 0.
- * returns 0 and sets error to 1 if an error condition occurs.
+ * returns NULL on failure.
*/
-unsigned long get_virt(RedMemSlotInfo *info, QXLPHYSICAL addr, uint32_t add_size,
- int group_id, int *error)
+void *memslot_get_virt(RedMemSlotInfo *info, QXLPHYSICAL addr, uint32_t add_size,
+ int group_id)
{
int slot_id;
int generation;
- unsigned long h_virt;
+ uintptr_t h_virt;
MemSlot *slot;
- *error = 0;
- if (group_id > info->num_memslots_groups) {
+ if (group_id >= info->num_memslots_groups) {
spice_critical("group_id too big");
- *error = 1;
- return 0;
+ return NULL;
}
- slot_id = get_memslot_id(info, addr);
- if (slot_id > info->num_memslots) {
+ slot_id = memslot_get_id(info, addr);
+ if (slot_id >= info->num_memslots) {
print_memslots(info);
- spice_critical("slot_id %d too big, addr=%" PRIx64, slot_id, addr);
- *error = 1;
- return 0;
+ spice_critical("slot_id %d too big, addr=%" G_GINT64_MODIFIER "x", slot_id, addr);
+ return NULL;
}
slot = &info->mem_slots[group_id][slot_id];
- generation = get_generation(info, addr);
+ generation = memslot_get_generation(info, addr);
if (generation != slot->generation) {
print_memslots(info);
- spice_critical("address generation is not valid, group_id %d, slot_id %d, gen %d, slot_gen %d\n",
- group_id, slot_id, generation, slot->generation);
- *error = 1;
- return 0;
+ spice_critical("address generation is not valid, group_id %d, slot_id %d, "
+ "gen %d, slot_gen %d",
+ group_id, slot_id,
+ generation, slot->generation);
+ return NULL;
}
h_virt = __get_clean_virt(info, addr);
h_virt += slot->address_delta;
- if (!validate_virt(info, h_virt, slot_id, add_size, group_id)) {
- *error = 1;
- return 0;
+ if (!memslot_validate_virt(info, h_virt, slot_id, add_size, group_id)) {
+ return NULL;
}
- return h_virt;
+ return (void *)h_virt;
}
-void red_memslot_info_init(RedMemSlotInfo *info,
- uint32_t num_groups, uint32_t num_slots,
- uint8_t generation_bits,
- uint8_t id_bits,
- uint8_t internal_groupslot_id)
+void memslot_info_init(RedMemSlotInfo *info,
+ uint32_t num_groups, uint32_t num_slots,
+ uint8_t generation_bits,
+ uint8_t id_bits,
+ uint8_t internal_groupslot_id)
{
uint32_t i;
@@ -139,10 +148,10 @@ void red_memslot_info_init(RedMemSlotInfo *info,
info->mem_slot_bits = id_bits;
info->internal_groupslot_id = internal_groupslot_id;
- info->mem_slots = spice_new(MemSlot *, num_groups);
+ info->mem_slots = g_new(MemSlot *, num_groups);
for (i = 0; i < num_groups; ++i) {
- info->mem_slots[i] = spice_new0(MemSlot, num_slots);
+ info->mem_slots[i] = g_new0(MemSlot, num_slots);
}
/* TODO: use QXLPHYSICAL_BITS */
@@ -153,9 +162,19 @@ void red_memslot_info_init(RedMemSlotInfo *info,
(info->mem_slot_bits + info->generation_bits));
}
-void red_memslot_info_add_slot(RedMemSlotInfo *info, uint32_t slot_group_id, uint32_t slot_id,
- uint64_t addr_delta, unsigned long virt_start, unsigned long virt_end,
- uint32_t generation)
+void memslot_info_destroy(RedMemSlotInfo *info)
+{
+ uint32_t i;
+
+ for (i = 0; i < info->num_memslots_groups; ++i) {
+ g_free(info->mem_slots[i]);
+ }
+ g_free(info->mem_slots);
+}
+
+void memslot_info_add_slot(RedMemSlotInfo *info, uint32_t slot_group_id, uint32_t slot_id,
+ uintptr_t addr_delta, uintptr_t virt_start, uintptr_t virt_end,
+ uint32_t generation)
{
spice_assert(info->num_memslots_groups > slot_group_id);
spice_assert(info->num_memslots > slot_id);
@@ -166,16 +185,16 @@ void red_memslot_info_add_slot(RedMemSlotInfo *info, uint32_t slot_group_id, uin
info->mem_slots[slot_group_id][slot_id].generation = generation;
}
-void red_memslot_info_del_slot(RedMemSlotInfo *info, uint32_t slot_group_id, uint32_t slot_id)
+void memslot_info_del_slot(RedMemSlotInfo *info, uint32_t slot_group_id, uint32_t slot_id)
{
- spice_assert(info->num_memslots_groups > slot_group_id);
- spice_assert(info->num_memslots > slot_id);
+ spice_return_if_fail(info->num_memslots_groups > slot_group_id);
+ spice_return_if_fail(info->num_memslots > slot_id);
info->mem_slots[slot_group_id][slot_id].virt_start_addr = 0;
info->mem_slots[slot_group_id][slot_id].virt_end_addr = 0;
}
-void red_memslot_info_reset(RedMemSlotInfo *info)
+void memslot_info_reset(RedMemSlotInfo *info)
{
uint32_t i;
for (i = 0; i < info->num_memslots_groups; ++i) {
diff --git a/server/memslot.h b/server/memslot.h
new file mode 100644
index 00000000..8586ab04
--- /dev/null
+++ b/server/memslot.h
@@ -0,0 +1,80 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009,2010 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef MEMSLOT_H_
+#define MEMSLOT_H_
+
+#include <spice/qxl_dev.h>
+
+#include "red-common.h"
+
+SPICE_BEGIN_DECLS
+
+typedef struct MemSlot {
+ int generation;
+ uintptr_t virt_start_addr;
+ uintptr_t virt_end_addr;
+ uintptr_t address_delta;
+} MemSlot;
+
+typedef struct RedMemSlotInfo {
+ MemSlot **mem_slots;
+ uint32_t num_memslots_groups;
+ uint32_t num_memslots;
+ uint8_t mem_slot_bits;
+ uint8_t generation_bits;
+ uint8_t memslot_id_shift;
+ uint8_t memslot_gen_shift;
+ uint8_t internal_groupslot_id;
+ uintptr_t memslot_gen_mask;
+ uintptr_t memslot_clean_virt_mask;
+} RedMemSlotInfo;
+
+static inline int memslot_get_id(RedMemSlotInfo *info, uint64_t addr)
+{
+ return addr >> info->memslot_id_shift;
+}
+
+static inline int memslot_get_generation(RedMemSlotInfo *info, uint64_t addr)
+{
+ return (addr >> info->memslot_gen_shift) & info->memslot_gen_mask;
+}
+
+int memslot_validate_virt(RedMemSlotInfo *info, uintptr_t virt, int slot_id,
+ uint32_t add_size, uint32_t group_id);
+uintptr_t memslot_max_size_virt(RedMemSlotInfo *info,
+ uintptr_t virt, int slot_id,
+ uint32_t group_id);
+void *memslot_get_virt(RedMemSlotInfo *info, QXLPHYSICAL addr, uint32_t add_size,
+ int group_id);
+
+void memslot_info_init(RedMemSlotInfo *info,
+ uint32_t num_groups, uint32_t num_slots,
+ uint8_t generation_bits,
+ uint8_t id_bits,
+ uint8_t internal_groupslot_id);
+void memslot_info_destroy(RedMemSlotInfo *info);
+void memslot_info_add_slot(RedMemSlotInfo *info, uint32_t slot_group_id, uint32_t slot_id,
+ uintptr_t addr_delta, uintptr_t virt_start, uintptr_t virt_end,
+ uint32_t generation);
+void memslot_info_del_slot(RedMemSlotInfo *info, uint32_t slot_group_id, uint32_t slot_id);
+void memslot_info_reset(RedMemSlotInfo *info);
+
+SPICE_END_DECLS
+
+#endif /* MEMSLOT_H_ */
diff --git a/server/meson.build b/server/meson.build
new file mode 100644
index 00000000..a8da777f
--- /dev/null
+++ b/server/meson.build
@@ -0,0 +1,236 @@
+spice_server_include += [include_directories('.')]
+
+#
+# generate spice-version.h
+#
+if meson.project_version().startswith('UNKNOWN')
+ major = '0'
+ minor = '0'
+ micro = '1'
+else
+ additional_commits = false
+ increment_micro = 0
+ # remove the "-dirty" from version, increment micro later if found
+ version_info = meson.project_version().split('-dirty')
+ if version_info.length() > 1
+ increment_micro = 1
+ endif
+ # remove the "-" from version, increment micro later if found
+ version_info = version_info[0].split('-')
+ if version_info.length() > 1
+ additional_commits = true
+ increment_micro = 1
+ endif
+ version_info = version_info[0].split('.')
+ if ((not additional_commits and version_info.length() != 3)
+ or (additional_commits and version_info.length() != 4))
+ error('Invalid version @0@'.format(meson.project_version()))
+ endif
+ major = '@0@'.format(version_info[0].to_int())
+ minor = '@0@'.format(version_info[1].to_int())
+ micro = '@0@'.format(version_info[2].to_int() + increment_micro)
+endif
+
+cmd = run_command('printf', ['0x%02x%02x%02x', major, minor, micro], check : true)
+version_data = configuration_data()
+version_data.set('SPICE_SERVER_VERSION', cmd.stdout().strip())
+spice_version_h = configure_file(input : 'spice-version.h.in',
+ output : 'spice-version.h',
+ configuration : version_data)
+
+#
+# libspice-server.so
+#
+spice_server_headers = [
+ spice_version_h,
+ 'spice-audio.h',
+ 'spice-char.h',
+ 'spice-core.h',
+ 'spice-input.h',
+ 'spice-migration.h',
+ 'spice-qxl.h',
+ 'spice-server.h',
+ 'spice-replay.h',
+ 'spice.h',
+]
+
+install_headers(spice_server_headers, subdir : 'spice-server')
+
+# generate enums
+gnome = import('gnome')
+spice_server_enums = gnome.mkenums('spice-server-enums',
+ sources : 'spice-server.h',
+ symbol_prefix : 'SPICE',
+ c_template: 'spice-server-enums.c.tmpl',
+ h_template: 'spice-server-enums.h.tmpl')
+
+spice_server_sources = [
+ spice_server_headers,
+ spice_server_enums,
+ 'agent-msg-filter.c',
+ 'agent-msg-filter.h',
+ 'cache-item.h',
+ 'char-device.cpp',
+ 'char-device.h',
+ 'common-graphics-channel.cpp',
+ 'common-graphics-channel.h',
+ 'cursor-channel.cpp',
+ 'cursor-channel-client.cpp',
+ 'cursor-channel-client.h',
+ 'cursor-channel.h',
+ 'utils.hpp',
+ 'safe-list.hpp',
+ 'dcc.cpp',
+ 'dcc.h',
+ 'dcc-private.h',
+ 'dcc-send.cpp',
+ 'dispatcher.cpp',
+ 'dispatcher.h',
+ 'display-channel.cpp',
+ 'display-channel.h',
+ 'display-channel-private.h',
+ 'display-limits.h',
+ 'event-loop.c',
+ 'glib-compat.h',
+ 'glz-encoder.c',
+ 'glz-encoder-dict.c',
+ 'glz-encoder-dict.h',
+ 'glz-encoder.h',
+ 'glz-encoder-priv.h',
+ 'image-cache.cpp',
+ 'image-cache.h',
+ 'image-encoders.cpp',
+ 'image-encoders.h',
+ 'inputs-channel.cpp',
+ 'inputs-channel-client.cpp',
+ 'inputs-channel-client.h',
+ 'inputs-channel.h',
+ 'jpeg-encoder.c',
+ 'jpeg-encoder.h',
+ 'main-channel.cpp',
+ 'main-channel-client.cpp',
+ 'main-channel-client.h',
+ 'main-channel.h',
+ 'main-dispatcher.cpp',
+ 'main-dispatcher.h',
+ 'memslot.c',
+ 'memslot.h',
+ 'migration-protocol.h',
+ 'mjpeg-encoder.c',
+ 'net-utils.c',
+ 'net-utils.h',
+ 'pixmap-cache.cpp',
+ 'pixmap-cache.h',
+ 'red-channel.cpp',
+ 'red-channel-capabilities.c',
+ 'red-channel-capabilities.h',
+ 'red-channel-client.cpp',
+ 'red-channel-client.h',
+ 'red-channel.h',
+ 'red-client.cpp',
+ 'red-client.h',
+ 'red-common.h',
+ 'red-parse-qxl.cpp',
+ 'red-parse-qxl.h',
+ 'red-pipe-item.cpp',
+ 'red-pipe-item.h',
+ 'red-qxl.cpp',
+ 'red-qxl.h',
+ 'red-record-qxl.cpp',
+ 'red-record-qxl.h',
+ 'red-replay-qxl.cpp',
+ 'reds.cpp',
+ 'reds.h',
+ 'reds-private.h',
+ 'red-stream.cpp',
+ 'red-stream.h',
+ 'red-worker.cpp',
+ 'red-worker.h',
+ 'sound.cpp',
+ 'sound.h',
+ 'spice-bitmap-utils.c',
+ 'spice-bitmap-utils.h',
+ 'spicevmc.cpp',
+ 'spice-wrapped.h',
+ 'stat-file.c',
+ 'stat-file.h',
+ 'stat.h',
+ 'stream-channel.cpp',
+ 'stream-channel.h',
+ 'sys-socket.c',
+ 'sys-socket.h',
+ 'red-stream-device.cpp',
+ 'red-stream-device.h',
+ 'sw-canvas.c',
+ 'tree.cpp',
+ 'tree.h',
+ 'utils.c',
+ 'utils.h',
+ 'video-encoder.h',
+ 'video-stream.cpp',
+ 'video-stream.h',
+ 'websocket.c',
+ 'websocket.h',
+ 'zlib-encoder.c',
+ 'zlib-encoder.h',
+]
+
+if spice_server_has_lz4 == true
+ spice_server_sources += ['lz4-encoder.c',
+ 'lz4-encoder.h']
+endif
+
+if spice_server_has_smartcard == true
+ spice_server_sources += ['smartcard.cpp',
+ 'smartcard.h',
+ 'smartcard-channel-client.cpp',
+ 'smartcard-channel-client.h']
+endif
+
+if spice_server_has_gstreamer == true
+ spice_server_sources += ['gstreamer-encoder.c']
+endif
+
+#
+# custom link_args
+#
+spice_server_syms = files('spice-server.syms')
+spice_server_syms_path = join_paths(meson.current_source_dir(), 'spice-server.syms')
+spice_server_link_args = ['-Wl,--no-copy-dt-needed-entries',
+ '-Wl,-z,relro',
+ '-Wl,-z,now',
+ '-Wl,--version-script=@0@'.format(spice_server_syms_path)]
+
+spice_server_libs = library('spice-server', spice_server_sources,
+ version : spice_server_so_version,
+ install : true,
+ include_directories : spice_server_include,
+ link_args : compiler.get_supported_link_arguments(spice_server_link_args),
+ link_depends : spice_server_syms,
+ dependencies : spice_server_deps,
+ gnu_symbol_visibility : 'hidden')
+
+if get_option('tests')
+ if get_option('default_library') == 'both'
+ spice_server_shared_lib = spice_server_libs.get_shared_lib()
+ spice_server_static_lib = spice_server_libs.get_static_lib()
+ elif get_option('default_library') == 'shared'
+ spice_server_shared_lib = spice_server_libs
+ # create static library extracting objects from shared one, avoid to
+ # install static library using both_libraries
+ spice_server_static_lib = static_library('spice-server-static',
+ objects: spice_server_libs.extract_all_objects(),
+ dependencies : spice_server_deps)
+ else
+ # here we use the static library to link to utilities (currently spice-server-replay)
+ spice_server_shared_lib = spice_server_libs
+ spice_server_static_lib = spice_server_libs
+ endif
+ subdir('tests')
+endif
+
+pc = import('pkgconfig')
+pc.generate(spice_server_libs,
+ description : 'SPICE server library',
+ subdirs : 'spice-server',
+ requires : 'spice-protocol')
diff --git a/server/migration_protocol.h b/server/migration-protocol.h
index fa17c7c4..2fc8e036 100644
--- a/server/migration_protocol.h
+++ b/server/migration-protocol.h
@@ -15,21 +15,26 @@
License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef _H_MIGRATION_PROTOCOL
-#define _H_MIGRATION_PROTOCOL
+#ifndef MIGRATION_PROTOCOL_H_
+#define MIGRATION_PROTOCOL_H_
+#include <spice/macros.h>
#include <spice/vd_agent.h>
-#include "glz_encoder_dictionary.h"
+#include <common/log.h>
+
+#include "glz-encoder-dict.h"
/* ************************************************
* src-server to dst-server migration data messages
* ************************************************/
+#include <spice/start-packed.h>
+
/* increase the version when the version of any
* of the migration data messages is increased */
#define SPICE_MIGRATION_PROTOCOL_VERSION 1
-typedef struct __attribute__ ((__packed__)) SpiceMigrateDataHeader {
+typedef struct SPICE_ATTR_PACKED SpiceMigrateDataHeader {
uint32_t magic;
uint32_t version;
} SpiceMigrateDataHeader;
@@ -43,7 +48,7 @@ typedef struct __attribute__ ((__packed__)) SpiceMigrateDataHeader {
#define SPICE_MIGRATE_DATA_CHAR_DEVICE_VERSION 1
/* Should be the first field of any of the char_devices migration data (see write_data_ptr) */
-typedef struct __attribute__ ((__packed__)) SpiceMigrateDataCharDevice {
+typedef struct SPICE_ATTR_PACKED SpiceMigrateDataCharDevice {
uint32_t version;
uint8_t connected;
uint32_t num_client_tokens;
@@ -60,8 +65,8 @@ typedef struct __attribute__ ((__packed__)) SpiceMigrateDataCharDevice {
#define SPICE_MIGRATE_DATA_SPICEVMC_VERSION 1 /* NOTE: increase version when CHAR_DEVICE_VERSION
is increased */
-#define SPICE_MIGRATE_DATA_SPICEVMC_MAGIC (*(uint32_t *)"SVMD")
-typedef struct __attribute__ ((__packed__)) SpiceMigrateDataSpiceVmc {
+#define SPICE_MIGRATE_DATA_SPICEVMC_MAGIC SPICE_MAGIC_CONST("SVMD")
+typedef struct SPICE_ATTR_PACKED SpiceMigrateDataSpiceVmc {
SpiceMigrateDataCharDevice base;
} SpiceMigrateDataSpiceVmc;
@@ -71,8 +76,8 @@ typedef struct __attribute__ ((__packed__)) SpiceMigrateDataSpiceVmc {
#define SPICE_MIGRATE_DATA_SMARTCARD_VERSION 1 /* NOTE: increase version when CHAR_DEVICE_VERSION
is increased */
-#define SPICE_MIGRATE_DATA_SMARTCARD_MAGIC (*(uint32_t *)"SCMD")
-typedef struct __attribute__ ((__packed__)) SpiceMigrateDataSmartcard {
+#define SPICE_MIGRATE_DATA_SMARTCARD_MAGIC SPICE_MAGIC_CONST("SCMD")
+typedef struct SPICE_ATTR_PACKED SpiceMigrateDataSmartcard {
SpiceMigrateDataCharDevice base;
uint8_t reader_added;
uint32_t read_size; /* partial data read from dev */
@@ -84,13 +89,13 @@ typedef struct __attribute__ ((__packed__)) SpiceMigrateDataSmartcard {
* *********************************/
#define SPICE_MIGRATE_DATA_MAIN_VERSION 1 /* NOTE: increase version when CHAR_DEVICE_VERSION
is increased */
-#define SPICE_MIGRATE_DATA_MAIN_MAGIC (*(uint32_t *)"MNMD")
+#define SPICE_MIGRATE_DATA_MAIN_MAGIC SPICE_MAGIC_CONST("MNMD")
-typedef struct __attribute__ ((__packed__)) SpiceMigrateDataMain {
+typedef struct SPICE_ATTR_PACKED SpiceMigrateDataMain {
SpiceMigrateDataCharDevice agent_base;
uint8_t client_agent_started; /* for discarding messages */
- struct __attribute__ ((__packed__)) {
+ struct SPICE_ATTR_PACKED {
/* partial data read from device. Such data is stored only
* if the chunk header or the entire msg header haven't yet been read completely.
* Once the headers are read, partial reads of chunks can be sent as
@@ -104,7 +109,7 @@ typedef struct __attribute__ ((__packed__)) SpiceMigrateDataMain {
uint8_t msg_filter_result;
} agent2client;
- struct __attribute__ ((__packed__)) {
+ struct SPICE_ATTR_PACKED {
uint32_t msg_remaining;
uint8_t msg_filter_result;
} client2agent;
@@ -115,7 +120,7 @@ typedef struct __attribute__ ((__packed__)) SpiceMigrateDataMain {
* ***************/
#define SPICE_MIGRATE_DATA_DISPLAY_VERSION 1
-#define SPICE_MIGRATE_DATA_DISPLAY_MAGIC (*(uint32_t *)"DCMD")
+#define SPICE_MIGRATE_DATA_DISPLAY_MAGIC SPICE_MAGIC_CONST("DCMD")
/*
* TODO: store the cache and dictionary data only in one channel (the
@@ -125,7 +130,7 @@ typedef struct __attribute__ ((__packed__)) SpiceMigrateDataMain {
* */
#define MIGRATE_DATA_DISPLAY_MAX_CACHE_CLIENTS 4
-typedef struct __attribute__ ((__packed__)) SpiceMigrateDataDisplay {
+typedef struct SPICE_ATTR_PACKED SpiceMigrateDataDisplay {
uint64_t message_serial;
uint8_t low_bandwidth_setting;
@@ -134,7 +139,7 @@ typedef struct __attribute__ ((__packed__)) SpiceMigrateDataDisplay {
* For now, the cache is not migrated, and instead, we reset it and send
* SPICE_MSG_DISPLAY_INVAL_ALL_PIXMAPS to the client.
* In order to keep the client and server caches consistent:
- * The channel which freezed the cache on the src side, unfreezes it
+ * The channel which froze the cache on the src side, unfreezes it
* on the dest side, and increases its generation (see 'reset' in red_client_shared_cach.h).
* In order to enforce that images that are added to the cache by other channels
* will reach the client only after SPICE_MSG_DISPLAY_INVAL_ALL_PIXMAPS,
@@ -156,28 +161,28 @@ typedef struct __attribute__ ((__packed__)) SpiceMigrateDataDisplay {
} SpiceMigrateDataDisplay;
-typedef struct __attribute__ ((__packed__)) SpiceMigrateDataRect {
+typedef struct SPICE_ATTR_PACKED SpiceMigrateDataRect {
int32_t left;
int32_t top;
int32_t right;
int32_t bottom;
} SpiceMigrateDataRect;
-typedef struct __attribute__ ((__packed__)) MigrateDisplaySurfaceLossless {
+typedef struct SPICE_ATTR_PACKED MigrateDisplaySurfaceLossless {
uint32_t id;
} MigrateDisplaySurfaceLossless;
-typedef struct __attribute__ ((__packed__)) MigrateDisplaySurfaceLossy {
+typedef struct SPICE_ATTR_PACKED MigrateDisplaySurfaceLossy {
uint32_t id;
SpiceMigrateDataRect lossy_rect;
} MigrateDisplaySurfaceLossy;
-typedef struct __attribute__ ((__packed__)) MigrateDisplaySurfacesAtClientLossless {
+typedef struct SPICE_ATTR_PACKED MigrateDisplaySurfacesAtClientLossless {
uint32_t num_surfaces;
MigrateDisplaySurfaceLossless surfaces[0];
} MigrateDisplaySurfacesAtClientLossless;
-typedef struct __attribute__ ((__packed__)) MigrateDisplaySurfacesAtClientLossy {
+typedef struct SPICE_ATTR_PACKED MigrateDisplaySurfacesAtClientLossy {
uint32_t num_surfaces;
MigrateDisplaySurfaceLossy surfaces[0];
} MigrateDisplaySurfacesAtClientLossy;
@@ -187,13 +192,15 @@ typedef struct __attribute__ ((__packed__)) MigrateDisplaySurfacesAtClientLossy
* ***************/
#define SPICE_MIGRATE_DATA_INPUTS_VERSION 1
-#define SPICE_MIGRATE_DATA_INPUTS_MAGIC (*(uint32_t *)"ICMD")
+#define SPICE_MIGRATE_DATA_INPUTS_MAGIC SPICE_MAGIC_CONST("ICMD")
-typedef struct __attribute__ ((__packed__)) SpiceMigrateDataInputs {
+typedef struct SPICE_ATTR_PACKED SpiceMigrateDataInputs {
uint16_t motion_count;
} SpiceMigrateDataInputs;
+#include <spice/end-packed.h>
+
static inline int migration_protocol_validate_header(SpiceMigrateDataHeader *header,
uint32_t magic,
uint32_t version)
@@ -209,4 +216,4 @@ static inline int migration_protocol_validate_header(SpiceMigrateDataHeader *hea
return TRUE;
}
-#endif
+#endif /* MIGRATION_PROTOCOL_H_ */
diff --git a/server/mjpeg_encoder.c b/server/mjpeg-encoder.c
index 12447dac..0110bba7 100644
--- a/server/mjpeg_encoder.c
+++ b/server/mjpeg-encoder.c
@@ -15,15 +15,21 @@
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
-#ifdef HAVE_CONFIG_H
#include <config.h>
+
+#ifdef _WIN32
+/* Avoid conflicting types for INT32 */
+#define QGLOBAL_H
#endif
-#include "red_common.h"
-#include "mjpeg_encoder.h"
+#include <stdio.h>
+#include <inttypes.h>
#include <jerror.h>
#include <jpeglib.h>
-#include <inttypes.h>
+
+#include "red-common.h"
+#include "video-encoder.h"
+#include "utils.h"
#define MJPEG_MAX_FPS 25
#define MJPEG_MIN_FPS 1
@@ -31,15 +37,12 @@
#define MJPEG_QUALITY_SAMPLE_NUM 7
static const int mjpeg_quality_samples[MJPEG_QUALITY_SAMPLE_NUM] = {20, 30, 40, 50, 60, 70, 80};
-#define MJPEG_LEGACY_STATIC_QUALITY_ID 5 // jpeg quality 70
-
#define MJPEG_IMPROVE_QUALITY_FPS_STRICT_TH 10
#define MJPEG_IMPROVE_QUALITY_FPS_PERMISSIVE_TH 5
#define MJPEG_AVERAGE_SIZE_WINDOW 3
#define MJPEG_BIT_RATE_EVAL_MIN_NUM_FRAMES 3
-#define MJPEG_LOW_FPS_RATE_TH 3
#define MJPEG_SERVER_STATUS_EVAL_FPS_INTERVAL 1
#define MJPEG_SERVER_STATUS_DOWNGRADE_DROP_FACTOR_TH 0.1
@@ -58,7 +61,7 @@ static const int mjpeg_quality_samples[MJPEG_QUALITY_SAMPLE_NUM] = {20, 30, 40,
* avoid interrupting the playback when there are temporary
* incidents of instability (with respect to server and client drops)
*/
-#define MJPEG_MAX_CLIENT_PLAYBACK_DELAY 5000 // 5 sec
+#define MJPEG_MAX_CLIENT_PLAYBACK_DELAY (MSEC_PER_SEC * 5)
/*
* The stream starts after lossless frames were sent to the client,
@@ -67,7 +70,20 @@ static const int mjpeg_quality_samples[MJPEG_QUALITY_SAMPLE_NUM] = {20, 30, 40,
* are not necessarily related to mis-estimation of the bit rate, and we would
* like to wait till the stream stabilizes.
*/
-#define MJPEG_WARMUP_TIME 3000LL // 3 sec
+#define MJPEG_WARMUP_TIME (NSEC_PER_SEC * 3)
+
+/* The compressed buffer initial size. */
+#define MJPEG_INITIAL_BUFFER_SIZE (32 * 1024)
+
+#ifdef JCS_EXTENSIONS
+# ifndef WORDS_BIGENDIAN
+# define JCS_EXT_LE_BGRX JCS_EXT_BGRX
+# define JCS_EXT_LE_BGR JCS_EXT_BGR
+# else
+# define JCS_EXT_LE_BGRX JCS_EXT_XRGB
+# define JCS_EXT_LE_BGR JCS_EXT_RGB
+# endif
+#endif
enum {
MJPEG_QUALITY_EVAL_TYPE_SET,
@@ -153,7 +169,13 @@ typedef struct MJpegEncoderRateControl {
uint64_t warmup_start_time;
} MJpegEncoderRateControl;
-struct MJpegEncoder {
+typedef struct MJpegVideoBuffer {
+ VideoBuffer base;
+ size_t maxsize;
+} MJpegVideoBuffer;
+
+typedef struct MJpegEncoder {
+ VideoEncoder base;
uint8_t *row;
uint32_t row_size;
int first_frame;
@@ -162,98 +184,80 @@ struct MJpegEncoder {
struct jpeg_error_mgr jerr;
unsigned int bytes_per_pixel; /* bytes per pixel of the input buffer */
- void (*pixel_converter)(uint8_t *src, uint8_t *dest);
+ void (*pixel_converter)(void *src, uint8_t *dest);
- int rate_control_is_active;
MJpegEncoderRateControl rate_control;
- MJpegEncoderRateControlCbs cbs;
- void *cbs_opaque;
+ VideoEncoderRateControlCbs cbs;
/* stats */
uint64_t starting_bit_rate;
uint64_t avg_quality;
uint32_t num_frames;
-};
+} MJpegEncoder;
-static inline void mjpeg_encoder_reset_quality(MJpegEncoder *encoder,
- int quality_id,
- uint32_t fps,
- uint64_t frame_enc_size);
-static uint32_t get_max_fps(uint64_t frame_size, uint64_t bytes_per_sec);
static void mjpeg_encoder_process_server_drops(MJpegEncoder *encoder);
-static uint32_t get_min_required_playback_delay(uint64_t frame_enc_size,
- uint64_t byte_rate,
- uint32_t latency);
+static uint32_t get_min_required_playback_delay(const MJpegEncoder *encoder,
+ uint64_t frame_enc_size);
-MJpegEncoder *mjpeg_encoder_new(int bit_rate_control, uint64_t starting_bit_rate,
- MJpegEncoderRateControlCbs *cbs, void *opaque)
+static void mjpeg_video_buffer_free(VideoBuffer *video_buffer)
{
- MJpegEncoder *enc;
-
- spice_assert(!bit_rate_control || (cbs && cbs->get_roundtrip_ms && cbs->get_source_fps));
-
- enc = spice_new0(MJpegEncoder, 1);
-
- enc->first_frame = TRUE;
- enc->rate_control_is_active = bit_rate_control;
- enc->rate_control.byte_rate = starting_bit_rate / 8;
- enc->starting_bit_rate = starting_bit_rate;
-
- if (bit_rate_control) {
- struct timespec time;
+ MJpegVideoBuffer *buffer = (MJpegVideoBuffer*)video_buffer;
+ g_free(buffer->base.data);
+ g_free(buffer);
+}
- clock_gettime(CLOCK_MONOTONIC, &time);
- enc->cbs = *cbs;
- enc->cbs_opaque = opaque;
- mjpeg_encoder_reset_quality(enc, MJPEG_QUALITY_SAMPLE_NUM / 2, 5, 0);
- enc->rate_control.during_quality_eval = TRUE;
- enc->rate_control.quality_eval_data.type = MJPEG_QUALITY_EVAL_TYPE_SET;
- enc->rate_control.quality_eval_data.reason = MJPEG_QUALITY_EVAL_REASON_RATE_CHANGE;
- enc->rate_control.warmup_start_time = ((uint64_t) time.tv_sec) * 1000000000 + time.tv_nsec;
- } else {
- mjpeg_encoder_reset_quality(enc, MJPEG_LEGACY_STATIC_QUALITY_ID, MJPEG_MAX_FPS, 0);
+static MJpegVideoBuffer* create_mjpeg_video_buffer(void)
+{
+ MJpegVideoBuffer *buffer = g_new0(MJpegVideoBuffer, 1);
+ buffer->base.free = mjpeg_video_buffer_free;
+ buffer->maxsize = MJPEG_INITIAL_BUFFER_SIZE;
+ buffer->base.data = (uint8_t*) g_try_malloc(buffer->maxsize);
+ if (!buffer->base.data) {
+ g_free(buffer);
+ buffer = NULL;
}
-
- enc->cinfo.err = jpeg_std_error(&enc->jerr);
- jpeg_create_compress(&enc->cinfo);
-
- return enc;
+ return buffer;
}
-void mjpeg_encoder_destroy(MJpegEncoder *encoder)
+static void mjpeg_encoder_destroy(VideoEncoder *video_encoder)
{
+ MJpegEncoder *encoder = SPICE_CONTAINEROF(video_encoder, MJpegEncoder, base);
+ g_free(encoder->cinfo.dest);
jpeg_destroy_compress(&encoder->cinfo);
- free(encoder->row);
- free(encoder);
+ g_free(encoder->row);
+ g_free(encoder);
}
-uint8_t mjpeg_encoder_get_bytes_per_pixel(MJpegEncoder *encoder)
+static uint8_t mjpeg_encoder_get_bytes_per_pixel(MJpegEncoder *encoder)
{
return encoder->bytes_per_pixel;
}
#ifndef JCS_EXTENSIONS
/* Pixel conversion routines */
-static void pixel_rgb24bpp_to_24(uint8_t *src, uint8_t *dest)
+static void pixel_rgb24bpp_to_24(void *src_ptr, uint8_t *dest)
{
+ uint8_t *src = src_ptr;
/* libjpegs stores rgb, spice/win32 stores bgr */
*dest++ = src[2]; /* red */
*dest++ = src[1]; /* green */
*dest++ = src[0]; /* blue */
}
-static void pixel_rgb32bpp_to_24(uint8_t *src, uint8_t *dest)
+static void pixel_rgb32bpp_to_24(void *src, uint8_t *dest)
{
uint32_t pixel = *(uint32_t *)src;
+ pixel = GUINT32_FROM_LE(pixel);
*dest++ = (pixel >> 16) & 0xff;
*dest++ = (pixel >> 8) & 0xff;
*dest++ = (pixel >> 0) & 0xff;
}
#endif
-static void pixel_rgb16bpp_to_24(uint8_t *src, uint8_t *dest)
+static void pixel_rgb16bpp_to_24(void *src, uint8_t *dest)
{
uint16_t pixel = *(uint16_t *)src;
+ pixel = GUINT16_FROM_LE(pixel);
*dest++ = ((pixel >> 7) & 0xf8) | ((pixel >> 12) & 0x7);
*dest++ = ((pixel >> 2) & 0xf8) | ((pixel >> 7) & 0x7);
*dest++ = ((pixel << 3) & 0xf8) | ((pixel >> 2) & 0x7);
@@ -269,9 +273,9 @@ static void pixel_rgb16bpp_to_24(uint8_t *src, uint8_t *dest)
typedef struct {
struct jpeg_destination_mgr pub; /* public fields */
- unsigned char ** outbuffer; /* target buffer */
+ unsigned char ** outbuffer; /* target buffer */
size_t * outsize;
- uint8_t * buffer; /* start of buffer */
+ uint8_t * buffer; /* start of buffer */
size_t bufsize;
} mem_destination_mgr;
@@ -287,15 +291,11 @@ static boolean empty_mem_output_buffer(j_compress_ptr cinfo)
/* Try to allocate new buffer with double size */
nextsize = dest->bufsize * 2;
- nextbuffer = malloc(nextsize);
+ nextbuffer = (uint8_t*) g_try_realloc(dest->buffer, nextsize);
if (nextbuffer == NULL)
ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 10);
- memcpy(nextbuffer, dest->buffer, dest->bufsize);
-
- free(dest->buffer);
-
dest->pub.next_output_byte = nextbuffer + dest->bufsize;
dest->pub.free_in_buffer = dest->bufsize;
@@ -315,30 +315,28 @@ static void term_mem_destination(j_compress_ptr cinfo)
/*
* Prepare for output to a memory buffer.
- * The caller may supply an own initial buffer with appropriate size.
- * Otherwise, or when the actual data output exceeds the given size,
- * the library adapts the buffer size as necessary.
- * The standard library functions malloc/free are used for allocating
- * larger memory, so the buffer is available to the application after
- * finishing compression, and then the application is responsible for
- * freeing the requested memory.
+ * The caller must supply its own initial buffer and size.
+ * When the actual data output exceeds the given size, the library
+ * will adapt the buffer size as necessary using the g_malloc()/g_free()
+ * functions. The buffer is available to the application after the
+ * compression and the application is then responsible for freeing it.
*/
-
static void
spice_jpeg_mem_dest(j_compress_ptr cinfo,
unsigned char ** outbuffer, size_t * outsize)
{
mem_destination_mgr *dest;
-#define OUTPUT_BUF_SIZE 4096 /* choose an efficiently fwrite'able size */
- if (outbuffer == NULL || outsize == NULL) /* sanity check */
+ if (outbuffer == NULL || *outbuffer == NULL ||
+ outsize == NULL || *outsize == 0) { /* sanity check */
ERREXIT(cinfo, JERR_BUFFER_SIZE);
+ }
/* The destination object is made permanent so that multiple JPEG images
* can be written to the same buffer without re-executing jpeg_mem_dest.
*/
- if (cinfo->dest == NULL) { /* first time for this JPEG object? */
- cinfo->dest = spice_malloc(sizeof(mem_destination_mgr));
+ if (cinfo->dest == NULL) { /* first time for this JPEG object? */
+ cinfo->dest = g_malloc(sizeof(mem_destination_mgr));
}
dest = (mem_destination_mgr *) cinfo->dest;
@@ -347,42 +345,33 @@ spice_jpeg_mem_dest(j_compress_ptr cinfo,
dest->pub.term_destination = term_mem_destination;
dest->outbuffer = outbuffer;
dest->outsize = outsize;
- if (*outbuffer == NULL || *outsize == 0) {
- /* Allocate initial buffer */
- *outbuffer = malloc(OUTPUT_BUF_SIZE);
- if (*outbuffer == NULL)
- ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 10);
- *outsize = OUTPUT_BUF_SIZE;
- }
dest->pub.next_output_byte = dest->buffer = *outbuffer;
dest->pub.free_in_buffer = dest->bufsize = *outsize;
}
/* end of code from libjpeg */
-static inline uint32_t mjpeg_encoder_get_latency(MJpegEncoder *encoder)
+static inline uint32_t mjpeg_encoder_get_source_fps(const MJpegEncoder *encoder)
+{
+ return encoder->cbs.get_source_fps ?
+ encoder->cbs.get_source_fps(encoder->cbs.opaque) : MJPEG_MAX_FPS;
+}
+
+static inline uint32_t mjpeg_encoder_get_latency(const MJpegEncoder *encoder)
{
return encoder->cbs.get_roundtrip_ms ?
- encoder->cbs.get_roundtrip_ms(encoder->cbs_opaque) / 2 : 0;
+ encoder->cbs.get_roundtrip_ms(encoder->cbs.opaque) / 2 : 0;
}
static uint32_t get_max_fps(uint64_t frame_size, uint64_t bytes_per_sec)
{
- double fps;
- double send_time_ms;
-
- if (!bytes_per_sec) {
- return 0;
- }
- send_time_ms = frame_size * 1000.0 / bytes_per_sec;
- fps = send_time_ms ? 1000 / send_time_ms : MJPEG_MAX_FPS;
- return fps;
+ return frame_size ? bytes_per_sec / frame_size : MJPEG_MAX_FPS;
}
-static inline void mjpeg_encoder_reset_quality(MJpegEncoder *encoder,
- int quality_id,
- uint32_t fps,
- uint64_t frame_enc_size)
+static void mjpeg_encoder_reset_quality(MJpegEncoder *encoder,
+ int quality_id,
+ uint32_t fps,
+ uint64_t frame_enc_size)
{
MJpegEncoderRateControl *rate_control = &encoder->rate_control;
double fps_ratio;
@@ -459,7 +448,7 @@ static inline void mjpeg_encoder_eval_quality(MJpegEncoder *encoder)
return;
}
- src_fps = encoder->cbs.get_source_fps(encoder->cbs_opaque);
+ src_fps = mjpeg_encoder_get_source_fps(encoder);
fps = get_max_fps(enc_size, rate_control->byte_rate);
spice_debug("mjpeg %p: jpeg %d: %.2f (KB) fps %d src-fps %u",
@@ -561,12 +550,9 @@ complete_sample:
spice_debug("MJpeg quality sample end %p: quality %d fps %d",
encoder, mjpeg_quality_samples[rate_control->quality_id], rate_control->fps);
if (encoder->cbs.update_client_playback_delay) {
- uint32_t latency = mjpeg_encoder_get_latency(encoder);
- uint32_t min_delay = get_min_required_playback_delay(final_quality_enc_size,
- rate_control->byte_rate,
- latency);
+ uint32_t min_delay = get_min_required_playback_delay(encoder, final_quality_enc_size);
- encoder->cbs.update_client_playback_delay(encoder->cbs_opaque, min_delay);
+ encoder->cbs.update_client_playback_delay(encoder->cbs.opaque, min_delay);
}
}
@@ -607,10 +593,6 @@ static void mjpeg_encoder_adjust_params_to_bit_rate(MJpegEncoder *encoder)
uint32_t latency = 0;
uint32_t src_fps;
- if (!encoder->rate_control_is_active) {
- return;
- }
-
rate_control = &encoder->rate_control;
quality_eval = &rate_control->quality_eval_data;
@@ -642,7 +624,8 @@ static void mjpeg_encoder_adjust_params_to_bit_rate(MJpegEncoder *encoder)
spice_debug("cur-fps=%u new-fps=%u (new/old=%.2f) |"
"bit-rate=%.2f (Mbps) latency=%u (ms) quality=%d |"
- " new-size-avg %"PRIu64" , base-size %"PRIu64", (new/old=%.2f) ",
+ " new-size-avg %" G_GUINT64_FORMAT " ,"
+ " base-size %" G_GUINT64_FORMAT ", (new/old=%.2f) ",
rate_control->fps, new_fps, ((double)new_fps)/rate_control->fps,
((double)rate_control->byte_rate*8)/1024/1024,
latency,
@@ -652,7 +635,7 @@ static void mjpeg_encoder_adjust_params_to_bit_rate(MJpegEncoder *encoder)
((double)new_avg_enc_size) / rate_control->base_enc_size :
1);
- src_fps = encoder->cbs.get_source_fps(encoder->cbs_opaque);
+ src_fps = mjpeg_encoder_get_source_fps(encoder);
/*
* The ratio between the new_fps and the current fps reflects the changes
@@ -694,25 +677,23 @@ static void mjpeg_encoder_adjust_fps(MJpegEncoder *encoder, uint64_t now)
MJpegEncoderRateControl *rate_control = &encoder->rate_control;
uint64_t adjusted_fps_time_passed;
- if (!encoder->rate_control_is_active) {
- return;
- }
- adjusted_fps_time_passed = (now - rate_control->adjusted_fps_start_time) / 1000 / 1000;
+ adjusted_fps_time_passed = (now - rate_control->adjusted_fps_start_time) / NSEC_PER_MILLISEC;
if (!rate_control->during_quality_eval &&
adjusted_fps_time_passed > MJPEG_ADJUST_FPS_TIMEOUT &&
- adjusted_fps_time_passed > 1000 / rate_control->adjusted_fps) {
+ adjusted_fps_time_passed > MSEC_PER_SEC / rate_control->adjusted_fps) {
double avg_fps;
double fps_ratio;
- avg_fps = ((double)rate_control->adjusted_fps_num_frames*1000) /
+ avg_fps = ((double)rate_control->adjusted_fps_num_frames * MSEC_PER_SEC) /
adjusted_fps_time_passed;
- spice_debug("#frames-adjust=%"PRIu64" #adjust-time=%"PRIu64" avg-fps=%.2f",
+ spice_debug("#frames-adjust=%" G_GUINT64_FORMAT
+ " #adjust-time=%" G_GUINT64_FORMAT " avg-fps=%.2f",
rate_control->adjusted_fps_num_frames, adjusted_fps_time_passed, avg_fps);
spice_debug("defined=%u old-adjusted=%.2f", rate_control->fps, rate_control->adjusted_fps);
fps_ratio = avg_fps / rate_control->fps;
if (avg_fps + 0.5 < rate_control->fps &&
- encoder->cbs.get_source_fps(encoder->cbs_opaque) > avg_fps) {
+ mjpeg_encoder_get_source_fps(encoder) > avg_fps) {
double new_adjusted_fps = avg_fps ?
(rate_control->adjusted_fps/fps_ratio) :
rate_control->adjusted_fps * 2;
@@ -730,46 +711,55 @@ static void mjpeg_encoder_adjust_fps(MJpegEncoder *encoder, uint64_t now)
}
}
-int mjpeg_encoder_start_frame(MJpegEncoder *encoder, SpiceBitmapFmt format,
- int width, int height,
- uint8_t **dest, size_t *dest_len,
- uint32_t frame_mm_time)
+/*
+ * dest must be either NULL or allocated by g_malloc, since it might be freed
+ * during the encoding, if its size is too small.
+ *
+ * return:
+ * MJPEG_ENCODER_FRAME_UNSUPPORTED : frame cannot be encoded
+ * MJPEG_ENCODER_FRAME_DROP : frame should be dropped. This value can only be returned
+ * if mjpeg rate control is active.
+ * MJPEG_ENCODER_FRAME_ENCODE_DONE : frame encoding started. Continue with
+ * mjpeg_encoder_encode_scanline.
+ */
+static VideoEncodeResults
+mjpeg_encoder_start_frame(MJpegEncoder *encoder,
+ SpiceBitmapFmt format,
+ const SpiceRect *src,
+ MJpegVideoBuffer *buffer,
+ uint32_t frame_mm_time)
{
uint32_t quality;
- if (encoder->rate_control_is_active) {
- MJpegEncoderRateControl *rate_control = &encoder->rate_control;
- struct timespec time;
- uint64_t now;
- uint64_t interval;
+ MJpegEncoderRateControl *rate_control = &encoder->rate_control;
+ uint64_t now;
+ uint64_t interval;
- clock_gettime(CLOCK_MONOTONIC, &time);
- now = ((uint64_t) time.tv_sec) * 1000000000 + time.tv_nsec;
+ now = spice_get_monotonic_time_ns();
- if (!rate_control->adjusted_fps_start_time) {
- rate_control->adjusted_fps_start_time = now;
- }
- mjpeg_encoder_adjust_fps(encoder, now);
- interval = (now - rate_control->bit_rate_info.last_frame_time);
+ if (!rate_control->adjusted_fps_start_time) {
+ rate_control->adjusted_fps_start_time = now;
+ }
+ mjpeg_encoder_adjust_fps(encoder, now);
+ interval = (now - rate_control->bit_rate_info.last_frame_time);
- if (interval < (1000*1000*1000) / rate_control->adjusted_fps) {
- return MJPEG_ENCODER_FRAME_DROP;
- }
+ if (interval < NSEC_PER_SEC / rate_control->adjusted_fps) {
+ return VIDEO_ENCODER_FRAME_DROP;
+ }
- mjpeg_encoder_adjust_params_to_bit_rate(encoder);
+ mjpeg_encoder_adjust_params_to_bit_rate(encoder);
- if (!rate_control->during_quality_eval ||
- rate_control->quality_eval_data.reason == MJPEG_QUALITY_EVAL_REASON_SIZE_CHANGE) {
- MJpegEncoderBitRateInfo *bit_rate_info;
+ if (!rate_control->during_quality_eval ||
+ rate_control->quality_eval_data.reason == MJPEG_QUALITY_EVAL_REASON_SIZE_CHANGE) {
+ MJpegEncoderBitRateInfo *bit_rate_info;
- bit_rate_info = &encoder->rate_control.bit_rate_info;
+ bit_rate_info = &encoder->rate_control.bit_rate_info;
- if (!bit_rate_info->change_start_time) {
- bit_rate_info->change_start_time = now;
- bit_rate_info->change_start_mm_time = frame_mm_time;
- }
- bit_rate_info->last_frame_time = now;
+ if (!bit_rate_info->change_start_time) {
+ bit_rate_info->change_start_time = now;
+ bit_rate_info->change_start_mm_time = frame_mm_time;
}
+ bit_rate_info->last_frame_time = now;
}
encoder->cinfo.in_color_space = JCS_RGB;
@@ -781,7 +771,7 @@ int mjpeg_encoder_start_frame(MJpegEncoder *encoder, SpiceBitmapFmt format,
case SPICE_BITMAP_FMT_RGBA:
encoder->bytes_per_pixel = 4;
#ifdef JCS_EXTENSIONS
- encoder->cinfo.in_color_space = JCS_EXT_BGRX;
+ encoder->cinfo.in_color_space = JCS_EXT_LE_BGRX;
encoder->cinfo.input_components = 4;
#else
encoder->pixel_converter = pixel_rgb32bpp_to_24;
@@ -794,32 +784,32 @@ int mjpeg_encoder_start_frame(MJpegEncoder *encoder, SpiceBitmapFmt format,
case SPICE_BITMAP_FMT_24BIT:
encoder->bytes_per_pixel = 3;
#ifdef JCS_EXTENSIONS
- encoder->cinfo.in_color_space = JCS_EXT_BGR;
+ encoder->cinfo.in_color_space = JCS_EXT_LE_BGR;
#else
encoder->pixel_converter = pixel_rgb24bpp_to_24;
#endif
break;
default:
spice_debug("unsupported format %d", format);
- return MJPEG_ENCODER_FRAME_UNSUPPORTED;
+ return VIDEO_ENCODER_FRAME_UNSUPPORTED;
}
+ encoder->cinfo.image_width = src->right - src->left;
+ encoder->cinfo.image_height = src->bottom - src->top;
if (encoder->pixel_converter != NULL) {
- unsigned int stride = width * 3;
+ JDIMENSION stride = encoder->cinfo.image_width * 3;
/* check for integer overflow */
- if (stride < width) {
- return MJPEG_ENCODER_FRAME_UNSUPPORTED;
+ if (stride < encoder->cinfo.image_width) {
+ return VIDEO_ENCODER_FRAME_UNSUPPORTED;
}
if (encoder->row_size < stride) {
- encoder->row = spice_realloc(encoder->row, stride);
+ encoder->row = (uint8_t*) g_realloc(encoder->row, stride);
encoder->row_size = stride;
}
}
- spice_jpeg_mem_dest(&encoder->cinfo, dest, dest_len);
+ spice_jpeg_mem_dest(&encoder->cinfo, &buffer->base.data, &buffer->maxsize);
- encoder->cinfo.image_width = width;
- encoder->cinfo.image_height = height;
jpeg_set_defaults(&encoder->cinfo);
encoder->cinfo.dct_method = JDCT_IFAST;
quality = mjpeg_quality_samples[encoder->rate_control.quality_id];
@@ -828,11 +818,12 @@ int mjpeg_encoder_start_frame(MJpegEncoder *encoder, SpiceBitmapFmt format,
encoder->num_frames++;
encoder->avg_quality += quality;
- return MJPEG_ENCODER_FRAME_ENCODE_START;
+ return VIDEO_ENCODER_FRAME_ENCODE_DONE;
}
-int mjpeg_encoder_encode_scanline(MJpegEncoder *encoder, uint8_t *src_pixels,
- size_t image_width)
+static int mjpeg_encoder_encode_scanline(MJpegEncoder *encoder,
+ uint8_t *src_pixels,
+ size_t image_width)
{
unsigned int scanlines_written;
uint8_t *row;
@@ -841,6 +832,7 @@ int mjpeg_encoder_encode_scanline(MJpegEncoder *encoder, uint8_t *src_pixels,
if (encoder->pixel_converter) {
unsigned int x;
for (x = 0; x < image_width; x++) {
+ /* src_pixels is expected to be 4 bytes aligned */
encoder->pixel_converter(src_pixels, row);
row += 3;
src_pixels += encoder->bytes_per_pixel;
@@ -858,7 +850,7 @@ int mjpeg_encoder_encode_scanline(MJpegEncoder *encoder, uint8_t *src_pixels,
return scanlines_written;
}
-size_t mjpeg_encoder_end_frame(MJpegEncoder *encoder)
+static size_t mjpeg_encoder_end_frame(MJpegEncoder *encoder)
{
mem_destination_mgr *dest = (mem_destination_mgr *) encoder->cinfo.dest;
MJpegEncoderRateControl *rate_control = &encoder->rate_control;
@@ -887,6 +879,101 @@ size_t mjpeg_encoder_end_frame(MJpegEncoder *encoder)
return encoder->rate_control.last_enc_size;
}
+static inline uint8_t *get_image_line(SpiceChunks *chunks, size_t *offset,
+ int *chunk_nr, int stride)
+{
+ uint8_t *ret;
+ SpiceChunk *chunk;
+
+ chunk = &chunks->chunk[*chunk_nr];
+
+ if (*offset == chunk->len) {
+ if (*chunk_nr == chunks->num_chunks - 1) {
+ return NULL; /* Last chunk */
+ }
+ *offset = 0;
+ (*chunk_nr)++;
+ chunk = &chunks->chunk[*chunk_nr];
+ }
+
+ if (chunk->len - *offset < stride) {
+ spice_warning("bad chunk alignment");
+ return NULL;
+ }
+ ret = chunk->data + *offset;
+ *offset += stride;
+ return ret;
+}
+
+static bool encode_frame(MJpegEncoder *encoder, const SpiceRect *src,
+ const SpiceBitmap *image, int top_down)
+{
+ SpiceChunks *chunks;
+ uint32_t image_stride;
+ size_t offset;
+ int i, chunk;
+
+ chunks = image->data;
+ offset = 0;
+ chunk = 0;
+ image_stride = image->stride;
+
+ const int skip_lines = top_down ? src->top : image->y - (src->bottom - 0);
+ for (i = 0; i < skip_lines; i++) {
+ get_image_line(chunks, &offset, &chunk, image_stride);
+ }
+
+ const unsigned int stream_height = src->bottom - src->top;
+ const unsigned int stream_width = src->right - src->left;
+
+ for (i = 0; i < stream_height; i++) {
+ uint8_t *src_line = get_image_line(chunks, &offset, &chunk, image_stride);
+
+ if (!src_line) {
+ return FALSE;
+ }
+
+ src_line += src->left * mjpeg_encoder_get_bytes_per_pixel(encoder);
+ if (mjpeg_encoder_encode_scanline(encoder, src_line, stream_width) == 0) {
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+static VideoEncodeResults
+mjpeg_encoder_encode_frame(VideoEncoder *video_encoder,
+ uint32_t frame_mm_time,
+ const SpiceBitmap *bitmap,
+ const SpiceRect *src, int top_down,
+ gpointer bitmap_opaque,
+ VideoBuffer **outbuf)
+{
+ MJpegEncoder *encoder = SPICE_CONTAINEROF(video_encoder, MJpegEncoder, base);
+ MJpegVideoBuffer *buffer = create_mjpeg_video_buffer();
+ if (!buffer) {
+ return VIDEO_ENCODER_FRAME_UNSUPPORTED;
+ }
+
+ VideoEncodeResults ret = mjpeg_encoder_start_frame(encoder, (SpiceBitmapFmt) bitmap->format,
+ src, buffer, frame_mm_time);
+ if (ret == VIDEO_ENCODER_FRAME_ENCODE_DONE) {
+ if (encode_frame(encoder, src, bitmap, top_down)) {
+ buffer->base.size = mjpeg_encoder_end_frame(encoder);
+ *outbuf = (VideoBuffer*)buffer;
+ } else {
+ ret = VIDEO_ENCODER_FRAME_UNSUPPORTED;
+ }
+ }
+
+ if (ret != VIDEO_ENCODER_FRAME_ENCODE_DONE) {
+ buffer->base.free(&buffer->base);
+ }
+ return ret;
+}
+
+
static void mjpeg_encoder_quality_eval_stop(MJpegEncoder *encoder)
{
MJpegEncoderRateControl *rate_control = &encoder->rate_control;
@@ -910,7 +997,7 @@ static void mjpeg_encoder_quality_eval_stop(MJpegEncoder *encoder)
fps = MJPEG_MAX_FPS / 2;
break;
default:
- spice_warning("unexected");
+ spice_warning("unexpected");
return;
}
mjpeg_encoder_reset_quality(encoder, quality_id, fps, 0);
@@ -932,17 +1019,14 @@ static void mjpeg_encoder_decrease_bit_rate(MJpegEncoder *encoder)
rate_control->client_state.max_video_latency = 0;
rate_control->client_state.max_audio_latency = 0;
if (rate_control->warmup_start_time) {
- struct timespec time;
uint64_t now;
- clock_gettime(CLOCK_MONOTONIC, &time);
- now = ((uint64_t) time.tv_sec) * 1000000000 + time.tv_nsec;
- if (now - rate_control->warmup_start_time < MJPEG_WARMUP_TIME*1000*1000) {
+ now = spice_get_monotonic_time_ns();
+ if (now - rate_control->warmup_start_time < MJPEG_WARMUP_TIME) {
spice_debug("during warmup. ignoring");
return;
- } else {
- rate_control->warmup_start_time = 0;
}
+ rate_control->warmup_start_time = 0;
}
if (bit_rate_info->num_enc_frames > MJPEG_BIT_RATE_EVAL_MIN_NUM_FRAMES ||
@@ -950,11 +1034,11 @@ static void mjpeg_encoder_decrease_bit_rate(MJpegEncoder *encoder)
double duration_sec;
duration_sec = (bit_rate_info->last_frame_time - bit_rate_info->change_start_time);
- duration_sec /= (1000.0 * 1000.0 * 1000.0);
+ duration_sec /= NSEC_PER_SEC;
measured_byte_rate = bit_rate_info->sum_enc_size / duration_sec;
measured_fps = bit_rate_info->num_enc_frames / duration_sec;
decrease_size = bit_rate_info->sum_enc_size / bit_rate_info->num_enc_frames;
- spice_debug("bit rate esitimation %.2f (Mbps) fps %u",
+ spice_debug("bit rate estimation %.2f (Mbps) fps %u",
measured_byte_rate*8/1024.0/1024,
measured_fps);
} else {
@@ -992,7 +1076,7 @@ static void mjpeg_encoder_handle_negative_client_stream_report(MJpegEncoder *enc
{
MJpegEncoderRateControl *rate_control = &encoder->rate_control;
- spice_debug(NULL);
+ spice_debug("trace");
if ((rate_control->bit_rate_info.change_start_mm_time > report_end_frame_mm_time ||
!rate_control->bit_rate_info.change_start_mm_time) &&
@@ -1019,11 +1103,11 @@ static void mjpeg_encoder_increase_bit_rate(MJpegEncoder *encoder)
double duration_sec;
duration_sec = (bit_rate_info->last_frame_time - bit_rate_info->change_start_time);
- duration_sec /= (1000.0 * 1000.0 * 1000.0);
+ duration_sec /= NSEC_PER_SEC;
measured_byte_rate = bit_rate_info->sum_enc_size / duration_sec;
measured_fps = bit_rate_info->num_enc_frames / duration_sec;
avg_frame_size = bit_rate_info->sum_enc_size / bit_rate_info->num_enc_frames;
- spice_debug("bit rate esitimation %.2f (Mbps) defined %.2f"
+ spice_debug("bit rate estimation %.2f (Mbps) defined %.2f"
" fps %u avg-frame-size=%.2f (KB)",
measured_byte_rate*8/1024.0/1024,
rate_control->byte_rate*8/1024.0/1024,
@@ -1057,6 +1141,7 @@ static void mjpeg_encoder_increase_bit_rate(MJpegEncoder *encoder)
rate_control->quality_id,
rate_control->fps);
}
+
static void mjpeg_encoder_handle_positive_client_stream_report(MJpegEncoder *encoder,
uint32_t report_start_frame_mm_time)
{
@@ -1072,7 +1157,7 @@ static void mjpeg_encoder_handle_positive_client_stream_report(MJpegEncoder *enc
}
if ((rate_control->fps > MJPEG_IMPROVE_QUALITY_FPS_STRICT_TH ||
- rate_control->fps >= encoder->cbs.get_source_fps(encoder->cbs_opaque)) &&
+ rate_control->fps >= mjpeg_encoder_get_source_fps(encoder)) &&
rate_control->quality_id > MJPEG_QUALITY_SAMPLE_NUM / 2) {
timeout = MJPEG_CLIENT_POSITIVE_REPORT_STRICT_TIMEOUT;
} else {
@@ -1084,7 +1169,7 @@ static void mjpeg_encoder_handle_positive_client_stream_report(MJpegEncoder *enc
if (!bit_rate_info->change_start_mm_time || stable_client_mm_time < timeout) {
/* assessing the stability of the current setting and only then
* respond to the report */
- spice_debug("no drops, but not enough time has passed for assessing"
+ spice_debug("no drops, but not enough time has passed for assessing "
"the playback stability since the last bit rate change");
return;
}
@@ -1095,17 +1180,18 @@ static void mjpeg_encoder_handle_positive_client_stream_report(MJpegEncoder *enc
* the video playback jitter buffer should be at least (send_time*2 + net_latency) for
* preventing underflow
*/
-static uint32_t get_min_required_playback_delay(uint64_t frame_enc_size,
- uint64_t byte_rate,
- uint32_t latency)
+static uint32_t get_min_required_playback_delay(const MJpegEncoder *encoder,
+ uint64_t frame_enc_size)
{
+ uint64_t byte_rate = encoder->rate_control.byte_rate;
+ uint32_t latency = mjpeg_encoder_get_latency(encoder);
uint32_t one_frame_time;
uint32_t min_delay;
if (!frame_enc_size || !byte_rate) {
return latency;
}
- one_frame_time = (frame_enc_size*1000)/byte_rate;
+ one_frame_time = (frame_enc_size * MSEC_PER_SEC) / byte_rate;
min_delay = MIN(one_frame_time*2 + latency, MJPEG_MAX_CLIENT_PLAYBACK_DELAY);
return min_delay;
@@ -1115,14 +1201,15 @@ static uint32_t get_min_required_playback_delay(uint64_t frame_enc_size,
#define MJPEG_VIDEO_VS_AUDIO_LATENCY_FACTOR 1.25
#define MJPEG_VIDEO_DELAY_TH -15
-void mjpeg_encoder_client_stream_report(MJpegEncoder *encoder,
- uint32_t num_frames,
- uint32_t num_drops,
- uint32_t start_frame_mm_time,
- uint32_t end_frame_mm_time,
- int32_t end_frame_delay,
- uint32_t audio_delay)
+static void mjpeg_encoder_client_stream_report(VideoEncoder *video_encoder,
+ uint32_t num_frames,
+ uint32_t num_drops,
+ uint32_t start_frame_mm_time,
+ uint32_t end_frame_mm_time,
+ int32_t end_frame_delay,
+ uint32_t audio_delay)
{
+ MJpegEncoder *encoder = SPICE_CONTAINEROF(video_encoder, MJpegEncoder, base);
MJpegEncoderRateControl *rate_control = &encoder->rate_control;
MJpegEncoderClientState *client_state = &rate_control->client_state;
uint64_t avg_enc_size = 0;
@@ -1134,10 +1221,6 @@ void mjpeg_encoder_client_stream_report(MJpegEncoder *encoder,
end_frame_mm_time - start_frame_mm_time,
end_frame_delay, audio_delay);
- if (!encoder->rate_control_is_active) {
- spice_debug("rate control was not activated: ignoring");
- return;
- }
if (rate_control->during_quality_eval) {
if (rate_control->quality_eval_data.type == MJPEG_QUALITY_EVAL_TYPE_DOWNGRADE &&
rate_control->quality_eval_data.reason == MJPEG_QUALITY_EVAL_REASON_RATE_CHANGE) {
@@ -1151,12 +1234,11 @@ void mjpeg_encoder_client_stream_report(MJpegEncoder *encoder,
rate_control->num_recent_enc_frames;
}
spice_debug("recent size avg %.2f (KB)", avg_enc_size / 1024.0);
- min_playback_delay = get_min_required_playback_delay(avg_enc_size, rate_control->byte_rate,
- mjpeg_encoder_get_latency(encoder));
+ min_playback_delay = get_min_required_playback_delay(encoder, avg_enc_size);
spice_debug("min-delay %u client-delay %d", min_playback_delay, end_frame_delay);
if (min_playback_delay > end_frame_delay) {
- uint32_t src_fps = encoder->cbs.get_source_fps(encoder->cbs_opaque);
+ uint32_t src_fps = mjpeg_encoder_get_source_fps(encoder);
/*
* if the stream is at its highest rate, we can't estimate the "real"
* network bit rate and the min_playback_delay
@@ -1165,7 +1247,7 @@ void mjpeg_encoder_client_stream_report(MJpegEncoder *encoder,
rate_control->fps < MIN(src_fps, MJPEG_MAX_FPS) || end_frame_delay < 0) {
is_video_delay_small = TRUE;
if (encoder->cbs.update_client_playback_delay) {
- encoder->cbs.update_client_playback_delay(encoder->cbs_opaque,
+ encoder->cbs.update_client_playback_delay(encoder->cbs.opaque,
min_playback_delay);
}
}
@@ -1223,8 +1305,9 @@ void mjpeg_encoder_client_stream_report(MJpegEncoder *encoder,
}
}
-void mjpeg_encoder_notify_server_frame_drop(MJpegEncoder *encoder)
+static void mjpeg_encoder_notify_server_frame_drop(VideoEncoder *video_encoder)
{
+ MJpegEncoder *encoder = SPICE_CONTAINEROF(video_encoder, MJpegEncoder, base);
encoder->rate_control.server_state.num_frames_dropped++;
mjpeg_encoder_process_server_drops(encoder);
}
@@ -1240,7 +1323,7 @@ static void mjpeg_encoder_process_server_drops(MJpegEncoder *encoder)
double drop_factor;
uint32_t fps;
- fps = MIN(encoder->rate_control.fps, encoder->cbs.get_source_fps(encoder->cbs_opaque));
+ fps = MIN(encoder->rate_control.fps, mjpeg_encoder_get_source_fps(encoder));
if (server_state->num_frames_encoded < fps * MJPEG_SERVER_STATUS_EVAL_FPS_INTERVAL) {
return;
}
@@ -1252,7 +1335,7 @@ static void mjpeg_encoder_process_server_drops(MJpegEncoder *encoder)
server_state->num_frames_dropped,
num_frames_total,
encoder->rate_control.fps,
- encoder->cbs.get_source_fps(encoder->cbs_opaque));
+ mjpeg_encoder_get_source_fps(encoder));
if (drop_factor > MJPEG_SERVER_STATUS_DOWNGRADE_DROP_FACTOR_TH) {
mjpeg_encoder_decrease_bit_rate(encoder);
@@ -1261,15 +1344,53 @@ static void mjpeg_encoder_process_server_drops(MJpegEncoder *encoder)
server_state->num_frames_dropped = 0;
}
-uint64_t mjpeg_encoder_get_bit_rate(MJpegEncoder *encoder)
+static uint64_t mjpeg_encoder_get_bit_rate(VideoEncoder *video_encoder)
{
+ MJpegEncoder *encoder = SPICE_CONTAINEROF(video_encoder, MJpegEncoder, base);
return encoder->rate_control.byte_rate * 8;
}
-void mjpeg_encoder_get_stats(MJpegEncoder *encoder, MJpegEncoderStats *stats)
+static void mjpeg_encoder_get_stats(VideoEncoder *video_encoder,
+ VideoEncoderStats *stats)
{
+ MJpegEncoder *encoder = SPICE_CONTAINEROF(video_encoder, MJpegEncoder, base);
spice_assert(encoder != NULL && stats != NULL);
stats->starting_bit_rate = encoder->starting_bit_rate;
- stats->cur_bit_rate = mjpeg_encoder_get_bit_rate(encoder);
+ stats->cur_bit_rate = mjpeg_encoder_get_bit_rate(video_encoder);
stats->avg_quality = (double)encoder->avg_quality / encoder->num_frames;
}
+
+VideoEncoder *mjpeg_encoder_new(SpiceVideoCodecType codec_type,
+ uint64_t starting_bit_rate,
+ VideoEncoderRateControlCbs *cbs,
+ bitmap_ref_t bitmap_ref,
+ bitmap_unref_t bitmap_unref)
+{
+ MJpegEncoder *encoder;
+
+ spice_return_val_if_fail(codec_type == SPICE_VIDEO_CODEC_TYPE_MJPEG, NULL);
+
+ encoder = g_new0(MJpegEncoder, 1);
+ encoder->base.destroy = mjpeg_encoder_destroy;
+ encoder->base.encode_frame = mjpeg_encoder_encode_frame;
+ encoder->base.client_stream_report = mjpeg_encoder_client_stream_report;
+ encoder->base.notify_server_frame_drop = mjpeg_encoder_notify_server_frame_drop;
+ encoder->base.get_bit_rate = mjpeg_encoder_get_bit_rate;
+ encoder->base.get_stats = mjpeg_encoder_get_stats;
+ encoder->base.codec_type = codec_type;
+ encoder->first_frame = TRUE;
+ encoder->rate_control.byte_rate = starting_bit_rate / 8;
+ encoder->starting_bit_rate = starting_bit_rate;
+
+ encoder->cbs = *cbs;
+ mjpeg_encoder_reset_quality(encoder, MJPEG_QUALITY_SAMPLE_NUM / 2, 5, 0);
+ encoder->rate_control.during_quality_eval = TRUE;
+ encoder->rate_control.quality_eval_data.type = MJPEG_QUALITY_EVAL_TYPE_SET;
+ encoder->rate_control.quality_eval_data.reason = MJPEG_QUALITY_EVAL_REASON_RATE_CHANGE;
+ encoder->rate_control.warmup_start_time = spice_get_monotonic_time_ns();
+
+ encoder->cinfo.err = jpeg_std_error(&encoder->jerr);
+ jpeg_create_compress(&encoder->cinfo);
+
+ return (VideoEncoder*)encoder;
+}
diff --git a/server/mjpeg_encoder.h b/server/mjpeg_encoder.h
deleted file mode 100644
index 741ea1c9..00000000
--- a/server/mjpeg_encoder.h
+++ /dev/null
@@ -1,114 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_MJPEG_ENCODER
-#define _H_MJPEG_ENCODER
-
-#include "red_common.h"
-
-enum {
- MJPEG_ENCODER_FRAME_UNSUPPORTED = -1,
- MJPEG_ENCODER_FRAME_DROP,
- MJPEG_ENCODER_FRAME_ENCODE_START,
-};
-
-typedef struct MJpegEncoder MJpegEncoder;
-
-/*
- * Callbacks required for controling and adjusting
- * the stream bit rate:
- * get_roundtrip_ms: roundtrip time in milliseconds
- * get_source_fps: the input frame rate (#frames per second), i.e.,
- * the rate of frames arriving from the guest to spice-server,
- * before any drops.
- */
-typedef struct MJpegEncoderRateControlCbs {
- uint32_t (*get_roundtrip_ms)(void *opaque);
- uint32_t (*get_source_fps)(void *opaque);
- void (*update_client_playback_delay)(void *opaque, uint32_t delay_ms);
-} MJpegEncoderRateControlCbs;
-
-typedef struct MJpegEncoderStats {
- uint64_t starting_bit_rate;
- uint64_t cur_bit_rate;
- double avg_quality;
-} MJpegEncoderStats;
-
-MJpegEncoder *mjpeg_encoder_new(int bit_rate_control, uint64_t starting_bit_rate,
- MJpegEncoderRateControlCbs *cbs, void *opaque);
-void mjpeg_encoder_destroy(MJpegEncoder *encoder);
-
-uint8_t mjpeg_encoder_get_bytes_per_pixel(MJpegEncoder *encoder);
-
-/*
- * dest must be either NULL or allocated by malloc, since it might be freed
- * during the encoding, if its size is too small.
- *
- * return:
- * MJPEG_ENCODER_FRAME_UNSUPPORTED : frame cannot be encoded
- * MJPEG_ENCODER_FRAME_DROP : frame should be dropped. This value can only be returned
- * if mjpeg rate control is active.
- * MJPEG_ENCODER_FRAME_ENCODE_START: frame encoding started. Continue with
- * mjpeg_encoder_encode_scanline.
- */
-int mjpeg_encoder_start_frame(MJpegEncoder *encoder, SpiceBitmapFmt format,
- int width, int height,
- uint8_t **dest, size_t *dest_len,
- uint32_t frame_mm_time);
-int mjpeg_encoder_encode_scanline(MJpegEncoder *encoder, uint8_t *src_pixels,
- size_t image_width);
-size_t mjpeg_encoder_end_frame(MJpegEncoder *encoder);
-
-/*
- * bit rate control
- */
-
-/*
- * Data that should be periodically obtained from the client. The report contains:
- * num_frames : the number of frames that reached the client during the time
- * the report is referring to.
- * num_drops : the part of the above frames that was dropped by the client due to
- * late arrival time.
- * start_frame_mm_time: the mm_time of the first frame included in the report
- * end_frame_mm_time : the mm_time of the last_frame included in the report
- * end_frame_delay : (end_frame_mm_time - client_mm_time)
- * audio delay : the latency of the audio playback.
- * If there is no audio playback, set it to MAX_UINT.
- *
- */
-void mjpeg_encoder_client_stream_report(MJpegEncoder *encoder,
- uint32_t num_frames,
- uint32_t num_drops,
- uint32_t start_frame_mm_time,
- uint32_t end_frame_mm_time,
- int32_t end_frame_delay,
- uint32_t audio_delay);
-
-/*
- * Notify the encoder each time a frame is dropped due to pipe
- * congestion.
- * We can deduce the client state by the frame dropping rate in the server.
- * Monitoring the frame drops can help in fine tuning the playback parameters
- * when the client reports are delayed.
- */
-void mjpeg_encoder_notify_server_frame_drop(MJpegEncoder *encoder);
-
-uint64_t mjpeg_encoder_get_bit_rate(MJpegEncoder *encoder);
-void mjpeg_encoder_get_stats(MJpegEncoder *encoder, MJpegEncoderStats *stats);
-
-#endif
diff --git a/server/net-utils.c b/server/net-utils.c
new file mode 100644
index 00000000..7cad5342
--- /dev/null
+++ b/server/net-utils.c
@@ -0,0 +1,194 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009, 2017 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdbool.h>
+#include <string.h>
+#include <sys/types.h>
+#ifndef _WIN32
+#include <arpa/inet.h>
+#include <netinet/in.h>
+#include <netinet/ip.h>
+#include <netinet/tcp.h>
+#include <sys/socket.h>
+#endif
+
+#include <common/log.h>
+
+#include "net-utils.h"
+#include "sys-socket.h"
+
+#if !defined(TCP_KEEPIDLE) && defined(TCP_KEEPALIVE) && defined(__APPLE__)
+#define TCP_KEEPIDLE TCP_KEEPALIVE
+#endif
+
+#if defined(EOPNOTSUPP) && EOPNOTSUPP != ENOTSUP
+#define NOTSUP_ERROR(err) ((err) == ENOTSUP || (err) == EOPNOTSUPP)
+#else
+#define NOTSUP_ERROR(err) ((err) == ENOTSUP)
+#endif
+
+static inline bool
+darwin_einval_on_unix_socket(int fd, int err)
+{
+#if defined(__APPLE__) || defined(__FreeBSD__)
+ if (err == EINVAL) {
+ union {
+ struct sockaddr sa;
+ char buf[1024];
+ } addr;
+ socklen_t len = sizeof(addr);
+
+ if (getsockname(fd, &addr.sa, &len) == 0 && addr.sa.sa_family == AF_UNIX) {
+ return true;
+ }
+ }
+#endif
+ return false;
+}
+
+/**
+ * red_socket_set_keepalive:
+ * @fd: a socket file descriptor
+ * @keepalive: whether to enable keepalives on @fd
+ *
+ * Returns: #true if the operation succeeded, #false otherwise.
+ */
+bool red_socket_set_keepalive(int fd, bool enable, int timeout)
+{
+ int keepalive = !!enable;
+
+ if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &keepalive, sizeof(keepalive)) == -1) {
+ if (!NOTSUP_ERROR(errno) && !darwin_einval_on_unix_socket(fd, errno)) {
+ g_warning("setsockopt for keepalive failed, %s", strerror(errno));
+ return false;
+ }
+ }
+
+ if (!enable) {
+ return true;
+ }
+
+#ifdef TCP_KEEPIDLE
+ if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, &timeout, sizeof(timeout)) == -1) {
+ if (!NOTSUP_ERROR(errno) && !darwin_einval_on_unix_socket(fd, errno)) {
+ g_warning("setsockopt for keepalive timeout failed, %s", strerror(errno));
+ return false;
+ }
+ }
+#endif
+
+ return true;
+}
+
+/**
+ * red_socket_set_no_delay:
+ * @fd: a socket file descriptor
+ * @no_delay: whether to enable TCP_NODELAY on @fd
+ *
+ * Returns: #true if the operation succeeded, #false otherwise.
+ */
+bool red_socket_set_no_delay(int fd, bool no_delay)
+{
+ int optval = no_delay;
+
+ if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY,
+ &optval, sizeof(optval)) != 0) {
+ if (!NOTSUP_ERROR(errno) && errno != ENOPROTOOPT &&
+ !darwin_einval_on_unix_socket(fd, errno)) {
+ spice_warning("setsockopt failed, %s", strerror(errno));
+ return false;
+ }
+ }
+
+ return true;
+}
+
+/**
+ * red_socket_set_non_blocking:
+ * @fd: a socket file descriptor
+ * @non_blocking: whether to enable O_NONBLOCK on @fd
+ *
+ * Returns: #true if the operation succeeded, #false otherwise.
+ */
+bool red_socket_set_non_blocking(int fd, bool non_blocking)
+{
+#ifdef _WIN32
+ u_long ioctl_nonblocking = 1;
+
+ if (ioctlsocket(fd, FIONBIO, &ioctl_nonblocking) != 0) {
+ spice_warning("ioctlsocket(FIONBIO) failed, %d", WSAGetLastError());
+ return false;
+ }
+ return true;
+#else
+ int flags;
+
+ if ((flags = fcntl(fd, F_GETFL)) == -1) {
+ spice_warning("fnctl(F_GETFL) failed, %s", strerror(errno));
+ return false;
+ }
+
+ if (non_blocking) {
+ flags |= O_NONBLOCK;
+ } else {
+ flags &= ~O_NONBLOCK;
+ }
+
+ if (fcntl(fd, F_SETFL, flags) == -1) {
+ spice_warning("fnctl(F_SETFL) failed, %s", strerror(errno));
+ return false;
+ }
+
+ return true;
+#endif
+}
+
+/**
+ * red_socket_get_no_delay:
+ * @fd: a socket file descriptor
+ *
+ * Returns: The current value of TCP_NODELAY for @fd, -1 if an error occurred
+ */
+int red_socket_get_no_delay(int fd)
+{
+ int delay_val;
+ socklen_t opt_size = sizeof(delay_val);
+
+ if (getsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &delay_val,
+ &opt_size) == -1) {
+ spice_warning("getsockopt failed, %s", strerror(errno));
+ return -1;
+ }
+
+ return delay_val;
+}
+
+/**
+ * red_socket_set_nosigpipe
+ * @fd: a socket file descriptor
+ */
+void red_socket_set_nosigpipe(int fd, bool enable)
+{
+#if defined(SO_NOSIGPIPE) && defined(__APPLE__)
+ int val = !!enable;
+ setsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE, (const void *) &val, sizeof(val));
+#endif
+}
diff --git a/client/windows/atomic_count.h b/server/net-utils.h
index 7520fcae..62ff2f23 100644
--- a/client/windows/atomic_count.h
+++ b/server/net-utils.h
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2009 Red Hat, Inc.
+ Copyright (C) 2009-2017 Red Hat, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@@ -15,27 +15,20 @@
License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef _H_ATOMIC_COUNT
-#define _H_ATOMIC_COUNT
+#ifndef RED_NET_UTILS_H_
+#define RED_NET_UTILS_H_
-class AtomicCount {
-public:
- AtomicCount(uint32_t count = 0) : _count (count) {}
+#include <stdbool.h>
+#include <spice/macros.h>
- uint32_t operator ++ ()
- {
- return InterlockedIncrement(&_count);
- }
+SPICE_BEGIN_DECLS
- uint32_t operator -- ()
- {
- return InterlockedDecrement(&_count);
- }
+bool red_socket_set_keepalive(int fd, bool enable, int timeout);
+bool red_socket_set_no_delay(int fd, bool no_delay);
+int red_socket_get_no_delay(int fd);
+bool red_socket_set_non_blocking(int fd, bool non_blocking);
+void red_socket_set_nosigpipe(int fd, bool enable);
- operator uint32_t () { return _count;}
+SPICE_END_DECLS
-private:
- LONG _count;
-};
-
-#endif
+#endif /* RED_NET_UTILS_H_ */
diff --git a/server/pixmap-cache.cpp b/server/pixmap-cache.cpp
new file mode 100644
index 00000000..31423c19
--- /dev/null
+++ b/server/pixmap-cache.cpp
@@ -0,0 +1,144 @@
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+
+#include "pixmap-cache.h"
+
+int pixmap_cache_unlocked_set_lossy(PixmapCache *cache, uint64_t id, int lossy)
+{
+ NewCacheItem *item;
+
+ item = cache->hash_table[BITS_CACHE_HASH_KEY(id)];
+
+ while (item) {
+ if (item->id == id) {
+ item->lossy = lossy;
+ break;
+ }
+ item = item->next;
+ }
+ return !!item;
+}
+
+void pixmap_cache_clear(PixmapCache *cache)
+{
+ NewCacheItem *item;
+
+ if (cache->frozen) {
+ cache->lru.next = cache->frozen_head;
+ cache->lru.prev = cache->frozen_tail;
+ cache->frozen = FALSE;
+ }
+
+ SPICE_VERIFY(SPICE_OFFSETOF(NewCacheItem, lru_link) == 0);
+ while ((item = SPICE_CONTAINEROF(ring_get_head(&cache->lru), NewCacheItem, lru_link))) {
+ ring_remove(&item->lru_link);
+ g_free(item);
+ }
+ memset(cache->hash_table, 0, sizeof(*cache->hash_table) * BITS_CACHE_HASH_SIZE);
+
+ cache->available = cache->size;
+}
+
+bool pixmap_cache_freeze(PixmapCache *cache)
+{
+ pthread_mutex_lock(&cache->lock);
+
+ if (cache->frozen) {
+ pthread_mutex_unlock(&cache->lock);
+ return FALSE;
+ }
+
+ cache->frozen_head = cache->lru.next;
+ cache->frozen_tail = cache->lru.prev;
+ ring_init(&cache->lru);
+ memset(cache->hash_table, 0, sizeof(*cache->hash_table) * BITS_CACHE_HASH_SIZE);
+ cache->available = -1;
+ cache->frozen = TRUE;
+
+ pthread_mutex_unlock(&cache->lock);
+ return TRUE;
+}
+
+static void pixmap_cache_destroy(PixmapCache *cache)
+{
+ spice_assert(cache);
+
+ pthread_mutex_lock(&cache->lock);
+ pixmap_cache_clear(cache);
+ pthread_mutex_unlock(&cache->lock);
+}
+
+
+static pthread_mutex_t cache_lock = PTHREAD_MUTEX_INITIALIZER;
+static Ring pixmap_cache_list = {&pixmap_cache_list, &pixmap_cache_list};
+
+static PixmapCache *pixmap_cache_new(RedClient *client, uint8_t id, int64_t size)
+{
+ auto cache = g_new0(PixmapCache, 1);
+
+ ring_item_init(&cache->base);
+ pthread_mutex_init(&cache->lock, nullptr);
+ cache->id = id;
+ cache->refs = 1;
+ ring_init(&cache->lru);
+ cache->available = size;
+ cache->size = size;
+ cache->client = client;
+
+ return cache;
+}
+
+PixmapCache *pixmap_cache_get(RedClient *client, uint8_t id, int64_t size)
+{
+ PixmapCache *ret = nullptr;
+ RingItem *now;
+ pthread_mutex_lock(&cache_lock);
+
+ now = &pixmap_cache_list;
+ while ((now = ring_next(&pixmap_cache_list, now))) {
+ PixmapCache *cache = SPICE_UPCAST(PixmapCache, now);
+ if ((cache->client == client) && (cache->id == id)) {
+ ret = cache;
+ ret->refs++;
+ break;
+ }
+ }
+ if (!ret) {
+ ret = pixmap_cache_new(client, id, size);
+ ring_add(&pixmap_cache_list, &ret->base);
+ }
+ pthread_mutex_unlock(&cache_lock);
+ return ret;
+}
+
+
+void pixmap_cache_unref(PixmapCache *cache)
+{
+ if (!cache)
+ return;
+
+ pthread_mutex_lock(&cache_lock);
+ if (--cache->refs) {
+ pthread_mutex_unlock(&cache_lock);
+ return;
+ }
+ ring_remove(&cache->base);
+ pthread_mutex_unlock(&cache_lock);
+ pixmap_cache_destroy(cache);
+ g_free(cache);
+}
diff --git a/server/pixmap-cache.h b/server/pixmap-cache.h
new file mode 100644
index 00000000..577ca948
--- /dev/null
+++ b/server/pixmap-cache.h
@@ -0,0 +1,76 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef PIXMAP_CACHE_H_
+#define PIXMAP_CACHE_H_
+
+#include <common/ring.h>
+
+#include "red-channel.h"
+
+#include "push-visibility.h"
+
+#define MAX_CACHE_CLIENTS 4
+
+#define BITS_CACHE_HASH_SHIFT 10
+#define BITS_CACHE_HASH_SIZE (1 << BITS_CACHE_HASH_SHIFT)
+#define BITS_CACHE_HASH_MASK (BITS_CACHE_HASH_SIZE - 1)
+#define BITS_CACHE_HASH_KEY(id) ((id) & BITS_CACHE_HASH_MASK)
+
+struct NewCacheItem {
+ RingItem lru_link;
+ NewCacheItem *next;
+ uint64_t id;
+ uint64_t sync[MAX_CACHE_CLIENTS];
+ size_t size;
+ int lossy;
+};
+
+struct PixmapCache {
+ RingItem base;
+ pthread_mutex_t lock;
+ uint8_t id;
+ uint32_t refs;
+ NewCacheItem *hash_table[BITS_CACHE_HASH_SIZE];
+ Ring lru;
+ int64_t available;
+ int64_t size;
+
+ int frozen;
+ RingItem *frozen_head;
+ RingItem *frozen_tail;
+
+ uint32_t generation;
+ struct {
+ uint8_t client;
+ uint64_t message;
+ } generation_initiator;
+ uint64_t sync[MAX_CACHE_CLIENTS]; // here CLIENTS refer to different channel
+ // clients of the same client
+ RedClient *client;
+};
+
+PixmapCache *pixmap_cache_get(RedClient *client, uint8_t id, int64_t size);
+void pixmap_cache_unref(PixmapCache *cache);
+void pixmap_cache_clear(PixmapCache *cache);
+int pixmap_cache_unlocked_set_lossy(PixmapCache *cache, uint64_t id, int lossy);
+bool pixmap_cache_freeze(PixmapCache *cache);
+
+#include "pop-visibility.h"
+
+#endif /* PIXMAP_CACHE_H_ */
diff --git a/client/windows/pixels_source_p.h b/server/pop-visibility.h
index f06be0e1..7aceca1b 100644
--- a/client/windows/pixels_source_p.h
+++ b/server/pop-visibility.h
@@ -1,5 +1,6 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
/*
- Copyright (C) 2009 Red Hat, Inc.
+ Copyright (C) 2020 Red Hat, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@@ -14,15 +15,6 @@
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
-
-#ifndef _H_PIXELE_SOURSR_P
-#define _H_PIXELE_SOURSR_P
-
-class RecurciveMutex;
-
-struct PixelsSource_p {
- HDC dc;
- RecurciveMutex* _mutex;
-};
-
+#if defined(__GNUC__) && __GNUC__ >= 4 && !defined(__MINGW32__)
+#pragma GCC visibility pop
#endif
diff --git a/client/x11/res.h b/server/push-visibility.h
index 8320e9b6..01cd7012 100644
--- a/client/x11/res.h
+++ b/server/push-visibility.h
@@ -1,5 +1,6 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
/*
- Copyright (C) 2009 Red Hat, Inc.
+ Copyright (C) 2020 Red Hat, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@@ -14,11 +15,6 @@
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
-
-#ifndef _H_RES
-#define _H_RES
-
-const PixmapHeader *res_get_image(int id);
-const IconHeader *res_get_icon(int id);
-
+#if defined(__GNUC__) && __GNUC__ >= 4 && !defined(__MINGW32__)
+#pragma GCC visibility push(hidden)
#endif
diff --git a/server/red-channel-capabilities.c b/server/red-channel-capabilities.c
new file mode 100644
index 00000000..f4b7fad1
--- /dev/null
+++ b/server/red-channel-capabilities.c
@@ -0,0 +1,44 @@
+/*
+ Copyright (C) 2017 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+
+#include <string.h>
+#include <glib.h>
+#include <common/macros.h>
+
+#include "glib-compat.h"
+#include "red-channel-capabilities.h"
+
+void red_channel_capabilities_init(RedChannelCapabilities *dest,
+ const RedChannelCapabilities *caps)
+{
+ *dest = *caps;
+ if (caps->common_caps) {
+ dest->common_caps = (uint32_t*) g_memdup2(caps->common_caps,
+ caps->num_common_caps * sizeof(uint32_t));
+ }
+ if (caps->num_caps) {
+ dest->caps = (uint32_t*) g_memdup2(caps->caps, caps->num_caps * sizeof(uint32_t));
+ }
+}
+
+void red_channel_capabilities_reset(RedChannelCapabilities *caps)
+{
+ g_free(caps->common_caps);
+ g_free(caps->caps);
+ memset(caps, 0, sizeof(*caps));
+}
diff --git a/server/red-channel-capabilities.h b/server/red-channel-capabilities.h
new file mode 100644
index 00000000..f2fc1cea
--- /dev/null
+++ b/server/red-channel-capabilities.h
@@ -0,0 +1,47 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009-2017 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef RED_CHANNEL_CAPABILITIES_H_
+#define RED_CHANNEL_CAPABILITIES_H_
+
+#include <stdint.h>
+#include <spice/macros.h>
+
+SPICE_BEGIN_DECLS
+
+/* Holds channel capabilities.
+ * Channel capabilities are composed by a common part
+ * and a specific one. */
+typedef struct RedChannelCapabilities {
+ int num_common_caps;
+ uint32_t *common_caps;
+ int num_caps;
+ uint32_t *caps;
+} RedChannelCapabilities;
+
+/* Initialize the structure based on a previous one. */
+void red_channel_capabilities_init(RedChannelCapabilities *dest,
+ const RedChannelCapabilities *caps);
+
+/* Reset capabilities.
+ * All resources are freed by this function. */
+void red_channel_capabilities_reset(RedChannelCapabilities *caps);
+
+SPICE_END_DECLS
+
+#endif /* RED_CHANNEL_CAPABILITIES_H_ */
diff --git a/server/red-channel-client.cpp b/server/red-channel-client.cpp
new file mode 100644
index 00000000..b7567ffb
--- /dev/null
+++ b/server/red-channel-client.cpp
@@ -0,0 +1,1668 @@
+/*
+ Copyright (C) 2009-2016 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <config.h>
+
+#include <cerrno>
+#include <cstdint>
+#include <cstdio>
+
+#include <fcntl.h>
+#include <glib.h>
+#include <unistd.h>
+#ifndef _WIN32
+#include <netinet/in.h>
+#include <netinet/tcp.h>
+#include <sys/ioctl.h>
+#endif
+#ifdef HAVE_LINUX_SOCKIOS_H
+#include <linux/sockios.h> /* SIOCOUTQ */
+#endif
+#include <common/generated_server_marshallers.h>
+
+#include "red-channel-client.h"
+#include "red-client.h"
+
+#define CLIENT_ACK_WINDOW 20
+
+#define MAX_HEADER_SIZE sizeof(SpiceDataHeader)
+
+#ifndef IOV_MAX
+#define IOV_MAX 1024
+#endif
+
+struct SpiceDataHeaderOpaque;
+
+using get_msg_type_proc = uint16_t (*)(SpiceDataHeaderOpaque *header);
+using get_msg_size_proc = uint32_t (*)(SpiceDataHeaderOpaque *header);
+using set_msg_type_proc = void (*)(SpiceDataHeaderOpaque *header, uint16_t type);
+using set_msg_size_proc = void (*)(SpiceDataHeaderOpaque *header, uint32_t size);
+using set_msg_serial_proc = void (*)(SpiceDataHeaderOpaque *header, uint64_t serial);
+using set_msg_sub_list_proc = void (*)(SpiceDataHeaderOpaque *header, uint32_t sub_list);
+
+struct SpiceDataHeaderOpaque {
+ uint8_t *data;
+ uint16_t header_size;
+
+ set_msg_type_proc set_msg_type;
+ set_msg_size_proc set_msg_size;
+ set_msg_serial_proc set_msg_serial;
+ set_msg_sub_list_proc set_msg_sub_list;
+
+ get_msg_type_proc get_msg_type;
+ get_msg_size_proc get_msg_size;
+};
+
+enum QosPingState {
+ PING_STATE_NONE,
+ PING_STATE_TIMER,
+ PING_STATE_WARMUP,
+ PING_STATE_LATENCY,
+};
+
+struct RedChannelClientLatencyMonitor {
+ QosPingState state;
+ uint64_t last_pong_time;
+ SpiceTimer *timer;
+ uint32_t timeout;
+ uint32_t id;
+ bool tcp_nodelay;
+ bool warmup_was_sent;
+
+ int64_t roundtrip;
+};
+
+enum ConnectivityState {
+ CONNECTIVITY_STATE_CONNECTED,
+ CONNECTIVITY_STATE_BLOCKED,
+ CONNECTIVITY_STATE_WAIT_PONG,
+ CONNECTIVITY_STATE_DISCONNECTED,
+};
+
+struct RedChannelClientConnectivityMonitor {
+ ConnectivityState state;
+ bool sent_bytes;
+ bool received_bytes;
+ uint32_t timeout;
+ SpiceTimer *timer;
+};
+
+struct OutgoingMessageBuffer {
+ int pos;
+ int size;
+};
+
+struct IncomingMessageBuffer {
+ uint8_t header_buf[MAX_HEADER_SIZE];
+ SpiceDataHeaderOpaque header;
+ uint32_t header_pos;
+ uint8_t *msg; // data of the msg following the header. allocated by alloc_msg_buf.
+ uint32_t msg_pos;
+};
+
+struct RedChannelClientPrivate
+{
+ SPICE_CXX_GLIB_ALLOCATOR
+
+ RedChannelClientPrivate(RedChannel *channel,
+ RedClient *client,
+ RedStream *stream,
+ RedChannelCapabilities *caps,
+ bool monitor_latency);
+ ~RedChannelClientPrivate();
+
+ red::shared_ptr<RedChannel> channel;
+ RedClient *const client;
+ RedStream *const stream;
+ bool monitor_latency;
+
+ struct {
+ uint32_t generation;
+ uint32_t client_generation;
+ uint32_t messages_window;
+ uint32_t client_window;
+ } ack_data;
+
+ struct {
+ /* this can be either main.marshaller or urgent.marshaller */
+ SpiceMarshaller *marshaller;
+ SpiceDataHeaderOpaque header;
+ uint32_t size;
+ bool blocked;
+ uint64_t last_sent_serial;
+
+ struct {
+ SpiceMarshaller *marshaller;
+ uint8_t *header_data;
+ } main;
+
+ struct {
+ SpiceMarshaller *marshaller;
+ } urgent;
+ } send_data;
+
+ bool block_read;
+ bool during_send;
+ RedChannelClient::Pipe pipe;
+
+ RedChannelCapabilities remote_caps;
+ bool is_mini_header;
+
+ bool wait_migrate_data;
+ bool wait_migrate_flush_mark;
+
+ RedChannelClientLatencyMonitor latency_monitor;
+ RedChannelClientConnectivityMonitor connectivity_monitor;
+
+ IncomingMessageBuffer incoming;
+ OutgoingMessageBuffer outgoing;
+
+ RedStatCounter out_messages;
+ RedStatCounter out_bytes;
+
+ inline RedPipeItemPtr pipe_item_get();
+ inline void pipe_remove(RedPipeItem *item);
+ void handle_pong(SpiceMsgPing *ping);
+ inline void set_message_serial(uint64_t serial);
+ void pipe_clear();
+ void data_sent(int n);
+ void data_read(int n);
+ inline int get_out_msg_size();
+ inline int prepare_out_msg(struct iovec *vec, int vec_size, int pos);
+ inline void set_blocked();
+ void reset_send_data();
+ void seamless_migration_done();
+ void clear_sent_item();
+ void restart_ping_timer();
+ void start_ping_timer(uint32_t timeout);
+ void cancel_ping_timer();
+ inline int urgent_marshaller_is_active();
+ inline int waiting_for_ack();
+ inline void restore_main_sender();
+ void watch_update_mask(int event_mask);
+};
+
+static void full_header_set_msg_type(SpiceDataHeaderOpaque *header, uint16_t type);
+static void full_header_set_msg_size(SpiceDataHeaderOpaque *header, uint32_t size);
+static void full_header_set_msg_serial(SpiceDataHeaderOpaque *header, uint64_t serial);
+static void full_header_set_msg_sub_list(SpiceDataHeaderOpaque *header, uint32_t sub_list);
+static uint16_t full_header_get_msg_type(SpiceDataHeaderOpaque *header);
+static uint32_t full_header_get_msg_size(SpiceDataHeaderOpaque *header);
+
+static const SpiceDataHeaderOpaque full_header_wrapper = {nullptr, sizeof(SpiceDataHeader),
+ full_header_set_msg_type,
+ full_header_set_msg_size,
+ full_header_set_msg_serial,
+ full_header_set_msg_sub_list,
+ full_header_get_msg_type,
+ full_header_get_msg_size};
+
+static void mini_header_set_msg_type(SpiceDataHeaderOpaque *header, uint16_t type);
+static void mini_header_set_msg_size(SpiceDataHeaderOpaque *header, uint32_t size);
+static void mini_header_set_msg_serial(SpiceDataHeaderOpaque *header, uint64_t serial);
+static void mini_header_set_msg_sub_list(SpiceDataHeaderOpaque *header, uint32_t sub_list);
+static uint16_t mini_header_get_msg_type(SpiceDataHeaderOpaque *header);
+static uint32_t mini_header_get_msg_size(SpiceDataHeaderOpaque *header);
+
+static const SpiceDataHeaderOpaque mini_header_wrapper = {nullptr, sizeof(SpiceMiniDataHeader),
+ mini_header_set_msg_type,
+ mini_header_set_msg_size,
+ mini_header_set_msg_serial,
+ mini_header_set_msg_sub_list,
+ mini_header_get_msg_type,
+ mini_header_get_msg_size};
+
+/*
+ * When an error occurs over a channel, we treat it as a warning
+ * for spice-server and shutdown the channel.
+ */
+#define spice_channel_client_error(rcc, ...) \
+ do { \
+ red_channel_warning(rcc->priv->channel, __VA_ARGS__); \
+ rcc->shutdown(); \
+ } while (0)
+
+#define PING_TEST_TIMEOUT_MS (MSEC_PER_SEC * 15)
+#define PING_TEST_LONG_TIMEOUT_MS (MSEC_PER_SEC * 60 * 5)
+#define PING_TEST_IDLE_NET_TIMEOUT_MS (MSEC_PER_SEC / 10)
+
+struct RedEmptyMsgPipeItem: public RedPipeItemNum<RED_PIPE_ITEM_TYPE_EMPTY_MSG> {
+ int msg;
+};
+
+struct MarkerPipeItem: public RedPipeItemNum<RED_PIPE_ITEM_TYPE_MARKER> {
+ bool item_sent;
+};
+
+void RedChannelClientPrivate::start_ping_timer(uint32_t timeout)
+{
+ if (!latency_monitor.timer) {
+ return;
+ }
+ if (latency_monitor.state != PING_STATE_NONE) {
+ return;
+ }
+ latency_monitor.state = PING_STATE_TIMER;
+
+ red_timer_start(latency_monitor.timer, timeout);
+}
+
+void RedChannelClientPrivate::cancel_ping_timer()
+{
+ if (!latency_monitor.timer) {
+ return;
+ }
+ if (latency_monitor.state != PING_STATE_TIMER) {
+ return;
+ }
+
+ red_timer_cancel(latency_monitor.timer);
+ latency_monitor.state = PING_STATE_NONE;
+}
+
+void RedChannelClientPrivate::restart_ping_timer()
+{
+ uint64_t passed, timeout;
+
+ if (!latency_monitor.timer) {
+ return;
+ }
+ passed = (spice_get_monotonic_time_ns() - latency_monitor.last_pong_time) / NSEC_PER_MILLISEC;
+ timeout = PING_TEST_IDLE_NET_TIMEOUT_MS;
+ if (passed < latency_monitor.timeout) {
+ timeout += latency_monitor.timeout - passed;
+ }
+
+ start_ping_timer(timeout);
+}
+
+RedChannelClientPrivate::RedChannelClientPrivate(RedChannel *init_channel,
+ RedClient *init_client,
+ RedStream *init_stream,
+ RedChannelCapabilities *caps,
+ bool init_monitor_latency):
+ channel(init_channel),
+ client(init_client), stream(init_stream),
+ monitor_latency(init_monitor_latency)
+{
+ // blocks send message (maybe use send_data.blocked + block flags)
+ ack_data.messages_window = ~0;
+ ack_data.client_generation = ~0;
+ ack_data.client_window = CLIENT_ACK_WINDOW;
+ send_data.main.marshaller = spice_marshaller_new();
+ send_data.urgent.marshaller = spice_marshaller_new();
+
+ send_data.marshaller = send_data.main.marshaller;
+
+ red_channel_capabilities_reset(&remote_caps);
+ red_channel_capabilities_init(&remote_caps, caps);
+
+ outgoing.pos = 0;
+ outgoing.size = 0;
+
+ if (test_capability(remote_caps.common_caps, remote_caps.num_common_caps,
+ SPICE_COMMON_CAP_MINI_HEADER)) {
+ incoming.header = mini_header_wrapper;
+ send_data.header = mini_header_wrapper;
+ is_mini_header = TRUE;
+ } else {
+ incoming.header = full_header_wrapper;
+ send_data.header = full_header_wrapper;
+ is_mini_header = FALSE;
+ }
+ incoming.header.data = incoming.header_buf;
+
+ RedsState* reds = channel->get_server();
+ const RedStatNode *node = channel->get_stat_node();
+ stat_init_counter(&out_messages, reds, node, "out_messages", TRUE);
+ stat_init_counter(&out_bytes, reds, node, "out_bytes", TRUE);
+}
+
+RedChannelClientPrivate::~RedChannelClientPrivate()
+{
+ red_timer_remove(latency_monitor.timer);
+ latency_monitor.timer = nullptr;
+
+ red_timer_remove(connectivity_monitor.timer);
+ connectivity_monitor.timer = nullptr;
+
+ red_stream_free(stream);
+
+ if (send_data.main.marshaller) {
+ spice_marshaller_destroy(send_data.main.marshaller);
+ }
+
+ if (send_data.urgent.marshaller) {
+ spice_marshaller_destroy(send_data.urgent.marshaller);
+ }
+
+ red_channel_capabilities_reset(&remote_caps);
+}
+
+/* This even empty is better to by declared here to make sure
+ * we call the right delete for priv field
+ */
+RedChannelClient::~RedChannelClient() = default;
+
+RedChannelClient::RedChannelClient(RedChannel *channel,
+ RedClient *client,
+ RedStream *stream,
+ RedChannelCapabilities *caps,
+ bool monitor_latency):
+ priv(new RedChannelClientPrivate(channel, client, stream, caps, monitor_latency))
+{
+}
+
+RedChannel* RedChannelClient::get_channel()
+{
+ return priv->channel.get();
+}
+
+void RedChannelClientPrivate::data_sent(int n)
+{
+ if (connectivity_monitor.timer) {
+ connectivity_monitor.sent_bytes = true;
+ }
+ stat_inc_counter(out_bytes, n);
+}
+
+void RedChannelClientPrivate::data_read(int n)
+{
+ if (connectivity_monitor.timer) {
+ connectivity_monitor.received_bytes = true;
+ }
+}
+
+inline int RedChannelClientPrivate::get_out_msg_size()
+{
+ return send_data.size;
+}
+
+inline int RedChannelClientPrivate::prepare_out_msg(struct iovec *vec, int vec_size, int pos)
+{
+ return spice_marshaller_fill_iovec(send_data.marshaller,
+ vec, vec_size, pos);
+}
+
+inline void RedChannelClientPrivate::set_blocked()
+{
+ send_data.blocked = true;
+}
+
+inline int RedChannelClientPrivate::urgent_marshaller_is_active()
+{
+ return send_data.marshaller == send_data.urgent.marshaller;
+}
+
+void RedChannelClientPrivate::reset_send_data()
+{
+ spice_marshaller_reset(send_data.marshaller);
+ send_data.header.data = spice_marshaller_reserve_space(send_data.marshaller,
+ send_data.header.header_size);
+ spice_marshaller_set_base(send_data.marshaller, send_data.header.header_size);
+ send_data.header.set_msg_type(&send_data.header, 0);
+ send_data.header.set_msg_size(&send_data.header, 0);
+
+ if (!is_mini_header) {
+ spice_assert(send_data.marshaller != send_data.urgent.marshaller);
+ send_data.header.set_msg_sub_list(&send_data.header, 0);
+ }
+}
+
+void RedChannelClient::send_set_ack()
+{
+ SpiceMsgSetAck ack;
+
+ init_send_data(SPICE_MSG_SET_ACK);
+ ack.generation = ++priv->ack_data.generation;
+ ack.window = priv->ack_data.client_window;
+ priv->ack_data.messages_window = 0;
+
+ spice_marshall_msg_set_ack(priv->send_data.marshaller, &ack);
+
+ begin_send_message();
+}
+
+void RedChannelClient::send_migrate()
+{
+ SpiceMsgMigrate migrate;
+
+ init_send_data(SPICE_MSG_MIGRATE);
+ migrate.flags = priv->channel->migration_flags();
+ spice_marshall_msg_migrate(priv->send_data.marshaller, &migrate);
+ if (migrate.flags & SPICE_MIGRATE_NEED_FLUSH) {
+ priv->wait_migrate_flush_mark = TRUE;
+ }
+
+ begin_send_message();
+}
+
+void RedChannelClient::send_ping()
+{
+ SpiceMsgPing ping;
+
+ if (!priv->latency_monitor.warmup_was_sent) { // latency test start
+ int delay_val;
+
+ priv->latency_monitor.warmup_was_sent = true;
+ /*
+ * When testing latency, TCP_NODELAY must be switched on, otherwise,
+ * sending the ping message is delayed by Nagle algorithm, and the
+ * roundtrip measurement is less accurate (bigger).
+ */
+ priv->latency_monitor.tcp_nodelay = true;
+ delay_val = red_stream_get_no_delay(priv->stream);
+ if (delay_val != -1) {
+ priv->latency_monitor.tcp_nodelay = delay_val;
+ if (!delay_val) {
+ red_stream_set_no_delay(priv->stream, TRUE);
+ }
+ }
+ }
+
+ init_send_data(SPICE_MSG_PING);
+ ping.id = priv->latency_monitor.id;
+ ping.timestamp = spice_get_monotonic_time_ns();
+ spice_marshall_msg_ping(priv->send_data.marshaller, &ping);
+ begin_send_message();
+}
+
+void RedChannelClient::send_empty_msg(RedPipeItem *base)
+{
+ auto msg_pipe_item = static_cast<RedEmptyMsgPipeItem*>(base);
+
+ init_send_data(msg_pipe_item->msg);
+ begin_send_message();
+}
+
+void RedChannelClient::send_any_item(RedPipeItem *item)
+{
+ spice_assert(no_item_being_sent());
+ priv->reset_send_data();
+ switch (item->type) {
+ case RED_PIPE_ITEM_TYPE_SET_ACK:
+ send_set_ack();
+ break;
+ case RED_PIPE_ITEM_TYPE_MIGRATE:
+ send_migrate();
+ break;
+ case RED_PIPE_ITEM_TYPE_EMPTY_MSG:
+ send_empty_msg(item);
+ break;
+ case RED_PIPE_ITEM_TYPE_PING:
+ send_ping();
+ break;
+ case RED_PIPE_ITEM_TYPE_MARKER:
+ static_cast<MarkerPipeItem*>(item)->item_sent = true;
+ break;
+ default:
+ send_item(item);
+ break;
+ }
+}
+
+inline void RedChannelClientPrivate::restore_main_sender()
+{
+ send_data.marshaller = send_data.main.marshaller;
+ send_data.header.data = send_data.main.header_data;
+}
+
+void RedChannelClient::msg_sent()
+{
+#ifndef _WIN32
+ int fd;
+
+ if (spice_marshaller_get_fd(priv->send_data.marshaller, &fd)) {
+ if (red_stream_send_msgfd(priv->stream, fd) < 0) {
+ perror("sendfd");
+ disconnect();
+ if (fd != -1)
+ close(fd);
+ return;
+ }
+ if (fd != -1)
+ close(fd);
+ }
+#endif
+
+ priv->clear_sent_item();
+
+ if (priv->urgent_marshaller_is_active()) {
+ priv->restore_main_sender();
+ spice_assert(priv->send_data.header.data != nullptr);
+ begin_send_message();
+ } else {
+ if (priv->pipe.empty()) {
+ /* It is possible that the socket will become idle, so we may be able to test latency */
+ priv->restart_ping_timer();
+ }
+ }
+
+}
+
+static RedChannelClient::Pipe::iterator
+find_pipe_item(RedChannelClient::Pipe &pipe, const RedPipeItem *item)
+{
+ return std::find_if(pipe.begin(), pipe.end(),
+ [=](const RedPipeItemPtr& p) -> bool {
+ return p.get() == item;
+ });
+}
+
+static RedChannelClient::Pipe::const_iterator
+find_pipe_item(const RedChannelClient::Pipe &pipe, const RedPipeItem *item)
+{
+ return std::find_if(pipe.begin(), pipe.end(),
+ [=](const RedPipeItemPtr& p) -> bool {
+ return p.get() == item;
+ });
+}
+
+void RedChannelClientPrivate::pipe_remove(RedPipeItem *item)
+{
+ auto i = find_pipe_item(pipe, item);
+ if (i != pipe.end()) {
+ pipe.erase(i);
+ }
+}
+
+bool RedChannelClient::test_remote_common_cap(uint32_t cap) const
+{
+ return test_capability(priv->remote_caps.common_caps,
+ priv->remote_caps.num_common_caps,
+ cap);
+}
+
+bool RedChannelClient::test_remote_cap(uint32_t cap) const
+{
+ return test_capability(priv->remote_caps.caps,
+ priv->remote_caps.num_caps,
+ cap);
+}
+
+void RedChannelClient::push_ping()
+{
+ spice_assert(priv->latency_monitor.state == PING_STATE_NONE);
+ priv->latency_monitor.state = PING_STATE_WARMUP;
+ priv->latency_monitor.warmup_was_sent = false;
+ priv->latency_monitor.id = rand();
+ pipe_add_type(RED_PIPE_ITEM_TYPE_PING);
+ pipe_add_type(RED_PIPE_ITEM_TYPE_PING);
+}
+
+void RedChannelClient::ping_timer(RedChannelClient *rcc)
+{
+ red::shared_ptr<RedChannelClient> hold_rcc(rcc);
+ spice_assert(rcc->priv->latency_monitor.state == PING_STATE_TIMER);
+ rcc->priv->cancel_ping_timer();
+
+#ifdef HAVE_LINUX_SOCKIOS_H /* SIOCOUTQ is a Linux only ioctl on sockets. */
+ int so_unsent_size = 0;
+
+ /* retrieving the occupied size of the socket's tcp send buffer (unacked + unsent) */
+ if (ioctl(rcc->priv->stream->socket, SIOCOUTQ, &so_unsent_size) == -1) {
+ red_channel_warning(rcc->get_channel(),
+ "ioctl(SIOCOUTQ) failed, %s", strerror(errno));
+ }
+ if (so_unsent_size > 0) {
+ /* tcp send buffer is still occupied. rescheduling ping */
+ rcc->priv->start_ping_timer(PING_TEST_IDLE_NET_TIMEOUT_MS);
+ return;
+ }
+#endif /* ifdef HAVE_LINUX_SOCKIOS_H */
+ /* More portable alternative code path (less accurate but avoids bogus ioctls)*/
+ rcc->push_ping();
+}
+
+inline int RedChannelClientPrivate::waiting_for_ack()
+{
+ gboolean handle_acks = channel->handle_acks();
+
+ return (handle_acks && (ack_data.messages_window >
+ ack_data.client_window * 2));
+}
+
+/*
+ * When a connection is not alive (and we can't detect it via a socket error), we
+ * reach one of these 2 states:
+ * (1) Sending msgs is blocked: either writes return EAGAIN
+ * or we are missing MSGC_ACK from the client.
+ * (2) MSG_PING was sent without receiving a MSGC_PONG in reply.
+ *
+ * The connectivity_timer callback tests if the channel's state matches one of the above.
+ * In case it does, on the next time the timer is called, it checks if the connection has
+ * been idle during the time that passed since the previous timer call. If the connection
+ * has been idle, we consider the client as disconnected.
+ */
+void RedChannelClient::connectivity_timer(RedChannelClient *rcc)
+{
+ RedChannelClientConnectivityMonitor *monitor = &rcc->priv->connectivity_monitor;
+ int is_alive = TRUE;
+
+ red::shared_ptr<RedChannelClient> hold_rcc(rcc);
+
+ if (monitor->state == CONNECTIVITY_STATE_BLOCKED) {
+ if (!monitor->received_bytes && !monitor->sent_bytes) {
+ if (!rcc->is_blocked() && !rcc->priv->waiting_for_ack()) {
+ spice_error("mismatch between rcc-state and connectivity-state");
+ }
+ spice_debug("rcc is blocked; connection is idle");
+ is_alive = FALSE;
+ }
+ } else if (monitor->state == CONNECTIVITY_STATE_WAIT_PONG) {
+ if (!monitor->received_bytes) {
+ if (rcc->priv->latency_monitor.state != PING_STATE_WARMUP &&
+ rcc->priv->latency_monitor.state != PING_STATE_LATENCY) {
+ spice_error("mismatch between rcc-state and connectivity-state");
+ }
+ spice_debug("rcc waits for pong; connection is idle");
+ is_alive = FALSE;
+ }
+ }
+
+ if (is_alive) {
+ monitor->received_bytes = false;
+ monitor->sent_bytes = false;
+ if (rcc->is_blocked() || rcc->priv->waiting_for_ack()) {
+ monitor->state = CONNECTIVITY_STATE_BLOCKED;
+ } else if (rcc->priv->latency_monitor.state == PING_STATE_WARMUP ||
+ rcc->priv->latency_monitor.state == PING_STATE_LATENCY) {
+ monitor->state = CONNECTIVITY_STATE_WAIT_PONG;
+ } else {
+ monitor->state = CONNECTIVITY_STATE_CONNECTED;
+ }
+ red_timer_start(monitor->timer, monitor->timeout);
+ } else {
+ monitor->state = CONNECTIVITY_STATE_DISCONNECTED;
+ red_channel_warning(rcc->priv->channel.get(),
+ "rcc %p has been unresponsive for more than %u ms, disconnecting",
+ rcc, monitor->timeout);
+ rcc->disconnect();
+ }
+}
+
+void RedChannelClient::start_connectivity_monitoring(uint32_t timeout_ms)
+{
+ SpiceCoreInterfaceInternal *core = priv->channel->get_core_interface();
+ if (!is_connected()) {
+ return;
+ }
+ spice_debug("trace");
+ spice_assert(timeout_ms > 0);
+ /*
+ * If latency_monitor is not active, we activate it in order to enable
+ * periodic ping messages so that we will be be able to identify a disconnected
+ * channel-client even if there are no ongoing channel specific messages
+ * on this channel.
+ */
+ if (priv->latency_monitor.timer == nullptr) {
+ priv->latency_monitor.timer =
+ core->timer_new(ping_timer, this);
+ priv->latency_monitor.roundtrip = -1;
+ } else {
+ priv->cancel_ping_timer();
+ }
+ priv->latency_monitor.timeout = PING_TEST_TIMEOUT_MS;
+ if (!priv->client->during_migrate_at_target()) {
+ priv->start_ping_timer(PING_TEST_IDLE_NET_TIMEOUT_MS);
+ }
+ if (priv->connectivity_monitor.timer == nullptr) {
+ priv->connectivity_monitor.state = CONNECTIVITY_STATE_CONNECTED;
+ priv->connectivity_monitor.timer =
+ core->timer_new(connectivity_timer, this);
+ priv->connectivity_monitor.timeout = timeout_ms;
+ if (!priv->client->during_migrate_at_target()) {
+ red_timer_start(priv->connectivity_monitor.timer,
+ priv->connectivity_monitor.timeout);
+ }
+ }
+}
+
+static void red_channel_client_event(int fd, int event, RedChannelClient *rcc)
+{
+ red::shared_ptr<RedChannelClient> hold_rcc(rcc);
+ if (event & SPICE_WATCH_EVENT_READ) {
+ rcc->receive();
+ }
+ if (event & SPICE_WATCH_EVENT_WRITE) {
+ rcc->push();
+ }
+}
+
+static uint32_t full_header_get_msg_size(SpiceDataHeaderOpaque *header)
+{
+ return GUINT32_FROM_LE(((SpiceDataHeader *)header->data)->size);
+}
+
+static uint32_t mini_header_get_msg_size(SpiceDataHeaderOpaque *header)
+{
+ return GUINT32_FROM_LE(((SpiceMiniDataHeader *)header->data)->size);
+}
+
+static uint16_t full_header_get_msg_type(SpiceDataHeaderOpaque *header)
+{
+ return GUINT16_FROM_LE(((SpiceDataHeader *)header->data)->type);
+}
+
+static uint16_t mini_header_get_msg_type(SpiceDataHeaderOpaque *header)
+{
+ return GUINT16_FROM_LE(((SpiceMiniDataHeader *)header->data)->type);
+}
+
+static void full_header_set_msg_type(SpiceDataHeaderOpaque *header, uint16_t type)
+{
+ reinterpret_cast<SpiceDataHeader *>(header->data)->type = GUINT16_TO_LE(type);
+}
+
+static void mini_header_set_msg_type(SpiceDataHeaderOpaque *header, uint16_t type)
+{
+ reinterpret_cast<SpiceMiniDataHeader *>(header->data)->type = GUINT16_TO_LE(type);
+}
+
+static void full_header_set_msg_size(SpiceDataHeaderOpaque *header, uint32_t size)
+{
+ reinterpret_cast<SpiceDataHeader *>(header->data)->size = GUINT32_TO_LE(size);
+}
+
+static void mini_header_set_msg_size(SpiceDataHeaderOpaque *header, uint32_t size)
+{
+ reinterpret_cast<SpiceMiniDataHeader *>(header->data)->size = GUINT32_TO_LE(size);
+}
+
+static void full_header_set_msg_serial(SpiceDataHeaderOpaque *header, uint64_t serial)
+{
+ reinterpret_cast<SpiceDataHeader *>(header->data)->serial = GUINT64_TO_LE(serial);
+}
+
+static void mini_header_set_msg_serial(SpiceDataHeaderOpaque *header, uint64_t serial)
+{
+ /* ignore serial, not supported by mini header */
+}
+
+static void full_header_set_msg_sub_list(SpiceDataHeaderOpaque *header, uint32_t sub_list)
+{
+ (reinterpret_cast<SpiceDataHeader *>(header->data))->sub_list = GUINT32_TO_LE(sub_list);
+}
+
+static void mini_header_set_msg_sub_list(SpiceDataHeaderOpaque *header, uint32_t sub_list)
+{
+ spice_error("attempt to set header sub list on mini header");
+}
+
+bool RedChannelClient::init()
+{
+ char *local_error = nullptr;
+ SpiceCoreInterfaceInternal *core;
+
+ if (!priv->stream) {
+ local_error =
+ g_strdup_printf("Socket not available");
+ goto cleanup;
+ }
+
+ if (!config_socket()) {
+ local_error =
+ g_strdup_printf("Unable to configure socket");
+ goto cleanup;
+ }
+
+ core = priv->channel->get_core_interface();
+ red_stream_set_core_interface(priv->stream, core);
+ priv->stream->watch =
+ core->watch_new(priv->stream->socket,
+ SPICE_WATCH_EVENT_READ,
+ red_channel_client_event,
+ this);
+
+ if (red_stream_get_family(priv->stream) != AF_UNIX) {
+ priv->latency_monitor.timer =
+ core->timer_new(ping_timer, this);
+
+ if (!priv->client->during_migrate_at_target()) {
+ priv->start_ping_timer(PING_TEST_IDLE_NET_TIMEOUT_MS);
+ }
+ priv->latency_monitor.roundtrip = -1;
+ priv->latency_monitor.timeout =
+ priv->monitor_latency ? PING_TEST_TIMEOUT_MS : PING_TEST_LONG_TIMEOUT_MS;
+ }
+
+ priv->channel->add_client(this);
+ if (!priv->client->add_channel(this, &local_error)) {
+ priv->channel->remove_client(this);
+ }
+
+cleanup:
+ if (local_error) {
+ red_channel_warning(get_channel(),
+ "Failed to create channel client: %s",
+ local_error);
+ g_free(local_error);
+ }
+ return local_error == nullptr;
+}
+
+void RedChannelClientPrivate::watch_update_mask(int event_mask)
+{
+ if (!stream->watch) {
+ return;
+ }
+
+ if (block_read) {
+ event_mask &= ~SPICE_WATCH_EVENT_READ;
+ }
+
+ red_watch_update_mask(stream->watch, event_mask);
+}
+
+void RedChannelClient::block_read()
+{
+ if (priv->block_read) {
+ return;
+ }
+ priv->block_read = true;
+ priv->watch_update_mask(SPICE_WATCH_EVENT_WRITE);
+}
+
+void RedChannelClient::unblock_read()
+{
+ if (!priv->block_read) {
+ return;
+ }
+ priv->block_read = false;
+ priv->watch_update_mask(SPICE_WATCH_EVENT_READ|SPICE_WATCH_EVENT_WRITE);
+}
+
+void RedChannelClientPrivate::seamless_migration_done()
+{
+ wait_migrate_data = FALSE;
+
+ if (client->seamless_migration_done_for_channel()) {
+ start_ping_timer(PING_TEST_IDLE_NET_TIMEOUT_MS);
+ if (connectivity_monitor.timer) {
+ red_timer_start(connectivity_monitor.timer,
+ connectivity_monitor.timeout);
+ }
+ }
+}
+
+void RedChannelClient::semi_seamless_migration_complete()
+{
+ priv->start_ping_timer(PING_TEST_IDLE_NET_TIMEOUT_MS);
+}
+
+bool RedChannelClient::is_waiting_for_migrate_data() const
+{
+ return priv->wait_migrate_data;
+}
+
+void RedChannelClient::migrate()
+{
+ priv->cancel_ping_timer();
+ red_timer_remove(priv->latency_monitor.timer);
+ priv->latency_monitor.timer = nullptr;
+
+ red_timer_remove(priv->connectivity_monitor.timer);
+ priv->connectivity_monitor.timer = nullptr;
+
+ pipe_add_type(RED_PIPE_ITEM_TYPE_MIGRATE);
+}
+
+void RedChannelClient::shutdown()
+{
+ if (priv->stream && priv->stream->watch) {
+ red_watch_remove(priv->stream->watch);
+ priv->stream->watch = nullptr;
+ ::shutdown(priv->stream->socket, SHUT_RDWR);
+ }
+}
+
+void RedChannelClient::handle_outgoing()
+{
+ RedStream *stream = priv->stream;
+ OutgoingMessageBuffer *buffer = &priv->outgoing;
+ ssize_t n;
+
+ if (!stream) {
+ return;
+ }
+
+ if (buffer->size == 0) {
+ buffer->size = priv->get_out_msg_size();
+ if (!buffer->size) { // nothing to be sent
+ return;
+ }
+ }
+
+ for (;;) {
+ struct iovec vec[IOV_MAX];
+ int vec_size =
+ priv->prepare_out_msg(vec, G_N_ELEMENTS(vec), buffer->pos);
+ n = red_stream_writev(stream, vec, vec_size);
+ if (n == -1) {
+ switch (errno) {
+ case EAGAIN:
+ priv->set_blocked();
+ break;
+ case EINTR:
+ continue;
+ case EPIPE:
+ disconnect();
+ break;
+ default:
+ red_channel_warning(get_channel(), "%s", strerror(errno));
+ disconnect();
+ break;
+ }
+ return;
+ }
+ buffer->pos += n;
+ priv->data_sent(n);
+ if (buffer->pos == buffer->size) { // finished writing data
+ /* reset buffer before calling on_msg_done, since it
+ * can trigger another call to RedChannelClient::handle_outgoing (when
+ * switching from the urgent marshaller to the main one */
+ buffer->pos = 0;
+ buffer->size = 0;
+ msg_sent();
+ return;
+ }
+ }
+}
+
+/* return the number of bytes read. -1 in case of error */
+static int red_peer_receive(RedStream *stream, uint8_t *buf, uint32_t size)
+{
+ uint8_t *pos = buf;
+ while (size) {
+ int now;
+ /* if we don't have a watch it means socket has been shutdown
+ * shutdown read doesn't work as accepted - receive may return data afterward.
+ * check the flag before calling receive
+ */
+ if (!stream->watch) {
+ return -1;
+ }
+ now = red_stream_read(stream, pos, size);
+ if (now <= 0) {
+ if (now == 0) {
+ return -1;
+ }
+ spice_assert(now == -1);
+ if (errno == EAGAIN) {
+ break;
+ }
+ if (errno == EINTR) {
+ continue;
+ }
+ if (errno != EPIPE) {
+ g_warning("%s", strerror(errno));
+ }
+ return -1;
+ }
+ size -= now;
+ pos += now;
+ }
+ return pos - buf;
+}
+
+// TODO: this implementation, as opposed to the old implementation in red_worker,
+// does many calls to red_peer_receive and through it cb_read, and thus avoids pointer
+// arithmetic for the case where a single cb_read could return multiple messages. But
+// this is suboptimal potentially. Profile and consider fixing.
+void RedChannelClient::handle_incoming()
+{
+ RedStream *stream = priv->stream;
+ IncomingMessageBuffer *buffer = &priv->incoming;
+ int bytes_read;
+ uint16_t msg_type;
+ uint32_t msg_size;
+
+ /* XXX: This needs further investigation as to the underlying cause, it happened
+ * after spicec disconnect (but not with spice-gtk) repeatedly. */
+ if (!stream) {
+ return;
+ }
+
+ for (;;) {
+ int ret_handle;
+ uint8_t *parsed;
+ size_t parsed_size;
+ message_destructor_t parsed_free = nullptr;
+ RedChannel *channel = get_channel();
+
+ if (buffer->header_pos < buffer->header.header_size) {
+ bytes_read = red_peer_receive(stream,
+ buffer->header.data + buffer->header_pos,
+ buffer->header.header_size - buffer->header_pos);
+ if (bytes_read == -1) {
+ disconnect();
+ return;
+ }
+ priv->data_read(bytes_read);
+ buffer->header_pos += bytes_read;
+
+ if (buffer->header_pos != buffer->header.header_size) {
+ return;
+ }
+ }
+
+ msg_size = buffer->header.get_msg_size(&buffer->header);
+ msg_type = buffer->header.get_msg_type(&buffer->header);
+ if (buffer->msg_pos < msg_size) {
+ if (!buffer->msg) {
+ buffer->msg = alloc_recv_buf(msg_type, msg_size);
+ if (buffer->msg == nullptr && priv->block_read) {
+ // if we are blocked by flow control just return, message will be read
+ // when data will be available
+ return;
+ }
+ if (buffer->msg == nullptr) {
+ red_channel_warning(channel, "ERROR: channel refused to allocate buffer.");
+ disconnect();
+ return;
+ }
+ }
+
+ bytes_read = red_peer_receive(stream,
+ buffer->msg + buffer->msg_pos,
+ msg_size - buffer->msg_pos);
+ if (bytes_read == -1) {
+ release_recv_buf(msg_type, msg_size, buffer->msg);
+ buffer->msg = nullptr;
+ disconnect();
+ return;
+ }
+ priv->data_read(bytes_read);
+ buffer->msg_pos += bytes_read;
+ if (buffer->msg_pos != msg_size) {
+ return;
+ }
+ }
+
+ parsed = get_channel()->parse(buffer->msg, msg_size,
+ msg_type, &parsed_size, &parsed_free);
+ if (parsed == nullptr) {
+ red_channel_warning(channel, "failed to parse message type %d", msg_type);
+ release_recv_buf(msg_type, msg_size, buffer->msg);
+ buffer->msg = nullptr;
+ disconnect();
+ return;
+ }
+ ret_handle = handle_message(msg_type, parsed_size, parsed);
+ if (parsed_free != nullptr) {
+ parsed_free(parsed);
+ }
+ buffer->msg_pos = 0;
+ release_recv_buf(msg_type, msg_size, buffer->msg);
+ buffer->msg = nullptr;
+ buffer->header_pos = 0;
+
+ if (!ret_handle) {
+ disconnect();
+ return;
+ }
+ }
+}
+
+void RedChannelClient::receive()
+{
+ red::shared_ptr<RedChannelClient> hold_rcc(this);
+ handle_incoming();
+}
+
+void RedChannelClient::send()
+{
+ red::shared_ptr<RedChannelClient> hold_rcc(this);
+ handle_outgoing();
+}
+
+inline RedPipeItemPtr RedChannelClientPrivate::pipe_item_get()
+{
+ RedPipeItemPtr ret;
+
+ if (send_data.blocked || waiting_for_ack() || pipe.empty()) {
+ return ret;
+ }
+ ret = std::move(pipe.back());
+ pipe.pop_back();
+ return ret;
+}
+
+void RedChannelClient::push()
+{
+ if (priv->during_send) {
+ return;
+ }
+
+ priv->during_send = TRUE;
+ red::shared_ptr<RedChannelClient> hold_rcc(this);
+ if (is_blocked()) {
+ send();
+ }
+
+ if (!no_item_being_sent() && !is_blocked()) {
+ priv->set_blocked();
+ red_channel_warning(get_channel(),
+ "ERROR: an item waiting to be sent and not blocked");
+ }
+
+ while (auto pipe_item = priv->pipe_item_get()) {
+ send_any_item(pipe_item.get());
+ }
+ /* prepare_pipe_add() will reenable WRITE events when the priv->pipe is empty
+ * ack_zero_messages_window() will reenable WRITE events
+ * if we were waiting for acks to be received
+ * If we don't remove WRITE if we are waiting for ack we will be keep
+ * notified that we can write and we then exit (see pipe_item_get) as we
+ * are waiting for the ack consuming CPU in a tight loop
+ */
+ if ((no_item_being_sent() && priv->pipe.empty()) ||
+ priv->waiting_for_ack()) {
+ priv->watch_update_mask(SPICE_WATCH_EVENT_READ);
+
+ /* channel has no pending data to send so now we can flush data in
+ * order to avoid data stall into buffers in case of manual
+ * flushing
+ * We need to flush also in case of ack as it is possible
+ * that for a long train of small messages the message that would
+ * cause the client to send the ack is still in the queue
+ */
+ red_stream_flush(priv->stream);
+ }
+ priv->during_send = FALSE;
+}
+
+int RedChannelClient::get_roundtrip_ms() const
+{
+ if (priv->latency_monitor.roundtrip < 0) {
+ return priv->latency_monitor.roundtrip;
+ }
+ return priv->latency_monitor.roundtrip / NSEC_PER_MILLISEC;
+}
+
+void RedChannelClient::init_outgoing_messages_window()
+{
+ priv->ack_data.messages_window = 0;
+ push();
+}
+
+void RedChannelClientPrivate::handle_pong(SpiceMsgPing *ping)
+{
+ uint64_t now;
+
+ /* ignoring unexpected pongs, or post-migration pongs for pings that
+ * started just before migration */
+ if (ping->id != latency_monitor.id) {
+ spice_warning("ping-id (%u)!= pong-id %u",
+ latency_monitor.id, ping->id);
+ return;
+ }
+
+ now = spice_get_monotonic_time_ns();
+
+ if (latency_monitor.state == PING_STATE_WARMUP) {
+ latency_monitor.state = PING_STATE_LATENCY;
+ return;
+ }
+ if (latency_monitor.state != PING_STATE_LATENCY) {
+ spice_warning("unexpected");
+ return;
+ }
+
+ /* set TCP_NODELAY=0, in case we reverted it for the test*/
+ if (!latency_monitor.tcp_nodelay) {
+ red_stream_set_no_delay(stream, FALSE);
+ }
+
+ /*
+ * The real network latency shouldn't change during the connection. However,
+ * the measurements can be bigger than the real roundtrip due to other
+ * threads or processes that are utilizing the network. We update the roundtrip
+ * measurement with the minimal value we encountered till now.
+ */
+ if (latency_monitor.roundtrip < 0 ||
+ now - ping->timestamp < latency_monitor.roundtrip) {
+ latency_monitor.roundtrip = now - ping->timestamp;
+ spice_debug("update roundtrip %.2f(ms)", ((double)latency_monitor.roundtrip)/NSEC_PER_MILLISEC);
+ }
+
+ latency_monitor.last_pong_time = now;
+ latency_monitor.state = PING_STATE_NONE;
+ start_ping_timer(latency_monitor.timeout);
+}
+
+void RedChannelClient::handle_migrate_flush_mark()
+{
+}
+
+// TODO: the whole migration is broken with multiple clients. What do we want to do?
+// basically just
+// 1) source send mark to all
+// 2) source gets at various times the data (waits for all)
+// 3) source migrates to target
+// 4) target sends data to all
+// So need to make all the handlers work with per channel/client data (what data exactly?)
+void RedChannelClient::handle_migrate_data_early(uint32_t size, void *message)
+{
+ red_channel_debug(priv->channel, "rcc %p size %u", this, size);
+
+ uint32_t flags = priv->channel->migration_flags();
+ if (!(flags & SPICE_MIGRATE_NEED_DATA_TRANSFER)) {
+ return;
+ }
+ if (!is_waiting_for_migrate_data()) {
+ spice_channel_client_error(this, "unexpected");
+ return;
+ }
+ uint64_t serial;
+ if (handle_migrate_data_get_serial(size, message, serial)) {
+ priv->set_message_serial(serial);
+ }
+ if (!handle_migrate_data(size, message)) {
+ spice_channel_client_error(this, "handle_migrate_data failed");
+ return;
+ }
+ priv->seamless_migration_done();
+}
+
+bool RedChannelClient::handle_message(uint16_t type, uint32_t size, void *message)
+{
+ switch (type) {
+ case SPICE_MSGC_ACK_SYNC:
+ priv->ack_data.client_generation = static_cast<SpiceMsgcAckSync *>(message)->generation;
+ break;
+ case SPICE_MSGC_ACK:
+ if (priv->ack_data.client_generation == priv->ack_data.generation) {
+ priv->ack_data.messages_window -= priv->ack_data.client_window;
+ priv->watch_update_mask(SPICE_WATCH_EVENT_READ|SPICE_WATCH_EVENT_WRITE);
+ push();
+ }
+ break;
+ case SPICE_MSGC_DISCONNECTING:
+ break;
+ case SPICE_MSGC_MIGRATE_FLUSH_MARK:
+ if (!priv->wait_migrate_flush_mark) {
+ spice_error("unexpected flush mark");
+ return FALSE;
+ }
+ handle_migrate_flush_mark();
+ priv->wait_migrate_flush_mark = FALSE;
+ break;
+ case SPICE_MSGC_MIGRATE_DATA:
+ handle_migrate_data_early(size, message);
+ break;
+ case SPICE_MSGC_PONG:
+ priv->handle_pong(static_cast<SpiceMsgPing *>(message));
+ break;
+ default:
+ red_channel_warning(get_channel(), "invalid message type %u",
+ type);
+ return FALSE;
+ }
+ return TRUE;
+}
+
+void RedChannelClient::init_send_data(uint16_t msg_type)
+{
+ spice_assert(no_item_being_sent());
+ spice_assert(msg_type != 0);
+ priv->send_data.header.set_msg_type(&priv->send_data.header, msg_type);
+}
+
+void RedChannelClient::begin_send_message()
+{
+ SpiceMarshaller *m = priv->send_data.marshaller;
+
+ // TODO - better check: type in channel_allowed_types. Better: type in channel_allowed_types(channel_state)
+ if (priv->send_data.header.get_msg_type(&priv->send_data.header) == 0) {
+ red_channel_warning(get_channel(), "BUG: header->type == 0");
+ return;
+ }
+
+ stat_inc_counter(priv->out_messages, 1);
+
+ /* canceling the latency test timer till the nework is idle */
+ priv->cancel_ping_timer();
+
+ spice_marshaller_flush(m);
+ priv->send_data.size = spice_marshaller_get_total_size(m);
+ priv->send_data.header.set_msg_size(&priv->send_data.header,
+ priv->send_data.size -
+ priv->send_data.header.header_size);
+ priv->send_data.header.set_msg_serial(&priv->send_data.header,
+ ++priv->send_data.last_sent_serial);
+ priv->ack_data.messages_window++;
+ priv->send_data.header.data = nullptr; /* avoid writing to this until we have a new message */
+ send();
+}
+
+SpiceMarshaller *RedChannelClient::switch_to_urgent_sender()
+{
+ spice_assert(no_item_being_sent());
+ spice_assert(priv->send_data.header.data != nullptr);
+ priv->send_data.main.header_data = priv->send_data.header.data;
+
+ priv->send_data.marshaller = priv->send_data.urgent.marshaller;
+ priv->reset_send_data();
+ return priv->send_data.marshaller;
+}
+
+uint64_t RedChannelClient::get_message_serial() const
+{
+ return priv->send_data.last_sent_serial + 1;
+}
+
+inline void RedChannelClientPrivate::set_message_serial(uint64_t serial)
+{
+ send_data.last_sent_serial = serial - 1;
+}
+
+inline bool RedChannelClient::prepare_pipe_add(RedPipeItem *item)
+{
+ spice_assert(item);
+ if (SPICE_UNLIKELY(!is_connected())) {
+ spice_debug("rcc is disconnected %p", this);
+ return false;
+ }
+ if (priv->pipe.empty()) {
+ priv->watch_update_mask(SPICE_WATCH_EVENT_READ | SPICE_WATCH_EVENT_WRITE);
+ }
+ return true;
+}
+
+void RedChannelClient::pipe_add(RedPipeItemPtr&& item)
+{
+ if (!prepare_pipe_add(item.get())) {
+ return;
+ }
+ priv->pipe.push_front(std::move(item));
+}
+
+void RedChannelClient::pipe_add_push(RedPipeItemPtr&& item)
+{
+ pipe_add(std::move(item));
+ push();
+}
+
+void RedChannelClient::pipe_add_after_pos(RedPipeItemPtr&& item,
+ Pipe::iterator pipe_item_pos)
+{
+ spice_assert(pipe_item_pos != priv->pipe.end());
+ if (!prepare_pipe_add(item.get())) {
+ return;
+ }
+
+ ++pipe_item_pos;
+ priv->pipe.insert(pipe_item_pos, std::move(item));
+}
+
+void
+RedChannelClient::pipe_add_before_pos(RedPipeItemPtr&& item, Pipe::iterator pipe_item_pos)
+{
+ spice_assert(pipe_item_pos != priv->pipe.end());
+ if (!prepare_pipe_add(item.get())) {
+ return;
+ }
+
+ priv->pipe.insert(pipe_item_pos, std::move(item));
+}
+
+void RedChannelClient::pipe_add_after(RedPipeItemPtr&& item, RedPipeItem *pos)
+{
+ spice_assert(pos);
+ auto prev = find_pipe_item(priv->pipe, pos);
+ g_return_if_fail(prev != priv->pipe.end());
+
+ pipe_add_after_pos(std::move(item), prev);
+}
+
+bool RedChannelClient::pipe_item_is_linked(RedPipeItem *item) const
+{
+ return find_pipe_item(priv->pipe, item) != priv->pipe.end();
+}
+
+void RedChannelClient::pipe_add_tail(RedPipeItemPtr&& item)
+{
+ if (!prepare_pipe_add(item.get())) {
+ return;
+ }
+ priv->pipe.push_back(std::move(item));
+}
+
+void RedChannelClient::pipe_add_type(int pipe_item_type)
+{
+ auto item = red::make_shared<RedPipeItem>(pipe_item_type);
+
+ pipe_add(std::move(item));
+}
+
+RedPipeItemPtr RedChannelClient::new_empty_msg(int msg_type)
+{
+ auto item = red::make_shared<RedEmptyMsgPipeItem>();
+
+ item->msg = msg_type;
+ return item;
+}
+
+void RedChannelClient::pipe_add_empty_msg(int msg_type)
+{
+ pipe_add(new_empty_msg(msg_type));
+}
+
+bool RedChannelClient::pipe_is_empty() const
+{
+ return priv->pipe.empty();
+}
+
+uint32_t RedChannelClient::get_pipe_size() const
+{
+ return priv->pipe.size();
+}
+
+RedChannelClient::Pipe& RedChannelClient::get_pipe()
+{
+ return priv->pipe;
+}
+
+bool RedChannelClient::is_mini_header() const
+{
+ return priv->is_mini_header;
+}
+
+bool RedChannelClient::is_connected() const
+{
+ return g_list_find(priv->channel->get_clients(), this) != nullptr;
+}
+
+void RedChannelClientPrivate::clear_sent_item()
+{
+ send_data.blocked = FALSE;
+ send_data.size = 0;
+ spice_marshaller_reset(send_data.marshaller);
+}
+
+// TODO: again - what is the context exactly? this happens in channel disconnect. but our
+// current red_channel_shutdown also closes the socket - is there a socket to close?
+// are we reading from an fd here? arghh
+void RedChannelClientPrivate::pipe_clear()
+{
+ clear_sent_item();
+ pipe.clear();
+}
+
+void RedChannelClient::ack_zero_messages_window()
+{
+ priv->watch_update_mask(SPICE_WATCH_EVENT_READ|SPICE_WATCH_EVENT_WRITE);
+ priv->ack_data.messages_window = 0;
+}
+
+void RedChannelClient::ack_set_client_window(int client_window)
+{
+ priv->ack_data.client_window = client_window;
+}
+
+void RedChannelClient::push_set_ack()
+{
+ pipe_add_type(RED_PIPE_ITEM_TYPE_SET_ACK);
+}
+
+void RedChannelClient::disconnect()
+{
+ auto channel = priv->channel;
+
+ if (!is_connected()) {
+ return;
+ }
+ priv->pipe_clear();
+
+ shutdown();
+
+ red_timer_remove(priv->latency_monitor.timer);
+ priv->latency_monitor.timer = nullptr;
+
+ red_timer_remove(priv->connectivity_monitor.timer);
+ priv->connectivity_monitor.timer = nullptr;
+
+ channel->remove_client(this);
+ on_disconnect();
+ // remove client from RedClient
+ // NOTE this may trigger the free of the object, if we are in a watch/timer
+ // we should make sure we keep a reference
+ get_client()->remove_channel(this);
+}
+
+bool RedChannelClient::is_blocked() const
+{
+ return priv->send_data.blocked;
+}
+
+int RedChannelClient::send_message_pending()
+{
+ return priv->send_data.header.get_msg_type(&priv->send_data.header) != 0;
+}
+
+SpiceMarshaller *RedChannelClient::get_marshaller()
+{
+ return priv->send_data.marshaller;
+}
+
+RedStream *RedChannelClient::get_stream()
+{
+ return priv->stream;
+}
+
+RedClient *RedChannelClient::get_client()
+{
+ return priv->client;
+}
+
+void RedChannelClient::set_header_sub_list(uint32_t sub_list)
+{
+ priv->send_data.header.set_msg_sub_list(&priv->send_data.header, sub_list);
+}
+
+/* TODO: more evil sync stuff. anything with the word wait in it's name. */
+bool RedChannelClient::wait_pipe_item_sent(Pipe::iterator item_pos, int64_t timeout)
+{
+ uint64_t end_time;
+
+ spice_debug("trace");
+
+ if (timeout != -1) {
+ end_time = spice_get_monotonic_time_ns() + timeout;
+ } else {
+ end_time = UINT64_MAX;
+ }
+
+ auto mark_item = red::make_shared<MarkerPipeItem>();
+
+ mark_item->item_sent = false;
+ pipe_add_before_pos(RedPipeItemPtr(mark_item), item_pos);
+
+ for (;;) {
+ receive();
+ push();
+ if (mark_item->item_sent ||
+ (timeout != -1 && spice_get_monotonic_time_ns() >= end_time)) {
+ break;
+ }
+ usleep(CHANNEL_BLOCKED_SLEEP_DURATION);
+ }
+
+ if (!mark_item->item_sent) {
+ // still on the queue
+ spice_warning("timeout");
+ }
+ return mark_item->item_sent;
+}
+
+bool RedChannelClient::wait_outgoing_item(int64_t timeout)
+{
+ uint64_t end_time;
+ int blocked;
+
+ if (!is_blocked()) {
+ return TRUE;
+ }
+ if (timeout != -1) {
+ end_time = spice_get_monotonic_time_ns() + timeout;
+ } else {
+ end_time = UINT64_MAX;
+ }
+ spice_debug("blocked");
+
+ do {
+ usleep(CHANNEL_BLOCKED_SLEEP_DURATION);
+ receive();
+ send();
+ } while ((blocked = is_blocked()) &&
+ (timeout == -1 || spice_get_monotonic_time_ns() < end_time));
+
+ if (blocked) {
+ spice_warning("timeout");
+ return FALSE;
+ }
+ spice_assert(no_item_being_sent());
+ return TRUE;
+}
+
+bool RedChannelClient::no_item_being_sent() const
+{
+ return priv->send_data.size == 0;
+}
+
+void RedChannelClient::pipe_remove_and_release(RedPipeItem *item)
+{
+ priv->pipe_remove(item);
+}
+
+/* client mutex should be locked before this call */
+bool RedChannelClient::set_migration_seamless()
+{
+ bool ret = false;
+ uint32_t flags;
+
+ flags = priv->channel->migration_flags();
+ if (flags & SPICE_MIGRATE_NEED_DATA_TRANSFER) {
+ priv->wait_migrate_data = TRUE;
+ ret = true;
+ }
+ red_channel_debug(priv->channel, "rcc %p wait data %d", this,
+ priv->wait_migrate_data);
+
+ return ret;
+}
diff --git a/server/red-channel-client.h b/server/red-channel-client.h
new file mode 100644
index 00000000..5c4df962
--- /dev/null
+++ b/server/red-channel-client.h
@@ -0,0 +1,220 @@
+/*
+ Copyright (C) 2009-2016 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef RED_CHANNEL_CLIENT_H_
+#define RED_CHANNEL_CLIENT_H_
+
+#include <list>
+#include <common/marshaller.h>
+
+#include "red-pipe-item.h"
+#include "red-stream.h"
+#include "red-channel.h"
+#include "utils.hpp"
+#include "safe-list.hpp"
+
+#include "push-visibility.h"
+
+struct RedChannelClientPrivate;
+
+class RedChannelClient: public red::shared_ptr_counted
+{
+ // This is made protected to avoid allocation on stack conflicting with
+ // reference counting
+protected:
+ virtual ~RedChannelClient();
+
+public:
+ RedChannelClient(RedChannel *channel,
+ RedClient *client,
+ RedStream *stream,
+ RedChannelCapabilities *caps,
+ bool monitor_latency=false);
+ virtual bool init();
+
+ bool is_connected() const;
+ bool is_waiting_for_migrate_data() const;
+ bool test_remote_cap(uint32_t cap) const;
+ /* shutdown is the only safe thing to do out of the client/channel
+ * thread. It will not touch the rings, just shutdown the socket.
+ * It should be followed by some way to guarantee a disconnection. */
+ void shutdown();
+ /* when preparing send_data: should call init and then use marshaller */
+ void init_send_data(uint16_t msg_type);
+
+ uint64_t get_message_serial() const;
+
+ /* When sending a msg. Should first call begin_send_message.
+ * It will first send the pending urgent data, if there is any, and then
+ * the rest of the data.
+ */
+ void begin_send_message();
+
+ /*
+ * Stores the current send data, and switches to urgent send data.
+ * When it begins the actual send, it will send first the urgent data
+ * and afterward the rest of the data.
+ * Should be called only if during the marshalling of on message,
+ * the need to send another message, before, rises.
+ * Important: the serial of the non-urgent sent data, will be succeeded.
+ * return: the urgent send data marshaller
+ */
+ SpiceMarshaller *switch_to_urgent_sender();
+
+ /* returns -1 if we don't have an estimation */
+ int get_roundtrip_ms() const;
+
+protected:
+ /* Checks periodically if the connection is still alive */
+ void start_connectivity_monitoring(uint32_t timeout_ms);
+
+public:
+ typedef std::list<RedPipeItemPtr, red::Mallocator<RedPipeItemPtr>> Pipe;
+
+ void pipe_add_push(RedPipeItemPtr&& item);
+ void pipe_add(RedPipeItemPtr&& item);
+ void pipe_add_after(RedPipeItemPtr&& item, RedPipeItem *pos);
+ void pipe_add_after_pos(RedPipeItemPtr&& item,
+ RedChannelClient::Pipe::iterator pos);
+ bool pipe_item_is_linked(RedPipeItem *item) const;
+ void pipe_remove_and_release(RedPipeItem *item);
+ void pipe_add_tail(RedPipeItemPtr&& item);
+ /* for types that use this routine -> the pipe item should be freed */
+ void pipe_add_type(int pipe_item_type);
+ static RedPipeItemPtr new_empty_msg(int msg_type);
+ void pipe_add_empty_msg(int msg_type);
+ bool pipe_is_empty() const;
+ uint32_t get_pipe_size() const;
+ Pipe& get_pipe();
+ bool is_mini_header() const;
+
+ void ack_zero_messages_window();
+ void ack_set_client_window(int client_window);
+ void push_set_ack();
+
+ bool is_blocked() const;
+
+ /* helper for channels that have complex logic that can possibly ready a send */
+ int send_message_pending();
+
+ bool no_item_being_sent() const;
+ void push();
+ void receive();
+ void send();
+ virtual void disconnect();
+
+ /* Note: the valid times to call red_channel_get_marshaller are just during send_item callback. */
+ SpiceMarshaller *get_marshaller();
+ RedStream *get_stream();
+ RedClient *get_client();
+
+ /* Note that the header is valid only between reset_send_data and
+ * begin_send_message.*/
+ void set_header_sub_list(uint32_t sub_list);
+
+ /*
+ * blocking functions.
+ *
+ * timeout is in nano sec. -1 for no timeout.
+ *
+ * Return: TRUE if waiting succeeded. FALSE if timeout expired.
+ */
+
+ bool wait_pipe_item_sent(RedChannelClient::Pipe::iterator item_pos, int64_t timeout);
+ bool wait_outgoing_item(int64_t timeout);
+
+ RedChannel* get_channel();
+
+ void semi_seamless_migration_complete();
+
+ bool set_migration_seamless();
+
+ /* allow to block or unblock reading */
+ void block_read();
+ void unblock_read();
+
+ // callback from client
+ virtual void migrate();
+
+protected:
+ bool test_remote_common_cap(uint32_t cap) const;
+ void init_outgoing_messages_window();
+
+ /* handles general channel msgs from the client */
+ virtual bool handle_message(uint16_t type, uint32_t size, void *message);
+
+ /* configure socket connected to the client */
+ virtual bool config_socket() { return true; }
+ virtual uint8_t *alloc_recv_buf(uint16_t type, uint32_t size)=0;
+ virtual void release_recv_buf(uint16_t type, uint32_t size, uint8_t *msg)=0;
+
+ virtual void on_disconnect() {};
+
+ // TODO: add ASSERTS for thread_id in client and channel calls
+ /*
+ * callbacks that are triggered from channel client stream events.
+ * They are called from the thread that listen to the stream events.
+ */
+ virtual void send_item(RedPipeItem *item) {};
+
+ virtual bool handle_migrate_data(uint32_t size, void *message) { return false; }
+ virtual bool handle_migrate_data_get_serial(uint32_t size, void *message, uint64_t &serial)
+ {
+ return false;
+ }
+
+ /* Private functions */
+private:
+ void send_any_item(RedPipeItem *item);
+ void handle_outgoing();
+ void handle_incoming();
+ virtual void handle_migrate_flush_mark();
+ void handle_migrate_data_early(uint32_t size, void *message);
+ inline bool prepare_pipe_add(RedPipeItem *item);
+ void pipe_add_before_pos(RedPipeItemPtr&& item, RedChannelClient::Pipe::iterator pipe_item_pos);
+ void send_set_ack();
+ void send_migrate();
+ void send_empty_msg(RedPipeItem *base);
+ void msg_sent();
+ static void ping_timer(RedChannelClient *rcc);
+ static void connectivity_timer(RedChannelClient *rcc);
+ void send_ping();
+ void push_ping();
+
+ /* Private data */
+private:
+ red::unique_link<RedChannelClientPrivate> priv;
+};
+
+/* Messages handled by RedChannel
+ * SET_ACK - sent to client on channel connection
+ * Note that the numbers don't have to correspond to spice message types,
+ * but we keep the 100 first allocated for base channel approach.
+ * */
+enum {
+ RED_PIPE_ITEM_TYPE_SET_ACK=1,
+ RED_PIPE_ITEM_TYPE_MIGRATE,
+ RED_PIPE_ITEM_TYPE_EMPTY_MSG,
+ RED_PIPE_ITEM_TYPE_PING,
+ RED_PIPE_ITEM_TYPE_MARKER,
+
+ RED_PIPE_ITEM_TYPE_CHANNEL_BASE=101,
+};
+
+#include "pop-visibility.h"
+
+#endif /* RED_CHANNEL_CLIENT_H_ */
diff --git a/server/red-channel.cpp b/server/red-channel.cpp
new file mode 100644
index 00000000..e3cc38a5
--- /dev/null
+++ b/server/red-channel.cpp
@@ -0,0 +1,587 @@
+/*
+ Copyright (C) 2009 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+
+
+ Author:
+ yhalperi@redhat.com
+*/
+#include <config.h>
+
+#include "red-channel.h"
+#include "red-channel-client.h"
+#include "reds.h"
+#include "red-stream.h"
+#include "red-client.h"
+#include "main-dispatcher.h"
+#include "utils.h"
+#include "utils.hpp"
+
+/*
+ * Lifetime of RedChannel, RedChannelClient and RedClient:
+ * RedChannel is created and destroyed by the calls to
+ * red_channel_create.* and red_channel_destroy. The RedChannel resources
+ * are deallocated only after red_channel_destroy is called and no RedChannelClient
+ * refers to the channel.
+ * RedChannelClient is created and destroyed by the calls to xxx_channel_client_new
+ * and RedChannelClient::disconnect. RedChannelClient resources are deallocated only when
+ * its refs == 0. The reference count of RedChannelClient can be increased by routines
+ * that include calls that might destroy the red_channel_client. For example,
+ * red_peer_handle_incoming calls the handle_message proc of the channel, which
+ * might lead to destroying the client. However, after the call to handle_message,
+ * there is a call to the channel's release_msg_buf proc.
+ *
+ * Once RedChannelClient::disconnect is called, the RedChannelClient is disconnected and
+ * removed from the RedChannel clients list, but if rcc->refs != 0, it will still hold
+ * a reference to the Channel. The reason for this is that on the one hand RedChannel holds
+ * callbacks that may be still in use by RedChannel, and on the other hand,
+ * when an operation is performed on the list of clients that belongs to the channel,
+ * we don't want to execute it on the "to be destroyed" channel client.
+ *
+ * RedClient is created and destroyed by the calls to red_client_new and red_client_destroy.
+ * When it is destroyed, it also disconnects and destroys all the RedChannelClients that
+ * are associated with it. However, since part of these channel clients may still have
+ * other references, they will not be completely released, until they are dereferenced.
+ *
+ * Note: RedChannelClient::disconnect is not thread safe.
+ * If a call to RedChannelClient::disconnect is made from another location, it must be called
+ * from the channel's thread.
+*/
+struct RedChannelPrivate
+{
+ SPICE_CXX_GLIB_ALLOCATOR
+
+ RedChannelPrivate(RedsState *init_reds, uint32_t init_type, uint32_t init_id,
+ RedChannel::CreationFlags flags,
+ SpiceCoreInterfaceInternal *init_core, Dispatcher *init_dispatcher):
+ type(init_type), id(init_id),
+ core(init_core ? init_core : reds_get_core_interface(init_reds)),
+ handle_acks(!!(flags & RedChannel::HandleAcks)),
+ parser(spice_get_client_channel_parser(init_type, nullptr)),
+ migration_flags(flags & RedChannel::MigrateAll),
+ dispatcher(init_dispatcher),
+ reds(init_reds)
+ {
+ thread_id = pthread_self();
+ }
+
+ ~RedChannelPrivate()
+ {
+ red_channel_capabilities_reset(&local_caps);
+ }
+
+ const uint32_t type;
+ const uint32_t id;
+
+ /* "core" interface to register events.
+ * Can be thread specific.
+ */
+ SpiceCoreInterfaceInternal *const core;
+ const bool handle_acks;
+
+ const spice_parse_channel_func_t parser;
+
+ // RedChannel will hold only connected channel clients
+ // (logic - when pushing pipe item to all channel clients, there
+ // is no need to go over disconnect clients)
+ // . While client will hold the channel clients till it is destroyed
+ // and then it will destroy them as well.
+ // However RCC still holds a reference to the Channel.
+ // Maybe replace these logic with ref count?
+ // TODO: rename to 'connected_clients'?
+ GList *clients;
+
+ RedChannelCapabilities local_caps;
+ const uint32_t migration_flags;
+
+ // TODO: when different channel_clients are in different threads
+ // from Channel -> need to protect!
+ pthread_t thread_id;
+ /* Setting dispatcher allows the channel to execute code in the right
+ * thread.
+ * thread_id will be used to check the channel thread and automatically
+ * use the dispatcher if the thread is different.
+ */
+ const red::shared_ptr<Dispatcher> dispatcher;
+ RedsState *const reds;
+ RedStatNode stat;
+};
+
+RedChannel::RedChannel(RedsState *reds, uint32_t type, uint32_t id, CreationFlags flags,
+ SpiceCoreInterfaceInternal *core, Dispatcher *dispatcher):
+ priv(new RedChannelPrivate(reds, type, id, flags, core, dispatcher))
+{
+ red_channel_debug(this, "thread_id %p", (void*) priv->thread_id);
+
+ set_common_cap(SPICE_COMMON_CAP_MINI_HEADER);
+ set_common_cap(SPICE_COMMON_CAP_PROTOCOL_AUTH_SELECTION);
+}
+
+RedChannel::~RedChannel() = default;
+
+uint32_t RedChannel::id() const
+{
+ return priv->id;
+}
+
+uint32_t RedChannel::type() const
+{
+ return priv->type;
+}
+
+uint32_t RedChannel::migration_flags() const
+{
+ return priv->migration_flags;
+}
+
+bool RedChannel::handle_acks() const
+{
+ return priv->handle_acks;
+}
+
+uint8_t *RedChannel::parse(uint8_t *message, size_t message_size,
+ uint16_t message_type,
+ size_t *size_out, message_destructor_t *free_message) const
+{
+ return priv->parser(message, message + message_size, message_type,
+ SPICE_VERSION_MINOR, size_out, free_message);
+}
+
+// utility to avoid possible invalid function cast
+static void
+red_channel_foreach_client(RedChannel *channel, void (RedChannelClient::*func)())
+{
+ RedChannelClient *client;
+ GLIST_FOREACH(channel->priv->clients, RedChannelClient, client) {
+ (client->*func)();
+ }
+}
+
+void RedChannel::receive()
+{
+ red_channel_foreach_client(this, &RedChannelClient::receive);
+}
+
+void RedChannel::add_client(RedChannelClient *rcc)
+{
+ spice_assert(rcc);
+ priv->clients = g_list_prepend(priv->clients, rcc);
+}
+
+bool RedChannel::test_remote_cap(uint32_t cap)
+{
+ RedChannelClient *rcc;
+
+ FOREACH_CLIENT(this, rcc) {
+ if (!rcc->test_remote_cap(cap)) {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+bool RedChannel::is_waiting_for_migrate_data()
+{
+ RedChannelClient *rcc;
+ guint n_clients = g_list_length(priv->clients);
+
+ if (!is_connected()) {
+ return FALSE;
+ }
+
+ if (n_clients > 1) {
+ return FALSE;
+ }
+ spice_assert(n_clients == 1);
+ rcc = static_cast<RedChannelClient *>(g_list_nth_data(priv->clients, 0));
+ return rcc->is_waiting_for_migrate_data();
+}
+
+void RedChannel::init_stat_node(const RedStatNode *parent, const char *name)
+{
+ // TODO check not already initialized
+ stat_init_node(&priv->stat, priv->reds, parent, name, TRUE);
+}
+
+const RedStatNode *RedChannel::get_stat_node()
+{
+ return &priv->stat;
+}
+
+static void add_capability(uint32_t **caps, int *num_caps, uint32_t cap)
+{
+ int nbefore, n;
+
+ nbefore = *num_caps;
+ n = cap / 32;
+ *num_caps = MAX(*num_caps, n + 1);
+ *caps = spice_renew(uint32_t, *caps, *num_caps);
+ memset(*caps + nbefore, 0, (*num_caps - nbefore) * sizeof(uint32_t));
+ (*caps)[n] |= (1 << (cap % 32));
+}
+
+void RedChannel::set_common_cap(uint32_t cap)
+{
+ add_capability(&priv->local_caps.common_caps,
+ &priv->local_caps.num_common_caps, cap);
+}
+
+void RedChannel::set_cap(uint32_t cap)
+{
+ add_capability(&priv->local_caps.caps, &priv->local_caps.num_caps, cap);
+}
+
+void RedChannel::destroy()
+{
+ red::shared_ptr<RedChannel> hold(this);
+
+ // prevent future connection, and remove a reference (possibly the only one)
+ reds_unregister_channel(priv->reds, this);
+
+ red_channel_foreach_client(this, &RedChannelClient::disconnect);
+ // WARNING, object maybe now deleted
+}
+
+void RedChannel::send()
+{
+ red_channel_foreach_client(this, &RedChannelClient::send);
+}
+
+void RedChannel::push()
+{
+ red_channel_foreach_client(this, &RedChannelClient::push);
+}
+
+void RedChannel::pipes_add(RedPipeItemPtr&& item)
+{
+ RedChannelClient *rcc;
+
+ FOREACH_CLIENT(this, rcc) {
+ rcc->pipe_add(RedPipeItemPtr(item));
+ }
+}
+
+void RedChannel::pipes_add_type(int pipe_item_type)
+{
+ auto item = red::make_shared<RedPipeItem>(pipe_item_type);
+
+ pipes_add(std::move(item));
+}
+
+void RedChannel::pipes_add_empty_msg(int msg_type)
+{
+ pipes_add(RedChannelClient::new_empty_msg(msg_type));
+}
+
+int RedChannel::is_connected()
+{
+ return priv->clients != nullptr;
+}
+
+const char *RedChannel::get_name() const
+{
+ return red_channel_type_to_str(priv->type);
+}
+
+void RedChannel::remove_client(RedChannelClient *rcc)
+{
+ GList *link;
+ g_return_if_fail(this == rcc->get_channel());
+
+ if (!pthread_equal(pthread_self(), priv->thread_id)) {
+ red_channel_warning(this,
+ "channel->thread_id (%p) != "
+ "pthread_self (%p)."
+ "If one of the threads is != io-thread && != vcpu-thread, "
+ "this might be a BUG",
+ (void*) priv->thread_id, (void*) pthread_self());
+ }
+ link = g_list_find(priv->clients, rcc);
+ spice_return_if_fail(link != nullptr);
+
+ priv->clients = g_list_delete_link(priv->clients, link);
+ // TODO: should we set rcc->channel to NULL???
+}
+
+void RedChannel::disconnect()
+{
+ red_channel_foreach_client(this, &RedChannelClient::disconnect);
+}
+
+struct RedMessageConnect {
+ RedChannel *channel;
+ RedClient *client;
+ RedStream *stream;
+ int migration;
+ RedChannelCapabilities caps;
+};
+
+static void handle_dispatcher_connect(void *opaque, RedMessageConnect *msg)
+{
+ RedChannel *channel = msg->channel;
+
+ channel->on_connect(msg->client, msg->stream, msg->migration, &msg->caps);
+ msg->client->unref();
+ red_channel_capabilities_reset(&msg->caps);
+}
+
+void RedChannel::connect(RedClient *client, RedStream *stream, int migration,
+ RedChannelCapabilities *caps)
+{
+ if (!priv->dispatcher ||
+ pthread_equal(pthread_self(), priv->thread_id)) {
+ on_connect(client, stream, migration, caps);
+ return;
+ }
+
+ Dispatcher *dispatcher = priv->dispatcher.get();
+
+ // get a reference potentially the main channel can be destroyed in
+ // the main thread causing RedClient to be destroyed before using it
+ RedMessageConnect payload = {
+ .channel = this,
+ .client = red::add_ref(client),
+ .stream = stream,
+ .migration = migration
+ };
+ red_channel_capabilities_init(&payload.caps, caps);
+
+ dispatcher->send_message_custom(handle_dispatcher_connect, &payload, false);
+}
+
+GList *RedChannel::get_clients()
+{
+ return priv->clients;
+}
+guint RedChannel::get_n_clients()
+{
+ return g_list_length(priv->clients);
+}
+
+bool RedChannel::all_blocked()
+{
+ RedChannelClient *rcc;
+
+ if (!priv->clients) {
+ return FALSE;
+ }
+ FOREACH_CLIENT(this, rcc) {
+ if (!rcc->is_blocked()) {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+/* return TRUE if any of the connected clients to this channel are blocked */
+static bool red_channel_any_blocked(RedChannel *channel)
+{
+ RedChannelClient *rcc;
+
+ FOREACH_CLIENT(channel, rcc) {
+ if (rcc->is_blocked()) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+static bool red_channel_no_item_being_sent(RedChannel *channel)
+{
+ RedChannelClient *rcc;
+
+ FOREACH_CLIENT(channel, rcc) {
+ if (!rcc->no_item_being_sent()) {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+/*
+ * Functions to push the same item to multiple pipes.
+ */
+
+/*
+ * TODO: after convinced of correctness, add paths for single client
+ * that avoid the whole loop. perhaps even have a function pointer table
+ * later.
+ * TODO - inline? macro? right now this is the simplest from code amount
+ */
+
+/**
+ * red_channel_pipes_new_add:
+ * @channel: a channel
+ * @creator: a callback to create pipe item (not null)
+ * @data: the data to pass to the creator
+ *
+ * Returns: the number of added items
+ **/
+int RedChannel::pipes_new_add(new_pipe_item_t creator, void *data)
+{
+ RedChannelClient *rcc;
+ int num = 0, n = 0;
+
+ spice_assert(creator != nullptr);
+
+ FOREACH_CLIENT(this, rcc) {
+ auto item = (*creator)(rcc, data, num++);
+ if (item) {
+ rcc->pipe_add(std::move(item));
+ n++;
+ }
+ }
+
+ return n;
+}
+
+uint32_t RedChannel::max_pipe_size()
+{
+ RedChannelClient *rcc;
+ uint32_t pipe_size = 0;
+
+ FOREACH_CLIENT(this, rcc) {
+ pipe_size = std::max(pipe_size, rcc->get_pipe_size());
+ }
+ return pipe_size;
+}
+
+uint32_t RedChannel::sum_pipes_size()
+{
+ RedChannelClient *rcc;
+ uint32_t sum = 0;
+
+ FOREACH_CLIENT(this, rcc) {
+ sum += rcc->get_pipe_size();
+ }
+ return sum;
+}
+
+static void red_channel_disconnect_if_pending_send(RedChannel *channel)
+{
+ RedChannelClient *rcc;
+
+ FOREACH_CLIENT(channel, rcc) {
+ if (rcc->is_blocked() || !rcc->pipe_is_empty()) {
+ rcc->disconnect();
+ } else {
+ spice_assert(rcc->no_item_being_sent());
+ }
+ }
+}
+
+bool RedChannel::wait_all_sent(int64_t timeout)
+{
+ uint64_t end_time;
+ uint32_t max_pipe_size;
+ int blocked = FALSE;
+
+ if (timeout != -1) {
+ end_time = spice_get_monotonic_time_ns() + timeout;
+ } else {
+ end_time = UINT64_MAX;
+ }
+
+ push();
+ while (((max_pipe_size = this->max_pipe_size()) ||
+ (blocked = red_channel_any_blocked(this))) &&
+ (timeout == -1 || spice_get_monotonic_time_ns() < end_time)) {
+ spice_debug("pipe-size %u blocked %d", max_pipe_size, blocked);
+ usleep(CHANNEL_BLOCKED_SLEEP_DURATION);
+ receive();
+ send();
+ push();
+ }
+
+ if (max_pipe_size || blocked) {
+ spice_warning("timeout: pending out messages exist (pipe-size %u, blocked %d)",
+ max_pipe_size, blocked);
+ red_channel_disconnect_if_pending_send(this);
+ return FALSE;
+ }
+
+ spice_assert(red_channel_no_item_being_sent(this));
+ return TRUE;
+}
+
+RedsState* RedChannel::get_server()
+{
+ return priv->reds;
+}
+
+SpiceCoreInterfaceInternal* RedChannel::get_core_interface()
+{
+ return priv->core;
+}
+
+void RedChannel::reset_thread_id()
+{
+ priv->thread_id = pthread_self();
+}
+
+const RedChannelCapabilities* RedChannel::get_local_capabilities()
+{
+ return &priv->local_caps;
+}
+
+struct RedMessageMigrate {
+ RedChannelClient *rcc;
+};
+
+static void handle_dispatcher_migrate(void *opaque, RedMessageMigrate *msg)
+{
+ msg->rcc->migrate();
+ shared_ptr_unref(msg->rcc); // XXX because we use raw pointers :-(
+}
+
+void RedChannel::migrate_client(RedChannelClient *rcc)
+{
+ if (!priv->dispatcher ||
+ pthread_equal(pthread_self(), priv->thread_id)) {
+ rcc->migrate();
+ return;
+ }
+
+ shared_ptr_add_ref(rcc); // XXX
+ RedMessageMigrate payload = { .rcc = rcc };
+ priv->dispatcher->send_message_custom(handle_dispatcher_migrate,
+ &payload, false);
+}
+
+struct RedMessageDisconnect {
+ RedChannelClient *rcc;
+};
+
+static void handle_dispatcher_disconnect(void *opaque, RedMessageDisconnect *msg)
+{
+ msg->rcc->disconnect();
+ shared_ptr_unref(msg->rcc); // XXX because we use raw pointers :-(
+}
+
+void RedChannel::disconnect_client(RedChannelClient *rcc)
+{
+ if (!priv->dispatcher ||
+ pthread_equal(pthread_self(), priv->thread_id)) {
+ rcc->disconnect();
+ return;
+ }
+
+ // TODO: we turned it to be sync, due to client_destroy . Should we support async? - for this we will need ref count
+ // for channels
+ shared_ptr_add_ref(rcc); // XXX
+ RedMessageDisconnect payload = { .rcc = rcc };
+ priv->dispatcher->send_message_custom(handle_dispatcher_disconnect,
+ &payload, true);
+}
diff --git a/server/red-channel.h b/server/red-channel.h
new file mode 100644
index 00000000..60fef188
--- /dev/null
+++ b/server/red-channel.h
@@ -0,0 +1,207 @@
+/*
+ Copyright (C) 2009 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+
+
+ Author:
+ yhalperi@redhat.com
+*/
+
+#ifndef RED_CHANNEL_H_
+#define RED_CHANNEL_H_
+
+#include <pthread.h>
+#include <limits.h>
+#include <common/marshaller.h>
+#include <common/demarshallers.h>
+
+#include "spice-wrapped.h"
+#include "red-common.h"
+#include "red-stream.h"
+#include "stat.h"
+#include "red-pipe-item.h"
+#include "red-channel-capabilities.h"
+#include "utils.hpp"
+
+#include "push-visibility.h"
+class RedChannel;
+struct RedChannelPrivate;
+struct RedChannelClient;
+struct RedClient;
+struct MainChannelClient;
+struct Dispatcher;
+
+static inline gboolean test_capability(const uint32_t *caps, int num_caps, uint32_t cap)
+{
+ return VD_AGENT_HAS_CAPABILITY(caps, num_caps, cap);
+}
+
+#define FOREACH_CLIENT(_channel, _data) \
+ GLIST_FOREACH(_channel->get_clients(), RedChannelClient, _data)
+
+/* Red Channel interface */
+
+struct RedChannel: public red::shared_ptr_counted
+{
+ typedef enum {
+ FlagNone = 0,
+ MigrateNeedFlush = SPICE_MIGRATE_NEED_FLUSH,
+ MigrateNeedDataTransfer = SPICE_MIGRATE_NEED_DATA_TRANSFER,
+ HandleAcks = 8,
+ MigrateAll = MigrateNeedFlush|MigrateNeedDataTransfer,
+ } CreationFlags;
+
+ RedChannel(RedsState *reds, uint32_t type, uint32_t id, CreationFlags flags=FlagNone,
+ SpiceCoreInterfaceInternal *core=nullptr, Dispatcher *dispatcher=nullptr);
+ virtual ~RedChannel();
+
+ uint32_t id() const;
+ uint32_t type() const;
+ uint32_t migration_flags() const;
+ bool handle_acks() const;
+
+ virtual void on_connect(RedClient *client, RedStream *stream, int migration,
+ RedChannelCapabilities *caps) = 0;
+
+ uint8_t *parse(uint8_t *message, size_t message_size,
+ uint16_t message_type,
+ size_t *size_out, message_destructor_t *free_message) const;
+
+ const char *get_name() const;
+
+ void add_client(RedChannelClient *rcc);
+ void remove_client(RedChannelClient *rcc);
+
+ void init_stat_node(const RedStatNode *parent, const char *name);
+
+ // caps are freed when the channel is destroyed
+ void set_common_cap(uint32_t cap);
+ void set_cap(uint32_t cap);
+
+ int is_connected();
+
+ /* seamless migration is supported for only one client. This routine
+ * checks if the only channel client associated with channel is
+ * waiting for migration data */
+ bool is_waiting_for_migrate_data();
+
+ /*
+ * the disconnect callback is called from the channel's thread,
+ * i.e., for display channels - red worker thread, for all the other - from the main thread.
+ * RedChannel::destroy can be called only from channel thread.
+ */
+
+ void destroy();
+
+ /* return true if all the channel clients support the cap */
+ bool test_remote_cap(uint32_t cap);
+
+ // helper to push a new item to all channels
+ typedef RedPipeItemPtr (*new_pipe_item_t)(RedChannelClient *rcc, void *data, int num);
+ int pipes_new_add(new_pipe_item_t creator, void *data);
+
+ void pipes_add_type(int pipe_item_type);
+
+ void pipes_add_empty_msg(int msg_type);
+
+ /* Add an item to all the clients connected.
+ * The same item is shared between all clients.
+ * Function will take ownership of the item.
+ */
+ void pipes_add(RedPipeItemPtr&& item);
+
+ /* return TRUE if all of the connected clients to this channel are blocked */
+ bool all_blocked();
+
+ // TODO: unstaticed for display/cursor channels. they do some specific pushes not through
+ // adding elements or on events. but not sure if this is actually required (only result
+ // should be that they ""try"" a little harder, but if the event system is correct it
+ // should not make any difference.
+ void push();
+ // Again, used in various places outside of event handler context (or in other event handler
+ // contexts):
+ // flush_display_commands/flush_cursor_commands
+ // display_channel_wait_for_init
+ // red_wait_outgoing_item
+ // red_wait_pipe_item_sent
+ // handle_channel_events - this is the only one that was used before, and was in red-channel.c
+ void receive();
+ // For red_worker
+ void send();
+ // For red_worker
+ void disconnect();
+ void connect(RedClient *client, RedStream *stream, int migration,
+ RedChannelCapabilities *caps);
+
+ /* return the sum of all the rcc pipe size */
+ uint32_t max_pipe_size();
+ /* return the max size of all the rcc pipe */
+ uint32_t sum_pipes_size();
+
+ GList *get_clients();
+ guint get_n_clients();
+ struct RedsState* get_server();
+ SpiceCoreInterfaceInternal* get_core_interface();
+
+ /* channel callback function */
+ void reset_thread_id();
+ const RedStatNode *get_stat_node();
+
+ const RedChannelCapabilities* get_local_capabilities();
+
+ /*
+ * blocking functions.
+ *
+ * timeout is in nano sec. -1 for no timeout.
+ *
+ * This method tries for up to @timeout nanoseconds to send all the
+ * items which are currently queued. If the timeout elapses,
+ * the RedChannelClient which are too slow (those which still have pending
+ * items) will be disconnected.
+ *
+ * Return: TRUE if waiting succeeded. FALSE if timeout expired.
+ */
+
+ bool wait_all_sent(int64_t timeout);
+
+ /* wrappers for client callbacks */
+ void migrate_client(RedChannelClient *rcc);
+ void disconnect_client(RedChannelClient *rcc);
+
+ red::unique_link<RedChannelPrivate> priv;
+};
+
+inline RedChannel::CreationFlags operator|(RedChannel::CreationFlags a, RedChannel::CreationFlags b)
+{
+ return (RedChannel::CreationFlags) ((int)a|(int)b);
+}
+
+#define CHANNEL_BLOCKED_SLEEP_DURATION 10000 //micro
+
+#define red_channel_log_generic(log_cb, channel, format, ...) \
+ do { \
+ auto channel_ = (channel); \
+ uint32_t id_ = channel_->id(); \
+ log_cb("%s:%u (%p): " format, channel_->get_name(), \
+ id_, &*channel_, ## __VA_ARGS__); \
+ } while (0)
+
+#define red_channel_warning(...) red_channel_log_generic(g_warning, __VA_ARGS__)
+#define red_channel_message(...) red_channel_log_generic(g_message, __VA_ARGS__)
+#define red_channel_debug(...) red_channel_log_generic(g_debug, __VA_ARGS__)
+
+#include "pop-visibility.h"
+
+#endif /* RED_CHANNEL_H_ */
diff --git a/server/red-client.cpp b/server/red-client.cpp
new file mode 100644
index 00000000..248dbd50
--- /dev/null
+++ b/server/red-client.cpp
@@ -0,0 +1,264 @@
+/*
+ Copyright (C) 2009-2016 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+
+*/
+#include <config.h>
+
+#include "red-channel.h"
+#include "red-client.h"
+#include "reds.h"
+
+RedClient::~RedClient()
+{
+ spice_debug("release client=%p", this);
+ pthread_mutex_destroy(&lock);
+}
+
+RedClient::RedClient(RedsState *init_reds, bool migrated):
+ reds(init_reds),
+ during_target_migrate(migrated)
+{
+ pthread_mutex_init(&lock, nullptr);
+ thread_id = pthread_self();
+}
+
+RedClient *red_client_new(RedsState *reds, int migrated)
+{
+ return new RedClient(reds, migrated);
+}
+
+void RedClient::set_migration_seamless() // dest
+{
+ spice_assert(during_target_migrate);
+ pthread_mutex_lock(&lock);
+ seamless_migrate = TRUE;
+ /* update channel clients that got connected before the migration
+ * type was set. red_client_add_channel will handle newer channel clients */
+ for (const auto &rcc : channels) {
+ if (rcc->set_migration_seamless()) {
+ num_migrated_channels++;
+ }
+ }
+ pthread_mutex_unlock(&lock);
+}
+
+void RedClient::migrate()
+{
+ if (!pthread_equal(pthread_self(), thread_id)) {
+ spice_warning("client->thread_id (%p) != "
+ "pthread_self (%p)."
+ "If one of the threads is != io-thread && != vcpu-thread,"
+ " this might be a BUG",
+ (void*) thread_id, (void*) pthread_self());
+ }
+ for (const auto &rcc : channels) {
+ if (rcc->is_connected()) {
+ auto channel = rcc->get_channel();
+ channel->migrate_client(rcc.get());
+ }
+ }
+}
+
+void RedClient::destroy()
+{
+ if (!pthread_equal(pthread_self(), thread_id)) {
+ spice_warning("client->thread_id (%p) != "
+ "pthread_self (%p)."
+ "If one of the threads is != io-thread && != vcpu-thread,"
+ " this might be a BUG",
+ (void*) thread_id,
+ (void*) pthread_self());
+ }
+
+ pthread_mutex_lock(&lock);
+ spice_debug("destroy this %p with #channels=%zd", this, channels.size());
+ // This makes sure that we won't try to add new RedChannelClient instances
+ // to the RedClient::channels list while iterating it
+ disconnecting = TRUE;
+ while (!channels.empty()) {
+ auto rcc = *channels.begin();
+
+ // Remove the RedChannelClient we are processing from the list
+ // Note that we own the object so it is safe to do some operations on it.
+ // This manual scan of the list is done to have a thread safe
+ // iteration of the list
+ channels.pop_front();
+
+ // prevent dead lock disconnecting rcc (which can happen
+ // in the same thread or synchronously on another one)
+ pthread_mutex_unlock(&lock);
+
+ // some channels may be in other threads, so disconnection
+ // is not synchronous.
+ auto channel = rcc->get_channel();
+
+ // some channels may be in other threads. However we currently
+ // assume disconnect is synchronous (we changed the dispatcher
+ // to wait for disconnection)
+ // TODO: should we go back to async. For this we need to use
+ // ref count for channel clients.
+ channel->disconnect_client(rcc.get());
+
+ spice_assert(rcc->pipe_is_empty());
+ spice_assert(rcc->no_item_being_sent());
+
+ pthread_mutex_lock(&lock);
+ }
+ pthread_mutex_unlock(&lock);
+ unref();
+}
+
+
+/* client->lock should be locked */
+RedChannelClient *RedClient::get_channel(int type, int id)
+{
+ for (const auto &rcc : channels) {
+ auto channel = rcc->get_channel();
+ if (channel->type() == type && channel->id() == id) {
+ return rcc.get();
+ }
+ }
+ return nullptr;
+}
+
+gboolean RedClient::add_channel(RedChannelClient *rcc, char **error)
+{
+ RedChannel *channel;
+ gboolean result = TRUE;
+
+ spice_assert(rcc);
+ channel = rcc->get_channel();
+
+ pthread_mutex_lock(&lock);
+
+ uint32_t type = channel->type();
+ uint32_t id = channel->id();
+ if (disconnecting) {
+ *error =
+ g_strdup_printf("Client %p got disconnected while connecting channel type %d id %d",
+ this, type, id);
+ result = FALSE;
+ goto cleanup;
+ }
+
+ if (get_channel(type, id)) {
+ *error =
+ g_strdup_printf("Client %p: duplicate channel type %d id %d",
+ this, type, id);
+ result = FALSE;
+ goto cleanup;
+ }
+
+ // first must be the main one
+ if (!mcc) {
+ // FIXME use dynamic_cast to check type
+ // spice_assert(MAIN_CHANNEL_CLIENT(rcc) != NULL);
+ mcc.reset((MainChannelClient *) rcc);
+ }
+ channels.push_front(red::shared_ptr<RedChannelClient>(rcc));
+ if (during_target_migrate && seamless_migrate) {
+ if (rcc->set_migration_seamless()) {
+ num_migrated_channels++;
+ }
+ }
+
+cleanup:
+ pthread_mutex_unlock(&lock);
+ return result;
+}
+
+MainChannelClient *RedClient::get_main()
+{
+ return mcc.get();
+}
+
+void RedClient::semi_seamless_migrate_complete()
+{
+ pthread_mutex_lock(&lock);
+ if (!during_target_migrate || seamless_migrate) {
+ spice_error("unexpected");
+ pthread_mutex_unlock(&lock);
+ return;
+ }
+ during_target_migrate = FALSE;
+ for (const auto &rcc : channels) {
+ rcc->semi_seamless_migration_complete();
+ }
+ pthread_mutex_unlock(&lock);
+ reds_on_client_semi_seamless_migrate_complete(reds, this);
+}
+
+/* should be called only from the main thread */
+int RedClient::during_migrate_at_target()
+{
+ int ret;
+ pthread_mutex_lock(&lock);
+ ret = during_target_migrate;
+ pthread_mutex_unlock(&lock);
+ return ret;
+}
+
+void RedClient::remove_channel(RedChannelClient *rcc)
+{
+ RedClient *client = rcc->get_client();
+ red::shared_ptr<RedChannelClient> holding_rcc(rcc);
+ pthread_mutex_lock(&client->lock);
+ client->channels.remove(holding_rcc);
+ pthread_mutex_unlock(&client->lock);
+}
+
+/* returns TRUE If all channels are finished migrating, FALSE otherwise */
+gboolean RedClient::seamless_migration_done_for_channel()
+{
+ gboolean ret = FALSE;
+
+ pthread_mutex_lock(&lock);
+ num_migrated_channels--;
+ /* we assume we always have at least one channel who has migration data transfer,
+ * otherwise, this flag will never be set back to FALSE*/
+ if (!num_migrated_channels) {
+ during_target_migrate = FALSE;
+ seamless_migrate = FALSE;
+ /* migration completion might have been triggered from a different thread
+ * than the main thread */
+ reds_get_main_dispatcher(reds)->seamless_migrate_dst_complete(this);
+ ret = TRUE;
+ }
+ pthread_mutex_unlock(&lock);
+
+ return ret;
+}
+
+gboolean RedClient::is_disconnecting()
+{
+ gboolean ret;
+ pthread_mutex_lock(&lock);
+ ret = disconnecting;
+ pthread_mutex_unlock(&lock);
+ return ret;
+}
+
+void RedClient::set_disconnecting()
+{
+ pthread_mutex_lock(&lock);
+ disconnecting = TRUE;
+ pthread_mutex_unlock(&lock);
+}
+
+RedsState *RedClient::get_server()
+{
+ return reds;
+}
diff --git a/server/red-client.h b/server/red-client.h
new file mode 100644
index 00000000..e8df0c75
--- /dev/null
+++ b/server/red-client.h
@@ -0,0 +1,96 @@
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+#ifndef RED_CLIENT_H_
+#define RED_CLIENT_H_
+
+#include "main-channel-client.h"
+#include "safe-list.hpp"
+
+#include "push-visibility.h"
+
+RedClient *red_client_new(RedsState *reds, int migrated);
+
+class RedClient final
+{
+public:
+ SPICE_CXX_GLIB_ALLOCATOR
+
+ RedClient(RedsState *reds, bool migrated);
+protected:
+ ~RedClient();
+
+public:
+ void ref() { g_atomic_int_inc(&_ref); }
+ void unref() { if (g_atomic_int_dec_and_test(&_ref)) delete this; }
+
+ /*
+ * disconnects all the client's channels (should be called from the client's thread)
+ */
+ void destroy();
+
+ gboolean add_channel(RedChannelClient *rcc, char **error);
+ static void remove_channel(RedChannelClient *rcc);
+
+ MainChannelClient *get_main();
+
+ /* called when the migration handshake results in seamless migration (dst side).
+ * By default we assume semi-seamless */
+ void set_migration_seamless();
+ void semi_seamless_migrate_complete(); /* dst side */
+ gboolean seamless_migration_done_for_channel();
+ /* TRUE if the migration is seamless and there are still channels that wait from migration data.
+ * Or, during semi-seamless migration, and the main channel still waits for MIGRATE_END
+ * from the client.
+ * Note: Call it only from the main thread */
+ int during_migrate_at_target();
+
+ void migrate();
+
+ gboolean is_disconnecting();
+ void set_disconnecting();
+ RedsState* get_server();
+
+private:
+ RedChannelClient *get_channel(int type, int id);
+
+ RedsState *const reds;
+ red::safe_list<red::shared_ptr<RedChannelClient>> channels;
+ red::shared_ptr<MainChannelClient> mcc;
+ pthread_mutex_t lock; // different channels can be in different threads
+
+ pthread_t thread_id;
+
+ int disconnecting;
+ /* Note that while semi-seamless migration is conducted by the main thread, seamless migration
+ * involves all channels, and thus the related variables can be accessed from different
+ * threads */
+ /* if seamless=TRUE, migration_target is turned off when all
+ * the clients received their migration data. Otherwise (semi-seamless),
+ * it is turned off, when red_client_semi_seamless_migrate_complete
+ * is called */
+ int during_target_migrate;
+ int seamless_migrate;
+ int num_migrated_channels; /* for seamless - number of channels that wait for migrate data*/
+
+ gint _ref = 1;
+};
+
+#include "pop-visibility.h"
+
+#endif /* RED_CLIENT_H_ */
diff --git a/server/red-common.h b/server/red-common.h
new file mode 100644
index 00000000..c6814b9e
--- /dev/null
+++ b/server/red-common.h
@@ -0,0 +1,135 @@
+/*
+ Copyright (C) 2009 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef RED_COMMON_H_
+#define RED_COMMON_H_
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <string.h>
+#include <unistd.h>
+#include <glib.h>
+#include <spice/macros.h>
+#include <common/log.h>
+#include <common/lz_common.h>
+#include <common/marshaller.h>
+#include <common/messages.h>
+#include <common/draw.h>
+#include <common/verify.h>
+
+#include "spice-wrapped.h"
+#include "utils.h"
+#include "sys-socket.h"
+
+#define SPICE_UPCAST(type, ptr) \
+ (verify_expr(SPICE_OFFSETOF(type, base) == 0,SPICE_CONTAINEROF(ptr, type, base)))
+
+SPICE_BEGIN_DECLS
+
+void red_timer_start(SpiceTimer *timer, uint32_t ms);
+void red_timer_cancel(SpiceTimer *timer);
+void red_timer_remove(SpiceTimer *timer);
+void red_watch_update_mask(SpiceWatch *watch, int event_mask);
+void red_watch_remove(SpiceWatch *watch);
+
+typedef struct SpiceCoreInterfaceInternal SpiceCoreInterfaceInternal;
+
+extern const SpiceCoreInterfaceInternal event_loop_core;
+extern const SpiceCoreInterfaceInternal core_interface_adapter;
+
+SPICE_END_DECLS
+
+struct SpiceCoreInterfaceInternal {
+ SpiceTimer *(*timer_add)(const SpiceCoreInterfaceInternal *iface, SpiceTimerFunc func, void *opaque);
+
+ SpiceWatch *(*watch_add)(const SpiceCoreInterfaceInternal *iface, int fd, int event_mask, SpiceWatchFunc func, void *opaque);
+
+ void (*channel_event)(const SpiceCoreInterfaceInternal *iface, int event, SpiceChannelEventInfo *info);
+
+#ifdef __cplusplus
+ template <typename T>
+ inline SpiceTimer *timer_new(void (*func)(T*), T *opaque) const
+ { return this->timer_add(this, (SpiceTimerFunc) func, opaque); }
+
+ template <typename T>
+ inline SpiceWatch *watch_new(int fd, int event_mask, void (*func)(int,int,T*), T* opaque) const
+ { return this->watch_add(this, fd, event_mask, (SpiceWatchFunc) func, opaque); }
+#endif
+
+
+ /* This structure is an adapter that allows us to use the same API to
+ * implement the core interface in a couple different ways. The first
+ * method is to use a public SpiceCoreInterface provided to us by the
+ * library user (for example, qemu). The second method is to implement the
+ * core interface functions using the glib event loop. In order to avoid
+ * global variables, each method needs to store additional data in this
+ * adapter structure. Instead of using a generic void* data parameter, we
+ * provide a bit more type-safety by using a union to store the type of
+ * data needed by each implementation.
+ */
+ union {
+ GMainContext *main_context;
+ SpiceCoreInterface *public_interface;
+ };
+};
+
+typedef struct RedsState RedsState;
+
+typedef struct GListIter {
+ GList *link;
+ GList *next;
+} GListIter;
+
+/* Iterate through a GList. Note that the iteration is "safe" meaning that the
+ * current item can be removed while the list is scanned. This is required as
+ * the code inside the loop in some cases can remove the element we are
+ * processing */
+#define GLIST_FOREACH_GENERIC(_list, _iter, _type, _data, _dir) \
+ for (GListIter _iter = { .link = _list }; \
+ (_data = (_type *) (_iter.link ? _iter.link->data : NULL), \
+ _iter.next = (_iter.link ? _iter.link->_dir : NULL), \
+ _iter.link) != NULL; \
+ _iter.link = _iter.next)
+
+#define GLIST_FOREACH(_list, _type, _data) \
+ GLIST_FOREACH_GENERIC(_list, G_PASTE(_iter_, __LINE__), _type, _data, next)
+
+#define GLIST_FOREACH_REVERSED(_list, _type, _data) \
+ GLIST_FOREACH_GENERIC(_list, G_PASTE(_iter_, __LINE__), _type, _data, prev)
+
+/* This macro allows to use GLib for a class hierarchy allocation.
+ * The aims are:
+ * - do not depend on C++ runtime, just C;
+ * - do not throw memory exception from a C library;
+ * - zero out the structure like GOject did, we are not still
+ * initializing automatically all members;
+ * - do not allow to allocate array of this type, do not mix fine
+ * with reference counting and inheritance.
+ */
+#define SPICE_CXX_GLIB_ALLOCATOR \
+ void *operator new(size_t size) { return g_malloc0(size); } \
+ void operator delete(void *p) { g_free(p); } \
+ void* operator new[](size_t count);
+
+// XXX todo remove, just for easy portability
+#define XXX_CAST(from, to, name) \
+static inline to* name(from *p) { \
+ return p ? static_cast<to*>(p) : nullptr; \
+}
+
+#endif /* RED_COMMON_H_ */
diff --git a/server/red_parse_qxl.c b/server/red-parse-qxl.cpp
index d2329a3b..68b9759d 100644
--- a/server/red_parse_qxl.c
+++ b/server/red-parse-qxl.cpp
@@ -15,16 +15,44 @@
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
-#ifdef HAVE_CONFIG_H
#include <config.h>
-#endif
-#include <stdbool.h>
-#include <inttypes.h>
-#include "common/lz_common.h"
-#include "red_common.h"
-#include "red_memslots.h"
-#include "red_parse_qxl.h"
+#include <glib.h>
+
+#include <common/lz_common.h>
+
+#include "glib-compat.h"
+#include "spice-bitmap-utils.h"
+#include "red-common.h"
+#include "red-qxl.h"
+#include "memslot.h"
+#include "red-parse-qxl.h"
+
+/* Max size in bytes for any data field used in a QXL command.
+ * This will for example be useful to prevent the guest from saturating the
+ * host memory if it tries to send overlapping chunks.
+ * This value should be big enough for all requests but limited
+ * to 32 bits. Even better if it fits on 31 bits to detect integer overflows.
+ */
+#define MAX_DATA_CHUNK 0x7fffffffLU
+
+verify(MAX_DATA_CHUNK <= G_MAXINT32);
+
+/* Limit number of chunks.
+ * The guest can attempt to make host allocate too much memory
+ * just with a large number of small chunks.
+ * Prevent that the chunk list take more memory than the data itself.
+ */
+#define MAX_CHUNKS (MAX_DATA_CHUNK/1024u)
+
+#define INVALID_SIZE ((size_t) -1)
+
+struct RedDataChunk {
+ uint32_t data_size;
+ RedDataChunk *prev_chunk;
+ RedDataChunk *next_chunk;
+ uint8_t *data;
+};
#if 0
static void hexdump_qxl(RedMemSlotInfo *slots, int group_id,
@@ -33,7 +61,7 @@ static void hexdump_qxl(RedMemSlotInfo *slots, int group_id,
uint8_t *hex;
int i;
- hex = (uint8_t*)get_virt(slots, addr, bytes, group_id);
+ hex = (uint8_t*)memslot_get_virt(slots, addr, bytes, group_id);
for (i = 0; i < bytes; i++) {
if (0 == i % 16) {
fprintf(stderr, "%lx: ", addr+i);
@@ -49,6 +77,22 @@ static void hexdump_qxl(RedMemSlotInfo *slots, int group_id,
}
#endif
+template <typename T>
+inline RedQXLResource<T>::~RedQXLResource()
+{
+ if (qxl) {
+ red_qxl_release_resource(qxl, release_info_ext);
+ }
+}
+
+template <typename T>
+inline void RedQXLResource<T>::set_resource(QXLInstance *qxl_instance, QXLReleaseInfo *info, uint32_t group_id)
+{
+ qxl = qxl_instance;
+ release_info_ext.info = info;
+ release_info_ext.group_id = group_id;
+}
+
static inline uint32_t color_16_to_32(uint32_t color)
{
uint32_t ret;
@@ -66,15 +110,15 @@ static uint8_t *red_linearize_chunk(RedDataChunk *head, size_t size, bool *free_
RedDataChunk *chunk;
uint32_t copy;
- if (head->next_chunk == NULL) {
+ if (head->next_chunk == nullptr) {
spice_assert(size <= head->data_size);
*free_chunk = false;
return head->data;
}
- ptr = data = spice_malloc(size);
+ ptr = data = static_cast<uint8_t *>(g_malloc(size));
*free_chunk = true;
- for (chunk = head; chunk != NULL && size > 0; chunk = chunk->next_chunk) {
+ for (chunk = head; chunk != nullptr && size > 0; chunk = chunk->next_chunk) {
copy = MIN(chunk->data_size, size);
memcpy(ptr, chunk->data, copy);
ptr += copy;
@@ -89,50 +133,87 @@ static size_t red_get_data_chunks_ptr(RedMemSlotInfo *slots, int group_id,
RedDataChunk *red, QXLDataChunk *qxl)
{
RedDataChunk *red_prev;
- size_t data_size = 0;
- int error;
+ uint64_t data_size = 0;
+ uint32_t chunk_data_size;
+ QXLPHYSICAL next_chunk;
+ unsigned num_chunks = 0;
red->data_size = qxl->data_size;
data_size += red->data_size;
- if (!validate_virt(slots, (intptr_t)qxl->data, memslot_id, red->data_size, group_id)) {
- return 0;
- }
red->data = qxl->data;
- red->prev_chunk = NULL;
+ red->prev_chunk = red->next_chunk = nullptr;
+ if (!memslot_validate_virt(slots, (intptr_t)red->data, memslot_id, red->data_size, group_id)) {
+ red->data = nullptr;
+ return INVALID_SIZE;
+ }
- while (qxl->next_chunk) {
- red_prev = red;
- red = spice_new(RedDataChunk, 1);
- memslot_id = get_memslot_id(slots, qxl->next_chunk);
- qxl = (QXLDataChunk *)get_virt(slots, qxl->next_chunk, sizeof(*qxl), group_id,
- &error);
- if (error) {
- return 0;
+ while ((next_chunk = qxl->next_chunk) != 0) {
+ /* somebody is trying to use too much memory using a lot of chunks.
+ * Or made a circular list of chunks
+ */
+ if (++num_chunks >= MAX_CHUNKS) {
+ spice_warning("data split in too many chunks, avoiding DoS");
+ goto error;
}
- red->data_size = qxl->data_size;
- data_size += red->data_size;
- if (!validate_virt(slots, (intptr_t)qxl->data, memslot_id, red->data_size, group_id)) {
- return 0;
+
+ memslot_id = memslot_get_id(slots, next_chunk);
+ qxl = static_cast<QXLDataChunk *>(
+ memslot_get_virt(slots, next_chunk, sizeof(*qxl), group_id));
+ if (qxl == nullptr) {
+ goto error;
}
- red->data = qxl->data;
+
+ /* do not waste space for empty chunks.
+ * This could be just a driver issue or an attempt
+ * to allocate too much memory or a circular list.
+ * All above cases are handled by the check for number
+ * of chunks.
+ */
+ chunk_data_size = qxl->data_size;
+ if (chunk_data_size == 0)
+ continue;
+
+ red_prev = red;
+ red = g_new0(RedDataChunk, 1);
+ red->data_size = chunk_data_size;
red->prev_chunk = red_prev;
+ red->data = qxl->data;
red_prev->next_chunk = red;
+
+ data_size += chunk_data_size;
+ /* this can happen if client is sending nested chunks */
+ if (data_size > MAX_DATA_CHUNK) {
+ spice_warning("too much data inside chunks, avoiding DoS");
+ goto error;
+ }
+ if (!memslot_validate_virt(slots, (intptr_t)red->data, memslot_id, red->data_size, group_id))
+ goto error;
}
- red->next_chunk = NULL;
+ red->next_chunk = nullptr;
return data_size;
+
+error:
+ while (red->prev_chunk) {
+ red_prev = red->prev_chunk;
+ g_free(red);
+ red = red_prev;
+ }
+ red->data_size = 0;
+ red->next_chunk = nullptr;
+ red->data = nullptr;
+ return INVALID_SIZE;
}
static size_t red_get_data_chunks(RedMemSlotInfo *slots, int group_id,
RedDataChunk *red, QXLPHYSICAL addr)
{
QXLDataChunk *qxl;
- int error;
- int memslot_id = get_memslot_id(slots, addr);
+ int memslot_id = memslot_get_id(slots, addr);
- qxl = (QXLDataChunk *)get_virt(slots, addr, sizeof(*qxl), group_id, &error);
- if (error) {
- return 0;
+ qxl = static_cast<QXLDataChunk *>(memslot_get_virt(slots, addr, sizeof(*qxl), group_id));
+ if (qxl == nullptr) {
+ return INVALID_SIZE;
}
return red_get_data_chunks_ptr(slots, group_id, memslot_id, red, qxl);
}
@@ -145,7 +226,7 @@ static void red_put_data_chunks(RedDataChunk *red)
while (red) {
tmp = red;
red = red->next_chunk;
- free(tmp);
+ g_free(tmp);
}
}
@@ -179,57 +260,57 @@ static SpicePath *red_get_path(RedMemSlotInfo *slots, int group_id,
bool free_data;
QXLPath *qxl;
SpicePath *red;
- size_t size, mem_size, mem_size2, dsize, segment_size;
+ size_t size;
+ uint64_t mem_size, mem_size2, segment_size;
int n_segments;
int i;
uint32_t count;
- int error;
- qxl = (QXLPath *)get_virt(slots, addr, sizeof(*qxl), group_id, &error);
- if (error) {
- return NULL;
+ qxl = static_cast<QXLPath *>(memslot_get_virt(slots, addr, sizeof(*qxl), group_id));
+ if (qxl == nullptr) {
+ return nullptr;
}
size = red_get_data_chunks_ptr(slots, group_id,
- get_memslot_id(slots, addr),
+ memslot_get_id(slots, addr),
&chunks, &qxl->chunk);
+ if (size == INVALID_SIZE) {
+ return nullptr;
+ }
data = red_linearize_chunk(&chunks, size, &free_data);
red_put_data_chunks(&chunks);
n_segments = 0;
mem_size = sizeof(*red);
- start = (QXLPathSeg*)data;
- end = (QXLPathSeg*)(data + size);
- while (start < end) {
+ start = reinterpret_cast<QXLPathSeg *>(data);
+ end = reinterpret_cast<QXLPathSeg *>(data + size);
+ while (start+1 < end) {
n_segments++;
count = start->count;
- segment_size = sizeof(SpicePathSeg) + count * sizeof(SpicePointFix);
+ segment_size = sizeof(SpicePathSeg) + uint64_t{count} * sizeof(SpicePointFix);
mem_size += sizeof(SpicePathSeg *) + SPICE_ALIGN(segment_size, 4);
- start = (QXLPathSeg*)(&start->points[count]);
+ /* avoid going backward with 32 bit architectures */
+ spice_assert((uint64_t) count * sizeof(QXLPointFix)
+ <= (char*) end - (char*) &start->points[0]);
+ start = reinterpret_cast<QXLPathSeg *>(&start->points[count]);
}
- red = spice_malloc(mem_size);
+ red = static_cast<SpicePath *>(g_malloc(mem_size));
red->num_segments = n_segments;
- start = (QXLPathSeg*)data;
- end = (QXLPathSeg*)(data + size);
- seg = (SpicePathSeg*)&red->segments[n_segments];
+ start = reinterpret_cast<QXLPathSeg *>(data);
+ end = reinterpret_cast<QXLPathSeg *>(data + size);
+ seg = reinterpret_cast<SpicePathSeg *>(&red->segments[n_segments]);
n_segments = 0;
mem_size2 = sizeof(*red);
- while (start < end) {
+ while (start+1 < end && n_segments < red->num_segments) {
red->segments[n_segments++] = seg;
count = start->count;
/* Protect against overflow in size calculations before
writing to memory */
- spice_assert(mem_size2 + sizeof(SpicePathSeg) > mem_size2);
- mem_size2 += sizeof(SpicePathSeg);
- spice_assert(count < UINT32_MAX / sizeof(SpicePointFix));
- dsize = count * sizeof(SpicePointFix);
- spice_assert(mem_size2 + dsize > mem_size2);
- mem_size2 += dsize;
-
/* Verify that we didn't overflow due to guest changing data */
+ mem_size2 += sizeof(SpicePathSeg) + uint64_t{count} * sizeof(SpicePointFix);
spice_assert(mem_size2 <= mem_size);
seg->flags = start->flags;
@@ -238,14 +319,14 @@ static SpicePath *red_get_path(RedMemSlotInfo *slots, int group_id,
seg->points[i].x = start->points[i].x;
seg->points[i].y = start->points[i].y;
}
- start = (QXLPathSeg*)(&start->points[i]);
- seg = (SpicePathSeg*)(&seg->points[i]);
+ start = reinterpret_cast<QXLPathSeg *>(&start->points[i]);
+ seg = reinterpret_cast<SpicePathSeg *>(&seg->points[i]);
}
/* Ensure guest didn't tamper with segment count */
spice_assert(n_segments == red->num_segments);
if (free_data) {
- free(data);
+ g_free(data);
}
return red;
}
@@ -261,29 +342,38 @@ static SpiceClipRects *red_get_clip_rects(RedMemSlotInfo *slots, int group_id,
bool free_data;
size_t size;
int i;
- int error;
+ uint32_t num_rects;
- qxl = (QXLClipRects *)get_virt(slots, addr, sizeof(*qxl), group_id, &error);
- if (error) {
- return NULL;
+ qxl = static_cast<QXLClipRects *>(memslot_get_virt(slots, addr, sizeof(*qxl), group_id));
+ if (qxl == nullptr) {
+ return nullptr;
}
size = red_get_data_chunks_ptr(slots, group_id,
- get_memslot_id(slots, addr),
+ memslot_get_id(slots, addr),
&chunks, &qxl->chunk);
+ if (size == INVALID_SIZE) {
+ return nullptr;
+ }
data = red_linearize_chunk(&chunks, size, &free_data);
red_put_data_chunks(&chunks);
- spice_assert(qxl->num_rects * sizeof(QXLRect) == size);
- red = spice_malloc(sizeof(*red) + qxl->num_rects * sizeof(SpiceRect));
- red->num_rects = qxl->num_rects;
+ num_rects = qxl->num_rects;
+ /* The cast is needed to prevent 32 bit integer overflows.
+ * This check is enough as size is limited to 31 bit
+ * by red_get_data_chunks_ptr checks.
+ */
+ spice_assert((uint64_t) num_rects * sizeof(QXLRect) == size);
+ SPICE_VERIFY(sizeof(SpiceRect) == sizeof(QXLRect));
+ red = static_cast<SpiceClipRects *>(g_malloc(sizeof(*red) + num_rects * sizeof(SpiceRect)));
+ red->num_rects = num_rects;
- start = (QXLRect*)data;
+ start = reinterpret_cast<QXLRect *>(data);
for (i = 0; i < red->num_rects; i++) {
red_get_rect_ptr(red->rects + i, start++);
}
if (free_data) {
- free(data);
+ g_free(data);
}
return red;
}
@@ -292,14 +382,16 @@ static SpiceChunks *red_get_image_data_flat(RedMemSlotInfo *slots, int group_id,
QXLPHYSICAL addr, size_t size)
{
SpiceChunks *data;
- int error;
+ void *bitmap_virt;
+
+ bitmap_virt = memslot_get_virt(slots, addr, size, group_id);
+ if (bitmap_virt == nullptr) {
+ return nullptr;
+ }
data = spice_chunks_new(1);
data->data_size = size;
- data->chunk[0].data = (void*)get_virt(slots, addr, size, group_id, &error);
- if (error) {
- return 0;
- }
+ data->chunk[0].data = static_cast<uint8_t *>(bitmap_virt);
data->chunk[0].len = size;
return data;
}
@@ -311,14 +403,14 @@ static SpiceChunks *red_get_image_data_chunked(RedMemSlotInfo *slots, int group_
RedDataChunk *chunk;
int i;
- for (i = 0, chunk = head; chunk != NULL; chunk = chunk->next_chunk) {
+ for (i = 0, chunk = head; chunk != nullptr; chunk = chunk->next_chunk) {
i++;
}
data = spice_chunks_new(i);
data->data_size = 0;
for (i = 0, chunk = head;
- chunk != NULL && i < data->num_chunks;
+ chunk != nullptr && i < data->num_chunks;
chunk = chunk->next_chunk, i++) {
data->chunk[i].data = chunk->data;
data->chunk[i].len = chunk->data_size;
@@ -346,46 +438,50 @@ static const char *bitmap_format_to_string(int format)
return "unknown";
}
-static const int MAP_BITMAP_FMT_TO_BITS_PER_PIXEL[] = {0, 1, 1, 4, 4, 8, 16, 24, 32, 32, 8};
+static const unsigned int MAP_BITMAP_FMT_TO_BITS_PER_PIXEL[] =
+ {0, 1, 1, 4, 4, 8, 16, 24, 32, 32, 8};
-static int bitmap_consistent(SpiceBitmap *bitmap)
+static bool bitmap_consistent(SpiceBitmap *bitmap)
{
- int bpp = MAP_BITMAP_FMT_TO_BITS_PER_PIXEL[bitmap->format];
+ unsigned int bpp;
+
+ if (bitmap->format >= SPICE_N_ELEMENTS(MAP_BITMAP_FMT_TO_BITS_PER_PIXEL)) {
+ spice_warning("wrong format specified for image");
+ return false;
+ }
+
+ bpp = MAP_BITMAP_FMT_TO_BITS_PER_PIXEL[bitmap->format];
- if (bitmap->stride < ((bitmap->x * bpp + 7) / 8)) {
- spice_warning("image stride too small for width: %d < ((%d * %d + 7) / 8) (%s=%d)\n",
+ if (bitmap->stride < ((uint64_t{bitmap->x} * bpp + 7U) / 8U)) {
+ spice_warning("image stride too small for width: %d < ((%d * %d + 7) / 8) (%s=%d)",
bitmap->stride, bitmap->x, bpp,
bitmap_format_to_string(bitmap->format),
bitmap->format);
- return FALSE;
+ return false;
}
- return TRUE;
+ return true;
}
-// This is based on SPICE_BITMAP_FMT_*, copied from server/red_worker.c
-// to avoid a possible unoptimization from making it non static.
-static const int BITMAP_FMT_IS_RGB[] = {0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1};
-
static SpiceImage *red_get_image(RedMemSlotInfo *slots, int group_id,
- QXLPHYSICAL addr, uint32_t flags, int is_mask)
+ QXLPHYSICAL addr, uint32_t flags, bool is_mask)
{
RedDataChunk chunks;
QXLImage *qxl;
- SpiceImage *red = NULL;
- SpicePalette *rp = NULL;
- size_t bitmap_size, size;
+ SpiceImage *red = nullptr;
+ SpicePalette *rp = nullptr;
+ uint64_t bitmap_size, size;
uint8_t qxl_flags;
- int error;
+ QXLPHYSICAL palette;
if (addr == 0) {
- return NULL;
+ return nullptr;
}
- qxl = (QXLImage *)get_virt(slots, addr, sizeof(*qxl), group_id, &error);
- if (error) {
- return NULL;
+ qxl = static_cast<QXLImage *>(memslot_get_virt(slots, addr, sizeof(*qxl), group_id));
+ if (qxl == nullptr) {
+ return nullptr;
}
- red = spice_new0(SpiceImage, 1);
+ red = g_new0(SpiceImage, 1);
red->descriptor.id = qxl->descriptor.id;
red->descriptor.type = qxl->descriptor.type;
red->descriptor.flags = 0;
@@ -401,40 +497,41 @@ static SpiceImage *red_get_image(RedMemSlotInfo *slots, int group_id,
switch (red->descriptor.type) {
case SPICE_IMAGE_TYPE_BITMAP:
red->u.bitmap.format = qxl->bitmap.format;
- if (!bitmap_fmt_is_rgb(qxl->bitmap.format) && !qxl->bitmap.palette && !is_mask) {
- spice_warning("guest error: missing palette on bitmap format=%d\n",
+ red->u.bitmap.x = qxl->bitmap.x;
+ red->u.bitmap.y = qxl->bitmap.y;
+ red->u.bitmap.stride = qxl->bitmap.stride;
+ palette = qxl->bitmap.palette;
+ if (!bitmap_fmt_is_rgb(red->u.bitmap.format) && !palette && !is_mask) {
+ spice_warning("guest error: missing palette on bitmap format=%d",
red->u.bitmap.format);
goto error;
}
- if (qxl->bitmap.x == 0 || qxl->bitmap.y == 0) {
- spice_warning("guest error: zero area bitmap\n");
+ if (red->u.bitmap.x == 0 || red->u.bitmap.y == 0) {
+ spice_warning("guest error: zero area bitmap");
goto error;
}
qxl_flags = qxl->bitmap.flags;
if (qxl_flags & QXL_BITMAP_TOP_DOWN) {
red->u.bitmap.flags = SPICE_BITMAP_FLAGS_TOP_DOWN;
}
- red->u.bitmap.x = qxl->bitmap.x;
- red->u.bitmap.y = qxl->bitmap.y;
- red->u.bitmap.stride = qxl->bitmap.stride;
if (!bitmap_consistent(&red->u.bitmap)) {
goto error;
}
- if (qxl->bitmap.palette) {
+ if (palette) {
QXLPalette *qp;
int i, num_ents;
- qp = (QXLPalette *)get_virt(slots, qxl->bitmap.palette,
- sizeof(*qp), group_id, &error);
- if (error) {
+ qp = static_cast<QXLPalette *>(memslot_get_virt(slots, palette, sizeof(*qp), group_id));
+ if (qp == nullptr) {
goto error;
}
num_ents = qp->num_ents;
- if (!validate_virt(slots, (intptr_t)qp->ents,
- get_memslot_id(slots, qxl->bitmap.palette),
- num_ents * sizeof(qp->ents[0]), group_id)) {
+ if (!memslot_validate_virt(slots, (intptr_t)qp->ents,
+ memslot_get_id(slots, palette),
+ num_ents * sizeof(qp->ents[0]), group_id)) {
goto error;
}
- rp = spice_malloc_n_m(num_ents, sizeof(rp->ents[0]), sizeof(*rp));
+ rp =
+ static_cast<SpicePalette *>(g_malloc(num_ents * sizeof(rp->ents[0]) + sizeof(*rp)));
rp->unique = qp->unique;
rp->num_ents = num_ents;
if (flags & QXL_COMMAND_FLAG_COMPAT_16BPP) {
@@ -449,16 +546,22 @@ static SpiceImage *red_get_image(RedMemSlotInfo *slots, int group_id,
red->u.bitmap.palette = rp;
red->u.bitmap.palette_id = rp->unique;
}
- bitmap_size = red->u.bitmap.y * abs(red->u.bitmap.stride);
+ bitmap_size = uint64_t{red->u.bitmap.y} * red->u.bitmap.stride;
+ if (bitmap_size > MAX_DATA_CHUNK) {
+ goto error;
+ }
if (qxl_flags & QXL_BITMAP_DIRECT) {
red->u.bitmap.data = red_get_image_data_flat(slots, group_id,
qxl->bitmap.data,
bitmap_size);
+ if (red->u.bitmap.data == nullptr) {
+ goto error;
+ }
} else {
size = red_get_data_chunks(slots, group_id,
&chunks, qxl->bitmap.data);
- spice_assert(size == bitmap_size);
- if (size != bitmap_size) {
+ if (size == INVALID_SIZE || size != bitmap_size) {
+ red_put_data_chunks(&chunks);
goto error;
}
red->u.bitmap.data = red_get_image_data_chunked(slots, group_id,
@@ -474,11 +577,10 @@ static SpiceImage *red_get_image(RedMemSlotInfo *slots, int group_id,
break;
case SPICE_IMAGE_TYPE_QUIC:
red->u.quic.data_size = qxl->quic.data_size;
- size = red_get_data_chunks_ptr(slots, group_id,
- get_memslot_id(slots, addr),
- &chunks, (QXLDataChunk *)qxl->quic.data);
- spice_assert(size == red->u.quic.data_size);
- if (size != red->u.quic.data_size) {
+ size = red_get_data_chunks_ptr(slots, group_id, memslot_get_id(slots, addr), &chunks,
+ reinterpret_cast<QXLDataChunk *>(qxl->quic.data));
+ if (size == INVALID_SIZE || size != red->u.quic.data_size) {
+ red_put_data_chunks(&chunks);
goto error;
}
red->u.quic.data = red_get_image_data_chunked(slots, group_id,
@@ -491,26 +593,26 @@ static SpiceImage *red_get_image(RedMemSlotInfo *slots, int group_id,
}
return red;
error:
- free(red);
- free(rp);
- return NULL;
+ g_free(red);
+ g_free(rp);
+ return nullptr;
}
-void red_put_image(SpiceImage *red)
+static void red_put_image(SpiceImage *red)
{
- if (red == NULL)
+ if (red == nullptr)
return;
switch (red->descriptor.type) {
case SPICE_IMAGE_TYPE_BITMAP:
- free(red->u.bitmap.palette);
+ g_free(red->u.bitmap.palette);
spice_chunks_destroy(red->u.bitmap.data);
break;
case SPICE_IMAGE_TYPE_QUIC:
spice_chunks_destroy(red->u.quic.data);
break;
}
- free(red);
+ g_free(red);
}
static void red_get_brush_ptr(RedMemSlotInfo *slots, int group_id,
@@ -526,7 +628,8 @@ static void red_get_brush_ptr(RedMemSlotInfo *slots, int group_id,
}
break;
case SPICE_BRUSH_TYPE_PATTERN:
- red->u.pattern.pat = red_get_image(slots, group_id, qxl->u.pattern.pat, flags, FALSE);
+ red->u.pattern.pat = red_get_image(slots, group_id, qxl->u.pattern.pat, flags, false);
+ red_get_point_ptr(&red->u.pattern.pos, &qxl->u.pattern.pos);
break;
}
}
@@ -543,9 +646,15 @@ static void red_put_brush(SpiceBrush *red)
static void red_get_qmask_ptr(RedMemSlotInfo *slots, int group_id,
SpiceQMask *red, QXLQMask *qxl, uint32_t flags)
{
- red->flags = qxl->flags;
- red_get_point_ptr(&red->pos, &qxl->pos);
- red->bitmap = red_get_image(slots, group_id, qxl->bitmap, flags, TRUE);
+ red->bitmap = red_get_image(slots, group_id, qxl->bitmap, flags, true);
+ if (red->bitmap) {
+ red->flags = qxl->flags;
+ red_get_point_ptr(&red->pos, &qxl->pos);
+ } else {
+ red->flags = 0;
+ red->pos.x = 0;
+ red->pos.y = 0;
+ }
}
static void red_put_qmask(SpiceQMask *red)
@@ -570,7 +679,7 @@ static void red_put_fill(SpiceFill *red)
static void red_get_opaque_ptr(RedMemSlotInfo *slots, int group_id,
SpiceOpaque *red, QXLOpaque *qxl, uint32_t flags)
{
- red->src_bitmap = red_get_image(slots, group_id, qxl->src_bitmap, flags, FALSE);
+ red->src_bitmap = red_get_image(slots, group_id, qxl->src_bitmap, flags, false);
red_get_rect_ptr(&red->src_area, &qxl->src_area);
red_get_brush_ptr(slots, group_id, &red->brush, &qxl->brush, flags);
red->rop_descriptor = qxl->rop_descriptor;
@@ -585,18 +694,39 @@ static void red_put_opaque(SpiceOpaque *red)
red_put_qmask(&red->mask);
}
-static int red_get_copy_ptr(RedMemSlotInfo *slots, int group_id,
- SpiceCopy *red, QXLCopy *qxl, uint32_t flags)
+static bool red_get_copy_ptr(RedMemSlotInfo *slots, int group_id,
+ RedDrawable *red_drawable, QXLCopy *qxl, uint32_t flags)
{
- red->src_bitmap = red_get_image(slots, group_id, qxl->src_bitmap, flags, FALSE);
+ /* there's no sense to have this true, this will just waste CPU and reduce optimizations
+ * for this command. Due to some bugs however some driver set self_bitmap field for this
+ * command so reset it. */
+ red_drawable->self_bitmap = false;
+
+ SpiceCopy *red = &red_drawable->u.copy;
+
+ red->src_bitmap = red_get_image(slots, group_id, qxl->src_bitmap, flags, false);
if (!red->src_bitmap) {
- return 1;
+ return false;
}
red_get_rect_ptr(&red->src_area, &qxl->src_area);
+ /* The source area should not extend outside the source bitmap or have
+ * swapped coordinates.
+ */
+ if (red->src_area.left < 0 ||
+ red->src_area.left > red->src_area.right ||
+ red->src_area.top < 0 ||
+ red->src_area.top > red->src_area.bottom) {
+ return false;
+ }
+ if (red->src_bitmap->descriptor.type == SPICE_IMAGE_TYPE_BITMAP &&
+ (red->src_area.right > red->src_bitmap->u.bitmap.x ||
+ red->src_area.bottom > red->src_bitmap->u.bitmap.y)) {
+ return false;
+ }
red->rop_descriptor = qxl->rop_descriptor;
red->scale_mode = qxl->scale_mode;
red_get_qmask_ptr(slots, group_id, &red->mask, &qxl->mask, flags);
- return 0;
+ return true;
}
static void red_put_copy(SpiceCopy *red)
@@ -605,27 +735,15 @@ static void red_put_copy(SpiceCopy *red)
red_put_qmask(&red->mask);
}
-static void red_get_blend_ptr(RedMemSlotInfo *slots, int group_id,
- SpiceBlend *red, QXLBlend *qxl, uint32_t flags)
-{
- red->src_bitmap = red_get_image(slots, group_id, qxl->src_bitmap, flags, FALSE);
- red_get_rect_ptr(&red->src_area, &qxl->src_area);
- red->rop_descriptor = qxl->rop_descriptor;
- red->scale_mode = qxl->scale_mode;
- red_get_qmask_ptr(slots, group_id, &red->mask, &qxl->mask, flags);
-}
-
-static void red_put_blend(SpiceBlend *red)
-{
- red_put_image(red->src_bitmap);
- red_put_qmask(&red->mask);
-}
+// these types are really the same thing
+#define red_get_blend_ptr red_get_copy_ptr
+#define red_put_blend red_put_copy
static void red_get_transparent_ptr(RedMemSlotInfo *slots, int group_id,
SpiceTransparent *red, QXLTransparent *qxl,
uint32_t flags)
{
- red->src_bitmap = red_get_image(slots, group_id, qxl->src_bitmap, flags, FALSE);
+ red->src_bitmap = red_get_image(slots, group_id, qxl->src_bitmap, flags, false);
red_get_rect_ptr(&red->src_area, &qxl->src_area);
red->src_color = qxl->src_color;
red->true_color = qxl->true_color;
@@ -642,7 +760,7 @@ static void red_get_alpha_blend_ptr(RedMemSlotInfo *slots, int group_id,
{
red->alpha_flags = qxl->alpha_flags;
red->alpha = qxl->alpha;
- red->src_bitmap = red_get_image(slots, group_id, qxl->src_bitmap, flags, FALSE);
+ red->src_bitmap = red_get_image(slots, group_id, qxl->src_bitmap, flags, false);
red_get_rect_ptr(&red->src_area, &qxl->src_area);
}
@@ -651,7 +769,7 @@ static void red_get_alpha_blend_ptr_compat(RedMemSlotInfo *slots, int group_id,
uint32_t flags)
{
red->alpha = qxl->alpha;
- red->src_bitmap = red_get_image(slots, group_id, qxl->src_bitmap, flags, FALSE);
+ red->src_bitmap = red_get_image(slots, group_id, qxl->src_bitmap, flags, false);
red_get_rect_ptr(&red->src_area, &qxl->src_area);
}
@@ -665,19 +783,19 @@ static bool get_transform(RedMemSlotInfo *slots,
QXLPHYSICAL qxl_transform,
SpiceTransform *dst_transform)
{
- const uint32_t *t = NULL;
- int error;
+ const uint32_t *t = nullptr;
if (qxl_transform == 0)
- return FALSE;
+ return false;
- t = (uint32_t *)get_virt(slots, qxl_transform, sizeof(*dst_transform), group_id, &error);
+ t = static_cast<uint32_t *>(
+ memslot_get_virt(slots, qxl_transform, sizeof(*dst_transform), group_id));
- if (!t || error)
- return FALSE;
+ if (t == nullptr)
+ return false;
memcpy(dst_transform, t, sizeof(*dst_transform));
- return TRUE;
+ return true;
}
static void red_get_composite_ptr(RedMemSlotInfo *slots, int group_id,
@@ -685,17 +803,17 @@ static void red_get_composite_ptr(RedMemSlotInfo *slots, int group_id,
{
red->flags = qxl->flags;
- red->src_bitmap = red_get_image(slots, group_id, qxl->src, flags, FALSE);
+ red->src_bitmap = red_get_image(slots, group_id, qxl->src, flags, false);
if (get_transform(slots, group_id, qxl->src_transform, &red->src_transform))
red->flags |= SPICE_COMPOSITE_HAS_SRC_TRANSFORM;
if (qxl->mask) {
- red->mask_bitmap = red_get_image(slots, group_id, qxl->mask, flags, FALSE);
+ red->mask_bitmap = red_get_image(slots, group_id, qxl->mask, flags, false);
red->flags |= SPICE_COMPOSITE_HAS_MASK;
if (get_transform(slots, group_id, qxl->mask_transform, &red->mask_transform))
red->flags |= SPICE_COMPOSITE_HAS_MASK_TRANSFORM;
} else {
- red->mask_bitmap = NULL;
+ red->mask_bitmap = nullptr;
}
red->src_origin.x = qxl->src_origin.x;
red->src_origin.y = qxl->src_origin.y;
@@ -713,7 +831,7 @@ static void red_put_composite(SpiceComposite *red)
static void red_get_rop3_ptr(RedMemSlotInfo *slots, int group_id,
SpiceRop3 *red, QXLRop3 *qxl, uint32_t flags)
{
- red->src_bitmap = red_get_image(slots, group_id, qxl->src_bitmap, flags, FALSE);
+ red->src_bitmap = red_get_image(slots, group_id, qxl->src_bitmap, flags, false);
red_get_rect_ptr(&red->src_area, &qxl->src_area);
red_get_brush_ptr(slots, group_id, &red->brush, &qxl->brush, flags);
red->rop3 = qxl->rop3;
@@ -728,14 +846,12 @@ static void red_put_rop3(SpiceRop3 *red)
red_put_qmask(&red->mask);
}
-static int red_get_stroke_ptr(RedMemSlotInfo *slots, int group_id,
- SpiceStroke *red, QXLStroke *qxl, uint32_t flags)
+static bool red_get_stroke_ptr(RedMemSlotInfo *slots, int group_id,
+ SpiceStroke *red, QXLStroke *qxl, uint32_t flags)
{
- int error;
-
red->path = red_get_path(slots, group_id, qxl->path);
if (!red->path) {
- return 1;
+ return false;
}
red->attr.flags = qxl->attr.flags;
if (red->attr.flags & SPICE_LINE_FLAGS_STYLED) {
@@ -743,31 +859,32 @@ static int red_get_stroke_ptr(RedMemSlotInfo *slots, int group_id,
uint8_t *buf;
style_nseg = qxl->attr.style_nseg;
- red->attr.style = spice_malloc_n(style_nseg, sizeof(SPICE_FIXED28_4));
+ red->attr.style =
+ static_cast<SPICE_FIXED28_4 *>(g_malloc_n(style_nseg, sizeof(SPICE_FIXED28_4)));
red->attr.style_nseg = style_nseg;
spice_assert(qxl->attr.style);
- buf = (uint8_t *)get_virt(slots, qxl->attr.style,
- style_nseg * sizeof(QXLFIXED), group_id, &error);
- if (error) {
- return error;
+ buf = static_cast<uint8_t *>(
+ memslot_get_virt(slots, qxl->attr.style, style_nseg * sizeof(QXLFIXED), group_id));
+ if (buf == nullptr) {
+ return false;
}
memcpy(red->attr.style, buf, style_nseg * sizeof(QXLFIXED));
} else {
red->attr.style_nseg = 0;
- red->attr.style = NULL;
+ red->attr.style = nullptr;
}
red_get_brush_ptr(slots, group_id, &red->brush, &qxl->brush, flags);
red->fore_mode = qxl->fore_mode;
red->back_mode = qxl->back_mode;
- return 0;
+ return true;
}
static void red_put_stroke(SpiceStroke *red)
{
red_put_brush(&red->brush);
- free(red->path);
+ g_free(red->path);
if (red->attr.flags & SPICE_LINE_FLAGS_STYLED) {
- free(red->attr.style);
+ g_free(red->attr.style);
}
}
@@ -782,56 +899,64 @@ static SpiceString *red_get_string(RedMemSlotInfo *slots, int group_id,
uint8_t *data;
bool free_data;
size_t chunk_size, qxl_size, red_size, glyph_size;
- int glyphs, bpp = 0, i;
- int error;
-
- qxl = (QXLString *)get_virt(slots, addr, sizeof(*qxl), group_id, &error);
- if (error) {
- return NULL;
+ int glyphs, i;
+ /* use unsigned to prevent integer overflow in multiplication below */
+ unsigned int bpp = 0;
+ uint16_t qxl_flags, qxl_length;
+
+ qxl = static_cast<QXLString *>(memslot_get_virt(slots, addr, sizeof(*qxl), group_id));
+ if (qxl == nullptr) {
+ return nullptr;
}
chunk_size = red_get_data_chunks_ptr(slots, group_id,
- get_memslot_id(slots, addr),
+ memslot_get_id(slots, addr),
&chunks, &qxl->chunk);
- if (!chunk_size) {
- /* XXX could be a zero sized string.. */
- return NULL;
+ if (chunk_size == INVALID_SIZE) {
+ return nullptr;
}
data = red_linearize_chunk(&chunks, chunk_size, &free_data);
red_put_data_chunks(&chunks);
qxl_size = qxl->data_size;
+ qxl_flags = qxl->flags;
+ qxl_length = qxl->length;
spice_assert(chunk_size == qxl_size);
- if (qxl->flags & SPICE_STRING_FLAGS_RASTER_A1) {
+ if (qxl_flags & SPICE_STRING_FLAGS_RASTER_A1) {
bpp = 1;
- } else if (qxl->flags & SPICE_STRING_FLAGS_RASTER_A4) {
+ } else if (qxl_flags & SPICE_STRING_FLAGS_RASTER_A4) {
bpp = 4;
- } else if (qxl->flags & SPICE_STRING_FLAGS_RASTER_A8) {
+ } else if (qxl_flags & SPICE_STRING_FLAGS_RASTER_A8) {
bpp = 8;
}
spice_assert(bpp != 0);
- start = (QXLRasterGlyph*)data;
- end = (QXLRasterGlyph*)(data + chunk_size);
+ start = reinterpret_cast<QXLRasterGlyph *>(data);
+ end = reinterpret_cast<QXLRasterGlyph *>(data + chunk_size);
red_size = sizeof(SpiceString);
glyphs = 0;
while (start < end) {
spice_assert((QXLRasterGlyph*)(&start->data[0]) <= end);
glyphs++;
- glyph_size = start->height * ((start->width * bpp + 7) / 8);
+ glyph_size = start->height * ((start->width * bpp + 7U) / 8U);
red_size += sizeof(SpiceRasterGlyph *) + SPICE_ALIGN(sizeof(SpiceRasterGlyph) + glyph_size, 4);
- start = (QXLRasterGlyph*)(&start->data[glyph_size]);
+ /* do the test correctly, we know end - start->data[0] cannot
+ * overflow, don't use start->data[glyph_size] to test for
+ * buffer overflow as this on 32 bit can cause overflow
+ * on the pointer arithmetic */
+ spice_assert(glyph_size <= (char*) end - (char*) &start->data[0]);
+ start = reinterpret_cast<QXLRasterGlyph *>(&start->data[glyph_size]);
}
spice_assert(start <= end);
- spice_assert(glyphs == qxl->length);
+ spice_assert(glyphs == qxl_length);
- red = spice_malloc(red_size);
- red->length = qxl->length;
- red->flags = qxl->flags;
+ red = static_cast<SpiceString *>(g_malloc(red_size));
+ red->length = qxl_length;
+ red->flags = qxl_flags;
- start = (QXLRasterGlyph*)data;
- end = (QXLRasterGlyph*)(data + chunk_size);
- glyph = (SpiceRasterGlyph *)&red->glyphs[red->length];
+ start = reinterpret_cast<QXLRasterGlyph *>(data);
+ end = reinterpret_cast<QXLRasterGlyph *>(data + chunk_size);
+ glyph = reinterpret_cast<SpiceRasterGlyph *>(&red->glyphs[red->length]);
for (i = 0; i < red->length; i++) {
spice_assert((QXLRasterGlyph*)(&start->data[0]) <= end);
red->glyphs[i] = glyph;
@@ -839,17 +964,18 @@ static SpiceString *red_get_string(RedMemSlotInfo *slots, int group_id,
glyph->height = start->height;
red_get_point_ptr(&glyph->render_pos, &start->render_pos);
red_get_point_ptr(&glyph->glyph_origin, &start->glyph_origin);
- glyph_size = glyph->height * ((glyph->width * bpp + 7) / 8);
- spice_assert((QXLRasterGlyph*)(&start->data[glyph_size]) <= end);
+ glyph_size = glyph->height * ((glyph->width * bpp + 7U) / 8U);
+ /* see above for similar test */
+ spice_assert(glyph_size <= (char*) end - (char*) &start->data[0]);
memcpy(glyph->data, start->data, glyph_size);
- start = (QXLRasterGlyph*)(&start->data[glyph_size]);
- glyph = (SpiceRasterGlyph*)
+ start = reinterpret_cast<QXLRasterGlyph *>(&start->data[glyph_size]);
+ glyph = SPICE_ALIGNED_CAST(SpiceRasterGlyph*,
(((uint8_t *)glyph) +
- SPICE_ALIGN(sizeof(SpiceRasterGlyph) + glyph_size, 4));
+ SPICE_ALIGN(sizeof(SpiceRasterGlyph) + glyph_size, 4)));
}
if (free_data) {
- free(data);
+ g_free(data);
}
return red;
}
@@ -867,7 +993,7 @@ static void red_get_text_ptr(RedMemSlotInfo *slots, int group_id,
static void red_put_text_ptr(SpiceText *red)
{
- free(red->str);
+ g_free(red->str);
red_put_brush(&red->fore_brush);
red_put_brush(&red->back_brush);
}
@@ -883,27 +1009,10 @@ static void red_put_whiteness(SpiceWhiteness *red)
red_put_qmask(&red->mask);
}
-static void red_get_blackness_ptr(RedMemSlotInfo *slots, int group_id,
- SpiceBlackness *red, QXLBlackness *qxl, uint32_t flags)
-{
- red_get_qmask_ptr(slots, group_id, &red->mask, &qxl->mask, flags);
-}
-
-static void red_put_blackness(SpiceWhiteness *red)
-{
- red_put_qmask(&red->mask);
-}
-
-static void red_get_invers_ptr(RedMemSlotInfo *slots, int group_id,
- SpiceInvers *red, QXLInvers *qxl, uint32_t flags)
-{
- red_get_qmask_ptr(slots, group_id, &red->mask, &qxl->mask, flags);
-}
-
-static void red_put_invers(SpiceWhiteness *red)
-{
- red_put_qmask(&red->mask);
-}
+#define red_get_invers_ptr red_get_whiteness_ptr
+#define red_get_blackness_ptr red_get_whiteness_ptr
+#define red_put_invers red_put_whiteness
+#define red_put_blackness red_put_whiteness
static void red_get_clip_ptr(RedMemSlotInfo *slots, int group_id,
SpiceClip *red, QXLClip *qxl)
@@ -920,23 +1029,22 @@ static void red_put_clip(SpiceClip *red)
{
switch (red->type) {
case SPICE_CLIP_TYPE_RECTS:
- free(red->rects);
+ g_free(red->rects);
break;
}
}
-static int red_get_native_drawable(RedMemSlotInfo *slots, int group_id,
- RedDrawable *red, QXLPHYSICAL addr, uint32_t flags)
+static bool red_get_native_drawable(QXLInstance *qxl_instance, RedMemSlotInfo *slots, int group_id,
+ RedDrawable *red, QXLPHYSICAL addr, uint32_t flags)
{
QXLDrawable *qxl;
int i;
- int error = 0;
- qxl = (QXLDrawable *)get_virt(slots, addr, sizeof(*qxl), group_id, &error);
- if (error) {
- return error;
+ qxl = static_cast<QXLDrawable *>(memslot_get_virt(slots, addr, sizeof(*qxl), group_id));
+ if (qxl == nullptr) {
+ return false;
}
- red->release_info = &qxl->release_info;
+ red->set_resource(qxl_instance, &qxl->release_info, group_id);
red_get_rect_ptr(&red->bbox, &qxl->bbox);
red_get_clip_ptr(slots, group_id, &red->clip, &qxl->clip);
@@ -947,7 +1055,7 @@ static int red_get_native_drawable(RedMemSlotInfo *slots, int group_id,
red->surface_id = qxl->surface_id;
for (i = 0; i < 3; i++) {
- red->surfaces_dest[i] = qxl->surfaces_dest[i];
+ red->surface_deps[i] = qxl->surfaces_dest[i];
red_get_rect_ptr(&red->surfaces_rects[i], &qxl->surfaces_rects[i]);
}
@@ -962,11 +1070,9 @@ static int red_get_native_drawable(RedMemSlotInfo *slots, int group_id,
&red->u.blackness, &qxl->u.blackness, flags);
break;
case QXL_DRAW_BLEND:
- red_get_blend_ptr(slots, group_id, &red->u.blend, &qxl->u.blend, flags);
- break;
+ return red_get_blend_ptr(slots, group_id, red, &qxl->u.blend, flags);
case QXL_DRAW_COPY:
- error = red_get_copy_ptr(slots, group_id, &red->u.copy, &qxl->u.copy, flags);
- break;
+ return red_get_copy_ptr(slots, group_id, red, &qxl->u.copy, flags);
case QXL_COPY_BITS:
red_get_point_ptr(&red->u.copy_bits.src_pos, &qxl->u.copy_bits.src_pos);
break;
@@ -988,8 +1094,7 @@ static int red_get_native_drawable(RedMemSlotInfo *slots, int group_id,
red_get_composite_ptr(slots, group_id, &red->u.composite, &qxl->u.composite, flags);
break;
case QXL_DRAW_STROKE:
- error = red_get_stroke_ptr(slots, group_id, &red->u.stroke, &qxl->u.stroke, flags);
- break;
+ return red_get_stroke_ptr(slots, group_id, &red->u.stroke, &qxl->u.stroke, flags);
case QXL_DRAW_TEXT:
red_get_text_ptr(slots, group_id, &red->u.text, &qxl->u.text, flags);
break;
@@ -1003,23 +1108,21 @@ static int red_get_native_drawable(RedMemSlotInfo *slots, int group_id,
break;
default:
spice_warning("unknown type %d", red->type);
- error = 1;
- break;
+ return false;
};
- return error;
+ return true;
}
-static int red_get_compat_drawable(RedMemSlotInfo *slots, int group_id,
- RedDrawable *red, QXLPHYSICAL addr, uint32_t flags)
+static bool red_get_compat_drawable(QXLInstance *qxl_instance, RedMemSlotInfo *slots, int group_id,
+ RedDrawable *red, QXLPHYSICAL addr, uint32_t flags)
{
QXLCompatDrawable *qxl;
- int error;
- qxl = (QXLCompatDrawable *)get_virt(slots, addr, sizeof(*qxl), group_id, &error);
- if (error) {
- return error;
+ qxl = static_cast<QXLCompatDrawable *>(memslot_get_virt(slots, addr, sizeof(*qxl), group_id));
+ if (qxl == nullptr) {
+ return false;
}
- red->release_info = &qxl->release_info;
+ red->set_resource(qxl_instance, &qxl->release_info, group_id);
red_get_rect_ptr(&red->bbox, &qxl->bbox);
red_get_clip_ptr(slots, group_id, &red->clip, &qxl->clip);
@@ -1029,9 +1132,9 @@ static int red_get_compat_drawable(RedMemSlotInfo *slots, int group_id,
red->self_bitmap = (qxl->bitmap_offset != 0);
red_get_rect_ptr(&red->self_bitmap_area, &qxl->bitmap_area);
- red->surfaces_dest[0] = -1;
- red->surfaces_dest[1] = -1;
- red->surfaces_dest[2] = -1;
+ red->surface_deps[0] = -1;
+ red->surface_deps[1] = -1;
+ red->surface_deps[2] = -1;
red->type = qxl->type;
switch (red->type) {
@@ -1044,14 +1147,12 @@ static int red_get_compat_drawable(RedMemSlotInfo *slots, int group_id,
&red->u.blackness, &qxl->u.blackness, flags);
break;
case QXL_DRAW_BLEND:
- red_get_blend_ptr(slots, group_id, &red->u.blend, &qxl->u.blend, flags);
- break;
+ return red_get_blend_ptr(slots, group_id, red, &qxl->u.blend, flags);
case QXL_DRAW_COPY:
- error = red_get_copy_ptr(slots, group_id, &red->u.copy, &qxl->u.copy, flags);
- break;
+ return red_get_copy_ptr(slots, group_id, red, &qxl->u.copy, flags);
case QXL_COPY_BITS:
red_get_point_ptr(&red->u.copy_bits.src_pos, &qxl->u.copy_bits.src_pos);
- red->surfaces_dest[0] = 0;
+ red->surface_deps[0] = 0;
red->surfaces_rects[0].left = red->u.copy_bits.src_pos.x;
red->surfaces_rects[0].right = red->u.copy_bits.src_pos.x +
(red->bbox.right - red->bbox.left);
@@ -1074,8 +1175,7 @@ static int red_get_compat_drawable(RedMemSlotInfo *slots, int group_id,
red_get_rop3_ptr(slots, group_id, &red->u.rop3, &qxl->u.rop3, flags);
break;
case QXL_DRAW_STROKE:
- error = red_get_stroke_ptr(slots, group_id, &red->u.stroke, &qxl->u.stroke, flags);
- break;
+ return red_get_stroke_ptr(slots, group_id, &red->u.stroke, &qxl->u.stroke, flags);
case QXL_DRAW_TEXT:
red_get_text_ptr(slots, group_id, &red->u.text, &qxl->u.text, flags);
break;
@@ -1089,102 +1189,125 @@ static int red_get_compat_drawable(RedMemSlotInfo *slots, int group_id,
break;
default:
spice_warning("unknown type %d", red->type);
- error = 1;
- break;
+ return false;
};
- return error;
+ return true;
}
-int red_get_drawable(RedMemSlotInfo *slots, int group_id,
- RedDrawable *red, QXLPHYSICAL addr, uint32_t flags)
+static bool red_get_drawable(QXLInstance *qxl, RedMemSlotInfo *slots, int group_id,
+ RedDrawable *red, QXLPHYSICAL addr, uint32_t flags)
{
- int ret;
+ bool ret;
if (flags & QXL_COMMAND_FLAG_COMPAT) {
- ret = red_get_compat_drawable(slots, group_id, red, addr, flags);
+ ret = red_get_compat_drawable(qxl, slots, group_id, red, addr, flags);
} else {
- ret = red_get_native_drawable(slots, group_id, red, addr, flags);
+ ret = red_get_native_drawable(qxl, slots, group_id, red, addr, flags);
}
return ret;
}
-void red_put_drawable(RedDrawable *red)
+RedDrawable::~RedDrawable()
{
- red_put_clip(&red->clip);
- if (red->self_bitmap_image) {
- red_put_image(red->self_bitmap_image);
+ red_put_clip(&clip);
+ if (self_bitmap_image) {
+ red_put_image(self_bitmap_image);
}
- switch (red->type) {
+ switch (type) {
case QXL_DRAW_ALPHA_BLEND:
- red_put_alpha_blend(&red->u.alpha_blend);
+ red_put_alpha_blend(&u.alpha_blend);
break;
case QXL_DRAW_BLACKNESS:
- red_put_blackness(&red->u.blackness);
+ red_put_blackness(&u.blackness);
break;
case QXL_DRAW_BLEND:
- red_put_blend(&red->u.blend);
+ red_put_blend(&u.blend);
break;
case QXL_DRAW_COPY:
- red_put_copy(&red->u.copy);
+ red_put_copy(&u.copy);
break;
case QXL_DRAW_FILL:
- red_put_fill(&red->u.fill);
+ red_put_fill(&u.fill);
break;
case QXL_DRAW_OPAQUE:
- red_put_opaque(&red->u.opaque);
+ red_put_opaque(&u.opaque);
break;
case QXL_DRAW_INVERS:
- red_put_invers(&red->u.invers);
+ red_put_invers(&u.invers);
break;
case QXL_DRAW_ROP3:
- red_put_rop3(&red->u.rop3);
+ red_put_rop3(&u.rop3);
break;
case QXL_DRAW_COMPOSITE:
- red_put_composite(&red->u.composite);
+ red_put_composite(&u.composite);
break;
case QXL_DRAW_STROKE:
- red_put_stroke(&red->u.stroke);
+ red_put_stroke(&u.stroke);
break;
case QXL_DRAW_TEXT:
- red_put_text_ptr(&red->u.text);
+ red_put_text_ptr(&u.text);
break;
case QXL_DRAW_TRANSPARENT:
- red_put_transparent(&red->u.transparent);
+ red_put_transparent(&u.transparent);
break;
case QXL_DRAW_WHITENESS:
- red_put_whiteness(&red->u.whiteness);
+ red_put_whiteness(&u.whiteness);
break;
}
}
-int red_get_update_cmd(RedMemSlotInfo *slots, int group_id,
- RedUpdateCmd *red, QXLPHYSICAL addr)
+red::shared_ptr<RedDrawable>
+red_drawable_new(QXLInstance *qxl, RedMemSlotInfo *slots,
+ int group_id, QXLPHYSICAL addr, uint32_t flags)
+{
+ auto red = red::make_shared<RedDrawable>();
+
+ if (!red_get_drawable(qxl, slots, group_id, red.get(), addr, flags)) {
+ red.reset();
+ }
+
+ return red;
+}
+
+static bool red_get_update_cmd(QXLInstance *qxl_instance, RedMemSlotInfo *slots, int group_id,
+ RedUpdateCmd *red, QXLPHYSICAL addr)
{
QXLUpdateCmd *qxl;
- int error;
- qxl = (QXLUpdateCmd *)get_virt(slots, addr, sizeof(*qxl), group_id, &error);
- if (error) {
- return 1;
+ qxl = static_cast<QXLUpdateCmd *>(memslot_get_virt(slots, addr, sizeof(*qxl), group_id));
+ if (qxl == nullptr) {
+ return false;
}
- red->release_info = &qxl->release_info;
+ red->set_resource(qxl_instance, &qxl->release_info, group_id);
red_get_rect_ptr(&red->area, &qxl->area);
red->update_id = qxl->update_id;
red->surface_id = qxl->surface_id;
- return 0;
+ return true;
}
-void red_put_update_cmd(RedUpdateCmd *red)
+RedUpdateCmd::~RedUpdateCmd() = default;
+
+red::shared_ptr<const RedUpdateCmd>
+red_update_cmd_new(QXLInstance *qxl, RedMemSlotInfo *slots,
+ int group_id, QXLPHYSICAL addr)
{
- /* nothing yet */
+ auto red = red::make_shared<RedUpdateCmd>();
+
+ if (!red_get_update_cmd(qxl, slots, group_id, red.get(), addr)) {
+ red.reset();
+ }
+
+ return red;
}
-int red_get_message(RedMemSlotInfo *slots, int group_id,
- RedMessage *red, QXLPHYSICAL addr)
+static bool red_get_message(QXLInstance *qxl_instance, RedMemSlotInfo *slots, int group_id,
+ RedMessage *red, QXLPHYSICAL addr)
{
QXLMessage *qxl;
- int error;
+ int memslot_id;
+ uintptr_t len;
+ uint8_t *end;
/*
* security alert:
@@ -1192,33 +1315,92 @@ int red_get_message(RedMemSlotInfo *slots, int group_id,
* luckily this is for debug logging only,
* so we can just ignore it by default.
*/
- qxl = (QXLMessage *)get_virt(slots, addr, sizeof(*qxl), group_id, &error);
- if (error) {
+ qxl = static_cast<QXLMessage *>(memslot_get_virt(slots, addr, sizeof(*qxl), group_id));
+ if (qxl == nullptr) {
+ return false;
+ }
+ red->set_resource(qxl_instance, &qxl->release_info, group_id);
+ red->data = qxl->data;
+ memslot_id = memslot_get_id(slots, addr+sizeof(*qxl));
+ len = memslot_max_size_virt(slots, ((intptr_t) qxl)+sizeof(*qxl), memslot_id, group_id);
+ len = MIN(len, 100000);
+ end = static_cast<uint8_t *>(memchr(qxl->data, 0, len));
+ if (end == nullptr) {
+ return false;
+ }
+ red->len = end - qxl->data;
+ return true;
+}
+
+RedMessage::~RedMessage() = default;
+
+red::shared_ptr<const RedMessage>
+red_message_new(QXLInstance *qxl, RedMemSlotInfo *slots,
+ int group_id, QXLPHYSICAL addr)
+{
+ auto red = red::make_shared<RedMessage>();
+
+ if (!red_get_message(qxl, slots, group_id, red.get(), addr)) {
+ red.reset();
+ }
+
+ return red;
+}
+
+static unsigned int surface_format_to_bpp(uint32_t format)
+{
+ switch (format) {
+ case SPICE_SURFACE_FMT_1_A:
return 1;
+ case SPICE_SURFACE_FMT_8_A:
+ return 8;
+ case SPICE_SURFACE_FMT_16_555:
+ case SPICE_SURFACE_FMT_16_565:
+ return 16;
+ case SPICE_SURFACE_FMT_32_xRGB:
+ case SPICE_SURFACE_FMT_32_ARGB:
+ return 32;
}
- red->release_info = &qxl->release_info;
- red->data = qxl->data;
return 0;
}
-void red_put_message(RedMessage *red)
+bool red_validate_surface(uint32_t width, uint32_t height,
+ int32_t stride, uint32_t format)
{
- /* nothing yet */
+ unsigned int bpp;
+ uint64_t size;
+
+ bpp = surface_format_to_bpp(format);
+
+ /* check if format is valid */
+ if (!bpp) {
+ return false;
+ }
+
+ /* check stride is larger than required bytes */
+ size = (uint64_t{width} * bpp + 7U) / 8U;
+ /* the uint32_t conversion is here to avoid problems with -2^31 value */
+ if (stride == G_MININT32 || size > uint32_t{abs(stride)}) {
+ return false;
+ }
+
+ /* the multiplication can overflow, also abs(-2^31) may return a negative value */
+ size = uint64_t{height} * abs(stride);
+ return size <= MAX_DATA_CHUNK;
}
-int red_get_surface_cmd(RedMemSlotInfo *slots, int group_id,
- RedSurfaceCmd *red, QXLPHYSICAL addr)
+static bool red_get_surface_cmd(QXLInstance *qxl_instance, RedMemSlotInfo *slots, int group_id,
+ RedSurfaceCmd *red, QXLPHYSICAL addr)
+
{
QXLSurfaceCmd *qxl;
- size_t size;
- int error;
+ uint64_t size;
- qxl = (QXLSurfaceCmd *)get_virt(slots, addr, sizeof(*qxl), group_id,
- &error);
- if (error) {
- return 1;
+ qxl = static_cast<QXLSurfaceCmd *>(memslot_get_virt(slots, addr, sizeof(*qxl), group_id));
+ if (qxl == nullptr) {
+ return false;
}
- red->release_info = &qxl->release_info;
+ red->set_resource(qxl_instance, &qxl->release_info, group_id);
red->surface_id = qxl->surface_id;
red->type = qxl->type;
@@ -1230,35 +1412,50 @@ int red_get_surface_cmd(RedMemSlotInfo *slots, int group_id,
red->u.surface_create.width = qxl->u.surface_create.width;
red->u.surface_create.height = qxl->u.surface_create.height;
red->u.surface_create.stride = qxl->u.surface_create.stride;
+
+ if (!red_validate_surface(red->u.surface_create.width, red->u.surface_create.height,
+ red->u.surface_create.stride, red->u.surface_create.format)) {
+ return false;
+ }
+
size = red->u.surface_create.height * abs(red->u.surface_create.stride);
- red->u.surface_create.data =
- (uint8_t*)get_virt(slots, qxl->u.surface_create.data, size, group_id, &error);
- if (error) {
- return 1;
+ red->u.surface_create.data = static_cast<uint8_t *>(
+ memslot_get_virt(slots, qxl->u.surface_create.data, size, group_id));
+ if (red->u.surface_create.data == nullptr) {
+ return false;
}
break;
}
- return 0;
+ return true;
}
-void red_put_surface_cmd(RedSurfaceCmd *red)
+RedSurfaceCmd::~RedSurfaceCmd() = default;
+
+red::shared_ptr<const RedSurfaceCmd>
+red_surface_cmd_new(QXLInstance *qxl_instance, RedMemSlotInfo *slots,
+ int group_id, QXLPHYSICAL addr)
{
- /* nothing yet */
+ auto cmd = red::make_shared<RedSurfaceCmd>();
+
+ if (!red_get_surface_cmd(qxl_instance, slots, group_id, cmd.get(), addr)) {
+ cmd.reset();
+ }
+
+ return cmd;
}
-static int red_get_cursor(RedMemSlotInfo *slots, int group_id,
- SpiceCursor *red, QXLPHYSICAL addr)
+static bool red_get_cursor(RedMemSlotInfo *slots, int group_id,
+ SpiceCursor *red, QXLPHYSICAL addr)
{
QXLCursor *qxl;
RedDataChunk chunks;
size_t size;
uint8_t *data;
bool free_data;
- int error;
- qxl = (QXLCursor *)get_virt(slots, addr, sizeof(*qxl), group_id, &error);
- if (error) {
- return 1;
+ qxl = static_cast<QXLCursor *>(memslot_get_virt(slots, addr, sizeof(*qxl), group_id));
+ if (qxl == nullptr) {
+ return false;
}
red->header.unique = qxl->header.unique;
@@ -1271,43 +1468,49 @@ static int red_get_cursor(RedMemSlotInfo *slots, int group_id,
red->flags = 0;
red->data_size = qxl->data_size;
size = red_get_data_chunks_ptr(slots, group_id,
- get_memslot_id(slots, addr),
+ memslot_get_id(slots, addr),
&chunks, &qxl->chunk);
+ if (size == INVALID_SIZE) {
+ return false;
+ }
+ red->data_size = MIN(red->data_size, size);
data = red_linearize_chunk(&chunks, size, &free_data);
red_put_data_chunks(&chunks);
if (free_data) {
red->data = data;
} else {
- red->data = spice_malloc(size);
- memcpy(red->data, data, size);
+ red->data = static_cast<uint8_t *>(g_memdup2(data, size));
}
- return 0;
+ // Arrived here we could note that we are not going to use anymore cursor data
+ // and we could be tempted to release resource back to QXL. Don't do that!
+ // If machine is migrated we will get cursor data back so we need to hold this
+ // data for migration
+ return true;
}
static void red_put_cursor(SpiceCursor *red)
{
- free(red->data);
+ g_free(red->data);
}
-int red_get_cursor_cmd(RedMemSlotInfo *slots, int group_id,
- RedCursorCmd *red, QXLPHYSICAL addr)
+static bool red_get_cursor_cmd(QXLInstance *qxl_instance, RedMemSlotInfo *slots,
+ int group_id, RedCursorCmd *red,
+ QXLPHYSICAL addr)
{
QXLCursorCmd *qxl;
- int error;
- qxl = (QXLCursorCmd *)get_virt(slots, addr, sizeof(*qxl), group_id, &error);
- if (error) {
- return error;
+ qxl = static_cast<QXLCursorCmd *>(memslot_get_virt(slots, addr, sizeof(*qxl), group_id));
+ if (qxl == nullptr) {
+ return false;
}
- red->release_info = &qxl->release_info;
+ red->set_resource(qxl_instance, &qxl->release_info, group_id);
red->type = qxl->type;
switch (red->type) {
case QXL_CURSOR_SET:
red_get_point16_ptr(&red->u.set.position, &qxl->u.set.position);
red->u.set.visible = qxl->u.set.visible;
- error = red_get_cursor(slots, group_id, &red->u.set.shape, qxl->u.set.shape);
- break;
+ return red_get_cursor(slots, group_id, &red->u.set.shape, qxl->u.set.shape);
case QXL_CURSOR_MOVE:
red_get_point16_ptr(&red->u.position, &qxl->u.position);
break;
@@ -1316,14 +1519,26 @@ int red_get_cursor_cmd(RedMemSlotInfo *slots, int group_id,
red->u.trail.frequency = qxl->u.trail.frequency;
break;
}
- return error;
+ return true;
}
-void red_put_cursor_cmd(RedCursorCmd *red)
+red::shared_ptr<const RedCursorCmd>
+red_cursor_cmd_new(QXLInstance *qxl, RedMemSlotInfo *slots, int group_id, QXLPHYSICAL addr)
{
- switch (red->type) {
+ auto cmd = red::make_shared<RedCursorCmd>();
+
+ if (!red_get_cursor_cmd(qxl, slots, group_id, cmd.get(), addr)) {
+ cmd.reset();
+ }
+
+ return cmd;
+}
+
+RedCursorCmd::~RedCursorCmd()
+{
+ switch (type) {
case QXL_CURSOR_SET:
- red_put_cursor(&red->u.set.shape);
+ red_put_cursor(&u.set.shape);
break;
}
}
diff --git a/server/red_parse_qxl.h b/server/red-parse-qxl.h
index 3adc9fa7..8bf0e2e3 100644
--- a/server/red_parse_qxl.h
+++ b/server/red-parse-qxl.h
@@ -16,16 +16,28 @@
License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef RED_ABI_TRANSLATE_H
-#define RED_ABI_TRANSLATE_H
+#ifndef RED_PARSE_QXL_H_
+#define RED_PARSE_QXL_H_
#include <spice/qxl_dev.h>
-#include "red_common.h"
-#include "red_memslots.h"
-typedef struct RedDrawable {
- int refs;
- QXLReleaseInfo *release_info;
+#include "red-common.h"
+#include "memslot.h"
+#include "utils.hpp"
+
+#include "push-visibility.h"
+
+template <typename T>
+struct RedQXLResource: public red::simple_ptr_counted<T> {
+ ~RedQXLResource();
+ void set_resource(QXLInstance *qxl, QXLReleaseInfo *info, uint32_t group_id);
+private:
+ QXLInstance *qxl = nullptr;
+ QXLReleaseInfoExt release_info_ext;
+};
+
+struct RedDrawable final: public RedQXLResource<RedDrawable> {
+ ~RedDrawable();
uint32_t surface_id;
uint8_t effect;
uint8_t type;
@@ -35,7 +47,7 @@ typedef struct RedDrawable {
SpiceRect bbox;
SpiceClip clip;
uint32_t mm_time;
- int32_t surfaces_dest[3];
+ int32_t surface_deps[3];
SpiceRect surfaces_rects[3];
union {
SpiceFill fill;
@@ -55,48 +67,41 @@ typedef struct RedDrawable {
SpiceWhiteness whiteness;
SpiceComposite composite;
} u;
-} RedDrawable;
+};
-typedef struct RedUpdateCmd {
- QXLReleaseInfo *release_info;
+struct RedUpdateCmd final: public RedQXLResource<RedUpdateCmd> {
+ ~RedUpdateCmd();
SpiceRect area;
uint32_t update_id;
uint32_t surface_id;
-} RedUpdateCmd;
-
-typedef struct RedMessage {
- QXLReleaseInfo *release_info;
- uint8_t *data;
-} RedMessage;
+};
-typedef struct RedDataChunk RedDataChunk;
-struct RedDataChunk {
- uint32_t data_size;
- RedDataChunk *prev_chunk;
- RedDataChunk *next_chunk;
+struct RedMessage final: public RedQXLResource<RedMessage> {
+ ~RedMessage();
+ int len;
uint8_t *data;
};
-typedef struct RedSurfaceCreate {
+struct RedSurfaceCreate {
uint32_t format;
uint32_t width;
uint32_t height;
int32_t stride;
uint8_t *data;
-} RedSurfaceCreate;
+};
-typedef struct RedSurfaceCmd {
- QXLReleaseInfo *release_info;
+struct RedSurfaceCmd final: public RedQXLResource<RedSurfaceCmd> {
+ ~RedSurfaceCmd();
uint32_t surface_id;
uint8_t type;
uint32_t flags;
union {
RedSurfaceCreate surface_create;
} u;
-} RedSurfaceCmd;
+};
-typedef struct RedCursorCmd {
- QXLReleaseInfo *release_info;
+struct RedCursorCmd final: public RedQXLResource<RedCursorCmd> {
+ ~RedCursorCmd();
uint8_t type;
union {
struct {
@@ -110,30 +115,32 @@ typedef struct RedCursorCmd {
} trail;
SpicePoint16 position;
} u;
- uint8_t *device_data;
-} RedCursorCmd;
+};
void red_get_rect_ptr(SpiceRect *red, const QXLRect *qxl);
-int red_get_drawable(RedMemSlotInfo *slots, int group_id,
- RedDrawable *red, QXLPHYSICAL addr, uint32_t flags);
-void red_put_drawable(RedDrawable *red);
-void red_put_image(SpiceImage *red);
+red::shared_ptr<RedDrawable>
+red_drawable_new(QXLInstance *qxl, RedMemSlotInfo *slots,
+ int group_id, QXLPHYSICAL addr, uint32_t flags);
+
+red::shared_ptr<const RedUpdateCmd>
+red_update_cmd_new(QXLInstance *qxl, RedMemSlotInfo *slots,
+ int group_id, QXLPHYSICAL addr);
+
+red::shared_ptr<const RedMessage>
+red_message_new(QXLInstance *qxl, RedMemSlotInfo *slots,
+ int group_id, QXLPHYSICAL addr);
-int red_get_update_cmd(RedMemSlotInfo *slots, int group_id,
- RedUpdateCmd *red, QXLPHYSICAL addr);
-void red_put_update_cmd(RedUpdateCmd *red);
+bool red_validate_surface(uint32_t width, uint32_t height,
+ int32_t stride, uint32_t format);
-int red_get_message(RedMemSlotInfo *slots, int group_id,
- RedMessage *red, QXLPHYSICAL addr);
-void red_put_message(RedMessage *red);
+red::shared_ptr<const RedSurfaceCmd>
+red_surface_cmd_new(QXLInstance *qxl_instance, RedMemSlotInfo *slots,
+ int group_id, QXLPHYSICAL addr);
-int red_get_surface_cmd(RedMemSlotInfo *slots, int group_id,
- RedSurfaceCmd *red, QXLPHYSICAL addr);
-void red_put_surface_cmd(RedSurfaceCmd *red);
+red::shared_ptr<const RedCursorCmd>
+red_cursor_cmd_new(QXLInstance *qxl, RedMemSlotInfo *slots, int group_id, QXLPHYSICAL addr);
-int red_get_cursor_cmd(RedMemSlotInfo *slots, int group_id,
- RedCursorCmd *red, QXLPHYSICAL addr);
-void red_put_cursor_cmd(RedCursorCmd *red);
+#include "pop-visibility.h"
-#endif
+#endif /* RED_PARSE_QXL_H_ */
diff --git a/client/windows/red_pixmap.cpp b/server/red-pipe-item.cpp
index 6685e416..12b991ff 100644
--- a/client/windows/red_pixmap.cpp
+++ b/server/red-pipe-item.cpp
@@ -1,5 +1,6 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
/*
- Copyright (C) 2009 Red Hat, Inc.
+ Copyright (C) 2016 Red Hat, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@@ -14,31 +15,25 @@
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
-#ifdef HAVE_CONFIG_H
#include <config.h>
-#endif
-#include "common.h"
-#include "red_pixmap.h"
-#include "debug.h"
-#include "utils.h"
+#include "red-channel.h"
+#include "red-pipe-item.h"
-RedPixmap::RedPixmap(int width, int height, RedDrawable::Format format,
- bool top_bottom)
- : _format (format)
- , _width (width)
- , _height (height)
- , _stride (SPICE_ALIGN(width * format_to_bpp(format), 32) / 8)
- , _top_bottom (top_bottom)
- , _data (NULL)
+RedPipeItem::RedPipeItem(int init_type):
+ type(init_type)
{
}
-RedPixmap::~RedPixmap()
+static void marshaller_unref_pipe_item(uint8_t *, void *opaque)
{
+ auto item = static_cast<RedPipeItem *>(opaque);
+ shared_ptr_unref(item);
}
-bool RedPixmap::is_big_endian_bits()
+void RedPipeItem::add_to_marshaller(SpiceMarshaller *m, uint8_t *data, size_t size)
{
- return _format == RedDrawable::A1;
+ shared_ptr_add_ref(this);
+ spice_marshaller_add_by_ref_full(m, data, size,
+ marshaller_unref_pipe_item, this);
}
diff --git a/server/red-pipe-item.h b/server/red-pipe-item.h
new file mode 100644
index 00000000..10e5a12c
--- /dev/null
+++ b/server/red-pipe-item.h
@@ -0,0 +1,83 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2016 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @file red-pipe-item.h
+ * Generic declaration for objects contained in RedChannelClient pipe.
+ */
+#ifndef RED_PIPE_ITEM_H_
+#define RED_PIPE_ITEM_H_
+
+#include "red-common.h"
+#include "utils.hpp"
+
+#include "push-visibility.h"
+
+/**
+ * Base class for objects contained in RedChannelClient pipe
+ */
+struct RedPipeItem: public red::shared_ptr_counted
+{
+ SPICE_CXX_GLIB_ALLOCATOR
+ void *operator new(size_t len, void *p)
+ {
+ return p;
+ }
+
+ /**
+ * Allows to allocate a pipe item with additional space at the end.
+ *
+ * Used with structures like
+ * @code{.cpp}
+ * struct NameItem: public RedPipeItem {
+ * ...
+ * char name[];
+ * }
+ * ...
+ * auto name_item = red::shared_ptr<NameItem>(new (6) NameItem(...));
+ * strcpy(name_item->name, "hello");
+ * @endcode
+ */
+ void *operator new(size_t size, size_t additional)
+ {
+ return g_malloc(size + additional);
+ }
+
+ RedPipeItem(int type);
+ const int type;
+
+ void add_to_marshaller(SpiceMarshaller *m, uint8_t *data, size_t size);
+};
+
+typedef red::shared_ptr<RedPipeItem> RedPipeItemPtr;
+
+/* Most of the time the type is constant and we just add fields,
+ * make it easier to initialize just with declaration
+ */
+template <int initial_type>
+struct RedPipeItemNum: public RedPipeItem
+{
+ RedPipeItemNum():
+ RedPipeItem(initial_type)
+ {
+ }
+};
+
+#include "pop-visibility.h"
+
+#endif /* RED_PIPE_ITEM_H_ */
diff --git a/server/red-qxl.cpp b/server/red-qxl.cpp
new file mode 100644
index 00000000..48c293ae
--- /dev/null
+++ b/server/red-qxl.cpp
@@ -0,0 +1,775 @@
+/*
+ Copyright (C) 2009 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+
+#include <cerrno>
+#include <cinttypes>
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
+
+#include <pthread.h>
+#include <unistd.h>
+
+#include <spice/qxl_dev.h>
+#include <common/quic.h>
+#include <common/sw_canvas.h>
+
+#include "spice-wrapped.h"
+#include "red-worker.h"
+#include "reds.h"
+#include "dispatcher.h"
+#include "red-parse-qxl.h"
+#include "red-channel-client.h"
+#include "display-limits.h"
+
+#include "red-qxl.h"
+
+
+#define MAX_MONITORS_COUNT 16
+
+struct QXLState {
+ SPICE_CXX_GLIB_ALLOCATOR
+ QXLInstance *qxl;
+ red::shared_ptr<Dispatcher> dispatcher;
+ uint32_t pending;
+ int primary_active;
+ int x_res;
+ int y_res;
+ int use_hardware_cursor;
+ unsigned int max_monitors;
+ RedsState *reds;
+ RedWorker *worker;
+ char device_address[MAX_DEVICE_ADDRESS_LEN];
+ uint32_t device_display_ids[MAX_MONITORS_COUNT];
+ size_t monitors_count; // length of ^^^
+
+ bool running;
+
+ pthread_mutex_t scanout_mutex;
+ SpiceMsgDisplayGlScanoutUnix scanout;
+ uint64_t gl_draw_cookie;
+
+ template <typename T>
+ inline void send_message(T& message);
+};
+
+#define GL_DRAW_COOKIE_INVALID (~((uint64_t) 0))
+
+/* used by RedWorker */
+bool red_qxl_is_running(QXLInstance *qxl)
+{
+ return qxl->st->running;
+}
+
+/* used by RedWorker */
+void red_qxl_set_running(QXLInstance *qxl, bool running)
+{
+ qxl->st->running = running;
+}
+
+int red_qxl_check_qxl_version(QXLInstance *qxl, int major, int minor)
+{
+ int qxl_major = qxl_get_interface(qxl)->base.major_version;
+ int qxl_minor = qxl_get_interface(qxl)->base.minor_version;
+
+ return ((qxl_major > major) ||
+ ((qxl_major == major) && (qxl_minor >= minor)));
+}
+
+template <typename T>
+inline void QXLState::send_message(T& message)
+{
+ dispatcher->send_message(T::MESSAGE_NUM, &message);
+}
+
+SPICE_GNUC_VISIBLE
+void spice_qxl_update_area(QXLInstance *instance, uint32_t surface_id,
+ struct QXLRect *qxl_area, struct QXLRect *qxl_dirty_rects,
+ uint32_t num_dirty_rects, uint32_t clear_dirty_region)
+{
+ RedWorkerMessageUpdate payload = {0,};
+
+ payload.surface_id = surface_id;
+ payload.qxl_area = qxl_area;
+ payload.qxl_dirty_rects = qxl_dirty_rects;
+ payload.num_dirty_rects = num_dirty_rects;
+ payload.clear_dirty_region = clear_dirty_region;
+ instance->st->send_message(payload);
+}
+
+gboolean red_qxl_client_monitors_config(QXLInstance *qxl,
+ VDAgentMonitorsConfig *monitors_config)
+{
+ return (red_qxl_check_qxl_version(qxl, 3, 3) &&
+ qxl_get_interface(qxl)->client_monitors_config &&
+ qxl_get_interface(qxl)->client_monitors_config(qxl, monitors_config));
+}
+
+SPICE_GNUC_VISIBLE
+void spice_qxl_update_area_async(QXLInstance *instance, uint32_t surface_id, QXLRect *qxl_area,
+ uint32_t clear_dirty_region, uint64_t cookie)
+{
+ RedWorkerMessageUpdateAsync payload;
+
+ payload.base.cookie = cookie;
+ payload.surface_id = surface_id;
+ payload.qxl_area = *qxl_area;
+ payload.clear_dirty_region = clear_dirty_region;
+ instance->st->send_message(payload);
+}
+
+SPICE_GNUC_VISIBLE
+void spice_qxl_add_memslot(QXLInstance *instance, QXLDevMemSlot *mem_slot)
+{
+ RedWorkerMessageAddMemslot payload;
+
+ payload.mem_slot = *mem_slot;
+ instance->st->send_message(payload);
+}
+
+SPICE_GNUC_VISIBLE
+void spice_qxl_add_memslot_async(QXLInstance *instance, QXLDevMemSlot *mem_slot, uint64_t cookie)
+{
+ RedWorkerMessageAddMemslotAsync payload;
+
+ payload.base.cookie = cookie;
+ payload.mem_slot = *mem_slot;
+ instance->st->send_message(payload);
+}
+
+SPICE_GNUC_VISIBLE
+void spice_qxl_del_memslot(QXLInstance *instance, uint32_t slot_group_id, uint32_t slot_id)
+{
+ RedWorkerMessageDelMemslot payload;
+
+ payload.slot_group_id = slot_group_id;
+ payload.slot_id = slot_id;
+ instance->st->send_message(payload);
+}
+
+SPICE_GNUC_VISIBLE
+void spice_qxl_destroy_surfaces(QXLInstance *instance)
+{
+ RedWorkerMessageDestroySurfaces payload;
+
+ instance->st->send_message(payload);
+}
+
+SPICE_GNUC_VISIBLE
+void spice_qxl_destroy_surfaces_async(QXLInstance *instance, uint64_t cookie)
+{
+ RedWorkerMessageDestroySurfacesAsync payload;
+
+ payload.base.cookie = cookie;
+ instance->st->send_message(payload);
+}
+
+/* used by RedWorker */
+void red_qxl_destroy_primary_surface_complete(QXLState *qxl_state)
+{
+ qxl_state->x_res = 0;
+ qxl_state->y_res = 0;
+ qxl_state->use_hardware_cursor = FALSE;
+ qxl_state->primary_active = FALSE;
+
+ reds_update_client_mouse_allowed(qxl_state->reds);
+}
+
+SPICE_GNUC_VISIBLE
+void spice_qxl_destroy_primary_surface(QXLInstance *instance, uint32_t surface_id)
+{
+ RedWorkerMessageDestroyPrimarySurface payload;
+ payload.surface_id = surface_id;
+ instance->st->send_message(payload);
+ red_qxl_destroy_primary_surface_complete(instance->st);
+}
+
+SPICE_GNUC_VISIBLE
+void spice_qxl_destroy_primary_surface_async(QXLInstance *instance,
+ uint32_t surface_id, uint64_t cookie)
+{
+ RedWorkerMessageDestroyPrimarySurfaceAsync payload;
+
+ payload.base.cookie = cookie;
+ payload.surface_id = surface_id;
+ instance->st->send_message(payload);
+}
+
+/* used by RedWorker */
+void red_qxl_create_primary_surface_complete(QXLState *qxl_state, const QXLDevSurfaceCreate *surface)
+{
+ qxl_state->x_res = surface->width;
+ qxl_state->y_res = surface->height;
+ // mouse_mode is a boolean value, enforce it
+ qxl_state->use_hardware_cursor = !!surface->mouse_mode;
+ qxl_state->primary_active = TRUE;
+
+ reds_update_client_mouse_allowed(qxl_state->reds);
+}
+
+SPICE_GNUC_VISIBLE
+void spice_qxl_create_primary_surface_async(QXLInstance *instance, uint32_t surface_id,
+ QXLDevSurfaceCreate *surface, uint64_t cookie)
+{
+ RedWorkerMessageCreatePrimarySurfaceAsync payload;
+
+ payload.base.cookie = cookie;
+ payload.surface_id = surface_id;
+ payload.surface = *surface;
+ instance->st->send_message(payload);
+}
+
+SPICE_GNUC_VISIBLE
+void spice_qxl_create_primary_surface(QXLInstance *instance, uint32_t surface_id,
+ QXLDevSurfaceCreate *surface)
+{
+ RedWorkerMessageCreatePrimarySurface payload = {0,};
+
+ payload.surface_id = surface_id;
+ payload.surface = *surface;
+ instance->st->send_message(payload);
+ red_qxl_create_primary_surface_complete(instance->st, surface);
+}
+
+SPICE_GNUC_VISIBLE
+void spice_qxl_reset_image_cache(QXLInstance *instance)
+{
+ RedWorkerMessageResetImageCache payload;
+
+ instance->st->send_message(payload);
+}
+
+SPICE_GNUC_VISIBLE
+void spice_qxl_reset_cursor(QXLInstance *instance)
+{
+ RedWorkerMessageResetCursor payload;
+
+ instance->st->send_message(payload);
+}
+
+SPICE_GNUC_VISIBLE
+void spice_qxl_destroy_surface_wait(QXLInstance *instance, uint32_t surface_id)
+{
+ RedWorkerMessageDestroySurfaceWait payload;
+
+ payload.surface_id = surface_id;
+ instance->st->send_message(payload);
+}
+
+SPICE_GNUC_VISIBLE
+void spice_qxl_destroy_surface_async(QXLInstance *instance, uint32_t surface_id, uint64_t cookie)
+{
+ RedWorkerMessageDestroySurfaceWaitAsync payload;
+
+ payload.base.cookie = cookie;
+ payload.surface_id = surface_id;
+ instance->st->send_message(payload);
+}
+
+SPICE_GNUC_VISIBLE
+void spice_qxl_reset_memslots(QXLInstance *instance)
+{
+ RedWorkerMessageResetMemslots payload;
+
+ instance->st->send_message(payload);
+}
+
+static bool red_qxl_set_pending(QXLState *qxl_state, int pending)
+{
+ // this is not atomic but is not an issue
+ if (test_bit(pending, qxl_state->pending)) {
+ return TRUE;
+ }
+
+ set_bit(pending, &qxl_state->pending);
+ return FALSE;
+}
+
+SPICE_GNUC_VISIBLE
+void spice_qxl_wakeup(QXLInstance *instance)
+{
+ RedWorkerMessageWakeup payload;
+
+ if (red_qxl_set_pending(instance->st, RED_DISPATCHER_PENDING_WAKEUP))
+ return;
+
+ instance->st->send_message(payload);
+}
+
+SPICE_GNUC_VISIBLE
+void spice_qxl_oom(QXLInstance *instance)
+{
+ RedWorkerMessageOom payload;
+
+ if (red_qxl_set_pending(instance->st, RED_DISPATCHER_PENDING_OOM))
+ return;
+
+ instance->st->send_message(payload);
+}
+
+void red_qxl_start(QXLInstance *qxl)
+{
+ RedWorkerMessageStart payload;
+
+ qxl->st->send_message(payload);
+}
+
+SPICE_GNUC_VISIBLE
+void spice_qxl_flush_surfaces_async(QXLInstance *instance, uint64_t cookie)
+{
+ RedWorkerMessageFlushSurfacesAsync payload;
+
+ payload.base.cookie = cookie;
+ instance->st->send_message(payload);
+}
+
+SPICE_GNUC_VISIBLE
+void spice_qxl_monitors_config_async(QXLInstance *instance, QXLPHYSICAL monitors_config,
+ int group_id, uint64_t cookie)
+{
+ RedWorkerMessageMonitorsConfigAsync payload;
+
+ payload.base.cookie = cookie;
+ payload.monitors_config = monitors_config;
+ payload.group_id = group_id;
+ payload.max_monitors = instance->st->max_monitors;
+
+ instance->st->send_message(payload);
+}
+
+SPICE_GNUC_VISIBLE
+void spice_qxl_driver_unload(QXLInstance *instance)
+{
+ RedWorkerMessageDriverUnload payload;
+
+ instance->st->send_message(payload);
+}
+
+void red_qxl_stop(QXLInstance *qxl)
+{
+ RedWorkerMessageStop payload;
+
+ qxl->st->send_message(payload);
+}
+
+SPICE_GNUC_VISIBLE
+void spice_qxl_loadvm_commands(QXLInstance *instance, struct QXLCommandExt *ext, uint32_t count)
+{
+ RedWorkerMessageLoadvmCommands payload;
+
+ payload.count = count;
+ payload.ext = ext;
+ instance->st->send_message(payload);
+}
+
+uint32_t red_qxl_get_ram_size(QXLInstance *qxl)
+{
+ QXLDevInitInfo qxl_info;
+
+ red_qxl_get_init_info(qxl, &qxl_info);
+
+ return qxl_info.qxl_ram_size;
+}
+
+SPICE_GNUC_VISIBLE
+void spice_qxl_start(QXLInstance *instance)
+{
+ red_qxl_start(instance);
+}
+
+SPICE_GNUC_VISIBLE
+void spice_qxl_stop(QXLInstance *instance)
+{
+ red_qxl_stop(instance);
+}
+
+SPICE_GNUC_VISIBLE
+void spice_qxl_set_max_monitors(QXLInstance *instance, unsigned int max_monitors)
+{
+ instance->st->max_monitors = MAX(1U, max_monitors);
+}
+
+SpiceMsgDisplayGlScanoutUnix *red_qxl_get_gl_scanout(QXLInstance *qxl)
+{
+ pthread_mutex_lock(&qxl->st->scanout_mutex);
+ if (qxl->st->scanout.drm_dma_buf_fd >= 0) {
+ return &qxl->st->scanout;
+ }
+ pthread_mutex_unlock(&qxl->st->scanout_mutex);
+ return nullptr;
+}
+
+void red_qxl_put_gl_scanout(QXLInstance *qxl, SpiceMsgDisplayGlScanoutUnix *scanout)
+{
+ if (scanout) {
+ pthread_mutex_unlock(&qxl->st->scanout_mutex);
+ }
+}
+
+SPICE_GNUC_VISIBLE
+void spice_qxl_gl_scanout(QXLInstance *qxl,
+ int fd,
+ uint32_t width, uint32_t height,
+ uint32_t stride, uint32_t format,
+ int y_0_top)
+{
+ RedWorkerMessageGlScanout payload = { /* empty */ };
+ spice_return_if_fail(qxl != nullptr);
+
+ QXLState *qxl_state = qxl->st;
+ spice_return_if_fail(qxl_state->gl_draw_cookie == GL_DRAW_COOKIE_INVALID);
+
+ pthread_mutex_lock(&qxl_state->scanout_mutex);
+
+ if (qxl_state->scanout.drm_dma_buf_fd >= 0) {
+ close(qxl_state->scanout.drm_dma_buf_fd);
+ }
+
+ qxl_state->scanout = (SpiceMsgDisplayGlScanoutUnix) {
+ .drm_dma_buf_fd = fd,
+ .width = width,
+ .height = height,
+ .stride = stride,
+ .drm_fourcc_format = format,
+ .flags = y_0_top ? SPICE_GL_SCANOUT_FLAGS_Y0TOP : 0,
+ };
+
+ pthread_mutex_unlock(&qxl_state->scanout_mutex);
+
+ /* FIXME: find a way to coallesce all pending SCANOUTs */
+ qxl_state->send_message(payload);
+ reds_update_client_mouse_allowed(qxl_state->reds);
+}
+
+SPICE_GNUC_VISIBLE
+void spice_qxl_gl_draw_async(QXLInstance *qxl,
+ uint32_t x, uint32_t y,
+ uint32_t w, uint32_t h,
+ uint64_t cookie)
+{
+ QXLState *qxl_state;
+ RedWorkerMessageGlDraw draw = {
+ {
+ .x = x,
+ .y = y,
+ .w = w,
+ .h = h
+ },
+ };
+
+ spice_return_if_fail(qxl != nullptr);
+ qxl_state = qxl->st;
+ if (qxl_state->scanout.drm_dma_buf_fd < 0) {
+ spice_warning("called spice_qxl_gl_draw_async without a buffer");
+ red_qxl_async_complete(qxl, cookie);
+ return;
+ }
+ spice_return_if_fail(qxl_state->gl_draw_cookie == GL_DRAW_COOKIE_INVALID);
+
+ qxl_state->gl_draw_cookie = cookie;
+ qxl_state->send_message(draw);
+}
+
+void red_qxl_gl_draw_async_complete(QXLInstance *qxl)
+{
+ /* this reset before usage prevent a possible race condition */
+ uint64_t cookie = qxl->st->gl_draw_cookie;
+ qxl->st->gl_draw_cookie = GL_DRAW_COOKIE_INVALID;
+ red_qxl_async_complete(qxl, cookie);
+}
+
+SPICE_GNUC_VISIBLE
+void spice_qxl_set_device_info(QXLInstance *instance,
+ const char *device_address,
+ uint32_t device_display_id_start,
+ uint32_t device_display_id_count)
+{
+ g_return_if_fail(device_address != nullptr);
+
+ size_t da_len = strnlen(device_address, MAX_DEVICE_ADDRESS_LEN);
+ if (da_len >= MAX_DEVICE_ADDRESS_LEN) {
+ spice_error("Device address too long: %" G_GSIZE_FORMAT " > %u",
+ da_len, MAX_DEVICE_ADDRESS_LEN);
+ return;
+ }
+
+ if (device_display_id_count > MAX_MONITORS_COUNT) {
+ spice_error("Device display ID count (%u) is greater than limit %u",
+ device_display_id_count,
+ MAX_MONITORS_COUNT);
+ return;
+ }
+
+ g_strlcpy(instance->st->device_address, device_address, MAX_DEVICE_ADDRESS_LEN);
+
+ g_debug("QXL Instance %d setting device address \"%s\" and monitor -> device display mapping:",
+ instance->id,
+ device_address);
+
+ // store the mapping monitor_id -> device_display_id
+ for (uint32_t monitor_id = 0; monitor_id < device_display_id_count; ++monitor_id) {
+ uint32_t device_display_id = device_display_id_start + monitor_id;
+ instance->st->device_display_ids[monitor_id] = device_display_id;
+ g_debug(" monitor ID %u -> device display ID %u",
+ monitor_id, device_display_id);
+ }
+
+ instance->st->monitors_count = device_display_id_count;
+ instance->st->max_monitors = MAX(1U, device_display_id_count);
+
+ reds_send_device_display_info(red_qxl_get_server(instance->st));
+}
+
+uint32_t red_qxl_marshall_device_display_info(const QXLInstance *qxl, SpiceMarshaller *m)
+{
+ const QXLState *qxl_state = qxl->st;
+ uint32_t device_count = 0;
+ const char *const device_address = qxl_state->device_address;
+ const size_t device_address_len = strlen(device_address) + 1;
+
+ if (device_address_len == 1) {
+ return 0;
+ }
+ for (size_t i = 0; i < qxl_state->monitors_count; ++i) {
+ spice_marshaller_add_uint32(m, qxl->id);
+ spice_marshaller_add_uint32(m, i);
+ spice_marshaller_add_uint32(m, qxl_state->device_display_ids[i]);
+ spice_marshaller_add_uint32(m, device_address_len);
+ spice_marshaller_add(m, reinterpret_cast<const uint8_t *>(device_address),
+ device_address_len);
+ ++device_count;
+
+ g_debug(" (qxl) channel_id: %u monitor_id: %zu, device_address: %s, "
+ "device_display_id: %u",
+ qxl->id, i, device_address,
+ qxl_state->device_display_ids[i]);
+ }
+ return device_count;
+}
+
+void red_qxl_init(RedsState *reds, QXLInstance *qxl)
+{
+ QXLState *qxl_state;
+
+ spice_return_if_fail(qxl != nullptr);
+
+ qxl_state = new QXLState();
+ qxl_state->reds = reds;
+ qxl_state->qxl = qxl;
+ pthread_mutex_init(&qxl_state->scanout_mutex, nullptr);
+ qxl_state->scanout.drm_dma_buf_fd = -1;
+ qxl_state->gl_draw_cookie = GL_DRAW_COOKIE_INVALID;
+ qxl_state->dispatcher = red::make_shared<Dispatcher>(RED_WORKER_MESSAGE_COUNT);
+
+ qxl_state->max_monitors = UINT_MAX;
+ qxl->st = qxl_state;
+
+ qxl_state->worker = red_worker_new(qxl);
+
+ red_worker_run(qxl_state->worker);
+}
+
+void red_qxl_destroy(QXLInstance *qxl)
+{
+ spice_return_if_fail(qxl->st != nullptr && qxl->st->dispatcher);
+
+ QXLState *qxl_state = qxl->st;
+
+ /* send message to close thread */
+ RedWorkerMessageClose message;
+ qxl_state->send_message(message);
+ red_worker_free(qxl_state->worker);
+ /* this must be done after calling red_worker_free */
+ qxl->st = nullptr;
+ pthread_mutex_destroy(&qxl_state->scanout_mutex);
+ delete qxl_state;
+}
+
+Dispatcher *red_qxl_get_dispatcher(QXLInstance *qxl)
+{
+ return qxl->st->dispatcher.get();
+}
+
+void red_qxl_clear_pending(QXLState *qxl_state, int pending)
+{
+ spice_return_if_fail(qxl_state != nullptr);
+
+ clear_bit(pending, &qxl_state->pending);
+}
+
+bool red_qxl_get_allow_client_mouse(QXLInstance *qxl, int *x_res, int *y_res, int *allow_now)
+{
+ // try to get resolution when 3D enabled, since qemu did not create QXL primary surface
+ SpiceMsgDisplayGlScanoutUnix *gl;
+ if ((gl = red_qxl_get_gl_scanout(qxl))) {
+ *x_res = gl->width;
+ *y_res = gl->height;
+ *allow_now = TRUE;
+ red_qxl_put_gl_scanout(qxl, gl);
+ return true;
+ }
+
+ // check for 2D
+ if (!qxl->st->primary_active) {
+ return false;
+ }
+
+ if (qxl->st->use_hardware_cursor) {
+ *x_res = qxl->st->x_res;
+ *y_res = qxl->st->y_res;
+ }
+ *allow_now = qxl->st->use_hardware_cursor;
+ return true;
+}
+
+void red_qxl_on_ic_change(QXLInstance *qxl, SpiceImageCompression ic)
+{
+ RedWorkerMessageSetCompression payload;
+ payload.image_compression = ic;
+ qxl->st->send_message(payload);
+}
+
+void red_qxl_on_sv_change(QXLInstance *qxl, int sv)
+{
+ RedWorkerMessageSetStreamingVideo payload;
+ payload.streaming_video = sv;
+ qxl->st->send_message(payload);
+}
+
+void red_qxl_on_vc_change(QXLInstance *qxl, GArray *video_codecs)
+{
+ RedWorkerMessageSetVideoCodecs payload;
+ payload.video_codecs = g_array_ref(video_codecs);
+ qxl->st->send_message(payload);
+}
+
+void red_qxl_set_mouse_mode(QXLInstance *qxl, uint32_t mode)
+{
+ RedWorkerMessageSetMouseMode payload;
+ payload.mode = mode;
+ qxl->st->send_message(payload);
+}
+
+RedsState* red_qxl_get_server(QXLState *qxl_state)
+{
+ return qxl_state->reds;
+}
+
+void red_qxl_attach_worker(QXLInstance *qxl)
+{
+ QXLInterface *qxl_interface = qxl_get_interface(qxl);
+
+ /* cast for compatibility with spice_replay_next_cmd
+ * In the past spice_replay_next_cmd received a QXLWorker instead of
+ * a QXLInstance. Users of this function could have retrieved this pointer
+ * only by attache_worker callback but this structure was all deprecated.
+ * Passing QXLInstance pointer instead allows these programs to keep working
+ * although spice_replay_next_cmd declaration changed */
+ if (qxl_interface->attache_worker) {
+ qxl_interface->attache_worker(qxl, reinterpret_cast<QXLWorker *>(qxl));
+ }
+}
+
+void red_qxl_set_compression_level(QXLInstance *qxl, int level)
+{
+ QXLInterface *qxl_interface = qxl_get_interface(qxl);
+ qxl_interface->set_compression_level(qxl, level);
+}
+
+void red_qxl_get_init_info(QXLInstance *qxl, QXLDevInitInfo *info)
+{
+ QXLInterface *qxl_interface = qxl_get_interface(qxl);
+
+ qxl_interface->get_init_info(qxl, info);
+}
+
+int red_qxl_get_command(QXLInstance *qxl, struct QXLCommandExt *cmd)
+{
+ QXLInterface *qxl_interface = qxl_get_interface(qxl);
+
+ return qxl_interface->get_command(qxl, cmd);
+}
+
+int red_qxl_req_cmd_notification(QXLInstance *qxl)
+{
+ QXLInterface *qxl_interface = qxl_get_interface(qxl);
+
+ return qxl_interface->req_cmd_notification(qxl);
+}
+
+void red_qxl_release_resource(QXLInstance *qxl, struct QXLReleaseInfoExt release_info)
+{
+ QXLInterface *qxl_interface = qxl_get_interface(qxl);
+
+ qxl_interface->release_resource(qxl, release_info);
+}
+
+int red_qxl_get_cursor_command(QXLInstance *qxl, struct QXLCommandExt *cmd)
+{
+ QXLInterface *qxl_interface = qxl_get_interface(qxl);
+
+ return qxl_interface->get_cursor_command(qxl, cmd);
+}
+
+int red_qxl_req_cursor_notification(QXLInstance *qxl)
+{
+ QXLInterface *qxl_interface = qxl_get_interface(qxl);
+
+ return qxl_interface->req_cursor_notification(qxl);
+}
+
+void red_qxl_notify_update(QXLInstance *qxl, uint32_t update_id)
+{
+ QXLInterface *qxl_interface = qxl_get_interface(qxl);
+
+ qxl_interface->notify_update(qxl, update_id);
+}
+
+int red_qxl_flush_resources(QXLInstance *qxl)
+{
+ QXLInterface *qxl_interface = qxl_get_interface(qxl);
+
+ return qxl_interface->flush_resources(qxl);
+}
+
+void red_qxl_update_area_complete(QXLInstance *qxl, uint32_t surface_id,
+ struct QXLRect *updated_rects,
+ uint32_t num_updated_rects)
+{
+ QXLInterface *qxl_interface = qxl_get_interface(qxl);
+
+ qxl_interface->update_area_complete(qxl, surface_id, updated_rects, num_updated_rects);
+}
+
+void red_qxl_set_client_capabilities(QXLInstance *qxl,
+ uint8_t client_present,
+ uint8_t caps[SPICE_CAPABILITIES_SIZE])
+{
+ QXLInterface *qxl_interface = qxl_get_interface(qxl);
+
+ if (qxl->st->running) {
+ qxl_interface->set_client_capabilities(qxl, client_present, caps);
+ }
+}
+
+void red_qxl_async_complete(QXLInstance *qxl, uint64_t cookie)
+{
+ QXLInterface *qxl_interface = qxl_get_interface(qxl);
+
+ qxl_interface->async_complete(qxl, cookie);
+}
diff --git a/server/red-qxl.h b/server/red-qxl.h
new file mode 100644
index 00000000..2084acb1
--- /dev/null
+++ b/server/red-qxl.h
@@ -0,0 +1,66 @@
+/*
+ Copyright (C) 2009 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef RED_QXL_H_
+#define RED_QXL_H_
+
+#include "red-channel.h"
+#include "spice-qxl.h"
+
+SPICE_BEGIN_DECLS
+
+void red_qxl_init(SpiceServer *reds, QXLInstance *qxl);
+void red_qxl_destroy(QXLInstance *qxl);
+
+void red_qxl_on_ic_change(QXLInstance *qxl, SpiceImageCompression ic);
+void red_qxl_on_sv_change(QXLInstance *qxl, int sv);
+void red_qxl_on_vc_change(QXLInstance *qxl, GArray* video_codecs);
+void red_qxl_set_mouse_mode(QXLInstance *qxl, uint32_t mode);
+void red_qxl_attach_worker(QXLInstance *qxl);
+void red_qxl_set_compression_level(QXLInstance *qxl, int level);
+void red_qxl_stop(QXLInstance *qxl);
+void red_qxl_start(QXLInstance *qxl);
+uint32_t red_qxl_get_ram_size(QXLInstance *qxl);
+gboolean red_qxl_client_monitors_config(QXLInstance *qxl, VDAgentMonitorsConfig *monitors_config);
+bool red_qxl_get_allow_client_mouse(QXLInstance *qxl, int *x_res, int *y_res, int *allow_now);
+SpiceMsgDisplayGlScanoutUnix *red_qxl_get_gl_scanout(QXLInstance *qxl);
+void red_qxl_put_gl_scanout(QXLInstance *qxl, SpiceMsgDisplayGlScanoutUnix *scanout);
+void red_qxl_gl_draw_async_complete(QXLInstance *qxl);
+int red_qxl_check_qxl_version(QXLInstance *qxl, int major, int minor);
+SpiceServer* red_qxl_get_server(QXLState *qxl);
+uint32_t red_qxl_marshall_device_display_info(const QXLInstance *qxl, SpiceMarshaller *m);
+
+/* Wrappers around QXLInterface vfuncs */
+void red_qxl_get_init_info(QXLInstance *qxl, QXLDevInitInfo *info);
+int red_qxl_get_command(QXLInstance *qxl, struct QXLCommandExt *cmd);
+int red_qxl_req_cmd_notification(QXLInstance *qxl);
+void red_qxl_release_resource(QXLInstance *qxl, struct QXLReleaseInfoExt release_info);
+int red_qxl_get_cursor_command(QXLInstance *qxl, struct QXLCommandExt *cmd);
+int red_qxl_req_cursor_notification(QXLInstance *qxl);
+void red_qxl_notify_update(QXLInstance *qxl, uint32_t update_id);
+int red_qxl_flush_resources(QXLInstance *qxl);
+void red_qxl_async_complete(QXLInstance *qxl, uint64_t cookie);
+void red_qxl_update_area_complete(QXLInstance *qxl, uint32_t surface_id,
+ struct QXLRect *updated_rects,
+ uint32_t num_updated_rects);
+void red_qxl_set_client_capabilities(QXLInstance *qxl,
+ uint8_t client_present,
+ uint8_t caps[SPICE_CAPABILITIES_SIZE]);
+
+SPICE_END_DECLS
+
+#endif /* RED_QXL_H_ */
diff --git a/server/red-record-qxl.cpp b/server/red-record-qxl.cpp
new file mode 100644
index 00000000..032b15e6
--- /dev/null
+++ b/server/red-record-qxl.cpp
@@ -0,0 +1,906 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009,2010 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+
+#include <inttypes.h>
+#include <pthread.h>
+#include <glib.h>
+
+#include "red-common.h"
+#include "memslot.h"
+#include "red-parse-qxl.h"
+#include "zlib-encoder.h"
+#include "red-record-qxl.h"
+
+struct RedRecord {
+ FILE *fd;
+ pthread_mutex_t lock;
+ unsigned int counter;
+ gint refs;
+};
+
+#if 0
+static void hexdump_qxl(RedMemSlotInfo *slots, int group_id,
+ QXLPHYSICAL addr, uint8_t bytes)
+{
+ uint8_t *hex;
+ int i;
+
+ hex = (uint8_t*)memslot_get_virt(slots, addr, bytes, group_id);
+ for (i = 0; i < bytes; i++) {
+ if (0 == i % 16) {
+ fprintf(stderr, "%lx: ", addr+i);
+ }
+ if (0 == i % 4) {
+ fprintf(stderr, " ");
+ }
+ fprintf(stderr, " %02x", hex[i]);
+ if (15 == i % 16) {
+ fprintf(stderr, "\n");
+ }
+ }
+}
+#endif
+
+#define WITH_ZLIB 0
+
+/* TODO: make this thread safe (required for two qxl devices) */
+
+#if WITH_ZLIB
+struct RecordEncoderData {
+ ZlibEncoderUsrContext base;
+ uint8_t *buf;
+ int size;
+};
+
+static int record_zlib_more_space(ZlibEncoderUsrContext *usr, uint8_t **io_ptr)
+{
+ return 0;
+}
+
+static int record_zlib_more_input(ZlibEncoderUsrContext *usr, uint8_t **input)
+{
+ RecordEncoderData *data = SPICE_UPCAST(RecordEncoderData, usr);
+
+ if (data->buf == NULL) {
+ fprintf(stderr, "%s: error: no more data\n", __FUNCTION__);
+ exit(1);
+ }
+ *input = data->buf;
+ data->buf = 0;
+ return data->size;
+}
+
+RecordEncoderData record_encoder_data = {
+ .base = {
+ record_zlib_more_space,
+ record_zlib_more_input,
+ },
+ .buf = NULL,
+ .size = 0,
+};
+#define RECORD_ZLIB_DEFAULT_COMPRESSION_LEVEL 3
+#endif
+
+#if WITH_ZLIB
+static uint8_t output[1024*1024*4]; // static buffer for encoding, 4MB
+#endif
+
+static void write_binary(FILE *fd, const char *prefix, size_t size, const uint8_t *buf)
+{
+ int n;
+
+#if WITH_ZLIB
+ ZlibEncoder *enc;
+ int zlib_size;
+
+ record_encoder_data.buf = buf;
+ record_encoder_data.size = size;
+ enc = zlib_encoder_create(&record_encoder_data.base,
+ RECORD_ZLIB_DEFAULT_COMPRESSION_LEVEL);
+ if (!enc) {
+ fprintf(stderr, "%s: zlib encoder creation failed\n", __FUNCTION__);
+ exit(1);
+ }
+#endif
+
+ fprintf(fd, "binary %d %s %" PRIuPTR ":", WITH_ZLIB, prefix, size);
+#if WITH_ZLIB
+ zlib_size = zlib_encode(enc, RECORD_ZLIB_DEFAULT_COMPRESSION_LEVEL, size,
+ output, sizeof(output));
+ fprintf(fd, "%d:", zlib_size);
+ n = fwrite(output, zlib_size, 1, fd);
+ zlib_encoder_destroy(enc);
+#else
+ n = fwrite(buf, size, 1, fd);
+#endif
+ (void)n;
+ fprintf(fd, "\n");
+}
+
+static size_t red_record_data_chunks_ptr(FILE *fd, const char *prefix,
+ RedMemSlotInfo *slots, int group_id,
+ int memslot_id, QXLDataChunk *qxl)
+{
+ size_t data_size = qxl->data_size;
+ int count_chunks = 0;
+ QXLDataChunk *cur = qxl;
+
+ while (cur->next_chunk) {
+ cur =
+ (QXLDataChunk*)memslot_get_virt(slots, cur->next_chunk, sizeof(*cur), group_id);
+ data_size += cur->data_size;
+ count_chunks++;
+ }
+ fprintf(fd, "data_chunks %d %" PRIuPTR "\n", count_chunks, data_size);
+ memslot_validate_virt(slots, (intptr_t)qxl->data, memslot_id, qxl->data_size, group_id);
+ write_binary(fd, prefix, qxl->data_size, qxl->data);
+
+ while (qxl->next_chunk) {
+ memslot_id = memslot_get_id(slots, qxl->next_chunk);
+ qxl = (QXLDataChunk*)memslot_get_virt(slots, qxl->next_chunk, sizeof(*qxl), group_id);
+
+ memslot_validate_virt(slots, (intptr_t)qxl->data, memslot_id, qxl->data_size, group_id);
+ write_binary(fd, prefix, qxl->data_size, qxl->data);
+ }
+
+ return data_size;
+}
+
+static size_t red_record_data_chunks(FILE *fd, const char *prefix,
+ RedMemSlotInfo *slots, int group_id,
+ QXLPHYSICAL addr)
+{
+ QXLDataChunk *qxl;
+ int memslot_id = memslot_get_id(slots, addr);
+
+ qxl = (QXLDataChunk*)memslot_get_virt(slots, addr, sizeof(*qxl), group_id);
+ return red_record_data_chunks_ptr(fd, prefix, slots, group_id, memslot_id, qxl);
+}
+
+static void red_record_point_ptr(FILE *fd, QXLPoint *qxl)
+{
+ fprintf(fd, "point %d %d\n", qxl->x, qxl->y);
+}
+
+static void red_record_point16_ptr(FILE *fd, QXLPoint16 *qxl)
+{
+ fprintf(fd, "point16 %d %d\n", qxl->x, qxl->y);
+}
+
+static void red_record_rect_ptr(FILE *fd, const char *prefix, QXLRect *qxl)
+{
+ fprintf(fd, "rect %s %d %d %d %d\n", prefix,
+ qxl->top, qxl->left, qxl->bottom, qxl->right);
+}
+
+static void red_record_path(FILE *fd, RedMemSlotInfo *slots, int group_id,
+ QXLPHYSICAL addr)
+{
+ QXLPath *qxl;
+
+ qxl = (QXLPath *)memslot_get_virt(slots, addr, sizeof(*qxl), group_id);
+ red_record_data_chunks_ptr(fd, "path", slots, group_id,
+ memslot_get_id(slots, addr),
+ &qxl->chunk);
+}
+
+static void red_record_clip_rects(FILE *fd, RedMemSlotInfo *slots, int group_id,
+ QXLPHYSICAL addr)
+{
+ QXLClipRects *qxl;
+
+ qxl = (QXLClipRects *)memslot_get_virt(slots, addr, sizeof(*qxl), group_id);
+ fprintf(fd, "num_rects %d\n", qxl->num_rects);
+ red_record_data_chunks_ptr(fd, "clip_rects", slots, group_id,
+ memslot_get_id(slots, addr),
+ &qxl->chunk);
+}
+
+static void red_record_virt_data_flat(FILE *fd, const char *prefix,
+ RedMemSlotInfo *slots, int group_id,
+ QXLPHYSICAL addr, size_t size)
+{
+ write_binary(fd, prefix,
+ size, (uint8_t*)memslot_get_virt(slots, addr, size, group_id));
+}
+
+static void red_record_image_data_flat(FILE *fd, RedMemSlotInfo *slots, int group_id,
+ QXLPHYSICAL addr, size_t size)
+{
+ red_record_virt_data_flat(fd, "image_data_flat", slots, group_id, addr, size);
+}
+
+static void red_record_transform(FILE *fd, RedMemSlotInfo *slots, int group_id,
+ QXLPHYSICAL addr)
+{
+ red_record_virt_data_flat(fd, "transform", slots, group_id,
+ addr, sizeof(SpiceTransform));
+}
+
+static void red_record_image(FILE *fd, RedMemSlotInfo *slots, int group_id,
+ QXLPHYSICAL addr, uint32_t flags)
+{
+ QXLImage *qxl;
+ size_t bitmap_size, size;
+ uint8_t qxl_flags;
+
+ fprintf(fd, "image %d\n", addr ? 1 : 0);
+ if (addr == 0) {
+ return;
+ }
+
+ qxl = (QXLImage *)memslot_get_virt(slots, addr, sizeof(*qxl), group_id);
+ fprintf(fd, "descriptor.id %" PRIu64 "\n", qxl->descriptor.id);
+ fprintf(fd, "descriptor.type %d\n", qxl->descriptor.type);
+ fprintf(fd, "descriptor.flags %d\n", qxl->descriptor.flags);
+ fprintf(fd, "descriptor.width %d\n", qxl->descriptor.width);
+ fprintf(fd, "descriptor.height %d\n", qxl->descriptor.height);
+
+ switch (qxl->descriptor.type) {
+ case SPICE_IMAGE_TYPE_BITMAP:
+ fprintf(fd, "bitmap.format %d\n", qxl->bitmap.format);
+ fprintf(fd, "bitmap.flags %d\n", qxl->bitmap.flags);
+ fprintf(fd, "bitmap.x %d\n", qxl->bitmap.x);
+ fprintf(fd, "bitmap.y %d\n", qxl->bitmap.y);
+ fprintf(fd, "bitmap.stride %d\n", qxl->bitmap.stride);
+ qxl_flags = qxl->bitmap.flags;
+ fprintf(fd, "has_palette %d\n", qxl->bitmap.palette ? 1 : 0);
+ if (qxl->bitmap.palette) {
+ QXLPalette *qp;
+ int i, num_ents;
+ qp = (QXLPalette *)memslot_get_virt(slots, qxl->bitmap.palette,
+ sizeof(*qp), group_id);
+ num_ents = qp->num_ents;
+ fprintf(fd, "qp.num_ents %d\n", qp->num_ents);
+ memslot_validate_virt(slots, (intptr_t)qp->ents,
+ memslot_get_id(slots, qxl->bitmap.palette),
+ num_ents * sizeof(qp->ents[0]), group_id);
+ fprintf(fd, "unique %" PRIu64 "\n", qp->unique);
+ for (i = 0; i < num_ents; i++) {
+ fprintf(fd, "ents %d\n", qp->ents[i]);
+ }
+ }
+ bitmap_size = qxl->bitmap.y * qxl->bitmap.stride;
+ if (qxl_flags & QXL_BITMAP_DIRECT) {
+ red_record_image_data_flat(fd, slots, group_id,
+ qxl->bitmap.data,
+ bitmap_size);
+ } else {
+ size = red_record_data_chunks(fd, "bitmap.data", slots, group_id,
+ qxl->bitmap.data);
+ spice_assert(size == bitmap_size);
+ }
+ break;
+ case SPICE_IMAGE_TYPE_SURFACE:
+ fprintf(fd, "surface_image.surface_id %d\n", qxl->surface_image.surface_id);
+ break;
+ case SPICE_IMAGE_TYPE_QUIC:
+ fprintf(fd, "quic.data_size %d\n", qxl->quic.data_size);
+ size = red_record_data_chunks_ptr(fd, "quic.data", slots, group_id,
+ memslot_get_id(slots, addr),
+ (QXLDataChunk *)qxl->quic.data);
+ spice_assert(size == qxl->quic.data_size);
+ break;
+ default:
+ spice_error("unknown type %d", qxl->descriptor.type);
+ }
+}
+
+static void red_record_brush_ptr(FILE *fd, RedMemSlotInfo *slots, int group_id,
+ QXLBrush *qxl, uint32_t flags)
+{
+ fprintf(fd, "type %d\n", qxl->type);
+ switch (qxl->type) {
+ case SPICE_BRUSH_TYPE_SOLID:
+ fprintf(fd, "u.color %d\n", qxl->u.color);
+ break;
+ case SPICE_BRUSH_TYPE_PATTERN:
+ red_record_image(fd, slots, group_id, qxl->u.pattern.pat, flags);
+ red_record_point_ptr(fd, &qxl->u.pattern.pos);
+ break;
+ }
+}
+
+static void red_record_qmask_ptr(FILE *fd, RedMemSlotInfo *slots, int group_id,
+ QXLQMask *qxl, uint32_t flags)
+{
+ fprintf(fd, "flags %d\n", qxl->flags);
+ red_record_point_ptr(fd, &qxl->pos);
+ red_record_image(fd, slots, group_id, qxl->bitmap, flags);
+}
+
+static void red_record_fill_ptr(FILE *fd, RedMemSlotInfo *slots, int group_id,
+ QXLFill *qxl, uint32_t flags)
+{
+ red_record_brush_ptr(fd, slots, group_id, &qxl->brush, flags);
+ fprintf(fd, "rop_descriptor %d\n", qxl->rop_descriptor);
+ red_record_qmask_ptr(fd, slots, group_id, &qxl->mask, flags);
+}
+
+static void red_record_opaque_ptr(FILE *fd, RedMemSlotInfo *slots, int group_id,
+ QXLOpaque *qxl, uint32_t flags)
+{
+ red_record_image(fd, slots, group_id, qxl->src_bitmap, flags);
+ red_record_rect_ptr(fd, "src_area", &qxl->src_area);
+ red_record_brush_ptr(fd, slots, group_id, &qxl->brush, flags);
+ fprintf(fd, "rop_descriptor %d\n", qxl->rop_descriptor);
+ fprintf(fd, "scale_mode %d\n", qxl->scale_mode);
+ red_record_qmask_ptr(fd, slots, group_id, &qxl->mask, flags);
+}
+
+static void red_record_copy_ptr(FILE *fd, RedMemSlotInfo *slots, int group_id,
+ QXLCopy *qxl, uint32_t flags)
+{
+ red_record_image(fd, slots, group_id, qxl->src_bitmap, flags);
+ red_record_rect_ptr(fd, "src_area", &qxl->src_area);
+ fprintf(fd, "rop_descriptor %d\n", qxl->rop_descriptor);
+ fprintf(fd, "scale_mode %d\n", qxl->scale_mode);
+ red_record_qmask_ptr(fd, slots, group_id, &qxl->mask, flags);
+}
+
+static void red_record_blend_ptr(FILE *fd, RedMemSlotInfo *slots, int group_id,
+ QXLBlend *qxl, uint32_t flags)
+{
+ red_record_image(fd, slots, group_id, qxl->src_bitmap, flags);
+ red_record_rect_ptr(fd, "src_area", &qxl->src_area);
+ fprintf(fd, "rop_descriptor %d\n", qxl->rop_descriptor);
+ fprintf(fd, "scale_mode %d\n", qxl->scale_mode);
+ red_record_qmask_ptr(fd, slots, group_id, &qxl->mask, flags);
+}
+
+static void red_record_transparent_ptr(FILE *fd, RedMemSlotInfo *slots, int group_id,
+ QXLTransparent *qxl,
+ uint32_t flags)
+{
+ red_record_image(fd, slots, group_id, qxl->src_bitmap, flags);
+ red_record_rect_ptr(fd, "src_area", &qxl->src_area);
+ fprintf(fd, "src_color %d\n", qxl->src_color);
+ fprintf(fd, "true_color %d\n", qxl->true_color);
+}
+
+static void red_record_alpha_blend_ptr(FILE *fd, RedMemSlotInfo *slots, int group_id,
+ QXLAlphaBlend *qxl,
+ uint32_t flags)
+{
+ fprintf(fd, "alpha_flags %d\n", qxl->alpha_flags);
+ fprintf(fd, "alpha %d\n", qxl->alpha);
+ red_record_image(fd, slots, group_id, qxl->src_bitmap, flags);
+ red_record_rect_ptr(fd, "src_area", &qxl->src_area);
+}
+
+static void red_record_alpha_blend_ptr_compat(FILE *fd, RedMemSlotInfo *slots, int group_id,
+ QXLCompatAlphaBlend *qxl,
+ uint32_t flags)
+{
+ fprintf(fd, "alpha %d\n", qxl->alpha);
+ red_record_image(fd, slots, group_id, qxl->src_bitmap, flags);
+ red_record_rect_ptr(fd, "src_area", &qxl->src_area);
+}
+
+static void red_record_rop3_ptr(FILE *fd, RedMemSlotInfo *slots, int group_id,
+ QXLRop3 *qxl, uint32_t flags)
+{
+ red_record_image(fd, slots, group_id, qxl->src_bitmap, flags);
+ red_record_rect_ptr(fd, "src_area", &qxl->src_area);
+ red_record_brush_ptr(fd, slots, group_id, &qxl->brush, flags);
+ fprintf(fd, "rop3 %d\n", qxl->rop3);
+ fprintf(fd, "scale_mode %d\n", qxl->scale_mode);
+ red_record_qmask_ptr(fd, slots, group_id, &qxl->mask, flags);
+}
+
+static void red_record_stroke_ptr(FILE *fd, RedMemSlotInfo *slots, int group_id,
+ QXLStroke *qxl, uint32_t flags)
+{
+ red_record_path(fd, slots, group_id, qxl->path);
+ fprintf(fd, "attr.flags %d\n", qxl->attr.flags);
+ if (qxl->attr.flags & SPICE_LINE_FLAGS_STYLED) {
+ int style_nseg = qxl->attr.style_nseg;
+ uint8_t *buf;
+
+ fprintf(fd, "attr.style_nseg %d\n", qxl->attr.style_nseg);
+ spice_assert(qxl->attr.style);
+ buf = (uint8_t *)memslot_get_virt(slots, qxl->attr.style,
+ style_nseg * sizeof(QXLFIXED), group_id);
+ write_binary(fd, "style", style_nseg * sizeof(QXLFIXED), buf);
+ }
+ red_record_brush_ptr(fd, slots, group_id, &qxl->brush, flags);
+ fprintf(fd, "fore_mode %d\n", qxl->fore_mode);
+ fprintf(fd, "back_mode %d\n", qxl->back_mode);
+}
+
+static void red_record_string(FILE *fd, RedMemSlotInfo *slots, int group_id,
+ QXLPHYSICAL addr)
+{
+ QXLString *qxl;
+ size_t chunk_size;
+
+ qxl = (QXLString *)memslot_get_virt(slots, addr, sizeof(*qxl), group_id);
+ fprintf(fd, "data_size %d\n", qxl->data_size);
+ fprintf(fd, "length %d\n", qxl->length);
+ fprintf(fd, "flags %d\n", qxl->flags);
+ chunk_size = red_record_data_chunks_ptr(fd, "string", slots, group_id,
+ memslot_get_id(slots, addr),
+ &qxl->chunk);
+ spice_assert(chunk_size == qxl->data_size);
+}
+
+static void red_record_text_ptr(FILE *fd, RedMemSlotInfo *slots, int group_id,
+ QXLText *qxl, uint32_t flags)
+{
+ red_record_string(fd, slots, group_id, qxl->str);
+ red_record_rect_ptr(fd, "back_area", &qxl->back_area);
+ red_record_brush_ptr(fd, slots, group_id, &qxl->fore_brush, flags);
+ red_record_brush_ptr(fd, slots, group_id, &qxl->back_brush, flags);
+ fprintf(fd, "fore_mode %d\n", qxl->fore_mode);
+ fprintf(fd, "back_mode %d\n", qxl->back_mode);
+}
+
+static void red_record_whiteness_ptr(FILE *fd, RedMemSlotInfo *slots, int group_id,
+ QXLWhiteness *qxl, uint32_t flags)
+{
+ red_record_qmask_ptr(fd, slots, group_id, &qxl->mask, flags);
+}
+
+static void red_record_blackness_ptr(FILE *fd, RedMemSlotInfo *slots, int group_id,
+ QXLBlackness *qxl, uint32_t flags)
+{
+ red_record_qmask_ptr(fd, slots, group_id, &qxl->mask, flags);
+}
+
+static void red_record_invers_ptr(FILE *fd, RedMemSlotInfo *slots, int group_id,
+ QXLInvers *qxl, uint32_t flags)
+{
+ red_record_qmask_ptr(fd, slots, group_id, &qxl->mask, flags);
+}
+
+static void red_record_clip_ptr(FILE *fd, RedMemSlotInfo *slots, int group_id,
+ QXLClip *qxl)
+{
+ fprintf(fd, "type %d\n", qxl->type);
+ switch (qxl->type) {
+ case SPICE_CLIP_TYPE_RECTS:
+ red_record_clip_rects(fd, slots, group_id, qxl->data);
+ break;
+ }
+}
+
+static void red_record_composite_ptr(FILE *fd, RedMemSlotInfo *slots, int group_id,
+ QXLComposite *qxl, uint32_t flags)
+{
+ fprintf(fd, "flags %d\n", qxl->flags);
+
+ red_record_image(fd, slots, group_id, qxl->src, flags);
+ fprintf(fd, "src_transform %d\n", !!qxl->src_transform);
+ if (qxl->src_transform)
+ red_record_transform(fd, slots, group_id, qxl->src_transform);
+ fprintf(fd, "mask %d\n", !!qxl->mask);
+ if (qxl->mask)
+ red_record_image(fd, slots, group_id, qxl->mask, flags);
+ fprintf(fd, "mask_transform %d\n", !!qxl->mask_transform);
+ if (qxl->mask_transform)
+ red_record_transform(fd, slots, group_id, qxl->mask_transform);
+
+ fprintf(fd, "src_origin %d %d\n", qxl->src_origin.x, qxl->src_origin.y);
+ fprintf(fd, "mask_origin %d %d\n", qxl->mask_origin.x, qxl->mask_origin.y);
+}
+
+static void red_record_native_drawable(FILE *fd, RedMemSlotInfo *slots, int group_id,
+ QXLPHYSICAL addr, uint32_t flags)
+{
+ QXLDrawable *qxl;
+ int i;
+
+ qxl = (QXLDrawable *)memslot_get_virt(slots, addr, sizeof(*qxl), group_id);
+
+ red_record_rect_ptr(fd, "bbox", &qxl->bbox);
+ red_record_clip_ptr(fd, slots, group_id, &qxl->clip);
+ fprintf(fd, "effect %d\n", qxl->effect);
+ fprintf(fd, "mm_time %d\n", qxl->mm_time);
+ fprintf(fd, "self_bitmap %d\n", qxl->self_bitmap);
+ red_record_rect_ptr(fd, "self_bitmap_area", &qxl->self_bitmap_area);
+ fprintf(fd, "surface_id %d\n", qxl->surface_id);
+
+ for (i = 0; i < 3; i++) {
+ fprintf(fd, "surfaces_dest %d\n", qxl->surfaces_dest[i]);
+ red_record_rect_ptr(fd, "surfaces_rects", &qxl->surfaces_rects[i]);
+ }
+
+ fprintf(fd, "type %d\n", qxl->type);
+ switch (qxl->type) {
+ case QXL_DRAW_ALPHA_BLEND:
+ red_record_alpha_blend_ptr(fd, slots, group_id,
+ &qxl->u.alpha_blend, flags);
+ break;
+ case QXL_DRAW_BLACKNESS:
+ red_record_blackness_ptr(fd, slots, group_id,
+ &qxl->u.blackness, flags);
+ break;
+ case QXL_DRAW_BLEND:
+ red_record_blend_ptr(fd, slots, group_id, &qxl->u.blend, flags);
+ break;
+ case QXL_DRAW_COPY:
+ red_record_copy_ptr(fd, slots, group_id, &qxl->u.copy, flags);
+ break;
+ case QXL_COPY_BITS:
+ red_record_point_ptr(fd, &qxl->u.copy_bits.src_pos);
+ break;
+ case QXL_DRAW_FILL:
+ red_record_fill_ptr(fd, slots, group_id, &qxl->u.fill, flags);
+ break;
+ case QXL_DRAW_OPAQUE:
+ red_record_opaque_ptr(fd, slots, group_id, &qxl->u.opaque, flags);
+ break;
+ case QXL_DRAW_INVERS:
+ red_record_invers_ptr(fd, slots, group_id, &qxl->u.invers, flags);
+ break;
+ case QXL_DRAW_NOP:
+ break;
+ case QXL_DRAW_ROP3:
+ red_record_rop3_ptr(fd, slots, group_id, &qxl->u.rop3, flags);
+ break;
+ case QXL_DRAW_STROKE:
+ red_record_stroke_ptr(fd, slots, group_id, &qxl->u.stroke, flags);
+ break;
+ case QXL_DRAW_TEXT:
+ red_record_text_ptr(fd, slots, group_id, &qxl->u.text, flags);
+ break;
+ case QXL_DRAW_TRANSPARENT:
+ red_record_transparent_ptr(fd, slots, group_id, &qxl->u.transparent, flags);
+ break;
+ case QXL_DRAW_WHITENESS:
+ red_record_whiteness_ptr(fd, slots, group_id, &qxl->u.whiteness, flags);
+ break;
+ case QXL_DRAW_COMPOSITE:
+ red_record_composite_ptr(fd, slots, group_id, &qxl->u.composite, flags);
+ break;
+ default:
+ spice_error("unknown type %d", qxl->type);
+ break;
+ };
+}
+
+static void red_record_compat_drawable(FILE *fd, RedMemSlotInfo *slots, int group_id,
+ QXLPHYSICAL addr, uint32_t flags)
+{
+ QXLCompatDrawable *qxl;
+
+ qxl = (QXLCompatDrawable *)memslot_get_virt(slots, addr, sizeof(*qxl), group_id);
+
+ red_record_rect_ptr(fd, "bbox", &qxl->bbox);
+ red_record_clip_ptr(fd, slots, group_id, &qxl->clip);
+ fprintf(fd, "effect %d\n", qxl->effect);
+ fprintf(fd, "mm_time %d\n", qxl->mm_time);
+
+ fprintf(fd, "bitmap_offset %d\n", qxl->bitmap_offset);
+ red_record_rect_ptr(fd, "bitmap_area", &qxl->bitmap_area);
+
+ fprintf(fd, "type %d\n", qxl->type);
+ switch (qxl->type) {
+ case QXL_DRAW_ALPHA_BLEND:
+ red_record_alpha_blend_ptr_compat(fd, slots, group_id,
+ &qxl->u.alpha_blend, flags);
+ break;
+ case QXL_DRAW_BLACKNESS:
+ red_record_blackness_ptr(fd, slots, group_id,
+ &qxl->u.blackness, flags);
+ break;
+ case QXL_DRAW_BLEND:
+ red_record_blend_ptr(fd, slots, group_id, &qxl->u.blend, flags);
+ break;
+ case QXL_DRAW_COPY:
+ red_record_copy_ptr(fd, slots, group_id, &qxl->u.copy, flags);
+ break;
+ case QXL_COPY_BITS:
+ red_record_point_ptr(fd, &qxl->u.copy_bits.src_pos);
+ break;
+ case QXL_DRAW_FILL:
+ red_record_fill_ptr(fd, slots, group_id, &qxl->u.fill, flags);
+ break;
+ case QXL_DRAW_OPAQUE:
+ red_record_opaque_ptr(fd, slots, group_id, &qxl->u.opaque, flags);
+ break;
+ case QXL_DRAW_INVERS:
+ red_record_invers_ptr(fd, slots, group_id, &qxl->u.invers, flags);
+ break;
+ case QXL_DRAW_NOP:
+ break;
+ case QXL_DRAW_ROP3:
+ red_record_rop3_ptr(fd, slots, group_id, &qxl->u.rop3, flags);
+ break;
+ case QXL_DRAW_STROKE:
+ red_record_stroke_ptr(fd, slots, group_id, &qxl->u.stroke, flags);
+ break;
+ case QXL_DRAW_TEXT:
+ red_record_text_ptr(fd, slots, group_id, &qxl->u.text, flags);
+ break;
+ case QXL_DRAW_TRANSPARENT:
+ red_record_transparent_ptr(fd, slots, group_id, &qxl->u.transparent, flags);
+ break;
+ case QXL_DRAW_WHITENESS:
+ red_record_whiteness_ptr(fd, slots, group_id, &qxl->u.whiteness, flags);
+ break;
+ default:
+ spice_error("unknown type %d", qxl->type);
+ break;
+ };
+}
+
+static void red_record_drawable(FILE *fd, RedMemSlotInfo *slots, int group_id,
+ QXLPHYSICAL addr, uint32_t flags)
+{
+ fprintf(fd, "drawable\n");
+ if (flags & QXL_COMMAND_FLAG_COMPAT) {
+ red_record_compat_drawable(fd, slots, group_id, addr, flags);
+ } else {
+ red_record_native_drawable(fd, slots, group_id, addr, flags);
+ }
+}
+
+static void red_record_update_cmd(FILE *fd, RedMemSlotInfo *slots, int group_id,
+ QXLPHYSICAL addr)
+{
+ QXLUpdateCmd *qxl;
+
+ qxl = (QXLUpdateCmd *)memslot_get_virt(slots, addr, sizeof(*qxl), group_id);
+
+ fprintf(fd, "update\n");
+ red_record_rect_ptr(fd, "area", &qxl->area);
+ fprintf(fd, "update_id %d\n", qxl->update_id);
+ fprintf(fd, "surface_id %d\n", qxl->surface_id);
+}
+
+static void red_record_message(FILE *fd, RedMemSlotInfo *slots, int group_id,
+ QXLPHYSICAL addr)
+{
+ QXLMessage *qxl;
+
+ /*
+ * security alert:
+ * qxl->data[0] size isn't specified anywhere -> can't verify
+ * luckily this is for debug logging only,
+ * so we can just ignore it by default.
+ */
+ qxl = (QXLMessage *)memslot_get_virt(slots, addr, sizeof(*qxl), group_id);
+ write_binary(fd, "message", strlen((char*)qxl->data), (uint8_t*)qxl->data);
+}
+
+static void red_record_surface_cmd(FILE *fd, RedMemSlotInfo *slots, int group_id,
+ QXLPHYSICAL addr)
+{
+ QXLSurfaceCmd *qxl;
+ size_t size;
+
+ qxl = (QXLSurfaceCmd *)memslot_get_virt(slots, addr, sizeof(*qxl), group_id);
+
+ fprintf(fd, "surface_cmd\n");
+ fprintf(fd, "surface_id %d\n", qxl->surface_id);
+ fprintf(fd, "type %d\n", qxl->type);
+ fprintf(fd, "flags %d\n", qxl->flags);
+
+ switch (qxl->type) {
+ case QXL_SURFACE_CMD_CREATE:
+ fprintf(fd, "u.surface_create.format %d\n", qxl->u.surface_create.format);
+ fprintf(fd, "u.surface_create.width %d\n", qxl->u.surface_create.width);
+ fprintf(fd, "u.surface_create.height %d\n", qxl->u.surface_create.height);
+ fprintf(fd, "u.surface_create.stride %d\n", qxl->u.surface_create.stride);
+ size = qxl->u.surface_create.height * abs(qxl->u.surface_create.stride);
+ if ((qxl->flags & QXL_SURF_FLAG_KEEP_DATA) != 0) {
+ write_binary(fd, "data", size,
+ (uint8_t*)memslot_get_virt(slots, qxl->u.surface_create.data, size, group_id));
+ }
+ break;
+ }
+}
+
+static void red_record_cursor(FILE *fd, RedMemSlotInfo *slots, int group_id,
+ QXLPHYSICAL addr)
+{
+ QXLCursor *qxl;
+
+ qxl = (QXLCursor *)memslot_get_virt(slots, addr, sizeof(*qxl), group_id);
+
+ fprintf(fd, "header.unique %" PRIu64 "\n", qxl->header.unique);
+ fprintf(fd, "header.type %d\n", qxl->header.type);
+ fprintf(fd, "header.width %d\n", qxl->header.width);
+ fprintf(fd, "header.height %d\n", qxl->header.height);
+ fprintf(fd, "header.hot_spot_x %d\n", qxl->header.hot_spot_x);
+ fprintf(fd, "header.hot_spot_y %d\n", qxl->header.hot_spot_y);
+
+ fprintf(fd, "data_size %d\n", qxl->data_size);
+ red_record_data_chunks_ptr(fd, "cursor", slots, group_id,
+ memslot_get_id(slots, addr),
+ &qxl->chunk);
+}
+
+static void red_record_cursor_cmd(FILE *fd, RedMemSlotInfo *slots, int group_id,
+ QXLPHYSICAL addr)
+{
+ QXLCursorCmd *qxl;
+
+ qxl = (QXLCursorCmd *)memslot_get_virt(slots, addr, sizeof(*qxl), group_id);
+
+ fprintf(fd, "cursor_cmd\n");
+ fprintf(fd, "type %d\n", qxl->type);
+ switch (qxl->type) {
+ case QXL_CURSOR_SET:
+ red_record_point16_ptr(fd, &qxl->u.set.position);
+ fprintf(fd, "u.set.visible %d\n", qxl->u.set.visible);
+ red_record_cursor(fd, slots, group_id, qxl->u.set.shape);
+ break;
+ case QXL_CURSOR_MOVE:
+ red_record_point16_ptr(fd, &qxl->u.position);
+ break;
+ case QXL_CURSOR_TRAIL:
+ fprintf(fd, "u.trail.length %d\n", qxl->u.trail.length);
+ fprintf(fd, "u.trail.frequency %d\n", qxl->u.trail.frequency);
+ break;
+ }
+}
+
+void red_record_primary_surface_create(RedRecord *record,
+ QXLDevSurfaceCreate* surface,
+ uint8_t *line_0)
+{
+ FILE *fd = record->fd;
+
+ pthread_mutex_lock(&record->lock);
+ fprintf(fd, "%d %d %d %d\n", surface->width, surface->height,
+ surface->stride, surface->format);
+ fprintf(fd, "%d %d %d %d\n", surface->position, surface->mouse_mode,
+ surface->flags, surface->type);
+ write_binary(fd, "data", line_0 ? abs(surface->stride)*surface->height : 0,
+ line_0);
+ pthread_mutex_unlock(&record->lock);
+}
+
+static void red_record_event_unlocked(RedRecord *record, int what, uint32_t type)
+{
+ red_time_t ts = spice_get_monotonic_time_ns();
+ // TODO: record the size of the packet in the header. This would make
+ // navigating it much faster (well, I can add an index while I'm at it..)
+ // and make it trivial to get a histogram from a file.
+ // But to implement that I would need some temporary buffer for each event.
+ // (that can be up to VGA_FRAMEBUFFER large)
+ fprintf(record->fd, "event %u %d %u %" PRIu64 "\n", record->counter++, what, type, ts);
+}
+
+void red_record_event(RedRecord *record, int what, uint32_t type)
+{
+ pthread_mutex_lock(&record->lock);
+ red_record_event_unlocked(record, what, type);
+ pthread_mutex_unlock(&record->lock);
+}
+
+void red_record_qxl_command(RedRecord *record, RedMemSlotInfo *slots,
+ QXLCommandExt ext_cmd)
+{
+ FILE *fd = record->fd;
+
+ pthread_mutex_lock(&record->lock);
+ red_record_event_unlocked(record, 0, ext_cmd.cmd.type);
+
+ switch (ext_cmd.cmd.type) {
+ case QXL_CMD_DRAW:
+ red_record_drawable(fd, slots, ext_cmd.group_id, ext_cmd.cmd.data, ext_cmd.flags);
+ break;
+ case QXL_CMD_UPDATE:
+ red_record_update_cmd(fd, slots, ext_cmd.group_id, ext_cmd.cmd.data);
+ break;
+ case QXL_CMD_MESSAGE:
+ red_record_message(fd, slots, ext_cmd.group_id, ext_cmd.cmd.data);
+ break;
+ case QXL_CMD_SURFACE:
+ red_record_surface_cmd(fd, slots, ext_cmd.group_id, ext_cmd.cmd.data);
+ break;
+ case QXL_CMD_CURSOR:
+ red_record_cursor_cmd(fd, slots, ext_cmd.group_id, ext_cmd.cmd.data);
+ break;
+ }
+ pthread_mutex_unlock(&record->lock);
+}
+
+#ifndef _WIN32
+/**
+ * Redirects child output to the file specified
+ */
+static void child_output_setup(gpointer user_data)
+{
+ int fd = GPOINTER_TO_INT(user_data);
+
+ while (dup2(fd, STDOUT_FILENO) < 0 && errno == EINTR) {
+ continue;
+ }
+ close(fd);
+}
+#endif
+
+RedRecord *red_record_new(const char *filename)
+{
+ static const char header[] = "SPICE_REPLAY 1\n";
+
+ const char *filter;
+ FILE *f;
+ RedRecord *record;
+
+ f = fopen(filename, "wb+");
+ if (!f) {
+ spice_error("failed to open recording file %s", filename);
+ }
+
+ filter = getenv("SPICE_WORKER_RECORD_FILTER");
+ if (filter) {
+#ifndef _WIN32
+ gint argc;
+ gchar **argv = NULL;
+ GError *error = NULL;
+ GPid child_pid;
+ gboolean ret;
+ gint fd_in = -1;
+
+ ret = g_shell_parse_argv(filter, &argc, &argv, &error);
+
+ if (ret)
+ ret = g_spawn_async_with_pipes(NULL, argv, NULL, G_SPAWN_SEARCH_PATH,
+ child_output_setup, GINT_TO_POINTER(fileno(f)), &child_pid,
+ &fd_in, NULL, NULL, &error);
+
+ g_strfreev(argv);
+ if (!ret) {
+ g_error_free(error);
+ fclose(f);
+ spice_error("failed to setup filter for replay");
+ }
+ while (dup2(fd_in, fileno(f)) < 0 && errno == EINTR) {
+ continue;
+ }
+ close(fd_in);
+ g_spawn_close_pid(child_pid);
+#else
+ // TODO
+ spice_warning("recorder filter not supported under Windows");
+#endif
+ }
+
+ if (fwrite(header, sizeof(header)-1, 1, f) != 1) {
+ spice_error("failed to write replay header");
+ }
+
+ record = g_new(RedRecord, 1);
+ record->refs = 1;
+ record->fd = f;
+ record->counter = 0;
+ pthread_mutex_init(&record->lock, NULL);
+ return record;
+}
+
+RedRecord *red_record_ref(RedRecord *record)
+{
+ g_atomic_int_inc(&record->refs);
+ return record;
+}
+
+void red_record_unref(RedRecord *record)
+{
+ if (!record || !g_atomic_int_dec_and_test(&record->refs)) {
+ return;
+ }
+ fclose(record->fd);
+ pthread_mutex_destroy(&record->lock);
+ g_free(record);
+}
diff --git a/server/red-record-qxl.h b/server/red-record-qxl.h
new file mode 100644
index 00000000..6de82b34
--- /dev/null
+++ b/server/red-record-qxl.h
@@ -0,0 +1,52 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009,2010 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef RED_RECORD_QXL_H_
+#define RED_RECORD_QXL_H_
+
+#include <spice/qxl_dev.h>
+
+#include "red-common.h"
+#include "memslot.h"
+#include "utils.h"
+
+SPICE_BEGIN_DECLS
+
+typedef struct RedRecord RedRecord;
+
+/**
+ * Create a new structure to handle recording.
+ * This function never returns NULL.
+ */
+RedRecord* red_record_new(const char *filename);
+
+RedRecord *red_record_ref(RedRecord *record);
+void red_record_unref(RedRecord *record);
+
+void red_record_primary_surface_create(RedRecord *record,
+ QXLDevSurfaceCreate *surface,
+ uint8_t *line_0);
+
+void red_record_event(RedRecord *record, int what, uint32_t type);
+
+void red_record_qxl_command(RedRecord *record, RedMemSlotInfo *slots,
+ QXLCommandExt ext_cmd);
+
+SPICE_END_DECLS
+
+#endif /* RED_RECORD_QXL_H_ */
diff --git a/server/red-replay-qxl.cpp b/server/red-replay-qxl.cpp
new file mode 100644
index 00000000..3b59be6c
--- /dev/null
+++ b/server/red-replay-qxl.cpp
@@ -0,0 +1,1497 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009,2010 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+
+#include <cinttypes>
+#include <zlib.h>
+#include <pthread.h>
+#include <glib.h>
+
+#include "reds.h"
+#include "red-qxl.h"
+#include "red-worker.h"
+#include "red-common.h"
+#include "memslot.h"
+#include "red-parse-qxl.h"
+
+static inline QXLPHYSICAL QXLPHYSICAL_FROM_PTR(const void *ptr)
+{
+ return static_cast<QXLPHYSICAL>(reinterpret_cast<uintptr_t>(ptr));
+}
+
+template <typename T>
+static inline T* QXLPHYSICAL_TO_PTR(QXLPHYSICAL phy)
+{
+ return reinterpret_cast<T*>(static_cast<uintptr_t>(phy));
+}
+
+enum replay_t {
+ REPLAY_OK = 0,
+ REPLAY_ERROR,
+};
+
+struct SpiceReplay {
+ FILE *fd;
+ gboolean error;
+ int counter;
+ bool created_primary;
+
+ GArray *id_map; // record id -> replay id
+ GArray *id_map_inv; // replay id -> record id
+ GArray *id_free; // free list
+ uint8_t *primary_mem;
+ int nsurfaces;
+ int end_pos;
+
+ GList *allocated;
+
+ pthread_mutex_t mutex;
+ pthread_cond_t cond;
+};
+
+static ssize_t replay_fread(SpiceReplay *replay, uint8_t *buf, size_t size)
+{
+ if (replay->error || feof(replay->fd) ||
+ fread(buf, 1, size, replay->fd) != size) {
+ replay->error = TRUE;
+ return 0;
+ }
+ return size;
+}
+
+#ifdef __USE_MINGW_ANSI_STDIO
+__attribute__((format(gnu_scanf, 2, 3)))
+#else
+__attribute__((format(scanf, 2, 3)))
+#endif
+static replay_t replay_fscanf_check(SpiceReplay *replay, const char *fmt, ...)
+{
+ va_list ap;
+ int ret;
+
+ replay->end_pos = -1;
+
+ if (replay->error) {
+ return REPLAY_ERROR;
+ }
+ if (feof(replay->fd)) {
+ replay->error = TRUE;
+ return REPLAY_ERROR;
+ }
+ va_start(ap, fmt);
+ ret = vfscanf(replay->fd, fmt, ap);
+ va_end(ap);
+ if (ret == EOF || replay->end_pos < 0) {
+ replay->error = TRUE;
+ }
+ return replay->error ? REPLAY_ERROR : REPLAY_OK;
+}
+#define replay_fscanf(r, fmt, ...) \
+ replay_fscanf_check(r, fmt "%n", ## __VA_ARGS__, &r->end_pos)
+
+static inline void *replay_malloc(SpiceReplay *replay, size_t size)
+{
+ void *mem = g_malloc(size);
+ replay->allocated = g_list_prepend(replay->allocated, mem);
+ return mem;
+}
+
+static inline void *replay_malloc0(SpiceReplay *replay, size_t size)
+{
+ void *mem = replay_malloc(replay, size);
+ memset(mem, 0, size);
+ return mem;
+}
+
+static inline void replay_free(SpiceReplay *replay, void *mem)
+{
+ replay->allocated = g_list_remove(replay->allocated, mem);
+ g_free(mem);
+}
+
+static inline void *replay_realloc(SpiceReplay *replay, void *mem, size_t n_bytes)
+{
+ GList *elem = g_list_find(replay->allocated, mem);
+ elem->data = g_realloc(mem, n_bytes);
+ return elem->data;
+}
+
+static uint32_t replay_id_get(SpiceReplay *replay, uint32_t id)
+{
+ uint32_t newid = 0;
+
+ /* TODO: this should be avoided, perhaps in recording? */
+ if (id == -1)
+ return id;
+
+ pthread_mutex_lock(&replay->mutex);
+ if (replay->id_map->len <= id) {
+ spice_warn_if_reached();
+ } else {
+ newid = g_array_index(replay->id_map, uint32_t, id);
+ }
+ pthread_mutex_unlock(&replay->mutex);
+
+ return newid;
+}
+
+static uint32_t replay_id_new(SpiceReplay *replay, uint32_t id)
+{
+ uint32_t new_id;
+ uint32_t *map;
+
+ pthread_mutex_lock(&replay->mutex);
+ while (true) {
+ if (replay->id_free->len > 0) {
+ new_id = g_array_index(replay->id_free, uint32_t, 0);
+ g_array_remove_index_fast(replay->id_free, 0);
+ } else {
+ new_id = replay->id_map_inv->len;
+ }
+
+ if (new_id < replay->nsurfaces)
+ break;
+ pthread_cond_wait(&replay->cond, &replay->mutex);
+ }
+
+ if (replay->id_map->len <= id)
+ g_array_set_size(replay->id_map, id + 1);
+ if (replay->id_map_inv->len <= new_id)
+ g_array_set_size(replay->id_map_inv, new_id + 1);
+
+ map = &g_array_index(replay->id_map, uint32_t, id);
+ *map = new_id;
+ map = &g_array_index(replay->id_map_inv, uint32_t, new_id);
+ *map = id;
+ pthread_mutex_unlock(&replay->mutex);
+
+ spice_debug("%u -> %u (map %u, inv %u)", id, new_id,
+ replay->id_map->len, replay->id_map_inv->len);
+
+ return new_id;
+}
+
+static void replay_id_free(SpiceReplay *replay, uint32_t id)
+{
+ uint32_t old_id;
+ uint32_t *map;
+
+ pthread_mutex_lock(&replay->mutex);
+ map = &g_array_index(replay->id_map_inv, uint32_t, id);
+ old_id = *map;
+ *map = -1;
+
+ if (old_id != -1) {
+ map = &g_array_index(replay->id_map, uint32_t, old_id);
+ if (*map == id)
+ *map = -1;
+
+ g_array_append_val(replay->id_free, id);
+ }
+ pthread_cond_signal(&replay->cond);
+ pthread_mutex_unlock(&replay->mutex);
+}
+
+
+#if 0
+static void hexdump(uint8_t *hex, uint8_t bytes)
+{
+ int i;
+
+ for (i = 0; i < bytes; i++) {
+ if (0 == i % 16) {
+ fprintf(stderr, "%lx: ", (size_t)hex+i);
+ }
+ if (0 == i % 4) {
+ fprintf(stderr, " ");
+ }
+ fprintf(stderr, " %02x", hex[i]);
+ if (15 == i % 16) {
+ fprintf(stderr, "\n");
+ }
+ }
+}
+#endif
+
+static replay_t read_binary(SpiceReplay *replay, const char *prefix, size_t *size, uint8_t
+ **buf, size_t base_size)
+{
+ char pattern[1024];
+ int with_zlib = -1;
+ unsigned int zlib_size;
+ uint8_t *zlib_buffer;
+ z_stream strm;
+
+ snprintf(pattern, sizeof(pattern), "binary %%d %s %%" PRIdPTR ":%%n", prefix);
+ replay_fscanf_check(replay, pattern, &with_zlib, size, &replay->end_pos);
+ if (replay->error) {
+ return REPLAY_ERROR;
+ }
+
+ if (*buf == nullptr) {
+ *buf = static_cast<uint8_t *>(replay_malloc(replay, *size + base_size));
+ }
+#if 0
+ {
+ int num_read = fread(*buf + base_size, *size, 1, fd);
+ spice_error("num_read = %d", num_read);
+ hexdump(*buf + base_size, *size);
+ }
+#else
+ if (with_zlib) {
+ int ret;
+
+ replay_fscanf(replay, "%u:", &zlib_size);
+ if (replay->error) {
+ return REPLAY_ERROR;
+ }
+ zlib_buffer = static_cast<uint8_t *>(replay_malloc(replay, zlib_size));
+ if (replay_fread(replay, zlib_buffer, zlib_size) != zlib_size) {
+ return REPLAY_ERROR;
+ }
+ strm.zalloc = Z_NULL;
+ strm.zfree = Z_NULL;
+ strm.opaque = Z_NULL;
+ strm.avail_in = zlib_size;
+ strm.next_in = zlib_buffer;
+ strm.avail_out = *size;
+ strm.next_out = *buf + base_size;
+ if ((ret = inflateInit(&strm)) != Z_OK) {
+ spice_error("inflateInit failed");
+ exit(1);
+ }
+ if ((ret = inflate(&strm, Z_NO_FLUSH)) != Z_STREAM_END) {
+ spice_error("inflate error %d (disc: %" G_GSSIZE_FORMAT ")",
+ ret, (size_t) (*size - strm.total_out));
+ if (ret == Z_DATA_ERROR) {
+ /* last operation may be wrong. since we do the recording
+ * in red_worker, when there is a shutdown from the vcpu/io thread
+ * it seems it may kill the red_worker thread (so a chunk is
+ * left hanging and the rest of the message is never written).
+ * Let it pass */
+ return REPLAY_ERROR;
+ }
+ if (ret != Z_OK) {
+ spice_warn_if_reached();
+ }
+ }
+ (void)inflateEnd(&strm);
+ replay_free(replay, zlib_buffer); // TODO - avoid repeat alloc/dealloc by keeping last
+ } else {
+ replay_fread(replay, *buf + base_size, *size);
+ }
+#endif
+ return replay_fscanf(replay, "\n");
+}
+
+static ssize_t red_replay_data_chunks(SpiceReplay *replay, const char *prefix,
+ uint8_t **mem, size_t base_size)
+{
+ size_t data_size;
+ unsigned int count_chunks;
+ size_t next_data_size;
+ QXLDataChunk *cur, *next;
+
+ replay_fscanf(replay, "data_chunks %u %" PRIuPTR "\n", &count_chunks, &data_size);
+ if (replay->error) {
+ return -1;
+ }
+ if (base_size == 0) {
+ base_size = sizeof(QXLDataChunk);
+ }
+
+ if (read_binary(replay, prefix, &next_data_size, mem, base_size) == REPLAY_ERROR) {
+ return -1;
+ }
+ cur = reinterpret_cast<QXLDataChunk *>(*mem + base_size - sizeof(QXLDataChunk));
+ cur->data_size = next_data_size;
+ data_size = cur->data_size;
+ cur->next_chunk = cur->prev_chunk = 0;
+ while (count_chunks-- > 0) {
+ uint8_t *data = nullptr;
+ if (read_binary(replay, prefix, &next_data_size, &data,
+ sizeof(QXLDataChunk)) == REPLAY_ERROR) {
+ return -1;
+ }
+ cur->next_chunk = QXLPHYSICAL_FROM_PTR(data);
+ data_size += next_data_size;
+ next = QXLPHYSICAL_TO_PTR<QXLDataChunk>(cur->next_chunk);
+ next->prev_chunk = QXLPHYSICAL_FROM_PTR(cur);
+ next->data_size = next_data_size;
+ next->next_chunk = 0;
+ cur = next;
+ }
+
+ return data_size;
+}
+
+static void red_replay_data_chunks_free(SpiceReplay *replay, void *data, size_t base_size)
+{
+ auto cur = reinterpret_cast<QXLDataChunk *>(static_cast<uint8_t *>(data) +
+ (base_size ? base_size - sizeof(QXLDataChunk) : 0));
+
+ cur = QXLPHYSICAL_TO_PTR<QXLDataChunk>(cur->next_chunk);
+ while (cur) {
+ auto next = QXLPHYSICAL_TO_PTR<QXLDataChunk>(cur->next_chunk);
+ g_free(cur);
+ cur = next;
+ }
+
+ g_free(data);
+}
+
+static void red_replay_point_ptr(SpiceReplay *replay, QXLPoint *qxl)
+{
+ replay_fscanf(replay, "point %d %d\n", &qxl->x, &qxl->y);
+}
+
+static void red_replay_point16_ptr(SpiceReplay *replay, QXLPoint16 *qxl)
+{
+ int x, y;
+ replay_fscanf(replay, "point16 %d %d\n", &x, &y);
+ qxl->x = x;
+ qxl->y = y;
+}
+
+static void red_replay_rect_ptr(SpiceReplay *replay, const char *prefix, QXLRect *qxl)
+{
+ char pattern[1024];
+
+ snprintf(pattern, sizeof(pattern), "rect %s %%d %%d %%d %%d\n%%n", prefix);
+ replay_fscanf_check(replay, pattern, &qxl->top, &qxl->left, &qxl->bottom, &qxl->right,
+ &replay->end_pos);
+}
+
+static QXLPath *red_replay_path(SpiceReplay *replay)
+{
+ QXLPath *qxl = nullptr;
+ ssize_t data_size;
+
+ data_size =
+ red_replay_data_chunks(replay, "path", reinterpret_cast<uint8_t **>(&qxl), sizeof(QXLPath));
+ if (data_size < 0) {
+ return nullptr;
+ }
+ qxl->data_size = data_size;
+ return qxl;
+}
+
+static void red_replay_path_free(SpiceReplay *replay, QXLPHYSICAL p)
+{
+ auto qxl = QXLPHYSICAL_TO_PTR<QXLPath>(p);
+
+ red_replay_data_chunks_free(replay, qxl, sizeof(*qxl));
+}
+
+static QXLClipRects *red_replay_clip_rects(SpiceReplay *replay)
+{
+ QXLClipRects *qxl = nullptr;
+ unsigned int num_rects;
+
+ replay_fscanf(replay, "num_rects %u\n", &num_rects);
+ if (replay->error) {
+ return nullptr;
+ }
+ if (red_replay_data_chunks(replay, "clip_rects", reinterpret_cast<uint8_t **>(&qxl),
+ sizeof(QXLClipRects)) < 0) {
+ return nullptr;
+ }
+ qxl->num_rects = num_rects;
+ return qxl;
+}
+
+static void red_replay_clip_rects_free(SpiceReplay *replay, QXLClipRects *qxl)
+{
+ red_replay_data_chunks_free(replay, qxl, sizeof(*qxl));
+}
+
+static uint8_t *red_replay_image_data_flat(SpiceReplay *replay, size_t *size)
+{
+ uint8_t *data = nullptr;
+
+ read_binary(replay, "image_data_flat", size, &data, 0);
+ return data;
+}
+
+static QXLImage *red_replay_image(SpiceReplay *replay, uint32_t flags)
+{
+ QXLImage* qxl = nullptr, *data;
+ size_t bitmap_size;
+ ssize_t size;
+ uint8_t qxl_flags;
+ int temp;
+ int has_palette;
+ int has_image;
+
+ replay_fscanf(replay, "image %d\n", &has_image);
+ if (replay->error) {
+ return nullptr;
+ }
+ if (!has_image) {
+ return nullptr;
+ }
+
+ qxl = static_cast<QXLImage *>(replay_malloc0(replay, sizeof(QXLImage)));
+ replay_fscanf(replay, "descriptor.id %" SCNu64 "\n", &qxl->descriptor.id);
+ replay_fscanf(replay, "descriptor.type %d\n", &temp); qxl->descriptor.type = temp;
+ replay_fscanf(replay, "descriptor.flags %d\n", &temp); qxl->descriptor.flags = temp;
+ replay_fscanf(replay, "descriptor.width %d\n", &qxl->descriptor.width);
+ replay_fscanf(replay, "descriptor.height %d\n", &qxl->descriptor.height);
+ if (replay->error) {
+ return nullptr;
+ }
+
+ switch (qxl->descriptor.type) {
+ case SPICE_IMAGE_TYPE_BITMAP:
+ replay_fscanf(replay, "bitmap.format %d\n", &temp); qxl->bitmap.format = temp;
+ replay_fscanf(replay, "bitmap.flags %d\n", &temp); qxl->bitmap.flags = temp;
+ replay_fscanf(replay, "bitmap.x %d\n", &qxl->bitmap.x);
+ replay_fscanf(replay, "bitmap.y %d\n", &qxl->bitmap.y);
+ replay_fscanf(replay, "bitmap.stride %d\n", &qxl->bitmap.stride);
+ qxl_flags = qxl->bitmap.flags;
+ replay_fscanf(replay, "has_palette %d\n", &has_palette);
+ if (has_palette) {
+ QXLPalette *qp;
+ unsigned int i, num_ents;
+
+ replay_fscanf(replay, "qp.num_ents %u\n", &num_ents);
+ if (replay->error) {
+ return nullptr;
+ }
+ qp = static_cast<QXLPalette *>(
+ replay_malloc(replay, sizeof(QXLPalette) + num_ents * sizeof(qp->ents[0])));
+ qp->num_ents = num_ents;
+ qxl->bitmap.palette = QXLPHYSICAL_FROM_PTR(qp);
+ replay_fscanf(replay, "unique %" SCNu64 "\n", &qp->unique);
+ for (i = 0; i < num_ents; i++) {
+ replay_fscanf(replay, "ents %d\n", &qp->ents[i]);
+ }
+ } else {
+ qxl->bitmap.palette = 0;
+ }
+ bitmap_size = qxl->bitmap.y * qxl->bitmap.stride;
+ qxl->bitmap.data = 0;
+ if (qxl_flags & QXL_BITMAP_DIRECT) {
+ qxl->bitmap.data = QXLPHYSICAL_FROM_PTR(red_replay_image_data_flat(replay, &bitmap_size));
+ } else {
+ uint8_t *bitmap_data = nullptr;
+ size = red_replay_data_chunks(replay, "bitmap.data", &bitmap_data, 0);
+ qxl->bitmap.data = QXLPHYSICAL_FROM_PTR(bitmap_data);
+ if (size != bitmap_size) {
+ g_warning("bad image, %" G_GSIZE_FORMAT " != %" G_GSIZE_FORMAT, size, bitmap_size);
+ return nullptr;
+ }
+ }
+ break;
+ case SPICE_IMAGE_TYPE_SURFACE:
+ replay_fscanf(replay, "surface_image.surface_id %d\n", &qxl->surface_image.surface_id);
+ if (replay->error) {
+ return nullptr;
+ }
+ qxl->surface_image.surface_id = replay_id_get(replay, qxl->surface_image.surface_id);
+ break;
+ case SPICE_IMAGE_TYPE_QUIC:
+ // TODO - make this much nicer (precompute size and allocs, store them during
+ // record, then reread into them. and use MPEG-4).
+ replay_fscanf(replay, "quic.data_size %d\n", &qxl->quic.data_size);
+ if (replay->error) {
+ return nullptr;
+ }
+ data = nullptr;
+ size = red_replay_data_chunks(replay, "quic.data", reinterpret_cast<uint8_t **>(&data),
+ sizeof(QXLImageDescriptor) + sizeof(QXLQUICData) +
+ sizeof(QXLDataChunk));
+ spice_assert(size == qxl->quic.data_size);
+ data->descriptor = qxl->descriptor;
+ data->quic.data_size = qxl->quic.data_size;
+ replay_free(replay, qxl);
+ qxl = data;
+ break;
+ default:
+ spice_warn_if_reached();
+ }
+ return qxl;
+}
+
+static void red_replay_image_free(SpiceReplay *replay, QXLPHYSICAL p, uint32_t flags)
+{
+ auto qxl = QXLPHYSICAL_TO_PTR<QXLImage>(p);
+ if (!qxl)
+ return;
+
+ switch (qxl->descriptor.type) {
+ case SPICE_IMAGE_TYPE_BITMAP:
+ g_free(QXLPHYSICAL_TO_PTR<QXLPalette>(qxl->bitmap.palette));
+ if (qxl->bitmap.flags & QXL_BITMAP_DIRECT) {
+ g_free(QXLPHYSICAL_TO_PTR<void>(qxl->bitmap.data));
+ } else {
+ red_replay_data_chunks_free(replay,
+ QXLPHYSICAL_TO_PTR<QXLDataChunk>(qxl->bitmap.data), 0);
+ }
+ break;
+ case SPICE_IMAGE_TYPE_SURFACE:
+ break;
+ case SPICE_IMAGE_TYPE_QUIC:
+ red_replay_data_chunks_free(replay, qxl,
+ sizeof(QXLImageDescriptor) + sizeof(QXLQUICData) +
+ sizeof(QXLDataChunk));
+ qxl = nullptr;
+ break;
+ default:
+ spice_warn_if_reached();
+ }
+
+ g_free(qxl);
+}
+
+static void red_replay_brush_ptr(SpiceReplay *replay, QXLBrush *qxl, uint32_t flags)
+{
+ replay_fscanf(replay, "type %d\n", &qxl->type);
+ if (replay->error) {
+ return;
+ }
+
+ switch (qxl->type) {
+ case SPICE_BRUSH_TYPE_SOLID:
+ replay_fscanf(replay, "u.color %d\n", &qxl->u.color);
+ break;
+ case SPICE_BRUSH_TYPE_PATTERN:
+ qxl->u.pattern.pat = QXLPHYSICAL_FROM_PTR(red_replay_image(replay, flags));
+ red_replay_point_ptr(replay, &qxl->u.pattern.pos);
+ break;
+ }
+}
+
+static void red_replay_brush_free(SpiceReplay *replay, QXLBrush *qxl, uint32_t flags)
+{
+ switch (qxl->type) {
+ case SPICE_BRUSH_TYPE_PATTERN:
+ red_replay_image_free(replay, qxl->u.pattern.pat, flags);
+ break;
+ }
+}
+
+static void red_replay_qmask_ptr(SpiceReplay *replay, QXLQMask *qxl, uint32_t flags)
+{
+ int temp;
+
+ replay_fscanf(replay, "flags %d\n", &temp); qxl->flags = temp;
+ red_replay_point_ptr(replay, &qxl->pos);
+ qxl->bitmap = QXLPHYSICAL_FROM_PTR(red_replay_image(replay, flags));
+}
+
+static void red_replay_qmask_free(SpiceReplay *replay, QXLQMask *qxl, uint32_t flags)
+{
+ red_replay_image_free(replay, qxl->bitmap, flags);
+}
+
+static void red_replay_fill_ptr(SpiceReplay *replay, QXLFill *qxl, uint32_t flags)
+{
+ int temp;
+
+ red_replay_brush_ptr(replay, &qxl->brush, flags);
+ replay_fscanf(replay, "rop_descriptor %d\n", &temp); qxl->rop_descriptor = temp;
+ red_replay_qmask_ptr(replay, &qxl->mask, flags);
+}
+
+static void red_replay_fill_free(SpiceReplay *replay, QXLFill *qxl, uint32_t flags)
+{
+ red_replay_brush_free(replay, &qxl->brush, flags);
+ red_replay_qmask_free(replay, &qxl->mask, flags);
+}
+
+static void red_replay_opaque_ptr(SpiceReplay *replay, QXLOpaque *qxl, uint32_t flags)
+{
+ int temp;
+
+ qxl->src_bitmap = QXLPHYSICAL_FROM_PTR(red_replay_image(replay, flags));
+ red_replay_rect_ptr(replay, "src_area", &qxl->src_area);
+ red_replay_brush_ptr(replay, &qxl->brush, flags);
+ replay_fscanf(replay, "rop_descriptor %d\n", &temp); qxl->rop_descriptor = temp;
+ replay_fscanf(replay, "scale_mode %d\n", &temp); qxl->scale_mode = temp;
+ red_replay_qmask_ptr(replay, &qxl->mask, flags);
+}
+
+static void red_replay_opaque_free(SpiceReplay *replay, QXLOpaque *qxl, uint32_t flags)
+{
+ red_replay_image_free(replay, qxl->src_bitmap, flags);
+ red_replay_brush_free(replay, &qxl->brush, flags);
+ red_replay_qmask_free(replay, &qxl->mask, flags);
+}
+
+static void red_replay_copy_ptr(SpiceReplay *replay, QXLCopy *qxl, uint32_t flags)
+{
+ int temp;
+
+ qxl->src_bitmap = QXLPHYSICAL_FROM_PTR(red_replay_image(replay, flags));
+ red_replay_rect_ptr(replay, "src_area", &qxl->src_area);
+ replay_fscanf(replay, "rop_descriptor %d\n", &temp); qxl->rop_descriptor = temp;
+ replay_fscanf(replay, "scale_mode %d\n", &temp); qxl->scale_mode = temp;
+ red_replay_qmask_ptr(replay, &qxl->mask, flags);
+}
+
+static void red_replay_copy_free(SpiceReplay *replay, QXLCopy *qxl, uint32_t flags)
+{
+ red_replay_image_free(replay, qxl->src_bitmap, flags);
+ red_replay_qmask_free(replay, &qxl->mask, flags);
+}
+
+static void red_replay_blend_ptr(SpiceReplay *replay, QXLBlend *qxl, uint32_t flags)
+{
+ int temp;
+
+ qxl->src_bitmap = QXLPHYSICAL_FROM_PTR(red_replay_image(replay, flags));
+ red_replay_rect_ptr(replay, "src_area", &qxl->src_area);
+ replay_fscanf(replay, "rop_descriptor %d\n", &temp); qxl->rop_descriptor = temp;
+ replay_fscanf(replay, "scale_mode %d\n", &temp); qxl->scale_mode = temp;
+ red_replay_qmask_ptr(replay, &qxl->mask, flags);
+}
+
+static void red_replay_blend_free(SpiceReplay *replay, QXLBlend *qxl, uint32_t flags)
+{
+ red_replay_image_free(replay, qxl->src_bitmap, flags);
+ red_replay_qmask_free(replay, &qxl->mask, flags);
+}
+
+static void red_replay_transparent_ptr(SpiceReplay *replay, QXLTransparent *qxl, uint32_t flags)
+{
+ qxl->src_bitmap = QXLPHYSICAL_FROM_PTR(red_replay_image(replay, flags));
+ red_replay_rect_ptr(replay, "src_area", &qxl->src_area);
+ replay_fscanf(replay, "src_color %d\n", &qxl->src_color);
+ replay_fscanf(replay, "true_color %d\n", &qxl->true_color);
+}
+
+static void red_replay_transparent_free(SpiceReplay *replay, QXLTransparent *qxl, uint32_t flags)
+{
+ red_replay_image_free(replay, qxl->src_bitmap, flags);
+}
+
+static void red_replay_alpha_blend_ptr(SpiceReplay *replay, QXLAlphaBlend *qxl, uint32_t flags)
+{
+ int temp;
+
+ replay_fscanf(replay, "alpha_flags %d\n", &temp); qxl->alpha_flags = temp;
+ replay_fscanf(replay, "alpha %d\n", &temp); qxl->alpha = temp;
+ qxl->src_bitmap = QXLPHYSICAL_FROM_PTR(red_replay_image(replay, flags));
+ red_replay_rect_ptr(replay, "src_area", &qxl->src_area);
+}
+
+static void red_replay_alpha_blend_free(SpiceReplay *replay, QXLAlphaBlend *qxl, uint32_t flags)
+{
+ red_replay_image_free(replay, qxl->src_bitmap, flags);
+}
+
+static void red_replay_alpha_blend_ptr_compat(SpiceReplay *replay, QXLCompatAlphaBlend *qxl, uint32_t flags)
+{
+ int temp;
+
+ replay_fscanf(replay, "alpha %d\n", &temp); qxl->alpha = temp;
+ qxl->src_bitmap = QXLPHYSICAL_FROM_PTR(red_replay_image(replay, flags));
+ red_replay_rect_ptr(replay, "src_area", &qxl->src_area);
+}
+
+static void red_replay_rop3_ptr(SpiceReplay *replay, QXLRop3 *qxl, uint32_t flags)
+{
+ int temp;
+
+ qxl->src_bitmap = QXLPHYSICAL_FROM_PTR(red_replay_image(replay, flags));
+ red_replay_rect_ptr(replay, "src_area", &qxl->src_area);
+ red_replay_brush_ptr(replay, &qxl->brush, flags);
+ replay_fscanf(replay, "rop3 %d\n", &temp); qxl->rop3 = temp;
+ replay_fscanf(replay, "scale_mode %d\n", &temp); qxl->scale_mode = temp;
+ red_replay_qmask_ptr(replay, &qxl->mask, flags);
+}
+
+static void red_replay_rop3_free(SpiceReplay *replay, QXLRop3 *qxl, uint32_t flags)
+{
+ red_replay_image_free(replay, qxl->src_bitmap, flags);
+ red_replay_brush_free(replay, &qxl->brush, flags);
+ red_replay_qmask_free(replay, &qxl->mask, flags);
+}
+
+static void red_replay_stroke_ptr(SpiceReplay *replay, QXLStroke *qxl, uint32_t flags)
+{
+ int temp;
+
+ qxl->path = QXLPHYSICAL_FROM_PTR(red_replay_path(replay));
+ replay_fscanf(replay, "attr.flags %d\n", &temp); qxl->attr.flags = temp;
+ if (replay->error) {
+ return;
+ }
+ if (qxl->attr.flags & SPICE_LINE_FLAGS_STYLED) {
+ size_t size;
+
+ replay_fscanf(replay, "attr.style_nseg %d\n", &temp); qxl->attr.style_nseg = temp;
+ uint8_t *data = nullptr;
+ read_binary(replay, "style", &size, &data, 0);
+ qxl->attr.style = QXLPHYSICAL_FROM_PTR(data);
+ }
+ red_replay_brush_ptr(replay, &qxl->brush, flags);
+ replay_fscanf(replay, "fore_mode %d\n", &temp); qxl->fore_mode = temp;
+ replay_fscanf(replay, "back_mode %d\n", &temp); qxl->back_mode = temp;
+}
+
+static void red_replay_stroke_free(SpiceReplay *replay, QXLStroke *qxl, uint32_t flags)
+{
+ red_replay_path_free(replay, qxl->path);
+ if (qxl->attr.flags & SPICE_LINE_FLAGS_STYLED) {
+ g_free(QXLPHYSICAL_TO_PTR<void>(qxl->attr.style));
+ }
+ red_replay_brush_free(replay, &qxl->brush, flags);
+}
+
+static QXLString *red_replay_string(SpiceReplay *replay)
+{
+ int temp;
+ uint32_t data_size;
+ uint16_t length;
+ uint16_t flags;
+ ssize_t chunk_size;
+ QXLString *qxl = nullptr;
+
+ replay_fscanf(replay, "data_size %d\n", &data_size);
+ replay_fscanf(replay, "length %d\n", &temp); length = temp;
+ replay_fscanf(replay, "flags %d\n", &temp); flags = temp;
+ chunk_size = red_replay_data_chunks(replay, "string", reinterpret_cast<uint8_t **>(&qxl),
+ sizeof(QXLString));
+ if (chunk_size < 0) {
+ return nullptr;
+ }
+ qxl->data_size = data_size;
+ qxl->length = length;
+ qxl->flags = flags;
+ spice_assert(chunk_size == qxl->data_size);
+ return qxl;
+}
+
+static void red_replay_string_free(SpiceReplay *replay, QXLString *qxl)
+{
+ red_replay_data_chunks_free(replay, qxl, sizeof(*qxl));
+}
+
+static void red_replay_text_ptr(SpiceReplay *replay, QXLText *qxl, uint32_t flags)
+{
+ int temp;
+
+ qxl->str = QXLPHYSICAL_FROM_PTR(red_replay_string(replay));
+ red_replay_rect_ptr(replay, "back_area", &qxl->back_area);
+ red_replay_brush_ptr(replay, &qxl->fore_brush, flags);
+ red_replay_brush_ptr(replay, &qxl->back_brush, flags);
+ replay_fscanf(replay, "fore_mode %d\n", &temp); qxl->fore_mode = temp;
+ replay_fscanf(replay, "back_mode %d\n", &temp); qxl->back_mode = temp;
+}
+
+static void red_replay_text_free(SpiceReplay *replay, QXLText *qxl, uint32_t flags)
+{
+ red_replay_string_free(replay, QXLPHYSICAL_TO_PTR<QXLString>(qxl->str));
+ red_replay_brush_free(replay, &qxl->fore_brush, flags);
+ red_replay_brush_free(replay, &qxl->back_brush, flags);
+}
+
+static void red_replay_whiteness_ptr(SpiceReplay *replay, QXLWhiteness *qxl, uint32_t flags)
+{
+ red_replay_qmask_ptr(replay, &qxl->mask, flags);
+}
+
+static void red_replay_whiteness_free(SpiceReplay *replay, QXLWhiteness *qxl, uint32_t flags)
+{
+ red_replay_qmask_free(replay, &qxl->mask, flags);
+}
+
+static void red_replay_blackness_ptr(SpiceReplay *replay, QXLBlackness *qxl, uint32_t flags)
+{
+ red_replay_qmask_ptr(replay, &qxl->mask, flags);
+}
+
+static void red_replay_blackness_free(SpiceReplay *replay, QXLBlackness *qxl, uint32_t flags)
+{
+ red_replay_qmask_free(replay, &qxl->mask, flags);
+}
+
+static void red_replay_invers_ptr(SpiceReplay *replay, QXLInvers *qxl, uint32_t flags)
+{
+ red_replay_qmask_ptr(replay, &qxl->mask, flags);
+}
+
+static void red_replay_invers_free(SpiceReplay *replay, QXLInvers *qxl, uint32_t flags)
+{
+ red_replay_qmask_free(replay, &qxl->mask, flags);
+}
+
+static void red_replay_clip_ptr(SpiceReplay *replay, QXLClip *qxl)
+{
+ replay_fscanf(replay, "type %d\n", &qxl->type);
+ if (replay->error) {
+ return;
+ }
+ switch (qxl->type) {
+ case SPICE_CLIP_TYPE_RECTS:
+ qxl->data = QXLPHYSICAL_FROM_PTR(red_replay_clip_rects(replay));
+ break;
+ }
+}
+
+static void red_replay_clip_free(SpiceReplay *replay, QXLClip *qxl)
+{
+ switch (qxl->type) {
+ case SPICE_CLIP_TYPE_RECTS:
+ red_replay_clip_rects_free(replay,
+ QXLPHYSICAL_TO_PTR<QXLClipRects>(qxl->data));
+ break;
+ }
+}
+
+static uint8_t *red_replay_transform(SpiceReplay *replay)
+{
+ uint8_t *data = nullptr;
+ size_t size;
+
+ read_binary(replay, "transform", &size, &data, 0);
+ spice_warn_if_fail(size == sizeof(SpiceTransform));
+
+ return data;
+}
+
+static void red_replay_composite_ptr(SpiceReplay *replay, QXLComposite *qxl, uint32_t flags)
+{
+ int enabled = 0;
+
+ replay_fscanf(replay, "flags %d\n", &qxl->flags);
+ qxl->src = QXLPHYSICAL_FROM_PTR(red_replay_image(replay, flags));
+
+ replay_fscanf(replay, "src_transform %d\n", &enabled);
+ qxl->src_transform = enabled ? QXLPHYSICAL_FROM_PTR(red_replay_transform(replay)) : 0;
+
+ replay_fscanf(replay, "mask %d\n", &enabled);
+ qxl->mask = enabled ? QXLPHYSICAL_FROM_PTR(red_replay_image(replay, flags)) : 0;
+
+ replay_fscanf(replay, "mask_transform %d\n", &enabled);
+ qxl->mask_transform = enabled ? QXLPHYSICAL_FROM_PTR(red_replay_transform(replay)) : 0;
+
+ replay_fscanf(replay, "src_origin %" SCNi16 " %" SCNi16 "\n", &qxl->src_origin.x, &qxl->src_origin.y);
+ replay_fscanf(replay, "mask_origin %" SCNi16 " %" SCNi16 "\n", &qxl->mask_origin.x, &qxl->mask_origin.y);
+}
+
+static void red_replay_composite_free(SpiceReplay *replay, QXLComposite *qxl, uint32_t flags)
+{
+ red_replay_image_free(replay, qxl->src, flags);
+ g_free(QXLPHYSICAL_TO_PTR<void>(qxl->src_transform));
+ red_replay_image_free(replay, qxl->mask, flags);
+ g_free(QXLPHYSICAL_TO_PTR<void>(qxl->mask_transform));
+
+}
+
+static QXLDrawable *red_replay_native_drawable(SpiceReplay *replay, uint32_t flags)
+{
+ auto qxl = static_cast<QXLDrawable *>(
+ replay_malloc0(replay, sizeof(QXLDrawable))); // TODO - this is too large usually
+ int i;
+ int temp;
+
+ red_replay_rect_ptr(replay, "bbox", &qxl->bbox);
+ red_replay_clip_ptr(replay, &qxl->clip);
+ replay_fscanf(replay, "effect %d\n", &temp); qxl->effect = temp;
+ replay_fscanf(replay, "mm_time %d\n", &qxl->mm_time);
+ replay_fscanf(replay, "self_bitmap %d\n", &temp); qxl->self_bitmap = temp;
+ red_replay_rect_ptr(replay, "self_bitmap_area", &qxl->self_bitmap_area);
+ replay_fscanf(replay, "surface_id %d\n", &qxl->surface_id);
+ if (replay->error) {
+ return nullptr;
+ }
+ qxl->surface_id = replay_id_get(replay, qxl->surface_id);
+
+ for (i = 0; i < 3; i++) {
+ replay_fscanf(replay, "surfaces_dest %d\n", &qxl->surfaces_dest[i]);
+ if (replay->error) {
+ return nullptr;
+ }
+ qxl->surfaces_dest[i] = replay_id_get(replay, qxl->surfaces_dest[i]);
+ red_replay_rect_ptr(replay, "surfaces_rects", &qxl->surfaces_rects[i]);
+ }
+
+ replay_fscanf(replay, "type %d\n", &temp); qxl->type = temp;
+ if (replay->error) {
+ return nullptr;
+ }
+ switch (qxl->type) {
+ case QXL_DRAW_ALPHA_BLEND:
+ red_replay_alpha_blend_ptr(replay, &qxl->u.alpha_blend, flags);
+ break;
+ case QXL_DRAW_BLACKNESS:
+ red_replay_blackness_ptr(replay, &qxl->u.blackness, flags);
+ break;
+ case QXL_DRAW_BLEND:
+ red_replay_blend_ptr(replay, &qxl->u.blend, flags);
+ break;
+ case QXL_DRAW_COPY:
+ red_replay_copy_ptr(replay, &qxl->u.copy, flags);
+ break;
+ case QXL_COPY_BITS:
+ red_replay_point_ptr(replay, &qxl->u.copy_bits.src_pos);
+ break;
+ case QXL_DRAW_FILL:
+ red_replay_fill_ptr(replay, &qxl->u.fill, flags);
+ break;
+ case QXL_DRAW_OPAQUE:
+ red_replay_opaque_ptr(replay, &qxl->u.opaque, flags);
+ break;
+ case QXL_DRAW_INVERS:
+ red_replay_invers_ptr(replay, &qxl->u.invers, flags);
+ break;
+ case QXL_DRAW_NOP:
+ break;
+ case QXL_DRAW_ROP3:
+ red_replay_rop3_ptr(replay, &qxl->u.rop3, flags);
+ break;
+ case QXL_DRAW_STROKE:
+ red_replay_stroke_ptr(replay, &qxl->u.stroke, flags);
+ break;
+ case QXL_DRAW_TEXT:
+ red_replay_text_ptr(replay, &qxl->u.text, flags);
+ break;
+ case QXL_DRAW_TRANSPARENT:
+ red_replay_transparent_ptr(replay, &qxl->u.transparent, flags);
+ break;
+ case QXL_DRAW_WHITENESS:
+ red_replay_whiteness_ptr(replay, &qxl->u.whiteness, flags);
+ break;
+ case QXL_DRAW_COMPOSITE:
+ red_replay_composite_ptr(replay, &qxl->u.composite, flags);
+ break;
+ default:
+ spice_warn_if_reached();
+ break;
+ };
+ return qxl;
+}
+
+static void red_replay_native_drawable_free(SpiceReplay *replay, QXLDrawable *qxl, uint32_t flags)
+{
+ red_replay_clip_free(replay, &qxl->clip);
+
+ switch (qxl->type) {
+ case QXL_DRAW_ALPHA_BLEND:
+ red_replay_alpha_blend_free(replay, &qxl->u.alpha_blend, flags);
+ break;
+ case QXL_DRAW_BLACKNESS:
+ red_replay_blackness_free(replay, &qxl->u.blackness, flags);
+ break;
+ case QXL_DRAW_BLEND:
+ red_replay_blend_free(replay, &qxl->u.blend, flags);
+ break;
+ case QXL_DRAW_COPY:
+ red_replay_copy_free(replay, &qxl->u.copy, flags);
+ break;
+ case QXL_COPY_BITS:
+ break;
+ case QXL_DRAW_FILL:
+ red_replay_fill_free(replay, &qxl->u.fill, flags);
+ break;
+ case QXL_DRAW_OPAQUE:
+ red_replay_opaque_free(replay, &qxl->u.opaque, flags);
+ break;
+ case QXL_DRAW_INVERS:
+ red_replay_invers_free(replay, &qxl->u.invers, flags);
+ break;
+ case QXL_DRAW_NOP:
+ break;
+ case QXL_DRAW_ROP3:
+ red_replay_rop3_free(replay, &qxl->u.rop3, flags);
+ break;
+ case QXL_DRAW_STROKE:
+ red_replay_stroke_free(replay, &qxl->u.stroke, flags);
+ break;
+ case QXL_DRAW_TEXT:
+ red_replay_text_free(replay, &qxl->u.text, flags);
+ break;
+ case QXL_DRAW_TRANSPARENT:
+ red_replay_transparent_free(replay, &qxl->u.transparent, flags);
+ break;
+ case QXL_DRAW_WHITENESS:
+ red_replay_whiteness_free(replay, &qxl->u.whiteness, flags);
+ break;
+ case QXL_DRAW_COMPOSITE:
+ red_replay_composite_free(replay, &qxl->u.composite, flags);
+ break;
+ default:
+ spice_warn_if_reached();
+ break;
+ };
+
+ g_free(qxl);
+}
+
+static QXLCompatDrawable *red_replay_compat_drawable(SpiceReplay *replay, uint32_t flags)
+{
+ int temp;
+ auto qxl = static_cast<QXLCompatDrawable *>(
+ replay_malloc0(replay, sizeof(QXLCompatDrawable))); // TODO - too large usually
+
+ red_replay_rect_ptr(replay, "bbox", &qxl->bbox);
+ red_replay_clip_ptr(replay, &qxl->clip);
+ replay_fscanf(replay, "effect %d\n", &temp); qxl->effect = temp;
+ replay_fscanf(replay, "mm_time %d\n", &qxl->mm_time);
+
+ replay_fscanf(replay, "bitmap_offset %d\n", &temp); qxl->bitmap_offset = temp;
+ red_replay_rect_ptr(replay, "bitmap_area", &qxl->bitmap_area);
+
+ replay_fscanf(replay, "type %d\n", &temp); qxl->type = temp;
+ if (replay->error) {
+ return nullptr;
+ }
+ switch (qxl->type) {
+ case QXL_DRAW_ALPHA_BLEND:
+ red_replay_alpha_blend_ptr_compat(replay, &qxl->u.alpha_blend, flags);
+ break;
+ case QXL_DRAW_BLACKNESS:
+ red_replay_blackness_ptr(replay, &qxl->u.blackness, flags);
+ break;
+ case QXL_DRAW_BLEND:
+ red_replay_blend_ptr(replay, &qxl->u.blend, flags);
+ break;
+ case QXL_DRAW_COPY:
+ red_replay_copy_ptr(replay, &qxl->u.copy, flags);
+ break;
+ case QXL_COPY_BITS:
+ red_replay_point_ptr(replay, &qxl->u.copy_bits.src_pos);
+ break;
+ case QXL_DRAW_FILL:
+ red_replay_fill_ptr(replay, &qxl->u.fill, flags);
+ break;
+ case QXL_DRAW_OPAQUE:
+ red_replay_opaque_ptr(replay, &qxl->u.opaque, flags);
+ break;
+ case QXL_DRAW_INVERS:
+ red_replay_invers_ptr(replay, &qxl->u.invers, flags);
+ break;
+ case QXL_DRAW_NOP:
+ break;
+ case QXL_DRAW_ROP3:
+ red_replay_rop3_ptr(replay, &qxl->u.rop3, flags);
+ break;
+ case QXL_DRAW_STROKE:
+ red_replay_stroke_ptr(replay, &qxl->u.stroke, flags);
+ break;
+ case QXL_DRAW_TEXT:
+ red_replay_text_ptr(replay, &qxl->u.text, flags);
+ break;
+ case QXL_DRAW_TRANSPARENT:
+ red_replay_transparent_ptr(replay, &qxl->u.transparent, flags);
+ break;
+ case QXL_DRAW_WHITENESS:
+ red_replay_whiteness_ptr(replay, &qxl->u.whiteness, flags);
+ break;
+ default:
+ spice_error("unknown type %d", qxl->type);
+ break;
+ };
+ return qxl;
+}
+
+static QXLPHYSICAL red_replay_drawable(SpiceReplay *replay, uint32_t flags)
+{
+ replay_fscanf(replay, "drawable\n");
+ if (replay->error) {
+ return 0;
+ }
+ if (flags & QXL_COMMAND_FLAG_COMPAT) {
+ return QXLPHYSICAL_FROM_PTR(red_replay_compat_drawable(replay, flags));
+ }
+ return QXLPHYSICAL_FROM_PTR(red_replay_native_drawable(replay, flags));
+}
+
+static QXLUpdateCmd *red_replay_update_cmd(SpiceReplay *replay)
+{
+ auto qxl = static_cast<QXLUpdateCmd *>(replay_malloc0(replay, sizeof(QXLUpdateCmd)));
+
+ replay_fscanf(replay, "update\n");
+ red_replay_rect_ptr(replay, "area", &qxl->area);
+ replay_fscanf(replay, "update_id %d\n", &qxl->update_id);
+ replay_fscanf(replay, "surface_id %d\n", &qxl->surface_id);
+ if (replay->error) {
+ return nullptr;
+ }
+ qxl->surface_id = replay_id_get(replay, qxl->surface_id);
+
+ return qxl;
+}
+
+static QXLMessage *red_replay_message(SpiceReplay *replay)
+{
+ QXLMessage *qxl = nullptr;
+ size_t size;
+
+ read_binary(replay, "message", &size, reinterpret_cast<uint8_t **>(&qxl), sizeof(QXLMessage));
+ return qxl;
+}
+
+static QXLSurfaceCmd *red_replay_surface_cmd(SpiceReplay *replay)
+{
+ size_t size;
+ size_t read_size;
+ int temp;
+ auto qxl = static_cast<QXLSurfaceCmd *>(replay_malloc0(replay, sizeof(QXLSurfaceCmd)));
+
+ replay_fscanf(replay, "surface_cmd\n");
+ replay_fscanf(replay, "surface_id %d\n", &qxl->surface_id);
+ replay_fscanf(replay, "type %d\n", &temp); qxl->type = temp;
+ replay_fscanf(replay, "flags %d\n", &qxl->flags);
+ if (replay->error) {
+ return nullptr;
+ }
+
+ switch (qxl->type) {
+ case QXL_SURFACE_CMD_CREATE:
+ replay_fscanf(replay, "u.surface_create.format %d\n", &qxl->u.surface_create.format);
+ replay_fscanf(replay, "u.surface_create.width %d\n", &qxl->u.surface_create.width);
+ replay_fscanf(replay, "u.surface_create.height %d\n", &qxl->u.surface_create.height);
+ replay_fscanf(replay, "u.surface_create.stride %d\n", &qxl->u.surface_create.stride);
+ if (replay->error) {
+ return nullptr;
+ }
+ size = qxl->u.surface_create.height * abs(qxl->u.surface_create.stride);
+ if ((qxl->flags & QXL_SURF_FLAG_KEEP_DATA) != 0) {
+ uint8_t *data = nullptr;
+ read_binary(replay, "data", &read_size, &data, 0);
+ qxl->u.surface_create.data = QXLPHYSICAL_FROM_PTR(data);
+ if (read_size != size) {
+ g_warning("mismatch %" G_GSIZE_FORMAT " != %" G_GSIZE_FORMAT, size, read_size);
+ }
+ } else {
+ qxl->u.surface_create.data = QXLPHYSICAL_FROM_PTR(replay_malloc(replay, size));
+ }
+ qxl->surface_id = replay_id_new(replay, qxl->surface_id);
+ break;
+ case QXL_SURFACE_CMD_DESTROY:
+ qxl->u.surface_create.data = 0;
+ qxl->surface_id = replay_id_get(replay, qxl->surface_id);
+ }
+ return qxl;
+}
+
+static void red_replay_surface_cmd_free(SpiceReplay *replay, QXLSurfaceCmd *qxl)
+{
+ if (qxl->type == QXL_SURFACE_CMD_DESTROY) {
+ replay_id_free(replay, qxl->surface_id);
+ }
+
+ g_free(QXLPHYSICAL_TO_PTR<void>(qxl->u.surface_create.data));
+ g_free(qxl);
+}
+
+static QXLCursor *red_replay_cursor(SpiceReplay *replay)
+{
+ int temp;
+ QXLCursor cursor, *qxl = nullptr;
+ ssize_t data_size;
+
+ replay_fscanf(replay, "header.unique %" SCNu64 "\n", &cursor.header.unique);
+ replay_fscanf(replay, "header.type %d\n", &temp);
+ cursor.header.type = temp;
+ replay_fscanf(replay, "header.width %d\n", &temp);
+ cursor.header.width = temp;
+ replay_fscanf(replay, "header.height %d\n", &temp);
+ cursor.header.height = temp;
+ replay_fscanf(replay, "header.hot_spot_x %d\n", &temp);
+ cursor.header.hot_spot_x = temp;
+ replay_fscanf(replay, "header.hot_spot_y %d\n", &temp);
+ cursor.header.hot_spot_y = temp;
+
+ replay_fscanf(replay, "data_size %d\n", &temp);
+ if (replay->error) {
+ return nullptr;
+ }
+ data_size = red_replay_data_chunks(replay, "cursor", reinterpret_cast<uint8_t **>(&qxl),
+ sizeof(QXLCursor));
+ if (data_size < 0) {
+ return nullptr;
+ }
+ qxl->header = cursor.header;
+ qxl->data_size = data_size;
+ return qxl;
+}
+
+static QXLCursorCmd *red_replay_cursor_cmd(SpiceReplay *replay)
+{
+ int temp;
+ auto qxl = static_cast<QXLCursorCmd *>(replay_malloc0(replay, sizeof(QXLCursorCmd)));
+
+ replay_fscanf(replay, "cursor_cmd\n");
+ replay_fscanf(replay, "type %d\n", &temp);
+ if (replay->error) {
+ return nullptr;
+ }
+ qxl->type = temp;
+ switch (qxl->type) {
+ case QXL_CURSOR_SET:
+ red_replay_point16_ptr(replay, &qxl->u.set.position);
+ replay_fscanf(replay, "u.set.visible %d\n", &temp);
+ qxl->u.set.visible = temp;
+ qxl->u.set.shape = QXLPHYSICAL_FROM_PTR(red_replay_cursor(replay));
+ break;
+ case QXL_CURSOR_MOVE:
+ red_replay_point16_ptr(replay, &qxl->u.position);
+ break;
+ case QXL_CURSOR_TRAIL:
+ replay_fscanf(replay, "u.trail.length %d\n", &temp);
+ qxl->u.trail.length = temp;
+ replay_fscanf(replay, "u.trail.frequency %d\n", &temp);
+ qxl->u.trail.frequency = temp;
+ break;
+ }
+ return qxl;
+}
+
+static void red_replay_cursor_cmd_free(SpiceReplay *replay, QXLCursorCmd *qxl)
+{
+ if (qxl->type == QXL_CURSOR_SET) {
+ auto cursor = QXLPHYSICAL_TO_PTR<QXLCursor>(qxl->u.set.shape);
+ red_replay_data_chunks_free(replay, cursor, sizeof(*cursor));
+ }
+
+ g_free(qxl);
+}
+
+static void replay_handle_create_primary(QXLInstance *instance, SpiceReplay *replay)
+{
+ QXLDevSurfaceCreate surface = { 0, };
+ size_t size;
+ uint8_t *mem = nullptr;
+
+ if (replay->created_primary) {
+ g_warning("WARNING: %d: original recording event not preceded by a destroy primary",
+ replay->counter);
+ spice_qxl_destroy_primary_surface(instance, 0);
+ }
+ replay->created_primary = TRUE;
+
+ replay_fscanf(replay, "%d %d %d %d\n", &surface.width, &surface.height,
+ &surface.stride, &surface.format);
+ replay_fscanf(replay, "%d %d %d %d\n", &surface.position, &surface.mouse_mode,
+ &surface.flags, &surface.type);
+ if (replay->error) {
+ return;
+ }
+ read_binary(replay, "data", &size, &mem, 0);
+ surface.group_id = 0;
+ g_free(replay->primary_mem);
+ replay->allocated = g_list_remove(replay->allocated, mem);
+ replay->primary_mem = mem;
+ surface.mem = QXLPHYSICAL_FROM_PTR(mem);
+ spice_qxl_create_primary_surface(instance, 0, &surface);
+}
+
+static void replay_handle_dev_input(QXLInstance *instance, SpiceReplay *replay,
+ RedWorkerMessage message)
+{
+ switch (message) {
+ case RED_WORKER_MESSAGE_CREATE_PRIMARY_SURFACE:
+ case RED_WORKER_MESSAGE_CREATE_PRIMARY_SURFACE_ASYNC:
+ replay_handle_create_primary(instance, replay);
+ break;
+ case RED_WORKER_MESSAGE_DESTROY_PRIMARY_SURFACE:
+ replay->created_primary = FALSE;
+ spice_qxl_destroy_primary_surface(instance, 0);
+ g_free(replay->primary_mem);
+ replay->primary_mem = nullptr;
+ break;
+ case RED_WORKER_MESSAGE_DESTROY_SURFACES:
+ replay->created_primary = FALSE;
+ spice_qxl_destroy_surfaces(instance);
+ break;
+ case RED_WORKER_MESSAGE_UPDATE:
+ // XXX do anything? we record the correct bitmaps already.
+ case RED_WORKER_MESSAGE_WAKEUP:
+ // safe to ignore
+ break;
+ default:
+ spice_debug("unhandled %d", message);
+ }
+}
+
+/*
+ * NOTE: This reads from a saved file and performs all io actions, calling the
+ * dispatcher, until it sees a command, at which point it returns it.
+ * Hence you cannot call this from the worker thread
+ * since it will block reading from the dispatcher pipe.
+ */
+SPICE_GNUC_VISIBLE QXLCommandExt* spice_replay_next_cmd(SpiceReplay *replay,
+ QXLInstance *instance)
+{
+ QXLCommandExt* cmd = nullptr;
+ uint64_t timestamp;
+ int type;
+ int what = -1;
+ int counter;
+
+ while (what != 0) {
+ replay_fscanf(replay, "event %d %d %d %" SCNu64 "\n", &counter,
+ &what, &type, &timestamp);
+ if (replay->error) {
+ goto error;
+ }
+ if (what == 1) {
+ replay_handle_dev_input(instance, replay, type);
+ }
+ }
+ cmd = static_cast<QXLCommandExt *>(replay_malloc0(replay, sizeof(QXLCommandExt)));
+ cmd->cmd.type = type;
+ cmd->group_id = 0;
+ spice_debug("command %" G_GUINT64_FORMAT ", %d", timestamp, cmd->cmd.type);
+ switch (cmd->cmd.type) {
+ case QXL_CMD_DRAW:
+ cmd->flags = 0;
+ cmd->cmd.data = red_replay_drawable(replay, cmd->flags);
+ break;
+ case QXL_CMD_UPDATE:
+ cmd->cmd.data = QXLPHYSICAL_FROM_PTR(red_replay_update_cmd(replay));
+ break;
+ case QXL_CMD_MESSAGE:
+ cmd->cmd.data = QXLPHYSICAL_FROM_PTR(red_replay_message(replay));
+ break;
+ case QXL_CMD_SURFACE:
+ cmd->cmd.data = QXLPHYSICAL_FROM_PTR(red_replay_surface_cmd(replay));
+ break;
+ case QXL_CMD_CURSOR:
+ cmd->cmd.data = QXLPHYSICAL_FROM_PTR(red_replay_cursor_cmd(replay));
+ break;
+ }
+
+ if (replay->error) {
+ goto error;
+ }
+
+ QXLReleaseInfo *info;
+ switch (cmd->cmd.type) {
+ case QXL_CMD_DRAW:
+ case QXL_CMD_UPDATE:
+ case QXL_CMD_SURFACE:
+ case QXL_CMD_CURSOR:
+ info = QXLPHYSICAL_TO_PTR<QXLReleaseInfo>(cmd->cmd.data);
+ info->id = (uintptr_t)cmd;
+ }
+
+ /* all buffer allocated will be used by the caller but
+ * free the list of buffer allocated to avoid to free on next calls */
+ if (replay->allocated) {
+ g_list_free(replay->allocated);
+ replay->allocated = nullptr;
+ }
+
+ replay->counter++;
+
+ return cmd;
+
+error:
+ /* if there were some allocation during the read free all
+ * buffers allocated to avoid leaks */
+ if (replay->allocated) {
+ g_list_free_full(replay->allocated, g_free);
+ replay->allocated = nullptr;
+ }
+ return nullptr;
+}
+
+SPICE_GNUC_VISIBLE void spice_replay_free_cmd(SpiceReplay *replay, QXLCommandExt *cmd)
+{
+ spice_return_if_fail(replay);
+ spice_return_if_fail(cmd);
+
+ switch (cmd->cmd.type) {
+ case QXL_CMD_DRAW: {
+ // FIXME: compat flag must be saved somewhere...
+ spice_return_if_fail(cmd->flags == 0);
+ auto qxl = QXLPHYSICAL_TO_PTR<QXLDrawable>(cmd->cmd.data);
+ red_replay_native_drawable_free(replay, qxl, cmd->flags);
+ break;
+ }
+ case QXL_CMD_UPDATE: {
+ auto qxl = QXLPHYSICAL_TO_PTR<QXLUpdateCmd>(cmd->cmd.data);
+ g_free(qxl);
+ break;
+ }
+ case QXL_CMD_SURFACE: {
+ auto qxl = QXLPHYSICAL_TO_PTR<QXLSurfaceCmd>(cmd->cmd.data);
+ red_replay_surface_cmd_free(replay, qxl);
+ break;
+ }
+ case QXL_CMD_CURSOR: {
+ auto qxl = QXLPHYSICAL_TO_PTR<QXLCursorCmd>(cmd->cmd.data);
+ red_replay_cursor_cmd_free(replay, qxl);
+ break;
+ }
+ default:
+ break;
+ }
+
+ g_free(cmd);
+}
+
+/* caller is incharge of closing the replay when done and releasing the SpiceReplay
+ * memory */
+SPICE_GNUC_VISIBLE
+SpiceReplay *spice_replay_new(FILE *file, int nsurfaces)
+{
+ unsigned int version = 0;
+ SpiceReplay *replay;
+
+ spice_return_val_if_fail(file != nullptr, NULL);
+
+ if (fscanf(file, "SPICE_REPLAY %u\n", &version) == 1) {
+ if (version != 1) {
+ spice_warning("Replay file version unsupported");
+ return nullptr;
+ }
+ } else {
+ spice_warning("This doesn't look like a valid replay file");
+ return nullptr;
+ }
+
+ replay = g_new0(SpiceReplay, 1);
+
+ replay->error = FALSE;
+ replay->fd = file;
+ replay->created_primary = FALSE;
+ pthread_mutex_init(&replay->mutex, nullptr);
+ pthread_cond_init(&replay->cond, nullptr);
+ replay->id_map = g_array_new(FALSE, FALSE, sizeof(uint32_t));
+ replay->id_map_inv = g_array_new(FALSE, FALSE, sizeof(uint32_t));
+ replay->id_free = g_array_new(FALSE, FALSE, sizeof(uint32_t));
+ replay->nsurfaces = nsurfaces;
+ replay->allocated = nullptr;
+
+ /* reserve id 0 */
+ replay_id_new(replay, 0);
+
+ return replay;
+}
+
+SPICE_GNUC_VISIBLE void spice_replay_free(SpiceReplay *replay)
+{
+ spice_return_if_fail(replay != nullptr);
+
+ g_list_free_full(replay->allocated, g_free);
+ pthread_mutex_destroy(&replay->mutex);
+ pthread_cond_destroy(&replay->cond);
+ g_array_free(replay->id_map, TRUE);
+ g_array_free(replay->id_map_inv, TRUE);
+ g_array_free(replay->id_free, TRUE);
+ g_free(replay->primary_mem);
+ fclose(replay->fd);
+ g_free(replay);
+}
diff --git a/server/red-stream-device.cpp b/server/red-stream-device.cpp
new file mode 100644
index 00000000..6f2b64c9
--- /dev/null
+++ b/server/red-stream-device.cpp
@@ -0,0 +1,680 @@
+/* spice-server character device to handle a video stream
+
+ Copyright (C) 2017-2018 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+
+#include <common/recorder.h>
+
+#include "glib-compat.h"
+#include "red-stream-device.h"
+
+#include "stream-channel.h"
+#include "cursor-channel.h"
+#include "reds.h"
+
+static void char_device_set_state(RedCharDevice *char_dev, int state);
+
+RECORDER(stream_device_data, 32, "Stream device data packet");
+
+void
+StreamDevice::close_timer_func(StreamDevice *dev)
+{
+ if (dev->opened && dev->has_error) {
+ char_device_set_state(dev, 0);
+ }
+}
+
+static void
+fill_dev_hdr(StreamDevHeader *hdr, StreamMsgType msg_type, uint32_t msg_size)
+{
+ hdr->protocol_version = STREAM_DEVICE_PROTOCOL;
+ hdr->padding = 0;
+ hdr->type = GUINT16_TO_LE(msg_type);
+ hdr->size = GUINT32_TO_LE(msg_size);
+}
+
+bool
+StreamDevice::partial_read()
+{
+ int n;
+ bool handled = false;
+
+ // in order to get in sync every time we open the device we need to discard data here.
+ // Qemu keeps a buffer of data which is used only during spice_server_char_device_wakeup
+ // from Qemu
+ if (G_UNLIKELY(has_error)) {
+ uint8_t buf[16 * 1024];
+ while (read(buf, sizeof(buf)) > 0) {
+ continue;
+ }
+
+ // This code is a workaround for a Qemu bug, see patch
+ // "stream-device: Workaround Qemu bug closing device".
+ // As calling sif->state here can cause a crash, schedule
+ // a timer and do the call in it. Remove this code when
+ // we are sure all Qemu versions have been patched.
+ RedsState *reds = get_server();
+ if (!close_timer) {
+ close_timer = reds_core_timer_add(reds, close_timer_func, this);
+ }
+ red_timer_start(close_timer, 0);
+ return false;
+ }
+
+ if (flow_stopped || !stream_channel) {
+ return false;
+ }
+
+ /* read header */
+ while (hdr_pos < sizeof(hdr)) {
+ n = read(reinterpret_cast<uint8_t *>(&hdr) + hdr_pos, sizeof(hdr) - hdr_pos);
+ if (n <= 0) {
+ return false;
+ }
+ hdr_pos += n;
+ if (hdr_pos >= sizeof(hdr)) {
+ hdr.type = GUINT16_FROM_LE(hdr.type);
+ hdr.size = GUINT32_FROM_LE(hdr.size);
+ msg_pos = 0;
+ }
+ }
+
+ switch (static_cast<StreamMsgType>(hdr.type)) {
+ case STREAM_TYPE_FORMAT:
+ if (hdr.size != sizeof(StreamMsgFormat)) {
+ handled = handle_msg_invalid("Wrong size for StreamMsgFormat");
+ } else {
+ handled = handle_msg_format();
+ }
+ break;
+ case STREAM_TYPE_DEVICE_DISPLAY_INFO:
+ if (hdr.size > sizeof(StreamMsgDeviceDisplayInfo) + MAX_DEVICE_ADDRESS_LEN) {
+ handled = handle_msg_invalid("StreamMsgDeviceDisplayInfo too large");
+ } else {
+ handled = handle_msg_device_display_info();
+ }
+ break;
+ case STREAM_TYPE_DATA:
+ if (hdr.size > 32*1024*1024) {
+ handled = handle_msg_invalid("STREAM_DATA too large");
+ } else {
+ handled = handle_msg_data();
+ }
+ break;
+ case STREAM_TYPE_CURSOR_SET:
+ handled = handle_msg_cursor_set();
+ break;
+ case STREAM_TYPE_CURSOR_MOVE:
+ if (hdr.size != sizeof(StreamMsgCursorMove)) {
+ handled = handle_msg_invalid("Wrong size for StreamMsgCursorMove");
+ } else {
+ handled = handle_msg_cursor_move();
+ }
+ break;
+ case STREAM_TYPE_CAPABILITIES:
+ handled = handle_msg_capabilities();
+ break;
+ default:
+ handled = handle_msg_invalid("Invalid message type");
+ break;
+ }
+
+ /* current message has been handled, so reset state and get ready to parse
+ * the next message */
+ if (handled) {
+ hdr_pos = 0;
+
+ // Reallocate message buffer to the minimum.
+ // Currently the only message that requires resizing is the cursor shape,
+ // which is not expected to be sent so often.
+ if (msg_len > sizeof(*msg)) {
+ msg = static_cast<StreamDevice::AllMessages *>(g_realloc(msg, sizeof(*msg)));
+ msg_len = sizeof(*msg);
+ }
+ }
+
+ // Qemu put the device on blocking state if we don't read all data
+ // so schedule another read.
+ // We arrive here if we processed that entire message or we
+ // got an error, try to read another message or discard the
+ // wrong data
+ return handled || has_error;
+}
+
+RedPipeItemPtr StreamDevice::read_one_msg_from_device()
+{
+ while (partial_read()) {
+ continue;
+ }
+ return RedPipeItemPtr();
+}
+
+bool
+StreamDevice::handle_msg_invalid(const char *error_msg)
+{
+ static const char default_error_msg[] = "Protocol error";
+
+ spice_extra_assert(hdr_pos >= sizeof(StreamDevHeader));
+
+ if (!error_msg) {
+ error_msg = default_error_msg;
+ }
+
+ g_warning("Stream device received invalid message: %s", error_msg);
+
+ int msg_size = sizeof(StreamMsgNotifyError) + strlen(error_msg) + 1;
+ int total_size = sizeof(StreamDevHeader) + msg_size;
+
+ RedCharDeviceWriteBuffer *buf =
+ write_buffer_get_server(total_size, false);
+ buf->buf_used = total_size;
+
+ auto const header = reinterpret_cast<StreamDevHeader *>(buf->buf);
+ fill_dev_hdr(header, STREAM_TYPE_NOTIFY_ERROR, msg_size);
+
+ auto const error = reinterpret_cast<StreamMsgNotifyError *>(header + 1);
+ error->error_code = GUINT32_TO_LE(0);
+ strcpy(reinterpret_cast<char *>(error->msg), error_msg);
+
+ write_buffer_add(buf);
+
+ has_error = true;
+ return false;
+}
+
+bool
+StreamDevice::handle_msg_format()
+{
+ spice_extra_assert(hdr_pos >= sizeof(StreamDevHeader));
+ spice_extra_assert(hdr.type == STREAM_TYPE_FORMAT);
+
+ int n = read(msg->buf + msg_pos, sizeof(StreamMsgFormat) - msg_pos);
+ if (n < 0) {
+ return handle_msg_invalid(nullptr);
+ }
+
+ msg_pos += n;
+
+ if (msg_pos < sizeof(StreamMsgFormat)) {
+ return false;
+ }
+
+ msg->format.width = GUINT32_FROM_LE(msg->format.width);
+ msg->format.height = GUINT32_FROM_LE(msg->format.height);
+ stream_channel->change_format(&msg->format);
+ return true;
+}
+
+bool
+StreamDevice::handle_msg_device_display_info()
+{
+ spice_extra_assert(hdr_pos >= sizeof(StreamDevHeader));
+ spice_extra_assert(hdr.type == STREAM_TYPE_DEVICE_DISPLAY_INFO);
+
+ if (msg_len < hdr.size) {
+ msg = static_cast<StreamDevice::AllMessages *>(g_realloc(msg, hdr.size));
+ msg_len = hdr.size;
+ }
+
+ /* read from device */
+ ssize_t n = read(msg->buf + msg_pos, hdr.size - msg_pos);
+ if (n <= 0) {
+ return msg_pos == hdr.size;
+ }
+
+ msg_pos += n;
+ if (msg_pos != hdr.size) { /* some bytes are still missing */
+ return false;
+ }
+
+ StreamMsgDeviceDisplayInfo *display_info_msg = &msg->device_display_info;
+
+ size_t device_address_len = GUINT32_FROM_LE(display_info_msg->device_address_len);
+ if (device_address_len > MAX_DEVICE_ADDRESS_LEN) {
+ g_warning("Received a device address longer than %u (%zu), "
+ "will be truncated!", MAX_DEVICE_ADDRESS_LEN, device_address_len);
+ device_address_len = sizeof(device_display_info.device_address);
+ }
+
+ if (device_address_len == 0) {
+ g_warning("Zero length device_address in DeviceDisplayInfo message, ignoring.");
+ return true;
+ }
+
+ if (display_info_msg->device_address + device_address_len >
+ reinterpret_cast<uint8_t *>(msg) + hdr.size) {
+ g_warning("Malformed DeviceDisplayInfo message, device_address length (%zu) "
+ "goes beyond the end of the message, ignoring.", device_address_len);
+ return true;
+ }
+
+ memcpy(device_display_info.device_address,
+ reinterpret_cast<char *>(display_info_msg->device_address), device_address_len);
+
+ // make sure the string is terminated
+ device_display_info.device_address[device_address_len - 1] = '\0';
+
+ device_display_info.stream_id = GUINT32_FROM_LE(display_info_msg->stream_id);
+ device_display_info.device_display_id = GUINT32_FROM_LE(display_info_msg->device_display_id);
+
+ g_debug("Received DeviceDisplayInfo from the streaming agent: stream_id %u, "
+ "device_address %s, device_display_id %u",
+ device_display_info.stream_id,
+ device_display_info.device_address,
+ device_display_info.device_display_id);
+
+ reds_send_device_display_info(get_server());
+
+ return true;
+}
+
+bool
+StreamDevice::handle_msg_capabilities()
+{
+ spice_extra_assert(hdr_pos >= sizeof(StreamDevHeader));
+ spice_extra_assert(hdr.type == STREAM_TYPE_CAPABILITIES);
+
+ if (hdr.size > STREAM_MSG_CAPABILITIES_MAX_BYTES) {
+ return handle_msg_invalid("Wrong size for StreamMsgCapabilities");
+ }
+
+ int n = read(msg->buf + msg_pos, hdr.size - msg_pos);
+ if (n < 0) {
+ return handle_msg_invalid(nullptr);
+ }
+
+ msg_pos += n;
+
+ if (msg_pos < hdr.size) {
+ return false;
+ }
+
+ // copy only capabilities we know about
+ memset(guest_capabilities, 0, sizeof(guest_capabilities));
+ memcpy(guest_capabilities, msg->capabilities.capabilities,
+ MIN(sizeof(guest_capabilities), hdr.size));
+
+ return true;
+}
+
+bool
+StreamDevice::handle_msg_data()
+{
+ int n;
+
+ spice_extra_assert(hdr_pos >= sizeof(StreamDevHeader));
+ spice_extra_assert(hdr.type == STREAM_TYPE_DATA);
+
+ /* make sure we have a large enough buffer for the whole frame */
+ /* ---
+ * TODO: Now that we copy partial data into the buffer, for each frame
+ * the buffer is allocated and freed (look for g_realloc in
+ * partial_read).
+ * Probably better to just keep the larger buffer.
+ */
+ if (msg_pos == 0) {
+ frame_mmtime = reds_get_mm_time();
+ record(stream_device_data, "Stream data packet size %u mm_time %u",
+ hdr.size, frame_mmtime);
+ if (msg_len < hdr.size) {
+ g_free(msg);
+ msg = static_cast<StreamDevice::AllMessages *>(g_malloc(hdr.size));
+ msg_len = hdr.size;
+ }
+ }
+
+ /* read from device */
+ n = read(msg->buf + msg_pos, hdr.size - msg_pos);
+ if (n <= 0) {
+ return msg_pos == hdr.size;
+ }
+
+ msg_pos += n;
+ if (msg_pos != hdr.size) { /* some bytes are still missing */
+ return false;
+ }
+
+ /* The whole frame was read from the device, send it */
+ stream_channel->send_data(msg->buf, hdr.size, frame_mmtime);
+
+ return true;
+}
+
+/*
+ * Returns number of bits required for a pixel of a given cursor type.
+ *
+ * Take into account mask bits.
+ * Returns 0 on error.
+ */
+static unsigned int
+get_cursor_type_bits(unsigned int cursor_type)
+{
+ switch (cursor_type) {
+ case SPICE_CURSOR_TYPE_ALPHA:
+ // RGBA
+ return 32;
+ case SPICE_CURSOR_TYPE_COLOR24:
+ // RGB + bitmask
+ return 24 + 1;
+ case SPICE_CURSOR_TYPE_COLOR32:
+ // RGBx + bitmask
+ return 32 + 1;
+ default:
+ return 0;
+ }
+}
+
+static red::shared_ptr<const RedCursorCmd>
+stream_msg_cursor_set_to_cursor_cmd(const StreamMsgCursorSet *msg, size_t msg_size)
+{
+ auto cmd = red::make_shared<RedCursorCmd>();
+ cmd->type = QXL_CURSOR_SET;
+ cmd->u.set.position.x = 0; // TODO
+ cmd->u.set.position.y = 0; // TODO
+ cmd->u.set.visible = 1; // TODO
+ SpiceCursor *cursor = &cmd->u.set.shape;
+ cursor->header.unique = 0;
+ cursor->header.type = msg->type;
+ cursor->header.width = GUINT16_FROM_LE(msg->width);
+ cursor->header.height = GUINT16_FROM_LE(msg->height);
+ cursor->header.hot_spot_x = GUINT16_FROM_LE(msg->hot_spot_x);
+ cursor->header.hot_spot_y = GUINT16_FROM_LE(msg->hot_spot_y);
+
+ /* Limit cursor size to prevent DoS */
+ if (cursor->header.width > STREAM_MSG_CURSOR_SET_MAX_WIDTH ||
+ cursor->header.height > STREAM_MSG_CURSOR_SET_MAX_HEIGHT) {
+ return red::shared_ptr<const RedCursorCmd>();
+ }
+
+ const unsigned int cursor_bits = get_cursor_type_bits(cursor->header.type);
+ if (cursor_bits == 0) {
+ return red::shared_ptr<const RedCursorCmd>();
+ }
+
+ /* Check that enough data has been sent for the cursor.
+ * Note that these computations can't overflow due to sizes checks
+ * above. */
+ size_t size_required = cursor->header.width * cursor->header.height;
+ size_required = SPICE_ALIGN(size_required * cursor_bits, 8) / 8U;
+ if (msg_size < sizeof(StreamMsgCursorSet) + size_required) {
+ return red::shared_ptr<const RedCursorCmd>();
+ }
+ cursor->data_size = size_required;
+ cursor->data = static_cast<uint8_t *>(g_memdup2(msg->data, size_required));
+ return cmd;
+}
+
+bool
+StreamDevice::handle_msg_cursor_set()
+{
+ // Calculate the maximum size required to send the pixel data for a cursor that is the
+ // maximum size using the format that requires the largest number of bits per pixel
+ // (SPICE_CURSOR_TYPE_COLOR32 requires 33 bits per pixel, see get_cursor_type_bits())
+ const unsigned int max_cursor_set_size =
+ sizeof(StreamMsgCursorSet) +
+ (STREAM_MSG_CURSOR_SET_MAX_WIDTH * 4 + (STREAM_MSG_CURSOR_SET_MAX_WIDTH + 7)/8)
+ * STREAM_MSG_CURSOR_SET_MAX_HEIGHT;
+
+ if (hdr.size < sizeof(StreamMsgCursorSet) || hdr.size > max_cursor_set_size) {
+ // we could skip the message but on the other hand the guest
+ // is buggy in any case
+ return handle_msg_invalid("Cursor size is invalid");
+ }
+
+ // read part of the message till we get all
+ if (msg_len < hdr.size) {
+ msg = static_cast<StreamDevice::AllMessages *>(g_realloc(msg, hdr.size));
+ msg_len = hdr.size;
+ }
+ int n = read(msg->buf + msg_pos, hdr.size - msg_pos);
+ if (n <= 0) {
+ return false;
+ }
+ msg_pos += n;
+ if (msg_pos != hdr.size) {
+ return false;
+ }
+
+ // transform the message to a cursor command and process it
+ auto cmd = stream_msg_cursor_set_to_cursor_cmd(&msg->cursor_set, msg_pos);
+ if (!cmd) {
+ return handle_msg_invalid(nullptr);
+ }
+ cursor_channel->process_cmd(std::move(cmd));
+
+ return true;
+}
+
+bool
+StreamDevice::handle_msg_cursor_move()
+{
+ int n = read(msg->buf + msg_pos, hdr.size - msg_pos);
+ if (n <= 0) {
+ return false;
+ }
+ msg_pos += n;
+ if (msg_pos != hdr.size) {
+ return false;
+ }
+
+ StreamMsgCursorMove *move = &msg->cursor_move;
+ move->x = GINT32_FROM_LE(move->x);
+ move->y = GINT32_FROM_LE(move->y);
+
+ auto cmd = red::make_shared<RedCursorCmd>();
+ cmd->type = QXL_CURSOR_MOVE;
+ cmd->u.position.x = move->x;
+ cmd->u.position.y = move->y;
+
+ cursor_channel->process_cmd(std::move(cmd));
+
+ return true;
+}
+
+void StreamDevice::remove_client(RedCharDeviceClientOpaque *client)
+{
+}
+
+void
+StreamDevice::stream_start(void *opaque, StreamMsgStartStop *start,
+ StreamChannel *stream_channel G_GNUC_UNUSED)
+{
+ auto dev = static_cast<StreamDevice *>(opaque);
+
+ if (!dev->opened) {
+ return;
+ }
+
+ int msg_size = sizeof(*start) + sizeof(start->codecs[0]) * start->num_codecs;
+ int total_size = sizeof(StreamDevHeader) + msg_size;
+
+ RedCharDeviceWriteBuffer *buf =
+ dev->write_buffer_get_server(total_size, false);
+ buf->buf_used = total_size;
+
+ auto hdr = reinterpret_cast<StreamDevHeader *>(buf->buf);
+ fill_dev_hdr(hdr, STREAM_TYPE_START_STOP, msg_size);
+
+ memcpy(&hdr[1], start, msg_size);
+
+ dev->write_buffer_add(buf);
+}
+
+void
+StreamDevice::stream_queue_stat(void *opaque, const StreamQueueStat *stats G_GNUC_UNUSED,
+ StreamChannel *stream_channel G_GNUC_UNUSED)
+{
+ auto dev = static_cast<StreamDevice *>(opaque);
+
+ if (!dev->opened) {
+ return;
+ }
+
+ // very easy control flow... if any data stop
+ // this seems a very small queue but as we use tcp
+ // there's already that queue
+ if (stats->num_items) {
+ dev->flow_stopped = true;
+ return;
+ }
+
+ if (dev->flow_stopped) {
+ dev->flow_stopped = false;
+ // TODO resume flow...
+ // avoid recursion if we need to call get data from data handling from
+ // data handling
+ dev->wakeup();
+ }
+}
+
+red::shared_ptr<StreamDevice>
+stream_device_connect(RedsState *reds, SpiceCharDeviceInstance *sin)
+{
+ SpiceCharDeviceInterface *sif;
+
+ auto dev = red::make_shared<StreamDevice>(reds, sin);
+
+ sif = spice_char_device_get_interface(sin);
+ if (sif->state) {
+ sif->state(sin, 1);
+ }
+
+ return dev;
+}
+
+StreamDevice::StreamDevice(RedsState *reds, SpiceCharDeviceInstance *sin):
+ RedCharDevice(reds, sin, 0, 0)
+{
+ msg = static_cast<StreamDevice::AllMessages *>(g_malloc(sizeof(*msg)));
+ msg_len = sizeof(*msg);
+}
+
+StreamDevice::~StreamDevice()
+{
+ red_timer_remove(close_timer);
+
+ if (stream_channel) {
+ // close all current connections
+ stream_channel->destroy();
+ }
+ if (cursor_channel) {
+ // close all current connections
+ cursor_channel->destroy();
+ }
+
+ g_free(msg);
+}
+
+void
+StreamDevice::create_channel()
+{
+ if (stream_channel) {
+ return;
+ }
+
+ SpiceServer* reds = get_server();
+ SpiceCoreInterfaceInternal* core = reds_get_core_interface(reds);
+
+ int id = reds_get_free_channel_id(reds, SPICE_CHANNEL_DISPLAY);
+ g_return_if_fail(id >= 0);
+
+ stream_channel = stream_channel_new(reds, id);
+ cursor_channel = cursor_channel_new(reds, id, core, nullptr);
+
+ stream_channel->register_start_cb(stream_start, this);
+ stream_channel->register_queue_stat_cb(stream_queue_stat, this);
+}
+
+void
+StreamDevice::reset_channels()
+{
+ if (stream_channel) {
+ stream_channel->reset();
+ }
+}
+
+static void
+char_device_set_state(RedCharDevice *char_dev, int state)
+{
+ SpiceCharDeviceInstance *sin;
+ sin = char_dev->get_device_instance();
+ spice_assert(sin != nullptr);
+
+ SpiceCharDeviceInterface *sif = spice_char_device_get_interface(sin);
+ if (sif->state) {
+ sif->state(sin, state);
+ }
+}
+
+static void
+send_capabilities(RedCharDevice *char_dev)
+{
+ int msg_size = MAX_GUEST_CAPABILITIES_BYTES;
+ int total_size = sizeof(StreamDevHeader) + msg_size;
+
+ RedCharDeviceWriteBuffer *buf =
+ char_dev->write_buffer_get_server(total_size, false);
+ buf->buf_used = total_size;
+
+ auto const hdr = reinterpret_cast<StreamDevHeader *>(buf->buf);
+ fill_dev_hdr(hdr, STREAM_TYPE_CAPABILITIES, msg_size);
+
+ auto const caps = reinterpret_cast<StreamMsgCapabilities *>(hdr + 1);
+ memset(caps, 0, msg_size);
+
+ char_dev->write_buffer_add(buf);
+}
+
+void
+StreamDevice::port_event(uint8_t event)
+{
+ if (event != SPICE_PORT_EVENT_OPENED && event != SPICE_PORT_EVENT_CLOSED) {
+ return;
+ }
+
+ // reset device and channel on close/open
+ opened = (event == SPICE_PORT_EVENT_OPENED);
+ if (opened) {
+ create_channel();
+
+ send_capabilities(this);
+ }
+ hdr_pos = 0;
+ msg_pos = 0;
+ has_error = false;
+ flow_stopped = false;
+ reset();
+ reset_channels();
+
+ // enable the device again. We re-enable it on close as otherwise we don't want to get a
+ // failure when we try to re-open the device as would happen if we keep it disabled
+ char_device_set_state(this, 1);
+}
+
+const StreamDeviceDisplayInfo *StreamDevice::get_device_display_info()
+{
+ return &device_display_info;
+}
+
+int32_t StreamDevice::get_stream_channel_id()
+{
+ if (!stream_channel) {
+ return -1;
+ }
+
+ return stream_channel->id();
+}
diff --git a/server/red-stream-device.h b/server/red-stream-device.h
new file mode 100644
index 00000000..bf657878
--- /dev/null
+++ b/server/red-stream-device.h
@@ -0,0 +1,115 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2018 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef STREAM_DEVICE_H
+#define STREAM_DEVICE_H
+
+#include <spice/stream-device.h>
+
+#include "display-limits.h"
+#include "char-device.h"
+
+#include "push-visibility.h"
+
+/**
+ * StreamDevice inherits from RedCharDevice.
+ */
+struct StreamDevice;
+
+// forward declarations
+struct StreamChannel;
+struct CursorChannel;
+struct StreamQueueStat;
+
+struct StreamDeviceDisplayInfo {
+ uint32_t stream_id;
+ char device_address[MAX_DEVICE_ADDRESS_LEN];
+ uint32_t device_display_id;
+};
+
+red::shared_ptr<StreamDevice> stream_device_connect(RedsState *reds, SpiceCharDeviceInstance *sin);
+
+#define MAX_GUEST_CAPABILITIES_BYTES ((STREAM_CAP_END+7)/8)
+
+class StreamDevice final: public RedCharDevice
+{
+public:
+ StreamDevice(RedsState *reds, SpiceCharDeviceInstance *sin);
+
+ /* Create channel for the streaming device.
+ * If the channel already exists the function does nothing.
+ */
+ void create_channel();
+
+ /**
+ * Returns -1 if the StreamDevice doesn't have a channel yet.
+ */
+ int32_t get_stream_channel_id();
+
+ const StreamDeviceDisplayInfo *get_device_display_info();
+
+protected:
+ ~StreamDevice();
+
+private:
+ StreamDevHeader hdr;
+ uint8_t hdr_pos;
+ union AllMessages {
+ StreamMsgFormat format;
+ StreamMsgCapabilities capabilities;
+ StreamMsgCursorSet cursor_set;
+ StreamMsgCursorMove cursor_move;
+ StreamMsgDeviceDisplayInfo device_display_info;
+ uint8_t buf[STREAM_MSG_CAPABILITIES_MAX_BYTES];
+ } *msg;
+ uint32_t msg_pos;
+ uint32_t msg_len;
+ bool has_error;
+ bool opened;
+ bool flow_stopped;
+ uint8_t guest_capabilities[MAX_GUEST_CAPABILITIES_BYTES];
+ red::shared_ptr<StreamChannel> stream_channel;
+ red::shared_ptr<CursorChannel> cursor_channel;
+ SpiceTimer *close_timer;
+ uint32_t frame_mmtime;
+ StreamDeviceDisplayInfo device_display_info;
+
+private:
+ virtual RedPipeItemPtr read_one_msg_from_device() override;
+ virtual void remove_client(RedCharDeviceClientOpaque *client) override;
+ virtual void port_event(uint8_t event) override;
+
+ bool partial_read();
+ bool handle_msg_invalid(const char *error_msg) SPICE_GNUC_WARN_UNUSED_RESULT;
+ bool handle_msg_capabilities() SPICE_GNUC_WARN_UNUSED_RESULT;
+ bool handle_msg_format() SPICE_GNUC_WARN_UNUSED_RESULT;
+ bool handle_msg_cursor_move() SPICE_GNUC_WARN_UNUSED_RESULT;
+ bool handle_msg_cursor_set() SPICE_GNUC_WARN_UNUSED_RESULT;
+ bool handle_msg_data() SPICE_GNUC_WARN_UNUSED_RESULT;
+ bool handle_msg_device_display_info() SPICE_GNUC_WARN_UNUSED_RESULT;
+ void reset_channels();
+ static void close_timer_func(StreamDevice *dev);
+ static void stream_start(void *opaque, StreamMsgStartStop *start,
+ StreamChannel *stream_channel);
+ static void stream_queue_stat(void *opaque, const StreamQueueStat *stats,
+ StreamChannel *stream_channel);
+};
+
+#include "pop-visibility.h"
+
+#endif /* STREAM_DEVICE_H */
diff --git a/server/red-stream.cpp b/server/red-stream.cpp
new file mode 100644
index 00000000..89222702
--- /dev/null
+++ b/server/red-stream.cpp
@@ -0,0 +1,1219 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009, 2013 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+
+#include <cerrno>
+
+#include <fcntl.h>
+#include <unistd.h>
+#ifndef _WIN32
+#include <netdb.h>
+#include <sys/socket.h>
+#include <netinet/tcp.h>
+#include <netinet/in.h>
+#else
+#include <ws2tcpip.h>
+#endif
+
+#include <glib.h>
+
+#include <openssl/err.h>
+
+#include <common/log.h>
+
+#include "main-dispatcher.h"
+#include "net-utils.h"
+#include "red-common.h"
+#include "red-stream.h"
+#include "reds.h"
+#include "websocket.h"
+
+// compatibility for *BSD systems
+#if !defined(TCP_CORK) && !defined(_WIN32)
+#define TCP_CORK TCP_NOPUSH
+#endif
+
+struct AsyncRead {
+ void *opaque;
+ uint8_t *now;
+ uint8_t *end;
+ AsyncReadDone done;
+ AsyncReadError error;
+};
+
+#if HAVE_SASL
+#include <sasl/sasl.h>
+
+struct RedSASL {
+ sasl_conn_t *conn;
+
+ /* If we want to negotiate an SSF layer with client */
+ int wantSSF :1;
+ /* If we are now running the SSF layer */
+ int runSSF :1;
+
+ /*
+ * Buffering encoded data to allow more clear data
+ * to be stuffed onto the output buffer
+ */
+ const uint8_t *encoded;
+ unsigned int encodedLength;
+ unsigned int encodedOffset;
+
+ SpiceBuffer inbuffer;
+};
+#endif
+
+struct RedStreamPrivate {
+ SSL *ssl;
+
+#if HAVE_SASL
+ RedSASL sasl;
+#endif
+
+ AsyncRead async_read;
+
+ RedsWebSocket *ws;
+
+ /* life time of info:
+ * allocated when creating RedStream.
+ * deallocated when main_dispatcher handles the SPICE_CHANNEL_EVENT_DISCONNECTED
+ * event, either from same thread or by call back from main thread. */
+ SpiceChannelEventInfo* info;
+ bool use_cork;
+ bool corked;
+
+ ssize_t (*read)(RedStream *s, void *buf, size_t nbyte);
+ ssize_t (*write)(RedStream *s, const void *buf, size_t nbyte);
+ ssize_t (*writev)(RedStream *s, const struct iovec *iov, int iovcnt);
+
+ RedsState *reds;
+ SpiceCoreInterfaceInternal *core;
+};
+
+#ifndef _WIN32
+/**
+ * Set TCP_CORK on socket
+ */
+/* NOTE: enabled must be int */
+static int socket_set_cork(int socket, int enabled)
+{
+ SPICE_VERIFY(sizeof(enabled) == sizeof(int));
+ return setsockopt(socket, IPPROTO_TCP, TCP_CORK, &enabled, sizeof(enabled));
+}
+#else
+static inline int socket_set_cork(int socket, int enabled)
+{
+ return -1;
+}
+#endif
+
+static ssize_t stream_write_cb(RedStream *s, const void *buf, size_t size)
+{
+ return socket_write(s->socket, buf, size);
+}
+
+static ssize_t stream_writev_cb(RedStream *s, const struct iovec *iov, int iovcnt)
+{
+ ssize_t ret = 0;
+ do {
+ int tosend;
+ ssize_t n, expected = 0;
+ int i;
+#ifdef IOV_MAX
+ tosend = MIN(iovcnt, IOV_MAX);
+#else
+ tosend = iovcnt;
+#endif
+ for (i = 0; i < tosend; i++) {
+ expected += iov[i].iov_len;
+ }
+ n = socket_writev(s->socket, iov, tosend);
+ if (n <= expected) {
+ if (n > 0)
+ ret += n;
+ return ret == 0 ? n : ret;
+ }
+ ret += n;
+ iov += tosend;
+ iovcnt -= tosend;
+ } while(iovcnt > 0);
+
+ return ret;
+}
+
+static ssize_t stream_read_cb(RedStream *s, void *buf, size_t size)
+{
+ return socket_read(s->socket, buf, size);
+}
+
+static ssize_t stream_ssl_error(RedStream *s, int return_code)
+{
+ SPICE_GNUC_UNUSED int ssl_error;
+
+ ssl_error = SSL_get_error(s->priv->ssl, return_code);
+
+ // OpenSSL can to return SSL_ERROR_WANT_READ if we attempt to read
+ // data and the socket did not receive all SSL packet.
+ // Under Windows errno is not set so potentially caller can detect
+ // the wrong error so we need to set errno.
+#ifdef _WIN32
+ if (ssl_error == SSL_ERROR_WANT_READ || ssl_error == SSL_ERROR_WANT_WRITE) {
+ errno = EAGAIN;
+ } else {
+ errno = EPIPE;
+ }
+#endif
+
+ // red_peer_receive is expected to receive -1 on errors while
+ // OpenSSL documentation just state a <0 value
+ return -1;
+}
+
+static ssize_t stream_ssl_write_cb(RedStream *s, const void *buf, size_t size)
+{
+ int return_code;
+
+ return_code = SSL_write(s->priv->ssl, buf, size);
+
+ if (return_code < 0) {
+ return stream_ssl_error(s, return_code);
+ }
+
+ return return_code;
+}
+
+static ssize_t stream_ssl_read_cb(RedStream *s, void *buf, size_t size)
+{
+ int return_code;
+
+ return_code = SSL_read(s->priv->ssl, buf, size);
+
+ if (return_code < 0) {
+ return stream_ssl_error(s, return_code);
+ }
+
+ return return_code;
+}
+
+void red_stream_remove_watch(RedStream* s)
+{
+ red_watch_remove(s->watch);
+ s->watch = nullptr;
+}
+
+#if HAVE_SASL
+static ssize_t red_stream_sasl_read(RedStream *s, uint8_t *buf, size_t nbyte);
+#endif
+
+ssize_t red_stream_read(RedStream *s, void *buf, size_t nbyte)
+{
+ ssize_t ret;
+
+#if HAVE_SASL
+ if (s->priv->sasl.conn && s->priv->sasl.runSSF) {
+ ret = red_stream_sasl_read(s, (uint8_t*) buf, nbyte);
+ } else
+#endif
+ ret = s->priv->read(s, buf, nbyte);
+
+ return ret;
+}
+
+bool red_stream_write_all(RedStream *stream, const void *in_buf, size_t n)
+{
+ const uint8_t *buf = (uint8_t *)in_buf;
+
+ while (n) {
+ int now = red_stream_write(stream, buf, n);
+ if (now <= 0) {
+ if (now == -1 && (errno == EINTR || errno == EAGAIN)) {
+ continue;
+ }
+ return false;
+ }
+ n -= now;
+ buf += now;
+ }
+ return true;
+}
+
+bool red_stream_set_auto_flush(RedStream *s, bool auto_flush)
+{
+ if (s->priv->use_cork == !auto_flush) {
+ return true;
+ }
+
+ s->priv->use_cork = !auto_flush;
+ if (s->priv->use_cork) {
+ if (socket_set_cork(s->socket, 1)) {
+ s->priv->use_cork = false;
+ return false;
+ }
+ s->priv->corked = true;
+ } else if (s->priv->corked) {
+ socket_set_cork(s->socket, 0);
+ s->priv->corked = false;
+ }
+ return true;
+}
+
+void red_stream_flush(RedStream *s)
+{
+ if (s->priv->corked) {
+ socket_set_cork(s->socket, 0);
+ socket_set_cork(s->socket, 1);
+ }
+}
+
+#if HAVE_SASL
+static ssize_t red_stream_sasl_write(RedStream *s, const void *buf, size_t nbyte);
+#endif
+
+ssize_t red_stream_write(RedStream *s, const void *buf, size_t nbyte)
+{
+ ssize_t ret;
+
+#if HAVE_SASL
+ if (s->priv->sasl.conn && s->priv->sasl.runSSF) {
+ ret = red_stream_sasl_write(s, buf, nbyte);
+ } else
+#endif
+ ret = s->priv->write(s, buf, nbyte);
+
+ return ret;
+}
+
+int red_stream_get_family(const RedStream *s)
+{
+ spice_return_val_if_fail(s != nullptr, -1);
+
+ if (s->socket == -1)
+ return -1;
+
+ return s->priv->info->laddr_ext.ss_family;
+}
+
+bool red_stream_is_plain_unix(const RedStream *s)
+{
+ spice_return_val_if_fail(s != nullptr, false);
+
+ if (red_stream_get_family(s) != AF_UNIX) {
+ return false;
+ }
+
+#if HAVE_SASL
+ if (s->priv->sasl.conn) {
+ return false;
+ }
+#endif
+ if (s->priv->ssl) {
+ return false;
+ }
+
+ return true;
+
+}
+
+/**
+ * red_stream_set_no_delay:
+ * @stream: a #RedStream
+ * @no_delay: whether to enable TCP_NODELAY on @@stream
+ *
+ * Returns: #true if the operation succeeded, #false otherwise.
+ */
+bool red_stream_set_no_delay(RedStream *stream, bool no_delay)
+{
+ return red_socket_set_no_delay(stream->socket, no_delay);
+}
+
+int red_stream_get_no_delay(RedStream *stream)
+{
+ return red_socket_get_no_delay(stream->socket);
+}
+
+#ifndef _WIN32
+int red_stream_send_msgfd(RedStream *stream, int fd)
+{
+ struct msghdr msgh = { nullptr, };
+ struct iovec iov;
+ int r;
+
+ const size_t fd_size = 1 * sizeof(int);
+ struct cmsghdr *cmsg;
+ union {
+ struct cmsghdr hdr;
+ char data[CMSG_SPACE(fd_size)];
+ } control;
+
+ spice_return_val_if_fail(red_stream_is_plain_unix(stream), -1);
+
+ /* set the payload */
+ iov.iov_base = const_cast<char *>("@");
+ iov.iov_len = 1;
+ msgh.msg_iovlen = 1;
+ msgh.msg_iov = &iov;
+
+ if (fd != -1) {
+ msgh.msg_control = control.data;
+ msgh.msg_controllen = sizeof(control.data);
+ /* CMSG_SPACE() might be larger than CMSG_LEN() as it can include some
+ * padding. We set the whole control data to 0 to avoid valgrind warnings
+ */
+ memset(control.data, 0, sizeof(control.data));
+
+ cmsg = CMSG_FIRSTHDR(&msgh);
+ cmsg->cmsg_len = CMSG_LEN(fd_size);
+ cmsg->cmsg_level = SOL_SOCKET;
+ cmsg->cmsg_type = SCM_RIGHTS;
+ memcpy(CMSG_DATA(cmsg), &fd, fd_size);
+ }
+
+ do {
+ r = sendmsg(stream->socket, &msgh, MSG_NOSIGNAL);
+ } while (r < 0 && (errno == EINTR || errno == EAGAIN));
+
+ return r;
+}
+#endif
+
+ssize_t red_stream_writev(RedStream *s, const struct iovec *iov, int iovcnt)
+{
+ int i;
+ int n;
+ ssize_t ret = 0;
+
+ if (s->priv->writev != nullptr && iovcnt > 1) {
+ return s->priv->writev(s, iov, iovcnt);
+ }
+
+ for (i = 0; i < iovcnt; ++i) {
+ n = red_stream_write(s, iov[i].iov_base, iov[i].iov_len);
+ if (n <= 0)
+ return ret == 0 ? n : ret;
+ ret += n;
+ }
+
+ return ret;
+}
+
+void red_stream_free(RedStream *s)
+{
+ if (!s) {
+ return;
+ }
+
+ red_stream_push_channel_event(s, SPICE_CHANNEL_EVENT_DISCONNECTED);
+
+#if HAVE_SASL
+ if (s->priv->sasl.conn) {
+ s->priv->sasl.runSSF = s->priv->sasl.wantSSF = 0;
+ s->priv->sasl.encodedLength = s->priv->sasl.encodedOffset = 0;
+ s->priv->sasl.encoded = NULL;
+ sasl_dispose(&s->priv->sasl.conn);
+ s->priv->sasl.conn = NULL;
+ }
+#endif
+
+ if (s->priv->ssl) {
+ SSL_free(s->priv->ssl);
+ }
+
+ websocket_free(s->priv->ws);
+
+ red_stream_remove_watch(s);
+ socket_close(s->socket);
+
+ g_free(s);
+}
+
+void red_stream_push_channel_event(RedStream *s, int event)
+{
+ RedsState *reds = s->priv->reds;
+ MainDispatcher *md = reds_get_main_dispatcher(reds);
+ md->channel_event(event, s->priv->info);
+}
+
+static void red_stream_set_socket(RedStream *stream, int socket)
+{
+ stream->socket = socket;
+ /* deprecated fields. Filling them for backward compatibility */
+ stream->priv->info->llen = sizeof(stream->priv->info->laddr);
+ stream->priv->info->plen = sizeof(stream->priv->info->paddr);
+ getsockname(stream->socket, &stream->priv->info->laddr, &stream->priv->info->llen);
+ getpeername(stream->socket, &stream->priv->info->paddr, &stream->priv->info->plen);
+
+ stream->priv->info->flags |= SPICE_CHANNEL_EVENT_FLAG_ADDR_EXT;
+ stream->priv->info->llen_ext = sizeof(stream->priv->info->laddr_ext);
+ stream->priv->info->plen_ext = sizeof(stream->priv->info->paddr_ext);
+ getsockname(stream->socket, reinterpret_cast<struct sockaddr *>(&stream->priv->info->laddr_ext),
+ &stream->priv->info->llen_ext);
+ getpeername(stream->socket, reinterpret_cast<struct sockaddr *>(&stream->priv->info->paddr_ext),
+ &stream->priv->info->plen_ext);
+}
+
+
+void red_stream_set_channel(RedStream *stream, int connection_id,
+ int channel_type, int channel_id)
+{
+ stream->priv->info->connection_id = connection_id;
+ stream->priv->info->type = channel_type;
+ stream->priv->info->id = channel_id;
+ if (red_stream_is_ssl(stream)) {
+ stream->priv->info->flags |= SPICE_CHANNEL_EVENT_FLAG_TLS;
+ }
+}
+
+RedStream *red_stream_new(RedsState *reds, int socket)
+{
+ RedStream *stream;
+
+ stream = static_cast<RedStream *>(g_malloc0(sizeof(RedStream) + sizeof(RedStreamPrivate)));
+ stream->priv = reinterpret_cast<RedStreamPrivate *>(stream + 1);
+ stream->priv->info = g_new0(SpiceChannelEventInfo, 1);
+ stream->priv->reds = reds;
+ stream->priv->core = reds_get_core_interface(reds);
+ red_stream_set_socket(stream, socket);
+
+ stream->priv->read = stream_read_cb;
+ stream->priv->write = stream_write_cb;
+ stream->priv->writev = stream_writev_cb;
+
+ return stream;
+}
+
+void red_stream_set_core_interface(RedStream *stream, SpiceCoreInterfaceInternal *core)
+{
+ red_stream_remove_watch(stream);
+ stream->priv->core = core;
+}
+
+bool red_stream_is_ssl(RedStream *stream)
+{
+ return (stream->priv->ssl != nullptr);
+}
+
+static void red_stream_disable_writev(RedStream *stream)
+{
+ stream->priv->writev = nullptr;
+}
+
+RedStreamSslStatus red_stream_ssl_accept(RedStream *stream)
+{
+ int ssl_error;
+ int return_code;
+
+ return_code = SSL_accept(stream->priv->ssl);
+ if (return_code == 1) {
+ return RED_STREAM_SSL_STATUS_OK;
+ }
+
+#ifndef SSL_OP_NO_RENEGOTIATION
+ // With OpenSSL 1.0.2 and earlier: disable client-side renegotiation
+ stream->priv->ssl->s3->flags |= SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS;
+#endif
+
+ ssl_error = SSL_get_error(stream->priv->ssl, return_code);
+ if (return_code == -1 && (ssl_error == SSL_ERROR_WANT_READ ||
+ ssl_error == SSL_ERROR_WANT_WRITE)) {
+ if (ssl_error == SSL_ERROR_WANT_READ) {
+ return RED_STREAM_SSL_STATUS_WAIT_FOR_READ;
+ }
+ return RED_STREAM_SSL_STATUS_WAIT_FOR_WRITE;
+ }
+
+ red_dump_openssl_errors();
+ spice_warning("SSL_accept failed, error=%d", ssl_error);
+ SSL_free(stream->priv->ssl);
+ stream->priv->ssl = nullptr;
+
+ return RED_STREAM_SSL_STATUS_ERROR;
+}
+
+RedStreamSslStatus red_stream_enable_ssl(RedStream *stream, SSL_CTX *ctx)
+{
+ BIO *sbio;
+
+ // Handle SSL handshaking
+ if (!(sbio = BIO_new_socket(stream->socket, BIO_NOCLOSE))) {
+ spice_warning("could not allocate ssl bio socket");
+ return RED_STREAM_SSL_STATUS_ERROR;
+ }
+
+ stream->priv->ssl = SSL_new(ctx);
+ if (!stream->priv->ssl) {
+ spice_warning("could not allocate ssl context");
+ BIO_free(sbio);
+ return RED_STREAM_SSL_STATUS_ERROR;
+ }
+
+ SSL_set_bio(stream->priv->ssl, sbio, sbio);
+
+ stream->priv->write = stream_ssl_write_cb;
+ stream->priv->read = stream_ssl_read_cb;
+ red_stream_disable_writev(stream);
+
+ return red_stream_ssl_accept(stream);
+}
+
+void red_stream_set_async_error_handler(RedStream *stream,
+ AsyncReadError error_handler)
+{
+ stream->priv->async_read.error = error_handler;
+}
+
+static inline void async_read_clear_handlers(RedStream *stream)
+{
+ AsyncRead *async = &stream->priv->async_read;
+ red_stream_remove_watch(stream);
+ async->now = nullptr;
+ async->end = nullptr;
+}
+
+static void async_read_handler(G_GNUC_UNUSED int fd,
+ G_GNUC_UNUSED int event,
+ RedStream *stream)
+{
+ AsyncRead *async = &stream->priv->async_read;
+ SpiceCoreInterfaceInternal *core = stream->priv->core;
+
+ for (;;) {
+ int n = async->end - async->now;
+
+ spice_assert(n > 0);
+ n = red_stream_read(stream, async->now, n);
+ if (n <= 0) {
+ int err = n < 0 ? errno: 0;
+ switch (err) {
+ case EAGAIN:
+ if (!stream->watch) {
+ stream->watch = core->watch_new(stream->socket,
+ SPICE_WATCH_EVENT_READ,
+ async_read_handler, stream);
+ }
+ return;
+ case EINTR:
+ break;
+ default:
+ async_read_clear_handlers(stream);
+ if (async->error) {
+ async->error(async->opaque, err);
+ }
+ return;
+ }
+ } else {
+ async->now += n;
+ if (async->now == async->end) {
+ async_read_clear_handlers(stream);
+ async->done(async->opaque);
+ return;
+ }
+ }
+ }
+}
+
+void red_stream_async_read(RedStream *stream,
+ uint8_t *data, size_t size,
+ AsyncReadDone read_done_cb,
+ void *opaque)
+{
+ AsyncRead *async = &stream->priv->async_read;
+
+ g_return_if_fail(async->now == nullptr && async->end == nullptr);
+ if (size == 0) {
+ read_done_cb(opaque);
+ return;
+ }
+ async->now = data;
+ async->end = async->now + size;
+ async->done = read_done_cb;
+ async->opaque = opaque;
+ async_read_handler(0, 0, stream);
+
+}
+
+#if HAVE_SASL
+static bool red_stream_write_u8(RedStream *s, uint8_t n)
+{
+ return red_stream_write_all(s, &n, sizeof(uint8_t));
+}
+
+static bool red_stream_write_u32_le(RedStream *s, uint32_t n)
+{
+ n = GUINT32_TO_LE(n);
+ return red_stream_write_all(s, &n, sizeof(uint32_t));
+}
+
+static ssize_t red_stream_sasl_write(RedStream *s, const void *buf, size_t nbyte)
+{
+ ssize_t ret;
+
+ if (!s->priv->sasl.encoded) {
+ int err;
+ err = sasl_encode(s->priv->sasl.conn, (char *)buf, nbyte,
+ (const char **)&s->priv->sasl.encoded,
+ &s->priv->sasl.encodedLength);
+ if (err != SASL_OK) {
+ spice_warning("sasl_encode error: %d", err);
+ errno = EIO;
+ return -1;
+ }
+
+ if (s->priv->sasl.encodedLength == 0) {
+ return 0;
+ }
+
+ if (!s->priv->sasl.encoded) {
+ spice_warning("sasl_encode didn't return a buffer!");
+ return 0;
+ }
+
+ s->priv->sasl.encodedOffset = 0;
+ }
+
+ ret = s->priv->write(s, s->priv->sasl.encoded + s->priv->sasl.encodedOffset,
+ s->priv->sasl.encodedLength - s->priv->sasl.encodedOffset);
+
+ if (ret <= 0) {
+ return ret;
+ }
+
+ s->priv->sasl.encodedOffset += ret;
+ if (s->priv->sasl.encodedOffset == s->priv->sasl.encodedLength) {
+ s->priv->sasl.encoded = NULL;
+ s->priv->sasl.encodedOffset = s->priv->sasl.encodedLength = 0;
+ return nbyte;
+ }
+
+ /* we didn't flush the encoded buffer */
+ errno = EAGAIN;
+ return -1;
+}
+
+static ssize_t red_stream_sasl_read(RedStream *s, uint8_t *buf, size_t nbyte)
+{
+ uint8_t encoded[4096];
+ const char *decoded;
+ unsigned int decodedlen;
+ int err;
+ int n, offset;
+
+ offset = spice_buffer_copy(&s->priv->sasl.inbuffer, buf, nbyte);
+ if (offset > 0) {
+ spice_buffer_remove(&s->priv->sasl.inbuffer, offset);
+ if (offset == nbyte)
+ return offset;
+ nbyte -= offset;
+ buf += offset;
+ }
+
+ n = s->priv->read(s, encoded, sizeof(encoded));
+ if (n <= 0) {
+ return offset > 0 ? offset : n;
+ }
+
+ err = sasl_decode(s->priv->sasl.conn,
+ (char *)encoded, n,
+ &decoded, &decodedlen);
+ if (err != SASL_OK) {
+ spice_warning("sasl_decode error: %d", err);
+ errno = EIO;
+ return offset > 0 ? offset : -1;
+ }
+
+ if (decodedlen == 0) {
+ errno = EAGAIN;
+ return offset > 0 ? offset : -1;
+ }
+
+ n = MIN(nbyte, decodedlen);
+ memcpy(buf, decoded, n);
+ spice_buffer_append(&s->priv->sasl.inbuffer, decoded + n, decodedlen - n);
+ return offset + n;
+}
+
+static char *addr_to_string(const char *format,
+ struct sockaddr_storage *sa,
+ socklen_t salen)
+{
+ char host[NI_MAXHOST];
+ char serv[NI_MAXSERV];
+ int err;
+
+ // makes it work on no-glibc avoiding getnameinfo returning error
+ if (sa->ss_family == AF_UNIX) {
+ return g_strdup("localhost;");
+ }
+
+ if ((err = getnameinfo((struct sockaddr *)sa, salen,
+ host, sizeof(host),
+ serv, sizeof(serv),
+ NI_NUMERICHOST | NI_NUMERICSERV)) != 0) {
+ spice_warning("Cannot resolve address %d: %s",
+ err, gai_strerror(err));
+ return NULL;
+ }
+
+ return g_strdup_printf(format, host, serv);
+}
+
+static char *red_stream_get_local_address(RedStream *stream)
+{
+ return addr_to_string("%s;%s", &stream->priv->info->laddr_ext,
+ stream->priv->info->llen_ext);
+}
+
+static char *red_stream_get_remote_address(RedStream *stream)
+{
+ return addr_to_string("%s;%s", &stream->priv->info->paddr_ext,
+ stream->priv->info->plen_ext);
+}
+
+static int auth_sasl_check_ssf(RedSASL *sasl, int *runSSF)
+{
+ const void *val;
+ int err, ssf;
+
+ *runSSF = 0;
+ if (!sasl->wantSSF) {
+ return 1;
+ }
+
+ err = sasl_getprop(sasl->conn, SASL_SSF, &val);
+ if (err != SASL_OK) {
+ return 0;
+ }
+
+ ssf = *(const int *)val;
+ spice_debug("negotiated an SSF of %d", ssf);
+ if (ssf < 56) {
+ return 0; /* 56 is good for Kerberos */
+ }
+
+ *runSSF = 1;
+
+ /* We have a SSF that's good enough */
+ return 1;
+}
+
+struct RedSASLAuth {
+ RedStream *stream;
+ // list of mechanisms allowed, allocated and freed by SASL
+ char *mechlist;
+ // mech received
+ char *mechname;
+ uint32_t len;
+ char *data;
+ // callback to call if success
+ RedSaslResult result_cb;
+ void *result_opaque;
+ // saved Async callback, we need to call if failed as
+ // we need to chain it in order to use a different opaque data
+ AsyncReadError saved_error_cb;
+};
+
+static void red_sasl_auth_free(RedSASLAuth *auth)
+{
+ g_free(auth->data);
+ g_free(auth->mechname);
+ g_free(auth->mechlist);
+ g_free(auth);
+}
+
+// handle SASL termination, either success or error
+// NOTE: After this function is called usually there should be a
+// return or the function should exit
+static void red_sasl_async_result(RedSASLAuth *auth, RedSaslError err)
+{
+ red_stream_set_async_error_handler(auth->stream, auth->saved_error_cb);
+ auth->result_cb(auth->result_opaque, err);
+ red_sasl_auth_free(auth);
+}
+
+static void red_sasl_error(void *opaque, int err)
+{
+ RedSASLAuth *auth = (RedSASLAuth*) opaque;
+ red_stream_set_async_error_handler(auth->stream, auth->saved_error_cb);
+ if (auth->saved_error_cb) {
+ auth->saved_error_cb(auth->result_opaque, err);
+ }
+ red_sasl_auth_free(auth);
+}
+
+/*
+ * Step Msg
+ *
+ * Input from client:
+ *
+ * u32 clientin-length
+ * u8-array clientin-string
+ *
+ * Output to client:
+ *
+ * u32 serverout-length
+ * u8-array serverout-strin
+ * u8 continue
+ */
+#define SASL_MAX_MECHNAME_LEN 100
+#define SASL_DATA_MAX_LEN (1024 * 1024)
+
+static void red_sasl_handle_auth_steplen(void *opaque);
+
+/*
+ * Start Msg
+ *
+ * Input from client:
+ *
+ * u32 clientin-length
+ * u8-array clientin-string
+ *
+ * Output to client:
+ *
+ * u32 serverout-length
+ * u8-array serverout-strin
+ * u8 continue
+ */
+
+static void red_sasl_handle_auth_step(void *opaque)
+{
+ RedSASLAuth *auth = (RedSASLAuth*) opaque;
+ RedStream *stream = auth->stream;
+ const char *serverout;
+ unsigned int serveroutlen;
+ int err;
+ char *clientdata = NULL;
+ RedSASL *sasl = &stream->priv->sasl;
+ uint32_t datalen = auth->len;
+
+ /* NB, distinction of NULL vs "" is *critical* in SASL */
+ if (datalen) {
+ clientdata = auth->data;
+ clientdata[datalen - 1] = '\0'; /* Wire includes '\0', but make sure */
+ datalen--; /* Don't count NULL byte when passing to _start() */
+ }
+
+ if (auth->mechname != NULL) {
+ spice_debug("Start SASL auth with mechanism %s. Data %p (%d bytes)",
+ auth->mechname, clientdata, datalen);
+ err = sasl_server_start(sasl->conn,
+ auth->mechname,
+ clientdata,
+ datalen,
+ &serverout,
+ &serveroutlen);
+ g_free(auth->mechname);
+ auth->mechname = NULL;
+ } else {
+ spice_debug("Step using SASL Data %p (%d bytes)", clientdata, datalen);
+ err = sasl_server_step(sasl->conn,
+ clientdata,
+ datalen,
+ &serverout,
+ &serveroutlen);
+ }
+ if (err != SASL_OK &&
+ err != SASL_CONTINUE) {
+ spice_warning("sasl step failed %d (%s)",
+ err, sasl_errdetail(sasl->conn));
+ return red_sasl_async_result(auth, RED_SASL_ERROR_GENERIC);
+ }
+
+ if (serveroutlen > SASL_DATA_MAX_LEN) {
+ spice_warning("sasl step reply data too long %d",
+ serveroutlen);
+ return red_sasl_async_result(auth, RED_SASL_ERROR_GENERIC);
+ }
+
+ spice_debug("SASL return data %d bytes, %p", serveroutlen, serverout);
+
+ if (serveroutlen) {
+ serveroutlen += 1;
+ red_stream_write_u32_le(stream, serveroutlen);
+ red_stream_write_all(stream, serverout, serveroutlen);
+ } else {
+ red_stream_write_u32_le(stream, 0);
+ }
+
+ /* Whether auth is complete */
+ red_stream_write_u8(stream, err == SASL_CONTINUE ? 0 : 1);
+
+ if (err == SASL_CONTINUE) {
+ spice_debug("%s", "Authentication must continue");
+ /* Wait for step length */
+ red_stream_async_read(stream, (uint8_t *)&auth->len, sizeof(uint32_t),
+ red_sasl_handle_auth_steplen, auth);
+ return;
+ } else {
+ int ssf;
+
+ if (auth_sasl_check_ssf(sasl, &ssf) == 0) {
+ spice_warning("Authentication rejected for weak SSF");
+ goto authreject;
+ }
+
+ spice_debug("Authentication successful");
+ red_stream_write_u32_le(stream, SPICE_LINK_ERR_OK); /* Accept auth */
+
+ /*
+ * Delay writing in SSF encoded until now
+ */
+ sasl->runSSF = ssf;
+ red_stream_disable_writev(stream); /* make sure writev isn't called directly anymore */
+
+ return red_sasl_async_result(auth, RED_SASL_ERROR_OK);
+ }
+
+authreject:
+ red_stream_write_u32_le(stream, 1); /* Reject auth */
+ red_stream_write_u32_le(stream, sizeof("Authentication failed"));
+ red_stream_write_all(stream, "Authentication failed", sizeof("Authentication failed"));
+
+ red_sasl_async_result(auth, RED_SASL_ERROR_AUTH_FAILED);
+}
+
+static void red_sasl_handle_auth_steplen(void *opaque)
+{
+ RedSASLAuth *auth = (RedSASLAuth*) opaque;
+
+ auth->len = GUINT32_FROM_LE(auth->len);
+ uint32_t len = auth->len;
+ spice_debug("Got steplen %d", len);
+ if (len > SASL_DATA_MAX_LEN) {
+ spice_warning("Too much SASL data %d", len);
+ return red_sasl_async_result((RedSASLAuth*) opaque, auth->mechname ? RED_SASL_ERROR_INVALID_DATA : RED_SASL_ERROR_GENERIC);
+ }
+
+ auth->data = (char*) g_realloc(auth->data, len);
+ red_stream_async_read(auth->stream, (uint8_t *)auth->data, len,
+ red_sasl_handle_auth_step, auth);
+}
+
+
+
+static void red_sasl_handle_auth_mechname(void *opaque)
+{
+ RedSASLAuth *auth = (RedSASLAuth*) opaque;
+
+ auth->mechname[auth->len] = '\0';
+ spice_debug("Got client mechname '%s' check against '%s'",
+ auth->mechname, auth->mechlist);
+
+ char quoted_mechname[SASL_MAX_MECHNAME_LEN + 4];
+ sprintf(quoted_mechname, ",%s,", auth->mechname);
+
+ if (strchr(auth->mechname, ',') || strstr(auth->mechlist, quoted_mechname) == NULL) {
+ return red_sasl_async_result(auth, RED_SASL_ERROR_INVALID_DATA);
+ }
+
+ spice_debug("Validated mechname '%s'", auth->mechname);
+
+ red_stream_async_read(auth->stream, (uint8_t *)&auth->len, sizeof(uint32_t),
+ red_sasl_handle_auth_steplen, auth);
+}
+
+static void red_sasl_handle_auth_mechlen(void *opaque)
+{
+ RedSASLAuth *auth = (RedSASLAuth*) opaque;
+
+ auth->len = GUINT32_FROM_LE(auth->len);
+ uint32_t len = auth->len;
+ if (len < 1 || len > SASL_MAX_MECHNAME_LEN) {
+ spice_warning("Got bad client mechname len %d", len);
+ return red_sasl_async_result(auth, RED_SASL_ERROR_GENERIC);
+ }
+
+ auth->mechname = (char*) g_malloc(len + 1);
+
+ spice_debug("Wait for client mechname");
+ red_stream_async_read(auth->stream, (uint8_t *)auth->mechname, len,
+ red_sasl_handle_auth_mechname, auth);
+}
+
+bool red_sasl_start_auth(RedStream *stream, RedSaslResult result_cb, void *result_opaque)
+{
+ const char *mechlist = NULL;
+ sasl_security_properties_t secprops;
+ int err;
+ char *localAddr, *remoteAddr;
+ int mechlistlen;
+ RedSASL *sasl = &stream->priv->sasl;
+ RedSASLAuth *auth;
+
+ if (!(localAddr = red_stream_get_local_address(stream))) {
+ goto error;
+ }
+
+ if (!(remoteAddr = red_stream_get_remote_address(stream))) {
+ g_free(localAddr);
+ goto error;
+ }
+
+ err = sasl_server_new("spice",
+ NULL, /* FQDN - just delegates to gethostname */
+ NULL, /* User realm */
+ localAddr,
+ remoteAddr,
+ NULL, /* Callbacks, not needed */
+ SASL_SUCCESS_DATA,
+ &sasl->conn);
+ g_free(localAddr);
+ g_free(remoteAddr);
+ localAddr = remoteAddr = NULL;
+
+ if (err != SASL_OK) {
+ spice_warning("sasl context setup failed %d (%s)",
+ err, sasl_errstring(err, NULL, NULL));
+ sasl->conn = NULL;
+ goto error;
+ }
+
+ /* Inform SASL that we've got an external SSF layer from TLS */
+ if (stream->priv->ssl) {
+ sasl_ssf_t ssf;
+
+ ssf = SSL_get_cipher_bits(stream->priv->ssl, NULL);
+ err = sasl_setprop(sasl->conn, SASL_SSF_EXTERNAL, &ssf);
+ if (err != SASL_OK) {
+ spice_warning("cannot set SASL external SSF %d (%s)",
+ err, sasl_errstring(err, NULL, NULL));
+ goto error_dispose;
+ }
+ } else {
+ sasl->wantSSF = 1;
+ }
+
+ memset(&secprops, 0, sizeof secprops);
+ /* Inform SASL that we've got an external SSF layer from TLS */
+ if (stream->priv->ssl) {
+ /* If we've got TLS (or UNIX domain sock), we don't care about SSF */
+ secprops.min_ssf = 0;
+ secprops.max_ssf = 0;
+ secprops.maxbufsize = 8192;
+ secprops.security_flags = 0;
+ } else {
+ /* Plain TCP, better get an SSF layer */
+ secprops.min_ssf = 56; /* Good enough to require kerberos */
+ secprops.max_ssf = 100000; /* Arbitrary big number */
+ secprops.maxbufsize = 8192;
+ /* Forbid any anonymous or trivially crackable auth */
+ secprops.security_flags =
+ SASL_SEC_NOANONYMOUS | SASL_SEC_NOPLAINTEXT;
+ }
+
+ err = sasl_setprop(sasl->conn, SASL_SEC_PROPS, &secprops);
+ if (err != SASL_OK) {
+ spice_warning("cannot set SASL security props %d (%s)",
+ err, sasl_errstring(err, NULL, NULL));
+ goto error_dispose;
+ }
+
+ err = sasl_listmech(sasl->conn,
+ NULL, /* Don't need to set user */
+ ",", /* Prefix */
+ ",", /* Separator */
+ ",", /* Suffix */
+ &mechlist,
+ NULL,
+ NULL);
+ if (err != SASL_OK || mechlist == NULL) {
+ spice_warning("cannot list SASL mechanisms %d (%s)",
+ err, sasl_errdetail(sasl->conn));
+ goto error_dispose;
+ }
+
+ spice_debug("Available mechanisms for client: '%s'", mechlist);
+
+ mechlistlen = strlen(mechlist);
+ if (!red_stream_write_u32_le(stream, mechlistlen)
+ || !red_stream_write_all(stream, mechlist, mechlistlen)) {
+ spice_warning("SASL mechanisms write error");
+ goto error;
+ }
+
+ auth = g_new0(RedSASLAuth, 1);
+ auth->stream = stream;
+ auth->result_cb = result_cb;
+ auth->result_opaque = result_opaque;
+ auth->saved_error_cb = stream->priv->async_read.error;
+ auth->mechlist = g_strdup(mechlist);
+
+ spice_debug("Wait for client mechname length");
+ red_stream_set_async_error_handler(stream, red_sasl_error);
+ red_stream_async_read(stream, (uint8_t *)&auth->len, sizeof(uint32_t),
+ red_sasl_handle_auth_mechlen, auth);
+
+ return true;
+
+error_dispose:
+ sasl_dispose(&sasl->conn);
+ sasl->conn = NULL;
+error:
+ return false;
+}
+#endif
+
+static ssize_t stream_websocket_read(RedStream *s, void *buf, size_t size)
+{
+ unsigned flags;
+ int len;
+
+ do {
+ len = websocket_read(s->priv->ws, static_cast<uint8_t *>(buf), size, &flags);
+ } while (len == 0 && flags != 0);
+ return len;
+}
+
+static ssize_t stream_websocket_write(RedStream *s, const void *buf, size_t size)
+{
+ return websocket_write(s->priv->ws, buf, size, WEBSOCKET_BINARY_FINAL);
+}
+
+static ssize_t stream_websocket_writev(RedStream *s, const struct iovec *iov, int iovcnt)
+{
+ return websocket_writev(s->priv->ws, iov, iovcnt, WEBSOCKET_BINARY_FINAL);
+}
+
+/*
+ If we detect that a newly opened stream appears to be using
+ the WebSocket protocol, we will put in place cover functions
+ that will speak WebSocket to the client, but allow the server
+ to continue to use normal stream read/write/writev semantics.
+*/
+bool red_stream_is_websocket(RedStream *stream, const void *buf, size_t len)
+{
+ if (stream->priv->ws) {
+ return false;
+ }
+
+ stream->priv->ws =
+ websocket_new(buf, len, stream, reinterpret_cast<websocket_read_cb_t>(stream->priv->read),
+ reinterpret_cast<websocket_write_cb_t>(stream->priv->write),
+ reinterpret_cast<websocket_writev_cb_t>(stream->priv->writev));
+ if (stream->priv->ws) {
+ stream->priv->read = stream_websocket_read;
+ stream->priv->write = stream_websocket_write;
+
+ if (stream->priv->writev) {
+ stream->priv->writev = stream_websocket_writev;
+ }
+
+ return true;
+ }
+
+ return false;
+}
diff --git a/server/red-stream.h b/server/red-stream.h
new file mode 100644
index 00000000..8e57c5e5
--- /dev/null
+++ b/server/red-stream.h
@@ -0,0 +1,114 @@
+/*
+ Copyright (C) 2009, 2013 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef RED_STREAM_H_
+#define RED_STREAM_H_
+
+#include <openssl/ssl.h>
+
+#include "spice-wrapped.h"
+#include "red-common.h"
+
+SPICE_BEGIN_DECLS
+
+#if OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(SSL_OP_NO_RENEGOTIATION) && defined(SSL_OP_NO_CLIENT_RENEGOTIATION)
+#define SSL_OP_NO_RENEGOTIATION SSL_OP_NO_CLIENT_RENEGOTIATION
+#endif
+
+typedef void (*AsyncReadDone)(void *opaque);
+typedef void (*AsyncReadError)(void *opaque, int err);
+
+typedef struct RedStream RedStream;
+typedef struct RedStreamPrivate RedStreamPrivate;
+
+struct RedStream {
+ int socket;
+ SpiceWatch *watch;
+
+ RedStreamPrivate *priv;
+};
+
+typedef enum {
+ RED_STREAM_SSL_STATUS_OK,
+ RED_STREAM_SSL_STATUS_ERROR,
+ RED_STREAM_SSL_STATUS_WAIT_FOR_READ,
+ RED_STREAM_SSL_STATUS_WAIT_FOR_WRITE
+} RedStreamSslStatus;
+
+/* any thread */
+ssize_t red_stream_read(RedStream *s, void *buf, size_t nbyte);
+void red_stream_async_read(RedStream *stream, uint8_t *data, size_t size,
+ AsyncReadDone read_done_cb, void *opaque);
+void red_stream_set_async_error_handler(RedStream *stream,
+ AsyncReadError error_handler);
+ssize_t red_stream_write(RedStream *s, const void *buf, size_t nbyte);
+ssize_t red_stream_writev(RedStream *s, const struct iovec *iov, int iovcnt);
+bool red_stream_write_all(RedStream *stream, const void *in_buf, size_t n);
+void red_stream_free(RedStream *s);
+
+void red_stream_push_channel_event(RedStream *s, int event);
+void red_stream_remove_watch(RedStream* s);
+void red_stream_set_channel(RedStream *stream, int connection_id,
+ int channel_type, int channel_id);
+RedStream *red_stream_new(RedsState *reds, int socket);
+void red_stream_set_core_interface(RedStream *stream, SpiceCoreInterfaceInternal *core);
+bool red_stream_is_ssl(RedStream *stream);
+RedStreamSslStatus red_stream_ssl_accept(RedStream *stream);
+RedStreamSslStatus red_stream_enable_ssl(RedStream *stream, SSL_CTX *ctx);
+int red_stream_get_family(const RedStream *stream);
+bool red_stream_is_plain_unix(const RedStream *stream);
+bool red_stream_set_no_delay(RedStream *stream, bool no_delay);
+int red_stream_get_no_delay(RedStream *stream);
+#ifndef _WIN32
+int red_stream_send_msgfd(RedStream *stream, int fd);
+#endif
+
+/**
+ * Set auto flush flag.
+ * If set, stream will send data to the underlying socket as
+ * soon as data are written. This is the default.
+ * If not set, you should call red_stream_flush to force
+ * data to be sent. Failing to call red_stream_flush on a
+ * manual flush stream could lead to latency.
+ * Disabling auto flush can fail while enabling cannot.
+ *
+ * Returns true on success or false on failure.
+ */
+bool red_stream_set_auto_flush(RedStream *stream, bool auto_flush);
+
+/**
+ * Flush data to the underlying socket.
+ * Calling this function on a stream with auto flush set has
+ * no result.
+ */
+void red_stream_flush(RedStream *stream);
+
+bool red_stream_is_websocket(RedStream *stream, const void *buf, size_t len);
+
+typedef enum {
+ RED_SASL_ERROR_OK,
+ RED_SASL_ERROR_GENERIC,
+ RED_SASL_ERROR_INVALID_DATA,
+ RED_SASL_ERROR_AUTH_FAILED
+} RedSaslError;
+
+typedef void (*RedSaslResult)(void *opaque, RedSaslError err);
+bool red_sasl_start_auth(RedStream *stream, RedSaslResult result_cb, void *opaque);
+
+SPICE_END_DECLS
+
+#endif /* RED_STREAM_H_ */
diff --git a/server/red-worker.cpp b/server/red-worker.cpp
new file mode 100644
index 00000000..912b7d55
--- /dev/null
+++ b/server/red-worker.cpp
@@ -0,0 +1,1090 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+#include <cerrno>
+#include <cinttypes>
+#include <cstdarg>
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
+
+#include <glib.h>
+#include <pthread.h>
+#include <unistd.h>
+
+#include <spice/protocol.h>
+#include <spice/qxl_dev.h>
+#include <spice/stats.h>
+#include <common/lz.h>
+#include <common/rect.h>
+#include <common/region.h>
+
+#include "display-channel.h"
+#include "video-stream.h"
+
+#include "spice-wrapped.h"
+#include "red-worker.h"
+#include "red-qxl.h"
+#include "cursor-channel.h"
+#include "tree.h"
+#include "red-record-qxl.h"
+
+// compatibility for FreeBSD
+#ifdef HAVE_PTHREAD_NP_H
+#include <pthread_np.h>
+#define pthread_setname_np pthread_set_name_np
+#endif
+
+#define CMD_RING_POLL_TIMEOUT 10 //milli
+#define CMD_RING_POLL_RETRIES 1
+
+#define INF_EVENT_WAIT ~0
+
+struct RedWorker {
+ pthread_t thread;
+ QXLInstance *qxl;
+ SpiceWatch *dispatch_watch;
+ SpiceCoreInterfaceInternal core;
+
+ unsigned int event_timeout;
+
+ DisplayChannel *display_channel;
+ uint32_t display_poll_tries;
+ gboolean was_blocked;
+
+ CursorChannel *cursor_channel;
+ uint32_t cursor_poll_tries;
+
+ RedMemSlotInfo mem_slots;
+
+ uint32_t process_display_generation;
+ RedStatNode stat;
+ RedStatCounter wakeup_counter;
+ RedStatCounter command_counter;
+ RedStatCounter full_loop_counter;
+ RedStatCounter total_loop_counter;
+
+ bool driver_cap_monitors_config;
+
+ RedRecord *record;
+ GMainLoop *loop;
+};
+
+static gboolean red_process_cursor_cmd(RedWorker *worker, const QXLCommandExt *ext)
+{
+ auto cursor_cmd = red_cursor_cmd_new(worker->qxl, &worker->mem_slots,
+ ext->group_id, ext->cmd.data);
+ if (!cursor_cmd) {
+ return FALSE;
+ }
+
+ worker->cursor_channel->process_cmd(std::move(cursor_cmd));
+
+ return TRUE;
+}
+
+static int red_process_cursor(RedWorker *worker, int *ring_is_empty)
+{
+ QXLCommandExt ext_cmd;
+ int n = 0;
+
+ if (!red_qxl_is_running(worker->qxl)) {
+ *ring_is_empty = TRUE;
+ return n;
+ }
+
+ *ring_is_empty = FALSE;
+ while (worker->cursor_channel->max_pipe_size() <= MAX_PIPE_SIZE) {
+ if (!red_qxl_get_cursor_command(worker->qxl, &ext_cmd)) {
+ *ring_is_empty = TRUE;
+ if (worker->cursor_poll_tries < CMD_RING_POLL_RETRIES) {
+ worker->event_timeout = MIN(worker->event_timeout, CMD_RING_POLL_TIMEOUT);
+ } else if (worker->cursor_poll_tries == CMD_RING_POLL_RETRIES &&
+ !red_qxl_req_cursor_notification(worker->qxl)) {
+ continue;
+ }
+ worker->cursor_poll_tries++;
+ return n;
+ }
+
+ if (worker->record) {
+ red_record_qxl_command(worker->record, &worker->mem_slots, ext_cmd);
+ }
+
+ worker->cursor_poll_tries = 0;
+ switch (ext_cmd.cmd.type) {
+ case QXL_CMD_CURSOR:
+ red_process_cursor_cmd(worker, &ext_cmd);
+ break;
+ default:
+ spice_warning("bad command type");
+ }
+ n++;
+ }
+ worker->was_blocked = TRUE;
+ return n;
+}
+
+static gboolean red_process_surface_cmd(RedWorker *worker, QXLCommandExt *ext, gboolean loadvm)
+{
+ auto surface_cmd = red_surface_cmd_new(worker->qxl, &worker->mem_slots,
+ ext->group_id, ext->cmd.data);
+ if (!surface_cmd) {
+ return false;
+ }
+ display_channel_process_surface_cmd(worker->display_channel, std::move(surface_cmd), loadvm);
+
+ return true;
+}
+
+static int red_process_display(RedWorker *worker, int *ring_is_empty)
+{
+ QXLCommandExt ext_cmd;
+ int n = 0;
+ uint64_t start = spice_get_monotonic_time_ns();
+
+ if (!red_qxl_is_running(worker->qxl)) {
+ *ring_is_empty = TRUE;
+ return n;
+ }
+
+ stat_inc_counter(worker->total_loop_counter, 1);
+
+ worker->process_display_generation++;
+ *ring_is_empty = FALSE;
+ while (worker->display_channel->max_pipe_size() <= MAX_PIPE_SIZE) {
+ if (!red_qxl_get_command(worker->qxl, &ext_cmd)) {
+ *ring_is_empty = TRUE;
+ if (worker->display_poll_tries < CMD_RING_POLL_RETRIES) {
+ worker->event_timeout = MIN(worker->event_timeout, CMD_RING_POLL_TIMEOUT);
+ } else if (worker->display_poll_tries == CMD_RING_POLL_RETRIES &&
+ !red_qxl_req_cmd_notification(worker->qxl)) {
+ continue;
+ }
+ worker->display_poll_tries++;
+ return n;
+ }
+
+ if (worker->record) {
+ red_record_qxl_command(worker->record, &worker->mem_slots, ext_cmd);
+ }
+
+ stat_inc_counter(worker->command_counter, 1);
+ worker->display_poll_tries = 0;
+ switch (ext_cmd.cmd.type) {
+ case QXL_CMD_DRAW: {
+ auto red_drawable = red_drawable_new(worker->qxl, &worker->mem_slots,
+ ext_cmd.group_id, ext_cmd.cmd.data,
+ ext_cmd.flags); // returns with 1 ref
+
+ if (red_drawable) {
+ display_channel_process_draw(worker->display_channel, std::move(red_drawable),
+ worker->process_display_generation);
+ }
+ break;
+ }
+ case QXL_CMD_UPDATE: {
+ auto update = red_update_cmd_new(worker->qxl, &worker->mem_slots,
+ ext_cmd.group_id, ext_cmd.cmd.data);
+ if (!update) {
+ break;
+ }
+ if (!display_channel_validate_surface(worker->display_channel, update->surface_id)) {
+ spice_warning("Invalid surface in QXL_CMD_UPDATE");
+ } else {
+ display_channel_draw(worker->display_channel, &update->area, update->surface_id);
+ red_qxl_notify_update(worker->qxl, update->update_id);
+ }
+ break;
+ }
+ case QXL_CMD_MESSAGE: {
+ auto message = red_message_new(worker->qxl, &worker->mem_slots,
+ ext_cmd.group_id, ext_cmd.cmd.data);
+ if (!message) {
+ break;
+ }
+#ifdef DEBUG
+ spice_warning("MESSAGE: %.*s", message->len, message->data);
+#endif
+ break;
+ }
+ case QXL_CMD_SURFACE:
+ red_process_surface_cmd(worker, &ext_cmd, FALSE);
+ break;
+
+ default:
+ spice_error("bad command type");
+ }
+ n++;
+ if (worker->display_channel->all_blocked()
+ || spice_get_monotonic_time_ns() - start > NSEC_PER_SEC / 100) {
+ worker->event_timeout = 0;
+ return n;
+ }
+ }
+ worker->was_blocked = TRUE;
+ stat_inc_counter(worker->full_loop_counter, 1);
+ return n;
+}
+
+static bool red_process_is_blocked(RedWorker *worker)
+{
+ return worker->cursor_channel->max_pipe_size() > MAX_PIPE_SIZE ||
+ worker->display_channel->max_pipe_size() > MAX_PIPE_SIZE;
+}
+
+using red_process_t = int (*)(RedWorker *worker, int *ring_is_empty);
+static void flush_commands(RedWorker *worker, RedChannel *red_channel,
+ red_process_t process)
+{
+ for (;;) {
+ uint64_t end_time;
+ int ring_is_empty;
+
+ process(worker, &ring_is_empty);
+ if (ring_is_empty) {
+ break;
+ }
+
+ while (process(worker, &ring_is_empty)) {
+ red_channel->push();
+ }
+
+ if (ring_is_empty) {
+ break;
+ }
+ end_time = spice_get_monotonic_time_ns() + COMMON_CLIENT_TIMEOUT;
+ for (;;) {
+ red_channel->push();
+ if (red_channel->max_pipe_size() <= MAX_PIPE_SIZE) {
+ break;
+ }
+ red_channel->receive();
+ red_channel->send();
+ // TODO: MC: the whole timeout will break since it takes lowest timeout, should
+ // do it client by client.
+ if (spice_get_monotonic_time_ns() >= end_time) {
+ // TODO: we need to record the client that actually causes the timeout.
+ // So we need to check the locations of the various pipe heads when counting,
+ // and disconnect only those/that.
+ spice_warning("flush timeout");
+ red_channel->disconnect();
+ } else {
+ usleep(DISPLAY_CLIENT_RETRY_INTERVAL);
+ }
+ }
+ }
+}
+
+static void flush_display_commands(RedWorker *worker)
+{
+ flush_commands(worker, worker->display_channel,
+ red_process_display);
+}
+
+static void flush_cursor_commands(RedWorker *worker)
+{
+ flush_commands(worker, worker->cursor_channel,
+ red_process_cursor);
+}
+
+// TODO: on timeout, don't disconnect all channels immediately - try to disconnect the slowest ones
+// first and maybe turn timeouts to several timeouts in order to disconnect channels gradually.
+// Should use disconnect or shutdown?
+static void flush_all_qxl_commands(RedWorker *worker)
+{
+ flush_display_commands(worker);
+ flush_cursor_commands(worker);
+}
+
+static void
+handle_dev_update_async(RedWorker* worker, RedWorkerMessageUpdateAsync* msg)
+{
+ QXLRect *qxl_dirty_rects = nullptr;
+ uint32_t num_dirty_rects = 0;
+
+ spice_return_if_fail(red_qxl_is_running(worker->qxl));
+ spice_return_if_fail(qxl_get_interface(worker->qxl)->update_area_complete);
+
+ flush_display_commands(worker);
+ display_channel_update(worker->display_channel,
+ msg->surface_id, &msg->qxl_area, msg->clear_dirty_region,
+ &qxl_dirty_rects, &num_dirty_rects);
+
+ red_qxl_update_area_complete(worker->qxl, msg->surface_id,
+ qxl_dirty_rects, num_dirty_rects);
+ g_free(qxl_dirty_rects);
+ red_qxl_async_complete(worker->qxl, msg->base.cookie);
+}
+
+static void
+handle_dev_update(RedWorker *worker, RedWorkerMessageUpdate *msg)
+{
+ QXLRect *qxl_dirty_rects = msg->qxl_dirty_rects;
+
+ spice_return_if_fail(red_qxl_is_running(worker->qxl));
+
+ flush_display_commands(worker);
+ display_channel_update(worker->display_channel,
+ msg->surface_id, msg->qxl_area, msg->clear_dirty_region,
+ &qxl_dirty_rects, &msg->num_dirty_rects);
+ if (msg->qxl_dirty_rects == nullptr) {
+ g_free(qxl_dirty_rects);
+ }
+}
+
+static void
+handle_dev_del_memslot(RedWorker* worker, RedWorkerMessageDelMemslot* msg)
+{
+ uint32_t slot_id = msg->slot_id;
+ uint32_t slot_group_id = msg->slot_group_id;
+
+ memslot_info_del_slot(&worker->mem_slots, slot_group_id, slot_id);
+}
+
+static void
+handle_dev_destroy_surface_wait(RedWorker* worker, RedWorkerMessageDestroySurfaceWait* msg)
+{
+ spice_return_if_fail(msg->surface_id == 0);
+
+ flush_all_qxl_commands(worker);
+ display_channel_destroy_surface_wait(worker->display_channel, msg->surface_id);
+}
+
+static void
+handle_dev_destroy_surfaces(RedWorker* worker, RedWorkerMessageDestroySurfaces*)
+{
+ flush_all_qxl_commands(worker);
+ display_channel_destroy_surfaces(worker->display_channel);
+ worker->cursor_channel->reset();
+}
+
+static void dev_create_primary_surface(RedWorker *worker, uint32_t surface_id,
+ QXLDevSurfaceCreate surface)
+{
+ DisplayChannel *display = worker->display_channel;
+ uint8_t *line_0;
+
+ spice_debug("trace");
+ spice_warn_if_fail(surface_id == 0);
+ spice_warn_if_fail(surface.height != 0);
+
+ /* surface can arrive from guest unchecked so make sure
+ * guest is not a malicious one and drop invalid requests
+ */
+ if (!red_validate_surface(surface.width, surface.height,
+ surface.stride, surface.format)) {
+ spice_warning("wrong primary surface creation request");
+ return;
+ }
+
+ line_0 = static_cast<uint8_t *>(memslot_get_virt(
+ &worker->mem_slots, surface.mem, surface.height * abs(surface.stride), surface.group_id));
+ if (line_0 == nullptr) {
+ return;
+ }
+ if (worker->record) {
+ red_record_primary_surface_create(worker->record,
+ &surface, line_0);
+ }
+
+ if (surface.stride < 0) {
+ line_0 -= static_cast<int32_t>(surface.stride * (surface.height - 1));
+ }
+
+ display_channel_create_surface(display, 0, surface.width, surface.height, surface.stride, surface.format,
+ line_0, surface.flags & QXL_SURF_FLAG_KEEP_DATA, TRUE);
+ display_channel_set_monitors_config_to_primary(display);
+
+ CommonGraphicsChannel *common = display;
+ if (display->is_connected() &&
+ !common->get_during_target_migrate()) {
+ /* guest created primary, so it will (hopefully) send a monitors_config
+ * now, don't send our own temporary one */
+ if (!worker->driver_cap_monitors_config) {
+ display_channel_push_monitors_config(display);
+ }
+ display->pipes_add_empty_msg(SPICE_MSG_DISPLAY_MARK);
+ display->push();
+ }
+
+ worker->cursor_channel->do_init();
+}
+
+static void
+handle_dev_create_primary_surface(RedWorker* worker, RedWorkerMessageCreatePrimarySurface* msg)
+{
+ dev_create_primary_surface(worker, msg->surface_id, msg->surface);
+}
+
+static void destroy_primary_surface(RedWorker *worker, uint32_t surface_id)
+{
+ DisplayChannel *display = worker->display_channel;
+
+ if (!display_channel_validate_surface(display, surface_id)) {
+ spice_warning("double destroy of primary surface");
+ return;
+ }
+ spice_warn_if_fail(surface_id == 0);
+
+ flush_all_qxl_commands(worker);
+ display_channel_destroy_surface_wait(display, 0);
+ display_channel_surface_id_unref(display, 0);
+
+ worker->cursor_channel->reset();
+}
+
+static void
+handle_dev_destroy_primary_surface(RedWorker* worker, RedWorkerMessageDestroyPrimarySurface* msg)
+{
+ uint32_t surface_id = msg->surface_id;
+
+ destroy_primary_surface(worker, surface_id);
+}
+
+static void
+handle_dev_destroy_primary_surface_async(RedWorker* worker,
+ RedWorkerMessageDestroyPrimarySurfaceAsync* msg)
+{
+ uint32_t surface_id = msg->surface_id;
+
+ destroy_primary_surface(worker, surface_id);
+ red_qxl_destroy_primary_surface_complete(worker->qxl->st);
+ red_qxl_async_complete(worker->qxl, msg->base.cookie);
+}
+
+static void
+handle_dev_flush_surfaces_async(RedWorker* worker, RedWorkerMessageFlushSurfacesAsync* msg)
+{
+ flush_all_qxl_commands(worker);
+ display_channel_flush_all_surfaces(worker->display_channel);
+ red_qxl_async_complete(worker->qxl, msg->base.cookie);
+}
+
+static void
+handle_dev_stop(RedWorker* worker, RedWorkerMessageStop*)
+{
+ spice_debug("stop");
+ if (!red_qxl_is_running(worker->qxl)) {
+ return;
+ }
+
+ red_qxl_set_running(worker->qxl, false);
+ display_channel_update_qxl_running(worker->display_channel, false);
+
+ display_channel_free_glz_drawables(worker->display_channel);
+ display_channel_flush_all_surfaces(worker->display_channel);
+
+ /* todo: when the waiting is expected to take long (slow connection and
+ * overloaded pipe), don't wait, and in case of migration,
+ * purge the pipe, send destroy_all_surfaces
+ * to the client (there is no such message right now), and start
+ * from scratch on the destination side */
+ worker->display_channel->wait_all_sent(COMMON_CLIENT_TIMEOUT);
+ worker->cursor_channel->wait_all_sent(COMMON_CLIENT_TIMEOUT);
+}
+
+static void
+handle_dev_start(RedWorker* worker, RedWorkerMessageStart*)
+{
+ if (red_qxl_is_running(worker->qxl)) {
+ return;
+ }
+
+ if (worker->cursor_channel) {
+ worker->cursor_channel->set_during_target_migrate(FALSE);
+ }
+ if (worker->display_channel) {
+ worker->display_channel->set_during_target_migrate(FALSE);
+ display_channel_wait_for_migrate_data(worker->display_channel);
+ }
+ red_qxl_set_running(worker->qxl, true);
+ display_channel_update_qxl_running(worker->display_channel, true);
+ worker->event_timeout = 0;
+}
+
+static void
+handle_dev_wakeup(RedWorker* worker, RedWorkerMessageWakeup*)
+{
+ stat_inc_counter(worker->wakeup_counter, 1);
+ red_qxl_clear_pending(worker->qxl->st, RED_DISPATCHER_PENDING_WAKEUP);
+}
+
+static void
+handle_dev_oom(RedWorker* worker, RedWorkerMessageOom*)
+{
+ DisplayChannel *display = worker->display_channel;
+
+ int ring_is_empty;
+
+ spice_return_if_fail(red_qxl_is_running(worker->qxl));
+ // streams? but without streams also leak
+ display_channel_debug_oom(display, "OOM1");
+ while (red_process_display(worker, &ring_is_empty)) {
+ display->push();
+ }
+ if (red_qxl_flush_resources(worker->qxl) == 0) {
+ display_channel_free_some(worker->display_channel);
+ red_qxl_flush_resources(worker->qxl);
+ }
+ display_channel_debug_oom(display, "OOM2");
+ red_qxl_clear_pending(worker->qxl->st, RED_DISPATCHER_PENDING_OOM);
+}
+
+static void
+handle_dev_reset_cursor(RedWorker* worker, RedWorkerMessageResetCursor*)
+{
+ worker->cursor_channel->reset();
+}
+
+static void
+handle_dev_reset_image_cache(RedWorker* worker, RedWorkerMessageResetImageCache*)
+{
+ display_channel_reset_image_cache(worker->display_channel);
+}
+
+static void
+handle_dev_destroy_surface_wait_async(RedWorker* worker,
+ RedWorkerMessageDestroySurfaceWaitAsync *msg)
+{
+ display_channel_destroy_surface_wait(worker->display_channel, msg->surface_id);
+ red_qxl_async_complete(worker->qxl, msg->base.cookie);
+}
+
+static void
+handle_dev_destroy_surfaces_async(RedWorker* worker, RedWorkerMessageDestroySurfacesAsync* msg)
+{
+ flush_all_qxl_commands(worker);
+ display_channel_destroy_surfaces(worker->display_channel);
+ worker->cursor_channel->reset();
+ red_qxl_async_complete(worker->qxl, msg->base.cookie);
+}
+
+static void
+handle_dev_create_primary_surface_async(RedWorker* worker,
+ RedWorkerMessageCreatePrimarySurfaceAsync* msg)
+{
+ dev_create_primary_surface(worker, msg->surface_id, msg->surface);
+ red_qxl_create_primary_surface_complete(worker->qxl->st, &msg->surface);
+ red_qxl_async_complete(worker->qxl, msg->base.cookie);
+}
+
+static inline uint32_t qxl_monitors_config_size(uint32_t heads)
+{
+ return sizeof(QXLMonitorsConfig) + sizeof(QXLHead) * heads;
+}
+
+static void
+handle_dev_monitors_config_async(RedWorker* worker, RedWorkerMessageMonitorsConfigAsync* msg)
+{
+ uint16_t count, max_allowed;
+ const QXLMonitorsConfig *dev_monitors_config =
+ static_cast<QXLMonitorsConfig *>(memslot_get_virt(
+ &worker->mem_slots, msg->monitors_config, qxl_monitors_config_size(1), msg->group_id));
+
+ if (dev_monitors_config == nullptr) {
+ /* TODO: raise guest bug (requires added QXL interface) */
+ goto async_complete;
+ }
+ worker->driver_cap_monitors_config = true;
+ count = dev_monitors_config->count;
+ max_allowed = dev_monitors_config->max_allowed;
+ if (count == 0) {
+ spice_warning("ignoring an empty monitors config message from driver");
+ goto async_complete;
+ }
+ if (count > max_allowed) {
+ spice_warning("ignoring malformed monitors_config from driver, "
+ "count > max_allowed %d > %d",
+ count,
+ max_allowed);
+ goto async_complete;
+ }
+ /* get pointer again to check virtual size */
+ dev_monitors_config = static_cast<QXLMonitorsConfig *>(memslot_get_virt(
+ &worker->mem_slots, msg->monitors_config, qxl_monitors_config_size(count), msg->group_id));
+ if (dev_monitors_config == nullptr) {
+ /* TODO: raise guest bug (requires added QXL interface) */
+ goto async_complete;
+ }
+ display_channel_update_monitors_config(worker->display_channel, dev_monitors_config,
+ MIN(count, msg->max_monitors),
+ MIN(max_allowed, msg->max_monitors));
+async_complete:
+ red_qxl_async_complete(worker->qxl, msg->base.cookie);
+}
+
+static void
+handle_dev_set_compression(RedWorker* worker, RedWorkerMessageSetCompression* msg)
+{
+ SpiceImageCompression image_compression = msg->image_compression;
+
+ display_channel_set_image_compression(worker->display_channel, image_compression);
+
+ display_channel_compress_stats_print(worker->display_channel);
+ display_channel_compress_stats_reset(worker->display_channel);
+}
+
+static void
+handle_dev_set_streaming_video(RedWorker* worker, RedWorkerMessageSetStreamingVideo* msg)
+{
+ display_channel_set_stream_video(worker->display_channel, msg->streaming_video);
+}
+
+static void
+handle_dev_set_video_codecs(RedWorker* worker, RedWorkerMessageSetVideoCodecs* msg)
+{
+ display_channel_set_video_codecs(worker->display_channel, msg->video_codecs);
+ g_array_unref(msg->video_codecs);
+}
+
+static void
+handle_dev_set_mouse_mode(RedWorker* worker, RedWorkerMessageSetMouseMode* msg)
+{
+ spice_debug("mouse mode %u", msg->mode);
+ worker->cursor_channel->set_mouse_mode(msg->mode);
+}
+
+static void dev_add_memslot(RedWorker *worker, QXLDevMemSlot mem_slot)
+{
+ memslot_info_add_slot(&worker->mem_slots, mem_slot.slot_group_id, mem_slot.slot_id,
+ mem_slot.addr_delta, mem_slot.virt_start, mem_slot.virt_end,
+ mem_slot.generation);
+}
+
+static void
+handle_dev_add_memslot(RedWorker* worker, RedWorkerMessageAddMemslot* msg)
+{
+ QXLDevMemSlot mem_slot = msg->mem_slot;
+
+ memslot_info_add_slot(&worker->mem_slots, mem_slot.slot_group_id, mem_slot.slot_id,
+ mem_slot.addr_delta, mem_slot.virt_start, mem_slot.virt_end,
+ mem_slot.generation);
+}
+
+static void
+handle_dev_add_memslot_async(RedWorker* worker, RedWorkerMessageAddMemslotAsync* msg)
+{
+ dev_add_memslot(worker, msg->mem_slot);
+ red_qxl_async_complete(worker->qxl, msg->base.cookie);
+}
+
+static void
+handle_dev_reset_memslots(RedWorker* worker, RedWorkerMessageResetMemslots*)
+{
+ memslot_info_reset(&worker->mem_slots);
+}
+
+static void
+handle_dev_driver_unload(RedWorker* worker, RedWorkerMessageDriverUnload*)
+{
+ worker->driver_cap_monitors_config = false;
+}
+
+static void
+handle_dev_gl_scanout(RedWorker* worker, RedWorkerMessageGlScanout*)
+{
+ display_channel_gl_scanout(worker->display_channel);
+}
+
+static void
+handle_dev_gl_draw_async(RedWorker* worker, RedWorkerMessageGlDraw* draw)
+{
+ display_channel_gl_draw(worker->display_channel, &draw->draw);
+}
+
+static void
+handle_dev_close(RedWorker* worker, RedWorkerMessageClose*)
+{
+ g_main_loop_quit(worker->loop);
+}
+
+static bool loadvm_command(RedWorker *worker, QXLCommandExt *ext)
+{
+ switch (ext->cmd.type) {
+ case QXL_CMD_CURSOR:
+ return red_process_cursor_cmd(worker, ext);
+
+ case QXL_CMD_SURFACE:
+ return red_process_surface_cmd(worker, ext, TRUE);
+
+ default:
+ spice_warning("unhandled loadvm command type (%d)", ext->cmd.type);
+ }
+
+ return TRUE;
+}
+
+static void
+handle_dev_loadvm_commands(RedWorker* worker, RedWorkerMessageLoadvmCommands* msg)
+{
+ uint32_t i;
+ uint32_t count = msg->count;
+ QXLCommandExt *ext = msg->ext;
+
+ spice_debug("loadvm_commands");
+ for (i = 0 ; i < count ; ++i) {
+ if (!loadvm_command(worker, &ext[i])) {
+ /* XXX allow failure in loadvm? */
+ spice_warning("failed loadvm command type (%d)", ext[i].cmd.type);
+ }
+ }
+}
+
+static void worker_dispatcher_record(void *opaque, uint32_t message_type, void *payload)
+{
+ auto worker = static_cast<RedWorker *>(opaque);
+
+ red_record_event(worker->record, 1, message_type);
+}
+
+template <typename T>
+static inline void
+register_handler(Dispatcher *dispatcher,
+ void (*handler)(RedWorker*, T*), bool ack)
+{
+ dispatcher->register_handler(T::MESSAGE_NUM,
+ reinterpret_cast<dispatcher_handle_message>(handler),
+ sizeof(T),
+ ack);
+}
+
+static void register_callbacks(Dispatcher *dispatcher)
+{
+ /* TODO: register cursor & display specific msg in respective channel files */
+ register_handler(dispatcher,
+ handle_dev_update,
+ true);
+ register_handler(dispatcher,
+ handle_dev_update_async,
+ false);
+ register_handler(dispatcher,
+ handle_dev_add_memslot,
+ true);
+ register_handler(dispatcher,
+ handle_dev_add_memslot_async,
+ false);
+ register_handler(dispatcher,
+ handle_dev_del_memslot,
+ false);
+ register_handler(dispatcher,
+ handle_dev_destroy_surfaces,
+ true);
+ register_handler(dispatcher,
+ handle_dev_destroy_surfaces_async,
+ false);
+ register_handler(dispatcher,
+ handle_dev_destroy_primary_surface,
+ true);
+ register_handler(dispatcher,
+ handle_dev_destroy_primary_surface_async,
+ false);
+ register_handler(dispatcher,
+ handle_dev_create_primary_surface_async,
+ false);
+ register_handler(dispatcher,
+ handle_dev_create_primary_surface,
+ true);
+ register_handler(dispatcher,
+ handle_dev_reset_image_cache,
+ true);
+ register_handler(dispatcher,
+ handle_dev_reset_cursor,
+ true);
+ register_handler(dispatcher,
+ handle_dev_wakeup,
+ false);
+ register_handler(dispatcher,
+ handle_dev_oom,
+ false);
+ register_handler(dispatcher,
+ handle_dev_start,
+ false);
+ register_handler(dispatcher,
+ handle_dev_flush_surfaces_async,
+ false);
+ register_handler(dispatcher,
+ handle_dev_stop,
+ true);
+ register_handler(dispatcher,
+ handle_dev_loadvm_commands,
+ true);
+ register_handler(dispatcher,
+ handle_dev_set_compression,
+ false);
+ register_handler(dispatcher,
+ handle_dev_set_streaming_video,
+ false);
+ register_handler(dispatcher,
+ handle_dev_set_video_codecs,
+ false);
+ register_handler(dispatcher,
+ handle_dev_set_mouse_mode,
+ false);
+ register_handler(dispatcher,
+ handle_dev_destroy_surface_wait,
+ true);
+ register_handler(dispatcher,
+ handle_dev_destroy_surface_wait_async,
+ false);
+ register_handler(dispatcher,
+ handle_dev_reset_memslots,
+ false);
+ register_handler(dispatcher,
+ handle_dev_monitors_config_async,
+ false);
+ register_handler(dispatcher,
+ handle_dev_driver_unload,
+ false);
+ register_handler(dispatcher,
+ handle_dev_gl_scanout,
+ false);
+ register_handler(dispatcher,
+ handle_dev_gl_draw_async,
+ false);
+ register_handler(dispatcher,
+ handle_dev_close,
+ false);
+}
+
+
+
+struct RedWorkerSource {
+ GSource source;
+ RedWorker *worker;
+};
+
+static gboolean worker_source_prepare(GSource *source, gint *p_timeout)
+{
+ RedWorkerSource *wsource = SPICE_CONTAINEROF(source, RedWorkerSource, source);
+ RedWorker *worker = wsource->worker;
+ unsigned int timeout;
+
+ timeout = MIN(worker->event_timeout,
+ display_channel_get_streams_timeout(worker->display_channel));
+
+ *p_timeout = (timeout == INF_EVENT_WAIT) ? -1 : timeout;
+ if (*p_timeout == 0)
+ return TRUE;
+
+ if (worker->was_blocked && !red_process_is_blocked(worker)) {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static gboolean worker_source_check(GSource *source)
+{
+ RedWorkerSource *wsource = SPICE_CONTAINEROF(source, RedWorkerSource, source);
+ RedWorker *worker = wsource->worker;
+
+ return red_qxl_is_running(worker->qxl) /* TODO && worker->pending_process */;
+}
+
+static gboolean worker_source_dispatch(GSource *source, GSourceFunc callback,
+ gpointer user_data)
+{
+ RedWorkerSource *wsource = SPICE_CONTAINEROF(source, RedWorkerSource, source);
+ RedWorker *worker = wsource->worker;
+ DisplayChannel *display = worker->display_channel;
+ int ring_is_empty;
+
+ /* during migration, in the dest, the display channel can be initialized
+ while the global lz data not since migrate data msg hasn't been
+ received yet */
+ /* TODO: why is this here, and not in display_channel_create */
+ display_channel_free_glz_drawables_to_free(display);
+
+ /* TODO: could use its own source */
+ video_stream_timeout(display);
+
+ worker->event_timeout = INF_EVENT_WAIT;
+ worker->was_blocked = FALSE;
+ red_process_cursor(worker, &ring_is_empty);
+ red_process_display(worker, &ring_is_empty);
+
+ return TRUE;
+}
+
+/* cannot be const */
+static GSourceFuncs worker_source_funcs = {
+ .prepare = worker_source_prepare,
+ .check = worker_source_check,
+ .dispatch = worker_source_dispatch,
+};
+
+RedWorker* red_worker_new(QXLInstance *qxl)
+{
+ QXLDevInitInfo init_info;
+ RedWorker *worker;
+ Dispatcher *dispatcher;
+ RedsState *reds = red_qxl_get_server(qxl->st);
+ RedChannel *channel;
+
+ red_qxl_get_init_info(qxl, &init_info);
+
+ worker = g_new0(RedWorker, 1);
+ worker->core = event_loop_core;
+ worker->core.main_context = g_main_context_new();
+
+ worker->record = reds_get_record(reds);
+ dispatcher = red_qxl_get_dispatcher(qxl);
+ dispatcher->set_opaque(worker);
+
+ worker->qxl = qxl;
+ register_callbacks(dispatcher);
+ if (worker->record) {
+ dispatcher->register_universal_handler(worker_dispatcher_record);
+ }
+
+ worker->driver_cap_monitors_config = false;
+ char worker_str[SPICE_STAT_NODE_NAME_MAX];
+ snprintf(worker_str, sizeof(worker_str), "display[%d]", worker->qxl->id & 0xff);
+ stat_init_node(&worker->stat, reds, nullptr, worker_str, TRUE);
+ stat_init_counter(&worker->wakeup_counter, reds, &worker->stat, "wakeups", TRUE);
+ stat_init_counter(&worker->command_counter, reds, &worker->stat, "commands", TRUE);
+ stat_init_counter(&worker->full_loop_counter, reds, &worker->stat, "full_loops", TRUE);
+ stat_init_counter(&worker->total_loop_counter, reds, &worker->stat, "total_loops", TRUE);
+
+ worker->dispatch_watch = dispatcher->create_watch(&worker->core);
+ spice_assert(worker->dispatch_watch != nullptr);
+
+ GSource *source = g_source_new(&worker_source_funcs, sizeof(RedWorkerSource));
+ SPICE_CONTAINEROF(source, RedWorkerSource, source)->worker = worker;
+ g_source_attach(source, worker->core.main_context);
+ g_source_unref(source);
+
+ memslot_info_init(&worker->mem_slots,
+ init_info.num_memslots_groups,
+ init_info.num_memslots,
+ init_info.memslot_gen_bits,
+ init_info.memslot_id_bits,
+ init_info.internal_groupslot_id);
+
+ worker->event_timeout = INF_EVENT_WAIT;
+
+ worker->cursor_channel = cursor_channel_new(reds, qxl->id,
+ &worker->core, dispatcher).get(); // XXX
+ channel = worker->cursor_channel;
+ channel->init_stat_node(&worker->stat, "cursor_channel");
+
+ // TODO: handle seamless migration. Temp, setting migrate to FALSE
+ worker->display_channel = display_channel_new(reds, qxl, &worker->core, dispatcher,
+ FALSE,
+ reds_get_streaming_video(reds),
+ reds_get_video_codecs(reds),
+ init_info.n_surfaces).get(); // XXX
+ channel = worker->display_channel;
+ channel->init_stat_node(&worker->stat, "display_channel");
+ display_channel_set_image_compression(worker->display_channel,
+ spice_server_get_image_compression(reds));
+
+ return worker;
+}
+
+static void *red_worker_main(void *arg)
+{
+ auto worker = static_cast<RedWorker *>(arg);
+
+ spice_debug("begin");
+#if defined(__APPLE__)
+ pthread_setname_np("SPICE Worker");
+#endif
+ SPICE_VERIFY(MAX_PIPE_SIZE > WIDE_CLIENT_ACK_WINDOW &&
+ MAX_PIPE_SIZE > NARROW_CLIENT_ACK_WINDOW); //ensure wakeup by ack message
+
+ worker->cursor_channel->reset_thread_id();
+ worker->display_channel->reset_thread_id();
+
+ GMainLoop *loop = g_main_loop_new(worker->core.main_context, FALSE);
+ worker->loop = loop;
+ g_main_loop_run(loop);
+ g_main_loop_unref(loop);
+ worker->loop = nullptr;
+
+ return nullptr;
+}
+
+bool red_worker_run(RedWorker *worker)
+{
+#ifndef _WIN32
+ sigset_t thread_sig_mask;
+ sigset_t curr_sig_mask;
+#endif
+ int r;
+
+ spice_return_val_if_fail(worker, FALSE);
+ spice_return_val_if_fail(!worker->thread, FALSE);
+
+#ifndef _WIN32
+ sigfillset(&thread_sig_mask);
+ sigdelset(&thread_sig_mask, SIGILL);
+ sigdelset(&thread_sig_mask, SIGFPE);
+ sigdelset(&thread_sig_mask, SIGSEGV);
+ pthread_sigmask(SIG_SETMASK, &thread_sig_mask, &curr_sig_mask);
+#endif
+ if ((r = pthread_create(&worker->thread, nullptr, red_worker_main, worker))) {
+ spice_error("create thread failed %d", r);
+ }
+#ifndef _WIN32
+ pthread_sigmask(SIG_SETMASK, &curr_sig_mask, nullptr);
+#endif
+#if !defined(__APPLE__)
+ pthread_setname_np(worker->thread, "SPICE Worker");
+#endif
+
+ return r == 0;
+}
+
+static void red_worker_close_channel(RedChannel *channel)
+{
+ channel->reset_thread_id();
+ channel->destroy();
+}
+
+/*
+ * Free the worker thread. This function should be called by RedQxl
+ * after sending a RED_WORKER_MESSAGE_CLOSE_WORKER message;
+ * failing to do so will cause a deadlock.
+ */
+void red_worker_free(RedWorker *worker)
+{
+ pthread_join(worker->thread, nullptr);
+
+ red_worker_close_channel(worker->cursor_channel);
+ worker->cursor_channel = nullptr;
+ red_worker_close_channel(worker->display_channel);
+ worker->display_channel = nullptr;
+
+ if (worker->dispatch_watch) {
+ red_watch_remove(worker->dispatch_watch);
+ }
+
+ g_main_context_unref(worker->core.main_context);
+
+ if (worker->record) {
+ red_record_unref(worker->record);
+ }
+ memslot_info_destroy(&worker->mem_slots);
+ g_free(worker);
+}
diff --git a/server/red-worker.h b/server/red-worker.h
new file mode 100644
index 00000000..9626c6eb
--- /dev/null
+++ b/server/red-worker.h
@@ -0,0 +1,289 @@
+/*
+ Copyright (C) 2009 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+/* This header should contains internal details between RedQxl and
+ * RedWorker.
+ * Should be included only by red-worker.cpp, red-qxl.cpp and
+ * red-replay-qxl.cpp (which uses message values).
+ */
+
+#ifndef RED_WORKER_H_
+#define RED_WORKER_H_
+
+#include "red-channel.h"
+
+#include "push-visibility.h"
+
+struct RedWorker;
+
+RedWorker* red_worker_new(QXLInstance *qxl);
+bool red_worker_run(RedWorker *worker);
+void red_worker_free(RedWorker *worker);
+
+struct Dispatcher *red_qxl_get_dispatcher(QXLInstance *qxl);
+void red_qxl_destroy_primary_surface_complete(QXLState *qxl_state);
+void red_qxl_create_primary_surface_complete(QXLState *qxl_state, const QXLDevSurfaceCreate* surface);
+bool red_qxl_is_running(QXLInstance *qxl);
+void red_qxl_set_running(QXLInstance *qxl, bool running);
+
+using RedWorkerMessage = uint32_t;
+
+/* Keep message order, only append new messages!
+ * Replay code store enum values into save files.
+ */
+enum {
+ RED_WORKER_MESSAGE_NOP,
+
+ RED_WORKER_MESSAGE_UPDATE,
+ RED_WORKER_MESSAGE_WAKEUP,
+ RED_WORKER_MESSAGE_OOM,
+ RED_WORKER_MESSAGE_READY, /* unused */
+
+ RED_WORKER_MESSAGE_DISPLAY_CONNECT_DEPRECATED,
+ RED_WORKER_MESSAGE_DISPLAY_DISCONNECT_DEPRECATED,
+ RED_WORKER_MESSAGE_DISPLAY_MIGRATE_DEPRECATED,
+ RED_WORKER_MESSAGE_START,
+ RED_WORKER_MESSAGE_STOP,
+ RED_WORKER_MESSAGE_CURSOR_CONNECT_DEPRECATED,
+ RED_WORKER_MESSAGE_CURSOR_DISCONNECT_DEPRECATED,
+ RED_WORKER_MESSAGE_CURSOR_MIGRATE_DEPRECATED,
+ RED_WORKER_MESSAGE_SET_COMPRESSION,
+ RED_WORKER_MESSAGE_SET_STREAMING_VIDEO,
+ RED_WORKER_MESSAGE_SET_MOUSE_MODE,
+ RED_WORKER_MESSAGE_ADD_MEMSLOT,
+ RED_WORKER_MESSAGE_DEL_MEMSLOT,
+ RED_WORKER_MESSAGE_RESET_MEMSLOTS,
+ RED_WORKER_MESSAGE_DESTROY_SURFACES,
+ RED_WORKER_MESSAGE_CREATE_PRIMARY_SURFACE,
+ RED_WORKER_MESSAGE_DESTROY_PRIMARY_SURFACE,
+ RED_WORKER_MESSAGE_RESET_CURSOR,
+ RED_WORKER_MESSAGE_RESET_IMAGE_CACHE,
+ RED_WORKER_MESSAGE_DESTROY_SURFACE_WAIT,
+ RED_WORKER_MESSAGE_LOADVM_COMMANDS,
+ /* async commands */
+ RED_WORKER_MESSAGE_UPDATE_ASYNC,
+ RED_WORKER_MESSAGE_ADD_MEMSLOT_ASYNC,
+ RED_WORKER_MESSAGE_DESTROY_SURFACES_ASYNC,
+ RED_WORKER_MESSAGE_CREATE_PRIMARY_SURFACE_ASYNC,
+ RED_WORKER_MESSAGE_DESTROY_PRIMARY_SURFACE_ASYNC,
+ RED_WORKER_MESSAGE_DESTROY_SURFACE_WAIT_ASYNC,
+ /* suspend/windows resolution change command */
+ RED_WORKER_MESSAGE_FLUSH_SURFACES_ASYNC,
+
+ RED_WORKER_MESSAGE_DISPLAY_CHANNEL_CREATE, /* unused */
+ RED_WORKER_MESSAGE_CURSOR_CHANNEL_CREATE, /* unused */
+
+ RED_WORKER_MESSAGE_MONITORS_CONFIG_ASYNC,
+ RED_WORKER_MESSAGE_DRIVER_UNLOAD,
+ RED_WORKER_MESSAGE_GL_SCANOUT,
+ RED_WORKER_MESSAGE_GL_DRAW_ASYNC,
+ RED_WORKER_MESSAGE_SET_VIDEO_CODECS,
+
+ /* close worker thread */
+ RED_WORKER_MESSAGE_CLOSE_WORKER,
+
+ RED_WORKER_MESSAGE_COUNT // LAST
+};
+
+struct RedWorkerMessageUpdate {
+ enum { MESSAGE_NUM = RED_WORKER_MESSAGE_UPDATE };
+ uint32_t surface_id;
+ QXLRect * qxl_area;
+ QXLRect * qxl_dirty_rects;
+ uint32_t num_dirty_rects;
+ uint32_t clear_dirty_region;
+};
+
+struct RedWorkerMessageAsync {
+ uint64_t cookie;
+};
+
+struct RedWorkerMessageUpdateAsync {
+ enum { MESSAGE_NUM = RED_WORKER_MESSAGE_UPDATE_ASYNC };
+ RedWorkerMessageAsync base;
+ uint32_t surface_id;
+ QXLRect qxl_area;
+ uint32_t clear_dirty_region;
+};
+
+struct RedWorkerMessageAddMemslot {
+ enum { MESSAGE_NUM = RED_WORKER_MESSAGE_ADD_MEMSLOT };
+ QXLDevMemSlot mem_slot;
+};
+
+struct RedWorkerMessageAddMemslotAsync {
+ enum { MESSAGE_NUM = RED_WORKER_MESSAGE_ADD_MEMSLOT_ASYNC };
+ RedWorkerMessageAsync base;
+ QXLDevMemSlot mem_slot;
+};
+
+struct RedWorkerMessageDelMemslot {
+ enum { MESSAGE_NUM = RED_WORKER_MESSAGE_DEL_MEMSLOT };
+ uint32_t slot_group_id;
+ uint32_t slot_id;
+};
+
+struct RedWorkerMessageDestroySurfaces {
+ enum { MESSAGE_NUM = RED_WORKER_MESSAGE_DESTROY_SURFACES };
+ uint8_t dummy_empty_field[0]; // C/C++ compatibility
+};
+
+struct RedWorkerMessageDestroySurfacesAsync {
+ enum { MESSAGE_NUM = RED_WORKER_MESSAGE_DESTROY_SURFACES_ASYNC };
+ RedWorkerMessageAsync base;
+};
+
+
+struct RedWorkerMessageDestroyPrimarySurface {
+ enum { MESSAGE_NUM = RED_WORKER_MESSAGE_DESTROY_PRIMARY_SURFACE };
+ uint32_t surface_id;
+};
+
+struct RedWorkerMessageDestroyPrimarySurfaceAsync {
+ enum { MESSAGE_NUM = RED_WORKER_MESSAGE_DESTROY_PRIMARY_SURFACE_ASYNC };
+ RedWorkerMessageAsync base;
+ uint32_t surface_id;
+};
+
+struct RedWorkerMessageCreatePrimarySurfaceAsync {
+ enum { MESSAGE_NUM = RED_WORKER_MESSAGE_CREATE_PRIMARY_SURFACE_ASYNC };
+ RedWorkerMessageAsync base;
+ uint32_t surface_id;
+ QXLDevSurfaceCreate surface;
+};
+
+struct RedWorkerMessageCreatePrimarySurface {
+ enum { MESSAGE_NUM = RED_WORKER_MESSAGE_CREATE_PRIMARY_SURFACE };
+ uint32_t surface_id;
+ QXLDevSurfaceCreate surface;
+};
+
+struct RedWorkerMessageResetImageCache {
+ enum { MESSAGE_NUM = RED_WORKER_MESSAGE_RESET_IMAGE_CACHE };
+ uint8_t dummy_empty_field[0]; // C/C++ compatibility
+};
+
+struct RedWorkerMessageResetCursor {
+ enum { MESSAGE_NUM = RED_WORKER_MESSAGE_RESET_CURSOR };
+ uint8_t dummy_empty_field[0]; // C/C++ compatibility
+};
+
+struct RedWorkerMessageWakeup {
+ enum { MESSAGE_NUM = RED_WORKER_MESSAGE_WAKEUP };
+ uint8_t dummy_empty_field[0]; // C/C++ compatibility
+};
+
+struct RedWorkerMessageOom {
+ enum { MESSAGE_NUM = RED_WORKER_MESSAGE_OOM };
+ uint8_t dummy_empty_field[0]; // C/C++ compatibility
+};
+
+struct RedWorkerMessageStart {
+ enum { MESSAGE_NUM = RED_WORKER_MESSAGE_START };
+ uint8_t dummy_empty_field[0]; // C/C++ compatibility
+};
+
+struct RedWorkerMessageFlushSurfacesAsync {
+ enum { MESSAGE_NUM = RED_WORKER_MESSAGE_FLUSH_SURFACES_ASYNC };
+ RedWorkerMessageAsync base;
+};
+
+struct RedWorkerMessageStop {
+ enum { MESSAGE_NUM = RED_WORKER_MESSAGE_STOP };
+ uint8_t dummy_empty_field[0]; // C/C++ compatibility
+};
+
+/* this command is sync, so it's ok to pass a pointer */
+struct RedWorkerMessageLoadvmCommands {
+ enum { MESSAGE_NUM = RED_WORKER_MESSAGE_LOADVM_COMMANDS };
+ uint32_t count;
+ QXLCommandExt *ext;
+};
+
+struct RedWorkerMessageSetCompression {
+ enum { MESSAGE_NUM = RED_WORKER_MESSAGE_SET_COMPRESSION };
+ SpiceImageCompression image_compression;
+};
+
+struct RedWorkerMessageSetStreamingVideo {
+ enum { MESSAGE_NUM = RED_WORKER_MESSAGE_SET_STREAMING_VIDEO };
+ uint32_t streaming_video;
+};
+
+struct RedWorkerMessageSetVideoCodecs {
+ enum { MESSAGE_NUM = RED_WORKER_MESSAGE_SET_VIDEO_CODECS };
+ GArray* video_codecs;
+};
+
+struct RedWorkerMessageSetMouseMode {
+ enum { MESSAGE_NUM = RED_WORKER_MESSAGE_SET_MOUSE_MODE };
+ uint32_t mode;
+};
+
+struct RedWorkerMessageDestroySurfaceWait {
+ enum { MESSAGE_NUM = RED_WORKER_MESSAGE_DESTROY_SURFACE_WAIT };
+ uint32_t surface_id;
+};
+
+struct RedWorkerMessageDestroySurfaceWaitAsync {
+ enum { MESSAGE_NUM = RED_WORKER_MESSAGE_DESTROY_SURFACE_WAIT_ASYNC };
+ RedWorkerMessageAsync base;
+ uint32_t surface_id;
+};
+
+struct RedWorkerMessageResetMemslots {
+ enum { MESSAGE_NUM = RED_WORKER_MESSAGE_RESET_MEMSLOTS };
+};
+
+struct RedWorkerMessageMonitorsConfigAsync {
+ enum { MESSAGE_NUM = RED_WORKER_MESSAGE_MONITORS_CONFIG_ASYNC };
+ RedWorkerMessageAsync base;
+ QXLPHYSICAL monitors_config;
+ int group_id;
+ unsigned int max_monitors;
+};
+
+struct RedWorkerMessageDriverUnload {
+ enum { MESSAGE_NUM = RED_WORKER_MESSAGE_DRIVER_UNLOAD };
+ uint8_t dummy_empty_field[0]; // C/C++ compatibility
+};
+
+struct RedWorkerMessageGlScanout {
+ enum { MESSAGE_NUM = RED_WORKER_MESSAGE_GL_SCANOUT };
+ uint8_t dummy_empty_field[0]; // C/C++ compatibility
+};
+
+struct RedWorkerMessageClose {
+ enum { MESSAGE_NUM = RED_WORKER_MESSAGE_CLOSE_WORKER };
+ uint8_t dummy_empty_field[0]; // C/C++ compatibility
+};
+
+struct RedWorkerMessageGlDraw {
+ enum { MESSAGE_NUM = RED_WORKER_MESSAGE_GL_DRAW_ASYNC };
+ SpiceMsgDisplayGlDraw draw;
+};
+
+enum {
+ RED_DISPATCHER_PENDING_WAKEUP,
+ RED_DISPATCHER_PENDING_OOM,
+};
+
+void red_qxl_clear_pending(QXLState *qxl_state, int pending);
+
+#include "pop-visibility.h"
+
+#endif /* RED_WORKER_H_ */
diff --git a/server/red_channel.c b/server/red_channel.c
deleted file mode 100644
index 59043813..00000000
--- a/server/red_channel.c
+++ /dev/null
@@ -1,2435 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-
-
- Author:
- yhalperi@redhat.com
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include <stdint.h>
-#include <netinet/in.h>
-#include <netinet/tcp.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-#include <sys/ioctl.h>
-#ifdef HAVE_LINUX_SOCKIOS_H
-#include <linux/sockios.h> /* SIOCOUTQ */
-#endif
-
-#include "common/generated_server_marshallers.h"
-#include "common/ring.h"
-
-#include "stat.h"
-#include "red_channel.h"
-#include "reds.h"
-#include "reds_stream.h"
-#include "main_dispatcher.h"
-#include "red_time.h"
-
-typedef struct EmptyMsgPipeItem {
- PipeItem base;
- int msg;
-} EmptyMsgPipeItem;
-
-#define PING_TEST_TIMEOUT_MS 15000
-#define PING_TEST_IDLE_NET_TIMEOUT_MS 100
-
-#define CHANNEL_BLOCKED_SLEEP_DURATION 10000 //micro
-
-enum QosPingState {
- PING_STATE_NONE,
- PING_STATE_TIMER,
- PING_STATE_WARMUP,
- PING_STATE_LATENCY,
-};
-
-enum ConnectivityState {
- CONNECTIVITY_STATE_CONNECTED,
- CONNECTIVITY_STATE_BLOCKED,
- CONNECTIVITY_STATE_WAIT_PONG,
- CONNECTIVITY_STATE_DISCONNECTED,
-};
-
-static void red_channel_client_start_ping_timer(RedChannelClient *rcc, uint32_t timeout);
-static void red_channel_client_cancel_ping_timer(RedChannelClient *rcc);
-static void red_channel_client_restart_ping_timer(RedChannelClient *rcc);
-
-static void red_channel_client_event(int fd, int event, void *data);
-static void red_client_add_channel(RedClient *client, RedChannelClient *rcc);
-static void red_client_remove_channel(RedChannelClient *rcc);
-static RedChannelClient *red_client_get_channel(RedClient *client, int type, int id);
-static void red_channel_client_restore_main_sender(RedChannelClient *rcc);
-static inline int red_channel_client_waiting_for_ack(RedChannelClient *rcc);
-
-/*
- * Lifetime of RedChannel, RedChannelClient and RedClient:
- * RedChannel is created and destroyed by the calls to
- * red_channel_create.* and red_channel_destroy. The RedChannel resources
- * are deallocated only after red_channel_destroy is called and no RedChannelClient
- * refers to the channel.
- * RedChannelClient is created and destroyed by the calls to red_channel_client_create
- * and red_channel_client_destroy. RedChannelClient resources are deallocated only when
- * its refs == 0. The reference count of RedChannelClient can be increased by routines
- * that include calls that might destroy the red_channel_client. For example,
- * red_peer_handle_incoming calls the handle_message proc of the channel, which
- * might lead to destroying the client. However, after the call to handle_message,
- * there is a call to the channel's release_msg_buf proc.
- *
- * Once red_channel_client_destroy is called, the RedChannelClient is disconnected and
- * removed from the RedChannel clients list, but if rcc->refs != 0, it will still hold
- * a reference to the Channel. The reason for this is that on the one hand RedChannel holds
- * callbacks that may be still in use by RedChannel, and on the other hand,
- * when an operation is performed on the list of clients that belongs to the channel,
- * we don't want to execute it on the "to be destroyed" channel client.
- *
- * RedClient is created and destroyed by the calls to red_client_new and red_client_destroy.
- * When it is destroyed, it also disconnects and destroys all the RedChannelClients that
- * are associated with it. However, since part of these channel clients may still have
- * other references, they will not be completely released, until they are dereferenced.
- *
- * Note: red_channel_client_destroy is not thread safe, and still it is called from
- * red_client_destroy (from the client's thread). However, since before this call,
- * red_client_destroy calls rcc->channel->client_cbs.disconnect(rcc), which is synchronous,
- * we assume that if the channel is in another thread, it does no longer have references to
- * this channel client.
- * If a call to red_channel_client_destroy is made from another location, it must be called
- * from the channel's thread.
-*/
-static void red_channel_ref(RedChannel *channel);
-static void red_channel_unref(RedChannel *channel);
-static void red_channel_client_ref(RedChannelClient *rcc);
-static void red_channel_client_unref(RedChannelClient *rcc);
-
-static uint32_t full_header_get_msg_size(SpiceDataHeaderOpaque *header)
-{
- return ((SpiceDataHeader *)header->data)->size;
-}
-
-static uint32_t mini_header_get_msg_size(SpiceDataHeaderOpaque *header)
-{
- return ((SpiceMiniDataHeader *)header->data)->size;
-}
-
-static uint16_t full_header_get_msg_type(SpiceDataHeaderOpaque *header)
-{
- return ((SpiceDataHeader *)header->data)->type;
-}
-
-static uint16_t mini_header_get_msg_type(SpiceDataHeaderOpaque *header)
-{
- return ((SpiceMiniDataHeader *)header->data)->type;
-}
-
-static void full_header_set_msg_type(SpiceDataHeaderOpaque *header, uint16_t type)
-{
- ((SpiceDataHeader *)header->data)->type = type;
-}
-
-static void mini_header_set_msg_type(SpiceDataHeaderOpaque *header, uint16_t type)
-{
- ((SpiceMiniDataHeader *)header->data)->type = type;
-}
-
-static void full_header_set_msg_size(SpiceDataHeaderOpaque *header, uint32_t size)
-{
- ((SpiceDataHeader *)header->data)->size = size;
-}
-
-static void mini_header_set_msg_size(SpiceDataHeaderOpaque *header, uint32_t size)
-{
- ((SpiceMiniDataHeader *)header->data)->size = size;
-}
-
-static void full_header_set_msg_serial(SpiceDataHeaderOpaque *header, uint64_t serial)
-{
- ((SpiceDataHeader *)header->data)->serial = serial;
-}
-
-static void mini_header_set_msg_serial(SpiceDataHeaderOpaque *header, uint64_t serial)
-{
- spice_error("attempt to set header serial on mini header");
-}
-
-static void full_header_set_msg_sub_list(SpiceDataHeaderOpaque *header, uint32_t sub_list)
-{
- ((SpiceDataHeader *)header->data)->sub_list = sub_list;
-}
-
-static void mini_header_set_msg_sub_list(SpiceDataHeaderOpaque *header, uint32_t sub_list)
-{
- spice_error("attempt to set header sub list on mini header");
-}
-
-static SpiceDataHeaderOpaque full_header_wrapper = {NULL, sizeof(SpiceDataHeader),
- full_header_set_msg_type,
- full_header_set_msg_size,
- full_header_set_msg_serial,
- full_header_set_msg_sub_list,
- full_header_get_msg_type,
- full_header_get_msg_size};
-
-static SpiceDataHeaderOpaque mini_header_wrapper = {NULL, sizeof(SpiceMiniDataHeader),
- mini_header_set_msg_type,
- mini_header_set_msg_size,
- mini_header_set_msg_serial,
- mini_header_set_msg_sub_list,
- mini_header_get_msg_type,
- mini_header_get_msg_size};
-
-/* return the number of bytes read. -1 in case of error */
-static int red_peer_receive(RedsStream *stream, uint8_t *buf, uint32_t size)
-{
- uint8_t *pos = buf;
- while (size) {
- int now;
- if (stream->shutdown) {
- return -1;
- }
- now = reds_stream_read(stream, pos, size);
- if (now <= 0) {
- if (now == 0) {
- return -1;
- }
- spice_assert(now == -1);
- if (errno == EAGAIN) {
- break;
- } else if (errno == EINTR) {
- continue;
- } else if (errno == EPIPE) {
- return -1;
- } else {
- spice_printerr("%s", strerror(errno));
- return -1;
- }
- } else {
- size -= now;
- pos += now;
- }
- }
- return pos - buf;
-}
-
-// TODO: this implementation, as opposed to the old implementation in red_worker,
-// does many calls to red_peer_receive and through it cb_read, and thus avoids pointer
-// arithmetic for the case where a single cb_read could return multiple messages. But
-// this is suboptimal potentially. Profile and consider fixing.
-static void red_peer_handle_incoming(RedsStream *stream, IncomingHandler *handler)
-{
- int bytes_read;
- uint8_t *parsed;
- size_t parsed_size;
- message_destructor_t parsed_free;
- uint16_t msg_type;
- uint32_t msg_size;
-
- /* XXX: This needs further investigation as to the underlying cause, it happened
- * after spicec disconnect (but not with spice-gtk) repeatedly. */
- if (!stream) {
- return;
- }
-
- for (;;) {
- int ret_handle;
- if (handler->header_pos < handler->header.header_size) {
- bytes_read = red_peer_receive(stream,
- handler->header.data + handler->header_pos,
- handler->header.header_size - handler->header_pos);
- if (bytes_read == -1) {
- handler->cb->on_error(handler->opaque);
- return;
- }
- handler->cb->on_input(handler->opaque, bytes_read);
- handler->header_pos += bytes_read;
-
- if (handler->header_pos != handler->header.header_size) {
- return;
- }
- }
-
- msg_size = handler->header.get_msg_size(&handler->header);
- msg_type = handler->header.get_msg_type(&handler->header);
- if (handler->msg_pos < msg_size) {
- if (!handler->msg) {
- handler->msg = handler->cb->alloc_msg_buf(handler->opaque, msg_type, msg_size);
- if (handler->msg == NULL) {
- spice_printerr("ERROR: channel refused to allocate buffer.");
- handler->cb->on_error(handler->opaque);
- return;
- }
- }
-
- bytes_read = red_peer_receive(stream,
- handler->msg + handler->msg_pos,
- msg_size - handler->msg_pos);
- if (bytes_read == -1) {
- handler->cb->release_msg_buf(handler->opaque, msg_type, msg_size, handler->msg);
- handler->cb->on_error(handler->opaque);
- return;
- }
- handler->cb->on_input(handler->opaque, bytes_read);
- handler->msg_pos += bytes_read;
- if (handler->msg_pos != msg_size) {
- return;
- }
- }
-
- if (handler->cb->parser) {
- parsed = handler->cb->parser(handler->msg,
- handler->msg + msg_size, msg_type,
- SPICE_VERSION_MINOR, &parsed_size, &parsed_free);
- if (parsed == NULL) {
- spice_printerr("failed to parse message type %d", msg_type);
- handler->cb->release_msg_buf(handler->opaque, msg_type, msg_size, handler->msg);
- handler->cb->on_error(handler->opaque);
- return;
- }
- ret_handle = handler->cb->handle_parsed(handler->opaque, parsed_size,
- msg_type, parsed);
- parsed_free(parsed);
- } else {
- ret_handle = handler->cb->handle_message(handler->opaque, msg_type, msg_size,
- handler->msg);
- }
- handler->msg_pos = 0;
- handler->cb->release_msg_buf(handler->opaque, msg_type, msg_size, handler->msg);
- handler->msg = NULL;
- handler->header_pos = 0;
-
- if (!ret_handle) {
- handler->cb->on_error(handler->opaque);
- return;
- }
- }
-}
-
-void red_channel_client_receive(RedChannelClient *rcc)
-{
- red_channel_client_ref(rcc);
- red_peer_handle_incoming(rcc->stream, &rcc->incoming);
- red_channel_client_unref(rcc);
-}
-
-void red_channel_receive(RedChannel *channel)
-{
- RingItem *link;
- RingItem *next;
- RedChannelClient *rcc;
-
- RING_FOREACH_SAFE(link, next, &channel->clients) {
- rcc = SPICE_CONTAINEROF(link, RedChannelClient, channel_link);
- red_channel_client_receive(rcc);
- }
-}
-
-static void red_peer_handle_outgoing(RedsStream *stream, OutgoingHandler *handler)
-{
- ssize_t n;
-
- if (!stream) {
- return;
- }
-
- if (handler->size == 0) {
- handler->vec = handler->vec_buf;
- handler->size = handler->cb->get_msg_size(handler->opaque);
- if (!handler->size) { // nothing to be sent
- return;
- }
- }
-
- for (;;) {
- handler->cb->prepare(handler->opaque, handler->vec, &handler->vec_size, handler->pos);
- n = reds_stream_writev(stream, handler->vec, handler->vec_size);
- if (n == -1) {
- switch (errno) {
- case EAGAIN:
- handler->cb->on_block(handler->opaque);
- return;
- case EINTR:
- continue;
- case EPIPE:
- handler->cb->on_error(handler->opaque);
- return;
- default:
- spice_printerr("%s", strerror(errno));
- handler->cb->on_error(handler->opaque);
- return;
- }
- } else {
- handler->pos += n;
- handler->cb->on_output(handler->opaque, n);
- if (handler->pos == handler->size) { // finished writing data
- /* reset handler before calling on_msg_done, since it
- * can trigger another call to red_peer_handle_outgoing (when
- * switching from the urgent marshaller to the main one */
- handler->vec = handler->vec_buf;
- handler->pos = 0;
- handler->size = 0;
- handler->cb->on_msg_done(handler->opaque);
- return;
- }
- }
- }
-}
-
-static void red_channel_client_on_output(void *opaque, int n)
-{
- RedChannelClient *rcc = opaque;
-
- if (rcc->connectivity_monitor.timer) {
- rcc->connectivity_monitor.out_bytes += n;
- }
- stat_inc_counter(rcc->channel->out_bytes_counter, n);
-}
-
-static void red_channel_client_on_input(void *opaque, int n)
-{
- RedChannelClient *rcc = opaque;
-
- if (rcc->connectivity_monitor.timer) {
- rcc->connectivity_monitor.in_bytes += n;
- }
-}
-
-static void red_channel_client_default_peer_on_error(RedChannelClient *rcc)
-{
- red_channel_client_disconnect(rcc);
-}
-
-static int red_channel_client_peer_get_out_msg_size(void *opaque)
-{
- RedChannelClient *rcc = (RedChannelClient *)opaque;
-
- return rcc->send_data.size;
-}
-
-static void red_channel_client_peer_prepare_out_msg(
- void *opaque, struct iovec *vec, int *vec_size, int pos)
-{
- RedChannelClient *rcc = (RedChannelClient *)opaque;
-
- *vec_size = spice_marshaller_fill_iovec(rcc->send_data.marshaller,
- vec, IOV_MAX, pos);
-}
-
-static void red_channel_client_peer_on_out_block(void *opaque)
-{
- RedChannelClient *rcc = (RedChannelClient *)opaque;
-
- rcc->send_data.blocked = TRUE;
- rcc->channel->core->watch_update_mask(rcc->stream->watch,
- SPICE_WATCH_EVENT_READ |
- SPICE_WATCH_EVENT_WRITE);
-}
-
-static inline int red_channel_client_urgent_marshaller_is_active(RedChannelClient *rcc)
-{
- return (rcc->send_data.marshaller == rcc->send_data.urgent.marshaller);
-}
-
-static void red_channel_client_reset_send_data(RedChannelClient *rcc)
-{
- spice_marshaller_reset(rcc->send_data.marshaller);
- rcc->send_data.header.data = spice_marshaller_reserve_space(rcc->send_data.marshaller,
- rcc->send_data.header.header_size);
- spice_marshaller_set_base(rcc->send_data.marshaller, rcc->send_data.header.header_size);
- rcc->send_data.header.set_msg_type(&rcc->send_data.header, 0);
- rcc->send_data.header.set_msg_size(&rcc->send_data.header, 0);
-
- /* Keeping the serial consecutive: reseting it if reset_send_data
- * has been called before, but no message has been sent since then.
- */
- if (rcc->send_data.last_sent_serial != rcc->send_data.serial) {
- spice_assert(rcc->send_data.serial - rcc->send_data.last_sent_serial == 1);
- /* When the urgent marshaller is active, the serial was incremented by
- * the call to reset_send_data that was made for the main marshaller.
- * The urgent msg receives this serial, and the main msg serial is
- * the following one. Thus, (rcc->send_data.serial - rcc->send_data.last_sent_serial)
- * should be 1 in this case*/
- if (!red_channel_client_urgent_marshaller_is_active(rcc)) {
- rcc->send_data.serial = rcc->send_data.last_sent_serial;
- }
- }
- rcc->send_data.serial++;
-
- if (!rcc->is_mini_header) {
- spice_assert(rcc->send_data.marshaller != rcc->send_data.urgent.marshaller);
- rcc->send_data.header.set_msg_sub_list(&rcc->send_data.header, 0);
- rcc->send_data.header.set_msg_serial(&rcc->send_data.header, rcc->send_data.serial);
- }
-}
-
-void red_channel_client_push_set_ack(RedChannelClient *rcc)
-{
- red_channel_client_pipe_add_type(rcc, PIPE_ITEM_TYPE_SET_ACK);
-}
-
-void red_channel_push_set_ack(RedChannel *channel)
-{
- red_channel_pipes_add_type(channel, PIPE_ITEM_TYPE_SET_ACK);
-}
-
-static void red_channel_client_send_set_ack(RedChannelClient *rcc)
-{
- SpiceMsgSetAck ack;
-
- spice_assert(rcc);
- red_channel_client_init_send_data(rcc, SPICE_MSG_SET_ACK, NULL);
- ack.generation = ++rcc->ack_data.generation;
- ack.window = rcc->ack_data.client_window;
- rcc->ack_data.messages_window = 0;
-
- spice_marshall_msg_set_ack(rcc->send_data.marshaller, &ack);
-
- red_channel_client_begin_send_message(rcc);
-}
-
-static void red_channel_client_send_migrate(RedChannelClient *rcc)
-{
- SpiceMsgMigrate migrate;
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_MIGRATE, NULL);
- migrate.flags = rcc->channel->migration_flags;
- spice_marshall_msg_migrate(rcc->send_data.marshaller, &migrate);
- if (rcc->channel->migration_flags & SPICE_MIGRATE_NEED_FLUSH) {
- rcc->wait_migrate_flush_mark = TRUE;
- }
-
- red_channel_client_begin_send_message(rcc);
-}
-
-
-static void red_channel_client_send_empty_msg(RedChannelClient *rcc, PipeItem *base)
-{
- EmptyMsgPipeItem *msg_pipe_item = SPICE_CONTAINEROF(base, EmptyMsgPipeItem, base);
-
- red_channel_client_init_send_data(rcc, msg_pipe_item->msg, NULL);
- red_channel_client_begin_send_message(rcc);
-}
-
-static void red_channel_client_send_ping(RedChannelClient *rcc)
-{
- SpiceMsgPing ping;
- struct timespec ts;
-
- if (!rcc->latency_monitor.warmup_was_sent) { // latency test start
- int delay_val;
- socklen_t opt_size = sizeof(delay_val);
-
- rcc->latency_monitor.warmup_was_sent = TRUE;
- /*
- * When testing latency, TCP_NODELAY must be switched on, otherwise,
- * sending the ping message is delayed by Nagle algorithm, and the
- * roundtrip measurment is less accurate (bigger).
- */
- rcc->latency_monitor.tcp_nodelay = 1;
- if (getsockopt(rcc->stream->socket, IPPROTO_TCP, TCP_NODELAY, &delay_val,
- &opt_size) == -1) {
- spice_warning("getsockopt failed, %s", strerror(errno));
- } else {
- rcc->latency_monitor.tcp_nodelay = delay_val;
- if (!delay_val) {
- delay_val = 1;
- if (setsockopt(rcc->stream->socket, IPPROTO_TCP, TCP_NODELAY, &delay_val,
- sizeof(delay_val)) == -1) {
- if (errno != ENOTSUP) {
- spice_warning("setsockopt failed, %s", strerror(errno));
- }
- }
- }
- }
- }
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_PING, NULL);
- ping.id = rcc->latency_monitor.id;
- clock_gettime(CLOCK_MONOTONIC, &ts);
- ping.timestamp = ts.tv_sec * 1000000000LL + ts.tv_nsec;
- spice_marshall_msg_ping(rcc->send_data.marshaller, &ping);
- red_channel_client_begin_send_message(rcc);
-}
-
-static void red_channel_client_send_item(RedChannelClient *rcc, PipeItem *item)
-{
- int handled = TRUE;
-
- spice_assert(red_channel_client_no_item_being_sent(rcc));
- red_channel_client_reset_send_data(rcc);
- switch (item->type) {
- case PIPE_ITEM_TYPE_SET_ACK:
- red_channel_client_send_set_ack(rcc);
- free(item);
- break;
- case PIPE_ITEM_TYPE_MIGRATE:
- red_channel_client_send_migrate(rcc);
- free(item);
- break;
- case PIPE_ITEM_TYPE_EMPTY_MSG:
- red_channel_client_send_empty_msg(rcc, item);
- free(item);
- break;
- case PIPE_ITEM_TYPE_PING:
- red_channel_client_send_ping(rcc);
- free(item);
- break;
- default:
- handled = FALSE;
- }
- if (!handled) {
- rcc->channel->channel_cbs.send_item(rcc, item);
- }
-}
-
-static void red_channel_client_release_item(RedChannelClient *rcc, PipeItem *item, int item_pushed)
-{
- int handled = TRUE;
-
- switch (item->type) {
- case PIPE_ITEM_TYPE_SET_ACK:
- case PIPE_ITEM_TYPE_EMPTY_MSG:
- case PIPE_ITEM_TYPE_MIGRATE:
- case PIPE_ITEM_TYPE_PING:
- free(item);
- break;
- default:
- handled = FALSE;
- }
- if (!handled) {
- rcc->channel->channel_cbs.release_item(rcc, item, item_pushed);
- }
-}
-
-static inline void red_channel_client_release_sent_item(RedChannelClient *rcc)
-{
- if (rcc->send_data.item) {
- red_channel_client_release_item(rcc,
- rcc->send_data.item, TRUE);
- rcc->send_data.item = NULL;
- }
-}
-
-static void red_channel_peer_on_out_msg_done(void *opaque)
-{
- RedChannelClient *rcc = (RedChannelClient *)opaque;
-
- rcc->send_data.size = 0;
- red_channel_client_release_sent_item(rcc);
- if (rcc->send_data.blocked) {
- rcc->send_data.blocked = FALSE;
- rcc->channel->core->watch_update_mask(rcc->stream->watch,
- SPICE_WATCH_EVENT_READ);
- }
-
- if (red_channel_client_urgent_marshaller_is_active(rcc)) {
- red_channel_client_restore_main_sender(rcc);
- spice_assert(rcc->send_data.header.data != NULL);
- red_channel_client_begin_send_message(rcc);
- } else {
- if (rcc->latency_monitor.timer && !rcc->send_data.blocked && rcc->pipe_size == 0) {
- /* It is possible that the socket will become idle, so we may be able to test latency */
- red_channel_client_restart_ping_timer(rcc);
- }
- }
-
-}
-
-static void red_channel_client_pipe_remove(RedChannelClient *rcc, PipeItem *item)
-{
- rcc->pipe_size--;
- ring_remove(&item->link);
-}
-
-static void red_channel_add_client(RedChannel *channel, RedChannelClient *rcc)
-{
- spice_assert(rcc);
- ring_add(&channel->clients, &rcc->channel_link);
- channel->clients_num++;
-}
-
-static void red_channel_client_set_remote_caps(RedChannelClient* rcc,
- int num_common_caps, uint32_t *common_caps,
- int num_caps, uint32_t *caps)
-{
- rcc->remote_caps.num_common_caps = num_common_caps;
- rcc->remote_caps.common_caps = spice_memdup(common_caps, num_common_caps * sizeof(uint32_t));
-
- rcc->remote_caps.num_caps = num_caps;
- rcc->remote_caps.caps = spice_memdup(caps, num_caps * sizeof(uint32_t));
-}
-
-static void red_channel_client_destroy_remote_caps(RedChannelClient* rcc)
-{
- rcc->remote_caps.num_common_caps = 0;
- free(rcc->remote_caps.common_caps);
- rcc->remote_caps.num_caps = 0;
- free(rcc->remote_caps.caps);
-}
-
-int red_channel_client_test_remote_common_cap(RedChannelClient *rcc, uint32_t cap)
-{
- return test_capability(rcc->remote_caps.common_caps,
- rcc->remote_caps.num_common_caps,
- cap);
-}
-
-int red_channel_client_test_remote_cap(RedChannelClient *rcc, uint32_t cap)
-{
- return test_capability(rcc->remote_caps.caps,
- rcc->remote_caps.num_caps,
- cap);
-}
-
-int red_channel_test_remote_common_cap(RedChannel *channel, uint32_t cap)
-{
- RingItem *link;
-
- RING_FOREACH(link, &channel->clients) {
- RedChannelClient *rcc = SPICE_CONTAINEROF(link, RedChannelClient, channel_link);
-
- if (!red_channel_client_test_remote_common_cap(rcc, cap)) {
- return FALSE;
- }
- }
- return TRUE;
-}
-
-int red_channel_test_remote_cap(RedChannel *channel, uint32_t cap)
-{
- RingItem *link;
-
- RING_FOREACH(link, &channel->clients) {
- RedChannelClient *rcc = SPICE_CONTAINEROF(link, RedChannelClient, channel_link);
-
- if (!red_channel_client_test_remote_cap(rcc, cap)) {
- return FALSE;
- }
- }
- return TRUE;
-}
-
-static int red_channel_client_pre_create_validate(RedChannel *channel, RedClient *client)
-{
- if (red_client_get_channel(client, channel->type, channel->id)) {
- spice_printerr("Error client %p: duplicate channel type %d id %d",
- client, channel->type, channel->id);
- return FALSE;
- }
- return TRUE;
-}
-
-static void red_channel_client_push_ping(RedChannelClient *rcc)
-{
- spice_assert(rcc->latency_monitor.state == PING_STATE_NONE);
- rcc->latency_monitor.state = PING_STATE_WARMUP;
- rcc->latency_monitor.warmup_was_sent = FALSE;
- rcc->latency_monitor.id = rand();
- red_channel_client_pipe_add_type(rcc, PIPE_ITEM_TYPE_PING);
- red_channel_client_pipe_add_type(rcc, PIPE_ITEM_TYPE_PING);
-}
-
-static void red_channel_client_ping_timer(void *opaque)
-{
- RedChannelClient *rcc = opaque;
-
- spice_assert(rcc->latency_monitor.state == PING_STATE_TIMER);
- red_channel_client_cancel_ping_timer(rcc);
-
-#ifdef HAVE_LINUX_SOCKIOS_H /* SIOCOUTQ is a Linux only ioctl on sockets. */
- {
- int so_unsent_size = 0;
-
- /* retrieving the occupied size of the socket's tcp snd buffer (unacked + unsent) */
- if (ioctl(rcc->stream->socket, SIOCOUTQ, &so_unsent_size) == -1) {
- spice_printerr("ioctl(SIOCOUTQ) failed, %s", strerror(errno));
- }
- if (so_unsent_size > 0) {
- /* tcp snd buffer is still occupied. rescheduling ping */
- red_channel_client_start_ping_timer(rcc, PING_TEST_IDLE_NET_TIMEOUT_MS);
- } else {
- red_channel_client_push_ping(rcc);
- }
- }
-#else /* ifdef HAVE_LINUX_SOCKIOS_H */
- /* More portable alternative code path (less accurate but avoids bogus ioctls)*/
- red_channel_client_push_ping(rcc);
-#endif /* ifdef HAVE_LINUX_SOCKIOS_H */
-}
-
-/*
- * When a connection is not alive (and we can't detect it via a socket error), we
- * reach one of these 2 states:
- * (1) Sending msgs is blocked: either writes return EAGAIN
- * or we are missing MSGC_ACK from the client.
- * (2) MSG_PING was sent without receiving a MSGC_PONG in reply.
- *
- * The connectivity_timer callback tests if the channel's state matches one of the above.
- * In case it does, on the next time the timer is called, it checks if the connection has
- * been idle during the time that passed since the previous timer call. If the connection
- * has been idle, we consider the client as disconnected.
- */
-static void red_channel_client_connectivity_timer(void *opaque)
-{
- RedChannelClient *rcc = opaque;
- RedChannelClientConnectivityMonitor *monitor = &rcc->connectivity_monitor;
- int is_alive = TRUE;
-
- if (monitor->state == CONNECTIVITY_STATE_BLOCKED) {
- if (monitor->in_bytes == 0 && monitor->out_bytes == 0) {
- if (!rcc->send_data.blocked && !red_channel_client_waiting_for_ack(rcc)) {
- spice_error("mismatch between rcc-state and connectivity-state");
- }
- spice_debug("rcc is blocked; connection is idle");
- is_alive = FALSE;
- }
- } else if (monitor->state == CONNECTIVITY_STATE_WAIT_PONG) {
- if (monitor->in_bytes == 0) {
- if (rcc->latency_monitor.state != PING_STATE_WARMUP &&
- rcc->latency_monitor.state != PING_STATE_LATENCY) {
- spice_error("mismatch between rcc-state and connectivity-state");
- }
- spice_debug("rcc waits for pong; connection is idle");
- is_alive = FALSE;
- }
- }
-
- if (is_alive) {
- monitor->in_bytes = 0;
- monitor->out_bytes = 0;
- if (rcc->send_data.blocked || red_channel_client_waiting_for_ack(rcc)) {
- monitor->state = CONNECTIVITY_STATE_BLOCKED;
- } else if (rcc->latency_monitor.state == PING_STATE_WARMUP ||
- rcc->latency_monitor.state == PING_STATE_LATENCY) {
- monitor->state = CONNECTIVITY_STATE_WAIT_PONG;
- } else {
- monitor->state = CONNECTIVITY_STATE_CONNECTED;
- }
- rcc->channel->core->timer_start(rcc->connectivity_monitor.timer,
- rcc->connectivity_monitor.timeout);
- } else {
- monitor->state = CONNECTIVITY_STATE_DISCONNECTED;
- spice_warning("rcc %p on channel %d:%d has been unresponsive for more than %u ms, disconnecting",
- rcc, rcc->channel->type, rcc->channel->id, monitor->timeout);
- red_channel_client_disconnect(rcc);
- }
-}
-
-void red_channel_client_start_connectivity_monitoring(RedChannelClient *rcc, uint32_t timeout_ms)
-{
- if (!red_channel_client_is_connected(rcc)) {
- return;
- }
- spice_debug(NULL);
- spice_assert(timeout_ms > 0);
- /*
- * If latency_monitor is not active, we activate it in order to enable
- * periodic ping messages so that we will be be able to identify a disconnected
- * channel-client even if there are no ongoing channel specific messages
- * on this channel.
- */
- if (rcc->latency_monitor.timer == NULL) {
- rcc->latency_monitor.timer = rcc->channel->core->timer_add(
- red_channel_client_ping_timer, rcc);
- if (!rcc->client->during_target_migrate) {
- red_channel_client_start_ping_timer(rcc, PING_TEST_IDLE_NET_TIMEOUT_MS);
- }
- rcc->latency_monitor.roundtrip = -1;
- }
- if (rcc->connectivity_monitor.timer == NULL) {
- rcc->connectivity_monitor.state = CONNECTIVITY_STATE_CONNECTED;
- rcc->connectivity_monitor.timer = rcc->channel->core->timer_add(
- red_channel_client_connectivity_timer, rcc);
- rcc->connectivity_monitor.timeout = timeout_ms;
- if (!rcc->client->during_target_migrate) {
- rcc->channel->core->timer_start(rcc->connectivity_monitor.timer,
- rcc->connectivity_monitor.timeout);
- }
- }
-}
-
-RedChannelClient *red_channel_client_create(int size, RedChannel *channel, RedClient *client,
- RedsStream *stream,
- int monitor_latency,
- int num_common_caps, uint32_t *common_caps,
- int num_caps, uint32_t *caps)
-{
- RedChannelClient *rcc = NULL;
-
- pthread_mutex_lock(&client->lock);
- if (!red_channel_client_pre_create_validate(channel, client)) {
- goto error;
- }
- spice_assert(stream && channel && size >= sizeof(RedChannelClient));
- rcc = spice_malloc0(size);
- rcc->stream = stream;
- rcc->channel = channel;
- rcc->client = client;
- rcc->refs = 1;
- rcc->ack_data.messages_window = ~0; // blocks send message (maybe use send_data.blocked +
- // block flags)
- rcc->ack_data.client_generation = ~0;
- rcc->ack_data.client_window = CLIENT_ACK_WINDOW;
- rcc->send_data.main.marshaller = spice_marshaller_new();
- rcc->send_data.urgent.marshaller = spice_marshaller_new();
-
- rcc->send_data.marshaller = rcc->send_data.main.marshaller;
-
- rcc->incoming.opaque = rcc;
- rcc->incoming.cb = &channel->incoming_cb;
-
- rcc->outgoing.opaque = rcc;
- rcc->outgoing.cb = &channel->outgoing_cb;
- rcc->outgoing.pos = 0;
- rcc->outgoing.size = 0;
-
- red_channel_client_set_remote_caps(rcc, num_common_caps, common_caps, num_caps, caps);
- if (red_channel_client_test_remote_common_cap(rcc, SPICE_COMMON_CAP_MINI_HEADER)) {
- rcc->incoming.header = mini_header_wrapper;
- rcc->send_data.header = mini_header_wrapper;
- rcc->is_mini_header = TRUE;
- } else {
- rcc->incoming.header = full_header_wrapper;
- rcc->send_data.header = full_header_wrapper;
- rcc->is_mini_header = FALSE;
- }
-
- rcc->incoming.header.data = rcc->incoming.header_buf;
- rcc->incoming.serial = 1;
-
- if (!channel->channel_cbs.config_socket(rcc)) {
- goto error;
- }
-
- ring_init(&rcc->pipe);
- rcc->pipe_size = 0;
-
- stream->watch = channel->core->watch_add(stream->socket,
- SPICE_WATCH_EVENT_READ,
- red_channel_client_event, rcc);
- rcc->id = channel->clients_num;
- red_channel_add_client(channel, rcc);
- red_client_add_channel(client, rcc);
- red_channel_ref(channel);
- pthread_mutex_unlock(&client->lock);
-
- if (monitor_latency) {
- rcc->latency_monitor.timer = channel->core->timer_add(
- red_channel_client_ping_timer, rcc);
- if (!client->during_target_migrate) {
- red_channel_client_start_ping_timer(rcc, PING_TEST_IDLE_NET_TIMEOUT_MS);
- }
- rcc->latency_monitor.roundtrip = -1;
- }
-
- return rcc;
-error:
- free(rcc);
- reds_stream_free(stream);
- pthread_mutex_unlock(&client->lock);
- return NULL;
-}
-
-static void red_channel_client_seamless_migration_done(RedChannelClient *rcc)
-{
- rcc->wait_migrate_data = FALSE;
-
- pthread_mutex_lock(&rcc->client->lock);
- rcc->client->num_migrated_channels--;
-
- /* we assume we always have at least one channel who has migration data transfer,
- * otherwise, this flag will never be set back to FALSE*/
- if (!rcc->client->num_migrated_channels) {
- rcc->client->during_target_migrate = FALSE;
- rcc->client->seamless_migrate = FALSE;
- /* migration completion might have been triggered from a different thread
- * than the main thread */
- main_dispatcher_seamless_migrate_dst_complete(rcc->client);
- if (rcc->latency_monitor.timer) {
- red_channel_client_start_ping_timer(rcc, PING_TEST_IDLE_NET_TIMEOUT_MS);
- }
- if (rcc->connectivity_monitor.timer) {
- rcc->channel->core->timer_start(rcc->connectivity_monitor.timer,
- rcc->connectivity_monitor.timeout);
- }
- }
- pthread_mutex_unlock(&rcc->client->lock);
-}
-
-int red_channel_client_waits_for_migrate_data(RedChannelClient *rcc)
-{
- return rcc->wait_migrate_data;
-}
-
-int red_channel_waits_for_migrate_data(RedChannel *channel)
-{
- RedChannelClient *rcc;
-
- if (!red_channel_is_connected(channel)) {
- return FALSE;
- }
-
- if (channel->clients_num > 1) {
- return FALSE;
- }
- spice_assert(channel->clients_num == 1);
- rcc = SPICE_CONTAINEROF(ring_get_head(&channel->clients), RedChannelClient, channel_link);
- return red_channel_client_waits_for_migrate_data(rcc);
-}
-
-static void red_channel_client_default_connect(RedChannel *channel, RedClient *client,
- RedsStream *stream,
- int migration,
- int num_common_caps, uint32_t *common_caps,
- int num_caps, uint32_t *caps)
-{
- spice_error("not implemented");
-}
-
-static void red_channel_client_default_disconnect(RedChannelClient *base)
-{
- red_channel_client_disconnect(base);
-}
-
-void red_channel_client_default_migrate(RedChannelClient *rcc)
-{
- if (rcc->latency_monitor.timer) {
- red_channel_client_cancel_ping_timer(rcc);
- rcc->channel->core->timer_remove(rcc->latency_monitor.timer);
- rcc->latency_monitor.timer = NULL;
- }
- if (rcc->connectivity_monitor.timer) {
- rcc->channel->core->timer_remove(rcc->connectivity_monitor.timer);
- rcc->connectivity_monitor.timer = NULL;
- }
- red_channel_client_pipe_add_type(rcc, PIPE_ITEM_TYPE_MIGRATE);
-}
-
-RedChannel *red_channel_create(int size,
- SpiceCoreInterface *core,
- uint32_t type, uint32_t id,
- int handle_acks,
- channel_handle_message_proc handle_message,
- ChannelCbs *channel_cbs,
- uint32_t migration_flags)
-{
- RedChannel *channel;
- ClientCbs client_cbs = { NULL, };
-
- spice_assert(size >= sizeof(*channel));
- spice_assert(channel_cbs->config_socket && channel_cbs->on_disconnect && handle_message &&
- channel_cbs->alloc_recv_buf && channel_cbs->release_item);
- spice_assert(channel_cbs->handle_migrate_data ||
- !(migration_flags & SPICE_MIGRATE_NEED_DATA_TRANSFER));
- channel = spice_malloc0(size);
- channel->type = type;
- channel->id = id;
- channel->refs = 1;
- channel->handle_acks = handle_acks;
- channel->migration_flags = migration_flags;
- memcpy(&channel->channel_cbs, channel_cbs, sizeof(ChannelCbs));
-
- channel->core = core;
- ring_init(&channel->clients);
-
- // TODO: send incoming_cb as parameters instead of duplicating?
- channel->incoming_cb.alloc_msg_buf = (alloc_msg_recv_buf_proc)channel_cbs->alloc_recv_buf;
- channel->incoming_cb.release_msg_buf = (release_msg_recv_buf_proc)channel_cbs->release_recv_buf;
- channel->incoming_cb.handle_message = (handle_message_proc)handle_message;
- channel->incoming_cb.on_error =
- (on_incoming_error_proc)red_channel_client_default_peer_on_error;
- channel->incoming_cb.on_input = red_channel_client_on_input;
- channel->outgoing_cb.get_msg_size = red_channel_client_peer_get_out_msg_size;
- channel->outgoing_cb.prepare = red_channel_client_peer_prepare_out_msg;
- channel->outgoing_cb.on_block = red_channel_client_peer_on_out_block;
- channel->outgoing_cb.on_error =
- (on_outgoing_error_proc)red_channel_client_default_peer_on_error;
- channel->outgoing_cb.on_msg_done = red_channel_peer_on_out_msg_done;
- channel->outgoing_cb.on_output = red_channel_client_on_output;
-
- client_cbs.connect = red_channel_client_default_connect;
- client_cbs.disconnect = red_channel_client_default_disconnect;
- client_cbs.migrate = red_channel_client_default_migrate;
-
- red_channel_register_client_cbs(channel, &client_cbs);
- red_channel_set_common_cap(channel, SPICE_COMMON_CAP_MINI_HEADER);
-
- channel->thread_id = pthread_self();
-
- channel->out_bytes_counter = 0;
-
- spice_debug("channel type %d id %d thread_id 0x%lx",
- channel->type, channel->id, channel->thread_id);
- return channel;
-}
-
-// TODO: red_worker can use this one
-static void dummy_watch_update_mask(SpiceWatch *watch, int event_mask)
-{
-}
-
-static SpiceWatch *dummy_watch_add(int fd, int event_mask, SpiceWatchFunc func, void *opaque)
-{
- return NULL; // apparently allowed?
-}
-
-static void dummy_watch_remove(SpiceWatch *watch)
-{
-}
-
-// TODO: actually, since I also use channel_client_dummym, no need for core. Can be NULL
-SpiceCoreInterface dummy_core = {
- .watch_update_mask = dummy_watch_update_mask,
- .watch_add = dummy_watch_add,
- .watch_remove = dummy_watch_remove,
-};
-
-RedChannel *red_channel_create_dummy(int size, uint32_t type, uint32_t id)
-{
- RedChannel *channel;
- ClientCbs client_cbs = { NULL, };
-
- spice_assert(size >= sizeof(*channel));
- channel = spice_malloc0(size);
- channel->type = type;
- channel->id = id;
- channel->refs = 1;
- channel->core = &dummy_core;
- ring_init(&channel->clients);
- client_cbs.connect = red_channel_client_default_connect;
- client_cbs.disconnect = red_channel_client_default_disconnect;
- client_cbs.migrate = red_channel_client_default_migrate;
-
- red_channel_register_client_cbs(channel, &client_cbs);
- red_channel_set_common_cap(channel, SPICE_COMMON_CAP_MINI_HEADER);
-
- channel->thread_id = pthread_self();
- spice_debug("channel type %d id %d thread_id 0x%lx",
- channel->type, channel->id, channel->thread_id);
-
- channel->out_bytes_counter = 0;
-
- return channel;
-}
-
-static int do_nothing_handle_message(RedChannelClient *rcc,
- uint16_t type,
- uint32_t size,
- uint8_t *msg)
-{
- return TRUE;
-}
-
-RedChannel *red_channel_create_parser(int size,
- SpiceCoreInterface *core,
- uint32_t type, uint32_t id,
- int handle_acks,
- spice_parse_channel_func_t parser,
- channel_handle_parsed_proc handle_parsed,
- ChannelCbs *channel_cbs,
- uint32_t migration_flags)
-{
- RedChannel *channel = red_channel_create(size, core, type, id,
- handle_acks,
- do_nothing_handle_message,
- channel_cbs,
- migration_flags);
-
- if (channel == NULL) {
- return NULL;
- }
- channel->incoming_cb.handle_parsed = (handle_parsed_proc)handle_parsed;
- channel->incoming_cb.parser = parser;
- return channel;
-}
-
-void red_channel_register_client_cbs(RedChannel *channel, ClientCbs *client_cbs)
-{
- spice_assert(client_cbs->connect || channel->type == SPICE_CHANNEL_MAIN);
- channel->client_cbs.connect = client_cbs->connect;
-
- if (client_cbs->disconnect) {
- channel->client_cbs.disconnect = client_cbs->disconnect;
- }
-
- if (client_cbs->migrate) {
- channel->client_cbs.migrate = client_cbs->migrate;
- }
-}
-
-int test_capability(uint32_t *caps, int num_caps, uint32_t cap)
-{
- uint32_t index = cap / 32;
- if (num_caps < index + 1) {
- return FALSE;
- }
-
- return (caps[index] & (1 << (cap % 32))) != 0;
-}
-
-static void add_capability(uint32_t **caps, int *num_caps, uint32_t cap)
-{
- int nbefore, n;
-
- nbefore = *num_caps;
- n = cap / 32;
- *num_caps = MAX(*num_caps, n + 1);
- *caps = spice_renew(uint32_t, *caps, *num_caps);
- memset(*caps + nbefore, 0, (*num_caps - nbefore) * sizeof(uint32_t));
- (*caps)[n] |= (1 << (cap % 32));
-}
-
-void red_channel_set_common_cap(RedChannel *channel, uint32_t cap)
-{
- add_capability(&channel->local_caps.common_caps, &channel->local_caps.num_common_caps, cap);
-}
-
-void red_channel_set_cap(RedChannel *channel, uint32_t cap)
-{
- add_capability(&channel->local_caps.caps, &channel->local_caps.num_caps, cap);
-}
-
-void red_channel_set_data(RedChannel *channel, void *data)
-{
- spice_assert(channel);
- channel->data = data;
-}
-
-static void red_channel_ref(RedChannel *channel)
-{
- channel->refs++;
-}
-
-static void red_channel_unref(RedChannel *channel)
-{
- if (!--channel->refs) {
- if (channel->local_caps.num_common_caps) {
- free(channel->local_caps.common_caps);
- }
-
- if (channel->local_caps.num_caps) {
- free(channel->local_caps.caps);
- }
-
- free(channel);
- }
-}
-
-static void red_channel_client_ref(RedChannelClient *rcc)
-{
- rcc->refs++;
-}
-
-static void red_channel_client_unref(RedChannelClient *rcc)
-{
- if (!--rcc->refs) {
- spice_debug("destroy rcc=%p", rcc);
- if (rcc->send_data.main.marshaller) {
- spice_marshaller_destroy(rcc->send_data.main.marshaller);
- }
-
- if (rcc->send_data.urgent.marshaller) {
- spice_marshaller_destroy(rcc->send_data.urgent.marshaller);
- }
-
- red_channel_client_destroy_remote_caps(rcc);
- if (rcc->channel) {
- red_channel_unref(rcc->channel);
- }
- free(rcc);
- }
-}
-
-void red_channel_client_destroy(RedChannelClient *rcc)
-{
- rcc->destroying = 1;
- red_channel_client_disconnect(rcc);
- red_client_remove_channel(rcc);
- red_channel_client_unref(rcc);
-}
-
-void red_channel_destroy(RedChannel *channel)
-{
- RingItem *link;
- RingItem *next;
-
- if (!channel) {
- return;
- }
- RING_FOREACH_SAFE(link, next, &channel->clients) {
- red_channel_client_destroy(
- SPICE_CONTAINEROF(link, RedChannelClient, channel_link));
- }
-
- red_channel_unref(channel);
-}
-
-void red_channel_client_shutdown(RedChannelClient *rcc)
-{
- if (rcc->stream && !rcc->stream->shutdown) {
- rcc->channel->core->watch_remove(rcc->stream->watch);
- rcc->stream->watch = NULL;
- shutdown(rcc->stream->socket, SHUT_RDWR);
- rcc->stream->shutdown = TRUE;
- }
-}
-
-void red_channel_client_send(RedChannelClient *rcc)
-{
- red_channel_client_ref(rcc);
- red_peer_handle_outgoing(rcc->stream, &rcc->outgoing);
- red_channel_client_unref(rcc);
-}
-
-void red_channel_send(RedChannel *channel)
-{
- RingItem *link;
- RingItem *next;
-
- RING_FOREACH_SAFE(link, next, &channel->clients) {
- red_channel_client_send(SPICE_CONTAINEROF(link, RedChannelClient, channel_link));
- }
-}
-
-static inline int red_channel_client_waiting_for_ack(RedChannelClient *rcc)
-{
- return (rcc->channel->handle_acks &&
- (rcc->ack_data.messages_window > rcc->ack_data.client_window * 2));
-}
-
-static inline PipeItem *red_channel_client_pipe_item_get(RedChannelClient *rcc)
-{
- PipeItem *item;
-
- if (!rcc || rcc->send_data.blocked
- || red_channel_client_waiting_for_ack(rcc)
- || !(item = (PipeItem *)ring_get_tail(&rcc->pipe))) {
- return NULL;
- }
- red_channel_client_pipe_remove(rcc, item);
- return item;
-}
-
-void red_channel_client_push(RedChannelClient *rcc)
-{
- PipeItem *pipe_item;
-
- if (!rcc->during_send) {
- rcc->during_send = TRUE;
- } else {
- return;
- }
- red_channel_client_ref(rcc);
- if (rcc->send_data.blocked) {
- red_channel_client_send(rcc);
- }
-
- if (!red_channel_client_no_item_being_sent(rcc) && !rcc->send_data.blocked) {
- rcc->send_data.blocked = TRUE;
- spice_printerr("ERROR: an item waiting to be sent and not blocked");
- }
-
- while ((pipe_item = red_channel_client_pipe_item_get(rcc))) {
- red_channel_client_send_item(rcc, pipe_item);
- }
- rcc->during_send = FALSE;
- red_channel_client_unref(rcc);
-}
-
-void red_channel_push(RedChannel *channel)
-{
- RingItem *link;
- RingItem *next;
- RedChannelClient *rcc;
-
- if (!channel) {
- return;
- }
- RING_FOREACH_SAFE(link, next, &channel->clients) {
- rcc = SPICE_CONTAINEROF(link, RedChannelClient, channel_link);
- red_channel_client_push(rcc);
- }
-}
-
-int red_channel_client_get_roundtrip_ms(RedChannelClient *rcc)
-{
- if (rcc->latency_monitor.roundtrip < 0) {
- return rcc->latency_monitor.roundtrip;
- }
- return rcc->latency_monitor.roundtrip / 1000 / 1000;
-}
-
-static void red_channel_client_init_outgoing_messages_window(RedChannelClient *rcc)
-{
- rcc->ack_data.messages_window = 0;
- red_channel_client_push(rcc);
-}
-
-// TODO: this function doesn't make sense because the window should be client (WAN/LAN)
-// specific
-void red_channel_init_outgoing_messages_window(RedChannel *channel)
-{
- RingItem *link;
- RingItem *next;
-
- RING_FOREACH_SAFE(link, next, &channel->clients) {
- red_channel_client_init_outgoing_messages_window(
- SPICE_CONTAINEROF(link, RedChannelClient, channel_link));
- }
-}
-
-static void red_channel_handle_migrate_flush_mark(RedChannelClient *rcc)
-{
- if (rcc->channel->channel_cbs.handle_migrate_flush_mark) {
- rcc->channel->channel_cbs.handle_migrate_flush_mark(rcc);
- }
-}
-
-// TODO: the whole migration is broken with multiple clients. What do we want to do?
-// basically just
-// 1) source send mark to all
-// 2) source gets at various times the data (waits for all)
-// 3) source migrates to target
-// 4) target sends data to all
-// So need to make all the handlers work with per channel/client data (what data exactly?)
-static void red_channel_handle_migrate_data(RedChannelClient *rcc, uint32_t size, void *message)
-{
- spice_debug("channel type %d id %d rcc %p size %u",
- rcc->channel->type, rcc->channel->id, rcc, size);
- if (!rcc->channel->channel_cbs.handle_migrate_data) {
- return;
- }
- if (!red_channel_client_waits_for_migrate_data(rcc)) {
- spice_channel_client_error(rcc, "unexpected");
- return;
- }
- if (rcc->channel->channel_cbs.handle_migrate_data_get_serial) {
- red_channel_client_set_message_serial(rcc,
- rcc->channel->channel_cbs.handle_migrate_data_get_serial(rcc, size, message));
- }
- if (!rcc->channel->channel_cbs.handle_migrate_data(rcc, size, message)) {
- spice_channel_client_error(rcc, "handle_migrate_data failed");
- return;
- }
- red_channel_client_seamless_migration_done(rcc);
-}
-
-static void red_channel_client_restart_ping_timer(RedChannelClient *rcc)
-{
- struct timespec ts;
- uint64_t passed, timeout;
-
- clock_gettime(CLOCK_MONOTONIC, &ts);
-
- passed = ts.tv_sec * 1000000000LL + ts.tv_nsec;
- passed = passed - rcc->latency_monitor.last_pong_time;
- passed /= 1000*1000;
- timeout = PING_TEST_IDLE_NET_TIMEOUT_MS;
- if (passed < PING_TEST_TIMEOUT_MS) {
- timeout += PING_TEST_TIMEOUT_MS - passed;
- }
-
- red_channel_client_start_ping_timer(rcc, timeout);
-}
-
-static void red_channel_client_start_ping_timer(RedChannelClient *rcc, uint32_t timeout)
-{
- if (!rcc->latency_monitor.timer) {
- return;
- }
- if (rcc->latency_monitor.state != PING_STATE_NONE) {
- return;
- }
- rcc->latency_monitor.state = PING_STATE_TIMER;
- rcc->channel->core->timer_start(rcc->latency_monitor.timer, timeout);
-}
-
-static void red_channel_client_cancel_ping_timer(RedChannelClient *rcc)
-{
- if (!rcc->latency_monitor.timer) {
- return;
- }
- if (rcc->latency_monitor.state != PING_STATE_TIMER) {
- return;
- }
-
- rcc->channel->core->timer_cancel(rcc->latency_monitor.timer);
- rcc->latency_monitor.state = PING_STATE_NONE;
-}
-
-static void red_channel_client_handle_pong(RedChannelClient *rcc, SpiceMsgPing *ping)
-{
- uint64_t now;
- struct timespec ts;
-
- /* ignoring unexpected pongs, or post-migration pongs for pings that
- * started just before migration */
- if (ping->id != rcc->latency_monitor.id) {
- spice_warning("ping-id (%u)!= pong-id %u",
- rcc->latency_monitor.id, ping->id);
- return;
- }
-
- clock_gettime(CLOCK_MONOTONIC, &ts);
- now = ts.tv_sec * 1000000000LL + ts.tv_nsec;
-
- if (rcc->latency_monitor.state == PING_STATE_WARMUP) {
- rcc->latency_monitor.state = PING_STATE_LATENCY;
- return;
- } else if (rcc->latency_monitor.state != PING_STATE_LATENCY) {
- spice_warning("unexpected");
- return;
- }
-
- /* set TCO_NODELAY=0, in case we reverted it for the test*/
- if (!rcc->latency_monitor.tcp_nodelay) {
- int delay_val = 0;
-
- if (setsockopt(rcc->stream->socket, IPPROTO_TCP, TCP_NODELAY, &delay_val,
- sizeof(delay_val)) == -1) {
- if (errno != ENOTSUP) {
- spice_warning("setsockopt failed, %s", strerror(errno));
- }
- }
- }
-
- /*
- * The real network latency shouldn't change during the connection. However,
- * the measurements can be bigger than the real roundtrip due to other
- * threads or processes that are utilizing the network. We update the roundtrip
- * measurement with the minimal value we encountered till now.
- */
- if (rcc->latency_monitor.roundtrip < 0 ||
- now - ping->timestamp < rcc->latency_monitor.roundtrip) {
- rcc->latency_monitor.roundtrip = now - ping->timestamp;
- spice_debug("update roundtrip %.2f(ms)", rcc->latency_monitor.roundtrip/1000.0/1000.0);
- }
-
- rcc->latency_monitor.last_pong_time = now;
- rcc->latency_monitor.state = PING_STATE_NONE;
- red_channel_client_start_ping_timer(rcc, PING_TEST_TIMEOUT_MS);
-}
-
-int red_channel_client_handle_message(RedChannelClient *rcc, uint32_t size,
- uint16_t type, void *message)
-{
- switch (type) {
- case SPICE_MSGC_ACK_SYNC:
- if (size != sizeof(uint32_t)) {
- spice_printerr("bad message size");
- return FALSE;
- }
- rcc->ack_data.client_generation = *(uint32_t *)(message);
- break;
- case SPICE_MSGC_ACK:
- if (rcc->ack_data.client_generation == rcc->ack_data.generation) {
- rcc->ack_data.messages_window -= rcc->ack_data.client_window;
- red_channel_client_push(rcc);
- }
- break;
- case SPICE_MSGC_DISCONNECTING:
- break;
- case SPICE_MSGC_MIGRATE_FLUSH_MARK:
- if (!rcc->wait_migrate_flush_mark) {
- spice_error("unexpected flush mark");
- return FALSE;
- }
- red_channel_handle_migrate_flush_mark(rcc);
- rcc->wait_migrate_flush_mark = FALSE;
- break;
- case SPICE_MSGC_MIGRATE_DATA:
- red_channel_handle_migrate_data(rcc, size, message);
- break;
- case SPICE_MSGC_PONG:
- red_channel_client_handle_pong(rcc, message);
- break;
- default:
- spice_printerr("invalid message type %u", type);
- return FALSE;
- }
- return TRUE;
-}
-
-static void red_channel_client_event(int fd, int event, void *data)
-{
- RedChannelClient *rcc = (RedChannelClient *)data;
-
- red_channel_client_ref(rcc);
- if (event & SPICE_WATCH_EVENT_READ) {
- red_channel_client_receive(rcc);
- }
- if (event & SPICE_WATCH_EVENT_WRITE) {
- red_channel_client_push(rcc);
- }
- red_channel_client_unref(rcc);
-}
-
-void red_channel_client_init_send_data(RedChannelClient *rcc, uint16_t msg_type, PipeItem *item)
-{
- spice_assert(red_channel_client_no_item_being_sent(rcc));
- spice_assert(msg_type != 0);
- rcc->send_data.header.set_msg_type(&rcc->send_data.header, msg_type);
- rcc->send_data.item = item;
- if (item) {
- rcc->channel->channel_cbs.hold_item(rcc, item);
- }
-}
-
-void red_channel_client_begin_send_message(RedChannelClient *rcc)
-{
- SpiceMarshaller *m = rcc->send_data.marshaller;
-
- // TODO - better check: type in channel_allowed_types. Better: type in channel_allowed_types(channel_state)
- if (rcc->send_data.header.get_msg_type(&rcc->send_data.header) == 0) {
- spice_printerr("BUG: header->type == 0");
- return;
- }
-
- /* canceling the latency test timer till the nework is idle */
- red_channel_client_cancel_ping_timer(rcc);
-
- spice_marshaller_flush(m);
- rcc->send_data.size = spice_marshaller_get_total_size(m);
- rcc->send_data.header.set_msg_size(&rcc->send_data.header,
- rcc->send_data.size - rcc->send_data.header.header_size);
- rcc->ack_data.messages_window++;
- rcc->send_data.last_sent_serial = rcc->send_data.serial;
- rcc->send_data.header.data = NULL; /* avoid writing to this until we have a new message */
- red_channel_client_send(rcc);
-}
-
-SpiceMarshaller *red_channel_client_switch_to_urgent_sender(RedChannelClient *rcc)
-{
- spice_assert(red_channel_client_no_item_being_sent(rcc));
- spice_assert(rcc->send_data.header.data != NULL);
- rcc->send_data.main.header_data = rcc->send_data.header.data;
- rcc->send_data.main.item = rcc->send_data.item;
-
- rcc->send_data.marshaller = rcc->send_data.urgent.marshaller;
- rcc->send_data.item = NULL;
- red_channel_client_reset_send_data(rcc);
- return rcc->send_data.marshaller;
-}
-
-static void red_channel_client_restore_main_sender(RedChannelClient *rcc)
-{
- spice_marshaller_reset(rcc->send_data.urgent.marshaller);
- rcc->send_data.marshaller = rcc->send_data.main.marshaller;
- rcc->send_data.header.data = rcc->send_data.main.header_data;
- if (!rcc->is_mini_header) {
- rcc->send_data.header.set_msg_serial(&rcc->send_data.header, rcc->send_data.serial);
- }
- rcc->send_data.item = rcc->send_data.main.item;
-}
-
-uint64_t red_channel_client_get_message_serial(RedChannelClient *rcc)
-{
- return rcc->send_data.serial;
-}
-
-void red_channel_client_set_message_serial(RedChannelClient *rcc, uint64_t serial)
-{
- rcc->send_data.last_sent_serial = serial;
- rcc->send_data.serial = serial;
-}
-
-void red_channel_pipe_item_init(RedChannel *channel, PipeItem *item, int type)
-{
- ring_item_init(&item->link);
- item->type = type;
-}
-
-static inline int validate_pipe_add(RedChannelClient *rcc, PipeItem *item)
-{
- spice_assert(rcc && item);
- if (SPICE_UNLIKELY(!red_channel_client_is_connected(rcc))) {
- spice_debug("rcc is disconnected %p", rcc);
- red_channel_client_release_item(rcc, item, FALSE);
- return FALSE;
- }
- return TRUE;
-}
-
-void red_channel_client_pipe_add(RedChannelClient *rcc, PipeItem *item)
-{
-
- if (!validate_pipe_add(rcc, item)) {
- return;
- }
- rcc->pipe_size++;
- ring_add(&rcc->pipe, &item->link);
-}
-
-void red_channel_client_pipe_add_push(RedChannelClient *rcc, PipeItem *item)
-{
- red_channel_client_pipe_add(rcc, item);
- red_channel_client_push(rcc);
-}
-
-void red_channel_client_pipe_add_after(RedChannelClient *rcc,
- PipeItem *item, PipeItem *pos)
-{
- spice_assert(pos);
- if (!validate_pipe_add(rcc, item)) {
- return;
- }
- rcc->pipe_size++;
- ring_add_after(&item->link, &pos->link);
-}
-
-int red_channel_client_pipe_item_is_linked(RedChannelClient *rcc,
- PipeItem *item)
-{
- return ring_item_is_linked(&item->link);
-}
-
-void red_channel_client_pipe_add_tail_no_push(RedChannelClient *rcc,
- PipeItem *item)
-{
- if (!validate_pipe_add(rcc, item)) {
- return;
- }
- rcc->pipe_size++;
- ring_add_before(&item->link, &rcc->pipe);
-}
-
-void red_channel_client_pipe_add_tail(RedChannelClient *rcc, PipeItem *item)
-{
- if (!validate_pipe_add(rcc, item)) {
- return;
- }
- rcc->pipe_size++;
- ring_add_before(&item->link, &rcc->pipe);
- red_channel_client_push(rcc);
-}
-
-void red_channel_client_pipe_add_type(RedChannelClient *rcc, int pipe_item_type)
-{
- PipeItem *item = spice_new(PipeItem, 1);
-
- red_channel_pipe_item_init(rcc->channel, item, pipe_item_type);
- red_channel_client_pipe_add(rcc, item);
- red_channel_client_push(rcc);
-}
-
-void red_channel_pipes_add_type(RedChannel *channel, int pipe_item_type)
-{
- RingItem *link, *next;
-
- RING_FOREACH_SAFE(link, next, &channel->clients) {
- red_channel_client_pipe_add_type(
- SPICE_CONTAINEROF(link, RedChannelClient, channel_link),
- pipe_item_type);
- }
-}
-
-void red_channel_client_pipe_add_empty_msg(RedChannelClient *rcc, int msg_type)
-{
- EmptyMsgPipeItem *item = spice_new(EmptyMsgPipeItem, 1);
-
- red_channel_pipe_item_init(rcc->channel, &item->base, PIPE_ITEM_TYPE_EMPTY_MSG);
- item->msg = msg_type;
- red_channel_client_pipe_add(rcc, &item->base);
- red_channel_client_push(rcc);
-}
-
-void red_channel_pipes_add_empty_msg(RedChannel *channel, int msg_type)
-{
- RingItem *link, *next;
-
- RING_FOREACH_SAFE(link, next, &channel->clients) {
- red_channel_client_pipe_add_empty_msg(
- SPICE_CONTAINEROF(link, RedChannelClient, channel_link),
- msg_type);
- }
-}
-
-int red_channel_client_is_connected(RedChannelClient *rcc)
-{
- if (!rcc->dummy) {
- return rcc->stream != NULL;
- } else {
- return rcc->dummy_connected;
- }
-}
-
-int red_channel_is_connected(RedChannel *channel)
-{
- return channel && (channel->clients_num > 0);
-}
-
-void red_channel_client_clear_sent_item(RedChannelClient *rcc)
-{
- if (rcc->send_data.item) {
- red_channel_client_release_item(rcc, rcc->send_data.item, TRUE);
- rcc->send_data.item = NULL;
- }
- rcc->send_data.blocked = FALSE;
- rcc->send_data.size = 0;
-}
-
-void red_channel_client_pipe_clear(RedChannelClient *rcc)
-{
- PipeItem *item;
-
- if (rcc) {
- red_channel_client_clear_sent_item(rcc);
- }
- while ((item = (PipeItem *)ring_get_head(&rcc->pipe))) {
- ring_remove(&item->link);
- red_channel_client_release_item(rcc, item, FALSE);
- }
- rcc->pipe_size = 0;
-}
-
-void red_channel_client_ack_zero_messages_window(RedChannelClient *rcc)
-{
- rcc->ack_data.messages_window = 0;
-}
-
-void red_channel_client_ack_set_client_window(RedChannelClient *rcc, int client_window)
-{
- rcc->ack_data.client_window = client_window;
-}
-
-static void red_channel_remove_client(RedChannelClient *rcc)
-{
- if (!pthread_equal(pthread_self(), rcc->channel->thread_id)) {
- spice_warning("channel type %d id %d - "
- "channel->thread_id (0x%lx) != pthread_self (0x%lx)."
- "If one of the threads is != io-thread && != vcpu-thread, "
- "this might be a BUG",
- rcc->channel->type, rcc->channel->id,
- rcc->channel->thread_id, pthread_self());
- }
- ring_remove(&rcc->channel_link);
- spice_assert(rcc->channel->clients_num > 0);
- rcc->channel->clients_num--;
- // TODO: should we set rcc->channel to NULL???
-}
-
-static void red_client_remove_channel(RedChannelClient *rcc)
-{
- pthread_mutex_lock(&rcc->client->lock);
- ring_remove(&rcc->client_link);
- rcc->client->channels_num--;
- pthread_mutex_unlock(&rcc->client->lock);
-}
-
-static void red_channel_client_disconnect_dummy(RedChannelClient *rcc)
-{
- spice_assert(rcc->dummy);
- if (ring_item_is_linked(&rcc->channel_link)) {
- spice_printerr("rcc=%p (channel=%p type=%d id=%d)", rcc, rcc->channel,
- rcc->channel->type, rcc->channel->id);
- red_channel_remove_client(rcc);
- }
- rcc->dummy_connected = FALSE;
-}
-
-void red_channel_client_disconnect(RedChannelClient *rcc)
-{
- if (rcc->dummy) {
- red_channel_client_disconnect_dummy(rcc);
- return;
- }
- if (!red_channel_client_is_connected(rcc)) {
- return;
- }
- spice_printerr("rcc=%p (channel=%p type=%d id=%d)", rcc, rcc->channel,
- rcc->channel->type, rcc->channel->id);
- red_channel_client_pipe_clear(rcc);
- if (rcc->stream->watch) {
- rcc->channel->core->watch_remove(rcc->stream->watch);
- rcc->stream->watch = NULL;
- }
- reds_stream_free(rcc->stream);
- rcc->stream = NULL;
- if (rcc->latency_monitor.timer) {
- rcc->channel->core->timer_remove(rcc->latency_monitor.timer);
- rcc->latency_monitor.timer = NULL;
- }
- if (rcc->connectivity_monitor.timer) {
- rcc->channel->core->timer_remove(rcc->connectivity_monitor.timer);
- rcc->connectivity_monitor.timer = NULL;
- }
- red_channel_remove_client(rcc);
- rcc->channel->channel_cbs.on_disconnect(rcc);
-}
-
-void red_channel_disconnect(RedChannel *channel)
-{
- RingItem *link;
- RingItem *next;
-
- RING_FOREACH_SAFE(link, next, &channel->clients) {
- red_channel_client_disconnect(
- SPICE_CONTAINEROF(link, RedChannelClient, channel_link));
- }
-}
-
-RedChannelClient *red_channel_client_create_dummy(int size,
- RedChannel *channel,
- RedClient *client,
- int num_common_caps, uint32_t *common_caps,
- int num_caps, uint32_t *caps)
-{
- RedChannelClient *rcc = NULL;
-
- spice_assert(size >= sizeof(RedChannelClient));
-
- pthread_mutex_lock(&client->lock);
- if (!red_channel_client_pre_create_validate(channel, client)) {
- goto error;
- }
- rcc = spice_malloc0(size);
- rcc->refs = 1;
- rcc->client = client;
- rcc->channel = channel;
- red_channel_ref(channel);
- red_channel_client_set_remote_caps(rcc, num_common_caps, common_caps, num_caps, caps);
- if (red_channel_client_test_remote_common_cap(rcc, SPICE_COMMON_CAP_MINI_HEADER)) {
- rcc->incoming.header = mini_header_wrapper;
- rcc->send_data.header = mini_header_wrapper;
- rcc->is_mini_header = TRUE;
- } else {
- rcc->incoming.header = full_header_wrapper;
- rcc->send_data.header = full_header_wrapper;
- rcc->is_mini_header = FALSE;
- }
-
- rcc->incoming.header.data = rcc->incoming.header_buf;
- rcc->incoming.serial = 1;
- ring_init(&rcc->pipe);
-
- rcc->dummy = TRUE;
- rcc->dummy_connected = TRUE;
- red_channel_add_client(channel, rcc);
- red_client_add_channel(client, rcc);
- pthread_mutex_unlock(&client->lock);
- return rcc;
-error:
- pthread_mutex_unlock(&client->lock);
- return NULL;
-}
-
-void red_channel_apply_clients(RedChannel *channel, channel_client_callback cb)
-{
- RingItem *link;
- RingItem *next;
- RedChannelClient *rcc;
-
- RING_FOREACH_SAFE(link, next, &channel->clients) {
- rcc = SPICE_CONTAINEROF(link, RedChannelClient, channel_link);
- cb(rcc);
- }
-}
-
-void red_channel_apply_clients_data(RedChannel *channel, channel_client_callback_data cb, void *data)
-{
- RingItem *link;
- RingItem *next;
- RedChannelClient *rcc;
-
- RING_FOREACH_SAFE(link, next, &channel->clients) {
- rcc = SPICE_CONTAINEROF(link, RedChannelClient, channel_link);
- cb(rcc, data);
- }
-}
-
-int red_channel_all_blocked(RedChannel *channel)
-{
- RingItem *link;
- RedChannelClient *rcc;
-
- if (!channel || channel->clients_num == 0) {
- return FALSE;
- }
- RING_FOREACH(link, &channel->clients) {
- rcc = SPICE_CONTAINEROF(link, RedChannelClient, channel_link);
- if (!rcc->send_data.blocked) {
- return FALSE;
- }
- }
- return TRUE;
-}
-
-int red_channel_any_blocked(RedChannel *channel)
-{
- RingItem *link;
- RedChannelClient *rcc;
-
- RING_FOREACH(link, &channel->clients) {
- rcc = SPICE_CONTAINEROF(link, RedChannelClient, channel_link);
- if (rcc->send_data.blocked) {
- return TRUE;
- }
- }
- return FALSE;
-}
-
-int red_channel_client_blocked(RedChannelClient *rcc)
-{
- return rcc && rcc->send_data.blocked;
-}
-
-int red_channel_client_send_message_pending(RedChannelClient *rcc)
-{
- return rcc->send_data.header.get_msg_type(&rcc->send_data.header) != 0;
-}
-
-/* accessors for RedChannelClient */
-SpiceMarshaller *red_channel_client_get_marshaller(RedChannelClient *rcc)
-{
- return rcc->send_data.marshaller;
-}
-
-RedsStream *red_channel_client_get_stream(RedChannelClient *rcc)
-{
- return rcc->stream;
-}
-
-RedClient *red_channel_client_get_client(RedChannelClient *rcc)
-{
- return rcc->client;
-}
-
-void red_channel_client_set_header_sub_list(RedChannelClient *rcc, uint32_t sub_list)
-{
- rcc->send_data.header.set_msg_sub_list(&rcc->send_data.header, sub_list);
-}
-
-/* end of accessors */
-
-int red_channel_get_first_socket(RedChannel *channel)
-{
- if (!channel || channel->clients_num == 0) {
- return -1;
- }
- return SPICE_CONTAINEROF(ring_get_head(&channel->clients),
- RedChannelClient, channel_link)->stream->socket;
-}
-
-int red_channel_no_item_being_sent(RedChannel *channel)
-{
- RingItem *link;
- RedChannelClient *rcc;
-
- RING_FOREACH(link, &channel->clients) {
- rcc = SPICE_CONTAINEROF(link, RedChannelClient, channel_link);
- if (!red_channel_client_no_item_being_sent(rcc)) {
- return FALSE;
- }
- }
- return TRUE;
-}
-
-int red_channel_client_no_item_being_sent(RedChannelClient *rcc)
-{
- return !rcc || (rcc->send_data.size == 0);
-}
-
-void red_channel_client_pipe_remove_and_release(RedChannelClient *rcc,
- PipeItem *item)
-{
- red_channel_client_pipe_remove(rcc, item);
- red_channel_client_release_item(rcc, item, FALSE);
-}
-
-/*
- * RedClient implementation - kept in red_channel.c because they are
- * pretty tied together.
- */
-
-RedClient *red_client_new(int migrated)
-{
- RedClient *client;
-
- client = spice_malloc0(sizeof(RedClient));
- ring_init(&client->channels);
- pthread_mutex_init(&client->lock, NULL);
- client->thread_id = pthread_self();
- client->during_target_migrate = migrated;
- client->refs = 1;
-
- return client;
-}
-
-RedClient *red_client_ref(RedClient *client)
-{
- spice_assert(client);
- client->refs++;
- return client;
-}
-
-RedClient *red_client_unref(RedClient *client)
-{
- if (!--client->refs) {
- spice_debug("release client=%p", client);
- pthread_mutex_destroy(&client->lock);
- free(client);
- return NULL;
- }
- return client;
-}
-
-/* client mutex should be locked before this call */
-static void red_channel_client_set_migration_seamless(RedChannelClient *rcc)
-{
- spice_assert(rcc->client->during_target_migrate && rcc->client->seamless_migrate);
-
- if (rcc->channel->migration_flags & SPICE_MIGRATE_NEED_DATA_TRANSFER) {
- rcc->wait_migrate_data = TRUE;
- rcc->client->num_migrated_channels++;
- }
- spice_debug("channel type %d id %d rcc %p wait data %d", rcc->channel->type, rcc->channel->id, rcc,
- rcc->wait_migrate_data);
-}
-
-void red_client_set_migration_seamless(RedClient *client) // dest
-{
- RingItem *link;
- pthread_mutex_lock(&client->lock);
- client->seamless_migrate = TRUE;
- /* update channel clients that got connected before the migration
- * type was set. red_client_add_channel will handle newer channel clients */
- RING_FOREACH(link, &client->channels) {
- RedChannelClient *rcc = SPICE_CONTAINEROF(link, RedChannelClient, client_link);
- red_channel_client_set_migration_seamless(rcc);
- }
- pthread_mutex_unlock(&client->lock);
-}
-
-void red_client_migrate(RedClient *client)
-{
- RingItem *link, *next;
- RedChannelClient *rcc;
-
- spice_printerr("migrate client with #channels %d", client->channels_num);
- if (!pthread_equal(pthread_self(), client->thread_id)) {
- spice_warning("client->thread_id (0x%lx) != pthread_self (0x%lx)."
- "If one of the threads is != io-thread && != vcpu-thread,"
- " this might be a BUG",
- client->thread_id, pthread_self());
- }
- RING_FOREACH_SAFE(link, next, &client->channels) {
- rcc = SPICE_CONTAINEROF(link, RedChannelClient, client_link);
- if (red_channel_client_is_connected(rcc)) {
- rcc->channel->client_cbs.migrate(rcc);
- }
- }
-}
-
-void red_client_destroy(RedClient *client)
-{
- RingItem *link, *next;
- RedChannelClient *rcc;
-
- spice_printerr("destroy client %p with #channels=%d", client, client->channels_num);
- if (!pthread_equal(pthread_self(), client->thread_id)) {
- spice_warning("client->thread_id (0x%lx) != pthread_self (0x%lx)."
- "If one of the threads is != io-thread && != vcpu-thread,"
- " this might be a BUG",
- client->thread_id,
- pthread_self());
- }
- RING_FOREACH_SAFE(link, next, &client->channels) {
- // some channels may be in other threads, so disconnection
- // is not synchronous.
- rcc = SPICE_CONTAINEROF(link, RedChannelClient, client_link);
- rcc->destroying = 1;
- // some channels may be in other threads. However we currently
- // assume disconnect is synchronous (we changed the dispatcher
- // to wait for disconnection)
- // TODO: should we go back to async. For this we need to use
- // ref count for channel clients.
- rcc->channel->client_cbs.disconnect(rcc);
- spice_assert(ring_is_empty(&rcc->pipe));
- spice_assert(rcc->pipe_size == 0);
- spice_assert(rcc->send_data.size == 0);
- red_channel_client_destroy(rcc);
- }
- red_client_unref(client);
-}
-
-/* client->lock should be locked */
-static RedChannelClient *red_client_get_channel(RedClient *client, int type, int id)
-{
- RingItem *link;
- RedChannelClient *rcc;
- RedChannelClient *ret = NULL;
-
- RING_FOREACH(link, &client->channels) {
- rcc = SPICE_CONTAINEROF(link, RedChannelClient, client_link);
- if (rcc->channel->type == type && rcc->channel->id == id) {
- ret = rcc;
- break;
- }
- }
- return ret;
-}
-
-/* client->lock should be locked */
-static void red_client_add_channel(RedClient *client, RedChannelClient *rcc)
-{
- spice_assert(rcc && client);
- ring_add(&client->channels, &rcc->client_link);
- if (client->during_target_migrate && client->seamless_migrate) {
- red_channel_client_set_migration_seamless(rcc);
- }
- client->channels_num++;
-}
-
-MainChannelClient *red_client_get_main(RedClient *client) {
- return client->mcc;
-}
-
-void red_client_set_main(RedClient *client, MainChannelClient *mcc) {
- client->mcc = mcc;
-}
-
-void red_client_semi_seamless_migrate_complete(RedClient *client)
-{
- RingItem *link, *next;
-
- pthread_mutex_lock(&client->lock);
- if (!client->during_target_migrate || client->seamless_migrate) {
- spice_error("unexpected");
- pthread_mutex_unlock(&client->lock);
- return;
- }
- client->during_target_migrate = FALSE;
- RING_FOREACH_SAFE(link, next, &client->channels) {
- RedChannelClient *rcc = SPICE_CONTAINEROF(link, RedChannelClient, client_link);
-
- if (rcc->latency_monitor.timer) {
- red_channel_client_start_ping_timer(rcc, PING_TEST_IDLE_NET_TIMEOUT_MS);
- }
- }
- pthread_mutex_unlock(&client->lock);
- reds_on_client_semi_seamless_migrate_complete(client);
-}
-
-/* should be called only from the main thread */
-int red_client_during_migrate_at_target(RedClient *client)
-{
- int ret;
- pthread_mutex_lock(&client->lock);
- ret = client->during_target_migrate;
- pthread_mutex_unlock(&client->lock);
- return ret;
-}
-
-/*
- * Functions to push the same item to multiple pipes.
- */
-
-/*
- * TODO: after convinced of correctness, add paths for single client
- * that avoid the whole loop. perhaps even have a function pointer table
- * later.
- * TODO - inline? macro? right now this is the simplest from code amount
- */
-
-typedef void (*rcc_item_t)(RedChannelClient *rcc, PipeItem *item);
-typedef int (*rcc_item_cond_t)(RedChannelClient *rcc, PipeItem *item);
-
-static void red_channel_pipes_create_batch(RedChannel *channel,
- new_pipe_item_t creator, void *data,
- rcc_item_t callback)
-{
- RingItem *link, *next;
- RedChannelClient *rcc;
- PipeItem *item;
- int num = 0;
-
- RING_FOREACH_SAFE(link, next, &channel->clients) {
- rcc = SPICE_CONTAINEROF(link, RedChannelClient, channel_link);
- item = (*creator)(rcc, data, num++);
- if (callback) {
- (*callback)(rcc, item);
- }
- }
-}
-
-void red_channel_pipes_new_add_push(RedChannel *channel,
- new_pipe_item_t creator, void *data)
-{
- red_channel_pipes_create_batch(channel, creator, data,
- red_channel_client_pipe_add);
- red_channel_push(channel);
-}
-
-void red_channel_pipes_new_add(RedChannel *channel, new_pipe_item_t creator, void *data)
-{
- red_channel_pipes_create_batch(channel, creator, data,
- red_channel_client_pipe_add);
-}
-
-void red_channel_pipes_new_add_tail(RedChannel *channel, new_pipe_item_t creator, void *data)
-{
- red_channel_pipes_create_batch(channel, creator, data,
- red_channel_client_pipe_add_tail_no_push);
-}
-
-uint32_t red_channel_max_pipe_size(RedChannel *channel)
-{
- RingItem *link;
- RedChannelClient *rcc;
- uint32_t pipe_size = 0;
-
- RING_FOREACH(link, &channel->clients) {
- rcc = SPICE_CONTAINEROF(link, RedChannelClient, channel_link);
- pipe_size = pipe_size > rcc->pipe_size ? pipe_size : rcc->pipe_size;
- }
- return pipe_size;
-}
-
-uint32_t red_channel_min_pipe_size(RedChannel *channel)
-{
- RingItem *link;
- RedChannelClient *rcc;
- uint32_t pipe_size = ~0;
-
- RING_FOREACH(link, &channel->clients) {
- rcc = SPICE_CONTAINEROF(link, RedChannelClient, channel_link);
- pipe_size = pipe_size < rcc->pipe_size ? pipe_size : rcc->pipe_size;
- }
- return pipe_size == ~0 ? 0 : pipe_size;
-}
-
-uint32_t red_channel_sum_pipes_size(RedChannel *channel)
-{
- RingItem *link;
- RedChannelClient *rcc;
- uint32_t sum = 0;
-
- RING_FOREACH(link, &channel->clients) {
- rcc = SPICE_CONTAINEROF(link, RedChannelClient, channel_link);
- sum += rcc->pipe_size;
- }
- return sum;
-}
-
-int red_channel_client_wait_outgoing_item(RedChannelClient *rcc,
- int64_t timeout)
-{
- uint64_t end_time;
- int blocked;
-
- if (!red_channel_client_blocked(rcc)) {
- return TRUE;
- }
- if (timeout != -1) {
- end_time = red_now() + timeout;
- } else {
- end_time = UINT64_MAX;
- }
- spice_info("blocked");
-
- do {
- usleep(CHANNEL_BLOCKED_SLEEP_DURATION);
- red_channel_client_receive(rcc);
- red_channel_client_send(rcc);
- } while ((blocked = red_channel_client_blocked(rcc)) &&
- (timeout == -1 || red_now() < end_time));
-
- if (blocked) {
- spice_warning("timeout");
- return FALSE;
- } else {
- spice_assert(red_channel_client_no_item_being_sent(rcc));
- return TRUE;
- }
-}
-
-/* TODO: more evil sync stuff. anything with the word wait in it's name. */
-int red_channel_client_wait_pipe_item_sent(RedChannelClient *rcc,
- PipeItem *item,
- int64_t timeout)
-{
- uint64_t end_time;
- int item_in_pipe;
-
- spice_info(NULL);
-
- if (timeout != -1) {
- end_time = red_now() + timeout;
- } else {
- end_time = UINT64_MAX;
- }
-
- rcc->channel->channel_cbs.hold_item(rcc, item);
-
- if (red_channel_client_blocked(rcc)) {
- red_channel_client_receive(rcc);
- red_channel_client_send(rcc);
- }
- red_channel_client_push(rcc);
-
- while((item_in_pipe = ring_item_is_linked(&item->link)) &&
- (timeout == -1 || red_now() < end_time)) {
- usleep(CHANNEL_BLOCKED_SLEEP_DURATION);
- red_channel_client_receive(rcc);
- red_channel_client_send(rcc);
- red_channel_client_push(rcc);
- }
-
- red_channel_client_release_item(rcc, item, TRUE);
- if (item_in_pipe) {
- spice_warning("timeout");
- return FALSE;
- } else {
- return red_channel_client_wait_outgoing_item(rcc,
- timeout == -1 ? -1 : end_time - red_now());
- }
-}
-
-int red_channel_wait_all_sent(RedChannel *channel,
- int64_t timeout)
-{
- uint64_t end_time;
- uint32_t max_pipe_size;
- int blocked = FALSE;
-
- if (timeout != -1) {
- end_time = red_now() + timeout;
- } else {
- end_time = UINT64_MAX;
- }
-
- red_channel_push(channel);
- while (((max_pipe_size = red_channel_max_pipe_size(channel)) ||
- (blocked = red_channel_any_blocked(channel))) &&
- (timeout == -1 || red_now() < end_time)) {
- spice_debug("pipe-size %u blocked %d", max_pipe_size, blocked);
- usleep(CHANNEL_BLOCKED_SLEEP_DURATION);
- red_channel_receive(channel);
- red_channel_send(channel);
- red_channel_push(channel);
- }
-
- if (max_pipe_size || blocked) {
- spice_warning("timeout: pending out messages exist (pipe-size %u, blocked %d)",
- max_pipe_size, blocked);
- return FALSE;
- } else {
- spice_assert(red_channel_no_item_being_sent(channel));
- return TRUE;
- }
-}
diff --git a/server/red_channel.h b/server/red_channel.h
deleted file mode 100644
index f9cfb95e..00000000
--- a/server/red_channel.h
+++ /dev/null
@@ -1,631 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-
-
- Author:
- yhalperi@redhat.com
-*/
-
-#ifndef _H_RED_CHANNEL
-#define _H_RED_CHANNEL
-
-#include <pthread.h>
-#include <limits.h>
-
-#include "common/ring.h"
-#include "common/marshaller.h"
-
-#include "spice.h"
-#include "red_common.h"
-#include "demarshallers.h"
-#include "reds_stream.h"
-
-#define MAX_SEND_BUFS 1000
-#define CLIENT_ACK_WINDOW 20
-
-#ifndef IOV_MAX
-#define IOV_MAX 1024
-#endif
-
-#define MAX_HEADER_SIZE sizeof(SpiceDataHeader)
-
-/* Basic interface for channels, without using the RedChannel interface.
- The intention is to move towards one channel interface gradually.
- At the final stage, this interface shouldn't be exposed. Only RedChannel will use it. */
-
-typedef struct SpiceDataHeaderOpaque SpiceDataHeaderOpaque;
-
-typedef uint16_t (*get_msg_type_proc)(SpiceDataHeaderOpaque *header);
-typedef uint32_t (*get_msg_size_proc)(SpiceDataHeaderOpaque *header);
-typedef void (*set_msg_type_proc)(SpiceDataHeaderOpaque *header, uint16_t type);
-typedef void (*set_msg_size_proc)(SpiceDataHeaderOpaque *header, uint32_t size);
-typedef void (*set_msg_serial_proc)(SpiceDataHeaderOpaque *header, uint64_t serial);
-typedef void (*set_msg_sub_list_proc)(SpiceDataHeaderOpaque *header, uint32_t sub_list);
-
-struct SpiceDataHeaderOpaque {
- uint8_t *data;
- uint16_t header_size;
-
- set_msg_type_proc set_msg_type;
- set_msg_size_proc set_msg_size;
- set_msg_serial_proc set_msg_serial;
- set_msg_sub_list_proc set_msg_sub_list;
-
- get_msg_type_proc get_msg_type;
- get_msg_size_proc get_msg_size;
-};
-
-typedef int (*handle_message_proc)(void *opaque,
- uint16_t type, uint32_t size, uint8_t *msg);
-typedef int (*handle_parsed_proc)(void *opaque, uint32_t size, uint16_t type, void *message);
-typedef uint8_t *(*alloc_msg_recv_buf_proc)(void *opaque, uint16_t type, uint32_t size);
-typedef void (*release_msg_recv_buf_proc)(void *opaque,
- uint16_t type, uint32_t size, uint8_t *msg);
-typedef void (*on_incoming_error_proc)(void *opaque);
-typedef void (*on_input_proc)(void *opaque, int n);
-
-typedef struct IncomingHandlerInterface {
- handle_message_proc handle_message;
- alloc_msg_recv_buf_proc alloc_msg_buf;
- on_incoming_error_proc on_error; // recv error or handle_message error
- release_msg_recv_buf_proc release_msg_buf; // for errors
- // The following is an optional alternative to handle_message, used if not null
- spice_parse_channel_func_t parser;
- handle_parsed_proc handle_parsed;
- on_input_proc on_input;
-} IncomingHandlerInterface;
-
-typedef struct IncomingHandler {
- IncomingHandlerInterface *cb;
- void *opaque;
- uint8_t header_buf[MAX_HEADER_SIZE];
- SpiceDataHeaderOpaque header;
- uint32_t header_pos;
- uint8_t *msg; // data of the msg following the header. allocated by alloc_msg_buf.
- uint32_t msg_pos;
- uint64_t serial;
-} IncomingHandler;
-
-typedef int (*get_outgoing_msg_size_proc)(void *opaque);
-typedef void (*prepare_outgoing_proc)(void *opaque, struct iovec *vec, int *vec_size, int pos);
-typedef void (*on_outgoing_error_proc)(void *opaque);
-typedef void (*on_outgoing_block_proc)(void *opaque);
-typedef void (*on_outgoing_msg_done_proc)(void *opaque);
-typedef void (*on_output_proc)(void *opaque, int n);
-
-typedef struct OutgoingHandlerInterface {
- get_outgoing_msg_size_proc get_msg_size;
- prepare_outgoing_proc prepare;
- on_outgoing_error_proc on_error;
- on_outgoing_block_proc on_block;
- on_outgoing_msg_done_proc on_msg_done;
- on_output_proc on_output;
-} OutgoingHandlerInterface;
-
-typedef struct OutgoingHandler {
- OutgoingHandlerInterface *cb;
- void *opaque;
- struct iovec vec_buf[IOV_MAX];
- int vec_size;
- struct iovec *vec;
- int pos;
- int size;
-} OutgoingHandler;
-
-/* Red Channel interface */
-
-typedef struct BufDescriptor {
- uint32_t size;
- uint8_t *data;
-} BufDescriptor;
-
-typedef struct RedChannel RedChannel;
-typedef struct RedChannelClient RedChannelClient;
-typedef struct RedClient RedClient;
-typedef struct MainChannelClient MainChannelClient;
-
-/* Messages handled by red_channel
- * SET_ACK - sent to client on channel connection
- * Note that the numbers don't have to correspond to spice message types,
- * but we keep the 100 first allocated for base channel approach.
- * */
-enum {
- PIPE_ITEM_TYPE_SET_ACK=1,
- PIPE_ITEM_TYPE_MIGRATE,
- PIPE_ITEM_TYPE_EMPTY_MSG,
- PIPE_ITEM_TYPE_PING,
-
- PIPE_ITEM_TYPE_CHANNEL_BASE=101,
-};
-
-typedef struct PipeItem {
- RingItem link;
- int type;
-} PipeItem;
-
-typedef uint8_t *(*channel_alloc_msg_recv_buf_proc)(RedChannelClient *channel,
- uint16_t type, uint32_t size);
-typedef int (*channel_handle_parsed_proc)(RedChannelClient *rcc, uint32_t size, uint16_t type,
- void *message);
-typedef int (*channel_handle_message_proc)(RedChannelClient *rcc,
- uint16_t type, uint32_t size, uint8_t *msg);
-typedef void (*channel_release_msg_recv_buf_proc)(RedChannelClient *channel,
- uint16_t type, uint32_t size, uint8_t *msg);
-typedef void (*channel_disconnect_proc)(RedChannelClient *rcc);
-typedef int (*channel_configure_socket_proc)(RedChannelClient *rcc);
-typedef void (*channel_send_pipe_item_proc)(RedChannelClient *rcc, PipeItem *item);
-typedef void (*channel_hold_pipe_item_proc)(RedChannelClient *rcc, PipeItem *item);
-typedef void (*channel_release_pipe_item_proc)(RedChannelClient *rcc,
- PipeItem *item, int item_pushed);
-typedef void (*channel_on_incoming_error_proc)(RedChannelClient *rcc);
-typedef void (*channel_on_outgoing_error_proc)(RedChannelClient *rcc);
-
-typedef int (*channel_handle_migrate_flush_mark_proc)(RedChannelClient *base);
-typedef int (*channel_handle_migrate_data_proc)(RedChannelClient *base,
- uint32_t size, void *message);
-typedef uint64_t (*channel_handle_migrate_data_get_serial_proc)(RedChannelClient *base,
- uint32_t size, void *message);
-
-
-typedef void (*channel_client_connect_proc)(RedChannel *channel, RedClient *client, RedsStream *stream,
- int migration, int num_common_cap, uint32_t *common_caps,
- int num_caps, uint32_t *caps);
-typedef void (*channel_client_disconnect_proc)(RedChannelClient *base);
-typedef void (*channel_client_migrate_proc)(RedChannelClient *base);
-
-// TODO: add ASSERTS for thread_id in client and channel calls
-//
-/*
- * callbacks that are triggered from channel client stream events.
- * They are called from the thread that listen to the stream events.
- */
-typedef struct {
- channel_configure_socket_proc config_socket;
- channel_disconnect_proc on_disconnect;
- channel_send_pipe_item_proc send_item;
- channel_hold_pipe_item_proc hold_item;
- channel_release_pipe_item_proc release_item;
- channel_alloc_msg_recv_buf_proc alloc_recv_buf;
- channel_release_msg_recv_buf_proc release_recv_buf;
- channel_handle_migrate_flush_mark_proc handle_migrate_flush_mark;
- channel_handle_migrate_data_proc handle_migrate_data;
- channel_handle_migrate_data_get_serial_proc handle_migrate_data_get_serial;
-} ChannelCbs;
-
-
-/*
- * callbacks that are triggered from client events.
- * They should be called from the thread that handles the RedClient
- */
-typedef struct {
- channel_client_connect_proc connect;
- channel_client_disconnect_proc disconnect;
- channel_client_migrate_proc migrate;
-} ClientCbs;
-
-typedef struct RedChannelCapabilities {
- int num_common_caps;
- uint32_t *common_caps;
- int num_caps;
- uint32_t *caps;
-} RedChannelCapabilities;
-
-int test_capability(uint32_t *caps, int num_caps, uint32_t cap);
-
-typedef struct RedChannelClientLatencyMonitor {
- int state;
- uint64_t last_pong_time;
- SpiceTimer *timer;
- uint32_t id;
- int tcp_nodelay;
- int warmup_was_sent;
-
- int64_t roundtrip;
-} RedChannelClientLatencyMonitor;
-
-typedef struct RedChannelClientConnectivityMonitor {
- int state;
- uint32_t out_bytes;
- uint32_t in_bytes;
- uint32_t timeout;
- SpiceTimer *timer;
-} RedChannelClientConnectivityMonitor;
-
-struct RedChannelClient {
- RingItem channel_link;
- RingItem client_link;
- RedChannel *channel;
- RedClient *client;
- RedsStream *stream;
- int dummy;
- int dummy_connected;
-
- uint32_t refs;
-
- struct {
- uint32_t generation;
- uint32_t client_generation;
- uint32_t messages_window;
- uint32_t client_window;
- } ack_data;
-
- struct {
- SpiceMarshaller *marshaller;
- SpiceDataHeaderOpaque header;
- uint32_t size;
- PipeItem *item;
- int blocked;
- uint64_t serial;
- uint64_t last_sent_serial;
-
- struct {
- SpiceMarshaller *marshaller;
- uint8_t *header_data;
- PipeItem *item;
- } main;
-
- struct {
- SpiceMarshaller *marshaller;
- } urgent;
- } send_data;
-
- OutgoingHandler outgoing;
- IncomingHandler incoming;
- int during_send;
- int id; // debugging purposes
- Ring pipe;
- uint32_t pipe_size;
-
- RedChannelCapabilities remote_caps;
- int is_mini_header;
- int destroying;
-
- int wait_migrate_data;
- int wait_migrate_flush_mark;
-
- RedChannelClientLatencyMonitor latency_monitor;
- RedChannelClientConnectivityMonitor connectivity_monitor;
-};
-
-struct RedChannel {
- uint32_t type;
- uint32_t id;
-
- uint32_t refs;
-
- RingItem link; // channels link for reds
-
- SpiceCoreInterface *core;
- int handle_acks;
-
- // RedChannel will hold only connected channel clients (logic - when pushing pipe item to all channel clients, there
- // is no need to go over disconnect clients)
- // . While client will hold the channel clients till it is destroyed
- // and then it will destroy them as well.
- // However RCC still holds a reference to the Channel.
- // Maybe replace these logic with ref count?
- // TODO: rename to 'connected_clients'?
- Ring clients;
- uint32_t clients_num;
-
- OutgoingHandlerInterface outgoing_cb;
- IncomingHandlerInterface incoming_cb;
-
- ChannelCbs channel_cbs;
- ClientCbs client_cbs;
-
- RedChannelCapabilities local_caps;
- uint32_t migration_flags;
-
- void *data;
-
- // TODO: when different channel_clients are in different threads from Channel -> need to protect!
- pthread_t thread_id;
-#ifdef RED_STATISTICS
- uint64_t *out_bytes_counter;
-#endif
-};
-
-/*
- * When an error occurs over a channel, we treat it as a warning
- * for spice-server and shutdown the channel.
- */
-#define spice_channel_client_error(rcc, format, ...) \
- do { \
- spice_warning("rcc %p type %u id %u: " format, rcc, \
- rcc->channel->type, rcc->channel->id, ## __VA_ARGS__); \
- red_channel_client_shutdown(rcc); \
- } while (0)
-
-/* if one of the callbacks should cause disconnect, use red_channel_shutdown and don't
- * explicitly destroy the channel */
-RedChannel *red_channel_create(int size,
- SpiceCoreInterface *core,
- uint32_t type, uint32_t id,
- int handle_acks,
- channel_handle_message_proc handle_message,
- ChannelCbs *channel_cbs,
- uint32_t migration_flags);
-
-/* alternative constructor, meant for marshaller based (inputs,main) channels,
- * will become default eventually */
-RedChannel *red_channel_create_parser(int size,
- SpiceCoreInterface *core,
- uint32_t type, uint32_t id,
- int handle_acks,
- spice_parse_channel_func_t parser,
- channel_handle_parsed_proc handle_parsed,
- ChannelCbs *channel_cbs,
- uint32_t migration_flags);
-
-void red_channel_register_client_cbs(RedChannel *channel, ClientCbs *client_cbs);
-// caps are freed when the channel is destroyed
-void red_channel_set_common_cap(RedChannel *channel, uint32_t cap);
-void red_channel_set_cap(RedChannel *channel, uint32_t cap);
-void red_channel_set_data(RedChannel *channel, void *data);
-
-RedChannelClient *red_channel_client_create(int size, RedChannel *channel, RedClient *client,
- RedsStream *stream,
- int monitor_latency,
- int num_common_caps, uint32_t *common_caps,
- int num_caps, uint32_t *caps);
-// TODO: tmp, for channels that don't use RedChannel yet (e.g., snd channel), but
-// do use the client callbacks. So the channel clients are not connected (the channel doesn't
-// have list of them, but they do have a link to the channel, and the client has a list of them)
-RedChannel *red_channel_create_dummy(int size, uint32_t type, uint32_t id);
-RedChannelClient *red_channel_client_create_dummy(int size,
- RedChannel *channel,
- RedClient *client,
- int num_common_caps, uint32_t *common_caps,
- int num_caps, uint32_t *caps);
-
-int red_channel_is_connected(RedChannel *channel);
-int red_channel_client_is_connected(RedChannelClient *rcc);
-
-void red_channel_client_default_migrate(RedChannelClient *rcc);
-int red_channel_client_waits_for_migrate_data(RedChannelClient *rcc);
-/* seamless migration is supported for only one client. This routine
- * checks if the only channel client associated with channel is
- * waiting for migration data */
-int red_channel_waits_for_migrate_data(RedChannel *channel);
-
-/*
- * the disconnect callback is called from the channel's thread,
- * i.e., for display channels - red worker thread, for all the other - from the main thread.
- * RedClient is managed from the main thread. red_channel_client_destroy can be called only
- * from red_client_destroy.
- */
-
-void red_channel_client_destroy(RedChannelClient *rcc);
-void red_channel_destroy(RedChannel *channel);
-
-int red_channel_client_test_remote_common_cap(RedChannelClient *rcc, uint32_t cap);
-int red_channel_client_test_remote_cap(RedChannelClient *rcc, uint32_t cap);
-
-/* return true if all the channel clients support the cap */
-int red_channel_test_remote_common_cap(RedChannel *channel, uint32_t cap);
-int red_channel_test_remote_cap(RedChannel *channel, uint32_t cap);
-
-/* shutdown is the only safe thing to do out of the client/channel
- * thread. It will not touch the rings, just shutdown the socket.
- * It should be followed by some way to gurantee a disconnection. */
-void red_channel_client_shutdown(RedChannelClient *rcc);
-
-/* should be called when a new channel is ready to send messages */
-void red_channel_init_outgoing_messages_window(RedChannel *channel);
-
-/* handles general channel msgs from the client */
-int red_channel_client_handle_message(RedChannelClient *rcc, uint32_t size,
- uint16_t type, void *message);
-
-/* when preparing send_data: should call init and then use marshaller */
-void red_channel_client_init_send_data(RedChannelClient *rcc, uint16_t msg_type, PipeItem *item);
-
-uint64_t red_channel_client_get_message_serial(RedChannelClient *channel);
-void red_channel_client_set_message_serial(RedChannelClient *channel, uint64_t);
-
-/* When sending a msg. Should first call red_channel_client_begin_send_message.
- * It will first send the pending urgent data, if there is any, and then
- * the rest of the data.
- */
-void red_channel_client_begin_send_message(RedChannelClient *rcc);
-
-/*
- * Stores the current send data, and switches to urgent send data.
- * When it begins the actual send, it will send first the urgent data
- * and afterward the rest of the data.
- * Should be called only if during the marshalling of on message,
- * the need to send another message, before, rises.
- * Important: the serial of the non-urgent sent data, will be succeeded.
- * return: the urgent send data marshaller
- */
-SpiceMarshaller *red_channel_client_switch_to_urgent_sender(RedChannelClient *rcc);
-
-/* returns -1 if we don't have an estimation */
-int red_channel_client_get_roundtrip_ms(RedChannelClient *rcc);
-
-/*
- * Checks periodically if the connection is still alive
- */
-void red_channel_client_start_connectivity_monitoring(RedChannelClient *rcc, uint32_t timeout_ms);
-
-void red_channel_pipe_item_init(RedChannel *channel, PipeItem *item, int type);
-
-// TODO: add back the channel_pipe_add functionality - by adding reference counting
-// to the PipeItem.
-
-// helper to push a new item to all channels
-typedef PipeItem *(*new_pipe_item_t)(RedChannelClient *rcc, void *data, int num);
-void red_channel_pipes_new_add_push(RedChannel *channel, new_pipe_item_t creator, void *data);
-void red_channel_pipes_new_add(RedChannel *channel, new_pipe_item_t creator, void *data);
-void red_channel_pipes_new_add_tail(RedChannel *channel, new_pipe_item_t creator, void *data);
-
-void red_channel_client_pipe_add_push(RedChannelClient *rcc, PipeItem *item);
-void red_channel_client_pipe_add(RedChannelClient *rcc, PipeItem *item);
-void red_channel_client_pipe_add_after(RedChannelClient *rcc, PipeItem *item, PipeItem *pos);
-int red_channel_client_pipe_item_is_linked(RedChannelClient *rcc, PipeItem *item);
-void red_channel_client_pipe_remove_and_release(RedChannelClient *rcc, PipeItem *item);
-void red_channel_client_pipe_add_tail(RedChannelClient *rcc, PipeItem *item);
-/* for types that use this routine -> the pipe item should be freed */
-void red_channel_client_pipe_add_type(RedChannelClient *rcc, int pipe_item_type);
-void red_channel_pipes_add_type(RedChannel *channel, int pipe_item_type);
-
-void red_channel_client_pipe_add_empty_msg(RedChannelClient *rcc, int msg_type);
-void red_channel_pipes_add_empty_msg(RedChannel *channel, int msg_type);
-
-void red_channel_client_ack_zero_messages_window(RedChannelClient *rcc);
-void red_channel_client_ack_set_client_window(RedChannelClient *rcc, int client_window);
-void red_channel_client_push_set_ack(RedChannelClient *rcc);
-void red_channel_push_set_ack(RedChannel *channel);
-
-int red_channel_get_first_socket(RedChannel *channel);
-
-/* return TRUE if all of the connected clients to this channel are blocked */
-int red_channel_all_blocked(RedChannel *channel);
-
-/* return TRUE if any of the connected clients to this channel are blocked */
-int red_channel_any_blocked(RedChannel *channel);
-
-int red_channel_client_blocked(RedChannelClient *rcc);
-
-/* helper for channels that have complex logic that can possibly ready a send */
-int red_channel_client_send_message_pending(RedChannelClient *rcc);
-
-int red_channel_no_item_being_sent(RedChannel *channel);
-int red_channel_client_no_item_being_sent(RedChannelClient *rcc);
-
-void red_channel_pipes_remove(RedChannel *channel, PipeItem *item);
-
-// TODO: unstaticed for display/cursor channels. they do some specific pushes not through
-// adding elements or on events. but not sure if this is actually required (only result
-// should be that they ""try"" a little harder, but if the event system is correct it
-// should not make any difference.
-void red_channel_push(RedChannel *channel);
-void red_channel_client_push(RedChannelClient *rcc);
-// TODO: again - what is the context exactly? this happens in channel disconnect. but our
-// current red_channel_shutdown also closes the socket - is there a socket to close?
-// are we reading from an fd here? arghh
-void red_channel_client_pipe_clear(RedChannelClient *rcc);
-// Again, used in various places outside of event handler context (or in other event handler
-// contexts):
-// flush_display_commands/flush_cursor_commands
-// display_channel_wait_for_init
-// red_wait_outgoing_item
-// red_wait_pipe_item_sent
-// handle_channel_events - this is the only one that was used before, and was in red_channel.c
-void red_channel_receive(RedChannel *channel);
-void red_channel_client_receive(RedChannelClient *rcc);
-// For red_worker
-void red_channel_send(RedChannel *channel);
-void red_channel_client_send(RedChannelClient *rcc);
-// For red_worker
-void red_channel_disconnect(RedChannel *channel);
-void red_channel_client_disconnect(RedChannelClient *rcc);
-
-/* accessors for RedChannelClient */
-/* Note: the valid times to call red_channel_get_marshaller are just during send_item callback. */
-SpiceMarshaller *red_channel_client_get_marshaller(RedChannelClient *rcc);
-RedsStream *red_channel_client_get_stream(RedChannelClient *rcc);
-RedClient *red_channel_client_get_client(RedChannelClient *rcc);
-
-/* Note that the header is valid only between red_channel_reset_send_data and
- * red_channel_begin_send_message.*/
-void red_channel_client_set_header_sub_list(RedChannelClient *rcc, uint32_t sub_list);
-
-/* return the sum of all the rcc pipe size */
-uint32_t red_channel_max_pipe_size(RedChannel *channel);
-/* return the min size of all the rcc pipe */
-uint32_t red_channel_min_pipe_size(RedChannel *channel);
-/* return the max size of all the rcc pipe */
-uint32_t red_channel_sum_pipes_size(RedChannel *channel);
-
-/* apply given function to all connected clients */
-typedef void (*channel_client_callback)(RedChannelClient *rcc);
-typedef void (*channel_client_callback_data)(RedChannelClient *rcc, void *data);
-void red_channel_apply_clients(RedChannel *channel, channel_client_callback v);
-void red_channel_apply_clients_data(RedChannel *channel, channel_client_callback_data v, void *data);
-
-struct RedClient {
- RingItem link;
- Ring channels;
- int channels_num;
- MainChannelClient *mcc;
- pthread_mutex_t lock; // different channels can be in different threads
-
- pthread_t thread_id;
-
- int disconnecting;
- /* Note that while semi-seamless migration is conducted by the main thread, seamless migration
- * involves all channels, and thus the related varaibles can be accessed from different
- * threads */
- int during_target_migrate; /* if seamless=TRUE, migration_target is turned off when all
- the clients received their migration data. Otherwise (semi-seamless),
- it is turned off, when red_client_semi_seamless_migrate_complete
- is called */
- int seamless_migrate;
- int num_migrated_channels; /* for seamless - number of channels that wait for migrate data*/
- int refs;
-};
-
-RedClient *red_client_new(int migrated);
-
-/*
- * disconnects all the client's channels (should be called from the client's thread)
- */
-void red_client_destroy(RedClient *client);
-
-RedClient *red_client_ref(RedClient *client);
-
-/*
- * releases the client resources when refs == 0.
- * We assume the red_client_derstroy was called before
- * we reached refs==0
- */
-RedClient *red_client_unref(RedClient *client);
-
-MainChannelClient *red_client_get_main(RedClient *client);
-// main should be set once before all the other channels are created
-void red_client_set_main(RedClient *client, MainChannelClient *mcc);
-
-/* called when the migration handshake results in seamless migration (dst side).
- * By default we assume semi-seamless */
-void red_client_set_migration_seamless(RedClient *client);
-void red_client_semi_seamless_migrate_complete(RedClient *client); /* dst side */
-/* TRUE if the migration is seamless and there are still channels that wait from migration data.
- * Or, during semi-seamless migration, and the main channel still waits for MIGRATE_END
- * from the client.
- * Note: Call it only from the main thread */
-int red_client_during_migrate_at_target(RedClient *client);
-
-void red_client_migrate(RedClient *client);
-
-/*
- * blocking functions.
- *
- * timeout is in nano sec. -1 for no timeout.
- *
- * Return: TRUE if waiting succeeded. FALSE if timeout expired.
- */
-
-int red_channel_client_wait_pipe_item_sent(RedChannelClient *rcc,
- PipeItem *item,
- int64_t timeout);
-int red_channel_client_wait_outgoing_item(RedChannelClient *rcc,
- int64_t timeout);
-int red_channel_wait_all_sent(RedChannel *channel,
- int64_t timeout);
-
-#endif
diff --git a/server/red_client_cache.h b/server/red_client_cache.h
deleted file mode 100644
index dc314c05..00000000
--- a/server/red_client_cache.h
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#if defined(CLIENT_CURSOR_CACHE)
-
-#define CACHE_NAME cursor_cache
-#define CACHE_HASH_KEY CURSOR_CACHE_HASH_KEY
-#define CACHE_HASH_SIZE CURSOR_CACHE_HASH_SIZE
-#define CACHE_INVAL_TYPE SPICE_MSG_CURSOR_INVAL_ONE
-#define FUNC_NAME(name) red_cursor_cache_##name
-#define VAR_NAME(name) cursor_cache_##name
-#define CHANNEL CursorChannel
-#define CHANNELCLIENT CursorChannelClient
-
-#elif defined(CLIENT_PALETTE_CACHE)
-
-#define CACHE_NAME palette_cache
-#define CACHE_HASH_KEY PALETTE_CACHE_HASH_KEY
-#define CACHE_HASH_SIZE PALETTE_CACHE_HASH_SIZE
-#define CACHE_INVAL_TYPE SPICE_MSG_DISPLAY_INVAL_PALETTE
-#define FUNC_NAME(name) red_palette_cache_##name
-#define VAR_NAME(name) palette_cache_##name
-#define CHANNEL DisplayChannel
-#define CHANNELCLIENT DisplayChannelClient
-#else
-
-#error "no cache type."
-
-#endif
-
-#define CHANNEL_FROM_RCC(rcc) SPICE_CONTAINEROF((rcc)->channel, CHANNEL, common.base);
-
-static CacheItem *FUNC_NAME(find)(CHANNELCLIENT *channel_client, uint64_t id)
-{
- CacheItem *item = channel_client->CACHE_NAME[CACHE_HASH_KEY(id)];
-
- while (item) {
- if (item->id == id) {
- ring_remove(&item->u.cache_data.lru_link);
- ring_add(&channel_client->VAR_NAME(lru), &item->u.cache_data.lru_link);
- break;
- }
- item = item->u.cache_data.next;
- }
- return item;
-}
-
-static void FUNC_NAME(remove)(CHANNELCLIENT *channel_client, CacheItem *item)
-{
- CacheItem **now;
- CHANNEL *channel = CHANNEL_FROM_RCC(&channel_client->common.base);
- spice_assert(item);
-
- now = &channel_client->CACHE_NAME[CACHE_HASH_KEY(item->id)];
- for (;;) {
- spice_assert(*now);
- if (*now == item) {
- *now = item->u.cache_data.next;
- break;
- }
- now = &(*now)->u.cache_data.next;
- }
- ring_remove(&item->u.cache_data.lru_link);
- channel_client->VAR_NAME(items)--;
- channel_client->VAR_NAME(available) += item->size;
-
- red_channel_pipe_item_init(&channel->common.base, &item->u.pipe_data, PIPE_ITEM_TYPE_INVAL_ONE);
- red_channel_client_pipe_add_tail(&channel_client->common.base, &item->u.pipe_data); // for now
-}
-
-static int FUNC_NAME(add)(CHANNELCLIENT *channel_client, uint64_t id, size_t size)
-{
- CacheItem *item;
- int key;
-
- item = spice_new(CacheItem, 1);
-
- channel_client->VAR_NAME(available) -= size;
- while (channel_client->VAR_NAME(available) < 0) {
- CacheItem *tail = (CacheItem *)ring_get_tail(&channel_client->VAR_NAME(lru));
- if (!tail) {
- channel_client->VAR_NAME(available) += size;
- free(item);
- return FALSE;
- }
- FUNC_NAME(remove)(channel_client, tail);
- }
- ++channel_client->VAR_NAME(items);
- item->u.cache_data.next = channel_client->CACHE_NAME[(key = CACHE_HASH_KEY(id))];
- channel_client->CACHE_NAME[key] = item;
- ring_item_init(&item->u.cache_data.lru_link);
- ring_add(&channel_client->VAR_NAME(lru), &item->u.cache_data.lru_link);
- item->id = id;
- item->size = size;
- item->inval_type = CACHE_INVAL_TYPE;
- return TRUE;
-}
-
-static void FUNC_NAME(reset)(CHANNELCLIENT *channel_client, long size)
-{
- int i;
-
- for (i = 0; i < CACHE_HASH_SIZE; i++) {
- while (channel_client->CACHE_NAME[i]) {
- CacheItem *item = channel_client->CACHE_NAME[i];
- channel_client->CACHE_NAME[i] = item->u.cache_data.next;
- free(item);
- }
- }
- ring_init(&channel_client->VAR_NAME(lru));
- channel_client->VAR_NAME(available) = size;
- channel_client->VAR_NAME(items) = 0;
-}
-
-
-#undef CACHE_NAME
-#undef CACHE_HASH_KEY
-#undef CACHE_HASH_SIZE
-#undef CACHE_INVAL_TYPE
-#undef CACHE_MAX_CLIENT_SIZE
-#undef FUNC_NAME
-#undef VAR_NAME
-#undef CHANNEL
-#undef CHANNELCLIENT
-#undef CHANNEL_FROM_RCC
diff --git a/server/red_client_shared_cache.h b/server/red_client_shared_cache.h
deleted file mode 100644
index 821ee189..00000000
--- a/server/red_client_shared_cache.h
+++ /dev/null
@@ -1,235 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#if defined(CLIENT_PIXMAPS_CACHE)
-
-#define CACHE PixmapCache
-
-#define CACHE_NAME bits_cache
-#define CACHE_HASH_KEY BITS_CACHE_HASH_KEY
-#define CACHE_HASH_SIZE BITS_CACHE_HASH_SIZE
-#define PIPE_ITEM_TYPE PIPE_ITEM_TYPE_INVAL_PIXMAP
-#define FUNC_NAME(name) pixmap_cache_##name
-#define PRIVATE_FUNC_NAME(name) __pixmap_cache_##name
-#define CHANNEL DisplayChannel
-#define CACH_GENERATION pixmap_cache_generation
-#define INVAL_ALL_VERB SPICE_MSG_DISPLAY_INVAL_ALL_PIXMAPS
-#else
-
-#error "no cache type."
-
-#endif
-
-#define CHANNEL_FROM_RCC(rcc) SPICE_CONTAINEROF((rcc)->channel, CHANNEL, common.base);
-
-static int FUNC_NAME(hit)(CACHE *cache, uint64_t id, int *lossy, DisplayChannelClient *dcc)
-{
- NewCacheItem *item;
- uint64_t serial;
-
- serial = red_channel_client_get_message_serial(&dcc->common.base);
- pthread_mutex_lock(&cache->lock);
- item = cache->hash_table[CACHE_HASH_KEY(id)];
-
- while (item) {
- if (item->id == id) {
- ring_remove(&item->lru_link);
- ring_add(&cache->lru, &item->lru_link);
- spice_assert(dcc->common.id < MAX_CACHE_CLIENTS);
- item->sync[dcc->common.id] = serial;
- cache->sync[dcc->common.id] = serial;
- *lossy = item->lossy;
- break;
- }
- item = item->next;
- }
- pthread_mutex_unlock(&cache->lock);
-
- return !!item;
-}
-
-static int FUNC_NAME(set_lossy)(CACHE *cache, uint64_t id, int lossy)
-{
- NewCacheItem *item;
- pthread_mutex_lock(&cache->lock);
-
- item = cache->hash_table[CACHE_HASH_KEY(id)];
-
- while (item) {
- if (item->id == id) {
- item->lossy = lossy;
- break;
- }
- item = item->next;
- }
- pthread_mutex_unlock(&cache->lock);
- return !!item;
-}
-
-static int FUNC_NAME(add)(CACHE *cache, uint64_t id, uint32_t size, int lossy, DisplayChannelClient *dcc)
-{
- NewCacheItem *item;
- uint64_t serial;
- int key;
-
- spice_assert(size > 0);
-
- item = spice_new(NewCacheItem, 1);
- serial = red_channel_client_get_message_serial(&dcc->common.base);
-
- pthread_mutex_lock(&cache->lock);
-
- if (cache->generation != dcc->CACH_GENERATION) {
- if (!dcc->pending_pixmaps_sync) {
- red_channel_client_pipe_add_type(
- &dcc->common.base, PIPE_ITEM_TYPE_PIXMAP_SYNC);
- dcc->pending_pixmaps_sync = TRUE;
- }
- pthread_mutex_unlock(&cache->lock);
- free(item);
- return FALSE;
- }
-
- cache->available -= size;
- while (cache->available < 0) {
- NewCacheItem *tail;
- NewCacheItem **now;
-
- if (!(tail = (NewCacheItem *)ring_get_tail(&cache->lru)) ||
- tail->sync[dcc->common.id] == serial) {
- cache->available += size;
- pthread_mutex_unlock(&cache->lock);
- free(item);
- return FALSE;
- }
-
- now = &cache->hash_table[CACHE_HASH_KEY(tail->id)];
- for (;;) {
- spice_assert(*now);
- if (*now == tail) {
- *now = tail->next;
- break;
- }
- now = &(*now)->next;
- }
- ring_remove(&tail->lru_link);
- cache->items--;
- cache->available += tail->size;
- cache->sync[dcc->common.id] = serial;
- display_channel_push_release(dcc, SPICE_RES_TYPE_PIXMAP, tail->id, tail->sync);
- free(tail);
- }
- ++cache->items;
- item->next = cache->hash_table[(key = CACHE_HASH_KEY(id))];
- cache->hash_table[key] = item;
- ring_item_init(&item->lru_link);
- ring_add(&cache->lru, &item->lru_link);
- item->id = id;
- item->size = size;
- item->lossy = lossy;
- memset(item->sync, 0, sizeof(item->sync));
- item->sync[dcc->common.id] = serial;
- cache->sync[dcc->common.id] = serial;
- pthread_mutex_unlock(&cache->lock);
- return TRUE;
-}
-
-static void PRIVATE_FUNC_NAME(clear)(CACHE *cache)
-{
- NewCacheItem *item;
-
- if (cache->freezed) {
- cache->lru.next = cache->freezed_head;
- cache->lru.prev = cache->freezed_tail;
- cache->freezed = FALSE;
- }
-
- while ((item = (NewCacheItem *)ring_get_head(&cache->lru))) {
- ring_remove(&item->lru_link);
- free(item);
- }
- memset(cache->hash_table, 0, sizeof(*cache->hash_table) * CACHE_HASH_SIZE);
-
- cache->available = cache->size;
- cache->items = 0;
-}
-
-static void FUNC_NAME(reset)(CACHE *cache, DisplayChannelClient *dcc, SpiceMsgWaitForChannels* sync_data)
-{
- uint8_t wait_count;
- uint64_t serial;
- uint32_t i;
-
- serial = red_channel_client_get_message_serial(&dcc->common.base);
- pthread_mutex_lock(&cache->lock);
- PRIVATE_FUNC_NAME(clear)(cache);
-
- dcc->CACH_GENERATION = ++cache->generation;
- cache->generation_initiator.client = dcc->common.id;
- cache->generation_initiator.message = serial;
- cache->sync[dcc->common.id] = serial;
-
- wait_count = 0;
- for (i = 0; i < MAX_CACHE_CLIENTS; i++) {
- if (cache->sync[i] && i != dcc->common.id) {
- sync_data->wait_list[wait_count].channel_type = SPICE_CHANNEL_DISPLAY;
- sync_data->wait_list[wait_count].channel_id = i;
- sync_data->wait_list[wait_count++].message_serial = cache->sync[i];
- }
- }
- sync_data->wait_count = wait_count;
- pthread_mutex_unlock(&cache->lock);
-}
-
-static int FUNC_NAME(freeze)(CACHE *cache)
-{
- pthread_mutex_lock(&cache->lock);
-
- if (cache->freezed) {
- pthread_mutex_unlock(&cache->lock);
- return FALSE;
- }
-
- cache->freezed_head = cache->lru.next;
- cache->freezed_tail = cache->lru.prev;
- ring_init(&cache->lru);
- memset(cache->hash_table, 0, sizeof(*cache->hash_table) * CACHE_HASH_SIZE);
- cache->available = -1;
- cache->freezed = TRUE;
-
- pthread_mutex_unlock(&cache->lock);
- return TRUE;
-}
-
-static void FUNC_NAME(destroy)(CACHE *cache)
-{
- spice_assert(cache);
-
- pthread_mutex_lock(&cache->lock);
- PRIVATE_FUNC_NAME(clear)(cache);
- pthread_mutex_unlock(&cache->lock);
-}
-
-#undef CACHE_NAME
-#undef CACHE_HASH_KEY
-#undef CACHE_HASH_SIZE
-#undef CACHE_INVAL_TYPE
-#undef CACHE_MAX_CLIENT_SIZE
-#undef FUNC_NAME
-#undef VAR_NAME
-#undef CHANNEL
-#undef CHANNEL_FROM_RCC
diff --git a/server/red_common.h b/server/red_common.h
deleted file mode 100644
index b6b643ac..00000000
--- a/server/red_common.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_RED_COMMON
-#define _H_RED_COMMON
-
-#include <sys/uio.h>
-#include <openssl/ssl.h>
-#include <spice/macros.h>
-
-#include "common/mem.h"
-#include "common/spice_common.h"
-#include "common/messages.h"
-#include "common/lz_common.h"
-
-#include "spice.h"
-
-#define SPICE_GNUC_VISIBLE __attribute__ ((visibility ("default")))
-
-enum {
- STREAM_VIDEO_INVALID,
- STREAM_VIDEO_OFF,
- STREAM_VIDEO_ALL,
- STREAM_VIDEO_FILTER
-};
-
-static const LzImageType MAP_BITMAP_FMT_TO_LZ_IMAGE_TYPE[] = {
- LZ_IMAGE_TYPE_INVALID,
- LZ_IMAGE_TYPE_PLT1_LE,
- LZ_IMAGE_TYPE_PLT1_BE,
- LZ_IMAGE_TYPE_PLT4_LE,
- LZ_IMAGE_TYPE_PLT4_BE,
- LZ_IMAGE_TYPE_PLT8,
- LZ_IMAGE_TYPE_RGB16,
- LZ_IMAGE_TYPE_RGB24,
- LZ_IMAGE_TYPE_RGB32,
- LZ_IMAGE_TYPE_RGBA,
- LZ_IMAGE_TYPE_A8
-};
-
-static inline int bitmap_fmt_is_rgb(uint8_t fmt)
-{
- static const int BITMAP_FMT_IS_RGB[SPICE_BITMAP_FMT_ENUM_END] =
- {0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1};
-
- if (fmt >= SPICE_BITMAP_FMT_ENUM_END) {
- spice_warning("fmt >= SPICE_BITMAP_FMT_ENUM_END; %d >= %d",
- fmt, SPICE_BITMAP_FMT_ENUM_END);
- return 0;
- }
- return BITMAP_FMT_IS_RGB[fmt];
-}
-
-#endif
diff --git a/server/red_dispatcher.c b/server/red_dispatcher.c
deleted file mode 100644
index a6ffe7be..00000000
--- a/server/red_dispatcher.c
+++ /dev/null
@@ -1,1197 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <errno.h>
-#include <string.h>
-#include <pthread.h>
-#include <sys/socket.h>
-#include <signal.h>
-#include <inttypes.h>
-
-#include <spice/qxl_dev.h>
-#include "common/quic.h"
-
-#include "spice.h"
-#include "red_worker.h"
-#include "reds_sw_canvas.h"
-#ifdef USE_OPENGL
-#include "reds_gl_canvas.h"
-#endif // USE_OPENGL
-#include "reds.h"
-#include "dispatcher.h"
-#include "red_parse_qxl.h"
-#include "spice_server_utils.h"
-
-#include "red_dispatcher.h"
-
-static int num_active_workers = 0;
-
-struct AsyncCommand {
- RingItem link;
- RedWorkerMessage message;
- uint64_t cookie;
-};
-
-struct RedDispatcher {
- QXLWorker base;
- QXLInstance *qxl;
- Dispatcher dispatcher;
- pthread_t worker_thread;
- uint32_t pending;
- int primary_active;
- int x_res;
- int y_res;
- int use_hardware_cursor;
- RedDispatcher *next;
- Ring async_commands;
- pthread_mutex_t async_lock;
- QXLDevSurfaceCreate surface_create;
-};
-
-typedef struct RedWorkeState {
- uint8_t *io_base;
- unsigned long phys_delta;
-
- uint32_t x_res;
- uint32_t y_res;
- uint32_t bits;
- uint32_t stride;
-} RedWorkeState;
-
-extern uint32_t streaming_video;
-extern spice_image_compression_t image_compression;
-extern spice_wan_compression_t jpeg_state;
-extern spice_wan_compression_t zlib_glz_state;
-
-static RedDispatcher *dispatchers = NULL;
-
-static int red_dispatcher_check_qxl_version(RedDispatcher *rd, int major, int minor)
-{
- int qxl_major = rd->qxl->st->qif->base.major_version;
- int qxl_minor = rd->qxl->st->qif->base.minor_version;
-
- return ((qxl_major > major) ||
- ((qxl_major == major) && (qxl_minor >= minor)));
-}
-
-static void red_dispatcher_set_display_peer(RedChannel *channel, RedClient *client,
- RedsStream *stream, int migration,
- int num_common_caps, uint32_t *common_caps, int num_caps,
- uint32_t *caps)
-{
- RedWorkerMessageDisplayConnect payload = {0,};
- RedDispatcher *dispatcher;
-
- spice_debug("%s", "");
- dispatcher = (RedDispatcher *)channel->data;
- payload.client = client;
- payload.stream = stream;
- payload.migration = migration;
- payload.num_common_caps = num_common_caps;
- payload.common_caps = spice_malloc(sizeof(uint32_t)*num_common_caps);
- payload.num_caps = num_caps;
- payload.caps = spice_malloc(sizeof(uint32_t)*num_caps);
-
- memcpy(payload.common_caps, common_caps, sizeof(uint32_t)*num_common_caps);
- memcpy(payload.caps, caps, sizeof(uint32_t)*num_caps);
-
- dispatcher_send_message(&dispatcher->dispatcher,
- RED_WORKER_MESSAGE_DISPLAY_CONNECT,
- &payload);
-}
-
-static void red_dispatcher_disconnect_display_peer(RedChannelClient *rcc)
-{
- RedWorkerMessageDisplayDisconnect payload;
- RedDispatcher *dispatcher;
-
- if (!rcc->channel) {
- return;
- }
-
- dispatcher = (RedDispatcher *)rcc->channel->data;
-
- spice_printerr("");
- payload.rcc = rcc;
-
- // TODO: we turned it to be sync, due to client_destroy . Should we support async? - for this we will need ref count
- // for channels
- dispatcher_send_message(&dispatcher->dispatcher,
- RED_WORKER_MESSAGE_DISPLAY_DISCONNECT,
- &payload);
-}
-
-static void red_dispatcher_display_migrate(RedChannelClient *rcc)
-{
- RedWorkerMessageDisplayMigrate payload;
- RedDispatcher *dispatcher;
- if (!rcc->channel) {
- return;
- }
- dispatcher = (RedDispatcher *)rcc->channel->data;
- spice_printerr("channel type %u id %u", rcc->channel->type, rcc->channel->id);
- payload.rcc = rcc;
- dispatcher_send_message(&dispatcher->dispatcher,
- RED_WORKER_MESSAGE_DISPLAY_MIGRATE,
- &payload);
-}
-
-static void red_dispatcher_set_cursor_peer(RedChannel *channel, RedClient *client, RedsStream *stream,
- int migration, int num_common_caps,
- uint32_t *common_caps, int num_caps,
- uint32_t *caps)
-{
- RedWorkerMessageCursorConnect payload = {0,};
- RedDispatcher *dispatcher = (RedDispatcher *)channel->data;
- spice_printerr("");
- payload.client = client;
- payload.stream = stream;
- payload.migration = migration;
- payload.num_common_caps = num_common_caps;
- payload.common_caps = spice_malloc(sizeof(uint32_t)*num_common_caps);
- payload.num_caps = num_caps;
- payload.caps = spice_malloc(sizeof(uint32_t)*num_caps);
-
- memcpy(payload.common_caps, common_caps, sizeof(uint32_t)*num_common_caps);
- memcpy(payload.caps, caps, sizeof(uint32_t)*num_caps);
-
- dispatcher_send_message(&dispatcher->dispatcher,
- RED_WORKER_MESSAGE_CURSOR_CONNECT,
- &payload);
-}
-
-static void red_dispatcher_disconnect_cursor_peer(RedChannelClient *rcc)
-{
- RedWorkerMessageCursorDisconnect payload;
- RedDispatcher *dispatcher;
-
- if (!rcc->channel) {
- return;
- }
-
- dispatcher = (RedDispatcher *)rcc->channel->data;
- spice_printerr("");
- payload.rcc = rcc;
-
- dispatcher_send_message(&dispatcher->dispatcher,
- RED_WORKER_MESSAGE_CURSOR_DISCONNECT,
- &payload);
-}
-
-static void red_dispatcher_cursor_migrate(RedChannelClient *rcc)
-{
- RedWorkerMessageCursorMigrate payload;
- RedDispatcher *dispatcher;
-
- if (!rcc->channel) {
- return;
- }
- dispatcher = (RedDispatcher *)rcc->channel->data;
- spice_printerr("channel type %u id %u", rcc->channel->type, rcc->channel->id);
- payload.rcc = rcc;
- dispatcher_send_message(&dispatcher->dispatcher,
- RED_WORKER_MESSAGE_CURSOR_MIGRATE,
- &payload);
-}
-
-typedef struct RendererInfo {
- int id;
- const char *name;
-} RendererInfo;
-
-static RendererInfo renderers_info[] = {
- {RED_RENDERER_SW, "sw"},
-#ifdef USE_OPENGL
- {RED_RENDERER_OGL_PBUF, "oglpbuf"},
- {RED_RENDERER_OGL_PIXMAP, "oglpixmap"},
-#endif
- {RED_RENDERER_INVALID, NULL},
-};
-
-static uint32_t renderers[RED_MAX_RENDERERS];
-static uint32_t num_renderers = 0;
-
-static RendererInfo *find_renderer(const char *name)
-{
- RendererInfo *inf = renderers_info;
- while (inf->name) {
- if (strcmp(name, inf->name) == 0) {
- return inf;
- }
- inf++;
- }
- return NULL;
-}
-
-int red_dispatcher_add_renderer(const char *name)
-{
- RendererInfo *inf;
-
- if (num_renderers == RED_MAX_RENDERERS || !(inf = find_renderer(name))) {
- return FALSE;
- }
- renderers[num_renderers++] = inf->id;
- return TRUE;
-}
-
-int red_dispatcher_qxl_count(void)
-{
- return num_active_workers;
-}
-
-static void update_client_mouse_allowed(void)
-{
- static int allowed = FALSE;
- int allow_now = FALSE;
- int x_res = 0;
- int y_res = 0;
-
- if (num_active_workers > 0) {
- allow_now = TRUE;
- RedDispatcher *now = dispatchers;
- while (now && allow_now) {
- if (now->primary_active) {
- allow_now = now->use_hardware_cursor;
- if (num_active_workers == 1) {
- if (allow_now) {
- x_res = now->x_res;
- y_res = now->y_res;
- }
- break;
- }
- }
- now = now->next;
- }
- }
-
- if (allow_now || allow_now != allowed) {
- allowed = allow_now;
- reds_set_client_mouse_allowed(allowed, x_res, y_res);
- }
-}
-
-static void red_dispatcher_update_area(RedDispatcher *dispatcher, uint32_t surface_id,
- QXLRect *qxl_area, QXLRect *qxl_dirty_rects,
- uint32_t num_dirty_rects, uint32_t clear_dirty_region)
-{
- RedWorkerMessageUpdate payload = {0,};
-
- payload.surface_id = surface_id;
- payload.qxl_area = qxl_area;
- payload.qxl_dirty_rects = qxl_dirty_rects;
- payload.num_dirty_rects = num_dirty_rects;
- payload.clear_dirty_region = clear_dirty_region;
- dispatcher_send_message(&dispatcher->dispatcher,
- RED_WORKER_MESSAGE_UPDATE,
- &payload);
-}
-
-int red_dispatcher_use_client_monitors_config(void)
-{
- RedDispatcher *now = dispatchers;
-
- if (num_active_workers == 0) {
- return FALSE;
- }
-
- for (; now ; now = now->next) {
- if (!red_dispatcher_check_qxl_version(now, 3, 3) ||
- !now->qxl->st->qif->client_monitors_config ||
- !now->qxl->st->qif->client_monitors_config(now->qxl, NULL)) {
- return FALSE;
- }
- }
- return TRUE;
-}
-
-void red_dispatcher_client_monitors_config(VDAgentMonitorsConfig *monitors_config)
-{
- RedDispatcher *now = dispatchers;
-
- while (now) {
- if (!now->qxl->st->qif->client_monitors_config ||
- !now->qxl->st->qif->client_monitors_config(now->qxl,
- monitors_config)) {
- /* this is a normal condition, some qemu devices might not implement it */
- spice_debug("QXLInterface::client_monitors_config failed\n");
- }
- now = now->next;
- }
-}
-
-static AsyncCommand *async_command_alloc(RedDispatcher *dispatcher,
- RedWorkerMessage message,
- uint64_t cookie)
-{
- AsyncCommand *async_command = spice_new0(AsyncCommand, 1);
-
- pthread_mutex_lock(&dispatcher->async_lock);
- async_command->cookie = cookie;
- async_command->message = message;
- ring_add(&dispatcher->async_commands, &async_command->link);
- pthread_mutex_unlock(&dispatcher->async_lock);
- spice_debug("%p", async_command);
- return async_command;
-}
-
-static void red_dispatcher_update_area_async(RedDispatcher *dispatcher,
- uint32_t surface_id,
- QXLRect *qxl_area,
- uint32_t clear_dirty_region,
- uint64_t cookie)
-{
- RedWorkerMessage message = RED_WORKER_MESSAGE_UPDATE_ASYNC;
- RedWorkerMessageUpdateAsync payload;
-
- payload.base.cmd = async_command_alloc(dispatcher, message, cookie);
- payload.surface_id = surface_id;
- payload.qxl_area = *qxl_area;
- payload.clear_dirty_region = clear_dirty_region;
- dispatcher_send_message(&dispatcher->dispatcher,
- message,
- &payload);
-}
-
-static void qxl_worker_update_area(QXLWorker *qxl_worker, uint32_t surface_id,
- QXLRect *qxl_area, QXLRect *qxl_dirty_rects,
- uint32_t num_dirty_rects, uint32_t clear_dirty_region)
-{
- red_dispatcher_update_area((RedDispatcher*)qxl_worker, surface_id, qxl_area,
- qxl_dirty_rects, num_dirty_rects, clear_dirty_region);
-}
-
-static void red_dispatcher_add_memslot(RedDispatcher *dispatcher, QXLDevMemSlot *mem_slot)
-{
- RedWorkerMessageAddMemslot payload;
-
- payload.mem_slot = *mem_slot;
- dispatcher_send_message(&dispatcher->dispatcher,
- RED_WORKER_MESSAGE_ADD_MEMSLOT,
- &payload);
-}
-
-static void qxl_worker_add_memslot(QXLWorker *qxl_worker, QXLDevMemSlot *mem_slot)
-{
- red_dispatcher_add_memslot((RedDispatcher*)qxl_worker, mem_slot);
-}
-
-static void red_dispatcher_add_memslot_async(RedDispatcher *dispatcher, QXLDevMemSlot *mem_slot, uint64_t cookie)
-{
- RedWorkerMessageAddMemslotAsync payload;
- RedWorkerMessage message = RED_WORKER_MESSAGE_ADD_MEMSLOT_ASYNC;
-
- payload.base.cmd = async_command_alloc(dispatcher, message, cookie);
- payload.mem_slot = *mem_slot;
- dispatcher_send_message(&dispatcher->dispatcher, message, &payload);
-}
-
-static void red_dispatcher_del_memslot(RedDispatcher *dispatcher, uint32_t slot_group_id, uint32_t slot_id)
-{
- RedWorkerMessageDelMemslot payload;
- RedWorkerMessage message = RED_WORKER_MESSAGE_DEL_MEMSLOT;
-
- payload.slot_group_id = slot_group_id;
- payload.slot_id = slot_id;
- dispatcher_send_message(&dispatcher->dispatcher, message, &payload);
-}
-
-static void qxl_worker_del_memslot(QXLWorker *qxl_worker, uint32_t slot_group_id, uint32_t slot_id)
-{
- red_dispatcher_del_memslot((RedDispatcher*)qxl_worker, slot_group_id, slot_id);
-}
-
-static void red_dispatcher_destroy_surfaces(RedDispatcher *dispatcher)
-{
- RedWorkerMessageDestroySurfaces payload;
-
- dispatcher_send_message(&dispatcher->dispatcher,
- RED_WORKER_MESSAGE_DESTROY_SURFACES,
- &payload);
-}
-
-static void qxl_worker_destroy_surfaces(QXLWorker *qxl_worker)
-{
- red_dispatcher_destroy_surfaces((RedDispatcher*)qxl_worker);
-}
-
-static void red_dispatcher_destroy_surfaces_async(RedDispatcher *dispatcher, uint64_t cookie)
-{
- RedWorkerMessageDestroySurfacesAsync payload;
- RedWorkerMessage message = RED_WORKER_MESSAGE_DESTROY_SURFACES_ASYNC;
-
- payload.base.cmd = async_command_alloc(dispatcher, message, cookie);
- dispatcher_send_message(&dispatcher->dispatcher, message, &payload);
-}
-
-static void red_dispatcher_destroy_primary_surface_complete(RedDispatcher *dispatcher)
-{
- dispatcher->x_res = 0;
- dispatcher->y_res = 0;
- dispatcher->use_hardware_cursor = FALSE;
- dispatcher->primary_active = FALSE;
-
- update_client_mouse_allowed();
-}
-
-static void
-red_dispatcher_destroy_primary_surface_sync(RedDispatcher *dispatcher,
- uint32_t surface_id)
-{
- RedWorkerMessageDestroyPrimarySurface payload;
- payload.surface_id = surface_id;
- dispatcher_send_message(&dispatcher->dispatcher,
- RED_WORKER_MESSAGE_DESTROY_PRIMARY_SURFACE,
- &payload);
- red_dispatcher_destroy_primary_surface_complete(dispatcher);
-}
-
-static void
-red_dispatcher_destroy_primary_surface_async(RedDispatcher *dispatcher,
- uint32_t surface_id, uint64_t cookie)
-{
- RedWorkerMessageDestroyPrimarySurfaceAsync payload;
- RedWorkerMessage message = RED_WORKER_MESSAGE_DESTROY_PRIMARY_SURFACE_ASYNC;
-
- payload.base.cmd = async_command_alloc(dispatcher, message, cookie);
- payload.surface_id = surface_id;
- dispatcher_send_message(&dispatcher->dispatcher, message, &payload);
-}
-
-static void
-red_dispatcher_destroy_primary_surface(RedDispatcher *dispatcher,
- uint32_t surface_id, int async, uint64_t cookie)
-{
- if (async) {
- red_dispatcher_destroy_primary_surface_async(dispatcher, surface_id, cookie);
- } else {
- red_dispatcher_destroy_primary_surface_sync(dispatcher, surface_id);
- }
-}
-
-static void qxl_worker_destroy_primary_surface(QXLWorker *qxl_worker, uint32_t surface_id)
-{
- red_dispatcher_destroy_primary_surface((RedDispatcher*)qxl_worker, surface_id, 0, 0);
-}
-
-static void red_dispatcher_create_primary_surface_complete(RedDispatcher *dispatcher)
-{
- QXLDevSurfaceCreate *surface = &dispatcher->surface_create;
-
- dispatcher->x_res = surface->width;
- dispatcher->y_res = surface->height;
- dispatcher->use_hardware_cursor = surface->mouse_mode;
- dispatcher->primary_active = TRUE;
-
- update_client_mouse_allowed();
- memset(&dispatcher->surface_create, 0, sizeof(QXLDevSurfaceCreate));
-}
-
-static void
-red_dispatcher_create_primary_surface_async(RedDispatcher *dispatcher, uint32_t surface_id,
- QXLDevSurfaceCreate *surface, uint64_t cookie)
-{
- RedWorkerMessageCreatePrimarySurfaceAsync payload;
- RedWorkerMessage message = RED_WORKER_MESSAGE_CREATE_PRIMARY_SURFACE_ASYNC;
-
- dispatcher->surface_create = *surface;
- payload.base.cmd = async_command_alloc(dispatcher, message, cookie);
- payload.surface_id = surface_id;
- payload.surface = *surface;
- dispatcher_send_message(&dispatcher->dispatcher, message, &payload);
-}
-
-static void
-red_dispatcher_create_primary_surface_sync(RedDispatcher *dispatcher, uint32_t surface_id,
- QXLDevSurfaceCreate *surface)
-{
- RedWorkerMessageCreatePrimarySurface payload = {0,};
-
- dispatcher->surface_create = *surface;
- payload.surface_id = surface_id;
- payload.surface = *surface;
- dispatcher_send_message(&dispatcher->dispatcher,
- RED_WORKER_MESSAGE_CREATE_PRIMARY_SURFACE,
- &payload);
- red_dispatcher_create_primary_surface_complete(dispatcher);
-}
-
-static void
-red_dispatcher_create_primary_surface(RedDispatcher *dispatcher, uint32_t surface_id,
- QXLDevSurfaceCreate *surface, int async, uint64_t cookie)
-{
- if (async) {
- red_dispatcher_create_primary_surface_async(dispatcher, surface_id, surface, cookie);
- } else {
- red_dispatcher_create_primary_surface_sync(dispatcher, surface_id, surface);
- }
-}
-
-static void qxl_worker_create_primary_surface(QXLWorker *qxl_worker, uint32_t surface_id,
- QXLDevSurfaceCreate *surface)
-{
- red_dispatcher_create_primary_surface((RedDispatcher*)qxl_worker, surface_id, surface, 0, 0);
-}
-
-static void red_dispatcher_reset_image_cache(RedDispatcher *dispatcher)
-{
- RedWorkerMessageResetImageCache payload;
-
- dispatcher_send_message(&dispatcher->dispatcher,
- RED_WORKER_MESSAGE_RESET_IMAGE_CACHE,
- &payload);
-}
-
-static void qxl_worker_reset_image_cache(QXLWorker *qxl_worker)
-{
- red_dispatcher_reset_image_cache((RedDispatcher*)qxl_worker);
-}
-
-static void red_dispatcher_reset_cursor(RedDispatcher *dispatcher)
-{
- RedWorkerMessageResetCursor payload;
-
- dispatcher_send_message(&dispatcher->dispatcher,
- RED_WORKER_MESSAGE_RESET_CURSOR,
- &payload);
-}
-
-static void qxl_worker_reset_cursor(QXLWorker *qxl_worker)
-{
- red_dispatcher_reset_cursor((RedDispatcher*)qxl_worker);
-}
-
-static void red_dispatcher_destroy_surface_wait_sync(RedDispatcher *dispatcher,
- uint32_t surface_id)
-{
- RedWorkerMessageDestroySurfaceWait payload;
-
- payload.surface_id = surface_id;
- dispatcher_send_message(&dispatcher->dispatcher,
- RED_WORKER_MESSAGE_DESTROY_SURFACE_WAIT,
- &payload);
-}
-
-static void red_dispatcher_destroy_surface_wait_async(RedDispatcher *dispatcher,
- uint32_t surface_id,
- uint64_t cookie)
-{
- RedWorkerMessageDestroySurfaceWaitAsync payload;
- RedWorkerMessage message = RED_WORKER_MESSAGE_DESTROY_SURFACE_WAIT_ASYNC;
-
- payload.base.cmd = async_command_alloc(dispatcher, message, cookie);
- payload.surface_id = surface_id;
- dispatcher_send_message(&dispatcher->dispatcher, message, &payload);
-}
-
-static void red_dispatcher_destroy_surface_wait(RedDispatcher *dispatcher,
- uint32_t surface_id,
- int async, uint64_t cookie)
-{
- if (async) {
- red_dispatcher_destroy_surface_wait_async(dispatcher, surface_id, cookie);
- } else {
- red_dispatcher_destroy_surface_wait_sync(dispatcher, surface_id);
- }
-}
-
-static void qxl_worker_destroy_surface_wait(QXLWorker *qxl_worker, uint32_t surface_id)
-{
- red_dispatcher_destroy_surface_wait((RedDispatcher*)qxl_worker, surface_id, 0, 0);
-}
-
-static void red_dispatcher_reset_memslots(RedDispatcher *dispatcher)
-{
- RedWorkerMessageResetMemslots payload;
-
- dispatcher_send_message(&dispatcher->dispatcher,
- RED_WORKER_MESSAGE_RESET_MEMSLOTS,
- &payload);
-}
-
-static void qxl_worker_reset_memslots(QXLWorker *qxl_worker)
-{
- red_dispatcher_reset_memslots((RedDispatcher*)qxl_worker);
-}
-
-static void red_dispatcher_wakeup(RedDispatcher *dispatcher)
-{
- RedWorkerMessageWakeup payload;
-
- if (test_bit(RED_WORKER_PENDING_WAKEUP, dispatcher->pending)) {
- return;
- }
- set_bit(RED_WORKER_PENDING_WAKEUP, &dispatcher->pending);
- dispatcher_send_message(&dispatcher->dispatcher,
- RED_WORKER_MESSAGE_WAKEUP,
- &payload);
-}
-
-static void qxl_worker_wakeup(QXLWorker *qxl_worker)
-{
- red_dispatcher_wakeup((RedDispatcher*)qxl_worker);
-}
-
-static void red_dispatcher_oom(RedDispatcher *dispatcher)
-{
- RedWorkerMessageOom payload;
-
- if (test_bit(RED_WORKER_PENDING_OOM, dispatcher->pending)) {
- return;
- }
- set_bit(RED_WORKER_PENDING_OOM, &dispatcher->pending);
- dispatcher_send_message(&dispatcher->dispatcher,
- RED_WORKER_MESSAGE_OOM,
- &payload);
-}
-
-static void qxl_worker_oom(QXLWorker *qxl_worker)
-{
- red_dispatcher_oom((RedDispatcher*)qxl_worker);
-}
-
-static void red_dispatcher_start(RedDispatcher *dispatcher)
-{
- RedWorkerMessageStart payload;
-
- dispatcher_send_message(&dispatcher->dispatcher,
- RED_WORKER_MESSAGE_START,
- &payload);
-}
-
-static void qxl_worker_start(QXLWorker *qxl_worker)
-{
- red_dispatcher_start((RedDispatcher*)qxl_worker);
-}
-
-static void red_dispatcher_flush_surfaces_async(RedDispatcher *dispatcher, uint64_t cookie)
-{
- RedWorkerMessageFlushSurfacesAsync payload;
- RedWorkerMessage message = RED_WORKER_MESSAGE_FLUSH_SURFACES_ASYNC;
-
- payload.base.cmd = async_command_alloc(dispatcher, message, cookie);
- dispatcher_send_message(&dispatcher->dispatcher, message, &payload);
-}
-
-static void red_dispatcher_monitors_config_async(RedDispatcher *dispatcher,
- QXLPHYSICAL monitors_config,
- int group_id,
- uint64_t cookie)
-{
- RedWorkerMessageMonitorsConfigAsync payload;
- RedWorkerMessage message = RED_WORKER_MESSAGE_MONITORS_CONFIG_ASYNC;
-
- payload.base.cmd = async_command_alloc(dispatcher, message, cookie);
- payload.monitors_config = monitors_config;
- payload.group_id = group_id;
-
- dispatcher_send_message(&dispatcher->dispatcher, message, &payload);
-}
-
-static void red_dispatcher_driver_unload(RedDispatcher *dispatcher)
-{
- RedWorkerMessageDriverUnload payload;
-
- dispatcher_send_message(&dispatcher->dispatcher,
- RED_WORKER_MESSAGE_DRIVER_UNLOAD,
- &payload);
-}
-
-static void red_dispatcher_stop(RedDispatcher *dispatcher)
-{
- RedWorkerMessageStop payload;
-
- dispatcher_send_message(&dispatcher->dispatcher,
- RED_WORKER_MESSAGE_STOP,
- &payload);
-}
-
-static void qxl_worker_stop(QXLWorker *qxl_worker)
-{
- red_dispatcher_stop((RedDispatcher*)qxl_worker);
-}
-
-static void red_dispatcher_loadvm_commands(RedDispatcher *dispatcher,
- struct QXLCommandExt *ext,
- uint32_t count)
-{
- RedWorkerMessageLoadvmCommands payload;
-
- spice_printerr("");
- payload.count = count;
- payload.ext = ext;
- dispatcher_send_message(&dispatcher->dispatcher,
- RED_WORKER_MESSAGE_LOADVM_COMMANDS,
- &payload);
-}
-
-static void qxl_worker_loadvm_commands(QXLWorker *qxl_worker,
- struct QXLCommandExt *ext,
- uint32_t count)
-{
- red_dispatcher_loadvm_commands((RedDispatcher*)qxl_worker, ext, count);
-}
-
-void red_dispatcher_set_mm_time(uint32_t mm_time)
-{
- RedDispatcher *now = dispatchers;
- while (now) {
- now->qxl->st->qif->set_mm_time(now->qxl, mm_time);
- now = now->next;
- }
-}
-
-static inline int calc_compression_level(void)
-{
- spice_assert(streaming_video != STREAM_VIDEO_INVALID);
- if ((streaming_video != STREAM_VIDEO_OFF) ||
- (image_compression != SPICE_IMAGE_COMPRESS_QUIC)) {
- return 0;
- } else {
- return 1;
- }
-}
-
-void red_dispatcher_on_ic_change(void)
-{
- RedWorkerMessageSetCompression payload;
- int compression_level = calc_compression_level();
- RedDispatcher *now = dispatchers;
-
- while (now) {
- now->qxl->st->qif->set_compression_level(now->qxl, compression_level);
- payload.image_compression = image_compression;
- dispatcher_send_message(&now->dispatcher,
- RED_WORKER_MESSAGE_SET_COMPRESSION,
- &payload);
- now = now->next;
- }
-}
-
-void red_dispatcher_on_sv_change(void)
-{
- RedWorkerMessageSetStreamingVideo payload;
- int compression_level = calc_compression_level();
- RedDispatcher *now = dispatchers;
- while (now) {
- now->qxl->st->qif->set_compression_level(now->qxl, compression_level);
- payload.streaming_video = streaming_video;
- dispatcher_send_message(&now->dispatcher,
- RED_WORKER_MESSAGE_SET_STREAMING_VIDEO,
- &payload);
- now = now->next;
- }
-}
-
-void red_dispatcher_set_mouse_mode(uint32_t mode)
-{
- RedWorkerMessageSetMouseMode payload;
- RedDispatcher *now = dispatchers;
- while (now) {
- payload.mode = mode;
- dispatcher_send_message(&now->dispatcher,
- RED_WORKER_MESSAGE_SET_MOUSE_MODE,
- &payload);
- now = now->next;
- }
-}
-
-void red_dispatcher_on_vm_stop(void)
-{
- RedDispatcher *now = dispatchers;
-
- spice_debug(NULL);
- while (now) {
- red_dispatcher_stop(now);
- now = now->next;
- }
-}
-
-void red_dispatcher_on_vm_start(void)
-{
- RedDispatcher *now = dispatchers;
-
- spice_debug(NULL);
- while (now) {
- red_dispatcher_start(now);
- now = now->next;
- }
-}
-
-int red_dispatcher_count(void)
-{
- RedDispatcher *now = dispatchers;
- int ret = 0;
-
- while (now) {
- ret++;
- now = now->next;
- }
- return ret;
-}
-
-uint32_t red_dispatcher_qxl_ram_size(void)
-{
- QXLDevInitInfo qxl_info;
- if (!dispatchers) {
- return 0;
- }
- dispatchers->qxl->st->qif->get_init_info(dispatchers->qxl, &qxl_info);
- return qxl_info.qxl_ram_size;
-}
-
-SPICE_GNUC_VISIBLE
-void spice_qxl_wakeup(QXLInstance *instance)
-{
- red_dispatcher_wakeup(instance->st->dispatcher);
-}
-
-SPICE_GNUC_VISIBLE
-void spice_qxl_oom(QXLInstance *instance)
-{
- red_dispatcher_oom(instance->st->dispatcher);
-}
-
-SPICE_GNUC_VISIBLE
-void spice_qxl_start(QXLInstance *instance)
-{
- red_dispatcher_start(instance->st->dispatcher);
-}
-
-SPICE_GNUC_VISIBLE
-void spice_qxl_stop(QXLInstance *instance)
-{
- red_dispatcher_stop(instance->st->dispatcher);
-}
-
-SPICE_GNUC_VISIBLE
-void spice_qxl_update_area(QXLInstance *instance, uint32_t surface_id,
- struct QXLRect *area, struct QXLRect *dirty_rects,
- uint32_t num_dirty_rects, uint32_t clear_dirty_region)
-{
- red_dispatcher_update_area(instance->st->dispatcher, surface_id, area, dirty_rects,
- num_dirty_rects, clear_dirty_region);
-}
-
-SPICE_GNUC_VISIBLE
-void spice_qxl_add_memslot(QXLInstance *instance, QXLDevMemSlot *slot)
-{
- red_dispatcher_add_memslot(instance->st->dispatcher, slot);
-}
-
-SPICE_GNUC_VISIBLE
-void spice_qxl_del_memslot(QXLInstance *instance, uint32_t slot_group_id, uint32_t slot_id)
-{
- red_dispatcher_del_memslot(instance->st->dispatcher, slot_group_id, slot_id);
-}
-
-SPICE_GNUC_VISIBLE
-void spice_qxl_reset_memslots(QXLInstance *instance)
-{
- red_dispatcher_reset_memslots(instance->st->dispatcher);
-}
-
-SPICE_GNUC_VISIBLE
-void spice_qxl_destroy_surfaces(QXLInstance *instance)
-{
- red_dispatcher_destroy_surfaces(instance->st->dispatcher);
-}
-
-SPICE_GNUC_VISIBLE
-void spice_qxl_destroy_primary_surface(QXLInstance *instance, uint32_t surface_id)
-{
- red_dispatcher_destroy_primary_surface(instance->st->dispatcher, surface_id, 0, 0);
-}
-
-SPICE_GNUC_VISIBLE
-void spice_qxl_create_primary_surface(QXLInstance *instance, uint32_t surface_id,
- QXLDevSurfaceCreate *surface)
-{
- red_dispatcher_create_primary_surface(instance->st->dispatcher, surface_id, surface, 0, 0);
-}
-
-SPICE_GNUC_VISIBLE
-void spice_qxl_reset_image_cache(QXLInstance *instance)
-{
- red_dispatcher_reset_image_cache(instance->st->dispatcher);
-}
-
-SPICE_GNUC_VISIBLE
-void spice_qxl_reset_cursor(QXLInstance *instance)
-{
- red_dispatcher_reset_cursor(instance->st->dispatcher);
-}
-
-SPICE_GNUC_VISIBLE
-void spice_qxl_destroy_surface_wait(QXLInstance *instance, uint32_t surface_id)
-{
- red_dispatcher_destroy_surface_wait(instance->st->dispatcher, surface_id, 0, 0);
-}
-
-SPICE_GNUC_VISIBLE
-void spice_qxl_loadvm_commands(QXLInstance *instance, struct QXLCommandExt *ext, uint32_t count)
-{
- red_dispatcher_loadvm_commands(instance->st->dispatcher, ext, count);
-}
-
-SPICE_GNUC_VISIBLE
-void spice_qxl_update_area_async(QXLInstance *instance, uint32_t surface_id, QXLRect *qxl_area,
- uint32_t clear_dirty_region, uint64_t cookie)
-{
- red_dispatcher_update_area_async(instance->st->dispatcher, surface_id, qxl_area,
- clear_dirty_region, cookie);
-}
-
-SPICE_GNUC_VISIBLE
-void spice_qxl_add_memslot_async(QXLInstance *instance, QXLDevMemSlot *slot, uint64_t cookie)
-{
- red_dispatcher_add_memslot_async(instance->st->dispatcher, slot, cookie);
-}
-
-SPICE_GNUC_VISIBLE
-void spice_qxl_destroy_surfaces_async(QXLInstance *instance, uint64_t cookie)
-{
- red_dispatcher_destroy_surfaces_async(instance->st->dispatcher, cookie);
-}
-
-SPICE_GNUC_VISIBLE
-void spice_qxl_destroy_primary_surface_async(QXLInstance *instance, uint32_t surface_id, uint64_t cookie)
-{
- red_dispatcher_destroy_primary_surface(instance->st->dispatcher, surface_id, 1, cookie);
-}
-
-SPICE_GNUC_VISIBLE
-void spice_qxl_create_primary_surface_async(QXLInstance *instance, uint32_t surface_id,
- QXLDevSurfaceCreate *surface, uint64_t cookie)
-{
- red_dispatcher_create_primary_surface(instance->st->dispatcher, surface_id, surface, 1, cookie);
-}
-
-SPICE_GNUC_VISIBLE
-void spice_qxl_destroy_surface_async(QXLInstance *instance, uint32_t surface_id, uint64_t cookie)
-{
- red_dispatcher_destroy_surface_wait(instance->st->dispatcher, surface_id, 1, cookie);
-}
-
-SPICE_GNUC_VISIBLE
-void spice_qxl_flush_surfaces_async(QXLInstance *instance, uint64_t cookie)
-{
- red_dispatcher_flush_surfaces_async(instance->st->dispatcher, cookie);
-}
-
-SPICE_GNUC_VISIBLE
-void spice_qxl_monitors_config_async(QXLInstance *instance, QXLPHYSICAL monitors_config,
- int group_id, uint64_t cookie)
-{
- red_dispatcher_monitors_config_async(instance->st->dispatcher, monitors_config, group_id, cookie);
-}
-
-SPICE_GNUC_VISIBLE
-void spice_qxl_driver_unload(QXLInstance *instance)
-{
- red_dispatcher_driver_unload(instance->st->dispatcher);
-}
-
-void red_dispatcher_async_complete(struct RedDispatcher *dispatcher,
- AsyncCommand *async_command)
-{
- pthread_mutex_lock(&dispatcher->async_lock);
- ring_remove(&async_command->link);
- spice_debug("%p: cookie %" PRId64, async_command, async_command->cookie);
- if (ring_is_empty(&dispatcher->async_commands)) {
- spice_debug("no more async commands");
- }
- pthread_mutex_unlock(&dispatcher->async_lock);
- switch (async_command->message) {
- case RED_WORKER_MESSAGE_UPDATE_ASYNC:
- break;
- case RED_WORKER_MESSAGE_ADD_MEMSLOT_ASYNC:
- break;
- case RED_WORKER_MESSAGE_DESTROY_SURFACES_ASYNC:
- break;
- case RED_WORKER_MESSAGE_CREATE_PRIMARY_SURFACE_ASYNC:
- red_dispatcher_create_primary_surface_complete(dispatcher);
- break;
- case RED_WORKER_MESSAGE_DESTROY_PRIMARY_SURFACE_ASYNC:
- red_dispatcher_destroy_primary_surface_complete(dispatcher);
- break;
- case RED_WORKER_MESSAGE_DESTROY_SURFACE_WAIT_ASYNC:
- break;
- case RED_WORKER_MESSAGE_FLUSH_SURFACES_ASYNC:
- break;
- case RED_WORKER_MESSAGE_MONITORS_CONFIG_ASYNC:
- break;
- default:
- spice_warning("unexpected message %d", async_command->message);
- }
- dispatcher->qxl->st->qif->async_complete(dispatcher->qxl,
- async_command->cookie);
- free(async_command);
-}
-
-static RedChannel *red_dispatcher_display_channel_create(RedDispatcher *dispatcher)
-{
- RedWorkerMessageDisplayChannelCreate payload;
- RedChannel *display_channel;
-
- dispatcher_send_message(&dispatcher->dispatcher,
- RED_WORKER_MESSAGE_DISPLAY_CHANNEL_CREATE,
- &payload);
- receive_data(dispatcher->dispatcher.send_fd, &display_channel, sizeof(RedChannel *));
- return display_channel;
-}
-
-static RedChannel *red_dispatcher_cursor_channel_create(RedDispatcher *dispatcher)
-{
- RedWorkerMessageCursorChannelCreate payload;
- RedChannel *cursor_channel;
-
- dispatcher_send_message(&dispatcher->dispatcher,
- RED_WORKER_MESSAGE_CURSOR_CHANNEL_CREATE,
- &payload);
- receive_data(dispatcher->dispatcher.send_fd, &cursor_channel, sizeof(RedChannel *));
- return cursor_channel;
-}
-
-void red_dispatcher_init(QXLInstance *qxl)
-{
- RedDispatcher *red_dispatcher;
- RedWorkerMessage message;
- WorkerInitData init_data;
- QXLDevInitInfo init_info;
- int r;
- RedChannel *display_channel;
- RedChannel *cursor_channel;
- sigset_t thread_sig_mask;
- sigset_t curr_sig_mask;
- ClientCbs client_cbs = { NULL, };
-
- spice_return_if_fail(qxl->st->dispatcher == NULL);
-
- quic_init();
- sw_canvas_init();
-#ifdef USE_OPENGL
- gl_canvas_init();
-#endif // USE_OPENGL
-
- red_dispatcher = spice_new0(RedDispatcher, 1);
- ring_init(&red_dispatcher->async_commands);
- spice_debug("red_dispatcher->async_commands.next %p", red_dispatcher->async_commands.next);
- dispatcher_init(&red_dispatcher->dispatcher, RED_WORKER_MESSAGE_COUNT, NULL);
- init_data.qxl = red_dispatcher->qxl = qxl;
- init_data.id = qxl->id;
- init_data.red_dispatcher = red_dispatcher;
- init_data.pending = &red_dispatcher->pending;
- init_data.num_renderers = num_renderers;
- memcpy(init_data.renderers, renderers, sizeof(init_data.renderers));
-
- pthread_mutex_init(&red_dispatcher->async_lock, NULL);
- init_data.image_compression = image_compression;
- init_data.jpeg_state = jpeg_state;
- init_data.zlib_glz_state = zlib_glz_state;
- init_data.streaming_video = streaming_video;
-
- red_dispatcher->base.major_version = SPICE_INTERFACE_QXL_MAJOR;
- red_dispatcher->base.minor_version = SPICE_INTERFACE_QXL_MINOR;
- red_dispatcher->base.wakeup = qxl_worker_wakeup;
- red_dispatcher->base.oom = qxl_worker_oom;
- red_dispatcher->base.start = qxl_worker_start;
- red_dispatcher->base.stop = qxl_worker_stop;
- red_dispatcher->base.update_area = qxl_worker_update_area;
- red_dispatcher->base.add_memslot = qxl_worker_add_memslot;
- red_dispatcher->base.del_memslot = qxl_worker_del_memslot;
- red_dispatcher->base.reset_memslots = qxl_worker_reset_memslots;
- red_dispatcher->base.destroy_surfaces = qxl_worker_destroy_surfaces;
- red_dispatcher->base.create_primary_surface = qxl_worker_create_primary_surface;
- red_dispatcher->base.destroy_primary_surface = qxl_worker_destroy_primary_surface;
-
- red_dispatcher->base.reset_image_cache = qxl_worker_reset_image_cache;
- red_dispatcher->base.reset_cursor = qxl_worker_reset_cursor;
- red_dispatcher->base.destroy_surface_wait = qxl_worker_destroy_surface_wait;
- red_dispatcher->base.loadvm_commands = qxl_worker_loadvm_commands;
-
- qxl->st->qif->get_init_info(qxl, &init_info);
-
- init_data.memslot_id_bits = init_info.memslot_id_bits;
- init_data.memslot_gen_bits = init_info.memslot_gen_bits;
- init_data.num_memslots = init_info.num_memslots;
- init_data.num_memslots_groups = init_info.num_memslots_groups;
- init_data.internal_groupslot_id = init_info.internal_groupslot_id;
- init_data.n_surfaces = init_info.n_surfaces;
-
- num_active_workers = 1;
-
- sigfillset(&thread_sig_mask);
- sigdelset(&thread_sig_mask, SIGILL);
- sigdelset(&thread_sig_mask, SIGFPE);
- sigdelset(&thread_sig_mask, SIGSEGV);
- pthread_sigmask(SIG_SETMASK, &thread_sig_mask, &curr_sig_mask);
- if ((r = pthread_create(&red_dispatcher->worker_thread, NULL, red_worker_main, &init_data))) {
- spice_error("create thread failed %d", r);
- }
- pthread_sigmask(SIG_SETMASK, &curr_sig_mask, NULL);
-
- read_message(red_dispatcher->dispatcher.send_fd, &message);
- spice_assert(message == RED_WORKER_MESSAGE_READY);
-
- display_channel = red_dispatcher_display_channel_create(red_dispatcher);
-
- if (display_channel) {
- client_cbs.connect = red_dispatcher_set_display_peer;
- client_cbs.disconnect = red_dispatcher_disconnect_display_peer;
- client_cbs.migrate = red_dispatcher_display_migrate;
- red_channel_register_client_cbs(display_channel, &client_cbs);
- red_channel_set_data(display_channel, red_dispatcher);
- red_channel_set_cap(display_channel, SPICE_DISPLAY_CAP_MONITORS_CONFIG);
- red_channel_set_cap(display_channel, SPICE_DISPLAY_CAP_STREAM_REPORT);
- reds_register_channel(display_channel);
- }
-
- cursor_channel = red_dispatcher_cursor_channel_create(red_dispatcher);
-
- if (cursor_channel) {
- client_cbs.connect = red_dispatcher_set_cursor_peer;
- client_cbs.disconnect = red_dispatcher_disconnect_cursor_peer;
- client_cbs.migrate = red_dispatcher_cursor_migrate;
- red_channel_register_client_cbs(cursor_channel, &client_cbs);
- red_channel_set_data(cursor_channel, red_dispatcher);
- reds_register_channel(cursor_channel);
- }
-
- qxl->st->dispatcher = red_dispatcher;
- red_dispatcher->next = dispatchers;
- dispatchers = red_dispatcher;
-
- qxl->st->qif->attache_worker(qxl, &red_dispatcher->base);
- qxl->st->qif->set_compression_level(qxl, calc_compression_level());
-}
-
-struct Dispatcher *red_dispatcher_get_dispatcher(RedDispatcher *red_dispatcher)
-{
- return &red_dispatcher->dispatcher;
-}
-
-void red_dispatcher_set_dispatcher_opaque(struct RedDispatcher *red_dispatcher,
- void *opaque)
-{
- dispatcher_set_opaque(&red_dispatcher->dispatcher, opaque);
-}
diff --git a/server/red_dispatcher.h b/server/red_dispatcher.h
deleted file mode 100644
index 907b7c7c..00000000
--- a/server/red_dispatcher.h
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_RED_DISPATCHER
-#define _H_RED_DISPATCHER
-
-#include "red_channel.h"
-
-struct RedChannelClient;
-struct RedDispatcher;
-typedef struct AsyncCommand AsyncCommand;
-
-void red_dispatcher_init(QXLInstance *qxl);
-
-void red_dispatcher_set_mm_time(uint32_t);
-void red_dispatcher_on_ic_change(void);
-void red_dispatcher_on_sv_change(void);
-void red_dispatcher_set_mouse_mode(uint32_t mode);
-void red_dispatcher_on_vm_stop(void);
-void red_dispatcher_on_vm_start(void);
-int red_dispatcher_count(void);
-int red_dispatcher_add_renderer(const char *name);
-uint32_t red_dispatcher_qxl_ram_size(void);
-int red_dispatcher_qxl_count(void);
-void red_dispatcher_async_complete(struct RedDispatcher *, AsyncCommand *);
-struct Dispatcher *red_dispatcher_get_dispatcher(struct RedDispatcher *);
-int red_dispatcher_use_client_monitors_config(void);
-void red_dispatcher_client_monitors_config(VDAgentMonitorsConfig *monitors_config);
-
-typedef struct RedWorkerMessageDisplayConnect {
- RedClient * client;
- RedsStream * stream;
- uint32_t *common_caps; // red_worker should free
- uint32_t *caps; // red_worker should free
- int migration;
- int num_common_caps;
- int num_caps;
-} RedWorkerMessageDisplayConnect;
-
-typedef struct RedWorkerMessageDisplayDisconnect {
- RedChannelClient *rcc;
-} RedWorkerMessageDisplayDisconnect;
-
-typedef struct RedWorkerMessageDisplayMigrate {
- RedChannelClient *rcc;
-} RedWorkerMessageDisplayMigrate;
-
-typedef struct RedWorkerMessageCursorConnect {
- RedClient *client;
- RedsStream *stream;
- int migration;
- uint32_t *common_caps; // red_worker should free
- int num_common_caps;
- uint32_t *caps; // red_worker should free
- int num_caps;
-} RedWorkerMessageCursorConnect;
-
-typedef struct RedWorkerMessageCursorDisconnect {
- RedChannelClient *rcc;
-} RedWorkerMessageCursorDisconnect;
-
-typedef struct RedWorkerMessageCursorMigrate {
- RedChannelClient *rcc;
-} RedWorkerMessageCursorMigrate;
-
-typedef struct RedWorkerMessageUpdate {
- uint32_t surface_id;
- QXLRect * qxl_area;
- QXLRect * qxl_dirty_rects;
- uint32_t num_dirty_rects;
- uint32_t clear_dirty_region;
-} RedWorkerMessageUpdate;
-
-typedef struct RedWorkerMessageAsync {
- AsyncCommand *cmd;
-} RedWorkerMessageAsync;
-
-typedef struct RedWorkerMessageUpdateAsync {
- RedWorkerMessageAsync base;
- uint32_t surface_id;
- QXLRect qxl_area;
- uint32_t clear_dirty_region;
-} RedWorkerMessageUpdateAsync;
-
-typedef struct RedWorkerMessageAddMemslot {
- QXLDevMemSlot mem_slot;
-} RedWorkerMessageAddMemslot;
-
-typedef struct RedWorkerMessageAddMemslotAsync {
- RedWorkerMessageAsync base;
- QXLDevMemSlot mem_slot;
-} RedWorkerMessageAddMemslotAsync;
-
-typedef struct RedWorkerMessageDelMemslot {
- uint32_t slot_group_id;
- uint32_t slot_id;
-} RedWorkerMessageDelMemslot;
-
-typedef struct RedWorkerMessageDestroySurfaces {
-} RedWorkerMessageDestroySurfaces;
-
-typedef struct RedWorkerMessageDestroySurfacesAsync {
- RedWorkerMessageAsync base;
-} RedWorkerMessageDestroySurfacesAsync;
-
-
-typedef struct RedWorkerMessageDestroyPrimarySurface {
- uint32_t surface_id;
-} RedWorkerMessageDestroyPrimarySurface;
-
-typedef struct RedWorkerMessageDestroyPrimarySurfaceAsync {
- RedWorkerMessageAsync base;
- uint32_t surface_id;
-} RedWorkerMessageDestroyPrimarySurfaceAsync;
-
-typedef struct RedWorkerMessageCreatePrimarySurfaceAsync {
- RedWorkerMessageAsync base;
- uint32_t surface_id;
- QXLDevSurfaceCreate surface;
-} RedWorkerMessageCreatePrimarySurfaceAsync;
-
-typedef struct RedWorkerMessageCreatePrimarySurface {
- uint32_t surface_id;
- QXLDevSurfaceCreate surface;
-} RedWorkerMessageCreatePrimarySurface;
-
-typedef struct RedWorkerMessageResetImageCache {
-} RedWorkerMessageResetImageCache;
-
-typedef struct RedWorkerMessageResetCursor {
-} RedWorkerMessageResetCursor;
-
-typedef struct RedWorkerMessageWakeup {
-} RedWorkerMessageWakeup;
-
-typedef struct RedWorkerMessageOom {
-} RedWorkerMessageOom;
-
-typedef struct RedWorkerMessageStart {
-} RedWorkerMessageStart;
-
-typedef struct RedWorkerMessageFlushSurfacesAsync {
- RedWorkerMessageAsync base;
-} RedWorkerMessageFlushSurfacesAsync;
-
-typedef struct RedWorkerMessageStop {
-} RedWorkerMessageStop;
-
-/* this command is sync, so it's ok to pass a pointer */
-typedef struct RedWorkerMessageLoadvmCommands {
- uint32_t count;
- QXLCommandExt *ext;
-} RedWorkerMessageLoadvmCommands;
-
-typedef struct RedWorkerMessageSetCompression {
- spice_image_compression_t image_compression;
-} RedWorkerMessageSetCompression;
-
-typedef struct RedWorkerMessageSetStreamingVideo {
- uint32_t streaming_video;
-} RedWorkerMessageSetStreamingVideo;
-
-typedef struct RedWorkerMessageSetMouseMode {
- uint32_t mode;
-} RedWorkerMessageSetMouseMode;
-
-typedef struct RedWorkerMessageDisplayChannelCreate {
-} RedWorkerMessageDisplayChannelCreate;
-
-typedef struct RedWorkerMessageCursorChannelCreate {
-} RedWorkerMessageCursorChannelCreate;
-
-typedef struct RedWorkerMessageDestroySurfaceWait {
- uint32_t surface_id;
-} RedWorkerMessageDestroySurfaceWait;
-
-typedef struct RedWorkerMessageDestroySurfaceWaitAsync {
- RedWorkerMessageAsync base;
- uint32_t surface_id;
-} RedWorkerMessageDestroySurfaceWaitAsync;
-
-typedef struct RedWorkerMessageResetMemslots {
-} RedWorkerMessageResetMemslots;
-
-typedef struct RedWorkerMessageMonitorsConfigAsync {
- RedWorkerMessageAsync base;
- QXLPHYSICAL monitors_config;
- int group_id;
-} RedWorkerMessageMonitorsConfigAsync;
-
-typedef struct RedWorkerMessageDriverUnload {
-} RedWorkerMessageDriverUnload;
-
-#endif
diff --git a/server/red_memslots.h b/server/red_memslots.h
deleted file mode 100644
index 27443a62..00000000
--- a/server/red_memslots.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
-/*
- Copyright (C) 2009,2010 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_REDMEMSLOTS
-#define _H_REDMEMSLOTS
-
-#include "red_common.h"
-
-#include <spice/qxl_dev.h>
-
-typedef struct MemSlot {
- int generation;
- unsigned long virt_start_addr;
- unsigned long virt_end_addr;
- long address_delta;
-} MemSlot;
-
-typedef struct RedMemSlotInfo {
- MemSlot **mem_slots;
- uint32_t num_memslots_groups;
- uint32_t num_memslots;
- uint8_t mem_slot_bits;
- uint8_t generation_bits;
- uint8_t memslot_id_shift;
- uint8_t memslot_gen_shift;
- uint8_t internal_groupslot_id;
- unsigned long memslot_gen_mask;
- unsigned long memslot_clean_virt_mask;
-} RedMemSlotInfo;
-
-static inline int get_memslot_id(RedMemSlotInfo *info, uint64_t addr)
-{
- return addr >> info->memslot_id_shift;
-}
-
-static inline int get_generation(RedMemSlotInfo *info, uint64_t addr)
-{
- return (addr >> info->memslot_gen_shift) & info->memslot_gen_mask;
-}
-
-int validate_virt(RedMemSlotInfo *info, unsigned long virt, int slot_id,
- uint32_t add_size, uint32_t group_id);
-unsigned long get_virt(RedMemSlotInfo *info, QXLPHYSICAL addr, uint32_t add_size,
- int group_id, int *error);
-
-void red_memslot_info_init(RedMemSlotInfo *info,
- uint32_t num_groups, uint32_t num_slots,
- uint8_t generation_bits,
- uint8_t id_bits,
- uint8_t internal_groupslot_id);
-void red_memslot_info_add_slot(RedMemSlotInfo *info, uint32_t slot_group_id, uint32_t slot_id,
- uint64_t addr_delta, unsigned long virt_start, unsigned long virt_end,
- uint32_t generation);
-void red_memslot_info_del_slot(RedMemSlotInfo *info, uint32_t slot_group_id, uint32_t slot_id);
-void red_memslot_info_reset(RedMemSlotInfo *info);
-
-#endif
diff --git a/server/red_time.h b/server/red_time.h
deleted file mode 100644
index ffa97f23..00000000
--- a/server/red_time.h
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef H_RED_TIME
-#define H_RED_TIME
-
-#include <time.h>
-
-static inline uint64_t red_now(void)
-{
- struct timespec time;
-
- clock_gettime(CLOCK_MONOTONIC, &time);
-
- return ((uint64_t) time.tv_sec) * 1000000000 + time.tv_nsec;
-}
-
-#endif
diff --git a/server/red_worker.c b/server/red_worker.c
deleted file mode 100644
index e177b683..00000000
--- a/server/red_worker.c
+++ /dev/null
@@ -1,12077 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#define SPICE_LOG_DOMAIN "SpiceWorker"
-
-/* Common variable abbreviations:
- *
- * rcc - RedChannelClient
- * ccc - CursorChannelClient (not to be confused with common_cc)
- * common_cc - CommonChannelClient
- * dcc - DisplayChannelClient
- * cursor_red_channel - downcast of CursorChannel to RedChannel
- * display_red_channel - downcast of DisplayChannel to RedChannel
- */
-
-#include <stdio.h>
-#include <stdarg.h>
-#include <fcntl.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <string.h>
-#include <unistd.h>
-#include <poll.h>
-#include <pthread.h>
-#include <netinet/tcp.h>
-#include <setjmp.h>
-#include <openssl/ssl.h>
-#include <inttypes.h>
-
-#include <spice/protocol.h>
-#include <spice/qxl_dev.h>
-#include "common/lz.h"
-#include "common/marshaller.h"
-#include "common/quic.h"
-#include "common/rect.h"
-#include "common/region.h"
-#include "common/ring.h"
-#include "common/generated_server_marshallers.h"
-
-#ifdef USE_OPENGL
-#include "common/ogl_ctx.h"
-#include "reds_gl_canvas.h"
-#endif /* USE_OPENGL */
-
-#include "spice.h"
-#include "red_worker.h"
-#include "reds_stream.h"
-#include "reds_sw_canvas.h"
-#include "glz_encoder_dictionary.h"
-#include "glz_encoder.h"
-#include "stat.h"
-#include "reds.h"
-#include "mjpeg_encoder.h"
-#include "red_memslots.h"
-#include "red_parse_qxl.h"
-#include "jpeg_encoder.h"
-#include "demarshallers.h"
-#include "zlib_encoder.h"
-#include "red_channel.h"
-#include "red_dispatcher.h"
-#include "dispatcher.h"
-#include "main_channel.h"
-#include "migration_protocol.h"
-#include "spice_timer_queue.h"
-#include "main_dispatcher.h"
-#include "spice_server_utils.h"
-#include "red_time.h"
-#include "spice_bitmap_utils.h"
-#include "spice_image_cache.h"
-
-//#define COMPRESS_STAT
-//#define DUMP_BITMAP
-//#define PIPE_DEBUG
-//#define RED_WORKER_STAT
-/* TODO: DRAW_ALL is broken. */
-//#define DRAW_ALL
-//#define COMPRESS_DEBUG
-//#define ACYCLIC_SURFACE_DEBUG
-//#define DEBUG_CURSORS
-
-//#define UPDATE_AREA_BY_TREE
-
-#define CMD_RING_POLL_TIMEOUT 10 //milli
-#define CMD_RING_POLL_RETRIES 200
-
-#define DISPLAY_CLIENT_SHORT_TIMEOUT 15000000000ULL //nano
-#define DISPLAY_CLIENT_TIMEOUT 30000000000ULL //nano
-#define DISPLAY_CLIENT_MIGRATE_DATA_TIMEOUT 10000000000ULL //nano, 10 sec
-#define DISPLAY_CLIENT_RETRY_INTERVAL 10000 //micro
-
-#define DISPLAY_FREE_LIST_DEFAULT_SIZE 128
-
-#define RED_STREAM_DETACTION_MAX_DELTA ((1000 * 1000 * 1000) / 5) // 1/5 sec
-#define RED_STREAM_CONTINUS_MAX_DELTA (1000 * 1000 * 1000)
-#define RED_STREAM_TIMOUT (1000 * 1000 * 1000)
-#define RED_STREAM_FRAMES_START_CONDITION 20
-#define RED_STREAM_GRADUAL_FRAMES_START_CONDITION 0.2
-#define RED_STREAM_FRAMES_RESET_CONDITION 100
-#define RED_STREAM_MIN_SIZE (96 * 96)
-#define RED_STREAM_INPUT_FPS_TIMEOUT (5 * 1000) // 5 sec
-#define RED_STREAM_CHANNEL_CAPACITY 0.8
-/* the client's stream report frequency is the minimum of the 2 values below */
-#define RED_STREAM_CLIENT_REPORT_WINDOW 5 // #frames
-#define RED_STREAM_CLIENT_REPORT_TIMEOUT 1000 // milliseconds
-#define RED_STREAM_DEFAULT_HIGH_START_BIT_RATE (10 * 1024 * 1024) // 10Mbps
-#define RED_STREAM_DEFAULT_LOW_START_BIT_RATE (2.5 * 1024 * 1024) // 2.5Mbps
-
-#define FPS_TEST_INTERVAL 1
-#define MAX_FPS 30
-
-#define RED_COMPRESS_BUF_SIZE (1024 * 64)
-
-#define ZLIB_DEFAULT_COMPRESSION_LEVEL 3
-#define MIN_GLZ_SIZE_FOR_ZLIB 100
-
-typedef int64_t red_time_t;
-
-#define VALIDATE_SURFACE_RET(worker, surface_id) \
- if (!validate_surface(worker, surface_id)) { \
- rendering_incorrect(__func__); \
- return; \
- }
-
-#define VALIDATE_SURFACE_RETVAL(worker, surface_id, ret) \
- if (!validate_surface(worker, surface_id)) { \
- rendering_incorrect(__func__); \
- return ret; \
- }
-
-#define VALIDATE_SURFACE_BREAK(worker, surface_id) \
- if (!validate_surface(worker, surface_id)) { \
- rendering_incorrect(__func__); \
- break; \
- }
-
-static void rendering_incorrect(const char *msg)
-{
- spice_warning("rendering incorrect from now on: %s", msg);
-}
-
-static inline red_time_t timespec_to_red_time(struct timespec *time)
-{
- return time->tv_sec * (1000 * 1000 * 1000) + time->tv_nsec;
-}
-
-#if defined(RED_WORKER_STAT) || defined(COMPRESS_STAT)
-static clockid_t clock_id;
-
-typedef unsigned long stat_time_t;
-
-static stat_time_t stat_now(void)
-{
- struct timespec ts;
-
- clock_gettime(clock_id, &ts);
- return ts.tv_nsec + ts.tv_sec * 1000 * 1000 * 1000;
-}
-
-double stat_cpu_time_to_sec(stat_time_t time)
-{
- return (double)time / (1000 * 1000 * 1000);
-}
-
-typedef struct stat_info_s {
- const char *name;
- uint32_t count;
- stat_time_t max;
- stat_time_t min;
- stat_time_t total;
-#ifdef COMPRESS_STAT
- uint64_t orig_size;
- uint64_t comp_size;
-#endif
-} stat_info_t;
-
-static inline void stat_reset(stat_info_t *info)
-{
- info->count = info->max = info->total = 0;
- info->min = ~(stat_time_t)0;
-#ifdef COMPRESS_STAT
- info->orig_size = info->comp_size = 0;
-#endif
-}
-
-#endif
-
-#ifdef RED_WORKER_STAT
-static const char *add_stat_name = "add";
-static const char *exclude_stat_name = "exclude";
-static const char *__exclude_stat_name = "__exclude";
-
-static inline void stat_init(stat_info_t *info, const char *name)
-{
- info->name = name;
- stat_reset(info);
-}
-
-static inline void stat_add(stat_info_t *info, stat_time_t start)
-{
- stat_time_t time;
- ++info->count;
- time = stat_now() - start;
- info->total += time;
- info->max = MAX(info->max, time);
- info->min = MIN(info->min, time);
-}
-
-#else
-#define stat_add(a, b)
-#define stat_init(a, b)
-#endif
-
-#ifdef COMPRESS_STAT
-static const char *lz_stat_name = "lz";
-static const char *glz_stat_name = "glz";
-static const char *quic_stat_name = "quic";
-static const char *jpeg_stat_name = "jpeg";
-static const char *zlib_stat_name = "zlib_glz";
-static const char *jpeg_alpha_stat_name = "jpeg_alpha";
-
-static inline void stat_compress_init(stat_info_t *info, const char *name)
-{
- info->name = name;
- stat_reset(info);
-}
-
-static inline void stat_compress_add(stat_info_t *info, stat_time_t start, int orig_size,
- int comp_size)
-{
- stat_time_t time;
- ++info->count;
- time = stat_now() - start;
- info->total += time;
- info->max = MAX(info->max, time);
- info->min = MIN(info->min, time);
- info->orig_size += orig_size;
- info->comp_size += comp_size;
-}
-
-static inline double stat_byte_to_mega(uint64_t size)
-{
- return (double)size / (1000 * 1000);
-}
-
-#else
-#define stat_compress_init(a, b)
-#define stat_compress_add(a, b, c, d)
-#endif
-
-#define MAX_EVENT_SOURCES 20
-#define INF_EVENT_WAIT ~0
-
-struct SpiceWatch {
- struct RedWorker *worker;
- SpiceWatchFunc watch_func;
- void *watch_func_opaque;
-};
-
-enum {
- BUF_TYPE_RAW = 1,
-};
-
-enum {
- PIPE_ITEM_TYPE_DRAW = PIPE_ITEM_TYPE_CHANNEL_BASE,
- PIPE_ITEM_TYPE_INVAL_ONE,
- PIPE_ITEM_TYPE_CURSOR,
- PIPE_ITEM_TYPE_CURSOR_INIT,
- PIPE_ITEM_TYPE_IMAGE,
- PIPE_ITEM_TYPE_STREAM_CREATE,
- PIPE_ITEM_TYPE_STREAM_CLIP,
- PIPE_ITEM_TYPE_STREAM_DESTROY,
- PIPE_ITEM_TYPE_UPGRADE,
- PIPE_ITEM_TYPE_VERB,
- PIPE_ITEM_TYPE_MIGRATE_DATA,
- PIPE_ITEM_TYPE_PIXMAP_SYNC,
- PIPE_ITEM_TYPE_PIXMAP_RESET,
- PIPE_ITEM_TYPE_INVAL_CURSOR_CACHE,
- PIPE_ITEM_TYPE_INVAL_PALLET_CACHE,
- PIPE_ITEM_TYPE_CREATE_SURFACE,
- PIPE_ITEM_TYPE_DESTROY_SURFACE,
- PIPE_ITEM_TYPE_MONITORS_CONFIG,
- PIPE_ITEM_TYPE_STREAM_ACTIVATE_REPORT,
-};
-
-typedef struct VerbItem {
- PipeItem base;
- uint16_t verb;
-} VerbItem;
-
-#define MAX_CACHE_CLIENTS 4
-#define MAX_LZ_ENCODERS MAX_CACHE_CLIENTS
-
-typedef struct NewCacheItem NewCacheItem;
-
-struct NewCacheItem {
- RingItem lru_link;
- NewCacheItem *next;
- uint64_t id;
- uint64_t sync[MAX_CACHE_CLIENTS];
- size_t size;
- int lossy;
-};
-
-typedef struct CacheItem CacheItem;
-
-struct CacheItem {
- union {
- PipeItem pipe_data;
- struct {
- RingItem lru_link;
- CacheItem *next;
- } cache_data;
- } u;
- uint64_t id;
- size_t size;
- uint32_t inval_type;
-};
-
-typedef struct SurfaceCreateItem {
- SpiceMsgSurfaceCreate surface_create;
- PipeItem pipe_item;
-} SurfaceCreateItem;
-
-typedef struct SurfaceDestroyItem {
- SpiceMsgSurfaceDestroy surface_destroy;
- PipeItem pipe_item;
-} SurfaceDestroyItem;
-
-typedef struct MonitorsConfig {
- int refs;
- struct RedWorker *worker;
- int count;
- int max_allowed;
- QXLHead heads[0];
-} MonitorsConfig;
-
-typedef struct MonitorsConfigItem {
- PipeItem pipe_item;
- MonitorsConfig *monitors_config;
-} MonitorsConfigItem;
-
-typedef struct StreamActivateReportItem {
- PipeItem pipe_item;
- uint32_t stream_id;
-} StreamActivateReportItem;
-
-typedef struct CursorItem {
- uint32_t group_id;
- int refs;
- RedCursorCmd *red_cursor;
-} CursorItem;
-
-typedef struct CursorPipeItem {
- PipeItem base;
- CursorItem *cursor_item;
- int refs;
-} CursorPipeItem;
-
-typedef struct LocalCursor {
- CursorItem base;
- SpicePoint16 position;
- uint32_t data_size;
- SpiceCursor red_cursor;
-} LocalCursor;
-
-#define MAX_PIPE_SIZE 50
-#define CHANNEL_RECEIVE_BUF_SIZE 1024
-
-#define WIDE_CLIENT_ACK_WINDOW 40
-#define NARROW_CLIENT_ACK_WINDOW 20
-
-#define BITS_CACHE_HASH_SHIFT 10
-#define BITS_CACHE_HASH_SIZE (1 << BITS_CACHE_HASH_SHIFT)
-#define BITS_CACHE_HASH_MASK (BITS_CACHE_HASH_SIZE - 1)
-#define BITS_CACHE_HASH_KEY(id) ((id) & BITS_CACHE_HASH_MASK)
-
-#define CLIENT_CURSOR_CACHE_SIZE 256
-
-#define CURSOR_CACHE_HASH_SHIFT 8
-#define CURSOR_CACHE_HASH_SIZE (1 << CURSOR_CACHE_HASH_SHIFT)
-#define CURSOR_CACHE_HASH_MASK (CURSOR_CACHE_HASH_SIZE - 1)
-#define CURSOR_CACHE_HASH_KEY(id) ((id) & CURSOR_CACHE_HASH_MASK)
-
-#define CLIENT_PALETTE_CACHE_SIZE 128
-
-#define PALETTE_CACHE_HASH_SHIFT 8
-#define PALETTE_CACHE_HASH_SIZE (1 << PALETTE_CACHE_HASH_SHIFT)
-#define PALETTE_CACHE_HASH_MASK (PALETTE_CACHE_HASH_SIZE - 1)
-#define PALETTE_CACHE_HASH_KEY(id) ((id) & PALETTE_CACHE_HASH_MASK)
-
-typedef struct ImageItem {
- PipeItem link;
- int refs;
- SpicePoint pos;
- int width;
- int height;
- int stride;
- int top_down;
- int surface_id;
- int image_format;
- uint32_t image_flags;
- int can_lossy;
- uint8_t data[0];
-} ImageItem;
-
-typedef struct Drawable Drawable;
-
-typedef struct DisplayChannel DisplayChannel;
-typedef struct DisplayChannelClient DisplayChannelClient;
-
-enum {
- STREAM_FRAME_NONE,
- STREAM_FRAME_NATIVE,
- STREAM_FRAME_CONTAINER,
-};
-
-typedef struct Stream Stream;
-struct Stream {
- uint8_t refs;
- Drawable *current;
- red_time_t last_time;
- int width;
- int height;
- SpiceRect dest_area;
- int top_down;
- Stream *next;
- RingItem link;
-
- SpiceTimer *input_fps_timer;
- uint32_t num_input_frames;
- uint64_t input_fps_timer_start;
- uint32_t input_fps;
-};
-
-#define STREAM_STATS
-#ifdef STREAM_STATS
-typedef struct StreamStats {
- uint64_t num_drops_pipe;
- uint64_t num_drops_fps;
- uint64_t num_frames_sent;
- uint64_t num_input_frames;
- uint64_t size_sent;
-
- uint64_t start;
- uint64_t end;
-} StreamStats;
-#endif
-
-typedef struct StreamAgent {
- QRegion vis_region; /* the part of the surface area that is currently occupied by video
- fragments */
- QRegion clip; /* the current video clipping. It can be different from vis_region:
- for example, let c1 be the clip area at time t1, and c2
- be the clip area at time t2, where t1 < t2. If c1 contains c2, and
- at least part of c1/c2, hasn't been covered by a non-video images,
- vis_region will contain c2 and also the part of c1/c2 that still
- displays fragments of the video */
-
- PipeItem create_item;
- PipeItem destroy_item;
- Stream *stream;
- uint64_t last_send_time;
- MJpegEncoder *mjpeg_encoder;
- DisplayChannelClient *dcc;
-
- int frames;
- int drops;
- int fps;
-
- uint32_t report_id;
- uint32_t client_required_latency;
-#ifdef STREAM_STATS
- StreamStats stats;
-#endif
-} StreamAgent;
-
-typedef struct StreamClipItem {
- PipeItem base;
- int refs;
- StreamAgent *stream_agent;
- int clip_type;
- SpiceClipRects *rects;
-} StreamClipItem;
-
-typedef struct RedCompressBuf RedCompressBuf;
-struct RedCompressBuf {
- uint32_t buf[RED_COMPRESS_BUF_SIZE / 4];
- RedCompressBuf *next;
- RedCompressBuf *send_next;
-};
-
-static const int BITMAP_FMT_IS_PLT[] = {0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0};
-static const int BITMAP_FMP_BYTES_PER_PIXEL[] = {0, 0, 0, 0, 0, 1, 2, 3, 4, 4, 1};
-
-#define BITMAP_FMT_HAS_GRADUALITY(f) \
- (bitmap_fmt_is_rgb(f) && \
- ((f) != SPICE_BITMAP_FMT_8BIT_A))
-
-pthread_mutex_t cache_lock = PTHREAD_MUTEX_INITIALIZER;
-Ring pixmap_cache_list = {&pixmap_cache_list, &pixmap_cache_list};
-
-typedef struct PixmapCache PixmapCache;
-struct PixmapCache {
- RingItem base;
- pthread_mutex_t lock;
- uint8_t id;
- uint32_t refs;
- NewCacheItem *hash_table[BITS_CACHE_HASH_SIZE];
- Ring lru;
- int64_t available;
- int64_t size;
- int32_t items;
-
- int freezed;
- RingItem *freezed_head;
- RingItem *freezed_tail;
-
- uint32_t generation;
- struct {
- uint8_t client;
- uint64_t message;
- } generation_initiator;
- uint64_t sync[MAX_CACHE_CLIENTS]; // here CLIENTS refer to different channel
- // clients of the same client
- RedClient *client;
-};
-
-#define NUM_STREAMS 50
-
-typedef struct WaitForChannels {
- SpiceMsgWaitForChannels header;
- SpiceWaitForChannel buf[MAX_CACHE_CLIENTS];
-} WaitForChannels;
-
-typedef struct FreeList {
- int res_size;
- SpiceResourceList *res;
- uint64_t sync[MAX_CACHE_CLIENTS];
- WaitForChannels wait;
-} FreeList;
-
-typedef struct {
- DisplayChannelClient *dcc;
- RedCompressBuf *bufs_head;
- RedCompressBuf *bufs_tail;
- jmp_buf jmp_env;
- union {
- struct {
- SpiceChunks *chunks;
- int next;
- int stride;
- int reverse;
- } lines_data;
- struct {
- RedCompressBuf* next;
- int size_left;
- } compressed_data; // for encoding data that was already compressed by another method
- } u;
- char message_buf[512];
-} EncoderData;
-
-typedef struct {
- QuicUsrContext usr;
- EncoderData data;
-} QuicData;
-
-typedef struct {
- LzUsrContext usr;
- EncoderData data;
-} LzData;
-
-typedef struct {
- GlzEncoderUsrContext usr;
- EncoderData data;
-} GlzData;
-
-typedef struct {
- JpegEncoderUsrContext usr;
- EncoderData data;
-} JpegData;
-
-typedef struct {
- ZlibEncoderUsrContext usr;
- EncoderData data;
-} ZlibData;
-
-/**********************************/
-/* LZ dictionary related entities */
-/**********************************/
-#define MAX_GLZ_DRAWABLE_INSTANCES 2
-
-typedef struct RedGlzDrawable RedGlzDrawable;
-
-/* for each qxl drawable, there may be several instances of lz drawables */
-/* TODO - reuse this stuff for the top level. I just added a second level of multiplicity
- * at the Drawable by keeping a ring, so:
- * Drawable -> (ring of) RedGlzDrawable -> (up to 2) GlzDrawableInstanceItem
- * and it should probably (but need to be sure...) be
- * Drawable -> ring of GlzDrawableInstanceItem.
- */
-typedef struct GlzDrawableInstanceItem {
- RingItem glz_link;
- RingItem free_link;
- GlzEncDictImageContext *glz_instance;
- RedGlzDrawable *red_glz_drawable;
-} GlzDrawableInstanceItem;
-
-struct RedGlzDrawable {
- RingItem link; // ordered by the time it was encoded
- RingItem drawable_link;
- RedDrawable *red_drawable;
- Drawable *drawable;
- uint32_t group_id;
- GlzDrawableInstanceItem instances_pool[MAX_GLZ_DRAWABLE_INSTANCES];
- Ring instances;
- uint8_t instances_count;
- DisplayChannelClient *dcc;
-};
-
-pthread_mutex_t glz_dictionary_list_lock = PTHREAD_MUTEX_INITIALIZER;
-Ring glz_dictionary_list = {&glz_dictionary_list, &glz_dictionary_list};
-
-typedef struct GlzSharedDictionary {
- RingItem base;
- GlzEncDictContext *dict;
- uint32_t refs;
- uint8_t id;
- pthread_rwlock_t encode_lock;
- int migrate_freeze;
- RedClient *client; // channel clients of the same client share the dict
-} GlzSharedDictionary;
-
-#define NUM_SURFACES 10000
-
-typedef struct CommonChannel {
- RedChannel base; // Must be the first thing
- struct RedWorker *worker;
- uint8_t recv_buf[CHANNEL_RECEIVE_BUF_SIZE];
- uint32_t id_alloc; // bitfield. TODO - use this instead of shift scheme.
- int during_target_migrate; /* TRUE when the client that is associated with the channel
- is during migration. Turned off when the vm is started.
- The flag is used to avoid sending messages that are artifacts
- of the transition from stopped vm to loaded vm (e.g., recreation
- of the primary surface) */
-} CommonChannel;
-
-typedef struct CommonChannelClient {
- RedChannelClient base;
- uint32_t id;
- struct RedWorker *worker;
- int is_low_bandwidth;
-} CommonChannelClient;
-
-/* Each drawable can refer to at most 3 images: src, brush and mask */
-#define MAX_DRAWABLE_PIXMAP_CACHE_ITEMS 3
-
-struct DisplayChannelClient {
- CommonChannelClient common;
-
- int expect_init;
-
- PixmapCache *pixmap_cache;
- uint32_t pixmap_cache_generation;
- int pending_pixmaps_sync;
-
- CacheItem *palette_cache[PALETTE_CACHE_HASH_SIZE];
- Ring palette_cache_lru;
- long palette_cache_available;
- uint32_t palette_cache_items;
-
- struct {
- uint32_t stream_outbuf_size;
- uint8_t *stream_outbuf; // caution stream buffer is also used as compress bufs!!!
-
- RedCompressBuf *used_compress_bufs;
-
- FreeList free_list;
- uint64_t pixmap_cache_items[MAX_DRAWABLE_PIXMAP_CACHE_ITEMS];
- int num_pixmap_cache_items;
- } send_data;
-
- /* global lz encoding entities */
- GlzSharedDictionary *glz_dict;
- GlzEncoderContext *glz;
- GlzData glz_data;
-
- Ring glz_drawables; // all the living lz drawable, ordered by encoding time
- Ring glz_drawables_inst_to_free; // list of instances to be freed
- pthread_mutex_t glz_drawables_inst_to_free_lock;
-
- uint8_t surface_client_created[NUM_SURFACES];
- QRegion surface_client_lossy_region[NUM_SURFACES];
-
- StreamAgent stream_agents[NUM_STREAMS];
- int use_mjpeg_encoder_rate_control;
- uint32_t streams_max_latency;
- uint64_t streams_max_bit_rate;
-};
-
-struct DisplayChannel {
- CommonChannel common; // Must be the first thing
-
- int enable_jpeg;
- int jpeg_quality;
- int enable_zlib_glz_wrap;
- int zlib_level;
-
- RedCompressBuf *free_compress_bufs;
-
-#ifdef RED_STATISTICS
- StatNodeRef stat;
- uint64_t *cache_hits_counter;
- uint64_t *add_to_cache_counter;
- uint64_t *non_cache_counter;
-#endif
-#ifdef COMPRESS_STAT
- stat_info_t lz_stat;
- stat_info_t glz_stat;
- stat_info_t quic_stat;
- stat_info_t jpeg_stat;
- stat_info_t zlib_glz_stat;
- stat_info_t jpeg_alpha_stat;
-#endif
-};
-
-typedef struct CursorChannelClient {
- CommonChannelClient common;
-
- CacheItem *cursor_cache[CURSOR_CACHE_HASH_SIZE];
- Ring cursor_cache_lru;
- long cursor_cache_available;
- uint32_t cursor_cache_items;
-} CursorChannelClient;
-
-typedef struct CursorChannel {
- CommonChannel common; // Must be the first thing
-
-#ifdef RED_STATISTICS
- StatNodeRef stat;
-#endif
-} CursorChannel;
-
-enum {
- TREE_ITEM_TYPE_DRAWABLE,
- TREE_ITEM_TYPE_CONTAINER,
- TREE_ITEM_TYPE_SHADOW,
-};
-
-typedef struct TreeItem {
- RingItem siblings_link;
- uint32_t type;
- struct Container *container;
- QRegion rgn;
-#ifdef PIPE_DEBUG
- uint32_t id;
-#endif
-} TreeItem;
-
-#define IS_DRAW_ITEM(item) ((item)->type == TREE_ITEM_TYPE_DRAWABLE)
-
-typedef struct Shadow {
- TreeItem base;
- QRegion on_hold;
- struct DrawItem* owner;
-} Shadow;
-
-typedef struct Container {
- TreeItem base;
- Ring items;
-} Container;
-
-typedef struct DrawItem {
- TreeItem base;
- uint8_t effect;
- uint8_t container_root;
- Shadow *shadow;
-} DrawItem;
-
-typedef enum {
- BITMAP_GRADUAL_INVALID,
- BITMAP_GRADUAL_NOT_AVAIL,
- BITMAP_GRADUAL_LOW,
- BITMAP_GRADUAL_MEDIUM,
- BITMAP_GRADUAL_HIGH,
-} BitmapGradualType;
-
-typedef struct DependItem {
- Drawable *drawable;
- RingItem ring_item;
-} DependItem;
-
-typedef struct DrawablePipeItem {
- RingItem base; /* link for a list of pipe items held by Drawable */
- PipeItem dpi_pipe_item; /* link for the client's pipe itself */
- Drawable *drawable;
- DisplayChannelClient *dcc;
- uint8_t refs;
-} DrawablePipeItem;
-
-struct Drawable {
- uint8_t refs;
- RingItem surface_list_link;
- RingItem list_link;
- DrawItem tree_item;
- Ring pipes;
- PipeItem *pipe_item_rest;
- uint32_t size_pipe_item_rest;
-#ifdef UPDATE_AREA_BY_TREE
- RingItem collect_link;
-#endif
- RedDrawable *red_drawable;
-
- Ring glz_ring;
-
- red_time_t creation_time;
- int frames_count;
- int gradual_frames_count;
- int last_gradual_frame;
- Stream *stream;
- Stream *sized_stream;
- int streamable;
- BitmapGradualType copy_bitmap_graduality;
- uint32_t group_id;
- DependItem depend_items[3];
-
- uint8_t *backed_surface_data;
- DependItem pipe_depend_items[3];
-
- int surface_id;
- int surfaces_dest[3];
-
- uint32_t process_commands_generation;
-};
-
-typedef struct _Drawable _Drawable;
-struct _Drawable {
- union {
- Drawable drawable;
- _Drawable *next;
- } u;
-};
-
-typedef struct _CursorItem _CursorItem;
-struct _CursorItem {
- union {
- CursorItem cursor_item;
- _CursorItem *next;
- } u;
-};
-
-typedef struct UpgradeItem {
- PipeItem base;
- int refs;
- Drawable *drawable;
- SpiceClipRects *rects;
-} UpgradeItem;
-
-typedef struct DrawContext {
- SpiceCanvas *canvas;
- int canvas_draws_on_surface;
- int top_down;
- uint32_t width;
- uint32_t height;
- int32_t stride;
- uint32_t format;
- void *line_0;
-} DrawContext;
-
-typedef struct RedSurface {
- uint32_t refs;
- Ring current;
- Ring current_list;
-#ifdef ACYCLIC_SURFACE_DEBUG
- int current_gn;
-#endif
- DrawContext context;
-
- Ring depend_on_me;
- QRegion draw_dirty_region;
-
- //fix me - better handling here
- QXLReleaseInfoExt create, destroy;
-} RedSurface;
-
-typedef struct ItemTrace {
- red_time_t time;
- int frames_count;
- int gradual_frames_count;
- int last_gradual_frame;
- int width;
- int height;
- SpiceRect dest_area;
-} ItemTrace;
-
-#define TRACE_ITEMS_SHIFT 3
-#define NUM_TRACE_ITEMS (1 << TRACE_ITEMS_SHIFT)
-#define ITEMS_TRACE_MASK (NUM_TRACE_ITEMS - 1)
-
-#define NUM_DRAWABLES 1000
-#define NUM_CURSORS 100
-
-typedef struct RedWorker {
- DisplayChannel *display_channel;
- CursorChannel *cursor_channel;
- QXLInstance *qxl;
- RedDispatcher *red_dispatcher;
-
- int channel;
- int id;
- int running;
- uint32_t *pending;
- struct pollfd poll_fds[MAX_EVENT_SOURCES];
- struct SpiceWatch watches[MAX_EVENT_SOURCES];
- unsigned int event_timeout;
- uint32_t repoll_cmd_ring;
- uint32_t repoll_cursor_ring;
- uint32_t num_renderers;
- uint32_t renderers[RED_MAX_RENDERERS];
- uint32_t renderer;
-
- RedSurface surfaces[NUM_SURFACES];
- uint32_t n_surfaces;
- SpiceImageSurfaces image_surfaces;
-
- MonitorsConfig *monitors_config;
-
- Ring current_list;
- uint32_t current_size;
- uint32_t drawable_count;
- uint32_t red_drawable_count;
- uint32_t glz_drawable_count;
- uint32_t transparent_count;
-
- uint32_t shadows_count;
- uint32_t containers_count;
- uint32_t stream_count;
-
- uint32_t bits_unique;
-
- CursorItem *cursor;
- int cursor_visible;
- SpicePoint16 cursor_position;
- uint16_t cursor_trail_length;
- uint16_t cursor_trail_frequency;
-
- _Drawable drawables[NUM_DRAWABLES];
- _Drawable *free_drawables;
-
- _CursorItem cursor_items[NUM_CURSORS];
- _CursorItem *free_cursor_items;
-
- RedMemSlotInfo mem_slots;
-
- uint32_t preload_group_id;
-
- ImageCache image_cache;
-
- spice_image_compression_t image_compression;
- spice_wan_compression_t jpeg_state;
- spice_wan_compression_t zlib_glz_state;
-
- uint32_t mouse_mode;
-
- uint32_t streaming_video;
- Stream streams_buf[NUM_STREAMS];
- Stream *free_streams;
- Ring streams;
- ItemTrace items_trace[NUM_TRACE_ITEMS];
- uint32_t next_item_trace;
- uint64_t streams_size_total;
-
- QuicData quic_data;
- QuicContext *quic;
-
- LzData lz_data;
- LzContext *lz;
-
- JpegData jpeg_data;
- JpegEncoderContext *jpeg;
-
- ZlibData zlib_data;
- ZlibEncoder *zlib;
-
- uint32_t process_commands_generation;
-#ifdef PIPE_DEBUG
- uint32_t last_id;
-#endif
-#ifdef RED_WORKER_STAT
- stat_info_t add_stat;
- stat_info_t exclude_stat;
- stat_info_t __exclude_stat;
- uint32_t add_count;
- uint32_t add_with_shadow_count;
-#endif
-#ifdef RED_STATISTICS
- StatNodeRef stat;
- uint64_t *wakeup_counter;
- uint64_t *command_counter;
-#endif
-
- int driver_cap_monitors_config;
- int set_client_capabilities_pending;
-} RedWorker;
-
-typedef enum {
- BITMAP_DATA_TYPE_INVALID,
- BITMAP_DATA_TYPE_CACHE,
- BITMAP_DATA_TYPE_SURFACE,
- BITMAP_DATA_TYPE_BITMAP,
- BITMAP_DATA_TYPE_BITMAP_TO_CACHE,
-} BitmapDataType;
-
-typedef struct BitmapData {
- BitmapDataType type;
- uint64_t id; // surface id or cache item id
- SpiceRect lossy_rect;
-} BitmapData;
-
-static void red_draw_qxl_drawable(RedWorker *worker, Drawable *drawable);
-static void red_current_flush(RedWorker *worker, int surface_id);
-#ifdef DRAW_ALL
-#define red_update_area(worker, rect, surface_id)
-#define red_draw_drawable(worker, item)
-#else
-static void red_draw_drawable(RedWorker *worker, Drawable *item);
-static void red_update_area(RedWorker *worker, const SpiceRect *area, int surface_id);
-static void red_update_area_till(RedWorker *worker, const SpiceRect *area, int surface_id,
- Drawable *last);
-#endif
-static void red_release_cursor(RedWorker *worker, CursorItem *cursor);
-static inline void release_drawable(RedWorker *worker, Drawable *item);
-static void red_display_release_stream(RedWorker *worker, StreamAgent *agent);
-static inline void red_detach_stream(RedWorker *worker, Stream *stream, int detach_sized);
-static void red_stop_stream(RedWorker *worker, Stream *stream);
-static inline void red_stream_maintenance(RedWorker *worker, Drawable *candidate, Drawable *sect);
-static inline void display_begin_send_message(RedChannelClient *rcc);
-static void red_release_pixmap_cache(DisplayChannelClient *dcc);
-static void red_release_glz(DisplayChannelClient *dcc);
-static void red_freeze_glz(DisplayChannelClient *dcc);
-static void display_channel_push_release(DisplayChannelClient *dcc, uint8_t type, uint64_t id,
- uint64_t* sync_data);
-static void red_display_release_stream_clip(RedWorker *worker, StreamClipItem *item);
-static int red_display_free_some_independent_glz_drawables(DisplayChannelClient *dcc);
-static void red_display_free_glz_drawable(DisplayChannelClient *dcc, RedGlzDrawable *drawable);
-static ImageItem *red_add_surface_area_image(DisplayChannelClient *dcc, int surface_id,
- SpiceRect *area, PipeItem *pos, int can_lossy);
-static BitmapGradualType _get_bitmap_graduality_level(RedWorker *worker, SpiceBitmap *bitmap,
- uint32_t group_id);
-static inline int _stride_is_extra(SpiceBitmap *bitmap);
-static void red_disconnect_cursor(RedChannel *channel);
-static void display_channel_client_release_item_before_push(DisplayChannelClient *dcc,
- PipeItem *item);
-static void display_channel_client_release_item_after_push(DisplayChannelClient *dcc,
- PipeItem *item);
-static void cursor_channel_client_release_item_before_push(CursorChannelClient *ccc,
- PipeItem *item);
-static void cursor_channel_client_release_item_after_push(CursorChannelClient *ccc,
- PipeItem *item);
-
-static void red_push_monitors_config(DisplayChannelClient *dcc);
-
-/*
- * Macros to make iterating over stuff easier
- * The two collections we iterate over:
- * given a channel, iterate over it's clients
- */
-
-/* a generic safe for loop macro */
-#define SAFE_FOREACH(link, next, cond, ring, data, get_data) \
- for ((((link) = ((cond) ? ring_get_head(ring) : NULL)), \
- ((next) = ((link) ? ring_next((ring), (link)) : NULL)), \
- ((data) = ((link)? (get_data) : NULL))); \
- (link); \
- (((link) = (next)), \
- ((next) = ((link) ? ring_next((ring), (link)) : NULL)), \
- ((data) = ((link)? (get_data) : NULL))))
-
-#define LINK_TO_RCC(ptr) SPICE_CONTAINEROF(ptr, RedChannelClient, channel_link)
-#define RCC_FOREACH_SAFE(link, next, rcc, channel) \
- SAFE_FOREACH(link, next, channel, &(channel)->clients, rcc, LINK_TO_RCC(link))
-
-
-#define LINK_TO_DCC(ptr) SPICE_CONTAINEROF(ptr, DisplayChannelClient, \
- common.base.channel_link)
-#define DCC_FOREACH_SAFE(link, next, dcc, channel) \
- SAFE_FOREACH(link, next, channel, &(channel)->clients, dcc, LINK_TO_DCC(link))
-
-
-#define WORKER_FOREACH_DCC_SAFE(worker, link, next, dcc) \
- DCC_FOREACH_SAFE(link, next, dcc, \
- ((((worker) && (worker)->display_channel))? \
- (&(worker)->display_channel->common.base) : NULL))
-
-
-#define LINK_TO_DPI(ptr) SPICE_CONTAINEROF((ptr), DrawablePipeItem, base)
-#define DRAWABLE_FOREACH_DPI_SAFE(drawable, link, next, dpi) \
- SAFE_FOREACH(link, next, drawable, &(drawable)->pipes, dpi, LINK_TO_DPI(link))
-
-
-#define LINK_TO_GLZ(ptr) SPICE_CONTAINEROF((ptr), RedGlzDrawable, \
- drawable_link)
-#define DRAWABLE_FOREACH_GLZ_SAFE(drawable, link, next, glz) \
- SAFE_FOREACH(link, next, drawable, &(drawable)->glz_ring, glz, LINK_TO_GLZ(link))
-
-
-#define DCC_TO_WORKER(dcc) \
- (SPICE_CONTAINEROF((dcc)->common.base.channel, CommonChannel, base)->worker)
-
-// TODO: replace with DCC_FOREACH when it is introduced
-#define WORKER_TO_DCC(worker) \
- (worker->display_channel ? SPICE_CONTAINEROF(worker->display_channel->common.base.rcc,\
- DisplayChannelClient, common.base) : NULL)
-
-#define DCC_TO_DC(dcc) SPICE_CONTAINEROF((dcc)->common.base.channel,\
- DisplayChannel, common.base)
-
-#define RCC_TO_DCC(rcc) SPICE_CONTAINEROF((rcc), DisplayChannelClient, common.base)
-#define RCC_TO_CCC(rcc) SPICE_CONTAINEROF((rcc), CursorChannelClient, common.base)
-
-
-
-#ifdef COMPRESS_STAT
-static void print_compress_stats(DisplayChannel *display_channel)
-{
- uint64_t glz_enc_size;
-
- if (!display_channel) {
- return;
- }
-
- glz_enc_size = display_channel->enable_zlib_glz_wrap ?
- display_channel->zlib_glz_stat.comp_size :
- display_channel->glz_stat.comp_size;
-
- spice_info("==> Compression stats for display %u", display_channel->common.base.id);
- spice_info("Method \t count \torig_size(MB)\tenc_size(MB)\tenc_time(s)");
- spice_info("QUIC \t%8d\t%13.2f\t%12.2f\t%12.2f",
- display_channel->quic_stat.count,
- stat_byte_to_mega(display_channel->quic_stat.orig_size),
- stat_byte_to_mega(display_channel->quic_stat.comp_size),
- stat_cpu_time_to_sec(display_channel->quic_stat.total)
- );
- spice_info("GLZ \t%8d\t%13.2f\t%12.2f\t%12.2f",
- display_channel->glz_stat.count,
- stat_byte_to_mega(display_channel->glz_stat.orig_size),
- stat_byte_to_mega(display_channel->glz_stat.comp_size),
- stat_cpu_time_to_sec(display_channel->glz_stat.total)
- );
- spice_info("ZLIB GLZ \t%8d\t%13.2f\t%12.2f\t%12.2f",
- display_channel->zlib_glz_stat.count,
- stat_byte_to_mega(display_channel->zlib_glz_stat.orig_size),
- stat_byte_to_mega(display_channel->zlib_glz_stat.comp_size),
- stat_cpu_time_to_sec(display_channel->zlib_glz_stat.total)
- );
- spice_info("LZ \t%8d\t%13.2f\t%12.2f\t%12.2f",
- display_channel->lz_stat.count,
- stat_byte_to_mega(display_channel->lz_stat.orig_size),
- stat_byte_to_mega(display_channel->lz_stat.comp_size),
- stat_cpu_time_to_sec(display_channel->lz_stat.total)
- );
- spice_info("JPEG \t%8d\t%13.2f\t%12.2f\t%12.2f",
- display_channel->jpeg_stat.count,
- stat_byte_to_mega(display_channel->jpeg_stat.orig_size),
- stat_byte_to_mega(display_channel->jpeg_stat.comp_size),
- stat_cpu_time_to_sec(display_channel->jpeg_stat.total)
- );
- spice_info("JPEG-RGBA\t%8d\t%13.2f\t%12.2f\t%12.2f",
- display_channel->jpeg_alpha_stat.count,
- stat_byte_to_mega(display_channel->jpeg_alpha_stat.orig_size),
- stat_byte_to_mega(display_channel->jpeg_alpha_stat.comp_size),
- stat_cpu_time_to_sec(display_channel->jpeg_alpha_stat.total)
- );
- spice_info("-------------------------------------------------------------------");
- spice_info("Total \t%8d\t%13.2f\t%12.2f\t%12.2f",
- display_channel->lz_stat.count + display_channel->glz_stat.count +
- display_channel->quic_stat.count +
- display_channel->jpeg_stat.count +
- display_channel->jpeg_alpha_stat.count,
- stat_byte_to_mega(display_channel->lz_stat.orig_size +
- display_channel->glz_stat.orig_size +
- display_channel->quic_stat.orig_size +
- display_channel->jpeg_stat.orig_size +
- display_channel->jpeg_alpha_stat.orig_size),
- stat_byte_to_mega(display_channel->lz_stat.comp_size +
- glz_enc_size +
- display_channel->quic_stat.comp_size +
- display_channel->jpeg_stat.comp_size +
- display_channel->jpeg_alpha_stat.comp_size),
- stat_cpu_time_to_sec(display_channel->lz_stat.total +
- display_channel->glz_stat.total +
- display_channel->zlib_glz_stat.total +
- display_channel->quic_stat.total +
- display_channel->jpeg_stat.total +
- display_channel->jpeg_alpha_stat.total)
- );
-}
-
-#endif
-
-static MonitorsConfig *monitors_config_getref(MonitorsConfig *monitors_config)
-{
- monitors_config->refs++;
-
- return monitors_config;
-}
-
-static void monitors_config_decref(MonitorsConfig *monitors_config)
-{
- if (!monitors_config) {
- return;
- }
- if (--monitors_config->refs > 0) {
- return;
- }
-
- spice_debug("freeing monitors config");
- free(monitors_config);
-}
-
-static inline int is_primary_surface(RedWorker *worker, uint32_t surface_id)
-{
- if (surface_id == 0) {
- return TRUE;
- }
- return FALSE;
-}
-
-static inline void __validate_surface(RedWorker *worker, uint32_t surface_id)
-{
- spice_warn_if(surface_id >= worker->n_surfaces);
-}
-
-static int validate_drawable_bbox(RedWorker *worker, RedDrawable *drawable)
-{
- DrawContext *context;
- uint32_t surface_id = drawable->surface_id;
-
- /* surface_id must be validated before calling into
- * validate_drawable_bbox
- */
- __validate_surface(worker, surface_id);
- context = &worker->surfaces[surface_id].context;
-
- if (drawable->bbox.top < 0)
- return FALSE;
- if (drawable->bbox.left < 0)
- return FALSE;
- if (drawable->bbox.bottom < 0)
- return FALSE;
- if (drawable->bbox.right < 0)
- return FALSE;
- if (drawable->bbox.bottom > context->height)
- return FALSE;
- if (drawable->bbox.right > context->width)
- return FALSE;
-
- return TRUE;
-}
-
-static inline int validate_surface(RedWorker *worker, uint32_t surface_id)
-{
- spice_warn_if(surface_id >= worker->n_surfaces);
- if (!worker->surfaces[surface_id].context.canvas) {
- spice_warning("canvas address is %p for %d (and is NULL)\n",
- &(worker->surfaces[surface_id].context.canvas), surface_id);
- spice_warning("failed on %d", surface_id);
- spice_warn_if(!worker->surfaces[surface_id].context.canvas);
- return 0;
- }
- return 1;
-}
-
-static const char *draw_type_to_str(uint8_t type)
-{
- switch (type) {
- case QXL_DRAW_FILL:
- return "QXL_DRAW_FILL";
- case QXL_DRAW_OPAQUE:
- return "QXL_DRAW_OPAQUE";
- case QXL_DRAW_COPY:
- return "QXL_DRAW_COPY";
- case QXL_DRAW_TRANSPARENT:
- return "QXL_DRAW_TRANSPARENT";
- case QXL_DRAW_ALPHA_BLEND:
- return "QXL_DRAW_ALPHA_BLEND";
- case QXL_COPY_BITS:
- return "QXL_COPY_BITS";
- case QXL_DRAW_BLEND:
- return "QXL_DRAW_BLEND";
- case QXL_DRAW_BLACKNESS:
- return "QXL_DRAW_BLACKNESS";
- case QXL_DRAW_WHITENESS:
- return "QXL_DRAW_WHITENESS";
- case QXL_DRAW_INVERS:
- return "QXL_DRAW_INVERS";
- case QXL_DRAW_ROP3:
- return "QXL_DRAW_ROP3";
- case QXL_DRAW_COMPOSITE:
- return "QXL_DRAW_COMPOSITE";
- case QXL_DRAW_STROKE:
- return "QXL_DRAW_STROKE";
- case QXL_DRAW_TEXT:
- return "QXL_DRAW_TEXT";
- default:
- return "?";
- }
-}
-
-static void show_red_drawable(RedWorker *worker, RedDrawable *drawable, const char *prefix)
-{
- if (prefix) {
- printf("%s: ", prefix);
- }
-
- printf("%s effect %d bbox(%d %d %d %d)",
- draw_type_to_str(drawable->type),
- drawable->effect,
- drawable->bbox.top,
- drawable->bbox.left,
- drawable->bbox.bottom,
- drawable->bbox.right);
-
- switch (drawable->type) {
- case QXL_DRAW_FILL:
- case QXL_DRAW_OPAQUE:
- case QXL_DRAW_COPY:
- case QXL_DRAW_TRANSPARENT:
- case QXL_DRAW_ALPHA_BLEND:
- case QXL_COPY_BITS:
- case QXL_DRAW_BLEND:
- case QXL_DRAW_BLACKNESS:
- case QXL_DRAW_WHITENESS:
- case QXL_DRAW_INVERS:
- case QXL_DRAW_ROP3:
- case QXL_DRAW_COMPOSITE:
- case QXL_DRAW_STROKE:
- case QXL_DRAW_TEXT:
- break;
- default:
- spice_error("bad drawable type");
- }
- printf("\n");
-}
-
-static void show_draw_item(RedWorker *worker, DrawItem *draw_item, const char *prefix)
-{
- if (prefix) {
- printf("%s: ", prefix);
- }
- printf("effect %d bbox(%d %d %d %d)\n",
- draw_item->effect,
- draw_item->base.rgn.extents.x1,
- draw_item->base.rgn.extents.y1,
- draw_item->base.rgn.extents.x2,
- draw_item->base.rgn.extents.y2);
-}
-
-static inline int pipe_item_is_linked(PipeItem *item)
-{
- return ring_item_is_linked(&item->link);
-}
-
-static void red_pipe_add_verb(RedChannelClient* rcc, uint16_t verb)
-{
- VerbItem *item = spice_new(VerbItem, 1);
-
- red_channel_pipe_item_init(rcc->channel, &item->base, PIPE_ITEM_TYPE_VERB);
- item->verb = verb;
- red_channel_client_pipe_add(rcc, &item->base);
-}
-
-static inline void red_create_surface_item(DisplayChannelClient *dcc, int surface_id);
-static void red_push_surface_image(DisplayChannelClient *dcc, int surface_id);
-
-static void red_pipes_add_verb(RedChannel *channel, uint16_t verb)
-{
- RedChannelClient *rcc;
- RingItem *link, *next;
-
- RCC_FOREACH_SAFE(link, next, rcc, channel) {
- red_pipe_add_verb(rcc, verb);
- }
-}
-
-static inline void red_handle_drawable_surfaces_client_synced(
- DisplayChannelClient *dcc, Drawable *drawable)
-{
- RedWorker *worker = DCC_TO_WORKER(dcc);
- int x;
-
- for (x = 0; x < 3; ++x) {
- int surface_id;
-
- surface_id = drawable->surfaces_dest[x];
- if (surface_id != -1) {
- if (dcc->surface_client_created[surface_id] == TRUE) {
- continue;
- }
- red_create_surface_item(dcc, surface_id);
- red_current_flush(worker, surface_id);
- red_push_surface_image(dcc, surface_id);
- }
- }
-
- if (dcc->surface_client_created[drawable->surface_id] == TRUE) {
- return;
- }
-
- red_create_surface_item(dcc, drawable->surface_id);
- red_current_flush(worker, drawable->surface_id);
- red_push_surface_image(dcc, drawable->surface_id);
-}
-
-static int display_is_connected(RedWorker *worker)
-{
- return (worker->display_channel && red_channel_is_connected(
- &worker->display_channel->common.base));
-}
-
-static int cursor_is_connected(RedWorker *worker)
-{
- return (worker->cursor_channel && red_channel_is_connected(
- &worker->cursor_channel->common.base));
-}
-
-static void put_drawable_pipe_item(DrawablePipeItem *dpi)
-{
- RedWorker *worker = DCC_TO_WORKER(dpi->dcc);
-
- if (--dpi->refs) {
- return;
- }
-
- spice_assert(!ring_item_is_linked(&dpi->dpi_pipe_item.link));
- spice_assert(!ring_item_is_linked(&dpi->base));
- release_drawable(worker, dpi->drawable);
- free(dpi);
-}
-
-static inline DrawablePipeItem *get_drawable_pipe_item(DisplayChannelClient *dcc,
- Drawable *drawable)
-{
- DrawablePipeItem *dpi;
-
- dpi = spice_malloc0(sizeof(*dpi));
- dpi->drawable = drawable;
- dpi->dcc = dcc;
- ring_item_init(&dpi->base);
- ring_add(&drawable->pipes, &dpi->base);
- red_channel_pipe_item_init(dcc->common.base.channel, &dpi->dpi_pipe_item, PIPE_ITEM_TYPE_DRAW);
- dpi->refs++;
- drawable->refs++;
- return dpi;
-}
-
-static inline DrawablePipeItem *ref_drawable_pipe_item(DrawablePipeItem *dpi)
-{
- spice_assert(dpi->drawable);
- dpi->refs++;
- return dpi;
-}
-
-static inline void red_pipe_add_drawable(DisplayChannelClient *dcc, Drawable *drawable)
-{
- DrawablePipeItem *dpi;
-
- red_handle_drawable_surfaces_client_synced(dcc, drawable);
- dpi = get_drawable_pipe_item(dcc, drawable);
- red_channel_client_pipe_add(&dcc->common.base, &dpi->dpi_pipe_item);
-}
-
-static inline void red_pipes_add_drawable(RedWorker *worker, Drawable *drawable)
-{
- DisplayChannelClient *dcc;
- RingItem *dcc_ring_item, *next;
-
- spice_warn_if(!ring_is_empty(&drawable->pipes));
- WORKER_FOREACH_DCC_SAFE(worker, dcc_ring_item, next, dcc) {
- red_pipe_add_drawable(dcc, drawable);
- }
-}
-
-static inline void red_pipe_add_drawable_to_tail(DisplayChannelClient *dcc, Drawable *drawable)
-{
- DrawablePipeItem *dpi;
-
- if (!dcc) {
- return;
- }
- red_handle_drawable_surfaces_client_synced(dcc, drawable);
- dpi = get_drawable_pipe_item(dcc, drawable);
- red_channel_client_pipe_add_tail(&dcc->common.base, &dpi->dpi_pipe_item);
-}
-
-static inline void red_pipes_add_drawable_after(RedWorker *worker,
- Drawable *drawable, Drawable *pos_after)
-{
- DrawablePipeItem *dpi, *dpi_pos_after;
- RingItem *dpi_link, *dpi_next;
- DisplayChannelClient *dcc;
- int num_other_linked = 0;
-
- DRAWABLE_FOREACH_DPI_SAFE(pos_after, dpi_link, dpi_next, dpi_pos_after) {
- num_other_linked++;
- dcc = dpi_pos_after->dcc;
- red_handle_drawable_surfaces_client_synced(dcc, drawable);
- dpi = get_drawable_pipe_item(dcc, drawable);
- red_channel_client_pipe_add_after(&dcc->common.base, &dpi->dpi_pipe_item,
- &dpi_pos_after->dpi_pipe_item);
- }
- if (num_other_linked == 0) {
- red_pipes_add_drawable(worker, drawable);
- return;
- }
- if (num_other_linked != worker->display_channel->common.base.clients_num) {
- RingItem *worker_item, *next;
- spice_debug("TODO: not O(n^2)");
- WORKER_FOREACH_DCC_SAFE(worker, worker_item, next, dcc) {
- int sent = 0;
- DRAWABLE_FOREACH_DPI_SAFE(pos_after, dpi_link, dpi_next, dpi_pos_after) {
- if (dpi_pos_after->dcc == dcc) {
- sent = 1;
- break;
- }
- }
- if (!sent) {
- red_pipe_add_drawable(dcc, drawable);
- }
- }
- }
-}
-
-static inline PipeItem *red_pipe_get_tail(DisplayChannelClient *dcc)
-{
- if (!dcc) {
- return NULL;
- }
-
- return (PipeItem*)ring_get_tail(&dcc->common.base.pipe);
-}
-
-static inline void red_destroy_surface(RedWorker *worker, uint32_t surface_id);
-
-static inline void red_pipes_remove_drawable(Drawable *drawable)
-{
- DrawablePipeItem *dpi;
- RingItem *item, *next;
-
- RING_FOREACH_SAFE(item, next, &drawable->pipes) {
- dpi = SPICE_CONTAINEROF(item, DrawablePipeItem, base);
- if (pipe_item_is_linked(&dpi->dpi_pipe_item)) {
- red_channel_client_pipe_remove_and_release(&dpi->dcc->common.base,
- &dpi->dpi_pipe_item);
- }
- }
-}
-
-static inline void red_pipe_add_image_item(DisplayChannelClient *dcc, ImageItem *item)
-{
- if (!dcc) {
- return;
- }
- item->refs++;
- red_channel_client_pipe_add(&dcc->common.base, &item->link);
-}
-
-static inline void red_pipe_add_image_item_after(DisplayChannelClient *dcc, ImageItem *item,
- PipeItem *pos)
-{
- if (!dcc) {
- return;
- }
- item->refs++;
- red_channel_client_pipe_add_after(&dcc->common.base, &item->link, pos);
-}
-
-static void release_image_item(ImageItem *item)
-{
- if (!--item->refs) {
- free(item);
- }
-}
-
-static void release_upgrade_item(RedWorker* worker, UpgradeItem *item)
-{
- if (!--item->refs) {
- release_drawable(worker, item->drawable);
- free(item->rects);
- free(item);
- }
-}
-
-static uint8_t *common_alloc_recv_buf(RedChannelClient *rcc, uint16_t type, uint32_t size)
-{
- CommonChannel *common = SPICE_CONTAINEROF(rcc->channel, CommonChannel, base);
-
- /* SPICE_MSGC_MIGRATE_DATA is the only client message whose size is dynamic */
- if (type == SPICE_MSGC_MIGRATE_DATA) {
- return spice_malloc(size);
- }
-
- if (size > CHANNEL_RECEIVE_BUF_SIZE) {
- spice_critical("unexpected message size %u (max is %d)", size, CHANNEL_RECEIVE_BUF_SIZE);
- return NULL;
- }
- return common->recv_buf;
-}
-
-static void common_release_recv_buf(RedChannelClient *rcc, uint16_t type, uint32_t size,
- uint8_t* msg)
-{
- if (type == SPICE_MSGC_MIGRATE_DATA) {
- free(msg);
- }
-}
-
-#define CLIENT_PIXMAPS_CACHE
-#include "red_client_shared_cache.h"
-#undef CLIENT_PIXMAPS_CACHE
-
-#define CLIENT_CURSOR_CACHE
-#include "red_client_cache.h"
-#undef CLIENT_CURSOR_CACHE
-
-#define CLIENT_PALETTE_CACHE
-#include "red_client_cache.h"
-#undef CLIENT_PALETTE_CACHE
-
-static void red_reset_palette_cache(DisplayChannelClient *dcc)
-{
- red_palette_cache_reset(dcc, CLIENT_PALETTE_CACHE_SIZE);
-}
-
-static void red_reset_cursor_cache(RedChannelClient *rcc)
-{
- red_cursor_cache_reset(RCC_TO_CCC(rcc), CLIENT_CURSOR_CACHE_SIZE);
-}
-
-static inline Drawable *alloc_drawable(RedWorker *worker)
-{
- Drawable *drawable;
- if (!worker->free_drawables) {
- return NULL;
- }
- drawable = &worker->free_drawables->u.drawable;
- worker->free_drawables = worker->free_drawables->u.next;
- return drawable;
-}
-
-static inline void free_drawable(RedWorker *worker, Drawable *item)
-{
- ((_Drawable *)item)->u.next = worker->free_drawables;
- worker->free_drawables = (_Drawable *)item;
-}
-
-static void drawables_init(RedWorker *worker)
-{
- int i;
-
- worker->free_drawables = NULL;
- for (i = 0; i < NUM_DRAWABLES; i++) {
- free_drawable(worker, &worker->drawables[i].u.drawable);
- }
-}
-
-
-static void red_reset_stream_trace(RedWorker *worker);
-
-static SurfaceDestroyItem *get_surface_destroy_item(RedChannel *channel,
- uint32_t surface_id)
-{
- SurfaceDestroyItem *destroy;
-
- destroy = (SurfaceDestroyItem *)malloc(sizeof(SurfaceDestroyItem));
- spice_warn_if(!destroy);
-
- destroy->surface_destroy.surface_id = surface_id;
-
- red_channel_pipe_item_init(channel,
- &destroy->pipe_item, PIPE_ITEM_TYPE_DESTROY_SURFACE);
-
- return destroy;
-}
-
-static inline void red_destroy_surface_item(RedWorker *worker,
- DisplayChannelClient *dcc, uint32_t surface_id)
-{
- SurfaceDestroyItem *destroy;
- RedChannel *channel;
-
- if (!dcc || worker->display_channel->common.during_target_migrate ||
- !dcc->surface_client_created[surface_id]) {
- return;
- }
- dcc->surface_client_created[surface_id] = FALSE;
- channel = &worker->display_channel->common.base;
- destroy = get_surface_destroy_item(channel, surface_id);
- red_channel_client_pipe_add(&dcc->common.base, &destroy->pipe_item);
-}
-
-static inline void red_destroy_surface(RedWorker *worker, uint32_t surface_id)
-{
- RedSurface *surface = &worker->surfaces[surface_id];
- DisplayChannelClient *dcc;
- RingItem *link, *next;
-
- if (!--surface->refs) {
- // only primary surface streams are supported
- if (is_primary_surface(worker, surface_id)) {
- red_reset_stream_trace(worker);
- }
- spice_assert(surface->context.canvas);
-
- surface->context.canvas->ops->destroy(surface->context.canvas);
- if (surface->create.info) {
- worker->qxl->st->qif->release_resource(worker->qxl, surface->create);
- }
- if (surface->destroy.info) {
- worker->qxl->st->qif->release_resource(worker->qxl, surface->destroy);
- }
-
- region_destroy(&surface->draw_dirty_region);
- surface->context.canvas = NULL;
- WORKER_FOREACH_DCC_SAFE(worker, link, next, dcc) {
- red_destroy_surface_item(worker, dcc, surface_id);
- }
-
- spice_warn_if(!ring_is_empty(&surface->depend_on_me));
- }
-}
-
-static inline void set_surface_release_info(RedWorker *worker, uint32_t surface_id, int is_create,
- QXLReleaseInfo *release_info, uint32_t group_id)
-{
- RedSurface *surface;
-
- surface = &worker->surfaces[surface_id];
-
- if (is_create) {
- surface->create.info = release_info;
- surface->create.group_id = group_id;
- } else {
- surface->destroy.info = release_info;
- surface->destroy.group_id = group_id;
- }
-}
-
-static RedDrawable *ref_red_drawable(RedDrawable *drawable)
-{
- drawable->refs++;
- return drawable;
-}
-
-
-static inline void put_red_drawable(RedWorker *worker, RedDrawable *red_drawable,
- uint32_t group_id)
-{
- QXLReleaseInfoExt release_info_ext;
-
- if (--red_drawable->refs) {
- return;
- }
- worker->red_drawable_count--;
- release_info_ext.group_id = group_id;
- release_info_ext.info = red_drawable->release_info;
- worker->qxl->st->qif->release_resource(worker->qxl, release_info_ext);
- red_put_drawable(red_drawable);
- free(red_drawable);
-}
-
-static void remove_depended_item(DependItem *item)
-{
- spice_assert(item->drawable);
- spice_assert(ring_item_is_linked(&item->ring_item));
- item->drawable = NULL;
- ring_remove(&item->ring_item);
-}
-
-static inline void red_dec_surfaces_drawable_dependencies(RedWorker *worker, Drawable *drawable)
-{
- int x;
- int surface_id;
-
- for (x = 0; x < 3; ++x) {
- surface_id = drawable->surfaces_dest[x];
- if (surface_id == -1) {
- continue;
- }
- red_destroy_surface(worker, surface_id);
- }
-}
-
-static void remove_drawable_dependencies(RedWorker *worker, Drawable *drawable)
-{
- int x;
- int surface_id;
-
- for (x = 0; x < 3; ++x) {
- surface_id = drawable->surfaces_dest[x];
- if (surface_id != -1 && drawable->depend_items[x].drawable) {
- remove_depended_item(&drawable->depend_items[x]);
- }
- }
-}
-
-static inline void release_drawable(RedWorker *worker, Drawable *drawable)
-{
- RingItem *item, *next;
-
- if (!--drawable->refs) {
- spice_assert(!drawable->tree_item.shadow);
- spice_assert(ring_is_empty(&drawable->pipes));
-
- if (drawable->stream) {
- red_detach_stream(worker, drawable->stream, TRUE);
- }
- region_destroy(&drawable->tree_item.base.rgn);
-
- remove_drawable_dependencies(worker, drawable);
- red_dec_surfaces_drawable_dependencies(worker, drawable);
- red_destroy_surface(worker, drawable->surface_id);
-
- RING_FOREACH_SAFE(item, next, &drawable->glz_ring) {
- SPICE_CONTAINEROF(item, RedGlzDrawable, drawable_link)->drawable = NULL;
- ring_remove(item);
- }
- put_red_drawable(worker, drawable->red_drawable, drawable->group_id);
- free_drawable(worker, drawable);
- worker->drawable_count--;
- }
-}
-
-static inline void remove_shadow(RedWorker *worker, DrawItem *item)
-{
- Shadow *shadow;
-
- if (!item->shadow) {
- return;
- }
- shadow = item->shadow;
- item->shadow = NULL;
- ring_remove(&shadow->base.siblings_link);
- region_destroy(&shadow->base.rgn);
- region_destroy(&shadow->on_hold);
- free(shadow);
- worker->shadows_count--;
-}
-
-static inline void current_remove_container(RedWorker *worker, Container *container)
-{
- spice_assert(ring_is_empty(&container->items));
- worker->containers_count--;
- ring_remove(&container->base.siblings_link);
- region_destroy(&container->base.rgn);
- free(container);
-}
-
-static inline void container_cleanup(RedWorker *worker, Container *container)
-{
- while (container && container->items.next == container->items.prev) {
- Container *next = container->base.container;
- if (container->items.next != &container->items) {
- TreeItem *item = (TreeItem *)ring_get_head(&container->items);
- spice_assert(item);
- ring_remove(&item->siblings_link);
- ring_add_after(&item->siblings_link, &container->base.siblings_link);
- item->container = container->base.container;
- }
- current_remove_container(worker, container);
- container = next;
- }
-}
-
-static inline void red_add_item_trace(RedWorker *worker, Drawable *item)
-{
- ItemTrace *trace;
- if (!item->streamable) {
- return;
- }
-
- trace = &worker->items_trace[worker->next_item_trace++ & ITEMS_TRACE_MASK];
- trace->time = item->creation_time;
- trace->frames_count = item->frames_count;
- trace->gradual_frames_count = item->gradual_frames_count;
- trace->last_gradual_frame = item->last_gradual_frame;
- SpiceRect* src_area = &item->red_drawable->u.copy.src_area;
- trace->width = src_area->right - src_area->left;
- trace->height = src_area->bottom - src_area->top;
- trace->dest_area = item->red_drawable->bbox;
-}
-
-static void surface_flush(RedWorker *worker, int surface_id, SpiceRect *rect)
-{
- red_update_area(worker, rect, surface_id);
-}
-
-static void red_flush_source_surfaces(RedWorker *worker, Drawable *drawable)
-{
- int x;
- int surface_id;
-
- for (x = 0; x < 3; ++x) {
- surface_id = drawable->surfaces_dest[x];
- if (surface_id != -1 && drawable->depend_items[x].drawable) {
- remove_depended_item(&drawable->depend_items[x]);
- surface_flush(worker, surface_id, &drawable->red_drawable->surfaces_rects[x]);
- }
- }
-}
-
-static inline void current_remove_drawable(RedWorker *worker, Drawable *item)
-{
- if (item->tree_item.effect != QXL_EFFECT_OPAQUE) {
- worker->transparent_count--;
- }
- if (!item->stream) {
- red_add_item_trace(worker, item);
- }
- remove_shadow(worker, &item->tree_item);
- ring_remove(&item->tree_item.base.siblings_link);
- ring_remove(&item->list_link);
- ring_remove(&item->surface_list_link);
- release_drawable(worker, item);
- worker->current_size--;
-}
-
-static void remove_drawable(RedWorker *worker, Drawable *drawable)
-{
- red_pipes_remove_drawable(drawable);
- current_remove_drawable(worker, drawable);
-}
-
-static inline void current_remove(RedWorker *worker, TreeItem *item)
-{
- TreeItem *now = item;
-
- for (;;) {
- Container *container = now->container;
- RingItem *ring_item;
-
- if (now->type == TREE_ITEM_TYPE_DRAWABLE) {
- ring_item = now->siblings_link.prev;
- remove_drawable(worker, SPICE_CONTAINEROF(now, Drawable, tree_item));
- } else {
- Container *container = (Container *)now;
-
- spice_assert(now->type == TREE_ITEM_TYPE_CONTAINER);
-
- if ((ring_item = ring_get_head(&container->items))) {
- now = SPICE_CONTAINEROF(ring_item, TreeItem, siblings_link);
- continue;
- }
- ring_item = now->siblings_link.prev;
- current_remove_container(worker, container);
- }
- if (now == item) {
- return;
- }
-
- if ((ring_item = ring_next(&container->items, ring_item))) {
- now = SPICE_CONTAINEROF(ring_item, TreeItem, siblings_link);
- } else {
- now = (TreeItem *)container;
- }
- }
-}
-
-static void current_tree_for_each(Ring *ring, void (*f)(TreeItem *, void *), void * data)
-{
- RingItem *ring_item;
- Ring *top_ring;
-
- if (!(ring_item = ring_get_head(ring))) {
- return;
- }
- top_ring = ring;
-
- for (;;) {
- TreeItem *now = SPICE_CONTAINEROF(ring_item, TreeItem, siblings_link);
-
- f(now, data);
-
- if (now->type == TREE_ITEM_TYPE_CONTAINER) {
- Container *container = (Container *)now;
-
- if ((ring_item = ring_get_head(&container->items))) {
- ring = &container->items;
- continue;
- }
- }
- for (;;) {
- ring_item = ring_next(ring, &now->siblings_link);
- if (ring_item) {
- break;
- }
- if (ring == top_ring) {
- return;
- }
- now = (TreeItem *)now->container;
- ring = (now->container) ? &now->container->items : top_ring;
- }
- }
-}
-
-static void red_current_clear(RedWorker *worker, int surface_id)
-{
- RingItem *ring_item;
-
- while ((ring_item = ring_get_head(&worker->surfaces[surface_id].current))) {
- TreeItem *now = SPICE_CONTAINEROF(ring_item, TreeItem, siblings_link);
- current_remove(worker, now);
- }
-}
-
-/*
- * Return: TRUE if wait_if_used == FALSE, or otherwise, if all of the pipe items that
- * are related to the surface have been cleared (or sent) from the pipe.
- */
-static int red_clear_surface_drawables_from_pipe(DisplayChannelClient *dcc, int surface_id,
- int wait_if_used)
-{
- Ring *ring;
- PipeItem *item;
- int x;
- RedChannelClient *rcc;
-
- if (!dcc) {
- return TRUE;
- }
-
- /* removing the newest drawables that their destination is surface_id and
- no other drawable depends on them */
-
- rcc = &dcc->common.base;
- ring = &dcc->common.base.pipe;
- item = (PipeItem *) ring;
- while ((item = (PipeItem *)ring_next(ring, (RingItem *)item))) {
- Drawable *drawable;
- DrawablePipeItem *dpi = NULL;
- int depend_found = FALSE;
-
- if (item->type == PIPE_ITEM_TYPE_DRAW) {
- dpi = SPICE_CONTAINEROF(item, DrawablePipeItem, dpi_pipe_item);
- drawable = dpi->drawable;
- } else if (item->type == PIPE_ITEM_TYPE_UPGRADE) {
- drawable = ((UpgradeItem *)item)->drawable;
- } else {
- continue;
- }
-
- if (drawable->surface_id == surface_id) {
- PipeItem *tmp_item = item;
- item = (PipeItem *)ring_prev(ring, (RingItem *)item);
- red_channel_client_pipe_remove_and_release(rcc, tmp_item);
- if (!item) {
- item = (PipeItem *)ring;
- }
- continue;
- }
-
- for (x = 0; x < 3; ++x) {
- if (drawable->surfaces_dest[x] == surface_id) {
- depend_found = TRUE;
- break;
- }
- }
-
- if (depend_found) {
- spice_debug("surface %d dependent item found %p, %p", surface_id, drawable, item);
- if (wait_if_used) {
- break;
- } else {
- return TRUE;
- }
- }
- }
-
- if (!wait_if_used) {
- return TRUE;
- }
-
- if (item) {
- return red_channel_client_wait_pipe_item_sent(&dcc->common.base, item,
- DISPLAY_CLIENT_TIMEOUT);
- } else {
- /*
- * in case that the pipe didn't contain any item that is dependent on the surface, but
- * there is one during sending. Use a shorter timeout, since it is just one item
- */
- return red_channel_client_wait_outgoing_item(&dcc->common.base,
- DISPLAY_CLIENT_SHORT_TIMEOUT);
- }
- return TRUE;
-}
-
-static void red_clear_surface_drawables_from_pipes(RedWorker *worker,
- int surface_id,
- int wait_if_used)
-{
- RingItem *item, *next;
- DisplayChannelClient *dcc;
-
- WORKER_FOREACH_DCC_SAFE(worker, item, next, dcc) {
- if (!red_clear_surface_drawables_from_pipe(dcc, surface_id, wait_if_used)) {
- red_channel_client_disconnect(&dcc->common.base);
- }
- }
-}
-
-#ifdef PIPE_DEBUG
-
-static void print_rgn(const char* prefix, const QRegion* rgn)
-{
- int i;
- printf("TEST: %s: RGN: bbox %u %u %u %u\n",
- prefix,
- rgn->bbox.top,
- rgn->bbox.left,
- rgn->bbox.bottom,
- rgn->bbox.right);
-
- for (i = 0; i < rgn->num_rects; i++) {
- printf("TEST: %s: RECT %u %u %u %u\n",
- prefix,
- rgn->rects[i].top,
- rgn->rects[i].left,
- rgn->rects[i].bottom,
- rgn->rects[i].right);
- }
-}
-
-static void print_draw_item(const char* prefix, const DrawItem *draw_item)
-{
- const TreeItem *base = &draw_item->base;
- const Drawable *drawable = SPICE_CONTAINEROF(draw_item, Drawable, tree_item);
- printf("TEST: %s: draw id %u container %u effect %u",
- prefix,
- base->id, base->container ? base->container->base.id : 0,
- draw_item->effect);
- if (draw_item->shadow) {
- printf(" shadow %u\n", draw_item->shadow->base.id);
- } else {
- printf("\n");
- }
- print_rgn(prefix, &base->rgn);
-}
-
-static void print_shadow_item(const char* prefix, const Shadow *item)
-{
- printf("TEST: %s: shadow %p id %d\n", prefix, item, item->base.id);
- print_rgn(prefix, &item->base.rgn);
-}
-
-static void print_container_item(const char* prefix, const Container *item)
-{
- printf("TEST: %s: container %p id %d\n", prefix, item, item->base.id);
- print_rgn(prefix, &item->base.rgn);
-}
-
-static void print_base_item(const char* prefix, const TreeItem *base)
-{
- switch (base->type) {
- case TREE_ITEM_TYPE_DRAWABLE:
- print_draw_item(prefix, (const DrawItem *)base);
- break;
- case TREE_ITEM_TYPE_SHADOW:
- print_shadow_item(prefix, (const Shadow *)base);
- break;
- case TREE_ITEM_TYPE_CONTAINER:
- print_container_item(prefix, (const Container *)base);
- break;
- default:
- spice_error("invalid type %u", base->type);
- }
-}
-
-void __show_current(TreeItem *item, void *data)
-{
- print_base_item("TREE", item);
-}
-
-static void show_current(RedWorker *worker, Ring *ring)
-{
- if (ring_is_empty(ring)) {
- spice_info("TEST: TREE: EMPTY");
- return;
- }
- current_tree_for_each(ring, __show_current, NULL);
-}
-
-#else
-#define print_rgn(a, b)
-#define print_draw_private(a, b)
-#define show_current(a, r)
-#define print_shadow_item(a, b)
-#define print_base_item(a, b)
-#endif
-
-static inline Shadow *__find_shadow(TreeItem *item)
-{
- while (item->type == TREE_ITEM_TYPE_CONTAINER) {
- if (!(item = (TreeItem *)ring_get_tail(&((Container *)item)->items))) {
- return NULL;
- }
- }
-
- if (item->type != TREE_ITEM_TYPE_DRAWABLE) {
- return NULL;
- }
-
- return ((DrawItem *)item)->shadow;
-}
-
-static inline Ring *ring_of(RedWorker *worker, Ring *ring, TreeItem *item)
-{
- return (item->container) ? &item->container->items : ring;
-}
-
-static inline int __contained_by(RedWorker *worker, TreeItem *item, Ring *ring)
-{
- spice_assert(item && ring);
- do {
- Ring *now = ring_of(worker, ring, item);
- if (now == ring) {
- return TRUE;
- }
- } while ((item = (TreeItem *)item->container));
-
- return FALSE;
-}
-
-static inline void __exclude_region(RedWorker *worker, Ring *ring, TreeItem *item, QRegion *rgn,
- Ring **top_ring, Drawable *frame_candidate)
-{
- QRegion and_rgn;
-#ifdef RED_WORKER_STAT
- stat_time_t start_time = stat_now();
-#endif
-
- region_clone(&and_rgn, rgn);
- region_and(&and_rgn, &item->rgn);
- if (!region_is_empty(&and_rgn)) {
- if (IS_DRAW_ITEM(item)) {
- DrawItem *draw = (DrawItem *)item;
-
- if (draw->effect == QXL_EFFECT_OPAQUE) {
- region_exclude(rgn, &and_rgn);
- }
-
- if (draw->shadow) {
- Shadow *shadow;
- int32_t x = item->rgn.extents.x1;
- int32_t y = item->rgn.extents.y1;
-
- region_exclude(&draw->base.rgn, &and_rgn);
- shadow = draw->shadow;
- region_offset(&and_rgn, shadow->base.rgn.extents.x1 - x,
- shadow->base.rgn.extents.y1 - y);
- region_exclude(&shadow->base.rgn, &and_rgn);
- region_and(&and_rgn, &shadow->on_hold);
- if (!region_is_empty(&and_rgn)) {
- region_exclude(&shadow->on_hold, &and_rgn);
- region_or(rgn, &and_rgn);
- // in flat representation of current, shadow is always his owner next
- if (!__contained_by(worker, (TreeItem*)shadow, *top_ring)) {
- *top_ring = ring_of(worker, ring, (TreeItem*)shadow);
- }
- }
- } else {
- if (frame_candidate) {
- Drawable *drawable = SPICE_CONTAINEROF(draw, Drawable, tree_item);
- red_stream_maintenance(worker, frame_candidate, drawable);
- }
- region_exclude(&draw->base.rgn, &and_rgn);
- }
- } else if (item->type == TREE_ITEM_TYPE_CONTAINER) {
- region_exclude(&item->rgn, &and_rgn);
-
- if (region_is_empty(&item->rgn)) { //assume container removal will follow
- Shadow *shadow;
-
- region_exclude(rgn, &and_rgn);
- if ((shadow = __find_shadow(item))) {
- region_or(rgn, &shadow->on_hold);
- if (!__contained_by(worker, (TreeItem*)shadow, *top_ring)) {
- *top_ring = ring_of(worker, ring, (TreeItem*)shadow);
- }
- }
- }
- } else {
- Shadow *shadow;
-
- spice_assert(item->type == TREE_ITEM_TYPE_SHADOW);
- shadow = (Shadow *)item;
- region_exclude(rgn, &and_rgn);
- region_or(&shadow->on_hold, &and_rgn);
- }
- }
- region_destroy(&and_rgn);
- stat_add(&worker->__exclude_stat, start_time);
-}
-
-static void exclude_region(RedWorker *worker, Ring *ring, RingItem *ring_item, QRegion *rgn,
- TreeItem **last, Drawable *frame_candidate)
-{
-#ifdef RED_WORKER_STAT
- stat_time_t start_time = stat_now();
-#endif
- Ring *top_ring;
-
- if (!ring_item) {
- return;
- }
-
- top_ring = ring;
-
- for (;;) {
- TreeItem *now = SPICE_CONTAINEROF(ring_item, TreeItem, siblings_link);
- Container *container = now->container;
-
- spice_assert(!region_is_empty(&now->rgn));
-
- if (region_intersects(rgn, &now->rgn)) {
- print_base_item("EXCLUDE2", now);
- __exclude_region(worker, ring, now, rgn, &top_ring, frame_candidate);
- print_base_item("EXCLUDE3", now);
-
- if (region_is_empty(&now->rgn)) {
- spice_assert(now->type != TREE_ITEM_TYPE_SHADOW);
- ring_item = now->siblings_link.prev;
- print_base_item("EXCLUDE_REMOVE", now);
- current_remove(worker, now);
- if (last && *last == now) {
- *last = (TreeItem *)ring_next(ring, ring_item);
- }
- } else if (now->type == TREE_ITEM_TYPE_CONTAINER) {
- Container *container = (Container *)now;
- if ((ring_item = ring_get_head(&container->items))) {
- ring = &container->items;
- spice_assert(((TreeItem *)ring_item)->container);
- continue;
- }
- ring_item = &now->siblings_link;
- }
-
- if (region_is_empty(rgn)) {
- stat_add(&worker->exclude_stat, start_time);
- return;
- }
- }
-
- while ((last && *last == (TreeItem *)ring_item) ||
- !(ring_item = ring_next(ring, ring_item))) {
- if (ring == top_ring) {
- stat_add(&worker->exclude_stat, start_time);
- return;
- }
- ring_item = &container->base.siblings_link;
- container = container->base.container;
- ring = (container) ? &container->items : top_ring;
- }
- }
-}
-
-static inline Container *__new_container(RedWorker *worker, DrawItem *item)
-{
- Container *container = spice_new(Container, 1);
- worker->containers_count++;
-#ifdef PIPE_DEBUG
- container->base.id = ++worker->last_id;
-#endif
- container->base.type = TREE_ITEM_TYPE_CONTAINER;
- container->base.container = item->base.container;
- item->base.container = container;
- item->container_root = TRUE;
- region_clone(&container->base.rgn, &item->base.rgn);
- ring_item_init(&container->base.siblings_link);
- ring_add_after(&container->base.siblings_link, &item->base.siblings_link);
- ring_remove(&item->base.siblings_link);
- ring_init(&container->items);
- ring_add(&container->items, &item->base.siblings_link);
-
- return container;
-}
-
-static inline int is_opaque_item(TreeItem *item)
-{
- return item->type == TREE_ITEM_TYPE_CONTAINER ||
- (IS_DRAW_ITEM(item) && ((DrawItem *)item)->effect == QXL_EFFECT_OPAQUE);
-}
-
-static inline void __current_add_drawable(RedWorker *worker, Drawable *drawable, RingItem *pos)
-{
- RedSurface *surface;
- uint32_t surface_id = drawable->surface_id;
-
- surface = &worker->surfaces[surface_id];
- ring_add_after(&drawable->tree_item.base.siblings_link, pos);
- ring_add(&worker->current_list, &drawable->list_link);
- ring_add(&surface->current_list, &drawable->surface_list_link);
- worker->current_size++;
- drawable->refs++;
-}
-
-static int is_equal_path(RedWorker *worker, SpicePath *path1, SpicePath *path2)
-{
- SpicePathSeg *seg1, *seg2;
- int i, j;
-
- if (path1->num_segments != path2->num_segments)
- return FALSE;
-
- for (i = 0; i < path1->num_segments; i++) {
- seg1 = path1->segments[i];
- seg2 = path2->segments[i];
-
- if (seg1->flags != seg2->flags ||
- seg1->count != seg2->count) {
- return FALSE;
- }
- for (j = 0; j < seg1->count; j++) {
- if (seg1->points[j].x != seg2->points[j].x ||
- seg1->points[j].y != seg2->points[j].y) {
- return FALSE;
- }
- }
- }
-
- return TRUE;
-}
-
-// partial imp
-static int is_equal_brush(SpiceBrush *b1, SpiceBrush *b2)
-{
- return b1->type == b2->type &&
- b1->type == SPICE_BRUSH_TYPE_SOLID &&
- b1->u.color == b2->u.color;
-}
-
-// partial imp
-static int is_equal_line_attr(SpiceLineAttr *a1, SpiceLineAttr *a2)
-{
- return a1->flags == a2->flags &&
- a1->style_nseg == a2->style_nseg &&
- a1->style_nseg == 0;
-}
-
-// partial imp
-static int is_same_geometry(RedWorker *worker, Drawable *d1, Drawable *d2)
-{
- if (d1->red_drawable->type != d2->red_drawable->type) {
- return FALSE;
- }
-
- switch (d1->red_drawable->type) {
- case QXL_DRAW_STROKE:
- return is_equal_line_attr(&d1->red_drawable->u.stroke.attr,
- &d2->red_drawable->u.stroke.attr) &&
- is_equal_path(worker, d1->red_drawable->u.stroke.path,
- d2->red_drawable->u.stroke.path);
- case QXL_DRAW_FILL:
- return rect_is_equal(&d1->red_drawable->bbox, &d2->red_drawable->bbox);
- default:
- return FALSE;
- }
-}
-
-static int is_same_drawable(RedWorker *worker, Drawable *d1, Drawable *d2)
-{
- if (!is_same_geometry(worker, d1, d2)) {
- return FALSE;
- }
-
- switch (d1->red_drawable->type) {
- case QXL_DRAW_STROKE:
- return is_equal_brush(&d1->red_drawable->u.stroke.brush,
- &d2->red_drawable->u.stroke.brush);
- case QXL_DRAW_FILL:
- return is_equal_brush(&d1->red_drawable->u.fill.brush,
- &d2->red_drawable->u.fill.brush);
- default:
- return FALSE;
- }
-}
-
-static inline void red_free_stream(RedWorker *worker, Stream *stream)
-{
- if (stream->input_fps_timer) {
- spice_timer_remove(stream->input_fps_timer);
- }
- stream->next = worker->free_streams;
- worker->free_streams = stream;
-}
-
-static void red_release_stream(RedWorker *worker, Stream *stream)
-{
- if (!--stream->refs) {
- spice_assert(!ring_item_is_linked(&stream->link));
- red_free_stream(worker, stream);
- worker->stream_count--;
- }
-}
-
-static inline void red_detach_stream(RedWorker *worker, Stream *stream, int detach_sized)
-{
- spice_assert(stream->current && stream->current->stream);
- spice_assert(stream->current->stream == stream);
- stream->current->stream = NULL;
- if (detach_sized) {
- stream->current->sized_stream = NULL;
- }
- stream->current = NULL;
-}
-
-static StreamClipItem *__new_stream_clip(DisplayChannelClient* dcc, StreamAgent *agent)
-{
- StreamClipItem *item = spice_new(StreamClipItem, 1);
- red_channel_pipe_item_init(dcc->common.base.channel,
- (PipeItem *)item, PIPE_ITEM_TYPE_STREAM_CLIP);
-
- item->stream_agent = agent;
- agent->stream->refs++;
- item->refs = 1;
- return item;
-}
-
-static void push_stream_clip(DisplayChannelClient* dcc, StreamAgent *agent)
-{
- StreamClipItem *item = __new_stream_clip(dcc, agent);
- int n_rects;
-
- if (!item) {
- spice_critical("alloc failed");
- }
- item->clip_type = SPICE_CLIP_TYPE_RECTS;
-
- n_rects = pixman_region32_n_rects(&agent->clip);
-
- item->rects = spice_malloc_n_m(n_rects, sizeof(SpiceRect), sizeof(SpiceClipRects));
- item->rects->num_rects = n_rects;
- region_ret_rects(&agent->clip, item->rects->rects, n_rects);
- red_channel_client_pipe_add(&dcc->common.base, (PipeItem *)item);
-}
-
-static void red_display_release_stream_clip(RedWorker *worker, StreamClipItem *item)
-{
- if (!--item->refs) {
- red_display_release_stream(worker, item->stream_agent);
- free(item->rects);
- free(item);
- }
-}
-
-static inline int get_stream_id(RedWorker *worker, Stream *stream)
-{
- return (int)(stream - worker->streams_buf);
-}
-
-static void red_attach_stream(RedWorker *worker, Drawable *drawable, Stream *stream)
-{
- DisplayChannelClient *dcc;
- RingItem *item, *next;
-
- spice_assert(!drawable->stream && !stream->current);
- spice_assert(drawable && stream);
- stream->current = drawable;
- drawable->stream = stream;
- stream->last_time = drawable->creation_time;
- stream->num_input_frames++;
-
- WORKER_FOREACH_DCC_SAFE(worker, item, next, dcc) {
- StreamAgent *agent;
- QRegion clip_in_draw_dest;
-
- agent = &dcc->stream_agents[get_stream_id(worker, stream)];
- region_or(&agent->vis_region, &drawable->tree_item.base.rgn);
-
- region_init(&clip_in_draw_dest);
- region_add(&clip_in_draw_dest, &drawable->red_drawable->bbox);
- region_and(&clip_in_draw_dest, &agent->clip);
-
- if (!region_is_equal(&clip_in_draw_dest, &drawable->tree_item.base.rgn)) {
- region_remove(&agent->clip, &drawable->red_drawable->bbox);
- region_or(&agent->clip, &drawable->tree_item.base.rgn);
- push_stream_clip(dcc, agent);
- }
-#ifdef STREAM_STATS
- agent->stats.num_input_frames++;
-#endif
- }
-}
-
-static void red_print_stream_stats(DisplayChannelClient *dcc, StreamAgent *agent)
-{
-#ifdef STREAM_STATS
- StreamStats *stats = &agent->stats;
- double passed_mm_time = (stats->end - stats->start) / 1000.0;
- MJpegEncoderStats encoder_stats = {0};
-
- if (agent->mjpeg_encoder) {
- mjpeg_encoder_get_stats(agent->mjpeg_encoder, &encoder_stats);
- }
-
- spice_debug("stream=%"PRIdPTR" dim=(%dx%d) #in-frames=%"PRIu64" #in-avg-fps=%.2f #out-frames=%"PRIu64" "
- "out/in=%.2f #drops=%"PRIu64" (#pipe=%"PRIu64" #fps=%"PRIu64") out-avg-fps=%.2f "
- "passed-mm-time(sec)=%.2f size-total(MB)=%.2f size-per-sec(Mbps)=%.2f "
- "size-per-frame(KBpf)=%.2f avg-quality=%.2f "
- "start-bit-rate(Mbps)=%.2f end-bit-rate(Mbps)=%.2f",
- agent - dcc->stream_agents, agent->stream->width, agent->stream->height,
- stats->num_input_frames,
- stats->num_input_frames / passed_mm_time,
- stats->num_frames_sent,
- (stats->num_frames_sent + 0.0) / stats->num_input_frames,
- stats->num_drops_pipe +
- stats->num_drops_fps,
- stats->num_drops_pipe,
- stats->num_drops_fps,
- stats->num_frames_sent / passed_mm_time,
- passed_mm_time,
- stats->size_sent / 1024.0 / 1024.0,
- ((stats->size_sent * 8.0) / (1024.0 * 1024)) / passed_mm_time,
- stats->size_sent / 1000.0 / stats->num_frames_sent,
- encoder_stats.avg_quality,
- encoder_stats.starting_bit_rate / (1024.0 * 1024),
- encoder_stats.cur_bit_rate / (1024.0 * 1024));
-#endif
-}
-
-static void red_stop_stream(RedWorker *worker, Stream *stream)
-{
- DisplayChannelClient *dcc;
- RingItem *item, *next;
-
- spice_assert(ring_item_is_linked(&stream->link));
- spice_assert(!stream->current);
- spice_debug("stream %d", get_stream_id(worker, stream));
- WORKER_FOREACH_DCC_SAFE(worker, item, next, dcc) {
- StreamAgent *stream_agent;
-
- stream_agent = &dcc->stream_agents[get_stream_id(worker, stream)];
- region_clear(&stream_agent->vis_region);
- region_clear(&stream_agent->clip);
- spice_assert(!pipe_item_is_linked(&stream_agent->destroy_item));
- if (stream_agent->mjpeg_encoder && dcc->use_mjpeg_encoder_rate_control) {
- uint64_t stream_bit_rate = mjpeg_encoder_get_bit_rate(stream_agent->mjpeg_encoder);
-
- if (stream_bit_rate > dcc->streams_max_bit_rate) {
- spice_debug("old max-bit-rate=%.2f new=%.2f",
- dcc->streams_max_bit_rate / 8.0 / 1024.0 / 1024.0,
- stream_bit_rate / 8.0 / 1024.0 / 1024.0);
- dcc->streams_max_bit_rate = stream_bit_rate;
- }
- }
- stream->refs++;
- red_channel_client_pipe_add(&dcc->common.base, &stream_agent->destroy_item);
- red_print_stream_stats(dcc, stream_agent);
- }
- worker->streams_size_total -= stream->width * stream->height;
- ring_remove(&stream->link);
- red_release_stream(worker, stream);
-}
-
-static int red_display_drawable_is_in_pipe(DisplayChannelClient *dcc, Drawable *drawable)
-{
- DrawablePipeItem *dpi;
- RingItem *dpi_link, *dpi_next;
-
- DRAWABLE_FOREACH_DPI_SAFE(drawable, dpi_link, dpi_next, dpi) {
- if (dpi->dcc == dcc) {
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-/*
- * after red_display_detach_stream_gracefully is called for all the display channel clients,
- * red_detach_stream should be called. See comment (1).
- */
-static inline void red_display_detach_stream_gracefully(DisplayChannelClient *dcc,
- Stream *stream,
- Drawable *update_area_limit)
-{
- int stream_id = get_stream_id(dcc->common.worker, stream);
- StreamAgent *agent = &dcc->stream_agents[stream_id];
-
- /* stopping the client from playing older frames at once*/
- region_clear(&agent->clip);
- push_stream_clip(dcc, agent);
-
- if (region_is_empty(&agent->vis_region)) {
- spice_debug("stream %d: vis region empty", stream_id);
- return;
- }
-
- if (stream->current &&
- region_contains(&stream->current->tree_item.base.rgn, &agent->vis_region)) {
- RedChannel *channel;
- RedChannelClient *rcc;
- UpgradeItem *upgrade_item;
- int n_rects;
-
- /* (1) The caller should detach the drawable from the stream. This will
- * lead to sending the drawable losslessly, as an ordinary drawable. */
- if (red_display_drawable_is_in_pipe(dcc, stream->current)) {
- spice_debug("stream %d: upgrade by linked drawable. sized %d, box ==>",
- stream_id, stream->current->sized_stream != NULL);
- rect_debug(&stream->current->red_drawable->bbox);
- goto clear_vis_region;
- }
- spice_debug("stream %d: upgrade by drawable. sized %d, box ==>",
- stream_id, stream->current->sized_stream != NULL);
- rect_debug(&stream->current->red_drawable->bbox);
- rcc = &dcc->common.base;
- channel = rcc->channel;
- upgrade_item = spice_new(UpgradeItem, 1);
- upgrade_item->refs = 1;
- red_channel_pipe_item_init(channel,
- &upgrade_item->base, PIPE_ITEM_TYPE_UPGRADE);
- upgrade_item->drawable = stream->current;
- upgrade_item->drawable->refs++;
- n_rects = pixman_region32_n_rects(&upgrade_item->drawable->tree_item.base.rgn);
- upgrade_item->rects = spice_malloc_n_m(n_rects, sizeof(SpiceRect), sizeof(SpiceClipRects));
- upgrade_item->rects->num_rects = n_rects;
- region_ret_rects(&upgrade_item->drawable->tree_item.base.rgn,
- upgrade_item->rects->rects, n_rects);
- red_channel_client_pipe_add(rcc, &upgrade_item->base);
-
- } else {
- SpiceRect upgrade_area;
-
- region_extents(&agent->vis_region, &upgrade_area);
- spice_debug("stream %d: upgrade by screenshot. has current %d. box ==>",
- stream_id, stream->current != NULL);
- rect_debug(&upgrade_area);
- if (update_area_limit) {
- red_update_area_till(dcc->common.worker, &upgrade_area, 0, update_area_limit);
- } else {
- red_update_area(dcc->common.worker, &upgrade_area, 0);
- }
- red_add_surface_area_image(dcc, 0, &upgrade_area, NULL, FALSE);
- }
-clear_vis_region:
- region_clear(&agent->vis_region);
-}
-
-static inline void red_detach_stream_gracefully(RedWorker *worker, Stream *stream,
- Drawable *update_area_limit)
-{
- RingItem *item, *next;
- DisplayChannelClient *dcc;
-
- WORKER_FOREACH_DCC_SAFE(worker, item, next, dcc) {
- red_display_detach_stream_gracefully(dcc, stream, update_area_limit);
- }
- if (stream->current) {
- red_detach_stream(worker, stream, TRUE);
- }
-}
-
-/*
- * region : a primary surface region. Streams that intersects with the given
- * region will be detached.
- * drawable: If detaching the stream is triggered by the addition of a new drawable
- * that is dependent on the given region, and the drawable is already a part
- * of the "current tree", the drawable parameter should be set with
- * this drawable, otherwise, it should be NULL. Then, if detaching the stream
- * involves sending an upgrade image to the client, this drawable won't be rendered
- * (see red_display_detach_stream_gracefully).
- */
-static void red_detach_streams_behind(RedWorker *worker, QRegion *region, Drawable *drawable)
-{
- Ring *ring = &worker->streams;
- RingItem *item = ring_get_head(ring);
- RingItem *dcc_ring_item, *next;
- DisplayChannelClient *dcc;
- int has_clients = display_is_connected(worker);
-
- while (item) {
- Stream *stream = SPICE_CONTAINEROF(item, Stream, link);
- int detach_stream = 0;
- item = ring_next(ring, item);
-
- WORKER_FOREACH_DCC_SAFE(worker, dcc_ring_item, next, dcc) {
- StreamAgent *agent = &dcc->stream_agents[get_stream_id(worker, stream)];
-
- if (region_intersects(&agent->vis_region, region)) {
- red_display_detach_stream_gracefully(dcc, stream, drawable);
- detach_stream = 1;
- spice_debug("stream %d", get_stream_id(worker, stream));
- }
- }
- if (detach_stream && stream->current) {
- red_detach_stream(worker, stream, TRUE);
- } else if (!has_clients) {
- if (stream->current &&
- region_intersects(&stream->current->tree_item.base.rgn, region)) {
- red_detach_stream(worker, stream, TRUE);
- }
- }
- }
-}
-
-static void red_streams_update_visible_region(RedWorker *worker, Drawable *drawable)
-{
- Ring *ring;
- RingItem *item;
- RingItem *dcc_ring_item, *next;
- DisplayChannelClient *dcc;
-
- if (!display_is_connected(worker)) {
- return;
- }
-
- if (!is_primary_surface(worker, drawable->surface_id)) {
- return;
- }
-
- ring = &worker->streams;
- item = ring_get_head(ring);
-
- while (item) {
- Stream *stream = SPICE_CONTAINEROF(item, Stream, link);
- StreamAgent *agent;
-
- item = ring_next(ring, item);
-
- if (stream->current == drawable) {
- continue;
- }
-
- WORKER_FOREACH_DCC_SAFE(worker, dcc_ring_item, next, dcc) {
- agent = &dcc->stream_agents[get_stream_id(worker, stream)];
-
- if (region_intersects(&agent->vis_region, &drawable->tree_item.base.rgn)) {
- region_exclude(&agent->vis_region, &drawable->tree_item.base.rgn);
- region_exclude(&agent->clip, &drawable->tree_item.base.rgn);
- push_stream_clip(dcc, agent);
- }
- }
- }
-}
-
-static inline unsigned int red_get_streams_timout(RedWorker *worker)
-{
- unsigned int timout = -1;
- Ring *ring = &worker->streams;
- RingItem *item = ring;
- struct timespec time;
-
- clock_gettime(CLOCK_MONOTONIC, &time);
- red_time_t now = timespec_to_red_time(&time);
- while ((item = ring_next(ring, item))) {
- Stream *stream;
-
- stream = SPICE_CONTAINEROF(item, Stream, link);
- red_time_t delta = (stream->last_time + RED_STREAM_TIMOUT) - now;
-
- if (delta < 1000 * 1000) {
- return 0;
- }
- timout = MIN(timout, (unsigned int)(delta / (1000 * 1000)));
- }
- return timout;
-}
-
-static inline void red_handle_streams_timout(RedWorker *worker)
-{
- Ring *ring = &worker->streams;
- struct timespec time;
- RingItem *item;
-
- clock_gettime(CLOCK_MONOTONIC, &time);
- red_time_t now = timespec_to_red_time(&time);
- item = ring_get_head(ring);
- while (item) {
- Stream *stream = SPICE_CONTAINEROF(item, Stream, link);
- item = ring_next(ring, item);
- if (now >= (stream->last_time + RED_STREAM_TIMOUT)) {
- red_detach_stream_gracefully(worker, stream, NULL);
- red_stop_stream(worker, stream);
- }
- }
-}
-
-static void red_display_release_stream(RedWorker *worker, StreamAgent *agent)
-{
- spice_assert(agent->stream);
- red_release_stream(worker, agent->stream);
-}
-
-static inline Stream *red_alloc_stream(RedWorker *worker)
-{
- Stream *stream;
- if (!worker->free_streams) {
- return NULL;
- }
- stream = worker->free_streams;
- worker->free_streams = worker->free_streams->next;
- return stream;
-}
-
-static uint64_t red_stream_get_initial_bit_rate(DisplayChannelClient *dcc,
- Stream *stream)
-{
- char *env_bit_rate_str;
- uint64_t bit_rate = 0;
-
- env_bit_rate_str = getenv("SPICE_BIT_RATE");
- if (env_bit_rate_str != NULL) {
- double env_bit_rate;
-
- errno = 0;
- env_bit_rate = strtod(env_bit_rate_str, NULL);
- if (errno == 0) {
- bit_rate = env_bit_rate * 1024 * 1024;
- } else {
- spice_warning("error parsing SPICE_BIT_RATE: %s", strerror(errno));
- }
- }
-
- if (!bit_rate) {
- MainChannelClient *mcc;
- uint64_t net_test_bit_rate;
-
- mcc = red_client_get_main(dcc->common.base.client);
- net_test_bit_rate = main_channel_client_is_network_info_initialized(mcc) ?
- main_channel_client_get_bitrate_per_sec(mcc) :
- 0;
- bit_rate = MAX(dcc->streams_max_bit_rate, net_test_bit_rate);
- if (bit_rate == 0) {
- /*
- * In case we are after a spice session migration,
- * the low_bandwidth flag is retrieved from migration data.
- * If the network info is not initialized due to another reason,
- * the low_bandwidth flag is FALSE.
- */
- bit_rate = dcc->common.is_low_bandwidth ?
- RED_STREAM_DEFAULT_LOW_START_BIT_RATE :
- RED_STREAM_DEFAULT_HIGH_START_BIT_RATE;
- }
- }
-
- spice_debug("base-bit-rate %.2f (Mbps)", bit_rate / 1024.0 / 1024.0);
- /* dividing the available bandwidth among the active streams, and saving
- * (1-RED_STREAM_CHANNEL_CAPACITY) of it for other messages */
- return (RED_STREAM_CHANNEL_CAPACITY * bit_rate *
- stream->width * stream->height) / dcc->common.worker->streams_size_total;
-}
-
-static uint32_t red_stream_mjpeg_encoder_get_roundtrip(void *opaque)
-{
- StreamAgent *agent = opaque;
- int roundtrip;
-
- spice_assert(agent);
- roundtrip = red_channel_client_get_roundtrip_ms(&agent->dcc->common.base);
- if (roundtrip < 0) {
- MainChannelClient *mcc = red_client_get_main(agent->dcc->common.base.client);
-
- /*
- * the main channel client roundtrip might not have been
- * calculated (e.g., after migration). In such case,
- * main_channel_client_get_roundtrip_ms returns 0.
- */
- roundtrip = main_channel_client_get_roundtrip_ms(mcc);
- }
-
- return roundtrip;
-}
-
-static uint32_t red_stream_mjpeg_encoder_get_source_fps(void *opaque)
-{
- StreamAgent *agent = opaque;
-
- spice_assert(agent);
- return agent->stream->input_fps;
-}
-
-static void red_display_update_streams_max_latency(DisplayChannelClient *dcc, StreamAgent *remove_agent)
-{
- uint32_t new_max_latency = 0;
- int i;
-
- if (dcc->streams_max_latency != remove_agent->client_required_latency) {
- return;
- }
-
- dcc->streams_max_latency = 0;
- if (dcc->common.worker->stream_count == 1) {
- return;
- }
- for (i = 0; i < NUM_STREAMS; i++) {
- StreamAgent *other_agent = &dcc->stream_agents[i];
- if (other_agent == remove_agent || !other_agent->mjpeg_encoder) {
- continue;
- }
- if (other_agent->client_required_latency > new_max_latency) {
- new_max_latency = other_agent->client_required_latency;
- }
- }
- dcc->streams_max_latency = new_max_latency;
-}
-
-static void red_display_stream_agent_stop(DisplayChannelClient *dcc, StreamAgent *agent)
-{
- red_display_update_streams_max_latency(dcc, agent);
- if (agent->mjpeg_encoder) {
- mjpeg_encoder_destroy(agent->mjpeg_encoder);
- agent->mjpeg_encoder = NULL;
- }
-}
-
-static void red_stream_update_client_playback_latency(void *opaque, uint32_t delay_ms)
-{
- StreamAgent *agent = opaque;
- DisplayChannelClient *dcc = agent->dcc;
-
- red_display_update_streams_max_latency(dcc, agent);
-
- agent->client_required_latency = delay_ms;
- if (delay_ms > agent->dcc->streams_max_latency) {
- agent->dcc->streams_max_latency = delay_ms;
- }
- spice_debug("reseting client latency: %u", agent->dcc->streams_max_latency);
- main_dispatcher_set_mm_time_latency(agent->dcc->common.base.client, agent->dcc->streams_max_latency);
-}
-
-static void red_display_create_stream(DisplayChannelClient *dcc, Stream *stream)
-{
- StreamAgent *agent = &dcc->stream_agents[get_stream_id(dcc->common.worker, stream)];
-
- stream->refs++;
- spice_assert(region_is_empty(&agent->vis_region));
- if (stream->current) {
- agent->frames = 1;
- region_clone(&agent->vis_region, &stream->current->tree_item.base.rgn);
- region_clone(&agent->clip, &agent->vis_region);
- } else {
- agent->frames = 0;
- }
- agent->drops = 0;
- agent->fps = MAX_FPS;
- agent->dcc = dcc;
-
- if (dcc->use_mjpeg_encoder_rate_control) {
- MJpegEncoderRateControlCbs mjpeg_cbs;
- uint64_t initial_bit_rate;
-
- mjpeg_cbs.get_roundtrip_ms = red_stream_mjpeg_encoder_get_roundtrip;
- mjpeg_cbs.get_source_fps = red_stream_mjpeg_encoder_get_source_fps;
- mjpeg_cbs.update_client_playback_delay = red_stream_update_client_playback_latency;
-
- initial_bit_rate = red_stream_get_initial_bit_rate(dcc, stream);
- agent->mjpeg_encoder = mjpeg_encoder_new(TRUE, initial_bit_rate, &mjpeg_cbs, agent);
- } else {
- agent->mjpeg_encoder = mjpeg_encoder_new(FALSE, 0, NULL, NULL);
- }
- red_channel_client_pipe_add(&dcc->common.base, &agent->create_item);
-
- if (red_channel_client_test_remote_cap(&dcc->common.base, SPICE_DISPLAY_CAP_STREAM_REPORT)) {
- StreamActivateReportItem *report_pipe_item = spice_malloc0(sizeof(*report_pipe_item));
-
- agent->report_id = rand();
- red_channel_pipe_item_init(dcc->common.base.channel, &report_pipe_item->pipe_item,
- PIPE_ITEM_TYPE_STREAM_ACTIVATE_REPORT);
- report_pipe_item->stream_id = get_stream_id(dcc->common.worker, stream);
- red_channel_client_pipe_add(&dcc->common.base, &report_pipe_item->pipe_item);
- }
-#ifdef STREAM_STATS
- memset(&agent->stats, 0, sizeof(StreamStats));
- if (stream->current) {
- agent->stats.start = stream->current->red_drawable->mm_time;
- }
-#endif
-}
-
-static void red_stream_input_fps_timer_cb(void *opaque)
-{
- Stream *stream = opaque;
- uint64_t now = red_now();
- double duration_sec;
-
- spice_assert(opaque);
- if (now == stream->input_fps_timer_start) {
- spice_warning("timer start and expiry time are equal");
- return;
- }
- duration_sec = (now - stream->input_fps_timer_start)/(1000.0*1000*1000);
- stream->input_fps = stream->num_input_frames / duration_sec;
- spice_debug("input-fps=%u", stream->input_fps);
- stream->num_input_frames = 0;
- stream->input_fps_timer_start = now;
-}
-
-static void red_create_stream(RedWorker *worker, Drawable *drawable)
-{
- DisplayChannelClient *dcc;
- RingItem *dcc_ring_item, *next;
- Stream *stream;
- SpiceRect* src_rect;
-
- spice_assert(!drawable->stream);
-
- if (!(stream = red_alloc_stream(worker))) {
- return;
- }
-
- spice_assert(drawable->red_drawable->type == QXL_DRAW_COPY);
- src_rect = &drawable->red_drawable->u.copy.src_area;
-
- ring_add(&worker->streams, &stream->link);
- stream->current = drawable;
- stream->last_time = drawable->creation_time;
- stream->width = src_rect->right - src_rect->left;
- stream->height = src_rect->bottom - src_rect->top;
- stream->dest_area = drawable->red_drawable->bbox;
- stream->refs = 1;
- SpiceBitmap *bitmap = &drawable->red_drawable->u.copy.src_bitmap->u.bitmap;
- stream->top_down = !!(bitmap->flags & SPICE_BITMAP_FLAGS_TOP_DOWN);
- drawable->stream = stream;
- stream->input_fps_timer = spice_timer_queue_add(red_stream_input_fps_timer_cb, stream);
- spice_assert(stream->input_fps_timer);
- spice_timer_set(stream->input_fps_timer, RED_STREAM_INPUT_FPS_TIMEOUT);
- stream->num_input_frames = 0;
- stream->input_fps_timer_start = red_now();
- stream->input_fps = MAX_FPS;
- worker->streams_size_total += stream->width * stream->height;
- worker->stream_count++;
- WORKER_FOREACH_DCC_SAFE(worker, dcc_ring_item, next, dcc) {
- red_display_create_stream(dcc, stream);
- }
- spice_debug("stream %d %dx%d (%d, %d) (%d, %d)", (int)(stream - worker->streams_buf), stream->width,
- stream->height, stream->dest_area.left, stream->dest_area.top,
- stream->dest_area.right, stream->dest_area.bottom);
- return;
-}
-
-static void red_disply_start_streams(DisplayChannelClient *dcc)
-{
- Ring *ring = &dcc->common.worker->streams;
- RingItem *item = ring;
-
- while ((item = ring_next(ring, item))) {
- Stream *stream = SPICE_CONTAINEROF(item, Stream, link);
- red_display_create_stream(dcc, stream);
- }
-}
-
-static void red_display_client_init_streams(DisplayChannelClient *dcc)
-{
- int i;
- RedWorker *worker = dcc->common.worker;
- RedChannel *channel = dcc->common.base.channel;
-
- for (i = 0; i < NUM_STREAMS; i++) {
- StreamAgent *agent = &dcc->stream_agents[i];
- agent->stream = &worker->streams_buf[i];
- region_init(&agent->vis_region);
- region_init(&agent->clip);
- red_channel_pipe_item_init(channel, &agent->create_item, PIPE_ITEM_TYPE_STREAM_CREATE);
- red_channel_pipe_item_init(channel, &agent->destroy_item, PIPE_ITEM_TYPE_STREAM_DESTROY);
- }
- dcc->use_mjpeg_encoder_rate_control =
- red_channel_client_test_remote_cap(&dcc->common.base, SPICE_DISPLAY_CAP_STREAM_REPORT);
-}
-
-static void red_display_destroy_streams_agents(DisplayChannelClient *dcc)
-{
- int i;
-
- for (i = 0; i < NUM_STREAMS; i++) {
- StreamAgent *agent = &dcc->stream_agents[i];
- region_destroy(&agent->vis_region);
- region_destroy(&agent->clip);
- if (agent->mjpeg_encoder) {
- mjpeg_encoder_destroy(agent->mjpeg_encoder);
- agent->mjpeg_encoder = NULL;
- }
- }
-}
-
-static void red_init_streams(RedWorker *worker)
-{
- int i;
-
- ring_init(&worker->streams);
- worker->free_streams = NULL;
- for (i = 0; i < NUM_STREAMS; i++) {
- Stream *stream = &worker->streams_buf[i];
- ring_item_init(&stream->link);
- red_free_stream(worker, stream);
- }
-}
-
-static inline int __red_is_next_stream_frame(RedWorker *worker,
- const Drawable *candidate,
- const int other_src_width,
- const int other_src_height,
- const SpiceRect *other_dest,
- const red_time_t other_time,
- const Stream *stream,
- int container_candidate_allowed)
-{
- RedDrawable *red_drawable;
- int is_frame_container = FALSE;
-
- if (!candidate->streamable) {
- return STREAM_FRAME_NONE;
- }
-
- if (candidate->creation_time - other_time >
- (stream ? RED_STREAM_CONTINUS_MAX_DELTA : RED_STREAM_DETACTION_MAX_DELTA)) {
- return STREAM_FRAME_NONE;
- }
-
- red_drawable = candidate->red_drawable;
- if (!container_candidate_allowed) {
- SpiceRect* candidate_src;
-
- if (!rect_is_equal(&red_drawable->bbox, other_dest)) {
- return STREAM_FRAME_NONE;
- }
-
- candidate_src = &red_drawable->u.copy.src_area;
- if (candidate_src->right - candidate_src->left != other_src_width ||
- candidate_src->bottom - candidate_src->top != other_src_height) {
- return STREAM_FRAME_NONE;
- }
- } else {
- if (rect_contains(&red_drawable->bbox, other_dest)) {
- int candidate_area = rect_get_area(&red_drawable->bbox);
- int other_area = rect_get_area(other_dest);
- /* do not stream drawables that are significantly
- * bigger than the original frame */
- if (candidate_area > 2 * other_area) {
- spice_debug("too big candidate:");
- spice_debug("prev box ==>");
- rect_debug(other_dest);
- spice_debug("new box ==>");
- rect_debug(&red_drawable->bbox);
- return STREAM_FRAME_NONE;
- }
-
- if (candidate_area > other_area) {
- is_frame_container = TRUE;
- }
- } else {
- return STREAM_FRAME_NONE;
- }
- }
-
- if (stream) {
- SpiceBitmap *bitmap = &red_drawable->u.copy.src_bitmap->u.bitmap;
- if (stream->top_down != !!(bitmap->flags & SPICE_BITMAP_FLAGS_TOP_DOWN)) {
- return STREAM_FRAME_NONE;
- }
- }
- if (is_frame_container) {
- return STREAM_FRAME_CONTAINER;
- } else {
- return STREAM_FRAME_NATIVE;
- }
-}
-
-static inline int red_is_next_stream_frame(RedWorker *worker, const Drawable *candidate,
- const Drawable *prev)
-{
- if (!candidate->streamable) {
- return FALSE;
- }
-
- SpiceRect* prev_src = &prev->red_drawable->u.copy.src_area;
- return __red_is_next_stream_frame(worker, candidate, prev_src->right - prev_src->left,
- prev_src->bottom - prev_src->top,
- &prev->red_drawable->bbox, prev->creation_time,
- prev->stream,
- FALSE);
-}
-
-static inline void pre_stream_item_swap(RedWorker *worker, Stream *stream, Drawable *new_frame)
-{
- DrawablePipeItem *dpi;
- DisplayChannelClient *dcc;
- int index;
- StreamAgent *agent;
- RingItem *ring_item, *next;
-
- spice_assert(stream->current);
-
- if (!display_is_connected(worker)) {
- return;
- }
-
- if (new_frame->process_commands_generation == stream->current->process_commands_generation) {
- spice_debug("ignoring drop, same process_commands_generation as previous frame");
- return;
- }
-
- index = get_stream_id(worker, stream);
- DRAWABLE_FOREACH_DPI_SAFE(stream->current, ring_item, next, dpi) {
- dcc = dpi->dcc;
- agent = &dcc->stream_agents[index];
-
- if (!dcc->use_mjpeg_encoder_rate_control &&
- !dcc->common.is_low_bandwidth) {
- continue;
- }
-
- if (pipe_item_is_linked(&dpi->dpi_pipe_item)) {
-#ifdef STREAM_STATS
- agent->stats.num_drops_pipe++;
-#endif
- if (dcc->use_mjpeg_encoder_rate_control) {
- mjpeg_encoder_notify_server_frame_drop(agent->mjpeg_encoder);
- } else {
- ++agent->drops;
- }
- }
- }
-
-
- WORKER_FOREACH_DCC_SAFE(worker, ring_item, next, dcc) {
- double drop_factor;
-
- agent = &dcc->stream_agents[index];
-
- if (dcc->use_mjpeg_encoder_rate_control) {
- continue;
- }
- if (agent->frames / agent->fps < FPS_TEST_INTERVAL) {
- agent->frames++;
- continue;
- }
- drop_factor = ((double)agent->frames - (double)agent->drops) /
- (double)agent->frames;
- spice_debug("stream %d: #frames %u #drops %u", index, agent->frames, agent->drops);
- if (drop_factor == 1) {
- if (agent->fps < MAX_FPS) {
- agent->fps++;
- spice_debug("stream %d: fps++ %u", index, agent->fps);
- }
- } else if (drop_factor < 0.9) {
- if (agent->fps > 1) {
- agent->fps--;
- spice_debug("stream %d: fps--%u", index, agent->fps);
- }
- }
- agent->frames = 1;
- agent->drops = 0;
- }
-}
-
-static inline void red_update_copy_graduality(RedWorker* worker, Drawable *drawable)
-{
- SpiceBitmap *bitmap;
- spice_assert(drawable->red_drawable->type == QXL_DRAW_COPY);
-
- if (worker->streaming_video != STREAM_VIDEO_FILTER) {
- drawable->copy_bitmap_graduality = BITMAP_GRADUAL_INVALID;
- return;
- }
-
- if (drawable->copy_bitmap_graduality != BITMAP_GRADUAL_INVALID) {
- return; // already set
- }
-
- bitmap = &drawable->red_drawable->u.copy.src_bitmap->u.bitmap;
-
- if (!BITMAP_FMT_HAS_GRADUALITY(bitmap->format) || _stride_is_extra(bitmap) ||
- (bitmap->data->flags & SPICE_CHUNKS_FLAGS_UNSTABLE)) {
- drawable->copy_bitmap_graduality = BITMAP_GRADUAL_NOT_AVAIL;
- } else {
- drawable->copy_bitmap_graduality =
- _get_bitmap_graduality_level(worker, bitmap,drawable->group_id);
- }
-}
-
-static inline int red_is_stream_start(Drawable *drawable)
-{
- return ((drawable->frames_count >= RED_STREAM_FRAMES_START_CONDITION) &&
- (drawable->gradual_frames_count >=
- (RED_STREAM_GRADUAL_FRAMES_START_CONDITION * drawable->frames_count)));
-}
-
-// returns whether a stream was created
-static int red_stream_add_frame(RedWorker *worker,
- Drawable *frame_drawable,
- int frames_count,
- int gradual_frames_count,
- int last_gradual_frame)
-{
- red_update_copy_graduality(worker, frame_drawable);
- frame_drawable->frames_count = frames_count + 1;
- frame_drawable->gradual_frames_count = gradual_frames_count;
-
- if (frame_drawable->copy_bitmap_graduality != BITMAP_GRADUAL_LOW) {
- if ((frame_drawable->frames_count - last_gradual_frame) >
- RED_STREAM_FRAMES_RESET_CONDITION) {
- frame_drawable->frames_count = 1;
- frame_drawable->gradual_frames_count = 1;
- } else {
- frame_drawable->gradual_frames_count++;
- }
-
- frame_drawable->last_gradual_frame = frame_drawable->frames_count;
- } else {
- frame_drawable->last_gradual_frame = last_gradual_frame;
- }
-
- if (red_is_stream_start(frame_drawable)) {
- red_create_stream(worker, frame_drawable);
- return TRUE;
- }
- return FALSE;
-}
-
-static inline void red_stream_maintenance(RedWorker *worker, Drawable *candidate, Drawable *prev)
-{
- Stream *stream;
-
- if (candidate->stream) {
- return;
- }
-
- if ((stream = prev->stream)) {
- int is_next_frame = __red_is_next_stream_frame(worker,
- candidate,
- stream->width,
- stream->height,
- &stream->dest_area,
- stream->last_time,
- stream,
- TRUE);
- if (is_next_frame != STREAM_FRAME_NONE) {
- pre_stream_item_swap(worker, stream, candidate);
- red_detach_stream(worker, stream, FALSE);
- prev->streamable = FALSE; //prevent item trace
- red_attach_stream(worker, candidate, stream);
- if (is_next_frame == STREAM_FRAME_CONTAINER) {
- candidate->sized_stream = stream;
- }
- }
- } else {
- if (red_is_next_stream_frame(worker, candidate, prev) != STREAM_FRAME_NONE) {
- red_stream_add_frame(worker, candidate,
- prev->frames_count,
- prev->gradual_frames_count,
- prev->last_gradual_frame);
- }
- }
-}
-
-static inline int is_drawable_independent_from_surfaces(Drawable *drawable)
-{
- int x;
-
- for (x = 0; x < 3; ++x) {
- if (drawable->surfaces_dest[x] != -1) {
- return FALSE;
- }
- }
- return TRUE;
-}
-
-static inline int red_current_add_equal(RedWorker *worker, DrawItem *item, TreeItem *other)
-{
- DrawItem *other_draw_item;
- Drawable *drawable;
- Drawable *other_drawable;
-
- if (other->type != TREE_ITEM_TYPE_DRAWABLE) {
- return FALSE;
- }
- other_draw_item = (DrawItem *)other;
-
- if (item->shadow || other_draw_item->shadow || item->effect != other_draw_item->effect) {
- return FALSE;
- }
-
- drawable = SPICE_CONTAINEROF(item, Drawable, tree_item);
- other_drawable = SPICE_CONTAINEROF(other_draw_item, Drawable, tree_item);
-
- if (item->effect == QXL_EFFECT_OPAQUE) {
- int add_after = !!other_drawable->stream &&
- is_drawable_independent_from_surfaces(drawable);
- red_stream_maintenance(worker, drawable, other_drawable);
- __current_add_drawable(worker, drawable, &other->siblings_link);
- other_drawable->refs++;
- current_remove_drawable(worker, other_drawable);
- if (add_after) {
- red_pipes_add_drawable_after(worker, drawable, other_drawable);
- } else {
- red_pipes_add_drawable(worker, drawable);
- }
- red_pipes_remove_drawable(other_drawable);
- release_drawable(worker, other_drawable);
- return TRUE;
- }
-
- switch (item->effect) {
- case QXL_EFFECT_REVERT_ON_DUP:
- if (is_same_drawable(worker, drawable, other_drawable)) {
-
- DisplayChannelClient *dcc;
- DrawablePipeItem *dpi;
- RingItem *worker_ring_item, *dpi_ring_item;
-
- other_drawable->refs++;
- current_remove_drawable(worker, other_drawable);
-
- /* sending the drawable to clients that already received
- * (or will receive) other_drawable */
- worker_ring_item = ring_get_head(&worker->display_channel->common.base.clients);
- dpi_ring_item = ring_get_head(&other_drawable->pipes);
- /* dpi contains a sublist of dcc's, ordered the same */
- while (worker_ring_item) {
- dcc = SPICE_CONTAINEROF(worker_ring_item, DisplayChannelClient,
- common.base.channel_link);
- dpi = SPICE_CONTAINEROF(dpi_ring_item, DrawablePipeItem, base);
- while (worker_ring_item && (!dpi || dcc != dpi->dcc)) {
- red_pipe_add_drawable(dcc, drawable);
- worker_ring_item = ring_next(&worker->display_channel->common.base.clients,
- worker_ring_item);
- dcc = SPICE_CONTAINEROF(worker_ring_item, DisplayChannelClient,
- common.base.channel_link);
- }
-
- if (dpi_ring_item) {
- dpi_ring_item = ring_next(&other_drawable->pipes, dpi_ring_item);
- }
- if (worker_ring_item) {
- worker_ring_item = ring_next(&worker->display_channel->common.base.clients,
- worker_ring_item);
- }
- }
- /* not sending other_drawable where possible */
- red_pipes_remove_drawable(other_drawable);
-
- release_drawable(worker, other_drawable);
- return TRUE;
- }
- break;
- case QXL_EFFECT_OPAQUE_BRUSH:
- if (is_same_geometry(worker, drawable, other_drawable)) {
- __current_add_drawable(worker, drawable, &other->siblings_link);
- remove_drawable(worker, other_drawable);
- red_pipes_add_drawable(worker, drawable);
- return TRUE;
- }
- break;
- case QXL_EFFECT_NOP_ON_DUP:
- if (is_same_drawable(worker, drawable, other_drawable)) {
- return TRUE;
- }
- break;
- }
- return FALSE;
-}
-
-static inline void red_use_stream_trace(RedWorker *worker, Drawable *drawable)
-{
- ItemTrace *trace;
- ItemTrace *trace_end;
- Ring *ring;
- RingItem *item;
-
- if (drawable->stream || !drawable->streamable || drawable->frames_count) {
- return;
- }
-
-
- ring = &worker->streams;
- item = ring_get_head(ring);
-
- while (item) {
- Stream *stream = SPICE_CONTAINEROF(item, Stream, link);
- int is_next_frame = __red_is_next_stream_frame(worker,
- drawable,
- stream->width,
- stream->height,
- &stream->dest_area,
- stream->last_time,
- stream,
- TRUE);
- if (is_next_frame != STREAM_FRAME_NONE) {
- if (stream->current) {
- stream->current->streamable = FALSE; //prevent item trace
- pre_stream_item_swap(worker, stream, drawable);
- red_detach_stream(worker, stream, FALSE);
- }
- red_attach_stream(worker, drawable, stream);
- if (is_next_frame == STREAM_FRAME_CONTAINER) {
- drawable->sized_stream = stream;
- }
- return;
- }
- item = ring_next(ring, item);
- }
-
- trace = worker->items_trace;
- trace_end = trace + NUM_TRACE_ITEMS;
- for (; trace < trace_end; trace++) {
- if (__red_is_next_stream_frame(worker, drawable, trace->width, trace->height,
- &trace->dest_area, trace->time, NULL, FALSE) !=
- STREAM_FRAME_NONE) {
- if (red_stream_add_frame(worker, drawable,
- trace->frames_count,
- trace->gradual_frames_count,
- trace->last_gradual_frame)) {
- return;
- }
- }
- }
-}
-
-static void red_reset_stream_trace(RedWorker *worker)
-{
- Ring *ring = &worker->streams;
- RingItem *item = ring_get_head(ring);
-
- while (item) {
- Stream *stream = SPICE_CONTAINEROF(item, Stream, link);
- item = ring_next(ring, item);
- if (!stream->current) {
- red_stop_stream(worker, stream);
- } else {
- spice_info("attached stream");
- }
- }
-
- worker->next_item_trace = 0;
- memset(worker->items_trace, 0, sizeof(worker->items_trace));
-}
-
-static inline int red_current_add(RedWorker *worker, Ring *ring, Drawable *drawable)
-{
- DrawItem *item = &drawable->tree_item;
-#ifdef RED_WORKER_STAT
- stat_time_t start_time = stat_now();
-#endif
- RingItem *now;
- QRegion exclude_rgn;
- RingItem *exclude_base = NULL;
-
- print_base_item("ADD", &item->base);
- spice_assert(!region_is_empty(&item->base.rgn));
- region_init(&exclude_rgn);
- now = ring_next(ring, ring);
-
- while (now) {
- TreeItem *sibling = SPICE_CONTAINEROF(now, TreeItem, siblings_link);
- int test_res;
-
- if (!region_bounds_intersects(&item->base.rgn, &sibling->rgn)) {
- print_base_item("EMPTY", sibling);
- now = ring_next(ring, now);
- continue;
- }
- test_res = region_test(&item->base.rgn, &sibling->rgn, REGION_TEST_ALL);
- if (!(test_res & REGION_TEST_SHARED)) {
- print_base_item("EMPTY", sibling);
- now = ring_next(ring, now);
- continue;
- } else if (sibling->type != TREE_ITEM_TYPE_SHADOW) {
- if (!(test_res & REGION_TEST_RIGHT_EXCLUSIVE) &&
- !(test_res & REGION_TEST_LEFT_EXCLUSIVE) &&
- red_current_add_equal(worker, item, sibling)) {
- stat_add(&worker->add_stat, start_time);
- return FALSE;
- }
-
- if (!(test_res & REGION_TEST_RIGHT_EXCLUSIVE) && item->effect == QXL_EFFECT_OPAQUE) {
- Shadow *shadow;
- int skip = now == exclude_base;
- print_base_item("CONTAIN", sibling);
-
- if ((shadow = __find_shadow(sibling))) {
- if (exclude_base) {
- TreeItem *next = sibling;
- exclude_region(worker, ring, exclude_base, &exclude_rgn, &next, NULL);
- if (next != sibling) {
- now = next ? &next->siblings_link : NULL;
- exclude_base = NULL;
- continue;
- }
- }
- region_or(&exclude_rgn, &shadow->on_hold);
- }
- now = now->prev;
- current_remove(worker, sibling);
- now = ring_next(ring, now);
- if (shadow || skip) {
- exclude_base = now;
- }
- continue;
- }
-
- if (!(test_res & REGION_TEST_LEFT_EXCLUSIVE) && is_opaque_item(sibling)) {
- Container *container;
-
- if (exclude_base) {
- exclude_region(worker, ring, exclude_base, &exclude_rgn, NULL, NULL);
- region_clear(&exclude_rgn);
- exclude_base = NULL;
- }
- print_base_item("IN", sibling);
- if (sibling->type == TREE_ITEM_TYPE_CONTAINER) {
- container = (Container *)sibling;
- ring = &container->items;
- item->base.container = container;
- now = ring_next(ring, ring);
- continue;
- }
- spice_assert(IS_DRAW_ITEM(sibling));
- if (!((DrawItem *)sibling)->container_root) {
- container = __new_container(worker, (DrawItem *)sibling);
- if (!container) {
- spice_warning("create new container failed");
- region_destroy(&exclude_rgn);
- return FALSE;
- }
- item->base.container = container;
- ring = &container->items;
- }
- }
- }
- if (!exclude_base) {
- exclude_base = now;
- }
- break;
- }
- if (item->effect == QXL_EFFECT_OPAQUE) {
- region_or(&exclude_rgn, &item->base.rgn);
- exclude_region(worker, ring, exclude_base, &exclude_rgn, NULL, drawable);
- red_use_stream_trace(worker, drawable);
- red_streams_update_visible_region(worker, drawable);
- /*
- * Performing the insertion after exclude_region for
- * safety (todo: Not sure if exclude_region can affect the drawable
- * if it is added to the tree before calling exclude_region).
- */
- __current_add_drawable(worker, drawable, ring);
- } else {
- /*
- * red_detach_streams_behind can affect the current tree since it may
- * trigger calls to update_area. Thus, the drawable should be added to the tree
- * before calling red_detach_streams_behind
- */
- __current_add_drawable(worker, drawable, ring);
- if (drawable->surface_id == 0) {
- red_detach_streams_behind(worker, &drawable->tree_item.base.rgn, drawable);
- }
- }
- region_destroy(&exclude_rgn);
- stat_add(&worker->add_stat, start_time);
- return TRUE;
-}
-
-static void add_clip_rects(QRegion *rgn, SpiceClipRects *data)
-{
- int i;
-
- for (i = 0; i < data->num_rects; i++) {
- region_add(rgn, data->rects + i);
- }
-}
-
-static inline Shadow *__new_shadow(RedWorker *worker, Drawable *item, SpicePoint *delta)
-{
- if (!delta->x && !delta->y) {
- return NULL;
- }
-
- Shadow *shadow = spice_new(Shadow, 1);
- worker->shadows_count++;
-#ifdef PIPE_DEBUG
- shadow->base.id = ++worker->last_id;
-#endif
- shadow->base.type = TREE_ITEM_TYPE_SHADOW;
- shadow->base.container = NULL;
- shadow->owner = &item->tree_item;
- region_clone(&shadow->base.rgn, &item->tree_item.base.rgn);
- region_offset(&shadow->base.rgn, delta->x, delta->y);
- ring_item_init(&shadow->base.siblings_link);
- region_init(&shadow->on_hold);
- item->tree_item.shadow = shadow;
- return shadow;
-}
-
-static inline int red_current_add_with_shadow(RedWorker *worker, Ring *ring, Drawable *item,
- SpicePoint *delta)
-{
-#ifdef RED_WORKER_STAT
- stat_time_t start_time = stat_now();
-#endif
-
- Shadow *shadow = __new_shadow(worker, item, delta);
- if (!shadow) {
- stat_add(&worker->add_stat, start_time);
- return FALSE;
- }
- print_base_item("ADDSHADOW", &item->tree_item.base);
- // item and his shadow must initially be placed in the same container.
- // for now putting them on root.
-
- // only primary surface streams are supported
- if (is_primary_surface(worker, item->surface_id)) {
- red_detach_streams_behind(worker, &shadow->base.rgn, NULL);
- }
- ring_add(ring, &shadow->base.siblings_link);
- __current_add_drawable(worker, item, ring);
- if (item->tree_item.effect == QXL_EFFECT_OPAQUE) {
- QRegion exclude_rgn;
- region_clone(&exclude_rgn, &item->tree_item.base.rgn);
- exclude_region(worker, ring, &shadow->base.siblings_link, &exclude_rgn, NULL, NULL);
- region_destroy(&exclude_rgn);
- red_streams_update_visible_region(worker, item);
- } else {
- if (item->surface_id == 0) {
- red_detach_streams_behind(worker, &item->tree_item.base.rgn, item);
- }
- }
- stat_add(&worker->add_stat, start_time);
- return TRUE;
-}
-
-static inline int has_shadow(RedDrawable *drawable)
-{
- return drawable->type == QXL_COPY_BITS;
-}
-
-static inline void red_update_streamable(RedWorker *worker, Drawable *drawable,
- RedDrawable *red_drawable)
-{
- SpiceImage *image;
-
- if (worker->streaming_video == STREAM_VIDEO_OFF) {
- return;
- }
-
- if (!is_primary_surface(worker, drawable->surface_id)) {
- return;
- }
-
- if (drawable->tree_item.effect != QXL_EFFECT_OPAQUE ||
- red_drawable->type != QXL_DRAW_COPY ||
- red_drawable->u.copy.rop_descriptor != SPICE_ROPD_OP_PUT) {
- return;
- }
-
- image = red_drawable->u.copy.src_bitmap;
- if (image == NULL ||
- image->descriptor.type != SPICE_IMAGE_TYPE_BITMAP) {
- return;
- }
-
- if (worker->streaming_video == STREAM_VIDEO_FILTER) {
- SpiceRect* rect;
- int size;
-
- rect = &drawable->red_drawable->u.copy.src_area;
- size = (rect->right - rect->left) * (rect->bottom - rect->top);
- if (size < RED_STREAM_MIN_SIZE) {
- return;
- }
- }
-
- drawable->streamable = TRUE;
-}
-
-static inline int red_current_add_qxl(RedWorker *worker, Ring *ring, Drawable *drawable,
- RedDrawable *red_drawable)
-{
- int ret;
-
- if (has_shadow(red_drawable)) {
- SpicePoint delta;
-
-#ifdef RED_WORKER_STAT
- ++worker->add_with_shadow_count;
-#endif
- delta.x = red_drawable->u.copy_bits.src_pos.x - red_drawable->bbox.left;
- delta.y = red_drawable->u.copy_bits.src_pos.y - red_drawable->bbox.top;
- ret = red_current_add_with_shadow(worker, ring, drawable, &delta);
- } else {
- red_update_streamable(worker, drawable, red_drawable);
- ret = red_current_add(worker, ring, drawable);
- }
-#ifdef RED_WORKER_STAT
- if ((++worker->add_count % 100) == 0) {
- stat_time_t total = worker->add_stat.total;
- spice_info("add with shadow count %u",
- worker->add_with_shadow_count);
- worker->add_with_shadow_count = 0;
- spice_info("add[%u] %f exclude[%u] %f __exclude[%u] %f",
- worker->add_stat.count,
- stat_cpu_time_to_sec(total),
- worker->exclude_stat.count,
- stat_cpu_time_to_sec(worker->exclude_stat.total),
- worker->__exclude_stat.count,
- stat_cpu_time_to_sec(worker->__exclude_stat.total));
- spice_info("add %f%% exclude %f%% exclude2 %f%% __exclude %f%%",
- (double)(total - worker->exclude_stat.total) / total * 100,
- (double)(worker->exclude_stat.total) / total * 100,
- (double)(worker->exclude_stat.total -
- worker->__exclude_stat.total) / worker->exclude_stat.total * 100,
- (double)(worker->__exclude_stat.total) / worker->exclude_stat.total * 100);
- stat_reset(&worker->add_stat);
- stat_reset(&worker->exclude_stat);
- stat_reset(&worker->__exclude_stat);
- }
-#endif
- return ret;
-}
-
-static void red_get_area(RedWorker *worker, int surface_id, const SpiceRect *area, uint8_t *dest,
- int dest_stride, int update)
-{
- SpiceCanvas *canvas;
- RedSurface *surface;
-
- surface = &worker->surfaces[surface_id];
- if (update) {
- red_update_area(worker, area, surface_id);
- }
-
- canvas = surface->context.canvas;
- canvas->ops->read_bits(canvas, dest, dest_stride, area);
-}
-
-static int rgb32_data_has_alpha(int width, int height, size_t stride,
- uint8_t *data, int *all_set_out)
-{
- uint32_t *line, *end, alpha;
- int has_alpha;
-
- has_alpha = FALSE;
- while (height-- > 0) {
- line = (uint32_t *)data;
- end = line + width;
- data += stride;
- while (line != end) {
- alpha = *line & 0xff000000U;
- if (alpha != 0) {
- has_alpha = TRUE;
- if (alpha != 0xff000000U) {
- *all_set_out = FALSE;
- return TRUE;
- }
- }
- line++;
- }
- }
-
- *all_set_out = has_alpha;
- return has_alpha;
-}
-
-static inline int red_handle_self_bitmap(RedWorker *worker, Drawable *drawable)
-{
- SpiceImage *image;
- int32_t width;
- int32_t height;
- uint8_t *dest;
- int dest_stride;
- RedSurface *surface;
- int bpp;
- int all_set;
- RedDrawable *red_drawable = drawable->red_drawable;
-
- if (!red_drawable->self_bitmap) {
- return TRUE;
- }
-
- surface = &worker->surfaces[drawable->surface_id];
-
- bpp = SPICE_SURFACE_FMT_DEPTH(surface->context.format) / 8;
-
- width = red_drawable->self_bitmap_area.right
- - red_drawable->self_bitmap_area.left;
- height = red_drawable->self_bitmap_area.bottom
- - red_drawable->self_bitmap_area.top;
- dest_stride = SPICE_ALIGN(width * bpp, 4);
-
- image = spice_new0(SpiceImage, 1);
- image->descriptor.type = SPICE_IMAGE_TYPE_BITMAP;
- image->descriptor.flags = 0;
-
- QXL_SET_IMAGE_ID(image, QXL_IMAGE_GROUP_RED, ++worker->bits_unique);
- image->u.bitmap.flags = surface->context.top_down ? SPICE_BITMAP_FLAGS_TOP_DOWN : 0;
- image->u.bitmap.format = spice_bitmap_from_surface_type(surface->context.format);
- image->u.bitmap.stride = dest_stride;
- image->descriptor.width = image->u.bitmap.x = width;
- image->descriptor.height = image->u.bitmap.y = height;
- image->u.bitmap.palette = NULL;
-
- dest = (uint8_t *)spice_malloc_n(height, dest_stride);
- image->u.bitmap.data = spice_chunks_new_linear(dest, height * dest_stride);
- image->u.bitmap.data->flags |= SPICE_CHUNKS_FLAGS_FREE;
-
- red_get_area(worker, drawable->surface_id,
- &red_drawable->self_bitmap_area, dest, dest_stride, TRUE);
-
- /* For 32bit non-primary surfaces we need to keep any non-zero
- high bytes as the surface may be used as source to an alpha_blend */
- if (!is_primary_surface(worker, drawable->surface_id) &&
- image->u.bitmap.format == SPICE_BITMAP_FMT_32BIT &&
- rgb32_data_has_alpha(width, height, dest_stride, dest, &all_set)) {
- if (all_set) {
- image->descriptor.flags |= SPICE_IMAGE_FLAGS_HIGH_BITS_SET;
- } else {
- image->u.bitmap.format = SPICE_BITMAP_FMT_RGBA;
- }
- }
-
- red_drawable->self_bitmap_image = image;
- return TRUE;
-}
-
-static void free_one_drawable(RedWorker *worker, int force_glz_free)
-{
- RingItem *ring_item = ring_get_tail(&worker->current_list);
- Drawable *drawable;
- Container *container;
-
- spice_assert(ring_item);
- drawable = SPICE_CONTAINEROF(ring_item, Drawable, list_link);
- if (force_glz_free) {
- RingItem *glz_item, *next_item;
- RedGlzDrawable *glz;
- DRAWABLE_FOREACH_GLZ_SAFE(drawable, glz_item, next_item, glz) {
- red_display_free_glz_drawable(glz->dcc, glz);
- }
- }
- red_draw_drawable(worker, drawable);
- container = drawable->tree_item.base.container;
-
- current_remove_drawable(worker, drawable);
- container_cleanup(worker, container);
-}
-
-static Drawable *get_drawable(RedWorker *worker, uint8_t effect, RedDrawable *red_drawable,
- uint32_t group_id)
-{
- Drawable *drawable;
- struct timespec time;
- int x;
-
- while (!(drawable = alloc_drawable(worker))) {
- free_one_drawable(worker, FALSE);
- }
- worker->drawable_count++;
- worker->red_drawable_count++;
- memset(drawable, 0, sizeof(Drawable));
- drawable->refs = 1;
- clock_gettime(CLOCK_MONOTONIC, &time);
- drawable->creation_time = timespec_to_red_time(&time);
-#ifdef PIPE_DEBUG
- drawable->tree_item.base.id = ++worker->last_id;
-#endif
- ring_item_init(&drawable->list_link);
- ring_item_init(&drawable->surface_list_link);
-#ifdef UPDATE_AREA_BY_TREE
- ring_item_init(&drawable->collect_link);
-#endif
- ring_item_init(&drawable->tree_item.base.siblings_link);
- drawable->tree_item.base.type = TREE_ITEM_TYPE_DRAWABLE;
- region_init(&drawable->tree_item.base.rgn);
- drawable->tree_item.effect = effect;
- drawable->red_drawable = ref_red_drawable(red_drawable);
- drawable->group_id = group_id;
-
- drawable->surface_id = red_drawable->surface_id;
- VALIDATE_SURFACE_RETVAL(worker, drawable->surface_id, NULL)
- for (x = 0; x < 3; ++x) {
- drawable->surfaces_dest[x] = red_drawable->surfaces_dest[x];
- if (drawable->surfaces_dest[x] != -1) {
- VALIDATE_SURFACE_RETVAL(worker, drawable->surfaces_dest[x], NULL)
- }
- }
- if (!validate_drawable_bbox(worker, red_drawable)) {
- rendering_incorrect(__func__);
- return NULL;
- }
- ring_init(&drawable->pipes);
- ring_init(&drawable->glz_ring);
-
- drawable->process_commands_generation = worker->process_commands_generation;
- return drawable;
-}
-
-static inline int red_handle_depends_on_target_surface(RedWorker *worker, uint32_t surface_id)
-{
- RedSurface *surface;
- RingItem *ring_item;
-
- surface = &worker->surfaces[surface_id];
-
- while ((ring_item = ring_get_tail(&surface->depend_on_me))) {
- Drawable *drawable;
- DependItem *depended_item = SPICE_CONTAINEROF(ring_item, DependItem, ring_item);
- drawable = depended_item->drawable;
- surface_flush(worker, drawable->surface_id, &drawable->red_drawable->bbox);
- }
-
- return TRUE;
-}
-
-static inline void add_to_surface_dependency(RedWorker *worker, int depend_on_surface_id,
- DependItem *depend_item, Drawable *drawable)
-{
- RedSurface *surface;
-
- if (depend_on_surface_id == -1) {
- depend_item->drawable = NULL;
- return;
- }
-
- surface = &worker->surfaces[depend_on_surface_id];
-
- depend_item->drawable = drawable;
- ring_add(&surface->depend_on_me, &depend_item->ring_item);
-}
-
-static inline int red_handle_surfaces_dependencies(RedWorker *worker, Drawable *drawable)
-{
- int x;
-
- for (x = 0; x < 3; ++x) {
- // surface self dependency is handled by shadows in "current", or by
- // handle_self_bitmap
- if (drawable->surfaces_dest[x] != drawable->surface_id) {
- add_to_surface_dependency(worker, drawable->surfaces_dest[x],
- &drawable->depend_items[x], drawable);
-
- if (drawable->surfaces_dest[x] == 0) {
- QRegion depend_region;
- region_init(&depend_region);
- region_add(&depend_region, &drawable->red_drawable->surfaces_rects[x]);
- red_detach_streams_behind(worker, &depend_region, NULL);
- }
- }
- }
-
- return TRUE;
-}
-
-static inline void red_inc_surfaces_drawable_dependencies(RedWorker *worker, Drawable *drawable)
-{
- int x;
- int surface_id;
- RedSurface *surface;
-
- for (x = 0; x < 3; ++x) {
- surface_id = drawable->surfaces_dest[x];
- if (surface_id == -1) {
- continue;
- }
- surface = &worker->surfaces[surface_id];
- surface->refs++;
- }
-}
-
-static inline void red_process_drawable(RedWorker *worker, RedDrawable *red_drawable,
- uint32_t group_id)
-{
- int surface_id;
- Drawable *drawable = get_drawable(worker, red_drawable->effect, red_drawable, group_id);
-
- if (!drawable) {
- rendering_incorrect("failed to get_drawable");
- return;
- }
-
- surface_id = drawable->surface_id;
-
- worker->surfaces[surface_id].refs++;
-
- region_add(&drawable->tree_item.base.rgn, &red_drawable->bbox);
-#ifdef PIPE_DEBUG
- printf("TEST: DRAWABLE: id %u type %s effect %u bbox %u %u %u %u\n",
- drawable->tree_item.base.id,
- draw_type_to_str(red_drawable->type),
- drawable->tree_item.effect,
- red_drawable->bbox.top, red_drawable->bbox.left,
- red_drawable->bbox.bottom, red_drawable->bbox.right);
-#endif
-
- if (red_drawable->clip.type == SPICE_CLIP_TYPE_RECTS) {
- QRegion rgn;
-
- region_init(&rgn);
- add_clip_rects(&rgn, red_drawable->clip.rects);
- region_and(&drawable->tree_item.base.rgn, &rgn);
- region_destroy(&rgn);
- }
- /*
- surface->refs is affected by a drawable (that is
- dependent on the surface) as long as the drawable is alive.
- However, surface->depend_on_me is affected by a drawable only
- as long as it is in the current tree (hasn't been rendered yet).
- */
- red_inc_surfaces_drawable_dependencies(worker, drawable);
-
- if (region_is_empty(&drawable->tree_item.base.rgn)) {
- goto cleanup;
- }
-
- if (!red_handle_self_bitmap(worker, drawable)) {
- goto cleanup;
- }
-
- if (!red_handle_depends_on_target_surface(worker, surface_id)) {
- goto cleanup;
- }
-
- if (!red_handle_surfaces_dependencies(worker, drawable)) {
- goto cleanup;
- }
-
- if (red_current_add_qxl(worker, &worker->surfaces[surface_id].current, drawable,
- red_drawable)) {
- if (drawable->tree_item.effect != QXL_EFFECT_OPAQUE) {
- worker->transparent_count++;
- }
- red_pipes_add_drawable(worker, drawable);
-#ifdef DRAW_ALL
- red_draw_qxl_drawable(worker, drawable);
-#endif
- }
-cleanup:
- release_drawable(worker, drawable);
-}
-
-static inline void red_create_surface(RedWorker *worker, uint32_t surface_id,uint32_t width,
- uint32_t height, int32_t stride, uint32_t format,
- void *line_0, int data_is_valid, int send_client);
-
-static inline void red_process_surface(RedWorker *worker, RedSurfaceCmd *surface,
- uint32_t group_id, int loadvm)
-{
- int surface_id;
- RedSurface *red_surface;
- uint8_t *data;
-
- surface_id = surface->surface_id;
- __validate_surface(worker, surface_id);
-
- red_surface = &worker->surfaces[surface_id];
-
- switch (surface->type) {
- case QXL_SURFACE_CMD_CREATE: {
- uint32_t height = surface->u.surface_create.height;
- int32_t stride = surface->u.surface_create.stride;
- int reloaded_surface = loadvm || (surface->flags & QXL_SURF_FLAG_KEEP_DATA);
-
- data = surface->u.surface_create.data;
- if (stride < 0) {
- data -= (int32_t)(stride * (height - 1));
- }
- red_create_surface(worker, surface_id, surface->u.surface_create.width,
- height, stride, surface->u.surface_create.format, data,
- reloaded_surface,
- // reloaded surfaces will be sent on demand
- !reloaded_surface);
- set_surface_release_info(worker, surface_id, 1, surface->release_info, group_id);
- break;
- }
- case QXL_SURFACE_CMD_DESTROY:
- spice_warn_if(!red_surface->context.canvas);
- set_surface_release_info(worker, surface_id, 0, surface->release_info, group_id);
- red_handle_depends_on_target_surface(worker, surface_id);
- /* note that red_handle_depends_on_target_surface must be called before red_current_clear.
- otherwise "current" will hold items that other drawables may depend on, and then
- red_current_clear will remove them from the pipe. */
- red_current_clear(worker, surface_id);
- red_clear_surface_drawables_from_pipes(worker, surface_id, FALSE);
- red_destroy_surface(worker, surface_id);
- break;
- default:
- spice_error("unknown surface command");
- };
- red_put_surface_cmd(surface);
- free(surface);
-}
-
-static SpiceCanvas *image_surfaces_get(SpiceImageSurfaces *surfaces,
- uint32_t surface_id)
-{
- RedWorker *worker;
-
- worker = SPICE_CONTAINEROF(surfaces, RedWorker, image_surfaces);
- VALIDATE_SURFACE_RETVAL(worker, surface_id, NULL);
-
- return worker->surfaces[surface_id].context.canvas;
-}
-
-static void image_surface_init(RedWorker *worker)
-{
- static SpiceImageSurfacesOps image_surfaces_ops = {
- image_surfaces_get,
- };
-
- worker->image_surfaces.ops = &image_surfaces_ops;
-}
-
-static void localize_bitmap(RedWorker *worker, SpiceImage **image_ptr, SpiceImage *image_store,
- Drawable *drawable)
-{
- SpiceImage *image = *image_ptr;
-
- if (image == NULL) {
- spice_assert(drawable != NULL);
- spice_assert(drawable->red_drawable->self_bitmap_image != NULL);
- *image_ptr = drawable->red_drawable->self_bitmap_image;
- return;
- }
-
- if (image_cache_hit(&worker->image_cache, image->descriptor.id)) {
- image_store->descriptor = image->descriptor;
- image_store->descriptor.type = SPICE_IMAGE_TYPE_FROM_CACHE;
- image_store->descriptor.flags = 0;
- *image_ptr = image_store;
- return;
- }
-
- switch (image->descriptor.type) {
- case SPICE_IMAGE_TYPE_QUIC: {
- image_store->descriptor = image->descriptor;
- image_store->u.quic = image->u.quic;
- *image_ptr = image_store;
-#ifdef IMAGE_CACHE_AGE
- image_store->descriptor.flags |= SPICE_IMAGE_FLAGS_CACHE_ME;
-#else
- if (image_store->descriptor.width * image->descriptor.height >= 640 * 480) {
- image_store->descriptor.flags |= SPICE_IMAGE_FLAGS_CACHE_ME;
- }
-#endif
- break;
- }
- case SPICE_IMAGE_TYPE_BITMAP:
- case SPICE_IMAGE_TYPE_SURFACE:
- /* nothing */
- break;
- default:
- spice_error("invalid image type");
- }
-}
-
-static void localize_brush(RedWorker *worker, SpiceBrush *brush, SpiceImage *image_store)
-{
- if (brush->type == SPICE_BRUSH_TYPE_PATTERN) {
- localize_bitmap(worker, &brush->u.pattern.pat, image_store, NULL);
- }
-}
-
-static void localize_mask(RedWorker *worker, SpiceQMask *mask, SpiceImage *image_store)
-{
- if (mask->bitmap) {
- localize_bitmap(worker, &mask->bitmap, image_store, NULL);
- }
-}
-
-static void red_draw_qxl_drawable(RedWorker *worker, Drawable *drawable)
-{
- RedSurface *surface;
- SpiceCanvas *canvas;
- SpiceClip clip = drawable->red_drawable->clip;
-
- surface = &worker->surfaces[drawable->surface_id];
- canvas = surface->context.canvas;
-
- image_cache_aging(&worker->image_cache);
-
- worker->preload_group_id = drawable->group_id;
-
- region_add(&surface->draw_dirty_region, &drawable->red_drawable->bbox);
-
- switch (drawable->red_drawable->type) {
- case QXL_DRAW_FILL: {
- SpiceFill fill = drawable->red_drawable->u.fill;
- SpiceImage img1, img2;
- localize_brush(worker, &fill.brush, &img1);
- localize_mask(worker, &fill.mask, &img2);
- canvas->ops->draw_fill(canvas, &drawable->red_drawable->bbox,
- &clip, &fill);
- break;
- }
- case QXL_DRAW_OPAQUE: {
- SpiceOpaque opaque = drawable->red_drawable->u.opaque;
- SpiceImage img1, img2, img3;
- localize_brush(worker, &opaque.brush, &img1);
- localize_bitmap(worker, &opaque.src_bitmap, &img2, drawable);
- localize_mask(worker, &opaque.mask, &img3);
- canvas->ops->draw_opaque(canvas, &drawable->red_drawable->bbox, &clip, &opaque);
- break;
- }
- case QXL_DRAW_COPY: {
- SpiceCopy copy = drawable->red_drawable->u.copy;
- SpiceImage img1, img2;
- localize_bitmap(worker, &copy.src_bitmap, &img1, drawable);
- localize_mask(worker, &copy.mask, &img2);
- canvas->ops->draw_copy(canvas, &drawable->red_drawable->bbox,
- &clip, &copy);
- break;
- }
- case QXL_DRAW_TRANSPARENT: {
- SpiceTransparent transparent = drawable->red_drawable->u.transparent;
- SpiceImage img1;
- localize_bitmap(worker, &transparent.src_bitmap, &img1, drawable);
- canvas->ops->draw_transparent(canvas,
- &drawable->red_drawable->bbox, &clip, &transparent);
- break;
- }
- case QXL_DRAW_ALPHA_BLEND: {
- SpiceAlphaBlend alpha_blend = drawable->red_drawable->u.alpha_blend;
- SpiceImage img1;
- localize_bitmap(worker, &alpha_blend.src_bitmap, &img1, drawable);
- canvas->ops->draw_alpha_blend(canvas,
- &drawable->red_drawable->bbox, &clip, &alpha_blend);
- break;
- }
- case QXL_COPY_BITS: {
- canvas->ops->copy_bits(canvas, &drawable->red_drawable->bbox,
- &clip, &drawable->red_drawable->u.copy_bits.src_pos);
- break;
- }
- case QXL_DRAW_BLEND: {
- SpiceBlend blend = drawable->red_drawable->u.blend;
- SpiceImage img1, img2;
- localize_bitmap(worker, &blend.src_bitmap, &img1, drawable);
- localize_mask(worker, &blend.mask, &img2);
- canvas->ops->draw_blend(canvas, &drawable->red_drawable->bbox,
- &clip, &blend);
- break;
- }
- case QXL_DRAW_BLACKNESS: {
- SpiceBlackness blackness = drawable->red_drawable->u.blackness;
- SpiceImage img1;
- localize_mask(worker, &blackness.mask, &img1);
- canvas->ops->draw_blackness(canvas,
- &drawable->red_drawable->bbox, &clip, &blackness);
- break;
- }
- case QXL_DRAW_WHITENESS: {
- SpiceWhiteness whiteness = drawable->red_drawable->u.whiteness;
- SpiceImage img1;
- localize_mask(worker, &whiteness.mask, &img1);
- canvas->ops->draw_whiteness(canvas,
- &drawable->red_drawable->bbox, &clip, &whiteness);
- break;
- }
- case QXL_DRAW_INVERS: {
- SpiceInvers invers = drawable->red_drawable->u.invers;
- SpiceImage img1;
- localize_mask(worker, &invers.mask, &img1);
- canvas->ops->draw_invers(canvas,
- &drawable->red_drawable->bbox, &clip, &invers);
- break;
- }
- case QXL_DRAW_ROP3: {
- SpiceRop3 rop3 = drawable->red_drawable->u.rop3;
- SpiceImage img1, img2, img3;
- localize_brush(worker, &rop3.brush, &img1);
- localize_bitmap(worker, &rop3.src_bitmap, &img2, drawable);
- localize_mask(worker, &rop3.mask, &img3);
- canvas->ops->draw_rop3(canvas, &drawable->red_drawable->bbox,
- &clip, &rop3);
- break;
- }
- case QXL_DRAW_COMPOSITE: {
- SpiceComposite composite = drawable->red_drawable->u.composite;
- SpiceImage src, mask;
- localize_bitmap(worker, &composite.src_bitmap, &src, drawable);
- if (composite.mask_bitmap)
- localize_bitmap(worker, &composite.mask_bitmap, &mask, drawable);
- canvas->ops->draw_composite(canvas, &drawable->red_drawable->bbox,
- &clip, &composite);
- break;
- }
- case QXL_DRAW_STROKE: {
- SpiceStroke stroke = drawable->red_drawable->u.stroke;
- SpiceImage img1;
- localize_brush(worker, &stroke.brush, &img1);
- canvas->ops->draw_stroke(canvas,
- &drawable->red_drawable->bbox, &clip, &stroke);
- break;
- }
- case QXL_DRAW_TEXT: {
- SpiceText text = drawable->red_drawable->u.text;
- SpiceImage img1, img2;
- localize_brush(worker, &text.fore_brush, &img1);
- localize_brush(worker, &text.back_brush, &img2);
- canvas->ops->draw_text(canvas, &drawable->red_drawable->bbox,
- &clip, &text);
- break;
- }
- default:
- spice_warning("invalid type");
- }
-}
-
-#ifndef DRAW_ALL
-
-static void red_draw_drawable(RedWorker *worker, Drawable *drawable)
-{
-#ifdef UPDATE_AREA_BY_TREE
- SpiceCanvas *canvas;
-
- canvas = surface->context.canvas;
- //todo: add need top mask flag
- canvas->ops->group_start(canvas,
- &drawable->tree_item.base.rgn);
-#endif
- red_flush_source_surfaces(worker, drawable);
- red_draw_qxl_drawable(worker, drawable);
-#ifdef UPDATE_AREA_BY_TREE
- canvas->ops->group_end(canvas);
-#endif
-}
-
-static void validate_area(RedWorker *worker, const SpiceRect *area, uint32_t surface_id)
-{
- RedSurface *surface;
-
- surface = &worker->surfaces[surface_id];
- if (!surface->context.canvas_draws_on_surface) {
- SpiceCanvas *canvas = surface->context.canvas;
- int h;
- int stride = surface->context.stride;
- uint8_t *line_0 = surface->context.line_0;
-
- if (!(h = area->bottom - area->top)) {
- return;
- }
-
- spice_assert(stride < 0);
- uint8_t *dest = line_0 + (area->top * stride) + area->left * sizeof(uint32_t);
- dest += (h - 1) * stride;
- canvas->ops->read_bits(canvas, dest, -stride, area);
- }
-}
-
-#ifdef UPDATE_AREA_BY_TREE
-
-static inline void __red_collect_for_update(RedWorker *worker, Ring *ring, RingItem *ring_item,
- QRegion *rgn, Ring *items)
-{
- Ring *top_ring = ring;
-
- for (;;) {
- TreeItem *now = SPICE_CONTAINEROF(ring_item, TreeItem, siblings_link);
- Container *container = now->container;
- if (region_intersects(rgn, &now->rgn)) {
- if (IS_DRAW_ITEM(now)) {
- Drawable *drawable = SPICE_CONTAINEROF(now, Drawable, tree_item);
-
- ring_add(items, &drawable->collect_link);
- region_or(rgn, &now->rgn);
- if (drawable->tree_item.shadow) {
- region_or(rgn, &drawable->tree_item.shadow->base.rgn);
- }
- } else if (now->type == TREE_ITEM_TYPE_SHADOW) {
- Drawable *owner = SPICE_CONTAINEROF(((Shadow *)now)->owner, Drawable, tree_item);
- if (!ring_item_is_linked(&owner->collect_link)) {
- region_or(rgn, &now->rgn);
- region_or(rgn, &owner->tree_item.base.rgn);
- ring_add(items, &owner->collect_link);
- }
- } else if (now->type == TREE_ITEM_TYPE_CONTAINER) {
- Container *container = (Container *)now;
-
- if ((ring_item = ring_get_head(&container->items))) {
- ring = &container->items;
- spice_assert(((TreeItem *)ring_item)->container);
- continue;
- }
- ring_item = &now->siblings_link;
- }
- }
-
- while (!(ring_item = ring_next(ring, ring_item))) {
- if (ring == top_ring) {
- return;
- }
- ring_item = &container->base.siblings_link;
- container = container->base.container;
- ring = (container) ? &container->items : top_ring;
- }
- }
-}
-
-static void red_update_area(RedWorker *worker, const SpiceRect *area, int surface_id)
-{
- RedSurface *surface;
- Ring *ring;
- RingItem *ring_item;
- Ring items;
- QRegion rgn;
-
- surface = &worker->surfaces[surface_id];
- ring = &surface->current;
-
- if (!(ring_item = ring_get_head(ring))) {
- worker->draw_context.validate_area(surface->context.canvas,
- &worker->dev_info.surface0_area, area);
- return;
- }
-
- region_init(&rgn);
- region_add(&rgn, area);
- ring_init(&items);
- __red_collect_for_update(worker, ring, ring_item, &rgn, &items);
- region_destroy(&rgn);
-
- while ((ring_item = ring_get_head(&items))) {
- Drawable *drawable = SPICE_CONTAINEROF(ring_item, Drawable, collect_link);
- Container *container;
-
- ring_remove(ring_item);
- red_draw_drawable(worker, drawable);
- container = drawable->tree_item.base.container;
- current_remove_drawable(worker, drawable);
- container_cleanup(worker, container);
- }
- validate_area(worker, area, surface_id);
-}
-
-#else
-
-/*
- Renders drawables for updating the requested area, but only drawables that are older
- than 'last' (exclusive).
-*/
-static void red_update_area_till(RedWorker *worker, const SpiceRect *area, int surface_id,
- Drawable *last)
-{
- // TODO: if we use UPDATE_AREA_BY_TREE, a corresponding red_update_area_till
- // should be implemented
-
- RedSurface *surface;
- Drawable *surface_last = NULL;
- Ring *ring;
- RingItem *ring_item;
- Drawable *now;
- QRegion rgn;
-
- spice_assert(last);
- spice_assert(ring_item_is_linked(&last->list_link));
-
- surface = &worker->surfaces[surface_id];
-
- if (surface_id != last->surface_id) {
- // find the nearest older drawable from the appropriate surface
- ring = &worker->current_list;
- ring_item = &last->list_link;
- while ((ring_item = ring_next(ring, ring_item))) {
- now = SPICE_CONTAINEROF(ring_item, Drawable, list_link);
- if (now->surface_id == surface_id) {
- surface_last = now;
- break;
- }
- }
- } else {
- ring_item = ring_next(&surface->current_list, &last->surface_list_link);
- if (ring_item) {
- surface_last = SPICE_CONTAINEROF(ring_item, Drawable, surface_list_link);
- }
- }
-
- if (!surface_last) {
- return;
- }
-
- ring = &surface->current_list;
- ring_item = &surface_last->surface_list_link;
-
- region_init(&rgn);
- region_add(&rgn, area);
-
- // find the first older drawable that intersects with the area
- do {
- now = SPICE_CONTAINEROF(ring_item, Drawable, surface_list_link);
- if (region_intersects(&rgn, &now->tree_item.base.rgn)) {
- surface_last = now;
- break;
- }
- } while ((ring_item = ring_next(ring, ring_item)));
-
- region_destroy(&rgn);
-
- if (!surface_last) {
- return;
- }
-
- do {
- Container *container;
-
- ring_item = ring_get_tail(&surface->current_list);
- now = SPICE_CONTAINEROF(ring_item, Drawable, surface_list_link);
- now->refs++;
- container = now->tree_item.base.container;
- current_remove_drawable(worker, now);
- container_cleanup(worker, container);
- /* red_draw_drawable may call red_update_area for the surfaces 'now' depends on. Notice,
- that it is valid to call red_update_area in this case and not red_update_area_till:
- It is impossible that there was newer item then 'last' in one of the surfaces
- that red_update_area is called for, Otherwise, 'now' would have already been rendered.
- See the call for red_handle_depends_on_target_surface in red_process_drawable */
- red_draw_drawable(worker, now);
- release_drawable(worker, now);
- } while (now != surface_last);
- validate_area(worker, area, surface_id);
-}
-
-static void red_update_area(RedWorker *worker, const SpiceRect *area, int surface_id)
-{
- RedSurface *surface;
- Ring *ring;
- RingItem *ring_item;
- QRegion rgn;
- Drawable *last;
- Drawable *now;
-#ifdef ACYCLIC_SURFACE_DEBUG
- int gn;
-#endif
- spice_debug("surface %d: area ==>", surface_id);
- rect_debug(area);
-
- spice_return_if_fail(surface_id >= 0 && surface_id < NUM_SURFACES);
- spice_return_if_fail(area);
- spice_return_if_fail(area->left >= 0 && area->top >= 0 &&
- area->left < area->right && area->top < area->bottom);
-
- surface = &worker->surfaces[surface_id];
-
- last = NULL;
-#ifdef ACYCLIC_SURFACE_DEBUG
- gn = ++surface->current_gn;
-#endif
- ring = &surface->current_list;
- ring_item = ring;
-
- region_init(&rgn);
- region_add(&rgn, area);
- while ((ring_item = ring_next(ring, ring_item))) {
- now = SPICE_CONTAINEROF(ring_item, Drawable, surface_list_link);
- if (region_intersects(&rgn, &now->tree_item.base.rgn)) {
- last = now;
- break;
- }
- }
- region_destroy(&rgn);
-
- if (!last) {
- validate_area(worker, area, surface_id);
- return;
- }
-
- do {
- Container *container;
-
- ring_item = ring_get_tail(&surface->current_list);
- now = SPICE_CONTAINEROF(ring_item, Drawable, surface_list_link);
- now->refs++;
- container = now->tree_item.base.container;
- current_remove_drawable(worker, now);
- container_cleanup(worker, container);
- red_draw_drawable(worker, now);
- release_drawable(worker, now);
-#ifdef ACYCLIC_SURFACE_DEBUG
- if (gn != surface->current_gn) {
- spice_error("cyclic surface dependencies");
- }
-#endif
- } while (now != last);
- validate_area(worker, area, surface_id);
-}
-
-#endif
-#endif
-
-static inline void free_cursor_item(RedWorker *worker, CursorItem *item);
-
-static void red_release_cursor(RedWorker *worker, CursorItem *cursor)
-{
- if (!--cursor->refs) {
- QXLReleaseInfoExt release_info_ext;
- RedCursorCmd *cursor_cmd;
-
- cursor_cmd = cursor->red_cursor;
- release_info_ext.group_id = cursor->group_id;
- release_info_ext.info = cursor_cmd->release_info;
- worker->qxl->st->qif->release_resource(worker->qxl, release_info_ext);
- free_cursor_item(worker, cursor);
- red_put_cursor_cmd(cursor_cmd);
- free(cursor_cmd);
- }
-}
-
-static void red_set_cursor(RedWorker *worker, CursorItem *cursor)
-{
- if (worker->cursor) {
- red_release_cursor(worker, worker->cursor);
- }
- ++cursor->refs;
- worker->cursor = cursor;
-}
-
-#ifdef DEBUG_CURSORS
-static int _cursor_count = 0;
-#endif
-
-static inline CursorItem *alloc_cursor_item(RedWorker *worker)
-{
- CursorItem *cursor;
-
- if (!worker->free_cursor_items) {
- return NULL;
- }
-#ifdef DEBUG_CURSORS
- --_cursor_count;
-#endif
- cursor = &worker->free_cursor_items->u.cursor_item;
- worker->free_cursor_items = worker->free_cursor_items->u.next;
- return cursor;
-}
-
-static inline void free_cursor_item(RedWorker *worker, CursorItem *item)
-{
- ((_CursorItem *)item)->u.next = worker->free_cursor_items;
- worker->free_cursor_items = (_CursorItem *)item;
-#ifdef DEBUG_CURSORS
- ++_cursor_count;
- spice_assert(_cursor_count <= NUM_CURSORS);
-#endif
-}
-
-static void cursor_items_init(RedWorker *worker)
-{
- int i;
-
- worker->free_cursor_items = NULL;
- for (i = 0; i < NUM_CURSORS; i++) {
- free_cursor_item(worker, &worker->cursor_items[i].u.cursor_item);
- }
-}
-
-static CursorItem *get_cursor_item(RedWorker *worker, RedCursorCmd *cmd, uint32_t group_id)
-{
- CursorItem *cursor_item;
-
- spice_warn_if(!(cursor_item = alloc_cursor_item(worker)));
-
- cursor_item->refs = 1;
- cursor_item->group_id = group_id;
- cursor_item->red_cursor = cmd;
-
- return cursor_item;
-}
-
-static CursorPipeItem *ref_cursor_pipe_item(CursorPipeItem *item)
-{
- spice_assert(item);
- item->refs++;
- return item;
-}
-
-static PipeItem *new_cursor_pipe_item(RedChannelClient *rcc, void *data, int num)
-{
- CursorPipeItem *item = spice_malloc0(sizeof(CursorPipeItem));
-
- red_channel_pipe_item_init(rcc->channel, &item->base, PIPE_ITEM_TYPE_CURSOR);
- item->refs = 1;
- item->cursor_item = data;
- item->cursor_item->refs++;
- return &item->base;
-}
-
-static void put_cursor_pipe_item(CursorChannelClient *ccc, CursorPipeItem *pipe_item)
-{
- spice_assert(pipe_item);
-
- if (--pipe_item->refs) {
- return;
- }
-
- spice_assert(!pipe_item_is_linked(&pipe_item->base));
-
- red_release_cursor(ccc->common.worker, pipe_item->cursor_item);
- free(pipe_item);
-}
-
-static void qxl_process_cursor(RedWorker *worker, RedCursorCmd *cursor_cmd, uint32_t group_id)
-{
- CursorItem *cursor_item;
- int cursor_show = FALSE;
-
- cursor_item = get_cursor_item(worker, cursor_cmd, group_id);
-
- switch (cursor_cmd->type) {
- case QXL_CURSOR_SET:
- worker->cursor_visible = cursor_cmd->u.set.visible;
- red_set_cursor(worker, cursor_item);
- break;
- case QXL_CURSOR_MOVE:
- cursor_show = !worker->cursor_visible;
- worker->cursor_visible = TRUE;
- worker->cursor_position = cursor_cmd->u.position;
- break;
- case QXL_CURSOR_HIDE:
- worker->cursor_visible = FALSE;
- break;
- case QXL_CURSOR_TRAIL:
- worker->cursor_trail_length = cursor_cmd->u.trail.length;
- worker->cursor_trail_frequency = cursor_cmd->u.trail.frequency;
- break;
- default:
- spice_error("invalid cursor command %u", cursor_cmd->type);
- }
-
- if (cursor_is_connected(worker) && (worker->mouse_mode == SPICE_MOUSE_MODE_SERVER ||
- cursor_cmd->type != QXL_CURSOR_MOVE || cursor_show)) {
- red_channel_pipes_new_add(&worker->cursor_channel->common.base, new_cursor_pipe_item,
- (void*)cursor_item);
- }
- red_release_cursor(worker, cursor_item);
-}
-
-static int red_process_cursor(RedWorker *worker, uint32_t max_pipe_size, int *ring_is_empty)
-{
- QXLCommandExt ext_cmd;
- int n = 0;
-
- if (!worker->running) {
- *ring_is_empty = TRUE;
- return n;
- }
-
- *ring_is_empty = FALSE;
- while (!cursor_is_connected(worker) ||
- red_channel_min_pipe_size(&worker->cursor_channel->common.base) <= max_pipe_size) {
- if (!worker->qxl->st->qif->get_cursor_command(worker->qxl, &ext_cmd)) {
- *ring_is_empty = TRUE;
- if (worker->repoll_cursor_ring < CMD_RING_POLL_RETRIES) {
- worker->repoll_cursor_ring++;
- worker->event_timeout = MIN(worker->event_timeout, CMD_RING_POLL_TIMEOUT);
- break;
- }
- if (worker->repoll_cursor_ring > CMD_RING_POLL_RETRIES ||
- worker->qxl->st->qif->req_cursor_notification(worker->qxl)) {
- worker->repoll_cursor_ring++;
- break;
- }
- continue;
- }
- worker->repoll_cursor_ring = 0;
- switch (ext_cmd.cmd.type) {
- case QXL_CMD_CURSOR: {
- RedCursorCmd *cursor = spice_new0(RedCursorCmd, 1);
-
- if (red_get_cursor_cmd(&worker->mem_slots, ext_cmd.group_id,
- cursor, ext_cmd.cmd.data)) {
- free(cursor);
- break;
- }
-
- qxl_process_cursor(worker, cursor, ext_cmd.group_id);
- break;
- }
- default:
- spice_error("bad command type");
- }
- n++;
- }
- return n;
-}
-
-static RedDrawable *red_drawable_new(void)
-{
- RedDrawable * red = spice_new0(RedDrawable, 1);
-
- red->refs = 1;
- return red;
-}
-
-static int red_process_commands(RedWorker *worker, uint32_t max_pipe_size, int *ring_is_empty)
-{
- QXLCommandExt ext_cmd;
- int n = 0;
- uint64_t start = red_now();
-
- if (!worker->running) {
- *ring_is_empty = TRUE;
- return n;
- }
-
- worker->process_commands_generation++;
- *ring_is_empty = FALSE;
- while (!display_is_connected(worker) ||
- // TODO: change to average pipe size?
- red_channel_min_pipe_size(&worker->display_channel->common.base) <= max_pipe_size) {
- if (!worker->qxl->st->qif->get_command(worker->qxl, &ext_cmd)) {
- *ring_is_empty = TRUE;;
- if (worker->repoll_cmd_ring < CMD_RING_POLL_RETRIES) {
- worker->repoll_cmd_ring++;
- worker->event_timeout = MIN(worker->event_timeout, CMD_RING_POLL_TIMEOUT);
- break;
- }
- if (worker->repoll_cmd_ring > CMD_RING_POLL_RETRIES ||
- worker->qxl->st->qif->req_cmd_notification(worker->qxl)) {
- worker->repoll_cmd_ring++;
- break;
- }
- continue;
- }
- stat_inc_counter(worker->command_counter, 1);
- worker->repoll_cmd_ring = 0;
- switch (ext_cmd.cmd.type) {
- case QXL_CMD_DRAW: {
- RedDrawable *red_drawable = red_drawable_new(); // returns with 1 ref
-
- if (!red_get_drawable(&worker->mem_slots, ext_cmd.group_id,
- red_drawable, ext_cmd.cmd.data, ext_cmd.flags)) {
- red_process_drawable(worker, red_drawable, ext_cmd.group_id);
- }
- // release the red_drawable
- put_red_drawable(worker, red_drawable, ext_cmd.group_id);
- break;
- }
- case QXL_CMD_UPDATE: {
- RedUpdateCmd update;
- QXLReleaseInfoExt release_info_ext;
-
- if (red_get_update_cmd(&worker->mem_slots, ext_cmd.group_id,
- &update, ext_cmd.cmd.data)) {
- break;
- }
- if (!validate_surface(worker, update.surface_id)) {
- rendering_incorrect("QXL_CMD_UPDATE");
- break;
- }
- red_update_area(worker, &update.area, update.surface_id);
- worker->qxl->st->qif->notify_update(worker->qxl, update.update_id);
- release_info_ext.group_id = ext_cmd.group_id;
- release_info_ext.info = update.release_info;
- worker->qxl->st->qif->release_resource(worker->qxl, release_info_ext);
- red_put_update_cmd(&update);
- break;
- }
- case QXL_CMD_MESSAGE: {
- RedMessage message;
- QXLReleaseInfoExt release_info_ext;
-
- if (red_get_message(&worker->mem_slots, ext_cmd.group_id,
- &message, ext_cmd.cmd.data)) {
- break;
- }
-#ifdef DEBUG
- /* alert: accessing message.data is insecure */
- spice_warning("MESSAGE: %s", message.data);
-#endif
- release_info_ext.group_id = ext_cmd.group_id;
- release_info_ext.info = message.release_info;
- worker->qxl->st->qif->release_resource(worker->qxl, release_info_ext);
- red_put_message(&message);
- break;
- }
- case QXL_CMD_SURFACE: {
- RedSurfaceCmd *surface = spice_new0(RedSurfaceCmd, 1);
-
- if (red_get_surface_cmd(&worker->mem_slots, ext_cmd.group_id,
- surface, ext_cmd.cmd.data)) {
- free(surface);
- break;
- }
- red_process_surface(worker, surface, ext_cmd.group_id, FALSE);
- break;
- }
- default:
- spice_error("bad command type");
- }
- n++;
- if ((worker->display_channel &&
- red_channel_all_blocked(&worker->display_channel->common.base))
- || red_now() - start > 10 * 1000 * 1000) {
- worker->event_timeout = 0;
- return n;
- }
- }
- return n;
-}
-
-#define RED_RELEASE_BUNCH_SIZE 64
-
-static void red_free_some(RedWorker *worker)
-{
- int n = 0;
- DisplayChannelClient *dcc;
- RingItem *item, *next;
-
- spice_debug("#draw=%d, #red_draw=%d, #glz_draw=%d", worker->drawable_count,
- worker->red_drawable_count, worker->glz_drawable_count);
- WORKER_FOREACH_DCC_SAFE(worker, item, next, dcc) {
- GlzSharedDictionary *glz_dict = dcc ? dcc->glz_dict : NULL;
-
- if (glz_dict) {
- // encoding using the dictionary is prevented since the following operations might
- // change the dictionary
- pthread_rwlock_wrlock(&glz_dict->encode_lock);
- n = red_display_free_some_independent_glz_drawables(dcc);
- }
- }
-
- while (!ring_is_empty(&worker->current_list) && n++ < RED_RELEASE_BUNCH_SIZE) {
- free_one_drawable(worker, TRUE);
- }
-
- WORKER_FOREACH_DCC_SAFE(worker, item, next, dcc) {
- GlzSharedDictionary *glz_dict = dcc ? dcc->glz_dict : NULL;
-
- if (glz_dict) {
- pthread_rwlock_unlock(&glz_dict->encode_lock);
- }
- }
-}
-
-static void red_current_flush(RedWorker *worker, int surface_id)
-{
- while (!ring_is_empty(&worker->surfaces[surface_id].current_list)) {
- free_one_drawable(worker, FALSE);
- }
- red_current_clear(worker, surface_id);
-}
-
-// adding the pipe item after pos. If pos == NULL, adding to head.
-static ImageItem *red_add_surface_area_image(DisplayChannelClient *dcc, int surface_id,
- SpiceRect *area, PipeItem *pos, int can_lossy)
-{
- DisplayChannel *display_channel = DCC_TO_DC(dcc);
- RedWorker *worker = display_channel->common.worker;
- RedChannel *channel = &display_channel->common.base;
- RedSurface *surface = &worker->surfaces[surface_id];
- SpiceCanvas *canvas = surface->context.canvas;
- ImageItem *item;
- int stride;
- int width;
- int height;
- int bpp;
- int all_set;
-
- spice_assert(area);
-
- width = area->right - area->left;
- height = area->bottom - area->top;
- bpp = SPICE_SURFACE_FMT_DEPTH(surface->context.format) / 8;
- stride = width * bpp;
-
- item = (ImageItem *)spice_malloc_n_m(height, stride, sizeof(ImageItem));
-
- red_channel_pipe_item_init(channel, &item->link, PIPE_ITEM_TYPE_IMAGE);
-
- item->refs = 1;
- item->surface_id = surface_id;
- item->image_format =
- spice_bitmap_from_surface_type(surface->context.format);
- item->image_flags = 0;
- item->pos.x = area->left;
- item->pos.y = area->top;
- item->width = width;
- item->height = height;
- item->stride = stride;
- item->top_down = surface->context.top_down;
- item->can_lossy = can_lossy;
-
- canvas->ops->read_bits(canvas, item->data, stride, area);
-
- /* For 32bit non-primary surfaces we need to keep any non-zero
- high bytes as the surface may be used as source to an alpha_blend */
- if (!is_primary_surface(worker, surface_id) &&
- item->image_format == SPICE_BITMAP_FMT_32BIT &&
- rgb32_data_has_alpha(item->width, item->height, item->stride, item->data, &all_set)) {
- if (all_set) {
- item->image_flags |= SPICE_IMAGE_FLAGS_HIGH_BITS_SET;
- } else {
- item->image_format = SPICE_BITMAP_FMT_RGBA;
- }
- }
-
- if (!pos) {
- red_pipe_add_image_item(dcc, item);
- } else {
- red_pipe_add_image_item_after(dcc, item, pos);
- }
-
- release_image_item(item);
-
- return item;
-}
-
-static void red_push_surface_image(DisplayChannelClient *dcc, int surface_id)
-{
- SpiceRect area;
- RedSurface *surface;
- RedWorker *worker;
-
- if (!dcc) {
- return;
- }
- worker = DCC_TO_WORKER(dcc);
- surface = &worker->surfaces[surface_id];
- if (!surface->context.canvas) {
- return;
- }
- area.top = area.left = 0;
- area.right = surface->context.width;
- area.bottom = surface->context.height;
-
- /* not allowing lossy compression because probably, especially if it is a primary surface,
- it combines both "picture-like" areas with areas that are more "artificial"*/
- red_add_surface_area_image(dcc, surface_id, &area, NULL, FALSE);
- red_channel_client_push(&dcc->common.base);
-}
-
-typedef struct {
- uint32_t type;
- void *data;
- uint32_t size;
-} AddBufInfo;
-
-static void marshaller_add_compressed(SpiceMarshaller *m,
- RedCompressBuf *comp_buf, size_t size)
-{
- size_t max = size;
- size_t now;
- do {
- spice_assert(comp_buf);
- now = MIN(sizeof(comp_buf->buf), max);
- max -= now;
- spice_marshaller_add_ref(m, (uint8_t*)comp_buf->buf, now);
- comp_buf = comp_buf->send_next;
- } while (max);
-}
-
-
-static void add_buf_from_info(SpiceMarshaller *m, AddBufInfo *info)
-{
- if (info->data) {
- switch (info->type) {
- case BUF_TYPE_RAW:
- spice_marshaller_add_ref(m, info->data, info->size);
- break;
- }
- }
-}
-
-static void fill_base(SpiceMarshaller *base_marshaller, Drawable *drawable)
-{
- SpiceMsgDisplayBase base;
-
- base.surface_id = drawable->surface_id;
- base.box = drawable->red_drawable->bbox;
- base.clip = drawable->red_drawable->clip;
-
- spice_marshall_DisplayBase(base_marshaller, &base);
-}
-
-static inline void fill_palette(DisplayChannelClient *dcc,
- SpicePalette *palette,
- uint8_t *flags)
-{
- if (palette == NULL) {
- return;
- }
- if (palette->unique) {
- if (red_palette_cache_find(dcc, palette->unique)) {
- *flags |= SPICE_BITMAP_FLAGS_PAL_FROM_CACHE;
- return;
- }
- if (red_palette_cache_add(dcc, palette->unique, 1)) {
- *flags |= SPICE_BITMAP_FLAGS_PAL_CACHE_ME;
- }
- }
-}
-
-static inline RedCompressBuf *red_display_alloc_compress_buf(DisplayChannelClient *dcc)
-{
- DisplayChannel *display_channel = DCC_TO_DC(dcc);
- RedCompressBuf *ret;
-
- if (display_channel->free_compress_bufs) {
- ret = display_channel->free_compress_bufs;
- display_channel->free_compress_bufs = ret->next;
- } else {
- ret = spice_new(RedCompressBuf, 1);
- }
-
- ret->next = dcc->send_data.used_compress_bufs;
- dcc->send_data.used_compress_bufs = ret;
- return ret;
-}
-
-static inline void __red_display_free_compress_buf(DisplayChannel *dc,
- RedCompressBuf *buf)
-{
- buf->next = dc->free_compress_bufs;
- dc->free_compress_bufs = buf;
-}
-
-static void red_display_free_compress_buf(DisplayChannelClient *dcc,
- RedCompressBuf *buf)
-{
- DisplayChannel *display_channel = DCC_TO_DC(dcc);
- RedCompressBuf **curr_used = &dcc->send_data.used_compress_bufs;
-
- for (;;) {
- spice_assert(*curr_used);
- if (*curr_used == buf) {
- *curr_used = buf->next;
- break;
- }
- curr_used = &(*curr_used)->next;
- }
- __red_display_free_compress_buf(display_channel, buf);
-}
-
-static void red_display_reset_compress_buf(DisplayChannelClient *dcc)
-{
- while (dcc->send_data.used_compress_bufs) {
- RedCompressBuf *buf = dcc->send_data.used_compress_bufs;
- dcc->send_data.used_compress_bufs = buf->next;
- __red_display_free_compress_buf(DCC_TO_DC(dcc), buf);
- }
-}
-
-static void red_display_destroy_compress_bufs(DisplayChannel *display_channel)
-{
- spice_assert(!red_channel_is_connected(&display_channel->common.base));
- while (display_channel->free_compress_bufs) {
- RedCompressBuf *buf = display_channel->free_compress_bufs;
- display_channel->free_compress_bufs = buf->next;
- free(buf);
- }
-}
-
-/******************************************************
- * Global lz red drawables routines
-*******************************************************/
-
-/* if already exists, returns it. Otherwise allocates and adds it (1) to the ring tail
- in the channel (2) to the Drawable*/
-static RedGlzDrawable *red_display_get_glz_drawable(DisplayChannelClient *dcc, Drawable *drawable)
-{
- RedGlzDrawable *ret;
- RingItem *item, *next;
-
- // TODO - I don't really understand what's going on here, so doing the technical equivalent
- // now that we have multiple glz_dicts, so the only way to go from dcc to drawable glz is to go
- // over the glz_ring (unless adding some better data structure then a ring)
- DRAWABLE_FOREACH_GLZ_SAFE(drawable, item, next, ret) {
- if (ret->dcc == dcc) {
- return ret;
- }
- }
-
- ret = spice_new(RedGlzDrawable, 1);
-
- ret->dcc = dcc;
- ret->red_drawable = ref_red_drawable(drawable->red_drawable);
- ret->drawable = drawable;
- ret->group_id = drawable->group_id;
- ret->instances_count = 0;
- ring_init(&ret->instances);
-
- ring_item_init(&ret->link);
- ring_item_init(&ret->drawable_link);
- ring_add_before(&ret->link, &dcc->glz_drawables);
- ring_add(&drawable->glz_ring, &ret->drawable_link);
- dcc->common.worker->glz_drawable_count++;
- return ret;
-}
-
-/* allocates new instance and adds it to instances in the given drawable.
- NOTE - the caller should set the glz_instance returned by the encoder by itself.*/
-static GlzDrawableInstanceItem *red_display_add_glz_drawable_instance(RedGlzDrawable *glz_drawable)
-{
- spice_assert(glz_drawable->instances_count < MAX_GLZ_DRAWABLE_INSTANCES);
- // NOTE: We assume the additions are performed consecutively, without removals in the middle
- GlzDrawableInstanceItem *ret = glz_drawable->instances_pool + glz_drawable->instances_count;
- glz_drawable->instances_count++;
-
- ring_item_init(&ret->free_link);
- ring_item_init(&ret->glz_link);
- ring_add(&glz_drawable->instances, &ret->glz_link);
- ret->glz_instance = NULL;
- ret->red_glz_drawable = glz_drawable;
-
- return ret;
-}
-
-/* Remove from the to_free list and the instances_list.
- When no instance is left - the RedGlzDrawable is released too. (and the qxl drawable too, if
- it is not used by Drawable).
- NOTE - 1) can be called only by the display channel that created the drawable
- 2) it is assumed that the instance was already removed from the dictionary*/
-static void red_display_free_glz_drawable_instance(DisplayChannelClient *dcc,
- GlzDrawableInstanceItem *glz_drawable_instance)
-{
- DisplayChannel *display_channel = DCC_TO_DC(dcc);
- RedWorker *worker = display_channel->common.worker;
- RedGlzDrawable *glz_drawable;
-
- spice_assert(glz_drawable_instance);
- spice_assert(glz_drawable_instance->red_glz_drawable);
-
- glz_drawable = glz_drawable_instance->red_glz_drawable;
-
- spice_assert(glz_drawable->dcc == dcc);
- spice_assert(glz_drawable->instances_count);
-
- ring_remove(&glz_drawable_instance->glz_link);
- glz_drawable->instances_count--;
- // when the remove callback is performed from the channel that the
- // drawable belongs to, the instance is not added to the 'to_free' list
- if (ring_item_is_linked(&glz_drawable_instance->free_link)) {
- ring_remove(&glz_drawable_instance->free_link);
- }
-
- if (ring_is_empty(&glz_drawable->instances)) {
- spice_assert(!glz_drawable->instances_count);
-
- Drawable *drawable = glz_drawable->drawable;
-
- if (drawable) {
- ring_remove(&glz_drawable->drawable_link);
- }
- put_red_drawable(worker, glz_drawable->red_drawable,
- glz_drawable->group_id);
- worker->glz_drawable_count--;
- if (ring_item_is_linked(&glz_drawable->link)) {
- ring_remove(&glz_drawable->link);
- }
- free(glz_drawable);
- }
-}
-
-static void red_display_handle_glz_drawables_to_free(DisplayChannelClient* dcc)
-{
- RingItem *ring_link;
-
- if (!dcc->glz_dict) {
- return;
- }
- pthread_mutex_lock(&dcc->glz_drawables_inst_to_free_lock);
- while ((ring_link = ring_get_head(&dcc->glz_drawables_inst_to_free))) {
- GlzDrawableInstanceItem *drawable_instance = SPICE_CONTAINEROF(ring_link,
- GlzDrawableInstanceItem,
- free_link);
- red_display_free_glz_drawable_instance(dcc, drawable_instance);
- }
- pthread_mutex_unlock(&dcc->glz_drawables_inst_to_free_lock);
-}
-
-/*
- * Releases all the instances of the drawable from the dictionary and the display channel client.
- * The release of the last instance will also release the drawable itself and the qxl drawable
- * if possible.
- * NOTE - the caller should prevent encoding using the dictionary during this operation
- */
-static void red_display_free_glz_drawable(DisplayChannelClient *dcc, RedGlzDrawable *drawable)
-{
- RingItem *head_instance = ring_get_head(&drawable->instances);
- int cont = (head_instance != NULL);
-
- while (cont) {
- if (drawable->instances_count == 1) {
- /* Last instance: red_display_free_glz_drawable_instance will free the drawable */
- cont = FALSE;
- }
- GlzDrawableInstanceItem *instance = SPICE_CONTAINEROF(head_instance,
- GlzDrawableInstanceItem,
- glz_link);
- if (!ring_item_is_linked(&instance->free_link)) {
- // the instance didn't get out from window yet
- glz_enc_dictionary_remove_image(dcc->glz_dict->dict,
- instance->glz_instance,
- &dcc->glz_data.usr);
- }
- red_display_free_glz_drawable_instance(dcc, instance);
-
- if (cont) {
- head_instance = ring_get_head(&drawable->instances);
- }
- }
-}
-
-/* Clear all lz drawables - enforce their removal from the global dictionary.
- NOTE - prevents encoding using the dictionary during the operation*/
-static void red_display_client_clear_glz_drawables(DisplayChannelClient *dcc)
-{
- RingItem *ring_link;
- GlzSharedDictionary *glz_dict = dcc ? dcc->glz_dict : NULL;
-
- if (!glz_dict) {
- return;
- }
-
- // assure no display channel is during global lz encoding
- pthread_rwlock_wrlock(&glz_dict->encode_lock);
- while ((ring_link = ring_get_head(&dcc->glz_drawables))) {
- RedGlzDrawable *drawable = SPICE_CONTAINEROF(ring_link, RedGlzDrawable, link);
- // no need to lock the to_free list, since we assured no other thread is encoding and
- // thus not other thread access the to_free list of the channel
- red_display_free_glz_drawable(dcc, drawable);
- }
- pthread_rwlock_unlock(&glz_dict->encode_lock);
-}
-
-static void red_display_clear_glz_drawables(DisplayChannel *display_channel)
-{
- RingItem *link, *next;
- DisplayChannelClient *dcc;
-
- if (!display_channel) {
- return;
- }
- DCC_FOREACH_SAFE(link, next, dcc, &display_channel->common.base) {
- red_display_client_clear_glz_drawables(dcc);
- }
-}
-
-/*
- * Remove from the global lz dictionary some glz_drawables that have no reference to
- * Drawable (their qxl drawables are released too).
- * NOTE - the caller should prevent encoding using the dictionary during the operation
- */
-static int red_display_free_some_independent_glz_drawables(DisplayChannelClient *dcc)
-{
- RingItem *ring_link;
- int n = 0;
-
- if (!dcc) {
- return 0;
- }
- ring_link = ring_get_head(&dcc->glz_drawables);
- while ((n < RED_RELEASE_BUNCH_SIZE) && (ring_link != NULL)) {
- RedGlzDrawable *glz_drawable = SPICE_CONTAINEROF(ring_link, RedGlzDrawable, link);
- ring_link = ring_next(&dcc->glz_drawables, ring_link);
- if (!glz_drawable->drawable) {
- red_display_free_glz_drawable(dcc, glz_drawable);
- n++;
- }
- }
- return n;
-}
-
-/******************************************************
- * Encoders callbacks
-*******************************************************/
-static SPICE_GNUC_NORETURN SPICE_GNUC_PRINTF(2, 3) void
-quic_usr_error(QuicUsrContext *usr, const char *fmt, ...)
-{
- EncoderData *usr_data = &(((QuicData *)usr)->data);
- va_list ap;
-
- va_start(ap, fmt);
- vsnprintf(usr_data->message_buf, sizeof(usr_data->message_buf), fmt, ap);
- va_end(ap);
- spice_critical("%s", usr_data->message_buf);
-
- longjmp(usr_data->jmp_env, 1);
-}
-
-static SPICE_GNUC_NORETURN SPICE_GNUC_PRINTF(2, 3) void
-lz_usr_error(LzUsrContext *usr, const char *fmt, ...)
-{
- EncoderData *usr_data = &(((LzData *)usr)->data);
- va_list ap;
-
- va_start(ap, fmt);
- vsnprintf(usr_data->message_buf, sizeof(usr_data->message_buf), fmt, ap);
- va_end(ap);
- spice_critical("%s", usr_data->message_buf);
-
- longjmp(usr_data->jmp_env, 1);
-}
-
-static SPICE_GNUC_PRINTF(2, 3) void glz_usr_error(GlzEncoderUsrContext *usr, const char *fmt, ...)
-{
- EncoderData *usr_data = &(((GlzData *)usr)->data);
- va_list ap;
-
- va_start(ap, fmt);
- vsnprintf(usr_data->message_buf, sizeof(usr_data->message_buf), fmt, ap);
- va_end(ap);
-
- spice_critical("%s", usr_data->message_buf); // if global lz fails in the middle
- // the consequences are not predictable since the window
- // can turn to be unsynchronized between the server and
- // and the client
-}
-
-static SPICE_GNUC_PRINTF(2, 3) void quic_usr_warn(QuicUsrContext *usr, const char *fmt, ...)
-{
- EncoderData *usr_data = &(((QuicData *)usr)->data);
- va_list ap;
-
- va_start(ap, fmt);
- vsnprintf(usr_data->message_buf, sizeof(usr_data->message_buf), fmt, ap);
- va_end(ap);
- spice_warning("%s", usr_data->message_buf);
-}
-
-static SPICE_GNUC_PRINTF(2, 3) void lz_usr_warn(LzUsrContext *usr, const char *fmt, ...)
-{
- EncoderData *usr_data = &(((LzData *)usr)->data);
- va_list ap;
-
- va_start(ap, fmt);
- vsnprintf(usr_data->message_buf, sizeof(usr_data->message_buf), fmt, ap);
- va_end(ap);
- spice_warning("%s", usr_data->message_buf);
-}
-
-static SPICE_GNUC_PRINTF(2, 3) void glz_usr_warn(GlzEncoderUsrContext *usr, const char *fmt, ...)
-{
- EncoderData *usr_data = &(((GlzData *)usr)->data);
- va_list ap;
-
- va_start(ap, fmt);
- vsnprintf(usr_data->message_buf, sizeof(usr_data->message_buf), fmt, ap);
- va_end(ap);
- spice_warning("%s", usr_data->message_buf);
-}
-
-static void *quic_usr_malloc(QuicUsrContext *usr, int size)
-{
- return spice_malloc(size);
-}
-
-static void *lz_usr_malloc(LzUsrContext *usr, int size)
-{
- return spice_malloc(size);
-}
-
-static void *glz_usr_malloc(GlzEncoderUsrContext *usr, int size)
-{
- return spice_malloc(size);
-}
-
-static void quic_usr_free(QuicUsrContext *usr, void *ptr)
-{
- free(ptr);
-}
-
-static void lz_usr_free(LzUsrContext *usr, void *ptr)
-{
- free(ptr);
-}
-
-static void glz_usr_free(GlzEncoderUsrContext *usr, void *ptr)
-{
- free(ptr);
-}
-
-static inline int encoder_usr_more_space(EncoderData *enc_data, uint32_t **io_ptr)
-{
- RedCompressBuf *buf;
-
- if (!(buf = red_display_alloc_compress_buf(enc_data->dcc))) {
- return 0;
- }
- enc_data->bufs_tail->send_next = buf;
- enc_data->bufs_tail = buf;
- buf->send_next = NULL;
- *io_ptr = buf->buf;
- return sizeof(buf->buf) >> 2;
-}
-
-static int quic_usr_more_space(QuicUsrContext *usr, uint32_t **io_ptr, int rows_completed)
-{
- EncoderData *usr_data = &(((QuicData *)usr)->data);
- return encoder_usr_more_space(usr_data, io_ptr);
-}
-
-static int lz_usr_more_space(LzUsrContext *usr, uint8_t **io_ptr)
-{
- EncoderData *usr_data = &(((LzData *)usr)->data);
- return (encoder_usr_more_space(usr_data, (uint32_t **)io_ptr) << 2);
-}
-
-static int glz_usr_more_space(GlzEncoderUsrContext *usr, uint8_t **io_ptr)
-{
- EncoderData *usr_data = &(((GlzData *)usr)->data);
- return (encoder_usr_more_space(usr_data, (uint32_t **)io_ptr) << 2);
-}
-
-static int jpeg_usr_more_space(JpegEncoderUsrContext *usr, uint8_t **io_ptr)
-{
- EncoderData *usr_data = &(((JpegData *)usr)->data);
- return (encoder_usr_more_space(usr_data, (uint32_t **)io_ptr) << 2);
-}
-
-static int zlib_usr_more_space(ZlibEncoderUsrContext *usr, uint8_t **io_ptr)
-{
- EncoderData *usr_data = &(((ZlibData *)usr)->data);
- return (encoder_usr_more_space(usr_data, (uint32_t **)io_ptr) << 2);
-}
-
-static inline int encoder_usr_more_lines(EncoderData *enc_data, uint8_t **lines)
-{
- struct SpiceChunk *chunk;
-
- if (enc_data->u.lines_data.reverse) {
- if (!(enc_data->u.lines_data.next >= 0)) {
- return 0;
- }
- } else {
- if (!(enc_data->u.lines_data.next < enc_data->u.lines_data.chunks->num_chunks)) {
- return 0;
- }
- }
-
- chunk = &enc_data->u.lines_data.chunks->chunk[enc_data->u.lines_data.next];
- if (chunk->len % enc_data->u.lines_data.stride) {
- return 0;
- }
-
- if (enc_data->u.lines_data.reverse) {
- enc_data->u.lines_data.next--;
- *lines = chunk->data + chunk->len - enc_data->u.lines_data.stride;
- } else {
- enc_data->u.lines_data.next++;
- *lines = chunk->data;
- }
-
- return chunk->len / enc_data->u.lines_data.stride;
-}
-
-static int quic_usr_more_lines(QuicUsrContext *usr, uint8_t **lines)
-{
- EncoderData *usr_data = &(((QuicData *)usr)->data);
- return encoder_usr_more_lines(usr_data, lines);
-}
-
-static int lz_usr_more_lines(LzUsrContext *usr, uint8_t **lines)
-{
- EncoderData *usr_data = &(((LzData *)usr)->data);
- return encoder_usr_more_lines(usr_data, lines);
-}
-
-static int glz_usr_more_lines(GlzEncoderUsrContext *usr, uint8_t **lines)
-{
- EncoderData *usr_data = &(((GlzData *)usr)->data);
- return encoder_usr_more_lines(usr_data, lines);
-}
-
-static int jpeg_usr_more_lines(JpegEncoderUsrContext *usr, uint8_t **lines)
-{
- EncoderData *usr_data = &(((JpegData *)usr)->data);
- return encoder_usr_more_lines(usr_data, lines);
-}
-
-static int zlib_usr_more_input(ZlibEncoderUsrContext *usr, uint8_t** input)
-{
- EncoderData *usr_data = &(((ZlibData *)usr)->data);
- int buf_size;
-
- if (!usr_data->u.compressed_data.next) {
- spice_assert(usr_data->u.compressed_data.size_left == 0);
- return 0;
- }
-
- *input = (uint8_t*)usr_data->u.compressed_data.next->buf;
- buf_size = MIN(sizeof(usr_data->u.compressed_data.next->buf),
- usr_data->u.compressed_data.size_left);
-
- usr_data->u.compressed_data.next = usr_data->u.compressed_data.next->send_next;
- usr_data->u.compressed_data.size_left -= buf_size;
- return buf_size;
-}
-
-static void glz_usr_free_image(GlzEncoderUsrContext *usr, GlzUsrImageContext *image)
-{
- GlzData *lz_data = (GlzData *)usr;
- GlzDrawableInstanceItem *glz_drawable_instance = (GlzDrawableInstanceItem *)image;
- DisplayChannelClient *drawable_cc = glz_drawable_instance->red_glz_drawable->dcc;
- DisplayChannelClient *this_cc = SPICE_CONTAINEROF(lz_data, DisplayChannelClient, glz_data);
- if (this_cc == drawable_cc) {
- red_display_free_glz_drawable_instance(drawable_cc, glz_drawable_instance);
- } else {
- /* The glz dictionary is shared between all DisplayChannelClient
- * instances that belong to the same client, and glz_usr_free_image
- * can be called by the dictionary code
- * (glz_dictionary_window_remove_head). Thus this function can be
- * called from any DisplayChannelClient thread, hence the need for
- * this check.
- */
- pthread_mutex_lock(&drawable_cc->glz_drawables_inst_to_free_lock);
- ring_add_before(&glz_drawable_instance->free_link,
- &drawable_cc->glz_drawables_inst_to_free);
- pthread_mutex_unlock(&drawable_cc->glz_drawables_inst_to_free_lock);
- }
-}
-
-static inline void red_init_quic(RedWorker *worker)
-{
- worker->quic_data.usr.error = quic_usr_error;
- worker->quic_data.usr.warn = quic_usr_warn;
- worker->quic_data.usr.info = quic_usr_warn;
- worker->quic_data.usr.malloc = quic_usr_malloc;
- worker->quic_data.usr.free = quic_usr_free;
- worker->quic_data.usr.more_space = quic_usr_more_space;
- worker->quic_data.usr.more_lines = quic_usr_more_lines;
-
- worker->quic = quic_create(&worker->quic_data.usr);
-
- if (!worker->quic) {
- spice_critical("create quic failed");
- }
-}
-
-static inline void red_init_lz(RedWorker *worker)
-{
- worker->lz_data.usr.error = lz_usr_error;
- worker->lz_data.usr.warn = lz_usr_warn;
- worker->lz_data.usr.info = lz_usr_warn;
- worker->lz_data.usr.malloc = lz_usr_malloc;
- worker->lz_data.usr.free = lz_usr_free;
- worker->lz_data.usr.more_space = lz_usr_more_space;
- worker->lz_data.usr.more_lines = lz_usr_more_lines;
-
- worker->lz = lz_create(&worker->lz_data.usr);
-
- if (!worker->lz) {
- spice_critical("create lz failed");
- }
-}
-
-/* TODO: split off to DisplayChannel? avoid just copying those cb pointers */
-static inline void red_display_init_glz_data(DisplayChannelClient *dcc)
-{
- dcc->glz_data.usr.error = glz_usr_error;
- dcc->glz_data.usr.warn = glz_usr_warn;
- dcc->glz_data.usr.info = glz_usr_warn;
- dcc->glz_data.usr.malloc = glz_usr_malloc;
- dcc->glz_data.usr.free = glz_usr_free;
- dcc->glz_data.usr.more_space = glz_usr_more_space;
- dcc->glz_data.usr.more_lines = glz_usr_more_lines;
- dcc->glz_data.usr.free_image = glz_usr_free_image;
-}
-
-static inline void red_init_jpeg(RedWorker *worker)
-{
- worker->jpeg_data.usr.more_space = jpeg_usr_more_space;
- worker->jpeg_data.usr.more_lines = jpeg_usr_more_lines;
-
- worker->jpeg = jpeg_encoder_create(&worker->jpeg_data.usr);
-
- if (!worker->jpeg) {
- spice_critical("create jpeg encoder failed");
- }
-}
-
-static inline void red_init_zlib(RedWorker *worker)
-{
- worker->zlib_data.usr.more_space = zlib_usr_more_space;
- worker->zlib_data.usr.more_input = zlib_usr_more_input;
-
- worker->zlib = zlib_encoder_create(&worker->zlib_data.usr, ZLIB_DEFAULT_COMPRESSION_LEVEL);
-
- if (!worker->zlib) {
- spice_critical("create zlib encoder failed");
- }
-}
-
-#ifdef __GNUC__
-#define ATTR_PACKED __attribute__ ((__packed__))
-#else
-#define ATTR_PACKED
-#pragma pack(push)
-#pragma pack(1)
-#endif
-
-
-typedef struct ATTR_PACKED rgb32_pixel_t {
- uint8_t b;
- uint8_t g;
- uint8_t r;
- uint8_t pad;
-} rgb32_pixel_t;
-
-typedef struct ATTR_PACKED rgb24_pixel_t {
- uint8_t b;
- uint8_t g;
- uint8_t r;
-} rgb24_pixel_t;
-
-typedef uint16_t rgb16_pixel_t;
-
-#ifndef __GNUC__
-#pragma pack(pop)
-#endif
-
-#undef ATTR_PACKED
-
-#define RED_BITMAP_UTILS_RGB16
-#include "red_bitmap_utils.h"
-#define RED_BITMAP_UTILS_RGB24
-#include "red_bitmap_utils.h"
-#define RED_BITMAP_UTILS_RGB32
-#include "red_bitmap_utils.h"
-
-#define GRADUAL_HIGH_RGB24_TH -0.03
-#define GRADUAL_HIGH_RGB16_TH 0
-
-// setting a more permissive threshold for stream identification in order
-// not to miss streams that were artificially scaled on the guest (e.g., full screen view
-// in window media player 12). see red_stream_add_frame
-#define GRADUAL_MEDIUM_SCORE_TH 0.002
-
-// assumes that stride doesn't overflow
-static BitmapGradualType _get_bitmap_graduality_level(RedWorker *worker, SpiceBitmap *bitmap,
- uint32_t group_id)
-{
- double score = 0.0;
- int num_samples = 0;
- int num_lines;
- double chunk_score = 0.0;
- int chunk_num_samples = 0;
- uint32_t x, i;
- SpiceChunk *chunk;
-
- chunk = bitmap->data->chunk;
- for (i = 0; i < bitmap->data->num_chunks; i++) {
- num_lines = chunk[i].len / bitmap->stride;
- x = bitmap->x;
- switch (bitmap->format) {
- case SPICE_BITMAP_FMT_16BIT:
- compute_lines_gradual_score_rgb16((rgb16_pixel_t *)chunk[i].data, x, num_lines,
- &chunk_score, &chunk_num_samples);
- break;
- case SPICE_BITMAP_FMT_24BIT:
- compute_lines_gradual_score_rgb24((rgb24_pixel_t *)chunk[i].data, x, num_lines,
- &chunk_score, &chunk_num_samples);
- break;
- case SPICE_BITMAP_FMT_32BIT:
- case SPICE_BITMAP_FMT_RGBA:
- compute_lines_gradual_score_rgb32((rgb32_pixel_t *)chunk[i].data, x, num_lines,
- &chunk_score, &chunk_num_samples);
- break;
- default:
- spice_error("invalid bitmap format (not RGB) %u", bitmap->format);
- }
- score += chunk_score;
- num_samples += chunk_num_samples;
- }
-
- spice_assert(num_samples);
- score /= num_samples;
-
- if (bitmap->format == SPICE_BITMAP_FMT_16BIT) {
- if (score < GRADUAL_HIGH_RGB16_TH) {
- return BITMAP_GRADUAL_HIGH;
- }
- } else {
- if (score < GRADUAL_HIGH_RGB24_TH) {
- return BITMAP_GRADUAL_HIGH;
- }
- }
-
- if (score < GRADUAL_MEDIUM_SCORE_TH) {
- return BITMAP_GRADUAL_MEDIUM;
- } else {
- return BITMAP_GRADUAL_LOW;
- }
-}
-
-static inline int _stride_is_extra(SpiceBitmap *bitmap)
-{
- spice_assert(bitmap);
- if (bitmap_fmt_is_rgb(bitmap->format)) {
- return ((bitmap->x * BITMAP_FMP_BYTES_PER_PIXEL[bitmap->format]) < bitmap->stride);
- } else {
- switch (bitmap->format) {
- case SPICE_BITMAP_FMT_8BIT:
- return (bitmap->x < bitmap->stride);
- case SPICE_BITMAP_FMT_4BIT_BE:
- case SPICE_BITMAP_FMT_4BIT_LE: {
- int bytes_width = SPICE_ALIGN(bitmap->x, 2) >> 1;
- return bytes_width < bitmap->stride;
- }
- case SPICE_BITMAP_FMT_1BIT_BE:
- case SPICE_BITMAP_FMT_1BIT_LE: {
- int bytes_width = SPICE_ALIGN(bitmap->x, 8) >> 3;
- return bytes_width < bitmap->stride;
- }
- default:
- spice_error("invalid image type %u", bitmap->format);
- return 0;
- }
- }
- return 0;
-}
-
-typedef struct compress_send_data_t {
- void* comp_buf;
- uint32_t comp_buf_size;
- SpicePalette *lzplt_palette;
- int is_lossy;
-} compress_send_data_t;
-
-static inline int red_glz_compress_image(DisplayChannelClient *dcc,
- SpiceImage *dest, SpiceBitmap *src, Drawable *drawable,
- compress_send_data_t* o_comp_data)
-{
- DisplayChannel *display_channel = DCC_TO_DC(dcc);
- RedWorker *worker = display_channel->common.worker;
-#ifdef COMPRESS_STAT
- stat_time_t start_time = stat_now();
-#endif
- spice_assert(bitmap_fmt_is_rgb(src->format));
- GlzData *glz_data = &dcc->glz_data;
- ZlibData *zlib_data;
- LzImageType type = MAP_BITMAP_FMT_TO_LZ_IMAGE_TYPE[src->format];
- RedGlzDrawable *glz_drawable;
- GlzDrawableInstanceItem *glz_drawable_instance;
- int glz_size;
- int zlib_size;
-
- glz_data->data.bufs_tail = red_display_alloc_compress_buf(dcc);
- glz_data->data.bufs_head = glz_data->data.bufs_tail;
-
- if (!glz_data->data.bufs_head) {
- return FALSE;
- }
-
- glz_data->data.bufs_head->send_next = NULL;
- glz_data->data.dcc = dcc;
-
- glz_drawable = red_display_get_glz_drawable(dcc, drawable);
- glz_drawable_instance = red_display_add_glz_drawable_instance(glz_drawable);
-
- glz_data->data.u.lines_data.chunks = src->data;
- glz_data->data.u.lines_data.stride = src->stride;
- glz_data->data.u.lines_data.next = 0;
- glz_data->data.u.lines_data.reverse = 0;
- glz_data->usr.more_lines = glz_usr_more_lines;
-
- glz_size = glz_encode(dcc->glz, type, src->x, src->y,
- (src->flags & SPICE_BITMAP_FLAGS_TOP_DOWN), NULL, 0,
- src->stride, (uint8_t*)glz_data->data.bufs_head->buf,
- sizeof(glz_data->data.bufs_head->buf),
- glz_drawable_instance,
- &glz_drawable_instance->glz_instance);
-
- stat_compress_add(&display_channel->glz_stat, start_time, src->stride * src->y, glz_size);
-
- if (!display_channel->enable_zlib_glz_wrap || (glz_size < MIN_GLZ_SIZE_FOR_ZLIB)) {
- goto glz;
- }
-#ifdef COMPRESS_STAT
- start_time = stat_now();
-#endif
- zlib_data = &worker->zlib_data;
-
- zlib_data->data.bufs_tail = red_display_alloc_compress_buf(dcc);
- zlib_data->data.bufs_head = zlib_data->data.bufs_tail;
-
- if (!zlib_data->data.bufs_head) {
- spice_warning("failed to allocate zlib compress buffer");
- goto glz;
- }
-
- zlib_data->data.bufs_head->send_next = NULL;
- zlib_data->data.dcc = dcc;
-
- zlib_data->data.u.compressed_data.next = glz_data->data.bufs_head;
- zlib_data->data.u.compressed_data.size_left = glz_size;
-
- zlib_size = zlib_encode(worker->zlib, display_channel->zlib_level,
- glz_size, (uint8_t*)zlib_data->data.bufs_head->buf,
- sizeof(zlib_data->data.bufs_head->buf));
-
- // the compressed buffer is bigger than the original data
- if (zlib_size >= glz_size) {
- while (zlib_data->data.bufs_head) {
- RedCompressBuf *buf = zlib_data->data.bufs_head;
- zlib_data->data.bufs_head = buf->send_next;
- red_display_free_compress_buf(dcc, buf);
- }
- goto glz;
- }
-
- dest->descriptor.type = SPICE_IMAGE_TYPE_ZLIB_GLZ_RGB;
- dest->u.zlib_glz.glz_data_size = glz_size;
- dest->u.zlib_glz.data_size = zlib_size;
-
- o_comp_data->comp_buf = zlib_data->data.bufs_head;
- o_comp_data->comp_buf_size = zlib_size;
-
- stat_compress_add(&display_channel->zlib_glz_stat, start_time, glz_size, zlib_size);
- return TRUE;
-glz:
- dest->descriptor.type = SPICE_IMAGE_TYPE_GLZ_RGB;
- dest->u.lz_rgb.data_size = glz_size;
-
- o_comp_data->comp_buf = glz_data->data.bufs_head;
- o_comp_data->comp_buf_size = glz_size;
-
- return TRUE;
-}
-
-static inline int red_lz_compress_image(DisplayChannelClient *dcc,
- SpiceImage *dest, SpiceBitmap *src,
- compress_send_data_t* o_comp_data, uint32_t group_id)
-{
- DisplayChannel *display_channel = DCC_TO_DC(dcc);
- RedWorker *worker = display_channel->common.worker;
- LzData *lz_data = &worker->lz_data;
- LzContext *lz = worker->lz;
- LzImageType type = MAP_BITMAP_FMT_TO_LZ_IMAGE_TYPE[src->format];
- int size; // size of the compressed data
-
-#ifdef COMPRESS_STAT
- stat_time_t start_time = stat_now();
-#endif
-
- lz_data->data.bufs_tail = red_display_alloc_compress_buf(dcc);
- lz_data->data.bufs_head = lz_data->data.bufs_tail;
-
- if (!lz_data->data.bufs_head) {
- return FALSE;
- }
-
- lz_data->data.bufs_head->send_next = NULL;
- lz_data->data.dcc = dcc;
-
- if (setjmp(lz_data->data.jmp_env)) {
- while (lz_data->data.bufs_head) {
- RedCompressBuf *buf = lz_data->data.bufs_head;
- lz_data->data.bufs_head = buf->send_next;
- red_display_free_compress_buf(dcc, buf);
- }
- return FALSE;
- }
-
- lz_data->data.u.lines_data.chunks = src->data;
- lz_data->data.u.lines_data.stride = src->stride;
- lz_data->data.u.lines_data.next = 0;
- lz_data->data.u.lines_data.reverse = 0;
- lz_data->usr.more_lines = lz_usr_more_lines;
-
- size = lz_encode(lz, type, src->x, src->y,
- !!(src->flags & SPICE_BITMAP_FLAGS_TOP_DOWN),
- NULL, 0, src->stride,
- (uint8_t*)lz_data->data.bufs_head->buf,
- sizeof(lz_data->data.bufs_head->buf));
-
- // the compressed buffer is bigger than the original data
- if (size > (src->y * src->stride)) {
- longjmp(lz_data->data.jmp_env, 1);
- }
-
- if (bitmap_fmt_is_rgb(src->format)) {
- dest->descriptor.type = SPICE_IMAGE_TYPE_LZ_RGB;
- dest->u.lz_rgb.data_size = size;
-
- o_comp_data->comp_buf = lz_data->data.bufs_head;
- o_comp_data->comp_buf_size = size;
- } else {
- /* masks are 1BIT bitmaps without palettes, but they are not compressed
- * (see fill_mask) */
- spice_assert(src->palette);
- dest->descriptor.type = SPICE_IMAGE_TYPE_LZ_PLT;
- dest->u.lz_plt.data_size = size;
- dest->u.lz_plt.flags = src->flags & SPICE_BITMAP_FLAGS_TOP_DOWN;
- dest->u.lz_plt.palette = src->palette;
- dest->u.lz_plt.palette_id = src->palette->unique;
- o_comp_data->comp_buf = lz_data->data.bufs_head;
- o_comp_data->comp_buf_size = size;
-
- fill_palette(dcc, dest->u.lz_plt.palette, &(dest->u.lz_plt.flags));
- o_comp_data->lzplt_palette = dest->u.lz_plt.palette;
- }
-
- stat_compress_add(&display_channel->lz_stat, start_time, src->stride * src->y,
- o_comp_data->comp_buf_size);
- return TRUE;
-}
-
-static int red_jpeg_compress_image(DisplayChannelClient *dcc, SpiceImage *dest,
- SpiceBitmap *src, compress_send_data_t* o_comp_data,
- uint32_t group_id)
-{
- DisplayChannel *display_channel = DCC_TO_DC(dcc);
- RedWorker *worker = display_channel->common.worker;
- JpegData *jpeg_data = &worker->jpeg_data;
- LzData *lz_data = &worker->lz_data;
- JpegEncoderContext *jpeg = worker->jpeg;
- LzContext *lz = worker->lz;
- volatile JpegEncoderImageType jpeg_in_type;
- int jpeg_size = 0;
- volatile int has_alpha = FALSE;
- int alpha_lz_size = 0;
- int comp_head_filled;
- int comp_head_left;
- int stride;
- uint8_t *lz_out_start_byte;
-
-#ifdef COMPRESS_STAT
- stat_time_t start_time = stat_now();
-#endif
- switch (src->format) {
- case SPICE_BITMAP_FMT_16BIT:
- jpeg_in_type = JPEG_IMAGE_TYPE_RGB16;
- break;
- case SPICE_BITMAP_FMT_24BIT:
- jpeg_in_type = JPEG_IMAGE_TYPE_BGR24;
- break;
- case SPICE_BITMAP_FMT_32BIT:
- jpeg_in_type = JPEG_IMAGE_TYPE_BGRX32;
- break;
- case SPICE_BITMAP_FMT_RGBA:
- jpeg_in_type = JPEG_IMAGE_TYPE_BGRX32;
- has_alpha = TRUE;
- break;
- default:
- return FALSE;
- }
-
- jpeg_data->data.bufs_tail = red_display_alloc_compress_buf(dcc);
- jpeg_data->data.bufs_head = jpeg_data->data.bufs_tail;
-
- if (!jpeg_data->data.bufs_head) {
- spice_warning("failed to allocate compress buffer");
- return FALSE;
- }
-
- jpeg_data->data.bufs_head->send_next = NULL;
- jpeg_data->data.dcc = dcc;
-
- if (setjmp(jpeg_data->data.jmp_env)) {
- while (jpeg_data->data.bufs_head) {
- RedCompressBuf *buf = jpeg_data->data.bufs_head;
- jpeg_data->data.bufs_head = buf->send_next;
- red_display_free_compress_buf(dcc, buf);
- }
- return FALSE;
- }
-
- if (src->data->flags & SPICE_CHUNKS_FLAGS_UNSTABLE) {
- spice_chunks_linearize(src->data);
- }
-
- jpeg_data->data.u.lines_data.chunks = src->data;
- jpeg_data->data.u.lines_data.stride = src->stride;
- jpeg_data->usr.more_lines = jpeg_usr_more_lines;
- if ((src->flags & SPICE_BITMAP_FLAGS_TOP_DOWN)) {
- jpeg_data->data.u.lines_data.next = 0;
- jpeg_data->data.u.lines_data.reverse = 0;
- stride = src->stride;
- } else {
- jpeg_data->data.u.lines_data.next = src->data->num_chunks - 1;
- jpeg_data->data.u.lines_data.reverse = 1;
- stride = -src->stride;
- }
- jpeg_size = jpeg_encode(jpeg, display_channel->jpeg_quality, jpeg_in_type,
- src->x, src->y, NULL,
- 0, stride, (uint8_t*)jpeg_data->data.bufs_head->buf,
- sizeof(jpeg_data->data.bufs_head->buf));
-
- // the compressed buffer is bigger than the original data
- if (jpeg_size > (src->y * src->stride)) {
- longjmp(jpeg_data->data.jmp_env, 1);
- }
-
- if (!has_alpha) {
- dest->descriptor.type = SPICE_IMAGE_TYPE_JPEG;
- dest->u.jpeg.data_size = jpeg_size;
-
- o_comp_data->comp_buf = jpeg_data->data.bufs_head;
- o_comp_data->comp_buf_size = jpeg_size;
- o_comp_data->is_lossy = TRUE;
-
- stat_compress_add(&display_channel->jpeg_stat, start_time, src->stride * src->y,
- o_comp_data->comp_buf_size);
- return TRUE;
- }
-
- lz_data->data.bufs_head = jpeg_data->data.bufs_tail;
- lz_data->data.bufs_tail = lz_data->data.bufs_head;
-
- comp_head_filled = jpeg_size % sizeof(lz_data->data.bufs_head->buf);
- comp_head_left = sizeof(lz_data->data.bufs_head->buf) - comp_head_filled;
- lz_out_start_byte = ((uint8_t *)lz_data->data.bufs_head->buf) + comp_head_filled;
-
- lz_data->data.dcc = dcc;
-
- lz_data->data.u.lines_data.chunks = src->data;
- lz_data->data.u.lines_data.stride = src->stride;
- lz_data->data.u.lines_data.next = 0;
- lz_data->data.u.lines_data.reverse = 0;
- lz_data->usr.more_lines = lz_usr_more_lines;
-
- alpha_lz_size = lz_encode(lz, LZ_IMAGE_TYPE_XXXA, src->x, src->y,
- !!(src->flags & SPICE_BITMAP_FLAGS_TOP_DOWN),
- NULL, 0, src->stride,
- lz_out_start_byte,
- comp_head_left);
-
- // the compressed buffer is bigger than the original data
- if ((jpeg_size + alpha_lz_size) > (src->y * src->stride)) {
- longjmp(jpeg_data->data.jmp_env, 1);
- }
-
- dest->descriptor.type = SPICE_IMAGE_TYPE_JPEG_ALPHA;
- dest->u.jpeg_alpha.flags = 0;
- if (src->flags & SPICE_BITMAP_FLAGS_TOP_DOWN) {
- dest->u.jpeg_alpha.flags |= SPICE_JPEG_ALPHA_FLAGS_TOP_DOWN;
- }
-
- dest->u.jpeg_alpha.jpeg_size = jpeg_size;
- dest->u.jpeg_alpha.data_size = jpeg_size + alpha_lz_size;
-
- o_comp_data->comp_buf = jpeg_data->data.bufs_head;
- o_comp_data->comp_buf_size = jpeg_size + alpha_lz_size;
- o_comp_data->is_lossy = TRUE;
- stat_compress_add(&display_channel->jpeg_alpha_stat, start_time, src->stride * src->y,
- o_comp_data->comp_buf_size);
- return TRUE;
-}
-
-static inline int red_quic_compress_image(DisplayChannelClient *dcc, SpiceImage *dest,
- SpiceBitmap *src, compress_send_data_t* o_comp_data,
- uint32_t group_id)
-{
- DisplayChannel *display_channel = DCC_TO_DC(dcc);
- RedWorker *worker = display_channel->common.worker;
- QuicData *quic_data = &worker->quic_data;
- QuicContext *quic = worker->quic;
- volatile QuicImageType type;
- int size, stride;
-
-#ifdef COMPRESS_STAT
- stat_time_t start_time = stat_now();
-#endif
-
- switch (src->format) {
- case SPICE_BITMAP_FMT_32BIT:
- type = QUIC_IMAGE_TYPE_RGB32;
- break;
- case SPICE_BITMAP_FMT_RGBA:
- type = QUIC_IMAGE_TYPE_RGBA;
- break;
- case SPICE_BITMAP_FMT_16BIT:
- type = QUIC_IMAGE_TYPE_RGB16;
- break;
- case SPICE_BITMAP_FMT_24BIT:
- type = QUIC_IMAGE_TYPE_RGB24;
- break;
- default:
- return FALSE;
- }
-
- quic_data->data.bufs_tail = red_display_alloc_compress_buf(dcc);
- quic_data->data.bufs_head = quic_data->data.bufs_tail;
-
- if (!quic_data->data.bufs_head) {
- return FALSE;
- }
-
- quic_data->data.bufs_head->send_next = NULL;
- quic_data->data.dcc = dcc;
-
- if (setjmp(quic_data->data.jmp_env)) {
- while (quic_data->data.bufs_head) {
- RedCompressBuf *buf = quic_data->data.bufs_head;
- quic_data->data.bufs_head = buf->send_next;
- red_display_free_compress_buf(dcc, buf);
- }
- return FALSE;
- }
-
- if (src->data->flags & SPICE_CHUNKS_FLAGS_UNSTABLE) {
- spice_chunks_linearize(src->data);
- }
-
- quic_data->data.u.lines_data.chunks = src->data;
- quic_data->data.u.lines_data.stride = src->stride;
- quic_data->usr.more_lines = quic_usr_more_lines;
- if ((src->flags & SPICE_BITMAP_FLAGS_TOP_DOWN)) {
- quic_data->data.u.lines_data.next = 0;
- quic_data->data.u.lines_data.reverse = 0;
- stride = src->stride;
- } else {
- quic_data->data.u.lines_data.next = src->data->num_chunks - 1;
- quic_data->data.u.lines_data.reverse = 1;
- stride = -src->stride;
- }
- size = quic_encode(quic, type, src->x, src->y, NULL, 0, stride,
- quic_data->data.bufs_head->buf,
- sizeof(quic_data->data.bufs_head->buf) >> 2);
-
- // the compressed buffer is bigger than the original data
- if ((size << 2) > (src->y * src->stride)) {
- longjmp(quic_data->data.jmp_env, 1);
- }
-
- dest->descriptor.type = SPICE_IMAGE_TYPE_QUIC;
- dest->u.quic.data_size = size << 2;
-
- o_comp_data->comp_buf = quic_data->data.bufs_head;
- o_comp_data->comp_buf_size = size << 2;
-
- stat_compress_add(&display_channel->quic_stat, start_time, src->stride * src->y,
- o_comp_data->comp_buf_size);
- return TRUE;
-}
-
-#define MIN_SIZE_TO_COMPRESS 54
-#define MIN_DIMENSION_TO_QUIC 3
-static inline int red_compress_image(DisplayChannelClient *dcc,
- SpiceImage *dest, SpiceBitmap *src, Drawable *drawable,
- int can_lossy,
- compress_send_data_t* o_comp_data)
-{
- DisplayChannel *display_channel = DCC_TO_DC(dcc);
- spice_image_compression_t image_compression =
- display_channel->common.worker->image_compression;
- int quic_compress = FALSE;
-
- if ((image_compression == SPICE_IMAGE_COMPRESS_OFF) ||
- ((src->y * src->stride) < MIN_SIZE_TO_COMPRESS)) { // TODO: change the size cond
- return FALSE;
- } else if (image_compression == SPICE_IMAGE_COMPRESS_QUIC) {
- if (BITMAP_FMT_IS_PLT[src->format]) {
- return FALSE;
- } else {
- quic_compress = TRUE;
- }
- } else {
- /*
- lz doesn't handle (1) bitmaps with strides that are larger than the width
- of the image in bytes (2) unstable bitmaps
- */
- if (_stride_is_extra(src) || (src->data->flags & SPICE_CHUNKS_FLAGS_UNSTABLE)) {
- if ((image_compression == SPICE_IMAGE_COMPRESS_LZ) ||
- (image_compression == SPICE_IMAGE_COMPRESS_GLZ) ||
- BITMAP_FMT_IS_PLT[src->format]) {
- return FALSE;
- } else {
- quic_compress = TRUE;
- }
- } else {
- if ((image_compression == SPICE_IMAGE_COMPRESS_AUTO_LZ) ||
- (image_compression == SPICE_IMAGE_COMPRESS_AUTO_GLZ)) {
- if ((src->x < MIN_DIMENSION_TO_QUIC) || (src->y < MIN_DIMENSION_TO_QUIC)) {
- quic_compress = FALSE;
- } else {
- if (drawable->copy_bitmap_graduality == BITMAP_GRADUAL_INVALID) {
- quic_compress = BITMAP_FMT_HAS_GRADUALITY(src->format) &&
- (_get_bitmap_graduality_level(display_channel->common.worker, src,
- drawable->group_id) ==
- BITMAP_GRADUAL_HIGH);
- } else {
- quic_compress = (drawable->copy_bitmap_graduality == BITMAP_GRADUAL_HIGH);
- }
- }
- } else {
- quic_compress = FALSE;
- }
- }
- }
-
- if (quic_compress) {
-#ifdef COMPRESS_DEBUG
- spice_info("QUIC compress");
-#endif
- // if bitmaps is picture-like, compress it using jpeg
- if (can_lossy && display_channel->enable_jpeg &&
- ((image_compression == SPICE_IMAGE_COMPRESS_AUTO_LZ) ||
- (image_compression == SPICE_IMAGE_COMPRESS_AUTO_GLZ))) {
- // if we use lz for alpha, the stride can't be extra
- if (src->format != SPICE_BITMAP_FMT_RGBA || !_stride_is_extra(src)) {
- return red_jpeg_compress_image(dcc, dest,
- src, o_comp_data, drawable->group_id);
- }
- }
- return red_quic_compress_image(dcc, dest,
- src, o_comp_data, drawable->group_id);
- } else {
- int glz;
- int ret;
- if ((image_compression == SPICE_IMAGE_COMPRESS_AUTO_GLZ) ||
- (image_compression == SPICE_IMAGE_COMPRESS_GLZ)) {
- glz = BITMAP_FMT_HAS_GRADUALITY(src->format) && (
- (src->x * src->y) < glz_enc_dictionary_get_size(
- dcc->glz_dict->dict));
- } else if ((image_compression == SPICE_IMAGE_COMPRESS_AUTO_LZ) ||
- (image_compression == SPICE_IMAGE_COMPRESS_LZ)) {
- glz = FALSE;
- } else {
- spice_error("invalid image compression type %u", image_compression);
- return FALSE;
- }
-
- if (glz) {
- /* using the global dictionary only if it is not frozen */
- pthread_rwlock_rdlock(&dcc->glz_dict->encode_lock);
- if (!dcc->glz_dict->migrate_freeze) {
- ret = red_glz_compress_image(dcc,
- dest, src,
- drawable, o_comp_data);
- } else {
- glz = FALSE;
- }
- pthread_rwlock_unlock(&dcc->glz_dict->encode_lock);
- }
-
- if (!glz) {
- ret = red_lz_compress_image(dcc, dest, src, o_comp_data,
- drawable->group_id);
-#ifdef COMPRESS_DEBUG
- spice_info("LZ LOCAL compress");
-#endif
- }
-#ifdef COMPRESS_DEBUG
- else {
- spice_info("LZ global compress fmt=%d", src->format);
- }
-#endif
- return ret;
- }
-}
-
-static inline void red_display_add_image_to_pixmap_cache(RedChannelClient *rcc,
- SpiceImage *image, SpiceImage *io_image,
- int is_lossy)
-{
- DisplayChannel *display_channel = SPICE_CONTAINEROF(rcc->channel, DisplayChannel, common.base);
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
-
- if ((image->descriptor.flags & SPICE_IMAGE_FLAGS_CACHE_ME)) {
- spice_assert(image->descriptor.width * image->descriptor.height > 0);
- if (!(io_image->descriptor.flags & SPICE_IMAGE_FLAGS_CACHE_REPLACE_ME)) {
- if (pixmap_cache_add(dcc->pixmap_cache, image->descriptor.id,
- image->descriptor.width * image->descriptor.height, is_lossy,
- dcc)) {
- io_image->descriptor.flags |= SPICE_IMAGE_FLAGS_CACHE_ME;
- dcc->send_data.pixmap_cache_items[dcc->send_data.num_pixmap_cache_items++] =
- image->descriptor.id;
- stat_inc_counter(display_channel->add_to_cache_counter, 1);
- }
- }
- }
-
- if (!(io_image->descriptor.flags & SPICE_IMAGE_FLAGS_CACHE_ME)) {
- stat_inc_counter(display_channel->non_cache_counter, 1);
- }
-}
-
-typedef enum {
- FILL_BITS_TYPE_INVALID,
- FILL_BITS_TYPE_CACHE,
- FILL_BITS_TYPE_SURFACE,
- FILL_BITS_TYPE_COMPRESS_LOSSLESS,
- FILL_BITS_TYPE_COMPRESS_LOSSY,
- FILL_BITS_TYPE_BITMAP,
-} FillBitsType;
-
-/* if the number of times fill_bits can be called per one qxl_drawable increases -
- MAX_LZ_DRAWABLE_INSTANCES must be increased as well */
-static FillBitsType fill_bits(DisplayChannelClient *dcc, SpiceMarshaller *m,
- SpiceImage *simage, Drawable *drawable, int can_lossy)
-{
- RedChannelClient *rcc = &dcc->common.base;
- DisplayChannel *display_channel = SPICE_CONTAINEROF(rcc->channel, DisplayChannel, common.base);
- RedWorker *worker = dcc->common.worker;
- SpiceImage image;
- compress_send_data_t comp_send_data = {0};
- SpiceMarshaller *bitmap_palette_out, *lzplt_palette_out;
-
- if (simage == NULL) {
- spice_assert(drawable->red_drawable->self_bitmap_image);
- simage = drawable->red_drawable->self_bitmap_image;
- }
-
- image.descriptor = simage->descriptor;
- image.descriptor.flags = 0;
- if (simage->descriptor.flags & SPICE_IMAGE_FLAGS_HIGH_BITS_SET) {
- image.descriptor.flags = SPICE_IMAGE_FLAGS_HIGH_BITS_SET;
- }
-
- if ((simage->descriptor.flags & SPICE_IMAGE_FLAGS_CACHE_ME)) {
- int lossy_cache_item;
- if (pixmap_cache_hit(dcc->pixmap_cache, image.descriptor.id,
- &lossy_cache_item, dcc)) {
- dcc->send_data.pixmap_cache_items[dcc->send_data.num_pixmap_cache_items++] =
- image.descriptor.id;
- if (can_lossy || !lossy_cache_item) {
- if (!display_channel->enable_jpeg || lossy_cache_item) {
- image.descriptor.type = SPICE_IMAGE_TYPE_FROM_CACHE;
- } else {
- // making sure, in multiple monitor scenario, that lossy items that
- // should have been replaced with lossless data by one display channel,
- // will be retrieved as lossless by another display channel.
- image.descriptor.type = SPICE_IMAGE_TYPE_FROM_CACHE_LOSSLESS;
- }
- spice_marshall_Image(m, &image,
- &bitmap_palette_out, &lzplt_palette_out);
- spice_assert(bitmap_palette_out == NULL);
- spice_assert(lzplt_palette_out == NULL);
- stat_inc_counter(display_channel->cache_hits_counter, 1);
- return FILL_BITS_TYPE_CACHE;
- } else {
- pixmap_cache_set_lossy(dcc->pixmap_cache, simage->descriptor.id,
- FALSE);
- image.descriptor.flags |= SPICE_IMAGE_FLAGS_CACHE_REPLACE_ME;
- }
- }
- }
-
- switch (simage->descriptor.type) {
- case SPICE_IMAGE_TYPE_SURFACE: {
- int surface_id;
- RedSurface *surface;
-
- surface_id = simage->u.surface.surface_id;
- if (!validate_surface(worker, surface_id)) {
- rendering_incorrect("SPICE_IMAGE_TYPE_SURFACE");
- return FILL_BITS_TYPE_SURFACE;
- }
-
- surface = &worker->surfaces[surface_id];
- image.descriptor.type = SPICE_IMAGE_TYPE_SURFACE;
- image.descriptor.flags = 0;
- image.descriptor.width = surface->context.width;
- image.descriptor.height = surface->context.height;
-
- image.u.surface.surface_id = surface_id;
- spice_marshall_Image(m, &image,
- &bitmap_palette_out, &lzplt_palette_out);
- spice_assert(bitmap_palette_out == NULL);
- spice_assert(lzplt_palette_out == NULL);
- return FILL_BITS_TYPE_SURFACE;
- }
- case SPICE_IMAGE_TYPE_BITMAP: {
- SpiceBitmap *bitmap = &image.u.bitmap;
-#ifdef DUMP_BITMAP
- dump_bitmap(&simage->u.bitmap);
-#endif
- /* Images must be added to the cache only after they are compressed
- in order to prevent starvation in the client between pixmap_cache and
- global dictionary (in cases of multiple monitors) */
- if (!red_compress_image(dcc, &image, &simage->u.bitmap,
- drawable, can_lossy, &comp_send_data)) {
- SpicePalette *palette;
-
- red_display_add_image_to_pixmap_cache(rcc, simage, &image, FALSE);
-
- *bitmap = simage->u.bitmap;
- bitmap->flags = bitmap->flags & SPICE_BITMAP_FLAGS_TOP_DOWN;
-
- palette = bitmap->palette;
- fill_palette(dcc, palette, &bitmap->flags);
- spice_marshall_Image(m, &image,
- &bitmap_palette_out, &lzplt_palette_out);
- spice_assert(lzplt_palette_out == NULL);
-
- if (bitmap_palette_out && palette) {
- spice_marshall_Palette(bitmap_palette_out, palette);
- }
-
- spice_marshaller_add_ref_chunks(m, bitmap->data);
- return FILL_BITS_TYPE_BITMAP;
- } else {
- red_display_add_image_to_pixmap_cache(rcc, simage, &image,
- comp_send_data.is_lossy);
-
- spice_marshall_Image(m, &image,
- &bitmap_palette_out, &lzplt_palette_out);
- spice_assert(bitmap_palette_out == NULL);
-
- marshaller_add_compressed(m, comp_send_data.comp_buf,
- comp_send_data.comp_buf_size);
-
- if (lzplt_palette_out && comp_send_data.lzplt_palette) {
- spice_marshall_Palette(lzplt_palette_out, comp_send_data.lzplt_palette);
- }
-
- spice_assert(!comp_send_data.is_lossy || can_lossy);
- return (comp_send_data.is_lossy ? FILL_BITS_TYPE_COMPRESS_LOSSY :
- FILL_BITS_TYPE_COMPRESS_LOSSLESS);
- }
- break;
- }
- case SPICE_IMAGE_TYPE_QUIC:
- red_display_add_image_to_pixmap_cache(rcc, simage, &image, FALSE);
- image.u.quic = simage->u.quic;
- spice_marshall_Image(m, &image,
- &bitmap_palette_out, &lzplt_palette_out);
- spice_assert(bitmap_palette_out == NULL);
- spice_assert(lzplt_palette_out == NULL);
- spice_marshaller_add_ref_chunks(m, image.u.quic.data);
- return FILL_BITS_TYPE_COMPRESS_LOSSLESS;
- default:
- spice_error("invalid image type %u", image.descriptor.type);
- }
-
- return 0;
-}
-
-static void fill_mask(RedChannelClient *rcc, SpiceMarshaller *m,
- SpiceImage *mask_bitmap, Drawable *drawable)
-{
- DisplayChannel *display_channel = SPICE_CONTAINEROF(rcc->channel, DisplayChannel, common.base);
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
-
- if (mask_bitmap && m) {
- if (display_channel->common.worker->image_compression != SPICE_IMAGE_COMPRESS_OFF) {
- spice_image_compression_t save_img_comp =
- display_channel->common.worker->image_compression;
- display_channel->common.worker->image_compression = SPICE_IMAGE_COMPRESS_OFF;
- fill_bits(dcc, m, mask_bitmap, drawable, FALSE);
- display_channel->common.worker->image_compression = save_img_comp;
- } else {
- fill_bits(dcc, m, mask_bitmap, drawable, FALSE);
- }
- }
-}
-
-static void fill_attr(SpiceMarshaller *m, SpiceLineAttr *attr, uint32_t group_id)
-{
- int i;
-
- if (m && attr->style_nseg) {
- for (i = 0 ; i < attr->style_nseg; i++) {
- spice_marshaller_add_uint32(m, attr->style[i]);
- }
- }
-}
-
-static void fill_cursor(CursorChannelClient *ccc, SpiceCursor *red_cursor,
- CursorItem *cursor, AddBufInfo *addbuf)
-{
- RedCursorCmd *cursor_cmd;
- addbuf->data = NULL;
-
- if (!cursor) {
- red_cursor->flags = SPICE_CURSOR_FLAGS_NONE;
- return;
- }
-
- cursor_cmd = cursor->red_cursor;
- *red_cursor = cursor_cmd->u.set.shape;
-
- if (red_cursor->header.unique) {
- if (red_cursor_cache_find(ccc, red_cursor->header.unique)) {
- red_cursor->flags |= SPICE_CURSOR_FLAGS_FROM_CACHE;
- return;
- }
- if (red_cursor_cache_add(ccc, red_cursor->header.unique, 1)) {
- red_cursor->flags |= SPICE_CURSOR_FLAGS_CACHE_ME;
- }
- }
-
- if (red_cursor->data_size) {
- addbuf->type = BUF_TYPE_RAW;
- addbuf->data = red_cursor->data;
- addbuf->size = red_cursor->data_size;
- }
-}
-
-static inline void red_display_reset_send_data(DisplayChannelClient *dcc)
-{
- red_display_reset_compress_buf(dcc);
- dcc->send_data.free_list.res->count = 0;
- dcc->send_data.num_pixmap_cache_items = 0;
- memset(dcc->send_data.free_list.sync, 0, sizeof(dcc->send_data.free_list.sync));
-}
-
-/* set area=NULL for testing the whole surface */
-static int is_surface_area_lossy(DisplayChannelClient *dcc, uint32_t surface_id,
- const SpiceRect *area, SpiceRect *out_lossy_area)
-{
- RedSurface *surface;
- QRegion *surface_lossy_region;
- QRegion lossy_region;
- RedWorker *worker = dcc->common.worker;
-
- VALIDATE_SURFACE_RETVAL(worker, surface_id, FALSE);
- surface = &worker->surfaces[surface_id];
- surface_lossy_region = &dcc->surface_client_lossy_region[surface_id];
-
- if (!area) {
- if (region_is_empty(surface_lossy_region)) {
- return FALSE;
- } else {
- out_lossy_area->top = 0;
- out_lossy_area->left = 0;
- out_lossy_area->bottom = surface->context.height;
- out_lossy_area->right = surface->context.width;
- return TRUE;
- }
- }
-
- region_init(&lossy_region);
- region_add(&lossy_region, area);
- region_and(&lossy_region, surface_lossy_region);
- if (!region_is_empty(&lossy_region)) {
- out_lossy_area->left = lossy_region.extents.x1;
- out_lossy_area->top = lossy_region.extents.y1;
- out_lossy_area->right = lossy_region.extents.x2;
- out_lossy_area->bottom = lossy_region.extents.y2;
- region_destroy(&lossy_region);
- return TRUE;
- } else {
- return FALSE;
- }
-}
-/* returns if the bitmap was already sent lossy to the client. If the bitmap hasn't been sent yet
- to the client, returns false. "area" is for surfaces. If area = NULL,
- all the surface is considered. out_lossy_data will hold info about the bitmap, and its lossy
- area in case it is lossy and part of a surface. */
-static int is_bitmap_lossy(RedChannelClient *rcc, SpiceImage *image, SpiceRect *area,
- Drawable *drawable, BitmapData *out_data)
-{
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
-
- if (image == NULL) {
- // self bitmap
- out_data->type = BITMAP_DATA_TYPE_BITMAP;
- return FALSE;
- }
-
- if ((image->descriptor.flags & SPICE_IMAGE_FLAGS_CACHE_ME)) {
- int is_hit_lossy;
-
- out_data->id = image->descriptor.id;
- if (pixmap_cache_hit(dcc->pixmap_cache, image->descriptor.id,
- &is_hit_lossy, dcc)) {
- out_data->type = BITMAP_DATA_TYPE_CACHE;
- if (is_hit_lossy) {
- return TRUE;
- } else {
- return FALSE;
- }
- } else {
- out_data->type = BITMAP_DATA_TYPE_BITMAP_TO_CACHE;
- }
- } else {
- out_data->type = BITMAP_DATA_TYPE_BITMAP;
- }
-
- if (image->descriptor.type != SPICE_IMAGE_TYPE_SURFACE) {
- return FALSE;
- }
-
- out_data->type = BITMAP_DATA_TYPE_SURFACE;
- out_data->id = image->u.surface.surface_id;
-
- if (is_surface_area_lossy(dcc, out_data->id,
- area, &out_data->lossy_rect))
- {
- return TRUE;
- } else {
- return FALSE;
- }
-}
-
-static int is_brush_lossy(RedChannelClient *rcc, SpiceBrush *brush,
- Drawable *drawable, BitmapData *out_data)
-{
- if (brush->type == SPICE_BRUSH_TYPE_PATTERN) {
- return is_bitmap_lossy(rcc, brush->u.pattern.pat, NULL,
- drawable, out_data);
- } else {
- out_data->type = BITMAP_DATA_TYPE_INVALID;
- return FALSE;
- }
-}
-
-static void surface_lossy_region_update(RedWorker *worker, DisplayChannelClient *dcc,
- Drawable *item, int has_mask, int lossy)
-{
- QRegion *surface_lossy_region;
- RedDrawable *drawable;
-
- if (has_mask && !lossy) {
- return;
- }
-
- surface_lossy_region = &dcc->surface_client_lossy_region[item->surface_id];
- drawable = item->red_drawable;
-
- if (drawable->clip.type == SPICE_CLIP_TYPE_RECTS ) {
- QRegion clip_rgn;
- QRegion draw_region;
- region_init(&clip_rgn);
- region_init(&draw_region);
- region_add(&draw_region, &drawable->bbox);
- add_clip_rects(&clip_rgn, drawable->clip.rects);
- region_and(&draw_region, &clip_rgn);
- if (lossy) {
- region_or(surface_lossy_region, &draw_region);
- } else {
- region_exclude(surface_lossy_region, &draw_region);
- }
-
- region_destroy(&clip_rgn);
- region_destroy(&draw_region);
- } else { /* no clip */
- if (!lossy) {
- region_remove(surface_lossy_region, &drawable->bbox);
- } else {
- region_add(surface_lossy_region, &drawable->bbox);
- }
- }
-}
-
-static inline int drawable_intersects_with_areas(Drawable *drawable, int surface_ids[],
- SpiceRect *surface_areas[],
- int num_surfaces)
-{
- int i;
- for (i = 0; i < num_surfaces; i++) {
- if (surface_ids[i] == drawable->red_drawable->surface_id) {
- if (rect_intersects(surface_areas[i], &drawable->red_drawable->bbox)) {
- return TRUE;
- }
- }
- }
- return FALSE;
-}
-
-static inline int drawable_depends_on_areas(Drawable *drawable,
- int surface_ids[],
- SpiceRect surface_areas[],
- int num_surfaces)
-{
- int i;
- RedDrawable *red_drawable;
- int drawable_has_shadow;
- SpiceRect shadow_rect = {0, 0, 0, 0};
-
- red_drawable = drawable->red_drawable;
- drawable_has_shadow = has_shadow(red_drawable);
-
- if (drawable_has_shadow) {
- int delta_x = red_drawable->u.copy_bits.src_pos.x - red_drawable->bbox.left;
- int delta_y = red_drawable->u.copy_bits.src_pos.y - red_drawable->bbox.top;
-
- shadow_rect.left = red_drawable->u.copy_bits.src_pos.x;
- shadow_rect.top = red_drawable->u.copy_bits.src_pos.y;
- shadow_rect.right = red_drawable->bbox.right + delta_x;
- shadow_rect.bottom = red_drawable->bbox.bottom + delta_y;
- }
-
- for (i = 0; i < num_surfaces; i++) {
- int x;
- int dep_surface_id;
-
- for (x = 0; x < 3; ++x) {
- dep_surface_id = drawable->surfaces_dest[x];
- if (dep_surface_id == surface_ids[i]) {
- if (rect_intersects(&surface_areas[i], &red_drawable->surfaces_rects[x])) {
- return TRUE;
- }
- }
- }
-
- if (surface_ids[i] == red_drawable->surface_id) {
- if (drawable_has_shadow) {
- if (rect_intersects(&surface_areas[i], &shadow_rect)) {
- return TRUE;
- }
- }
-
- // not dependent on dest
- if (red_drawable->effect == QXL_EFFECT_OPAQUE) {
- continue;
- }
-
- if (rect_intersects(&surface_areas[i], &red_drawable->bbox)) {
- return TRUE;
- }
- }
-
- }
- return FALSE;
-}
-
-
-static int pipe_rendered_drawables_intersect_with_areas(RedWorker *worker,
- DisplayChannelClient *dcc,
- int surface_ids[],
- SpiceRect *surface_areas[],
- int num_surfaces)
-{
- PipeItem *pipe_item;
- Ring *pipe;
-
- spice_assert(num_surfaces);
- pipe = &dcc->common.base.pipe;
-
- for (pipe_item = (PipeItem *)ring_get_head(pipe);
- pipe_item;
- pipe_item = (PipeItem *)ring_next(pipe, &pipe_item->link))
- {
- Drawable *drawable;
-
- if (pipe_item->type != PIPE_ITEM_TYPE_DRAW)
- continue;
- drawable = SPICE_CONTAINEROF(pipe_item, DrawablePipeItem, dpi_pipe_item)->drawable;
-
- if (ring_item_is_linked(&drawable->list_link))
- continue; // item hasn't been rendered
-
- if (drawable_intersects_with_areas(drawable, surface_ids, surface_areas, num_surfaces)) {
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-static void red_pipe_replace_rendered_drawables_with_images(RedWorker *worker,
- DisplayChannelClient *dcc,
- int first_surface_id,
- SpiceRect *first_area)
-{
- /* TODO: can't have those statics with multiple clients */
- static int resent_surface_ids[MAX_PIPE_SIZE];
- static SpiceRect resent_areas[MAX_PIPE_SIZE]; // not pointers since drawbales may be released
- int num_resent;
- PipeItem *pipe_item;
- Ring *pipe;
-
- resent_surface_ids[0] = first_surface_id;
- resent_areas[0] = *first_area;
- num_resent = 1;
-
- pipe = &dcc->common.base.pipe;
-
- // going from the oldest to the newest
- for (pipe_item = (PipeItem *)ring_get_tail(pipe);
- pipe_item;
- pipe_item = (PipeItem *)ring_prev(pipe, &pipe_item->link)) {
- Drawable *drawable;
- DrawablePipeItem *dpi;
- ImageItem *image;
-
- if (pipe_item->type != PIPE_ITEM_TYPE_DRAW)
- continue;
- dpi = SPICE_CONTAINEROF(pipe_item, DrawablePipeItem, dpi_pipe_item);
- drawable = dpi->drawable;
- if (ring_item_is_linked(&drawable->list_link))
- continue; // item hasn't been rendered
-
- // When a drawable command, X, depends on bitmaps that were resent,
- // these bitmaps state at the client might not be synchronized with X
- // (i.e., the bitmaps can be more futuristic w.r.t X). Thus, X shouldn't
- // be rendered at the client, and we replace it with an image as well.
- if (!drawable_depends_on_areas(drawable,
- resent_surface_ids,
- resent_areas,
- num_resent)) {
- continue;
- }
-
- image = red_add_surface_area_image(dcc, drawable->red_drawable->surface_id,
- &drawable->red_drawable->bbox, pipe_item, TRUE);
- resent_surface_ids[num_resent] = drawable->red_drawable->surface_id;
- resent_areas[num_resent] = drawable->red_drawable->bbox;
- num_resent++;
-
- spice_assert(image);
- red_channel_client_pipe_remove_and_release(&dcc->common.base, &dpi->dpi_pipe_item);
- pipe_item = &image->link;
- }
-}
-
-static void red_add_lossless_drawable_dependencies(RedWorker *worker,
- RedChannelClient *rcc,
- Drawable *item,
- int deps_surfaces_ids[],
- SpiceRect *deps_areas[],
- int num_deps)
-{
- RedDrawable *drawable = item->red_drawable;
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
- int sync_rendered = FALSE;
- int i;
-
- if (!ring_item_is_linked(&item->list_link)) {
- /* drawable was already rendered, we may not be able to retrieve the lossless data
- for the lossy areas */
- sync_rendered = TRUE;
-
- // checking if the drawable itself or one of the other commands
- // that were rendered, affected the areas that need to be resent
- if (!drawable_intersects_with_areas(item, deps_surfaces_ids,
- deps_areas, num_deps)) {
- if (pipe_rendered_drawables_intersect_with_areas(worker, dcc,
- deps_surfaces_ids,
- deps_areas,
- num_deps)) {
- sync_rendered = TRUE;
- }
- } else {
- sync_rendered = TRUE;
- }
- } else {
- sync_rendered = FALSE;
- for (i = 0; i < num_deps; i++) {
- red_update_area_till(worker, deps_areas[i],
- deps_surfaces_ids[i], item);
- }
- }
-
- if (!sync_rendered) {
- // pushing the pipe item back to the pipe
- red_pipe_add_drawable_to_tail(dcc, item);
- // the surfaces areas will be sent as DRAW_COPY commands, that
- // will be executed before the current drawable
- for (i = 0; i < num_deps; i++) {
- red_add_surface_area_image(dcc, deps_surfaces_ids[i], deps_areas[i],
- red_pipe_get_tail(dcc), FALSE);
-
- }
- } else {
- int drawable_surface_id[1];
- SpiceRect *drawable_bbox[1];
-
- drawable_surface_id[0] = drawable->surface_id;
- drawable_bbox[0] = &drawable->bbox;
-
- // check if the other rendered images in the pipe have updated the drawable bbox
- if (pipe_rendered_drawables_intersect_with_areas(worker, dcc,
- drawable_surface_id,
- drawable_bbox,
- 1)) {
- red_pipe_replace_rendered_drawables_with_images(worker, dcc,
- drawable->surface_id,
- &drawable->bbox);
- }
-
- red_add_surface_area_image(dcc, drawable->surface_id, &drawable->bbox,
- red_pipe_get_tail(dcc), TRUE);
- }
-}
-
-static void red_marshall_qxl_draw_fill(RedWorker *worker,
- RedChannelClient *rcc,
- SpiceMarshaller *base_marshaller,
- DrawablePipeItem *dpi)
-{
- Drawable *item = dpi->drawable;
- RedDrawable *drawable = item->red_drawable;
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
- SpiceMarshaller *brush_pat_out;
- SpiceMarshaller *mask_bitmap_out;
- SpiceFill fill;
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_DISPLAY_DRAW_FILL, &dpi->dpi_pipe_item);
- fill_base(base_marshaller, item);
- fill = drawable->u.fill;
- spice_marshall_Fill(base_marshaller,
- &fill,
- &brush_pat_out,
- &mask_bitmap_out);
-
- if (brush_pat_out) {
- fill_bits(dcc, brush_pat_out, fill.brush.u.pattern.pat, item, FALSE);
- }
-
- fill_mask(rcc, mask_bitmap_out, fill.mask.bitmap, item);
-}
-
-
-static void red_lossy_marshall_qxl_draw_fill(RedWorker *worker,
- RedChannelClient *rcc,
- SpiceMarshaller *m,
- DrawablePipeItem *dpi)
-{
- Drawable *item = dpi->drawable;
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
- RedDrawable *drawable = item->red_drawable;
-
- int dest_allowed_lossy = FALSE;
- int dest_is_lossy = FALSE;
- SpiceRect dest_lossy_area;
- int brush_is_lossy;
- BitmapData brush_bitmap_data;
- uint16_t rop;
-
- rop = drawable->u.fill.rop_descriptor;
-
- dest_allowed_lossy = !((rop & SPICE_ROPD_OP_OR) ||
- (rop & SPICE_ROPD_OP_AND) ||
- (rop & SPICE_ROPD_OP_XOR));
-
- brush_is_lossy = is_brush_lossy(rcc, &drawable->u.fill.brush, item,
- &brush_bitmap_data);
- if (!dest_allowed_lossy) {
- dest_is_lossy = is_surface_area_lossy(dcc, item->surface_id, &drawable->bbox,
- &dest_lossy_area);
- }
-
- if (!dest_is_lossy &&
- !(brush_is_lossy && (brush_bitmap_data.type == BITMAP_DATA_TYPE_SURFACE))) {
- int has_mask = !!drawable->u.fill.mask.bitmap;
-
- red_marshall_qxl_draw_fill(worker, rcc, m, dpi);
- // either the brush operation is opaque, or the dest is not lossy
- surface_lossy_region_update(worker, dcc, item, has_mask, FALSE);
- } else {
- int resend_surface_ids[2];
- SpiceRect *resend_areas[2];
- int num_resend = 0;
-
- if (dest_is_lossy) {
- resend_surface_ids[num_resend] = item->surface_id;
- resend_areas[num_resend] = &dest_lossy_area;
- num_resend++;
- }
-
- if (brush_is_lossy && (brush_bitmap_data.type == BITMAP_DATA_TYPE_SURFACE)) {
- resend_surface_ids[num_resend] = brush_bitmap_data.id;
- resend_areas[num_resend] = &brush_bitmap_data.lossy_rect;
- num_resend++;
- }
-
- red_add_lossless_drawable_dependencies(worker, rcc, item,
- resend_surface_ids, resend_areas, num_resend);
- }
-}
-
-static FillBitsType red_marshall_qxl_draw_opaque(RedWorker *worker,
- RedChannelClient *rcc,
- SpiceMarshaller *base_marshaller,
- DrawablePipeItem *dpi, int src_allowed_lossy)
-{
- Drawable *item = dpi->drawable;
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
- RedDrawable *drawable = item->red_drawable;
- SpiceMarshaller *brush_pat_out;
- SpiceMarshaller *src_bitmap_out;
- SpiceMarshaller *mask_bitmap_out;
- SpiceOpaque opaque;
- FillBitsType src_send_type;
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_DISPLAY_DRAW_OPAQUE, &dpi->dpi_pipe_item);
- fill_base(base_marshaller, item);
- opaque = drawable->u.opaque;
- spice_marshall_Opaque(base_marshaller,
- &opaque,
- &src_bitmap_out,
- &brush_pat_out,
- &mask_bitmap_out);
-
- src_send_type = fill_bits(dcc, src_bitmap_out, opaque.src_bitmap, item,
- src_allowed_lossy);
-
- if (brush_pat_out) {
- fill_bits(dcc, brush_pat_out, opaque.brush.u.pattern.pat, item, FALSE);
- }
- fill_mask(rcc, mask_bitmap_out, opaque.mask.bitmap, item);
-
- return src_send_type;
-}
-
-static void red_lossy_marshall_qxl_draw_opaque(RedWorker *worker,
- RedChannelClient *rcc,
- SpiceMarshaller *m,
- DrawablePipeItem *dpi)
-{
- Drawable *item = dpi->drawable;
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
- RedDrawable *drawable = item->red_drawable;
-
- int src_allowed_lossy;
- int rop;
- int src_is_lossy = FALSE;
- int brush_is_lossy = FALSE;
- BitmapData src_bitmap_data;
- BitmapData brush_bitmap_data;
-
- rop = drawable->u.opaque.rop_descriptor;
- src_allowed_lossy = !((rop & SPICE_ROPD_OP_OR) ||
- (rop & SPICE_ROPD_OP_AND) ||
- (rop & SPICE_ROPD_OP_XOR));
-
- brush_is_lossy = is_brush_lossy(rcc, &drawable->u.opaque.brush, item,
- &brush_bitmap_data);
-
- if (!src_allowed_lossy) {
- src_is_lossy = is_bitmap_lossy(rcc, drawable->u.opaque.src_bitmap,
- &drawable->u.opaque.src_area,
- item,
- &src_bitmap_data);
- }
-
- if (!(brush_is_lossy && (brush_bitmap_data.type == BITMAP_DATA_TYPE_SURFACE)) &&
- !(src_is_lossy && (src_bitmap_data.type == BITMAP_DATA_TYPE_SURFACE))) {
- FillBitsType src_send_type;
- int has_mask = !!drawable->u.opaque.mask.bitmap;
-
- src_send_type = red_marshall_qxl_draw_opaque(worker, rcc, m, dpi, src_allowed_lossy);
- if (src_send_type == FILL_BITS_TYPE_COMPRESS_LOSSY) {
- src_is_lossy = TRUE;
- } else if (src_send_type == FILL_BITS_TYPE_COMPRESS_LOSSLESS) {
- src_is_lossy = FALSE;
- }
-
- surface_lossy_region_update(worker, dcc, item, has_mask, src_is_lossy);
- } else {
- int resend_surface_ids[2];
- SpiceRect *resend_areas[2];
- int num_resend = 0;
-
- if (src_is_lossy && (src_bitmap_data.type == BITMAP_DATA_TYPE_SURFACE)) {
- resend_surface_ids[num_resend] = src_bitmap_data.id;
- resend_areas[num_resend] = &src_bitmap_data.lossy_rect;
- num_resend++;
- }
-
- if (brush_is_lossy && (brush_bitmap_data.type == BITMAP_DATA_TYPE_SURFACE)) {
- resend_surface_ids[num_resend] = brush_bitmap_data.id;
- resend_areas[num_resend] = &brush_bitmap_data.lossy_rect;
- num_resend++;
- }
-
- red_add_lossless_drawable_dependencies(worker, rcc, item,
- resend_surface_ids, resend_areas, num_resend);
- }
-}
-
-static FillBitsType red_marshall_qxl_draw_copy(RedWorker *worker,
- RedChannelClient *rcc,
- SpiceMarshaller *base_marshaller,
- DrawablePipeItem *dpi, int src_allowed_lossy)
-{
- Drawable *item = dpi->drawable;
- RedDrawable *drawable = item->red_drawable;
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
- SpiceMarshaller *src_bitmap_out;
- SpiceMarshaller *mask_bitmap_out;
- SpiceCopy copy;
- FillBitsType src_send_type;
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_DISPLAY_DRAW_COPY, &dpi->dpi_pipe_item);
- fill_base(base_marshaller, item);
- copy = drawable->u.copy;
- spice_marshall_Copy(base_marshaller,
- &copy,
- &src_bitmap_out,
- &mask_bitmap_out);
-
- src_send_type = fill_bits(dcc, src_bitmap_out, copy.src_bitmap, item, src_allowed_lossy);
- fill_mask(rcc, mask_bitmap_out, copy.mask.bitmap, item);
-
- return src_send_type;
-}
-
-static void red_lossy_marshall_qxl_draw_copy(RedWorker *worker,
- RedChannelClient *rcc,
- SpiceMarshaller *base_marshaller,
- DrawablePipeItem *dpi)
-{
- Drawable *item = dpi->drawable;
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
- RedDrawable *drawable = item->red_drawable;
- int has_mask = !!drawable->u.copy.mask.bitmap;
- int src_is_lossy;
- BitmapData src_bitmap_data;
- FillBitsType src_send_type;
-
- src_is_lossy = is_bitmap_lossy(rcc, drawable->u.copy.src_bitmap,
- &drawable->u.copy.src_area, item, &src_bitmap_data);
-
- src_send_type = red_marshall_qxl_draw_copy(worker, rcc, base_marshaller, dpi, TRUE);
- if (src_send_type == FILL_BITS_TYPE_COMPRESS_LOSSY) {
- src_is_lossy = TRUE;
- } else if (src_send_type == FILL_BITS_TYPE_COMPRESS_LOSSLESS) {
- src_is_lossy = FALSE;
- }
- surface_lossy_region_update(worker, dcc, item, has_mask,
- src_is_lossy);
-}
-
-static void red_marshall_qxl_draw_transparent(RedWorker *worker,
- RedChannelClient *rcc,
- SpiceMarshaller *base_marshaller,
- DrawablePipeItem *dpi)
-{
- Drawable *item = dpi->drawable;
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
- RedDrawable *drawable = item->red_drawable;
- SpiceMarshaller *src_bitmap_out;
- SpiceTransparent transparent;
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_DISPLAY_DRAW_TRANSPARENT,
- &dpi->dpi_pipe_item);
- fill_base(base_marshaller, item);
- transparent = drawable->u.transparent;
- spice_marshall_Transparent(base_marshaller,
- &transparent,
- &src_bitmap_out);
- fill_bits(dcc, src_bitmap_out, transparent.src_bitmap, item, FALSE);
-}
-
-static void red_lossy_marshall_qxl_draw_transparent(RedWorker *worker,
- RedChannelClient *rcc,
- SpiceMarshaller *base_marshaller,
- DrawablePipeItem *dpi)
-{
- Drawable *item = dpi->drawable;
- RedDrawable *drawable = item->red_drawable;
- int src_is_lossy;
- BitmapData src_bitmap_data;
-
- src_is_lossy = is_bitmap_lossy(rcc, drawable->u.transparent.src_bitmap,
- &drawable->u.transparent.src_area, item, &src_bitmap_data);
-
- if (!src_is_lossy || (src_bitmap_data.type != BITMAP_DATA_TYPE_SURFACE)) {
- red_marshall_qxl_draw_transparent(worker, rcc, base_marshaller, dpi);
- // don't update surface lossy region since transperent areas might be lossy
- } else {
- int resend_surface_ids[1];
- SpiceRect *resend_areas[1];
-
- resend_surface_ids[0] = src_bitmap_data.id;
- resend_areas[0] = &src_bitmap_data.lossy_rect;
-
- red_add_lossless_drawable_dependencies(worker, rcc, item,
- resend_surface_ids, resend_areas, 1);
- }
-}
-
-static FillBitsType red_marshall_qxl_draw_alpha_blend(RedWorker *worker,
- RedChannelClient *rcc,
- SpiceMarshaller *base_marshaller,
- DrawablePipeItem *dpi,
- int src_allowed_lossy)
-{
- Drawable *item = dpi->drawable;
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
- RedDrawable *drawable = item->red_drawable;
- SpiceMarshaller *src_bitmap_out;
- SpiceAlphaBlend alpha_blend;
- FillBitsType src_send_type;
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_DISPLAY_DRAW_ALPHA_BLEND,
- &dpi->dpi_pipe_item);
- fill_base(base_marshaller, item);
- alpha_blend = drawable->u.alpha_blend;
- spice_marshall_AlphaBlend(base_marshaller,
- &alpha_blend,
- &src_bitmap_out);
- src_send_type = fill_bits(dcc, src_bitmap_out, alpha_blend.src_bitmap, item,
- src_allowed_lossy);
-
- return src_send_type;
-}
-
-static void red_lossy_marshall_qxl_draw_alpha_blend(RedWorker *worker,
- RedChannelClient *rcc,
- SpiceMarshaller *base_marshaller,
- DrawablePipeItem *dpi)
-{
- Drawable *item = dpi->drawable;
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
- RedDrawable *drawable = item->red_drawable;
- int src_is_lossy;
- BitmapData src_bitmap_data;
- FillBitsType src_send_type;
-
- src_is_lossy = is_bitmap_lossy(rcc, drawable->u.alpha_blend.src_bitmap,
- &drawable->u.alpha_blend.src_area, item, &src_bitmap_data);
-
- src_send_type = red_marshall_qxl_draw_alpha_blend(worker, rcc, base_marshaller, dpi, TRUE);
-
- if (src_send_type == FILL_BITS_TYPE_COMPRESS_LOSSY) {
- src_is_lossy = TRUE;
- } else if (src_send_type == FILL_BITS_TYPE_COMPRESS_LOSSLESS) {
- src_is_lossy = FALSE;
- }
-
- if (src_is_lossy) {
- surface_lossy_region_update(worker, dcc, item, FALSE, src_is_lossy);
- } // else, the area stays lossy/lossless as the destination
-}
-
-static void red_marshall_qxl_copy_bits(RedWorker *worker,
- RedChannelClient *rcc,
- SpiceMarshaller *base_marshaller,
- DrawablePipeItem *dpi)
-{
- Drawable *item = dpi->drawable;
- RedDrawable *drawable = item->red_drawable;
- SpicePoint copy_bits;
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_DISPLAY_COPY_BITS, &dpi->dpi_pipe_item);
- fill_base(base_marshaller, item);
- copy_bits = drawable->u.copy_bits.src_pos;
- spice_marshall_Point(base_marshaller,
- &copy_bits);
-}
-
-static void red_lossy_marshall_qxl_copy_bits(RedWorker *worker,
- RedChannelClient *rcc,
- SpiceMarshaller *base_marshaller,
- DrawablePipeItem *dpi)
-{
- Drawable *item = dpi->drawable;
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
- RedDrawable *drawable = item->red_drawable;
- SpiceRect src_rect;
- int horz_offset;
- int vert_offset;
- int src_is_lossy;
- SpiceRect src_lossy_area;
-
- red_marshall_qxl_copy_bits(worker, rcc, base_marshaller, dpi);
-
- horz_offset = drawable->u.copy_bits.src_pos.x - drawable->bbox.left;
- vert_offset = drawable->u.copy_bits.src_pos.y - drawable->bbox.top;
-
- src_rect.left = drawable->u.copy_bits.src_pos.x;
- src_rect.top = drawable->u.copy_bits.src_pos.y;
- src_rect.right = drawable->bbox.right + horz_offset;
- src_rect.bottom = drawable->bbox.bottom + vert_offset;
-
- src_is_lossy = is_surface_area_lossy(dcc, item->surface_id,
- &src_rect, &src_lossy_area);
-
- surface_lossy_region_update(worker, dcc, item, FALSE,
- src_is_lossy);
-}
-
-static void red_marshall_qxl_draw_blend(RedWorker *worker,
- RedChannelClient *rcc,
- SpiceMarshaller *base_marshaller,
- DrawablePipeItem *dpi)
-{
- Drawable *item = dpi->drawable;
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
- RedDrawable *drawable = item->red_drawable;
- SpiceMarshaller *src_bitmap_out;
- SpiceMarshaller *mask_bitmap_out;
- SpiceBlend blend;
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_DISPLAY_DRAW_BLEND, &dpi->dpi_pipe_item);
- fill_base(base_marshaller, item);
- blend = drawable->u.blend;
- spice_marshall_Blend(base_marshaller,
- &blend,
- &src_bitmap_out,
- &mask_bitmap_out);
-
- fill_bits(dcc, src_bitmap_out, blend.src_bitmap, item, FALSE);
-
- fill_mask(rcc, mask_bitmap_out, blend.mask.bitmap, item);
-}
-
-static void red_lossy_marshall_qxl_draw_blend(RedWorker *worker,
- RedChannelClient *rcc,
- SpiceMarshaller *base_marshaller,
- DrawablePipeItem *dpi)
-{
- Drawable *item = dpi->drawable;
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
- RedDrawable *drawable = item->red_drawable;
- int src_is_lossy;
- BitmapData src_bitmap_data;
- int dest_is_lossy;
- SpiceRect dest_lossy_area;
-
- src_is_lossy = is_bitmap_lossy(rcc, drawable->u.blend.src_bitmap,
- &drawable->u.blend.src_area, item, &src_bitmap_data);
- dest_is_lossy = is_surface_area_lossy(dcc, drawable->surface_id,
- &drawable->bbox, &dest_lossy_area);
-
- if (!dest_is_lossy &&
- (!src_is_lossy || (src_bitmap_data.type != BITMAP_DATA_TYPE_SURFACE))) {
- red_marshall_qxl_draw_blend(worker, rcc, base_marshaller, dpi);
- } else {
- int resend_surface_ids[2];
- SpiceRect *resend_areas[2];
- int num_resend = 0;
-
- if (src_is_lossy && (src_bitmap_data.type == BITMAP_DATA_TYPE_SURFACE)) {
- resend_surface_ids[num_resend] = src_bitmap_data.id;
- resend_areas[num_resend] = &src_bitmap_data.lossy_rect;
- num_resend++;
- }
-
- if (dest_is_lossy) {
- resend_surface_ids[num_resend] = item->surface_id;
- resend_areas[num_resend] = &dest_lossy_area;
- num_resend++;
- }
-
- red_add_lossless_drawable_dependencies(worker, rcc, item,
- resend_surface_ids, resend_areas, num_resend);
- }
-}
-
-static void red_marshall_qxl_draw_blackness(RedWorker *worker,
- RedChannelClient *rcc,
- SpiceMarshaller *base_marshaller,
- DrawablePipeItem *dpi)
-{
- Drawable *item = dpi->drawable;
- RedDrawable *drawable = item->red_drawable;
- SpiceMarshaller *mask_bitmap_out;
- SpiceBlackness blackness;
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_DISPLAY_DRAW_BLACKNESS, &dpi->dpi_pipe_item);
- fill_base(base_marshaller, item);
- blackness = drawable->u.blackness;
-
- spice_marshall_Blackness(base_marshaller,
- &blackness,
- &mask_bitmap_out);
-
- fill_mask(rcc, mask_bitmap_out, blackness.mask.bitmap, item);
-}
-
-static void red_lossy_marshall_qxl_draw_blackness(RedWorker *worker,
- RedChannelClient *rcc,
- SpiceMarshaller *base_marshaller,
- DrawablePipeItem *dpi)
-{
- Drawable *item = dpi->drawable;
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
- RedDrawable *drawable = item->red_drawable;
- int has_mask = !!drawable->u.blackness.mask.bitmap;
-
- red_marshall_qxl_draw_blackness(worker, rcc, base_marshaller, dpi);
-
- surface_lossy_region_update(worker, dcc, item, has_mask, FALSE);
-}
-
-static void red_marshall_qxl_draw_whiteness(RedWorker *worker,
- RedChannelClient *rcc,
- SpiceMarshaller *base_marshaller,
- DrawablePipeItem *dpi)
-{
- Drawable *item = dpi->drawable;
- RedDrawable *drawable = item->red_drawable;
- SpiceMarshaller *mask_bitmap_out;
- SpiceWhiteness whiteness;
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_DISPLAY_DRAW_WHITENESS, &dpi->dpi_pipe_item);
- fill_base(base_marshaller, item);
- whiteness = drawable->u.whiteness;
-
- spice_marshall_Whiteness(base_marshaller,
- &whiteness,
- &mask_bitmap_out);
-
- fill_mask(rcc, mask_bitmap_out, whiteness.mask.bitmap, item);
-}
-
-static void red_lossy_marshall_qxl_draw_whiteness(RedWorker *worker,
- RedChannelClient *rcc,
- SpiceMarshaller *base_marshaller,
- DrawablePipeItem *dpi)
-{
- Drawable *item = dpi->drawable;
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
- RedDrawable *drawable = item->red_drawable;
- int has_mask = !!drawable->u.whiteness.mask.bitmap;
-
- red_marshall_qxl_draw_whiteness(worker, rcc, base_marshaller, dpi);
-
- surface_lossy_region_update(worker, dcc, item, has_mask, FALSE);
-}
-
-static void red_marshall_qxl_draw_inverse(RedWorker *worker,
- RedChannelClient *rcc,
- SpiceMarshaller *base_marshaller,
- Drawable *item)
-{
- RedDrawable *drawable = item->red_drawable;
- SpiceMarshaller *mask_bitmap_out;
- SpiceInvers inverse;
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_DISPLAY_DRAW_INVERS, NULL);
- fill_base(base_marshaller, item);
- inverse = drawable->u.invers;
-
- spice_marshall_Invers(base_marshaller,
- &inverse,
- &mask_bitmap_out);
-
- fill_mask(rcc, mask_bitmap_out, inverse.mask.bitmap, item);
-}
-
-static void red_lossy_marshall_qxl_draw_inverse(RedWorker *worker,
- RedChannelClient *rcc,
- SpiceMarshaller *base_marshaller,
- Drawable *item)
-{
- red_marshall_qxl_draw_inverse(worker, rcc, base_marshaller, item);
-}
-
-static void red_marshall_qxl_draw_rop3(RedWorker *worker,
- RedChannelClient *rcc,
- SpiceMarshaller *base_marshaller,
- DrawablePipeItem *dpi)
-{
- Drawable *item = dpi->drawable;
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
- RedDrawable *drawable = item->red_drawable;
- SpiceRop3 rop3;
- SpiceMarshaller *src_bitmap_out;
- SpiceMarshaller *brush_pat_out;
- SpiceMarshaller *mask_bitmap_out;
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_DISPLAY_DRAW_ROP3, &dpi->dpi_pipe_item);
- fill_base(base_marshaller, item);
- rop3 = drawable->u.rop3;
- spice_marshall_Rop3(base_marshaller,
- &rop3,
- &src_bitmap_out,
- &brush_pat_out,
- &mask_bitmap_out);
-
- fill_bits(dcc, src_bitmap_out, rop3.src_bitmap, item, FALSE);
-
- if (brush_pat_out) {
- fill_bits(dcc, brush_pat_out, rop3.brush.u.pattern.pat, item, FALSE);
- }
- fill_mask(rcc, mask_bitmap_out, rop3.mask.bitmap, item);
-}
-
-static void red_lossy_marshall_qxl_draw_rop3(RedWorker *worker,
- RedChannelClient *rcc,
- SpiceMarshaller *base_marshaller,
- DrawablePipeItem *dpi)
-{
- Drawable *item = dpi->drawable;
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
- RedDrawable *drawable = item->red_drawable;
- int src_is_lossy;
- BitmapData src_bitmap_data;
- int brush_is_lossy;
- BitmapData brush_bitmap_data;
- int dest_is_lossy;
- SpiceRect dest_lossy_area;
-
- src_is_lossy = is_bitmap_lossy(rcc, drawable->u.rop3.src_bitmap,
- &drawable->u.rop3.src_area, item, &src_bitmap_data);
- brush_is_lossy = is_brush_lossy(rcc, &drawable->u.rop3.brush, item,
- &brush_bitmap_data);
- dest_is_lossy = is_surface_area_lossy(dcc, drawable->surface_id,
- &drawable->bbox, &dest_lossy_area);
-
- if ((!src_is_lossy || (src_bitmap_data.type != BITMAP_DATA_TYPE_SURFACE)) &&
- (!brush_is_lossy || (brush_bitmap_data.type != BITMAP_DATA_TYPE_SURFACE)) &&
- !dest_is_lossy) {
- int has_mask = !!drawable->u.rop3.mask.bitmap;
- red_marshall_qxl_draw_rop3(worker, rcc, base_marshaller, dpi);
- surface_lossy_region_update(worker, dcc, item, has_mask, FALSE);
- } else {
- int resend_surface_ids[3];
- SpiceRect *resend_areas[3];
- int num_resend = 0;
-
- if (src_is_lossy && (src_bitmap_data.type == BITMAP_DATA_TYPE_SURFACE)) {
- resend_surface_ids[num_resend] = src_bitmap_data.id;
- resend_areas[num_resend] = &src_bitmap_data.lossy_rect;
- num_resend++;
- }
-
- if (brush_is_lossy && (brush_bitmap_data.type == BITMAP_DATA_TYPE_SURFACE)) {
- resend_surface_ids[num_resend] = brush_bitmap_data.id;
- resend_areas[num_resend] = &brush_bitmap_data.lossy_rect;
- num_resend++;
- }
-
- if (dest_is_lossy) {
- resend_surface_ids[num_resend] = item->surface_id;
- resend_areas[num_resend] = &dest_lossy_area;
- num_resend++;
- }
-
- red_add_lossless_drawable_dependencies(worker, rcc, item,
- resend_surface_ids, resend_areas, num_resend);
- }
-}
-
-static void red_marshall_qxl_draw_composite(RedWorker *worker,
- RedChannelClient *rcc,
- SpiceMarshaller *base_marshaller,
- DrawablePipeItem *dpi)
-{
- Drawable *item = dpi->drawable;
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
- RedDrawable *drawable = item->red_drawable;
- SpiceMarshaller *src_bitmap_out;
- SpiceMarshaller *mask_bitmap_out;
- SpiceComposite composite;
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_DISPLAY_DRAW_COMPOSITE, &dpi->dpi_pipe_item);
- fill_base(base_marshaller, item);
- composite = drawable->u.composite;
- spice_marshall_Composite(base_marshaller,
- &composite,
- &src_bitmap_out,
- &mask_bitmap_out);
-
- fill_bits(dcc, src_bitmap_out, composite.src_bitmap, item, FALSE);
- if (mask_bitmap_out) {
- fill_bits(dcc, mask_bitmap_out, composite.mask_bitmap, item, FALSE);
- }
-}
-
-static void red_lossy_marshall_qxl_draw_composite(RedWorker *worker,
- RedChannelClient *rcc,
- SpiceMarshaller *base_marshaller,
- DrawablePipeItem *dpi)
-{
- Drawable *item = dpi->drawable;
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
- RedDrawable *drawable = item->red_drawable;
- int src_is_lossy;
- BitmapData src_bitmap_data;
- int mask_is_lossy;
- BitmapData mask_bitmap_data;
- int dest_is_lossy;
- SpiceRect dest_lossy_area;
-
- src_is_lossy = is_bitmap_lossy(rcc, drawable->u.composite.src_bitmap,
- NULL, item, &src_bitmap_data);
- mask_is_lossy = drawable->u.composite.mask_bitmap &&
- is_bitmap_lossy(rcc, drawable->u.composite.mask_bitmap, NULL, item, &mask_bitmap_data);
-
- dest_is_lossy = is_surface_area_lossy(dcc, drawable->surface_id,
- &drawable->bbox, &dest_lossy_area);
-
- if ((!src_is_lossy || (src_bitmap_data.type != BITMAP_DATA_TYPE_SURFACE)) &&
- (!mask_is_lossy || (mask_bitmap_data.type != BITMAP_DATA_TYPE_SURFACE)) &&
- !dest_is_lossy) {
- red_marshall_qxl_draw_composite(worker, rcc, base_marshaller, dpi);
- surface_lossy_region_update(worker, dcc, item, FALSE, FALSE);
- }
- else {
- int resend_surface_ids[3];
- SpiceRect *resend_areas[3];
- int num_resend = 0;
-
- if (src_is_lossy && (src_bitmap_data.type == BITMAP_DATA_TYPE_SURFACE)) {
- resend_surface_ids[num_resend] = src_bitmap_data.id;
- resend_areas[num_resend] = &src_bitmap_data.lossy_rect;
- num_resend++;
- }
-
- if (mask_is_lossy && (mask_bitmap_data.type == BITMAP_DATA_TYPE_SURFACE)) {
- resend_surface_ids[num_resend] = mask_bitmap_data.id;
- resend_areas[num_resend] = &mask_bitmap_data.lossy_rect;
- num_resend++;
- }
-
- if (dest_is_lossy) {
- resend_surface_ids[num_resend] = item->surface_id;
- resend_areas[num_resend] = &dest_lossy_area;
- num_resend++;
- }
-
- red_add_lossless_drawable_dependencies(worker, rcc, item,
- resend_surface_ids, resend_areas, num_resend);
- }
-}
-
-static void red_marshall_qxl_draw_stroke(RedWorker *worker,
- RedChannelClient *rcc,
- SpiceMarshaller *base_marshaller,
- DrawablePipeItem *dpi)
-{
- Drawable *item = dpi->drawable;
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
- RedDrawable *drawable = item->red_drawable;
- SpiceStroke stroke;
- SpiceMarshaller *brush_pat_out;
- SpiceMarshaller *style_out;
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_DISPLAY_DRAW_STROKE, &dpi->dpi_pipe_item);
- fill_base(base_marshaller, item);
- stroke = drawable->u.stroke;
- spice_marshall_Stroke(base_marshaller,
- &stroke,
- &style_out,
- &brush_pat_out);
-
- fill_attr(style_out, &stroke.attr, item->group_id);
- if (brush_pat_out) {
- fill_bits(dcc, brush_pat_out, stroke.brush.u.pattern.pat, item, FALSE);
- }
-}
-
-static void red_lossy_marshall_qxl_draw_stroke(RedWorker *worker,
- RedChannelClient *rcc,
- SpiceMarshaller *base_marshaller,
- DrawablePipeItem *dpi)
-{
- Drawable *item = dpi->drawable;
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
- RedDrawable *drawable = item->red_drawable;
- int brush_is_lossy;
- BitmapData brush_bitmap_data;
- int dest_is_lossy = FALSE;
- SpiceRect dest_lossy_area;
- int rop;
-
- brush_is_lossy = is_brush_lossy(rcc, &drawable->u.stroke.brush, item,
- &brush_bitmap_data);
-
- // back_mode is not used at the client. Ignoring.
- rop = drawable->u.stroke.fore_mode;
-
- // assuming that if the brush type is solid, the destination can
- // be lossy, no matter what the rop is.
- if (drawable->u.stroke.brush.type != SPICE_BRUSH_TYPE_SOLID &&
- ((rop & SPICE_ROPD_OP_OR) || (rop & SPICE_ROPD_OP_AND) ||
- (rop & SPICE_ROPD_OP_XOR))) {
- dest_is_lossy = is_surface_area_lossy(dcc, drawable->surface_id,
- &drawable->bbox, &dest_lossy_area);
- }
-
- if (!dest_is_lossy &&
- (!brush_is_lossy || (brush_bitmap_data.type != BITMAP_DATA_TYPE_SURFACE)))
- {
- red_marshall_qxl_draw_stroke(worker, rcc, base_marshaller, dpi);
- } else {
- int resend_surface_ids[2];
- SpiceRect *resend_areas[2];
- int num_resend = 0;
-
- if (brush_is_lossy && (brush_bitmap_data.type == BITMAP_DATA_TYPE_SURFACE)) {
- resend_surface_ids[num_resend] = brush_bitmap_data.id;
- resend_areas[num_resend] = &brush_bitmap_data.lossy_rect;
- num_resend++;
- }
-
- // TODO: use the path in order to resend smaller areas
- if (dest_is_lossy) {
- resend_surface_ids[num_resend] = drawable->surface_id;
- resend_areas[num_resend] = &dest_lossy_area;
- num_resend++;
- }
-
- red_add_lossless_drawable_dependencies(worker, rcc, item,
- resend_surface_ids, resend_areas, num_resend);
- }
-}
-
-static void red_marshall_qxl_draw_text(RedWorker *worker,
- RedChannelClient *rcc,
- SpiceMarshaller *base_marshaller,
- DrawablePipeItem *dpi)
-{
- Drawable *item = dpi->drawable;
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
- RedDrawable *drawable = item->red_drawable;
- SpiceText text;
- SpiceMarshaller *brush_pat_out;
- SpiceMarshaller *back_brush_pat_out;
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_DISPLAY_DRAW_TEXT, &dpi->dpi_pipe_item);
- fill_base(base_marshaller, item);
- text = drawable->u.text;
- spice_marshall_Text(base_marshaller,
- &text,
- &brush_pat_out,
- &back_brush_pat_out);
-
- if (brush_pat_out) {
- fill_bits(dcc, brush_pat_out, text.fore_brush.u.pattern.pat, item, FALSE);
- }
- if (back_brush_pat_out) {
- fill_bits(dcc, back_brush_pat_out, text.back_brush.u.pattern.pat, item, FALSE);
- }
-}
-
-static void red_lossy_marshall_qxl_draw_text(RedWorker *worker,
- RedChannelClient *rcc,
- SpiceMarshaller *base_marshaller,
- DrawablePipeItem *dpi)
-{
- Drawable *item = dpi->drawable;
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
- RedDrawable *drawable = item->red_drawable;
- int fg_is_lossy;
- BitmapData fg_bitmap_data;
- int bg_is_lossy;
- BitmapData bg_bitmap_data;
- int dest_is_lossy = FALSE;
- SpiceRect dest_lossy_area;
- int rop = 0;
-
- fg_is_lossy = is_brush_lossy(rcc, &drawable->u.text.fore_brush, item,
- &fg_bitmap_data);
- bg_is_lossy = is_brush_lossy(rcc, &drawable->u.text.back_brush, item,
- &bg_bitmap_data);
-
- // assuming that if the brush type is solid, the destination can
- // be lossy, no matter what the rop is.
- if (drawable->u.text.fore_brush.type != SPICE_BRUSH_TYPE_SOLID) {
- rop = drawable->u.text.fore_mode;
- }
-
- if (drawable->u.text.back_brush.type != SPICE_BRUSH_TYPE_SOLID) {
- rop |= drawable->u.text.back_mode;
- }
-
- if ((rop & SPICE_ROPD_OP_OR) || (rop & SPICE_ROPD_OP_AND) ||
- (rop & SPICE_ROPD_OP_XOR)) {
- dest_is_lossy = is_surface_area_lossy(dcc, drawable->surface_id,
- &drawable->bbox, &dest_lossy_area);
- }
-
- if (!dest_is_lossy &&
- (!fg_is_lossy || (fg_bitmap_data.type != BITMAP_DATA_TYPE_SURFACE)) &&
- (!bg_is_lossy || (bg_bitmap_data.type != BITMAP_DATA_TYPE_SURFACE))) {
- red_marshall_qxl_draw_text(worker, rcc, base_marshaller, dpi);
- } else {
- int resend_surface_ids[3];
- SpiceRect *resend_areas[3];
- int num_resend = 0;
-
- if (fg_is_lossy && (fg_bitmap_data.type == BITMAP_DATA_TYPE_SURFACE)) {
- resend_surface_ids[num_resend] = fg_bitmap_data.id;
- resend_areas[num_resend] = &fg_bitmap_data.lossy_rect;
- num_resend++;
- }
-
- if (bg_is_lossy && (bg_bitmap_data.type == BITMAP_DATA_TYPE_SURFACE)) {
- resend_surface_ids[num_resend] = bg_bitmap_data.id;
- resend_areas[num_resend] = &bg_bitmap_data.lossy_rect;
- num_resend++;
- }
-
- if (dest_is_lossy) {
- resend_surface_ids[num_resend] = drawable->surface_id;
- resend_areas[num_resend] = &dest_lossy_area;
- num_resend++;
- }
- red_add_lossless_drawable_dependencies(worker, rcc, item,
- resend_surface_ids, resend_areas, num_resend);
- }
-}
-
-static void red_lossy_marshall_qxl_drawable(RedWorker *worker, RedChannelClient *rcc,
- SpiceMarshaller *base_marshaller, DrawablePipeItem *dpi)
-{
- Drawable *item = dpi->drawable;
- switch (item->red_drawable->type) {
- case QXL_DRAW_FILL:
- red_lossy_marshall_qxl_draw_fill(worker, rcc, base_marshaller, dpi);
- break;
- case QXL_DRAW_OPAQUE:
- red_lossy_marshall_qxl_draw_opaque(worker, rcc, base_marshaller, dpi);
- break;
- case QXL_DRAW_COPY:
- red_lossy_marshall_qxl_draw_copy(worker, rcc, base_marshaller, dpi);
- break;
- case QXL_DRAW_TRANSPARENT:
- red_lossy_marshall_qxl_draw_transparent(worker, rcc, base_marshaller, dpi);
- break;
- case QXL_DRAW_ALPHA_BLEND:
- red_lossy_marshall_qxl_draw_alpha_blend(worker, rcc, base_marshaller, dpi);
- break;
- case QXL_COPY_BITS:
- red_lossy_marshall_qxl_copy_bits(worker, rcc, base_marshaller, dpi);
- break;
- case QXL_DRAW_BLEND:
- red_lossy_marshall_qxl_draw_blend(worker, rcc, base_marshaller, dpi);
- break;
- case QXL_DRAW_BLACKNESS:
- red_lossy_marshall_qxl_draw_blackness(worker, rcc, base_marshaller, dpi);
- break;
- case QXL_DRAW_WHITENESS:
- red_lossy_marshall_qxl_draw_whiteness(worker, rcc, base_marshaller, dpi);
- break;
- case QXL_DRAW_INVERS:
- red_lossy_marshall_qxl_draw_inverse(worker, rcc, base_marshaller, item);
- break;
- case QXL_DRAW_ROP3:
- red_lossy_marshall_qxl_draw_rop3(worker, rcc, base_marshaller, dpi);
- break;
- case QXL_DRAW_COMPOSITE:
- red_lossy_marshall_qxl_draw_composite(worker, rcc, base_marshaller, dpi);
- break;
- case QXL_DRAW_STROKE:
- red_lossy_marshall_qxl_draw_stroke(worker, rcc, base_marshaller, dpi);
- break;
- case QXL_DRAW_TEXT:
- red_lossy_marshall_qxl_draw_text(worker, rcc, base_marshaller, dpi);
- break;
- default:
- spice_error("invalid type");
- }
-}
-
-static inline void red_marshall_qxl_drawable(RedWorker *worker, RedChannelClient *rcc,
- SpiceMarshaller *m, DrawablePipeItem *dpi)
-{
- Drawable *item = dpi->drawable;
- RedDrawable *drawable = item->red_drawable;
-
- switch (drawable->type) {
- case QXL_DRAW_FILL:
- red_marshall_qxl_draw_fill(worker, rcc, m, dpi);
- break;
- case QXL_DRAW_OPAQUE:
- red_marshall_qxl_draw_opaque(worker, rcc, m, dpi, FALSE);
- break;
- case QXL_DRAW_COPY:
- red_marshall_qxl_draw_copy(worker, rcc, m, dpi, FALSE);
- break;
- case QXL_DRAW_TRANSPARENT:
- red_marshall_qxl_draw_transparent(worker, rcc, m, dpi);
- break;
- case QXL_DRAW_ALPHA_BLEND:
- red_marshall_qxl_draw_alpha_blend(worker, rcc, m, dpi, FALSE);
- break;
- case QXL_COPY_BITS:
- red_marshall_qxl_copy_bits(worker, rcc, m, dpi);
- break;
- case QXL_DRAW_BLEND:
- red_marshall_qxl_draw_blend(worker, rcc, m, dpi);
- break;
- case QXL_DRAW_BLACKNESS:
- red_marshall_qxl_draw_blackness(worker, rcc, m, dpi);
- break;
- case QXL_DRAW_WHITENESS:
- red_marshall_qxl_draw_whiteness(worker, rcc, m, dpi);
- break;
- case QXL_DRAW_INVERS:
- red_marshall_qxl_draw_inverse(worker, rcc, m, item);
- break;
- case QXL_DRAW_ROP3:
- red_marshall_qxl_draw_rop3(worker, rcc, m, dpi);
- break;
- case QXL_DRAW_STROKE:
- red_marshall_qxl_draw_stroke(worker, rcc, m, dpi);
- break;
- case QXL_DRAW_COMPOSITE:
- red_marshall_qxl_draw_composite(worker, rcc, m, dpi);
- break;
- case QXL_DRAW_TEXT:
- red_marshall_qxl_draw_text(worker, rcc, m, dpi);
- break;
- default:
- spice_error("invalid type");
- }
-}
-
-static void display_channel_push_release(DisplayChannelClient *dcc, uint8_t type, uint64_t id,
- uint64_t* sync_data)
-{
- FreeList *free_list = &dcc->send_data.free_list;
- int i;
-
- for (i = 0; i < MAX_CACHE_CLIENTS; i++) {
- free_list->sync[i] = MAX(free_list->sync[i], sync_data[i]);
- }
-
- if (free_list->res->count == free_list->res_size) {
- SpiceResourceList *new_list;
- new_list = spice_malloc(sizeof(*new_list) +
- free_list->res_size * sizeof(SpiceResourceID) * 2);
- new_list->count = free_list->res->count;
- memcpy(new_list->resources, free_list->res->resources,
- new_list->count * sizeof(SpiceResourceID));
- free(free_list->res);
- free_list->res = new_list;
- free_list->res_size *= 2;
- }
- free_list->res->resources[free_list->res->count].type = type;
- free_list->res->resources[free_list->res->count++].id = id;
-}
-
-static inline void display_marshal_sub_msg_inval_list(SpiceMarshaller *m,
- FreeList *free_list)
-{
- /* type + size + submessage */
- spice_marshaller_add_uint16(m, SPICE_MSG_DISPLAY_INVAL_LIST);
- spice_marshaller_add_uint32(m, sizeof(*free_list->res) +
- free_list->res->count * sizeof(free_list->res->resources[0]));
- spice_marshall_msg_display_inval_list(m, free_list->res);
-}
-
-static inline void display_marshal_sub_msg_inval_list_wait(SpiceMarshaller *m,
- FreeList *free_list)
-
-{
- /* type + size + submessage */
- spice_marshaller_add_uint16(m, SPICE_MSG_WAIT_FOR_CHANNELS);
- spice_marshaller_add_uint32(m, sizeof(free_list->wait.header) +
- free_list->wait.header.wait_count * sizeof(free_list->wait.buf[0]));
- spice_marshall_msg_wait_for_channels(m, &free_list->wait.header);
-}
-
-/* use legacy SpiceDataHeader (with sub_list) */
-static inline void display_channel_send_free_list_legacy(RedChannelClient *rcc)
-{
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
- FreeList *free_list = &dcc->send_data.free_list;
- SpiceMarshaller *marshaller;
- int sub_list_len = 1;
- SpiceMarshaller *wait_m = NULL;
- SpiceMarshaller *inval_m;
- SpiceMarshaller *sub_list_m;
-
- marshaller = red_channel_client_get_marshaller(rcc);
- inval_m = spice_marshaller_get_submarshaller(marshaller);
-
- display_marshal_sub_msg_inval_list(inval_m, free_list);
-
- if (free_list->wait.header.wait_count) {
- wait_m = spice_marshaller_get_submarshaller(marshaller);
- display_marshal_sub_msg_inval_list_wait(wait_m, free_list);
- sub_list_len++;
- }
-
- sub_list_m = spice_marshaller_get_submarshaller(marshaller);
- spice_marshaller_add_uint16(sub_list_m, sub_list_len);
- if (wait_m) {
- spice_marshaller_add_uint32(sub_list_m, spice_marshaller_get_offset(wait_m));
- }
- spice_marshaller_add_uint32(sub_list_m, spice_marshaller_get_offset(inval_m));
- red_channel_client_set_header_sub_list(rcc, spice_marshaller_get_offset(sub_list_m));
-}
-
-/* use mini header and SPICE_MSG_LIST */
-static inline void display_channel_send_free_list(RedChannelClient *rcc)
-{
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
- FreeList *free_list = &dcc->send_data.free_list;
- int sub_list_len = 1;
- SpiceMarshaller *urgent_marshaller;
- SpiceMarshaller *wait_m = NULL;
- SpiceMarshaller *inval_m;
- uint32_t sub_arr_offset;
- uint32_t wait_offset = 0;
- uint32_t inval_offset = 0;
- int i;
-
- urgent_marshaller = red_channel_client_switch_to_urgent_sender(rcc);
- for (i = 0; i < dcc->send_data.num_pixmap_cache_items; i++) {
- int dummy;
- /* When using the urgent marshaller, the serial number of the message that is
- * going to be sent right after the SPICE_MSG_LIST, is increased by one.
- * But all this message pixmaps cache references used its old serial.
- * we use pixmap_cache_items to collect these pixmaps, and we update their serial
- * by calling pixmap_cache_hit. */
- pixmap_cache_hit(dcc->pixmap_cache, dcc->send_data.pixmap_cache_items[i],
- &dummy, dcc);
- }
-
- if (free_list->wait.header.wait_count) {
- red_channel_client_init_send_data(rcc, SPICE_MSG_LIST, NULL);
- } else { /* only one message, no need for a list */
- red_channel_client_init_send_data(rcc, SPICE_MSG_DISPLAY_INVAL_LIST, NULL);
- spice_marshall_msg_display_inval_list(urgent_marshaller, free_list->res);
- return;
- }
-
- inval_m = spice_marshaller_get_submarshaller(urgent_marshaller);
- display_marshal_sub_msg_inval_list(inval_m, free_list);
-
- if (free_list->wait.header.wait_count) {
- wait_m = spice_marshaller_get_submarshaller(urgent_marshaller);
- display_marshal_sub_msg_inval_list_wait(wait_m, free_list);
- sub_list_len++;
- }
-
- sub_arr_offset = sub_list_len * sizeof(uint32_t);
-
- spice_marshaller_add_uint16(urgent_marshaller, sub_list_len);
- inval_offset = spice_marshaller_get_offset(inval_m); // calc the offset before
- // adding the sub list
- // offsets array to the marshaller
- /* adding the array of offsets */
- if (wait_m) {
- wait_offset = spice_marshaller_get_offset(wait_m);
- spice_marshaller_add_uint32(urgent_marshaller, wait_offset + sub_arr_offset);
- }
- spice_marshaller_add_uint32(urgent_marshaller, inval_offset + sub_arr_offset);
-}
-
-static inline void display_begin_send_message(RedChannelClient *rcc)
-{
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
- FreeList *free_list = &dcc->send_data.free_list;
-
- if (free_list->res->count) {
- int sync_count = 0;
- int i;
-
- for (i = 0; i < MAX_CACHE_CLIENTS; i++) {
- if (i != dcc->common.id && free_list->sync[i] != 0) {
- free_list->wait.header.wait_list[sync_count].channel_type = SPICE_CHANNEL_DISPLAY;
- free_list->wait.header.wait_list[sync_count].channel_id = i;
- free_list->wait.header.wait_list[sync_count++].message_serial = free_list->sync[i];
- }
- }
- free_list->wait.header.wait_count = sync_count;
-
- if (rcc->is_mini_header) {
- display_channel_send_free_list(rcc);
- } else {
- display_channel_send_free_list_legacy(rcc);
- }
- }
- red_channel_client_begin_send_message(rcc);
-}
-
-static inline uint8_t *red_get_image_line(SpiceChunks *chunks, size_t *offset,
- int *chunk_nr, int stride)
-{
- uint8_t *ret;
- SpiceChunk *chunk;
-
- chunk = &chunks->chunk[*chunk_nr];
-
- if (*offset == chunk->len) {
- if (*chunk_nr == chunks->num_chunks - 1) {
- return NULL; /* Last chunk */
- }
- *offset = 0;
- (*chunk_nr)++;
- chunk = &chunks->chunk[*chunk_nr];
- }
-
- if (chunk->len - *offset < stride) {
- spice_warning("bad chunk alignment");
- return NULL;
- }
- ret = chunk->data + *offset;
- *offset += stride;
- return ret;
-}
-
-static int encode_frame(DisplayChannelClient *dcc, const SpiceRect *src,
- const SpiceBitmap *image, Stream *stream)
-{
- SpiceChunks *chunks;
- uint32_t image_stride;
- size_t offset;
- int i, chunk;
- StreamAgent *agent = &dcc->stream_agents[stream - dcc->common.worker->streams_buf];
-
- chunks = image->data;
- offset = 0;
- chunk = 0;
- image_stride = image->stride;
-
- const int skip_lines = stream->top_down ? src->top : image->y - (src->bottom - 0);
- for (i = 0; i < skip_lines; i++) {
- red_get_image_line(chunks, &offset, &chunk, image_stride);
- }
-
- const unsigned int stream_height = src->bottom - src->top;
- const unsigned int stream_width = src->right - src->left;
-
- for (i = 0; i < stream_height; i++) {
- uint8_t *src_line =
- (uint8_t *)red_get_image_line(chunks, &offset, &chunk, image_stride);
-
- if (!src_line) {
- return FALSE;
- }
-
- src_line += src->left * mjpeg_encoder_get_bytes_per_pixel(agent->mjpeg_encoder);
- if (mjpeg_encoder_encode_scanline(agent->mjpeg_encoder, src_line, stream_width) == 0)
- return FALSE;
- }
-
- return TRUE;
-}
-
-static inline int red_marshall_stream_data(RedChannelClient *rcc,
- SpiceMarshaller *base_marshaller, Drawable *drawable)
-{
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
- DisplayChannel *display_channel = SPICE_CONTAINEROF(rcc->channel, DisplayChannel, common.base);
- Stream *stream = drawable->stream;
- SpiceImage *image;
- RedWorker *worker = dcc->common.worker;
- uint32_t frame_mm_time;
- int n;
- int width, height;
- int ret;
-
- if (!stream) {
- spice_assert(drawable->sized_stream);
- stream = drawable->sized_stream;
- }
- spice_assert(drawable->red_drawable->type == QXL_DRAW_COPY);
-
- worker = display_channel->common.worker;
- image = drawable->red_drawable->u.copy.src_bitmap;
-
- if (image->descriptor.type != SPICE_IMAGE_TYPE_BITMAP) {
- return FALSE;
- }
-
- if (drawable->sized_stream) {
- if (red_channel_client_test_remote_cap(rcc, SPICE_DISPLAY_CAP_SIZED_STREAM)) {
- SpiceRect *src_rect = &drawable->red_drawable->u.copy.src_area;
-
- width = src_rect->right - src_rect->left;
- height = src_rect->bottom - src_rect->top;
- } else {
- return FALSE;
- }
- } else {
- width = stream->width;
- height = stream->height;
- }
-
- StreamAgent *agent = &dcc->stream_agents[get_stream_id(worker, stream)];
- uint64_t time_now = red_now();
- size_t outbuf_size;
-
- if (!dcc->use_mjpeg_encoder_rate_control) {
- if (time_now - agent->last_send_time < (1000 * 1000 * 1000) / agent->fps) {
- agent->frames--;
-#ifdef STREAM_STATS
- agent->stats.num_drops_fps++;
-#endif
- return TRUE;
- }
- }
-
- /* workaround for vga streams */
- frame_mm_time = drawable->red_drawable->mm_time ?
- drawable->red_drawable->mm_time :
- reds_get_mm_time();
- outbuf_size = dcc->send_data.stream_outbuf_size;
- ret = mjpeg_encoder_start_frame(agent->mjpeg_encoder, image->u.bitmap.format,
- width, height,
- &dcc->send_data.stream_outbuf,
- &outbuf_size,
- frame_mm_time);
- switch (ret) {
- case MJPEG_ENCODER_FRAME_DROP:
- spice_assert(dcc->use_mjpeg_encoder_rate_control);
-#ifdef STREAM_STATS
- agent->stats.num_drops_fps++;
-#endif
- return TRUE;
- case MJPEG_ENCODER_FRAME_UNSUPPORTED:
- return FALSE;
- case MJPEG_ENCODER_FRAME_ENCODE_START:
- break;
- default:
- spice_error("bad return value (%d) from mjpeg_encoder_start_frame", ret);
- return FALSE;
- }
-
- if (!encode_frame(dcc, &drawable->red_drawable->u.copy.src_area,
- &image->u.bitmap, stream)) {
- return FALSE;
- }
- n = mjpeg_encoder_end_frame(agent->mjpeg_encoder);
- dcc->send_data.stream_outbuf_size = outbuf_size;
-
- if (!drawable->sized_stream) {
- SpiceMsgDisplayStreamData stream_data;
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_DISPLAY_STREAM_DATA, NULL);
-
- stream_data.base.id = get_stream_id(worker, stream);
- stream_data.base.multi_media_time = frame_mm_time;
- stream_data.data_size = n;
-
- spice_marshall_msg_display_stream_data(base_marshaller, &stream_data);
- } else {
- SpiceMsgDisplayStreamDataSized stream_data;
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_DISPLAY_STREAM_DATA_SIZED, NULL);
-
- stream_data.base.id = get_stream_id(worker, stream);
- stream_data.base.multi_media_time = frame_mm_time;
- stream_data.data_size = n;
- stream_data.width = width;
- stream_data.height = height;
- stream_data.dest = drawable->red_drawable->bbox;
-
- spice_debug("stream %d: sized frame: dest ==> ", stream_data.base.id);
- rect_debug(&stream_data.dest);
- spice_marshall_msg_display_stream_data_sized(base_marshaller, &stream_data);
- }
- spice_marshaller_add_ref(base_marshaller,
- dcc->send_data.stream_outbuf, n);
- agent->last_send_time = time_now;
-#ifdef STREAM_STATS
- agent->stats.num_frames_sent++;
- agent->stats.size_sent += n;
- agent->stats.end = frame_mm_time;
-#endif
-
- return TRUE;
-}
-
-static inline void marshall_qxl_drawable(RedChannelClient *rcc,
- SpiceMarshaller *m, DrawablePipeItem *dpi)
-{
- Drawable *item = dpi->drawable;
- DisplayChannel *display_channel = SPICE_CONTAINEROF(rcc->channel, DisplayChannel, common.base);
-
- spice_assert(display_channel && rcc);
- /* allow sized frames to be streamed, even if they where replaced by another frame, since
- * newer frames might not cover sized frames completely if they are bigger */
- if ((item->stream || item->sized_stream) && red_marshall_stream_data(rcc, m, item)) {
- return;
- }
- if (!display_channel->enable_jpeg)
- red_marshall_qxl_drawable(display_channel->common.worker, rcc, m, dpi);
- else
- red_lossy_marshall_qxl_drawable(display_channel->common.worker, rcc, m, dpi);
-}
-
-static inline void red_marshall_verb(RedChannelClient *rcc, uint16_t verb)
-{
- spice_assert(rcc);
- red_channel_client_init_send_data(rcc, verb, NULL);
-}
-
-static inline void red_marshall_inval(RedChannelClient *rcc,
- SpiceMarshaller *base_marshaller, CacheItem *cach_item)
-{
- SpiceMsgDisplayInvalOne inval_one;
-
- red_channel_client_init_send_data(rcc, cach_item->inval_type, NULL);
- inval_one.id = *(uint64_t *)&cach_item->id;
-
- spice_marshall_msg_cursor_inval_one(base_marshaller, &inval_one);
-}
-
-static void display_channel_marshall_migrate_data_surfaces(DisplayChannelClient *dcc,
- SpiceMarshaller *m,
- int lossy)
-{
- SpiceMarshaller *m2 = spice_marshaller_get_ptr_submarshaller(m, 0);
- uint32_t *num_surfaces_created;
- uint32_t i;
-
- num_surfaces_created = (uint32_t *)spice_marshaller_reserve_space(m2, sizeof(uint32_t));
- *num_surfaces_created = 0;
- for (i = 0; i < NUM_SURFACES; i++) {
- SpiceRect lossy_rect;
-
- if (!dcc->surface_client_created[i]) {
- continue;
- }
- spice_marshaller_add_uint32(m2, i);
- (*num_surfaces_created)++;
-
- if (!lossy) {
- continue;
- }
- region_extents(&dcc->surface_client_lossy_region[i], &lossy_rect);
- spice_marshaller_add_int32(m2, lossy_rect.left);
- spice_marshaller_add_int32(m2, lossy_rect.top);
- spice_marshaller_add_int32(m2, lossy_rect.right);
- spice_marshaller_add_int32(m2, lossy_rect.bottom);
- }
-}
-
-static void display_channel_marshall_migrate_data(RedChannelClient *rcc,
- SpiceMarshaller *base_marshaller)
-{
- DisplayChannel *display_channel;
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
- SpiceMigrateDataDisplay display_data = {0,};
-
- display_channel = SPICE_CONTAINEROF(rcc->channel, DisplayChannel, common.base);
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_MIGRATE_DATA, NULL);
- spice_marshaller_add_uint32(base_marshaller, SPICE_MIGRATE_DATA_DISPLAY_MAGIC);
- spice_marshaller_add_uint32(base_marshaller, SPICE_MIGRATE_DATA_DISPLAY_VERSION);
-
- spice_assert(dcc->pixmap_cache);
- spice_assert(MIGRATE_DATA_DISPLAY_MAX_CACHE_CLIENTS == 4 &&
- MIGRATE_DATA_DISPLAY_MAX_CACHE_CLIENTS == MAX_CACHE_CLIENTS);
-
- display_data.message_serial = red_channel_client_get_message_serial(rcc);
- display_data.low_bandwidth_setting = dcc->common.is_low_bandwidth;
-
- display_data.pixmap_cache_freezer = pixmap_cache_freeze(dcc->pixmap_cache);
- display_data.pixmap_cache_id = dcc->pixmap_cache->id;
- display_data.pixmap_cache_size = dcc->pixmap_cache->size;
- memcpy(display_data.pixmap_cache_clients, dcc->pixmap_cache->sync,
- sizeof(display_data.pixmap_cache_clients));
-
- spice_assert(dcc->glz_dict);
- red_freeze_glz(dcc);
- display_data.glz_dict_id = dcc->glz_dict->id;
- glz_enc_dictionary_get_restore_data(dcc->glz_dict->dict,
- &display_data.glz_dict_data,
- &dcc->glz_data.usr);
-
- /* all data besided the surfaces ref */
- spice_marshaller_add(base_marshaller,
- (uint8_t *)&display_data, sizeof(display_data) - sizeof(uint32_t));
- display_channel_marshall_migrate_data_surfaces(dcc, base_marshaller,
- display_channel->enable_jpeg);
-}
-
-static void display_channel_marshall_pixmap_sync(RedChannelClient *rcc,
- SpiceMarshaller *base_marshaller)
-{
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
- SpiceMsgWaitForChannels wait;
- PixmapCache *pixmap_cache;
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_WAIT_FOR_CHANNELS, NULL);
- pixmap_cache = dcc->pixmap_cache;
-
- pthread_mutex_lock(&pixmap_cache->lock);
-
- wait.wait_count = 1;
- wait.wait_list[0].channel_type = SPICE_CHANNEL_DISPLAY;
- wait.wait_list[0].channel_id = pixmap_cache->generation_initiator.client;
- wait.wait_list[0].message_serial = pixmap_cache->generation_initiator.message;
- dcc->pixmap_cache_generation = pixmap_cache->generation;
- dcc->pending_pixmaps_sync = FALSE;
-
- pthread_mutex_unlock(&pixmap_cache->lock);
-
- spice_marshall_msg_wait_for_channels(base_marshaller, &wait);
-}
-
-static void display_channel_marshall_reset_cache(RedChannelClient *rcc,
- SpiceMarshaller *base_marshaller)
-{
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
- SpiceMsgWaitForChannels wait;
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_DISPLAY_INVAL_ALL_PIXMAPS, NULL);
- pixmap_cache_reset(dcc->pixmap_cache, dcc, &wait);
-
- spice_marshall_msg_display_inval_all_pixmaps(base_marshaller,
- &wait);
-}
-
-static void red_marshall_image(RedChannelClient *rcc, SpiceMarshaller *m, ImageItem *item)
-{
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
- DisplayChannel *display_channel = DCC_TO_DC(dcc);
- SpiceImage red_image;
- RedWorker *worker;
- SpiceBitmap bitmap;
- SpiceChunks *chunks;
- QRegion *surface_lossy_region;
- int comp_succeeded;
- int lossy_comp = FALSE;
- int lz_comp = FALSE;
- spice_image_compression_t comp_mode;
- SpiceMsgDisplayDrawCopy copy;
- SpiceMarshaller *src_bitmap_out, *mask_bitmap_out;
- SpiceMarshaller *bitmap_palette_out, *lzplt_palette_out;
-
- spice_assert(rcc && display_channel && item);
- worker = display_channel->common.worker;
-
- QXL_SET_IMAGE_ID(&red_image, QXL_IMAGE_GROUP_RED, ++worker->bits_unique);
- red_image.descriptor.type = SPICE_IMAGE_TYPE_BITMAP;
- red_image.descriptor.flags = item->image_flags;
- red_image.descriptor.width = item->width;
- red_image.descriptor.height = item->height;
-
- bitmap.format = item->image_format;
- bitmap.flags = 0;
- if (item->top_down) {
- bitmap.flags |= SPICE_BITMAP_FLAGS_TOP_DOWN;
- }
- bitmap.x = item->width;
- bitmap.y = item->height;
- bitmap.stride = item->stride;
- bitmap.palette = 0;
- bitmap.palette_id = 0;
-
- chunks = spice_chunks_new_linear(item->data, bitmap.stride * bitmap.y);
- bitmap.data = chunks;
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_DISPLAY_DRAW_COPY, &item->link);
-
- copy.base.surface_id = item->surface_id;
- copy.base.box.left = item->pos.x;
- copy.base.box.top = item->pos.y;
- copy.base.box.right = item->pos.x + bitmap.x;
- copy.base.box.bottom = item->pos.y + bitmap.y;
- copy.base.clip.type = SPICE_CLIP_TYPE_NONE;
- copy.data.rop_descriptor = SPICE_ROPD_OP_PUT;
- copy.data.src_area.left = 0;
- copy.data.src_area.top = 0;
- copy.data.src_area.right = bitmap.x;
- copy.data.src_area.bottom = bitmap.y;
- copy.data.scale_mode = 0;
- copy.data.src_bitmap = 0;
- copy.data.mask.flags = 0;
- copy.data.mask.flags = 0;
- copy.data.mask.pos.x = 0;
- copy.data.mask.pos.y = 0;
- copy.data.mask.bitmap = 0;
-
- spice_marshall_msg_display_draw_copy(m, &copy,
- &src_bitmap_out, &mask_bitmap_out);
-
- compress_send_data_t comp_send_data = {0};
-
- comp_mode = display_channel->common.worker->image_compression;
-
- if (((comp_mode == SPICE_IMAGE_COMPRESS_AUTO_LZ) ||
- (comp_mode == SPICE_IMAGE_COMPRESS_AUTO_GLZ)) && !_stride_is_extra(&bitmap)) {
-
- if (BITMAP_FMT_HAS_GRADUALITY(item->image_format)) {
- BitmapGradualType grad_level;
-
- grad_level = _get_bitmap_graduality_level(display_channel->common.worker,
- &bitmap,
- worker->mem_slots.internal_groupslot_id);
- if (grad_level == BITMAP_GRADUAL_HIGH) {
- // if we use lz for alpha, the stride can't be extra
- lossy_comp = display_channel->enable_jpeg && item->can_lossy;
- } else {
- lz_comp = TRUE;
- }
- } else {
- lz_comp = TRUE;
- }
- }
-
- if (lossy_comp) {
- comp_succeeded = red_jpeg_compress_image(dcc, &red_image,
- &bitmap, &comp_send_data,
- worker->mem_slots.internal_groupslot_id);
- } else {
- if (!lz_comp) {
- comp_succeeded = red_quic_compress_image(dcc, &red_image, &bitmap,
- &comp_send_data,
- worker->mem_slots.internal_groupslot_id);
- } else {
- comp_succeeded = red_lz_compress_image(dcc, &red_image, &bitmap,
- &comp_send_data,
- worker->mem_slots.internal_groupslot_id);
- }
- }
-
- surface_lossy_region = &dcc->surface_client_lossy_region[item->surface_id];
- if (comp_succeeded) {
- spice_marshall_Image(src_bitmap_out, &red_image,
- &bitmap_palette_out, &lzplt_palette_out);
-
- marshaller_add_compressed(src_bitmap_out,
- comp_send_data.comp_buf, comp_send_data.comp_buf_size);
-
- if (lzplt_palette_out && comp_send_data.lzplt_palette) {
- spice_marshall_Palette(lzplt_palette_out, comp_send_data.lzplt_palette);
- }
-
- if (lossy_comp) {
- region_add(surface_lossy_region, &copy.base.box);
- } else {
- region_remove(surface_lossy_region, &copy.base.box);
- }
- } else {
- red_image.descriptor.type = SPICE_IMAGE_TYPE_BITMAP;
- red_image.u.bitmap = bitmap;
-
- spice_marshall_Image(src_bitmap_out, &red_image,
- &bitmap_palette_out, &lzplt_palette_out);
- spice_marshaller_add_ref(src_bitmap_out, item->data,
- bitmap.y * bitmap.stride);
- region_remove(surface_lossy_region, &copy.base.box);
- }
- spice_chunks_destroy(chunks);
-}
-
-static void red_display_marshall_upgrade(RedChannelClient *rcc, SpiceMarshaller *m,
- UpgradeItem *item)
-{
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
- RedDrawable *red_drawable;
- SpiceMsgDisplayDrawCopy copy;
- SpiceMarshaller *src_bitmap_out, *mask_bitmap_out;
-
- spice_assert(rcc && rcc->channel && item && item->drawable);
- red_channel_client_init_send_data(rcc, SPICE_MSG_DISPLAY_DRAW_COPY, &item->base);
-
- red_drawable = item->drawable->red_drawable;
- spice_assert(red_drawable->type == QXL_DRAW_COPY);
- spice_assert(red_drawable->u.copy.rop_descriptor == SPICE_ROPD_OP_PUT);
- spice_assert(red_drawable->u.copy.mask.bitmap == 0);
-
- copy.base.surface_id = 0;
- copy.base.box = red_drawable->bbox;
- copy.base.clip.type = SPICE_CLIP_TYPE_RECTS;
- copy.base.clip.rects = item->rects;
- copy.data = red_drawable->u.copy;
-
- spice_marshall_msg_display_draw_copy(m, &copy,
- &src_bitmap_out, &mask_bitmap_out);
-
- fill_bits(dcc, src_bitmap_out, copy.data.src_bitmap, item->drawable, FALSE);
-}
-
-static void red_display_marshall_stream_start(RedChannelClient *rcc,
- SpiceMarshaller *base_marshaller, StreamAgent *agent)
-{
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
- Stream *stream = agent->stream;
-
- agent->last_send_time = 0;
- spice_assert(stream);
- red_channel_client_init_send_data(rcc, SPICE_MSG_DISPLAY_STREAM_CREATE, NULL);
- SpiceMsgDisplayStreamCreate stream_create;
- SpiceClipRects clip_rects;
-
- stream_create.surface_id = 0;
- stream_create.id = get_stream_id(dcc->common.worker, stream);
- stream_create.flags = stream->top_down ? SPICE_STREAM_FLAGS_TOP_DOWN : 0;
- stream_create.codec_type = SPICE_VIDEO_CODEC_TYPE_MJPEG;
-
- stream_create.src_width = stream->width;
- stream_create.src_height = stream->height;
- stream_create.stream_width = stream_create.src_width;
- stream_create.stream_height = stream_create.src_height;
- stream_create.dest = stream->dest_area;
-
- if (stream->current) {
- RedDrawable *red_drawable = stream->current->red_drawable;
- stream_create.clip = red_drawable->clip;
- } else {
- stream_create.clip.type = SPICE_CLIP_TYPE_RECTS;
- clip_rects.num_rects = 0;
- stream_create.clip.rects = &clip_rects;
- }
-
- stream_create.stamp = 0;
-
- spice_marshall_msg_display_stream_create(base_marshaller, &stream_create);
-}
-
-static void red_display_marshall_stream_clip(RedChannelClient *rcc,
- SpiceMarshaller *base_marshaller,
- StreamClipItem *item)
-{
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
- StreamAgent *agent = item->stream_agent;
-
- spice_assert(agent->stream);
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_DISPLAY_STREAM_CLIP, &item->base);
- SpiceMsgDisplayStreamClip stream_clip;
-
- stream_clip.id = get_stream_id(dcc->common.worker, agent->stream);
- stream_clip.clip.type = item->clip_type;
- stream_clip.clip.rects = item->rects;
-
- spice_marshall_msg_display_stream_clip(base_marshaller, &stream_clip);
-}
-
-static void red_display_marshall_stream_end(RedChannelClient *rcc,
- SpiceMarshaller *base_marshaller, StreamAgent* agent)
-{
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
- SpiceMsgDisplayStreamDestroy destroy;
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_DISPLAY_STREAM_DESTROY, NULL);
- destroy.id = get_stream_id(dcc->common.worker, agent->stream);
- red_display_stream_agent_stop(dcc, agent);
- spice_marshall_msg_display_stream_destroy(base_marshaller, &destroy);
-}
-
-static void red_cursor_marshall_inval(RedChannelClient *rcc,
- SpiceMarshaller *m, CacheItem *cach_item)
-{
- spice_assert(rcc);
- red_marshall_inval(rcc, m, cach_item);
-}
-
-static void red_marshall_cursor_init(RedChannelClient *rcc, SpiceMarshaller *base_marshaller,
- PipeItem *pipe_item)
-{
- CursorChannel *cursor_channel;
- CursorChannelClient *ccc = RCC_TO_CCC(rcc);
- RedWorker *worker;
- SpiceMsgCursorInit msg;
- AddBufInfo info;
-
- spice_assert(rcc);
- cursor_channel = SPICE_CONTAINEROF(rcc->channel, CursorChannel, common.base);
- worker = cursor_channel->common.worker;
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_CURSOR_INIT, NULL);
- msg.visible = worker->cursor_visible;
- msg.position = worker->cursor_position;
- msg.trail_length = worker->cursor_trail_length;
- msg.trail_frequency = worker->cursor_trail_frequency;
-
- fill_cursor(ccc, &msg.cursor, worker->cursor, &info);
- spice_marshall_msg_cursor_init(base_marshaller, &msg);
- add_buf_from_info(base_marshaller, &info);
-}
-
-static void red_marshall_cursor(RedChannelClient *rcc,
- SpiceMarshaller *m, CursorPipeItem *cursor_pipe_item)
-{
- CursorChannel *cursor_channel = SPICE_CONTAINEROF(rcc->channel, CursorChannel, common.base);
- CursorChannelClient *ccc = RCC_TO_CCC(rcc);
- CursorItem *cursor = cursor_pipe_item->cursor_item;
- PipeItem *pipe_item = &cursor_pipe_item->base;
- RedCursorCmd *cmd;
- RedWorker *worker;
-
- spice_assert(cursor_channel);
-
- worker = cursor_channel->common.worker;
-
- cmd = cursor->red_cursor;
- switch (cmd->type) {
- case QXL_CURSOR_MOVE:
- {
- SpiceMsgCursorMove cursor_move;
- red_channel_client_init_send_data(rcc, SPICE_MSG_CURSOR_MOVE, pipe_item);
- cursor_move.position = cmd->u.position;
- spice_marshall_msg_cursor_move(m, &cursor_move);
- break;
- }
- case QXL_CURSOR_SET:
- {
- SpiceMsgCursorSet cursor_set;
- AddBufInfo info;
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_CURSOR_SET, pipe_item);
- cursor_set.position = cmd->u.set.position;
- cursor_set.visible = worker->cursor_visible;
-
- fill_cursor(ccc, &cursor_set.cursor, cursor, &info);
- spice_marshall_msg_cursor_set(m, &cursor_set);
- add_buf_from_info(m, &info);
- break;
- }
- case QXL_CURSOR_HIDE:
- red_channel_client_init_send_data(rcc, SPICE_MSG_CURSOR_HIDE, pipe_item);
- break;
- case QXL_CURSOR_TRAIL:
- {
- SpiceMsgCursorTrail cursor_trail;
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_CURSOR_TRAIL, pipe_item);
- cursor_trail.length = cmd->u.trail.length;
- cursor_trail.frequency = cmd->u.trail.frequency;
- spice_marshall_msg_cursor_trail(m, &cursor_trail);
- }
- break;
- default:
- spice_error("bad cursor command %d", cmd->type);
- }
-}
-
-static void red_marshall_surface_create(RedChannelClient *rcc,
- SpiceMarshaller *base_marshaller, SpiceMsgSurfaceCreate *surface_create)
-{
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
-
- region_init(&dcc->surface_client_lossy_region[surface_create->surface_id]);
- red_channel_client_init_send_data(rcc, SPICE_MSG_DISPLAY_SURFACE_CREATE, NULL);
-
- spice_marshall_msg_display_surface_create(base_marshaller, surface_create);
-}
-
-static void red_marshall_surface_destroy(RedChannelClient *rcc,
- SpiceMarshaller *base_marshaller, uint32_t surface_id)
-{
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
- SpiceMsgSurfaceDestroy surface_destroy;
-
- region_destroy(&dcc->surface_client_lossy_region[surface_id]);
- red_channel_client_init_send_data(rcc, SPICE_MSG_DISPLAY_SURFACE_DESTROY, NULL);
-
- surface_destroy.surface_id = surface_id;
-
- spice_marshall_msg_display_surface_destroy(base_marshaller, &surface_destroy);
-}
-
-static void red_marshall_monitors_config(RedChannelClient *rcc, SpiceMarshaller *base_marshaller,
- MonitorsConfig *monitors_config)
-{
- int heads_size = sizeof(SpiceHead) * monitors_config->count;
- int i;
- SpiceMsgDisplayMonitorsConfig *msg = spice_malloc0(sizeof(*msg) + heads_size);
- int count = 0; // ignore monitors_config->count, it may contain zero width monitors, remove them now
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_DISPLAY_MONITORS_CONFIG, NULL);
- for (i = 0 ; i < monitors_config->count; ++i) {
- if (monitors_config->heads[i].width == 0 || monitors_config->heads[i].height == 0) {
- continue;
- }
- msg->heads[count].id = monitors_config->heads[i].id;
- msg->heads[count].surface_id = monitors_config->heads[i].surface_id;
- msg->heads[count].width = monitors_config->heads[i].width;
- msg->heads[count].height = monitors_config->heads[i].height;
- msg->heads[count].x = monitors_config->heads[i].x;
- msg->heads[count].y = monitors_config->heads[i].y;
- count++;
- }
- msg->count = count;
- msg->max_allowed = monitors_config->max_allowed;
- spice_marshall_msg_display_monitors_config(base_marshaller, msg);
- free(msg);
-}
-
-static void red_marshall_stream_activate_report(RedChannelClient *rcc,
- SpiceMarshaller *base_marshaller,
- uint32_t stream_id)
-{
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
- StreamAgent *agent = &dcc->stream_agents[stream_id];
- SpiceMsgDisplayStreamActivateReport msg;
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_DISPLAY_STREAM_ACTIVATE_REPORT, NULL);
- msg.stream_id = stream_id;
- msg.unique_id = agent->report_id;
- msg.max_window_size = RED_STREAM_CLIENT_REPORT_WINDOW;
- msg.timeout_ms = RED_STREAM_CLIENT_REPORT_TIMEOUT;
- spice_marshall_msg_display_stream_activate_report(base_marshaller, &msg);
-}
-
-static void display_channel_send_item(RedChannelClient *rcc, PipeItem *pipe_item)
-{
- SpiceMarshaller *m = red_channel_client_get_marshaller(rcc);
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
-
- red_display_reset_send_data(dcc);
- switch (pipe_item->type) {
- case PIPE_ITEM_TYPE_DRAW: {
- DrawablePipeItem *dpi = SPICE_CONTAINEROF(pipe_item, DrawablePipeItem, dpi_pipe_item);
- marshall_qxl_drawable(rcc, m, dpi);
- break;
- }
- case PIPE_ITEM_TYPE_INVAL_ONE:
- red_marshall_inval(rcc, m, (CacheItem *)pipe_item);
- break;
- case PIPE_ITEM_TYPE_STREAM_CREATE: {
- StreamAgent *agent = SPICE_CONTAINEROF(pipe_item, StreamAgent, create_item);
- red_display_marshall_stream_start(rcc, m, agent);
- break;
- }
- case PIPE_ITEM_TYPE_STREAM_CLIP: {
- StreamClipItem* clip_item = (StreamClipItem *)pipe_item;
- red_display_marshall_stream_clip(rcc, m, clip_item);
- break;
- }
- case PIPE_ITEM_TYPE_STREAM_DESTROY: {
- StreamAgent *agent = SPICE_CONTAINEROF(pipe_item, StreamAgent, destroy_item);
- red_display_marshall_stream_end(rcc, m, agent);
- break;
- }
- case PIPE_ITEM_TYPE_UPGRADE:
- red_display_marshall_upgrade(rcc, m, (UpgradeItem *)pipe_item);
- break;
- case PIPE_ITEM_TYPE_VERB:
- red_marshall_verb(rcc, ((VerbItem*)pipe_item)->verb);
- break;
- case PIPE_ITEM_TYPE_MIGRATE_DATA:
- display_channel_marshall_migrate_data(rcc, m);
- break;
- case PIPE_ITEM_TYPE_IMAGE:
- red_marshall_image(rcc, m, (ImageItem *)pipe_item);
- break;
- case PIPE_ITEM_TYPE_PIXMAP_SYNC:
- display_channel_marshall_pixmap_sync(rcc, m);
- break;
- case PIPE_ITEM_TYPE_PIXMAP_RESET:
- display_channel_marshall_reset_cache(rcc, m);
- break;
- case PIPE_ITEM_TYPE_INVAL_PALLET_CACHE:
- red_reset_palette_cache(dcc);
- red_marshall_verb(rcc, SPICE_MSG_DISPLAY_INVAL_ALL_PALETTES);
- break;
- case PIPE_ITEM_TYPE_CREATE_SURFACE: {
- SurfaceCreateItem *surface_create = SPICE_CONTAINEROF(pipe_item, SurfaceCreateItem,
- pipe_item);
- red_marshall_surface_create(rcc, m, &surface_create->surface_create);
- break;
- }
- case PIPE_ITEM_TYPE_DESTROY_SURFACE: {
- SurfaceDestroyItem *surface_destroy = SPICE_CONTAINEROF(pipe_item, SurfaceDestroyItem,
- pipe_item);
- red_marshall_surface_destroy(rcc, m, surface_destroy->surface_destroy.surface_id);
- break;
- }
- case PIPE_ITEM_TYPE_MONITORS_CONFIG: {
- MonitorsConfigItem *monconf_item = SPICE_CONTAINEROF(pipe_item,
- MonitorsConfigItem, pipe_item);
- red_marshall_monitors_config(rcc, m, monconf_item->monitors_config);
- break;
- }
- case PIPE_ITEM_TYPE_STREAM_ACTIVATE_REPORT: {
- StreamActivateReportItem *report_item = SPICE_CONTAINEROF(pipe_item,
- StreamActivateReportItem,
- pipe_item);
- red_marshall_stream_activate_report(rcc, m, report_item->stream_id);
- break;
- }
- default:
- spice_error("invalid pipe item type");
- }
-
- display_channel_client_release_item_before_push(dcc, pipe_item);
-
- // a message is pending
- if (red_channel_client_send_message_pending(rcc)) {
- display_begin_send_message(rcc);
- }
-}
-
-static void cursor_channel_send_item(RedChannelClient *rcc, PipeItem *pipe_item)
-{
- SpiceMarshaller *m = red_channel_client_get_marshaller(rcc);
- CursorChannelClient *ccc = RCC_TO_CCC(rcc);
-
- switch (pipe_item->type) {
- case PIPE_ITEM_TYPE_CURSOR:
- red_marshall_cursor(rcc, m, SPICE_CONTAINEROF(pipe_item, CursorPipeItem, base));
- break;
- case PIPE_ITEM_TYPE_INVAL_ONE:
- red_cursor_marshall_inval(rcc, m, (CacheItem *)pipe_item);
- break;
- case PIPE_ITEM_TYPE_VERB:
- red_marshall_verb(rcc, ((VerbItem*)pipe_item)->verb);
- break;
- case PIPE_ITEM_TYPE_CURSOR_INIT:
- red_reset_cursor_cache(rcc);
- red_marshall_cursor_init(rcc, m, pipe_item);
- break;
- case PIPE_ITEM_TYPE_INVAL_CURSOR_CACHE:
- red_reset_cursor_cache(rcc);
- red_marshall_verb(rcc, SPICE_MSG_CURSOR_INVAL_ALL);
- break;
- default:
- spice_error("invalid pipe item type");
- }
-
- cursor_channel_client_release_item_before_push(ccc, pipe_item);
- red_channel_client_begin_send_message(rcc);
-}
-
-static inline void red_push(RedWorker *worker)
-{
- if (worker->cursor_channel) {
- red_channel_push(&worker->cursor_channel->common.base);
- }
- if (worker->display_channel) {
- red_channel_push(&worker->display_channel->common.base);
- }
-}
-
-typedef struct ShowTreeData {
- RedWorker *worker;
- int level;
- Container *container;
-} ShowTreeData;
-
-static void __show_tree_call(TreeItem *item, void *data)
-{
- ShowTreeData *tree_data = data;
- const char *item_prefix = "|--";
- int i;
-
- while (tree_data->container != item->container) {
- spice_assert(tree_data->container);
- tree_data->level--;
- tree_data->container = tree_data->container->base.container;
- }
-
- switch (item->type) {
- case TREE_ITEM_TYPE_DRAWABLE: {
- Drawable *drawable = SPICE_CONTAINEROF(item, Drawable, tree_item);
- const int max_indent = 200;
- char indent_str[max_indent + 1];
- int indent_str_len;
-
- for (i = 0; i < tree_data->level; i++) {
- printf(" ");
- }
- printf(item_prefix, 0);
- show_red_drawable(tree_data->worker, drawable->red_drawable, NULL);
- for (i = 0; i < tree_data->level; i++) {
- printf(" ");
- }
- printf("| ");
- show_draw_item(tree_data->worker, &drawable->tree_item, NULL);
- indent_str_len = MIN(max_indent, strlen(item_prefix) + tree_data->level * 2);
- memset(indent_str, ' ', indent_str_len);
- indent_str[indent_str_len] = 0;
- region_dump(&item->rgn, indent_str);
- printf("\n");
- break;
- }
- case TREE_ITEM_TYPE_CONTAINER:
- tree_data->level++;
- tree_data->container = (Container *)item;
- break;
- case TREE_ITEM_TYPE_SHADOW:
- break;
- }
-}
-
-void red_show_tree(RedWorker *worker)
-{
- int x;
-
- ShowTreeData show_tree_data;
- show_tree_data.worker = worker;
- show_tree_data.level = 0;
- show_tree_data.container = NULL;
- for (x = 0; x < NUM_SURFACES; ++x) {
- if (worker->surfaces[x].context.canvas) {
- current_tree_for_each(&worker->surfaces[x].current, __show_tree_call,
- &show_tree_data);
- }
- }
-}
-
-static void display_channel_client_on_disconnect(RedChannelClient *rcc)
-{
- DisplayChannel *display_channel;
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
- CommonChannel *common;
- RedWorker *worker;
-
- if (!rcc) {
- return;
- }
- spice_info(NULL);
- common = SPICE_CONTAINEROF(rcc->channel, CommonChannel, base);
- worker = common->worker;
- display_channel = (DisplayChannel *)rcc->channel;
- spice_assert(display_channel == worker->display_channel);
-#ifdef COMPRESS_STAT
- print_compress_stats(display_channel);
-#endif
- red_release_pixmap_cache(dcc);
- red_release_glz(dcc);
- red_reset_palette_cache(dcc);
- free(dcc->send_data.stream_outbuf);
- red_display_reset_compress_buf(dcc);
- free(dcc->send_data.free_list.res);
- red_display_destroy_streams_agents(dcc);
-
- // this was the last channel client
- if (!red_channel_is_connected(rcc->channel)) {
- red_display_destroy_compress_bufs(display_channel);
- }
- spice_debug("#draw=%d, #red_draw=%d, #glz_draw=%d",
- worker->drawable_count, worker->red_drawable_count,
- worker->glz_drawable_count);
-}
-
-void red_disconnect_all_display_TODO_remove_me(RedChannel *channel)
-{
- // TODO: we need to record the client that actually causes the timeout. So
- // we need to check the locations of the various pipe heads when counting,
- // and disconnect only those/that.
- if (!channel) {
- return;
- }
- red_channel_apply_clients(channel, red_channel_client_disconnect);
-}
-
-static void red_destroy_streams(RedWorker *worker)
-{
- RingItem *stream_item;
-
- spice_debug(NULL);
- while ((stream_item = ring_get_head(&worker->streams))) {
- Stream *stream = SPICE_CONTAINEROF(stream_item, Stream, link);
-
- red_detach_stream_gracefully(worker, stream, NULL);
- red_stop_stream(worker, stream);
- }
-}
-
-static void red_migrate_display(RedWorker *worker, RedChannelClient *rcc)
-{
- /* We need to stop the streams, and to send upgrade_items to the client.
- * Otherwise, (1) the client might display lossy regions that we don't track
- * (streams are not part of the migration data) (2) streams_timeout may occur
- * after the MIGRATE message has been sent. This can result in messages
- * being sent to the client after MSG_MIGRATE and before MSG_MIGRATE_DATA (e.g.,
- * STREAM_CLIP, STREAM_DESTROY, DRAW_COPY)
- * No message besides MSG_MIGRATE_DATA should be sent after MSG_MIGRATE.
- * Notice that red_destroy_streams won't lead to any dev ram changes, since
- * handle_dev_stop already took care of releasing all the dev ram resources.
- */
- red_destroy_streams(worker);
- if (red_channel_client_is_connected(rcc)) {
- red_channel_client_default_migrate(rcc);
- }
-}
-
-#ifdef USE_OPENGL
-static SpiceCanvas *create_ogl_context_common(RedWorker *worker, OGLCtx *ctx, uint32_t width,
- uint32_t height, int32_t stride, uint8_t depth)
-{
- SpiceCanvas *canvas;
-
- oglctx_make_current(ctx);
- if (!(canvas = gl_canvas_create(width, height, depth, &worker->image_cache.base,
- &worker->image_surfaces, NULL, NULL, NULL))) {
- return NULL;
- }
-
- spice_canvas_set_usr_data(canvas, ctx, (spice_destroy_fn_t)oglctx_destroy);
-
- canvas->ops->clear(canvas);
-
- return canvas;
-}
-
-static SpiceCanvas *create_ogl_pbuf_context(RedWorker *worker, uint32_t width, uint32_t height,
- int32_t stride, uint8_t depth)
-{
- OGLCtx *ctx;
- SpiceCanvas *canvas;
-
- if (!(ctx = pbuf_create(width, height))) {
- return NULL;
- }
-
- if (!(canvas = create_ogl_context_common(worker, ctx, width, height, stride, depth))) {
- oglctx_destroy(ctx);
- return NULL;
- }
-
- return canvas;
-}
-
-static SpiceCanvas *create_ogl_pixmap_context(RedWorker *worker, uint32_t width, uint32_t height,
- int32_t stride, uint8_t depth) {
- OGLCtx *ctx;
- SpiceCanvas *canvas;
-
- if (!(ctx = pixmap_create(width, height))) {
- return NULL;
- }
-
- if (!(canvas = create_ogl_context_common(worker, ctx, width, height, stride, depth))) {
- oglctx_destroy(ctx);
- return NULL;
- }
-
- return canvas;
-}
-#endif
-
-static inline void *create_canvas_for_surface(RedWorker *worker, RedSurface *surface,
- uint32_t renderer, uint32_t width, uint32_t height,
- int32_t stride, uint32_t format, void *line_0)
-{
- SpiceCanvas *canvas;
-
- switch (renderer) {
- case RED_RENDERER_SW:
- canvas = canvas_create_for_data(width, height, format,
- line_0, stride,
- &worker->image_cache.base,
- &worker->image_surfaces, NULL, NULL, NULL);
- surface->context.top_down = TRUE;
- surface->context.canvas_draws_on_surface = TRUE;
- return canvas;
-#ifdef USE_OPENGL
- case RED_RENDERER_OGL_PBUF:
- canvas = create_ogl_pbuf_context(worker, width, height, stride,
- SPICE_SURFACE_FMT_DEPTH(format));
- surface->context.top_down = FALSE;
- return canvas;
- case RED_RENDERER_OGL_PIXMAP:
- canvas = create_ogl_pixmap_context(worker, width, height, stride,
- SPICE_SURFACE_FMT_DEPTH(format));
- surface->context.top_down = FALSE;
- return canvas;
-#endif
- default:
- spice_error("invalid renderer type");
- };
-
- return NULL;
-}
-
-static SurfaceCreateItem *get_surface_create_item(
- RedChannel* channel,
- uint32_t surface_id, uint32_t width,
- uint32_t height, uint32_t format, uint32_t flags)
-{
- SurfaceCreateItem *create;
-
- create = (SurfaceCreateItem *)malloc(sizeof(SurfaceCreateItem));
- spice_warn_if(!create);
-
- create->surface_create.surface_id = surface_id;
- create->surface_create.width = width;
- create->surface_create.height = height;
- create->surface_create.flags = flags;
- create->surface_create.format = format;
-
- red_channel_pipe_item_init(channel,
- &create->pipe_item, PIPE_ITEM_TYPE_CREATE_SURFACE);
- return create;
-}
-
-static inline void red_create_surface_item(DisplayChannelClient *dcc, int surface_id)
-{
- RedSurface *surface;
- SurfaceCreateItem *create;
- RedWorker *worker = dcc ? dcc->common.worker : NULL;
- uint32_t flags = is_primary_surface(worker, surface_id) ? SPICE_SURFACE_FLAGS_PRIMARY : 0;
-
- /* don't send redundant create surface commands to client */
- if (!dcc || worker->display_channel->common.during_target_migrate ||
- dcc->surface_client_created[surface_id]) {
- return;
- }
- surface = &worker->surfaces[surface_id];
- create = get_surface_create_item(dcc->common.base.channel,
- surface_id, surface->context.width, surface->context.height,
- surface->context.format, flags);
- dcc->surface_client_created[surface_id] = TRUE;
- red_channel_client_pipe_add(&dcc->common.base, &create->pipe_item);
-}
-
-static void red_worker_create_surface_item(RedWorker *worker, int surface_id)
-{
- DisplayChannelClient *dcc;
- RingItem *item, *next;
-
- WORKER_FOREACH_DCC_SAFE(worker, item, next, dcc) {
- red_create_surface_item(dcc, surface_id);
- }
-}
-
-
-static void red_worker_push_surface_image(RedWorker *worker, int surface_id)
-{
- DisplayChannelClient *dcc;
- RingItem *item, *next;
-
- WORKER_FOREACH_DCC_SAFE(worker, item, next, dcc) {
- red_push_surface_image(dcc, surface_id);
- }
-}
-
-static inline void red_create_surface(RedWorker *worker, uint32_t surface_id, uint32_t width,
- uint32_t height, int32_t stride, uint32_t format,
- void *line_0, int data_is_valid, int send_client)
-{
- RedSurface *surface = &worker->surfaces[surface_id];
- uint32_t i;
-
- spice_warn_if(surface->context.canvas);
-
- surface->context.canvas_draws_on_surface = FALSE;
- surface->context.width = width;
- surface->context.height = height;
- surface->context.format = format;
- surface->context.stride = stride;
- surface->context.line_0 = line_0;
- if (!data_is_valid) {
- char *data = line_0;
- if (stride < 0) {
- data -= abs(stride) * (height - 1);
- }
- memset(data, 0, height*abs(stride));
- }
- surface->create.info = NULL;
- surface->destroy.info = NULL;
- ring_init(&surface->current);
- ring_init(&surface->current_list);
- ring_init(&surface->depend_on_me);
- region_init(&surface->draw_dirty_region);
- surface->refs = 1;
- if (worker->renderer != RED_RENDERER_INVALID) {
- surface->context.canvas = create_canvas_for_surface(worker, surface, worker->renderer,
- width, height, stride,
- surface->context.format, line_0);
- if (!surface->context.canvas) {
- spice_critical("drawing canvas creating failed - can`t create same type canvas");
- }
-
- if (send_client) {
- red_worker_create_surface_item(worker, surface_id);
- if (data_is_valid) {
- red_worker_push_surface_image(worker, surface_id);
- }
- }
- return;
- }
-
- for (i = 0; i < worker->num_renderers; i++) {
- surface->context.canvas = create_canvas_for_surface(worker, surface, worker->renderers[i],
- width, height, stride,
- surface->context.format, line_0);
- if (surface->context.canvas) { //no need canvas check
- worker->renderer = worker->renderers[i];
- if (send_client) {
- red_worker_create_surface_item(worker, surface_id);
- if (data_is_valid) {
- red_worker_push_surface_image(worker, surface_id);
- }
- }
- return;
- }
- }
-
- spice_critical("unable to create drawing canvas");
-}
-
-static inline void flush_display_commands(RedWorker *worker)
-{
- RedChannel *display_red_channel = &worker->display_channel->common.base;
-
- for (;;) {
- uint64_t end_time;
- int ring_is_empty;
-
- red_process_commands(worker, MAX_PIPE_SIZE, &ring_is_empty);
- if (ring_is_empty) {
- break;
- }
-
- while (red_process_commands(worker, MAX_PIPE_SIZE, &ring_is_empty)) {
- red_channel_push(&worker->display_channel->common.base);
- }
-
- if (ring_is_empty) {
- break;
- }
- end_time = red_now() + DISPLAY_CLIENT_TIMEOUT;
- int sleep_count = 0;
- for (;;) {
- red_channel_push(&worker->display_channel->common.base);
- if (!display_is_connected(worker) ||
- red_channel_max_pipe_size(display_red_channel) <= MAX_PIPE_SIZE) {
- break;
- }
- RedChannel *channel = (RedChannel *)worker->display_channel;
- red_channel_receive(channel);
- red_channel_send(channel);
- // TODO: MC: the whole timeout will break since it takes lowest timeout, should
- // do it client by client.
- if (red_now() >= end_time) {
- spice_warning("update timeout");
- red_disconnect_all_display_TODO_remove_me(channel);
- } else {
- sleep_count++;
- usleep(DISPLAY_CLIENT_RETRY_INTERVAL);
- }
- }
- }
-}
-
-static inline void flush_cursor_commands(RedWorker *worker)
-{
- RedChannel *cursor_red_channel = &worker->cursor_channel->common.base;
-
- for (;;) {
- uint64_t end_time;
- int ring_is_empty = FALSE;
-
- red_process_cursor(worker, MAX_PIPE_SIZE, &ring_is_empty);
- if (ring_is_empty) {
- break;
- }
-
- while (red_process_cursor(worker, MAX_PIPE_SIZE, &ring_is_empty)) {
- red_channel_push(&worker->cursor_channel->common.base);
- }
-
- if (ring_is_empty) {
- break;
- }
- end_time = red_now() + DISPLAY_CLIENT_TIMEOUT;
- int sleep_count = 0;
- for (;;) {
- red_channel_push(&worker->cursor_channel->common.base);
- if (!cursor_is_connected(worker)
- || red_channel_min_pipe_size(cursor_red_channel) <= MAX_PIPE_SIZE) {
- break;
- }
- RedChannel *channel = (RedChannel *)worker->cursor_channel;
- red_channel_receive(channel);
- red_channel_send(channel);
- if (red_now() >= end_time) {
- spice_warning("flush cursor timeout");
- red_disconnect_cursor(channel);
- } else {
- sleep_count++;
- usleep(DISPLAY_CLIENT_RETRY_INTERVAL);
- }
- }
- }
-}
-
-// TODO: on timeout, don't disconnect all channels immediatly - try to disconnect the slowest ones
-// first and maybe turn timeouts to several timeouts in order to disconnect channels gradually.
-// Should use disconnect or shutdown?
-static inline void flush_all_qxl_commands(RedWorker *worker)
-{
- flush_display_commands(worker);
- flush_cursor_commands(worker);
-}
-
-static void push_new_primary_surface(DisplayChannelClient *dcc)
-{
- RedChannelClient *rcc = &dcc->common.base;
-
- red_channel_client_pipe_add_type(rcc, PIPE_ITEM_TYPE_INVAL_PALLET_CACHE);
- red_create_surface_item(dcc, 0);
- red_channel_client_push(rcc);
-}
-
-/* TODO: this function is evil^Wsynchronous, fix */
-static int display_channel_client_wait_for_init(DisplayChannelClient *dcc)
-{
- dcc->expect_init = TRUE;
- uint64_t end_time = red_now() + DISPLAY_CLIENT_TIMEOUT;
- for (;;) {
- red_channel_client_receive(&dcc->common.base);
- if (!red_channel_client_is_connected(&dcc->common.base)) {
- break;
- }
- if (dcc->pixmap_cache && dcc->glz_dict) {
- dcc->pixmap_cache_generation = dcc->pixmap_cache->generation;
- /* TODO: move common.id? if it's used for a per client structure.. */
- spice_info("creating encoder with id == %d", dcc->common.id);
- dcc->glz = glz_encoder_create(dcc->common.id, dcc->glz_dict->dict, &dcc->glz_data.usr);
- if (!dcc->glz) {
- spice_critical("create global lz failed");
- }
- return TRUE;
- }
- if (red_now() > end_time) {
- spice_warning("timeout");
- red_channel_client_disconnect(&dcc->common.base);
- break;
- }
- usleep(DISPLAY_CLIENT_RETRY_INTERVAL);
- }
- return FALSE;
-}
-
-static void on_new_display_channel_client(DisplayChannelClient *dcc)
-{
- DisplayChannel *display_channel = DCC_TO_DC(dcc);
- RedWorker *worker = display_channel->common.worker;
- RedChannelClient *rcc = &dcc->common.base;
-
- red_channel_client_push_set_ack(&dcc->common.base);
-
- if (red_channel_client_waits_for_migrate_data(rcc)) {
- return;
- }
-
- if (!display_channel_client_wait_for_init(dcc)) {
- return;
- }
- red_channel_client_ack_zero_messages_window(&dcc->common.base);
- if (worker->surfaces[0].context.canvas) {
- red_current_flush(worker, 0);
- push_new_primary_surface(dcc);
- red_push_surface_image(dcc, 0);
- red_push_monitors_config(dcc);
- red_pipe_add_verb(rcc, SPICE_MSG_DISPLAY_MARK);
- red_disply_start_streams(dcc);
- }
-}
-
-static GlzSharedDictionary *_red_find_glz_dictionary(RedClient *client, uint8_t dict_id)
-{
- RingItem *now;
- GlzSharedDictionary *ret = NULL;
-
- now = &glz_dictionary_list;
- while ((now = ring_next(&glz_dictionary_list, now))) {
- GlzSharedDictionary *dict = (GlzSharedDictionary *)now;
- if ((dict->client == client) && (dict->id == dict_id)) {
- ret = dict;
- break;
- }
- }
-
- return ret;
-}
-
-static GlzSharedDictionary *_red_create_glz_dictionary(RedClient *client, uint8_t id,
- GlzEncDictContext *opaque_dict)
-{
- GlzSharedDictionary *shared_dict = spice_new0(GlzSharedDictionary, 1);
- shared_dict->dict = opaque_dict;
- shared_dict->id = id;
- shared_dict->refs = 1;
- shared_dict->migrate_freeze = FALSE;
- shared_dict->client = client;
- ring_item_init(&shared_dict->base);
- pthread_rwlock_init(&shared_dict->encode_lock, NULL);
- return shared_dict;
-}
-
-static GlzSharedDictionary *red_create_glz_dictionary(DisplayChannelClient *dcc,
- uint8_t id, int window_size)
-{
- GlzEncDictContext *glz_dict = glz_enc_dictionary_create(window_size,
- MAX_LZ_ENCODERS,
- &dcc->glz_data.usr);
-#ifdef COMPRESS_DEBUG
- spice_info("Lz Window %d Size=%d", id, window_size);
-#endif
- if (!glz_dict) {
- spice_critical("failed creating lz dictionary");
- return NULL;
- }
- return _red_create_glz_dictionary(dcc->common.base.client, id, glz_dict);
-}
-
-static GlzSharedDictionary *red_create_restored_glz_dictionary(DisplayChannelClient *dcc,
- uint8_t id,
- GlzEncDictRestoreData *restore_data)
-{
- GlzEncDictContext *glz_dict = glz_enc_dictionary_restore(restore_data,
- &dcc->glz_data.usr);
- if (!glz_dict) {
- spice_critical("failed creating lz dictionary");
- return NULL;
- }
- return _red_create_glz_dictionary(dcc->common.base.client, id, glz_dict);
-}
-
-static GlzSharedDictionary *red_get_glz_dictionary(DisplayChannelClient *dcc,
- uint8_t id, int window_size)
-{
- GlzSharedDictionary *shared_dict = NULL;
-
- pthread_mutex_lock(&glz_dictionary_list_lock);
-
- shared_dict = _red_find_glz_dictionary(dcc->common.base.client, id);
-
- if (!shared_dict) {
- shared_dict = red_create_glz_dictionary(dcc, id, window_size);
- ring_add(&glz_dictionary_list, &shared_dict->base);
- } else {
- shared_dict->refs++;
- }
- pthread_mutex_unlock(&glz_dictionary_list_lock);
- return shared_dict;
-}
-
-static GlzSharedDictionary *red_restore_glz_dictionary(DisplayChannelClient *dcc,
- uint8_t id,
- GlzEncDictRestoreData *restore_data)
-{
- GlzSharedDictionary *shared_dict = NULL;
-
- pthread_mutex_lock(&glz_dictionary_list_lock);
-
- shared_dict = _red_find_glz_dictionary(dcc->common.base.client, id);
-
- if (!shared_dict) {
- shared_dict = red_create_restored_glz_dictionary(dcc, id, restore_data);
- ring_add(&glz_dictionary_list, &shared_dict->base);
- } else {
- shared_dict->refs++;
- }
- pthread_mutex_unlock(&glz_dictionary_list_lock);
- return shared_dict;
-}
-
-static void red_freeze_glz(DisplayChannelClient *dcc)
-{
- pthread_rwlock_wrlock(&dcc->glz_dict->encode_lock);
- if (!dcc->glz_dict->migrate_freeze) {
- dcc->glz_dict->migrate_freeze = TRUE;
- }
- pthread_rwlock_unlock(&dcc->glz_dict->encode_lock);
-}
-
-/* destroy encoder, and dictionary if no one uses it*/
-static void red_release_glz(DisplayChannelClient *dcc)
-{
- GlzSharedDictionary *shared_dict;
-
- red_display_client_clear_glz_drawables(dcc);
-
- glz_encoder_destroy(dcc->glz);
- dcc->glz = NULL;
-
- if (!(shared_dict = dcc->glz_dict)) {
- return;
- }
-
- dcc->glz_dict = NULL;
- pthread_mutex_lock(&glz_dictionary_list_lock);
- if (--shared_dict->refs) {
- pthread_mutex_unlock(&glz_dictionary_list_lock);
- return;
- }
- ring_remove(&shared_dict->base);
- pthread_mutex_unlock(&glz_dictionary_list_lock);
- glz_enc_dictionary_destroy(shared_dict->dict, &dcc->glz_data.usr);
- free(shared_dict);
-}
-
-static PixmapCache *red_create_pixmap_cache(RedClient *client, uint8_t id, int64_t size)
-{
- PixmapCache *cache = spice_new0(PixmapCache, 1);
- ring_item_init(&cache->base);
- pthread_mutex_init(&cache->lock, NULL);
- cache->id = id;
- cache->refs = 1;
- ring_init(&cache->lru);
- cache->available = size;
- cache->size = size;
- cache->client = client;
- return cache;
-}
-
-static PixmapCache *red_get_pixmap_cache(RedClient *client, uint8_t id, int64_t size)
-{
- PixmapCache *ret = NULL;
- RingItem *now;
- pthread_mutex_lock(&cache_lock);
-
- now = &pixmap_cache_list;
- while ((now = ring_next(&pixmap_cache_list, now))) {
- PixmapCache *cache = (PixmapCache *)now;
- if ((cache->client == client) && (cache->id == id)) {
- ret = cache;
- ret->refs++;
- break;
- }
- }
- if (!ret) {
- ret = red_create_pixmap_cache(client, id, size);
- ring_add(&pixmap_cache_list, &ret->base);
- }
- pthread_mutex_unlock(&cache_lock);
- return ret;
-}
-
-static void red_release_pixmap_cache(DisplayChannelClient *dcc)
-{
- PixmapCache *cache;
- if (!(cache = dcc->pixmap_cache)) {
- return;
- }
- dcc->pixmap_cache = NULL;
- pthread_mutex_lock(&cache_lock);
- if (--cache->refs) {
- pthread_mutex_unlock(&cache_lock);
- return;
- }
- ring_remove(&cache->base);
- pthread_mutex_unlock(&cache_lock);
- pixmap_cache_destroy(cache);
- free(cache);
-}
-
-static int display_channel_init_cache(DisplayChannelClient *dcc, SpiceMsgcDisplayInit *init_info)
-{
- spice_assert(!dcc->pixmap_cache);
- return !!(dcc->pixmap_cache = red_get_pixmap_cache(dcc->common.base.client,
- init_info->pixmap_cache_id,
- init_info->pixmap_cache_size));
-}
-
-static int display_channel_init_glz_dictionary(DisplayChannelClient *dcc,
- SpiceMsgcDisplayInit *init_info)
-{
- spice_assert(!dcc->glz_dict);
- ring_init(&dcc->glz_drawables);
- ring_init(&dcc->glz_drawables_inst_to_free);
- pthread_mutex_init(&dcc->glz_drawables_inst_to_free_lock, NULL);
- return !!(dcc->glz_dict = red_get_glz_dictionary(dcc,
- init_info->glz_dictionary_id,
- init_info->glz_dictionary_window_size));
-}
-
-static int display_channel_init(DisplayChannelClient *dcc, SpiceMsgcDisplayInit *init_info)
-{
- return (display_channel_init_cache(dcc, init_info) &&
- display_channel_init_glz_dictionary(dcc, init_info));
-}
-
-static int display_channel_handle_migrate_glz_dictionary(DisplayChannelClient *dcc,
- SpiceMigrateDataDisplay *migrate_info)
-{
- spice_assert(!dcc->glz_dict);
- ring_init(&dcc->glz_drawables);
- ring_init(&dcc->glz_drawables_inst_to_free);
- pthread_mutex_init(&dcc->glz_drawables_inst_to_free_lock, NULL);
- return !!(dcc->glz_dict = red_restore_glz_dictionary(dcc,
- migrate_info->glz_dict_id,
- &migrate_info->glz_dict_data));
-}
-
-static int display_channel_handle_migrate_mark(RedChannelClient *rcc)
-{
- DisplayChannel *display_channel = SPICE_CONTAINEROF(rcc->channel, DisplayChannel, common.base);
- RedChannel *channel = &display_channel->common.base;
-
- red_channel_pipes_add_type(channel, PIPE_ITEM_TYPE_MIGRATE_DATA);
- return TRUE;
-}
-
-static uint64_t display_channel_handle_migrate_data_get_serial(
- RedChannelClient *rcc, uint32_t size, void *message)
-{
- SpiceMigrateDataDisplay *migrate_data;
-
- migrate_data = (SpiceMigrateDataDisplay *)((uint8_t *)message + sizeof(SpiceMigrateDataHeader));
-
- return migrate_data->message_serial;
-}
-
-static int display_channel_client_restore_surface(DisplayChannelClient *dcc, uint32_t surface_id)
-{
- /* we don't process commands till we receive the migration data, thus,
- * we should have not sent any surface to the client. */
- if (dcc->surface_client_created[surface_id]) {
- spice_warning("surface %u is already marked as client_created", surface_id);
- return FALSE;
- }
- dcc->surface_client_created[surface_id] = TRUE;
- return TRUE;
-}
-
-static int display_channel_client_restore_surfaces_lossless(DisplayChannelClient *dcc,
- MigrateDisplaySurfacesAtClientLossless *mig_surfaces)
-{
- uint32_t i;
-
- spice_debug(NULL);
- for (i = 0; i < mig_surfaces->num_surfaces; i++) {
- uint32_t surface_id = mig_surfaces->surfaces[i].id;
-
- if (!display_channel_client_restore_surface(dcc, surface_id)) {
- return FALSE;
- }
- }
- return TRUE;
-}
-
-static int display_channel_client_restore_surfaces_lossy(DisplayChannelClient *dcc,
- MigrateDisplaySurfacesAtClientLossy *mig_surfaces)
-{
- uint32_t i;
-
- spice_debug(NULL);
- for (i = 0; i < mig_surfaces->num_surfaces; i++) {
- uint32_t surface_id = mig_surfaces->surfaces[i].id;
- SpiceMigrateDataRect *mig_lossy_rect;
- SpiceRect lossy_rect;
-
- if (!display_channel_client_restore_surface(dcc, surface_id)) {
- return FALSE;
- }
- spice_assert(dcc->surface_client_created[surface_id]);
-
- mig_lossy_rect = &mig_surfaces->surfaces[i].lossy_rect;
- lossy_rect.left = mig_lossy_rect->left;
- lossy_rect.top = mig_lossy_rect->top;
- lossy_rect.right = mig_lossy_rect->right;
- lossy_rect.bottom = mig_lossy_rect->bottom;
- region_init(&dcc->surface_client_lossy_region[surface_id]);
- region_add(&dcc->surface_client_lossy_region[surface_id], &lossy_rect);
- }
- return TRUE;
-}
-static int display_channel_handle_migrate_data(RedChannelClient *rcc, uint32_t size,
- void *message)
-{
- SpiceMigrateDataHeader *header;
- SpiceMigrateDataDisplay *migrate_data;
- DisplayChannel *display_channel = SPICE_CONTAINEROF(rcc->channel, DisplayChannel, common.base);
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
- uint8_t *surfaces;
- int surfaces_restored = FALSE;
- int i;
-
- spice_debug(NULL);
- if (size < sizeof(*migrate_data) + sizeof(SpiceMigrateDataHeader)) {
- spice_error("bad message size");
- return FALSE;
- }
- header = (SpiceMigrateDataHeader *)message;
- migrate_data = (SpiceMigrateDataDisplay *)(header + 1);
- if (!migration_protocol_validate_header(header,
- SPICE_MIGRATE_DATA_DISPLAY_MAGIC,
- SPICE_MIGRATE_DATA_DISPLAY_VERSION)) {
- spice_error("bad header");
- return FALSE;
- }
- /* size is set to -1 in order to keep the cache frozen until the original
- * channel client that froze the cache on the src size receives the migrate
- * data and unfreezes the cache by setting its size > 0 and by triggering
- * pixmap_cache_reset */
- dcc->pixmap_cache = red_get_pixmap_cache(dcc->common.base.client,
- migrate_data->pixmap_cache_id, -1);
- if (!dcc->pixmap_cache) {
- return FALSE;
- }
- pthread_mutex_lock(&dcc->pixmap_cache->lock);
- for (i = 0; i < MAX_CACHE_CLIENTS; i++) {
- dcc->pixmap_cache->sync[i] = MAX(dcc->pixmap_cache->sync[i],
- migrate_data->pixmap_cache_clients[i]);
- }
- pthread_mutex_unlock(&dcc->pixmap_cache->lock);
-
- if (migrate_data->pixmap_cache_freezer) {
- /* activating the cache. The cache will start to be active after
- * pixmap_cache_reset is called, when handling PIPE_ITEM_TYPE_PIXMAP_RESET */
- dcc->pixmap_cache->size = migrate_data->pixmap_cache_size;
- red_channel_client_pipe_add_type(rcc,
- PIPE_ITEM_TYPE_PIXMAP_RESET);
- }
-
- if (display_channel_handle_migrate_glz_dictionary(dcc, migrate_data)) {
- dcc->glz = glz_encoder_create(dcc->common.id,
- dcc->glz_dict->dict, &dcc->glz_data.usr);
- if (!dcc->glz) {
- spice_critical("create global lz failed");
- }
- } else {
- spice_critical("restoring global lz dictionary failed");
- }
-
- dcc->common.is_low_bandwidth = migrate_data->low_bandwidth_setting;
-
- if (migrate_data->low_bandwidth_setting) {
- red_channel_client_ack_set_client_window(rcc, WIDE_CLIENT_ACK_WINDOW);
- if (dcc->common.worker->jpeg_state == SPICE_WAN_COMPRESSION_AUTO) {
- display_channel->enable_jpeg = TRUE;
- }
- if (dcc->common.worker->zlib_glz_state == SPICE_WAN_COMPRESSION_AUTO) {
- display_channel->enable_zlib_glz_wrap = TRUE;
- }
- }
-
- surfaces = (uint8_t *)message + migrate_data->surfaces_at_client_ptr;
- if (display_channel->enable_jpeg) {
- surfaces_restored = display_channel_client_restore_surfaces_lossy(dcc,
- (MigrateDisplaySurfacesAtClientLossy *)surfaces);
- } else {
- surfaces_restored = display_channel_client_restore_surfaces_lossless(dcc,
- (MigrateDisplaySurfacesAtClientLossless*)surfaces);
- }
-
- if (!surfaces_restored) {
- return FALSE;
- }
- red_channel_client_pipe_add_type(rcc, PIPE_ITEM_TYPE_INVAL_PALLET_CACHE);
- /* enable sending messages */
- red_channel_client_ack_zero_messages_window(rcc);
- return TRUE;
-}
-
-static int display_channel_handle_stream_report(DisplayChannelClient *dcc,
- SpiceMsgcDisplayStreamReport *stream_report)
-{
- StreamAgent *stream_agent;
-
- if (stream_report->stream_id >= NUM_STREAMS) {
- spice_warning("stream_report: invalid stream id %u", stream_report->stream_id);
- return FALSE;
- }
- stream_agent = &dcc->stream_agents[stream_report->stream_id];
- if (!stream_agent->mjpeg_encoder) {
- spice_info("stream_report: no encoder for stream id %u."
- "Probably the stream has been destroyed", stream_report->stream_id);
- return TRUE;
- }
-
- if (stream_report->unique_id != stream_agent->report_id) {
- spice_warning("local reoprt-id (%u) != msg report-id (%u)",
- stream_agent->report_id, stream_report->unique_id);
- return TRUE;
- }
- mjpeg_encoder_client_stream_report(stream_agent->mjpeg_encoder,
- stream_report->num_frames,
- stream_report->num_drops,
- stream_report->start_frame_mm_time,
- stream_report->end_frame_mm_time,
- stream_report->last_frame_delay,
- stream_report->audio_delay);
- return TRUE;
-}
-
-static int display_channel_handle_message(RedChannelClient *rcc, uint32_t size, uint16_t type,
- void *message)
-{
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
-
- switch (type) {
- case SPICE_MSGC_DISPLAY_INIT:
- if (!dcc->expect_init) {
- spice_warning("unexpected SPICE_MSGC_DISPLAY_INIT");
- return FALSE;
- }
- dcc->expect_init = FALSE;
- return display_channel_init(dcc, (SpiceMsgcDisplayInit *)message);
- case SPICE_MSGC_DISPLAY_STREAM_REPORT:
- return display_channel_handle_stream_report(dcc,
- (SpiceMsgcDisplayStreamReport *)message);
- default:
- return red_channel_client_handle_message(rcc, size, type, message);
- }
-}
-
-static int common_channel_config_socket(RedChannelClient *rcc)
-{
- RedClient *client = red_channel_client_get_client(rcc);
- MainChannelClient *mcc = red_client_get_main(client);
- RedsStream *stream = red_channel_client_get_stream(rcc);
- CommonChannelClient *ccc = SPICE_CONTAINEROF(rcc, CommonChannelClient, base);
- int flags;
- int delay_val;
-
- if ((flags = fcntl(stream->socket, F_GETFL)) == -1) {
- spice_warning("accept failed, %s", strerror(errno));
- return FALSE;
- }
-
- if (fcntl(stream->socket, F_SETFL, flags | O_NONBLOCK) == -1) {
- spice_warning("accept failed, %s", strerror(errno));
- return FALSE;
- }
-
- // TODO - this should be dynamic, not one time at channel creation
- ccc->is_low_bandwidth = main_channel_client_is_low_bandwidth(mcc);
- delay_val = ccc->is_low_bandwidth ? 0 : 1;
- /* FIXME: Using Nagle's Algorithm can lead to apparent delays, depending
- * on the delayed ack timeout on the other side.
- * Instead of using Nagle's, we need to implement message buffering on
- * the application level.
- * see: http://www.stuartcheshire.org/papers/NagleDelayedAck/
- */
- if (setsockopt(stream->socket, IPPROTO_TCP, TCP_NODELAY, &delay_val,
- sizeof(delay_val)) == -1) {
- if (errno != ENOTSUP) {
- spice_warning("setsockopt failed, %s", strerror(errno));
- }
- }
- return TRUE;
-}
-
-static void worker_watch_update_mask(SpiceWatch *watch, int event_mask)
-{
- struct RedWorker *worker;
- int i;
-
- if (!watch) {
- return;
- }
-
- worker = watch->worker;
- i = watch - worker->watches;
-
- worker->poll_fds[i].events = 0;
- if (event_mask & SPICE_WATCH_EVENT_READ) {
- worker->poll_fds[i].events |= POLLIN;
- }
- if (event_mask & SPICE_WATCH_EVENT_WRITE) {
- worker->poll_fds[i].events |= POLLOUT;
- }
-}
-
-static SpiceWatch *worker_watch_add(int fd, int event_mask, SpiceWatchFunc func, void *opaque)
-{
- /* Since we are a channel core implementation, we always get called from
- red_channel_client_create(), so opaque always is our rcc */
- RedChannelClient *rcc = opaque;
- struct RedWorker *worker;
- int i;
-
- /* Since we are called from red_channel_client_create()
- CommonChannelClient->worker has not been set yet! */
- worker = SPICE_CONTAINEROF(rcc->channel, CommonChannel, base)->worker;
-
- /* Search for a free slot in our poll_fds & watches arrays */
- for (i = 0; i < MAX_EVENT_SOURCES; i++) {
- if (worker->poll_fds[i].fd == -1) {
- break;
- }
- }
- if (i == MAX_EVENT_SOURCES) {
- spice_warning("could not add a watch for channel type %u id %u",
- rcc->channel->type, rcc->channel->id);
- return NULL;
- }
-
- worker->poll_fds[i].fd = fd;
- worker->watches[i].worker = worker;
- worker->watches[i].watch_func = func;
- worker->watches[i].watch_func_opaque = opaque;
- worker_watch_update_mask(&worker->watches[i], event_mask);
-
- return &worker->watches[i];
-}
-
-static void worker_watch_remove(SpiceWatch *watch)
-{
- if (!watch) {
- return;
- }
-
- /* Note we don't touch the poll_fd here, to avoid the
- poll_fds/watches table entry getting re-used in the same
- red_worker_main loop over the fds as it is removed.
-
- This is done because re-using it while events were pending on
- the fd previously occupying the slot would lead to incorrectly
- calling the watch_func for the new fd. */
- memset(watch, 0, sizeof(SpiceWatch));
-}
-
-SpiceCoreInterface worker_core = {
- .timer_add = spice_timer_queue_add,
- .timer_start = spice_timer_set,
- .timer_cancel = spice_timer_cancel,
- .timer_remove = spice_timer_remove,
-
- .watch_update_mask = worker_watch_update_mask,
- .watch_add = worker_watch_add,
- .watch_remove = worker_watch_remove,
-};
-
-static CommonChannelClient *common_channel_client_create(int size,
- CommonChannel *common,
- RedClient *client,
- RedsStream *stream,
- int mig_target,
- int monitor_latency,
- uint32_t *common_caps,
- int num_common_caps,
- uint32_t *caps,
- int num_caps)
-{
- RedChannelClient *rcc =
- red_channel_client_create(size, &common->base, client, stream, monitor_latency,
- num_common_caps, common_caps, num_caps, caps);
- if (!rcc) {
- return NULL;
- }
- CommonChannelClient *common_cc = (CommonChannelClient*)rcc;
- common_cc->worker = common->worker;
- common_cc->id = common->worker->id;
- common->during_target_migrate = mig_target;
-
- // TODO: move wide/narrow ack setting to red_channel.
- red_channel_client_ack_set_client_window(rcc,
- common_cc->is_low_bandwidth ?
- WIDE_CLIENT_ACK_WINDOW : NARROW_CLIENT_ACK_WINDOW);
- return common_cc;
-}
-
-
-DisplayChannelClient *display_channel_client_create(CommonChannel *common,
- RedClient *client, RedsStream *stream,
- int mig_target,
- uint32_t *common_caps, int num_common_caps,
- uint32_t *caps, int num_caps)
-{
- DisplayChannelClient *dcc =
- (DisplayChannelClient*)common_channel_client_create(
- sizeof(DisplayChannelClient), common, client, stream,
- mig_target,
- TRUE,
- common_caps, num_common_caps,
- caps, num_caps);
-
- if (!dcc) {
- return NULL;
- }
- ring_init(&dcc->palette_cache_lru);
- dcc->palette_cache_available = CLIENT_PALETTE_CACHE_SIZE;
- return dcc;
-}
-
-CursorChannelClient *cursor_channel_create_rcc(CommonChannel *common,
- RedClient *client, RedsStream *stream,
- int mig_target,
- uint32_t *common_caps, int num_common_caps,
- uint32_t *caps, int num_caps)
-{
- CursorChannelClient *ccc =
- (CursorChannelClient*)common_channel_client_create(
- sizeof(CursorChannelClient), common, client, stream,
- mig_target,
- FALSE,
- common_caps,
- num_common_caps,
- caps,
- num_caps);
-
- if (!ccc) {
- return NULL;
- }
- ring_init(&ccc->cursor_cache_lru);
- ccc->cursor_cache_available = CLIENT_CURSOR_CACHE_SIZE;
- return ccc;
-}
-
-static RedChannel *__new_channel(RedWorker *worker, int size, uint32_t channel_type,
- int migration_flags,
- channel_disconnect_proc on_disconnect,
- channel_send_pipe_item_proc send_item,
- channel_hold_pipe_item_proc hold_item,
- channel_release_pipe_item_proc release_item,
- channel_handle_parsed_proc handle_parsed,
- channel_handle_migrate_flush_mark_proc handle_migrate_flush_mark,
- channel_handle_migrate_data_proc handle_migrate_data,
- channel_handle_migrate_data_get_serial_proc migrate_get_serial)
-{
- RedChannel *channel = NULL;
- CommonChannel *common;
- ChannelCbs channel_cbs = { NULL, };
-
- channel_cbs.config_socket = common_channel_config_socket;
- channel_cbs.on_disconnect = on_disconnect;
- channel_cbs.send_item = send_item;
- channel_cbs.hold_item = hold_item;
- channel_cbs.release_item = release_item;
- channel_cbs.alloc_recv_buf = common_alloc_recv_buf;
- channel_cbs.release_recv_buf = common_release_recv_buf;
- channel_cbs.handle_migrate_flush_mark = handle_migrate_flush_mark;
- channel_cbs.handle_migrate_data = handle_migrate_data;
- channel_cbs.handle_migrate_data_get_serial = migrate_get_serial;
-
- channel = red_channel_create_parser(size, &worker_core,
- channel_type, worker->id,
- TRUE /* handle_acks */,
- spice_get_client_channel_parser(channel_type, NULL),
- handle_parsed,
- &channel_cbs,
- migration_flags);
- common = (CommonChannel *)channel;
- if (!channel) {
- goto error;
- }
- common->worker = worker;
- return channel;
-
-error:
- free(channel);
- return NULL;
-}
-
-static void display_channel_hold_pipe_item(RedChannelClient *rcc, PipeItem *item)
-{
- spice_assert(item);
- switch (item->type) {
- case PIPE_ITEM_TYPE_DRAW:
- ref_drawable_pipe_item(SPICE_CONTAINEROF(item, DrawablePipeItem, dpi_pipe_item));
- break;
- case PIPE_ITEM_TYPE_STREAM_CLIP:
- ((StreamClipItem *)item)->refs++;
- break;
- case PIPE_ITEM_TYPE_UPGRADE:
- ((UpgradeItem *)item)->refs++;
- break;
- case PIPE_ITEM_TYPE_IMAGE:
- ((ImageItem *)item)->refs++;
- break;
- default:
- spice_critical("invalid item type");
- }
-}
-
-static void display_channel_client_release_item_after_push(DisplayChannelClient *dcc,
- PipeItem *item)
-{
- RedWorker *worker = dcc->common.worker;
-
- switch (item->type) {
- case PIPE_ITEM_TYPE_DRAW:
- put_drawable_pipe_item(SPICE_CONTAINEROF(item, DrawablePipeItem, dpi_pipe_item));
- break;
- case PIPE_ITEM_TYPE_STREAM_CLIP:
- red_display_release_stream_clip(worker, (StreamClipItem *)item);
- break;
- case PIPE_ITEM_TYPE_UPGRADE:
- release_upgrade_item(worker, (UpgradeItem *)item);
- break;
- case PIPE_ITEM_TYPE_IMAGE:
- release_image_item((ImageItem *)item);
- break;
- case PIPE_ITEM_TYPE_VERB:
- free(item);
- break;
- case PIPE_ITEM_TYPE_MONITORS_CONFIG: {
- MonitorsConfigItem *monconf_item = SPICE_CONTAINEROF(item,
- MonitorsConfigItem, pipe_item);
- monitors_config_decref(monconf_item->monitors_config);
- free(item);
- break;
- }
- default:
- spice_critical("invalid item type");
- }
-}
-
-// TODO: share code between before/after_push since most of the items need the same
-// release
-static void display_channel_client_release_item_before_push(DisplayChannelClient *dcc,
- PipeItem *item)
-{
- RedWorker *worker = dcc->common.worker;
-
- switch (item->type) {
- case PIPE_ITEM_TYPE_DRAW: {
- DrawablePipeItem *dpi = SPICE_CONTAINEROF(item, DrawablePipeItem, dpi_pipe_item);
- ring_remove(&dpi->base);
- put_drawable_pipe_item(dpi);
- break;
- }
- case PIPE_ITEM_TYPE_STREAM_CREATE: {
- StreamAgent *agent = SPICE_CONTAINEROF(item, StreamAgent, create_item);
- red_display_release_stream(worker, agent);
- break;
- }
- case PIPE_ITEM_TYPE_STREAM_CLIP:
- red_display_release_stream_clip(worker, (StreamClipItem *)item);
- break;
- case PIPE_ITEM_TYPE_STREAM_DESTROY: {
- StreamAgent *agent = SPICE_CONTAINEROF(item, StreamAgent, destroy_item);
- red_display_release_stream(worker, agent);
- break;
- }
- case PIPE_ITEM_TYPE_UPGRADE:
- release_upgrade_item(worker, (UpgradeItem *)item);
- break;
- case PIPE_ITEM_TYPE_IMAGE:
- release_image_item((ImageItem *)item);
- break;
- case PIPE_ITEM_TYPE_CREATE_SURFACE: {
- SurfaceCreateItem *surface_create = SPICE_CONTAINEROF(item, SurfaceCreateItem,
- pipe_item);
- free(surface_create);
- break;
- }
- case PIPE_ITEM_TYPE_DESTROY_SURFACE: {
- SurfaceDestroyItem *surface_destroy = SPICE_CONTAINEROF(item, SurfaceDestroyItem,
- pipe_item);
- free(surface_destroy);
- break;
- }
- case PIPE_ITEM_TYPE_MONITORS_CONFIG: {
- MonitorsConfigItem *monconf_item = SPICE_CONTAINEROF(item,
- MonitorsConfigItem, pipe_item);
- monitors_config_decref(monconf_item->monitors_config);
- free(item);
- break;
- }
- case PIPE_ITEM_TYPE_INVAL_ONE:
- case PIPE_ITEM_TYPE_VERB:
- case PIPE_ITEM_TYPE_MIGRATE_DATA:
- case PIPE_ITEM_TYPE_PIXMAP_SYNC:
- case PIPE_ITEM_TYPE_PIXMAP_RESET:
- case PIPE_ITEM_TYPE_INVAL_PALLET_CACHE:
- case PIPE_ITEM_TYPE_STREAM_ACTIVATE_REPORT:
- free(item);
- break;
- default:
- spice_critical("invalid item type");
- }
-}
-
-static void display_channel_release_item(RedChannelClient *rcc, PipeItem *item, int item_pushed)
-{
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
-
- spice_assert(item);
- if (item_pushed) {
- display_channel_client_release_item_after_push(dcc, item);
- } else {
- spice_debug("not pushed (%d)", item->type);
- display_channel_client_release_item_before_push(dcc, item);
- }
-}
-
-static void display_channel_create(RedWorker *worker, int migrate)
-{
- DisplayChannel *display_channel;
-
- if (worker->display_channel) {
- return;
- }
-
- spice_info("create display channel");
- if (!(worker->display_channel = (DisplayChannel *)__new_channel(
- worker, sizeof(*display_channel),
- SPICE_CHANNEL_DISPLAY,
- SPICE_MIGRATE_NEED_FLUSH | SPICE_MIGRATE_NEED_DATA_TRANSFER,
- display_channel_client_on_disconnect,
- display_channel_send_item,
- display_channel_hold_pipe_item,
- display_channel_release_item,
- display_channel_handle_message,
- display_channel_handle_migrate_mark,
- display_channel_handle_migrate_data,
- display_channel_handle_migrate_data_get_serial
- ))) {
- spice_warning("failed to create display channel");
- return;
- }
- display_channel = worker->display_channel;
-#ifdef RED_STATISTICS
- display_channel->stat = stat_add_node(worker->stat, "display_channel", TRUE);
- display_channel->common.base.out_bytes_counter = stat_add_counter(display_channel->stat,
- "out_bytes", TRUE);
- display_channel->cache_hits_counter = stat_add_counter(display_channel->stat,
- "cache_hits", TRUE);
- display_channel->add_to_cache_counter = stat_add_counter(display_channel->stat,
- "add_to_cache", TRUE);
- display_channel->non_cache_counter = stat_add_counter(display_channel->stat,
- "non_cache", TRUE);
-#endif
- stat_compress_init(&display_channel->lz_stat, lz_stat_name);
- stat_compress_init(&display_channel->glz_stat, glz_stat_name);
- stat_compress_init(&display_channel->quic_stat, quic_stat_name);
- stat_compress_init(&display_channel->jpeg_stat, jpeg_stat_name);
- stat_compress_init(&display_channel->zlib_glz_stat, zlib_stat_name);
- stat_compress_init(&display_channel->jpeg_alpha_stat, jpeg_alpha_stat_name);
-}
-
-static void guest_set_client_capabilities(RedWorker *worker)
-{
- int i;
- DisplayChannelClient *dcc;
- RedChannelClient *rcc;
- RingItem *link, *next;
- uint8_t caps[58] = { 0 };
- int caps_available[] = {
- SPICE_DISPLAY_CAP_SIZED_STREAM,
- SPICE_DISPLAY_CAP_MONITORS_CONFIG,
- SPICE_DISPLAY_CAP_COMPOSITE,
- SPICE_DISPLAY_CAP_A8_SURFACE,
- };
-
- if (worker->qxl->st->qif->base.major_version < 3 ||
- (worker->qxl->st->qif->base.major_version == 3 &&
- worker->qxl->st->qif->base.minor_version < 2) ||
- !worker->qxl->st->qif->set_client_capabilities) {
- return;
- }
-#define SET_CAP(a,c) \
- ((a)[(c) / 8] |= (1 << ((c) % 8)))
-
-#define CLEAR_CAP(a,c) \
- ((a)[(c) / 8] &= ~(1 << ((c) % 8)))
-
- if (!worker->running) {
- worker->set_client_capabilities_pending = 1;
- return;
- }
- if ((worker->display_channel == NULL) ||
- (worker->display_channel->common.base.clients_num == 0)) {
- worker->qxl->st->qif->set_client_capabilities(worker->qxl, FALSE, caps);
- } else {
- // Take least common denominator
- for (i = 0 ; i < sizeof(caps_available) / sizeof(caps_available[0]); ++i) {
- SET_CAP(caps, caps_available[i]);
- }
- DCC_FOREACH_SAFE(link, next, dcc, &worker->display_channel->common.base) {
- rcc = (RedChannelClient *)dcc;
- for (i = 0 ; i < sizeof(caps_available) / sizeof(caps_available[0]); ++i) {
- if (!red_channel_client_test_remote_cap(rcc, caps_available[i]))
- CLEAR_CAP(caps, caps_available[i]);
- }
- }
- worker->qxl->st->qif->set_client_capabilities(worker->qxl, TRUE, caps);
- }
- worker->set_client_capabilities_pending = 0;
-}
-
-static void handle_new_display_channel(RedWorker *worker, RedClient *client, RedsStream *stream,
- int migrate,
- uint32_t *common_caps, int num_common_caps,
- uint32_t *caps, int num_caps)
-{
- DisplayChannel *display_channel;
- DisplayChannelClient *dcc;
- size_t stream_buf_size;
-
- if (!worker->display_channel) {
- spice_warning("Display channel was not created");
- return;
- }
- display_channel = worker->display_channel;
- spice_info("add display channel client");
- dcc = display_channel_client_create(&display_channel->common, client, stream,
- migrate,
- common_caps, num_common_caps,
- caps, num_caps);
- if (!dcc) {
- return;
- }
- spice_info("New display (client %p) dcc %p stream %p", client, dcc, stream);
- stream_buf_size = 32*1024;
- dcc->send_data.stream_outbuf = spice_malloc(stream_buf_size);
- dcc->send_data.stream_outbuf_size = stream_buf_size;
- red_display_init_glz_data(dcc);
-
- dcc->send_data.free_list.res =
- spice_malloc(sizeof(SpiceResourceList) +
- DISPLAY_FREE_LIST_DEFAULT_SIZE * sizeof(SpiceResourceID));
- dcc->send_data.free_list.res_size = DISPLAY_FREE_LIST_DEFAULT_SIZE;
-
- if (worker->jpeg_state == SPICE_WAN_COMPRESSION_AUTO) {
- display_channel->enable_jpeg = dcc->common.is_low_bandwidth;
- } else {
- display_channel->enable_jpeg = (worker->jpeg_state == SPICE_WAN_COMPRESSION_ALWAYS);
- }
-
- // todo: tune quality according to bandwidth
- display_channel->jpeg_quality = 85;
-
- if (worker->zlib_glz_state == SPICE_WAN_COMPRESSION_AUTO) {
- display_channel->enable_zlib_glz_wrap = dcc->common.is_low_bandwidth;
- } else {
- display_channel->enable_zlib_glz_wrap = (worker->zlib_glz_state ==
- SPICE_WAN_COMPRESSION_ALWAYS);
- }
-
- spice_info("jpeg %s", display_channel->enable_jpeg ? "enabled" : "disabled");
- spice_info("zlib-over-glz %s", display_channel->enable_zlib_glz_wrap ? "enabled" : "disabled");
-
- guest_set_client_capabilities(worker);
-
- // todo: tune level according to bandwidth
- display_channel->zlib_level = ZLIB_DEFAULT_COMPRESSION_LEVEL;
- red_display_client_init_streams(dcc);
- on_new_display_channel_client(dcc);
-}
-
-static void cursor_channel_client_on_disconnect(RedChannelClient *rcc)
-{
- if (!rcc) {
- return;
- }
- red_reset_cursor_cache(rcc);
-}
-
-static void red_disconnect_cursor(RedChannel *channel)
-{
- CommonChannel *common;
-
- if (!channel || !red_channel_is_connected(channel)) {
- return;
- }
- common = SPICE_CONTAINEROF(channel, CommonChannel, base);
- spice_assert(channel == (RedChannel *)common->worker->cursor_channel);
- common->worker->cursor_channel = NULL;
- red_channel_apply_clients(channel, red_reset_cursor_cache);
- red_channel_disconnect(channel);
-}
-
-static void red_migrate_cursor(RedWorker *worker, RedChannelClient *rcc)
-{
- if (red_channel_client_is_connected(rcc)) {
- red_channel_client_pipe_add_type(rcc,
- PIPE_ITEM_TYPE_INVAL_CURSOR_CACHE);
- red_channel_client_default_migrate(rcc);
- }
-}
-
-static void on_new_cursor_channel(RedWorker *worker, RedChannelClient *rcc)
-{
- CursorChannel *channel = worker->cursor_channel;
-
- spice_assert(channel);
- red_channel_client_ack_zero_messages_window(rcc);
- red_channel_client_push_set_ack(rcc);
- // TODO: why do we check for context.canvas? defer this to after display cc is connected
- // and test it's canvas? this is just a test to see if there is an active renderer?
- if (worker->surfaces[0].context.canvas && !channel->common.during_target_migrate) {
- red_channel_client_pipe_add_type(rcc, PIPE_ITEM_TYPE_CURSOR_INIT);
- }
-}
-
-static void cursor_channel_hold_pipe_item(RedChannelClient *rcc, PipeItem *item)
-{
- CursorPipeItem *cursor_pipe_item;
- spice_assert(item);
- cursor_pipe_item = SPICE_CONTAINEROF(item, CursorPipeItem, base);
- ref_cursor_pipe_item(cursor_pipe_item);
-}
-
-// TODO: share code between before/after_push since most of the items need the same
-// release
-static void cursor_channel_client_release_item_before_push(CursorChannelClient *ccc,
- PipeItem *item)
-{
- switch (item->type) {
- case PIPE_ITEM_TYPE_CURSOR: {
- CursorPipeItem *cursor_pipe_item = SPICE_CONTAINEROF(item, CursorPipeItem, base);
- put_cursor_pipe_item(ccc, cursor_pipe_item);
- break;
- }
- case PIPE_ITEM_TYPE_INVAL_ONE:
- case PIPE_ITEM_TYPE_VERB:
- case PIPE_ITEM_TYPE_CURSOR_INIT:
- case PIPE_ITEM_TYPE_INVAL_CURSOR_CACHE:
- free(item);
- break;
- default:
- spice_error("invalid pipe item type");
- }
-}
-
-static void cursor_channel_client_release_item_after_push(CursorChannelClient *ccc,
- PipeItem *item)
-{
- switch (item->type) {
- case PIPE_ITEM_TYPE_CURSOR: {
- CursorPipeItem *cursor_pipe_item = SPICE_CONTAINEROF(item, CursorPipeItem, base);
- put_cursor_pipe_item(ccc, cursor_pipe_item);
- break;
- }
- default:
- spice_critical("invalid item type");
- }
-}
-
-static void cursor_channel_release_item(RedChannelClient *rcc, PipeItem *item, int item_pushed)
-{
- CursorChannelClient *ccc = RCC_TO_CCC(rcc);
-
- spice_assert(item);
-
- if (item_pushed) {
- cursor_channel_client_release_item_after_push(ccc, item);
- } else {
- spice_debug("not pushed (%d)", item->type);
- cursor_channel_client_release_item_before_push(ccc, item);
- }
-}
-
-static void cursor_channel_create(RedWorker *worker, int migrate)
-{
- if (worker->cursor_channel != NULL) {
- return;
- }
- spice_info("create cursor channel");
- worker->cursor_channel = (CursorChannel *)__new_channel(
- worker, sizeof(*worker->cursor_channel),
- SPICE_CHANNEL_CURSOR,
- 0,
- cursor_channel_client_on_disconnect,
- cursor_channel_send_item,
- cursor_channel_hold_pipe_item,
- cursor_channel_release_item,
- red_channel_client_handle_message,
- NULL,
- NULL,
- NULL);
-}
-
-static void red_connect_cursor(RedWorker *worker, RedClient *client, RedsStream *stream,
- int migrate,
- uint32_t *common_caps, int num_common_caps,
- uint32_t *caps, int num_caps)
-{
- CursorChannel *channel;
- CursorChannelClient *ccc;
-
- if (worker->cursor_channel == NULL) {
- spice_warning("cursor channel was not created");
- return;
- }
- channel = worker->cursor_channel;
- spice_info("add cursor channel client");
- ccc = cursor_channel_create_rcc(&channel->common, client, stream,
- migrate,
- common_caps, num_common_caps,
- caps, num_caps);
- if (!ccc) {
- return;
- }
-#ifdef RED_STATISTICS
- channel->stat = stat_add_node(worker->stat, "cursor_channel", TRUE);
- channel->common.base.out_bytes_counter = stat_add_counter(channel->stat, "out_bytes", TRUE);
-#endif
- on_new_cursor_channel(worker, &ccc->common.base);
-}
-
-typedef struct __attribute__ ((__packed__)) CursorData {
- uint32_t visible;
- SpicePoint16 position;
- uint16_t trail_length;
- uint16_t trail_frequency;
- uint32_t data_size;
- SpiceCursor _cursor;
-} CursorData;
-
-static void surface_dirty_region_to_rects(RedSurface *surface,
- QXLRect *qxl_dirty_rects,
- uint32_t num_dirty_rects,
- int clear_dirty_region)
-{
- QRegion *surface_dirty_region;
- SpiceRect *dirty_rects;
- int i;
-
- surface_dirty_region = &surface->draw_dirty_region;
- dirty_rects = spice_new0(SpiceRect, num_dirty_rects);
- region_ret_rects(surface_dirty_region, dirty_rects, num_dirty_rects);
- if (clear_dirty_region) {
- region_clear(surface_dirty_region);
- }
- for (i = 0; i < num_dirty_rects; i++) {
- qxl_dirty_rects[i].top = dirty_rects[i].top;
- qxl_dirty_rects[i].left = dirty_rects[i].left;
- qxl_dirty_rects[i].bottom = dirty_rects[i].bottom;
- qxl_dirty_rects[i].right = dirty_rects[i].right;
- }
- free(dirty_rects);
-}
-
-void handle_dev_update_async(void *opaque, void *payload)
-{
- RedWorker *worker = opaque;
- RedWorkerMessageUpdateAsync *msg = payload;
- SpiceRect rect;
- QXLRect *qxl_dirty_rects;
- uint32_t num_dirty_rects;
- RedSurface *surface;
- uint32_t surface_id = msg->surface_id;
- QXLRect qxl_area = msg->qxl_area;
- uint32_t clear_dirty_region = msg->clear_dirty_region;
-
- red_get_rect_ptr(&rect, &qxl_area);
- flush_display_commands(worker);
-
- spice_assert(worker->running);
-
- VALIDATE_SURFACE_RET(worker, surface_id);
- red_update_area(worker, &rect, surface_id);
- if (!worker->qxl->st->qif->update_area_complete) {
- return;
- }
- surface = &worker->surfaces[surface_id];
- num_dirty_rects = pixman_region32_n_rects(&surface->draw_dirty_region);
- if (num_dirty_rects == 0) {
- return;
- }
- qxl_dirty_rects = spice_new0(QXLRect, num_dirty_rects);
- surface_dirty_region_to_rects(surface, qxl_dirty_rects, num_dirty_rects,
- clear_dirty_region);
- worker->qxl->st->qif->update_area_complete(worker->qxl, surface_id,
- qxl_dirty_rects, num_dirty_rects);
- free(qxl_dirty_rects);
-}
-
-void handle_dev_update(void *opaque, void *payload)
-{
- RedWorker *worker = opaque;
- RedWorkerMessageUpdate *msg = payload;
- SpiceRect *rect = spice_new0(SpiceRect, 1);
- RedSurface *surface;
- uint32_t surface_id = msg->surface_id;
- const QXLRect *qxl_area = msg->qxl_area;
- uint32_t num_dirty_rects = msg->num_dirty_rects;
- QXLRect *qxl_dirty_rects = msg->qxl_dirty_rects;
- uint32_t clear_dirty_region = msg->clear_dirty_region;
-
- surface = &worker->surfaces[surface_id];
- red_get_rect_ptr(rect, qxl_area);
- flush_display_commands(worker);
-
- spice_assert(worker->running);
-
- if (validate_surface(worker, surface_id)) {
- red_update_area(worker, rect, surface_id);
- } else {
- rendering_incorrect(__func__);
- }
- free(rect);
-
- surface_dirty_region_to_rects(surface, qxl_dirty_rects, num_dirty_rects,
- clear_dirty_region);
-}
-
-static void dev_add_memslot(RedWorker *worker, QXLDevMemSlot mem_slot)
-{
- red_memslot_info_add_slot(&worker->mem_slots, mem_slot.slot_group_id, mem_slot.slot_id,
- mem_slot.addr_delta, mem_slot.virt_start, mem_slot.virt_end,
- mem_slot.generation);
-}
-
-void handle_dev_add_memslot(void *opaque, void *payload)
-{
- RedWorker *worker = opaque;
- RedWorkerMessageAddMemslot *msg = payload;
- QXLDevMemSlot mem_slot = msg->mem_slot;
-
- red_memslot_info_add_slot(&worker->mem_slots, mem_slot.slot_group_id, mem_slot.slot_id,
- mem_slot.addr_delta, mem_slot.virt_start, mem_slot.virt_end,
- mem_slot.generation);
-}
-
-void handle_dev_del_memslot(void *opaque, void *payload)
-{
- RedWorker *worker = opaque;
- RedWorkerMessageDelMemslot *msg = payload;
- uint32_t slot_id = msg->slot_id;
- uint32_t slot_group_id = msg->slot_group_id;
-
- red_memslot_info_del_slot(&worker->mem_slots, slot_group_id, slot_id);
-}
-
-/* TODO: destroy_surface_wait, dev_destroy_surface_wait - confusing. one asserts
- * surface_id == 0, maybe move the assert upward and merge the two functions? */
-static inline void destroy_surface_wait(RedWorker *worker, int surface_id)
-{
- if (!worker->surfaces[surface_id].context.canvas) {
- return;
- }
-
- red_handle_depends_on_target_surface(worker, surface_id);
- /* note that red_handle_depends_on_target_surface must be called before red_current_clear.
- otherwise "current" will hold items that other drawables may depend on, and then
- red_current_clear will remove them from the pipe. */
- red_current_clear(worker, surface_id);
- red_clear_surface_drawables_from_pipes(worker, surface_id, TRUE);
-}
-
-static void dev_destroy_surface_wait(RedWorker *worker, uint32_t surface_id)
-{
- spice_assert(surface_id == 0);
-
- flush_all_qxl_commands(worker);
-
- if (worker->surfaces[0].context.canvas) {
- destroy_surface_wait(worker, 0);
- }
-}
-
-void handle_dev_destroy_surface_wait(void *opaque, void *payload)
-{
- RedWorkerMessageDestroySurfaceWait *msg = payload;
- RedWorker *worker = opaque;
-
- dev_destroy_surface_wait(worker, msg->surface_id);
-}
-
-static void rcc_disconnect_if_pending_send(RedChannelClient *rcc)
-{
- if (red_channel_client_blocked(rcc) || rcc->pipe_size > 0) {
- red_channel_client_disconnect(rcc);
- } else {
- spice_assert(red_channel_client_no_item_being_sent(rcc));
- }
-}
-
-static inline void red_cursor_reset(RedWorker *worker)
-{
- if (worker->cursor) {
- red_release_cursor(worker, worker->cursor);
- worker->cursor = NULL;
- }
-
- worker->cursor_visible = TRUE;
- worker->cursor_position.x = worker->cursor_position.y = 0;
- worker->cursor_trail_length = worker->cursor_trail_frequency = 0;
-
- if (cursor_is_connected(worker)) {
- red_channel_pipes_add_type(&worker->cursor_channel->common.base,
- PIPE_ITEM_TYPE_INVAL_CURSOR_CACHE);
- if (!worker->cursor_channel->common.during_target_migrate) {
- red_pipes_add_verb(&worker->cursor_channel->common.base, SPICE_MSG_CURSOR_RESET);
- }
- if (!red_channel_wait_all_sent(&worker->cursor_channel->common.base,
- DISPLAY_CLIENT_TIMEOUT)) {
- red_channel_apply_clients(&worker->cursor_channel->common.base,
- rcc_disconnect_if_pending_send);
- }
- }
-}
-
-/* called upon device reset */
-
-/* TODO: split me*/
-static inline void dev_destroy_surfaces(RedWorker *worker)
-{
- int i;
-
- spice_debug(NULL);
- flush_all_qxl_commands(worker);
- //to handle better
- for (i = 0; i < NUM_SURFACES; ++i) {
- if (worker->surfaces[i].context.canvas) {
- destroy_surface_wait(worker, i);
- if (worker->surfaces[i].context.canvas) {
- red_destroy_surface(worker, i);
- }
- spice_assert(!worker->surfaces[i].context.canvas);
- }
- }
- spice_assert(ring_is_empty(&worker->streams));
-
- if (display_is_connected(worker)) {
- red_channel_pipes_add_type(&worker->display_channel->common.base,
- PIPE_ITEM_TYPE_INVAL_PALLET_CACHE);
- red_pipes_add_verb(&worker->display_channel->common.base,
- SPICE_MSG_DISPLAY_STREAM_DESTROY_ALL);
- }
-
- red_display_clear_glz_drawables(worker->display_channel);
-
- red_cursor_reset(worker);
-}
-
-void handle_dev_destroy_surfaces(void *opaque, void *payload)
-{
- RedWorker *worker = opaque;
-
- dev_destroy_surfaces(worker);
-}
-
-static MonitorsConfigItem *get_monitors_config_item(
- RedChannel* channel, MonitorsConfig *monitors_config)
-{
- MonitorsConfigItem *mci;
-
- mci = (MonitorsConfigItem *)spice_malloc(sizeof(*mci));
- mci->monitors_config = monitors_config;
-
- red_channel_pipe_item_init(channel,
- &mci->pipe_item, PIPE_ITEM_TYPE_MONITORS_CONFIG);
- return mci;
-}
-
-static inline void red_monitors_config_item_add(DisplayChannelClient *dcc)
-{
- MonitorsConfigItem *mci;
- RedWorker *worker = dcc->common.worker;
-
- mci = get_monitors_config_item(dcc->common.base.channel,
- monitors_config_getref(worker->monitors_config));
- red_channel_client_pipe_add(&dcc->common.base, &mci->pipe_item);
-}
-
-static void worker_update_monitors_config(RedWorker *worker,
- QXLMonitorsConfig *dev_monitors_config)
-{
- int heads_size;
- MonitorsConfig *monitors_config;
- int i;
-
- monitors_config_decref(worker->monitors_config);
-
- spice_debug("monitors config %d(%d)",
- dev_monitors_config->count,
- dev_monitors_config->max_allowed);
- for (i = 0; i < dev_monitors_config->count; i++) {
- spice_debug("+%d+%d %dx%d",
- dev_monitors_config->heads[i].x,
- dev_monitors_config->heads[i].y,
- dev_monitors_config->heads[i].width,
- dev_monitors_config->heads[i].height);
- }
- heads_size = dev_monitors_config->count * sizeof(QXLHead);
- worker->monitors_config = monitors_config =
- spice_malloc(sizeof(*monitors_config) + heads_size);
- monitors_config->refs = 1;
- monitors_config->worker = worker;
- monitors_config->count = dev_monitors_config->count;
- monitors_config->max_allowed = dev_monitors_config->max_allowed;
- memcpy(monitors_config->heads, dev_monitors_config->heads, heads_size);
-}
-
-static void red_push_monitors_config(DisplayChannelClient *dcc)
-{
- MonitorsConfig *monitors_config = DCC_TO_WORKER(dcc)->monitors_config;
-
- if (monitors_config == NULL) {
- spice_warning("monitors_config is NULL");
- return;
- }
-
- if (!red_channel_client_test_remote_cap(&dcc->common.base,
- SPICE_DISPLAY_CAP_MONITORS_CONFIG)) {
- return;
- }
- red_monitors_config_item_add(dcc);
- red_channel_client_push(&dcc->common.base);
-}
-
-static void red_worker_push_monitors_config(RedWorker *worker)
-{
- DisplayChannelClient *dcc;
- RingItem *item, *next;
-
- WORKER_FOREACH_DCC_SAFE(worker, item, next, dcc) {
- red_push_monitors_config(dcc);
- }
-}
-
-static void set_monitors_config_to_primary(RedWorker *worker)
-{
- QXLHead *head;
- DrawContext *context;
-
- if (!worker->surfaces[0].context.canvas) {
- spice_warning("no primary surface");
- return;
- }
- monitors_config_decref(worker->monitors_config);
- context = &worker->surfaces[0].context;
- worker->monitors_config =
- spice_malloc(sizeof(*worker->monitors_config) + sizeof(QXLHead));
- worker->monitors_config->refs = 1;
- worker->monitors_config->worker = worker;
- worker->monitors_config->count = 1;
- worker->monitors_config->max_allowed = 1;
- head = worker->monitors_config->heads;
- head->id = 0;
- head->surface_id = 0;
- head->width = context->width;
- head->height = context->height;
- head->x = 0;
- head->y = 0;
-}
-
-static void dev_create_primary_surface(RedWorker *worker, uint32_t surface_id,
- QXLDevSurfaceCreate surface)
-{
- uint8_t *line_0;
- int error;
-
- spice_debug(NULL);
- spice_warn_if(surface_id != 0);
- spice_warn_if(surface.height == 0);
- spice_warn_if(((uint64_t)abs(surface.stride) * (uint64_t)surface.height) !=
- abs(surface.stride) * surface.height);
-
- line_0 = (uint8_t*)get_virt(&worker->mem_slots, surface.mem,
- surface.height * abs(surface.stride),
- surface.group_id, &error);
- if (error) {
- return;
- }
- if (surface.stride < 0) {
- line_0 -= (int32_t)(surface.stride * (surface.height -1));
- }
-
- red_create_surface(worker, 0, surface.width, surface.height, surface.stride, surface.format,
- line_0, surface.flags & QXL_SURF_FLAG_KEEP_DATA, TRUE);
- set_monitors_config_to_primary(worker);
-
- if (display_is_connected(worker) && !worker->display_channel->common.during_target_migrate) {
- /* guest created primary, so it will (hopefully) send a monitors_config
- * now, don't send our own temporary one */
- if (!worker->driver_cap_monitors_config) {
- red_worker_push_monitors_config(worker);
- }
- red_pipes_add_verb(&worker->display_channel->common.base,
- SPICE_MSG_DISPLAY_MARK);
- red_channel_push(&worker->display_channel->common.base);
- }
-
- if (cursor_is_connected(worker) && !worker->cursor_channel->common.during_target_migrate) {
- red_channel_pipes_add_type(&worker->cursor_channel->common.base,
- PIPE_ITEM_TYPE_CURSOR_INIT);
- }
-}
-
-void handle_dev_create_primary_surface(void *opaque, void *payload)
-{
- RedWorkerMessageCreatePrimarySurface *msg = payload;
- RedWorker *worker = opaque;
-
- dev_create_primary_surface(worker, msg->surface_id, msg->surface);
-}
-
-static void dev_destroy_primary_surface(RedWorker *worker, uint32_t surface_id)
-{
- spice_warn_if(surface_id != 0);
-
- spice_debug(NULL);
- if (!worker->surfaces[surface_id].context.canvas) {
- spice_warning("double destroy of primary surface");
- return;
- }
-
- flush_all_qxl_commands(worker);
- dev_destroy_surface_wait(worker, 0);
- red_destroy_surface(worker, 0);
- spice_assert(ring_is_empty(&worker->streams));
-
- spice_assert(!worker->surfaces[surface_id].context.canvas);
-
- red_cursor_reset(worker);
-}
-
-void handle_dev_destroy_primary_surface(void *opaque, void *payload)
-{
- RedWorkerMessageDestroyPrimarySurface *msg = payload;
- RedWorker *worker = opaque;
- uint32_t surface_id = msg->surface_id;
-
- dev_destroy_primary_surface(worker, surface_id);
-}
-
-void handle_dev_destroy_primary_surface_async(void *opaque, void *payload)
-{
- RedWorkerMessageDestroyPrimarySurfaceAsync *msg = payload;
- RedWorker *worker = opaque;
- uint32_t surface_id = msg->surface_id;
-
- dev_destroy_primary_surface(worker, surface_id);
-}
-
-static void flush_all_surfaces(RedWorker *worker)
-{
- int x;
-
- for (x = 0; x < NUM_SURFACES; ++x) {
- if (worker->surfaces[x].context.canvas) {
- red_current_flush(worker, x);
- }
- }
-}
-
-static void dev_flush_surfaces(RedWorker *worker)
-{
- flush_all_qxl_commands(worker);
- flush_all_surfaces(worker);
-}
-
-void handle_dev_flush_surfaces(void *opaque, void *payload)
-{
- RedWorker *worker = opaque;
-
- dev_flush_surfaces(worker);
-}
-
-void handle_dev_flush_surfaces_async(void *opaque, void *payload)
-{
- RedWorker *worker = opaque;
-
- dev_flush_surfaces(worker);
-}
-
-void handle_dev_stop(void *opaque, void *payload)
-{
- RedWorker *worker = opaque;
-
- spice_info("stop");
- spice_assert(worker->running);
- worker->running = FALSE;
- red_display_clear_glz_drawables(worker->display_channel);
- flush_all_surfaces(worker);
- /* todo: when the waiting is expected to take long (slow connection and
- * overloaded pipe), don't wait, and in case of migration,
- * purge the pipe, send destroy_all_surfaces
- * to the client (there is no such message right now), and start
- * from scratch on the destination side */
- if (!red_channel_wait_all_sent(&worker->display_channel->common.base,
- DISPLAY_CLIENT_TIMEOUT)) {
- red_channel_apply_clients(&worker->display_channel->common.base,
- rcc_disconnect_if_pending_send);
- }
- if (!red_channel_wait_all_sent(&worker->cursor_channel->common.base,
- DISPLAY_CLIENT_TIMEOUT)) {
- red_channel_apply_clients(&worker->cursor_channel->common.base,
- rcc_disconnect_if_pending_send);
- }
-}
-
-static int display_channel_wait_for_migrate_data(DisplayChannel *display)
-{
- uint64_t end_time = red_now() + DISPLAY_CLIENT_MIGRATE_DATA_TIMEOUT;
- RedChannel *channel = &display->common.base;
- RedChannelClient *rcc;
-
- spice_debug(NULL);
- spice_assert(channel->clients_num == 1);
-
- rcc = SPICE_CONTAINEROF(ring_get_head(&channel->clients), RedChannelClient, channel_link);
- spice_assert(red_channel_client_waits_for_migrate_data(rcc));
-
- for (;;) {
- red_channel_client_receive(rcc);
- if (!red_channel_client_is_connected(rcc)) {
- break;
- }
-
- if (!red_channel_client_waits_for_migrate_data(rcc)) {
- return TRUE;
- }
- if (red_now() > end_time) {
- spice_warning("timeout");
- red_channel_client_disconnect(rcc);
- break;
- }
- usleep(DISPLAY_CLIENT_RETRY_INTERVAL);
- }
- return FALSE;
-}
-
-void handle_dev_start(void *opaque, void *payload)
-{
- RedWorker *worker = opaque;
-
- spice_assert(!worker->running);
- if (worker->cursor_channel) {
- worker->cursor_channel->common.during_target_migrate = FALSE;
- }
- if (worker->display_channel) {
- worker->display_channel->common.during_target_migrate = FALSE;
- if (red_channel_waits_for_migrate_data(&worker->display_channel->common.base)) {
- display_channel_wait_for_migrate_data(worker->display_channel);
- }
- }
- worker->running = TRUE;
- guest_set_client_capabilities(worker);
-}
-
-void handle_dev_wakeup(void *opaque, void *payload)
-{
- RedWorker *worker = opaque;
-
- clear_bit(RED_WORKER_PENDING_WAKEUP, worker->pending);
- stat_inc_counter(worker->wakeup_counter, 1);
-}
-
-void handle_dev_oom(void *opaque, void *payload)
-{
- RedWorker *worker = opaque;
-
- RedChannel *display_red_channel = &worker->display_channel->common.base;
- int ring_is_empty;
-
- spice_assert(worker->running);
- // streams? but without streams also leak
- spice_debug("OOM1 #draw=%u, #red_draw=%u, #glz_draw=%u current %u pipes %u",
- worker->drawable_count,
- worker->red_drawable_count,
- worker->glz_drawable_count,
- worker->current_size,
- worker->display_channel ?
- red_channel_sum_pipes_size(display_red_channel) : 0);
- while (red_process_commands(worker, MAX_PIPE_SIZE, &ring_is_empty)) {
- red_channel_push(&worker->display_channel->common.base);
- }
- if (worker->qxl->st->qif->flush_resources(worker->qxl) == 0) {
- red_free_some(worker);
- worker->qxl->st->qif->flush_resources(worker->qxl);
- }
- spice_debug("OOM2 #draw=%u, #red_draw=%u, #glz_draw=%u current %u pipes %u",
- worker->drawable_count,
- worker->red_drawable_count,
- worker->glz_drawable_count,
- worker->current_size,
- worker->display_channel ?
- red_channel_sum_pipes_size(display_red_channel) : 0);
- clear_bit(RED_WORKER_PENDING_OOM, worker->pending);
-}
-
-void handle_dev_reset_cursor(void *opaque, void *payload)
-{
- red_cursor_reset((RedWorker *)opaque);
-}
-
-void handle_dev_reset_image_cache(void *opaque, void *payload)
-{
- image_cache_reset(&((RedWorker *)opaque)->image_cache);
-}
-
-void handle_dev_destroy_surface_wait_async(void *opaque, void *payload)
-{
- RedWorkerMessageDestroySurfaceWaitAsync *msg = payload;
- RedWorker *worker = opaque;
-
- dev_destroy_surface_wait(worker, msg->surface_id);
-}
-
-void handle_dev_destroy_surfaces_async(void *opaque, void *payload)
-{
- RedWorker *worker = opaque;
-
- dev_destroy_surfaces(worker);
-}
-
-void handle_dev_create_primary_surface_async(void *opaque, void *payload)
-{
- RedWorkerMessageCreatePrimarySurfaceAsync *msg = payload;
- RedWorker *worker = opaque;
-
- dev_create_primary_surface(worker, msg->surface_id, msg->surface);
-}
-
-/* exception for Dispatcher, data going from red_worker to main thread,
- * TODO: use a different dispatcher?
- * TODO: leave direct usage of channel(fd)? It's only used right after the
- * pthread is created, since the channel duration is the lifetime of the spice
- * server. */
-
-void handle_dev_display_channel_create(void *opaque, void *payload)
-{
- RedWorker *worker = opaque;
-
- RedChannel *red_channel;
- // TODO: handle seemless migration. Temp, setting migrate to FALSE
- display_channel_create(worker, FALSE);
- red_channel = &worker->display_channel->common.base;
- send_data(worker->channel, &red_channel, sizeof(RedChannel *));
-}
-
-void handle_dev_display_connect(void *opaque, void *payload)
-{
- RedWorkerMessageDisplayConnect *msg = payload;
- RedWorker *worker = opaque;
- RedsStream *stream = msg->stream;
- RedClient *client = msg->client;
- int migration = msg->migration;
-
- spice_info("connect");
- handle_new_display_channel(worker, client, stream, migration,
- msg->common_caps, msg->num_common_caps,
- msg->caps, msg->num_caps);
- free(msg->caps);
- free(msg->common_caps);
-}
-
-void handle_dev_display_disconnect(void *opaque, void *payload)
-{
- RedWorkerMessageDisplayDisconnect *msg = payload;
- RedChannelClient *rcc = msg->rcc;
- RedWorker *worker = opaque;
-
- spice_info("disconnect display client");
- spice_assert(rcc);
-
- guest_set_client_capabilities(worker);
-
- red_channel_client_disconnect(rcc);
-}
-
-void handle_dev_display_migrate(void *opaque, void *payload)
-{
- RedWorkerMessageDisplayMigrate *msg = payload;
- RedWorker *worker = opaque;
-
- RedChannelClient *rcc = msg->rcc;
- spice_info("migrate display client");
- spice_assert(rcc);
- red_migrate_display(worker, rcc);
-}
-
-static void handle_dev_monitors_config_async(void *opaque, void *payload)
-{
- RedWorkerMessageMonitorsConfigAsync *msg = payload;
- RedWorker *worker = opaque;
- int min_size = sizeof(QXLMonitorsConfig) + sizeof(QXLHead);
- int error;
- QXLMonitorsConfig *dev_monitors_config =
- (QXLMonitorsConfig*)get_virt(&worker->mem_slots, msg->monitors_config,
- min_size, msg->group_id, &error);
-
- if (error) {
- /* TODO: raise guest bug (requires added QXL interface) */
- return;
- }
- worker->driver_cap_monitors_config = 1;
- if (dev_monitors_config->count == 0) {
- spice_warning("ignoring an empty monitors config message from driver");
- return;
- }
- if (dev_monitors_config->count > dev_monitors_config->max_allowed) {
- spice_warning("ignoring malformed monitors_config from driver, "
- "count > max_allowed %d > %d",
- dev_monitors_config->count,
- dev_monitors_config->max_allowed);
- return;
- }
- worker_update_monitors_config(worker, dev_monitors_config);
- red_worker_push_monitors_config(worker);
-}
-
-/* TODO: special, perhaps use another dispatcher? */
-void handle_dev_cursor_channel_create(void *opaque, void *payload)
-{
- RedWorker *worker = opaque;
- RedChannel *red_channel;
-
- // TODO: handle seemless migration. Temp, setting migrate to FALSE
- cursor_channel_create(worker, FALSE);
- red_channel = &worker->cursor_channel->common.base;
- send_data(worker->channel, &red_channel, sizeof(RedChannel *));
-}
-
-void handle_dev_cursor_connect(void *opaque, void *payload)
-{
- RedWorkerMessageCursorConnect *msg = payload;
- RedWorker *worker = opaque;
- RedsStream *stream = msg->stream;
- RedClient *client = msg->client;
- int migration = msg->migration;
-
- spice_info("cursor connect");
- red_connect_cursor(worker, client, stream, migration,
- msg->common_caps, msg->num_common_caps,
- msg->caps, msg->num_caps);
- free(msg->caps);
- free(msg->common_caps);
-}
-
-void handle_dev_cursor_disconnect(void *opaque, void *payload)
-{
- RedWorkerMessageCursorDisconnect *msg = payload;
- RedChannelClient *rcc = msg->rcc;
-
- spice_info("disconnect cursor client");
- spice_assert(rcc);
- red_channel_client_disconnect(rcc);
-}
-
-void handle_dev_cursor_migrate(void *opaque, void *payload)
-{
- RedWorkerMessageCursorMigrate *msg = payload;
- RedWorker *worker = opaque;
- RedChannelClient *rcc = msg->rcc;
-
- spice_info("migrate cursor client");
- spice_assert(rcc);
- red_migrate_cursor(worker, rcc);
-}
-
-void handle_dev_set_compression(void *opaque, void *payload)
-{
- RedWorkerMessageSetCompression *msg = payload;
- RedWorker *worker = opaque;
-
- worker->image_compression = msg->image_compression;
- switch (worker->image_compression) {
- case SPICE_IMAGE_COMPRESS_AUTO_LZ:
- spice_info("ic auto_lz");
- break;
- case SPICE_IMAGE_COMPRESS_AUTO_GLZ:
- spice_info("ic auto_glz");
- break;
- case SPICE_IMAGE_COMPRESS_QUIC:
- spice_info("ic quic");
- break;
- case SPICE_IMAGE_COMPRESS_LZ:
- spice_info("ic lz");
- break;
- case SPICE_IMAGE_COMPRESS_GLZ:
- spice_info("ic glz");
- break;
- case SPICE_IMAGE_COMPRESS_OFF:
- spice_info("ic off");
- break;
- default:
- spice_warning("ic invalid");
- }
-#ifdef COMPRESS_STAT
- print_compress_stats(worker->display_channel);
- if (worker->display_channel) {
- stat_reset(&worker->display_channel->quic_stat);
- stat_reset(&worker->display_channel->lz_stat);
- stat_reset(&worker->display_channel->glz_stat);
- stat_reset(&worker->display_channel->jpeg_stat);
- stat_reset(&worker->display_channel->zlib_glz_stat);
- stat_reset(&worker->display_channel->jpeg_alpha_stat);
- }
-#endif
-}
-
-void handle_dev_set_streaming_video(void *opaque, void *payload)
-{
- RedWorkerMessageSetStreamingVideo *msg = payload;
- RedWorker *worker = opaque;
-
- worker->streaming_video = msg->streaming_video;
- spice_assert(worker->streaming_video != STREAM_VIDEO_INVALID);
- switch(worker->streaming_video) {
- case STREAM_VIDEO_ALL:
- spice_info("sv all");
- break;
- case STREAM_VIDEO_FILTER:
- spice_info("sv filter");
- break;
- case STREAM_VIDEO_OFF:
- spice_info("sv off");
- break;
- default:
- spice_warning("sv invalid");
- }
-}
-
-void handle_dev_set_mouse_mode(void *opaque, void *payload)
-{
- RedWorkerMessageSetMouseMode *msg = payload;
- RedWorker *worker = opaque;
-
- worker->mouse_mode = msg->mode;
- spice_info("mouse mode %u", worker->mouse_mode);
-}
-
-void handle_dev_add_memslot_async(void *opaque, void *payload)
-{
- RedWorkerMessageAddMemslotAsync *msg = payload;
- RedWorker *worker = opaque;
-
- dev_add_memslot(worker, msg->mem_slot);
-}
-
-void handle_dev_reset_memslots(void *opaque, void *payload)
-{
- RedWorker *worker = opaque;
-
- red_memslot_info_reset(&worker->mem_slots);
-}
-
-void handle_dev_driver_unload(void *opaque, void *payload)
-{
- RedWorker *worker = opaque;
-
- worker->driver_cap_monitors_config = 0;
-}
-
-static int loadvm_command(RedWorker *worker, QXLCommandExt *ext)
-{
- RedCursorCmd *cursor_cmd;
- RedSurfaceCmd *surface_cmd;
-
- switch (ext->cmd.type) {
- case QXL_CMD_CURSOR:
- cursor_cmd = spice_new0(RedCursorCmd, 1);
- if (red_get_cursor_cmd(&worker->mem_slots, ext->group_id, cursor_cmd, ext->cmd.data)) {
- free(cursor_cmd);
- return FALSE;
- }
- qxl_process_cursor(worker, cursor_cmd, ext->group_id);
- break;
- case QXL_CMD_SURFACE:
- surface_cmd = spice_new0(RedSurfaceCmd, 1);
- if (red_get_surface_cmd(&worker->mem_slots, ext->group_id, surface_cmd, ext->cmd.data)) {
- free(surface_cmd);
- return FALSE;
- }
- red_process_surface(worker, surface_cmd, ext->group_id, TRUE);
- break;
- default:
- spice_warning("unhandled loadvm command type (%d)", ext->cmd.type);
- }
-
- return TRUE;
-}
-
-void handle_dev_loadvm_commands(void *opaque, void *payload)
-{
- RedWorkerMessageLoadvmCommands *msg = payload;
- RedWorker *worker = opaque;
- uint32_t i;
- uint32_t count = msg->count;
- QXLCommandExt *ext = msg->ext;
-
- spice_info("loadvm_commands");
- for (i = 0 ; i < count ; ++i) {
- if (!loadvm_command(worker, &ext[i])) {
- /* XXX allow failure in loadvm? */
- spice_warning("failed loadvm command type (%d)", ext[i].cmd.type);
- }
- }
-}
-
-static void worker_handle_dispatcher_async_done(void *opaque,
- uint32_t message_type,
- void *payload)
-{
- RedWorker *worker = opaque;
- RedWorkerMessageAsync *msg_async = payload;
-
- spice_debug(NULL);
- red_dispatcher_async_complete(worker->red_dispatcher, msg_async->cmd);
-}
-
-static void register_callbacks(Dispatcher *dispatcher)
-{
- dispatcher_register_async_done_callback(
- dispatcher,
- worker_handle_dispatcher_async_done);
- dispatcher_register_handler(dispatcher,
- RED_WORKER_MESSAGE_DISPLAY_CONNECT,
- handle_dev_display_connect,
- sizeof(RedWorkerMessageDisplayConnect),
- DISPATCHER_NONE);
- dispatcher_register_handler(dispatcher,
- RED_WORKER_MESSAGE_DISPLAY_DISCONNECT,
- handle_dev_display_disconnect,
- sizeof(RedWorkerMessageDisplayDisconnect),
- DISPATCHER_ACK);
- dispatcher_register_handler(dispatcher,
- RED_WORKER_MESSAGE_DISPLAY_MIGRATE,
- handle_dev_display_migrate,
- sizeof(RedWorkerMessageDisplayMigrate),
- DISPATCHER_NONE);
- dispatcher_register_handler(dispatcher,
- RED_WORKER_MESSAGE_CURSOR_CONNECT,
- handle_dev_cursor_connect,
- sizeof(RedWorkerMessageCursorConnect),
- DISPATCHER_NONE);
- dispatcher_register_handler(dispatcher,
- RED_WORKER_MESSAGE_CURSOR_DISCONNECT,
- handle_dev_cursor_disconnect,
- sizeof(RedWorkerMessageCursorDisconnect),
- DISPATCHER_ACK);
- dispatcher_register_handler(dispatcher,
- RED_WORKER_MESSAGE_CURSOR_MIGRATE,
- handle_dev_cursor_migrate,
- sizeof(RedWorkerMessageCursorMigrate),
- DISPATCHER_NONE);
- dispatcher_register_handler(dispatcher,
- RED_WORKER_MESSAGE_UPDATE,
- handle_dev_update,
- sizeof(RedWorkerMessageUpdate),
- DISPATCHER_ACK);
- dispatcher_register_handler(dispatcher,
- RED_WORKER_MESSAGE_UPDATE_ASYNC,
- handle_dev_update_async,
- sizeof(RedWorkerMessageUpdateAsync),
- DISPATCHER_ASYNC);
- dispatcher_register_handler(dispatcher,
- RED_WORKER_MESSAGE_ADD_MEMSLOT,
- handle_dev_add_memslot,
- sizeof(RedWorkerMessageAddMemslot),
- DISPATCHER_ACK);
- dispatcher_register_handler(dispatcher,
- RED_WORKER_MESSAGE_ADD_MEMSLOT_ASYNC,
- handle_dev_add_memslot_async,
- sizeof(RedWorkerMessageAddMemslotAsync),
- DISPATCHER_ASYNC);
- dispatcher_register_handler(dispatcher,
- RED_WORKER_MESSAGE_DEL_MEMSLOT,
- handle_dev_del_memslot,
- sizeof(RedWorkerMessageDelMemslot),
- DISPATCHER_NONE);
- dispatcher_register_handler(dispatcher,
- RED_WORKER_MESSAGE_DESTROY_SURFACES,
- handle_dev_destroy_surfaces,
- sizeof(RedWorkerMessageDestroySurfaces),
- DISPATCHER_ACK);
- dispatcher_register_handler(dispatcher,
- RED_WORKER_MESSAGE_DESTROY_SURFACES_ASYNC,
- handle_dev_destroy_surfaces_async,
- sizeof(RedWorkerMessageDestroySurfacesAsync),
- DISPATCHER_ASYNC);
- dispatcher_register_handler(dispatcher,
- RED_WORKER_MESSAGE_DESTROY_PRIMARY_SURFACE,
- handle_dev_destroy_primary_surface,
- sizeof(RedWorkerMessageDestroyPrimarySurface),
- DISPATCHER_ACK);
- dispatcher_register_handler(dispatcher,
- RED_WORKER_MESSAGE_DESTROY_PRIMARY_SURFACE_ASYNC,
- handle_dev_destroy_primary_surface_async,
- sizeof(RedWorkerMessageDestroyPrimarySurfaceAsync),
- DISPATCHER_ASYNC);
- dispatcher_register_handler(dispatcher,
- RED_WORKER_MESSAGE_CREATE_PRIMARY_SURFACE_ASYNC,
- handle_dev_create_primary_surface_async,
- sizeof(RedWorkerMessageCreatePrimarySurfaceAsync),
- DISPATCHER_ASYNC);
- dispatcher_register_handler(dispatcher,
- RED_WORKER_MESSAGE_CREATE_PRIMARY_SURFACE,
- handle_dev_create_primary_surface,
- sizeof(RedWorkerMessageCreatePrimarySurface),
- DISPATCHER_ACK);
- dispatcher_register_handler(dispatcher,
- RED_WORKER_MESSAGE_RESET_IMAGE_CACHE,
- handle_dev_reset_image_cache,
- sizeof(RedWorkerMessageResetImageCache),
- DISPATCHER_ACK);
- dispatcher_register_handler(dispatcher,
- RED_WORKER_MESSAGE_RESET_CURSOR,
- handle_dev_reset_cursor,
- sizeof(RedWorkerMessageResetCursor),
- DISPATCHER_ACK);
- dispatcher_register_handler(dispatcher,
- RED_WORKER_MESSAGE_WAKEUP,
- handle_dev_wakeup,
- sizeof(RedWorkerMessageWakeup),
- DISPATCHER_NONE);
- dispatcher_register_handler(dispatcher,
- RED_WORKER_MESSAGE_OOM,
- handle_dev_oom,
- sizeof(RedWorkerMessageOom),
- DISPATCHER_NONE);
- dispatcher_register_handler(dispatcher,
- RED_WORKER_MESSAGE_START,
- handle_dev_start,
- sizeof(RedWorkerMessageStart),
- DISPATCHER_NONE);
- dispatcher_register_handler(dispatcher,
- RED_WORKER_MESSAGE_FLUSH_SURFACES_ASYNC,
- handle_dev_flush_surfaces_async,
- sizeof(RedWorkerMessageFlushSurfacesAsync),
- DISPATCHER_ASYNC);
- dispatcher_register_handler(dispatcher,
- RED_WORKER_MESSAGE_STOP,
- handle_dev_stop,
- sizeof(RedWorkerMessageStop),
- DISPATCHER_ACK);
- dispatcher_register_handler(dispatcher,
- RED_WORKER_MESSAGE_LOADVM_COMMANDS,
- handle_dev_loadvm_commands,
- sizeof(RedWorkerMessageLoadvmCommands),
- DISPATCHER_ACK);
- dispatcher_register_handler(dispatcher,
- RED_WORKER_MESSAGE_SET_COMPRESSION,
- handle_dev_set_compression,
- sizeof(RedWorkerMessageSetCompression),
- DISPATCHER_NONE);
- dispatcher_register_handler(dispatcher,
- RED_WORKER_MESSAGE_SET_STREAMING_VIDEO,
- handle_dev_set_streaming_video,
- sizeof(RedWorkerMessageSetStreamingVideo),
- DISPATCHER_NONE);
- dispatcher_register_handler(dispatcher,
- RED_WORKER_MESSAGE_SET_MOUSE_MODE,
- handle_dev_set_mouse_mode,
- sizeof(RedWorkerMessageSetMouseMode),
- DISPATCHER_NONE);
- dispatcher_register_handler(dispatcher,
- RED_WORKER_MESSAGE_DISPLAY_CHANNEL_CREATE,
- handle_dev_display_channel_create,
- sizeof(RedWorkerMessageDisplayChannelCreate),
- DISPATCHER_NONE);
- dispatcher_register_handler(dispatcher,
- RED_WORKER_MESSAGE_CURSOR_CHANNEL_CREATE,
- handle_dev_cursor_channel_create,
- sizeof(RedWorkerMessageCursorChannelCreate),
- DISPATCHER_NONE);
- dispatcher_register_handler(dispatcher,
- RED_WORKER_MESSAGE_DESTROY_SURFACE_WAIT,
- handle_dev_destroy_surface_wait,
- sizeof(RedWorkerMessageDestroySurfaceWait),
- DISPATCHER_ACK);
- dispatcher_register_handler(dispatcher,
- RED_WORKER_MESSAGE_DESTROY_SURFACE_WAIT_ASYNC,
- handle_dev_destroy_surface_wait_async,
- sizeof(RedWorkerMessageDestroySurfaceWaitAsync),
- DISPATCHER_ASYNC);
- dispatcher_register_handler(dispatcher,
- RED_WORKER_MESSAGE_RESET_MEMSLOTS,
- handle_dev_reset_memslots,
- sizeof(RedWorkerMessageResetMemslots),
- DISPATCHER_NONE);
- dispatcher_register_handler(dispatcher,
- RED_WORKER_MESSAGE_MONITORS_CONFIG_ASYNC,
- handle_dev_monitors_config_async,
- sizeof(RedWorkerMessageMonitorsConfigAsync),
- DISPATCHER_ASYNC);
- dispatcher_register_handler(dispatcher,
- RED_WORKER_MESSAGE_DRIVER_UNLOAD,
- handle_dev_driver_unload,
- sizeof(RedWorkerMessageDriverUnload),
- DISPATCHER_NONE);
-}
-
-
-
-static void handle_dev_input(int fd, int event, void *opaque)
-{
- RedWorker *worker = opaque;
-
- dispatcher_handle_recv_read(red_dispatcher_get_dispatcher(worker->red_dispatcher));
-}
-
-static void red_init(RedWorker *worker, WorkerInitData *init_data)
-{
- RedWorkerMessage message;
- Dispatcher *dispatcher;
- int i;
-
- spice_assert(sizeof(CursorItem) <= QXL_CURSUR_DEVICE_DATA_SIZE);
-
- memset(worker, 0, sizeof(RedWorker));
- dispatcher = red_dispatcher_get_dispatcher(init_data->red_dispatcher);
- dispatcher_set_opaque(dispatcher, worker);
- worker->red_dispatcher = init_data->red_dispatcher;
- worker->qxl = init_data->qxl;
- worker->id = init_data->id;
- worker->channel = dispatcher_get_recv_fd(dispatcher);
- register_callbacks(dispatcher);
- worker->pending = init_data->pending;
- worker->cursor_visible = TRUE;
- spice_assert(init_data->num_renderers > 0);
- worker->num_renderers = init_data->num_renderers;
- memcpy(worker->renderers, init_data->renderers, sizeof(worker->renderers));
- worker->renderer = RED_RENDERER_INVALID;
- worker->mouse_mode = SPICE_MOUSE_MODE_SERVER;
- worker->image_compression = init_data->image_compression;
- worker->jpeg_state = init_data->jpeg_state;
- worker->zlib_glz_state = init_data->zlib_glz_state;
- worker->streaming_video = init_data->streaming_video;
- worker->driver_cap_monitors_config = 0;
- ring_init(&worker->current_list);
- image_cache_init(&worker->image_cache);
- image_surface_init(worker);
- drawables_init(worker);
- cursor_items_init(worker);
- red_init_streams(worker);
- stat_init(&worker->add_stat, add_stat_name);
- stat_init(&worker->exclude_stat, exclude_stat_name);
- stat_init(&worker->__exclude_stat, __exclude_stat_name);
-#ifdef RED_STATISTICS
- char worker_str[20];
- sprintf(worker_str, "display[%d]", worker->id);
- worker->stat = stat_add_node(INVALID_STAT_REF, worker_str, TRUE);
- worker->wakeup_counter = stat_add_counter(worker->stat, "wakeups", TRUE);
- worker->command_counter = stat_add_counter(worker->stat, "commands", TRUE);
-#endif
- for (i = 0; i < MAX_EVENT_SOURCES; i++) {
- worker->poll_fds[i].fd = -1;
- }
-
- worker->poll_fds[0].fd = worker->channel;
- worker->poll_fds[0].events = POLLIN;
- worker->watches[0].worker = worker;
- worker->watches[0].watch_func = handle_dev_input;
- worker->watches[0].watch_func_opaque = worker;
-
- red_memslot_info_init(&worker->mem_slots,
- init_data->num_memslots_groups,
- init_data->num_memslots,
- init_data->memslot_gen_bits,
- init_data->memslot_id_bits,
- init_data->internal_groupslot_id);
-
- spice_warn_if(init_data->n_surfaces > NUM_SURFACES);
- worker->n_surfaces = init_data->n_surfaces;
-
- if (!spice_timer_queue_create()) {
- spice_error("failed to create timer queue");
- }
- srand(time(NULL));
-
- message = RED_WORKER_MESSAGE_READY;
- write_message(worker->channel, &message);
-}
-
-static void red_display_cc_free_glz_drawables(RedChannelClient *rcc)
-{
- DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
-
- red_display_handle_glz_drawables_to_free(dcc);
-}
-
-SPICE_GNUC_NORETURN void *red_worker_main(void *arg)
-{
- RedWorker *worker = spice_malloc(sizeof(RedWorker));
-
- spice_info("begin");
- spice_assert(MAX_PIPE_SIZE > WIDE_CLIENT_ACK_WINDOW &&
- MAX_PIPE_SIZE > NARROW_CLIENT_ACK_WINDOW); //ensure wakeup by ack message
-
-#if defined(RED_WORKER_STAT) || defined(COMPRESS_STAT)
- if (pthread_getcpuclockid(pthread_self(), &clock_id)) {
- spice_error("pthread_getcpuclockid failed");
- }
-#endif
-
- red_init(worker, (WorkerInitData *)arg);
- red_init_quic(worker);
- red_init_lz(worker);
- red_init_jpeg(worker);
- red_init_zlib(worker);
- worker->event_timeout = INF_EVENT_WAIT;
- for (;;) {
- int i, num_events;
- unsigned int timers_queue_timeout;
-
- timers_queue_timeout = spice_timer_queue_get_timeout_ms();
- worker->event_timeout = MIN(red_get_streams_timout(worker), worker->event_timeout);
- worker->event_timeout = MIN(timers_queue_timeout, worker->event_timeout);
- num_events = poll(worker->poll_fds, MAX_EVENT_SOURCES, worker->event_timeout);
- red_handle_streams_timout(worker);
- spice_timer_queue_cb();
-
- if (worker->display_channel) {
- /* during migration, in the dest, the display channel can be initialized
- while the global lz data not since migrate data msg hasn't been
- received yet */
- red_channel_apply_clients(&worker->display_channel->common.base,
- red_display_cc_free_glz_drawables);
- }
-
- worker->event_timeout = INF_EVENT_WAIT;
- if (num_events == -1) {
- if (errno != EINTR) {
- spice_error("poll failed, %s", strerror(errno));
- }
- }
-
- for (i = 0; i < MAX_EVENT_SOURCES; i++) {
- /* The watch may have been removed by the watch-func from
- another fd (ie a disconnect through the dispatcher),
- in this case watch_func is NULL. */
- if (worker->poll_fds[i].revents && worker->watches[i].watch_func) {
- int events = 0;
- if (worker->poll_fds[i].revents & POLLIN) {
- events |= SPICE_WATCH_EVENT_READ;
- }
- if (worker->poll_fds[i].revents & POLLOUT) {
- events |= SPICE_WATCH_EVENT_WRITE;
- }
- worker->watches[i].watch_func(worker->poll_fds[i].fd, events,
- worker->watches[i].watch_func_opaque);
- }
- }
-
- /* Clear the poll_fd for any removed watches, see the comment in
- watch_remove for why we don't do this there. */
- for (i = 0; i < MAX_EVENT_SOURCES; i++) {
- if (!worker->watches[i].watch_func) {
- worker->poll_fds[i].fd = -1;
- }
- }
-
- if (worker->running) {
- int ring_is_empty;
- red_process_cursor(worker, MAX_PIPE_SIZE, &ring_is_empty);
- red_process_commands(worker, MAX_PIPE_SIZE, &ring_is_empty);
- }
- red_push(worker);
- }
- abort();
-}
diff --git a/server/red_worker.h b/server/red_worker.h
deleted file mode 100644
index 272661f4..00000000
--- a/server/red_worker.h
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_REDWORKER
-#define _H_REDWORKER
-
-#include <unistd.h>
-#include <errno.h>
-#include "red_common.h"
-
-enum {
- RED_WORKER_PENDING_WAKEUP,
- RED_WORKER_PENDING_OOM,
-};
-
-enum {
- RED_WORKER_MESSAGE_NOP,
- RED_WORKER_MESSAGE_UPDATE,
- RED_WORKER_MESSAGE_WAKEUP,
- RED_WORKER_MESSAGE_OOM,
- RED_WORKER_MESSAGE_READY,
- RED_WORKER_MESSAGE_DISPLAY_CONNECT,
- RED_WORKER_MESSAGE_DISPLAY_DISCONNECT,
- RED_WORKER_MESSAGE_DISPLAY_MIGRATE,
- RED_WORKER_MESSAGE_START,
- RED_WORKER_MESSAGE_STOP,
- RED_WORKER_MESSAGE_CURSOR_CONNECT,
- RED_WORKER_MESSAGE_CURSOR_DISCONNECT,
- RED_WORKER_MESSAGE_CURSOR_MIGRATE,
- RED_WORKER_MESSAGE_SET_COMPRESSION,
- RED_WORKER_MESSAGE_SET_STREAMING_VIDEO,
- RED_WORKER_MESSAGE_SET_MOUSE_MODE,
- RED_WORKER_MESSAGE_ADD_MEMSLOT,
- RED_WORKER_MESSAGE_DEL_MEMSLOT,
- RED_WORKER_MESSAGE_RESET_MEMSLOTS,
- RED_WORKER_MESSAGE_DESTROY_SURFACES,
- RED_WORKER_MESSAGE_CREATE_PRIMARY_SURFACE,
- RED_WORKER_MESSAGE_DESTROY_PRIMARY_SURFACE,
- RED_WORKER_MESSAGE_RESET_CURSOR,
- RED_WORKER_MESSAGE_RESET_IMAGE_CACHE,
- RED_WORKER_MESSAGE_DESTROY_SURFACE_WAIT,
- RED_WORKER_MESSAGE_LOADVM_COMMANDS,
- /* async commands */
- RED_WORKER_MESSAGE_UPDATE_ASYNC,
- RED_WORKER_MESSAGE_ADD_MEMSLOT_ASYNC,
- RED_WORKER_MESSAGE_DESTROY_SURFACES_ASYNC,
- RED_WORKER_MESSAGE_CREATE_PRIMARY_SURFACE_ASYNC,
- RED_WORKER_MESSAGE_DESTROY_PRIMARY_SURFACE_ASYNC,
- RED_WORKER_MESSAGE_DESTROY_SURFACE_WAIT_ASYNC,
- /* suspend/windows resolution change command */
- RED_WORKER_MESSAGE_FLUSH_SURFACES_ASYNC,
-
- RED_WORKER_MESSAGE_DISPLAY_CHANNEL_CREATE,
- RED_WORKER_MESSAGE_CURSOR_CHANNEL_CREATE,
-
- RED_WORKER_MESSAGE_MONITORS_CONFIG_ASYNC,
- RED_WORKER_MESSAGE_DRIVER_UNLOAD,
-
- RED_WORKER_MESSAGE_COUNT // LAST
-};
-
-typedef uint32_t RedWorkerMessage;
-
-#define RED_MAX_RENDERERS 4
-
-enum {
- RED_RENDERER_INVALID,
- RED_RENDERER_SW,
- RED_RENDERER_OGL_PBUF,
- RED_RENDERER_OGL_PIXMAP,
-};
-
-typedef struct RedDispatcher RedDispatcher;
-
-typedef struct WorkerInitData {
- struct QXLInstance *qxl;
- int id;
- uint32_t *pending;
- uint32_t num_renderers;
- uint32_t renderers[RED_MAX_RENDERERS];
- spice_image_compression_t image_compression;
- spice_wan_compression_t jpeg_state;
- spice_wan_compression_t zlib_glz_state;
- int streaming_video;
- uint32_t num_memslots;
- uint32_t num_memslots_groups;
- uint8_t memslot_gen_bits;
- uint8_t memslot_id_bits;
- uint8_t internal_groupslot_id;
- uint32_t n_surfaces;
- RedDispatcher *red_dispatcher;
-} WorkerInitData;
-
-void *red_worker_main(void *arg);
-
-static inline void send_data(int fd, void *in_buf, int n)
-{
- uint8_t *buf = in_buf;
- do {
- int now;
- if ((now = write(fd, buf, n)) == -1) {
- if (errno == EINTR) {
- continue;
- }
- spice_error("%s", strerror(errno));
- }
- buf += now;
- n -= now;
- } while (n);
-}
-
-static inline void write_message(int fd, RedWorkerMessage *message)
-{
- send_data(fd, message, sizeof(RedWorkerMessage));
-}
-
-static inline void receive_data(int fd, void *in_buf, int n)
-{
- uint8_t *buf = in_buf;
- do {
- int now;
- if ((now = read(fd, buf, n)) == -1) {
- if (errno == EINTR) {
- continue;
- }
- spice_error("%s", strerror(errno));
- }
- buf += now;
- n -= now;
- } while (n);
-}
-
-static inline void read_message(int fd, RedWorkerMessage *message)
-{
- receive_data(fd, message, sizeof(RedWorkerMessage));
-}
-
-#endif
diff --git a/server/reds-private.h b/server/reds-private.h
index ee09e7cd..50e38486 100644
--- a/server/reds-private.h
+++ b/server/reds-private.h
@@ -1,184 +1,142 @@
-#ifndef REDS_PRIVATE_H
-#define REDS_PRIVATE_H
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
-#include <time.h>
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef REDS_PRIVATE_H_
+#define REDS_PRIVATE_H_
#include <spice/protocol.h>
+#include <spice/stats.h>
+
+#include "main-dispatcher.h"
+#include "main-channel.h"
+#include "inputs-channel.h"
+#include "stat-file.h"
+#include "red-record-qxl.h"
+#include "safe-list.hpp"
-#define MIGRATE_TIMEOUT (1000 * 10) /* 10sec */
-#define MM_TIMER_GRANULARITY_MS (1000 / 30)
+#define MIGRATE_TIMEOUT (MSEC_PER_SEC * 10)
#define MM_TIME_DELTA 400 /*ms*/
-typedef struct TicketAuthentication {
+struct TicketAuthentication {
char password[SPICE_MAX_PASSWORD_LENGTH];
time_t expiration_time;
-} TicketAuthentication;
+};
-typedef struct TicketInfo {
- RSA *rsa;
+struct TicketInfo {
+ EVP_PKEY *rsa;
int rsa_size;
BIGNUM *bn;
SpiceLinkEncryptedTicket encrypted_ticket;
-} TicketInfo;
+};
-typedef struct MonitorMode {
+struct MonitorMode {
uint32_t x_res;
uint32_t y_res;
-} MonitorMode;
-
-typedef struct VDIReadBuf {
- RingItem link;
- uint32_t refs;
-
- int len;
- uint8_t data[SPICE_AGENT_MAX_DATA_SIZE];
-} VDIReadBuf;
-
-static VDIReadBuf *vdi_port_read_buf_get(void);
-static VDIReadBuf *vdi_port_read_buf_ref(VDIReadBuf *buf);
-static void vdi_port_read_buf_unref(VDIReadBuf *buf);
-
-enum {
- VDI_PORT_READ_STATE_READ_HEADER,
- VDI_PORT_READ_STATE_GET_BUFF,
- VDI_PORT_READ_STATE_READ_DATA,
};
-typedef struct VDIPortState {
- SpiceCharDeviceState *base;
- uint32_t plug_generation;
- int client_agent_started;
-
- /* write to agent */
- SpiceCharDeviceWriteBuffer *recv_from_client_buf;
- int recv_from_client_buf_pushed;
- AgentMsgFilter write_filter;
-
- /* read from agent */
- Ring read_bufs;
- uint32_t read_state;
- uint32_t message_receive_len;
- uint8_t *receive_pos;
- uint32_t receive_len;
- VDIReadBuf *current_read_buf;
- AgentMsgFilter read_filter;
-
- VDIChunkHeader vdi_chunk_header;
-
- SpiceMigrateDataMain *mig_data; /* storing it when migration data arrives
- before agent is attached */
-} VDIPortState;
-
-/* messages that are addressed to the agent and are created in the server */
-typedef struct __attribute__ ((__packed__)) VDInternalBuf {
- VDIChunkHeader chunk_header;
- VDAgentMessage header;
- union {
- VDAgentMouseState mouse_state;
- }
- u;
-} VDInternalBuf;
-
-#ifdef RED_STATISTICS
+struct RedsMigPendingLink {
+ SpiceLinkMess *link_msg;
+ RedStream *stream;
+};
-#define REDS_MAX_STAT_NODES 100
-#define REDS_STAT_SHM_SIZE (sizeof(SpiceStat) + REDS_MAX_STAT_NODES * sizeof(SpiceStatNode))
+struct RedsMigTargetClient {
+ RedClient *client;
+ GList *pending_links;
+};
-typedef struct RedsStatValue {
- uint32_t value;
- uint32_t min;
- uint32_t max;
- uint32_t average;
- uint32_t count;
-} RedsStatValue;
+struct ChannelSecurityOptions;
-#endif
+struct RedSSLParameters {
+ char keyfile_password[256];
+ char certs_file[256];
+ char private_key_file[256];
+ char ca_certificate_file[256];
+ char dh_key_file[256];
+ char ciphersuite[256];
+};
-typedef struct RedsMigPendingLink {
- RingItem ring_link; // list of links that belongs to the same client
- SpiceLinkMess *link_msg;
- RedsStream *stream;
-} RedsMigPendingLink;
+struct RedCharDeviceVDIPort;
+struct RedServerConfig;
-typedef struct RedsMigTargetClient {
- RingItem link;
- RedClient *client;
- Ring pending_links;
-} RedsMigTargetClient;
+struct RedsState {
+ SPICE_CXX_GLIB_ALLOCATOR
-typedef struct RedsMigWaitDisconnectClient {
- RingItem link;
- RedClient *client;
-} RedsMigWaitDisconnectClient;
-
-typedef struct SpiceCharDeviceStateItem {
- RingItem link;
- SpiceCharDeviceState *st;
-} SpiceCharDeviceStateItem;
-
-/* Intermediate state for on going monitors config message from a single
- * client, being passed to the guest */
-typedef struct RedsClientMonitorsConfig {
- MainChannelClient *mcc;
- uint8_t *buffer;
- int buffer_size;
- int buffer_pos;
-} RedsClientMonitorsConfig;
-
-typedef struct RedsState {
+ RedServerConfig *config;
int listen_socket;
int secure_listen_socket;
SpiceWatch *listen_watch;
SpiceWatch *secure_listen_watch;
- VDIPortState agent_state;
+ red::shared_ptr<RedCharDeviceVDIPort> agent_dev;
int pending_mouse_event;
- Ring clients;
- int num_clients;
- MainChannel *main_channel;
+ bool pending_device_display_info_message;
+ red::safe_list<RedClient*> clients;
+ red::shared_ptr<MainChannel> main_channel;
+ red::shared_ptr<InputsChannel> inputs_channel;
int mig_wait_connect; /* src waits for clients to establish connection to dest
(before migration starts) */
int mig_wait_disconnect; /* src waits for clients to disconnect (after migration completes) */
- Ring mig_wait_disconnect_clients; /* List of RedsMigWaitDisconnectClient. Holds the clients
+ std::forward_list<RedClient*, red::Mallocator<RedClient*>>
+ mig_wait_disconnect_clients;/* List of RedsMigWaitDisconnectClient. Holds the clients
which the src waits for their disconnection */
+
int mig_inprogress;
int expect_migrate;
int src_do_seamless_migrate; /* per migration. Updated after the migration handshake
between the 2 servers */
int dst_do_seamless_migrate; /* per migration. Updated after the migration handshake
between the 2 servers */
- Ring mig_target_clients;
- int num_mig_target_clients;
- RedsMigSpice *mig_spice;
+ GList *mig_target_clients;
- int num_of_channels;
- Ring channels;
- int mouse_mode;
+ red::safe_list<red::shared_ptr<RedChannel>> channels;
+ SpiceMouseMode mouse_mode;
int is_client_mouse_allowed;
int dispatcher_allows_client_mouse;
MonitorMode monitor_mode;
SpiceTimer *mig_timer;
- SpiceTimer *mm_timer;
int vm_running;
- Ring char_devs_states; /* list of SpiceCharDeviceStateItem */
+ red::safe_list<red::shared_ptr<RedCharDevice>> char_devices;
int seamless_migration_enabled; /* command line arg */
SSL_CTX *ctx;
#ifdef RED_STATISTICS
- char *stat_shm_name;
- SpiceStat *stat;
- pthread_mutex_t stat_lock;
- RedsStatValue roundtrip_stat;
+ RedStatFile *stat_file;
#endif
- int peer_minor_version;
int allow_multiple_clients;
+ bool late_initialization_done;
+
+ /* Intermediate state for on going monitors config message from a single
+ * client, being passed to the guest */
+ SpiceBuffer client_monitors_config;
- RedsClientMonitorsConfig client_monitors_config;
- int mm_timer_enabled;
+ int mm_time_enabled;
uint32_t mm_time_latency;
-} RedsState;
-#endif
+ SpiceCharDeviceInstance *vdagent;
+ SpiceMigrateInstance *migration_interface;
+
+ SpiceCoreInterfaceInternal core;
+ red::safe_list<QXLInstance*> qxl_instances; // XXX owning
+ red::shared_ptr<MainDispatcher> main_dispatcher;
+ RedRecord *record;
+};
+
+#endif /* REDS_PRIVATE_H_ */
diff --git a/server/reds.c b/server/reds.c
deleted file mode 100644
index ef7ff620..00000000
--- a/server/reds.c
+++ /dev/null
@@ -1,3834 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdint.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <sys/socket.h>
-#include <sys/uio.h>
-#include <netinet/in.h>
-#include <netinet/tcp.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-#include <limits.h>
-#include <time.h>
-#include <pthread.h>
-#include <sys/mman.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <ctype.h>
-#include <stdbool.h>
-
-#include <openssl/err.h>
-
-#if HAVE_SASL
-#include <sasl/sasl.h>
-#endif
-
-#include <glib.h>
-
-#include <spice/protocol.h>
-#include <spice/vd_agent.h>
-#include <spice/stats.h>
-
-#include "common/generated_server_marshallers.h"
-#include "common/ring.h"
-
-#include "spice.h"
-#include "spice-experimental.h"
-#include "reds.h"
-#include "agent-msg-filter.h"
-#include "inputs_channel.h"
-#include "main_channel.h"
-#include "red_common.h"
-#include "red_dispatcher.h"
-#include "main_dispatcher.h"
-#include "snd_worker.h"
-#include "stat.h"
-#include "demarshallers.h"
-#include "char_device.h"
-#include "migration_protocol.h"
-#ifdef USE_SMARTCARD
-#include "smartcard.h"
-#endif
-#include "reds_stream.h"
-
-#include "reds-private.h"
-
-SpiceCoreInterface *core = NULL;
-static SpiceCharDeviceInstance *vdagent = NULL;
-static SpiceMigrateInstance *migration_interface = NULL;
-
-/* Debugging only variable: allow multiple client connections to the spice
- * server */
-#define SPICE_DEBUG_ALLOW_MC_ENV "SPICE_DEBUG_ALLOW_MC"
-
-#define MIGRATION_NOTIFY_SPICE_KEY "spice_mig_ext"
-
-#define REDS_MIG_VERSION 3
-#define REDS_MIG_CONTINUE 1
-#define REDS_MIG_ABORT 2
-#define REDS_MIG_DIFF_VERSION 3
-
-#define REDS_TOKENS_TO_SEND 5
-#define REDS_VDI_PORT_NUM_RECEIVE_BUFFS 5
-
-static TicketAuthentication taTicket;
-
-static int spice_port = -1;
-static int spice_secure_port = -1;
-static int spice_listen_socket_fd = -1;
-static char spice_addr[256];
-static int spice_family = PF_UNSPEC;
-static const char *default_renderer = "sw";
-static int sasl_enabled = 0; // sasl disabled by default
-#if HAVE_SASL
-static char *sasl_appname = NULL; // default to "spice" if NULL
-#endif
-static char *spice_name = NULL;
-static bool spice_uuid_is_set = FALSE;
-static uint8_t spice_uuid[16] = { 0, };
-
-static int ticketing_enabled = 1; //Ticketing is enabled by default
-static pthread_mutex_t *lock_cs;
-static long *lock_count;
-uint32_t streaming_video = STREAM_VIDEO_FILTER;
-spice_image_compression_t image_compression = SPICE_IMAGE_COMPRESS_AUTO_GLZ;
-spice_wan_compression_t jpeg_state = SPICE_WAN_COMPRESSION_AUTO;
-spice_wan_compression_t zlib_glz_state = SPICE_WAN_COMPRESSION_AUTO;
-int agent_mouse = TRUE;
-int agent_copypaste = TRUE;
-int agent_file_xfer = TRUE;
-static bool exit_on_disconnect = FALSE;
-
-static RedsState *reds = NULL;
-
-typedef struct RedLinkInfo {
- RedsStream *stream;
- SpiceLinkHeader link_header;
- SpiceLinkMess *link_mess;
- int mess_pos;
- TicketInfo tiTicketing;
- SpiceLinkAuthMechanism auth_mechanism;
- int skip_auth;
-} RedLinkInfo;
-
-typedef struct RedSSLParameters {
- char keyfile_password[256];
- char certs_file[256];
- char private_key_file[256];
- char ca_certificate_file[256];
- char dh_key_file[256];
- char ciphersuite[256];
-} RedSSLParameters;
-
-typedef struct ChannelSecurityOptions ChannelSecurityOptions;
-struct ChannelSecurityOptions {
- uint32_t channel_id;
- uint32_t options;
- ChannelSecurityOptions *next;
-};
-
-static void migrate_timeout(void *opaque);
-static RedsMigTargetClient* reds_mig_target_client_find(RedClient *client);
-static void reds_mig_target_client_free(RedsMigTargetClient *mig_client);
-static void reds_mig_cleanup_wait_disconnect(void);
-static void reds_mig_remove_wait_disconnect_client(RedClient *client);
-static void reds_char_device_add_state(SpiceCharDeviceState *st);
-static void reds_char_device_remove_state(SpiceCharDeviceState *st);
-static void reds_send_mm_time(void);
-
-static ChannelSecurityOptions *channels_security = NULL;
-static int default_channel_security =
- SPICE_CHANNEL_SECURITY_NONE | SPICE_CHANNEL_SECURITY_SSL;
-
-static RedSSLParameters ssl_parameters;
-
-static ChannelSecurityOptions *find_channel_security(int id)
-{
- ChannelSecurityOptions *now = channels_security;
- while (now && now->channel_id != id) {
- now = now->next;
- }
- return now;
-}
-
-void reds_handle_channel_event(int event, SpiceChannelEventInfo *info)
-{
- if (core->base.minor_version >= 3 && core->channel_event != NULL)
- core->channel_event(event, info);
-
- if (event == SPICE_CHANNEL_EVENT_DISCONNECTED) {
- free(info);
- }
-}
-
-static void reds_link_free(RedLinkInfo *link)
-{
- reds_stream_free(link->stream);
- link->stream = NULL;
-
- free(link->link_mess);
- link->link_mess = NULL;
-
- BN_free(link->tiTicketing.bn);
- link->tiTicketing.bn = NULL;
-
- if (link->tiTicketing.rsa) {
- RSA_free(link->tiTicketing.rsa);
- link->tiTicketing.rsa = NULL;
- }
-
- free(link);
-}
-
-#ifdef RED_STATISTICS
-
-static void insert_stat_node(StatNodeRef parent, StatNodeRef ref)
-{
- SpiceStatNode *node = &reds->stat->nodes[ref];
- uint32_t pos = INVALID_STAT_REF;
- uint32_t node_index;
- uint32_t *head;
- SpiceStatNode *n;
-
- node->first_child_index = INVALID_STAT_REF;
- head = (parent == INVALID_STAT_REF ? &reds->stat->root_index :
- &reds->stat->nodes[parent].first_child_index);
- node_index = *head;
- while (node_index != INVALID_STAT_REF && (n = &reds->stat->nodes[node_index]) &&
- strcmp(node->name, n->name) > 0) {
- pos = node_index;
- node_index = n->next_sibling_index;
- }
- if (pos == INVALID_STAT_REF) {
- node->next_sibling_index = *head;
- *head = ref;
- } else {
- n = &reds->stat->nodes[pos];
- node->next_sibling_index = n->next_sibling_index;
- n->next_sibling_index = ref;
- }
-}
-
-StatNodeRef stat_add_node(StatNodeRef parent, const char *name, int visible)
-{
- StatNodeRef ref;
- SpiceStatNode *node;
-
- spice_assert(name && strlen(name) > 0);
- if (strlen(name) >= sizeof(node->name)) {
- return INVALID_STAT_REF;
- }
- pthread_mutex_lock(&reds->stat_lock);
- ref = (parent == INVALID_STAT_REF ? reds->stat->root_index :
- reds->stat->nodes[parent].first_child_index);
- while (ref != INVALID_STAT_REF) {
- node = &reds->stat->nodes[ref];
- if (strcmp(name, node->name)) {
- ref = node->next_sibling_index;
- } else {
- pthread_mutex_unlock(&reds->stat_lock);
- return ref;
- }
- }
- if (reds->stat->num_of_nodes >= REDS_MAX_STAT_NODES || reds->stat == NULL) {
- pthread_mutex_unlock(&reds->stat_lock);
- return INVALID_STAT_REF;
- }
- reds->stat->generation++;
- reds->stat->num_of_nodes++;
- for (ref = 0; ref <= REDS_MAX_STAT_NODES; ref++) {
- node = &reds->stat->nodes[ref];
- if (!(node->flags & SPICE_STAT_NODE_FLAG_ENABLED)) {
- break;
- }
- }
- spice_assert(!(node->flags & SPICE_STAT_NODE_FLAG_ENABLED));
- node->value = 0;
- node->flags = SPICE_STAT_NODE_FLAG_ENABLED | (visible ? SPICE_STAT_NODE_FLAG_VISIBLE : 0);
- g_strlcpy(node->name, name, sizeof(node->name));
- insert_stat_node(parent, ref);
- pthread_mutex_unlock(&reds->stat_lock);
- return ref;
-}
-
-static void stat_remove(SpiceStatNode *node)
-{
- pthread_mutex_lock(&reds->stat_lock);
- node->flags &= ~SPICE_STAT_NODE_FLAG_ENABLED;
- reds->stat->generation++;
- reds->stat->num_of_nodes--;
- pthread_mutex_unlock(&reds->stat_lock);
-}
-
-void stat_remove_node(StatNodeRef ref)
-{
- stat_remove(&reds->stat->nodes[ref]);
-}
-
-uint64_t *stat_add_counter(StatNodeRef parent, const char *name, int visible)
-{
- StatNodeRef ref = stat_add_node(parent, name, visible);
- SpiceStatNode *node;
-
- if (ref == INVALID_STAT_REF) {
- return NULL;
- }
- node = &reds->stat->nodes[ref];
- node->flags |= SPICE_STAT_NODE_FLAG_VALUE;
- return &node->value;
-}
-
-void stat_remove_counter(uint64_t *counter)
-{
- stat_remove((SpiceStatNode *)(counter - offsetof(SpiceStatNode, value)));
-}
-
-void reds_update_stat_value(uint32_t value)
-{
- RedsStatValue *stat_value = &reds->roundtrip_stat;
-
- stat_value->value = value;
- stat_value->min = (stat_value->count ? MIN(stat_value->min, value) : value);
- stat_value->max = MAX(stat_value->max, value);
- stat_value->average = (stat_value->average * stat_value->count + value) /
- (stat_value->count + 1);
- stat_value->count++;
-}
-
-#endif
-
-void reds_register_channel(RedChannel *channel)
-{
- spice_assert(reds);
- ring_add(&reds->channels, &channel->link);
- reds->num_of_channels++;
-}
-
-void reds_unregister_channel(RedChannel *channel)
-{
- if (ring_item_is_linked(&channel->link)) {
- ring_remove(&channel->link);
- reds->num_of_channels--;
- } else {
- spice_warning("not found");
- }
-}
-
-static RedChannel *reds_find_channel(uint32_t type, uint32_t id)
-{
- RingItem *now;
-
- RING_FOREACH(now, &reds->channels) {
- RedChannel *channel = SPICE_CONTAINEROF(now, RedChannel, link);
- if (channel->type == type && channel->id == id) {
- return channel;
- }
- }
- return NULL;
-}
-
-static void reds_mig_cleanup(void)
-{
- if (reds->mig_inprogress) {
-
- if (reds->mig_wait_connect || reds->mig_wait_disconnect) {
- SpiceMigrateInterface *sif;
- spice_assert(migration_interface);
- sif = SPICE_CONTAINEROF(migration_interface->base.sif, SpiceMigrateInterface, base);
- if (reds->mig_wait_connect) {
- sif->migrate_connect_complete(migration_interface);
- } else {
- if (sif->migrate_end_complete) {
- sif->migrate_end_complete(migration_interface);
- }
- }
- }
- reds->mig_inprogress = FALSE;
- reds->mig_wait_connect = FALSE;
- reds->mig_wait_disconnect = FALSE;
- core->timer_cancel(reds->mig_timer);
- reds_mig_cleanup_wait_disconnect();
- }
-}
-
-static void reds_reset_vdp(void)
-{
- VDIPortState *state = &reds->agent_state;
- SpiceCharDeviceInterface *sif;
-
- state->read_state = VDI_PORT_READ_STATE_READ_HEADER;
- state->receive_pos = (uint8_t *)&state->vdi_chunk_header;
- state->receive_len = sizeof(state->vdi_chunk_header);
- state->message_receive_len = 0;
- if (state->current_read_buf) {
- vdi_port_read_buf_unref(state->current_read_buf);
- state->current_read_buf = NULL;
- }
- /* Reset read filter to start with clean state when the agent reconnects */
- agent_msg_filter_init(&state->read_filter, agent_copypaste,
- agent_file_xfer, TRUE);
- /* Throw away pending chunks from the current (if any) and future
- * messages written by the client.
- * TODO: client should clear its agent messages queue when the agent
- * is disconnect. Currently, when and agent gets disconnected and reconnected,
- * messeges that were directed to the previous instance of the agent continues
- * to be sent from the client. This TODO will require server, protocol, and client changes */
- state->write_filter.result = AGENT_MSG_FILTER_DISCARD;
- state->write_filter.discard_all = TRUE;
- state->client_agent_started = FALSE;
-
- /* reseting and not destroying the state as a workaround for a bad
- * tokens management in the vdagent protocol:
- * The client tokens' are set only once, when the main channel is initialized.
- * Instead, it would have been more appropriate to reset them upon AGEN_CONNECT.
- * The client tokens are tracked as part of the SpiceCharDeviceClientState. Thus,
- * in order to be backward compatible with the client, we need to track the tokens
- * even if the agent is detached. We don't destroy the char_device state, and
- * instead we just reset it.
- * In addition, there used to be a misshandling of AGENT_TOKENS message in spice-gtk: it
- * overrides the amount of tokens, instead of adding the given amount.
- */
- if (red_channel_test_remote_cap(&reds->main_channel->base,
- SPICE_MAIN_CAP_AGENT_CONNECTED_TOKENS)) {
- spice_char_device_state_destroy(state->base);
- state->base = NULL;
- } else {
- spice_char_device_reset(state->base);
- }
-
- sif = SPICE_CONTAINEROF(vdagent->base.sif, SpiceCharDeviceInterface, base);
- if (sif->state) {
- sif->state(vdagent, 0);
- }
-}
-
-static int reds_main_channel_connected(void)
-{
- return main_channel_is_connected(reds->main_channel);
-}
-
-void reds_client_disconnect(RedClient *client)
-{
- RedsMigTargetClient *mig_client;
-
- if (exit_on_disconnect)
- {
- spice_info("Exiting server because of client disconnect.\n");
- exit(0);
- }
-
- if (!client || client->disconnecting) {
- spice_debug("client %p already during disconnection", client);
- return;
- }
-
- spice_info(NULL);
- /* disconnecting is set to prevent recursion because of the following:
- * main_channel_client_on_disconnect->
- * reds_client_disconnect->red_client_destroy->main_channel...
- */
- client->disconnecting = TRUE;
-
- // TODO: we need to handle agent properly for all clients!!!! (e.g., cut and paste, how?)
- // We shouldn't initialize the agent when there are still clients connected
-
- mig_client = reds_mig_target_client_find(client);
- if (mig_client) {
- reds_mig_target_client_free(mig_client);
- }
-
- if (reds->mig_wait_disconnect) {
- reds_mig_remove_wait_disconnect_client(client);
- }
-
- if (reds->agent_state.base) {
- /* note that vdagent might be NULL, if the vdagent was once
- * up and than was removed */
- if (spice_char_device_client_exists(reds->agent_state.base, client)) {
- spice_char_device_client_remove(reds->agent_state.base, client);
- }
- }
-
- ring_remove(&client->link);
- reds->num_clients--;
- red_client_destroy(client);
-
- // TODO: we need to handle agent properly for all clients!!!! (e.g., cut and paste, how? Maybe throw away messages
- // if we are in the middle of one from another client)
- if (reds->num_clients == 0) {
- /* Let the agent know the client is disconnected */
- if (reds->agent_state.base) {
- SpiceCharDeviceWriteBuffer *char_dev_buf;
- VDInternalBuf *internal_buf;
- uint32_t total_msg_size;
-
- total_msg_size = sizeof(VDIChunkHeader) + sizeof(VDAgentMessage);
- char_dev_buf = spice_char_device_write_buffer_get_server_no_token(
- reds->agent_state.base, total_msg_size);
- char_dev_buf->buf_used = total_msg_size;
- internal_buf = (VDInternalBuf *)char_dev_buf->buf;
- internal_buf->chunk_header.port = VDP_SERVER_PORT;
- internal_buf->chunk_header.size = sizeof(VDAgentMessage);
- internal_buf->header.protocol = VD_AGENT_PROTOCOL;
- internal_buf->header.type = VD_AGENT_CLIENT_DISCONNECTED;
- internal_buf->header.opaque = 0;
- internal_buf->header.size = 0;
-
- spice_char_device_write_buffer_add(reds->agent_state.base,
- char_dev_buf);
- }
-
- /* Reset write filter to start with clean state on client reconnect */
- agent_msg_filter_init(&reds->agent_state.write_filter, agent_copypaste,
- agent_file_xfer, TRUE);
-
- /* Throw away pending chunks from the current (if any) and future
- * messages read from the agent */
- reds->agent_state.read_filter.result = AGENT_MSG_FILTER_DISCARD;
- reds->agent_state.read_filter.discard_all = TRUE;
- free(reds->agent_state.mig_data);
- reds->agent_state.mig_data = NULL;
-
- reds_mig_cleanup();
- }
-}
-
-// TODO: go over all usage of reds_disconnect, most/some of it should be converted to
-// reds_client_disconnect
-static void reds_disconnect(void)
-{
- RingItem *link, *next;
-
- spice_info(NULL);
- RING_FOREACH_SAFE(link, next, &reds->clients) {
- reds_client_disconnect(SPICE_CONTAINEROF(link, RedClient, link));
- }
- reds_mig_cleanup();
-}
-
-static void reds_mig_disconnect(void)
-{
- if (reds_main_channel_connected()) {
- reds_disconnect();
- } else {
- reds_mig_cleanup();
- }
-}
-
-int reds_get_mouse_mode(void)
-{
- return reds->mouse_mode;
-}
-
-static void reds_set_mouse_mode(uint32_t mode)
-{
- if (reds->mouse_mode == mode) {
- return;
- }
- reds->mouse_mode = mode;
- red_dispatcher_set_mouse_mode(reds->mouse_mode);
- main_channel_push_mouse_mode(reds->main_channel, reds->mouse_mode, reds->is_client_mouse_allowed);
-}
-
-int reds_get_agent_mouse(void)
-{
- return agent_mouse;
-}
-
-static void reds_update_mouse_mode(void)
-{
- int allowed = 0;
- int qxl_count = red_dispatcher_qxl_count();
-
- if ((agent_mouse && vdagent) || (inputs_has_tablet() && qxl_count == 1)) {
- allowed = reds->dispatcher_allows_client_mouse;
- }
- if (allowed == reds->is_client_mouse_allowed) {
- return;
- }
- reds->is_client_mouse_allowed = allowed;
- if (reds->mouse_mode == SPICE_MOUSE_MODE_CLIENT && !allowed) {
- reds_set_mouse_mode(SPICE_MOUSE_MODE_SERVER);
- return;
- }
- if (reds->main_channel) {
- main_channel_push_mouse_mode(reds->main_channel, reds->mouse_mode,
- reds->is_client_mouse_allowed);
- }
-}
-
-static void reds_agent_remove(void)
-{
- // TODO: agent is broken with multiple clients. also need to figure out what to do when
- // part of the clients are during target migration.
- reds_reset_vdp();
-
- vdagent = NULL;
- reds_update_mouse_mode();
- if (reds_main_channel_connected() &&
- !red_channel_waits_for_migrate_data(&reds->main_channel->base)) {
- main_channel_push_agent_disconnected(reds->main_channel);
- }
-}
-
-/*******************************
- * Char device state callbacks *
- * *****************************/
-
-static void vdi_port_read_buf_release(uint8_t *data, void *opaque)
-{
- VDIReadBuf *buf = (VDIReadBuf *)opaque;
-
- vdi_port_read_buf_unref(buf);
-}
-
-/* returns TRUE if the buffer can be forwarded */
-static int vdi_port_read_buf_process(int port, VDIReadBuf *buf)
-{
- VDIPortState *state = &reds->agent_state;
- int res;
-
- switch (port) {
- case VDP_CLIENT_PORT: {
- res = agent_msg_filter_process_data(&state->read_filter,
- buf->data, buf->len);
- switch (res) {
- case AGENT_MSG_FILTER_OK:
- return TRUE;
- case AGENT_MSG_FILTER_DISCARD:
- return FALSE;
- case AGENT_MSG_FILTER_PROTO_ERROR:
- reds_agent_remove();
- return FALSE;
- }
- }
- case VDP_SERVER_PORT:
- return FALSE;
- default:
- spice_warning("invalid port");
- reds_agent_remove();
- return FALSE;
- }
-}
-
-static VDIReadBuf *vdi_port_read_buf_get(void)
-{
- VDIPortState *state = &reds->agent_state;
- RingItem *item;
- VDIReadBuf *buf;
-
- if (!(item = ring_get_head(&state->read_bufs))) {
- return NULL;
- }
-
- ring_remove(item);
- buf = SPICE_CONTAINEROF(item, VDIReadBuf, link);
-
- buf->refs = 1;
- return buf;
-}
-
-static VDIReadBuf* vdi_port_read_buf_ref(VDIReadBuf *buf)
-{
- buf->refs++;
- return buf;
-}
-
-static void vdi_port_read_buf_unref(VDIReadBuf *buf)
-{
- if (!--buf->refs) {
- ring_add(&reds->agent_state.read_bufs, &buf->link);
-
- /* read_one_msg_from_vdi_port may have never completed because the read_bufs
- ring was empty. So we call it again so it can complete its work if
- necessary. Note that since we can be called from spice_char_device_wakeup
- this can cause recursion, but we have protection for that */
- if (reds->agent_state.base) {
- spice_char_device_wakeup(reds->agent_state.base);
- }
- }
-}
-
-/* reads from the device till completes reading a message that is addressed to the client,
- * or otherwise, when reading from the device fails */
-static SpiceCharDeviceMsgToClient *vdi_port_read_one_msg_from_device(SpiceCharDeviceInstance *sin,
- void *opaque)
-{
- VDIPortState *state = &reds->agent_state;
- SpiceCharDeviceInterface *sif;
- VDIReadBuf *dispatch_buf;
- int n;
-
- if (!vdagent) {
- return NULL;
- }
- spice_assert(vdagent == sin);
- sif = SPICE_CONTAINEROF(vdagent->base.sif, SpiceCharDeviceInterface, base);
- while (vdagent) {
- switch (state->read_state) {
- case VDI_PORT_READ_STATE_READ_HEADER:
- n = sif->read(vdagent, state->receive_pos, state->receive_len);
- if (!n) {
- return NULL;
- }
- if ((state->receive_len -= n)) {
- state->receive_pos += n;
- return NULL;
- }
- state->message_receive_len = state->vdi_chunk_header.size;
- state->read_state = VDI_PORT_READ_STATE_GET_BUFF;
- case VDI_PORT_READ_STATE_GET_BUFF: {
- if (!(state->current_read_buf = vdi_port_read_buf_get())) {
- return NULL;
- }
- state->receive_pos = state->current_read_buf->data;
- state->receive_len = MIN(state->message_receive_len,
- sizeof(state->current_read_buf->data));
- state->current_read_buf->len = state->receive_len;
- state->message_receive_len -= state->receive_len;
- state->read_state = VDI_PORT_READ_STATE_READ_DATA;
- }
- case VDI_PORT_READ_STATE_READ_DATA:
- n = sif->read(vdagent, state->receive_pos, state->receive_len);
- if (!n) {
- return NULL;
- }
- if ((state->receive_len -= n)) {
- state->receive_pos += n;
- break;
- }
- dispatch_buf = state->current_read_buf;
- state->current_read_buf = NULL;
- state->receive_pos = NULL;
- if (state->message_receive_len == 0) {
- state->read_state = VDI_PORT_READ_STATE_READ_HEADER;
- state->receive_pos = (uint8_t *)&state->vdi_chunk_header;
- state->receive_len = sizeof(state->vdi_chunk_header);
- } else {
- state->read_state = VDI_PORT_READ_STATE_GET_BUFF;
- }
- if (vdi_port_read_buf_process(state->vdi_chunk_header.port, dispatch_buf)) {
- return dispatch_buf;
- } else {
- vdi_port_read_buf_unref(dispatch_buf);
- }
- } /* END switch */
- } /* END while */
- return NULL;
-}
-
-static SpiceCharDeviceMsgToClient *vdi_port_ref_msg_to_client(SpiceCharDeviceMsgToClient *msg,
- void *opaque)
-{
- return vdi_port_read_buf_ref(msg);
-}
-
-static void vdi_port_unref_msg_to_client(SpiceCharDeviceMsgToClient *msg,
- void *opaque)
-{
- vdi_port_read_buf_unref(msg);
-}
-
-/* after calling this, we unref the message, and the ref is in the instance side */
-static void vdi_port_send_msg_to_client(SpiceCharDeviceMsgToClient *msg,
- RedClient *client,
- void *opaque)
-{
- VDIReadBuf *agent_data_buf = msg;
-
- main_channel_client_push_agent_data(red_client_get_main(client),
- agent_data_buf->data,
- agent_data_buf->len,
- vdi_port_read_buf_release,
- vdi_port_read_buf_ref(agent_data_buf));
-}
-
-static void vdi_port_send_tokens_to_client(RedClient *client, uint32_t tokens, void *opaque)
-{
- main_channel_client_push_agent_tokens(red_client_get_main(client),
- tokens);
-}
-
-static void vdi_port_on_free_self_token(void *opaque)
-{
-
- if (inputs_inited() && reds->pending_mouse_event) {
- spice_debug("pending mouse event");
- reds_handle_agent_mouse_event(inputs_get_mouse_state());
- }
-}
-
-static void vdi_port_remove_client(RedClient *client, void *opaque)
-{
- red_channel_client_shutdown(main_channel_client_get_base(
- red_client_get_main(client)));
-}
-
-/****************************************************************************/
-
-int reds_has_vdagent(void)
-{
- return !!vdagent;
-}
-
-void reds_handle_agent_mouse_event(const VDAgentMouseState *mouse_state)
-{
- SpiceCharDeviceWriteBuffer *char_dev_buf;
- VDInternalBuf *internal_buf;
- uint32_t total_msg_size;
-
- if (!inputs_inited() || !reds->agent_state.base) {
- return;
- }
-
- total_msg_size = sizeof(VDIChunkHeader) + sizeof(VDAgentMessage) +
- sizeof(VDAgentMouseState);
- char_dev_buf = spice_char_device_write_buffer_get(reds->agent_state.base,
- NULL,
- total_msg_size);
-
- if (!char_dev_buf) {
- reds->pending_mouse_event = TRUE;
-
- return;
- }
- reds->pending_mouse_event = FALSE;
-
- internal_buf = (VDInternalBuf *)char_dev_buf->buf;
- internal_buf->chunk_header.port = VDP_SERVER_PORT;
- internal_buf->chunk_header.size = sizeof(VDAgentMessage) + sizeof(VDAgentMouseState);
- internal_buf->header.protocol = VD_AGENT_PROTOCOL;
- internal_buf->header.type = VD_AGENT_MOUSE_STATE;
- internal_buf->header.opaque = 0;
- internal_buf->header.size = sizeof(VDAgentMouseState);
- internal_buf->u.mouse_state = *mouse_state;
-
- char_dev_buf->buf_used = total_msg_size;
- spice_char_device_write_buffer_add(reds->agent_state.base, char_dev_buf);
-}
-
-int reds_num_of_channels(void)
-{
- return reds ? reds->num_of_channels : 0;
-}
-
-
-int reds_num_of_clients(void)
-{
- return reds ? reds->num_clients : 0;
-}
-
-SPICE_GNUC_VISIBLE int spice_server_get_num_clients(SpiceServer *s)
-{
- spice_assert(reds == s);
- return reds_num_of_clients();
-}
-
-static int secondary_channels[] = {
- SPICE_CHANNEL_MAIN, SPICE_CHANNEL_DISPLAY, SPICE_CHANNEL_CURSOR, SPICE_CHANNEL_INPUTS};
-
-static int channel_is_secondary(RedChannel *channel)
-{
- int i;
- for (i = 0 ; i < sizeof(secondary_channels)/sizeof(secondary_channels[0]); ++i) {
- if (channel->type == secondary_channels[i]) {
- return TRUE;
- }
- }
- return FALSE;
-}
-
-void reds_fill_channels(SpiceMsgChannels *channels_info)
-{
- RingItem *now;
- int used_channels = 0;
-
- channels_info->num_of_channels = reds->num_of_channels;
- RING_FOREACH(now, &reds->channels) {
- RedChannel *channel = SPICE_CONTAINEROF(now, RedChannel, link);
- if (reds->num_clients > 1 && !channel_is_secondary(channel)) {
- continue;
- }
- channels_info->channels[used_channels].type = channel->type;
- channels_info->channels[used_channels].id = channel->id;
- used_channels++;
- }
-
- channels_info->num_of_channels = used_channels;
- if (used_channels != reds->num_of_channels) {
- spice_warning("sent %d out of %d", used_channels, reds->num_of_channels);
- }
-}
-
-void reds_on_main_agent_start(MainChannelClient *mcc, uint32_t num_tokens)
-{
- SpiceCharDeviceState *dev_state = reds->agent_state.base;
- RedChannelClient *rcc;
-
- if (!vdagent) {
- return;
- }
- spice_assert(vdagent->st && vdagent->st == dev_state);
- rcc = main_channel_client_get_base(mcc);
- reds->agent_state.client_agent_started = TRUE;
- /*
- * Note that in older releases, send_tokens were set to ~0 on both client
- * and server. The server ignored the client given tokens.
- * Thanks to that, when an old client is connected to a new server,
- * and vice versa, the sending from the server to the client won't have
- * flow control, but will have no other problem.
- */
- if (!spice_char_device_client_exists(dev_state, rcc->client)) {
- int client_added;
-
- client_added = spice_char_device_client_add(dev_state,
- rcc->client,
- TRUE, /* flow control */
- REDS_VDI_PORT_NUM_RECEIVE_BUFFS,
- REDS_AGENT_WINDOW_SIZE,
- num_tokens,
- red_channel_client_waits_for_migrate_data(rcc));
-
- if (!client_added) {
- spice_warning("failed to add client to agent");
- red_channel_client_shutdown(rcc);
- return;
- }
- } else {
- spice_char_device_send_to_client_tokens_set(dev_state,
- rcc->client,
- num_tokens);
- }
- reds->agent_state.write_filter.discard_all = FALSE;
-}
-
-void reds_on_main_agent_tokens(MainChannelClient *mcc, uint32_t num_tokens)
-{
- if (!vdagent) {
- return;
- }
- spice_assert(vdagent->st);
- spice_char_device_send_to_client_tokens_add(vdagent->st,
- main_channel_client_get_base(mcc)->client,
- num_tokens);
-}
-
-uint8_t *reds_get_agent_data_buffer(MainChannelClient *mcc, size_t size)
-{
- VDIPortState *dev_state = &reds->agent_state;
- RedClient *client;
-
- if (!dev_state->client_agent_started) {
- /*
- * agent got disconnected, and possibly got reconnected, but we still can receive
- * msgs that are addressed to the agent's old instance, in case they were
- * sent by the client before it received the AGENT_DISCONNECTED msg.
- * In such case, we will receive and discard the msgs (reds_reset_vdp takes care
- * of setting state->write_filter.result = AGENT_MSG_FILTER_DISCARD).
- */
- return spice_malloc(size);
- }
-
- spice_assert(dev_state->recv_from_client_buf == NULL);
- client = main_channel_client_get_base(mcc)->client;
- dev_state->recv_from_client_buf = spice_char_device_write_buffer_get(dev_state->base,
- client,
- size + sizeof(VDIChunkHeader));
- dev_state->recv_from_client_buf_pushed = FALSE;
- return dev_state->recv_from_client_buf->buf + sizeof(VDIChunkHeader);
-}
-
-void reds_release_agent_data_buffer(uint8_t *buf)
-{
- VDIPortState *dev_state = &reds->agent_state;
-
- if (!dev_state->recv_from_client_buf) {
- free(buf);
- return;
- }
-
- spice_assert(buf == dev_state->recv_from_client_buf->buf + sizeof(VDIChunkHeader));
- if (!dev_state->recv_from_client_buf_pushed) {
- spice_char_device_write_buffer_release(reds->agent_state.base,
- dev_state->recv_from_client_buf);
- }
- dev_state->recv_from_client_buf = NULL;
- dev_state->recv_from_client_buf_pushed = FALSE;
-}
-
-static void reds_client_monitors_config_cleanup(void)
-{
- RedsClientMonitorsConfig *cmc = &reds->client_monitors_config;
-
- cmc->buffer_size = cmc->buffer_pos = 0;
- free(cmc->buffer);
- cmc->buffer = NULL;
- cmc->mcc = NULL;
-}
-
-static void reds_on_main_agent_monitors_config(
- MainChannelClient *mcc, void *message, size_t size)
-{
- VDAgentMessage *msg_header;
- VDAgentMonitorsConfig *monitors_config;
- RedsClientMonitorsConfig *cmc = &reds->client_monitors_config;
-
- cmc->buffer_size += size;
- cmc->buffer = realloc(cmc->buffer, cmc->buffer_size);
- spice_assert(cmc->buffer);
- cmc->mcc = mcc;
- memcpy(cmc->buffer + cmc->buffer_pos, message, size);
- cmc->buffer_pos += size;
- msg_header = (VDAgentMessage *)cmc->buffer;
- if (sizeof(VDAgentMessage) > cmc->buffer_size ||
- msg_header->size > cmc->buffer_size - sizeof(VDAgentMessage)) {
- spice_debug("not enough data yet. %d\n", cmc->buffer_size);
- return;
- }
- monitors_config = (VDAgentMonitorsConfig *)(cmc->buffer + sizeof(*msg_header));
- spice_debug("%s: %d\n", __func__, monitors_config->num_of_monitors);
- red_dispatcher_client_monitors_config(monitors_config);
- reds_client_monitors_config_cleanup();
-}
-
-void reds_on_main_agent_data(MainChannelClient *mcc, void *message, size_t size)
-{
- VDIPortState *dev_state = &reds->agent_state;
- VDIChunkHeader *header;
- int res;
-
- res = agent_msg_filter_process_data(&reds->agent_state.write_filter,
- message, size);
- switch (res) {
- case AGENT_MSG_FILTER_OK:
- break;
- case AGENT_MSG_FILTER_DISCARD:
- return;
- case AGENT_MSG_FILTER_MONITORS_CONFIG:
- reds_on_main_agent_monitors_config(mcc, message, size);
- return;
- case AGENT_MSG_FILTER_PROTO_ERROR:
- red_channel_client_shutdown(main_channel_client_get_base(mcc));
- return;
- }
-
- spice_assert(reds->agent_state.recv_from_client_buf);
- spice_assert(message == reds->agent_state.recv_from_client_buf->buf + sizeof(VDIChunkHeader));
- // TODO - start tracking agent data per channel
- header = (VDIChunkHeader *)dev_state->recv_from_client_buf->buf;
- header->port = VDP_CLIENT_PORT;
- header->size = size;
- dev_state->recv_from_client_buf->buf_used = sizeof(VDIChunkHeader) + size;
-
- dev_state->recv_from_client_buf_pushed = TRUE;
- spice_char_device_write_buffer_add(reds->agent_state.base, dev_state->recv_from_client_buf);
-}
-
-void reds_on_main_migrate_connected(int seamless)
-{
- reds->src_do_seamless_migrate = seamless;
- if (reds->mig_wait_connect) {
- reds_mig_cleanup();
- }
-}
-
-void reds_on_main_mouse_mode_request(void *message, size_t size)
-{
- switch (((SpiceMsgcMainMouseModeRequest *)message)->mode) {
- case SPICE_MOUSE_MODE_CLIENT:
- if (reds->is_client_mouse_allowed) {
- reds_set_mouse_mode(SPICE_MOUSE_MODE_CLIENT);
- } else {
- spice_info("client mouse is disabled");
- }
- break;
- case SPICE_MOUSE_MODE_SERVER:
- reds_set_mouse_mode(SPICE_MOUSE_MODE_SERVER);
- break;
- default:
- spice_warning("unsupported mouse mode");
- }
-}
-
-/*
- * Push partial agent data, even if not all the chunk was consumend,
- * in order to avoid the roundtrip (src-server->client->dest-server)
- */
-void reds_on_main_channel_migrate(MainChannelClient *mcc)
-{
- VDIPortState *agent_state = &reds->agent_state;
- uint32_t read_data_len;
-
- spice_assert(reds->num_clients == 1);
-
- if (agent_state->read_state != VDI_PORT_READ_STATE_READ_DATA) {
- return;
- }
- spice_assert(agent_state->current_read_buf->data &&
- agent_state->receive_pos > agent_state->current_read_buf->data);
- read_data_len = agent_state->receive_pos - agent_state->current_read_buf->data;
-
- if (agent_state->read_filter.msg_data_to_read ||
- read_data_len > sizeof(VDAgentMessage)) { /* msg header has been read */
- VDIReadBuf *read_buf = agent_state->current_read_buf;
-
- spice_debug("push partial read %u (msg first chunk? %d)", read_data_len,
- !agent_state->read_filter.msg_data_to_read);
-
- read_buf->len = read_data_len;
- if (vdi_port_read_buf_process(agent_state->vdi_chunk_header.port, read_buf)) {
- main_channel_client_push_agent_data(mcc,
- read_buf->data,
- read_buf->len,
- vdi_port_read_buf_release,
- read_buf);
- } else {
- vdi_port_read_buf_unref(read_buf);
- }
-
- spice_assert(agent_state->receive_len);
- agent_state->message_receive_len += agent_state->receive_len;
- agent_state->read_state = VDI_PORT_READ_STATE_GET_BUFF;
- agent_state->current_read_buf = NULL;
- agent_state->receive_pos = NULL;
- }
-}
-
-void reds_marshall_migrate_data(SpiceMarshaller *m)
-{
- SpiceMigrateDataMain mig_data;
- VDIPortState *agent_state = &reds->agent_state;
- SpiceMarshaller *m2;
-
- memset(&mig_data, 0, sizeof(mig_data));
- spice_marshaller_add_uint32(m, SPICE_MIGRATE_DATA_MAIN_MAGIC);
- spice_marshaller_add_uint32(m, SPICE_MIGRATE_DATA_MAIN_VERSION);
-
- if (!vdagent) {
- uint8_t *null_agent_mig_data;
-
- spice_assert(!agent_state->base); /* MSG_AGENT_CONNECTED_TOKENS is supported by the client
- (see spice_server_migrate_connect), so SpiceCharDeviceState
- is destroyed when the agent is disconnected and
- there is no need to track the client tokens
- (see reds_reset_vdp) */
- spice_char_device_state_migrate_data_marshall_empty(m);
- null_agent_mig_data = spice_marshaller_reserve_space(m,
- sizeof(SpiceMigrateDataMain) -
- sizeof(SpiceMigrateDataCharDevice));
- memset(null_agent_mig_data,
- 0,
- sizeof(SpiceMigrateDataMain) - sizeof(SpiceMigrateDataCharDevice));
- return;
- }
-
- spice_char_device_state_migrate_data_marshall(reds->agent_state.base, m);
- spice_marshaller_add_uint8(m, reds->agent_state.client_agent_started);
-
- mig_data.agent2client.chunk_header = agent_state->vdi_chunk_header;
-
- /* agent to client partial msg */
- if (agent_state->read_state == VDI_PORT_READ_STATE_READ_HEADER) {
- mig_data.agent2client.chunk_header_size = agent_state->receive_pos -
- (uint8_t *)&agent_state->vdi_chunk_header;
-
- mig_data.agent2client.msg_header_done = FALSE;
- mig_data.agent2client.msg_header_partial_len = 0;
- spice_assert(!agent_state->read_filter.msg_data_to_read);
- } else {
- mig_data.agent2client.chunk_header_size = sizeof(VDIChunkHeader);
- mig_data.agent2client.chunk_header.size = agent_state->message_receive_len;
- if (agent_state->read_state == VDI_PORT_READ_STATE_READ_DATA) {
- /* in the middle of reading the message header (see reds_on_main_channel_migrate) */
- mig_data.agent2client.msg_header_done = FALSE;
- mig_data.agent2client.msg_header_partial_len =
- agent_state->receive_pos - agent_state->current_read_buf->data;
- spice_assert(mig_data.agent2client.msg_header_partial_len < sizeof(VDAgentMessage));
- spice_assert(!agent_state->read_filter.msg_data_to_read);
- } else {
- mig_data.agent2client.msg_header_done = TRUE;
- mig_data.agent2client.msg_remaining = agent_state->read_filter.msg_data_to_read;
- mig_data.agent2client.msg_filter_result = agent_state->read_filter.result;
- }
- }
- spice_marshaller_add_uint32(m, mig_data.agent2client.chunk_header_size);
- spice_marshaller_add(m,
- (uint8_t *)&mig_data.agent2client.chunk_header,
- sizeof(VDIChunkHeader));
- spice_marshaller_add_uint8(m, mig_data.agent2client.msg_header_done);
- spice_marshaller_add_uint32(m, mig_data.agent2client.msg_header_partial_len);
- m2 = spice_marshaller_get_ptr_submarshaller(m, 0);
- spice_marshaller_add(m2, agent_state->current_read_buf->data,
- mig_data.agent2client.msg_header_partial_len);
- spice_marshaller_add_uint32(m, mig_data.agent2client.msg_remaining);
- spice_marshaller_add_uint8(m, mig_data.agent2client.msg_filter_result);
-
- mig_data.client2agent.msg_remaining = agent_state->write_filter.msg_data_to_read;
- mig_data.client2agent.msg_filter_result = agent_state->write_filter.result;
- spice_marshaller_add_uint32(m, mig_data.client2agent.msg_remaining);
- spice_marshaller_add_uint8(m, mig_data.client2agent.msg_filter_result);
- spice_debug("from agent filter: discard all %d, wait_msg %u, msg_filter_result %d",
- agent_state->read_filter.discard_all,
- agent_state->read_filter.msg_data_to_read,
- agent_state->read_filter.result);
- spice_debug("to agent filter: discard all %d, wait_msg %u, msg_filter_result %d",
- agent_state->write_filter.discard_all,
- agent_state->write_filter.msg_data_to_read,
- agent_state->write_filter.result);
-}
-
-static int reds_agent_state_restore(SpiceMigrateDataMain *mig_data)
-{
- VDIPortState *agent_state = &reds->agent_state;
- uint32_t chunk_header_remaining;
-
- agent_state->vdi_chunk_header = mig_data->agent2client.chunk_header;
- spice_assert(mig_data->agent2client.chunk_header_size <= sizeof(VDIChunkHeader));
- chunk_header_remaining = sizeof(VDIChunkHeader) - mig_data->agent2client.chunk_header_size;
- if (chunk_header_remaining) {
- agent_state->read_state = VDI_PORT_READ_STATE_READ_HEADER;
- agent_state->receive_pos = (uint8_t *)&agent_state->vdi_chunk_header +
- mig_data->agent2client.chunk_header_size;
- agent_state->receive_len = chunk_header_remaining;
- } else {
- agent_state->message_receive_len = agent_state->vdi_chunk_header.size;
- }
-
- if (!mig_data->agent2client.msg_header_done) {
- uint8_t *partial_msg_header;
-
- if (!chunk_header_remaining) {
- uint32_t cur_buf_size;
-
- agent_state->read_state = VDI_PORT_READ_STATE_READ_DATA;
- agent_state->current_read_buf = vdi_port_read_buf_get();
- spice_assert(agent_state->current_read_buf);
- partial_msg_header = (uint8_t *)mig_data + mig_data->agent2client.msg_header_ptr -
- sizeof(SpiceMiniDataHeader);
- memcpy(agent_state->current_read_buf->data,
- partial_msg_header,
- mig_data->agent2client.msg_header_partial_len);
- agent_state->receive_pos = agent_state->current_read_buf->data +
- mig_data->agent2client.msg_header_partial_len;
- cur_buf_size = sizeof(agent_state->current_read_buf->data) -
- mig_data->agent2client.msg_header_partial_len;
- agent_state->receive_len = MIN(agent_state->message_receive_len, cur_buf_size);
- agent_state->current_read_buf->len = agent_state->receive_len +
- mig_data->agent2client.msg_header_partial_len;
- agent_state->message_receive_len -= agent_state->receive_len;
- } else {
- spice_assert(mig_data->agent2client.msg_header_partial_len == 0);
- }
- } else {
- agent_state->read_state = VDI_PORT_READ_STATE_GET_BUFF;
- agent_state->current_read_buf = NULL;
- agent_state->receive_pos = NULL;
- agent_state->read_filter.msg_data_to_read = mig_data->agent2client.msg_remaining;
- agent_state->read_filter.result = mig_data->agent2client.msg_filter_result;
- }
-
- agent_state->read_filter.discard_all = FALSE;
- agent_state->write_filter.discard_all = !mig_data->client_agent_started;
- agent_state->client_agent_started = mig_data->client_agent_started;
-
- agent_state->write_filter.msg_data_to_read = mig_data->client2agent.msg_remaining;
- agent_state->write_filter.result = mig_data->client2agent.msg_filter_result;
-
- spice_debug("to agent filter: discard all %d, wait_msg %u, msg_filter_result %d",
- agent_state->write_filter.discard_all,
- agent_state->write_filter.msg_data_to_read,
- agent_state->write_filter.result);
- spice_debug("from agent filter: discard all %d, wait_msg %u, msg_filter_result %d",
- agent_state->read_filter.discard_all,
- agent_state->read_filter.msg_data_to_read,
- agent_state->read_filter.result);
- return spice_char_device_state_restore(agent_state->base, &mig_data->agent_base);
-}
-
-/*
- * The agent device is not attached to the dest before migration is completed. It is
- * attached only after the vm is started. It might be attached before or after
- * the migration data has reached the server.
- */
-int reds_handle_migrate_data(MainChannelClient *mcc, SpiceMigrateDataMain *mig_data, uint32_t size)
-{
- VDIPortState *agent_state = &reds->agent_state;
-
- spice_debug("main-channel: got migrate data");
- /*
- * Now that the client has switched to the target server, if main_channel
- * controls the mm-time, we update the client's mm-time.
- * (MSG_MAIN_INIT is not sent for a migrating connection)
- */
- if (reds->mm_timer_enabled) {
- reds_send_mm_time();
- }
- if (mig_data->agent_base.connected) {
- if (agent_state->base) { // agent was attached before migration data has arrived
- if (!vdagent) {
- spice_assert(agent_state->plug_generation > 0);
- main_channel_push_agent_disconnected(reds->main_channel);
- spice_debug("agent is no longer connected");
- } else {
- if (agent_state->plug_generation > 1) {
- /* spice_char_device_state_reset takes care of not making the device wait for migration data */
- spice_debug("agent has been detached and reattached before receiving migration data");
- main_channel_push_agent_disconnected(reds->main_channel);
- main_channel_push_agent_connected(reds->main_channel);
- } else {
- spice_debug("restoring state from mig_data");
- return reds_agent_state_restore(mig_data);
- }
- }
- } else {
- /* restore agent starte when the agent gets attached */
- spice_debug("saving mig_data");
- spice_assert(agent_state->plug_generation == 0);
- agent_state->mig_data = spice_memdup(mig_data, size);
- }
- } else {
- spice_debug("agent was not attached on the source host");
- if (vdagent) {
- /* spice_char_device_client_remove disables waiting for migration data */
- spice_char_device_client_remove(agent_state->base,
- main_channel_client_get_base(mcc)->client);
- main_channel_push_agent_connected(reds->main_channel);
- }
- }
-
- return TRUE;
-}
-
-static void reds_channel_init_auth_caps(RedLinkInfo *link, RedChannel *channel)
-{
- if (sasl_enabled && !link->skip_auth) {
- red_channel_set_common_cap(channel, SPICE_COMMON_CAP_AUTH_SASL);
- } else {
- red_channel_set_common_cap(channel, SPICE_COMMON_CAP_AUTH_SPICE);
- }
- red_channel_set_common_cap(channel, SPICE_COMMON_CAP_PROTOCOL_AUTH_SELECTION);
-}
-
-static int reds_send_link_ack(RedLinkInfo *link)
-{
- SpiceLinkHeader header;
- SpiceLinkReply ack;
- RedChannel *channel;
- RedChannelCapabilities *channel_caps;
- BUF_MEM *bmBuf;
- BIO *bio;
- int ret = FALSE;
-
- header.magic = SPICE_MAGIC;
- header.size = sizeof(ack);
- header.major_version = SPICE_VERSION_MAJOR;
- header.minor_version = SPICE_VERSION_MINOR;
-
- ack.error = SPICE_LINK_ERR_OK;
-
- channel = reds_find_channel(link->link_mess->channel_type,
- link->link_mess->channel_id);
- if (!channel) {
- spice_assert(link->link_mess->channel_type == SPICE_CHANNEL_MAIN);
- spice_assert(reds->main_channel);
- channel = &reds->main_channel->base;
- }
-
- reds_channel_init_auth_caps(link, channel); /* make sure common caps are set */
-
- channel_caps = &channel->local_caps;
- ack.num_common_caps = channel_caps->num_common_caps;
- ack.num_channel_caps = channel_caps->num_caps;
- header.size += (ack.num_common_caps + ack.num_channel_caps) * sizeof(uint32_t);
- ack.caps_offset = sizeof(SpiceLinkReply);
-
- if (!(link->tiTicketing.rsa = RSA_new())) {
- spice_warning("RSA new failed");
- return FALSE;
- }
-
- if (!(bio = BIO_new(BIO_s_mem()))) {
- spice_warning("BIO new failed");
- return FALSE;
- }
-
- if (RSA_generate_key_ex(link->tiTicketing.rsa,
- SPICE_TICKET_KEY_PAIR_LENGTH,
- link->tiTicketing.bn,
- NULL) != 1) {
- spice_warning("Failed to generate %d bits RSA key: %s",
- SPICE_TICKET_KEY_PAIR_LENGTH,
- ERR_error_string(ERR_get_error(), NULL));
- goto end;
- }
- link->tiTicketing.rsa_size = RSA_size(link->tiTicketing.rsa);
-
- i2d_RSA_PUBKEY_bio(bio, link->tiTicketing.rsa);
- BIO_get_mem_ptr(bio, &bmBuf);
- memcpy(ack.pub_key, bmBuf->data, sizeof(ack.pub_key));
-
- if (!reds_stream_write_all(link->stream, &header, sizeof(header)))
- goto end;
- if (!reds_stream_write_all(link->stream, &ack, sizeof(ack)))
- goto end;
- if (!reds_stream_write_all(link->stream, channel_caps->common_caps, channel_caps->num_common_caps * sizeof(uint32_t)))
- goto end;
- if (!reds_stream_write_all(link->stream, channel_caps->caps, channel_caps->num_caps * sizeof(uint32_t)))
- goto end;
-
- ret = TRUE;
-
-end:
- BIO_free(bio);
- return ret;
-}
-
-static bool reds_send_link_error(RedLinkInfo *link, uint32_t error)
-{
- SpiceLinkHeader header;
- SpiceLinkReply reply;
-
- header.magic = SPICE_MAGIC;
- header.size = sizeof(reply);
- header.major_version = SPICE_VERSION_MAJOR;
- header.minor_version = SPICE_VERSION_MINOR;
- memset(&reply, 0, sizeof(reply));
- reply.error = error;
- return reds_stream_write_all(link->stream, &header, sizeof(header)) && reds_stream_write_all(link->stream, &reply,
- sizeof(reply));
-}
-
-static void reds_info_new_channel(RedLinkInfo *link, int connection_id)
-{
- spice_info("channel %d:%d, connected successfully, over %s link",
- link->link_mess->channel_type,
- link->link_mess->channel_id,
- reds_stream_is_ssl(link->stream) ? "Secure" : "Non Secure");
- /* add info + send event */
- if (reds_stream_is_ssl(link->stream)) {
- reds_stream_set_info_flag(link->stream, SPICE_CHANNEL_EVENT_FLAG_TLS);
- }
- reds_stream_set_channel(link->stream, connection_id,
- link->link_mess->channel_type,
- link->link_mess->channel_id);
- reds_stream_push_channel_event(link->stream, SPICE_CHANNEL_EVENT_INITIALIZED);
-}
-
-static void reds_send_link_result(RedLinkInfo *link, uint32_t error)
-{
- reds_stream_write_all(link->stream, &error, sizeof(error));
-}
-
-int reds_expects_link_id(uint32_t connection_id)
-{
- spice_info("TODO: keep a list of connection_id's from migration, compare to them");
- return 1;
-}
-
-static void reds_mig_target_client_add(RedClient *client)
-{
- RedsMigTargetClient *mig_client;
-
- spice_assert(reds);
- spice_info(NULL);
- mig_client = spice_malloc0(sizeof(RedsMigTargetClient));
- mig_client->client = client;
- ring_init(&mig_client->pending_links);
- ring_add(&reds->mig_target_clients, &mig_client->link);
- reds->num_mig_target_clients++;
-
-}
-
-static RedsMigTargetClient* reds_mig_target_client_find(RedClient *client)
-{
- RingItem *item;
-
- RING_FOREACH(item, &reds->mig_target_clients) {
- RedsMigTargetClient *mig_client;
-
- mig_client = SPICE_CONTAINEROF(item, RedsMigTargetClient, link);
- if (mig_client->client == client) {
- return mig_client;
- }
- }
- return NULL;
-}
-
-static void reds_mig_target_client_add_pending_link(RedsMigTargetClient *client,
- SpiceLinkMess *link_msg,
- RedsStream *stream)
-{
- RedsMigPendingLink *mig_link;
-
- spice_assert(reds);
- spice_assert(client);
- mig_link = spice_malloc0(sizeof(RedsMigPendingLink));
- mig_link->link_msg = link_msg;
- mig_link->stream = stream;
-
- ring_add(&client->pending_links, &mig_link->ring_link);
-}
-
-static void reds_mig_target_client_free(RedsMigTargetClient *mig_client)
-{
- RingItem *now, *next;
-
- ring_remove(&mig_client->link);
- reds->num_mig_target_clients--;
-
- RING_FOREACH_SAFE(now, next, &mig_client->pending_links) {
- RedsMigPendingLink *mig_link = SPICE_CONTAINEROF(now, RedsMigPendingLink, ring_link);
- ring_remove(now);
- free(mig_link);
- }
- free(mig_client);
-}
-
-static void reds_mig_target_client_disconnect_all(void)
-{
- RingItem *now, *next;
-
- RING_FOREACH_SAFE(now, next, &reds->mig_target_clients) {
- RedsMigTargetClient *mig_client = SPICE_CONTAINEROF(now, RedsMigTargetClient, link);
- reds_client_disconnect(mig_client->client);
- }
-}
-
-static int reds_find_client(RedClient *client)
-{
- RingItem *item;
-
- RING_FOREACH(item, &reds->clients) {
- RedClient *list_client;
-
- list_client = SPICE_CONTAINEROF(item, RedClient, link);
- if (list_client == client) {
- return TRUE;
- }
- }
- return FALSE;
-}
-
-/* should be used only when there is one client */
-static RedClient *reds_get_client(void)
-{
- spice_assert(reds->num_clients <= 1);
-
- if (reds->num_clients == 0) {
- return NULL;
- }
-
- return SPICE_CONTAINEROF(ring_get_head(&reds->clients), RedClient, link);
-}
-
-// TODO: now that main is a separate channel this should
-// actually be joined with reds_handle_other_links, become reds_handle_link
-static void reds_handle_main_link(RedLinkInfo *link)
-{
- RedClient *client;
- RedsStream *stream;
- SpiceLinkMess *link_mess;
- uint32_t *caps;
- uint32_t connection_id;
- MainChannelClient *mcc;
- int mig_target = FALSE;
-
- spice_info(NULL);
- spice_assert(reds->main_channel);
-
- link_mess = link->link_mess;
- if (!reds->allow_multiple_clients) {
- reds_disconnect();
- }
-
- if (link_mess->connection_id == 0) {
- reds_send_link_result(link, SPICE_LINK_ERR_OK);
- while((connection_id = rand()) == 0);
- mig_target = FALSE;
- } else {
- // TODO: make sure link_mess->connection_id is the same
- // connection id the migration src had (use vmstate to store the connection id)
- reds_send_link_result(link, SPICE_LINK_ERR_OK);
- connection_id = link_mess->connection_id;
- mig_target = TRUE;
- }
-
- reds->mig_inprogress = FALSE;
- reds->mig_wait_connect = FALSE;
- reds->mig_wait_disconnect = FALSE;
-
- reds_info_new_channel(link, connection_id);
- stream = link->stream;
- reds_stream_remove_watch(stream);
- link->stream = NULL;
- link->link_mess = NULL;
- reds_link_free(link);
- caps = (uint32_t *)((uint8_t *)link_mess + link_mess->caps_offset);
- client = red_client_new(mig_target);
- ring_add(&reds->clients, &client->link);
- reds->num_clients++;
- mcc = main_channel_link(reds->main_channel, client,
- stream, connection_id, mig_target,
- link_mess->num_common_caps,
- link_mess->num_common_caps ? caps : NULL, link_mess->num_channel_caps,
- link_mess->num_channel_caps ? caps + link_mess->num_common_caps : NULL);
- spice_info("NEW Client %p mcc %p connect-id %d", client, mcc, connection_id);
- free(link_mess);
- red_client_set_main(client, mcc);
-
- if (vdagent) {
- if (mig_target) {
- spice_warning("unexpected: vdagent attached to destination during migration");
- }
- reds->agent_state.read_filter.discard_all = FALSE;
- reds->agent_state.plug_generation++;
- }
-
- if (!mig_target) {
- main_channel_push_init(mcc, red_dispatcher_count(),
- reds->mouse_mode, reds->is_client_mouse_allowed,
- reds_get_mm_time() - MM_TIME_DELTA,
- red_dispatcher_qxl_ram_size());
- if (spice_name)
- main_channel_push_name(mcc, spice_name);
- if (spice_uuid_is_set)
- main_channel_push_uuid(mcc, spice_uuid);
- } else {
- reds_mig_target_client_add(client);
- }
- main_channel_client_start_net_test(mcc, !mig_target);
-}
-
-#define RED_MOUSE_STATE_TO_LOCAL(state) \
- ((state & SPICE_MOUSE_BUTTON_MASK_LEFT) | \
- ((state & SPICE_MOUSE_BUTTON_MASK_MIDDLE) << 1) | \
- ((state & SPICE_MOUSE_BUTTON_MASK_RIGHT) >> 1))
-
-#define RED_MOUSE_BUTTON_STATE_TO_AGENT(state) \
- (((state & SPICE_MOUSE_BUTTON_MASK_LEFT) ? VD_AGENT_LBUTTON_MASK : 0) | \
- ((state & SPICE_MOUSE_BUTTON_MASK_MIDDLE) ? VD_AGENT_MBUTTON_MASK : 0) | \
- ((state & SPICE_MOUSE_BUTTON_MASK_RIGHT) ? VD_AGENT_RBUTTON_MASK : 0))
-
-void reds_set_client_mouse_allowed(int is_client_mouse_allowed, int x_res, int y_res)
-{
- reds->monitor_mode.x_res = x_res;
- reds->monitor_mode.y_res = y_res;
- reds->dispatcher_allows_client_mouse = is_client_mouse_allowed;
- reds_update_mouse_mode();
- if (reds->is_client_mouse_allowed && inputs_has_tablet()) {
- inputs_set_tablet_logical_size(reds->monitor_mode.x_res, reds->monitor_mode.y_res);
- }
-}
-
-static void openssl_init(RedLinkInfo *link)
-{
- unsigned long f4 = RSA_F4;
- link->tiTicketing.bn = BN_new();
-
- if (!link->tiTicketing.bn) {
- spice_error("OpenSSL BIGNUMS alloc failed");
- }
-
- BN_set_word(link->tiTicketing.bn, f4);
-}
-
-static void reds_channel_do_link(RedChannel *channel, RedClient *client,
- SpiceLinkMess *link_msg,
- RedsStream *stream)
-{
- uint32_t *caps;
-
- spice_assert(channel);
- spice_assert(link_msg);
- spice_assert(stream);
-
- caps = (uint32_t *)((uint8_t *)link_msg + link_msg->caps_offset);
- channel->client_cbs.connect(channel, client, stream,
- red_client_during_migrate_at_target(client),
- link_msg->num_common_caps,
- link_msg->num_common_caps ? caps : NULL,
- link_msg->num_channel_caps,
- link_msg->num_channel_caps ?
- caps + link_msg->num_common_caps : NULL);
-}
-
-/*
- * migration target side:
- * In semi-seamless migration, we activate the channels only
- * after migration is completed.
- * In seamless migration, in order to keep the continuousness, and
- * not lose any data, we activate the target channels before
- * migration completes, as soon as we receive SPICE_MSGC_MAIN_MIGRATE_DST_DO_SEAMLESS
- */
-static int reds_link_mig_target_channels(RedClient *client)
-{
- RedsMigTargetClient *mig_client;
- RingItem *item;
-
- spice_info("%p", client);
- mig_client = reds_mig_target_client_find(client);
- if (!mig_client) {
- spice_info("Error: mig target client was not found");
- return FALSE;
- }
-
- /* Each channel should check if we are during migration, and
- * act accordingly. */
- RING_FOREACH(item, &mig_client->pending_links) {
- RedsMigPendingLink *mig_link;
- RedChannel *channel;
-
- mig_link = SPICE_CONTAINEROF(item, RedsMigPendingLink, ring_link);
- channel = reds_find_channel(mig_link->link_msg->channel_type,
- mig_link->link_msg->channel_id);
- if (!channel) {
- spice_warning("client %p channel (%d, %d) (type, id) wasn't found",
- client,
- mig_link->link_msg->channel_type,
- mig_link->link_msg->channel_id);
- continue;
- }
- reds_channel_do_link(channel, client, mig_link->link_msg, mig_link->stream);
- }
-
- reds_mig_target_client_free(mig_client);
-
- return TRUE;
-}
-
-int reds_on_migrate_dst_set_seamless(MainChannelClient *mcc, uint32_t src_version)
-{
- /* seamless migration is not supported with multiple clients*/
- if (reds->allow_multiple_clients || src_version > SPICE_MIGRATION_PROTOCOL_VERSION) {
- reds->dst_do_seamless_migrate = FALSE;
- } else {
- RedChannelClient *rcc = main_channel_client_get_base(mcc);
-
- red_client_set_migration_seamless(rcc->client);
- /* linking all the channels that have been connected before migration handshake */
- reds->dst_do_seamless_migrate = reds_link_mig_target_channels(rcc->client);
- }
- return reds->dst_do_seamless_migrate;
-}
-
-void reds_on_client_seamless_migrate_complete(RedClient *client)
-{
- spice_debug(NULL);
- if (!reds_find_client(client)) {
- spice_info("client no longer exists");
- return;
- }
- main_channel_migrate_dst_complete(red_client_get_main(client));
-}
-
-void reds_on_client_semi_seamless_migrate_complete(RedClient *client)
-{
- MainChannelClient *mcc;
-
- spice_info("%p", client);
- mcc = red_client_get_main(client);
-
- // TODO: not doing net test. consider doing it on client_migrate_info
- main_channel_push_init(mcc, red_dispatcher_count(),
- reds->mouse_mode, reds->is_client_mouse_allowed,
- reds_get_mm_time() - MM_TIME_DELTA,
- red_dispatcher_qxl_ram_size());
- reds_link_mig_target_channels(client);
- main_channel_migrate_dst_complete(mcc);
-}
-
-static void reds_handle_other_links(RedLinkInfo *link)
-{
- RedChannel *channel;
- RedClient *client = NULL;
- SpiceLinkMess *link_mess;
- RedsMigTargetClient *mig_client;
-
- link_mess = link->link_mess;
- if (reds->main_channel) {
- client = main_channel_get_client_by_link_id(reds->main_channel,
- link_mess->connection_id);
- }
-
- // TODO: MC: broke migration (at least for the dont-drop-connection kind).
- // On migration we should get a connection_id to expect (must be a security measure)
- // where do we store it? on reds, but should be a list (MC).
- if (!client) {
- reds_send_link_result(link, SPICE_LINK_ERR_BAD_CONNECTION_ID);
- reds_link_free(link);
- return;
- }
-
- // TODO: MC: be less lenient. Tally connections from same connection_id (by same client).
- if (!(channel = reds_find_channel(link_mess->channel_type,
- link_mess->channel_id))) {
- reds_send_link_result(link, SPICE_LINK_ERR_CHANNEL_NOT_AVAILABLE);
- reds_link_free(link);
- return;
- }
-
- reds_send_link_result(link, SPICE_LINK_ERR_OK);
- reds_info_new_channel(link, link_mess->connection_id);
- reds_stream_remove_watch(link->stream);
-
- mig_client = reds_mig_target_client_find(client);
- /*
- * In semi-seamless migration, we activate the channels only
- * after migration is completed. Since, the session starts almost from
- * scratch we don't mind if we skip some messages in between the src session end and
- * dst session start.
- * In seamless migration, in order to keep the continuousness of the session, and
- * in order not to lose any data, we activate the target channels before
- * migration completes, as soon as we receive SPICE_MSGC_MAIN_MIGRATE_DST_DO_SEAMLESS.
- * If a channel connects before receiving SPICE_MSGC_MAIN_MIGRATE_DST_DO_SEAMLESS,
- * reds_on_migrate_dst_set_seamless will take care of activating it */
- if (red_client_during_migrate_at_target(client) && !reds->dst_do_seamless_migrate) {
- spice_assert(mig_client);
- reds_mig_target_client_add_pending_link(mig_client, link_mess, link->stream);
- } else {
- spice_assert(!mig_client);
- reds_channel_do_link(channel, client, link_mess, link->stream);
- free(link_mess);
- }
- link->stream = NULL;
- link->link_mess = NULL;
- reds_link_free(link);
-}
-
-static void reds_handle_link(RedLinkInfo *link)
-{
- if (link->link_mess->channel_type == SPICE_CHANNEL_MAIN) {
- reds_handle_main_link(link);
- } else {
- reds_handle_other_links(link);
- }
-}
-
-static void reds_handle_ticket(void *opaque)
-{
- RedLinkInfo *link = (RedLinkInfo *)opaque;
- char *password;
- time_t ltime;
- int password_size;
-
- //todo: use monotonic time
- time(&ltime);
- if (RSA_size(link->tiTicketing.rsa) < SPICE_MAX_PASSWORD_LENGTH) {
- spice_warning("RSA modulus size is smaller than SPICE_MAX_PASSWORD_LENGTH (%d < %d), "
- "SPICE ticket sent from client may be truncated",
- RSA_size(link->tiTicketing.rsa), SPICE_MAX_PASSWORD_LENGTH);
- }
-
- password = g_malloc0(RSA_size(link->tiTicketing.rsa) + 1);
- password_size = RSA_private_decrypt(link->tiTicketing.rsa_size,
- link->tiTicketing.encrypted_ticket.encrypted_data,
- (unsigned char *)password,
- link->tiTicketing.rsa,
- RSA_PKCS1_OAEP_PADDING);
- if (password_size == -1) {
- spice_warning("failed to decrypt RSA encrypted password: %s",
- ERR_error_string(ERR_get_error(), NULL));
- goto error;
- }
- password[password_size] = '\0';
-
- if (ticketing_enabled && !link->skip_auth) {
- int expired = taTicket.expiration_time < ltime;
-
- if (strlen(taTicket.password) == 0) {
- spice_warning("Ticketing is enabled, but no password is set. "
- "please set a ticket first");
- goto error;
- }
-
- if (expired || strcmp(password, taTicket.password) != 0) {
- if (expired) {
- spice_warning("Ticket has expired");
- } else {
- spice_warning("Invalid password");
- }
- goto error;
- }
- }
-
- reds_handle_link(link);
- goto end;
-
-error:
- reds_send_link_result(link, SPICE_LINK_ERR_PERMISSION_DENIED);
- reds_link_free(link);
-
-end:
- g_free(password);
-}
-
-static void reds_get_spice_ticket(RedLinkInfo *link)
-{
- reds_stream_async_read(link->stream,
- (uint8_t *)&link->tiTicketing.encrypted_ticket.encrypted_data,
- link->tiTicketing.rsa_size, reds_handle_ticket, link);
-}
-
-#if HAVE_SASL
-/*
- * Step Msg
- *
- * Input from client:
- *
- * u32 clientin-length
- * u8-array clientin-string
- *
- * Output to client:
- *
- * u32 serverout-length
- * u8-array serverout-strin
- * u8 continue
- */
-#define SASL_DATA_MAX_LEN (1024 * 1024)
-
-static void reds_handle_auth_sasl_steplen(void *opaque);
-
-static void reds_handle_auth_sasl_step(void *opaque)
-{
- RedLinkInfo *link = (RedLinkInfo *)opaque;
- RedsSaslError status;
-
- status = reds_sasl_handle_auth_step(link->stream, reds_handle_auth_sasl_steplen, link);
- if (status == REDS_SASL_ERROR_OK) {
- reds_handle_link(link);
- } else if (status != REDS_SASL_ERROR_CONTINUE) {
- reds_link_free(link);
- }
-}
-
-static void reds_handle_auth_sasl_steplen(void *opaque)
-{
- RedLinkInfo *link = (RedLinkInfo *)opaque;
- RedsSaslError status;
-
- status = reds_sasl_handle_auth_steplen(link->stream, reds_handle_auth_sasl_step, link);
- if (status != REDS_SASL_ERROR_OK) {
- reds_link_free(link);
- }
-}
-
-/*
- * Start Msg
- *
- * Input from client:
- *
- * u32 clientin-length
- * u8-array clientin-string
- *
- * Output to client:
- *
- * u32 serverout-length
- * u8-array serverout-strin
- * u8 continue
- */
-
-
-static void reds_handle_auth_sasl_start(void *opaque)
-{
- RedLinkInfo *link = (RedLinkInfo *)opaque;
- RedsSaslError status;
-
- status = reds_sasl_handle_auth_start(link->stream, reds_handle_auth_sasl_steplen, link);
- if (status == REDS_SASL_ERROR_OK) {
- reds_handle_link(link);
- } else if (status != REDS_SASL_ERROR_CONTINUE) {
- reds_link_free(link);
- }
-}
-
-static void reds_handle_auth_startlen(void *opaque)
-{
- RedLinkInfo *link = (RedLinkInfo *)opaque;
- RedsSaslError status;
-
- status = reds_sasl_handle_auth_startlen(link->stream, reds_handle_auth_sasl_start, link);
- switch (status) {
- case REDS_SASL_ERROR_OK:
- break;
- case REDS_SASL_ERROR_RETRY:
- reds_handle_auth_sasl_start(opaque);
- break;
- case REDS_SASL_ERROR_GENERIC:
- case REDS_SASL_ERROR_INVALID_DATA:
- reds_send_link_error(link, SPICE_LINK_ERR_INVALID_DATA);
- reds_link_free(link);
- break;
- default:
- g_warn_if_reached();
- reds_send_link_error(link, SPICE_LINK_ERR_INVALID_DATA);
- reds_link_free(link);
- break;
- }
-}
-
-static void reds_handle_auth_mechname(void *opaque)
-{
- RedLinkInfo *link = (RedLinkInfo *)opaque;
-
- if (!reds_sasl_handle_auth_mechname(link->stream, reds_handle_auth_startlen, link)) {
- reds_send_link_error(link, SPICE_LINK_ERR_INVALID_DATA);
- }
-}
-
-static void reds_handle_auth_mechlen(void *opaque)
-{
- RedLinkInfo *link = (RedLinkInfo *)opaque;
-
- if (!reds_sasl_handle_auth_mechlen(link->stream, reds_handle_auth_mechname, link)) {
- reds_link_free(link);
- }
-}
-
-static void reds_start_auth_sasl(RedLinkInfo *link)
-{
- if (!reds_sasl_start_auth(link->stream, reds_handle_auth_mechlen, link)) {
- reds_link_free(link);
- }
-}
-#endif
-
-static void reds_handle_auth_mechanism(void *opaque)
-{
- RedLinkInfo *link = (RedLinkInfo *)opaque;
-
- spice_info("Auth method: %d", link->auth_mechanism.auth_mechanism);
-
- if (link->auth_mechanism.auth_mechanism == SPICE_COMMON_CAP_AUTH_SPICE
- && !sasl_enabled
- ) {
- reds_get_spice_ticket(link);
-#if HAVE_SASL
- } else if (link->auth_mechanism.auth_mechanism == SPICE_COMMON_CAP_AUTH_SASL) {
- spice_info("Starting SASL");
- reds_start_auth_sasl(link);
-#endif
- } else {
- spice_warning("Unknown auth method, disconnecting");
- if (sasl_enabled) {
- spice_warning("Your client doesn't handle SASL?");
- }
- reds_send_link_error(link, SPICE_LINK_ERR_INVALID_DATA);
- reds_link_free(link);
- }
-}
-
-static int reds_security_check(RedLinkInfo *link)
-{
- ChannelSecurityOptions *security_option = find_channel_security(link->link_mess->channel_type);
- uint32_t security = security_option ? security_option->options : default_channel_security;
- return (reds_stream_is_ssl(link->stream) && (security & SPICE_CHANNEL_SECURITY_SSL)) ||
- (!reds_stream_is_ssl(link->stream) && (security & SPICE_CHANNEL_SECURITY_NONE));
-}
-
-static void reds_handle_read_link_done(void *opaque)
-{
- RedLinkInfo *link = (RedLinkInfo *)opaque;
- SpiceLinkMess *link_mess = link->link_mess;
- uint32_t num_caps = link_mess->num_common_caps + link_mess->num_channel_caps;
- uint32_t *caps = (uint32_t *)((uint8_t *)link_mess + link_mess->caps_offset);
- int auth_selection;
-
- if (num_caps && (num_caps * sizeof(uint32_t) + link_mess->caps_offset >
- link->link_header.size ||
- link_mess->caps_offset < sizeof(*link_mess))) {
- reds_send_link_error(link, SPICE_LINK_ERR_INVALID_DATA);
- reds_link_free(link);
- return;
- }
-
- auth_selection = test_capability(caps, link_mess->num_common_caps,
- SPICE_COMMON_CAP_PROTOCOL_AUTH_SELECTION);
-
- if (!reds_security_check(link)) {
- if (reds_stream_is_ssl(link->stream)) {
- spice_warning("spice channels %d should not be encrypted", link_mess->channel_type);
- reds_send_link_error(link, SPICE_LINK_ERR_NEED_UNSECURED);
- } else {
- spice_warning("spice channels %d should be encrypted", link_mess->channel_type);
- reds_send_link_error(link, SPICE_LINK_ERR_NEED_SECURED);
- }
- reds_link_free(link);
- return;
- }
-
- if (!reds_send_link_ack(link)) {
- reds_link_free(link);
- return;
- }
-
- if (!auth_selection) {
- if (sasl_enabled && !link->skip_auth) {
- spice_warning("SASL enabled, but peer supports only spice authentication");
- reds_send_link_error(link, SPICE_LINK_ERR_VERSION_MISMATCH);
- return;
- }
- spice_warning("Peer doesn't support AUTH selection");
- reds_get_spice_ticket(link);
- } else {
- reds_stream_async_read(link->stream,
- (uint8_t *)&link->auth_mechanism,
- sizeof(SpiceLinkAuthMechanism),
- reds_handle_auth_mechanism,
- link);
- }
-}
-
-static void reds_handle_link_error(void *opaque, int err)
-{
- RedLinkInfo *link = (RedLinkInfo *)opaque;
- switch (err) {
- case 0:
- case EPIPE:
- break;
- default:
- spice_warning("%s", strerror(errno));
- break;
- }
- reds_link_free(link);
-}
-
-static void reds_handle_read_header_done(void *opaque)
-{
- RedLinkInfo *link = (RedLinkInfo *)opaque;
- SpiceLinkHeader *header = &link->link_header;
-
- if (header->magic != SPICE_MAGIC) {
- reds_send_link_error(link, SPICE_LINK_ERR_INVALID_MAGIC);
- reds_link_free(link);
- return;
- }
-
- if (header->major_version != SPICE_VERSION_MAJOR) {
- if (header->major_version > 0) {
- reds_send_link_error(link, SPICE_LINK_ERR_VERSION_MISMATCH);
- }
-
- spice_warning("version mismatch");
- reds_link_free(link);
- return;
- }
-
- reds->peer_minor_version = header->minor_version;
-
- if (header->size < sizeof(SpiceLinkMess)) {
- reds_send_link_error(link, SPICE_LINK_ERR_INVALID_DATA);
- spice_warning("bad size %u", header->size);
- reds_link_free(link);
- return;
- }
-
- link->link_mess = spice_malloc(header->size);
-
- reds_stream_async_read(link->stream,
- (uint8_t *)link->link_mess,
- header->size,
- reds_handle_read_link_done,
- link);
-}
-
-static void reds_handle_new_link(RedLinkInfo *link)
-{
- reds_stream_set_async_error_handler(link->stream, reds_handle_link_error);
- reds_stream_async_read(link->stream,
- (uint8_t *)&link->link_header,
- sizeof(SpiceLinkHeader),
- reds_handle_read_header_done,
- link);
-}
-
-static void reds_handle_ssl_accept(int fd, int event, void *data)
-{
- RedLinkInfo *link = (RedLinkInfo *)data;
- int return_code = reds_stream_ssl_accept(link->stream);
-
- switch (return_code) {
- case REDS_STREAM_SSL_STATUS_ERROR:
- reds_link_free(link);
- return;
- case REDS_STREAM_SSL_STATUS_WAIT_FOR_READ:
- core->watch_update_mask(link->stream->watch, SPICE_WATCH_EVENT_READ);
- return;
- case REDS_STREAM_SSL_STATUS_WAIT_FOR_WRITE:
- core->watch_update_mask(link->stream->watch, SPICE_WATCH_EVENT_WRITE);
- return;
- case REDS_STREAM_SSL_STATUS_OK:
- reds_stream_remove_watch(link->stream);
- reds_handle_new_link(link);
- }
-}
-
-static RedLinkInfo *reds_init_client_connection(int socket)
-{
- RedLinkInfo *link;
- int delay_val = 1;
- int flags;
-
- if ((flags = fcntl(socket, F_GETFL)) == -1) {
- spice_warning("accept failed, %s", strerror(errno));
- goto error;
- }
-
- if (fcntl(socket, F_SETFL, flags | O_NONBLOCK) == -1) {
- spice_warning("accept failed, %s", strerror(errno));
- goto error;
- }
-
- if (setsockopt(socket, IPPROTO_TCP, TCP_NODELAY, &delay_val, sizeof(delay_val)) == -1) {
- if (errno != ENOTSUP) {
- spice_warning("setsockopt failed, %s", strerror(errno));
- }
- }
-
- link = spice_new0(RedLinkInfo, 1);
- link->stream = reds_stream_new(socket);
-
- /* gather info + send event */
-
- reds_stream_push_channel_event(link->stream, SPICE_CHANNEL_EVENT_CONNECTED);
-
- openssl_init(link);
-
- return link;
-
-error:
- return NULL;
-}
-
-
-static RedLinkInfo *reds_init_client_ssl_connection(int socket)
-{
- RedLinkInfo *link;
- int ssl_status;
-
- link = reds_init_client_connection(socket);
- if (link == NULL)
- goto error;
-
- ssl_status = reds_stream_enable_ssl(link->stream, reds->ctx);
- switch (ssl_status) {
- case REDS_STREAM_SSL_STATUS_OK:
- reds_handle_new_link(link);
- return link;
- case REDS_STREAM_SSL_STATUS_ERROR:
- goto error;
- case REDS_STREAM_SSL_STATUS_WAIT_FOR_READ:
- link->stream->watch = core->watch_add(link->stream->socket, SPICE_WATCH_EVENT_READ,
- reds_handle_ssl_accept, link);
- break;
- case REDS_STREAM_SSL_STATUS_WAIT_FOR_WRITE:
- link->stream->watch = core->watch_add(link->stream->socket, SPICE_WATCH_EVENT_WRITE,
- reds_handle_ssl_accept, link);
- break;
- }
- return link;
-
-error:
- free(link->stream);
- BN_free(link->tiTicketing.bn);
- free(link);
- return NULL;
-}
-
-static void reds_accept_ssl_connection(int fd, int event, void *data)
-{
- RedLinkInfo *link;
- int socket;
-
- if ((socket = accept(reds->secure_listen_socket, NULL, 0)) == -1) {
- spice_warning("accept failed, %s", strerror(errno));
- return;
- }
-
- if (!(link = reds_init_client_ssl_connection(socket))) {
- close(socket);
- return;
- }
-}
-
-
-static void reds_accept(int fd, int event, void *data)
-{
- int socket;
-
- if ((socket = accept(reds->listen_socket, NULL, 0)) == -1) {
- spice_warning("accept failed, %s", strerror(errno));
- return;
- }
-
- if (spice_server_add_client(reds, socket, 0) < 0)
- close(socket);
-}
-
-
-SPICE_GNUC_VISIBLE int spice_server_add_client(SpiceServer *s, int socket, int skip_auth)
-{
- RedLinkInfo *link;
-
- spice_assert(reds == s);
- if (!(link = reds_init_client_connection(socket))) {
- spice_warning("accept failed");
- return -1;
- }
-
- link->skip_auth = skip_auth;
-
- reds_handle_new_link(link);
- return 0;
-}
-
-
-SPICE_GNUC_VISIBLE int spice_server_add_ssl_client(SpiceServer *s, int socket, int skip_auth)
-{
- RedLinkInfo *link;
-
- spice_assert(reds == s);
- if (!(link = reds_init_client_ssl_connection(socket))) {
- return -1;
- }
-
- link->skip_auth = skip_auth;
- return 0;
-}
-
-
-static int reds_init_socket(const char *addr, int portnr, int family)
-{
- static const int on=1, off=0;
- struct addrinfo ai,*res,*e;
- char port[33];
- int slisten,rc;
-
- memset(&ai,0, sizeof(ai));
- ai.ai_flags = AI_PASSIVE | AI_ADDRCONFIG;
- ai.ai_socktype = SOCK_STREAM;
- ai.ai_family = family;
-
- snprintf(port, sizeof(port), "%d", portnr);
- rc = getaddrinfo(strlen(addr) ? addr : NULL, port, &ai, &res);
- if (rc != 0) {
- spice_warning("getaddrinfo(%s,%s): %s", addr, port,
- gai_strerror(rc));
- return -1;
- }
-
- for (e = res; e != NULL; e = e->ai_next) {
- slisten = socket(e->ai_family, e->ai_socktype, e->ai_protocol);
- if (slisten < 0) {
- continue;
- }
-
- setsockopt(slisten,SOL_SOCKET,SO_REUSEADDR,(void*)&on,sizeof(on));
-#ifdef IPV6_V6ONLY
- if (e->ai_family == PF_INET6) {
- /* listen on both ipv4 and ipv6 */
- setsockopt(slisten,IPPROTO_IPV6,IPV6_V6ONLY,(void*)&off,
- sizeof(off));
- }
-#endif
- if (bind(slisten, e->ai_addr, e->ai_addrlen) == 0) {
- char uaddr[INET6_ADDRSTRLEN+1];
- char uport[33];
- rc = getnameinfo((struct sockaddr*)e->ai_addr,e->ai_addrlen,
- uaddr,INET6_ADDRSTRLEN, uport,32,
- NI_NUMERICHOST | NI_NUMERICSERV);
- if (rc == 0) {
- spice_info("bound to %s:%s", uaddr, uport);
- } else {
- spice_info("cannot resolve address spice-server is bound to");
- }
- goto listen;
- }
- close(slisten);
- }
- spice_warning("%s: binding socket to %s:%d failed", __FUNCTION__,
- addr, portnr);
- freeaddrinfo(res);
- return -1;
-
-listen:
- freeaddrinfo(res);
- if (listen(slisten,1) != 0) {
- spice_warning("listen: %s", strerror(errno));
- close(slisten);
- return -1;
- }
- return slisten;
-}
-
-static void reds_send_mm_time(void)
-{
- if (!reds_main_channel_connected()) {
- return;
- }
- spice_debug(NULL);
- main_channel_push_multi_media_time(reds->main_channel,
- reds_get_mm_time() - reds->mm_time_latency);
-}
-
-void reds_set_client_mm_time_latency(RedClient *client, uint32_t latency)
-{
- // TODO: multi-client support for mm_time
- if (reds->mm_timer_enabled) {
- // TODO: consider network latency
- if (latency > reds->mm_time_latency) {
- reds->mm_time_latency = latency;
- reds_send_mm_time();
- } else {
- spice_debug("new latency %u is smaller than existing %u",
- latency, reds->mm_time_latency);
- }
- } else {
- snd_set_playback_latency(client, latency);
- }
-}
-
-static int reds_init_net(void)
-{
- if (spice_port != -1) {
- reds->listen_socket = reds_init_socket(spice_addr, spice_port, spice_family);
- if (-1 == reds->listen_socket) {
- return -1;
- }
- reds->listen_watch = core->watch_add(reds->listen_socket,
- SPICE_WATCH_EVENT_READ,
- reds_accept, NULL);
- if (reds->listen_watch == NULL) {
- spice_warning("set fd handle failed");
- return -1;
- }
- }
-
- if (spice_secure_port != -1) {
- reds->secure_listen_socket = reds_init_socket(spice_addr, spice_secure_port,
- spice_family);
- if (-1 == reds->secure_listen_socket) {
- return -1;
- }
- reds->secure_listen_watch = core->watch_add(reds->secure_listen_socket,
- SPICE_WATCH_EVENT_READ,
- reds_accept_ssl_connection, NULL);
- if (reds->secure_listen_watch == NULL) {
- spice_warning("set fd handle failed");
- return -1;
- }
- }
-
- if (spice_listen_socket_fd != -1 ) {
- reds->listen_socket = spice_listen_socket_fd;
- reds->listen_watch = core->watch_add(reds->listen_socket,
- SPICE_WATCH_EVENT_READ,
- reds_accept, NULL);
- if (reds->listen_watch == NULL) {
- spice_warning("set fd handle failed");
- return -1;
- }
- }
- return 0;
-}
-
-static int load_dh_params(SSL_CTX *ctx, char *file)
-{
- DH *ret = 0;
- BIO *bio;
-
- if ((bio = BIO_new_file(file, "r")) == NULL) {
- spice_warning("Could not open DH file");
- return -1;
- }
-
- ret = PEM_read_bio_DHparams(bio, NULL, NULL, NULL);
- BIO_free(bio);
- if (ret == 0) {
- spice_warning("Could not read DH params");
- return -1;
- }
-
-
- if (SSL_CTX_set_tmp_dh(ctx, ret) < 0) {
- spice_warning("Could not set DH params");
- return -1;
- }
-
- return 0;
-}
-
-/*The password code is not thread safe*/
-static int ssl_password_cb(char *buf, int size, int flags, void *userdata)
-{
- char *pass = ssl_parameters.keyfile_password;
- if (size < strlen(pass) + 1) {
- return (0);
- }
-
- strcpy(buf, pass);
- return (strlen(pass));
-}
-
-static unsigned long pthreads_thread_id(void)
-{
- unsigned long ret;
-
- ret = (unsigned long)pthread_self();
- return (ret);
-}
-
-static void pthreads_locking_callback(int mode, int type, const char *file, int line)
-{
- if (mode & CRYPTO_LOCK) {
- pthread_mutex_lock(&(lock_cs[type]));
- lock_count[type]++;
- } else {
- pthread_mutex_unlock(&(lock_cs[type]));
- }
-}
-
-static void openssl_thread_setup(void)
-{
- int i;
-
- lock_cs = OPENSSL_malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t));
- lock_count = OPENSSL_malloc(CRYPTO_num_locks() * sizeof(long));
-
- for (i = 0; i < CRYPTO_num_locks(); i++) {
- lock_count[i] = 0;
- pthread_mutex_init(&(lock_cs[i]), NULL);
- }
-
- CRYPTO_set_id_callback(pthreads_thread_id);
- CRYPTO_set_locking_callback(pthreads_locking_callback);
-}
-
-static int reds_init_ssl(void)
-{
-#if OPENSSL_VERSION_NUMBER >= 0x10000000L
- const SSL_METHOD *ssl_method;
-#else
- SSL_METHOD *ssl_method;
-#endif
- int return_code;
- /* When some other SSL/TLS version becomes obsolete, add it to this
- * variable. */
- long ssl_options = SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3;
-
- /* Global system initialization*/
- SSL_library_init();
- SSL_load_error_strings();
-
- /* Create our context*/
- /* SSLv23_method() handles TLSv1.x in addition to SSLv2/v3 */
- ssl_method = SSLv23_method();
- reds->ctx = SSL_CTX_new(ssl_method);
- if (!reds->ctx) {
- spice_warning("Could not allocate new SSL context");
- return -1;
- }
-
- /* Limit connection to TLSv1 only */
-#ifdef SSL_OP_NO_COMPRESSION
- ssl_options |= SSL_OP_NO_COMPRESSION;
-#endif
- SSL_CTX_set_options(reds->ctx, ssl_options);
-
- /* Load our keys and certificates*/
- return_code = SSL_CTX_use_certificate_chain_file(reds->ctx, ssl_parameters.certs_file);
- if (return_code == 1) {
- spice_info("Loaded certificates from %s", ssl_parameters.certs_file);
- } else {
- spice_warning("Could not load certificates from %s", ssl_parameters.certs_file);
- return -1;
- }
-
- SSL_CTX_set_default_passwd_cb(reds->ctx, ssl_password_cb);
-
- return_code = SSL_CTX_use_PrivateKey_file(reds->ctx, ssl_parameters.private_key_file,
- SSL_FILETYPE_PEM);
- if (return_code == 1) {
- spice_info("Using private key from %s", ssl_parameters.private_key_file);
- } else {
- spice_warning("Could not use private key file");
- return -1;
- }
-
- /* Load the CAs we trust*/
- return_code = SSL_CTX_load_verify_locations(reds->ctx, ssl_parameters.ca_certificate_file, 0);
- if (return_code == 1) {
- spice_info("Loaded CA certificates from %s", ssl_parameters.ca_certificate_file);
- } else {
- spice_warning("Could not use CA file %s", ssl_parameters.ca_certificate_file);
- return -1;
- }
-
-#if (OPENSSL_VERSION_NUMBER < 0x00905100L)
- SSL_CTX_set_verify_depth(reds->ctx, 1);
-#endif
-
- if (strlen(ssl_parameters.dh_key_file) > 0) {
- if (load_dh_params(reds->ctx, ssl_parameters.dh_key_file) < 0) {
- return -1;
- }
- }
-
- SSL_CTX_set_session_id_context(reds->ctx, (const unsigned char *)"SPICE", 5);
- if (strlen(ssl_parameters.ciphersuite) > 0) {
- if (!SSL_CTX_set_cipher_list(reds->ctx, ssl_parameters.ciphersuite)) {
- return -1;
- }
- }
-
- openssl_thread_setup();
-
-#ifndef SSL_OP_NO_COMPRESSION
- STACK *cmp_stack = SSL_COMP_get_compression_methods();
- sk_zero(cmp_stack);
-#endif
-
- return 0;
-}
-
-static void reds_exit(void)
-{
- if (reds->main_channel) {
- main_channel_close(reds->main_channel);
- }
-#ifdef RED_STATISTICS
- shm_unlink(reds->stat_shm_name);
- free(reds->stat_shm_name);
-#endif
-}
-
-static inline void on_activating_ticketing(void)
-{
- if (!ticketing_enabled && reds_main_channel_connected()) {
- spice_warning("disconnecting");
- reds_disconnect();
- }
-}
-
-static void set_image_compression(spice_image_compression_t val)
-{
- if (val == image_compression) {
- return;
- }
- image_compression = val;
- red_dispatcher_on_ic_change();
-}
-
-static void set_one_channel_security(int id, uint32_t security)
-{
- ChannelSecurityOptions *security_options;
-
- if ((security_options = find_channel_security(id))) {
- security_options->options = security;
- return;
- }
- security_options = spice_new(ChannelSecurityOptions, 1);
- security_options->channel_id = id;
- security_options->options = security;
- security_options->next = channels_security;
- channels_security = security_options;
-}
-
-#define REDS_SAVE_VERSION 1
-
-typedef struct RedsMigSpiceMessage {
- uint32_t connection_id;
-} RedsMigSpiceMessage;
-
-typedef struct RedsMigCertPubKeyInfo {
- uint16_t type;
- uint32_t len;
-} RedsMigCertPubKeyInfo;
-
-static void reds_mig_release(void)
-{
- if (reds->mig_spice) {
- free(reds->mig_spice->cert_subject);
- free(reds->mig_spice->host);
- free(reds->mig_spice);
- reds->mig_spice = NULL;
- }
-}
-
-static void reds_mig_started(void)
-{
- spice_info(NULL);
- spice_assert(reds->mig_spice);
-
- reds->mig_inprogress = TRUE;
- reds->mig_wait_connect = TRUE;
- core->timer_start(reds->mig_timer, MIGRATE_TIMEOUT);
-}
-
-static void reds_mig_fill_wait_disconnect(void)
-{
- RingItem *client_item;
-
- spice_assert(reds->num_clients > 0);
- /* tracking the clients, in order to ignore disconnection
- * of clients that got connected to the src after migration completion.*/
- RING_FOREACH(client_item, &reds->clients) {
- RedClient *client = SPICE_CONTAINEROF(client_item, RedClient, link);
- RedsMigWaitDisconnectClient *wait_client;
-
- wait_client = spice_new0(RedsMigWaitDisconnectClient, 1);
- wait_client->client = client;
- ring_add(&reds->mig_wait_disconnect_clients, &wait_client->link);
- }
- reds->mig_wait_disconnect = TRUE;
- core->timer_start(reds->mig_timer, MIGRATE_TIMEOUT);
-}
-
-static void reds_mig_cleanup_wait_disconnect(void)
-{
- RingItem *wait_client_item;
-
- while ((wait_client_item = ring_get_tail(&reds->mig_wait_disconnect_clients))) {
- RedsMigWaitDisconnectClient *wait_client;
-
- wait_client = SPICE_CONTAINEROF(wait_client_item, RedsMigWaitDisconnectClient, link);
- ring_remove(wait_client_item);
- free(wait_client);
- }
- reds->mig_wait_disconnect = FALSE;
-}
-
-static void reds_mig_remove_wait_disconnect_client(RedClient *client)
-{
- RingItem *wait_client_item;
-
- RING_FOREACH(wait_client_item, &reds->mig_wait_disconnect_clients) {
- RedsMigWaitDisconnectClient *wait_client;
-
- wait_client = SPICE_CONTAINEROF(wait_client_item, RedsMigWaitDisconnectClient, link);
- if (wait_client->client == client) {
- ring_remove(wait_client_item);
- free(wait_client);
- if (ring_is_empty(&reds->mig_wait_disconnect_clients)) {
- reds_mig_cleanup();
- }
- return;
- }
- }
- spice_warning("client not found %p", client);
-}
-
-static void reds_migrate_channels_seamless(void)
-{
- RedClient *client;
-
- /* seamless migration is supported for only one client for now */
- client = reds_get_client();
- red_client_migrate(client);
-}
-
-static void reds_mig_finished(int completed)
-{
- spice_info(NULL);
-
- reds->mig_inprogress = TRUE;
-
- if (reds->src_do_seamless_migrate && completed) {
- reds_migrate_channels_seamless();
- } else {
- main_channel_migrate_src_complete(reds->main_channel, completed);
- }
-
- if (completed) {
- reds_mig_fill_wait_disconnect();
- } else {
- reds_mig_cleanup();
- }
- reds_mig_release();
-}
-
-static void reds_mig_switch(void)
-{
- if (!reds->mig_spice) {
- spice_warning("reds_mig_switch called without migrate_info set");
- return;
- }
- main_channel_migrate_switch(reds->main_channel, reds->mig_spice);
- reds_mig_release();
-}
-
-static void migrate_timeout(void *opaque)
-{
- spice_info(NULL);
- spice_assert(reds->mig_wait_connect || reds->mig_wait_disconnect);
- if (reds->mig_wait_connect) {
- /* we will fall back to the switch host scheme when migration completes */
- main_channel_migrate_cancel_wait(reds->main_channel);
- /* in case part of the client haven't yet completed the previous migration, disconnect them */
- reds_mig_target_client_disconnect_all();
- reds_mig_cleanup();
- } else {
- reds_mig_disconnect();
- }
-}
-
-uint32_t reds_get_mm_time(void)
-{
- struct timespec time_space;
- clock_gettime(CLOCK_MONOTONIC, &time_space);
- return time_space.tv_sec * 1000 + time_space.tv_nsec / 1000 / 1000;
-}
-
-void reds_enable_mm_timer(void)
-{
- core->timer_start(reds->mm_timer, MM_TIMER_GRANULARITY_MS);
- reds->mm_timer_enabled = TRUE;
- reds->mm_time_latency = MM_TIME_DELTA;
- reds_send_mm_time();
-}
-
-void reds_disable_mm_timer(void)
-{
- core->timer_cancel(reds->mm_timer);
- reds->mm_timer_enabled = FALSE;
-}
-
-static void mm_timer_proc(void *opaque)
-{
- red_dispatcher_set_mm_time(reds_get_mm_time());
- core->timer_start(reds->mm_timer, MM_TIMER_GRANULARITY_MS);
-}
-
-static SpiceCharDeviceState *attach_to_red_agent(SpiceCharDeviceInstance *sin)
-{
- VDIPortState *state = &reds->agent_state;
- SpiceCharDeviceInterface *sif;
- SpiceCharDeviceCallbacks char_dev_state_cbs;
-
- if (!state->base) {
- char_dev_state_cbs.read_one_msg_from_device = vdi_port_read_one_msg_from_device;
- char_dev_state_cbs.ref_msg_to_client = vdi_port_ref_msg_to_client;
- char_dev_state_cbs.unref_msg_to_client = vdi_port_unref_msg_to_client;
- char_dev_state_cbs.send_msg_to_client = vdi_port_send_msg_to_client;
- char_dev_state_cbs.send_tokens_to_client = vdi_port_send_tokens_to_client;
- char_dev_state_cbs.remove_client = vdi_port_remove_client;
- char_dev_state_cbs.on_free_self_token = vdi_port_on_free_self_token;
-
- state->base = spice_char_device_state_create(sin,
- REDS_TOKENS_TO_SEND,
- REDS_NUM_INTERNAL_AGENT_MESSAGES,
- &char_dev_state_cbs,
- NULL);
- } else {
- spice_char_device_state_reset_dev_instance(state->base, sin);
- }
-
- vdagent = sin;
- reds_update_mouse_mode();
-
- sif = SPICE_CONTAINEROF(vdagent->base.sif, SpiceCharDeviceInterface, base);
- if (sif->state) {
- sif->state(vdagent, 1);
- }
-
- if (!reds_main_channel_connected()) {
- return state->base;
- }
-
- state->read_filter.discard_all = FALSE;
- reds->agent_state.plug_generation++;
-
- if (reds->agent_state.mig_data ||
- red_channel_waits_for_migrate_data(&reds->main_channel->base)) {
- /* Migration in progress (code is running on the destination host):
- * 1. Add the client to spice char device, if it was not already added.
- * 2.a If this (qemu-kvm state load side of migration) happens first
- * then wait for spice migration data to arrive. Otherwise
- * 2.b If this happens second ==> we already have spice migrate data
- * then restore state
- */
- if (!spice_char_device_client_exists(reds->agent_state.base, reds_get_client())) {
- int client_added;
-
- client_added = spice_char_device_client_add(reds->agent_state.base,
- reds_get_client(),
- TRUE, /* flow control */
- REDS_VDI_PORT_NUM_RECEIVE_BUFFS,
- REDS_AGENT_WINDOW_SIZE,
- ~0,
- TRUE);
-
- if (!client_added) {
- spice_warning("failed to add client to agent");
- reds_disconnect();
- }
- }
-
- if (reds->agent_state.mig_data) {
- spice_debug("restoring state from stored migration data");
- spice_assert(reds->agent_state.plug_generation == 1);
- reds_agent_state_restore(reds->agent_state.mig_data);
- free(reds->agent_state.mig_data);
- reds->agent_state.mig_data = NULL;
- }
- else {
- spice_debug("waiting for migration data");
- }
- } else {
- /* we will associate the client with the char device, upon reds_on_main_agent_start,
- * in response to MSGC_AGENT_START */
- main_channel_push_agent_connected(reds->main_channel);
- }
-
- return state->base;
-}
-
-SPICE_GNUC_VISIBLE void spice_server_char_device_wakeup(SpiceCharDeviceInstance* sin)
-{
- if (!sin->st) {
- spice_warning("no SpiceCharDeviceState attached to instance %p", sin);
- return;
- }
- spice_char_device_wakeup(sin->st);
-}
-
-#define SUBTYPE_VDAGENT "vdagent"
-#define SUBTYPE_SMARTCARD "smartcard"
-#define SUBTYPE_USBREDIR "usbredir"
-#define SUBTYPE_PORT "port"
-
-const char *spice_server_char_device_recognized_subtypes_list[] = {
- SUBTYPE_VDAGENT,
-#ifdef USE_SMARTCARD
- SUBTYPE_SMARTCARD,
-#endif
- SUBTYPE_USBREDIR,
- NULL,
-};
-
-SPICE_GNUC_VISIBLE const char** spice_server_char_device_recognized_subtypes(void)
-{
- return spice_server_char_device_recognized_subtypes_list;
-}
-
-static void reds_char_device_add_state(SpiceCharDeviceState *st)
-{
- SpiceCharDeviceStateItem *item = spice_new0(SpiceCharDeviceStateItem, 1);
-
- item->st = st;
-
- ring_add(&reds->char_devs_states, &item->link);
-}
-
-static void reds_char_device_remove_state(SpiceCharDeviceState *st)
-{
- RingItem *item;
-
- RING_FOREACH(item, &reds->char_devs_states) {
- SpiceCharDeviceStateItem *st_item;
-
- st_item = SPICE_CONTAINEROF(item, SpiceCharDeviceStateItem, link);
- if (st_item->st == st) {
- ring_remove(item);
- free(st_item);
- return;
- }
- }
- spice_error("char dev state not found %p", st);
-}
-
-void reds_on_char_device_state_destroy(SpiceCharDeviceState *dev)
-{
- reds_char_device_remove_state(dev);
-}
-
-static int spice_server_char_device_add_interface(SpiceServer *s,
- SpiceBaseInstance *sin)
-{
- SpiceCharDeviceInstance* char_device =
- SPICE_CONTAINEROF(sin, SpiceCharDeviceInstance, base);
- SpiceCharDeviceState *dev_state = NULL;
-
- spice_assert(s == reds);
-
- spice_info("CHAR_DEVICE %s", char_device->subtype);
- if (strcmp(char_device->subtype, SUBTYPE_VDAGENT) == 0) {
- if (vdagent) {
- spice_warning("vdagent already attached");
- return -1;
- }
- dev_state = attach_to_red_agent(char_device);
- }
-#ifdef USE_SMARTCARD
- else if (strcmp(char_device->subtype, SUBTYPE_SMARTCARD) == 0) {
- if (!(dev_state = smartcard_device_connect(char_device))) {
- return -1;
- }
- }
-#endif
- else if (strcmp(char_device->subtype, SUBTYPE_USBREDIR) == 0) {
- dev_state = spicevmc_device_connect(char_device, SPICE_CHANNEL_USBREDIR);
- }
- else if (strcmp(char_device->subtype, SUBTYPE_PORT) == 0) {
- if (strcmp(char_device->portname, "org.spice-space.webdav.0") == 0) {
- dev_state = spicevmc_device_connect(char_device, SPICE_CHANNEL_WEBDAV);
- } else {
- dev_state = spicevmc_device_connect(char_device, SPICE_CHANNEL_PORT);
- }
- }
-
- if (dev_state) {
- spice_assert(char_device->st);
- /* setting the char_device state to "started" for backward compatibily with
- * qemu releases that don't call spice api for start/stop (not implemented yet) */
- if (reds->vm_running) {
- spice_char_device_start(char_device->st);
- }
- reds_char_device_add_state(char_device->st);
- } else {
- spice_warning("failed to create device state for %s", char_device->subtype);
- return -1;
- }
- return 0;
-}
-
-static void spice_server_char_device_remove_interface(SpiceBaseInstance *sin)
-{
- SpiceCharDeviceInstance* char_device =
- SPICE_CONTAINEROF(sin, SpiceCharDeviceInstance, base);
-
- spice_info("remove CHAR_DEVICE %s", char_device->subtype);
- if (strcmp(char_device->subtype, SUBTYPE_VDAGENT) == 0) {
- if (vdagent) {
- reds_agent_remove();
- }
- }
-#ifdef USE_SMARTCARD
- else if (strcmp(char_device->subtype, SUBTYPE_SMARTCARD) == 0) {
- smartcard_device_disconnect(char_device);
- }
-#endif
- else if (strcmp(char_device->subtype, SUBTYPE_USBREDIR) == 0 ||
- strcmp(char_device->subtype, SUBTYPE_PORT) == 0) {
- spicevmc_device_disconnect(char_device);
- } else {
- spice_warning("failed to remove char device %s", char_device->subtype);
- }
-
- char_device->st = NULL;
-}
-
-SPICE_GNUC_VISIBLE int spice_server_add_interface(SpiceServer *s,
- SpiceBaseInstance *sin)
-{
- const SpiceBaseInterface *interface = sin->sif;
-
- spice_assert(reds == s);
-
- if (strcmp(interface->type, SPICE_INTERFACE_KEYBOARD) == 0) {
- spice_info("SPICE_INTERFACE_KEYBOARD");
- if (interface->major_version != SPICE_INTERFACE_KEYBOARD_MAJOR ||
- interface->minor_version > SPICE_INTERFACE_KEYBOARD_MINOR) {
- spice_warning("unsupported keyboard interface");
- return -1;
- }
- if (inputs_set_keyboard(SPICE_CONTAINEROF(sin, SpiceKbdInstance, base)) != 0) {
- return -1;
- }
- } else if (strcmp(interface->type, SPICE_INTERFACE_MOUSE) == 0) {
- spice_info("SPICE_INTERFACE_MOUSE");
- if (interface->major_version != SPICE_INTERFACE_MOUSE_MAJOR ||
- interface->minor_version > SPICE_INTERFACE_MOUSE_MINOR) {
- spice_warning("unsupported mouse interface");
- return -1;
- }
- if (inputs_set_mouse(SPICE_CONTAINEROF(sin, SpiceMouseInstance, base)) != 0) {
- return -1;
- }
- } else if (strcmp(interface->type, SPICE_INTERFACE_QXL) == 0) {
- QXLInstance *qxl;
-
- spice_info("SPICE_INTERFACE_QXL");
- if (interface->major_version != SPICE_INTERFACE_QXL_MAJOR ||
- interface->minor_version > SPICE_INTERFACE_QXL_MINOR) {
- spice_warning("unsupported qxl interface");
- return -1;
- }
-
- qxl = SPICE_CONTAINEROF(sin, QXLInstance, base);
- qxl->st = spice_new0(QXLState, 1);
- qxl->st->qif = SPICE_CONTAINEROF(interface, QXLInterface, base);
- red_dispatcher_init(qxl);
-
- } else if (strcmp(interface->type, SPICE_INTERFACE_TABLET) == 0) {
- spice_info("SPICE_INTERFACE_TABLET");
- if (interface->major_version != SPICE_INTERFACE_TABLET_MAJOR ||
- interface->minor_version > SPICE_INTERFACE_TABLET_MINOR) {
- spice_warning("unsupported tablet interface");
- return -1;
- }
- if (inputs_set_tablet(SPICE_CONTAINEROF(sin, SpiceTabletInstance, base)) != 0) {
- return -1;
- }
- reds_update_mouse_mode();
- if (reds->is_client_mouse_allowed) {
- inputs_set_tablet_logical_size(reds->monitor_mode.x_res, reds->monitor_mode.y_res);
- }
-
- } else if (strcmp(interface->type, SPICE_INTERFACE_PLAYBACK) == 0) {
- spice_info("SPICE_INTERFACE_PLAYBACK");
- if (interface->major_version != SPICE_INTERFACE_PLAYBACK_MAJOR ||
- interface->minor_version > SPICE_INTERFACE_PLAYBACK_MINOR) {
- spice_warning("unsupported playback interface");
- return -1;
- }
- snd_attach_playback(SPICE_CONTAINEROF(sin, SpicePlaybackInstance, base));
-
- } else if (strcmp(interface->type, SPICE_INTERFACE_RECORD) == 0) {
- spice_info("SPICE_INTERFACE_RECORD");
- if (interface->major_version != SPICE_INTERFACE_RECORD_MAJOR ||
- interface->minor_version > SPICE_INTERFACE_RECORD_MINOR) {
- spice_warning("unsupported record interface");
- return -1;
- }
- snd_attach_record(SPICE_CONTAINEROF(sin, SpiceRecordInstance, base));
-
- } else if (strcmp(interface->type, SPICE_INTERFACE_CHAR_DEVICE) == 0) {
- if (interface->major_version != SPICE_INTERFACE_CHAR_DEVICE_MAJOR ||
- interface->minor_version > SPICE_INTERFACE_CHAR_DEVICE_MINOR) {
- spice_warning("unsupported char device interface");
- return -1;
- }
- spice_server_char_device_add_interface(s, sin);
-
- } else if (strcmp(interface->type, SPICE_INTERFACE_NET_WIRE) == 0) {
- spice_warning("unsupported net wire interface");
- return -1;
- } else if (strcmp(interface->type, SPICE_INTERFACE_MIGRATION) == 0) {
- spice_info("SPICE_INTERFACE_MIGRATION");
- if (migration_interface) {
- spice_warning("already have migration");
- return -1;
- }
-
- if (interface->major_version != SPICE_INTERFACE_MIGRATION_MAJOR ||
- interface->minor_version > SPICE_INTERFACE_MIGRATION_MINOR) {
- spice_warning("unsupported migration interface");
- return -1;
- }
- migration_interface = SPICE_CONTAINEROF(sin, SpiceMigrateInstance, base);
- migration_interface->st = spice_new0(SpiceMigrateState, 1);
- }
-
- return 0;
-}
-
-SPICE_GNUC_VISIBLE int spice_server_remove_interface(SpiceBaseInstance *sin)
-{
- const SpiceBaseInterface *interface = sin->sif;
-
- if (strcmp(interface->type, SPICE_INTERFACE_TABLET) == 0) {
- spice_info("remove SPICE_INTERFACE_TABLET");
- inputs_detach_tablet(SPICE_CONTAINEROF(sin, SpiceTabletInstance, base));
- reds_update_mouse_mode();
- } else if (strcmp(interface->type, SPICE_INTERFACE_PLAYBACK) == 0) {
- spice_info("remove SPICE_INTERFACE_PLAYBACK");
- snd_detach_playback(SPICE_CONTAINEROF(sin, SpicePlaybackInstance, base));
- } else if (strcmp(interface->type, SPICE_INTERFACE_RECORD) == 0) {
- spice_info("remove SPICE_INTERFACE_RECORD");
- snd_detach_record(SPICE_CONTAINEROF(sin, SpiceRecordInstance, base));
- } else if (strcmp(interface->type, SPICE_INTERFACE_CHAR_DEVICE) == 0) {
- spice_server_char_device_remove_interface(sin);
- } else {
- spice_warning("VD_INTERFACE_REMOVING unsupported");
- return -1;
- }
-
- return 0;
-}
-
-static void init_vd_agent_resources(void)
-{
- VDIPortState *state = &reds->agent_state;
- int i;
-
- ring_init(&state->read_bufs);
- agent_msg_filter_init(&state->write_filter, agent_copypaste,
- agent_file_xfer, TRUE);
- agent_msg_filter_init(&state->read_filter, agent_copypaste,
- agent_file_xfer, TRUE);
-
- state->read_state = VDI_PORT_READ_STATE_READ_HEADER;
- state->receive_pos = (uint8_t *)&state->vdi_chunk_header;
- state->receive_len = sizeof(state->vdi_chunk_header);
-
- for (i = 0; i < REDS_VDI_PORT_NUM_RECEIVE_BUFFS; i++) {
- VDIReadBuf *buf = spice_new0(VDIReadBuf, 1);
- ring_item_init(&buf->link);
- ring_add(&reds->agent_state.read_bufs, &buf->link);
- }
-}
-
-const char *version_string = VERSION;
-
-static int do_spice_init(SpiceCoreInterface *core_interface)
-{
- spice_info("starting %s", version_string);
-
- if (core_interface->base.major_version != SPICE_INTERFACE_CORE_MAJOR) {
- spice_warning("bad core interface version");
- goto err;
- }
- core = core_interface;
- reds->listen_socket = -1;
- reds->secure_listen_socket = -1;
- init_vd_agent_resources();
- ring_init(&reds->clients);
- reds->num_clients = 0;
- main_dispatcher_init(core);
- ring_init(&reds->channels);
- ring_init(&reds->mig_target_clients);
- ring_init(&reds->char_devs_states);
- ring_init(&reds->mig_wait_disconnect_clients);
- reds->vm_running = TRUE; /* for backward compatibility */
-
- if (!(reds->mig_timer = core->timer_add(migrate_timeout, NULL))) {
- spice_error("migration timer create failed");
- }
-
-#ifdef RED_STATISTICS
- int shm_name_len;
- int fd;
-
- shm_name_len = strlen(SPICE_STAT_SHM_NAME) + 20;
- reds->stat_shm_name = (char *)spice_malloc(shm_name_len);
- snprintf(reds->stat_shm_name, shm_name_len, SPICE_STAT_SHM_NAME, getpid());
- if ((fd = shm_open(reds->stat_shm_name, O_CREAT | O_RDWR, 0444)) == -1) {
- spice_error("statistics shm_open failed, %s", strerror(errno));
- }
- if (ftruncate(fd, REDS_STAT_SHM_SIZE) == -1) {
- spice_error("statistics ftruncate failed, %s", strerror(errno));
- }
- reds->stat = (SpiceStat *)mmap(NULL, REDS_STAT_SHM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- if (reds->stat == (SpiceStat *)MAP_FAILED) {
- spice_error("statistics mmap failed, %s", strerror(errno));
- }
- memset(reds->stat, 0, REDS_STAT_SHM_SIZE);
- reds->stat->magic = SPICE_STAT_MAGIC;
- reds->stat->version = SPICE_STAT_VERSION;
- reds->stat->root_index = INVALID_STAT_REF;
- if (pthread_mutex_init(&reds->stat_lock, NULL)) {
- spice_error("mutex init failed");
- }
-#endif
-
- if (!(reds->mm_timer = core->timer_add(mm_timer_proc, NULL))) {
- spice_error("mm timer create failed");
- }
- reds_enable_mm_timer();
-
- if (reds_init_net() < 0) {
- goto err;
- }
- if (reds->secure_listen_socket != -1) {
- if (reds_init_ssl() < 0) {
- goto err;
- }
- }
-#if HAVE_SASL
- int saslerr;
- if ((saslerr = sasl_server_init(NULL, sasl_appname ?
- sasl_appname : "spice")) != SASL_OK) {
- spice_error("Failed to initialize SASL auth %s",
- sasl_errstring(saslerr, NULL, NULL));
- goto err;
- }
-#endif
-
- reds->main_channel = main_channel_init();
- inputs_init();
-
- reds->mouse_mode = SPICE_MOUSE_MODE_SERVER;
-
- reds_client_monitors_config_cleanup();
-
- reds->allow_multiple_clients = getenv(SPICE_DEBUG_ALLOW_MC_ENV) != NULL;
- if (reds->allow_multiple_clients) {
- spice_warning("spice: allowing multiple client connections (crashy)");
- }
- atexit(reds_exit);
- return 0;
-
-err:
- return -1;
-}
-
-/* new interface */
-SPICE_GNUC_VISIBLE SpiceServer *spice_server_new(void)
-{
- /* we can't handle multiple instances (yet) */
- spice_assert(reds == NULL);
-
- reds = spice_new0(RedsState, 1);
- return reds;
-}
-
-SPICE_GNUC_VISIBLE int spice_server_init(SpiceServer *s, SpiceCoreInterface *core)
-{
- int ret;
-
- spice_assert(reds == s);
- ret = do_spice_init(core);
- if (default_renderer) {
- red_dispatcher_add_renderer(default_renderer);
- }
- return ret;
-}
-
-SPICE_GNUC_VISIBLE void spice_server_destroy(SpiceServer *s)
-{
- spice_assert(reds == s);
- reds_exit();
-}
-
-SPICE_GNUC_VISIBLE spice_compat_version_t spice_get_current_compat_version(void)
-{
- return SPICE_COMPAT_VERSION_CURRENT;
-}
-
-SPICE_GNUC_VISIBLE int spice_server_set_compat_version(SpiceServer *s,
- spice_compat_version_t version)
-{
- if (version < SPICE_COMPAT_VERSION_0_6) {
- /* We don't support 0.4 compat mode atm */
- return -1;
- }
-
- if (version > SPICE_COMPAT_VERSION_CURRENT) {
- /* Not compatible with future versions */
- return -1;
- }
- return 0;
-}
-
-SPICE_GNUC_VISIBLE int spice_server_set_port(SpiceServer *s, int port)
-{
- spice_assert(reds == s);
- if (port < 0 || port > 0xffff) {
- return -1;
- }
- spice_port = port;
- return 0;
-}
-
-SPICE_GNUC_VISIBLE void spice_server_set_addr(SpiceServer *s, const char *addr, int flags)
-{
- spice_assert(reds == s);
- g_strlcpy(spice_addr, addr, sizeof(spice_addr));
- if (flags & SPICE_ADDR_FLAG_IPV4_ONLY) {
- spice_family = PF_INET;
- }
- if (flags & SPICE_ADDR_FLAG_IPV6_ONLY) {
- spice_family = PF_INET6;
- }
-}
-
-SPICE_GNUC_VISIBLE int spice_server_set_listen_socket_fd(SpiceServer *s, int listen_fd)
-{
- spice_assert(reds == s);
- spice_listen_socket_fd = listen_fd;
- return 0;
-}
-
-SPICE_GNUC_VISIBLE int spice_server_set_exit_on_disconnect(SpiceServer *s, int flag)
-{
- spice_assert(reds == s);
- exit_on_disconnect = !!flag;
- return 0;
-}
-
-SPICE_GNUC_VISIBLE int spice_server_set_noauth(SpiceServer *s)
-{
- spice_assert(reds == s);
- memset(taTicket.password, 0, sizeof(taTicket.password));
- ticketing_enabled = 0;
- return 0;
-}
-
-SPICE_GNUC_VISIBLE int spice_server_set_sasl(SpiceServer *s, int enabled)
-{
- spice_assert(reds == s);
-#if HAVE_SASL
- sasl_enabled = enabled;
- return 0;
-#else
- return -1;
-#endif
-}
-
-SPICE_GNUC_VISIBLE int spice_server_set_sasl_appname(SpiceServer *s, const char *appname)
-{
- spice_assert(reds == s);
-#if HAVE_SASL
- free(sasl_appname);
- sasl_appname = spice_strdup(appname);
- return 0;
-#else
- return -1;
-#endif
-}
-
-SPICE_GNUC_VISIBLE void spice_server_set_name(SpiceServer *s, const char *name)
-{
- free(spice_name);
- spice_name = spice_strdup(name);
-}
-
-SPICE_GNUC_VISIBLE void spice_server_set_uuid(SpiceServer *s, const uint8_t uuid[16])
-{
- memcpy(spice_uuid, uuid, sizeof(spice_uuid));
- spice_uuid_is_set = TRUE;
-}
-
-SPICE_GNUC_VISIBLE int spice_server_set_ticket(SpiceServer *s,
- const char *passwd, int lifetime,
- int fail_if_connected,
- int disconnect_if_connected)
-{
- spice_assert(reds == s);
-
- if (reds_main_channel_connected()) {
- if (fail_if_connected) {
- return -1;
- }
- if (disconnect_if_connected) {
- reds_disconnect();
- }
- }
-
- on_activating_ticketing();
- ticketing_enabled = 1;
- if (lifetime == 0) {
- taTicket.expiration_time = INT_MAX;
- } else {
- time_t now = time(NULL);
- taTicket.expiration_time = now + lifetime;
- }
- if (passwd != NULL) {
- g_strlcpy(taTicket.password, passwd, sizeof(taTicket.password));
- } else {
- memset(taTicket.password, 0, sizeof(taTicket.password));
- taTicket.expiration_time = 0;
- }
- return 0;
-}
-
-SPICE_GNUC_VISIBLE int spice_server_set_tls(SpiceServer *s, int port,
- const char *ca_cert_file, const char *certs_file,
- const char *private_key_file, const char *key_passwd,
- const char *dh_key_file, const char *ciphersuite)
-{
- spice_assert(reds == s);
- if (port == 0 || ca_cert_file == NULL || certs_file == NULL ||
- private_key_file == NULL) {
- return -1;
- }
- if (port < 0 || port > 0xffff) {
- return -1;
- }
- memset(&ssl_parameters, 0, sizeof(ssl_parameters));
-
- spice_secure_port = port;
- g_strlcpy(ssl_parameters.ca_certificate_file, ca_cert_file,
- sizeof(ssl_parameters.ca_certificate_file));
- g_strlcpy(ssl_parameters.certs_file, certs_file,
- sizeof(ssl_parameters.certs_file));
- g_strlcpy(ssl_parameters.private_key_file, private_key_file,
- sizeof(ssl_parameters.private_key_file));
-
- if (key_passwd) {
- g_strlcpy(ssl_parameters.keyfile_password, key_passwd,
- sizeof(ssl_parameters.keyfile_password));
- }
- if (ciphersuite) {
- g_strlcpy(ssl_parameters.ciphersuite, ciphersuite,
- sizeof(ssl_parameters.ciphersuite));
- }
- if (dh_key_file) {
- g_strlcpy(ssl_parameters.dh_key_file, dh_key_file,
- sizeof(ssl_parameters.dh_key_file));
- }
- return 0;
-}
-
-SPICE_GNUC_VISIBLE int spice_server_set_image_compression(SpiceServer *s,
- spice_image_compression_t comp)
-{
- spice_assert(reds == s);
- set_image_compression(comp);
- return 0;
-}
-
-SPICE_GNUC_VISIBLE spice_image_compression_t spice_server_get_image_compression(SpiceServer *s)
-{
- spice_assert(reds == s);
- return image_compression;
-}
-
-SPICE_GNUC_VISIBLE int spice_server_set_jpeg_compression(SpiceServer *s, spice_wan_compression_t comp)
-{
- spice_assert(reds == s);
- if (comp == SPICE_WAN_COMPRESSION_INVALID) {
- spice_error("invalid jpeg state");
- return -1;
- }
- // todo: support dynamically changing the state
- jpeg_state = comp;
- return 0;
-}
-
-SPICE_GNUC_VISIBLE int spice_server_set_zlib_glz_compression(SpiceServer *s, spice_wan_compression_t comp)
-{
- spice_assert(reds == s);
- if (comp == SPICE_WAN_COMPRESSION_INVALID) {
- spice_error("invalid zlib_glz state");
- return -1;
- }
- // todo: support dynamically changing the state
- zlib_glz_state = comp;
- return 0;
-}
-
-SPICE_GNUC_VISIBLE int spice_server_set_channel_security(SpiceServer *s, const char *channel, int security)
-{
- static const char *names[] = {
- [ SPICE_CHANNEL_MAIN ] = "main",
- [ SPICE_CHANNEL_DISPLAY ] = "display",
- [ SPICE_CHANNEL_INPUTS ] = "inputs",
- [ SPICE_CHANNEL_CURSOR ] = "cursor",
- [ SPICE_CHANNEL_PLAYBACK ] = "playback",
- [ SPICE_CHANNEL_RECORD ] = "record",
-#ifdef USE_SMARTCARD
- [ SPICE_CHANNEL_SMARTCARD] = "smartcard",
-#endif
- [ SPICE_CHANNEL_USBREDIR ] = "usbredir",
- [ SPICE_CHANNEL_WEBDAV ] = "webdav",
- };
- int i;
-
- spice_assert(reds == s);
-
- if (channel == NULL) {
- default_channel_security = security;
- return 0;
- }
- for (i = 0; i < SPICE_N_ELEMENTS(names); i++) {
- if (names[i] && strcmp(names[i], channel) == 0) {
- set_one_channel_security(i, security);
- return 0;
- }
- }
- return -1;
-}
-
-SPICE_GNUC_VISIBLE int spice_server_get_sock_info(SpiceServer *s, struct sockaddr *sa, socklen_t *salen)
-{
- spice_assert(reds == s);
- if (main_channel_getsockname(reds->main_channel, sa, salen) < 0) {
- return -1;
- }
- return 0;
-}
-
-SPICE_GNUC_VISIBLE int spice_server_get_peer_info(SpiceServer *s, struct sockaddr *sa, socklen_t *salen)
-{
- spice_assert(reds == s);
- if (main_channel_getpeername(reds->main_channel, sa, salen) < 0) {
- return -1;
- }
- return 0;
-}
-
-SPICE_GNUC_VISIBLE int spice_server_is_server_mouse(SpiceServer *s)
-{
- spice_assert(reds == s);
- return reds->mouse_mode == SPICE_MOUSE_MODE_SERVER;
-}
-
-SPICE_GNUC_VISIBLE int spice_server_add_renderer(SpiceServer *s, const char *name)
-{
- spice_assert(reds == s);
- if (!red_dispatcher_add_renderer(name)) {
- return -1;
- }
- default_renderer = NULL;
- return 0;
-}
-
-SPICE_GNUC_VISIBLE int spice_server_kbd_leds(SpiceKbdInstance *sin, int leds)
-{
- inputs_on_keyboard_leds_change(NULL, leds);
- return 0;
-}
-
-SPICE_GNUC_VISIBLE int spice_server_set_streaming_video(SpiceServer *s, int value)
-{
- spice_assert(reds == s);
- if (value != SPICE_STREAM_VIDEO_OFF &&
- value != SPICE_STREAM_VIDEO_ALL &&
- value != SPICE_STREAM_VIDEO_FILTER)
- return -1;
- streaming_video = value;
- red_dispatcher_on_sv_change();
- return 0;
-}
-
-SPICE_GNUC_VISIBLE int spice_server_set_playback_compression(SpiceServer *s, int enable)
-{
- spice_assert(reds == s);
- snd_set_playback_compression(enable);
- return 0;
-}
-
-SPICE_GNUC_VISIBLE int spice_server_set_agent_mouse(SpiceServer *s, int enable)
-{
- spice_assert(reds == s);
- agent_mouse = enable;
- reds_update_mouse_mode();
- return 0;
-}
-
-SPICE_GNUC_VISIBLE int spice_server_set_agent_copypaste(SpiceServer *s, int enable)
-{
- spice_assert(reds == s);
- agent_copypaste = enable;
- reds->agent_state.write_filter.copy_paste_enabled = agent_copypaste;
- reds->agent_state.read_filter.copy_paste_enabled = agent_copypaste;
- return 0;
-}
-
-SPICE_GNUC_VISIBLE int spice_server_set_agent_file_xfer(SpiceServer *s, int enable)
-{
- spice_assert(reds == s);
- agent_file_xfer = enable;
- reds->agent_state.write_filter.file_xfer_enabled = agent_file_xfer;
- reds->agent_state.read_filter.file_xfer_enabled = agent_file_xfer;
- return 0;
-}
-
-/* returns FALSE if info is invalid */
-static int reds_set_migration_dest_info(const char* dest,
- int port, int secure_port,
- const char* cert_subject)
-{
- RedsMigSpice *spice_migration = NULL;
-
- reds_mig_release();
- if ((port == -1 && secure_port == -1) || !dest) {
- return FALSE;
- }
-
- spice_migration = spice_new0(RedsMigSpice, 1);
- spice_migration->port = port;
- spice_migration->sport = secure_port;
- spice_migration->host = spice_strdup(dest);
- if (cert_subject) {
- spice_migration->cert_subject = spice_strdup(cert_subject);
- }
-
- reds->mig_spice = spice_migration;
-
- return TRUE;
-}
-
-/* semi-seamless client migration */
-SPICE_GNUC_VISIBLE int spice_server_migrate_connect(SpiceServer *s, const char* dest,
- int port, int secure_port,
- const char* cert_subject)
-{
- SpiceMigrateInterface *sif;
- int try_seamless;
-
- spice_info(NULL);
- spice_assert(migration_interface);
- spice_assert(reds == s);
-
- if (reds->expect_migrate) {
- spice_info("consecutive calls without migration. Canceling previous call");
- main_channel_migrate_src_complete(reds->main_channel, FALSE);
- }
-
- sif = SPICE_CONTAINEROF(migration_interface->base.sif, SpiceMigrateInterface, base);
-
- if (!reds_set_migration_dest_info(dest, port, secure_port, cert_subject)) {
- sif->migrate_connect_complete(migration_interface);
- return -1;
- }
-
- reds->expect_migrate = TRUE;
-
- /*
- * seamless migration support was added to the client after the support in
- * agent_connect_tokens, so there shouldn't be contradicition - if
- * the client is capable of seamless migration, it is capbable of agent_connected_tokens.
- * The demand for agent_connected_tokens support is in order to assure that if migration
- * occured when the agent was not connected, the tokens state after migration will still
- * be valid (see reds_reset_vdp for more details).
- */
- try_seamless = reds->seamless_migration_enabled &&
- red_channel_test_remote_cap(&reds->main_channel->base,
- SPICE_MAIN_CAP_AGENT_CONNECTED_TOKENS);
- /* main channel will take care of clients that are still during migration (at target)*/
- if (main_channel_migrate_connect(reds->main_channel, reds->mig_spice,
- try_seamless)) {
- reds_mig_started();
- } else {
- if (reds->num_clients == 0) {
- reds_mig_release();
- spice_info("no client connected");
- }
- sif->migrate_connect_complete(migration_interface);
- }
-
- return 0;
-}
-
-SPICE_GNUC_VISIBLE int spice_server_migrate_info(SpiceServer *s, const char* dest,
- int port, int secure_port,
- const char* cert_subject)
-{
- spice_info(NULL);
- spice_assert(!migration_interface);
- spice_assert(reds == s);
-
- if (!reds_set_migration_dest_info(dest, port, secure_port, cert_subject)) {
- return -1;
- }
- return 0;
-}
-
-SPICE_GNUC_VISIBLE int spice_server_migrate_start(SpiceServer *s)
-{
- spice_assert(reds == s);
- spice_info(NULL);
- if (!reds->mig_spice) {
- return -1;
- }
- return 0;
-}
-
-SPICE_GNUC_VISIBLE int spice_server_migrate_client_state(SpiceServer *s)
-{
- spice_assert(reds == s);
-
- if (!reds_main_channel_connected()) {
- return SPICE_MIGRATE_CLIENT_NONE;
- } else if (reds->mig_wait_connect) {
- return SPICE_MIGRATE_CLIENT_WAITING;
- } else {
- return SPICE_MIGRATE_CLIENT_READY;
- }
- return 0;
-}
-
-SPICE_GNUC_VISIBLE int spice_server_migrate_end(SpiceServer *s, int completed)
-{
- SpiceMigrateInterface *sif;
- int ret = 0;
-
- spice_info(NULL);
-
- spice_assert(migration_interface);
- spice_assert(reds == s);
-
- sif = SPICE_CONTAINEROF(migration_interface->base.sif, SpiceMigrateInterface, base);
- if (completed && !reds->expect_migrate && reds->num_clients) {
- spice_warning("spice_server_migrate_info was not called, disconnecting clients");
- reds_disconnect();
- ret = -1;
- goto complete;
- }
-
- reds->expect_migrate = FALSE;
- if (!reds_main_channel_connected()) {
- spice_info("no peer connected");
- goto complete;
- }
- reds_mig_finished(completed);
- return 0;
-complete:
- if (sif->migrate_end_complete) {
- sif->migrate_end_complete(migration_interface);
- }
- return ret;
-}
-
-/* interface for switch-host migration */
-SPICE_GNUC_VISIBLE int spice_server_migrate_switch(SpiceServer *s)
-{
- spice_assert(reds == s);
- spice_info(NULL);
- if (!reds->num_clients) {
- return 0;
- }
- reds->expect_migrate = FALSE;
- reds_mig_switch();
- return 0;
-}
-
-SPICE_GNUC_VISIBLE void spice_server_vm_start(SpiceServer *s)
-{
- RingItem *item;
-
- spice_assert(s == reds);
- reds->vm_running = TRUE;
- RING_FOREACH(item, &reds->char_devs_states) {
- SpiceCharDeviceStateItem *st_item;
-
- st_item = SPICE_CONTAINEROF(item, SpiceCharDeviceStateItem, link);
- spice_char_device_start(st_item->st);
- }
- red_dispatcher_on_vm_start();
-}
-
-SPICE_GNUC_VISIBLE void spice_server_vm_stop(SpiceServer *s)
-{
- RingItem *item;
-
- spice_assert(s == reds);
- reds->vm_running = FALSE;
- RING_FOREACH(item, &reds->char_devs_states) {
- SpiceCharDeviceStateItem *st_item;
-
- st_item = SPICE_CONTAINEROF(item, SpiceCharDeviceStateItem, link);
- spice_char_device_stop(st_item->st);
- }
- red_dispatcher_on_vm_stop();
-}
-
-SPICE_GNUC_VISIBLE void spice_server_set_seamless_migration(SpiceServer *s, int enable)
-{
- spice_assert(s == reds);
- /* seamless migration is not supported with multiple clients */
- reds->seamless_migration_enabled = enable && !reds->allow_multiple_clients;
- spice_debug("seamless migration enabled=%d", enable);
-}
diff --git a/server/reds.cpp b/server/reds.cpp
new file mode 100644
index 00000000..11db207a
--- /dev/null
+++ b/server/reds.cpp
@@ -0,0 +1,4516 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+
+#include <array>
+#include <cctype>
+#include <climits>
+#include <cstdint>
+#include <cstdio>
+#include <limits>
+
+#include <pthread.h>
+#include <unistd.h>
+#ifndef _WIN32
+#include <sys/socket.h>
+#include <sys/uio.h>
+#include <netinet/in.h>
+#include <netinet/tcp.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+#include <sys/mman.h>
+#include <sys/un.h>
+#else
+#include <ws2tcpip.h>
+#endif
+
+#include <openssl/bn.h>
+#include <openssl/err.h>
+#include <openssl/rsa.h>
+
+#if HAVE_SASL
+#include <sasl/sasl.h>
+#endif
+
+#include <glib.h>
+
+#include <spice/protocol.h>
+#include <spice/vd_agent.h>
+#include <spice/stats.h>
+
+#include <common/generated_server_marshallers.h>
+#include <common/agent.h>
+
+#include "glib-compat.h"
+#include "spice-wrapped.h"
+#include "reds.h"
+#include "agent-msg-filter.h"
+#include "inputs-channel.h"
+#include "main-channel.h"
+#include "red-qxl.h"
+#include "main-dispatcher.h"
+#include "sound.h"
+#include "stat.h"
+#include "char-device.h"
+#include "migration-protocol.h"
+#ifdef USE_SMARTCARD
+#include "smartcard.h"
+#endif
+#include "red-stream.h"
+#include "red-client.h"
+
+#include "reds-private.h"
+#include "video-encoder.h"
+#include "red-channel-client.h"
+#include "main-channel-client.h"
+#include "red-client.h"
+#include "net-utils.h"
+#include "red-stream-device.h"
+
+#define REDS_MAX_STAT_NODES 100
+
+static void reds_client_monitors_config(RedsState *reds, VDAgentMonitorsConfig *monitors_config);
+static gboolean reds_use_client_monitors_config(RedsState *reds);
+static void reds_set_video_codecs(RedsState *reds, GArray *video_codecs);
+
+/* Debugging only variable: allow multiple client connections to the spice
+ * server */
+#define SPICE_DEBUG_ALLOW_MC_ENV "SPICE_DEBUG_ALLOW_MC"
+
+#define REDS_TOKENS_TO_SEND 5
+#define REDS_VDI_PORT_NUM_RECEIVE_BUFFS 5
+
+/* TODO while we can technically create more than one server in a process,
+ * the intended use is to support a single server per process */
+static GList *servers = nullptr;
+static pthread_mutex_t global_reds_lock = PTHREAD_MUTEX_INITIALIZER;
+
+/* SPICE configuration set through the public spice_server_set_xxx APIS */
+struct RedServerConfig {
+ RedsMigSpice *mig_spice;
+
+ int default_channel_security;
+ ChannelSecurityOptions *channels_security;
+
+ GArray *renderers;
+
+ int spice_port;
+ int spice_secure_port;
+ int spice_listen_socket_fd;
+ char spice_addr[256];
+ int spice_family;
+ TicketAuthentication taTicket;
+
+ int sasl_enabled;
+#if HAVE_SASL
+ char *sasl_appname;
+#endif
+ char *spice_name;
+
+ bool spice_uuid_is_set;
+ uint8_t spice_uuid[16];
+
+ gboolean ticketing_enabled;
+ uint32_t streaming_video;
+ GArray* video_codecs;
+ SpiceImageCompression image_compression;
+ bool playback_compression;
+ spice_wan_compression_t jpeg_state;
+ spice_wan_compression_t zlib_glz_state;
+
+ gboolean agent_mouse;
+ gboolean agent_copypaste;
+ gboolean agent_file_xfer;
+ gboolean exit_on_disconnect;
+
+ RedSSLParameters ssl_parameters;
+};
+
+
+struct RedLinkInfo {
+ RedsState *reds;
+ RedStream *stream;
+ SpiceLinkHeader link_header;
+ SpiceLinkMess *link_mess;
+ TicketInfo tiTicketing;
+ SpiceLinkAuthMechanism auth_mechanism;
+ int skip_auth;
+};
+
+struct ChannelSecurityOptions {
+ uint32_t channel_id;
+ uint32_t options;
+ ChannelSecurityOptions *next;
+};
+
+struct RedVDIReadBuf final: public RedAgentDataPipeItem {
+ ~RedVDIReadBuf() override;
+
+ RedCharDeviceVDIPort *dev;
+};
+
+enum VDIPortReadStates {
+ VDI_PORT_READ_STATE_READ_HEADER,
+ VDI_PORT_READ_STATE_GET_BUFF,
+ VDI_PORT_READ_STATE_READ_DATA,
+};
+
+struct RedCharDeviceVDIPortPrivate {
+ bool agent_attached;
+ uint32_t plug_generation;
+ bool client_agent_started;
+ bool agent_supports_graphics_device_info;
+
+ /* write to agent */
+ RedCharDeviceWriteBuffer *recv_from_client_buf;
+ int recv_from_client_buf_pushed;
+ AgentMsgFilter write_filter;
+
+ /* read from agent */
+ uint32_t num_read_buf;
+ VDIPortReadStates read_state;
+ uint32_t message_receive_len;
+ uint8_t *receive_pos;
+ uint32_t receive_len;
+ red::shared_ptr<RedVDIReadBuf> current_read_buf;
+ AgentMsgFilter read_filter;
+
+ VDIChunkHeader vdi_chunk_header;
+
+ SpiceMigrateDataMain *mig_data; /* storing it when migration data arrives
+ before agent is attached */
+};
+
+/* messages that are addressed to the agent and are created in the server */
+#include <spice/start-packed.h>
+struct SPICE_ATTR_PACKED VDInternalBuf {
+ VDIChunkHeader chunk_header;
+ VDAgentMessage header;
+ union {
+ VDAgentMouseState mouse_state;
+ VDAgentGraphicsDeviceInfo graphics_device_info;
+ }
+ u;
+};
+#include <spice/end-packed.h>
+
+struct RedCharDeviceVDIPort: public RedCharDevice
+{
+ explicit RedCharDeviceVDIPort(RedsState *reds);
+ RedCharDeviceVDIPort();
+ ~RedCharDeviceVDIPort() override;
+
+ RedPipeItemPtr read_one_msg_from_device() override;
+ void send_msg_to_client(RedPipeItem *msg, RedCharDeviceClientOpaque *opaque) override;
+ void send_tokens_to_client(RedCharDeviceClientOpaque *opaque, uint32_t tokens) override;
+ void remove_client(RedCharDeviceClientOpaque *opaque) override;
+ void on_free_self_token() override;
+
+ RedCharDeviceVDIPortPrivate priv[1];
+};
+
+static void migrate_timeout(RedsState *reds);
+static RedsMigTargetClient* reds_mig_target_client_find(RedsState *reds, RedClient *client);
+static void reds_mig_target_client_free(RedsState *reds, RedsMigTargetClient *mig_client);
+static void reds_mig_cleanup_wait_disconnect(RedsState *reds);
+static void reds_mig_remove_wait_disconnect_client(RedsState *reds, RedClient *client);
+static void reds_add_char_device(RedsState *reds, const red::shared_ptr<RedCharDevice> &dev);
+static void reds_send_mm_time(RedsState *reds);
+static void reds_on_ic_change(RedsState *reds);
+static void reds_on_sv_change(RedsState *reds);
+static void reds_on_vc_change(RedsState *reds);
+static void reds_on_vm_stop(RedsState *reds);
+static void reds_on_vm_start(RedsState *reds);
+static void reds_set_mouse_mode(RedsState *reds, SpiceMouseMode mode);
+static uint32_t reds_qxl_ram_size(RedsState *reds);
+static int calc_compression_level(RedsState *reds);
+
+static red::shared_ptr<RedVDIReadBuf> vdi_port_get_read_buf(RedCharDeviceVDIPort *dev);
+
+static ChannelSecurityOptions *reds_find_channel_security(RedsState *reds, int id)
+{
+ ChannelSecurityOptions *now = reds->config->channels_security;
+ while (now && now->channel_id != id) {
+ now = now->next;
+ }
+ return now;
+}
+
+void reds_handle_channel_event(RedsState *reds, int event, SpiceChannelEventInfo *info)
+{
+ reds->core.channel_event(&reds->core, event, info);
+
+ if (event == SPICE_CHANNEL_EVENT_DISCONNECTED) {
+ g_free(info);
+ }
+}
+
+static void reds_link_free(RedLinkInfo *link)
+{
+ red_stream_free(link->stream);
+ link->stream = nullptr;
+
+ g_free(link->link_mess);
+ link->link_mess = nullptr;
+
+ BN_free(link->tiTicketing.bn);
+ link->tiTicketing.bn = nullptr;
+
+ if (link->tiTicketing.rsa) {
+ EVP_PKEY_free(link->tiTicketing.rsa);
+ link->tiTicketing.rsa = nullptr;
+ }
+
+ g_free(link);
+}
+
+#ifdef RED_STATISTICS
+
+void stat_init_node(RedStatNode *node, SpiceServer *reds, const RedStatNode *parent,
+ const char *name, int visible)
+{
+ StatNodeRef parent_ref = parent ? parent->ref : INVALID_STAT_REF;
+ node->ref = stat_file_add_node(reds->stat_file, parent_ref, name, visible);
+}
+
+void stat_remove_node(SpiceServer *reds, RedStatNode *node)
+{
+ if (node->ref != INVALID_STAT_REF) {
+ stat_file_remove_node(reds->stat_file, node->ref);
+ node->ref = INVALID_STAT_REF;
+ }
+}
+
+void stat_init_counter(RedStatCounter *counter, SpiceServer *reds,
+ const RedStatNode *parent, const char *name, int visible)
+{
+ StatNodeRef parent_ref = parent ? parent->ref : INVALID_STAT_REF;
+ counter->counter =
+ stat_file_add_counter(reds->stat_file, parent_ref, name, visible);
+}
+
+void stat_remove_counter(SpiceServer *reds, RedStatCounter *counter)
+{
+ if (counter->counter) {
+ stat_file_remove_counter(reds->stat_file, counter->counter);
+ counter->counter = NULL;
+ }
+}
+
+#endif
+
+void reds_register_channel(RedsState *reds, RedChannel *channel)
+{
+ spice_assert(reds);
+
+ uint32_t this_type = channel->type();
+ uint32_t this_id = channel->id();
+ if (spice_extra_checks) {
+ g_assert(reds_find_channel(reds, this_type, this_id) == nullptr);
+ } else {
+ g_warn_if_fail(reds_find_channel(reds, this_type, this_id) == nullptr);
+ }
+ reds->channels.push_front(red::shared_ptr<RedChannel>(channel));
+ // create new channel in the client if possible
+ reds->main_channel->registered_new_channel(channel);
+}
+
+void reds_unregister_channel(RedsState *reds, RedChannel *channel)
+{
+ reds->channels.remove(red::shared_ptr<RedChannel>(channel));
+}
+
+RedChannel *reds_find_channel(RedsState *reds, uint32_t type, uint32_t id)
+{
+ for (const auto& channel: reds->channels) {
+ if (channel->type() == type && channel->id() == id) {
+ return channel.get();
+ }
+ }
+ return nullptr;
+}
+
+/* Search for first free channel id for a specific channel type.
+ * Return first id free or <0 if not found. */
+int reds_get_free_channel_id(RedsState *reds, uint32_t type)
+{
+ // this mark if some IDs are used.
+ // The size of the array limits the possible id returned but
+ // usually the IDs used for a channel type are not much.
+ std::array<bool, 256> used_ids{};
+
+ // mark id used for the specific channel type
+ for (const auto &channel: reds->channels) {
+ if (channel->type() == type && channel->id() < used_ids.size()) {
+ used_ids[channel->id()] = true;
+ }
+ }
+
+ // find first ID not marked as used
+ auto it = std::find(used_ids.begin(), used_ids.end(), false);
+ if (it == used_ids.end()) {
+ return -1;
+ }
+ return std::distance(used_ids.begin(), it);
+}
+
+static void reds_mig_cleanup(RedsState *reds)
+{
+ if (reds->mig_inprogress) {
+
+ if (reds->mig_wait_connect || reds->mig_wait_disconnect) {
+ SpiceMigrateInterface *sif;
+ spice_assert(reds->migration_interface);
+ sif = SPICE_UPCAST(SpiceMigrateInterface, reds->migration_interface->base.sif);
+ if (reds->mig_wait_connect) {
+ sif->migrate_connect_complete(reds->migration_interface);
+ } else {
+ if (sif->migrate_end_complete) {
+ sif->migrate_end_complete(reds->migration_interface);
+ }
+ }
+ }
+ reds->mig_inprogress = FALSE;
+ reds->mig_wait_connect = FALSE;
+ reds->mig_wait_disconnect = FALSE;
+ red_timer_cancel(reds->mig_timer);
+ reds_mig_cleanup_wait_disconnect(reds);
+ }
+}
+
+static void reds_reset_vdp(RedsState *reds)
+{
+ RedCharDeviceVDIPort *dev = reds->agent_dev.get();
+ SpiceCharDeviceInterface *sif;
+
+ dev->priv->read_state = VDI_PORT_READ_STATE_READ_HEADER;
+ dev->priv->receive_pos = reinterpret_cast<uint8_t *>(&dev->priv->vdi_chunk_header);
+ dev->priv->receive_len = sizeof(dev->priv->vdi_chunk_header);
+ dev->priv->message_receive_len = 0;
+ dev->priv->current_read_buf.reset();
+
+ /* Reset read filter to start with clean state when the agent reconnects */
+ agent_msg_filter_init(&dev->priv->read_filter, reds->config->agent_copypaste,
+ reds->config->agent_file_xfer,
+ reds_use_client_monitors_config(reds), TRUE);
+ /* Throw away pending chunks from the current (if any) and future
+ * messages written by the client.
+ * TODO: client should clear its agent messages queue when the agent
+ * is disconnected. Currently, when an agent gets disconnected and reconnected,
+ * messages that were directed to the previous instance of the agent continue
+ * to be sent from the client. This TODO will require server, protocol, and client changes */
+ dev->priv->write_filter.result = AGENT_MSG_FILTER_DISCARD;
+ dev->priv->write_filter.discard_all = TRUE;
+ dev->priv->client_agent_started = false;
+ dev->priv->agent_supports_graphics_device_info = false;
+
+ /* The client's tokens are set once when the main channel is initialized
+ * and once upon agent's connection with SPICE_MSG_MAIN_AGENT_CONNECTED_TOKENS.
+ * The client tokens are tracked as part of the RedCharDeviceClient. Thus,
+ * in order to be backward compatible with the client, we need to track the tokens
+ * even if the agent is detached. We don't destroy the char_device, and
+ * instead we just reset it.
+ * The tokens are also reset to avoid mismatch in upon agent reconnection.
+ */
+ dev->priv->agent_attached = FALSE;
+ dev->stop();
+ dev->reset();
+ dev->reset_dev_instance(nullptr);
+
+ sif = spice_char_device_get_interface(reds->vdagent);
+ if (sif->state) {
+ sif->state(reds->vdagent, 0);
+ }
+}
+
+static RedCharDeviceWriteBuffer *vdagent_new_write_buffer(RedCharDeviceVDIPort *agent_dev,
+ uint32_t type,
+ size_t size,
+ bool use_token)
+{
+ uint32_t total_msg_size = sizeof(VDIChunkHeader) + sizeof(VDAgentMessage) + size;
+
+ RedCharDeviceWriteBuffer *char_dev_buf;
+ char_dev_buf = agent_dev->write_buffer_get_server(total_msg_size,
+ use_token);
+ if (!char_dev_buf) {
+ return nullptr; // no token was available
+ }
+
+ char_dev_buf->buf_used = total_msg_size;
+ auto internal_buf = reinterpret_cast<VDInternalBuf *>(char_dev_buf->buf);
+ internal_buf->chunk_header.port = VDP_SERVER_PORT;
+ internal_buf->chunk_header.size = sizeof(VDAgentMessage) + size;
+ internal_buf->header.protocol = VD_AGENT_PROTOCOL;
+ internal_buf->header.type = type;
+ internal_buf->header.opaque = 0;
+ internal_buf->header.size = size;
+
+ return char_dev_buf;
+}
+
+static int reds_main_channel_connected(RedsState *reds)
+{
+ return reds->main_channel && reds->main_channel->is_connected();
+}
+
+void reds_client_disconnect(RedsState *reds, RedClient *client)
+{
+ RedsMigTargetClient *mig_client;
+
+ if (reds->config->exit_on_disconnect)
+ {
+ spice_debug("Exiting server because of client disconnect.");
+ exit(0);
+ }
+
+ if (!client || client->is_disconnecting()) {
+ spice_debug("client %p already during disconnection", client);
+ return;
+ }
+
+ spice_debug("trace");
+ /* disconnecting is set to prevent recursion because of the following:
+ * main_channel_client_on_disconnect->
+ * reds_client_disconnect->red_client_destroy->main_channel...
+ */
+ client->set_disconnecting();
+
+ // TODO: we need to handle agent properly for all clients!!!! (e.g., cut and paste, how?)
+ // We shouldn't initialize the agent when there are still clients connected
+
+ mig_client = reds_mig_target_client_find(reds, client);
+ if (mig_client) {
+ reds_mig_target_client_free(reds, mig_client);
+ }
+
+ if (reds->mig_wait_disconnect) {
+ reds_mig_remove_wait_disconnect_client(reds, client);
+ }
+
+ /* note that client might be NULL, if the vdagent was once
+ * up and than was removed */
+ auto client_opaque = reinterpret_cast<RedCharDeviceClientOpaque *>(client);
+ if (reds->agent_dev->client_exists(client_opaque)) {
+ reds->agent_dev->client_remove(client_opaque);
+ }
+
+ reds->clients.remove(client);
+ client->destroy();
+
+ // TODO: we need to handle agent properly for all clients!!!! (e.g., cut and paste, how? Maybe throw away messages
+ // if we are in the middle of one from another client)
+ if (reds->clients.empty()) {
+ /* Let the agent know the client is disconnected */
+ if (reds->agent_dev->priv->agent_attached) {
+ RedCharDeviceWriteBuffer *char_dev_buf =
+ vdagent_new_write_buffer(reds->agent_dev.get(),
+ VD_AGENT_CLIENT_DISCONNECTED,
+ 0,
+ false);
+
+ reds->agent_dev->write_buffer_add(char_dev_buf);
+ }
+
+ /* Reset write filter to start with clean state on client reconnect */
+ agent_msg_filter_init(&reds->agent_dev->priv->write_filter, reds->config->agent_copypaste,
+ reds->config->agent_file_xfer,
+ reds_use_client_monitors_config(reds), TRUE);
+
+ /* Throw away pending chunks from the current (if any) and future
+ * messages read from the agent */
+ reds->agent_dev->priv->read_filter.result = AGENT_MSG_FILTER_DISCARD;
+ reds->agent_dev->priv->read_filter.discard_all = TRUE;
+ g_free(reds->agent_dev->priv->mig_data);
+ reds->agent_dev->priv->mig_data = nullptr;
+
+ reds_mig_cleanup(reds);
+ }
+}
+
+// TODO: go over all usage of reds_disconnect, most/some of it should be converted to
+// reds_client_disconnect
+static void reds_disconnect(RedsState *reds)
+{
+ spice_debug("trace");
+ for (auto client: reds->clients) {
+ reds_client_disconnect(reds, client);
+ }
+ reds_mig_cleanup(reds);
+}
+
+static void reds_mig_disconnect(RedsState *reds)
+{
+ if (reds_main_channel_connected(reds)) {
+ reds_disconnect(reds);
+ } else {
+ reds_mig_cleanup(reds);
+ }
+}
+
+bool reds_config_get_playback_compression(RedsState *reds)
+{
+ return reds->config->playback_compression;
+}
+
+SpiceMouseMode reds_get_mouse_mode(RedsState *reds)
+{
+ return reds->mouse_mode;
+}
+
+static void reds_set_mouse_mode(RedsState *reds, SpiceMouseMode mode)
+{
+ if (reds->mouse_mode == mode) {
+ return;
+ }
+ reds->mouse_mode = mode;
+
+ for (const auto &qxl : reds->qxl_instances) {
+ red_qxl_set_mouse_mode(qxl, mode);
+ }
+
+ reds->main_channel->push_mouse_mode(reds->mouse_mode,
+ reds->is_client_mouse_allowed);
+}
+
+gboolean reds_config_get_agent_mouse(const RedsState *reds)
+{
+ return reds->config->agent_mouse;
+}
+
+static void reds_update_mouse_mode(RedsState *reds)
+{
+ int allowed = 0;
+ auto qxl_count = reds->qxl_instances.size();
+ auto display_channel_count =
+ std::count_if(reds->channels.begin(), reds->channels.end(),
+ [](const red::shared_ptr<RedChannel> &channel) {
+ return channel->type() == SPICE_CHANNEL_DISPLAY;
+ });
+
+ if ((reds->config->agent_mouse && reds->vdagent) ||
+ (reds->inputs_channel && reds->inputs_channel->has_tablet() &&
+ qxl_count == 1 && display_channel_count == 1)) {
+ allowed = reds->dispatcher_allows_client_mouse;
+ }
+ if (allowed == reds->is_client_mouse_allowed) {
+ return;
+ }
+ reds->is_client_mouse_allowed = allowed;
+ if (reds->mouse_mode == SPICE_MOUSE_MODE_CLIENT && !allowed) {
+ reds_set_mouse_mode(reds, SPICE_MOUSE_MODE_SERVER);
+ return;
+ }
+ if (reds->main_channel) {
+ reds->main_channel->push_mouse_mode(reds->mouse_mode,
+ reds->is_client_mouse_allowed);
+ }
+}
+
+static void reds_update_agent_properties(RedsState *reds)
+{
+ if (!reds->agent_dev || reds->config == nullptr) {
+ return;
+ }
+ /* copy & paste */
+ reds->agent_dev->priv->write_filter.copy_paste_enabled = reds->config->agent_copypaste;
+ reds->agent_dev->priv->read_filter.copy_paste_enabled = reds->config->agent_copypaste;
+ /* file transfer */
+ reds->agent_dev->priv->write_filter.file_xfer_enabled = reds->config->agent_file_xfer;
+ reds->agent_dev->priv->read_filter.file_xfer_enabled = reds->config->agent_file_xfer;
+}
+
+static void reds_agent_remove(RedsState *reds)
+{
+ // TODO: agent is broken with multiple clients. also need to figure out what to do when
+ // part of the clients are during target migration.
+ reds_reset_vdp(reds);
+
+ reds->vdagent = nullptr;
+ reds_update_mouse_mode(reds);
+ if (reds_main_channel_connected(reds) &&
+ !reds->main_channel->is_waiting_for_migrate_data()) {
+ reds->main_channel->push_agent_disconnected();
+ }
+}
+
+/*
+ returns the #AgentMsgFilterResult value:
+ AGENT_MSG_FILTER_OK if the buffer can be forwarded,
+ AGENT_MSG_FILTER_PROTO_ERROR on error
+ other values can be discarded
+*/
+static AgentMsgFilterResult vdi_port_read_buf_process(RedCharDeviceVDIPort *dev,
+ RedVDIReadBuf& buf)
+{
+ switch (dev->priv->vdi_chunk_header.port) {
+ case VDP_CLIENT_PORT:
+ return agent_msg_filter_process_data(&dev->priv->read_filter, buf.data, buf.len);
+ case VDP_SERVER_PORT:
+ return AGENT_MSG_FILTER_DISCARD;
+ default:
+ spice_warning("invalid port");
+ return AGENT_MSG_FILTER_PROTO_ERROR;
+ }
+}
+
+RedVDIReadBuf::~RedVDIReadBuf()
+{
+ dev->priv->num_read_buf--;
+
+ /* read_one_msg_from_vdi_port may have never completed because we
+ reached buffer limit. So we call it again so it can complete its work if
+ necessary. Note that since we can be called from red_char_device_wakeup
+ this can cause recursion, but we have protection for that */
+ if (dev->priv->agent_attached) {
+ dev->wakeup();
+ }
+}
+
+static red::shared_ptr<RedVDIReadBuf> vdi_read_buf_new(RedCharDeviceVDIPort *dev)
+{
+ auto buf = red::make_shared<RedVDIReadBuf>();
+ buf->dev = dev;
+ return buf;
+}
+
+static red::shared_ptr<RedVDIReadBuf> vdi_port_get_read_buf(RedCharDeviceVDIPort *dev)
+{
+ if (dev->priv->num_read_buf >= REDS_VDI_PORT_NUM_RECEIVE_BUFFS) {
+ return red::shared_ptr<RedVDIReadBuf>();
+ }
+
+ dev->priv->num_read_buf++;
+ return vdi_read_buf_new(dev);
+}
+
+/* certain agent capabilities can be overridden and disabled in the server. In these cases, unset
+ * these capabilities before sending them on to the client */
+static void reds_adjust_agent_capabilities(RedsState *reds, VDAgentMessage *message)
+{
+ VDAgentAnnounceCapabilities *capabilities;
+
+ if (message->type != VD_AGENT_ANNOUNCE_CAPABILITIES) {
+ return;
+ }
+ capabilities = reinterpret_cast<VDAgentAnnounceCapabilities *>(message->data);
+
+ if (!reds->config->agent_copypaste) {
+ VD_AGENT_CLEAR_CAPABILITY(capabilities->caps, VD_AGENT_CAP_CLIPBOARD);
+ VD_AGENT_CLEAR_CAPABILITY(capabilities->caps, VD_AGENT_CAP_CLIPBOARD_BY_DEMAND);
+ VD_AGENT_CLEAR_CAPABILITY(capabilities->caps, VD_AGENT_CAP_CLIPBOARD_SELECTION);
+ }
+
+ if (!reds->config->agent_file_xfer) {
+ VD_AGENT_SET_CAPABILITY(capabilities->caps, VD_AGENT_CAP_FILE_XFER_DISABLED);
+ }
+
+ size_t caps_size = VD_AGENT_CAPS_SIZE_FROM_MSG_SIZE(message->size);
+ reds->agent_dev->priv->agent_supports_graphics_device_info =
+ VD_AGENT_HAS_CAPABILITY(capabilities->caps, caps_size, VD_AGENT_CAP_GRAPHICS_DEVICE_INFO);
+ reds_send_device_display_info(reds);
+}
+
+/* reads from the device till completes reading a message that is addressed to the client,
+ * or otherwise, when reading from the device fails */
+RedPipeItemPtr
+RedCharDeviceVDIPort::read_one_msg_from_device()
+{
+ RedsState *reds;
+ int n;
+
+ reds = get_server();
+ while (reds->vdagent) {
+ switch (priv->read_state) {
+ case VDI_PORT_READ_STATE_READ_HEADER:
+ n = read(priv->receive_pos, priv->receive_len);
+ if (!n) {
+ return RedPipeItemPtr();
+ }
+ if ((priv->receive_len -= n)) {
+ priv->receive_pos += n;
+ return RedPipeItemPtr();
+ }
+ priv->message_receive_len = priv->vdi_chunk_header.size;
+ priv->read_state = VDI_PORT_READ_STATE_GET_BUFF;
+ /* fall through */
+ case VDI_PORT_READ_STATE_GET_BUFF: {
+ if (!(priv->current_read_buf = vdi_port_get_read_buf(this))) {
+ return RedPipeItemPtr();
+ }
+ priv->receive_pos = priv->current_read_buf->data;
+ priv->receive_len = MIN(priv->message_receive_len,
+ sizeof(priv->current_read_buf->data));
+ priv->current_read_buf->len = priv->receive_len;
+ priv->message_receive_len -= priv->receive_len;
+ priv->read_state = VDI_PORT_READ_STATE_READ_DATA;
+ }
+ /* fall through */
+ case VDI_PORT_READ_STATE_READ_DATA: {
+ n = read(priv->receive_pos, priv->receive_len);
+ if (!n) {
+ return RedPipeItemPtr();
+ }
+ if ((priv->receive_len -= n)) {
+ priv->receive_pos += n;
+ break;
+ }
+ auto dispatch_buf = std::move(priv->current_read_buf);
+ priv->receive_pos = nullptr;
+ if (priv->message_receive_len == 0) {
+ priv->read_state = VDI_PORT_READ_STATE_READ_HEADER;
+ priv->receive_pos = reinterpret_cast<uint8_t *>(&priv->vdi_chunk_header);
+ priv->receive_len = sizeof(priv->vdi_chunk_header);
+ } else {
+ priv->read_state = VDI_PORT_READ_STATE_GET_BUFF;
+ }
+ switch (vdi_port_read_buf_process(this, *dispatch_buf)) {
+ case AGENT_MSG_FILTER_OK:
+ reds_adjust_agent_capabilities(
+ reds, reinterpret_cast<VDAgentMessage *>(dispatch_buf->data));
+ return dispatch_buf;
+ case AGENT_MSG_FILTER_PROTO_ERROR:
+ reds_agent_remove(reds);
+ /* fall through */
+ case AGENT_MSG_FILTER_MONITORS_CONFIG:
+ /* fall through */
+ case AGENT_MSG_FILTER_DISCARD:
+ dispatch_buf.reset();
+ }
+ }
+ } /* END switch */
+ } /* END while */
+ return RedPipeItemPtr();
+}
+
+void reds_marshall_device_display_info(RedsState *reds, SpiceMarshaller *m)
+{
+ uint32_t device_count = 0;
+ void *device_count_ptr = spice_marshaller_add_uint32(m, device_count);
+
+ // add the qxl devices to the message
+ for (const auto &qxl : reds->qxl_instances) {
+ device_count += red_qxl_marshall_device_display_info(qxl, m);
+ }
+
+ // add the stream devices to the message
+ for (const auto& dev: reds->char_devices) {
+ auto stream_dev = dynamic_cast<StreamDevice*>(dev.get());
+ if (stream_dev) {
+ const StreamDeviceDisplayInfo *info = stream_dev->get_device_display_info();
+ size_t device_address_len = strlen(info->device_address) + 1;
+
+ if (device_address_len == 1) {
+ // the device info wasn't set (yet), don't send it
+ continue;
+ }
+
+ int32_t channel_id = stream_dev->get_stream_channel_id();
+ if (channel_id == -1) {
+ g_warning("DeviceDisplayInfo set but no stream channel exists");
+ continue;
+ }
+
+ spice_marshaller_add_uint32(m, channel_id);
+ spice_marshaller_add_uint32(m, info->stream_id);
+ spice_marshaller_add_uint32(m, info->device_display_id);
+ spice_marshaller_add_uint32(m, device_address_len);
+ spice_marshaller_add(m, reinterpret_cast<const uint8_t *>(info->device_address),
+ device_address_len);
+ ++device_count;
+
+ g_debug(" (stream) channel_id: %u monitor_id: %u, device_address: %s, "
+ "device_display_id: %u",
+ channel_id, info->stream_id, info->device_address,
+ info->device_display_id);
+ }
+ }
+ spice_marshaller_set_uint32(m, device_count_ptr, device_count);
+}
+
+void reds_send_device_display_info(RedsState *reds)
+{
+ if (!reds->agent_dev->priv->agent_attached) {
+ return;
+ }
+ if (!reds->agent_dev->priv->agent_supports_graphics_device_info) {
+ return;
+ }
+
+ g_debug("Sending device display info to the agent:");
+
+ SpiceMarshaller *m = spice_marshaller_new();
+ reds_marshall_device_display_info(reds, m);
+
+ RedCharDeviceWriteBuffer *char_dev_buf = vdagent_new_write_buffer(reds->agent_dev.get(),
+ VD_AGENT_GRAPHICS_DEVICE_INFO,
+ spice_marshaller_get_total_size(m),
+ true);
+
+ if (!char_dev_buf) {
+ spice_marshaller_destroy(m);
+ reds->pending_device_display_info_message = true;
+ return;
+ }
+
+ auto internal_buf = reinterpret_cast<VDInternalBuf *>(char_dev_buf->buf);
+
+ int free_info;
+ size_t len_info;
+ uint8_t *info = spice_marshaller_linearize(m, 0, &len_info, &free_info);
+ memcpy(&internal_buf->u.graphics_device_info, info, len_info);
+ if (free_info) {
+ free(info);
+ }
+ spice_marshaller_destroy(m);
+
+ reds->pending_device_display_info_message = false;
+
+ reds->agent_dev->write_buffer_add(char_dev_buf);
+}
+
+/* after calling this, we unref the message, and the ref is in the instance side */
+void RedCharDeviceVDIPort::send_msg_to_client(RedPipeItem *msg, RedCharDeviceClientOpaque *opaque)
+{
+ auto client = reinterpret_cast<RedClient *>(opaque);
+ auto agent_data_buf = static_cast<RedVDIReadBuf*>(msg);
+
+ client->get_main()->push_agent_data(red::shared_ptr<RedAgentDataPipeItem>(agent_data_buf));
+}
+
+void RedCharDeviceVDIPort::send_tokens_to_client(RedCharDeviceClientOpaque *opaque, uint32_t tokens)
+{
+ auto client = reinterpret_cast<RedClient *>(opaque);
+ client->get_main()->push_agent_tokens(tokens);
+}
+
+void RedCharDeviceVDIPort::on_free_self_token()
+{
+ RedsState *reds = get_server();
+
+ if (reds->inputs_channel && reds->pending_mouse_event) {
+ spice_debug("pending mouse event");
+ reds_handle_agent_mouse_event(reds, reds->inputs_channel->get_mouse_state());
+ }
+
+ if (reds->pending_device_display_info_message) {
+ spice_debug("pending device display info message");
+ reds_send_device_display_info(reds);
+ }
+}
+
+void RedCharDeviceVDIPort::remove_client(RedCharDeviceClientOpaque *opaque)
+{
+ auto client = reinterpret_cast<RedClient *>(opaque);
+ client->get_main()->shutdown();
+}
+
+/****************************************************************************/
+
+int reds_has_vdagent(RedsState *reds)
+{
+ return !!reds->vdagent;
+}
+
+void reds_handle_agent_mouse_event(RedsState *reds, const VDAgentMouseState *mouse_state)
+{
+ if (!reds->inputs_channel || !reds->agent_dev->priv->agent_attached) {
+ return;
+ }
+
+ RedCharDeviceWriteBuffer *char_dev_buf = vdagent_new_write_buffer(reds->agent_dev.get(),
+ VD_AGENT_MOUSE_STATE,
+ sizeof(VDAgentMouseState),
+ true);
+
+ if (!char_dev_buf) {
+ reds->pending_mouse_event = TRUE;
+ return;
+ }
+
+ reds->pending_mouse_event = FALSE;
+
+ auto internal_buf = reinterpret_cast<VDInternalBuf *>(char_dev_buf->buf);
+ internal_buf->u.mouse_state = *mouse_state;
+
+ reds->agent_dev->write_buffer_add(char_dev_buf);
+}
+
+SPICE_GNUC_VISIBLE int spice_server_get_num_clients(SpiceServer *reds)
+{
+ return reds ? reds->clients.size() : 0;
+}
+
+static bool channel_supports_multiple_clients(const RedChannel *channel)
+{
+ switch (channel->type()) {
+ case SPICE_CHANNEL_MAIN:
+ case SPICE_CHANNEL_DISPLAY:
+ case SPICE_CHANNEL_CURSOR:
+ case SPICE_CHANNEL_INPUTS:
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void reds_fill_channels(RedsState *reds, SpiceMsgChannels *channels_info)
+{
+ int used_channels = 0;
+
+ for (const auto &channel: reds->channels) {
+ if (reds->clients.size() > 1 &&
+ !channel_supports_multiple_clients(channel.get())) {
+ continue;
+ }
+ channels_info->channels[used_channels].type = channel->type();
+ channels_info->channels[used_channels].id = channel->id();
+ used_channels++;
+ }
+
+ channels_info->num_of_channels = used_channels;
+ if (used_channels != reds->channels.size()) {
+ spice_warning("sent %d out of %zd", used_channels, reds->channels.size());
+ }
+}
+
+SpiceMsgChannels *reds_msg_channels_new(RedsState *reds)
+{
+ SpiceMsgChannels* channels_info;
+
+ spice_assert(reds != nullptr);
+
+ channels_info = static_cast<SpiceMsgChannels *>(
+ g_malloc(sizeof(SpiceMsgChannels) + reds->channels.size() * sizeof(SpiceChannelId)));
+
+ reds_fill_channels(reds, channels_info);
+
+ return channels_info;
+}
+
+void reds_on_main_agent_start(RedsState *reds, MainChannelClient *mcc, uint32_t num_tokens)
+{
+ RedCharDevice *dev_state = reds->agent_dev.get();
+ RedClient *client;
+
+ if (!reds->vdagent) {
+ return;
+ }
+ spice_assert(reds->vdagent->st && reds->vdagent->st == dev_state);
+ client = mcc->get_client();
+ reds->agent_dev->priv->client_agent_started = true;
+ /*
+ * Note that in older releases, send_tokens were set to ~0 on both client
+ * and server. The server ignored the client given tokens.
+ * Thanks to that, when an old client is connected to a new server,
+ * and vice versa, the sending from the server to the client won't have
+ * flow control, but will have no other problem.
+ */
+ auto client_opaque = reinterpret_cast<RedCharDeviceClientOpaque *>(client);
+ if (!dev_state->client_exists(client_opaque)) {
+ int client_added;
+
+ client_added = dev_state->client_add(client_opaque, TRUE,
+ REDS_VDI_PORT_NUM_RECEIVE_BUFFS,
+ REDS_AGENT_WINDOW_SIZE,
+ num_tokens,
+ mcc->is_waiting_for_migrate_data());
+
+ if (!client_added) {
+ spice_warning("failed to add client to agent");
+ mcc->shutdown();
+ return;
+ }
+ } else {
+ dev_state->send_to_client_tokens_set(client_opaque, num_tokens);
+ }
+
+ reds_send_device_display_info(reds);
+
+ agent_msg_filter_config(&reds->agent_dev->priv->write_filter, reds->config->agent_copypaste,
+ reds->config->agent_file_xfer,
+ reds_use_client_monitors_config(reds));
+ reds->agent_dev->priv->write_filter.discard_all = FALSE;
+}
+
+void reds_on_main_agent_tokens(RedsState *reds, MainChannelClient *mcc, uint32_t num_tokens)
+{
+ RedClient *client = mcc->get_client();
+ if (!reds->vdagent) {
+ return;
+ }
+ spice_assert(reds->vdagent->st);
+ reds->vdagent->st->send_to_client_tokens_add(
+ reinterpret_cast<RedCharDeviceClientOpaque *>(client), num_tokens);
+}
+
+uint8_t *reds_get_agent_data_buffer(RedsState *reds, MainChannelClient *mcc, size_t size)
+{
+ RedCharDeviceVDIPort *dev = reds->agent_dev.get();
+ RedClient *client;
+
+ if (!dev->priv->client_agent_started) {
+ /*
+ * agent got disconnected, and possibly got reconnected, but we still can receive
+ * msgs that are addressed to the agent's old instance, in case they were
+ * sent by the client before it received the AGENT_DISCONNECTED msg.
+ * In such case, we will receive and discard the msgs (reds_reset_vdp takes care
+ * of setting dev->write_filter.result = AGENT_MSG_FILTER_DISCARD).
+ */
+ return static_cast<uint8_t *>(g_malloc(size));
+ }
+
+ spice_assert(dev->priv->recv_from_client_buf == nullptr);
+ client = mcc->get_client();
+ dev->priv->recv_from_client_buf = dev->write_buffer_get_client(
+ reinterpret_cast<RedCharDeviceClientOpaque *>(client), size + sizeof(VDIChunkHeader));
+ /* check if buffer was allocated, as flow control is enabled for
+ * this device this is a normal condition */
+ if (!dev->priv->recv_from_client_buf) {
+ return nullptr;
+ }
+ dev->priv->recv_from_client_buf_pushed = FALSE;
+ return dev->priv->recv_from_client_buf->buf + sizeof(VDIChunkHeader);
+}
+
+void reds_release_agent_data_buffer(RedsState *reds, uint8_t *buf)
+{
+ RedCharDeviceVDIPort *dev = reds->agent_dev.get();
+
+ if (!dev->priv->recv_from_client_buf) {
+ g_free(buf);
+ return;
+ }
+
+ spice_assert(buf == dev->priv->recv_from_client_buf->buf + sizeof(VDIChunkHeader));
+ /* if we pushed the buffer the buffer is attached to the channel so don't free it */
+ if (!dev->priv->recv_from_client_buf_pushed) {
+ RedCharDevice::write_buffer_release(dev,
+ &dev->priv->recv_from_client_buf);
+ }
+ dev->priv->recv_from_client_buf = nullptr;
+ dev->priv->recv_from_client_buf_pushed = FALSE;
+}
+
+static void reds_on_main_agent_monitors_config(RedsState *reds,
+ MainChannelClient *mcc, const void *message, size_t size)
+{
+ const unsigned int MAX_NUM_MONITORS = 256;
+ const unsigned int MAX_MONITOR_CONFIG_SIZE =
+ sizeof(VDAgentMonitorsConfig) +
+ MAX_NUM_MONITORS * (sizeof(VDAgentMonConfig) + sizeof(VDAgentMonitorMM));
+
+ VDAgentMessage *msg_header;
+ VDAgentMonitorsConfig *monitors_config;
+ SpiceBuffer *cmc = &reds->client_monitors_config;
+ uint32_t msg_size;
+
+ // limit size of message sent by the client as this can cause a DoS through
+ // memory exhaustion, or potentially some integer overflows
+ if (sizeof(VDAgentMessage) + MAX_MONITOR_CONFIG_SIZE - cmc->offset < size) {
+ goto overflow;
+ }
+ spice_buffer_append(cmc, message, size);
+ if (sizeof(VDAgentMessage) > cmc->offset) {
+ spice_debug("not enough data yet. %" G_GSSIZE_FORMAT, cmc->offset);
+ return;
+ }
+ msg_header = reinterpret_cast<VDAgentMessage *>(cmc->buffer);
+ msg_size = GUINT32_FROM_LE(msg_header->size);
+ if (msg_size > MAX_MONITOR_CONFIG_SIZE) {
+ goto overflow;
+ }
+ if (msg_size > cmc->offset - sizeof(VDAgentMessage)) {
+ spice_debug("not enough data yet. %" G_GSSIZE_FORMAT, cmc->offset);
+ return;
+ }
+
+ // convert VDAgentMessage endianness
+ msg_header->protocol = GUINT32_FROM_LE(msg_header->protocol);
+ msg_header->type = GUINT32_FROM_LE(msg_header->type);
+ msg_header->opaque = GUINT64_FROM_LE(msg_header->opaque);
+ msg_header->size = GUINT32_FROM_LE(msg_header->size);
+
+ monitors_config = reinterpret_cast<VDAgentMonitorsConfig *>(cmc->buffer + sizeof(*msg_header));
+ if (agent_check_message(msg_header, reinterpret_cast<uint8_t *>(monitors_config), nullptr, 0) !=
+ AGENT_CHECK_NO_ERROR) {
+ goto overflow;
+ }
+ spice_debug("monitors_config->num_of_monitors: %d", monitors_config->num_of_monitors);
+ reds_client_monitors_config(reds, monitors_config);
+ spice_buffer_free(cmc);
+ return;
+
+overflow:
+ spice_warning("received invalid MonitorsConfig request from client, disconnecting");
+ mcc->disconnect();
+ spice_buffer_free(cmc);
+}
+
+void reds_on_main_agent_data(RedsState *reds, MainChannelClient *mcc, const void *message,
+ size_t size)
+{
+ RedCharDeviceVDIPort *dev = reds->agent_dev.get();
+ VDIChunkHeader *header;
+ AgentMsgFilterResult res;
+
+ res = agent_msg_filter_process_data(&dev->priv->write_filter,
+ static_cast<const uint8_t *>(message), size);
+ switch (res) {
+ case AGENT_MSG_FILTER_OK:
+ break;
+ case AGENT_MSG_FILTER_DISCARD:
+ return;
+ case AGENT_MSG_FILTER_MONITORS_CONFIG:
+ reds_on_main_agent_monitors_config(reds, mcc, message, size);
+ return;
+ case AGENT_MSG_FILTER_PROTO_ERROR:
+ mcc->shutdown();
+ return;
+ }
+
+ spice_assert(dev->priv->recv_from_client_buf);
+ spice_assert(message == dev->priv->recv_from_client_buf->buf + sizeof(VDIChunkHeader));
+ // TODO - start tracking agent data per channel
+ header = reinterpret_cast<VDIChunkHeader *>(dev->priv->recv_from_client_buf->buf);
+ header->port = VDP_CLIENT_PORT;
+ header->size = size;
+ dev->priv->recv_from_client_buf->buf_used = sizeof(VDIChunkHeader) + size;
+
+ dev->priv->recv_from_client_buf_pushed = TRUE;
+ dev->write_buffer_add(dev->priv->recv_from_client_buf);
+}
+
+void reds_on_main_migrate_connected(RedsState *reds, int seamless)
+{
+ reds->src_do_seamless_migrate = seamless;
+ if (reds->mig_wait_connect) {
+ reds_mig_cleanup(reds);
+ }
+}
+
+void reds_on_main_mouse_mode_request(RedsState *reds, void *message, size_t size)
+{
+ switch ((static_cast<SpiceMsgcMainMouseModeRequest *>(message))->mode) {
+ case SPICE_MOUSE_MODE_CLIENT:
+ if (reds->is_client_mouse_allowed) {
+ reds_set_mouse_mode(reds, SPICE_MOUSE_MODE_CLIENT);
+ } else {
+ spice_debug("client mouse is disabled");
+ }
+ break;
+ case SPICE_MOUSE_MODE_SERVER:
+ reds_set_mouse_mode(reds, SPICE_MOUSE_MODE_SERVER);
+ break;
+ default:
+ spice_warning("unsupported mouse mode");
+ }
+}
+
+/*
+ * Push partial agent data, even if not all the chunk was consumend,
+ * in order to avoid the roundtrip (src-server->client->dest-server)
+ */
+void reds_on_main_channel_migrate(RedsState *reds, MainChannelClient *mcc)
+{
+ RedCharDeviceVDIPort *agent_dev = reds->agent_dev.get();
+ uint32_t read_data_len;
+
+ spice_assert(reds->clients.size() == 1);
+
+ if (agent_dev->priv->read_state != VDI_PORT_READ_STATE_READ_DATA) {
+ return;
+ }
+ spice_assert(agent_dev->priv->current_read_buf &&
+ agent_dev->priv->receive_pos > agent_dev->priv->current_read_buf->data);
+ read_data_len = agent_dev->priv->receive_pos - agent_dev->priv->current_read_buf->data;
+
+ if (agent_dev->priv->read_filter.msg_data_to_read ||
+ read_data_len > sizeof(VDAgentMessage)) { /* msg header has been read */
+ red::shared_ptr<RedVDIReadBuf> read_buf = std::move(agent_dev->priv->current_read_buf);
+
+ spice_debug("push partial read %u (msg first chunk? %d)", read_data_len,
+ !agent_dev->priv->read_filter.msg_data_to_read);
+
+ read_buf->len = read_data_len;
+ switch (vdi_port_read_buf_process(agent_dev, *read_buf)) {
+ case AGENT_MSG_FILTER_OK:
+ reds_adjust_agent_capabilities(reds,
+ reinterpret_cast<VDAgentMessage *>(read_buf->data));
+ mcc->push_agent_data(read_buf);
+ break;
+ case AGENT_MSG_FILTER_PROTO_ERROR:
+ reds_agent_remove(reds);
+ /* fall through */
+ case AGENT_MSG_FILTER_MONITORS_CONFIG:
+ /* fall through */
+ case AGENT_MSG_FILTER_DISCARD:
+ read_buf.reset();
+ }
+
+ spice_assert(agent_dev->priv->receive_len);
+ agent_dev->priv->message_receive_len += agent_dev->priv->receive_len;
+ agent_dev->priv->read_state = VDI_PORT_READ_STATE_GET_BUFF;
+ agent_dev->priv->receive_pos = nullptr;
+ }
+}
+
+void reds_marshall_migrate_data(RedsState *reds, SpiceMarshaller *m)
+{
+ SpiceMigrateDataMain mig_data;
+ RedCharDeviceVDIPort *agent_dev = reds->agent_dev.get();
+ SpiceMarshaller *m2;
+
+ memset(&mig_data, 0, sizeof(mig_data));
+ spice_marshaller_add_uint32(m, SPICE_MIGRATE_DATA_MAIN_MAGIC);
+ spice_marshaller_add_uint32(m, SPICE_MIGRATE_DATA_MAIN_VERSION);
+
+ if (!reds->vdagent) {
+ uint8_t *null_agent_mig_data;
+
+ /* MSG_AGENT_CONNECTED_TOKENS is supported by the client
+ (see spice_server_migrate_connect), so agent_attached
+ is set to FALSE when the agent is disconnected and
+ there is no need to track the client tokens
+ (see reds_reset_vdp) */
+ spice_assert(!agent_dev->priv->agent_attached);
+ RedCharDevice::migrate_data_marshall_empty(m);
+ size_t padding_len = sizeof(SpiceMigrateDataMain) - sizeof(SpiceMigrateDataCharDevice);
+ null_agent_mig_data = spice_marshaller_reserve_space(m, padding_len);
+ memset(null_agent_mig_data, 0, padding_len);
+ return;
+ }
+
+ agent_dev->migrate_data_marshall(m);
+ spice_marshaller_add_uint8(m, agent_dev->priv->client_agent_started);
+
+ mig_data.agent2client.chunk_header = agent_dev->priv->vdi_chunk_header;
+
+ /* agent to client partial msg */
+ if (agent_dev->priv->read_state == VDI_PORT_READ_STATE_READ_HEADER) {
+ mig_data.agent2client.chunk_header_size =
+ agent_dev->priv->receive_pos -
+ reinterpret_cast<uint8_t *>(&agent_dev->priv->vdi_chunk_header);
+
+ mig_data.agent2client.msg_header_done = FALSE;
+ mig_data.agent2client.msg_header_partial_len = 0;
+ spice_assert(!agent_dev->priv->read_filter.msg_data_to_read);
+ } else {
+ mig_data.agent2client.chunk_header_size = sizeof(VDIChunkHeader);
+ mig_data.agent2client.chunk_header.size = agent_dev->priv->message_receive_len;
+ if (agent_dev->priv->read_state == VDI_PORT_READ_STATE_READ_DATA) {
+ /* in the middle of reading the message header (see reds_on_main_channel_migrate) */
+ mig_data.agent2client.msg_header_done = FALSE;
+ mig_data.agent2client.msg_header_partial_len =
+ agent_dev->priv->receive_pos - agent_dev->priv->current_read_buf->data;
+ spice_assert(mig_data.agent2client.msg_header_partial_len < sizeof(VDAgentMessage));
+ spice_assert(!agent_dev->priv->read_filter.msg_data_to_read);
+ } else {
+ mig_data.agent2client.msg_header_done = TRUE;
+ mig_data.agent2client.msg_remaining = agent_dev->priv->read_filter.msg_data_to_read;
+ mig_data.agent2client.msg_filter_result = agent_dev->priv->read_filter.result;
+ }
+ }
+ spice_marshaller_add_uint32(m, mig_data.agent2client.chunk_header_size);
+ spice_marshaller_add(m, reinterpret_cast<uint8_t *>(&mig_data.agent2client.chunk_header),
+ sizeof(VDIChunkHeader));
+ spice_marshaller_add_uint8(m, mig_data.agent2client.msg_header_done);
+ spice_marshaller_add_uint32(m, mig_data.agent2client.msg_header_partial_len);
+ m2 = spice_marshaller_get_ptr_submarshaller(m);
+ spice_marshaller_add(m2, agent_dev->priv->current_read_buf->data,
+ mig_data.agent2client.msg_header_partial_len);
+ spice_marshaller_add_uint32(m, mig_data.agent2client.msg_remaining);
+ spice_marshaller_add_uint8(m, mig_data.agent2client.msg_filter_result);
+
+ mig_data.client2agent.msg_remaining = agent_dev->priv->write_filter.msg_data_to_read;
+ mig_data.client2agent.msg_filter_result = agent_dev->priv->write_filter.result;
+ spice_marshaller_add_uint32(m, mig_data.client2agent.msg_remaining);
+ spice_marshaller_add_uint8(m, mig_data.client2agent.msg_filter_result);
+ spice_debug("from agent filter: discard all %d, wait_msg %u, msg_filter_result %d",
+ agent_dev->priv->read_filter.discard_all,
+ agent_dev->priv->read_filter.msg_data_to_read,
+ agent_dev->priv->read_filter.result);
+ spice_debug("to agent filter: discard all %d, wait_msg %u, msg_filter_result %d",
+ agent_dev->priv->write_filter.discard_all,
+ agent_dev->priv->write_filter.msg_data_to_read,
+ agent_dev->priv->write_filter.result);
+}
+
+static int reds_agent_state_restore(RedsState *reds, SpiceMigrateDataMain *mig_data)
+{
+ RedCharDeviceVDIPort *agent_dev = reds->agent_dev.get();
+ uint32_t chunk_header_remaining;
+
+ agent_dev->priv->vdi_chunk_header = mig_data->agent2client.chunk_header;
+ spice_assert(mig_data->agent2client.chunk_header_size <= sizeof(VDIChunkHeader));
+ chunk_header_remaining = sizeof(VDIChunkHeader) - mig_data->agent2client.chunk_header_size;
+ if (chunk_header_remaining) {
+ agent_dev->priv->read_state = VDI_PORT_READ_STATE_READ_HEADER;
+ agent_dev->priv->receive_pos =
+ reinterpret_cast<uint8_t *>(&agent_dev->priv->vdi_chunk_header) +
+ mig_data->agent2client.chunk_header_size;
+ agent_dev->priv->receive_len = chunk_header_remaining;
+ } else {
+ agent_dev->priv->message_receive_len = agent_dev->priv->vdi_chunk_header.size;
+ }
+
+ if (!mig_data->agent2client.msg_header_done) {
+ uint8_t *partial_msg_header;
+
+ if (!chunk_header_remaining) {
+ uint32_t cur_buf_size;
+
+ agent_dev->priv->read_state = VDI_PORT_READ_STATE_READ_DATA;
+ agent_dev->priv->current_read_buf = vdi_port_get_read_buf(agent_dev);
+ spice_assert(agent_dev->priv->current_read_buf);
+ partial_msg_header = reinterpret_cast<uint8_t *>(mig_data) +
+ mig_data->agent2client.msg_header_ptr -
+ sizeof(SpiceMiniDataHeader);
+ memcpy(agent_dev->priv->current_read_buf->data,
+ partial_msg_header,
+ mig_data->agent2client.msg_header_partial_len);
+ agent_dev->priv->receive_pos = agent_dev->priv->current_read_buf->data +
+ mig_data->agent2client.msg_header_partial_len;
+ cur_buf_size = sizeof(agent_dev->priv->current_read_buf->data) -
+ mig_data->agent2client.msg_header_partial_len;
+ agent_dev->priv->receive_len = MIN(agent_dev->priv->message_receive_len, cur_buf_size);
+ agent_dev->priv->current_read_buf->len = agent_dev->priv->receive_len +
+ mig_data->agent2client.msg_header_partial_len;
+ agent_dev->priv->message_receive_len -= agent_dev->priv->receive_len;
+ } else {
+ spice_assert(mig_data->agent2client.msg_header_partial_len == 0);
+ }
+ } else {
+ agent_dev->priv->read_state = VDI_PORT_READ_STATE_GET_BUFF;
+ agent_dev->priv->current_read_buf.reset();
+ agent_dev->priv->receive_pos = nullptr;
+ agent_dev->priv->read_filter.msg_data_to_read = mig_data->agent2client.msg_remaining;
+ agent_dev->priv->read_filter.result =
+ static_cast<AgentMsgFilterResult>(mig_data->agent2client.msg_filter_result);
+ }
+
+ agent_dev->priv->read_filter.discard_all = FALSE;
+ agent_dev->priv->write_filter.discard_all = !mig_data->client_agent_started;
+ agent_dev->priv->client_agent_started = mig_data->client_agent_started;
+
+ agent_dev->priv->write_filter.msg_data_to_read = mig_data->client2agent.msg_remaining;
+ agent_dev->priv->write_filter.result =
+ static_cast<AgentMsgFilterResult>(mig_data->client2agent.msg_filter_result);
+
+ spice_debug("to agent filter: discard all %d, wait_msg %u, msg_filter_result %d",
+ agent_dev->priv->write_filter.discard_all,
+ agent_dev->priv->write_filter.msg_data_to_read,
+ agent_dev->priv->write_filter.result);
+ spice_debug("from agent filter: discard all %d, wait_msg %u, msg_filter_result %d",
+ agent_dev->priv->read_filter.discard_all,
+ agent_dev->priv->read_filter.msg_data_to_read,
+ agent_dev->priv->read_filter.result);
+ return agent_dev->restore(&mig_data->agent_base);
+}
+
+/*
+ * The agent device is not attached to the dest before migration is completed. It is
+ * attached only after the vm is started. It might be attached before or after
+ * the migration data has reached the server.
+ */
+bool reds_handle_migrate_data(RedsState *reds, MainChannelClient *mcc,
+ SpiceMigrateDataMain *mig_data, uint32_t size)
+{
+ RedCharDeviceVDIPort *agent_dev = reds->agent_dev.get();
+
+ spice_debug("main-channel: got migrate data");
+ /*
+ * Now that the client has switched to the target server, if main_channel
+ * controls the mm-time, we update the client's mm-time.
+ * (MSG_MAIN_INIT is not sent for a migrating connection)
+ */
+ if (reds->mm_time_enabled) {
+ reds_send_mm_time(reds);
+ }
+ if (mig_data->agent_base.connected) {
+ if (agent_dev->priv->agent_attached) { // agent was attached before migration data has arrived
+ if (!reds->vdagent) {
+ spice_assert(agent_dev->priv->plug_generation > 0);
+ reds->main_channel->push_agent_disconnected();
+ spice_debug("agent is no longer connected");
+ } else {
+ if (agent_dev->priv->plug_generation > 1) {
+ /* red_char_device_state_reset takes care of not making the device wait for migration data */
+ spice_debug("agent has been detached and reattached before receiving migration data");
+ reds->main_channel->push_agent_disconnected();
+ reds->main_channel->push_agent_connected();
+ } else {
+ spice_debug("restoring state from mig_data");
+ return reds_agent_state_restore(reds, mig_data);
+ }
+ }
+ } else {
+ /* restore agent state when the agent gets attached */
+ spice_debug("saving mig_data");
+ spice_assert(agent_dev->priv->plug_generation == 0);
+ agent_dev->priv->mig_data =
+ static_cast<SpiceMigrateDataMain *>(g_memdup2(mig_data, size));
+ }
+ } else {
+ spice_debug("agent was not attached on the source host");
+ if (reds->vdagent) {
+ auto client_opaque = reinterpret_cast<RedCharDeviceClientOpaque *>(mcc->get_client());
+ /* red_char_device_client_remove disables waiting for migration data */
+ agent_dev->client_remove(client_opaque);
+ reds->main_channel->push_agent_connected();
+ }
+ }
+
+ return TRUE;
+}
+
+static void reds_channel_init_auth_caps(RedLinkInfo *link, RedChannel *channel)
+{
+ RedsState *reds = link->reds;
+ if (reds->config->sasl_enabled && !link->skip_auth) {
+ channel->set_common_cap(SPICE_COMMON_CAP_AUTH_SASL);
+ } else {
+ channel->set_common_cap(SPICE_COMMON_CAP_AUTH_SPICE);
+ }
+}
+
+
+static const uint32_t *red_link_info_get_caps(const RedLinkInfo *link)
+{
+ const auto caps_start = reinterpret_cast<const uint8_t *>(link->link_mess);
+
+ return reinterpret_cast<const uint32_t *>(caps_start + link->link_mess->caps_offset);
+}
+
+static bool red_link_info_test_capability(const RedLinkInfo *link, uint32_t cap)
+{
+ const uint32_t *caps = red_link_info_get_caps(link);
+
+ return test_capability(caps, link->link_mess->num_common_caps, cap);
+}
+
+// Check for EVP_RSA_gen. EVP_RSA_gen was always defined as a macro in <openssl/rsa.h>
+// and it's still so in OpenSSL 3.0 so checking for macro existence is a good way.
+#if OPENSSL_VERSION_NUMBER < 0x30000000L && !defined(EVP_RSA_gen)
+static EVP_PKEY *EVP_RSA_gen(unsigned int bits, BIGNUM *rsa_exponent)
+{
+ RSA *rsa = RSA_new();
+ if (!rsa) {
+ return nullptr;
+ }
+
+ if (RSA_generate_key_ex(rsa, SPICE_TICKET_KEY_PAIR_LENGTH,
+ rsa_exponent, nullptr) != 1) {
+ RSA_free(rsa);
+ return nullptr;
+ }
+
+ EVP_PKEY *pk = EVP_PKEY_new();
+ if (!pk) {
+ RSA_free(rsa);
+ return nullptr;
+ }
+
+ if (!EVP_PKEY_set1_RSA(pk, rsa)) {
+ EVP_PKEY_free(pk);
+ RSA_free(rsa);
+ return nullptr;
+ }
+
+ RSA_free(rsa);
+ return pk;
+}
+
+#define EVP_RSA_gen(bits) EVP_RSA_gen(bits, (link->tiTicketing.bn))
+#endif
+
+static bool reds_send_link_ack(RedsState *reds, RedLinkInfo *link)
+{
+ struct {
+ SpiceLinkHeader header;
+ SpiceLinkReply ack;
+ } msg;
+ RedChannel *channel;
+ const RedChannelCapabilities *channel_caps;
+ BUF_MEM *bmBuf;
+ BIO *bio = nullptr;
+ int ret = FALSE;
+ size_t hdr_size;
+
+ SPICE_VERIFY(sizeof(msg) == sizeof(SpiceLinkHeader) + sizeof(SpiceLinkReply));
+
+ msg.header.magic = SPICE_MAGIC;
+ hdr_size = sizeof(msg.ack);
+ msg.header.major_version = GUINT32_TO_LE(SPICE_VERSION_MAJOR);
+ msg.header.minor_version = GUINT32_TO_LE(SPICE_VERSION_MINOR);
+
+ msg.ack.error = GUINT32_TO_LE(SPICE_LINK_ERR_OK);
+
+ channel = reds_find_channel(reds, link->link_mess->channel_type,
+ link->link_mess->channel_id);
+ if (!channel) {
+ if (link->link_mess->channel_type != SPICE_CHANNEL_MAIN) {
+ spice_warning("Received wrong header: channel_type != SPICE_CHANNEL_MAIN");
+ return FALSE;
+ }
+ spice_assert(reds->main_channel);
+ channel = reds->main_channel.get();
+ }
+
+ reds_channel_init_auth_caps(link, channel); /* make sure common caps are set */
+
+ channel_caps = channel->get_local_capabilities();
+ msg.ack.num_common_caps = GUINT32_TO_LE(channel_caps->num_common_caps);
+ msg.ack.num_channel_caps = GUINT32_TO_LE(channel_caps->num_caps);
+ hdr_size += channel_caps->num_common_caps * sizeof(uint32_t);
+ hdr_size += channel_caps->num_caps * sizeof(uint32_t);
+ msg.header.size = GUINT32_TO_LE(hdr_size);
+ msg.ack.caps_offset = GUINT32_TO_LE(sizeof(SpiceLinkReply));
+ if (!reds->config->sasl_enabled
+ || !red_link_info_test_capability(link, SPICE_COMMON_CAP_AUTH_SASL)) {
+ if (!(bio = BIO_new(BIO_s_mem()))) {
+ spice_warning("BIO new failed");
+ red_dump_openssl_errors();
+ return FALSE;
+ }
+
+ link->tiTicketing.rsa = EVP_RSA_gen(SPICE_TICKET_KEY_PAIR_LENGTH);
+ if (!link->tiTicketing.rsa) {
+ spice_warning("Failed to generate %d bits RSA key",
+ SPICE_TICKET_KEY_PAIR_LENGTH);
+ red_dump_openssl_errors();
+ goto end;
+ }
+ link->tiTicketing.rsa_size = SPICE_TICKET_KEY_PAIR_LENGTH / 8;
+ if (i2d_PUBKEY_bio(bio, link->tiTicketing.rsa) <= 0) {
+ spice_warning("Failed to get public key");
+ red_dump_openssl_errors();
+ goto end;
+ }
+ BIO_get_mem_ptr(bio, &bmBuf);
+ memcpy(msg.ack.pub_key, bmBuf->data, sizeof(msg.ack.pub_key));
+ } else {
+ /* if the client sets the AUTH_SASL cap, it indicates that it
+ * supports SASL, and will use it if the server supports SASL as
+ * well. Moreover, a client setting the AUTH_SASL cap also
+ * indicates that it will not try using the RSA-related content
+ * in the SpiceLinkReply message, so we don't need to initialize
+ * it. Reason to avoid this is to fix auth in fips mode where
+ * the generation of a 1024 bit RSA key as we are trying to do
+ * will fail.
+ */
+ spice_warning("not initialising RSA key");
+ memset(msg.ack.pub_key, '\0', sizeof(msg.ack.pub_key));
+ }
+
+ if (!red_stream_write_all(link->stream, &msg, sizeof(msg)))
+ goto end;
+ for (unsigned int i = 0; i < channel_caps->num_common_caps; i++) {
+ guint32 cap = GUINT32_TO_LE(channel_caps->common_caps[i]);
+ if (!red_stream_write_all(link->stream, &cap, sizeof(cap)))
+ goto end;
+ }
+ for (unsigned int i = 0; i < channel_caps->num_caps; i++) {
+ guint32 cap = GUINT32_TO_LE(channel_caps->caps[i]);
+ if (!red_stream_write_all(link->stream, &cap, sizeof(cap)))
+ goto end;
+ }
+
+ ret = TRUE;
+
+end:
+ if (bio != nullptr)
+ BIO_free(bio);
+ return ret;
+}
+
+static bool reds_send_link_error(RedLinkInfo *link, uint32_t error)
+{
+ struct {
+ SpiceLinkHeader header;
+ SpiceLinkReply reply;
+ } msg;
+ SPICE_VERIFY(sizeof(msg) == sizeof(SpiceLinkHeader) + sizeof(SpiceLinkReply));
+
+ msg.header.magic = SPICE_MAGIC;
+ msg.header.size = GUINT32_TO_LE(sizeof(msg.reply));
+ msg.header.major_version = GUINT32_TO_LE(SPICE_VERSION_MAJOR);
+ msg.header.minor_version = GUINT32_TO_LE(SPICE_VERSION_MINOR);
+ memset(&msg.reply, 0, sizeof(msg.reply));
+ msg.reply.error = GUINT32_TO_LE(error);
+ return red_stream_write_all(link->stream, &msg, sizeof(msg));
+}
+
+static void reds_info_new_channel(RedLinkInfo *link, int connection_id)
+{
+ spice_debug("channel %d:%d, connected successfully, over %s link",
+ link->link_mess->channel_type,
+ link->link_mess->channel_id,
+ red_stream_is_ssl(link->stream) ? "Secure" : "Non Secure");
+ /* add info + send event */
+ red_stream_set_channel(link->stream, connection_id,
+ link->link_mess->channel_type,
+ link->link_mess->channel_id);
+ red_stream_push_channel_event(link->stream, SPICE_CHANNEL_EVENT_INITIALIZED);
+}
+
+static void reds_send_link_result(RedLinkInfo *link, uint32_t error)
+{
+ error = GUINT32_TO_LE(error);
+ red_stream_write_all(link->stream, &error, sizeof(error));
+}
+
+static void reds_mig_target_client_add(RedsState *reds, RedClient *client)
+{
+ RedsMigTargetClient *mig_client;
+
+ g_return_if_fail(reds);
+ spice_debug("trace");
+ mig_client = g_new0(RedsMigTargetClient, 1);
+ mig_client->client = client;
+ reds->mig_target_clients = g_list_append(reds->mig_target_clients, mig_client);
+}
+
+static RedsMigTargetClient* reds_mig_target_client_find(RedsState *reds, RedClient *client)
+{
+ GList *l;
+
+ for (l = reds->mig_target_clients; l != nullptr; l = l->next) {
+ auto mig_client = static_cast<RedsMigTargetClient *>(l->data);
+
+ if (mig_client->client == client) {
+ return mig_client;
+ }
+ }
+ return nullptr;
+}
+
+static void reds_mig_target_client_add_pending_link(RedsMigTargetClient *client,
+ SpiceLinkMess *link_msg,
+ RedStream *stream)
+{
+ RedsMigPendingLink *mig_link;
+
+ spice_assert(client);
+ mig_link = g_new0(RedsMigPendingLink, 1);
+ mig_link->link_msg = link_msg;
+ mig_link->stream = stream;
+
+ client->pending_links = g_list_append(client->pending_links, mig_link);
+}
+
+static void reds_mig_target_client_free(RedsState *reds, RedsMigTargetClient *mig_client)
+{
+ reds->mig_target_clients = g_list_remove(reds->mig_target_clients, mig_client);
+ g_list_free_full(mig_client->pending_links, g_free);
+ g_free(mig_client);
+}
+
+static void reds_mig_target_client_disconnect_all(RedsState *reds)
+{
+ RedsMigTargetClient *mig_client;
+
+ GLIST_FOREACH(reds->mig_target_clients, RedsMigTargetClient, mig_client) {
+ reds_client_disconnect(reds, mig_client->client);
+ }
+}
+
+static bool reds_find_client(RedsState *reds, RedClient *client)
+{
+ return std::find(reds->clients.begin(), reds->clients.end(), client) != reds->clients.end();
+}
+
+/* should be used only when there is one client */
+static RedClient *reds_get_client(RedsState *reds)
+{
+ spice_assert(reds->clients.size() <= 1);
+
+ if (reds->clients.empty()) {
+ return nullptr;
+ }
+
+ return *reds->clients.begin();
+}
+
+/* Performs late initializations steps.
+ * This should be called when a client connects */
+static void reds_late_initialization(RedsState *reds)
+{
+ // do only once
+ if (reds->late_initialization_done) {
+ return;
+ }
+
+ // create stream channels for streaming devices
+ for (const auto& dev: reds->char_devices) {
+ auto stream_dev = dynamic_cast<StreamDevice*>(dev.get());
+ if (stream_dev) {
+ stream_dev->create_channel();
+ }
+ }
+ reds->late_initialization_done = true;
+}
+
+static void
+red_channel_capabilities_init_from_link_message(RedChannelCapabilities *caps,
+ const SpiceLinkMess *link_mess)
+{
+ const uint8_t *raw_caps = reinterpret_cast<const uint8_t *>(link_mess) + link_mess->caps_offset;
+
+ caps->num_common_caps = link_mess->num_common_caps;
+ caps->common_caps = nullptr;
+ if (caps->num_common_caps) {
+ caps->common_caps = static_cast<uint32_t *>(
+ g_memdup2(raw_caps, link_mess->num_common_caps * sizeof(uint32_t)));
+ }
+ caps->num_caps = link_mess->num_channel_caps;
+ caps->caps = nullptr;
+ if (link_mess->num_channel_caps) {
+ caps->caps = static_cast<uint32_t *>(
+ g_memdup2(raw_caps + link_mess->num_common_caps * sizeof(uint32_t),
+ link_mess->num_channel_caps * sizeof(uint32_t)));
+ }
+}
+
+// TODO: now that main is a separate channel this should
+// actually be joined with reds_handle_other_links, become reds_handle_link
+static void reds_handle_main_link(RedsState *reds, RedLinkInfo *link)
+{
+ RedClient *client;
+ RedStream *stream;
+ SpiceLinkMess *link_mess;
+ uint32_t connection_id;
+ MainChannelClient *mcc;
+ int mig_target = FALSE;
+ RedChannelCapabilities caps;
+
+ spice_debug("trace");
+ spice_assert(reds->main_channel);
+
+ reds_late_initialization(reds);
+
+ link_mess = link->link_mess;
+ if (!reds->allow_multiple_clients) {
+ reds_disconnect(reds);
+ }
+
+ if (link_mess->connection_id == 0) {
+ reds_send_link_result(link, SPICE_LINK_ERR_OK);
+ while((connection_id = g_random_int()) == 0);
+ mig_target = FALSE;
+ } else {
+ // TODO: make sure link_mess->connection_id is the same
+ // connection id the migration src had (use vmstate to store the connection id)
+ reds_send_link_result(link, SPICE_LINK_ERR_OK);
+ connection_id = link_mess->connection_id;
+ mig_target = TRUE;
+ }
+
+ reds->mig_inprogress = FALSE;
+ reds->mig_wait_connect = FALSE;
+ reds->mig_wait_disconnect = FALSE;
+
+ reds_info_new_channel(link, connection_id);
+ stream = link->stream;
+ link->stream = nullptr;
+ client = red_client_new(reds, mig_target);
+ reds->clients.push_front(client);
+
+ red_channel_capabilities_init_from_link_message(&caps, link_mess);
+ mcc = main_channel_link(reds->main_channel.get(), client,
+ stream, connection_id, mig_target,
+ &caps);
+ red_channel_capabilities_reset(&caps);
+ spice_debug("NEW Client %p mcc %p connect-id %d", client, mcc, connection_id);
+
+ if (reds->vdagent) {
+ if (mig_target) {
+ spice_warning("unexpected: vdagent attached to destination during migration");
+ }
+ agent_msg_filter_config(&reds->agent_dev->priv->read_filter,
+ reds->config->agent_copypaste,
+ reds->config->agent_file_xfer,
+ reds_use_client_monitors_config(reds));
+ reds->agent_dev->priv->read_filter.discard_all = FALSE;
+ reds->agent_dev->priv->plug_generation++;
+ }
+
+ if (!mig_target) {
+ mcc->push_init(reds->qxl_instances.size(), reds->mouse_mode,
+ reds->is_client_mouse_allowed,
+ reds_get_mm_time() - MM_TIME_DELTA,
+ reds_qxl_ram_size(reds));
+ if (reds->config->spice_name)
+ mcc->push_name(reds->config->spice_name);
+ if (reds->config->spice_uuid_is_set)
+ mcc->push_uuid(reds->config->spice_uuid);
+ } else {
+ reds_mig_target_client_add(reds, client);
+ }
+
+ if (red_stream_get_family(stream) != AF_UNIX) {
+ mcc->start_net_test(!mig_target);
+ }
+}
+
+static void openssl_init(RedLinkInfo *link)
+{
+ unsigned long f4 = RSA_F4;
+ link->tiTicketing.bn = BN_new();
+
+ if (!link->tiTicketing.bn) {
+ red_dump_openssl_errors();
+ spice_error("OpenSSL BIGNUMS alloc failed");
+ }
+
+ BN_set_word(link->tiTicketing.bn, f4);
+}
+
+static void reds_channel_do_link(RedChannel *channel, RedClient *client,
+ SpiceLinkMess *link_msg,
+ RedStream *stream)
+{
+ RedChannelCapabilities caps;
+
+ spice_assert(channel);
+ spice_assert(link_msg);
+ spice_assert(stream);
+
+ red_channel_capabilities_init_from_link_message(&caps, link_msg);
+ channel->connect(client, stream,
+ client->during_migrate_at_target(), &caps);
+ red_channel_capabilities_reset(&caps);
+}
+
+/*
+ * migration target side:
+ * In semi-seamless migration, we activate the channels only
+ * after migration is completed.
+ * In seamless migration, in order to keep the continuousness, and
+ * not lose any data, we activate the target channels before
+ * migration completes, as soon as we receive SPICE_MSGC_MAIN_MIGRATE_DST_DO_SEAMLESS
+ */
+static bool reds_link_mig_target_channels(RedsState *reds, RedClient *client)
+{
+ RedsMigTargetClient *mig_client;
+ GList *item;
+
+ spice_debug("%p", client);
+ mig_client = reds_mig_target_client_find(reds, client);
+ if (!mig_client) {
+ spice_debug("Error: mig target client was not found");
+ return FALSE;
+ }
+
+ /* Each channel should check if we are during migration, and
+ * act accordingly. */
+ for(item = mig_client->pending_links; item != nullptr; item = item->next) {
+ auto mig_link = static_cast<RedsMigPendingLink *>(item->data);
+ RedChannel *channel;
+
+ channel = reds_find_channel(reds, mig_link->link_msg->channel_type,
+ mig_link->link_msg->channel_id);
+ if (!channel) {
+ spice_warning("client %p channel (%d, %d) (type, id) wasn't found",
+ client,
+ mig_link->link_msg->channel_type,
+ mig_link->link_msg->channel_id);
+ continue;
+ }
+ reds_channel_do_link(channel, client, mig_link->link_msg, mig_link->stream);
+ }
+
+ reds_mig_target_client_free(reds, mig_client);
+
+ return TRUE;
+}
+
+int reds_on_migrate_dst_set_seamless(RedsState *reds, MainChannelClient *mcc, uint32_t src_version)
+{
+ /* seamless migration is not supported with multiple clients*/
+ if (reds->allow_multiple_clients || src_version > SPICE_MIGRATION_PROTOCOL_VERSION) {
+ reds->dst_do_seamless_migrate = FALSE;
+ } else {
+ RedClient *client = mcc->get_client();
+
+ client->set_migration_seamless();
+ /* linking all the channels that have been connected before migration handshake */
+ reds->dst_do_seamless_migrate = reds_link_mig_target_channels(reds, client);
+ }
+ return reds->dst_do_seamless_migrate;
+}
+
+void reds_on_client_seamless_migrate_complete(RedsState *reds, RedClient *client)
+{
+ spice_debug("trace");
+ if (!reds_find_client(reds, client)) {
+ spice_debug("client no longer exists");
+ return;
+ }
+ client->get_main()->migrate_dst_complete();
+}
+
+void reds_on_client_semi_seamless_migrate_complete(RedsState *reds, RedClient *client)
+{
+ MainChannelClient *mcc;
+
+ spice_debug("%p", client);
+ mcc = client->get_main();
+
+ // TODO: not doing net test. consider doing it on client_migrate_info
+ mcc->push_init(reds->qxl_instances.size(), reds->mouse_mode,
+ reds->is_client_mouse_allowed,
+ reds_get_mm_time() - MM_TIME_DELTA,
+ reds_qxl_ram_size(reds));
+ reds_link_mig_target_channels(reds, client);
+ mcc->migrate_dst_complete();
+}
+
+static void reds_handle_other_links(RedsState *reds, RedLinkInfo *link)
+{
+ RedChannel *channel;
+ RedClient *client = nullptr;
+ SpiceLinkMess *link_mess;
+ RedsMigTargetClient *mig_client;
+
+ link_mess = link->link_mess;
+ if (reds->main_channel) {
+ client = reds->main_channel->get_client_by_link_id(link_mess->connection_id);
+ }
+
+ // TODO: MC: broke migration (at least for the dont-drop-connection kind).
+ // On migration we should get a connection_id to expect (must be a security measure)
+ // where do we store it? on reds, but should be a list (MC).
+ if (!client) {
+ reds_send_link_result(link, SPICE_LINK_ERR_BAD_CONNECTION_ID);
+ return;
+ }
+
+ // TODO: MC: be less lenient. Tally connections from same connection_id (by same client).
+ if (!(channel = reds_find_channel(reds, link_mess->channel_type,
+ link_mess->channel_id))) {
+ reds_send_link_result(link, SPICE_LINK_ERR_CHANNEL_NOT_AVAILABLE);
+ return;
+ }
+
+ reds_send_link_result(link, SPICE_LINK_ERR_OK);
+ reds_info_new_channel(link, link_mess->connection_id);
+
+ mig_client = reds_mig_target_client_find(reds, client);
+ /*
+ * In semi-seamless migration, we activate the channels only
+ * after migration is completed. Since, the session starts almost from
+ * scratch we don't mind if we skip some messages in between the src session end and
+ * dst session start.
+ * In seamless migration, in order to keep the continuousness of the session, and
+ * in order not to lose any data, we activate the target channels before
+ * migration completes, as soon as we receive SPICE_MSGC_MAIN_MIGRATE_DST_DO_SEAMLESS.
+ * If a channel connects before receiving SPICE_MSGC_MAIN_MIGRATE_DST_DO_SEAMLESS,
+ * reds_on_migrate_dst_set_seamless will take care of activating it */
+ if (client->during_migrate_at_target() && !reds->dst_do_seamless_migrate) {
+ spice_assert(mig_client);
+ reds_mig_target_client_add_pending_link(mig_client, link_mess, link->stream);
+ link->link_mess = nullptr;
+ } else {
+ spice_assert(!mig_client);
+ reds_channel_do_link(channel, client, link_mess, link->stream);
+ }
+ link->stream = nullptr;
+}
+
+static void reds_handle_link(RedLinkInfo *link)
+{
+ RedsState *reds = link->reds;
+
+ red_stream_remove_watch(link->stream);
+ if (link->link_mess->channel_type == SPICE_CHANNEL_MAIN) {
+ reds_handle_main_link(reds, link);
+ } else {
+ reds_handle_other_links(reds, link);
+ }
+ reds_link_free(link);
+}
+
+static void reds_handle_ticket(void *opaque)
+{
+ auto link = static_cast<RedLinkInfo *>(opaque);
+ RedsState *reds = link->reds;
+ char *password;
+ EVP_PKEY_CTX *ctx = nullptr;
+
+ if (link->tiTicketing.rsa_size < SPICE_MAX_PASSWORD_LENGTH) {
+ spice_warning("RSA modulus size is smaller than SPICE_MAX_PASSWORD_LENGTH (%d < %d), "
+ "SPICE ticket sent from client may be truncated",
+ link->tiTicketing.rsa_size, SPICE_MAX_PASSWORD_LENGTH);
+ }
+
+ password = static_cast<char *>(alloca(link->tiTicketing.rsa_size + 1));
+
+ size_t len = 0;
+
+ ctx = EVP_PKEY_CTX_new(link->tiTicketing.rsa, nullptr);
+
+ if (!ctx || EVP_PKEY_decrypt_init(ctx) <= 0) {
+ spice_warning("failed to initialize decrypt");
+ red_dump_openssl_errors();
+ goto error;
+ }
+ if (EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_OAEP_PADDING) <= 0) {
+ spice_warning("failed to set OAEP padding");
+ red_dump_openssl_errors();
+ goto error;
+ }
+
+ len = link->tiTicketing.rsa_size;
+ if (EVP_PKEY_decrypt(ctx, reinterpret_cast<unsigned char *>(password), &len,
+ link->tiTicketing.encrypted_ticket.encrypted_data, link->tiTicketing.rsa_size) <= 0) {
+ spice_warning("failed to decrypt RSA encrypted password");
+ red_dump_openssl_errors();
+ goto error;
+ }
+
+ password[len] = '\0';
+
+ if (reds->config->ticketing_enabled && !link->skip_auth) {
+ time_t ltime;
+ bool expired;
+
+ if (strlen(reds->config->taTicket.password) == 0) {
+ spice_warning("Ticketing is enabled, but no password is set. "
+ "please set a ticket first");
+ goto error;
+ }
+
+ ltime = spice_get_monotonic_time_ns() / NSEC_PER_SEC;
+ expired = (reds->config->taTicket.expiration_time < ltime);
+
+ if (expired) {
+ spice_warning("Ticket has expired");
+ goto error;
+ }
+
+ if (strcmp(password, reds->config->taTicket.password) != 0) {
+ spice_warning("Invalid password");
+ goto error;
+ }
+ }
+
+ EVP_PKEY_CTX_free(ctx);
+ reds_handle_link(link);
+ return;
+
+error:
+ if (ctx != nullptr) {
+ EVP_PKEY_CTX_free(ctx);
+ }
+ reds_send_link_result(link, SPICE_LINK_ERR_PERMISSION_DENIED);
+ reds_link_free(link);
+}
+
+static void reds_get_spice_ticket(RedLinkInfo *link)
+{
+ red_stream_async_read(
+ link->stream,
+ reinterpret_cast<uint8_t *>(&link->tiTicketing.encrypted_ticket.encrypted_data),
+ link->tiTicketing.rsa_size, reds_handle_ticket, link);
+}
+
+#if HAVE_SASL
+static void reds_handle_sasl_result(void *opaque, RedSaslError status)
+{
+ RedLinkInfo *link = (RedLinkInfo *)opaque;
+
+ switch (status) {
+ case RED_SASL_ERROR_OK:
+ reds_handle_link(link);
+ break;
+ case RED_SASL_ERROR_INVALID_DATA:
+ reds_send_link_error(link, SPICE_LINK_ERR_INVALID_DATA);
+ reds_link_free(link);
+ break;
+ default:
+ // in these cases error was reported using SASL protocol
+ // (RED_SASL_ERROR_AUTH_FAILED) or we just need to close the
+ // connection
+ reds_link_free(link);
+ break;
+ }
+}
+
+static void reds_start_auth_sasl(RedLinkInfo *link)
+{
+ if (!red_sasl_start_auth(link->stream, reds_handle_sasl_result, link)) {
+ reds_link_free(link);
+ }
+}
+#endif
+
+static void reds_handle_auth_mechanism(void *opaque)
+{
+ auto link = static_cast<RedLinkInfo *>(opaque);
+ RedsState *reds = link->reds;
+
+ spice_debug("Auth method: %d", link->auth_mechanism.auth_mechanism);
+
+ link->auth_mechanism.auth_mechanism = GUINT32_FROM_LE(link->auth_mechanism.auth_mechanism);
+ if (link->auth_mechanism.auth_mechanism == SPICE_COMMON_CAP_AUTH_SPICE
+ && !reds->config->sasl_enabled
+ ) {
+ reds_get_spice_ticket(link);
+#if HAVE_SASL
+ } else if (link->auth_mechanism.auth_mechanism == SPICE_COMMON_CAP_AUTH_SASL) {
+ spice_debug("Starting SASL");
+ reds_start_auth_sasl(link);
+#endif
+ } else {
+ spice_warning("Unknown auth method, disconnecting");
+ if (reds->config->sasl_enabled) {
+ spice_warning("Your client doesn't handle SASL?");
+ }
+ reds_send_link_error(link, SPICE_LINK_ERR_INVALID_DATA);
+ reds_link_free(link);
+ }
+}
+
+static int reds_security_check(RedLinkInfo *link)
+{
+ RedsState *reds = link->reds;
+ ChannelSecurityOptions *security_option = reds_find_channel_security(reds, link->link_mess->channel_type);
+ uint32_t security = security_option ? security_option->options : reds->config->default_channel_security;
+ return (red_stream_is_ssl(link->stream) && (security & SPICE_CHANNEL_SECURITY_SSL)) ||
+ (!red_stream_is_ssl(link->stream) && (security & SPICE_CHANNEL_SECURITY_NONE));
+}
+
+static void reds_handle_read_link_done(void *opaque)
+{
+ auto link = static_cast<RedLinkInfo *>(opaque);
+ RedsState *reds = link->reds;
+ SpiceLinkMess *link_mess = link->link_mess;
+ uint32_t num_caps;
+ uint32_t *caps;
+ int auth_selection;
+ unsigned int i;
+
+ link_mess->caps_offset = GUINT32_FROM_LE(link_mess->caps_offset);
+ link_mess->connection_id = GUINT32_FROM_LE(link_mess->connection_id);
+ link_mess->num_channel_caps = GUINT32_FROM_LE(link_mess->num_channel_caps);
+ link_mess->num_common_caps = GUINT32_FROM_LE(link_mess->num_common_caps);
+
+ /* Prevent DoS. Currently we defined only 13 capabilities,
+ * I expect 1024 to be valid for quite a lot time */
+ if (link_mess->num_channel_caps > 1024 || link_mess->num_common_caps > 1024) {
+ reds_send_link_error(link, SPICE_LINK_ERR_INVALID_DATA);
+ reds_link_free(link);
+ return;
+ }
+
+ num_caps = link_mess->num_common_caps + link_mess->num_channel_caps;
+ caps = reinterpret_cast<uint32_t *>(reinterpret_cast<uint8_t *>(link_mess) +
+ link_mess->caps_offset);
+
+ if (num_caps && (num_caps * sizeof(uint32_t) + link_mess->caps_offset >
+ link->link_header.size ||
+ link_mess->caps_offset < sizeof(*link_mess))) {
+ reds_send_link_error(link, SPICE_LINK_ERR_INVALID_DATA);
+ reds_link_free(link);
+ return;
+ }
+
+ for(i = 0; i < num_caps;i++)
+ caps[i] = GUINT32_FROM_LE(caps[i]);
+
+ auth_selection = red_link_info_test_capability(link,
+ SPICE_COMMON_CAP_PROTOCOL_AUTH_SELECTION);
+
+ if (!reds_security_check(link)) {
+ if (red_stream_is_ssl(link->stream)) {
+ spice_warning("spice channels %d should not be encrypted", link_mess->channel_type);
+ reds_send_link_error(link, SPICE_LINK_ERR_NEED_UNSECURED);
+ } else {
+ spice_warning("spice channels %d should be encrypted", link_mess->channel_type);
+ reds_send_link_error(link, SPICE_LINK_ERR_NEED_SECURED);
+ }
+ reds_link_free(link);
+ return;
+ }
+
+ if (!reds_send_link_ack(reds, link)) {
+ reds_link_free(link);
+ return;
+ }
+
+ if (!auth_selection) {
+ if (reds->config->sasl_enabled && !link->skip_auth) {
+ spice_warning("SASL enabled, but peer supports only spice authentication");
+ reds_send_link_error(link, SPICE_LINK_ERR_VERSION_MISMATCH);
+ return;
+ }
+ spice_warning("Peer doesn't support AUTH selection");
+ reds_get_spice_ticket(link);
+ } else {
+ red_stream_async_read(link->stream, reinterpret_cast<uint8_t *>(&link->auth_mechanism),
+ sizeof(SpiceLinkAuthMechanism), reds_handle_auth_mechanism, link);
+ }
+}
+
+static void reds_handle_link_error(void *opaque, int err)
+{
+ auto link = static_cast<RedLinkInfo *>(opaque);
+ switch (err) {
+ case 0:
+ case EPIPE:
+ break;
+ default:
+ spice_warning("%s", strerror(errno));
+ break;
+ }
+ reds_link_free(link);
+}
+
+static void reds_handle_new_link(RedLinkInfo *link);
+static void reds_handle_read_header_done(void *opaque)
+{
+ auto link = static_cast<RedLinkInfo *>(opaque);
+ SpiceLinkHeader *header = &link->link_header;
+
+ header->major_version = GUINT32_FROM_LE(header->major_version);
+ header->minor_version = GUINT32_FROM_LE(header->minor_version);
+ header->size = GUINT32_FROM_LE(header->size);
+
+ if (header->major_version != SPICE_VERSION_MAJOR) {
+ if (header->major_version > 0) {
+ reds_send_link_error(link, SPICE_LINK_ERR_VERSION_MISMATCH);
+ }
+
+ spice_warning("version mismatch");
+ reds_link_free(link);
+ return;
+ }
+
+ /* the check for 4096 is to avoid clients to cause arbitrary big memory allocations */
+ if (header->size < sizeof(SpiceLinkMess) || header->size > 4096) {
+ reds_send_link_error(link, SPICE_LINK_ERR_INVALID_DATA);
+ spice_warning("bad size %u", header->size);
+ reds_link_free(link);
+ return;
+ }
+
+ link->link_mess = static_cast<SpiceLinkMess *>(g_malloc(header->size));
+
+ red_stream_async_read(link->stream, reinterpret_cast<uint8_t *>(link->link_mess), header->size,
+ reds_handle_read_link_done, link);
+}
+
+static void reds_handle_read_magic_done(void *opaque)
+{
+ auto link = static_cast<RedLinkInfo *>(opaque);
+ const SpiceLinkHeader *header = &link->link_header;
+
+ if (header->magic != SPICE_MAGIC) {
+ /* Attempt to detect and support a WebSocket connection,
+ which will be proceeded by a variable length GET style request.
+ We cannot know we are dealing with a WebSocket connection
+ until we have read at least 3 bytes, and we will have to
+ read many more bytes than are contained in a SpiceLinkHeader.
+ So we may as well read a SpiceLinkHeader's worth of data, and if it's
+ clear that a WebSocket connection was requested, we switch
+ before proceeding further. */
+ if (red_stream_is_websocket(link->stream, &header->magic, sizeof(header->magic))) {
+ reds_handle_new_link(link);
+ return;
+ }
+ reds_send_link_error(link, SPICE_LINK_ERR_INVALID_MAGIC);
+ reds_link_free(link);
+ return;
+ }
+
+ red_stream_async_read(link->stream,
+ reinterpret_cast<uint8_t *>(&link->link_header) + sizeof(header->magic),
+ sizeof(SpiceLinkHeader) - sizeof(header->magic),
+ reds_handle_read_header_done, link);
+}
+
+static void reds_handle_new_link(RedLinkInfo *link)
+{
+ red_stream_set_async_error_handler(link->stream, reds_handle_link_error);
+ red_stream_async_read(link->stream, reinterpret_cast<uint8_t *>(&link->link_header),
+ sizeof(link->link_header.magic), reds_handle_read_magic_done, link);
+}
+
+static void reds_handle_ssl_accept(int fd, int event, void *data)
+{
+ auto link = static_cast<RedLinkInfo *>(data);
+ RedStreamSslStatus return_code = red_stream_ssl_accept(link->stream);
+
+ switch (return_code) {
+ case RED_STREAM_SSL_STATUS_ERROR:
+ reds_link_free(link);
+ return;
+ case RED_STREAM_SSL_STATUS_WAIT_FOR_READ:
+ red_watch_update_mask(link->stream->watch, SPICE_WATCH_EVENT_READ);
+ return;
+ case RED_STREAM_SSL_STATUS_WAIT_FOR_WRITE:
+ red_watch_update_mask(link->stream->watch, SPICE_WATCH_EVENT_WRITE);
+ return;
+ case RED_STREAM_SSL_STATUS_OK:
+ red_stream_remove_watch(link->stream);
+ reds_handle_new_link(link);
+ }
+}
+
+#define KEEPALIVE_TIMEOUT (10*60)
+
+static RedLinkInfo *reds_init_client_connection(RedsState *reds, int socket)
+{
+ RedLinkInfo *link;
+
+ if (!red_socket_set_non_blocking(socket, TRUE)) {
+ return nullptr;
+ }
+
+ if (!red_socket_set_no_delay(socket, TRUE)) {
+ return nullptr;
+ }
+
+ red_socket_set_keepalive(socket, TRUE, KEEPALIVE_TIMEOUT);
+ red_socket_set_nosigpipe(socket, true);
+
+ link = g_new0(RedLinkInfo, 1);
+ link->reds = reds;
+ link->stream = red_stream_new(reds, socket);
+
+ /* gather info + send event */
+
+ red_stream_push_channel_event(link->stream, SPICE_CHANNEL_EVENT_CONNECTED);
+
+ openssl_init(link);
+
+ return link;
+}
+
+
+static RedLinkInfo *reds_init_client_ssl_connection(RedsState *reds, int socket)
+{
+ RedLinkInfo *link;
+ RedStreamSslStatus ssl_status;
+
+ link = reds_init_client_connection(reds, socket);
+ if (link == nullptr) {
+ return nullptr;
+ }
+
+ ssl_status = red_stream_enable_ssl(link->stream, reds->ctx);
+ switch (ssl_status) {
+ case RED_STREAM_SSL_STATUS_OK:
+ reds_handle_new_link(link);
+ return link;
+ case RED_STREAM_SSL_STATUS_ERROR:
+ goto error;
+ case RED_STREAM_SSL_STATUS_WAIT_FOR_READ:
+ link->stream->watch = reds_core_watch_add(reds, link->stream->socket,
+ SPICE_WATCH_EVENT_READ,
+ reds_handle_ssl_accept, link);
+ break;
+ case RED_STREAM_SSL_STATUS_WAIT_FOR_WRITE:
+ link->stream->watch = reds_core_watch_add(reds, link->stream->socket,
+ SPICE_WATCH_EVENT_WRITE,
+ reds_handle_ssl_accept, link);
+ break;
+ }
+ return link;
+
+error:
+ /* close the stream but do not close the socket, this API is
+ * supposed to not close it if it fails */
+ link->stream->socket = -1;
+ reds_link_free(link);
+ return nullptr;
+}
+
+static void reds_accept_ssl_connection(int fd, int event, void *data)
+{
+ auto reds = static_cast<RedsState *>(data);
+ RedLinkInfo *link;
+ int socket;
+
+ if ((socket = accept(fd, nullptr, nullptr)) == -1) {
+ spice_warning("accept failed, %s", strerror(errno));
+ return;
+ }
+
+ if (!(link = reds_init_client_ssl_connection(reds, socket))) {
+ socket_close(socket);
+ }
+}
+
+
+static void reds_accept(int fd, int event, void *data)
+{
+ auto reds = static_cast<RedsState *>(data);
+ int socket;
+
+ if ((socket = accept(fd, nullptr, nullptr)) == -1) {
+ spice_warning("accept failed, %s", strerror(errno));
+ return;
+ }
+
+ if (spice_server_add_client(reds, socket, 0) < 0) {
+ socket_close(socket);
+ }
+}
+
+
+SPICE_GNUC_VISIBLE int spice_server_add_client(SpiceServer *reds, int socket, int skip_auth)
+{
+ RedLinkInfo *link;
+
+ if (!(link = reds_init_client_connection(reds, socket))) {
+ spice_warning("accept failed");
+ return -1;
+ }
+
+ link->skip_auth = skip_auth;
+
+ reds_handle_new_link(link);
+ return 0;
+}
+
+
+SPICE_GNUC_VISIBLE int spice_server_add_ssl_client(SpiceServer *reds, int socket, int skip_auth)
+{
+ RedLinkInfo *link;
+
+ if (!(link = reds_init_client_ssl_connection(reds, socket))) {
+ return -1;
+ }
+
+ link->skip_auth = skip_auth;
+ return 0;
+}
+
+
+static int reds_init_socket(const char *addr, int portnr, int family)
+{
+ static const int on=1, off=0;
+ struct addrinfo ai,*res,*e;
+ char port[33];
+ int slisten, rc;
+
+ if (family == AF_UNIX) {
+#ifndef _WIN32
+ int len;
+ struct sockaddr_un local = { 0, };
+
+ if ((slisten = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
+ perror("socket");
+ return -1;
+ }
+
+ local.sun_family = AF_UNIX;
+ g_strlcpy(local.sun_path, addr, sizeof(local.sun_path));
+ len = SUN_LEN(&local);
+ if (local.sun_path[0] == '@') {
+ local.sun_path[0] = 0;
+ } else {
+ unlink(local.sun_path);
+ }
+ if (bind(slisten, reinterpret_cast<struct sockaddr *>(&local), len) == -1) {
+ perror("bind");
+ socket_close(slisten);
+ return -1;
+ }
+
+ goto listen;
+#else
+ return -1;
+#endif
+ }
+
+ memset(&ai,0, sizeof(ai));
+ ai.ai_flags = AI_PASSIVE | AI_ADDRCONFIG;
+ ai.ai_socktype = SOCK_STREAM;
+ ai.ai_family = family;
+
+ snprintf(port, sizeof(port), "%d", portnr);
+ rc = getaddrinfo(strlen(addr) ? addr : nullptr, port, &ai, &res);
+ if (rc != 0) {
+ spice_warning("getaddrinfo(%s,%s): %s", addr, port,
+ gai_strerror(rc));
+ return -1;
+ }
+
+ for (e = res; e != nullptr; e = e->ai_next) {
+ slisten = socket(e->ai_family, e->ai_socktype, e->ai_protocol);
+ if (slisten < 0) {
+ continue;
+ }
+
+ setsockopt(slisten,SOL_SOCKET,SO_REUSEADDR,(void*)&on,sizeof(on));
+#ifdef IPV6_V6ONLY
+ if (e->ai_family == PF_INET6) {
+ /* listen on both ipv4 and ipv6 */
+ setsockopt(slisten,IPPROTO_IPV6,IPV6_V6ONLY,(void*)&off,
+ sizeof(off));
+ }
+#endif
+ if (bind(slisten, e->ai_addr, e->ai_addrlen) == 0) {
+ char uaddr[INET6_ADDRSTRLEN+1];
+ char uport[33];
+ rc = getnameinfo(e->ai_addr, e->ai_addrlen, uaddr, INET6_ADDRSTRLEN, uport, 32,
+ NI_NUMERICHOST | NI_NUMERICSERV);
+ if (rc == 0) {
+ spice_debug("bound to %s:%s", uaddr, uport);
+ } else {
+ spice_debug("cannot resolve address spice-server is bound to");
+ }
+ freeaddrinfo(res);
+ goto listen;
+ }
+ socket_close(slisten);
+ }
+ spice_warning("binding socket to %s:%d failed", addr, portnr);
+ freeaddrinfo(res);
+ return -1;
+
+listen:
+ if (listen(slisten, SOMAXCONN) != 0) {
+ spice_warning("listen: %s", strerror(errno));
+ socket_close(slisten);
+ return -1;
+ }
+ return slisten;
+}
+
+static void reds_send_mm_time(RedsState *reds)
+{
+ if (!reds_main_channel_connected(reds)) {
+ return;
+ }
+ spice_debug("trace");
+ reds->main_channel->push_multi_media_time(reds_get_mm_time() - reds->mm_time_latency);
+}
+
+void reds_set_client_mm_time_latency(RedsState *reds, RedClient *client, uint32_t latency)
+{
+ // TODO: multi-client support for mm_time
+ if (reds->mm_time_enabled) {
+ // TODO: consider network latency
+ if (latency > reds->mm_time_latency) {
+ reds->mm_time_latency = latency;
+ reds_send_mm_time(reds);
+ } else {
+ spice_debug("new latency %u is smaller than existing %u",
+ latency, reds->mm_time_latency);
+ }
+ } else {
+ snd_set_playback_latency(client, latency);
+ }
+}
+
+static void reds_cleanup_net(SpiceServer *reds)
+{
+ if (reds->listen_socket != -1) {
+ red_watch_remove(reds->listen_watch);
+ if (reds->config->spice_listen_socket_fd != reds->listen_socket) {
+ socket_close(reds->listen_socket);
+ }
+ reds->listen_watch = nullptr;
+ reds->listen_socket = -1;
+ }
+ if (reds->secure_listen_socket != -1) {
+ red_watch_remove(reds->secure_listen_watch);
+ socket_close(reds->secure_listen_socket);
+ reds->secure_listen_watch = nullptr;
+ reds->secure_listen_socket = -1;
+ }
+}
+
+static int reds_init_net(RedsState *reds)
+{
+ if (reds->config->spice_port != -1 || reds->config->spice_family == AF_UNIX) {
+ reds->listen_socket = reds_init_socket(reds->config->spice_addr, reds->config->spice_port, reds->config->spice_family);
+ if (-1 == reds->listen_socket) {
+ return -1;
+ }
+ reds->listen_watch = reds_core_watch_add(reds, reds->listen_socket,
+ SPICE_WATCH_EVENT_READ,
+ reds_accept, reds);
+ if (reds->listen_watch == nullptr) {
+ return -1;
+ }
+ }
+
+ if (reds->config->spice_secure_port != -1) {
+ reds->secure_listen_socket = reds_init_socket(reds->config->spice_addr, reds->config->spice_secure_port,
+ reds->config->spice_family);
+ if (-1 == reds->secure_listen_socket) {
+ return -1;
+ }
+ reds->secure_listen_watch = reds_core_watch_add(reds, reds->secure_listen_socket,
+ SPICE_WATCH_EVENT_READ,
+ reds_accept_ssl_connection, reds);
+ if (reds->secure_listen_watch == nullptr) {
+ return -1;
+ }
+ }
+
+ if (reds->config->spice_listen_socket_fd != -1 ) {
+ reds->listen_socket = reds->config->spice_listen_socket_fd;
+ reds->listen_watch = reds_core_watch_add(reds, reds->listen_socket,
+ SPICE_WATCH_EVENT_READ,
+ reds_accept, reds);
+ if (reds->listen_watch == nullptr) {
+ return -1;
+ }
+ }
+ return 0;
+}
+
+#if OPENSSL_VERSION_NUMBER < 0x30000000L
+static inline int SSL_CTX_set0_tmp_dh_pkey(SSL_CTX *ctx, EVP_PKEY *dhpkey)
+{
+ DH *dh = EVP_PKEY_get1_DH(dhpkey);
+ if (dh == nullptr) {
+ return 0;
+ }
+ int ret = SSL_CTX_set_tmp_dh(ctx, dh);
+ DH_free(dh);
+ if (ret > 0) {
+ EVP_PKEY_free(dhpkey);
+ }
+ return ret;
+}
+#endif
+
+static int load_dh_params(SSL_CTX *ctx, char *file)
+{
+ BIO *bio;
+
+ if ((bio = BIO_new_file(file, "r")) == nullptr) {
+ spice_warning("Could not open DH file");
+ red_dump_openssl_errors();
+ return -1;
+ }
+
+ auto dh = PEM_read_bio_Parameters(bio, nullptr);
+
+ BIO_free(bio);
+ if (dh == nullptr) {
+ spice_warning("Could not read DH params");
+ red_dump_openssl_errors();
+ return -1;
+ }
+
+ auto ret = SSL_CTX_set0_tmp_dh_pkey(ctx, dh);
+ if (ret <= 0) {
+ EVP_PKEY_free(dh);
+ spice_warning("Could not set DH params");
+ red_dump_openssl_errors();
+ return -1;
+ }
+
+ return 0;
+}
+
+/*The password code is not thread safe*/
+static int ssl_password_cb(char *buf, int size, int flags, void *userdata)
+{
+ auto reds = static_cast<RedsState *>(userdata);
+ char *pass = reds->config->ssl_parameters.keyfile_password;
+ int len = g_strlcpy(buf, pass, size);
+ if (len >= size) {
+ return 0;
+ }
+
+ return len;
+}
+
+#if OPENSSL_VERSION_NUMBER < 0x1010000FL
+static pthread_mutex_t *lock_cs;
+
+static void pthreads_thread_id(CRYPTO_THREADID *tid)
+{
+ CRYPTO_THREADID_set_numeric(tid, (unsigned long)pthread_self());
+}
+
+static void pthreads_locking_callback(int mode, int type, const char *file, int line)
+{
+ if (mode & CRYPTO_LOCK) {
+ pthread_mutex_lock(&(lock_cs[type]));
+ } else {
+ pthread_mutex_unlock(&(lock_cs[type]));
+ }
+}
+
+static void openssl_thread_setup(void)
+{
+ int i;
+
+ /* Somebody else already setup threading for OpenSSL,
+ * don't do it twice to avoid possible races.
+ */
+ if (CRYPTO_get_locking_callback() != NULL) {
+ red_dump_openssl_errors();
+ return;
+ }
+
+ lock_cs = (pthread_mutex_t*) OPENSSL_malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t));
+
+ for (i = 0; i < CRYPTO_num_locks(); i++) {
+ pthread_mutex_init(&(lock_cs[i]), NULL);
+ }
+
+ CRYPTO_THREADID_set_callback(pthreads_thread_id);
+ CRYPTO_set_locking_callback(pthreads_locking_callback);
+}
+
+static gpointer openssl_global_init_once(gpointer arg)
+{
+ SSL_library_init();
+ SSL_load_error_strings();
+
+ openssl_thread_setup();
+
+ return NULL;
+}
+
+static inline void openssl_global_init(void)
+{
+ static GOnce openssl_once = G_ONCE_INIT;
+ g_once(&openssl_once, openssl_global_init_once, NULL);
+}
+
+#else
+static inline void openssl_global_init()
+{
+}
+#endif
+
+static int reds_init_ssl(RedsState *reds)
+{
+ const SSL_METHOD *ssl_method;
+ int return_code;
+ /* Limit connection to TLSv1.1 or newer.
+ * When some other SSL/TLS version becomes obsolete, add it to this
+ * variable. */
+ long ssl_options = SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_NO_COMPRESSION | SSL_OP_NO_TLSv1;
+#ifdef SSL_OP_NO_RENEGOTIATION
+ // With OpenSSL 1.1: Disable all renegotiation in TLSv1.2 and earlier
+ ssl_options |= SSL_OP_NO_RENEGOTIATION;
+#endif
+
+ /* Global system initialization*/
+ openssl_global_init();
+
+ /* Create our context*/
+ ssl_method = TLS_method();
+ reds->ctx = SSL_CTX_new(ssl_method);
+ if (!reds->ctx) {
+ spice_warning("Could not allocate new SSL context");
+ red_dump_openssl_errors();
+ return -1;
+ }
+
+ SSL_CTX_set_options(reds->ctx, ssl_options);
+#if HAVE_DECL_SSL_CTX_SET_ECDH_AUTO || defined(SSL_CTX_set_ecdh_auto)
+ SSL_CTX_set_ecdh_auto(reds->ctx, 1);
+#endif
+
+ /* Load our keys and certificates*/
+ return_code = SSL_CTX_use_certificate_chain_file(reds->ctx, reds->config->ssl_parameters.certs_file);
+ if (return_code == 1) {
+ spice_debug("Loaded certificates from %s", reds->config->ssl_parameters.certs_file);
+ } else {
+ spice_warning("Could not load certificates from %s", reds->config->ssl_parameters.certs_file);
+ red_dump_openssl_errors();
+ return -1;
+ }
+
+ SSL_CTX_set_default_passwd_cb(reds->ctx, ssl_password_cb);
+ SSL_CTX_set_default_passwd_cb_userdata(reds->ctx, reds);
+
+ return_code = SSL_CTX_use_PrivateKey_file(reds->ctx, reds->config->ssl_parameters.private_key_file,
+ SSL_FILETYPE_PEM);
+ if (return_code == 1) {
+ spice_debug("Using private key from %s", reds->config->ssl_parameters.private_key_file);
+ } else {
+ spice_warning("Could not use private key file");
+ return -1;
+ }
+
+ /* Load the CAs we trust*/
+ return_code = SSL_CTX_load_verify_locations(reds->ctx, reds->config->ssl_parameters.ca_certificate_file, nullptr);
+ if (return_code == 1) {
+ spice_debug("Loaded CA certificates from %s", reds->config->ssl_parameters.ca_certificate_file);
+ } else {
+ spice_warning("Could not use CA file %s", reds->config->ssl_parameters.ca_certificate_file);
+ red_dump_openssl_errors();
+ return -1;
+ }
+
+ if (strlen(reds->config->ssl_parameters.dh_key_file) > 0) {
+ if (load_dh_params(reds->ctx, reds->config->ssl_parameters.dh_key_file) < 0) {
+ return -1;
+ }
+ }
+
+ SSL_CTX_set_session_id_context(reds->ctx, reinterpret_cast<const unsigned char *>("SPICE"), 5);
+ if (strlen(reds->config->ssl_parameters.ciphersuite) > 0) {
+ if (!SSL_CTX_set_cipher_list(reds->ctx, reds->config->ssl_parameters.ciphersuite)) {
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+static void reds_cleanup(RedsState *reds)
+{
+#ifdef RED_STATISTICS
+ stat_file_unlink(reds->stat_file);
+#endif
+}
+
+SPICE_DESTRUCTOR_FUNC(reds_exit)
+{
+ GList *l;
+
+ pthread_mutex_lock(&global_reds_lock);
+ for (l = servers; l != nullptr; l = l->next) {
+ auto reds = static_cast<RedsState *>(l->data);
+ reds_cleanup(reds);
+ }
+ pthread_mutex_unlock(&global_reds_lock);
+}
+
+static inline void on_activating_ticketing(RedsState *reds)
+{
+ if (!reds->config->ticketing_enabled && reds_main_channel_connected(reds)) {
+ spice_warning("disconnecting");
+ reds_disconnect(reds);
+ }
+}
+
+static void reds_config_set_image_compression(RedsState *reds, SpiceImageCompression image_compression)
+{
+ if (image_compression == reds->config->image_compression) {
+ return;
+ }
+ switch (image_compression) {
+ case SPICE_IMAGE_COMPRESSION_AUTO_LZ:
+ spice_debug("ic auto_lz");
+ break;
+ case SPICE_IMAGE_COMPRESSION_AUTO_GLZ:
+ spice_debug("ic auto_glz");
+ break;
+ case SPICE_IMAGE_COMPRESSION_QUIC:
+ spice_debug("ic quic");
+ break;
+#ifdef USE_LZ4
+ case SPICE_IMAGE_COMPRESSION_LZ4:
+ spice_debug("ic lz4");
+ break;
+#endif
+ case SPICE_IMAGE_COMPRESSION_LZ:
+ spice_debug("ic lz");
+ break;
+ case SPICE_IMAGE_COMPRESSION_GLZ:
+ spice_debug("ic glz");
+ break;
+ case SPICE_IMAGE_COMPRESSION_OFF:
+ spice_debug("ic off");
+ break;
+ default:
+ spice_warning("ic invalid");
+ return;
+ }
+ reds->config->image_compression = image_compression;
+ reds_on_ic_change(reds);
+}
+
+static void reds_set_one_channel_security(RedsState *reds, int id, uint32_t security)
+{
+ ChannelSecurityOptions *security_options;
+
+ if ((security_options = reds_find_channel_security(reds, id))) {
+ security_options->options = security;
+ return;
+ }
+ security_options = g_new(ChannelSecurityOptions, 1);
+ security_options->channel_id = id;
+ security_options->options = security;
+ security_options->next = reds->config->channels_security;
+ reds->config->channels_security = security_options;
+}
+
+static void reds_mig_release(RedServerConfig *config)
+{
+ if (config->mig_spice) {
+ g_free(config->mig_spice->cert_subject);
+ g_free(config->mig_spice->host);
+ g_free(config->mig_spice);
+ config->mig_spice = nullptr;
+ }
+}
+
+static void reds_mig_started(RedsState *reds)
+{
+ spice_debug("trace");
+ spice_assert(reds->config->mig_spice);
+
+ reds->mig_inprogress = TRUE;
+ reds->mig_wait_connect = TRUE;
+ red_timer_start(reds->mig_timer, MIGRATE_TIMEOUT);
+}
+
+static void reds_mig_fill_wait_disconnect(RedsState *reds)
+{
+ spice_assert(!reds->clients.empty());
+ /* tracking the clients, in order to ignore disconnection
+ * of clients that got connected to the src after migration completion.*/
+ for (auto client: reds->clients) {
+ reds->mig_wait_disconnect_clients.push_front(client);
+ }
+ reds->mig_wait_connect = FALSE;
+ reds->mig_wait_disconnect = TRUE;
+ red_timer_start(reds->mig_timer, MIGRATE_TIMEOUT);
+}
+
+static void reds_mig_cleanup_wait_disconnect(RedsState *reds)
+{
+ reds->mig_wait_disconnect_clients.clear();
+ reds->mig_wait_disconnect = FALSE;
+}
+
+static void reds_mig_remove_wait_disconnect_client(RedsState *reds, RedClient *client)
+{
+ auto &clients(reds->mig_wait_disconnect_clients);
+ g_warn_if_fail(std::find(clients.begin(), clients.end(), client) != clients.end());
+
+ clients.remove(client);
+ if (clients.empty()) {
+ reds_mig_cleanup(reds);
+ }
+}
+
+static void reds_migrate_channels_seamless(RedsState *reds)
+{
+ RedClient *client;
+
+ /* seamless migration is supported for only one client for now */
+ client = reds_get_client(reds);
+ client->migrate();
+}
+
+static void reds_mig_finished(RedsState *reds, int completed)
+{
+ spice_debug("trace");
+
+ reds->mig_inprogress = TRUE;
+
+ if (reds->src_do_seamless_migrate && completed) {
+ reds_migrate_channels_seamless(reds);
+ } else {
+ reds->main_channel->migrate_src_complete(completed);
+ }
+
+ if (completed) {
+ reds_mig_fill_wait_disconnect(reds);
+ } else {
+ reds_mig_cleanup(reds);
+ }
+ reds_mig_release(reds->config);
+}
+
+static void migrate_timeout(RedsState *reds)
+{
+ spice_debug("trace");
+ spice_assert(reds->mig_wait_connect || reds->mig_wait_disconnect);
+ if (reds->mig_wait_connect) {
+ /* we will fall back to the switch host scheme when migration completes */
+ reds->main_channel->migrate_cancel_wait();
+ /* in case part of the client haven't yet completed the previous migration, disconnect them */
+ reds_mig_target_client_disconnect_all(reds);
+ reds_mig_cleanup(reds);
+ } else {
+ reds_mig_disconnect(reds);
+ }
+}
+
+uint32_t reds_get_mm_time(void)
+{
+ return spice_get_monotonic_time_ns() / NSEC_PER_MILLISEC;
+}
+
+void reds_enable_mm_time(RedsState *reds)
+{
+ reds->mm_time_enabled = TRUE;
+ reds->mm_time_latency = MM_TIME_DELTA;
+ reds_send_mm_time(reds);
+}
+
+void reds_disable_mm_time(RedsState *reds)
+{
+ reds->mm_time_enabled = FALSE;
+}
+
+static red::shared_ptr<RedCharDevice>
+attach_to_red_agent(RedsState *reds, SpiceCharDeviceInstance *sin)
+{
+ RedCharDeviceVDIPort *dev = reds->agent_dev.get();
+ SpiceCharDeviceInterface *sif;
+
+ dev->priv->agent_attached = true;
+ dev->reset_dev_instance(sin);
+
+ reds->vdagent = sin;
+ reds_update_mouse_mode(reds);
+
+ sif = spice_char_device_get_interface(sin);
+ if (sif->state) {
+ sif->state(sin, 1);
+ }
+
+ if (!reds_main_channel_connected(reds)) {
+ return reds->agent_dev;
+ }
+
+ dev->priv->read_filter.discard_all = FALSE;
+ dev->priv->plug_generation++;
+
+ if (dev->priv->mig_data ||
+ reds->main_channel->is_waiting_for_migrate_data()) {
+ /* Migration in progress (code is running on the destination host):
+ * 1. Add the client to spice char device, if it was not already added.
+ * 2.a If this (qemu-kvm state load side of migration) happens first
+ * then wait for spice migration data to arrive. Otherwise
+ * 2.b If this happens second ==> we already have spice migrate data
+ * then restore state
+ */
+ auto client_opaque = reinterpret_cast<RedCharDeviceClientOpaque *>(reds_get_client(reds));
+ if (!dev->client_exists(client_opaque)) {
+ int client_added;
+
+ client_added = dev->client_add(client_opaque, TRUE,
+ REDS_VDI_PORT_NUM_RECEIVE_BUFFS,
+ REDS_AGENT_WINDOW_SIZE, ~0, TRUE);
+
+ if (!client_added) {
+ spice_warning("failed to add client to agent");
+ reds_disconnect(reds);
+ }
+ }
+
+ if (dev->priv->mig_data) {
+ spice_debug("restoring dev from stored migration data");
+ spice_assert(dev->priv->plug_generation == 1);
+ reds_agent_state_restore(reds, dev->priv->mig_data);
+ g_free(dev->priv->mig_data);
+ dev->priv->mig_data = nullptr;
+ }
+ else {
+ spice_debug("waiting for migration data");
+ }
+ } else {
+ /* we will associate the client with the char device, upon reds_on_main_agent_start,
+ * in response to MSGC_AGENT_START */
+ reds->main_channel->push_agent_connected();
+ }
+
+ return reds->agent_dev;
+}
+
+SPICE_GNUC_VISIBLE void spice_server_char_device_wakeup(SpiceCharDeviceInstance* sin)
+{
+ if (!sin->st) {
+ spice_warning("no RedCharDevice attached to instance %p", sin);
+ return;
+ }
+ sin->st->wakeup();
+}
+
+#define SUBTYPE_VDAGENT "vdagent"
+#define SUBTYPE_SMARTCARD "smartcard"
+#define SUBTYPE_USBREDIR "usbredir"
+#define SUBTYPE_PORT "port"
+
+static const char *const spice_server_char_device_recognized_subtypes_list[] = {
+ SUBTYPE_VDAGENT,
+#ifdef USE_SMARTCARD
+ SUBTYPE_SMARTCARD,
+#endif
+ SUBTYPE_USBREDIR,
+ nullptr,
+};
+
+SPICE_GNUC_VISIBLE const char** spice_server_char_device_recognized_subtypes(void)
+{
+ return const_cast<const char **>(spice_server_char_device_recognized_subtypes_list);
+}
+
+static void reds_add_char_device(RedsState *reds, const red::shared_ptr<RedCharDevice> &dev)
+{
+ reds->char_devices.push_front(dev);
+}
+
+static void reds_remove_char_device(RedsState *reds, RedCharDevice *dev)
+{
+ g_return_if_fail(reds != nullptr);
+ auto &devs(reds->char_devices);
+ g_warn_if_fail(std::find(devs.begin(), devs.end(),
+ red::shared_ptr<RedCharDevice>(dev)) != devs.end());
+
+ devs.remove(red::shared_ptr<RedCharDevice>(dev));
+}
+
+static int
+spice_server_char_device_add_interface(SpiceServer *reds, SpiceBaseInstance *sin)
+{
+ SpiceCharDeviceInstance* char_device =
+ SPICE_UPCAST(SpiceCharDeviceInstance, sin);
+ red::shared_ptr<RedCharDevice> dev_state;
+
+ spice_debug("CHAR_DEVICE %s", char_device->subtype);
+ if (strcmp(char_device->subtype, SUBTYPE_VDAGENT) == 0) {
+ if (reds->vdagent) {
+ spice_warning("vdagent already attached");
+ return -1;
+ }
+ dev_state = attach_to_red_agent(reds, char_device);
+ }
+#ifdef USE_SMARTCARD
+ else if (strcmp(char_device->subtype, SUBTYPE_SMARTCARD) == 0) {
+ dev_state = smartcard_device_connect(reds, char_device);
+ if (!dev_state) {
+ return -1;
+ }
+ }
+#endif
+ else if (strcmp(char_device->subtype, SUBTYPE_USBREDIR) == 0) {
+ dev_state = spicevmc_device_connect(reds, char_device, SPICE_CHANNEL_USBREDIR);
+ }
+ else if (strcmp(char_device->subtype, SUBTYPE_PORT) == 0) {
+ if (strcmp(char_device->portname, "org.spice-space.webdav.0") == 0) {
+ dev_state = spicevmc_device_connect(reds, char_device, SPICE_CHANNEL_WEBDAV);
+ } else if (strcmp(char_device->portname, "org.spice-space.stream.0") == 0) {
+ dev_state = stream_device_connect(reds, char_device);
+ } else {
+ dev_state = spicevmc_device_connect(reds, char_device, SPICE_CHANNEL_PORT);
+ }
+ }
+
+ if (dev_state) {
+ /* When spicevmc_device_connect() is called to create a RedCharDevice,
+ * it also assigns that as the internal state for char_device. This is
+ * just a sanity check to ensure that assumption is correct */
+ spice_assert(dev_state.get() == char_device->st);
+
+ /* setting the char_device state to "started" for backward compatibily with
+ * qemu releases that don't call spice api for start/stop (not implemented yet) */
+ if (reds->vm_running) {
+ dev_state->start();
+ }
+ reds_add_char_device(reds, dev_state);
+ } else {
+ spice_warning("failed to create device state for %s", char_device->subtype);
+ return -1;
+ }
+ return 0;
+}
+
+static int spice_server_char_device_remove_interface(RedsState *reds, SpiceBaseInstance *sin)
+{
+ SpiceCharDeviceInstance* char_device =
+ SPICE_UPCAST(SpiceCharDeviceInstance, sin);
+
+ spice_debug("remove CHAR_DEVICE %s", char_device->subtype);
+ if (strcmp(char_device->subtype, SUBTYPE_VDAGENT) == 0) {
+ g_return_val_if_fail(char_device == reds->vdagent, -1);
+ if (reds->vdagent) {
+ reds_agent_remove(reds);
+ reds->agent_dev->reset_dev_instance(nullptr);
+ }
+ }
+
+ if (char_device->st) {
+ auto st = char_device->st;
+ char_device->st = nullptr;
+ reds_remove_char_device(reds, st);
+ }
+ return 0;
+}
+
+SPICE_GNUC_VISIBLE int spice_server_add_interface(SpiceServer *reds,
+ SpiceBaseInstance *sin)
+{
+ const SpiceBaseInterface *base_interface = sin->sif;
+
+ if (strcmp(base_interface->type, SPICE_INTERFACE_KEYBOARD) == 0) {
+ spice_debug("SPICE_INTERFACE_KEYBOARD");
+ if (base_interface->major_version != SPICE_INTERFACE_KEYBOARD_MAJOR ||
+ base_interface->minor_version > SPICE_INTERFACE_KEYBOARD_MINOR) {
+ spice_warning("unsupported keyboard interface");
+ return -1;
+ }
+ if (reds->inputs_channel->set_keyboard(SPICE_UPCAST(SpiceKbdInstance, sin)) != 0) {
+ return -1;
+ }
+ } else if (strcmp(base_interface->type, SPICE_INTERFACE_MOUSE) == 0) {
+ spice_debug("SPICE_INTERFACE_MOUSE");
+ if (base_interface->major_version != SPICE_INTERFACE_MOUSE_MAJOR ||
+ base_interface->minor_version > SPICE_INTERFACE_MOUSE_MINOR) {
+ spice_warning("unsupported mouse interface");
+ return -1;
+ }
+ if (reds->inputs_channel->set_mouse(SPICE_UPCAST(SpiceMouseInstance, sin)) != 0) {
+ return -1;
+ }
+ } else if (strcmp(base_interface->type, SPICE_INTERFACE_QXL) == 0) {
+ QXLInstance *qxl;
+
+ spice_debug("SPICE_INTERFACE_QXL");
+ if (base_interface->major_version != SPICE_INTERFACE_QXL_MAJOR ||
+ base_interface->minor_version > SPICE_INTERFACE_QXL_MINOR) {
+ spice_warning("unsupported qxl interface");
+ return -1;
+ }
+
+ qxl = SPICE_UPCAST(QXLInstance, sin);
+ if (qxl->id < 0) {
+ spice_warning("invalid QXL ID");
+ return -1;
+ }
+ if (reds_find_channel(reds, SPICE_CHANNEL_DISPLAY, qxl->id)) {
+ spice_warning("QXL ID already allocated");
+ return -1;
+ }
+ red_qxl_init(reds, qxl);
+ reds->qxl_instances.push_front(qxl);
+
+ /* this function has to be called after the qxl is on the list
+ * as QXLInstance clients expect the qxl to be on the list when
+ * this callback is called. This as clients assume they can start the
+ * qxl_instances. Also note that this should be the first callback to
+ * be called. */
+ red_qxl_attach_worker(qxl);
+ red_qxl_set_compression_level(qxl, calc_compression_level(reds));
+ } else if (strcmp(base_interface->type, SPICE_INTERFACE_TABLET) == 0) {
+ SpiceTabletInstance *tablet = SPICE_UPCAST(SpiceTabletInstance, sin);
+ spice_debug("SPICE_INTERFACE_TABLET");
+ if (base_interface->major_version != SPICE_INTERFACE_TABLET_MAJOR ||
+ base_interface->minor_version > SPICE_INTERFACE_TABLET_MINOR) {
+ spice_warning("unsupported tablet interface");
+ return -1;
+ }
+ if (reds->inputs_channel->set_tablet(tablet) != 0) {
+ return -1;
+ }
+ reds_update_mouse_mode(reds);
+ if (reds->is_client_mouse_allowed) {
+ reds->inputs_channel->set_tablet_logical_size(reds->monitor_mode.x_res, reds->monitor_mode.y_res);
+ }
+
+ } else if (strcmp(base_interface->type, SPICE_INTERFACE_PLAYBACK) == 0) {
+ spice_debug("SPICE_INTERFACE_PLAYBACK");
+ if (base_interface->major_version != SPICE_INTERFACE_PLAYBACK_MAJOR ||
+ base_interface->minor_version > SPICE_INTERFACE_PLAYBACK_MINOR) {
+ spice_warning("unsupported playback interface");
+ return -1;
+ }
+ snd_attach_playback(reds, SPICE_UPCAST(SpicePlaybackInstance, sin));
+
+ } else if (strcmp(base_interface->type, SPICE_INTERFACE_RECORD) == 0) {
+ spice_debug("SPICE_INTERFACE_RECORD");
+ if (base_interface->major_version != SPICE_INTERFACE_RECORD_MAJOR ||
+ base_interface->minor_version > SPICE_INTERFACE_RECORD_MINOR) {
+ spice_warning("unsupported record interface");
+ return -1;
+ }
+ snd_attach_record(reds, SPICE_UPCAST(SpiceRecordInstance, sin));
+
+ } else if (strcmp(base_interface->type, SPICE_INTERFACE_CHAR_DEVICE) == 0) {
+ if (base_interface->major_version != SPICE_INTERFACE_CHAR_DEVICE_MAJOR ||
+ base_interface->minor_version > SPICE_INTERFACE_CHAR_DEVICE_MINOR) {
+ spice_warning("unsupported char device interface");
+ return -1;
+ }
+ spice_server_char_device_add_interface(reds, sin);
+
+ } else if (strcmp(base_interface->type, SPICE_INTERFACE_MIGRATION) == 0) {
+ spice_debug("SPICE_INTERFACE_MIGRATION");
+ if (reds->migration_interface) {
+ spice_warning("already have migration");
+ return -1;
+ }
+
+ if (base_interface->major_version != SPICE_INTERFACE_MIGRATION_MAJOR ||
+ base_interface->minor_version > SPICE_INTERFACE_MIGRATION_MINOR) {
+ spice_warning("unsupported migration interface");
+ return -1;
+ }
+ reds->migration_interface = SPICE_UPCAST(SpiceMigrateInstance, sin);
+ reds->migration_interface->st =
+ reinterpret_cast<SpiceMigrateState *>(static_cast<intptr_t>(1)); // dummy pointer
+ }
+
+ return 0;
+}
+
+SPICE_GNUC_VISIBLE int spice_server_remove_interface(SpiceBaseInstance *sin)
+{
+ RedsState *reds;
+ const SpiceBaseInterface *base_interface;
+
+ g_return_val_if_fail(sin != nullptr, -1);
+
+ base_interface = sin->sif;
+ if (strcmp(base_interface->type, SPICE_INTERFACE_TABLET) == 0) {
+ SpiceTabletInstance *tablet = SPICE_UPCAST(SpiceTabletInstance, sin);
+ g_return_val_if_fail(tablet->st != nullptr, -1);
+ reds = spice_tablet_state_get_server(tablet->st);
+ spice_debug("remove SPICE_INTERFACE_TABLET");
+ reds->inputs_channel->detach_tablet(tablet);
+ reds_update_mouse_mode(reds);
+ } else if (strcmp(base_interface->type, SPICE_INTERFACE_PLAYBACK) == 0) {
+ spice_debug("remove SPICE_INTERFACE_PLAYBACK");
+ snd_detach_playback(SPICE_UPCAST(SpicePlaybackInstance, sin));
+ } else if (strcmp(base_interface->type, SPICE_INTERFACE_RECORD) == 0) {
+ spice_debug("remove SPICE_INTERFACE_RECORD");
+ snd_detach_record(SPICE_UPCAST(SpiceRecordInstance, sin));
+ } else if (strcmp(base_interface->type, SPICE_INTERFACE_CHAR_DEVICE) == 0) {
+ SpiceCharDeviceInstance *char_device = SPICE_UPCAST(SpiceCharDeviceInstance, sin);
+ g_return_val_if_fail(char_device->st != nullptr, -1);
+ reds = char_device->st->get_server();
+ return spice_server_char_device_remove_interface(reds, sin);
+ } else if (strcmp(base_interface->type, SPICE_INTERFACE_QXL) == 0) {
+ QXLInstance *qxl;
+
+ qxl = SPICE_UPCAST(QXLInstance, sin);
+ g_return_val_if_fail(qxl->st != nullptr, -1);
+ reds = red_qxl_get_server(qxl->st);
+ reds->qxl_instances.remove(qxl); // XXX owning
+ red_qxl_destroy(qxl);
+ } else {
+ spice_warning("VD_INTERFACE_REMOVING unsupported");
+ return -1;
+ }
+
+ return 0;
+}
+
+static int do_spice_init(RedsState *reds, SpiceCoreInterface *core_interface)
+{
+ spice_debug("starting %s", VERSION);
+
+ if (core_interface->base.major_version != SPICE_INTERFACE_CORE_MAJOR) {
+ spice_warning("bad core interface version");
+ goto err;
+ }
+ reds->core = core_interface_adapter;
+ reds->core.public_interface = core_interface;
+ reds->agent_dev = red::make_shared<RedCharDeviceVDIPort>(reds);
+ reds_update_agent_properties(reds);
+ reds->main_dispatcher = red::make_shared<MainDispatcher>(reds);
+ reds->mig_target_clients = nullptr;
+ reds->vm_running = TRUE; /* for backward compatibility */
+
+ if (!(reds->mig_timer = reds->core.timer_new(migrate_timeout, reds))) {
+ spice_error("migration timer create failed");
+ }
+ /* Note that this will not actually send the mm_time to the client because
+ * the main channel is not connected yet. This would have been redundant
+ * with the RED_PIPE_ITEM_TYPE_MAIN_INIT message anyway.
+ */
+ reds_enable_mm_time(reds);
+
+ if (reds_init_net(reds) < 0) {
+ spice_warning("Failed to open SPICE sockets");
+ goto err;
+ }
+ if (reds->secure_listen_socket != -1) {
+ if (reds_init_ssl(reds) < 0) {
+ goto err;
+ }
+ }
+#if HAVE_SASL
+ int saslerr;
+ if ((saslerr = sasl_server_init(NULL, reds->config->sasl_appname ?
+ reds->config->sasl_appname : "spice")) != SASL_OK) {
+ spice_error("Failed to initialize SASL auth %s",
+ sasl_errstring(saslerr, NULL, NULL));
+ goto err;
+ }
+#endif
+
+ reds->main_channel = main_channel_new(reds);
+ reds->inputs_channel = inputs_channel_new(reds);
+
+ reds->mouse_mode = SPICE_MOUSE_MODE_SERVER;
+
+ spice_buffer_free(&reds->client_monitors_config);
+
+ reds->allow_multiple_clients = getenv(SPICE_DEBUG_ALLOW_MC_ENV) != nullptr;
+ if (reds->allow_multiple_clients) {
+ spice_warning("spice: allowing multiple client connections");
+ }
+ pthread_mutex_lock(&global_reds_lock);
+ servers = g_list_prepend(servers, reds);
+ pthread_mutex_unlock(&global_reds_lock);
+ return 0;
+
+err:
+ reds_cleanup_net(reds);
+ return -1;
+}
+
+static const char default_renderer[] = "sw";
+#if defined(HAVE_GSTREAMER_1_0)
+#define GSTREAMER_CODECS "gstreamer:mjpeg;gstreamer:h264;gstreamer:vp8;gstreamer:vp9;"
+#else
+#define GSTREAMER_CODECS ""
+#endif
+static const char default_video_codecs[] = "spice:mjpeg;" GSTREAMER_CODECS;
+
+/* new interface */
+SPICE_GNUC_VISIBLE SpiceServer *spice_server_new(void)
+{
+ const char *record_filename;
+ auto reds = new RedsState;
+
+ reds->config = g_new0(RedServerConfig, 1);
+ reds->config->default_channel_security =
+ SPICE_CHANNEL_SECURITY_NONE | SPICE_CHANNEL_SECURITY_SSL;
+ reds->config->renderers = g_array_sized_new(FALSE, TRUE, sizeof(uint32_t), RED_RENDERER_LAST);
+ reds->config->spice_port = -1;
+ reds->config->spice_secure_port = -1;
+ reds->config->spice_listen_socket_fd = -1;
+ reds->config->spice_family = PF_UNSPEC;
+ reds->config->sasl_enabled = 0; // sasl disabled by default
+#if HAVE_SASL
+ reds->config->sasl_appname = NULL; // default to "spice" if NULL
+#endif
+ reds->config->spice_uuid_is_set = FALSE;
+ memset(reds->config->spice_uuid, 0, sizeof(reds->config->spice_uuid));
+ reds->config->ticketing_enabled = TRUE; /* ticketing enabled by default */
+ reds->config->streaming_video = SPICE_STREAM_VIDEO_FILTER;
+ reds->config->video_codecs = g_array_new(FALSE, FALSE, sizeof(RedVideoCodec));
+ reds->config->image_compression = SPICE_IMAGE_COMPRESSION_AUTO_GLZ;
+ reds->config->playback_compression = TRUE;
+ reds->config->jpeg_state = SPICE_WAN_COMPRESSION_AUTO;
+ reds->config->zlib_glz_state = SPICE_WAN_COMPRESSION_AUTO;
+ reds->config->agent_mouse = TRUE;
+ reds->config->agent_copypaste = TRUE;
+ reds->config->agent_file_xfer = TRUE;
+ reds->config->exit_on_disconnect = FALSE;
+#ifdef RED_STATISTICS
+ reds->stat_file = stat_file_new(REDS_MAX_STAT_NODES);
+ /* Create an initial node. This will be the 0 node making easier
+ * to initialize node references.
+ */
+ stat_file_add_node(reds->stat_file, INVALID_STAT_REF, "default_channel", TRUE);
+#endif
+ reds->listen_socket = -1;
+ reds->secure_listen_socket = -1;
+
+ /* This environment was in red-worker so the "WORKER" in it.
+ * For compatibility reason we maintain the old name */
+ record_filename = getenv("SPICE_WORKER_RECORD_FILENAME");
+ if (record_filename) {
+ reds->record = red_record_new(record_filename);
+ }
+ return reds;
+}
+
+struct EnumNames {
+ uint32_t id;
+ const char *name;
+};
+
+static gboolean get_name_index(const EnumNames names[], const char *name, uint32_t *index)
+{
+ if (name) {
+ int i;
+ for (i = 0; names[i].name; i++) {
+ if (strcmp(name, names[i].name) == 0) {
+ *index = i;
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+
+/* returns NULL if index is invalid. */
+static const char *get_index_name(const EnumNames names[], uint32_t index)
+{
+ while (names->name != nullptr && names->id != index) {
+ names++;
+ }
+
+ return names->name;
+}
+
+static const EnumNames renderer_names[] = {
+ {RED_RENDERER_SW, "sw"},
+ {RED_RENDERER_INVALID, nullptr},
+};
+
+static gboolean reds_add_renderer(RedsState *reds, const char *name)
+{
+ uint32_t index;
+
+ if (reds->config->renderers->len == RED_RENDERER_LAST ||
+ !get_name_index(renderer_names, name, &index)) {
+ return FALSE;
+ }
+ g_array_append_val(reds->config->renderers, renderer_names[index].id);
+ return TRUE;
+}
+
+static const EnumNames video_encoder_names[] = {
+ {0, "spice"},
+ {1, "gstreamer"},
+ {0, nullptr},
+};
+
+static const new_video_encoder_t video_encoder_procs[] = {
+ &mjpeg_encoder_new,
+#if defined(HAVE_GSTREAMER_1_0)
+ &gstreamer_encoder_new,
+#else
+ nullptr,
+#endif
+};
+
+static const EnumNames video_codec_names[] = {
+ {SPICE_VIDEO_CODEC_TYPE_MJPEG, "mjpeg"},
+ {SPICE_VIDEO_CODEC_TYPE_VP8, "vp8"},
+ {SPICE_VIDEO_CODEC_TYPE_H264, "h264"},
+ {SPICE_VIDEO_CODEC_TYPE_VP9, "vp9"},
+ {0, nullptr},
+};
+
+static const int video_codec_caps[] = {
+ SPICE_DISPLAY_CAP_CODEC_MJPEG,
+ SPICE_DISPLAY_CAP_CODEC_VP8,
+ SPICE_DISPLAY_CAP_CODEC_H264,
+ SPICE_DISPLAY_CAP_CODEC_VP9,
+};
+
+char *reds_get_video_codec_fullname(RedVideoCodec *codec)
+{
+ int i;
+ const char *encoder_name = nullptr;
+ const char *codec_name = get_index_name(video_codec_names, codec->type);
+
+ spice_assert(codec_name);
+
+ for (i = 0; i < G_N_ELEMENTS(video_encoder_procs); i++) {
+ if (video_encoder_procs[i] == codec->create) {
+ encoder_name = get_index_name(video_encoder_names, i);
+ break;
+ }
+ }
+ spice_assert(encoder_name);
+
+ return g_strdup_printf("%s:%s", encoder_name, codec_name);
+}
+
+/* Parses the given codec string and returns newly-allocated strings describing
+ * the next encoder and codec in the list. These strings must be freed by the
+ * caller.
+ *
+ * @codecs: a codec string in the following format: encoder:codec;encoder:codec
+ * @encoder: a location to return the parsed encoder
+ * @codec: a location to return the parsed codec
+ * @return the position of the next codec in the string
+ */
+static char* parse_next_video_codec(char *codecs, char **encoder, char **codec)
+{
+ if (!codecs) {
+ return nullptr;
+ }
+ codecs += strspn(codecs, ";");
+ if (!*codecs) {
+ return nullptr;
+ }
+ int end_encoder, end_codec = -1;
+ *encoder = *codec = nullptr;
+ if (sscanf(codecs, "%*[0-9a-zA-Z_]:%n%*[0-9a-zA-Z_];%n", &end_encoder, &end_codec) == 0
+ && end_codec > 0) {
+ codecs[end_encoder - 1] = '\0';
+ codecs[end_codec - 1] = '\0';
+ *encoder = codecs;
+ *codec = codecs + end_encoder;
+ return codecs + end_codec;
+ }
+ return codecs + strcspn(codecs, ";");
+}
+
+/* Enable the encoders/codecs from the list specified in @codecs.
+ *
+ * @reds: the #RedsState to modify
+ * @codecs: a codec string in the following format: encoder:codec;encoder:codec
+ * @installed: (optional): a location to return the number of codecs successfull installed
+ * @return -1 if @codecs is %NULL (@installed is not modified) or the number of invalid
+ * encoders/codecs found in @codecs.
+ */
+static int reds_set_video_codecs_from_string(RedsState *reds, const char *codecs,
+ unsigned int *installed)
+{
+ char *encoder_name, *codec_name;
+ GArray *video_codecs;
+ int invalid_codecs = 0;
+
+ g_return_val_if_fail(codecs != nullptr, -1);
+
+ if (strcmp(codecs, "auto") == 0) {
+ codecs = default_video_codecs;
+ }
+
+ video_codecs = g_array_new(FALSE, FALSE, sizeof(RedVideoCodec));
+ char *codecs_copy = g_strdup_printf("%s;", codecs);
+ char *c = codecs_copy;
+ while ( (c = parse_next_video_codec(c, &encoder_name, &codec_name)) ) {
+ uint32_t encoder_index, codec_index;
+ if (!encoder_name || !codec_name) {
+ spice_warning("spice: invalid encoder:codec value at %s", codecs);
+ invalid_codecs++;
+
+ } else if (!get_name_index(video_encoder_names, encoder_name, &encoder_index)){
+ spice_warning("spice: unknown video encoder %s", encoder_name);
+ invalid_codecs++;
+
+ } else if (!get_name_index(video_codec_names, codec_name, &codec_index)) {
+ spice_warning("spice: unknown video codec %s", codec_name);
+ invalid_codecs++;
+
+ } else if (!video_encoder_procs[encoder_index]) {
+ spice_warning("spice: unsupported video encoder %s", encoder_name);
+ invalid_codecs++;
+
+ } else {
+ RedVideoCodec new_codec;
+ new_codec.create = video_encoder_procs[encoder_index];
+ new_codec.type = static_cast<SpiceVideoCodecType>(video_codec_names[codec_index].id);
+ new_codec.cap = video_codec_caps[codec_index];
+ g_array_append_val(video_codecs, new_codec);
+ }
+
+ codecs = c;
+ }
+
+ if (installed) {
+ *installed = video_codecs->len;
+ }
+
+ if (video_codecs->len == 0) {
+ spice_warning("Failed to set video codecs, input string: '%s'", codecs);
+ g_array_unref(video_codecs);
+ } else {
+ reds_set_video_codecs(reds, video_codecs);
+ }
+
+ g_free(codecs_copy);
+
+ return invalid_codecs;
+}
+
+SPICE_GNUC_VISIBLE int spice_server_init(SpiceServer *reds, SpiceCoreInterface *core)
+{
+ int ret;
+
+ ret = do_spice_init(reds, core);
+ if (reds->config->renderers->len == 0) {
+ reds_add_renderer(reds, default_renderer);
+ }
+ if (reds->config->video_codecs->len == 0) {
+ reds_set_video_codecs_from_string(reds, default_video_codecs, nullptr);
+ }
+ return ret;
+}
+
+static void reds_config_free(RedServerConfig *config)
+{
+ ChannelSecurityOptions *curr, *next;
+
+ reds_mig_release(config);
+ for (curr = config->channels_security; curr; curr = next) {
+ next = curr->next;
+ g_free(curr);
+ }
+#if HAVE_SASL
+ g_free(config->sasl_appname);
+#endif
+ g_free(config->spice_name);
+ g_array_unref(config->renderers);
+ g_array_unref(config->video_codecs);
+ g_free(config);
+}
+
+SPICE_GNUC_VISIBLE void spice_server_destroy(SpiceServer *reds)
+{
+ /* remove the server from the list of servers so that we don't attempt to
+ * free it again at exit */
+ pthread_mutex_lock(&global_reds_lock);
+ servers = g_list_remove(servers, reds);
+ pthread_mutex_unlock(&global_reds_lock);
+
+ // avoids any possible new connection to happen
+ reds_cleanup_net(reds);
+
+ // disconnect all connected client
+ reds_disconnect(reds);
+
+ std::for_each(reds->qxl_instances.begin(), reds->qxl_instances.end(), red_qxl_destroy);
+
+ if (reds->inputs_channel) {
+ reds->inputs_channel->destroy();
+ }
+ /* This requires a bit of explanation on how reference counting is
+ * not enough. The full reply is in docs/spice_threading_model.txt,
+ * mainly the RedChannels are owned by both RedsState and
+ * RedChannelClient so we need both to get destroyed. This call
+ * remove RedChannelClients */
+ if (reds->main_channel) {
+ reds->main_channel->destroy();
+ }
+ red_timer_remove(reds->mig_timer);
+
+ if (reds->ctx) {
+ SSL_CTX_free(reds->ctx);
+ }
+
+ reds->main_dispatcher.reset();
+ reds->agent_dev.reset();
+
+ // NOTE: don't replace with g_list_free_full as this function that passed callback
+ // don't change the list while unreferencing in this case will change it.
+ reds->char_devices.clear();
+
+ spice_buffer_free(&reds->client_monitors_config);
+ red_record_unref(reds->record);
+ reds_cleanup(reds);
+#ifdef RED_STATISTICS
+ stat_file_free(reds->stat_file);
+#endif
+
+ reds_config_free(reds->config);
+ delete reds;
+}
+
+SPICE_GNUC_VISIBLE spice_compat_version_t spice_get_current_compat_version(void)
+{
+ return SPICE_COMPAT_VERSION_CURRENT;
+}
+
+SPICE_GNUC_VISIBLE int spice_server_set_compat_version(SpiceServer *reds,
+ spice_compat_version_t version)
+{
+ if (version < SPICE_COMPAT_VERSION_0_6) {
+ /* We don't support 0.4 compat mode atm */
+ return -1;
+ }
+
+ if (version > SPICE_COMPAT_VERSION_CURRENT) {
+ /* Not compatible with future versions */
+ return -1;
+ }
+ return 0;
+}
+
+SPICE_GNUC_VISIBLE int spice_server_set_port(SpiceServer *reds, int port)
+{
+ if (port < 0 || port > 0xffff) {
+ return -1;
+ }
+ reds->config->spice_port = port;
+ return 0;
+}
+
+SPICE_GNUC_VISIBLE void spice_server_set_addr(SpiceServer *reds, const char *addr, int flags)
+{
+ g_strlcpy(reds->config->spice_addr, addr, sizeof(reds->config->spice_addr));
+
+ if (flags == SPICE_ADDR_FLAG_IPV4_ONLY) {
+ reds->config->spice_family = PF_INET;
+ } else if (flags == SPICE_ADDR_FLAG_IPV6_ONLY) {
+ reds->config->spice_family = PF_INET6;
+ } else if (flags == SPICE_ADDR_FLAG_UNIX_ONLY) {
+ reds->config->spice_family = AF_UNIX;
+ } else if (flags != 0) {
+ spice_warning("unknown address flag: 0x%X", flags);
+ }
+}
+
+SPICE_GNUC_VISIBLE int spice_server_set_listen_socket_fd(SpiceServer *s, int listen_fd)
+{
+ s->config->spice_listen_socket_fd = listen_fd;
+ return 0;
+}
+
+SPICE_GNUC_VISIBLE int spice_server_set_exit_on_disconnect(SpiceServer *s, int flag)
+{
+ s->config->exit_on_disconnect = !!flag;
+ return 0;
+}
+
+SPICE_GNUC_VISIBLE int spice_server_set_noauth(SpiceServer *s)
+{
+ memset(s->config->taTicket.password, 0, sizeof(s->config->taTicket.password));
+ s->config->ticketing_enabled = FALSE;
+ return 0;
+}
+
+SPICE_GNUC_VISIBLE int spice_server_set_sasl(SpiceServer *s, int enabled)
+{
+#if HAVE_SASL
+ s->config->sasl_enabled = enabled;
+ return 0;
+#else
+ return -1;
+#endif
+}
+
+SPICE_GNUC_VISIBLE int spice_server_set_sasl_appname(SpiceServer *s, const char *appname)
+{
+#if HAVE_SASL
+ g_free(s->config->sasl_appname);
+ s->config->sasl_appname = g_strdup(appname);
+ return 0;
+#else
+ return -1;
+#endif
+}
+
+SPICE_GNUC_VISIBLE void spice_server_set_name(SpiceServer *s, const char *name)
+{
+ g_free(s->config->spice_name);
+ s->config->spice_name = g_strdup(name);
+}
+
+SPICE_GNUC_VISIBLE void spice_server_set_uuid(SpiceServer *s, const uint8_t uuid[16])
+{
+ memcpy(s->config->spice_uuid, uuid, sizeof(s->config->spice_uuid));
+ s->config->spice_uuid_is_set = TRUE;
+}
+
+SPICE_GNUC_VISIBLE int spice_server_set_ticket(SpiceServer *reds,
+ const char *passwd, int lifetime,
+ int fail_if_connected,
+ int disconnect_if_connected)
+{
+ if (reds_main_channel_connected(reds)) {
+ if (fail_if_connected) {
+ return -1;
+ }
+ if (disconnect_if_connected) {
+ reds_disconnect(reds);
+ }
+ }
+
+ on_activating_ticketing(reds);
+ reds->config->ticketing_enabled = TRUE;
+ if (lifetime == 0) {
+ reds->config->taTicket.expiration_time = std::numeric_limits<time_t>::max();
+ } else {
+ time_t now = spice_get_monotonic_time_ns() / NSEC_PER_SEC;
+ reds->config->taTicket.expiration_time = now + lifetime;
+ }
+ if (passwd != nullptr) {
+ if (strlen(passwd) > SPICE_MAX_PASSWORD_LENGTH)
+ return -1;
+ g_strlcpy(reds->config->taTicket.password, passwd, sizeof(reds->config->taTicket.password));
+ } else {
+ memset(reds->config->taTicket.password, 0, sizeof(reds->config->taTicket.password));
+ reds->config->taTicket.expiration_time = 0;
+ }
+ return 0;
+}
+
+SPICE_GNUC_VISIBLE int spice_server_set_tls(SpiceServer *s, int port,
+ const char *ca_cert_file, const char *certs_file,
+ const char *private_key_file, const char *key_passwd,
+ const char *dh_key_file, const char *ciphersuite)
+{
+ if (port == 0 || ca_cert_file == nullptr || certs_file == nullptr ||
+ private_key_file == nullptr) {
+ return -1;
+ }
+ if (port < 0 || port > 0xffff) {
+ return -1;
+ }
+ memset(&s->config->ssl_parameters, 0, sizeof(s->config->ssl_parameters));
+
+ s->config->spice_secure_port = port;
+ g_strlcpy(s->config->ssl_parameters.ca_certificate_file, ca_cert_file,
+ sizeof(s->config->ssl_parameters.ca_certificate_file));
+ g_strlcpy(s->config->ssl_parameters.certs_file, certs_file,
+ sizeof(s->config->ssl_parameters.certs_file));
+ g_strlcpy(s->config->ssl_parameters.private_key_file, private_key_file,
+ sizeof(s->config->ssl_parameters.private_key_file));
+
+ if (key_passwd) {
+ g_strlcpy(s->config->ssl_parameters.keyfile_password, key_passwd,
+ sizeof(s->config->ssl_parameters.keyfile_password));
+ }
+ if (ciphersuite) {
+ g_strlcpy(s->config->ssl_parameters.ciphersuite, ciphersuite,
+ sizeof(s->config->ssl_parameters.ciphersuite));
+ }
+ if (dh_key_file) {
+ g_strlcpy(s->config->ssl_parameters.dh_key_file, dh_key_file,
+ sizeof(s->config->ssl_parameters.dh_key_file));
+ }
+ return 0;
+}
+
+SPICE_GNUC_VISIBLE int spice_server_set_image_compression(SpiceServer *s,
+ SpiceImageCompression comp)
+{
+#ifndef USE_LZ4
+ if (comp == SPICE_IMAGE_COMPRESSION_LZ4) {
+ spice_warning("LZ4 compression not supported, falling back to auto GLZ");
+ comp = SPICE_IMAGE_COMPRESSION_AUTO_GLZ;
+ reds_config_set_image_compression(s, comp);
+ return -1;
+ }
+#endif
+ reds_config_set_image_compression(s, comp);
+ return 0;
+}
+
+SPICE_GNUC_VISIBLE SpiceImageCompression spice_server_get_image_compression(SpiceServer *s)
+{
+ return s->config->image_compression;
+}
+
+SPICE_GNUC_VISIBLE int spice_server_set_jpeg_compression(SpiceServer *s, spice_wan_compression_t comp)
+{
+ if (comp == SPICE_WAN_COMPRESSION_INVALID) {
+ spice_error("invalid jpeg state");
+ return -1;
+ }
+ // todo: support dynamically changing the state
+ s->config->jpeg_state = comp;
+ return 0;
+}
+
+SPICE_GNUC_VISIBLE int spice_server_set_zlib_glz_compression(SpiceServer *s, spice_wan_compression_t comp)
+{
+ if (comp == SPICE_WAN_COMPRESSION_INVALID) {
+ spice_error("invalid zlib_glz state");
+ return -1;
+ }
+ // todo: support dynamically changing the state
+ s->config->zlib_glz_state = comp;
+ return 0;
+}
+
+SPICE_GNUC_VISIBLE int spice_server_set_channel_security(SpiceServer *s, const char *channel, int security)
+{
+ int type;
+ if (channel == nullptr) {
+ s->config->default_channel_security = security;
+ return 0;
+ }
+ type = red_channel_name_to_type(channel);
+#ifndef USE_SMARTCARD
+ if (type == SPICE_CHANNEL_SMARTCARD) {
+ type = -1;
+ }
+#endif
+ if (type == -1) {
+ return -1;
+ }
+
+ reds_set_one_channel_security(s, type, security);
+ return 0;
+}
+
+/* very obsolete and old function, retain only for ABI */
+SPICE_GNUC_VISIBLE int spice_server_get_sock_info(SpiceServer *reds, struct sockaddr *sa, socklen_t *salen)
+{
+ return -1;
+}
+
+/* very obsolete and old function, retain only for ABI */
+SPICE_GNUC_VISIBLE int spice_server_get_peer_info(SpiceServer *reds, struct sockaddr *sa, socklen_t *salen)
+{
+ return -1;
+}
+
+SPICE_GNUC_VISIBLE int spice_server_is_server_mouse(SpiceServer *reds)
+{
+ return reds->mouse_mode == SPICE_MOUSE_MODE_SERVER;
+}
+
+SPICE_GNUC_VISIBLE int spice_server_add_renderer(SpiceServer *reds, const char *name)
+{
+ if (!reds_add_renderer(reds, name)) {
+ return -1;
+ }
+ return 0;
+}
+
+SPICE_GNUC_VISIBLE int spice_server_set_streaming_video(SpiceServer *reds, int value)
+{
+ if (value != SPICE_STREAM_VIDEO_OFF &&
+ value != SPICE_STREAM_VIDEO_ALL &&
+ value != SPICE_STREAM_VIDEO_FILTER)
+ return -1;
+ reds->config->streaming_video = value;
+ reds_on_sv_change(reds);
+ return 0;
+}
+
+uint32_t reds_get_streaming_video(const RedsState *reds)
+{
+ return reds->config->streaming_video;
+}
+
+SPICE_GNUC_VISIBLE int spice_server_set_video_codecs(SpiceServer *reds, const char *video_codecs)
+{
+ unsigned int installed = 0;
+
+ reds_set_video_codecs_from_string(reds, video_codecs, &installed);
+
+ if (!installed) {
+ return -1;
+ }
+ reds_on_vc_change(reds);
+
+ return 0;
+}
+
+SPICE_GNUC_VISIBLE const char *spice_server_get_video_codecs(SpiceServer *reds)
+{
+ return video_codecs_to_string(reds_get_video_codecs(reds), ";");
+}
+
+SPICE_GNUC_VISIBLE void spice_server_free_video_codecs(SpiceServer *reds, const char *video_codecs)
+{
+ g_free(const_cast<char *>(video_codecs));
+}
+
+GArray* reds_get_video_codecs(const RedsState *reds)
+{
+ return reds->config->video_codecs;
+}
+
+static void reds_set_video_codecs(RedsState *reds, GArray *video_codecs)
+{
+ /* The video_codecs array is immutable */
+ g_clear_pointer(&reds->config->video_codecs, g_array_unref);
+
+ spice_return_if_fail(video_codecs != nullptr);
+
+ reds->config->video_codecs = video_codecs;
+}
+
+SPICE_GNUC_VISIBLE int spice_server_set_playback_compression(SpiceServer *reds, int enable)
+{
+ reds->config->playback_compression = !!enable;
+ snd_set_playback_compression(enable);
+ return 0;
+}
+
+SPICE_GNUC_VISIBLE int spice_server_set_agent_mouse(SpiceServer *reds, int enable)
+{
+ reds->config->agent_mouse = enable;
+ reds_update_mouse_mode(reds);
+ return 0;
+}
+
+SPICE_GNUC_VISIBLE int spice_server_set_agent_copypaste(SpiceServer *reds, int enable)
+{
+ reds->config->agent_copypaste = enable;
+ reds_update_agent_properties(reds);
+ return 0;
+}
+
+SPICE_GNUC_VISIBLE int spice_server_set_agent_file_xfer(SpiceServer *reds, int enable)
+{
+ reds->config->agent_file_xfer = enable;
+ reds_update_agent_properties(reds);
+ return 0;
+}
+
+/* returns FALSE if info is invalid */
+static int reds_set_migration_dest_info(RedsState *reds,
+ const char* dest,
+ int port, int secure_port,
+ const char* cert_subject)
+{
+ RedsMigSpice *spice_migration = nullptr;
+
+ reds_mig_release(reds->config);
+ if ((port == -1 && secure_port == -1) || !dest) {
+ return FALSE;
+ }
+
+ spice_migration = g_new0(RedsMigSpice, 1);
+ spice_migration->port = port;
+ spice_migration->sport = secure_port;
+ spice_migration->host = g_strdup(dest);
+ if (cert_subject) {
+ spice_migration->cert_subject = g_strdup(cert_subject);
+ }
+
+ reds->config->mig_spice = spice_migration;
+
+ return TRUE;
+}
+
+/* semi-seamless client migration */
+SPICE_GNUC_VISIBLE int spice_server_migrate_connect(SpiceServer *reds, const char* dest,
+ int port, int secure_port,
+ const char* cert_subject)
+{
+ SpiceMigrateInterface *sif;
+ int try_seamless;
+
+ spice_debug("trace");
+ spice_assert(reds->migration_interface);
+
+ if (reds->expect_migrate) {
+ spice_debug("consecutive calls without migration. Canceling previous call");
+ reds->main_channel->migrate_src_complete(FALSE);
+ }
+
+ sif = SPICE_UPCAST(SpiceMigrateInterface, reds->migration_interface->base.sif);
+
+ if (!reds_set_migration_dest_info(reds, dest, port, secure_port, cert_subject)) {
+ sif->migrate_connect_complete(reds->migration_interface);
+ return -1;
+ }
+
+ reds->expect_migrate = TRUE;
+
+ /*
+ * seamless migration support was added to the client after the support in
+ * agent_connect_tokens, so there shouldn't be contradicition - if
+ * the client is capable of seamless migration, it is capbable of agent_connected_tokens.
+ * The demand for agent_connected_tokens support is in order to assure that if migration
+ * occured when the agent was not connected, the tokens state after migration will still
+ * be valid (see reds_reset_vdp for more details).
+ */
+ try_seamless = reds->seamless_migration_enabled &&
+ reds->main_channel->test_remote_cap(SPICE_MAIN_CAP_AGENT_CONNECTED_TOKENS);
+ /* main channel will take care of clients that are still during migration (at target)*/
+ if (reds->main_channel->migrate_connect(reds->config->mig_spice, try_seamless)) {
+ reds_mig_started(reds);
+ } else {
+ if (reds->clients.empty()) {
+ reds_mig_release(reds->config);
+ spice_debug("no client connected");
+ }
+ sif->migrate_connect_complete(reds->migration_interface);
+ }
+
+ return 0;
+}
+
+SPICE_GNUC_VISIBLE int spice_server_migrate_info(SpiceServer *reds, const char* dest,
+ int port, int secure_port,
+ const char* cert_subject)
+{
+ spice_debug("trace");
+ spice_assert(!reds->migration_interface);
+
+ if (!reds_set_migration_dest_info(reds, dest, port, secure_port, cert_subject)) {
+ return -1;
+ }
+ return 0;
+}
+
+SPICE_GNUC_VISIBLE int spice_server_migrate_start(SpiceServer *reds)
+{
+ spice_debug("trace");
+ if (!reds->config->mig_spice) {
+ return -1;
+ }
+ return 0;
+}
+
+SPICE_GNUC_VISIBLE int spice_server_migrate_end(SpiceServer *reds, int completed)
+{
+ SpiceMigrateInterface *sif;
+ int ret = 0;
+
+ spice_debug("trace");
+
+ spice_assert(reds->migration_interface);
+
+ sif = SPICE_UPCAST(SpiceMigrateInterface, reds->migration_interface->base.sif);
+ if (completed && !reds->expect_migrate && !reds->clients.empty()) {
+ spice_warning("spice_server_migrate_info was not called, disconnecting clients");
+ reds_disconnect(reds);
+ ret = -1;
+ goto complete;
+ }
+
+ reds->expect_migrate = FALSE;
+ if (!reds_main_channel_connected(reds)) {
+ spice_debug("no peer connected");
+ goto complete;
+ }
+ reds_mig_finished(reds, completed);
+ return 0;
+complete:
+ if (sif->migrate_end_complete) {
+ sif->migrate_end_complete(reds->migration_interface);
+ }
+ return ret;
+}
+
+/* interface for switch-host migration */
+SPICE_GNUC_VISIBLE int spice_server_migrate_switch(SpiceServer *reds)
+{
+ spice_debug("trace");
+ if (reds->clients.empty()) {
+ return 0;
+ }
+ reds->expect_migrate = FALSE;
+ if (!reds->config->mig_spice) {
+ spice_warning("spice_server_migrate_switch called without migrate_info set");
+ return 0;
+ }
+ reds->main_channel->migrate_switch(reds->config->mig_spice);
+ reds_mig_release(reds->config);
+ return 0;
+}
+
+SPICE_GNUC_VISIBLE void spice_server_vm_start(SpiceServer *reds)
+{
+ reds->vm_running = TRUE;
+ for (const auto& dev: reds->char_devices) {
+ dev->start();
+ }
+ reds_on_vm_start(reds);
+}
+
+SPICE_GNUC_VISIBLE void spice_server_vm_stop(SpiceServer *reds)
+{
+ reds->vm_running = FALSE;
+ for (const auto& dev: reds->char_devices) {
+ dev->stop();
+ }
+ reds_on_vm_stop(reds);
+}
+
+SPICE_GNUC_VISIBLE void spice_server_set_seamless_migration(SpiceServer *reds, int enable)
+{
+ /* seamless migration is not supported with multiple clients */
+ reds->seamless_migration_enabled = enable && !reds->allow_multiple_clients;
+ spice_debug("seamless migration enabled=%d", enable);
+}
+
+GArray* reds_get_renderers(RedsState *reds)
+{
+ return reds->config->renderers;
+}
+
+spice_wan_compression_t reds_get_jpeg_state(const RedsState *reds)
+{
+ return reds->config->jpeg_state;
+}
+
+spice_wan_compression_t reds_get_zlib_glz_state(const RedsState *reds)
+{
+ return reds->config->zlib_glz_state;
+}
+
+SpiceCoreInterfaceInternal* reds_get_core_interface(RedsState *reds)
+{
+ return &reds->core;
+}
+
+SpiceWatch *reds_core_watch_add(RedsState *reds,
+ int fd, int event_mask,
+ SpiceWatchFunc func,
+ void *opaque)
+{
+ g_return_val_if_fail(reds != nullptr, NULL);
+ g_return_val_if_fail(reds->core.watch_add != nullptr, NULL);
+
+ return reds->core.watch_add(&reds->core, fd, event_mask, func, opaque);
+}
+
+SpiceTimer *
+reds_core_timer_add_internal(RedsState *reds,
+ SpiceTimerFunc func,
+ void *opaque)
+{
+ g_return_val_if_fail(reds != nullptr, NULL);
+ g_return_val_if_fail(reds->core.timer_add != nullptr, NULL);
+
+ return reds->core.timer_add(&reds->core, func, opaque);
+
+}
+
+void reds_update_client_mouse_allowed(RedsState *reds)
+{
+ int allow_now = FALSE;
+ int x_res = 0;
+ int y_res = 0;
+ int num_active_workers = reds->qxl_instances.size();
+
+ if (num_active_workers > 0) {
+
+ allow_now = TRUE;
+ for (const auto &qxl : reds->qxl_instances) {
+ if (red_qxl_get_allow_client_mouse(qxl, &x_res, &y_res, &allow_now)) {
+ break;
+ }
+ }
+ }
+
+ if (allow_now || allow_now != reds->dispatcher_allows_client_mouse) {
+ reds->monitor_mode.x_res = x_res;
+ reds->monitor_mode.y_res = y_res;
+ reds->dispatcher_allows_client_mouse = allow_now;
+ reds_update_mouse_mode(reds);
+ if (reds->is_client_mouse_allowed && reds->inputs_channel &&
+ reds->inputs_channel->has_tablet()) {
+ reds->inputs_channel->set_tablet_logical_size(reds->monitor_mode.x_res, reds->monitor_mode.y_res);
+ }
+ }
+}
+
+static gboolean reds_use_client_monitors_config(RedsState *reds)
+{
+ if (reds->qxl_instances.empty()) {
+ return FALSE;
+ }
+
+ return std::all_of(reds->qxl_instances.begin(), reds->qxl_instances.end(),
+ [](QXLInstance *qxl) {
+ return red_qxl_client_monitors_config(qxl, nullptr);
+ });
+}
+
+static void reds_client_monitors_config(RedsState *reds, VDAgentMonitorsConfig *monitors_config)
+{
+ for (const auto &qxl : reds->qxl_instances) {
+ if (!red_qxl_client_monitors_config(qxl, monitors_config)) {
+ /* this is a normal condition, some qemu devices might not implement it */
+ spice_debug("QXLInterface::client_monitors_config failed");
+ }
+ }
+}
+
+static int calc_compression_level(RedsState *reds)
+{
+ spice_assert(reds_get_streaming_video(reds) != SPICE_STREAM_VIDEO_INVALID);
+
+ if ((reds_get_streaming_video(reds) != SPICE_STREAM_VIDEO_OFF) ||
+ (spice_server_get_image_compression(reds) != SPICE_IMAGE_COMPRESSION_QUIC)) {
+ return 0;
+ }
+ return 1;
+}
+
+void reds_on_ic_change(RedsState *reds)
+{
+ int compression_level = calc_compression_level(reds);
+
+ for (const auto &qxl : reds->qxl_instances) {
+ red_qxl_set_compression_level(qxl, compression_level);
+ red_qxl_on_ic_change(qxl, spice_server_get_image_compression(reds));
+ }
+}
+
+void reds_on_sv_change(RedsState *reds)
+{
+ int compression_level = calc_compression_level(reds);
+
+ for (const auto &qxl : reds->qxl_instances) {
+ red_qxl_set_compression_level(qxl, compression_level);
+ red_qxl_on_sv_change(qxl, reds_get_streaming_video(reds));
+ }
+}
+
+void reds_on_vc_change(RedsState *reds)
+{
+ for (const auto &qxl : reds->qxl_instances) {
+ red_qxl_on_vc_change(qxl, reds_get_video_codecs(reds));
+ }
+}
+
+void reds_on_vm_stop(RedsState *reds)
+{
+ std::for_each(reds->qxl_instances.begin(), reds->qxl_instances.end(), red_qxl_stop);
+}
+
+void reds_on_vm_start(RedsState *reds)
+{
+ std::for_each(reds->qxl_instances.begin(), reds->qxl_instances.end(), red_qxl_start);
+}
+
+uint32_t reds_qxl_ram_size(RedsState *reds)
+{
+ QXLInstance *first;
+ if (reds->qxl_instances.empty()) {
+ return 0;
+ }
+
+ first = *reds->qxl_instances.begin();
+ return red_qxl_get_ram_size(first);
+}
+
+MainDispatcher* reds_get_main_dispatcher(RedsState *reds)
+{
+ return reds->main_dispatcher.get();
+}
+
+RedCharDeviceVDIPort::RedCharDeviceVDIPort(RedsState *reds):
+ RedCharDevice(reds, nullptr, REDS_TOKENS_TO_SEND, REDS_NUM_INTERNAL_AGENT_MESSAGES)
+{
+ priv->read_state = VDI_PORT_READ_STATE_READ_HEADER;
+ priv->receive_pos = reinterpret_cast<uint8_t *>(&priv->vdi_chunk_header);
+ priv->receive_len = sizeof(priv->vdi_chunk_header);
+
+ RedCharDeviceVDIPort *dev = this;
+
+ agent_msg_filter_init(&dev->priv->write_filter, reds->config->agent_copypaste,
+ reds->config->agent_file_xfer,
+ reds_use_client_monitors_config(reds),
+ TRUE);
+ agent_msg_filter_init(&dev->priv->read_filter, reds->config->agent_copypaste,
+ reds->config->agent_file_xfer,
+ reds_use_client_monitors_config(reds),
+ TRUE);
+}
+
+RedCharDeviceVDIPort::~RedCharDeviceVDIPort()
+{
+ /* make sure we have no other references to RedVDIReadBuf buffers */
+ reset();
+ priv->current_read_buf.reset(); // needed to pass the assert below
+ g_free(priv->mig_data);
+ spice_extra_assert(priv->num_read_buf == 0);
+}
+
+RedRecord *reds_get_record(RedsState *reds)
+{
+ if (reds->record) {
+ return red_record_ref(reds->record);
+ }
+
+ return nullptr;
+}
diff --git a/server/reds.h b/server/reds.h
index 371ba963..2dd1be82 100644
--- a/server/reds.h
+++ b/server/reds.h
@@ -15,94 +15,122 @@
License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef _H_REDS
-#define _H_REDS
+#ifndef REDS_H_
+#define REDS_H_
#include <stdint.h>
-#include <sys/uio.h>
+#include <inttypes.h>
#include <spice/vd_agent.h>
-#include <config.h>
+#include <common/marshaller.h>
+#include <common/messages.h>
+#include "char-device.h"
+#include "spice-wrapped.h"
+#include "red-channel.h"
+#include "video-encoder.h"
+#include "main-dispatcher.h"
+#include "migration-protocol.h"
-#include "common/marshaller.h"
-#include "common/messages.h"
-#include "spice.h"
-#include "red_channel.h"
-#include "migration_protocol.h"
+SPICE_BEGIN_DECLS
-struct QXLState {
- QXLInterface *qif;
- struct RedDispatcher *dispatcher;
-};
-
-struct TunnelWorker;
-struct SpiceNetWireState {
- struct TunnelWorker *worker;
-};
-
-struct SpiceMigrateState {
- int dummy;
-};
-
-typedef struct RedsMigSpice {
- char *host;
- char *cert_subject;
- int port;
- int sport;
-} RedsMigSpice;
+static inline QXLInterface * qxl_get_interface(QXLInstance *qxl)
+{
+ return SPICE_UPCAST(QXLInterface, qxl->base.sif);
+}
/* main thread only */
-void reds_handle_channel_event(int event, SpiceChannelEventInfo *info);
+void reds_handle_channel_event(RedsState *reds, int event, SpiceChannelEventInfo *info);
-void reds_disable_mm_timer(void);
-void reds_enable_mm_timer(void);
+void reds_disable_mm_time(RedsState *reds);
+void reds_enable_mm_time(RedsState *reds);
uint32_t reds_get_mm_time(void);
-void reds_set_client_mouse_allowed(int is_client_mouse_allowed,
- int x_res, int y_res);
-void reds_register_channel(RedChannel *channel);
-void reds_unregister_channel(RedChannel *channel);
-int reds_get_mouse_mode(void); // used by inputs_channel
-int reds_get_agent_mouse(void); // used by inputs_channel
-int reds_has_vdagent(void); // used by inputs channel
-void reds_handle_agent_mouse_event(const VDAgentMouseState *mouse_state); // used by inputs_channel
-
-extern struct SpiceCoreInterface *core;
+void reds_register_channel(RedsState *reds, RedChannel *channel);
+void reds_unregister_channel(RedsState *reds, RedChannel *channel);
+RedChannel *reds_find_channel(RedsState *reds, uint32_t type, uint32_t id);
+int reds_get_free_channel_id(RedsState *reds, uint32_t type);
+SpiceMouseMode reds_get_mouse_mode(RedsState *reds); // used by inputs_channel
+gboolean reds_config_get_agent_mouse(const RedsState *reds); // used by inputs_channel
+int reds_has_vdagent(RedsState *reds); // used by inputs channel
+bool reds_config_get_playback_compression(RedsState *reds); // used by playback channel
+
+void reds_send_device_display_info(RedsState *reds);
+void reds_handle_agent_mouse_event(RedsState *reds, const VDAgentMouseState *mouse_state); // used by inputs_channel
+
+GArray* reds_get_renderers(RedsState *reds);
+char *reds_get_video_codec_fullname(RedVideoCodec *codec);
+
+enum {
+ RED_RENDERER_INVALID,
+ RED_RENDERER_SW,
+
+ RED_RENDERER_LAST
+};
-// Temporary measures to make splitting reds.c to inputs_channel.c easier
+// Temporary measures to make splitting reds.c to inputs-channel.c easier
/* should be called only from main_dispatcher */
-void reds_client_disconnect(RedClient *client);
+void reds_client_disconnect(RedsState *reds, RedClient *client);
// Temporary (?) for splitting main channel
-typedef struct MainMigrateData MainMigrateData;
-void reds_marshall_migrate_data(SpiceMarshaller *m);
-void reds_fill_channels(SpiceMsgChannels *channels_info);
-int reds_num_of_channels(void);
-int reds_num_of_clients(void);
-#ifdef RED_STATISTICS
-void reds_update_stat_value(uint32_t value);
-#endif
+void reds_marshall_migrate_data(RedsState *reds, SpiceMarshaller *m);
+SpiceMsgChannels *reds_msg_channels_new(RedsState *reds);
/* callbacks from main channel messages */
-void reds_on_main_agent_start(MainChannelClient *mcc, uint32_t num_tokens);
-void reds_on_main_agent_tokens(MainChannelClient *mcc, uint32_t num_tokens);
-uint8_t *reds_get_agent_data_buffer(MainChannelClient *mcc, size_t size);
-void reds_release_agent_data_buffer(uint8_t *buf);
-void reds_on_main_agent_data(MainChannelClient *mcc, void *message, size_t size);
-void reds_on_main_migrate_connected(int seamless); //should be called when all the clients
+void reds_on_main_agent_start(RedsState *reds, MainChannelClient *mcc, uint32_t num_tokens);
+void reds_on_main_agent_tokens(RedsState *reds, MainChannelClient *mcc, uint32_t num_tokens);
+uint8_t *reds_get_agent_data_buffer(RedsState *reds, MainChannelClient *mcc, size_t size);
+void reds_release_agent_data_buffer(RedsState *reds, uint8_t *buf);
+void reds_on_main_agent_data(RedsState *reds, MainChannelClient *mcc, const void *message,
+ size_t size);
+void reds_on_main_migrate_connected(RedsState *reds, int seamless); //should be called when all the clients
// are connected to the target
-int reds_handle_migrate_data(MainChannelClient *mcc,
- SpiceMigrateDataMain *mig_data, uint32_t size);
-void reds_on_main_mouse_mode_request(void *message, size_t size);
+bool reds_handle_migrate_data(RedsState *reds, MainChannelClient *mcc,
+ SpiceMigrateDataMain *mig_data, uint32_t size);
+void reds_on_main_mouse_mode_request(RedsState *reds, void *message, size_t size);
/* migration dest side: returns whether it can support seamless migration
* with the given src migration protocol version */
-int reds_on_migrate_dst_set_seamless(MainChannelClient *mcc, uint32_t src_version);
-void reds_on_client_semi_seamless_migrate_complete(RedClient *client);
-void reds_on_client_seamless_migrate_complete(RedClient *client);
-void reds_on_main_channel_migrate(MainChannelClient *mcc);
-void reds_on_char_device_state_destroy(SpiceCharDeviceState *dev);
-
-void reds_set_client_mm_time_latency(RedClient *client, uint32_t latency);
-
+int reds_on_migrate_dst_set_seamless(RedsState *reds, MainChannelClient *mcc, uint32_t src_version);
+void reds_on_client_semi_seamless_migrate_complete(RedsState *reds, RedClient *client);
+void reds_on_client_seamless_migrate_complete(RedsState *reds, RedClient *client);
+void reds_on_main_channel_migrate(RedsState *reds, MainChannelClient *mcc);
+
+void reds_set_client_mm_time_latency(RedsState *reds, RedClient *client, uint32_t latency);
+uint32_t reds_get_streaming_video(const RedsState *reds);
+GArray* reds_get_video_codecs(const RedsState *reds);
+spice_wan_compression_t reds_get_jpeg_state(const RedsState *reds);
+spice_wan_compression_t reds_get_zlib_glz_state(const RedsState *reds);
+SpiceCoreInterfaceInternal* reds_get_core_interface(RedsState *reds);
+void reds_update_client_mouse_allowed(RedsState *reds);
+MainDispatcher* reds_get_main_dispatcher(RedsState *reds);
+
+/* Marshal VDAgentGraphicsDeviceInfo structure */
+void reds_marshall_device_display_info(RedsState *reds, SpiceMarshaller *m);
+
+/* Get the recording object stored in RedsState.
+ * You should free with red_record_unref.
+ */
+struct RedRecord *reds_get_record(RedsState *reds);
+
+/* fd watches/timers */
+SpiceWatch *reds_core_watch_add(RedsState *reds,
+ int fd, int event_mask,
+ SpiceWatchFunc func,
+ void *opaque);
+SpiceTimer *
+reds_core_timer_add_internal(RedsState *reds,
+ SpiceTimerFunc func,
+ void *opaque);
+
+SPICE_END_DECLS
+
+#ifdef __cplusplus
+template <typename T>
+inline SpiceTimer *
+reds_core_timer_add(RedsState *reds, void (*func)(T*), T *opaque)
+{
+ return reds_core_timer_add_internal(reds, (SpiceTimerFunc) func, opaque);
+}
#endif
+
+#endif /* REDS_H_ */
diff --git a/server/reds_gl_canvas.c b/server/reds_gl_canvas.c
deleted file mode 100644
index da03ee53..00000000
--- a/server/reds_gl_canvas.c
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- Copyright (C) 2011 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common/spice_common.h"
-
-#include "reds_gl_canvas.h"
-#define SPICE_CANVAS_INTERNAL
-#define SW_CANVAS_IMAGE_CACHE
-#include "common/gl_canvas.c"
-#undef SW_CANVAS_IMAGE_CACHE
-#undef SPICE_CANVAS_INTERNAL
diff --git a/server/reds_gl_canvas.h b/server/reds_gl_canvas.h
deleted file mode 100644
index c9da25c8..00000000
--- a/server/reds_gl_canvas.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- Copyright (C) 2011 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_REDS_GL_CANVAS
-#define _H_REDS_GL_CANVAS
-
-#define SPICE_CANVAS_INTERNAL
-#define SW_CANVAS_IMAGE_CACHE
-#include "common/gl_canvas.h"
-#undef SW_CANVAS_IMAGE_CACHE
-#undef SPICE_CANVAS_INTERNAL
-
-#endif
diff --git a/server/reds_stream.c b/server/reds_stream.c
deleted file mode 100644
index 4b61e316..00000000
--- a/server/reds_stream.c
+++ /dev/null
@@ -1,1060 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
-/*
- Copyright (C) 2009, 2013 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "main_dispatcher.h"
-#include "red_common.h"
-#include "reds_stream.h"
-#include "common/log.h"
-
-#include <errno.h>
-#include <netdb.h>
-#include <unistd.h>
-#include <sys/socket.h>
-
-#include <glib.h>
-
-#include <openssl/err.h>
-
-struct AsyncRead {
- RedsStream *stream;
- void *opaque;
- uint8_t *now;
- uint8_t *end;
- AsyncReadDone done;
- AsyncReadError error;
-};
-typedef struct AsyncRead AsyncRead;
-
-extern SpiceCoreInterface *core;
-
-#if HAVE_SASL
-#include <sasl/sasl.h>
-
-typedef struct RedsSASL {
- sasl_conn_t *conn;
-
- /* If we want to negotiate an SSF layer with client */
- int wantSSF :1;
- /* If we are now running the SSF layer */
- int runSSF :1;
-
- /*
- * Buffering encoded data to allow more clear data
- * to be stuffed onto the output buffer
- */
- const uint8_t *encoded;
- unsigned int encodedLength;
- unsigned int encodedOffset;
-
- SpiceBuffer inbuffer;
-
- char *username;
- char *mechlist;
- char *mechname;
-
- /* temporary data during authentication */
- unsigned int len;
- char *data;
-} RedsSASL;
-#endif
-
-struct RedsStreamPrivate {
- SSL *ssl;
-
-#if HAVE_SASL
- RedsSASL sasl;
-#endif
-
- AsyncRead async_read;
-
- /* life time of info:
- * allocated when creating RedsStream.
- * deallocated when main_dispatcher handles the SPICE_CHANNEL_EVENT_DISCONNECTED
- * event, either from same thread or by call back from main thread. */
- SpiceChannelEventInfo* info;
-
- ssize_t (*read)(RedsStream *s, void *buf, size_t nbyte);
- ssize_t (*write)(RedsStream *s, const void *buf, size_t nbyte);
- ssize_t (*writev)(RedsStream *s, const struct iovec *iov, int iovcnt);
-
-};
-
-static ssize_t stream_write_cb(RedsStream *s, const void *buf, size_t size)
-{
- return write(s->socket, buf, size);
-}
-
-static ssize_t stream_writev_cb(RedsStream *s, const struct iovec *iov, int iovcnt)
-{
- ssize_t ret = 0;
- do {
- int tosend;
- ssize_t n, expected = 0;
- int i;
-#ifdef IOV_MAX
- tosend = MIN(iovcnt, IOV_MAX);
-#else
- tosend = iovcnt;
-#endif
- for (i = 0; i < tosend; i++) {
- expected += iov[i].iov_len;
- }
- n = writev(s->socket, iov, tosend);
- if (n <= expected) {
- if (n > 0)
- ret += n;
- return ret == 0 ? n : ret;
- }
- ret += n;
- iov += tosend;
- iovcnt -= tosend;
- } while(iovcnt > 0);
-
- return ret;
-}
-
-static ssize_t stream_read_cb(RedsStream *s, void *buf, size_t size)
-{
- return read(s->socket, buf, size);
-}
-
-static ssize_t stream_ssl_write_cb(RedsStream *s, const void *buf, size_t size)
-{
- int return_code;
- SPICE_GNUC_UNUSED int ssl_error;
-
- return_code = SSL_write(s->priv->ssl, buf, size);
-
- if (return_code < 0) {
- ssl_error = SSL_get_error(s->priv->ssl, return_code);
- }
-
- return return_code;
-}
-
-static ssize_t stream_ssl_read_cb(RedsStream *s, void *buf, size_t size)
-{
- int return_code;
- SPICE_GNUC_UNUSED int ssl_error;
-
- return_code = SSL_read(s->priv->ssl, buf, size);
-
- if (return_code < 0) {
- ssl_error = SSL_get_error(s->priv->ssl, return_code);
- }
-
- return return_code;
-}
-
-void reds_stream_remove_watch(RedsStream* s)
-{
- if (s->watch) {
- core->watch_remove(s->watch);
- s->watch = NULL;
- }
-}
-
-#if HAVE_SASL
-static ssize_t reds_stream_sasl_read(RedsStream *s, uint8_t *buf, size_t nbyte);
-#endif
-
-ssize_t reds_stream_read(RedsStream *s, void *buf, size_t nbyte)
-{
- ssize_t ret;
-
-#if HAVE_SASL
- if (s->priv->sasl.conn && s->priv->sasl.runSSF) {
- ret = reds_stream_sasl_read(s, buf, nbyte);
- } else
-#endif
- ret = s->priv->read(s, buf, nbyte);
-
- return ret;
-}
-
-bool reds_stream_write_all(RedsStream *stream, const void *in_buf, size_t n)
-{
- const uint8_t *buf = (uint8_t *)in_buf;
-
- while (n) {
- int now = reds_stream_write(stream, buf, n);
- if (now <= 0) {
- if (now == -1 && (errno == EINTR || errno == EAGAIN)) {
- continue;
- }
- return FALSE;
- }
- n -= now;
- buf += now;
- }
- return TRUE;
-}
-
-#if HAVE_SASL
-static ssize_t reds_stream_sasl_write(RedsStream *s, const void *buf, size_t nbyte);
-#endif
-
-ssize_t reds_stream_write(RedsStream *s, const void *buf, size_t nbyte)
-{
- ssize_t ret;
-
-#if HAVE_SASL
- if (s->priv->sasl.conn && s->priv->sasl.runSSF) {
- ret = reds_stream_sasl_write(s, buf, nbyte);
- } else
-#endif
- ret = s->priv->write(s, buf, nbyte);
-
- return ret;
-}
-
-ssize_t reds_stream_writev(RedsStream *s, const struct iovec *iov, int iovcnt)
-{
- int i;
- int n;
- ssize_t ret = 0;
-
- if (s->priv->writev != NULL) {
- return s->priv->writev(s, iov, iovcnt);
- }
-
- for (i = 0; i < iovcnt; ++i) {
- n = reds_stream_write(s, iov[i].iov_base, iov[i].iov_len);
- if (n <= 0)
- return ret == 0 ? n : ret;
- ret += n;
- }
-
- return ret;
-}
-
-void reds_stream_free(RedsStream *s)
-{
- if (!s) {
- return;
- }
-
- reds_stream_push_channel_event(s, SPICE_CHANNEL_EVENT_DISCONNECTED);
-
-#if HAVE_SASL
- if (s->priv->sasl.conn) {
- s->priv->sasl.runSSF = s->priv->sasl.wantSSF = 0;
- s->priv->sasl.len = 0;
- s->priv->sasl.encodedLength = s->priv->sasl.encodedOffset = 0;
- s->priv->sasl.encoded = NULL;
- free(s->priv->sasl.mechlist);
- free(s->priv->sasl.mechname);
- s->priv->sasl.mechlist = NULL;
- sasl_dispose(&s->priv->sasl.conn);
- s->priv->sasl.conn = NULL;
- }
-#endif
-
- if (s->priv->ssl) {
- SSL_free(s->priv->ssl);
- }
-
- reds_stream_remove_watch(s);
- spice_info("close socket fd %d", s->socket);
- close(s->socket);
-
- free(s);
-}
-
-void reds_stream_push_channel_event(RedsStream *s, int event)
-{
- main_dispatcher_channel_event(event, s->priv->info);
-}
-
-static void reds_stream_set_socket(RedsStream *stream, int socket)
-{
- stream->socket = socket;
- /* deprecated fields. Filling them for backward compatibility */
- stream->priv->info->llen = sizeof(stream->priv->info->laddr);
- stream->priv->info->plen = sizeof(stream->priv->info->paddr);
- getsockname(stream->socket, (struct sockaddr*)(&stream->priv->info->laddr), &stream->priv->info->llen);
- getpeername(stream->socket, (struct sockaddr*)(&stream->priv->info->paddr), &stream->priv->info->plen);
-
- stream->priv->info->flags |= SPICE_CHANNEL_EVENT_FLAG_ADDR_EXT;
- stream->priv->info->llen_ext = sizeof(stream->priv->info->laddr_ext);
- stream->priv->info->plen_ext = sizeof(stream->priv->info->paddr_ext);
- getsockname(stream->socket, (struct sockaddr*)(&stream->priv->info->laddr_ext),
- &stream->priv->info->llen_ext);
- getpeername(stream->socket, (struct sockaddr*)(&stream->priv->info->paddr_ext),
- &stream->priv->info->plen_ext);
-}
-
-
-void reds_stream_set_channel(RedsStream *stream, int connection_id,
- int channel_type, int channel_id)
-{
- stream->priv->info->connection_id = connection_id;
- stream->priv->info->type = channel_type;
- stream->priv->info->id = channel_id;
-}
-
-RedsStream *reds_stream_new(int socket)
-{
- RedsStream *stream;
-
- stream = spice_malloc0(sizeof(RedsStream) + sizeof(RedsStreamPrivate));
- stream->priv = (RedsStreamPrivate *)(((char *)stream) + sizeof(RedsStream));
- stream->priv->info = spice_new0(SpiceChannelEventInfo, 1);
- reds_stream_set_socket(stream, socket);
-
- stream->priv->read = stream_read_cb;
- stream->priv->write = stream_write_cb;
- stream->priv->writev = stream_writev_cb;
-
- return stream;
-}
-
-bool reds_stream_is_ssl(RedsStream *stream)
-{
- return (stream->priv->ssl != NULL);
-}
-
-void reds_stream_set_info_flag(RedsStream *stream, unsigned int flag)
-{
- g_return_if_fail((flag == SPICE_CHANNEL_EVENT_FLAG_TLS)
- || (flag == SPICE_CHANNEL_EVENT_FLAG_ADDR_EXT));
-
- stream->priv->info->flags |= flag;
-}
-
-void reds_stream_disable_writev(RedsStream *stream)
-{
- stream->priv->writev = NULL;
-}
-
-RedsStreamSslStatus reds_stream_ssl_accept(RedsStream *stream)
-{
- int ssl_error;
- int return_code;
-
- return_code = SSL_accept(stream->priv->ssl);
- if (return_code == 1) {
- return REDS_STREAM_SSL_STATUS_OK;
- }
-
- ssl_error = SSL_get_error(stream->priv->ssl, return_code);
- if (return_code == -1 && (ssl_error == SSL_ERROR_WANT_READ ||
- ssl_error == SSL_ERROR_WANT_WRITE)) {
- if (ssl_error == SSL_ERROR_WANT_READ) {
- return REDS_STREAM_SSL_STATUS_WAIT_FOR_READ;
- } else {
- return REDS_STREAM_SSL_STATUS_WAIT_FOR_WRITE;
- }
- }
-
- ERR_print_errors_fp(stderr);
- spice_warning("SSL_accept failed, error=%d", ssl_error);
- SSL_free(stream->priv->ssl);
- stream->priv->ssl = NULL;
-
- return REDS_STREAM_SSL_STATUS_ERROR;
-}
-
-int reds_stream_enable_ssl(RedsStream *stream, SSL_CTX *ctx)
-{
- BIO *sbio;
-
- // Handle SSL handshaking
- if (!(sbio = BIO_new_socket(stream->socket, BIO_NOCLOSE))) {
- spice_warning("could not allocate ssl bio socket");
- return REDS_STREAM_SSL_STATUS_ERROR;
- }
-
- stream->priv->ssl = SSL_new(ctx);
- if (!stream->priv->ssl) {
- spice_warning("could not allocate ssl context");
- BIO_free(sbio);
- return REDS_STREAM_SSL_STATUS_ERROR;
- }
-
- SSL_set_bio(stream->priv->ssl, sbio, sbio);
-
- stream->priv->write = stream_ssl_write_cb;
- stream->priv->read = stream_ssl_read_cb;
- stream->priv->writev = NULL;
-
- return reds_stream_ssl_accept(stream);
-}
-
-void reds_stream_set_async_error_handler(RedsStream *stream,
- AsyncReadError error_handler)
-{
- stream->priv->async_read.error = error_handler;
-}
-
-static inline void async_read_clear_handlers(AsyncRead *async)
-{
- if (async->stream->watch) {
- reds_stream_remove_watch(async->stream);
- }
- async->stream = NULL;
-}
-
-static void async_read_handler(G_GNUC_UNUSED int fd,
- G_GNUC_UNUSED int event,
- void *data)
-{
- AsyncRead *async = (AsyncRead *)data;
-
- for (;;) {
- int n = async->end - async->now;
-
- spice_assert(n > 0);
- n = reds_stream_read(async->stream, async->now, n);
- if (n <= 0) {
- if (n < 0) {
- switch (errno) {
- case EAGAIN:
- if (!async->stream->watch) {
- async->stream->watch = core->watch_add(async->stream->socket,
- SPICE_WATCH_EVENT_READ,
- async_read_handler, async);
- }
- return;
- case EINTR:
- break;
- default:
- async_read_clear_handlers(async);
- if (async->error) {
- async->error(async->opaque, errno);
- }
- return;
- }
- } else {
- async_read_clear_handlers(async);
- if (async->error) {
- async->error(async->opaque, 0);
- }
- return;
- }
- } else {
- async->now += n;
- if (async->now == async->end) {
- async_read_clear_handlers(async);
- async->done(async->opaque);
- return;
- }
- }
- }
-}
-
-void reds_stream_async_read(RedsStream *stream,
- uint8_t *data, size_t size,
- AsyncReadDone read_done_cb,
- void *opaque)
-{
- AsyncRead *async = &stream->priv->async_read;
-
- g_return_if_fail(!async->stream);
- async->stream = stream;
- async->now = data;
- async->end = async->now + size;
- async->done = read_done_cb;
- async->opaque = opaque;
- async_read_handler(0, 0, async);
-
-}
-
-#if HAVE_SASL
-bool reds_stream_write_u8(RedsStream *s, uint8_t n)
-{
- return reds_stream_write_all(s, &n, sizeof(uint8_t));
-}
-
-bool reds_stream_write_u32(RedsStream *s, uint32_t n)
-{
- return reds_stream_write_all(s, &n, sizeof(uint32_t));
-}
-
-static ssize_t reds_stream_sasl_write(RedsStream *s, const void *buf, size_t nbyte)
-{
- ssize_t ret;
-
- if (!s->priv->sasl.encoded) {
- int err;
- err = sasl_encode(s->priv->sasl.conn, (char *)buf, nbyte,
- (const char **)&s->priv->sasl.encoded,
- &s->priv->sasl.encodedLength);
- if (err != SASL_OK) {
- spice_warning("sasl_encode error: %d", err);
- return -1;
- }
-
- if (s->priv->sasl.encodedLength == 0) {
- return 0;
- }
-
- if (!s->priv->sasl.encoded) {
- spice_warning("sasl_encode didn't return a buffer!");
- return 0;
- }
-
- s->priv->sasl.encodedOffset = 0;
- }
-
- ret = s->priv->write(s, s->priv->sasl.encoded + s->priv->sasl.encodedOffset,
- s->priv->sasl.encodedLength - s->priv->sasl.encodedOffset);
-
- if (ret <= 0) {
- return ret;
- }
-
- s->priv->sasl.encodedOffset += ret;
- if (s->priv->sasl.encodedOffset == s->priv->sasl.encodedLength) {
- s->priv->sasl.encoded = NULL;
- s->priv->sasl.encodedOffset = s->priv->sasl.encodedLength = 0;
- return nbyte;
- }
-
- /* we didn't flush the encoded buffer */
- errno = EAGAIN;
- return -1;
-}
-
-static ssize_t reds_stream_sasl_read(RedsStream *s, uint8_t *buf, size_t nbyte)
-{
- uint8_t encoded[4096];
- const char *decoded;
- unsigned int decodedlen;
- int err;
- int n;
-
- n = spice_buffer_copy(&s->priv->sasl.inbuffer, buf, nbyte);
- if (n > 0) {
- spice_buffer_remove(&s->priv->sasl.inbuffer, n);
- if (n == nbyte)
- return n;
- nbyte -= n;
- buf += n;
- }
-
- n = s->priv->read(s, encoded, sizeof(encoded));
- if (n <= 0) {
- return n;
- }
-
- err = sasl_decode(s->priv->sasl.conn,
- (char *)encoded, n,
- &decoded, &decodedlen);
- if (err != SASL_OK) {
- spice_warning("sasl_decode error: %d", err);
- return -1;
- }
-
- if (decodedlen == 0) {
- errno = EAGAIN;
- return -1;
- }
-
- n = MIN(nbyte, decodedlen);
- memcpy(buf, decoded, n);
- spice_buffer_append(&s->priv->sasl.inbuffer, decoded + n, decodedlen - n);
- return n;
-}
-
-static char *addr_to_string(const char *format,
- struct sockaddr_storage *sa,
- socklen_t salen)
-{
- char *addr;
- char host[NI_MAXHOST];
- char serv[NI_MAXSERV];
- int err;
- size_t addrlen;
-
- if ((err = getnameinfo((struct sockaddr *)sa, salen,
- host, sizeof(host),
- serv, sizeof(serv),
- NI_NUMERICHOST | NI_NUMERICSERV)) != 0) {
- spice_warning("Cannot resolve address %d: %s",
- err, gai_strerror(err));
- return NULL;
- }
-
- /* Enough for the existing format + the 2 vars we're
- * substituting in. */
- addrlen = strlen(format) + strlen(host) + strlen(serv);
- addr = spice_malloc(addrlen + 1);
- snprintf(addr, addrlen, format, host, serv);
- addr[addrlen] = '\0';
-
- return addr;
-}
-
-static char *reds_stream_get_local_address(RedsStream *stream)
-{
- return addr_to_string("%s;%s", &stream->priv->info->laddr_ext,
- stream->priv->info->llen_ext);
-}
-
-static char *reds_stream_get_remote_address(RedsStream *stream)
-{
- return addr_to_string("%s;%s", &stream->priv->info->paddr_ext,
- stream->priv->info->plen_ext);
-}
-
-static int auth_sasl_check_ssf(RedsSASL *sasl, int *runSSF)
-{
- const void *val;
- int err, ssf;
-
- *runSSF = 0;
- if (!sasl->wantSSF) {
- return 1;
- }
-
- err = sasl_getprop(sasl->conn, SASL_SSF, &val);
- if (err != SASL_OK) {
- return 0;
- }
-
- ssf = *(const int *)val;
- spice_info("negotiated an SSF of %d", ssf);
- if (ssf < 56) {
- return 0; /* 56 is good for Kerberos */
- }
-
- *runSSF = 1;
-
- /* We have a SSF that's good enough */
- return 1;
-}
-
-/*
- * Step Msg
- *
- * Input from client:
- *
- * u32 clientin-length
- * u8-array clientin-string
- *
- * Output to client:
- *
- * u32 serverout-length
- * u8-array serverout-strin
- * u8 continue
- */
-#define SASL_DATA_MAX_LEN (1024 * 1024)
-
-RedsSaslError reds_sasl_handle_auth_step(RedsStream *stream, AsyncReadDone read_cb, void *opaque)
-{
- const char *serverout;
- unsigned int serveroutlen;
- int err;
- char *clientdata = NULL;
- RedsSASL *sasl = &stream->priv->sasl;
- uint32_t datalen = sasl->len;
-
- /* NB, distinction of NULL vs "" is *critical* in SASL */
- if (datalen) {
- clientdata = sasl->data;
- clientdata[datalen - 1] = '\0'; /* Wire includes '\0', but make sure */
- datalen--; /* Don't count NULL byte when passing to _start() */
- }
-
- spice_info("Step using SASL Data %p (%d bytes)",
- clientdata, datalen);
- err = sasl_server_step(sasl->conn,
- clientdata,
- datalen,
- &serverout,
- &serveroutlen);
- if (err != SASL_OK &&
- err != SASL_CONTINUE) {
- spice_warning("sasl step failed %d (%s)",
- err, sasl_errdetail(sasl->conn));
- return REDS_SASL_ERROR_GENERIC;
- }
-
- if (serveroutlen > SASL_DATA_MAX_LEN) {
- spice_warning("sasl step reply data too long %d",
- serveroutlen);
- return REDS_SASL_ERROR_INVALID_DATA;
- }
-
- spice_info("SASL return data %d bytes, %p", serveroutlen, serverout);
-
- if (serveroutlen) {
- serveroutlen += 1;
- reds_stream_write_all(stream, &serveroutlen, sizeof(uint32_t));
- reds_stream_write_all(stream, serverout, serveroutlen);
- } else {
- reds_stream_write_all(stream, &serveroutlen, sizeof(uint32_t));
- }
-
- /* Whether auth is complete */
- reds_stream_write_u8(stream, err == SASL_CONTINUE ? 0 : 1);
-
- if (err == SASL_CONTINUE) {
- spice_info("%s", "Authentication must continue (step)");
- /* Wait for step length */
- reds_stream_async_read(stream, (uint8_t *)&sasl->len, sizeof(uint32_t),
- read_cb, opaque);
- return REDS_SASL_ERROR_CONTINUE;
- } else {
- int ssf;
-
- if (auth_sasl_check_ssf(sasl, &ssf) == 0) {
- spice_warning("Authentication rejected for weak SSF");
- goto authreject;
- }
-
- spice_info("Authentication successful");
- reds_stream_write_u32(stream, SPICE_LINK_ERR_OK); /* Accept auth */
-
- /*
- * Delay writing in SSF encoded until now
- */
- sasl->runSSF = ssf;
- reds_stream_disable_writev(stream); /* make sure writev isn't called directly anymore */
-
- return REDS_SASL_ERROR_OK;
- }
-
-authreject:
- reds_stream_write_u32(stream, 1); /* Reject auth */
- reds_stream_write_u32(stream, sizeof("Authentication failed"));
- reds_stream_write_all(stream, "Authentication failed", sizeof("Authentication failed"));
-
- return REDS_SASL_ERROR_AUTH_FAILED;
-}
-
-RedsSaslError reds_sasl_handle_auth_steplen(RedsStream *stream, AsyncReadDone read_cb, void *opaque)
-{
- RedsSASL *sasl = &stream->priv->sasl;
-
- spice_info("Got steplen %d", sasl->len);
- if (sasl->len > SASL_DATA_MAX_LEN) {
- spice_warning("Too much SASL data %d", sasl->len);
- return REDS_SASL_ERROR_INVALID_DATA;
- }
-
- if (sasl->len == 0) {
- read_cb(opaque);
- /* FIXME: can't report potential errors correctly here,
- * but read_cb() will have done the needed RedLinkInfo cleanups
- * if an error occurs, so the caller should not need to do more
- * treatment */
- return REDS_SASL_ERROR_OK;
- } else {
- sasl->data = spice_realloc(sasl->data, sasl->len);
- reds_stream_async_read(stream, (uint8_t *)sasl->data, sasl->len,
- read_cb, opaque);
- return REDS_SASL_ERROR_OK;
- }
-}
-
-/*
- * Start Msg
- *
- * Input from client:
- *
- * u32 clientin-length
- * u8-array clientin-string
- *
- * Output to client:
- *
- * u32 serverout-length
- * u8-array serverout-strin
- * u8 continue
- */
-
-RedsSaslError reds_sasl_handle_auth_start(RedsStream *stream, AsyncReadDone read_cb, void *opaque)
-{
- const char *serverout;
- unsigned int serveroutlen;
- int err;
- char *clientdata = NULL;
- RedsSASL *sasl = &stream->priv->sasl;
- uint32_t datalen = sasl->len;
-
- /* NB, distinction of NULL vs "" is *critical* in SASL */
- if (datalen) {
- clientdata = sasl->data;
- clientdata[datalen - 1] = '\0'; /* Should be on wire, but make sure */
- datalen--; /* Don't count NULL byte when passing to _start() */
- }
-
- spice_info("Start SASL auth with mechanism %s. Data %p (%d bytes)",
- sasl->mechlist, clientdata, datalen);
- err = sasl_server_start(sasl->conn,
- sasl->mechlist,
- clientdata,
- datalen,
- &serverout,
- &serveroutlen);
- if (err != SASL_OK &&
- err != SASL_CONTINUE) {
- spice_warning("sasl start failed %d (%s)",
- err, sasl_errdetail(sasl->conn));
- return REDS_SASL_ERROR_INVALID_DATA;
- }
-
- if (serveroutlen > SASL_DATA_MAX_LEN) {
- spice_warning("sasl start reply data too long %d",
- serveroutlen);
- return REDS_SASL_ERROR_INVALID_DATA;
- }
-
- spice_info("SASL return data %d bytes, %p", serveroutlen, serverout);
-
- if (serveroutlen) {
- serveroutlen += 1;
- reds_stream_write_all(stream, &serveroutlen, sizeof(uint32_t));
- reds_stream_write_all(stream, serverout, serveroutlen);
- } else {
- reds_stream_write_all(stream, &serveroutlen, sizeof(uint32_t));
- }
-
- /* Whether auth is complete */
- reds_stream_write_u8(stream, err == SASL_CONTINUE ? 0 : 1);
-
- if (err == SASL_CONTINUE) {
- spice_info("%s", "Authentication must continue (start)");
- /* Wait for step length */
- reds_stream_async_read(stream, (uint8_t *)&sasl->len, sizeof(uint32_t),
- read_cb, opaque);
- return REDS_SASL_ERROR_CONTINUE;
- } else {
- int ssf;
-
- if (auth_sasl_check_ssf(sasl, &ssf) == 0) {
- spice_warning("Authentication rejected for weak SSF");
- goto authreject;
- }
-
- spice_info("Authentication successful");
- reds_stream_write_u32(stream, SPICE_LINK_ERR_OK); /* Accept auth */
-
- /*
- * Delay writing in SSF encoded until now
- */
- sasl->runSSF = ssf;
- reds_stream_disable_writev(stream); /* make sure writev isn't called directly anymore */
- return REDS_SASL_ERROR_OK;
- }
-
-authreject:
- reds_stream_write_u32(stream, 1); /* Reject auth */
- reds_stream_write_u32(stream, sizeof("Authentication failed"));
- reds_stream_write_all(stream, "Authentication failed", sizeof("Authentication failed"));
-
- return REDS_SASL_ERROR_AUTH_FAILED;
-}
-
-RedsSaslError reds_sasl_handle_auth_startlen(RedsStream *stream, AsyncReadDone read_cb, void *opaque)
-{
- RedsSASL *sasl = &stream->priv->sasl;
-
- spice_info("Got client start len %d", sasl->len);
- if (sasl->len > SASL_DATA_MAX_LEN) {
- spice_warning("Too much SASL data %d", sasl->len);
- return REDS_SASL_ERROR_INVALID_DATA;
- }
-
- if (sasl->len == 0) {
- return REDS_SASL_ERROR_RETRY;
- }
-
- sasl->data = spice_realloc(sasl->data, sasl->len);
- reds_stream_async_read(stream, (uint8_t *)sasl->data, sasl->len,
- read_cb, opaque);
-
- return REDS_SASL_ERROR_OK;
-}
-
-bool reds_sasl_handle_auth_mechname(RedsStream *stream, AsyncReadDone read_cb, void *opaque)
-{
- RedsSASL *sasl = &stream->priv->sasl;
-
- sasl->mechname[sasl->len] = '\0';
- spice_info("Got client mechname '%s' check against '%s'",
- sasl->mechname, sasl->mechlist);
-
- if (strncmp(sasl->mechlist, sasl->mechname, sasl->len) == 0) {
- if (sasl->mechlist[sasl->len] != '\0' &&
- sasl->mechlist[sasl->len] != ',') {
- spice_info("One %d", sasl->mechlist[sasl->len]);
- return FALSE;
- }
- } else {
- char *offset = strstr(sasl->mechlist, sasl->mechname);
- spice_info("Two %p", offset);
- if (!offset) {
- return FALSE;
- }
- spice_info("Two '%s'", offset);
- if (offset[-1] != ',' ||
- (offset[sasl->len] != '\0'&&
- offset[sasl->len] != ',')) {
- return FALSE;
- }
- }
-
- free(sasl->mechlist);
- sasl->mechlist = spice_strdup(sasl->mechname);
-
- spice_info("Validated mechname '%s'", sasl->mechname);
-
- reds_stream_async_read(stream, (uint8_t *)&sasl->len, sizeof(uint32_t),
- read_cb, opaque);
-
- return TRUE;
-}
-
-bool reds_sasl_handle_auth_mechlen(RedsStream *stream, AsyncReadDone read_cb, void *opaque)
-{
- RedsSASL *sasl = &stream->priv->sasl;
-
- if (sasl->len < 1 || sasl->len > 100) {
- spice_warning("Got bad client mechname len %d", sasl->len);
- return FALSE;
- }
-
- sasl->mechname = spice_malloc(sasl->len + 1);
-
- spice_info("Wait for client mechname");
- reds_stream_async_read(stream, (uint8_t *)sasl->mechname, sasl->len,
- read_cb, opaque);
-
- return TRUE;
-}
-
-bool reds_sasl_start_auth(RedsStream *stream, AsyncReadDone read_cb, void *opaque)
-{
- const char *mechlist = NULL;
- sasl_security_properties_t secprops;
- int err;
- char *localAddr, *remoteAddr;
- int mechlistlen;
- RedsSASL *sasl = &stream->priv->sasl;
-
- if (!(localAddr = reds_stream_get_local_address(stream))) {
- goto error;
- }
-
- if (!(remoteAddr = reds_stream_get_remote_address(stream))) {
- free(localAddr);
- goto error;
- }
-
- err = sasl_server_new("spice",
- NULL, /* FQDN - just delegates to gethostname */
- NULL, /* User realm */
- localAddr,
- remoteAddr,
- NULL, /* Callbacks, not needed */
- SASL_SUCCESS_DATA,
- &sasl->conn);
- free(localAddr);
- free(remoteAddr);
- localAddr = remoteAddr = NULL;
-
- if (err != SASL_OK) {
- spice_warning("sasl context setup failed %d (%s)",
- err, sasl_errstring(err, NULL, NULL));
- sasl->conn = NULL;
- goto error;
- }
-
- /* Inform SASL that we've got an external SSF layer from TLS */
- if (stream->priv->ssl) {
- sasl_ssf_t ssf;
-
- ssf = SSL_get_cipher_bits(stream->priv->ssl, NULL);
- err = sasl_setprop(sasl->conn, SASL_SSF_EXTERNAL, &ssf);
- if (err != SASL_OK) {
- spice_warning("cannot set SASL external SSF %d (%s)",
- err, sasl_errstring(err, NULL, NULL));
- goto error_dispose;
- }
- } else {
- sasl->wantSSF = 1;
- }
-
- memset(&secprops, 0, sizeof secprops);
- /* Inform SASL that we've got an external SSF layer from TLS */
- if (stream->priv->ssl) {
- /* If we've got TLS (or UNIX domain sock), we don't care about SSF */
- secprops.min_ssf = 0;
- secprops.max_ssf = 0;
- secprops.maxbufsize = 8192;
- secprops.security_flags = 0;
- } else {
- /* Plain TCP, better get an SSF layer */
- secprops.min_ssf = 56; /* Good enough to require kerberos */
- secprops.max_ssf = 100000; /* Arbitrary big number */
- secprops.maxbufsize = 8192;
- /* Forbid any anonymous or trivially crackable auth */
- secprops.security_flags =
- SASL_SEC_NOANONYMOUS | SASL_SEC_NOPLAINTEXT;
- }
-
- err = sasl_setprop(sasl->conn, SASL_SEC_PROPS, &secprops);
- if (err != SASL_OK) {
- spice_warning("cannot set SASL security props %d (%s)",
- err, sasl_errstring(err, NULL, NULL));
- goto error_dispose;
- }
-
- err = sasl_listmech(sasl->conn,
- NULL, /* Don't need to set user */
- "", /* Prefix */
- ",", /* Separator */
- "", /* Suffix */
- &mechlist,
- NULL,
- NULL);
- if (err != SASL_OK || mechlist == NULL) {
- spice_warning("cannot list SASL mechanisms %d (%s)",
- err, sasl_errdetail(sasl->conn));
- goto error_dispose;
- }
-
- spice_info("Available mechanisms for client: '%s'", mechlist);
-
- sasl->mechlist = spice_strdup(mechlist);
-
- mechlistlen = strlen(mechlist);
- if (!reds_stream_write_all(stream, &mechlistlen, sizeof(uint32_t))
- || !reds_stream_write_all(stream, sasl->mechlist, mechlistlen)) {
- spice_warning("SASL mechanisms write error");
- goto error;
- }
-
- spice_info("Wait for client mechname length");
- reds_stream_async_read(stream, (uint8_t *)&sasl->len, sizeof(uint32_t),
- read_cb, opaque);
-
- return TRUE;
-
-error_dispose:
- sasl_dispose(&sasl->conn);
- sasl->conn = NULL;
-error:
- return FALSE;
-}
-#endif
diff --git a/server/reds_stream.h b/server/reds_stream.h
deleted file mode 100644
index 6cbbbbbe..00000000
--- a/server/reds_stream.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- Copyright (C) 2009, 2013 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_REDS_STREAM
-#define _H_REDS_STREAM
-
-#include "spice.h"
-#include "common/mem.h"
-
-#include <stdbool.h>
-
-#include <openssl/ssl.h>
-
-typedef void (*AsyncReadDone)(void *opaque);
-typedef void (*AsyncReadError)(void *opaque, int err);
-
-typedef struct RedsStream RedsStream;
-typedef struct RedsStreamPrivate RedsStreamPrivate;
-
-struct RedsStream {
- int socket;
- SpiceWatch *watch;
-
- /* set it to TRUE if you shutdown the socket. shutdown read doesn't work as accepted -
- receive may return data afterward. check the flag before calling receive*/
- int shutdown;
-
- RedsStreamPrivate *priv;
-};
-
-typedef enum {
- REDS_STREAM_SSL_STATUS_OK,
- REDS_STREAM_SSL_STATUS_ERROR,
- REDS_STREAM_SSL_STATUS_WAIT_FOR_READ,
- REDS_STREAM_SSL_STATUS_WAIT_FOR_WRITE
-} RedsStreamSslStatus;
-
-/* any thread */
-ssize_t reds_stream_read(RedsStream *s, void *buf, size_t nbyte);
-void reds_stream_async_read(RedsStream *stream, uint8_t *data, size_t size,
- AsyncReadDone read_done_cb, void *opaque);
-void reds_stream_set_async_error_handler(RedsStream *stream,
- AsyncReadError error_handler);
-ssize_t reds_stream_write(RedsStream *s, const void *buf, size_t nbyte);
-ssize_t reds_stream_writev(RedsStream *s, const struct iovec *iov, int iovcnt);
-bool reds_stream_write_all(RedsStream *stream, const void *in_buf, size_t n);
-bool reds_stream_write_u8(RedsStream *s, uint8_t n);
-bool reds_stream_write_u32(RedsStream *s, uint32_t n);
-void reds_stream_disable_writev(RedsStream *stream);
-void reds_stream_free(RedsStream *s);
-
-void reds_stream_push_channel_event(RedsStream *s, int event);
-void reds_stream_remove_watch(RedsStream* s);
-void reds_stream_set_channel(RedsStream *stream, int connection_id,
- int channel_type, int channel_id);
-RedsStream *reds_stream_new(int socket);
-bool reds_stream_is_ssl(RedsStream *stream);
-RedsStreamSslStatus reds_stream_ssl_accept(RedsStream *stream);
-int reds_stream_enable_ssl(RedsStream *stream, SSL_CTX *ctx);
-void reds_stream_set_info_flag(RedsStream *stream, unsigned int flag);
-
-typedef enum {
- REDS_SASL_ERROR_OK,
- REDS_SASL_ERROR_GENERIC,
- REDS_SASL_ERROR_INVALID_DATA,
- REDS_SASL_ERROR_RETRY,
- REDS_SASL_ERROR_CONTINUE,
- REDS_SASL_ERROR_AUTH_FAILED
-} RedsSaslError;
-
-RedsSaslError reds_sasl_handle_auth_step(RedsStream *stream, AsyncReadDone read_cb, void *opaque);
-RedsSaslError reds_sasl_handle_auth_steplen(RedsStream *stream, AsyncReadDone read_cb, void *opaque);
-RedsSaslError reds_sasl_handle_auth_start(RedsStream *stream, AsyncReadDone read_cb, void *opaque);
-RedsSaslError reds_sasl_handle_auth_startlen(RedsStream *stream, AsyncReadDone read_cb, void *opaque);
-bool reds_sasl_handle_auth_mechname(RedsStream *stream, AsyncReadDone read_cb, void *opaque);
-bool reds_sasl_handle_auth_mechlen(RedsStream *stream, AsyncReadDone read_cb, void *opaque);
-bool reds_sasl_start_auth(RedsStream *stream, AsyncReadDone read_cb, void *opaque);
-
-#endif
diff --git a/server/reds_sw_canvas.c b/server/reds_sw_canvas.c
deleted file mode 100644
index e7ace3b4..00000000
--- a/server/reds_sw_canvas.c
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- Copyright (C) 2011 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "common/spice_common.h"
-
-#include "reds_sw_canvas.h"
-#define SPICE_CANVAS_INTERNAL
-#define SW_CANVAS_IMAGE_CACHE
-#include "common/sw_canvas.c"
-#undef SW_CANVAS_IMAGE_CACHE
-#undef SPICE_CANVAS_INTERNAL
diff --git a/server/reds_sw_canvas.h b/server/reds_sw_canvas.h
deleted file mode 100644
index f065be53..00000000
--- a/server/reds_sw_canvas.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- Copyright (C) 2011 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifndef _H_REDS_SW_CANVAS
-#define _H_REDS_SW_CANVAS
-
-#define SPICE_CANVAS_INTERNAL
-#define SW_CANVAS_IMAGE_CACHE
-#include "common/sw_canvas.h"
-#undef SW_CANVAS_IMAGE_CACHE
-#undef SPICE_CANVAS_INTERNAL
-
-#endif
diff --git a/server/safe-list.hpp b/server/safe-list.hpp
new file mode 100644
index 00000000..77e2807c
--- /dev/null
+++ b/server/safe-list.hpp
@@ -0,0 +1,154 @@
+/*
+ Copyright (C) 2020 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+/* Implementation of a list with more "safe" iterators.
+ * Specifically the item under an iterator can be removed while scanning
+ * the list. This to allow objects in the list to delete themselves from
+ * the list.
+ */
+#pragma once
+
+#include <memory>
+#include <forward_list>
+#include <algorithm>
+#include <glib.h>
+
+#include "push-visibility.h"
+
+namespace red {
+
+template <class T>
+struct Mallocator
+{
+ typedef T value_type;
+ Mallocator() = default;
+ template <class U>
+ constexpr Mallocator(const Mallocator<U>&) noexcept
+ {
+ }
+ T* allocate(size_t n)
+ {
+ return static_cast<T*>(g_malloc_n(n, sizeof(T)));
+ }
+ void deallocate(T* p, size_t) noexcept
+ {
+ g_free(p);
+ }
+};
+
+template <class T, class U>
+bool operator==(const Mallocator<T>&, const Mallocator<U>&)
+{
+ return true;
+}
+
+template <class T, class U>
+bool operator!=(const Mallocator<T>&, const Mallocator<U>&)
+{
+ return false;
+}
+
+
+template <typename T>
+class safe_list
+{
+ typedef typename std::forward_list<T> wrapped;
+ typename std::forward_list<T,Mallocator<T>> list;
+ class iterator;
+public:
+ void push_front(const T& v)
+ {
+ list.push_front(v);
+ }
+ void remove(const T& v)
+ {
+ list.remove(v);
+ }
+ void clear()
+ {
+ list.clear();
+ }
+ void pop_front()
+ {
+ list.pop_front();
+ }
+ iterator begin() noexcept
+ {
+ return iterator(list.begin());
+ }
+ iterator end() noexcept
+ {
+ return iterator(list.end());
+ }
+ size_t size()
+ {
+ return std::distance(begin(), end());
+ }
+ bool empty() const
+ {
+ return list.empty();
+ }
+};
+
+template <typename T>
+class safe_list<T>::iterator
+{
+ typedef typename std::forward_list<T,Mallocator<T>>::iterator wrapped;
+ wrapped curr, next;
+public:
+ using iterator_category = std::forward_iterator_tag;
+ using value_type = T;
+ using difference_type = ptrdiff_t;
+ using pointer = const value_type*;
+ using reference = const value_type&;
+
+ iterator(wrapped init_curr) :
+ curr(init_curr),
+ next(init_curr != wrapped() ? ++init_curr : wrapped())
+ {
+ }
+ iterator& operator++()
+ {
+ curr = next;
+ if (next != wrapped()) {
+ ++next;
+ }
+ return *this;
+ }
+ iterator operator++(int)
+ {
+ iterator tmp(*this);
+ operator++();
+ return tmp;
+ }
+ bool operator==(const iterator& rhs) const
+ {
+ return curr == rhs.curr;
+ }
+ bool operator!=(const iterator& rhs) const
+ {
+ return curr != rhs.curr;
+ }
+ T& operator*()
+ {
+ return *curr;
+ }
+};
+
+} // namespace red
+
+#include "pop-visibility.h"
diff --git a/server/smartcard-channel-client.cpp b/server/smartcard-channel-client.cpp
new file mode 100644
index 00000000..65c402f3
--- /dev/null
+++ b/server/smartcard-channel-client.cpp
@@ -0,0 +1,308 @@
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+
+#include "smartcard-channel-client.h"
+
+struct SmartCardChannelClientPrivate
+{
+ SPICE_CXX_GLIB_ALLOCATOR
+
+ red::weak_ptr<RedCharDeviceSmartcard> smartcard;
+
+ /* read_from_client/write_to_device buffer.
+ * The beginning of the buffer should always be VSCMsgHeader*/
+ RedCharDeviceWriteBuffer *write_buf = nullptr;
+ /* was the client msg received into a RedCharDeviceWriteBuffer
+ * or was it explicitly malloced */
+ bool msg_in_write_buf = false;
+};
+
+struct RedErrorItem: public RedPipeItemNum<RED_PIPE_ITEM_TYPE_ERROR> {
+ VSCMsgHeader vheader;
+ VSCMsgError error;
+};
+
+SmartCardChannelClient::SmartCardChannelClient(RedChannel *channel,
+ RedClient *client,
+ RedStream *stream,
+ RedChannelCapabilities *caps):
+ RedChannelClient(channel, client, stream, caps)
+{
+}
+
+SmartCardChannelClient::~SmartCardChannelClient()
+{
+}
+
+SmartCardChannelClient* smartcard_channel_client_create(RedChannel *channel,
+ RedClient *client, RedStream *stream,
+ RedChannelCapabilities *caps)
+{
+ auto rcc =
+ red::make_shared<SmartCardChannelClient>(channel, client, stream, caps);
+ if (!rcc->init()) {
+ return nullptr;
+ }
+ return rcc.get();
+}
+
+uint8_t *
+SmartCardChannelClient::alloc_recv_buf(uint16_t type, uint32_t size)
+{
+ /* TODO: only one reader is actually supported. When we fix the code to support
+ * multiple readers, we will probably associate different devices to
+ * different channels */
+ if (auto smartcard = priv->smartcard.lock()) {
+ spice_assert(smartcard_get_n_readers() == 1);
+ spice_assert(smartcard_char_device_get_client(smartcard.get()));
+ spice_assert(!priv->write_buf);
+ priv->write_buf =
+ smartcard->write_buffer_get_client((RedCharDeviceClientOpaque *)this,
+ size);
+
+ if (!priv->write_buf) {
+ spice_error("failed to allocate write buffer");
+ return NULL;
+ }
+ priv->msg_in_write_buf = TRUE;
+ return priv->write_buf->buf;
+ }
+ priv->msg_in_write_buf = FALSE;
+ return (uint8_t *) g_malloc(size);
+}
+
+void
+SmartCardChannelClient::release_recv_buf(uint16_t type, uint32_t size, uint8_t *msg)
+{
+ /* todo: only one reader is actually supported. When we fix the code to support
+ * multiple readers, we will porbably associate different devices to
+ * differenc channels */
+
+ if (!priv->msg_in_write_buf) {
+ spice_assert(!priv->write_buf);
+ g_free(msg);
+ } else {
+ if (priv->write_buf) { /* msg hasn't been pushed to the guest */
+ spice_assert(priv->write_buf->buf == msg);
+ auto smartcard = priv->smartcard.lock();
+ RedCharDevice::write_buffer_release(smartcard.get(), &priv->write_buf);
+ }
+ }
+}
+
+void SmartCardChannelClient::on_disconnect()
+{
+ if (auto device = priv->smartcard.lock()) {
+ smartcard_char_device_detach_client(device.get(), this);
+ smartcard_char_device_notify_reader_remove(device.get());
+ }
+}
+
+void smartcard_channel_client_send_data(RedChannelClient *rcc,
+ SpiceMarshaller *m,
+ RedPipeItem *item,
+ VSCMsgHeader *vheader)
+{
+ spice_assert(rcc);
+ spice_assert(vheader);
+ rcc->init_send_data(SPICE_MSG_SMARTCARD_DATA);
+ /* NOTE: 'vheader' is assumed to be owned by 'item' so we keep the pipe
+ * item valid until the message is actually sent. */
+ item->add_to_marshaller(m, (uint8_t*)vheader, sizeof(VSCMsgHeader) + vheader->length);
+}
+
+void smartcard_channel_client_send_error(RedChannelClient *rcc, SpiceMarshaller *m, RedPipeItem *item)
+{
+ RedErrorItem* error_item = static_cast<RedErrorItem*>(item);
+
+ smartcard_channel_client_send_data(rcc, m, item, &error_item->vheader);
+}
+
+static void smartcard_channel_client_push_error(RedChannelClient *rcc,
+ uint32_t reader_id,
+ VSCErrorCode error)
+{
+ auto error_item = red::make_shared<RedErrorItem>();
+
+ error_item->vheader.reader_id = reader_id;
+ error_item->vheader.type = VSC_Error;
+ error_item->vheader.length = sizeof(error_item->error);
+ error_item->error.code = error;
+ rcc->pipe_add_push(error_item);
+}
+
+static void smartcard_channel_client_add_reader(SmartCardChannelClient *scc)
+{
+ auto smartcard = scc->priv->smartcard.lock();
+ if (!smartcard) { /* we already tried to attach a reader to the client
+ when it connected */
+ SpiceCharDeviceInstance *char_device = smartcard_readers_get_unattached();
+
+ if (!char_device) {
+ smartcard_channel_client_push_error(scc,
+ VSCARD_UNDEFINED_READER_ID,
+ VSC_CANNOT_ADD_MORE_READERS);
+ return;
+ }
+ smartcard_char_device_attach_client(char_device, scc);
+ smartcard = scc->priv->smartcard.lock();
+ }
+ smartcard_char_device_notify_reader_add(smartcard.get());
+ // The device sends a VSC_Error message, we will let it through, no
+ // need to send our own. We already set the correct reader_id, from
+ // our RedCharDeviceSmartcard.
+}
+
+XXX_CAST(RedCharDevice, RedCharDeviceSmartcard, RED_CHAR_DEVICE_SMARTCARD);
+
+static void smartcard_channel_client_remove_reader(SmartCardChannelClient *scc,
+ uint32_t reader_id)
+{
+ SpiceCharDeviceInstance *char_device = smartcard_readers_get(reader_id);
+ RedCharDeviceSmartcard *dev;
+
+ if (char_device == NULL) {
+ smartcard_channel_client_push_error(scc,
+ reader_id, VSC_GENERAL_ERROR);
+ return;
+ }
+
+ dev = RED_CHAR_DEVICE_SMARTCARD(char_device->st);
+ spice_assert(scc->priv->smartcard.lock().get() == dev);
+ if (!smartcard_char_device_notify_reader_remove(dev)) {
+ smartcard_channel_client_push_error(scc,
+ reader_id, VSC_GENERAL_ERROR);
+ return;
+ }
+}
+
+static void smartcard_channel_client_write_to_reader(SmartCardChannelClient *scc)
+{
+ g_return_if_fail(scc);
+
+ smartcard_channel_write_to_reader(scc->priv->write_buf);
+ scc->priv->write_buf = NULL;
+}
+
+
+bool SmartCardChannelClient::handle_message(uint16_t type, uint32_t size, void *message)
+{
+ VSCMsgHeader* vheader = (VSCMsgHeader*) message;
+
+ if (type != SPICE_MSGC_SMARTCARD_DATA) {
+ /* Handles seamless migration protocol. Also handles ack's */
+ return RedChannelClient::handle_message(type, size, message);
+ }
+
+ switch (vheader->type) {
+ case VSC_ReaderAdd:
+ smartcard_channel_client_add_reader(this);
+ return TRUE;
+ break;
+ case VSC_ReaderRemove:
+ smartcard_channel_client_remove_reader(this, vheader->reader_id);
+ return TRUE;
+ break;
+ case VSC_Init:
+ // ignore - we should never get this anyway
+ return TRUE;
+ break;
+ case VSC_Error:
+ case VSC_ATR:
+ case VSC_CardRemove:
+ case VSC_APDU:
+ break; // passed on to device
+ default:
+ red_channel_warning(get_channel(),
+ "ERROR: unexpected message on smartcard channel");
+ return TRUE;
+ }
+
+ /* todo: fix */
+ if (vheader->reader_id >= smartcard_get_n_readers()) {
+ red_channel_warning(get_channel(),
+ "ERROR: received message for non existing reader: %d, %d, %d",
+ vheader->reader_id, vheader->type, vheader->length);
+ return FALSE;
+ }
+ spice_assert(priv->write_buf->buf_size >= size);
+ memcpy(priv->write_buf->buf, message, size);
+ smartcard_channel_client_write_to_reader(this);
+
+ return TRUE;
+}
+
+bool SmartCardChannelClient::handle_migrate_data(uint32_t size, void *message)
+{
+ SmartCardChannelClient *scc = this;
+ SpiceMigrateDataHeader *header;
+ SpiceMigrateDataSmartcard *mig_data;
+
+ header = (SpiceMigrateDataHeader *)message;
+ mig_data = (SpiceMigrateDataSmartcard *)(header + 1);
+ if (size < sizeof(SpiceMigrateDataHeader) + sizeof(SpiceMigrateDataSmartcard)) {
+ spice_error("bad message size");
+ return FALSE;
+ }
+ if (!migration_protocol_validate_header(header,
+ SPICE_MIGRATE_DATA_SMARTCARD_MAGIC,
+ SPICE_MIGRATE_DATA_SMARTCARD_VERSION)) {
+ spice_error("bad header");
+ return FALSE;
+ }
+
+ if (!mig_data->base.connected) { /* client wasn't attached to a smartcard */
+ return TRUE;
+ }
+
+ auto smartcard = scc->priv->smartcard.lock();
+ if (!smartcard) {
+ SpiceCharDeviceInstance *char_device = smartcard_readers_get_unattached();
+
+ if (!char_device) {
+ spice_warning("no unattached device available");
+ return TRUE;
+ } else {
+ smartcard_char_device_attach_client(char_device, scc);
+ }
+ smartcard = scc->priv->smartcard.lock();
+ }
+ spice_debug("reader added %d partial read_size %u", mig_data->reader_added, mig_data->read_size);
+
+ if (smartcard) {
+ return smartcard_char_device_handle_migrate_data(smartcard.get(), mig_data);
+ }
+ return TRUE;
+}
+
+void SmartCardChannelClient::handle_migrate_flush_mark()
+{
+ pipe_add_type(RED_PIPE_ITEM_TYPE_SMARTCARD_MIGRATE_DATA);
+}
+
+void smartcard_channel_client_set_char_device(SmartCardChannelClient *scc,
+ RedCharDeviceSmartcard *device)
+{
+ scc->priv->smartcard.reset(device);
+}
+
+red::shared_ptr<RedCharDeviceSmartcard>
+smartcard_channel_client_get_char_device(SmartCardChannelClient *scc)
+{
+ return scc->priv->smartcard.lock();
+}
diff --git a/server/smartcard-channel-client.h b/server/smartcard-channel-client.h
new file mode 100644
index 00000000..dd31018f
--- /dev/null
+++ b/server/smartcard-channel-client.h
@@ -0,0 +1,70 @@
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef SMARTCARD_CHANNEL_CLIENT_H_
+#define SMARTCARD_CHANNEL_CLIENT_H_
+
+#include "smartcard.h"
+#include "utils.hpp"
+
+#include "push-visibility.h"
+
+struct SmartCardChannelClientPrivate;
+
+class SmartCardChannelClient final: public RedChannelClient
+{
+protected:
+ ~SmartCardChannelClient();
+public:
+ red::unique_link<SmartCardChannelClientPrivate> priv;
+ SmartCardChannelClient(RedChannel *channel,
+ RedClient *client,
+ RedStream *stream,
+ RedChannelCapabilities *caps);
+
+private:
+ virtual uint8_t *alloc_recv_buf(uint16_t type, uint32_t size) override;
+ virtual void release_recv_buf(uint16_t type, uint32_t size, uint8_t *msg) override;
+ virtual void on_disconnect() override;
+ virtual bool handle_message(uint16_t type, uint32_t size, void *message) override;
+ virtual void send_item(RedPipeItem *item) override;
+ virtual bool handle_migrate_data(uint32_t size, void *message) override;
+ virtual void handle_migrate_flush_mark() override;
+};
+
+SmartCardChannelClient* smartcard_channel_client_create(RedChannel *channel,
+ RedClient *client, RedStream *stream,
+ RedChannelCapabilities *caps);
+
+void smartcard_channel_client_send_data(RedChannelClient *rcc,
+ SpiceMarshaller *m,
+ RedPipeItem *item,
+ VSCMsgHeader *vheader);
+
+void smartcard_channel_client_send_error(RedChannelClient *rcc,
+ SpiceMarshaller *m,
+ RedPipeItem *item);
+
+void smartcard_channel_client_set_char_device(SmartCardChannelClient *scc,
+ RedCharDeviceSmartcard *device);
+
+red::shared_ptr<RedCharDeviceSmartcard>
+smartcard_channel_client_get_char_device(SmartCardChannelClient *scc);
+
+#include "pop-visibility.h"
+
+#endif /* SMARTCARD_CHANNEL_CLIENT_H_ */
diff --git a/server/smartcard.c b/server/smartcard.c
deleted file mode 100644
index aad22aad..00000000
--- a/server/smartcard.c
+++ /dev/null
@@ -1,859 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
-/*
- Copyright (C) 2010 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <arpa/inet.h>
-#include <vscard_common.h>
-
-#include "reds.h"
-#include "char_device.h"
-#include "red_channel.h"
-#include "smartcard.h"
-#include "migration_protocol.h"
-
-/*
- * TODO: the code doesn't really support multiple readers.
- * For example: smartcard_char_device_add_to_readers calls smartcard_init,
- * which can be called only once.
- * We should allow different readers, at least one reader per client.
- * In addition the implementation should be changed: instead of one channel for
- * all readers, we need to have different channles for different readers,
- * similarly to spicevmc.
- *
- */
-#define SMARTCARD_MAX_READERS 10
-
-typedef struct SmartCardDeviceState SmartCardDeviceState;
-
-typedef struct SmartCardChannelClient {
- RedChannelClient base;
- SmartCardDeviceState *smartcard_state;
-
- /* read_from_client/write_to_device buffer.
- * The beginning of the buffer should always be VSCMsgHeader*/
- SpiceCharDeviceWriteBuffer *write_buf;
- int msg_in_write_buf; /* was the client msg received into a SpiceCharDeviceWriteBuffer
- * or was it explicitly malloced */
-} SmartCardChannelClient;
-
-struct SmartCardDeviceState {
- SpiceCharDeviceState *chardev_st;
- uint32_t reader_id;
- /* read_from_device buffer */
- uint8_t *buf;
- uint32_t buf_size;
- uint8_t *buf_pos;
- uint32_t buf_used;
-
- SmartCardChannelClient *scc; // client providing the remote card
- int reader_added; // has reader_add been sent to the device
-};
-
-enum {
- PIPE_ITEM_TYPE_ERROR = PIPE_ITEM_TYPE_CHANNEL_BASE,
- PIPE_ITEM_TYPE_SMARTCARD_DATA,
- PIPE_ITEM_TYPE_SMARTCARD_MIGRATE_DATA,
-};
-
-typedef struct ErrorItem {
- PipeItem base;
- VSCMsgHeader vheader;
- VSCMsgError error;
-} ErrorItem;
-
-typedef struct MsgItem {
- PipeItem base;
- uint32_t refs;
-
- VSCMsgHeader* vheader;
-} MsgItem;
-
-static MsgItem *smartcard_get_vsc_msg_item(RedChannelClient *rcc, VSCMsgHeader *vheader);
-static MsgItem *smartcard_ref_vsc_msg_item(MsgItem *item);
-static void smartcard_unref_vsc_msg_item(MsgItem *item);
-static void smartcard_channel_client_pipe_add_push(RedChannelClient *rcc, PipeItem *item);
-
-typedef struct SmartCardChannel {
- RedChannel base;
-} SmartCardChannel;
-
-static struct Readers {
- uint32_t num;
- SpiceCharDeviceInstance* sin[SMARTCARD_MAX_READERS];
-} g_smartcard_readers = {0, {NULL}};
-
-static SpiceCharDeviceInstance* smartcard_readers_get_unattached(void);
-static SpiceCharDeviceInstance* smartcard_readers_get(uint32_t reader_id);
-static int smartcard_char_device_add_to_readers(SpiceCharDeviceInstance *sin);
-static void smartcard_char_device_attach_client(
- SpiceCharDeviceInstance *char_device, SmartCardChannelClient *scc);
-static void smartcard_channel_write_to_reader(SpiceCharDeviceWriteBuffer *write_buf);
-
-static MsgItem *smartcard_char_device_on_message_from_device(
- SmartCardDeviceState *state, VSCMsgHeader *header);
-static SmartCardDeviceState *smartcard_device_state_new(SpiceCharDeviceInstance *sin);
-static void smartcard_device_state_free(SmartCardDeviceState* st);
-static void smartcard_init(void);
-
-static void smartcard_read_buf_prepare(SmartCardDeviceState *state, VSCMsgHeader *vheader)
-{
- uint32_t msg_len;
-
- msg_len = ntohl(vheader->length);
- if (msg_len > state->buf_size) {
- state->buf_size = MAX(state->buf_size * 2, msg_len + sizeof(VSCMsgHeader));
- state->buf = spice_realloc(state->buf, state->buf_size);
- }
-}
-
-SpiceCharDeviceMsgToClient *smartcard_read_msg_from_device(SpiceCharDeviceInstance *sin,
- void *opaque)
-{
- SmartCardDeviceState *state = opaque;
- SpiceCharDeviceInterface *sif = SPICE_CONTAINEROF(sin->base.sif, SpiceCharDeviceInterface, base);
- VSCMsgHeader *vheader = (VSCMsgHeader*)state->buf;
- int n;
- int remaining;
- int actual_length;
-
- while ((n = sif->read(sin, state->buf_pos, state->buf_size - state->buf_used)) > 0) {
- MsgItem *msg_to_client;
-
- state->buf_pos += n;
- state->buf_used += n;
- if (state->buf_used < sizeof(VSCMsgHeader)) {
- continue;
- }
- smartcard_read_buf_prepare(state, vheader);
- actual_length = ntohl(vheader->length);
- if (state->buf_used - sizeof(VSCMsgHeader) < actual_length) {
- continue;
- }
- msg_to_client = smartcard_char_device_on_message_from_device(state, vheader);
- remaining = state->buf_used - sizeof(VSCMsgHeader) - actual_length;
- if (remaining > 0) {
- memcpy(state->buf, state->buf_pos, remaining);
- }
- state->buf_pos = state->buf;
- state->buf_used = remaining;
- if (msg_to_client) {
- return msg_to_client;
- }
- }
- return NULL;
-}
-
-static SpiceCharDeviceMsgToClient *smartcard_ref_msg_to_client(SpiceCharDeviceMsgToClient *msg,
- void *opaque)
-{
- return smartcard_ref_vsc_msg_item((MsgItem *)msg);
-}
-
-static void smartcard_unref_msg_to_client(SpiceCharDeviceMsgToClient *msg,
- void *opaque)
-{
- smartcard_unref_vsc_msg_item((MsgItem *)msg);
-}
-
-static void smartcard_send_msg_to_client(SpiceCharDeviceMsgToClient *msg,
- RedClient *client,
- void *opaque)
-{
- SmartCardDeviceState *dev = opaque;
- spice_assert(dev->scc && dev->scc->base.client == client);
- smartcard_channel_client_pipe_add_push(&dev->scc->base, &((MsgItem *)msg)->base);
-
-}
-
-static void smartcard_send_tokens_to_client(RedClient *client, uint32_t tokens, void *opaque)
-{
- spice_error("not implemented");
-}
-
-static void smartcard_remove_client(RedClient *client, void *opaque)
-{
- SmartCardDeviceState *dev = opaque;
-
- spice_printerr("smartcard state %p, client %p", dev, client);
- spice_assert(dev->scc && dev->scc->base.client == client);
- red_channel_client_shutdown(&dev->scc->base);
-}
-
-MsgItem *smartcard_char_device_on_message_from_device(SmartCardDeviceState *state,
- VSCMsgHeader *vheader)
-{
- VSCMsgHeader *sent_header;
-
- vheader->type = ntohl(vheader->type);
- vheader->length = ntohl(vheader->length);
- vheader->reader_id = ntohl(vheader->reader_id);
-
- switch (vheader->type) {
- case VSC_Init:
- return NULL;
- default:
- break;
- }
- /* We pass any VSC_Error right now - might need to ignore some? */
- if (state->reader_id == VSCARD_UNDEFINED_READER_ID && vheader->type != VSC_Init) {
- spice_printerr("error: reader_id not assigned for message of type %d", vheader->type);
- }
- if (state->scc) {
- sent_header = spice_memdup(vheader, sizeof(*vheader) + vheader->length);
- /* We patch the reader_id, since the device only knows about itself, and
- * we know about the sum of readers. */
- sent_header->reader_id = state->reader_id;
- return smartcard_get_vsc_msg_item(&state->scc->base, sent_header);
- }
- return NULL;
-}
-
-static int smartcard_char_device_add_to_readers(SpiceCharDeviceInstance *char_device)
-{
- SmartCardDeviceState *state = spice_char_device_state_opaque_get(char_device->st);
-
- if (g_smartcard_readers.num >= SMARTCARD_MAX_READERS) {
- return -1;
- }
- state->reader_id = g_smartcard_readers.num;
- g_smartcard_readers.sin[g_smartcard_readers.num++] = char_device;
- smartcard_init();
- return 0;
-}
-
-static SpiceCharDeviceInstance *smartcard_readers_get(uint32_t reader_id)
-{
- spice_assert(reader_id < g_smartcard_readers.num);
- return g_smartcard_readers.sin[reader_id];
-}
-
-/* TODO: fix implementation for multiple readers. Each reader should have a separated
- * channel */
-static SpiceCharDeviceInstance *smartcard_readers_get_unattached(void)
-{
- int i;
- SmartCardDeviceState* state;
-
- for (i = 0; i < g_smartcard_readers.num; ++i) {
- state = spice_char_device_state_opaque_get(g_smartcard_readers.sin[i]->st);
- if (!state->scc) {
- return g_smartcard_readers.sin[i];
- }
- }
- return NULL;
-}
-
-static SmartCardDeviceState *smartcard_device_state_new(SpiceCharDeviceInstance *sin)
-{
- SmartCardDeviceState *st;
- SpiceCharDeviceCallbacks chardev_cbs = { NULL, };
-
- chardev_cbs.read_one_msg_from_device = smartcard_read_msg_from_device;
- chardev_cbs.ref_msg_to_client = smartcard_ref_msg_to_client;
- chardev_cbs.unref_msg_to_client = smartcard_unref_msg_to_client;
- chardev_cbs.send_msg_to_client = smartcard_send_msg_to_client;
- chardev_cbs.send_tokens_to_client = smartcard_send_tokens_to_client;
- chardev_cbs.remove_client = smartcard_remove_client;
-
- st = spice_new0(SmartCardDeviceState, 1);
- st->chardev_st = spice_char_device_state_create(sin,
- 0, /* tokens interval */
- ~0, /* self tokens */
- &chardev_cbs,
- st);
- st->reader_id = VSCARD_UNDEFINED_READER_ID;
- st->reader_added = FALSE;
- st->buf_size = APDUBufSize + sizeof(VSCMsgHeader);
- st->buf = spice_malloc(st->buf_size);
- st->buf_pos = st->buf;
- st->buf_used = 0;
- st->scc = NULL;
- return st;
-}
-
-static void smartcard_device_state_free(SmartCardDeviceState* st)
-{
- if (st->scc) {
- st->scc->smartcard_state = NULL;
- }
- free(st->buf);
- spice_char_device_state_destroy(st->chardev_st);
- free(st);
-}
-
-void smartcard_device_disconnect(SpiceCharDeviceInstance *char_device)
-{
- SmartCardDeviceState *st = spice_char_device_state_opaque_get(char_device->st);
-
- smartcard_device_state_free(st);
-}
-
-SpiceCharDeviceState *smartcard_device_connect(SpiceCharDeviceInstance *char_device)
-{
- SmartCardDeviceState *st;
-
- st = smartcard_device_state_new(char_device);
- if (smartcard_char_device_add_to_readers(char_device) == -1) {
- smartcard_device_state_free(st);
- return NULL;
- }
- return st->chardev_st;
-}
-
-static void smartcard_char_device_notify_reader_add(SmartCardDeviceState *st)
-{
- SpiceCharDeviceWriteBuffer *write_buf;
- VSCMsgHeader *vheader;
-
- write_buf = spice_char_device_write_buffer_get(st->chardev_st, NULL, sizeof(vheader));
- if (!write_buf) {
- spice_error("failed to allocate write buffer");
- return;
- }
- st->reader_added = TRUE;
- vheader = (VSCMsgHeader *)write_buf->buf;
- vheader->type = VSC_ReaderAdd;
- vheader->reader_id = st->reader_id;
- vheader->length = 0;
- smartcard_channel_write_to_reader(write_buf);
-}
-
-static void smartcard_char_device_attach_client(SpiceCharDeviceInstance *char_device,
- SmartCardChannelClient *scc)
-{
- SmartCardDeviceState *st = spice_char_device_state_opaque_get(char_device->st);
- int client_added;
-
- spice_assert(!scc->smartcard_state && !st->scc);
- st->scc = scc;
- scc->smartcard_state = st;
- client_added = spice_char_device_client_add(st->chardev_st,
- scc->base.client,
- FALSE, /* no flow control yet */
- 0, /* send queue size */
- ~0,
- ~0,
- red_channel_client_waits_for_migrate_data(
- &scc->base));
- if (!client_added) {
- spice_warning("failed");
- st->scc = NULL;
- scc->smartcard_state = NULL;
- red_channel_client_disconnect(&scc->base);
- }
-}
-
-static void smartcard_char_device_notify_reader_remove(SmartCardDeviceState *st)
-{
- SpiceCharDeviceWriteBuffer *write_buf;
- VSCMsgHeader *vheader;
-
- if (!st->reader_added) {
- spice_debug("reader add was never sent to the device");
- return;
- }
- write_buf = spice_char_device_write_buffer_get(st->chardev_st, NULL, sizeof(vheader));
- if (!write_buf) {
- spice_error("failed to allocate write buffer");
- return;
- }
- st->reader_added = FALSE;
- vheader = (VSCMsgHeader *)write_buf->buf;
- vheader->type = VSC_ReaderRemove;
- vheader->reader_id = st->reader_id;
- vheader->length = 0;
- smartcard_channel_write_to_reader(write_buf);
-}
-
-static void smartcard_char_device_detach_client(SmartCardChannelClient *scc)
-{
- SmartCardDeviceState *st;
-
- if (!scc->smartcard_state) {
- return;
- }
- st = scc->smartcard_state;
- spice_assert(st->scc == scc);
- spice_char_device_client_remove(st->chardev_st, scc->base.client);
- scc->smartcard_state = NULL;
- st->scc = NULL;
-}
-
-static int smartcard_channel_client_config_socket(RedChannelClient *rcc)
-{
- return TRUE;
-}
-
-static uint8_t *smartcard_channel_alloc_msg_rcv_buf(RedChannelClient *rcc,
- uint16_t type,
- uint32_t size)
-{
- SmartCardChannelClient *scc = SPICE_CONTAINEROF(rcc, SmartCardChannelClient, base);
-
- /* todo: only one reader is actually supported. When we fix the code to support
- * multiple readers, we will porbably associate different devices to
- * differenc channels */
- if (!scc->smartcard_state) {
- scc->msg_in_write_buf = FALSE;
- return spice_malloc(size);
- } else {
- SmartCardDeviceState *st;
-
- spice_assert(g_smartcard_readers.num == 1);
- st = scc->smartcard_state;
- spice_assert(st->scc || scc->smartcard_state);
- spice_assert(!scc->write_buf);
- scc->write_buf = spice_char_device_write_buffer_get(st->chardev_st, rcc->client, size);
-
- if (!scc->write_buf) {
- spice_error("failed to allocate write buffer");
- return NULL;
- }
- scc->msg_in_write_buf = TRUE;
- return scc->write_buf->buf;
- }
-}
-
-static void smartcard_channel_release_msg_rcv_buf(RedChannelClient *rcc,
- uint16_t type,
- uint32_t size,
- uint8_t *msg)
-{
- SmartCardChannelClient *scc = SPICE_CONTAINEROF(rcc, SmartCardChannelClient, base);
-
- /* todo: only one reader is actually supported. When we fix the code to support
- * multiple readers, we will porbably associate different devices to
- * differenc channels */
-
- if (!scc->msg_in_write_buf) {
- spice_assert(!scc->write_buf);
- free(msg);
- } else {
- SpiceCharDeviceState *dev_st;
- if (scc->write_buf) { /* msg hasn't been pushed to the guest */
- spice_assert(scc->write_buf->buf == msg);
- dev_st = scc->smartcard_state ? scc->smartcard_state->chardev_st : NULL;
- spice_char_device_write_buffer_release(dev_st, scc->write_buf);
- scc->write_buf = NULL;
- }
- }
-}
-
-static void smartcard_channel_send_data(RedChannelClient *rcc, SpiceMarshaller *m,
- PipeItem *item, VSCMsgHeader *vheader)
-{
- spice_assert(rcc);
- spice_assert(vheader);
- red_channel_client_init_send_data(rcc, SPICE_MSG_SMARTCARD_DATA, item);
- spice_marshaller_add_ref(m, (uint8_t*)vheader, sizeof(VSCMsgHeader));
- if (vheader->length > 0) {
- spice_marshaller_add_ref(m, (uint8_t*)(vheader+1), vheader->length);
- }
-}
-
-static void smartcard_channel_send_error(
- RedChannelClient *rcc, SpiceMarshaller *m, PipeItem *item)
-{
- ErrorItem* error_item = (ErrorItem*)item;
-
- smartcard_channel_send_data(rcc, m, item, &error_item->vheader);
-}
-
-static void smartcard_channel_send_msg(RedChannelClient *rcc,
- SpiceMarshaller *m, PipeItem *item)
-{
- MsgItem* msg_item = (MsgItem*)item;
-
- smartcard_channel_send_data(rcc, m, item, msg_item->vheader);
-}
-
-static void smartcard_channel_send_migrate_data(RedChannelClient *rcc,
- SpiceMarshaller *m, PipeItem *item)
-{
- SmartCardChannelClient *scc;
- SmartCardDeviceState *state;
- SpiceMarshaller *m2;
-
- scc = SPICE_CONTAINEROF(rcc, SmartCardChannelClient, base);
- state = scc->smartcard_state;
- red_channel_client_init_send_data(rcc, SPICE_MSG_MIGRATE_DATA, item);
- spice_marshaller_add_uint32(m, SPICE_MIGRATE_DATA_SMARTCARD_MAGIC);
- spice_marshaller_add_uint32(m, SPICE_MIGRATE_DATA_SMARTCARD_VERSION);
-
- if (!state) {
- spice_char_device_state_migrate_data_marshall_empty(m);
- spice_marshaller_add_uint8(m, 0);
- spice_marshaller_add_uint32(m, 0);
- spice_marshaller_add_uint32(m, 0);
- spice_debug("null char dev state");
- } else {
- spice_char_device_state_migrate_data_marshall(state->chardev_st, m);
- spice_marshaller_add_uint8(m, state->reader_added);
- spice_marshaller_add_uint32(m, state->buf_used);
- m2 = spice_marshaller_get_ptr_submarshaller(m, 0);
- spice_marshaller_add(m2, state->buf, state->buf_used);
- spice_debug("reader added %d partial read size %u", state->reader_added, state->buf_used);
- }
-}
-
-static void smartcard_channel_send_item(RedChannelClient *rcc, PipeItem *item)
-{
- SpiceMarshaller *m = red_channel_client_get_marshaller(rcc);
-
- switch (item->type) {
- case PIPE_ITEM_TYPE_ERROR:
- smartcard_channel_send_error(rcc, m, item);
- break;
- case PIPE_ITEM_TYPE_SMARTCARD_DATA:
- smartcard_channel_send_msg(rcc, m, item);
- break;
- case PIPE_ITEM_TYPE_SMARTCARD_MIGRATE_DATA:
- smartcard_channel_send_migrate_data(rcc, m, item);
- break;
- default:
- spice_error("bad pipe item %d", item->type);
- free(item);
- return;
- }
- red_channel_client_begin_send_message(rcc);
-}
-
-static void smartcard_channel_release_pipe_item(RedChannelClient *rcc,
- PipeItem *item, int item_pushed)
-{
- if (item->type == PIPE_ITEM_TYPE_SMARTCARD_DATA) {
- smartcard_unref_vsc_msg_item((MsgItem *)item);
- } else {
- free(item);
- }
-}
-
-static void smartcard_channel_on_disconnect(RedChannelClient *rcc)
-{
- SmartCardChannelClient *scc = SPICE_CONTAINEROF(rcc, SmartCardChannelClient, base);
-
- if (scc->smartcard_state) {
- SmartCardDeviceState *st = scc->smartcard_state;
-
- smartcard_char_device_detach_client(scc);
- smartcard_char_device_notify_reader_remove(st);
- }
-}
-
-/* this is called from both device input and client input. since the device is
- * a usb device, the context is still the main thread (kvm_main_loop, timers)
- * so no mutex is required. */
-static void smartcard_channel_client_pipe_add_push(RedChannelClient *rcc, PipeItem *item)
-{
- red_channel_client_pipe_add_push(rcc, item);
-}
-
-static void smartcard_push_error(RedChannelClient *rcc, uint32_t reader_id, VSCErrorCode error)
-{
- ErrorItem *error_item = spice_new0(ErrorItem, 1);
-
- red_channel_pipe_item_init(rcc->channel, &error_item->base,
- PIPE_ITEM_TYPE_ERROR);
-
- error_item->base.type = PIPE_ITEM_TYPE_ERROR;
- error_item->vheader.reader_id = reader_id;
- error_item->vheader.type = VSC_Error;
- error_item->vheader.length = sizeof(error_item->error);
- error_item->error.code = error;
- smartcard_channel_client_pipe_add_push(rcc, &error_item->base);
-}
-
-static MsgItem *smartcard_get_vsc_msg_item(RedChannelClient *rcc, VSCMsgHeader *vheader)
-{
- MsgItem *msg_item = spice_new0(MsgItem, 1);
-
- red_channel_pipe_item_init(rcc->channel, &msg_item->base,
- PIPE_ITEM_TYPE_SMARTCARD_DATA);
- msg_item->refs = 1;
- msg_item->vheader = vheader;
- return msg_item;
-}
-
-static MsgItem *smartcard_ref_vsc_msg_item(MsgItem *item)
-{
- item->refs++;
- return item;
-}
-
-static void smartcard_unref_vsc_msg_item(MsgItem *item)
-{
- if (!--item->refs) {
- free(item->vheader);
- free(item);
- }
-}
-
-static void smartcard_remove_reader(SmartCardChannelClient *scc, uint32_t reader_id)
-{
- SpiceCharDeviceInstance *char_device = smartcard_readers_get(reader_id);
- SmartCardDeviceState *state;
-
- if (char_device == NULL) {
- smartcard_push_error(&scc->base, reader_id,
- VSC_GENERAL_ERROR);
- return;
- }
-
- state = spice_char_device_state_opaque_get(char_device->st);
- if (state->reader_added == FALSE) {
- smartcard_push_error(&scc->base, reader_id,
- VSC_GENERAL_ERROR);
- return;
- }
- spice_assert(scc->smartcard_state == state);
- smartcard_char_device_notify_reader_remove(state);
-}
-
-static void smartcard_add_reader(SmartCardChannelClient *scc, uint8_t *name)
-{
- if (!scc->smartcard_state) { /* we already tried to attach a reader to the client
- when it connected */
- SpiceCharDeviceInstance *char_device = smartcard_readers_get_unattached();
-
- if (!char_device) {
- smartcard_push_error(&scc->base, VSCARD_UNDEFINED_READER_ID,
- VSC_CANNOT_ADD_MORE_READERS);
- return;
- }
- smartcard_char_device_attach_client(char_device, scc);
- }
- smartcard_char_device_notify_reader_add(scc->smartcard_state);
- // The device sends a VSC_Error message, we will let it through, no
- // need to send our own. We already set the correct reader_id, from
- // our SmartCardDeviceState.
-}
-
-static void smartcard_channel_write_to_reader(SpiceCharDeviceWriteBuffer *write_buf)
-{
- SpiceCharDeviceInstance *sin;
- SmartCardDeviceState *st;
- VSCMsgHeader *vheader;
- uint32_t actual_length;
-
- vheader = (VSCMsgHeader *)write_buf->buf;
- actual_length = vheader->length;
-
- spice_assert(vheader->reader_id <= g_smartcard_readers.num);
- sin = g_smartcard_readers.sin[vheader->reader_id];
- st = (SmartCardDeviceState *)spice_char_device_state_opaque_get(sin->st);
- spice_assert(!st->scc || st == st->scc->smartcard_state);
- /* protocol requires messages to be in network endianess */
- vheader->type = htonl(vheader->type);
- vheader->length = htonl(vheader->length);
- vheader->reader_id = htonl(vheader->reader_id);
- write_buf->buf_used = actual_length + sizeof(VSCMsgHeader);
- /* pushing the buffer to the write queue; It will be released
- * when it will be fully consumed by the device */
- spice_char_device_write_buffer_add(sin->st, write_buf);
- if (st->scc && write_buf == st->scc->write_buf) {
- st->scc->write_buf = NULL;
- }
-}
-
-static int smartcard_channel_client_handle_migrate_flush_mark(RedChannelClient *rcc)
-{
- red_channel_client_pipe_add_type(rcc, PIPE_ITEM_TYPE_SMARTCARD_MIGRATE_DATA);
- return TRUE;
-}
-
-static void smartcard_device_state_restore_partial_read(SmartCardDeviceState *state,
- SpiceMigrateDataSmartcard *mig_data)
-{
- uint8_t *read_data;
-
- spice_debug("read_size %u", mig_data->read_size);
- read_data = (uint8_t *)mig_data + mig_data->read_data_ptr - sizeof(SpiceMigrateDataHeader);
- if (mig_data->read_size < sizeof(VSCMsgHeader)) {
- spice_assert(state->buf_size >= mig_data->read_size);
- } else {
- smartcard_read_buf_prepare(state, (VSCMsgHeader *)read_data);
- }
- memcpy(state->buf, read_data, mig_data->read_size);
- state->buf_used = mig_data->read_size;
- state->buf_pos = state->buf + mig_data->read_size;
-}
-
-static int smartcard_channel_client_handle_migrate_data(RedChannelClient *rcc,
- uint32_t size, void *message)
-{
- SmartCardChannelClient *scc;
- SpiceMigrateDataHeader *header;
- SpiceMigrateDataSmartcard *mig_data;
-
- scc = SPICE_CONTAINEROF(rcc, SmartCardChannelClient, base);
- header = (SpiceMigrateDataHeader *)message;
- mig_data = (SpiceMigrateDataSmartcard *)(header + 1);
- if (size < sizeof(SpiceMigrateDataHeader) + sizeof(SpiceMigrateDataSmartcard)) {
- spice_error("bad message size");
- return FALSE;
- }
- if (!migration_protocol_validate_header(header,
- SPICE_MIGRATE_DATA_SMARTCARD_MAGIC,
- SPICE_MIGRATE_DATA_SMARTCARD_VERSION)) {
- spice_error("bad header");
- return FALSE;
- }
-
- if (!mig_data->base.connected) { /* client wasn't attached to a smartcard */
- return TRUE;
- }
-
- if (!scc->smartcard_state) {
- SpiceCharDeviceInstance *char_device = smartcard_readers_get_unattached();
-
- if (!char_device) {
- spice_warning("no unattached device available");
- return TRUE;
- } else {
- smartcard_char_device_attach_client(char_device, scc);
- }
- }
- spice_debug("reader added %d partial read_size %u", mig_data->reader_added, mig_data->read_size);
- scc->smartcard_state->reader_added = mig_data->reader_added;
-
- smartcard_device_state_restore_partial_read(scc->smartcard_state, mig_data);
- return spice_char_device_state_restore(scc->smartcard_state->chardev_st, &mig_data->base);
-}
-
-static int smartcard_channel_handle_message(RedChannelClient *rcc,
- uint16_t type,
- uint32_t size,
- uint8_t *msg)
-{
- VSCMsgHeader* vheader = (VSCMsgHeader*)msg;
- SmartCardChannelClient *scc = SPICE_CONTAINEROF(rcc, SmartCardChannelClient, base);
-
- if (type != SPICE_MSGC_SMARTCARD_DATA) {
- /* Handles seamless migration protocol. Also handles ack's,
- * spicy sends them while spicec does not */
- return red_channel_client_handle_message(rcc, size, type, msg);
- }
-
- spice_assert(size == vheader->length + sizeof(VSCMsgHeader));
- switch (vheader->type) {
- case VSC_ReaderAdd:
- smartcard_add_reader(scc, msg + sizeof(VSCMsgHeader));
- return TRUE;
- break;
- case VSC_ReaderRemove:
- smartcard_remove_reader(scc, vheader->reader_id);
- return TRUE;
- break;
- case VSC_Init:
- // ignore - we should never get this anyway
- return TRUE;
- break;
- case VSC_Error:
- case VSC_ATR:
- case VSC_CardRemove:
- case VSC_APDU:
- break; // passed on to device
- default:
- printf("ERROR: unexpected message on smartcard channel\n");
- return TRUE;
- }
-
- /* todo: fix */
- if (vheader->reader_id >= g_smartcard_readers.num) {
- spice_printerr("ERROR: received message for non existing reader: %d, %d, %d", vheader->reader_id,
- vheader->type, vheader->length);
- return FALSE;
- }
- spice_assert(scc->write_buf->buf == msg);
- smartcard_channel_write_to_reader(scc->write_buf);
-
- return TRUE;
-}
-
-static void smartcard_channel_hold_pipe_item(RedChannelClient *rcc, PipeItem *item)
-{
-}
-
-static void smartcard_connect_client(RedChannel *channel, RedClient *client,
- RedsStream *stream, int migration,
- int num_common_caps, uint32_t *common_caps,
- int num_caps, uint32_t *caps)
-{
- SpiceCharDeviceInstance *char_device =
- smartcard_readers_get_unattached();
-
- SmartCardChannelClient *scc;
-
- scc = (SmartCardChannelClient *)red_channel_client_create(sizeof(SmartCardChannelClient),
- channel,
- client,
- stream,
- FALSE,
- num_common_caps, common_caps,
- num_caps, caps);
-
- if (!scc) {
- return;
- }
- red_channel_client_ack_zero_messages_window(&scc->base);
-
- if (char_device) {
- smartcard_char_device_attach_client(char_device, scc);
- } else {
- spice_printerr("char dev unavailable");
- }
-}
-
-SmartCardChannel *g_smartcard_channel;
-
-static void smartcard_init(void)
-{
- ChannelCbs channel_cbs = { NULL, };
- ClientCbs client_cbs = { NULL, };
- uint32_t migration_flags = SPICE_MIGRATE_NEED_FLUSH | SPICE_MIGRATE_NEED_DATA_TRANSFER;
-
- spice_assert(!g_smartcard_channel);
-
- channel_cbs.config_socket = smartcard_channel_client_config_socket;
- channel_cbs.on_disconnect = smartcard_channel_on_disconnect;
- channel_cbs.send_item = smartcard_channel_send_item;
- channel_cbs.hold_item = smartcard_channel_hold_pipe_item;
- channel_cbs.release_item = smartcard_channel_release_pipe_item;
- channel_cbs.alloc_recv_buf = smartcard_channel_alloc_msg_rcv_buf;
- channel_cbs.release_recv_buf = smartcard_channel_release_msg_rcv_buf;
- channel_cbs.handle_migrate_flush_mark = smartcard_channel_client_handle_migrate_flush_mark;
- channel_cbs.handle_migrate_data = smartcard_channel_client_handle_migrate_data;
-
- g_smartcard_channel = (SmartCardChannel*)red_channel_create(sizeof(SmartCardChannel),
- core, SPICE_CHANNEL_SMARTCARD, 0,
- FALSE /* handle_acks */,
- smartcard_channel_handle_message,
- &channel_cbs,
- migration_flags);
-
- if (!g_smartcard_channel) {
- spice_error("failed to allocate Smartcard Channel");
- }
-
- client_cbs.connect = smartcard_connect_client;
- red_channel_register_client_cbs(&g_smartcard_channel->base, &client_cbs);
-
- reds_register_channel(&g_smartcard_channel->base);
-}
diff --git a/server/smartcard.cpp b/server/smartcard.cpp
new file mode 100644
index 00000000..023cf523
--- /dev/null
+++ b/server/smartcard.cpp
@@ -0,0 +1,494 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2010-2016 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+
+#ifndef _WIN32
+#include <arpa/inet.h>
+#endif
+#ifdef USE_SMARTCARD
+#include <libcacard.h>
+#endif
+
+#include "glib-compat.h"
+#include "reds.h"
+#include "char-device.h"
+#include "smartcard.h"
+#include "smartcard-channel-client.h"
+#include "migration-protocol.h"
+
+/*
+ * TODO: the code doesn't really support multiple readers.
+ * For example: smartcard_char_device_add_to_readers calls smartcard_init,
+ * which can be called only once.
+ * We should allow different readers, at least one reader per client.
+ * In addition the implementation should be changed: instead of one channel for
+ * all readers, we need to have different channles for different readers,
+ * similarly to spicevmc.
+ *
+ */
+#define SMARTCARD_MAX_READERS 10
+
+// Maximal length of APDU
+#define APDUBufSize 270
+
+struct RedSmartcardChannel final: public RedChannel
+{
+ RedSmartcardChannel(RedsState *reds);
+ void on_connect(RedClient *client, RedStream *stream, int migration,
+ RedChannelCapabilities *caps) override;
+};
+
+struct RedCharDeviceSmartcardPrivate {
+ SPICE_CXX_GLIB_ALLOCATOR
+
+ RedCharDeviceSmartcardPrivate();
+ ~RedCharDeviceSmartcardPrivate();
+
+ uint32_t reader_id;
+ /* read_from_device buffer */
+ uint8_t *buf;
+ uint32_t buf_size;
+ uint8_t *buf_pos;
+ uint32_t buf_used;
+
+ SmartCardChannelClient *scc; // client providing the remote card
+ int reader_added; // has reader_add been sent to the device
+};
+
+struct RedMsgItem: public RedPipeItemNum<RED_PIPE_ITEM_TYPE_SMARTCARD_DATA> {
+ red::glib_unique_ptr<VSCMsgHeader> vheader;
+};
+
+static red::shared_ptr<RedMsgItem>
+smartcard_new_vsc_msg_item(unsigned int reader_id, const VSCMsgHeader *vheader);
+
+static struct Readers {
+ uint32_t num;
+ SpiceCharDeviceInstance* sin[SMARTCARD_MAX_READERS];
+} g_smartcard_readers = {0, {NULL}};
+
+static int smartcard_char_device_add_to_readers(RedsState *reds, SpiceCharDeviceInstance *sin);
+
+static red::shared_ptr<RedMsgItem>
+smartcard_char_device_on_message_from_device(RedCharDeviceSmartcard *dev, VSCMsgHeader *header);
+static void smartcard_init(RedsState *reds);
+
+static void smartcard_read_buf_prepare(RedCharDeviceSmartcard *dev, VSCMsgHeader *vheader)
+{
+ uint32_t msg_len;
+
+ msg_len = ntohl(vheader->length);
+ if (msg_len > dev->priv->buf_size) {
+ dev->priv->buf_size = MAX(dev->priv->buf_size * 2, msg_len + sizeof(VSCMsgHeader));
+ dev->priv->buf = (uint8_t*) g_realloc(dev->priv->buf, dev->priv->buf_size);
+ }
+}
+
+RedPipeItemPtr
+RedCharDeviceSmartcard::read_one_msg_from_device()
+{
+ RedCharDeviceSmartcard *dev = this;
+ VSCMsgHeader *vheader = (VSCMsgHeader*)dev->priv->buf;
+ int remaining;
+ int actual_length;
+
+ while (true) {
+ // it's possible we already got a full message from a previous partial
+ // read. In this case we don't need to read any byte
+ if (dev->priv->buf_used < sizeof(VSCMsgHeader) ||
+ dev->priv->buf_used - sizeof(VSCMsgHeader) < ntohl(vheader->length)) {
+ int n = read(dev->priv->buf_pos, dev->priv->buf_size - dev->priv->buf_used);
+ if (n <= 0) {
+ break;
+ }
+ dev->priv->buf_pos += n;
+ dev->priv->buf_used += n;
+
+ if (dev->priv->buf_used < sizeof(VSCMsgHeader)) {
+ continue;
+ }
+ smartcard_read_buf_prepare(dev, vheader);
+ vheader = (VSCMsgHeader*)dev->priv->buf;
+ }
+ actual_length = ntohl(vheader->length);
+ if (dev->priv->buf_used - sizeof(VSCMsgHeader) < actual_length) {
+ continue;
+ }
+ auto msg_to_client = smartcard_char_device_on_message_from_device(dev, vheader);
+ remaining = dev->priv->buf_used - sizeof(VSCMsgHeader) - actual_length;
+ if (remaining > 0) {
+ memmove(dev->priv->buf, dev->priv->buf_pos - remaining, remaining);
+ }
+ dev->priv->buf_pos = dev->priv->buf + remaining;
+ dev->priv->buf_used = remaining;
+ if (msg_to_client && dev->priv->scc) {
+ dev->priv->scc->pipe_add_push(std::move(msg_to_client));
+ }
+ }
+ return RedPipeItemPtr();
+}
+
+void RedCharDeviceSmartcard::remove_client(RedCharDeviceClientOpaque *opaque)
+{
+ SmartCardChannelClient *scc = (SmartCardChannelClient *) opaque;
+
+ spice_assert(priv->scc && priv->scc == scc);
+ scc->shutdown();
+}
+
+red::shared_ptr<RedMsgItem>
+smartcard_char_device_on_message_from_device(RedCharDeviceSmartcard *dev,
+ VSCMsgHeader *vheader)
+{
+ vheader->type = ntohl(vheader->type);
+ vheader->length = ntohl(vheader->length);
+ vheader->reader_id = ntohl(vheader->reader_id);
+
+ if (vheader->type == VSC_Init) {
+ return red::shared_ptr<RedMsgItem>();
+ }
+ /* We pass any VSC_Error right now - might need to ignore some? */
+ if (dev->priv->reader_id == VSCARD_UNDEFINED_READER_ID) {
+ red_channel_warning(dev->priv->scc->get_channel(),
+ "error: reader_id not assigned for message of type %d",
+ vheader->type);
+ }
+ if (dev->priv->scc == NULL) {
+ return red::shared_ptr<RedMsgItem>();
+ }
+ return smartcard_new_vsc_msg_item(dev->priv->reader_id, vheader);
+}
+
+XXX_CAST(RedCharDevice, RedCharDeviceSmartcard, RED_CHAR_DEVICE_SMARTCARD);
+
+static int smartcard_char_device_add_to_readers(RedsState *reds, SpiceCharDeviceInstance *char_device)
+{
+ RedCharDeviceSmartcard *dev = RED_CHAR_DEVICE_SMARTCARD(char_device->st);
+
+ if (g_smartcard_readers.num >= SMARTCARD_MAX_READERS) {
+ return -1;
+ }
+ dev->priv->reader_id = g_smartcard_readers.num;
+ g_smartcard_readers.sin[g_smartcard_readers.num++] = char_device;
+ smartcard_init(reds);
+ return 0;
+}
+
+SpiceCharDeviceInstance *smartcard_readers_get(uint32_t reader_id)
+{
+ if (reader_id >= g_smartcard_readers.num) {
+ return NULL;
+ }
+ return g_smartcard_readers.sin[reader_id];
+}
+
+/* TODO: fix implementation for multiple readers. Each reader should have a separated
+ * channel */
+SpiceCharDeviceInstance *smartcard_readers_get_unattached(void)
+{
+ int i;
+ RedCharDeviceSmartcard* dev;
+
+ for (i = 0; i < g_smartcard_readers.num; ++i) {
+ dev = RED_CHAR_DEVICE_SMARTCARD(g_smartcard_readers.sin[i]->st);
+ if (!dev->priv->scc) {
+ return g_smartcard_readers.sin[i];
+ }
+ }
+ return NULL;
+}
+
+RedCharDeviceSmartcardPrivate::RedCharDeviceSmartcardPrivate()
+{
+ reader_id = VSCARD_UNDEFINED_READER_ID;
+ buf_size = APDUBufSize + sizeof(VSCMsgHeader);
+ buf = (uint8_t*) g_malloc(buf_size);
+ buf_pos = buf;
+}
+
+RedCharDeviceSmartcardPrivate::~RedCharDeviceSmartcardPrivate()
+{
+ g_free(buf);
+}
+
+RedCharDeviceSmartcard::RedCharDeviceSmartcard(RedsState *reds, SpiceCharDeviceInstance *sin):
+ RedCharDevice(reds, sin, 0, ~0ULL)
+{
+}
+
+red::shared_ptr<RedCharDeviceSmartcard> smartcard_device_connect(RedsState *reds, SpiceCharDeviceInstance *char_device)
+{
+ auto dev =
+ red::make_shared<RedCharDeviceSmartcard>(reds, char_device);
+
+ if (smartcard_char_device_add_to_readers(reds, char_device) == -1) {
+ dev.reset();
+ }
+ return dev;
+}
+
+void smartcard_char_device_notify_reader_add(RedCharDeviceSmartcard *dev)
+{
+ RedCharDeviceWriteBuffer *write_buf;
+ VSCMsgHeader *vheader;
+
+ write_buf = dev->write_buffer_get_server(sizeof(*vheader), true);
+ if (!write_buf) {
+ spice_error("failed to allocate write buffer");
+ return;
+ }
+ dev->priv->reader_added = TRUE;
+ vheader = (VSCMsgHeader *)write_buf->buf;
+ vheader->type = VSC_ReaderAdd;
+ vheader->reader_id = dev->priv->reader_id;
+ vheader->length = 0;
+ smartcard_channel_write_to_reader(write_buf);
+}
+
+void smartcard_char_device_attach_client(SpiceCharDeviceInstance *char_device,
+ SmartCardChannelClient *scc)
+{
+ RedCharDeviceSmartcard *dev = RED_CHAR_DEVICE_SMARTCARD(char_device->st);
+ int client_added;
+
+ spice_assert(!smartcard_channel_client_get_char_device(scc) && !dev->priv->scc);
+ dev->priv->scc = scc;
+ smartcard_channel_client_set_char_device(scc, dev);
+ client_added = dev->client_add((RedCharDeviceClientOpaque *)scc, FALSE, 0,
+ ~0, ~0, scc->is_waiting_for_migrate_data());
+ if (!client_added) {
+ spice_warning("failed");
+ dev->priv->scc = NULL;
+ smartcard_channel_client_set_char_device(scc, NULL);
+ scc->disconnect();
+ } else {
+ SpiceCharDeviceInterface *sif = spice_char_device_get_interface(char_device);
+ if (sif->state) {
+ sif->state(char_device, 1);
+ }
+ }
+}
+
+gboolean smartcard_char_device_notify_reader_remove(RedCharDeviceSmartcard *dev)
+{
+ RedCharDeviceWriteBuffer *write_buf;
+ VSCMsgHeader *vheader;
+
+ if (!dev->priv->reader_added) {
+ spice_debug("reader add was never sent to the device");
+ return FALSE;
+ }
+ write_buf = dev->write_buffer_get_server(sizeof(*vheader), true);
+ if (!write_buf) {
+ spice_error("failed to allocate write buffer");
+ return FALSE;
+ }
+ dev->priv->reader_added = FALSE;
+ vheader = (VSCMsgHeader *)write_buf->buf;
+ vheader->type = VSC_ReaderRemove;
+ vheader->reader_id = dev->priv->reader_id;
+ vheader->length = 0;
+ smartcard_channel_write_to_reader(write_buf);
+
+ return TRUE;
+}
+
+void smartcard_char_device_detach_client(RedCharDeviceSmartcard *smartcard,
+ SmartCardChannelClient *scc)
+{
+ SpiceCharDeviceInterface *sif;
+ SpiceCharDeviceInstance *sin;
+
+ sin = smartcard->get_device_instance();
+ sif = spice_char_device_get_interface(sin);
+
+ spice_assert(smartcard->priv->scc == scc);
+ smartcard->client_remove((RedCharDeviceClientOpaque *)scc);
+ smartcard_channel_client_set_char_device(scc, NULL);
+ smartcard->priv->scc = NULL;
+
+ if (sif->state) {
+ sif->state(sin, 0);
+ }
+}
+
+SmartCardChannelClient* smartcard_char_device_get_client(RedCharDeviceSmartcard *smartcard)
+{
+ return smartcard->priv->scc;
+}
+
+static void smartcard_channel_send_msg(RedChannelClient *rcc,
+ SpiceMarshaller *m, RedPipeItem *item)
+{
+ RedMsgItem* msg_item = static_cast<RedMsgItem*>(item);
+
+ smartcard_channel_client_send_data(rcc, m, item, msg_item->vheader.get());
+}
+
+static void smartcard_channel_send_migrate_data(SmartCardChannelClient *scc,
+ SpiceMarshaller *m, RedPipeItem *item)
+{
+ SpiceMarshaller *m2;
+
+ auto dev = smartcard_channel_client_get_char_device(scc);
+ scc->init_send_data(SPICE_MSG_MIGRATE_DATA);
+ spice_marshaller_add_uint32(m, SPICE_MIGRATE_DATA_SMARTCARD_MAGIC);
+ spice_marshaller_add_uint32(m, SPICE_MIGRATE_DATA_SMARTCARD_VERSION);
+
+ if (!dev) {
+ RedCharDevice::migrate_data_marshall_empty(m);
+ spice_marshaller_add_uint8(m, 0);
+ spice_marshaller_add_uint32(m, 0);
+ spice_marshaller_add_uint32(m, 0);
+ spice_debug("null char dev");
+ } else {
+ dev->migrate_data_marshall(m);
+ spice_marshaller_add_uint8(m, dev->priv->reader_added);
+ spice_marshaller_add_uint32(m, dev->priv->buf_used);
+ m2 = spice_marshaller_get_ptr_submarshaller(m);
+ spice_marshaller_add(m2, dev->priv->buf, dev->priv->buf_used);
+ spice_debug("reader added %d partial read size %u", dev->priv->reader_added, dev->priv->buf_used);
+ }
+}
+
+void SmartCardChannelClient::send_item(RedPipeItem *item)
+{
+ SpiceMarshaller *m = get_marshaller();
+
+ switch (item->type) {
+ case RED_PIPE_ITEM_TYPE_ERROR:
+ smartcard_channel_client_send_error(this, m, item);
+ break;
+ case RED_PIPE_ITEM_TYPE_SMARTCARD_DATA:
+ smartcard_channel_send_msg(this, m, item);
+ break;
+ case RED_PIPE_ITEM_TYPE_SMARTCARD_MIGRATE_DATA:
+ smartcard_channel_send_migrate_data(this, m, item);
+ break;
+ default:
+ spice_error("bad pipe item %d", item->type);
+ return;
+ }
+ begin_send_message();
+}
+
+static red::shared_ptr<RedMsgItem>
+smartcard_new_vsc_msg_item(unsigned int reader_id, const VSCMsgHeader *vheader)
+{
+ auto msg_item = red::make_shared<RedMsgItem>();
+
+ msg_item->vheader.reset((VSCMsgHeader*) g_memdup2(vheader, sizeof(*vheader) + vheader->length));
+ /* We patch the reader_id, since the device only knows about itself, and
+ * we know about the sum of readers. */
+ msg_item->vheader->reader_id = reader_id;
+ return msg_item;
+}
+
+void smartcard_channel_write_to_reader(RedCharDeviceWriteBuffer *write_buf)
+{
+ SpiceCharDeviceInstance *sin;
+ RedCharDeviceSmartcard *dev;
+ VSCMsgHeader *vheader;
+ uint32_t actual_length;
+
+ vheader = (VSCMsgHeader *)write_buf->buf;
+ actual_length = vheader->length;
+
+ spice_assert(vheader->reader_id <= g_smartcard_readers.num);
+ sin = g_smartcard_readers.sin[vheader->reader_id];
+ dev = RED_CHAR_DEVICE_SMARTCARD(sin->st);
+ spice_assert(!dev->priv->scc ||
+ dev == smartcard_channel_client_get_char_device(dev->priv->scc).get());
+ /* protocol requires messages to be in network endianness */
+ vheader->type = htonl(vheader->type);
+ vheader->length = htonl(vheader->length);
+ vheader->reader_id = htonl(vheader->reader_id);
+ write_buf->buf_used = actual_length + sizeof(VSCMsgHeader);
+ /* pushing the buffer to the write queue; It will be released
+ * when it will be fully consumed by the device */
+ sin->st->write_buffer_add(write_buf);
+}
+
+static void smartcard_device_restore_partial_read(RedCharDeviceSmartcard *dev,
+ SpiceMigrateDataSmartcard *mig_data)
+{
+ uint8_t *read_data;
+
+ spice_debug("read_size %u", mig_data->read_size);
+ read_data = (uint8_t *)mig_data + mig_data->read_data_ptr - sizeof(SpiceMigrateDataHeader);
+ if (mig_data->read_size < sizeof(VSCMsgHeader)) {
+ spice_assert(dev->priv->buf_size >= mig_data->read_size);
+ } else {
+ smartcard_read_buf_prepare(dev, (VSCMsgHeader *)read_data);
+ }
+ memcpy(dev->priv->buf, read_data, mig_data->read_size);
+ dev->priv->buf_used = mig_data->read_size;
+ dev->priv->buf_pos = dev->priv->buf + mig_data->read_size;
+}
+
+int smartcard_char_device_handle_migrate_data(RedCharDeviceSmartcard *smartcard,
+ SpiceMigrateDataSmartcard *mig_data)
+{
+ smartcard->priv->reader_added = mig_data->reader_added;
+
+ smartcard_device_restore_partial_read(smartcard, mig_data);
+ return smartcard->restore(&mig_data->base);
+}
+
+void RedSmartcardChannel::on_connect(RedClient *client, RedStream *stream, int migration,
+ RedChannelCapabilities *caps)
+{
+ SpiceCharDeviceInstance *char_device =
+ smartcard_readers_get_unattached();
+
+ auto scc = smartcard_channel_client_create(this, client, stream, caps);
+
+ if (!scc) {
+ return;
+ }
+ scc->ack_zero_messages_window();
+
+ if (char_device) {
+ smartcard_char_device_attach_client(char_device, scc);
+ } else {
+ red_channel_warning(this, "char dev unavailable");
+ }
+}
+
+RedSmartcardChannel::RedSmartcardChannel(RedsState *reds):
+ RedChannel(reds, SPICE_CHANNEL_SMARTCARD, 0, RedChannel::MigrateAll)
+{
+ reds_register_channel(reds, this);
+}
+
+static void smartcard_init(RedsState *reds)
+{
+ spice_assert(!reds_find_channel(reds, SPICE_CHANNEL_SMARTCARD, 0));
+
+ red::make_shared<RedSmartcardChannel>(reds);
+}
+
+
+RedCharDeviceSmartcard::~RedCharDeviceSmartcard()
+{
+}
+
+uint32_t smartcard_get_n_readers(void)
+{
+ return g_smartcard_readers.num;
+}
diff --git a/server/smartcard.h b/server/smartcard.h
index 221c777e..7ac7cc5a 100644
--- a/server/smartcard.h
+++ b/server/smartcard.h
@@ -1,6 +1,6 @@
/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
/*
- Copyright (C) 2010 Red Hat, Inc.
+ Copyright (C) 2010-2016 Red Hat, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@@ -15,18 +15,56 @@
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef __SMART_CARD_H__
-#define __SMART_CARD_H__
-#include "spice-experimental.h"
+#ifndef SMART_CARD_H_
+#define SMART_CARD_H_
-// Maximal length of APDU
-#define APDUBufSize 270
+#include "char-device.h"
+#include "red-channel-client.h"
+
+#include "push-visibility.h"
+
+struct SmartCardChannelClient;
+struct RedCharDeviceSmartcardPrivate;
+
+class RedCharDeviceSmartcard: public RedCharDevice
+{
+public:
+ RedCharDeviceSmartcard(RedsState *reds, SpiceCharDeviceInstance *sin);
+protected:
+ ~RedCharDeviceSmartcard();
+private:
+ RedPipeItemPtr read_one_msg_from_device() override;
+ void remove_client(RedCharDeviceClientOpaque *client) override;
+public: // XXX make private
+ red::unique_link<RedCharDeviceSmartcardPrivate> priv;
+};
/*
* connect to smartcard interface, used by smartcard channel
*/
-SpiceCharDeviceState *smartcard_device_connect(SpiceCharDeviceInstance *char_device);
-void smartcard_device_disconnect(SpiceCharDeviceInstance *char_device);
+red::shared_ptr<RedCharDeviceSmartcard>
+smartcard_device_connect(RedsState *reds, SpiceCharDeviceInstance *char_device);
+void smartcard_channel_write_to_reader(RedCharDeviceWriteBuffer *write_buf);
+SpiceCharDeviceInstance* smartcard_readers_get(uint32_t reader_id);
+SpiceCharDeviceInstance *smartcard_readers_get_unattached(void);
+uint32_t smartcard_get_n_readers(void);
+void smartcard_char_device_notify_reader_add(RedCharDeviceSmartcard *smartcard);
+void smartcard_char_device_attach_client(SpiceCharDeviceInstance *smartcard,
+ SmartCardChannelClient *scc);
+gboolean smartcard_char_device_notify_reader_remove(RedCharDeviceSmartcard *smartcard);
+void smartcard_char_device_detach_client(RedCharDeviceSmartcard *smartcard,
+ SmartCardChannelClient *scc);
+SmartCardChannelClient* smartcard_char_device_get_client(RedCharDeviceSmartcard *smartcard);
+int smartcard_char_device_handle_migrate_data(RedCharDeviceSmartcard *smartcard,
+ SpiceMigrateDataSmartcard *mig_data);
+
+enum {
+ RED_PIPE_ITEM_TYPE_ERROR = RED_PIPE_ITEM_TYPE_CHANNEL_BASE,
+ RED_PIPE_ITEM_TYPE_SMARTCARD_DATA,
+ RED_PIPE_ITEM_TYPE_SMARTCARD_MIGRATE_DATA,
+};
+
+#include "pop-visibility.h"
-#endif // __SMART_CARD_H__
+#endif /* SMART_CARD_H_ */
diff --git a/server/snd_worker.c b/server/snd_worker.c
deleted file mode 100644
index 70148b76..00000000
--- a/server/snd_worker.c
+++ /dev/null
@@ -1,1628 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
-/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <fcntl.h>
-#include <errno.h>
-#include <limits.h>
-#include <sys/socket.h>
-#include <netinet/ip.h>
-#include <netinet/tcp.h>
-
-#include "common/marshaller.h"
-#include "common/generated_server_marshallers.h"
-
-#include "spice.h"
-#include "red_common.h"
-#include "main_channel.h"
-#include "reds.h"
-#include "red_dispatcher.h"
-#include "snd_worker.h"
-#include "common/snd_codec.h"
-#include "demarshallers.h"
-
-#ifndef IOV_MAX
-#define IOV_MAX 1024
-#endif
-
-#define SND_RECEIVE_BUF_SIZE (16 * 1024 * 2)
-#define RECORD_SAMPLES_SIZE (SND_RECEIVE_BUF_SIZE >> 2)
-
-enum PlaybackCommand {
- SND_PLAYBACK_MIGRATE,
- SND_PLAYBACK_MODE,
- SND_PLAYBACK_CTRL,
- SND_PLAYBACK_PCM,
- SND_PLAYBACK_VOLUME,
- SND_PLAYBACK_LATENCY,
-};
-
-enum RecordCommand {
- SND_RECORD_MIGRATE,
- SND_RECORD_CTRL,
- SND_RECORD_VOLUME,
-};
-
-#define SND_PLAYBACK_MIGRATE_MASK (1 << SND_PLAYBACK_MIGRATE)
-#define SND_PLAYBACK_MODE_MASK (1 << SND_PLAYBACK_MODE)
-#define SND_PLAYBACK_CTRL_MASK (1 << SND_PLAYBACK_CTRL)
-#define SND_PLAYBACK_PCM_MASK (1 << SND_PLAYBACK_PCM)
-#define SND_PLAYBACK_VOLUME_MASK (1 << SND_PLAYBACK_VOLUME)
-#define SND_PLAYBACK_LATENCY_MASK ( 1 << SND_PLAYBACK_LATENCY)
-
-#define SND_RECORD_MIGRATE_MASK (1 << SND_RECORD_MIGRATE)
-#define SND_RECORD_CTRL_MASK (1 << SND_RECORD_CTRL)
-#define SND_RECORD_VOLUME_MASK (1 << SND_RECORD_VOLUME)
-
-typedef struct SndChannel SndChannel;
-typedef void (*snd_channel_send_messages_proc)(void *in_channel);
-typedef int (*snd_channel_handle_message_proc)(SndChannel *channel, size_t size, uint32_t type, void *message);
-typedef void (*snd_channel_on_message_done_proc)(SndChannel *channel);
-typedef void (*snd_channel_cleanup_channel_proc)(SndChannel *channel);
-
-typedef struct SndWorker SndWorker;
-
-struct SndChannel {
- RedsStream *stream;
- SndWorker *worker;
- spice_parse_channel_func_t parser;
- int refs;
-
- RedChannelClient *channel_client;
-
- int active;
- int client_active;
- int blocked;
-
- uint32_t command;
- uint32_t ack_generation;
- uint32_t client_ack_generation;
- uint32_t out_messages;
- uint32_t ack_messages;
-
- struct {
- uint64_t serial;
- SpiceMarshaller *marshaller;
- uint32_t size;
- uint32_t pos;
- } send_data;
-
- struct {
- uint8_t buf[SND_RECEIVE_BUF_SIZE];
- uint8_t *message_start;
- uint8_t *now;
- uint8_t *end;
- } receive_data;
-
- snd_channel_send_messages_proc send_messages;
- snd_channel_handle_message_proc handle_message;
- snd_channel_on_message_done_proc on_message_done;
- snd_channel_cleanup_channel_proc cleanup;
-};
-
-typedef struct PlaybackChannel PlaybackChannel;
-
-typedef struct AudioFrame AudioFrame;
-struct AudioFrame {
- uint32_t time;
- uint32_t samples[SND_CODEC_MAX_FRAME_SIZE];
- PlaybackChannel *channel;
- AudioFrame *next;
-};
-
-struct PlaybackChannel {
- SndChannel base;
- AudioFrame frames[3];
- AudioFrame *free_frames;
- AudioFrame *in_progress;
- AudioFrame *pending_frame;
- uint32_t mode;
- uint32_t latency;
- SndCodec codec;
- uint8_t encode_buf[SND_CODEC_MAX_COMPRESSED_BYTES];
-};
-
-struct SndWorker {
- RedChannel *base_channel;
- SndChannel *connection;
- SndWorker *next;
- int active;
-};
-
-typedef struct SpiceVolumeState {
- uint8_t volume_nchannels;
- uint16_t *volume;
- int mute;
-} SpiceVolumeState;
-
-struct SpicePlaybackState {
- struct SndWorker worker;
- SpicePlaybackInstance *sin;
- SpiceVolumeState volume;
- uint32_t frequency;
-};
-
-struct SpiceRecordState {
- struct SndWorker worker;
- SpiceRecordInstance *sin;
- SpiceVolumeState volume;
- uint32_t frequency;
-};
-
-typedef struct RecordChannel {
- SndChannel base;
- uint32_t samples[RECORD_SAMPLES_SIZE];
- uint32_t write_pos;
- uint32_t read_pos;
- uint32_t mode;
- uint32_t mode_time;
- uint32_t start_time;
- SndCodec codec;
- uint8_t decode_buf[SND_CODEC_MAX_FRAME_BYTES];
-} RecordChannel;
-
-static SndWorker *workers;
-static uint32_t playback_compression = TRUE;
-
-static void snd_receive(void* data);
-
-static SndChannel *snd_channel_get(SndChannel *channel)
-{
- channel->refs++;
- return channel;
-}
-
-static SndChannel *snd_channel_put(SndChannel *channel)
-{
- if (!--channel->refs) {
- spice_printerr("SndChannel=%p freed", channel);
- free(channel);
- return NULL;
- }
- return channel;
-}
-
-static void snd_disconnect_channel(SndChannel *channel)
-{
- SndWorker *worker;
-
- if (!channel || !channel->stream) {
- spice_debug("not connected");
- return;
- }
- spice_debug("SndChannel=%p rcc=%p type=%d",
- channel, channel->channel_client, channel->channel_client->channel->type);
- worker = channel->worker;
- channel->cleanup(channel);
- red_channel_client_disconnect(worker->connection->channel_client);
- worker->connection->channel_client = NULL;
- core->watch_remove(channel->stream->watch);
- channel->stream->watch = NULL;
- reds_stream_free(channel->stream);
- channel->stream = NULL;
- spice_marshaller_destroy(channel->send_data.marshaller);
- snd_channel_put(channel);
- worker->connection = NULL;
-}
-
-static void snd_playback_free_frame(PlaybackChannel *playback_channel, AudioFrame *frame)
-{
- frame->channel = playback_channel;
- frame->next = playback_channel->free_frames;
- playback_channel->free_frames = frame;
-}
-
-static void snd_playback_on_message_done(SndChannel *channel)
-{
- PlaybackChannel *playback_channel = (PlaybackChannel *)channel;
- if (playback_channel->in_progress) {
- snd_playback_free_frame(playback_channel, playback_channel->in_progress);
- playback_channel->in_progress = NULL;
- if (playback_channel->pending_frame) {
- channel->command |= SND_PLAYBACK_PCM_MASK;
- }
- }
-}
-
-static void snd_record_on_message_done(SndChannel *channel)
-{
-}
-
-static int snd_send_data(SndChannel *channel)
-{
- uint32_t n;
-
- if (!channel) {
- return FALSE;
- }
-
- if (!(n = channel->send_data.size - channel->send_data.pos)) {
- return TRUE;
- }
-
- for (;;) {
- struct iovec vec[IOV_MAX];
- int vec_size;
-
- if (!n) {
- channel->on_message_done(channel);
-
- if (channel->blocked) {
- channel->blocked = FALSE;
- core->watch_update_mask(channel->stream->watch, SPICE_WATCH_EVENT_READ);
- }
- break;
- }
-
- vec_size = spice_marshaller_fill_iovec(channel->send_data.marshaller,
- vec, IOV_MAX, channel->send_data.pos);
- n = reds_stream_writev(channel->stream, vec, vec_size);
- if (n == -1) {
- switch (errno) {
- case EAGAIN:
- channel->blocked = TRUE;
- core->watch_update_mask(channel->stream->watch, SPICE_WATCH_EVENT_READ |
- SPICE_WATCH_EVENT_WRITE);
- return FALSE;
- case EINTR:
- break;
- case EPIPE:
- snd_disconnect_channel(channel);
- return FALSE;
- default:
- spice_printerr("%s", strerror(errno));
- snd_disconnect_channel(channel);
- return FALSE;
- }
- } else {
- channel->send_data.pos += n;
- }
- n = channel->send_data.size - channel->send_data.pos;
- }
- return TRUE;
-}
-
-static int snd_record_handle_write(RecordChannel *record_channel, size_t size, void *message)
-{
- SpiceMsgcRecordPacket *packet;
- uint32_t write_pos;
- uint32_t* data;
- uint32_t len;
- uint32_t now;
-
- if (!record_channel) {
- return FALSE;
- }
-
- packet = (SpiceMsgcRecordPacket *)message;
-
- if (record_channel->mode == SPICE_AUDIO_DATA_MODE_RAW) {
- data = (uint32_t *)packet->data;
- size = packet->data_size >> 2;
- size = MIN(size, RECORD_SAMPLES_SIZE);
- } else {
- int decode_size;
- decode_size = sizeof(record_channel->decode_buf);
- if (snd_codec_decode(record_channel->codec, packet->data, packet->data_size,
- record_channel->decode_buf, &decode_size) != SND_CODEC_OK)
- return FALSE;
- data = (uint32_t *) record_channel->decode_buf;
- size = decode_size >> 2;
- }
-
- write_pos = record_channel->write_pos % RECORD_SAMPLES_SIZE;
- record_channel->write_pos += size;
- len = RECORD_SAMPLES_SIZE - write_pos;
- now = MIN(len, size);
- size -= now;
- memcpy(record_channel->samples + write_pos, data, now << 2);
-
- if (size) {
- memcpy(record_channel->samples, data + now, size << 2);
- }
-
- if (record_channel->write_pos - record_channel->read_pos > RECORD_SAMPLES_SIZE) {
- record_channel->read_pos = record_channel->write_pos - RECORD_SAMPLES_SIZE;
- }
- return TRUE;
-}
-
-static int snd_playback_handle_message(SndChannel *channel, size_t size, uint32_t type, void *message)
-{
- if (!channel) {
- return FALSE;
- }
-
- switch (type) {
- case SPICE_MSGC_DISCONNECTING:
- break;
- default:
- spice_printerr("invalid message type %u", type);
- return FALSE;
- }
- return TRUE;
-}
-
-static int snd_record_handle_message(SndChannel *channel, size_t size, uint32_t type, void *message)
-{
- RecordChannel *record_channel = (RecordChannel *)channel;
-
- if (!channel) {
- return FALSE;
- }
- switch (type) {
- case SPICE_MSGC_RECORD_DATA:
- return snd_record_handle_write((RecordChannel *)channel, size, message);
- case SPICE_MSGC_RECORD_MODE: {
- SpiceMsgcRecordMode *mode = (SpiceMsgcRecordMode *)message;
- SpiceRecordState *st = SPICE_CONTAINEROF(channel->worker, SpiceRecordState, worker);
- record_channel->mode_time = mode->time;
- if (mode->mode != SPICE_AUDIO_DATA_MODE_RAW) {
- if (snd_codec_is_capable(mode->mode, st->frequency)) {
- if (snd_codec_create(&record_channel->codec, mode->mode, st->frequency, SND_CODEC_DECODE) == SND_CODEC_OK) {
- record_channel->mode = mode->mode;
- } else {
- spice_printerr("create decoder failed");
- return FALSE;
- }
- }
- else {
- spice_printerr("unsupported mode %d", record_channel->mode);
- return FALSE;
- }
- }
- else
- record_channel->mode = mode->mode;
- break;
- }
-
- case SPICE_MSGC_RECORD_START_MARK: {
- SpiceMsgcRecordStartMark *mark = (SpiceMsgcRecordStartMark *)message;
- record_channel->start_time = mark->time;
- break;
- }
- case SPICE_MSGC_DISCONNECTING:
- break;
- default:
- spice_printerr("invalid message type %u", type);
- return FALSE;
- }
- return TRUE;
-}
-
-static void snd_receive(void* data)
-{
- SndChannel *channel = (SndChannel*)data;
- SpiceDataHeaderOpaque *header;
-
- if (!channel) {
- return;
- }
-
- header = &channel->channel_client->incoming.header;
-
- for (;;) {
- ssize_t n;
- n = channel->receive_data.end - channel->receive_data.now;
- spice_warn_if(n <= 0);
- n = reds_stream_read(channel->stream, channel->receive_data.now, n);
- if (n <= 0) {
- if (n == 0) {
- snd_disconnect_channel(channel);
- return;
- }
- spice_assert(n == -1);
- switch (errno) {
- case EAGAIN:
- return;
- case EINTR:
- break;
- case EPIPE:
- snd_disconnect_channel(channel);
- return;
- default:
- spice_printerr("%s", strerror(errno));
- snd_disconnect_channel(channel);
- return;
- }
- } else {
- channel->receive_data.now += n;
- for (;;) {
- uint8_t *msg_start = channel->receive_data.message_start;
- uint8_t *data = msg_start + header->header_size;
- size_t parsed_size;
- uint8_t *parsed;
- message_destructor_t parsed_free;
-
- header->data = msg_start;
- n = channel->receive_data.now - msg_start;
-
- if (n < header->header_size ||
- n < header->header_size + header->get_msg_size(header)) {
- break;
- }
- parsed = channel->parser((void *)data, data + header->get_msg_size(header),
- header->get_msg_type(header),
- SPICE_VERSION_MINOR, &parsed_size, &parsed_free);
- if (parsed == NULL) {
- spice_printerr("failed to parse message type %d", header->get_msg_type(header));
- snd_disconnect_channel(channel);
- return;
- }
- if (!channel->handle_message(channel, parsed_size,
- header->get_msg_type(header), parsed)) {
- free(parsed);
- snd_disconnect_channel(channel);
- return;
- }
- parsed_free(parsed);
- channel->receive_data.message_start = msg_start + header->header_size +
- header->get_msg_size(header);
- }
- if (channel->receive_data.now == channel->receive_data.message_start) {
- channel->receive_data.now = channel->receive_data.buf;
- channel->receive_data.message_start = channel->receive_data.buf;
- } else if (channel->receive_data.now == channel->receive_data.end) {
- memcpy(channel->receive_data.buf, channel->receive_data.message_start, n);
- channel->receive_data.now = channel->receive_data.buf + n;
- channel->receive_data.message_start = channel->receive_data.buf;
- }
- }
- }
-}
-
-static void snd_event(int fd, int event, void *data)
-{
- SndChannel *channel = data;
-
- if (event & SPICE_WATCH_EVENT_READ) {
- snd_receive(channel);
- }
- if (event & SPICE_WATCH_EVENT_WRITE) {
- channel->send_messages(channel);
- }
-}
-
-static inline int snd_reset_send_data(SndChannel *channel, uint16_t verb)
-{
- SpiceDataHeaderOpaque *header;
-
- if (!channel) {
- return FALSE;
- }
-
- header = &channel->channel_client->send_data.header;
- spice_marshaller_reset(channel->send_data.marshaller);
- header->data = spice_marshaller_reserve_space(channel->send_data.marshaller,
- header->header_size);
- spice_marshaller_set_base(channel->send_data.marshaller,
- header->header_size);
- channel->send_data.pos = 0;
- header->set_msg_size(header, 0);
- header->set_msg_type(header, verb);
- channel->send_data.serial++;
- if (!channel->channel_client->is_mini_header) {
- header->set_msg_serial(header, channel->send_data.serial);
- header->set_msg_sub_list(header, 0);
- }
-
- return TRUE;
-}
-
-static int snd_begin_send_message(SndChannel *channel)
-{
- SpiceDataHeaderOpaque *header = &channel->channel_client->send_data.header;
-
- spice_marshaller_flush(channel->send_data.marshaller);
- channel->send_data.size = spice_marshaller_get_total_size(channel->send_data.marshaller);
- header->set_msg_size(header, channel->send_data.size - header->header_size);
- return snd_send_data(channel);
-}
-
-static int snd_channel_send_migrate(SndChannel *channel)
-{
- SpiceMsgMigrate migrate;
-
- if (!snd_reset_send_data(channel, SPICE_MSG_MIGRATE)) {
- return FALSE;
- }
- spice_debug(NULL);
- migrate.flags = 0;
- spice_marshall_msg_migrate(channel->send_data.marshaller, &migrate);
-
- return snd_begin_send_message(channel);
-}
-
-static int snd_playback_send_migrate(PlaybackChannel *channel)
-{
- return snd_channel_send_migrate(&channel->base);
-}
-
-static int snd_send_volume(SndChannel *channel, SpiceVolumeState *st, int msg)
-{
- SpiceMsgAudioVolume *vol;
- uint8_t c;
-
- vol = alloca(sizeof (SpiceMsgAudioVolume) +
- st->volume_nchannels * sizeof (uint16_t));
- if (!snd_reset_send_data(channel, msg)) {
- return FALSE;
- }
- vol->nchannels = st->volume_nchannels;
- for (c = 0; c < st->volume_nchannels; ++c) {
- vol->volume[c] = st->volume[c];
- }
- spice_marshall_SpiceMsgAudioVolume(channel->send_data.marshaller, vol);
-
- return snd_begin_send_message(channel);
-}
-
-static int snd_playback_send_volume(PlaybackChannel *playback_channel)
-{
- SndChannel *channel = &playback_channel->base;
- SpicePlaybackState *st = SPICE_CONTAINEROF(channel->worker, SpicePlaybackState, worker);
-
- if (!red_channel_client_test_remote_cap(channel->channel_client,
- SPICE_PLAYBACK_CAP_VOLUME)) {
- return TRUE;
- }
-
- return snd_send_volume(channel, &st->volume, SPICE_MSG_PLAYBACK_VOLUME);
-}
-
-static int snd_send_mute(SndChannel *channel, SpiceVolumeState *st, int msg)
-{
- SpiceMsgAudioMute mute;
-
- if (!snd_reset_send_data(channel, msg)) {
- return FALSE;
- }
- mute.mute = st->mute;
- spice_marshall_SpiceMsgAudioMute(channel->send_data.marshaller, &mute);
-
- return snd_begin_send_message(channel);
-}
-
-static int snd_playback_send_mute(PlaybackChannel *playback_channel)
-{
- SndChannel *channel = &playback_channel->base;
- SpicePlaybackState *st = SPICE_CONTAINEROF(channel->worker, SpicePlaybackState, worker);
-
- if (!red_channel_client_test_remote_cap(channel->channel_client,
- SPICE_PLAYBACK_CAP_VOLUME)) {
- return TRUE;
- }
-
- return snd_send_mute(channel, &st->volume, SPICE_MSG_PLAYBACK_MUTE);
-}
-
-static int snd_playback_send_latency(PlaybackChannel *playback_channel)
-{
- SndChannel *channel = &playback_channel->base;
- SpiceMsgPlaybackLatency latency_msg;
-
- spice_debug("latency %u", playback_channel->latency);
- if (!snd_reset_send_data(channel, SPICE_MSG_PLAYBACK_LATENCY)) {
- return FALSE;
- }
- latency_msg.latency_ms = playback_channel->latency;
- spice_marshall_msg_playback_latency(channel->send_data.marshaller, &latency_msg);
-
- return snd_begin_send_message(channel);
-}
-static int snd_playback_send_start(PlaybackChannel *playback_channel)
-{
- SndChannel *channel = (SndChannel *)playback_channel;
- SpicePlaybackState *st = SPICE_CONTAINEROF(channel->worker, SpicePlaybackState, worker);
- SpiceMsgPlaybackStart start;
-
- if (!snd_reset_send_data(channel, SPICE_MSG_PLAYBACK_START)) {
- return FALSE;
- }
-
- start.channels = SPICE_INTERFACE_PLAYBACK_CHAN;
- start.frequency = st->frequency;
- spice_assert(SPICE_INTERFACE_PLAYBACK_FMT == SPICE_INTERFACE_AUDIO_FMT_S16);
- start.format = SPICE_AUDIO_FMT_S16;
- start.time = reds_get_mm_time();
- spice_marshall_msg_playback_start(channel->send_data.marshaller, &start);
-
- return snd_begin_send_message(channel);
-}
-
-static int snd_playback_send_stop(PlaybackChannel *playback_channel)
-{
- SndChannel *channel = (SndChannel *)playback_channel;
-
- if (!snd_reset_send_data(channel, SPICE_MSG_PLAYBACK_STOP)) {
- return FALSE;
- }
-
- return snd_begin_send_message(channel);
-}
-
-static int snd_playback_send_ctl(PlaybackChannel *playback_channel)
-{
- SndChannel *channel = (SndChannel *)playback_channel;
-
- if ((channel->client_active = channel->active)) {
- return snd_playback_send_start(playback_channel);
- } else {
- return snd_playback_send_stop(playback_channel);
- }
-}
-
-static int snd_record_send_start(RecordChannel *record_channel)
-{
- SndChannel *channel = (SndChannel *)record_channel;
- SpiceRecordState *st = SPICE_CONTAINEROF(channel->worker, SpiceRecordState, worker);
- SpiceMsgRecordStart start;
-
- if (!snd_reset_send_data(channel, SPICE_MSG_RECORD_START)) {
- return FALSE;
- }
-
- start.channels = SPICE_INTERFACE_RECORD_CHAN;
- start.frequency = st->frequency;
- spice_assert(SPICE_INTERFACE_RECORD_FMT == SPICE_INTERFACE_AUDIO_FMT_S16);
- start.format = SPICE_AUDIO_FMT_S16;
- spice_marshall_msg_record_start(channel->send_data.marshaller, &start);
-
- return snd_begin_send_message(channel);
-}
-
-static int snd_record_send_stop(RecordChannel *record_channel)
-{
- SndChannel *channel = (SndChannel *)record_channel;
-
- if (!snd_reset_send_data(channel, SPICE_MSG_RECORD_STOP)) {
- return FALSE;
- }
-
- return snd_begin_send_message(channel);
-}
-
-static int snd_record_send_ctl(RecordChannel *record_channel)
-{
- SndChannel *channel = (SndChannel *)record_channel;
-
- if ((channel->client_active = channel->active)) {
- return snd_record_send_start(record_channel);
- } else {
- return snd_record_send_stop(record_channel);
- }
-}
-
-static int snd_record_send_volume(RecordChannel *record_channel)
-{
- SndChannel *channel = &record_channel->base;
- SpiceRecordState *st = SPICE_CONTAINEROF(channel->worker, SpiceRecordState, worker);
-
- if (!red_channel_client_test_remote_cap(channel->channel_client,
- SPICE_RECORD_CAP_VOLUME)) {
- return TRUE;
- }
-
- return snd_send_volume(channel, &st->volume, SPICE_MSG_RECORD_VOLUME);
-}
-
-static int snd_record_send_mute(RecordChannel *record_channel)
-{
- SndChannel *channel = &record_channel->base;
- SpiceRecordState *st = SPICE_CONTAINEROF(channel->worker, SpiceRecordState, worker);
-
- if (!red_channel_client_test_remote_cap(channel->channel_client,
- SPICE_RECORD_CAP_VOLUME)) {
- return TRUE;
- }
-
- return snd_send_mute(channel, &st->volume, SPICE_MSG_RECORD_MUTE);
-}
-
-static int snd_record_send_migrate(RecordChannel *record_channel)
-{
- /* No need for migration data: if recording has started before migration,
- * the client receives RECORD_STOP from the src before the migration completion
- * notification (when the vm is stopped).
- * Afterwards, when the vm starts on the dest, the client receives RECORD_START. */
- return snd_channel_send_migrate(&record_channel->base);
-}
-
-static int snd_playback_send_write(PlaybackChannel *playback_channel)
-{
- SndChannel *channel = (SndChannel *)playback_channel;
- AudioFrame *frame;
- SpiceMsgPlaybackPacket msg;
-
- if (!snd_reset_send_data(channel, SPICE_MSG_PLAYBACK_DATA)) {
- return FALSE;
- }
-
- frame = playback_channel->in_progress;
- msg.time = frame->time;
-
- spice_marshall_msg_playback_data(channel->send_data.marshaller, &msg);
-
- if (playback_channel->mode == SPICE_AUDIO_DATA_MODE_RAW) {
- spice_marshaller_add_ref(channel->send_data.marshaller,
- (uint8_t *)frame->samples,
- snd_codec_frame_size(playback_channel->codec) * sizeof(frame->samples[0]));
- }
- else {
- int n = sizeof(playback_channel->encode_buf);
- if (snd_codec_encode(playback_channel->codec, (uint8_t *) frame->samples,
- snd_codec_frame_size(playback_channel->codec) * sizeof(frame->samples[0]),
- playback_channel->encode_buf, &n) != SND_CODEC_OK) {
- spice_printerr("encode failed");
- snd_disconnect_channel(channel);
- return FALSE;
- }
- spice_marshaller_add_ref(channel->send_data.marshaller, playback_channel->encode_buf, n);
- }
-
- return snd_begin_send_message(channel);
-}
-
-static int playback_send_mode(PlaybackChannel *playback_channel)
-{
- SndChannel *channel = (SndChannel *)playback_channel;
- SpiceMsgPlaybackMode mode;
-
- if (!snd_reset_send_data(channel, SPICE_MSG_PLAYBACK_MODE)) {
- return FALSE;
- }
- mode.time = reds_get_mm_time();
- mode.mode = playback_channel->mode;
- spice_marshall_msg_playback_mode(channel->send_data.marshaller, &mode);
-
- return snd_begin_send_message(channel);
-}
-
-static void snd_playback_send(void* data)
-{
- PlaybackChannel *playback_channel = (PlaybackChannel*)data;
- SndChannel *channel = (SndChannel*)playback_channel;
-
- if (!playback_channel || !snd_send_data(data)) {
- return;
- }
-
- while (channel->command) {
- if (channel->command & SND_PLAYBACK_MODE_MASK) {
- if (!playback_send_mode(playback_channel)) {
- return;
- }
- channel->command &= ~SND_PLAYBACK_MODE_MASK;
- }
- if (channel->command & SND_PLAYBACK_PCM_MASK) {
- spice_assert(!playback_channel->in_progress && playback_channel->pending_frame);
- playback_channel->in_progress = playback_channel->pending_frame;
- playback_channel->pending_frame = NULL;
- channel->command &= ~SND_PLAYBACK_PCM_MASK;
- if (!snd_playback_send_write(playback_channel)) {
- spice_printerr("snd_send_playback_write failed");
- return;
- }
- }
- if (channel->command & SND_PLAYBACK_CTRL_MASK) {
- if (!snd_playback_send_ctl(playback_channel)) {
- return;
- }
- channel->command &= ~SND_PLAYBACK_CTRL_MASK;
- }
- if (channel->command & SND_PLAYBACK_VOLUME_MASK) {
- if (!snd_playback_send_volume(playback_channel) ||
- !snd_playback_send_mute(playback_channel)) {
- return;
- }
- channel->command &= ~SND_PLAYBACK_VOLUME_MASK;
- }
- if (channel->command & SND_PLAYBACK_MIGRATE_MASK) {
- if (!snd_playback_send_migrate(playback_channel)) {
- return;
- }
- channel->command &= ~SND_PLAYBACK_MIGRATE_MASK;
- }
- if (channel->command & SND_PLAYBACK_LATENCY_MASK) {
- if (!snd_playback_send_latency(playback_channel)) {
- return;
- }
- channel->command &= ~SND_PLAYBACK_LATENCY_MASK;
- }
- }
-}
-
-static void snd_record_send(void* data)
-{
- RecordChannel *record_channel = (RecordChannel*)data;
- SndChannel *channel = (SndChannel*)record_channel;
-
- if (!record_channel || !snd_send_data(data)) {
- return;
- }
-
- while (channel->command) {
- if (channel->command & SND_RECORD_CTRL_MASK) {
- if (!snd_record_send_ctl(record_channel)) {
- return;
- }
- channel->command &= ~SND_RECORD_CTRL_MASK;
- }
- if (channel->command & SND_RECORD_VOLUME_MASK) {
- if (!snd_record_send_volume(record_channel) ||
- !snd_record_send_mute(record_channel)) {
- return;
- }
- channel->command &= ~SND_RECORD_VOLUME_MASK;
- }
- if (channel->command & SND_RECORD_MIGRATE_MASK) {
- if (!snd_record_send_migrate(record_channel)) {
- return;
- }
- channel->command &= ~SND_RECORD_MIGRATE_MASK;
- }
- }
-}
-
-static SndChannel *__new_channel(SndWorker *worker, int size, uint32_t channel_id,
- RedClient *client,
- RedsStream *stream,
- int migrate,
- snd_channel_send_messages_proc send_messages,
- snd_channel_handle_message_proc handle_message,
- snd_channel_on_message_done_proc on_message_done,
- snd_channel_cleanup_channel_proc cleanup,
- uint32_t *common_caps, int num_common_caps,
- uint32_t *caps, int num_caps)
-{
- SndChannel *channel;
- int delay_val;
- int flags;
-#ifdef SO_PRIORITY
- int priority;
-#endif
- int tos;
- MainChannelClient *mcc = red_client_get_main(client);
-
- spice_assert(stream);
- if ((flags = fcntl(stream->socket, F_GETFL)) == -1) {
- spice_printerr("accept failed, %s", strerror(errno));
- goto error1;
- }
-
-#ifdef SO_PRIORITY
- priority = 6;
- if (setsockopt(stream->socket, SOL_SOCKET, SO_PRIORITY, (void*)&priority,
- sizeof(priority)) == -1) {
- if (errno != ENOTSUP) {
- spice_printerr("setsockopt failed, %s", strerror(errno));
- }
- }
-#endif
-
- tos = IPTOS_LOWDELAY;
- if (setsockopt(stream->socket, IPPROTO_IP, IP_TOS, (void*)&tos, sizeof(tos)) == -1) {
- if (errno != ENOTSUP) {
- spice_printerr("setsockopt failed, %s", strerror(errno));
- }
- }
-
- delay_val = main_channel_client_is_low_bandwidth(mcc) ? 0 : 1;
- if (setsockopt(stream->socket, IPPROTO_TCP, TCP_NODELAY, &delay_val, sizeof(delay_val)) == -1) {
- if (errno != ENOTSUP) {
- spice_printerr("setsockopt failed, %s", strerror(errno));
- }
- }
-
- if (fcntl(stream->socket, F_SETFL, flags | O_NONBLOCK) == -1) {
- spice_printerr("accept failed, %s", strerror(errno));
- goto error1;
- }
-
- spice_assert(size >= sizeof(*channel));
- channel = spice_malloc0(size);
- channel->refs = 1;
- channel->parser = spice_get_client_channel_parser(channel_id, NULL);
- channel->stream = stream;
- channel->worker = worker;
- channel->receive_data.message_start = channel->receive_data.buf;
- channel->receive_data.now = channel->receive_data.buf;
- channel->receive_data.end = channel->receive_data.buf + sizeof(channel->receive_data.buf);
- channel->send_data.marshaller = spice_marshaller_new();
-
- stream->watch = core->watch_add(stream->socket, SPICE_WATCH_EVENT_READ,
- snd_event, channel);
- if (stream->watch == NULL) {
- spice_printerr("watch_add failed, %s", strerror(errno));
- goto error2;
- }
-
- channel->send_messages = send_messages;
- channel->handle_message = handle_message;
- channel->on_message_done = on_message_done;
- channel->cleanup = cleanup;
-
- channel->channel_client = red_channel_client_create_dummy(sizeof(RedChannelClient),
- worker->base_channel,
- client,
- num_common_caps, common_caps,
- num_caps, caps);
- if (!channel->channel_client) {
- goto error2;
- }
- return channel;
-
-error2:
- free(channel);
-
-error1:
- reds_stream_free(stream);
- return NULL;
-}
-
-static void snd_disconnect_channel_client(RedChannelClient *rcc)
-{
- SndWorker *worker;
-
- spice_assert(rcc->channel);
- spice_assert(rcc->channel->data);
- worker = (SndWorker *)rcc->channel->data;
-
- spice_debug("channel-type=%d", rcc->channel->type);
- if (worker->connection) {
- spice_assert(worker->connection->channel_client == rcc);
- snd_disconnect_channel(worker->connection);
- }
-}
-
-static void snd_set_command(SndChannel *channel, uint32_t command)
-{
- if (!channel) {
- return;
- }
- channel->command |= command;
-}
-
-SPICE_GNUC_VISIBLE void spice_server_playback_set_volume(SpicePlaybackInstance *sin,
- uint8_t nchannels,
- uint16_t *volume)
-{
- SpiceVolumeState *st = &sin->st->volume;
- SndChannel *channel = sin->st->worker.connection;
- PlaybackChannel *playback_channel = SPICE_CONTAINEROF(channel, PlaybackChannel, base);
-
- st->volume_nchannels = nchannels;
- free(st->volume);
- st->volume = spice_memdup(volume, sizeof(uint16_t) * nchannels);
-
- if (!channel || nchannels == 0)
- return;
-
- snd_playback_send_volume(playback_channel);
-}
-
-SPICE_GNUC_VISIBLE void spice_server_playback_set_mute(SpicePlaybackInstance *sin, uint8_t mute)
-{
- SpiceVolumeState *st = &sin->st->volume;
- SndChannel *channel = sin->st->worker.connection;
- PlaybackChannel *playback_channel = SPICE_CONTAINEROF(channel, PlaybackChannel, base);
-
- st->mute = mute;
-
- if (!channel)
- return;
-
- snd_playback_send_mute(playback_channel);
-}
-
-SPICE_GNUC_VISIBLE void spice_server_playback_start(SpicePlaybackInstance *sin)
-{
- SndChannel *channel = sin->st->worker.connection;
- PlaybackChannel *playback_channel = SPICE_CONTAINEROF(channel, PlaybackChannel, base);
-
- sin->st->worker.active = 1;
- if (!channel)
- return;
- spice_assert(!playback_channel->base.active);
- reds_disable_mm_timer();
- playback_channel->base.active = TRUE;
- if (!playback_channel->base.client_active) {
- snd_set_command(&playback_channel->base, SND_PLAYBACK_CTRL_MASK);
- snd_playback_send(&playback_channel->base);
- } else {
- playback_channel->base.command &= ~SND_PLAYBACK_CTRL_MASK;
- }
-}
-
-SPICE_GNUC_VISIBLE void spice_server_playback_stop(SpicePlaybackInstance *sin)
-{
- SndChannel *channel = sin->st->worker.connection;
- PlaybackChannel *playback_channel = SPICE_CONTAINEROF(channel, PlaybackChannel, base);
-
- sin->st->worker.active = 0;
- if (!channel)
- return;
- spice_assert(playback_channel->base.active);
- reds_enable_mm_timer();
- playback_channel->base.active = FALSE;
- if (playback_channel->base.client_active) {
- snd_set_command(&playback_channel->base, SND_PLAYBACK_CTRL_MASK);
- snd_playback_send(&playback_channel->base);
- } else {
- playback_channel->base.command &= ~SND_PLAYBACK_CTRL_MASK;
- playback_channel->base.command &= ~SND_PLAYBACK_PCM_MASK;
-
- if (playback_channel->pending_frame) {
- spice_assert(!playback_channel->in_progress);
- snd_playback_free_frame(playback_channel,
- playback_channel->pending_frame);
- playback_channel->pending_frame = NULL;
- }
- }
-}
-
-SPICE_GNUC_VISIBLE void spice_server_playback_get_buffer(SpicePlaybackInstance *sin,
- uint32_t **frame, uint32_t *num_samples)
-{
- SndChannel *channel = sin->st->worker.connection;
- PlaybackChannel *playback_channel = SPICE_CONTAINEROF(channel, PlaybackChannel, base);
-
- if (!channel || !playback_channel->free_frames) {
- *frame = NULL;
- *num_samples = 0;
- return;
- }
- spice_assert(playback_channel->base.active);
- snd_channel_get(channel);
-
- *frame = playback_channel->free_frames->samples;
- playback_channel->free_frames = playback_channel->free_frames->next;
- *num_samples = snd_codec_frame_size(playback_channel->codec);
-}
-
-SPICE_GNUC_VISIBLE void spice_server_playback_put_samples(SpicePlaybackInstance *sin, uint32_t *samples)
-{
- PlaybackChannel *playback_channel;
- AudioFrame *frame;
-
- frame = SPICE_CONTAINEROF(samples, AudioFrame, samples);
- playback_channel = frame->channel;
- spice_assert(playback_channel);
- if (!snd_channel_put(&playback_channel->base) ||
- sin->st->worker.connection != &playback_channel->base) {
- /* lost last reference, channel has been destroyed previously */
- spice_info("audio samples belong to a disconnected channel");
- return;
- }
- spice_assert(playback_channel->base.active);
-
- if (playback_channel->pending_frame) {
- snd_playback_free_frame(playback_channel, playback_channel->pending_frame);
- }
- frame->time = reds_get_mm_time();
- red_dispatcher_set_mm_time(frame->time);
- playback_channel->pending_frame = frame;
- snd_set_command(&playback_channel->base, SND_PLAYBACK_PCM_MASK);
- snd_playback_send(&playback_channel->base);
-}
-
-void snd_set_playback_latency(RedClient *client, uint32_t latency)
-{
- SndWorker *now = workers;
-
- for (; now; now = now->next) {
- if (now->base_channel->type == SPICE_CHANNEL_PLAYBACK && now->connection &&
- now->connection->channel_client->client == client) {
-
- if (red_channel_client_test_remote_cap(now->connection->channel_client,
- SPICE_PLAYBACK_CAP_LATENCY)) {
- PlaybackChannel* playback = (PlaybackChannel*)now->connection;
-
- playback->latency = latency;
- snd_set_command(now->connection, SND_PLAYBACK_LATENCY_MASK);
- snd_playback_send(now->connection);
- } else {
- spice_debug("client doesn't not support SPICE_PLAYBACK_CAP_LATENCY");
- }
- }
- }
-}
-
-static int snd_desired_audio_mode(int frequency, int client_can_celt, int client_can_opus)
-{
- if (! playback_compression)
- return SPICE_AUDIO_DATA_MODE_RAW;
-
- if (client_can_opus && snd_codec_is_capable(SPICE_AUDIO_DATA_MODE_OPUS, frequency))
- return SPICE_AUDIO_DATA_MODE_OPUS;
-
- if (client_can_celt && snd_codec_is_capable(SPICE_AUDIO_DATA_MODE_CELT_0_5_1, frequency))
- return SPICE_AUDIO_DATA_MODE_CELT_0_5_1;
-
- return SPICE_AUDIO_DATA_MODE_RAW;
-}
-
-static void on_new_playback_channel(SndWorker *worker)
-{
- PlaybackChannel *playback_channel =
- SPICE_CONTAINEROF(worker->connection, PlaybackChannel, base);
- SpicePlaybackState *st = SPICE_CONTAINEROF(worker, SpicePlaybackState, worker);
-
- spice_assert(playback_channel);
-
- snd_set_command((SndChannel *)playback_channel, SND_PLAYBACK_MODE_MASK);
- if (playback_channel->base.active) {
- snd_set_command((SndChannel *)playback_channel, SND_PLAYBACK_CTRL_MASK);
- }
- if (st->volume.volume_nchannels) {
- snd_set_command((SndChannel *)playback_channel, SND_PLAYBACK_VOLUME_MASK);
- }
- if (playback_channel->base.active) {
- reds_disable_mm_timer();
- }
-}
-
-static void snd_playback_cleanup(SndChannel *channel)
-{
- PlaybackChannel *playback_channel = SPICE_CONTAINEROF(channel, PlaybackChannel, base);
-
- if (playback_channel->base.active) {
- reds_enable_mm_timer();
- }
-
- snd_codec_destroy(&playback_channel->codec);
-}
-
-static void snd_set_playback_peer(RedChannel *channel, RedClient *client, RedsStream *stream,
- int migration, int num_common_caps, uint32_t *common_caps,
- int num_caps, uint32_t *caps)
-{
- SndWorker *worker = channel->data;
- PlaybackChannel *playback_channel;
- SpicePlaybackState *st = SPICE_CONTAINEROF(worker, SpicePlaybackState, worker);
-
- snd_disconnect_channel(worker->connection);
-
- if (!(playback_channel = (PlaybackChannel *)__new_channel(worker,
- sizeof(*playback_channel),
- SPICE_CHANNEL_PLAYBACK,
- client,
- stream,
- migration,
- snd_playback_send,
- snd_playback_handle_message,
- snd_playback_on_message_done,
- snd_playback_cleanup,
- common_caps, num_common_caps,
- caps, num_caps))) {
- return;
- }
- worker->connection = &playback_channel->base;
- snd_playback_free_frame(playback_channel, &playback_channel->frames[0]);
- snd_playback_free_frame(playback_channel, &playback_channel->frames[1]);
- snd_playback_free_frame(playback_channel, &playback_channel->frames[2]);
-
- int client_can_celt = red_channel_client_test_remote_cap(playback_channel->base.channel_client,
- SPICE_PLAYBACK_CAP_CELT_0_5_1);
- int client_can_opus = red_channel_client_test_remote_cap(playback_channel->base.channel_client,
- SPICE_PLAYBACK_CAP_OPUS);
- int desired_mode = snd_desired_audio_mode(st->frequency, client_can_celt, client_can_opus);
- playback_channel->mode = SPICE_AUDIO_DATA_MODE_RAW;
- if (desired_mode != SPICE_AUDIO_DATA_MODE_RAW) {
- if (snd_codec_create(&playback_channel->codec, desired_mode, st->frequency, SND_CODEC_ENCODE) == SND_CODEC_OK) {
- playback_channel->mode = desired_mode;
- } else {
- spice_printerr("create encoder failed");
- }
- }
-
- on_new_playback_channel(worker);
- if (worker->active) {
- spice_server_playback_start(st->sin);
- }
- snd_playback_send(worker->connection);
-}
-
-static void snd_record_migrate_channel_client(RedChannelClient *rcc)
-{
- SndWorker *worker;
-
- spice_debug(NULL);
- spice_assert(rcc->channel);
- spice_assert(rcc->channel->data);
- worker = (SndWorker *)rcc->channel->data;
-
- if (worker->connection) {
- spice_assert(worker->connection->channel_client == rcc);
- snd_set_command(worker->connection, SND_RECORD_MIGRATE_MASK);
- snd_record_send(worker->connection);
- }
-}
-
-SPICE_GNUC_VISIBLE void spice_server_record_set_volume(SpiceRecordInstance *sin,
- uint8_t nchannels,
- uint16_t *volume)
-{
- SpiceVolumeState *st = &sin->st->volume;
- SndChannel *channel = sin->st->worker.connection;
- RecordChannel *record_channel = SPICE_CONTAINEROF(channel, RecordChannel, base);
-
- st->volume_nchannels = nchannels;
- free(st->volume);
- st->volume = spice_memdup(volume, sizeof(uint16_t) * nchannels);
-
- if (!channel || nchannels == 0)
- return;
-
- snd_record_send_volume(record_channel);
-}
-
-SPICE_GNUC_VISIBLE void spice_server_record_set_mute(SpiceRecordInstance *sin, uint8_t mute)
-{
- SpiceVolumeState *st = &sin->st->volume;
- SndChannel *channel = sin->st->worker.connection;
- RecordChannel *record_channel = SPICE_CONTAINEROF(channel, RecordChannel, base);
-
- st->mute = mute;
-
- if (!channel)
- return;
-
- snd_record_send_mute(record_channel);
-}
-
-SPICE_GNUC_VISIBLE void spice_server_record_start(SpiceRecordInstance *sin)
-{
- SndChannel *channel = sin->st->worker.connection;
- RecordChannel *record_channel = SPICE_CONTAINEROF(channel, RecordChannel, base);
-
- sin->st->worker.active = 1;
- if (!channel)
- return;
- spice_assert(!record_channel->base.active);
- record_channel->base.active = TRUE;
- record_channel->read_pos = record_channel->write_pos = 0; //todo: improve by
- //stream generation
- if (!record_channel->base.client_active) {
- snd_set_command(&record_channel->base, SND_RECORD_CTRL_MASK);
- snd_record_send(&record_channel->base);
- } else {
- record_channel->base.command &= ~SND_RECORD_CTRL_MASK;
- }
-}
-
-SPICE_GNUC_VISIBLE void spice_server_record_stop(SpiceRecordInstance *sin)
-{
- SndChannel *channel = sin->st->worker.connection;
- RecordChannel *record_channel = SPICE_CONTAINEROF(channel, RecordChannel, base);
-
- sin->st->worker.active = 0;
- if (!channel)
- return;
- spice_assert(record_channel->base.active);
- record_channel->base.active = FALSE;
- if (record_channel->base.client_active) {
- snd_set_command(&record_channel->base, SND_RECORD_CTRL_MASK);
- snd_record_send(&record_channel->base);
- } else {
- record_channel->base.command &= ~SND_RECORD_CTRL_MASK;
- }
-}
-
-SPICE_GNUC_VISIBLE uint32_t spice_server_record_get_samples(SpiceRecordInstance *sin,
- uint32_t *samples, uint32_t bufsize)
-{
- SndChannel *channel = sin->st->worker.connection;
- RecordChannel *record_channel = SPICE_CONTAINEROF(channel, RecordChannel, base);
- uint32_t read_pos;
- uint32_t now;
- uint32_t len;
-
- if (!channel)
- return 0;
- spice_assert(record_channel->base.active);
-
- if (record_channel->write_pos < RECORD_SAMPLES_SIZE / 2) {
- return 0;
- }
-
- len = MIN(record_channel->write_pos - record_channel->read_pos, bufsize);
-
- if (len < bufsize) {
- SndWorker *worker = record_channel->base.worker;
- snd_receive(record_channel);
- if (!worker->connection) {
- return 0;
- }
- len = MIN(record_channel->write_pos - record_channel->read_pos, bufsize);
- }
-
- read_pos = record_channel->read_pos % RECORD_SAMPLES_SIZE;
- record_channel->read_pos += len;
- now = MIN(len, RECORD_SAMPLES_SIZE - read_pos);
- memcpy(samples, &record_channel->samples[read_pos], now * 4);
- if (now < len) {
- memcpy(samples + now, record_channel->samples, (len - now) * 4);
- }
- return len;
-}
-
-SPICE_GNUC_VISIBLE uint32_t spice_server_get_best_playback_rate(SpicePlaybackInstance *sin)
-{
- int client_can_opus = TRUE;
- if (sin && sin->st->worker.connection) {
- SndChannel *channel = sin->st->worker.connection;
- PlaybackChannel *playback_channel = SPICE_CONTAINEROF(channel, PlaybackChannel, base);
- client_can_opus = red_channel_client_test_remote_cap(playback_channel->base.channel_client,
- SPICE_PLAYBACK_CAP_OPUS);
- }
-
- if (client_can_opus && snd_codec_is_capable(SPICE_AUDIO_DATA_MODE_OPUS, SND_CODEC_ANY_FREQUENCY))
- return SND_CODEC_OPUS_PLAYBACK_FREQ;
-
- return SND_CODEC_CELT_PLAYBACK_FREQ;
-}
-
-SPICE_GNUC_VISIBLE void spice_server_set_playback_rate(SpicePlaybackInstance *sin, uint32_t frequency)
-{
- RedChannel *channel = sin->st->worker.base_channel;
- sin->st->frequency = frequency;
- if (channel && snd_codec_is_capable(SPICE_AUDIO_DATA_MODE_OPUS, frequency))
- red_channel_set_cap(channel, SPICE_PLAYBACK_CAP_OPUS);
-}
-
-SPICE_GNUC_VISIBLE uint32_t spice_server_get_best_record_rate(SpiceRecordInstance *sin)
-{
- int client_can_opus = TRUE;
- if (sin && sin->st->worker.connection) {
- SndChannel *channel = sin->st->worker.connection;
- RecordChannel *record_channel = SPICE_CONTAINEROF(channel, RecordChannel, base);
- client_can_opus = red_channel_client_test_remote_cap(record_channel->base.channel_client,
- SPICE_RECORD_CAP_OPUS);
- }
-
- if (client_can_opus && snd_codec_is_capable(SPICE_AUDIO_DATA_MODE_OPUS, SND_CODEC_ANY_FREQUENCY))
- return SND_CODEC_OPUS_PLAYBACK_FREQ;
-
- return SND_CODEC_CELT_PLAYBACK_FREQ;
-}
-
-SPICE_GNUC_VISIBLE void spice_server_set_record_rate(SpiceRecordInstance *sin, uint32_t frequency)
-{
- RedChannel *channel = sin->st->worker.base_channel;
- sin->st->frequency = frequency;
- if (channel && snd_codec_is_capable(SPICE_AUDIO_DATA_MODE_OPUS, frequency))
- red_channel_set_cap(channel, SPICE_RECORD_CAP_OPUS);
-}
-
-static void on_new_record_channel(SndWorker *worker)
-{
- RecordChannel *record_channel = (RecordChannel *)worker->connection;
- SpiceRecordState *st = SPICE_CONTAINEROF(worker, SpiceRecordState, worker);
-
- spice_assert(record_channel);
-
- if (st->volume.volume_nchannels) {
- snd_set_command((SndChannel *)record_channel, SND_RECORD_VOLUME_MASK);
- }
- if (record_channel->base.active) {
- snd_set_command((SndChannel *)record_channel, SND_RECORD_CTRL_MASK);
- }
-}
-
-static void snd_record_cleanup(SndChannel *channel)
-{
- RecordChannel *record_channel = SPICE_CONTAINEROF(channel, RecordChannel, base);
- snd_codec_destroy(&record_channel->codec);
-}
-
-static void snd_set_record_peer(RedChannel *channel, RedClient *client, RedsStream *stream,
- int migration, int num_common_caps, uint32_t *common_caps,
- int num_caps, uint32_t *caps)
-{
- SndWorker *worker = channel->data;
- RecordChannel *record_channel;
- SpiceRecordState *st = SPICE_CONTAINEROF(worker, SpiceRecordState, worker);
-
- snd_disconnect_channel(worker->connection);
-
- if (!(record_channel = (RecordChannel *)__new_channel(worker,
- sizeof(*record_channel),
- SPICE_CHANNEL_RECORD,
- client,
- stream,
- migration,
- snd_record_send,
- snd_record_handle_message,
- snd_record_on_message_done,
- snd_record_cleanup,
- common_caps, num_common_caps,
- caps, num_caps))) {
- return;
- }
-
- record_channel->mode = SPICE_AUDIO_DATA_MODE_RAW;
-
- worker->connection = &record_channel->base;
-
- on_new_record_channel(worker);
- if (worker->active) {
- spice_server_record_start(st->sin);
- }
- snd_record_send(worker->connection);
-}
-
-static void snd_playback_migrate_channel_client(RedChannelClient *rcc)
-{
- SndWorker *worker;
-
- spice_assert(rcc->channel);
- spice_assert(rcc->channel->data);
- worker = (SndWorker *)rcc->channel->data;
- spice_debug(NULL);
-
- if (worker->connection) {
- spice_assert(worker->connection->channel_client == rcc);
- snd_set_command(worker->connection, SND_PLAYBACK_MIGRATE_MASK);
- snd_playback_send(worker->connection);
- }
-}
-
-static void add_worker(SndWorker *worker)
-{
- worker->next = workers;
- workers = worker;
-}
-
-static void remove_worker(SndWorker *worker)
-{
- SndWorker **now = &workers;
- while (*now) {
- if (*now == worker) {
- *now = worker->next;
- return;
- }
- now = &(*now)->next;
- }
- spice_printerr("not found");
-}
-
-void snd_attach_playback(SpicePlaybackInstance *sin)
-{
- SndWorker *playback_worker;
- RedChannel *channel;
- ClientCbs client_cbs = { NULL, };
-
- sin->st = spice_new0(SpicePlaybackState, 1);
- sin->st->sin = sin;
- playback_worker = &sin->st->worker;
- sin->st->frequency = SND_CODEC_CELT_PLAYBACK_FREQ; /* Default to the legacy rate */
-
- // TODO: Make RedChannel base of worker? instead of assigning it to channel->data
- channel = red_channel_create_dummy(sizeof(RedChannel), SPICE_CHANNEL_PLAYBACK, 0);
-
- channel->data = playback_worker;
- client_cbs.connect = snd_set_playback_peer;
- client_cbs.disconnect = snd_disconnect_channel_client;
- client_cbs.migrate = snd_playback_migrate_channel_client;
- red_channel_register_client_cbs(channel, &client_cbs);
- red_channel_set_data(channel, playback_worker);
-
- if (snd_codec_is_capable(SPICE_AUDIO_DATA_MODE_CELT_0_5_1, SND_CODEC_ANY_FREQUENCY))
- red_channel_set_cap(channel, SPICE_PLAYBACK_CAP_CELT_0_5_1);
-
- red_channel_set_cap(channel, SPICE_PLAYBACK_CAP_VOLUME);
-
- playback_worker->base_channel = channel;
- add_worker(playback_worker);
- reds_register_channel(playback_worker->base_channel);
-}
-
-void snd_attach_record(SpiceRecordInstance *sin)
-{
- SndWorker *record_worker;
- RedChannel *channel;
- ClientCbs client_cbs = { NULL, };
-
- sin->st = spice_new0(SpiceRecordState, 1);
- sin->st->sin = sin;
- record_worker = &sin->st->worker;
- sin->st->frequency = SND_CODEC_CELT_PLAYBACK_FREQ; /* Default to the legacy rate */
-
- // TODO: Make RedChannel base of worker? instead of assigning it to channel->data
- channel = red_channel_create_dummy(sizeof(RedChannel), SPICE_CHANNEL_RECORD, 0);
-
- channel->data = record_worker;
- client_cbs.connect = snd_set_record_peer;
- client_cbs.disconnect = snd_disconnect_channel_client;
- client_cbs.migrate = snd_record_migrate_channel_client;
- red_channel_register_client_cbs(channel, &client_cbs);
- red_channel_set_data(channel, record_worker);
- if (snd_codec_is_capable(SPICE_AUDIO_DATA_MODE_CELT_0_5_1, SND_CODEC_ANY_FREQUENCY))
- red_channel_set_cap(channel, SPICE_RECORD_CAP_CELT_0_5_1);
- red_channel_set_cap(channel, SPICE_RECORD_CAP_VOLUME);
-
- record_worker->base_channel = channel;
- add_worker(record_worker);
- reds_register_channel(record_worker->base_channel);
-}
-
-static void snd_detach_common(SndWorker *worker)
-{
- if (!worker) {
- return;
- }
- remove_worker(worker);
- snd_disconnect_channel(worker->connection);
- reds_unregister_channel(worker->base_channel);
- red_channel_destroy(worker->base_channel);
-}
-
-static void spice_playback_state_free(SpicePlaybackState *st)
-{
- free(st->volume.volume);
- free(st);
-}
-
-void snd_detach_playback(SpicePlaybackInstance *sin)
-{
- snd_detach_common(&sin->st->worker);
- spice_playback_state_free(sin->st);
-}
-
-static void spice_record_state_free(SpiceRecordState *st)
-{
- free(st->volume.volume);
- free(st);
-}
-
-void snd_detach_record(SpiceRecordInstance *sin)
-{
- snd_detach_common(&sin->st->worker);
- spice_record_state_free(sin->st);
-}
-
-void snd_set_playback_compression(int on)
-{
- SndWorker *now = workers;
-
- playback_compression = !!on;
-
- for (; now; now = now->next) {
- if (now->base_channel->type == SPICE_CHANNEL_PLAYBACK && now->connection) {
- PlaybackChannel* playback = (PlaybackChannel*)now->connection;
- SpicePlaybackState *st = SPICE_CONTAINEROF(now, SpicePlaybackState, worker);
- int client_can_celt = red_channel_client_test_remote_cap(playback->base.channel_client,
- SPICE_PLAYBACK_CAP_CELT_0_5_1);
- int client_can_opus = red_channel_client_test_remote_cap(playback->base.channel_client,
- SPICE_PLAYBACK_CAP_OPUS);
- int desired_mode = snd_desired_audio_mode(st->frequency, client_can_opus, client_can_celt);
- if (playback->mode != desired_mode) {
- playback->mode = desired_mode;
- snd_set_command(now->connection, SND_PLAYBACK_MODE_MASK);
- }
- }
- }
-}
-
-int snd_get_playback_compression(void)
-{
- return playback_compression;
-}
diff --git a/server/sound.cpp b/server/sound.cpp
new file mode 100644
index 00000000..4909d158
--- /dev/null
+++ b/server/sound.cpp
@@ -0,0 +1,1309 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+
+#include <cerrno>
+#include <climits>
+
+#include <fcntl.h>
+#include <sys/types.h>
+#ifndef _WIN32
+#include <netinet/in.h>
+#include <sys/socket.h>
+#include <netinet/ip.h>
+#include <netinet/tcp.h>
+#endif
+
+#include <common/generated_server_marshallers.h>
+#include <common/snd_codec.h>
+
+#include "glib-compat.h"
+#include "spice-wrapped.h"
+#include "red-common.h"
+#include "main-channel.h"
+#include "reds.h"
+#include "red-channel-client.h"
+#include "red-client.h"
+#include "sound.h"
+#include "main-channel-client.h"
+
+#define SND_RECEIVE_BUF_SIZE (16 * 1024 * 2)
+#define RECORD_SAMPLES_SIZE (SND_RECEIVE_BUF_SIZE >> 2)
+
+enum SndCommand {
+ SND_MIGRATE,
+ SND_CTRL,
+ SND_VOLUME,
+ SND_MUTE,
+ SND_END_COMMAND,
+};
+
+enum PlaybackCommand {
+ SND_PLAYBACK_MODE = SND_END_COMMAND,
+ SND_PLAYBACK_PCM,
+ SND_PLAYBACK_LATENCY,
+};
+
+#define SND_MIGRATE_MASK (1 << SND_MIGRATE)
+#define SND_CTRL_MASK (1 << SND_CTRL)
+#define SND_VOLUME_MASK (1 << SND_VOLUME)
+#define SND_MUTE_MASK (1 << SND_MUTE)
+#define SND_VOLUME_MUTE_MASK (SND_VOLUME_MASK|SND_MUTE_MASK)
+
+#define SND_PLAYBACK_MODE_MASK (1 << SND_PLAYBACK_MODE)
+#define SND_PLAYBACK_PCM_MASK (1 << SND_PLAYBACK_PCM)
+#define SND_PLAYBACK_LATENCY_MASK ( 1 << SND_PLAYBACK_LATENCY)
+
+class SndChannelClient;
+struct SndChannel;
+class PlaybackChannelClient;
+class RecordChannelClient;
+struct AudioFrame;
+struct AudioFrameContainer;
+
+enum {
+ RED_PIPE_ITEM_PERSISTENT = RED_PIPE_ITEM_TYPE_CHANNEL_BASE,
+};
+
+/* This pipe item is never deleted and added to the queue when messages
+ * have to be sent.
+ * This is used to have a simple item in RedChannelClient queue but to send
+ * multiple messages in a row if possible.
+ * During realtime sound transmission you usually don't want to queue too
+ * much data or having retransmission preferring instead loosing some
+ * samples.
+ */
+struct PersistentPipeItem final: public RedPipeItemNum<RED_PIPE_ITEM_PERSISTENT>
+{
+ PersistentPipeItem();
+};
+
+/* Connects an audio client to a Spice client */
+class SndChannelClient: public RedChannelClient
+{
+public:
+ using RedChannelClient::RedChannelClient;
+
+ bool active;
+ bool client_active;
+
+ uint32_t command;
+
+ PersistentPipeItem persistent_pipe_item;
+
+ inline SndChannel* get_channel();
+
+ bool config_socket() override;
+ uint8_t *alloc_recv_buf(uint16_t type, uint32_t size) override;
+ void release_recv_buf(uint16_t type, uint32_t size, uint8_t *msg) override;
+ void migrate() override;
+
+private:
+ /* we don't expect very big messages so don't allocate too much
+ * bytes, data will be cached in RecordChannelClient::samples */
+ uint8_t receive_buf[SND_CODEC_MAX_FRAME_BYTES + 64];
+};
+
+static void snd_playback_alloc_frames(PlaybackChannelClient *playback);
+
+
+struct AudioFrame {
+ uint32_t time;
+ uint32_t samples[SND_CODEC_MAX_FRAME_SIZE];
+ PlaybackChannelClient *client;
+ AudioFrame *next;
+ AudioFrameContainer *container;
+ bool allocated;
+};
+
+#define NUM_AUDIO_FRAMES 3
+struct AudioFrameContainer
+{
+ int refs;
+ AudioFrame items[NUM_AUDIO_FRAMES];
+};
+
+class PlaybackChannelClient final: public SndChannelClient
+{
+protected:
+ ~PlaybackChannelClient() override;
+public:
+ PlaybackChannelClient(PlaybackChannel *channel,
+ RedClient *client,
+ RedStream *stream,
+ RedChannelCapabilities *caps);
+ bool init() override;
+
+ AudioFrameContainer *frames = nullptr;
+ AudioFrame *free_frames = nullptr;
+ AudioFrame *in_progress = nullptr; /* Frame being sent to the client */
+ AudioFrame *pending_frame = nullptr; /* Next frame to send to the client */
+ SpiceAudioDataMode mode = SPICE_AUDIO_DATA_MODE_RAW;
+ uint32_t latency = 0;
+ SndCodec codec = nullptr;
+ uint8_t encode_buf[SND_CODEC_MAX_COMPRESSED_BYTES];
+
+ static void on_message_marshalled(uint8_t *data, void *opaque);
+protected:
+ void send_item(RedPipeItem *item) override;
+};
+
+struct SpiceVolumeState {
+ uint16_t *volume;
+ uint8_t volume_nchannels;
+ int mute;
+};
+
+/* Base class for PlaybackChannel and RecordChannel */
+struct SndChannel: public RedChannel
+{
+ using RedChannel::RedChannel;
+ ~SndChannel() override;
+ void set_peer_common();
+ bool active;
+ SpiceVolumeState volume;
+ uint32_t frequency = SND_CODEC_OPUS_PLAYBACK_FREQ;
+};
+
+inline SndChannel* SndChannelClient::get_channel()
+{
+ return static_cast<SndChannel*>(RedChannelClient::get_channel());
+}
+
+struct PlaybackChannel final: public SndChannel
+{
+ explicit PlaybackChannel(RedsState *reds);
+ void on_connect(RedClient *client, RedStream *stream,
+ int migration, RedChannelCapabilities *caps) override;
+};
+
+
+struct RecordChannel final: public SndChannel
+{
+ explicit RecordChannel(RedsState *reds);
+ void on_connect(RedClient *client, RedStream *stream,
+ int migration, RedChannelCapabilities *caps) override;
+};
+
+
+class RecordChannelClient final: public SndChannelClient
+{
+protected:
+ ~RecordChannelClient() override;
+public:
+ using SndChannelClient::SndChannelClient;
+ bool init() override;
+
+ uint32_t samples[RECORD_SAMPLES_SIZE];
+ uint32_t write_pos = 0;
+ uint32_t read_pos = 0;
+ SpiceAudioDataMode mode = SPICE_AUDIO_DATA_MODE_RAW;
+ uint32_t mode_time = 0;
+ uint32_t start_time = 0;
+ SndCodec codec = nullptr;
+ uint8_t decode_buf[SND_CODEC_MAX_FRAME_BYTES];
+protected:
+ bool handle_message(uint16_t type, uint32_t size, void *message) override;
+ void send_item(RedPipeItem *item) override;
+};
+
+
+/* A list of all Spice{Playback,Record}State objects */
+static GList *snd_channels;
+
+static void snd_send(SndChannelClient * client);
+
+/* sound channels only support a single client */
+static SndChannelClient *snd_channel_get_client(SndChannel *channel)
+{
+ GList *clients = channel->get_clients();
+ if (clients == nullptr) {
+ return nullptr;
+ }
+
+ return static_cast<SndChannelClient *>(clients->data);
+}
+
+static RedsState* snd_channel_get_server(SndChannelClient *client)
+{
+ g_return_val_if_fail(client != nullptr, NULL);
+ return client->get_channel()->get_server();
+}
+
+static void snd_playback_free_frame(PlaybackChannelClient *playback_client, AudioFrame *frame)
+{
+ frame->client = playback_client;
+ frame->next = playback_client->free_frames;
+ playback_client->free_frames = frame;
+}
+
+void PlaybackChannelClient::on_message_marshalled(uint8_t *, void *opaque)
+{
+ auto client = reinterpret_cast<PlaybackChannelClient*>(opaque);
+
+ if (client->in_progress) {
+ snd_playback_free_frame(client, client->in_progress);
+ client->in_progress = nullptr;
+ if (client->pending_frame) {
+ client->command |= SND_PLAYBACK_PCM_MASK;
+ snd_send(client);
+ }
+ }
+}
+
+static bool snd_record_handle_write(RecordChannelClient *record_client, size_t size, void *message)
+{
+ SpiceMsgcRecordPacket *packet;
+ uint32_t write_pos;
+ uint8_t* data;
+ uint32_t len;
+ uint32_t now;
+
+ if (!record_client) {
+ return false;
+ }
+
+ packet = static_cast<SpiceMsgcRecordPacket *>(message);
+
+ if (record_client->mode == SPICE_AUDIO_DATA_MODE_RAW) {
+ data = packet->data;
+ size = packet->data_size >> 2;
+ size = MIN(size, RECORD_SAMPLES_SIZE);
+ } else {
+ int decode_size;
+ decode_size = sizeof(record_client->decode_buf);
+ if (snd_codec_decode(record_client->codec, packet->data, packet->data_size,
+ record_client->decode_buf, &decode_size) != SND_CODEC_OK)
+ return false;
+ data = record_client->decode_buf;
+ size = decode_size >> 2;
+ }
+
+ write_pos = record_client->write_pos % RECORD_SAMPLES_SIZE;
+ record_client->write_pos += size;
+ len = RECORD_SAMPLES_SIZE - write_pos;
+ now = MIN(len, size);
+ size -= now;
+ memcpy(record_client->samples + write_pos, data, now << 2);
+
+ if (size) {
+ memcpy(record_client->samples, data + (now << 2), size << 2);
+ }
+
+ if (record_client->write_pos - record_client->read_pos > RECORD_SAMPLES_SIZE) {
+ record_client->read_pos = record_client->write_pos - RECORD_SAMPLES_SIZE;
+ }
+ return true;
+}
+
+static const char*
+spice_audio_data_mode_to_string(SpiceAudioDataMode mode)
+{
+ switch (mode) {
+ case SPICE_AUDIO_DATA_MODE_INVALID:
+ return "invalid";
+ case SPICE_AUDIO_DATA_MODE_RAW:
+ return "raw";
+ G_GNUC_BEGIN_IGNORE_DEPRECATIONS
+ case SPICE_AUDIO_DATA_MODE_CELT_0_5_1:
+ return "celt";
+ G_GNUC_END_IGNORE_DEPRECATIONS
+ case SPICE_AUDIO_DATA_MODE_OPUS:
+ return "opus";
+ case SPICE_AUDIO_DATA_MODE_ENUM_END:
+ break;
+ }
+ return "unknown audio codec";
+}
+
+XXX_CAST(RedChannelClient, RecordChannelClient, RECORD_CHANNEL_CLIENT)
+
+bool RecordChannelClient::handle_message(uint16_t type, uint32_t size, void *message)
+{
+ switch (type) {
+ case SPICE_MSGC_RECORD_DATA:
+ return snd_record_handle_write(this, size, message);
+ case SPICE_MSGC_RECORD_MODE: {
+ auto msg_mode = static_cast<SpiceMsgcRecordMode *>(message);
+ SndChannel *channel = get_channel();
+ mode_time = msg_mode->time;
+ auto new_mode = static_cast<SpiceAudioDataMode>(msg_mode->mode);
+ if (new_mode != SPICE_AUDIO_DATA_MODE_RAW) {
+ if (snd_codec_is_capable(new_mode, channel->frequency)) {
+ if (snd_codec_create(&codec, new_mode,
+ channel->frequency, SND_CODEC_DECODE) == SND_CODEC_OK) {
+ mode = new_mode;
+ } else {
+ red_channel_warning(channel, "create decoder failed");
+ return false;
+ }
+ } else {
+ red_channel_warning(channel, "unsupported mode %d", mode);
+ return false;
+ }
+ } else {
+ mode = new_mode;
+ }
+
+ spice_debug("record client %p using mode %s", this,
+ spice_audio_data_mode_to_string(mode));
+ break;
+ }
+
+ case SPICE_MSGC_RECORD_START_MARK: {
+ auto mark = static_cast<SpiceMsgcRecordStartMark *>(message);
+ start_time = mark->time;
+ break;
+ }
+ default:
+ return RedChannelClient::handle_message(type, size, message);
+ }
+ return true;
+}
+
+static bool snd_channel_send_migrate(SndChannelClient *client)
+{
+ RedChannelClient *rcc = client;
+ SpiceMarshaller *m = rcc->get_marshaller();
+ SpiceMsgMigrate migrate;
+
+ rcc->init_send_data(SPICE_MSG_MIGRATE);
+ migrate.flags = 0;
+ spice_marshall_msg_migrate(m, &migrate);
+
+ rcc->begin_send_message();
+ return true;
+}
+
+static bool snd_playback_send_migrate(PlaybackChannelClient *client)
+{
+ return snd_channel_send_migrate(client);
+}
+
+static bool snd_send_volume(SndChannelClient *client, uint32_t cap, int msg)
+{
+ SpiceMsgAudioVolume *vol;
+ uint8_t c;
+ RedChannelClient *rcc = client;
+ SpiceMarshaller *m = rcc->get_marshaller();
+ SndChannel *channel = client->get_channel();
+ SpiceVolumeState *st = &channel->volume;
+
+ if (!rcc->test_remote_cap(cap)) {
+ return false;
+ }
+
+ vol = static_cast<SpiceMsgAudioVolume *>(
+ alloca(sizeof(SpiceMsgAudioVolume) + st->volume_nchannels * sizeof(uint16_t)));
+ rcc->init_send_data(msg);
+ vol->nchannels = st->volume_nchannels;
+ for (c = 0; c < st->volume_nchannels; ++c) {
+ vol->volume[c] = st->volume[c];
+ }
+ spice_marshall_SpiceMsgAudioVolume(m, vol);
+
+ rcc->begin_send_message();
+ return true;
+}
+
+static bool snd_playback_send_volume(PlaybackChannelClient *playback_client)
+{
+ return snd_send_volume(playback_client, SPICE_PLAYBACK_CAP_VOLUME,
+ SPICE_MSG_PLAYBACK_VOLUME);
+}
+
+static bool snd_send_mute(SndChannelClient *client, uint32_t cap, int msg)
+{
+ SpiceMsgAudioMute mute;
+ RedChannelClient *rcc = client;
+ SpiceMarshaller *m = rcc->get_marshaller();
+ SndChannel *channel = client->get_channel();
+ SpiceVolumeState *st = &channel->volume;
+
+ if (!rcc->test_remote_cap(cap)) {
+ return false;
+ }
+
+ rcc->init_send_data(msg);
+ mute.mute = st->mute;
+ spice_marshall_SpiceMsgAudioMute(m, &mute);
+
+ rcc->begin_send_message();
+ return true;
+}
+
+static bool snd_playback_send_mute(PlaybackChannelClient *playback_client)
+{
+ return snd_send_mute(playback_client, SPICE_PLAYBACK_CAP_VOLUME,
+ SPICE_MSG_PLAYBACK_MUTE);
+}
+
+static bool snd_playback_send_latency(PlaybackChannelClient *playback_client)
+{
+ RedChannelClient *rcc = playback_client;
+ SpiceMarshaller *m = rcc->get_marshaller();
+ SpiceMsgPlaybackLatency latency_msg;
+
+ spice_debug("latency %u", playback_client->latency);
+ rcc->init_send_data(SPICE_MSG_PLAYBACK_LATENCY);
+ latency_msg.latency_ms = playback_client->latency;
+ spice_marshall_msg_playback_latency(m, &latency_msg);
+
+ rcc->begin_send_message();
+ return true;
+}
+
+static bool snd_playback_send_start(PlaybackChannelClient *playback_client)
+{
+ SpiceMarshaller *m = playback_client->get_marshaller();
+ SpiceMsgPlaybackStart start;
+
+ playback_client->init_send_data(SPICE_MSG_PLAYBACK_START);
+ start.channels = SPICE_INTERFACE_PLAYBACK_CHAN;
+ start.frequency = playback_client->get_channel()->frequency;
+ spice_assert(SPICE_INTERFACE_PLAYBACK_FMT == SPICE_INTERFACE_AUDIO_FMT_S16);
+ start.format = SPICE_AUDIO_FMT_S16;
+ start.time = reds_get_mm_time();
+ spice_marshall_msg_playback_start(m, &start);
+
+ playback_client->begin_send_message();
+ return true;
+}
+
+static bool snd_playback_send_stop(PlaybackChannelClient *playback_client)
+{
+ RedChannelClient *rcc = playback_client;
+
+ rcc->init_send_data(SPICE_MSG_PLAYBACK_STOP);
+
+ rcc->begin_send_message();
+ return true;
+}
+
+static int snd_playback_send_ctl(PlaybackChannelClient *playback_client)
+{
+ SndChannelClient *client = playback_client;
+
+ if ((client->client_active = client->active)) {
+ return snd_playback_send_start(playback_client);
+ }
+
+ return snd_playback_send_stop(playback_client);
+}
+
+static bool snd_record_send_start(RecordChannelClient *record_client)
+{
+ RedChannelClient *rcc = record_client;
+ SpiceMarshaller *m = rcc->get_marshaller();
+ SpiceMsgRecordStart start;
+
+ rcc->init_send_data(SPICE_MSG_RECORD_START);
+
+ start.channels = SPICE_INTERFACE_RECORD_CHAN;
+ start.frequency = record_client->get_channel()->frequency;
+ spice_assert(SPICE_INTERFACE_RECORD_FMT == SPICE_INTERFACE_AUDIO_FMT_S16);
+ start.format = SPICE_AUDIO_FMT_S16;
+ spice_marshall_msg_record_start(m, &start);
+
+ rcc->begin_send_message();
+ return true;
+}
+
+static bool snd_record_send_stop(RecordChannelClient *record_client)
+{
+ RedChannelClient *rcc = record_client;
+
+ rcc->init_send_data(SPICE_MSG_RECORD_STOP);
+
+ rcc->begin_send_message();
+ return true;
+}
+
+static int snd_record_send_ctl(RecordChannelClient *record_client)
+{
+ SndChannelClient *client = record_client;
+
+ if ((client->client_active = client->active)) {
+ return snd_record_send_start(record_client);
+ }
+
+ return snd_record_send_stop(record_client);
+}
+
+static bool snd_record_send_volume(RecordChannelClient *record_client)
+{
+ return snd_send_volume(record_client, SPICE_RECORD_CAP_VOLUME,
+ SPICE_MSG_RECORD_VOLUME);
+}
+
+static bool snd_record_send_mute(RecordChannelClient *record_client)
+{
+ return snd_send_mute(record_client, SPICE_RECORD_CAP_VOLUME,
+ SPICE_MSG_RECORD_MUTE);
+}
+
+static bool snd_record_send_migrate(RecordChannelClient *record_client)
+{
+ /* No need for migration data: if recording has started before migration,
+ * the client receives RECORD_STOP from the src before the migration completion
+ * notification (when the vm is stopped).
+ * Afterwards, when the vm starts on the dest, the client receives RECORD_START. */
+ return snd_channel_send_migrate(record_client);
+}
+
+static bool snd_playback_send_write(PlaybackChannelClient *playback_client)
+{
+ RedChannelClient *rcc = playback_client;
+ SpiceMarshaller *m = rcc->get_marshaller();
+ AudioFrame *frame;
+ SpiceMsgPlaybackPacket msg;
+
+ rcc->init_send_data(SPICE_MSG_PLAYBACK_DATA);
+
+ frame = playback_client->in_progress;
+ msg.time = frame->time;
+
+ spice_marshall_msg_playback_data(m, &msg);
+
+ if (playback_client->mode == SPICE_AUDIO_DATA_MODE_RAW) {
+ spice_marshaller_add_by_ref_full(
+ m, reinterpret_cast<uint8_t *>(frame->samples),
+ snd_codec_frame_size(playback_client->codec) * sizeof(frame->samples[0]),
+ PlaybackChannelClient::on_message_marshalled, playback_client);
+ }
+ else {
+ int n = sizeof(playback_client->encode_buf);
+ if (snd_codec_encode(playback_client->codec, reinterpret_cast<uint8_t *>(frame->samples),
+ snd_codec_frame_size(playback_client->codec) *
+ sizeof(frame->samples[0]),
+ playback_client->encode_buf, &n) != SND_CODEC_OK) {
+ red_channel_warning(rcc->get_channel(), "encode failed");
+ rcc->disconnect();
+ return false;
+ }
+ spice_marshaller_add_by_ref_full(m, playback_client->encode_buf, n,
+ PlaybackChannelClient::on_message_marshalled,
+ playback_client);
+ }
+
+ rcc->begin_send_message();
+ return true;
+}
+
+static bool playback_send_mode(PlaybackChannelClient *playback_client)
+{
+ RedChannelClient *rcc = playback_client;
+ SpiceMarshaller *m = rcc->get_marshaller();
+ SpiceMsgPlaybackMode mode;
+
+ rcc->init_send_data(SPICE_MSG_PLAYBACK_MODE);
+ mode.time = reds_get_mm_time();
+ mode.mode = playback_client->mode;
+ spice_marshall_msg_playback_mode(m, &mode);
+
+ rcc->begin_send_message();
+ return true;
+}
+
+PersistentPipeItem::PersistentPipeItem()
+{
+ // force this item to stay alive
+ shared_ptr_add_ref(this);
+}
+
+static void snd_send(SndChannelClient * client)
+{
+ if (!client->pipe_is_empty()|| !client->command) {
+ return;
+ }
+ // just append a dummy item and push!
+ RedPipeItemPtr item(&client->persistent_pipe_item);
+ client->pipe_add_push(std::move(item));
+}
+
+XXX_CAST(RedChannelClient, PlaybackChannelClient, PLAYBACK_CHANNEL_CLIENT)
+
+void PlaybackChannelClient::send_item(G_GNUC_UNUSED RedPipeItem *item)
+{
+ command &= SND_PLAYBACK_MODE_MASK|SND_PLAYBACK_PCM_MASK|
+ SND_CTRL_MASK|SND_VOLUME_MUTE_MASK|
+ SND_MIGRATE_MASK|SND_PLAYBACK_LATENCY_MASK;
+ while (command) {
+ if (command & SND_PLAYBACK_MODE_MASK) {
+ command &= ~SND_PLAYBACK_MODE_MASK;
+ if (playback_send_mode(this)) {
+ break;
+ }
+ }
+ if (command & SND_PLAYBACK_PCM_MASK) {
+ spice_assert(!in_progress && pending_frame);
+ in_progress = pending_frame;
+ pending_frame = nullptr;
+ command &= ~SND_PLAYBACK_PCM_MASK;
+ if (snd_playback_send_write(this)) {
+ break;
+ }
+ red_channel_warning(get_channel(),
+ "snd_send_playback_write failed");
+ }
+ if (command & SND_CTRL_MASK) {
+ command &= ~SND_CTRL_MASK;
+ if (snd_playback_send_ctl(this)) {
+ break;
+ }
+ }
+ if (command & SND_VOLUME_MASK) {
+ command &= ~SND_VOLUME_MASK;
+ if (snd_playback_send_volume(this)) {
+ break;
+ }
+ }
+ if (command & SND_MUTE_MASK) {
+ command &= ~SND_MUTE_MASK;
+ if (snd_playback_send_mute(this)) {
+ break;
+ }
+ }
+ if (command & SND_MIGRATE_MASK) {
+ command &= ~SND_MIGRATE_MASK;
+ if (snd_playback_send_migrate(this)) {
+ break;
+ }
+ }
+ if (command & SND_PLAYBACK_LATENCY_MASK) {
+ command &= ~SND_PLAYBACK_LATENCY_MASK;
+ if (snd_playback_send_latency(this)) {
+ break;
+ }
+ }
+ }
+ snd_send(this);
+}
+
+void RecordChannelClient::send_item(G_GNUC_UNUSED RedPipeItem *item)
+{
+ command &= SND_CTRL_MASK|SND_VOLUME_MUTE_MASK|SND_MIGRATE_MASK;
+ while (command) {
+ if (command & SND_CTRL_MASK) {
+ command &= ~SND_CTRL_MASK;
+ if (snd_record_send_ctl(this)) {
+ break;
+ }
+ }
+ if (command & SND_VOLUME_MASK) {
+ command &= ~SND_VOLUME_MASK;
+ if (snd_record_send_volume(this)) {
+ break;
+ }
+ }
+ if (command & SND_MUTE_MASK) {
+ command &= ~SND_MUTE_MASK;
+ if (snd_record_send_mute(this)) {
+ break;
+ }
+ }
+ if (command & SND_MIGRATE_MASK) {
+ command &= ~SND_MIGRATE_MASK;
+ if (snd_record_send_migrate(this)) {
+ break;
+ }
+ }
+ }
+ snd_send(this);
+}
+
+bool SndChannelClient::config_socket()
+{
+ RedStream *stream = get_stream();
+ RedClient *red_client = get_client();
+ MainChannelClient *mcc = red_client->get_main();
+
+#ifdef SO_PRIORITY
+ int priority = 6;
+ if (setsockopt(stream->socket, SOL_SOCKET, SO_PRIORITY, (void*)&priority,
+ sizeof(priority)) == -1) {
+ if (errno != ENOTSUP) {
+ red_channel_warning(get_channel(),
+ "setsockopt failed, %s", strerror(errno));
+ }
+ }
+#endif
+
+#ifdef IPTOS_LOWDELAY
+ int tos = IPTOS_LOWDELAY;
+ if (setsockopt(stream->socket, IPPROTO_IP, IP_TOS, (void*)&tos, sizeof(tos)) == -1) {
+ if (errno != ENOTSUP) {
+ red_channel_warning(get_channel(),
+ "setsockopt failed, %s",
+ strerror(errno));
+ }
+ }
+#endif
+
+ red_stream_set_no_delay(stream, !mcc->is_low_bandwidth());
+
+ return true;
+}
+
+uint8_t*
+SndChannelClient::alloc_recv_buf(uint16_t type, uint32_t size)
+{
+ // If message is too big allocate one, this should never happen
+ if (size > sizeof(receive_buf)) {
+ return static_cast<uint8_t *>(g_malloc(size));
+ }
+ return receive_buf;
+}
+
+void
+SndChannelClient::release_recv_buf(uint16_t type, uint32_t size, uint8_t *msg)
+{
+ if (msg != receive_buf) {
+ g_free(msg);
+ }
+}
+
+static void snd_set_command(SndChannelClient *client, uint32_t command)
+{
+ if (!client) {
+ return;
+ }
+ client->command |= command;
+}
+
+static void snd_channel_set_volume(SndChannel *channel,
+ uint8_t nchannels, uint16_t *volume)
+{
+ SpiceVolumeState *st = &channel->volume;
+ SndChannelClient *client = snd_channel_get_client(channel);
+
+ st->volume_nchannels = nchannels;
+ g_free(st->volume);
+ st->volume = static_cast<uint16_t *>(g_memdup2(volume, sizeof(uint16_t) * nchannels));
+
+ if (!client || nchannels == 0)
+ return;
+
+ snd_set_command(client, SND_VOLUME_MASK);
+ snd_send(client);
+}
+
+SPICE_GNUC_VISIBLE void spice_server_playback_set_volume(SpicePlaybackInstance *sin,
+ uint8_t nchannels,
+ uint16_t *volume)
+{
+ snd_channel_set_volume(sin->st, nchannels, volume);
+}
+
+static void snd_channel_set_mute(SndChannel *channel, uint8_t mute)
+{
+ SpiceVolumeState *st = &channel->volume;
+ SndChannelClient *client = snd_channel_get_client(channel);
+
+ st->mute = mute;
+
+ if (!client)
+ return;
+
+ snd_set_command(client, SND_MUTE_MASK);
+ snd_send(client);
+}
+
+SPICE_GNUC_VISIBLE void spice_server_playback_set_mute(SpicePlaybackInstance *sin, uint8_t mute)
+{
+ snd_channel_set_mute(sin->st, mute);
+}
+
+static void snd_channel_client_start(SndChannelClient *client)
+{
+ spice_assert(!client->active);
+ client->active = true;
+ if (!client->client_active) {
+ snd_set_command(client, SND_CTRL_MASK);
+ snd_send(client);
+ } else {
+ client->command &= ~SND_CTRL_MASK;
+ }
+}
+
+static void playback_channel_client_start(SndChannelClient *client)
+{
+ if (!client) {
+ return;
+ }
+
+ reds_disable_mm_time(snd_channel_get_server(client));
+ snd_channel_client_start(client);
+}
+
+SPICE_GNUC_VISIBLE void spice_server_playback_start(SpicePlaybackInstance *sin)
+{
+ SndChannel *channel = sin->st;
+ channel->active = true;
+ return playback_channel_client_start(snd_channel_get_client(channel));
+}
+
+SPICE_GNUC_VISIBLE void spice_server_playback_stop(SpicePlaybackInstance *sin)
+{
+ SndChannelClient *client = snd_channel_get_client(sin->st);
+
+ sin->st->active = false;
+ if (!client)
+ return;
+ PlaybackChannelClient *playback_client = PLAYBACK_CHANNEL_CLIENT(client);
+ spice_assert(client->active);
+ reds_enable_mm_time(snd_channel_get_server(client));
+ client->active = false;
+ if (client->client_active) {
+ snd_set_command(client, SND_CTRL_MASK);
+ snd_send(client);
+ } else {
+ client->command &= ~SND_CTRL_MASK;
+ client->command &= ~SND_PLAYBACK_PCM_MASK;
+
+ if (playback_client->pending_frame) {
+ spice_assert(!playback_client->in_progress);
+ snd_playback_free_frame(playback_client,
+ playback_client->pending_frame);
+ playback_client->pending_frame = nullptr;
+ }
+ }
+}
+
+SPICE_GNUC_VISIBLE void spice_server_playback_get_buffer(SpicePlaybackInstance *sin,
+ uint32_t **samples,
+ uint32_t *num_samples)
+{
+ SndChannelClient *client = snd_channel_get_client(sin->st);
+
+ *samples = nullptr;
+ *num_samples = 0;
+ if (!client) {
+ return;
+ }
+ PlaybackChannelClient *playback_client = PLAYBACK_CHANNEL_CLIENT(client);
+ if (!playback_client->free_frames) {
+ return;
+ }
+ spice_assert(client->active);
+ if (!playback_client->free_frames->allocated) {
+ playback_client->free_frames->allocated = true;
+ ++playback_client->frames->refs;
+ }
+
+ *samples = playback_client->free_frames->samples;
+ playback_client->free_frames = playback_client->free_frames->next;
+ *num_samples = snd_codec_frame_size(playback_client->codec);
+}
+
+SPICE_GNUC_VISIBLE void spice_server_playback_put_samples(SpicePlaybackInstance *sin, uint32_t *samples)
+{
+ PlaybackChannelClient *playback_client;
+ AudioFrame *frame;
+
+ frame = SPICE_CONTAINEROF(samples, AudioFrame, samples[0]);
+ if (frame->allocated) {
+ frame->allocated = false;
+ if (--frame->container->refs == 0) {
+ g_free(frame->container);
+ return;
+ }
+ }
+ playback_client = frame->client;
+ if (!playback_client || snd_channel_get_client(sin->st) != playback_client) {
+ /* lost last reference, client has been destroyed previously */
+ spice_debug("audio samples belong to a disconnected client");
+ return;
+ }
+ spice_assert(playback_client->active);
+
+ if (playback_client->pending_frame) {
+ snd_playback_free_frame(playback_client, playback_client->pending_frame);
+ }
+ frame->time = reds_get_mm_time();
+ playback_client->pending_frame = frame;
+ snd_set_command(playback_client, SND_PLAYBACK_PCM_MASK);
+ snd_send(playback_client);
+}
+
+void snd_set_playback_latency(RedClient *client, uint32_t latency)
+{
+ GList *l;
+
+ for (l = snd_channels; l != nullptr; l = l->next) {
+ auto now = static_cast<SndChannel *>(l->data);
+ SndChannelClient *scc = snd_channel_get_client(now);
+ if (now->type() == SPICE_CHANNEL_PLAYBACK && scc &&
+ scc->get_client() == client) {
+
+ if (scc->test_remote_cap(SPICE_PLAYBACK_CAP_LATENCY)) {
+ auto playback = (PlaybackChannelClient*)scc;
+
+ playback->latency = latency;
+ snd_set_command(scc, SND_PLAYBACK_LATENCY_MASK);
+ snd_send(scc);
+ } else {
+ spice_debug("client doesn't not support SPICE_PLAYBACK_CAP_LATENCY");
+ }
+ }
+ }
+}
+
+static SpiceAudioDataMode
+snd_desired_audio_mode(bool playback_compression, int frequency, bool client_can_opus)
+{
+ if (!playback_compression)
+ return SPICE_AUDIO_DATA_MODE_RAW;
+
+ if (client_can_opus && snd_codec_is_capable(SPICE_AUDIO_DATA_MODE_OPUS, frequency))
+ return SPICE_AUDIO_DATA_MODE_OPUS;
+
+ return SPICE_AUDIO_DATA_MODE_RAW;
+}
+
+PlaybackChannelClient::~PlaybackChannelClient()
+{
+ // free frames, unref them
+ for (auto& item : frames->items) {
+ item.client = nullptr;
+ }
+ if (--frames->refs == 0) {
+ g_free(frames);
+ }
+
+ if (active) {
+ reds_enable_mm_time(snd_channel_get_server(this));
+ }
+
+ snd_codec_destroy(&codec);
+}
+
+
+PlaybackChannelClient::PlaybackChannelClient(PlaybackChannel *channel,
+ RedClient *client,
+ RedStream *stream,
+ RedChannelCapabilities *caps):
+ SndChannelClient(channel, client, stream, caps)
+{
+ snd_playback_alloc_frames(this);
+
+ bool client_can_opus = test_remote_cap(SPICE_PLAYBACK_CAP_OPUS);
+ bool playback_compression =
+ reds_config_get_playback_compression(channel->get_server());
+ auto desired_mode =
+ snd_desired_audio_mode(playback_compression, channel->frequency, client_can_opus);
+ if (desired_mode != SPICE_AUDIO_DATA_MODE_RAW) {
+ if (snd_codec_create(&codec, static_cast<SpiceAudioDataMode>(desired_mode),
+ channel->frequency, SND_CODEC_ENCODE) == SND_CODEC_OK) {
+ mode = desired_mode;
+ } else {
+ red_channel_warning(channel, "create encoder failed");
+ }
+ }
+
+ spice_debug("playback client %p using mode %s", this,
+ spice_audio_data_mode_to_string(mode));
+}
+
+bool PlaybackChannelClient::init()
+{
+ RedClient *red_client = get_client();
+ SndChannelClient *scc = this;
+ SndChannel *channel = get_channel();
+
+ if (!SndChannelClient::init()) {
+ return false;
+ }
+
+ if (!red_client->during_migrate_at_target()) {
+ snd_set_command(scc, SND_PLAYBACK_MODE_MASK);
+ if (channel->volume.volume_nchannels) {
+ snd_set_command(scc, SND_VOLUME_MUTE_MASK);
+ }
+ }
+
+ if (channel->active) {
+ playback_channel_client_start(scc);
+ }
+ snd_send(scc);
+
+ return true;
+}
+
+void SndChannel::set_peer_common()
+{
+ SndChannelClient *snd_client = snd_channel_get_client(this);
+
+ /* sound channels currently only support a single client */
+ if (snd_client) {
+ snd_client->disconnect();
+ }
+}
+
+void PlaybackChannel::on_connect(RedClient *client, RedStream *stream,
+ int migration, RedChannelCapabilities *caps)
+{
+ set_peer_common();
+
+ auto peer =
+ red::make_shared<PlaybackChannelClient>(this, client, stream, caps);
+ peer->init();
+}
+
+void SndChannelClient::migrate()
+{
+ snd_set_command(this, SND_MIGRATE_MASK);
+ snd_send(this);
+}
+
+SPICE_GNUC_VISIBLE void spice_server_record_set_volume(SpiceRecordInstance *sin,
+ uint8_t nchannels,
+ uint16_t *volume)
+{
+ snd_channel_set_volume(sin->st, nchannels, volume);
+}
+
+SPICE_GNUC_VISIBLE void spice_server_record_set_mute(SpiceRecordInstance *sin, uint8_t mute)
+{
+ snd_channel_set_mute(sin->st, mute);
+}
+
+static void record_channel_client_start(SndChannelClient *client)
+{
+ if (!client) {
+ return;
+ }
+
+ RecordChannelClient *record_client = RECORD_CHANNEL_CLIENT(client);
+ record_client->read_pos = record_client->write_pos = 0; //todo: improve by
+ //stream generation
+ snd_channel_client_start(client);
+}
+
+SPICE_GNUC_VISIBLE void spice_server_record_start(SpiceRecordInstance *sin)
+{
+ SndChannel *channel = sin->st;
+ channel->active = true;
+ record_channel_client_start(snd_channel_get_client(channel));
+}
+
+SPICE_GNUC_VISIBLE void spice_server_record_stop(SpiceRecordInstance *sin)
+{
+ SndChannelClient *client = snd_channel_get_client(sin->st);
+
+ sin->st->active = false;
+ if (!client)
+ return;
+ spice_assert(client->active);
+ client->active = false;
+ if (client->client_active) {
+ snd_set_command(client, SND_CTRL_MASK);
+ snd_send(client);
+ } else {
+ client->command &= ~SND_CTRL_MASK;
+ }
+}
+
+SPICE_GNUC_VISIBLE uint32_t spice_server_record_get_samples(SpiceRecordInstance *sin,
+ uint32_t *samples, uint32_t bufsize)
+{
+ SndChannelClient *client = snd_channel_get_client(sin->st);
+ uint32_t read_pos;
+ uint32_t now;
+ uint32_t len;
+
+ if (!client)
+ return 0;
+ RecordChannelClient *record_client = RECORD_CHANNEL_CLIENT(client);
+ spice_assert(client->active);
+
+ if (record_client->write_pos < RECORD_SAMPLES_SIZE / 2) {
+ return 0;
+ }
+
+ len = MIN(record_client->write_pos - record_client->read_pos, bufsize);
+
+ read_pos = record_client->read_pos % RECORD_SAMPLES_SIZE;
+ record_client->read_pos += len;
+ now = MIN(len, RECORD_SAMPLES_SIZE - read_pos);
+ memcpy(samples, &record_client->samples[read_pos], now * 4);
+ if (now < len) {
+ memcpy(samples + now, record_client->samples, (len - now) * 4);
+ }
+ return len;
+}
+
+static void snd_set_rate(SndChannel *channel, uint32_t frequency, uint32_t cap_opus)
+{
+ channel->frequency = frequency;
+ if (channel && snd_codec_is_capable(SPICE_AUDIO_DATA_MODE_OPUS, frequency)) {
+ channel->set_cap(cap_opus);
+ }
+}
+
+SPICE_GNUC_VISIBLE uint32_t spice_server_get_best_playback_rate(SpicePlaybackInstance *sin)
+{
+ return SND_CODEC_OPUS_PLAYBACK_FREQ;
+}
+
+SPICE_GNUC_VISIBLE void spice_server_set_playback_rate(SpicePlaybackInstance *sin, uint32_t frequency)
+{
+ snd_set_rate(sin->st, frequency, SPICE_PLAYBACK_CAP_OPUS);
+}
+
+SPICE_GNUC_VISIBLE uint32_t spice_server_get_best_record_rate(SpiceRecordInstance *sin)
+{
+ return SND_CODEC_OPUS_PLAYBACK_FREQ;
+}
+
+SPICE_GNUC_VISIBLE void spice_server_set_record_rate(SpiceRecordInstance *sin, uint32_t frequency)
+{
+ snd_set_rate(sin->st, frequency, SPICE_RECORD_CAP_OPUS);
+}
+
+RecordChannelClient::~RecordChannelClient()
+{
+ snd_codec_destroy(&codec);
+}
+
+bool RecordChannelClient::init()
+{
+ SndChannel *channel = get_channel();
+
+ if (!SndChannelClient::init()) {
+ return FALSE;
+ }
+
+ if (channel->volume.volume_nchannels) {
+ snd_set_command(this, SND_VOLUME_MUTE_MASK);
+ }
+
+ if (channel->active) {
+ record_channel_client_start(this);
+ }
+ snd_send(this);
+
+ return TRUE;
+}
+
+void RecordChannel::on_connect(RedClient *client, RedStream *stream,
+ int migration, RedChannelCapabilities *caps)
+{
+ set_peer_common();
+
+ auto peer =
+ red::make_shared<RecordChannelClient>(this, client, stream, caps);
+ peer->init();
+}
+
+static void add_channel(SndChannel *channel)
+{
+ snd_channels = g_list_prepend(snd_channels, channel);
+}
+
+static void remove_channel(SndChannel *channel)
+{
+ snd_channels = g_list_remove(snd_channels, channel);
+}
+
+SndChannel::~SndChannel()
+{
+ remove_channel(this);
+
+ g_free(volume.volume);
+ volume.volume = nullptr;
+}
+
+PlaybackChannel::PlaybackChannel(RedsState *reds):
+ SndChannel(reds, SPICE_CHANNEL_PLAYBACK, 0)
+{
+ set_cap(SPICE_PLAYBACK_CAP_VOLUME);
+
+ add_channel(this);
+ reds_register_channel(reds, this);
+}
+
+void snd_attach_playback(RedsState *reds, SpicePlaybackInstance *sin)
+{
+ sin->st = new PlaybackChannel(reds); // XXX make_shared
+}
+
+RecordChannel::RecordChannel(RedsState *reds):
+ SndChannel(reds, SPICE_CHANNEL_RECORD, 0)
+{
+ set_cap(SPICE_RECORD_CAP_VOLUME);
+
+ add_channel(this);
+ reds_register_channel(reds, this);
+}
+
+void snd_attach_record(RedsState *reds, SpiceRecordInstance *sin)
+{
+ sin->st = new RecordChannel(reds); // XXX make_shared
+}
+
+static void snd_detach_common(SndChannel *channel)
+{
+ if (!channel) {
+ return;
+ }
+
+ channel->destroy();
+}
+
+void snd_detach_playback(SpicePlaybackInstance *sin)
+{
+ snd_detach_common(sin->st);
+}
+
+void snd_detach_record(SpiceRecordInstance *sin)
+{
+ snd_detach_common(sin->st);
+}
+
+void snd_set_playback_compression(bool on)
+{
+ GList *l;
+
+ for (l = snd_channels; l != nullptr; l = l->next) {
+ auto now = static_cast<SndChannel *>(l->data);
+ SndChannelClient *client = snd_channel_get_client(now);
+ if (now->type() == SPICE_CHANNEL_PLAYBACK && client) {
+ PlaybackChannelClient* playback = PLAYBACK_CHANNEL_CLIENT(client);
+ RedChannelClient *rcc = playback;
+ bool client_can_opus = rcc->test_remote_cap(SPICE_PLAYBACK_CAP_OPUS);
+ auto desired_mode = snd_desired_audio_mode(on, now->frequency, client_can_opus);
+ if (playback->mode != desired_mode) {
+ playback->mode = desired_mode;
+ snd_set_command(client, SND_PLAYBACK_MODE_MASK);
+ spice_debug("playback client %p using mode %s", playback,
+ spice_audio_data_mode_to_string(playback->mode));
+ }
+ }
+ }
+}
+
+static void snd_playback_alloc_frames(PlaybackChannelClient *playback)
+{
+ playback->frames = g_new0(AudioFrameContainer, 1);
+ playback->frames->refs = 1;
+ for (auto& item : playback->frames->items) {
+ item.container = playback->frames;
+ snd_playback_free_frame(playback, &item);
+ }
+}
diff --git a/server/snd_worker.h b/server/sound.h
index 8de746de..19df2c2c 100644
--- a/server/snd_worker.h
+++ b/server/sound.h
@@ -15,20 +15,25 @@
License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef _H_SND_WORKER
-#define _H_SND_WORKER
+#ifndef SOUND_H_
+#define SOUND_H_
-#include "spice.h"
+#include "red-common.h"
-void snd_attach_playback(SpicePlaybackInstance *sin);
+#include "push-visibility.h"
+
+struct RedClient;
+
+void snd_attach_playback(RedsState *reds, SpicePlaybackInstance *sin);
void snd_detach_playback(SpicePlaybackInstance *sin);
-void snd_attach_record(SpiceRecordInstance *sin);
+void snd_attach_record(RedsState *reds, SpiceRecordInstance *sin);
void snd_detach_record(SpiceRecordInstance *sin);
-void snd_set_playback_compression(int on);
-int snd_get_playback_compression(void);
+void snd_set_playback_compression(bool on);
+
+void snd_set_playback_latency(struct RedClient *client, uint32_t latency);
-void snd_set_playback_latency(RedClient *client, uint32_t latency);
+#include "pop-visibility.h"
-#endif
+#endif /* SOUND_H_ */
diff --git a/server/spice-audio.h b/server/spice-audio.h
new file mode 100644
index 00000000..f542c88a
--- /dev/null
+++ b/server/spice-audio.h
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2009-2014 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef SPICE_AUDIO_H_
+#define SPICE_AUDIO_H_
+
+#if !defined(SPICE_H_INSIDE) && !defined(SPICE_SERVER_INTERNAL)
+#error "Only spice.h can be included directly."
+#endif
+
+#include "spice-core.h"
+
+SPICE_BEGIN_DECLS
+
+/* sound interfaces */
+
+#define SPICE_INTERFACE_PLAYBACK "playback"
+#define SPICE_INTERFACE_PLAYBACK_MAJOR 1
+#define SPICE_INTERFACE_PLAYBACK_MINOR 3
+typedef struct SpicePlaybackInterface SpicePlaybackInterface;
+typedef struct SpicePlaybackInstance SpicePlaybackInstance;
+typedef struct SpicePlaybackState SpicePlaybackState;
+
+enum {
+ SPICE_INTERFACE_AUDIO_FMT_S16 = 1,
+};
+
+#define SPICE_INTERFACE_PLAYBACK_FREQ 44100
+#define SPICE_INTERFACE_PLAYBACK_CHAN 2
+#define SPICE_INTERFACE_PLAYBACK_FMT SPICE_INTERFACE_AUDIO_FMT_S16
+
+struct SpicePlaybackInterface {
+ SpiceBaseInterface base;
+};
+
+struct SpicePlaybackInstance {
+ SpiceBaseInstance base;
+ SpicePlaybackState *st;
+};
+
+void spice_server_playback_start(SpicePlaybackInstance *sin);
+void spice_server_playback_stop(SpicePlaybackInstance *sin);
+void spice_server_playback_get_buffer(SpicePlaybackInstance *sin,
+ uint32_t **samples, uint32_t *num_samples);
+void spice_server_playback_put_samples(SpicePlaybackInstance *sin,
+ uint32_t *samples);
+void spice_server_playback_set_volume(SpicePlaybackInstance *sin,
+ uint8_t nchannels, uint16_t *volume);
+void spice_server_playback_set_mute(SpicePlaybackInstance *sin, uint8_t mute);
+
+#define SPICE_INTERFACE_RECORD "record"
+#define SPICE_INTERFACE_RECORD_MAJOR 2
+#define SPICE_INTERFACE_RECORD_MINOR 3
+typedef struct SpiceRecordInterface SpiceRecordInterface;
+typedef struct SpiceRecordInstance SpiceRecordInstance;
+typedef struct SpiceRecordState SpiceRecordState;
+
+#define SPICE_INTERFACE_RECORD_FREQ 44100
+#define SPICE_INTERFACE_RECORD_CHAN 2
+#define SPICE_INTERFACE_RECORD_FMT SPICE_INTERFACE_AUDIO_FMT_S16
+
+struct SpiceRecordInterface {
+ SpiceBaseInterface base;
+};
+
+struct SpiceRecordInstance {
+ SpiceBaseInstance base;
+ SpiceRecordState *st;
+};
+
+void spice_server_record_start(SpiceRecordInstance *sin);
+void spice_server_record_stop(SpiceRecordInstance *sin);
+uint32_t spice_server_record_get_samples(SpiceRecordInstance *sin,
+ uint32_t *samples, uint32_t bufsize);
+void spice_server_record_set_volume(SpiceRecordInstance *sin,
+ uint8_t nchannels, uint16_t *volume);
+void spice_server_record_set_mute(SpiceRecordInstance *sin, uint8_t mute);
+
+uint32_t spice_server_get_best_playback_rate(SpicePlaybackInstance *sin);
+void spice_server_set_playback_rate(SpicePlaybackInstance *sin, uint32_t frequency);
+uint32_t spice_server_get_best_record_rate(SpiceRecordInstance *sin);
+void spice_server_set_record_rate(SpiceRecordInstance *sin, uint32_t frequency);
+
+SPICE_END_DECLS
+
+#endif /* SPICE_AUDIO_H_ */
diff --git a/server/spice-bitmap-utils.c b/server/spice-bitmap-utils.c
new file mode 100644
index 00000000..50903e38
--- /dev/null
+++ b/server/spice-bitmap-utils.c
@@ -0,0 +1,310 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+
+#include <sys/stat.h>
+
+#include "spice-bitmap-utils.h"
+
+#define RED_BITMAP_UTILS_RGB16
+#include "spice-bitmap-utils.tmpl.c"
+#define RED_BITMAP_UTILS_RGB24
+#include "spice-bitmap-utils.tmpl.c"
+#define RED_BITMAP_UTILS_RGB32
+#include "spice-bitmap-utils.tmpl.c"
+
+#define GRADUAL_HIGH_RGB24_TH -0.03
+#define GRADUAL_HIGH_RGB16_TH 0
+
+// setting a more permissive threshold for stream identification in order
+// not to miss streams that were artificially scaled on the guest (e.g., full screen view
+// in window media player 12). see red_stream_add_frame
+#define GRADUAL_MEDIUM_SCORE_TH 0.002
+
+// assumes that stride doesn't overflow
+BitmapGradualType bitmap_get_graduality_level(SpiceBitmap *bitmap)
+{
+ double score = 0.0;
+ int num_samples = 0;
+ int num_lines;
+ double chunk_score = 0.0;
+ int chunk_num_samples = 0;
+ uint32_t x, i;
+ SpiceChunk *chunk;
+
+ chunk = bitmap->data->chunk;
+ for (i = 0; i < bitmap->data->num_chunks; i++) {
+ num_lines = chunk[i].len / bitmap->stride;
+ x = bitmap->x;
+ switch (bitmap->format) {
+ case SPICE_BITMAP_FMT_16BIT:
+ compute_lines_gradual_score_rgb16((rgb16_pixel_t *)chunk[i].data, x, num_lines,
+ &chunk_score, &chunk_num_samples);
+ break;
+ case SPICE_BITMAP_FMT_24BIT:
+ compute_lines_gradual_score_rgb24((rgb24_pixel_t *)chunk[i].data, x, num_lines,
+ &chunk_score, &chunk_num_samples);
+ break;
+ case SPICE_BITMAP_FMT_32BIT:
+ case SPICE_BITMAP_FMT_RGBA:
+ compute_lines_gradual_score_rgb32((rgb32_pixel_t *)chunk[i].data, x, num_lines,
+ &chunk_score, &chunk_num_samples);
+ break;
+ default:
+ spice_error("invalid bitmap format (not RGB) %u", bitmap->format);
+ }
+ score += chunk_score;
+ num_samples += chunk_num_samples;
+ }
+
+ spice_assert(num_samples);
+ score /= num_samples;
+
+ if (bitmap->format == SPICE_BITMAP_FMT_16BIT) {
+ if (score < GRADUAL_HIGH_RGB16_TH) {
+ return BITMAP_GRADUAL_HIGH;
+ }
+ } else {
+ if (score < GRADUAL_HIGH_RGB24_TH) {
+ return BITMAP_GRADUAL_HIGH;
+ }
+ }
+
+ if (score < GRADUAL_MEDIUM_SCORE_TH) {
+ return BITMAP_GRADUAL_MEDIUM;
+ }
+
+ return BITMAP_GRADUAL_LOW;
+}
+
+int bitmap_has_extra_stride(SpiceBitmap *bitmap)
+{
+ spice_assert(bitmap);
+ if (bitmap_fmt_is_rgb(bitmap->format)) {
+ return ((bitmap->x * bitmap_fmt_get_bytes_per_pixel(bitmap->format)) < bitmap->stride);
+ }
+
+ switch (bitmap->format) {
+ case SPICE_BITMAP_FMT_8BIT:
+ return (bitmap->x < bitmap->stride);
+ case SPICE_BITMAP_FMT_4BIT_BE:
+ case SPICE_BITMAP_FMT_4BIT_LE: {
+ int bytes_width = SPICE_ALIGN(bitmap->x, 2) >> 1;
+ return bytes_width < bitmap->stride;
+ }
+ case SPICE_BITMAP_FMT_1BIT_BE:
+ case SPICE_BITMAP_FMT_1BIT_LE: {
+ int bytes_width = SPICE_ALIGN(bitmap->x, 8) >> 3;
+ return bytes_width < bitmap->stride;
+ }
+ default:
+ spice_error("invalid image type %u", bitmap->format);
+ return 0;
+ }
+
+ return 0;
+}
+
+int spice_bitmap_from_surface_type(uint32_t surface_format)
+{
+ switch (surface_format) {
+ case SPICE_SURFACE_FMT_16_555:
+ return SPICE_BITMAP_FMT_16BIT;
+ case SPICE_SURFACE_FMT_32_xRGB:
+ return SPICE_BITMAP_FMT_32BIT;
+ case SPICE_SURFACE_FMT_32_ARGB:
+ return SPICE_BITMAP_FMT_RGBA;
+ case SPICE_SURFACE_FMT_8_A:
+ return SPICE_BITMAP_FMT_8BIT_A;
+ default:
+ spice_critical("Unsupported surface format");
+ }
+ return SPICE_BITMAP_FMT_INVALID;
+}
+
+#ifdef DUMP_BITMAP
+#define RAM_PATH "/tmp/tmpfs"
+
+static void put_16le(uint8_t **ptr, uint16_t val)
+{
+ **ptr = val & 0xffu;
+ (*ptr)++;
+ val >>= 8;
+ **ptr = val & 0xffu;
+ (*ptr)++;
+}
+
+static void put_32le(uint8_t **ptr, uint32_t val)
+{
+ put_16le(ptr, val & 0xffffu);
+ val >>= 16;
+ put_16le(ptr, val & 0xffffu);
+}
+
+#define WRITE(buf, size, f) do { \
+ if (fwrite(buf, 1, (size), f) != (size)) \
+ goto write_err; \
+} while(0)
+
+static bool dump_palette(FILE *f, SpicePalette* plt)
+{
+ int i;
+ for (i = 0; i < plt->num_ents; i++) {
+ WRITE(plt->ents + i, sizeof(uint32_t), f);
+ }
+ return true;
+
+write_err:
+ return false;
+}
+
+static bool dump_line(FILE *f, uint8_t* line, uint16_t n_pixel_bits, int width, int row_size)
+{
+ static const char zeroes[4] = { 0 };
+ int copy_bytes_size = SPICE_ALIGN(n_pixel_bits * width, 8) / 8;
+
+ WRITE(line, copy_bytes_size, f);
+ // each line should be 4 bytes aligned
+ g_return_val_if_fail(row_size - copy_bytes_size >= 0 && row_size - copy_bytes_size <= 4, false);
+ WRITE(zeroes, row_size - copy_bytes_size, f);
+ return true;
+
+write_err:
+ return false;
+}
+
+void dump_bitmap(SpiceBitmap *bitmap)
+{
+ static uint32_t file_id = 0;
+
+ char file_str[200];
+ int rgb = TRUE;
+ uint16_t n_pixel_bits;
+ SpicePalette *plt = NULL;
+ uint32_t id;
+ int row_size;
+ uint32_t file_size;
+ int alpha = 0;
+ uint32_t header_size = 14 + 40;
+ uint32_t bitmap_data_offset;
+ FILE *f;
+ int i, j;
+ uint8_t header[128], *ptr;
+
+ switch (bitmap->format) {
+ case SPICE_BITMAP_FMT_1BIT_BE:
+ case SPICE_BITMAP_FMT_1BIT_LE:
+ rgb = FALSE;
+ n_pixel_bits = 1;
+ break;
+ case SPICE_BITMAP_FMT_4BIT_BE:
+ case SPICE_BITMAP_FMT_4BIT_LE:
+ rgb = FALSE;
+ n_pixel_bits = 4;
+ break;
+ case SPICE_BITMAP_FMT_8BIT:
+ rgb = FALSE;
+ n_pixel_bits = 8;
+ break;
+ case SPICE_BITMAP_FMT_16BIT:
+ n_pixel_bits = 16;
+ break;
+ case SPICE_BITMAP_FMT_24BIT:
+ n_pixel_bits = 24;
+ break;
+ case SPICE_BITMAP_FMT_32BIT:
+ n_pixel_bits = 32;
+ break;
+ case SPICE_BITMAP_FMT_RGBA:
+ n_pixel_bits = 32;
+ alpha = 1;
+ break;
+ default:
+ spice_error("invalid bitmap format %u", bitmap->format);
+ return;
+ }
+
+ if (!rgb) {
+ if (!bitmap->palette) {
+ return; // dont dump masks.
+ }
+ plt = bitmap->palette;
+ }
+ row_size = (((bitmap->x * n_pixel_bits) + 31) / 32) * 4;
+ bitmap_data_offset = header_size;
+
+ if (plt) {
+ bitmap_data_offset += plt->num_ents * 4;
+ }
+ file_size = bitmap_data_offset + (bitmap->y * row_size);
+
+ id = ++file_id;
+ mkdir(RAM_PATH, 0755);
+ sprintf(file_str, "%s/%u.bmp", RAM_PATH, id);
+
+ f = fopen(file_str, "wb");
+ if (!f) {
+ spice_error("Error creating bmp");
+ return;
+ }
+
+ /* writing the bmp v3 header */
+ ptr = header;
+ put_16le(&ptr, 0x4D42); // "BM"
+ put_32le(&ptr, file_size);
+ put_16le(&ptr, alpha);
+ put_16le(&ptr, 0);
+ put_32le(&ptr, bitmap_data_offset);
+ put_32le(&ptr, header_size - 14);
+ put_32le(&ptr, bitmap->x);
+ put_32le(&ptr, bitmap->flags & SPICE_BITMAP_FLAGS_TOP_DOWN ? -bitmap->y : bitmap->y);
+
+ put_16le(&ptr, 1); // plane
+ put_16le(&ptr, n_pixel_bits);
+
+ put_32le(&ptr, 0); // compression
+
+ put_32le(&ptr, 0); //file_size - bitmap_data_offset;
+ put_32le(&ptr, 0);
+ put_32le(&ptr, 0);
+ put_32le(&ptr, !plt ? 0 : plt->num_ents); // plt entries
+ put_32le(&ptr, 0);
+
+ WRITE(header, ptr - header, f);
+
+ if (plt) {
+ if (!dump_palette(f, plt))
+ goto write_err;
+ }
+ /* writing the data */
+ for (i = 0; i < bitmap->data->num_chunks; i++) {
+ SpiceChunk *chunk = &bitmap->data->chunk[i];
+ int num_lines = chunk->len / bitmap->stride;
+ for (j = 0; j < num_lines; j++) {
+ if (!dump_line(f, chunk->data + (j * bitmap->stride), n_pixel_bits, bitmap->x, row_size))
+ goto write_err;
+ }
+ }
+ fclose(f);
+ return;
+
+write_err:
+ fclose(f);
+ remove(file_str);
+}
+#endif
diff --git a/server/spice-bitmap-utils.h b/server/spice-bitmap-utils.h
new file mode 100644
index 00000000..6b0377e4
--- /dev/null
+++ b/server/spice-bitmap-utils.h
@@ -0,0 +1,97 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef SPICE_BITMAP_UTILS_H_
+#define SPICE_BITMAP_UTILS_H_
+
+#include "red-common.h"
+
+SPICE_BEGIN_DECLS
+
+typedef enum {
+ BITMAP_GRADUAL_INVALID,
+ BITMAP_GRADUAL_NOT_AVAIL,
+ BITMAP_GRADUAL_LOW,
+ BITMAP_GRADUAL_MEDIUM,
+ BITMAP_GRADUAL_HIGH,
+} BitmapGradualType;
+
+typedef struct {
+ uint8_t b;
+ uint8_t g;
+ uint8_t r;
+ uint8_t pad;
+} rgb32_pixel_t;
+
+verify(sizeof(rgb32_pixel_t) == 4);
+
+typedef struct {
+ uint8_t b;
+ uint8_t g;
+ uint8_t r;
+} rgb24_pixel_t;
+
+verify(sizeof(rgb24_pixel_t) == 3);
+
+typedef uint16_t rgb16_pixel_t;
+
+
+static inline int bitmap_fmt_get_bytes_per_pixel(uint8_t fmt)
+{
+ static const int bytes_per_pixel[] = {0, 0, 0, 0, 0, 1, 2, 3, 4, 4, 1};
+
+ spice_return_val_if_fail(fmt < SPICE_N_ELEMENTS(bytes_per_pixel), 0);
+
+ return bytes_per_pixel[fmt];
+}
+
+
+static inline int bitmap_fmt_is_plt(uint8_t fmt)
+{
+ static const int fmt_is_plt[] = {0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0};
+
+ spice_return_val_if_fail(fmt < SPICE_N_ELEMENTS(fmt_is_plt), 0);
+
+ return fmt_is_plt[fmt];
+}
+
+static inline int bitmap_fmt_is_rgb(uint8_t fmt)
+{
+ static const int fmt_is_rgb[] = {0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1};
+
+ spice_return_val_if_fail(fmt < SPICE_N_ELEMENTS(fmt_is_rgb), 0);
+
+ return fmt_is_rgb[fmt];
+}
+
+static inline int bitmap_fmt_has_graduality(uint8_t fmt)
+{
+ return bitmap_fmt_is_rgb(fmt) && fmt != SPICE_BITMAP_FMT_8BIT_A;
+}
+
+
+BitmapGradualType bitmap_get_graduality_level (SpiceBitmap *bitmap);
+int bitmap_has_extra_stride (SpiceBitmap *bitmap);
+
+void dump_bitmap(SpiceBitmap *bitmap);
+
+int spice_bitmap_from_surface_type(uint32_t surface_format);
+
+SPICE_END_DECLS
+
+#endif /* SPICE_BITMAP_UTILS_H_ */
diff --git a/server/red_bitmap_utils.h b/server/spice-bitmap-utils.tmpl.c
index 6d508a7c..a104cb27 100644
--- a/server/red_bitmap_utils.h
+++ b/server/spice-bitmap-utils.tmpl.c
@@ -14,6 +14,7 @@
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
+#include <config.h>
#ifdef RED_BITMAP_UTILS_RGB16
#define PIXEL rgb16_pixel_t
@@ -49,11 +50,10 @@
#else
#define CONTRAST_TH 8
#endif
+#define CONTRASTING(n) ((n) <= -CONTRAST_TH || (n) >= CONTRAST_TH)
#define SAMPLE_JUMP 15
-#define SAME_PIXEL(p1, p2) (GET_r(p1) == GET_r(p2) && GET_g(p1) == GET_g(p2) && \
- GET_b(p1) == GET_b(p2))
static const double FNAME(PIX_PAIR_SCORE)[] = {
SAME_PIXEL_WEIGHT,
@@ -64,29 +64,27 @@ static const double FNAME(PIX_PAIR_SCORE)[] = {
// return 0 - equal, 1 - for contrast, 2 for no contrast (PIX_PAIR_SCORE is defined accordingly)
static inline int FNAME(pixelcmp)(PIXEL p1, PIXEL p2)
{
- int diff = ABS(GET_r(p1) - GET_r(p2));
- int equal;
+ int diff, any_different;
- if (diff >= CONTRAST_TH) {
+ diff = GET_r(p1) - GET_r(p2);
+ any_different = diff;
+ if (CONTRASTING(diff)) {
return 1;
}
- equal = !diff;
- diff = ABS(GET_g(p1) - GET_g(p2));
-
- if (diff >= CONTRAST_TH) {
+ diff = GET_g(p1) - GET_g(p2);
+ any_different |= diff;
+ if (CONTRASTING(diff)) {
return 1;
}
- equal = equal && !diff;
-
- diff = ABS(GET_b(p1) - GET_b(p2));
- if (diff >= CONTRAST_TH) {
+ diff = GET_b(p1) - GET_b(p2);
+ any_different |= diff;
+ if (CONTRASTING(diff)) {
return 1;
}
- equal = equal && !diff;
- if (equal) {
+ if (!any_different) {
return 0;
} else {
return 2;
@@ -95,22 +93,22 @@ static inline int FNAME(pixelcmp)(PIXEL p1, PIXEL p2)
static inline double FNAME(pixels_square_score)(PIXEL *line1, PIXEL *line2)
{
- double ret = 0.0;
- int all_ident = TRUE;
+ double ret;
+ int any_different = 0;
int cmp_res;
cmp_res = FNAME(pixelcmp)(*line1, line1[1]);
- all_ident = all_ident && (!cmp_res);
- ret += FNAME(PIX_PAIR_SCORE)[cmp_res];
+ any_different |= cmp_res;
+ ret = FNAME(PIX_PAIR_SCORE)[cmp_res];
cmp_res = FNAME(pixelcmp)(*line1, *line2);
- all_ident = all_ident && (!cmp_res);
+ any_different |= cmp_res;
ret += FNAME(PIX_PAIR_SCORE)[cmp_res];
cmp_res = FNAME(pixelcmp)(*line1, line2[1]);
- all_ident = all_ident && (!cmp_res);
+ any_different |= cmp_res;
ret += FNAME(PIX_PAIR_SCORE)[cmp_res];
// ignore squares where all pixels are identical
- if (all_ident) {
- ret -= (FNAME(PIX_PAIR_SCORE)[0]) * 3;
+ if (!any_different) {
+ ret = 0;
}
return ret;
@@ -123,6 +121,8 @@ static void FNAME(compute_lines_gradual_score)(PIXEL *lines, int width, int num_
PIXEL *cur_pix = lines + width / 2;
PIXEL *bottom_pix;
PIXEL *last_line = lines + (num_lines - 1) * width;
+ int num_samples = 0;
+ double samples_sum_score = 0;
if ((width <= 1) || (num_lines <= 1)) {
*o_num_samples = 1;
@@ -130,25 +130,22 @@ static void FNAME(compute_lines_gradual_score)(PIXEL *lines, int width, int num_
return;
}
- *o_samples_sum_score = 0;
- *o_num_samples = 0;
-
while (cur_pix < last_line) {
if ((cur_pix + 1 - lines) % width == 0) { // last pixel in the row
cur_pix--; // jump is bigger than 1 so we will not enter endless loop
}
bottom_pix = cur_pix + width;
- (*o_samples_sum_score) += FNAME(pixels_square_score)(cur_pix, bottom_pix);
- (*o_num_samples)++;
+ samples_sum_score += FNAME(pixels_square_score)(cur_pix, bottom_pix);
+ num_samples++;
cur_pix += jump;
}
- (*o_num_samples) *= 3;
+ (*o_samples_sum_score) = samples_sum_score;
+ (*o_num_samples) = num_samples * 3;
}
#undef PIXEL
#undef FNAME
-#undef SAME_PIXEL
#undef GET_r
#undef GET_g
#undef GET_b
diff --git a/server/spice-char.h b/server/spice-char.h
new file mode 100644
index 00000000..51dab055
--- /dev/null
+++ b/server/spice-char.h
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2009-2014 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef SPICE_CHAR_H_
+#define SPICE_CHAR_H_
+
+#if !defined(SPICE_H_INSIDE) && !defined(SPICE_SERVER_INTERNAL)
+#error "Only spice.h can be included directly."
+#endif
+
+#include "spice-core.h"
+
+SPICE_BEGIN_DECLS
+
+/* char device interfaces */
+
+#define SPICE_INTERFACE_CHAR_DEVICE "char_device"
+#define SPICE_INTERFACE_CHAR_DEVICE_MAJOR 1
+#define SPICE_INTERFACE_CHAR_DEVICE_MINOR 3
+typedef struct SpiceCharDeviceInterface SpiceCharDeviceInterface;
+typedef struct SpiceCharDeviceInstance SpiceCharDeviceInstance;
+typedef struct SpiceCharDeviceState SpiceCharDeviceState;
+
+typedef enum {
+ SPICE_CHAR_DEVICE_NOTIFY_WRITABLE = 1 << 0,
+} spice_char_device_flags;
+
+struct SpiceCharDeviceInterface {
+ SpiceBaseInterface base;
+
+ /* Set the state of the device.
+ * connected should be 0 or 1.
+ * Setting state to 0 causes the device to be disabled.
+ * This can be used by SPICE server to tell guest that device is not
+ * working anymore (for instance because the guest itself sent some
+ * wrong request).
+ */
+ void (*state)(SpiceCharDeviceInstance *sin, int connected);
+
+ /* Write some bytes to the character device.
+ * Returns bytes copied from buf or a value < 0 on errors.
+ * If able to write some bytes the function should return the amount of
+ * bytes successfully written.
+ * Function can return a value < len, even 0.
+ * errno is not determined after calling this function.
+ * Function should be implemented as no-blocking.
+ * A len < 0 causes indeterminate results.
+ */
+ int (*write)(SpiceCharDeviceInstance *sin, const uint8_t *buf, int len);
+
+ /* Read some bytes from the character device.
+ * Returns bytes copied into buf or a value < 0 on errors.
+ * Function can return 0 if no data is available or len is 0.
+ * errno is not determined after calling this function.
+ * Function should be implemented as no-blocking.
+ * A len < 0 causes indeterminate results.
+ */
+ int (*read)(SpiceCharDeviceInstance *sin, uint8_t *buf, int len);
+
+ void (*event)(SpiceCharDeviceInstance *sin, uint8_t event);
+ spice_char_device_flags flags;
+};
+
+struct SpiceCharDeviceInstance {
+ SpiceBaseInstance base;
+ const char* subtype;
+ SpiceCharDeviceState *st;
+ const char* portname;
+};
+
+void spice_server_char_device_wakeup(SpiceCharDeviceInstance *sin);
+void spice_server_port_event(SpiceCharDeviceInstance *sin, uint8_t event);
+/* TODO change return to const char *const * when API break */
+const char** spice_server_char_device_recognized_subtypes(void);
+
+SPICE_END_DECLS
+
+#endif /* SPICE_CHAR_H_ */
diff --git a/server/spice-core.h b/server/spice-core.h
new file mode 100644
index 00000000..d77c4f9e
--- /dev/null
+++ b/server/spice-core.h
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2009-2014 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef SPICE_CORE_H_
+#define SPICE_CORE_H_
+
+#if !defined(SPICE_H_INSIDE) && !defined(SPICE_SERVER_INTERNAL)
+#error "Only spice.h can be included directly."
+#endif
+
+#include <stdint.h>
+#ifndef _WIN32
+#include <sys/socket.h>
+#else
+#include <winsock2.h>
+#include <windows.h>
+typedef int socklen_t;
+#endif
+#include <spice/qxl_dev.h>
+#include <spice/vd_agent.h>
+#include <spice/macros.h>
+
+#ifdef SPICE_SERVER_INTERNAL
+#undef SPICE_GNUC_DEPRECATED
+#define SPICE_GNUC_DEPRECATED
+#endif
+
+/* interface base type */
+
+typedef struct SpiceBaseInterface SpiceBaseInterface;
+typedef struct SpiceBaseInstance SpiceBaseInstance;
+
+struct SpiceBaseInterface {
+ const char *type;
+ const char *description;
+ uint32_t major_version;
+ uint32_t minor_version;
+};
+struct SpiceBaseInstance {
+ const SpiceBaseInterface *sif;
+};
+
+/* core interface */
+
+#define SPICE_INTERFACE_CORE "core"
+#define SPICE_INTERFACE_CORE_MAJOR 1
+#define SPICE_INTERFACE_CORE_MINOR 3
+typedef struct SpiceCoreInterface SpiceCoreInterface;
+
+#define SPICE_WATCH_EVENT_READ (1 << 0)
+#define SPICE_WATCH_EVENT_WRITE (1 << 1)
+
+#define SPICE_CHANNEL_EVENT_CONNECTED 1
+#define SPICE_CHANNEL_EVENT_INITIALIZED 2
+#define SPICE_CHANNEL_EVENT_DISCONNECTED 3
+
+#define SPICE_CHANNEL_EVENT_FLAG_TLS (1 << 0)
+#define SPICE_CHANNEL_EVENT_FLAG_ADDR_EXT (1 << 1)
+
+typedef struct SpiceWatch SpiceWatch;
+typedef void (*SpiceWatchFunc)(int fd, int event, void *opaque);
+
+typedef struct SpiceTimer SpiceTimer;
+typedef void (*SpiceTimerFunc)(void *opaque);
+
+typedef struct SpiceChannelEventInfo {
+ int connection_id;
+ int type;
+ int id;
+ int flags;
+ /* deprecated, can't hold ipv6 addresses, kept for backward compatibility */
+ struct sockaddr laddr SPICE_GNUC_DEPRECATED;
+ struct sockaddr paddr SPICE_GNUC_DEPRECATED;
+ socklen_t llen SPICE_GNUC_DEPRECATED;
+ socklen_t plen SPICE_GNUC_DEPRECATED;
+ /* should be used if (flags & SPICE_CHANNEL_EVENT_FLAG_ADDR_EXT) */
+ struct sockaddr_storage laddr_ext;
+ struct sockaddr_storage paddr_ext;
+ socklen_t llen_ext, plen_ext;
+} SpiceChannelEventInfo;
+
+struct SpiceCoreInterface {
+ SpiceBaseInterface base;
+
+ SpiceTimer *(*timer_add)(SpiceTimerFunc func, void *opaque);
+ void (*timer_start)(SpiceTimer *timer, uint32_t ms);
+ void (*timer_cancel)(SpiceTimer *timer);
+ void (*timer_remove)(SpiceTimer *timer);
+
+ SpiceWatch *(*watch_add)(int fd, int event_mask, SpiceWatchFunc func, void *opaque);
+ void (*watch_update_mask)(SpiceWatch *watch, int event_mask);
+ void (*watch_remove)(SpiceWatch *watch);
+
+ void (*channel_event)(int event, SpiceChannelEventInfo *info);
+};
+
+#endif /* SPICE_CORE_H_ */
diff --git a/server/spice-experimental.h b/server/spice-experimental.h
deleted file mode 100644
index f16d555f..00000000
--- a/server/spice-experimental.h
+++ /dev/null
@@ -1,40 +0,0 @@
-#ifndef __SPICE_EXPERIMENTAL_H__
-#define __SPICE_EXPERIMENTAL_H__
-
-#include "spice.h"
-
-/* tunnel interface */
-
-#define SPICE_INTERFACE_NET_WIRE "net_wire"
-#define SPICE_INTERFACE_NET_WIRE_MAJOR 1
-#define SPICE_INTERFACE_NET_WIRE_MINOR 1
-typedef struct SpiceNetWireInterface SpiceNetWireInterface;
-typedef struct SpiceNetWireInstance SpiceNetWireInstance;
-typedef struct SpiceNetWireState SpiceNetWireState;
-
-struct SpiceNetWireInterface {
- SpiceBaseInterface base;
-
- struct in_addr (*get_ip)(SpiceNetWireInstance *sin);
- int (*can_send_packet)(SpiceNetWireInstance *sin);
- void (*send_packet)(SpiceNetWireInstance *sin, const uint8_t *pkt, int len);
-};
-
-struct SpiceNetWireInstance {
- SpiceBaseInstance base;
- SpiceNetWireState *st;
-};
-
-void spice_server_net_wire_recv_packet(SpiceNetWireInstance *sin,
- const uint8_t *pkt, int len);
-
-/* spice seamless client migration (broken) */
-enum {
- SPICE_MIGRATE_CLIENT_NONE = 1,
- SPICE_MIGRATE_CLIENT_WAITING,
- SPICE_MIGRATE_CLIENT_READY,
-};
-
-int spice_server_migrate_client_state(SpiceServer *s);
-
-#endif // __SPICE_EXPERIMENTAL_H__
diff --git a/server/spice-input.h b/server/spice-input.h
new file mode 100644
index 00000000..91e64e83
--- /dev/null
+++ b/server/spice-input.h
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2009-2014 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef SPICE_INPUT_H_
+#define SPICE_INPUT_H_
+
+#if !defined(SPICE_H_INSIDE) && !defined(SPICE_SERVER_INTERNAL)
+#error "Only spice.h can be included directly."
+#endif
+
+#include "spice-core.h"
+
+SPICE_BEGIN_DECLS
+
+/* input interfaces */
+
+#define SPICE_INTERFACE_KEYBOARD "keyboard"
+#define SPICE_INTERFACE_KEYBOARD_MAJOR 1
+#define SPICE_INTERFACE_KEYBOARD_MINOR 1
+typedef struct SpiceKbdInterface SpiceKbdInterface;
+typedef struct SpiceKbdInstance SpiceKbdInstance;
+typedef struct SpiceKbdState SpiceKbdState;
+
+struct SpiceKbdInterface {
+ SpiceBaseInterface base;
+
+ void (*push_scan_freg)(SpiceKbdInstance *sin, uint8_t frag);
+ uint8_t (*get_leds)(SpiceKbdInstance *sin);
+};
+
+struct SpiceKbdInstance {
+ SpiceBaseInstance base;
+ SpiceKbdState *st;
+};
+
+int spice_server_kbd_leds(SpiceKbdInstance *sin, int leds);
+
+#define SPICE_INTERFACE_MOUSE "mouse"
+#define SPICE_INTERFACE_MOUSE_MAJOR 1
+#define SPICE_INTERFACE_MOUSE_MINOR 1
+typedef struct SpiceMouseInterface SpiceMouseInterface;
+typedef struct SpiceMouseInstance SpiceMouseInstance;
+typedef struct SpiceMouseState SpiceMouseState;
+
+struct SpiceMouseInterface {
+ SpiceBaseInterface base;
+
+ void (*motion)(SpiceMouseInstance *sin, int dx, int dy, int dz,
+ uint32_t buttons_state);
+ void (*buttons)(SpiceMouseInstance *sin, uint32_t buttons_state);
+};
+
+struct SpiceMouseInstance {
+ SpiceBaseInstance base;
+ SpiceMouseState *st;
+};
+
+#define SPICE_INTERFACE_TABLET "tablet"
+#define SPICE_INTERFACE_TABLET_MAJOR 1
+#define SPICE_INTERFACE_TABLET_MINOR 1
+typedef struct SpiceTabletInterface SpiceTabletInterface;
+typedef struct SpiceTabletInstance SpiceTabletInstance;
+typedef struct SpiceTabletState SpiceTabletState;
+
+struct SpiceTabletInterface {
+ SpiceBaseInterface base;
+
+ void (*set_logical_size)(SpiceTabletInstance* tablet, int width, int height);
+ void (*position)(SpiceTabletInstance* tablet, int x, int y, uint32_t buttons_state);
+ void (*wheel)(SpiceTabletInstance* tablet, int wheel_moution, uint32_t buttons_state);
+ void (*buttons)(SpiceTabletInstance* tablet, uint32_t buttons_state);
+};
+
+struct SpiceTabletInstance {
+ SpiceBaseInstance base;
+ SpiceTabletState *st;
+};
+
+SPICE_END_DECLS
+
+#endif /* SPICE_INPUT_H_ */
diff --git a/server/spice-migration.h b/server/spice-migration.h
new file mode 100644
index 00000000..e8dd496c
--- /dev/null
+++ b/server/spice-migration.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2009-2014 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef SPICE_MIGRATION_H_
+#define SPICE_MIGRATION_H_
+
+#if !defined(SPICE_H_INSIDE) && !defined(SPICE_SERVER_INTERNAL)
+#error "Only spice.h can be included directly."
+#endif
+
+#include "spice-core.h"
+
+SPICE_BEGIN_DECLS
+
+/* migration interface */
+#define SPICE_INTERFACE_MIGRATION "migration"
+#define SPICE_INTERFACE_MIGRATION_MAJOR 1
+#define SPICE_INTERFACE_MIGRATION_MINOR 1
+typedef struct SpiceMigrateInterface SpiceMigrateInterface;
+typedef struct SpiceMigrateInstance SpiceMigrateInstance;
+typedef struct SpiceMigrateState SpiceMigrateState;
+
+struct SpiceMigrateInterface {
+ SpiceBaseInterface base;
+ void (*migrate_connect_complete)(SpiceMigrateInstance *sin);
+ void (*migrate_end_complete)(SpiceMigrateInstance *sin);
+};
+
+struct SpiceMigrateInstance {
+ SpiceBaseInstance base;
+ SpiceMigrateState *st;
+};
+
+/* spice switch-host client migration */
+int spice_server_migrate_info(SpiceServer *s, const char* dest,
+ int port, int secure_port,
+ const char* cert_subject) SPICE_GNUC_DEPRECATED;
+int spice_server_migrate_switch(SpiceServer *s) SPICE_GNUC_DEPRECATED;
+
+/* spice (semi-)seamless client migration */
+int spice_server_migrate_connect(SpiceServer *s, const char* dest,
+ int port, int secure_port,
+ const char* cert_subject);
+int spice_server_migrate_start(SpiceServer *s);
+int spice_server_migrate_end(SpiceServer *s, int completed);
+
+void spice_server_set_seamless_migration(SpiceServer *s, int enable);
+
+SPICE_END_DECLS
+
+#endif /* SPICE_MIGRATION_H_ */
diff --git a/server/spice-qxl.h b/server/spice-qxl.h
new file mode 100644
index 00000000..bf17476b
--- /dev/null
+++ b/server/spice-qxl.h
@@ -0,0 +1,239 @@
+/*
+ * Copyright (C) 2014 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef SPICE_QXL_H_
+#define SPICE_QXL_H_
+
+#if !defined(SPICE_H_INSIDE) && !defined(SPICE_SERVER_INTERNAL)
+#error "Only spice.h can be included directly."
+#endif
+
+#include "spice-core.h"
+
+SPICE_BEGIN_DECLS
+
+#ifndef SPICE_CAPABILITIES_SIZE
+#define SPICE_CAPABILITIES_SIZE (sizeof(((QXLRom*)0)->client_capabilities))
+#endif
+
+/* qxl interface */
+
+#define SPICE_INTERFACE_QXL "qxl"
+#define SPICE_INTERFACE_QXL_MAJOR 3
+#define SPICE_INTERFACE_QXL_MINOR 3
+
+typedef struct QXLInterface QXLInterface;
+typedef struct QXLInstance QXLInstance;
+typedef struct QXLState QXLState;
+typedef struct QXLWorker QXLWorker;
+typedef struct QXLDevMemSlot QXLDevMemSlot;
+typedef struct QXLDevSurfaceCreate QXLDevSurfaceCreate;
+
+void spice_qxl_wakeup(QXLInstance *instance);
+void spice_qxl_oom(QXLInstance *instance);
+/* deprecated since 0.11.2, spice_server_vm_start replaces it */
+void spice_qxl_start(QXLInstance *instance) SPICE_GNUC_DEPRECATED;
+/* deprecated since 0.11.2 spice_server_vm_stop replaces it */
+void spice_qxl_stop(QXLInstance *instance) SPICE_GNUC_DEPRECATED;
+void spice_qxl_update_area(QXLInstance *instance, uint32_t surface_id,
+ struct QXLRect *area, struct QXLRect *dirty_rects,
+ uint32_t num_dirty_rects, uint32_t clear_dirty_region);
+void spice_qxl_add_memslot(QXLInstance *instance, QXLDevMemSlot *slot);
+void spice_qxl_del_memslot(QXLInstance *instance, uint32_t slot_group_id, uint32_t slot_id);
+void spice_qxl_reset_memslots(QXLInstance *instance);
+void spice_qxl_destroy_surfaces(QXLInstance *instance);
+void spice_qxl_destroy_primary_surface(QXLInstance *instance, uint32_t surface_id);
+void spice_qxl_create_primary_surface(QXLInstance *instance, uint32_t surface_id,
+ QXLDevSurfaceCreate *surface);
+void spice_qxl_reset_image_cache(QXLInstance *instance);
+void spice_qxl_reset_cursor(QXLInstance *instance);
+void spice_qxl_destroy_surface_wait(QXLInstance *instance, uint32_t surface_id);
+void spice_qxl_loadvm_commands(QXLInstance *instance, struct QXLCommandExt *ext, uint32_t count);
+/* async versions of commands. when complete spice calls async_complete */
+void spice_qxl_update_area_async(QXLInstance *instance, uint32_t surface_id, QXLRect *qxl_area,
+ uint32_t clear_dirty_region, uint64_t cookie);
+void spice_qxl_add_memslot_async(QXLInstance *instance, QXLDevMemSlot *slot, uint64_t cookie);
+void spice_qxl_destroy_surfaces_async(QXLInstance *instance, uint64_t cookie);
+void spice_qxl_destroy_primary_surface_async(QXLInstance *instance, uint32_t surface_id, uint64_t cookie);
+void spice_qxl_create_primary_surface_async(QXLInstance *instance, uint32_t surface_id,
+ QXLDevSurfaceCreate *surface, uint64_t cookie);
+void spice_qxl_destroy_surface_async(QXLInstance *instance, uint32_t surface_id, uint64_t cookie);
+/* suspend and resolution change on windows drivers */
+void spice_qxl_flush_surfaces_async(QXLInstance *instance, uint64_t cookie);
+/* since spice 0.12.0 */
+void spice_qxl_monitors_config_async(QXLInstance *instance, QXLPHYSICAL monitors_config,
+ int group_id, uint64_t cookie);
+/* since spice 0.12.3 */
+void spice_qxl_driver_unload(QXLInstance *instance);
+/* since spice 0.12.6, deprecated since 0.14.2, spice_qxl_set_device_info replaces it */
+void spice_qxl_set_max_monitors(QXLInstance *instance,
+ unsigned int max_monitors) SPICE_GNUC_DEPRECATED;
+/* since spice 0.13.1 */
+void spice_qxl_gl_scanout(QXLInstance *qxl,
+ int fd,
+ uint32_t width, uint32_t height,
+ uint32_t stride, uint32_t format,
+ int y_0_top);
+void spice_qxl_gl_draw_async(QXLInstance *qxl,
+ uint32_t x, uint32_t y,
+ uint32_t w, uint32_t h,
+ uint64_t cookie);
+
+/* since spice 0.14.2 */
+
+/**
+ * spice_qxl_set_device_info:
+ * @instance the QXL instance to set the path to
+ * @device_address the path of the device this QXL instance belongs to
+ * @device_display_id_start the starting device display ID of this interface,
+ * i.e. the device display ID of monitor ID 0
+ * @device_display_id_count the total number of device display IDs on this
+ * interface
+ *
+ * Sets the device information for this QXL interface, i.e. the hardware
+ * address (e.g. PCI) of the graphics device and the IDs of the displays of the
+ * graphics device that are exposed by this interface (device display IDs).
+ *
+ * The supported device address format is:
+ * "pci/<DOMAIN>/<SLOT>.<FUNCTION>/.../<SLOT>.<FUNCTION>"
+ *
+ * The "pci" identifies the rest of the string as a PCI address. It is the only
+ * supported address at the moment, other identifiers can be introduced later.
+ * <DOMAIN> is the PCI domain, followed by <SLOT>.<FUNCTION> of any PCI bridges
+ * in the chain leading to the device. The last <SLOT>.<FUNCTION> is the
+ * graphics device. All of <DOMAIN>, <SLOT>, <FUNCTION> are hexadecimal numbers
+ * with the following number of digits:
+ * <DOMAIN>: 4
+ * <SLOT>: 2
+ * <FUNCTION>: 1
+ *
+ * The device_display_id_{start,count} denotes the sequence of device display
+ * IDs that map to the zero-based sequence of monitor IDs provided by monitors
+ * config on this interface.
+ *
+ * Example 1:
+ * A QXL graphics device with 3 heads (monitors).
+ *
+ * device_display_id_start = 0
+ * device_display_id_count = 3
+ *
+ * Results in the following mapping of monitor_id -> device_display_id:
+ * 0 -> 0
+ * 1 -> 1
+ * 2 -> 2
+ *
+ * Example 2:
+ * A virtio graphics device, multiple monitors, a QXL interface for each
+ * monitor. On the QXL interface for the third monitor:
+ *
+ * device_display_id_start = 2
+ * device_display_id_count = 1
+ *
+ * Results in the following mapping of monitor_id -> device_display_id:
+ * 0 -> 2
+ */
+void spice_qxl_set_device_info(QXLInstance *instance,
+ const char *device_address,
+ uint32_t device_display_id_start,
+ uint32_t device_display_id_count);
+
+typedef struct QXLDevInitInfo {
+ uint32_t num_memslots_groups;
+ uint32_t num_memslots;
+ uint8_t memslot_gen_bits;
+ uint8_t memslot_id_bits;
+ uint32_t qxl_ram_size;
+ uint8_t internal_groupslot_id;
+ uint32_t n_surfaces;
+} QXLDevInitInfo;
+
+struct QXLDevMemSlot {
+ uint32_t slot_group_id;
+ uint32_t slot_id;
+ uint32_t generation;
+ uintptr_t virt_start;
+ uintptr_t virt_end;
+ uint64_t addr_delta;
+ uint32_t qxl_ram_size;
+};
+
+struct QXLDevSurfaceCreate {
+ uint32_t width;
+ uint32_t height;
+ int32_t stride;
+ uint32_t format;
+ uint32_t position;
+ uint32_t mouse_mode;
+ uint32_t flags;
+ uint32_t type;
+ uint64_t mem;
+ uint32_t group_id;
+};
+
+struct QXLInterface {
+ SpiceBaseInterface base;
+
+ union {
+ void (*attached_worker)(QXLInstance *qin);
+ void (*attache_worker)(QXLInstance *qin, QXLWorker *qxl_worker) SPICE_GNUC_DEPRECATED;
+ };
+ void (*set_compression_level)(QXLInstance *qin, int level);
+ void (*set_mm_time)(QXLInstance *qin, uint32_t mm_time) SPICE_GNUC_DEPRECATED;
+
+ void (*get_init_info)(QXLInstance *qin, QXLDevInitInfo *info);
+
+ /* Retrieve the next command to be processed
+ * This call should be non-blocking. If no commands are available, it
+ * should return 0, or 1 if a command was retrieved */
+ int (*get_command)(QXLInstance *qin, struct QXLCommandExt *cmd);
+
+ /* Request notification when new commands are available
+ * When a new command becomes available, the spice server should be
+ * notified by calling spice_qxl_wakeup(). If commands are already
+ * available, this function should return false and no notification
+ * triggered */
+ int (*req_cmd_notification)(QXLInstance *qin);
+ void (*release_resource)(QXLInstance *qin, struct QXLReleaseInfoExt release_info);
+ int (*get_cursor_command)(QXLInstance *qin, struct QXLCommandExt *cmd);
+ int (*req_cursor_notification)(QXLInstance *qin);
+ void (*notify_update)(QXLInstance *qin, uint32_t update_id);
+ int (*flush_resources)(QXLInstance *qin);
+ void (*async_complete)(QXLInstance *qin, uint64_t cookie);
+ void (*update_area_complete)(QXLInstance *qin, uint32_t surface_id,
+ struct QXLRect *updated_rects,
+ uint32_t num_updated_rects);
+ /* Available since version 3.2 */
+ void (*set_client_capabilities)(QXLInstance *qin,
+ uint8_t client_present,
+ uint8_t caps[SPICE_CAPABILITIES_SIZE]);
+ /* Returns 1 if the interface is supported, 0 otherwise.
+ * if monitors_config is NULL nothing is done except reporting the
+ * return code.
+ * Available since version 3.3 */
+ int (*client_monitors_config)(QXLInstance *qin,
+ VDAgentMonitorsConfig *monitors_config);
+};
+
+struct QXLInstance {
+ SpiceBaseInstance base;
+ int id;
+ QXLState *st;
+};
+
+SPICE_END_DECLS
+
+#endif /* SPICE_QXL_H_ */
diff --git a/server/spice-replay.h b/server/spice-replay.h
new file mode 100644
index 00000000..9540df75
--- /dev/null
+++ b/server/spice-replay.h
@@ -0,0 +1,42 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef SPICE_REPLAY_H_
+#define SPICE_REPLAY_H_
+
+#if !defined(SPICE_H_INSIDE) && !defined(SPICE_SERVER_INTERNAL)
+#error "Only spice.h can be included directly."
+#endif
+
+#include <stdio.h>
+#include "spice-core.h"
+
+SPICE_BEGIN_DECLS
+
+typedef struct SpiceReplay SpiceReplay;
+
+/* reads until encountering a cmd, processing any recorded messages (io) on the
+ * way */
+QXLCommandExt* spice_replay_next_cmd(SpiceReplay *replay, QXLInstance *instance);
+void spice_replay_free_cmd(SpiceReplay *replay, QXLCommandExt *cmd);
+void spice_replay_free(SpiceReplay *replay);
+SpiceReplay * spice_replay_new(FILE *file, int nsurfaces);
+
+SPICE_END_DECLS
+
+#endif /* SPICE_REPLAY_H_ */
diff --git a/server/spice-server-enums.c.tmpl b/server/spice-server-enums.c.tmpl
new file mode 100644
index 00000000..a75df2f3
--- /dev/null
+++ b/server/spice-server-enums.c.tmpl
@@ -0,0 +1,40 @@
+/*** BEGIN file-header ***/
+#include <config.h>
+
+#include "spice-server-enums.h"
+
+typedef struct EnumValues {
+ int value;
+ const char *nick;
+} EnumValues;
+
+static const char *
+enum_values_get_nick(int value, const EnumValues *e)
+{
+ for (; e->nick; e++) {
+ if (e->value == value) {
+ return e->nick;
+ }
+ }
+ return "???";
+}
+
+/*** END file-header ***/
+
+/*** BEGIN value-header ***/
+
+const char *@EnumName@_get_nick(@EnumName@ value)
+{
+ static const struct EnumValues @EnumName@_values[] = {
+/*** END value-header ***/
+
+/*** BEGIN value-production ***/
+ { @VALUENAME@, "@valuenick@" },
+/*** END value-production ***/
+
+/*** BEGIN value-tail ***/
+ { 0, NULL, }
+ };
+ return enum_values_get_nick(value, @EnumName@_values);
+}
+/*** END value-tail ***/
diff --git a/server/spice-server-enums.h.tmpl b/server/spice-server-enums.h.tmpl
new file mode 100644
index 00000000..ddf20512
--- /dev/null
+++ b/server/spice-server-enums.h.tmpl
@@ -0,0 +1,16 @@
+/*** BEGIN file-header ***/
+#pragma once
+
+#include "spice.h"
+
+SPICE_BEGIN_DECLS
+
+/*** END file-header ***/
+
+/*** BEGIN enumeration-production ***/
+const char *@EnumName@_get_nick(@EnumName@ value);
+/*** END enumeration-production ***/
+
+/*** BEGIN file-tail ***/
+SPICE_END_DECLS
+/*** END file-tail ***/
diff --git a/server/spice-server.h b/server/spice-server.h
new file mode 100644
index 00000000..f10ffeb9
--- /dev/null
+++ b/server/spice-server.h
@@ -0,0 +1,177 @@
+/*
+ * Copyright (C) 2009-2014 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef SPICE_SERVER_H_
+#define SPICE_SERVER_H_
+
+#if !defined(SPICE_H_INSIDE) && !defined(SPICE_SERVER_INTERNAL)
+#error "Only spice.h can be included directly."
+#endif
+
+#include "spice-core.h"
+
+SPICE_BEGIN_DECLS
+
+/* Don't use features incompatible with a specific spice
+ version, so that migration to/from that version works. */
+typedef enum {
+ SPICE_COMPAT_VERSION_0_4 = 0,
+ SPICE_COMPAT_VERSION_0_6 = 1,
+} spice_compat_version_t;
+
+#define SPICE_COMPAT_VERSION_CURRENT SPICE_COMPAT_VERSION_0_6
+
+spice_compat_version_t spice_get_current_compat_version(void);
+
+typedef struct RedsState SpiceServer;
+SpiceServer *spice_server_new(void);
+int spice_server_init(SpiceServer *s, SpiceCoreInterface *core);
+void spice_server_destroy(SpiceServer *s);
+
+#define SPICE_ADDR_FLAG_IPV4_ONLY (1 << 0)
+#define SPICE_ADDR_FLAG_IPV6_ONLY (1 << 1)
+#define SPICE_ADDR_FLAG_UNIX_ONLY (1 << 2)
+
+int spice_server_set_compat_version(SpiceServer *s,
+ spice_compat_version_t version);
+int spice_server_set_port(SpiceServer *s, int port);
+void spice_server_set_addr(SpiceServer *s, const char *addr, int flags);
+int spice_server_set_listen_socket_fd(SpiceServer *s, int listen_fd) SPICE_GNUC_DEPRECATED;
+int spice_server_set_exit_on_disconnect(SpiceServer *s, int flag);
+int spice_server_set_noauth(SpiceServer *s);
+int spice_server_set_sasl(SpiceServer *s, int enabled);
+int spice_server_set_sasl_appname(SpiceServer *s, const char *appname);
+int spice_server_set_ticket(SpiceServer *s, const char *passwd, int lifetime,
+ int fail_if_connected, int disconnect_if_connected);
+int spice_server_set_tls(SpiceServer *s, int port,
+ const char *ca_cert_file, const char *certs_file,
+ const char *private_key_file, const char *key_passwd,
+ const char *dh_key_file, const char *ciphersuite);
+
+int spice_server_add_client(SpiceServer *s, int socket, int skip_auth);
+int spice_server_add_ssl_client(SpiceServer *s, int socket, int skip_auth);
+
+int spice_server_add_interface(SpiceServer *s,
+ SpiceBaseInstance *sin);
+/**
+ * Remove an interface from SpiceServer.
+ * SpiceServer won't be using the interface anymore, so it can
+ * be freed or reused.
+ */
+int spice_server_remove_interface(SpiceBaseInstance *sin);
+
+/* XXX This definition is here only to make glib generation
+ * of enumerators possible
+ */
+#if 0
+typedef enum {
+ SPICE_IMAGE_COMPRESSION_INVALID = 0,
+ SPICE_IMAGE_COMPRESSION_OFF = 1,
+ SPICE_IMAGE_COMPRESSION_AUTO_GLZ = 2,
+ SPICE_IMAGE_COMPRESSION_AUTO_LZ = 3,
+ SPICE_IMAGE_COMPRESSION_QUIC = 4,
+ SPICE_IMAGE_COMPRESSION_GLZ = 5,
+ SPICE_IMAGE_COMPRESSION_LZ = 6,
+ SPICE_IMAGE_COMPRESSION_LZ4 = 7,
+} spice_image_compression_t;
+#endif
+
+// Needed for backward API compatibility
+typedef SpiceImageCompression spice_image_compression_t;
+#define SPICE_IMAGE_COMPRESS_INVALID SPICE_IMAGE_COMPRESSION_INVALID
+#define SPICE_IMAGE_COMPRESS_OFF SPICE_IMAGE_COMPRESSION_OFF
+#define SPICE_IMAGE_COMPRESS_AUTO_GLZ SPICE_IMAGE_COMPRESSION_AUTO_GLZ
+#define SPICE_IMAGE_COMPRESS_AUTO_LZ SPICE_IMAGE_COMPRESSION_AUTO_LZ
+#define SPICE_IMAGE_COMPRESS_QUIC SPICE_IMAGE_COMPRESSION_QUIC
+#define SPICE_IMAGE_COMPRESS_GLZ SPICE_IMAGE_COMPRESSION_GLZ
+#define SPICE_IMAGE_COMPRESS_LZ SPICE_IMAGE_COMPRESSION_LZ
+#define SPICE_IMAGE_COMPRESS_LZ4 SPICE_IMAGE_COMPRESSION_LZ4
+
+int spice_server_set_image_compression(SpiceServer *s,
+ SpiceImageCompression comp);
+SpiceImageCompression spice_server_get_image_compression(SpiceServer *s);
+
+typedef enum {
+ SPICE_WAN_COMPRESSION_INVALID,
+ SPICE_WAN_COMPRESSION_AUTO,
+ SPICE_WAN_COMPRESSION_ALWAYS,
+ SPICE_WAN_COMPRESSION_NEVER,
+} spice_wan_compression_t;
+
+int spice_server_set_jpeg_compression(SpiceServer *s, spice_wan_compression_t comp);
+int spice_server_set_zlib_glz_compression(SpiceServer *s, spice_wan_compression_t comp);
+
+#define SPICE_CHANNEL_SECURITY_NONE (1 << 0)
+#define SPICE_CHANNEL_SECURITY_SSL (1 << 1)
+
+int spice_server_set_channel_security(SpiceServer *s, const char *channel, int security);
+
+int spice_server_add_renderer(SpiceServer *s, const char *name) SPICE_GNUC_DEPRECATED;
+
+enum {
+ SPICE_STREAM_VIDEO_INVALID,
+ SPICE_STREAM_VIDEO_OFF,
+ SPICE_STREAM_VIDEO_ALL,
+ SPICE_STREAM_VIDEO_FILTER
+};
+
+int spice_server_set_streaming_video(SpiceServer *s, int value);
+
+enum {
+ SPICE_STREAMING_INVALID,
+ SPICE_STREAMING_SPICE,
+ SPICE_STREAMING_GSTREAMER
+};
+
+int spice_server_set_video_codecs(SpiceServer *s, const char* video_codecs);
+
+/**
+ * Returns a newly allocated string describing video encoders/codecs
+ * currently allowed in @s Spice server. The string returned by
+ * this function must be released with spice_server_free_video_codecs.
+ *
+ * @s: the Spice server to query
+ * @return the string describing the video encoders/codecs currently enabled
+ */
+const char *spice_server_get_video_codecs(SpiceServer *s);
+
+/**
+ * Releases the memory of the video-codec string returned by
+ * spice_server_get_video_codecs.
+ */
+void spice_server_free_video_codecs(SpiceServer *s, const char *video_codecs);
+int spice_server_set_playback_compression(SpiceServer *s, int enable);
+int spice_server_set_agent_mouse(SpiceServer *s, int enable);
+int spice_server_set_agent_copypaste(SpiceServer *s, int enable);
+int spice_server_set_agent_file_xfer(SpiceServer *s, int enable);
+
+int spice_server_get_sock_info(SpiceServer *s, struct sockaddr *sa, socklen_t *salen) SPICE_GNUC_DEPRECATED;
+int spice_server_get_peer_info(SpiceServer *s, struct sockaddr *sa, socklen_t *salen) SPICE_GNUC_DEPRECATED;
+
+int spice_server_is_server_mouse(SpiceServer *s);
+
+void spice_server_set_name(SpiceServer *s, const char *name);
+void spice_server_set_uuid(SpiceServer *s, const uint8_t uuid[16]);
+
+void spice_server_vm_start(SpiceServer *s);
+void spice_server_vm_stop(SpiceServer *s);
+
+int spice_server_get_num_clients(SpiceServer *s) SPICE_GNUC_DEPRECATED;
+
+SPICE_END_DECLS
+
+#endif /* SPICE_SERVER_H_ */
diff --git a/server/spice-server.syms b/server/spice-server.syms
index 21938112..8da46c20 100644
--- a/server/spice-server.syms
+++ b/server/spice-server.syms
@@ -10,7 +10,6 @@ global:
spice_server_get_sock_info;
spice_server_init;
spice_server_kbd_leds;
- spice_server_migrate_client_state;
spice_server_migrate_end;
spice_server_migrate_info;
spice_server_migrate_start;
@@ -153,3 +152,34 @@ global:
spice_server_get_best_record_rate;
spice_server_set_record_rate;
} SPICE_SERVER_0.12.4;
+
+SPICE_SERVER_0.12.6 {
+global:
+ spice_qxl_set_max_monitors;
+ spice_replay_free;
+ spice_replay_new;
+ spice_replay_next_cmd;
+ spice_replay_free_cmd;
+} SPICE_SERVER_0.12.5;
+
+SPICE_SERVER_0.13.1 {
+global:
+ spice_qxl_gl_scanout;
+ spice_qxl_gl_draw_async;
+} SPICE_SERVER_0.12.6;
+
+SPICE_SERVER_0.13.2 {
+global:
+ spice_server_set_video_codecs;
+} SPICE_SERVER_0.13.1;
+
+SPICE_SERVER_0.14.2 {
+global:
+ spice_qxl_set_device_info;
+} SPICE_SERVER_0.13.2;
+
+SPICE_SERVER_0.14.3 {
+global:
+ spice_server_get_video_codecs;
+ spice_server_free_video_codecs;
+} SPICE_SERVER_0.14.2;
diff --git a/server/spice-version.h.in b/server/spice-version.h.in
new file mode 100644
index 00000000..69e97e9f
--- /dev/null
+++ b/server/spice-version.h.in
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2009-2014 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef SPICE_VERSION_H_
+#define SPICE_VERSION_H_
+
+#if !defined(SPICE_H_INSIDE) && !defined(SPICE_SERVER_INTERNAL)
+#error "Only spice.h can be included directly."
+#endif
+
+#define SPICE_SERVER_VERSION @SPICE_SERVER_VERSION@
+
+#endif /* SPICE_VERSION_H_ */
diff --git a/client/windows/win_platform.h b/server/spice-wrapped.h
index c1a356c8..769f652f 100644
--- a/client/windows/win_platform.h
+++ b/server/spice-wrapped.h
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2009 Red Hat, Inc.
+ Copyright (C) 2020 Red Hat, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@@ -14,26 +14,26 @@
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
+#pragma once
-#ifndef _H_WINPLATFORM
-#define _H_WINPLATFORM
+#undef SPICE_SERVER_INTERNAL
-#include "icon.h"
+#include <spice/macros.h>
-class WinPlatform {
-public:
- static void enter_modal_loop();
- static void exit_modal_loop();
-};
+#undef SPICE_GNUC_DEPRECATED
+#define SPICE_GNUC_DEPRECATED
-class WinIcon: public Icon {
-public:
- WinIcon(HICON icon) : _icon (icon) {}
+#define SpiceCharDeviceState RedCharDevice
+#define SpicePlaybackState PlaybackChannel
+#define SpiceRecordState RecordChannel
- HICON get_handle() {return _icon;}
+#include "push-visibility.h"
+struct RedCharDevice;
+struct SpiceCharDeviceInstance;
+#include "pop-visibility.h"
-private:
- HICON _icon;
-};
+#include "spice.h"
-#endif
+#undef SpiceCharDeviceState
+#undef SpicePlaybackState
+#undef SpiceRecordState
diff --git a/server/spice.h b/server/spice.h
index 58700d14..901addf2 100644
--- a/server/spice.h
+++ b/server/spice.h
@@ -1,566 +1,35 @@
/*
- Copyright (C) 2009 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_SPICE
-#define _H_SPICE
-
-#include <stdint.h>
-#include <sys/socket.h>
-#include <spice/qxl_dev.h>
-#include <spice/vd_agent.h>
-#include <spice/macros.h>
-
-#define SPICE_SERVER_VERSION 0x000c05 /* release 0.12.5 */
-
-#ifdef SPICE_SERVER_INTERNAL
-#undef SPICE_GNUC_DEPRECATED
-#define SPICE_GNUC_DEPRECATED
-#endif
-
-/* interface base type */
-
-typedef struct SpiceBaseInterface SpiceBaseInterface;
-typedef struct SpiceBaseInstance SpiceBaseInstance;
-
-struct SpiceBaseInterface {
- const char *type;
- const char *description;
- uint32_t major_version;
- uint32_t minor_version;
-};
-struct SpiceBaseInstance {
- const SpiceBaseInterface *sif;
-};
-
-/* core interface */
-
-#define SPICE_INTERFACE_CORE "core"
-#define SPICE_INTERFACE_CORE_MAJOR 1
-#define SPICE_INTERFACE_CORE_MINOR 3
-typedef struct SpiceCoreInterface SpiceCoreInterface;
-
-#define SPICE_WATCH_EVENT_READ (1 << 0)
-#define SPICE_WATCH_EVENT_WRITE (1 << 1)
-
-#define SPICE_CHANNEL_EVENT_CONNECTED 1
-#define SPICE_CHANNEL_EVENT_INITIALIZED 2
-#define SPICE_CHANNEL_EVENT_DISCONNECTED 3
-
-#define SPICE_CHANNEL_EVENT_FLAG_TLS (1 << 0)
-#define SPICE_CHANNEL_EVENT_FLAG_ADDR_EXT (1 << 1)
-
-typedef struct SpiceWatch SpiceWatch;
-typedef void (*SpiceWatchFunc)(int fd, int event, void *opaque);
-
-typedef struct SpiceTimer SpiceTimer;
-typedef void (*SpiceTimerFunc)(void *opaque);
-
-typedef struct SpiceChannelEventInfo {
- int connection_id;
- int type;
- int id;
- int flags;
- /* deprecated, can't hold ipv6 addresses, kept for backward compatibility */
- struct sockaddr laddr SPICE_GNUC_DEPRECATED;
- struct sockaddr paddr SPICE_GNUC_DEPRECATED;
- socklen_t llen SPICE_GNUC_DEPRECATED;
- socklen_t plen SPICE_GNUC_DEPRECATED;
- /* should be used if (flags & SPICE_CHANNEL_EVENT_FLAG_ADDR_EXT) */
- struct sockaddr_storage laddr_ext;
- struct sockaddr_storage paddr_ext;
- socklen_t llen_ext, plen_ext;
-} SpiceChannelEventInfo;
-
-struct SpiceCoreInterface {
- SpiceBaseInterface base;
-
- SpiceTimer *(*timer_add)(SpiceTimerFunc func, void *opaque);
- void (*timer_start)(SpiceTimer *timer, uint32_t ms);
- void (*timer_cancel)(SpiceTimer *timer);
- void (*timer_remove)(SpiceTimer *timer);
-
- SpiceWatch *(*watch_add)(int fd, int event_mask, SpiceWatchFunc func, void *opaque);
- void (*watch_update_mask)(SpiceWatch *watch, int event_mask);
- void (*watch_remove)(SpiceWatch *watch);
-
- void (*channel_event)(int event, SpiceChannelEventInfo *info);
-};
-
-/* qxl interface */
-
-#define SPICE_INTERFACE_QXL "qxl"
-#define SPICE_INTERFACE_QXL_MAJOR 3
-#define SPICE_INTERFACE_QXL_MINOR 3
-typedef struct QXLInterface QXLInterface;
-typedef struct QXLInstance QXLInstance;
-typedef struct QXLState QXLState;
-typedef struct QXLWorker QXLWorker;
-typedef struct QXLDevMemSlot QXLDevMemSlot;
-typedef struct QXLDevSurfaceCreate QXLDevSurfaceCreate;
-union QXLReleaseInfo;
-struct QXLReleaseInfoExt;
-struct QXLCommand;
-struct QXLCommandExt;
-struct QXLRect;
-struct QXLWorker {
- uint32_t minor_version;
- uint32_t major_version;
- /* These calls are deprecated. Please use the spice_qxl_* calls instead */
- void (*wakeup)(QXLWorker *worker) SPICE_GNUC_DEPRECATED;
- void (*oom)(QXLWorker *worker) SPICE_GNUC_DEPRECATED;
- void (*start)(QXLWorker *worker) SPICE_GNUC_DEPRECATED;
- void (*stop)(QXLWorker *worker) SPICE_GNUC_DEPRECATED;
- void (*update_area)(QXLWorker *qxl_worker, uint32_t surface_id,
- struct QXLRect *area, struct QXLRect *dirty_rects,
- uint32_t num_dirty_rects, uint32_t clear_dirty_region) SPICE_GNUC_DEPRECATED;
- void (*add_memslot)(QXLWorker *worker, QXLDevMemSlot *slot) SPICE_GNUC_DEPRECATED;
- void (*del_memslot)(QXLWorker *worker, uint32_t slot_group_id, uint32_t slot_id) SPICE_GNUC_DEPRECATED;
- void (*reset_memslots)(QXLWorker *worker) SPICE_GNUC_DEPRECATED;
- void (*destroy_surfaces)(QXLWorker *worker) SPICE_GNUC_DEPRECATED;
- void (*destroy_primary_surface)(QXLWorker *worker, uint32_t surface_id) SPICE_GNUC_DEPRECATED;
- void (*create_primary_surface)(QXLWorker *worker, uint32_t surface_id,
- QXLDevSurfaceCreate *surface) SPICE_GNUC_DEPRECATED;
- void (*reset_image_cache)(QXLWorker *worker) SPICE_GNUC_DEPRECATED;
- void (*reset_cursor)(QXLWorker *worker) SPICE_GNUC_DEPRECATED;
- void (*destroy_surface_wait)(QXLWorker *worker, uint32_t surface_id) SPICE_GNUC_DEPRECATED;
- void (*loadvm_commands)(QXLWorker *worker, struct QXLCommandExt *ext, uint32_t count) SPICE_GNUC_DEPRECATED;
-};
-
-void spice_qxl_wakeup(QXLInstance *instance);
-void spice_qxl_oom(QXLInstance *instance);
-/* deprecated since 0.11.2, spice_server_vm_start replaces it */
-void spice_qxl_start(QXLInstance *instance) SPICE_GNUC_DEPRECATED;
-/* deprecated since 0.11.2 spice_server_vm_stop replaces it */
-void spice_qxl_stop(QXLInstance *instance) SPICE_GNUC_DEPRECATED;
-void spice_qxl_update_area(QXLInstance *instance, uint32_t surface_id,
- struct QXLRect *area, struct QXLRect *dirty_rects,
- uint32_t num_dirty_rects, uint32_t clear_dirty_region);
-void spice_qxl_add_memslot(QXLInstance *instance, QXLDevMemSlot *slot);
-void spice_qxl_del_memslot(QXLInstance *instance, uint32_t slot_group_id, uint32_t slot_id);
-void spice_qxl_reset_memslots(QXLInstance *instance);
-void spice_qxl_destroy_surfaces(QXLInstance *instance);
-void spice_qxl_destroy_primary_surface(QXLInstance *instance, uint32_t surface_id);
-void spice_qxl_create_primary_surface(QXLInstance *instance, uint32_t surface_id,
- QXLDevSurfaceCreate *surface);
-void spice_qxl_reset_image_cache(QXLInstance *instance);
-void spice_qxl_reset_cursor(QXLInstance *instance);
-void spice_qxl_destroy_surface_wait(QXLInstance *instance, uint32_t surface_id);
-void spice_qxl_loadvm_commands(QXLInstance *instance, struct QXLCommandExt *ext, uint32_t count);
-/* async versions of commands. when complete spice calls async_complete */
-void spice_qxl_update_area_async(QXLInstance *instance, uint32_t surface_id, QXLRect *qxl_area,
- uint32_t clear_dirty_region, uint64_t cookie);
-void spice_qxl_add_memslot_async(QXLInstance *instance, QXLDevMemSlot *slot, uint64_t cookie);
-void spice_qxl_destroy_surfaces_async(QXLInstance *instance, uint64_t cookie);
-void spice_qxl_destroy_primary_surface_async(QXLInstance *instance, uint32_t surface_id, uint64_t cookie);
-void spice_qxl_create_primary_surface_async(QXLInstance *instance, uint32_t surface_id,
- QXLDevSurfaceCreate *surface, uint64_t cookie);
-void spice_qxl_destroy_surface_async(QXLInstance *instance, uint32_t surface_id, uint64_t cookie);
-/* suspend and resolution change on windows drivers */
-void spice_qxl_flush_surfaces_async(QXLInstance *instance, uint64_t cookie);
-/* since spice 0.12.0 */
-void spice_qxl_monitors_config_async(QXLInstance *instance, QXLPHYSICAL monitors_config,
- int group_id, uint64_t cookie);
-/* since spice 0.12.3 */
-void spice_qxl_driver_unload(QXLInstance *instance);
-
-typedef struct QXLDrawArea {
- uint8_t *buf;
- uint32_t size;
- uint8_t *line_0;
- uint32_t width;
- uint32_t heigth;
- int stride;
-} QXLDrawArea;
-
-typedef struct QXLDevInfo {
- uint32_t x_res;
- uint32_t y_res;
- uint32_t bits;
- uint32_t use_hardware_cursor;
-
- QXLDrawArea draw_area;
-
- uint32_t ram_size;
-} QXLDevInfo;
-
-typedef struct QXLDevInitInfo {
- uint32_t num_memslots_groups;
- uint32_t num_memslots;
- uint8_t memslot_gen_bits;
- uint8_t memslot_id_bits;
- uint32_t qxl_ram_size;
- uint8_t internal_groupslot_id;
- uint32_t n_surfaces;
-} QXLDevInitInfo;
-
-struct QXLDevMemSlot {
- uint32_t slot_group_id;
- uint32_t slot_id;
- uint32_t generation;
- unsigned long virt_start;
- unsigned long virt_end;
- uint64_t addr_delta;
- uint32_t qxl_ram_size;
-};
-
-struct QXLDevSurfaceCreate {
- uint32_t width;
- uint32_t height;
- int32_t stride;
- uint32_t format;
- uint32_t position;
- uint32_t mouse_mode;
- uint32_t flags;
- uint32_t type;
- uint64_t mem;
- uint32_t group_id;
-};
-
-struct QXLInterface {
- SpiceBaseInterface base;
-
- void (*attache_worker)(QXLInstance *qin, QXLWorker *qxl_worker);
- void (*set_compression_level)(QXLInstance *qin, int level);
- void (*set_mm_time)(QXLInstance *qin, uint32_t mm_time);
-
- void (*get_init_info)(QXLInstance *qin, QXLDevInitInfo *info);
- int (*get_command)(QXLInstance *qin, struct QXLCommandExt *cmd);
- int (*req_cmd_notification)(QXLInstance *qin);
- void (*release_resource)(QXLInstance *qin, struct QXLReleaseInfoExt release_info);
- int (*get_cursor_command)(QXLInstance *qin, struct QXLCommandExt *cmd);
- int (*req_cursor_notification)(QXLInstance *qin);
- void (*notify_update)(QXLInstance *qin, uint32_t update_id);
- int (*flush_resources)(QXLInstance *qin);
- void (*async_complete)(QXLInstance *qin, uint64_t cookie);
- void (*update_area_complete)(QXLInstance *qin, uint32_t surface_id,
- struct QXLRect *updated_rects,
- uint32_t num_updated_rects);
- void (*set_client_capabilities)(QXLInstance *qin,
- uint8_t client_present,
- uint8_t caps[58]);
- /* returns 1 if the interface is supported, 0 otherwise.
- * if monitors_config is NULL nothing is done except reporting the
- * return code. */
- int (*client_monitors_config)(QXLInstance *qin,
- VDAgentMonitorsConfig *monitors_config);
-};
-
-struct QXLInstance {
- SpiceBaseInstance base;
- int id;
- QXLState *st;
-};
-
-/* input interfaces */
-
-#define SPICE_INTERFACE_KEYBOARD "keyboard"
-#define SPICE_INTERFACE_KEYBOARD_MAJOR 1
-#define SPICE_INTERFACE_KEYBOARD_MINOR 1
-typedef struct SpiceKbdInterface SpiceKbdInterface;
-typedef struct SpiceKbdInstance SpiceKbdInstance;
-typedef struct SpiceKbdState SpiceKbdState;
-
-struct SpiceKbdInterface {
- SpiceBaseInterface base;
-
- void (*push_scan_freg)(SpiceKbdInstance *sin, uint8_t frag);
- uint8_t (*get_leds)(SpiceKbdInstance *sin);
-};
-
-struct SpiceKbdInstance {
- SpiceBaseInstance base;
- SpiceKbdState *st;
-};
-
-int spice_server_kbd_leds(SpiceKbdInstance *sin, int leds);
-
-#define SPICE_INTERFACE_MOUSE "mouse"
-#define SPICE_INTERFACE_MOUSE_MAJOR 1
-#define SPICE_INTERFACE_MOUSE_MINOR 1
-typedef struct SpiceMouseInterface SpiceMouseInterface;
-typedef struct SpiceMouseInstance SpiceMouseInstance;
-typedef struct SpiceMouseState SpiceMouseState;
-
-struct SpiceMouseInterface {
- SpiceBaseInterface base;
-
- void (*motion)(SpiceMouseInstance *sin, int dx, int dy, int dz,
- uint32_t buttons_state);
- void (*buttons)(SpiceMouseInstance *sin, uint32_t buttons_state);
-};
-
-struct SpiceMouseInstance {
- SpiceBaseInstance base;
- SpiceMouseState *st;
-};
-
-#define SPICE_INTERFACE_TABLET "tablet"
-#define SPICE_INTERFACE_TABLET_MAJOR 1
-#define SPICE_INTERFACE_TABLET_MINOR 1
-typedef struct SpiceTabletInterface SpiceTabletInterface;
-typedef struct SpiceTabletInstance SpiceTabletInstance;
-typedef struct SpiceTabletState SpiceTabletState;
-
-struct SpiceTabletInterface {
- SpiceBaseInterface base;
-
- void (*set_logical_size)(SpiceTabletInstance* tablet, int width, int height);
- void (*position)(SpiceTabletInstance* tablet, int x, int y, uint32_t buttons_state);
- void (*wheel)(SpiceTabletInstance* tablet, int wheel_moution, uint32_t buttons_state);
- void (*buttons)(SpiceTabletInstance* tablet, uint32_t buttons_state);
-};
-
-struct SpiceTabletInstance {
- SpiceBaseInstance base;
- SpiceTabletState *st;
-};
-
-/* sound interfaces */
-
-#define SPICE_INTERFACE_PLAYBACK "playback"
-#define SPICE_INTERFACE_PLAYBACK_MAJOR 1
-#define SPICE_INTERFACE_PLAYBACK_MINOR 3
-typedef struct SpicePlaybackInterface SpicePlaybackInterface;
-typedef struct SpicePlaybackInstance SpicePlaybackInstance;
-typedef struct SpicePlaybackState SpicePlaybackState;
-
-enum {
- SPICE_INTERFACE_AUDIO_FMT_S16 = 1,
-};
-
-#define SPICE_INTERFACE_PLAYBACK_FREQ 44100
-#define SPICE_INTERFACE_PLAYBACK_CHAN 2
-#define SPICE_INTERFACE_PLAYBACK_FMT SPICE_INTERFACE_AUDIO_FMT_S16
-
-struct SpicePlaybackInterface {
- SpiceBaseInterface base;
-};
-
-struct SpicePlaybackInstance {
- SpiceBaseInstance base;
- SpicePlaybackState *st;
-};
-
-void spice_server_playback_start(SpicePlaybackInstance *sin);
-void spice_server_playback_stop(SpicePlaybackInstance *sin);
-void spice_server_playback_get_buffer(SpicePlaybackInstance *sin,
- uint32_t **samples, uint32_t *nsamples);
-void spice_server_playback_put_samples(SpicePlaybackInstance *sin,
- uint32_t *samples);
-void spice_server_playback_set_volume(SpicePlaybackInstance *sin,
- uint8_t nchannels, uint16_t *volume);
-void spice_server_playback_set_mute(SpicePlaybackInstance *sin, uint8_t mute);
-
-#define SPICE_INTERFACE_RECORD "record"
-#define SPICE_INTERFACE_RECORD_MAJOR 2
-#define SPICE_INTERFACE_RECORD_MINOR 3
-typedef struct SpiceRecordInterface SpiceRecordInterface;
-typedef struct SpiceRecordInstance SpiceRecordInstance;
-typedef struct SpiceRecordState SpiceRecordState;
-
-#define SPICE_INTERFACE_RECORD_FREQ 44100
-#define SPICE_INTERFACE_RECORD_CHAN 2
-#define SPICE_INTERFACE_RECORD_FMT SPICE_INTERFACE_AUDIO_FMT_S16
-
-struct SpiceRecordInterface {
- SpiceBaseInterface base;
-};
-
-struct SpiceRecordInstance {
- SpiceBaseInstance base;
- SpiceRecordState *st;
-};
-
-void spice_server_record_start(SpiceRecordInstance *sin);
-void spice_server_record_stop(SpiceRecordInstance *sin);
-uint32_t spice_server_record_get_samples(SpiceRecordInstance *sin,
- uint32_t *samples, uint32_t bufsize);
-void spice_server_record_set_volume(SpiceRecordInstance *sin,
- uint8_t nchannels, uint16_t *volume);
-void spice_server_record_set_mute(SpiceRecordInstance *sin, uint8_t mute);
-
-uint32_t spice_server_get_best_playback_rate(SpicePlaybackInstance *sin);
-void spice_server_set_playback_rate(SpicePlaybackInstance *sin, uint32_t frequency);
-uint32_t spice_server_get_best_record_rate(SpiceRecordInstance *sin);
-void spice_server_set_record_rate(SpiceRecordInstance *sin, uint32_t frequency);
-
-/* char device interfaces */
-
-#define SPICE_INTERFACE_CHAR_DEVICE "char_device"
-#define SPICE_INTERFACE_CHAR_DEVICE_MAJOR 1
-#define SPICE_INTERFACE_CHAR_DEVICE_MINOR 2
-typedef struct SpiceCharDeviceInterface SpiceCharDeviceInterface;
-typedef struct SpiceCharDeviceInstance SpiceCharDeviceInstance;
-typedef struct SpiceCharDeviceState SpiceCharDeviceState;
-
-struct SpiceCharDeviceInterface {
- SpiceBaseInterface base;
-
- void (*state)(SpiceCharDeviceInstance *sin, int connected);
- int (*write)(SpiceCharDeviceInstance *sin, const uint8_t *buf, int len);
- int (*read)(SpiceCharDeviceInstance *sin, uint8_t *buf, int len);
- void (*event)(SpiceCharDeviceInstance *sin, uint8_t event);
-};
-
-struct SpiceCharDeviceInstance {
- SpiceBaseInstance base;
- const char* subtype;
- SpiceCharDeviceState *st;
- const char* portname;
-};
-
-void spice_server_char_device_wakeup(SpiceCharDeviceInstance *sin);
-void spice_server_port_event(SpiceCharDeviceInstance *char_device, uint8_t event);
-const char** spice_server_char_device_recognized_subtypes(void);
-
-/* spice server setup */
-
-/* Don't use features incompatible with a specific spice
- version, so that migration to/from that version works. */
-typedef enum {
- SPICE_COMPAT_VERSION_0_4 = 0,
- SPICE_COMPAT_VERSION_0_6 = 1,
-} spice_compat_version_t;
-
-#define SPICE_COMPAT_VERSION_CURRENT SPICE_COMPAT_VERSION_0_6
-
-spice_compat_version_t spice_get_current_compat_version(void);
-
-typedef struct RedsState SpiceServer;
-SpiceServer *spice_server_new(void);
-int spice_server_init(SpiceServer *s, SpiceCoreInterface *core);
-void spice_server_destroy(SpiceServer *s);
-
-#define SPICE_ADDR_FLAG_IPV4_ONLY (1 << 0)
-#define SPICE_ADDR_FLAG_IPV6_ONLY (1 << 1)
-
-int spice_server_set_compat_version(SpiceServer *s,
- spice_compat_version_t version);
-int spice_server_set_port(SpiceServer *s, int port);
-void spice_server_set_addr(SpiceServer *s, const char *addr, int flags);
-int spice_server_set_listen_socket_fd(SpiceServer *s, int listen_fd);
-int spice_server_set_exit_on_disconnect(SpiceServer *s, int flag);
-int spice_server_set_noauth(SpiceServer *s);
-int spice_server_set_sasl(SpiceServer *s, int enabled);
-int spice_server_set_sasl_appname(SpiceServer *s, const char *appname);
-int spice_server_set_ticket(SpiceServer *s, const char *passwd, int lifetime,
- int fail_if_connected, int disconnect_if_connected);
-int spice_server_set_tls(SpiceServer *s, int port,
- const char *ca_cert_file, const char *certs_file,
- const char *private_key_file, const char *key_passwd,
- const char *dh_key_file, const char *ciphersuite);
-
-int spice_server_add_client(SpiceServer *s, int socket, int skip_auth);
-int spice_server_add_ssl_client(SpiceServer *s, int socket, int skip_auth);
-
-int spice_server_add_interface(SpiceServer *s,
- SpiceBaseInstance *sin);
-int spice_server_remove_interface(SpiceBaseInstance *sin);
-
-typedef enum {
- SPICE_IMAGE_COMPRESS_INVALID = 0,
- SPICE_IMAGE_COMPRESS_OFF = 1,
- SPICE_IMAGE_COMPRESS_AUTO_GLZ = 2,
- SPICE_IMAGE_COMPRESS_AUTO_LZ = 3,
- SPICE_IMAGE_COMPRESS_QUIC = 4,
- SPICE_IMAGE_COMPRESS_GLZ = 5,
- SPICE_IMAGE_COMPRESS_LZ = 6,
-} spice_image_compression_t;
-
-int spice_server_set_image_compression(SpiceServer *s,
- spice_image_compression_t comp);
-spice_image_compression_t spice_server_get_image_compression(SpiceServer *s);
-
-typedef enum {
- SPICE_WAN_COMPRESSION_INVALID,
- SPICE_WAN_COMPRESSION_AUTO,
- SPICE_WAN_COMPRESSION_ALWAYS,
- SPICE_WAN_COMPRESSION_NEVER,
-} spice_wan_compression_t;
-
-int spice_server_set_jpeg_compression(SpiceServer *s, spice_wan_compression_t comp);
-int spice_server_set_zlib_glz_compression(SpiceServer *s, spice_wan_compression_t comp);
-
-#define SPICE_CHANNEL_SECURITY_NONE (1 << 0)
-#define SPICE_CHANNEL_SECURITY_SSL (1 << 1)
-
-int spice_server_set_channel_security(SpiceServer *s, const char *channel, int security);
-
-int spice_server_add_renderer(SpiceServer *s, const char *name);
-
-enum {
- SPICE_STREAM_VIDEO_INVALID,
- SPICE_STREAM_VIDEO_OFF,
- SPICE_STREAM_VIDEO_ALL,
- SPICE_STREAM_VIDEO_FILTER
-};
-
-int spice_server_set_streaming_video(SpiceServer *s, int value);
-int spice_server_set_playback_compression(SpiceServer *s, int enable);
-int spice_server_set_agent_mouse(SpiceServer *s, int enable);
-int spice_server_set_agent_copypaste(SpiceServer *s, int enable);
-int spice_server_set_agent_file_xfer(SpiceServer *s, int enable);
-
-int spice_server_get_sock_info(SpiceServer *s, struct sockaddr *sa, socklen_t *salen);
-int spice_server_get_peer_info(SpiceServer *s, struct sockaddr *sa, socklen_t *salen);
-
-int spice_server_is_server_mouse(SpiceServer *s);
-
-/* migration interface */
-#define SPICE_INTERFACE_MIGRATION "migration"
-#define SPICE_INTERFACE_MIGRATION_MAJOR 1
-#define SPICE_INTERFACE_MIGRATION_MINOR 1
-typedef struct SpiceMigrateInterface SpiceMigrateInterface;
-typedef struct SpiceMigrateInstance SpiceMigrateInstance;
-typedef struct SpiceMigrateState SpiceMigrateState;
-
-struct SpiceMigrateInterface {
- SpiceBaseInterface base;
- void (*migrate_connect_complete)(SpiceMigrateInstance *sin);
- void (*migrate_end_complete)(SpiceMigrateInstance *sin);
-};
-
-struct SpiceMigrateInstance {
- SpiceBaseInstance base;
- SpiceMigrateState *st;
-};
-
-/* spice switch-host client migration */
-int spice_server_migrate_info(SpiceServer *s, const char* dest,
- int port, int secure_port,
- const char* cert_subject);
-int spice_server_migrate_switch(SpiceServer *s);
-
-/* server status */
-int spice_server_get_num_clients(SpiceServer *s);
-
-/* spice (semi-)seamless client migration */
-int spice_server_migrate_connect(SpiceServer *s, const char* dest,
- int port, int secure_port,
- const char* cert_subject);
-int spice_server_migrate_start(SpiceServer *s);
-int spice_server_migrate_end(SpiceServer *s, int completed);
-
-void spice_server_set_seamless_migration(SpiceServer *s, int enable);
-
-void spice_server_set_name(SpiceServer *s, const char *name);
-void spice_server_set_uuid(SpiceServer *s, const uint8_t uuid[16]);
-
-void spice_server_vm_start(SpiceServer *s);
-void spice_server_vm_stop(SpiceServer *s);
-
-#endif
+ * Copyright (C) 2009-2014 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef SPICE_H_
+#define SPICE_H_
+
+#define SPICE_H_INSIDE
+
+#include "spice-version.h"
+#include "spice-core.h"
+#include "spice-server.h"
+#include "spice-qxl.h"
+#include "spice-input.h"
+#include "spice-audio.h"
+#include "spice-char.h"
+#include "spice-migration.h"
+#include "spice-replay.h"
+
+#undef SPICE_H_INSIDE
+
+#endif /* SPICE_H_ */
diff --git a/server/spice_bitmap_utils.c b/server/spice_bitmap_utils.c
deleted file mode 100644
index aa7d71bd..00000000
--- a/server/spice_bitmap_utils.c
+++ /dev/null
@@ -1,168 +0,0 @@
-#include <stdio.h>
-
-#include "common/log.h"
-#include "common/draw.h"
-
-#include "spice_bitmap_utils.h"
-
-int spice_bitmap_from_surface_type(uint32_t surface_format)
-{
- switch (surface_format) {
- case SPICE_SURFACE_FMT_16_555:
- return SPICE_BITMAP_FMT_16BIT;
- case SPICE_SURFACE_FMT_32_xRGB:
- return SPICE_BITMAP_FMT_32BIT;
- case SPICE_SURFACE_FMT_32_ARGB:
- return SPICE_BITMAP_FMT_RGBA;
- case SPICE_SURFACE_FMT_8_A:
- return SPICE_BITMAP_FMT_8BIT_A;
- default:
- spice_critical("Unsupported surface format");
- }
- return 0;
-}
-
-#define RAM_PATH "/tmp/tmpfs"
-
-static void dump_palette(FILE *f, SpicePalette* plt)
-{
- int i;
- for (i = 0; i < plt->num_ents; i++) {
- fwrite(plt->ents + i, sizeof(uint32_t), 1, f);
- }
-}
-
-static void dump_line(FILE *f, uint8_t* line, uint16_t n_pixel_bits, int width, int row_size)
-{
- int i;
- int copy_bytes_size = SPICE_ALIGN(n_pixel_bits * width, 8) / 8;
-
- fwrite(line, 1, copy_bytes_size, f);
- if (row_size > copy_bytes_size) {
- // each line should be 4 bytes aligned
- for (i = copy_bytes_size; i < row_size; i++) {
- fprintf(f, "%c", 0);
- }
- }
-}
-void dump_bitmap(SpiceBitmap *bitmap)
-{
- static uint32_t file_id = 0;
-
- char file_str[200];
- int rgb = TRUE;
- uint16_t n_pixel_bits;
- SpicePalette *plt = NULL;
- uint32_t id;
- int row_size;
- uint32_t file_size;
- int alpha = 0;
- uint32_t header_size = 14 + 40;
- uint32_t bitmap_data_offset;
- uint32_t tmp_u32;
- int32_t tmp_32;
- uint16_t tmp_u16;
- FILE *f;
- int i, j;
-
- switch (bitmap->format) {
- case SPICE_BITMAP_FMT_1BIT_BE:
- case SPICE_BITMAP_FMT_1BIT_LE:
- rgb = FALSE;
- n_pixel_bits = 1;
- break;
- case SPICE_BITMAP_FMT_4BIT_BE:
- case SPICE_BITMAP_FMT_4BIT_LE:
- rgb = FALSE;
- n_pixel_bits = 4;
- break;
- case SPICE_BITMAP_FMT_8BIT:
- rgb = FALSE;
- n_pixel_bits = 8;
- break;
- case SPICE_BITMAP_FMT_16BIT:
- n_pixel_bits = 16;
- break;
- case SPICE_BITMAP_FMT_24BIT:
- n_pixel_bits = 24;
- break;
- case SPICE_BITMAP_FMT_32BIT:
- n_pixel_bits = 32;
- break;
- case SPICE_BITMAP_FMT_RGBA:
- n_pixel_bits = 32;
- alpha = 1;
- break;
- default:
- spice_error("invalid bitmap format %u", bitmap->format);
- return;
- }
-
- if (!rgb) {
- if (!bitmap->palette) {
- return; // dont dump masks.
- }
- plt = bitmap->palette;
- }
- row_size = (((bitmap->x * n_pixel_bits) + 31) / 32) * 4;
- bitmap_data_offset = header_size;
-
- if (plt) {
- bitmap_data_offset += plt->num_ents * 4;
- }
- file_size = bitmap_data_offset + (bitmap->y * row_size);
-
- id = ++file_id;
- sprintf(file_str, "%s/%u.bmp", RAM_PATH, id);
-
- f = fopen(file_str, "wb");
- if (!f) {
- spice_error("Error creating bmp");
- return;
- }
-
- /* writing the bmp v3 header */
- fprintf(f, "BM");
- fwrite(&file_size, sizeof(file_size), 1, f);
- tmp_u16 = alpha ? 1 : 0;
- fwrite(&tmp_u16, sizeof(tmp_u16), 1, f); // reserved for application
- tmp_u16 = 0;
- fwrite(&tmp_u16, sizeof(tmp_u16), 1, f);
- fwrite(&bitmap_data_offset, sizeof(bitmap_data_offset), 1, f);
- tmp_u32 = header_size - 14;
- fwrite(&tmp_u32, sizeof(tmp_u32), 1, f); // sub header size
- tmp_32 = bitmap->x;
- fwrite(&tmp_32, sizeof(tmp_32), 1, f);
- tmp_32 = bitmap->y;
- fwrite(&tmp_32, sizeof(tmp_32), 1, f);
-
- tmp_u16 = 1;
- fwrite(&tmp_u16, sizeof(tmp_u16), 1, f); // color plane
- fwrite(&n_pixel_bits, sizeof(n_pixel_bits), 1, f); // pixel depth
-
- tmp_u32 = 0;
- fwrite(&tmp_u32, sizeof(tmp_u32), 1, f); // compression method
-
- tmp_u32 = 0; //file_size - bitmap_data_offset;
- fwrite(&tmp_u32, sizeof(tmp_u32), 1, f); // image size
- tmp_32 = 0;
- fwrite(&tmp_32, sizeof(tmp_32), 1, f);
- fwrite(&tmp_32, sizeof(tmp_32), 1, f);
- tmp_u32 = (!plt) ? 0 : plt->num_ents; // plt entries
- fwrite(&tmp_u32, sizeof(tmp_u32), 1, f);
- tmp_u32 = 0;
- fwrite(&tmp_u32, sizeof(tmp_u32), 1, f);
-
- if (plt) {
- dump_palette(f, plt);
- }
- /* writing the data */
- for (i = 0; i < bitmap->data->num_chunks; i++) {
- SpiceChunk *chunk = &bitmap->data->chunk[i];
- int num_lines = chunk->len / bitmap->stride;
- for (j = 0; j < num_lines; j++) {
- dump_line(f, chunk->data + (j * bitmap->stride), n_pixel_bits, bitmap->x, row_size);
- }
- }
- fclose(f);
-}
diff --git a/server/spice_bitmap_utils.h b/server/spice_bitmap_utils.h
deleted file mode 100644
index 69860e5a..00000000
--- a/server/spice_bitmap_utils.h
+++ /dev/null
@@ -1,8 +0,0 @@
-#ifndef H_SPICE_BITMAP_UTILS
-#define H_SPICE_BITMAP_UTILS
-
-void dump_bitmap(SpiceBitmap *bitmap);
-
-int spice_bitmap_from_surface_type(uint32_t surface_format);
-
-#endif
diff --git a/server/spice_image_cache.c b/server/spice_image_cache.c
deleted file mode 100644
index 291094c3..00000000
--- a/server/spice_image_cache.c
+++ /dev/null
@@ -1,135 +0,0 @@
-#include "spice_image_cache.h"
-
-static ImageCacheItem *image_cache_find(ImageCache *cache, uint64_t id)
-{
- ImageCacheItem *item = cache->hash_table[id % IMAGE_CACHE_HASH_SIZE];
-
- while (item) {
- if (item->id == id) {
- return item;
- }
- item = item->next;
- }
- return NULL;
-}
-
-int image_cache_hit(ImageCache *cache, uint64_t id)
-{
- ImageCacheItem *item;
- if (!(item = image_cache_find(cache, id))) {
- return FALSE;
- }
-#ifdef IMAGE_CACHE_AGE
- item->age = cache->age;
-#endif
- ring_remove(&item->lru_link);
- ring_add(&cache->lru, &item->lru_link);
- return TRUE;
-}
-
-static void image_cache_remove(ImageCache *cache, ImageCacheItem *item)
-{
- ImageCacheItem **now;
-
- now = &cache->hash_table[item->id % IMAGE_CACHE_HASH_SIZE];
- for (;;) {
- spice_assert(*now);
- if (*now == item) {
- *now = item->next;
- break;
- }
- now = &(*now)->next;
- }
- ring_remove(&item->lru_link);
- pixman_image_unref(item->image);
- free(item);
-#ifndef IMAGE_CACHE_AGE
- cache->num_items--;
-#endif
-}
-
-#define IMAGE_CACHE_MAX_ITEMS 2
-
-static void image_cache_put(SpiceImageCache *spice_cache, uint64_t id, pixman_image_t *image)
-{
- ImageCache *cache = (ImageCache *)spice_cache;
- ImageCacheItem *item;
-
-#ifndef IMAGE_CACHE_AGE
- if (cache->num_items == IMAGE_CACHE_MAX_ITEMS) {
- ImageCacheItem *tail = (ImageCacheItem *)ring_get_tail(&cache->lru);
- spice_assert(tail);
- image_cache_remove(cache, tail);
- }
-#endif
-
- item = spice_new(ImageCacheItem, 1);
- item->id = id;
-#ifdef IMAGE_CACHE_AGE
- item->age = cache->age;
-#else
- cache->num_items++;
-#endif
- item->image = pixman_image_ref(image);
- ring_item_init(&item->lru_link);
-
- item->next = cache->hash_table[item->id % IMAGE_CACHE_HASH_SIZE];
- cache->hash_table[item->id % IMAGE_CACHE_HASH_SIZE] = item;
-
- ring_add(&cache->lru, &item->lru_link);
-}
-
-static pixman_image_t *image_cache_get(SpiceImageCache *spice_cache, uint64_t id)
-{
- ImageCache *cache = (ImageCache *)spice_cache;
-
- ImageCacheItem *item = image_cache_find(cache, id);
- if (!item) {
- spice_error("not found");
- }
- return pixman_image_ref(item->image);
-}
-
-void image_cache_init(ImageCache *cache)
-{
- static SpiceImageCacheOps image_cache_ops = {
- image_cache_put,
- image_cache_get,
- };
-
- cache->base.ops = &image_cache_ops;
- memset(cache->hash_table, 0, sizeof(cache->hash_table));
- ring_init(&cache->lru);
-#ifdef IMAGE_CACHE_AGE
- cache->age = 0;
-#else
- cache->num_items = 0;
-#endif
-}
-
-void image_cache_reset(ImageCache *cache)
-{
- ImageCacheItem *item;
-
- while ((item = (ImageCacheItem *)ring_get_head(&cache->lru))) {
- image_cache_remove(cache, item);
- }
-#ifdef IMAGE_CACHE_AGE
- cache->age = 0;
-#endif
-}
-
-#define IMAGE_CACHE_DEPTH 4
-
-void image_cache_aging(ImageCache *cache)
-{
-#ifdef IMAGE_CACHE_AGE
- ImageCacheItem *item;
-
- cache->age++;
- while ((item = (ImageCacheItem *)ring_get_tail(&cache->lru)) &&
- cache->age - item->age > IMAGE_CACHE_DEPTH) {
- image_cache_remove(cache, item);
- }
-#endif
-}
diff --git a/server/spice_image_cache.h b/server/spice_image_cache.h
deleted file mode 100644
index f11cebc8..00000000
--- a/server/spice_image_cache.h
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef H_SPICE_IMAGE_CACHE
-#define H_SPICE_IMAGE_CACHE
-
-#include <inttypes.h>
-
-#include "common/pixman_utils.h"
-#include "common/canvas_base.h"
-
-#include "common/ring.h"
-
-typedef struct ImageCacheItem {
- RingItem lru_link;
- uint64_t id;
-#ifdef IMAGE_CACHE_AGE
- uint32_t age;
-#endif
- struct ImageCacheItem *next;
- pixman_image_t *image;
-} ImageCacheItem;
-
-#define IMAGE_CACHE_HASH_SIZE 1024
-
-typedef struct ImageCache {
- SpiceImageCache base;
- ImageCacheItem *hash_table[IMAGE_CACHE_HASH_SIZE];
- Ring lru;
-#ifdef IMAGE_CACHE_AGE
- uint32_t age;
-#else
- uint32_t num_items;
-#endif
-} ImageCache;
-
-int image_cache_hit(ImageCache *cache, uint64_t id);
-void image_cache_init(ImageCache *cache);
-void image_cache_reset(ImageCache *cache);
-void image_cache_aging(ImageCache *cache);
-
-#endif
diff --git a/server/spice_server_utils.h b/server/spice_server_utils.h
deleted file mode 100644
index b3ddc27e..00000000
--- a/server/spice_server_utils.h
+++ /dev/null
@@ -1,23 +0,0 @@
-#ifndef H_SPICE_SERVER_UTIL
-#define H_SPICE_SERVER_UTIL
-
-#include <unistd.h>
-
-static inline void set_bit(int index, uint32_t *addr)
-{
- uint32_t mask = 1 << index;
- __sync_or_and_fetch(addr, mask);
-}
-
-static inline void clear_bit(int index, uint32_t *addr)
-{
- uint32_t mask = ~(1 << index);
- __sync_and_and_fetch(addr, mask);
-}
-
-static inline int test_bit(int index, uint32_t val)
-{
- return val & (1u << index);
-}
-
-#endif
diff --git a/server/spice_timer_queue.c b/server/spice_timer_queue.c
deleted file mode 100644
index 71de84a3..00000000
--- a/server/spice_timer_queue.c
+++ /dev/null
@@ -1,268 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
-/*
- Copyright (C) 2013 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#include <config.h>
-#include <pthread.h>
-#include "red_common.h"
-#include "spice_timer_queue.h"
-#include "common/ring.h"
-
-static Ring timer_queue_list;
-static int queue_count = 0;
-static pthread_mutex_t queue_list_lock = PTHREAD_MUTEX_INITIALIZER;
-
-static void spice_timer_queue_init(void)
-{
- ring_init(&timer_queue_list);
-}
-
-struct SpiceTimer {
- RingItem link;
- RingItem active_link;
-
- SpiceTimerFunc func;
- void *opaque;
-
- SpiceTimerQueue *queue;
-
- int is_active;
- uint32_t ms;
- uint64_t expiry_time;
-};
-
-struct SpiceTimerQueue {
- RingItem link;
- pthread_t thread;
- Ring timers;
- Ring active_timers;
-};
-
-static SpiceTimerQueue *spice_timer_queue_find(void)
-{
- pthread_t self = pthread_self();
- RingItem *queue_item;
-
- RING_FOREACH(queue_item, &timer_queue_list) {
- SpiceTimerQueue *queue = SPICE_CONTAINEROF(queue_item, SpiceTimerQueue, link);
-
- if (pthread_equal(self, queue->thread) != 0) {
- return queue;
- }
- }
-
- return NULL;
-}
-
-static SpiceTimerQueue *spice_timer_queue_find_with_lock(void)
-{
- SpiceTimerQueue *queue;
-
- pthread_mutex_lock(&queue_list_lock);
- queue = spice_timer_queue_find();
- pthread_mutex_unlock(&queue_list_lock);
- return queue;
-}
-
-int spice_timer_queue_create(void)
-{
- SpiceTimerQueue *queue;
-
- pthread_mutex_lock(&queue_list_lock);
- if (queue_count == 0) {
- spice_timer_queue_init();
- }
-
- if (spice_timer_queue_find() != NULL) {
- spice_printerr("timer queue was already created for the thread");
- return FALSE;
- }
-
- queue = spice_new0(SpiceTimerQueue, 1);
- queue->thread = pthread_self();
- ring_init(&queue->timers);
- ring_init(&queue->active_timers);
-
- ring_add(&timer_queue_list, &queue->link);
- queue_count++;
-
- pthread_mutex_unlock(&queue_list_lock);
-
- return TRUE;
-}
-
-void spice_timer_queue_destroy(void)
-{
- RingItem *item;
- SpiceTimerQueue *queue;
-
- pthread_mutex_lock(&queue_list_lock);
- queue = spice_timer_queue_find();
-
- spice_assert(queue != NULL);
-
- while ((item = ring_get_head(&queue->timers))) {
- SpiceTimer *timer;
-
- timer = SPICE_CONTAINEROF(item, SpiceTimer, link);
- spice_timer_remove(timer);
- }
-
- ring_remove(&queue->link);
- free(queue);
- queue_count--;
-
- pthread_mutex_unlock(&queue_list_lock);
-}
-
-SpiceTimer *spice_timer_queue_add(SpiceTimerFunc func, void *opaque)
-{
- SpiceTimer *timer = spice_new0(SpiceTimer, 1);
- SpiceTimerQueue *queue = spice_timer_queue_find_with_lock();
-
- spice_assert(queue != NULL);
-
- ring_item_init(&timer->link);
- ring_item_init(&timer->active_link);
-
- timer->opaque = opaque;
- timer->func = func;
- timer->queue = queue;
-
- ring_add(&queue->timers, &timer->link);
-
- return timer;
-}
-
-static void _spice_timer_set(SpiceTimer *timer, uint32_t ms, uint64_t now)
-{
- RingItem *next_item;
- SpiceTimerQueue *queue;
-
- if (timer->is_active) {
- spice_timer_cancel(timer);
- }
-
- queue = timer->queue;
- timer->expiry_time = now + ms;
- timer->ms = ms;
-
- RING_FOREACH(next_item, &queue->active_timers) {
- SpiceTimer *next_timer = SPICE_CONTAINEROF(next_item, SpiceTimer, active_link);
-
- if (timer->expiry_time <= next_timer->expiry_time) {
- break;
- }
- }
-
- if (next_item) {
- ring_add_before(&timer->active_link, next_item);
- } else {
- ring_add_before(&timer->active_link, &queue->active_timers);
- }
- timer->is_active = TRUE;
-}
-
-void spice_timer_set(SpiceTimer *timer, uint32_t ms)
-{
- struct timespec now;
-
- spice_assert(pthread_equal(timer->queue->thread, pthread_self()) != 0);
-
- clock_gettime(CLOCK_MONOTONIC, &now);
- _spice_timer_set(timer, ms,
- (uint64_t)now.tv_sec * 1000 + (now.tv_nsec / 1000 / 1000));
-}
-
-void spice_timer_cancel(SpiceTimer *timer)
-{
- spice_assert(pthread_equal(timer->queue->thread, pthread_self()) != 0);
-
- if (!ring_item_is_linked(&timer->active_link)) {
- spice_assert(!timer->is_active);
- return;
- }
-
- spice_assert(timer->is_active);
- ring_remove(&timer->active_link);
- timer->is_active = FALSE;
-}
-
-void spice_timer_remove(SpiceTimer *timer)
-{
- spice_assert(timer->queue);
- spice_assert(ring_item_is_linked(&timer->link));
- spice_assert(pthread_equal(timer->queue->thread, pthread_self()) != 0);
-
- if (timer->is_active) {
- spice_assert(ring_item_is_linked(&timer->active_link));
- ring_remove(&timer->active_link);
- }
- ring_remove(&timer->link);
- free(timer);
-}
-
-unsigned int spice_timer_queue_get_timeout_ms(void)
-{
- struct timespec now;
- int64_t now_ms;
- RingItem *head;
- SpiceTimer *head_timer;
- SpiceTimerQueue *queue = spice_timer_queue_find_with_lock();
-
- spice_assert(queue != NULL);
-
- if (ring_is_empty(&queue->active_timers)) {
- return -1;
- }
-
- head = ring_get_head(&queue->active_timers);
- head_timer = SPICE_CONTAINEROF(head, SpiceTimer, active_link);
-
- clock_gettime(CLOCK_MONOTONIC, &now);
- now_ms = ((int64_t)now.tv_sec * 1000) - (now.tv_nsec / 1000 / 1000);
-
- return MAX(0, ((int64_t)head_timer->expiry_time - now_ms));
-}
-
-
-void spice_timer_queue_cb(void)
-{
- struct timespec now;
- uint64_t now_ms;
- RingItem *head;
- SpiceTimerQueue *queue = spice_timer_queue_find_with_lock();
-
- spice_assert(queue != NULL);
-
- if (ring_is_empty(&queue->active_timers)) {
- return;
- }
-
- clock_gettime(CLOCK_MONOTONIC, &now);
- now_ms = ((uint64_t)now.tv_sec * 1000) + (now.tv_nsec / 1000 / 1000);
-
- while ((head = ring_get_head(&queue->active_timers))) {
- SpiceTimer *timer = SPICE_CONTAINEROF(head, SpiceTimer, active_link);
-
- if (timer->expiry_time > now_ms) {
- break;
- } else {
- timer->func(timer->opaque);
- spice_timer_cancel(timer);
- }
- }
-}
diff --git a/server/spice_timer_queue.h b/server/spice_timer_queue.h
deleted file mode 100644
index a84f6cd3..00000000
--- a/server/spice_timer_queue.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- Copyright (C) 2013 Red Hat, Inc.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _H_SPICE_TIMER_QUEUE
-#define _H_SPICE_TIMER_QUEUE
-
-#include <stdint.h>
-#include "spice.h"
-
-typedef struct SpiceTimerQueue SpiceTimerQueue;
-
-/* create/destroy a timer queue for the current thread.
- * In order to execute the timers functions, spice_timer_queue_cb should be called
- * periodically, according to spice_timer_queue_get_timeout_ms */
-int spice_timer_queue_create(void);
-void spice_timer_queue_destroy(void);
-
-SpiceTimer *spice_timer_queue_add(SpiceTimerFunc func, void *opaque);
-void spice_timer_set(SpiceTimer *timer, uint32_t ms);
-void spice_timer_cancel(SpiceTimer *timer);
-void spice_timer_remove(SpiceTimer *timer);
-
-/* returns the time left till the earliest timer in the queue expires.
- * returns (unsigned)-1 if there are no active timers */
-unsigned int spice_timer_queue_get_timeout_ms(void);
-/* call the timeout callbacks of all the expired timers */
-void spice_timer_queue_cb(void);
-
-#endif
diff --git a/server/spicevmc.c b/server/spicevmc.c
deleted file mode 100644
index e10f1837..00000000
--- a/server/spicevmc.c
+++ /dev/null
@@ -1,584 +0,0 @@
-/* spice-server spicevmc passthrough channel code
-
- Copyright (C) 2011 Red Hat, Inc.
-
- Red Hat Authors:
- Hans de Goede <hdegoede@redhat.com>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <assert.h>
-#include <errno.h>
-#include <string.h>
-#include <netinet/in.h> // IPPROTO_TCP
-#include <netinet/tcp.h> // TCP_NODELAY
-
-#include "common/generated_server_marshallers.h"
-
-#include "char_device.h"
-#include "red_channel.h"
-#include "reds.h"
-#include "migration_protocol.h"
-
-/* todo: add flow control. i.e.,
- * (a) limit the tokens available for the client
- * (b) limit the tokens available for the server
- */
-/* 64K should be enough for all but the largest writes + 32 bytes hdr */
-#define BUF_SIZE (64 * 1024 + 32)
-
-typedef struct SpiceVmcPipeItem {
- PipeItem base;
- uint32_t refs;
-
- /* writes which don't fit this will get split, this is not a problem */
- uint8_t buf[BUF_SIZE];
- uint32_t buf_used;
-} SpiceVmcPipeItem;
-
-typedef struct SpiceVmcState {
- RedChannel channel; /* Must be the first item */
- RedChannelClient *rcc;
- SpiceCharDeviceState *chardev_st;
- SpiceCharDeviceInstance *chardev_sin;
- SpiceVmcPipeItem *pipe_item;
- SpiceCharDeviceWriteBuffer *recv_from_client_buf;
- uint8_t port_opened;
-} SpiceVmcState;
-
-typedef struct PortInitPipeItem {
- PipeItem base;
- char* name;
- uint8_t opened;
-} PortInitPipeItem;
-
-typedef struct PortEventPipeItem {
- PipeItem base;
- uint8_t event;
-} PortEventPipeItem;
-
-enum {
- PIPE_ITEM_TYPE_SPICEVMC_DATA = PIPE_ITEM_TYPE_CHANNEL_BASE,
- PIPE_ITEM_TYPE_SPICEVMC_MIGRATE_DATA,
- PIPE_ITEM_TYPE_PORT_INIT,
- PIPE_ITEM_TYPE_PORT_EVENT,
-};
-
-static SpiceVmcPipeItem *spicevmc_pipe_item_ref(SpiceVmcPipeItem *item)
-{
- item->refs++;
- return item;
-}
-
-static void spicevmc_pipe_item_unref(SpiceVmcPipeItem *item)
-{
- if (!--item->refs) {
- free(item);
- }
-}
-
-SpiceCharDeviceMsgToClient *spicevmc_chardev_ref_msg_to_client(SpiceCharDeviceMsgToClient *msg,
- void *opaque)
-{
- return spicevmc_pipe_item_ref((SpiceVmcPipeItem *)msg);
-}
-
-static void spicevmc_chardev_unref_msg_to_client(SpiceCharDeviceMsgToClient *msg,
- void *opaque)
-{
- spicevmc_pipe_item_unref((SpiceVmcPipeItem *)msg);
-}
-
-static SpiceCharDeviceMsgToClient *spicevmc_chardev_read_msg_from_dev(SpiceCharDeviceInstance *sin,
- void *opaque)
-{
- SpiceVmcState *state = opaque;
- SpiceCharDeviceInterface *sif;
- SpiceVmcPipeItem *msg_item;
- int n;
-
- sif = SPICE_CONTAINEROF(sin->base.sif, SpiceCharDeviceInterface, base);
-
- if (!state->rcc) {
- return NULL;
- }
-
- if (!state->pipe_item) {
- msg_item = spice_new0(SpiceVmcPipeItem, 1);
- msg_item->refs = 1;
- red_channel_pipe_item_init(&state->channel,
- &msg_item->base, PIPE_ITEM_TYPE_SPICEVMC_DATA);
- } else {
- spice_assert(state->pipe_item->buf_used == 0);
- msg_item = state->pipe_item;
- state->pipe_item = NULL;
- }
-
- n = sif->read(sin, msg_item->buf,
- sizeof(msg_item->buf));
- if (n > 0) {
- spice_debug("read from dev %d", n);
- msg_item->buf_used = n;
- return msg_item;
- } else {
- state->pipe_item = msg_item;
- return NULL;
- }
-}
-
-static void spicevmc_chardev_send_msg_to_client(SpiceCharDeviceMsgToClient *msg,
- RedClient *client,
- void *opaque)
-{
- SpiceVmcState *state = opaque;
- SpiceVmcPipeItem *vmc_msg = msg;
-
- spice_assert(state->rcc->client == client);
- spicevmc_pipe_item_ref(vmc_msg);
- red_channel_client_pipe_add_push(state->rcc, &vmc_msg->base);
-}
-
-static void spicevmc_port_send_init(RedChannelClient *rcc)
-{
- SpiceVmcState *state = SPICE_CONTAINEROF(rcc->channel, SpiceVmcState, channel);
- SpiceCharDeviceInstance *sin = state->chardev_sin;
- PortInitPipeItem *item = spice_malloc(sizeof(PortInitPipeItem));
-
- red_channel_pipe_item_init(rcc->channel, &item->base, PIPE_ITEM_TYPE_PORT_INIT);
- item->name = strdup(sin->portname);
- item->opened = state->port_opened;
- red_channel_client_pipe_add_push(rcc, &item->base);
-}
-
-static void spicevmc_port_send_event(RedChannelClient *rcc, uint8_t event)
-{
- PortEventPipeItem *item = spice_malloc(sizeof(PortEventPipeItem));
-
- red_channel_pipe_item_init(rcc->channel, &item->base, PIPE_ITEM_TYPE_PORT_EVENT);
- item->event = event;
- red_channel_client_pipe_add_push(rcc, &item->base);
-}
-
-static void spicevmc_char_dev_send_tokens_to_client(RedClient *client,
- uint32_t tokens,
- void *opaque)
-{
- spice_printerr("Not implemented!");
-}
-
-static void spicevmc_char_dev_remove_client(RedClient *client, void *opaque)
-{
- SpiceVmcState *state = opaque;
-
- spice_printerr("vmc state %p, client %p", state, client);
- spice_assert(state->rcc && state->rcc->client == client);
-
- red_channel_client_shutdown(state->rcc);
-}
-
-static int spicevmc_red_channel_client_config_socket(RedChannelClient *rcc)
-{
- int delay_val = 1;
- RedsStream *stream = red_channel_client_get_stream(rcc);
-
- if (rcc->channel->type == SPICE_CHANNEL_USBREDIR) {
- if (setsockopt(stream->socket, IPPROTO_TCP, TCP_NODELAY,
- &delay_val, sizeof(delay_val)) != 0) {
- if (errno != ENOTSUP && errno != ENOPROTOOPT) {
- spice_printerr("setsockopt failed, %s", strerror(errno));
- return FALSE;
- }
- }
- }
-
- return TRUE;
-}
-
-static void spicevmc_red_channel_client_on_disconnect(RedChannelClient *rcc)
-{
- SpiceVmcState *state;
- SpiceCharDeviceInstance *sin;
- SpiceCharDeviceInterface *sif;
-
- if (!rcc) {
- return;
- }
-
- state = SPICE_CONTAINEROF(rcc->channel, SpiceVmcState, channel);
- sin = state->chardev_sin;
- sif = SPICE_CONTAINEROF(sin->base.sif, SpiceCharDeviceInterface, base);
-
- if (state->chardev_st) {
- if (spice_char_device_client_exists(state->chardev_st, rcc->client)) {
- spice_char_device_client_remove(state->chardev_st, rcc->client);
- } else {
- spice_printerr("client %p have already been removed from char dev %p",
- rcc->client, state->chardev_st);
- }
- }
-
- /* Don't destroy the rcc if it is already being destroyed, as then
- red_client_destroy/red_channel_client_destroy will already do this! */
- if (!rcc->destroying)
- red_channel_client_destroy(rcc);
-
- state->rcc = NULL;
- if (sif->state) {
- sif->state(sin, 0);
- }
-}
-
-static SpiceVmcState *spicevmc_red_channel_client_get_state(RedChannelClient *rcc)
-{
- return SPICE_CONTAINEROF(rcc->channel, SpiceVmcState, channel);
-}
-
-static int spicevmc_channel_client_handle_migrate_flush_mark(RedChannelClient *rcc)
-{
- red_channel_client_pipe_add_type(rcc, PIPE_ITEM_TYPE_SPICEVMC_MIGRATE_DATA);
- return TRUE;
-}
-
-static int spicevmc_channel_client_handle_migrate_data(RedChannelClient *rcc,
- uint32_t size, void *message)
-{
- SpiceMigrateDataHeader *header;
- SpiceMigrateDataSpiceVmc *mig_data;
- SpiceVmcState *state;
-
- state = spicevmc_red_channel_client_get_state(rcc);
-
- header = (SpiceMigrateDataHeader *)message;
- mig_data = (SpiceMigrateDataSpiceVmc *)(header + 1);
- spice_assert(size >= sizeof(SpiceMigrateDataHeader) + sizeof(SpiceMigrateDataSpiceVmc));
-
- if (!migration_protocol_validate_header(header,
- SPICE_MIGRATE_DATA_SPICEVMC_MAGIC,
- SPICE_MIGRATE_DATA_SPICEVMC_VERSION)) {
- spice_error("bad header");
- return FALSE;
- }
- return spice_char_device_state_restore(state->chardev_st, &mig_data->base);
-}
-
-static int spicevmc_red_channel_client_handle_message(RedChannelClient *rcc,
- uint16_t type,
- uint32_t size,
- uint8_t *msg)
-{
- SpiceVmcState *state;
- SpiceCharDeviceInstance *sin;
- SpiceCharDeviceInterface *sif;
-
- state = spicevmc_red_channel_client_get_state(rcc);
- sin = state->chardev_sin;
- sif = SPICE_CONTAINEROF(sin->base.sif, SpiceCharDeviceInterface, base);
-
- switch (type) {
- case SPICE_MSGC_SPICEVMC_DATA:
- spice_assert(state->recv_from_client_buf->buf == msg);
- state->recv_from_client_buf->buf_used = size;
- spice_char_device_write_buffer_add(state->chardev_st, state->recv_from_client_buf);
- state->recv_from_client_buf = NULL;
- break;
- case SPICE_MSGC_PORT_EVENT:
- if (size != sizeof(uint8_t)) {
- spice_warning("bad port event message size");
- return FALSE;
- }
- if (sif->base.minor_version >= 2 && sif->event != NULL)
- sif->event(sin, *msg);
- break;
- default:
- return red_channel_client_handle_message(rcc, size, type, msg);
- }
-
- return TRUE;
-}
-
-static uint8_t *spicevmc_red_channel_alloc_msg_rcv_buf(RedChannelClient *rcc,
- uint16_t type,
- uint32_t size)
-{
- SpiceVmcState *state;
-
- state = SPICE_CONTAINEROF(rcc->channel, SpiceVmcState, channel);
-
- switch (type) {
- case SPICE_MSGC_SPICEVMC_DATA:
- assert(!state->recv_from_client_buf);
-
- state->recv_from_client_buf = spice_char_device_write_buffer_get(state->chardev_st,
- rcc->client,
- size);
- if (!state->recv_from_client_buf) {
- spice_error("failed to allocate write buffer");
- return NULL;
- }
- return state->recv_from_client_buf->buf;
-
- default:
- return spice_malloc(size);
- }
-
-}
-
-static void spicevmc_red_channel_release_msg_rcv_buf(RedChannelClient *rcc,
- uint16_t type,
- uint32_t size,
- uint8_t *msg)
-{
- SpiceVmcState *state;
-
- state = SPICE_CONTAINEROF(rcc->channel, SpiceVmcState, channel);
-
- switch (type) {
- case SPICE_MSGC_SPICEVMC_DATA:
- if (state->recv_from_client_buf) { /* buffer wasn't pushed to device */
- spice_char_device_write_buffer_release(state->chardev_st, state->recv_from_client_buf);
- state->recv_from_client_buf = NULL;
- }
- break;
- default:
- free(msg);
- }
-}
-
-static void spicevmc_red_channel_hold_pipe_item(RedChannelClient *rcc,
- PipeItem *item)
-{
- /* NOOP */
-}
-
-static void spicevmc_red_channel_send_data(RedChannelClient *rcc,
- SpiceMarshaller *m,
- PipeItem *item)
-{
- SpiceVmcPipeItem *i = SPICE_CONTAINEROF(item, SpiceVmcPipeItem, base);
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_SPICEVMC_DATA, item);
- spice_marshaller_add_ref(m, i->buf, i->buf_used);
-}
-
-static void spicevmc_red_channel_send_migrate_data(RedChannelClient *rcc,
- SpiceMarshaller *m,
- PipeItem *item)
-{
- SpiceVmcState *state;
-
- state = SPICE_CONTAINEROF(rcc->channel, SpiceVmcState, channel);
- red_channel_client_init_send_data(rcc, SPICE_MSG_MIGRATE_DATA, item);
- spice_marshaller_add_uint32(m, SPICE_MIGRATE_DATA_SPICEVMC_MAGIC);
- spice_marshaller_add_uint32(m, SPICE_MIGRATE_DATA_SPICEVMC_VERSION);
-
- spice_char_device_state_migrate_data_marshall(state->chardev_st, m);
-}
-
-static void spicevmc_red_channel_send_port_init(RedChannelClient *rcc,
- SpiceMarshaller *m,
- PipeItem *item)
-{
- PortInitPipeItem *i = SPICE_CONTAINEROF(item, PortInitPipeItem, base);
- SpiceMsgPortInit init;
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_PORT_INIT, item);
- init.name = (uint8_t *)i->name;
- init.name_size = strlen(i->name) + 1;
- init.opened = i->opened;
- spice_marshall_msg_port_init(m, &init);
-}
-
-static void spicevmc_red_channel_send_port_event(RedChannelClient *rcc,
- SpiceMarshaller *m,
- PipeItem *item)
-{
- PortEventPipeItem *i = SPICE_CONTAINEROF(item, PortEventPipeItem, base);
- SpiceMsgPortEvent event;
-
- red_channel_client_init_send_data(rcc, SPICE_MSG_PORT_EVENT, item);
- event.event = i->event;
- spice_marshall_msg_port_event(m, &event);
-}
-
-static void spicevmc_red_channel_send_item(RedChannelClient *rcc,
- PipeItem *item)
-{
- SpiceMarshaller *m = red_channel_client_get_marshaller(rcc);
-
- switch (item->type) {
- case PIPE_ITEM_TYPE_SPICEVMC_DATA:
- spicevmc_red_channel_send_data(rcc, m, item);
- break;
- case PIPE_ITEM_TYPE_SPICEVMC_MIGRATE_DATA:
- spicevmc_red_channel_send_migrate_data(rcc, m, item);
- break;
- case PIPE_ITEM_TYPE_PORT_INIT:
- spicevmc_red_channel_send_port_init(rcc, m, item);
- break;
- case PIPE_ITEM_TYPE_PORT_EVENT:
- spicevmc_red_channel_send_port_event(rcc, m, item);
- break;
- default:
- spice_error("bad pipe item %d", item->type);
- free(item);
- return;
- }
- red_channel_client_begin_send_message(rcc);
-}
-
-static void spicevmc_red_channel_release_pipe_item(RedChannelClient *rcc,
- PipeItem *item, int item_pushed)
-{
- if (item->type == PIPE_ITEM_TYPE_SPICEVMC_DATA) {
- spicevmc_pipe_item_unref((SpiceVmcPipeItem *)item);
- } else {
- free(item);
- }
-}
-
-static void spicevmc_connect(RedChannel *channel, RedClient *client,
- RedsStream *stream, int migration, int num_common_caps,
- uint32_t *common_caps, int num_caps, uint32_t *caps)
-{
- RedChannelClient *rcc;
- SpiceVmcState *state;
- SpiceCharDeviceInstance *sin;
- SpiceCharDeviceInterface *sif;
-
- state = SPICE_CONTAINEROF(channel, SpiceVmcState, channel);
- sin = state->chardev_sin;
- sif = SPICE_CONTAINEROF(sin->base.sif, SpiceCharDeviceInterface, base);
-
- if (state->rcc) {
- spice_printerr("channel client %d:%d (%p) already connected, refusing second connection",
- channel->type, channel->id, state->rcc);
- // TODO: notify client in advance about the in use channel using
- // SPICE_MSG_MAIN_CHANNEL_IN_USE (for example)
- reds_stream_free(stream);
- return;
- }
-
- rcc = red_channel_client_create(sizeof(RedChannelClient), channel, client, stream,
- FALSE,
- num_common_caps, common_caps,
- num_caps, caps);
- if (!rcc) {
- return;
- }
- state->rcc = rcc;
- red_channel_client_ack_zero_messages_window(rcc);
-
- if (strcmp(sin->subtype, "port") == 0) {
- spicevmc_port_send_init(rcc);
- }
-
- if (!spice_char_device_client_add(state->chardev_st, client, FALSE, 0, ~0, ~0,
- red_channel_client_waits_for_migrate_data(rcc))) {
- spice_warning("failed to add client to spicevmc");
- red_channel_client_disconnect(rcc);
- return;
- }
-
- if (sif->state) {
- sif->state(sin, 1);
- }
-}
-
-SpiceCharDeviceState *spicevmc_device_connect(SpiceCharDeviceInstance *sin,
- uint8_t channel_type)
-{
- static uint8_t id[256] = { 0, };
- SpiceVmcState *state;
- ChannelCbs channel_cbs = { NULL, };
- ClientCbs client_cbs = { NULL, };
- SpiceCharDeviceCallbacks char_dev_cbs = {NULL, };
-
- channel_cbs.config_socket = spicevmc_red_channel_client_config_socket;
- channel_cbs.on_disconnect = spicevmc_red_channel_client_on_disconnect;
- channel_cbs.send_item = spicevmc_red_channel_send_item;
- channel_cbs.hold_item = spicevmc_red_channel_hold_pipe_item;
- channel_cbs.release_item = spicevmc_red_channel_release_pipe_item;
- channel_cbs.alloc_recv_buf = spicevmc_red_channel_alloc_msg_rcv_buf;
- channel_cbs.release_recv_buf = spicevmc_red_channel_release_msg_rcv_buf;
- channel_cbs.handle_migrate_flush_mark = spicevmc_channel_client_handle_migrate_flush_mark;
- channel_cbs.handle_migrate_data = spicevmc_channel_client_handle_migrate_data;
-
- state = (SpiceVmcState*)red_channel_create(sizeof(SpiceVmcState),
- core, channel_type, id[channel_type]++,
- FALSE /* handle_acks */,
- spicevmc_red_channel_client_handle_message,
- &channel_cbs,
- SPICE_MIGRATE_NEED_FLUSH | SPICE_MIGRATE_NEED_DATA_TRANSFER);
- red_channel_init_outgoing_messages_window(&state->channel);
-
- client_cbs.connect = spicevmc_connect;
- red_channel_register_client_cbs(&state->channel, &client_cbs);
-
- char_dev_cbs.read_one_msg_from_device = spicevmc_chardev_read_msg_from_dev;
- char_dev_cbs.ref_msg_to_client = spicevmc_chardev_ref_msg_to_client;
- char_dev_cbs.unref_msg_to_client = spicevmc_chardev_unref_msg_to_client;
- char_dev_cbs.send_msg_to_client = spicevmc_chardev_send_msg_to_client;
- char_dev_cbs.send_tokens_to_client = spicevmc_char_dev_send_tokens_to_client;
- char_dev_cbs.remove_client = spicevmc_char_dev_remove_client;
-
- state->chardev_st = spice_char_device_state_create(sin,
- 0, /* tokens interval */
- ~0, /* self tokens */
- &char_dev_cbs,
- state);
- state->chardev_sin = sin;
-
- reds_register_channel(&state->channel);
- return state->chardev_st;
-}
-
-/* Must be called from RedClient handling thread. */
-void spicevmc_device_disconnect(SpiceCharDeviceInstance *sin)
-{
- SpiceVmcState *state;
-
- state = (SpiceVmcState *)spice_char_device_state_opaque_get(sin->st);
-
- if (state->recv_from_client_buf) {
- spice_char_device_write_buffer_release(state->chardev_st, state->recv_from_client_buf);
- }
- spice_char_device_state_destroy(sin->st);
- state->chardev_st = NULL;
-
- reds_unregister_channel(&state->channel);
- free(state->pipe_item);
- red_channel_destroy(&state->channel);
-}
-
-SPICE_GNUC_VISIBLE void spice_server_port_event(SpiceCharDeviceInstance *sin, uint8_t event)
-{
- SpiceVmcState *state;
-
- state = (SpiceVmcState *)spice_char_device_state_opaque_get(sin->st);
- if (event == SPICE_PORT_EVENT_OPENED) {
- state->port_opened = TRUE;
- } else if (event == SPICE_PORT_EVENT_CLOSED) {
- state->port_opened = FALSE;
- }
-
- if (state->rcc == NULL) {
- return;
- }
-
- spicevmc_port_send_event(state->rcc, event);
-}
diff --git a/server/spicevmc.cpp b/server/spicevmc.cpp
new file mode 100644
index 00000000..3dbc3eaf
--- /dev/null
+++ b/server/spicevmc.cpp
@@ -0,0 +1,681 @@
+/* spice-server spicevmc passthrough channel code
+
+ Copyright (C) 2011 Red Hat, Inc.
+
+ Red Hat Authors:
+ Hans de Goede <hdegoede@redhat.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+
+#include <cassert>
+#include <cstring>
+
+#ifdef USE_LZ4
+#include <lz4.h>
+#endif
+
+#include <common/generated_server_marshallers.h>
+
+#include "char-device.h"
+#include "red-channel.h"
+#include "red-channel-client.h"
+#include "reds.h"
+#include "migration-protocol.h"
+
+/* 64K should be enough for all but the largest writes + 32 bytes hdr */
+#define BUF_SIZE (64 * 1024 + 32)
+#define COMPRESS_THRESHOLD 1000
+
+// limit of the queued data, at this limit we stop reading from device to
+// avoid DoS
+#define QUEUED_DATA_LIMIT (1024*1024)
+
+enum {
+ RED_PIPE_ITEM_TYPE_SPICEVMC_DATA = RED_PIPE_ITEM_TYPE_CHANNEL_BASE,
+ RED_PIPE_ITEM_TYPE_SPICEVMC_MIGRATE_DATA,
+ RED_PIPE_ITEM_TYPE_PORT_INIT,
+ RED_PIPE_ITEM_TYPE_PORT_EVENT,
+};
+
+struct RedVmcChannel;
+class VmcChannelClient;
+
+struct RedVmcPipeItem: public RedPipeItemNum<RED_PIPE_ITEM_TYPE_SPICEVMC_DATA> {
+ SpiceDataCompressionType type;
+ uint32_t uncompressed_data_size = 0;
+ /* writes which don't fit this will get split, this is not a problem */
+ uint8_t buf[BUF_SIZE];
+ uint32_t buf_used = 0;
+};
+
+struct RedCharDeviceSpiceVmc: public RedCharDevice
+{
+ RedCharDeviceSpiceVmc(SpiceCharDeviceInstance *sin, RedsState *reds, RedVmcChannel *channel);
+ ~RedCharDeviceSpiceVmc() override;
+
+ RedPipeItemPtr read_one_msg_from_device() override;
+ void remove_client(RedCharDeviceClientOpaque *opaque) override;
+ void on_free_self_token() override;
+ void port_event(uint8_t event) override;
+
+ red::shared_ptr<RedVmcChannel> channel;
+};
+
+static void spicevmc_red_channel_queue_data(RedVmcChannel *channel, red::shared_ptr<RedVmcPipeItem>&& item);
+
+struct RedVmcChannel: public RedChannel
+{
+ RedVmcChannel(RedsState *reds, uint32_t type, uint32_t id);
+ ~RedVmcChannel() override;
+
+ void on_connect(RedClient *client, RedStream *stream, int migration,
+ RedChannelCapabilities *caps) override;
+
+ VmcChannelClient *rcc;
+ RedCharDevice *chardev; /* weak */
+ SpiceCharDeviceInstance *chardev_sin;
+ red::shared_ptr<RedVmcPipeItem> pipe_item;
+ RedCharDeviceWriteBuffer *recv_from_client_buf;
+ uint8_t port_opened;
+ uint32_t queued_data;
+ RedStatCounter in_data;
+ RedStatCounter in_compressed;
+ RedStatCounter in_decompressed;
+ RedStatCounter out_data;
+ RedStatCounter out_compressed;
+ RedStatCounter out_uncompressed;
+};
+
+
+class VmcChannelClient final: public RedChannelClient
+{
+ using RedChannelClient::RedChannelClient;
+public:
+ RedVmcChannel* get_channel()
+ {
+ return static_cast<RedVmcChannel*>(RedChannelClient::get_channel());
+ }
+protected:
+ uint8_t *alloc_recv_buf(uint16_t type, uint32_t size) override;
+ void release_recv_buf(uint16_t type, uint32_t size, uint8_t *msg) override;
+ void on_disconnect() override;
+ bool handle_message(uint16_t type, uint32_t size, void *msg) override;
+ void send_item(RedPipeItem *item) override;
+ bool handle_migrate_data(uint32_t size, void *message) override;
+ void handle_migrate_flush_mark() override;
+};
+
+static VmcChannelClient *
+vmc_channel_client_create(RedChannel *channel, RedClient *client,
+ RedStream *stream,
+ RedChannelCapabilities *caps);
+
+
+RedVmcChannel::RedVmcChannel(RedsState *reds, uint32_t type, uint32_t id):
+ RedChannel(reds, type, id, RedChannel::MigrateAll)
+{
+ init_stat_node(nullptr, "spicevmc");
+ const RedStatNode *stat = get_stat_node();
+ stat_init_counter(&in_data, reds, stat, "in_data", TRUE);
+ stat_init_counter(&in_compressed, reds, stat, "in_compressed", TRUE);
+ stat_init_counter(&in_decompressed, reds, stat, "in_decompressed", TRUE);
+ stat_init_counter(&out_data, reds, stat, "out_data", TRUE);
+ stat_init_counter(&out_compressed, reds, stat, "out_compressed", TRUE);
+ stat_init_counter(&out_uncompressed, reds, stat, "out_uncompressed", TRUE);
+
+#ifdef USE_LZ4
+ set_cap(SPICE_SPICEVMC_CAP_DATA_COMPRESS_LZ4);
+#endif
+
+ reds_register_channel(reds, this);
+}
+
+RedVmcChannel::~RedVmcChannel()
+{
+ RedCharDevice::write_buffer_release(chardev, &recv_from_client_buf);
+}
+
+static red::shared_ptr<RedVmcChannel> red_vmc_channel_new(RedsState *reds, uint8_t channel_type)
+{
+ switch (channel_type) {
+ case SPICE_CHANNEL_USBREDIR:
+ case SPICE_CHANNEL_WEBDAV:
+ case SPICE_CHANNEL_PORT:
+ break;
+ default:
+ g_error("Unsupported channel_type for red_vmc_channel_new(): %u", channel_type);
+ return red::shared_ptr<RedVmcChannel>();
+ }
+
+ int id = reds_get_free_channel_id(reds, channel_type);
+ if (id < 0) {
+ g_warning("Free ID not found creating new VMC channel");
+ return red::shared_ptr<RedVmcChannel>();
+ }
+
+ return red::make_shared<RedVmcChannel>(reds, channel_type, id);
+}
+
+struct RedPortInitPipeItem: public RedPipeItemNum<RED_PIPE_ITEM_TYPE_PORT_INIT> {
+ RedPortInitPipeItem(const char *name, uint8_t opened);
+
+ red::glib_unique_ptr<char> name;
+ uint8_t opened;
+};
+
+struct RedPortEventPipeItem: public RedPipeItemNum<RED_PIPE_ITEM_TYPE_PORT_EVENT> {
+ uint8_t event;
+};
+
+/* msg_item -- the current pipe item with the uncompressed data
+ * This function returns:
+ * - false upon failure.
+ * - true if compression succeeded
+ */
+static bool
+try_compress_lz4(RedVmcChannel *channel, red::shared_ptr<RedVmcPipeItem>& msg_item)
+{
+#ifdef USE_LZ4
+ int compressed_data_count;
+ auto n = msg_item->buf_used;
+
+ if (red_stream_get_family(channel->rcc->get_stream()) == AF_UNIX) {
+ /* AF_LOCAL - data will not be compressed */
+ return false;
+ }
+ if (n <= COMPRESS_THRESHOLD) {
+ /* n <= threshold - data will not be compressed */
+ return false;
+ }
+ if (!channel->rcc->test_remote_cap(SPICE_SPICEVMC_CAP_DATA_COMPRESS_LZ4)) {
+ /* Client doesn't have compression cap - data will not be compressed */
+ return false;
+ }
+ auto msg_item_compressed = red::make_shared<RedVmcPipeItem>();
+ compressed_data_count =
+ LZ4_compress_default(reinterpret_cast<char *>(&msg_item->buf),
+ reinterpret_cast<char *>(&msg_item_compressed->buf), n, BUF_SIZE);
+
+ if (compressed_data_count > 0 && compressed_data_count < n) {
+ stat_inc_counter(channel->out_uncompressed, n);
+ stat_inc_counter(channel->out_compressed, compressed_data_count);
+ msg_item_compressed->type = SPICE_DATA_COMPRESSION_TYPE_LZ4;
+ msg_item_compressed->uncompressed_data_size = n;
+ msg_item_compressed->buf_used = compressed_data_count;
+ msg_item = std::move(msg_item_compressed);
+ return true;
+ }
+
+ /* LZ4 compression failed or did non compress, fallback a non-compressed data is to be sent */
+#endif
+ return false;
+}
+
+RedPipeItemPtr
+RedCharDeviceSpiceVmc::read_one_msg_from_device()
+{
+ red::shared_ptr<RedVmcPipeItem> msg_item;
+ int n;
+
+ if (!channel->rcc || channel->queued_data >= QUEUED_DATA_LIMIT) {
+ return RedPipeItemPtr();
+ }
+
+ if (!channel->pipe_item) {
+ msg_item = red::make_shared<RedVmcPipeItem>();
+ msg_item->type = SPICE_DATA_COMPRESSION_TYPE_NONE;
+ } else {
+ spice_assert(channel->pipe_item->buf_used == 0);
+ msg_item = std::move(channel->pipe_item);
+ }
+
+ n = read(msg_item->buf, sizeof(msg_item->buf));
+ if (n > 0) {
+ spice_debug("read from dev %d", n);
+ msg_item->uncompressed_data_size = n;
+ msg_item->buf_used = n;
+
+ if (!try_compress_lz4(channel.get(), msg_item)) {
+ stat_inc_counter(channel->out_data, n);
+ }
+ spicevmc_red_channel_queue_data(channel.get(), std::move(msg_item));
+ return RedPipeItemPtr();
+ }
+ channel->pipe_item = std::move(msg_item);
+ return RedPipeItemPtr();
+}
+
+RedPortInitPipeItem::RedPortInitPipeItem(const char *init_name, uint8_t init_opened):
+ name(g_strdup(init_name)),
+ opened(init_opened)
+{
+}
+
+static void spicevmc_port_send_init(VmcChannelClient *rcc)
+{
+ RedVmcChannel *channel = rcc->get_channel();
+ SpiceCharDeviceInstance *sin = channel->chardev_sin;
+ auto item = red::make_shared<RedPortInitPipeItem>(sin->portname, channel->port_opened);
+
+ rcc->pipe_add_push(item);
+}
+
+static void spicevmc_port_send_event(RedChannelClient *rcc, uint8_t event)
+{
+ auto item = red::make_shared<RedPortEventPipeItem>();
+
+ item->event = event;
+ rcc->pipe_add_push(item);
+}
+
+void RedCharDeviceSpiceVmc::remove_client(RedCharDeviceClientOpaque *opaque)
+{
+ auto client = reinterpret_cast<RedClient *>(opaque);
+
+ spice_assert(channel->rcc &&
+ channel->rcc->get_client() == client);
+
+ channel->rcc->shutdown();
+}
+
+void VmcChannelClient::on_disconnect()
+{
+ RedVmcChannel *channel;
+ SpiceCharDeviceInterface *sif;
+ RedClient *client = get_client();
+
+ channel = get_channel();
+
+ /* partial message which wasn't pushed to device */
+ RedCharDevice::write_buffer_release(channel->chardev,
+ &channel->recv_from_client_buf);
+
+ if (channel->chardev) {
+ auto opaque_client = reinterpret_cast<RedCharDeviceClientOpaque *>(client);
+ if (channel->chardev->client_exists(opaque_client)) {
+ channel->chardev->client_remove(opaque_client);
+ } else {
+ red_channel_warning(channel,
+ "client %p have already been removed from char dev %p",
+ client, channel->chardev);
+ }
+ }
+
+ channel->rcc = nullptr;
+ sif = spice_char_device_get_interface(channel->chardev_sin);
+ if (sif->state) {
+ sif->state(channel->chardev_sin, 0);
+ }
+}
+
+void VmcChannelClient::handle_migrate_flush_mark()
+{
+ pipe_add_type(RED_PIPE_ITEM_TYPE_SPICEVMC_MIGRATE_DATA);
+}
+
+bool VmcChannelClient::handle_migrate_data(uint32_t size, void *message)
+{
+ SpiceMigrateDataHeader *header;
+ SpiceMigrateDataSpiceVmc *mig_data;
+ RedVmcChannel *channel;
+
+ channel = get_channel();
+
+ header = static_cast<SpiceMigrateDataHeader *>(message);
+ mig_data = reinterpret_cast<SpiceMigrateDataSpiceVmc *>(header + 1);
+ spice_assert(size >= sizeof(SpiceMigrateDataHeader) + sizeof(SpiceMigrateDataSpiceVmc));
+
+ if (!migration_protocol_validate_header(header,
+ SPICE_MIGRATE_DATA_SPICEVMC_MAGIC,
+ SPICE_MIGRATE_DATA_SPICEVMC_VERSION)) {
+ spice_error("bad header");
+ return FALSE;
+ }
+ return channel->chardev->restore(&mig_data->base);
+}
+
+static bool handle_compressed_msg(RedVmcChannel *channel, RedChannelClient *rcc,
+ SpiceMsgCompressedData *compressed_data_msg)
+{
+ /* NOTE: *decompressed is free by the char-device */
+ int decompressed_size;
+ RedCharDeviceWriteBuffer *write_buf;
+
+ write_buf = channel->chardev->write_buffer_get_server(compressed_data_msg->uncompressed_size,
+ false);
+ if (!write_buf) {
+ return FALSE;
+ }
+
+ switch (compressed_data_msg->type) {
+#ifdef USE_LZ4
+ case SPICE_DATA_COMPRESSION_TYPE_LZ4: {
+ uint8_t *decompressed = write_buf->buf;
+ decompressed_size = LZ4_decompress_safe(
+ reinterpret_cast<char *>(compressed_data_msg->compressed_data),
+ reinterpret_cast<char *>(decompressed), compressed_data_msg->compressed_size,
+ compressed_data_msg->uncompressed_size);
+ stat_inc_counter(channel->in_compressed, compressed_data_msg->compressed_size);
+ stat_inc_counter(channel->in_decompressed, decompressed_size);
+ break;
+ }
+#endif
+ default:
+ spice_warning("Invalid Compression Type");
+ RedCharDevice::write_buffer_release(channel->chardev, &write_buf);
+ return FALSE;
+ }
+ if (decompressed_size != compressed_data_msg->uncompressed_size) {
+ spice_warning("Decompression Error");
+ RedCharDevice::write_buffer_release(channel->chardev, &write_buf);
+ return FALSE;
+ }
+ write_buf->buf_used = decompressed_size;
+ channel->chardev->write_buffer_add(write_buf);
+ return TRUE;
+}
+
+bool VmcChannelClient::handle_message(uint16_t type, uint32_t size, void *msg)
+{
+ /* NOTE: *msg free by g_free() (when cb to VmcChannelClient::release_recv_buf
+ * with the compressed msg type) */
+ RedVmcChannel *channel;
+ SpiceCharDeviceInterface *sif;
+
+ channel = get_channel();
+ sif = spice_char_device_get_interface(channel->chardev_sin);
+
+ switch (type) {
+ case SPICE_MSGC_SPICEVMC_DATA:
+ spice_assert(channel->recv_from_client_buf->buf == msg);
+ stat_inc_counter(channel->in_data, size);
+ channel->recv_from_client_buf->buf_used = size;
+ channel->chardev->write_buffer_add(channel->recv_from_client_buf);
+ channel->recv_from_client_buf = nullptr;
+ break;
+ case SPICE_MSGC_SPICEVMC_COMPRESSED_DATA:
+ return handle_compressed_msg(channel, this, static_cast<SpiceMsgCompressedData *>(msg));
+ break;
+ case SPICE_MSGC_PORT_EVENT:
+ if (size != sizeof(uint8_t)) {
+ spice_warning("bad port event message size");
+ return FALSE;
+ }
+ if (sif->base.minor_version >= 2 && sif->event != nullptr)
+ sif->event(channel->chardev_sin, *static_cast<uint8_t *>(msg));
+ break;
+ default:
+ return RedChannelClient::handle_message(type, size, msg);
+ }
+
+ return TRUE;
+}
+
+/* if device manage to send some data attempt to unblock the channel */
+void RedCharDeviceSpiceVmc::on_free_self_token()
+{
+ channel->rcc->unblock_read();
+}
+
+uint8_t *VmcChannelClient::alloc_recv_buf(uint16_t type, uint32_t size)
+{
+
+ switch (type) {
+ case SPICE_MSGC_SPICEVMC_DATA: {
+ RedVmcChannel *channel = get_channel();
+
+ assert(!channel->recv_from_client_buf);
+
+ channel->recv_from_client_buf = channel->chardev->write_buffer_get_server(size,
+ true);
+ if (!channel->recv_from_client_buf) {
+ block_read();
+ return nullptr;
+ }
+ return channel->recv_from_client_buf->buf;
+ }
+
+ default:
+ return static_cast<uint8_t *>(g_malloc(size));
+ }
+
+}
+
+void VmcChannelClient::release_recv_buf(uint16_t type, uint32_t size, uint8_t *msg)
+{
+
+ switch (type) {
+ case SPICE_MSGC_SPICEVMC_DATA: {
+ RedVmcChannel *channel = get_channel();
+ /* buffer wasn't pushed to device */
+ RedCharDevice::write_buffer_release(channel->chardev,
+ &channel->recv_from_client_buf);
+ break;
+ }
+ default:
+ g_free(msg);
+ }
+}
+
+static void
+spicevmc_red_channel_queue_data(RedVmcChannel *channel, red::shared_ptr<RedVmcPipeItem>&& item)
+{
+ channel->queued_data += item->buf_used;
+ channel->rcc->pipe_add_push(item);
+}
+
+static void spicevmc_red_channel_send_data(VmcChannelClient *rcc,
+ SpiceMarshaller *m,
+ RedPipeItem *item)
+{
+ auto i = static_cast<RedVmcPipeItem*>(item);
+ RedVmcChannel *channel = rcc->get_channel();
+
+ /* for compatibility send using not compressed data message */
+ if (i->type == SPICE_DATA_COMPRESSION_TYPE_NONE) {
+ rcc->init_send_data(SPICE_MSG_SPICEVMC_DATA);
+ } else {
+ /* send as compressed */
+ rcc->init_send_data(SPICE_MSG_SPICEVMC_COMPRESSED_DATA);
+ SpiceMsgCompressedData compressed_msg = {
+ .type = i->type,
+ .uncompressed_size = i->uncompressed_data_size
+ };
+ spice_marshall_SpiceMsgCompressedData(m, &compressed_msg);
+ }
+ item->add_to_marshaller(m, i->buf, i->buf_used);
+
+ // account for sent data and wake up device if was blocked
+ uint32_t old_queued_data = channel->queued_data;
+ channel->queued_data -= i->buf_used;
+ if (channel->chardev &&
+ old_queued_data >= QUEUED_DATA_LIMIT && channel->queued_data < QUEUED_DATA_LIMIT) {
+ channel->chardev->wakeup();
+ }
+}
+
+static void spicevmc_red_channel_send_migrate_data(VmcChannelClient *rcc,
+ SpiceMarshaller *m,
+ RedPipeItem *item)
+{
+ RedVmcChannel *channel;
+
+ channel = rcc->get_channel();
+ rcc->init_send_data(SPICE_MSG_MIGRATE_DATA);
+ spice_marshaller_add_uint32(m, SPICE_MIGRATE_DATA_SPICEVMC_MAGIC);
+ spice_marshaller_add_uint32(m, SPICE_MIGRATE_DATA_SPICEVMC_VERSION);
+
+ channel->chardev->migrate_data_marshall(m);
+}
+
+static void spicevmc_red_channel_send_port_init(RedChannelClient *rcc,
+ SpiceMarshaller *m,
+ RedPipeItem *item)
+{
+ auto i = static_cast<RedPortInitPipeItem*>(item);
+ SpiceMsgPortInit init;
+
+ rcc->init_send_data(SPICE_MSG_PORT_INIT);
+ init.name = reinterpret_cast<uint8_t *>(i->name.get());
+ init.name_size = strlen(i->name.get()) + 1;
+ init.opened = i->opened;
+ spice_marshall_msg_port_init(m, &init);
+}
+
+static void spicevmc_red_channel_send_port_event(RedChannelClient *rcc,
+ SpiceMarshaller *m,
+ RedPipeItem *item)
+{
+ auto i = static_cast<RedPortEventPipeItem*>(item);
+ SpiceMsgPortEvent event;
+
+ rcc->init_send_data(SPICE_MSG_PORT_EVENT);
+ event.event = i->event;
+ spice_marshall_msg_port_event(m, &event);
+}
+
+void VmcChannelClient::send_item(RedPipeItem *item)
+{
+ SpiceMarshaller *m = get_marshaller();
+
+ switch (item->type) {
+ case RED_PIPE_ITEM_TYPE_SPICEVMC_DATA:
+ spicevmc_red_channel_send_data(this, m, item);
+ break;
+ case RED_PIPE_ITEM_TYPE_SPICEVMC_MIGRATE_DATA:
+ spicevmc_red_channel_send_migrate_data(this, m, item);
+ break;
+ case RED_PIPE_ITEM_TYPE_PORT_INIT:
+ spicevmc_red_channel_send_port_init(this, m, item);
+ break;
+ case RED_PIPE_ITEM_TYPE_PORT_EVENT:
+ spicevmc_red_channel_send_port_event(this, m, item);
+ break;
+ default:
+ spice_error("bad pipe item %d", item->type);
+ return;
+ }
+ begin_send_message();
+}
+
+
+void RedVmcChannel::on_connect(RedClient *client, RedStream *stream, int migration,
+ RedChannelCapabilities *caps)
+{
+ RedVmcChannel *vmc_channel;
+ SpiceCharDeviceInstance *sin;
+ SpiceCharDeviceInterface *sif;
+
+ vmc_channel = this;
+ sin = vmc_channel->chardev_sin;
+
+ if (rcc) {
+ red_channel_warning(this,
+ "channel client (%p) already connected, refusing second connection",
+ rcc);
+ // TODO: notify client in advance about the in use channel using
+ // SPICE_MSG_MAIN_CHANNEL_IN_USE (for example)
+ red_stream_free(stream);
+ return;
+ }
+
+ rcc = vmc_channel_client_create(this, client, stream, caps);
+ if (!rcc) {
+ return;
+ }
+ vmc_channel->queued_data = 0;
+ rcc->ack_zero_messages_window();
+
+ if (strcmp(sin->subtype, "port") == 0) {
+ spicevmc_port_send_init(rcc);
+ }
+
+ if (!vmc_channel->chardev->client_add(reinterpret_cast<RedCharDeviceClientOpaque *>(client),
+ FALSE, 0, ~0, ~0, rcc->is_waiting_for_migrate_data())) {
+ spice_warning("failed to add client to spicevmc");
+ rcc->disconnect();
+ return;
+ }
+
+ sif = spice_char_device_get_interface(sin);
+ if (sif->state) {
+ sif->state(sin, 1);
+ }
+}
+
+red::shared_ptr<RedCharDevice>
+spicevmc_device_connect(RedsState *reds, SpiceCharDeviceInstance *sin, uint8_t channel_type)
+{
+ auto channel(red_vmc_channel_new(reds, channel_type));
+ if (!channel) {
+ return red::shared_ptr<RedCharDevice>();
+ }
+
+ /* char device takes ownership of channel */
+ auto dev = red::make_shared<RedCharDeviceSpiceVmc>(sin, reds, channel.get());
+
+ channel->chardev_sin = sin;
+
+ return dev;
+}
+
+void RedCharDeviceSpiceVmc::port_event(uint8_t event)
+{
+ if (event == SPICE_PORT_EVENT_OPENED) {
+ channel->port_opened = TRUE;
+ } else if (event == SPICE_PORT_EVENT_CLOSED) {
+ channel->port_opened = FALSE;
+ }
+
+ if (channel->rcc == nullptr) {
+ return;
+ }
+
+ spicevmc_port_send_event(channel->rcc, event);
+}
+
+RedCharDeviceSpiceVmc::RedCharDeviceSpiceVmc(SpiceCharDeviceInstance *sin, RedsState *reds,
+ RedVmcChannel *init_channel):
+ RedCharDevice(reds, sin, 0, 128),
+ channel(init_channel)
+{
+ if (channel) {
+ channel->chardev = this;
+ }
+}
+
+RedCharDeviceSpiceVmc::~RedCharDeviceSpiceVmc()
+{
+ if (channel) {
+ // prevent possible recursive calls
+ channel->chardev = nullptr;
+
+ // close all current connections and drop the reference
+ channel->destroy();
+ }
+}
+
+static VmcChannelClient *
+vmc_channel_client_create(RedChannel *channel, RedClient *client,
+ RedStream *stream,
+ RedChannelCapabilities *caps)
+{
+ auto rcc = red::make_shared<VmcChannelClient>(channel, client, stream, caps);
+ if (!rcc->init()) {
+ return nullptr;
+ }
+ return rcc.get();
+}
diff --git a/server/stat-file.c b/server/stat-file.c
new file mode 100644
index 00000000..38c39338
--- /dev/null
+++ b/server/stat-file.c
@@ -0,0 +1,238 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009-2016 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+
+#ifndef _WIN32
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <pthread.h>
+#include <sys/mman.h>
+#include <spice/stats.h>
+#include <common/log.h>
+
+#include "stat-file.h"
+
+#define STAT_SHM_SIZE(max_nodes) \
+ (sizeof(SpiceStat) + (max_nodes) * sizeof(SpiceStatNode))
+
+struct RedStatFile {
+ char *shm_name;
+ SpiceStat *stat;
+ pthread_mutex_t lock;
+ unsigned int max_nodes;
+};
+
+RedStatFile *stat_file_new(unsigned int max_nodes)
+{
+ int fd;
+ size_t shm_size = STAT_SHM_SIZE(max_nodes);
+ RedStatFile *stat_file = g_new0(RedStatFile, 1);
+
+ stat_file->max_nodes = max_nodes;
+ stat_file->shm_name = g_strdup_printf(SPICE_STAT_SHM_NAME, getpid());
+ shm_unlink(stat_file->shm_name);
+ if ((fd = shm_open(stat_file->shm_name, O_CREAT | O_RDWR, 0444)) == -1) {
+ spice_error("statistics shm_open failed, %s", strerror(errno));
+ goto cleanup;
+ }
+ if (ftruncate(fd, shm_size) == -1) {
+ close(fd);
+ spice_error("statistics ftruncate failed, %s", strerror(errno));
+ goto cleanup;
+ }
+ stat_file->stat = (SpiceStat *)mmap(NULL, shm_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ close(fd);
+ if (stat_file->stat == (SpiceStat *)MAP_FAILED) {
+ spice_error("statistics mmap failed, %s", strerror(errno));
+ goto cleanup;
+ }
+ memset(stat_file->stat, 0, shm_size);
+ stat_file->stat->magic = SPICE_STAT_MAGIC;
+ stat_file->stat->version = SPICE_STAT_VERSION;
+ stat_file->stat->root_index = INVALID_STAT_REF;
+ if (pthread_mutex_init(&stat_file->lock, NULL)) {
+ spice_error("mutex init failed");
+ goto cleanup;
+ }
+ return stat_file;
+
+cleanup:
+ g_free(stat_file);
+ return NULL;
+}
+
+void stat_file_free(RedStatFile *stat_file)
+{
+ if (!stat_file) {
+ return;
+ }
+
+ stat_file_unlink(stat_file);
+ /* TODO other part of the code is not ready for this! */
+#if 0
+ size_t shm_size = STAT_SHM_SIZE(stat_file->max_nodes);
+ munmap(stat_file->stat, shm_size);
+#endif
+
+ pthread_mutex_destroy(&stat_file->lock);
+ g_free(stat_file);
+}
+
+const char *stat_file_get_shm_name(RedStatFile *stat_file)
+{
+ return stat_file->shm_name;
+}
+
+void stat_file_unlink(RedStatFile *stat_file)
+{
+ if (stat_file->shm_name) {
+ shm_unlink(stat_file->shm_name);
+ g_free(stat_file->shm_name);
+ stat_file->shm_name = NULL;
+ }
+}
+
+static void reds_insert_stat_node(RedStatFile *stat_file, StatNodeRef parent, StatNodeRef ref)
+{
+ SpiceStatNode *node = &stat_file->stat->nodes[ref];
+ uint32_t pos = INVALID_STAT_REF;
+ uint32_t node_index;
+ uint32_t *head;
+ SpiceStatNode *n;
+
+ node->first_child_index = INVALID_STAT_REF;
+ head = (parent == INVALID_STAT_REF ? &stat_file->stat->root_index :
+ &stat_file->stat->nodes[parent].first_child_index);
+ node_index = *head;
+ while (node_index != INVALID_STAT_REF && (n = &stat_file->stat->nodes[node_index]) &&
+ strcmp(node->name, n->name) > 0) {
+ pos = node_index;
+ node_index = n->next_sibling_index;
+ }
+ if (pos == INVALID_STAT_REF) {
+ node->next_sibling_index = *head;
+ *head = ref;
+ } else {
+ n = &stat_file->stat->nodes[pos];
+ node->next_sibling_index = n->next_sibling_index;
+ n->next_sibling_index = ref;
+ }
+}
+
+StatNodeRef
+stat_file_add_node(RedStatFile *stat_file, StatNodeRef parent, const char *name, int visible)
+{
+ StatNodeRef ref;
+ SpiceStatNode *node;
+
+ spice_assert(name && strlen(name) > 0);
+ if (strlen(name) >= sizeof(node->name)) {
+ return INVALID_STAT_REF;
+ }
+ pthread_mutex_lock(&stat_file->lock);
+ ref = (parent == INVALID_STAT_REF ? stat_file->stat->root_index :
+ stat_file->stat->nodes[parent].first_child_index);
+ while (ref != INVALID_STAT_REF) {
+ node = &stat_file->stat->nodes[ref];
+ if (strcmp(name, node->name) == 0) {
+ pthread_mutex_unlock(&stat_file->lock);
+ return ref;
+ }
+ ref = node->next_sibling_index;
+ }
+ for (ref = 0; ref < stat_file->max_nodes; ref++) {
+ node = &stat_file->stat->nodes[ref];
+ if (!!(node->flags & SPICE_STAT_NODE_FLAG_ENABLED)) {
+ continue;
+ }
+ stat_file->stat->generation++;
+ stat_file->stat->num_of_nodes++;
+ node->value = 0;
+ node->flags = SPICE_STAT_NODE_FLAG_ENABLED |
+ (visible ? SPICE_STAT_NODE_FLAG_VISIBLE : 0);
+ g_strlcpy(node->name, name, sizeof(node->name));
+ reds_insert_stat_node(stat_file, parent, ref);
+ pthread_mutex_unlock(&stat_file->lock);
+ return ref;
+ }
+ pthread_mutex_unlock(&stat_file->lock);
+ return INVALID_STAT_REF;
+}
+
+uint64_t *
+stat_file_add_counter(RedStatFile *stat_file, StatNodeRef parent, const char *name, int visible)
+{
+ StatNodeRef ref = stat_file_add_node(stat_file, parent, name, visible);
+ SpiceStatNode *node;
+
+ if (ref == INVALID_STAT_REF) {
+ return NULL;
+ }
+ node = &stat_file->stat->nodes[ref];
+ __sync_or_and_fetch(&node->flags, SPICE_STAT_NODE_FLAG_VALUE);
+ return &node->value;
+}
+
+static void stat_file_remove(RedStatFile *stat_file, SpiceStatNode *node)
+{
+ const StatNodeRef node_ref = node - stat_file->stat->nodes;
+ const StatNodeRef node_next = node->next_sibling_index;
+ StatNodeRef ref;
+
+ pthread_mutex_lock(&stat_file->lock);
+ node->flags &= ~SPICE_STAT_NODE_FLAG_ENABLED;
+ stat_file->stat->generation++;
+ stat_file->stat->num_of_nodes--;
+ /* remove links from parent or siblings */
+ /* children will be orphans */
+ if (stat_file->stat->root_index == node_ref) {
+ stat_file->stat->root_index = node_next;
+ } else for (ref = 0; ref < stat_file->max_nodes; ref++) {
+ node = &stat_file->stat->nodes[ref];
+ if (!(node->flags & SPICE_STAT_NODE_FLAG_ENABLED)) {
+ continue;
+ }
+ /* in a tree there is only a link from a parent or
+ * previous sibling so we can exit the loop as
+ * soon as we found on link */
+ if (node->first_child_index == node_ref) {
+ node->first_child_index = node_next;
+ break;
+ }
+ if (node->next_sibling_index == node_ref) {
+ node->next_sibling_index = node_next;
+ break;
+ }
+ }
+ pthread_mutex_unlock(&stat_file->lock);
+}
+
+void stat_file_remove_node(RedStatFile *stat_file, StatNodeRef ref)
+{
+ stat_file_remove(stat_file, &stat_file->stat->nodes[ref]);
+}
+
+void stat_file_remove_counter(RedStatFile *stat_file, uint64_t *counter)
+{
+ stat_file_remove(stat_file, SPICE_CONTAINEROF(counter, SpiceStatNode, value));
+}
+#endif
diff --git a/server/stat-file.h b/server/stat-file.h
new file mode 100644
index 00000000..d6e763fc
--- /dev/null
+++ b/server/stat-file.h
@@ -0,0 +1,45 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2016 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef STAT_FILE_H_
+#define STAT_FILE_H_
+
+#include <stdint.h>
+#include <spice/macros.h>
+
+SPICE_BEGIN_DECLS
+
+typedef uint32_t StatNodeRef;
+#define INVALID_STAT_REF (~(StatNodeRef)0)
+
+typedef struct RedStatFile RedStatFile;
+
+RedStatFile *stat_file_new(unsigned int max_nodes);
+void stat_file_free(RedStatFile *stat_file);
+void stat_file_unlink(RedStatFile *stat_file);
+const char *stat_file_get_shm_name(RedStatFile *stat_file);
+StatNodeRef stat_file_add_node(RedStatFile *stat_file, StatNodeRef parent,
+ const char *name, int visible);
+uint64_t *stat_file_add_counter(RedStatFile *stat_file, StatNodeRef parent,
+ const char *name, int visible);
+void stat_file_remove_node(RedStatFile *stat_file, StatNodeRef ref);
+void stat_file_remove_counter(RedStatFile *stat_file, uint64_t *counter);
+
+SPICE_END_DECLS
+
+#endif /* STAT_FILE_H_ */
diff --git a/server/stat.h b/server/stat.h
index d5c18781..47c6887a 100644
--- a/server/stat.h
+++ b/server/stat.h
@@ -15,33 +15,186 @@
License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef _H_STAT
-#define _H_STAT
+#ifndef STAT_H_
+#define STAT_H_
#include <stdint.h>
+#include <glib.h>
-typedef uint32_t StatNodeRef;
-#define INVALID_STAT_REF (~(StatNodeRef)0)
+#include "spice-wrapped.h"
+#include "stat-file.h"
+SPICE_BEGIN_DECLS
+
+typedef struct {
#ifdef RED_STATISTICS
+ uint64_t *counter;
+#endif
+ uint8_t dummy_empty_field[0]; /* C/C++ compatibility */
+} RedStatCounter;
-StatNodeRef stat_add_node(StatNodeRef parent, const char *name, int visible);
-void stat_remove_node(StatNodeRef node);
-uint64_t *stat_add_counter(StatNodeRef parent, const char *name, int visible);
-void stat_remove_counter(uint64_t *counter);
+typedef struct {
+#ifdef RED_STATISTICS
+ uint32_t ref;
+#endif
+ uint8_t dummy_empty_field[0]; /* C/C++ compatibility */
+} RedStatNode;
-#define stat_inc_counter(counter, value) { \
- if (counter) { \
- *(counter) += (value); \
- } \
-}
+#ifdef RED_STATISTICS
+void stat_init_node(RedStatNode *node, SpiceServer *reds,
+ const RedStatNode *parent, const char *name, int visible);
+void stat_remove_node(SpiceServer *reds, RedStatNode *node);
+void stat_init_counter(RedStatCounter *counter, SpiceServer *reds,
+ const RedStatNode *parent, const char *name, int visible);
+void stat_remove_counter(SpiceServer *reds, RedStatCounter *counter);
#else
-#define stat_add_node(p, n, v) INVALID_STAT_REF
-#define stat_remove_node(n)
-#define stat_add_counter(p, n, v) NULL
-#define stat_remove_counter(c)
-#define stat_inc_counter(c, v)
+
+static inline void
+stat_init_node(RedStatNode *node, SpiceServer *reds,
+ const RedStatNode *parent, const char *name, int visible)
+{
+}
+
+static inline void
+stat_remove_node(SpiceServer *reds, RedStatNode *node)
+{
+}
+
+static inline void
+stat_init_counter(RedStatCounter *counter, SpiceServer *reds,
+ const RedStatNode *parent, const char *name, int visible)
+{
+}
+
+static inline void
+stat_remove_counter(SpiceServer *reds, RedStatCounter *counter)
+{
+}
+#endif /* RED_STATISTICS */
+
+static inline void
+stat_inc_counter(RedStatCounter counter, uint64_t value)
+{
+#ifdef RED_STATISTICS
+ if (counter.counter) {
+ *(counter.counter) += value;
+ }
+#endif
+}
+
+typedef uint64_t stat_time_t;
+
+static inline stat_time_t stat_now(clockid_t clock_id)
+{
+ struct timespec ts;
+
+ clock_gettime(clock_id, &ts);
+ return ts.tv_nsec + (uint64_t) ts.tv_sec * (1000 * 1000 * 1000);
+}
+
+typedef struct {
+#if defined(RED_WORKER_STAT) || defined(COMPRESS_STAT)
+ stat_time_t time;
#endif
+ uint8_t dummy_empty_field[0]; /* C/C++ compatibility */
+} stat_start_time_t;
+#if defined(RED_WORKER_STAT) || defined(COMPRESS_STAT)
+static inline double stat_cpu_time_to_sec(stat_time_t time)
+{
+ return (double)time / (1000 * 1000 * 1000);
+}
#endif
+
+typedef struct {
+#if defined(RED_WORKER_STAT) || defined(COMPRESS_STAT)
+ const char *name;
+ clockid_t clock;
+ uint32_t count;
+ stat_time_t max;
+ stat_time_t min;
+ stat_time_t total;
+#ifdef COMPRESS_STAT
+ uint64_t orig_size;
+ uint64_t comp_size;
+#endif
+#endif
+ uint8_t dummy_empty_field[0]; /* C/C++ compatibility */
+} stat_info_t;
+
+static inline void stat_start_time_init(G_GNUC_UNUSED stat_start_time_t *tm,
+ G_GNUC_UNUSED const stat_info_t *info)
+{
+#if defined(RED_WORKER_STAT) || defined(COMPRESS_STAT)
+ tm->time = stat_now(info->clock);
+#endif
+}
+
+static inline void stat_reset(G_GNUC_UNUSED stat_info_t *info)
+{
+#if defined(RED_WORKER_STAT) || defined(COMPRESS_STAT)
+ info->count = info->max = info->total = 0;
+ info->min = ~(stat_time_t)0;
+#ifdef COMPRESS_STAT
+ info->orig_size = info->comp_size = 0;
+#endif
+#endif
+}
+
+static inline void stat_init(G_GNUC_UNUSED stat_info_t *info,
+ G_GNUC_UNUSED const char *name,
+ G_GNUC_UNUSED clockid_t clock)
+{
+#if defined(RED_WORKER_STAT) || defined(COMPRESS_STAT)
+ info->name = name;
+ info->clock = clock;
+ stat_reset(info);
+#endif
+}
+
+static inline void stat_compress_init(G_GNUC_UNUSED stat_info_t *info,
+ G_GNUC_UNUSED const char *name,
+ G_GNUC_UNUSED clockid_t clock)
+{
+ stat_init(info, name, clock);
+}
+
+static inline void stat_compress_add(G_GNUC_UNUSED stat_info_t *info,
+ G_GNUC_UNUSED stat_start_time_t start,
+ G_GNUC_UNUSED int orig_size,
+ G_GNUC_UNUSED int comp_size)
+{
+#ifdef COMPRESS_STAT
+ stat_time_t time;
+ ++info->count;
+ time = stat_now(info->clock) - start.time;
+ info->total += time;
+ info->max = MAX(info->max, time);
+ info->min = MIN(info->min, time);
+ info->orig_size += orig_size;
+ info->comp_size += comp_size;
+#endif
+}
+
+static inline double stat_byte_to_mega(uint64_t size)
+{
+ return (double)size / (1000 * 1000);
+}
+
+static inline void stat_add(G_GNUC_UNUSED stat_info_t *info,
+ G_GNUC_UNUSED stat_start_time_t start)
+{
+#ifdef RED_WORKER_STAT
+ stat_time_t time;
+ ++info->count;
+ time = stat_now(info->clock) - start.time;
+ info->total += time;
+ info->max = MAX(info->max, time);
+ info->min = MIN(info->min, time);
+#endif
+}
+
+SPICE_END_DECLS
+
+#endif /* STAT_H_ */
diff --git a/server/stream-channel.cpp b/server/stream-channel.cpp
new file mode 100644
index 00000000..184b2604
--- /dev/null
+++ b/server/stream-channel.cpp
@@ -0,0 +1,524 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2017 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+
+#include <common/generated_server_marshallers.h>
+#include <common/recorder.h>
+#include <spice/stream-device.h>
+
+#include "red-channel-client.h"
+#include "stream-channel.h"
+#include "reds.h"
+#include "common-graphics-channel.h"
+#include "display-limits.h"
+#include "video-stream.h" // TODO remove, put common stuff
+
+/* we need to inherit from CommonGraphicsChannelClient
+ * to get buffer handling */
+class StreamChannelClient final: public CommonGraphicsChannelClient
+{
+protected:
+ ~StreamChannelClient() override;
+public:
+ using CommonGraphicsChannelClient::CommonGraphicsChannelClient;
+
+ /* current video stream id, <0 if not initialized or
+ * we are not sending a stream */
+ int stream_id = -1;
+private:
+ StreamChannel* get_channel()
+ {
+ return static_cast<StreamChannel*>(CommonGraphicsChannelClient::get_channel());
+ }
+ /* Array with SPICE_VIDEO_CODEC_TYPE_ENUM_END elements, with the client
+ * preference order (index) as value */
+ GArray *client_preferred_video_codecs;
+ bool handle_preferred_video_codec_type(SpiceMsgcDisplayPreferredVideoCodecType *msg);
+ void marshall_monitors_config(StreamChannel *channel, SpiceMarshaller *m);
+ void fill_base(SpiceMarshaller *m, const StreamChannel *channel);
+ void on_disconnect() override;
+ bool handle_message(uint16_t type, uint32_t size, void *msg) override;
+ void send_item(RedPipeItem *pipe_item) override;
+};
+
+enum {
+ RED_PIPE_ITEM_TYPE_SURFACE_CREATE = RED_PIPE_ITEM_TYPE_COMMON_LAST,
+ RED_PIPE_ITEM_TYPE_SURFACE_DESTROY,
+ RED_PIPE_ITEM_TYPE_FILL_SURFACE,
+ RED_PIPE_ITEM_TYPE_STREAM_CREATE,
+ RED_PIPE_ITEM_TYPE_STREAM_DATA,
+ RED_PIPE_ITEM_TYPE_STREAM_DESTROY,
+ RED_PIPE_ITEM_TYPE_STREAM_ACTIVATE_REPORT,
+ RED_PIPE_ITEM_TYPE_MONITORS_CONFIG,
+};
+
+struct StreamCreateItem: public RedPipeItemNum<RED_PIPE_ITEM_TYPE_STREAM_CREATE> {
+ SpiceMsgDisplayStreamCreate stream_create;
+};
+
+struct StreamDataItem: public RedPipeItemNum<RED_PIPE_ITEM_TYPE_STREAM_DATA> {
+ ~StreamDataItem() override;
+
+ StreamChannel *channel;
+ // NOTE: this must be the last field in the structure
+ SpiceMsgDisplayStreamData data;
+};
+
+#define PRIMARY_SURFACE_ID 0
+
+RECORDER(stream_channel_data, 32, "Stream channel data packet");
+
+StreamChannelClient::~StreamChannelClient()
+{
+ g_clear_pointer(&client_preferred_video_codecs, g_array_unref);
+}
+
+void StreamChannel::request_new_stream(StreamMsgStartStop *start)
+{
+ if (start_cb) {
+ start_cb(start_opaque, start, this);
+ }
+}
+
+void
+StreamChannelClient::on_disconnect()
+{
+ StreamChannel *channel = get_channel();
+
+ // if there are still some client connected keep streaming
+ // TODO, maybe would be worth sending new codecs if they are better
+ if (channel->is_connected()) {
+ return;
+ }
+
+ channel->stream_id = -1;
+ channel->width = 0;
+ channel->height = 0;
+
+ // send stream stop to device
+ StreamMsgStartStop stop = { 0, };
+ get_channel()->request_new_stream(&stop);
+}
+
+static StreamChannelClient*
+stream_channel_client_new(StreamChannel *channel, RedClient *client, RedStream *stream,
+ int mig_target, RedChannelCapabilities *caps)
+{
+ auto rcc =
+ red::make_shared<StreamChannelClient>(channel, client, stream, caps);
+ if (!rcc->init()) {
+ return nullptr;
+ }
+ return rcc.get();
+}
+
+void
+StreamChannelClient::fill_base(SpiceMarshaller *m, const StreamChannel *channel)
+{
+ SpiceMsgDisplayBase base;
+
+ base.surface_id = PRIMARY_SURFACE_ID;
+ base.box = (SpiceRect) { 0, 0, channel->width, channel->height };
+ base.clip = (SpiceClip) { SPICE_CLIP_TYPE_NONE, nullptr };
+
+ spice_marshall_DisplayBase(m, &base);
+}
+
+void
+StreamChannelClient::marshall_monitors_config(StreamChannel *channel, SpiceMarshaller *m)
+{
+ struct {
+ SpiceMsgDisplayMonitorsConfig config;
+ SpiceHead head;
+ } msg = {
+ { 1, 1, },
+ {
+ // monitor ID. These IDs are allocated per channel starting from 0
+ 0,
+ PRIMARY_SURFACE_ID,
+ channel->width, channel->height,
+ 0, 0,
+ 0 // flags
+ }
+ };
+
+ init_send_data(SPICE_MSG_DISPLAY_MONITORS_CONFIG);
+ spice_marshall_msg_display_monitors_config(m, &msg.config);
+}
+
+void StreamChannelClient::send_item(RedPipeItem *pipe_item)
+{
+ SpiceMarshaller *m = get_marshaller();
+ StreamChannel *channel = get_channel();
+
+ switch (pipe_item->type) {
+ case RED_PIPE_ITEM_TYPE_SURFACE_CREATE: {
+ init_send_data(SPICE_MSG_DISPLAY_SURFACE_CREATE);
+ SpiceMsgSurfaceCreate surface_create = {
+ PRIMARY_SURFACE_ID,
+ channel->width, channel->height,
+ SPICE_SURFACE_FMT_32_xRGB, SPICE_SURFACE_FLAGS_PRIMARY
+ };
+
+ // give an hint to client that we are sending just streaming
+ // see spice.proto for capability check here
+ if (test_remote_cap(SPICE_DISPLAY_CAP_MULTI_CODEC)) {
+ surface_create.flags |= SPICE_SURFACE_FLAGS_STREAMING_MODE;
+ }
+
+ spice_marshall_msg_display_surface_create(m, &surface_create);
+ break;
+ }
+ case RED_PIPE_ITEM_TYPE_MONITORS_CONFIG:
+ if (!test_remote_cap(SPICE_DISPLAY_CAP_MONITORS_CONFIG)) {
+ return;
+ }
+ marshall_monitors_config(channel, m);
+ break;
+ case RED_PIPE_ITEM_TYPE_SURFACE_DESTROY: {
+ init_send_data(SPICE_MSG_DISPLAY_SURFACE_DESTROY);
+ SpiceMsgSurfaceDestroy surface_destroy = { PRIMARY_SURFACE_ID };
+ spice_marshall_msg_display_surface_destroy(m, &surface_destroy);
+ break;
+ }
+ case RED_PIPE_ITEM_TYPE_FILL_SURFACE: {
+ init_send_data(SPICE_MSG_DISPLAY_DRAW_FILL);
+
+ fill_base(m, channel);
+
+ SpiceFill fill;
+ fill.brush = (SpiceBrush) { SPICE_BRUSH_TYPE_SOLID, { .color = 0 } };
+ fill.rop_descriptor = SPICE_ROPD_OP_PUT;
+ fill.mask = (SpiceQMask) { 0, { 0, 0 }, nullptr };
+ SpiceMarshaller *brush_pat_out, *mask_bitmap_out;
+ spice_marshall_Fill(m, &fill, &brush_pat_out, &mask_bitmap_out);
+ break;
+ }
+ case RED_PIPE_ITEM_TYPE_STREAM_CREATE: {
+ auto item = static_cast<StreamCreateItem*>(pipe_item);
+ stream_id = item->stream_create.id;
+ init_send_data(SPICE_MSG_DISPLAY_STREAM_CREATE);
+ spice_marshall_msg_display_stream_create(m, &item->stream_create);
+ break;
+ }
+ case RED_PIPE_ITEM_TYPE_STREAM_ACTIVATE_REPORT: {
+ if (stream_id < 0
+ || !test_remote_cap(SPICE_DISPLAY_CAP_STREAM_REPORT)) {
+ return;
+ }
+ SpiceMsgDisplayStreamActivateReport msg;
+ msg.stream_id = stream_id;
+ msg.unique_id = 1; // TODO useful ?
+ msg.max_window_size = RED_STREAM_CLIENT_REPORT_WINDOW;
+ msg.timeout_ms = RED_STREAM_CLIENT_REPORT_TIMEOUT;
+ init_send_data(SPICE_MSG_DISPLAY_STREAM_ACTIVATE_REPORT);
+ spice_marshall_msg_display_stream_activate_report(m, &msg);
+ break;
+ }
+ case RED_PIPE_ITEM_TYPE_STREAM_DATA: {
+ auto item = static_cast<StreamDataItem*>(pipe_item);
+ init_send_data(SPICE_MSG_DISPLAY_STREAM_DATA);
+ spice_marshall_msg_display_stream_data(m, &item->data);
+ pipe_item->add_to_marshaller(m, item->data.data, item->data.data_size);
+ record(stream_channel_data, "Stream data packet size %u mm_time %u",
+ item->data.data_size, item->data.base.multi_media_time);
+ break;
+ }
+ case RED_PIPE_ITEM_TYPE_STREAM_DESTROY: {
+ if (stream_id < 0) {
+ return;
+ }
+ SpiceMsgDisplayStreamDestroy stream_destroy = { stream_id };
+ init_send_data(SPICE_MSG_DISPLAY_STREAM_DESTROY);
+ spice_marshall_msg_display_stream_destroy(m, &stream_destroy);
+ stream_id = -1;
+ break;
+ }
+ default:
+ spice_error("invalid pipe item type");
+ }
+
+ begin_send_message();
+}
+
+bool StreamChannelClient::handle_message(uint16_t type, uint32_t size, void *msg)
+{
+ switch (type) {
+ case SPICE_MSGC_DISPLAY_INIT:
+ case SPICE_MSGC_DISPLAY_PREFERRED_COMPRESSION:
+ return true;
+ case SPICE_MSGC_DISPLAY_STREAM_REPORT:
+ /* TODO these will help tune the streaming reducing/increasing quality */
+ return true;
+ case SPICE_MSGC_DISPLAY_GL_DRAW_DONE:
+ /* client should not send this message */
+ return false;
+ case SPICE_MSGC_DISPLAY_PREFERRED_VIDEO_CODEC_TYPE:
+ return handle_preferred_video_codec_type(
+ static_cast<SpiceMsgcDisplayPreferredVideoCodecType *>(msg));
+ default:
+ return CommonGraphicsChannelClient::handle_message(type, size, msg);
+ }
+}
+
+
+red::shared_ptr<StreamChannel>
+stream_channel_new(RedsState *server, uint32_t id)
+{
+ // TODO this id should be after all qxl devices
+ return red::make_shared<StreamChannel>(server, id);
+}
+
+#define MAX_SUPPORTED_CODECS SPICE_VIDEO_CODEC_TYPE_ENUM_END
+
+// find common codecs supported by all clients
+static uint8_t
+stream_channel_get_supported_codecs(StreamChannel *channel, uint8_t *out_codecs)
+{
+ RedChannelClient *rcc;
+ int codec;
+
+ static const uint16_t codec2cap[] = {
+ 0, // invalid
+ SPICE_DISPLAY_CAP_CODEC_MJPEG,
+ SPICE_DISPLAY_CAP_CODEC_VP8,
+ SPICE_DISPLAY_CAP_CODEC_H264,
+ SPICE_DISPLAY_CAP_CODEC_VP9,
+ SPICE_DISPLAY_CAP_CODEC_H265,
+ };
+
+ std::array<bool, SPICE_N_ELEMENTS(codec2cap)> supported;
+ supported.fill(true);
+
+ FOREACH_CLIENT(channel, rcc) {
+ for (codec = 1; codec < SPICE_N_ELEMENTS(codec2cap); ++codec) {
+ // if do not support codec delete from list
+ if (!rcc->test_remote_cap(codec2cap[codec])) {
+ supported[codec] = false;
+ }
+ }
+ }
+
+ // surely mjpeg is supported
+ supported[SPICE_VIDEO_CODEC_TYPE_MJPEG] = true;
+
+ int num = 0;
+ for (codec = 1; codec < SPICE_N_ELEMENTS(codec2cap); ++codec) {
+ if (supported[codec]) {
+ out_codecs[num++] = codec;
+ }
+ }
+
+ return num;
+}
+
+bool
+StreamChannelClient::handle_preferred_video_codec_type(SpiceMsgcDisplayPreferredVideoCodecType *msg)
+{
+ if (msg->num_of_codecs == 0) {
+ return true;
+ }
+
+ g_clear_pointer(&client_preferred_video_codecs, g_array_unref);
+ client_preferred_video_codecs = video_stream_parse_preferred_codecs(msg);
+
+ return true;
+}
+
+void StreamChannel::on_connect(RedClient *red_client, RedStream *stream,
+ int migration, RedChannelCapabilities *caps)
+{
+ StreamChannelClient *client;
+ struct {
+ StreamMsgStartStop base;
+ uint8_t codecs_buffer[MAX_SUPPORTED_CODECS];
+ } start_msg;
+ static_assert(offsetof(StreamMsgStartStop, codecs) ==
+ offsetof(decltype(start_msg), codecs_buffer),
+ "Wrong assumption");
+ StreamMsgStartStop *const start = &start_msg.base;
+
+ spice_return_if_fail(stream != nullptr);
+
+ client = stream_channel_client_new(this, red_client, stream, migration, caps);
+ if (client == nullptr) {
+ return;
+ }
+
+ // request new stream
+ start->num_codecs = stream_channel_get_supported_codecs(this, start_msg.codecs_buffer);
+ // send in any case, even if list is not changed
+ // notify device about changes
+ request_new_stream(start);
+
+
+ // see guest_set_client_capabilities
+ RedChannelClient *rcc = client;
+ rcc->push_set_ack();
+
+ // TODO what should happen on migration, dcc return if on migration wait ??
+ rcc->ack_zero_messages_window();
+
+ // "emulate" dcc_start
+ rcc->pipe_add_empty_msg(SPICE_MSG_DISPLAY_INVAL_ALL_PALETTES);
+
+ // only if "surface"
+ if (width == 0 || height == 0) {
+ return;
+ }
+
+ // pass proper data
+ rcc->pipe_add_type(RED_PIPE_ITEM_TYPE_SURFACE_CREATE);
+ rcc->pipe_add_type(RED_PIPE_ITEM_TYPE_MONITORS_CONFIG);
+ // surface data
+ rcc->pipe_add_type(RED_PIPE_ITEM_TYPE_FILL_SURFACE);
+ // TODO monitor configs ??
+ rcc->pipe_add_empty_msg(SPICE_MSG_DISPLAY_MARK);
+}
+
+StreamChannel::StreamChannel(RedsState *reds, uint32_t id):
+ RedChannel(reds, SPICE_CHANNEL_DISPLAY, id, RedChannel::HandleAcks)
+{
+ set_cap(SPICE_DISPLAY_CAP_MONITORS_CONFIG);
+ set_cap(SPICE_DISPLAY_CAP_STREAM_REPORT);
+ set_cap(SPICE_DISPLAY_CAP_PREF_VIDEO_CODEC_TYPE);
+
+ reds_register_channel(reds, this);
+}
+
+void
+StreamChannel::change_format(const StreamMsgFormat *fmt)
+{
+ // send destroy old stream
+ pipes_add_type(RED_PIPE_ITEM_TYPE_STREAM_DESTROY);
+
+ // send new create surface if required
+ if (width != fmt->width || height != fmt->height) {
+ if (width != 0 && height != 0) {
+ pipes_add_type(RED_PIPE_ITEM_TYPE_SURFACE_DESTROY);
+ }
+ width = fmt->width;
+ height = fmt->height;
+ pipes_add_type(RED_PIPE_ITEM_TYPE_SURFACE_CREATE);
+ pipes_add_type(RED_PIPE_ITEM_TYPE_MONITORS_CONFIG);
+ // TODO monitors config ??
+ pipes_add_empty_msg(SPICE_MSG_DISPLAY_MARK);
+ }
+
+ // allocate a new stream id
+ stream_id = (stream_id + 1) % NUM_STREAMS;
+
+ // send create stream
+ auto item = red::make_shared<StreamCreateItem>();
+ item->stream_create.id = stream_id;
+ item->stream_create.flags = SPICE_STREAM_FLAGS_TOP_DOWN;
+ item->stream_create.codec_type = fmt->codec;
+ item->stream_create.stream_width = fmt->width;
+ item->stream_create.stream_height = fmt->height;
+ item->stream_create.src_width = fmt->width;
+ item->stream_create.src_height = fmt->height;
+ item->stream_create.dest = (SpiceRect) { 0, 0, fmt->width, fmt->height };
+ item->stream_create.clip = (SpiceClip) { SPICE_CLIP_TYPE_NONE, nullptr };
+ pipes_add(item);
+
+ // activate stream report if possible
+ pipes_add_type(RED_PIPE_ITEM_TYPE_STREAM_ACTIVATE_REPORT);
+}
+
+inline void
+StreamChannel::update_queue_stat(int32_t num_diff, int32_t size_diff)
+{
+ queue_stat.num_items += num_diff;
+ queue_stat.size += size_diff;
+ if (queue_cb) {
+ queue_cb(queue_opaque, &queue_stat, this);
+ }
+}
+
+StreamDataItem::~StreamDataItem()
+{
+ channel->update_queue_stat(-1, -data.data_size);
+}
+
+void
+StreamChannel::send_data(const void *data, size_t size, uint32_t mm_time)
+{
+ if (stream_id < 0) {
+ // this condition can happen if the guest didn't handle
+ // the format stop that we send so think the stream is still
+ // started
+ return;
+ }
+
+ auto item = new (size) StreamDataItem();
+ item->data.base.id = stream_id;
+ item->data.base.multi_media_time = mm_time;
+ item->data.data_size = size;
+ item->channel = this;
+ update_queue_stat(1, size);
+ // TODO try to optimize avoiding the copy
+ memcpy(item->data.data, data, size);
+ pipes_add(red::shared_ptr<StreamDataItem>(item));
+}
+
+void
+StreamChannel::register_start_cb(stream_channel_start_proc cb, void *opaque)
+{
+ start_cb = cb;
+ start_opaque = opaque;
+}
+
+void
+StreamChannel::register_queue_stat_cb(stream_channel_queue_stat_proc cb, void *opaque)
+{
+ queue_cb = cb;
+ queue_opaque = opaque;
+}
+
+void
+StreamChannel::reset()
+{
+ struct {
+ StreamMsgStartStop base;
+ uint8_t codecs_buffer[MAX_SUPPORTED_CODECS];
+ } start_msg;
+ StreamMsgStartStop *const start = &start_msg.base;
+
+ // send destroy old stream
+ pipes_add_type(RED_PIPE_ITEM_TYPE_STREAM_DESTROY);
+
+ // destroy display surface
+ if (width != 0 && height != 0) {
+ pipes_add_type(RED_PIPE_ITEM_TYPE_SURFACE_DESTROY);
+ }
+
+ stream_id = -1;
+ width = 0;
+ height = 0;
+
+ if (!is_connected()) {
+ return;
+ }
+
+ // try to request a new stream, this should start a new stream
+ // if the guest is connected to the device and a client is already connected
+ start->num_codecs = stream_channel_get_supported_codecs(this, start->codecs);
+ // send in any case, even if list is not changed
+ // notify device about changes
+ request_new_stream(start);
+}
diff --git a/server/stream-channel.h b/server/stream-channel.h
new file mode 100644
index 00000000..5ebf374f
--- /dev/null
+++ b/server/stream-channel.h
@@ -0,0 +1,98 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2017 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef STREAM_CHANNEL_H_
+#define STREAM_CHANNEL_H_
+
+#include <spice/stream-device.h>
+
+#include "red-channel.h"
+
+#include "push-visibility.h"
+
+/**
+ * This type it's a RedChannel class which implement display
+ * channel with input only by stream.
+ * A pointer to StreamChannel can be converted to a RedChannel.
+ */
+struct StreamChannel;
+
+/**
+ * Create StreamChannel.
+ */
+red::shared_ptr<StreamChannel> stream_channel_new(RedsState *server, uint32_t id);
+
+struct StreamMsgStartStop;
+
+typedef void (*stream_channel_start_proc)(void *opaque, struct StreamMsgStartStop *start,
+ StreamChannel *channel);
+
+struct StreamQueueStat {
+ uint32_t num_items;
+ uint32_t size;
+};
+
+typedef void (*stream_channel_queue_stat_proc)(void *opaque, const StreamQueueStat *stats,
+ StreamChannel *channel);
+
+struct StreamDataItem;
+class StreamChannelClient;
+struct StreamChannel final: public RedChannel
+{
+ friend struct StreamChannelClient;
+ friend struct StreamDataItem;
+ StreamChannel(RedsState *reds, uint32_t id);
+
+ /**
+ * Reset channel at initial state
+ */
+ void reset();
+
+ void change_format(const struct StreamMsgFormat *fmt);
+ void send_data(const void *data, size_t size, uint32_t mm_time);
+
+ void register_start_cb(stream_channel_start_proc cb, void *opaque);
+ void register_queue_stat_cb(stream_channel_queue_stat_proc cb, void *opaque);
+
+private:
+ void on_connect(RedClient *red_client, RedStream *stream,
+ int migration, RedChannelCapabilities *caps) override;
+
+ inline void update_queue_stat(int32_t num_diff, int32_t size_diff);
+ void request_new_stream(StreamMsgStartStop *start);
+
+ /* current video stream id, <0 if not initialized or
+ * we are not sending a stream */
+ int stream_id = -1;
+ /* size of the current video stream */
+ unsigned width = 0, height = 0;
+
+ StreamQueueStat queue_stat;
+
+ /* callback to notify when a stream should be started or stopped */
+ stream_channel_start_proc start_cb;
+ void *start_opaque;
+
+ /* callback to notify when queue statistics changes */
+ stream_channel_queue_stat_proc queue_cb;
+ void *queue_opaque;
+};
+
+#include "pop-visibility.h"
+
+#endif /* STREAM_CHANNEL_H_ */
diff --git a/client/x11/resource.h b/server/sw-canvas.c
index 562b9b98..89cee67c 100644
--- a/client/x11/resource.h
+++ b/server/sw-canvas.c
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2009 Red Hat, Inc.
+ Copyright (C) 2011 Red Hat, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@@ -14,11 +14,6 @@
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
-
-#ifndef _H_RED_RESOURCES
-#define _H_RED_RESOURCES
-
-#define RED_ICON_RES_ID 3
-#define ALT_IMAGE_RES_ID 4
-
-#endif
+#include <config.h>
+#include <common/sw_canvas.h>
+#include <common/sw_canvas.c>
diff --git a/server/sys-socket.c b/server/sys-socket.c
new file mode 100644
index 00000000..b97335c7
--- /dev/null
+++ b/server/sys-socket.c
@@ -0,0 +1,285 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2018 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdbool.h>
+#include <string.h>
+#include <sys/types.h>
+#ifndef _WIN32
+#include <arpa/inet.h>
+#include <netinet/in.h>
+#include <netinet/ip.h>
+#include <netinet/tcp.h>
+#include <sys/socket.h>
+#endif
+
+#include <common/log.h>
+
+#include "sys-socket.h"
+
+#ifdef _WIN32
+// Map Windows socket errors to standard C ones
+// See https://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx
+void socket_win32_set_errno(void)
+{
+ int err = EPIPE; // default
+ switch (WSAGetLastError()) {
+ case WSAEWOULDBLOCK:
+ case WSAEINPROGRESS:
+ err = EAGAIN;
+ break;
+ case WSAEINTR:
+ err = EINTR;
+ break;
+ case WSAEBADF:
+ err = EBADF;
+ break;
+ case WSA_INVALID_HANDLE:
+ case WSA_INVALID_PARAMETER:
+ case WSAEINVAL:
+ err = EINVAL;
+ break;
+ case WSAENOTSOCK:
+ err = ENOTSOCK;
+ break;
+ case WSA_NOT_ENOUGH_MEMORY:
+ err = ENOMEM;
+ break;
+ case WSAEPROTONOSUPPORT:
+ case WSAESOCKTNOSUPPORT:
+ case WSAEOPNOTSUPP:
+ case WSAEPFNOSUPPORT:
+ case WSAEAFNOSUPPORT:
+ case WSAVERNOTSUPPORTED:
+ err = ENOTSUP;
+ break;
+ case WSAEFAULT:
+ err = EFAULT;
+ break;
+ case WSAEACCES:
+ err = EACCES;
+ break;
+ case WSAEMFILE:
+ err = EMFILE;
+ break;
+ case WSAENAMETOOLONG:
+ err = ENAMETOOLONG;
+ break;
+ case WSAENOTEMPTY:
+ err = ENOTEMPTY;
+ break;
+ case WSA_OPERATION_ABORTED:
+ case WSAECANCELLED:
+ case WSA_E_CANCELLED:
+ err = ECANCELED;
+ break;
+ case WSAEADDRINUSE:
+ err = EADDRINUSE;
+ break;
+ case WSAENETDOWN:
+ err = ENETDOWN;
+ break;
+ case WSAENETUNREACH:
+ err = ENETUNREACH;
+ break;
+ case WSAENETRESET:
+ err = ENETRESET;
+ break;
+ case WSAECONNABORTED:
+ err = ECONNABORTED;
+ break;
+ case WSAECONNRESET:
+ err = ECONNRESET;
+ break;
+ case WSAEISCONN:
+ err = EISCONN;
+ break;
+ case WSAENOTCONN:
+ err = ENOTCONN;
+ break;
+ case WSAETIMEDOUT:
+ err = ETIMEDOUT;
+ break;
+ case WSAECONNREFUSED:
+ err = ECONNREFUSED;
+ break;
+ case WSAEHOSTUNREACH:
+ err = EHOSTUNREACH;
+ break;
+ case WSAEDESTADDRREQ:
+ err = EDESTADDRREQ;
+ break;
+ case WSAEMSGSIZE:
+ err = EMSGSIZE;
+ break;
+ case WSAEPROTOTYPE:
+ err = EPROTOTYPE;
+ break;
+ case WSAENOPROTOOPT:
+ err = ENOPROTOOPT;
+ break;
+ case WSAEADDRNOTAVAIL:
+ err = EADDRNOTAVAIL;
+ break;
+ case WSAENOBUFS:
+ err = ENOBUFS;
+ break;
+ // TODO
+ case WSAESTALE:
+ case WSAEDISCON:
+ case WSA_IO_INCOMPLETE:
+ case WSA_IO_PENDING:
+ case WSAEALREADY:
+ case WSAESHUTDOWN:
+ case WSAETOOMANYREFS:
+ case WSAELOOP:
+ case WSAEHOSTDOWN:
+ case WSAEPROCLIM:
+ case WSAEUSERS:
+ case WSAEDQUOT:
+ case WSAEREMOTE:
+ case WSASYSNOTREADY:
+ case WSANOTINITIALISED:
+ case WSAENOMORE:
+ case WSAEINVALIDPROCTABLE:
+ case WSAEINVALIDPROVIDER:
+ case WSAEPROVIDERFAILEDINIT:
+ case WSASYSCALLFAILURE:
+ case WSASERVICE_NOT_FOUND:
+ case WSATYPE_NOT_FOUND:
+ case WSA_E_NO_MORE:
+ case WSAEREFUSED:
+ case WSAHOST_NOT_FOUND:
+ case WSATRY_AGAIN:
+ case WSANO_RECOVERY:
+ case WSANO_DATA:
+ case WSA_QOS_RECEIVERS:
+ case WSA_QOS_SENDERS:
+ case WSA_QOS_NO_SENDERS:
+ case WSA_QOS_NO_RECEIVERS:
+ case WSA_QOS_REQUEST_CONFIRMED:
+ case WSA_QOS_ADMISSION_FAILURE:
+ case WSA_QOS_POLICY_FAILURE:
+ case WSA_QOS_BAD_STYLE:
+ case WSA_QOS_BAD_OBJECT:
+ case WSA_QOS_TRAFFIC_CTRL_ERROR:
+ case WSA_QOS_GENERIC_ERROR:
+ case WSA_QOS_ESERVICETYPE:
+ case WSA_QOS_EFLOWSPEC:
+ case WSA_QOS_EPROVSPECBUF:
+ case WSA_QOS_EFILTERSTYLE:
+ case WSA_QOS_EFILTERTYPE:
+ case WSA_QOS_EFILTERCOUNT:
+ case WSA_QOS_EOBJLENGTH:
+ case WSA_QOS_EFLOWCOUNT:
+ case WSA_QOS_EUNKOWNPSOBJ:
+ case WSA_QOS_EPOLICYOBJ:
+ case WSA_QOS_EFLOWDESC:
+ case WSA_QOS_EPSFLOWSPEC:
+ case WSA_QOS_EPSFILTERSPEC:
+ case WSA_QOS_ESDMODEOBJ:
+ case WSA_QOS_ESHAPERATEOBJ:
+ case WSA_QOS_RESERVED_PETYPE:
+ break;
+ }
+ errno = err;
+}
+
+SPICE_CONSTRUCTOR_FUNC(socket_win32_init)
+{
+ WSADATA wsaData;
+ WSAStartup(MAKEWORD(2, 2), &wsaData);
+}
+
+int socket_newpair(int type, int protocol, int sv[2])
+{
+ struct sockaddr_in sa, sa2;
+ socklen_t addrlen;
+ SOCKET s, pairs[2];
+
+ if (!sv) {
+ return -1;
+ }
+
+ /* create a listener */
+ s = socket(AF_INET, type, 0);
+ if (s == INVALID_SOCKET) {
+ return -1;
+ }
+
+ pairs[1] = INVALID_SOCKET;
+
+ pairs[0] = socket(AF_INET, type, 0);
+ if (pairs[0] == INVALID_SOCKET) {
+ goto cleanup;
+ }
+
+ /* bind to a random port */
+ sa.sin_family = AF_INET;
+ sa.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+ sa.sin_port = 0;
+ if (bind(s, (struct sockaddr*) &sa, sizeof(sa)) < 0) {
+ goto cleanup;
+ }
+ if (listen(s, 1) < 0) {
+ goto cleanup;
+ }
+
+ /* connect to kernel choosen port */
+ addrlen = sizeof(sa);
+ if (getsockname(s, (struct sockaddr*) &sa, &addrlen) < 0) {
+ goto cleanup;
+ }
+ if (connect(pairs[0], (struct sockaddr*) &sa, sizeof(sa)) < 0) {
+ goto cleanup;
+ }
+ addrlen = sizeof(sa2);
+ pairs[1] = accept(s, (struct sockaddr*) &sa2, &addrlen);
+ if (pairs[1] == INVALID_SOCKET) {
+ goto cleanup;
+ }
+
+ /* check proper connection */
+ addrlen = sizeof(sa);
+ if (getsockname(pairs[0], (struct sockaddr*) &sa, &addrlen) < 0) {
+ goto cleanup;
+ }
+ addrlen = sizeof(sa2);
+ if (getpeername(pairs[1], (struct sockaddr*) &sa2, &addrlen) < 0) {
+ goto cleanup;
+ }
+ if (sa.sin_family != sa2.sin_family || sa.sin_port != sa2.sin_port
+ || sa.sin_addr.s_addr != sa2.sin_addr.s_addr) {
+ goto cleanup;
+ }
+
+ closesocket(s);
+ sv[0] = pairs[0];
+ sv[1] = pairs[1];
+ return 0;
+
+cleanup:
+ socket_win32_set_errno();
+ closesocket(s);
+ closesocket(pairs[0]);
+ closesocket(pairs[1]);
+ return -1;
+}
+#endif
diff --git a/server/sys-socket.h b/server/sys-socket.h
new file mode 100644
index 00000000..f8916a2f
--- /dev/null
+++ b/server/sys-socket.h
@@ -0,0 +1,153 @@
+/*
+ Copyright (C) 2018 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+/* Small compatibility layer for sockets, mostly to make easier portability
+ * for Windows but without loosing performances under Unix, the most supported
+ * system */
+#ifndef RED_SYS_SOCKET_H_
+#define RED_SYS_SOCKET_H_
+
+#ifndef _WIN32
+# include <sys/socket.h>
+
+#define socket_read(sock, buf, len) read(sock, buf, len)
+#define socket_write(sock, buf, len) write(sock, buf, len)
+#define socket_writev(sock, iov, n) writev(sock, iov, n)
+#define socket_close(sock) close(sock)
+
+#else
+# include <winsock2.h>
+# include <windows.h>
+# include <spice/macros.h>
+
+SPICE_BEGIN_DECLS
+
+typedef int socklen_t;
+
+// this definition is ABI compatible with WSABUF
+struct iovec {
+ u_long iov_len;
+ void FAR *iov_base;
+};
+
+void socket_win32_set_errno(void);
+
+static inline ssize_t socket_read(int sock, void *buf, size_t count)
+{
+ ssize_t res = recv(sock, (char *) buf, count, 0);
+ if (res < 0) {
+ socket_win32_set_errno();
+ }
+ return res;
+}
+
+static inline ssize_t socket_write(int sock, const void *buf, size_t count)
+{
+ ssize_t res = send(sock, (const char *) buf, count, 0);
+ if (res < 0) {
+ socket_win32_set_errno();
+ }
+ return res;
+}
+
+static inline ssize_t socket_writev(int sock, const struct iovec *iov, int n_iov)
+{
+ DWORD sent;
+ int res = WSASend(sock, (LPWSABUF) iov, n_iov, &sent, 0, NULL, NULL);
+ if (res) {
+ socket_win32_set_errno();
+ return -1;
+ }
+ return sent;
+}
+
+#define socket_close(sock) closesocket(sock)
+
+#define SHUT_RDWR SD_BOTH
+
+static inline int
+socket_getsockopt(int sock, int lvl, int type, void *value, socklen_t *len)
+{
+ int res = getsockopt(sock, lvl, type, (char *) value, len);
+ if (res < 0) {
+ socket_win32_set_errno();
+ }
+ return res;
+}
+#undef getsockopt
+#define getsockopt socket_getsockopt
+
+static inline int
+socket_setsockopt(int sock, int lvl, int type, const void *value, socklen_t len)
+{
+ int res = setsockopt(sock, lvl, type, (const char*) value, len);
+ if (res < 0) {
+ socket_win32_set_errno();
+ }
+ return res;
+}
+#undef setsockopt
+#define setsockopt socket_setsockopt
+
+static inline int
+socket_listen(int sock, int backlog)
+{
+ int res = listen(sock, backlog);
+ if (res < 0) {
+ socket_win32_set_errno();
+ }
+ return res;
+}
+#undef listen
+#define listen socket_listen
+
+static inline int
+socket_bind(int sock, const struct sockaddr *addr, int addrlen)
+{
+ int res = bind(sock, addr, addrlen);
+ if (res < 0) {
+ socket_win32_set_errno();
+ }
+ return res;
+}
+#undef bind
+#define bind socket_bind
+
+static inline int
+socket_accept(int sock, struct sockaddr *addr, int *addrlen)
+{
+ int res = accept(sock, addr, addrlen);
+ if (res < 0) {
+ socket_win32_set_errno();
+ }
+ return res;
+}
+#undef accept
+#define accept socket_accept
+
+int socket_newpair(int type, int protocol, int sv[2]);
+#define socketpair(family, type, protocol, sv) socket_newpair(type, protocol, sv)
+
+SPICE_END_DECLS
+
+#endif
+
+#if defined(SO_NOSIGPIPE) && defined(__APPLE__)
+#define MSG_NOSIGNAL 0
+#endif
+
+#endif // RED_SYS_SOCKET_H_
diff --git a/server/tests/.gitignore b/server/tests/.gitignore
index b163cda5..56cc7eb9 100644
--- a/server/tests/.gitignore
+++ b/server/tests/.gitignore
@@ -1,7 +1,34 @@
-test_display_no_ssl
-test_display_streaming
-test_empty_success
-test_just_sockets_no_ssl
-test_fail_on_null_core_interface
-test_playback
-test_display_resolution_changes
+spice-server-replay
+libtest.a
+libtest-stat1.a
+libtest-stat2.a
+libtest-stat3.a
+libtest-stat4.a
+test-agent-msg-filter
+test-channel
+test-codecs-parsing
+test-display-no-ssl
+test-display-resolution-changes
+test-display-streaming
+test-display-width-stride
+test-empty-success
+test-fail-on-null-core-interface
+test-listen
+test-loop
+test-options
+test-playback
+test-qxl-parsing
+test-stat
+test-stat-file
+test-stream
+test-stream-device
+test-two-servers
+test-vdagent
+test-gst
+test-leaks
+test-sasl
+test-record
+test-websocket
+test-smartcard
+/test-*.log
+/test-*.trs
diff --git a/server/tests/Makefile.am b/server/tests/Makefile.am
index 233393e9..e9231fc9 100644
--- a/server/tests/Makefile.am
+++ b/server/tests/Makefile.am
@@ -1,101 +1,181 @@
NULL =
+@VALGRIND_CHECK_RULES@
+VALGRIND_SUPPRESSIONS_FILES = $(srcdir)/valgrind/glib.supp $(srcdir)/valgrind/spice.supp
+EXTRA_DIST = \
+ $(VALGRIND_SUPPRESSIONS_FILES) \
+ meson.build \
+ pki/ca-cert.pem \
+ pki/server-cert.pem \
+ pki/server-key.pem \
+ pki/dhparams.pem \
+ $(NULL)
+
AM_CPPFLAGS = \
+ -DSPICE_TOP_SRCDIR=\"$(abs_top_srcdir)\"\
-I$(top_srcdir) \
- -I$(top_srcdir)/common \
-I$(top_srcdir)/server \
+ -I$(top_builddir)/server \
-I$(top_srcdir)/server/tests \
- $(COMMON_CFLAGS) \
+ $(SPICE_COMMON_CFLAGS) \
$(GLIB2_CFLAGS) \
$(SMARTCARD_CFLAGS) \
$(SPICE_NONPKGCONFIG_CFLAGS) \
$(NULL)
-if SUPPORT_AUTOMATED_TESTS
-AM_CPPFLAGS += -DAUTOMATED_TESTS
-endif
-
-LDADD = \
- $(top_builddir)/spice-common/common/libspice-common.la \
- $(top_builddir)/server/libspice-server.la \
- $(GLIB2_LIBS) \
+AM_CFLAGS = \
+ $(WARN_CFLAGS) \
$(NULL)
-COMMON_BASE = \
- basic_event_loop.c \
- basic_event_loop.h \
- test_util.h \
+AM_CXXFLAGS = \
+ $(WARN_CXXFLAGS) \
$(NULL)
-noinst_PROGRAMS = \
- test_display_no_ssl \
- test_display_streaming \
- test_empty_success \
- test_fail_on_null_core_interface \
- test_just_sockets_no_ssl \
- test_playback \
- test_display_resolution_changes \
- test_two_servers \
- test_vdagent \
- test_display_width_stride \
+noinst_LIBRARIES = libtest.a
+
+libtest_a_SOURCES = \
+ basic-event-loop.c \
+ basic-event-loop.h \
+ test-display-base.cpp \
+ test-display-base.h \
+ test-glib-compat.h \
+ win-alarm.c \
+ win-alarm.h \
+ vmc-emu.cpp \
+ vmc-emu.h \
$(NULL)
-test_vdagent_SOURCES = \
- $(COMMON_BASE) \
- test_display_base.c \
- test_display_base.h \
- test_vdagent.c \
+LDADD = \
+ libtest.a \
+ $(SPICE_COMMON_DIR)/common/libspice-common.la \
+ $(top_builddir)/server/libserver.la \
+ $(GLIB2_LIBS) \
+ $(SPICE_NONPKGCONFIG_LIBS) \
$(NULL)
-test_display_streaming_SOURCES = \
- $(COMMON_BASE) \
- test_display_base.c \
- test_display_base.h \
- test_display_streaming.c \
+check_PROGRAMS = \
+ test-codecs-parsing \
+ test-dispatcher \
+ test-options \
+ test-stat \
+ test-agent-msg-filter \
+ test-loop \
+ test-qxl-parsing \
+ test-leaks \
+ test-vdagent \
+ test-fail-on-null-core-interface \
+ test-empty-success \
+ test-channel \
+ test-stream-device \
+ test-listen \
+ test-set-ticket \
+ test-record \
$(NULL)
-test_display_no_ssl_SOURCES = \
- $(COMMON_BASE) \
- test_display_base.c \
- test_display_base.h \
- test_display_no_ssl.c \
+LINK = $(CXXLINK)
+
+if HAVE_SMARTCARD
+check_PROGRAMS += test-smartcard
+test_smartcard_SOURCES = test-smartcard.cpp
+endif
+
+test_channel_SOURCES = test-channel.cpp
+test_stream_device_SOURCES = test-stream-device.cpp
+test_dispatcher_SOURCES = test-dispatcher.cpp
+test_qxl_parsing_SOURCES = test-qxl-parsing.cpp
+
+if !OS_WIN32
+check_PROGRAMS += \
+ test-stream \
+ test-stat-file \
$(NULL)
+endif
-test_display_resolution_changes_SOURCES = \
- $(COMMON_BASE) \
- test_display_base.c \
- test_display_base.h \
- test_display_resolution_changes.c \
+noinst_PROGRAMS = \
+ test-display-no-ssl \
+ test-display-streaming \
+ test-playback \
+ test-display-resolution-changes \
+ test-two-servers \
+ test-display-width-stride \
+ $(check_PROGRAMS) \
$(NULL)
-test_just_sockets_no_ssl_SOURCES = \
- $(COMMON_BASE) \
- test_just_sockets_no_ssl.c \
+if !OS_WIN32
+noinst_PROGRAMS += \
+ test-websocket \
$(NULL)
+endif
-test_playback_SOURCES = \
- $(COMMON_BASE) \
- test_playback.c \
+TESTS = $(check_PROGRAMS) \
$(NULL)
-test_empty_success_SOURCES = \
- test_empty_success.c \
+## spice-server-replay
+
+noinst_PROGRAMS += spice-server-replay
+
+spice_server_replay_SOURCES = replay.c \
+ ../event-loop.c \
+ basic-event-loop.c \
+ basic-event-loop.h
+
+spice_server_replay_LDADD = \
+ $(SPICE_COMMON_DIR)/common/libspice-common.la \
+ $(top_builddir)/server/libspice-server.la \
+ $(GLIB2_LIBS) \
+ $(SPICE_NONPKGCONFIG_LIBS) \
$(NULL)
-test_fail_on_null_core_interface_SOURCES = \
- test_fail_on_null_core_interface.c \
+## test-stat
+
+noinst_LIBRARIES += \
+ libtest-stat1.a \
+ libtest-stat2.a \
+ libtest-stat3.a \
+ libtest-stat4.a \
$(NULL)
-test_two_servers_SOURCES = \
- $(COMMON_BASE) \
- test_display_base.c \
- test_display_base.h \
- test_two_servers.c \
+test_stat_SOURCES = test-stat.c
+test_stat_LDADD = \
+ libtest-stat1.a \
+ libtest-stat2.a \
+ libtest-stat3.a \
+ libtest-stat4.a \
+ $(LDADD) \
$(NULL)
-test_display_width_stride_SOURCES = \
- $(COMMON_BASE) \
- test_display_base.c \
- test_display_base.h \
- test_display_width_stride.c \
+libtest_stat1_a_SOURCES = stat-test.c
+libtest_stat1_a_CPPFLAGS = $(AM_CPPFLAGS) -DTEST_COMPRESS_STAT=0 -DTEST_RED_WORKER_STAT=0 -DTEST_NAME=stat_test1
+
+libtest_stat2_a_SOURCES = stat-test.c
+libtest_stat2_a_CPPFLAGS = $(AM_CPPFLAGS) -DTEST_COMPRESS_STAT=0 -DTEST_RED_WORKER_STAT=1 -DTEST_NAME=stat_test2
+
+libtest_stat3_a_SOURCES = stat-test.c
+libtest_stat3_a_CPPFLAGS = $(AM_CPPFLAGS) -DTEST_COMPRESS_STAT=1 -DTEST_RED_WORKER_STAT=0 -DTEST_NAME=stat_test3
+
+libtest_stat4_a_SOURCES = stat-test.c
+libtest_stat4_a_CPPFLAGS = $(AM_CPPFLAGS) -DTEST_COMPRESS_STAT=1 -DTEST_RED_WORKER_STAT=1 -DTEST_NAME=stat_test4
+
+## test-gst (helper) and test-video-encoders (test)
+
+if HAVE_GSTREAMER
+noinst_PROGRAMS += test-gst
+
+if ENABLE_EXTRA_CHECKS
+TESTS += test-video-encoders
+endif
+
+test_gst_SOURCES = test-gst.cpp \
+ $(NULL)
+test_gst_CPPFLAGS = \
+ $(AM_CPPFLAGS) \
+ $(GSTREAMER_0_10_CFLAGS) \
+ $(GSTREAMER_1_0_CFLAGS) \
$(NULL)
+endif
+
+EXTRA_DIST += test-video-encoders
+
+if HAVE_SASL
+check_PROGRAMS += test-sasl
+endif
diff --git a/server/tests/README b/server/tests/README
index 27248537..bd1de131 100644
--- a/server/tests/README
+++ b/server/tests/README
@@ -1,29 +1,29 @@
What is here
============
-This directory will contain a testsuite for the server including tetris drawing.
+This directory will contain a testsuite for the server.
-Unfortunately tetris and most of the tests are not here right now. You can however run all the tests and use libtool to debug any of them thus:
+You can run all the tests and use libtool to debug any of them:
-libtool --mode=execute gdb test_just_sockets_no_ssl
+libtool --mode=execute gdb test-just-sockets-no-ssl
Overview of tests
=================
-test_just_sockets_no_ssl
+test-just-sockets-no-ssl
A complete server, only provides the main and inputs channels. Doesn't actually produce anything on the channels. Essentially a test of the regular link code (reds.c), good for multiple connect/disconnect tests.
-test_empty_success
+test-empty-success
tests calling
-test_fail_on_null_core_interface
+test-fail-on-null-core-interface
should abort when run (when spice tries to watch_add)
-basic_event_loop.c
- used by test_just_sockets_no_ssl, can be used by other tests. very crude event loop. Should probably use libevent for better tests, but this is self contained.
+basic-event-loop.c
+ event loop to provide core interface.
Automated tests
===============
-test_display_streaming.c
- this test can be used to check regressions. For this, Spice needs to be compiled with --enable-automated-tests and test_display_streaming needs to be called passing --automated-tests as parameter
+test-display-streaming.c
+ this test can be used to check regressions. For this, test-display-streaming needs to be called passing --automated-tests as parameter
diff --git a/server/tests/autobahn-check-report b/server/tests/autobahn-check-report
new file mode 100755
index 00000000..9e29128c
--- /dev/null
+++ b/server/tests/autobahn-check-report
@@ -0,0 +1,18 @@
+#!/usr/bin/env python
+import sys
+import json
+
+num_tests = 0
+for server in json.load(open(sys.argv[1])).values():
+ for test, result in server.items():
+ is_test = 0
+ for k, v in result.items():
+ if k[:8].lower() != 'behavior':
+ continue
+ is_test = 1
+ if v != 'OK' and v != 'INFORMATIONAL':
+ raise Exception('Invalid %s %s for test %s' % (k, v, test))
+ num_tests += is_test
+if num_tests < 100:
+ raise Exception('Too few tests done %s' % num_tests)
+print('Output report is fine')
diff --git a/server/tests/basic-event-loop.c b/server/tests/basic-event-loop.c
new file mode 100644
index 00000000..6430fccd
--- /dev/null
+++ b/server/tests/basic-event-loop.c
@@ -0,0 +1,126 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <sys/time.h>
+#include <signal.h>
+#include <string.h>
+
+#include "red-common.h"
+#include "spice/macros.h"
+#include "basic-event-loop.h"
+
+int debug = 0;
+
+#define DPRINTF(x, format, ...) { \
+ if (x <= debug) { \
+ printf("%s: " format "\n" , __FUNCTION__, ## __VA_ARGS__); \
+ } \
+}
+
+static SpiceCoreInterfaceInternal base_core_interface;
+static GMainContext *main_context = NULL;
+static GMainLoop *loop = NULL;
+
+GMainContext *basic_event_loop_get_context(void)
+{
+ return main_context;
+}
+
+static void event_loop_channel_event(int event, SpiceChannelEventInfo *info)
+{
+ DPRINTF(1, "channel event con, type, id, event: %d, %d, %d, %d",
+ info->connection_id, info->type, info->id, event);
+}
+
+void basic_event_loop_mainloop(void)
+{
+ loop = g_main_loop_new(main_context, FALSE);
+
+ g_main_loop_run(loop);
+ g_main_loop_unref(loop);
+ loop = NULL;
+}
+
+void basic_event_loop_quit(void)
+{
+ if (loop) {
+ g_main_loop_quit(loop);
+ }
+}
+
+static void ignore_sigpipe(void)
+{
+#ifndef _WIN32
+ struct sigaction act;
+
+ memset(&act, 0, sizeof(act));
+ sigfillset(&act.sa_mask);
+ act.sa_handler = SIG_IGN;
+ sigaction(SIGPIPE, &act, NULL);
+#endif
+}
+
+static SpiceTimer* base_timer_add(SpiceTimerFunc func, void *opaque)
+{
+ return base_core_interface.timer_add(&base_core_interface, func, opaque);
+}
+
+static SpiceWatch *base_watch_add(int fd, int event_mask, SpiceWatchFunc func, void *opaque)
+{
+ return base_core_interface.watch_add(&base_core_interface, fd, event_mask, func, opaque);
+}
+
+static SpiceCoreInterface core = {
+ .base = {
+ .type = NULL,
+ .description = NULL,
+ .major_version = SPICE_INTERFACE_CORE_MAJOR,
+ .minor_version = SPICE_INTERFACE_CORE_MINOR,
+ },
+ .timer_add = base_timer_add,
+ .timer_start = red_timer_start,
+ .timer_cancel = red_timer_cancel,
+ .timer_remove = red_timer_remove,
+ .watch_add = base_watch_add,
+ .watch_update_mask = red_watch_update_mask,
+ .watch_remove = red_watch_remove,
+ .channel_event = event_loop_channel_event,
+};
+
+SpiceCoreInterface *basic_event_loop_init(void)
+{
+ ignore_sigpipe();
+ spice_assert(main_context == NULL);
+ /* Qemu can use a context which is not the default one so to make
+ * sure we can handle this condition here we emulate it so don't
+ * use g_main_context_default */
+ main_context = g_main_context_new();
+ base_core_interface = event_loop_core;
+ base_core_interface.main_context = main_context;
+
+ return &core;
+}
+
+void basic_event_loop_destroy(void)
+{
+ spice_assert(main_context != NULL);
+ g_main_context_unref(main_context);
+ main_context = NULL;
+}
diff --git a/client/zlib_decoder.h b/server/tests/basic-event-loop.h
index c91ed494..7ca9f8f6 100644
--- a/client/zlib_decoder.h
+++ b/server/tests/basic-event-loop.h
@@ -1,6 +1,6 @@
/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
/*
- Copyright (C) 2010 Red Hat, Inc.
+ Copyright (C) 2009-2015 Red Hat, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@@ -15,29 +15,20 @@
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
+#ifndef __BASIC_EVENT_LOOP_H__
+#define __BASIC_EVENT_LOOP_H__
-#ifndef _H_ZLIB_DECODER
-#define _H_ZLIB_DECODER
+#include <spice.h>
+#include <glib.h>
-#include "common.h"
-#include "red_canvas_base.h"
+SPICE_BEGIN_DECLS
-#ifndef __GNUC__
-#define ZLIB_WINAPI
-#endif
-#include <zlib.h>
+GMainContext *basic_event_loop_get_context(void);
+SpiceCoreInterface *basic_event_loop_init(void);
+void basic_event_loop_destroy(void);
+void basic_event_loop_mainloop(void);
+void basic_event_loop_quit(void);
+SPICE_END_DECLS
-class ZlibDecoder : public SpiceZlibDecoder {
-public:
- ZlibDecoder();
- ~ZlibDecoder();
-
- void decode(uint8_t *data, int data_size, uint8_t *dest, int dest_size);
-
-private:
- z_stream _z_strm;
-
-};
-
-#endif
+#endif // __BASIC_EVENT_LOOP_H__
diff --git a/server/tests/basic_event_loop.c b/server/tests/basic_event_loop.c
deleted file mode 100644
index 79a45237..00000000
--- a/server/tests/basic_event_loop.c
+++ /dev/null
@@ -1,284 +0,0 @@
-#include <config.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <sys/time.h>
-#include <signal.h>
-#include <string.h>
-
-#include "spice/macros.h"
-#include "common/ring.h"
-#include "test_util.h"
-#include "basic_event_loop.h"
-
-int debug = 0;
-
-#define DPRINTF(x, format, ...) { \
- if (x <= debug) { \
- printf("%s: " format "\n" , __FUNCTION__, ## __VA_ARGS__); \
- } \
-}
-
-#define NOT_IMPLEMENTED printf("%s not implemented\n", __func__);
-
-static SpiceCoreInterface core;
-
-typedef struct SpiceTimer {
- RingItem link;
- SpiceTimerFunc func;
- struct timeval tv_start;
- int ms;
- void *opaque;
-} Timer;
-
-Ring timers;
-
-static SpiceTimer* timer_add(SpiceTimerFunc func, void *opaque)
-{
- SpiceTimer *timer = calloc(sizeof(SpiceTimer), 1);
-
- timer->func = func;
- timer->opaque = opaque;
- ring_add(&timers, &timer->link);
- return timer;
-}
-
-static void add_ms_to_timeval(struct timeval *tv, int ms)
-{
- tv->tv_usec += 1000 * ms;
- while (tv->tv_usec >= 1000000) {
- tv->tv_sec++;
- tv->tv_usec -= 1000000;
- }
-}
-
-static void timer_start(SpiceTimer *timer, uint32_t ms)
-{
- ASSERT(ms);
- gettimeofday(&timer->tv_start, NULL);
- timer->ms = ms;
- // already add ms to timer value
- add_ms_to_timeval(&timer->tv_start, ms);
-}
-
-static void timer_cancel(SpiceTimer *timer)
-{
- timer->ms = 0;
-}
-
-static void timer_remove(SpiceTimer *timer)
-{
- ring_remove(&timer->link);
-}
-
-struct SpiceWatch {
- RingItem link;
- int fd;
- int event_mask;
- SpiceWatchFunc func;
- int removed;
- void *opaque;
-};
-
-Ring watches;
-
-int watch_count = 0;
-
-static SpiceWatch *watch_add(int fd, int event_mask, SpiceWatchFunc func, void *opaque)
-{
- SpiceWatch *watch = malloc(sizeof(SpiceWatch));
-
- DPRINTF(0, "adding %p, fd=%d at %d", watch,
- fd, watch_count);
- watch->fd = fd;
- watch->event_mask = event_mask;
- watch->func = func;
- watch->opaque = opaque;
- watch->removed = FALSE;
- ring_item_init(&watch->link);
- ring_add(&watches, &watch->link);
- watch_count++;
- return watch;
-}
-
-static void watch_update_mask(SpiceWatch *watch, int event_mask)
-{
- DPRINTF(0, "fd %d to %d", watch->fd, event_mask);
- watch->event_mask = event_mask;
-}
-
-static void watch_remove(SpiceWatch *watch)
-{
- DPRINTF(0, "remove %p (fd %d)", watch, watch->fd);
- watch_count--;
- watch->removed = TRUE;
-}
-
-static void channel_event(int event, SpiceChannelEventInfo *info)
-{
- DPRINTF(0, "channel event con, type, id, event: %d, %d, %d, %d",
- info->connection_id, info->type, info->id, event);
-}
-
-SpiceTimer *get_next_timer(void)
-{
- SpiceTimer *next, *min;
-
- if (ring_is_empty(&timers)) {
- return NULL;
- }
- min = next = (SpiceTimer*)ring_get_head(&timers);
- while ((next=(SpiceTimer*)ring_next(&timers, &next->link)) != NULL) {
- if (next->ms &&
- (next->tv_start.tv_sec < min->tv_start.tv_sec ||
- (next->tv_start.tv_sec == min->tv_start.tv_sec &&
- next->tv_start.tv_usec < min->tv_start.tv_usec))) {
- min = next;
- }
- }
- return min;
-}
-
-struct timeval now;
-
-void tv_b_minus_a_return_le_zero(struct timeval *a, struct timeval *b, struct timeval *dest)
-{
- dest->tv_usec = b->tv_usec - a->tv_usec;
- dest->tv_sec = b->tv_sec - a->tv_sec;
- while (dest->tv_usec < 0) {
- dest->tv_usec += 1000000;
- dest->tv_sec--;
- }
- if (dest->tv_sec < 0) {
- dest->tv_sec = 0;
- dest->tv_usec = 0;
- }
-}
-
-void calc_next_timeout(SpiceTimer *next, struct timeval *timeout)
-{
- gettimeofday(&now, NULL);
- tv_b_minus_a_return_le_zero(&now, &next->tv_start, timeout);
-}
-
-void timeout_timers(void)
-{
- SpiceTimer *next;
- struct timeval left;
- int count = 0;
-
- next = (SpiceTimer*)ring_get_head(&timers);
- while (next != NULL) {
- tv_b_minus_a_return_le_zero(&now, &next->tv_start, &left);
- if (next->ms && left.tv_usec == 0 && left.tv_sec == 0) {
- count++;
- DPRINTF(2, "calling timer");
- next->ms = 0;
- next->func(next->opaque);
- }
- next = (SpiceTimer*)ring_next(&timers, &next->link);
- }
- DPRINTF(2, "called %d timers", count);
-}
-
-void basic_event_loop_mainloop(void)
-{
- fd_set rfds, wfds;
- int max_fd = -1;
- int i;
- int retval;
- SpiceWatch *watch;
- SpiceTimer *next_timer;
- RingItem *link;
- RingItem *next;
- struct timeval next_timer_timeout;
- struct timeval *timeout;
-
- while (1) {
- FD_ZERO(&rfds);
- FD_ZERO(&wfds);
- i = 0;
- RING_FOREACH_SAFE(link, next, &watches) {
- watch = (SpiceWatch*)link;
- if (watch->removed) {
- continue;
- }
- if (watch->event_mask & SPICE_WATCH_EVENT_READ) {
- FD_SET(watch->fd, &rfds);
- max_fd = watch->fd > max_fd ? watch->fd : max_fd;
- }
- if (watch->event_mask & SPICE_WATCH_EVENT_WRITE) {
- FD_SET(watch->fd, &wfds);
- max_fd = watch->fd > max_fd ? watch->fd : max_fd;
- }
- i++;
- }
- if ((next_timer = get_next_timer()) != NULL) {
- calc_next_timeout(next_timer, &next_timer_timeout);
- timeout = &next_timer_timeout;
- DPRINTF(2, "timeout of %zd.%06zd",
- timeout->tv_sec, timeout->tv_usec);
- } else {
- timeout = NULL;
- }
- DPRINTF(1, "watching %d fds", i);
- retval = select(max_fd + 1, &rfds, &wfds, NULL, timeout);
- if (timeout != NULL) {
- calc_next_timeout(next_timer, &next_timer_timeout);
- if (next_timer_timeout.tv_sec == 0 &&
- next_timer_timeout.tv_usec == 0) {
- timeout_timers();
- }
- }
- if (retval == -1) {
- printf("error in select - exiting\n");
- abort();
- }
- if (retval) {
- RING_FOREACH_SAFE(link, next, &watches) {
- watch = SPICE_CONTAINEROF(link, SpiceWatch, link);
- if (!watch->removed && (watch->event_mask & SPICE_WATCH_EVENT_READ)
- && FD_ISSET(watch->fd, &rfds)) {
- watch->func(watch->fd, SPICE_WATCH_EVENT_READ, watch->opaque);
- }
- if (!watch->removed && (watch->event_mask & SPICE_WATCH_EVENT_WRITE)
- && FD_ISSET(watch->fd, &wfds)) {
- watch->func(watch->fd, SPICE_WATCH_EVENT_WRITE, watch->opaque);
- }
- if (watch->removed) {
- printf("freeing watch %p\n", watch);
- ring_remove(&watch->link);
- free(watch);
- }
- }
- }
- }
-}
-
-static void ignore_sigpipe(void)
-{
- struct sigaction act;
-
- memset(&act, 0, sizeof(act));
- sigfillset(&act.sa_mask);
- act.sa_handler = SIG_IGN;
- sigaction(SIGPIPE, &act, NULL);
-}
-
-SpiceCoreInterface *basic_event_loop_init(void)
-{
- ring_init(&watches);
- ring_init(&timers);
- memset(&core, 0, sizeof(core));
- core.base.major_version = SPICE_INTERFACE_CORE_MAJOR;
- core.base.minor_version = SPICE_INTERFACE_CORE_MINOR; // anything less then 3 and channel_event isn't called
- core.timer_add = timer_add;
- core.timer_start = timer_start;
- core.timer_cancel = timer_cancel;
- core.timer_remove = timer_remove;
- core.watch_add = watch_add;
- core.watch_update_mask = watch_update_mask;
- core.watch_remove = watch_remove;
- core.channel_event = channel_event;
- ignore_sigpipe();
- return &core;
-}
diff --git a/server/tests/basic_event_loop.h b/server/tests/basic_event_loop.h
deleted file mode 100644
index 5f6ebe71..00000000
--- a/server/tests/basic_event_loop.h
+++ /dev/null
@@ -1,9 +0,0 @@
-#ifndef __BASIC_EVENT_LOOP_H__
-#define __BASIC_EVENT_LOOP_H__
-
-#include <spice.h>
-
-SpiceCoreInterface *basic_event_loop_init(void);
-void basic_event_loop_mainloop(void);
-
-#endif // __BASIC_EVENT_LOOP_H__
diff --git a/server/tests/fuzzingclient.json b/server/tests/fuzzingclient.json
new file mode 100644
index 00000000..8bc1b718
--- /dev/null
+++ b/server/tests/fuzzingclient.json
@@ -0,0 +1,11 @@
+{
+ "outdir": "./reports/servers",
+ "servers": [
+ {
+ "url": "ws://127.0.0.1:7777"
+ }
+ ],
+ "cases": ["*"],
+ "exclude-cases": ["6.*","12.*","13.*"],
+ "exclude-agent-cases": {}
+}
diff --git a/server/tests/meson.build b/server/tests/meson.build
new file mode 100644
index 00000000..6af904d6
--- /dev/null
+++ b/server/tests/meson.build
@@ -0,0 +1,112 @@
+test_lib_include = [spice_server_include, include_directories('.')]
+test_lib_deps = spice_server_deps
+
+test_lib_sources = [
+ 'basic-event-loop.c',
+ 'basic-event-loop.h',
+ 'test-display-base.cpp',
+ 'test-display-base.h',
+ 'test-glib-compat.h',
+ 'win-alarm.c',
+ 'win-alarm.h',
+ 'vmc-emu.cpp',
+ 'vmc-emu.h',
+]
+
+test_libs = []
+test_libs += static_library('testlib', test_lib_sources,
+ link_with: spice_server_static_lib,
+ include_directories : test_lib_include,
+ dependencies : test_lib_deps,
+ install : false)
+
+stat_test_libs = {'testlib_stat1' : ['1', '0', '0'],
+ 'testlib_stat2' : ['2', '0', '1'],
+ 'testlib_stat3' : ['3', '1', '0'],
+ 'testlib_stat4' : ['4', '1', '1']}
+foreach lib, params : stat_test_libs
+ test_libs += static_library(lib, 'stat-test.c',
+ c_args : ['-DTEST_NAME=stat_test@0@'.format(params[0]),
+ '-DTEST_COMPRESS_STAT=@0@'.format(params[1]),
+ '-DTEST_RED_WORKER_STAT=@0@'.format(params[2])],
+ include_directories : test_lib_include,
+ dependencies : test_lib_deps,
+ install : false)
+endforeach
+
+tests = [
+ ['test-codecs-parsing', true],
+ ['test-dispatcher', true, 'cpp'],
+ ['test-options', true],
+ ['test-stat', true],
+ ['test-agent-msg-filter', true],
+ ['test-loop', true],
+ ['test-qxl-parsing', true, 'cpp'],
+ ['test-leaks', true],
+ ['test-vdagent', true],
+ ['test-fail-on-null-core-interface', true],
+ ['test-empty-success', true],
+ ['test-channel', true, 'cpp'],
+ ['test-stream-device', true, 'cpp'],
+ ['test-set-ticket', true],
+ ['test-listen', true],
+ ['test-record', true],
+ ['test-display-no-ssl', false],
+ ['test-display-streaming', false],
+ ['test-playback', false],
+ ['test-display-resolution-changes', false],
+ ['test-two-servers', false],
+ ['test-display-width-stride', false],
+]
+
+if spice_server_has_sasl
+ tests += [['test-sasl', true]]
+endif
+
+if spice_server_has_smartcard == true
+ tests += [['test-smartcard', true, 'cpp']]
+endif
+
+if host_machine.system() != 'windows'
+ tests += [
+ ['test-stream', true],
+ ['test-stat-file', true],
+ ['test-websocket', false],
+ ]
+endif
+
+if spice_server_has_gstreamer
+ tests += [['test-gst', false, 'cpp']]
+ if get_option('extra-checks')
+ test('test-video-encoders', files('test-video-encoders'))
+ endif
+endif
+
+foreach t : tests
+ test_name = t[0]
+ is_test = t[1]
+ if t.length() > 2
+ language = t[2]
+ else
+ language = 'c'
+ endif
+ exe = executable(test_name,
+ sources : '@0@.@1@'.format(test_name, language),
+ link_with : test_libs,
+ include_directories : test_lib_include,
+ c_args : ['-DSPICE_TOP_SRCDIR="@0@"'.format(meson.source_root())],
+ cpp_args : ['-DSPICE_TOP_SRCDIR="@0@"'.format(meson.source_root())],
+ dependencies : test_lib_deps,
+ install : false)
+
+ if is_test
+ test(test_name, exe)
+ endif
+endforeach
+
+executable('spice-server-replay',
+ sources : ['replay.c', join_paths('..', 'event-loop.c'), 'basic-event-loop.c', 'basic-event-loop.h'],
+ link_with : spice_server_shared_lib,
+ include_directories : test_lib_include,
+ dependencies : test_lib_deps,
+ install : false)
diff --git a/server/tests/pki/ca-cert.pem b/server/tests/pki/ca-cert.pem
new file mode 100644
index 00000000..2e40da24
--- /dev/null
+++ b/server/tests/pki/ca-cert.pem
@@ -0,0 +1,20 @@
+-----BEGIN CERTIFICATE-----
+MIIDWjCCAkKgAwIBAgIJAILhGzNuNWQHMA0GCSqGSIb3DQEBCwUAMEIxCzAJBgNV
+BAYTAlhYMRUwEwYDVQQHDAxEZWZhdWx0IENpdHkxHDAaBgNVBAoME0RlZmF1bHQg
+Q29tcGFueSBMdGQwHhcNMTgxMjA0MTIxNjAzWhcNNDgxMTI2MTIxNjAzWjBCMQsw
+CQYDVQQGEwJYWDEVMBMGA1UEBwwMRGVmYXVsdCBDaXR5MRwwGgYDVQQKDBNEZWZh
+dWx0IENvbXBhbnkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
+8jyIHqDhnkoNNMnC9ACMTgN0nZSJh0F2QQw4vajumoyVQ2wQmAC2BsndvYPhZV3/
+2pGTl6X4LANUPWqGxp++ZJrzBUFPLIYKe1T7DCPyvoJoI6BKHYb15OrokryylGkO
+QKgWYbCl3p+2R9KaADYWQdHaMs1VzKuEtZ5dmX9Or3qbU88tDeLvbirVhCxmmt2x
+F4NF4V1ZKVud5DanPGxtSnNydmTvkaBwPTWYig6EpBp+UlV+cH1P7vbORXnNlT4C
+x54d1v8qJIxunbYq/je0lgdIDYU/gFZ6t8PoS5iuP0s7aFjOfBCjl41oO3R4gNob
+VXZQA7kVreiLbc6O9orbKwIDAQABo1MwUTAdBgNVHQ4EFgQUcDtvufvglN3CQ55v
+3J30/2S7WDMwHwYDVR0jBBgwFoAUcDtvufvglN3CQ55v3J30/2S7WDMwDwYDVR0T
+AQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAsAFKXWd8gBmp1yybvUUDIPDr
+t+sPp71KcXkmhTEn8LL2xcYRhvAGgzhYQb/pCCvNU9to7TLlcehSlrfrzV7KwJzk
+UWlxCd/lmTU/eM0rlxzzO90xV37u0H7BKSqBKQBrvuMEk9H2T+oXg9rkP8dQBQKF
+BmrU7udE1SO324b5H1Sh3JobvvZ5IUei8nE5yqnGO3Oo8dl/V9LLyFdR+dCaE1jt
+JrGxLUBfQthPmdI9V+A6oD45v5VS1Lbdg6SAfCuhqlCAZeg89gywy3v9DpKSZ8So
+szIgdn8akS4vmcLv9qvwcIrf6rg1k11OJLGbGj0ySx30gREGFbVSwHq789LsfA==
+-----END CERTIFICATE-----
diff --git a/server/tests/pki/dhparams.pem b/server/tests/pki/dhparams.pem
new file mode 100644
index 00000000..92760255
--- /dev/null
+++ b/server/tests/pki/dhparams.pem
@@ -0,0 +1,13 @@
+-----BEGIN DH PARAMETERS-----
+MIICCAKCAgEArKjVOoTXDuKTbh8ne4NPs46AD5npR5N43gQzEFgoDad6AW1nKt1P
+OtSHEhWZMnnqKGjeHsvG7aPaSi/SUj6ypfLLt2Ym6/BkEL/Xn4WIl++4RX/XS1gB
+Mxl4D7TIz7I/DuT8tIDWGdaHFJvFx7CeVCFRHSAOPAPPT2EtQx7Gq10674Gmfinp
+MKWeWOx0VkZJJqnUZryEMWo6G7GgN3+7ZkHeTF+1cQehSs2UB/0Vy/NsS8Spiq3X
+Dq7GNXSVC0zzzpwvE7NFeCU6Zb3FExGb04UIAO8iG2xj7Sv8ZQUHCEVmHh+Q+DX9
+GHHbE0KsBLvbVvWeYjDZK1wlkPVD9vsHWkKcwdPLFfaf6Oc+82cDdSNKetcas9Cs
+JXWMdErAXDq/0XyTHvrM4ZHP6imQbKjRx26Ca3UPYWWKf3q2NDfLDIcdT06uXBjO
+SjwmRKyz/3Ytl2WfhhYicxVaeda9Roks01homHwQrgn+WlrWQJOtj0G6JKgTYqGR
+LuUUi/CAjIhRWF5zTDxtIQp7Tk5ZuS117W/KyWe2cGPq09MH6DxBKei0mI9pDTe6
+CG2D5AvHKkFoJ8GdGVg957kTvjr1t+UxAt1TXkmQERtNZSPCLZie7C/21CnKGhIT
+QsRMk6WSmzvHRQUEbrAfJH1WhV6x8+nrj/OpgucywPLc004hQUKYsMMCAQI=
+-----END DH PARAMETERS-----
diff --git a/server/tests/pki/server-cert.pem b/server/tests/pki/server-cert.pem
new file mode 100644
index 00000000..5ace4081
--- /dev/null
+++ b/server/tests/pki/server-cert.pem
@@ -0,0 +1,18 @@
+-----BEGIN CERTIFICATE-----
+MIIC+DCCAeACAQEwDQYJKoZIhvcNAQELBQAwQjELMAkGA1UEBhMCWFgxFTATBgNV
+BAcMDERlZmF1bHQgQ2l0eTEcMBoGA1UECgwTRGVmYXVsdCBDb21wYW55IEx0ZDAe
+Fw0xODEyMDQxMjE2MDlaFw00ODExMjYxMjE2MDlaMEIxCzAJBgNVBAYTAlhYMRUw
+EwYDVQQHDAxEZWZhdWx0IENpdHkxHDAaBgNVBAoME0RlZmF1bHQgQ29tcGFueSBM
+dGQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGeaFsglHGN+XLMscC
+XEgYk10zsVZ2PvMO/cVRd5ykaHUFUknOnoImxnxWhfTKmlkM7W4fZCXulc0oOxpy
+ycTxsLzePAvlq/lMSTHK44mQWAB5vwZq6fEBMN6op2m09VqJjSc6CNoH+b5lDm+B
+fx4SvC+ZBSdoRXoonqnNsqcTzp7NkSqD9kJHYFF4I60CdTwXqhNBUqSJ+F1QJoJS
+K2DAnJUMDwHQfoWHWuuX/SM1adh6NrxXNNQ99TrAwtm3faUF6D3narNfjUVzSMlk
+FWBOxnZojny8gt4xONp/1VXYRnA17wst2SbxPYaux/NAQVFrb9btIs+31JZe/9iC
+LrD9AgMBAAEwDQYJKoZIhvcNAQELBQADggEBAGZKPFTKyplFuyn//kM7ZncZKbST
+zjSoCljAkrOL6bPpgZ4Q2U1HVH5OFtYyH5p6woMY4GKqhq+hy+O6lfGmbiGg+cB0
+doVH+/Tn6cWuctIu9Afb3JQWnagZMJLiUBBNYkRtFpxHDatRzsuJnzr66d0zne3v
+reCvRYi/H36H0zY6xtvR6DORSy0EJ1C/PiRXUW+Uag2l0IcHsj6UlJ9gqYk+4bNL
+u7rJcP11aGcdDcBwv/c08iYIcu3co0hxKMUpgPiz8wAipJSjDsJPYmeJcZyllBPk
+XvCKpRHS8EhaYQ4lZbChJPR8RDlf9J1z4wY8HMcVKHTQfp9q9XrsbOJ4x/o=
+-----END CERTIFICATE-----
diff --git a/server/tests/pki/server-key.pem b/server/tests/pki/server-key.pem
new file mode 100644
index 00000000..f6a3aa79
--- /dev/null
+++ b/server/tests/pki/server-key.pem
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpAIBAAKCAQEAxnmhbIJRxjflyzLHAlxIGJNdM7FWdj7zDv3FUXecpGh1BVJJ
+zp6CJsZ8VoX0yppZDO1uH2Ql7pXNKDsacsnE8bC83jwL5av5TEkxyuOJkFgAeb8G
+aunxATDeqKdptPVaiY0nOgjaB/m+ZQ5vgX8eErwvmQUnaEV6KJ6pzbKnE86ezZEq
+g/ZCR2BReCOtAnU8F6oTQVKkifhdUCaCUitgwJyVDA8B0H6Fh1rrl/0jNWnYeja8
+VzTUPfU6wMLZt32lBeg952qzX41Fc0jJZBVgTsZ2aI58vILeMTjaf9VV2EZwNe8L
+Ldkm8T2GrsfzQEFRa2/W7SLPt9SWXv/Ygi6w/QIDAQABAoIBAEBJrYvkOnCmMny7
+GdMd6Qxsz0erLYJnqXs1n/BfehGW9DChEt8mYKoGqMet5Dir/iQ90+m/GrpJM4bQ
+fiSoTm6q/MJPWNsv9TRMkSBSy4BBwQWuZnnDBRmJptWiRI8k2gqr+gTGUTk8H/vD
+zUJ41ljjM9ew367aslLt8bp7H7s+JBLi60F9PnnMJ+fZJpdB2trRvzwp0gWN1kEy
+VQUydSEV1yLT/rFkFcm8gRceTlh2yb3CPbZDMF/CExNahnxFaibKYtXd7J26jHKN
+TbSPO7Rm6e3AcyLZMxyyC4PcU975Bg22HThZFEYDCYLyZuc4zCHxnWFmtEhEc/Vn
+AHEaW9ECgYEA4nDLUHt7y6HUUr/TJo5fNJ5Jc/yK+2J/brUmVBiL49j+rvpqfq8A
+1ozT6Ga6I+PjRhA+CvrjfCG7wUi71rjx1QGThCGUrko7VYG/Un3jus1dem/PR/nq
+Tt27GTalmwCIjrHxUH6CTv4uOKdd7LlEXNqyqq2UbGShOai0xsOPr2cCgYEA4GJI
+vohNsuhfjA7K+PdJ3BmRtC5WIUZYthT86//vumn4AURmUJvWc5+q0cC6tPM01HIH
+BqO/ZFPD7p9GIh9ZbDWsEL5A4r3sLT2vFk3MV9iwiqb0WpZbg9KVuhNOaZ47JKFR
+YxpaHcLUdcDXvrqz+o/l2ITG5x/FFkMQlRiNMfsCgYEA2R15dEPSIR+bq3QOCyv7
+kUIr/7Anun1o3keG5p9aki8fk7q7nZhC33TMQkstMvhwlF9Cfditgfn+Qodww6M1
+DR2jyc9A9hRq68OqJHhcgGIkvR6zyrmPterYWIaTJxnN1bQ8Qwfp/b+tpdikMDQ7
+niR7pzcj1wJtrBFctDASdwUCgYEAxCUGZA/wo+k/xMYVpic9WHq9hJ1Qy0ucNqcI
+JSEYpYMGuczaB7MCdxZnE25/h7hmQSPggmxX3VLgHtL6Us/GsrIEVKqLO+o775xR
+VpTxgQU55iplxl5TZ1uJaRyBWhBosO+XnqMljYiHgtvtfJvmwqxRhsEiwl1iQsCj
+WUIaA0sCgYAuRXM1HmWzAfCpANJVWyjswr9Zg4KjCC2QSM2XOGaTISyNPyKyQ3Yf
++xz41ggx6uss1oyyYTXkZ+mGsJJ3fFZWG3k/w0tZwMhS9RzFd1qJTrMqXy+MeCG1
+nb2nTEYNih5Yq5A+ZzYWhSZ7qAZP0oFdtb6TaR8ke3SYFpJqZzvD7g==
+-----END RSA PRIVATE KEY-----
diff --git a/server/tests/regression_test.py b/server/tests/regression-test.py
index 5aad1a7b..81eaecf1 100755
--- a/server/tests/regression_test.py
+++ b/server/tests/regression-test.py
@@ -1,7 +1,7 @@
#!/usr/bin/python
from subprocess import PIPE, Popen
-import Image
-import ImageChops
+from PIL import Image
+from PIL import ImageChops
def spicy_screenshot():
diff --git a/server/tests/replay.c b/server/tests/replay.c
new file mode 100644
index 00000000..ee097aef
--- /dev/null
+++ b/server/tests/replay.c
@@ -0,0 +1,487 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+/* Replay a previously recorded file (via SPICE_WORKER_RECORD_FILENAME)
+ */
+
+#include <config.h>
+
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <signal.h>
+#include <unistd.h>
+#include <pthread.h>
+#ifndef _WIN32
+#include <sys/wait.h>
+#endif
+#include <fcntl.h>
+#include <glib.h>
+#include <pthread.h>
+
+#include <spice/macros.h>
+#include "test-display-base.h"
+#include "test-glib-compat.h"
+#include <common/log.h>
+
+static SpiceCoreInterface *core;
+static SpiceServer *server;
+static SpiceReplay *replay;
+static gboolean started = FALSE;
+static QXLInstance display_sin;
+static gint slow = 0;
+static gint skip = 0;
+static gboolean print_count = FALSE;
+static guint ncommands = 0;
+static GPid client_pid;
+static GMainLoop *loop = NULL;
+static GAsyncQueue *display_queue = NULL;
+static GAsyncQueue *cursor_queue = NULL;
+static long total_size;
+
+static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+static GSource *fill_source = NULL;
+
+
+#define MEM_SLOT_GROUP_ID 0
+
+/* Parts cribbed from spice-display.h/.c/qxl.c */
+
+static QXLDevMemSlot slot = {
+.slot_group_id = MEM_SLOT_GROUP_ID,
+.slot_id = 0,
+.generation = 0,
+.virt_start = 0,
+.virt_end = ~0,
+.addr_delta = 0,
+.qxl_ram_size = ~0,
+};
+
+static void attached_worker(QXLInstance *qin)
+{
+ static int count = 0;
+ if (++count > 1) {
+ g_warning("%s ignored\n", __func__);
+ return;
+ }
+ g_debug("%s\n", __func__);
+ spice_qxl_add_memslot(qin, &slot);
+ spice_server_vm_start(server);
+}
+
+static void set_compression_level(QXLInstance *qin, int level)
+{
+ g_debug("%s\n", __func__);
+}
+
+// same as qemu/ui/spice-display.h
+#define MAX_SURFACE_NUM 1024
+
+static void get_init_info(QXLInstance *qin, QXLDevInitInfo *info)
+{
+ memset(info, 0, sizeof(*info));
+ info->num_memslots = 1;
+ info->num_memslots_groups = 1;
+ info->memslot_id_bits = 1;
+ info->memslot_gen_bits = 1;
+ info->n_surfaces = MAX_SURFACE_NUM;
+}
+
+static gboolean fill_queue_idle(gpointer user_data)
+{
+ gboolean keep = FALSE;
+ gboolean wakeup = FALSE;
+
+ while ((g_async_queue_length(display_queue) +
+ g_async_queue_length(cursor_queue)) < 50) {
+ QXLCommandExt *cmd = spice_replay_next_cmd(replay, &display_sin);
+ if (!cmd) {
+ g_async_queue_push(display_queue, GINT_TO_POINTER(-1));
+ g_async_queue_push(cursor_queue, GINT_TO_POINTER(-1));
+ break;
+ }
+
+ ++ncommands;
+
+ if (slow && (ncommands > skip)) {
+ g_usleep(slow);
+ }
+
+ wakeup = TRUE;
+ if (cmd->cmd.type == QXL_CMD_CURSOR) {
+ g_async_queue_push(cursor_queue, cmd);
+ } else {
+ g_async_queue_push(display_queue, cmd);
+ }
+ }
+
+ if (!keep) {
+ pthread_mutex_lock(&mutex);
+ if (fill_source) {
+ g_source_destroy(fill_source);
+ g_source_unref(fill_source);
+ fill_source = NULL;
+ }
+ pthread_mutex_unlock(&mutex);
+ }
+ if (wakeup)
+ spice_qxl_wakeup(&display_sin);
+
+ return keep;
+}
+
+static void fill_queue(void)
+{
+ pthread_mutex_lock(&mutex);
+
+ if (started && fill_source == NULL) {
+ fill_source = g_idle_source_new();
+ g_source_set_callback(fill_source, fill_queue_idle, NULL, NULL);
+ g_source_attach(fill_source, basic_event_loop_get_context());
+ }
+
+ pthread_mutex_unlock(&mutex);
+}
+
+
+// called from spice_server thread (i.e. red_worker thread)
+static int get_command_from(QXLInstance *qin, QXLCommandExt *ext, GAsyncQueue *queue)
+{
+ QXLCommandExt *cmd;
+
+ if (g_async_queue_length(queue) == 0) {
+ /* could use a gcondition ? */
+ fill_queue();
+ return FALSE;
+ }
+
+ cmd = (QXLCommandExt*) g_async_queue_try_pop(queue);
+ if (GPOINTER_TO_INT(cmd) == -1) {
+ g_main_loop_quit(loop);
+ return FALSE;
+ }
+
+ *ext = *cmd;
+
+ return TRUE;
+}
+
+static int req_notification(GAsyncQueue *queue)
+{
+ /* check for pending messages */
+ return g_async_queue_length(queue) == 0;
+}
+
+static int get_display_command(QXLInstance *qin, QXLCommandExt *ext)
+{
+ return get_command_from(qin, ext, display_queue);
+}
+
+static int req_display_notification(QXLInstance *qin)
+{
+ return req_notification(display_queue);
+}
+
+static void end_replay(void)
+{
+ /* FIXME: wait threads and end cleanly */
+ spice_replay_free(replay);
+
+ if (client_pid) {
+ g_debug("kill %" G_PID_FORMAT, client_pid);
+#ifndef _WIN32
+ int child_status;
+
+ kill(client_pid, SIGINT);
+ waitpid(client_pid, &child_status, 0);
+#else
+ TerminateProcess(client_pid, 0);
+ WaitForSingleObject(client_pid, INFINITE);
+#endif
+ g_spawn_close_pid(client_pid);
+ client_pid = 0;
+ }
+}
+
+static void release_resource(QXLInstance *qin, struct QXLReleaseInfoExt release_info)
+{
+ spice_replay_free_cmd(replay, (QXLCommandExt *)(uintptr_t)release_info.info->id);
+}
+
+static int get_cursor_command(QXLInstance *qin, struct QXLCommandExt *ext)
+{
+ return get_command_from(qin, ext, cursor_queue);
+}
+
+static int req_cursor_notification(QXLInstance *qin)
+{
+ return req_notification(cursor_queue);
+}
+
+static void notify_update(QXLInstance *qin, uint32_t update_id)
+{
+}
+
+static int flush_resources(QXLInstance *qin)
+{
+ return TRUE;
+}
+
+static QXLInterface display_sif = {
+ .base = {
+ .type = SPICE_INTERFACE_QXL,
+ .description = "replay",
+ .major_version = SPICE_INTERFACE_QXL_MAJOR,
+ .minor_version = SPICE_INTERFACE_QXL_MINOR
+ },
+ .attached_worker = attached_worker,
+ .set_compression_level = set_compression_level,
+ .set_mm_time = NULL,
+ .get_init_info = get_init_info,
+ .get_command = get_display_command,
+ .req_cmd_notification = req_display_notification,
+ .release_resource = release_resource,
+ .get_cursor_command = get_cursor_command,
+ .req_cursor_notification = req_cursor_notification,
+ .notify_update = notify_update,
+ .flush_resources = flush_resources,
+};
+
+static void replay_channel_event(int event, SpiceChannelEventInfo *info)
+{
+ if (info->type == SPICE_CHANNEL_DISPLAY &&
+ event == SPICE_CHANNEL_EVENT_INITIALIZED) {
+ started = TRUE;
+ }
+}
+
+static gboolean start_client(gchar *cmd, GError **error)
+{
+ gboolean retval;
+ gint argc;
+ gchar **argv = NULL;
+
+
+ if (!g_shell_parse_argv(cmd, &argc, &argv, error))
+ return FALSE;
+
+ retval = g_spawn_async(NULL, argv, NULL, G_SPAWN_SEARCH_PATH,
+ NULL, NULL, &client_pid, error);
+ g_strfreev(argv);
+
+ return retval;
+}
+
+static gboolean progress_timer(gpointer user_data)
+{
+ FILE *fd = (FILE*) user_data;
+ /* it seems somehow thread safe, move to worker thread? */
+ double pos = (double)ftell(fd);
+
+ g_debug("%.2f%%", pos/total_size * 100);
+ return TRUE;
+}
+
+static void free_queue(GAsyncQueue *queue)
+{
+ for (;;) {
+ QXLCommandExt *cmd = (QXLCommandExt*) g_async_queue_try_pop(queue);
+ if (cmd == GINT_TO_POINTER(-1)) {
+ continue;
+ }
+ if (!cmd) {
+ break;
+ }
+ spice_replay_free_cmd(replay, cmd);
+ }
+ g_async_queue_unref(queue);
+}
+
+int main(int argc, char **argv)
+{
+ GError *error = NULL;
+ GOptionContext *context = NULL;
+ gchar *client = NULL, *codecs = NULL, **file = NULL;
+ gint port = 5000, compression = SPICE_IMAGE_COMPRESSION_AUTO_GLZ;
+ gint streaming = SPICE_STREAM_VIDEO_FILTER;
+ gboolean wait = FALSE;
+ gint tls_port = 0;
+ gchar *cacert_file = NULL, *cert_file = NULL, *key_file = NULL;
+
+ FILE *fd;
+
+ GOptionEntry entries[] = {
+ { "client", 'c', 0, G_OPTION_ARG_STRING, &client, "Client", "CMD" },
+ { "compression", 'C', 0, G_OPTION_ARG_INT, &compression, "Compression (default 2)", "INT" },
+ { "streaming", 'S', 0, G_OPTION_ARG_INT, &streaming, "Streaming (default 3)", "INT" },
+ { "video-codecs", 'v', 0, G_OPTION_ARG_STRING, &codecs, "Video codecs", "STRING" },
+ { "port", 'p', 0, G_OPTION_ARG_INT, &port, "Server port (default 5000)", "PORT" },
+ { "wait", 'w', 0, G_OPTION_ARG_NONE, &wait, "Wait for client", NULL },
+ { "slow", 's', 0, G_OPTION_ARG_INT, &slow, "Slow down replay. Delays USEC microseconds before each command", "USEC" },
+ { "skip", 0, 0, G_OPTION_ARG_INT, &skip, "Skip 'slow' for the first n commands", NULL },
+ { "count", 0, 0, G_OPTION_ARG_NONE, &print_count, "Print the number of commands processed", NULL },
+ { "tls-port", 0, 0, G_OPTION_ARG_INT, &tls_port, "Secure server port", "PORT" },
+ { "cacert-file", 0, 0, G_OPTION_ARG_FILENAME, &cacert_file, "TLS CA certificate", "FILE" },
+ { "cert-file", 0, 0, G_OPTION_ARG_FILENAME, &cert_file, "TLS server certificate", "FILE" },
+ { "key-file", 0, 0, G_OPTION_ARG_FILENAME, &key_file, "TLS server private key", "FILE" },
+ { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &file, "replay file", "FILE" },
+ { NULL }
+ };
+
+ static const char description[] =
+ "Compression values:\n"
+ "\t1=off 2=auto_glz 3=auto_lz 4=quic 5=glz 6=lz 7=lz4\n"
+ "\n"
+ "Streaming values:\n"
+ "\t1=off 2=all 3=filter";
+
+ /* these asserts are here to check that the documentation we state above is still correct */
+ SPICE_VERIFY(SPICE_STREAM_VIDEO_OFF == 1);
+ SPICE_VERIFY(SPICE_STREAM_VIDEO_ALL == 2);
+ SPICE_VERIFY(SPICE_STREAM_VIDEO_FILTER == 3);
+ SPICE_VERIFY(SPICE_IMAGE_COMPRESSION_INVALID == 0);
+ SPICE_VERIFY(SPICE_IMAGE_COMPRESSION_OFF == 1);
+ SPICE_VERIFY(SPICE_IMAGE_COMPRESSION_AUTO_GLZ == 2);
+ SPICE_VERIFY(SPICE_IMAGE_COMPRESSION_AUTO_LZ == 3);
+ SPICE_VERIFY(SPICE_IMAGE_COMPRESSION_QUIC == 4);
+ SPICE_VERIFY(SPICE_IMAGE_COMPRESSION_GLZ == 5);
+ SPICE_VERIFY(SPICE_IMAGE_COMPRESSION_LZ == 6);
+ SPICE_VERIFY(SPICE_IMAGE_COMPRESSION_LZ4 == 7);
+
+ context = g_option_context_new("- replay spice server recording");
+ g_option_context_add_main_entries(context, entries, NULL);
+ g_option_context_set_description(context, description);
+ if (!g_option_context_parse(context, &argc, &argv, &error)) {
+ g_printerr("Option parsing failed: %s\n", error->message);
+ exit(1);
+ }
+ if (!file) {
+ g_printerr("%s\n", g_option_context_get_help(context, TRUE, NULL));
+ exit(1);
+ }
+ g_option_context_free(context);
+ context = NULL;
+
+ if (compression <= SPICE_IMAGE_COMPRESSION_INVALID
+ || compression >= SPICE_IMAGE_COMPRESSION_ENUM_END) {
+ g_printerr("invalid compression value\n");
+ exit(1);
+ }
+ if (streaming < 0 || streaming == SPICE_STREAM_VIDEO_INVALID) {
+ g_printerr("invalid streaming value\n");
+ exit(1);
+ }
+
+ if (strncmp(file[0], "-", 1) == 0) {
+ fd = stdin;
+#ifdef _WIN32
+ _setmode(fileno(fd), _O_BINARY);
+#endif
+ } else {
+ fd = fopen(file[0], "rb");
+ }
+ if (fd == NULL) {
+ g_printerr("error opening %s\n", file[0]);
+ exit(1);
+ }
+ g_strfreev(file);
+ file = NULL;
+#ifndef _WIN32
+ if (fcntl(fileno(fd), FD_CLOEXEC) < 0) {
+ perror("fcntl failed");
+ exit(1);
+ }
+#endif
+ fseek(fd, 0L, SEEK_END);
+ total_size = ftell(fd);
+ fseek(fd, 0L, SEEK_SET);
+ if (total_size > 0)
+ g_timeout_add_seconds(1, progress_timer, fd);
+ replay = spice_replay_new(fd, MAX_SURFACE_NUM);
+ if (replay == NULL) {
+ g_printerr("Error initializing replay\n");
+ exit(1);
+ }
+
+ display_queue = g_async_queue_new();
+ cursor_queue = g_async_queue_new();
+ core = basic_event_loop_init();
+ core->channel_event = replay_channel_event;
+
+ server = spice_server_new();
+ spice_server_set_image_compression(server, (SpiceImageCompression) compression);
+ spice_server_set_streaming_video(server, streaming);
+
+ if (codecs != NULL) {
+ if (spice_server_set_video_codecs(server, codecs) != 0) {
+ g_warning("could not set codecs: %s", codecs);
+ }
+ g_free(codecs);
+ }
+
+ if (tls_port) {
+ if (spice_server_set_tls(server, tls_port,
+ cacert_file, cert_file, key_file,
+ NULL, NULL, NULL) != 0) {
+ g_printerr("error setting TLS\n");
+ exit(1);
+ }
+ }
+ g_free(cacert_file);
+ g_free(cert_file);
+ g_free(key_file);
+ cacert_file = cert_file = key_file = NULL;
+
+ spice_server_set_port(server, port);
+ spice_server_set_noauth(server);
+
+ g_print("listening on port %d (insecure)\n", port);
+ spice_server_init(server, core);
+
+ display_sin.base.sif = &display_sif.base;
+ spice_server_add_interface(server, &display_sin.base);
+
+ if (client) {
+ start_client(client, &error);
+ wait = TRUE;
+ g_free(client);
+ client = NULL;
+ }
+
+ if (!wait) {
+ started = TRUE;
+ fill_queue();
+ }
+
+ loop = g_main_loop_new(basic_event_loop_get_context(), FALSE);
+ g_main_loop_run(loop);
+
+ if (print_count)
+ g_print("Counted %d commands\n", ncommands);
+
+ spice_server_destroy(server);
+ free_queue(display_queue);
+ free_queue(cursor_queue);
+ end_replay();
+
+ g_main_loop_unref(loop);
+ basic_event_loop_destroy();
+
+ return 0;
+}
diff --git a/server/tests/stat-test.c b/server/tests/stat-test.c
new file mode 100644
index 00000000..444ff7e3
--- /dev/null
+++ b/server/tests/stat-test.c
@@ -0,0 +1,88 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+/* check statistics
+ */
+
+#include <config.h>
+
+#undef COMPRESS_STAT
+#undef RED_WORKER_STAT
+
+#if TEST_COMPRESS_STAT
+#define COMPRESS_STAT
+#endif
+
+#if TEST_RED_WORKER_STAT
+#define RED_WORKER_STAT
+#endif
+
+#include <unistd.h>
+#include <glib.h>
+#include <common/macros.h>
+
+#include "../stat.h"
+
+#ifndef TEST_NAME
+#error TEST_NAME must be defined!
+#endif
+
+// avoid warning, the function is called by stat-main.c
+void TEST_NAME(void);
+
+void TEST_NAME(void)
+{
+ stat_info_t info;
+ stat_start_time_t start_time;
+
+#if !defined(COMPRESS_STAT) && !defined(RED_WORKER_STAT)
+ SPICE_VERIFY(sizeof(start_time) == 0);
+ SPICE_VERIFY(sizeof(info) == 0);
+#endif
+
+ stat_init(&info, "test", CLOCK_MONOTONIC);
+ stat_start_time_init(&start_time, &info);
+ usleep(2000);
+ stat_add(&info, start_time);
+
+#ifdef RED_WORKER_STAT
+ g_assert_cmpuint(info.count, ==, 1);
+ g_assert_cmpuint(info.min, ==, info.max);
+ g_assert_cmpuint(info.min, >=, 2000000);
+ g_assert_cmpuint(info.min, <, 100000000);
+#endif
+
+ stat_reset(&info);
+
+ stat_compress_init(&info, "test", CLOCK_MONOTONIC);
+ stat_start_time_init(&start_time, &info);
+ usleep(2000);
+ stat_compress_add(&info, start_time, 100, 50);
+ usleep(1000);
+ stat_compress_add(&info, start_time, 1000, 500);
+
+#ifdef COMPRESS_STAT
+ g_assert_cmpuint(info.count, ==, 2);
+ g_assert_cmpuint(info.min, !=, info.max);
+ g_assert_cmpuint(info.min, >=, 2000000);
+ g_assert_cmpuint(info.min, <, 100000000);
+ g_assert_cmpuint(info.total, >=, 5000000);
+ g_assert_cmpuint(info.orig_size, ==, 1100);
+ g_assert_cmpuint(info.comp_size, ==, 550);
+#endif
+}
diff --git a/server/tests/test-agent-msg-filter.c b/server/tests/test-agent-msg-filter.c
new file mode 100644
index 00000000..e606a78a
--- /dev/null
+++ b/server/tests/test-agent-msg-filter.c
@@ -0,0 +1,149 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2016 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+#include <glib.h>
+#include <spice/vd_agent.h>
+#include <string.h>
+
+#include "agent-msg-filter.h"
+#include "test-glib-compat.h"
+
+static void test_agent_msg_filter_setup(void)
+{
+ AgentMsgFilter filter = {
+ .msg_data_to_read = 42,
+ .result = AGENT_MSG_FILTER_PROTO_ERROR,
+ .copy_paste_enabled = FALSE,
+ .file_xfer_enabled = FALSE,
+ .use_client_monitors_config = FALSE,
+ .discard_all = TRUE,
+ };
+
+ /* config doesn't change other fields */
+ agent_msg_filter_config(&filter, TRUE, TRUE, TRUE);
+ g_assert_cmpint(filter.msg_data_to_read, ==, 42);
+ g_assert_cmpint(filter.result, ==, AGENT_MSG_FILTER_PROTO_ERROR);
+ g_assert(filter.copy_paste_enabled == TRUE);
+ g_assert(filter.file_xfer_enabled == TRUE);
+ g_assert(filter.use_client_monitors_config == TRUE);
+ g_assert(filter.discard_all == TRUE);
+
+ /* init clears filter */
+ agent_msg_filter_init(&filter, FALSE, FALSE, FALSE, FALSE);
+ g_assert_cmpint(filter.msg_data_to_read, ==, 0);
+ g_assert_cmpint(filter.result, ==, AGENT_MSG_FILTER_OK);
+ g_assert(filter.copy_paste_enabled == FALSE);
+ g_assert(filter.file_xfer_enabled == FALSE);
+ g_assert(filter.use_client_monitors_config == FALSE);
+ g_assert(filter.discard_all == FALSE);
+}
+
+static void test_agent_msg_filter_run(void)
+{
+ AgentMsgFilter filter;
+ union {
+ struct VDAgentMessage msg_header;
+ uint8_t data[VD_AGENT_MAX_DATA_SIZE];
+ } msg;
+ uint32_t len, type;
+
+ agent_msg_filter_init(&filter, TRUE, TRUE, TRUE, TRUE); /* discard all */
+
+ /* message size too large */
+ len = VD_AGENT_MAX_DATA_SIZE + 1;
+ g_test_expect_message(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, "*invalid agent message: too large");
+ g_assert_cmpint(agent_msg_filter_process_data(&filter, msg.data, len), ==,
+ AGENT_MSG_FILTER_PROTO_ERROR);
+ g_test_assert_expected_messages();
+
+
+ /* data len too small */
+ len = 0;
+ g_test_expect_message(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, "*invalid agent message: incomplete header");
+ g_assert_cmpint(agent_msg_filter_process_data(&filter, msg.data, len), ==,
+ AGENT_MSG_FILTER_PROTO_ERROR);
+ g_test_assert_expected_messages();
+
+ /* invalid protocol */
+ memset(&msg.msg_header, 0, sizeof(msg.msg_header));
+ len = sizeof(msg.msg_header);
+ g_test_expect_message(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, "*invalid agent protocol: 0");
+ g_assert_cmpint(agent_msg_filter_process_data(&filter, msg.data, len), ==,
+ AGENT_MSG_FILTER_PROTO_ERROR);
+ g_test_assert_expected_messages();
+
+ /* all messages should be discarded */
+ msg.msg_header.protocol = VD_AGENT_PROTOCOL;
+ g_test_expect_message(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, "*invalid agent message: data exceeds size from header");
+ for (type = VD_AGENT_MOUSE_STATE; type < VD_AGENT_END_MESSAGE; type++) {
+ msg.msg_header.type = type;
+ g_assert_cmpint(agent_msg_filter_process_data(&filter, msg.data, len), ==,
+ AGENT_MSG_FILTER_DISCARD);
+ }
+
+ /* data exceeds size from header */
+ msg.msg_header.size = 1;
+ len = sizeof(msg.msg_header) + msg.msg_header.size + 1;
+ g_assert_cmpint(agent_msg_filter_process_data(&filter, msg.data, len), ==,
+ AGENT_MSG_FILTER_PROTO_ERROR);
+ g_test_assert_expected_messages();
+
+ len = sizeof(msg.msg_header) + msg.msg_header.size; /* restore correct size */
+
+ /* forward everything to the agent */
+ agent_msg_filter_init(&filter, TRUE, TRUE, FALSE, FALSE);
+ for (type = VD_AGENT_MOUSE_STATE; type < VD_AGENT_END_MESSAGE; type++) {
+ msg.msg_header.type = type;
+ g_assert_cmpint(agent_msg_filter_process_data(&filter, msg.data, len), ==,
+ AGENT_MSG_FILTER_OK);
+ }
+
+ /* filter everything */
+ agent_msg_filter_config(&filter, FALSE, FALSE, TRUE);
+ for (type = VD_AGENT_MOUSE_STATE; type < VD_AGENT_END_MESSAGE; type++) {
+ AgentMsgFilterResult result;
+ msg.msg_header.type = type;
+ switch (type) {
+ case VD_AGENT_CLIPBOARD:
+ case VD_AGENT_CLIPBOARD_GRAB:
+ case VD_AGENT_CLIPBOARD_REQUEST:
+ case VD_AGENT_CLIPBOARD_RELEASE:
+ case VD_AGENT_FILE_XFER_START:
+ case VD_AGENT_FILE_XFER_STATUS:
+ case VD_AGENT_FILE_XFER_DATA:
+ result = AGENT_MSG_FILTER_DISCARD;
+ break;
+ case VD_AGENT_MONITORS_CONFIG:
+ result = AGENT_MSG_FILTER_MONITORS_CONFIG;
+ break;
+ default:
+ result = AGENT_MSG_FILTER_OK;
+ }
+ g_assert_cmpint(agent_msg_filter_process_data(&filter, msg.data, len), ==, result);
+ }
+}
+
+int main(int argc, char *argv[])
+{
+ g_test_init(&argc, &argv, NULL);
+
+ g_test_add_func("/agent message filter/setup", test_agent_msg_filter_setup);
+ g_test_add_func("/agent message filter/run", test_agent_msg_filter_run);
+
+ return g_test_run();
+}
diff --git a/server/tests/test-channel.cpp b/server/tests/test-channel.cpp
new file mode 100644
index 00000000..a3a470dd
--- /dev/null
+++ b/server/tests/test-channel.cpp
@@ -0,0 +1,280 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2017 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+/*
+ * This test allocate a channel and do some test sending some messages
+ */
+#include <config.h>
+#include <unistd.h>
+#include <spice.h>
+
+#include "test-glib-compat.h"
+#include "basic-event-loop.h"
+#include "reds.h"
+#include "red-client.h"
+#include "cursor-channel.h"
+#include "net-utils.h"
+#include "win-alarm.h"
+#include "push-visibility.h"
+
+/*
+ * Declare a RedTestChannel to be used for the test
+ */
+struct RedTestChannel final: public RedChannel
+{
+ using RedChannel::RedChannel;
+ void on_connect(RedClient *client, RedStream *stream,
+ int migration, RedChannelCapabilities *caps) override;
+};
+
+class RedTestChannelClient final: public RedChannelClient
+{
+ using RedChannelClient::RedChannelClient;
+ uint8_t * alloc_recv_buf(uint16_t type, uint32_t size) override;
+ void release_recv_buf(uint16_t type, uint32_t size, uint8_t *msg) override;
+};
+
+void
+RedTestChannel::on_connect(RedClient *client, RedStream *stream,
+ int migration, RedChannelCapabilities *caps)
+{
+ auto rcc =
+ red::make_shared<RedTestChannelClient>(this, client, stream, caps);
+ g_assert(rcc);
+ g_assert_true(rcc->init());
+
+ // requires an ACK after 10 messages
+ rcc->ack_set_client_window(10);
+
+ // initialize ACK feature
+ rcc->ack_zero_messages_window();
+ rcc->push_set_ack();
+
+ // send enough messages till we should require an ACK
+ // the ACK is waited after 2 * 10, append some other messages
+ for (int i = 0; i < 25; ++i) {
+ rcc->pipe_add_empty_msg(SPICE_MSG_MIGRATE_DATA);
+ }
+}
+
+uint8_t *
+RedTestChannelClient::alloc_recv_buf(uint16_t type, uint32_t size)
+{
+ return static_cast<uint8_t *>(g_malloc(size));
+}
+
+void
+RedTestChannelClient::release_recv_buf(uint16_t type, uint32_t size, uint8_t *msg)
+{
+ g_free(msg);
+}
+
+
+/*
+ * Main test part
+ */
+using watch_add_t = SpiceWatch *(const SpiceCoreInterfaceInternal *iface,
+ int fd, int event_mask, SpiceWatchFunc func, void *opaque);
+static watch_add_t *old_watch_add = nullptr;
+static SpiceWatchFunc old_watch_func = nullptr;
+
+static int watch_called_countdown = 5;
+
+// this function is injected in the RedChannelClient watch function
+static void watch_func_inject(int fd, int event, void *opaque)
+{
+ // check we are not doing too many loops
+ if (--watch_called_countdown <= 0) {
+ spice_error("Watch called too many times");
+ }
+ old_watch_func(fd, event, opaque);
+}
+
+static SpiceWatch *
+watch_add_inject(const SpiceCoreInterfaceInternal *iface,
+ int fd, int event_mask, SpiceWatchFunc func, void *opaque)
+{
+ g_assert_null(old_watch_func);
+ old_watch_func = func;
+ SpiceWatch* ret = old_watch_add(iface, fd, event_mask, watch_func_inject, opaque);
+ return ret;
+}
+
+static int client_socket = -1;
+
+static void send_ack_sync(int socket, uint32_t generation)
+{
+ struct {
+ uint16_t dummy;
+ uint16_t type;
+ uint32_t len;
+ uint32_t generation;
+ } msg;
+ SPICE_VERIFY(sizeof(msg) == 12);
+ msg.type = GUINT16_TO_LE(SPICE_MSGC_ACK_SYNC);
+ msg.len = GUINT32_TO_LE(sizeof(generation));
+ msg.generation = GUINT32_TO_LE(generation);
+
+ g_assert_cmpint(socket_write(socket, reinterpret_cast<uint8_t *>(&msg) + 2, 10), ==, 10);
+}
+
+static SpiceTimer *waked_up_timer;
+
+// timer waiting we get data again
+static void timer_wakeup(void *opaque)
+{
+ auto core = static_cast<SpiceCoreInterface *>(opaque);
+
+ // check we are receiving data again
+ size_t got_data = 0;
+ ssize_t len;
+ alarm(1);
+ char buffer[256];
+ while ((len=socket_read(client_socket, buffer, sizeof(buffer))) > 0)
+ got_data += len;
+ alarm(0);
+
+ g_assert_cmpint(got_data, >, 0);
+
+ core->timer_remove(waked_up_timer);
+
+ basic_event_loop_quit();
+}
+
+// timeout, now we can send the ack
+// if we arrive here it means we didn't receive too many watch events
+static void timeout_watch_count(void *opaque)
+{
+ auto core = static_cast<SpiceCoreInterface *>(opaque);
+
+ // get all pending data
+ alarm(1);
+ char buffer[256];
+ while (socket_read(client_socket, buffer, sizeof(buffer)) > 0)
+ continue;
+ alarm(0);
+
+ // we don't need to count anymore
+ watch_called_countdown = 20;
+
+ // send ack reply, this should unblock data from RedChannelClient
+ g_assert_cmpint(socket_write(client_socket, "\2\0\0\0\0\0", 6), ==, 6);
+
+ // expect data soon
+ waked_up_timer = core->timer_add(timer_wakeup, core);
+ core->timer_start(waked_up_timer, 100);
+ // TODO watch
+}
+
+static RedStream *create_dummy_stream(SpiceServer *server, int *p_socket)
+{
+ int sv[2];
+ g_assert_cmpint(socketpair(AF_LOCAL, SOCK_STREAM, 0, sv), ==, 0);
+ if (p_socket) {
+ *p_socket = sv[1];
+ }
+ red_socket_set_non_blocking(sv[0], true);
+ red_socket_set_non_blocking(sv[1], true);
+
+ RedStream * stream = red_stream_new(server, sv[0]);
+ g_assert_nonnull(stream);
+
+ return stream;
+}
+
+static void channel_loop()
+{
+ SpiceCoreInterface *core;
+ SpiceServer *server = spice_server_new();
+
+ g_assert_nonnull(server);
+
+ core = basic_event_loop_init();
+ g_assert_nonnull(core);
+
+ g_assert_cmpint(spice_server_init(server, core), ==, 0);
+
+ // create a channel and connect to it
+ auto channel =
+ red::make_shared<RedTestChannel>(server,
+ SPICE_CHANNEL_PORT, // any other than main is fine
+ 0,
+ RedChannel::HandleAcks); // we want to test this
+
+ // create dummy RedClient and MainChannelClient
+ RedChannelCapabilities caps;
+ memset(&caps, 0, sizeof(caps));
+ uint32_t common_caps = 1 << SPICE_COMMON_CAP_MINI_HEADER;
+ caps.num_common_caps = 1;
+ caps.common_caps = static_cast<uint32_t *>(spice_memdup(&common_caps, sizeof(common_caps)));
+
+ RedClient *client = red_client_new(server, FALSE);
+ g_assert_nonnull(client);
+
+ red::shared_ptr<MainChannel> main_channel(main_channel_new(server));
+ g_assert(main_channel);
+
+ MainChannelClient *mcc;
+ mcc = main_channel_link(main_channel.get(), client, create_dummy_stream(server, nullptr),
+ 0, FALSE, &caps);
+ g_assert_nonnull(mcc);
+
+ // inject a trace into the core interface to count the events
+ SpiceCoreInterfaceInternal *server_core = reds_get_core_interface(server);
+ old_watch_add = server_core->watch_add;
+ server_core->watch_add = watch_add_inject;
+
+ // create our testing RedChannelClient
+ channel->connect(client, create_dummy_stream(server, &client_socket),
+ FALSE, &caps);
+ red_channel_capabilities_reset(&caps);
+
+ // remove code to inject code during RedChannelClient watch, we set it
+ g_assert_nonnull(old_watch_func);
+ server_core->watch_add = old_watch_add;
+
+ send_ack_sync(client_socket, 1);
+
+ // set a timeout when to send back the acknowledge,
+ // during this time we check not receiving too many events
+ SpiceTimer *watch_timer;
+ watch_timer = core->timer_add(timeout_watch_count, core);
+ core->timer_start(watch_timer, 100);
+
+ // start all test
+ basic_event_loop_mainloop();
+
+ // cleanup
+ client->destroy();
+ main_channel.reset();
+ channel.reset();
+
+ core->timer_remove(watch_timer);
+
+ spice_server_destroy(server);
+
+ basic_event_loop_destroy();
+}
+
+int main(int argc, char *argv[])
+{
+ g_test_init(&argc, &argv, NULL);
+
+ g_test_add_func("/server/channel", channel_loop);
+
+ return g_test_run();
+}
diff --git a/server/tests/test-codecs-parsing.c b/server/tests/test-codecs-parsing.c
new file mode 100644
index 00000000..1a1bc6e2
--- /dev/null
+++ b/server/tests/test-codecs-parsing.c
@@ -0,0 +1,158 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2016 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+#include <spice.h>
+
+#include "test-glib-compat.h"
+
+static void codecs_good(void)
+{
+ guint i;
+ const gchar *codecs[] = {
+ "spice:mjpeg",
+ "spice:mjpeg;;;",
+ "spice:mjpeg;;spice:mjpeg;;;",
+ ";;spice:mjpeg;;spice:mjpeg;;;",
+#if defined(HAVE_GSTREAMER_1_0)
+ "gstreamer:mjpeg;gstreamer:h264;gstreamer:vp8;",
+ ";;spice:mjpeg;;gstreamer:mjpeg;gstreamer:h264;gstreamer:vp8;",
+#endif
+ };
+
+ SpiceServer *server = spice_server_new();
+
+ g_assert_nonnull(server);
+
+ for (i = 0; i < G_N_ELEMENTS(codecs); ++i) {
+ g_assert_cmpint(spice_server_set_video_codecs(server, codecs[i]), ==, 0);
+ }
+
+ spice_server_destroy(server);
+}
+
+static void codecs_bad(void)
+{
+ guint i;
+ const struct {
+ const gchar *codecs;
+ const GLogLevelFlags log_level;
+ const gchar *error_message;
+ gboolean default_err_message;
+ } test_cases[] = {
+ {
+ "",
+ G_LOG_LEVEL_WARNING,
+ "*Failed to set video codecs*",
+ FALSE,
+ },{
+ ";",
+ G_LOG_LEVEL_WARNING,
+ "*Failed to set video codecs*",
+ FALSE,
+ },{
+ ";;;;",
+ G_LOG_LEVEL_WARNING,
+ "*Failed to set video codecs*",
+ FALSE,
+ },{
+ NULL,
+ G_LOG_LEVEL_CRITICAL,
+ "*assertion 'codecs != nullptr' failed",
+ FALSE,
+ },{
+ ";:;",
+ G_LOG_LEVEL_WARNING,
+ "*spice: invalid encoder:codec value*",
+ TRUE,
+ },{
+ "::::",
+ G_LOG_LEVEL_WARNING,
+ "*spice: invalid encoder:codec value*",
+ TRUE,
+ },{
+ "missingcolon",
+ G_LOG_LEVEL_WARNING,
+ "*spice: invalid encoder:codec value*",
+ TRUE,
+ },{
+ ":missing_encoder",
+ G_LOG_LEVEL_WARNING,
+ "*spice: invalid encoder:codec value*",
+ TRUE,
+ },{
+ "missing_value:;",
+ G_LOG_LEVEL_WARNING,
+ "*spice: invalid encoder:codec value*",
+ TRUE,
+ },{
+ "unknown_encoder:mjpeg",
+ G_LOG_LEVEL_WARNING,
+ "*spice: unknown video encoder unknown_encoder",
+ TRUE,
+ },{
+ "spice:unknown_codec",
+ G_LOG_LEVEL_WARNING,
+ "*spice: unknown video codec unknown_codec",
+ TRUE,
+ },{
+ // invalid characters in encoder
+ "spice&:mjpeg",
+ G_LOG_LEVEL_WARNING,
+ "*spice: invalid encoder:codec value*",
+ TRUE,
+ },{
+ // invalid character in codec
+ "spice:mjpeg&",
+ G_LOG_LEVEL_WARNING,
+ "*spice: invalid encoder:codec value*",
+ TRUE,
+ },
+#if !defined(HAVE_GSTREAMER_1_0)
+ {
+ "gstreamer:mjpeg",
+ G_LOG_LEVEL_WARNING,
+ "*spice: unsupported video encoder gstreamer",
+ TRUE,
+ }
+#endif
+ };
+
+ SpiceServer *server = spice_server_new();
+
+ g_assert_nonnull(server);
+
+ for (i = 0; i < G_N_ELEMENTS(test_cases); ++i) {
+ g_test_expect_message(G_LOG_DOMAIN, test_cases[i].log_level, test_cases[i].error_message);
+ if (test_cases[i].default_err_message)
+ g_test_expect_message(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, "*Failed to set video codecs*");
+ g_assert_cmpint(spice_server_set_video_codecs(server, test_cases[i].codecs), !=, 0);
+ g_test_assert_expected_messages();
+ }
+
+ spice_server_destroy(server);
+}
+
+int main(int argc, char *argv[])
+{
+ g_test_init(&argc, &argv, NULL);
+
+ g_test_add_func("/server/codecs-good", codecs_good);
+ g_test_add_func("/server/codecs-bad", codecs_bad);
+
+ return g_test_run();
+}
diff --git a/server/tests/test-dispatcher.cpp b/server/tests/test-dispatcher.cpp
new file mode 100644
index 00000000..b6a933b3
--- /dev/null
+++ b/server/tests/test-dispatcher.cpp
@@ -0,0 +1,148 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2020 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+/**
+ * Test Dispatcher class and speed
+ */
+
+#include <config.h>
+
+#include <cstdio>
+#include <cstdlib>
+
+#include "basic-event-loop.h"
+#include "test-glib-compat.h"
+#include "reds.h"
+#include "dispatcher.h"
+#include "win-alarm.h"
+
+// iterations to run for each test, useful also to check the speed
+static unsigned iterations = 100;
+
+static SpiceCoreInterface *core;
+static SpiceCoreInterfaceInternal core_int;
+static red::shared_ptr<Dispatcher> dispatcher;
+static SpiceWatch *watch;
+// incremental number we use during the test, each message sent is incremented
+static unsigned num;
+using TestFixture = int;
+
+static void test_dispatcher_setup(TestFixture *fixture, gconstpointer user_data)
+{
+ num = 0;
+ dispatcher.reset();
+ g_assert_null(core);
+ core = basic_event_loop_init();
+ g_assert_nonnull(core);
+ core_int = core_interface_adapter;
+ core_int.public_interface = core;
+ dispatcher = red::make_shared<Dispatcher>(10);
+ // TODO not create Reds, just the internal interface ??
+ watch = dispatcher->create_watch(&core_int);
+}
+
+static void test_dispatcher_teardown(TestFixture *fixture, gconstpointer user_data)
+{
+ g_assert_nonnull(core);
+
+ red_watch_remove(watch);
+ watch = nullptr;
+ dispatcher.reset();
+ basic_event_loop_destroy();
+ core = nullptr;
+}
+
+// test message to sent
+struct Msg {
+ uint64_t num;
+ void *dummy;
+};
+
+// message handler to mark stop, stop the event loop
+static void msg_end(void *, Msg *msg)
+{
+ g_assert_cmpint(num, ==, iterations);
+ basic_event_loop_quit();
+}
+
+// message handler to check message number
+static void msg_check(void *, Msg *msg)
+{
+ g_assert_cmpint(msg->num, ==, num);
+ ++num;
+}
+
+static void *thread_proc(void *arg)
+{
+ // the argument is number of messages with NACK to send
+ int n_nack = GPOINTER_TO_INT(arg);
+ g_assert_cmpint(n_nack, >=, 0);
+ g_assert_cmpint(n_nack, <=, 10);
+
+ auto start = spice_get_monotonic_time_ns();
+
+ // repeat sending messages
+ for (unsigned n = 0; n < iterations; ++n) {
+ Msg msg{n, nullptr};
+ dispatcher->send_message_custom(msg_check, &msg, (n % 10) >= n_nack);
+ }
+
+ // one last sync to wait
+ Msg msg{0, nullptr};
+ dispatcher->send_message_custom(msg_end, &msg, true);
+
+ // measure time
+ auto cost = spice_get_monotonic_time_ns() - start;
+
+ printf("With ACK/NACK %d/%d time spent %gus each over %u iterations\n",
+ 10 - n_nack, n_nack,
+ cost / 1000.0 / iterations, iterations);
+ return nullptr;
+}
+
+static void test_dispatcher(TestFixture *fixture, gconstpointer user_data)
+{
+ pthread_t th;
+
+ g_assert_cmpint(pthread_create(&th, nullptr, thread_proc, (void *) user_data), ==, 0);
+
+ // start all test
+ alarm(20);
+ basic_event_loop_mainloop();
+ alarm(0);
+
+ pthread_join(th, nullptr);
+}
+
+int main(int argc, char *argv[])
+{
+ g_test_init(&argc, &argv, NULL);
+
+ // override number of iteration passing a parameter
+ if (argc >= 2 && atoi(argv[1]) > 10) {
+ iterations = atoi(argv[1]);
+ }
+
+ for (int i = 0; i <= 10; ++i) {
+ char name[64];
+ sprintf(name, "/server/dispatcher/%d", i);
+ g_test_add(name, TestFixture, GINT_TO_POINTER(i), test_dispatcher_setup,
+ test_dispatcher, test_dispatcher_teardown);
+ }
+
+ return g_test_run();
+}
diff --git a/server/tests/test_display_base.c b/server/tests/test-display-base.cpp
index 1c909fbf..b220b7fe 100644
--- a/server/tests/test_display_base.c
+++ b/server/tests/test-display-base.cpp
@@ -1,21 +1,47 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
#include <config.h>
-#include <stdlib.h>
-#include <math.h>
-#include <string.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <signal.h>
-#include <wait.h>
+
+#include <cmath>
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
+
+#ifndef _WIN32
+#include <sys/wait.h>
#include <sys/select.h>
-#include <sys/types.h>
+#endif
#include <getopt.h>
+#include <pthread.h>
+#include <sys/types.h>
+#include <unistd.h>
-#include "spice.h"
+#include "spice-wrapped.h"
#include <spice/qxl_dev.h>
-#include "test_display_base.h"
-#include "red_channel.h"
-#include "test_util.h"
+#include "test-display-base.h"
+#include "test-glib-compat.h"
+#include "red-channel.h"
+
+#ifndef PATH_MAX
+#define PATH_MAX 4096
+#endif
#define MEM_SLOT_GROUP_ID 0
@@ -24,17 +50,17 @@
/* Parts cribbed from spice-display.h/.c/qxl.c */
-typedef struct SimpleSpiceUpdate {
+struct SimpleSpiceUpdate {
QXLCommandExt ext; // first
QXLDrawable drawable;
QXLImage image;
uint8_t *bitmap;
-} SimpleSpiceUpdate;
+};
-typedef struct SimpleSurfaceCmd {
+struct SimpleSurfaceCmd {
QXLCommandExt ext; // first
QXLSurfaceCmd surface_cmd;
-} SimpleSurfaceCmd;
+};
static void test_spice_destroy_update(SimpleSpiceUpdate *update)
{
@@ -42,11 +68,11 @@ static void test_spice_destroy_update(SimpleSpiceUpdate *update)
return;
}
if (update->drawable.clip.type != SPICE_CLIP_TYPE_NONE) {
- uint8_t *ptr = (uint8_t*)update->drawable.clip.data;
- free(ptr);
+ auto ptr = reinterpret_cast<uint8_t *>(static_cast<uintptr_t>(update->drawable.clip.data));
+ g_free(ptr);
}
- free(update->bitmap);
- free(update);
+ g_free(update->bitmap);
+ g_free(update);
}
#define DEFAULT_WIDTH 640
@@ -63,17 +89,23 @@ static int control = 3; //used to know when we can take a screenshot
static int rects = 16; //number of rects that will be draw
static int has_automated_tests = 0; //automated test flag
-__attribute__((noreturn))
-static void sigchld_handler(SPICE_GNUC_UNUSED int signal_num) // wait for the child process and exit
+// SPICE implementation is not designed to have a timer shared
+// between multiple threads so use a mutex
+static pthread_mutex_t timer_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+// wait for the child process and exit
+static void child_exited(GPid pid, gint status, gpointer user_data)
{
- int status;
- wait(&status);
+ g_spawn_close_pid(pid);
exit(0);
}
-static void regression_test(void)
+static void regression_test()
{
- pid_t pid;
+ GPid pid;
+ GError *error = nullptr;
+ gboolean retval;
+ gchar **argv;
if (--rects != 0) {
return;
@@ -85,17 +117,21 @@ static void regression_test(void)
return;
}
- pid = fork();
- if (pid == 0) {
- char buf[PATH_MAX];
- char *argv[] = { NULL };
- char *envp[] = {buf, NULL};
+ argv = g_strsplit("./regression-test.py", " ", -1);
+ retval =
+ g_spawn_async(nullptr, argv, nullptr,
+ static_cast<GSpawnFlags>(G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD),
+ nullptr, nullptr, &pid, &error);
+ g_strfreev(argv);
+ g_assert(retval);
- snprintf(buf, sizeof(buf), "PATH=%s", getenv("PATH"));
- execve("regression_test.py", argv, envp);
- } else if (pid > 0) {
- return;
- }
+ GSource *source = g_child_watch_source_new(pid);
+ g_source_set_callback(source,
+ reinterpret_cast<GSourceFunc>(reinterpret_cast<void *>(child_exited)),
+ nullptr, nullptr);
+ guint id = g_source_attach(source, basic_event_loop_get_context());
+ g_assert(id != 0);
+ g_source_unref(source);
}
static void set_cmd(QXLCommandExt *ext, uint32_t type, QXLPHYSICAL data)
@@ -113,11 +149,11 @@ static void simple_set_release_info(QXLReleaseInfo *info, intptr_t ptr)
//info->group_id = MEM_SLOT_GROUP_ID;
}
-typedef struct Path {
+struct Path {
int t;
int min_t;
int max_t;
-} Path;
+};
static void path_init(Path *path, int min, int max)
{
@@ -145,11 +181,12 @@ static void draw_pos(Test *test, int t, int *x, int *y)
}
/* bitmap and rects are freed, so they must be allocated with malloc */
-SimpleSpiceUpdate *test_spice_create_update_from_bitmap(uint32_t surface_id,
- QXLRect bbox,
- uint8_t *bitmap,
- uint32_t num_clip_rects,
- QXLRect *clip_rects)
+static SimpleSpiceUpdate *
+test_spice_create_update_from_bitmap(uint32_t surface_id,
+ QXLRect bbox,
+ uint8_t *bitmap,
+ uint32_t num_clip_rects,
+ QXLRect *clip_rects)
{
SimpleSpiceUpdate *update;
QXLDrawable *drawable;
@@ -159,7 +196,7 @@ SimpleSpiceUpdate *test_spice_create_update_from_bitmap(uint32_t surface_id,
bh = bbox.bottom - bbox.top;
bw = bbox.right - bbox.left;
- update = calloc(sizeof(*update), 1);
+ update = g_new0(SimpleSpiceUpdate, 1);
update->bitmap = bitmap;
drawable = &update->drawable;
image = &update->image;
@@ -172,7 +209,8 @@ SimpleSpiceUpdate *test_spice_create_update_from_bitmap(uint32_t surface_id,
} else {
QXLClipRects *cmd_clip;
- cmd_clip = calloc(sizeof(QXLClipRects) + num_clip_rects*sizeof(QXLRect), 1);
+ cmd_clip = static_cast<QXLClipRects *>(
+ g_malloc0(sizeof(QXLClipRects) + num_clip_rects * sizeof(QXLRect)));
cmd_clip->num_rects = num_clip_rects;
cmd_clip->chunk.data_size = num_clip_rects*sizeof(QXLRect);
cmd_clip->chunk.prev_chunk = cmd_clip->chunk.next_chunk = 0;
@@ -181,7 +219,7 @@ SimpleSpiceUpdate *test_spice_create_update_from_bitmap(uint32_t surface_id,
drawable->clip.type = SPICE_CLIP_TYPE_RECTS;
drawable->clip.data = (intptr_t)cmd_clip;
- free(clip_rects);
+ g_free(clip_rects);
}
drawable->effect = QXL_EFFECT_OPAQUE;
simple_set_release_info(&drawable->release_info, (intptr_t)update);
@@ -210,7 +248,8 @@ SimpleSpiceUpdate *test_spice_create_update_from_bitmap(uint32_t surface_id,
return update;
}
-static SimpleSpiceUpdate *test_spice_create_update_solid(uint32_t surface_id, QXLRect bbox, uint32_t color)
+static SimpleSpiceUpdate *test_spice_create_update_solid(uint32_t surface_id, QXLRect bbox,
+ uint32_t solid_color)
{
uint8_t *bitmap;
uint32_t *dst;
@@ -221,14 +260,14 @@ static SimpleSpiceUpdate *test_spice_create_update_solid(uint32_t surface_id, QX
bw = bbox.right - bbox.left;
bh = bbox.bottom - bbox.top;
- bitmap = malloc(bw * bh * 4);
- dst = (uint32_t *)bitmap;
+ bitmap = static_cast<uint8_t *>(g_malloc(bw * bh * 4));
+ dst = SPICE_ALIGNED_CAST(uint32_t *, bitmap);
for (i = 0 ; i < bh * bw ; ++i, ++dst) {
- *dst = color;
+ *dst = solid_color;
}
- return test_spice_create_update_from_bitmap(surface_id, bbox, bitmap, 0, NULL);
+ return test_spice_create_update_from_bitmap(surface_id, bbox, bitmap, 0, nullptr);
}
static SimpleSpiceUpdate *test_spice_create_update_draw(Test *test, uint32_t surface_id, int t)
@@ -256,7 +295,7 @@ static SimpleSpiceUpdate *test_spice_create_update_draw(Test *test, uint32_t sur
bw = test->primary_width/SINGLE_PART;
bh = 48;
- bitmap = dst = malloc(bw * bh * 4);
+ bitmap = dst = static_cast<uint8_t *>(g_malloc(bw * bh * 4));
//printf("allocated %p\n", dst);
for (i = 0 ; i < bh * bw ; ++i, dst+=4) {
@@ -268,7 +307,7 @@ static SimpleSpiceUpdate *test_spice_create_update_draw(Test *test, uint32_t sur
bbox.left = left; bbox.top = top;
bbox.right = left + bw; bbox.bottom = top + bh;
- return test_spice_create_update_from_bitmap(surface_id, bbox, bitmap, 0, NULL);
+ return test_spice_create_update_from_bitmap(surface_id, bbox, bitmap, 0, nullptr);
}
static SimpleSpiceUpdate *test_spice_create_update_copy_bits(Test *test, uint32_t surface_id)
@@ -277,11 +316,11 @@ static SimpleSpiceUpdate *test_spice_create_update_copy_bits(Test *test, uint32_
QXLDrawable *drawable;
int bw, bh;
QXLRect bbox = {
- .left = 10,
.top = 0,
+ .left = 10,
};
- update = calloc(sizeof(*update), 1);
+ update = g_new0(SimpleSpiceUpdate, 1);
drawable = &update->drawable;
bw = test->primary_width/SINGLE_PART;
@@ -326,7 +365,7 @@ static int format_to_bpp(int format)
static SimpleSurfaceCmd *create_surface(int surface_id, int format, int width, int height, uint8_t *data)
{
- SimpleSurfaceCmd *simple_cmd = calloc(sizeof(SimpleSurfaceCmd), 1);
+ auto simple_cmd = g_new0(SimpleSurfaceCmd, 1);
QXLSurfaceCmd *surface_cmd = &simple_cmd->surface_cmd;
int bpp = format_to_bpp(format);
@@ -345,7 +384,7 @@ static SimpleSurfaceCmd *create_surface(int surface_id, int format, int width, i
static SimpleSurfaceCmd *destroy_surface(int surface_id)
{
- SimpleSurfaceCmd *simple_cmd = calloc(sizeof(SimpleSurfaceCmd), 1);
+ auto simple_cmd = g_new0(SimpleSurfaceCmd, 1);
QXLSurfaceCmd *surface_cmd = &simple_cmd->surface_cmd;
set_cmd(&simple_cmd->ext, QXL_CMD_SURFACE, (intptr_t)surface_cmd);
@@ -361,10 +400,10 @@ static void create_primary_surface(Test *test, uint32_t width,
{
QXLDevSurfaceCreate surface = { 0, };
- ASSERT(height <= MAX_HEIGHT);
- ASSERT(width <= MAX_WIDTH);
- ASSERT(height > 0);
- ASSERT(width > 0);
+ spice_assert(height <= MAX_HEIGHT);
+ spice_assert(width <= MAX_WIDTH);
+ spice_assert(height > 0);
+ spice_assert(width > 0);
surface.format = SPICE_SURFACE_FMT_32_xRGB;
surface.width = test->primary_width = width;
@@ -374,7 +413,7 @@ static void create_primary_surface(Test *test, uint32_t width,
surface.flags = 0;
surface.type = 0; /* unused by red_worker */
surface.position = 0; /* unused by red_worker */
- surface.mem = (uint64_t)&test->primary_surface;
+ surface.mem = (uintptr_t)&test->primary_surface;
surface.group_id = MEM_SLOT_GROUP_ID;
test->width = width;
@@ -383,7 +422,7 @@ static void create_primary_surface(Test *test, uint32_t width,
spice_qxl_create_primary_surface(&test->qxl_instance, 0, &surface);
}
-QXLDevMemSlot slot = {
+static QXLDevMemSlot slot = {
.slot_group_id = MEM_SLOT_GROUP_ID,
.slot_id = 0,
.generation = 0,
@@ -393,20 +432,11 @@ QXLDevMemSlot slot = {
.qxl_ram_size = ~0,
};
-static void attache_worker(QXLInstance *qin, QXLWorker *_qxl_worker)
+static void attached_worker(QXLInstance *qin)
{
Test *test = SPICE_CONTAINEROF(qin, Test, qxl_instance);
- if (test->qxl_worker) {
- if (test->qxl_worker != _qxl_worker)
- printf("%s ignored, %p is set, ignoring new %p\n", __func__,
- test->qxl_worker, _qxl_worker);
- else
- printf("%s ignored, redundant\n", __func__);
- return;
- }
printf("%s\n", __func__);
- test->qxl_worker = _qxl_worker;
spice_qxl_add_memslot(&test->qxl_instance, &slot);
create_primary_surface(test, DEFAULT_WIDTH, DEFAULT_HEIGHT);
spice_server_vm_start(test->server);
@@ -418,11 +448,6 @@ static void set_compression_level(SPICE_GNUC_UNUSED QXLInstance *qin,
printf("%s\n", __func__);
}
-static void set_mm_time(SPICE_GNUC_UNUSED QXLInstance *qin,
- SPICE_GNUC_UNUSED uint32_t mm_time)
-{
-}
-
// we now have a secondary surface
#define MAX_SURFACE_NUM 2
@@ -443,49 +468,54 @@ static void get_init_info(SPICE_GNUC_UNUSED QXLInstance *qin,
// which cannot be done from red_worker context (not via dispatcher,
// since you get a deadlock, and it isn't designed to be done
// any other way, so no point testing that).
-int commands_end = 0;
-int commands_start = 0;
-struct QXLCommandExt* commands[1024];
+static unsigned int commands_end = 0;
+static unsigned int commands_start = 0;
+static struct QXLCommandExt* commands[1024];
+static pthread_mutex_t command_mutex = PTHREAD_MUTEX_INITIALIZER;
-#define COMMANDS_SIZE COUNT(commands)
+#define COMMANDS_SIZE G_N_ELEMENTS(commands)
static void push_command(QXLCommandExt *ext)
{
- ASSERT(commands_end - commands_start < (int) COMMANDS_SIZE);
+ pthread_mutex_lock(&command_mutex);
+ spice_assert(commands_end - commands_start < COMMANDS_SIZE);
commands[commands_end % COMMANDS_SIZE] = ext;
commands_end++;
+ pthread_mutex_unlock(&command_mutex);
}
-static struct QXLCommandExt *get_simple_command(void)
+static int get_num_commands()
{
- struct QXLCommandExt *ret = commands[commands_start % COMMANDS_SIZE];
- ASSERT(commands_start < commands_end);
- commands_start++;
- return ret;
+ return commands_end - commands_start;
}
-static int get_num_commands(void)
+static struct QXLCommandExt *get_simple_command()
{
- return commands_end - commands_start;
+ pthread_mutex_lock(&command_mutex);
+ struct QXLCommandExt *ret = nullptr;
+ if (get_num_commands() > 0) {
+ ret = commands[commands_start % COMMANDS_SIZE];
+ commands_start++;
+ }
+ pthread_mutex_unlock(&command_mutex);
+ return ret;
}
// called from spice_server thread (i.e. red_worker thread)
static int get_command(SPICE_GNUC_UNUSED QXLInstance *qin,
struct QXLCommandExt *ext)
{
- if (get_num_commands() == 0) {
+ struct QXLCommandExt *cmd = get_simple_command();
+ if (!cmd) {
return FALSE;
}
- *ext = *get_simple_command();
+ *ext = *cmd;
return TRUE;
}
static void produce_command(Test *test)
{
Command *command;
- QXLWorker *qxl_worker = test->qxl_worker;
-
- ASSERT(qxl_worker);
if (test->has_secondary)
test->target_surface = 1;
@@ -509,13 +539,13 @@ static void produce_command(Test *test)
break;
case SIMPLE_UPDATE: {
QXLRect rect = {
+ .top = 0,
.left = 0,
+ .bottom = (test->target_surface == 0 ? test->primary_height : test->height),
.right = (test->target_surface == 0 ? test->primary_width : test->width),
- .top = 0,
- .bottom = (test->target_surface == 0 ? test->primary_height : test->height)
};
if (rect.right > 0 && rect.bottom > 0) {
- spice_qxl_update_area(&test->qxl_instance, test->target_surface, &rect, NULL, 0, 1);
+ spice_qxl_update_area(&test->qxl_instance, test->target_surface, &rect, nullptr, 0, 1);
}
break;
}
@@ -552,7 +582,9 @@ static void produce_command(Test *test)
update = test_spice_create_update_solid(command->solid.surface_id,
command->solid.bbox, command->solid.color);
break;
- default: /* Just to shut up GCC warning (-Wswitch) */
+ default:
+ /* Terminate on unhandled cases - never actually reached */
+ g_assert_not_reached();
break;
}
push_command(&update->ext);
@@ -562,9 +594,9 @@ static void produce_command(Test *test)
case SIMPLE_CREATE_SURFACE: {
SimpleSurfaceCmd *update;
if (command->create_surface.data) {
- ASSERT(command->create_surface.surface_id > 0);
- ASSERT(command->create_surface.surface_id < MAX_SURFACE_NUM);
- ASSERT(command->create_surface.surface_id == 1);
+ spice_assert(command->create_surface.surface_id > 0);
+ spice_assert(command->create_surface.surface_id < MAX_SURFACE_NUM);
+ spice_assert(command->create_surface.surface_id == 1);
update = create_surface(command->create_surface.surface_id,
command->create_surface.format,
command->create_surface.width,
@@ -605,13 +637,15 @@ static int req_cmd_notification(QXLInstance *qin)
{
Test *test = SPICE_CONTAINEROF(qin, Test, qxl_instance);
+ pthread_mutex_lock(&timer_mutex);
test->core->timer_start(test->wakeup_timer, test->wakeup_ms);
+ pthread_mutex_unlock(&timer_mutex);
return TRUE;
}
static void do_wakeup(void *opaque)
{
- Test *test = opaque;
+ auto test = static_cast<Test *>(opaque);
int notify;
test->cursor_notify = NOTIFY_CURSOR_BATCH;
@@ -619,29 +653,31 @@ static void do_wakeup(void *opaque)
produce_command(test);
}
+ pthread_mutex_lock(&timer_mutex);
test->core->timer_start(test->wakeup_timer, test->wakeup_ms);
+ pthread_mutex_unlock(&timer_mutex);
spice_qxl_wakeup(&test->qxl_instance);
}
static void release_resource(SPICE_GNUC_UNUSED QXLInstance *qin,
struct QXLReleaseInfoExt release_info)
{
- QXLCommandExt *ext = (QXLCommandExt*)(unsigned long)release_info.info->id;
+ auto ext = reinterpret_cast<QXLCommandExt *>(static_cast<uintptr_t>(release_info.info->id));
//printf("%s\n", __func__);
- ASSERT(release_info.group_id == MEM_SLOT_GROUP_ID);
+ spice_assert(release_info.group_id == MEM_SLOT_GROUP_ID);
switch (ext->cmd.type) {
case QXL_CMD_DRAW:
- test_spice_destroy_update((void*)ext);
+ test_spice_destroy_update(SPICE_CONTAINEROF(ext, SimpleSpiceUpdate, ext));
break;
case QXL_CMD_SURFACE:
- free(ext);
+ g_free(ext);
break;
case QXL_CMD_CURSOR: {
- QXLCursorCmd *cmd = (QXLCursorCmd *)(unsigned long)ext->cmd.data;
- if (cmd->type == QXL_CURSOR_SET) {
- free(cmd);
+ auto cmd = reinterpret_cast<QXLCursorCmd *>(static_cast<uintptr_t>(ext->cmd.data));
+ if (cmd->type == QXL_CURSOR_SET || cmd->type == QXL_CURSOR_MOVE) {
+ g_free(cmd);
}
- free(ext);
+ g_free(ext);
break;
}
default:
@@ -654,7 +690,7 @@ static void release_resource(SPICE_GNUC_UNUSED QXLInstance *qin,
static struct {
QXLCursor cursor;
- uint8_t data[CURSOR_WIDTH * CURSOR_HEIGHT * 4]; // 32bit per pixel
+ uint8_t data[CURSOR_WIDTH * CURSOR_HEIGHT * 4 + 128]; // 32bit per pixel
} cursor;
static void cursor_init()
@@ -690,17 +726,17 @@ static int get_cursor_command(QXLInstance *qin, struct QXLCommandExt *ext)
}
test->cursor_notify--;
- cmd = calloc(sizeof(QXLCommandExt), 1);
- cursor_cmd = calloc(sizeof(QXLCursorCmd), 1);
+ cmd = g_new0(QXLCommandExt, 1);
+ cursor_cmd = g_new0(QXLCursorCmd, 1);
- cursor_cmd->release_info.id = (unsigned long)cmd;
+ cursor_cmd->release_info.id = (uintptr_t)cmd;
if (set) {
cursor_cmd->type = QXL_CURSOR_SET;
cursor_cmd->u.set.position.x = 0;
cursor_cmd->u.set.position.y = 0;
cursor_cmd->u.set.visible = TRUE;
- cursor_cmd->u.set.shape = (unsigned long)&cursor;
+ cursor_cmd->u.set.shape = (uintptr_t)&cursor;
// Only a white rect (32x32) as cursor
memset(cursor.data, 255, sizeof(cursor.data));
set = 0;
@@ -710,7 +746,7 @@ static int get_cursor_command(QXLInstance *qin, struct QXLCommandExt *ext)
cursor_cmd->u.position.y = y++ % test->primary_height;
}
- cmd->cmd.data = (unsigned long)cursor_cmd;
+ cmd->cmd.data = (uintptr_t)cursor_cmd;
cmd->cmd.type = QXL_CMD_CURSOR;
cmd->group_id = MEM_SLOT_GROUP_ID;
cmd->flags = 0;
@@ -763,16 +799,16 @@ static void set_client_capabilities(QXLInstance *qin,
}
}
-QXLInterface display_sif = {
+static QXLInterface display_sif = {
.base = {
.type = SPICE_INTERFACE_QXL,
.description = "test",
.major_version = SPICE_INTERFACE_QXL_MAJOR,
.minor_version = SPICE_INTERFACE_QXL_MINOR
},
- .attache_worker = attache_worker,
+ { .attached_worker = attached_worker },
.set_compression_level = set_compression_level,
- .set_mm_time = set_mm_time,
+ .set_mm_time = nullptr,
.get_init_info = get_init_info,
/* the callbacks below are called from spice server thread context */
@@ -783,8 +819,10 @@ QXLInterface display_sif = {
.req_cursor_notification = req_cursor_notification,
.notify_update = notify_update,
.flush_resources = flush_resources,
- .client_monitors_config = client_monitors_config,
+ .async_complete = nullptr,
+ .update_area_complete = nullptr,
.set_client_capabilities = set_client_capabilities,
+ .client_monitors_config = client_monitors_config,
};
/* interface for tests */
@@ -793,16 +831,45 @@ void test_add_display_interface(Test* test)
spice_server_add_interface(test->server, &test->qxl_instance.base);
}
-static SpiceBaseInterface base = {
- .type = SPICE_INTERFACE_CHAR_DEVICE,
- .description = "test spice virtual channel char device",
- .major_version = SPICE_INTERFACE_CHAR_DEVICE_MAJOR,
- .minor_version = SPICE_INTERFACE_CHAR_DEVICE_MINOR,
+static int vmc_write(SPICE_GNUC_UNUSED SpiceCharDeviceInstance *sin,
+ SPICE_GNUC_UNUSED const uint8_t *buf,
+ int len)
+{
+ printf("%s: %d\n", __func__, len);
+ return len;
+}
+
+static int vmc_read(SPICE_GNUC_UNUSED SpiceCharDeviceInstance *sin,
+ SPICE_GNUC_UNUSED uint8_t *buf,
+ int len)
+{
+ printf("%s: %d\n", __func__, len);
+ return 0;
+}
+
+static void vmc_state(SPICE_GNUC_UNUSED SpiceCharDeviceInstance *sin,
+ int connected)
+{
+ printf("%s: %d\n", __func__, connected);
+}
+
+
+static SpiceCharDeviceInterface vdagent_sif = {
+ .base = {
+ .type = SPICE_INTERFACE_CHAR_DEVICE,
+ .description = "test spice virtual channel char device",
+ .major_version = SPICE_INTERFACE_CHAR_DEVICE_MAJOR,
+ .minor_version = SPICE_INTERFACE_CHAR_DEVICE_MINOR,
+ },
+ .state = vmc_state,
+ .write = vmc_write,
+ .read = vmc_read,
+
};
-SpiceCharDeviceInstance vdagent_sin = {
+static SpiceCharDeviceInstance vdagent_sin = {
.base = {
- .sif = &base,
+ .sif = &vdagent_sif.base,
},
.subtype = "vdagent",
};
@@ -812,44 +879,77 @@ void test_add_agent_interface(SpiceServer *server)
spice_server_add_interface(server, &vdagent_sin.base);
}
-void test_set_simple_command_list(Test *test, int *simple_commands, int num_commands)
+void test_set_simple_command_list(Test *test, const CommandType *simple_commands, int num_commands)
{
int i;
- /* FIXME: leaks */
- test->commands = malloc(sizeof(*test->commands) * num_commands);
- memset(test->commands, 0, sizeof(*test->commands) * num_commands);
+ g_free(test->commands);
+ test->commands = g_new0(Command, num_commands);
test->num_commands = num_commands;
for (i = 0 ; i < num_commands; ++i) {
test->commands[i].command = simple_commands[i];
}
}
-void test_set_command_list(Test *test, Command *commands, int num_commands)
+void test_set_command_list(Test *test, Command *new_commands, int num_commands)
{
- test->commands = commands;
+ test->commands = new_commands;
test->num_commands = num_commands;
}
+static gboolean ignore_in_use_failures(const gchar *log_domain,
+ GLogLevelFlags log_level,
+ const gchar *message,
+ gpointer user_data)
+{
+ if (!g_str_equal (log_domain, G_LOG_DOMAIN)) {
+ return true;
+ }
+ if ((log_level & G_LOG_LEVEL_WARNING) == 0) {
+ return true;
+ }
+ if (strstr(message, "reds_init_socket: binding socket to ") == nullptr && // bind failure
+ strstr(message, "reds_init_socket: listen: ") == nullptr && // listen failure
+ strstr(message, "Failed to open SPICE sockets") == nullptr) { // global
+ g_print("XXX [%s]\n", message);
+ return true;
+ }
-Test *test_new(SpiceCoreInterface *core)
+ return false;
+}
+
+#define BASE_PORT 5912
+
+Test* test_new(SpiceCoreInterface* core)
{
- int port = 5912;
- Test *test = spice_new0(Test, 1);
- SpiceServer* server = spice_server_new();
+ auto test = g_new0(Test, 1);
+ int port = -1;
test->qxl_instance.base.sif = &display_sif.base;
test->qxl_instance.id = 0;
test->core = core;
- test->server = server;
- test->wakeup_ms = 50;
+ test->wakeup_ms = 1;
test->cursor_notify = NOTIFY_CURSOR_BATCH;
// some common initialization for all display tests
+ port = BASE_PORT;
+
+ g_test_log_set_fatal_handler(ignore_in_use_failures, nullptr);
+ for (port = BASE_PORT; port < BASE_PORT + 10; port++) {
+ SpiceServer* server = spice_server_new();
+ spice_server_set_noauth(server);
+ spice_server_set_port(server, port);
+ if (spice_server_init(server, core) == 0) {
+ test->server = server;
+ break;
+ }
+ spice_server_destroy(server);
+ }
+
+ g_assert_nonnull(test->server);
+
printf("TESTER: listening on port %d (unsecure)\n", port);
- spice_server_set_port(server, port);
- spice_server_set_noauth(server);
- spice_server_init(server, core);
+ g_test_log_set_fatal_handler(nullptr, nullptr);
cursor_init();
path_init(&path, 0, angle_parts);
@@ -858,23 +958,24 @@ Test *test_new(SpiceCoreInterface *core)
return test;
}
-void init_automated()
+void test_destroy(Test *test)
{
- struct sigaction sa;
+ spice_server_destroy(test->server);
+ // this timer is used by spice server so
+ // avoid to free it while is running
+ test->core->timer_remove(test->wakeup_timer);
+ g_free(test->commands);
+ g_free(test);
+}
- memset(&sa, 0, sizeof sa);
- sa.sa_handler = &sigchld_handler;
- sigaction(SIGCHLD, &sa, NULL);
+static void init_automated()
+{
}
-__attribute__((noreturn))
+static SPICE_GNUC_NORETURN
void usage(const char *argv0, const int exitcode)
{
-#ifdef AUTOMATED_TESTS
const char *autoopt=" [--automated-tests]";
-#else
- const char *autoopt="";
-#endif
printf("usage: %s%s\n", argv0, autoopt);
exit(exitcode);
@@ -883,10 +984,8 @@ void usage(const char *argv0, const int exitcode)
void spice_test_config_parse_args(int argc, char **argv)
{
struct option options[] = {
-#ifdef AUTOMATED_TESTS
{"automated-tests", no_argument, &has_automated_tests, 1},
-#endif
- {NULL, 0, NULL, 0},
+ {nullptr, 0, nullptr, 0},
};
int option_index;
int val;
diff --git a/server/tests/test_display_base.h b/server/tests/test-display-base.h
index d2823a70..ee58aae2 100644
--- a/server/tests/test_display_base.h
+++ b/server/tests/test-display-base.h
@@ -1,10 +1,27 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
#ifndef __TEST_DISPLAY_BASE_H__
#define __TEST_DISPLAY_BASE_H__
-#include <spice.h>
-#include "basic_event_loop.h"
+#include "spice-wrapped.h"
+#include "basic-event-loop.h"
-#define COUNT(x) ((sizeof(x)/sizeof(x[0])))
+SPICE_BEGIN_DECLS
/*
* simple queue for commands.
@@ -85,7 +102,6 @@ struct Test {
SpiceServer *server;
QXLInstance qxl_instance;
- QXLWorker *qxl_worker;
uint8_t primary_surface[MAX_HEIGHT * MAX_WIDTH * 4];
int primary_height;
@@ -115,15 +131,19 @@ struct Test {
void (*on_client_disconnected)(Test *test);
};
-void test_set_simple_command_list(Test *test, int *command, int num_commands);
-void test_set_command_list(Test *test, Command *command, int num_commands);
+void test_set_simple_command_list(Test *test,
+ const CommandType *simple_commands, int num_commands);
+void test_set_command_list(Test *test, Command *new_commands, int num_commands);
void test_add_display_interface(Test *test);
void test_add_agent_interface(SpiceServer *server); // TODO - Test *test
Test* test_new(SpiceCoreInterface* core);
+void test_destroy(Test *test);
uint32_t test_get_width(void);
uint32_t test_get_height(void);
void spice_test_config_parse_args(int argc, char **argv);
+SPICE_END_DECLS
+
#endif /* __TEST_DISPLAY_BASE_H__ */
diff --git a/server/tests/test-display-no-ssl.c b/server/tests/test-display-no-ssl.c
new file mode 100644
index 00000000..4e8c0982
--- /dev/null
+++ b/server/tests/test-display-no-ssl.c
@@ -0,0 +1,68 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+/**
+ * Test ground for developing specific tests.
+ *
+ * Any specific test can start of from here and set the server to the
+ * specific required state, and create specific operations or reuse
+ * existing ones in the test_display_base supplied queue.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include "test-display-base.h"
+
+static SpiceCoreInterface *core;
+static SpiceTimer *ping_timer;
+
+static int ping_ms = 100;
+
+static void pinger(SPICE_GNUC_UNUSED void *opaque)
+{
+ core->timer_start(ping_timer, ping_ms);
+}
+
+static const CommandType simple_commands[] = {
+ //SIMPLE_CREATE_SURFACE,
+ //SIMPLE_DRAW,
+ //SIMPLE_DESTROY_SURFACE,
+ //PATH_PROGRESS,
+ SIMPLE_DRAW,
+ //SIMPLE_COPY_BITS,
+ SIMPLE_UPDATE,
+};
+
+int main(void)
+{
+ Test *test;
+
+ core = basic_event_loop_init();
+ test = test_new(core);
+ //spice_server_set_image_compression(server, SPICE_IMAGE_COMPRESSION_OFF);
+ test_add_display_interface(test);
+ test_add_agent_interface(test->server);
+ test_set_simple_command_list(test, simple_commands, G_N_ELEMENTS(simple_commands));
+
+ ping_timer = core->timer_add(pinger, NULL);
+ core->timer_start(ping_timer, ping_ms);
+
+ basic_event_loop_mainloop();
+ test_destroy(test);
+
+ return 0;
+}
diff --git a/server/tests/test-display-resolution-changes.c b/server/tests/test-display-resolution-changes.c
new file mode 100644
index 00000000..ac8c959d
--- /dev/null
+++ b/server/tests/test-display-resolution-changes.c
@@ -0,0 +1,83 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+/**
+ * Recreate the primary surface endlessly.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <stdlib.h>
+#include "test-display-base.h"
+
+static SpiceTimer *ping_timer;
+
+static int ping_ms = 100;
+
+static void pinger(void *opaque)
+{
+ Test *test = (Test*) opaque;
+
+ test->core->timer_start(ping_timer, ping_ms);
+}
+
+static void
+set_primary_params(SPICE_GNUC_UNUSED Test *test, Command *command)
+{
+#if 0
+ static int toggle = 0;
+
+ if (toggle) {
+ *arg1 = 800;
+ *arg2 = 600;
+ } else {
+ *arg1 = 1024;
+ *arg2 = 768;
+ }
+ toggle = 1 - toggle;
+#endif
+ static int count = 0;
+
+ command->create_primary.width = 800 + sin(count / 6.0) * 200;
+ command->create_primary.height = 600 + cos(count / 6.0) * 200;
+ count++;
+}
+
+static Command commands[] = {
+ {DESTROY_PRIMARY, NULL, .cb_opaque = NULL,},
+ {CREATE_PRIMARY, set_primary_params, .cb_opaque = NULL},
+};
+
+int main(void)
+{
+ SpiceCoreInterface *core;
+ Test *test;
+
+ core = basic_event_loop_init();
+ test = test_new(core);
+ //spice_server_set_image_compression(server, SPICE_IMAGE_COMPRESSION_OFF);
+ test_add_display_interface(test);
+ test_set_command_list(test, commands, G_N_ELEMENTS(commands));
+
+ ping_timer = core->timer_add(pinger, test);
+ core->timer_start(ping_timer, ping_ms);
+
+ basic_event_loop_mainloop();
+ test_destroy(test);
+
+ return 0;
+}
diff --git a/server/tests/test_display_streaming.c b/server/tests/test-display-streaming.c
index 45150510..69703a0c 100644
--- a/server/tests/test_display_streaming.c
+++ b/server/tests/test-display-streaming.c
@@ -1,3 +1,20 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
/* Do repeated updates to the same rectangle to trigger stream creation.
*
* TODO: check that stream actually starts programatically (maybe stap?)
@@ -15,7 +32,9 @@
#include <glib.h>
-#include "test_display_base.h"
+#include <common/mem.h>
+
+#include "test-display-base.h"
static int sized;
static int render_last_frame;
@@ -33,8 +52,8 @@ static void create_overlay(Command *command , int width, int height)
cmd->bbox.bottom = height;
cmd->num_clip_rects = 0;
- cmd->bitmap = g_malloc(width * height * 4 );
- dst = (uint32_t *)cmd->bitmap;
+ cmd->bitmap = (uint8_t*) g_malloc(width * height * 4 );
+ dst = SPICE_ALIGNED_CAST(uint32_t *, cmd->bitmap);
for (int i = 0; i < width * height; i++, dst++) {
*dst = 0x8B008B;
}
@@ -104,9 +123,9 @@ static void create_clipped_frame(Test *test, Command *command, int clipping_fact
end_line += 50;
}
- cmd->bitmap = g_malloc(width*height*4);
+ cmd->bitmap = (uint8_t*) g_malloc(width*height*4);
memset(cmd->bitmap, 0xff, width*height*4);
- dst = (uint32_t *)(cmd->bitmap + cur_line*width*4);
+ dst = SPICE_ALIGNED_CAST(uint32_t *, cmd->bitmap + cur_line*width*4);
for (; cur_line < end_line; cur_line++) {
int col;
for (col = 0; col < width; col++, dst++) {
@@ -117,13 +136,13 @@ static void create_clipped_frame(Test *test, Command *command, int clipping_fact
int i;
uint32_t color = 0xffffff & rand();
- dst = (uint32_t *)cmd->bitmap;
+ dst = SPICE_ALIGNED_CAST(uint32_t *, cmd->bitmap);
for (i = 0; i < 50*width; i++, dst++) {
*dst = color;
}
- dst = ((uint32_t *)(cmd->bitmap + (height - 50)*4*width));
+ dst = SPICE_ALIGNED_CAST(uint32_t *, cmd->bitmap + (height - 50)*4*width);
for (i = 0; i < 50*width; i++, dst++) {
*dst = color;
@@ -134,7 +153,7 @@ static void create_clipped_frame(Test *test, Command *command, int clipping_fact
cmd->num_clip_rects = 0;
} else {
cmd->num_clip_rects = 2;
- cmd->clip_rects = calloc(sizeof(QXLRect), 2);
+ cmd->clip_rects = g_new0(QXLRect, 2);
cmd->clip_rects[0].left = OVERLAY_WIDTH;
cmd->clip_rects[0].top = cmd->bbox.top;
cmd->clip_rects[0].right = cmd->bbox.right - clipping_factor;
@@ -151,7 +170,7 @@ static void create_frame1(Test *test, Command *command)
create_clipped_frame(test, command, 0);
}
-void create_frame2(Test *test, Command *command)
+static void create_frame2(Test *test, Command *command)
{
create_clipped_frame(test, command, 200);
}
@@ -196,7 +215,7 @@ static void get_stream_commands(Command *commands, int num_commands,
static void get_commands(Command **commands, int *num_commands)
{
*num_commands = NUM_COMMANDS * 2;
- *commands = calloc(sizeof(Command), *num_commands);
+ *commands = (Command*) calloc(sizeof(Command), *num_commands);
get_stream_commands(*commands, NUM_COMMANDS, create_frame1);
get_stream_commands((*commands) + NUM_COMMANDS, NUM_COMMANDS, create_frame2);
@@ -231,6 +250,6 @@ int main(int argc, char **argv)
get_commands(&commands, &num_commands);
test_set_command_list(test, commands, num_commands);
basic_event_loop_mainloop();
- free(commands);
+ test_destroy(test);
return 0;
}
diff --git a/server/tests/test_display_width_stride.c b/server/tests/test-display-width-stride.c
index 77d3c12c..569f07d4 100644
--- a/server/tests/test_display_width_stride.c
+++ b/server/tests/test-display-width-stride.c
@@ -1,3 +1,20 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
/**
* Recreate the primary surface endlessly.
*/
@@ -5,19 +22,15 @@
#include <config.h>
#include <math.h>
#include <stdlib.h>
-#include "test_display_base.h"
+#include "test-display-base.h"
-SpiceTimer *ping_timer;
+static SpiceTimer *ping_timer;
-void show_channels(SpiceServer *server);
+static int ping_ms = 100;
-int ping_ms = 100;
-
-void pinger(void *opaque)
+static void pinger(void *opaque)
{
- Test *test = opaque;
- // show_channels is not thread safe - fails if disconnections / connections occur
- //show_channels(server);
+ Test *test = (Test*) opaque;
test->core->timer_start(ping_timer, ping_ms);
}
@@ -25,8 +38,8 @@ void pinger(void *opaque)
static int g_surface_id = 1;
static uint8_t *g_surface_data;
-void set_draw_parameters(SPICE_GNUC_UNUSED Test *test,
- Command *command)
+static void
+set_draw_parameters(SPICE_GNUC_UNUSED Test *test, Command *command)
{
static int count = 17;
CommandDrawSolid *solid = &command->solid;
@@ -39,8 +52,8 @@ void set_draw_parameters(SPICE_GNUC_UNUSED Test *test,
count++;
}
-void set_surface_params(SPICE_GNUC_UNUSED Test *test,
- Command *command)
+static void
+set_surface_params(SPICE_GNUC_UNUSED Test *test, Command *command)
{
CommandCreateSurface *create = &command->create_surface;
@@ -51,16 +64,16 @@ void set_surface_params(SPICE_GNUC_UNUSED Test *test,
create->format = SPICE_SURFACE_FMT_8_A;
create->width = 128;
create->height = 128;
- g_surface_data = realloc(g_surface_data, create->width * create->height * 1);
+ g_surface_data = (uint8_t*) g_realloc(g_surface_data, create->width * create->height * 1);
create->surface_id = g_surface_id;
create->data = g_surface_data;
}
-void set_destroy_parameters(SPICE_GNUC_UNUSED Test *test,
- SPICE_GNUC_UNUSED Command *command)
+static void
+set_destroy_parameters(SPICE_GNUC_UNUSED Test *test, SPICE_GNUC_UNUSED Command *command)
{
if (g_surface_data) {
- free(g_surface_data);
+ g_free(g_surface_data);
g_surface_data = NULL;
}
}
@@ -79,9 +92,9 @@ static Command commands[] = {
{SIMPLE_DESTROY_SURFACE, set_destroy_parameters, .cb_opaque = NULL},
};
-void on_client_connected(Test *test)
+static void on_client_connected(Test *test)
{
- test_set_command_list(test, commands, COUNT(commands));
+ test_set_command_list(test, commands, G_N_ELEMENTS(commands));
}
int main(void)
@@ -92,13 +105,14 @@ int main(void)
core = basic_event_loop_init();
test = test_new(core);
test->on_client_connected = on_client_connected;
- //spice_server_set_image_compression(server, SPICE_IMAGE_COMPRESS_OFF);
+ //spice_server_set_image_compression(server, SPICE_IMAGE_COMPRESSION_OFF);
test_add_display_interface(test);
ping_timer = core->timer_add(pinger, test);
core->timer_start(ping_timer, ping_ms);
basic_event_loop_mainloop();
+ test_destroy(test);
return 0;
}
diff --git a/server/tests/test-empty-success.c b/server/tests/test-empty-success.c
new file mode 100644
index 00000000..1079040b
--- /dev/null
+++ b/server/tests/test-empty-success.c
@@ -0,0 +1,112 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+#include <stdlib.h>
+#include <string.h>
+#include <common/log.h>
+#include <spice.h>
+
+static unsigned int watches_created = 0;
+static unsigned int timers_created = 0;
+
+static SpiceWatch *const dummy_watch = (SpiceWatch*)(uintptr_t)0xdeadbeef;
+static SpiceTimer *const dummy_timer = (SpiceTimer*)(uintptr_t)0xbeefdead;
+
+static SpiceTimer*
+timer_add(SPICE_GNUC_UNUSED SpiceTimerFunc func,
+ SPICE_GNUC_UNUSED void *opaque)
+{
+ ++timers_created;
+ return dummy_timer;
+}
+
+static void
+timer_start(SPICE_GNUC_UNUSED SpiceTimer *timer,
+ SPICE_GNUC_UNUSED uint32_t ms)
+{
+ spice_assert(timer == dummy_timer);
+}
+
+static void
+timer_cancel(SPICE_GNUC_UNUSED SpiceTimer *timer)
+{
+ spice_assert(timer == dummy_timer);
+}
+
+static void
+timer_remove(SPICE_GNUC_UNUSED SpiceTimer *timer)
+{
+ spice_assert(timer == dummy_timer);
+}
+
+static SpiceWatch *
+watch_add(SPICE_GNUC_UNUSED int fd,
+ SPICE_GNUC_UNUSED int event_mask,
+ SPICE_GNUC_UNUSED SpiceWatchFunc func,
+ SPICE_GNUC_UNUSED void *opaque)
+{
+ ++watches_created;
+ return dummy_watch;
+}
+
+static void
+watch_update_mask(SPICE_GNUC_UNUSED SpiceWatch *watch,
+ SPICE_GNUC_UNUSED int event_mask)
+{
+ spice_assert(watch == dummy_watch);
+}
+
+static void
+watch_remove(SPICE_GNUC_UNUSED SpiceWatch *watch)
+{
+ spice_assert(watch == dummy_watch);
+}
+
+static void
+channel_event(SPICE_GNUC_UNUSED int event,
+ SPICE_GNUC_UNUSED SpiceChannelEventInfo *info)
+{
+}
+
+int main(void)
+{
+ SpiceServer *server = spice_server_new();
+ SpiceCoreInterface core;
+
+ memset(&core, 0, sizeof(core));
+ core.base.major_version = SPICE_INTERFACE_CORE_MAJOR;
+ core.timer_add = timer_add;
+ core.timer_start = timer_start;
+ core.timer_cancel = timer_cancel;
+ core.timer_remove = timer_remove;
+ core.watch_add = watch_add;
+ core.watch_update_mask = watch_update_mask;
+ core.watch_remove = watch_remove;
+ core.channel_event = channel_event;
+
+ spice_server_set_port(server, 5911);
+ spice_server_init(server, &core);
+
+ spice_server_destroy(server);
+
+ // should have created some timers and watch
+ spice_assert(watches_created > 0);
+ spice_assert(timers_created > 0);
+
+ return 0;
+}
diff --git a/server/tests/test-fail-on-null-core-interface.c b/server/tests/test-fail-on-null-core-interface.c
new file mode 100644
index 00000000..ca96ea01
--- /dev/null
+++ b/server/tests/test-fail-on-null-core-interface.c
@@ -0,0 +1,44 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+#include <spice.h>
+
+#include "test-glib-compat.h"
+
+static SpiceCoreInterface core;
+
+static void empty_core(void)
+{
+ SpiceServer *server = spice_server_new();
+
+ g_test_expect_message(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING,
+ "*bad core interface*");
+ int result = spice_server_init(server, &core);
+ g_assert_cmpint(result, ==, -1);
+ spice_server_set_port(server, 5911);
+ spice_server_destroy(server);
+}
+
+int main(int argc, char *argv[])
+{
+ g_test_init(&argc, &argv, NULL);
+
+ g_test_add_func("/server/empty core", empty_core);
+
+ return g_test_run();
+}
diff --git a/server/tests/test-glib-compat.h b/server/tests/test-glib-compat.h
new file mode 100644
index 00000000..08418baa
--- /dev/null
+++ b/server/tests/test-glib-compat.h
@@ -0,0 +1,57 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2017 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#ifndef TEST_GLIB_COMPAT_H_
+#define TEST_GLIB_COMPAT_H_
+
+#include <glib.h>
+
+/* this avoids deprecation warning */
+static inline void
+g_test_expect_message_no_warnings(const gchar *log_domain, GLogLevelFlags log_level,
+ const gchar *pattern)
+{
+ G_GNUC_BEGIN_IGNORE_DEPRECATIONS
+ g_test_expect_message(log_domain, log_level, pattern);
+ G_GNUC_END_IGNORE_DEPRECATIONS
+}
+static inline void
+g_test_assert_expected_messages_internal_no_warnings(const char *domain,
+ const char *file, int line, const char *func)
+{
+ G_GNUC_BEGIN_IGNORE_DEPRECATIONS
+ g_test_assert_expected_messages_internal(domain, file, line, func);
+ G_GNUC_END_IGNORE_DEPRECATIONS
+}
+#define g_test_expect_message g_test_expect_message_no_warnings
+#define g_test_assert_expected_messages_internal g_test_assert_expected_messages_internal_no_warnings
+
+/* GLIB_CHECK_VERSION(2, 40, 0) */
+#ifndef g_assert_nonnull
+#define g_assert_nonnull g_assert
+#endif
+
+/* Added in glib 2.50 */
+#ifndef G_PID_FORMAT
+#ifndef G_OS_WIN32
+#define G_PID_FORMAT "i"
+#else
+#define G_PID_FORMAT "p"
+#endif /* G_OS_WIN32 */
+#endif /* G_PID_FORMAT */
+
+#endif // TEST_GLIB_COMPAT_H_
diff --git a/server/tests/test-gst.cpp b/server/tests/test-gst.cpp
new file mode 100644
index 00000000..5d920d7d
--- /dev/null
+++ b/server/tests/test-gst.cpp
@@ -0,0 +1,1032 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2016 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+/* Utility to check video encoder code
+ * (see program_description below)
+ */
+#undef NDEBUG
+#include <config.h>
+#include <stdio.h>
+#include <glib.h>
+#include <string.h>
+#include <errno.h>
+#include <math.h>
+#include <pthread.h>
+#include <common/log.h>
+#include <gst/gst.h>
+#include <gst/app/gstappsrc.h>
+#include <gst/app/gstappsink.h>
+
+#include "video-encoder.h"
+#include "spice-bitmap-utils.h"
+#include "reds.h" // reds_get_mm_time
+
+static const char program_description[] =
+ "2 GStreamer plugins are used in a chain like this:\n"
+ " (1) input pipeline -> (2) video encoder -> (3) output pipeline\n"
+ "While converting output from (1) is compared with output of (3)\n"
+ "making sure the streaming is working correctly.\n"
+ "\n"
+ "As an example you can use a command like\n"
+ "\n"
+ " $ ./test-gst -e gstreamer:vp8 -i \\\n"
+ " 'filesrc location=bbb_sunflower_1080p_30fps_normal.mp4 \\\n"
+ " ! decodebin ! videoconvert'\n"
+ "\n"
+ "to check vp8 encoding.";
+
+// clipping informations passed in command line
+typedef enum {
+ COORDS_INVALID,
+ COORDS_NUMBER,
+ COORDS_PERCENT,
+} CoordsUnit;
+static struct {
+ unsigned int value;
+ CoordsUnit unit;
+} clipping_coords[4];
+enum {
+ COORDS_BOX,
+ COORDS_SIZE
+} clipping_type;
+
+typedef struct {
+ gint refs;
+ SpiceBitmap *bitmap;
+} TestFrame;
+
+#define VIDEOCONVERT "videoconvert"
+#define BGRx_CAPS "caps=video/x-raw,format=BGRx"
+
+typedef GstFlowReturn (*SampleProc)(GstSample *sample, void *param);
+
+typedef struct {
+ GstAppSrc *appsrc;
+ GstAppSink *appsink;
+ GstElement *gst_pipeline;
+ SampleProc sample_proc;
+ void *sample_param;
+ gboolean got_eos;
+} TestPipeline;
+
+typedef struct {
+ const char *name;
+ new_video_encoder_t new_encoder;
+ SpiceVideoCodecType coded_type;
+ // see spice-gtk channel-display-gst.c
+ const char *caps;
+ const char *decoder;
+} EncoderInfo;
+
+// our video encoder we are testing
+static VideoEncoder *video_encoder = NULL;
+
+// image settings
+static gboolean top_down = FALSE;
+static SpiceBitmapFmt bitmap_format = SPICE_BITMAP_FMT_32BIT;
+static gint image_split_lines = 60000;
+
+static gboolean clipping_type_computed = FALSE;
+static SpiceRect clipping_rect;
+static pthread_mutex_t frame_queue_mtx = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t frame_queue_cond = PTHREAD_COND_INITIALIZER;
+static GQueue frame_queue = G_QUEUE_INIT;
+// input frames are counted
+static unsigned input_frame_index = 0;
+// file output for report informations like
+// frame output size
+static FILE *file_report;
+static TestPipeline *input_pipeline, *output_pipeline;
+static pthread_mutex_t eos_mtx = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t eos_cond = PTHREAD_COND_INITIALIZER;
+// minimum image different expected, depends on quality
+// and encoder
+static gdouble minimum_psnr = 25;
+static uint64_t starting_bit_rate = 3000000;
+
+// error to return from main()
+static int global_test_error = 0;
+
+static void compute_clipping_rect(GstSample *sample);
+static void parse_clipping(const char *clipping);
+static TestFrame *gst_to_spice_frame(GstSample *sample);
+static void bitmap_free(SpiceBitmap *bitmap);
+static void frame_ref(TestFrame *frame);
+static void frame_unref(TestFrame *frame);
+static void pipeline_free(TestPipeline *pipeline);
+static void pipeline_send_raw_data(TestPipeline *pipeline, VideoBuffer *buffer);
+static void pipeline_wait_eos(TestPipeline *pipeline);
+static void create_input_pipeline(const char *input_pipeline,
+ SampleProc sample_proc, void *param);
+static void create_output_pipeline(const EncoderInfo *encoder,
+ SampleProc output_frames, void *param);
+static void create_video_encoder(const EncoderInfo *encoder);
+static const EncoderInfo *get_encoder_info(const char *encoder_name);
+static SpiceBitmapFmt get_bitmap_format(const char *format);
+static double compute_psnr(SpiceBitmap *bitmap1, int32_t x1, int32_t y1,
+ SpiceBitmap *bitmap2, int32_t x2, int32_t y2,
+ int32_t w, int32_t h);
+
+// handle output frames from input pipeline
+static GstFlowReturn
+input_frames(GstSample *sample, void *param)
+{
+ unsigned curr_frame_index = input_frame_index++;
+
+ spice_assert(video_encoder && sample);
+
+ if (SPICE_UNLIKELY(!clipping_type_computed)) {
+ compute_clipping_rect(sample);
+ }
+
+ VideoBuffer *p_outbuf = NULL;
+ // TODO correct ?? emulate another timer ??
+ uint32_t frame_mm_time = reds_get_mm_time();
+
+ // convert frame to SpiceBitmap/DRM prime
+ TestFrame *frame = gst_to_spice_frame(sample);
+
+ // send frame to our video encoder (must be from a single thread)
+ VideoEncodeResults res =
+ video_encoder->encode_frame(video_encoder, frame_mm_time, frame->bitmap,
+ &clipping_rect, top_down, frame, &p_outbuf);
+ switch (res) {
+ case VIDEO_ENCODER_FRAME_ENCODE_DONE:
+ // save frame into queue for comparison later
+ frame_ref(frame);
+ pthread_mutex_lock(&frame_queue_mtx);
+ g_queue_push_tail(&frame_queue, frame);
+ while (g_queue_get_length(&frame_queue) >= 16) {
+ pthread_cond_wait(&frame_queue_cond, &frame_queue_mtx);
+ }
+ pthread_mutex_unlock(&frame_queue_mtx);
+ spice_assert(p_outbuf);
+ pipeline_send_raw_data(output_pipeline, p_outbuf);
+ if (file_report) {
+ fprintf(file_report,
+ "Frame: %u\n"
+ "Output size: %u\n",
+ curr_frame_index,
+ (unsigned) p_outbuf->size);
+ }
+ break;
+ case VIDEO_ENCODER_FRAME_UNSUPPORTED:
+ // ?? what to do ??
+ // should not happen, format passed should be supported
+ // could happen for serious problems and encoder gave up
+ spice_assert(0);
+ break;
+ case VIDEO_ENCODER_FRAME_DROP:
+ if (file_report) {
+ fprintf(file_report,
+ "Frame: %u\n"
+ "Output size: 0\n",
+ curr_frame_index);
+ }
+ break;
+ default:
+ // invalid value returned
+ spice_assert(0);
+ }
+
+ // TODO call client_stream_report to simulate this report from the client
+
+ frame_unref(frame);
+ return GST_FLOW_OK;
+}
+
+// handle output frames from output pipeline
+static GstFlowReturn
+output_frames(GstSample *sample, void *param)
+{
+ TestFrame *curr_frame = gst_to_spice_frame(sample);
+
+ // get first frame queued
+ pthread_mutex_lock(&frame_queue_mtx);
+ TestFrame *expected_frame = (TestFrame*) g_queue_pop_head(&frame_queue);
+ pthread_cond_signal(&frame_queue_cond);
+ pthread_mutex_unlock(&frame_queue_mtx);
+ if (!expected_frame) {
+ g_printerr("Frame not present in the queue but arrived in output!\n");
+ return GST_FLOW_EOS;
+ }
+
+ // TODO try to understand if this is correct
+ if (!top_down) {
+ curr_frame->bitmap->flags ^= SPICE_BITMAP_FLAGS_TOP_DOWN;
+ }
+#ifdef DUMP_BITMAP
+ dump_bitmap(expected_frame->bitmap);
+ dump_bitmap(curr_frame->bitmap);
+#endif
+
+ // compute difference
+ double psnr = compute_psnr(expected_frame->bitmap, clipping_rect.left, clipping_rect.top,
+ curr_frame->bitmap, 0, 0,
+ clipping_rect.right - clipping_rect.left,
+ clipping_rect.bottom - clipping_rect.top);
+
+ // check is more or less the same
+ if (psnr < minimum_psnr) {
+ g_printerr("Frame PSNR too low, got %g minimum %g\n", psnr, minimum_psnr);
+ return GST_FLOW_EOS;
+ }
+
+ frame_unref(expected_frame);
+ frame_unref(curr_frame);
+ return GST_FLOW_OK;
+}
+
+static const EncoderInfo encoder_infos[] = {
+ { "mjpeg", mjpeg_encoder_new, SPICE_VIDEO_CODEC_TYPE_MJPEG,
+ "caps=image/jpeg", "jpegdec" },
+#define encoder_info_mjpeg (&encoder_infos[0])
+ { "gstreamer:mjpeg", gstreamer_encoder_new, SPICE_VIDEO_CODEC_TYPE_MJPEG,
+ "caps=image/jpeg", "jpegdec" },
+ { "gstreamer:vp8", gstreamer_encoder_new, SPICE_VIDEO_CODEC_TYPE_VP8,
+ "caps=video/x-vp8", "vp8dec" },
+ { "gstreamer:vp9", gstreamer_encoder_new, SPICE_VIDEO_CODEC_TYPE_VP9,
+ "caps=video/x-vp9", "vp9dec" },
+ { "gstreamer:h264", gstreamer_encoder_new, SPICE_VIDEO_CODEC_TYPE_H264,
+ "", "h264parse ! avdec_h264" },
+ { NULL, NULL, SPICE_VIDEO_CODEC_TYPE_ENUM_END, NULL, NULL }
+};
+
+int main(int argc, char *argv[])
+{
+ gchar *input_pipeline_desc = NULL;
+ gchar *image_format = NULL;
+ gchar *encoder_name = NULL;
+ gchar *file_report_name = NULL;
+ gboolean use_hw_encoder = FALSE; // TODO use
+ gchar *clipping = NULL;
+
+ // - input pipeline
+ // - top/down
+ // - format for video encoder input (bits, rgb/bgr)
+ // - encoder (mjpeg/vp8/h264)
+ // - use h/w acceleration (if available)
+ // - clipping (part of the source)
+ // - TODO bandwidth changes?
+ // - TODO fps ??
+ GOptionEntry entries[] = {
+ { "input-pipeline", 'i', 0, G_OPTION_ARG_STRING, &input_pipeline_desc,
+ "GStreamer input pipeline", "PIPELINE" },
+ { "top-down", 0, 0, G_OPTION_ARG_NONE, &top_down,
+ "Image encoded as top-down", NULL },
+ { "format", 'f', 0, G_OPTION_ARG_STRING, &image_format,
+ "Image format (16BIT/24BIT/32BIT/RGBA)", "FMT" },
+ { "encoder", 'e', 0, G_OPTION_ARG_STRING, &encoder_name,
+ "Encoder to use", "ENC" },
+ { "use-hw-encoder", 0, 0, G_OPTION_ARG_NONE, &use_hw_encoder,
+ "Use H/W encoders if possible", NULL },
+ { "clipping", 0, 0, G_OPTION_ARG_STRING, &clipping,
+ "Clipping region (x1,y1)-(x2,y2) or (x,y)x(w,h). "
+ "You can specify coordinates using pixel or percentage.", "STRING" },
+ { "starting-bitrate", 0, 0, G_OPTION_ARG_INT64, &starting_bit_rate,
+ "Initial bitrate", "BITRATE" },
+ { "min-psnr", 0, 0, G_OPTION_ARG_DOUBLE, &minimum_psnr,
+ "Minimum PSNR accepted", "PSNR" },
+ { "split-lines", 0, 0, G_OPTION_ARG_INT, &image_split_lines,
+ "Split image into different chunks every LINES lines", "LINES" },
+ { "report", 0, 0, G_OPTION_ARG_FILENAME, &file_report_name,
+ "Report statistics to file", "FILENAME" },
+ { NULL }
+ };
+
+ GOptionContext *context = NULL;
+ GError *error = NULL;
+ context = g_option_context_new("- helper for testing VideoEncoder");
+ g_option_context_set_description(context, program_description);
+ g_option_context_add_main_entries(context, entries, NULL);
+ if (!g_option_context_parse(context, &argc, &argv, &error)) {
+ g_printerr("Option parsing failed: %s\n", error->message);
+ exit(1);
+ }
+
+ if (!input_pipeline_desc) {
+ g_printerr("Input pipeline option missing\n");
+ exit(1);
+ }
+
+ const EncoderInfo *encoder = encoder_info_mjpeg;
+ if (encoder_name != NULL) {
+ encoder = get_encoder_info(encoder_name);
+ if (!encoder) {
+ g_printerr("Encoder name unsupported: %s\n", encoder_name);
+ exit(1);
+ }
+ }
+
+ if (image_format != NULL) {
+ bitmap_format = get_bitmap_format(image_format);
+ if (bitmap_format == SPICE_BITMAP_FMT_INVALID) {
+ g_printerr("Invalid image format: %s\n", image_format);
+ exit(1);
+ }
+ }
+
+ parse_clipping(clipping ? clipping : "(0,0)x(100%,100%)");
+
+ if (minimum_psnr < 0) {
+ g_printerr("Invalid PSNR specified %f\n", minimum_psnr);
+ exit(1);
+ }
+
+ if (image_split_lines < 1) {
+ g_printerr("Invalid --split-lines option: %d\n", image_split_lines);
+ exit(1);
+ }
+
+ if (file_report_name) {
+ file_report = fopen(file_report_name, "w");
+ if (!file_report) {
+ g_printerr("Error opening file %s for report\n", file_report_name);
+ exit(1);
+ }
+ }
+
+ gst_init(&argc, &argv);
+
+ // TODO give particular error if pipeline fails to be created
+
+ create_output_pipeline(encoder, output_frames, NULL);
+
+ create_video_encoder(encoder);
+
+ create_input_pipeline(input_pipeline_desc, input_frames, NULL);
+
+ // run all input streaming
+ pipeline_wait_eos(input_pipeline);
+
+ video_encoder->destroy(video_encoder);
+
+ // send EOS to output and wait
+ // this assure we processed all frames sent from input pipeline
+ if (gst_app_src_end_of_stream(output_pipeline->appsrc) != GST_FLOW_OK) {
+ g_printerr("gst_app_src_end_of_stream failed\n");
+ exit(1);
+ }
+ pipeline_wait_eos(output_pipeline);
+
+ // check queue is now empty
+ pthread_mutex_lock(&frame_queue_mtx);
+ TestFrame *frame = (TestFrame*) g_queue_pop_head(&frame_queue);
+ pthread_mutex_unlock(&frame_queue_mtx);
+ if (frame) {
+ g_printerr("Queue not empty at the end\n");
+ exit(1);
+ }
+
+ pipeline_free(input_pipeline);
+ pipeline_free(output_pipeline);
+
+ g_free(encoder_name);
+ g_free(image_format);
+ g_free(input_pipeline_desc);
+ g_free(clipping);
+ g_option_context_free(context);
+
+ return global_test_error;
+}
+
+static void
+parse_clipping(const char *clipping)
+{
+ spice_assert(clipping);
+
+#define NUM_FMT "%31[^,)]"
+#define NUM(n) coords[n]
+ char coords[4][32];
+ char clipping_type_sign[2];
+ int i;
+
+ if (sscanf(clipping, "(" NUM_FMT "," NUM_FMT ")%1[x-](" NUM_FMT "," NUM_FMT ")",
+ NUM(0), NUM(1), clipping_type_sign, NUM(2), NUM(3)) < 5) {
+ goto format_error;
+ }
+ for (i = 0; i < 4; ++i) {
+ char *end = NULL;
+ errno = 0;
+ clipping_coords[i].unit = COORDS_NUMBER;
+ clipping_coords[i].value = strtoul(coords[i], &end, 10);
+ if (errno || !end || (strcmp(end, "") != 0 && strcmp(end, "%") != 0)) {
+ goto format_error;
+ }
+ if (strcmp(end, "%") == 0) {
+ clipping_coords[i].unit = COORDS_PERCENT;
+ if (clipping_coords[i].value > 100) {
+ goto format_error;
+ }
+ }
+ }
+ if (clipping_type_sign[0] == 'x') {
+ clipping_type = COORDS_SIZE;
+ } else {
+ clipping_type = COORDS_BOX;
+ }
+ return;
+
+format_error:
+ g_printerr("Invalid clipping format: %s\n", clipping);
+ exit(1);
+
+}
+
+static void
+compute_clipping_rect(GstSample *sample)
+{
+ GstCaps *caps = gst_sample_get_caps(sample);
+ spice_assert(caps);
+
+ GstStructure *s = gst_caps_get_structure(caps, 0);
+ spice_assert(s);
+
+ gint width, height;
+ spice_assert(gst_structure_get_int(s, "width", &width) &&
+ gst_structure_get_int(s, "height", &height));
+
+ // transform from percent to pixel values
+ int i;
+ unsigned int coords[4];
+ for (i = 0; i < 4; ++i) {
+ unsigned int coord = coords[i] = clipping_coords[i].value;
+ if (clipping_coords[i].unit != COORDS_PERCENT) {
+ spice_assert(clipping_coords[i].unit == COORDS_NUMBER);
+ continue;
+ }
+ coords[i] = coord * ((i&1) ? height : width) / 100;
+ }
+
+ // transform from sized to box
+ if (clipping_type == COORDS_SIZE) {
+ coords[2] += coords[0];
+ coords[3] += coords[1];
+ }
+
+ // clip to sample
+ coords[0] = MIN(coords[0], width);
+ coords[1] = MIN(coords[1], height);
+ coords[2] = MIN(coords[2], width);
+ coords[3] = MIN(coords[3], height);
+
+ // check coordinated are valid
+ spice_assert(coords[0] < coords[2]);
+ spice_assert(coords[1] < coords[3]);
+
+ // set
+ clipping_rect.left = coords[0];
+ clipping_rect.top = coords[1];
+ clipping_rect.right = coords[2];
+ clipping_rect.bottom = coords[3];
+ clipping_type_computed = TRUE;
+}
+
+static const EncoderInfo *
+get_encoder_info(const char *encoder_name)
+{
+ const EncoderInfo *info;
+ for (info = encoder_infos; info->name; ++info) {
+ if (strcmp(info->name, encoder_name) == 0) {
+ return info;
+ }
+ }
+ return NULL;
+}
+
+static GstFlowReturn
+new_sample(GstAppSink *gstappsink, gpointer test_pipeline)
+{
+ TestPipeline *pipeline = (TestPipeline*) test_pipeline;
+ GstFlowReturn res = GST_FLOW_OK;
+
+ GstSample *sample = gst_app_sink_pull_sample(pipeline->appsink);
+ if (sample) {
+ res = pipeline->sample_proc(sample, pipeline->sample_param);
+ if (res != GST_FLOW_OK) {
+ global_test_error = 1;
+ }
+ gst_sample_unref(sample);
+ }
+ return res;
+}
+
+static GstBusSyncReply
+handle_pipeline_message(GstBus *bus, GstMessage *msg, gpointer test_pipeline)
+{
+ TestPipeline *pipeline = (TestPipeline *) test_pipeline;
+
+ if (GST_MESSAGE_TYPE(msg) == GST_MESSAGE_EOS) {
+ pthread_mutex_lock(&eos_mtx);
+ pipeline->got_eos = TRUE;
+ pthread_cond_signal(&eos_cond);
+ pthread_mutex_unlock(&eos_mtx);
+ }
+ return GST_BUS_PASS;
+}
+
+static TestPipeline*
+create_pipeline(const char *desc, SampleProc sample_proc, void *param)
+{
+ TestPipeline *pipeline = g_new0(TestPipeline, 1);
+
+ pipeline->sample_proc = sample_proc;
+ pipeline->sample_param = param;
+
+ GError *err = NULL;
+ pipeline->gst_pipeline = gst_parse_launch_full(desc, NULL, GST_PARSE_FLAG_FATAL_ERRORS, &err);
+ if (!pipeline->gst_pipeline) {
+ g_printerr("GStreamer error: %s\n", err->message);
+ return NULL;
+ }
+
+ pipeline->appsrc = GST_APP_SRC(gst_bin_get_by_name(GST_BIN(pipeline->gst_pipeline), "src"));
+ pipeline->appsink = GST_APP_SINK(gst_bin_get_by_name(GST_BIN(pipeline->gst_pipeline), "sink"));
+ if (!pipeline->appsink) {
+ g_printerr("Appsync not found in pipeline: %s\n", desc);
+ return NULL;
+ }
+
+ static const GstAppSinkCallbacks appsink_cbs_template =
+#if GST_CHECK_VERSION(1, 20, 0)
+ { NULL, NULL, new_sample, NULL, ._gst_reserved={NULL} };
+#else
+ { NULL, NULL, new_sample, ._gst_reserved={NULL} };
+#endif
+ GstAppSinkCallbacks appsink_cbs = appsink_cbs_template;
+ gst_app_sink_set_callbacks(pipeline->appsink, &appsink_cbs, pipeline, NULL);
+
+ GstBus *bus = gst_element_get_bus(pipeline->gst_pipeline);
+ gst_bus_set_sync_handler(bus, handle_pipeline_message, pipeline, NULL);
+ gst_object_unref(bus);
+
+ if (gst_element_set_state(pipeline->gst_pipeline, GST_STATE_PLAYING) ==
+ GST_STATE_CHANGE_FAILURE) {
+ g_printerr("GStreamer error: Unable to set the pipeline to the playing state.\n");
+ exit(1);
+ }
+
+ return pipeline;
+}
+
+static void
+pipeline_free(TestPipeline *pipeline)
+{
+ if (pipeline->appsrc) {
+ gst_object_unref(pipeline->appsrc);
+ }
+ gst_object_unref(pipeline->appsink);
+ gst_object_unref(pipeline->gst_pipeline);
+ g_free(pipeline);
+}
+
+static void
+create_output_pipeline(const EncoderInfo *encoder, SampleProc sample_proc, void *param)
+{
+ gchar *desc =
+ g_strdup_printf("appsrc name=src is-live=true format=time max-bytes=0 block=true "
+ "%s ! %s ! " VIDEOCONVERT " ! appsink name=sink " BGRx_CAPS
+ " sync=false drop=false", encoder->caps, encoder->decoder);
+
+ TestPipeline *pipeline = create_pipeline(desc, sample_proc, param);
+ if (!pipeline) {
+ g_printerr("Error creating output pipeline: %s\n", desc);
+ exit(1);
+ }
+ g_free(desc);
+
+ output_pipeline = pipeline;
+}
+
+static void
+create_input_pipeline(const char *input_pipeline_desc, SampleProc sample_proc, void *param)
+{
+ gchar *desc =
+ g_strdup_printf("%s ! appsink name=sink " BGRx_CAPS
+ " sync=false drop=false", input_pipeline_desc);
+
+ TestPipeline *pipeline = create_pipeline(desc, sample_proc, param);
+ g_free(desc);
+ if (!pipeline) {
+ // TODO specific error
+ g_printerr("Error creating input pipeline\n");
+ exit(1);
+ }
+
+ input_pipeline = pipeline;
+}
+
+static void
+video_buffer_release(VideoBuffer *video_buffer)
+{
+ video_buffer->free(video_buffer);
+}
+
+static void
+pipeline_send_raw_data(TestPipeline *pipeline, VideoBuffer *video_buffer)
+{
+ GstBuffer *buffer =
+ gst_buffer_new_wrapped_full(GST_MEMORY_FLAG_PHYSICALLY_CONTIGUOUS,
+ video_buffer->data, video_buffer->size,
+ 0, video_buffer->size,
+ video_buffer, (void (*)(void*)) video_buffer_release);
+
+ GST_BUFFER_DURATION(buffer) = GST_CLOCK_TIME_NONE;
+ GST_BUFFER_DTS(buffer) = GST_CLOCK_TIME_NONE;
+
+ if (gst_app_src_push_buffer(pipeline->appsrc, buffer) != GST_FLOW_OK) {
+ g_printerr("GStreamer error: unable to push frame of size %u\n", video_buffer->size);
+ exit(1);
+ }
+}
+
+static void
+pipeline_wait_eos(TestPipeline *pipeline)
+{
+ pthread_mutex_lock(&eos_mtx);
+ while (!pipeline->got_eos) {
+ pthread_cond_wait(&eos_cond, &eos_mtx);
+ }
+ pthread_mutex_unlock(&eos_mtx);
+}
+
+static uint32_t
+mock_get_roundtrip_ms(void *opaque)
+{
+ // TODO
+ return 20;
+}
+
+static uint32_t
+mock_get_source_fps(void *opaque)
+{
+ // TODO
+ return 10;
+}
+
+static void
+mock_update_client_playback_delay(void *opaque, uint32_t delay_ms)
+{
+ // TODO
+}
+
+static VideoEncoderRateControlCbs rate_control_cbs = {
+ .opaque = NULL,
+ .get_roundtrip_ms = mock_get_roundtrip_ms,
+ .get_source_fps = mock_get_source_fps,
+ .update_client_playback_delay = mock_update_client_playback_delay,
+};
+
+static void
+create_video_encoder(const EncoderInfo *encoder)
+{
+ spice_assert(encoder);
+
+ video_encoder = encoder->new_encoder(encoder->coded_type, starting_bit_rate, &rate_control_cbs,
+ (bitmap_ref_t) frame_ref, (bitmap_unref_t) frame_unref);
+ if (video_encoder == NULL) {
+ exit(123);
+ }
+}
+
+static void
+frame_ref(TestFrame *frame)
+{
+ g_atomic_int_inc(&frame->refs);
+}
+
+static void
+frame_unref(TestFrame *frame)
+{
+ if (!g_atomic_int_dec_and_test(&frame->refs)) {
+ return;
+ }
+ bitmap_free(frame->bitmap);
+ g_free(frame);
+}
+
+static void
+bitmap_free(SpiceBitmap *bitmap)
+{
+ if (!bitmap) {
+ return;
+ }
+ spice_assert(!bitmap->palette);
+ spice_assert(bitmap->data);
+ spice_chunks_destroy(bitmap->data);
+ g_free(bitmap);
+}
+
+static SpiceChunks* chunks_alloc(uint32_t stride, uint32_t height, uint32_t split);
+static uint8_t *bitmap_get_line(SpiceBitmap *bitmap, int y);
+static uint32_t compute_stride(int width, SpiceBitmapFmt format);
+typedef void convert_line_t(uint8_t *dest, const uint8_t *src, uint32_t width);
+static convert_line_t convert_line16;
+static convert_line_t convert_line24;
+static convert_line_t convert_line32;
+static convert_line_t *get_convert_line(SpiceBitmapFmt format);
+
+static SpiceBitmap *
+gst_to_spice_bitmap(GstSample *sample)
+{
+ GstCaps *caps = gst_sample_get_caps(sample);
+ spice_assert(caps);
+
+ GstStructure *s = gst_caps_get_structure(caps, 0);
+ spice_assert(s);
+
+ gint width = 0, height = 0;
+ spice_assert(gst_structure_get_int(s, "width", &width) &&
+ gst_structure_get_int(s, "height", &height));
+
+ SpiceBitmap *bitmap = g_new0(SpiceBitmap, 1);
+ bitmap->format = bitmap_format;
+ bitmap->flags = top_down ? SPICE_BITMAP_FLAGS_TOP_DOWN : 0;
+ bitmap->x = width;
+ bitmap->y = height;
+ bitmap->stride = compute_stride(width, (SpiceBitmapFmt) bitmap->format);
+ bitmap->data = chunks_alloc(bitmap->stride, height, image_split_lines);
+
+ GstBuffer *buffer = gst_sample_get_buffer(sample);
+ GstMapInfo mapinfo;
+ if (!gst_buffer_map(buffer, &mapinfo, GST_MAP_READ)) {
+ spice_error("GStreamer error: could not map the buffer");
+ }
+
+ // convert image
+ gint y;
+ convert_line_t *convert_line = get_convert_line((SpiceBitmapFmt) bitmap->format);
+ for (y = 0; y < height; ++y) {
+ convert_line(bitmap_get_line(bitmap, y),
+ mapinfo.data + y * width * 4,
+ width);
+ }
+ gst_buffer_unmap(buffer, &mapinfo);
+ // TODO should we unref buffer ??
+
+ return bitmap;
+}
+
+static uint32_t
+compute_stride(int width, SpiceBitmapFmt format)
+{
+ spice_assert(width > 0);
+
+ switch (format) {
+ case SPICE_BITMAP_FMT_16BIT:
+ return width * 2;
+ case SPICE_BITMAP_FMT_24BIT:
+ return width * 3;
+ case SPICE_BITMAP_FMT_32BIT:
+ case SPICE_BITMAP_FMT_RGBA:
+ return width * 4;
+ default:
+ break;
+ }
+ spice_assert(0);
+ return 0;
+}
+
+static SpiceChunks*
+chunks_alloc(uint32_t stride, uint32_t height, uint32_t split)
+{
+ spice_assert(stride && height && split);
+ const uint32_t num_chunks = (height + split - 1u) / split;
+ SpiceChunks *chunks = (SpiceChunks*) spice_malloc0(sizeof(SpiceChunks) + sizeof(SpiceChunk) * num_chunks);
+
+ chunks->data_size = stride * height;
+ chunks->num_chunks = num_chunks;
+ chunks->flags = SPICE_CHUNKS_FLAGS_FREE;
+ unsigned n;
+ uint32_t allocated = 0;
+ for (n = 0; n < num_chunks; ++n) {
+ SpiceChunk *chunk = &chunks->chunk[n];
+ uint32_t len = stride * split;
+ spice_assert(chunks->data_size > allocated);
+ len = MIN(len, chunks->data_size - allocated);
+ chunk->data = (uint8_t*) spice_malloc0(len);
+ chunk->len = len;
+ allocated += len;
+ }
+ spice_assert(chunks->data_size == allocated);
+ return chunks;
+}
+
+static uint8_t *
+bitmap_get_line(SpiceBitmap *bitmap, int y)
+{
+ spice_assert(bitmap && y >= 0 && y < bitmap->y);
+ if (!(bitmap->flags & SPICE_BITMAP_FLAGS_TOP_DOWN)) {
+ y = bitmap->y - y - 1;
+ }
+ const uint32_t stride = bitmap->stride;
+ uint32_t pos = stride * y;
+ SpiceChunk *chunk = &bitmap->data->chunk[0];
+ while (pos >= chunk->len) {
+ pos -= chunk->len;
+ ++chunk;
+ spice_assert(chunk < &bitmap->data->chunk[bitmap->data->num_chunks]);
+ }
+ spice_assert(pos + stride <= chunk->len);
+ return chunk->data + pos;
+}
+
+static convert_line_t *
+get_convert_line(SpiceBitmapFmt format)
+{
+ switch (format) {
+ case SPICE_BITMAP_FMT_16BIT:
+ return convert_line16;
+ case SPICE_BITMAP_FMT_24BIT:
+ return convert_line24;
+ case SPICE_BITMAP_FMT_32BIT:
+ case SPICE_BITMAP_FMT_RGBA:
+ return convert_line32;
+ default:
+ break;
+ }
+ spice_assert(0);
+ return 0;
+}
+
+static void
+convert_line16(uint8_t *dest, const uint8_t *src, uint32_t width)
+{
+ uint16_t *dest16 = SPICE_ALIGNED_CAST(uint16_t *, dest);
+ for (; width; --width) {
+ *dest16++ = (src[0] >> 3) | ((src[1] & 0xf8) << 2) | ((src[2] & 0xf8) << 7);
+ src += 4;
+ }
+}
+
+static void
+convert_line24(uint8_t *dest, const uint8_t *src, uint32_t width)
+{
+ for (; width; --width) {
+ *dest++ = *src++;
+ *dest++ = *src++;
+ *dest++ = *src++;
+ ++src;
+ }
+}
+
+static void
+convert_line32(uint8_t *dest, const uint8_t *src, uint32_t width)
+{
+ for (; width; --width) {
+ *dest++ = *src++;
+ *dest++ = *src++;
+ *dest++ = *src++;
+ *dest++ = 0;
+ ++src;
+ }
+}
+
+static SpiceBitmapFmt
+get_bitmap_format(const char *format)
+{
+ if (strcmp(format, "32BIT") == 0) {
+ return SPICE_BITMAP_FMT_32BIT;
+ } else if (strcmp(format, "24BIT") == 0) {
+ return SPICE_BITMAP_FMT_24BIT;
+ } else if (strcmp(format, "16BIT") == 0) {
+ return SPICE_BITMAP_FMT_16BIT;
+ } else if (strcmp(format, "RGBA") == 0) {
+ return SPICE_BITMAP_FMT_RGBA;
+ }
+ return SPICE_BITMAP_FMT_INVALID;
+}
+
+static TestFrame *
+gst_to_spice_frame(GstSample *sample)
+{
+ TestFrame *frame = g_new0(TestFrame, 1);
+ frame->refs = 1;
+ frame->bitmap = gst_to_spice_bitmap(sample);
+ return frame;
+}
+
+static uint32_t
+line_diff_rgb(const uint8_t *pixel1, const uint8_t *pixel2, uint32_t w)
+{
+ uint32_t diff_sum = 0;
+ for (w *= 3; w; --w) {
+ int diff = *pixel1 - *pixel2;
+ diff_sum += diff * diff;
+ ++pixel1;
+ ++pixel2;
+ }
+ return diff_sum;
+}
+
+typedef uint8_t *bitmap_extract_rgb_line_t(SpiceBitmap *bitmap, uint8_t *buf,
+ int32_t x, int32_t y, int32_t w);
+static bitmap_extract_rgb_line_t *get_bitmap_extract(SpiceBitmapFmt format);
+static bitmap_extract_rgb_line_t bitmap_extract16;
+static bitmap_extract_rgb_line_t bitmap_extract24;
+static bitmap_extract_rgb_line_t bitmap_extract32;
+
+// compute PSNR
+// see https://en.wikipedia.org/wiki/Peak_signal-to-noise_ratio
+// higher is better (less data loosed)
+// typical are 30-50
+static double
+compute_psnr(SpiceBitmap *bitmap1, int32_t x1, int32_t y1,
+ SpiceBitmap *bitmap2, int32_t x2, int32_t y2,
+ int32_t w, int32_t h)
+{
+ spice_assert(x1 >= 0 && y1 >= 0);
+ spice_assert(x2 >= 0 && y2 >= 0);
+ spice_assert(w > 0 && h > 0);
+ spice_assert(x1 + w <= bitmap1->x);
+ spice_assert(y1 + h <= bitmap1->y);
+ spice_assert(x2 + w <= bitmap2->x);
+ spice_assert(y2 + h <= bitmap2->y);
+
+ int y;
+ uint64_t diff_sum = 0;
+ uint8_t pixels[2][w*3];
+ bitmap_extract_rgb_line_t *extract1 = get_bitmap_extract((SpiceBitmapFmt) bitmap1->format);
+ bitmap_extract_rgb_line_t *extract2 = get_bitmap_extract((SpiceBitmapFmt) bitmap2->format);
+ for (y = 0; y < h; ++y) {
+ uint8_t *line1 = extract1(bitmap1, pixels[0], x1, y1 + y, w);
+ uint8_t *line2 = extract2(bitmap2, pixels[1], x2, y2 + y, w);
+ diff_sum += line_diff_rgb(line1, line2, w);
+ }
+
+ double mse = (double) diff_sum / (w*h*3);
+ double psnr = 10 * log10(255*255/mse);
+
+ return psnr;
+}
+
+static bitmap_extract_rgb_line_t *
+get_bitmap_extract(SpiceBitmapFmt format)
+{
+ switch (format) {
+ case SPICE_BITMAP_FMT_16BIT:
+ return bitmap_extract16;
+ case SPICE_BITMAP_FMT_24BIT:
+ return bitmap_extract24;
+ case SPICE_BITMAP_FMT_32BIT:
+ case SPICE_BITMAP_FMT_RGBA:
+ return bitmap_extract32;
+ default:
+ break;
+ }
+ spice_assert(0);
+ return 0;
+}
+
+static uint8_t *
+bitmap_extract24(SpiceBitmap *bitmap, uint8_t *buf, int32_t x, int32_t y, int32_t w)
+{
+ uint8_t *line = bitmap_get_line(bitmap, y) + x * 3;
+ return line;
+}
+
+static uint8_t *
+bitmap_extract32(SpiceBitmap *bitmap, uint8_t *buf, int32_t x, int32_t y, int32_t w)
+{
+ const uint8_t *line = bitmap_get_line(bitmap, y) + x * 4;
+ uint8_t *dest = buf;
+ for (; w; --w) {
+ *dest++ = *line++;
+ *dest++ = *line++;
+ *dest++ = *line++;
+ ++line;
+ }
+ return buf;
+}
+
+static uint8_t *
+bitmap_extract16(SpiceBitmap *bitmap, uint8_t *buf, int32_t x, int32_t y, int32_t w)
+{
+ const uint16_t *line = SPICE_ALIGNED_CAST(const uint16_t *, bitmap_get_line(bitmap, y) + x * 2);
+ uint8_t *dest = buf;
+ for (; w; --w) {
+ uint16_t pixel = *line++;
+ uint8_t comp;
+ comp = (pixel >> 0) & 0x1f;
+ *dest++ = (comp << 3) | (comp >> 2);
+ comp = (pixel >> 5) & 0x1f;
+ *dest++ = (comp << 3) | (comp >> 2);
+ comp = (pixel >> 10) & 0x1f;
+ *dest++ = (comp << 3) | (comp >> 2);
+ }
+ return buf;
+}
diff --git a/server/tests/test-leaks.c b/server/tests/test-leaks.c
new file mode 100644
index 00000000..94cea57a
--- /dev/null
+++ b/server/tests/test-leaks.c
@@ -0,0 +1,264 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2017 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+/*
+ * This test allocate and free some resources in order to be able to detect
+ * leaks using a leak detector.
+ *
+ * To use with GCC/Clang address sanitizer you can set or add these options:
+ * CFLAGS="-fsanitize=address -fno-omit-frame-pointer"
+ * LDFLAGS="-fsanitize=address -lasan"
+ * Note that early GCC address sanitizer don't have a leak detector.
+ *
+ * To use Valgrind you can run the test with:
+ * valgrind --tool=memcheck --leak-check=full ./test-leaks
+ * For cleaner output you should suppress GLib checks with glib.supp file.
+ */
+#include <config.h>
+#include <unistd.h>
+#include <spice.h>
+#include <openssl/ssl.h>
+
+#include "test-glib-compat.h"
+#include "basic-event-loop.h"
+#include "test-display-base.h"
+#include "sys-socket.h"
+
+#define PKI_DIR SPICE_TOP_SRCDIR "/server/tests/pki/"
+
+static void server_leaks(void)
+{
+ int result;
+ SpiceCoreInterface *core;
+ SpiceServer *server = spice_server_new();
+ int sv[2];
+
+ g_assert_nonnull(server);
+
+ core = basic_event_loop_init();
+ g_assert_nonnull(core);
+
+ result = spice_server_set_tls(server, 5922,
+ PKI_DIR "ca-cert.pem",
+ PKI_DIR "server-cert.pem",
+ PKI_DIR "server-key.pem",
+ NULL,
+ PKI_DIR "dhparams.pem",
+ NULL);
+ g_assert_cmpint(result, ==, 0);
+
+ g_assert_cmpint(spice_server_init(server, core), ==, 0);
+
+ /* cause the allocation of spice name */
+ spice_server_set_name(server, "Test Spice Name");
+
+ /* cause the allocation of security options */
+ result = spice_server_set_channel_security(server, "main", SPICE_CHANNEL_SECURITY_SSL);
+ g_assert_cmpint(result, ==, 0);
+
+ /* spice_server_add_ssl_client should not leak when it's given a disconnected socket */
+#if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
+ /* Discard the OpenSSL-generated error logs */
+ g_test_expect_message(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, "*error:*:SSL*");
+#endif
+ g_test_expect_message(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING,
+ "*SSL_accept failed*");
+ g_assert_cmpint(socketpair(AF_LOCAL, SOCK_STREAM, 0, sv), ==, 0);
+ socket_close(sv[1]);
+ result = spice_server_add_ssl_client(server, sv[0], 1);
+ g_assert_cmpint(result, ==, -1);
+ /* if the function fails, it should not close the socket */
+ g_assert_cmpint(socket_close(sv[0]), ==, 0);
+
+ spice_server_destroy(server);
+ basic_event_loop_destroy();
+}
+
+static int vmc_write(SPICE_GNUC_UNUSED SpiceCharDeviceInstance *sin,
+ SPICE_GNUC_UNUSED const uint8_t *buf,
+ int len)
+{
+ return len;
+}
+
+static int vmc_read(SPICE_GNUC_UNUSED SpiceCharDeviceInstance *sin,
+ SPICE_GNUC_UNUSED uint8_t *buf,
+ SPICE_GNUC_UNUSED int len)
+{
+ return 0;
+}
+
+static void vmc_state(SPICE_GNUC_UNUSED SpiceCharDeviceInstance *sin,
+ SPICE_GNUC_UNUSED int connected)
+{
+}
+
+static SpiceCharDeviceInterface vmc_interface = {
+ .base = {
+ .type = SPICE_INTERFACE_CHAR_DEVICE,
+ .description = "test spice virtual channel char device",
+ .major_version = SPICE_INTERFACE_CHAR_DEVICE_MAJOR,
+ .minor_version = SPICE_INTERFACE_CHAR_DEVICE_MINOR,
+ },
+ .state = vmc_state,
+ .write = vmc_write,
+ .read = vmc_read,
+};
+
+static SpiceCharDeviceInstance vmc_instance;
+
+static void vmc_leaks(void)
+{
+ SpiceCoreInterface *core = basic_event_loop_init();
+ Test *test = test_new(core);
+ int status;
+
+ vmc_instance.subtype = "usbredir";
+ vmc_instance.base.sif = &vmc_interface.base;
+ spice_server_add_interface(test->server, &vmc_instance.base);
+ status = spice_server_remove_interface(&vmc_instance.base);
+ g_assert_cmpint(status, ==, 0);
+
+ vmc_instance.subtype = "port";
+ vmc_instance.portname = "org.spice-space.webdav.0";
+ vmc_instance.base.sif = &vmc_interface.base;
+ spice_server_add_interface(test->server, &vmc_instance.base);
+ status = spice_server_remove_interface(&vmc_instance.base);
+ g_assert_cmpint(status, ==, 0);
+
+ vmc_instance.subtype = "port";
+ vmc_instance.portname = "default_port";
+ vmc_instance.base.sif = &vmc_interface.base;
+ spice_server_add_interface(test->server, &vmc_instance.base);
+ status = spice_server_remove_interface(&vmc_instance.base);
+ g_assert_cmpint(status, ==, 0);
+
+ test_destroy(test);
+ basic_event_loop_destroy();
+}
+
+static void migrate_cb(SpiceMigrateInstance *sin)
+{
+}
+
+static const SpiceMigrateInterface migrate_interface = {
+ .base = {
+ .type = SPICE_INTERFACE_MIGRATION,
+ .description = "migration",
+ .major_version = SPICE_INTERFACE_MIGRATION_MAJOR,
+ .minor_version = SPICE_INTERFACE_MIGRATION_MINOR,
+ },
+ .migrate_connect_complete = migrate_cb,
+ .migrate_end_complete = migrate_cb,
+};
+
+static void migration_leaks(void)
+{
+ SpiceCoreInterface *core;
+ SpiceServer *server = spice_server_new();
+ SpiceMigrateInstance migrate;
+
+ g_assert_nonnull(server);
+
+ core = basic_event_loop_init();
+ g_assert_nonnull(core);
+
+ g_assert_cmpint(spice_server_init(server, core), ==, 0);
+
+ migrate.base.sif = &migrate_interface.base;
+ spice_server_add_interface(server, &migrate.base);
+
+ spice_server_destroy(server);
+ basic_event_loop_destroy();
+}
+
+static void tablet_set_logical_size(SpiceTabletInstance* sin, int width, int height)
+{
+}
+
+static void tablet_position(SpiceTabletInstance* sin, int x, int y,
+ uint32_t buttons_state)
+{
+}
+
+static void tablet_wheel(SpiceTabletInstance* sin, int wheel,
+ uint32_t buttons_state)
+{
+}
+
+static void tablet_buttons(SpiceTabletInstance *sin,
+ uint32_t buttons_state)
+{
+}
+
+static const SpiceTabletInterface tablet_interface = {
+ .base = {
+ .type = SPICE_INTERFACE_TABLET,
+ .description = "tablet",
+ .major_version = SPICE_INTERFACE_TABLET_MAJOR,
+ .minor_version = SPICE_INTERFACE_TABLET_MINOR,
+ },
+ .set_logical_size = tablet_set_logical_size,
+ .position = tablet_position,
+ .wheel = tablet_wheel,
+ .buttons = tablet_buttons,
+};
+
+static void tablet_leaks(void)
+{
+ SpiceCoreInterface *core;
+ SpiceServer *server;
+ SpiceTabletInstance tablet;
+
+ core = basic_event_loop_init();
+ g_assert_nonnull(core);
+
+ // test if leaks without spice_server_remove_interface
+ server = spice_server_new();
+ g_assert_nonnull(server);
+ g_assert_cmpint(spice_server_init(server, core), ==, 0);
+
+ tablet.base.sif = &tablet_interface.base;
+ spice_server_add_interface(server, &tablet.base);
+
+ spice_server_destroy(server);
+
+ // test if leaks with spice_server_remove_interface
+ server = spice_server_new();
+ g_assert_nonnull(server);
+ g_assert_cmpint(spice_server_init(server, core), ==, 0);
+
+ tablet.base.sif = &tablet_interface.base;
+ spice_server_add_interface(server, &tablet.base);
+ spice_server_remove_interface(&tablet.base);
+
+ spice_server_destroy(server);
+
+ basic_event_loop_destroy();
+}
+
+int main(int argc, char *argv[])
+{
+ g_test_init(&argc, &argv, NULL);
+
+ g_test_add_func("/server/server leaks", server_leaks);
+ g_test_add_func("/server/vmc leaks", vmc_leaks);
+ g_test_add_func("/server/migration leaks", migration_leaks);
+ g_test_add_func("/server/tablet leaks", tablet_leaks);
+
+ return g_test_run();
+}
diff --git a/server/tests/test-listen.c b/server/tests/test-listen.c
new file mode 100644
index 00000000..f3bdccd6
--- /dev/null
+++ b/server/tests/test-listen.c
@@ -0,0 +1,365 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2018 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+/*
+ * This tests the external API entry points to configure the address/port
+ * spice-server is listening on
+ */
+#include <config.h>
+
+#include "basic-event-loop.h"
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <string.h>
+
+#ifndef _WIN32
+#include <unistd.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#endif
+
+#include <openssl/bio.h>
+#include <openssl/ssl.h>
+
+#include "test-glib-compat.h"
+
+/* Arbitrary base port, we want a port which is not in use by the system, and
+ * by another of our tests (in case of parallel runs)
+ */
+#define BASE_PORT 5728
+
+#define PKI_DIR SPICE_TOP_SRCDIR "/server/tests/pki/"
+
+typedef struct {
+ SpiceCoreInterface *core;
+ SpiceTimer *exit_mainloop_timer;
+ SpiceTimer *timeout_timer;
+} TestEventLoop;
+
+static void timeout_cb(SPICE_GNUC_UNUSED void *opaque)
+{
+ g_assert_not_reached();
+}
+
+static void exit_mainloop_cb(SPICE_GNUC_UNUSED void *opaque)
+{
+ basic_event_loop_quit();
+}
+
+static void test_event_loop_quit(TestEventLoop *event_loop)
+{
+ event_loop->core->timer_start(event_loop->exit_mainloop_timer, 0);
+}
+
+static void test_event_loop_init(TestEventLoop *event_loop)
+{
+ event_loop->core = basic_event_loop_init();
+ event_loop->timeout_timer = event_loop->core->timer_add(timeout_cb, NULL);
+ event_loop->exit_mainloop_timer = event_loop->core->timer_add(exit_mainloop_cb, NULL);
+}
+
+static void test_event_loop_destroy(TestEventLoop *event_loop)
+{
+ if (event_loop->timeout_timer != NULL) {
+ event_loop->core->timer_remove(event_loop->timeout_timer);
+ event_loop->timeout_timer = NULL;
+ }
+ if (event_loop->exit_mainloop_timer != NULL) {
+ event_loop->core->timer_remove(event_loop->exit_mainloop_timer);
+ event_loop->exit_mainloop_timer = NULL;
+ }
+ basic_event_loop_destroy();
+ event_loop->core = NULL;
+}
+
+static void test_event_loop_run(TestEventLoop *event_loop)
+{
+ event_loop->core->timer_start(event_loop->timeout_timer, 50000);
+ basic_event_loop_mainloop();
+}
+
+static BIO *fake_client_connect(const char *hostname, int port, bool use_tls)
+{
+ if (port < 0) {
+#ifndef _WIN32
+ int sock = socket(AF_UNIX, SOCK_STREAM, 0);
+ struct sockaddr_un addr;
+ memset(&addr, 0, sizeof(addr));
+ addr.sun_family = AF_UNIX;
+ strcpy(addr.sun_path, hostname);
+ if (connect(sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
+ close(sock);
+ return NULL;
+ }
+ return BIO_new_fd(sock, 0);
+#else
+ g_assert_not_reached();
+#endif
+ }
+
+ char con_buf[256];
+ g_snprintf(con_buf, sizeof(con_buf), "%s:%d", hostname, port);
+
+ SSL_CTX *ctx = NULL;
+ BIO *bio;
+ if (use_tls) {
+ ctx = SSL_CTX_new(TLS_client_method());
+ g_assert_nonnull(ctx);
+
+ bio = BIO_new_ssl_connect(ctx);
+ g_assert_nonnull(bio);
+
+ BIO_set_conn_hostname(bio, con_buf);
+ } else {
+ bio = BIO_new_connect(con_buf);
+ g_assert_nonnull(bio);
+ }
+
+ if (BIO_do_connect(bio) <= 0) {
+ BIO_free(bio);
+ bio = NULL;
+ }
+
+ SSL_CTX_free(ctx);
+ return bio;
+}
+
+static void check_magic(BIO *bio)
+{
+ uint8_t buffer[4];
+
+ /* send dummy data to trigger a response from the server */
+ memset(buffer, 0xa5, G_N_ELEMENTS(buffer));
+ g_assert_cmpint(BIO_write(bio, buffer, G_N_ELEMENTS(buffer)), ==, G_N_ELEMENTS(buffer));
+
+ g_assert_cmpint(BIO_read(bio, buffer, G_N_ELEMENTS(buffer)), ==, G_N_ELEMENTS(buffer));
+ g_assert_cmpint(memcmp(buffer, "REDQ", 4), ==, 0);
+}
+
+typedef struct
+{
+ const char *hostname;
+ int port;
+ bool use_tls;
+ TestEventLoop *event_loop;
+} ThreadData;
+
+static gpointer check_magic_thread(gpointer data)
+{
+ ThreadData *thread_data = (ThreadData*) data;
+ BIO *bio;
+
+ bio = fake_client_connect(thread_data->hostname, thread_data->port, thread_data->use_tls);
+ g_assert_nonnull(bio);
+ check_magic(bio);
+
+ BIO_free_all(bio);
+
+ test_event_loop_quit(thread_data->event_loop);
+ g_free(thread_data);
+
+ return NULL;
+}
+
+static gpointer check_no_connect_thread(gpointer data)
+{
+ ThreadData *thread_data = (ThreadData*) data;
+
+ BIO *bio = fake_client_connect(thread_data->hostname, thread_data->port, false);
+ g_assert_null(bio);
+
+ test_event_loop_quit(thread_data->event_loop);
+ g_free(thread_data);
+
+ return NULL;
+}
+
+static GThread *fake_client_new(GThreadFunc thread_func,
+ const char *hostname, int port,
+ bool use_tls,
+ TestEventLoop *event_loop)
+{
+ ThreadData *thread_data = g_new0(ThreadData, 1);
+
+ if (port == -1) {
+#ifdef _WIN32
+ g_assert_not_reached();
+#endif
+ } else {
+ g_assert_cmpuint(port, >, 0);
+ g_assert_cmpuint(port, <, 65536);
+ }
+ thread_data->hostname = hostname;
+ thread_data->port = port;
+ thread_data->use_tls = use_tls;
+ thread_data->event_loop = event_loop;
+
+ /* check_magic_thread will assume ownership of 'connectable' */
+ return g_thread_new("fake-client-thread", thread_func, thread_data);
+}
+
+static void test_connect_plain(void)
+{
+ GThread *thread;
+ int result;
+
+ TestEventLoop event_loop = { 0, };
+
+ test_event_loop_init(&event_loop);
+
+ /* server */
+ SpiceServer *server = spice_server_new();
+ spice_server_set_name(server, "SPICE listen test");
+ spice_server_set_noauth(server);
+ spice_server_set_port(server, BASE_PORT);
+ result = spice_server_init(server, event_loop.core);
+ g_assert_cmpint(result, ==, 0);
+
+ /* fake client */
+ thread = fake_client_new(check_magic_thread, "localhost", BASE_PORT, false, &event_loop);
+ test_event_loop_run(&event_loop);
+ g_assert_null(g_thread_join(thread));
+
+ test_event_loop_destroy(&event_loop);
+ spice_server_destroy(server);
+}
+
+static void test_connect_tls(void)
+{
+ GThread *thread;
+ int result;
+
+ TestEventLoop event_loop = { 0, };
+
+ test_event_loop_init(&event_loop);
+
+ /* server */
+ SpiceServer *server = spice_server_new();
+ spice_server_set_name(server, "SPICE listen test");
+ spice_server_set_noauth(server);
+ result = spice_server_set_tls(server, BASE_PORT,
+ PKI_DIR "ca-cert.pem",
+ PKI_DIR "server-cert.pem",
+ PKI_DIR "server-key.pem",
+ NULL, NULL, NULL);
+ g_assert_cmpint(result, ==, 0);
+ result = spice_server_init(server, event_loop.core);
+ g_assert_cmpint(result, ==, 0);
+
+ /* fake client */
+ thread = fake_client_new(check_magic_thread, "localhost", BASE_PORT, true, &event_loop);
+ test_event_loop_run(&event_loop);
+ g_assert_null(g_thread_join(thread));
+
+ test_event_loop_destroy(&event_loop);
+ spice_server_destroy(server);
+}
+
+static void test_connect_plain_and_tls(void)
+{
+ GThread *thread;
+ int result;
+
+ TestEventLoop event_loop = { 0, };
+
+ test_event_loop_init(&event_loop);
+
+ /* server */
+ SpiceServer *server = spice_server_new();
+ spice_server_set_name(server, "SPICE listen test");
+ spice_server_set_noauth(server);
+ spice_server_set_port(server, BASE_PORT);
+ result = spice_server_set_tls(server, BASE_PORT+1,
+ PKI_DIR "ca-cert.pem",
+ PKI_DIR "server-cert.pem",
+ PKI_DIR "server-key.pem",
+ NULL, NULL, NULL);
+ g_assert_cmpint(result, ==, 0);
+ result = spice_server_init(server, event_loop.core);
+ g_assert_cmpint(result, ==, 0);
+
+ /* fake client */
+ thread = fake_client_new(check_magic_thread, "localhost", BASE_PORT, false, &event_loop);
+ test_event_loop_run(&event_loop);
+ g_assert_null(g_thread_join(thread));
+
+ thread = fake_client_new(check_magic_thread, "localhost", BASE_PORT+1, true, &event_loop);
+ test_event_loop_run(&event_loop);
+ g_assert_null(g_thread_join(thread));
+
+ test_event_loop_destroy(&event_loop);
+ spice_server_destroy(server);
+}
+
+#ifndef _WIN32
+static void test_connect_unix(void)
+{
+ GThread *thread;
+ int result;
+
+ TestEventLoop event_loop = { 0, };
+
+ test_event_loop_init(&event_loop);
+
+ /* server */
+ SpiceServer *server = spice_server_new();
+ spice_server_set_name(server, "SPICE listen test");
+ spice_server_set_noauth(server);
+ spice_server_set_addr(server, "test-listen.unix", SPICE_ADDR_FLAG_UNIX_ONLY);
+ result = spice_server_init(server, event_loop.core);
+ g_assert_cmpint(result, ==, 0);
+
+ /* fake client */
+ thread = fake_client_new(check_magic_thread, "test-listen.unix", -1, false, &event_loop);
+ test_event_loop_run(&event_loop);
+ g_assert_null(g_thread_join(thread));
+
+ test_event_loop_destroy(&event_loop);
+ spice_server_destroy(server);
+}
+#endif
+
+static void test_connect_ko(void)
+{
+ GThread *thread;
+ TestEventLoop event_loop = { 0, };
+
+ test_event_loop_init(&event_loop);
+
+ /* fake client */
+ thread = fake_client_new(check_no_connect_thread, "localhost", BASE_PORT, false, &event_loop);
+ test_event_loop_run(&event_loop);
+ g_assert_null(g_thread_join(thread));
+
+ test_event_loop_destroy(&event_loop);
+}
+
+int main(int argc, char **argv)
+{
+ g_test_init(&argc, &argv, NULL);
+
+ g_test_add_func("/server/listen/connect_plain", test_connect_plain);
+ g_test_add_func("/server/listen/connect_tls", test_connect_tls);
+ g_test_add_func("/server/listen/connect_both", test_connect_plain_and_tls);
+#ifndef _WIN32
+ g_test_add_func("/server/listen/connect_unix", test_connect_unix);
+#endif
+ g_test_add_func("/server/listen/connect_ko", test_connect_ko);
+
+ return g_test_run();
+}
diff --git a/server/tests/test-loop.c b/server/tests/test-loop.c
new file mode 100644
index 00000000..4df3a7d2
--- /dev/null
+++ b/server/tests/test-loop.c
@@ -0,0 +1,176 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+/* Test event loop
+ */
+
+#include <config.h>
+
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <pthread.h>
+#include <glib.h>
+
+#include <spice/macros.h>
+#include <common/log.h>
+#include "basic-event-loop.h"
+#include "win-alarm.h"
+
+static SpiceCoreInterface *core = NULL;
+static GMainLoop *loop = NULL;
+static pthread_t loop_thread;
+
+static void timer_err(void *opaque)
+{
+ spice_assert(0);
+}
+
+static SpiceTimer *to_delete_timer = NULL;
+static void timer_del(void *opaque)
+{
+ spice_assert(core);
+ spice_assert(to_delete_timer);
+
+ spice_assert(pthread_equal(loop_thread, pthread_self()));
+
+ core->timer_remove(to_delete_timer);
+ to_delete_timer = NULL;
+}
+
+static void timer_exit(void *opaque)
+{
+ spice_assert(loop);
+
+ spice_assert(pthread_equal(loop_thread, pthread_self()));
+
+ g_main_loop_quit(loop);
+}
+
+static void *loop_func(void *arg)
+{
+ loop_thread = pthread_self();
+
+ spice_assert(loop);
+
+ g_main_loop_run(loop);
+
+ return NULL;
+}
+
+static SpiceTimer *twice_timers_remove[2] = { NULL, NULL };
+static int twice_remove_called = 0;
+static void timer_not_twice_remove(void *opaque)
+{
+ ++twice_remove_called;
+ spice_assert(twice_remove_called == 1);
+
+ /* delete timers, should not have another call */
+ core->timer_remove(twice_timers_remove[0]);
+ core->timer_remove(twice_timers_remove[1]);
+ twice_timers_remove[0] = NULL;
+ twice_timers_remove[1] = NULL;
+}
+
+static SpiceTimer *twice_timers_cancel[2] = { NULL, NULL };
+static int twice_cancel_called = 0;
+static void timer_not_twice(void *opaque)
+{
+ spice_assert(++twice_cancel_called == 1);
+
+ /* cancel timers, should not have another call */
+ core->timer_cancel(twice_timers_cancel[0]);
+ core->timer_cancel(twice_timers_cancel[1]);
+}
+
+
+int main(int argc, char **argv)
+{
+ SpiceTimer *timer, *timers[10];
+ int i, rc;
+
+ memset(timers, 0, sizeof(timers));
+
+ core = basic_event_loop_init();
+
+ i = 0;
+
+ /* add a timer and delete to check is correctly deleted */
+ timer = core->timer_add(timer_err, NULL);
+ core->timer_start(timer, 1);
+ core->timer_remove(timer);
+
+ /* create timer, should not be executed */
+ timer = timers[i++] = core->timer_add(timer_err, NULL);
+
+ /* add a timer and cancel to check is not executed */
+ timer = timers[i++] = core->timer_add(timer_err, NULL);
+ core->timer_start(timer, 1);
+ core->timer_cancel(timer);
+
+ /* check we can remove timer inside a timer */
+ timer = to_delete_timer = core->timer_add(timer_del, NULL);
+ spice_assert(to_delete_timer != NULL);
+ core->timer_start(timer, 1);
+
+ /* create a timer that does something */
+ timer = timers[i++] = core->timer_add(timer_exit, NULL);
+ core->timer_start(timer, 10);
+
+ /* test events are not called when freed */
+ timer = twice_timers_remove[0] = core->timer_add(timer_not_twice_remove, NULL);
+ spice_assert(timer != NULL);
+ core->timer_start(timer, 2);
+ timer = twice_timers_remove[1] = core->timer_add(timer_not_twice_remove, NULL);
+ spice_assert(timer != NULL);
+ core->timer_start(timer, 2);
+
+ /* test events are not called when cancelled */
+ timer = timers[i++] = twice_timers_cancel[0] = core->timer_add(timer_not_twice, core);
+ spice_assert(timer != NULL);
+ core->timer_start(timer, 4);
+ timer = timers[i++] = twice_timers_cancel[1] = core->timer_add(timer_not_twice, core);
+ spice_assert(timer != NULL);
+ core->timer_start(timer, 4);
+
+ /* run the loop */
+ loop = g_main_loop_new(basic_event_loop_get_context(), FALSE);
+ alarm(1);
+ rc = pthread_create(&loop_thread, NULL, loop_func, NULL);
+ spice_assert(rc == 0);
+ rc = pthread_join(loop_thread, NULL);
+ spice_assert(rc == 0);
+ alarm(0);
+ g_main_loop_unref(loop);
+
+ /* delete executed ? */
+ spice_assert(to_delete_timer == NULL);
+
+ /* cleanup */
+ for (i = 0; i < G_N_ELEMENTS(timers); ++i) {
+ if (timers[i]) {
+ core->timer_remove(timers[i]);
+ timers[i] = NULL;
+ }
+ }
+
+ basic_event_loop_destroy();
+
+ return 0;
+}
diff --git a/server/tests/test_multiple.py b/server/tests/test-multiple.py
index ce03c94e..2497d933 100755
--- a/server/tests/test_multiple.py
+++ b/server/tests/test-multiple.py
@@ -2,7 +2,7 @@
"""
Example usage:
-./test_multiple.py test_display_no_ssl --log test.log
+./test-multiple.py test-display-no-ssl --log test.log
Resulting test.log file (single test, stopped with Ctrl-C with 15 clients):
diff --git a/server/tests/test-options.c b/server/tests/test-options.c
new file mode 100644
index 00000000..4d77bffe
--- /dev/null
+++ b/server/tests/test-options.c
@@ -0,0 +1,56 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2016 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+#include <spice.h>
+
+#include "test-glib-compat.h"
+#include "basic-event-loop.h"
+
+static void agent_options(void)
+{
+ SpiceCoreInterface *core ;
+ SpiceServer *server = spice_server_new();
+
+ g_assert_nonnull(server);
+
+ core = basic_event_loop_init();
+ g_assert_nonnull(core);
+
+ /* test before init */
+ spice_server_set_agent_mouse(server, 0);
+ spice_server_set_agent_copypaste(server, 0);
+ spice_server_set_agent_file_xfer(server, 0);
+
+ g_assert_cmpint(spice_server_init(server, core), ==, 0);
+
+ /* test after init */
+ spice_server_set_agent_mouse(server, 0);
+ spice_server_set_agent_copypaste(server, 0);
+ spice_server_set_agent_file_xfer(server, 0);
+
+ spice_server_destroy(server);
+}
+
+int main(int argc, char *argv[])
+{
+ g_test_init(&argc, &argv, NULL);
+
+ g_test_add_func("/server/agent options", agent_options);
+
+ return g_test_run();
+}
diff --git a/server/tests/test_playback.c b/server/tests/test-playback.c
index d1742de7..290c8609 100644
--- a/server/tests/test_playback.c
+++ b/server/tests/test-playback.c
@@ -1,13 +1,27 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
#include <config.h>
#include <stdio.h>
-#include <sys/select.h>
#include <sys/time.h>
#include <math.h>
#include <spice.h>
-#include "reds.h"
-#include "test_util.h"
-#include "basic_event_loop.h"
+#include "basic-event-loop.h"
/* test the audio playback interface. Really basic no frils test - create
* a single tone sinus sound (easy to hear clicks if it is generated badly
@@ -19,20 +33,22 @@
* it has actual merit. Also possibly to simulate network effects?)
* */
-SpicePlaybackInstance playback_instance;
+static SpicePlaybackInstance playback_instance;
-static const SpiceBaseInterface base = {
- .type = SPICE_INTERFACE_PLAYBACK,
- .description = "test playback",
- .major_version = SPICE_INTERFACE_PLAYBACK_MAJOR,
- .minor_version = SPICE_INTERFACE_PLAYBACK_MINOR,
+static const SpicePlaybackInterface playback_sif = {
+ .base = {
+ .type = SPICE_INTERFACE_PLAYBACK,
+ .description = "test playback",
+ .major_version = SPICE_INTERFACE_PLAYBACK_MAJOR,
+ .minor_version = SPICE_INTERFACE_PLAYBACK_MINOR,
+ }
};
-uint32_t *frame;
-uint32_t num_samples;
-SpiceTimer *playback_timer;
-int playback_timer_ms;
-SpiceCoreInterface *core;
+static uint32_t *frame;
+static uint32_t num_samples;
+static SpiceTimer *playback_timer;
+static int playback_timer_ms;
+static SpiceCoreInterface *core;
static void get_frame(void)
{
@@ -45,7 +61,7 @@ static void get_frame(void)
: 100;
}
-void playback_timer_cb(SPICE_GNUC_UNUSED void *opaque)
+static void playback_timer_cb(SPICE_GNUC_UNUSED void *opaque)
{
static int t = 0;
static uint64_t last_sent_usec = 0;
@@ -56,12 +72,12 @@ void playback_timer_cb(SPICE_GNUC_UNUSED void *opaque)
get_frame();
if (!frame) {
- /* continue waiting until there is a channel */
+ /* continue waiting until there is a client */
core->timer_start(playback_timer, 100);
return;
}
- /* we have a channel */
+ /* we have a client */
gettimeofday(&cur, NULL);
cur_usec = cur.tv_usec + cur.tv_sec * 1e6;
if (last_sent_usec == 0) {
@@ -71,18 +87,14 @@ void playback_timer_cb(SPICE_GNUC_UNUSED void *opaque)
}
last_sent_usec = cur_usec;
while (samples_to_send > num_samples && frame) {
-#if 0
- printf("samples_to_send = %d\n", samples_to_send);
-#endif
samples_to_send -= num_samples;
for (i = 0 ; i < num_samples; ++i) {
- frame[i] = (((uint16_t)((1<<14)*sin((t+i)/10))) << 16) + (((uint16_t)((1<<14)*sin((t+i)/10))));
+ uint16_t level = (1<<14) * sin((t+i)/10.0);
+ frame[i] = (level << 16) + level;
}
t += num_samples;
- if (frame) {
- spice_server_playback_put_samples(&playback_instance, frame);
- frame = NULL;
- }
+ spice_server_playback_put_samples(&playback_instance, frame);
+ frame = NULL;
get_frame();
}
core->timer_start(playback_timer, playback_timer_ms);
@@ -97,7 +109,7 @@ int main(void)
spice_server_set_noauth(server);
spice_server_init(server, core);
- playback_instance.base.sif = &base;
+ playback_instance.base.sif = &playback_sif.base;
spice_server_add_interface(server, &playback_instance.base);
spice_server_playback_start(&playback_instance);
diff --git a/server/tests/test-qxl-parsing.cpp b/server/tests/test-qxl-parsing.cpp
new file mode 100644
index 00000000..d68879f1
--- /dev/null
+++ b/server/tests/test-qxl-parsing.cpp
@@ -0,0 +1,322 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2016 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+/* Do some tests on memory parsing
+ */
+#include <config.h>
+
+#undef NDEBUG
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#include <spice/macros.h>
+#include "memslot.h"
+#include "red-parse-qxl.h"
+#include "test-glib-compat.h"
+
+static QXLPHYSICAL
+to_physical(const void *ptr)
+{
+ return (uintptr_t) ptr;
+}
+
+static void *
+from_physical(QXLPHYSICAL physical)
+{
+ return (void *)(uintptr_t) physical;
+}
+
+static void*
+create_chunk(size_t prefix, uint32_t size, QXLDataChunk* prev, int fill)
+{
+ uint8_t *ptr = (uint8_t*) g_malloc0(prefix + sizeof(QXLDataChunk) + size);
+ QXLDataChunk *qxl = (QXLDataChunk *) (ptr + prefix);
+ memset(&qxl->data[0], fill, size);
+ qxl->data_size = size;
+ qxl->prev_chunk = to_physical(prev);
+ if (prev)
+ prev->next_chunk = to_physical(qxl);
+ return ptr;
+}
+
+static void init_meminfo(RedMemSlotInfo *mem_info)
+{
+ memslot_info_init(mem_info, 1 /* groups */, 1 /* slots */, 1, 1, 0);
+ memslot_info_add_slot(mem_info, 0, 0, 0 /* delta */, 0 /* start */, UINTPTR_MAX /* end */, 0 /* generation */);
+}
+
+static void init_qxl_surface(QXLSurfaceCmd *qxl)
+{
+ void *surface_mem;
+
+ memset(qxl, 0, sizeof(*qxl));
+
+ qxl->surface_id = 123;
+
+ qxl->u.surface_create.format = SPICE_SURFACE_FMT_32_xRGB;
+ qxl->u.surface_create.width = 128;
+ qxl->u.surface_create.stride = 512;
+ qxl->u.surface_create.height = 128;
+ surface_mem = g_malloc(0x10000);
+ qxl->u.surface_create.data = to_physical(surface_mem);
+}
+
+static void deinit_qxl_surface(QXLSurfaceCmd *qxl)
+{
+ g_free(from_physical(qxl->u.surface_create.data));
+}
+
+static void test_memslot_invalid_group_id(void)
+{
+ RedMemSlotInfo mem_info;
+ init_meminfo(&mem_info);
+
+ memslot_get_virt(&mem_info, 0, 16, 1);
+}
+
+static void test_memslot_invalid_slot_id(void)
+{
+ RedMemSlotInfo mem_info;
+ init_meminfo(&mem_info);
+
+ memslot_get_virt(&mem_info, UINT64_C(1) << mem_info.memslot_id_shift, 16, 0);
+}
+
+static void test_memslot_invalid_addresses(void)
+{
+ g_test_trap_subprocess("/server/memslot-invalid-addresses/subprocess/group_id", 0, (GTestSubprocessFlags) 0);
+ g_test_trap_assert_stderr("*group_id too big*");
+
+ g_test_trap_subprocess("/server/memslot-invalid-addresses/subprocess/slot_id", 0, (GTestSubprocessFlags) 0);
+ g_test_trap_assert_stderr("*slot_id 1 too big*");
+}
+
+static void test_no_issues(void)
+{
+ RedMemSlotInfo mem_info;
+ QXLSurfaceCmd qxl;
+
+ init_meminfo(&mem_info);
+ init_qxl_surface(&qxl);
+
+ /* try to create a surface with no issues, should succeed */
+ auto cmd = red_surface_cmd_new(NULL, &mem_info, 0, to_physical(&qxl));
+ g_assert(cmd);
+ cmd.reset();
+
+ deinit_qxl_surface(&qxl);
+ memslot_info_destroy(&mem_info);
+}
+
+static void test_stride_too_small(void)
+{
+ RedMemSlotInfo mem_info;
+ QXLSurfaceCmd qxl;
+
+ init_meminfo(&mem_info);
+ init_qxl_surface(&qxl);
+
+ /* try to create a surface with a stride too small to fit
+ * the entire width.
+ * This can be used to cause buffer overflows so refuse it.
+ */
+ qxl.u.surface_create.stride = 256;
+ auto cmd = red_surface_cmd_new(NULL, &mem_info, 0, to_physical(&qxl));
+ g_assert(!cmd);
+
+ deinit_qxl_surface(&qxl);
+ memslot_info_destroy(&mem_info);
+}
+
+static void test_too_big_image(void)
+{
+ RedMemSlotInfo mem_info;
+ QXLSurfaceCmd qxl;
+
+ init_meminfo(&mem_info);
+ init_qxl_surface(&qxl);
+
+ /* try to create a surface quite large.
+ * The sizes (width and height) were chosen so the multiplication
+ * using 32 bit values gives a very small value.
+ * These kind of values should be refused as they will cause
+ * overflows. Also the total memory for the card is not enough to
+ * hold the surface so surely can't be accepted.
+ */
+ qxl.u.surface_create.stride = 0x08000004 * 4;
+ qxl.u.surface_create.width = 0x08000004;
+ qxl.u.surface_create.height = 0x40000020;
+ auto cmd = red_surface_cmd_new(NULL, &mem_info, 0, to_physical(&qxl));
+ g_assert(!cmd);
+
+ deinit_qxl_surface(&qxl);
+ memslot_info_destroy(&mem_info);
+}
+
+static void test_cursor_command(void)
+{
+ RedMemSlotInfo mem_info;
+ QXLCursorCmd cursor_cmd;
+ QXLCursor *cursor;
+
+ init_meminfo(&mem_info);
+
+ /* test base cursor with no problems */
+ memset(&cursor_cmd, 0, sizeof(cursor_cmd));
+ cursor_cmd.type = QXL_CURSOR_SET;
+
+ cursor = (QXLCursor*) create_chunk(SPICE_OFFSETOF(QXLCursor, chunk), 128 * 128 * 4, NULL, 0xaa);
+ cursor->header.unique = 1;
+ cursor->header.width = 128;
+ cursor->header.height = 128;
+ cursor->data_size = 128 * 128 * 4;
+
+ cursor_cmd.u.set.shape = to_physical(cursor);
+
+ auto red_cursor_cmd = red_cursor_cmd_new(NULL, &mem_info, 0, to_physical(&cursor_cmd));
+ g_assert(red_cursor_cmd);
+ red_cursor_cmd.reset();
+ g_free(cursor);
+ memslot_info_destroy(&mem_info);
+}
+
+static void test_circular_empty_chunks(void)
+{
+ RedMemSlotInfo mem_info;
+ QXLCursorCmd cursor_cmd;
+ QXLCursor *cursor;
+ QXLDataChunk *chunks[2];
+
+ init_meminfo(&mem_info);
+ g_test_expect_message(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING,
+ "*red_get_data_chunks_ptr: data split in too many chunks, avoiding DoS*");
+
+ /* a circular list of empty chunks should not be a problems */
+ memset(&cursor_cmd, 0, sizeof(cursor_cmd));
+ cursor_cmd.type = QXL_CURSOR_SET;
+
+ cursor = (QXLCursor*) create_chunk(SPICE_OFFSETOF(QXLCursor, chunk), 0, NULL, 0xaa);
+ cursor->header.unique = 1;
+ cursor->header.width = 128;
+ cursor->header.height = 128;
+ cursor->data_size = 128 * 128 * 4;
+
+ chunks[0] = (QXLDataChunk*) create_chunk(0, 0, &cursor->chunk, 0xaa);
+ chunks[0]->next_chunk = to_physical(&cursor->chunk);
+
+ cursor_cmd.u.set.shape = to_physical(cursor);
+
+ auto red_cursor_cmd = red_cursor_cmd_new(NULL, &mem_info, 0, to_physical(&cursor_cmd));
+ if (red_cursor_cmd) {
+ /* function does not return errors so there should be no data */
+ g_assert_cmpuint(red_cursor_cmd->type, ==, QXL_CURSOR_SET);
+ g_assert_cmpuint(red_cursor_cmd->u.set.position.x, ==, 0);
+ g_assert_cmpuint(red_cursor_cmd->u.set.position.y, ==, 0);
+ g_assert_cmpuint(red_cursor_cmd->u.set.shape.data_size, ==, 0);
+ red_cursor_cmd.reset();
+ }
+ g_test_assert_expected_messages();
+
+ g_free(cursor);
+ g_free(chunks[0]);
+ memslot_info_destroy(&mem_info);
+}
+
+static void test_circular_small_chunks(void)
+{
+ RedMemSlotInfo mem_info;
+ QXLCursorCmd cursor_cmd;
+ QXLCursor *cursor;
+ QXLDataChunk *chunks[2];
+
+ init_meminfo(&mem_info);
+ g_test_expect_message(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING,
+ "*red_get_data_chunks_ptr: data split in too many chunks, avoiding DoS*");
+
+ /* a circular list of small chunks should not be a problems */
+ memset(&cursor_cmd, 0, sizeof(cursor_cmd));
+ cursor_cmd.type = QXL_CURSOR_SET;
+
+ cursor = (QXLCursor*) create_chunk(SPICE_OFFSETOF(QXLCursor, chunk), 1, NULL, 0xaa);
+ cursor->header.unique = 1;
+ cursor->header.width = 128;
+ cursor->header.height = 128;
+ cursor->data_size = 128 * 128 * 4;
+
+ chunks[0] = (QXLDataChunk*) create_chunk(0, 1, &cursor->chunk, 0xaa);
+ chunks[0]->next_chunk = to_physical(&cursor->chunk);
+
+ cursor_cmd.u.set.shape = to_physical(cursor);
+
+ auto red_cursor_cmd = red_cursor_cmd_new(NULL, &mem_info, 0, to_physical(&cursor_cmd));
+ if (red_cursor_cmd) {
+ /* function does not return errors so there should be no data */
+ g_assert_cmpuint(red_cursor_cmd->type, ==, QXL_CURSOR_SET);
+ g_assert_cmpuint(red_cursor_cmd->u.set.position.x, ==, 0);
+ g_assert_cmpuint(red_cursor_cmd->u.set.position.y, ==, 0);
+ g_assert_cmpuint(red_cursor_cmd->u.set.shape.data_size, ==, 0);
+ red_cursor_cmd.reset();
+ }
+ g_test_assert_expected_messages();
+
+ g_free(cursor);
+ g_free(chunks[0]);
+ memslot_info_destroy(&mem_info);
+}
+
+
+int main(int argc, char *argv[])
+{
+ g_test_init(&argc, &argv, NULL);
+
+ /* try to use invalid memslot group/slot */
+ g_test_add_func("/server/memslot-invalid-addresses", test_memslot_invalid_addresses);
+ g_test_add_func("/server/memslot-invalid-addresses/subprocess/group_id", test_memslot_invalid_group_id);
+ g_test_add_func("/server/memslot-invalid-addresses/subprocess/slot_id", test_memslot_invalid_slot_id);
+
+ /* try to create a surface with no issues, should succeed */
+ g_test_add_func("/server/qxl-parsing-no-issues", test_no_issues);
+
+ /* try to create a surface with a stride too small to fit
+ * the entire width.
+ * This can be used to cause buffer overflows so refuse it.
+ */
+ g_test_add_func("/server/qxl-parsing/stride-too-small", test_stride_too_small);
+
+ /* try to create a surface quite large.
+ * The sizes (width and height) were chosen so the multiplication
+ * using 32 bit values gives a very small value.
+ * These kind of values should be refused as they will cause
+ * overflows. Also the total memory for the card is not enough to
+ * hold the surface so surely can't be accepted.
+ */
+ g_test_add_func("/server/qxl-parsing/too-big-image", test_too_big_image);
+
+ /* test base cursor with no problems */
+ g_test_add_func("/server/qxl-parsing/base-cursor-command", test_cursor_command);
+
+ /* a circular list of empty chunks should not be a problems */
+ g_test_add_func("/server/qxl-parsing/circular-empty-chunks", test_circular_empty_chunks);
+
+ /* a circular list of small chunks should not be a problems */
+ g_test_add_func("/server/qxl-parsing/circular-small-chunks", test_circular_small_chunks);
+
+ return g_test_run();
+}
diff --git a/server/tests/test-record.c b/server/tests/test-record.c
new file mode 100644
index 00000000..acade46c
--- /dev/null
+++ b/server/tests/test-record.c
@@ -0,0 +1,123 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2018 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+/*
+ * Test some red_record_ APIs.
+ */
+#include <config.h>
+
+#include <unistd.h>
+#include <string.h>
+#include <stdbool.h>
+
+#include "test-glib-compat.h"
+#include "red-record-qxl.h"
+
+#define OUTPUT_FILENAME "rec1.txt"
+
+static void
+test_record(bool compress)
+{
+ RedRecord *rec;
+ const char *fn = OUTPUT_FILENAME;
+
+ g_unsetenv("SPICE_WORKER_RECORD_FILTER");
+ if (compress) {
+ g_setenv("SPICE_WORKER_RECORD_FILTER", "gzip", 1);
+ }
+
+ // delete possible stale test output
+ unlink(fn);
+ g_assert_cmpint(access(fn, F_OK), <, 0);
+
+ // create recorder
+ rec = red_record_new(fn);
+ g_assert_nonnull(rec);
+
+ // check file was created by recorder
+ g_assert_cmpint(access(fn, F_OK), ==, 0);
+
+ g_assert_nonnull(red_record_ref(rec));
+ red_record_unref(rec);
+
+ // record something
+ red_record_event(rec, 1, 123);
+
+ red_record_unref(rec);
+
+ // this code prevents a race between closing the record and using the file
+ // in case of a filter is used. red_record_unref flushed data to external
+ // program but don't wait. Make sure other program wrote some data
+ if (compress) {
+ int n;
+ for (n = 0; n < 10; ++n) {
+ FILE *f = fopen(fn, "rb");
+ if (f) {
+ long size;
+ fseek(f, 0, SEEK_END);
+ size = ftell(f);
+ fclose(f);
+ if (size > 0) {
+ break;
+ }
+ }
+ usleep(100000);
+ }
+ }
+
+ // check content of the output file
+ FILE *f;
+ if (!compress) {
+ f = fopen(fn, "rb");
+ } else {
+ f = popen("gzip -dc < " OUTPUT_FILENAME, "r");
+ }
+ g_assert_nonnull(f);
+
+ char line[1024];
+ int version;
+ g_assert_nonnull(fgets(line, sizeof(line), f));
+ g_assert_cmpint(sscanf(line, "SPICE_REPLAY %d", &version), ==, 1);
+
+ int w, t;
+ g_assert_nonnull(fgets(line, sizeof(line), f));
+ g_assert_cmpint(sscanf(line, "event %*d %d %d", &w, &t), ==, 2);
+ g_assert_cmpint(w, ==, 1);
+ g_assert_cmpint(t, ==, 123);
+
+ g_assert_null(fgets(line, sizeof(line), f));
+
+ if (!compress) {
+ fclose(f);
+ } else {
+ pclose(f);
+ }
+
+ // clean test output file
+ unlink(fn);
+}
+
+int
+main(void)
+{
+ test_record(false);
+ // TODO implement on Windows
+#ifndef _WIN32
+ test_record(true);
+#endif
+ return 0;
+}
diff --git a/server/tests/test-sasl.c b/server/tests/test-sasl.c
new file mode 100644
index 00000000..0a70b1a8
--- /dev/null
+++ b/server/tests/test-sasl.c
@@ -0,0 +1,665 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2017 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+/*
+ * Test SASL connections.
+ */
+#include <config.h>
+
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <stdbool.h>
+#include <spice.h>
+#include <sasl/sasl.h>
+
+#include <spice/protocol.h>
+#include <common/macros.h>
+
+#include "test-glib-compat.h"
+#include "basic-event-loop.h"
+
+#include <spice/start-packed.h>
+typedef struct SPICE_ATTR_PACKED SpiceInitialMessage {
+ SpiceLinkHeader hdr;
+ SpiceLinkMess mess;
+ uint32_t caps[2];
+} SpiceInitialMessage;
+#include <spice/end-packed.h>
+
+typedef enum {
+ FLAG_NONE = 0,
+ FLAG_START_OK = 1,
+ FLAG_LOW_SSF = 2,
+ FLAG_SERVER_NULL_START = 4,
+ FLAG_SERVER_NULL_STEP = 8,
+ FLAG_CLIENT_NULL_START = 16,
+ FLAG_CLIENT_NULL_STEP = 32,
+ FLAG_SERVER_BIG_START = 64,
+ FLAG_SERVER_BIG_STEP = 128,
+ FLAG_CLIENT_BIG_START = 256,
+ FLAG_CLIENT_BIG_STEP = 512,
+ FLAG_START_ERROR = 1024,
+ FLAG_STEP_ERROR = 2048,
+} TestFlags;
+
+static char *mechlist;
+static char *big_data;
+static bool mechlist_called;
+static bool start_called;
+static bool step_called;
+static bool encode_called;
+static unsigned test_flags;
+
+static SpiceCoreInterface *core;
+static SpiceServer *server;
+
+static unsigned int test_num;
+
+static gboolean idle_end_test(void *arg);
+
+static void
+check_sasl_conn(sasl_conn_t *conn)
+{
+ g_assert_nonnull(conn);
+}
+
+static void
+get_step_out(const char **serverout, unsigned *serveroutlen,
+ const char *normal_data, unsigned null_flag, unsigned big_flag)
+{
+ if ((test_flags & big_flag) != 0) {
+ *serverout = big_data;
+ *serveroutlen = strlen(big_data);
+ } else if ((test_flags & null_flag) != 0) {
+ *serverout = NULL;
+ *serveroutlen = 0;
+ } else {
+ *serverout = normal_data;
+ *serveroutlen = strlen(normal_data);
+ }
+}
+
+int
+sasl_server_init(const sasl_callback_t *callbacks, const char *appname)
+{
+ g_assert_null(callbacks);
+ return SASL_OK;
+}
+
+int
+sasl_decode(sasl_conn_t *conn,
+ const char *input, unsigned inputlen,
+ const char **output, unsigned *outputlen)
+{
+ check_sasl_conn(conn);
+ g_assert(start_called);
+
+ return SASL_NOTDONE;
+}
+
+int
+sasl_encode(sasl_conn_t *conn,
+ const char *input, unsigned inputlen,
+ const char **output, unsigned *outputlen)
+{
+ check_sasl_conn(conn);
+ g_assert(start_called);
+
+ encode_called = true;
+ return SASL_NOTDONE;
+}
+
+const char *
+sasl_errdetail(sasl_conn_t *conn)
+{
+ check_sasl_conn(conn);
+ return "XXX";
+}
+
+const char *
+sasl_errstring(int saslerr,
+ const char *langlist,
+ const char **outlang)
+{
+ return "YYY";
+}
+
+int
+sasl_getprop(sasl_conn_t *conn, int propnum,
+ const void **pvalue)
+{
+ check_sasl_conn(conn);
+ g_assert_nonnull(pvalue);
+
+ if (propnum == SASL_SSF) {
+ static int val;
+ val = (test_flags & FLAG_LOW_SSF) ? 44 : 64;
+ *pvalue = &val;
+ }
+ return SASL_OK;
+}
+
+int
+sasl_setprop(sasl_conn_t *conn,
+ int propnum,
+ const void *value)
+{
+ check_sasl_conn(conn);
+ g_assert(value);
+ return SASL_OK;
+}
+
+int
+sasl_server_new(const char *service,
+ const char *serverFQDN,
+ const char *user_realm,
+ const char *iplocalport,
+ const char *ipremoteport,
+ const sasl_callback_t *callbacks,
+ unsigned flags,
+ sasl_conn_t **pconn)
+{
+ g_assert_nonnull(pconn);
+ g_assert_null(callbacks);
+
+ *pconn = (sasl_conn_t *) GUINT_TO_POINTER(0xdeadbeef);
+ return SASL_OK;
+}
+
+void
+sasl_dispose(sasl_conn_t **pconn)
+{
+ g_assert_nonnull(pconn);
+ check_sasl_conn(*pconn);
+}
+
+int
+sasl_listmech(sasl_conn_t *conn,
+ const char *user,
+ const char *prefix,
+ const char *sep,
+ const char *suffix,
+ const char **result,
+ unsigned *plen,
+ int *pcount)
+{
+ check_sasl_conn(conn);
+ g_assert_nonnull(result);
+ g_assert_nonnull(prefix);
+ g_assert_nonnull(sep);
+ g_assert_nonnull(suffix);
+ g_assert(!mechlist_called);
+ g_assert(!start_called);
+ g_assert(!step_called);
+ mechlist_called = true;
+
+ g_free(mechlist);
+ mechlist = g_strjoin("", prefix, "ONE", sep, "TWO", sep, "THREE", suffix, NULL);
+ *result = mechlist;
+ return SASL_OK;
+}
+
+int
+sasl_server_start(sasl_conn_t *conn,
+ const char *mech,
+ const char *clientin,
+ unsigned clientinlen,
+ const char **serverout,
+ unsigned *serveroutlen)
+{
+ check_sasl_conn(conn);
+ g_assert_nonnull(serverout);
+ g_assert(mechlist_called);
+ g_assert(!start_called);
+ g_assert(!step_called);
+ start_called = true;
+
+ get_step_out(serverout, serveroutlen, "foo", FLAG_SERVER_NULL_START, FLAG_SERVER_BIG_START);
+ if (test_flags & FLAG_START_ERROR) {
+ return SASL_FAIL;
+ }
+ return (test_flags & FLAG_START_OK) ? SASL_OK : SASL_CONTINUE;
+}
+
+int
+sasl_server_step(sasl_conn_t *conn,
+ const char *clientin,
+ unsigned clientinlen,
+ const char **serverout,
+ unsigned *serveroutlen)
+{
+ check_sasl_conn(conn);
+ g_assert_nonnull(serverout);
+ g_assert(start_called);
+ step_called = true;
+
+ get_step_out(serverout, serveroutlen, "foo", FLAG_SERVER_NULL_STEP, FLAG_SERVER_BIG_STEP);
+ if (test_flags & FLAG_STEP_ERROR) {
+ return SASL_FAIL;
+ }
+ return SASL_OK;
+}
+
+static SpiceInitialMessage initial_message = {
+ {
+ 0, // SPICE_MAGIC,
+ GUINT32_TO_LE(SPICE_VERSION_MAJOR), GUINT32_TO_LE(SPICE_VERSION_MINOR),
+ GUINT32_TO_LE(sizeof(SpiceInitialMessage) - sizeof(SpiceLinkHeader))
+ },
+ {
+ 0,
+ SPICE_CHANNEL_MAIN,
+ 0,
+ GUINT32_TO_LE(1),
+ GUINT32_TO_LE(1),
+ GUINT32_TO_LE(sizeof(SpiceLinkMess))
+ },
+ {
+ GUINT32_TO_LE(SPICE_COMMON_CAP_PROTOCOL_AUTH_SELECTION|SPICE_COMMON_CAP_AUTH_SASL|
+ SPICE_COMMON_CAP_MINI_HEADER),
+ 0
+ }
+};
+
+static void
+reset_test(void)
+{
+ mechlist_called = false;
+ start_called = false;
+ step_called = false;
+ encode_called = false;
+ test_flags = FLAG_NONE;
+}
+
+static void
+start_test(void)
+{
+ g_assert_null(big_data);
+ big_data = (char*) g_malloc(1024 * 1024 + 10);
+ for (unsigned n = 0; n < 1024 * 1024 + 10; ++n) {
+ big_data[n] = ' ' + (n % 94);
+ }
+ big_data[1024 * 1024 + 5] = 0;
+
+ g_assert_null(server);
+
+ initial_message.hdr.magic = SPICE_MAGIC;
+
+ reset_test();
+
+ core = basic_event_loop_init();
+ g_assert_nonnull(core);
+
+ server = spice_server_new();
+ g_assert_nonnull(server);
+ spice_server_set_sasl(server, true);
+ g_assert_cmpint(spice_server_init(server, core), ==, 0);
+}
+
+static void
+end_tests(void)
+{
+ spice_server_destroy(server);
+ server = NULL;
+
+ basic_event_loop_destroy();
+ core = NULL;
+
+ g_free(mechlist);
+ mechlist = NULL;
+
+ g_free(big_data);
+ big_data = NULL;
+}
+
+static size_t
+do_readwrite_all(int fd, const void *buf, const size_t len, bool do_write)
+{
+ size_t byte_count = 0;
+ while (byte_count < len) {
+ int l;
+ if (do_write) {
+ l = write(fd, (const char *) buf + byte_count, len - byte_count);
+ } else {
+ l = read(fd, (char *) buf + byte_count, len - byte_count);
+ if (l == 0) {
+ return byte_count;
+ }
+ }
+ if (l < 0 && errno == EINTR) {
+ continue;
+ }
+ if (l < 0) {
+ return l;
+ }
+ byte_count += l;
+ }
+ return byte_count;
+}
+
+// use macro to maintain line number on error
+#define read_all(fd, buf, len) \
+ g_assert_cmpint(do_readwrite_all(fd, buf, len, false), ==, len)
+
+#define write_all(fd, buf, len) \
+ g_assert_cmpint(do_readwrite_all(fd, buf, len, true), ==, len)
+
+static ssize_t
+read_u32_err(int fd, uint32_t *out)
+{
+ uint32_t val = 0;
+ ssize_t ret = do_readwrite_all(fd, &val, sizeof(val), false);
+ *out = GUINT32_FROM_LE(val);
+ return ret;
+}
+#define read_u32(fd, out) \
+ g_assert_cmpint(read_u32_err(fd, out), ==, sizeof(uint32_t))
+
+static ssize_t
+write_u32_err(int fd, uint32_t val)
+{
+ val = GUINT32_TO_LE(val);
+ return do_readwrite_all(fd, &val, sizeof(val), true);
+}
+
+#define write_u32(fd, val) \
+ g_assert_cmpint(write_u32_err(fd, val), ==, sizeof(uint32_t))
+
+/* This function is similar to g_idle_add but uses our internal Glib
+ * main context. g_idle_add uses the default main context but to make
+ * sure we can use a different main context we don't use the default
+ * one (as Qemu does) */
+static void
+idle_add(GSourceFunc func, void *arg)
+{
+ GSource *source = g_idle_source_new();
+ g_source_set_callback(source, func, NULL, NULL);
+ g_source_attach(source, basic_event_loop_get_context());
+ g_source_unref(source);
+}
+
+typedef enum {
+ STEP_NONE,
+ STEP_READ_MECHLIST_LEN,
+ STEP_READ_MECHLIST,
+ STEP_WRITE_MECHNAME_LEN,
+ STEP_WRITE_MECHNAME,
+ STEP_WRITE_START_LEN,
+ STEP_WRITE_START,
+ STEP_WRITE_STEP_LEN,
+ STEP_WRITE_STEP,
+ STEP_NEVER,
+} ClientEmulationSteps;
+
+typedef enum {
+ FAILURE_OK,
+ FAILURE_UNKNOWN,
+ FAILURE_DISCONNECT,
+ FAILURE_MAGIC,
+ FAILURE_AUTH,
+} FailureType;
+
+typedef struct {
+ const char *mechname;
+ int mechlen;
+ bool success;
+ FailureType failure_type;
+ ClientEmulationSteps last_step;
+ unsigned flags;
+ int line;
+} TestData;
+
+static char long_mechname[128];
+static TestData tests_data[] = {
+ // these should just succeed
+#define TEST_SUCCESS(mech) \
+ { mech, -1, true, FAILURE_OK, STEP_NEVER, FLAG_NONE, __LINE__ },
+ TEST_SUCCESS("ONE")
+ TEST_SUCCESS("TWO")
+ TEST_SUCCESS("THREE")
+
+ // these test bad mech names
+#define TEST_BAD_NAME(mech, len) \
+ { mech, len, false, FAILURE_MAGIC, STEP_NEVER, FLAG_NONE, __LINE__ },
+#define TEST_BAD_NAME_LEN(mech, len) \
+ { mech, len, false, FAILURE_DISCONNECT, STEP_NEVER, FLAG_NONE, __LINE__ },
+ TEST_BAD_NAME("ON", -1)
+ TEST_BAD_NAME("NE", -1)
+ TEST_BAD_NAME("THRE", -1)
+ TEST_BAD_NAME("HREE", -1)
+ TEST_BAD_NAME("ON\x00", 3)
+ TEST_BAD_NAME("O\x00\x00", 3)
+ TEST_BAD_NAME_LEN("", -1)
+ TEST_BAD_NAME(long_mechname, 100)
+ TEST_BAD_NAME_LEN(long_mechname, 101)
+ TEST_BAD_NAME("ONE,TWO", -1)
+
+ // stop before filling everything
+#define TEST_EARLY_STOP(step) \
+ { "ONE", -1, false, FAILURE_UNKNOWN, step, FLAG_NONE, __LINE__},
+ TEST_EARLY_STOP(STEP_READ_MECHLIST_LEN)
+ TEST_EARLY_STOP(STEP_READ_MECHLIST)
+ TEST_EARLY_STOP(STEP_WRITE_MECHNAME_LEN)
+ TEST_EARLY_STOP(STEP_WRITE_MECHNAME)
+ TEST_EARLY_STOP(STEP_WRITE_START_LEN)
+ TEST_EARLY_STOP(STEP_WRITE_START)
+ TEST_EARLY_STOP(STEP_WRITE_STEP_LEN)
+
+#define TEST_FLAGS_OK(flags) \
+ { "ONE", -1, true, FAILURE_OK, STEP_NEVER, flags, __LINE__},
+#define TEST_FLAGS_KO(failure, flags) \
+ { "ONE", -1, false, failure, STEP_NEVER, flags, __LINE__},
+ TEST_FLAGS_KO(FAILURE_OK, FLAG_LOW_SSF)
+ TEST_FLAGS_KO(FAILURE_OK, FLAG_START_OK|FLAG_LOW_SSF)
+ TEST_FLAGS_OK(FLAG_START_OK)
+ TEST_FLAGS_OK(FLAG_SERVER_NULL_START)
+ TEST_FLAGS_OK(FLAG_SERVER_NULL_STEP)
+ TEST_FLAGS_OK(FLAG_CLIENT_NULL_START)
+ TEST_FLAGS_OK(FLAG_CLIENT_NULL_STEP)
+ TEST_FLAGS_KO(FAILURE_DISCONNECT, FLAG_SERVER_BIG_START)
+ TEST_FLAGS_KO(FAILURE_DISCONNECT, FLAG_SERVER_BIG_STEP)
+ TEST_FLAGS_KO(FAILURE_MAGIC, FLAG_CLIENT_BIG_START)
+ TEST_FLAGS_KO(FAILURE_DISCONNECT, FLAG_CLIENT_BIG_STEP)
+ TEST_FLAGS_KO(FAILURE_DISCONNECT, FLAG_START_ERROR)
+ TEST_FLAGS_KO(FAILURE_DISCONNECT, FLAG_STEP_ERROR)
+};
+
+static FailureType
+client_emulator(int sock)
+{
+ const TestData *data = &tests_data[test_num];
+
+#define STOP_AT(step) if (data->last_step == STEP_ ## step) { return FAILURE_UNKNOWN; }
+
+ // send initial message
+ write_all(sock, &initial_message, sizeof(initial_message));
+
+ // server replies link ack with rsa, etc, similar to above beside
+ // fixed fields
+ struct {
+ SpiceLinkHeader header;
+ SpiceLinkReply ack;
+ } msg;
+ SPICE_VERIFY(sizeof(msg) == sizeof(SpiceLinkHeader) + sizeof(SpiceLinkReply));
+ read_all(sock, &msg, sizeof(msg));
+ uint32_t num_caps = GUINT32_FROM_LE(msg.ack.num_common_caps) +
+ GUINT32_FROM_LE(msg.ack.num_channel_caps);
+ while (num_caps-- > 0) {
+ uint32_t cap;
+ read_all(sock, &cap, sizeof(cap));
+ }
+
+ // client have to send a SpiceLinkAuthMechanism (just uint32 with
+ // mech SPICE_COMMON_CAP_AUTH_SASL)
+ write_u32(sock, SPICE_COMMON_CAP_AUTH_SASL);
+
+ STOP_AT(NONE);
+
+ // sasl finally start, data starts from server (mech list)
+ //
+ uint32_t mechlen;
+ read_u32(sock, &mechlen);
+ STOP_AT(READ_MECHLIST_LEN);
+
+ char buf[300];
+ g_assert_cmpint(mechlen, <=, sizeof(buf));
+ read_all(sock, buf, mechlen);
+ STOP_AT(READ_MECHLIST);
+
+ // mech name
+ write_u32(sock, data->mechlen);
+ STOP_AT(WRITE_MECHNAME_LEN);
+ write_all(sock, data->mechname, data->mechlen);
+ STOP_AT(WRITE_MECHNAME);
+
+ // first challenge
+ const char *out;
+ unsigned outlen;
+ get_step_out(&out, &outlen, "START", FLAG_CLIENT_NULL_START, FLAG_CLIENT_BIG_START);
+ if (write_u32_err(sock, out ? outlen : 0) == sizeof(uint32_t)) {
+ STOP_AT(WRITE_START_LEN);
+ if (out) {
+ do_readwrite_all(sock, out, outlen, true);
+ }
+ STOP_AT(WRITE_START);
+ }
+
+ for (;;) {
+ uint32_t datalen;
+ if (read_u32_err(sock, &datalen) != sizeof(datalen)) {
+ return FAILURE_DISCONNECT;
+ }
+ if (datalen == GUINT32_FROM_LE(SPICE_MAGIC)) {
+ return FAILURE_MAGIC;
+ }
+ g_assert_cmpint(datalen, <=, sizeof(buf));
+ read_all(sock, buf, datalen);
+
+ uint8_t is_ok = 0;
+ read_all(sock, &is_ok, sizeof(is_ok));
+ if (is_ok) {
+ // is_ok should be 0 or 1
+ g_assert_cmpint(is_ok, ==, 1);
+ uint32_t step_result;
+ read_u32(sock, &step_result);
+ if (!step_result) {
+ return FAILURE_AUTH;
+ }
+ return FAILURE_OK;
+ }
+
+ get_step_out(&out, &outlen, "STEP", FLAG_CLIENT_NULL_STEP, FLAG_CLIENT_BIG_STEP);
+ if (write_u32_err(sock, out ? outlen : 0) == sizeof(uint32_t)) {
+ STOP_AT(WRITE_STEP_LEN);
+ if (out) {
+ do_readwrite_all(sock, out, outlen, true);
+ }
+ STOP_AT(WRITE_STEP);
+ }
+ }
+}
+
+static void *
+client_emulator_thread(void *arg)
+{
+ int sock = GPOINTER_TO_INT(arg);
+
+ FailureType result = client_emulator(sock);
+
+ shutdown(sock, SHUT_RDWR);
+ close(sock);
+
+ idle_add(idle_end_test, NULL);
+
+ return GINT_TO_POINTER(result);
+}
+
+static pthread_t
+setup_thread(void)
+{
+ TestData *data = &tests_data[test_num];
+ if (data->mechlen < 0) {
+ data->mechlen = strlen(data->mechname);
+ }
+ test_flags = data->flags;
+ int len = data->mechlen;
+ printf("\nRunning test %d ('%.*s' %d) line %d\n",
+ test_num, len, data->mechname, len, data->line);
+
+ int sv[2];
+ g_assert_cmpint(socketpair(AF_LOCAL, SOCK_STREAM, 0, sv), ==, 0);
+
+ g_assert(spice_server_add_client(server, sv[0], 0) == 0);
+
+ pthread_t thread;
+ g_assert_cmpint(pthread_create(&thread, NULL, client_emulator_thread,
+ GINT_TO_POINTER(sv[1])), ==, 0);
+ return thread;
+}
+
+// called when the next test has to be run
+static gboolean
+idle_end_test(void *arg)
+{
+ basic_event_loop_quit();
+
+ return G_SOURCE_REMOVE;
+}
+
+static void
+check_test_results(FailureType res)
+{
+ const TestData *data = &tests_data[test_num];
+ if (data->success) {
+ g_assert(encode_called);
+ return;
+ }
+
+ g_assert(mechlist_called);
+ g_assert(!encode_called);
+ g_assert_cmpint(res, ==, data->failure_type);
+}
+
+static void
+sasl_mechs(void)
+{
+ start_test();
+
+ memset(long_mechname, 'X', sizeof(long_mechname));
+
+ for (test_num = 0; test_num < G_N_ELEMENTS(tests_data); test_num++) {
+ pthread_t thread = setup_thread();
+ alarm(4);
+ basic_event_loop_mainloop();
+ void *thread_ret = NULL;
+ g_assert_cmpint(pthread_join(thread, &thread_ret), ==, 0);
+ alarm(0);
+ check_test_results((FailureType)GPOINTER_TO_INT(thread_ret));
+ reset_test();
+ }
+
+ end_tests();
+}
+
+int
+main(int argc, char *argv[])
+{
+ sasl_mechs();
+
+ return 0;
+}
diff --git a/client/monitor.cpp b/server/tests/test-set-ticket.c
index 3d742967..ebfe1445 100644
--- a/client/monitor.cpp
+++ b/server/tests/test-set-ticket.c
@@ -1,5 +1,6 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
/*
- Copyright (C) 2009 Red Hat, Inc.
+ Copyright (C) 2020 Red Hat, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@@ -14,36 +15,25 @@
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
-#ifdef HAVE_CONFIG_H
#include <config.h>
-#endif
+#include <spice.h>
-#include "common.h"
-#include "monitor.h"
-#include "debug.h"
-#include "platform.h"
+#include "test-glib-compat.h"
-uint32_t Monitor::self_monitors_change = 0;
-
-
-Monitor::Monitor(int id)
- : _id (id)
- , _free (true)
+static void set_ticket(void)
{
-}
+ SpiceServer *server = spice_server_new();
-bool Monitor::is_self_change()
-{
- return self_monitors_change != 0;
+ spice_server_set_ticket(server, "test", 10, TRUE, TRUE);
+ spice_server_set_port(server, 5911);
+ spice_server_destroy(server);
}
-void Monitor::set_mode(int width, int height)
+int main(int argc, char *argv[])
{
- do_set_mode(width, height);
- Platform::reset_cursor_pos();
-}
-void Monitor::restore()
-{
- do_restore();
- Platform::reset_cursor_pos();
+ g_test_init(&argc, &argv, NULL);
+
+ g_test_add_func("/server/set ticket", set_ticket);
+
+ return g_test_run();
}
diff --git a/server/tests/test-smartcard.cpp b/server/tests/test-smartcard.cpp
new file mode 100644
index 00000000..f76f602e
--- /dev/null
+++ b/server/tests/test-smartcard.cpp
@@ -0,0 +1,397 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2019 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+/**
+ * Test Smartcard device and channel
+ */
+
+#include <config.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdbool.h>
+#include <unistd.h>
+
+#include <spice/protocol.h>
+#include <spice/stream-device.h>
+
+#include "test-display-base.h"
+#include "test-glib-compat.h"
+#include "reds.h"
+#include "vmc-emu.h"
+#include "red-client.h"
+#include "net-utils.h"
+#include "win-alarm.h"
+
+static SpiceCoreInterface *core;
+static Test *test;
+static VmcEmu *vmc;
+typedef int TestFixture;
+static int client_socket = -1;
+// buffer when data from channel are stored
+static SpiceBuffer channel_buf;
+// expected buffer in channel
+static SpiceBuffer channel_expected;
+// expected buffer in device
+static SpiceBuffer device_expected;
+static SpiceWatch *watch;
+
+static void next_test(void);
+
+static void test_smartcard_setup(TestFixture *fixture, gconstpointer user_data)
+{
+ g_assert_null(core);
+ g_assert_null(test);
+ g_assert_null(vmc);
+ core = basic_event_loop_init();
+ g_assert_nonnull(core);
+ test = test_new(core);
+ g_assert_nonnull(test);
+ vmc = vmc_emu_new("smartcard", NULL);
+ g_assert_nonnull(vmc);
+}
+
+static void test_smartcard_teardown(TestFixture *fixture, gconstpointer user_data)
+{
+ g_assert_nonnull(core);
+ g_assert_nonnull(test);
+ g_assert_nonnull(vmc);
+
+ vmc_emu_destroy(vmc);
+ vmc = NULL;
+ test_destroy(test);
+ test = NULL;
+ basic_event_loop_destroy();
+ core = NULL;
+}
+
+static RedStream *create_dummy_stream(SpiceServer *server, int *p_socket)
+{
+ int sv[2];
+ g_assert_cmpint(socketpair(AF_LOCAL, SOCK_STREAM, 0, sv), ==, 0);
+ if (p_socket) {
+ *p_socket = sv[1];
+ }
+ red_socket_set_non_blocking(sv[0], true);
+ red_socket_set_non_blocking(sv[1], true);
+
+ RedStream * stream = red_stream_new(server, sv[0]);
+ g_assert_nonnull(stream);
+
+ return stream;
+}
+
+static void send_ack_sync(int socket, uint32_t generation)
+{
+ struct {
+ uint16_t dummy;
+ uint16_t type;
+ uint32_t len;
+ uint32_t generation;
+ } msg;
+ SPICE_VERIFY(sizeof(msg) == 12);
+ msg.type = GUINT16_TO_LE(SPICE_MSGC_ACK_SYNC);
+ msg.len = GUINT32_TO_LE(sizeof(generation));
+ msg.generation = GUINT32_TO_LE(generation);
+
+ g_assert_cmpint(socket_write(socket, reinterpret_cast<uint8_t *>(&msg) + 2, 10), ==, 10);
+}
+
+static void send_data(int socket, uint32_t type, uint32_t reader_id)
+{
+ struct {
+ uint16_t dummy;
+ uint16_t type;
+ uint32_t len;
+ VSCMsgHeader vheader;
+ char data[6];
+ } msg;
+ SPICE_VERIFY(sizeof(msg) == 8+12+8);
+ msg.type = GUINT16_TO_LE(SPICE_MSGC_SMARTCARD_DATA);
+ msg.len = GUINT32_TO_LE(sizeof(VSCMsgHeader)+6);
+ msg.vheader.type = GUINT32_TO_LE(type);
+ msg.vheader.reader_id = GUINT32_TO_LE(reader_id);
+ msg.vheader.length = GUINT32_TO_LE(6);
+ strcpy(msg.data, "hello");
+
+ g_assert_cmpint(socket_write(socket, reinterpret_cast<uint8_t *>(&msg) + 2,
+ sizeof(msg) - 4), ==, sizeof(msg) - 4);
+}
+
+static void check_data(VmcEmu *vmc_emu)
+{
+ g_assert_cmpint(device_expected.offset, !=, 0);
+ if (vmc_emu->write_pos < device_expected.offset) {
+ return;
+ }
+ g_assert_cmpint(vmc_emu->write_pos, ==, device_expected.offset);
+ g_assert_true(memcmp(vmc_emu->write_buf, device_expected.buffer, device_expected.offset) == 0);
+ vmc_emu->write_pos = 0;
+
+ next_test();
+}
+
+static void data_from_channel(int fd, int event, void *opaque)
+{
+ uint8_t buf[128];
+ ssize_t ret = socket_read(fd, buf, sizeof(buf));
+ if (ret <= 0) {
+ g_assert(ret == 0 || errno == EAGAIN || errno == EINTR);
+ if (ret == 0) {
+ g_warning("TEST: connection closed");
+ core->watch_remove(watch);
+ watch = NULL;
+ next_test();
+ }
+ return;
+ }
+ spice_buffer_append(&channel_buf, buf, ret);
+
+ g_assert_cmpint(channel_expected.offset, !=, 0);
+ if (channel_buf.offset < channel_expected.offset) {
+ return;
+ }
+ g_assert_true(memcmp(channel_buf.buffer, channel_expected.buffer, channel_expected.offset) == 0);
+ spice_buffer_remove(&channel_buf, channel_expected.offset);
+
+ next_test();
+}
+
+static void next_test(void)
+{
+ static int test_num;
+
+ test_num++;
+ printf("Executing subtest %d\n", test_num);
+
+ spice_buffer_reset(&channel_expected);
+ spice_buffer_reset(&device_expected);
+
+ switch (test_num) {
+ // First test, send some message to channel expecting a reply
+ // for each message we are sending
+ case 1: {
+ static const char expected_buf[] =
+ // forwarded ReaderAdd message, note that payload is stripped
+ "\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00"
+ // forwarded APDU message
+ "\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x06\x68\x65\x6c\x6c\x6f\x00"
+ "\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00";
+ spice_buffer_append(&device_expected, expected_buf, sizeof(expected_buf) - 1);
+
+ send_data(client_socket, VSC_ReaderAdd, 0);
+ send_data(client_socket, VSC_APDU, 0);
+ send_data(client_socket, VSC_ReaderRemove, 0);
+ } break;
+ // Second test, send an init and remove a reader that is not present,
+ // we expect an error for the removal (the Init is ignored)
+ case 2: {
+ static const char expected_buf[] =
+ // forwarded Error message
+ "\x65\x00\x10\x00\x00\x00"
+ "\x02\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x01\x00\x00\x00";
+ spice_buffer_append(&channel_expected, expected_buf, sizeof(expected_buf) - 1);
+
+ // Init message, ignored
+ send_data(client_socket, VSC_Init, 0);
+ // remove again, this will trigger an error
+ send_data(client_socket, VSC_ReaderRemove, 0);
+ } break;
+ // Third test, APDU messages from device are forwarded to the channel.
+ // We split the header and payload of the first message to check device code can handle it.
+ // The second message is send inside a block with the end of the first to trigger
+ // an hard path in the device code
+ case 3: {
+ static const char expected_buf[] =
+ // forwarded APDU message
+ "\x65\x00\x12\x00\x00\x00"
+ "\x07\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00" "foobaz"
+ "\x65\x00\x12\x00\x00\x00"
+ "\x07\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00" "foobar";
+ spice_buffer_append(&channel_expected, expected_buf, sizeof(expected_buf) - 1);
+
+ vmc_emu_reset(vmc);
+ // data from device
+ uint8_t *p = vmc->message;
+
+ // add VSC_APDU message
+ memcpy(p, "\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x06" "foobaz", 18);
+ p += 18;
+ memcpy(p, "\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x06" "foobar", 18);
+ p += 18;
+ vmc_emu_add_read_till(vmc, vmc->message + 8);
+ vmc_emu_add_read_till(vmc, vmc->message + 14);
+ vmc_emu_add_read_till(vmc, p);
+
+ spice_server_char_device_wakeup(&vmc->instance);
+ } break;
+ // Fourth test, we should get back an error if client tried to remove
+ // a not existing reader
+ case 4: {
+ static const char expected_buf[] =
+ // forwarded Error message
+ "\x65\x00\x10\x00\x00\x00"
+ "\x02\x00\x00\x00\x05\x00\x00\x00\x04\x00\x00\x00\x01\x00\x00\x00";
+ spice_buffer_append(&channel_expected, expected_buf, sizeof(expected_buf) - 1);
+
+ // remove invalid, this will trigger an error
+ send_data(client_socket, VSC_ReaderRemove, 5);
+ } break;
+ // Fifth test, similar to previous but using an huge reader_id field to trigger
+ // possible buffer overflow
+ case 5: {
+ static const char expected_buf[] =
+ // forwarded Error message
+ "\x65\x00\x10\x00\x00\x00"
+ "\x02\x00\x00\x00\x05\x01\x00\x00\x04\x00\x00\x00\x01\x00\x00\x00";
+ spice_buffer_append(&channel_expected, expected_buf, sizeof(expected_buf) - 1);
+
+ // remove invalid and huge, this will trigger an error, should not crash
+ send_data(client_socket, VSC_ReaderRemove, 261);
+ } break;
+ // Sixth test, send an invalid message from client, a log is triggered
+ // but channel continues to work
+ case 6: {
+ static const char expected_buf[] =
+ // forwarded APDU message
+ "\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x06\x68\x65\x6c\x6c\x6f\x00";
+ spice_buffer_append(&device_expected, expected_buf, sizeof(expected_buf) - 1);
+
+ g_test_expect_message(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING,
+ "*ERROR: unexpected message on smartcard channel*");
+
+ // invalid message type, should log a warning
+ send_data(client_socket, 0xabcd, 0);
+ // APDU just to get an event
+ send_data(client_socket, VSC_APDU, 0);
+ } break;
+ // Seventh test, an Error message from device are forwarded to the channel.
+ // Note that the header is in big endian order while the error from device
+ // is in little endian order. This seems weird but it's correct with the
+ // current libcacard implementation which just send error as host order
+ case 7: {
+ g_test_assert_expected_messages();
+
+ static const char expected_buf[] =
+ // forwarded Error message
+ "\x65\x00\x10\x00\x00\x00"
+ "\x02\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x0a\x0b\x0c\x0d";
+ spice_buffer_append(&channel_expected, expected_buf, sizeof(expected_buf) - 1);
+
+ vmc_emu_reset(vmc);
+ // data from device
+ uint8_t *p = vmc->message;
+
+ // add Error message
+ memcpy(p, "\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x04\x0a\x0b\x0c\x0d", 16);
+ p += 16;
+ vmc_emu_add_read_till(vmc, p);
+
+ spice_server_char_device_wakeup(&vmc->instance);
+ } break;
+ // Eighth test, a message with invalid reader ID from device caused the channel
+ // to be closed
+ case 8: {
+ g_test_assert_expected_messages();
+
+ g_test_expect_message(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING,
+ "*ERROR: received message for non existing reader*");
+ g_test_expect_message(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING,
+ "*TEST: connection closed*");
+
+ send_data(client_socket, VSC_APDU, 0xabcd);
+ } break;
+ case 9:
+ g_test_assert_expected_messages();
+ basic_event_loop_quit();
+ break;
+ default:
+ abort();
+ }
+}
+
+static void test_smartcard(TestFixture *fixture, gconstpointer user_data)
+{
+ SpiceServer *const server = test->server;
+ uint8_t *p = vmc->message;
+
+ spice_server_add_interface(server, &vmc->instance.base);
+
+ // add VSC_Init message
+ memcpy(p, "\x00\x00\x00\x01\x0a\x0b\x0c\x0d\x00\x00\x00\x00", 12);
+ p += 12;
+ vmc_emu_add_read_till(vmc, vmc->message + 2); // check header is decoded correctly when split
+ vmc_emu_add_read_till(vmc, p);
+
+ // find Smartcard channel to connect to
+ RedChannel *channel = reds_find_channel(server, SPICE_CHANNEL_SMARTCARD, 0);
+ g_assert_nonnull(channel);
+
+ // create dummy RedClient and MainChannelClient
+ RedChannelCapabilities caps;
+ memset(&caps, 0, sizeof(caps));
+ uint32_t common_caps = 1 << SPICE_COMMON_CAP_MINI_HEADER;
+ caps.num_common_caps = 1;
+ caps.common_caps = (uint32_t*) spice_memdup(&common_caps, sizeof(common_caps));
+
+ RedClient *client = red_client_new(server, FALSE);
+ g_assert_nonnull(client);
+
+ red::shared_ptr<MainChannel> main_channel(main_channel_new(server));
+ g_assert(main_channel);
+
+ MainChannelClient *mcc;
+ mcc = main_channel_link(main_channel.get(), client, create_dummy_stream(server, NULL),
+ 0, FALSE, &caps);
+ g_assert_nonnull(mcc);
+
+ // create our testing RedChannelClient
+ channel->connect(client, create_dummy_stream(server, &client_socket), FALSE, &caps);
+ red_channel_capabilities_reset(&caps);
+
+ // push data to device
+ spice_server_char_device_wakeup(&vmc->instance);
+
+ // push data into channel
+ send_ack_sync(client_socket, 1);
+
+ // check data are processed
+ watch = core->watch_add(client_socket, SPICE_WATCH_EVENT_READ, data_from_channel, NULL);
+ vmc->data_written_cb = check_data;
+
+ // start all test
+ alarm(10);
+ next_test();
+ basic_event_loop_mainloop();
+ alarm(0);
+
+ // cleanup
+ if (watch) {
+ core->watch_remove(watch);
+ }
+ client->destroy();
+}
+
+int main(int argc, char *argv[])
+{
+ g_test_init(&argc, &argv, NULL);
+
+ g_test_add("/server/smartcard", TestFixture, NULL, test_smartcard_setup,
+ test_smartcard, test_smartcard_teardown);
+
+ return g_test_run();
+}
diff --git a/server/tests/test-stat-file.c b/server/tests/test-stat-file.c
new file mode 100644
index 00000000..e6aef827
--- /dev/null
+++ b/server/tests/test-stat-file.c
@@ -0,0 +1,118 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2016 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <spice.h>
+
+#include "test-glib-compat.h"
+#include "stat-file.h"
+
+static void stat_file(void)
+{
+ RedStatFile *stat_file;
+ StatNodeRef ref, refs[10];
+ uint64_t *counter, *counters[10] SPICE_GNUC_UNUSED;
+ int i;
+ char *filename = NULL;
+ char name[20];
+
+ /* create */
+ stat_file = stat_file_new(10);
+
+ g_assert_nonnull(stat_file);
+ g_assert_nonnull(stat_file_get_shm_name(stat_file));
+ filename = g_strdup(stat_file_get_shm_name(stat_file));
+ g_assert(access(filename, R_OK));
+
+ /* fill all nodes */
+ for (i = 0; i < 10; ++i) {
+ sprintf(name, "node %d", i);
+ ref = stat_file_add_node(stat_file, INVALID_STAT_REF, name, TRUE);
+ refs[i] = ref;
+ g_assert_cmpuint(ref,!=,INVALID_STAT_REF);
+ }
+
+ /* should fail */
+ ref = stat_file_add_node(stat_file, INVALID_STAT_REF, "invalid", TRUE);
+ g_assert_cmpuint(ref,==,INVALID_STAT_REF);
+
+ /* we should find already present nodes */
+ for (i = 0; i < 10; ++i) {
+ /* the formula used here is to take nodes here and there.
+ * As 17 and 10 are coprime numbers you'll get the same numbers
+ * after 10 iterations */
+ sprintf(name, "node %d", (i * 17 + 5) % 10);
+ ref = stat_file_add_node(stat_file, INVALID_STAT_REF, name, TRUE);
+ g_assert_cmpuint(ref,!=,INVALID_STAT_REF);
+ }
+
+ /* delete some nodes */
+ for (i = 0; i < 6; ++i) {
+ /* see above why the formula is used */
+ int n = (i * 23 + 3) % 10;
+ stat_file_remove_node(stat_file, refs[n]);
+ refs[n] = INVALID_STAT_REF;
+ }
+
+ /* now there should be some place for some counters */
+ for (i = 0; i < 6; ++i) {
+ sprintf(name, "counter %d", i);
+ counter = stat_file_add_counter(stat_file, INVALID_STAT_REF, name, TRUE);
+ counters[i] = counter;
+ g_assert_nonnull(counter);
+ }
+ counter = stat_file_add_counter(stat_file, INVALID_STAT_REF, "invalid", TRUE);
+ g_assert_null(counter);
+
+ stat_file_unlink(stat_file);
+ g_assert_null(stat_file_get_shm_name(stat_file));
+ g_assert_cmpint(access(filename, F_OK),==,-1);
+ g_free(filename);
+
+ stat_file_free(stat_file);
+}
+
+/* make sure first node is node 0 */
+static void stat_file_start(void)
+{
+ RedStatFile *stat_file;
+ StatNodeRef ref;
+
+ /* create */
+ stat_file = stat_file_new(10);
+ g_assert_nonnull(stat_file);
+
+ ref = stat_file_add_node(stat_file, INVALID_STAT_REF, "ZERO", TRUE);
+ g_assert_cmpuint(ref,==,0);
+
+ stat_file_unlink(stat_file);
+ stat_file_free(stat_file);
+}
+
+
+int main(int argc, char *argv[])
+{
+ g_test_init(&argc, &argv, NULL);
+
+ g_test_add_func("/server/stat-file", stat_file);
+ g_test_add_func("/server/stat-file-start", stat_file_start);
+
+ return g_test_run();
+}
diff --git a/client/utils.cpp b/server/tests/test-stat.c
index 6b195b3d..31c0170e 100644
--- a/client/utils.cpp
+++ b/server/tests/test-stat.c
@@ -1,5 +1,6 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
/*
- Copyright (C) 2009 Red Hat, Inc.
+ Copyright (C) 2015 Red Hat, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@@ -14,31 +15,34 @@
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
-#ifdef HAVE_CONFIG_H
+
+/* check statistics
+ */
+
#include <config.h>
-#endif
+#include <glib.h>
-#include "common.h"
-#include <stdlib.h>
-#include <stdarg.h>
+typedef void test_func_t(void);
-#include "utils.h"
+test_func_t stat_test1;
+test_func_t stat_test2;
+test_func_t stat_test3;
+test_func_t stat_test4;
-void string_printf(std::string& str, const char* format, ...)
-{
- va_list ap;
- va_start(ap, format);
- string_vprintf(str, format, ap);
- va_end(ap);
-}
+static test_func_t *test_funcs[] = {
+ stat_test1,
+ stat_test2,
+ stat_test3,
+ stat_test4,
+ NULL
+};
-int str_to_port(const char *str)
+int main(void)
{
- long port;
- char *endptr;
- port = strtol(str, &endptr, 0);
- if (endptr != str + strlen(str) || port < 0 || port > 0xffff) {
- return -1;
+ test_func_t **func_p;
+
+ for (func_p = test_funcs; *func_p; ++func_p) {
+ (*func_p)();
}
- return port;
+ return 0;
}
diff --git a/server/tests/test-stream-device.cpp b/server/tests/test-stream-device.cpp
new file mode 100644
index 00000000..faed0d1c
--- /dev/null
+++ b/server/tests/test-stream-device.cpp
@@ -0,0 +1,481 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009-2017 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+/**
+ * Test streaming device
+ */
+
+#include <config.h>
+
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
+
+#include <unistd.h>
+
+#include <spice/protocol.h>
+#include <spice/stream-device.h>
+
+#include "test-display-base.h"
+#include "test-glib-compat.h"
+#include "stream-channel.h"
+#include "reds.h"
+#include "win-alarm.h"
+#include "vmc-emu.h"
+
+static VmcEmu *vmc;
+
+static uint8_t *add_stream_hdr(uint8_t *p, StreamMsgType type, uint32_t size)
+{
+ StreamDevHeader hdr = {
+ .protocol_version = STREAM_DEVICE_PROTOCOL,
+ .padding = 0,
+ .type = GUINT16_TO_LE(type),
+ .size = GUINT32_TO_LE(size),
+ };
+
+ memcpy(p, &hdr, sizeof(hdr));
+ return p + sizeof(hdr);
+}
+
+static uint8_t *add_format(uint8_t *p, uint32_t w, uint32_t h, SpiceVideoCodecType codec)
+{
+ StreamMsgFormat fmt = {
+ .width = GUINT32_TO_LE(w),
+ .height = GUINT32_TO_LE(h),
+ .codec = codec,
+ };
+
+ p = add_stream_hdr(p, STREAM_TYPE_FORMAT, sizeof(fmt));
+ memcpy(p, &fmt, sizeof(fmt));
+ return p + sizeof(fmt);
+}
+
+/* currently we don't care about possible capabilities sent so discard them
+ * from server reply */
+static void
+discard_server_capabilities()
+{
+ StreamDevHeader hdr;
+
+ if (vmc->write_pos == 0) {
+ return;
+ }
+ g_assert(vmc->write_pos >= sizeof(hdr));
+
+ memcpy(&hdr, vmc->write_buf, sizeof(hdr));
+ hdr.type = GUINT16_FROM_LE(hdr.type);
+ hdr.size = GUINT32_FROM_LE(hdr.size);
+ if (hdr.type == STREAM_TYPE_CAPABILITIES) {
+ g_assert_cmpint(hdr.size, <=, vmc->write_pos - sizeof(hdr));
+ vmc->write_pos -= hdr.size + sizeof(hdr);
+ memmove(vmc->write_buf, vmc->write_buf + hdr.size + sizeof(hdr), vmc->write_pos);
+ }
+}
+
+// check we have an error message on the write buffer
+static void
+check_vmc_error_message()
+{
+ StreamDevHeader hdr;
+
+ discard_server_capabilities();
+
+ g_assert_cmpint(vmc->write_pos, >= ,sizeof(hdr));
+
+ memcpy(&hdr, vmc->write_buf, sizeof(hdr));
+ g_assert_cmpint(hdr.protocol_version, ==, STREAM_DEVICE_PROTOCOL);
+ g_assert_cmpint(GUINT16_FROM_LE(hdr.type), ==, STREAM_TYPE_NOTIFY_ERROR);
+ g_assert_cmpint(GUINT32_FROM_LE(hdr.size), <=, vmc->write_pos - sizeof(hdr));
+}
+
+static int num_send_data_calls = 0;
+static size_t send_data_bytes = 0;
+
+StreamChannel::StreamChannel(RedsState *reds, uint32_t id):
+ RedChannel(reds, SPICE_CHANNEL_DISPLAY, id, RedChannel::HandleAcks)
+{
+ reds_register_channel(reds, this);
+}
+
+void
+StreamChannel::change_format(const StreamMsgFormat *fmt)
+{
+}
+
+void
+StreamChannel::send_data(const void *data, size_t size, uint32_t mm_time)
+{
+ ++num_send_data_calls;
+ send_data_bytes += size;
+}
+
+void
+StreamChannel::register_start_cb(stream_channel_start_proc cb, void *opaque)
+{
+}
+
+void
+StreamChannel::register_queue_stat_cb(stream_channel_queue_stat_proc cb, void *opaque)
+{
+}
+
+red::shared_ptr<StreamChannel> stream_channel_new(RedsState *server, uint32_t id)
+{
+ return red::make_shared<StreamChannel>(server, id);
+}
+
+void
+StreamChannel::reset()
+{
+}
+
+void StreamChannel::on_connect(RedClient *red_client, RedStream *stream,
+ int migration, RedChannelCapabilities *caps)
+{
+}
+
+static SpiceCoreInterface *core;
+static Test *test;
+using TestFixture = int;
+
+static void test_stream_device_setup(TestFixture *fixture, gconstpointer user_data)
+{
+ g_assert_null(core);
+ g_assert_null(test);
+ g_assert_null(vmc);
+ core = basic_event_loop_init();
+ g_assert_nonnull(core);
+ test = test_new(core);
+ g_assert_nonnull(test);
+ vmc = vmc_emu_new("port", "org.spice-space.stream.0");
+ g_assert_nonnull(vmc);
+
+ num_send_data_calls = 0;
+ send_data_bytes = 0;
+}
+
+static void test_stream_device_teardown(TestFixture *fixture, gconstpointer user_data)
+{
+ g_assert_nonnull(core);
+ g_assert_nonnull(test);
+
+ vmc_emu_destroy(vmc);
+ vmc = nullptr;
+ test_destroy(test);
+ test = nullptr;
+ basic_event_loop_destroy();
+ core = nullptr;
+}
+
+static void test_kick()
+{
+ spice_server_add_interface(test->server, &vmc->instance.base);
+
+ // we need to open the device and kick the start
+ // the alarm is to prevent the program from getting stuck
+ alarm(5);
+ spice_server_port_event(&vmc->instance, SPICE_PORT_EVENT_OPENED);
+ spice_server_char_device_wakeup(&vmc->instance);
+ alarm(0);
+}
+
+static void test_stream_device(TestFixture *fixture, gconstpointer user_data)
+{
+ for (int test_num=0; test_num < 2; ++test_num) {
+ vmc_emu_reset(vmc);
+ uint8_t *p = vmc->message;
+
+ // add some messages into device buffer
+ // here we are testing the device is reading at least two
+ // consecutive format messages
+ // first message part has 2 extra bytes to check for header split
+ p = add_format(p, 640, 480, SPICE_VIDEO_CODEC_TYPE_MJPEG);
+ vmc_emu_add_read_till(vmc, p + 2);
+
+ p = add_format(p, 640, 480, SPICE_VIDEO_CODEC_TYPE_VP9);
+
+ // this split the second format in half
+ vmc_emu_add_read_till(vmc, p - 4);
+
+ vmc_emu_add_read_till(vmc, p);
+
+ // add a message to stop data to be read
+ p = add_stream_hdr(p, STREAM_TYPE_INVALID, 0);
+ vmc_emu_add_read_till(vmc, p);
+
+ // this message should not be read
+ p = add_stream_hdr(p, STREAM_TYPE_INVALID, 0);
+ vmc_emu_add_read_till(vmc, p);
+
+ spice_server_add_interface(test->server, &vmc->instance.base);
+
+ // device should not have read data before we open it
+ spice_server_char_device_wakeup(&vmc->instance);
+ g_assert_cmpint(vmc->pos, ==, 0);
+
+ g_test_expect_message(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, "Stream device received invalid message: Invalid message type");
+
+ // we need to open the device and kick the start
+ spice_server_port_event(&vmc->instance, SPICE_PORT_EVENT_OPENED);
+ spice_server_char_device_wakeup(&vmc->instance);
+ spice_server_port_event(&vmc->instance, SPICE_PORT_EVENT_CLOSED);
+
+ // make sure first 3 parts are read completely
+ g_assert(vmc->message_sizes_curr - vmc->message_sizes >= 3);
+ // make sure the device readed all or that device was
+ // disabled, we need this to make sure that device will be in
+ // sync when opened again
+ g_assert(vmc->message_sizes_curr - vmc->message_sizes == 5 || !vmc->device_enabled);
+
+ check_vmc_error_message();
+ spice_server_remove_interface(&vmc->instance.base);
+ }
+}
+
+// check if sending a partial message causes issues
+static void test_stream_device_unfinished(TestFixture *fixture, gconstpointer user_data)
+{
+ uint8_t *p = vmc->message;
+
+ // this long and not finished message should not cause an infinite loop
+ p = add_stream_hdr(p, STREAM_TYPE_DATA, 100000);
+ vmc_emu_add_read_till(vmc, p);
+
+ test_kick();
+
+ // we should have read all data
+ g_assert(vmc->message_sizes_curr - vmc->message_sizes == 1);
+
+ // we should have no data from the device
+ discard_server_capabilities();
+ g_assert_cmpint(vmc->write_pos, ==, 0);
+}
+
+// check if sending multiple messages cause stall
+static void test_stream_device_multiple(TestFixture *fixture, gconstpointer user_data)
+{
+ uint8_t *p = vmc->message;
+
+ // add some messages into device buffer
+ p = add_format(p, 640, 480, SPICE_VIDEO_CODEC_TYPE_MJPEG);
+ p = add_format(p, 640, 480, SPICE_VIDEO_CODEC_TYPE_MJPEG);
+ p = add_format(p, 640, 480, SPICE_VIDEO_CODEC_TYPE_MJPEG);
+ vmc_emu_add_read_till(vmc, p);
+
+ test_kick();
+
+ // we should have read all data
+ g_assert(vmc->message_sizes_curr - vmc->message_sizes == 1);
+}
+
+// check if data message consume even following message
+static void test_stream_device_format_after_data(TestFixture *fixture, gconstpointer user_data)
+{
+ uint8_t *p = vmc->message;
+
+ // add some messages into device buffer
+ p = add_format(p, 640, 480, SPICE_VIDEO_CODEC_TYPE_MJPEG);
+ p = add_stream_hdr(p, STREAM_TYPE_DATA, 5);
+ memcpy(p, "hello", 5);
+ p += 5;
+ p = add_stream_hdr(p, STREAM_TYPE_INVALID, 0);
+ vmc_emu_add_read_till(vmc, p);
+
+ g_test_expect_message(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, "Stream device received invalid message: Invalid message type");
+
+ test_kick();
+
+ // we should read all data
+ g_assert(vmc->message_sizes_curr - vmc->message_sizes == 1);
+
+ // we should have an error back
+ check_vmc_error_message();
+}
+
+// check empty message
+static void test_stream_device_empty(TestFixture *fixture, gconstpointer user_data)
+{
+ const auto msg_type = static_cast<StreamMsgType> GPOINTER_TO_INT(user_data);
+ uint8_t *p = vmc->message;
+
+ // add some messages into device buffer
+ p = add_stream_hdr(p, msg_type, 0);
+ vmc_emu_add_read_till(vmc, p);
+ p = add_format(p, 640, 480, SPICE_VIDEO_CODEC_TYPE_MJPEG);
+ vmc_emu_add_read_till(vmc, p);
+ p = add_format(p, 640, 480, SPICE_VIDEO_CODEC_TYPE_MJPEG);
+ vmc_emu_add_read_till(vmc, p);
+
+ test_kick();
+
+ // we should read all data
+ g_assert(vmc->message_sizes_curr - vmc->message_sizes == 3);
+
+ // we should have no data from the device
+ discard_server_capabilities();
+ g_assert_cmpint(vmc->write_pos, ==, 0);
+}
+
+// check that server refuse huge data messages
+static void test_stream_device_huge_data(TestFixture *fixture, gconstpointer user_data)
+{
+ uint8_t *p = vmc->message;
+
+ // add some messages into device buffer
+ p = add_stream_hdr(p, STREAM_TYPE_DATA, 33 * 1024 * 1024);
+ p = add_format(p, 640, 480, SPICE_VIDEO_CODEC_TYPE_MJPEG);
+ vmc_emu_add_read_till(vmc, p);
+
+ g_test_expect_message(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, "Stream device received invalid message: STREAM_DATA too large");
+
+ test_kick();
+
+ // we should read all data
+ g_assert(vmc->message_sizes_curr - vmc->message_sizes == 1);
+
+ // we should have an error back
+ check_vmc_error_message();
+}
+
+// check that server send all message
+static void test_stream_device_data_message(TestFixture *fixture, gconstpointer user_data)
+{
+ uint8_t *p = vmc->message;
+
+ // add some messages into device buffer
+ p = add_format(p, 640, 480, SPICE_VIDEO_CODEC_TYPE_MJPEG);
+ p = add_stream_hdr(p, STREAM_TYPE_DATA, 1017);
+ for (int i = 0; i < 1017; ++i, ++p) {
+ *p = static_cast<uint8_t>(i * 123 + 57);
+ }
+ vmc_emu_add_read_till(vmc, vmc->message + 51);
+ vmc_emu_add_read_till(vmc, vmc->message + 123);
+ vmc_emu_add_read_till(vmc, vmc->message + 534);
+ vmc_emu_add_read_till(vmc, p);
+
+ test_kick();
+
+ // we should read all data
+ g_assert(vmc->message_sizes_curr - vmc->message_sizes == 4);
+
+ // we should have no data from the device
+ discard_server_capabilities();
+ g_assert_cmpint(vmc->write_pos, ==, 0);
+
+ // make sure data were collapsed in a single message
+ g_assert_cmpint(num_send_data_calls, ==, 1);
+ g_assert_cmpint(send_data_bytes, ==, 1017);
+}
+
+static void test_display_info(TestFixture *fixture, gconstpointer user_data)
+{
+ // initialize a QXL interface. This must be done before receiving the display info message from
+ // the stream
+ test_add_display_interface(test);
+ // qxl device supports 2 monitors
+ spice_qxl_set_device_info(&test->qxl_instance, "pci/0/1.2", 0, 2);
+
+ // craft a message from the mock stream device that provides display info to the server for the
+ // given stream
+ static const char address[] = "pci/a/b.cde";
+ StreamMsgDeviceDisplayInfo info = {
+ .stream_id = GUINT32_TO_LE(0x01020304),
+ .device_display_id = GUINT32_TO_LE(0x0a0b0c0d),
+ .device_address_len = GUINT32_TO_LE(sizeof(address)),
+ };
+ uint8_t *p = vmc->message;
+ p = add_stream_hdr(p, STREAM_TYPE_DEVICE_DISPLAY_INFO, sizeof(info) + sizeof(address));
+ memcpy(p, &info, sizeof(info));
+ p += sizeof(info);
+ strcpy(reinterpret_cast<char *>(p), address);
+ p += sizeof(address);
+
+ vmc_emu_add_read_till(vmc, p);
+
+ // parse the simulated display info message from the stream device so the server now has display
+ // info for the mock stream device
+ test_kick();
+
+ // build the buffer to send to the agent for display information
+ SpiceMarshaller *m = spice_marshaller_new();
+ reds_marshall_device_display_info(test->server, m);
+ int to_free;
+ size_t buf_len;
+ uint8_t *buf = spice_marshaller_linearize(m, 0, &buf_len, &to_free);
+
+ // check output buffer. The message that we send to the vdagent should combine display info for
+ // the stream device that we crafted above and the qxl device.
+ static const uint8_t expected_buffer[] = {
+ /* device count */ 3, 0, 0, 0,
+
+ /* channel_id */ 0, 0, 0, 0,
+ /* monitor_id */ 0, 0, 0, 0,
+ /* device_display_id */ 0, 0, 0, 0,
+ /* device_address_len */ 10, 0, 0, 0,
+ /* device_address */ 'p','c','i','/','0','/','1','.','2', 0,
+
+ /* channel_id */ 0, 0, 0, 0,
+ /* monitor_id */ 1, 0, 0, 0,
+ /* device_display_id */ 1, 0, 0, 0,
+ /* device_address_len */ 10, 0, 0, 0,
+ /* device_address */ 'p','c', 'i','/','0','/','1','.','2', 0,
+
+ /* channel_id */ 1, 0, 0, 0,
+ /* monitor_id */ 4, 3, 2, 1,
+ /* device_display_id */ 13, 12, 11, 10,
+ /* device_address_len */ 12, 0, 0, 0,
+ /* device_address */ 'p','c','i','/','a','/','b','.','c','d','e', 0
+ };
+ g_assert_cmpint(buf_len, ==, sizeof(expected_buffer));
+ g_assert_true(memcmp(buf, expected_buffer, buf_len) == 0);
+
+ if (to_free) {
+ free(buf);
+ }
+ spice_marshaller_destroy(m);
+}
+
+static void test_add(const char *name, void (*func)(TestFixture *, gconstpointer), gconstpointer arg)
+{
+ g_test_add(name, TestFixture, arg, test_stream_device_setup, func, test_stream_device_teardown);
+}
+
+int main(int argc, char *argv[])
+{
+ g_test_init(&argc, &argv, NULL);
+
+ test_add("/server/stream-device",
+ test_stream_device, nullptr);
+ test_add("/server/stream-device-unfinished",
+ test_stream_device_unfinished, nullptr);
+ test_add("/server/stream-device-multiple",
+ test_stream_device_multiple, nullptr);
+ test_add("/server/stream-device-format-after-data",
+ test_stream_device_format_after_data, nullptr);
+ test_add("/server/stream-device-empty-capabilities",
+ test_stream_device_empty, GINT_TO_POINTER(STREAM_TYPE_CAPABILITIES));
+ test_add("/server/stream-device-empty-data",
+ test_stream_device_empty, GINT_TO_POINTER(STREAM_TYPE_DATA));
+ test_add("/server/stream-device-huge-data",
+ test_stream_device_huge_data, nullptr);
+ test_add("/server/stream-device-data-message",
+ test_stream_device_data_message, nullptr);
+ test_add("/server/display-info", test_display_info, nullptr);
+
+ return g_test_run();
+}
diff --git a/server/tests/test-stream.c b/server/tests/test-stream.c
new file mode 100644
index 00000000..055b1a32
--- /dev/null
+++ b/server/tests/test-stream.c
@@ -0,0 +1,156 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2016 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <errno.h>
+#include <unistd.h>
+
+#include <common/log.h>
+#include "red-stream.h"
+#include "basic-event-loop.h"
+
+static SpiceServer *server = NULL;
+
+static int server_init(void)
+{
+ SpiceCoreInterface *core = basic_event_loop_init();
+ server = spice_server_new();
+
+ return spice_server_init(server, core);
+}
+
+
+/*
+ * Based on code from Keith Packard:
+ * http://keithp.com/blogs/fd-passing/
+ */
+static ssize_t
+sock_fd_read(int sock, void *buf, ssize_t bufsize, int *fd)
+{
+ ssize_t size;
+
+ if (fd) {
+ struct msghdr msg;
+ struct iovec iov;
+ union {
+ struct cmsghdr cmsghdr;
+ char control[CMSG_SPACE(sizeof (int))];
+ } cmsgu;
+ struct cmsghdr *cmsg;
+
+ iov.iov_base = buf;
+ iov.iov_len = bufsize;
+
+ msg.msg_name = NULL;
+ msg.msg_namelen = 0;
+ msg.msg_iov = &iov;
+ msg.msg_iovlen = 1;
+ msg.msg_control = cmsgu.control;
+ msg.msg_controllen = sizeof(cmsgu.control);
+ msg.msg_flags = 0;
+ size = recvmsg(sock, &msg, 0);
+ if (size < 0) {
+ perror ("recvmsg");
+ exit(1);
+ }
+ cmsg = CMSG_FIRSTHDR(&msg);
+ if (cmsg && cmsg->cmsg_len == CMSG_LEN(sizeof(int))) {
+ if (cmsg->cmsg_level != SOL_SOCKET) {
+ fprintf(stderr, "invalid cmsg_level %d\n",
+ cmsg->cmsg_level);
+ exit(1);
+ }
+ if (cmsg->cmsg_type != SCM_RIGHTS) {
+ fprintf(stderr, "invalid cmsg_type %d\n",
+ cmsg->cmsg_type);
+ exit(1);
+ }
+
+ memcpy(fd, CMSG_DATA(cmsg), sizeof(*fd));
+ } else
+ *fd = -1;
+ } else {
+ size = read(sock, buf, bufsize);
+ if (size < 0) {
+ perror("read");
+ exit(1);
+ }
+ }
+
+ return size;
+}
+
+int main(int argc, char *argv[])
+{
+ RedStream *st[2];
+ int sv[2];
+ int ret, fd = -1;
+ char c;
+
+ spice_return_val_if_fail(server_init() == 0, -1);
+
+ if (socketpair(AF_LOCAL, SOCK_STREAM, 0, sv) == -1) {
+ spice_error("socketpair failed %s", strerror(errno));
+ return -1;
+ }
+
+ st[0] = red_stream_new(server, sv[0]);
+ spice_assert(red_stream_is_plain_unix(st[0]));
+ st[1] = red_stream_new(server, sv[1]);
+ spice_assert(red_stream_is_plain_unix(st[1]));
+
+ /* send stdin, for the fun of it */
+ ret = red_stream_send_msgfd(st[0], 0);
+ spice_assert(ret == 1);
+ ret = sock_fd_read(sv[1], &c, 1, &fd);
+ spice_assert(c == '@');
+ spice_assert(ret == 1);
+ spice_assert(fd != -1);
+ close(fd);
+
+ /* send invalid fd behaviour */
+ ret = red_stream_send_msgfd(st[0], -1);
+ spice_assert(ret == 1);
+ ret = sock_fd_read(sv[1], &c, 1, &fd);
+ spice_assert(c == '@');
+ spice_assert(ret == 1);
+ spice_assert(fd == -1);
+
+ /* batch test */
+ ret = red_stream_send_msgfd(st[0], 0);
+ spice_assert(ret == 1);
+ ret = red_stream_send_msgfd(st[0], 0);
+ spice_assert(ret == 1);
+ ret = sock_fd_read(sv[1], &c, 1, &fd);
+ spice_assert(c == '@');
+ spice_assert(ret == 1);
+ spice_assert(fd != -1);
+ close(fd);
+ ret = sock_fd_read(sv[1], &c, 1, &fd);
+ spice_assert(c == '@');
+ spice_assert(ret == 1);
+ spice_assert(fd != -1);
+ close(fd);
+
+ red_stream_free(st[0]);
+ red_stream_free(st[1]);
+
+ return 0;
+}
diff --git a/server/tests/test-two-servers.c b/server/tests/test-two-servers.c
new file mode 100644
index 00000000..2437fe44
--- /dev/null
+++ b/server/tests/test-two-servers.c
@@ -0,0 +1,56 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+/**
+ * Test two servers on one main loop.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include "test-display-base.h"
+
+static SpiceCoreInterface *core;
+
+static const CommandType simple_commands[] = {
+ //SIMPLE_CREATE_SURFACE,
+ //SIMPLE_DRAW,
+ //SIMPLE_DESTROY_SURFACE,
+ //PATH_PROGRESS,
+ SIMPLE_DRAW,
+ //SIMPLE_COPY_BITS,
+ SIMPLE_UPDATE,
+};
+
+int main(void)
+{
+ Test *t1;
+ Test *t2;
+
+ core = basic_event_loop_init();
+ t1 = test_new(core);
+ t2 = test_new(core);
+ //spice_server_set_image_compression(server, SPICE_IMAGE_COMPRESSION_OFF);
+ test_add_display_interface(t1);
+ test_add_display_interface(t2);
+ test_set_simple_command_list(t1, simple_commands, G_N_ELEMENTS(simple_commands));
+ test_set_simple_command_list(t2, simple_commands, G_N_ELEMENTS(simple_commands));
+
+ basic_event_loop_mainloop();
+ test_destroy(t1);
+ test_destroy(t2);
+ return 0;
+}
diff --git a/server/tests/test-vdagent.c b/server/tests/test-vdagent.c
new file mode 100644
index 00000000..1afdf7f3
--- /dev/null
+++ b/server/tests/test-vdagent.c
@@ -0,0 +1,172 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+/**
+ * Test vdagent guest to server messages
+ */
+
+#include <config.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <spice/vd_agent.h>
+
+#include "test-display-base.h"
+#include "test-glib-compat.h"
+
+static int vmc_write(SPICE_GNUC_UNUSED SpiceCharDeviceInstance *sin,
+ SPICE_GNUC_UNUSED const uint8_t *buf,
+ int len)
+{
+ return len;
+}
+
+static int vmc_read(SPICE_GNUC_UNUSED SpiceCharDeviceInstance *sin,
+ uint8_t *buf,
+ int len)
+{
+ static uint8_t c = 0;
+ static uint8_t message[2048];
+ static unsigned pos = 0;
+ static unsigned message_size;
+ int ret;
+
+ if (pos == sizeof(message)) {
+ g_message("sent whole message");
+ pos++; /* Only print message once */
+ }
+ if (pos > sizeof(message)) {
+ return 0;
+ }
+ if (pos == 0) {
+ VDIChunkHeader *hdr = (VDIChunkHeader *)message;
+ VDAgentMessage *msg = (VDAgentMessage *)&hdr[1];
+ uint8_t *p = message;
+ int size = sizeof(message);
+ message_size = size;
+ /* fill in message */
+ hdr->port = VDP_SERVER_PORT;
+ hdr->size = message_size - sizeof(VDIChunkHeader);
+ msg->protocol = VD_AGENT_PROTOCOL;
+ msg->type = VD_AGENT_END_MESSAGE;
+ msg->opaque = 0;
+ msg->size = message_size - sizeof(VDIChunkHeader) - sizeof(VDAgentMessage);
+ size -= sizeof(VDIChunkHeader) + sizeof(VDAgentMessage);
+ p += sizeof(VDIChunkHeader) + sizeof(VDAgentMessage);
+ for (; size; --size, ++p, ++c)
+ *p = c;
+ }
+ ret = MIN(message_size - pos, len);
+ memcpy(buf, &message[pos], ret);
+ pos += ret;
+ //printf("vmc_read %d (ret %d)\n", len, ret);
+ return ret;
+}
+
+static void vmc_state(SPICE_GNUC_UNUSED SpiceCharDeviceInstance *sin,
+ SPICE_GNUC_UNUSED int connected)
+{
+}
+
+static SpiceCharDeviceInterface vmc_interface = {
+ .base = {
+ .type = SPICE_INTERFACE_CHAR_DEVICE,
+ .description = "test spice virtual channel char device",
+ .major_version = SPICE_INTERFACE_CHAR_DEVICE_MAJOR,
+ .minor_version = SPICE_INTERFACE_CHAR_DEVICE_MINOR,
+ },
+ .state = vmc_state,
+ .write = vmc_write,
+ .read = vmc_read,
+};
+
+static SpiceCharDeviceInstance vmc_instance = {
+ .base = { NULL },
+ .subtype = "vdagent",
+};
+
+static void test_multiple_vmc_devices(void)
+{
+ SpiceCharDeviceInstance vmc_instances[2] = {
+ { .base = { NULL }, .subtype = "vdagent", },
+ { .base = { NULL }, .subtype = "vdagent", }
+ };
+ int status;
+
+ SpiceCoreInterface *core = basic_event_loop_init();
+ Test *test = test_new(core);
+
+ g_test_expect_message(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING,
+ "*spice_server_char_device_add_interface: vdagent already attached");
+ g_test_expect_message(G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL,
+ "*spice_server_remove_interface*: assertion 'char_device->st != nullptr'*");
+ vmc_instances[0].base.sif = &vmc_interface.base;
+ spice_server_add_interface(test->server, &vmc_instances[0].base);
+ vmc_instances[1].base.sif = &vmc_interface.base;
+ spice_server_add_interface(test->server, &vmc_instances[1].base);
+ status = spice_server_remove_interface(&vmc_instances[1].base);
+ g_assert_cmpint(status, ==, -1);
+ status = spice_server_remove_interface(&vmc_instances[0].base);
+ g_assert_cmpint(status, ==, 0);
+ g_test_assert_expected_messages();
+ test_destroy(test);
+ basic_event_loop_destroy();
+}
+
+static void test_duplicate_removal(void)
+{
+ SpiceCoreInterface *core = basic_event_loop_init();
+ Test *test = test_new(core);
+ int status;
+
+ g_test_expect_message(G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL,
+ "*spice_server_remove_interface*: assertion 'char_device->st != nullptr'*");
+ vmc_instance.base.sif = &vmc_interface.base;
+ spice_server_add_interface(test->server, &vmc_instance.base);
+ status = spice_server_remove_interface(&vmc_instance.base);
+ g_assert_cmpint(status, ==, 0);
+ status = spice_server_remove_interface(&vmc_instance.base);
+ g_assert_cmpint(status, ==, -1);
+ g_test_assert_expected_messages();
+ test_destroy(test);
+ basic_event_loop_destroy();
+}
+
+static void test_agent_to_server(void)
+{
+ SpiceCoreInterface *core = basic_event_loop_init();
+ Test *test = test_new(core);
+
+ g_test_expect_message(G_LOG_DOMAIN, G_LOG_LEVEL_MESSAGE, "sent whole message");
+ vmc_instance.base.sif = &vmc_interface.base;
+ spice_server_add_interface(test->server, &vmc_instance.base);
+ g_test_assert_expected_messages();
+ test_destroy(test);
+ basic_event_loop_destroy();
+}
+
+int main(int argc, char *argv[])
+{
+ g_test_init(&argc, &argv, NULL);
+
+ g_test_add_func("/server/vdagent/agent-to-server", test_agent_to_server);
+ g_test_add_func("/server/vdagent/duplicate-removal", test_duplicate_removal);
+ g_test_add_func("/server/vdagent/multiple-vmc-devices", test_multiple_vmc_devices);
+
+ return g_test_run();
+}
diff --git a/server/tests/test-video-encoders b/server/tests/test-video-encoders
new file mode 100755
index 00000000..039dd219
--- /dev/null
+++ b/server/tests/test-video-encoders
@@ -0,0 +1,25 @@
+#!/bin/bash
+
+set -e
+
+base_test() {
+ echo "Running test with options: $*"
+ ./test-gst -i 'videotestsrc pattern=14 foreground-color=0x4080ff background-color=0x402000 kx=-2 ky=-4 kxy=14 kt=3 num-buffers=100 ! video/x-raw,width=1024,height=768 ! videoconvert qos=false' "$@"
+}
+
+# check different clippings
+# note that due to some internal alignment we are using odd number for sizes
+for clipping in '' '--clipping (10%,10%)x(409,307)'
+do
+ for encoder in mjpeg 'gstreamer:mjpeg --min-psnr 16' gstreamer:vp8 gstreamer:vp9 gstreamer:h264
+ do
+ for split in '' '--split-lines=40'
+ do
+ # TODO check if encoder is supported
+ for format in 16BIT 24BIT 32BIT RGBA
+ do
+ base_test -f $format -e $encoder $clipping $split
+ done
+ done
+ done
+done
diff --git a/server/tests/test-websocket.c b/server/tests/test-websocket.c
new file mode 100644
index 00000000..701f5408
--- /dev/null
+++ b/server/tests/test-websocket.c
@@ -0,0 +1,296 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2017-2019 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+/* Utility to allow checking our websocket implementaion using Autobahn
+ * Test Suite.
+ * This suite require a WebSocket server implementation echoing
+ * data sent to it
+ */
+#undef NDEBUG
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+#include <unistd.h>
+#include <err.h>
+#include <poll.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netinet/tcp.h>
+#include <sys/ioctl.h>
+#include <sys/uio.h>
+#include <glib.h>
+#include <signal.h>
+
+#include "net-utils.h"
+#include "websocket.h"
+
+/*
+on data arrived on socket:
+ try to read data, read again till error, handle error, on EAGAIN polling again
+ queue readed data for echo
+
+on data writable (if we have data to write):
+ write data
+
+question... pings are handled ??
+
+if data size == 0 when we receive we must send it
+
+*/
+
+static int port = 7777;
+static gboolean non_blocking = false;
+static gboolean debug = false;
+static volatile bool got_term = false;
+static unsigned int num_connections = 0;
+
+static GOptionEntry cmd_entries[] = {
+ {"port", 'p', 0, G_OPTION_ARG_INT, &port,
+ "Local port to bind to", NULL},
+ {"non-blocking", 'n', 0, G_OPTION_ARG_NONE, &non_blocking,
+ "Enable non-blocking i/o", NULL},
+ {"debug", 0, 0, G_OPTION_ARG_NONE, &debug,
+ "Enable debug output", NULL},
+ {NULL}
+};
+
+static void handle_client(int new_sock);
+
+static int
+wait_for(int sock, short events)
+{
+ struct pollfd fds[1] = { { sock, events, 0 } };
+ for (;;) {
+ switch (poll(fds, 1, -1)) {
+ case -1:
+ if (errno == EINTR) {
+ if (got_term) {
+ printf("handled %u connections\n", num_connections);
+ exit(0);
+ }
+ break;
+ }
+ err(1, "poll");
+ break;
+ case 1:
+ if ((fds->revents & events) != 0) {
+ return fds->revents & events;
+ }
+ break;
+ case 0:
+ assert(0);
+ }
+ }
+}
+
+static ssize_t
+ws_read(void *opaque, void *buf, size_t nbyte)
+{
+ int sock = GPOINTER_TO_INT(opaque);
+ return recv(sock, buf, nbyte, MSG_NOSIGNAL);
+}
+
+static ssize_t
+ws_write(void *opaque, const void *buf, size_t nbyte)
+{
+ int sock = GPOINTER_TO_INT(opaque);
+ return send(sock, buf, nbyte, MSG_NOSIGNAL);
+}
+
+static ssize_t
+ws_writev(void *opaque, struct iovec *iov, int iovcnt)
+{
+ int sock = GPOINTER_TO_INT(opaque);
+ return writev(sock, iov, iovcnt);
+}
+
+static void
+go_out(int sig)
+{
+ got_term = true;
+}
+
+int
+main(int argc, char **argv)
+{
+ GError *error = NULL;
+ GOptionContext *context;
+
+ context = g_option_context_new(" - Websocket test");
+ g_option_context_add_main_entries(context, cmd_entries, NULL);
+ if (!g_option_context_parse(context, &argc, &argv, &error)) {
+ errx(1, "%s: %s\n", argv[0], error->message);
+ }
+
+ int sock = socket(AF_INET, SOCK_STREAM, 0);
+ if (sock < 0) {
+ err(1, "socket");
+ }
+
+ int enable = 1;
+ if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR,
+ (const void *) &enable, sizeof(enable)) < 0) {
+ err(1, "setsockopt reuseaddr");
+ }
+
+ if (non_blocking) {
+ red_socket_set_non_blocking(sock, true);
+ }
+
+ struct sockaddr_in sin;
+ memset(&sin, 0, sizeof(sin));
+ sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+ sin.sin_port = htons((short) port);
+ sin.sin_family = AF_INET;
+
+ if (bind(sock, (struct sockaddr *) &sin, sizeof(sin)) < 0) {
+ err(1, "bind");
+ }
+
+ if (listen(sock, 5) < 0) {
+ err(1, "listen");
+ }
+
+ signal(SIGTERM, go_out);
+ signal(SIGINT, go_out);
+
+ while (!got_term) {
+ wait_for(sock, POLLIN);
+
+ socklen_t sock_len = sizeof(sin);
+ int new_sock = accept(sock, (struct sockaddr *) &sin, &sock_len);
+ if (got_term) {
+ break;
+ }
+ if (new_sock < 0) {
+ err(1, "accept");
+ }
+
+ ++num_connections;
+ handle_client(new_sock);
+
+ socket_close(new_sock);
+ }
+
+ socket_close(sock);
+ printf("handled %u connections\n", num_connections);
+ return 0;
+}
+
+static void
+handle_client(int new_sock)
+{
+ if (non_blocking) {
+ red_socket_set_non_blocking(new_sock, true);
+ }
+
+ int enable = 1;
+ if (setsockopt(new_sock, IPPROTO_TCP, TCP_NODELAY,
+ (const void *) &enable, sizeof(enable)) < 0) {
+ err(1, "setsockopt nodelay");
+ }
+
+ // wait header
+ wait_for(new_sock, POLLIN);
+
+ RedsWebSocket *ws = websocket_new("", 0, GINT_TO_POINTER(new_sock),
+ ws_read, ws_write, ws_writev);
+ assert(ws);
+
+ char buffer[4096];
+ bool got_message = false;
+ size_t to_send = 0;
+ unsigned ws_flags = WEBSOCKET_BINARY_FINAL;
+ while (!got_term) {
+ int events = 0;
+ if (sizeof(buffer) > to_send &&
+ (!got_message || (ws_flags & WEBSOCKET_FINAL) == 0)) {
+ events |= POLLIN;
+ }
+ assert(!to_send || got_message);
+ if (got_message) {
+ events |= POLLOUT;
+ }
+ events = wait_for(new_sock, events);
+ if (events & POLLIN) {
+ assert(sizeof(buffer) > to_send);
+ unsigned flags;
+ int size = websocket_read(ws, (void *) (buffer + to_send), sizeof(buffer) - to_send,
+ &flags);
+ if (flags) {
+ ws_flags = flags;
+ }
+
+ if (size < 0) {
+ if (errno == EIO) {
+ break;
+ }
+ if (errno == EAGAIN) {
+ continue;
+ }
+ err(1, "recv");
+ }
+
+ if (size == 0 && flags == 0) {
+ break;
+ }
+
+ if (debug) {
+ printf("received %d bytes of data flags %x\n", size, flags);
+ }
+ to_send += size;
+ got_message = true;
+ }
+
+ if (events & POLLOUT) {
+ int size = websocket_write(ws, buffer, to_send, ws_flags);
+
+ if (size < 0) {
+ switch (errno) {
+ case EAGAIN:
+ case EINTR:
+ continue;
+ case ECONNRESET:
+ break;
+ default:
+ err(1, "send");
+ }
+ break;
+ }
+
+ if (debug) {
+ printf("sent %d bytes of data\n", size);
+ }
+
+ to_send -= size;
+ memmove(buffer, buffer + size, to_send);
+ if (!to_send) {
+ got_message = false;
+ }
+ }
+ }
+
+ websocket_free(ws);
+
+ if (debug) {
+ printf("connection closed\n");
+ }
+}
diff --git a/server/tests/test_display_no_ssl.c b/server/tests/test_display_no_ssl.c
deleted file mode 100644
index 89b47960..00000000
--- a/server/tests/test_display_no_ssl.c
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
- * Test ground for developing specific tests.
- *
- * Any specific test can start of from here and set the server to the
- * specific required state, and create specific operations or reuse
- * existing ones in the test_display_base supplied queue.
- */
-
-#include <config.h>
-#include <stdlib.h>
-#include "test_display_base.h"
-
-SpiceCoreInterface *core;
-SpiceTimer *ping_timer;
-
-void show_channels(SpiceServer *server);
-
-int ping_ms = 100;
-
-void pinger(SPICE_GNUC_UNUSED void *opaque)
-{
- // show_channels is not thread safe - fails if disconnections / connections occur
- //show_channels(server);
-
- core->timer_start(ping_timer, ping_ms);
-}
-
-int simple_commands[] = {
- //SIMPLE_CREATE_SURFACE,
- //SIMPLE_DRAW,
- //SIMPLE_DESTROY_SURFACE,
- //PATH_PROGRESS,
- SIMPLE_DRAW,
- //SIMPLE_COPY_BITS,
- SIMPLE_UPDATE,
-};
-
-int main(void)
-{
- Test *test;
-
- core = basic_event_loop_init();
- test = test_new(core);
- //spice_server_set_image_compression(server, SPICE_IMAGE_COMPRESS_OFF);
- test_add_display_interface(test);
- test_add_agent_interface(test->server);
- test_set_simple_command_list(test, simple_commands, COUNT(simple_commands));
-
- ping_timer = core->timer_add(pinger, NULL);
- core->timer_start(ping_timer, ping_ms);
-
- basic_event_loop_mainloop();
-
- return 0;
-}
diff --git a/server/tests/test_display_resolution_changes.c b/server/tests/test_display_resolution_changes.c
deleted file mode 100644
index e351e992..00000000
--- a/server/tests/test_display_resolution_changes.c
+++ /dev/null
@@ -1,69 +0,0 @@
-/**
- * Recreate the primary surface endlessly.
- */
-
-#include <config.h>
-#include <math.h>
-#include <stdlib.h>
-#include "test_display_base.h"
-
-SpiceTimer *ping_timer;
-
-void show_channels(SpiceServer *server);
-
-int ping_ms = 100;
-
-void pinger(void *opaque)
-{
- Test *test = opaque;
- // show_channels is not thread safe - fails if disconnections / connections occur
- //show_channels(server);
-
- test->core->timer_start(ping_timer, ping_ms);
-}
-
-void set_primary_params(SPICE_GNUC_UNUSED Test *test,
- Command *command)
-{
-#if 0
- static int toggle = 0;
-
- if (toggle) {
- *arg1 = 800;
- *arg2 = 600;
- } else {
- *arg1 = 1024;
- *arg2 = 768;
- }
- toggle = 1 - toggle;
-#endif
- static int count = 0;
-
- command->create_primary.width = 800 + sin((float)count / 6) * 200;
- command->create_primary.height = 600 + cos((float)count / 6) * 200;
- count++;
-}
-
-static Command commands[] = {
- {DESTROY_PRIMARY, NULL, .cb_opaque = NULL,},
- {CREATE_PRIMARY, set_primary_params, .cb_opaque = NULL},
-};
-
-int main(void)
-{
- SpiceCoreInterface *core;
- Test *test;
-
- core = basic_event_loop_init();
- test = test_new(core);
- //spice_server_set_image_compression(server, SPICE_IMAGE_COMPRESS_OFF);
- test_add_display_interface(test);
- test_set_command_list(test, commands, COUNT(commands));
-
- ping_timer = core->timer_add(pinger, test);
- core->timer_start(ping_timer, ping_ms);
-
- basic_event_loop_mainloop();
-
- return 0;
-}
diff --git a/server/tests/test_empty_success.c b/server/tests/test_empty_success.c
deleted file mode 100644
index 82436dc8..00000000
--- a/server/tests/test_empty_success.c
+++ /dev/null
@@ -1,76 +0,0 @@
-#include <config.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <spice.h>
-
-struct SpiceTimer {
- int a,b;
-};
-
-SpiceTimer* timer_add(SPICE_GNUC_UNUSED SpiceTimerFunc func,
- SPICE_GNUC_UNUSED void *opaque)
-{
- static struct SpiceTimer t = {0,};
-
- return &t;
-}
-
-void timer_start(SPICE_GNUC_UNUSED SpiceTimer *timer,
- SPICE_GNUC_UNUSED uint32_t ms)
-{
-}
-
-void timer_cancel(SPICE_GNUC_UNUSED SpiceTimer *timer)
-{
-}
-
-void timer_remove(SPICE_GNUC_UNUSED SpiceTimer *timer)
-{
-}
-
-SpiceWatch *watch_add(SPICE_GNUC_UNUSED int fd,
- SPICE_GNUC_UNUSED int event_mask,
- SPICE_GNUC_UNUSED SpiceWatchFunc func,
- SPICE_GNUC_UNUSED void *opaque)
-{
- return NULL;
-}
-
-void watch_update_mask(SPICE_GNUC_UNUSED SpiceWatch *watch,
- SPICE_GNUC_UNUSED int event_mask)
-{
-}
-
-void watch_remove(SPICE_GNUC_UNUSED SpiceWatch *watch)
-{
-}
-
-void channel_event(SPICE_GNUC_UNUSED int event,
- SPICE_GNUC_UNUSED SpiceChannelEventInfo *info)
-{
-}
-
-int main(void)
-{
- SpiceServer *server = spice_server_new();
- SpiceCoreInterface core;
-
- memset(&core, 0, sizeof(core));
- core.base.major_version = SPICE_INTERFACE_CORE_MAJOR;
- core.timer_add = timer_add;
- core.timer_start = timer_start;
- core.timer_cancel = timer_cancel;
- core.timer_remove = timer_remove;
- core.watch_add = watch_add;
- core.watch_update_mask = watch_update_mask;
- core.watch_remove = watch_remove;
- core.channel_event = channel_event;
-
- spice_server_set_port(server, 5911);
- spice_server_init(server, &core);
-
- spice_server_destroy(server);
-
- return 0;
-}
diff --git a/server/tests/test_fail_on_null_core_interface.c b/server/tests/test_fail_on_null_core_interface.c
deleted file mode 100644
index 23261a26..00000000
--- a/server/tests/test_fail_on_null_core_interface.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <config.h>
-#include <spice.h>
-
-int main(void)
-{
- SpiceServer *server = spice_server_new();
- SpiceCoreInterface core;
-
- spice_server_init(server, &core);
- spice_server_set_port(server, 5911);
-
- return 0;
-}
diff --git a/server/tests/test_just_sockets_no_ssl.c b/server/tests/test_just_sockets_no_ssl.c
deleted file mode 100644
index ac5403b1..00000000
--- a/server/tests/test_just_sockets_no_ssl.c
+++ /dev/null
@@ -1,18 +0,0 @@
-#include <config.h>
-#include <sys/select.h>
-#include <spice.h>
-#include "basic_event_loop.h"
-
-int main(void)
-{
- SpiceServer *server = spice_server_new();
- SpiceCoreInterface *core = basic_event_loop_init();
-
- spice_server_set_port(server, 5912);
- spice_server_set_noauth(server);
- spice_server_init(server, core);
-
- basic_event_loop_mainloop();
-
- return 0;
-}
diff --git a/server/tests/test_spice_version.sh b/server/tests/test_spice_version.sh
deleted file mode 100755
index 5e5b173f..00000000
--- a/server/tests/test_spice_version.sh
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/bin/bash
-
-ROOT=$(dirname $0)/../../
-INCLUDE="-I$ROOT -I$ROOT/spice-common/spice-protocol/"
-TEMP=`mktemp -d`
-
-cat > $TEMP/check_version.c <<EOF
-#include <stdio.h>
-#include "server/spice.h"
-
-int main(void)
-{
- printf("%d.%d.%d\n", SPICE_SERVER_VERSION >> 16,
- (SPICE_SERVER_VERSION >> 8) & 0xff,
- SPICE_SERVER_VERSION & 0xff);
- return 0;
-}
-EOF
-
-if ! gcc -o $TEMP/check_version $INCLUDE $TEMP/check_version.c ; then
- echo "failed to compile tester"
- exit -1
-fi
-
-INCLUDE_VERSION=`$TEMP/check_version`
-rm -Rf $TEMP
-
-CONF_MAJOR=`cat $ROOT/configure.ac | grep 'm4_define(\[SPICE_MAJOR\]' | sed -e 's/m4_define(\[SPICE_MAJOR\],\(.*\))/\1/'`
-CONF_MINOR=`cat $ROOT/configure.ac | grep 'm4_define(\[SPICE_MINOR\]' | sed -e 's/m4_define(\[SPICE_MINOR\],\(.*\))/\1/'`
-CONF_MICRO=`cat $ROOT/configure.ac | grep 'm4_define(\[SPICE_MICRO\]' | sed -e 's/m4_define(\[SPICE_MICRO\],\(.*\))/\1/'`
-CONF_VERSION=`printf %d.%d.%d $CONF_MAJOR $CONF_MINOR $CONF_MICRO`
-if [ $CONF_VERSION != $INCLUDE_VERSION ] ; then
- echo "BAD: version in server/spice.h"
- echo $INCLUDE_VERSION
- echo "doesn't match version in configure.ac"
- echo $CONF_VERSION
- echo "please fix before doing a release"
- exit 1
-else
- echo "OK: both versions are $CONF_VERSION"
-fi
-exit 0
diff --git a/server/tests/test_two_servers.c b/server/tests/test_two_servers.c
deleted file mode 100644
index d2a97359..00000000
--- a/server/tests/test_two_servers.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * Test two servers on one main loop.
- */
-
-#include <config.h>
-#include <stdlib.h>
-#include "test_display_base.h"
-
-SpiceCoreInterface *core;
-
-int simple_commands[] = {
- //SIMPLE_CREATE_SURFACE,
- //SIMPLE_DRAW,
- //SIMPLE_DESTROY_SURFACE,
- //PATH_PROGRESS,
- SIMPLE_DRAW,
- //SIMPLE_COPY_BITS,
- SIMPLE_UPDATE,
-};
-
-int main(void)
-{
- Test *t1;
- Test *t2;
-
- core = basic_event_loop_init();
- t1 = test_new(core);
- t2 = test_new(core);
- //spice_server_set_image_compression(server, SPICE_IMAGE_COMPRESS_OFF);
- test_add_display_interface(t1);
- test_add_display_interface(t2);
- test_set_simple_command_list(t1, simple_commands, COUNT(simple_commands));
- test_set_simple_command_list(t2, simple_commands, COUNT(simple_commands));
-
- basic_event_loop_mainloop();
- return 0;
-}
diff --git a/server/tests/test_util.h b/server/tests/test_util.h
deleted file mode 100644
index a2cd8a86..00000000
--- a/server/tests/test_util.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#ifndef __TEST_UTIL_H__
-#define __TEST_UTIL_H__
-
-#ifdef ASSERT
-#undef ASSERT
-#endif
-#define ASSERT(x) if (!(x)) { \
- printf("%s: ASSERT %s failed\n", __FUNCTION__, #x); \
- abort(); \
-}
-
-#endif // __TEST_UTIL_H__
diff --git a/server/tests/test_vdagent.c b/server/tests/test_vdagent.c
deleted file mode 100644
index 22153b6f..00000000
--- a/server/tests/test_vdagent.c
+++ /dev/null
@@ -1,58 +0,0 @@
-/**
- * Test vdagent guest to server messages
- */
-
-#include <config.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stdio.h>
-
-#include <spice/vd_agent.h>
-
-#include "test_display_base.h"
-
-SpiceCoreInterface *core;
-SpiceTimer *ping_timer;
-
-int ping_ms = 100;
-
-#ifndef MIN
-#define MIN(a, b) ((a) > (b) ? (b) : (a))
-#endif
-
-void pinger(SPICE_GNUC_UNUSED void *opaque)
-{
- // show_channels is not thread safe - fails if disconnections / connections occur
- //show_channels(server);
-
- core->timer_start(ping_timer, ping_ms);
-}
-
-static SpiceBaseInterface base = {
- .type = SPICE_INTERFACE_CHAR_DEVICE,
- .description = "test spice virtual channel char device",
- .major_version = SPICE_INTERFACE_CHAR_DEVICE_MAJOR,
- .minor_version = SPICE_INTERFACE_CHAR_DEVICE_MINOR,
-};
-
-SpiceCharDeviceInstance vmc_instance = {
- .subtype = "vdagent",
-};
-
-int main(void)
-{
- Test *test;
-
- core = basic_event_loop_init();
- test = test_new(core);
-
- vmc_instance.base.sif = &base;
- spice_server_add_interface(test->server, &vmc_instance.base);
-
- ping_timer = core->timer_add(pinger, NULL);
- core->timer_start(ping_timer, ping_ms);
-
- basic_event_loop_mainloop();
-
- return 0;
-}
diff --git a/server/tests/valgrind/glib.supp b/server/tests/valgrind/glib.supp
new file mode 100644
index 00000000..28316636
--- /dev/null
+++ b/server/tests/valgrind/glib.supp
@@ -0,0 +1,1100 @@
+# GLib Valgrind suppressions file
+#
+# This provides a list of suppressions for all of GLib (including GIO), for all
+# Valgrind tools (memcheck, drd, helgrind, etc.) for the false positives and
+# deliberate one-time leaks which GLib causes to be reported when running under
+# Valgrind.
+#
+# When running an application which links to GLib under Valgrind, you can pass
+# this suppression file to Valgrind using --suppressions=/path/to/glib-2.0.supp.
+#
+# http://valgrind.org/docs/manual/manual-core.html#manual-core.suppress
+#
+# Note that there is currently no way for Valgrind to load this automatically
+# (https://bugs.kde.org/show_bug.cgi?id=160905), so the best GLib can currently
+# do is to install this file as part of its development package.
+#
+# This file should be updated if GLib introduces a new deliberate one-time leak,
+# or another false race positive in Valgrind: please file bugs at:
+#
+# https://gitlab.gnome.org/GNOME/glib/issues/new
+
+{
+ gnutls-init-calloc
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:calloc
+ ...
+ fun:gtls_gnutls_init
+}
+
+{
+ gnutls-init-realloc
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:realloc
+ ...
+ fun:gtls_gnutls_init
+}
+
+{
+ g-tls-backend-gnutls-init
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:g_once_impl
+ fun:g_tls_backend_gnutls_init
+}
+
+{
+ p11-tokens-init
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:calloc
+ ...
+ fun:create_tokens_inlock
+ fun:initialize_module_inlock_reentrant
+}
+
+# One-time allocation from libc for getpwnam() results
+{
+ g-local-vfs-getpwnam
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:malloc
+ ...
+ fun:getpwnam
+ fun:g_local_vfs_parse_name
+}
+
+{
+ glib-init-malloc
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:malloc
+ ...
+ fun:g_quark_init
+}
+
+{
+ glib-init-calloc
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:calloc
+ ...
+ fun:g_quark_init
+}
+
+{
+ gobject-init-malloc
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:malloc
+ ...
+ fun:gobject_init*
+}
+
+{
+ gobject-init-realloc
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:realloc
+ ...
+ fun:gobject_init*
+}
+
+{
+ gobject-init-calloc
+ Memcheck:Leak
+ match-leak-kinds:possible,reachable
+ fun:calloc
+ ...
+ fun:gobject_init*
+}
+
+{
+ g-type-register-dynamic
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:malloc
+ ...
+ fun:g_type_register_dynamic
+}
+
+{
+ g-type-register-static
+ Memcheck:Leak
+ match-leak-kinds:possible,reachable
+ fun:malloc
+ ...
+ fun:g_type_register_static
+}
+
+{
+ g-type-register-static-realloc
+ Memcheck:Leak
+ match-leak-kinds:possible,reachable
+ fun:realloc
+ ...
+ fun:g_type_register_static
+}
+
+{
+ g-type-register-static-calloc
+ Memcheck:Leak
+ match-leak-kinds:possible,reachable
+ fun:calloc
+ ...
+ fun:g_type_register_static
+}
+
+{
+ g-type-register-fundamental
+ Memcheck:Leak
+ match-leak-kinds:possible,reachable
+ fun:malloc
+ ...
+ fun:g_type_register_fundamental
+}
+
+{
+ g-type-register-fundamental-calloc
+ Memcheck:Leak
+ match-leak-kinds:possible,reachable
+ fun:calloc
+ ...
+ fun:g_type_register_fundamental
+}
+
+{
+ g-type-add-interface-dynamic
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:malloc
+ ...
+ fun:g_type_add_interface_dynamic
+}
+
+{
+ g-type-add-interface-static
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:malloc
+ ...
+ fun:g_type_add_interface_static
+}
+
+{
+ g-type-add-interface-static-realloc
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:realloc
+ ...
+ fun:g_type_add_interface_static
+}
+
+{
+ g-type-add-interface-static-calloc
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:calloc
+ ...
+ fun:g_type_add_interface_static
+}
+
+{
+ g-test-rand-init
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:calloc
+ ...
+ fun:g_rand_new_with_seed_array
+ fun:test_run_seed
+ ...
+ fun:g_test_run
+}
+
+{
+ g-rand-init2
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:calloc
+ ...
+ fun:g_rand_new_with_seed_array
+ ...
+ fun:get_global_random
+}
+
+{
+ g-quark-table-new
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:g_hash_table_new
+ ...
+ fun:quark_new
+}
+
+{
+ g-quark-table-resize
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ ...
+ fun:g_hash_table_resize
+ ...
+ fun:quark_new
+}
+
+{
+ g-type-interface-init
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:malloc
+ ...
+ fun:type_iface_vtable_base_init_Wm
+}
+
+{
+ g-type-class-init-calloc
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:calloc
+ ...
+ fun:type_class_init_Wm
+}
+
+{
+ g-type-class-init
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:g_type_create_instance
+ ...
+ fun:type_class_init_Wm
+}
+
+{
+ g-object-do-class-init-signals
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ ...
+ fun:g_signal_new
+ ...
+ fun:type_class_init_Wm
+}
+
+{
+ g-type-prerequisites
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:realloc
+ ...
+ fun:type_iface_add_prerequisite_W
+}
+
+{
+ g-type-add-interface-check
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:malloc
+ ...
+ fun:g_type_add_interface_check
+ ...
+ fun:type_class_init_Wm
+}
+
+{
+ g-type-add-interface-check-realloc
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:realloc
+ ...
+ fun:g_type_add_interface_check
+ ...
+ fun:type_class_init_Wm
+}
+
+{
+ g-object-class-install-property
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:malloc
+ ...
+ fun:validate_and_install_class_property
+ ...
+ fun:type_class_init_Wm
+}
+
+{
+ g-param-spec-pool-new
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:malloc
+ ...
+ fun:g_param_spec_pool_new
+ ...
+ fun:type_class_init_Wm
+}
+
+# weak_locations_lock in gobject.c
+{
+ g-weak-ref-lock
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:malloc
+ ...
+ fun:g_rw_lock_get_impl
+ ...
+ fun:g_weak_ref_set
+}
+
+{
+ g-object-base-class-init-construct-pproperties
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:malloc
+ ...
+ fun:g_slist_copy
+ fun:g_object_base_class_init
+ fun:type_class_init_Wm
+}
+
+{
+ g-type-class-ref
+ Memcheck:Leak
+ fun:calloc
+ ...
+ fun:type_class_init_Wm
+ ...
+ fun:g_type_class_ref
+}
+
+{
+ g-type-class-ref-inlined
+ Memcheck:Leak
+ fun:calloc
+ ...
+ fun:UnknownInlinedFun
+ ...
+ fun:g_type_class_ref
+}
+
+{
+ g-io-module-default-singleton-malloc
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:malloc
+ ...
+ fun:g_type_create_instance
+ ...
+ fun:_g_io_module_get_default
+}
+
+{
+ g-io-module-default-singleton-calloc
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:calloc
+ ...
+ fun:g_type_create_instance
+ ...
+ fun:_g_io_module_get_default
+}
+
+# This one seems to show up sometimes with g_type_create_instance() at the top
+# of the stack, as well.
+{
+ g-io-module-default-singleton
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:g_type_create_instance
+ ...
+ fun:_g_io_module_get_default
+}
+
+{
+ g-io-module-default-singleton-module
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:calloc
+ ...
+ fun:g_module_open
+ ...
+ fun:_g_io_module_get_default
+}
+
+{
+ g-io-module-default-singleton-name
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:malloc
+ ...
+ fun:g_strdup
+ ...
+ fun:_g_io_module_get_default*
+}
+
+{
+ g-io-module-default-singleton-weak-ref
+ Memcheck:Leak
+ fun:calloc
+ ...
+ fun:_g_io_module_get_default
+}
+
+{
+ g-get-language-names-malloc
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:malloc
+ ...
+ fun:g_get_language_names
+}
+
+{
+ g-get-language-names-calloc
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:calloc
+ ...
+ fun:g_get_language_names
+}
+
+{
+ g-get-language_names-with-category-malloc
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:malloc
+ ...
+ fun:g_get_language_names_with_category
+}
+
+{
+ g-get-language_names-with-category-calloc
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:calloc
+ ...
+ fun:g_get_language_names_with_category
+}
+
+{
+ g-get-language_names-with-category-realloc
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:realloc
+ ...
+ fun:g_get_language_names_with_category
+}
+
+{
+ g-static-mutex
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:malloc
+ ...
+ fun:g_static_mutex_get_mutex_impl
+}
+
+{
+ g-system-thread-init
+ Memcheck:Leak
+ match-leak-kinds:possible,reachable
+ fun:calloc
+ ...
+ fun:g_system_thread_new
+}
+
+{
+ g-system-thread-init-malloc
+ Memcheck:Leak
+ match-leak-kinds:possible,reachable
+ fun:malloc
+ ...
+ fun:g_system_thread_new
+}
+
+{
+ g-task-thread-pool-init
+ Memcheck:Leak
+ match-leak-kinds:possible,reachable,definite
+ fun:malloc
+ ...
+ fun:g_thread_new
+ ...
+ fun:g_task_thread_pool_init
+}
+
+{
+ g-io-module-default-proxy-resolver-gnome
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:calloc
+ ...
+ fun:g_proxy_resolver_gnome_init
+ ...
+ fun:_g_io_module_get_default
+}
+
+# One-time getaddrinfo() configuration loading
+{
+ g-threaded-resolver-getaddrinfo-config
+ Memcheck:Leak
+ match-leak-kinds:reachable,definite
+ fun:malloc
+ ...
+ fun:__resolv_conf_allocate
+ ...
+ fun:getaddrinfo
+ fun:do_lookup_by_name
+}
+
+# memcheck checks that the third argument to ioctl() is a valid pointer, but
+# some ioctls use that argument as an integer
+{
+ ioctl-with-non-pointer-param
+ Memcheck:Param
+ ioctl(generic)
+ fun:ioctl
+ fun:btrfs_reflink_with_progress
+}
+
+{
+ g-private-get
+ drd:ConflictingAccess
+ fun:g_private_get
+}
+{
+ g-private-get-helgrind
+ Helgrind:Race
+ fun:g_private_get
+}
+
+
+{
+ g-private-set
+ drd:ConflictingAccess
+ fun:g_private_set
+}
+{
+ g-private-set-helgrind
+ Helgrind:Race
+ fun:g_private_set
+}
+
+{
+ g-type-construct-free
+ drd:ConflictingAccess
+ fun:g_type_free_instance
+}
+{
+ g-type-construct-free-helgrind
+ Helgrind:Race
+ fun:g_type_free_instance
+}
+
+{
+ g-variant-unref
+ drd:ConflictingAccess
+ fun:g_variant_unref
+}
+{
+ g-variant-unref-helgrind
+ Helgrind:Race
+ fun:g_variant_unref
+}
+
+{
+ g-unix-signals-main
+ drd:ConflictingAccess
+ fun:_g_main_create_unix_signal_watch
+}
+{
+ g-unix-signals-dispatch
+ drd:ConflictingAccess
+ ...
+ fun:dispatch_unix_signals*
+}
+{
+ g-unix-signals-dispatch-helgrind
+ Helgrind:Race
+ ...
+ fun:dispatch_unix_signals*
+}
+{
+ g-unix-signals-other
+ drd:ConflictingAccess
+ fun:g_unix_signal_watch*
+}
+{
+ g-unix-signals-other-helgrind
+ Helgrind:Race
+ fun:g_unix_signal_watch*
+}
+{
+ g-unix-signals-handler
+ drd:ConflictingAccess
+ fun:g_unix_signal_handler*
+}
+{
+ g-unix-signals-handler-helgrind
+ Helgrind:Race
+ fun:g_unix_signal_handler*
+}
+{
+ g-unix-signals-worker
+ drd:ConflictingAccess
+ fun:glib_worker_main
+}
+{
+ g-unix-signals-worker-helgrind
+ Helgrind:Race
+ fun:glib_worker_main
+}
+
+{
+ g-wakeup-acknowledge
+ drd:ConflictingAccess
+ fun:read
+ fun:g_wakeup_acknowledge
+}
+
+{
+ g-type-fundamental
+ drd:ConflictingAccess
+ fun:g_type_fundamental
+}
+{
+ g-type-fundamental-helgrind
+ Helgrind:Race
+ fun:g_type_fundamental
+}
+{
+ g-type-class-peek-static
+ drd:ConflictingAccess
+ fun:g_type_class_peek_static
+}
+{
+ g-type-class-peek-static-helgrind
+ Helgrind:Race
+ fun:g_type_class_peek_static
+}
+{
+ g-type-is-a
+ drd:ConflictingAccess
+ ...
+ fun:g_type_is_a
+}
+{
+ g-type-is-a-helgrind
+ Helgrind:Race
+ ...
+ fun:g_type_is_a
+}
+
+{
+ g-inet-address-get-type
+ drd:ConflictingAccess
+ fun:g_inet_address_get_type
+}
+{
+ g-inet-address-get-type-helgrind
+ Helgrind:Race
+ fun:g_inet_address_get_type
+}
+
+# From: https://github.com/fredericgermain/valgrind/blob/master/glibc-2.X-drd.supp
+{
+ drd-libc-stdio
+ drd:ConflictingAccess
+ obj:*/lib*/libc-*
+}
+{
+ drd-libc-recv
+ drd:ConflictingAccess
+ fun:recv
+}
+{
+ drd-libc-send
+ drd:ConflictingAccess
+ fun:send
+}
+
+# GSources do an opportunistic ref count check
+{
+ g-source-set-ready-time
+ drd:ConflictingAccess
+ fun:g_source_set_ready_time
+}
+{
+ g-source-set-ready-time-helgrind
+ Helgrind:Race
+ fun:g_source_set_ready_time
+}
+
+{
+ g-source-iter-next
+ Helgrind:Race
+ fun:g_source_iter_next
+ fun:g_main_context_*
+ fun:g_main_context_iterate
+}
+
+{
+ g-object-instance-private
+ drd:ConflictingAccess
+ fun:*_get_instance_private
+}
+{
+ g-object-instance-private-helgrind
+ Helgrind:Race
+ fun:*_get_instance_private
+}
+
+# GLib legitimately calls pthread_cond_signal without a mutex held
+{
+ g-task-thread-complete
+ drd:CondErr
+ ...
+ fun:g_cond_signal
+ fun:g_task_thread_complete
+}
+{
+ g-task-thread-complete
+ Helgrind:Misc
+ ...
+ fun:g_cond_signal
+ fun:g_task_thread_complete
+}
+
+# False positive, but I can't explain how (FIXME)
+{
+ g-task-cond
+ Helgrind:Misc
+ ...
+ fun:g_cond_clear
+ fun:g_task_finalize
+}
+
+# Real race, but is_cancelled() is an opportunistic function anyway
+{
+ g-cancellable-is-cancelled
+ Helgrind:Race
+ fun:g_cancellable_is_cancelled
+}
+
+# False positive
+{
+ g-main-context-cond
+ Helgrind:Misc
+ ...
+ fun:g_cond_clear
+ fun:g_main_context_unref
+}
+
+# False positives
+{
+ g-source-unlocked
+ Helgrind:Race
+ fun:g_source_*_unlocked
+}
+{
+ g-source-internal
+ Helgrind:Race
+ fun:g_source_*_internal
+}
+
+# False positive
+{
+ g_object_real_dispose
+ Helgrind:Race
+ fun:g_object_real_dispose
+}
+
+# False positive
+{
+ g_object_new_valist
+ Helgrind:Race
+ ...
+ fun:g_object_new_valist
+}
+
+# g_set_user_dirs() deliberately leaks the previous cached g_get_user_*() values.
+# These will not all be reachable on exit.
+{
+ g_set_user_dirs_str
+ Memcheck:Leak
+ match-leak-kinds:definite,reachable
+ fun:malloc
+ ...
+ fun:set_str_if_different
+ fun:g_set_user_dirs
+}
+
+# g_set_user_dirs() deliberately leaks the previous cached g_get_user_*() values.
+# These will not all be reachable on exit.
+{
+ g_set_user_dirs_strv
+ Memcheck:Leak
+ match-leak-kinds:definite,reachable
+ fun:malloc
+ ...
+ fun:set_strv_if_different
+ fun:g_set_user_dirs
+}
+
+# g_get_system_data_dirs() caches a one-time allocation
+{
+ g_get_system_data_dirs
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:malloc
+ ...
+ fun:g_build_system_data_dirs
+ fun:g_get_system_data_dirs
+}
+
+# g_get_user_data_dir() caches a one-time allocation
+{
+ g_get_user_data_dir
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:realloc
+ ...
+ fun:g_build_user_data_dir
+ fun:g_get_user_data_dir
+}
+
+# gdesktopappinfo.c caches a one-time allocation global table of @desktop_file_dirs.
+{
+ desktop_file_dirs_malloc
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:malloc
+ ...
+ fun:desktop_file_dirs_lock
+}
+
+# gdesktopappinfo.c caches a one-time allocation global table of @desktop_file_dirs.
+{
+ desktop_file_dirs_realloc
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:realloc
+ ...
+ fun:desktop_file_dirs_lock
+}
+
+# gdesktopappinfo.c caches a one-time allocation global table of @desktop_file_dirs.
+{
+ desktop_file_dir_unindexed_setup_search
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:malloc
+ ...
+ fun:desktop_file_dir_unindexed_setup_search
+ fun:desktop_file_dir_unindexed_setup_search
+}
+
+# g_io_extension_point_register() caches a one-time allocation global table of @extension_points.
+{
+ g_io_extension_point_register
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:calloc
+ ...
+ fun:g_io_extension_point_register
+}
+
+# g_strerror() caches a one-time allocation global table of @errors.
+{
+ g_strerror
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:malloc
+ ...
+ fun:g_locale_to_utf8
+ fun:g_strerror
+}
+
+# g_socket_connection_factory_register_type() caches a one-time allocation global table of @connection_types.
+{
+ g_socket_connection_factory_register_type
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:calloc
+ ...
+ fun:g_socket_connection_factory_register_type
+}
+
+# g_dbus_error_quark() never unregisters itself as a GDBusError domain, as it’s always available
+{
+ g_dbus_error_quark
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:calloc
+ ...
+ fun:g_dbus_error_register_error_domain
+ fun:g_dbus_error_quark
+}
+
+# g_win32_registry_get_os_dirs_w*() caches an array of strings that is allocated only once.
+{
+ g_win32_registry_get_os_dirs
+ Memcheck:Leak
+ match-leak-kinds:reachable,definite
+ fun:malloc
+ ...
+ fun:g_win32_registry_get_os_dirs*
+}
+
+# Thread-private data allocated once per thread
+{
+ g_private_set_alloc0
+ Memcheck:Leak
+ match-leak-kinds:definite,reachable
+ fun:malloc
+ ...
+ fun:g_private_set_alloc0
+}
+{
+ g_private_set_alloc0-calloc
+ Memcheck:Leak
+ match-leak-kinds:definite,reachable
+ fun:calloc
+ ...
+ fun:g_private_set_alloc0
+}
+
+# Keys for thread-private data
+{
+ g_private_key
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:malloc
+ fun:g_private_impl_new
+}
+
+# Thread-private GMainContext stack
+{
+ g_main_context_push_thread_default
+ Memcheck:Leak
+ match-leak-kinds:definite,reachable
+ fun:malloc
+ ...
+ fun:g_queue_new
+ fun:g_main_context_push_thread_default
+}
+
+# One-time allocations for #GFileInfo attribute cache
+{
+ g_file_info_attribute_cache
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:malloc
+ ...
+ fun:ensure_attribute_hash
+ ...
+ fun:g_file_*
+}
+{
+ g_file_info_attribute_cache2
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:calloc
+ ...
+ fun:ensure_attribute_hash
+ ...
+ fun:g_file_*
+}
+{
+ g_file_info_attribute_cache3
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:malloc
+ ...
+ fun:lookup_namespace
+ ...
+ fun:g_file_*
+}
+{
+ g_file_info_attribute_cache4
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:calloc
+ ...
+ fun:lookup_namespace
+ ...
+ fun:g_file_*
+}
+
+# Cached charset
+{
+ g_get_charset
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:malloc
+ ...
+ fun:g_get_charset
+}
+
+{
+ g_get_charset_calloc
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:calloc
+ ...
+ fun:g_get_charset
+}
+
+# Global unused thread queue
+{
+ g_thread_pool_unused_thread_queue
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:malloc
+ ...
+ fun:g_async_queue_new_full
+ ...
+ fun:g_thread_pool_new
+}
+
+# One-time program name storage
+{
+ g_set_prgname
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:malloc
+ ...
+ fun:g_set_prgname
+}
+
+# Error domains hash
+{
+ g_error_init
+ Memcheck:Leak
+ match-leak-kinds: reachable
+ fun:malloc
+ ...
+ fun:g_hash_table_new_full
+ fun:g_error_init
+}
+
+# Error domain static registration
+{
+ g_error_domain_register_static
+ Memcheck:Leak
+ match-leak-kinds: reachable
+ fun:malloc
+ ...
+ fun:g_hash_table_insert
+ fun:error_domain_register
+ fun:g_error_domain_register_static
+}
+
+{
+ new_quark
+ Memcheck:Leak
+ match-leak-kinds:reachable
+ fun:malloc
+ ...
+ fun:g_hash_table_insert
+ fun:quark_new
+}
diff --git a/server/tests/valgrind/spice.supp b/server/tests/valgrind/spice.supp
new file mode 100644
index 00000000..a44f0b9c
--- /dev/null
+++ b/server/tests/valgrind/spice.supp
@@ -0,0 +1,160 @@
+{
+ px_proxy_factory_get_proxies
+ Memcheck:Leak
+ fun:malloc
+ fun:tls_get_addr_tail
+ ...
+ fun:px_proxy_factory_get_proxies
+}
+
+{
+ px_proxy_factory_get_proxies2
+ Memcheck:Leak
+ fun:malloc
+ ...
+ fun:__tls_get_addr
+ ...
+ fun:px_proxy_factory_get_proxies
+}
+
+{
+ gnutls_tls_rnd_leak
+ Memcheck:Leak
+ fun:malloc
+ ...
+ fun:__tls_get_addr
+ ...
+ fun:gnutls_rnd
+}
+
+{
+ gnutls_tls_p11_kit_leak
+ Memcheck:Leak
+ fun:malloc
+ ...
+ fun:__tls_get_addr
+ ...
+ fun:p11_kit_modules_load
+}
+
+{
+ gnutls_x509_ext_import_subject_alt_names
+ Memcheck:Cond
+ ...
+ fun:gnutls_x509_ext_import_subject_alt_names
+ ...
+ fun:gnutls_x509_crt_import
+ fun:gnutls_x509_trust_list_iter_get_ca
+}
+
+{
+ glib_g_socket_client_class_init
+ Memcheck:Leak
+ fun:calloc
+ ...
+ fun:type_class_init_Wm
+ ...
+ fun:g_socket_client_class_init
+}
+
+# One-time getaddrinfo() configuration loading
+{
+ g-threaded-resolver-getaddrinfo-config2
+ Memcheck:Leak
+ match-leak-kinds:reachable,definite
+ fun:malloc
+ ...
+ fun:__resolv_conf_allocate
+ ...
+ fun:getaddrinfo
+ fun:do_lookup_by_name
+}
+
+# g_type_create_instance Valgrind malloc annotation, for
+# some reason this has issues with Fedora 31 from test-listen test
+{
+ g_type_create_instance-valgrind
+ Memcheck:Leak
+ fun:g_type_create_instance
+ ...
+ fun:g_socket_client_connect
+ fun:fake_client_connect_tls
+}
+
+# suppressing several new "possible" loss coming with Fedora 33 on calloc
+{
+ # this one is making most tests to fail (20 out of 21)
+ calloc-possibly-lost-from-dl_init
+ Memcheck:Leak
+ match-leak-kinds:possible
+ fun:calloc
+ fun:g_malloc0
+ ...
+ fun:_dl_init
+}
+
+{
+ calloc-possibly-lost-from-fake_client_connect-fake_client_new
+ Memcheck:Leak
+ match-leak-kinds:possible
+ fun:calloc
+ fun:g_malloc0
+ ...
+ fun:g_object_new
+ fun:fake_client_*
+}
+
+{
+ calloc-possibly-lost-from-g_output_stream
+ Memcheck:Leak
+ match-leak-kinds:possible
+ fun:calloc
+ ...
+ fun:g_thread_pool_push
+ fun:g_task_run_in_thread
+ ...
+ fun:g_output_stream_write_all
+}
+
+{
+ calloc-possibly-lost-from-g_thread_new
+ Memcheck:Leak
+ match-leak-kinds:possible
+ fun:calloc
+ ...
+ fun:g_thread_new
+}
+
+{
+ g_thread_pool_leak
+ Memcheck:Leak
+ match-leak-kinds:possible
+ fun:calloc
+ ...
+ fun:g_thread_new_internal
+ ...
+ fun:g_thread_pool_push
+}
+
+{
+ g_tls_client_connection_new
+ Memcheck:Leak
+ match-leak-kinds:possible,definite
+ fun:malloc
+ ...
+ fun:_dl_close
+ ...
+ fun:g_tls_client_connection_new
+}
+
+{
+ fedora_38_pthread_leak
+ Memcheck:Leak
+ match-leak-kinds: possible
+ fun:calloc
+ ...
+ fun:allocate_dtv
+ fun:_dl_allocate_tls
+ ...
+ fun:pthread_create@@GLIBC_2.34
+}
diff --git a/server/tests/vmc-emu.cpp b/server/tests/vmc-emu.cpp
new file mode 100644
index 00000000..3e43f179
--- /dev/null
+++ b/server/tests/vmc-emu.cpp
@@ -0,0 +1,124 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2019 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <config.h>
+#include <glib.h>
+
+#include "vmc-emu.h"
+
+// handle writes to the device
+static int vmc_write(SpiceCharDeviceInstance *sin,
+ const uint8_t *buf, int len)
+{
+ VmcEmu *const vmc = SPICE_CONTAINEROF(sin, VmcEmu, instance);
+
+ // just copy into the buffer
+ unsigned copy = MIN(sizeof(vmc->write_buf) - vmc->write_pos, len);
+ memcpy(vmc->write_buf+vmc->write_pos, buf, copy);
+ vmc->write_pos += copy;
+ if (copy && vmc->data_written_cb) {
+ vmc->data_written_cb(vmc);
+ }
+ return len;
+}
+
+static int vmc_read(SpiceCharDeviceInstance *sin,
+ uint8_t *buf, int len)
+{
+ VmcEmu *const vmc = SPICE_CONTAINEROF(sin, VmcEmu, instance);
+ int ret;
+
+ if (vmc->pos >= *vmc->message_sizes_curr && vmc->message_sizes_curr < vmc->message_sizes_end) {
+ ++vmc->message_sizes_curr;
+ }
+ if (vmc->message_sizes_curr >= vmc->message_sizes_end || vmc->pos >= *vmc->message_sizes_curr) {
+ return 0;
+ }
+ ret = MIN(*vmc->message_sizes_curr - vmc->pos, len);
+ memcpy(buf, &vmc->message[vmc->pos], ret);
+ vmc->pos += ret;
+ // kick off next message read
+ // currently Qemu kicks the device so we need to do it manually
+ // here. If not all data are read, the device goes into blocking
+ // state and we get the wake only when we read from the device
+ // again
+ if (vmc->pos >= *vmc->message_sizes_curr) {
+ spice_server_char_device_wakeup(&vmc->instance);
+ }
+ return ret;
+}
+
+static void vmc_state(SpiceCharDeviceInstance *sin,
+ int connected)
+{
+ VmcEmu *const vmc = SPICE_CONTAINEROF(sin, VmcEmu, instance);
+ vmc->device_enabled = !!connected;
+}
+
+static const SpiceCharDeviceInterface vmc_interface = {
+ .base = {
+ .type = SPICE_INTERFACE_CHAR_DEVICE,
+ .description = "test spice virtual channel char device",
+ .major_version = SPICE_INTERFACE_CHAR_DEVICE_MAJOR,
+ .minor_version = SPICE_INTERFACE_CHAR_DEVICE_MINOR,
+ },
+ .state = vmc_state,
+ .write = vmc_write,
+ .read = vmc_read,
+};
+
+VmcEmu *vmc_emu_new(const char *subtype, const char *portname)
+{
+ auto vmc = g_new0(VmcEmu, 1);
+ vmc->vmc_interface = vmc_interface;
+ vmc->instance.base.sif = &vmc->vmc_interface.base;
+ vmc->instance.subtype = g_strdup(subtype);
+ if (portname) {
+ vmc->instance.portname = g_strdup(portname);
+ }
+ vmc_emu_reset(vmc);
+ return vmc;
+}
+
+void vmc_emu_destroy(VmcEmu *vmc)
+{
+ g_free(const_cast<char *>(vmc->instance.portname));
+ g_free(const_cast<char *>(vmc->instance.subtype));
+ g_free(vmc);
+}
+
+void vmc_emu_reset(VmcEmu *vmc)
+{
+ vmc->pos = 0;
+ vmc->write_pos = 0;
+ vmc->message_sizes_curr = vmc->message_sizes;
+ vmc->message_sizes_end = vmc->message_sizes;
+}
+
+void vmc_emu_add_read_till(VmcEmu *vmc, uint8_t *end)
+{
+ g_assert(vmc->message_sizes_end - vmc->message_sizes < G_N_ELEMENTS(vmc->message_sizes));
+ g_assert(end >= vmc->message);
+ g_assert(end - vmc->message <= G_N_ELEMENTS(vmc->message));
+ unsigned prev_size =
+ vmc->message_sizes_end > vmc->message_sizes ? vmc->message_sizes_end[-1] : 0;
+ unsigned size = end - vmc->message;
+ g_assert(size >= prev_size);
+ *vmc->message_sizes_end = size;
+ ++vmc->message_sizes_end;
+}
diff --git a/server/tests/vmc-emu.h b/server/tests/vmc-emu.h
new file mode 100644
index 00000000..8795200a
--- /dev/null
+++ b/server/tests/vmc-emu.h
@@ -0,0 +1,55 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2019 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#pragma once
+
+#include "char-device.h"
+
+#include "push-visibility.h"
+
+typedef struct VmcEmu VmcEmu;
+
+struct VmcEmu {
+ SpiceCharDeviceInterface vmc_interface;
+ SpiceCharDeviceInstance instance;
+
+ // device buffer to read from
+ uint8_t message[2048];
+ // position to read from
+ unsigned pos;
+
+ // array of limits when the read should return
+ // the array is defined as [message_sizes_curr, message_sizes_end)
+ // then the size is reach we move on next one till exausted
+ unsigned message_sizes[16];
+ unsigned *message_sizes_end, *message_sizes_curr;
+
+ bool device_enabled;
+
+ unsigned write_pos;
+ uint8_t write_buf[2048];
+
+ // this callback will be called when new data arrive to the device
+ void (*data_written_cb)(VmcEmu *vmc);
+};
+
+VmcEmu *vmc_emu_new(const char *subtype, const char *portname);
+void vmc_emu_destroy(VmcEmu *vmc);
+void vmc_emu_reset(VmcEmu *vmc);
+void vmc_emu_add_read_till(VmcEmu *vmc, uint8_t *end);
+
+#include "pop-visibility.h"
diff --git a/server/tests/win-alarm.c b/server/tests/win-alarm.c
new file mode 100644
index 00000000..225d0709
--- /dev/null
+++ b/server/tests/win-alarm.c
@@ -0,0 +1,65 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2018 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <config.h>
+#include <glib.h>
+
+#ifdef _WIN32
+#include <windows.h>
+#include "win-alarm.h"
+
+static HANDLE alarm_cond = NULL;
+
+static DWORD WINAPI alarm_thread_proc(LPVOID arg)
+{
+ unsigned int timeout = (uintptr_t) arg;
+ switch (WaitForSingleObject(alarm_cond, timeout * 1000)) {
+ case WAIT_OBJECT_0:
+ return 0;
+ }
+ abort();
+ return 0;
+}
+
+void alarm(unsigned int timeout)
+{
+ static HANDLE thread = NULL;
+
+ // create an event to stop the alarm thread
+ if (alarm_cond == NULL) {
+ alarm_cond = CreateEvent(NULL, TRUE, FALSE, NULL);
+ g_assert(alarm_cond != NULL);
+ }
+
+ // stop old alarm
+ if (thread) {
+ SetEvent(alarm_cond);
+ g_assert(WaitForSingleObject(thread, INFINITE) == WAIT_OBJECT_0);
+ CloseHandle(thread);
+ thread = NULL;
+ }
+
+ if (timeout) {
+ ResetEvent(alarm_cond);
+
+ // start alarm thread
+ thread = CreateThread(NULL, 0, alarm_thread_proc, (LPVOID) (uintptr_t) timeout, 0, NULL);
+ g_assert(thread);
+ }
+}
+#endif
diff --git a/client/icon.h b/server/tests/win-alarm.h
index 35b0a9d9..177df04e 100644
--- a/client/icon.h
+++ b/server/tests/win-alarm.h
@@ -1,5 +1,6 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
/*
- Copyright (C) 2009 Red Hat, Inc.
+ Copyright (C) 2018 Red Hat, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@@ -14,22 +15,18 @@
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
+#ifndef TEST_WIN_ALARM_H
+#define TEST_WIN_ALARM_H
-#ifndef _H_ICON
-#define _H_ICON
+#include <spice/macros.h>
-class Icon {
-public:
- Icon() : _refs (1) {}
+SPICE_BEGIN_DECLS
- Icon* ref() { _refs++; return this;}
- void unref() { if (!--_refs) delete this;}
-
-protected:
- virtual ~Icon() {}
+#ifdef _WIN32
+void test_alarm(unsigned int timeout);
+#define alarm test_alarm
+#endif
-private:
- int _refs;
-};
+SPICE_END_DECLS
-#endif
+#endif // TEST_WIN_ALARM_H
diff --git a/server/tree.cpp b/server/tree.cpp
new file mode 100644
index 00000000..c8d685fb
--- /dev/null
+++ b/server/tree.cpp
@@ -0,0 +1,310 @@
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+
+#include <spice/qxl_dev.h>
+
+#include "red-parse-qxl.h"
+#include "display-channel.h"
+#include "tree.h"
+
+static const char *draw_type_to_str(uint8_t type)
+{
+ switch (type) {
+ case QXL_DRAW_FILL:
+ return "QXL_DRAW_FILL";
+ case QXL_DRAW_OPAQUE:
+ return "QXL_DRAW_OPAQUE";
+ case QXL_DRAW_COPY:
+ return "QXL_DRAW_COPY";
+ case QXL_DRAW_TRANSPARENT:
+ return "QXL_DRAW_TRANSPARENT";
+ case QXL_DRAW_ALPHA_BLEND:
+ return "QXL_DRAW_ALPHA_BLEND";
+ case QXL_COPY_BITS:
+ return "QXL_COPY_BITS";
+ case QXL_DRAW_BLEND:
+ return "QXL_DRAW_BLEND";
+ case QXL_DRAW_BLACKNESS:
+ return "QXL_DRAW_BLACKNESS";
+ case QXL_DRAW_WHITENESS:
+ return "QXL_DRAW_WHITENESS";
+ case QXL_DRAW_INVERS:
+ return "QXL_DRAW_INVERS";
+ case QXL_DRAW_ROP3:
+ return "QXL_DRAW_ROP3";
+ case QXL_DRAW_COMPOSITE:
+ return "QXL_DRAW_COMPOSITE";
+ case QXL_DRAW_STROKE:
+ return "QXL_DRAW_STROKE";
+ case QXL_DRAW_TEXT:
+ return "QXL_DRAW_TEXT";
+ default:
+ return "?";
+ }
+}
+
+static void show_red_drawable(RedDrawable *drawable, const char *prefix)
+{
+ if (prefix) {
+ printf("%s: ", prefix);
+ }
+
+ printf("%s effect %d bbox(%d %d %d %d)",
+ draw_type_to_str(drawable->type),
+ drawable->effect,
+ drawable->bbox.top,
+ drawable->bbox.left,
+ drawable->bbox.bottom,
+ drawable->bbox.right);
+
+ switch (drawable->type) {
+ case QXL_DRAW_FILL:
+ case QXL_DRAW_OPAQUE:
+ case QXL_DRAW_COPY:
+ case QXL_DRAW_TRANSPARENT:
+ case QXL_DRAW_ALPHA_BLEND:
+ case QXL_COPY_BITS:
+ case QXL_DRAW_BLEND:
+ case QXL_DRAW_BLACKNESS:
+ case QXL_DRAW_WHITENESS:
+ case QXL_DRAW_INVERS:
+ case QXL_DRAW_ROP3:
+ case QXL_DRAW_COMPOSITE:
+ case QXL_DRAW_STROKE:
+ case QXL_DRAW_TEXT:
+ break;
+ default:
+ spice_error("bad drawable type");
+ }
+ printf("\n");
+}
+
+static void show_draw_item(DrawItem *draw_item, const char *prefix)
+{
+ if (prefix) {
+ printf("%s: ", prefix);
+ }
+ printf("effect %d bbox(%d %d %d %d)\n",
+ draw_item->effect,
+ draw_item->base.rgn.extents.x1,
+ draw_item->base.rgn.extents.y1,
+ draw_item->base.rgn.extents.x2,
+ draw_item->base.rgn.extents.y2);
+}
+
+struct DumpItem {
+ int level;
+ Container *container;
+};
+
+static void dump_item(TreeItem *item, void *data)
+{
+ auto di = static_cast<DumpItem *>(data);
+ const char *item_prefix = "|--";
+ int i;
+
+ if (di->container) {
+ while (di->container != item->container) {
+ di->level--;
+ di->container = di->container->base.container;
+ }
+ }
+
+ switch (item->type) {
+ case TREE_ITEM_TYPE_DRAWABLE: {
+ Drawable *drawable = SPICE_CONTAINEROF(item, Drawable, tree_item.base);
+ const int max_indent = 200;
+ char indent_str[max_indent + 1];
+ int indent_str_len;
+
+ for (i = 0; i < di->level; i++) {
+ printf(" ");
+ }
+ printf(item_prefix, 0);
+ show_red_drawable(drawable->red_drawable.get(), nullptr);
+ for (i = 0; i < di->level; i++) {
+ printf(" ");
+ }
+ printf("| ");
+ show_draw_item(&drawable->tree_item, nullptr);
+ indent_str_len = MIN(max_indent, strlen(item_prefix) + di->level * 2);
+ memset(indent_str, ' ', indent_str_len);
+ indent_str[indent_str_len] = 0;
+ region_dump(&item->rgn, indent_str);
+ printf("\n");
+ break;
+ }
+ case TREE_ITEM_TYPE_CONTAINER:
+ di->level++;
+ di->container = CONTAINER(item);
+ break;
+ case TREE_ITEM_TYPE_SHADOW:
+ break;
+ }
+}
+
+static void tree_foreach(TreeItem *item, void (*f)(TreeItem *, void *), void * data)
+{
+ if (!item)
+ return;
+
+ f(item, data);
+
+ if (item->type == TREE_ITEM_TYPE_CONTAINER) {
+ Container *container = CONTAINER(item);
+ RingItem *it;
+
+ RING_FOREACH(it, &container->items) {
+ tree_foreach(SPICE_CONTAINEROF(it, TreeItem, siblings_link), f, data);
+ }
+ }
+}
+
+void tree_item_dump(TreeItem *item)
+{
+ DumpItem di = { 0, };
+
+ spice_return_if_fail(item != nullptr);
+ tree_foreach(item, dump_item, &di);
+}
+
+/* Creates a new Shadow item for the given DrawItem, with an offset of @delta.
+ * A shadow represents a source region for a COPY_BITS operation, while the
+ * DrawItem represents the destination region for the operation */
+Shadow* shadow_new(DrawItem *item, const SpicePoint *delta)
+{
+ spice_return_val_if_fail(item->shadow == nullptr, NULL);
+ if (!delta->x && !delta->y) {
+ return nullptr;
+ }
+
+ auto shadow = g_new(Shadow, 1);
+
+ shadow->base.type = TREE_ITEM_TYPE_SHADOW;
+ shadow->base.container = nullptr;
+ region_clone(&shadow->base.rgn, &item->base.rgn);
+ region_offset(&shadow->base.rgn, delta->x, delta->y);
+ ring_item_init(&shadow->base.siblings_link);
+ region_init(&shadow->on_hold);
+ item->shadow = shadow;
+
+ return shadow;
+}
+
+/* Create a new container to hold @item and insert @item into this container.
+ *
+ * NOTE: This function assumes that @item is already inside a different Ring,
+ * so it removes @item from that ring before inserting it into the new
+ * container */
+Container* container_new(DrawItem *item)
+{
+ auto container = g_new(Container, 1);
+
+ container->base.type = TREE_ITEM_TYPE_CONTAINER;
+ container->base.container = item->base.container;
+ item->base.container = container;
+ item->container_root = TRUE;
+ region_clone(&container->base.rgn, &item->base.rgn);
+ ring_item_init(&container->base.siblings_link);
+ ring_add_after(&container->base.siblings_link, &item->base.siblings_link);
+ ring_remove(&item->base.siblings_link);
+ ring_init(&container->items);
+ ring_add(&container->items, &item->base.siblings_link);
+
+ return container;
+}
+
+void container_free(Container *container)
+{
+ spice_return_if_fail(ring_is_empty(&container->items));
+
+ ring_remove(&container->base.siblings_link);
+ region_destroy(&container->base.rgn);
+ g_free(container);
+}
+
+void container_cleanup(Container *container)
+{
+ /* visit upward, removing containers */
+ /* non-empty container get its element moving up ?? */
+ while (container && container->items.next == container->items.prev) {
+ Container *next = container->base.container;
+ if (container->items.next != &container->items) {
+ SPICE_VERIFY(SPICE_OFFSETOF(TreeItem, siblings_link) == 0);
+ auto item = reinterpret_cast<TreeItem *>(ring_get_head(&container->items));
+ spice_assert(item);
+ ring_remove(&item->siblings_link);
+ ring_add_after(&item->siblings_link, &container->base.siblings_link);
+ item->container = container->base.container;
+ }
+ container_free(container);
+ container = next;
+ }
+}
+
+/* FIXME: document weird function: go down containers, and return drawable->shadow? */
+Shadow* tree_item_find_shadow(TreeItem *item)
+{
+ while (item->type == TREE_ITEM_TYPE_CONTAINER) {
+ SPICE_VERIFY(SPICE_OFFSETOF(TreeItem, siblings_link) == 0);
+ if (!(item = reinterpret_cast<TreeItem *>(ring_get_tail(&CONTAINER(item)->items)))) {
+ return nullptr;
+ }
+ }
+
+ if (item->type != TREE_ITEM_TYPE_DRAWABLE) {
+ return nullptr;
+ }
+
+ return DRAW_ITEM(item)->shadow;
+}
+
+/* return the Ring containing siblings of item, falling back to @ring if @item
+ * does not have a container */
+Ring *tree_item_container_items(TreeItem *item, Ring *ring)
+{
+ return (item->container) ? &item->container->items : ring;
+}
+
+bool tree_item_contained_by(TreeItem *item, Ring *ring)
+{
+ spice_assert(item && ring);
+ do {
+ Ring *now = tree_item_container_items(item, ring);
+ if (now == ring) {
+ return TRUE;
+ }
+ } while ((item = &item->container->base)); /* move up one level */
+
+ return FALSE;
+}
+
+void draw_item_remove_shadow(DrawItem *item)
+{
+ Shadow *shadow;
+
+ if (!item->shadow) {
+ return;
+ }
+ shadow = item->shadow;
+ item->shadow = nullptr;
+ ring_remove(&shadow->base.siblings_link);
+ region_destroy(&shadow->base.rgn);
+ region_destroy(&shadow->on_hold);
+ g_free(shadow);
+}
diff --git a/server/tree.h b/server/tree.h
new file mode 100644
index 00000000..5827f364
--- /dev/null
+++ b/server/tree.h
@@ -0,0 +1,101 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef TREE_H_
+#define TREE_H_
+
+#include <stdint.h>
+#include <common/region.h>
+#include <common/ring.h>
+
+#include "spice-bitmap-utils.h"
+
+#include "push-visibility.h"
+
+enum {
+ TREE_ITEM_TYPE_NONE,
+ TREE_ITEM_TYPE_DRAWABLE,
+ TREE_ITEM_TYPE_CONTAINER,
+ TREE_ITEM_TYPE_SHADOW,
+
+ TREE_ITEM_TYPE_LAST,
+};
+
+struct Container;
+
+/* TODO consider GNode instead */
+struct TreeItem {
+ RingItem siblings_link;
+ uint32_t type;
+ Container *container;
+ /* rgn holds the region of the item. As additional items get added to the
+ * tree, this region may be modified to exclude the portion of the item
+ * that is obscured by other items */
+ QRegion rgn;
+};
+
+/* A region "below" a copy, or the src region of the copy */
+struct Shadow {
+ TreeItem base;
+ /* holds the union of all parts of this source region that have been
+ * obscured by a drawable item that has been subsequently added to the tree
+ */
+ QRegion on_hold;
+};
+
+#define IS_SHADOW(item) ((item)->type == TREE_ITEM_TYPE_SHADOW)
+#define SHADOW(item) SPICE_UPCAST(Shadow, item)
+
+struct Container {
+ TreeItem base;
+ Ring items;
+};
+
+#define IS_CONTAINER(item) ((item)->type == TREE_ITEM_TYPE_CONTAINER)
+#define CONTAINER(item) SPICE_UPCAST(Container, item)
+
+struct DrawItem {
+ TreeItem base;
+ uint8_t effect;
+ uint8_t container_root;
+ Shadow *shadow;
+};
+
+#define IS_DRAW_ITEM(item) ((item)->type == TREE_ITEM_TYPE_DRAWABLE)
+#define DRAW_ITEM(item) SPICE_UPCAST(DrawItem, item)
+
+static inline int is_opaque_item(TreeItem *item)
+{
+ return item->type == TREE_ITEM_TYPE_CONTAINER ||
+ (IS_DRAW_ITEM(item) && DRAW_ITEM(item)->effect == QXL_EFFECT_OPAQUE);
+}
+
+void tree_item_dump (TreeItem *item);
+Shadow* tree_item_find_shadow (TreeItem *item);
+bool tree_item_contained_by (TreeItem *item, Ring *ring);
+Ring* tree_item_container_items (TreeItem *item, Ring *ring);
+
+void draw_item_remove_shadow (DrawItem *item);
+Shadow* shadow_new (DrawItem *item, const SpicePoint *delta);
+Container* container_new (DrawItem *item);
+void container_free (Container *container);
+void container_cleanup (Container *container);
+
+#include "pop-visibility.h"
+
+#endif /* TREE_H_ */
diff --git a/server/utils.c b/server/utils.c
new file mode 100644
index 00000000..6232991f
--- /dev/null
+++ b/server/utils.c
@@ -0,0 +1,128 @@
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+
+#include <glib.h>
+#include <spice/enums.h>
+#include <openssl/err.h>
+#include <common/macros.h>
+
+#include "utils.h"
+
+int rgb32_data_has_alpha(int width, int height, size_t stride,
+ const uint8_t *data, int *all_set_out)
+{
+ const uint8_t *line, *end;
+ uint8_t alpha;
+ int has_alpha;
+
+ has_alpha = FALSE;
+ while (height-- > 0) {
+ line = data;
+ end = line + sizeof(uint32_t) * width;
+ data += stride;
+ while (line != end) {
+ alpha = line[3];
+ if (alpha != 0) {
+ has_alpha = TRUE;
+ if (alpha != 0xffU) {
+ *all_set_out = FALSE;
+ return TRUE;
+ }
+ }
+ line += sizeof(uint32_t);
+ }
+ }
+
+ *all_set_out = has_alpha;
+ return has_alpha;
+}
+
+/* These names are used to parse command line options, don't change them */
+static const char *const channel_names[] = {
+ [ SPICE_CHANNEL_MAIN ] = "main",
+ [ SPICE_CHANNEL_DISPLAY ] = "display",
+ [ SPICE_CHANNEL_INPUTS ] = "inputs",
+ [ SPICE_CHANNEL_CURSOR ] = "cursor",
+ [ SPICE_CHANNEL_PLAYBACK ] = "playback",
+ [ SPICE_CHANNEL_RECORD ] = "record",
+ [ SPICE_CHANNEL_TUNNEL ] = "tunnel",
+ [ SPICE_CHANNEL_SMARTCARD] = "smartcard",
+ [ SPICE_CHANNEL_USBREDIR ] = "usbredir",
+ [ SPICE_CHANNEL_PORT ] = "port",
+ [ SPICE_CHANNEL_WEBDAV ] = "webdav",
+};
+
+/* Make sure the last channel in the protocol has a name.
+ * We don't want to do this check in all cases as this would make code
+ * fail to compile if there are additional channels in the protocol so
+ * do this check only if ENABLE_EXTRA_CHECKS is enabled */
+#if ENABLE_EXTRA_CHECKS
+verify(G_N_ELEMENTS(channel_names) == SPICE_END_CHANNEL);
+#endif
+
+/**
+ * red_channel_type_to_str:
+ *
+ * This function returns a human-readable name from a SPICE_CHANNEL_* type.
+ * It must be called with a valid channel type.
+ *
+ * Returns: NULL if the channel type is invalid, the channel name otherwise.
+ */
+const char *red_channel_type_to_str(int type)
+{
+ g_return_val_if_fail(type >= 0, NULL);
+ g_return_val_if_fail(type < G_N_ELEMENTS(channel_names), NULL);
+ g_return_val_if_fail(channel_names[type] != NULL, NULL);
+
+ return channel_names[type];
+}
+
+/**
+ * red_channel_name_to_type:
+ *
+ * Converts a channel name to a SPICE_CHANNEL_* type. These names are currently
+ * used in our public API (see spice_server_set_channel_security()).
+ *
+ * Returns: -1 if @name was not a known channel name, the channel
+ * type otherwise.
+ *
+ */
+int red_channel_name_to_type(const char *name)
+{
+ int i;
+
+ for (i = 0; i < G_N_ELEMENTS(channel_names); i++) {
+ if (g_strcmp0(channel_names[i], name) == 0) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+void red_dump_openssl_errors(void)
+{
+ int ssl_error;
+
+ ssl_error = ERR_get_error();
+ while (ssl_error != 0) {
+ char error_str[256];
+ ERR_error_string_n(ssl_error, error_str, sizeof(error_str));
+ g_warning("%s", error_str);
+ ssl_error = ERR_get_error();
+ }
+}
diff --git a/server/utils.h b/server/utils.h
new file mode 100644
index 00000000..13764635
--- /dev/null
+++ b/server/utils.h
@@ -0,0 +1,88 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef UTILS_H_
+#define UTILS_H_
+
+#include <stdint.h>
+#include <glib.h>
+#include <spice/macros.h>
+
+SPICE_BEGIN_DECLS
+
+#define SPICE_GNUC_VISIBLE __attribute__ ((visibility ("default")))
+
+static inline void set_bit(int index, uint32_t *addr)
+{
+ uint32_t mask = 1 << index;
+ __sync_or_and_fetch(addr, mask);
+}
+
+static inline void clear_bit(int index, uint32_t *addr)
+{
+ uint32_t mask = ~(1 << index);
+ __sync_and_and_fetch(addr, mask);
+}
+
+static inline int test_bit(int index, uint32_t val)
+{
+ return val & (1u << index);
+}
+/* a generic safe for loop macro */
+#define SAFE_FOREACH(link, next, cond, ring, data, get_data) \
+ for ((((link) = ((cond) ? ring_get_head(ring) : NULL)), \
+ ((next) = ((link) ? ring_next((ring), (link)) : NULL)), \
+ ((data) = ((link)? (get_data) : NULL))); \
+ (link); \
+ (((link) = (next)), \
+ ((next) = ((link) ? ring_next((ring), (link)) : NULL)), \
+ ((data) = ((link)? (get_data) : NULL))))
+
+typedef int64_t red_time_t;
+
+#define NSEC_PER_SEC INT64_C(1000000000)
+#define NSEC_PER_MILLISEC INT64_C(1000000)
+#define NSEC_PER_MICROSEC INT64_C(1000)
+
+/* g_get_monotonic_time() does not have enough precision */
+static inline red_time_t spice_get_monotonic_time_ns(void)
+{
+ struct timespec time;
+
+ clock_gettime(CLOCK_MONOTONIC, &time);
+ return NSEC_PER_SEC * time.tv_sec + time.tv_nsec;
+}
+
+#define MSEC_PER_SEC 1000
+
+int rgb32_data_has_alpha(int width, int height, size_t stride,
+ const uint8_t *data, int *all_set_out);
+
+const char *red_channel_type_to_str(int type);
+int red_channel_name_to_type(const char *name);
+
+void red_dump_openssl_errors(void);
+
+static inline int64_t i64abs(int64_t value)
+{
+ return (value >= 0) ? value : -value;
+}
+
+SPICE_END_DECLS
+
+#endif /* UTILS_H_ */
diff --git a/server/utils.hpp b/server/utils.hpp
new file mode 100644
index 00000000..e25e1c5e
--- /dev/null
+++ b/server/utils.hpp
@@ -0,0 +1,497 @@
+/*
+ Copyright (C) 2019 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @file utils.hpp
+ * Generic utilities for C++
+ */
+#pragma once
+
+#include <memory>
+#include <atomic>
+
+#include "push-visibility.h"
+
+namespace red {
+
+
+template <typename T>
+inline T* add_ref(T* p)
+{
+ if (p) {
+ p->ref();
+ }
+ return p;
+}
+
+
+/**
+ * Smart pointer allocated once
+ *
+ * It just keep the pointer passed to constructor and delete
+ * the object in the destructor. No copy or move allowed.
+ * Very easy but make sure we don't change it and that's
+ * initialized.
+ */
+template <typename T>
+class unique_link
+{
+public:
+ unique_link(): p(new T())
+ {
+ }
+ unique_link(T* ptr): p(ptr)
+ {
+ }
+ ~unique_link()
+ {
+ delete p;
+ }
+ T* operator->() noexcept
+ {
+ return p;
+ }
+ const T* operator->() const noexcept
+ {
+ return p;
+ }
+ T *get() const noexcept
+ {
+ return p;
+ }
+private:
+ T *const p;
+ unique_link(const unique_link&)=delete;
+ void operator=(const unique_link&)=delete;
+};
+
+
+template <typename T>
+struct GLibDeleter {
+ void operator()(T* p)
+ {
+ g_free(p);
+ }
+};
+
+/**
+ * Allows to define a variable holding objects allocated with
+ * g_malloc().
+ *
+ * @code{.cpp}
+ * red::glib_unique_ptr<char> s = g_strdup("hello");
+ * @endcode
+ */
+template <typename T>
+using glib_unique_ptr = std::unique_ptr<T, GLibDeleter<T>>;
+
+
+/**
+ * @brief Returns the size of an array.
+ * Introduced in C++17 but lacking in C++11
+ */
+template <class T, size_t N>
+constexpr size_t size(const T (&array)[N]) noexcept
+{
+ return N;
+}
+
+
+template <typename T>
+class weak_ptr;
+
+/**
+ * Basic shared pointer for internal reference
+ *
+ * Similar to STL version but using intrusive. This to allow creating multiple
+ * shared pointers from the raw pointer without problems having the object
+ * freed when one single set of shared pointer is removed. The code used
+ * to increment the reference to make sure the object was not deleted in
+ * some cases of self destruction.
+ *
+ * This class is inspired to boost::intrusive_ptr.
+ *
+ * To allow to reference and unrefered any object the object should
+ * define shared_ptr_add_ref() and shared_ptr_unref(), both taking a pointer and incrementing and
+ * decrementing respectively. You should not call these function yourselves.
+ *
+ * It's recommended that you create the object with red::make_shared() provided below. This to makes
+ * sure that there is at least one strong reference to the object.
+ */
+template <typename T>
+class shared_ptr
+{
+friend class weak_ptr<T>;
+public:
+ explicit shared_ptr(T *ptr=nullptr): p(ptr)
+ {
+ if (p) {
+ shared_ptr_add_ref(p);
+ }
+ }
+ template <class Q>
+ explicit shared_ptr(Q *ptr): shared_ptr(static_cast<T*>(ptr))
+ {
+ }
+ shared_ptr(const shared_ptr& rhs): p(rhs.p)
+ {
+ if (p) {
+ shared_ptr_add_ref(p);
+ }
+ }
+ template <class Q>
+ shared_ptr(const shared_ptr<Q>& rhs): shared_ptr(static_cast<T*>(rhs.get()))
+ {
+ }
+ shared_ptr& operator=(const shared_ptr& rhs)
+ {
+ if (rhs.p != p) {
+ reset(rhs.p);
+ }
+ return *this;
+ }
+ template <class Q>
+ shared_ptr& operator=(const shared_ptr<Q>& rhs)
+ {
+ reset(rhs.get());
+ return *this;
+ }
+ shared_ptr(shared_ptr&& rhs): p(rhs.p)
+ {
+ rhs.p = nullptr;
+ }
+ shared_ptr& operator=(shared_ptr&& rhs)
+ {
+ if (p) {
+ shared_ptr_unref(p);
+ }
+ p = rhs.p;
+ rhs.p = nullptr;
+ return *this;
+ }
+ ~shared_ptr()
+ {
+ if (p) {
+ shared_ptr_unref(p);
+ }
+ }
+ void reset(T *ptr=nullptr)
+ {
+ if (ptr) {
+ shared_ptr_add_ref(ptr);
+ }
+ if (p) {
+ shared_ptr_unref(p);
+ }
+ p = ptr;
+ }
+ operator bool() const
+ {
+ return p;
+ }
+ T& operator*() const noexcept
+ {
+ return *p;
+ }
+ T* operator->() const noexcept
+ {
+ return p;
+ }
+ T *get() const noexcept
+ {
+ return p;
+ }
+private:
+ T* p;
+ // for weak_ptr
+ explicit shared_ptr(T *ptr, bool dummy): p(ptr)
+ {
+ }
+};
+
+template <class T, class O>
+inline bool operator==(const shared_ptr<T>& a, const shared_ptr<O>& b)
+{
+ return a.get() == b.get();
+}
+
+template <class T, class O>
+inline bool operator!=(const shared_ptr<T>& a, const shared_ptr<O>& b)
+{
+ return a.get() != b.get();
+}
+
+/**
+ * Allows to create and object and wrap into a smart pointer at the same
+ * time.
+ * You should try to allocated any shared pointer managed object with this
+ * function.
+ */
+template<typename T, typename... Args>
+inline shared_ptr<T> make_shared(Args&&... args)
+{
+ return shared_ptr<T>(new T(args...));
+}
+
+/**
+ * Utility to help implementing shared_ptr requirements.
+ *
+ * You should inherit publicly this class in order to have base internal reference counting
+ * implementation.
+ *
+ * This class uses atomic operations and virtual destructor so it's not really light.
+ * @see simple_ptr_counted
+ */
+class shared_ptr_counted
+{
+public:
+ SPICE_CXX_GLIB_ALLOCATOR
+
+ shared_ptr_counted(): ref_count(0)
+ {
+ }
+protected:
+ virtual ~shared_ptr_counted() {}
+private:
+ std::atomic_int ref_count;
+ shared_ptr_counted(const shared_ptr_counted& rhs)=delete;
+ void operator=(const shared_ptr_counted& rhs)=delete;
+ friend inline void shared_ptr_add_ref(shared_ptr_counted*);
+ friend inline void shared_ptr_unref(shared_ptr_counted*);
+};
+
+// implements requirements for shared_ptr
+inline void shared_ptr_add_ref(shared_ptr_counted* p)
+{
+ ++p->ref_count;
+}
+
+inline void shared_ptr_unref(shared_ptr_counted* p)
+{
+ if (--p->ref_count == 0) {
+ delete p;
+ }
+}
+
+/**
+ * Basic weak pointer for internal reference
+ *
+ * Similar to STL version like shared_ptr here.
+ *
+ * In order to support weak_ptr for an object weak_ptr_add_ref(),
+ * weak_ptr_unref() and weak_ptr_lock() should be implemented. See below.
+ */
+template <typename T>
+class weak_ptr
+{
+public:
+ explicit weak_ptr(T *ptr=nullptr): p(ptr)
+ {
+ if (p) {
+ weak_ptr_add_ref(p);
+ }
+ }
+ weak_ptr(const weak_ptr& rhs): p(rhs.p)
+ {
+ if (p) {
+ weak_ptr_add_ref(p);
+ }
+ }
+ weak_ptr& operator=(const weak_ptr& rhs)
+ {
+ if (rhs.p != p) {
+ reset(rhs.p);
+ }
+ return *this;
+ }
+ weak_ptr(weak_ptr&& rhs): p(rhs.p)
+ {
+ rhs.p = nullptr;
+ }
+ weak_ptr& operator=(weak_ptr&& rhs)
+ {
+ if (p) {
+ weak_ptr_unref(p);
+ }
+ p = rhs.p;
+ rhs.p = nullptr;
+ return *this;
+ }
+ ~weak_ptr()
+ {
+ if (p) {
+ weak_ptr_unref(p);
+ }
+ }
+ // get a strong reference
+ shared_ptr<T> lock()
+ {
+ return shared_ptr<T>(p && weak_ptr_lock(p) ? p : nullptr, false);
+ }
+ void reset(T *ptr=nullptr)
+ {
+ if (ptr) {
+ weak_ptr_add_ref(ptr);
+ }
+ if (p) {
+ weak_ptr_unref(p);
+ }
+ p = ptr;
+ }
+ // NOTE do not add operator bool using p, we need to check if still valid
+private:
+ T* p;
+};
+
+
+/**
+ * Utility to help implementing shared ptr with weak semantic too
+ *
+ * Similar to shared_ptr_counted but you can use weak pointers too.
+ */
+class shared_ptr_counted_weak
+{
+public:
+ SPICE_CXX_GLIB_ALLOCATOR
+
+ shared_ptr_counted_weak(): ref_count(0), weak_count(1)
+ {
+ }
+protected:
+ virtual ~shared_ptr_counted_weak() {}
+private:
+ std::atomic_int ref_count;
+ std::atomic_int weak_count;
+ shared_ptr_counted_weak(const shared_ptr_counted_weak& rhs)=delete;
+ void operator=(const shared_ptr_counted_weak& rhs)=delete;
+ // this is used in order to use operator delete defined in this class, not global one
+ void free_helper(void *p) { operator delete(p); }
+ friend inline void shared_ptr_add_ref(shared_ptr_counted_weak*);
+ friend inline void shared_ptr_unref(shared_ptr_counted_weak*);
+ friend inline void weak_ptr_add_ref(shared_ptr_counted_weak*);
+ friend inline void weak_ptr_unref(shared_ptr_counted_weak*);
+ friend inline bool weak_ptr_lock(shared_ptr_counted_weak*);
+};
+
+// implements requirements for shared_ptr
+inline void shared_ptr_add_ref(shared_ptr_counted_weak* p)
+{
+ ++p->ref_count;
+}
+
+inline void shared_ptr_unref(shared_ptr_counted_weak* p)
+{
+ if (--p->ref_count == 0) {
+ p->~shared_ptr_counted_weak();
+ std::atomic_thread_fence(std::memory_order_release);
+ if (--p->weak_count == 0) {
+ p->free_helper(p);
+ }
+ }
+}
+
+// implements requirements for weak_ptr
+inline void weak_ptr_add_ref(shared_ptr_counted_weak* p)
+{
+ p->weak_count++;
+}
+
+inline void weak_ptr_unref(shared_ptr_counted_weak* p)
+{
+ if (--p->weak_count == 0) {
+ std::atomic_thread_fence(std::memory_order_acquire);
+ p->free_helper(p);
+ }
+}
+
+inline bool weak_ptr_lock(shared_ptr_counted_weak* p)
+{
+ int count = (int) p->ref_count;
+ do {
+ if (count == 0) {
+ return false;
+ }
+ } while (!p->ref_count.compare_exchange_weak(count, count + 1));
+ return true;
+}
+
+
+/**
+ * Utility to help implementing shared_ptr requirements.
+ *
+ * You should inherit publicly this class in order to have base internal reference counting
+ * implementation.
+ *
+ * This class does not use atomic operations and virtual destructor so it's more light than
+ * shared_ptr_counted.
+ *
+ * To avoid issues with inheritance not calling proper destructor the derived objects should
+ * follow this pattern (note the final):
+ *
+ * @code{.cpp}
+ * class Name final: public simple_ptr_counted<Name> {
+ * ...
+ * }
+ * @endcode
+ *
+ * or
+ *
+ * @code{.cpp}
+ * class Name: public simple_ptr_counted<Name> {
+ * ...
+ * virtual ~Name();
+ * ...
+ * }
+ * @endcode
+ */
+template <typename T>
+class simple_ptr_counted
+{
+public:
+ SPICE_CXX_GLIB_ALLOCATOR
+
+ simple_ptr_counted(): ref_count(0)
+ {
+ }
+private:
+ mutable int ref_count;
+ simple_ptr_counted(const simple_ptr_counted<T>& rhs)=delete;
+ void operator=(const simple_ptr_counted<T>& rhs)=delete;
+ template <typename Q>
+ friend inline void shared_ptr_add_ref(const simple_ptr_counted<Q>*);
+ template <typename Q>
+ friend inline void shared_ptr_unref(const simple_ptr_counted<Q>*);
+};
+
+template <typename T>
+inline void shared_ptr_add_ref(const simple_ptr_counted<T>* p)
+{
+ ++p->ref_count;
+}
+
+template <typename T>
+inline void shared_ptr_unref(const simple_ptr_counted<T>* p)
+{
+ if (--p->ref_count == 0) {
+ delete const_cast<T*>(static_cast<const T*>(p));
+ }
+}
+
+
+} // namespace red
+
+#include "pop-visibility.h"
diff --git a/server/video-encoder.h b/server/video-encoder.h
new file mode 100644
index 00000000..c2bdc811
--- /dev/null
+++ b/server/video-encoder.h
@@ -0,0 +1,222 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009 Red Hat, Inc.
+ Copyright (C) 2015 Jeremy White
+ Copyright (C) 2015 Francois Gouget
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef VIDEO_ENCODER_H_
+#define VIDEO_ENCODER_H_
+
+#include <inttypes.h>
+#include <glib.h>
+#include <common/draw.h>
+
+
+SPICE_BEGIN_DECLS
+
+/* A structure containing the data for a compressed frame. See encode_frame(). */
+typedef struct VideoBuffer VideoBuffer;
+struct VideoBuffer {
+ /* A pointer to the compressed frame data. */
+ uint8_t *data;
+
+ /* The size of the compressed frame in bytes. */
+ uint32_t size;
+
+ /* Releases the video buffer resources and deallocates it.
+ *
+ * @buffer: The video buffer.
+ */
+ void (*free)(VideoBuffer *buffer);
+};
+
+typedef enum {
+ VIDEO_ENCODER_FRAME_UNSUPPORTED = -1,
+ VIDEO_ENCODER_FRAME_DROP,
+ VIDEO_ENCODER_FRAME_ENCODE_DONE,
+} VideoEncodeResults;
+
+typedef struct VideoEncoderStats {
+ uint64_t starting_bit_rate;
+ uint64_t cur_bit_rate;
+ double avg_quality;
+} VideoEncoderStats;
+
+typedef struct VideoEncoder VideoEncoder;
+struct VideoEncoder {
+ /* Releases the video encoder's resources */
+ void (*destroy)(VideoEncoder *encoder);
+
+ /* Compresses the specified src image area into the outbuf buffer.
+ *
+ * @encoder: The video encoder.
+ * @frame_mm_time: The frame's mm-time timestamp in milliseconds.
+ * @bitmap: A bitmap containing the source video frame.
+ * @src: A rectangle specifying the area occupied by the video.
+ * @top_down: If true the first video line is specified by src.top.
+ * @bitmap_opaque: The parameter for the bitmap_ref() and bitmap_unref()
+ * callbacks.
+ * @outbuf: A pointer to a VideoBuffer structure containing the
+ * compressed frame if successful. Call the buffer's
+ * free() method as soon as it is no longer needed.
+ * @return:
+ * VIDEO_ENCODER_FRAME_ENCODE_DONE if successful.
+ * VIDEO_ENCODER_FRAME_UNSUPPORTED if the frame cannot be encoded.
+ * VIDEO_ENCODER_FRAME_DROP if the frame was dropped. This value can
+ * only happen if rate control is active.
+ */
+ VideoEncodeResults (*encode_frame)(VideoEncoder *encoder, uint32_t frame_mm_time,
+ const SpiceBitmap *bitmap,
+ const SpiceRect *src, int top_down,
+ gpointer bitmap_opaque, VideoBuffer** outbuf);
+
+ /*
+ * Bit rate control methods.
+ */
+
+ /* When rate control is active statistics are periodically obtained from
+ * the client and sent to the video encoder through this method.
+ *
+ * @encoder: The video encoder.
+ * @num_frames: The number of frames that reached the client during
+ * the time period the report is referring to.
+ * @num_drops: The part of the above frames that was dropped by the
+ * client due to late arrival time.
+ * @start_frame_mm_time: The mm_time of the first frame included in the
+ * report.
+ * @end_frame_mm_time: The mm_time of the last frame included in the
+ * report.
+ * @end_frame_delay: This indicates how long in advance the client
+ * received the last frame before having to display it.
+ * @audio_delay: The latency of the audio playback or MAX_UINT if it
+ * is not tracked.
+ */
+ void (*client_stream_report)(VideoEncoder *encoder,
+ uint32_t num_frames, uint32_t num_drops,
+ uint32_t start_frame_mm_time,
+ uint32_t end_frame_mm_time,
+ int32_t end_frame_delay, uint32_t audio_delay);
+
+ /* This notifies the video encoder each time a frame is dropped due to
+ * pipe congestion.
+ *
+ * Note that frames are being dropped before they are encoded and that
+ * there may be any number of encoded frames in the network queue.
+ * The client reports provide richer and typically more reactive
+ * information for fine tuning the playback parameters but this function
+ * provides a fallback when client reports are getting delayed or are not
+ * supported by the client.
+ *
+ * @encoder: The video encoder.
+ */
+ void (*notify_server_frame_drop)(VideoEncoder *encoder);
+
+ /* This queries the video encoder's current bit rate.
+ *
+ * @encoder: The video encoder.
+ * @return: The current bit rate in bits per second.
+ */
+ uint64_t (*get_bit_rate)(VideoEncoder *encoder);
+
+ /* Collects video statistics.
+ *
+ * @encoder: The video encoder.
+ * @stats: A VideoEncoderStats structure to fill with the collected
+ * statistics.
+ */
+ void (*get_stats)(VideoEncoder *encoder, VideoEncoderStats *stats);
+
+ /* The codec being used by the video encoder */
+ SpiceVideoCodecType codec_type;
+};
+
+
+/* When rate control is active the video encoder can use these callbacks to
+ * figure out how to adjust the stream bit rate and adjust some stream
+ * parameters.
+ */
+typedef struct VideoEncoderRateControlCbs {
+ /* The opaque parameter for the callbacks */
+ void *opaque;
+
+ /* Returns the stream's estimated roundtrip time in milliseconds. */
+ uint32_t (*get_roundtrip_ms)(void *opaque);
+
+ /* Returns the estimated input frame rate.
+ *
+ * This is the number of frames per second arriving from the guest to
+ * spice-server, before any drops.
+ */
+ uint32_t (*get_source_fps)(void *opaque);
+
+ /* Informs the client of the minimum playback delay.
+ *
+ * @delay_ms: The minimum number of milliseconds required for the
+ * frames to reach the client.
+ */
+ void (*update_client_playback_delay)(void *opaque, uint32_t delay_ms);
+} VideoEncoderRateControlCbs;
+
+typedef void (*bitmap_ref_t)(gpointer data);
+typedef void (*bitmap_unref_t)(gpointer data);
+
+/* Instantiates the video encoder.
+ *
+ * @codec_type: The codec to use.
+ * @starting_bit_rate: An initial estimate of the available stream bit rate
+ * or zero if the client does not support rate control.
+ * @cbs: A set of callback methods to be used for rate control.
+ * @bitmap_ref: A callback that the encoder can use to increase the
+ * bitmap refcount.
+ * This must be called from the main context.
+ * @bitmap_unref: A callback that the encoder can use to decrease the
+ * bitmap refcount.
+ * This must be called from the main context.
+ * @return: A pointer to a structure implementing the VideoEncoder
+ * methods.
+ */
+typedef VideoEncoder* (*new_video_encoder_t)(SpiceVideoCodecType codec_type,
+ uint64_t starting_bit_rate,
+ VideoEncoderRateControlCbs *cbs,
+ bitmap_ref_t bitmap_ref,
+ bitmap_unref_t bitmap_unref);
+
+VideoEncoder* mjpeg_encoder_new(SpiceVideoCodecType codec_type,
+ uint64_t starting_bit_rate,
+ VideoEncoderRateControlCbs *cbs,
+ bitmap_ref_t bitmap_ref,
+ bitmap_unref_t bitmap_unref);
+#if defined(HAVE_GSTREAMER_1_0)
+VideoEncoder* gstreamer_encoder_new(SpiceVideoCodecType codec_type,
+ uint64_t starting_bit_rate,
+ VideoEncoderRateControlCbs *cbs,
+ bitmap_ref_t bitmap_ref,
+ bitmap_unref_t bitmap_unref);
+#endif
+
+
+typedef struct RedVideoCodec {
+ new_video_encoder_t create;
+ SpiceVideoCodecType type;
+ uint32_t cap;
+} RedVideoCodec;
+
+char *video_codecs_to_string(GArray *video_codecs, const char *sep);
+
+SPICE_END_DECLS
+
+#endif /* VIDEO_ENCODER_H_ */
diff --git a/server/video-stream.cpp b/server/video-stream.cpp
new file mode 100644
index 00000000..056d0c31
--- /dev/null
+++ b/server/video-stream.cpp
@@ -0,0 +1,992 @@
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <config.h>
+
+#include "video-stream.h"
+#include "display-channel-private.h"
+#include "main-channel-client.h"
+#include "red-client.h"
+
+#define FPS_TEST_INTERVAL 1
+#define FOREACH_STREAMS(display, item) \
+ RING_FOREACH(item, &(display)->priv->streams)
+
+static void video_stream_unref(DisplayChannel *display, VideoStream *stream);
+static void video_stream_agent_unref(DisplayChannel *display, VideoStreamAgent *agent);
+
+static void video_stream_agent_stats_print(VideoStreamAgent *agent)
+{
+#ifdef STREAM_STATS
+ StreamStats *stats = &agent->stats;
+ double passed_mm_time = (stats->end - stats->start) / 1000.0;
+ VideoEncoderStats encoder_stats = {0};
+
+ if (agent->video_encoder) {
+ agent->video_encoder->get_stats(agent->video_encoder, &encoder_stats);
+ }
+
+ spice_debug("stream=%p dim=(%dx%d) #in-frames=%" PRIu64 " #in-avg-fps=%.2f "
+ "#out-frames=%" PRIu64 " out/in=%.2f #drops=%" PRIu64 " (#pipe=%" PRIu64 " "
+ "#fps=%" PRIu64 ") out-avg-fps=%.2f passed-mm-time(sec)=%.2f "
+ "size-total(MB)=%.2f size-per-sec(Mbps)=%.2f size-per-frame(KBpf)=%.2f "
+ "avg-quality=%.2f start-bit-rate(Mbps)=%.2f end-bit-rate(Mbps)=%.2f",
+ agent, agent->stream->width, agent->stream->height,
+ stats->num_input_frames,
+ stats->num_input_frames / passed_mm_time,
+ stats->num_frames_sent,
+ (stats->num_frames_sent + 0.0) / stats->num_input_frames,
+ stats->num_drops_pipe +
+ stats->num_drops_fps,
+ stats->num_drops_pipe,
+ stats->num_drops_fps,
+ stats->num_frames_sent / passed_mm_time,
+ passed_mm_time,
+ stats->size_sent / 1024.0 / 1024.0,
+ ((stats->size_sent * 8.0) / (1024.0 * 1024)) / passed_mm_time,
+ stats->size_sent / 1000.0 / stats->num_frames_sent,
+ encoder_stats.avg_quality,
+ encoder_stats.starting_bit_rate / (1024.0 * 1024),
+ encoder_stats.cur_bit_rate / (1024.0 * 1024));
+#endif
+}
+
+StreamCreateDestroyItem::~StreamCreateDestroyItem()
+{
+ DisplayChannel *display = DCC_TO_DC(agent->dcc);
+ video_stream_agent_unref(display, agent);
+}
+
+StreamCreateDestroyItem::StreamCreateDestroyItem(VideoStreamAgent *init_agent, int init_type):
+ RedPipeItem(init_type),
+ agent(init_agent)
+{
+ agent->stream->refs++;
+}
+
+static RedPipeItemPtr video_stream_create_item_new(VideoStreamAgent *agent)
+{
+ return red::make_shared<StreamCreateDestroyItem>(agent, RED_PIPE_ITEM_TYPE_STREAM_CREATE);
+}
+
+static RedPipeItemPtr video_stream_destroy_item_new(VideoStreamAgent *agent)
+{
+ return red::make_shared<StreamCreateDestroyItem>(agent, RED_PIPE_ITEM_TYPE_STREAM_DESTROY);
+}
+
+
+void video_stream_stop(DisplayChannel *display, VideoStream *stream)
+{
+ DisplayChannelClient *dcc;
+ int stream_id = display_channel_get_video_stream_id(display, stream);
+
+ spice_return_if_fail(ring_item_is_linked(&stream->link));
+ spice_return_if_fail(!stream->current);
+
+ spice_debug("stream %d", stream_id);
+ FOREACH_DCC(display, dcc) {
+ VideoStreamAgent *stream_agent;
+
+ stream_agent = dcc_get_video_stream_agent(dcc, stream_id);
+ region_clear(&stream_agent->vis_region);
+ region_clear(&stream_agent->clip);
+ if (stream_agent->video_encoder) {
+ uint64_t stream_bit_rate = stream_agent->video_encoder->get_bit_rate(stream_agent->video_encoder);
+
+ if (stream_bit_rate > dcc_get_max_stream_bit_rate(dcc)) {
+ spice_debug("old max-bit-rate=%.2f new=%.2f",
+ dcc_get_max_stream_bit_rate(dcc) / 8.0 / 1024.0 / 1024.0,
+ stream_bit_rate / 8.0 / 1024.0 / 1024.0);
+ dcc_set_max_stream_bit_rate(dcc, stream_bit_rate);
+ }
+ }
+ dcc->pipe_add(video_stream_destroy_item_new(stream_agent));
+ video_stream_agent_stats_print(stream_agent);
+ }
+ display->priv->streams_size_total -= stream->width * stream->height;
+ ring_remove(&stream->link);
+ video_stream_unref(display, stream);
+}
+
+static void video_stream_free(DisplayChannel *display, VideoStream *stream)
+{
+ stream->next = display->priv->free_streams;
+ display->priv->free_streams = stream;
+}
+
+void display_channel_init_video_streams(DisplayChannel *display)
+{
+ ring_init(&display->priv->streams);
+ display->priv->free_streams = nullptr;
+ for (auto &&stream : display->priv->streams_buf) {
+ ring_item_init(&stream.link);
+ video_stream_free(display, &stream);
+ }
+}
+
+void video_stream_unref(DisplayChannel *display, VideoStream *stream)
+{
+ if (--stream->refs != 0)
+ return;
+
+ spice_warn_if_fail(!ring_item_is_linked(&stream->link));
+
+ video_stream_free(display, stream);
+ display->priv->stream_count--;
+}
+
+void video_stream_agent_unref(DisplayChannel *display, VideoStreamAgent *agent)
+{
+ video_stream_unref(display, agent->stream);
+}
+
+VideoStreamClipItem::~VideoStreamClipItem()
+{
+ DisplayChannel *display = DCC_TO_DC(stream_agent->dcc);
+
+ video_stream_agent_unref(display, stream_agent);
+}
+
+VideoStreamClipItem::VideoStreamClipItem(VideoStreamAgent *agent):
+ RedPipeItem(RED_PIPE_ITEM_TYPE_STREAM_CLIP),
+ stream_agent(agent),
+ clip_type(SPICE_CLIP_TYPE_RECTS)
+{
+ agent->stream->refs++;
+
+ int n_rects = pixman_region32_n_rects(&agent->clip);
+ rects.reset(static_cast<SpiceClipRects *>(
+ g_malloc(sizeof(SpiceClipRects) + n_rects * sizeof(SpiceRect))));
+ rects->num_rects = n_rects;
+ region_ret_rects(&agent->clip, rects->rects, n_rects);
+}
+
+static int is_stream_start(Drawable *drawable)
+{
+ return ((drawable->frames_count >= RED_STREAM_FRAMES_START_CONDITION) &&
+ (drawable->gradual_frames_count >=
+ (RED_STREAM_GRADUAL_FRAMES_START_CONDITION * drawable->frames_count)));
+}
+
+static void update_copy_graduality(DisplayChannel *display, Drawable *drawable)
+{
+ SpiceBitmap *bitmap;
+ spice_return_if_fail(drawable->red_drawable->type == QXL_DRAW_COPY);
+
+ if (display_channel_get_stream_video(display) != SPICE_STREAM_VIDEO_FILTER) {
+ drawable->copy_bitmap_graduality = BITMAP_GRADUAL_INVALID;
+ return;
+ }
+
+ if (drawable->copy_bitmap_graduality != BITMAP_GRADUAL_INVALID) {
+ return; // already set
+ }
+
+ bitmap = &drawable->red_drawable->u.copy.src_bitmap->u.bitmap;
+
+ if (!bitmap_fmt_has_graduality(bitmap->format) || bitmap_has_extra_stride(bitmap) ||
+ (bitmap->data->flags & SPICE_CHUNKS_FLAGS_UNSTABLE)) {
+ drawable->copy_bitmap_graduality = BITMAP_GRADUAL_NOT_AVAIL;
+ } else {
+ drawable->copy_bitmap_graduality = bitmap_get_graduality_level(bitmap);
+ }
+}
+
+static bool is_next_stream_frame(const Drawable *candidate,
+ const int other_src_width,
+ const int other_src_height,
+ const SpiceRect *other_dest,
+ const red_time_t other_time,
+ const VideoStream *stream,
+ int container_candidate_allowed)
+{
+ RedDrawable *red_drawable;
+
+ if (!candidate->streamable) {
+ return FALSE;
+ }
+
+ if (candidate->creation_time - other_time >
+ (stream ? RED_STREAM_CONTINUOUS_MAX_DELTA : RED_STREAM_DETECTION_MAX_DELTA)) {
+ return FALSE;
+ }
+
+ red_drawable = candidate->red_drawable.get();
+ if (!container_candidate_allowed) {
+ SpiceRect* candidate_src;
+
+ if (!rect_is_equal(&red_drawable->bbox, other_dest)) {
+ return FALSE;
+ }
+
+ candidate_src = &red_drawable->u.copy.src_area;
+ if (candidate_src->right - candidate_src->left != other_src_width ||
+ candidate_src->bottom - candidate_src->top != other_src_height) {
+ return FALSE;
+ }
+ } else {
+ if (!rect_contains(&red_drawable->bbox, other_dest)) {
+ return FALSE;
+ }
+ int candidate_area = rect_get_area(&red_drawable->bbox);
+ int other_area = rect_get_area(other_dest);
+ /* do not stream drawables that are significantly
+ * bigger than the original frame */
+ if (candidate_area > 2 * other_area) {
+ spice_debug("too big candidate:");
+ spice_debug("prev box ==>");
+ rect_debug(other_dest);
+ spice_debug("new box ==>");
+ rect_debug(&red_drawable->bbox);
+ return FALSE;
+ }
+ }
+
+ if (stream) {
+ SpiceBitmap *bitmap = &red_drawable->u.copy.src_bitmap->u.bitmap;
+ if (stream->top_down != !!(bitmap->flags & SPICE_BITMAP_FLAGS_TOP_DOWN)) {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+static void attach_stream(DisplayChannel *display, Drawable *drawable, VideoStream *stream)
+{
+ DisplayChannelClient *dcc;
+
+ spice_assert(drawable && stream);
+ spice_assert(!drawable->stream && !stream->current);
+ stream->current = drawable;
+ drawable->stream = stream;
+ stream->last_time = drawable->creation_time;
+
+ uint64_t duration = drawable->creation_time - stream->input_fps_start_time;
+ if (duration >= RED_STREAM_INPUT_FPS_TIMEOUT) {
+ /* Round to the nearest integer, for instance 24 for 23.976 */
+ stream->input_fps =
+ (uint64_t{stream->num_input_frames} * 1000 * 1000 * 1000 + duration / 2) / duration;
+ spice_debug("input-fps=%u", stream->input_fps);
+ stream->num_input_frames = 0;
+ stream->input_fps_start_time = drawable->creation_time;
+ } else {
+ stream->num_input_frames++;
+ }
+
+ int stream_id = display_channel_get_video_stream_id(display, stream);
+ FOREACH_DCC(display, dcc) {
+ VideoStreamAgent *agent;
+ QRegion clip_in_draw_dest;
+
+ agent = dcc_get_video_stream_agent(dcc, stream_id);
+ region_or(&agent->vis_region, &drawable->tree_item.base.rgn);
+
+ region_init(&clip_in_draw_dest);
+ region_add(&clip_in_draw_dest, &drawable->red_drawable->bbox);
+ region_and(&clip_in_draw_dest, &agent->clip);
+
+ if (!region_is_equal(&clip_in_draw_dest, &drawable->tree_item.base.rgn)) {
+ region_remove(&agent->clip, &drawable->red_drawable->bbox);
+ region_or(&agent->clip, &drawable->tree_item.base.rgn);
+ dcc_video_stream_agent_clip(dcc, agent);
+ }
+ region_destroy(&clip_in_draw_dest);
+#ifdef STREAM_STATS
+ agent->stats.num_input_frames++;
+#endif
+ }
+}
+
+void video_stream_detach_drawable(VideoStream *stream)
+{
+ spice_assert(stream->current && stream->current->stream);
+ spice_assert(stream->current->stream == stream);
+ stream->current->stream = nullptr;
+ stream->current = nullptr;
+}
+
+static void before_reattach_stream(DisplayChannel *display,
+ VideoStream *stream, Drawable *new_frame)
+{
+ DisplayChannelClient *dcc;
+ int index;
+ VideoStreamAgent *agent;
+ GList *dpi_link, *dpi_next;
+
+ spice_return_if_fail(stream->current);
+
+ if (!display->is_connected()) {
+ return;
+ }
+
+ if (new_frame->process_commands_generation == stream->current->process_commands_generation) {
+ spice_debug("ignoring drop, same process_commands_generation as previous frame");
+ return;
+ }
+
+ index = display_channel_get_video_stream_id(display, stream);
+ for (dpi_link = stream->current->pipes; dpi_link; dpi_link = dpi_next) {
+ auto dpi = static_cast<RedDrawablePipeItem *>(dpi_link->data);
+ dpi_next = dpi_link->next;
+ dcc = dpi->dcc;
+ agent = dcc_get_video_stream_agent(dcc, index);
+
+ if (dcc->pipe_item_is_linked(dpi)) {
+#ifdef STREAM_STATS
+ agent->stats.num_drops_pipe++;
+#endif
+ if (agent->video_encoder) {
+ agent->video_encoder->notify_server_frame_drop(agent->video_encoder);
+ }
+ }
+ }
+}
+
+static VideoStream *display_channel_stream_try_new(DisplayChannel *display)
+{
+ VideoStream *stream;
+ if (!display->priv->free_streams) {
+ return nullptr;
+ }
+ stream = display->priv->free_streams;
+ display->priv->free_streams = display->priv->free_streams->next;
+ return stream;
+}
+
+static void display_channel_create_stream(DisplayChannel *display, Drawable *drawable)
+{
+ DisplayChannelClient *dcc;
+ VideoStream *stream;
+ SpiceRect* src_rect;
+
+ spice_assert(!drawable->stream);
+
+ if (!(stream = display_channel_stream_try_new(display))) {
+ return;
+ }
+
+ spice_assert(drawable->red_drawable->type == QXL_DRAW_COPY);
+ src_rect = &drawable->red_drawable->u.copy.src_area;
+
+ ring_add(&display->priv->streams, &stream->link);
+ stream->current = drawable;
+ stream->last_time = drawable->creation_time;
+ stream->width = src_rect->right - src_rect->left;
+ stream->height = src_rect->bottom - src_rect->top;
+ stream->dest_area = drawable->red_drawable->bbox;
+ stream->refs = 1;
+ SpiceBitmap *bitmap = &drawable->red_drawable->u.copy.src_bitmap->u.bitmap;
+ stream->top_down = !!(bitmap->flags & SPICE_BITMAP_FLAGS_TOP_DOWN);
+ drawable->stream = stream;
+ /* Provide an fps estimate the video encoder can use when initializing
+ * based on the frames that lead to the creation of the stream. Round to
+ * the nearest integer, for instance 24 for 23.976.
+ */
+ uint64_t duration = drawable->creation_time - drawable->first_frame_time;
+ if (duration > NSEC_PER_SEC * drawable->frames_count / MAX_FPS) {
+ stream->input_fps = (NSEC_PER_SEC * drawable->frames_count + duration / 2) / duration;
+ } else {
+ stream->input_fps = MAX_FPS;
+ }
+ stream->num_input_frames = 0;
+ stream->input_fps_start_time = drawable->creation_time;
+ display->priv->streams_size_total += stream->width * stream->height;
+ display->priv->stream_count++;
+ FOREACH_DCC(display, dcc) {
+ dcc_create_stream(dcc, stream);
+ }
+ spice_debug("stream %d %dx%d (%d, %d) (%d, %d) %u fps",
+ display_channel_get_video_stream_id(display, stream), stream->width,
+ stream->height, stream->dest_area.left, stream->dest_area.top,
+ stream->dest_area.right, stream->dest_area.bottom,
+ stream->input_fps);
+}
+
+// returns whether a stream was created
+static bool video_stream_add_frame(DisplayChannel *display,
+ Drawable *frame_drawable,
+ red_time_t first_frame_time,
+ int frames_count,
+ int gradual_frames_count,
+ int last_gradual_frame)
+{
+ update_copy_graduality(display, frame_drawable);
+ frame_drawable->first_frame_time = first_frame_time;
+ frame_drawable->frames_count = frames_count + 1;
+ frame_drawable->gradual_frames_count = gradual_frames_count;
+
+ if (frame_drawable->copy_bitmap_graduality != BITMAP_GRADUAL_LOW) {
+ if ((frame_drawable->frames_count - last_gradual_frame) >
+ RED_STREAM_FRAMES_RESET_CONDITION) {
+ frame_drawable->frames_count = 1;
+ frame_drawable->gradual_frames_count = 1;
+ } else {
+ frame_drawable->gradual_frames_count++;
+ }
+
+ frame_drawable->last_gradual_frame = frame_drawable->frames_count;
+ } else {
+ frame_drawable->last_gradual_frame = last_gradual_frame;
+ }
+
+ if (is_stream_start(frame_drawable)) {
+ display_channel_create_stream(display, frame_drawable);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/* Returns an array with SPICE_VIDEO_CODEC_TYPE_ENUM_END elements,
+ * with the client preference order (index) as value */
+GArray *video_stream_parse_preferred_codecs(SpiceMsgcDisplayPreferredVideoCodecType *msg)
+{
+ int i, len;
+ int indexes[SPICE_VIDEO_CODEC_TYPE_ENUM_END];
+ GArray *client;
+
+ /* set default to a big and positive number */
+ memset(indexes, 0x7f, sizeof(indexes));
+
+ for (len = 0, i = 0; i < msg->num_of_codecs; i++) {
+ auto video_codec = msg->codecs[i];
+
+ if (video_codec < SPICE_VIDEO_CODEC_TYPE_MJPEG ||
+ video_codec >= SPICE_VIDEO_CODEC_TYPE_ENUM_END) {
+ spice_debug("Client has sent unknown video-codec (value %d at index %d). "
+ "Ignoring as server can't handle it",
+ video_codec, i);
+ continue;
+ }
+
+ if (indexes[video_codec] < SPICE_VIDEO_CODEC_TYPE_ENUM_END) {
+ continue;
+ }
+
+ len++;
+ indexes[video_codec] = len;
+ }
+ client = g_array_sized_new(FALSE, FALSE, sizeof(int), SPICE_VIDEO_CODEC_TYPE_ENUM_END);
+ g_array_append_vals(client, indexes, SPICE_VIDEO_CODEC_TYPE_ENUM_END);
+
+ return client;
+}
+
+/* TODO: document the difference between the 2 functions below */
+void video_stream_trace_update(DisplayChannel *display, Drawable *drawable)
+{
+ RingItem *item;
+
+ if (drawable->stream || !drawable->streamable || drawable->frames_count) {
+ return;
+ }
+
+ FOREACH_STREAMS(display, item) {
+ VideoStream *stream = SPICE_CONTAINEROF(item, VideoStream, link);
+ bool is_next_frame = is_next_stream_frame(drawable,
+ stream->width,
+ stream->height,
+ &stream->dest_area,
+ stream->last_time,
+ stream,
+ TRUE);
+ if (is_next_frame) {
+ if (stream->current) {
+ stream->current->streamable = FALSE; //prevent item trace
+ before_reattach_stream(display, stream, drawable);
+ video_stream_detach_drawable(stream);
+ }
+ attach_stream(display, drawable, stream);
+ return;
+ }
+ }
+
+ for (auto &&trace : display->priv->items_trace) {
+ if (is_next_stream_frame(drawable, trace.width, trace.height, &trace.dest_area, trace.time,
+ nullptr, false)) {
+ if (video_stream_add_frame(display, drawable, trace.first_frame_time,
+ trace.frames_count, trace.gradual_frames_count,
+ trace.last_gradual_frame)) {
+ return;
+ }
+ }
+ }
+}
+
+void video_stream_maintenance(DisplayChannel *display,
+ Drawable *candidate, Drawable *prev)
+{
+ bool is_next_frame;
+
+ if (candidate->stream) {
+ return;
+ }
+
+ if (prev->stream) {
+ VideoStream *stream = prev->stream;
+
+ is_next_frame = is_next_stream_frame(candidate,
+ stream->width, stream->height,
+ &stream->dest_area, stream->last_time,
+ stream, TRUE);
+ if (is_next_frame) {
+ before_reattach_stream(display, stream, candidate);
+ video_stream_detach_drawable(stream);
+ prev->streamable = FALSE; //prevent item trace
+ attach_stream(display, candidate, stream);
+ }
+ } else if (candidate->streamable) {
+ SpiceRect* prev_src = &prev->red_drawable->u.copy.src_area;
+
+ is_next_frame =
+ is_next_stream_frame(candidate, prev_src->right - prev_src->left,
+ prev_src->bottom - prev_src->top,
+ &prev->red_drawable->bbox, prev->creation_time,
+ prev->stream,
+ FALSE);
+ if (is_next_frame) {
+ video_stream_add_frame(display, candidate,
+ prev->first_frame_time,
+ prev->frames_count,
+ prev->gradual_frames_count,
+ prev->last_gradual_frame);
+ }
+ }
+}
+
+static void dcc_update_streams_max_latency(DisplayChannelClient *dcc,
+ VideoStreamAgent *remove_agent)
+{
+ uint32_t new_max_latency = 0;
+ int i;
+
+ if (dcc_get_max_stream_latency(dcc) != remove_agent->client_required_latency) {
+ return;
+ }
+
+ dcc_set_max_stream_latency(dcc, 0);
+ if (DCC_TO_DC(dcc)->priv->stream_count == 1) {
+ return;
+ }
+ for (i = 0; i < NUM_STREAMS; i++) {
+ VideoStreamAgent *other_agent = dcc_get_video_stream_agent(dcc, i);
+ if (other_agent == remove_agent || !other_agent->video_encoder) {
+ continue;
+ }
+ if (other_agent->client_required_latency > new_max_latency) {
+ new_max_latency = other_agent->client_required_latency;
+ }
+ }
+ dcc_set_max_stream_latency(dcc, new_max_latency);
+}
+
+static uint64_t get_initial_bit_rate(DisplayChannelClient *dcc, VideoStream *stream)
+{
+ char *env_bit_rate_str;
+ uint64_t bit_rate = 0;
+
+ env_bit_rate_str = getenv("SPICE_BIT_RATE");
+ if (env_bit_rate_str != nullptr) {
+ double env_bit_rate;
+
+ errno = 0;
+ env_bit_rate = strtod(env_bit_rate_str, nullptr);
+ if (errno == 0 && env_bit_rate > 0) {
+ bit_rate = env_bit_rate * 1024 * 1024;
+ } else {
+ spice_warning("error parsing SPICE_BIT_RATE: %s", strerror(errno));
+ }
+ }
+
+ if (!bit_rate) {
+ MainChannelClient *mcc;
+ uint64_t net_test_bit_rate;
+
+ mcc = dcc->get_client()->get_main();
+ net_test_bit_rate = mcc->is_network_info_initialized() ?
+ mcc->get_bitrate_per_sec() :
+ 0;
+ bit_rate = MAX(dcc_get_max_stream_bit_rate(dcc), net_test_bit_rate);
+ if (bit_rate == 0) {
+ /*
+ * In case we are after a spice session migration,
+ * the low_bandwidth flag is retrieved from migration data.
+ * If the network info is not initialized due to another reason,
+ * the low_bandwidth flag is FALSE.
+ */
+ bit_rate = dcc_is_low_bandwidth(dcc) ?
+ RED_STREAM_DEFAULT_LOW_START_BIT_RATE :
+ RED_STREAM_DEFAULT_HIGH_START_BIT_RATE;
+ }
+ }
+
+ spice_debug("base-bit-rate %.2f (Mbps)", bit_rate / 1024.0 / 1024.0);
+ /* dividing the available bandwidth among the active streams, and saving
+ * (1-RED_STREAM_CHANNEL_CAPACITY) of it for other messages */
+ return (RED_STREAM_CHANNEL_CAPACITY * bit_rate *
+ stream->width * stream->height) / DCC_TO_DC(dcc)->priv->streams_size_total;
+}
+
+static uint32_t get_roundtrip_ms(void *opaque)
+{
+ auto agent = static_cast<VideoStreamAgent *>(opaque);
+ int roundtrip;
+ RedChannelClient *rcc = agent->dcc;
+
+ roundtrip = rcc->get_roundtrip_ms();
+ if (roundtrip < 0) {
+ MainChannelClient *mcc = rcc->get_client()->get_main();
+
+ /*
+ * the main channel client roundtrip might not have been
+ * calculated (e.g., after migration). In such case,
+ * main_channel_client_get_roundtrip_ms returns 0.
+ */
+ roundtrip = mcc->get_roundtrip_ms();
+ }
+
+ return roundtrip;
+}
+
+static uint32_t get_source_fps(void *opaque)
+{
+ auto agent = static_cast<VideoStreamAgent *>(opaque);
+
+ return agent->stream->input_fps;
+}
+
+static void update_client_playback_delay(void *opaque, uint32_t delay_ms)
+{
+ auto agent = static_cast<VideoStreamAgent *>(opaque);
+ DisplayChannelClient *dcc = agent->dcc;
+ RedClient *client = dcc->get_client();
+ RedsState *reds = client->get_server();
+
+ dcc_update_streams_max_latency(dcc, agent);
+
+ agent->client_required_latency = delay_ms;
+ if (delay_ms > dcc_get_max_stream_latency(dcc)) {
+ dcc_set_max_stream_latency(dcc, delay_ms);
+ }
+ spice_debug("resetting client latency: %u", dcc_get_max_stream_latency(dcc));
+ reds_get_main_dispatcher(reds)->set_mm_time_latency(client, dcc_get_max_stream_latency(dcc));
+}
+
+static void bitmap_ref(gpointer data)
+{
+ auto red_drawable = static_cast<RedDrawable *>(data);
+ shared_ptr_add_ref(red_drawable);
+}
+
+static void bitmap_unref(gpointer data)
+{
+ auto red_drawable = static_cast<RedDrawable *>(data);
+ shared_ptr_unref(red_drawable);
+}
+
+/* A helper for dcc_create_stream(). */
+static VideoEncoder* dcc_create_video_encoder(DisplayChannelClient *dcc,
+ uint64_t starting_bit_rate,
+ VideoEncoderRateControlCbs *cbs)
+{
+ bool client_has_multi_codec = dcc->test_remote_cap(SPICE_DISPLAY_CAP_MULTI_CODEC);
+ int i;
+ GArray *video_codecs;
+
+ video_codecs = dcc_get_preferred_video_codecs_for_encoding(dcc);
+ for (i = 0; i < video_codecs->len; i++) {
+ RedVideoCodec* video_codec = &g_array_index (video_codecs, RedVideoCodec, i);
+
+ if (!client_has_multi_codec &&
+ video_codec->type != SPICE_VIDEO_CODEC_TYPE_MJPEG) {
+ /* Old clients only support MJPEG */
+ continue;
+ }
+ if (client_has_multi_codec &&
+ !dcc->test_remote_cap(video_codec->cap)) {
+ /* The client is recent but does not support this codec */
+ continue;
+ }
+
+ VideoEncoder* video_encoder = video_codec->create(video_codec->type, starting_bit_rate, cbs, bitmap_ref, bitmap_unref);
+ if (video_encoder) {
+ return video_encoder;
+ }
+ }
+
+ /* Try to use the builtin MJPEG video encoder as a fallback */
+ if (!client_has_multi_codec || dcc->test_remote_cap(SPICE_DISPLAY_CAP_CODEC_MJPEG)) {
+ return mjpeg_encoder_new(SPICE_VIDEO_CODEC_TYPE_MJPEG, starting_bit_rate, cbs, bitmap_ref, bitmap_unref);
+ }
+
+ return nullptr;
+}
+
+void dcc_create_stream(DisplayChannelClient *dcc, VideoStream *stream)
+{
+ int stream_id = display_channel_get_video_stream_id(DCC_TO_DC(dcc), stream);
+ VideoStreamAgent *agent = dcc_get_video_stream_agent(dcc, stream_id);
+
+ spice_return_if_fail(region_is_empty(&agent->vis_region));
+
+ if (stream->current) {
+ region_clone(&agent->vis_region, &stream->current->tree_item.base.rgn);
+ region_clone(&agent->clip, &agent->vis_region);
+ }
+ agent->dcc = dcc;
+
+ VideoEncoderRateControlCbs video_cbs;
+ video_cbs.opaque = agent;
+ video_cbs.get_roundtrip_ms = get_roundtrip_ms;
+ video_cbs.get_source_fps = get_source_fps;
+ video_cbs.update_client_playback_delay = update_client_playback_delay;
+
+ uint64_t initial_bit_rate = get_initial_bit_rate(dcc, stream);
+ agent->video_encoder = dcc_create_video_encoder(dcc, initial_bit_rate, &video_cbs);
+ dcc->pipe_add(video_stream_create_item_new(agent));
+
+ if (dcc->test_remote_cap(SPICE_DISPLAY_CAP_STREAM_REPORT)) {
+ auto report_pipe_item = red::make_shared<RedStreamActivateReportItem>();
+
+ agent->report_id = rand();
+ report_pipe_item->stream_id = stream_id;
+ report_pipe_item->report_id = agent->report_id;
+ dcc->pipe_add(report_pipe_item);
+ }
+#ifdef STREAM_STATS
+ memset(&agent->stats, 0, sizeof(StreamStats));
+ if (stream->current) {
+ agent->stats.start = stream->current->red_drawable->mm_time;
+ }
+#endif
+}
+
+void video_stream_agent_stop(VideoStreamAgent *agent)
+{
+ DisplayChannelClient *dcc = agent->dcc;
+
+ dcc_update_streams_max_latency(dcc, agent);
+ if (agent->video_encoder) {
+ agent->video_encoder->destroy(agent->video_encoder);
+ agent->video_encoder = nullptr;
+ }
+}
+
+RedUpgradeItem::~RedUpgradeItem()
+{
+ drawable_unref(drawable);
+}
+
+RedUpgradeItem::RedUpgradeItem(Drawable *init_drawable):
+ drawable(init_drawable)
+{
+ drawable->refs++;
+}
+
+/*
+ * after dcc_detach_stream_gracefully is called for all the display channel clients,
+ * video_stream_detach_drawable should be called. See comment (1).
+ */
+static void dcc_detach_stream_gracefully(DisplayChannelClient *dcc,
+ VideoStream *stream,
+ Drawable *update_area_limit)
+{
+ DisplayChannel *display = DCC_TO_DC(dcc);
+ int stream_id = display_channel_get_video_stream_id(display, stream);
+ VideoStreamAgent *agent = dcc_get_video_stream_agent(dcc, stream_id);
+
+ /* stopping the client from playing older frames at once*/
+ region_clear(&agent->clip);
+ dcc_video_stream_agent_clip(dcc, agent);
+
+ if (region_is_empty(&agent->vis_region)) {
+ spice_debug("stream %d: vis region empty", stream_id);
+ return;
+ }
+
+ if (stream->current &&
+ region_contains(&stream->current->tree_item.base.rgn, &agent->vis_region)) {
+ int n_rects;
+
+ /* (1) The caller should detach the drawable from the stream. This will
+ * lead to sending the drawable losslessly, as an ordinary drawable. */
+ if (dcc_drawable_is_in_pipe(dcc, stream->current)) {
+ spice_debug("stream %d: upgrade by linked drawable. box ==>",
+ stream_id);
+ rect_debug(&stream->current->red_drawable->bbox);
+ goto clear_vis_region;
+ }
+ spice_debug("stream %d: upgrade by drawable. box ==>", stream_id);
+ rect_debug(&stream->current->red_drawable->bbox);
+ auto upgrade_item = red::make_shared<RedUpgradeItem>(stream->current);
+ n_rects = pixman_region32_n_rects(&upgrade_item->drawable->tree_item.base.rgn);
+ upgrade_item->rects.reset(static_cast<SpiceClipRects *>(
+ g_malloc(sizeof(SpiceClipRects) + n_rects * sizeof(SpiceRect))));
+ upgrade_item->rects->num_rects = n_rects;
+ region_ret_rects(&upgrade_item->drawable->tree_item.base.rgn,
+ upgrade_item->rects->rects, n_rects);
+ dcc->pipe_add(upgrade_item);
+
+ } else {
+ SpiceRect upgrade_area;
+
+ region_extents(&agent->vis_region, &upgrade_area);
+ spice_debug("stream %d: upgrade by screenshot. has current %d. box ==>",
+ stream_id, stream->current != nullptr);
+ rect_debug(&upgrade_area);
+ if (update_area_limit) {
+ display_channel_draw_until(display, &upgrade_area, display->priv->surfaces[0], update_area_limit);
+ } else {
+ display_channel_draw(display, &upgrade_area, 0);
+ }
+ dcc_add_surface_area_image(dcc, display->priv->surfaces[0], &upgrade_area,
+ dcc->get_pipe().end(), false);
+ }
+clear_vis_region:
+ region_clear(&agent->vis_region);
+}
+
+static void detach_video_stream_gracefully(DisplayChannel *display,
+ VideoStream *stream,
+ Drawable *update_area_limit)
+{
+ DisplayChannelClient *dcc;
+
+ FOREACH_DCC(display, dcc) {
+ dcc_detach_stream_gracefully(dcc, stream, update_area_limit);
+ }
+ if (stream->current) {
+ video_stream_detach_drawable(stream);
+ }
+}
+
+/*
+ * region : a primary surface region. Streams that intersects with the given
+ * region will be detached.
+ * drawable: If detaching the stream is triggered by the addition of a new drawable
+ * that is dependent on the given region, and the drawable is already a part
+ * of the "current tree", the drawable parameter should be set with
+ * this drawable, otherwise, it should be NULL. Then, if detaching the stream
+ * involves sending an upgrade image to the client, this drawable won't be rendered
+ * (see dcc_detach_stream_gracefully).
+ */
+void video_stream_detach_behind(DisplayChannel *display,
+ QRegion *region,
+ Drawable *drawable)
+{
+ Ring *ring = &display->priv->streams;
+ RingItem *item = ring_get_head(ring);
+ DisplayChannelClient *dcc;
+ bool is_connected = display->is_connected();
+
+ while (item) {
+ VideoStream *stream = SPICE_CONTAINEROF(item, VideoStream, link);
+ int detach = 0;
+ item = ring_next(ring, item);
+ int stream_id = display_channel_get_video_stream_id(display, stream);
+
+ FOREACH_DCC(display, dcc) {
+ VideoStreamAgent *agent = dcc_get_video_stream_agent(dcc, stream_id);
+
+ if (region_intersects(&agent->vis_region, region)) {
+ dcc_detach_stream_gracefully(dcc, stream, drawable);
+ detach = 1;
+ spice_debug("stream %d", stream_id);
+ }
+ }
+ if (detach && stream->current) {
+ video_stream_detach_drawable(stream);
+ } else if (!is_connected) {
+ if (stream->current &&
+ region_intersects(&stream->current->tree_item.base.rgn, region)) {
+ video_stream_detach_drawable(stream);
+ }
+ }
+ }
+}
+
+void video_stream_detach_and_stop(DisplayChannel *display)
+{
+ RingItem *stream_item;
+
+ spice_debug("trace");
+ while ((stream_item = ring_get_head(&display->priv->streams))) {
+ VideoStream *stream = SPICE_CONTAINEROF(stream_item, VideoStream, link);
+
+ detach_video_stream_gracefully(display, stream, nullptr);
+ video_stream_stop(display, stream);
+ }
+}
+
+void video_stream_timeout(DisplayChannel *display)
+{
+ Ring *ring = &display->priv->streams;
+ RingItem *item;
+
+ red_time_t now = spice_get_monotonic_time_ns();
+ item = ring_get_head(ring);
+ while (item) {
+ VideoStream *stream = SPICE_CONTAINEROF(item, VideoStream, link);
+ item = ring_next(ring, item);
+ if (now >= (stream->last_time + RED_STREAM_TIMEOUT)) {
+ detach_video_stream_gracefully(display, stream, nullptr);
+ video_stream_stop(display, stream);
+ }
+ }
+}
+
+void video_stream_trace_add_drawable(DisplayChannel *display,
+ Drawable *item)
+{
+ ItemTrace *trace;
+
+ if (item->stream || !item->streamable) {
+ return;
+ }
+
+ trace = &display->priv->items_trace[display->priv->next_item_trace++ & ITEMS_TRACE_MASK];
+ trace->time = item->creation_time;
+ trace->first_frame_time = item->first_frame_time;
+ trace->frames_count = item->frames_count;
+ trace->gradual_frames_count = item->gradual_frames_count;
+ trace->last_gradual_frame = item->last_gradual_frame;
+ SpiceRect* src_area = &item->red_drawable->u.copy.src_area;
+ trace->width = src_area->right - src_area->left;
+ trace->height = src_area->bottom - src_area->top;
+ trace->dest_area = item->red_drawable->bbox;
+}
+
+/*
+ * video_codecs: an array of RedVideoCodec
+ * sep: a string for separating the list elements
+ *
+ * returns a string of "enc:codec<sep>"* that must be released
+ * with g_free.
+ */
+char *video_codecs_to_string(GArray *video_codecs, const char *sep)
+{
+ int i;
+ GString *msg = g_string_new("");
+
+ for (i = 0; i < video_codecs->len; i++) {
+ RedVideoCodec codec = g_array_index(video_codecs, RedVideoCodec, i);
+ char *codec_name = reds_get_video_codec_fullname(&codec);
+
+ g_string_append_printf(msg, "%s%s", i ? sep : "", codec_name);
+ g_free(codec_name);
+ }
+
+ return g_string_free(msg, FALSE);
+}
diff --git a/server/video-stream.h b/server/video-stream.h
new file mode 100644
index 00000000..23b44ff5
--- /dev/null
+++ b/server/video-stream.h
@@ -0,0 +1,144 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2009-2015 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef VIDEO_STREAM_H_
+#define VIDEO_STREAM_H_
+
+#include <glib.h>
+#include <common/region.h>
+
+#include "utils.h"
+#include "video-encoder.h"
+#include "red-channel.h"
+#include "dcc.h"
+
+#include "push-visibility.h"
+
+#define RED_STREAM_DETECTION_MAX_DELTA (NSEC_PER_SEC / 5)
+#define RED_STREAM_CONTINUOUS_MAX_DELTA NSEC_PER_SEC
+#define RED_STREAM_TIMEOUT NSEC_PER_SEC
+#define RED_STREAM_FRAMES_START_CONDITION 20
+#define RED_STREAM_GRADUAL_FRAMES_START_CONDITION 0.2
+#define RED_STREAM_FRAMES_RESET_CONDITION 100
+#define RED_STREAM_MIN_SIZE (96 * 96)
+#define RED_STREAM_INPUT_FPS_TIMEOUT (NSEC_PER_SEC * 5)
+#define RED_STREAM_CHANNEL_CAPACITY 0.8
+/* the client's stream report frequency is the minimum of the 2 values below */
+#define RED_STREAM_CLIENT_REPORT_WINDOW 5 // #frames
+#define RED_STREAM_CLIENT_REPORT_TIMEOUT MSEC_PER_SEC
+#define RED_STREAM_DEFAULT_HIGH_START_BIT_RATE (10 * 1024 * 1024) // 10Mbps
+#define RED_STREAM_DEFAULT_LOW_START_BIT_RATE (2.5 * 1024 * 1024) // 2.5Mbps
+#define MAX_FPS 30
+
+struct VideoStream;
+
+#ifdef STREAM_STATS
+struct StreamStats {
+ uint64_t num_drops_pipe;
+ uint64_t num_drops_fps;
+ uint64_t num_frames_sent;
+ uint64_t num_input_frames;
+ uint64_t size_sent;
+
+ uint64_t start;
+ uint64_t end;
+};
+#endif
+
+struct VideoStreamAgent {
+ QRegion vis_region; /* the part of the surface area that is currently occupied by video
+ fragments */
+ QRegion clip; /* the current video clipping. It can be different from vis_region:
+ for example, let c1 be the clip area at time t1, and c2
+ be the clip area at time t2, where t1 < t2. If c1 contains c2, and
+ at least part of c1/c2, hasn't been covered by a non-video images,
+ vis_region will contain c2 and also the part of c1/c2 that still
+ displays fragments of the video */
+
+ VideoStream *stream;
+ VideoEncoder *video_encoder;
+ DisplayChannelClient *dcc;
+
+ uint32_t report_id;
+ uint32_t client_required_latency;
+#ifdef STREAM_STATS
+ StreamStats stats;
+#endif
+};
+
+struct VideoStreamClipItem: public RedPipeItem {
+ VideoStreamClipItem(VideoStreamAgent *agent);
+ ~VideoStreamClipItem();
+
+ VideoStreamAgent *stream_agent;
+ int clip_type;
+ red::glib_unique_ptr<SpiceClipRects> rects;
+};
+
+struct StreamCreateDestroyItem: public RedPipeItem {
+ StreamCreateDestroyItem(VideoStreamAgent *agent, int type);
+ ~StreamCreateDestroyItem();
+ VideoStreamAgent *agent;
+};
+
+struct ItemTrace {
+ red_time_t time;
+ red_time_t first_frame_time;
+ int frames_count;
+ int gradual_frames_count;
+ int last_gradual_frame;
+ int width;
+ int height;
+ SpiceRect dest_area;
+};
+
+struct VideoStream {
+ uint8_t refs;
+ Drawable *current;
+ red_time_t last_time;
+ int width;
+ int height;
+ SpiceRect dest_area;
+ int top_down;
+ VideoStream *next;
+ RingItem link;
+
+ uint32_t num_input_frames;
+ uint64_t input_fps_start_time;
+ uint32_t input_fps;
+};
+
+void display_channel_init_video_streams(DisplayChannel *display);
+void video_stream_stop(DisplayChannel *display, VideoStream *stream);
+void video_stream_trace_update(DisplayChannel *display, Drawable *drawable);
+void video_stream_maintenance(DisplayChannel *display, Drawable *candidate,
+ Drawable *prev);
+void video_stream_timeout(DisplayChannel *display);
+void video_stream_detach_and_stop(DisplayChannel *display);
+void video_stream_trace_add_drawable(DisplayChannel *display, Drawable *item);
+void video_stream_detach_behind(DisplayChannel *display, QRegion *region,
+ Drawable *drawable);
+GArray *video_stream_parse_preferred_codecs(SpiceMsgcDisplayPreferredVideoCodecType *msg);
+
+void video_stream_agent_stop(VideoStreamAgent *agent);
+
+void video_stream_detach_drawable(VideoStream *stream);
+
+#include "pop-visibility.h"
+
+#endif /* VIDEO_STREAM_H_ */
diff --git a/server/websocket.c b/server/websocket.c
new file mode 100644
index 00000000..5813bd56
--- /dev/null
+++ b/server/websocket.c
@@ -0,0 +1,799 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2015 Jeremy White
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#define _GNU_SOURCE
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+
+#include <sys/types.h>
+#ifndef _WIN32
+#include <sys/socket.h>
+#include <unistd.h>
+#endif
+
+#include <glib.h>
+
+#include <common/log.h>
+#include <common/mem.h>
+
+#include "sys-socket.h"
+#include "glib-compat.h"
+#include "websocket.h"
+
+#ifdef _WIN32
+#include <shlwapi.h>
+#define strcasestr(haystack, needle) StrStrIA(haystack, needle)
+#endif
+
+/* Constants / masks all from RFC 6455 */
+
+#define FIN_FLAG 0x80
+#define RSV_MASK 0x70
+#define TYPE_MASK 0x0F
+#define CONTROL_FRAME_MASK 0x8
+
+#define CONTINUATION_FRAME 0x0
+#define TEXT_FRAME 0x1
+#define BINARY_FRAME 0x2
+#define CLOSE_FRAME 0x8
+#define PING_FRAME 0x9
+#define PONG_FRAME 0xA
+
+#define LENGTH_MASK 0x7F
+#define LENGTH_16BIT 0x7E
+#define LENGTH_64BIT 0x7F
+
+#define MASK_FLAG 0x80
+
+#define WEBSOCKET_GUID "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
+
+#define WEBSOCKET_MAX_HEADER_SIZE (1 + 9 + 4)
+
+#define MAX_CONTROL_DATA 125
+#define CONTROL_HDR_LEN 2
+
+typedef struct {
+ uint8_t raw_pos;
+ union {
+ uint8_t raw_data[MAX_CONTROL_DATA + CONTROL_HDR_LEN];
+ struct {
+ uint8_t type;
+ uint8_t data_len;
+ uint8_t data[MAX_CONTROL_DATA];
+ };
+ };
+} WebSocketControl;
+
+typedef struct {
+ uint8_t type, fin, unfinished;
+ uint8_t header[WEBSOCKET_MAX_HEADER_SIZE];
+ int header_pos;
+ bool frame_ready:1;
+ bool masked:1;
+ uint8_t mask[4];
+ uint64_t relayed;
+ uint64_t expected_len;
+} websocket_frame_t;
+
+struct RedsWebSocket {
+ bool closed;
+
+ websocket_frame_t read_frame;
+ uint64_t write_remainder;
+ uint8_t write_header[WEBSOCKET_MAX_HEADER_SIZE];
+ uint8_t write_header_pos, write_header_len;
+ bool send_unfinished;
+ bool close_pending;
+ WebSocketControl pong;
+ WebSocketControl pending_pong;
+
+ void *raw_stream;
+ websocket_read_cb_t raw_read;
+ websocket_write_cb_t raw_write;
+ websocket_writev_cb_t raw_writev;
+};
+
+static int websocket_ack_close(RedsWebSocket *ws);
+static int send_pending_data(RedsWebSocket *ws);
+
+static inline int get_control_raw_len(const WebSocketControl *control)
+{
+ return control->data_len + CONTROL_HDR_LEN;
+}
+
+static inline void control_init(WebSocketControl *control, uint8_t type)
+{
+ control->raw_pos = CONTROL_HDR_LEN;
+ control->type = type;
+ control->data_len = 0;
+}
+
+static inline bool control_sent(const WebSocketControl *control)
+{
+ return control->raw_pos >= get_control_raw_len(control);
+}
+
+static inline void pong_init(WebSocketControl *pong)
+{
+ control_init(pong, FIN_FLAG | PONG_FRAME);
+}
+
+/* Perform a case insensitive search for needle in haystack.
+ If found, return a pointer to the byte after the end of needle.
+ Otherwise, return NULL */
+static const char *find_str(const char *haystack, const char *needle)
+{
+ const char *s = strcasestr(haystack, needle);
+
+ if (s) {
+ return s + strlen(needle);
+ }
+ return NULL;
+}
+
+/* Extract WebSocket style length. Returns 0 if not enough data present,
+ Always updates the output 'used' variable to the number of bytes
+ required to extract the length; useful for tracking where the
+ mask will be.
+*/
+static uint64_t extract_length(const uint8_t *buf, int *used)
+{
+ int i;
+ uint64_t outlen = (*buf++) & LENGTH_MASK;
+
+ (*used)++;
+
+ switch (outlen) {
+ case LENGTH_64BIT:
+ *used += 8;
+ outlen = 0;
+ for (i = 0; i < 8; ++i) {
+ outlen <<= 8;
+ outlen |= *buf++;
+ }
+ break;
+
+ case LENGTH_16BIT:
+ *used += 2;
+ outlen = ((*buf) << 8) | *(buf + 1);
+ break;
+
+ default:
+ break;
+ }
+ return outlen;
+}
+
+static int frame_bytes_needed(websocket_frame_t *frame)
+{
+ int needed = 2;
+ if (frame->header_pos < needed) {
+ return needed - frame->header_pos;
+ }
+
+ switch (frame->header[1] & LENGTH_MASK) {
+ case LENGTH_64BIT:
+ needed += 8;
+ break;
+ case LENGTH_16BIT:
+ needed += 2;
+ break;
+ }
+
+ if (frame->header[1] & MASK_FLAG) {
+ needed += 4;
+ }
+
+ return needed - frame->header_pos;
+}
+
+/*
+* Generate WebSocket style response key, based on the
+* original key sent to us
+* If non null, caller must free returned key string.
+*/
+static char *generate_reply_key(char *buf)
+{
+ GChecksum *checksum;
+ char *b64 = NULL;
+ uint8_t *sha1;
+ size_t sha1_size;
+ const char *key;
+ const char *p;
+ char *k;
+
+ key = find_str(buf, "\nSec-WebSocket-Key:");
+ if (key) {
+ p = strchr(key, '\r');
+ if (p) {
+ k = g_strndup(key, p - key);
+ k = g_strstrip(k);
+ checksum = g_checksum_new(G_CHECKSUM_SHA1);
+ g_checksum_update(checksum, (uint8_t *) k, strlen(k));
+ g_checksum_update(checksum, (uint8_t *) WEBSOCKET_GUID, strlen(WEBSOCKET_GUID));
+ g_free(k);
+
+ sha1_size = g_checksum_type_get_length(G_CHECKSUM_SHA1);
+ sha1 = g_malloc(sha1_size);
+
+ g_checksum_get_digest(checksum, sha1, &sha1_size);
+
+ b64 = g_base64_encode(sha1, sha1_size);
+
+ g_checksum_free(checksum);
+ g_free(sha1);
+ }
+ }
+
+ return b64;
+}
+
+
+static void websocket_clear_frame(websocket_frame_t *frame)
+{
+ uint8_t unfinished = frame->unfinished;
+ memset(frame, 0, sizeof(*frame));
+ frame->unfinished = unfinished;
+}
+
+/* Extract a frame header of data from a set of data transmitted by
+ a WebSocket client. Returns success or error */
+static bool websocket_get_frame_header(websocket_frame_t *frame)
+{
+ int fin;
+ int used = 0;
+
+ if (frame_bytes_needed(frame) > 0) {
+ return true;
+ }
+
+ fin = frame->fin = frame->header[0] & FIN_FLAG;
+ frame->type = frame->header[0] & TYPE_MASK;
+ used++;
+
+ // reserved bits are not expected
+ if (frame->header[0] & RSV_MASK) {
+ return false;
+ }
+ // control commands cannot be split
+ if (!fin && (frame->type & CONTROL_FRAME_MASK) != 0) {
+ return false;
+ }
+ if ((frame->type & ~CONTROL_FRAME_MASK) >= 3) {
+ return false;
+ }
+
+ frame->masked = !!(frame->header[1] & MASK_FLAG);
+
+ /* This is a Spice specific optimization. We don't really
+ care about assembling frames fully, so we treat
+ a frame in process as a finished frame and pass it along. */
+ if ((frame->type & CONTROL_FRAME_MASK) == 0) {
+ if (frame->type == CONTINUATION_FRAME) {
+ if (!frame->unfinished) {
+ return false;
+ }
+ frame->type = frame->unfinished;
+ } else if (frame->unfinished) {
+ return false;
+ }
+ frame->unfinished = fin ? 0 : frame->type;
+ }
+
+ frame->expected_len = extract_length(frame->header + used, &used);
+
+ if (frame->masked) {
+ memcpy(frame->mask, frame->header + used, 4);
+ }
+
+ /* control frames cannot have more than 125 bytes of data */
+ if ((frame->type & CONTROL_FRAME_MASK) != 0 &&
+ frame->expected_len >= LENGTH_16BIT) {
+ return false;
+ }
+
+ frame->relayed = 0;
+ frame->frame_ready = true;
+ return true;
+}
+
+static void relay_data(uint8_t* buf, size_t size, websocket_frame_t *frame)
+{
+ if (frame->masked) {
+ size_t i;
+ for (i = 0; i < size; i++) {
+ *buf++ ^= frame->mask[(frame->relayed + i) % 4];
+ }
+ }
+}
+
+int websocket_read(RedsWebSocket *ws, uint8_t *buf, size_t len, unsigned *flags)
+{
+ int n = 0;
+ int rc;
+ websocket_frame_t *frame = &ws->read_frame;
+
+ *flags = 0;
+
+ if (ws->closed || ws->close_pending) {
+ /* this avoids infinite loop in the case connection is still open and we have
+ * pending data */
+ uint8_t discard[128];
+ ws->raw_read(ws->raw_stream, discard, sizeof(discard));
+ return 0;
+ }
+
+ while (len > 0) {
+ // make sure we have a proper frame ready
+ if (!frame->frame_ready) {
+ rc = ws->raw_read(ws->raw_stream, frame->header + frame->header_pos,
+ frame_bytes_needed(frame));
+ if (rc <= 0) {
+ goto read_error;
+ }
+ frame->header_pos += rc;
+
+ if (!websocket_get_frame_header(frame)) {
+ ws->closed = true;
+ errno = EIO;
+ return -1;
+ }
+ /* discard a pending ping, replace with current one */
+ if (frame->frame_ready && frame->type == PING_FRAME) {
+ pong_init(&ws->pong);
+ ws->pong.data_len = frame->expected_len;
+ }
+ continue;
+ }
+
+ if (frame->type == CLOSE_FRAME) {
+ ws->close_pending = true;
+ websocket_clear_frame(frame);
+ send_pending_data(ws);
+ return 0;
+ }
+ if (frame->type == BINARY_FRAME || frame->type == TEXT_FRAME) {
+ rc = 0;
+ if (frame->expected_len > frame->relayed) {
+ rc = ws->raw_read(ws->raw_stream, buf,
+ MIN(len, frame->expected_len - frame->relayed));
+ if (rc <= 0) {
+ goto read_error;
+ }
+
+ relay_data(buf, rc, frame);
+ n += rc;
+ buf += rc;
+ len -= rc;
+ }
+
+ *flags = frame->type;
+ } else if (frame->type == PING_FRAME) {
+ spice_assert(ws->pong.data_len == frame->expected_len);
+ rc = 0;
+ if (ws->pong.data_len > (ws->pong.raw_pos - CONTROL_HDR_LEN)) {
+ rc = ws->raw_read(ws->raw_stream, ws->pong.raw_data + ws->pong.raw_pos,
+ ws->pong.data_len - (ws->pong.raw_pos - CONTROL_HDR_LEN));
+ if (rc <= 0) {
+ goto read_error;
+ }
+ relay_data(ws->pong.raw_data + ws->pong.raw_pos, rc, frame);
+ ws->pong.raw_pos += rc;
+ }
+ if (ws->pong.raw_pos - CONTROL_HDR_LEN >= ws->pong.data_len) {
+ ws->pong.raw_pos = 0;
+ if (control_sent(&ws->pending_pong)) {
+ ws->pending_pong = ws->pong;
+ pong_init(&ws->pong);
+ }
+ send_pending_data(ws);
+ }
+ } else {
+ /* client could sent a PONG just as heartbeat */
+ if (frame->type != PONG_FRAME) {
+ spice_warning("Unexpected WebSocket frame.type %d. Failure now likely.", frame->type);
+ }
+
+ // discard this data
+ uint8_t discard[128];
+ rc = 0;
+ if (frame->expected_len > frame->relayed) {
+ rc = ws->raw_read(ws->raw_stream, discard,
+ MIN(sizeof(discard), frame->expected_len - frame->relayed));
+ if (rc <= 0) {
+ goto read_error;
+ }
+ }
+ }
+ frame->relayed += rc;
+ if (frame->relayed >= frame->expected_len) {
+ if (*flags) {
+ *flags |= frame->fin;
+ }
+ websocket_clear_frame(frame);
+ if (*flags) {
+ break;
+ }
+ }
+ }
+
+ return n;
+
+read_error:
+ if (n > 0 && rc == -1 && (errno == EINTR || errno == EAGAIN)) {
+ return n;
+ }
+ if (rc == 0) {
+ ws->closed = true;
+ }
+ return rc;
+}
+
+static int fill_header(uint8_t *header, uint64_t len, uint8_t type)
+{
+ int used = 0;
+ int i;
+
+ type &= FIN_FLAG|TYPE_MASK;
+ header[0] = type;
+ used++;
+
+ header[1] = 0;
+ used++;
+ if (len > 65535) {
+ header[1] |= LENGTH_64BIT;
+ for (i = 9; i >= 2; i--) {
+ header[i] = len & 0xFF;
+ len >>= 8;
+ }
+ used += 8;
+ } else if (len >= LENGTH_16BIT) {
+ header[1] |= LENGTH_16BIT;
+ header[2] = len >> 8;
+ header[3] = len & 0xFF;
+ used += 2;
+ } else {
+ header[1] |= len;
+ }
+
+ return used;
+}
+
+static void constrain_iov(struct iovec *iov, int iovcnt,
+ struct iovec **iov_out, int *iov_out_cnt,
+ uint64_t maxlen)
+{
+ int i;
+
+ for (i = 0; i < iovcnt && maxlen > 0; i++) {
+ if (iov[i].iov_len > maxlen) {
+ /* TODO - This code has never triggered afaik... */
+ *iov_out_cnt = ++i;
+ *iov_out = g_memdup2(iov, i * sizeof (*iov));
+ (*iov_out)[i-1].iov_len = maxlen;
+ return;
+ }
+ maxlen -= iov[i].iov_len;
+ }
+
+ /* we must trim the iov in case maxlen initially matches some chunks
+ * For instance if initially we had 2 chunks 256 and 128 bytes respectively
+ * and a maxlen of 256 we should just return the first chunk */
+ *iov_out_cnt = i;
+ *iov_out = iov;
+}
+
+static int send_data_header_left(RedsWebSocket *ws)
+{
+ /* send the pending header */
+ /* this can be tested capping the length with MIN with a small size like 3 */
+ int rc = ws->raw_write(ws->raw_stream, ws->write_header + ws->write_header_pos,
+ ws->write_header_len - ws->write_header_pos);
+ if (rc <= 0) {
+ return rc;
+ }
+ ws->write_header_pos += rc;
+
+ /* if header was sent now we can send data */
+ if (ws->write_header_pos >= ws->write_header_len) {
+ int used = 1;
+ ws->write_remainder = extract_length(ws->write_header + used, &used);
+ return ws->write_header_len;
+ }
+
+ /* otherwise try to send the rest later */
+ errno = EAGAIN;
+ return -1;
+}
+
+static int send_data_header(RedsWebSocket *ws, uint64_t len, uint8_t type)
+{
+ spice_assert(ws->write_header_pos >= ws->write_header_len);
+ spice_assert(ws->write_remainder == 0);
+
+ /* fill a new header */
+ ws->write_header_pos = 0;
+ if (ws->send_unfinished) {
+ type &= FIN_FLAG;
+ }
+ ws->write_header_len = fill_header(ws->write_header, len, type);
+ ws->send_unfinished = (type & FIN_FLAG) == 0;
+
+ return send_data_header_left(ws);
+}
+
+static int send_pending_data(RedsWebSocket *ws)
+{
+ int rc;
+
+ /* don't send while we are sending a data frame */
+ if (ws->write_remainder) {
+ return 1;
+ }
+
+ /* write pending data frame header not send completely */
+ if (ws->write_header_pos < ws->write_header_len) {
+ rc = send_data_header_left(ws);
+ if (rc <= 0) {
+ return rc;
+ }
+ return 1;
+ }
+
+ /* write close frame */
+ if (ws->close_pending) {
+ rc = websocket_ack_close(ws);
+ if (rc <= 0) {
+ return rc;
+ }
+ }
+
+ WebSocketControl *pong = &ws->pending_pong;
+ if (!control_sent(pong)) {
+ rc = ws->raw_write(ws->raw_stream, pong->raw_data + pong->raw_pos,
+ get_control_raw_len(pong) - pong->raw_pos);
+ if (rc <= 0) {
+ return rc;
+ }
+ pong->raw_pos += rc;
+ if (!control_sent(pong)) {
+ errno = EAGAIN;
+ return -1;
+ }
+ /* already another pending */
+ if (ws->pong.raw_pos == 0) {
+ ws->pending_pong = ws->pong;
+ pong_init(&ws->pong);
+ }
+ }
+ return 1;
+}
+
+/* Write a WebSocket frame with the enclosed data out. */
+int websocket_writev(RedsWebSocket *ws, const struct iovec *iov, int iovcnt, unsigned flags)
+{
+ uint64_t len;
+ int rc;
+ struct iovec *iov_out;
+ int iov_out_cnt;
+ int i;
+
+ if (ws->closed) {
+ errno = EPIPE;
+ return -1;
+ }
+ rc = send_pending_data(ws);
+ if (rc <= 0) {
+ return rc;
+ }
+ if (ws->write_remainder > 0) {
+ constrain_iov((struct iovec *) iov, iovcnt, &iov_out, &iov_out_cnt, ws->write_remainder);
+ rc = ws->raw_writev(ws->raw_stream, iov_out, iov_out_cnt);
+ if (iov_out != iov) {
+ g_free(iov_out);
+ }
+ if (rc <= 0) {
+ return rc;
+ }
+ ws->write_remainder -= rc;
+ return rc;
+ }
+
+ iov_out_cnt = iovcnt + 1;
+ iov_out = g_malloc(iov_out_cnt * sizeof(*iov_out));
+
+ for (i = 0, len = 0; i < iovcnt; i++) {
+ len += iov[i].iov_len;
+ iov_out[i + 1] = iov[i];
+ }
+
+ ws->write_header_pos = 0;
+ ws->write_header_len = fill_header(ws->write_header, len, flags);
+ iov_out[0].iov_len = ws->write_header_len;
+ iov_out[0].iov_base = ws->write_header;
+ rc = ws->raw_writev(ws->raw_stream, iov_out, iov_out_cnt);
+ g_free(iov_out);
+ if (rc <= 0) {
+ ws->write_header_len = 0;
+ return rc;
+ }
+
+ /* this can happen if we can't write the header */
+ if (SPICE_UNLIKELY(rc < ws->write_header_len)) {
+ ws->write_header_pos = ws->write_header_len - rc;
+ errno = EAGAIN;
+ return -1;
+ }
+ ws->write_header_pos = ws->write_header_len;
+ rc -= ws->write_header_len;
+
+ /* Key point: if we did not write out all the data, remember how
+ much more data the client is expecting, and write that data without
+ a header of any kind the next time around */
+ ws->write_remainder = len - rc;
+
+ return rc;
+}
+
+int websocket_write(RedsWebSocket *ws, const void *buf, size_t len, unsigned flags)
+{
+ int rc;
+
+ if (ws->closed) {
+ errno = EPIPE;
+ return -1;
+ }
+
+ rc = send_pending_data(ws);
+ if (rc <= 0) {
+ return rc;
+ }
+ if (ws->write_remainder == 0) {
+ rc = send_data_header(ws, len, flags);
+ if (rc <= 0) {
+ return rc;
+ }
+ len = ws->write_remainder;
+ } else {
+ len = MIN(ws->write_remainder, len);
+ }
+
+ rc = ws->raw_write(ws->raw_stream, buf, len);
+ if (rc > 0) {
+ ws->write_remainder -= rc;
+ }
+ return rc;
+}
+
+static int websocket_ack_close(RedsWebSocket *ws)
+{
+ unsigned char header[2];
+ int rc;
+
+ header[0] = FIN_FLAG | CLOSE_FRAME;
+ header[1] = 0;
+
+ rc = ws->raw_write(ws->raw_stream, header, sizeof(header));
+ if (rc == sizeof(header)) {
+ ws->close_pending = false;
+ ws->closed = true;
+ }
+ return rc;
+}
+
+static bool websocket_is_start(char *buf, bool *p_has_prototol)
+{
+ *p_has_prototol = false;
+ const char *key = find_str(buf, "\nSec-WebSocket-Key:");
+
+ if (strncmp(buf, "GET ", 4) != 0 ||
+ key == NULL ||
+ !g_str_has_suffix(buf, "\r\n\r\n")) {
+ return false;
+ }
+
+ const char *protocol = find_str(buf, "\nSec-WebSocket-Protocol:");
+ if (protocol) {
+ *p_has_prototol = true;
+ /* check protocol value ignoring spaces before and after */
+ int binary_pos = -1;
+ sscanf(protocol, " binary %n", &binary_pos);
+ if (binary_pos <= 0) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+static void websocket_create_reply(char *buf, char *outbuf, bool has_protocol)
+{
+ char *key;
+
+ key = generate_reply_key(buf);
+ sprintf(outbuf, "HTTP/1.1 101 Switching Protocols\r\n"
+ "Upgrade: WebSocket\r\n"
+ "Connection: Upgrade\r\n"
+ "Sec-WebSocket-Accept: %s\r\n%s\r\n", key,
+ has_protocol ? "Sec-WebSocket-Protocol: binary\r\n": "");
+ g_free(key);
+}
+
+RedsWebSocket *websocket_new(const void *buf, size_t len, void *stream, websocket_read_cb_t read_cb,
+ websocket_write_cb_t write_cb, websocket_writev_cb_t writev_cb)
+{
+ char rbuf[4096];
+
+ memcpy(rbuf, buf, len);
+ int rc = read_cb(stream, rbuf + len, sizeof(rbuf) - len - 1);
+ if (rc <= 0) {
+ return NULL;
+ }
+ len += rc;
+ rbuf[len] = 0;
+
+ /* TODO: this has a theoretical flaw around packet buffering
+ that is not likely to occur in practice. That is,
+ to be fully correct, we should repeatedly read bytes until
+ either we get the end of the GET header (\r\n\r\n), or until
+ an amount of time has passed. Instead, we just read for
+ 16 bytes, and then read up to the sizeof rbuf. So if the
+ GET request is only partially complete at this point we
+ will fail.
+
+ A typical GET request is 520 bytes, and it's difficult to
+ imagine a real world case where that will come in fragmented
+ such that we trigger this failure. Further, the spice reds
+ code has no real mechanism to do variable length/time based reads,
+ so it seems wisest to live with this theoretical flaw.
+ */
+
+ bool has_protocol;
+ if (!websocket_is_start(rbuf, &has_protocol)) {
+ return NULL;
+ }
+
+ char outbuf[1024];
+
+ websocket_create_reply(rbuf, outbuf, has_protocol);
+ rc = write_cb(stream, outbuf, strlen(outbuf));
+ if (rc != strlen(outbuf)) {
+ return NULL;
+ }
+
+ RedsWebSocket *ws = g_new0(RedsWebSocket, 1);
+
+ ws->raw_stream = stream;
+ ws->raw_read = read_cb;
+ ws->raw_write = write_cb;
+ ws->raw_writev = writev_cb;
+
+ pong_init(&ws->pong);
+ pong_init(&ws->pending_pong);
+
+ return ws;
+}
+
+void websocket_free(RedsWebSocket *ws)
+{
+ g_free(ws);
+}
diff --git a/server/websocket.h b/server/websocket.h
new file mode 100644
index 00000000..a8b00523
--- /dev/null
+++ b/server/websocket.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2015 Jeremy White
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef WEBSOCKET_H_
+#define WEBSOCKET_H_
+
+#include <stdint.h>
+#include <spice/macros.h>
+
+#include "sys-socket.h"
+
+SPICE_BEGIN_DECLS
+
+typedef ssize_t (*websocket_read_cb_t)(void *opaque, void *buf, size_t nbyte);
+typedef ssize_t (*websocket_write_cb_t)(void *opaque, const void *buf, size_t nbyte);
+typedef ssize_t (*websocket_writev_cb_t)(void *opaque, struct iovec *iov, int iovcnt);
+
+typedef struct RedsWebSocket RedsWebSocket;
+
+enum {
+ WEBSOCKET_TEXT = 1,
+ WEBSOCKET_BINARY= 2,
+ WEBSOCKET_FINAL = 0x80,
+ WEBSOCKET_TEXT_FINAL = WEBSOCKET_TEXT | WEBSOCKET_FINAL,
+ WEBSOCKET_BINARY_FINAL = WEBSOCKET_BINARY | WEBSOCKET_FINAL,
+};
+
+RedsWebSocket *websocket_new(const void *buf, size_t len, void *stream, websocket_read_cb_t read_cb,
+ websocket_write_cb_t write_cb, websocket_writev_cb_t writev_cb);
+void websocket_free(RedsWebSocket *ws);
+
+/**
+ * Read data from websocket.
+ * Can return 0 in case client sent an empty text/binary data, check
+ * flags to detect this.
+ */
+int websocket_read(RedsWebSocket *ws, uint8_t *buf, size_t len, unsigned *flags);
+int websocket_write(RedsWebSocket *ws, const void *buf, size_t len, unsigned flags);
+int websocket_writev(RedsWebSocket *ws, const struct iovec *iov, int iovcnt, unsigned flags);
+
+SPICE_END_DECLS
+
+#endif
diff --git a/server/zlib_encoder.c b/server/zlib-encoder.c
index a3d2aa60..8622331b 100644
--- a/server/zlib_encoder.c
+++ b/server/zlib-encoder.c
@@ -15,14 +15,13 @@
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
-#ifdef HAVE_CONFIG_H
#include <config.h>
-#endif
-#include "red_common.h"
-#include "zlib_encoder.h"
#include <zlib.h>
+#include "red-common.h"
+#include "zlib-encoder.h"
+
struct ZlibEncoder {
ZlibEncoderUsrContext *usr;
@@ -39,7 +38,7 @@ ZlibEncoder* zlib_encoder_create(ZlibEncoderUsrContext *usr, int level)
return NULL;
}
- enc = spice_new0(ZlibEncoder, 1);
+ enc = g_new0(ZlibEncoder, 1);
enc->usr = usr;
@@ -50,8 +49,8 @@ ZlibEncoder* zlib_encoder_create(ZlibEncoderUsrContext *usr, int level)
z_ret = deflateInit(&enc->strm, level);
enc->last_level = level;
if (z_ret != Z_OK) {
- spice_printerr("zlib error");
- free(enc);
+ g_warning("zlib error");
+ g_free(enc);
return NULL;
}
@@ -61,7 +60,7 @@ ZlibEncoder* zlib_encoder_create(ZlibEncoderUsrContext *usr, int level)
void zlib_encoder_destroy(ZlibEncoder *encoder)
{
deflateEnd(&encoder->strm);
- free(encoder);
+ g_free(encoder);
}
/* returns the total size of the encoded data */
diff --git a/server/zlib_encoder.h b/server/zlib-encoder.h
index 0620fc7b..11a6a666 100644
--- a/server/zlib_encoder.h
+++ b/server/zlib-encoder.h
@@ -27,8 +27,14 @@
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef _H_ZLIB_ENCODER
-#define _H_ZLIB_ENCODER
+
+#ifndef ZLIB_ENCODER_H_
+#define ZLIB_ENCODER_H_
+
+#include <inttypes.h>
+#include <spice/macros.h>
+
+SPICE_BEGIN_DECLS
typedef struct ZlibEncoder ZlibEncoder;
typedef struct ZlibEncoderUsrContext ZlibEncoderUsrContext;
@@ -44,4 +50,7 @@ void zlib_encoder_destroy(ZlibEncoder *encoder);
/* returns the total size of the encoded data */
int zlib_encode(ZlibEncoder *zlib, int level, int input_size,
uint8_t *io_ptr, unsigned int num_io_bytes);
-#endif
+
+SPICE_END_DECLS
+
+#endif /* ZLIB_ENCODER_H_ */
diff --git a/spice-common b/spice-common
deleted file mode 160000
-Subproject b3a00f4411962e0c06c7ad89a9936df388aa002
diff --git a/spice-server.pc.in b/spice-server.pc.in
index f65ddcfc..59ce7535 100644
--- a/spice-server.pc.in
+++ b/spice-server.pc.in
@@ -3,10 +3,11 @@ exec_prefix=@exec_prefix@
libdir=@libdir@
includedir=@includedir@
-Name: spice
+Name: spice-server
Description: SPICE server library
Version: @VERSION@
+Requires: spice-protocol >= @SPICE_PROTOCOL_MIN_VER@
Requires.private: @SPICE_REQUIRES@
Libs: -L${libdir} -lspice-server
Libs.private: @SPICE_NONPKGCONFIG_LIBS@
diff --git a/subprojects/spice-common b/subprojects/spice-common
new file mode 160000
+Subproject 58d375e5eadc6fb9e587e99fd81adcb95d01e8d
diff --git a/tests/migrate.py b/tests/migrate.py
index 9a3cef47..5feba5f9 100755
--- a/tests/migrate.py
+++ b/tests/migrate.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
"""
Spice Migration test
@@ -8,7 +8,7 @@ VGA mode since it will just be SeaBIOS).
Dependencies:
either qmp in python path or running with spice and qemu side by side:
-qemu/QMP/qmp.py
+qemu/python/qemu/qmp.py
spice/tests/migrate.py
Will create two temporary unix sockets in /tmp
@@ -16,11 +16,11 @@ Will leave a log file, migrate_test.log, in current directory.
"""
#
-# start one spiceclient, have two machines (active and target),
+# start one spice client, have two machines (active and target),
# and repeat:
# active wait until it's active
# active client_migrate_info
-# active migrate tcp:localhost:9000
+# active migrate tcp:$hostname:9000
# _wait for event of quit
# active stop, active<->passive
#
@@ -32,11 +32,11 @@ try:
import qmp
except:
import sys
- sys.path.append("../../qemu/QMP")
+ sys.path.append("../../qemu/python/qemu/")
try:
import qmp
except:
- print "can't find qmp"
+ print("can't find qmp")
raise SystemExit
import sys
from subprocess import Popen, PIPE
@@ -47,6 +47,13 @@ import datetime
import atexit
import argparse
+# python3 does not have raw_input
+if sys.version_info[0] == 3:
+ raw_input = input
+
+def run_shell_command(cmd):
+ return os.popen(cmd).read().strip()
+
def get_args():
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('--qmp1', dest='qmp1', default='/tmp/migrate_test.1.qmp')
@@ -54,33 +61,59 @@ def get_args():
parser.add_argument('--spice_port1', dest='spice_port1', type=int, default=5911)
parser.add_argument('--spice_port2', dest='spice_port2', type=int, default=6911)
parser.add_argument('--migrate_port', dest='migrate_port', type=int, default=8000)
- parser.add_argument('--client_count', dest='client_count', type=int, default=1)
- parser.add_argument('--qemu', dest='qemu', default='../../qemu/x86_64-softmmu/qemu-system-x86_64')
+ parser.add_argument('--qemu', dest='qemu', default='qemu-system-x86_64')
parser.add_argument('--log_filename', dest='log_filename', default='migrate.log')
parser.add_argument('--image', dest='image', default='')
- parser.add_argument('--client', dest='client', default='spicy', choices=['spicec', 'spicy'])
- parser.add_argument('--vdagent', choices=['on', 'off'], default='on')
+ parser.add_argument("--hostname", dest='hostname', default='localhost',
+ help="Set hostname used in migration message (default: localhost")
+ parser.add_argument('--client', dest='client', default='none', choices=['spicy', 'remote-viewer', 'none'],
+ help="Automatically lunch one of supported clients or none (default)")
+ parser.add_argument('--vdagent', dest="vdagent", action='store_true', default=False,
+ help="Append options for agent's virtserialport")
+ parser.add_argument('--wait-user-input', dest="wait_user_input", action='store_true', default=False,
+ help="Wait user's input to start migration test")
+ parser.add_argument('--wait-user-connect', dest="wait_user_connect", action='store_true', default=False,
+ help="Wait spice client to connect to move to next step of migration (default False)")
+ parser.add_argument('--count', dest='counter', type=int, default=100,
+ help="Number of migrations to run (set 0 for infinite)")
+ parser.add_argument('--seamless', dest="seamless_migration", action='store_true', default=False,
+ help="Enable seamless-migration support")
args = parser.parse_args(sys.argv[1:])
if os.path.exists(args.qemu):
args.qemu_exec = args.qemu
else:
- args.qemu_exec = os.popen("which %s" % args.qemu).read().strip()
+ args.qemu_exec = run_shell_command("which %s" % args.qemu)
if not os.path.exists(args.qemu_exec):
- print "qemu not found (qemu = %r)" % args.qemu_exec
+ print("qemu not found (qemu = %r)" % args.qemu_exec)
sys.exit(1)
return args
-def start_qemu(qemu_exec, image, spice_port, qmp_filename, incoming_port=None, extra_args=[]):
- incoming_args = []
+def start_qemu(qemu_exec, seamless_migration, image, spice_port, qmp_filename, incoming_port=None, with_agent=False):
+ seamless_option = "on" if seamless_migration else "off"
+ args = [
+ qemu_exec,
+ "-qmp", f"unix:{qmp_filename},server,nowait",
+ "-spice", f"seamless-migration={seamless_option},disable-ticketing,port={spice_port}"
+ ]
if incoming_port:
- incoming_args = ("-incoming tcp::%s" % incoming_port).split()
- args = ([qemu_exec, "-qmp", "unix:%s,server,nowait" % qmp_filename,
- "-spice", "disable-ticketing,port=%s" % spice_port]
- + incoming_args + extra_args)
+ args += (f"-incoming tcp::{incoming_port}").split()
+
+ if with_agent:
+ args += [
+ '-device', 'virtio-serial',
+ '-chardev', 'spicevmc,name=vdagent,id=vdagent',
+ '-device', 'virtserialport,chardev=vdagent,name=com.redhat.spice.0'
+ ]
+
if os.path.exists(image):
- args += ["-m", "512", "-drive",
- "file=%s,index=0,media=disk,cache=unsafe" % image, "-snapshot"]
+ args += [
+ "-m", "512",
+ "-enable-kvm",
+ "-drive", f"file={image},index=0,media=disk,cache=writeback"
+ ]
+
proc = Popen(args, executable=qemu_exec, stdin=PIPE, stdout=PIPE)
+
while not os.path.exists(qmp_filename):
time.sleep(0.1)
proc.qmp_filename = qmp_filename
@@ -89,31 +122,30 @@ def start_qemu(qemu_exec, image, spice_port, qmp_filename, incoming_port=None, e
try:
proc.qmp.connect()
break
- except socket.error, err:
+ except socket.error:
pass
proc.spice_port = spice_port
proc.incoming_port = incoming_port
return proc
-def start_client(client, spice_port):
- return Popen(("%(client)s -h localhost -p %(port)d" % dict(port=spice_port,
- client=client)).split(), executable=client)
+def start_client(client, hostname, spice_port):
+ client_cmd = f"spicy --uri spice://{hostname}:{spice_port}"
+ if client == "remote-viewer":
+ client_cmd = f"remote-viewer spice://{hostname}:{spice_port}"
+
+ return Popen(client_cmd.split(), executable=client)
def wait_active(q, active):
- events = ["RESUME"] if active else ["STOP"]
while True:
try:
ret = q.cmd("query-status")
+ if ret["return"]["running"] == active:
+ break
except:
# ValueError
time.sleep(0.1)
continue
- if ret and ret.has_key("return"):
- if ret["return"]["running"] == active:
- break
- for e in q.get_events():
- if e["event"] in events:
- break
+
time.sleep(0.5)
def wait_for_event(q, event):
@@ -124,33 +156,44 @@ def wait_for_event(q, event):
time.sleep(0.5)
def cleanup(migrator):
- print "doing cleanup"
+ print("doing cleanup")
migrator.close()
+def remove_image_file(filename):
+ run_shell_command('rm -f %s' % filename)
+
class Migrator(object):
migration_count = 0
- def __init__(self, log, client, qemu_exec, image, monitor_files, client_count,
- spice_ports, migration_port, vdagent):
- self.client = client
+ def __init__(self, log, client, qemu_exec, image, monitor_files,
+ spice_ports, migration_port, vdagent, hostname, seamless_migration):
+ self.client = client if client != "none" else None
self.log = log
self.qemu_exec = qemu_exec
self.image = image
self.migration_port = migration_port
- self.client_count = client_count
self.monitor_files = monitor_files
self.spice_ports = spice_ports
self.vdagent = vdagent
- extra_args = []
- if self.vdagent:
- extra_args = ['-device', 'virtio-serial', '-chardev', 'spicevmc,name=vdagent,id=vdagent', '-device', 'virtserialport,chardev=vdagent,name=com.redhat.spice.0']
- self.active = start_qemu(qemu_exec=qemu_exec, image=image, spice_port=spice_ports[0],
- qmp_filename=monitor_files[0], extra_args=extra_args)
- self.target = start_qemu(qemu_exec=qemu_exec, image=image, spice_port=spice_ports[1],
- qmp_filename=monitor_files[1], incoming_port=migration_port)
+ self.hostname = hostname
+ self.seamless_migration = seamless_migration
+
+ self.active = start_qemu(qemu_exec=qemu_exec,
+ image=image,
+ spice_port=spice_ports[0],
+ qmp_filename=monitor_files[0],
+ seamless_migration=self.seamless_migration,
+ with_agent=self.vdagent)
+ self.target = start_qemu(qemu_exec=qemu_exec,
+ image=image,
+ spice_port=spice_ports[1],
+ qmp_filename=monitor_files[1],
+ seamless_migration=self.seamless_migration,
+ with_agent=self.vdagent,
+ incoming_port=migration_port)
self.remove_monitor_files()
- self.clients = []
+ self.connected_client = None
def close(self):
self.remove_monitor_files()
@@ -158,7 +201,7 @@ class Migrator(object):
def kill_qemu(self):
for p in [self.active, self.target]:
- print "killing and waiting for qemu pid %s" % p.pid
+ print("killing and waiting for qemu pid %s" % p.pid)
p.kill()
p.wait()
@@ -167,52 +210,89 @@ class Migrator(object):
if os.path.exists(x):
os.unlink(x)
- def iterate(self, wait_for_user_input=False):
+ def iterate(self, wait_for_user_input=False, wait_user_connect=False):
wait_active(self.active.qmp, True)
wait_active(self.target.qmp, False)
- if len(self.clients) == 0:
- for i in range(self.client_count):
- self.clients.append(start_client(client=self.client,
- spice_port=self.spice_ports[0]))
- wait_for_event(self.active.qmp, 'SPICE_INITIALIZED')
+ if not self.connected_client:
+ if self.client:
+ self.connected_client = start_client(client=self.client,
+ hostname=self.hostname,
+ spice_port=self.spice_ports[0])
+
if wait_for_user_input:
- print "waiting for Enter to start migrations"
+ print("waiting for Enter to start migrations")
raw_input()
- self.active.qmp.cmd('client_migrate_info', {'protocol':'spice',
- 'hostname':'localhost', 'port':self.target.spice_port})
- self.active.qmp.cmd('migrate', {'uri': 'tcp:localhost:%s' % self.migration_port})
+
+ # Tester can launch its own client or we wait start_client() to connect
+ if self.connected_client or wait_user_connect:
+ wait_for_event(self.active.qmp, 'SPICE_INITIALIZED')
+
+ self.active.qmp.cmd('client_migrate_info', {
+ 'protocol' : 'spice',
+ 'hostname' : self.hostname,
+ 'port' : self.target.spice_port
+ })
+ self.active.qmp.cmd('migrate', {
+ 'uri': f'tcp:localhost:self.migration_port',
+ 'uri': f'tcp:{self.hostname}:{self.migration_port}'
+ })
wait_active(self.active.qmp, False)
wait_active(self.target.qmp, True)
- wait_for_event(self.target.qmp, 'SPICE_CONNECTED')
+
+ if self.connected_client or wait_user_connect:
+ wait_for_event(self.target.qmp, 'SPICE_CONNECTED')
+
dead = self.active
dead.qmp.cmd("quit")
dead.qmp.close()
dead.wait()
new_spice_port = dead.spice_port
new_qmp_filename = dead.qmp_filename
- self.log.write("# STDOUT dead %s\n" % dead.pid)
- self.log.write(dead.stdout.read())
+
+ outstr = dead.stdout.read()
+ if outstr:
+ outstr = outstr.decode(encoding='utf-8', errors='ignore')
+ self.log.write("# STDOUT dead %s\n" % dead.pid)
+ self.log.write(outstr)
+
del dead
self.active = self.target
self.target = start_qemu(spice_port=new_spice_port,
- qemu_exec=self.qemu_exec, image=self.image,
- qmp_filename=new_qmp_filename,
- incoming_port=self.migration_port)
- print self.migration_count
+ qemu_exec=self.qemu_exec,
+ image=self.image,
+ qmp_filename=new_qmp_filename,
+ seamless_migration=self.seamless_migration,
+ with_agent=self.vdagent,
+ incoming_port=self.migration_port)
self.migration_count += 1
+ print(self.migration_count)
def main():
args = get_args()
- print "log file %s" % args.log_filename
+ print("log file %s" % args.log_filename)
log = open(args.log_filename, "a+")
log.write("# "+str(datetime.datetime.now())+"\n")
- migrator = Migrator(client=args.client, qemu_exec=args.qemu_exec,
- image=args.image, log=log, monitor_files=[args.qmp1, args.qmp2],
- migration_port=args.migrate_port, spice_ports=[args.spice_port1,
- args.spice_port2], client_count=args.client_count, vdagent=(args.vdagent=='on'))
+ newimage = run_shell_command("mktemp --dry-run /tmp/migrate_XXXXXX.qcow2")
+ qemu_img = run_shell_command("dirname %s" % args.qemu_exec) + '/qemu-img'
+ run_shell_command('%s create -f qcow2 -b %s %s' % (qemu_img, args.image, newimage))
+ print('using new image %s' % newimage)
+ migrator = Migrator(client=args.client,
+ qemu_exec=args.qemu_exec,
+ image=newimage,
+ log=log,
+ monitor_files=[args.qmp1, args.qmp2],
+ migration_port=args.migrate_port,
+ spice_ports=[args.spice_port1, args.spice_port2],
+ vdagent=args.vdagent,
+ seamless_migration=args.seamless_migration,
+ hostname=args.hostname)
atexit.register(cleanup, migrator)
- while True:
- migrator.iterate()
+ atexit.register(remove_image_file, newimage)
+ counter = 0
+ while args.counter == 0 or counter < args.counter:
+ migrator.iterate(wait_for_user_input=args.wait_user_input,
+ wait_user_connect=args.wait_user_connect)
+ counter += 1
if __name__ == '__main__':
main()
diff --git a/tools/.gitignore b/tools/.gitignore
new file mode 100644
index 00000000..96fa383c
--- /dev/null
+++ b/tools/.gitignore
@@ -0,0 +1 @@
+reds_stat
diff --git a/tools/Makefile.am b/tools/Makefile.am
new file mode 100644
index 00000000..db9596e9
--- /dev/null
+++ b/tools/Makefile.am
@@ -0,0 +1,24 @@
+NULL =
+
+AM_CPPFLAGS = \
+ $(SPICE_COMMON_CFLAGS) \
+ $(WARN_CFLAGS) \
+ $(NULL)
+
+AM_LDFLAGS = \
+ $(LIBRT) \
+ $(NULL)
+
+if !OS_WIN32
+noinst_PROGRAMS = \
+ reds_stat \
+ $(NULL)
+
+reds_stat_SOURCES = \
+ reds_stat.c \
+ $(NULL)
+endif
+
+EXTRA_DIST = \
+ meson.build \
+ $(NULL)
diff --git a/tools/meson.build b/tools/meson.build
new file mode 100644
index 00000000..8ec2cc91
--- /dev/null
+++ b/tools/meson.build
@@ -0,0 +1,6 @@
+if host_machine.system() != 'windows'
+ executable('reds_stat', 'reds_stat.c',
+ install : false,
+ include_directories : spice_server_include,
+ dependencies : spice_server_deps)
+endif
diff --git a/tools/reds_stat.c b/tools/reds_stat.c
index 5e9705c7..7d35c45b 100644
--- a/tools/reds_stat.c
+++ b/tools/reds_stat.c
@@ -24,24 +24,29 @@
#include <stdio.h>
#include <string.h>
#include <unistd.h>
+#include <inttypes.h>
+#include <glob.h>
+#include <sys/stat.h>
#include <spice/stats.h>
+#include <common/verify.h>
#define TAB_LEN 4
#define VALUE_TABS 7
#define INVALID_STAT_REF (~(uint32_t)0)
-static SpiceStat *reds_stat = NULL;
+verify(sizeof(SpiceStat) == 20 || sizeof(SpiceStat) == 24);
+
+static SpiceStatNode *reds_nodes = NULL;
static uint64_t *values = NULL;
-void print_stat_tree(int32_t node_index, int depth)
+static void print_stat_tree(int32_t node_index, int depth)
{
- SpiceStatNode *node = &reds_stat->nodes[node_index];
- int i;
+ SpiceStatNode *node = &reds_nodes[node_index];
if ((node->flags & SPICE_STAT_NODE_MASK_SHOW) == SPICE_STAT_NODE_MASK_SHOW) {
printf("%*s%s", depth * TAB_LEN, "", node->name);
if (node->flags & SPICE_STAT_NODE_FLAG_VALUE) {
- printf(":%*s%llu (%llu)\n", (VALUE_TABS - depth) * TAB_LEN - strlen(node->name) - 1, "",
+ printf(":%*s%"PRIu64" (%"PRIu64")\n", (int) ((VALUE_TABS - depth) * TAB_LEN - strlen(node->name) - 1), "",
node->value, node->value - values[node_index]);
values[node_index] = node->value;
} else {
@@ -56,76 +61,111 @@ void print_stat_tree(int32_t node_index, int depth)
}
}
+// look for a single file /dev/shm/spice.XXX and extract XXX pid
+static pid_t search_pid(void)
+{
+ pid_t pid = 0;
+ glob_t globbuf;
+
+ if (glob("/dev/shm/spice.*", 0, NULL, &globbuf)) {
+ return pid;
+ }
+ if (globbuf.gl_pathc == 1) {
+ const char *p = strchr(globbuf.gl_pathv[0], '.');
+ if (p) {
+ pid = atoi(p+1);
+ }
+ }
+ globfree(&globbuf);
+ return pid;
+}
+
int main(int argc, char **argv)
{
char *shm_name;
- pid_t kvm_pid;
- uint64_t *val;
+ pid_t kvm_pid = 0;
uint32_t num_of_nodes = 0;
size_t shm_size;
- size_t shm_old_size;
int shm_name_len;
- int ret = -1;
+ int ret = EXIT_FAILURE;
int fd;
+ struct stat st;
+ unsigned header_size = sizeof(SpiceStat);
+ SpiceStat *reds_stat = (SpiceStat *)MAP_FAILED;
+
+ if (argc == 2) {
+ kvm_pid = atoi(argv[1]);
+ } else if (argc == 1) {
+ kvm_pid = search_pid();
+ }
- if (argc != 2 || !(kvm_pid = atoi(argv[1]))) {
- printf("usage: reds_stat [qemu_pid] (e.g. `pgrep qemu`)\n");
- return -1;
+ if (argc > 2 || !kvm_pid) {
+ fprintf(stderr, "usage: reds_stat [qemu_pid] (e.g. `pgrep qemu`)\n");
+ return ret;
}
- shm_name_len = strlen(SPICE_STAT_SHM_NAME) + strlen(argv[1]);
+ shm_name_len = strlen(SPICE_STAT_SHM_NAME) + 64;
if (!(shm_name = (char *)malloc(shm_name_len))) {
perror("malloc");
- return -1;
+ return ret;
}
snprintf(shm_name, shm_name_len, SPICE_STAT_SHM_NAME, kvm_pid);
if ((fd = shm_open(shm_name, O_RDONLY, 0444)) == -1) {
perror("shm_open");
free(shm_name);
- return -1;
+ return ret;
}
shm_size = sizeof(SpiceStat);
reds_stat = (SpiceStat *)mmap(NULL, shm_size, PROT_READ, MAP_SHARED, fd, 0);
+ if (fstat(fd, &st) == 0) {
+ unsigned size = st.st_size % sizeof(SpiceStatNode);
+ if (size == 20 || size == 24) {
+ header_size = size;
+ }
+ }
if (reds_stat == (SpiceStat *)MAP_FAILED) {
perror("mmap");
- goto error1;
+ goto error;
}
if (reds_stat->magic != SPICE_STAT_MAGIC) {
- printf("bad magic %u\n", reds_stat->magic);
- goto error2;
+ fprintf(stderr, "bad magic %u\n", reds_stat->magic);
+ goto error;
}
if (reds_stat->version != SPICE_STAT_VERSION) {
- printf("bad version %u\n", reds_stat->version);
- goto error2;
+ fprintf(stderr, "bad version %u\n", reds_stat->version);
+ goto error;
}
while (1) {
- system("clear");
+ if (system("clear") != 0) {
+ printf("\n\n\n");
+ }
printf("spice statistics\n\n");
if (num_of_nodes != reds_stat->num_of_nodes) {
num_of_nodes = reds_stat->num_of_nodes;
- shm_old_size = shm_size;
- shm_size = sizeof(SpiceStat) + num_of_nodes * sizeof(SpiceStatNode);
- reds_stat = mremap(reds_stat, shm_old_size, shm_size, MREMAP_MAYMOVE);
+ munmap(reds_stat, shm_size);
+ shm_size = header_size + num_of_nodes * sizeof(SpiceStatNode);
+ reds_stat = (SpiceStat *)mmap(NULL, shm_size, PROT_READ, MAP_SHARED, fd, 0);
if (reds_stat == (SpiceStat *)MAP_FAILED) {
- perror("mremap");
- goto error3;
+ perror("mmap");
+ goto error;
}
+ reds_nodes = (SpiceStatNode *)((char *) reds_stat + header_size);
values = (uint64_t *)realloc(values, num_of_nodes * sizeof(uint64_t));
if (values == NULL) {
perror("realloc");
- goto error3;
+ goto error;
}
memset(values, 0, num_of_nodes * sizeof(uint64_t));
}
print_stat_tree(reds_stat->root_index, 0);
sleep(1);
}
- ret = 0;
+ ret = EXIT_SUCCESS;
-error3:
+error:
free(values);
-error2:
- munmap(reds_stat, shm_size);
-error1:
+ if (reds_stat != (SpiceStat *)MAP_FAILED) {
+ munmap(reds_stat, shm_size);
+ }
shm_unlink(shm_name);
free(shm_name);
return ret;